Я работаю над некоторыми примерами линейной регрессии в различных сценариях, сравнивая результаты использования Normalizer
и StandardScaler
, и результаты озадачивают.
Я использую бостонский набор данных жилья и готовлю его следующим образом:
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
#load the data
df = pd.DataFrame(boston.data)
df.columns = boston.feature_names
df['PRICE'] = boston.target
В настоящее время я пытаюсь рассуждать о результатах, которые я получаю из следующих сценариев:
- Инициализация линейной регрессии с параметром
normalize=True
против использованияNormalizer
- Инициализация линейной регрессии с параметром
fit_intercept = False
со стандартизацией и безfit_intercept = False
.
В совокупности я нахожу результаты запутанными.
Вот как я все настраиваю:
# Prep the data
X = df.iloc[:, :-1]
y = df.iloc[:, -1:]
normal_X = Normalizer().fit_transform(X)
scaled_X = StandardScaler().fit_transform(X)
#now prepare some of the models
reg1 = LinearRegression().fit(X, y)
reg2 = LinearRegression(normalize=True).fit(X, y)
reg3 = LinearRegression().fit(normal_X, y)
reg4 = LinearRegression().fit(scaled_X, y)
reg5 = LinearRegression(fit_intercept=False).fit(scaled_X, y)
Затем я создал 3 отдельных кадра данных, чтобы сравнить R_score, значения коэффициентов и прогнозы для каждой модели.
Чтобы создать фрейм данных для сравнения значений коэффициентов для каждой модели, я сделал следующее:
#Create a dataframe of the coefficients
coef = pd.DataFrame({
'coeff': reg1.coef_[0],
'coeff_normalize_true': reg2.coef_[0],
'coeff_normalizer': reg3.coef_[0],
'coeff_scaler': reg4.coef_[0],
'coeff_scaler_no_int': reg5.coef_[0]
})
Вот как я создал фрейм данных для сравнения значений R ^ 2 для каждой модели:
scores = pd.DataFrame({
'score': reg1.score(X, y),
'score_normalize_true': reg2.score(X, y),
'score_normalizer': reg3.score(normal_X, y),
'score_scaler': reg4.score(scaled_X, y),
'score_scaler_no_int': reg5.score(scaled_X, y)
}, index=range(1)
)
Наконец, вот датафрейм, который сравнивает прогнозы от каждого:
predictions = pd.DataFrame({
'pred': reg1.predict(X).ravel(),
'pred_normalize_true': reg2.predict(X).ravel(),
'pred_normalizer': reg3.predict(normal_X).ravel(),
'pred_scaler': reg4.predict(scaled_X).ravel(),
'pred_scaler_no_int': reg5.predict(scaled_X).ravel()
}, index=range(len(y)))
Вот результирующие кадры данных:
У меня есть три вопроса, которые я не могу решить:
- Почему нет абсолютно никакой разницы между первыми двумя моделями? Похоже, что настройка
normalize=False
ничего не делает. Я могу понять, что прогнозы и значения R ^ 2 одинаковы, но у моих функций разные числовые масштабы, поэтому я не уверен, почему нормализация не будет иметь никакого эффекта. Это вдвойне запутанно, если учесть, что использованиеStandardScaler
меняет коэффициенты. - Я не понимаю, почему модель, использующая
Normalizer
вызывает такие радикально отличающиеся значения коэффициентов от других, особенно когда модель сLinearRegression(normalize=True)
не меняет вообще.
Если вы посмотрите на документацию для каждого, похоже, что они очень похожи, если не идентичны.
Из документов на sklearn.linear_model.LinearRegression():
normalize: логический, необязательный, по умолчанию False
Этот параметр игнорируется, когда для fit_intercept установлено значение False. Если True, регрессоры X будут нормализованы до регрессии путем вычитания среднего значения и деления на l2-норму.
Между тем, документы по sklearn.preprocessing.Normalizer
что по умолчанию нормализуется до уровня l2.
Я не вижу разницы между тем, что делают эти два варианта, и я не вижу, почему у одного были бы такие радикальные отличия в значениях коэффициента от другого.
- Результаты модели, использующей
StandardScaler
, мне соответствуют, но я не понимаю, почему модель, использующаяStandardScaler
и параметрset_intercept=False
работает так плохо.
Из документов по модулю линейной регрессии:
fit_intercept: логический, необязательный, по умолчанию True
следует ли рассчитывать перехват для этой модели. Если установлено значение False, нет
перехват будет использоваться в расчетах (например, ожидается, что данные уже будут
по центру).
StandardScaler
центрирует ваши данные, поэтому я не понимаю, почему использование их с fit_intercept=False
приводит к несогласованным результатам.