www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Случайный лес против нейронных сетей для прогнозирования оттока клиентов

Дата публикации Oct 18, 2019

Прогнозирование оттока клиентов является обязательным условием успешного бизнеса. Большинство компаний с подписным бизнесом регулярно отслеживают отток своих клиентов. По статистике 59% клиентов не возвращаются после плохого обслуживания клиентов. Кроме того, стоимость приобретения новых клиентов довольно высока. Это делает прогнозирующие модели оттока клиентов привлекательными, поскольку они позволяют компаниям поддерживать существующих клиентов на более высоком уровне. Хотя определение и прогнозирование оттока клиентов может показаться простым на первый взгляд, оно связано с несколькими практическими проблемами.

Соревнование

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

Окружающая среда и инструменты

  1. scikit учиться
  2. keras
  3. NumPy
  4. панд
  5. Matplotlib

Данные

Набор данных можно скачать с сайта Kaggle, который можно найтиВот,

Описание переменных в наборе данных:

Пользовательский ИД:Пользовательский ИД

Пол:Является ли клиент мужчиной или женщиной

SeniorCitizen:Является ли клиент пожилым гражданином или нет (1, 0)

Партнер:Есть ли у клиента партнер или нет (Да, Нет)

Зависимые:Есть ли у клиента иждивенцы или нет (да, нет)

срок пребывания:Количество месяцев, в течение которых клиент находился в компании

PhoneService:Независимо от того, есть у клиента телефон или нет (да, нет)

MultipleLines:Есть ли у клиента несколько линий или нет (Да, Нет, Нет телефонной связи)

Интернет служба:Интернет-провайдер клиента (DSL, оптоволокно, нет)

OnlineSecurity:Независимо от того, имеет ли клиент онлайн-безопасность или нет (да, нет, интернет-сервис отсутствует)

OnlineBackup:Независимо от того, есть ли у клиента онлайн-резервное копирование или нет (да, нет, нет интернет-сервиса)

DeviceProtection:Независимо от того, имеет ли клиент защиту устройства (да, нет, нет интернет-сервиса)

Техническая поддержка:Независимо от того, есть ли у клиента техническая поддержка или нет (да, нет, интернет-сервис отсутствует)

StreamingTV:Независимо от того, есть ли у клиента потоковое телевидение или нет (да, нет, нет интернет-сервиса)

StreamingMovies:Независимо от того, есть у клиента потоковое видео или нет (да, нет, нет интернет-сервиса)

Контракт:Срок контракта с заказчиком (Ежемесячно, Один год, Два года)

PaperlessBilling:Независимо от того, есть ли у клиента безбумажный счет или нет (Да, Нет)

Способ оплаты:Способ оплаты клиента (Электронный чек, Почтовый чек, Банковский перевод (автоматический), Кредитная карта (автоматический))

MonthlyCharges:Сумма, взимаемая с клиента ежемесячно

TotalCharges:Общая сумма, взимаемая с клиента

Текучесть:Независимо от того, отошел клиент или нет (да или нет)

Где код?

Без лишних слов давайте начнем с кода. Полный проект на GitHub можно найтиВот,

Я начал с загрузки всех необходимых библиотек и зависимостей.

import numpy as np 
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split import keras
from keras.models import Sequential
from keras.layers import InputLayer
from keras.layers import Dense
from keras.layers import Dropout
from keras.constraints import maxnorm
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

Давайте посмотрим, как выглядит набор данных.

read_csvявляется функцией pandas для чтения CSV-файлов и выполнения операций с ними позже.голова()Метод используется для возврата первых n (по умолчанию 5) строк DataFrame.

data = pd.read_csv('../input/telco-customer-churn/WA_Fn-UseC_-Telco-Customer-Churn.csv')
data.head()

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

Я преобразовал категориальные переменные в числовые переменные (например, Да / Нет в 1/0). Я гарантировал, что все значения в числовом формате. Также я заполнил нулевые значения нулем.

data.SeniorCitizen.replace([0, 1], ["No", "Yes"], inplace= True)
data.TotalCharges.replace([" "], ["0"], inplace= True)
data.TotalCharges = data.TotalCharges.astype(float)
data.drop("customerID", axis= 1, inplace= True)
data.Churn.replace(["Yes", "No"], [1, 0], inplace= True)

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

data = pd.get_dummies(data)

Затем я разбил набор данных на X и Y.

  • X содержит все функции, которые используются для прогнозов.
  • Y содержит результаты, определяющие, был ли клиент сбит или нет
X = data.drop("Churn", axis= 1)
y = data.Churn

