Мини-учебник

Прогнозирование вероятности выигрыша

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

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

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

Функции

Для извлечения 14 атрибутов на уровне возможностей использовались девять различных источников данных. К ним относятся продолжительность отношений, ожидаемая продолжительность возможности, количество действий CRM, сумма возможности, тип возможности (новая, перекрестная продажа и т. д.), продолжительность с момента последнего контакта, количество проведенных презентаций, имя докладчика, количество продуктов. посещение вебинаров, управление активами и рост стоимости активов.

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

Обучение и тестирование

Фрейм данных возможностей затем был разделен на открытые и закрытые возможности. Окончательный статус известен для закрытых возможностей — выигранных, проигранных или неактивных, а для открытых возможностей статус прогнозируется. Метка статуса преобразуется в 0 или 1, где 1 означает выигрыш возможности, а 0 — потерю возможности (включая статус «неактивно»).

Закрытые возможности разбиваются на Training и Test в соотношении 75:25, при этом сохраняется соотношение метки статуса с помощью функции createDataPartition в пакете Caret.

> set.seed(101) 
> intrain = createDataPartition(y=closed_opps$Label, p=0.75, list=FALSE)
> traindf = closed_opps[intrain,]; traindf$Label = as.factor(traindf$Label)
> testdf = closed_opps[-intrain,]; testdf$Label = as.factor(testdf$Label)

Модели

Я использовал пакеты Caret, ARM и XGBoost в R для создания контролируемых моделей машинного обучения на данных обучения и классификации возможностей как выигранных или потерянных.

Наивный Байес:алгоритм классификации, основанный на теореме Байеса, который определяет вероятность выигрыша или проигрыша Возможности, при условии, что каждая предикторная переменная принимает определенное значение.

nb_model <- train(Label ~ ., data = traindf, method = “naive_bayes”, trControl = fitControl, na.action = na.pass)

Логистическая регрессия. Обобщенная линейная модель, но с бинарным результатом, который преобразуется в вероятность с помощью сигмовидной функции. «Вес» для каждой переменной-предиктора определяется моделью, чтобы уменьшить ошибку между фактическими и прогнозируемыми значениями.

lr_model <- train(Label ~ ., data = traindf, method = “glm”, family = “binomial”, trControl = fitControl, na.action = na.pass)

Байесовский GLM:расширение модели логистической регрессии, но такое, которое предполагает априорное распределение переменных-предикторов в соответствии с байесовскими методами.

bayenesian_model <- train(Label ~ ., data = traindf, method = “bayesglm”, trControl = fitControl, na.action = na.pass)

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

boosted_lr_model <- train(Label ~ ., data = traindf, method = “LogitBoost”, trControl = fitControl, na.action = na.pass)

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

library(randomForest) # to build a random forest model
rf_model = train(Label ~ ., data = traindf, method = “rf”, ntree = 30, maxdepth = 5, trControl = fitControl, na.action = na.pass)
detach(“package:randomForest”, unload=TRUE) #conflicts with margin in ggplot

Extreme Gradient Boost:последовательно строит ансамбль деревьев решений, где остатки каждой модели вписываются в последующую модель.

xgb_model <-train(Label ~., data = traindf, method = “xgbTree”, trControl = fitControl, tuneGrid = xgb.grid, verbose = T, nthread = 2, na.action = na.pass)

Extreme Gradient Boost (с DART):расширение алгоритма Extreme Gradient Boost, но деревья удаляются на каждом этапе, чтобы избежать проблемы переобучения.

xgbDART_model <- train(Label ~ ., data = traindf, method = “xgbDART”, trControl = fitControl, na.action = na.pass)

Показатели эффективности

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

nb_predictions_test = predict(nb_model, newdata = testdf, type = “raw”)
bayenesian_predictions_test = predict(bayenesian_model, newdata = testdf, type = “raw”)
boosted_lr_predictions_test = predict(boosted_lr_model, newdata = testdf, type = “raw”)
lr_predictions_test = predict(lr_model, newdata = testdf, type = “raw”)
rf_predictions_test = predict(rf_model, newdata = testdf, type = “raw”)
xgbDART_predictions_test = predict(xgbDART_model, newdata = testdf, type = “raw”)
xgb_predictions_test = predict(xgb_model, newdata = testdf, type = “raw”)

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

Результаты

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

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

Случаи применения

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

Проблемы

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

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

Полезные ссылки

Вот ссылка на пакет Caret, который вы найдете полезным:

https://cran.r-project.org/web/packages/caret/vignettes/caret.html