国内征信行业模型开发全流程详解

1. 前言

目前国内的金融体系主要由银行、互联网消费金融、助贷机构组成,本人参与过国内外大型银行、消金、助贷机构的征信模型开发,相对而言,对当前国内的征信模型具有一定的发言权。下面,我将从技术角度全面分析信贷领域征信模型的开发全流程。

2. 征信模型
国内最大的征信平台是央行征信报告,其他比较知名的有芝麻分、腾讯分、同盾分等第三方机构征信产品。这类征信产品主要被国内金融机构采用并用来评估个人、机构信贷风险。从我的接触层面分析,目前市面上征信模型主要使用逻辑回归算法,使用逻辑回归算法建模的主要原因为模型简单、可解释性强、稳定性好。下面将着重描述征信模型各环节的操作及意义。

3. 建模流程
由于visio软件过期,先不将流程图放上,但会描述下整个过程。
标准的建模流程为:数据准备->数据清洗->特征工程->IV计算->WOE转换->变量筛选->拟合模型->模型评估->PSI监测->模型部署。

3.1 数据准备
这部分内容主要是确定建模样本,并提取相关数据,数据一定要是结构化的,如果不是结构化的则必须要能转换成结构化数据。一般而言,对于类别型特征变量,常见的处理方法有OneHotEncode,LabelEncode,均值编码和WOE转换等方法,更多时候是不会将类别型特征变量代入模型。关于类别型特征变量的挖掘及处理相关内容可参考如下链接:
类别型特征处理介绍1
对于样本不平衡问题,我们往往会采用过采样、欠采样、smote等方法重新提取训练样本
样本不平衡的处理方法详情请看样本极度不平衡处理方案

3.2 数据清洗
数据清洗主要是对已准备好的数据做处理,比如某列数值型数据中包含字符串型数据,存在重复的数据等一系列不合理的情况,在我们进行特征工程前必须尽可能的把这些坑给排掉,避免在后续环境发现错误并返工。

3.3 特征工程
简单讲就是根据唯一主键构建各个维度的变量,如征信模型中以三要素(身份证、手机号、姓名)或订单号为唯一主键,给出用户的收入数据、消费数据、手机APP数据、APP使用行为数据等,我们可以构建出用户“近3个月的消费总金额”、“近1个月使用消金类APP次数”等特征变量,再根据构建出来的特征变量建模。一般而言,在我们建好特征变量后,会提前删除掉方差为0或缺失率较高的变量。删除方差为0的变量的原因是其在区分“好/坏用户”上无任何价值,删除缺失率高的变量的主要原因是这类变量不稳定,后续可能随着样本的变动导致构建的模型出现较大的偏差,无形中增加了风险。另外,对于时序型特征变量的挖掘往往从用户行为趋势、特定时间段行为等角度思考如何开展特征工程。

3.4 画变量IV图
IV(Information Value)从字面上理解为信息价值,从模型的角度理解则是用来衡量特征变量对识别目标变量的作用大小,可以用来衡量特征变量的预测能力。比较常用的IV图绘画方法有等频分箱、等宽分箱、最优分箱三种方法,但在信贷领域中,我们更多使用的是等频分箱,因为这样画出的IV图能直观的表现出特征变量的单调性。逻辑回归模型是线性模型,其优点就是具有可解释下、稳定性强的特点,单调性特征变量具有可解释性,单调递减特征变量图如下:
图1 单调递减特征变量我们计算特征变量的IV值和画IV图的目的就是为了挑选合适的特征变量建模,挑选特征变量时一般会剔除iv值小于0.02的特征变量,保留缺失率不高且具有单调性的强特征变量。

3.5 WOE转换
WOE(Weight of Evidence,证据权重)可以理解为每个分箱里的坏人分布相对于好人分布之间的差异性。它的计算方式如下:
WOE=ln[Bad distribution/Good distribution]
需要记住的是,对于i分组,正常和违约的分布分别定义为:
Good distribution =“第i组好用户数”/“总的好用户数”
Bad distribution =“第i组坏用户数”/“总的坏用户数”
WOE计算
对变量进行WOE转换的目的有:
1.业务的可解释性,对变量进行WOE转换可以将非严格单调性的线性变量转换成单调线性变量。
2.能处理缺失值,WOE转换直接把缺失值转换成数值,方便代入模型运算。
3.处理异常值,当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。
缺点:
1.容易导致模型欠拟合,相较于未WOE转换的模型结果,WOE转换后模型结果对坏用户的排序能力降低(个人理解)。

