我是lightgbm的初学者。Lightgbm提供了一个输入参数pred_leaf (默认情况下为false),当启用该参数时,将返回在训练期间构建的所有树的叶子的索引。因此,对于具有200棵树的二进制分类器,predict_proba函数返回一个200 * batch_size长的索引数组。虽然它似乎提供了一些关于模型内部的信息,但我不确定这些信息是用来做什么的?有没有人能建议一下,这些叶索引对解释或调试模型有何帮助?
谢谢
发布于 2021-02-14 02:31:20
为了让其他阅读这篇文章的人明白这一点,这里有一个使用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个或非常少的评估记录,这可能会让您相信较小的模型也可以执行得很好,如果您的部署策略对模型大小敏感,这可能很重要。
或者,这种情况可能是data...if漂移的迹象大多数评估数据只落入叶节点的子集,这可能是一个迹象,表明您正在评分的数据来自不同于模型训练的数据的分布,这可能是一个迹象,表明您将从更新的数据上重新训练中受益。
https://stackoverflow.com/questions/65879414
复制相似问题