传统机器学习方法:线性回归、SVM、随机森林在QSAR中的实现与局限
说起QSAR,老派的方法其实挺管用的。我刚入行那会儿,整天就跟线性回归、SVM、随机森林打交道。虽然现在多任务学习很火,但这些传统方法的价值依然不可替代。**在我看来,不了解它们,就搞不懂后面为什么要做多任务**。
3.1 线性回归
线性回归是QSAR里最基础、最直觉的方法。它的核心假设就一句话:分子描述符和活性之间是线性关系。
公式其实很简单:
y = w₀ + w₁x₁ + w₂x₂ + ... + wₙxₙ
其中 y 是活性值(比如pIC50),x₁...xₙ 是分子描述符,w₀...wₙ 是模型要学的权重。
我在项目中遇到过很多次,别人一上来就扔一堆描述符做线性回归。结果呢?R²倒是挺高,一换数据集就崩。**说白了,线性回归太单纯了**,它假设所有因素是相互独立的,但药物分子哪有这么简单?
举个例子,你想想看,疏水性和分子量经常是关联的,但线性回归会认为它们各自独立地对活性贡献——这显然不符合实际。
我踩过的坑:曾经有个HERG毒性预测项目,我用线性回归跑了一组拓扑描述符,训练集R²=0.85,验证集直接跌到0.32。后来发现是因为数据里有几个强活性异常点,线性回归对这种东西特别敏感。
线性回归的局限:
- 无法处理非线性关系(药物活性几乎不可能纯线性)
- 对异常值高度敏感
- 容易过拟合,尤其是描述符很多的时候
- 描述符之间的多重共线性会搞砸权重估计
3.2 支持向量机
SVM在QSAR圈子里火过好一阵子。它的思路很巧妙:把数据映射到高维空间,然后找个超平面把正负样本分开。
对于回归问题,我们用的是SVR(支持向量回归)。核心想法是:容许误差在 ε 以内,超过这个范围才计算损失。
我会这么理解:SVM给我们找了个"容忍区间",只要预测值和真实值差得不太离谱,就不算错。这在药物数据里特别有用——毕竟实验测定本身就有误差。
核函数的选择是关键。常用的几个:
线性核:K(xᵢ, xⱼ) = xᵢ·xⱼ
多项式核:K(xᵢ, xⱼ) = (γxᵢ·xⱼ + r)ᵈ
RBF核:K(xᵢ, xⱼ) = exp(-γ||xᵢ - xⱼ||²)
我个人习惯在QSAR任务里先试RBF核。为什么?因为分子描述符和活性之间往往存在复杂的非线性关系,RBF核能有效捕捉这种模式。
经验分享:SVM在数据量不大的时候(几百个分子)效果反而好。如果你手里只有几十个化合物,别急着上深度学习,试试SVM+RBF核,经常给你惊喜。
SVM的局限:
- 大样本(>10K)时训练太慢,内存也吃紧
- 核函数和超参数(C、γ、ε)的选择很敏感——调参调到头秃
- 不像随机森林那样天然支持特征重要性,模型解释比较费劲
- 多分类问题需要一堆"一对多"策略,复杂度上去了
| 参数 | 作用 | 经验建议 |
|---|---|---|
| C | 控制误分类惩罚 | 太大容易过拟合,一般从1开始调 |
| γ (RBF核) | 控制单个样本的影响范围 | 通常设为 1/(特征数),然后上下调 |
| ε (SVR) | 不敏感区间宽度 | 0.1 是个不错的起点 |
3.3 随机森林
说实话,随机森林是我在QSAR项目里用得最多的方法。为什么呢?因为它很"皮实"——不需要太多数据预处理,不用假设线性关系,也不怎么过拟合。
我记得有一次,一个学生拿了一组高维分子指纹(2048位),上来就想跑神经网络。我说你先试试随机森林。结果30秒就跑完,R²达到了0.72,比后面折腾了半天神经网络还要好。嗯,有时候最简单的反而是最有效的。
随机森林的原理其实很直白:训练一堆决策树,每棵树只看到一部分样本和一部分特征,最后把它们的预测结果平均一下。
代码实现也很简洁:
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(
n_estimators=500,
max_depth=10,
min_samples_leaf=5,
random_state=42
)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)
随机森林的优势:
- 自动处理特征之间的交互和非线性关系
- 对缺失值和异常值有一定的鲁棒性
- 可以直接给出特征重要性,方便做特征筛选
- 不容易过拟合——这也是我最喜欢它的一点
但随机森林也不是没有缺点。你想想看,它本质上是把多个"弱学习器"结合起来,但每个弱学习器都是树模型,因此 随机森林无法外推——对于训练集范围以外的数据,它的预测会变得很不靠谱。
我曾经吃过亏:在一个ADME预测项目里,模型在验证集表现不错,但一遇到活性显著高于已知化合物的分子,预测值就乱七八糟。后来发现就是吃了随机森林"不能外推"的亏。
另外,随机森林在稀疏特征(比如分子指纹)上的表现,有时候不如线性模型。为什么会这样?因为树模型在做分裂时,如果大多数样本在某位上都是0,那这个特征其实很难发挥作用。
3.4 方法对比总结
我们来做个快速对比。我经常被问到"该选哪个方法",其实答案取决于你的数据。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 线性回归 | 模型简单,可解释性强 | 无法处理非线性关系,对异常值敏感 |
| SVM | 小样本下表现出色,核技巧灵活 | 超参数调优困难,大样本效率低 |
| 随机森林 | 鲁棒性好,特征重要性可直接获取 | 无法外推,高维稀疏特征下表现一般 |
在实际项目中,我的选择逻辑是这样的:数据量小(<500个分子)先试SVM,数据量中等且特征多直接上随机森林,数据量极少且线性关系明显可以考虑线性回归。
这些传统方法的学习,是理解后面多任务学习的基础。说白了,多任务学习就是想办法解决这些老方法解决不了的问题——比如数据稀疏、多终点预测、任务间知识共享这些难题。
核心建议:无论后续用什么高级方法,先把这三种传统方法在你的数据上跑一遍。一方面能快速了解数据特性,另一方面也能给后续模型提供一个合理的baseline。