Машинное обучение — линейная регрессия
Регрессия
Термин регрессия используется, когда вы пытаетесь найти взаимосвязь между переменными.
В машинном обучении и статистическом моделировании эта связь используется для прогнозирования исхода будущих событий.
Линейная регрессия
Линейная регрессия использует взаимосвязь между точками данных, чтобы провести через них прямую линию.
Эта линия может использоваться для прогнозирования будущих значений.
В машинном обучении очень важно предсказывать будущее.
Как это работает?
В Python есть методы поиска связи между точками данных и построения линии линейной регрессии. Мы покажем вам, как использовать эти методы вместо того, чтобы повторять математические формулы.
В приведенном ниже примере ось X представляет возраст, а ось Y — скорость. Мы зафиксировали возраст и скорость 13 автомобилей, когда они проезжали пункт взимания платы. Давайте посмотрим, можно ли использовать собранные нами данные в линейной регрессии:
Пример
Начните с рисования точечной диаграммы:
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
Результат:
Пример
Импортируйте scipy
и нарисуйте линию линейной регрессии:
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Результат:
Объяснение примера
Импортируйте необходимые модули.
Вы можете узнать о модуле Matplotlib в нашем учебном пособии по Matplotlib .
Вы можете узнать о модуле SciPy в нашем учебном пособии по SciPy .
import matplotlib.pyplot as plt
from scipy
import stats
Создайте массивы, представляющие значения осей x и y:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
Выполните метод, который возвращает некоторые важные ключевые значения линейной регрессии:
slope, intercept, r,
p, std_err = stats.linregress(x, y)
Создайте функцию, которая использует значения slope
и
intercept
для возврата нового значения. Это новое значение представляет, где на оси Y будет размещено соответствующее значение x:
def myfunc(x):
return slope * x + intercept
Пропустите каждое значение массива x через функцию. Это приведет к созданию нового массива с новыми значениями для оси Y:
mymodel = list(map(myfunc, x))
Нарисуйте исходную диаграмму рассеяния:
plt.scatter(x, y)
Нарисуйте линию линейной регрессии:
plt.plot(x, mymodel)
Отобразите диаграмму:
plt.show()
R для отношений
Важно знать, как связаны отношения между значениями оси x и значениями оси y, если нет отношений, линейную регрессию нельзя использовать для предсказания чего-либо.
Это отношение — коэффициент корреляции — называется
r
.
Значение r
находится в диапазоне от -1 до 1, где 0 означает отсутствие связи, а 1 (и -1) означает 100% связь.
Python и модуль Scipy вычислят это значение для вас, все, что вам нужно сделать, это передать ему значения x и y.
Пример
Насколько хорошо мои данные подходят для линейной регрессии?
from scipy import stats
x =
[5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Примечание . Результат -0,76 показывает, что связь не идеальна, но указывает на то, что мы можем использовать линейную регрессию в будущих прогнозах.
Прогнозировать будущие значения
Теперь мы можем использовать собранную информацию для прогнозирования будущих значений.
Пример: попробуем предсказать скорость 10-летней машины.
Для этого нам понадобится та же myfunc()
функция из примера выше:
def myfunc(x):
return slope * x + intercept
Пример
Предсказать скорость автомобиля возрастом 10 лет:
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
Пример предсказал скорость 85,6, что мы также могли прочитать на диаграмме:
Плохая посадка?
Давайте создадим пример, в котором линейная регрессия не будет лучшим методом для прогнозирования будущих значений.
Пример
Эти значения для осей x и y должны очень плохо подходить для линейной регрессии:
import matplotlib.pyplot as plt
from scipy import stats
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]
slope,
intercept, r, p, std_err = stats.linregress(x, y)
def
myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc,
x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Результат:
А то r
для отношений?
Пример
Вы должны получить очень низкое r
значение.
import numpy
from scipy import stats
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]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Результат: 0,013 указывает на очень плохую взаимосвязь и говорит нам, что этот набор данных не подходит для линейной регрессии.