精度可调的分类器与召回率


11

我正在研究二进制分类问题,在这个问题上更重要的是不要出现误报。相当多的假阴性是可以的。例如,我在sklearn中使用了一堆分类器,但我认为它们都不具有显式调整精确度调用权衡的能力(它们确实产生了很好的结果,但无法调整)。

哪些分类器的精度/召回率可调?有什么方法可以影响标准分类器(例如,Random Forest或AdaBoost)的精度/召回权衡吗?

Answers:


12

几乎所有scikit-learn的分类器都可以给出决策值(通过decision_functionpredict_proba)。

根据决策值,可以直接计算精确调用和/或ROC曲线。scikit-learn在其指标子模块中提供了这些功能。

一个最小的示例,假设您拥有data并且labels具有适当的内容:

import sklearn.svm
import sklearn.metrics
from matplotlib import pyplot as plt

clf = sklearn.svm.LinearSVC().fit(data, labels)
decision_values = clf.decision_function(data)

precision, recall, thresholds = sklearn.metrics.precision_recall_curve(labels, decision_values)

plt.plot(recall, precision)
plt.show()

完美,谢谢!不知道我怎么想念它的:)
亚历克斯一世

看起来像precision_recall_curve计算整个F1。如何只计算负数?
秘银

6

在遇到这个问题之前,我已经为自己解决了这个问题,所以我决定分享我的解决方案。

它使用的方法与Marc Claesen提出的方法相同,但回答了有关如何调整分类器以在查全召回率的精度轴上更高的实际问题。

X_test是数据,y_test是真实标签。分类器应已安装。

y_score = clf.decision_function(X_test)

prcsn,rcl,thrshld=precision_recall_curve(y_test,y_score)

min_prcsn=0.25 # here is your precision lower bound e.g. 25%
min_thrshld=min([thrshld[i] for i in range(len(thrshld)) if prcsn[i]>min_prcsn])

这就是您使用新学习的最小阈值来调整预测的方法(否则,您将只需要调用预报(X_test))

y_pred_adjusted=[1 if y_s>min_thrshld else 0 for y_s in y_score]

很高兴听到您对此调整配方的反馈。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.