我在tutorial中寻找Python中的部分依赖图。本教程或documentation中没有给出方程式。 R函数的documentation给出了我期望的公式:
对于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)了中心目标变量的真实分布。
如果您不仅想要单位,而且想要与
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 - 了解梯度提升回归树的部分依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49247796/