当前位置:   article > 正文

图示代码,轻松解决IV值计算问题(python)_iv计算

iv计算

今天来讲一下IV值的计算问题

因本人从事风控建模行业,故不可避免需要明白IV值的整个今生前世,故此次来讲解IV值。

一、IV的定义及必备常见知识

IV是什么?全称是Information Value,中文意思是信息价值,或者信息量。

那它有什么内在含义呢?网上公认的答案:变量的预测能力。且通常来讲,变量的IV值越高,则该变量的预测能力越强

这就对选取哪些x进行建模,起到了关键的作用了,但是IV也有其限制的范围。

首先、模型必须是有监督模型(即有y标签变量),其次、y标签必须是二分类(即y只有两类y1,y2)

常见的IV取值范围代表意思如下:

若IV在(-∞,0.02]区间,视为无预测力变量

若IV在(0.02,0.1]区间,视为较弱预测力变量

若IV在(0.1,+∞)区间,视为预测力可以,而实际应用中,也是保留IV值大于0.1的变量进行筛选。

二、IV计算过程

在了解IV计算过程之前,必须明白另一个概念"WOE"

WOE的全称是“Weight of Evidence”,即证据权重。计算公式为:

简单的理解就是 该分箱 坏样本(即b)占比除以好样本(即g)占比的自然对数。(如果对分箱有疑问的同学,可以先简单理解成如果x=0、1、2、3,那么x=0就是一箱,x=1、2、3也是各为一箱)

而从公式也可以体现出WOE的含义:当前分箱中“坏样本占所有坏样本的比例”和“好样本占所有好样本的比例”的差异。很容易可以看出,当差异越大,则该分箱响应坏样本的的可能性就越大;当差异越小,则该分箱响应坏样本的可能性就越小。

这里坏样本指的是响应样本,其实网上很多文章也是约定俗成一直这么叫,其原因是因为风控建模的y标签往往选取在“客户是不是坏客户”,“客户是否会违约”,“客户是否有欺诈行为”等等命题上,所以响应的样本均指向坏客户,所以见多了、叫多了自然很多人称响应样本为坏样本,未响应样本为好样本,这种概念明白就好,不必过多深究。

WOE计算代码如下

先创建数据集

计算X1的WOE

由此可见X1=1的分箱WOE=1.2大于X1=0的分箱WOE(-1.5),即可得知X1=1更有可能性得到响应,而实际数据也是如此。

明白了WOE计算之后,IV值的计算公式就简单了

代码如下

即可得IV=1.58,证明X1变量具有超强预测力

在实际应用中,极少有这样超强预测力的变量,随着样本量的增加,偶然误差逐渐降低,系统误差趋于平均,通常有IV值大于0.2的变量已经算是极少。

以上就是IV值计算全过程。

三、文献参考+附加代码

https://blog.csdn.net/iModel/article/details/79420437

下次会写k-means聚类算法,有时间再把分箱的问题也详细一下。

  1. # -*- coding:utf-8 -*-
  2. # Author:Bemyid
  3. from numpy import log
  4. from pandas import DataFrame as df
  5. import pandas as pd
  6. def createDateset():
  7. dataSet=[
  8. [0, 1, 0],
  9. [0, 0, 0],
  10. [0, 1, 0],
  11. [1, 0, 1],
  12. [1, 0, 0],
  13. [1, 1, 1],
  14. [0, 1, 1],
  15. [1, 1, 1],
  16. [1, 0, 1],
  17. [1, 0, 1]]
  18. return dataSet
  19. def calcWOE(dataset,col,targe):
  20. subdata=df(dataset.groupby(col)[col].count())
  21. suby=df(dataset.groupby(col)[targe].sum())
  22. data=df(pd.merge(subdata,suby,how="left",left_index=True,right_index=True))
  23. b_total=data[targe].sum()
  24. total=data[col].sum()
  25. g_total=total-b_total
  26. data["bad"]=data.apply(lambda x:round(x[targe]/b_total,3),axis=1)
  27. data["good"]=data.apply(lambda x:round((x[col]-x[targe])/g_total,3),axis=1)
  28. data["WOE"]=data.apply(lambda x:log(x.bad/x.good),axis=1)
  29. return data.loc[:,["bad","good","WOE"]]
  30. def calcIV(dataset):
  31. dataset["IV"]=dataset.apply(lambda x:(x.bad-x.good)*x.WOE,axis=1)
  32. IV=sum(dataset["IV"])
  33. return IV
  34. if __name__ == '__main__':
  35. data=createDateset()
  36. data=df(data,columns=["x1","x2","y"])
  37. data_WOE=calcWOE(data,"x1","y")
  38. print(data_WOE)
  39. data_IV=calcIV(data_WOE)
  40. print(data_IV)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/177695?site
推荐阅读
相关标签
  

闽ICP备14008679号