Проект по кластеризации и контролируемым методам обучения

Введение

В качестве заключительной части Наностепени Udacity Data Scientist у меня была возможность создать свой собственный завершающий проект, чтобы продемонстрировать навыки, освоенные в ходе курса. Данные предоставлены Arvata Financial Solutions.

Целью этого проекта было создание модели, предсказывающей вероятность того, что человек станет клиентом компании, занимающейся доставкой по почте в Германии. Первая часть проекта заключалась в анализе предоставленных данных и визуализации важной и актуальной информации. Затем были использованы неконтролируемые методы обучения, такие как анализ основных компонентов (PCA) и кластеризация k-средних, для сравнения и кластеризации двух групп существующих клиентов и населения Германии в целом.

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

Стратегия решения проблемы

  1. Анализ данных: знакомство с данными, их очистка и создание значимых визуализаций.
  2. Отчет о сегментации клиентов: создавайте кластеры, чтобы различать клиентов и население в целом в Германии.
  3. Модель контролируемого обучения: в этой части была обучена модель, которая предсказывает, является ли кто-то потенциальным клиентом, на основе демографических данных.

И последнее, но не менее важное: был создан тестовый набор данных для прогнозирования и загрузки в Kaggle (конкурс Kaggle).

Метрики

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

Вы можете найти соответствующий репозиторий здесь:

https://github.com/jonastheiler/customer-segmentation-report

Анализ данных

Полную версию исследовательского анализа данных можно найти в Jupyter Notebook на Github. Как упоминалось выше, данные были предоставлены Arvata Financial Solutions и в целом были очень хорошего качества. Были предоставлены следующие наборы данных:

  • 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 (столбцы)

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

Чтобы достичь этого, я решил работать с первым, самым большим набором данных, чтобы получить некоторые полезные идеи. Во-первых, мне нужно было определить, какие значения на самом деле отсутствовали. Поскольку многие записи были помечены не как «NaN», а как «0», «-1», «X» или «XX», необходимо было создать словарь, содержащий значения, указывающие на такие специальные обработки для каждого ключа.

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

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

Далее был проведен анализ качества данных для каждой строки. Большинство точек данных имеют 10% или менее отсутствующих значений. Поэтому я решил удалить оставшиеся строки.

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

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

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



Первое, что я сделал, это уменьшил габариты. По-прежнему объясняя более 95% дисперсии данных, можно было исключить более 110 или около 31% столбцов. Для этого шага я создал конвейер с помощью StandardScaler и PCA (анализ основных компонентов) и подогнал соответствующую модель.

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

Учитывая это представление, я решил использовать k=10. Со вторым конвейером я теперь смог построить модель для прогнозирования кластеров для двух наборов данных (общая популяция = Azdias и клиенты). Вот как выглядит результат:

Интересующие кластеры на самом деле были кластером 4 с атрибутами, типичными для клиентов, и кластером 1, которые не являются таковыми. Теперь мы можем рассмотреть кластер 4 более подробно. Атрибуты, которые наиболее сильно коррелируют, следующие:

  • Высокий доход
  • Низкая доля относительно медленных автомобилей
  • Высокая покупательная способность
  • Высокая доля мощных автомобилей
  • Высокая доля BMW или Mercedes
  • Принадлежит к зеленому авангарду

Веса кластера 4 можно изобразить в упорядоченном направлении следующим образом:

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

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



Я выбрал RandomForestClassifier и GradientBoostingClassifier. Эти два кажутся подходящими для широкого круга различных задач контролируемого обучения. Результатом функции было следующее:

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

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

На следующем этапе я попытался получить максимальную отдачу от GradientBoostingClassifier, используя GridSearchCV:

Полученные результаты

Лучший классификатор (я сделал около 48 различных настроек параметров) дал оценку ROC-AUC 0,69. На следующей диаграмме показана оценка лучшего параметра:

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

На последнем этапе я создал файл отправки для конкурса Kaggle. Процесс работал хорошо, и я получил за загрузку 0,54 балла.

Заключение и улучшения

Хотя это упражнение было очень утомительным (особенно в начале), оно снова стало для меня отличным опытом и моим путешествием в науку о данных. Я хотел бы отметить несколько моментов:

  • Анализ данных в начале был самой сложной частью. Процесс очистки следовал логической структуре, но казался немного рудиментарным. Помимо удаления столбцов и строк и преобразования некоторых других столбцов, было бы гораздо больше возможностей. Можно запросить дубликаты, ковариации между признаками, асимметрию или более детальное изучение удаленных столбцов, и это лишь некоторые из возможностей.
  • PCA и кластеризация сильно зависят от предыдущей очистки данных. Я относительно доволен этой автономной частью. График локтя мог бы быть более мощным, но сгенерированные кластеры кажутся разумными и логическим следствием проделанной ранее работы.
  • Процесс выбора подходящей модели, безусловно, мог бы быть более подробным и продуманным. Я решил сравнить только два (но очень распространенных) классификатора и сравнил их лицом к лицу. На данный момент я не уверен, что это был правильный выбор, но с настройкой гиперпараметров я получил несколько баллов по метрике ROC-AUC. Загрузка представления Kaggle сработала хорошо, хотя здесь, безусловно, есть место для улучшения оценки.

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