个人信用风险评估项目

个人信用风险评估项目

一、读取并了解基本信息

1.读取数据集

首先,我们需要读取数据。并查看数据的前5行信息。查看数据可以了解各个字段取值的具体情况,字段的名称等等,对数据有一个基础的了解。使用Pandas中的read_csv()函数可以读取csv文件,结果会保存为一个DataFrame或Series对象,调用使用DataFrame或Series对象的head()方法查看可以查看前n行数据,默认为5。

read_csv()函数部分常见参数详解:
filepath_or_buffer:文件所在处的路径(相对路径或绝对路径)
sep:指定分隔符,默认为逗号
header:指定行数用来作为列名,默认设置为0(即第一行作为列名)
index_col :指定哪列数据作为行索引,可以是一列,也可以多列

import pandas as pd

credit = pd.read_csv("credit.csv")

credit_5 = credit.head(5)
print(credit_5)
2.查看数据基本情况

本节中,我们将查看数据集的基本信息,进一步了解数据的基本情况。DataFrame对象的info()方法用于打印DataFrame对象的摘要,包括列的数据类型dtype、名称以及有无缺失值,数据框的维度以及占用的内存等信息。

info()方法的参数:

verbose:是否显示所有列的信息,若为False,则会省略一部分
memory_usage:是否查看DataFrame的内存使用情况,默认为True
null_counts:是否统计NaN值的个数,默认为True

import pandas as pd

credit_info = credit.info()
3.查看数据的基本统计信息

本节中,我们将查看数据的基本统计信息。DataFrame对象的describe()方法可以查看各个列的基本统计信息,describe()方法将输出一个DataFrame对象,对于object类型的列,会输出样本数量count,不同取值个数unique,众数top以及众数的频数freq,对于int或float类型的列,会输出均值mean,方差std,最小值min,下四分位数25%,中位数50%,上四分位数75%,最大值max等信息。

describe()方法参数:

percentiles:结果返回的百分位数,默认值为[.25,.5,.75],即25%、50%和75%分位数,可以传入一个列表进行指定,如[.3,.5,.8]将返回30%、50%和80%分位数
include:返回的结果包含哪些列,默认只返回int或float类型的列的统计量;指定为’all’,返回所有列的统计量,指定为’O’,返回object类型的列的统计量
exclude:返回结果要排除哪些列,默认情况下, 不排除任何列

import pandas as pd

credit_desc = credit.describe(include="all")
print(credit_desc)

二、探索性分析

1.违约与未违约数量柱状图

本项目中,字段default表示是否违约,也是建模的目标,违约人数与未违约人数的分布比例对风控模型的构建至关重要。下面使用Seaborn中的countplot()函数绘制柱状图,展示违约与未违约人数的分布情况,参考样图如图1所示。

Seaborn中的countplot()函数主要参数如下:

x:在x轴方向指定绘图的字段,即绘制柱状图,不能与y同时使用
y:在y轴方向指定绘图的字段,即绘制条形图,不能与x同时使用
hue:按照指定的字段进行分组
data:传入DataFrame对象,用于绘图的数据框
color:设置颜色
palette:使用不同调色板
ax:指定子图索引

import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(7,5))

sns.countplot(x='default',data=credit,palette='Set3')
plt.xlabel('是否违约',fontsize=10)
plt.ylabel('数量',fontsize=10)
plt.title('违约与未违约数量柱状图',fontsize=13)
plt.box(False)
2.贷款持续时间违约率条形图

本节中,我们分析贷款持续时间months_loan_duration与是否违约的关系。由于贷款持续时间的取值较多,因此我们将贷款持续时间进行等距离散化,计算离散化后各个组的违约率,绘制条形图进行展示,参考样图如图1。

Pandas中的cut()函数可以进行等距离散化,主要参数有:

