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

Введение

«Отчет о сегментации клиентов для Arvato Financial Solutions» был одним из проектов, предложенных для программы инженеров по машинному обучению Nanodegree Udacity. Основная цель проекта заключалась в том, чтобы определить описательный портрет потенциального клиента и шансы того, что новый человек из целевой рассылки может стать новым клиентом.

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

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

1. Анализ данных и предварительная обработка

2. отчет о сегментации клиентов;

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

4. конкурс Kaggle;

Данные обучения защищены в соответствии с Условиями использования и недоступны для общего доступа.

Постановка задачи

Формулировка задачи: «По предоставленным демографическим данным немецкого населения и текущих клиентов компании, занимающейся доставкой по почте, определить описание целевых групп клиентов для данной компании и проверить, какие новые лица могут быть привлечены в качестве новых клиентов. и на каком основании».

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

Наборы данных и входные данные

Все данные были предоставлены Bertelsmann Arvato Analytics; для этого проекта было предоставлено четыре файла:

  • Udacity_AZDIAS_052018.csv: демографические данные для населения Германии в целом; 891 211 лиц (строк) x 366 признаков (столбцов).
  • Udacity_CUSTOMERS_052018.csv: демографические данные клиентов компании, занимающейся доставкой по почте; 191 652 человека (строки) x 369 признаков (столбцы).
  • Udacity_MAILOUT_052018_TRAIN.csv: демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 982 лиц (строки) x 367 (столбцы).
  • Udacity_MAILOUT_052018_TEST.csv: демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 833 лиц (строки) x 366 (столбцы).

Дополнительно было еще 2 файла для описания атрибутов:

  • Атрибуты DIAS — значения 2017.xlsx: поясняет кодировку значений.
  • Уровни информации DIAS — атрибуты 2017.xlsx: поясняет значения имен столбцов.

Каждая строка в файлах демографических данных представляет и описывает человека, а также его или ее окружение, например домохозяйство, здание и район. Общая структура файлов данных AZDIAS и CUSTOMERS аналогична. MAILOUT…TEST и MAILOUT…TRAIN были предоставлены для разработки и тестирования контролируемой модели.

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

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

Это предупреждение означает, что в столбцах 18 и 19 хранится комбинация разных типов. Причиной предупреждения является фактическое сочетание типов с плавающей запятой, целого числа и строки. Можно преобразовать целое число в число с плавающей запятой и просто преобразовать значения «XX» в NaN с помощью NumPy.nan.

Отсутствующие данные

Я определил, что в файлах CUSTOMERS и AZDIAS были 3 различных типа отсутствующих данных:

  • Значения NaN, присутствующие в наборе данных с самого начала
  • Значения «X» и «XX» в столбцах 18 и 19, которые были обработаны и преобразованы в значения NaN.
  • В файле «Атрибуты DIAS — значения 2017.xlsx» в столбце «Значение» есть соответствующие кодировки для неизвестных значений, представленных числами.

Определить выбросы

В «Атрибутах DIAS — Значения 2017.xlsx» содержится информация о диапазонах надлежащей информации для каждого столбца, а это значит, что если значение из соответствующего столбца лежит за пределами указанного диапазона, это значение однозначно является ошибкой, с которой нужно как-то обращаться .

Диапазоны значений для KBA05_MODTEMP, LP_FAMILIE_FEIN, LP_FAMILIE_GROB, LP_LEBENSPHASE_FEIN, LP_LEBENSPHASE_GROB, ORTSGR_KLS9 были от 1 до 11, поэтому все остальные значения, кроме NaN, не должны существовать. В случае с GEBURTSJAHR, который является годом рождения, 0 не имеет смысла.

Я также проверил значения, которые были меньше нижнего квартиля и выше верхнего квартиля в ANZ_HAUSHALTE_AKTIV, ANZ_HH_TITEL, ANZ_PERSONEN, ANZ_TITEL.

Данные с завышенной категорией

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

Список столбцов, которые должны были быть перезаписаны, если они не будут удалены позже:

