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

Мы постараемся ответить на следующие вопросы:

  • Как определить нелинейность данных, особенно при наличии в модели нескольких переменных?
  • Что мы можем сделать, когда связь между зависимой и независимой переменной (переменными) нелинейна?

Выявление нелинейности в данных

Для простой линейной регрессии: нанесите на график независимую переменную и зависимую переменную, чтобы проверить наличие нелинейных закономерностей.

Для множественной линейной регрессии. Поскольку существует несколько предикторов, мы строим графики остатков по сравнению с прогнозируемыми значениями. В идеале на остаточном графике не должно быть заметной закономерности. Но если наблюдается закономерность, это может указывать на нелинейность.

Если присутствует нелинейность, нам может потребоваться построить график каждого предиктора с остатками, чтобы определить, какой предиктор является нелинейным.

мы можем видеть, что time_study нелинейна.

Как обрабатывать нелинейные данные?

Когда у нас есть остаточные графики, показывающие нелинейность, нам может потребоваться внести некоторые изменения либо в модель, либо в данные. существует два метода обработки нелинейных данных:

  • Преобразование данных
  • Полиномиальная регрессия

Преобразование данных

Давайте посмотрим, как преобразование данных может помочь нам смоделировать нелинейную связь между предиктором и переменной отклика.

На приведенном выше рисунке вы можете видеть, что это определенно не линейная зависимость. Чтобы сделать эту связь линейной, мы должны преобразовать данные. Форма, которую мы видели здесь, является формой логарифмической функции, поэтому, чтобы справиться с этим, мы можем попробовать логарифмическое преобразование переменной-предиктора.

Посмотрим, сработает ли это.

Мы видим, что теперь он показывает линейную зависимость. Теперь мы можем использовать модель линейной регрессии, чтобы получить коэффициент при y = ß0 + ß1log(x)

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

Мы должны помнить, что, хотя log является наиболее часто используемой функцией для преобразований, это не единственная функция, которую мы можем использовать. Есть несколько других функций, которые мы можем использовать в зависимости от формы данных. Например, для предиктора x такими преобразованиями могут быть log(x), sqrt(x), exp(x) и т. д., хотя это не исчерпывающий список. Как правило, одно из этих преобразований помогает.

Как мы решаем, когда и что трансформировать?

По сути, для обработки нелинейных данных нам, возможно, придется попробовать различные преобразования данных, чтобы определить модель, которая хорошо подходит для них. Мы должны помнить, что преобразование данных — это метод проб и ошибок. Необязательно, чтобы трансформация срабатывала каждый раз.

Полиномиальная регрессия

является частным случаем линейной регрессии. Линейная регрессия использует полиномы первой степени. Полиномиальная регрессия использует полиномы более высокой степени. Обе они являются линейными моделями, но первая дает прямую линию, а вторая — кривую.

Предыдущее изображение показывает, что связь между x и y не является линейной, поэтому линейная регрессия не даст хороших результатов. Поскольку фактическая посадка не является прямой линией, нам нужно использовать изогнутую линию.

Теперь давайте попробуем полиномиальную регрессию в sklearn

Реализация полиномиальной регрессии представляет собой двухэтапный процесс. Сначала мы преобразуем наши данные в полином с помощью функции PolynomialFeatures из sklearn, а затем используем линейную регрессию для подбора параметров:

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree = 4)
X_poly = poly.fit_transform(X)
lin2 = LinearRegression()
lin2.fit(X_poly, y)

Как мы устанавливаем степень нашего многочлена?

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

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree = 4)
X_poly = poly.fit_transform(X)
lasso = Lasso()

# list of alphas to tune -
params = {'alpha': [0.0001, 0.001, 0.01, 0.05, 0.1,0.2, 0.3, 0.4, 0.5,
                    0.6, 0.7, 0.8, 0.9, 1.0, 2.0, 3.0,4.0, 5.0, 6.0, 7.0,
                    8.0, 9.0, 10.0, 20, 50, 100, 500, 1000 ]}
model_cv = GridSearchCV(estimator = lasso, param_grid = params,
                        scoring= 'mean_absolute_error', cv = folds)

model_cv.fit(X_poly, y_train)
print(model_cv.best_params_)
>>>{'alpha': 100.0}

Таким образом, мы можем использовать полином относительно высокой степени в сочетании с гребневой регрессией и регрессией лассо, чтобы оштрафовать коэффициенты.