如何使用从CSV文件转换的数据框绘制ROC曲线

时间:2018-07-15 08:45:30

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

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

我的CSV文件的屏幕截图

screenshot of my CSV file

我的代码如下:

CREATE TABLE outerwear_outerwear_join (
    a_outerwear_id integer REFERENCES outerwear,
    b_outerwear_id integer REFERENCES outerwear,
    PRIMARY KEY(a_outerwear_id, b_outerwear_id)
);

如果我运行此代码,则系统告诉我random_state未定义。所以我将其更改为random_state = true。然后系统告诉我

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

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

2 个答案:

答案 0 :(得分:0)

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

LabelBinarizer将返回一个全数编码,这意味着对于两个类,您将获得以下映射:['good', 'bad', 'good'] -> [[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])就可以了。

答案 1 :(得分:0)

仅查看querySelectorAlltpr字典,您会发现您没有fprtpr[2]fpr[2]显示您有多少类(= 2),这意味着您在n_classes = y.shape[1]0词典中拥有1tpr的键。 / p>

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

我建议替换以下内容:

fpr

类似:

# 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])