Вот все, что вам нужно, чтобы начать работу с полиномиальной регрессией
Какой первый алгоритм машинного обучения вы помните? Ответом обычно является линейная регрессия для большинства из нас (включая меня). Честно говоря, линейная регрессия поддерживает нашу лестницу алгоритмов машинного обучения в качестве основного и основного алгоритма в нашем наборе навыков.
Но что, если ваша модель линейной регрессии не может смоделировать взаимосвязь между целевой переменной и переменной-предиктором? Другими словами, что, если они не имеют линейной зависимости?
Вот тут-то и может помочь полиномиальная регрессия. В этой статье мы узнаем о полиномиальной регрессии и реализуем модель полиномиальной регрессии с использованием 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 уравнение включает все возможные комбинации полиномов разного порядка. Это известно как многомерная полиномиальная регрессия.
Но у многомерной полиномиальной регрессии есть серьезная проблема — мультиколлинеарность. Мультиколлинеарность — это взаимозависимость между предикторами в задаче многомерной регрессии. Это ограничивает правильную подгонку модели к набору данных.
Конечные примечания
Это было краткое введение в полиномиальную регрессию. Я не видел много людей, говорящих об этом, но это может быть полезным алгоритмом, которым можно воспользоваться в машинном обучении.
Надеюсь, вам понравилась эта статья. Если вы нашли эту статью информативной, поделитесь ею с друзьями и оставьте комментарий ниже с вашими вопросами и отзывами. Я также перечислил ниже несколько отличных курсов, связанных с наукой о данных:
- Сертифицированная программа: наука о данных для начинающих (с интервью)
- Лайки, советы и хитрости по науке о данных
- Комплексный путь обучения, чтобы стать специалистом по данным в 2020 году
Первоначально опубликовано на https://www.analyticsvidhya.com 15 марта 2020 г.