【问题标题】:How are the votes of individual trees calculated for Random Forest and Extra Trees in Sklearn?Sklearn中随机森林和额外树的单棵树的投票是如何计算的?
【发布时间】:2021-07-01 17:44:24
【问题描述】:

我一直在用 Rust 构建自己的 Extra Trees (XT) 分类器来进行二元分类。为了验证我的分类器的正确性,我一直将它与 XT 的 Sklearns 实现进行比较,但我不断得到不同的结果。起初我认为我的代码中一定有一个错误,但现在我意识到这不是一个错误,而是一种不同的方法来计算集合中不同树之间的投票。在我的代码中,每棵树都根据叶子数据子集中最频繁的分类进行投票。因此,例如,如果我们正在遍历一棵树,并发现自己位于具有 40 个 0 分类和 60 个 1 分类的叶节点,则树对数据进行分类作为1。

查看 Sklearn 的 XT 文档 (As seen here),我阅读了以下关于 predict 方法的内容

输入样本的预测类别是森林中树木的投票,由它们的概率估计加权。也就是说,预测的类别是所有树中平均概率估计最高的类别。

虽然这让我对单个树的投票方式有所了解,但我还有更多问题。也许这些权重如何计算的精确数学表达式会有所帮助,但我还没有在文档中找到。

我将在接下来的段落中提供更多详细信息,但我希望在这里简明扼要地提出我的问题。 这些权重是如何在高层次上计算出来的,其背后的数学原理是什么?有没有办法改变单个 XT 树计算投票的方式?

---------------------------------------- 附加细节 -- ----------------------------------------------

对于我当前的测试,这就是我构建分类器的方式

classifier = ExtraTreesClassifier(n_estimators=5, criterion='gini', 
              max_depth=1, max_features=5,random_state=0)

为了预测看不见的交易X,我使用classifier.predict(X)。通过predict(seen here, line 630-ish)的源代码挖掘,我看到这是所有执行二进制分类的代码

proba = self.predict_proba(X)
if self.n_outputs_ == 1:
    return self.classes_.take(np.argmax(proba, axis=1), axis=0)

这段代码的作用对我来说是比较明显的。它只是通过获取 proba 的 argmax 来确定最可能的交易分类。我不明白的是这个 proba 值是如何产生的。我相信 predict 使用的 predict_proba 方法在 Line 650-ish 处定义。这是我认为的相关源代码

check_is_fitted(self)
# Check data
X = self._validate_X_predict(X)

# Assign chunk of trees to jobs
n_jobs, _, _ = _partition_estimators(self.n_estimators, self.n_jobs)

# avoid storing the output of every estimator by summing them here
all_proba = [np.zeros((X.shape[0], j), dtype=np.float64)
                 for j in np.atleast_1d(self.n_classes_)]
lock = threading.Lock()
Parallel(n_jobs=n_jobs, verbose=self.verbose,
         **_joblib_parallel_args(require="sharedmem"))(
    delayed(_accumulate_prediction)(e.predict_proba, X, all_proba,
                                    lock)
    for e in self.estimators_)

for proba in all_proba:
    proba /= len(self.estimators_)

if len(all_proba) == 1:
    return all_proba[0]
else:
    return all_proba

我不明白这里到底在计算什么。这就是我的道路有点冷的地方,我感到困惑,发现自己需要帮助。

【问题讨论】:

    标签: python machine-learning scikit-learn random-forest


    【解决方案1】:

    树可以根据每个叶子中的训练样本比例来预测概率估计。在您的示例中,0 类的概率为 0.4,1 类的概率为 0.6。

    sklearn 中的随机森林和极其随机的树执行软投票:每棵树都像上面那样预测类概率,然后集成只是对跨树的概率进行平均。这会为每个类别产生一个概率,然后预测的类别是概率最大的类别。

    在代码中,相关位是_accumulate_predictions,它只是将概率估计相加,然后除以估计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-28
      • 2019-04-11
      • 2017-09-29
      • 2019-09-01
      • 2013-10-26
      • 2018-05-27
      • 2019-11-16
      • 2016-07-05
      相关资源
      最近更新 更多