赞
踩
今天来讲一下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计算过程之前,必须明白另一个概念"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聚类算法,有时间再把分箱的问题也详细一下。
- # -*- coding:utf-8 -*-
- # Author:Bemyid
- from numpy import log
- from pandas import DataFrame as df
- import pandas as pd
-
- def createDateset():
- dataSet=[
- [0, 1, 0],
- [0, 0, 0],
- [0, 1, 0],
- [1, 0, 1],
- [1, 0, 0],
- [1, 1, 1],
- [0, 1, 1],
- [1, 1, 1],
- [1, 0, 1],
- [1, 0, 1]]
- return dataSet
-
- def calcWOE(dataset,col,targe):
- subdata=df(dataset.groupby(col)[col].count())
- suby=df(dataset.groupby(col)[targe].sum())
- data=df(pd.merge(subdata,suby,how="left",left_index=True,right_index=True))
- b_total=data[targe].sum()
- total=data[col].sum()
- g_total=total-b_total
- data["bad"]=data.apply(lambda x:round(x[targe]/b_total,3),axis=1)
- data["good"]=data.apply(lambda x:round((x[col]-x[targe])/g_total,3),axis=1)
- data["WOE"]=data.apply(lambda x:log(x.bad/x.good),axis=1)
- return data.loc[:,["bad","good","WOE"]]
-
-
- def calcIV(dataset):
- dataset["IV"]=dataset.apply(lambda x:(x.bad-x.good)*x.WOE,axis=1)
- IV=sum(dataset["IV"])
- return IV
-
-
- if __name__ == '__main__':
- data=createDateset()
- data=df(data,columns=["x1","x2","y"])
- data_WOE=calcWOE(data,"x1","y")
- print(data_WOE)
- data_IV=calcIV(data_WOE)
- print(data_IV)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。