R:如何使用随机林来使用字符串变量预测二进制结果?

R:如何使用随机林来使用字符串变量预测二进制结果?,r,machine-learning,classification,random-forest,text-classification,R,Machine Learning,Classification,Random Forest,Text Classification,考虑以下数据帧 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

考虑以下数据帧

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

outcome您想要的是由
randomForest
生成的变量重要性度量。这是通过
重要性
功能获得的。以下是一些应该让您开始的代码:

outcome <- c(1,0,0,1,1)
string <- c('I love pasta','hello world', '1+1 = 2','pasta madness', 'pizza madness')
步骤2:
字符串
列标记为单词。这里,为了方便起见,我使用了
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
正如你所见,面食和疯狂是预测结果的关键词


请注意:randomForest
有许多参数与解决实际规模问题相关。这决不是你问题的完整解决方案。这只是为了说明在回答您的问题时使用
重要性
功能。您可能需要询问有关使用randomForest的详细信息的适当问题

您可能需要大量的文本预处理,例如,对于所有与意大利面和比萨饼相关的文本,您可以创建一个二进制列“is_food”,瞧,100%准确率(当然这是一个极其简化的示例)。谢谢!但我实际上不需要预处理。我只是对单个单词的预测能力感兴趣,比如比萨饼、意大利面等,按空格排列,转换成列,然后是指示器,运行rf?有趣。你知道如何在上面的例子中进行编码吗?@Noobie,我仍然相信你需要一些预处理,比如删除停止词,将其他单词转换为它们的根()等等。根据你的经验,这个算法是否适用于非常大和稀疏的矩阵(很多单词,但很多单词出现1或2次)@Noobie:random forest的输入将有很多预测值,因为模型矩阵(string字符串中单词的对比矩阵)将有很多列。随机森林可以很好地扩展到预测器的数量,但对于真正大的问题,并行化是必需的。更好的选择可能是
xgboost
,它还具有
重要性
功能。@Noobie:另一点。对于非常大且稀疏的模型矩阵,您可能希望/需要使用
matrix
包中的
sparse.model.matrix
。不幸的是,我不相信
randomForest
支持稀疏矩阵输入,所以这是一个限制。但是,
xgboost
确实如此,您可以使用其
重要性
功能进行相同的分析。因此,我建议您尝试
xgboost
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
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