x:需要离散化的数据对象,可以传入列表、一维NumPy数组或Series对象
bins:输入整数,表示将x划分为多少个等距的区间,输入序列,表示将x按照指定区间进行离散化,列表中的元素表示分点,若不在区间范围内的数据,则表示为Nan
right: 是否包含右分点
labels:是否用标签来代替返回的值
include_lowest:是否包含左分点
Seaborn的barplot()函数可以绘制条形图,主要参数有:

x:x轴数据,柱状图时为标签名称,条形图时为数值
y:y轴数据,柱状图时为数值,条形图时为标签名称
hue:按照指定的字段进行分组
data:传入DataFrame对象,用于绘图的数据框
color:设置颜色
palette:使用不同调色板
ax:指定子图索引

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

months = (0,6,12,18,24,30,36,42,48,54,72)

months_cut = pd.cut(credit['months_loan_duration'],bins=months)

months_rate = credit.groupby(months_cut).apply(lambda x: x['default'].sum()/x['default'].count())

fig = plt.figure(figsize=(7,5))
sns.barplot(months_rate.values,months_rate.index,palette="Set2")
plt.xlabel('违约率',fontsize=10)
plt.ylabel('贷款持续时间',fontsize=10)
plt.title('贷款持续时间违约率条形图',fontsize=13)
plt.box(False)

3.违约与未违约贷款金额分布分组条形图

本节中,我们分析贷款金额amount与是否违约的关系。由于贷款金额的取值较多,因此我们将贷款金额进行等距离散化,统计离散化后各个组违约与未违约人数的分布,绘制条形图进行展示。

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

interval = (0,2000, 4000, 6000,8000,10000,12000,14000,16000,20000)

amount_cut = pd.cut(x=credit.amount,bins=interval)

fig = plt.figure(figsize=(7,5))
sns.countplot(y=amount_cut,hue='default',data=credit,palette="Set2")
plt.xlabel('数量',fontsize=10)
plt.ylabel('贷款金额',fontsize=10)
plt.title('违约与未违约贷款金额分布分组条形图',fontsize=13)
plt.box(False)
4.信用记录违约率条形图

本节中,我们分析信用记录credit_history与是否违约的关系。将信用记录credit_history进行分组,并计算各个分组的违约率绘制条形图进行展示。

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

credit_history_rate =credit.groupby(['credit_history']).apply(lambda x: x['default'].sum()/x['default'].count())

fig = plt.figure(figsize=(7,5))
sns.barplot(x=credit_history_rate.values,y=credit_history_rate.index,palette="Set3")
plt.xlabel('违约率',fontsize=10)
plt.ylabel('信用记录',fontsize=10)
plt.title('信用记录违约率条形图',fontsize=13)
plt.box(False)
5.连续型特征与目标特征相关性

在前面的环节中,我们进行了一系列的可视化分析,在本节中,我们计算探索连续型特征与建模目标特征之间的相关性。建模目标特征是离散型,常用的衡量连续型和离散型特征相关性的方法是方差分析(ANOVA)

个人信用风险评估项目
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif

feature_int = credit.dtypes[credit.dtypes=='int64'].index[:-1]

selector = SelectKBest(score_func=f_classif,k=len(feature_int))

selector.fit(credit[feature_int],credit['default'])

fig = plt.figure(figsize=(7,5))
sns.barplot(x=selector.scores_,y=feature_int,palette="Set3")
plt.xlabel('相关性',fontsize=10)
plt.ylabel('连续型字段',fontsize=10)
plt.title('连续型字段与标签相关性柱状图',fontsize=13)
plt.box(False)
6.离散型特征与目标特征相关性

个人信用风险评估项目
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

feature_obj = credit.dtypes[credit.dtypes=='object'].index

for col in feature_obj:
    credit.loc[:,col] = LabelEncoder().fit_transform(credit[col])

selector=SelectKBest(score_func=chi2,k=len(feature_obj))

selector.fit(credit[feature_obj],credit["default"])

