一个类的RandomForest和另一个类的GradientBoosting

时间:2018-04-01 12:38:31

标签: python scikit-learn random-forest

在我正在进行的一个项目中,RandomForest为我提供了1级的准确结果,Gradient Boosting Classifier给出了0级的准确结果。我想使用它们两者,即两种分类器中最好的。是否可以在Python Sklearn中使用。我尝试使用Voting Classifier(不同重量的软选项),但它对我的原因没有多大帮助。

详细说明这就是问题,当我在测试集上使用RandomForest分类器时(对于二进制分类任务),这就是混淆矩阵 -

array([[5230, 7656],
       [ 683, **3340**]], dtype=int64)

并且,当我在相同的测试数据上使用GradientBoostingClassifier时,这就是我得到的混淆矩阵 -

array([[**11404**,  1482],
       [ 2183,  1840]], dtype=int64)

可以看出,RF正确地预测了1级(3340),而GBM正确地预测了0级(11404)。如何在某种集成方法中使用这两个分类器,以便我可以将RF用于Class 1,将GBM用于0级?

有人可以帮我吗?

干杯!

1 个答案:

答案 0 :(得分:0)

如果查看混淆矩阵的列,您会发现一种方法偏向于第1类('GradientBoostingClassifier'),而另一种方法偏向于第2类(RandomForest)。< / p>

您还应该意识到,您使用的两种方法都是整体方法。

为了更好地理解这个问题,假设你有method 1预测第1类作为输出,无论输入如何,method 2预测第2类作为输出而不管输入如何。现在尝试计算这两种方法的混淆矩阵。对于method 1,它看起来像:

array([[12886, 0],
       [ 4023, 0]], dtype=int64)

对于`方法2:

array([[0, 12886],
       [0, 4023]], dtype=int64)

您还应该熟悉precision and recall

所以我说的是,你所使用的这两种方法中没有一种真的擅长于一个类。他们只是偏向于一个阶级,其他阶级的假阳性和假阴性的成本。这两种方法的集合可能会提高您的表现,但它无法满足您的要求。

你要问的基本上是:如果输入是1级,则使用方法1;如果输入是2级,则使用方法2.现在考虑一下,如果你知道你的输入属于哪个类,你就不会申请任何这些分类方法都可以吗? ;)

编辑:如果要对两种方法进行整体合并,可以使用方法的估计概率。重要的是要记住,在这两种方法的情况下,给定的概率是估计,因为没有一种方法是概率方法。

假设输入X成为类y成员的概率(由方法m估算)写为:P(y|X, m)。然后你可以:

log(P(0|X)) = \sum{m \in M} log(P(0|X, m))
log(P(1|X)) = \sum{m \in M} log(P(1|X, m))

其中M是池中所有模型的集合。当然,如果出于某种原因,您可以相信一种方法而不是另一种方法,则可以计算日志的加权和。