sklearn随机森林AUC计算差异原因及ROC曲线生成机制问询
问题描述
以下是基于scikit-learn官方「ROC Curve with Visualization API」的实验过程及疑问:
实验步骤1:用模型直接生成ROC曲线并计算AUC
import matplotlib.pyplot as plt from sklearn.datasets import load_wine from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import RocCurveDisplay 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) ax = plt.gca() rfc_disp = RocCurveDisplay.from_estimator(rfc, X_test, y_test, ax=ax, alpha=0.8) print(rfc_disp.roc_auc)
输出结果:0.9823232323232323
实验步骤2:用预测标签计算AUC
from sklearn.metrics import roc_auc_score y_pred = rfc.predict(X_test) auc = roc_auc_score(y_test, y_pred) print(auc)
输出结果:0.928030303030303
实验步骤3:用预测标签生成ROC曲线
rfc_disp1 = RocCurveDisplay.from_predictions(y_test, y_pred) print(rfc_disp1.roc_auc)
输出结果与roc_auc_score一致:0.928030303030303
实验步骤4:手动梯形积分计算ROC曲线面积
import numpy as np I = np.sum(np.diff(rfc_disp.fpr) * (rfc_disp.tpr[1:] + rfc_disp.tpr[:-1])/2.) print(I)
输出结果与from_estimator得到的AUC一致:0.9823232323232323
疑问
- 两次AUC结果差异的原因是什么?是否与不同函数的AUC计算方式(如曲线平滑方法)有关?
- sklearn中随机森林的ROC曲线是如何生成的?调整的是哪个参数/阈值以得到不同预测?
- 是否使用的是森林中单个树的分数?
问题解答
一、AUC结果差异的核心原因
这两个结果的差异根本原因是输入的预测值类型不同:
RocCurveDisplay.from_estimator和手动积分计算时,用的是模型输出的正类概率分数(即rfc.predict_proba(X_test)[:, 1])。ROC曲线基于连续的概率分数生成,通过遍历所有样本的概率作为候选阈值,计算每个阈值下的真阳性率(TPR)和假阳性率(FPR),曲线包含多个点,AUC是这条连续曲线下的面积。- 而
roc_auc_score(y_test, y_pred)和RocCurveDisplay.from_predictions(y_test, y_pred)用的是硬分类标签(0/1),这相当于只使用默认阈值(0.5)得到的预测结果。此时生成的ROC曲线只有3个点:(0,0)、(FPR,TPR)、(1,1),AUC是这个简单折线的面积,自然和基于概率分数的AUC不同。
两者的计算逻辑都是梯形法,差异完全来自输入数据类型——连续概率分数vs离散分类标签,和曲线平滑无关。
二、sklearn中随机森林ROC曲线的生成逻辑
随机森林生成ROC曲线的流程如下:
- 获取正类综合概率:对每个测试样本,森林中所有决策树输出该样本的硬分类结果(0或1),正类的投票数占总树数的比例就是该样本的正类概率分数(对应
predict_proba返回的正类概率)。 - 遍历阈值生成ROC点:将所有样本的正类概率分数排序,把每个分数作为候选阈值,依次计算每个阈值下的TPR和FPR:
- 阈值高于样本分数时判定为负类,低于等于时判定为正类;
- 统计对应阈值下的真阳性、假阳性数量,进而计算TPR和FPR。
- 绘制并计算AUC:将所有(TPR,FPR)点连接成ROC曲线,用梯形法计算曲线下面积即为AUC。
三、阈值与分数来源的细节
- 调整的阈值:生成ROC曲线时没有调整模型参数,而是遍历所有样本的正类概率分数作为候选阈值,以此模拟不同分类严格度下的模型表现。
- 分数来源:使用的是整个森林的综合概率分数,不是单个树的分数。每个决策树输出硬分类结果,随机森林通过汇总所有树的投票得到概率分数,再基于这个分数生成ROC曲线。
内容的提问来源于stack exchange,提问作者Roger V.
相关产品推荐
相关产品推荐

