我正在学习有序 logit 回归,我想知道预测在数学上是如何工作的以及我如何自己在 python 中完成它。我知道在 python 中我可以简单地使用预测,但我想知道如何仅使用 model.summary() 中的 coef 进行预测。
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')
print(ordinal_results.summary())
结果是:
Time: 17:05:52
No. Observations: 7
Df Residuals: 1
Df Model: 1
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
score 66.3902 5669.125 0.012 0.991 -1.1e+04 1.12e+04
1/2 285.5835 2.56e+04 0.011 0.991 -4.98e+04 5.04e+04
2/3 4.2698 88.656 0.048 0.962 -169.493 178.032
3/4 4.1879 155.834 0.027 0.979 -301.241 309.617
4/5 4.3867 136.765 0.032 0.974 -263.668 272.442
5/6 3.4706 220.734 0.016 0.987 -429.161 436.102
==============================================================================
使用 coef 向量我如何获得与
相同的输出ordinal_results.model.predict(ordinal_results.params, exog = (4.3))
[[0.5264086 0.4735914 0. 0. 0. 0. ]]
我认为我应该对 coef 和新数据的线性和使用 softmax,但这不起作用
您建议“系数和新数据的线性和”,这是正确的,但由于您只有一个特征,所以它只是系数乘以新数据值:
66.3902 * 4.3
>>> 285.47786
但是
coef
列的其他条目实际上并不是传统意义上的系数(并且没有softmax);相反,它们代表离散目标的截止值。
线性模型(上面的 285.48)的预测被视为标准差为 1 的正态分布
y
的平均值(默认情况下,参见参数 distr
),每个目标的概率是 y
位于相关截止值之间。
没有很好地记录这些截止值是什么,但我假设第一个非系数
coef
是第一个截止值,其余的表示连续截止值之间的差异。所以
p_1 = P(y < 285.5835) ~= 0.5264086
p_2 = P(285.5835 < y < 285.5835 + 4.2698) ~= 0.4735914
p_3 = P( 285.5835 + 4.2698 < y < 285.5835 + 4.2698 + 4.1879) ~= 0
etc.