岭回归中9个预测变量却得到10个系数的原因咨询
你的Clean_df确实包含9个预测变量,但最终得到10个系数,问题出在PolynomialFeatures(degree=1)的默认设置上:
核心原因
PolynomialFeatures默认参数include_bias=True,会自动给输入特征矩阵添加一列全为1的常数项(截距项)。这就导致经过fit_transform后的训练数据cdp_train变成了9个原始特征 + 1个常数项,共10列特征。
而你使用的Ridge模型默认参数fit_intercept=True——模型本身会单独拟合截距项,这时候就会出现冲突:PolynomialFeatures添加的常数项对应的系数会被强制置为0(你输出的第一个系数就是0.0),剩下的9个系数对应原始的9个特征,加起来正好10个。
验证与解决办法
验证
你可以查看处理后训练数据的列数,会发现它比原始cdx_train多1列:
print(cdp_train.shape[1]) # 输出应为10
解决办法
有两种方式可以让系数数量和原始特征数一致:
禁用PolynomialFeatures的常数项
创建PolynomialFeatures实例时设置include_bias=False,让Ridge模型自己拟合截距:cpr=PolynomialFeatures(degree=1, include_bias=False)此时
cdp_train会保留原始9个特征,Ridge的coef_就会输出9个系数,截距项单独存在于RigeModel_cd.intercept_中。禁用Ridge的截距拟合
如果需要保留PolynomialFeatures添加的常数项,就把Ridge的fit_intercept设为False,让模型用那个常数项作为截距:RigeModel_cd=Ridge(alpha = 1000, fit_intercept=False)此时
coef_的第一个值就会是截距的系数,不会是0,剩下9个对应原始特征。
内容的提问来源于stack exchange,提问作者julian lagier

