Прогнозирование приемлемости кредита: исследовательский анализ данных
В первой части этой серии я показал некоторую необходимую обработку данных, которая включает в себя: удаление постоянных функций, удаление повторяющихся функций, удаление повторяющихся строк, удаление функций, связанных ›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/