序数逻辑回归:Intercept_ 返回 [1] 而不是 [n]

Posted

技术标签:

【中文标题】序数逻辑回归:Intercept_ 返回 [1] 而不是 [n]【英文标题】:Ordinal logistic regression: Intercept_ returns [1] instead of [n] 【发布时间】:2019-07-22 11:30:20 【问题描述】:

我正在使用 mord (scikitlearn) 库运行有序(即多项)岭回归。

y 是一个包含从 1 到 19 的整数值的单列。

X 由 7 个数值变量组成,分箱在 4 个桶中,并被虚拟化为最终的 28 个二进制变量。

import pandas as pd
import numpy as np    
from sklearn import metrics
from sklearn.model_selection import train_test_split
import mord

in_X, out_X, in_y, out_y = train_test_split(X, y,
                                            stratify=y,
                                            test_size=0.3,
                                            random_state=42)

mul_lr = mord.OrdinalRidge(alpha=1.0,
                           fit_intercept=True,
                           normalize=False,
                           copy_X=True,
                           max_iter=None,
                           tol=0.001,
                           solver='auto').fit(in_X, in_y)

mul_lr.coef_ 返回一个 [28 x 1] 数组,但 mul_lr.intercept_ 返回单个值(而不是 19)。

知道我缺少什么吗?

【问题讨论】:

多少样本? 19 岁? 1390 个观察值,y 有 19 个不同的可能值 不熟悉mord,只是想了解为什么您希望截距为18维。 我都没有,而且文档很少,据我所知,它使用与 sklearn 相同的 API,只是在这里和那里替换了一些参数以规避一些限制。我期待 19 次拦截(每个功能一个)感谢您指出这一点。 好吧,一切都指向至少有 k-1 个迭代,见这里:stats.idre.ucla.edu/sas/output/ordered-logistic-regression 3 possible y => 2 intercept 【参考方案1】:

如果您希望模型预测所有 19 个类别,则需要先将标签 y 转换为一种热编码,然后再训练模型。

from sklearn.preprocessing import OneHotEncoder

y-=1 # range from 1 to 19 -> range from 0 to 18
enc = OneHotEncoder(n_values=19)
y = enc.fit_transform(y).toarray()
"""
train a model
"""

现在mul_lr.intercept_.shape 应该是(19,)

【讨论】:

大概就是这样,查找并回复您。非常感谢

以上是关于序数逻辑回归:Intercept_ 返回 [1] 而不是 [n]的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn实现逻辑回归

R语言广义线性模型函数GLMR中有几种logistic回归扩展和变异robust包中的glmRob函数鲁棒logistic回归ms包中的lrm函数拟合序数逻辑回归

如何在Likert量表上测量的自变量应该在二元逻辑回归中作为连续变量或序数变量来处理?

R语言使用二元回归将序数数据建模为多元GLM

机器学习算法:线性回归API详细介绍

sklearn 和 statsmodels 的逻辑回归结果不匹配