Многочленная регрессия в машинном обучении

Полиномиальная регрессия (Polynomial Regression)

Если ваши точки данных явно не подходят для линейной регрессии (прямая линия, проходящая через точки данных), то полиномиальная регрессия может быть идеальным выбором.

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


Схема работы

Python предоставляет несколько методов для поиска зависимостей между точками данных и рисования линий полиномиальной регрессии. Мы покажем вам, как использовать эти методы, а не математические формулы.

В следующем примере мы зарегистрировали 18 машин, проехавших через определенную платную станцию.

Мы уже записали скорость машин и время их проезда (часы).

Ось x представляет часы дня, ось y - скорость:

Пример

Сначала нарисовать график точек:

import matplotlib.pyplot as plt
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
plt.scatter(x, y)
plt.show()

Результат:


Запуск примера

Пример

импортировать numpy и matplotlibи затем нарисовать линию полиномиальной регрессии:

import numpy
import matplotlib.pyplot as plt
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Результат:


Запуск примера

Объяснение примера

Импортировать необходимые модули:

import numpy
import matplotlib.pyplot as plt

Создать массивы, представляющие значения по осям x и y:

x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]

NumPy предоставляет метод для создания полиномиальной модели:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Затем определить способ отображения строк, начиная с положения 1 и заканчивая положением 22:

myline = numpy.linspace(1, 22, 100)

Нарисовать исходный график точек:

plt.scatter(x, y)

Нарисовать линию полиномиальной регрессии:

plt.plot(myline, mymodel(myline))

Показать график:

plt.show()

R-Squared

Важно знать, насколько хорошо связаны значения по осям x и y, так как без зависимости полиномиальная регрессия не может быть использована для прогнозирования чего-либо.

Эта зависимость измеряется значением r-квадрат (r-squared).

Область значений r-квадрат составляет от 0 до 1, где 0 означает не相关性, а 1 - 100%相关性.

Python и модуль Sklearn рассчитают это значение для вас, вам нужно только ввести массивы x и y:

Пример

Какова настройка моих данных в полиномиальной регрессии?

import numpy
from sklearn.metrics import r2_score
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Запуск примера

Комментарий:Результат 0,94 указывает на наличие хорошей зависимости, и мы можем использовать полиномиальную регрессию для будущих прогнозов.

Прогнозирование будущих значений

Теперь мы можем использовать собранную информацию для прогнозирования будущих значений.

Например: давайте попробуем предсказать скорость машин, проезжающих через платную станцию около 17 часов вечера:

Для этого нам нужно то же, что и в предыдущем примере: mymodel Массив:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Пример

Прогнозировать скорость движения машин после 17 часов дня:

import numpy
from sklearn.metrics import r2_score
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)

Запуск примера

Скорость прогнозирования составляет 88,87, и это также можно увидеть на графике:


Плохая настройка?

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

Пример

Эти значения по осям x и y приведут к очень плохой способности к соответствию полиномиального регрессионного моделирования:

import numpy
import matplotlib.pyplot as plt
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Результат:


Запуск примера

Что такое r-квадрат?

Пример

Вы должны получить очень низкое значение r-квадрат.

import numpy
from sklearn.metrics import r2_score
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Запуск примера

Результат: 0.00995 показывает очень плохую связь и говорит нам, что этот набор данных не подходит для полиномиального регрессионного моделирования.