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

Опубликовано: 21 Февраля, 2023

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

Импорт библиотек

На этом этапе мы будем импортировать такие библиотеки, как 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)))

Выход:

Вывод

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

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