4. 模型评估指标:怎么看模型好不好
做ADMET预测,模型训练完了,最关键的一步就是评估。说白了,你得知道这个模型到底靠不靠谱。我见过不少新人,训练完模型一看准确率还行,就直接上线了,结果实际用起来一塌糊涂。为什么?因为他选错了评估指标。
今天我就带你把这些指标理清楚。每个指标适合什么场景、有什么坑,我们一次性说透。
4.1 分类指标:二分类问题怎么评
ADMET预测里大部分是二分类任务,比如“有没有毒性”、“会不会代谢”。这些场景下,最常用的指标有这么几个。
4.1.1 准确率(Accuracy)
准确率是最直观的指标。公式很简单:(TP + TN) / (TP + TN + FP + FN)。TP是预测正确的阳性,TN是预测正确的阴性。
坑:我刚开始做ADMET时也踩过这个坑。当时一个毒性预测任务,阳性样本只占5%。我把所有样本预测为阴性,准确率直接95%!看着挺好,其实模型完全没用。所以,数据不平衡时,千万别只看准确率。
什么时候用准确率?只有两类样本数量差不多的时候,准确率才有参考价值。否则,它就是骗人的。
4.1.2 AUC(ROC曲线下面积)
AUC是我个人最常用的分类指标之一。它不依赖具体的阈值,能直接反映模型区分正负样本的能力。数值在0.5到1之间,0.5代表随机猜测,1代表完美区分。
为什么会这样?因为AUC考虑了所有可能的分类阈值,画出一条ROC曲线,然后算曲线下的面积。阈值不同,真正率和假正率都会变,AUC能综合衡量。
技巧:我在项目里习惯先用AUC选模型,再找一个最优阈值去部署。AUC能避免阈值选择带来的偏差,尤其适合正负样本比例失衡的情况。
4.1.3 其他分类指标
很多时候光看AUC还不够,你还得看精确率、召回率、F1分数。
| 指标 | 公式 | 适用场景 |
|---|---|---|
| 精确率 | TP / (TP + FP) | 关注“预测为阳性的样本里,真的阳性占多少”。比如ADMET毒性预测,你不想把无毒预测成有毒,以免浪费验证实验。 |
| 召回率 | TP / (TP + FN) | 关注“真正的阳性样本里,你找回了多少”。比如药物筛选,你不想漏掉一个可能有毒的化合物。 |
| F1分数 | 2 × (P × R) / (P + R) | 精确率和召回率的调和平均。当两者都重要时,用F1最合适。 |
4.2 回归指标:连续值预测怎么评
有些ADMET任务是回归问题,比如预测LogP值、水溶性、代谢速率等。这时候就得换成回归指标了。
4.2.1 RMSE(均方根误差)
RMSE是回归任务里最常用的指标。公式:sqrt( mean( (y_pred - y_true)² ) )。它衡量预测值和真实值之间的平均偏差。
注意:RMSE对异常值非常敏感。如果数据里有个别预测差得离谱,RMSE会被拉得很大。我遇到过这种情况:模型整体不错,但一个异常化合物的预测偏差很大,RMSE直接翻倍。这时候我会同时看MAE(平均绝对误差),它对异常值鲁棒一些。
4.2.2 R²(决定系数)
R²衡量的是模型对数据方差的解释能力。值越接近1,说明模型拟合得越好。零附近甚至负值,说明模型还不如直接取平均值。
公式:1 - (SS_res / SS_tot),其中SS_res是残差平方和,SS_tot是总平方和。
坑:我见过有人拿R²作为唯一指标,结果发现模型欠拟合或过拟合。R²高不一定代表模型好,尤其在测试集上R²极高时,要小心过拟合。最好结合RMSE一起看。
4.2.3 MAE(平均绝对误差)
MAE对异常值的敏感度比RMSE低。公式:mean( |y_pred - y_true| )。如果你想看模型“平均偏差多少”,MAE更直观。
我个人习惯把RMSE和MAE放一起。如果RMSE远大于MAE,说明存在少数预测极差的样本,需要排查是不是数据质量问题。
4.3 回归 vs 分类:指标选择流程图
我整理了一个流程,帮你快速判断该用哪个指标。你自己对照着选就行。
4.4 ADMET场景下的指标选择实战
我们来看几个实际的ADMET场景,到底怎么选指标。
4.4.1 毒性预测(二分类)
我做过一个肝毒性预测项目。数据集里阳性样本(有毒性)只占10%,阴性占90%。如果只看准确率,模型全预测阴性就能拿90%,但这显然没用。
- 主指标:AUC,评价模型区分能力
- 辅指标:F1分数,平衡精确率和召回率
- 特别注意:召回率不能太低,否则会漏掉有毒化合物
我曾经有一个模型AUC高达0.92,但召回率只有0.6。说明它虽然能区分,但阈值设得不好,很多有毒化合物漏掉了。后来我调整阈值,召回率提到0.85,虽然精确率降了一点,但整体更实用。
4.4.2 水溶性预测(回归)
水溶性是连续值,一般用LogS表示。我习惯用RMSE看平均误差,同时看R²看拟合程度。
- 主指标:RMSE,直观理解平均偏差多少
- 辅指标:R²,判断模型是否捕捉到了趋势
- 额外检查:MAE,排除异常值影响
4.4.3 代谢稳定性预测(回归或分类)
代谢稳定性可以看半衰期(连续值),也可以设阈值分类。不同的转化方式,指标选择不同。
| 转化方式 | 主指标 | 原因 |
|---|---|---|
| 连续值预测 | RMSE + R² | 直接评估数值误差 |
| 二分类(高/低稳定性) | AUC + F1 | 评估分类能力,容忍不平衡 |
| 多分类(低/中/高稳定性) | 宏平均F1、加权AUC | 平滑多类影响 |
4.5 代码示例:一键评估模型
下面是我常用的评估代码片段,直接跑就能输出所有重要指标。
from sklearn.metrics import accuracy_score, roc_auc_score, f1_score
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np
def evaluate_classification(y_true, y_pred, y_prob):
"""分类任务评估"""
acc = accuracy_score(y_true, y_pred)
auc = roc_auc_score(y_true, y_prob)
f1 = f1_score(y_true, y_pred)
print(f"Accuracy: {acc:.4f}")
print(f"AUC: {auc:.4f}")
print(f"F1: {f1:.4f}")
return {"accuracy": acc, "auc": auc, "f1": f1}
def evaluate_regression(y_true, y_pred):
"""回归任务评估"""
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"RMSE: {rmse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"R²: {r2:.4f}")
return {"rmse": rmse, "mae": mae, "r2": r2}
技巧:我在实际项目中经常会同时调用两个函数,先看看任务是回归还是分类。如果模型输出了概率,分类任务一定要传 y_prob,否则AUC算不出来。
4.6 小结:选指标的原则
说了这么多,我总结三条最核心的规则。
- 先分任务类型:分类看AUC、F1;回归看RMSE、R²。
- 警惕数据不平衡:不平衡时,准确率就是陷阱。
- 多指标联合判断:没有一个指标是万能的。我习惯至少看两个指标,互相印证,这样模型有没有问题一眼就能看出来。
记住这些,你选指标就不会再出错。下次我们直接上手调超参数,到时候你就能用今天学的指标,判断调参到底有没有效果。