6.4 模型评估与选择
6.4.1 分类评估指标
分类模型的评估需要多维度指标,单一指标往往无法全面反映模型性能。
**混淆矩阵(Confusion Matrix)**是评估分类模型的基础:
| 实际\预测 | 正类 | 负类 |
|---|---|---|
| 正类 | TP | FN |
| 负类 | FP | TN |
基于混淆矩阵的核心指标:
- 准确率(Accuracy):
- 精确率(Precision):
- 召回率(Recall):
- F1分数:
准确率在不平衡数据集上具有误导性。例如,在99%样本为负类的数据集中,始终预测负类即可获得99%准确率,但模型毫无实用价值。
**宏平均(Macro-average)和加权平均(Weighted-average)**用于多分类评估:
- 宏平均:各类别指标简单平均,平等对待每个类别
- 加权平均:按类别样本数加权平均,考虑类别不平衡
6.4.2 回归评估指标
- 均方误差(MSE):
- 均方根误差(RMSE):,与目标变量同量纲
- 平均绝对误差(MAE):,对异常值更鲁棒
- 决定系数(R²):,解释模型对数据变异的解释比例
6.4.3 ROC曲线与PR曲线
**ROC曲线(Receiver Operating Characteristic)**以假正率(FPR)为横轴、真正率(TPR)为纵轴绘制,展示不同分类阈值下的模型性能。
**AUC(Area Under Curve)**是ROC曲线下面积,取值范围为[0,1]:
- AUC = 0.5:模型等同于随机猜测
- AUC > 0.8:模型具有良好区分能力
- AUC = 1.0:完美分类器
AUC的统计解释:随机抽取一个正样本和一个负样本,正样本得分高于负样本的概率。
**PR曲线(Precision-Recall Curve)**以召回率为横轴、精确率为纵轴,在类别不平衡情况下比ROC曲线更具信息量。曲线下面积(AP)反映模型在不同阈值下的综合表现。

图6-6:分类模型评估可视化。左上为ROC曲线对比,SVM和随机森林的AUC最高;右上为PR曲线,在类别不平衡情况下更具参考价值;左下为混淆矩阵热力图;右下为各模型多指标对比。
from sklearn.metrics import (roc_curve, auc, precision_recall_curve,
average_precision_score, classification_report)
# 训练模型并预测概率
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
y_score = model.predict_proba(X_test)[:, 1]
y_pred = model.predict(X_test)
# ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
print(f"AUC: {roc_auc:.4f}")
# PR曲线
precision, recall, _ = precision_recall_curve(y_test, y_score)
ap = average_precision_score(y_test, y_score)
print(f"Average Precision: {ap:.4f}")
# 完整分类报告
print(classification_report(y_test, y_pred))
6.4.4 模型可解释性
随着机器学习在高风险领域(医疗、金融、司法)的应用,模型可解释性变得越来越重要。
特征重要性是理解模型决策的基础。树模型可直接输出特征重要性,基于特征在分裂中带来的不纯度减少:
# 随机森林特征重要性
importances = rf_model.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10, 6))
plt.bar(range(X.shape[1]), importances[indices])
plt.xticks(range(X.shape[1]), [f"Feature {i}" for i in indices], rotation=45)
plt.title("Feature Importance")
plt.tight_layout()
**SHAP(SHapley Additive exPlanations)**值基于博弈论中的Shapley值,为每个特征分配对预测的贡献,具有理论上的公平性保证。SHAP值的特点:
- 可加性:所有特征的SHAP值之和等于预测值与基准值的差
- 一致性:当模型改变使得某特征影响力增加时,其SHAP值不会减少
import shap
# 计算SHAP值
explainer = shap.TreeExplainer(rf_model)
shap_values = explainer.shap_values(X_test)
# 全局特征重要性
shap.summary_plot(shap_values, X_test, plot_type="bar")
# 单个预测解释
shap.force_plot(explainer.expected_value[1], shap_values[1][0], X_test.iloc[0])
**LIME(Local Interpretable Model-agnostic Explanations)**通过在预测样本附近采样并拟合可解释模型(如线性模型),解释单个预测的原因。
表6-3:模型可解释性方法对比
| 方法 | 适用范围 | 解释类型 | 计算成本 | 主要优势 |
|---|---|---|---|---|
| 特征重要性 | 树模型 | 全局 | 低 | 直观、高效 |
| SHAP | 所有模型 | 全局+局部 | 高 | 理论基础扎实 |
| LIME | 所有模型 | 局部 | 中 | 模型无关 |
| 偏依赖图 | 所有模型 | 全局 | 中 | 展示特征效应 |