LightGBM 根据列顺序给出不同的结果(指标)

数据挖掘 机器学习 分类 lightgbm
2021-09-25 04:23:18

我有两个几乎相同的数据集 A 和 B,它们仅在列排序方面有所不同。然后,我通过以下步骤在两个数据集上分别训练一个 LightGBM 模型:

  1. 将每个数据集划分为训练和测试(对 A 和 B 使用相同的随机种子和比率)
  2. 将超参数保留为几乎默认值
  3. 设置random_state为固定数字(用于复制)
  4. learning_rate使用网格搜索调整
  5. 在训练集上训练一个 LightGBM 模型并在测试集上对其进行测试
  6. 将选择在测试集上表现最好的学习率

基于这两个数据集的两个模型的输出有很大的不同,这让我觉得列的顺序会影响 LightGBM 模型的性能。

你知道为什么会这样吗?

4个回答

一个可能的解释是:

当列的顺序不同时,过程会略有不同。

LightGBM、XGBoost、CatBoost 等所做的是在训练的每一步中从数据集中的特征中选择不同的列。

这些列的选择是随机完成的:假设您的数据集有 20 列。根节点选择特征1st、3rd 和 18th,在两个数据集上,两个可能的数据集中的 1st、3rd 和 18th 特征是不同的。这是反复进行的,每一步都有随机性影响你的最终结果。

虽然数据的排序在理论上无关紧要,但在实践中却很重要。考虑到您已采取措施确保可重复性,不同的数据排序将改变您的训练-测试拆分逻辑(除非您确定两种情况下的训练集和测试集完全相同)。尽管您没有指定如何拆分数据,但很可能某种类型的数据点会使机器对异常值更加稳健,从而提供更好的模型性能。如果两种情况下的训练数据和测试数据相同,您可能必须查看是否有未采取的种子/可再现性度量(在代码的任何部分中)。

即使两个数据集本质上相同,控制随机种子也无助于生成相同的结果。我想这与 LightGBM 如何拆分树有关。随机种子仅确保对于每个拆分,它将始终从某些列索引中选择特征。从这个意义上说,即使两个数据集相同但列顺序不同,由于相同的列索引可以引用两个数据集之间的不同特征,因此对于两个数据集,在树的拆分处选择的特征可能是不同的(在 LightGBM 中) . 这将导致不同的结果。

希望以后这个问题可以在 LightGBM 中修复。

我可以确认训练集中的列排序顺序会影响 LightGBM 回归模型的指标......而且它不是一个有益的特性,因为将更重要的特性(按 SHAP 重要性排序)放在“顶部”(或者更确切地说放在左侧) of pandas DataFrame) 并没有从字母排序改进模型,实际上恰恰相反。我将尝试创建一个可重现的示例并在今晚晚些时候提交错误报告。