2013-04-03 60 views
3

假设我的数据集是一个100 x 3矩阵充满了分类变量。我想对响应变量进行二元分类。让我们做一个数据集下面的代码:基于树[R方法,如随机森林,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 

第二种方法是对数据集转化为宽格式和把每个类别作为变量。我这样做的原因是因为我的实际数据集在var1和var2中有500多个因子,因此树分区总是将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 

从两种方法的结果是不同。差异更为明显,因为我们在每个变量中引入了更多级别,即var1var2。我的问题是,由于我们使用完全相同的数据,为什么结果不同?我们应该如何解释这两种方法的结果?哪个更可靠?

回答

2

虽然这两款车型看起来相同,它们是从一个在另一人的第二种模式有着根本的不同,您可隐式包含一个给定的观察可能有多种颜色和多种高度的可能性。两个模型公式之间的正确选择将取决于您现实世界观测的特征。如果这些字符是排他性的(即每个观察具有单一颜色和高度),那么该模型的第一个公式将是正确的。但是,如果观察结果可能是蓝色和绿色,或者任何其他颜色组合,则可以使用第二个公式。从看你的原始数据的预感,看起来第一个是最合适的(即,观察如何具有多个高度?)。

而且,你为什么要在DF2为0和2秒,而不是0/1编码的逻辑变量列?我徘徊,如果这将对合适性产生影响,取决于数据如何被编码为因子或数字。