gpt4 book ai didi

python - scikit-learn 中的 class_weight 参数是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 21:10:14 24 4
gpt4 key购买 nike

我在理解 scikit-learn 的逻辑回归中的 class_weight 参数如何运作时遇到了很多麻烦。

情况

我想使用逻辑回归对非常不平衡的数据集进行二元分类。类别标记为 0(阴性)和 1(阳性),观察数据的比例约为 19:1,大多数样本的结果为阴性。

第一次尝试:手动准备训练数据

我将拥有的数据拆分为不相交的数据集以进行训练和测试(大约 80/20)。然后我手动对训练数据进行随机抽样,得到不同比例的训练数据,而不是 19:1;从 2:1 -> 16:1。

然后,我对这些不同的训练数据子集进行逻辑回归训练,并将召回率 (= TP/(TP+FN)) 绘制为不同训练比例的函数。当然,召回是在不相交的 TEST 样本上计算的,这些样本的观察比例为 19:1。请注意,虽然我在不同的训练数据上训练了不同的模型,但我在相同(不相交的)测试数据上计算了所有模型的召回率。

结果与预期一致:在 2:1 的训练比例下,召回率约为 60%,并且在达到 16:1 时下降得相当快。有几个比例为 2:1 -> 6:1,召回率远高于 5%。

第二次尝试:网格搜索

接下来,我想测试不同的正则化参数,因此我使用了 GridSearchCV 并制作了一个由 C 参数和 class_weight 参数的多个值组成的网格。要将我的 n:m 比例的负:正训练样本翻译成 class_weight 的字典语言,我认为我只是指定了几个字典,如下所示:

{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 } #expected 4:1

我还包括了 Noneauto

这一次的结果完全出乎意料。除了 auto 之外,对于 class_weight 的每个值,我所有的记忆都很少(< 0.05)。所以我只能假设我对如何设置 class_weight 字典的理解是错误的。有趣的是,对于 C 的所有值,网格搜索中 'auto' 的 class_weight 值约为 59%,我猜它平衡到 1:1?

我的问题

  1. 您如何正确使用 class_weight 来实现训练数据与实际提供的数据不同的平衡?具体来说,我应该将什么字典传递给 class_weight 以使用 n:m 比例的负:正训练样本?

  2. 如果您将各种 class_weight 字典传递给 GridSearchCV,在交叉验证期间,它将根据字典重新平衡训练折叠数据,但使用真实给定的样本比例来计算我的评分函数测试折叠?这一点很关键,因为任何指标只有在来自观察到的比例数据时才对我有用。

  3. 就比例而言,class_weightauto 值有什么作用?我阅读了文档,我假设“平衡数据与它们的频率成反比”只是意味着它是 1:1。这个对吗?如果不是,有人可以澄清一下吗?

最佳答案

首先,仅凭记忆可能不太好。您可以通过将所有内容归类为正类来简单地实现 100% 的召回率。我通常建议使用 AUC 来选择参数,然后找到您感兴趣的操作点(比如给定的精度水平)的阈值。

关于 class_weight 的工作原理:它用 class_weight[i] 而不是 1 来惩罚 class[i] 样本中的错误。所以更高class-weight 意味着你想更加强调一个类。从您所说的看来,0 类的频率似乎是 1 类的 19 倍。因此,您应该相对于 0 类增加 1 类的 class_weight,例如 {0:.1, 1:.9} .如果class_weight总和不为1,则基本上会改变正则化参数。

class_weight="auto" 的工作原理,你可以看看this discussion .在开发版本中,您可以使用 class_weight="balanced",这更容易理解:它基本上意味着复制较小的类,直到您拥有与较大类中一样多的样本,但以隐式方式.

关于python - scikit-learn 中的 class_weight 参数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30972029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com