Использование Python для Машинного обучения. Нелинейная регрессия. Точность модели. Часть 3.

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

# Импортируем модули
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)
1jpg

# Создаем объект 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)))

2jpg
Как видим коэффициент детерминации близок к 1, т.е., в принципе, эта модель может использоваться. 

# Теперь все тоже самое, но для нелинейной регрессии

# Загружаем данные
df = pd.read_csv('Grade_Set_2.csv')
print (df)
1jpg


# Создаем объект 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()
3jpg
Обратите внимание, что при нелинейности 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()
4jpg

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

Alexander Kalenik,
Senior Premier Field Engineer,
Microsoft Support,
PhD