【问题标题】:How to plot a ROC curve using dataframe converted from CSV file如何使用从 CSV 文件转换的数据框绘制 ROC 曲线
【发布时间】:2018-12-23 02:40:33
【问题描述】:

我试图通过使用 sklearn 提供的文档来绘制 ROC 曲线。我的数据在 CSV 文件中,看起来像这样。它有两个类“好”和“坏”

我的 CSV 文件的屏幕截图

我的代码是这样的

import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
import sys
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from scipy import interp
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import MultinomialNB

# Import some data to play with
df = pd.read_csv("E:\\autodesk\\TTI ROC curve.csv")
X =df[['TTI','Max TemperatureF','Mean TemperatureF','Min TemperatureF',' Min Humidity']].values
y = df['TTI_Category'].as_matrix()
# Binarize the output
y = label_binarize(y, classes=['Good','Bad'])
n_classes = y.shape[1]

# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
                                                    random_state=0)

# Learn to predict each class against the other
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                 random_state=random_state))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()enter code here

如果我运行此代码,系统会告诉我 random_state 未定义。所以我把它改成了random_state=true。然后系统告诉我

plt.plot(fpr[2], tpr[2], color='darkorange', KeyError: 2 <matplotlib.figure.Figure at 0xd8bff60>

如果我打印出 n_classes。系统告诉我它是“1”,如果我在文档中打印出 n_classes,它会显示 3。我不确定这是否是问题所在。有人对此回溯有答案吗?

【问题讨论】:

  • 您应该提供一些有关代码引发哪些错误的信息。此外,不要指望人们会通过文档“逐行”指导您。
  • 谢谢 Danlele。如果我运行此代码,系统会告诉我 random_state 未定义。所以我把它改成了random_state=true。然后系统告诉我“plt.plot(fpr[2], tpr[2], color='darkorange', KeyError: 2 ”。有人对这个回溯有答案吗?跨度>
  • 哦,顺便说一下,如果我打印出 n_classes。系统告诉我它是“1”。我不确定这是否是问题所在。
  • 请不要将 cmets 空间用于此类澄清和附加信息 - 改为编辑和更新您的帖子!
  • 感谢 Desertnaut。我是堆栈溢出的新手。感谢您让我知道格式问题。

标签: python dataframe machine-learning scikit-learn roc


【解决方案1】:

看起来您根本不了解数据的结构以及代码的工作方式。

LabelBinarizer 将返回 one-v-all 编码,这意味着对于两个类,您将获得以下映射:['good', 'bad', 'good'] -&gt; [[1], [0], [1]], s.t. n_classes = 1

如果你有 2 个类,为什么你会期望它是 3 个? 只需将plt.plot(fpr[2], tpr[2], color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2]) 更改为plt.plot(fpr[0], tpr[0], color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[0]) 即可。

【讨论】:

  • 尊敬的 Daniele 先生:非常感谢您的耐心和帮助。我可以再打扰你一次吗?正如您在回答中提到的,因为我只有两个课程;因此,n_classes = 1。那么如果我有三个类呢?可以说:y= label_binarize([1, 6], classes=[0,1,2])。我自己试过了,得到了 n_classes =3。那么这是否意味着 n_classes 永远不会等于 2?如果是,那为什么。非常感谢 Daniele 先生的帮助。
  • 还有另一个问题 Daniele 先生。为什么将 fpr[2], tpr[2],roc_auc[2] 更改为 fpr[0], tpr[0],roc_auc[0] 使整个工作正常。我试图将所有内容都更改为 1,因为 n_classes=1(因为 python 从 0 开始,因此我认为 n_classes =1 意味着 0 和 1 都应该可以)并且系统给了我一个 keyerror:1。最后 Daniele 先生,因为我有两个班级,那么我可以为每个班级绘制 ROC 曲线,或者我只能在我有两个以上班级的情况下这样做。再次感谢您的时间和耐心。我希望你一切顺利。
  • 再次抱歉 Daniele 先生格式化。我试图将评论中的所有代码更改为正确的格式,但未能在五分钟内完成。
【解决方案2】:

只需查看tprfpr 字典,您就会发现您没有tpr[2]fpr[2]n_classes = y.shape[1] 显示您有多少类 (= 2),这意味着您的 tprfpr 字典中有 01 的键。

当您只有 2 个类(二元分类)时,使用多类方法会使事情变得过于复杂。我认为您正在使用this tutorial.

我建议更换以下内容:

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])

类似的东西:

fpr, tpr = roc_curve(y_test.values, y_score[:,1])
roc_auc = auc(fpr,tpr)
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)

【讨论】:

  • 亲爱的史蒂夫。如果你能请你看看我更新的问题。我已经尝试了你的建议并得到了一些回溯。非常感谢您的帮助。
  • 尝试使用fpr, tpr = roc_curve(y_test, y_score)
猜你喜欢
  • 2019-06-01
  • 2017-10-14
  • 1970-01-01
  • 2020-11-06
  • 2019-04-11
  • 2020-08-15
  • 2019-02-05
  • 2018-12-26
  • 2016-02-04
相关资源
最近更新 更多