【问题标题】:Lightgbm: intent of returning leaf_indexLightgbm:返回leaf_index的意图
【发布时间】:2021-01-25 05:27:04
【问题描述】:

我是 lightgbm 的初学者。 Lightgbm 提供了一个输入参数 pred_leaf(默认为 false),当启用该参数时,它会返回训练期间构建的所有树的叶子索引。因此,对于具有 200 棵树的二元分类器,predict_proba 函数返回一个 200 * batch_size 长的索引数组。虽然它似乎确实提供了一些关于模型内部的信息,但我不确定这些信息有什么用?谁能建议一下,这些叶子索引如何有助于解释或调试模型?

参考:https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html#lightgbm.LGBMClassifier.predict_proba

谢谢

【问题讨论】:

    标签: lightgbm


    【解决方案1】:

    为了让阅读这篇文章的其他人了解这一点,这里有一个使用pred_leaf=True 的可重复的小示例。请注意,当您传递 pred_leaf=True 时,.predict() 和 .predict_proba() 的行为是相同的。

    import lightgbm as lgb
    from sklearn.datasets import load_breast_cancer
    
    X, y = load_breast_cancer(return_X_y=True)
    clf = lgb.LGBMClassifier()
    clf.fit(X, y)
    
    leaf_preds = clf.predict(X, pred_leaf=True)
    

    使用 leaf_preds[:,:5] 检查前 5 棵树会得到如下输出

    array([[ 4,  2,  9,  2,  3],
           [ 4, 11,  6,  9,  9],
           [ 4, 11, 13, 12, 16],
           ...,
           [ 4,  4,  6,  9,  9],
           [ 4, 11, 14, 14, 11],
           [ 6,  6,  8,  6,  7]], dtype=int32)
    

    如果您将训练数据传回 .predict(pred_leaf=True),此输出可以帮助您了解训练是否在流程后期开始达到树级停止标准。例如,如果您使用了num_leaves=50,但训练数据的pred_leaf 输出中一列的最大值为25,则表明某些迭代无法找到足够的信息分割。如果您愿意,也可以使用Booster.trees_to_dataframe() 获取此类信息。

    clf.booster_.trees_to_dataframe()
    

    如果您将一些评估数据(训练中未看到的数据)传递给predict(pref_leaf=True),它可以用于检测训练数据和评估数据之间可能很难看到的重要性差异。例如,如果您将predict(X_eval, pred_leaf=True) 与您认为具有代表性的评估数据一起使用,您可以计算出每个叶节点匹配的频率。如果某些叶节点匹配 0 个或非常少的评估记录,这可能会让您相信较小的模型也可以表现得一样好,如果您的部署策略对模型大小敏感,这可能很重要。

    或者,这种情况可能是您的数据出现漂移的迹象...如果大多数评估数据仅落入叶节点的一个子集,这可能表明您正在评分的数据来自来自与训练模型的数据不同的分布,这可能表明您将从新数据的重新训练中受益。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2011-07-14
      相关资源
      最近更新 更多