我正在使用 scikit 的 RandomForest 方法进行 3D 点识别。我一直遇到的问题之一是某些类比其他类更频繁地出现。
这意味着在从经过训练的分类器生成预测的过程中,如果分类器不确定某个点类,它更有可能假设它属于常见类之一,而不是不太常见的类。
我在随机森林的 scikit 文档中看到 fit 方法中有一个sample_weight
参数。据我所知,它只是对某些整体样本进行加权(比如我有 50 个正在训练的文件,它的第一个样本的权重是其他所有样本的两倍)而不是类。
这并不能解决问题,因为在我拥有的所有示例中,最不常见的类几乎一样罕见。这只是那个特定班级的性质。
我发现了一些关于平衡随机森林和加权随机森林的论文。但我还没有看到任何关于如何在 scikit 中使用它的信息。我希望我错了 - 有没有办法内置重量等级?我应该写一些单独的东西来人为地平衡样本中不同类别的权重吗?
Sample_weight
,根据文档,似乎是指样本而不是类权重。因此,如果我有 files A
,B
andC
和 classes 1
,2
and 3
,让我们说:
A = [1 1 1 2]
B = [2 2 1 1]
C = [3 1 1 1]
看上面我们有一个非常简化的情况,与其他类相比,我们的类 3 非常少。我的情况有 8 个课程,并且正在训练数百万分,但与两个特定课程的比例仍然令人难以置信地倾斜。
使用 sample_weight ,它接收一个大小为 m 的数组(m 是样本的数量),我将能够衡量这三个文件中任何一个文件的工作量。所以我的理解是我可以做一个sample_weight = [1 1 2]
,这将使样本 C 的强度是其他两个样本的两倍。
但是,这并没有真正的帮助,因为我的问题是 3 类非常罕见(在实际数据中,它是百万分之 1,而不是 12 分中的 1 个)。
增加任何给定样本的权重不会增加特定类别的权重,除非我伪造一些数据,其中样本几乎只由特定类别组成。
我sklearn.preprocessing.balance_weights(y)
在文档中找到了,但找不到使用它的人。从理论上讲,它可以完成我需要做的事情,但我不知道如何将权重数组重新放入我的随机森林。