我正在研究一个二元分类问题,其中没有误报更为重要;相当多的假阴性是可以的。例如,我在 sklearn 中使用了一堆分类器,但我认为它们都没有能力显式调整精确召回权衡(它们确实产生了很好的结果,但不可调整)。
哪些分类器具有可调节的精度/召回率?有什么方法可以影响标准分类器的精度/召回率权衡,例如随机森林或 AdaBoost?
我正在研究一个二元分类问题,其中没有误报更为重要;相当多的假阴性是可以的。例如,我在 sklearn 中使用了一堆分类器,但我认为它们都没有能力显式调整精确召回权衡(它们确实产生了很好的结果,但不可调整)。
哪些分类器具有可调节的精度/召回率?有什么方法可以影响标准分类器的精度/召回率权衡,例如随机森林或 AdaBoost?
几乎所有 scikit-learn 的分类器都可以给出决策值(通过decision_function
或predict_proba
)。
根据决策值,可以直接计算精确召回和/或 ROC 曲线。scikit-learn 在其metrics子模块中提供了这些功能。
一个最小的例子,假设你有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()
在遇到这个问题之前,我刚刚为自己解决了这个问题,所以我决定分享我的解决方案。
它使用与 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])
这就是你如何使用新学习的最小阈值来调整你的预测(否则你只会调用 predict(X_test))
y_pred_adjusted=[1 if y_s>min_thrshld else 0 for y_s in y_score]
很高兴听到您对此调整配方的反馈。
这是功能
产生类别概率。然后使用各种指标来调整阈值 P,您可以按照伪代码在决策中使用它
如果 p(y)>P,则 y=1 否则 y=0 endif