如何选择合适的二元分类阈值?

数据挖掘 机器学习 准确性 评估 二元分类
2022-03-11 14:06:25

我目前正在研究来自 Kaggle 的 Titanic 数据集。数据集不平衡,几乎 61.5% 的负类和 38.5% 的正类。

我将我的训练数据集分为 85% 的训练集和 15% 的验证集。我选择了一个支持向量分类器作为模型。我在训练集上做了 10-fold Stratified cross-validation,我试图找到最佳阈值来最大化每个折叠的 f1 分数。平均在验证折叠上获得的所有阈值,阈值的平均值为 35% +/- 10%。

之后,我在验证集上测试了模型,并估计了在验证集上最大化 F1 分数的阈值。验证集的阈值约为 63%,与交叉验证时得到的阈值相差甚远。

我在 Kaggle 的保持测试集上测试了模型,但我无法在两个阈值上都获得好分数(35% 来自训练集的交叉验证,63% 来自验证集。)

在此处输入图像描述

如何从可用数据集中确定可以很好地处理看不见的数据的最佳阈值?我是选择从交叉验证获得的阈值还是从验证集获得的阈值?还是我做错了?我将不胜感激有关此的任何帮助和建议。

对于这个数据集,我希望通过获得最高精度来最大化我在记分板上的分数。

谢谢你。

1个回答

简而言之,您应该对此做出判断:取决于您希望分类器拥有的精度(有兴趣最大限度地减少“误报/FP”)和召回率(有兴趣最大限度地减少“漏报/FN”)。

在不同阈值下查看精确召回值对的适当方法是精确召回曲线 (PRC)(特别是如果您想关注少数类)。通过PRC,您可以找到模型性能作为精度和召回率函数的最佳阈值。

我在下面复制一个伪代码段:

from sklearn.metrics import precision_recall_curve


model.fit(trainX, trainy)
preds = model.predict_proba(testX)

# calculate pr curve
precision, recall, thresholds = precision_recall_curve(labels, preds)

# convert to f score
fscore = (2 * precision * recall) / (precision + recall)
# locate the index of the largest f score
ix = argmax(fscore)
print('Best Threshold=%f, F-Score=%.3f' % (thresholds[ix], fscore[ix]))

代码酱

中华人民共和国看起来像这样: 中华人民共和国

您也可以采用 ROC 曲线的等效方法。