第4章:监督学习模型在生物学中的应用:分类与回归
聊到生物学的监督学习,说白了就是教模型看数据。你给它一堆有标签的样本,它学会规律后,就能预测新样本的标签。这在生物学里应用极广,从基因功能预测到药物响应分析,到处都有它的影子。
本章我们聚焦两类核心任务:分类 和 回归。我个人习惯把它们比作“定性”和“定量”的关系。分类是判断“是或不是”,回归是预测“是多少”。
4.1 分类:判别式任务的生物学面孔
分类问题在生物学里太常见了。举个例子:给定一个蛋白质序列,判断它是不是激酶;或者根据基因表达谱,区分正常组织和癌症组织。这些都是典型的二分类或多分类任务。
4.1.1 逻辑回归:概率解释的起点
你可能会问,回归怎么用在分类上?逻辑回归的核心其实是在线性回归的基础上套了个 sigmoid 函数,把输出压缩到 0-1 之间,作为属于某个类别的概率。
我在一个蛋白质亚细胞定位项目里用过逻辑回归。当时特征维度不高,样本量也只有几千,逻辑回归表现居然不比随机森林差。它的可解释性特别好——每个特征的系数直接告诉你这个特征对结果的正负影响。
from sklearn.linear_model import LogisticRegression
# 假设 X 是特征矩阵,y 是标签(0/1)
model = LogisticRegression(penalty='l2', C=1.0)
model.fit(X_train, y_train)
# 查看特征权重
for i, coef in enumerate(model.coef_[0]):
print(f"特征 {i}: 权重 {coef:.3f}")
4.1.2 支持向量机:寻找最优分隔面
SVM 的想法很直观:在特征空间里找一个超平面,把不同类别的样本尽可能分开,并且让这个平面两侧的“间隔”最大。对于非线性问题,可以借助核技巧映射到高维空间。
我记得处理基因表达数据时,SVM 配合 RBF 核往往效果不错。但要注意,核函数的选择和参数调优很关键,不是所有场景都适合径向基函数。
| 核函数 | 适用场景 | 参数 |
|---|---|---|
| 线性核 | 高维稀疏数据 | C(正则化强度) |
| 多项式核 | 特征相互作用明显 | degree, coef0 |
| RBF 核 | 多数非线性问题 | C, gamma |
| sigmoid 核 | 类似神经网络的激活 | C, gamma, coef0 |
4.1.3 决策树与集成方法:从单棵树到森林
决策树的可解释性是最好的——你可以把树路径画出来,直接解释为什么某个样本被分到某类。但单棵树容易过拟合,所以集成方法更受青睐。
我常用随机森林做生物标记物筛选。一个技巧是:查看特征重要性排序,往往能发现一些出人意料的潜在标记物。XGBoost 和 LightGBM 也值得一试,尤其在数据量大的时候。
import xgboost as xgb
# 训练 XGBoost 分类器
params = {
'objective': 'binary:logistic',
'max_depth': 6,
'eta': 0.1,
'subsample': 0.8,
'seed': 42
}
dtrain = xgb.DMatrix(X_train, label=y_train)
model = xgb.train(params, dtrain, num_boost_round=100)
# 特征重要性
importance = model.get_score(importance_type='gain')
sorted_imp = sorted(importance.items(), key=lambda x: x[1], reverse=True)
4.2 回归:连续值预测的生物学挑战
回归任务的目标是预测一个连续的数值。比如根据药物分子结构预测 IC50 值,或者根据基因表达数据预测患者的生存时间。这类问题在药物发现和精准医学中极为重要。
4.2.1 线性回归与正则化
经典的线性回归假设特征与目标之间是线性关系。但在生物学数据中,特征之间往往高度相关(多重共线性),导致模型不稳定。这时候岭回归(L2)和 Lasso 回归(L1)就派上用场了。
Lasso 有个好处:它能自动做特征选择,把不重要的系数压缩到零。我在一个转录组预测药物敏感性的项目里,用 Lasso 从两万个基因中筛出了不到一百个关键基因,模型解释起来轻松很多。
from sklearn.linear_model import LassoCV
# 自动选择最优 alpha
lasso = LassoCV(cv=5, random_state=42)
lasso.fit(X_train, y_train)
# 查看哪些特征被选中(系数非零)
selected_features = [i for i, coef in enumerate(lasso.coef_) if abs(coef) > 1e-5]
print(f"选中的特征数量: {len(selected_features)}")
4.2.2 支持向量回归与随机森林回归
SVR 和分类版的 SVM 类似,但目标变成了在误差容忍范围内寻找最优回归函数。随机森林回归则通过多棵树的投票来降低方差。
我个人的经验是:如果数据量小(<1000 样本),SVR 配合 RBF 核经常能跑出不错的结果。如果数据量大,随机森林回归更省心,不用太多调参。
| 模型 | 优点 | 缺点 |
|---|---|---|
| 线性回归 / 正则化 | 可解释性强,训练快 | 假设线性关系,表达能力有限 |
| SVR | 泛化能力好,核函数灵活 | 调参复杂,对尺度敏感 |
| 随机森林回归 | 鲁棒性强,无需太多预处理 | 可解释性弱于线性模型,容易过拟合噪声 |
| XGBoost 回归 | 精度高,正则化防过拟合 | 需要仔细调参,训练较慢 |
4.2.3 生存分析中的回归
在生物医学中,我们常常要预测“事件发生的时间”,比如患者生存期。这种数据存在右删失(部分患者未观察到事件),普通的回归方法处理不了。
Cox 比例风险模型是最经典的方法。它假设各因素对风险的影响是乘性的,通过偏似然估计求解。虽然它不直接预测生存时间,但能给出风险比,帮助医生判断哪种治疗方案更优。
import lifelines
from lifelines import CoxPHFitter
# 数据框包含: duration(时间), event(是否发生事件), 以及协变量
df = pd.DataFrame({
'duration': [12, 24, 8, 36, 5],
'event': [1, 0, 1, 1, 0],
'age': [55, 62, 48, 70, 59],
'treatment':[1, 0, 1, 0, 1]
})
cph = CoxPHFitter()
cph.fit(df, duration_col='duration', event_col='event')
cph.print_summary()
4.3 模型评估:不要只看准确率
很多人在生物学任务里只盯着准确率,这其实是个坑。我来给你说几个关键的评估指标。
4.3.1 分类任务的评估
在类别不平衡的数据集(比如罕见病只占 1%),准确率可能高达 99%,但模型实际上是个“全否定”的废物。这时候要关注敏感度(召回率)和特异性。
我建议至少报告以下指标:
- 混淆矩阵(真阳、假阳、真阴、假阴)
- 精确率、召回率、F1-score
- ROC-AUC(二分类)或 macro/micro AUC(多分类)
- PR-AUC(尤其当正类很少时)
4.3.2 回归任务的评估
回归常见的评估有 MSE、RMSE、MAE、R²。但要注意:MSE 对异常值极其敏感,如果生物学数据里有测量误差或 outlier,用 MAE 可能更稳健。
| 指标 | 公式 | 适用场景 |
|---|---|---|
| MSE | 均方误差 | 默认首选,对异常值敏感 |
| RMSE | MSE 开方 | 与 y 同量纲,便于解释 |
| MAE | 平均绝对误差 | 鲁棒到异常值 |
| R² | 决定系数 | 解释模型拟合优度 |
4.3.3 交叉验证的陷阱
生物学数据常常有分组结构(比如同一位患者的多份样本),如果直接做随机交叉验证,会导致严重的数据泄露。应该使用分层或分组交叉验证,确保同一患者的样本不会同时出现在训练集和验证集。
我曾经在一个蛋白质组学项目里踩过这个坑。数据来自 10 个批次,直接用随机划分,结果验证集性能漂亮得不行,但实际部署效果极差。后来改用批次分组交叉验证才暴露了问题。
from sklearn.model_selection import GroupKFold
groups = df['patient_id'] # 每个样本所属患者 ID
gkf = GroupKFold(n_splits=5)
for train_idx, val_idx in gkf.split(X, y, groups):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
# 训练和评估...
4.4 可解释性在监督学习中的实践
生物学里,不光要模型准,更要解释得通。我通常从三个层面入手。
4.4.1 特征重要性分析
树模型天然提供特征重要性,线性模型的系数也可以直接解读。但要注意:特征重要性不能等同于因果关系。
我记得做一个 miRNA 靶基因预测项目时,某个 miRNA 的重要性排名第一,但后来文献调研发现它只是相关性高,真正的调控关系却不在其中。所以特征重要性只能作为线索,不能直接下结论。
4.4.2 全局与局部解释
全局解释(如 SHAP 摘要图)能告诉你哪些特征整体上最重要。局部解释(如单个样本的 SHAP 值或 LIME)能展示某个具体预测的依据。
比如医生给定一个患者,模型预测他五年内会复发。你不仅要给出预测结果,更要解释清楚是哪些因素导致了高风险——是某个基因突变,还是年龄太大?这才是可解释性度量的真正价值。
4.4.3 模型内部的生物学验证
我有个原则:任何特征重要性结果,都要回到生物学知识里验证一遍。比如模型中“TP53 突变”如果是重要特征,那这个结果应该与已知文献一致。如果不一致,要么数据有问题,要么模型学到了噪声。
核心观点:监督学习模型的生物学应用,本质上是一个“从数据到知识”的转化过程。分类和回归是工具,可解释性度量是桥梁,最终的生物学验证才是终点。