class_weights 如何应用于 sklearn 逻辑回归?

Posted

技术标签:

【中文标题】class_weights 如何应用于 sklearn 逻辑回归?【英文标题】:How are class_weights being applied in sklearn logistic regression? 【发布时间】:2018-10-30 04:22:51 【问题描述】:

我对 sklearn 如何应用我们提供的类权重感兴趣。 documentation 没有明确说明类权重的应用位置和方式。阅读源代码也没有帮助(似乎 sklearn.svm.liblinear 用于优化,我无法阅读源代码,因为它是一个 .pyd 文件......)

但我猜它适用于成本函数:当指定类权重时,各个类的成本将乘以类权重。例如,如果我分别有 0 类(权重=0.5)和 1 类(权重=1)的 2 个观察值,那么成本函数将是:

成本 = 0.5*log(...X_0,y_0...) + 1*log(...X_1,y_1...) + 惩罚

有谁知道这是否正确?

【问题讨论】:

【参考方案1】:

查看the following lines in the source code:

le = LabelEncoder()
if isinstance(class_weight, dict) or multi_class == 'multinomial':
    class_weight_ = compute_class_weight(class_weight, classes, y)
    sample_weight *= class_weight_[le.fit_transform(y)]

Here is the source code for the compute_class_weight() function:

...
else:
    # user-defined dictionary
    weight = np.ones(classes.shape[0], dtype=np.float64, order='C')
    if not isinstance(class_weight, dict):
        raise ValueError("class_weight must be dict, 'balanced', or None,"
                         " got: %r" % class_weight)
    for c in class_weight:
        i = np.searchsorted(classes, c)
        if i >= len(classes) or classes[i] != c:
            raise ValueError("Class label  not present.".format(c))
        else:
            weight[i] = class_weight[c]
...

在上面的sn-p中,class_weight被应用到sample_weight,在_logistic_loss_and_grad、_logistic_loss等一些内部函数中使用:

# Logistic loss is the negative of the log of the logistic function.
out = -np.sum(sample_weight * log_logistic(yz)) + .5 * alpha * np.dot(w, w)
# NOTE: --->  ^^^^^^^^^^^^^^^

【讨论】:

以上是关于class_weights 如何应用于 sklearn 逻辑回归?的主要内容,如果未能解决你的问题,请参考以下文章

ScikitLearn 随机森林中的欠采样与 class_weight

如何在 sklearn 0.14 版中设置“class_weight”?

sample_weight 与 scikit-learn 中的 class_weight 相比如何?

class_weight 在 linearSVC 和 LogisticRegression 的损失函数中的作用

在随机森林中传递 Class_weight 参数时出错

在 sklearn RandomForestClassifier 中,class_weight=None 是不是等同于 class_weight="balanced_subsample&qu