截然不同R2R2statsmodels 和 sklearn 中的线性回归之间

机器算法验证 回归 Python scikit-学习 统计模型
2022-03-23 08:11:29

我的问题与:

statsmodel OLS 和 scikit 线性回归的区别

我基本上有同样的问题,除了我的结果更加不同。执行以下简单的线性回归,我得到了几乎完全相反的决定系数结果:

import statsmodels.api as sm
from sklearn import linear_model

    x1 = [26.0, 31.0, 47.0, 51.0, 50.0, 49.0, 37.0, 33.0, 49.0, 54.0, 31.0, 49.0, 48.0, 49.0, 49.0, 47.0, 44.0, 48.0, 35.0, 43.0]
    y1 = [116.0, 94.0, 100.0, 102.0, 116.0, 116.0, 68.0, 118.0, 91.0, 104.0, 78.0, 116.0, 90.0, 109.0, 116.0, 118.0, 108.0, 119.0, 110.0, 102.0]

# Fit and summarize statsmodel OLS model
model_sm = sm.OLS(x1, y1)
result_sm = model_sm.fit()
print(result_sm.summary())


# Create sklearn linear regression object
ols_sk = linear_model.LinearRegression(fit_intercept=True)

# fit model
model_sk = ols_sk.fit(pd.DataFrame(x1), pd.DataFrame(y1))

# sklearn coefficient of determination
coefofdet = model_sk.score(pd.DataFrame(x1), pd.DataFrame(y1))

print('sklearn R^2: ' + str(coefofdet))

Statsmodels 给我一个R20.962,而 sklearn 给了我一个R20.0584069073664。

是什么导致了如此巨大的差异?

1个回答

在您的模型中,您使用该方法scikit-learn包含了一个截距。fit_intercept=True这适合您的截距和斜率。

statsmodels中,如果要包含截距,则需要运行命令x1 = stat.add_constant(x1)以创建一列常量。然后运行该sm.OLS()命令将产生大约 0.056 的 R 平方值。

同样重要的是要注意,在 中构建模型时statsmodels,您希望将y1first 和x1second 而不是x1, then放入y1参数从 到 颠倒statsmodels过来scikit-learn