СОДЕРЖАНИЕ:

  1. Бизнес-проблема
  2. М.Л. Постановка задачи.
  3. Обзор набора данных
  4. Существующие подходы к проблеме
  5. Мое улучшение существующего подхода
  6. Показатель производительности
  7. Исследовательский анализ данных
  8. Мой первый подход к проблеме
  9. Предварительная обработка функций
  10. Функциональная инженерия
  11. Моделирование
  12. Резюме моделей
  13. Заключение
  14. Видео, демонстрирующее окончательно развернутую модель:
  15. Будущая работа
  16. Ссылки Linkedin и Github
  17. использованная литература

1. БИЗНЕС-ПРОБЛЕМА:

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

  • Недовольные клиенты не сообщают напрямую банку о причине недовольства.
  • Банковское руководство не может выявить закономерность, обозначающую неудовлетворенность клиента, по такому количеству переменных (350+), присутствующих в банковской документации клиента.
  • Количество клиентов настолько велико, что вручную просмотреть записи каждого клиента невозможно.

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

2. ПОСТАНОВКА ЗАДАЧИ ML:

Это проблема бинарной классификации, когда цель / класс обозначают неудовлетворенных клиентов с «1» и удовлетворенных клиентов с «0». Нам необходимо разработать модель, которая может правильно классифицировать заданные точки данных как 1 или 0, то есть удовлетворенный или неудовлетворенный клиент. Функции не обозначают ничего конкретного, так как названия столбцов были изменены из соображений конфиденциальности, я полагаю.

3. ОБЗОР ДАННЫХ:

Данные можно получить по ссылке: https://www.kaggle.com/c/santander-customer-satisfaction/data

Для предоставленного нам набора данных каждая строка представляет клиента. Нам даны два набора данных «train.csv» и «test.csv» с 371 и 370 функциями соответственно. В наборе данных Train есть дополнительный столбец под названием 'TARGET', которого нет в тестовом наборе данных. В столбце «ЦЕЛЬ» отображается степень удовлетворенности клиентов. Значение «0» в столбце TARGET означает, что покупатель удовлетворен, значение «1» означает, что покупатель не удовлетворен. Имена столбцов на самом деле не передают смысла того, что они представляют, возможно, имена столбцов переименованы специально по соображениям безопасности / конфиденциальности. Данные сильно несбалансированы: только 3,957% относятся к классу «1», то есть неудовлетворенным клиентам.

4. Существующие подходы к проблеме:

  1. http://gh.mltrainings.ru/presentations/Efimov_SantanderCustomerSatisfaction.pdf Лукас и команда выполнили следующую процедуру:
  • Удалены столбцы, которые были константами (только нули)
  • Удалены повторяющиеся столбцы
  • Используемые K-средние и добавленное количество кластеров в качестве функции
  • Бинарная функция, обозначающая, активна ли учетная запись или нет.
  • Модели: обучены различным моделям, таким как XGBoost, RGF, Neural network, FTRL, Random Forest, Adaboost, ExtraTrees, KNN, Lasso, SVM, на разных наборах данных поезда для уменьшения шума (техника Bagging).

2. https://www.kaggle.com/solegalli/feature-selection-with-feature-engine Здесь, в этой статье, Sole показала, как эти функции могут обрабатываться очень просто с помощью библиотеки feature_engine.selection. Эта библиотека способна удалять повторяющиеся функции, постоянные функции, коррелированные функции.

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

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

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

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

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

3. https://www.kaggle.com/adarshsng/extensive-advance-feature-selection-tutorial Включены два процесса выбора функций - ExhaustiveFeatureSelector и SequentialFeatureSelector из mlxtend. feature_selection 'для оценки функций методом грубой силы.

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

5. Мое улучшение существующего подхода:

  • На первый взгляд «ExhaustiveFeatureSelector» и «SequentialFeatureSelector» кажутся простым способом выбора функций, но это может занять много времени, поэтому это следует делать только тогда, когда функции уже отфильтрованы вручную и имеют меньшее количество функций.
  • Feature_engine.selection - это быстрый способ выбора функций, который может пригодиться для этого набора данных. Однако полагаться исключительно на эту библиотеку для разработки функций не будет хорошей идеей, потому что AUC, полученный с помощью существующих решений, которые использовали feature_engine.seelction, не очень высок по сравнению с другими для этого конкурса. Вместо этого я сделаю выбор вручную после проверки.

6. ПОКАЗАТЕЛИ ЭФФЕКТИВНОСТИ:

Netric производительности, который я выбрал для этой проблемы, - это AUC ROC (область под рабочей характеристикой приемника). Область под кривой рабочих характеристик приемника отображает степень отделимости модели. Тупая модель (модели, не имеющие возможности классификации), как правило, имеет auc = 0,5, хорошие модели, как правило, имеют гораздо более высокую AUC. Поэтому в этом тематическом исследовании мы стремимся получить максимально возможную AUC для наших моделей.

7. АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ:

Одномерный анализ:

Анализирующая функция «var15» (ВОЗРАСТ). Из всех функций эта функция выделяется тем, что имеет уникальные значения в диапазоне от 5 до 105, что делает его возраст клиентов весьма вероятным.

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

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

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

Количество банковских продуктов 6 и 7 не вошло в приведенную выше серию. Таким образом, очевидно, что клиенты, у которых есть 6 или более 6 банковских продуктов в банке, все довольны. Это может быть использовано для создания новой функции при разработке функций, независимо от того, равно ли значение ‘num_var4’ 6 или больше 6.

Двумерный анализ

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

Теперь давайте посмотрим на график основных характеристик:

Из приведенных выше графиков мы видим, что нет никаких функций, которые могли бы эффективно разделить два класса, однако на некоторых графиках виден некоторый шаблон, например, на графике 'saldo_var30 vs var15', мы можем видеть, что TARGET со значением 1 обычно виден при очень низких значениях 'saldo_var30'. Аналогично на графике 'saldo_medio_var5_hace3' vs 'var15 мы видим, что положительные точки данных обычно имеют более низкие значения. На основе трех вышеупомянутых функций (saldo_var_30, var15, var38) мы можем дополнительно выполнять многомерный анализ, чтобы одновременно видеть взаимосвязи между ними.

Многомерный анализ

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

saldo_medio_var5_ult3, saldo_var30, num_var45_hace3: построим трехмерную диаграмму рассеяния между тремя верхними характеристиками (var15, saldo_var30, var38), полученными ранее, и посмотрим, сможем ли мы найти шаблон, который может помочь в процессе классификации.

Как видно из трехмерного графика рассеяния, большое количество точек данных с меткой класса «1», кажется, загнано в угол в одном месте, т.е. большая часть случаев использования переменной класса «TARGET» = 1 происходит там, где значения saldo_var_30 и saldo_medio_var5_ult3 очень низкий. Давайте проверим, при каких значениях saldo_var_30 мы чаще всего наблюдаем значения TARGET = 1.

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

В следующем коде давайте проверим, при каких значениях saldo_medio_var5_ult3 мы в основном наблюдаем значения TARGET = 1:

Как видно из приведенного выше кода, около 65% неудовлетворенных клиентов имеют значение переменной «saldo_medio_var5_ult3» = 0,0. Мы можем сделать из этого новую функцию на основе значения saldo_medio_var5_ult3, равно ли оно 0 или нет.

var15, saldo_medio_var5_hace3, var38

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

Как мы видим, большое количество точек данных со значением «TARGET» = 1, как правило, имеет значение «var38», равное 117310.979016494. Во время разработки функций мы создадим новую функцию, основанную на этом.

8. Мой первый подход к проблеме:

  • Большинство документов и решений в основном сосредоточены на проектировании функций и меньше на моделировании, поэтому для этого набора данных обработка и проектирование функций имеют первостепенное значение, что влияет на оценку модели.
  • Хотя я столкнулся только с одним решением, в котором использовалась техника передискретизации для балансировки класса, я бы поэкспериментировал с методами передискретизации и недостаточной выборки, используя «RandomOverSampler», «RandomUnderSampler» и их комбинацию, и посмотрел, как получится результат с передискретизацией / недостаточной выборкой и без .
  • Перебор существующих решений, основанных исключительно на сокращении размеров, таких как PCA, не привел к хорошему показателю AUC. Первоначально необходимо вручную удалить неважные функции, затем мы можем использовать другие методы выбора функций, которые также в модерации. Решения этой проблемы, в которых агрессивно использовался только выбор функций, приводили к плохому AUC в конце.
  • Основываясь на большинстве вышеперечисленных решений, очевидно, что в наборе данных есть дубликаты, постоянные функции, разреженные функции, поэтому первоначальный подход заключался бы в удалении повторяющихся функций, а также удалении тех функций, которые являются постоянными. Кроме того, можно удалить функции Quassi Constant, которые не показывают больших отклонений. Кроме того, нам также необходимо проверить наличие повторяющихся наблюдений и также их устранить.
  • По мере уменьшения количества функций мы можем дополнительно фильтровать важные функции, используя ExhaustiveFeatureSelector и SequentialFeatureSelector.
  • Могут быть добавлены новые функции, такие как подсчет количества нулей во всех функциях для каждой строки.
  • В некоторых статьях признак var_15 обозначен как возраст, а также является важным признаком классификации. Из некоторых документов также очевидно, что люди младше 23 лет всегда довольны, поэтому эта характеристика может быть преобразована в категориальную характеристику в зависимости от того, возраст больше или меньше 23. Точно так же мы можем проверить, есть ли возраст, старше которого клиенты как правило, не удовлетворены. Если есть такой возраст, мы можем на его основе сделать еще один категориальный признак.

