我正在做一个二进制分类..我有一个不平衡的数据,我已经使用svm权重来试图缓解这种情况...... 正如你所看到的,我已经计算并绘制了每个类的roc曲线,我得到了以下图: 它看起来像两个类一些...我不确定我是否正在做正确的事情因为它是我第一次绘制我自己的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()
我知道有一种更好的方法可以写成字典,但我只是想先看看曲线
答案 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)