我正在使用scikit的RandomForest方法进行3D点识别。我遇到的一个问题是,某些类比其他类更频繁地出现。
这意味着在从训练分类器生成预测的过程中,如果分类器不确定点类,则更可能假设它属于一个公共类而不是不太常见的类。
我在scikit文档for random forests中看到,fit方法中有一个sample_weight
参数。据我所知,只是对某些整体样本进行加权(比方说我有50个文件,我将训练它,它会将第一个样本的重量增加到其他所有样本的两倍)而不是类。
这不能解决问题,因为在我所有的样本中,最不常见的类几乎是罕见的。这只是特定班级的本质。
我发现了一些关于平衡随机森林和加权随机森林的论文。但我还没有看到任何关于如何在scikit中使用它的内容。我希望我错了 - 有没有办法加重内置的课程?我应该写一些单独的东西,人为地平衡我样本中不同类别的重量吗?
根据文件, Sample_weight
似乎是指样本而非类别权重。因此,如果我有文件A
,B
和C
以及类1
,2
和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级是超级罕见的(在实际数据中,它是1k指出数百万而不是12中的1)。
增加任何给定样本的权重不会增加特定类的权重,除非我伪造一些数据,其中样本几乎只包含该特定类。
我在文档中找到了sklearn.preprocessing.balance_weights(y)
但我发现没有人使用它。从理论上说,它做了我需要它做的事情,但我不知道如何将权重数组放回我的随机森林中。
答案 0 :(得分:2)
我猜这只适用于较新版本的scikit-learn,但您现在可以使用它。
rf = RandomForestClassifier(class_weight="balanced")
答案 1 :(得分:0)
我想知道使用“ balance_subsample
”而不是“ balanced
”是否会带来更好的结果
rf = RandomForestClassifier(class_weight="balanced_subsample")
此选项基于每次构建树所使用的Boostrap样本动态计算权重,因此它将调整每个样本集中的权重。如果我们认为每个样本集可能以不同的方式失衡,那么我想说这个选项应该是最好的。 试试这个。