.

Сделать репост в соц сети!

Показаны сообщения с ярлыком регрессия. Показать все сообщения
Показаны сообщения с ярлыком регрессия. Показать все сообщения

понедельник, 14 августа 2017 г.

Изучаем регрессию дальше


Задача

В предыдущей статье «Регрессия: Как начать предсказывать» мы коснулись темы простой линейной регрессии. Сегодня мы продолжим погружаться в эту интересную тему.

Итак, задача на сегодня у нас следующая. Есть данные участников мастер-класса по скорочтению (126 наблюдений). Мы построим модель прогноза Количества прочитанных книг за год на основании Скорости чтения человека. Т.е. Количество книг это зависимая переменная, а Скорость чтения – это независимая переменная (предиктор).

В предыдущей статье мы уже строили простую линейную регрессию.

В этой статье мы задействуем следующие методы:
·        Полиномиальная регрессия
·        Decision Tree («Дерево решений»)
·        Random Forest («Случайный лес»)
·        SVR (метод опорных векторов)
·        KNN (метод k-ближайших соседей)

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

Подготовка данных

У нас есть набор данных участников мастер-классов по скорочтению. База, на основании которой мы будем строить нашу модель.

Загрузить данные в R можно следующей командой:
dataset <- read.csv("SpeedReading_4_Groups.csv", sep = ";")
Посмотреть на первые шесть строк нашего датасета можно так:

head(dataset)

Никакой особой подготовки или преобразований наши данные не требуют.

Нам только нужно разделить наши данные на тренировочный и тестовый наборы данных. Т.е. на тренировочном датасете мы будем тренировать наши модели, а на тестовом – будем их тестировать.

Разделить наши данные на два датасета можно следующим кодом:
trindex = sample(1:nrow(dataset), nrow(dataset)*0.8)
training_set = dataset [trindex, ]
test_set = dataset [-trindex, ]

В результате такой операции мы получим два датасета:
training_setтренировочные данные
test_setтестовые данные

При этом данные будут распределены в пропорции 4/5. Т.е. 80% данных пойдет в тренировочные датасет, а 20% оставшихся в тестовый.

Вспоминаем линейную регрессию

Давайте построим простую линейную регрессию с одной независимой переменной, как мы это делали в прошлой статье.

У нас получится следующая модель:

А также давайте визуализируем данную модель.

Линейные модели мы можем использовать, когда выполняются определенные условия. Такие, как, например, линейная взаимосвязь и нормальное распределение наших переменных.

Тест на нормальность распределения наших переменных:

А также гистограммы:


Т.е. наша зависима переменная (Количество прочитанных книг) не прошла тест на нормальность. Кроме того, если посмотреть на график scatter plot, где отображена взаимосвязь наших двух переменных, то мы увидим, что связаны они не совсем линейно.

Нелинейные модели

Теперь давайте попробуем решить нашу задачку при помощи нелинейных моделей.

Полиномиальная модель

Построить такую модель совсем несложно. Достаточно добавить несколько полиномов. Например, это можно сделать так:
training_set$Level2 = training_set$Скорость.чтения^2
training_set$Level3 = training_set$Скорость.чтения^3
training_set$Level4 = training_set$Скорость.чтения^4
poly_reg = lm(Сколько.книг~Скорость.чтения+Level2+Level3+Level4, data = training_set)
summary(poly_reg)

В результате выполнения данных команд мы получим следующую модель:

Интерпретация такой модели ничем не отличается от линейной модели. Здесь мы можем увидеть все предикторы, а также посмотреть чему равняется R2 нашей модели.

Давайте визуализируем и данную модель:

Теперь давайте построим и другие типы моделей.

·        Decision Tree («Дерево решений»)
·        Random Forest («Случайный лес»)
·        SVR (Метод опорных векторов)
·        KNN (Метод k-ближайшего соседа)

У данных методов есть настраиваемые параметры. В данной статье мы не будем детально вдаваться во все подробности такой настройки, а попробуем использовать некие “стандартные” величины.

Decision Tree («Дерево решений»)

Для построения модели Decision Tree достаточно выполнить следующий код:
dTree <-  rpart(formula = Сколько.книг ~ Скорость.чтения,
                  data = training_set,
                  control = rpart.control(minsplit = 3))

И давайте также визуализируем полученный результат:


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

