精华内容
下载资源
问答
  • 信用评分模型的类型
    千次阅读
    2021-01-10 22:05:47

    1. 引言

    信用统计评级模型是指通过观察和分析企业财务报表中的一些感性的财务来判别企业财务状况以及采取适当防范施的数学模型对于投资和债权,可以根据财务预测指数的动态分析进行正确的投资选择;而对于上市公司经营者来说,可以据此揭示财务经营中所存在的问题,及时调整公司经营策略,以避免沦 ST、PT 的行列

    Beaver 运用单变量分析方法对企业破产问题进行了初步的研究,Altman 首次应用 Fisher 线性判定分析对美国的企业破产进行了研究,并建立了企业破产的预测模型。但是以前的研究存在以下问题

    (1) 在建模过程中选择与训练集在同一财务年度的样本作为预测集。以前的所究然划分了独立的训练集和测试集,但是两者在同一财务年度区间内,实证结果并不能反映模型的真正预测能力,因此,建模时应该构建预测集,且预测集最好是训练集对应财务年度的后几年的财务数据

    (2) 没有分行业建立财务预警系统。事实上,不同行业的同一财务比率经验可能不同,甚至有很大的差异。以流动比率为例,工业企业的流动比率为 2:1 较合理,而商业企业的流动比率则应低于该值。所以,分行业来建立财务预警模型可以提高它在一定范围内预测的准确性

    本文将选取我国第三产业上市公司 2008 年末的财务比率作为训练样本建立因子分析模型,同时,为了验证模型的预测准确性,又以我国第三产业上市公司 2009 年年末的财务比率作为预测样本,检验因子分析模型的预测效果

    2. 样本的选取

    在本文中,被证监会认定的 ST 公司(包括*ST 公司,下同)为陷入财务危机(信用差)的公司,而非 ST 公司(信用好)为财务状况正常的公司。在样本的选中,循以下原则:

    (1)同行业
    以第三产业上市公司的财务比率为训练样本和预测样本,得出来的模型也只适应对第三产业上市公司的财务状况的

    (2)不同时期
    预测集最好是训练集对应财务年度的后一年或几年的财务数据

    (3)同规模
    同一年度的非 ST 公司与 ST 公司的资产规模相当

    根据以上原则,本文选取 2008 年和 2009 年我国第三产业上市公司中的各 20 家 ST 公司和 20 家非 ST公司的年末财务比率,2008 年的数据作为训练样本,2009 年的数据作为测试样本

    证券代码公司名称类型证券代码公司名称类型
    12
    12
    12
    12
    12

    3. 财务比率的选取

    由于缺乏具体的经济理论指导,而公司被 ST 的本质原因又不尽相同,所以很难用简单的几个财务比率对财务困境进行充分描述。因此我们在研究过程中选取尽可能多的财务比率,这些不同的财务比率反映着企业不同的财务侧面,主要从 4 个方面 14 个财务比率来考虑

    (1)短期偿债能力:

    • 流动比率 = 流动资产 / 流动负债;
    • 速动比率 = (流动资产 - 存货)/流动负债;
    • 营运资金对资产总额比率 = (流动资产 - 流动负债) / 资产总额

    (2)营运能力

    • 存货周转率 = 营运成本 / 平均存货;
    • 流动资产周转率 = 销售收人 / 平均流动资产;
    • 固定资产周转率 = 销售收入 / 平均固定资产;
    • 总资产周转率 = 销售收入 / 资产总额

    (3) 长期偿债能力

    • 股东权益比率 = 股东权益 / 资产总额;
    • 流动资产比率流 = 资产 / 资产总额;
    • 利息保障倍数= EBIT / 利息费用

    (4)获利能力

    • 营业收净利润率 = 净利润 / 销售收入;
    • 资产净利润率 = 净利润 / 资产总额;
    • 流动资产净利润率 = 净利润 / 流动资产;
    • 固定资产净利润率 = 净利润 / 固定资产
    更多相关内容
  • 在信贷市场中,筛选算法区分好类型和坏类型的借款人。 这是他们存在的理由。 然而,通过这样做,他们也经常区分共享受保护属性(例如性别、年龄、种族)的个人和其他人口。 在本文中,我们展示了如何测试 (1) 在拒绝...
  • 典型的信用评分模型如图1-1所示。信用风险评级模型的主要开发流程如下: (1) 数据获取,包括获取存量客户及潜在客户的数据。存量客户是指已经在证券公司开展相关融资类业务的客户,包括个人客户和机构客户;潜在...

    信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级。人信用评级有一系列评级模型组成,常见是A卡(申请评分卡)、B卡(行为模型)、C卡(催收模型)和F卡(反欺诈模型)。 今天我们展示的是个人信用评级模型的开发过程,数据采用kaggle上知名的give me some credit数据集。

    一、项目流程

    典型的信用评分卡模型如图1-1所示。信用风险评级模型的主要开发流程如下:
    (1) 获取数据,包括申请贷款客户的数据。数据包括客户各个维度,包括年龄,性别,收入,职业,家人数量,住房情况,消费情况,债务等等。
    (2) 数据预处理,主要工作包括数据清洗、缺失值处理、异常值处理、数据类型转换等等。我们需要把原始数据层层转化为可建模数据。
    (3) EDA探索性数据分析和描述性统计,包括统计总体数据量大小,好坏客户占比,数据类型有哪些,变量缺失率,变量频率分析直方图可视化,箱形图可视化,变量相关性可视化等。
    (4) 变量选择,通过统计学和机器学习的方法,筛选出对违约状态影响最显著的变量。常见变量选择方法很多,包括iv,feature importance,方差等等 。另外缺失率太高的变量也建议删除。无业务解释性变量且没有价值变量也建议删除。
    (5) 模型开发,评分卡建模主要难点是woe分箱,分数拉伸,变量系数计算。其中woe分箱是评分卡中难点中难点,需要丰富统计学知识和业务经验。目前分箱算法多达50多种,没有统一金标准,一般是先机器自动分箱,然后再手动调整分箱,最后反复测试模型最后性能,择优选取最优分箱算法。
    (6) 模型验证,核实模型的区分能力、预测能力、稳定性、排序能力等等,并形成模型评估报告,得出模型是否可以使用的结论。模型验证不是一次性完成,而是当建模后,模型上线前,模型上线后定期验证。模型开发和维护是一个循环周期,不是一次完成。
    (7) 信用评分卡,根据逻辑回归的变量系数和WOE值来生成评分卡。评分卡方便业务解释,已使用几十年,非常稳定,深受金融行业喜爱。其方法就是将Logistic模型概率分转换为300-900分的标准评分的形式。

    (8) 评分卡自动评分系统,根据信用评分卡方法,建立计算机自动信用化评分系统。美国传统产品FICO有类似功能,FICO底层语言是Java。目前流行Java,python或R多种语言构建评分卡自动化模型系统。

    (9)模型监控,着时间推移,模型区分能力,例如ks,auc会逐步下降,模型稳定性也会发生偏移。我们需要专业模型监控团队,当监控到模型区分能力下降显著或模型稳定性发生较大偏移时,我们需要重新开发模型,迭代模型。模型监控团队应该每日按时邮件发送模型监控报表给相关团队,特别是开发团队和业务团队。
    在这里插入图片描述
    图1-1 信用评分模型开发流程

    PS:有些时候为了便于命名,相应的变量用标号代替

    二、数据获取

    数据来自Kaggle的Give Me Some Credit,有15万条的样本数据,下图可以看到这份数据的大致情况。
    数据属于个人消费类贷款,只考虑信用评分最终实施时能够使用到的数据应从如下一些方面获取数据:
    – 基本属性:包括了借款人当时的年龄。
    – 偿债能力:包括了借款人的月收入、负债比率。
    – 信用往来:两年内35-59天逾期次数、两年内60-89天逾期次数、两年内90
    天或高于90天逾期的次数。
    – 财产状况:包括了开放式信贷和贷款数量、不动产贷款或额度数量。
    – 贷款属性:暂无。
    – 其他因素:包括了借款人的家属数量(不包括本人在内)。
    – 时间窗口:自变量的观察窗口为过去两年,因变量表现窗口为未来两年。

    图2-1 原始数据的变量

    三、数据预处理

    在对数据处理之前,需要对数据的缺失值和异常值情况进行了解。Python内有describe()函数,可以了解数据集的缺失值、均值和中位数等。

        
        data = pd.read_csv('cs-training.csv')
        
        data.describe().to_csv('DataDescribe.csv')
    
    

    数据集的详细情况:

    图3-1 变量详细情况

    从上图可知,变量MonthlyIncome和NumberOfDependents存在缺失,变量MonthlyIncome共有缺失值29731个,NumberOfDependents有3924个缺失值。

    3.1 缺失值处理

    这种情况在现实问题中非常普遍,这会导致一些不能处理缺失值的分析方法无法应用,因此,在信用风险评级模型开发的第一步我们就要进行缺失值处理。缺失值处理的方法,包括如下几种。
    (1) 直接删除含有缺失值的样本。
    (2) 根据样本之间的相似性填补缺失值。
    (3) 根据变量之间的相关关系填补缺失值。
    变量MonthlyIncome缺失率比较大,所以我们根据变量之间的相关关系填补缺失值,我们采用随机森林法:

    
    def set_missing(df):
        
        process_df = df.ix[:,[5,0,1,2,3,4,6,7,8,9]]
        
        known = process_df[process_df.MonthlyIncome.notnull()].as_matrix()
        unknown = process_df[process_df.MonthlyIncome.isnull()].as_matrix()
        
        X = known[:, 1:]
        
        y = known[:, 0]
        
        rfr = RandomForestRegressor(random_state=0, 
        n_estimators=200,max_depth=3,n_jobs=-1)
        rfr.fit(X,y)
        
        predicted = rfr.predict(unknown[:, 1:]).round(0)
        print(predicted)
        
        df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted
        return df
    
    

    NumberOfDependents变量缺失值比较少,直接删除,对总体模型不会造成太大影响。对缺失值处理完之后,删除重复项。

        data=set_missing(data)
        data=data.dropna()
        data = data.drop_duplicates()
        data.to_csv('MissingData.csv',index=False)
    
    

    3.2 异常值处理

    缺失值处理完毕后,我们还需要进行异常值处理。异常值是指明显偏离大多数抽样数据的数值,比如个人客户的年龄为0时,通常认为该值为异常值。找出样本总体中的异常值,通常采用离群值检测的方法。
    首先,我们发现变量age中存在0,显然是异常值,直接剔除:

        
        data = data[data['age'] > 0]
    
    

    对于变量NumberOfTime30-59DaysPastDueNotWorse、NumberOfTimes90DaysLate、NumberOfTime60-89DaysPastDueNotWorse这三个变量,由下面的箱线图图3-2可以看出,均存在异常值,且由unique函数可以得知均存在96、98两个异常值,因此予以剔除。同时会发现剔除其中一个变量的96、98值,其他变量的96、98两个值也会相应被剔除。

    图3-2 箱形图

    剔除变量NumberOfTime30-59DaysPastDueNotWorse、NumberOfTimes90DaysLate、NumberOfTime60-89DaysPastDueNotWorse的异常值。另外,数据集中好客户为0,违约客户为1,考虑到正常的理解,能正常履约并支付利息的客户为1,所以我们将其取反。

        
        data = data[data['NumberOfTime30-59DaysPastDueNotWorse'] < 90]
        
        data['SeriousDlqin2yrs']=1-data['SeriousDlqin2yrs']
    
    

    3.3 数据切分

    为了验证模型的拟合效果,我们需要对数据集进行切分,分成训练集和测试集。

    from sklearn.cross_validation import train_test_split
    
    
        Y = data['SeriousDlqin2yrs']
        X = data.ix[:, 1:]
        
        X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
        
        train = pd.concat([Y_train, X_train], axis=1)
        test = pd.concat([Y_test, X_test], axis=1)
        clasTest = test.groupby('SeriousDlqin2yrs')['SeriousDlqin2yrs'].count()
        train.to_csv('TrainData.csv',index=False)
        test.to_csv('TestData.csv',index=False)
    
    

    四、探索性分析

    在建立模型之前,我们一般会对现有的数据进行 探索性数据分析(Exploratory Data Analysis) 。 EDA是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索。常用的探索性数据分析方法有:直方图、散点图和箱线图等。
    客户年龄分布如图4-1所示,可以看到年龄变量大致呈正态分布,符合统计分析的假设。

    图4-1 客户年龄分布

    客户年收入分布如图4-2所示,月收入也大致呈正态分布,符合统计分析的需要。

    图4-2 客户收入分布

    五、变量选择

    特征变量选择(排序)对于数据分析、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。至于Python的变量选择代码实现可以参考结合Scikit-learn介绍几种常用的特征选择方法
    在本文中,我们采用信用评分模型的变量选择方法,通过WOE分析方法,即是通过比较指标分箱和对应分箱的违约概率来确定指标是否符合经济意义。首先我们对变量进行离散化(分箱)处理。

    5.1 分箱处理

    变量分箱(binning)是对连续变量离散化(discretization)的一种称呼。信用评分卡开发中一般有常用的等距分段、等深分段、最优分段。其中等距分段(Equval length intervals)是指分段的区间是一致的,比如年龄以十年作为一个分段;等深分段(Equal frequency intervals)是先确定分段数量,然后令每个分段中数据数量大致相等;最优分段(Optimal Binning)又叫监督离散化(supervised discretizaion),使用递归划分(Recursive Partitioning)将连续变量分为分段,背后是一种基于条件推断查找较佳分组的算法。
    我们首先选择对连续变量进行最优分段,在连续变量的分布不满足最优分段的要求时,再考虑对连续变量进行等距分段。最优分箱的代码如下:

    
    def mono_bin(Y, X, n = 20):
        r = 0
        good=Y.sum()
        bad=Y.count()-good
        while np.abs(r) < 1:
            d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n)})
            d2 = d1.groupby('Bucket', as_index = True)
            r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
            n = n - 1
        d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
        d3['min']=d2.min().X
        d3['max'] = d2.max().X
        d3['sum'] = d2.sum().Y
        d3['total'] = d2.count().Y
        d3['rate'] = d2.mean().Y
        d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
        d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
        print("=" * 60)
        print(d4)
        return d4
    
    

    针对我们将使用最优分段对于数据集中的RevolvingUtilizationOfUnsecuredLines、age、DebtRatio和MonthlyIncome进行分类。

    图5-1 RevolvingUtilizationOfUnsecuredLines分箱情况.png

    图5-2 age分箱情况.png

    图5-3 DebtRatio分箱情况.png

    图5-4 MonthlyIncome分箱情况.png

    针对不能最优分箱的变量,分箱如下:

        
        cutx3 = [ninf, 0, 1, 3, 5, pinf]
        cutx6 = [ninf, 1, 2, 3, 5, pinf]
        cutx7 = [ninf, 0, 1, 3, 5, pinf]
        cutx8 = [ninf, 0,1,2, 3, pinf]
        cutx9 = [ninf, 0, 1, 3, pinf]
        cutx10 = [ninf, 0, 1, 2, 3, 5, pinf]
    
    

    5.2 WOE

    WoE分析, 是对指标分箱、计算各个档位的WoE值并观察WoE值随指标变化的趋势。其中WoE的数学定义是:
    woe=ln(goodattribute/badattribute)
    在进行分析时,我们需要对各指标从小到大排列,并计算出相应分档的WoE值。其中正向指标越大,WoE值越小;反向指标越大,WoE值越大。正向指标的WoE值负斜率越大,反响指标的正斜率越大,则说明指标区分能力好。WoE值趋近于直线,则意味指标判断能力较弱。若正向指标和WoE正相关趋势、反向指标同WoE出现负相关趋势,则说明此指标不符合经济意义,则应当予以去除。
    woe函数实现在上一节的mono_bin()函数里面已经包含,这里不再重复。

    5.3 相关性分析和IV筛选

    接下来,我们会用经过清洗后的数据看一下变量间的相关性。注意,这里的相关性分析只是初步的检查,进一步检查模型的VI(证据权重)作为变量筛选的依据。
    相关性图我们通过Python里面的seaborn包,调用heatmap()绘图函数进行绘制,实现代码如下:

        corr = data.corr()
        xticks = ['x0','x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']
        yticks = list(corr.index)
        fig = plt.figure()
        ax1 = fig.add_subplot(1, 1, 1)
        sns.heatmap(corr, annot=True, cmap='rainbow', ax=ax1, annot_kws={'size': 9, 'weight': 'bold', 'color': 'blue'})
        ax1.set_xticklabels(xticks, rotation=0, fontsize=10)
        ax1.set_yticklabels(yticks, rotation=0, fontsize=10)
        plt.show()
    
    

    生成的图形如图5-5所示:

    图5-5 数据集各变量的相关性

    由上图可以看出,各变量之间的相关性是非常小的。NumberOfOpenCreditLinesAndLoans和NumberRealEstateLoansOrLines的相关性系数为0.43。
    接下来,我进一步计算每个变量的Infomation Value(IV)。IV指标是一般用来确定自变量的预测能力。 其公式为:
    IV=sum((goodattribute-badattribute)*ln(goodattribute/badattribute))
    通过IV值判断变量预测能力的标准是:
    < 0.02: unpredictive
    0.02 to 0.1: weak
    0.1 to 0.3: medium
    0.3 to 0.5: strong
    > 0.5: suspicious
    IV的实现放在mono_bin()函数里面,代码实现如下:

    
    def mono_bin(Y, X, n = 20):
        r = 0
        good=Y.sum()
        bad=Y.count()-good
        while np.abs(r) < 1:
            d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n)})
            d2 = d1.groupby('Bucket', as_index = True)
            r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
            n = n - 1
        d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
        d3['min']=d2.min().X
        d3['max'] = d2.max().X
        d3['sum'] = d2.sum().Y
        d3['total'] = d2.count().Y
        d3['rate'] = d2.mean().Y
        d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
        d3['goodattribute']=d3['sum']/good
        d3['badattribute']=(d3['total']-d3['sum'])/bad
        iv=((d3['goodattribute']-d3['badattribute'])*d3['woe']).sum()
        d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
        print("=" * 60)
        print(d4)
        cut=[]
        cut.append(float('-inf'))
        for i in range(1,n+1):
            qua=X.quantile(i/(n+1))
            cut.append(round(qua,4))
        cut.append(float('inf'))
        woe=list(d4['woe'].round(3))
        return d4,iv,cut,woe
    
    

    生成的IV图代码:

        ivlist=[ivx1,ivx2,ivx3,ivx4,ivx5,ivx6,ivx7,ivx8,ivx9,ivx10]
        index=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']
        fig1 = plt.figure(1)
        ax1 = fig1.add_subplot(1, 1, 1)
        x = np.arange(len(index))+1
        ax1.bar(x, ivlist, width=0.4)
        ax1.set_xticks(x)
        ax1.set_xticklabels(index, rotation=0, fontsize=12)
        ax1.set_ylabel('IV(Information Value)', fontsize=14)
        
        for a, b in zip(x, ivlist):
            plt.text(a, b + 0.01, '%.4f' % b, ha='center', va='bottom', fontsize=10)
        plt.show()
    
    

    输出图像:

    图5-6 输出的各变量IV图

    可以看出,DebtRatio、MonthlyIncome、NumberOfOpenCreditLinesAndLoans、NumberRealEstateLoansOrLines和NumberOfDependents变量的IV值明显较低,所以予以删除。

    小结

    本文主要介绍了信用评分模型开发过程中的数据预处理、探索性分析和变量选择。数据预处理主要针对缺失值用随机森林法和直接剔除法进行处理,对于异常值主要根据实际情况和箱形图的数据分布,对异常值进行剔除;探索性分析主要对各变量的分布情况进行初始的探究;变量选择主要考虑了变量的分箱方法,根据分箱结果计算WOE值,然后检查变量之间的相关性,根据各变量的IV值来选择对数据处理有好效果的变量。

    。接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分系统。

    六、模型分析

    证据权重(Weight of Evidence,WOE)转换可以将Logistic回归模型转变为标准评分卡格式。引入WOE转换的目的并不是为了提高模型质量,只是一些变量不应该被纳入模型,这或者是因为它们不能增加模型值,或者是因为与其模型相关系数有关的误差较大,其实建立标准信用评分卡也可以不采用WOE转换。这种情况下,Logistic回归模型需要处理更大数量的自变量。尽管这样会增加建模程序的复杂性,但最终得到的评分卡都是一样的。
    在建立模型之前,我们需要将筛选后的变量转换为WoE值,便于信用评分。

    6.1 WOE转换

    我们已经能获取了每个变量的分箱数据和woe数据,只需要根据各变量数据进行替换,实现代码如下:

    
    def replace_woe(series,cut,woe):
        list=[]
        i=0
        while i<len(series):
            value=series[i]
            j=len(cut)-2
            m=len(cut)-2
            while j>=0:
                if value>=cut[j]:
                    j=-1
                else:
                    j -=1
                    m -= 1
            list.append(woe[m])
            i += 1
        return list
    
    

    我们将每个变量都进行替换,并将其保存到WoeData.csv文件中:

        
        data['RevolvingUtilizationOfUnsecuredLines'] = Series(replace_woe(data['RevolvingUtilizationOfUnsecuredLines'], cutx1, woex1))
        data['age'] = Series(replace_woe(data['age'], cutx2, woex2))
        data['NumberOfTime30-59DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, woex3))
        data['DebtRatio'] = Series(replace_woe(data['DebtRatio'], cutx4, woex4))
        data['MonthlyIncome'] = Series(replace_woe(data['MonthlyIncome'], cutx5, woex5))
        data['NumberOfOpenCreditLinesAndLoans'] = Series(replace_woe(data['NumberOfOpenCreditLinesAndLoans'], cutx6, woex6))
        data['NumberOfTimes90DaysLate'] = Series(replace_woe(data['NumberOfTimes90DaysLate'], cutx7, woex7))
        data['NumberRealEstateLoansOrLines'] = Series(replace_woe(data['NumberRealEstateLoansOrLines'], cutx8, woex8))
        data['NumberOfTime60-89DaysPastDueNotWorse'] = Series(replace_woe(data['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, woex9))
        data['NumberOfDependents'] = Series(replace_woe(data['NumberOfDependents'], cutx10, woex10))
        data.to_csv('WoeData.csv', index=False)
    
    

    6.2 Logisic模型建立

    我们直接调用statsmodels包来实现逻辑回归:

        导入数据
        data = pd.read_csv('WoeData.csv')
        
        Y=data['SeriousDlqin2yrs']
        
        X=data.drop(['SeriousDlqin2yrs','DebtRatio','MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines','NumberOfDependents'],axis=1)
        X1=sm.add_constant(X)
        logit=sm.Logit(Y,X1)
        result=logit.fit()
        print(result.summary())
    
    

    输出结果:

    图6-1 逻辑回归模型结果.png

    通过图6-1可知,逻辑回归各变量都已通过显著性检验,满足要求。

    6.3 模型检验

    到这里,我们的建模部分基本结束了。我们需要验证一下模型的预测能力如何。我们使用在建模开始阶段预留的test数据进行检验。通过ROC曲线和AUC来评估模型的拟合能力。
    在Python中,可以利用sklearn.metrics,它能方便比较两个分类器,自动计算ROC和AUC。
    实现代码:

        
        Y_test = test['SeriousDlqin2yrs']
        
        X_test = test.drop(['SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines', 'NumberOfDependents'], axis=1)
        X3 = sm.add_constant(X_test)
        resu = result.predict(X3)
        fpr, tpr, threshold = roc_curve(Y_test, resu)
        rocauc = auc(fpr, tpr)
        plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)
        plt.legend(loc='lower right')
        plt.plot([0, 1], [0, 1], 'r--')
        plt.xlim([0, 1])
        plt.ylim([0, 1])
        plt.ylabel('真正率')
        plt.xlabel('假正率')
        plt.show()
    
    

    输出结果:

    从上图可知,AUC值为0.85,说明该模型的预测效果还是不错的,正确率较高。

    七、信用评分

    我们已经基本完成了建模相关的工作,并用ROC曲线验证了模型的预测能力。接下来的步骤,就是将Logistic模型转换为标准评分卡的形式。

    7.1 评分标准

    依据以上论文资料得到:
    a=log(p_good/P_bad)
    Score = offset + factor * log(odds)
    在建立标准评分卡之前,我们需要选取几个评分卡参数:基础分值、 PDO(比率翻倍的分值)和好坏比。 这里, 我们取600分为基础分值,PDO为20 (每高20分好坏比翻一倍),好坏比取20。

        
        p = 20 / math.log(2)
        q = 600 - 20 * math.log(20) / math.log(2)
        baseScore = round(q + p * coe[0], 0)
    
    

    个人总评分=基础分+各部分得分

    7.2 部分评分

    下面计算各变量部分的分数。各部分得分函数:

    
    def get_score(coe,woe,factor):
        scores=[]
        for w in woe:
            score=round(coe*w*factor,0)
            scores.append(score)
        return scores
    
    

    计算各变量得分情况:

        
        x1 = get_score(coe[1], woex1, p)
        x2 = get_score(coe[2], woex2, p)
        x3 = get_score(coe[3], woex3, p)
        x7 = get_score(coe[4], woex7, p)
        x9 = get_score(coe[5], woex9, p)
    
    

    我们可以得到各部分的评分卡如图7-1所示:

    八、自动评分系统

    根据变量来计算分数,实现如下:

    
    def compute_score(series,cut,score):
        list = []
        i = 0
        while i < len(series):
            value = series[i]
            j = len(cut) - 2
            m = len(cut) - 2
            while j >= 0:
                if value >= cut[j]:
                    j = -1
                else:
                    j -= 1
                    m -= 1
            list.append(score[m])
            i += 1
        return list
    
    

    我们来计算test里面的分数:

        test1 = pd.read_csv('TestData.csv')
        test1['BaseScore']=Series(np.zeros(len(test1)))+baseScore
        test1['x1'] = Series(compute_score(test1['RevolvingUtilizationOfUnsecuredLines'], cutx1, x1))
        test1['x2'] = Series(compute_score(test1['age'], cutx2, x2))
        test1['x3'] = Series(compute_score(test1['NumberOfTime30-59DaysPastDueNotWorse'], cutx3, x3))
        test1['x7'] = Series(compute_score(test1['NumberOfTimes90DaysLate'], cutx7, x7))
        test1['x9'] = Series(compute_score(test1['NumberOfTime60-89DaysPastDueNotWorse'], cutx9, x9))
        test1['Score'] = test1['x1'] + test1['x2'] + test1['x3'] + test1['x7'] +test1['x9']  + baseScore
        test1.to_csv('ScoreData.csv', index=False)
    
    

    批量计算的部分分结果:

    九、总结以及展望

    本文通过对kaggle上的Give Me Some Credit数据的挖掘分析,结合信用评分卡的建立原理,从数据的预处理、变量选择、建模分析到创建信用评分,创建了一个简单的信用评分系统。
    基于AI 的机器学习评分卡系统可通过把旧数据(某个时间点后,例如2年)剔除掉后再进行自动建模、模型评估、并不断优化特征变量,使得系统更加强大。
    总结

    基于Python的信用评分卡模型主要流程就为大家介绍到这里,但实操评分卡建模中有很多细节,互联网上对这些细节描述过于草率甚至不正确。例如变量缺失率达到80%-90%就应该直接删除该变量吗?变量相关性高达0.8就可以去掉吗?经验丰富建模人员需要在数学理论,业务线实际需求,计算机测试结果等多方面找到平衡点,而不是只从一个角度思考问题。这就像经验丰富外科医生并不一定完全遵循教科书的理论。统计学,机器学习,人工智能等领域里有很多争议地方,并非有完全统一共识。各位在学习时要保持独立思考能力,这样才能不断优化数据科学知识。

    基于Python的信用评分卡模型-give me some credit就为大家介绍到这里了,欢迎各位同学报名<python金融风控评分卡模型和数据分析微专业课>
    https://edu.csdn.net/combo/detail/1927
    学习更多相关知识。

    代码网盘地址

    百度网盘下载链接:https://pan.baidu.com/s/14xMcCRSvnjrwhM7t6ZEOgw
    提取码:1234

    参考文献

    python金融风控评分卡模型和数据分析
    基于R语言的信用评分卡建模分析
    信用卡评分模型
    信用标准评分卡模型开发及实现
    手把手教你用R语言建立信用评分模型
    Scorecard 评分卡模型
    使用python进行数据清洗
    Monotonic Binning with Python
    Python异常值处理与检测
    结合Scikit-learn介绍几种常用的特征选择方法
    基于Python的信用评分卡模型分析

    展开全文
  • 银行信用评分模型(一)| python

    千次阅读 2022-02-14 12:49:12
    信用风险和评分模型的基本概念:信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性,它是金融风险的主要类型。...

    文章目录

    • 背景介绍
    • 题目分析
    • 一、申请者评级模型
    • 二、欺诈评级模型
    • 三、行为评级模型
    • 四、催收评级模型
    • 总结

    背景介绍

          信用风险和评分卡模型的基本概念:信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性,它是金融风险的主要类型。借贷场景中的评分卡是一种以分数的形式来衡量风险几率的一种手段,也是对未来一段时间内违约、逾期、失联概率的预测。一般来说,分数越高,风险越小。

            信用风险计量体系包括主体评级模型和债项评级两部分。其中主体评级模型包含以下四个方面内容:

    1. 申请者评级模型:主要应用于相关融资类业务中新用户的主体评级,适用于个人及机构融资主体。位于贷前准入环节。
    2. 行为评级模型:主要用于相关融资类业务中存量客户在续存期内的管理,如对客户可能出现的逾期、延期等行为进行预测,仅适用于个人融资主体。 
    3. 催收评级模型:主要应用于相关融资类业务中存量客户是否需要催收的预测管理,仅适用于个人融资主体。 
    4. 欺诈评级模型:主要应用于相关融资类业务中新客户可能存在的欺诈行为的预测管理,适用于个人和机构融资主体。在贷前准入环节里面。

         经过分析,已给的4个数据集文件在内容上可以对应上面四个模型,分别是客户信用记录对应申请者评级模型;申请客户信息对应行为评级;拖欠历史记录对应催收评级模型;消费历史记录对应欺诈评级模型。


    题目要求

           学生可以从影响用户信用等级的主要因素进行分析,以及结合信用卡用户的人口特征属性对欺诈行为和拖欠行为的影响因素进行分析。通过对银行的客户信用记录、申请客户信息、拖欠历史记录、消费历史记录等数据进行分析,对不同信用程度的客户进行归类,研究信用卡贷款拖欠、信用卡欺诈等问题与客户的个人信息、信用卡使用信息的关系。

            学生可以从四个方面建模:申请者评级模型,行为评级模型,催收评级模型,欺诈评级模型,全面分析银行信用卡信用风险。

    技术要求:Python、scikit-learn、numpy、pandas、matplotlib等。

    数据分析及预处理:对原始数据进行预处理,比如数据清洗,数据标准化,数据编码等。

    模型构建:对预处理后的数据进行建模,模型方法不限。

    模型评估及优化:对数据进行评估,输出评估结果,并就结果进行分析,提出改进建议。

    数据可视化:对数据进行可视化输出,方便客户理解。


    一、申请者评级模型

            客户信用记录中记录了用户的个人信息,以及银行根据相关信息给出的信用评分和评级,其中有部分内容于预测工作无关,比如“客户号”、“客户姓名”、“户籍”;由于文件中出现的用户都是已经通过了申请的,所以“审批结果”于预测工作没有帮助;文件中“额度”一栏是信用得到的结果,信用越好额度越高,这一栏不是预测工作的目标;“信用总评分”和“信用等级”反应了同一内容,如果以评分作为标签,那么预测工作应该是预测连续值的回归问题,他们的信用总评分就是是否能通过申请的标准。换句话说,信用总评分大于60分的客户可以通过申请。基于这个思路我们可以构建一个线性回归模型,预测每个申请客户的信用总评分来判断是否通过申请。

    因此在申请者评级模型中我们用到的数据集为申请客户信息和客户信用记录信息。处理步骤如下:

    1.数据预处理

    • 删除缺省值,大体浏览过文件,由于空缺不多,可以直接删除处理;相关性分析,去除无关特征或者相关性较小的特征
    • 对无序特征进行独热码处理,如“性别”、“信用等级”,对有序特征进行顺序编码,如“教育程度”、“居住类型”;
    • 删除收入大于一千万的用户,年龄-工龄小于16大于30的用户,因为这极大概率是记录错误,不符合实际;
    • 选定除“信用等级”外的内容作为特征,“信用等级”作为标签,按0.25的比例分出训练集和测试集;
    • 对特征进行归一化,防止过拟合;
    • 可以保存结果为csv文件,检查是否存在问题。

    代码如下(示例):

    #申请者评级模型:从申请者与客户信息来进行入手分析
    #先导入常用库:
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from scipy import stats
    from scipy.stats import norm,skew

    1. 提取数据:去重

    #这里大概需要总结一下:就是在去重的时候,需要数据一模一样,然而有些虽然相同名字,但是数据有些缺失导致不能进行去重,这个时候需要选择两种办法去解决:

    #   1.第一个:就是通过一个独特的信息在大范围的数据中把小范围数据进行筛选出来,然后把需要的特征提取再合并

    #   2.第二个:就是先合并,然后把有空数据的行都去掉,之后再进行去除列,有一个问题就是,当有行的索引重复时,就会导致索引错误,从而只能选择第一种方法

    #进行数据的导入,简单查看:
    customer_credit_info =  pd.read_excel('客户信用记录.xlsx',index_col='客户号')
    #这里不进行以列名进行排序,是因为后面需要'客户号'进行去重:
    customer_applications_info = pd.read_excel('申请客户信息.xlsx')
    #这里是进行在申请客户记录中以客户信用记录中的客户号去寻找一样的客户信息:
    customer_applications_info = customer_applications_info[customer_applications_info['客户号'].isin(customer_credit_info.index)].loc[:,['客户号','信贷情况']]
    #在找到客户相关记录之后,我们发现两条数据重合了,这个时候需要去重,如果前面没有客户号这一列的去重将不会成功:
    customer_applications_info.drop_duplicates(inplace=True)
    #去重后按'客户号'进行组合为一条数据:
    customer_applications_info.set_index(['客户号'],inplace=True)
    print(customer_applications_info)
    all_info = pd.concat([customer_applications_info,customer_credit_info],axis=1)
    all_info.info()
    

    2.删除无用特征和相关性小的特征:

    对于审批结果、额度等信息在该阶段不会用到可以删除。我们判断数据与评分的相关性进行删除某些特征数据。对于信用等级、审批结果、额度、年龄、工作年限、姓名等无关特征可直接删除,

    #这里有一些没有用的信息,例如审批结果,信用等级,这个信用等级是根据信用总评分来进行判定的,以及额度,在贷款准入环节没有额度,而且我们发现额度与其信用等级的判定有着必然联系:
    all_info.drop(['信用等级','审批结果','额度'],axis=1,inplace=True)
    all_info.info()
    #对于所有数值类型的数据都特征提取完之后,就把所有没有用的特征去掉就好了:
    all_info.drop(['年龄_连续','工作年限','个人收入_连续'],axis=1,inplace=True)
    #查看一下,特征有没有弄错:
    all_info.info()
    all_info.head()

    剩下的特征进行相关度评分,在进行删除:

    #有了那么多特征,我们可以大致来筛选一下看一下他们的相关性:
    corrDf = all_info.corr()['信用总评分']
    corrDf.sort_values(ascending=False)
    #plt.figure(figsize=(25,20))
    #corr = sns.heatmap(all_info.corr(),annot=True)
    

     

     #这里我们看到有两个特别小的,我们就先去掉吧:

    #这里我们看到有两个特别小的,我们就先去掉吧:
    all_info.drop(['婚姻状态_丧偶','教育程度_大专'],axis=1,inplace=True)

    3.优化数据标签

    #个人年收入密度分布图
    plt.subplot2grid((1,3),(0,2))
    all_info.个人收入_连续.plot(kind='kde') #密度图像  
    plt.xlabel(u"个人年收入")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"个人年分布")
    #对于个人收入来说,横坐标被拉到1500亿,而大部分都集中在趋于零的位置,所以这里要进行分类,这里我们按中国收入阶层划分(http://www.360doc.com/content/20/0101/11/29249721_883480188.shtml)来进行分类:
    def 收入分级标准(number):
        if number<10000:
            return '赤贫'
        elif number<30000:
            return '下层贫民'
        elif number<80000:
            return '中层贫民'
        elif number<150000:
            return '上层贫民'
        elif number<300000:
            return '低产'
        elif number<500000:
            return '中产'
        elif number<1000000:
            return '高产'
        elif number<10000000:
            return '富人'
        elif number<100000000:
            return '富豪'
        else:
            return '大富豪'
    个人收入分级 = pd.DataFrame()
    个人收入分级['年收入分级'] = all_info['个人收入_连续'].map(收入分级标准)
    #print(个人收入分级.分级.value_counts())#看分类是否出错
    个人收入分级 = pd.get_dummies(data=个人收入分级,columns=['年收入分级'])
    all_info = pd.concat([all_info,个人收入分级],axis=1)

    2.数据可视化分析

    import sklearn.preprocessing as preprocessing
    
    fig=plt.figure(figsize=(15,5),dpi=150)
    fig.set(alpha=0.2)
    
    #年龄密度分布图
    plt.subplot2grid((1,3),(0,0))
    all_info.年龄_连续.plot(kind='kde') #密度图像  
    plt.xlabel(u"年龄")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"年龄分布")
    #对于年龄来说,分布正常,我们只需要进行数据的标准化就好了:
    scaler = preprocessing.StandardScaler() 
    all_info['年龄_scaled'] = scaler.fit_transform(all_info['年龄_连续'].values.reshape(-1,1))
    
    #工作年限密度分布图
    plt.subplot2grid((1,3),(0,1))
    all_info.工作年限.plot(kind='kde') #密度图像  
    plt.xlabel(u"年数")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"工作年限分布")
    #对于工作年限来说,也分布正常,我们像上面一样进行数据的标准化处理:
    scaler = preprocessing.StandardScaler() 
    all_info['工作年限_scaled'] = scaler.fit_transform(all_info['工作年限'].values.reshape(-1,1))
    
    
    #个人年收入密度分布图
    plt.subplot2grid((1,3),(0,2))
    all_info.个人收入_连续.plot(kind='kde') #密度图像  
    plt.xlabel(u"个人年收入")# plots an axis lable
    plt.ylabel(u"密度") 
    plt.title(u"个人年分布")
     
    

    分析可知,由于部分申请者年收入过高,收入分布过于集中在0周围,这时我们进行离散化处理,根据国家标准将收入分级处理,分为 中产、上层贫民、下层贫民等等

    特征变量我们处理的差不多了,我们现在对目标变量进行处理,调整其数值分布,尽量符合正态分布:再次查看数据

    #特征变量我们处理的差不多了,我们现在对目标变量进行处理,调整其数值分布,尽量符合正态分布:
    sns.distplot(all_info['信用总评分'],fit=norm)
    plt.xlabel('信用总评分')
    plt.ylabel('频率')
    plt.title('评分分布')
    fig = plt.figure()
    a = stats.probplot(all_info['信用总评分'],plot=plt)

    如图,我们看到这个数据分布是一个三峰,甚至可能是四峰的数据,我们要把它变成正态分布,这样在线性回归做的时候能更好的训练出更好的模型:

    
    from sklearn.preprocessing import QuantileTransformer
    quantile_transformer = QuantileTransformer(n_quantiles = 300,output_distribution='normal', random_state=0,copy=True)
    all_info['信用总评分'] = quantile_transformer.fit_transform(all_info['信用总评分'].values.reshape(-1,1))
    #注意在最新版的sklearn中,所有数据都应该是二维矩阵,哪怕本来是一行或者一列,所以这里加了reshape(-1,1)

    3.模型训练

         采取梯度提升决策树以及随机森林模型进行训练,并通过网格调参得到最优参数,并且绘制学习曲线。

    #所有工作都已经就绪开始进行模型的建立:
    from sklearn.model_selection import GridSearchCV
    from sklearn.ensemble import RandomForestRegressor,  GradientBoostingRegressor
    
    #第一种模型:梯度提升决策树:
    
    #网格调参:
    # param_grid_GradientBoostingRegressor={'n_estimators':[700,800,900],'learning_rate':[0.005,0.007,0.01],'max_depth':[6,7,8]}
    # grid_search_GradientBoostingRegressor=GridSearchCV(GradientBoostingRegressor(),param_grid_GradientBoostingRegressor,cv=5)
    # grid_search_GradientBoostingRegressor.fit(X,Y)
    # print(grid_search_GradientBoostingRegressor.best_params_,grid_search_GradientBoostingRegressor.best_score_)
    GB_model = GradientBoostingRegressor(n_estimators=800,learning_rate=0.01,max_depth=7)
    
    #第二种模型:随机森林:
    
    #网格调参:
    # param_grid_RandomForestRegressor={'n_estimators':[300,400,500],'max_depth':[4,5,6]}
    # grid_search_RandomForestRegressor=GridSearchCV(RandomForestRegressor(),param_grid_RandomForestRegressor,cv=5)
    # grid_search_RandomForestRegressor.fit(X,Y)
    # print(grid_search_RandomForestRegressor.best_params_,grid_search_RandomForestRegressor.best_score_)
    RFR_model = RandomForestRegressor(n_estimators=300,max_depth=6)
    
    from sklearn import tree
    from sklearn.tree import DecisionTreeClassifier
    DT_model = DecisionTreeClassifier(criterion='entropy',min_samples_leaf = 6,random_state=1)

    绘制学习曲线

    #进行学习曲线的绘制:
    from sklearn.model_selection import learning_curve
    
    # 用sklearn的learning_curve得到training_score和cv_score,使用matplotlib画出learning curve
    def plot_learning_curve(estimator, title, X, y, cv=5, n_jobs=-1,train_sizes=np.linspace(.05, 1., 20), verbose=0, plot=True):
        train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes, verbose=verbose)
        #计算训练与验证集的分数的平均值和方差
        train_scores_mean = np.mean(train_scores, axis=1)
        train_scores_std = np.std(train_scores, axis=1)
        test_scores_mean = np.mean(test_scores, axis=1)
        test_scores_std = np.std(test_scores, axis=1)
        
        plt.figure()
        plt.title(title)
        plt.xlabel(u"训练样本数")
        plt.ylabel(u"得分")
        plt.grid()
        plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="b")
        plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="r")
            
        plt.plot(train_sizes, train_scores_mean, 'o-', color="b", label=u"训练集上得分")
        plt.plot(train_sizes, test_scores_mean, 'o-', color="r", label=u"交叉验证集上得分") 
        plt.legend(loc="best")
        plt.show()
    plot_learning_curve(GB_model,'GB_model 学习曲线',X,Y)
    plot_learning_curve(RFR_model,'RFR_model 学习曲线',X,Y)
    plot_learning_curve(DT_model,'RFR_model 学习曲线',X,Y)
    import graphviz 
    dot_data = tree.export_graphviz(DT_model, out_file=None,
                                    feature_names=X_train.columns,  
                                    class_names=['no default','default'],  
                         filled=True, rounded=True,  
                         special_characters=True) 
    graph = graphviz.Source(dot_data) 
    graph 
    


    总结

    二、欺诈评级模型,三、行为评级模型,四、催收评级模型 在后续文章更新。首次更新,希望大家能够多加指点。

    展开全文
  • 信用评分模型

    千次阅读 2021-06-19 22:54:31
    信用评分模型是最常见的金融风控手段之一,它是指根据客户的各种属性和行为数据,利用一定的信用评分模型,对客户进行信用评分,据此决定是否给予授信以及授信的额度和利率,从而识别和减少在金融交易中存在的交易...

    1、评分卡简介

    信用评分卡模型是最常见的金融风控手段之一,它是指根据客户的各种属性和行为数据,利用一定的信用评分模型,对客户进行信用评分,据此决定是否给予授信以及授信的额度和利率,从而识别和减少在金融交易中存在的交易风险。

    评分卡模型在不同的业务阶段体现的方式和功能也不一样。按照借贷用户的借贷时间,评分卡模型可以划分为以下三种:

    • 贷前:申请评分卡(Application score card),又称为A卡

    • 贷中:行为评分卡(Behavior score card),又称为B卡

    • 贷后:催收评分卡(Collection score card),又称为C卡

    标准评分卡模型是当前业界使用最多的风控模型,建模后得到的评分卡模型如下:

    变量名称变量范围得分
    基准分223
    年龄18≤年龄<25-2
    年龄25≤年龄<358
    年龄35≤年龄<5510
    年龄55≤年龄5
    性别4
    性别2
    婚姻状况已婚8
    婚姻状况未婚-2
    学历硕士,博士10
    学历本科8
    学历大专5
    学历中专,技校,高中1
    学历初中,小学-2
    月收入月收入<3000-8
    月收入3000≤月收入<50000
    月收入5000≤月收入<80005
    月收入8000≤月收入<1200013
    月收入12000≤月收入20

    评分卡模型如何对用户进行评分呢?一个用户的总评分等于基准分加上对客户各个属性的评分。以上面的评分卡为例:
    客 户 评 分 = 基 准 分 + 年 龄 评 分 + 性 别 评 分 + 婚 姻 状 况 评 分 + 学 历 评 分 + 月 收 入 评 分 客户评分=基准分+年龄评分+性别评分+婚姻状况评分+学历评分+月收入评分 =+++++
    如果某客户年龄为27岁,性别为男,婚姻状况为已婚,学历为本科,月收入为10000,那么他的评分为:
    223 ( 基 准 分 ) + 8 ( 年 龄 评 分 ) + 4 ( 性 别 评 分 ) + 8 ( 婚 姻 状 况 评 分 ) + 8 ( 学 历 评 分 ) + 13 ( 月 收 入 评 分 ) = 264 223(基准分)+8(年龄评分)+4(性别评分)+8(婚姻状况评分)+8(学历评分)+13(月收入评分)= 264 223+8+4+8+8+13=264

    2、评分卡的开发流程

    信用评分卡的开发有一套科学的、严密的流程,包括数据获取,EDA,数据预处理,变量筛选,LR模型的开发和评估,生成评分卡模型以及布置上线和模型监测。典型的开发流程如下图所示:

    在这里插入图片描述

    3、探索性数据分析

    有些时候建模人员一拿到数据就直接开始上手建模,事实并非如此。第一步应该是分析数据,并把数据转化为可用的信息。分析数据就是通常所说的EDA,转化数据包括在数据预处理部分。

    EDA操作主要是分析样本总体的大概情况,描述样本总体情况的指标主要有直方图、箱形图等。单变量的分布要大致呈正态分布,才能够满足后续分析的条件。多变量之间的相关性要尽可能低。检查完后切分数据集,将训练数据切分,用于检验。

    探索性数据分析工具:DataPrep、Pandas Profiling、SweetViz、AutoViz。

    4、数据预处理

    该环节主要是为了将获取的原始数据转化为可用作模型开发的数据。数据处理可以概括为:缺失值处理、数据类型转换、去除逻辑错误和去除业务无关变量几部分:

    Ÿ 缺失值处理:处理方式可以分为填补和删除。填补缺失值需根据实际字段的业务含义,通常可以用0、均值、众数和KNN算法填充。但是,在金融风控场景下,缺失值可能本身就是一种有业务含义的字段,可以考虑单独作为一个类别。当一个字段缺失值超过一半或更多的时候,一般考虑删除。

    Ÿ 数据类型转换:一般指的是本应该是数值型的却被存成了字符型,或者日期格式不正确等,可以按照实际需求进行转换。

    Ÿ 去除逻辑错误:一般是指去除异常值,比如一个借款客户的年龄为168岁,这显然是不合理的。对于违反常识或者严重离群的数据点,结合字段的实际含义去除异常值。

    Ÿ 去除业务无关变量:最常见的一些会被去掉的字段,就是在一些客户资质比较差的场景下,用户手动填写的数据。如:收入、家庭人数、学历等。因为这些很可能是用户随便填写的,噪声很大。

    5、特征分箱

    (1)Split分箱:决策树分箱

    Split分箱是一种自上而下(即基于分裂)的数据分段方法。如下图所示,Split分箱和决策树比较相似,切分点的选择指标主要有 entropy,gini 指数和 IV值等。

    在这里插入图片描述

    (2)Merge分箱:卡方分箱

    Merge分箱是一种自底向上(即基于合并)的数据离散化方法。如图4.3所示,Merge分箱常见的类型为卡方分箱。

    在这里插入图片描述

    (3)特征分箱的优势

    • 特征分箱可以有效处理特征中的缺失值和异常值。

    • 特征分箱后,数据和模型会更稳定。

    • 特征分箱可以简化逻辑回归模型,降低模型过拟合的风险,提高模型的泛化能力。

    • 将所有特征统一变换为类别型变量。

    • 分箱后变量才可以使用标准的评分卡格式,即对不同的分段进行评分。

    6、WOE编码

    (1)WOE编码

    分箱之后我们便得到了一系列的离散变量,下面需要对变量进行编码,将离散变量转化为连续变量。WOE编码是评分卡模型常用的编码方式。

    WOE 称为证据权重(weight of evidence),是一种有监督的编码方式,将预测类别的集中度的属性作为编码的数值。对于自变量第i箱的WOE值为:

    在这里插入图片描述

    其中, p i 1 p_{i1} pi1是第i箱中坏客户占所有坏客户的比例;

    p i 0 p_{i0} pi0是第i箱中好客户占所有好客户的比例;

    # B i \#B_i #Bi是第i箱中坏客户的人数;

    # G i \#G_i #Gi是第i箱中好客户的人数;

    # B T \#B_T #BT是所有坏客户的人数;

    # G T \#G_T #GT是所有好客户的人数;

    变换以后可以看出,WOE也可以理解为当前分箱中坏客户和好客户的比值,和所有样本中这个比值的差异 (也就是我们随机的坏客户和好客户的比例)。WOE越大,这种差异越大,当前分组里的坏客户的可能性就越大,WOE越小,差异越小,这个分组里的样本响应的可能性就越小。当分箱中坏客户和好客户的比例等于随机坏客户和好客户的比值时,说明这个分箱没有预测能力,即WOE=0。

    • WOE是正值,相对于未分组,能识别更多的违约。

    • WOE是负值,相对于未分组,能识别更多的不违约。

    因此,WOE的符号代表分组在违约还是不违约情况下有相对优势,而WOE的绝对值越大优势就越明显。

    WOE具体计算过程如下表所示:

    在这里插入图片描述

    (2)WOE编码的优势

    • 可提升模型的预测效果

    • 将自变量规范到同一尺度上

    • WOE能反映自变量取值的贡献情况

    • 有利于对变量的每个分箱进行评分

    • 转化为连续变量之后,便于分析变量与变量之间的相关性

    • 与独热向量编码相比,可以保证变量的完整性,同时避免稀疏矩阵和维度灾难。

    7、特征筛选

    7.1 预测能力

    在筛选变量时,特征对目标变量的预测能力是首要考虑的内容,模型的效果主要取决于变量的预测力。这里总结几种常用的筛选变量的方法:

    7.1.1 IV值筛选

    IV称为信息价值(information value),是目前评分卡模型中筛选变量最常用的指标之一,自变量的IV值越大,表示自变量的预测能力越强。类似的指标还有信息增益、基尼(gini)系数等。常用判断标准如下表:

    IV范围预测能力
    <0.02无效
    0.02-0.10弱预测能力
    0.10-0.20中预测能力
    >0.20强预测能力

    计算变量中第i个分箱对应的 IV 值的计算公式为:

    在这里插入图片描述

    变量对应的IV值为所有分箱对应的 IV 值之和:

    在这里插入图片描述

    从上式我们可以看出变量的 IV 值实际上是变量各个分箱的加权求和。且和交叉熵的计算过程有异曲同工之妙。以下为交叉熵公式:

    在这里插入图片描述

    IV值的具体计算流程如下表:

    在这里插入图片描述

    7.1.2 stepwise筛选

    基于stepwise的变量筛选方法也是评分卡中变量筛选最常用的方法之一。具体包括三种筛选变量的方式:

    • 前向选择forward:逐步将变量一个一个放入模型,并计算相应的指标,如果指标值符合条件,则保留,然后再放入下一个变量,直到没有符合条件的变量纳入或者所有的变量都可纳入模型。

    • 后向选择backward:一开始将所有变量纳入模型,然后挨个移除不符合条件的变量,持续此过程,直到留下所有最优的变量为止。

    • 逐步选择stepwise:该算法是向前选择和向后选择的结合,逐步放入最优的变量、移除最差的变量。

    基于stepwise的筛选方法进行特征选择时,可以使用AIC、BIC、KS或AUC作为选择标准。其中,AIC和BIC准则可以在模型复杂度和模型对数据集描述能力之间寻求最佳平衡,通过加入模型复杂度的惩罚项来避免过拟合问题。下面介绍这两种模型选择方法。

    (1)赤池信息准则AIC

    AIC是衡量统计模型拟合优良性的一种准则,它是建立熵的概念上,提供了权衡估计模型复杂度和拟合数据优良性的标准。

    通常情况下,AIC定义为:
    A I C = 2 k − 2 l n L AIC=2k-2lnL AIC=2k2lnL
    其中,k是模型参数个数,L是似然函数。从一组可供选择的模型中选择最佳模型时,通常选择AIC最小的模型。

    当两个模型之间存在较大差异时,差异主要体现在似然函数项,当似然函数差异不显著时,式中第一项,即模型复杂度会起作用,从而表明参数个数少的模型是较好的选择。

    一般而言,当模型复杂度提高(k增大)时,似然函数L也会增大,从而使AIC变小,但是k过大时,似然函数增速减缓,导致AIC增大。模型过于复杂容易造成过拟合现象。

    所以目标就是选取AIC最小的模型,AIC不仅要提高模型拟合度(极大似然),而且要引入惩罚项,使模型参数尽可能少,从而降低过拟合的可能性。

    (2)贝叶斯信息准则BIC

    BIC与AIC相似,更多地用于模型选择。训练模型时,增加参数数量,也就是增加模型复杂度,会增大似然函数,但是也会导致过拟合现象,针对该问题,AIC和BIC均引入了与模型参数个数相关的惩罚项,BIC的惩罚项比AIC的大。同时要考虑样本数量,样本数量过多时,可有效防止模型精度过高造成的模型复杂度过高。
    B I C = k l n n − 2 l n L BIC=klnn-2lnL BIC=klnn2lnL
    其中,k为模型参数个数,n为样本数量,L为似然函数。 惩罚项在维度过大且训练样本数量相对较少的情况下,可以有效避免出现维度灾难现象。

    7.1.3 特征重要度筛选

    随机森林计算特征重要度的步骤:

    • 对每一颗决策树,选择相应的袋外数据(OOB)计算袋外数据误差,记为 e r r O O B 1 err_{OOB1} errOOB1

    • 随机对袋外数据OOB所有样本的特征加入噪声干扰(随机的改变样本在该特征的值),再次计算袋外数据误差,记为 e r r O O B 2 err_{OOB2} errOOB2

    • 特征的重要度= 1 N ∑ ( e r r O O B 2 − e r r O O B 1 ) {1\over N}\sum(err_{OOB2}-err_{OOB1}) N1(errOOB2errOOB1),N 表示随机森林中决策树的个数。

    当改变样本在该特征的值,若袋外数据准确率大幅度下降,则该特征对于样本的预测结果有很大影响,说明特征的重要度比较高。

    GBDT计算特征重要度的原理:

    特征 j 在单颗树中的重要度的如下:

    J ^ j 2 ( T ) = ∑ t = 1 L − 1 i ^ t 2 1 ( v t = j ) \hat J^2_{j}(T)= \sum\limits_{t=1}^{L-1}{\hat i^2_{t}1(v_{t}=j)} J^j2(T)=t=1L1i^t21(vt=j)

    其中,L 为树的叶子节点数量;L-1 为树的非叶子节点数量; v t v_t vt是和节点 t 相关联的特征; i t 2 i_t^2 it2是节点 t 分裂之后平方误差的减少值。

    特征j的全局重要度为特征j在单颗树中的重要度的平均值:

    J ^ j 2 ( T ) = 1 M ∑ m = 1 M J ^ j 2 ( T m ) \hat J^2_{j}(T)= {1\over M}\sum\limits_{m=1}^{M}{\hat J^2_{j}(T_m)} J^j2(T)=M1m=1MJ^j2(Tm)

    其中,M是树的数量。

    7.1.4 LASSO正则化筛选

    L1正则化通常称为Lasso正则化,它是在代价函数上增加了一个L1范数:

    J ( θ ) = − ∑ i = 1 M ( y ( i ) l o g ( h θ ( x { i } ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x { i } ) ) ) + λ m ∑ j = 1 n ∣ θ j ∣ J(\theta)=-\sum\limits_{i=1}^{M}(y^{(i)}log(h_{\theta}(x^{\{i\}}))+(1-y^{(i)})log(1-h_{\theta}(x^{\{i\}})))+{\lambda\over{m}}\sum\limits_{j=1}^{n}|\theta_j| J(θ)=i=1M(y(i)log(hθ(x{i}))+(1y(i))log(1hθ(x{i})))+mλj=1nθj

    L1正则化能起到使参数更加稀疏的作用,稀疏化的结果使优化后的参数一部分为0,另一部分为非零实值。非零实值的那部分参数可起到选择重要参数或特征维度的作用,同时可起到去除噪声的效果。

    7.1.5 两两相关性分析

    对于自变量 X 1 , X 2 X_1,X_2 X1,X2,如果存在常数 c 0 , c 1 , c 2 c_0,c_1,c_2 c0,c1,c2使得以下线性等式近似成立:

    c 1 X 1 + c 2 X 2 ≈ c 0 c_1X_1 + c_2X_2 \approx c_0 c1X1+c2X2c0

    称自变量 X 1 , X 2 X_1,X_2 X1,X2具有较强的线性相关性。

    两变量间的线性相关性可以利用皮尔森相关系数来衡量。系数的取值为[-1,1],相关系数越接近0的说明两变量线性相关性越弱,越接近1或-1两变量线性相关性越强。

    在这里插入图片描述

    当两变量间的相关系数大于阈值时(一般阈值设为 0.7),剔除IV值较低的变量,或分箱严重不均衡的变量。

    7.1.6 多重共线性分析

    对于自变量 X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn,如果存在常数 c 0 , c 1 , c 2 , . . . , c n c_0,c_1,c_2,...,c_n c0,c1,c2,...,cn使得以下线性等式近似成立:

    c 1 X 1 + c 2 X 2 + . . . + c n X n = c 0 c_1X_1+c_2X_2+...+c_nX_n=c_0 c1X1+c2X2+...+cnXn=c0

    称自变量 X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn具有较强的多重共线性。

    通常用VIF值来衡量一个变量和其他变量的多重共线性:

    V I F i = 1 1 − R i 2 VIF_i={1\over{1-R^2_i}} VIFi=1Ri21

    其中, R i R_i Ri X i X_i Xi与其他自变量的复相关系数。

    在这里插入图片描述

    其中, 为其他变量的线性表示。

    在这里插入图片描述

    X ^ i \hat X_i X^i为变量 X i X_i Xi的均值。

    当某个变量的VIF大于阈值时(一般阈值设为10 或 7),需要逐一剔除解释变量。当剔除掉 X k X_k Xk时发现VIF低于阈值,则从 X k X_k Xk X i X_i Xi中剔除IV值较低的一个。

    为什么要进行相关性分析?

    设想建立一个具有两变量 X 1 X_1 X1 X 2 X_2 X2的线性模型,真实模型是 Y = X 1 + X 2 Y=X_1+X_2 Y=X1+X2。如果 X 1 X_1 X1 X 2 X_2 X2线性相关(比如说 X 1 ≈ 2 X 2 X_1 \approx 2X_2 X12X2),那么拟合模型 Y = 3 X 2 Y=3X_2 Y=3X2, Y = 2 X 1 − X 2 Y=2X_1-X_2 Y=2X1X2 Y = 51 X 1 − 99 X 2 Y=51X_1-99X_2 Y=51X199X2的效果都一样好,理想状态下,系数权重会有无数种取法,使系数权重变得无法解释,导致变量的每个分段的得分也有无数种取法(后面我们会发现变量中不同分段的评分会用到变量的系数)。

    即使不进行线性相关性分析也不会影响模型的整体性能,进行相关性分析只是为了让我们的模型更易于解释,保证不同的分箱的得分正确。

    决策树、随机森林的多重共线性问题:

    多重共线性的特征不会对决策树、随机森林的预测能力有影响,但是数据的解释性会被多重共线性影响。随机森林可以返回特征的重要性(importantce),当有多重共线性时,importance会被影响。一些具体多重共线性的特征的重要性会被相互抵消,从而影响我们解释和理解特征。比如说,特征A和B完全一样,我们在用随机森林时,它们的重要性应该非常接近(考虑到随机性)。如果我们在训练前删除特征B,那么特征A的重要性就会翻番。这一下子就影响了我们对特征、数据的理解。。

    7.2 稳定性

    在模型中使用不稳定的变量,可能会影响样本人群的代表性和评分的稳定性。通常通过计算变量在开发样本和跨时间样本上的群体稳定性指标(PopulationStability Index,即PSI)对变量的稳定性进行评估。PSI的计算公式如下:

    在这里插入图片描述

    其中:PSI是对两个日期的特征数据进行计算,可以任选其一作为base集,另一则是test集(也可称为expected集和actual集),用字母i表示第i个分段区间。

    特征的PSI计算过程如下:

    (1) 特征取值等频分段:对这个特征在base集的取值进行等频划分(通常等频分10份即可)。

    (2) 计算 p b a s e i p^i_{base} pbasei:统计落在每个分段区间内的目标数量,进一步得到数量占比,表示该特征在base集中第i个取值分段中的数量占比。

    (3) 计算 p t e s t i p^i_{test} ptesti:按照(2)中的方式计算test集的 p t e s t i p^i_{test} ptesti。需要注意的是,分段还是采用第1步得到的分段(依据base集的分段)。

    (4) 根据公式即可计算得到该特征基于这两个日期的PSI。

    通常,如果一个特征跨度6个月的PSI取值小于0.1,那么这个特征被认为是稳定的(当然,也可以根据具体情况适当放宽0.1的标准)。

    注意:并非所有PSI值很高的特征都不能用于建模,如果一个特征区分度很好但PSI值不满足预期(比如跨度6个月的PSI大于0.1),但同时,该特征的取值波动性从业务的角度可以解释得通,那么这样的特征用于建模也是可以的。

    7.3 单调性

    通常情况下,单个变量在模型中的作用必须具有单调性。变量好坏分布的单调性越强,定量模型的性能将越好。在现实数据中,完全单调的情况是很少出现的,更多的情况是在总体趋势保持单调的同时,存在一定波动。模型开发一般采用将坏帐率接近、业务同质性高的群体合并来对变量分箱(classing),以帮助业务人员理解总体趋势。

    在特征分箱后,一般通过可视化的方式度量变量的单调性,如果分箱方式不满足单调性的要求,可调整分箱。如下图所示为某变量分箱后,训练集和测试集下每一箱对应的坏样本率,可以看到图中的第一箱和第二箱的bad_rate存在倒挂,说明bad_rate不单调,需要进行调整。可以尝试将第一箱和第二箱进行合并。

    在这里插入图片描述

    调整分箱后的bad_rate如下图2所示,bad_rate单调:

    在这里插入图片描述

    绘制该变量每一箱的样本比例和bad_rate,如下图所示:

    在这里插入图片描述

    7.4 业务合理性

    定量评分模型需要注重模型变量的业务合理性和解释性,鉴于风险控制的严谨性,在风险建模中更要特别慎重。然而,出于种种已知或未知的原因,统计上显著的变量,其在定量模型中的作用不一定与常识和业务经验一致。为了避免由此可能导致的错误决策,模型开发需参考业务部门的意见和建议,确保变量在不同取值下,好坏分布的总体趋势与业务经验一致。

    7.5 特征筛选的作用

    建模之前的特征筛选通常会进行两次,第一次会在特征分箱之前进行粗筛选,排除没有预测能力的变量;第二次会在特征分箱后进行细筛选,筛选出预测能力强,具有单调性,且业务上可解释的变量。特征筛选在建模过程中非常重要,一般来说具有如下好处:

    • 剔除跟目标变量不太相关的特征

    • 消除由于线性相关的变量,避免特征冗余

    • 减轻后期验证、部署、监控的负担

    • 保证变量的可解释性

    8、逻辑回归模型

    构建初步的逻辑回归模型,根据p-value进行变量筛选,根据各个变量的系数符号进行筛选,得到最终的逻辑回归模型。

    由于逻辑回归模型具有简单、稳定、可解释性强,技术成熟和易于检测和部署等优势,逻辑回归是标准评分卡所使用的算法。

    8.1 变量系数符号筛选

    检查逻辑回归模型中各个变量的系数,如果所有变量的系数均为正数,模型有效。假如有一些变量的系数出现了负数,说明有一些自变量的线性相关性较强,需要进一步进行变量筛选。通常的做法是:

    (1) 综合考虑变量的IV值和业务建议,按照变量的优先级进行降序排列;

    (2) 选择优先级最高的4-5个基本变量;

    (3) 按优先级从高到低逐渐添加变量,当新添加的变量之后,出现系数为负的情况,舍弃该变量;

    (4) 直到添加最后一个变量。

    8.2 变量p-value筛选

    p-value是假设检验的里面的概念。模型假设某自变量与因变量线性无关,p-value可以理解为该假设成立的可能性 (便于理解,不太准确)。一般,当p-value大于阈值时,表示假设显著,即自变量与因变量线性无关;当p-value小于阈值时,表示假设不显著,即自变量与因变量线性相关。阈值又称为显著性水平,通常取0.05。

    因此,当某个字段的p-value大于0.05时,应该删除此变量。

    9 生成标准评分卡

    9.1 评分转换

    我们将客户违约的概率表示为p,则正常的概率为1-p。由逻辑回归的基本原理可得:

    在这里插入图片描述

    整理以上公式:

    在这里插入图片描述

    我们可以定义比率来表示客户违约的相对概率:
    在这里插入图片描述

    将odds带入可得:
    在这里插入图片描述

    评分卡的分值可以定义为比率对数的线性表达来,即:

    在这里插入图片描述

    其中,A与B是常数,B前面的负号可以使得违约概率越低,得分越高。通常情况下,即高分值代表低风险,低分值代表高风险。

    A、B的值可以通过将两个已知或假设的分值带入计算得到。通常情况下,需要设定两个假设:

    • 某个特定的违约概率下的预期评分,即比率odds为 时的分数为 ;

    • 该违约概率翻倍的评分(PDO);

    根据以上的分析,则odds为 时的分数为 ,代入以上线性表达式,可得:

    在这里插入图片描述

    解该方程组,可得:

    在这里插入图片描述

    在实际的应用中,我们会计算出每个变量的各分箱对应的分值。新用户产生时,对应到每个分箱的值,将这些值相加,最后加上初始基础分,得到最终的结果。
    在这里插入图片描述

    式中:变量 是出现在最终模型的入模变量。由于所有的入模变量都进行了WOE编码,可以将这些自变量中的每一个都写作 的形式:

    在这里插入图片描述

    其中, 为基础分数; 为逻辑回归中第 个自变量的系数; 为第 个变量的第 个分箱的WOE值, 是0,1逻辑变量,当 代表自变量 取第 个分箱,当 代表自变量 不取第 个分箱。最终得到下表所示的评分卡模型的评分表:
    在这里插入图片描述

    从以上公式中,我们发现每个分箱的评分都可以表示为 − B ( θ i ω i j ) -B(\theta_i\omega_{ij}) B(θiωij),也就是说影响每个分箱的因素包括三部分,分别为参数B,变量系数 θ i \theta_i θi,和对应分箱的WOE编码 ω i j \omega_{ij} ωij

    9.2 评分卡生成

    在进行评分映射的时候,通常采用如下公式:

    在这里插入图片描述

    其中,当Odds=10时,基础分score=600,PDO=20。

    一个用户的总评分等于基准分加上对客户各个属性的评分。以表中的评分卡为例,某客户年龄为27岁,性别为男,婚姻状况为已婚,学历为本科,月收入为10000,那么他的评分为:

    223 ( 基 准 分 ) + 8 ( 年 龄 评 分 ) + 4 ( 性 别 评 分 ) + 8 ( 婚 姻 状 况 评 分 ) + 8 ( 学 历 评 分 ) + 13 ( 月 收 入 评 分 ) = 264 223(基准分)+8(年龄评分)+4(性别评分)+8(婚姻状况评分)+8(学历评分)+13(月收入评分)= 264 223+8+4+8+8+13=264

    在这里插入图片描述

    10 模型评估

    (1)回归结果检查

    由于WOE与违约概率之间存在着某种反向趋势,在此基础上,我们可以预料到模型拟合出来的自变量系数应该都是正数,如果结果中出现了负数,应当考虑是否是来自自变量多重共线性的影响。

    为了检测定量模型的预测变量间是否存在严重的多重共线性,通常运用线性回归过程计算方差膨胀系数(Variance Inflation Factor)。VIF表示的是某个自变量能被其它自变量解释的程度,VIF值越高,多重共线性越严重。一般设定VIF值不高于10。若存在严重的多重共线性,则根据P值(显著性检验p值>0.05)将最不显著的变量予以删除。

    若各个变量的VIF值都远远小于10,则说明上述模型中的变量都未出现显著的多重共线性。

    (2)模型评估指标及应用场景

    一般采用准确率、召回率、KS值、AUC值、Gini系数、提升(lift)指数来评价模型的区分能力/预测能力。

    • 准确率

    对于二分类任务,准确率是最常用的评价指标,介绍评价指标之前需要先了解“混淆矩阵”,如下表所示:

    在这里插入图片描述

    其中:TP (真正例):将正类预测为正类数;TN (真负例):将负类预测为负类数;FP (假正例):将负类预测为正类数;FN (假负例):将正类预测为负类数;

    精确率(precision)的计算公式为:

    p = T P T P + F N p={TP\over{TP+FN}} p=TP+FNTP

    精确率是针对预测结果而言的,表示模型预测为正的样本中有多少比例是真正的正样本。

    • 召回率

    召回率(recall)计算公式为:

    P = T P T P + F N P={TP\over {TP+FN}} P=TP+FNTP

    召回率是针对原来的样本而言的,表示样本中的正例有多少比例被预测正确。

    • KS值

    KS是使用同一评分标尺下,累计好客户百分比与坏客户百分比的最大差距,如图5所示KS值为0.37。通常评分越低客户表现越坏,而评分越高客户的表现越好。如果评分区分好坏客户的能力越高,KS就会越高。理论上KS的取值在0-100%之间,常见的评分卡KS的取值范围多在25%-75%之间。KS值达到28%以上,认为模型有效。KS值常用于风控模型评估。

    在这里插入图片描述

    • AUC

    ROC曲线是评价风控模型好坏的重要手段。它是通过在0到1之间改变混合矩阵的临界值,绘制分类准确的违约记录比例(TPR)与分类错误的正常记录比例(FPR)而得到的,如图5所示。

    在这里插入图片描述

    鉴于ROC曲线的定义,对角线以上的图形越高,模型就越好。ROC曲线之下的面积被称为AUC统计量,AUC值越大,建立的评分卡越可靠。AUC值达到0.70,认为模型有效。

    • Gini系数

    Gini系数是以累计的好客户和坏客户为坐标的曲线下面积(0和0.5之间)与0.5的比值。Gini系数越高,说明评分卡的区分能力越强。Gini系数等于0说明评分卡没有任何区分能力,Gini系数等于100%则是理论上完美的评分卡。Gini系数用作风控模型评价指标。

    • 提升指数

    提升指数常用作营销模型的评价指标,衡量的是,与不利用模型相比,模型的预测能力变好了多少。不利用模型时,营销成功概率可用样本的营销成功比例来做估计值。建立营销模型的目的是提高营销成功的概率,减少营销成本。因此常将模型预测概率降序排列取出top10%的样本作为营销对象,统计这些营销对象中实际营销成功的比例,若top10%的样本中有60%的营销成功样例,而建模样本中的营销成功样例仅有20%,则提升指数=3,lift越大,模型效果越好。

    (3)模型排序能力

    模型的排序能力是指将人群按评分从低到高分组排序后,高分段组别的坏帐率应小于底分段组别。评分与坏帐率之间应存在单调递减的关系。一个较好的评分卡很少发生低分段组别的坏帐率低于高分段组别坏帐率的现象,即排序能力的跳动。如果这种跳动在很多组别发生,说明评分卡的排序能力存在问题。

    如图所示,随着分数的上升,人群的坏账率呈现逐渐下降趋势,模型具有较好的排序能力。

    在这里插入图片描述

    (4)跨时间验证

    模型建立完成后,可按期对最新时点的数据进行监控,具体包括以下内容:

    • 评分分布的稳定性检验

    • 评分变量的稳定性检验

    稳定性指数(PSI)用于测量评分或变量在开发时点和验证时点群体的分布是否保持基本一致。明显的分布变动可能导致建模时点的评分或变量对当前的人群已经不再适用。

    群体稳定性系数PSI用于显示,与开发样本比较,当前群体是否有时间上的变更。若评分分布和评分变量的稳定性发生较大变化,则需考虑调整更新模型,避免模型预测效果降低。

    (5)BCR和解释性

    在贷中评分卡设计之中,我们考虑到的不仅仅是贷款笔数的逾期水平,同样更重要的要考虑到最终贷款金额逾期的情况。这种观察指标主要是BCR(Balance Control Ratio),这个指标在常见的消费金融领域、信用卡领域都十分重要。特别是在贷中评分卡的运用上,一定要认识到贷中评分卡的使用会导致BCR发生如何的变动,以及分数调整对BCR的敏感程度。假设分数调整虽然能够降低今后贷款笔数的逾期率,但会导致BCR的显著提升,最终导致金额逾期率的上涨,那么这种分数的调整就需要进行重新斟酌。

    同样另外一个需要值得关注的是贷中评分卡的可解释性,这是因为,贷中评分卡主要涉及的是已经成熟在金融机构有过多笔还款的客户,这部分客户已经和金融机构有着一定的合作关系,如果贸然直接使用不可解释的模型进行风控,则会导致已有客户的大量投诉和反馈。如果客户将这种反馈意见反映至银监会、互联网等机构,会导致金融机构声誉的下降,同时也会对现有客户造成一定的负面影响,从而导致逾期率的提升,所以贷中评分卡的可解释性也是十分关键的。

    11 评分应用策略

    客户需求随时间改变,很可能会要求更高额度。这种现象很正常,刚开始给予客户的初始额度偏保守,维持客户关系一段时间后,账户表现会显示一个较为明确的发展方向,贷款机构也逐渐更接受客户,授予更高的额度,这时贷中评分卡就会发挥作用。

    有些贷款机构通过设置一些简单的规则来进行调额,但是结合客户使用率和贷中评分卡的风险评分进行决策更加科学,这种决策方式的表现如图7所示:

    在这里插入图片描述

    注:低使用率、高风险的客户不太可能出现,这里不在考虑范围内。

    按照风险(评分)和使用情况的不同表现,可以将客户分为三个类别:重要保持客户、重要发展客户和风险客户,针对不同的表现可以采取不同的应对策略。

    • 重要保持客户:图中低风险、高收益的目标客户。这类客户是最为理想的客户类型,对贷款机构贡献最大,应当优先投放资源,比如提高额度,开展免息、还款容时容差等优惠政策。尽量提高这类客户的忠诚度和满意度,尽可能延长这类客户的高水平消费。

    • 重要发展客户:图中低风险、低收益的激励客户。这类客户的当前价值虽然不是很高,但却有很大的发展潜力。贷款机构要尽量激励这类客户的消费,通过提升客户的行内等级,加强这类客户的满意度,通过增加餐饮、旅游优惠券、积分奖励等措施,提高这类客户的消费水平。

    • 风险客户:图中高风险、高收益的避免客户。这类客户虽然对贷款机构的贡献较大,但风险也很高,应尽量避免这类客户的违约风险,比如采取降低额度、限制现金分期等其他产品的行为,避免贷款机构出现较大损失。

    展开全文
  • 移动端的数据来建立客户的信用评分系统。如何从客户所填的资料里对客户进行信用评估、如何鉴别所填资料的真假性及应该要求客户填什么类型的资料等对银行来说是至关重要的。本文基于2005年台湾信用卡客户数据,建立...
  • 玩转大数据风控-利用评分模型实现信用评级一、算法介绍1. 什么是逻辑回归?2. 逻辑回归为何逻辑 ?3. 逻辑回归怎么回归?二、构建流程1.数据处理1.1 数据清理1.2 缺失值处理2. 特征选择3.特征变量分箱 本篇文章...
  • 信用评分模型开发及评估指标

    千次阅读 2019-12-23 22:54:50
    一、信用风险评级模型类型 信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常...
  • 基于Python的信用评分模型建立和分析,万字阐述,收藏
  • 信用评分模型

    千次阅读 2019-05-21 14:32:46
    基于python的信用评分模型 基于python的信用评分模型 1.项目背景介绍 1.1 信用风险和评分模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息...
  • 在公众号「python风控模型」里回复关键字:学习资料,就可免费领取。 python风控模型 持牌照金融公司模型专家,教学主页 https://ke.qq.com/teacher/231469242?tuin=dcbf0
  • 全面的信贷评分模型开发流程介绍
  • 信用风险评级模型的开发过程

    千次阅读 2019-02-18 10:44:25
    一、信用风险评级模型类型 信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常...
  • 如何建立信用评分模型呢?本文将针对这些问题简单介绍互金行业中授信产品的风控建模过程,内容主要如下: ·信用风险定义 ·信用风险评分卡类型 ·信用评分模型建立的基本流程 1.信用风险定义 ①风险管理的概念 ...
  • 本文基于汽车贷款案例介绍了逻辑回归的原理和常用的两个函数LogisticRegression和LogisticRegressionCV,以及分类模型通用的评估方法(查准率、查全率、F1值、ROC和AUC等)。
  • 信用评分模型开发

    2020-06-18 11:06:15
    信用风险计量体系包括主体评级模型和债项评级两个部分。主体评级包含以下四个内容: 1.申请者评级 2.行为评级模型3.催收评级模型4.欺诈评级模型 数据来源: 本项目来源kaggle竞赛 Give Me Some Credit 2.1.1获取数据...
  • 信用评级模型实例分析(以消费金融为例)-中 原创 2016-10-13 单良 亚联大数据 点击“亚联大数据”可关注我们!     第五章 自变量的初步分析与处理   模型变量有两种类型,分别是连续型变量 。连续型变数系...
  • FICO信用评分模型解析

    万次阅读 2017-03-26 15:19:33
    美国的信用评级基本都会参考FICO信用分,FICO是Fair Isaac Company推出针对用户哥哥方面情况的评分,范围从300-850分之间。分数越高说明客户的信用风险越小。  一般情况下,用户的FICO分值高于680,则被认为是是好...
  • 信用评分模型(R语言)

    万次阅读 多人点赞 2016-04-23 10:45:57
    本文详细的介绍了信用评分卡的开发流程,开发语言为R语言,python版本请见:一行代码搞定信用评分模型(python) python版实例和数据请见我的github:https://github.com/chengsong990020186/CreditScoreModel,如...
  • 信用评分模型(A/B/C)

    千次阅读 2019-09-10 09:38:47
    A卡(Application score card)申请评分卡 B卡(Behavior score card)行为评分卡 C卡(Collection score card)催收评分卡 使用时间不同,分别侧重于贷前、贷中、贷后。...A卡:一般可做0-1年的信用分析 ...
  • python评分模型

    千次阅读 2022-01-18 09:54:24
    信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级。人信用评级有一系列评级模型...典型的信用评分卡模型如图1-1所示。信用风险评级模型的主要开发流程如下: (1) 获取数据,包括申请贷款客...
  • 信用评分模型python实践——简介

    千次阅读 2018-12-20 00:01:03
    由于之前进行过信用评分模型的学习,并且接触并实践了一小段时间,虽然已经过了一年了,但是为了让这一段经历能够保留,在这里记录下点滴。本次将分多篇文章对信用评分模型的python实践进行阐述,包括简介,概念以及...
  • 信用评分模型-抽样

    2020-12-14 22:12:51
    局限性:  当总体单位数很大时,就难以实现简单随机抽样,且抽样误差较大 分层抽样(STR) 也称类型抽样,总体分成不同的“层”,然后在每一层内进行抽样。 二种方法: (1 1 )等数分配法 (2 2 )等比分配法 例...
  • 信用标准评分模型开发及实现

    万次阅读 多人点赞 2017-08-03 02:07:58
    一、信用风险评级模型类型信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常...
  • 信用评分模型实例

    千次阅读 2019-11-16 13:01:56
    目标:完成一个评分卡,通过预测某人在未来两年内将会经历财务危机的可能性来提高信用评分效果,帮助贷款人做出最好的决策 准备:基于个人信贷的场景, 确定违约的定义:根据新的Basel II Capital Accord(巴塞尔二...
  • 评分卡建模中,模型可解释性很重要,除了Logistic回归模型,决策树也是一个非常好理解的模型。决策树是一种贪心算法,得到的树不一定是最优的,而是效果较好的次优模型。 决策树学习步骤为:特征选择->决策树...
  • python信用评分卡建模(附代码)

    千次阅读 2022-03-28 19:58:11
    信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级。人信用评级有一系列评级模型...典型的信用评分卡模型如图1-1所示。信用风险评级模型的主要开发流程如下: (1) 获取数据,包括申请贷款客...
  • 基于python的信用评分模型

    万次阅读 多人点赞 2018-05-24 01:25:32
    项目背景介绍1.1 信用风险和评分模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性,它是金融...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,785
精华内容 1,514
热门标签
关键字:

信用评分模型的类型