How-to: Создаем прогнозную модель менее чем за 10 минут

Автор оригинальной публикации: Тавиш Шривастава (Tavish Srivastava)

Перевод Станислава Петренко 

Введение

В течение последних нескольких месяцев мы проводим хакатоны по data science. Хакатон представляет собой соревнование, в рамках которого необходимо решить конкретную задачу за достаточно короткое время. Обычно он длится от 2-х до 7-ми дней.

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

Участникам хакатонов (и более длительных соревнований) я могу дать хороший совет: постарайтесь как можно быстрее создать первую модель и отправить ее прогнозы на проверку. Несколько первых прогнозов нужно сделать очень быстро. Я написал специальные модули на Python и R, которые на входе принимают табличные данные и имя целевой переменной, а на выходе позволяют получить готовую модель менее чем за 10 минут (при условии, что набор данных содержит около 100 000 строк). Для меньших наборов данных потребуется еще меньше времени. Основной смысл таких супер быстрых решений заключается в том, что они позволяют получить базовый результат, от которого следует отталкиваться при дальнейшем усовершенствовании модели. В этой статье мы рассмотрим методику создания быстрых решений.

Основные этапы прогнозного моделирования

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

  1. Описательный анализ данных – 50% времени.
  2. Предобработка данных (подстановка отсутствующих значений и коррекция аномалий) – 40% времени.
  3. Моделирование данных – 4% времени.
  4. Оценка модели – 6% времени.

Примечание: процентные оценки времени основаны на моем личном опыте участия в 40 соревнованиях.

Теперь постараемся сократить временные затраты. Пройдем весь процесс поэтапно (оценивая необходимое время):

  1. Описательный анализ. Когда я начал свою карьеру в сфере аналитики, в первую очередь мы создавали модели на основе логистической регрессии (logistic regression) и деревьев решений (decision tree). Большинство использованных нами алгоритмов были «жадными» алгоритмами.

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

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

Благодаря описанным выше подходам этап предобработки данных займет 3 – 4 минуты.

  1. Моделирование данных. Для набора данных объемом около 100 000 строк крайне эффективными являются алгоритмы на основе градиентного бустинга (gradient boosting). В случае большего объема данных можно применить случайный лес (random forest). Этот этап займет 4 – 5 минут.
  1. Оценка модели. Данный этап потребует примерно 1 – 2 минуты. Эффективным методом оценки модели является k-fold кросс-валидация при k = 7, но для этого может потребоваться немного больше времени.

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

Алгоритм в действии

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

Шаг 1. Объединяем обучающий и тестовый набор данных вместе.

Шаг 2. Загружаем данные в память.

setwd("C:\\Users\\Tavish\\Desktop\\Kagg\\AV")
complete <- read.csv("complete_data.csv", stringsAsFactors = TRUE)

Шаг 3. Выводим на экран названия переменных и сводную информацию  о них.

colnames(complete )
[1] "ID" "Gender" "City"  "Monthly_Income" "Disbursed" "train"

Шаг 4. Выявляем:

  1. числовые переменные;
  2. переменные-идентификаторы;
  3. категорийные переменный;
  4. целевые переменные.

Шаг 5. Помечаем отсутствующие значения с помощью двоичных переменных.

missing_val_var <- function(data,variable,new_var_name) {
data$new_var_name <- ifelse(is.na(variable),1,0))
return(data$new_var_name)}

Шаг 6. Выполняем подстановку отсутствующих числовых значений.

numeric_impute <- function(data,variable) {
mean1 <- mean(data$variable)
data$variable <- ifelse(is.na(data$variable),mean1,data$variable)
return(new_var_name)
}

В отношении категорийных переменных выполняем аналогичную процедуру, заполняя отсутствующие значения некоторым произвольным значением, например, «Null».

Шаг 7. Моделируем.

Задача. Попробуйте применить k-fold кросс-валидацию на этом шаге.

create_model <- function(trainData,target) {
set.seed(120)
myglm <- glm(target ~ . , data=trainData, family = "binomial")
return(myglm) }

Шаг 8. Прогнозируем.

score <- predict(myglm, newdata = testData, type = "response")
score_train <- predict(myglm, newdata = complete, type = "response")

Шаг 9. Оцениваем модель.

auc(complete$Disbursed,score_train)

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

Заключение

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

Автор публикации

не в сети 13 часов

DataReview

Комментарии: 16Публикации: 954Регистрация: 05-06-2014

Вам также может понравиться

1 комментарий

  1. 😀 Дико улыбался пока читал. Протестирую методу)

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
*
Генерация пароля