我找到了几种关于袋外误差的解释,包括Stack Overflow上的一个:随机森林中的袋外误差是什么
然而,我没有找到任何关于如何精确计算它的公式。让我们以MATLAB帮助文件为例:err = oobError(B) 计算误分类概率[…]。B是使用TreeBagger类生成的树模型。
什么是误分类概率?它仅仅是袋外数据的准确率吗?
准确率 = (TP + FP) / (P+N)
那么,它仅仅是所有正确分类的实例与集合中所有实例的比率吗?
如果这是正确的,一方面我看到了计算它的好处,因为如果你有数据集来测试的话,这相当简单,就像袋外数据集一样。
但另一方面,准确率在处理不平衡数据集时已知不是一个好的指标。所以我的第二个问题是:袋外误差能否处理不平衡数据集,如果不能,在这种情况下指定它是否还有意义?
回答:
袋外误差只是在训练过程中未见过的样本上计算的误差。它在装袋方法中扮演着重要角色,因为通过对训练集进行自助抽样(通过随机有放回抽样构建新集合),你实际上得到了相当一部分未使用的训练数据(在极限情况下大约是30%)。如果你有许多这样的模型(如在随机森林中,你有许多树,每棵树都在其自己的自助样本上训练),那么你可以对这些误差进行平均,从而获得泛化误差的估计。
什么是误分类概率?它仅仅是袋外数据的准确率吗?
误分类概率是1-准确率
如果这是正确的,一方面我看到了计算它的好处,因为如果你有数据集来测试的话,这相当简单,就像袋外数据集一样。
因为使用一个测试集只能近似当前模型的质量(无论它是什么),而进行袋外误差计算是对你集合中单个元素(在随机森林的情况下是树)在所有可能的训练集选择上的估计。这是一种不同的概率度量,例如请参阅Tibshirani的《统计学习的要素》第7章。此外,它的优势在于你不会浪费任何数据点。保留一个单独的测试集需要相当多的数据点,这样你才能在剩余数据上获得合理的估计(模型)。袋外估计使你能够在使用所有可用数据的同时,说出它表现得如何。
但另一方面,准确率在处理不平衡数据集时已知不是一个好的指标。所以我的第二个问题是:袋外误差能否处理不平衡数据集,如果不能,在这种情况下指定它是否还有意义?
袋外误差与准确率无关。它在scikit-learn中实现时使用准确率,但它是基于任何损失函数(分类指标)定义的。你可以用MCC、F1或任何你想要的指标进行完全类似的操作。