R:如何使用随机森林来预测使用字符串变量的二进制结果?
Posted
技术标签:
【中文标题】R:如何使用随机森林来预测使用字符串变量的二进制结果?【英文标题】:R: how to use random forests to predict binary outcome using string variables? 【发布时间】:2017-03-03 21:29:28 【问题描述】:考虑以下数据框
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 中是否有(简单的)方法可以做到这一点?
【问题讨论】:
您可能需要大量的文本预处理,例如对于所有与意大利面和比萨饼相关的文本,您可以创建一个二进制列“is_food”,瞧,100% 准确度(当然这是一个极其简化的示例)。 谢谢!但我实际上不需要预处理。我只对单个词的预测能力感兴趣,例如披萨、意大利面等 按空格分割,转换成列然后指标,运行rf? 有趣。你知道如何在上面的例子中编写代码吗? @Noobie,我仍然相信您需要进行一些预处理,例如删除停用词、将其他词转换为其词根 (en.wikipedia.org/wiki/Root_(linguistics)) 等。 【参考方案1】:您想要的是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
的详细信息的适当问题。
【讨论】:
根据您的经验,这种算法是否适用于非常大且稀疏的矩阵(很多单词,但其中许多单词出现 1 或 2 次) @Noobie:将会发生什么,您对随机森林的输入将有很多预测变量,因为模型矩阵(string
中您的单词的对比矩阵)将有很多的列。随机森林可以很好地适应预测变量的数量,但是对于真正的大问题需要任何并行化。更好的选择可能是xgboost
,它还具有importance
功能。
@Noobie:还有一点。对于非常大且稀疏的模型矩阵,您可能希望/需要使用 Matrix
包中的 sparse.model.matrix
。不幸的是,我不相信randomForest
支持稀疏矩阵输入,所以这是一个限制。但是,xgboost
可以,您可以使用其importance
函数进行相同的分析。所以,我建议你试试xgboost
。以上是关于R:如何使用随机森林来预测使用字符串变量的二进制结果?的主要内容,如果未能解决你的问题,请参考以下文章