1.IV值用途
IV全称Information Value即信息价值或信息量。在用逻辑回归、决策树等模型方法构建分类模型时,经常需要对自变量进行筛选。比如有200个候选自变量,通常情况下不会直接把200个变量直接放到模型中去进行拟合训练,而会用一些方法从200个自变量中挑选一些放进模型,形成入模变量列表。挑选入模变量过程需要考虑的因素有很多,比如变量预测能力、变量间相关性、变量简单性(容易生成使用)、变量强壮性(不容易被绕过),变量在业务上可解释性(被挑战时可解释通)等。但其中最主要和最直接的衡量标准是变量预测能力。IV可用来衡量自变量预测能力,但只能针对二分类问题。类似指标还有信息增益、基尼系数变化值等
2.IV值直观理解
假设在分类问题中目标变量类别有两类:Y1,Y2。对一个待预测的个体A,要判断A属于Y1还是Y2,是需要一定信息的。假设信息总量是I,这些所需要的信息蕴含在所有自变量C1,C2,C3,……,Cn中,那么对于其中一个自变量Ci来说,其蕴含信息越多,那么它对判断A是属于Y1还是Y2的贡献度就越大,Ci的信息价值就越大,对应的IV就越大,它就越应该进入到入模变量列表
对变量的一个分组,这个分组响应和未响应的比例与样本整体响应和未响应的比例相差越大IV值越大,否则IV值越小;极端情况当前分组的响应和未响应的比例和样本整体响应和未响应的比例相等时,IV值为0;IV值的取值范围是[0,+∞),且当当前分组中只包含响应客户或者未响应客户时,IV = +∞
4.为何用IV而不直接用WOE
变量各分组的WOE和IV都隐含该分组对目标变量的预测能力。那么为何不直接用WOE相加或者绝对值相加作为衡量一个变量整体预测能力的指标呢?
两个原因:第一当衡量一个变量预测能力时,所使用的指标值不应是负数,否则说一个变量的预测能力是-2.3,听起来很怪。第二原因是乘子体现了自变量当前分组中样本数量占整体样本数量比例对变量预测能力的影响
5.IV极端情况及处理方式
IV值在使用过程中应注意一个问题:自变量任何一个分组中都不应该出现响应数=0或非响应数=0的情况。IV无论等于负无穷还是正无穷都是没有意义的。由上述问题可以看出使用IV其实有一个缺点,就是不能自动处理自变量分组中出现响应比例为0或100%的情况
建议如下:如果可能直接把这个分组做成一个规则,作为模型前置条件或补充条件;重新对变量进行离散化,使每个分组的响应比例都不为0且不为100%,尤其是当一个分组个体数很小时,强烈建议这样做,因为把一个分组样本数弄得很少就不合理;如果上面两种方法都无法使用,建议人工把该分组响应数和非响应数量进行一定的调整。如果响应数原本为0,可以人工调整响应数为1,如果非响应数原本为0,可以人工调整非响应数为1
6.R实现IV值计算
#基于mtcars数据集
tian=mtcars
tian$label=ifelse(mtcars$hp>100,1,0)
#x自变量,y响应变量,n分组个数
iv_calculation=function(x,y,n){
y=as.character(y)
if (class(x)=="numeric")
x_cut=cut(x,breaks=n) #有序分组
y_factor=factor(y)
tem_df=cbind(x,x_cut,y_factor) %>% as.data.frame()
#分组统计IV值
iv=0
for (i in seq_along(unique(tem_df$x_cut))) {
tem_df_table=table(tem_df$y_factor) %>% as.data.frame()
ten_df_table=table(tem_df[which(tem_df$x_cut==tem_df$x_cut[i]),]$y_factor) %>% as.data.frame()
tem_merge=merge(tem_df_table,ten_df_table,by='Var1',suffixes=c(".t",".i"),all=TRUE)
#缺失值填充为1,针对极端情况
tem_merge[,3][which(is.na(tem_merge[,3]))]=1
iv_tem=(tem_merge[1,3]/tem_merge[1,2]-tem_merge[2,3]/tem_merge[2,2]) * log((tem_merge[1,3]/tem_merge[1,2])/(tem_merge[2,3]/tem_merge[2,2]))
iv=iv+iv_tem
}
return(round(iv,3))
}
iv_calculation(tian$mpg,tian$label,5)