考虑以下数据框
outcome <- c(1,0,0,1,1)
string <- c('I love pasta','hello world', '1+1 = 2','pasta madness', 'pizza madness')
df = df=data.frame(outcome,string)
> df
outcome string
1 1 I love pasta
2 0 hello world
3 0 1+1 = 2
4 1 pasta madness
5 1 pizza madness
在这里,我想使用随机森林来了解string
变量中包含的句子中哪些单词是<{1}}变量的强预测变量。
在R中有(简单)方法吗?
答案 0 :(得分:4)
您想要的是由randomForest
生成的变量重要性度量。这是从importance
函数获得的。以下是一些可以帮助您入门的代码:
outcome <- c(1,0,0,1,1)
string <- c('I love pasta','hello world', '1+1 = 2','pasta madness', 'pizza madness')
第1步:我们希望outcome
成为一个因素,以便randomForest
将分类和string
作为字符向量
df <- data.frame(outcome=factor(outcome,levels=c(0,1)),string, stringsAsFactors=FALSE)
第2步:将string
列标记为单词。在这里,我使用dplyr
和tidyr
只是为了方便起见。关键是要将您想要的单词标记作为预测变量。
library(dplyr)
library(tidyr)
inp <- df %>% mutate(string=strsplit(string,split=" ")) %>% unnest(string)
## outcome string
##1 1 I
##2 1 love
##3 1 pasta
##4 0 hello
##5 0 world
##6 0 1+1
##7 0 =
##8 0 2
##9 1 pasta
##10 1 madness
##11 1 pizza
##12 1 madness
第3步:构建模型矩阵并将其提供给randomForest
:
library(randomForest)
mm <- model.matrix(outcome~string,inp)
rf <- randomForest(mm, inp$outcome, importance=TRUE)
imp <- importance(rf)
## 0 1 MeanDecreaseAccuracy MeanDecreaseGini
##(Intercept) 0.000000 0.000000 0.000000 0.0000000
##string1+1 0.000000 0.000000 0.000000 0.3802400
##string2 0.000000 0.000000 0.000000 0.4514319
##stringhello 0.000000 0.000000 0.000000 0.4152465
##stringI 0.000000 0.000000 0.000000 0.2947108
##stringlove 0.000000 0.000000 0.000000 0.2944955
##stringmadness 4.811252 5.449195 5.610477 0.5733814
##stringpasta 4.759957 5.281133 5.368852 0.6651675
##stringpizza 0.000000 0.000000 0.000000 0.3025495
##stringworld 0.000000 0.000000 0.000000 0.4183821
正如您所看到的,面食和疯狂是预测outcome
的关键词。
请注意: randomForest
有许多参数可用于解决实际的比例问题。这绝不是解决您问题的完整方案。它仅用于说明使用importance
函数回答您的问题。您可能需要在Cross Validated上就使用randomForest
的详细信息提出适当的问题。