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

  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/tan2810/p/10722303.html
Copyright © 2011-2022 走看看