Вступление

Этот проект был заключительным проектом программы Udacity Machine Learning Engineer Nanodegree. Это был один из трех вариантов, а двумя другими были «Оптимизация предложений приложений с помощью Starbucks» и «Использование сверточной нейронной сети для определения пород собак».

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

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

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

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

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

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

Постановка проблемы, которую мы собираемся решить, заключается в следующем: «Как может компания, занимающаяся доставкой по почте органических продуктов питания, более эффективно привлекать новых клиентов?» При создании маркетинговой кампании мы должны решить, кто будет получателем маркетинговых материалов. Каждый раз, когда получатель не отвечает на предложение, это увеличивает стоимость кампании и снижает ожидаемую прибыль. По этой причине мы хотим сузить список вариантов и отправлять предложения только тем получателям, которые с наибольшей вероятностью ответят положительно. Но как мы можем узнать, какие контакты потенциально являются наиболее перспективными? Что ж, мы можем использовать наш прошлый опыт и учиться на нем или на своем чутье. Или мы также можем попытаться использовать данные, если они у нас есть, что будет более подробно объяснено в следующих разделах этого предложения.

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

Метрики

Глядя на данные в наборе данных «аздиас» (население) и наборе данных о клиентах, мы видим, что будем иметь дело с несбалансированными данными, поскольку набор данных о населении примерно в 4 раза больше, чем набор данных о клиентах.

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

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

Анализ

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

Все файлы данных для этого проекта были предоставлены Udacity и Arvato. Основные файлы данных:

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

Еще два файла с метаданными и описанием атрибутов в этих файлах:

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

Обращение к предупреждению

Мы получили некоторые предупреждения уже в начале при загрузке наборов данных.

Это создало потребность проанализировать эти столбцы и увидеть, какие несоответствия есть. Мы обнаружили, что в некоторых столбцах были смешанные десятичные значения и значения, такие как «X» и «XX».

Позже нам пришлось заменить эти значения нулевыми значениями.

Столбцы типа объекта

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

Мы обнаружили, что нам придется исправить еще несколько нарушений внутри столбцов типов объектов:

  • CAMEO_DEU_2015: имеет неопределенное значение «XX». Его нужно будет заменить нулевым значением.
  • CAMEO_DEUG_2015: имеет неопределенное значение «X». Его нужно будет заменить нулевым значением.
  • CAMEO_INTL_2015: имеет неопределенное значение «XX». Его нужно будет заменить нулевым значением.
  • EINGEFUEGT_AM: это поле не описано в дополнительном документе. Если мы переводим это с немецкого, это означает «Вставка времени». Эта информация не актуальна, поэтому это поле будет удалено позже.
  • OST_WEST_KZ: имеет два различных строковых значения, которые мы должны преобразовать в числовые значения.
  • CAMEO_DEUG_2015 и CAMEO_INTL_2015 необходимо будет преобразовать в тип с плавающей запятой.

Столбцы целочисленного типа

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

  • LNR: это поле похоже на идентификатор записи. Это не имеет отношения к анализу, поэтому будет удалено позже.
  • GEBURTSJAHR: имеет значение «0», которое необходимо заменить нулевым значением. Это также настоящий целочисленный столбец.
  • Большинство других целочисленных столбцов имеют очень узкий диапазон различных значений. Это указывает на то, что они на самом деле могут представлять категориальные значения, хотя имеют числовые значения.
  • VERS_TYP и ANREDE_KZ - это столбцы с двоичными значениями (1 и 2), которые необходимо преобразовать в 0 и 1.

Столбцы десятичного типа

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

  • ANZ_HAUSHALTE_AKTIV, ANZ_HH_TITEL, ANZ_PERSONEN, ANZ_TITEL: кажутся реальными числовыми значениями согласно документу «Значения атрибутов DIAS 2017». Позже эти столбцы будут преобразованы в целочисленный тип.
  • MIN_GEBAEUDEJAHR: должен быть преобразован в целочисленный тип.
  • EINGEZOGENAM_HH_JAHR: необходимо преобразовать в целочисленный тип.
  • Десятичные значения на самом деле выглядят как целые числа, потому что они обычно не имеют десятичной части. Это также указывает на то, что внутри десятичных столбцов может быть скрыто много категориальных значений.

Обнаружение «неизвестных» ценностей

Столько несоответствий в данных указывает на то, что их, вероятно, даже больше. Мы просмотрели дополнительный файл «Атрибуты DIAS - Значения 2017.xlsx», чтобы изучить значения данных и лучше понять, как они выглядят. Так мы обнаружили множество атрибутов со значением «неизвестно». Очевидно, это указывает на отсутствие данных для значений этих атрибутов.

У таких атрибутов был диапазон различных значений, таких как «0», «-1» и «9», все они имели значение «неизвестно». Очевидно, нам пришлось заменить эти значения реальными «нулевыми» значениями.

Очистка данных

