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

В этой статье мы рассмотрим некоторые способы выяснить, уйдет ли клиент из банка или нет. Я использовал среду программирования Google Colab для решения проблемы.

Давайте начнем!

Сбор данных

Первым шагом в решении любой задачи машинного обучения является получение данных. Итак, я получил набор данных под названием churn.csv (имя изменено для удобства) с https://www.kaggle.com/shrutimechlearn/churn-modelling. Этот набор данных называется Churn_Modelling.csv и содержит различные столбцы, такие как возраст, пол, местоположение, банковский баланс и т. д. Итак, я только что скачал эти данные с сайта. Это всего ~670 кб.

Настройка среды программирования

Прежде чем приступить к программированию в Google Colab, нам нужно предоставить Colab доступ к нашему Google Диску, чтобы мы могли загрузить «churn.csv» для нашей работы. Мы делаем это, как показано ниже.

from google.colab import drive
drive.mount('/content/drive')

Откроется страница, на которой мы выбираем учетную запись Google, чью среду Colab мы используем. После этого мы должны скопировать строку с другого сайта (который вскоре откроется) и вставить ее в свой блокнот Colab.

Установка и импорт необходимых библиотек

Нам понадобится библиотека под названием «eli5» для измерения важности функций. Мы обсудим это, когда модель будет создана и обучена. Просто установите его сейчас, как показано ниже.

!pip install eli5

Теперь мы импортируем библиотеки, которые нам нужны.

import pandas as pd
import numpy as np
from sklearn.preprocessing import OrdinalEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import recall_score
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
import eli5
from eli5.sklearn import PermutationImportance
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_classification
import tensorflow as tf
from tensorflow import keras
from sklearn.metrics import confusion_matrix , classification_report

Загрузка данных

Теперь мы загружаем данные с помощью pandas.

data = pd.read_csv('/content/drive/MyDrive/Work/Projects/Bank Leave Predictor Project/churn.csv')

Вам нужно будет изменить адрес «churn.csv» в соответствии с вашим диском.

Теперь давайте проверим это!

Данные выглядят так, как указано выше.

Выбор функций

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

X = data.iloc[:,3:-1]

Кодирование категориальных признаков

Как вы видите, в наборе функций X у нас есть такие столбцы, как «География» и «Пол», которые содержат слова, а не числа. Кроме того, эти слова могут принимать ограниченное количество значений. Они называются категориальными признаками. Но наша модель машинного обучения — это математическая модель, поэтому для вычислений ей потребуются числа. Для этого мы делаем что-то под названием Encoding. Это делается, как показано ниже.

encoder = OrdinalEncoder()
value = encoder.fit_transform(X['Geography'].values.reshape(-1, 1))
X['Geography'] = value
encoder = OrdinalEncoder()
value = encoder.fit_transform(X['Gender'].values.reshape(-1, 1))
X['Gender'] = value

Теперь мы закодировали столбцы Geography и Gender с помощью OrdinalEncoder(). В различных библиотеках доступно множество кодировщиков. Вы можете проверить их!

Теперь X выглядит так:

Получение целевого столбца

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

y = data.iloc[:,len(data.columns)-1]

Теперь это выглядит так,

Разделение данных на обучающие и тестовые наборы

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

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

В машинном обучении принято получать 70% данных для обучения и 30% для тестирования.

Теперь мы проверяем длину поезда и тестовых наборов.

len(X_train), len(X_test), len(y_train), len(y_test)

Запустив это, мы получим размер тренировочного набора 7000 и размер тестового набора 3000.

Реализация модели классификатора случайного леса

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

RF = RandomForestClassifier(n_estimators = 100, max_depth = 2, random_state = 0)
RF.fit(X_train, y_train)

Приведенный выше способ показывает, как мы обучаем модель. Я установил n_estimators равным 100 и max_depth равным 2, но вы можете поэкспериментировать с другими вариантами.

Проверка производительности для модели классификатора случайного леса

Сейчас мы проверим баллы по тренировочному и тестовому набору.

round(RF.score(X_train, y_train), 4)

Получаем среднюю точность 0,8093. Это указывает на точность 80,93%. Для тестового набора сделайте,

round(RF.score(X_test, y_test), 4)

Получаем среднюю точность 0,8237. Это указывает на точность 82,37%.

Проверка важности функции для модели классификатора случайного леса

Теперь появится eli5, который мы скачали. Мы получаем важность функции, как показано ниже.

perm = PermutationImportance(RF, random_state = 42, n_iter = 10).fit(X, y)
eli5.show_weights(perm, feature_names = X.columns.tolist())

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

Это указывает на то, что «NumOfProducts», «Возраст» и «Баланс» являются нашими главными функциями.

Реализация модели классификатора MLP

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

X_train_new, X_test_new, y_train_new, y_test_new =  train_test_split(X, y, test_size = 0.30, random_state = 42)

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

clf = MLPClassifier(random_state = 1, max_iter = 100).fit(X_train_new, y_train_new)

Здесь вы можете попробовать разные значения max_iter.

Проверка производительности для модели классификатора MLP

Сейчас мы проверим результаты этой модели на тренировочном и тестовом наборе.

clf.score(X_train_new, y_train_new)

Получаем среднюю точность 0,755. Это указывает на точность 75,50%. Для тестового набора сделайте,

clf.score(X_test_new, y_test_new)

Получаем среднюю точность 0,761. Это указывает на точность 76,10%.

Проверка важности функции для модели классификатора MLP

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

perm = PermutationImportance(clf, random_state = 42, n_iter = 10).fit(X, y)
eli5.show_weights(perm, feature_names = X.columns.tolist())

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

Эта модель придает различное значение функциям. Таким образом, это указывает на то, что «Баланс», «Расчетная зарплата» и «Возраст» являются нашими главными функциями.

Реализация модели нейронной сети и проверка производительности

Теперь, после опробования модели классификатора случайного леса и модели классификатора MLP, мы попробуем модель нейронной сети. Мы используем keras, чтобы сделать модель.

model = keras.Sequential([
keras.layers.Dense(10, input_shape = (10,), activation = 'relu'),
keras.layers.Dense(25, activation = 'relu'),
keras.layers.Dense(1, activation = 'sigmoid')
])
model.compile(optimizer = 'adam',
loss = 'binary_crossentropy',
metrics = ['accuracy'])

У нас есть скрытый слой из 25 узлов. Это может быть изменено в соответствии с требованиями. Вы можете настроить и попробовать другие комбинации. Мы используем оптимизатор «adam» и потерю «binary_crossentropy».

Мы подгоняем и обучаем модель, как показано ниже. Мы обойдемся 50 эпохами.

model.fit(X_train, y_train, epochs = 50)

После обучения с 50 эпохами я получил точность 73,09%. После проверки тестовых данных, например,

model.evaluate(X_test, y_test)

Модель дает точность 78,50% на этих тестовых данных.

Теперь мы распечатаем отчет о классификации и проверим производительность. Мы делаем это, как показано ниже.

yp = model.predict(X_test)
y_pred = []
for element in yp:
if element > 0.5:
y_pred.append(1)
else:
y_pred.append(0)
print(classification_report(y_test, y_pred))

Мы получаем окончательный отчет о классификации как,

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

Итак, теперь вы знаете, как создать модель классификации с помощью sklearn и как использовать ее для решения проблемы оттока банков. Теперь вы можете перейти к более детальным подходам!