考虑以下数据框架
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
变量中包含的句子中的哪些词是outcome
变量的强预测因子。
在R中,有没有(简单)的方法可以做到这一点?
回答:
您需要的是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
如您所见,pasta和madness是预测outcome
的关键词。
请注意: randomForest
有许多参数,这些参数对于解决实际问题的规模是相关的。这绝不是您问题的完整解决方案。这仅用于说明importance
函数在回答您的问题时的用法。您可能需要在Cross Validated上提出关于使用randomForest
的细节的适当问题。