Различные результаты с использованием простых пакетов линейной регрессии на Python: statsmodel.api против sklearn

#python #scikit-learn #linear-regression #statsmodels

#питон #scikit-learn #линейная регрессия #statsmodels #python

Вопрос:

Я надеюсь понять, почему я получаю два разных результата для прогнозирования модели линейной регрессии. Я использую тот же набор данных и запрашиваю то же значение для прогнозирования. Я вставил несколько примеров кода ниже, а также ссылку на открытую страницу Google Colab, доступную здесь.

 import pandas as pd
from sklearn import linear_model, metrics
import statsmodels.api as sm

temp = [73,65,81,90,75,77,82,93,86,79]
gallons = [110,95,135,160,97,105,120,175,140,121]
merged = list(zip(temp, gallons))
df = pd.DataFrame(merged, columns = ['temp', 'gallons'])

X = df[['temp']]
Y = df['gallons']

regr = linear_model.LinearRegression().fit(X,Y)
print("Using sklearn package, 80 temp predicts rent of:", regr.predict([[80]]))

model = sm.OLS(Y,X).fit()
print("Using statsmodel.api package, 80 temp predicts rent of:", model.predict([80]))
  

С помощью приведенного выше кода я получаю результат:
Используя пакет sklearn, 80 temp предсказывает арендную плату: [125.5013734]
Используя пакет statsmodel.api, 80 temp предсказывает арендную плату: [126.72501891]

Может кто-нибудь объяснить, почему результат не тот же? Насколько я понимаю, они обе являются моделями линейной регрессии.

Спасибо!

Ответ №1:

Statsmodel не использует перехват по умолчанию, в то время как sklearn использует его по умолчанию.Вы должны добавить перехват вручную в statsmodel.

Документация Statsmodel OLS.

Примечания

Модель не добавляет константы, если вы не используете формулы.

Sklearn

fit_interceptbool, по умолчанию=True Следует ли вычислять перехват для этой модели. Если установлено значение False, перехват не будет использоваться в вычислениях (т. Е. Ожидается, что Данные будут центрированы).

используйте add_constant функцию для добавления перехвата к X, и это даст одинаковые результаты для обоих алгоритмов.

 X = sm.add_constant(X)
model = sm.OLS(Y,X).fit()
print("Using statsmodel.api package, 80 temp predicts rent of:", model.predict([1,80]))