Обучение машинному обучению - Линейная регрессия
- Предыдущая страница Рассеивающая диаграмма
- Следующая страница Многочленная регрессия
Регрессия
Когда вы пытаетесь найти relação между переменными, используется термин «регрессия» (regression).
В машинном обучении и статистическом моделировании это отношение используется для прогнозирования результатов будущих событий.
Линейная регрессия
Линейная регрессия рисует прямую между точками данных на всех данных.
Эта линия может быть использована для прогнозирования будущих значений.

В машинном обучении прогнозирование будущего очень важно.
Как это работает
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()
Результат:

Пример объяснение
Импортировать необходимые модули:
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
Функция значений возвращает новые значения. Это новые значения представляют собой положение соответствующего значения x на оси y:
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-Squared
Важно знать, насколько хорошо связаны значения по оси x и оси y, если они не связаны, то линейная регрессия не может быть использована для прогнозирования чего-либо.
Эта связь измеряется значением, называемым r-квадрат (r-квадрат).
Интервал значений r-квадрат (r-squared) составляет от 0 до 1, где 0 означает не相关性, а 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-squared?
Пример
Вы должны получить очень низкое значение r-squared.
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 означает очень плохую связь и告诉我们, что этот набор данных не подходит для линейной регрессии.
- Предыдущая страница Рассеивающая диаграмма
- Следующая страница Многочленная регрессия