本文旨在阐明在使用 Scikit-learn 计算随机森林模型的 AUC(Area Under the Curve)时,roc_auc_score 函数和 RocCurveDisplay 对象可能出现结果差异的原因。我们将深入探讨 predict 和 predict_proba 方法的区别,并提供正确的 AUC 计算方法,以确保评估结果的准确性。
理解 AUC 和 ROC 曲线
AUC(Area Under the Curve)是 ROC(Receiver Operating Characteristic)曲线下的面积,用于衡量二分类模型的性能。ROC 曲线以假正率(FPR)为横轴,真正率(TPR)为纵轴,描绘了模型在不同阈值下的性能表现。AUC 值越高,模型的区分能力越强。
predict vs. predict_proba
在使用 Scikit-learn 的随机森林模型时,有两个主要的预测方法:
- predict(X): 该方法返回基于默认阈值(通常为 0.5)的硬性类别预测。也就是说,它直接给出每个样本属于哪个类别。
- predict_proba(X): 该方法返回每个样本属于每个类别的概率。对于二分类问题,它返回一个二维数组,其中第一列是样本属于类别 0 的概率,第二列是样本属于类别 1 的概率。
问题根源:predict 导致的信息损失
当使用 roc_auc_score 函数时,如果直接传入 rfc.predict(X_test) 的结果,实际上是使用了硬性类别预测。这意味着模型输出的概率信息被丢弃了。roc_auc_score 函数本质上是根据预测值和真实值之间的排序关系来计算 AUC 的,而硬性类别预测只能提供有限的排序信息,导致计算出的 AUC 值偏低,与使用 RocCurveDisplay 对象计算的结果产生差异。
正确计算 AUC 的方法
要正确计算随机森林模型的 AUC,应该使用 predict_proba 方法,并将预测概率作为 roc_auc_score 函数的输入。具体来说,对于二分类问题,需要提取 predict_proba 返回的概率数组中属于正类(类别 1)的概率值。
以下是正确的代码示例:
from sklearn.datasets import load_wine from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import roc_auc_score from sklearn.model_selection import train_test_split # 加载数据集 X, y = load_wine(return_X_y=True) y = y == 2 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 创建并训练随机森林模型 rfc = RandomForestClassifier(n_estimators=10, random_state=42) rfc.fit(X_train, y_train) # 使用 predict_proba 计算 AUC auc = roc_auc_score(y_test, rfc.predict_proba(X_test)[:, 1]) print(auc)
在这个示例中,rfc.predict_proba(X_test)[:, 1] 提取了测试集中每个样本属于类别 1 的概率,然后将其传递给 roc_auc_score 函数,从而得到更准确的 AUC 值。
RocCurveDisplay 的工作原理
RocCurveDisplay.from_estimator 函数内部使用了 predict_proba 方法来生成 ROC 曲线,并计算 AUC。因此,它能够利用模型输出的完整概率信息,得到更准确的 AUC 值。这也是为什么使用 RocCurveDisplay.from_estimator 和 roc_auc_score(y_test, rfc.predict_proba(X_test)[:, 1]) 得到的结果通常是一致的原因。
总结
在使用 Scikit-learn 计算随机森林模型的 AUC 时,务必使用 predict_proba 方法获取概率预测,并将其作为 roc_auc_score 函数的输入。避免使用 predict 方法,因为它会导致信息损失,从而得到不准确的 AUC 值。理解 predict 和 predict_proba 的区别,是正确评估模型性能的关键。
评论(已关闭)
评论已关闭