返回学习路线
4基础筑基

第 4 周:模型评估与正则化

AUC/F1、混淆矩阵、交叉验证、L1/L2 正则化

6.4 模型评估与选择

6.4.1 分类评估指标

分类模型的评估需要多维度指标,单一指标往往无法全面反映模型性能。

**混淆矩阵(Confusion Matrix)**是评估分类模型的基础:

实际\预测正类负类
正类TPFN
负类FPTN

基于混淆矩阵的核心指标:

  • 准确率(Accuracy)TP+TNTP+TN+FP+FN\frac{TP+TN}{TP+TN+FP+FN}
  • 精确率(Precision)TPTP+FP\frac{TP}{TP+FP}
  • 召回率(Recall)TPTP+FN\frac{TP}{TP+FN}
  • F1分数2×Precision×RecallPrecision+Recall2 \times \frac{Precision \times Recall}{Precision + Recall}

准确率在不平衡数据集上具有误导性。例如,在99%样本为负类的数据集中,始终预测负类即可获得99%准确率,但模型毫无实用价值。

**宏平均(Macro-average)加权平均(Weighted-average)**用于多分类评估:

  • 宏平均:各类别指标简单平均,平等对待每个类别
  • 加权平均:按类别样本数加权平均,考虑类别不平衡

6.4.2 回归评估指标

  • 均方误差(MSE)1ni=1n(yiy^i)2\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2
  • 均方根误差(RMSE)MSE\sqrt{MSE},与目标变量同量纲
  • 平均绝对误差(MAE)1ni=1nyiy^i\frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|,对异常值更鲁棒
  • 决定系数(R²)1(yiy^i)2(yiyˉ)21 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2},解释模型对数据变异的解释比例

6.4.3 ROC曲线与PR曲线

**ROC曲线(Receiver Operating Characteristic)**以假正率(FPR)为横轴、真正率(TPR)为纵轴绘制,展示不同分类阈值下的模型性能。

TPR=TPTP+FN,FPR=FPFP+TNTPR = \frac{TP}{TP+FN}, \quad FPR = \frac{FP}{FP+TN}

**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所有模型局部模型无关
偏依赖图所有模型全局展示特征效应