Mat*_*rna 3 math machine-learning scikit-learn logistic-regression log-likelihood
我在 sklearn 中使用逻辑回归模型,我有兴趣检索此类模型的对数似然,因此按照此处的建议执行普通似然比测试。
该模型使用对数损失作为评分规则。在文档中,对数损失被定义为“给定概率分类器预测的真实标签的负对数似然”。但是,该值始终为正,而对数似然应为负。举个例子:
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
Run Code Online (Sandbox Code Playgroud)
我在模型文档中没有看到任何方法,是否还有其他我目前不知道的可能性?
仔细阅读;对数损失是负对数似然。由于对数似然确实如您所说的为负,因此其负数将为正数。
让我们看一个带有虚拟数据的例子:
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
Run Code Online (Sandbox Code Playgroud)
现在,让我们使用您链接到的 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])
Run Code Online (Sandbox Code Playgroud)
现在,给定对数似然元素(确实为负),对数损失是它们总和的负数除以样本数:
-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
Run Code Online (Sandbox Code Playgroud)