有序Logistic回归(Ordered logit regression)的预测原理及基于模型系数手动实现Python预测的技术问询
有序Logistic回归(Ordered logit regression)的预测原理及基于模型系数手动实现Python预测的技术问询
嘿,我来帮你拆解有序Logistic回归的预测逻辑,还有怎么用模型输出的系数手动实现Python预测~
一、有序Logit回归的预测数学原理
有序Logistic回归是基于累积概率来建模的,核心逻辑如下:
- 假设存在一个无法观测的潜在连续变量 ( y^* ),它和自变量的关系是:
[
y^* = X\beta + \varepsilon
]
其中 ( X ) 是自变量矩阵,( \beta ) 是自变量的系数,( \varepsilon ) 服从标准Logistic分布(即Sigmoid函数的逆分布)。 - 我们观测到的分类变量 ( y )(比如你的
rating),是通过潜在变量 ( y^* ) 和一系列阈值 ( \alpha_1 < \alpha_2 < ... < \alpha_{k-1} ) 划分得到的(( k ) 是类别总数):- 当 ( y^* \leq \alpha_1 ) 时,( y=1 )
- 当 ( \alpha_1 < y^* \leq \alpha_2 ) 时,( y=2 )
- ...
- 当 ( \alpha_{k-1} < y^* ) 时,( y=k )
- 累积概率(即 ( y ) 小于等于某个类别 ( j ) 的概率)可以用Logistic函数计算:
[
P(y \leq j) = P(y^* \leq \alpha_j) = \frac{1}{1 + e^{\alpha_j - X\beta}}
] - 每个具体类别的概率,是相邻累积概率的差值:
[
P(y = j) = P(y \leq j) - P(y \leq j-1)
]
其中规定 ( P(y \leq 0) = 0 ),( P(y \leq k) = 1 )。
二、基于模型系数手动实现Python预测
结合你提供的代码和模型输出,我们可以直接从ordinal_results.summary()对应的参数中提取阈值和系数,手动完成预测:
步骤1:提取模型参数
首先从训练好的模型中拿到阈值 ( \alpha ) 和自变量系数 ( \beta ):
import numpy as np import pandas as pd from statsmodels.miscmodels.ordinal_model import OrderedModel # 你的原始数据和模型训练代码 data = pd.DataFrame({ 'score': [3.2, 4.5, 5.6, 6.7, 7.8, 8.9, 9.1], 'rating': [1,2,3,4,5,6,6] }) X = data[['score']] y = data['rating'] ordinal_model = OrderedModel(y, X, distr='logit') ordinal_results = ordinal_model.fit(method='bfgs') # 提取参数:前k-1个是阈值α(k是类别数,这里rating有6类,所以5个阈值),最后一个是score的系数β thresholds = ordinal_results.params[:-1].values beta = ordinal_results.params[-1]
步骤2:定义Logistic(Sigmoid)函数
用来计算累积概率:
def sigmoid(z): return 1 / (1 + np.exp(-z))
步骤3:计算每个样本的线性组合 ( X\beta )
X_beta = X['score'] * beta
步骤4:计算累积概率并推导类别概率
# 计算每个阈值对应的累积概率P(y ≤ j) cumulative_probs = [] for alpha in thresholds: # 对应公式P(y ≤ j) = sigmoid(α_j - Xβ) cum_prob = sigmoid(alpha - X_beta) cumulative_probs.append(cum_prob) # 补充边界条件:P(y ≤ 0) = 0,P(y ≤ 6) = 1 cumulative_probs = [pd.Series([0]*len(X))] + cumulative_probs + [pd.Series([1]*len(X))] # 计算每个类别的概率P(y = j) = P(y ≤ j) - P(y ≤ j-1) class_probs = [] for j in range(1, 7): prob = cumulative_probs[j] - cumulative_probs[j-1] class_probs.append(prob) # 转换为DataFrame,方便查看每个样本的各类别概率 class_probs_df = pd.DataFrame(class_probs).T class_probs_df.columns = [f'P(y={j})' for j in range(1,7)]
步骤5:得到最终预测类别
取每个样本概率最大的类别作为预测结果:
manual_predictions = class_probs_df.idxmax(axis=1).astype(int) print("手动预测结果:") print(manual_predictions) # 和statsmodels自带的predict结果对比验证 sm_predictions = ordinal_results.predict(X) print("\nStatsmodels自带predict结果:") print(sm_predictions)
运行后你会发现,手动计算的预测结果和statsmodels自带的predict输出完全一致,说明逻辑是正确的。
备注:内容来源于stack exchange,提问作者KriSt0f
相关产品推荐
相关产品推荐

