Прогнозирование права на получение ссуды с использованием моделей машинного обучения в Python
Вы когда-нибудь думали о приложениях, которые могут предсказать, одобрят ли вам кредит или нет? В этой статье мы собираемся разработать одну такую модель, которая может предсказать, получит ли человек одобренный кредит или нет, используя некоторую справочную информацию о заявителе, такую как пол заявителя, семейное положение, доход и т. д.
Импорт библиотек
На этом этапе мы будем импортировать такие библиотеки, как NumPy, Pandas, Matplotlib и т. д.
Python3
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sbfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import LabelEncoder, StandardScalerfrom sklearn import metricsfrom sklearn.svm import SVCfrom imblearn.over_sampling import RandomOverSampler import warningswarnings.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 encodingdef 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 columndf = encode_labels(df) # Generating Heatmapsb.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_scoremodel = 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_reportprint(classification_report(Y_val, model.predict(X_val))) |
Выход:
Вывод
Поскольку этот набор данных содержит меньше функций, производительность модели не на должном уровне, возможно, если мы будем использовать лучший и большой набор данных, мы сможем добиться большей точности.
Вы также можете сослаться на эту статью: Прогнозирование одобрения кредита с использованием машинного обучения