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

有序Logistic回归(Ordered logit regression)的预测原理及基于模型系数手动实现Python预测的技术问询

有序Logistic回归(Ordered logit regression)的预测原理及基于模型系数手动实现Python预测的技术问询

嘿,我来帮你拆解有序Logistic回归的预测逻辑,还有怎么用模型输出的系数手动实现Python预测~

一、有序Logit回归的预测数学原理

有序Logistic回归是基于累积概率来建模的,核心逻辑如下:

  1. 假设存在一个无法观测的潜在连续变量 ( y^* ),它和自变量的关系是:
    [
    y^* = X\beta + \varepsilon
    ]
    其中 ( X ) 是自变量矩阵,( \beta ) 是自变量的系数,( \varepsilon ) 服从标准Logistic分布(即Sigmoid函数的逆分布)。
  2. 我们观测到的分类变量 ( 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 )
  3. 累积概率(即 ( y ) 小于等于某个类别 ( j ) 的概率)可以用Logistic函数计算:
    [
    P(y \leq j) = P(y^* \leq \alpha_j) = \frac{1}{1 + e^{\alpha_j - X\beta}}
    ]
  4. 每个具体类别的概率,是相邻累积概率的差值:
    [
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 07:43:09