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

Этот пост предназначен для поддержки моего завершающего проекта курса Udacity Data Scientist Nanodegree.

Определение проекта

Обзор проекта

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

  1. Сегментация клиентов
    Неконтролируемые методы обучения (PCA, кластеризация k-средних) использовались для анализа характеристик постоянных клиентов и общей совокупности с целью создания сегментов клиентов.
  2. Модель контролируемого обучения
    Используя третий набор данных с атрибутами целей кампании по почте, результаты предыдущего анализа использовались для построения модели машинного обучения, которая предсказывает, будет ли каждый человек откликнуться на кампанию. Эта модель была оптимизирована с помощью настройки гиперпараметров и других методов.
  3. Kaggle Competition
    Оптимизированная модель использовалась для прогнозирования данных кампании, и люди были ранжированы по тому, насколько вероятно, что они станут клиентами. Прогнозы были отправлены на конкурс Kaggle для определения производительности модели с использованием оценки ROC AUC.

Источники данных

Данные для проекта были предоставлены Арвато Бертельсманном и состоят из следующих наборов данных:

  • Udacity_AZDIAS_052018.csv: Демографические данные для населения Германии в целом; 891211 лиц x 366 функций.
  • Udacity_CUSTOMERS_052018.csv: Демографические данные клиентов компании, занимающейся доставкой по почте; 191652 лица x 369 признаков.
  • Udacity_MAILOUT_052018_TRAIN.csv: демографические данные для лиц, ставших мишенями маркетинговой кампании; 42982 лица x 367 функций.
  • Udacity_MAILOUT_052018_TEST.csv: Демографические данные для лиц, ставших мишенями маркетинговой кампании; 42833 лица x 366 функций.

Также была предоставлена ​​электронная таблица Excel DIAS Attributes — Values 2017.xlsx. Он содержал описания и возможные значения для многих, но не для всех функций в наборах данных.

Исследование и очистка данных

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

Overview of AZDIAS:
891221 rows and 366 columns.
360 columns of type 'number'.
6 columns of type 'object'.
10% of the data is null.

Он показывает, что большинство столбцов являются числовыми, и только шесть из них имеют тип «объект». 10% набора данных являются нулевыми значениями. Учитывая, что большинство моделей машинного обучения лучше всего работают или требуют числовых данных и отсутствия пропущенных значений, это необходимо решить.

Неверные значения

Чтение данных AZDIAS с помощью метода Pandas read_csv() дало это предупреждение:

Это указывает на то, что столбцы 18 и 19 содержат смешанные типы. Более внимательное изучение значений в столбце 18 показало следующее:

8      78023
9      62578
6      61253
4      60185
8.0    56418
3      50360
2      48276
9.0    45599
7      45021
6.0    44621
4.0    43727
3.0    36419
2.0    34955
7.0    32912
5      32292
5.0    23018
1      20997
1.0    15215
X        373
Name: CAMEO_DEUG_2015, dtype: int64

В столбце, который в остальном является числовым, были строковые значения («X»). Судя по предоставленному файлу Excel, этот столбец не должен содержать ничего, кроме числовых данных, поэтому эти значения были заменены на nan. То же самое было и в двух других столбцах, и было применено то же решение.

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

Словарь поиска был создан с использованием файла Excel для сопоставления имен столбцов со значениями, используемыми для неизвестных данных (например, «AGER_TYP»: -1). Затем это использовалось для замены этих значений на nan в наборе данных.

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

Недостающие данные

Затем набор данных был проверен на наличие отсутствующих данных. Во-первых, это было сделано по столбцам — чтобы увидеть, есть ли какие-либо столбцы с особенно высокой долей (> 50%) отсутствующих данных. Вот что было найдено в наборе данных AZDIAS:

Эти столбцы были удалены. Затем была проверена доля недостающих данных в каждой строке. Результаты показаны на гистограмме ниже:

Он показывает, что более 80% строк в наборе данных AZDIAS содержат ‹10% пропущенных значений. Было выбрано удаление любой строки с >20% пропущенных значений.

Любые оставшиеся отсутствующие значения были импутированы с использованием наиболее часто встречающегося (модального) значения в столбце.

Нечисловые данные

Наконец, были проверены нечисловые столбцы:

Из этих:

  • CAMEO_DEUG_2015 и CAMEO_INTL_2015 разрешаются путем удаления недопустимых строк «X», как обсуждалось ранее.
  • D19_LETZTER_KAUF_BRANCHE и EINGEFUEGT_AM — неизвестные столбцы (описание в файле Excel отсутствует) и удаляются.

Осталось разрешить только CAMEO_DEU_2015 и OST_WEST_KZ. Они были закодированы цифрами. Например, до кодирования значения в столбце OST_WEST_KZ были такими:

