Прогнозирование приемлемости кредита: исследовательский анализ данных

В первой части этой серии я показал некоторую необходимую обработку данных, которая включает в себя: удаление постоянных функций, удаление повторяющихся функций, удаление повторяющихся строк, удаление функций, связанных ›85% отсутствующих значений. Это предварительные шаги, которые нам нужно выполнить почти для каждого набора данных. После завершения вышеупомянутой обработки я смог удалить 60 нерелевантных функций, в результате чего осталось 93 из 153 исходных функций. Во второй части я рассмотрел каждую фичу вручную, обработал текст и удалил некоторые ненужные фичи. В конце обработки данных и очистки у нас есть 36 соответствующих функций.

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

Начнем с импорта библиотек и чтения набора данных с выбранными функциями:

import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.utils import shuffle, class_weight
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

Чтение данных

df_selected = pd.read_csv('./data/df_selected.csv')

Корреляция характеристик

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

corr = df_selected.corr()
plt.figure(figsize = (10, 8))
sns.heatmap(corr)
plt.show()

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

corr['loan_status'].sort_values(ascending = False)
                   .to_frame('corr_value')
                   .reset_index()

Из приведенного выше результата sub_grade имеет наивысшую положительную корреляцию со статусом целевой переменной ссуды, за которой следует рейтинг, процентная ставка и так далее. Fico_range_high и Fico_range_low имеют самую высокую отрицательную корреляцию. Поскольку Fico_range_high и Fico_range_low имеют почти одинаковый коэффициент корреляции (-0,136), мы можем объединить их, взяв их среднее значение, и удалить их.

df_selected['avg_fico_score'] = (df_selected['fico_range_high'] + df_selected['fico_range_low'])/2.0
df_selected.drop(['fico_range_low','fico_range_high'], axis=1, inplace=True)

Найдите тесно взаимосвязанные функции

Теперь, когда у нас есть матрица коэффициентов корреляции признаков, становится легче найти признаки, которые сильно коллинеарны (сильно коррелированы). Используя приведенный ниже код, я нахожу коллинеарные функции:

funded_amnt           loan_amnt           1.000000
funded_amnt_inv       loan_amnt           0.999996
                      funded_amnt         0.999996
int_rate              term                0.435879
installment           loan_amnt           0.952673
                      funded_amnt         0.952673
                      funded_amnt_inv     0.952653
grade                 term                0.446887
                      int_rate            0.962951
sub_grade             term                0.454138
                      int_rate            0.985559
                      grade               0.976940
total_acc             open_acc            0.689583
acc_open_past_24mths  open_acc            0.482634
                      total_acc           0.428877
mort_acc              home_ownership     -0.477745
pub_rec_bankruptcies  pub_rec             0.642983
tax_liens             pub_rec             0.695931
credit_history        earliest_cr_year   -0.994442
fico_grade            int_rate            0.792840
                      grade               0.821197
                      sub_grade           0.798134

Из приведенного выше результата мы видим, что «funded_amnt» имеет 100% корреляцию с «ссудой_амнт», что говорит нам о том, что они, по сути, одинаковы. Аналогичным образом, «funded_amnt_inv» имеет почти 100% корреляцию с «credit_amnt» и «funded_amnt». Поэтому я удаляю функции «funded_amnt», «funded_amnt_inv».

df_selected.drop(['funded_amnt','funded_amnt_inv'], axis=1, inplace=True)

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

df_selected.drop(‘earliest_cr_year’, axis = 1, inplace=True)
df_selected.drop('issue_year', axis = 1, inplace=True)

После удаления функций мы получили 29 наиболее актуальных и важных функций и одну целевую функцию «Credit_status».

Категориальные и непрерывные функции

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

cat_features.remove('loan_status')
['term',
 'grade',
 'emp_length',
 'home_ownership',
 'verification_status',
 'purpose',
 'initial_list_status',
 'application_type',
 'pub_rec_bankruptcies',
 'disbursement_method',
 'issue_month',
 'issue_year']

Мы видим, что 12 признаков ≤14 уникальных значений. Только шесть характеристик имеют более 1200 уникальных значений. Это означает, что большинство характеристик категоричны. Следовательно, первым делом стоит попробовать древовидный алгоритм.

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

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

Email: [email protected]
LinkedIn: https://www.linkedin.com/in/sabber-ahamed/
Github: https://github.com/msahamed
Medium: https://medium.com/@sabber/