#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]))