当前位置: 首页 > 面试题库 >

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

周意智
2023-03-14
问题内容

我很难理解class_weightscikit-learn的Logistic回归中的参数如何运行。

情况

我想使用逻辑回归对非常不平衡的数据集进行二进制分类。这些类别分别标记为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

这次的结果是完全错误的。我所有的回忆了每一个值出来的小(<0.05);class_weightauto。因此,我只能假设我对如何设置class_weight字典的理解是错误的。有趣的是,class_weight对于的所有值,网格搜索中“自动”的值约为59%C,我猜想它与1:1平衡吗?

我的问题

  1. 您如何正确使用class_weight训练数据和实际提供的数据取得不同的平衡?具体来说,我传递给哪个字典class_weight来使用n:m比例的阴:阳训练样本?

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

  3. 就比例而言,auto价值是class_weight什么?我阅读了文档,并假设“使数据与频率成反比地平衡”仅表示将其设为1:1。这个对吗?如果没有,有人可以澄清吗?


问题答案:

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

对于如何class_weight作品:它惩罚失误的样品class[i]class_weight[i]的,而不是1。所以高类的重量意味着要更多地强调的一类。从您看来,类0的发生频率是类1的19倍。因此,您应该class_weight相对于类0增加类1的频率,例如{0:.1,1:.9}。如果class_weight不等于1,则基本上会更改正则化参数。

对于如何class_weight="auto"工作,您可以看一下这个讨论。在开发版本中,您可以使用class_weight="balanced",它更容易理解:从本质上讲,它意味着复制较小的类,直到您拥有与较大的类一样多的样本为止,但是是以隐式的方式进行的。



 类似资料:
  • 问题内容: 我正在使用具有9个样本和大约7000个属性的随机森林模型。在这些样本中,我的分类器可以识别3个类别。 我知道这远非理想条件,但我正在尝试找出哪些属性在特征预测中最重要。哪些参数最适合优化功能重要性? 我尝试了不同的方法,发现“重要特征”(即数组中的非零值)的数量急剧增加。 我已经阅读了文档,但是如果有任何经验,我想知道最适合调整哪些参数,并简要说明原因。 问题答案: 根据我的经验,sk

  • scikit-learn 是一个 Python 的机器学习项目。是一个简单高效的数据挖掘和数据分析工具。基于 NumPy、SciPy 和 matplotlib 构建。 Installation 依赖 scikit-learn 要求: Python (>= 2.7 or >= 3.3) NumPy (>= 1.8.2) SciPy (>= 0.13.3) 运行示例需要 Matplotlib >= 1

  • 问题内容: 我有以下代码,使用Keras Scikit-Learn Wrapper ,可以正常工作: 该 可下载 这里 。 现在,我要做的是通过以下方式将值传递给函数的参数 使用如下功能: 但是它无法给出此错误: 什么是正确的方法? 问题答案: 您可以向构造函数添加关键字参数:

  • Introduction to Machine Learning with scikit-learn This video series will teach you how to solve Machine Learning problems using Python's popular scikit-learn library. There are 10 video tutorials tot

  • 本文向大家介绍如何使用Python中的scikit-learn库缩放数据?,包括了如何使用Python中的scikit-learn库缩放数据?的使用技巧和注意事项,需要的朋友参考一下 特征缩放是构建机器学习算法的数据预处理阶段的重要步骤。它有助于规范化数据以使其落在特定范围内。 有时,它还有助于提高机器执行计算的速度。 为什么需要它? 作为输入馈入学习算法的数据应保持一致和结构化。输入数据的所有特

  • 你可以使用 Keras 的 Sequential 模型(仅限单一输入)作为 Scikit-Learn 工作流程的一部分,通过在此找到的包装器: keras.wrappers.scikit_learn.py。 有两个封装器可用: keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params), 这实现了Scikit-Le