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 列标记为单词。在这里,我使用dplyrtidyr 只是为了方便。关键是只使用您想要的单词标记作为预测变量。

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:如何使用随机森林来预测使用字符串变量的二进制结果?的主要内容,如果未能解决你的问题,请参考以下文章

R 中的随机森林 - 19 个预测变量,1 个因变量

将条件变量添加到 R 中的随机森林模型

随机森林中的R - 19个预测变量,1个因变量

当缺少数据时,使用 R 随机森林预测新数据

如何正确应用随机森林?

如何使用不同尺寸的多个分类输入变量为随机森林回归模型?