В моем предыдущем посте (здесь) я описал процесс построения базовой, основанной на логистической регрессии модели вероятности выигрыша в игре для НФЛ с использованием R. Мы построили модель, используя обучающий набор, извлеченный из игры за игрой. данные за сезоны НФЛ с 2009 по 2016 гг. В этом посте мы построим альтернативную модель на основе случайного леса. В последней (предстоящей) публикации этой серии мы обсудим оценку производительности модели с использованием логистической регрессии и моделей случайного леса для сравнения.
Метод случайного леса - мощный подход к решению проблем как классификации, так и регрессии. Этот метод основан на принципе объединения, при котором создается несколько моделей, и на основе этих моделей затем прогнозируется согласованный результат.
Как и следовало ожидать, лес - это совокупность деревьев. Дерево (используемое для классификации или регрессии) разделяет данные с помощью набора правил, так что класс или значение каждой точки данных можно предсказать. Например, приведенное ниже дерево классификации было создано на основе данных о пассажирах Титаника и используется для классификации пассажиров по их выживанию или смерти. Переменными в модели являются пол пассажира (пол), возраст, класс и количество связанных родителей и детей на борту (прокси для размера семьи). Для любого пассажира на Титанике мы можем предсказать его выживание или смерть, если мы знаем его пол, возраст, класс пассажира и размер семьи на борту. Если бы я просунул себя (38 лет, мужчина и предположительно с двумя детьми на борту) через дерево (мы предположим, что я пассажир 2-го класса), меня бы предсказали, что я умру.
Деревья интуитивно понятны и наглядны, но могут быть подвержены переобучению. Подходящая модель - это модель, которая особенно хорошо подходит для обучающих данных (в выборке), но плохо работает с тестовыми (вне выборки) данными. Модель случайного леса использует разнообразие многих деревьев, чтобы снизить вероятность переобучения. Разнообразие дополнительно вводится путем выборки наблюдений (с заменой) и переменных. Когда построено много деревьев, деревья затем «голосуют» за каждое по классификации или ценности каждого наблюдения в наборе данных. Для проблем классификации используются правила большинства при этом голосовании (при условии двоичной классификации). Для задач регрессии можно использовать схему усреднения. Давайте посмотрим, как можно построить модель случайного леса для решения нашей игровой задачи о вероятности выигрыша.
В дополнение к библиотекам, которые мы использовали в предыдущем посте, мы также будем использовать библиотеки ranger и reshape. Пакет ranger предоставляет нам возможность создавать модель случайного леса, а reshape предоставляет доступ к функции melt, которую мы будем использовать для изменения расположение наших данных и прогнозируемые вероятности для удобства построения графиков.
library(ranger) library(reshape)
Код для разработки модели представлен ниже:
set.seed(123) rf1 = ranger(poswins ~ qtr + down + ydstogo + TimeSecs + yrdline100 + ScoreDiff, train, write.forest = TRUE, num.trees = 1000, probability = TRUE)
Поскольку в алгоритме случайного леса присутствует случайность, мы используем функцию set.seed для обеспечения воспроизводимости. Эта функция инициализирует генератор псевдослучайных чисел в R каждый раз в одной и той же точке. Это гарантирует, что мы будем получать одни и те же результаты каждый раз при создании модели.
Использование ranger аналогично использованию glm для построения модели логистической регрессии (как мы это делали в предыдущем посте). Часть кода ниже определяет переменную ответа (слева от ~) и переменные-предикторы:
poswins ~ qtr + down + ydstogo + TimeSecs + yrdline100 + ScoreDiff
Параметр write.forest сохраняет лес, чтобы его можно было использовать для создания прогнозов. Параметр num.trees указывает количество деревьев, сгенерированных алгоритмом. В общем, большее количество деревьев лучше с уменьшением отдачи от производительности по мере увеличения количества деревьев. На практике мы бы настроили этот и другие параметры модели, чтобы найти оптимальные или близкие к оптимальным значения. Параметр вероятность = ИСТИНА инструктирует рейнджера использовать подход вероятностного леса, как описано в работе Malley et al. (2012) (статья здесь). Это полезно, поскольку мы ищем вероятности в качестве выходных данных, а не простых двоичных классификаций.
После создания модели мы разрабатываем прогнозы. Как и в случае с моделью логистической регрессии, мы будем разрабатывать прогнозы для обучающей (входящей в выборку) части набора данных.
predRF = predict(rf1, train)
Объект предсказаний predRF Random Forest содержит два столбца вероятностей, по одному для каждого возможного результата (выигрыш или проигрыш). Мы изолируем второй столбец:
predRF_Yes = predRF$predictions[,2]
Затем, как мы это делали с прогнозируемыми вероятностями логистической регрессии, прикрепите вероятности к нашему фрейму данных train. Столбец predRFh будет содержать прогнозируемые значения вероятности победы для команды хозяев на каждом этапе каждой игры.
train = cbind(train,predRF_Yes) train = mutate(train, predRFh = ifelse(posteam == HomeTeam, predRF_Yes, 1-predRF_Yes))
Затем мы можем сравнить прогнозы модели логистической регрессии с прогнозами модели случайного леса. Мы воспользуемся функцией melt из пакета reshape, чтобы переформатировать наши данные, чтобы упростить построение вероятностей. Однако, прежде чем мы это сделаем, давайте выделим подмножество столбцов в нашем фрейме данных.
prob_reduced = train %>% select(GameID, TimeSecs, pred1h, predRFh)
Затем мы используем функцию melt, чтобы изменить расположение наших данных.
prob_reduced_melt = melt(prob_reduced, id=c("TimeSecs","GameID"))
На изображениях ниже показан сокращенный набор данных (после подмножества) до и после применения melt.
Затем мы используем функцию ggplot для построения графика вероятностей по обеим моделям для игры 9 сентября 2016 года между Denver Broncos (домашняя) и Carolina Panthers.
ggplot(filter(prob_reduced_melt, GameID == "2016090800"), aes(x=TimeSecs, y= value, color = variable)) + geom_line(size=2) + scale_x_reverse() + ylim(c(0,1)) + theme_minimal() + xlab("Time Remaining (seconds)") + ylab("Home Win Probability") + scale_color_manual(values=c("#FC4C02", "#0C2340"), name="Model", labels=c("Logistic", "RF"))
Общая картина, производимая двумя моделями, сопоставима. Модель случайного леса дает Бронкосам (домашней команде) более высокую вероятность победы почти на всю игру, чем модель логистической регрессии, а также, похоже, более подвержена резким колебаниям вероятности. В следующем посте будет интересно сравнить качество двух моделей и обсудить возможности дальнейшего улучшения.