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

Я пропущу теоретическую часть и сразу перейду к программированию с R. Если вы хотите лучше понять работу машин с градиентным ускорением, быстрый поиск в Google дает массу статей и примеров, раскрывающих эту концепцию. В этом мини-руководстве я буду изучать библиотеки и наборы данных, которые будут использоваться при построении модели GBM для выполнения некоторых прогнозов для набора данных.

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

Задача

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

Полный список переменных и их описания можно найти по адресу https://vincentarelbundock.github.io/Rdatasets/doc/DAAG/nassCDS.html

Исследование и предварительная обработка данных

Давайте начнем с настройки нашего текущего рабочего каталога и чтения набора данных в R studio. После этого мы посмотрим на переменные в наборе данных.

Из изображения мы видим, что наша целевая переменная dead - это фактор с двумя уровнями, предполагая, что «жив» = 1 и «мертв» = 2. Однако мы не можем предсказать модель, поскольку функция GBM требует, чтобы целевая переменная была быть двоичным (1/0). Кроме того, мы можем вывести неважные переменные, такие как X и caseid, которые являются номинальными переменными, которые не помогают в нашей модели прогнозирования.

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

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

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

Замечательно, теперь, когда переменная dead преобразована в двоичное значение, мы можем продолжить предварительную обработку данных. Во-первых, давайте удалим переменные X и caseid, которые не являются критическими для нашей модели с помощью функции select.

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

Наконец, перед построением нашей модели давайте быстро проверим недостающие данные.

Большой! В нашем наборе данных нет недостающих данных, что часто бывает наоборот. Но просто для практических целей давайте работать с этим набором данных. Теперь мы можем начать процесс построения модели.

Построение модели

Давайте установим начальное значение для создания симуляций или случайных объектов, которые можно воспроизвести. После этого мы перейдем к разделению данных на «обучающий» и «тестовый» наборы. Поскольку у нас есть относительно хорошее количество наблюдений (26 063), мы сделаем разделение 80/20 между набором для обучения и тестирования. Набор для тестирования будет «невидимыми» данными в нашей модели, которые мы будем использовать для прогнозирования после обучения.

Затем мы приступим к созданию модели GBM с помощью функции gbm.

Формула = целевой результат, который мы хотим спрогнозировать

распределение = функция потерь, используемая при создании модели. В этом примере мы выбрали распределение «Бернулли» «для логистической регрессии с результатом 0–1.

Данные = фрейм данных, содержащий переменные в модели

n.trees = Целое число, определяющее общее количество подходящих деревьев. Это эквивалентно количеству итераций и количеству базисных функций в аддитивном разложении. По умолчанию 100

shrinkage = параметр усадки, применяемый к каждому дереву в раскрытии. Также известен как скорость обучения или уменьшение размера шага; Обычно работают от 0,001 до 0,1, но для меньшей скорости обучения обычно требуется больше деревьев. По умолчанию 0,1.

cv.folds = Количество выполняемых сверток перекрестной проверки. Если cv.folds ›1, то gbm, помимо обычного соответствия, выполнит перекрестную проверку, вычислит оценку ошибки обобщения, возвращенную в cv.error.

Interaction.depth = Максимальная глубина взаимодействия переменных.

Краткое описание модели:

По результатам мы можем сказать, что следующая переменная injSeverity имеет наибольшее относительное влияние на предсказание того, останется ли человек «живым» или «мертвым» после аварии. Далее следуют дополнительные переменные, такие как ageOFocc и weight..etc.

Вот графическое представление относительной важности переменных.

Теперь, когда мы получили общее представление о переменных, влияющих на нашу модель, давайте немного подправим ее с помощью настроек гиперпараметров. Настройка гиперпараметров важна для построения моделей GBM, поскольку они имеют тенденцию к переобучению. Заметили строку cv.folds, которую мы добавили ранее в нашу модель? Мы будем использовать это для наших настроек гиперпараметров.

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

Полученные результаты:

Это говорит нам о том, что при перекрестной проверке оптимальное количество деревьев или n. Деревьев для соответствия модели составляет 83 и 24 для метода вне пакета. Поскольку этот набор данных содержит довольно скромное количество наблюдений, мы бы использовали оптимальное значение n.trees для перекрестной проверки.

Результаты модели

Чтобы просмотреть результаты нашей модели, мы использовали функцию прогноз и функцию ifelse, чтобы предсказать, мертв ли ​​человек, с процентом более 80%. Затем мы использовали бы матрицу неточностей, которая представляет собой таблицу, которая часто используется для описания производительности модели классификации.

Выход:

Из результатов мы видим, что наша модель имеет очень высокую точность примерно 99,53% вероятности предсказать, будет ли человек «живым» или «мертвым» на основе переменных в наборе данных. Что логически, основанное на наиболее важном предикторе, серьезности травмы, больше всего повлияет на человека.

Кроме того, мы можем построить ROC и вычислить значение AUC, чтобы проверить производительность нашей модели. Они работают в тандеме, где более высокий показатель ROC и AUC показывает, насколько хорошо наша классификационная модель предсказывает истинные положительные и истинные отрицательные результаты. (В идеале, чем выше, тем лучше!)

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

Расчет показателя AUC

Результат показывает столь же высокое значение 0,9957, что поразительно близко к идеальному значению 1.

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

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



Новичок в программировании на R и не знаете, с чего начать? посмотрите мою электронную книгу с пошаговыми инструкциями!