Вот все, что вам нужно, чтобы начать работу с полиномиальной регрессией

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

Но что, если ваша модель линейной регрессии не может смоделировать взаимосвязь между целевой переменной и переменной-предиктором? Другими словами, что, если они не имеют линейной зависимости?

Вот тут-то и может помочь полиномиальная регрессия. В этой статье мы узнаем о полиномиальной регрессии и реализуем модель полиномиальной регрессии с использованием Python.

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

Давайте погрузимся!

Что такое полиномиальная регрессия?

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

В криволинейной зависимости значение целевой переменной изменяется неравномерно по отношению к предикторам.

В линейной регрессии с одним предиктором у нас есть следующее уравнение:

где,

Y – цель,

x – предиктор,

𝜃0 — смещение,

а 𝜃1 — вес в уравнении регрессии

Это линейное уравнение можно использовать для представления линейной зависимости. Но в полиномиальной регрессии у нас есть полиномиальное уравнение степени n, представленное как:

Здесь:

𝜃0 — смещение,

𝜃1, 𝜃2, …, 𝜃n — веса в уравнении полиномиальной регрессии,

а n — степень многочлена

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

Полиномиальная регрессия против линейной регрессии

Теперь, когда у нас есть общее представление о том, что такое полиномиальная регрессия, давайте откроем нашу среду разработки Python и реализуем полиномиальную регрессию.

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

Сначала импортируйте необходимые библиотеки и постройте взаимосвязь между целевой переменной и независимой переменной:

# importing libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# for calculating mean_squared error
from sklearn.metrics import mean_squared_error
# creating a dataset with curvilinear relationship x=10*np.random.normal(0,1,70)
y=10*(-x**2)+np.random.normal(-100,100,70)
# plotting dataset
plt.figure(figsize=(10,5))
plt.scatter(x,y,s=15)
plt.xlabel('Predictor',fontsize=16)
plt.ylabel('Target',fontsize=16)
plt.show()

Сначала начнем с линейной регрессии:

# Importing Linear Regression
from sklearn.linear_model import LinearRegression
# Training Model
lm=LinearRegression()
lm.fit(x.reshape(-1,1),y.reshape(-1,1))

Давайте посмотрим, как работает линейная регрессия в этом наборе данных:

y_pred=lm.predict(x.reshape(-1,1))
# plotting predictions
plt.figure(figsize=(10,5))
plt.scatter(x,y,s=15)
plt.plot(x,y_pred,color='r')
plt.xlabel('Predictor',fontsize=16)
plt.ylabel('Target',fontsize=16)
plt.show()

print('RMSE for Linear Regression=>',np.sqrt(mean_squared_error(y,y_pred)))

Здесь вы можете видеть, что модель линейной регрессии не может правильно подобрать данные, а RMSE (среднеквадратичная ошибка) также очень высока.

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

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

Мы можем автоматизировать этот процесс с помощью конвейеров. Конвейеры можно создавать с помощью Конвейера от sklearn.

Давайте создадим конвейер для выполнения полиномиальной регрессии:

# importing libraries for polynomial transform
from sklearn.preprocessing import PolynomialFeatures
# for creating pipeline
from sklearn.pipeline import Pipeline
# creating pipeline and fitting it on data
Input=[('polynomial',PolynomialFeatures(degree=2)),('modal',LinearRegression())]
pipe=Pipeline(Input)
pipe.fit(x.reshape(-1,1),y.reshape(-1,1))

Здесь я взял полином 2-й степени. Можно выбрать степень полинома на основе отношения между целью и предиктором. Полином 1-й степени представляет собой простую линейную регрессию; поэтому значение степени должно быть больше 1.

С увеличением степени многочлена возрастает и сложность модели. Поэтому значение n должно быть выбрано точно. Если это значение низкое, модель не сможет правильно подобрать данные, а если высокое, модель легко подгонит данные.

Подробнее о недообучении и переоснащении в машинном обучении читайте здесь.

Давайте посмотрим на производительность нашей модели:

poly_pred=pipe.predict(x.reshape(-1,1))
#sorting predicted values with respect to predictor
sorted_zip = sorted(zip(x,poly_pred))
x_poly, poly_pred = zip(*sorted_zip)
#plotting predictions
plt.figure(figsize=(10,6))
plt.scatter(x,y,s=15)
plt.plot(x,y_pred,color='r',label='Linear Regression') plt.plot(x_poly,poly_pred,color='g',label='Polynomial Regression') plt.xlabel('Predictor',fontsize=16)
plt.ylabel('Target',fontsize=16)
plt.legend()
plt.show()

print('RMSE for Polynomial Regression=>',np.sqrt(mean_squared_error(y,poly_pred)))

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

Но что, если у нас есть более одного предиктора?

Для 2 предикторов уравнение полиномиальной регрессии принимает вид:

где,

Y – цель,

x1, x2 — предикторы,

𝜃0 — смещение,

а 𝜃1, 𝜃2, 𝜃3, 𝜃4,и 𝜃5 — веса в уравнении регрессии

Для предикторов n уравнение включает все возможные комбинации полиномов разного порядка. Это известно как многомерная полиномиальная регрессия.

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

Конечные примечания

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

Надеюсь, вам понравилась эта статья. Если вы нашли эту статью информативной, поделитесь ею с друзьями и оставьте комментарий ниже с вашими вопросами и отзывами. Я также перечислил ниже несколько отличных курсов, связанных с наукой о данных:

Первоначально опубликовано на https://www.analyticsvidhya.com 15 марта 2020 г.