Scikit-learn average_precision_score() 与 precision_recall_curve() 的 auc 分数

数据挖掘 Python scikit-学习 评估
2021-10-04 21:54:19

我一直在寻找对此的解释,但还没有遇到过 - 在 scikit-learn 中,当我计算 的auc()precision_recall_curve(),我得到的宏观指标与使用内置average_precision_score()函数时不同。根据文档,这是有道理的,因为auc()使用了梯形近似,因此平均精度更准确。但是,当我计算微观指标时,这些值是相同的。我试图理解这一点。

这是一个例子:

yhat_raw = np.array([[0.511, 0.62, 0.3],[0.11, 0.76, 0.945],[0.002, 0.671, 0.452],[0.9102, 0.783, 0.2]])
y = np.array([[0, 1, 1],[0, 0, 1],[0, 0, 0],[0, 1, 1]])
yhatmic = yhat_raw.ravel()
ymic = y.ravel()
prec["micro"], rec["micro"], _ = precision_recall_curve(ymic, yhatmic, 
pos_label=1)

auc(rec["micro"], prec["micro"]) 返回0.58305555555555544average_precision_score(ymic, yhatmic)返回0.62222222222222223

在实际部署模型时,这些指标是相同的。我认为这是有道理的,考虑到在更大的范围内(例如,沿着数千个数据点的维度而不是len(rec['micro']) = 11本例中的数据点),梯形近似值更接近真实值。

我的问题是,为什么这些指标在macro案例中会有所不同?公平地说,在现实世界的部署中,微观评估有足够的数据点让梯形近似收敛到真实值,但宏观没有(通过约 3000 个测试示例计算,标签空间为约 2000 个标签)?

1个回答

在这种情况下,指标有所不同,macro因为macro在 scikit-learn 中忽略了类不平衡micro在 scikit-learn 中查看全球汇率。数据具有类别不平衡,因此与macro相比,参数将返回不同的值micro