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

Это проект Capstone для специалиста по данным Udacity Nanodegree. Этот проект представляет собой реальную задачу по науке о данных, с которой сталкивается Bertelsmann Arvato Analytics.

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

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

В третьем наборе данных скорость отклика довольно низкая, что указывает на большую проблему дисбаланса выходных классов. Прогнозирование того, ответит ли человек, и использование точности не кажется подходящим методом оценки. Таким образом, AUC (площадь под кривой ROC) используется для оценки производительности модели. Метрика результата — конкурс Kaggle.

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

С этим проектом связаны четыре файла данных:

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

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

Файл «CUSTOMERS» содержит три дополнительных столбца («CUSTOMER_GROUP», «ONLINE_PURCHASE» и «PRODUCT_GROUP»), в которых содержится обширная информация о клиентах, изображенных в файле. Исходный файл «MAILOUT» включал один дополнительный столбец «RESPONSE», в котором указывалось, стал ли каждый получатель клиентом компании. Для подмножества «ПОЕЗД» этот столбец был сохранен, но в подмножестве «ТЕСТ» он был удален.

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

Сначала я анализирую и очищаю azdias(Udacity_AZDIAS_052018.csv), набор данных о населении в целом. Процесс включает в себя работу с пропущенными значениями и категориальными переменными. В последней части я пишу функцию для применения всех шагов.

Работа с пропущенными значениями

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

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

Я удалил все столбцы, в которых пропущено более 35 % значений, и все строки, в которых пропущено более 10 % значений. В результате в наборе данных остается 737201 строка и 355 столбцов.

Работа с категориальными переменными

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

В наборе данных 27 категориальных переменных. Я разделяю их на три типа и отношусь к ним по-разному.

  • Для бинарных переменных: убедитесь, что они сохранены как 0 и 1 в наборе данных.
  • Для многоуровневых переменных: оставьте только значимые переменные (подумайте, может ли переменная помочь классифицировать клиентов и есть ли какие-либо другие переменные, содержащие аналогичную информацию), которые не имеют слишком много уровней.
  • Для переменных, которые содержат два или более типов уровней: разделите их на две или более категориальных переменных и убедитесь, что каждая переменная содержит только один тип уровней (например, PRAEGENDE_JUGENDJAHRE содержит такие уровни, как «40-е годы — военные годы (Mainstream, O+W)» или «80-е годы — экологическое сознание (Avantgarde, W)». Включает в себя «40-е/80-е», «Mainstream/Avantgarde» и «O/W» три вида уровней.)

Затем я создаю фиктивные переменные для тех категориальных переменных, которые имеют два уровня. Набор данных теперь имеет 737201 строку и 406 столбцов.

После применения всех шагов к клиенту (Udacity_CUSTOMERS_052018.csv) он содержит 134242 строки и 409 столбцов.

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

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

Используйте PCA для уменьшения размеров

Поскольку PCA требует, чтобы набор данных не содержал никаких NaN и был стандартизирован, я использую SimpleImputer в scikit-learn, чтобы заменить оставшиеся отсутствующие значения наиболее часто встречающимися значениями и масштабировать набор данных.

На графике осыпи видно, что первые 100 компонентов содержат примерно 70% дисперсии. Первые 150 компонентов содержат более 80% дисперсии. Нам нужно около 200 компонентов, чтобы описать около 90% дисперсии.

Я решил оставить первые 100 компонентов и сохранить 70% информации в наборе данных.

На приведенном выше графике мы можем ясно видеть «локоть» на 5-м компоненте. В этот момент доля дисперсии, объясняемая каждой последующей главной компонентой, падает. Я смотрю на первые 4 компонента, чтобы увидеть, какие функции важны для объяснения дисперсии.

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

  • 1-й компонент измеряет жилую площадь с точки зрения семейных домов, автомобилей и способов передвижения людей.
  • 2-йкомпонент измеряет поведение и характеристики клиентов, включая онлайн-близость, путь клиента и финансовую типологию.
  • 3-йкомпонент использует марку и тип автомобилей для измерения социального статуса людей в жилых помещениях.
  • 4-йкомпонент измеряет поведение и характеристики клиентов, включая финансовую типологию, частоту транзакций и количество людей, прошедших десятилетия.

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

Кластерный анализ

После уменьшения размеров до 100 я использую кластеризацию k-средних для сегментации отдельных лиц. Я тестирую от 2 кластеров до 19 кластеров и записываю SSE:

