信用风险建模是一个可以使用机器学习来提供解决方案的领域,因为它能够从大量异构数据中找到答案。在信用风险建模中,还需要推断特征,因为它们在数据驱动的决策中非常重要。

在这篇文章中,我们来研究什么是信用风险以及如何使用各种机器学习算法来表示它。以下是要讨论的要点:

  • 什么是信用风险
  • 什么是信用风险建模
  • 如何在信用风险建模中使用机器学习?
  • 实施信用风险建模
  • 基于树的模型的出色表现

什么是信用风险

信用风险是指借款人无法定期还款并违约的可能性。它是指贷款人无法按时支付利息或款项的可能性。贷方现金流中断,回收成本上升。在最坏的情况下,贷方可能不得不注销部分或全部贷款,从而导致损失。

预测一个人拖欠债务的可能性是非常困难和复杂的。同时,适当评估信用风险有助于限制因违约和逾期付款而造成损失。如果信用风险较高,贷方或投资者要么收取较高的利率,要么拒绝提供贷款。

什么是信用风险建模

一个人的信用风险受多种因素的影响,确定借款人的信用风险是一项艰巨的任务。信用风险建模是应用数据模型来确定两个关键因素的实践。首先是借款人拖欠贷款的可能性。第二个因素是如果发生违约,贷方的财务影响。

金融机构使用信用风险模型来评估潜在借款人的信用风险。根据信用风险模型验证,他们决定是否批准贷款以及贷款利率。

如何在风险建模中使用机器学习?

机器学习可以使用更高级的建模方法,如决策树和神经网络,这将非线性引入模型,允许发现变量之间更复杂的联系。我们选择使用 XGBoost 模型,该模型使用使用置换显着性技术挑选的特征。

另一方面,机器模型通常非常复杂,以至于难以理解。我们选择结合 XGBoost 和逻辑回归,是因为可解释性在信用风险评估中至关重要。

实施信用风险建模

Python 中的信用风险建模可以帮助银行和其他金融机构降低风险并防止社会发生金融灾难。

本文的目标是创建一个模型来预测一个人拖欠贷款的可能性。让我们从加载数据集开始。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import LabelEncoder

from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier


# load the data
loan_data = pd.read_csv('/content/drive/MyDrive/data/loan_data_2007_2014.csv')

你会发现许多列都是标识符,不包含任何用于创建机器学习模型的有意义的信息。

我们想要建立一个模型来预测借款人拖欠贷款的可能性,与一个人拖欠后发生的事件的数据我们是不需要的。我们做如下处理:

#dropping irrelevant columns
columns_to_ = ['id', 'member_id', 'sub_grade', 'emp_title', 'url', 'desc', 'title', 'zip_code', 'next_pymnt_d',
'recoveries', 'collection_recovery_fee', 'total_rec_prncp', 'total_rec_late_fee', 'desc', 'mths_since_last_record',
'mths_since_last_major_derog', 'annual_inc_joint', 'dti_joint', 'verification_status_joint', 'open_acc_6m', 'open_il_6m',
'open_il_12m', 'open_il_24m', 'mths_since_rcnt_il', 'total_bal_il', 'il_util', 'open_rv_12m', 'open_rv_24m',
'max_bal_bc', 'all_util', 'inq_fi', 'total_cu_tl', 'inq_last_12m','policy_code',]
loan_data.drop(columns=columns_to_, inplace=True, axis=1)
# drop na values
loan_data.dropna(inplace=True)

在准备数据时,我们需要解决多重共线性问题,因为高度相关的变量提供了相同的信息,这些多余的信息将使模型无法估计因变量和自变量之间的关系。

为了检查多重共线性,我们使用 Pandas 相关性矩阵来处理一下:


【机器学习】为什么在信用风险建模中首选树模型?_算法

可以看出,几个变量高度相关,应该消除。"loan amnt"、"funded amnt"、"funded amnt inv"、"installment"、"total pymnt inv"和"out prncp inv"是多重共线变量。

你可能会注意到几个变量的数据类型不正确,需要进行预处理才能将它们转换为正确的格式。我们将定义一些功能来帮助此过程的自动化。用于将变量转换为数据的函数编码如下。

def Term_Numeric(data, col):
data[col] = pd.to_numeric(data[col].str.replace(' months', ''))

Term_Numeric(loan_data, 'term')

def Emp_Length_Convert(data, col):
data[col] = data[col].str.replace('\+ years', '')
data[col] = data[col].str.replace('< 1 year', str(0))
data[col] = data[col].str.replace(' years', '')
data[col] = data[col].str.replace(' year', '')
data[col] = pd.to_numeric(data[col])
data[col].fillna(value = 0, inplace = True)

def Date_Columns(data, col):
today_date = pd.to_datetime('2020-08-01')
data[col] = pd.to_datetime(data[col], format = "%b-%y")
data['mths_since_' + col] = round(pd.to_numeric((today_date - data[col]) / np.timedelta64(1, 'M')))
data['mths_since_' + col] = data['mths_since_' + col].apply(lambda x: data['mths_since_' + col].max() if x < 0 else x)
data.drop(columns = [col], inplace = True)

在我们的数据集中,目标列是贷款状态,它具有不同的唯一值。这些值必须转换为二进制。对于不良借款人,得分为 0,对于好的借款人,得分为 1。

在我们的情况下,不良借款人为列出的类别之一:冲销、违约、逾期(31-120 天),剩余人被视为良好借款人。

# creating a new column based on the loan_status 
loan_data['good_bad'] = np.where(loan_data.loc[:, 'loan_status'].isin(['Charged Off', 'Default', 'Late (31-120 days)',
'Does not meet the credit policy. Status:Charged Off']), 0, 1)
# Drop the original 'loan_status' column
loan_data.drop(columns = ['loan_status'], inplace = True)

现在我们需要将分类变量转换为数字以进行进一步建模,为此我们将使用 sklearn 库中的 Label Encoder 类,如下所示:

categorical_column = loan_data.select_dtypes('object').columns
for i in range(len(categorical_column)):
le = LabelEncoder()
loan_data[categorical_column[i]] = le.fit_transform(loan_data[categorical_column[i]])

现在,我们已准备好训练各种算法,并将验证哪种算法效果最好。我们计划评估线性模型、KNN模型、两种树模型、一种朴素贝叶斯模型等。

我们将使用 KFold 对 10 折交叉验证,并将检查他们的平均准确度。

# compare models
models = []
models.append(('LR', LogisticRegression()))
models.append(('KNN', KNeighborsClassifier()))
models.append((DT, DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('RF', RandomForestClassifier()))

results = []
names = []

for name, model in models:
kfold = KFold(n_splits=10)
cv_results = cross_val_score(model, x_train, y_train, cv=kfold)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
print(msg)


【机器学习】为什么在信用风险建模中首选树模型?_人工智能_02

基于树模型的出色表现

正如我们从上面的平均准确率中可以看到的,树模型比其他模型的表现要好得多。与线性模型不同,它们很好地映射了非线性相互作用。

信用风险建模的特征重要性起着非常重要的作用,下面你可以看到决策树算法给出的特征重要性图。

【机器学习】为什么在信用风险建模中首选树模型?_算法_03

总结

通过这篇文章,我们详细讨论了信用风险建模、如何使用机器学习模型而不是传统方法来模拟信用风险。同时我们测试了各种模型并总结了基于树的算法如何表现出色。


【机器学习】为什么在信用风险建模中首选树模型?_python_04