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

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

Постановка задачи

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

Метрики оценки

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

  • Точность
  • Матрица путаницы
  • Отчет о классификации (оценка F1, точность и отзыв)

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

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

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

Рабочий процесс:

  • Загрузите набор данных
  • Осмотрите набор данных
  • Подготовьте данные
  • Обучение и прогнозы

1. Загрузите набор данных.

Среда, в которой мы будем использовать Блокнот Google Colab. Набор данных уже доступен в Kaggle, и чтобы использовать его в записной книжке, есть много способов сделать это. Здесь мы загрузим набор данных из Github.

Шаги по загрузке набора данных из Github:

  • Создайте репозиторий Github.
  • Загрузите набор данных из Kaggle и загрузите его во вновь созданный репозиторий Github.
  • Откройте созданный репозиторий в том месте, куда был загружен файл, нажмите «Просмотреть сырые» и выберите ссылку, как показано. Убедитесь, что ссылка заканчивается на «? Raw = true».

  • Используйте пакет запроса, доступный в Python, чтобы сделать запрос и сохранить ответ в pandas DataFrame.
import requests, io
import pandas as pd
pd.options.mode.chained_assignment = None
#the csv is stored in a github repo
r = requests.get( “<LINK>" )
df = pd.read_csv(io.BytesIO(r.content))
df.head(3)

Бинго! Данные будут загружены. Это избавляет от необходимости загружать загруженный набор данных в каждую среду выполнения.

2. Осмотрите набор данных.

Перед работой с набором данных нам необходимо убедиться, что набор данных очищен и не содержит каких-либо значений NULL. Начнем с изучения формы набора данных.

print(‘The dimensions of the dataframe — 
            ROWS: ‘,df.shape[0],’ , COLUMNS: ‘,df.shape[1])

Результат здесь следующий:

Размеры фрейма данных - ROWS: 30000, COLUMNS: 25

Затем мы проверяем количество нулевых данных в каждом столбце.

#the number of null values present in each column
print(‘The number of NULL values in each column !’)
print(df.isnull().sum())

Выход:

The number of NULL values in each column ! 
ID 0 
LIMIT_BAL 0 
SEX 0 
EDUCATION 0 
MARRIAGE 0 
AGE 0 
PAY_0 0 
PAY_2 0 
PAY_3 0 
PAY_4 0 
PAY_5 0 
PAY_6 0 
BILL_AMT1 0 
BILL_AMT2 0 
BILL_AMT3 0 
BILL_AMT4 0 
BILL_AMT5 0 
BILL_AMT6 0 
PAY_AMT1 0 
PAY_AMT2 0 
PAY_AMT3 0 
PAY_AMT4 0 
PAY_AMT5 0 
PAY_AMT6 0 
default.payment.next.month 0 
dtype: int64

К счастью, в наборе данных нет значения NULL. Построим график количества точек данных для каждого класса.

df[‘default.payment.next.month’].value_counts().plot(kind=’bar’)

Очевидно, мы видим, что набор данных несбалансирован. «0» обозначает неплательщиков, а «1» обозначает неплательщиков.

3. Подготовьте данные.

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

from sklearn.model_selection import train_test_split
#extract the feature set and the labels
data_X = df.drop(‘default.payment.next.month’,axis=1)
data_Y = df[‘default.payment.next.month’]
# split data into training and validation set
train_X, test_X = train_test_split(data_X, test_size = 0.2, 
                          random_state = 42)
train_Y, test_Y = train_test_split(data_Y, test_size = 0.2, 
                          random_state = 42)

Таким образом, у нас есть (train_X, train_Y) в качестве данных обучения и (test_X, test_Y) в качестве данных тестирования.

4. Обучение и прогнозы

Теперь, когда данные были успешно разделены на данные для обучения и тестирования, пришло время вызвать .fit () и .predict (). Нейронные сети, несомненно, являются одним из самых мощных алгоритмов машинного обучения. Но.

Нейронная сеть - единственный Мститель

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

  • Классификатор случайного леса
  • Классификатор AdaBoost
  • EasyEnsembleClassifier от Imblearn

Sklearn Comes - очень полезный пакет, который позволяет нам очень легко реализовать эти алгоритмы.

Классификатор случайного леса

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

Загрузите классификатор и подгоните данные обучения.

from sklearn.ensemble import RandomForestClassifier
# Fitting Random Forest Classification to the Training set
classifier_rfc = RandomForestClassifier(n_estimators = 200 )
classifier_rfc.fit(train_X, train_Y)

Выполните прогнозы на тестовом наборе и сохраните его в y_pred.

# Predicting the Test set results
y_pred = classifier_rfc.predict(test_X)

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

#Generating evaluation Metrics
report_rfc_word_features = classification_report(test_Y, y_pred)
matrix_rfc_word_features = confusion_matrix(test_Y, y_pred)
print(“The Classification Report”)
print(report_rfc_word_features)
print(“The Confusion Matrix”)
pd.DataFrame(matrix_rfc_word_features)

Полученная метрика оценки выглядит следующим образом:

Общая точность модели 82%. Поскольку это несбалансированный набор данных, общая точность не дает правильного измерения производительности модели. В этой матрице путаницы мы видим, что 0 предсказывается правильно 0 4425 раз, тогда как 1 предсказывается как 1 только 485 раз, остальные 828 - неверные предсказания. При рассмотрении этой проблемы основной целью является выявление будущих неплательщиков (т.е. прогноз 1). Точность и отзывчивость для 1 также не на должном уровне. Таким образом, можно видеть, что модель смещена в сторону класса 0, это связано с несбалансированным характером набора данных.

Классификатор AdaBoost

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

Загрузите классификатор и подгоните данные обучения.

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier(random_state=2018,
           algorithm=’SAMME.R’,learning_rate=0.8,n_estimators=200)
clf.fit(train_X, train_Y)

Выполните прогнозы на тестовом наборе и сохраните его в y_pred.

# Predicting the Test set results
y_pred = clf.predict(test_X)

Создание показателей оценки.

#Generating evaluation Metrics
report_ada_word_features = classification_report(test_Y, y_pred)
matrix_ada_word_features = confusion_matrix(test_Y, y_pred)
print(“The Classification Report”)
print(report_ada_word_features)
print(“The Confusion Matrix”)
pd.DataFrame(matrix_ada_word_features)

Полученная метрика оценки выглядит следующим образом:

Мы видим, что существенного улучшения общей точности нет. Модель не может предсказать 883 точки данных класса 1, что намного больше, чем 430 (что было предсказано правильно).

EasyEnsembleClassifier от Imblearn

Easy Ensemble включает создание сбалансированных выборок обучающего набора данных путем выбора всех примеров из класса меньшинства и подмножества из класса большинства. Вместо использования сокращенных деревьев решений для каждого подмножества используются усиленные деревья решений, в частности алгоритм AdaBoost. Давайте посмотрим, как эта модель вписывается в этот несбалансированный набор данных.

Загрузите классификатор и подгоните данные обучения.

from imblearn.ensemble import EasyEnsembleClassifier
# Fitting EasyEnsembleClassifier Classification to the Training set
classifier_ees = EasyEnsembleClassifier(n_estimators = 200 )
classifier_ees.fit(train_X, train_Y)

Выполните прогнозы на тестовом наборе и сохраните его в y_pred.

# Predicting the Test set results
y_pred = classifier_ees.predict(test_X)

Создание показателей оценки.

#Generating evaluation Metrics
report_ees_word_features = classification_report(test_Y, y_pred)
matrix_ees_word_features = confusion_matrix(test_Y, y_pred)
print(“The Classification Report”)
print(report_ees_word_features)
print(“The Confusion Matrix”)
pd.DataFrame(matrix_ees_word_features)

Полученная метрика оценки выглядит следующим образом:

Общая точность модели снизилась, но общее улучшение отзыва и оценки f1 для точек данных класса 1. Если мы более внимательно посмотрим на матрицу путаницы, то увидим, что количество правильно спрогнозированных неплательщиков (класс 1) резко увеличилось до 806. Следовательно, эта модель работает немного лучше, чем предыдущие модели для прогнозирования неплательщиков.

Таким образом, мы увидели, как эти три модели работают с этим конкретным набором данных.

Способы борьбы с несбалансированным набором данных

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

Вот два самых популярных способа справиться с несбалансированными данными:

  • Передискретизация - в этом процессе дублируются примеры класса меньшинства.
  • Недостаточная выборка - в этом процессе удаляются примеры класса меньшинства.

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

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

Благодарю вас!

использованная литература

[1] https://machinelearningmaster.com/bagging-and-random-forest-for-imbalanced-classification/#:~:text=Bagging%20is%20an%20ensemble%20algorithm,used%20in%20each%20data% 20sample.