2013-04-03 8 views
3

Предположим, что мой набор данных - это матрица 100 x 3, заполненная категориальными переменными. Я хотел бы сделать двоичную классификацию по переменной ответа. Давайте составляют набор данных с помощью следующего кода:R основанные на деревьях методы, такие как randomForest, adaboost: интерпретировать результат с одних и тех же данных в другом формате

set.seed(2013) 
y <- as.factor(round(runif(n=100,min=0,max=1),0)) 
var1 <- rep(c("red","blue","yellow","green"),each=25) 
var2 <- rep(c("shortest","short","tall","tallest"),25) 
df <- data.frame(y,var1,var2) 

Данные выглядит следующим образом:

> head(df) 
    y var1  var2 
1 0 red shortest 
2 1 red short 
3 1 red  tall 
4 1 red tallest 
5 0 red shortest 
6 1 red short 

Я пытался сделать случайный лес и AdaBoost этих данных с двумя различными подходами. Первый подход заключается в использовании данных, как это:

> library(randomForest) 
> randomForest(y~var1+var2,data=df,ntrees=500) 

Call: 
randomForest(formula = y ~ var1 + var2, data = df, ntrees = 500) 
       Type of random forest: classification 
        Number of trees: 500 
No. of variables tried at each split: 1 

     OOB estimate of error rate: 44% 
Confusion matrix: 
    0 1 class.error 
0 29 22 0.4313725 
1 22 27 0.4489796 

---------------------------------------------------- 
> library(ada) 
> ada(y~var1+var2,data=df) 

Call: 
ada(y ~ var1 + var2, data = df) 

Loss: exponential Method: discrete Iteration: 50 

Final Confusion Matrix for Data: 
      Final Prediction 
True value 0 1 
     0 34 17 
     1 16 33 

Train Error: 0.33 

Out-Of-Bag Error: 0.33 iteration= 11 

Additional Estimates of number of iterations: 

train.err1 train.kap1 
     10   16 

Второй подход заключается в преобразовании набора данных в широком формате и рассматривать каждую категорию в качестве переменной. Причина, по которой я делаю это, состоит в том, что у моего фактического набора данных есть более 500 факторов в var1 и var2, и в результате разбиение деревьев всегда будет разделять 500 категорий на 2 разделения. При этом теряется много информации. Для того, чтобы преобразовать данные:

id <- 1:100 
library(reshape2) 
tmp1 <- dcast(melt(cbind(id,df),id.vars=c("id","y")),id+y~var1,fun.aggregate=length) 
tmp2 <- dcast(melt(cbind(id,df),id.vars=c("id","y")),id+y~var2,fun.aggregate=length) 
df2 <- merge(tmp1,tmp2,by=c("id","y")) 

Новые данные выглядит следующим образом:

> head(df2) 
    id y blue green red yellow short shortest tall tallest 
1 1 0 0  0 2  0  0  2 0  0 
2 10 1 0  0 2  0  2  0 0  0 
3 100 0 0  2 0  0  0  0 0  2 
4 11 0 0  0 2  0  0  0 2  0 
5 12 0 0  0 2  0  0  0 0  2 
6 13 1 0  0 2  0  0  2 0  0 

применяю случайный лес и AdaBoost этого нового набора данных:

> library(randomForest) 
> randomForest(y~blue+green+red+yellow+short+shortest+tall+tallest,data=df2,ntrees=500) 

Call: 
randomForest(formula = y ~ blue + green + red + yellow + short +  shortest + tall + tallest, data = df2, ntrees = 500) 
       Type of random forest: classification 
        Number of trees: 500 
No. of variables tried at each split: 2 

     OOB estimate of error rate: 39% 
Confusion matrix: 
    0 1 class.error 
0 32 19 0.3725490 
1 20 29 0.4081633 

---------------------------------------------------- 
> library(ada) 
> ada(y~blue+green+red+yellow+short+shortest+tall+tallest,data=df2) 
Call: 
ada(y ~ blue + green + red + yellow + short + shortest + tall + 
tallest, data = df2) 

Loss: exponential Method: discrete Iteration: 50 

Final Confusion Matrix for Data: 
      Final Prediction 
True value 0 1 
     0 36 15 
     1 20 29 

Train Error: 0.35 

Out-Of-Bag Error: 0.33 iteration= 26 

Additional Estimates of number of iterations: 

train.err1 train.kap1 
     5   10 

Результаты двух подходов другой. Разница более очевидна, поскольку мы вводим больше уровней в каждую переменную, то есть var1 и var2. Мой вопрос в том, что, поскольку мы используем точно такие же данные, почему результат отличается? Как следует интерпретировать результаты обоих подходов? Что более надежно?

ответ

2

Хотя эти две модели выглядят одинаково, они принципиально отличаются друг от друга. На второй модели вы подразумеваете возможность того, что данное наблюдение может иметь несколько цветов и несколько высот. Правильный выбор между двумя модельными формулировками будет зависеть от характеристик ваших реальных наблюдений. Если эти символы являются исключительными (т. Е. Каждое наблюдение имеет один цвет и высоту), первая формулировка модели будет подходящей для использования. Однако, если наблюдение может быть как синим, так и зеленым или любой другой цветовой комбинацией, вы можете использовать вторую формулировку. Из-за догадки, глядя на ваши исходные данные, кажется, что первый из них наиболее уместен (т. Е. Как наблюдение будет иметь несколько высот?).

Кроме того, почему вы закодировали свои столбцы логической переменной в df2 как 0s и 2s вместо 0/1? Я блуждаю, если это повлияет на подгонку в зависимости от того, как данные кодируются как факторные или числовые.

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

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