Введение

В этой статье описывается, как использовать машинное обучение для получения потенциальных клиентов из демографических данных. Он является частью программы Udacity Data Scientist Nanodegree и описывает основные этапы решения основных бизнес-задач: понимание данных, подготовка данных, моделирование и оценка. Arvato Financial Solutions, дочерняя компания Bertelsmann, предоставила данные и инструкции для проекта.

Весь проект был разделен на две части:

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

Во второй части представлен еще один набор данных с демографической информацией для маркетинговой кампании компании. Чтобы предсказать, какие люди с наибольшей вероятностью превратятся в клиентов компании, необходимо использовать контролируемые методы обучения.
Основная библиотека, используемая в двух частях проекта, — sklearn (Python).

Часть I: Сегментация клиентов

Анализ

Для решения поставленной задачи в первую очередь был необходим тщательный анализ предоставленных данных. Компания Arvato Financial Solutions предоставила два основных набора данных в виде файла со значениями, разделенными запятыми:

  • AZDIAS (май 2018 г.): демографические данные по населению Германии в целом; 891 211 человек, 366 признаков
  • КЛИЕНТЫ (май 2018 г.): демографические данные клиентов компании, занимающейся доставкой по почте; 191 652 человека, 369 объектов

Файл CUSTOMERS содержит три дополнительные функции (CUSTOMER_GROUP, ONLINE_PURCHASE и PRODUCT_GROUP), которые предоставляют обширную информацию о клиентах, изображенных в файле.

Кроме того, были предоставлены два описательных файла, чтобы дать более полное представление об особенностях обоих наборов данных:

  • Информационные уровни DIAS — атрибуты (2017 г.): предоставляет информационный уровень, описание и дополнительные примечания для каждой функции.
  • DIAS Attributes — Values ​​(2017): содержит описание и карту значения/значения для каждой функции.

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

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

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

Чтобы применить методы машинного обучения к заданным данным, необходимо было выполнить пару шагов предварительной обработки. Набор данных AZDIAS был предварительно обработан в соответствии с приведенным ниже описанием (шаги с 1 по 6). Для повторного применения тех же шагов к другим наборам данных (например, КЛИЕНТАМ) шаги с 1 по 5 были объединены в функцию очистки.

Шаг 1. Удаление неописанных функций

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

Шаг 2. Преобразование отсутствующих значений

Созданная вручную ИНФОРМАЦИЯ О ФУНКЦИЯХ содержит все значения, соответствующие отсутствующей информации. В дополнение к уже существующим значениям NaN в наборах данных эти заполнители должны были быть преобразованы в значения NaN. Этот шаг является предварительным условием для шага 3, потому что в противном случае нет четкой картины того, сколько значений отсутствует для каждой функции.

Шаг 3. Отбросьте объекты с большим процентом неизвестных значений

Было принято решение отбросить все функции с высоким процентом пропущенных значений. Конечно, это означает потерю информации, но, похоже, это лучший подход к альтернативе вменения значений. Но что такое высокий процент в этом сценарии? На следующем рисунке показано количество функций по сравнению с процентом отсутствующих значений и помогает определить порог (= 0,2) для удаления функций. Всего было затронуто 73 функции.

Гистограмма: количество признаков / процент пропущенных значений

Шаг 4. Отбросьте строки с большим процентом неизвестных значений

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

Гистограмма: количество строк / процент пропущенных значений

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

Шаг 5. Перекодируйте функции

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

Оценка 26 категориальных признаков показала, что четыре из них уже были отброшены на более ранних этапах предварительной обработки. Еще три (CAMEO_DEU_2015, LP_FAMILIE_FEIN, LP_STATUS_FEIN) могут быть исключены из исходного набора данных из-за избыточности (доступны функции точного и грубого определения). Только одна функция (OST_WEST_KZ) должна была быть закодирована в горячем режиме. Все остальные имели числовые значения и не были изменены для упрощения.

Кроме того, были оценены четыре смешанных признака. Функция PRAEGENDE_JUGENDJAHRE была разделена на новые функции DECADE и MOVEMENT, а функция CAMEO_INTL_2015 была разделена на WEALTH и LIFE_STAGE. Информация, содержащаяся в двух оставшихся смешанных признаках (LP_LEBENSPHASE_FEIN, LP_LEBENSPHASE_GROB), была избыточной по отношению к другим признакам и как-то нечетко структурирована, поэтому было решено отказаться от обоих признаков.

Шаг 6. Импутирование и масштабирование

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

Выполнение

Для кластеризации PCA не обязательно является предварительным условием, но он уменьшает шум, и поэтому методы кластеризации позволяют лучше различать разные кластеры (см. ссылку [3]). Вот почему первым этапом сегментации клиентов была АКП со всеми доступными компонентами. Использование графика осыпи помогло определить, до скольких компонентов можно уменьшить PCA (около 150 признаков для объясненной дисперсии 0,9).

