Полное руководство по моделированию классификации с функцией стоимости

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

Фон

Имея возможность предсказать вероятность того, что клиент покинет компанию, на основе ранее существовавших характеристик клиента, компания может принять превентивные меры, чтобы изменить этот результат. В этом сценарии мы будем работать с банковскими данными клиентов. Набор данных, использованный для этого анализа, был получен с Kaggle.com. Данные состоят из 10 000 отдельных клиентов с 12 различными функциями и целевой переменной. Целевая переменная представляет собой бинарный классификатор, классифицирующий клиента как ушедший приравнивается к 1, а классифицирующий клиента как удержанный приравнивается к 0. Затраты будут связаны с удержанием клиента, а также с привлечением нового клиента.

Data columns (total 13 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   CustomerId       10000 non-null  int64  
 1   Surname          10000 non-null  object 
 2   CreditScore      10000 non-null  int64  
 3   Geography        10000 non-null  object 
 4   Gender           10000 non-null  object 
 5   Age              10000 non-null  int64  
 6   Tenure           10000 non-null  int64  
 7   Balance          10000 non-null  float64
 8   NumOfProducts    10000 non-null  int64  
 9   HasCrCard        10000 non-null  int64  
 10  IsActiveMember   10000 non-null  int64  
 11  EstimatedSalary  10000 non-null  float64
 12  Exited           10000 non-null  int64

Предположения

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

  1. Соотношение 5:1 стоимости привлечения клиентов и их удержания.
  2. 750 долларов за привлечение нового клиента.
  3. $150, чтобы удержать существующего клиента.
  4. Если уходящий клиент будет сохранен, компания получит чистую экономию в размере 600 долларов США (750-150 долларов США = 600 долларов США) для указанного клиента.

Исследовательский анализ данных

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

Было высказано предположение, что возраст является важной характеристикой в ​​этом наборе данных. Возраст создал самое высокое разделение между положительным классом и отрицательным классом. Средний возраст оставшихся клиентов составил 37,4 года, а средний возраст ушедших клиентов — 44,8 года.

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

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

def Balance_range(data):
    if data == 0:
        return 'Zero'
    elif data < 120000:
        return 'Mid'
    else:
        return 'High'

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

Структурирование данных

Перед созданием базовых моделей категориальные признаки, не имевшие значения для анализа, были удалены из набора данных и отложены для последующего использования (идентификатор и фамилия клиента). Затем все категориальные признаки (география, пол и баланс) были преобразованы в фиктивные переменные с использованием функции Pandas get_dummies с установленным в true флагом drop_first. Затем эти столбцы фиктивных переменных были объединены обратно в набор данных.

geography = pd.get_dummies(X['Geography'], drop_first=True)
X = pd.concat([X, geography], axis=1)

Следующим шагом было разделение данных на обучающую выборку (8000 клиентов) и тестовую выборку (2000 клиентов). Стратификация использовалась для обеспечения распределения целевых переменных положительного и отрицательного классов в соотношении 4:1 как в обучающем, так и в тестовом наборах.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=711, stratify=y)

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

Scaler = StandardScaler()
X_trainsc = Scaler.fit_transform(X_train)
X_testsc = Scaler.transform(X_test)

Базовое моделирование

Две базовые модели были созданы с использованием scikit-learn Dummy Classifier. Эти базовые модели предназначены для ограничения проблемы и будут использоваться для сравнения более сложных моделей позже в анализе. Первой изученной базовой моделью была модель Ничего не делать. Таковы были бы результаты, если бы банк решил не предпринимать никаких попыток удержать клиентов.

Приведенная выше матрица путаницы содержит 1593 истинно отрицательных результата (клиенты, которые, по прогнозам, будут удержаны, которые были удержаны) и 407 ложноотрицательных результатов (клиенты, которые, по прогнозам, будут удержаны, но фактически ушли). Поскольку мы предположили, что привлечение нового клиента стоит 750 долларов, мы также предположим, что потерянный клиент, в свою очередь, будет стоить банку 750 долларов. Подход «Ничего не делать» приведет к убыткам банка в размере 305 250 долларов.

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

