如何从具有 2 个输出神经元的 softmax 二元分类器绘制 ROC 曲线?

Posted

技术标签:

【中文标题】如何从具有 2 个输出神经元的 softmax 二元分类器绘制 ROC 曲线?【英文标题】:How to plot a ROC curve from a softmax binary classifier with 2 output neurons? 【发布时间】:2020-07-20 01:01:19 【问题描述】:

如何将离散输出标签绘制为 2 列的 roc 曲线?

使用 roc_curve() 给我一个错误:

ValueError:不支持多标签指示符格式

y_prediction = model.predict(test_X)

y_prediction[1]
Out[27]: array([1.0000000e+00, 6.8178085e-12], dtype=float32)

y_prediction.shape
Out[23]: (514, 2)

test_y.shape
Out[24]: (514, 2)

fpr_roc, tpr_roc, thresholds_roc = roc_curve(test_y, y_prediction)

roc_auc = metrics.auc(fpr_roc, tpr_roc)

【问题讨论】:

【参考方案1】:

根据文档,y_true 和 y_score 应该是 1-d。

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html

y_truearray, shape = [n_samples]

所以,只取标签而不是 softmax 输出。

在 roc_curve() 之前添加以下行

test_y = np.argmax(test_y, axis=-1) # getting the labels
y_prediction = np.argmax(y_prediction, axis=-1) # getting the confidence of postive class

【讨论】:

【参考方案2】:

由于sklearn中的roc_curve函数只需要正类概率估计,所以可以使用与正类相关的输出维度。

例如: preds[:, -1]

【讨论】:

以上是关于如何从具有 2 个输出神经元的 softmax 二元分类器绘制 ROC 曲线?的主要内容,如果未能解决你的问题,请参考以下文章

从零到一实现神经网络(python):二

使用 softmax 函数进行多任务分类

softmax求导cross-entropy求导及label smoothing

小白必读神经网络原理

神经网络 softmax函数

Softmax函数与交叉熵