Отчет по ключевому проекту Udacity Data Science Nanodegree: Отчет по сегментации клиентов для Arvato Financial Services

Введение

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

В этом проекте мы проанализируем демографические данные клиентов компании по доставке товаров по почте Arvato в Германии и сравним их с демографическими данными для населения в целом.

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

«Учитывая демографические данные человека, как компания, занимающаяся доставкой по почте, может привлечь новых клиентов»

Мы подходим к этому проекту в 2 этапа:

  1. В первой части проекта мы будем использовать методы неконтролируемого обучения для сегментации клиентов, определяя части населения, которые лучше всего описывают основную клиентскую базу компании. Чтобы добиться этого, мы собираемся использовать метод уменьшения размерности, такой как PCA, чтобы уменьшить объем данных, а затем алгоритм неконтролируемой кластеризации, чтобы найти различные типы клиентов.
  2. Затем мы воспользуемся моделью для прогнозирования на основе демографической информации, какие люди с наибольшей вероятностью превратятся в клиентов компании. Что касается прогноза, мы собираемся протестировать различные модели машинного обучения, такие как Random Forest и Xgboost. После краткого тестирования различных моделей мы постараемся сосредоточиться на тех, которые получили наилучшие результаты, и оптимизировать гиперпараметры с помощью байесовской оптимизации.

Показатель оценки

Прогноз будет оцениваться в Kaggle Competition. Из-за того, что метки сильно несбалансированы, в качестве оценочной метрики использовалась AUC для ROC-кривой. AUC учитывает как истинно положительные, так и ложноположительные результаты. ROC, или рабочая характеристика приемника, представляет собой график, используемый для построения истинно положительного уровня (TPR, доля фактических клиентов, которые помечены как таковые) по сравнению с уровнем ложных срабатываний (FPR, доля неклиентов, помеченных как клиенты). Мы можем проверить на графике ниже, насколько несбалансированы 2 класса.

Кроме того, конкурс Kaggle также использует AUCROC в качестве метрики оценки.

Исследовательский анализ данных

Это самый важный шаг в проекте, поэтому стоит потратить на него больше всего времени.

Во-первых, давайте посмотрим на наборы данных:

AZDIAS: демографические данные по населению Германии в целом.

Клиенты. Демографические данные клиентов компании, занимающейся доставкой по почте.

MAILOUT Train/Test: демографические данные для лиц, ставших мишенями маркетинговой кампании.

С первого взгляда видно, что в наших наборах данных много значений Nan, и большинство признаков являются порядковыми или категориальными (360 из 366 в наборе данных AZDIAS).

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

  • Dias Information Levels — Attribute 2017.xlsx: список атрибутов и описаний верхнего уровня, упорядоченных по информационным категориям.
  • Dias Attribute-Values ​​2017.xlsx: подробное описание значений данных для некоторых функций.

Адресация столбцов смешанного типа

Пока я читал файл AZDIAS, я получил предупреждение: «DtypeWarning: Столбцы (18,19) имеют смешанные типы». Это столбцы CAMEO_INTL_2015 и CAMEO_DEUG_2015. Значение «XX» и «X» соответственно, поэтому я решил заменить их на Nan, так как я не знаю, что они представляют.

Адресация неизвестных значений

Для большинства функций у нас есть описание значения их значений из файла Dias Attribute-Values ​​2017.xlsx. Во многих функциях я заметил, что есть значение с описанием «Неизвестно», но есть также значения nan. Поэтому я решил заменить все значения, что их значение «неизвестно», на nan.

Отсутствующие значения для каждой функции

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

Отсутствующие значения для каждого пользователя

На графике ниже ясно видно, что большинство пользователей в наборе данных Azdias and Customer не пропускают более 50% своих функций.

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

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

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

  • OST_WEST_KZ: двоичный объект, который будет перекодирован в 0 и 1.
  • LNR: избыточная функция имеет разное значение для каждого пользователя, вероятно, это идентификатор пользователя.
  • D19_LETZTER_KAUF_BRANCHE:использование pd.get_dummies. Преобразование категориальной переменной в фиктивные/индикаторные переменные
  • EINGEFUEGT_AM:это функция формата даты, в которой для простоты я оставляю только год.

Отсутствующие значения

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

Сегментация клиентов

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

Снижение размерности

Анализ основных компонентов (АПК)

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

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

Для использования анализа основных компонентов мы должны выполнить масштабирование признаков, чтобы разные масштабы для каждого признака не имели никакого эффекта. Был использован StandardScale, который масштабирует каждую из функций до среднего значения 0, а стандартное значение равно 1.

На следующем рисунке мы можем увидеть объяснение кумулятивной дисперсии и сделать вывод, что ~ 90% дисперсии объясняется первыми 200 компонентами PCA. Таким образом, мы можем уменьшить количество функций с 389 до 250.

Анализ компонентов

Компонент 4 соответствует людям, которые имеют более дорогой или люксовый автомобиль, такой как BMW или Mercedes. Кроме того, у людей с более дорогими автомобилями больше шансов иметь спортивный автомобиль и меньше пятиместных автомобилей.

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

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

K означает

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

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

Мы повторяем значения k от 1 до 20 и вычисляем значения искажений для каждого значения k и вычисляем искажение и инерцию для каждого значения k в заданном диапазоне.

Чтобы определить оптимальное количество кластеров, мы должны выбрать значение k в «локте», то есть в точке, после которой искажение/инерция начинает линейно уменьшаться. Таким образом, для данных данных мы заключаем, что оптимальное количество кластеров для данных равно 9. [3]

