如何在 python scikit-learn 中优化精确召回曲线而不是 AUC-ROC 曲线?

Posted

技术标签:

【中文标题】如何在 python scikit-learn 中优化精确召回曲线而不是 AUC-ROC 曲线?【英文标题】:How to optimize precision-recall curve instead of AUC-ROC curve in python scikit-learn? 【发布时间】:2016-06-11 21:44:45 【问题描述】:

按照我之前的帖子 - Good ROC curve but poor precision-recall curve 的建议,我提出了一个后续问题。我只使用 Python scikit-learn 的默认设置。似乎优化是在 AUC-ROC 上,但我对优化精确召回更感兴趣。以下是我的代码。

# Get ROC 
y_score = classifierUsed2.decision_function(X_test)
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(false_positive_rate, true_positive_rate)
print 'AUC-'+ethnicity_tar+'=',roc_auc
# Plotting
ax1.plot(false_positive_rate, true_positive_rate, c=color, label=('AUC-'+ethnicity_tar+'= %0.2f'%roc_auc))
ax1.plot([0,1],[0,1], color='lightgrey', linestyle='--')
ax1.legend(loc='lower right', prop='size':8)

# Get P-R pairs
precision, recall, prThreshold = precision_recall_curve(y_test, y_score)
# Plotting
ax2.plot(recall, precision, c=color, label=ethnicity_tar)
ax2.legend(loc='upper right', prop='size':8)

在哪里以及如何插入 python 代码来更改设置,以便优化精确召回?

【问题讨论】:

【参考方案1】:

其实你的问题有两个:

    如何评估单个数字中的精确召回曲线有多好? 如何建立一个模型来最大化这个数字?

我会依次回答:

1.精确召回曲线质量的衡量标准是average precision。此平均精度等于未插值(即分段常数)精度召回曲线下的确切面积。

2。为了最大限度地提高平均精度,您只能调整算法的超参数。如果你设置了scoring='average_precision',你可以用GridSearchCV来做。或者您可以手动或使用其他一些调整技术找到最佳超参数。

这通常不可能直接优化平均精度(在模型拟合期间),但也有一些例外。例如。 this article 描述了一个最大化平均精度的 SVM。

【讨论】:

以上是关于如何在 python scikit-learn 中优化精确召回曲线而不是 AUC-ROC 曲线?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 虚拟环境中导入 scikit-learn?

如何在 Python 中使用带有 Keras 的 scikit-learn 评估指标函数?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?

如何在 python scikit-learn 中更改精度和召回的阈值?

如何在 python Scikit-learn 中获得凝聚聚类“质心”