RF:一类的OOB精度高,另一类的精度非常低,类不平衡大
Posted
技术标签:
【中文标题】RF:一类的OOB精度高,另一类的精度非常低,类不平衡大【英文标题】:RF: high OOB accuracy by one class and very low accuracy by the other, with big class imbalance 【发布时间】:2012-05-05 14:09:06 【问题描述】:我是随机森林分类器的新手。我正在使用它对具有两个类的数据集进行分类。 - 特征数为 512。 - 数据比例为1:4。即,75% 的数据来自第一类,25% 来自第二类。 - 我正在使用 500 棵树。
分类器产生 21.52% 的袋外错误。 第一类(由 75% 的训练数据表示)的每类误差为 0.0059。而第二类的分类误差非常高:0.965。
我正在寻找对此行为的解释,如果您有提高第二类准确性的建议。
期待您的帮助。
谢谢
忘了说我使用的是 R 并且在上面的测试中我使用了 1000 的节点大小。
这里我只用 10 棵树和 nodesize= 1 重复了训练(只是为了给出一个想法),下面是 R 中的函数调用和混淆矩阵:
randomForest(formula = Label ~ ., data = chData30PixG12, ntree = 10,importance = TRUE, nodesize = 1, keep.forest = FALSE, do.trace = 50)随机森林类型:分类
树数:10
没有。每次拆分尝试的变量数:22
OOB 估计错误率:24.46%
混淆矩阵:
不相关、相关、类错误
无关的 37954 , 4510 , 0.1062076 相关8775、3068、0.7409440【问题讨论】:
是训练集上的错误,还是测试集上的错误? @larsmans 这可能是袋外错误(几乎是某种)测试集错误。 数据集是不平衡的,最简单的方法(概念上)是从第二类添加副本到它,比例为 1:4,每个观察将是三个副本,但这种方法是天真和计算要求很高 【参考方案1】:看起来分类器完全无法在数据中找到结构。它所能做的最好的事情就是将所有内容都归为第 1 类,因为这是最常见的类。
【讨论】:
可能存在一两个错误分类。我想看看树。 感谢您的快速回答。 @usr 你能告诉我吗 @usr 你能告诉我我应该为你提供哪种输出。我正在使用 R 进行分类。【参考方案2】:我同意 @usr 的观点,一般来说,当您看到随机森林只是将(几乎)每个观察值归类为多数类时,这意味着您的特征没有提供太多信息来区分这两个类。
一种选择是运行随机森林,以便对少数类的观察结果进行过度抽样(而不是从整个数据集中进行替换抽样)。因此,您可以指定每棵树都建立在大小为 N 的样本上,您可以强制 N/2 的观察值来自每个类(或您选择的其他比例)。
虽然这可能对某些人有所帮助,但它绝不是万灵药。与调整 RF 设置相比,您可能更有可能通过寻找更好的功能来更好地区分类别。
【讨论】:
谢谢你,我会尝试你的建议,我会考虑其他功能。【参考方案3】:如果您将显示导致如此糟糕分类的代码,它将很有用。现在我看到了表现如此糟糕的一个原因——nodesize = 1000
的价值太大了。你的数据集中有多少观察?尝试使用默认值nodesize
或将其设置为更小的值。
【讨论】:
感谢您的回答。实际上,通过使用默认节点大小和使用 SMOTE 过采样,我得到了更好的结果。【参考方案4】:嗯,这是典型的类不平衡问题。随机森林是一种旨在最大化模型准确性的分类器。当一个类占数据的大部分时,分类器实现准确度的最简单方法是将所有观察结果分类到多数类中。在您的情况下,这给出了非常高的准确度,为 0.75,但是一个糟糕的模型 - 对于少数类几乎没有正确的分类。有很多方法可以处理这个。更简单的方法是使用多数类的欠采样来平衡数据,然后用这个平衡的数据训练模型。希望这可以帮助你。
【讨论】:
【参考方案5】:您可以尝试使用 sampsize = c(500,500) 来平衡错误结果(即,在每棵树中,每个类将使用 500 个,以避免不平衡错误的问题,您当然可以更改数字,以及大小节点太大,它可能会使树变得非常小(在每个树中使用一些变量)。你不想过度训练训练集(即使 RF 模型处理了这一点),但你想使用每棵树中至少有一些变量。
【讨论】:
令人惊讶的是这没有被赞成,因为它是正确的答案。【参考方案6】:我很惊讶没有人提到使用 'classwt' 参数。加权随机森林 (WRF) 就是专门为解决此类问题而设计的。
请看这里:Stack Exchange question #1
在这里:Stack Exchange question #2
关于加权随机森林的文章:PDF
【讨论】:
classwts
参数似乎正在改进中,并且在randomForest
包News 的愿望清单上。 bigrf
包中的对应参数是 `yclasswts' 参数。以上是关于RF:一类的OOB精度高,另一类的精度非常低,类不平衡大的主要内容,如果未能解决你的问题,请参考以下文章
神经网络 MNIST:反向传播是正确的,但训练/测试精度非常低