Сравните данные о клиентах с демографическими данными

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

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

Первое замечание заключается в том, что в некоторых кластерах популяция клиентов чрезмерно представлена. Три кластера с наибольшей степенью избыточного представления: кластер 1, кластер 6 и кластер 8. Таким образом, это говорит о том, что эти кластеры с большей вероятностью будут клиентами. По той же логике кластер 9, кластер 10 и кластер 2 вряд ли будут потенциальными клиентами.

Если мы изучим функцию "HH_EINKOMMEN_SCORE"в наборе данных о клиентахв кластерах 8 и 10, мы ясно увидим разницу. На рисунке ниже целевой рассмотрим кластер, в котором процент клиентов выше, в данном случае кластер 8, и нецелевой противоположный кластер 10.

Вот описание данных в предоставленном листе файла Excel:

1, 0: неизвестно

1: самый высокий доход

2: очень высокий доход

3: высокий доход

4: средний доход

5: низкий доход

6: очень низкий доход

Очевидно, что компания должна ориентироваться на клиентов с более высоким доходом, и PCA/Kmeans считает это правильным.

Функция LP_STATUS_FEIN показывает социальный статус, чем выше, тем лучше.

Привлечение клиентов

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

Есть много моделей машинного обучения на выбор. Я начинаю с выбора Random Forest, AdaBoost, SVC и XG boost. Производительность этих моделей, основанная на 5-кратной перекрестной проверке, где 5 означает количество групп, на которые должна быть разбита данная выборка данных, показана на рисунке ниже. Параметры для каждой модели были по умолчанию библиотеки sklearn.

Из-за приведенных выше оценок я решил сосредоточиться на алгоритмах повышения и оптимизировать их гиперпараметры. После тестирования я сосредоточился на трех разных моделях: «LGBMClassifier», «XGBoostClassifier» и «CatBoostClassifier».

Байесовская оптимизация

Байесовская оптимизация обучает модель машинного обучения прогнозировать наилучшие гиперпараметры. Для каждого набора гиперпараметров вы получаете разную производительность модели и, следовательно, разные результаты по вашей метрике производительности. Поиск по сетке и случайный поиск решат проблему, просто просматривая все пространство параметров вслепую (либо систематически в сетке, либо просто случайным образом). Но модели с большим пространством параметров, такие как XGBoost, работают медленно и крайне неэффективно. Байесовская оптимизация, с другой стороны, строит модель для функции оптимизации и систематически исследует пространство параметров, что является умным и гораздо более быстрым способом найти ваши параметры.

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

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

Лучший результат среди трех алгоритмов был у Cat Boost.В отличие от XGBoost или других моделей машинного обучения, CatBoost лучше работает с категориальными переменными в их исходной форме, поэтому он, вероятно, дает лучшие результаты. CatBoost отличается от других моделей машинного обучения. LightGBM и XGBoost, сосредоточившись на оптимизации деревьев решений для категориальных переменных или переменных, разные значения которых могут не иметь отношения друг к другу (например, яблоки и апельсины). CatBoost автоматически определяет различные категории без предварительной обработки. Большое преимущество выполнения этого в алгоритме по сравнению с фазой предварительной обработки заключается в том, что вы можете настроить кодировку при выполнении начальной выборки строк.

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

Наконец, я отправляю результат на конкурс Kaggle и получаю 0,79813 roc_auc_score (кривая рабочих характеристик приемника).

Объект BayesianOptimization будет работать из коробки без особой настройки. Я использовал пакет bayesian-optimization, а основной метод, о котором вам следует знать, — это maximize, который делает именно то, что вы думаете (подробнее см. здесь).

Есть много параметров, которые вы можете передать, чтобы максимизировать, тем не менее, наиболее важными из них являются:

  • n_iter: Сколько шагов байесовской оптимизации вы хотите выполнить. Чем больше шагов, тем больше шансов найти хороший максимум.
  • init_points: Сколько шагов случайного исследования вы хотите выполнить. Случайное исследование может помочь, диверсифицируя пространство исследования.
optimizer.maximize(
    init_points=2,
    n_iter=3,
)

Гиперпараметры, которые я пытался оптимизировать для повышения кота:

Depth of the tree:
'depth': (1, 4)
Coefficient at the L2 regularization term of the cost function.
'l2_leaf_reg': (2, 30)
The maximum number of trees that can be built when solving machine learning problems.
'num_boost_round': (100, 1000)

Таким образом, лучшие параметры — это depth=3, l2_leaf_reg=27.7 и num_boost_round=948. Другие фиксированные параметры:

params = {
"loss_function": "Logloss",
"eval_metric" : "AUC",
"learning_rate" : 0.01,
"random_state" : 42,
"logging_level" : "Silent",
"thread_count": 24,
}

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

Для настройки гиперпараметров xgboost и light boost вы можете проверить следующие блокноты: LightGBM.ipynb и XGBoost.ipynb.

Важность функции по модели Catboost:

Мы видим, что самой важной переменной является «D19_SOZIALES».

Осложнения

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

Вывод

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

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

Использовать свойства столбца/функции для предварительной обработки данных

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

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

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

Дальнейшие шаги

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

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

Исходный код проекта можно найти в этом репозитории Github.

И последнее, но не менее важное: я хотел бы поблагодарить Udacity и Арвато Бертельсманна за набор данных и возможность работать с этим образовательным проектом. Спасибо за ваше время, и если вы хотите получить дополнительную информацию о нано-степени Udacity Data Scientist, обратитесь сюда.

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