为了让阅读这篇文章的其他人了解这一点,这里有一个使用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 个或非常少的评估记录,这可能会让您相信较小的模型也可以表现得一样好,如果您的部署策略对模型大小敏感,这可能很重要。
或者,这种情况可能是您的数据出现漂移的迹象...如果大多数评估数据仅落入叶节点的一个子集,这可能表明您正在评分的数据来自来自与训练模型的数据不同的分布,这可能表明您将从新数据的重新训练中受益。