Машинное обучение с R: линейная регрессия

Основы машинного обучения с R. И еще много чего.

Я решил начать целую серию статей о машинном обучении с R. Нет, это не значит, что я выхожу из Python (не дай бог), но я недавно изучаю R, и это не так уж плохо, как я первоначально думал . Итак, начнем с основ — линейной регрессии.

Если вы хотите узнать мои первые впечатления от языка программирования R, вот статья, опубликованная пару недель назад:

 

Я впервые попробовал R — насколько это было плохо?
Постоянно действующий Pythonista пробует R — сравнения с Python.

 

Это должен быть забавный сериал. Я намерен охватить все основные алгоритмы машинного обучения, сравнить «странные» части с его альтернативой Python, а также многому научиться в процессе.

Эта статья построена следующим образом:

  • Введение в линейную регрессию
  • Введение и загрузка набора данных
  • Базовый EDA
  • Модельное обучение и оценка
  • Вывод

Если вы больше любите видео, я могу вам помочь:

Также вы можете получить исходный код здесь.

Нам есть о чем рассказать, так что приступим прямо сейчас!

Введение в линейную регрессию

Я рискну и скажу, что это, вероятно, не первое ваше знакомство с линейной регрессией. И этого не должно быть, поскольку в статье не будет много теории. Тем не менее, мы начнем с общего обзора алгоритма.

Линейная регрессия — это простой алгоритм, изначально разработанный в области статистики. Он был изучен как модель для понимания взаимосвязей между входными и выходными переменными. Как следует из названия, это линейная модель, поэтому она предполагает линейную связь между входными переменными и одной (непрерывной) выходной переменной.

Эта выходная переменная рассчитывается как линейная комбинация входных переменных.

Существует два основных типа линейной регрессии:

  • Простая линейная регрессия — когда у нас есть только одна входная переменная
  • Множественная линейная регрессия — при наличии нескольких входных переменных

Обучение модели линейной регрессии по существу добавляет коэффициент к каждой входной переменной, который определяет, насколько она важна. Затем значение входных переменных умножается на соответствующий коэффициент, а член смещения (точки пересечения) добавляется к сумме. По сути, это наше прогнозируемое значение.

См. также:  Шаг 68: Поместите все под контроль версий~ Диомидис Спинеллис

Потрясающий! Линейная регрессия имеет некоторые допущения, и мы, специалисты по данным, должны их знать:

  • Линейное предположение — модель предполагает, что связь между переменными является линейной.
  • Без шума — модель предполагает, что входные и выходные переменные не зашумлены, поэтому, если возможно, удалите выбросы.
  • Отсутствие коллинеарности — модель переоценивается, если входные переменные сильно коррелированы.
  • Нормальное распределение — модель будет делать более надежные прогнозы, если ваши входные и выходные переменные распределены нормально. Если это не так, попробуйте преобразовать переменные, чтобы они выглядели более нормально.
  • Измененные входные данные — используйте масштабаторы или нормализатор, чтобы делать более надежные прогнозы.

И это все для общего обзора. А теперь давайте продолжим с хорошими вещами.

Введение и загрузка набора данных

Мы будем использовать набор данных Fish Market для построения нашей модели. Да, я тоже впервые использую его, так что вы не одиноки. Загрузите набор данных и сохраните его в удобном месте.

Теперь мы можем начать с импорта:

library(dplyr)
library(ggplot2)
library(caTools)
library(corrgram)

Проще говоря, dplyr используется для обработки данных, ggplot2 — для визуализации, caTools — для разделения поездов / тестов и corrgram — для построения аккуратных графиков корреляционной матрицы.

Теперь мы можем прочитать набор данных и проверить, как выглядят первые несколько строк:

df <- read.csv('data/Fish.csv')
head(df)

Потрясающий! Кажется, все работает нормально, поэтому мы можем продолжить базовый исследовательский анализ данных.

Базовый EDA

Первое, что нам нужно сделать, это проверить отсутствующие значения. Процесс такой же простой, как и с Python:

any(is.na(df))

Выполнение этого кода приводит к появлению в консоли большого верхнего регистра FALSE, что указывает на отсутствие пропущенных значений, поэтому мы можем продолжить анализ.

Теперь сделаем пару визуализаций. Ничего сложного, просто чтобы понять, как ведет себя наш набор данных. Первая визуализация — это диаграмма разброса веса рыбы в зависимости от роста, окрашенная в зависимости от вида рыб. Этот фрагмент кода помогает:

ggplot(data=df, aes(x=Weight, y=Height)) +
  geom_point(aes(color=Species, size=10, alpha=0.7))

Просто по цвету мы видим, что виды рыб хорошо разделены (в большинстве случаев). Затем давайте проверим корреляцию между атрибутами. Здесь вам пригодится библиотека corrgram. Вот код:

corrgram(df, lower.panel=panel.shade, upper.panel=panel.cor)

