如何在RandomForest实现中加权类?

时间:2013-07-16 22:37:05

标签: scikit-learn random-forest

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

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

我在scikit文档for random forests中看到,fit方法中有一个sample_weight参数。据我所知,只是对某些整体样本进行加权(比方说我有50个文件,我将训练它,它会将第一个样本的重量增加到其他所有样本的两倍)而不是类。

这不能解决问题,因为在我所有的样本中,最不常见的类几乎是罕见的。这只是特定班级的本质。

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

根据文件,

Sample_weight似乎是指样本而非类别权重。因此,如果我有文件ABC以及类123,请说:

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级是超级罕见的(在实际数据中,它是1k指出数百万而不是12中的1)。

增加任何给定样本的权重不会增加特定类的权重,除非我伪造一些数据,其中样本几乎只包含该特定类。

我在文档中找到了sklearn.preprocessing.balance_weights(y)但我发现没有人使用它。从理论上说,它做了我需要它做的事情,但我不知道如何将权重数组放回我的随机森林中。

2 个答案:

答案 0 :(得分:2)

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

rf = RandomForestClassifier(class_weight="balanced")

答案 1 :(得分:0)

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

rf = RandomForestClassifier(class_weight="balanced_subsample")

此选项基于每次构建树所使用的Boostrap样本动态计算权重,因此它将调整每个样本集中的权重。如果我们认为每个样本集可能以不同的方式失衡,那么我想说这个选项应该是最好的。 试试这个。