Прогнозирование права на получение ссуды с использованием моделей машинного обучения в Python
Вы когда-нибудь думали о приложениях, которые могут предсказать, одобрят ли вам кредит или нет? В этой статье мы собираемся разработать одну такую модель, которая может предсказать, получит ли человек одобренный кредит или нет, используя некоторую справочную информацию о заявителе, такую как пол заявителя, семейное положение, доход и т. д.
Импорт библиотек
На этом этапе мы будем импортировать такие библиотеки, как NumPy, Pandas, Matplotlib и т. д.
Python3
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sb from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn import metrics from sklearn.svm import SVC from imblearn.over_sampling import RandomOverSampler import warnings warnings.filterwarnings( "ignore" ) |
Загрузка набора данных
Ссылка на набор данных здесь.
Python3
df = pd.read_csv( "loan_data.csv" ) df.head() |
Выход:
Чтобы увидеть форму набора данных, мы можем использовать метод формы .
Python3
df.shape |
Выход:
(577, 5)
Чтобы распечатать информацию о наборе данных, мы можем использовать метод info().
Python3
df.info() |
Выход:
Чтобы получить такие значения, как среднее значение, количество и минимум столбца, мы можем использовать метод description() .
Python3
df.describe() |
Выход:
Исследовательский анализ данных
EDA относится к подробному анализу набора данных, в котором используются такие графики, как distplot, гистограммы и т. д.
Давайте начнем с построения круговой диаграммы для столбца LoanStatus.
Python3
temp = df[ "Loan_Status" ].value_counts() plt.pie(temp.values, labels = temp.index, autopct = "%1.1f%%" ) plt.show() |
Выход :
Здесь у нас несбалансированный набор данных. Нам придется сбалансировать его перед обучением любой модели на этих данных.
Python3
plt.subplots(figsize = ( 15 , 5 )) for i, col in enumerate ([ "Gender" , "Married" ]): plt.subplot( 1 , 2 , i + 1 ) sb.countplot(df[col], hue = df[ "Loan_Status" ]) plt.tight_layout() plt.show() |
Выход:
Одно из основных наблюдений, которое мы можем здесь сделать, заключается в том, что шансы на одобрение кредита для женатых людей довольно низкие по сравнению с теми, кто не состоит в браке.
Python3
plt.subplots(figsize = ( 15 , 5 )) for i, col in enumerate ([ "ApplicantIncome" , "LoanAmount" ]): plt.subplot( 1 , 2 , i + 1 ) sb.distplot(df[col]) plt.tight_layout() plt.show() |
Выход:
Чтобы узнать выбросы в столбцах, мы можем использовать boxplot.
Python3
plt.subplots(figsize = ( 15 , 5 )) for i, col in enumerate ([ "ApplicantIncome" , "LoanAmount" ]): plt.subplot( 1 , 2 , i + 1 ) sb.boxplot(df[col]) plt.tight_layout() plt.show() |
Выход:
В данных есть несколько экстремальных выбросов, которые нам нужно удалить.
Python3
df = df[df[ "ApplicantIncome" ] < 25000 ] df = df[df[ "LoanAmount" ] < 400000 ] |
Давайте посмотрим среднюю сумму кредита, предоставленного мужчинам, а также женщинам. Для этого мы будем использовать метод groupyby().
Python3
df.groupby( "Gender" ).mean()[ "LoanAmount" ] |
Выход:
Gender Female 118822.429907 Male 139289.823009 Name: LoanAmount, dtype: float64
Сумма кредита, запрашиваемая мужчинами, выше, чем сумма, запрашиваемая женщинами.
Python3
df.groupby([ "Married" , "Gender" ]).mean()[ "LoanAmount" ] |
Выход:
Married Gender No Female 116115.384615 Male 126644.628099 Yes Female 126103.448276 Male 143912.386707 Name: LoanAmount, dtype: float64
Вот еще одно интересное наблюдение в дополнение к предыдущему, что у женатых людей запрашиваемая сумма кредита, как правило, выше, чем у неженатых. Это может быть одной из причин того, что мы заметили ранее, что шансы на одобрение кредита для женатого человека ниже, чем у неженатого человека.
Python3
# Function to apply label encoding def encode_labels(data): for col in data.columns: if data[col].dtype = = "object" : le = LabelEncoder() data[col] = le.fit_transform(data[col]) return data # Applying function in whole column df = encode_labels(df) # Generating Heatmap sb.heatmap(df.corr() > 0.8 , annot = True , cbar = False ) plt.show() |
Выход:
Предварительная обработка данных
На этом этапе мы разделим данные для обучения и тестирования. После этого мы предварительно обработаем обучающие данные.
Python3
features = df.drop( "Loan_Status" , axis = 1 ) target = df[ "Loan_Status" ].values X_train, X_val, Y_train, Y_val = train_test_split(features, target, test_size = 0.2 , random_state = 10 ) # As the data was highly imbalanced we will balance # it by adding repetitive rows of minority class. ros = RandomOverSampler(sampling_strategy = "minority" , random_state = 0 ) X, Y = ros.fit_resample(X_train, Y_train) X_train.shape, X.shape |
Выход:
((447, 4), (616, 4))
Теперь мы будем использовать стандартное масштабирование для нормализации данных. Чтобы узнать больше о StandardScaler, перейдите по этой ссылке.
Python3
# Normalizing the features for stable and fast training. scaler = StandardScaler() X = scaler.fit_transform(X) X_val = scaler.transform(X_val) |
Разработка модели
Мы будем использовать классификатор опорных векторов для обучения модели.
Python3
from sklearn.metrics import roc_auc_score model = SVC(kernel = "rbf" ) model.fit(X, Y) print ( "Training Accuracy : " , metrics.roc_auc_score(Y, model.predict(X))) print ( "Validation Accuracy : " , metrics.roc_auc_score(Y_val, model.predict(X_val))) print () |
Выход:
Training Accuracy : 0.6136363636363635 Validation Accuracy : 0.4908403026682596
Оценка модели
Оценка модели может быть выполнена с использованием матрицы путаницы.
Python3
metrics.plot_confusion_matrix(model, X_val, Y_val) plt.show() |
Выход:
Python3
from sklearn.metrics import classification_report print (classification_report(Y_val, model.predict(X_val))) |
Выход:
Вывод
Поскольку этот набор данных содержит меньше функций, производительность модели не на должном уровне, возможно, если мы будем использовать лучший и большой набор данных, мы сможем добиться большей точности.
Вы также можете сослаться на эту статью: Прогнозирование одобрения кредита с использованием машинного обучения