gpt4 book ai didi

python - 理解梯度提升回归树的部分依赖

转载 作者:行者123 更新时间:2023-12-04 23:37:29 26 4
gpt4 key购买 nike

我在看 tutorial用于 Python 中的部分依赖图。教程或 documentation 中没有给出方程. documentation R 函数给出了我期望的公式:

enter image description here

这对于 Python 教程中给出的结果似乎没有意义。如果是房价预测的平均值,那怎么是负的小呢?我希望值(value)数以百万计。我错过了什么吗?

更新:

对于回归,似乎从上述公式中减去平均值。这个怎么加回来?对于我训练有素的 型号 我可以通过

from sklearn.ensemble.partial_dependence import partial_dependence
partial_dependence, independent_value = partial_dependence(model, features.index(independent_feature),X=df2[features])

我想将 (?) 加回平均值。我可以通过对 df2 值使用 model.predict() 来获得这个吗?

最佳答案

R 公式的工作原理
r问题中提出的公式适用于 randomForest .随机森林中的每棵树都试图直接预测目标变量。因此,每棵树的预测都在预期区间内(在您的情况下,所有房价均为正),而整体预测只是所有单个预测的平均值。

ensemble_prediction = mean(tree_predictions)

这就是公式告诉您的:只需对所有树进行预测 x并平均它们。

为什么 Python PDP 值很小

sklearn ,然而,部分依赖是为 GradientBoostingRegressor 计算的.在梯度提升中,每棵树都预测了当前预测时损失函数的导数,该导数仅与目标变量间接相关。对于 GB 回归,预测为
ensemble_prediction = initial_prediction + sum(tree_predictions * learning_rate)

对于 GB 分类预测概率是
ensemble_prediction = softmax(initial_prediction + sum(tree_predictions * learning_rate))

对于这两种情况,部分依赖报告为只是
sum(tree_predictions * learning_rate)

因此,initial_prediction(对于 GradientBoostingRegressor(loss='ls'),它仅等于训练的平均值 y)没有包含在 PDP 中,这使得预测为负。

至于其值的小范围, y_train在你的例子中很小:平均房屋值(value)大约是 2 ,因此房价可能以百万表示。

sklearn 公式实际上是如何工作的

我已经在 sklearn中说过了部分依赖函数的值是所有树的平均值。还有一个调整:所有不相关的特征都被平均掉了。为了描述平均的实际方式,我将引用 the documentation sklearn:

For each value of the ‘target’ features in the grid the partial dependence function need to marginalize the predictions of a tree over all possible values of the ‘complement’ features. In decision trees this function can be evaluated efficiently without reference to the training data. For each grid point a weighted tree traversal is performed: if a split node involves a ‘target’ feature, the corresponding left or right branch is followed, otherwise both branches are followed, each branch is weighted by the fraction of training samples that entered that branch. Finally, the partial dependence is given by a weighted average of all visited leaves. For tree ensembles the results of each individual tree are again averaged.



如果您仍然不满意,请参阅 the source code .

一个例子

要查看预测已经在因变量的范围内(但只是居中),您可以查看一个非常简单的示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble.partial_dependence import plot_partial_dependence

np.random.seed(1)
X = np.random.normal(size=[1000, 2])
# yes, I will try to fit a linear function!
y = X[:, 0] * 10 + 50 + np.random.normal(size=1000, scale=5)
# mean target is 50, range is from 20 to 80, that is +/- 30 standard deviations
model = GradientBoostingRegressor().fit(X, y)

fig, subplots = plot_partial_dependence(model, X, [0, 1], percentiles=(0.0, 1.0), n_cols=2)
subplots[0].scatter(X[:, 0], y - y.mean(), s=0.3)
subplots[1].scatter(X[:, 1], y - y.mean(), s=0.3)
plt.suptitle('Partial dependence plots and scatters of centered target')
plt.show()

您可以看到部分依赖图很好地反射(reflect)了中心目标变量的真实分布。

enter image description here

如果您不仅希望单位,而且希望与您的 y 一致,您必须将“丢失”均值添加到 partial_dependence 的结果中函数,然后手动绘制结果:
from sklearn.ensemble.partial_dependence import partial_dependence
pdp_y, [pdp_x] = partial_dependence(model, X=X, target_variables=[0], percentiles=(0.0, 1.0))
plt.scatter(X[:, 0], y, s=0.3)
plt.plot(pdp_x, pdp_y.ravel() + model.init_.mean)
plt.show()
plt.title('Partial dependence plot in the original coordinates');

enter image description here

关于python - 理解梯度提升回归树的部分依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49247796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com