【问题标题】:How to calculate the weight and value in lightgbm?如何计算lightgbm中的重量和价值?
【发布时间】:2021-06-03 02:23:55
【问题描述】:

我们可以使用tree_to_dataframelgb.create_tree_digraph来展示lightgbm模型的结构。内部节点和叶子节点都有weightvalue

文件说:

value:float64,这个叶节点的预测值,乘以学习率。

weight:float64 或 int64,hessian 的总和(目标的二阶导数),对落在该节点的观察求和。 这两个值是怎么计算出来的?

我们知道,在二进制 logloss 中:

  1. $H$ 不会是 $0$,因为在创建第一棵树之前我们有一个 base value,但是为什么在下面的示例中每个树的根节点中的权重是 $0$?
  2. 内部节点的value是如何计算的?
import lightgbm as lgb
import numpy as np
import pandas as pd
import sklearn

X, y = sklearn.datasets.load_breast_cancer(return_X_y=True)
model = lgb.LGBMClassifier(random_state=1, n_estimators=2,
                           max_depth=1,
                           min_child_weight=15,
                           objective='binary'
                          )
model.fit(X, y)
model.booster_.trees_to_dataframe()
tree_index node_depth node_index left_child right_child parent_index split_feature split_gain threshold decision_type missing_direction missing_type value weight count
0 0 1 0-S0 0-L0 0-L1 Column_23 392.505 868.2 <= left None 0.52115 0 569
1 0 2 0-L0 0-S0 nan nan 0.641339 89.2982 382
2 0 2 0-L1 0-S0 nan nan 0.275629 43.7141 187
3 1 1 1-S0 1-L0 1-L1 Column_7 327.362 0.05142 <= left None 0 0 569
4 1 2 1-L0 1-S0 nan nan 0.128938 79.2656 349
5 1 2 1-L1 1-S0 nan nan -0.19224 52.9234 220
lgb.create_tree_digraph(model, tree_index=0, show_info=['split_gain', 'internal_value', 'internal_count',
                                                        'internal_weight', 'leaf_count', 'leaf_weight', 'data_percentage'])

lgb.create_tree_digraph(model, tree_index=0, show_info=['split_gain', 'internal_value', 'internal_count',
                                                        'internal_weight', 'leaf_count', 'leaf_weight', 'data_percentage'])

【问题讨论】:

    标签: python machine-learning decision-tree lightgbm


    【解决方案1】:

    问个简单的问题:您是否从 scikitlearn 库中研究过普通的极端梯度树是如何工作的?

    您正在使用 LightGBM,这是一种非常出色但先进的算法。也许先了解一般概念、算法背后的数学、论文……然后你就可以自己回答了。

    文章参考Light GBM:

    https://papers.nips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf

    github中的repo代码,你需要的都可以去探索:

    https://github.com/microsoft/LightGBM

    还有文档:

    https://lightgbm.readthedocs.io/en/latest/

    【讨论】:

    • 这篇论文我其实已经看过了,只是对C/C++代码不熟悉。我想知道为什么根节点中的 hessian 和为 0,因为这个节点有所有的样本和 hessian 由 y(1-y) 计算的不为零,你能指出我应该注意哪一部分吗?
    • 首先,你应该看看你熟悉的这个。例如,如果你在 github 上再看一秒钟,你可能会得到:github.com/microsoft/LightGBM/tree/master/python-package/… max_depth = 1。这意味着树分裂了一次。之前和之后你计算H对吗?现在我的问题是,它始终为 0,还是仅针对这两列?如果它只是特别我会说是 0,因为那可能是 y=y_hat -> H=y*(y-y)=0,微不足道的情况。可能涉及一些四舍五入...等
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多