首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微观平均Roc Auc分数是否大于Roc级Auc分数?

微观平均Roc Auc分数是否大于Roc级Auc分数?
EN

Data Science用户
提问于 2021-02-09 21:33:59
回答 3查看 2.6K关注 0票数 6

我在处理一个不平衡的数据集。序列数据中有11567个阴性样本和3737个阳性样本。验证数据中有2892个阴性样本和935个阳性样本。这是一个二元分类问题,我用Macro平均ROC来评价我的模型。然而,我注意到微平均Roc分数高于特定等级的Roc分数.对我毫无意思。

正如你在图中所看到的,微平均的roc分数对所有的分数都比较高.如果可能的话,你能解释一下背后的原因吗?我使用该滑雪板连接并将其转换为二进制分类(y-true ->一个热门表示)。我还在下面添加了我的代码。

代码语言:javascript
复制
xgboost_model = XGBClassifier(n_estimators= 450,max_depth= 5,min_child_weight=2)
xgboost_model.fit(X_train,y_train)

yy_true,yy_pred = yy_val, xgboost_model.predict_proba(Xx_val)# .predict_proba gives probability for each class

# Compute ROC curve and ROC area for each class
y_test = flat(yy_true) # Convert labels to one hot encoded version
y_score = yy_pred

n_classes=2
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))

# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += interp(all_fpr, fpr[i], tpr[i])

# Finally average it and compute AUC
mean_tpr /= n_classes

fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

# Plot all ROC curves
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
         label='micro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["micro"]),
         color='deeppink', linestyle=':', linewidth=2)

plt.plot(fpr["macro"], tpr["macro"],
         label='macro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["macro"]),
         color='navy', linestyle=':', linewidth=2)

colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label='ROC curve of class {0} (area = {1:0.2f})'
             ''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve for nonSampling Training Data')
plt.legend(loc="lower right")
plt.savefig('nonsample.png', format='png', dpi=600)

plt.show()
EN

回答 3

Data Science用户

回答已采纳

发布于 2021-02-10 15:37:32

在二进制问题中,没有理由对ROC (或任何其他度量)进行平均。在多类分类的情况下,通常利用微观和宏观性能来获得基于个体二元分类度量的单个性能值。

所以这里发生的是:

  • 这两类的ROC曲线是彼此的镜子曲线(使用左上、右下角的对角线作为轴对称轴),因为它们代表完全相同的点,但正类和负类互换。
  • 宏观平均曲线是两条曲线的平均值,这没有多大意义,因为两者已经有相同的形状。这就是为什么宏、类0和类1的所有AUC值都是相同的原因。
  • 微观平均是加权平均,主要是多数阶级(约75%),因为多数阶级的多数分数被正确地预测为多数阶级,所以表现看起来要好得多。这与微平均F1评分与精度相当.有关,虽然在我国,我不确定这些点是如何精确加权的。

在我看来,这是一个很好的例子,为什么ROC曲线应该非常小心地(或根本不使用)在多类设置。ROC曲线是用于二进制(软)分类的,它们在这个上下文中是有用的和可解释的,但不一定在另一个上下文中。一般来说,它也说明了这并不是因为可以计算出结果值才有意义;)

票数 6
EN

Data Science用户

发布于 2021-02-22 03:55:25

这个例子的“微观平均中华民国”有点奇怪。这就像微观平均统计数据,每个样本和可能的标签都受到平等对待,但在大多数其他方面却不一样。它本质上把问题当作是多标签;随着阈值的降低,最初每一行都被归类为没有标签,然后选择越来越多的标签,直到最后每一行都被标记为拥有所有可能的标签。然后,所有可能的标签上都会出现真假阳性/阴性。

这可能是有用的,也可能是像中华民国,但我不认为这样的曲线应该有任何特殊的关系,个别类别的ROC曲线(当然不是一般意义上的平均值)。

票数 1
EN

Data Science用户

发布于 2022-06-05 15:43:38

微ROC的计算方法存在一个问题.我们将多个标签转换为多个二进制类分类。

在计算微观ROC时,我们将所有的二进制类分类结合在一起.微ROC曲线的值通常高于单类ROC曲线.

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/89180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档