【发布时间】: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