Основы машинного обучения: полиномиальная регрессия
Мы видели модель линейной регрессии. Но не все виды данных лучше всего подходят для модели линейной регрессии.
Допустим, у нас есть кривая. Таким образом, чтобы представить изогнутые точки данных, нам нужна кривая, а не наша линейная прямая линия. Отсюда и возникает полиномиальная регрессия.
Требуемые модули:
- 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))
ВЫВОД
Здесь мы подогнали кривую с помощью полиномиальной регрессии. Результаты были намного лучше, чем у линейной регрессии.
Выбор модели для прогнозирования зависит от набора данных. Итак, сначала мы наносим точки данных, чтобы получить представление о модели.