Как с помощью машинного обучения предсказать, совершит ли клиент возврат?

Машинное обучение у всех на слуху, и я тоже решил попробовать свои силы в этом деле.

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

В качестве платформы для разработки, я выбрал R — язык и я бы сказал даже целый фреймворк. Другой альтернативой я рассматривал Python, но у меня есть проблемы с установкой некоторых пакетов, поэтому я отказался от него.

Процесс состоит из пяти шагов:

  1. Постановка задачи/вопроса
  2. Подготовка данных
  3. Подбор алгоритма
  4. Тренировка модели
  5. Тестирование модели

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

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

  • Категория
  • Номер заказчика
  • Награда
  • Количество платных доп. опций
  • Количество оставленных оценок
  • Количество оставленных комментариев
  • Количество дней на конкурс
  • Флаг возврата

В целом, после фильтрации получилось немного строк, годных для тренировки — 852 строчки, совсем не Big Data. Тем не менее, я продолжил процесс, дальше стал выбирать алгоритм. Тип обучения у нас — обучение с учителем, задача из разряда классификации (нужно предсказать бинарное значение). Выбор пал на Random Forest, был написан следующий скрипт и запущен тренировка с выводом результатов:

Вот результат тренировки:

Ключевые параметры Accuracy, Sensitivity, Specificity. Несмотря на высокую общую точность предсказания — 85%, точность угадывания возврата низкая — 20%. Это меньше, чем подброс обычной монетки, что никуда не годится.

Тут следует пересмотреть данные, алгоритм или заняться тюнингом модели. Я пошёл по простому пути и решил попробовать другой алгоритм Random Ferns, результаты любопытные:

Из этой статистики можно сделать вывод, что вторая модель гораздо более подозрительная — она предсказывает возвраты намного чаще, вероятность — 62%, но делает это за счёт гораздо большего количества ложных подозрений проектов без возвратов. Какая из моделей лучше? Сложно сказать однозначно, они обе достаточно плохие, но наверное в определенных ситуациях вторая может подойти, потому что с практической точи зрения она даёт больше шансов среагировать на возможный возврат и предотвратить его.

Я ещё поэкспериментирую с этим вопросом, например, я попробую немного иные данные — возможно это изменит цифры. А ещё есть второй вопрос, который в простом виде звучит так: «сколько решений получит заказчик, создав проект с такими свойствами?», он интереснее тем, что для него можно собрать больше данных. Это тема для другого поста.


Also published on Medium.

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