W    629528
O    168545
Name: OST_WEST_KZ, dtype: int64

После кодирования они были:

1    629528
0    168545
Name: OST_WEST_KZ, dtype: int64

Строка «W» была закодирована как 1, а строка «O» как 0.

Эта процедура очистки была применена к наборам данных AZDIAS и CUSTOMERS с одинаковыми удалениями столбцов и правилами кодирования, используемыми в обоих.

Сегментация клиентов: неконтролируемая модель

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

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

Для этого использовалась K-кластеризация. Чтобы уменьшить вычислительную сложность этого процесса, размерность наборов данных была уменьшена с помощью PCA (анализ основных компонентов). Это идентифицирует аспекты данных, которые объясняют большую часть дисперсии, наблюдаемой в данных, и позволяет отбросить остальные.

СПС

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

Был выбран порог 85% объясненной дисперсии; это достигается всего за 104 компонента (по сравнению с 269 столбцами в исходном наборе данных).

кластеризация k-средних

Затем к этому сокращенному набору данных была применена кластеризация K-средних. На приведенной ниже диаграмме показана инерция (сумма квадратов расстояний от образцов до их ближайшего центра кластера) для увеличения числа кластеров.

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

Затем был создан конвейер, применяющий PCA (со 104 компонентами) и кластеры k-средних (с 10 кластерами). Это было установлено с использованием набора данных AZDIAS, а затем применено к наборам данных AZDIAS и CUSTOMERS; это позволяет сравнивать кластеры в каждом наборе данных.

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

Наконец, разница в процентных пунктах была рассчитана для каждого кластера, и кластеры отсортированы в порядке убывания. Это выделяет кластеры, в которых клиенты представлены чрезмерно или недостаточно по сравнению с населением в целом.

Это показывает, что в кластерах 8 и 3 самая высокая представленность клиентов, а в кластерах 4 и 2 самая низкая представленность клиентов. Значения этих кластеров были изучены, чтобы получить представление о демографии, стоящей за ними.

Кластерные значения

Конвейер PCA/кластеризации был «обратен», чтобы восстановить исходные столбцы, выявив те, которые оказали наибольшее влияние на определение данного кластера.

Этот процесс был применен к двум верхним (8 и 3) и двум нижним (4 и 2) кластерам, чтобы понять факторы, которые определяют положительную и отрицательную корреляцию с тем, чтобы быть клиентом, соответственно.

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

Кластеры 8 и 3 показывают, что клиенты больше склонны:

  • Живите в районе с высокой долей дорогих автомобилей (BMW и Mercedes-Benz).
  • Живите в районе с высокой долей мощных автомобилей (максимальная скорость › 210 км/ч, мощность двигателя › 121 кВт).
  • Низкая мобильность, владение домами в районах с низкой плотностью населения.
  • Иметь средний доход.
  • Иметь интерес к финансам (вывод из «низкий финансовый интерес» означает «низкий»).

Кластеры 4 и 2 показывают, что клиенты менее склонны:

  • Будьте финансовыми инвесторами или вкладчиками денег.
  • Быть «рабочим классом».
  • Живите в районе, состоящем в основном из 6–10 семейных домов (т. е. с высокой плотностью населения).

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

Прогнозирование клиентов: контролируемая модель

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

Набор данных MAILOUT состоял из двух разделов:

  1. Набор данных TRAIN со столбцом, указывающим, является ли физическое лицо клиентом. Этот набор данных был разделен на обучающую и тестовую части для разработки контролируемой модели.
  2. Набор данных TEST для прогнозирования. Прогнозы, сделанные на основе этого набора данных, были отправлены на конкурс Kaggle для подсчета очков.

Набор данных TRAIN был очищен так же, как и более ранние наборы данных AZDIAS и CUSTOMERS; недействительные данные заменены/удалены, нулевые значения удалены или заменены, а нечисловые данные закодированы.

Дисбаланс

Глядя на данные TRAIN, становится ясно, что они сильно несбалансированы:

Класс «1» (представляющий клиента) недопредставлен; только 1,2% набора данных. Риск заключается в том, что модель может переоценить класс большинства (0; не клиент), если она оценивается по такому показателю, как точность.

Чтобы избежать этой проблемы, в качестве оценочной метрики для тестируемых моделей был выбран ROC AUC.

Разработка модели

Окончательная модель была получена после оценки ряда подходов:

  1. Были протестированы различные модели машинного обучения:
     – Логистическая регрессия
     – Случайный лес
     – Адаптивный бустинг (AdaBoost)
     – Градиентный бустинг.
  2. Включение всех столбцов по сравнению с наиболее важными столбцами из кластеров, найденных в неконтролируемой модели.
  3. Гиперпараметрическая настройка лучшей комбинации модель/столбцы с использованием GridSearchCV.

