如何解决LightGBM 如何计算回归中第一棵树的叶值?
当使用 create_tree_digraph
从回归中绘制第一棵树时,叶值使
对我没有意义。例如:
from sklearn.datasets import load_boston
X,y = load_boston(return_X_y=True)
import lightgbm as lgb
data = lgb.Dataset(X,label=y)
bst = lgb.train({},data,num_boost_round=1)
lgb.create_tree_digraph(bst)
给出以下树:
以叶子 3 为例,这些似乎是拟合值:
bst.predict(X,num_iteration=0)[X[:,5]>7.437]
array([24.78919238,24.78919238,24.78919238])
但与显而易见且微不足道的取均值方法相比,这些预测似乎很糟糕:
y[X[:,5]>7.437]
array([38.7,43.8,50.,39.8,42.3,48.5,44.8,37.6,46.7,41.7,48.3,42.8,44.,43.1,48.8,43.5,35.2,45.4,46.,21.9])
y[X[:,5]>7.437].mean()
45.09666666666667
我在这里遗漏了什么?
解决方法
LightGBM 的叶节点输出值显示来自该叶节点的预测,其中包括乘以学习率。
默认学习率为 0.1
(https://lightgbm.readthedocs.io/en/latest/Parameters.html#learning_rate)。如果将其更改为 1.0
,您应该会看到叶子 3 的输出值为 45.097
(恰好是落入该叶子节点的所有观察值的 y
平均值)。
from sklearn.datasets import load_boston
X,y = load_boston(return_X_y=True)
import lightgbm as lgb
data = lgb.Dataset(X,label=y)
bst = lgb.train({"learning_rate": 1.0},data,num_boost_round=1)
lgb.create_tree_digraph(bst)
同样,如果您将 learning_rate
设置为非常非常非常小的值,您应该会看到第一棵树中的大多数叶节点的值与 y
的全局平均值非常相似。示例数据中 y
(y.mean()
) 的全局平均值为 22.532
。
bst = lgb.train({"learning_rate": 0.0000000000001},num_boost_round=1)
lgb.create_tree_digraph(bst)
我不建议在实践中设置 learning_rate=1.0
,因为它会导致更差的准确性。对于像 LightGBM 这样的梯度提升库,最好使用学习率 < 1.0
和更高的 num_boost_round
(尝试 100
),这样每个单独的树对最终预测的影响有限。
如果这样做,您会发现添加到模型中的每个后续树都应该在准确性上增加一点点增量。这就是您的原始示例中发生的情况。示例数据中 y
(y.mean()
) 的全局平均值为 22.532
。对于局部均值为 45.097
且学习率设置为 0.1
的一组记录,第一棵树预测了 24.789
。本身并不是一个很好的预测,但对那个组的预测比全局平均值更好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。