0

我一直在参考一篇关于特征选择的文章,需要帮助来理解如何绘制 ROC 曲线。使用的数据集:鸢尾花

文章中提到的特征选择方法之一是:Visualways to rank features

下面的示例绘制了各种特征的 ROC 曲线。

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.metrics import auc
import numpy as np# loading dataset
data = load_iris()
X, y = data.data, data.targety_ = y == 2plt.figure(figsize=(13,7))
for col in range(X.shape[1]):
    tpr,fpr = [],[]
    for threshold in np.linspace(min(X[:,col]),max(X[:,col]),100):
        detP = X[:,col] < threshold
        tpr.append(sum(detP & y_)/sum(y_))# TP/P, aka recall
        fpr.append(sum(detP & (~y_))/sum((~y_)))# FP/N
        
    if auc(fpr,tpr) < .5:
        aux = tpr
        tpr = fpr
        fpr = aux
    plt.plot(fpr,tpr,label=data.feature_names[col] + ', auc = '\
                           + str(np.round(auc(fpr,tpr),decimals=3)))plt.title('ROC curve - Iris features')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()

我想了解这一点:

for threshold in np.linspace(min(X[:,col]),max(X[:,col]),100):
    detP = X[:,col] < threshold
    tpr.append(sum(detP & y_)/sum(y_)) # TP/P, aka recall
    fpr.append(sum(detP & (~y_))/sum((~y_)))# FP/N

如何通过检查离散变量(特征)的值是否高于阈值来计算真实阳性率(TPR)和 FPR,阈值是通过将特征的范围(Max-Min)除以 100 个等距点来计算的?

这是生成的 ROC 曲线 在此处输入图像描述

4

1 回答 1

0

让我们从“如何用 [一组] 阈值计算 [ROC 曲线] 开始,该阈值是通过将特征的范围 (Max-Min) 划分为 100 个等距点来计算的?”

一个不能!

ROC 曲线显示了 TPR 和 FPR 如何在定义的每个可能阈值处变化。通常,人们使用数据本身来建立这个集合,并将每个唯一的数据点作为阈值。

将其限制为 100 个相等的阈值最多将给出 ROC 曲线的近似值。如果数据是概率,这可能是一个不错的近似值。在许多数据不均匀甚至高斯分布的实际应用中,这将是一个糟糕的近似值。

只是不要这样做!

相反,请使用经过充分审查的软件包(例如 sklearn)中的专用函数:

from sklearn.metrics import roc_curve
fpr, tpr = roc_curve(y, X[:,col])

要绘制它,请参阅如何在 Python 中绘制 ROC 曲线的答案。

现在对于第二个问题:如何从阈值计算 TPR / FPR,这也是根据定义:TPR 或真阳性率是正确识别的实际阳性的比例。我将在此处参考相应的维基百科文章,该文章对其进行了更详细的解释,可以在此处进行介绍。

于 2020-07-26T08:01:29.493 回答