На следующем рисунке показан график осыпи для PCA со всеми компонентами.

PCA: объясненная дисперсия/количество признаков

Затем результаты PCA с уменьшенным количеством компонентов использовались в качестве входных данных для кластеризации с помощью KMeans. Чтобы найти нужное количество кластеров, KMeans применялся в цикле с количеством кластеров от 1 до 20, после чего для оценки использовался метод локтя.

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

Для процесса выбора признаков был выбран подход с контролируемой моделью обучения (см. ссылку [4]). Прогнозы процесса кластеризации KMeans использовались для соответствия классификатору LogisticRegression, после чего были взяты его коэффициенты, чтобы найти наиболее важные функции для классификации. На последнем этапе среднее значение и медиана для каждой из функций были рассчитаны для каждого интересующего кластера.

Осложнения

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

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

Уточнение

При реализации пришлось доработать пару вещей:

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

Результаты

Перебор KMeans с разным количеством кластеров привел к возможности использовать метод локтя. Было принято решение в пользу девяти кластеров. На следующем рисунке показано среднее расстояние до центроидов по количеству кластеров.

Метод локтя: среднее расстояние до центроидов / количество кластеров

Сравнение пропорций подсчета кластера для населения в целом с клиентами дало четкий результат. На следующем рисунке показаны эти пропорции.

Кластер подсчитывает пропорции для населения в целом и клиентов

Два кластера клиентов были явно перепредставлены (кластер № 4: 29,4% против 12,7% / кластер № 0: 9,2% против 6,3%), и поэтому его лица были предопределены как клиентская база или целевая группа для компании, занимающейся доставкой по почте.

В следующей таблице показано среднее значение и медиана для пяти наиболее важных характеристик Кластера № 4.

Выбор функций: Кластер № 4

Для нашего анализа особенно интересны различия для функций ALTERSKATEGORIE_GROB и W. Наша целевая группа по сравнению с общей популяцией на пару лет старше. Доля клиентов, проживающих в бывшей Западной Германии, соответствует доле нынешнего населения (около 80%). Из-за высокого значения для населения в целом (0,92) мы могли бы сказать, что если человек живет в бывшей Западной Германии, маловероятно, что этот человек станет покупателем. Дальнейшие исследования показали, что мы должны быть осторожны с этим утверждением (см. кластер № 7).

В следующей таблице показано среднее значение и медиана для пяти наиболее важных характеристик Кластера № 0.

Выбор функций: Кластер № 0

Разница для перекодированного признака БОГАТСТВА заметна. Наша целевая группа значительно богаче, чем население в целом.

Другой кластер немного перепредставлен (кластер № 5: 13,6% против 12,6%). Разница слишком мала, чтобы исследовать ее дальше.

Все остальные (кластеры № 1/2/3/6/7/8) представлены недостаточно. Все эти кластеры не подвергались дальнейшему анализу, потому что они явно выходят за рамки привлечения клиентов. Одно исключение было сделано для кластера № 7, кластера с самым большим разрывом (1,6% против 12,7%), чтобы выяснить, какие характеристики характеризуют людей, которые каким-то образом противоположны нашей целевой группе.

В следующей таблице показано среднее значение и медиана для пяти наиболее важных характеристик Кластера № 7.

Выбор функций: Кластер № 7

Стоит упомянуть различия для всех функций. Наш «анти-клиент» более менее добросовестный / придерживается традиционных взглядов (более высокое значение для SEMIO_PFLICHT), вырос более десяти лет спустя (среднее значение для функции DECADE: конец 70-х против начала 60-х) и более осторожен в отношении финансовых вложений (более высокое значение для FINANZ_ANLEGER) — что может быть связано с младшим возрастом. Кажется, что он/она живет больше в Восточной Германии, но, как упоминалось в анализе Кластера №4, мы должны быть осторожны с этим утверждением. В этом случае цифры говорят нам прямо противоположное тому, что мы ожидали.

Последний кластер (кластер № 9: 26,8% против 11,9%) был искусственно добавлен на график. Он содержит людей со многими пропущенными значениями, которые были извлечены во время предварительной обработки данных. Поэтому кластер не был создан в процессе кластеризации. Дальнейший анализ для выяснения причин высокого процента отсутствующих значений мог бы стоить затраченных усилий, но он не рассматривался в рамках проекта.

Часть II: Модель контролируемого обучения

Анализ

Как и в части I, сначала был проведен анализ предоставленных данных. Компания Arvato Financial Solutions предоставила два основных набора данных в виде файла со значениями, разделенными запятыми:

  • MAILOUT_TRAIN (май 2018 г.): демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 982 человека, 367 объектов
  • MAILOUT_TEST (май 2018 г.): демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 833 человека, 366 объектов

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

