Машинное обучение — полиномиальная регрессия
Полиномиальная регрессия
Если ваши точки данных явно не подходят для линейной регрессии (прямая линия через все точки данных), она может идеально подойти для полиномиальной регрессии.
Полиномиальная регрессия, как и линейная регрессия, использует взаимосвязь между переменными 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()
Результат:
Объяснение примера
Импортируйте необходимые модули.
Вы можете узнать о модуле NumPy в нашем учебном пособии по NumPy .
Вы можете узнать о модуле SciPy в нашем учебном пособии по SciPy .
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-квадрат
Важно знать, насколько хорошо связаны отношения между значениями осей x и y, если нет отношений, полиномиальная регрессия не может быть использована для предсказания чего-либо.
Отношения измеряются величиной, называемой r-квадратом.
Значение 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:00:
Для этого нам понадобится тот же mymodel
массив из примера выше:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Пример
Определите скорость автомобиля, проходящего мимо в 17:00:
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 указывает на очень плохую связь и говорит нам, что этот набор данных не подходит для полиномиальной регрессии.