Многочленная регрессия в машинном обучении
- Предыдущая страница Линейное регрессионное моделирование
- Следующая страница Многостепенное регрессионное моделирование
Полиномиальная регрессия (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 показывает очень плохую связь и говорит нам, что этот набор данных не подходит для полиномиального регрессионного моделирования.
- Предыдущая страница Линейное регрессионное моделирование
- Следующая страница Многостепенное регрессионное моделирование