Gradient Boosted Decision Trees 如何找到每棵树的预测?

数据挖掘 分类 scikit-学习 助推
2022-02-20 03:03:53

我正在做一个项目。我有一个分类问题,我应该使用梯度提升决策树来解决。我想要做的是创建一个矩阵,为每个样本提供每个决策树的预测。例如,如果我有 100 个样本和 100 棵树,我应该有 100x100 矩阵。i, j th entry给出第i个样本的第j棵树的预测。

我正在使用 sklearn,问题是我无法通过每棵树进行预测。

到目前为止,我尝试过:

newgb=gb.estimators_[0][0].fit(X_train, y_train)
print(newgb.score(X_train, y_train))

其中 gb 已经是一个拟合模型。我从 sklearn 的文档中了解到的

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor.staged_predict

.estimators_

应该返回 (number-of-trees x 1) 矩阵,每个条目都包含我们模型使用的树。通过 gb.estimators_[0][0] 我试图访问第一棵树,并用分数预测它。我得到的输出是:

[0.12048193 0.95       0.95       0.95       0.95       0.95
 0.95       0.95       0.95       0.95       0.12048193 0.95
 0.95       0.95       0.12048193 0.12048193 0.12048193 0.12048193
...]

它们都不是 1 或 0,应该是(它是二进制分类),并且值会像 0.95 和 0.12 一样重复。我也没有使用任何似然函数

。分数()

应该只给我1和0。

我不知道如何获得每棵树的预测。我也不知道我做错了什么。

1个回答

Sklearn 的 GradientBoostingClassifier 不是使用决策树分类器树实现的。它使用回归器进行分类和回归。你可以在这里阅读:

GB 以前向阶段方式构建加法模型;它允许优化任意可微损失函数。在每个阶段,n_classes_ 回归树都适合二项式或多项式偏差损失函数的负梯度。二元分类是一种特殊情况,其中只引入了一个回归树。

这意味着它不会像在树估计器上调用 predict 那样简单。我之前建议它可以使用 sklearn 的私有方法来实现,但正如BenReiniger指出的那样,sklearn 已经在方法中为我们实现了这个staged_predict