使用 sklearn、三类分类的随机森林的 oob 分数是多少?

机器算法验证 分类 随机森林 样本外
2022-03-07 02:50:59

我的学习数据由约 45k 个样本组成,每个样本有 21 个特征。我正在尝试在此数据上训练一个随机森林分类器,该分类器被标记为 3 个类(-1、0 和 1)。这些类的大小或多或少相等。

我的随机森林分类器模型使用gini它作为分割质量标准,树的数量是 10,并且我没有限制树的深度。

大多数特征的重要性可以忽略不计——平均值约为 5%,其中三分之一的重要性为 0,其中三分之一的重要性高于平均值。

然而,也许最引人注目的事实是 oob(out-of-bag)分数:略低于 1%。这让我觉得模型失败了,事实上,在一个新的、大小约为 40k 的独立集合上测试模型,我得到了 63% 的分数(到目前为止听起来不错),但对混淆矩阵的更深入检查表明,模型仅对 0 类成功,在大约 50% 的情况下在 1 和 -1 之间做出决定时失败。

附上 Python 的输出:

array([[ 7732,   185,  6259],
       [  390, 11506,   256],
       [ 7442,   161,  6378]])

这自然是因为 0 类具有使其更容易预测的特殊属性。但是,我查到的oob分数是不是已经是模型不好的标志了?随机森林的 oob 分数是多少?是否有一些经验法则可以帮助确定模型是否“好”,单独使用 oob 分数,还是结合模型的其他一些结果?


编辑:删除不良数据(大约三分之一的数据)后,0 的标签或多或少为 2%,-1/+1 的标签分别为 49%。oob 得分为 0.011,测试数据得分为 0.49,混淆矩阵几乎不偏向第 1 类(约 3/4 的预测)。

4个回答

在阅读了 sklearn 文档和源代码之后,与 R 相比, sklearn 的 RF oob_score_(注意后面的下划线)不是很容易理解。我对如何改进模型的建议如下:

  1. sklearn 的 RF 曾经使用过糟糕的默认值max_features=1(如“尝试每个节点上的每个功能”)。然后它不再像随机森林那样进行随机列(/特征)选择。将其更改为例如max_features=0.33(如 R's mtry)并重新运行。告诉我们新的分数。

  2. “大多数功能都表现出微不足道的重要性”然后你需要根据文档进行特征选择- 进行分类。请参阅 CrossValidated.SE 上的文档和其他文章。在与训练的其余部分不同的(比如 20-30%)保持集上进行 FS,使用例如sklearn.cross_validation.train_test_split()(是的,这个名字有点误导)。现在告诉我们你在FS之后得到的分数?

  3. 您说“在删除不良数据(大约三分之一的数据)后,0 的标签或多或少为 2%,-1/+1 的标签分别为 49%”那么你有一个严重的阶级不平衡另外:“混淆矩阵显示模型仅对 0 类成功,并且在 +1 和 -1 之间的大约 50% 的情况下失败”这是阶级不平衡的症状。您可以使用分层抽样,也可以使用 +1 和 -1 类的示例训练分类器。您可以执行 OAA(One-Against-All)或 OAO(One-Against-One)分类器。尝试三个 OAA 分类器,每个类别一个。最后告诉我们那些分数?

没有好的 oob_score 这样的东西,重要的是 valid_score 和 oob_score 之间的区别。

将 oob_score 视为训练集的某个子集(例如,oob_set)的分数。要了解其创建方式,请参阅此

oob_set 取自您的训练集。而且您已经有了验证集(例如,valid_set)。

让我们假设一个场景,您的 validation_score 是 0.7365,oob_score 是 0.8329

在这种情况下,您的模型在直接取自您的训练数据集的 oob_set 上表现更好。表明,validation_set 是针对不同的时间段的。(比如 training_set 有“一月”月份的记录,validation_set 有“七月”月份的记录)。因此,oob_score 不仅仅是对模型性能的测试,它还测试“您的 Validation_set 的代表性”。

您应该始终确保您有一个良好的代表性验证集,因为它的分数被用作我们模型性能的指标。因此,您的目标应该是,oob_score 和 valid_score 之间的差异尽可能小。

我通常使用 oob_score 和 validation_score 来查看我的 validation_set 有多好。我从Jeremy Howard那里学到了这项技术。

问:使用 sklearn、三类分类的随机森林的 oob 分数是多少?

答:视情况而定。在我看来,如果学习和测试样本来自同一个分布,那么在我看来,OOB 大约等于 3 倍交叉验证。因此,如果我们重复相同的问题但使用“3 折交叉验证”,答案将是相同的,即“通常,准确率越高越好,除非你害怕过度拟合你的学习集,因为有人告诉你真实的测试样本具有不同的分布”。

你能给我你的数据集吗?我可以从中获得一点乐趣,并免费告诉你我设法用它做什么。

对这个问题的不同看法:首先,你必须将损失与你所做的每一次错误分类联系起来。对于误报(FP)和误报(FN),这种错误分类的代价/损失/惩罚(可能)会有所不同。一些分类,比如癌症检测,宁愿有更多的 FP 而不是 FN。其他一些,比如垃圾邮件过滤器,宁愿允许某些垃圾邮件(FN)而不是阻止来自您朋友的邮件(FP)。基于此逻辑,您可以使用 F1-score 或 Accuracy,任何适合您的目的。(例如,如果我的垃圾邮件过滤器没有 FP 且分数为 0.1,我会很高兴,因为我需要担心的垃圾邮件减少了 10% . 另一方面,即使是 0.9(90% 的垃圾邮件被过滤),其他人也可能不满意。那么什么是好分数?)