如何获取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.
相关产品推荐
相关产品推荐