Random Forest («Случайный лес»)

Двигаемся дальше. Теперь метод Random Forest. Для построения регрессионной модели данным методом необходимо выполнить следующий код:
rndForest = randomForest(x = training_set[5],
                         y = training_set$Сколько.книг,
                         ntree = 5)

И давайте посмотрим на визуализацию нашей новой модели:


Из рисунка видно, что данный метод еще более «изощрённо» пытается описать наши данные.

SVR (Метод опорных векторов)

Переходим к следующему методу – SVR (Метод опорных векторов). Для построения регрессионной модели, необходимо выполнить следующую строку кода:
fitSVM = svm(formula = Сколько.книг ~ Скорость.чтения,
                data = training_set,
                type = 'eps-regression',
                kernel = 'radial')

И также давайте посмотрим на графическое отображение нашей новой модели:


Рисунок показывает нам, что данный метод строит более плавную линию для описания наших данных.

KNN (Метод k-ближайшего соседа)

И последний метод k-ближайшего соседа. Для построения регрессионной модели при помощи данного метода, нам необходимо выполнить следующий код:
fitKNN <- knn.reg(training_set[5], test_set[5], training_set[,4], k = 5)

И визуализируем нашу модель на графике:

Из рисунка мы видим, что метод KNN чем-то похож на визуализацию Random Forest. Такая же ломанная кривая линия.

Тестируем и выбираем лучшую модель

Теперь давайте протестируем все наши 6 моделей на тестовом наборе данных. Если помните в самом начале мы разделили наш датасет на две части: тренировочный датасет и тестовый датасет. До этого момента мы использовали тренировочный датасет. А теперь мы воспользуемся тестовыми данными.

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

В этом нам помогут три показателя:
MAE (Mean Absolute Error) – Средняя абсолютная ошибка между предсказанной и реальной величиной. Чем меньше ошибка, тем лучше.
RMSE (Root Mean Squared Error) – Квадратный корень из среднеквадратичной ошибки между предсказанной и реальной величиной. От МАЕ отличается тем, что «штрафует» большие ошибки сильнее. Чем меньше, тем лучше.
Rsq (коэффициент детерминации) – это доля дисперсии зависимой переменной, объяснённая нашей независимой переменной или переменными. Чем он больше, тем лучше.

После несложных вычислений и применения наших 6-ти моделей к тестовым данным, мы получим вот такую таблицу:

Давайте выберем трех лидеров по каждому показателю:
МАЕ: линейная, KNN и полиномиальная
RMSE: полиномиальная, Decision Tree и KNN
Rsq: полиномиальная, Decision Tree и KNN

По всем трем показателям у нас лидируют две модели: полиномиальная и KNN.

Ранее я говорил о том, что метод KNN-регрессии имеет настраиваемый параметр. Этот параметр (k) задается в формуле. Когда мы строили модель первый раз, мы задали стандартное значение 5. Но давайте теперь попробуем подобрать оптимальное значение (k), при котором наша ошибка RMSE будет минимальной.

Запустив совсем несложный цикл, мы получим следующий результат:


Т.е. наша ошибка RMSE будет минимальной при k=3. Давайте еще раз построим модель KNN с учетом нового значения k=3.
fitKNN <- knn.reg(training_set[5], test_set[5], training_set[,4], k = 3)

И теперь еще раз рассчитаем все наши параметры для выбора лучшей модели:


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

Теперь визуализируем все наши модели (линии) и на эти же графики точками нанесем данные из тестового датасета. Так мы сможем понаблюдать воочию, насколько точно наши модели описывали новые данные.

Ниже представлен именно такой график:

Выводы

В этой статье мы познакомились с несколькими нелинейными методами регрессии и решили поставленную в начале задачу. А именно:
        1)    Построили модель регрессии различными методами
        2)    Рассчитали критерии точности моделей для выбора наилучшей
        3)    Настроили k-параметр в KNN методе
        4)    Выбрали наилучшую модель и визуализировали итоговый результат

среда, 5 июля 2017 г.

Регрессия: Как начать предсказывать

Вот и я решил замахнуться ни на что-то там такое, а на самую, что ни на есть регрессию.

В предыдущих статьях мы вместе с вами уже рассматривали много интересных задач:

·   Мы выявляли различия в уровне исследуемого нами признака (когда сравнивали количество прочитанных книг теми, кто быстро и теми, кто медленно читает):

·        Мы рассчитывали оценку сдвига значений исследуемого признака (когда изучали эффективность учебного мероприятия):

·        Мы искали различия в распределении исследуемого признака (когда исследовали вопрос текучести кадрового резерва и строили Карты Шухарта):

·        Мы проводили анализ изменений признака в различных группах (когда проводили дисперсионный анализ): https://edwvb.blogspot.com/2017/04/blog-post.html

Многое мы уже вместе с вами сделали, но вот до регрессии все дело не доходило. Сегодня именно тот день! J


Об R

Выступая на различных публичных мероприятиях с темой аналитики, я всегда интересуюсь о том, какие инструменты использует бизнес для анализа. И, как бы это печально не звучало, в 99% случаев бизнес использует для этих целей Excel. И это проблема! И дело здесь не только в HR функции. И финансисты, и стратеги, и производственники, и маркетологи, и продавцы… все используют Excel.

Нет, в Excel нет ничего плохого. Просто этот инструмент не для таких задач. Для аналитики каждому бизнесу нужно научиться использовать более продвинутые и более пригодные инструменты – R, Python, Julia.

Я хочу, чтобы бизнес начал осваивать эти новые инструменты. Именно поэтому, начиная с этой статьи, я буду давать в тексте и короткие комментарии о том, как что-то сделать на языке R с использованием RStudio.

Постановка задачи

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

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

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

Давайте уже начнем!

Линейная регрессия с одной независимой переменной

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

Загрузить данные в R можно следующей командой:
dataset <- read.csv("SpeedReading_3_Groups.csv", sep = ";")

Посмотреть на первые шесть строк нашего датасета можно так: head(dataset)

Мы будем предсказывать Количество прочитанных книг (Сколько.книг). Это будет наша Зависимая переменная. А Скорость чтения (Скорость.чтения) будет Независимой переменной.

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

Начинаем, как всегда с визуализации наших данных. Давайте построим обычный scatter plot, где по Х будет наша НП, а по Y наша ЗП. Такой график поможет нам понять характер взаимосвязи между нашими переменными.

Построить scatter plot в R можно следующим кодом. Предварительно нужно не забыть загрузить библиотеку ggplot2.
library(ggplot2)
ggplot(df_post, aes(x=Скорость.чтения, y=Сколько.книг))+ geom_point(size=3)+
  ggtitle('Скорость чтения & Количество прочитанных книг за год (scatter plot)')+
  xlab('Скорость чтения, слов/мин') +
  ylab('Кол-во прочитанных книг, шт.')

Из графика мы видим, что при увеличении скорости чтения возрастает и количество прочитанных книг.

Давайте попробуем построить простую линейную регрессию с одним предиктором.

Построить простую линейную регрессию с одним предиктором можно следующей строкой кода:
fit_2 <- lm(Сколько.книг  ~ Скорость.чтения, data=dataset)
fit_2

В итоге получим следующий результат:
Давайте немного отвлечемся и вспомним университетскую программу по статистике J.

Уравнение простой линейно регрессии с одним предиктором выглядит так:

y = b0 + b1*x

Идея данного уравнения состоит в следующем. Мы хотим предсказать значение y, на основании значения xy – это количество прочитанных книг. А x – это скорость чтения.

Что же такое b0 и b1?
b0 – называется intercept, а b1 slope.

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

Давайте еще раз взглянем на нашу модель.

Для того чтобы это сделать, достаточно просто в консоле RStudio набрать имя нашей модели: fit_2 и нажать Enter.
Мы видим, что intercept, т.е. b0=1.23343, а b1=0.02485. Следовательно, наше уравнение примет следующий вид:

y = 1.23343 + 0.02485*x

Или

Кол-во книг = 1.23343 + 0.02485*Скорость чтения

Давайте попробуем воспользоваться полученной формулой.

Средняя скорость чтения всех участников находящихся в базе составляет 238 слов в минуту. Давайте ее и подставим в формулу:

Кол-во книг = 1.23343 + 0.02485*238 = 7 книг

Т.е. получается, что человек, который читает со скоростью 238 слов в минуту, за год прочитывает около 7 книг.

Давайте посмотрим на фактические данные по Скорости чтения и Количеству прочитанных книг в нашем датасете:

Для этого достаточно просто набрать имя нашего датасета с нужными номерами столбцов:
dataset[,c(4,5)]

Мы видим, что, например, строка 15 очень близка к нашему прогнозу. Т.е. человек со скоростью чтения 250 слов в минуту прочитал за прошлый год 8 книг.

Но при этом мы также видим и другую картинку. Например, строка 8: при скорости чтения 234 слов в минуту мы видим всего лишь 3 книги. Или, интересная строка 17: при скорости чтения 149 слов в минуту мы видим 14 прочитанных книг.

Почему так происходит? Давайте взглянем на более развернутое описание нашей линейной модели с одним предиктором.

Чтобы его получить, следует выполнить следующую команду:
summary(fit_2)

Что мы здесь видим?

Мы видим наши коэффициенты b0=1.23343 и b1=0.02485 (выделено синей линией на рисунке). Также мы видим, что наш коэффициент  значим, т.е. p<0,05 (выделено красной линией на рисунке).

Но самый большой интерес в этом описании вызывает R-squared значение, которое равно 0,1425 (выделено зеленой линией на рисунке). Это означает, что наша модель объясняет только около 14% изменчивости нашей зависимой переменной (т.е. Количество прочитанных книг). А это нам говорит о том, что в модель нужно добавлять другие предикторы (независимые переменные), которые усилят (читай – позволят более точно прогнозировать зависимую переменную) нашу модель.

Именно поэтому (R2 = 0,1425) нашей модели не всегда хватало точности в прогнозе Количества прочитанных книг на основании Скорости чтения, когда мы подставляли значения в формулу и смотрели фактические значения в нашем датасете.

Давайте теперь нарисуем на нашем scatter plot линию регрессии.

Чтобы это сделать нам нужно выполнить следующий код в RStudio:
ggplot(dataset, aes(x=Скорость.чтения , y = Сколько.книг))+
 geom_point(size=3)+
 geom_line(aes(x=Скорость.чтения, y=predict(fit_2, dataset)),col="red",lwd=1)+
 ggtitle('Скорость чтения & Количество прочитанных книг за год (scatter plot)')+
 xlab('Скорость чтения, слов/мин')+
 ylab('Кол-во прочитанных книг, шт.')

На графике мы видим, что наша линия регрессии (т.е. наше уравнение) y = 1.23343 + 0.02485*x не очень точно описывает взаимосвязь. Есть много точек гораздо выше линии регрессии и также есть много точек гораздо ниже нашей линии регрессии.

Давайте теперь попросим нашу модель спрогнозировать Количество прочитанных книг для каждого участника из датасета.

Чтобы это сделать, мы можем использовать следующий код:
y_pred <- predict(fit_2, newdata = dataset)
results <- cbind(y_pred, dataset$Сколько.книг)
colnames(results) <- c("predicted", "actual")
results <- as.data.frame(results)
results

В результате выполнения данных команды, мы получим следующую таблицу:


В этой таблице мы видим фактические значения (actual) и предсказанные нашей моделью значения (predicted).

Мы можем сравнить полученные пары значений и опять увидеть, что наша модель не очень точно предсказывает Количество прочитанных книг. Мы помним, что R2 нашей модели равен 0,1425. А это очень мало для адекватной модели.

Что мы можем сделать, чтобы улучшить нашу модель? Мы можем добавить в нее другие предикторы (независимые переменные). Например, пол, возраст и т.д. В данном случае, нам нужно будет построить множественную линейную регрессию.

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

Но это уже идеи для будущих статей. J

Работая с простой линейной регрессией с одной независимой переменной, следует также помнить о нескольких условиях ее применения:
         1)    Линейная взаимосвязь между ЗП и НП
         2)    Нормальное распределение остатков
        3)    Очень страшное слово – гомоскедастичность, т.е. постоянная изменчивость остатков на всех уровнях независимой переменной

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

Вывод

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

Итак, в данной статье мы:
       1)    рассмотрели, что такое регрессия и для чего она нужна
  2) построили график scatter plot, который отображает взаимосвязь двух переменных
       3)    построили регрессионную модель с одним предиктором
     4)  сделали прогноз нашей зависимой переменной, используя полученную модель, и сравнили наши фактические данные с предсказанными значениями
      5)    наметили, куда двигаться дальше J