ALTER_HH, CAMEO_DEU_2015, CAMEO_DEUINTL_2015, LP_FAMILIE_FEIN, LP_FAMILIE_GROB, LP_LEBENSPHASE_FEIN, LP_LEBENSPHASE_GROB, LP_STATUS_FEIN, LP_STATUS_GROB, PRAEGENDE_JUGENDJAHRE

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

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

  • Обработка смешанных типов в столбцах 18 и 19;
  • Замените закодированные неизвестные значения на NumPy.nan;
  • Проверить наличие выбросов в столбцах ANZ_HAUSHALTE_AKTIV, ANZ_HH_TITEL, ANZ_PERSONEN, ANZ_TITEL, KBA13_ANZAHL_PKW, если да, то удалить;
  • Вычислите процент значений NaN по столбцам и строкам. Отбросить столбцы, в которых процент выше 30, удалить строку, где процент выше 50;
  • Рассчитайте корреляцию признаков, удалите столбцы, где процент корреляции выше 90.
  • Разработка функций;
  • Масштабирование функций;

Очистка недостающих данных

Во-первых, я проверил набор данных на количество отсутствующих данных по столбцам и по строкам. В некоторых случаях процент пропущенных значений был чрезвычайно высок (почти 100%).

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

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

Разработка функций

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

  • CAMEO_INTL_2015 в CAMEO_INTL_2015_wealth_type и CAMEO_INTL_2015_family_type.
  • LP_LEBENSPHASE_FEIN в LP_LEBENSPHASE_FEIN_family_type, LP_LEBENSPHASE_FEIN_earner_type, LP_LEBENSPHASE_FEIN_age_group.
  • PRAEGENDE_JUGENDJAHRE в PRAEGENDE_JUGENDJAHRE_движение и PRAEGENDE_JUGENDJAHRE_decade

Все столбцы, содержащие нечисловые значения, были закодированы метками с помощью класса LabelEncoder scikit-learn.

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

Удалить сильно коррелированные функции

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

Масштабирование функций

Перед тем, как перейти к уменьшению размерности, нам нужно применить масштабирование признаков к наборам данных, чтобы на модель не влияли естественные различия в масштабе данных и мы не получили бы вводящие в заблуждение компоненты PCA. Для преобразования я решил использовать MinMaxScaler от Scikit-learn, который масштабирует данные в диапазоне от 0 до 1. Однако было бы неплохо попробовать StandartScaler.

Неконтролируемые модели

Анализ главных компонентов (PCA)

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

Судя по графику, мы можем заключить, что 125 признаков могут покрыть более 90 % дисперсии в наборе данных. Таким образом, теперь мы можем уменьшить количество признаков до 125.

Метод локтя

Следующий шаг — кластеризация. Однако, прежде чем мы сможем разделить популяцию на разные сегменты, нам нужно определить идеальное количество кластеров (значение k). Для решения этой задачи одним из вариантов является реализация Метода локтя.

«Метод локтя — это эвристика, используемая для определения количества кластеров в наборе данных. Метод состоит в построении графика объясненной вариации в зависимости от количества кластеров и выборе изгиба кривой в качестве количества используемых кластеров. — Википедия. «Метод локтя».

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

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

K-средние

Основываясь на Методе локтя ранее, мы решили реализовать K-Means с 9 кластерами. После подбора преобразованных данных с помощью PCA в модель K-средних мы получили следующие результаты:

Согласно диаграмме кластеры 1 и 4 могут представлять функции для целевых клиентов, в то время как кластер 0 представляет те функции, которые исключают основных клиентов.

В заключение, на то, что человек является потенциальным клиентом, положительно влияет актуальность последних сделок, пол, является ли человек из ГДР или ФРГ, человек должен иметь хороший социальный статус, человек властен и мечтателен, и имеет прекрасный семейный тип. В то время как такие характеристики, как финансовая типология = экономия денег, количество 6–10 семейных домов в PLZ8 и плотность населения на квадратный километр, оказывают негативное влияние.

Прогнозное моделирование

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

Результат обучения был следующим:

Определенными лидерами являются XGBoost, AdaBoost и Gradient Boosting. Однако, несмотря на то, что результаты XGBoost и Gradient Boosting очень близки, XGBoost оказался быстрее на тренировке. Поэтому нам следует продолжить работу с XGBoost и AdaBoost.

Метрики

Проект относится к проблеме бинарной классификации и имеет сильно несбалансированные данные.

Следовательно, по этой причине наилучшей оценочной метрикой будет площадь под кривой рабочих характеристик приемника (AUC-ROC).

