来自不同包的相同算法会生成完全不同的模型?

问题描述 投票:0回答:1

我正在分别用两个包训练线性模型。

但是,我意识到这两个结果在变量系数方面存在巨大差异。

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_)

上面是我使用的代码。令人惊讶的是,系数差异如此之大,以至于给出了完全不同的预测。

两个模型都以相同的顺序列出变量,所以我现在真的很困惑。知道出了什么问题吗?

python machine-learning scikit-learn statsmodels
1个回答
2
投票

这里的问题似乎在于如何在两个不同的包中处理拦截。

使用

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)

确保相应地调整两个模型,然后再次比较系数。

© www.soinside.com 2019 - 2024. All rights reserved.