"Могу ли я более эффективно ориентироваться на потенциальных клиентов?"

Это одно предложение резюмирует проблему идентификации сегментации клиентов, которая решается в Конкурсе прогнозов Арвато.

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

Я завершил этот проект в рамках наностепени Udacity в области науки о данных и кратко расскажу об этапах этой работы в этой статье.

Обзор работы

Проект был разделен на 3 основные части.

1. Отчет о сегментации клиентов

  • Очистка данных
  • Преобразование функции
  • Кластеризация

2. Модель контролируемого обучения для прогнозирования

  • Метрики
  • Оценка и проверка модели
  • Улучшения модели
  • Отражение
  • Результаты и перспективы

3. Kaggle-конкурс

Вся работа была выполнена с помощью Python 3 на ноутбуке Jupyter.

Отчет о сегментации клиентов

Очистка данных

Моей первой задачей было понять, какая информация (файлы) была в распоряжении. В этом проекте основными файлами являются две таблицы csv, содержащие записи об общей численности населения Германии и о клиентах компании. Оба файла содержат несколько 100 000 записей примерно для 365 функций (или столбцов).

Я просмотрел отсутствующие данные и удалил те столбцы и строки, в которых количество отсутствующих значений было слишком велико, чтобы из них можно было что-то извлечь. Затем я исследовал типы данных различных столбцов и преобразовал все, что не было числовым. Большинство моделей машинного обучения лучше всего работают с числовыми значениями. Обычно категориальные данные, такие как ['красный','синий','желтый'] можно легко превратить в [1,2,3]. Я также создал новые функции из других функций (разработка функций), таких как «DECADE» и «WEALTH», которые являются упрощениями из других столбцов, и стандартизировал данные. Последнее состоит в том, чтобы привести каждую функцию к одинаковым диапазонам, чтобы убедиться, что все они имеют эквивалентный вес при обучении контролируемой модели.

Два графика ниже свидетельствуют о недостающих значениях, с которыми я столкнулся. В большинстве столбцов отсутствовало менее 20 % данных, а в строках — менее 10 %. Я решил игнорировать функцию с отсутствующими ›20% (плохая функция), а также строки с отсутствующими более ›10% (неправильно введенная информация о пользователе).

Преобразование функции

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

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

На этом этапе мой набор данных состоял примерно из 800 000 записей с 350 функциями, причем каждое значение было числовым и стандартизированным. Я разложил измерения методом PCA и обнаружил, что 100–150 измерений уже объясняют от 75 до 85% дисперсии набора данных.

Я решил продолжить исследование, оставив только 100 измерений, так как их было достаточно, чтобы объяснить более 3/4 дисперсии.

Кластеризация

Я использовал метод кластеризации KMeans для поиска оптимальных способов группировки данных. Идея, лежащая в основе метода kmean, состоит в том, чтобы преобразовать n-мерное пространство (n — количество объектов) в k различных центроидов (для k групп), чтобы минимизировать расстояние каждой точки данных от центроида, которому они принадлежат.

Можно видеть, что кривая на графике выше выглядит как экспоненциальное затухание: стремление получить больше центроидов уменьшается при каждом увеличении k. Поэтому я решил работать с центроидами.

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

В идеале мы хотели бы, чтобы все клиенты принадлежали к некоторым кластерам, а все население — к другим. Здесь ситуация несколько иная, поскольку данные не полностью разделены. Мы по-прежнему можем наблюдать, что люди в кластерах 1, 2 и 5, очевидно, с гораздо меньшей вероятностью будут Клиентами, и наоборот для кластеров 0, 3 и 4. Я решил сохранить 5 лучших взвешенных признаков кластеров 1–5. и попытается сделать прогноз о человеке на их основе.

Модель контролируемого обучения для прогнозирования

Я решил обучить классификатор случайного леса, чтобы он предсказывал, может ли человек стать участником или нет — 1 или 0. Для обучения предоставляется дополнительный аннотированный набор данных, где каждая запись отмечена дополнительным столбцом «ОТВЕТ» из логический тип, указывающий, стал ли данный клиент членом или нет.

Метрики

Важно проанализировать целевые данные, чтобы иметь возможность выбрать подходящие метрики. У нас есть логическая цель, которая очень несбалансирована (более 99% людей имеют «ОТВЕТ» 0 — люди, которые не ответили на кампанию по членству).

Поэтому я решил посмотреть на группу показателей: точность, отзыв, fscore и поддержка. На самом деле точность здесь была бы совершенно неуместной из-за несбалансированности данных. Мы могли бы легко достичь точности 99%, всегда предсказывая 0 (а это совсем не то, что нам нужно!). С другой стороны, сочетание точности и полноты часто упоминается в литературе как хороший способ оценки наборов данных о дисбалансе.

Оценка и проверка модели

Я разделил свои тренировочные данные на два набора: обучение и проверку (примерно 66% и 34%). Я использовал набор поездов, чтобы подогнать модель, в то время как я взял набор проверки, чтобы проверить, является ли модель разумным результатом производства.

Фактически, я быстро заметил, что мои проверочные данные предсказывали только нули, другими словами, моя модель не была проверена.

Проблему дисбаланса я решил лечить с помощью метода под названием over-sampling. Количество ответов 1 искусственно увеличено, так что 0 и 1 уравновешены. После переоснащения классификатора случайного леса сбалансированными данными матрица путаницы показывает, что число истинных положительных результатов подскочило с 0% до 12%! (Это означает, что 12% людей, которых мы считали потенциальными клиентами, действительно стали клиентами после кампании).

Улучшения моделей

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

Я использовал GridSearchCV для выполнения исчерпывающего поиска по некоторым выбранным параметрам: max_features, min_amples_leaf, n_estimators.

Отражение

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

Результаты и перспективы

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

Случайный классификатор Foreast, использующий наиболее взвешенные признаки (на основе анализа KMeans и PCA), поначалу не мог предсказать, является ли индивидуум покупателем или нет. Несмотря на то, что точность этой первой модели была высокой, точность и полнота, относящиеся к несбалансированным данным, были очень низкими.

Я столкнулся с проблемой несбалансированных данных и решил решить ее с помощью метода, называемого передискретизацией. После балансировки данных классификатор Random Forest давал лучшие результаты, и его можно было точно настроить с помощью GridSearchCV от sklearn.

Изучив литературу о способах работы с несбалансированными наборами данных, я могу обобщить три способа работы с несбалансированными наборами данных:

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

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

Каггл Конкурс

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

Вывод

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