相关疑难解决方法(0)

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

我很难理解class_weightscikit-learn的Logistic回归中的参数是如何运作的.

情况

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

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

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

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

结果如预期的那样:召回率为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
Run Code Online (Sandbox Code Playgroud)

我也包括Noneauto.

这次结果完全被摧毁了.对于class_weight除了的每个值,我的所有召回都很小(<0.05)auto.所以我只能假设我对如何设置class_weight字典的理解是错误的.有趣的是,class_weight网格搜索中'auto' 的值对于所有值都是59%左右C,我猜它平衡为1:1?

我的问题

1)如何正确使用class_weight来实现训练数据的不同平衡,从实际给出的数据?具体来说,我传给什么词典class_weight使用n:m比例的负面:正面训练样本?

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

3)就比例而言auto,class_weight做什么的价值是多少?我阅读了文档,我假设"平衡数据与它们的频率成反比"只是意味着它以1:1的比例.它是否正确?如果没有,有人可以澄清吗?

非常感谢,任何澄清将不胜感激!

python scikit-learn

101
推荐指数
2
解决办法
7万
查看次数

sklearn GridSearchCV在分数函数中不使用sample_weight

我有每个样本不同权重的数据.在我的应用中,重要的是在估计模型和比较替代模型时考虑这些权重.

sklearn用来估计模型并比较替代的超参数选择.但是这个单元测试显示GridSearchCV不适sample_weights用于估计分数.

有没有办法有sklearn使用sample_weight得分模式?

单元测试:

from __future__ import division

import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import log_loss
from sklearn.model_selection import GridSearchCV, RepeatedKFold


def grid_cv(X_in, y_in, w_in, cv, max_features_grid, use_weighting):
  out_results = dict()

  for k in max_features_grid:
    clf = RandomForestClassifier(n_estimators=256,
                                 criterion="entropy",
                                 warm_start=False,
                                 n_jobs=-1,
                                 random_state=RANDOM_STATE,
                                 max_features=k)
    for train_ndx, test_ndx in cv.split(X=X_in, y=y_in):
      X_train = X_in[train_ndx, :]
      y_train = y_in[train_ndx]
      w_train = w_in[train_ndx]
      y_test = y[test_ndx] …
Run Code Online (Sandbox Code Playgroud)

python machine-learning scikit-learn

7
推荐指数
1
解决办法
1477
查看次数

标签 统计

python ×2

scikit-learn ×2

machine-learning ×1