You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取statsmodels中OrderedModel在验证/测试集的对数似然?

关于statsmodels中OrderedModel新数据对数似然的计算方法

核心结论

statsmodels的OrderedModel没有直接公开的predict_loglike类函数,但可以通过调用模型的私用方法或手动计算实现,以下是具体方案:

方法1:调用模型的私用对数似然方法

OrderedModel拟合后,实例包含一个私用方法_ll_obs,可计算单个样本的对数似然,批量计算只需传入新数据的设计矩阵和真实标签:

import statsmodels.api as sm
from statsmodels.miscmodels.ordinal_model import OrderedModel
import numpy as np

# 假设已拟合好模型model,新数据为X_new, y_new
# 确保新数据的设计矩阵与拟合时一致(比如是否添加截距)
X_new = sm.add_constant(X_new)

# 先获取新数据的类别概率矩阵
prob_matrix = model.predict(X_new, which='prob')
# 计算每个样本的对数似然,再求和得到整体对数似然
loglike_obs = model._ll_obs(y_new, prob_matrix)
total_loglike = loglike_obs.sum()
  • model.predict(X_new, which='prob')返回每个样本属于各有序类别的概率矩阵,这是_ll_obs的必需输入。
  • _ll_obs是模型内部拟合时使用的方法,虽未公开文档,但逻辑稳定,适合批量计算场景。

方法2:手动实现对数似然计算

Ordered Model的对数似然基于累积概率推导,单个样本的对数似然公式为:

若样本真实类别为k,则对数似然 = ln(P(y ≤ k) - P(y ≤ k-1)),其中P(y ≤ k)为累积概率

手动计算示例:

# 获取新数据的累积概率矩阵
cum_probs = model.predict(X_new, which='cumulative')

loglike_list = []
for i, y in enumerate(y_new):
    # 处理边界类别:最小类别k=0时,P(y≤-1)=0;最大类别时,P(y≤k)=1
    if y == 0:
        prob = cum_probs[i, y]
    elif y == model.endog.max():
        prob = 1 - cum_probs[i, y-1]
    else:
        prob = cum_probs[i, y] - cum_probs[i, y-1]
    loglike_list.append(np.log(prob))

total_loglike = sum(loglike_list)
  • 该方法逻辑透明,适合需要自定义边界处理或调试的场景,计算结果与_ll_obs完全一致。

注意事项

  • 新数据的特征预处理、截距项设置必须与拟合模型时完全一致,否则会导致结果偏差。
  • 若新数据的类别范围超出拟合时的类别集合,需额外补充边界逻辑处理。

内容的提问来源于stack exchange,提问作者Igor F.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:30:39