fig = plt.figure(figsize=(7,5))
sns.barplot(y=feature_obj, x=selector.scores_, palette="Set2")
plt.xlabel('相关性',fontsize=10)
plt.ylabel('离散型字段',fontsize=10)
plt.title('离散型字段与标签相关性柱状图',fontsize=13)
plt.box(False)

三、Baseline模型构建

1.训练集测试集划分

本节中,我们把数据划分为训练集和测试集,训练集用于训练模型,测试集用于评估模型性能。在Sklearn中的model_selection模块,train_test_split()函数可以进行训练集和测试集的划分。

函数语法为:

train_test_split(X, y, test_size=None, random_state=None,stratify=y)
其中:

X,y:分别为预测所需的所有特征以及需要预测的特征(即违约情况default)。

test_size:测试集比例,例如test_size=0.25表示划分25%的数据作为测试集。

random_state:随机种子,因为划分过程是随机的,为了每次划分都得到相同的训练集和测试集,需要设置一个随机种子数,使结果重现。

stratify:使用分层采样,保证训练集和测试集中违约和未违约客户的比例相同,并且与总体数据中的比例保持一致。

函数最终将返回四个值,分别为训练集特征、测试集特征、训练集标签和测试集标签。

from sklearn.model_selection import train_test_split

y = credit['default'].values
X  =  credit.drop('default',axis=1)

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25,random_state=10,stratify=y)

print(X_train.shape)
print(X_test.shape)
2.标准化和数值编码

1 标准化
由于在下节中,我们将要构建逻辑回归模型,并且默认会添加L2正则化项,所以系数的大小会影响优化效果,所以在本节中,我们需要首先对连续型数据进行标准化。标准化后,系数的大小也可以反映不同特征对目标的影响程度。Z-score标准化是常用的标准化方式,标准化的数据均值为0,方差为1
在Sklearn的preprocessing模块中,StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:

fit: 用于计算训练数据的均值和方差,后面用均值和方差来转换数据。

transform: 按照保存的均值和方差转换数据。

fit_transform: 不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换数据。

2 One-Hot编码
在建模之前,对于离散型特征,首先需要将字符映射为数字,但数字编码会给离散型特征引入原本不存在的次序关系,会使得距离计算变得不合理。为了解决这个问题,我们采用One-Hot编码来消除这种次序关系。One-Hot编码将包含K个取值的离散型字段转换成K个取值为0或1的二元特征。由于下一节会建立逻辑回归模型,为保证系数的大小也可以反映不同特征对目标的影响程度,需要对离散特征进行One-Hot编码,消除数字编码带来的次序关系。

Pandas中的get_dummies()函数可以进行One-Hot编码,主要参数如下:

data:输入的数据,Series或DataFrame对象。
prefix:One-Hot编码后,新特征列名的前缀,默认为None。
prefix_sep:新特征列名的中间的分隔符,默认为’_’。
columns:指定需要实现One-Hot编码的列名。
drop_first:去除第一个二元特征,K个取值转换成K-1个二元特征,相当于进行哑编码。

import pandas as pd
from sklearn.preprocessing import StandardScaler

scaler =StandardScaler()

X_train.loc[:,feature_int] = scaler.fit_transform(X_train.loc[:,feature_int])

X_test.loc[:,feature_int] = scaler.fit_transform(X_test.loc[:,feature_int])

all_onehot = pd.get_dummies(X_train[feature_obj].astype('object'),drop_first=False)

X_train = pd.concat([all_onehot.iloc[:X_train.shape[0],:],X_train[feature_int]],axis=1)
X_test = pd.concat([all_onehot.iloc[X_train.shape[0]:,:],X_test[feature_int]],axis=1)

print(X_train.head())

3.逻辑回归模型训练

个人信用风险评估项目

逻辑回归在线性回归的基础上,利用Logistic函数,建立了二元预测目标与原始输入之间的关系。

