【发布时间】:2021-12-06 22:23:02
【问题描述】:
我有一个如下所示的多类混淆矩阵,并想为其中一个类(例如 1 类)绘制相关的 ROC 曲线。我知道在这种情况下应该使用“one-VS-all others”理论,但我想知道我们需要如何更改阈值才能获得不同对的 TP 和相应的 FP 率。enter image description here
【问题讨论】:
标签: machine-learning roc multiclass-classification
我有一个如下所示的多类混淆矩阵,并想为其中一个类(例如 1 类)绘制相关的 ROC 曲线。我知道在这种情况下应该使用“one-VS-all others”理论,但我想知道我们需要如何更改阈值才能获得不同对的 TP 和相应的 FP 率。enter image description here
【问题讨论】:
标签: machine-learning roc multiclass-classification
Sklearn具有方便的实现,计算TPR和FPR以及为您提供AUC的另一个功能。您可以通过通过每个类循环将每个类(所有其他数据为负)对您的数据应用于您的数据。下面的代码由@ 987654321启发。
import numpy as np
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
#generating synthetic data
N_classes = 3
N_per_class=100
labels = np.concatenate([[i]*N_per_class for i in range(N_classes)])
preds = np.stack([np.random.uniform(0,1,N_per_class*N_classes) for _ in range(N_classes)]).T
preds /= preds.sum(1,keepdims=True) #approximate softmax
tpr,fpr,roc_auc = ([[]]*N_classes for _ in range(3))
f,ax = plt.subplots()
#generate ROC data
for i in range(N_classes):
fpr[i], tpr[i], _ = roc_curve(labels==i, preds[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
ax.plot(fpr[i],tpr[i])
plt.legend(['Class {:d}'.format(d) for d in range(N_classes)])
plt.xlabel('FPR')
plt.ylabel('TPR')
【讨论】: