我们应该绘制每个类的roc曲线吗?

时间:2016-01-20 08:04:56

标签: python machine-learning scikit-learn

我正在做一个二进制分类..我有一个不平衡的数据,我已经使用svm权重来试图缓解这种情况...... 正如你所看到的,我已经计算并绘制了每个类的roc曲线,我得到了以下图: enter image description here 它看起来像两个类一些...我不确定我是否正在做正确的事情因为它是我第一次绘制我自己的roc曲线......我正在使用Scikit学会绘图......单独绘制每个类是否正确..并且分类器是否在分类蓝类时失败了?

这是我用来获取情节的代码:

y_pred = clf.predict_proba(X_test)[:,0] # for calculating the probability of the first class
y_pred2 = clf.predict_proba(X_test)[:,1] # for calculating the probability of the second class
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)
auc=metrics.auc(fpr, tpr)
print "auc for the first class",auc

fpr2, tpr2, thresholds2 = metrics.roc_curve(y_test, y_pred2)
auc2=metrics.auc(fpr2, tpr2)
print "auc for the second class",auc2

# ploting the roc curve
plt.plot(fpr,tpr)
plt.plot(fpr2,tpr2)

plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.title('Roc curve')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.legend(loc="lower right")
plt.show()

我知道有一种更好的方法可以写成字典,但我只是想先看看曲线

3 个答案:

答案 0 :(得分:4)

请参阅Wikipedia条目了解您所有的ROC曲线需求:)

predict_proba返回每个类的类概率。第一列包含第一类的概率,第二列包含第二类的概率。请注意,两条曲线是彼此的旋转版本。这是因为类概率加起来为1。

roc_curve的文档说明第二个参数必须包含

  

目标分数,可以是正类的概率估计或置信度值。

这意味着您必须传递与第1类相对应的概率。很可能这是第二列。

你得到了蓝色曲线,因为你传递了错误类的概率(第一列)。只有绿色曲线是正确的。

计算每个类的ROC曲线没有意义,因为ROC曲线描述了分类器区分两个类的能力。每个分类器只有一条曲线。

具体问题是编码错误。

predict_proba返回类概率(如果它肯定是类,则为1,如果它绝对不是类,则返回0,通常是介于两者之间)。

metrics.roc_curve(y_test, y_pred)现在将类别标签与概率进行比较,就像将梨与苹果汁进行比较一样。

您应该使用predict代替predict_proba来预测课程标签而不是概率。这些可以与用于计算ROC曲线的真实类别标签进行比较。顺便提一下,这也删除了绘制第二条曲线的选项 - 您只能获得分类器的一条曲线,而不是每条曲线的曲线。

答案 1 :(得分:0)

你必须重新思考整个方法。 ROC曲线表示不同“概率”阈值的不同分类器的质量,而不是类别。通常情况下,斜率为0.5的直线是分类器的基准,无论您的分类器是否能够随机猜测。

答案 2 :(得分:0)

这是因为在为0级建立ROC时,它会考虑' 0' 0在y_test中,对于目标类,布尔值为False。

尝试更改: fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)fpr, tpr, thresholds = metrics.roc_curve(1-y_test, y_pred)