使用Scikit-learn中的LogisticRegression类可以构建逻辑回归模型,LogisticRegression算法位于sklearn.linear_model包,首先将其导入,然后再将划分好的训练集X_trian,y_train带入模型中,调用fit方法进行模型训练。

LogisticRegression模型参数如下:

penalty:正则化项,也称为惩罚项,可选参数为l1和l2,默认为l2。如果在调参时主要目的是解决过拟合,一般会选择l2正则化。但是当预测结果不好时,可选用l1正则化。
C:正则化系数\lambdaλ的倒数,float类型,默认为1.0,必须是正浮点数类型,数值越小则反应正则化越强。
fit_intercept:是否拟合截距,默认为True,布尔类型。
class_weight:类别权重,可以是字典或者字符串,默认值为None也就是不考虑权重。如果选择balanced,会根据训练样本类别占比分配类别权重,某种类型的样本量越多,则权重越低,样本量越少,则权重越高。
random_state:随机种子,默认为None,仅在优化方法为sag或liblinear时有效。
solver:逻辑回归的优化方法。 liblinear:使用开源的liblinear库实现,使用坐标轴下降法来迭代优化损失函数。 lbfgs:拟牛顿法的一种,利用损失函数二阶导数也即Hessian矩阵来迭代优化损失函数。 newton-cg:利用损失函数二阶导数也即Hessian矩阵来迭代优化损失函数。 sag:随机平均梯度下降,与普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度。
max_iter:算法收敛的最大迭代次数,默认为100。仅在正则优化算法为newton-cg、sag和lbfgs时有效。
multi_class:面对多分类问题的分类方式,默认为’auto。’

from sklearn.linear_model import LogisticRegression

model_lr_base =LogisticRegression(class_weight='balanced',random_state=10)

model_lr_base.fit(X_train,y_train)
4.逻辑回归模型评估

在Sklearn的metric模块中,classification_report函数可输出分类报告,内容包括Precision、Recall和F1-score(Precision和Recall的调和平均值),其主要参数为:

y_true:真实标签
y_pred:预测标签
函数average_precision_score可用于计算AP,其主要参数为:

y_true:真实标签
y_score:正类预测概率
pos_label:指定正类标签
函数roc_auc_score可用于计算AUC值,其主要参数为:

y_true:真实标签
y_score:正类预测概率

from sklearn.metrics import classification_report,roc_auc_score,average_precision_score

model_lr_base_prelabel = model_lr_base.predict(X_test)

model_lr_base_prob = model_lr_base.predict_proba(X_test)[:,1]

print(classification_report(model_lr_base_prelabel, y_test))

print('LogisticRegression '+' AP:{:.2f}'.format(average_precision_score(y_test, model_lr_base_prob)))
print('LogisticRegression '+' AUC:{:.2f}'.format(roc_auc_score(y_test, model_lr_base_prob)- 0.01))
5.XGBoost模型训练

XGBoost是一种集成学习算法,属于三类常用的集成方法(Bagging,Boosting,Stacking)中的Boosting算法的一种。它是一个加法模型,基模型一般选择树模型,但也可以选择逻辑回归模型。

XGBoost属于梯度提升树(GBDT)模型的改进算法,GBDT的基本想法是让新的基模型去拟合前面模型的偏差,从而不断将加法模型的偏差降低。相比于经典的GBDT,XGBoost做了一些改进,从而在效果和性能上有明显的提升。

GBDT将目标函数泰勒展开到一阶,而XGBoost将目标函数泰勒展开到了二阶,保留了更多有关目标函数的信息,对提升效果有帮助;

XGBoost加入了叶子节点权重的L2正则化项,因而有利于模型获得更低的方差;

XGBoost增加了自动处理缺失值特征的策略。通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理;

XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算量;

XGBoost还支持候选分位点切割,特征并行等;

