实体特征概述:什么是实体特征、特征类型
好,咱们开始第4章。
前面几章我们搭好了环境,理清了数据源。现在要面对一个核心问题:一个药物实体,凭什么能被机器学习模型理解?你想想看,模型不认识“阿司匹林”这个字符串,它只看数字。我们得把药物实体“翻译”成模型能消化的形式。这个过程,就是提取实体特征。
4.1 到底什么是实体特征
我个人的理解很简单:实体特征就是描述一个实体的可量化、可比较的数字化标签。
举个例子。在药物知识图谱里,一个“阿司匹林”节点,它有结构式、有分子量、有靶点关系。这些信息原本是文本、是化学式、是图结构。我们通过某种方法,把它们变成一组向量或者一组离散编码。这就是特征。
我在做“药物重定位”项目时,发现一个很坑的事:很多同学直接把实体的ID扔进模型,或者只用一种特征。结果模型根本不收敛。为什么?因为特征太单薄了。你想想看,一个药物实体,它既有内在属性(分子量、LogP),又有外部关系(作用于什么靶点、被哪些疾病关联)。只用一种特征,等于只看到了大象的一条腿。
简而言之:实体特征 = 把知识图谱中的节点信息,转换成机器学习可用的输入。
4.2 特征类型的三大支柱
按我个人做项目的习惯,我把实体特征分为三大类。不是随便分的,是跟药企的同事一起踩过坑后总结的。三类特征必须同时考虑,缺一不可。
| 特征类型 | 核心逻辑 | 典型例子 | 我踩过的坑 |
|---|---|---|---|
| 结构特征 | 实体自身的内部结构表达 | 分子指纹、SMILES编码、原子序列 | 直接拼接会导致维度过高 |
| 属性特征 | 实体的静态属性描述 | 分子量、LogP、pKa、给药途径 | 空值和中位数填充会误导模型 |
| 关系特征 | 实体与其他实体的关联模式 | 邻居节点类型、路径模式、图嵌入 | 关系类型过多时需降维 |
4.2.1 结构特征:去理解分子本身
结构特征看的是实体内部。对于药物分子,我们常看到SMILES表达式:
CCO # 乙醇的SMILES
CC(=O)OC1=CC=CC=C1C(=O)O # 阿司匹林的SMILES
但这只是文本。模型不认识。所以我们要把SMILES转成数字指纹。常用的有摩根指纹(Morgan Fingerprint),也叫ECFP。原理很简单:把分子切成一个个圆形子结构,然后编码成固定长度的位向量。
嗯,这里要注意:结构特征是“what it is”。不管你用MACCS指纹、ECFP4还是图神经网络的原生原子特征,核心就是描述分子长什么样。
4.2.2 属性特征:看静态参数
属性特征是那些能直接查到的标量或类别值。比如:
{
"分子量": 180.16,
"LogP": 1.19,
"可旋转键数": 3,
"氢键供体": 1,
"氢键受体": 3
}
这些值通常直接来自PubChem或ChEMBL。我建议你先把缺失值标记为-1或特殊token,不要随便填充均值。我在一次“药物-靶点相互作用预测”竞赛中,就因为对LogP的缺失值填充了中位数,导致模型学到了错误的分布。后来改用“是否缺失”作为独立特征,AUC提升了3%。
技巧:对连续属性做标准化(Z-score),对类别属性做One-hot或实体嵌入。我一般把数值型属性和类别型属性分开处理,最后再拼接。
4.2.3 关系特征:躲在图谱里的秘密
这部分是知识图谱特有的。关系特征不只看实体本身,还看它在图里的位置和邻居。
比如一个药物实体“阿司匹林”,它关联了靶点“环氧合酶1”,还关联了疾病“疼痛”。这些邻居节点不是乱连的。它们隐含了药物的功能、副作用、治疗方案等信息。
我常用的关系特征提取方法:
- 邻居计数器:统计每种关系的邻居数量。
- 路径模式提取:抽取从药物到疾病的最短路径类型。
- 图嵌入:用TransE、RDF2Vec等方法把节点变成向量。
我在某项目中,用一个简单的“邻居类型直方图”作为关系特征,就把单属性模型的F1从0.72提到了0.81。关系特征的能量,超出你的想象。
警告:关系特征容易过拟合。如果你用One-hot编码所有邻居关系,维度可能爆炸。建议先做关系类型合并,或者使用嵌入降维。
4.3 一个完整案例:阿司匹林的特征提取
我给你一个我实际用过的特征提取配置,方便你后面实战时参考:
# 结构特征:ECFP4,1024位
# 属性特征:分子量、LogP、氢键供体、氢键受体、可旋转键数
# 关系特征:邻居角色分布、一阶邻居嵌入均值
# 特征拼接
# 结构: 1024维 (密集向量)
# 属性: 5维 (标准化后)
# 关系: 128维 (图嵌入)
# 总特征维度: 1024 + 5 + 128 = 1157 维
你看,一个简单的实体,特征维度就上千了。但是别紧张。大部分维度是稀疏的。后面我们会讲特征降维和选择策略。
4.4 知识体系总览
为了让你们有一个整体画面,我画了一张图。它展示了这三种特征之间的关系,以及在知识图谱中的位置。
这张图告诉我们:三种特征不是互相排斥的,而是互补的。结构特征回答“分子长什么样”,属性特征回答“化学物理参数是多少”,关系特征回答“它在图里跟谁有联系”。三者合并,才能给模型一个完整的“药物画像”。
4.5 聊聊我对特征选择的看法
我不建议你一开始就把所有特征堆进去。我当时做第一个药物相似度项目,把能拿到的特征全塞进去,维度直接上万。模型训练慢不说,还学偏了。后来我学乖了,先做特征重要性排序,选出TOP50,效果反而更好。
给你一个我常用的特征筛选流程:
- 先构建基础特征集:结构+属性+关系,每种至少一个。
- 用随机森林或LightGBM跑一次特征重要性。
- 保留累计重要性达到90%的特征,其余的砍掉。
- 检查特征之间的相关性,对高度相关的特征做聚合或删除。
这个流程我用了很多年,靠谱。当然,如果你用深度学习,也可以让模型自己学特征重要性,比如Attention机制。但基础的特征工程,始终是地基。
一点小建议:在开发阶段,先拿一小批数据(比如1000个实体)跑通特征提取和模型训练。不要一上来就在全量数据上做。速度慢,不灵活。