如何绘制多 class 数据集的 ROC 曲线?
How to draw ROC curve for a multi-class dataset?
我有一个多 class 混淆矩阵,如下所示,我想为其 class 之一(例如 class 1)绘制相关的 ROC 曲线。我知道在这种情况下应该使用“one-VS-all others”理论,但我想知道我们究竟需要如何改变阈值才能获得不同对的 TP 和相应的 FP 率。enter image description here
SkLearn 有一个方便的实现来计算 tpr 和 fpr 以及另一个为您生成 auc 的函数。您可以通过遍历每个 class 单独处理每个 class(所有其他数据均为负数)来将其应用于您的数据。以下代码的灵感来自 the scikit-learn page on this topic itself.
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')
我有一个多 class 混淆矩阵,如下所示,我想为其 class 之一(例如 class 1)绘制相关的 ROC 曲线。我知道在这种情况下应该使用“one-VS-all others”理论,但我想知道我们究竟需要如何改变阈值才能获得不同对的 TP 和相应的 FP 率。enter image description here
SkLearn 有一个方便的实现来计算 tpr 和 fpr 以及另一个为您生成 auc 的函数。您可以通过遍历每个 class 单独处理每个 class(所有其他数据均为负数)来将其应用于您的数据。以下代码的灵感来自 the scikit-learn page on this topic itself.
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')