微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lightgbm:返回 Leaf_index 的意图

如何解决Lightgbm:返回 Leaf_index 的意图

我是 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

谢谢

解决方法

为了让阅读帖子的其他人更清楚这一点,这里有一个使用 pred_leaf=True 的可重现的小示例。请注意,当您传递 .predict() 时,.predict_proba()pred_leaf=True 的行为是相同的。

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,3],[ 4,11,6,9],13,12,16],...,4,14,11],[ 6,8,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 个或非常少的评估记录,这可能会让您相信较小的模型也能表现得同样好,如果您的部署策略对模型大小敏感,这可能很重要。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。