我正在进行二元分类…我的数据不平衡,我已经使用了SVM权重来尝试缓解这种情况…如你所见,我已经计算并绘制了每个类别的ROC曲线,并得到了以下图表:看起来这两个类别的总和为1…我不知道我做的是否正确,因为这是我第一次自己绘制ROC曲线…我使用Scikit-learn来绘图…单独绘制每个类别是否正确…分类器在分类蓝色类别时是否失败了?
这是我用来获取图表的代码:
y_pred = clf.predict_proba(X_test)[:,0] # 用于计算第一个类的概率y_pred2 = clf.predict_proba(X_test)[:,1] # 用于计算第二个类的概率fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)auc=metrics.auc(fpr, tpr)print "auc for the first class",aucfpr2, tpr2, thresholds2 = metrics.roc_curve(y_test, y_pred2)auc2=metrics.auc(fpr2, tpr2)print "auc for the second class",auc2# 绘制ROC曲线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()
我知道可以用字典的方式写得更好,但我只是想先看看曲线
回答:
查看维基百科条目,了解所有关于ROC曲线的需求 🙂
predict_proba
返回每个类别的类概率。第一列包含第一个类的概率,第二列包含第二个类的概率。请注意,这两条曲线是彼此的旋转版本。这是由于类概率总和为1所致。
roc_curve
的文档说明,第二个参数必须包含
目标分数,可以是正类别的概率估计或置信值。
这意味着你必须传递对应于类别1的概率。很可能这是第二列。
你得到蓝色曲线是因为你传递了错误类别的概率(第一列)。只有绿色曲线是正确的。
为每个类别计算ROC曲线没有意义,因为ROC曲线描述的是分类器区分两个类别的能力。每个分类器只有一个曲线。
具体问题是一个编码错误。
predict_proba
返回类概率(如果确定是该类则为1,如果绝对不是该类则为0,通常介于两者之间)。
metrics.roc_curve(y_test, y_pred)
现在是将类标签与概率进行比较,这就像将梨与苹果汁进行比较。
你应该使用predict
而不是predict_proba
来预测类标签而不是概率。这些可以与真实类标签进行比较以计算ROC曲线。顺便说一下,这也去除了绘制第二条曲线的选项 – 你只能为分类器得到一条曲线,而不是每个类别一条曲线。