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

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

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

Полиномиальная регрессия – это подход к моделированию нелинейной зависимости между независимой переменной (x) и зависимой переменной (y) с использованием n-го полином степени x.

Если x — независимая переменная, а y — зависимая переменная, модель полиномиальной регрессии представляется как

где y — зависимая переменная, x — независимая переменная, (w1, w2, w3, …, wn) — веса, b — смещение или точка пересечения, а n — положительное целое число.

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

(Примечание. Процесс обучения модели полиномиальной регрессии такой же, как и модели простой линейной регрессии.)

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

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

1. Импорт необходимых библиотек

Во-первых, давайте импортируем некоторые необходимые библиотеки Python.

# Importing necessary libraries
import numpy as np # for array operations
import matplotlib.pyplot as plt # for data visualization
%matplotlib inline

# scikit-learn for model building and validation
from sklearn.linear_model import LinearRegression # for building the model
from sklearn.metrics import mean_squared_error # for calculating the cost function

# Importing libraries for polynomial feature transformation
from sklearn.preprocessing import PolynomialFeatures

# For creating a pipeline
from sklearn.pipeline import Pipeline

2. Создание набора данных

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

# Seeding the NumPy random number generator
np.random.seed(20)

# Creating a dummy dataset with curvilinear relationship using NumPy
x = 20 * np.random.normal(0, 1, 40)
y = 5*(-x**2) + np.random.normal(-80, 80, 40)

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

# Plotting the dataset
plt.figure(figsize = (10, 5))
plt.scatter(x, y, s = 15)
plt.xlabel('Predictor')
plt.ylabel('Target') 
plt.show()

3. Использование модели линейной регрессии для данных

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

# Initializing and training the Linear Regression model
model_lr = LinearRegression()
model_lr.fit(x.reshape(-1, 1), y.reshape(-1, 1))

# Predicting the values from the model
y_pred_lr = model_lr.predict(x.reshape(-1, 1))

# Plotting the predictions
plt.figure(figsize=(10, 5))
plt.scatter(x, y, s = 15)
plt.plot(x, y_pred_lr, color='r', label='Linear Regression')
plt.xlabel('Predictor')
plt.ylabel('Target')
plt.show()

Кроме того, расчет потери RMSE для модели линейной регрессии.

rmse = float(format(np.sqrt(mean_squared_error(y, y_pred_lr)), '.3f'))
print("\nRMSE for Linear Regression: ", rmse)
OUTPUT:
RMSE for Linear Regression: 3374.525

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

4. Использование модели полиномиальной регрессии для данных

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

Модуль PolynomialFeatures() из scikit-learn преобразует один независимый признак x в полиномиальные признаки n-йстепени (т. е. x1, x2,вплоть до nстепеней), чтобы мы могли использовать модель линейной регрессии для данных.

# Creating pipeline and fitting it on data
input_features = [('polynomial', PolynomialFeatures(degree = 4)), ('modal', LinearRegression())]
model_poly = Pipeline(input_features)
model_poly.fit(x.reshape(-1,1), y.reshape(-1,1))
OUTPUT:
Pipeline(memory=None, steps=[('polynomial', PolynomialFeatures(degree=4, include_bias=True, interaction_only=False)), ('modal', LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False))])

Здесь мы устанавливаем степень равной 4, так как нам нужны полиномиальные признаки 4-й степени.

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

# Predicting the values
poly_pred = model_poly.predict(x.reshape(-1,1))

# sorting the predicted values with respect to the variable
sorted_zip = sorted(zip(x, poly_pred))

# * is used to unzip the sorted zipped list
x_poly, y_pred_poly = zip(*sorted_zip)

# Plotting the predictions
plt.figure(figsize=(10,6))
plt.scatter(x, y, s=15)
plt.plot(x_poly, y_pred_poly, color='g', label='Polynomial Regression')
plt.xlabel('Predictor')
plt.ylabel('Target')
plt.legend()
plt.show()

Кроме того, расчет потери RMSE для модели полиномиальной регрессии.

# RMSE (Root Mean Square Error)
rmse = float(format(np.sqrt(mean_squared_error(y, poly_pred)), '.3f'))
print("\nRMSE for Polynomial Regression: ", rmse)
OUTPUT:
RMSE for Polynomial Regression: 78.021

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

Собираем все вместе

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

# Importing necessary libraries
import numpy as np # for array operations
import matplotlib.pyplot as plt # for data visualization
%matplotlib inline

# scikit-learn for model building and validation
from sklearn.linear_model import LinearRegression # for building the model
from sklearn.metrics import mean_squared_error # for calculating the cost function

# Importing libraries for polynomial feature transformation
from sklearn.preprocessing import PolynomialFeatures

# For creating a pipeline
from sklearn.pipeline import Pipeline

# Seeding the NumPy random number generator
np.random.seed(20)

# Creating a dummy dataset with curvilinear relationship using NumPy
x = 20 * np.random.normal(0, 1, 40)
y = 5*(-x**2) + np.random.normal(-80, 80, 40)

# Creating pipeline and fitting it on data
input_features = [('polynomial', PolynomialFeatures(degree = 4)), ('modal', LinearRegression())]
model_poly = Pipeline(input_features)
model_poly.fit(x.reshape(-1,1), y.reshape(-1,1))

# Predicting the values
poly_pred = model_poly.predict(x.reshape(-1,1))

# sorting the predicted values with respect to the variable
sorted_zip = sorted(zip(x, poly_pred))
x_poly, y_pred_poly = zip(*sorted_zip)

# Plotting the predictions
plt.figure(figsize=(10,6))
plt.scatter(x, y, s=15)
plt.plot(x_poly, y_pred_poly, color='g', label='Polynomial Regression')
plt.xlabel('Predictor')
plt.ylabel('Target')
plt.legend()
plt.show()

# RMSE (Root Mean Square Error)
rmse = float(format(np.sqrt(mean_squared_error(y, poly_pred)), '.3f'))
print("\nRMSE for Polynomial Regression: ", rmse)

В этом уроке мы узнали о полиномиальной регрессии вместе с ее реализацией в Python.

Вы хотите изучать Python, науку о данных и машинное обучение во время получения сертификата? Вот несколько самых продаваемых курсов Udemy, на которые мы рекомендуем вам записаться:

  1. 2021 Complete Python Bootcamp From Zero to Hero in Python — уже зачислено более 1 000 000 студентов!
  2. Python для Data Science and Machine Learning Bootcamp — уже зачислено более 400 000 студентов!
  3. Полное руководство по TensorFlow для глубокого обучения с помощью Python — уже зачислено более 90 000 студентов!
  4. Учебный курс по науке о данных и машинному обучению с R — уже зачислено более 70 000 студентов!
  5. Полный курс SQL Bootcamp 2021: от нуля до героя — уже зачислено более 400 000 студентов!

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

Первоначально опубликовано на https://www.theclickreader.com.