热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让你彻底理解信用评分卡原理(Python实现评分卡代码)

逻辑回归已经在各大银行和公司都实际运用于业务,但是很多文章都讲得一知半解,所以本文力求阐述出清晰的评分卡原理文章。之前已经讲解了逻辑回归和sigmod函

逻辑回归已经在各大银行和公司都实际运用于业务,但是很多文章都讲得一知半解,所以本文力求阐述出清晰的评分卡原理文章。之前已经讲解了逻辑回归和sigmod函数的由来、逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归,本文致力于让大家彻底弄懂评分卡的原理和实现。

在公众号「python风控模型」里回复关键字:学习资料
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

将③代入①得:
  
在这里插入图片描述
  

在这里插入图片描述

假设θ0=0.001时,P0=600,PDO=40。
  

B = 40/np.log(2)=57.71

A=600+57.71*np.log(1/1000)=201.35


  
在这里插入图片描述
  
在这里插入图片描述

其中x1、x2、xn等是出现在最终模型的入模变量。由于一些入模变量进行了WOE编码,可以将评分写成对应woe的形式。
   在这里插入图片描述

其中θi为第i个特征的系数,Wij为第i个特征第j个分箱的WOE值,是0、1逻辑变量,当客户对应特征的取值落在该分箱时为1否则为0。所以最终的评分卡形式如下:
   在这里插入图片描述


二、评分卡Python实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjTkVen5-1637059935547)(https://img.it610.com/image/info8/971f4b61d6af452e99a8ee9289ad2512.jpg)]

从评分卡原理的分析中知,得到客户的最终得分有两个计算公式:
  
在这里插入图片描述


  
在这里插入图片描述

如果已经通过逻辑回归的训练得到客户的违约概率,且只想得到客户的最终得分。可把违约概率P代入第一个式子即可以得到客户得分。


1 根据客户违约概率计算客户得分

具体计算代码如下:

def Prob2Score(prob, A, PDO):y = np.log(prob/(1-prob))return int(A-PDO/np.log(2)*(y))
A, PDO = 201.35,40
score['prob2score'] = score['predict'].apply(lambda x: Prob2Score(x, A, PDO))
plt.hist(X_f_1['score'],bins=100)
plt.show()

其中Prob2Score是根据第一个公式写的函数,只要输入违约概率prob、A和PDO的值即可计算客户得分,得到所有样本的得分分布如下:
  
让你彻底理解信用评分卡原理(Python实现评分卡代码)_第4张图片


2 根据分箱WOE和特征系数计算客户得分

计算评分卡时先不考虑常值分A-Bθ0的值,只把每个特征对应分箱的分值算出。根据最终评分卡形式编写Python脚本如下,可得到标准评分卡。

def var_card(cut,woe,coef,B):import warningswarnings.filterwarnings('ignore')w1 = pd.DataFrame({'cut':cut,'woe':woe}) w2 = w1.drop_duplicates(subset=['cut','woe'],keep='first')w2['name'] = cut.namew2['coef'] = coef[woe.name][0]w2['score'] = round(-w2['woe']*w2['coef']*B,0).astype('int64')w3 = w2[['name','cut','woe','coef','score']]return w3


def score_card(card_name,data,B,coef): score_cards &#61; pd.DataFrame({&#39;name&#39;:[0],&#39;cut&#39;:[0],&#39;woe&#39;:[0],&#39;coef&#39;:[0]})data &#61; datafor i in range(card_name.shape[0]):cut &#61; data[card_name.iloc[i,0]]woe &#61; data[card_name.iloc[i,1]]coef &#61; coefcard &#61; var_card(cut,woe,coef,B)if card.shape[0]<20:score_cards &#61; score_cards.append(card) score_cards_final &#61; score_cards[[&#39;name&#39;,&#39;cut&#39;,&#39;woe&#39;,&#39;coef&#39;,&#39;score&#39;]]score_cards_final &#61; score_cards_final.iloc[1:,:]return score_cards_final


card_name &#61; pd.DataFrame({&#39;cut&#39;:columns_final_cut,&#39;woe&#39;:columns_final_woe})
data &#61; data
A, PDO, B &#61; 201.35,40,40/np.log(2)
coef &#61; coef_1
score_card_1 &#61; score_card(card_name,data,B,coef)

其中card_name中存储每个特征对应分箱的woe值&#xff0c;data表示原始数据&#xff0c;B是公式中的常数&#xff0c;coef表示特征对应系数。该计算公式只是我为了熟悉原始计算公式编写&#xff0c;后续会进行代码优化&#xff0c;请悉知&#xff0c;得到结果如下&#xff1a;
在这里插入图片描述

如果想根据评分卡对应分段的值得到最终得分&#xff0c;可在Python中输入如下代码&#xff1a;

def all_score(score_card,data,A,B,θ0): var_name &#61; score_card[[&#39;name&#39;]].drop_duplicates(subset&#61;[&#39;name&#39;],keep&#61;&#39;first&#39;)names &#61; [&#39;a&#39;]for i in range(var_name.shape[0]):sub &#61; score_card[score_card[&#39;name&#39;]&#61;&#61;var_name.iloc[i,0]]sub_1 &#61; sub[[&#39;cut&#39;,&#39;score&#39;]]sub_1.rename(columns&#61;{&#39;cut&#39;:sub[&#39;name&#39;][0], &#39;score&#39;:sub[&#39;name&#39;][0]&#43;&#39;_score&#39;}, inplace &#61; True)data &#61; data.merge(sub_1, on&#61;sub[&#39;name&#39;][0],how&#61;&#39;left&#39;)names.append(sub_1.columns[1])names &#61; names[1:]score_model &#61; data[names]score_model[&#39;woe_score&#39;] &#61; score_model.apply(lambda x:x.sum(), axis &#61; 1)data[&#39;TOTALSCORE&#39;] &#61; score_model[&#39;woe_score&#39;]&#43;A-B*θ0return data

score_1 &#61; all_score(score_card_1,data,201.35,40/np.log(2),θ0&#61;0.001)

其中score_card_1表示标准评分卡&#xff0c;data表示原始数据&#xff0c;A、B、θ0详见上文中评分卡原理。得到结果如下&#xff1a;
  
让你彻底理解信用评分卡原理&#xff08;Python实现评分卡代码&#xff09;_第6张图片
  
让你彻底理解信用评分卡原理&#xff08;Python实现评分卡代码&#xff09;就为大家介绍到这里了&#xff0c;
欢迎各位同学报名,学习更多相关知识。


推荐阅读
  • 集合set集合是可变的容器集合内的数据对象都是唯一的(不能重复多次的)集合是无序的存储结构,集合中的数据没有先后关系集合内的元素必须是不可 ... [详细]
  • 将数组划分为两个子集,在它们的最大值和最小值之间进行最小位异或原 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Python 可视化 | Seaborn5 分钟入门 (六)——heatmap 热力图
    微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seabo ... [详细]
  • 深入解析Python文本数据处理的技巧与方法
    学习Python时,它总能让人深刻体会到这款语言的魅力。今天小编为大家带来一个有趣的项目,用Python处理文本数据,一起来看看今天的问题吧 ... [详细]
  • Python之基础篇(三)
    基础篇之三:一,数据类型之set.总结:set无序,不重复。1,创建set:s{1,2,3}print(s,type(s))list1[1,2,3]s1(list1)prin ... [详细]
  • steps/train_mono.sh
    定义拓扑结构、参数初始化$gmm-init-mono--shared-phones$langphonessets.int--train-feats$featssubset-fe ... [详细]
author-avatar
影子的影子的家
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有