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