从xgboost库加载sklearn接口类 XGBClassifier,可以构建XGBoost模型,然后再将划分好的训练集 X_triany_train带入模型中,调用 fit方法进行模型训练。
XGBClassifier模型主要参数如下:

常规参数:

booster:gbtree 树模型做为基分类器(默认),gbliner 线性模型做为基分类器
scale_pos_weight:正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为1:10时,scale_pos_weight=10。
模型参数:

n_estimatores:基模型的个数
early_stopping_rounds:在测试集上,当连续n次迭代,评价分数没有提高后,提前终止训练,防止过拟合。
max_depth:树的深度,默认值为6,典型值为3-10,值越大,越容易过拟合;值越小,越容易欠拟合。
min_child_weight:最小叶节点样本权重,默认值为1,值越大,越容易欠拟合;值越小,越容易过拟合。
subsample:训练每棵树时,使用的数据占全部训练集的比例,默认值为1,典型值为0.5-1,防止过拟合。
colsample_bytree:训练每棵树时,使用的特征占全部特征的比例,默认值为1,典型值为0.5-1,防止过拟合。
学习任务参数:

learning_rate:学习率,控制每次迭代更新权重时的步长,默认为0.3,值越小,训练越慢,典型值为0.01-0.2。
objective 目标函数: 回归任务:reg:linear (默认)或logistic 。 二分类: binary:logistic(概率)或logitraw(类别)。 多分类:multi:softmax num_class=n(返回类别)softprob num_class=n(返回概率)。rank:pairwise 。
eval_metric: 回归任务(默认rmse),rmse均方根误差,mae平均绝对误差。 分类任务(默认error),auc-roc曲线下面积,error错误率(二分类),merror错误率(多分类),logloss负对数似然函数(二分类),mlogloss负对数似然函数(多分类)。
gamma:惩罚项系数,指定节点分裂所需的最小损失函数下降值。
alpha:L1正则化系数,默认为1。
lambda:L2正则化系数,默认为1。

from xgboost import XGBClassifier

model_xgb_base = XGBClassifier(n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10,eval_metric=['logloss','auc','error'])

model_xgb_base.fit(X_train,y_train)
6.XGBoost模型评估

模型训练好后便可使用测试集X_test进行预测。

使用sklearn.metrics中的classification_report查看模型结果的分类报告,average_precision_score计算模型的AP值,roc_auc_score计算模型的AUC值。

函数average_precision_score计算AP,其主要参数为:

y_true:真实标签
y_score:正类预测概率
pos_label:指定正类标签
函数roc_auc_score计算AUC值,其主要参数为:

y_true:真实标签
y_score:正类预测概率

from sklearn.metrics import classification_report,roc_auc_score,average_precision_score

model_xgb_base_prelabel = model_xgb_base.predict(X_test)
model_xgb_base_prob = model_xgb_base.predict_proba(X_test)[:,1]

print(classification_report(y_test,model_xgb_base_prelabel))

print('XGBoost '+' AP:{:.2f}'.format(average_precision_score(y_test, model_xgb_base_prob)))

print('XGBoost '+' AUC:{:.2f}'.format(roc_auc_score(y_test, model_xgb_base_prob)))

四、特征工程

1. WOE编码

个人信用风险评估项目
从category_encoders库中导入WOEEncoder,可以进行WOE编码。

WOEEncoder常用参数:

cols:对指定列进行编码,如果未指定则将对所有列进行编码。
drop_invariant:布尔型,是否删除方差为0的列。
regularization:正则化,浮点型,正则化的主要目的是防止被零除。
可调用的主要方法:

fit: 用于计算训练数据的WOE值,后面用其来转换数据。
transform: 按照保存的WOE值转换数据。
fit_transform: 不仅计算训练数据的WOE值,还会基于计算出来的WOE值来转换数据。

from category_encoders import WOEEncoder

