Scikit learn 如何在RandomForest实现中加权类?

Scikit learn 如何在RandomForest实现中加权类?,scikit-learn,random-forest,Scikit Learn,Random Forest,我正在使用scikit的随机森林方法进行3D点识别。我经常遇到的一个问题是,某些类比其他类更经常出现 这意味着,在从经过训练的分类器生成预测的过程中,如果分类器不确定某个点类,则更可能假定它属于某个公共类,而不是不太公共的类 我看到在scikit文档中,fit方法中有一个sample\u weight参数。从我可以看出,只需对某些总体样本进行加权(比如说,我有50个训练文件,第一个样本的权重将是其他样本的两倍),而不是类 这并不能解决这个问题,因为在我所拥有的所有示例中,最不常见的类也同样罕见。

我正在使用scikit的随机森林方法进行3D点识别。我经常遇到的一个问题是,某些类比其他类更经常出现

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

我看到在scikit文档中,fit方法中有一个
sample\u weight
参数。从我可以看出,只需对某些总体样本进行加权(比如说,我有50个训练文件,第一个样本的权重将是其他样本的两倍),而不是类

这并不能解决这个问题,因为在我所拥有的所有示例中,最不常见的类也同样罕见。这只是那个特殊阶级的本质

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

Sample\u 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\u weight=[12]
,这将使样本C的强度是其他两个样本的两倍

然而,这并没有真正的帮助,因为我的问题是类3非常罕见(在实际数据中,它是百万分之一,而不是十二分之一)

增加任何给定样本的权重不会增加特定类的权重,除非我伪造了一些数据,其中样本除了特定类之外几乎什么都没有


我在文档中找到了,但找不到任何人使用它。从理论上讲,它可以满足我的需要,但我不知道如何将权重数组重新放入我的随机林中。

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

rf = RandomForestClassifier(class_weight="balanced")

我想知道使用“
balance\u子样本”而不是“
balanced
”是否会产生更好的结果

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

我不明白:“这并不能解决问题,因为在我所有的样本中,最不常见的类也同样罕见。这只是特定类的性质。”如果你将样本权重设置为
sample\u weight=(1/n\u samples\u在同一个类中)
这将为您提供合理的类别权重值。根据文档,样本权重似乎指的是样本,而不是类别权重。是的,但您可以将相同的样本权重分配给同一类别的所有样本,并且您的权重实际上与您提供的类别权重相同。通过提供样本权重来模拟类权重是可能的,但不是相反。我们真的应该在那里实现这个方便的东西——或者更确切地说,是从(我认为)SGDClassizer中考虑出来的。ogrisel完全是胡说八道,我很抱歉怀疑你!我对示例文件中的所有类创建了一个平面数组(而不是我以前使用的多维数组),然后通过balance_-weights方法运行该数组。由于标签现在是一维的,我可以在sample_weight字段中使用这些权重。
rf = RandomForestClassifier(class_weight="balanced_subsample")