В данной статье мы рассмотрим методы нелинейной регрессии и сравним их точность с линейной.
Подходы по линейной регрессии почти совпадают с подходами по линейной, и разобраться в них не будет особенного труда.
# Импортируем модули
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import sklearn.linear_model as lm
from sklearn.metrics import r2_score , mean_absolute_error, mean_squared_error
# Загружаем данные
df = pd.read_csv('Grade_Set_2.csv')
print (df)
# Создаем объект LinarRegression
lr = lm.LinearRegression()
# мы используем функцию np.newaxis, создающую новую ось
x= df.Hours_Studied[:, np.newaxis] # Features
y= df.Test_Grade # Labels
# Тренируем модель
lr.fit(x, y)
#При необходимости мы можем рассчитать точку пересечений с осью и коэффициент наклона
# линии регрессии
print ("Intercept: ", lr.intercept_)
print ("Coefficient: ", lr.coef_)
# Рассчитаем предсказанные значения
y_lr=lr.predict(x)
# Визуализация результатов тестового набор данных
# Выводит оригинальный набор данных
plt.scatter(x,y,color = 'red')
# Выводит линию регрессии рассчитанную через вызов regressor.predict(x)
plt.plot(x, lr.predict(x), color='blue', linewidth=3)
plt.title('Grade vs Hours Studied')
plt.ylabel('Test_Grade')
plt.xlabel('Hours_Studied')
plt.show()
# Произведем вычисление точности с использованием встроенных функций
print ("R Squared using built-in function: ", r2_score(y, y_lr))
print ("Mean Absolute Error: ", mean_absolute_error( y, y_lr))
print ("Root Mean Squared Error: ", np.sqrt(mean_squared_error(y, y_lr)))
Как видим коэффициент детерминации близок к 1, т.е., в принципе, эта модель может использоваться.
# Теперь все тоже самое, но для нелинейной регрессии
# Загружаем данные
df = pd.read_csv('Grade_Set_2.csv')
print (df)
# Создаем объект LinarRegression
lr = lm.LinearRegression()
x= df.Hours_Studied # Features
y= df.Test_Grade # Labels
plt.scatter(x,y,color = 'red')
# Функция vander из пакета NumPy's возвращает степень входного вектора
for deg in [1, 2, 3, 4, 5]:
lr.fit(np.vander(x, deg + 1), y)
y_lr = lr.predict(np.vander(x, deg + 1))
plt.plot(x, y_lr, label='degree ' + str(deg))
plt.legend(loc=2)
print ("R-squared for degree " + str(deg) + " = ", r2_score(y, y_lr))
plt.show()
Обратите внимание, что при нелинейности 3-ей степени, коэффициент детерминации достигает 0.994 и дальнейшее увеличение степени нелинейности не приводит к заметному его росту.
# В пакете sklearn есть функция создающая на основе матрицы Feature новую матрицу с Feature возведенные в степень
# Загрузим необходимые модули
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
# мы используем функцию np.newaxis, создающую новую ось
x= df.Hours_Studied[:, np.newaxis] # Features
y= df.Test_Grade # Labels
for deg in [1,2, 3, 4, 5]:
model = make_pipeline(PolynomialFeatures(deg), lr)
model.fit(x, y)
plt.plot(x, model.predict(x), label='degree ' + str(deg))
plt.legend(loc=2)
print ("R-squared for degree " + str(deg) + " = ", r2_score(y, model.predict(x)))
plt.plot(x, y, 'ok')
plt.show()
Обратите внимание, что такой метод нелинейной регрессии проще и дает тот же результат, что и предыдущий.
Alexander Kalenik,
Senior Premier Field Engineer,
Microsoft Support,
PhD
8 июл. 2019 г.