如何在RandomForest实现中加权类

Nah*_*kki 7 random-forest scikit-learn

我正在使用scikit的RandomForest方法进行3D点识别.我一直遇到的问题之一是某些类比其他类更常出现.这意味着在从训练的分类器生成预测的过程中,如果分类器不确定点类,则更可能假设它属于一个公共类而不是不太常见的类.

我在随机森林的scikit文档中看到,fit方法中有一个sample_weight参数.从我所知道的只是加权某些整体样本(比如我有50个文件我正在训练,它将第一个样本的重量是其他所有重量的两倍)而不是类.这并不能解决问题,因为在我所有的样本中,最不常见的类几乎是罕见的.这只是特定班级的本质.

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

*编辑以澄清我对sample_weight的理解* Sample_weight根据文档似乎是指样本而不是类权重.所以,如果我有文件A,B和C以及类1,2和3,那么让我们说:

A = [1 1 1 2]
B = [2 2 1 1]
C = [3 1 1 1]
Run Code Online (Sandbox Code Playgroud)

在上面我们有一个非常简化的情况,其中我们与其他类相比很少有3类.我的情况有8个班级,并且正在培训数百万个积分,但这个比例仍然令人难以置信地偏向于两个特定的班级.

使用sample_weight,它接收一个大小为m的数组(m是样本数),我可以对这三个文件中的任何一个的工作量进行加权.所以我的理解是我可以做一个sample_weight = [1 1 2],这样可以使样本C的强度是其他两个样本的两倍.但这并没有真正帮助,因为我的问题是3级是超级罕见的(在实际数据中,它是1k指出数百万而不是12中的1).增加任何给定样本的权重不会增加特定类的权重,除非我伪造一些数据,其中样本几乎只由该特定类组成.

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

Dav*_*ust 2

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

rf = RandomForestClassifier(class_weight="balanced")
Run Code Online (Sandbox Code Playgroud)