Раздел MAILOUT_TRAIN включает столбец RESPONSE, в котором указано, стал ли человек клиентом компании после кампании. Раздел MAILOUT_TEST не содержит этого столбца. Все остальные функции соответствуют функциям набора данных AZDIAS.

Примерно в 99% случаев люди не ответили на рассылку, т. е. набор обучающих данных крайне несбалансирован.

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

Из-за соответствия характеристик наборов данных MAILOUT_TRAIN, соответственно MAILOUT_TEST и AZDIAS, могут быть применены те же шаги предварительной обработки данных, которые описаны в части I. Поэтому можно использовать реализованную функцию очистки (шаги 1–5), а также импутирование/масштабирование (шаг 6). ). Тем не менее, следует отметить следующие отклонения:

  • Столбец RESPONSE нужно было извлечь из MAILOUT_TRAIN перед очисткой данных (используется для обучения модели на следующих этапах).
  • Функции, отброшенные из-за большого процента отсутствующих значений (шаг 3), отличаются от обработки AZDIAS/CUSTOMER: даже если пороговое значение (=0,25) осталось почти таким же, только одна функция (KK_KUNDENTYP) была дополнительно удалена.
  • Отбрасывание строк из-за высокого процента пропущенных значений (Шаг 4) не применялось: это было удобно для получения дополнительной группы для сегментации клиентов, но негативно сказалось бы на нашей модели обучения с учителем из-за несбалансированности набора данных ( удаление строк с положительным значением RESPONSE).

Выполнение

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

  • param_grid: имена параметров для настройки классификатора
  • оценка: метод оценки
  • cv: определяет стратегию разделения перекрестной проверки

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

Затем для последующего использования был взят наиболее перспективный классификатор. Он был настроен с помощью параметра param_grid GridSearchCV. С помощью классификатора можно было напрямую анализировать наиболее важные признаки (выбор признаков).

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

Осложнения

Наиболее трудоемкая сложность была связана с неправильной интерпретацией при предварительной обработке данных. Ошибочно предполагалось, что для MAILOUT_TRAIN/MAILOUT_TEST должны быть исключены те же функции, которые имели высокий процент отсутствующих значений в наборе данных AZDIAS. Это привело к очень плохой производительности для всех используемых классификаторов (как минимум на 20%).

(Неправильная) причина этого была найдена сразу же: дисбаланс набора данных. Повторная выборка и/или изменение весов классов, как описано в различных сообщениях блога (см. ссылки [1] и [2]), должны были быть ответом, но, к сожалению, не были. Все попытки с библиотекой imblearn (расшифровывается как несбалансированное обучение), SMOTE (метод передискретизации синтетического меньшинства) и весами классов (можно установить с помощью параметра для различных классификаторов; class_weight: «сбалансированный») не увенчались успехом.

Уточнение

При реализации пришлось доработать пару вещей:

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

Результаты

Точность не кажется подходящим методом оценки производительности для несбалансированных наборов данных. Вместо этого для оценки производительности использовался ROC AUC (см. ссылку [1]).

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

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

Базовая производительность классификатора

Затем GradientBoostingClassifier (как наиболее многообещающий) был настроен с другими параметрами. Определенный набор параметров (потеря: экспоненциальная / по умолчанию: отклонение, max_depth: 2 / по умолчанию: 3, n_estimators: 80 / по умолчанию 100) привел к повышению производительности на 0,770805086873 для MAILOUT_TRAIN и достижению итоговой оценки ROC AUC 0,79627 для MAILOUT_TEST.

Объяснением хорошей производительности Gradient Boosting является встроенный подход, который борется с дисбалансом классов: он строит последовательные обучающие наборы на основе неправильно классифицированных примеров (см. ссылку [2]).

Выбор признаков показал, что D19_SOZIALES (транзакционная активность, основанная на группе продуктов) с 18,5 % является наиболее влиятельным признаком при подборе классификатора. Это можно рассматривать как побочное примечание и не имеет никаких последствий.

Вывод

Необходимо было применить большую часть CRISP-DM (Cross-Industry Standard Process for Data Mining) к обеим частям проекта. Понимание бизнеса было включено в описание проблемы, но понимание данных, подготовка данных, моделирование и оценка должны были разрабатываться с нуля. Общее правило о том, что подготовка данных является наиболее трудоемкой частью процесса, можно проверить еще раз.

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

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

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

Что дальше?

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

  • Какие функции отсутствуют?
  • Отсутствующие функции как-то связаны?
  • Почему эти функции отсутствуют?
  • Является ли это лучшим подходом к обработке данных?
  • Каковы альтернативы (например, вменение значений)?

Ответы на эти вопросы могут помочь найти более эффективное решение.

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

Хотите взглянуть на исходный код? Блокнот jupyter проекта и файлы ссылок можно найти в этот репозиторий GitHub.

использованная литература

[1] Обработка несбалансированных наборов данных в машинном обучении

Батист Рокка, 28 января 2019 г.