Python 二元分类、精度召回曲线和阈值

Python 二元分类、精度召回曲线和阈值,python,machine-learning,scikit-learn,precision-recall,Python,Machine Learning,Scikit Learn,Precision Recall,我正在用python编写代码。 在我的工作中,我有一个特定的参数,其中有多个可能的值,以及一些数据X,以及相关的二进制目标值y 对于每个参数的值,我使用scickit learn onX和y运行一些分类算法(例如:Naive Bayes)。 在这一步中,我们使用交叉验证,对数据集进行80:20的序列测试,并将结果平均化 这将为每个参数值生成一个分数(精确召回曲线下的区域),我们选择分数最高的一个作为该分类器的首选参数值。 然后,我们希望使用所有数据来训练算法,而不仅仅是80%的数据,获得一些决策

我正在用python编写代码。 在我的工作中,我有一个特定的参数,其中有多个可能的值,以及一些数据
X
,以及相关的二进制目标值
y

对于每个参数的值,我使用scickit learn on
X
y
运行一些分类算法(例如:Naive Bayes)。 在这一步中,我们使用交叉验证,对数据集进行80:20的序列测试,并将结果平均化

这将为每个参数值生成一个分数(精确召回曲线下的区域),我们选择分数最高的一个作为该分类器的首选参数值。 然后,我们希望使用所有数据来训练算法,而不仅仅是80%的数据,获得一些决策函数,我们将使用这些函数进行预测


这些决策函数返回概率或数值,表明算法“有多确定”某个样本是否属于某个类;他们不能正确地预测样本的类别。 这是通过阈值
t
完成的:数值小于
t
的样本被指定为类别0,其余样本被指定为类别1

当我们有了真正的标签时,这些预测可以对照真正的标签进行测试,以对预测进行评估(如精确度和召回率)。 改变
t
的值正是在精确回忆空间中生成多个点的原因,使我们能够为给定模型绘制曲线(从而计算曲线下的面积)。 我们在交叉验证中对每一个折叠都这样做


现在,我们有一些数据
Z
,可以应用
f
,但我们没有标签。 我们如何为我们的模型选择合适的
t

更具体地,考虑交叉验证过程中生成的模型(对于相同的首选参数值)。 每个这样的模型都有一个相应的决策函数,因此有一个相应的精度召回曲线和相关的阈值

给定其中一条曲线中的点
p_0
,以及相应的阈值
t_0
值,是否可以合理地假设其他曲线中靠近
p_0
的点将具有接近
t_0
的相关阈值? 换句话说,如果我们使用交叉验证期间获得的阈值平均值作为阈值,那么期望我们的模型(使用所有数据训练)的行为与我们在交叉验证中得到的模型类似是否合理


您可以假设交叉验证中获得的模型平均值与每个交叉验证模型本身之间的差异很小。 例如,对于前面提到的朴素贝叶斯分类器,我们有


因此,不同的褶皱会产生非常紧密的曲线。

我投票结束这个问题,因为这个问题属于打开状态。如果你的ROC曲线是这样绘制的,一种方法是选择与(0,1)最接近的点对应的阈值。另一个选项是拾取最大化KS stat的点(曲线和直线y=x之间的最大差值)。这真的取决于你的最终目标,你会得到更好的答案。我会把这个交叉贴到数据科学上,谢谢。