首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码示例中出现的问题。InformationValue::Woe

代码示例中出现的问题。InformationValue::Woe
EN

Stack Overflow用户
提问于 2020-07-03 02:47:50
回答 1查看 98关注 0票数 1

我正在通过这篇博客学习新的特征选择方法:

https://www.machinelearningplus.com/machine-learning/feature-selection/

第九点。我偶然发现了一些问题。首先是简历,我已经解决了这个问题。

代码语言:javascript
复制
library(InformationValue)
adult <- read.csv('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data', 
                    sep = ',', fill = F, strip.white = T,stringsAsFactors = FALSE)
colnames(adult) <- c('age', 'WORKCLASS', 'fnlwgt', 'EDUCATION', 
                     'educatoin_num', 'MARITALSTATUS', 'OCCUPATION', 'RELATIONSHIP', 'RACE', 'SEX', 
                     'capital_gain', 'capital_loss', 'hours_per_week', 'NATIVECOUNTRY', 'ABOVE50K')
inputData <- adult
print(head(inputData))

但是我不能解决下一个问题

代码语言:javascript
复制
# Choose Categorical Variables to compute Info Value.
cat_vars <- c ("WORKCLASS", "EDUCATION", "MARITALSTATUS", "OCCUPATION", "RELATIONSHIP", "RACE", "SEX", "NATIVECOUNTRY")  # get all categorical variables

# Init Output
df_iv <- data.frame(VARS=cat_vars, IV=numeric(length(cat_vars)), STRENGTH=character(length(cat_vars)), stringsAsFactors = F)  # init output dataframe

# Get Information Value for each variable
for (factor_var in factor_vars){
  df_iv[df_iv$VARS == factor_var, "IV"] <- InformationValue::IV(X=inputData[, factor_var], Y=inputData$ABOVE50K)
  df_iv[df_iv$VARS == factor_var, "STRENGTH"] <- attr(InformationValue::IV(X=inputData[, factor_var], Y=inputData$ABOVE50K), "howgood")
}

# Sort
df_iv <- df_iv[order(-df_iv$IV), ]

df_iv

我一直在IV中得到0值,当然,在数据帧的列中也不是预测值。

我试着做一个

代码语言:javascript
复制
factor_vars=cat_vars

但它似乎不起作用,坦率地说,我不明白为什么它不起作用。

EN

回答 1

Stack Overflow用户

发布于 2020-07-03 03:16:15

就这么解决了。在第一个例子中,stringsAsFactors = FALSE的参数是不必要的,因为我们需要因子。

然后,参考IV函数并查看数据集的摘要,我注意到,尽管它是函数需要数字输入的一个因素,但该函数无法提取其“值”(level)。所以我们必须绕过它。

代码语言:javascript
复制
as.numeric(inputData$ABOVE50K)

“解决它”,尽管也许我应该改变值,因为它给出了1-2而不是经典的0-1响应。我正在努力。

我认为有一个最简单的解决方案,但是:

代码语言:javascript
复制
levels(inputData$ABOVE50K)
代码语言:javascript
复制
inputData$ABOVE50K2 = as.numeric(inputData$ABOVE50K)
代码语言:javascript
复制
inputData$ABOVE50K3= ifelse(inputData$ABOVE50K2 ==1,0, ifelse(inputData$ABOVE50K2==2,1,NA))
代码语言:javascript
复制
inputData$ABOVE50K3 <- factor(inputData$ABOVE50K3)

输出也是一样的。因此,不需要将级别更改为0-1。

代码语言:javascript
复制
# Choose Categorical Variables to compute Info Value.
cat_vars <- c ("WORKCLASS", "EDUCATION", "MARITALSTATUS", "OCCUPATION", "RELATIONSHIP", "RACE", "SEX", "NATIVECOUNTRY")  # get all categorical variables

factor_vars= cat_vars

# Init Output
df_iv <- data.frame(VARS=cat_vars, IV=numeric(length(cat_vars)), STRENGTH=character(length(cat_vars)), stringsAsFactors = F)  # init output dataframe

# Get Information Value for each variable
for (factor_var in factor_vars){
  df_iv[df_iv$VARS == factor_var, "IV"] <- InformationValue::IV(X=inputData[, factor_var], Y=inputData$ABOVE50K3)
  df_iv[df_iv$VARS == factor_var, "STRENGTH"] <- attr(InformationValue::IV(X=inputData[, factor_var], Y=inputData$ABOVE50K3), "howgood")
}

# Sort
df_iv <- df_iv[order(-df_iv$IV), ]

df_iv
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62703119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档