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

Вступление

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

О нашем наборе данных

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

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

Перед использованием любой модели мы должны выполнить 2 основных этапа обработки данных:

Обработка отсутствующих значений

В этом конкретном наборе данных отсутствующие значения были отмечены знаком «?», Поэтому сначала нам пришлось заменить их на NaN. Потом,

  • Для числовых столбцов мы заменим эти NaN на среднее значение этого столбца.
df.fillna(df.mean(), inplace=True)
  • Для категориальных столбцов мы заменим пропущенные значения (NaN) на наиболее часто встречающуюся категорию в этом столбце.
for col in df.columns:
    if df[col].dtypes == 'object':
        df = df.fillna(df[col].value_counts().index[0])

Масштабирование данных и кодирование меток:

Мы собираемся разделить эти оставшиеся шаги предварительной обработки на четыре основные задачи:

Преобразуйте нечисловые данные в числовые.

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

from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
for col in df.columns.to_numpy():
    if df[col].dtypes=='object':
        df[col]=le.fit_transform(df[col])

Удалите избыточные переменные.

Не каждая функция в наборе данных важна для прогнозирования. В нашем случае такие функции, как Drivers_License (11) и Zipcode (13), не так полезны для прогнозирования одобрения кредитных карт. Мы должны отказаться от них, чтобы разработать нашу модель машинного обучения с наилучшим набором функций.

Разделите данные на наборы для обучения и тестирования.

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

# Segregate features and labels into separate variables
X,y = df[:,0:13] , df[:,13]
# Split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Масштабируйте значения функций до равномерного диапазона.

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

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
rescaledX_train = scaler.fit_transform(X_train)
rescaledX_test = scaler.transform(X_test

Моделирование

По сути, прогнозирование того, будет ли заявка на получение кредитной карты одобрена или нет, является задачей классификации. Согласно UCI, наш набор данных содержит больше экземпляров, соответствующих статусу «Отклонено», чем экземпляров, соответствующих статусу «Утверждено». В частности, из 690 случаев 383 (55,5%) заявки были отклонены и 307 (44,5%) заявок были одобрены.

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

Логистическая регрессия

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

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(rescaledX_train,y_train)

Наша модель была очень хороша! Он смог дать оценку точности почти 84%. Но мы можем улучшить это, настроив гиперпараметры с помощью GridSearchCV.

Логистическая регрессия Scikit-Learn состоит из множества разных гиперпараметров, но мы будем искать по сетке по следующим двум:

  • тол
  • max_iter
from sklearn.model_selection import GridSearchCV
# Define the grid of values for tol and max_iter
tol = [0.01, 0.001 ,0.0001]
max_iter = [100, 150, 200]
param_grid = dict(tol=tol, max_iter=max_iter)
grid_model = GridSearchCV(estimator=logreg, param_grid=param_grid, cv=5)
rescaledX = scaler.fit_transform(X)
grid_model_result = grid_model.fit(rescaledX, y)

После этого мы улучшили нашу модель и смогли получить точность 85%.

K-Ближайшие соседи

Алгоритм KNN предполагает, что похожие вещи существуют в непосредственной близости. Другими словами, похожие вещи находятся рядом друг с другом.

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

Еще одна причина использования KNN заключалась в том, что наш набор данных относительно меньше по размеру, поэтому он смягчает главный недостаток KNN, заключающийся в том, что он становится значительно медленнее по мере увеличения количества примеров и / или предикторов / независимых переменных.

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=4)
neigh.fit(rescaledX_train,y_train)

Эта модель блестяще сработала! мы получили результат с точностью 87%.

Сравнение моделей

Я пробовал использовать другие модели, такие как XGBoost и RandomForest, но ни одна из них не смогла превзойти то, что мы нашли с помощью KNN.

Матрица неточностей: логистическая регрессия против KNN

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

Заключение:

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

Надеюсь, вам понравилось читать :)

Кредиты: @SayakPaul