9. Предварительная обработка функций:

  • Удаление постоянных признаков (без отклонений). Объекты без отклонений вообще не участвуют в процессе классификации. Итак, я определил эти особенности и удалил их.

  • Удаление квази-констант (функций с небольшой дисперсией): Как и для функций с нулевой дисперсией, я также удалил функции с очень небольшой дисперсией, также известные как квази-постоянные функции.

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

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

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

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

1.Счетчик нулей и ненулевых значений: набор данных содержит множество нулей для различных функций. Добавление двух новых функций; количество нулей и количество ненулевых значений может оказаться полезным для процесса классификации.

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

2. Возраст до 23 лет. Как мы видели в однозначном анализе функции «var15», клиенты в возрасте до 23 лет, как правило, всегда остаются довольными. Поэтому я включил новую функцию ‘below_23’, которая является двоичной по своей природе (1 или 0) и показывает, составляет ли возраст клиента менее 23 лет или нет.

3. Возраст старше 80: согласно гистограмме или функции ‘var15’ клиенты старше 80, как правило, очень недовольны. Таким образом, функция «выше_80» показывает, старше ли возраст клиента 80 лет или нет.

4. Значение 'saldo_var30' равно 0 или 3: В результате многоаспектного анализа мы обнаружили, что неудовлетворенный покупатель, как правило, имеет значение характеристики saldo_var30, равное 0 или 3. Итак, новая функция saldo_var30_0_3 указывает, равно ли значение признака 'saldo_var30' 0 или 3.

5. Значение «var38» равно 117310.979016494. Во время второго многомерного анализа и дальнейшей проверки мы обнаружили, что большое количество точек данных, имеющих значение «TARGET» = 1, как правило, имеют Значение var38 равно 117310.979016494. Таким образом, новая функция «value_var38» показывает, равно ли значение var38 117310.979016494 или нет.

6. Значение saldo_medio_var5_ult3 равно 0,0: Как мы видели при многомерном анализе, положительные точки данных были загнуты в угол на 3D-графике, поскольку они имели очень маленькую ценность. При дальнейшей проверке мы подсчитали, что 65% неудовлетворенных клиентов обычно имеют значение saldo_medio_var5_ult3, равное 0,0. Итак, наша последняя функция, которая называется ‘value_saldo_medio_var5_ult3 ', означает, что значение ‘ saldo_medio_var5_ult3 ’ равно 0,0.

11. Моделирование:

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

  • Случайный лес

  • XGBRFClassifier

  • XGBClassifier

  • LGBMClassifier

  • AdaBoostClassifier

  • Модель нейронной сети

Хотя все шесть моделей дали хорошие результаты на kaggle, я объединил все вышеперечисленные модели. Для этого все, что я сделал, - это написал простой код, который брал «вероятность предсказания» из всех моделей, упомянутых выше, и брал среднее значение по всем шести. Наконец, после ансамбля я получил оценку 0,83992 на Kaggle.

12. РЕЗЮМЕ МОДЕЛЕЙ:

13. ЗАКЛЮЧЕНИЕ:

  1. Несмотря на то, что у многих функций было значение 0, создание новой функции «количество нулей» оказалось важной функцией для классификации.
  2. EDA оказалась самой важной частью всего проекта, поскольку проложила путь к дальнейшей разработке функций и созданию новых функций.
  3. Даже если мы не знаем, что конкретно обозначает столбец, EDA и графики очень помогают понять, что потенциально могут означать признаки и их роль в классификации.
  4. По отдельности все модели дали оценку Kaggle 0,82–0,83, но ансамбль из всех шести моделей оказался лучшим.

14. Видео, демонстрирующее финальную развернутую модель:

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

15. БУДУЩАЯ РАБОТА:

  • ML имеет большой потенциал для облегчения процесса выявления неудовлетворенных клиентов. Однако определить значение характеристик (возраст, номер банковского продукта) было непросто. Тем не менее, в этом наборе данных есть много возможностей. Можно определить новые функции и их значение, что в дальнейшем поможет в разработке функций и улучшит результаты.
  • Другие модели можно обучать и объединять в различные комбинации друг с другом для получения лучших результатов.

16. Ссылка на Linkedin и Github

Моя ссылка на этот пример использования на github

Вы можете связаться со мной в Linkedin или написать мне на [email protected]

17. Ссылки:

AppliedAICourse

Проблема удовлетворенности клиентов Santander на Kaggle

Решение Ashish для удовлетворения потребностей клиентов Santander

Решение 3-й позиции Kaggle

Выбор функции по единственной

Расширенный выбор функций

Werkstuk

Передискретизация с использованием SMOTE от Cerolacia