R语言基于泰坦尼克数据集批量计算多变量信息值IV问题咨询
问题1:IV全为0的错误修复
错误原因有两点:
- 待计算IV的特征列表包含了目标列
Survived,出现逻辑错误 - 提取特征时如果
train_data是tibble格式,train_data[, factor_var]返回单列tibble而非向量,InformationValue::IV无法识别该输入格式,返回值异常为0
修复后代码:
# 排除目标列,仅保留特征列 factor_vars <- setdiff(colnames(train_data), "Survived") all_iv <- data.frame(VARS=factor_vars, IV=numeric(length(factor_vars)),STRENGTH=character(length(factor_vars)),stringsAsFactors = F) for (factor_var in factor_vars){ # 加drop=T强制输出向量格式 x_input <- train_data[, factor_var, drop = TRUE] y_input <- as.numeric(train_data$Survived) iv_val <- InformationValue::IV(X = x_input, Y = y_input) all_iv[all_iv$VARS == factor_var, "IV"] <- iv_val all_iv[all_iv$VARS == factor_var, "STRENGTH"] <- attr(iv_val, "howgood") } all_iv <- all_iv[order(-all_iv$IV), ]
问题2:dplyr分组统计异常的错误修复
错误原因:在dplyr管道中调用全局对象train_data[[2]]、train_data[[3]],会直接取全量数据集的统计值,不会随分组子集变化,因此所有分组返回的都是总计数。
修复后代码:
train_data %>% # 用.data代词取管道当前环境的列,避免调用全局数据集 group_by(.data[[colnames(train_data)[3]]]) %>% summarise( zero = sum(.data[[colnames(train_data)[2]]] == 0), one = sum(.data[[colnames(train_data)[2]]] == 1) )
如果需要批量对多列做分组统计,配合dplyr::across函数即可实现批量操作。
问题3:批量计算IV的现成方案
可以直接使用scorecard包的iv函数,无需自行写循环,支持一次性计算数据集所有特征的IV值:
# 安装并加载包 # install.packages("scorecard") library(scorecard) # 直接传入数据集和目标列名,自动返回所有特征的IV结果 iv_result <- iv(dt = train_data, y = "Survived")
返回结果已经按IV值降序排序,包含变量名、分箱WOE、总IV、变量预测能力等级等信息,可直接取用。
内容的提问来源于stack exchange,提问作者Gaurav Arora
相关产品推荐
相关产品推荐

