zoukankan      html  css  js  c++  java
  • 基于Python的信用评分卡模型分析(二)

    上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理、探索性数据分析、变量分箱和变量选择等。接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分系统。

    六、模型分析

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

    6.1 WOE转换

    我们已经能获取了每个变量的分箱数据和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文件中:

        # 替换成woe
        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)#计算AUC
        plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)#生成ROC曲线
        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()
    

    输出结果:


     
    图6-2 ROC曲线

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

    七、信用评分

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

    7.1 评分标准

     
     

     
     

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


     
    图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)
    

    批量计算的部分分结果:


     
    图8-1 批量计算的部分结果

    九、总结以及展望

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

    参考文献

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

    代码网盘地址

    链接:http://pan.baidu.com/s/1gfEj4n5 密码:55qt

  • 相关阅读:
    jhljx跑跑跑(找规律)
    FFT教你做乘法(FFT傅里叶变换)
    寻找最远点对(凸包求解)
    捡火柴的Nova君(n个线段相交问题)
    生命游戏/Game of Life的Java实现
    如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】(转)
    北航第十一届程序设计竞赛网络预赛题解
    LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
    UVa 112
    LeetCode 2 Add Two Numbers(链表操作)
  • 原文地址:https://www.cnblogs.com/tan2810/p/10722303.html
Copyright © 2011-2022 走看看