3.6 变量筛选
对经过IV环节挑选后的特征变量做相关性检验的原因有1.减少特征变量的数量,便于模型训练;2.相关性强的两个变量同时放入模型训练时,会影响特征变量的参数,使显著性强的特征变量变得不显著,甚至会使得拟合后的变量系数与实际系数值相反(如正直拟合出负值)。不做相关性剔除对模型的预测结果没有太大影响,剔除会使得模型看起来更简洁,稳定性更强(越复杂的模型稳定性越差)。变量之间的相关性检测一般有VIF检测、P值检测等方法。取值上各家机构都不一致,严格来说,我们会剔除VIF>2或者P>0.5的特征变量。

  1. VIF检测
    VIF(方差膨胀因子)用来衡量变量之间多重共线性的方法,它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。每个变量都有一个VIF,若单变量VIF超过10,则一定出现多重共线性,若大多数变量VIF在[1,2]之间,少数略超过2,则勉强接受没有多重共线性,若最大的VIF值不超过2,则没有多重共线性。其计算公式如下:
    VIF = 1/(1-R(i)**2)
    其中,R(i)为自变量对其余自变量X(i)作回归分析的负相关系数。
  2. P值检测
    P值(皮尔逊系数)用来衡量两个变量之间的相关程度,两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
    P值计算公式
  3. 卡方值检测
    卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小,其值计算公式如下:
    X**2 = SUM((Ai-Ti)**2/Ti)
    Ai为实际频数(出现的次数),Ti为理论频数。一般而言,我们会用卡方检验自变量与因变量之间的相关性,保留卡方值大的特征变量。
  4. P>|z|
    逻辑回归变量系数在逻辑回归拟合模型后,我们通常会输出上图表中所示的信息,除了VIF和coef外还值得关注的有P>|z|这列。一般认为,p值小于0.05的自变量是显著的,也就是说,有统计学证据表明该变量会影响因变量为1的概率。概括来说,P值就是判断系数是否显著的一个统计量,P值越小越拒绝0假设。 此处coef小于零的原因是未对特征变量做分箱处理导致的。

3.7 拟合模型
在传统征信行业一般使用逻辑回归算法拟合模型,主要原因体现在逻辑回归算法简单、可解释下强等特点。逻辑回归算法假设数据服从伯努利分布,采用极大似然估计函数,使用梯度下降方法寻找参数最优解,达到模型二分类的目的。具体的逻辑回归原理、数学公式推导等详情参考如下链接:
逻辑回归原理及公式推导介绍1
逻辑回归原理及公式推导介绍2
一般在逻辑回归算法拟合模型时,当预选入模变量过多时,我们会采用半自动加双向逐步回归的方法挑选模型变量。所谓的半自动加双向逐步回归是指指定某个或某组特征变量作为模型的必选变量,并在此基础上使用双向逐步回归的方法挑选其他特征变量。一般要求添加的新特征变量或新的组合特征变量拟合后的模型效果有所提升。

3.8 模型评估方法
通常情况下,我们使用准确率、错误率、精确率、召回率、f1_score,混淆矩阵,AUC/KS等指标作为二元分类模型的评估方法。
1.精确率和召回率
精确率和召回率主要用于二分类问题,结合混淆矩阵有:
混淆矩阵精确率与召回率的定义为:

精确率(Precision) = TP/(TP+FP)

召回率(Recall) = TP/(TP+FN)
一般而言,精确率和召回率值越高,表示模型性能越好。
2.准确率和错误率
准确率和错误率既可用于二分类也可用于多分类,其计算公式如下:

准确率(accuracy) = (TP+TN)/(TP+FP+FN+TN)

错误率(errorrate) = (FN+FP)/(TP+FP+FN+TN)
精确率和准确率是比较容易混淆的两个评估指标,两者是有区别的。精确率是一个二分类指标,而准确率能应用于多分类。

3.f1_score
F1函数是一个常用指标,F1值是精确率和召回率的调和均值,即
f1_score描述
4.AUC
ROC曲线图
AUC(Area Under Curve):Roc曲线下的面积,介于0和1之间。首先AUC值是一个概率值,AUC是指随机给定一个正样本和一个负样本,分类器输出该正样本为正的那个概率值比分类器输出该负样本为正的那个概率值要大的可能性,所以AUC反映的是模型对样本的排序能力。

5.KS
KS曲线其实数据来源和本质与ROC曲线是一致的,只是ROC曲线是把真正率(TPR)和假正率(FPR)当作横纵轴,而K-S曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。其图形式如下:
KS曲线图
KS评估模型风险区分能力,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强,模型预测效果越好。

KS的计算步骤如下:
a. 计算每个评分区间的好坏账户数。
b. 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
c. 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。