Отзыв = Правильно положительные результаты/(Правильно положительные результаты + Ложно отрицательные результаты)

Точность = истинные положительные результаты/(истинные положительные результаты + ложные положительные результаты)

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

Обратным подходу «Ничего не делать» является подход «Сохранить все». Таковы были бы результаты, если бы банк решил потратить, чтобы удержать каждого клиента в банке. Приведенная ниже матрица путаницы содержит 1593 ложных срабатывания (клиенты, которые, по прогнозам, ушли, но на самом деле остались) и 407 истинных срабатываний (клиенты, которые, по прогнозам, ушли, но действительно ушли). Как ложные срабатывания, так и истинные срабатывания - это клиенты, которые, как считается, нуждаются в удержании и будут нести расходы в размере 150 долларов за клиента. Настоящими плюсами также считается экономия банку 750 долларов на каждого клиента, поскольку устраняется необходимость в повторном привлечении этого клиента. В этом сценарии банк почти безубыточен с чистой прибылью в размере 5 250 долларов (305 250 долларов сэкономлено - 300 000 долларов потрачено).

Важно помнить, что выбранная нами модель классификации не будет иметь 100% отзыва, потому что это даст тот же результат, что и модель «Сохранить все». Необходимо будет найти точку баланса, которая оптимизирует полноту и точность для максимизации прибыли.

Настройка и выбор модели

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

knn = KNeighborsClassifier()
k_range = np.arange(1,25)
weight_options = ['uniform', 'distance']
param_grid_knn = dict(n_neighbors = k_range, weights=weight_options)
gridcv_knn = GridSearchCV(knn, param_grid_knn, cv=10, scoring='recall')

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

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

def model_cost(model):
savings = []
idx = []
    for i in np.arange(0,1,0.01):
        y_predict = (model.predict_proba(X_testsc)[:, 1] >= i)
        cf_matrix = confusion_matrix(y_test, y_predict)
        total_cost = (cf_matrix[0][1] * 150) + (cf_matrix[1][1]*150)      + cf_matrix[1][0] * 750
        total_savings = cf_matrix[1][1] * 750
        savings.append(total_savings - total_cost)
        idx.append(i)
print('Max saving = {:d}'.format(max(savings)))
    return (savings,idx)

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

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

Ниже представлены плоды вашего труда. На графике показано изменение сэкономленных или потерянных долларов в зависимости от порога вероятности для каждой тестируемой модели. Когда порог вероятности приближается к 0, отзыв приближается к 100%, а точность приближается к 0%. Сэкономленные доллары приближаются к 5 250 долларам, что соответствует модели «Сохранить все». Когда порог вероятности приближается к 1, отзыв приближается к 0%, а точность приближается к 100%. Потерянные доллары приближаются к 305 250 долларам, что соответствует модели «Ничего не делать».

Мало того, что модель XGBoost имеет самый высокий балл ROC, она также смогла сэкономить банку наибольшую сумму денег, 92 100 долларов (271 500–145 650–33 750 долларов). Ранее в этом анализе указывалось, что необходимо найти точку баланса между отзывом и точностью, чтобы максимизировать прибыль. Эта точка оптимального баланса была расположена на пороге вероятности 0,10 для модели XGBoost, как показано на графике выше.

Выше представлена ​​матрица путаницы для модели XGBoost с порогом вероятности 0,10. Очевидно, что мы преуспели в минимизации ложноотрицательных результатов, но не устранили их полностью (осталось 11%). При сравнении модели классификации XGBoost с базовой моделью «Сохранить все» была обнаружена чистая экономия в размере 86 850 долларов США (92 100–5 520 долларов США).

Спасибо, что нашли время дойти до конца! Если вы хотите глубже изучить мой код, мой репозиторий Github. Вы также можете найти меня на LinkedIn.

Ссылки: К. Салех. Сравнение затрат на привлечение клиентов и их удержание: статистика и тенденции (2021 г.)

Б. Хайнц. Перерезать шнур: прогнозирование оттока клиентов для телекоммуникационной компании (2018 г.)