使用randomForest R包得到奇怪的结果

时间:2014-12-05 20:21:16

标签: r machine-learning random-forest

我有一个包含10,000行和两列的数据框,segment(具有32个值的因子)和target(具有两个值的因子,'yes'和'no',每个5,000)。我正在尝试使用随机林来使用段作为特征对目标进行分类。

训练随机森林分类器后:

> 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

谢谢!

2 个答案:

答案 0 :(得分:1)

您的数据框架是平衡的,因为&#34;是&#34;和&#34;不&#34;整体而言几乎同样可能。但是,segment的值基本上不包含有关target的值的信息,因为&#34;是&#34;和&#34;不&#34;对于segment的所有级别来说几乎同样可能,因此没有理由期望来自随机森林或任何其他程序的良好预测。

如果您将segment转换为数字,则randomForest预测&#34;是&#34;大约65%的时间。大约63%的数据的值为segment,其中&#34;是&#34;比(&#34; no&#34;)(稍微)更可能,这可以解释&#34;是&#34;的高比率。 segment为数字时的预测。但无论segment是数字还是因子,整体错误率大致相同。我不确定为什么randomForest几乎总是选择&#34; no&#34;当segment是一个因素。

答案 1 :(得分:1)

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

参见Malley等人。生物医学数据的统计学习。 2011.剑桥大学出版社在使用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