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

基尔格罗鳟鱼

我很难理解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。这样对吗?如果没有,有人可以澄清吗?

安德烈亚斯·穆勒(Andreas Mueller)

首先,仅靠召回可能并不好。通过将所有内容都归为肯定类,您可以简单地实现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",它更容易理解:从本质上讲,它意味着复制较小的类,直到您拥有与较大的类一样多的样本为止,但是是以隐式的方式进行的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

scikit-learn中的成本敏感分析

来自分类Dev

如何在scikit-learn中对管道中的转换参数进行网格搜索

来自分类Dev

scikit-learn中LogisticRegression的GridSearchCV

来自分类Dev

scikit-learn 0.15上带有class_weight = auto的SGDClassifier失败,但不是0.14

来自分类Dev

.arff文件与scikit-learn?

来自分类Dev

Scikit-Learn KDE中的PDF估计

来自分类Dev

Scikit-Learn中的分类数据转换

来自分类Dev

scikit中的RBM预测

来自分类Dev

Python scikit-learn-TypeError

来自分类Dev

删除scikit Learn中的特定功能

来自分类Dev

在Scikit Learn中控制Logistic回归的阈值

来自分类Dev

在scikit-learn中运行Randomforest的MemoryError

来自分类Dev

scikit-learn中的“ verbose”参数

来自分类Dev

scikit-learn:随机森林的class_weight和sample_weight参数

来自分类Dev

scikit-learn中SGDClassifier的正则化参数和迭代

来自分类Dev

Scikit Learn中的交叉验证

来自分类Dev

如何使用Scikit Learn在Random Forest中调整参数?

来自分类Dev

了解Scikit Learn中的Birch集群设置

来自分类Dev

安装的scikit-learn无法正常工作

来自分类Dev

scikit-learn StratifiedKFold实现

来自分类Dev

如何打印scikit Learn计划的作业数量?

来自分类Dev

scikit的交叉验证如何工作?

来自分类Dev

Scikit Learn中的距离指标

来自分类Dev

如何从github安装scikit-learn

来自分类Dev

什么是 scikit-learn TSNE 中的 random_state 参数?

来自分类Dev

输出 Scikit Learn OLS 报告

来自分类Dev

如何使用 scikit learn 预测目标标签

来自分类Dev

scikit-learn:最近的邻居

来自分类Dev

Scikit-learn 导入约定

Related 相关文章

热门标签

归档