我们应该为每个类别绘制ROC曲线吗?

我正在进行二元分类…我的数据不平衡,我已经使用了SVM权重来尝试缓解这种情况…如你所见,我已经计算并绘制了每个类别的ROC曲线,并得到了以下图表:enter image description here看起来这两个类别的总和为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曲线。顺便说一下,这也去除了绘制第二条曲线的选项 – 你只能为分类器得到一条曲线,而不是每个类别一条曲线。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注