使用 scikit learn 的离散分类器的 ROC 曲线

Posted

技术标签:

【中文标题】使用 scikit learn 的离散分类器的 ROC 曲线【英文标题】:ROC curve for discrete classifier using scikit learn 【发布时间】:2018-07-30 22:09:57 【问题描述】:

我在概念上理解 scikit learn 中的 ROC 函数如何生成真阳性率和假阳性率时遇到了一点麻烦。我使用 BC scikit 学习数据并围绕 2 个随机特征构建了一个决策树。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn import tree
import numpy as np

data = load_breast_cancer()
X = data.data[:, [1,3]]
y = data.target

# Splitting data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,random_state=0)

# Training tree
bc_tree = tree.DecisionTreeClassifier(criterion="entropy").fit(X_train, y_train)

# Predictions
bc_pred = bc_tree.predict(X_test)
# Score
bc_tree.score(X_test, y_test)

# Confusion matrix
from sklearn.metrics import confusion_matrix
metrics.confusion_matrix(y_test, bc_pred) # True positive = 0.83

# ROC curve
fpr_tree, tpr_tree, thresholds_tree = metrics.roc_curve(y_test, bc_pred)

# True positive rate ROC
tpr_tree # 0.91

混淆矩阵如下所示:

[[ 55,  12]
[ 11, 110]]

根据我的计算,真阳性率为:

55/(55+11) = .83

根据scikit learn实现的ROC曲线,真阳性率为0.92。它是如何计算这个数字的,为什么我的计算不匹配?我错过了什么?

【问题讨论】:

【参考方案1】:

因为你推断的混淆矩阵是错误的。

confusion_matrix 返回的矩阵格式为

      0   TN   FP
True
      1   FN   TP

           0    1
         Predicted

所以根据TPR的公式,这个值应该是110/ (110+11) = 0.9090...

【讨论】:

以上是关于使用 scikit learn 的离散分类器的 ROC 曲线的主要内容,如果未能解决你的问题,请参考以下文章

使用没有分类器的 scikit-learn 绘制混淆矩阵

如何获得 scikit-learn SVM 分类器的所有 alpha 值?

在 scikit-learn 中获得二元概率分类器的最大准确度

在 scikit-learn 库中使用 sgd 求解器的 SGDClassifier 与 LogisticRegression

使用 scikit-learn 进行多标签文本分类,使用哪些分类器?

机器学习与scikit-learn-13]:算法 - 分类的本质与样本分布的离散程度的指标:纯度信息熵 基尼指数.