2013-07-16 71 views
7

我正在使用scikit中的RandomForest方法进行3D点识别。我不断遇到的一个问题是,某些类别比其他类别更经常出现。这意味着在从训练分类器生成预测的过程中,如果分类器不确定一个点类,它将更有可能假定它属于一个普通类,而不是不那么不常见的类。如何在RandomForest实现中加权类

我看到,在scikit文档for random forests中,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] 

展望上面我们有一个情况,很简单的,我们在其中只有很少的3级相比,其他类。我的情况有8个阶段,正在接受数百万分的训练,但这个比例对于两个特定的阶层仍然是令人难以置信的偏向。

使用sample_weight,它接受一个大小为m的数组(m是样本数),我将能够权衡这三个文件中的任何一个的工作情况。所以我的理解是,我可以做一个sample_weight = [1 1 2],这样可以使样本C比其他两个样本强两倍。但是这并没有真正的帮助,因为我的问题是第3类是非常罕见的(在实际数据中,它是从数百万中的1k点而不是12中的1个)。增加任何给定样本的权重不会增加特定类别的权重,除非我伪造一些数据,其中样本几乎不包含该特定类别。

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

+4

我不明白:“这不能解决这个问题,因为在我所有的样本中,最不常见的类很少见,只是这个特定类的性质。” 如果您将样本权重放在'sample_weight =(1/n_samples_in_same_class)'中,它将为您提供合理的类别权重值。 – ogrisel

+0

sample_weight根据文档似乎指的是样本而非类的权重。 – Nahkki

+1

是的,但您可以将相同的样本权重分配给同一班级的所有样本,并且您有效地加权,就好像您已提供班级权重一样。可以通过提供样本权重来模拟课堂权重,但不能相反。 – ogrisel

回答

2

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

rf = RandomForestClassifier(class_weight="balanced")