美食街上有一家老牌饭店——“XGBoost 大饭店”。它的主厨极其认真,每道菜下锅前都要把采购来的每一种食材逐一试味,精确记录咸淡生熟,再决定火候。菜品确实精致,可一到客流高峰,厨房就崩溃了:试味台上食材堆积如山,出菜越来越慢,客人纷纷摔筷子走人。此时,一位年轻主厨 LightGBM 应聘而来,他提出了一个反直觉的改造方案:不必每样都尝——食材按辣度分桶建档(直方图),只重点试吃最可能翻车的菜再随机抽几份好菜(GOSS),把从不一起出现的调料装进同一个抽屉(EFB),开分店只开最赚钱的那一家(Leaf-wise)。于是,同样一桌宴席,从 4 小时压缩到 40 分钟,客人打分却几乎不变。本篇文章就用这个厨房故事,把 LightGBM 的三大加速秘密一一拆开给你看。
学会 LightGBM 的 EFB/GOSS,你就能在工业级海量数据场景下,把动辄数小时的训练压缩到十几分钟——这是算法工程师面对大数据必备的提速技能。
目录
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
算法背景:被“逐盘试味”拖垮的老饭店
市井中有一家老字号 XGBoost 大饭店,主厨推崇“极致匠心”:每道菜下锅前,他要把每一样食材都切成薄片逐片试味,记录下最精确的咸度变化,再决定放多少盐、煮几分钟。菜品确实无可挑剔,可一到饭点客流过万,厨房就崩了——试味台前食材堆成小山,订单越积越多,客人等得摔筷子。老主厨陷入了“菜越精细,上菜越慢”的死循环。
一年前,店里来了位轻快的年轻主厨 LightGBM。他没有推翻老主厨的菜谱(boosting 框架还是那个 boosting 框架),却对“如何决定火候”这一环节做了彻底改造:不逐片试味,改为分桶判断口味;不检查所有菜,只重点尝最可能翻车的菜;不把每味调料都放一个罐子,互不冲突的装进同一抽屉;开分店也只开最赚的那家。这四个改动层层递进,把老主厨最耗时的“预排序扫描”环节彻底换血。
从数学上看,GBDT 系列模型就是多棵树的加权加法:
老主厨慢,慢在他把每棵树的训练都建立在“精确试味所有食材”上。年轻主厨提出了一个全新的问题:真的需要把每道菜都尝一遍才能知道火候吗?答案从直方图与抽样开始。
- 多树加和$\hat{y}_i$ 是第 i 个样本的最终预测,$f_t$ 是第 t 棵决策树,$\alpha_t$ 是它的权重。整体是用一堆“小专家”投票决定最终口味。
- 梯度即残差第 t 轮树的拟合目标是损失函数对当前预测的负梯度,直观上就是“还差多少没做对”。
- 梯度大即难菜某个样本的 $|g_i|$ 越大,说明模型越搞不定它,就像一道反复做砸、最需要返工的菜;这正是 GOSS 采样的入口信号。
直方图原理:给食材建“风味档案”
年轻主厨的第一招,是给每种食材建“风味档案”。比如辣椒,他不再一颗一颗地尝,而是按辣度把整筐辣椒分成六个桶:微辣、中辣、特辣、魔鬼辣……只记录每桶的平均属性。做菜时只要查档案,就知道该放哪一桶,连切都不用切。
这在机器学习里就是把连续特征离散化成“分箱”(bin)。XGBoost 的预排序要遍历每个样本的精确取值来寻找最优分割点;LightGBM 则先把特征值映射成有限个 bin,再在 bin 边界上搜索分裂点。分箱数由 max_bin 控制,默认 255,既保留判别力又大幅压缩计算量。对于缺失值和稀疏数据,直方图还能把零值单独归入一个 bin,避免无效计算。
更妙的是“直方图差减”:
分桶的做法让主厨从“逐片试味”变成“按档案取料”,速度瞬间上一个台阶。可是光有档案还不够——客人实在太多,每道菜都要核对档案也得花不少时间,于是年轻主厨又拿出了第二招:抽查。
- 直方图是什么每个节点对每个特征维护一张直方图,横轴是 bin,纵轴统计落入该 bin 的样本数和梯度之和。
- 差减原理左右子节点是父节点的一个划分,两者相加等于父节点,所以知道任意一边,另一边立即可得。
- 复杂度收益找分裂点的成本从“样本数 N”降到“分箱数 k”,k 通常只有 255 上下,是一个量级以上的节省。
GOSS采样:重点试吃,高效纠错
年轻主厨发现:并不是所有菜都需要细看。绝大多数菜出锅时火候刚好,真正需要返工重做的,往往只是一小部分。于是他定下规矩:所有可疑的菜一道不落全部试吃;完全正常的菜随机挑几份尝一口,确认整体风格没跑偏就行。
GOSS(Gradient-based One-Side Sampling,基于梯度的单边采样)就是这个思路:按梯度绝对值排序,前 a% 的大梯度样本全部进子集 A;剩下的小梯度样本中随机抽 b% 进子集 B。这样每轮参与计算的样本数降到原来的 a + b(1-a),按默认 a=0.2、b=0.1 计算,只需 28% 的样本。
但这里有个关键:B 只是小梯度样本的一个随机子集,直接丢弃会让“小梯度群体的总贡献”被低估。所以计算分裂增益时要乘以放大因子 (1-a)/b:
主厨只尝了大约三分之一的菜,却对整桌菜的火候把握得八九不离十,省下的是七成的时间。不过,这还只是“少尝几口”,接下来这一招更狠:连调料罐都给你省掉一半。
- 集合记号A 是前 a% 大梯度样本,B 是小梯度样本中随机抽出的部分;$A_l$、$B_l$ 表示在某个分裂点下被划入左子节点的部分。
- 分子加权梯度之和左子节点的“总修正信号”由 A_l 的真实梯度与 B_l 放大后的梯度组成。
- 分母子节点样本数$n_l^j(d)$ 是划到左子节点的样本数,让增益与样本规模解耦,公平比较不同分裂点。
- 整体取平均把左右子节点两部分相加再除以总样本数 n,得到该特征在分割点 d 上的分裂增益估计。
EFB捆绑:互斥调料共用抽屉
后厨的调料架上摆着上百个罐子:豆瓣酱、甜面酱、陈醋、绵白糖……主厨注意到一个规律:有些调料永远不在一道菜里同时出现。比如“魔鬼辣粉”绝不会出现在“蜂蜜柠檬茶”里,两者各自的菜谱互不相交。于是他把这些互斥调料装进同一个抽屉,写清每格放什么;找调料时,只翻一个抽屉就能拿到,还不会拿错。
在真实数据里,这种“互斥”最典型的例子就是 one-hot 编码。一个样本只有一维是 1,其余都是 0,那么任意两个 one-hot 维度的“同时非零率”几乎是 0——它们天然互斥。EFB(Exclusive Feature Bundling,互斥特征捆绑)把这类互斥特征合并成一个新特征,让特征维度从 D 降到 D'。分组用的是贪心图着色算法:构造特征冲突图,每次取度数最小的特征,尝试放进已有 bundle,冲突率超阈值就开新组。
判断两个特征能否捆绑,要看冲突率:
上百个调料罐变成三四十个抽屉,找料、取料都快了一倍。EFB 在广告、推荐这类高维稀疏场景里尤其奏效。但别急,还有最后一招——决定“每棵树怎么长”,年轻主厨的生意经才刚刚开始。
- 指示函数$\mathbb{1}[\cdot]$ 是“条件成立记 1,不成立记 0”的计数器。
- 统计同时非零对 n 个样本逐一检查两个特征是否同时非零,加起来就是冲突样本数。
- 归一化为比例除以 n 得到冲突率,$\gamma$ 接近 0 说明几乎互斥,可以捆绑;超过阈值就要拆开。
Leaf-wise生长:只开最赚钱的分店
老主厨曾经做过连锁扩张:每开一层楼,必定把同一层的所有铺位全租下来,整整齐齐。这样楼层规划很美观,可有些铺位注定冷清,装修钱全打了水漂——这就是 Level-wise 逐层生长。年轻主厨则完全不同:先看财报,哪家店预估利润最高就开哪家,第二家、第三家不一定在同一层。
Leaf-wise 策略指的是:每轮分裂时,遍历当前所有叶子,选择“分裂增益最大”的那个叶子执行分裂,而不是等一层长齐再长下一层。因为高增益叶子总是被优先分裂,在同样的叶子数量下,Leaf-wise 树的训练误差通常更低、收敛更快。代价是树形极不均衡,某些路径可能长得特别深,这正是过拟合的温床。
分裂增益的度量可以用牛顿步近似:
但精明的扩张也有代价:只开赚钱店,容易把某些店开到极深、极偏,在小数据上很快过拟合。所以主厨还得给自己带上“刹车片”——这正是参数调优的用武之地。先算清三大招的收益账,再谈旋钮怎么拧。
- 符号总览G 是该叶子上所有样本的梯度之和,H 是二阶梯度(Hessian)之和,λ 是 L2 正则系数。
- 左孩子收益分裂后左子节点带来的目标函数改进量。
- 右孩子减父节点加上右孩子项,再减去父节点自身的项,得到“这次分裂净赚多少”。
- 贪心选择遍历所有叶子,谁的 Δ 最大就分裂谁,这就是 Leaf-wise 的“只开最赚钱的分店”。
核心优势:同样美味,更快上桌
三招齐出,后厨焕然一新。我们来算一笔账:直方图让“找分裂点”的成本从每特征每节点扫 N 个样本,降到扫 255 个 bin;EFB 让特征数从 D 降到 D';GOSS 让每轮参与样本从 n 降到 0.28n。三者相乘,训练时间通常能省一个数量级。
对存量模型,LightGBM 的收益更直观:在相同迭代轮数下,训练时间约为 XGBoost 的 1/5 到 1/10,内存占用同样大幅下降——直方图只需要存 bin 统计量,而不是预排序的索引矩阵。这两点直接决定了它敢不敢在几亿条日志上做小时级重训,也是它成为 Kaggle 与工业界主流算法的根本原因。
很多人担心“抽样+分箱会伤精度”,GOSS 的数学保证恰恰回应了这个顾虑:放大校正使梯度总和期望不变,增益估计无偏。每轮参与样本数为:
新老主厨同台竞技:同一批客流(数据集),老主厨 4 小时出齐一桌菜,新主厨 40 分钟上完,客人打分(准确率)还基本一样。这就是 LightGBM 能在大数据时代站稳脚跟的根本原因。至于这 40 分钟里怎么避免个别菜翻车,就看下面这排“旋钮”了。
- 大梯度部分前 a 比例的“难样本”全部保留,信息量最密。
- 小梯度抽样部分剩余 1-a 比例中再抽 b,样本量是 n 乘以 b(1-a)。
- 代入默认值0.2 + 0.8 × 0.1 = 0.28,即每轮只算 28% 的样本。
参数调优:主厨的操作旋钮
一台精密的厨房设备,通常配有一排旋钮:火力旋钮、切配速度旋钮、调味灵敏度旋钮。主厨若把它们一股脑拧到最大,厨房轻则菜品报废,重则电路跳闸。LightGBM 的参数也是如此,每个旋钮都对应一种速度与风险的权衡。
最核心的锅是 num_leaves——Leaf-wise 树的叶子数上限,直接决定模型容量。它的极限受树的深度约束:一棵深度为 D 的树,叶子数不可能超过满二叉树的叶子数。所以实践中有个经典搭配:
其他旋钮一览:min_data_in_leaf 保证每个叶子至少装下多少样本,是 Leaf-wise 的“最小开店面积”;feature_fraction 和 bagging_fraction 让每棵树只用部分特征/部分样本,类似“轮换食材供应商”;lambda_l1/l2 是“少放油”的正则;GOSS 模式下 top_rate 和 other_rate 控制试吃比例(默认 0.2 / 0.1);EFB 默认开启,若有特殊需求可以用 enable_bundle 关掉。
年轻主厨在厨房墙上贴了一句话:“三分快,七分稳。” 直方图、GOSS、EFB 要的是快,num_leaves、max_depth、min_data_in_leaf 要的是稳。理解每个旋钮背后的物理意义,你就能在速度和精度之间找到属于自己的黄金曲线。
- 满二叉树叶子上界深度 d 的满二叉树恰好有 $2^{d-1}$ 个叶子,这是任何树形都打不破的上限。
- Leaf-wise 特殊性它生长极不均衡,可能某条路径深度远超其他叶子,必须用 max_depth 管住“深度”这个维度。
- 经验配置顺序先按数据量定 num_leaves,再定 max_depth,最后用 min_data_in_leaf 兜底。
AI 应用场景
场景一:广告点击率预估(CTR)
阶段:特征工程 + 模型训练
解决的问题:广告特征经过 one-hot 后常高达上千万维且极端稀疏,XGBoost 预排序每轮扫描全量数据,训练动辄数小时。LightGBM 的 EFB 把互斥的稀疏特征捆绑起来,直方图把扫描成本从样本数降到 bin 数,GOSS 再筛掉约 70% 冗余样本,训练时间缩短一个量级且精度不降。
具体案例:某电商广告平台有 5 亿样本、8 千万维稀疏特征,原先 XGBoost 训练需 12 小时;改用 LightGBM 开启 GOSS + EFB 后 40 分钟完成,线上 CTR 提升 0.3%,节省的算力还支撑起小时级滚动刷新模型。
场景二:金融风控反欺诈
阶段:数据采样 + 模型训练
解决的问题:欺诈样本极端稀少(约 0.1%),常规随机采样会丢关键信息,不采样则训练极慢。GOSS 天然把“难分样本”(欺诈与正常边界)保留下来,相当于自适应聚焦困难样本;EFB 则高效处理大量维度稀疏的身份、渠道离散特征,让风控模型能够快速迭代上线。
具体案例:某银行反欺诈团队用 2 千万交易样本训练 LightGBM 二分类,将 boosting_type 设为 'goss' 后训练时间从 3 小时降到 25 分钟,AUC 保持 0.94 不变,每日可重训两次,及时捕捉新出现的欺诈模式。
场景三:推荐系统精排模型
阶段:模型训练迭代
解决的问题:精排模型需要融合用户、物品、上下文上百个特征,并且每天都要重训。Leaf-wise 让模型在给定叶子预算下用更少迭代达到目标精度,配合直方图把一天的日志在十几分钟内训完,支撑早晚两次模型更新,让推荐结果始终跟得上用户兴趣变化。
具体案例:某短视频 App 精排模型使用 LightGBM + EFB 处理 high-cardinality 类别特征,num_leaves=255、max_depth=-1、min_data_in_leaf=100,训练时间仅为 XGBoost 的 1/8,离线 AUC 提升 0.5%。
Python 演示
import lightgbm as lgbfrom sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score X, y = make_classification(n_samples=20000, n_features=50, n_informative=25, random_state=42)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) params = { 'objective': 'binary', 'boosting_type': 'goss', # GOSS: 只尝难菜与随机好菜 'top_rate': 0.2, # 大梯度样本保留比例 'other_rate': 0.1, # 小梯度样本抽样比例 'num_leaves': 63, # Leaf-wise 叶子上限 'max_depth': 7, # 防止单支过深 'min_data_in_leaf': 20, # 叶子最少样本数 'learning_rate': 0.05, 'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 1, 'lambda_l1': 0.1, 'lambda_l2': 1.0, 'verbose': -1,} d_train = lgb.Dataset(X_train, label=y_train)d_valid = lgb.Dataset(X_test, label=y_test, reference=d_train) model = lgb.train( params, d_train, num_boost_round=300, valid_sets=[d_valid], callbacks=[lgb.early_stopping(50)]) y_pred = (model.predict(X_test, num_iteration=model.best_iteration) > 0.5).astype(int)print('准确率:', accuracy_score(y_test, y_pred))
'boosting_type': 'goss',开启 GOSS 采样模式,训练时按梯度挑出约 28% 的样本参与分裂计算,等价于主厨“只尝难菜+随机好菜”。'top_rate': 0.2,决定前 20% 的大梯度样本全部保留,它们承载了最主要的回归信号。'other_rate': 0.1,剩余 80% 小梯度样本中随机抽 10%,并乘以 (1-0.2)/0.1=8 倍放大参与增益计算。'num_leaves': 63,Leaf-wise 每棵树的叶子数上限,63 约等于 2^6-1,在容量和速度之间取平衡。'max_depth': 7,限制叶子路径的最大深度,防止 Leaf-wise 长出“一枝独秀”的过深分支。'min_data_in_leaf': 20,每个叶子至少 20 个样本,减小噪声分裂带来的过拟合。callbacks=[lgb.early_stopping(50)]验证集 50 轮不提升就停,像主厨尝到味道稳定就关火。
常见误区
误区EFB 不就是把所有稀疏特征合并成一个特征吗?我直接把 10 个 one-hot 列加起来当一列用,效果应该也差不多吧?
正解EFB 不是简单求和。它先对特征两两计算“同时非零率”(冲突率),只有冲突率低于阈值(默认 0.1)的互斥特征才能安全捆绑。捆绑时还会给不同特征的取值加偏移量(如特征 A 取 0/1,特征 B 取 2/3),保证分裂时能还原。直接把经常同时非零的稠密特征相加,会毁掉分裂信息,等于把酱油和醋倒进一个瓶子里。经验丰富的主厨会把“辣”和“甜”分开存放,而不会把保鲜期相互冲突的食材硬凑进一个抽屉。
为何常见:one-hot 特征天然互斥,初学者容易把“稀疏”直接等价于“可捆绑”,忽略了对一般连续特征冲突率的检查。
误区GOSS 只保留大梯度样本和一小部分随机小梯度样本,丢掉 70% 的数据,模型精度肯定不如全量训练吧?
正解GOSS 的关键在于对小梯度样本乘以 (1-a)/b 的放大系数,这让小梯度样本的贡献期望不变,方差只是略增。大梯度样本是“难学”样本,承载了大部分训练信号,全部保留;随机抽样的小梯度样本负责维持分布,所以增益估计仍然无偏。实验表明在相同迭代次数下 GOSS 精度与全采样相当甚至略优,训练时间却大幅缩短。好比主厨只尝最可能出问题的菜和随机几道好菜,就能准确判断整桌菜的火候——他不是“省了 70% 试味就丢了 70% 信息”,而是把力气花在了刀刃上。
为何常见:直觉上“多数据等于好模型”,忽略了样本之间存在巨大的信息量差异;且放大系数的统计学意义(无偏估计)不太直观。
误区论文说 Leaf-wise 比 Level-wise 收敛更快,那我直接把 num_leaves 设成 1000,模型容量越大,效果应该越好吧?
正解Leaf-wise 每次只分裂增益最大的叶子,树形不均衡、深度不受层限制;当数据量小或噪声大时,它会在个别叶子上很快过拟合。实践中必须用 max_depth、min_data_in_leaf、feature_fraction 等参数“踩刹车”。num_leaves 不是越大越好,它代表模型容量,越大就越需要更强的正则和更多的数据。就像开分店,盲目多开几家“最赚钱”的分店,反而可能把单店服务做差,顾客(测试集)并不买账。
为何常见:人们容易记住“Leaf-wise 更优”的结论,却忽略其代价;同时存在“参数越大能力越强”的线性外推思维。
误区分箱越细越接近原始连续值,信息损失越小,所以 max_bin 调得越大越好。
正解max_bin 太大会让直方图退化成近似预排序,丢失 LightGBM 的加速和内存优势;分箱过细带来的噪声还会加剧过拟合。LightGBM 默认 255 是速度和精度的良好平衡。若对精度要求高,可结合小学习率和更多轮数;若内存吃紧,可降到 63 甚至 31。分桶就像把食材按“微辣/中辣/特辣”归档:太粗做不出层次,太细则失去档案管理的意义。
为何常见:很多人混淆“信息无损”与“有效信息量”,没意识到连续值本身的噪声,以及小粒度分箱带来的收益边际递减。
面试题
Q1. GOSS 的英文全称是什么?
- A.Gradient-based One-Side Sampling← 正确答案
- B.Gradient-based One-Side Storage
- C.Gradient-based One-Side Selection
- D.Gradient-based One-Side Splitting
答案:A。GOSS 是 Gradient-based One-Side Sampling(基于梯度的单边采样),核心是只从“大梯度一边”全保留、另一边随机抽样的非对称策略。B 把采样换成存储,混淆了目标;C 和 D 分别描述的是样本选择或分裂动作,都不符合原始术语。
Q2. 在 LightGBM 中,GOSS 对大梯度样本的处理方式是?
- A.全部保留参与分裂← 正确答案
- B.全部丢弃减少噪声
- C.随机抽取部分保留
- D.与随机森林完全相同
答案:A。GOSS 把样本按梯度绝对值排序后,前 a%(默认 20%)的大梯度样本全部保留,因为它们对分裂增益贡献最大;小梯度样本只随机抽 b%。B 颠倒了策略,C 是大梯度以外的处理方式,D 混淆了不同模型的样本处理逻辑。
Q3. EFB 中两个特征可以安全捆绑的条件是?
- A.两者同时非零的样本占比极低← 正确答案
- B.两者在所有样本上都为零
- C.两者值域范围完全相同
- D.两者与标签的相关性相同
答案:A。捆绑的前提是互斥性:冲突率(同时非零比例)低于阈值(默认 0.1)。one-hot 特征就是典型例子。B 说明两特征毫无信息,捆绑没有意义;C 值域相同反而容易在合并后混淆取值;D 相关性一致与互斥性无关。
Q4. 下列关于 Leaf-wise 生长的说法,正确的是?
- A.每次分裂增益最大的叶子← 正确答案
- B.每层必须全部分裂完成
- C.生成的树一定是满二叉树
- D.完全等价于深度优先搜索
答案:A。Leaf-wise 每步从所有候选叶子中挑分裂收益最大的一个,树形不均衡但更高效。B 描述的是 Level-wise 逐层生长;C 相反,Leaf-wise 常生成长短不一的树;D 不准确,它是按增益贪心选叶子,不是简单的深度优先搜索。
Q5. 直方图算法加速分裂点搜索的关键是?
- A.把连续特征离散为有限 bin← 正确答案
- B.无条件丢弃一半训练样本
- C.将所有特征等权重相加
- D.把标签从二分类变成多分类
答案:A。直方图将连续特征值映射到 k 个桶,分裂点只需在 bin 边界搜索,复杂度从 O(样本数) 降到 O(bin 数)。B 是 GOSS 的抽样思路而非直方图;C、D 与分裂机制无关。
Q6. 关于 GOSS 中的放大系数 (1-a)/b,以下说法正确的是?
- A.乘在随机抽样的小梯度样本上← 正确答案
- B.目的是保持梯度和的期望不变← 正确答案
- C.放大系数值一定小于 1
- D.用它替代所有样本的梯度
答案:AB。GOSS 对小梯度样本的梯度乘 (1-a)/b 放大后再求和,使总梯度的期望与全量数据一致,从而增益估计无偏。系数由 a、b 决定,b 较小时系数大于 1,故 C 错;D 不是“替代”,而是对抽中子集做加权校正。
Q7. 设 n=1000,a=0.2,b=0.1,GOSS 每轮实际用于分裂估计的样本数约为?
- A.大梯度 200 加小梯度 80,共 280← 正确答案
- B.大梯度 800 加小梯度 100,共 900
- C.大梯度 200 加小梯度 200,共 400
- D.大梯度 100 加小梯度 800,共 900
答案:A。大梯度样本保留 20% × 1000 = 200;剩余 80% 的小梯度样本中随机抽 10%,即 0.1 × 800 = 80。总计 280,约占全量 28%,训练成本大幅下降。B、C、D 的抽样比例或基数计算均有误。
Q8. 为什么 EFB 对 one-hot 编码的高维稀疏特征特别有效?
- A.one-hot 特征天然互斥,可安全捆绑← 正确答案
- B.one-hot 特征之间相关性为正
- C.one-hot 特征是连续稠密特征
- D.one-hot 特征没有任何梯度信息
答案:A。one-hot 编码下每个样本只有一维为 1,其余维为 0,任意两维几乎不会同时非零,冲突率接近 0,天然满足 EFB 的互斥条件。B 相关性为正反而危险;C 正好说反;D 错误,每个特征在各自非零的样本上都有梯度贡献。
Q9. 以下哪些是 LightGBM 相对传统 GBDT 的主要加速手段?
- A.直方图分箱代替预排序← 正确答案
- B.GOSS 单边梯度采样← 正确答案
- C.EFB 互斥特征捆绑← 正确答案
- D.全量数据逐样本扫描
答案:ABC。直方图降低分裂点搜索成本,GOSS 减少每轮参与样本数,EFB 降低特征维度,三者共同构成 LightGBM 的加速“三件套”。D 是 XGBoost 预排序的做法,恰是 LightGBM 要避免的。
Q10. 使用 Leaf-wise 生长时需要采取的防过拟合措施包括?
- A.设置 max_depth 限制单支深度← 正确答案
- B.调大 min_data_in_leaf 约束叶样本数← 正确答案
- C.适当调小 num_leaves 控制模型容量← 正确答案
- D.关闭所有正则化让模型自由生长
答案:ABC。Leaf-wise 树形不均衡,易在个别叶子上过深。max_depth 限制深度、min_data_in_leaf 保证每个叶子有足够样本、num_leaves 控制叶子总数,三者都是有效刹车。D 方向相反,面对大容量模型时应加强正则化而非关闭。