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

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

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

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

Еще одна важная задача при исследовании данных — поиск отсутствующих значений. Отсутствующие значения в этих кадрах данных принимают две формы. Один представлен значениями NaN, которые явно указывают на то, что значение отсутствует. Другое представление отсутствующих значений — фактическое число, указывающее, что значение отсутствует. Подход заключался в том, чтобы найти эти числа, которые представляют пропущенные значения, и заменить их на NaN. Это приводит к более последовательному подходу при принятии решения о том, что делать с пропущенными значениями. Для выполнения этой задачи вручную был создан csv-файл. В этом файле было создано сопоставление между функцией и недопустимым значением. Этот CSV-файл был прочитан как словарь, и значения были правильно заменены для NaN.

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

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

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

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

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

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

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

В блокноте Jupyter можно найти более подробную информацию о каждом шаге, описанном в этом разделе.

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

Проблема в том, что кластеризация требует больших вычислительных ресурсов. Тот факт, что наборы данных содержат так много функций, окажется только вредным для разделения населения на группы. Чтобы ускорить весь процесс кластеризации без ущерба для информации, на помощь приходит анализ основных компонентов (PCA). PCA линейно объединяет признаки для формирования единого признака, тем самым уменьшая размерность набора данных и, в свою очередь, сокращая время, затрачиваемое на вычисление кластеров. Утверждение, что никакая информация не будет потеряна при использовании PCA, не совсем верно. Если решено сохранить только определенное количество основных компонентов, то все те, которые будут отброшены, будут в той или иной степени способствовать потере информации. Однако объем потери информации может быть ограничен. Например, в этом конкретном случае, как показано на графике ниже, сохранение 70 компонентов означает, что каждый из отброшенных компонентов будет способствовать менее чем 0,3% потери информации.

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

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

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

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

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

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

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

Стоит отметить, что при обучении набора данных с полным набором данных, предоставленным для обучения, показатель отзыва был равен 0. Это связано с тем, что в модели существует высокая предвзятость для прогнозирования отрицательного класса, поскольку они составляют подавляющее большинство. Чтобы настроить параметры модели, набор данных был спроектирован таким образом, что отношение нулей к единицам составляло всего 3:1.

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

Полученная оценка около 0,7 означает, что алгоритм гораздо лучше предсказывает, станет ли человек клиентом, чем чисто случайно.