Мы очистили данные в обоих наборах данных, выполнив следующие преобразования:

  • Значения «X» и «XX» заменены действительными «нулевыми» значениями в обоих наборах данных.
  • Столбец с именем «OST_WEST_KZ» имел два различных строковых значения, которые мы преобразовали в числовые значения.
  • Столбец «GEBURTSJAHR» имел значение «0», которое необходимо было заменить нулевым значением.
  • Столбцы VERS_TYP и ANREDE_KZ - это столбцы с двоичными значениями (1 и 2), которые нужно было преобразовать в 0 и 1.
  • Столбцы CAMEO_DEUG_2015 и CAMEO_INTL_2015 фактически являются порядковыми и были преобразованы в тип с плавающей запятой.
  • Столбец «EINGEFUEGT_AM» представляет время вставки, не имеет отношения к делу и был добавлен в список столбцов, которые нужно удалить.
  • Столбец «LNR» - это номер строки, который также был добавлен в список «для удаления», поскольку не имеет значения для дальнейшего анализа.
  • Различные значения, имевшие «неизвестное» значение, были заменены на «нулевые» значения.

Визуализация данных

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

Столбцы с недостающими данными

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

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

Строки с недостающими данными

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

Мы видим, что большое количество строк имеет небольшой процент пропущенных значений (‹30%). И относительно небольшое количество строк имеет высокий процент пропущенных значений. Мы не хотим отбрасывать слишком много строк и терять ценную информацию, которую мы могли бы получить из них. Чтобы найти баланс, мы решили отбросить все строки с более чем 30% пропущенных значений.

Методология

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

Вменение пропущенных значений

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

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

Кодирование функций

Мы применили метод так называемого «горячего кодирования» для всех категориальных признаков, чтобы заменить описательные значения числовыми значениями.

Преобразование бревна

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

Стандартизация и масштабирование

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

Реализация

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

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

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

После последнего шага предварительной обработки данных мы закончили с 458 функциями. Использование такого количества функций с любым алгоритмом машинного обучения может привести к переобучению. Мы хотим этого избежать, и по этой причине нам нужно уменьшить количество функций. Один из хороших способов сделать это - применить метод, называемый PCA или «анализ главных компонентов». Этот метод определяет те особенности, которые сильно коррелированы. Удаляя такие функции, мы сокращаем количество измерений и в то же время сводим потери информации к минимуму.

Мы решили оставить только те функции, которые объясняют до 80% отклонений. В результате из исходных 458 осталось всего 199 функций.

Интерпретация основных компонентов

Мы сможем понять компоненты, которые были выбраны в результате анализа PCA, если глубже посмотрим на веса функций, которые включены в эти компоненты. Например, если мы проанализируем компонент № 1, то увидим, что он представляет определенную группу людей, которые:

  • В основном владеют немецкими марками автомобилей, такими как BMW или Mercedes Benz (KBA13_HERST_BMW_BENZ)
  • Кому конкретно принадлежит автомобильная марка Mercedes (KBA13_MERCEDES)
  • Кто владеет автомобилем, принадлежащим к высшему среднему классу (KBA13_SEG_OBEREMITTELKLASSE)

Этот компонент представлен на картинке ниже.

Нахождение оптимального количества кластеров

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

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

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

Анализ кластеров населения

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

Анализ клиентских кластеров

Кластеры клиентов сильно различаются между собой. 0, 8, 4 и 2 особенно выделяются.

Сравнение групп населения и клиентов

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

Мы видим, что наибольший потенциал имеют кластеры 8, 4, 0 и 2.

Анализ особенностей выдающихся кластеров

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

  • GREEN_AVANTGARDE_1: принадлежит зеленому авангарду
  • KBA05_HERST1: доля ведущих немецких производителей (Mercedes, BMW)
  • KBA05_KW3: доля автомобилей с мощностью двигателя более 119 кВт
  • FINANZ_ANLEGER: финансовая топология - инвестор

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

Выбор клиентской кампании

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

Создание наборов данных для обучения и проверки

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

Установление базового уровня

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

Тестирование различных моделей классификации

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

Мы пробовали следующие модели: XGBoost, Gaussian Naive Bayes, K-ближайший сосед, AdaBoost, Random Forest и Gradient boost. В конце концов, именно модель повышения градиента получила лучший результат. В качестве показателей оценки мы использовали «ROC - AUC» или площадь под рабочей кривой приемника.

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

Уточнение

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

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

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

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

Наилучшим набором значений параметров был: learning_rate = 0,05, max_depth = 3, n_estimators = 100 и max_features = 100.

При этих значениях параметров модель была немного улучшена и имела показатель ROC-AUC 0,76.

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

К сожалению, мы не смогли найти описание этих функций в предоставленных документах.

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

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

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

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

Прогнозы на основе тестовых данных

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

Отправка результатов в Kaggle

После этого мы использовали сохраненный файл и отправили заявку на конкурс Kaggle. Оценка 0,78583 была достигнута с 224-м местом на табло.

Обоснование

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

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

Заключение

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

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

Улучшение

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