7

我正在使用 scikit 的 RandomForest 方法进行 3D 点识别。我一直遇到的问题之一是某些类比其他类更频繁地出现。

这意味着在从经过训练的分类器生成预测的过程中,如果分类器不确定某个点类,它更有可能假设它属于常见类之一,而不是不太常见的类。

我在随机森林的 scikit 文档中看到 fit 方法中有一个sample_weight参数。据我所知,它只是对某些整体样本进行加权(比如我有 50 个正在训练的文件,它的第一个样本的权重是其他所有样本的两倍)而不是类。

这并不能解决问题,因为在我拥有的所有示例中,最不常见的类几乎一样罕见。这只是那个特定班级的性质。

我发现了一些关于平衡随机森林和加权随机森林的论文。但我还没有看到任何关于如何在 scikit 中使用它的信息。我希望我错了 - 有没有办法内置重量等级?我应该写一些单独的东西来人为地平衡样本中不同类别的权重吗?

Sample_weight,根据文档,似乎是指样本而不是类权重。因此,如果我有 files ABandC和 classes 12and 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)在文档中找到了,但找不到使用它的人。从理论上讲,它可以完成我需要做的事情,但我不知道如何将权重数组重新放入我的随机森林。

4

2 回答 2

2

我猜这仅适用于较新版本的 scikit-learn,但您现在可以使用它。

rf = RandomForestClassifier(class_weight="balanced")
于 2015-11-22T01:08:12.157 回答
0

balance_subsample我想知道使用“ ”而不是“ balanced”是否会产生更好的结果

rf = RandomForestClassifier(class_weight="balanced_subsample")

此选项会根据您每次构建树时使用的 Boostrap 样本动态计算权重,因此它会调整每个样本集中的权重。如果我们认为每个样本集可能以不同的方式不平衡,我会说这个选项应该是最好的选项。尝试这个。

于 2019-12-07T17:16:05.913 回答