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

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

对于Python教程中给出的结果,这似乎没有任何意义。如果它是房价预测的平均值,那么它又是负数又是多少呢?我期望数以百万计的值。我想念什么吗?

更新:

为了进行回归,似乎从上述公式中减去了平均值。如何将其加回去?对于我训练有素的模型,我可以通过

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

我想平均加上(?)。我是否可以通过仅在更改了Independent_feature值的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)

因此,PDP中未包含initial_prediction(对于GradientBoostingRegressor(loss='ls')而言,它仅等于训练y的平均值),这会使预测为否定。

至于其较小的值范围,您的示例中的y_train很小:平均房屋值(value)大致为2,因此房价可能用百万表示。

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

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



如果您仍然不满意,请参阅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)了中心目标变量的真实分布。

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

如果您不仅想要单位,而且想要与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');

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

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

10-12 20:02