Основы машинного обучения: полиномиальная регрессия

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

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

Требуемые модули:

  • pandas: для чтения и извлечения набора данных.
  • sklearn: для полиномиальной регрессии.
  • matplotlib: для построения данных.

Теперь начнем.

Импорт набора данных

import pandas as pd
data = pd.read_csv('..\Datasets\polynomial.csv')
data.head()

.head() печатает первые 5 строк в наборе данных

Извлечение X_data и Y_data

X_data = data.iloc[ : , 0:1]
Y_data = data.iloc[ : , 1]

Нанесение точек данных

import matplotlib.pyplot as plt
plt.scatter(x= X_data, y= Y_data)
plt.xlabel('Age')
plt.ylabel('Height')

Здесь matplotlib.pyplot используется для построения набора данных.

.scatter() – это функция для построения точек по окружности. Это мы называем диаграммой рассеяния. Нам нужно указать «значение x» и «значение y», чтобы построить «диаграмму рассеяния».

На графике видно, что точки не лежат на одной прямой. Следовательно, линейная регрессия не годится.

Преобразование x_data

Нам нужно преобразовать данные x, потому что у нас есть только столбец «x». Но форма полиномиальной регрессии такова:

y = w₀ + w₁*x + w₂*x² + . . + wₙ*xⁿ

Нам нужны значения x², x³, ..., xⁿ

Эти значения мы не будем вычислять вручную, поэтому воспользуемся функцией из sklearn, т.е. PolynomialFeatures().

Эта функция вычислит требуемые степени x, необходимые для регрессии, и вернет нам матрицу, в которой столбцы представляют вычисленные значения степеней ввода. В случае только 1 входной переменной, т.е. «x», соблюдается следующий порядок: (если входная переменная имеет две переменные, предположим, «x» и «w», тогда i-й столбец может не представлять i-ю мощность. Однако это не наша забота)

0 индексный столбец → 0-я степень

1-й индексный столбец → 1-я степень

2-й индексный столбец → 2-я степень

3-й индексный столбец → 3-я степень

Пусть x = 2 и степень многочлена = 3

Получив матрицу такого типа, мы подадим эти данные на вход простой модели линейной регрессии.

Именно это преобразование превращает нашу простую модель линейной регрессии в модель полиномиальной регрессии.

poly_feat = PolynomialFeatures(degree = 3)
x_poly = poly_feat.fit_transform(X_data)
print(x_poly[0:5])

Создание модели

poly_model = LinearRegression()

Объект линейной регрессии создан.

Обучение модели

poly_model.fit(x_poly,Y_data)

Мы обучили нашу модель с помощью .fit() и предоставили данные x и данные y.

Тестирование модели (Предсказание)

y_pred_poly = poly_model.predict(x_poly)
print(y_pred_poly)

Приведенная выше матрица является нашими прогнозируемыми значениями.

Построение графика (точечный график и линейный график)

plt.scatter(x= X_data, y= Y_data)
plt.plot(X_data, y_pred_poly, color='red')
plt.xlabel('Age')
plt.ylabel('Height')

.scatter() используется для построения точек

.plot() используется для построения точек в виде линии.

Нахождение r2_score

accuracy_score() не может обрабатывать данные нескольких классов, поэтому здесь ее использовать нельзя. Под «классом» я имел в виду столбцы. Следовательно, мы используем другую метрику, например, r2_score.

from sklearn.metrics import r2_score
r2_score(Y_data, y_pred_poly)

ТЕПЕРЬ, если мы сделали нашу простую линейную регрессию, что такое r2_score? Посмотрим.

lin_model = LinearRegression()
lin_model.fit(X_data, Y_data)
y_pred_lin = lin_model.predict(X_data)
plt.scatter(x= X_data, y= Y_data)
plt.plot(X_data, y_pred_lin, color='red')
plt.xlabel('Age')
plt.ylabel('Height')

Что такое r2_score?

r2_score(Y_data, y_pred_lin)

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

Ниже приведена полная реализация приведенной выше полиномиальной регрессии

# import all required modules
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# dataset import and value extraction
data = pd.read_csv('..\Datasets\polynomial.csv')
data.head()
X_data = data.iloc[ : , 0:1]
Y_data = data.iloc[ : , 1]
# plot the datapoints to visually see the data
plt.scatter(x= X_data, y= Y_data)
plt.xlabel('Age')
plt.ylabel('Height')
# transform the X_data to polynomial features
poly_feat = PolynomialFeatures(degree = 3)
x_poly = poly_feat.fit_transform(X_data)
print(x_poly)
# model creation and training
poly_model = LinearRegression()
poly_model.fit(x_poly, Y_data)
# prediction
y_pred_poly = poly_model.predict(x_poly)
# plot the polynomial regression
plt.scatter(x= X_data, y= Y_data)
plt.plot(X_data, y_pred_poly, color= 'red')
plt.xlabel('Age')
plt.ylabel('Height')
# find out r2_score
print(r2_score(Y_data, y_pred_poly))

ВЫВОД

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

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