【问题标题】:how to get the log likelihood for a logistic regression model in sklearn?如何在sklearn中获得逻辑回归模型的对数似然?
【发布时间】:2018-06-19 11:39:27
【问题描述】:

我在 sklearn 中使用逻辑回归模型,我有兴趣检索此类模型的对数似然性,因此按照建议 here 执行普通似然比测试。

模型使用log loss 作为评分规则。在文档中,对数损失被定义为“在给定概率分类器预测的情况下,真实标签的负对数似然”。但是,该值始终为正,而对数似然应该为负。举个例子:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss

lr = LogisticRegression()
lr.fit(X_train, y_train)
y_prob = lr.predict_proba(X_test)
log_loss(y_test, y_prob)    # 0.66738

我在模型的文档中没有看到任何方法,是否还有其他我目前不知道的可能性?

【问题讨论】:

    标签: math machine-learning scikit-learn logistic-regression log-likelihood


    【解决方案1】:

    仔细阅读;对数损失是对数似然。由于对数似然确实如您所说的那样为负数,因此它的负数将是一个正数。

    让我们看一个带有虚拟数据的示例:

    from sklearn.metrics import log_loss
    import numpy as np
    
    y_true = np.array([0, 1, 1])
    y_pred = np.array([0.1, 0.2, 0.9])
    
    log_loss(y_true, y_pred)
    # 0.60671964791658428
    

    现在,让我们手动计算对数似然元素(即每个标签预测对一个值),使用您链接到的不带减号的 scikit-learn 文档中给出的公式:

    log_likelihood_elements = y_true*np.log(y_pred) + (1-y_true)*np.log(1-y_pred)
    log_likelihood_elements
    # array([-0.10536052, -1.60943791, -0.10536052])
    

    现在,给定对数似然元素(实际上是负数),对数损失是它们总和的负数除以样本数:

    -np.sum(log_likelihood_elements)/len(y_true)
    # 0.60671964791658428
    
    log_loss(y_true, y_pred) == -np.sum(log_likelihood_elements)/len(y_true)
    # True
    

    【讨论】:

    • 非常感谢!我今天很傻。这意味着,使用对数损失时,越低越好。或者我可能会更改符号并将其视为对数可能性 - 对吗?
    • @MattiaPaterna 每个被描述为“损失”的数量,都意味着“越低越好”
    【解决方案2】:

    要获得对数似然,您可以计算:

    -log_loss(y_true, y_pred)*len(y_true)
    

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 2019-06-05
      • 2018-11-29
      • 2018-05-05
      • 2018-04-13
      • 2018-05-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多