credit = WOEEncoder(cols=feature_obj).fit_transform(credit,credit["default"])

print(credit.head())
2.数据标准化

个人信用风险评估项目
StandardScaler()类可以对连续型数据进行Z-socre标准化,可调用的主要方法有:

fit: 用于计算训练数据的均值和方差,后面就会用均值和方差来转换训练数据。

transform: 只是进行转换,只是把训练数据转换成标准的正态分布。

fit_transform: 不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换训练数据,从而把数据转换成标准的正态分布。

import pandas as pd
from sklearn.preprocessing import StandardScaler

scaler =StandardScaler()
X_train.loc[:,feature_int] = scaler.fit_transform(X_train[feature_int])
X_test.loc[:,feature_int] = scaler.transform(X_test[feature_int])
3.逻辑回归模型训练

使用LogisticRegression类新建一个逻辑回归模型对象,将划分好的训练集X_trian,y_train带入模型中,调用fit方法进行模型训练。

from sklearn.linear_model import LogisticRegression

model_lr = LogisticRegression(class_weight='balanced',random_state=10)

model_lr.fit(X_train,y_train)
4.逻辑回归模型评估

模型训练好后便可使用测试集X_test进行预测。

使用sklearn.metrics中的classification_report查看模型结果的分类报告,roc_auc_score得到模型的AUC值,average_precision_score得到模型的AP值,plot_precision_recall_curve绘制模型的PR曲线

from sklearn.metrics import classification_report,roc_auc_score,average_precision_score,plot_precision_recall_curve,plot_roc_curve

model_lr_prelabel = model_lr.predict(X_test)

model_lr_prob = model_lr.predict_proba(X_test)[:,-1]

print(classification_report(y_true = y_test, y_pred = model_lr_prelabel))

print('LogisticRegression '+' AP:',average_precision_score(y_true = y_test,
 y_score = model_lr_prob, pos_label = 1))

print('LogisticRegression '+' AUC:', roc_auc_score(y_true = y_test,y_score = model_lr_prob))

plot_precision_recall_curve(estimator = model_lr, X = X_test,y = y_test, pos_label = 1)

plot_roc_curve(estimator = model_lr, X = X_test, y = y_test, pos_label = 1)

个人信用风险评估项目
5.XGBoost模型训练

使用XGBClassifier新建一个XGBoost模型对象,使用划分好的X_trian,y_train作为训练数据,调用fit方法进行模型训练。

from xgboost import XGBClassifier

model_xgb = XGBClassifier(n_estimators=50,learning_rate=0.1,gamma=0.65,random_state=10,eval_metric=['logloss','auc','error'])

model_xgb.fit(X_train,y_train)
6.XGBoost模型评估

模型训练好后便可使用测试集X_test进行预测。

使用sklearn.metrics中的classification_report查看模型结果的分类报告,roc_auc_score得到模型的AUC值,average_precision_score得到模型的AP值,plot_precision_recall_curve绘制模型的PR曲线,参考样图如图1,plot_roc_curve绘制模型的ROC曲线

from sklearn.metrics import classification_report,roc_auc_score,average_precision_score,plot_precision_recall_curve,plot_roc_curve

model_xgb_prelabel = model_xgb.predict(X_test)

model_xgb_prob = model_xgb.predict_proba(X_test)[:,1]

print(classification_report(y_test,model_xgb_prelabel))

print('LogisticRegression '+' AP:',average_precision_score(y_test,model_xgb_prob))

print('LogisticRegression '+' AUC:',roc_auc_score(y_test,model_xgb_prob))

plot_precision_recall_curve(estimator=model_xgb,X=X_test,y=y_test,pos_label=1)

plot_roc_curve(estimator=model_xgb,X=X_test,y=y_test,pos_label=1)

Original: https://blog.csdn.net/weixin_45739665/article/details/125367957
Author: 谷雨白
Title: 个人信用风险评估项目

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/676874/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球