使用sklearn的PolynomialFeatures时,LinearRegression自带y-intercept的情况下是否需要bias column?
使用sklearn的PolynomialFeatures时,LinearRegression自带y-intercept的情况下是否需要bias column?
嗨,刚入坑机器学习的时候确实会被这些细节绕晕,我来帮你把这个问题理清楚~
你观察到的现象完全没问题:当你用默认的PolynomialFeatures(3)生成特征矩阵时,它会自动添加一列全1的“bias列”,而LinearRegression默认又会自动拟合一个y-intercept(截距),这就导致了模型里出现了两个和截距相关的参数,属于冗余了。
核心逻辑是这样的:
LinearRegression的默认参数是fit_intercept=True,这意味着它会自动为模型学习一个截距项,不需要我们手动给特征矩阵加全1列;- 而
PolynomialFeatures的默认参数是include_bias=True,所以它会生成那列全1的bias列,这时候如果直接把这个特征矩阵喂给默认的LinearRegression,模型会把这个全1列当成一个普通特征来拟合系数,同时还会额外学习一个截距项,也就出现了你看到的“两个截距相关变量”的情况。
那该怎么处理呢?有两种靠谱的方案:
方案一:关闭PolynomialFeatures的bias列生成,让LinearRegression自己拟合截距
这也是sklearn里比较常规的用法,逻辑更清晰:
import numpy as np from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression X = np.arange(6).reshape(3, 2) # 设置include_bias=False,不生成全1的bias列 poly = PolynomialFeatures(3, include_bias=False) X_Poly3 = poly.fit_transform(X) # LinearRegression默认fit_intercept=True,自动拟合截距 model = LinearRegression() model.fit(X_Poly3, y) # y是你的目标变量 # 此时coef_是9个系数(对应X1,X2,X1²,X1X2,X2²,X1³,X1²X2,X1X2²,X2³) print(f"特征系数数量:{len(model.coef_)}") # intercept_就是单独的截距项 print(f"模型截距:{model.intercept_}")
方案二:保留PolynomialFeatures的bias列,关闭LinearRegression的自动截距拟合
这种方式也能避免冗余,不过逻辑上是把全1列的系数当成截距:
import numpy as np from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression X = np.arange(6).reshape(3, 2) poly = PolynomialFeatures(3) # 默认生成全1的bias列 X_Poly3 = poly.fit_transform(X) # 设置fit_intercept=False,不让模型自动拟合截距 model = LinearRegression(fit_intercept=False) model.fit(X_Poly3, y) # 此时coef_是10个系数,第一个就是截距(对应全1列),剩下9个是其他特征的系数 print(f"总系数数量:{len(model.coef_)}") print(f"模型截距(第一个系数):{model.coef_[0]}")
总结一下,两种方法都能解决冗余问题,但更推荐第一种,因为它的逻辑更符合我们对“截距”和“特征系数”的直观理解,也更贴合sklearn的常规使用范式。
备注:内容来源于stack exchange,提问作者pdycassidy
相关产品推荐
相关产品推荐

