【问题标题】:How to understand the loss function in scikit-learn logestic regression code?如何理解 scikit-learn 逻辑回归代码中的损失函数?
【发布时间】:2019-09-12 18:38:38
【问题描述】:

scikit-learn逻辑回归中损失函数的代码为:

# 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)

不过,它似乎不同于普通形式的对数损失函数,其内容如下:

-y(log(p)+(1-y)log(1-p))

(请看http://wiki.fast.ai/index.php/Log_Loss

谁能告诉我如何理解 scikit-learn 逻辑回归中损失函数的编码以及它与对数损失函数的一般形式之间的关系是什么?

提前谢谢你。

【问题讨论】:

    标签: python machine-learning scikit-learn loss-function


    【解决方案1】:

    首先您应该注意0.5 * alpha * np.dot(w, w) 只是一个规范化。因此,sklearn 逻辑回归简化为以下内容

    -np.sum(sample_weight * log_logistic(yz))

    另外,np.sum 是由于它考虑了多个样本,所以它再次简化为

    sample_weight * log_logistic(yz)

    最后,如果您阅读HERE,您会注意到 sample_weight 是分配给各个样本的可选权重数组。如果未提供,则为每个样品指定单位重量。因此,它应该等于 1(在交叉熵损失的原始定义中,我们不考虑不同样本的权重不等),因此损失减少为:

    - log_logistic(yz)

    相当于

    - log_logistic(y * np.dot(X, w)).

    现在,为什么它看起来与交叉熵损失函数不同(本质上是相同的),即。 e.:

    - [y log(p) + (1-y) log(1-p))].

    原因是,我们可以使用两种不同的标签约定中的任何一种来进行二进制分类,使用{0, 1}{-1, 1},这会导致两种不同的表示。但它们是一样的!

    更多细节(为什么它们是一样的)可以在HERE找到。请注意,您应该阅读 Manuel Morales 的回复。

    【讨论】:

    • 您好 Meysam Sadeghi,您的回答很有帮助。非常感谢。还有一个问题:scikit-learn 逻辑回归中的“sample_weight”和“class_weight”是什么关系?最美好的祝愿!
    • 我尽量简单解释一下:class_weights可以用来处理不同类中数据量不等的情况。假设您检测了 1000 名患者是否患有罕见癌症,其中 990 人健康,10 人患有癌症。那么如果你的模型总是告诉你每个人都很健康,那么它的准确率是 0.99%。但是,如果(例如)您对类别的权重与样本数量成反比(癌症病例为 1000/10 = 100,而 1000/990=1.01),您可以处理这个问题。
    • ... 继续... sample_weights 用于强调您更感兴趣/关心的样本的重要性。假设您有 100 个样本,但其中 10 个(它们所属的类别不重要,但样本本身很重要,所以让我们假设在二元分类问题中有 5 个正样本和 5 个负样本)来自您所在的比赛去参加比赛,其余的(其他 90 个)只是您从网络上找到的一些数据,并不那么重要。
    • ....继续...然后,您可以为这 10 个样本设置更高的 sample_weight,并确保在训练模型时正确强调它们。
    猜你喜欢
    • 2018-03-01
    • 2017-03-31
    • 2020-07-27
    • 2016-02-21
    • 2016-07-31
    • 2012-06-27
    • 2016-06-17
    • 2013-09-30
    • 2016-12-27
    相关资源
    最近更新 更多