Randomr软件包的奇怪结果

Randomr软件包的奇怪结果,r,machine-learning,random-forest,R,Machine Learning,Random Forest,我有一个数据框,有10000行和两列,段(一个有32个值的因子)和目标(一个有两个值的因子,'是'和'否',每个值5000)。我试图使用一个随机林来分类目标,使用段作为特征 训练随机森林分类器后: > forest <- randomForest(target ~ segment, data) 在10000行中,不到100行被归类为“是”(即使原始计数为50/50)。如果切换标签的名称,则会得到相反的结果: > data$target <- as.factor(ifel

我有一个数据框,有10000行和两列,段(一个有32个值的因子)和目标(一个有两个值的因子,'是'和'否',每个值5000)。我试图使用一个随机林来分类目标,使用段作为特征

训练随机森林分类器后:

> forest <- randomForest(target ~ segment, data)
在10000行中,不到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
看起来randomForest接受第一个标签,并且几乎总是为其指定点。为了澄清这一点,数据框是一个更大的表的子集,具有更多的特性——我刚刚发现,无论包含多少其他特性,这个特定的特性都会以某种方式导致这个结果。我想知道我是否遗漏了一些关于随机林分类器的基本信息,或者是否有一些编码问题或其他错误导致了这个奇怪的结果

原始数据集在以下位置作为RDS提供:


谢谢大家!

您的数据框架是平衡的,总体而言,“是”和“否”的可能性大致相同。然而,
的值基本上不包含有关
目标
值的信息,因为对于所有级别的
来说,“是”和“否”的可能性几乎相同,因此没有理由期望从随机林或任何其他过程中获得良好的预测


如果将
转换为数值,则
随机森林
大约65%的时间预测“是”。大约63%的数据是
的值,其中“是”的可能性(略)大于“否”,因此这可以解释当
为数字时“是”预测的高比率。但是无论
段是数字还是因子,总的错误率大致相同。我不知道为什么
randomForest
几乎总是选择“否”,而
segment
是一个因素

我认为,当片段是一个因素时,randomForest几乎总是选择“否”的原因是,当结果类大小存在任何不平等时,randomForest将产生扭曲的错误率、敏感性和特异性。因此,虽然您的数据是“相对”平衡的,但它们并不是完全平衡的;无论哪种结果类别在数据集中最为普遍,都将在预测中得到大力支持。如果在预测器和结果之间没有真正的关系时,将平衡数据发送到randomForest(),则会在预测类中获得更多的随机波动

参见Malley等人的《生物医学数据的统计学习》。2011剑桥大学出版社要求对使用随机森林分类时的数据平衡进行更全面的讨论

# 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
#创建结果平衡的数据集,随机预测值

数据我同意我不应该期望好的结果-我对最后一点感到非常惊讶,
randomfreest
几乎总是在
是一个因素时选择“否”。不知怎的,我期望那里有更多的异质性。有人知道为什么结果如此偏颇吗?更重要的是,如何纠正/解释/改变?
> 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
# 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