什么是class_weight参数在scikit-learn SGD中的作用

时间:2015-03-19 07:24:09

标签: python-2.7 machine-learning scikit-learn

我经常使用scikit-learn,我想了解一些关于SGD“class_ weight”参数的见解。

我能够弄清楚函数调用

plain_sgd(coef, intercept, est.loss_function,
                 penalty_type, alpha, C, est.l1_ratio,
                 dataset, n_iter, int(est.fit_intercept),
                 int(est.verbose), int(est.shuffle), est.random_state,
                 pos_weight, neg_weight,
                 learning_rate_type, est.eta0,
                 est.power_t, est.t_, intercept_decay)

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/stochastic_gradient.py

在此之后它转到sgd_fast并且我对cpython不是很好。你能否对这些问题表现出一些敏锐的态度。

  1. 我有一个偏向开发组的课程,其中正面课程为15k,负面课程为36k。 class_weight会解决此问题吗?或者进行欠采样将是一个更好的主意。我的数字越来越好,但很难解释。
  2. 如果是,那么它实际上是如何做到的。我的意思是它应用于特征惩罚还是对优化函数的权重。我怎么能向外行解释这个?

1 个答案:

答案 0 :(得分:6)

class_weight确实有助于提高受不平衡数据训练的分类模型的ROC AUC或f1分数。

您可以尝试class_weight="auto"选择与班级频率成反比的权重。你也可以尝试传递你自己的权重有一个python字典,类标签为键,权重为值。

通过交叉验证的网格搜索可以调整权重。

在内部,这是通过从sample_weight派生class_weight来完成的(取决于每个样本的类标签)。然后使用样本权重来缩放单个样本对用于训练具有随机梯度下降的线性分类模型的损失函数的贡献。

功能惩罚是通过penaltyalpha超参数独立控制的。 sample_weight / class_weight对此没有任何影响。