我正在分别用两个包训练线性模型。
但是,我意识到这两个结果在变量系数方面存在巨大差异。
def test(x, y, model):
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=101)
regr = linear_model.LinearRegression()
regr.fit(x_train, y_train)
lr = sm.OLS(y_train, x_train).fit()
print(lr.params)
print(regr.coef_)
上面是我使用的代码。令人惊讶的是,系数差异如此之大,以至于给出了完全不同的预测。
两个模型都以相同的顺序列出变量,所以我现在真的很困惑。知道出了什么问题吗?
这里的问题似乎在于如何在两个不同的包中处理拦截。
使用
statsmodels.regression.linear_model.OLS
,默认情况下不包含截距,需要使用 sm.add_constant(X)
手动添加。
相反,
sklearn.linear_model.LinearRegression
默认包含截距,如参数fit_intercept=True
所示。 sklearn
中的截距与系数分开存储,可以使用 .intercept_
查看。
为了确保公平比较,两个模型应配置为以相同的方式处理截距项。您可以向您的
statsmodels
模型添加一个常量:
X = sm.add_constant(X)
或者禁用您的
sklearn
模型中的拦截:
LinearRegression(fit_intercept=False)
确保相应地调整两个模型,然后再次比较系数。