不同包实现的同算法为何生成差异极大的线性回归模型?
线性回归模型系数差异的原因及解决办法
核心问题在于两个库对截距项的默认处理逻辑不同:
sklearn.linear_model.LinearRegression()默认自动为模型添加截距项,拟合的是带截距的线性公式:(y = \beta_0 + \beta_1x_1 + ... + \beta_nx_n)statsmodels.api.OLS()默认不添加截距项,仅拟合无截距的线性公式:(y = \beta_1x_1 + ... + \beta_nx_n)
你的代码中,sm.OLS(y_train, x_train)使用的特征矩阵x_train没有常数项,而sklearn模型自动添加了截距,导致两个模型的拟合目标完全不同,最终系数和预测结果出现巨大差异。
解决办法
有两种方式让两个模型的拟合逻辑统一:
给statsmodels的OLS添加常数项
修改statsmodels的模型初始化代码,用sm.add_constant()给特征矩阵加上常数列:lr = sm.OLS(y_train, sm.add_constant(x_train)).fit()此时输出的
lr.params第一个值是截距,后续值会和regr.coef_完全对应(顺序一致)。让sklearn模型不拟合截距
初始化LinearRegression时设置fit_intercept=False,关闭自动添加截距的功能:regr = linear_model.LinearRegression(fit_intercept=False)这样两个模型都仅拟合变量系数,结果会一致。
只要统一了截距项的处理逻辑,两个模型的变量系数和预测结果就会匹配。
内容的提问来源于stack exchange,提问作者Yuuya
相关产品推荐
相关产品推荐

