3

Рассмотрит следующий пример dataframeR: как использовать случайные леса для прогнозирования двоичного результата с использованием строковых переменных?

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?

+1

Возможно, вам понадобится довольно много текстовой предварительной обработки, например. для всех текстов, посвященных макаронам и пицце, вы можете создать двоичный столбец «is_food» и вуаля, точность 100% (конечно, это чрезвычайно упрощенный пример). –

+0

спасибо! но я фактически не нуждаюсь в предварительной обработке. Меня просто интересует сила прогнозирования одиночных слов, таких как пицца, макаронные изделия и т. Д. –

+1

Разделить пространство, преобразовать в столбцы, затем индикаторы, запустить rf? – Vlo

ответ

4

Что вы хотите - это переменные значения, которые производятся от 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

потрясающий! спасибо aichao –

+1

в вашем опыте, этот алгоритм работает хорошо с очень большими и разреженными матрицами (много слов, но многие из них имеют 1 или 2 вхождения) –

+2

@Noobie: что произойдет, что ваш вход в случайный лес будет имеют много предикторов, поскольку модельная матрица, которая является контрастной матрицей ваших слов в строке, будет иметь много столбцов. Случайные лесные шкалы хорошо соответствуют числу предикторов, но, как и в случае с чем-либо, требуется распараллеливание для действительно больших проблем.Лучшей альтернативой может быть «xgboost», которая также имеет «важность». – aichao

 Смежные вопросы

  • Нет связанных вопросов^_^