Реализация полиномиальной регрессии в Python
Автор: Grimmdzho Jaeqerjac • Апрель 25, 2022 • Реферат • 753 Слов (4 Страниц) • 539 Просмотры
[pic 1][pic 2][pic 3]
Реализация полиномиальной регрессии в Python
Постановка задачи
Предположим нам необходимо вычислить параметры полиномиальной регрессии функции одной переменной. Для решения задачи необходимо получить или сгенерировать набор данных (х) с соответствующими значениями y (или рассчитать значение функции в точках, заданным набором x), построить график функции, расcчитать параметры регрессии, используя x и y как обучающее множество. Поскольку полиномиальная регрессия задается как фукция степени x, для ее реализации в python указывается степень регрессии (degree).
Данные
Для создания набора данных воспользуемся командой x=np.linspace(0,10,30) или
x=np.array(np.linspace(0,10,30))
Таким образом, в наборе данных будет 30 значений от 0 до 10.
Для расчета значений зависимой переменной воспользуемся фукцией y=x*sin(x), которую можно реализовать как фукцию python
def f(x):
return x*np.sin(x)
График фукции приведен на рисунке
[pic 4]
Метод решения
Для решения задачи можно использовать несколько методов. Во первых, можно реализовать алгоритм градиентного спуска для нахождения параметров регрессии. Во вторых, можно использовать матричное выражение, которое в Python реализуется выражением
theta=np.dot( np.linalg.inv(np.dot(X.T,X)) , np.dot(X.T,y) )
В третьих, можно воспользоваться моделью полиномиальной регрессии, входящей в состав sklearn, импортировав его следующими директивами
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
Далее, после того как получены исходные данные, разбиваем их на тренировочное и тестовое множества значений
X=x[:,np.newaxis]
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
Формируем модель полиномиальной регрессии, задав предварительно степень регрессии, например degree=3
poly=make_pipeline(PolynomialFeatures(degree),Ridge())
обучаем модель
poly.fit(X_train,y_train)
и рассчитываем значения регрессии в точках заданых тренировочным множеством
y_pred=poly.predict(X_train)
или для всех исходных значений
h=poly.predict(X)
Строим графики. Например, ниже показан график функции полиномиальной регрессии 3-го порядка.
[pic 5]
Описанные шаги реализованы в виде программы polyReg001.py и в jyputer notebook polyReg001.ipynb
Листинг программы polyReg001.py
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
def f(x):
return x*np.sin(x)+1
x=np.linspace(1,10,30)
y=f(x)
plt.plot(x,y,'ob')
X=x[:,np.newaxis]
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
colors=['silver','teal','magenta','gray']
degree=3
count=1
poly=make_pipeline(PolynomialFeatures(degree),Ridge())
poly.fit(X_train,y_train)
y_pred=poly.predict(X_train)
print('degree= %d' %degree)
print('MSE= %.2f' % mean_squared_error(y_train,y_pred))
print('variance = %.2f' % r2_score(y_train,y_pred))
h=poly.predict(X)
plt.plot(X,h,color=colors[count], label='degree=%d' %degree)
plt.legend(loc='upper left')
Задача 1 [1].
1)
Задайте функцию y=x*sin(x^2) и постройте ее график, в котором точки, соответствующие обучающему и тестовому множеству, окрашены в разные цвета [2]
Определите значение степени регрессии при котором среднеквадратическая ошибка будет не более 10.
для решения задачи можно воспользоваться функцией plt.scatter(), например, для изображения точек обучающего множества
plt.figure(2)
plt.scatter(X_train,y_train,color='black', marker='o', label='train point')
Вы должны получить примерно следующее
[pic 6]
Задача 2 *[3]
Используя сгенерированный набор данных получите регрессионные кривые различных стпененей (от 2 до 9) и оцените показатели точности.
Ваши результаты могут выглядеть следующим образом [4]:
...