模型评估
问题
如何评估一个机器学习模型的好坏?
答案
分类模型评估指标
| 指标 | 公式 | 适用场景 |
|---|---|---|
| Accuracy | 正确预测数 / 总数 | 类别均衡 |
| Precision | TP / (TP + FP) | 关注"预测为正的准确率" |
| Recall | TP / (TP + FN) | 关注"正样本的覆盖率" |
| F1 | 2 × P × R / (P + R) | P 和 R 的调和均值 |
| AUC | ROC 曲线下面积 | 综合评估,不受阈值影响 |
混淆矩阵
| 预测正 | 预测负 | |
|---|---|---|
| 实际正 | TP(真正) | FN(假负) |
| 实际负 | FP(假正) | TN(真负) |
from sklearn.metrics import (
classification_report, roc_auc_score, confusion_matrix
)
# 完整评估
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
print(classification_report(y_test, y_pred))
print(f'AUC = {roc_auc_score(y_test, y_prob):.4f}')
print(f'混淆矩阵:\n{confusion_matrix(y_test, y_pred)}')
回归模型评估指标
| 指标 | 说明 |
|---|---|
| MAE | 平均绝对误差,直观好理解 |
| RMSE | 均方根误差,对大误差惩罚更重 |
| R² | 决定系数,模型解释了多少方差 |
| MAPE | 平均绝对百分比误差,百分比表达 |
交叉验证
from sklearn.model_selection import cross_val_score
# 5 折交叉验证
scores = cross_val_score(model, X, y, cv=5, scoring='roc_auc')
print(f'AUC: {scores.mean():.4f} ± {scores.std():.4f}')
过拟合判断
| 信号 | 说明 |
|---|---|
| 训练集指标远高于测试集 | 模型记住了训练数据的噪声 |
| 测试集指标波动大 | 模型不稳定 |
| 特征数远多于样本数 | 高维"维度灾难" |
应对策略:
- 减少模型复杂度(降低树深度、正则化)
- 增加训练数据
- 特征选择,减少冗余特征
- 使用交叉验证
常见面试问题
Q1: AUC 是什么?为什么比 Accuracy 好?
答案: AUC(Area Under ROC Curve)衡量模型区分正负样本的能力:
- AUC = 0.5:随机猜测
- AUC = 1.0:完美区分
- 优势:不受类别不均衡影响,不依赖阈值选择
例如:在 1% 正样本的场景中,预测全为负也有 99% Accuracy,但 AUC 只有 0.5。
Q2: Precision 和 Recall 怎么取舍?
答案:
| 场景 | 优先 | 理由 |
|---|---|---|
| 垃圾邮件检测 | Precision | 不能把正常邮件误判为垃圾 |
| 疾病筛查 | Recall | 不能漏诊 |
| 欺诈检测 | Recall | 宁可多查不能漏掉 |
| 推荐系统 | Precision | 推荐不准影响体验 |