You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

疑问

  1. 两次AUC结果差异的原因是什么?是否与不同函数的AUC计算方式(如曲线平滑方法)有关?
  2. sklearn中随机森林的ROC曲线是如何生成的?调整的是哪个参数/阈值以得到不同预测?
  3. 是否使用的是森林中单个树的分数?

问题解答

一、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曲线的流程如下:

  1. 获取正类综合概率:对每个测试样本,森林中所有决策树输出该样本的硬分类结果(0或1),正类的投票数占总树数的比例就是该样本的正类概率分数(对应predict_proba返回的正类概率)。
  2. 遍历阈值生成ROC点:将所有样本的正类概率分数排序,把每个分数作为候选阈值,依次计算每个阈值下的TPR和FPR:
    • 阈值高于样本分数时判定为负类,低于等于时判定为正类;
    • 统计对应阈值下的真阳性、假阳性数量,进而计算TPR和FPR。
  3. 绘制并计算AUC:将所有(TPR,FPR)点连接成ROC曲线,用梯形法计算曲线下面积即为AUC。

三、阈值与分数来源的细节

  • 调整的阈值:生成ROC曲线时没有调整模型参数,而是遍历所有样本的正类概率分数作为候选阈值,以此模拟不同分类严格度下的模型表现。
  • 分数来源:使用的是整个森林的综合概率分数,不是单个树的分数。每个决策树输出硬分类结果,随机森林通过汇总所有树的投票得到概率分数,再基于这个分数生成ROC曲线。

内容的提问来源于stack exchange,提问作者Roger V.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:10:10