AUC-ROC используется для визуализации соотношения истинных положительных результатов и ложных положительных результатов. Когда AUC равно 1, это означает, что Истинно положительные и Истинно отрицательные не связаны между собой и полностью различимы, а AUC равно 0 означает, что модель делает прямо противоположную классификацию (все истинные отрицательные значения классифицируются как положительные и наоборот).

Короче говоря, чем ближе к 1 результат AUC-ROC, тем выше производительность модели.

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

После экспериментов с различными алгоритмами машинного обучения мы можем перейти к настройке гиперпараметров. В качестве варианта оптимизации я выбрал GridSearchCV.

«Поиск по сетке, предоставляемый GridSearchCV, полностью генерирует кандидатов из сетки указанных значений параметров. — Scikit-learn, «Настройка гиперпараметров оценщика».

В итоге лучший результат был у AdaBoost, который, согласно AUC-ROC, составил 79,4%.

Обоснование

Кроме того, согласно моей модели, функция D19_SOZIALES оказала наибольшее влияние. К сожалению, в «Информационные уровни DIAS — Атрибуты 2017.xlsx» для него нет описания. Хотя из-за префикса D19 могу предположить, что он как-то связан с уровнем информации о домохозяйстве.

Вообще говоря, идеальная точность должна быть более 90%. Тем не менее, предоставленное решение адекватно справляется с проблемой.

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

Окончательные прогнозы были сделаны на Udacity_MAILOUT_052018_TEST.csv, который был предварительно обработан как обучающий набор.

Частный балл окончательной производительности моей модели составил 0,79, на конкурсе Kaggle ей также удалось удержать точность 0,79 согласно метрике оценки AUC-ROC, которая хороший результат. Тем не менее, есть много возможностей для улучшения.

Вывод

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

Отчет о сегментации клиентов для проекта Arvato Financial Services принес мне много нового опыта и помог применить знания, полученные во время учебы в Nanodegree. Этот проект представляет собой представление реальной проблемы в области анализа данных и науки о данных.

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

Код этого проекта вы можете найти в этом репозитории Github :)

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

[1] К науке о данных, Фундаментальные методы разработки признаков для машинного обучения, Эмре Ренчбероглу. [Онлайн]. Доступно: https://towardsdatascience.com/feature-engineering-for-machine-learning-3a5e293a5114#ad97/ [По состоянию на 13 октября 2020 г.]

[2] «Кластеризация K-средних с помощью анализа основных компонентов», Крис Динг. 2004 г.

[3] Scikit-learn, Классификация ближайших соседей. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/neighbors.html#classification/ [По состоянию на 14 октября 2020 г.]

[4] Scikit-learn, Деревья решений. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/tree.html#tree/ [По состоянию на 14 октября 2020 г.]

[5] Scikit-learn, Леса рандомизированных деревьев. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/ensemble.html#forests-of-randomized-trees [По состоянию на 14 октября 2020 г.]

[6] Scikit-learn, AdaBoost. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/ensemble.html#adaboost [По состоянию на 14 октября 2020 г.]

[7] Scikit-learn, Повышение градиентного дерева. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/ensemble.html#gradient-boosting [По состоянию на 14 октября 2020 г.]

[8] К науке о данных, Фундаментальные методы разработки признаков для машинного обучения, Эмре Ренчбероглу. [Онлайн]. Доступно: https://towardsdatascience.com/feature-engineering-for-machine-learning-3a5e293a5114#ad97/ [По состоянию на 13 октября 2020 г.]

[9] Википедия. Метод локтя. [Онлайн].
Доступно: https://en.wikipedia.org/wiki/Elbow_method_(clustering) [По состоянию на 13 октября 2020 г.]

[10] Скикит-Йеллоубрик, Метод локтя. [Онлайн].
Доступно: https://www.scikit-yb.org/en/latest/api/cluster/elbow.html#/ [По состоянию на 13 октября 2020 г.]

[11] Scikit-learn, Кластеризация. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/clustering.html#k-means/ [По состоянию на 13 октября 2020 г.]

[12] Scikit-learn, Настройка гиперпараметров оценщика. [Онлайн].
Доступно: https://scikit-learn.org/stable/modules/grid_search.html#grid-search/ [По состоянию на 13 октября 2020 г.]