Ошибка в sklearn.linear_model LinearRegression?

Я слежу за этим блокнотом ipython . Сейчас он немного устарел, и некоторые вызовы API изменились. Тем не менее, математика все еще должна работать!

Моя проблема: мне интересно, почему sklearn LinearRegression дает ложные результаты, а statsmodel OLS дает те же результаты, что и мое руководство.

Коэффициенты sklearn LinearRegression составляют -3,05335819e+09, 3,05335819e+09, 9,31299461e-02, -3,29341722e+00.

В то время как результаты statsmodel OLS: -1,17513710e-05, -1,17509020e-05, 9,23027375e-02, -3,27115207e+00

К сожалению, чтобы полностью следовать примеру, необходимо экспортировать набор данных «Бостон» из R.

Я создал суть с кодом:

import pandas as pd
import numpy as np
import scipy as sp
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
%matplotlib inline
# Data from R ISLR package - write.csv(Boston, "Boston.csv", col.names = FALSE)
boston_df = pd.read_csv("../../r/Boston.csv")
# fitting medv ~ lstat + I(lstat^2)
boston_df["lstat^2"] = boston_df["lstat"] ** 2
# fitting medv ~ poly(lstat,4). We already have lstat^2 and lstat from previous
boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)
X = boston_df[["lstat^4", "lstat^3", "lstat^2", "lstat"]]
y = boston_df["medv"]
reg7 = LinearRegression()
reg7.fit(X, y)
(reg7.intercept_, reg7.coef_)

что приводит к:

array([ -3.05335819e+09, 3.05335819e+09, 9.31299461e-02, -3.29341722e+00])

Однако, если я вычислю линейную регрессию с помощью statsmodel OLS:

# X = boston_df[["lstat^4", "lstat^3", "lstat^2", "lstat"]]
X = sm.add_constant(X)
# X = boston_df[[1., "lstat^4", "lstat^3", "lstat^2", "lstat"]]
ols = sm.OLS(y,X).fit()
# ols.summary()
ols.params.values[1:]

Я получаю следующие результаты:

array([ -1.17513710e-05,  -1.17509020e-05,   9.23027375e-02,
    -3.27115207e+00])

Что и ожидается.

Это подрывает мое доверие к sklearn. Я запускаю это на OSX, в ipython 3.0.0, statsmodels (0.6.1), scikit-learn (0.15.2), numpy (1.9.2)

Спасибо


person Dan Schien    schedule 06.07.2015    source источник


Ответы (1)


boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)

Вот почему оба являются политермами 4-го порядка? Это опечатка или намерение? Потому что из результата коэффициенты для членов 3-го и 4-го порядка имеют одинаковую величину, но отличаются только знаком. Обычно это происходит из-за проблемы мультиколлинеарности, когда эти два термина имеют почти совершенно положительную корреляцию. В этом случае и sm.OLS, и sklearn.linear_model.LinearRegression() неверны. Требуется стандартное лечение регуляризации.

person Jianxun Li    schedule 06.07.2015
comment
Спасибо, что заметили ошибку, которую я скопировал. С этим изменением оба API приходят к одному и тому же результату. - person Dan Schien; 07.07.2015