2014-12-05 63 views
1

我有一个数据框与10,000行和两列,段(一个因素与32值)和目标(一个因素有两个值,'是'和'否',每5,000 )。我正在尝试使用随机森林来将使用细分受众群作为目标的目标进行分类。奇怪的结果与randomForest R包

训练随机森林分类后:

> forest <- randomForest(target ~ segment, data) 

混淆矩阵向“不”强烈的偏见:

> print(forest$confusion) 

     no yes class.error 
no 4872 76 0.01535974 
yes 5033 19 0.99623911 

出了10,000行的,比100少得了归类为“是“(尽管原始计数是50/50)。如果我切换标签的名称,我得到相反的结果:

> data$target <- as.factor(ifelse(data$target == 'yes', 'no', 'yes')) 
> forest <- randomForest(target ~ segment, data = data) 
> print(forest$confusion) 

     no yes class.error 
no 4915 137 0.02711797 
yes 4810 138 0.97210994 

因此,这不是一个真正的信号......此外,原来的交叉表相对均衡:

> table(data$target, data$segment) 

     1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 26 27 28 29 3 30 31 32 4 5 6 7 8 9 
    no 1074 113 121 86 68 165 210 70 120 127 101 132 90 108 171 122 95 95 76 72 105 71 234 58 83 72 290 162 262 192 64 139 
    yes 1114 105 136 120 73 201 209 78 130 124 90 145 81 104 155 128 79 85 83 70 93 78 266 70 93 76 291 160 235 194 49 137 

它看起来像randomForest采取第一个标签,并几乎总是分配点。为了澄清,数据框是具有更多功能的较大表格的一个子集 - 我发现这个特定功能以某种方式导致了这个结果,无论包含多少其他功能。我想知道我是否缺少一些关于随机森林分类器的基本知识,或者是否存在导致这种奇怪结果的编码问题或其他错误。

原始数据集可作为一个RDS这里:

https://www.dropbox.com/s/rjq6lmvd78d6aot/weird_random_forest.RDS?dl=0

谢谢!

回答

1

您的数据框平衡的意思是,“是”和“否”大致相同。然而,segment的值基本上不包含关于target的值的信息,因为“是”和“否”在所有级别segment中的可能性大致相同,因此没有理由期望来自随机森林或任何其他的良好预测程序。

如果您将segment转换为数字,那么randomForest预计约65%的时间为“是”。大约63%的数据的值为segment,其中“是”(略)更可能比“否”更好,因此segment为数字时可以解释“是”预测的高比率。但是否segment是数字或因子,总体错误率大致相同。我不确定为什么randomForest几乎总是选择“否”,因为segment是一个因素。

+0

我同意我不应该期待好的结果 - 我对这最后一点大多感到惊讶,当'segment'是一个因素时'randomForest'几乎总是选择“no”。不知何故,我预计更多的异质性。 – 2014-12-05 21:55:22

1

我相信randomForest几乎总是选择'不',当段是一个因素是因为randomForest会产生扭曲的错误率,灵敏度和特异性时,结果类的大小有任何不平等。所以,虽然你的数据'相对'平衡,但它们并不完全平衡;无论哪个结果类别在数据集中最普遍,都将在预测中受到强烈的青睐。如果在预测变量和结果之间没有真正关系时将均衡数据发送给randomForest(),则预测类中的随机波动会更大。

参见Malley等,生物医学数据的统计学习。剑桥大学出版社在使用randomForest分类时更全面地讨论数据平衡问题。

# create dataset balanced on outcome, random predictor values 
data<-data.frame(target=rep(c("yes","no"),each=50), segment=sample(1:5, 100, replace=T)) 
table(data$target, data$segment) 
table(data$target) 
data$segment<- as.factor(data$segment) 
forest_run1 <- randomForest(target ~ segment, data=data) 
     #OOB estimate of error rate: 46% 
#Confusion matrix: 
    #no yes class.error 
    #no yes class.error 
#no 25 25  0.50 
#yes 21 29  0.42 

forest_run2 <- randomForest(target ~ segment, data=data) 
     #OOB estimate of error rate: 53% 
#Confusion matrix: 
    #no yes class.error 
#no 25 25  0.50 
#yes 28 22  0.56 

forest_run3 <- randomForest(target ~ segment, data=data) 
     #OOB estimate of error rate: 47% 
#Confusion matrix: 
    #no yes class.error 
#no 25 25  0.50 
#yes 22 28  0.44 

# COMPARE THIS TO UNBALANCED RESULTS, WHERE MORE PREVALENT CLASS ALMOST ALWAYS CHOSEN 
# create dataset, unbalanced on outcome, random predictor values: 
data1<-data.frame(target=sample(c("yes","no"),50, replace=T,prob=c(0.6,0.4)), segment=sample(1:5, 100, replace=T)) 
table(data1$target, data1$segment) 
table(data1$target) 

forest1 <- randomForest(target ~ segment, data=data1) 
     #OOB estimate of error rate: 38% 
#Confusion matrix: 
    #no yes class.error 
#no 14 30 0.6818182 
#yes 8 48 0.1428571