AUC与KS区别:AUC用来评估模型对样本的排序能力,KS用来评估模型对样本的风险区分能力。AUC和KS都可以用来评估模型性能好坏,都是值越大模型性能越好,区别在于FPR与TPR曲线是否作为横纵坐标。

3.9 PSI监测
群体稳定性指标PSI(Population Stability Index)是衡量模型的预测值与实际值偏差大小的指标,同时也可以用来衡量特征变量的稳定性,一般衡量特征变量稳定性时要在WOE化后计算,直接剔除不稳定的特征变量

PSI = sum((实际占比-预期占比)* ln(实际占比/预期占比))
举例:

比如训练一个logistic回归模型,预测时候会有个概率输出p。

测试集上的输出设定为p1,将它从小到大排序后10等份,如0-0.1,0.1-0.2,…。

现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。

实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。

意义就是如果模型很稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。

一般认为PSI小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

PS:除了按概率值大小等距十等分外,还可以对概率排序后按数量十等分,两种方法计算得到的psi可能有所区别但数值相差不大。
详细解释链接如下:PSI计算信息

PSI的计算代码:

def calculate_psi(expected, actual, buckets=10): # test, base
    '''
    expected:期望占比
    actual:实际占比
    buckets:将预测结果分成多少个Bin,默认Bin=10
    '''
    def psi(expected_array, actual_array, buckets):
        def scale_range(input, min, max):
            input += -(np.min(input))
            input /= np.max(input) / (max - min)
            input += min
            return input
        # 按照概率值分10段
        breakpoints = np.arange(0, buckets + 1) / (buckets) * 100
        breakpoints = scale_range(breakpoints, np.min(expected_array), np.max(expected_array))
        expected_percents = np.histogram(expected_array, breakpoints)[0] / len(expected_array)
        # print(expected_percents)
        actual_percents = np.histogram(actual_array, breakpoints)[0] / len(actual_array)
 
        def sub_psi(test, base): # test,base
            if base == 0:
                base = 0.0001
            if test == 0:
                test = 0.0001
 
            value = (test - base) * np.log(test / base)
            return(value)
        psi_value = np.sum(sub_psi(expected_percents[i], actual_percents[i]) for i in range(0, len(expected_percents)))
        return(psi_value)
 
    if len(expected.shape) == 1:
        psi_values = np.empty(len(expected.shape))
    else:
        psi_values = np.empty(expected.shape[0])
 
    for i in range(0, len(psi_values)):
        if len(psi_values) == 1:
            psi_values = psi(expected, actual, buckets)
        else:
            psi_values[i] = psi(expected[:,i], actual[:,i], buckets)
    return(psi_values)

3.10 模型部署
逻辑回归模型的部署相较于其他机器学习模型来说是最容易的,原因是逻辑回归模型得到的是模型特征变量的参数,我们可以直接将处理后的模型特征变量与模型相关参数、sigmoid函数结合得到预测概率,在征信行业中,我们往往会给预测用户打上评分,打分公式和分数区间可自行定义,但往往会要求高分数低风险,低分数高风险

4 总结

本篇文章主要关注的是征信行业模型的开发流程,具体的代码实现等细节可自行寻找,后续也会对文章内容进行修改,希望能帮到您。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于互联网征信数据(simudata.csv),我们可以使用Python中的Scikit-learn库来创建分类模型。以下是一个简单的步骤: 1. 加载数据集 首先,需要使用pandas库来加载数据集。simudata.csv是一个逗号分隔的文件,因此我们可以使用pandas的read_csv()函数来加载数据集。 ```python import pandas as pd data = pd.read_csv('simudata.csv') ``` 2. 数据预处理 接下来,需要对数据进行预处理,包括数据清洗、特征选择、特征缩放等。在这里,我们将简单地使用所有的特征,并对其进行缩放。 ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X = scaler.fit_transform(data.drop(['label'], axis=1)) y = data['label'] ``` 3. 创建模型 在这里,我们将使用逻辑回归算法来创建分类器。 ```python from sklearn.linear_model import LogisticRegression clf = LogisticRegression() ``` 4. 训练模型 接下来,我们将使用训练数据来训练分类器。 ```python clf.fit(X_train, y_train) ``` 5. 评估模型 最后,我们将使用测试数据来评估分类器的性能。 ```python from sklearn.metrics import accuracy_score y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print("Accuracy: %.2f%%" % (accuracy * 100.0)) ``` 以上是一个简单的步骤,可以使用Scikit-learn库创建分类模型来对互联网征信数据进行分类。当然,具体的步骤和方法还需要根据实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值