Далее я использовалtrain_test_splitразделить данные на обучающие и тестовые наборы с 20% данных, предоставленных тестовому набору. Тренировочный набор используется для обучения модели, в то время как тестовый набор используется только для оценки производительности модели.

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

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

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

rf.fitстроит лес деревьев из учебного набора (X, Y).rf.scoreвозвращает среднюю точность данных и данных теста

rf = RandomForestClassifier(n_estimators=100, max_depth=20,
random_state=42)
rf.fit(X_train, y_train)
score = rf.score(X_train, y_train)
score2 = rf.score(X_test, y_test)
print("Training set accuracy: ", '%.3f'%(score))
print("Test set accuracy: ", '%.3f'%(score2))

Точность, достигнутая на тренировочном наборе, составляет 99,8%, а на тестовом наборе - 79%.

rf.predictиспользуется для прогнозирования класса для X.

rf_predictions = rf.predict(X_test)
rf_probs = rf.predict_proba(X_test)

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

Матрица путаницы

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

Точность, Отзыв и F1-Оценка

Чтобы лучше взглянуть на неправильную классификацию, мы часто используем следующую метрику, чтобы получить лучшее представление об истинных положительных результатах (TP), истинных отрицательных значениях (TN), ложноположительных (FP) и ложноотрицательных (FN).

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

Отзывотношение правильно предсказанных положительных наблюдений ко всем наблюдениям в реальном классе.

F1-Scoreсредневзвешенное значение точности и отзыва.

y_pred = rf.predict(X_test)
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))
print(accuracy_score(y_test, y_pred))

Показатели производительности достаточно хороши для прогнозирования клиентов, которые не набирают отток с точностью, отзывами и значениями F1 баллов 0,83, 0,91,0,86. Но проблема в том, что модель не может точно предсказать клиентов, которые будут оттока с соответствующими значениями 0,64, 0,47, 0,54.

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

fi = pd.DataFrame({'feature': list(X_train.columns),
'importance': rf.feature_importances_}).\
sort_values('importance', ascending = False)
fi.head()

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

Нейронные сети

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

Я использовал два плотных слоя с 64 нейронами и 8 нейронами с relu в качестве функции активации.input_dimАргумент обозначает количество объектов в наборе данных или, другими словами, количество столбцов, присутствующих в наборе данных. Между тем я использовал 20% отсева, чтобы уменьшить переоснащение. Выпадающий слой гарантирует, что мы удаляем установленный процент данных при каждой итерации по нейронной сетиkernel_constraintиспользуется для масштабирования весов, присутствующих в нейронной сети. Последний слой также является плотным слоем с 1 нейроном и сигмоидом в качестве функции активации.

model = Sequential()
model.add(Dense(64, input_dim=46, activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(rate=0.2))
model.add(Dense(8, activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(rate=0.2))
model.add(Dense(1, activation='sigmoid'))

Затем я скомпилировал модель, используяbinary_crossentropyкак функция потерь,Адамкак оптимизатор иточностьметрика для отслеживания во время тренировки.

model.compile(loss = "binary_crossentropy", optimizer = 'adam', metrics=['accuracy'])

Я обучил модель для 50 эпох со значением размера пакета 8. Одна эпоха - это когда весь набор данных передается вперед и назад через нейронную сеть только один раз. Размер партии - это общее количество обучающих примеров, представленных в одной партии.

history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=50, batch_size=8)

Теперь давайте посмотрим, как меняется точность в зависимости от эпох.

plt.plot(history.history['accuracy']) 
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
Точность против эпох

Точность тестирования нейронной сети после 50 эпох составляет 78%, что сопоставимо с точностью 79% для случайного леса.

Выводы

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

Рекомендации / Дальнейшие чтения

Практическое руководство: предсказать отток клиентов

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

towardsdatascience.com

Прогнозировать отток клиентов - логистическая регрессия, дерево решений и случайный лес

Отток клиентов происходит, когда клиенты или подписчики прекращают вести бизнес с компанией или службой, также известной как…

datascienceplus.com

Прогнозирование оттока клиентов в телекоммуникационной отрасли с использованием достоверности данных

JavaScript отключен в вашем браузере. Пожалуйста, включите JavaScript, чтобы использовать все функции на этой странице. Отток клиентов…

www.sciencedirect.com

Прежде чем ты уйдешь

Соответствующий исходный код можно найти здесь.

abhinavsagar / Machine-Learning-проекты

Вы не можете выполнить это действие в данный момент. Вы вошли в другую вкладку или окно. Вы вышли на другой вкладке или ...

github.com

контакты

Если вы хотите быть в курсе моих последних статей и проектовследуй за мной на среднем, Вот некоторые из моих контактных данных:

Приятного чтения, счастливого обучения и счастливого кодирования!

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map