Основываясь на правиле локтя, я решил оставить 6 кластеров.

Сравнивая долю людей в каждом кластере общей совокупности и набора данных о клиентах, мы можем обнаружить, что кластеры 2, 4 и 5 с большей вероятностью будут клиентами. Кластер 3 менее вероятен. А кластеры 0 и 1 вряд ли будут клиентами.

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

  • Кластер 0: молодые люди с высокой мобильностью, проживающие в 6–10 семейных домах. Они предпочитают онлайн-покупки. Их финансовая типология, скорее всего, будет непримечательной. Они менее подготовлены и не любят экономить. Они маловероятно станут клиентами.
  • Кластер 1: молодыелюди с низкой мобильностью, проживающие в 1–2семейных домах. Как и в кластере 0, они также предпочитают онлайн-покупки. Их финансовая типология, скорее всего, будет непримечательной. Они менее подготовлены и не любят экономить. Кроме того, крайне маловероятно, что они являются клиентами.
  • Кластер 2: молодыелюди с низкой мобильностью, проживающие в 1–2семейных домах. Они не предпочитают онлайн-покупки в такой степени, как кластеры 0 и 1, но имеют высокую онлайн-ассоциацию и частые покупки за последние 24 года. месяцы. Они с большой долей вероятности являются клиентами.
  • Кластер 3: пожилыелюди с высокой мобильностью, проживающие в 6–10семейных домах. Они предпочитают маленькие автомобили с 5 местами. Они не любят онлайн-покупки и имеют низкую онлайн-аффинити. С точки зрения финансовой типологии, они подготовлены. Они с меньшей вероятностью станут клиентами.
  • Кластер 4: пожилыелюди с низкой мобильностью, проживающие в 1–2семейных домах. Им не нравятся онлайн-покупки. С точки зрения финансовой типологии, они готовы экономить деньги. Они с большой долей вероятности станут клиентами.
  • Кластер 5: люди среднего возраста и умеренной мобильности среди всех кластеров, проживающие в 6–10 семейных домах. . Они предпочитают автомобили высшего или среднего класса. Им не нравятся онлайн-покупки. С точки зрения финансовой типологии, они подготовлены. Они также с большой вероятностью станут клиентами.

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

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

Предварительно обработайте данные

Перед построением модели нам необходимо предварительно обработать данные (Udacity_MAILOUT_052018_TRAIN.csv). Поездная часть набора данных рассылки содержит 42962 строки и 367 столбцов. Сначала я очищаю набор данных, как и два предыдущих набора данных, за исключением одного: из набора данных не удаляется ни одна строка. Затем я вменяю NaN, стандартизирую, применяю PCA и группирую набор данных, как и раньше. Результатом является набор данных с 42962 строками и 102 строками — 100 основных компонентов, один столбец для меток кластеров и один столбец для переменной ответа.

Поскольку процент ответов составляет всего 1,2%, набор данных сильно несбалансирован. Чтобы решить эту проблему, я решил удалить образцы (недостаточная выборка) из класса большинства — — лица, которые не ответили, и добавить больше примеров (избыточная выборка) из класса меньшинства — — лица, которые ответили.

Обучить и уточнить модель

Первым шагом является выбор лучшего алгоритма, так как это проблема бинарной классификации. Для построения модели я попробовал самые популярные алгоритмы бинарной классификации, включая логистическую регрессию, случайный лес, регрессию с повышением градиента, AdaBoost и XGBoost. Я использую AUC, чтобы найти модель, которая работает лучше всего. Gradient Boosting Regression лучше всего работает без передискретизации, а XGBoost лучше всего работает с передискретизацией.

Затем я попробовал разные размеры выборки при повторной выборке данных. Я получил самый высокий AUC с размером большинства 2000 и размером меньшинства 1800.

Я уточняю свою модель с помощью Gradient Boosting Regression и XGBoost как с повторной выборкой, так и без нее, и использую GridSearch для поиска наиболее подходящих параметров. Наилучший результат дает модель с XGBoost, а параметры следующие:

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

Для оценки модели используется конкурс Kaggle. После применения всех процедур предварительной обработки к тестовой части набора данных рассылки (Udacity_MAILOUT_052018_TEST.csv) я использую построенную модель для прогнозирования ответа. Представление на Kaggle получило AUC 0,53574.

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

Новая модель также построена с XGBoost. Параметры немного другие:

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

Вывод

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

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

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

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

Весь код и более подробные описания можно найти здесь.