【问题标题】:ROC curve for Isolation Forest隔离森林的 ROC 曲线
【发布时间】:2019-08-02 00:25:28
【问题描述】:

我正在尝试绘制 ROC 曲线来评估隔离森林对乳腺癌数据集的准确性。我从混淆矩阵计算了真阳性率(TPR)和假阳性率(FPR)。但是,我不明白 TPR 和 FPR 是如何以矩阵的形式出现的,而不是单个整数值。而且 ROC 曲线似乎只适用于矩阵形式的 FPR 和 TPR(我也尝试过手动编写计算 FPR 和 TPR 的代码)。

TPR 和 FPR 值是否始终采用矩阵形式?

无论哪种方式,我的 ROC 曲线都是一条直线。为什么会这样?

混淆矩阵:

from sklearn.metrics import confusion_matrix
cnf_matrix = confusion_matrix(y, y_pred_test1)

O/P:

>     [[  5  25]
>      [ 21 180]]

True Positive 和 False Positive :(另外,为什么这些值直接取自混淆矩阵?)

F_P = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)  
F_N = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)
T_P = np.diag(cnf_matrix)
T_N = cnf_matrix.sum() - (FP + FN + TP)

F_P = F_P.astype(float)
F_N = F_N.astype(float)
T_P = T_P.astype(float)
T_N = T_N.astype(float)

O/P:

False Positive [21. 25.] 
False Negative [25. 21.] 
True Positive [  5. 180.] 
True Negative [180.   5.]

TPR 和 FPR :

tp_rate = TP/(TP+FN)
fp_rate = FP/(FP+TN)

O/P:

TPR :  [0.16666667 0.89552239]
FPR [0.10447761 0.83333333]

ROC曲线:

from sklearn import metrics
import matplotlib.pyplot as plt

plt.plot(fp_rate,tp_rate)
plt.show()

O/P:

【问题讨论】:

  • 当你说矩阵时你想说列表/数组?并且在图表上有两个点,它将永远是一条线......
  • 看看内置的sklearn roc_curve 函数可能会有所帮助。你会注意到输出是fpr,tpr, thresh,也就是说,对于每个阈值,你得到的是真阳性率和假阳性率,而不仅仅是整个预测器的率

标签: python scikit-learn roc outliers auc


【解决方案1】:

confusion_matrix() 函数只为您提供正确/错误分类的点,但不提供有关模型在错误分类数据点时的自信程度的信息。

此信息用于创建 ROC 曲线(用于衡量模型根据每个数据点对特定类别的可能性对每个数据点进行排名的能力)。

改为使用decision_function()score_samples() 函数来计算模型对每个数据点是(或不是)异常的置信度。然后,使用roc_curve() 获取绘制曲线本身所需的点。

以下是乳腺癌数据集的示例。

from sklearn.datasets import load_breast_cancer
X, y  = load_breast_cancer(return_X_y=True)

from sklearn.ensemble import IsolationForest

clf = IsolationForest(behaviour='new', max_samples=100,
                      random_state=0, contamination='auto')
clf.fit(X)
y_pred = clf.score_samples(X)

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y,y_pred)
import matplotlib.pyplot as plt
plt.plot(fpr, tpr, 'k-', lw=2)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()

【讨论】:

    【解决方案2】:

    混淆矩阵本质上为您提供了 ROC 曲线上的一个点。要构建“完整”ROC 曲线,您需要一个概率列表,然后可以通过改变用于确定类预测的“阈值”来绘制 ROC 曲线,以确定每个实例属于哪个类。

    在您的简单情况下(当您只有 ROC 曲线的一个点时)您可以通过外推到原点和点 (1,1) 来绘制 ROC 曲线:

    # compare to your confusion matrix to see values.
    TP = 180
    FN = 21
    
    tpr = TP/(TP+FN)
    fpr = 1-tpr
    
    tpr_line = [0, tpr, 1]
    fpr_line = [0, fpr 1]
    
    plt.plot(fpr, tpr, 'k-', lw=2)
    plt.xlabel('FPR')
    plt.ylabel('TPR')
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    

    ROC 曲线如下:

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2017-02-20
      • 1970-01-01
      • 2013-11-27
      • 2018-09-10
      • 2019-07-11
      • 2015-09-16
      • 2020-11-16
      • 2019-06-29
      相关资源
      最近更新 更多