Первоначально четыре модели были протестированы с использованием их параметров по умолчанию и всех столбцов в наборе данных. Были построены кривые ROC и рассчитан показатель AUC.

Модель логистической регрессии показала лучшие результаты с показателем ROC AUC 0,6119. Поэтому эта модель была выбрана в качестве основы для оптимизации.

Количество столбцов для включения

В результате сегментации клиентов было обнаружено, что определенные кластеры либо положительно (кластеры 8 и 3), либо отрицательно (кластеры 4 и 2) коррелируют с вероятностью быть клиентом.

Поэтому столбцы, оказывающие наибольшее влияние на эти кластеры, вероятно, будут наиболее ценными для включения в модель.

Была написана функция для возврата n наиболее важных столбцов в зависимости от их важности в кластерах 8, 3, 4 и 2. Затем была создана модель с этими n столбцами, и рассчитана оценка ROC AUC. На приведенной ниже диаграмме показана производительность модели с параметрами n в диапазоне от 1 до 269 (все столбцы).

Пиковая производительность достигается при включении 48 наиболее важных столбцов. Это дает показатель ROC AUC 0,6743; улучшение на 10% по сравнению с исходной моделью, использующей все 269 столбцов!

Настройка гиперпараметров

Для дальнейшей оптимизации модели использовалась настройка гиперпараметров с использованием GridSearchCV. Были исследованы следующие параметры:

  • «штраф»: l1, l2 и none.
  • «решатель»: lbfgs, liblinear и sag.
  • «C»: 15 значений от 0,1 до 1,0 с логарифмическим интервалом.

Как и ранее, в качестве метода оценки использовалась ROC AUC. Не все перестановки этих параметров допустимы (например, штраф l1 с решателем sag); недопустимые комбинации возвращают нан в качестве оценки.

Оптимизированная модель имеет показатель ROC AUC 0,6753; небольшое улучшение по сравнению с предыдущей оценкой 0,6743. Оптимизированными параметрами были:

  • «пенальти»: l1
  • «решатель»: liblinear
  • ‘C’: 0.7197

Прогнозы клиентов и конкуренция Kaggle

Затем оптимизированная модель использовалась для прогнозирования набора данных TEST; чтобы предсказать вероятность каждой строки, представляющей клиента. Результатом был DataFrame с двумя столбцами: идентификационный номер человека (LNR) и относительная вероятность того, что соответствующий человек является клиентом компании, занимающейся доставкой по почте (RESPONSE). Это было экспортировано в файл CSV.

Затем производительность модели оценивалась путем отправки этих прогнозов на конкурс Kaggle (сейчас закрытый). Конкурс оценивал прогнозы с использованием оценки ROC AUC.

Представленные прогнозы дали оценку 0,62202. Это не особенно впечатляет, но, по крайней мере, лучше, чем можно было бы ожидать при случайном выборе (оценка 0,5)!

Заключение

Отражение

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

  • Исследование данных
  • Предварительная обработка данных
  • Внедрение и доработка моделей
  • Оценка и проверка модели

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

В данном случае это осложнялось рядом факторов:

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

В результате некоторые решения о том, как предварительно обрабатывать данные, были основаны исключительно на моей собственной интерпретации данных; что было важно, что можно было отбросить, как и что кодировать и т. д. Я могу себе представить, что этапы предварительной обработки выглядели бы совсем по-другому, если бы у меня был доступ к одному из экспертов Arvato (говорящих по-немецки)!

Улучшение

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

  • Очистка данных: 94 столбца были удалены из-за отсутствия значений, указанных в прилагаемых файлах Excel. Это был быстрый и удобный способ обработки неоднозначных данных, но, потратив больше времени и усилий, можно было бы сохранить эти столбцы и включить их в анализ.
  • Обработка категориальных столбцов. В этой реализации категориальные столбцы просто кодировались числовым кодом. Возможно, для некоторых из этих столбцов лучше было бы выбрать горячее кодирование.
  • Выбор модели: из-за ограничений по времени вычислений тип модели (логистическая регрессия, случайный лес и т. д.) был выбран исключительно на основе ее производительности с использованием параметров по умолчанию и всех столбцов. Возможно, другой тип модели с оптимизированными параметрами и количеством столбцов может превзойти выбранную модель.

Если эти улучшения будут реализованы, я уверен, что можно было бы добиться лучшего результата в конкурсе Kaggle!

Дополнительная информация

Код, написанный для выполнения этого анализа, доступен в моем репозитории GitHub. Наборы данных не являются общедоступными; к ним можно получить доступ через программу Udacity Data Scientist Nanodegree.