А вот сюжет:

См. также:  Шаблон проектирования паттерна

Корреляция безумно высока между почти всеми атрибутами. Но мы ничего не будем с этим делать, поскольку цель этой статьи — обсудить линейную регрессию, а не исследовательский анализ данных.

Имейте в виду — это, скорее всего, приведет к переобучению модели, но об этом позже.

На этом часть EDA завершена, и мы можем продолжить собственно моделирование.

Модельное обучение и оценка

На данный момент это будет самый длинный раздел, так что приготовьте себе чашку кофе. Начнем со сплита поезд / тест. Мы хотим разделить наш набор данных на две части: одну (большую), на которой обучается модель, и другую (меньшую), которая используется для оценки модели.

Прежде чем что-либо делать, давайте установим случайное начальное число. Разделение обучения и тестирования — это случайный процесс, и сид гарантирует, что рандомизация работает одинаково на вашем и моем компьютере:

set.seed(42)

Здорово! А теперь давайте сделаем шпагат. 70% данных используется для обучения, а остальные 30% используются для тестирования. Вот код:

sampleSplit <- sample.split(Y=df$Weight, SplitRatio=0.7)
trainSet <- subset(x=df, sampleSplit==TRUE)
testSet <- subset(x=df, sampleSplit==FALSE)

После выполнения кода вы должны увидеть две дополнительные переменные, созданные в правой верхней панели:

Итак, всего у нас есть 159 строк, из которых 111 были выделены для обучения модели, а оставшиеся 48 используются для тестирования модели.

Теперь мы можем продолжить обучение модели.

R использует следующий синтаксис для моделей линейной регрессии:

model <- lm(target ~ var_1 + var_2 + ... + var_n, data=train_set)

Это нормально, но представьте, что у нас есть 100 предикторов, тогда было бы кошмаром записывать каждый из них в уравнение. Вместо этого мы можем использовать следующий синтаксис:

model <- lm(target ~. , data=train_set)

Имейте в виду — это работает, только если вы решите использовать все предикторы для обучения модели. Соответственно, мы можем обучить модель так:

model <- lm(formula=Weight ~ ., data=trainSet)

Вкратце — мы пытаемся предсказать атрибут Weight как линейную комбинацию всех остальных атрибутов. R также автоматически обрабатывает категориальные атрибуты. Возьми, Python!

Далее мы можем взглянуть на краткое изложение нашей модели:

summary(model)

Самое интересное здесь — P-значения, отображаемые в столбце Pr(>|t|). Эти значения отображают вероятность того, что переменная не важна для прогноза. Обычно используется 5% -ный порог значимости, поэтому, если значение P составляет 0,05 или ниже, мы можем сказать, что вероятность его несущественности для анализа мала. Простите за отрицание, именно так и формируются гипотезы.

См. также:  20+ проблем с кодированием массивов и вопросов из собеседований по программированию

Потрясающий! Затем мы можем построить график остатков или, если быть точнее, гистограмму остатков. Здесь мы ожидаем увидеть что-то приблизительно нормально распределенное. Посмотрим, как выглядит гистограмма:

modelResiduals <- as.data.frame(residuals(model)) 
ggplot(modelResiduals, aes(residuals(model))) +
  geom_histogram(fill='deepskyblue', color='black')

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

И теперь мы наконец можем делать прогнозы! Сделать это довольно просто:

preds <- predict(model, testSet)

И теперь мы можем оценить. Для начала мы создадим фрейм данных фактических и прогнозируемых значений:

modelEval <- cbind(testSet$Weight, preds)
colnames(modelEval) <- c('Actual', 'Predicted')
modelEval <- as.data.frame(modelEval)

Вот как выглядят первые несколько строк:

Это не лучшая модель — по крайней мере, без доработок, но мы все равно добиваемся достойных результатов. Насколько прилично? Об этом нам расскажут такие показатели, как MSE и RMSE. Вот расчеты:

mse <- mean((modelEval$Actual - modelEval$Predicted)²)
rmse <- sqrt(mse)

Мы получили значение RMSE 95,9, и MSE — это хорошо, квадрат этого. Это означает, что мы ошибаемся в среднем на 95,9 единицы веса. Я предоставлю вам решать, насколько это хорошо или плохо.

На мой взгляд, модель перестроилась на обучающих данных из-за больших коэффициентов корреляции между входными переменными. Кроме того, коэффициент детерминации (R2) для поезда безумно высок (0,93+).

И на сегодня хватит. Подведем итоги в следующем разделе.

Перед тем, как ты уйдешь

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

В следующий раз мы рассмотрим логистическую регрессию, примерно через 3–4 дня, так что следите за обновлениями, если это вам интересно.

Спасибо за чтение.

Присоединяйтесь к моему личному списку адресов электронной почты, чтобы получать больше полезной информации.

Первоначально опубликовано на https://www.betterdatascience.com 25 сентября 2020 г.

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: