使用随机森林强制选择多数类中的样本

数据挖掘 机器学习 随机森林
2021-09-27 12:54:47

背景:我有一些数据适合随机森林分类器(二进制输出),其中 1 是非常罕见的事件。特别是,在我的训练集中,29400 个点中只有 614 个 1。我正在使用 sklearn RandomForestClassifier。

我正在设置class_weight = balanced以防止模型简单地预测每种情况下的 0。而且效果很好!

但是,我希望我的模型捕获 0 类中的一小部分(可能只有 20 - 30 个案例)(编辑:实际上大约 300 个)。我相信由于构建树时的采样性质,这些类不经常选择。有没有已知的方法来解决这个问题?

我的想法:

  1. 在 RF 之后添加一个额外的滤波器。麻烦的是,对于这 20 -30 个否定案例,很难找到一些简单的分类方法。

  2. 在构建树时强制 RF 包含这些样本。因此这篇文章...

谢谢。

2个回答

我建议您从数据集中删除这 30 个事件和所有 1(我假设您知道它们是哪 30 个)。然后从剩余的数据集中随机选择 584 个样本并将其粘在一起。这将为您提供一个相同权重的完整数据集,其中包含所有 30 个确定的数据。

请参阅以下伪代码(它不会运行,因为我不知道您如何识别这 30 个案例,所以我在概括)

data = import()

ones = data.select('1')

interesting = data.select('something to select the 30 data points')

data.drop('1' and 'something to select the 30 data points')

randomList = randomListGen()

selected = data.select(randomList)

joined = join(selected, ones, interesting)

正如我之前所说,这不会在任何东西上运行,如果你给出你正在使用的语言和一个最小的工作示例,那么我可能能够产生更可靠的东西。

如果您可以找到具有要选择的值的列,则可以在 train_test_split 函数中使用分层。Stratify 将尝试为每个值选择相等数量的案例,类似于您使用的案例。您不会捕获所有这些,只是价值与非价值的相等样本,但这将是比在模型上强制进行非随机抽样更好的方法。

train_test_split(..., stratify=df['column'])

在此拆分之后,火车和测试拆分将具有与原始数据框具有的您选择的列相同的值比率。