库 statsmodels 和 sklearn 产生不同的对数损失函数值。玩具示例:
import pandas as pd
import statsmodels.api as sm
from sklearn.metrics import log_loss
df = pd.DataFrame(
columns=['y','x1','x2'],
data=[
[1,3,5],
[1,-2,7],
[0,-1,-5],
[0,2,3],
[0,3,5],
])
logit = sm.Logit(df.y,df.drop(columns=['y']))
res = logit.fit()
res.llf
的结果是-1.386294361119906,而-log_loss(df.y,res.fittedvalues)
的结果是-6.907755278982137。它们不应该相等吗(由于不同的数值实现,差异很小)? statsmodels 文档 说 .llf
是模型的对数似然,正如this question 和 this Kaggle post 指出的那样,log_loss 只是对数似然的负数。
包装版本:
scikit-learn==1.0.1
,statsmodels==0.13.5
如您所见,
res.fittedvalues
返回一些负值。如果你想预测你的值,你应该使用 res.predict()
代替(0 到 1 之间的值)。log_loss(df.y,res.predict())
--> 0.27725887222398127
2。使用统计模型:
res.mle_retvals['fopt']
--> 0.27725887222398116
由于计算四舍五入,差异很小。