序数逻辑回归: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]的主要内容,如果未能解决你的问题,请参考以下文章
R语言广义线性模型函数GLMR中有几种logistic回归扩展和变异robust包中的glmRob函数鲁棒logistic回归ms包中的lrm函数拟合序数逻辑回归