LightGBM分类
这个方法是做什么的
同样是梯度提升树,LightGBM 换了两处工程做法:一是把每个连续自变量先分箱成直方图,找切点时只在箱边界上比较,不再逐个候选值扫;二是叶子优先(leaf-wise)生长——不按层把整棵树铺平,而是每次挑当前增益最大的那一片叶子继续劈。前者让训练在大数据上快得多,后者让同样叶子数下的树更“深而窄”,拟合能力更强,也更容易在小样本上钻进噪声里。因变量是定类列,自变量可含定量与定类,定类列在管线内独热编码;报告不给系数,也不给任何自变量的 p 值。
报告共五张卡:卡① 建模设置与八项体检,卡② 分层 5 折交叉验证主结果与无信息率检验,卡③ 四张效果图,卡④ 效应量区间与置换重要性,卡⑤ 论文表述。本模块的卡① 会比同族多印一行“超参数·叶子数”,默认 31。要紧的是:这一行印的是你填的值,不是模型实际用到的值——LightGBM 内部还有一条“每片叶子至少 20 个样本”的下限,它没有做成控件,却在几百行的数据上先一步生效。演示数据里 200 棵树的实际叶子数最大只有 10 片、中位 7 片,31 这个上限从头到尾没碰到过(见下)。
需要准备什么数据
- 放入因变量Y:不限
- 放入自变量X:至少 1 个
数据要求
- 数据表至少 30 行。
- 单列缺失率不超过 20%。
- 不接受取值全都一样的列(零方差列没有可分析的变异)。
- 「放入因变量Y」的类别数需在 2~20 之间。
- 「放入因变量Y」的每一组至少 5 个样本。
以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。
什么时候用它
- 样本量大(上万行起)或自变量很多,别的提升树训练时间已经不可接受
- 自变量以连续数值为主,分箱后仍能保留有效的切分信息
- 类别边界复杂,需要模型自己找出多变量组合出来的条件
- 想在同一份数据上和「XGBoost分类」「GBDT梯度提升分类」互相对照,看结论是否稳健
前提:因变量是定类列,2~20 个类别、每类至少 5 例;整表至少 30 行,含缺失的整行剔除。本模块的数据要求里写着“LightGBM 采用叶子优先(leaf-wise)生长,小样本上极易过拟合;请配合限制叶子数/树深”——按这句去调叶子数之前,先读下面第一条:在小样本上,那个控件很可能根本没在起作用。
什么时候不要用它
- 因变量是连续数值:用「LightGBM回归」。
- 要能写进论文的效应量与 p 值:本模块只给预测指标与重要性排序;二分类结局用「逻辑回归」,结局有序用「有序逻辑回归」。
- 样本只有一两百行:直方图分箱与叶子优先生长的好处要样本量才体现,这种规模上装袋类方法更稳,用「随机森林分类」;只要一个可解释基线就用「逻辑回归」。
- 自变量里有高基数定类列(门店编号、商品 SKU):独热之后维度爆炸,卡① 表3 的“高基数定类特征”一项会报出来;出路是先合并类别,或改用能直接按类别分组的「CHAID决策树」。
- 观测之间不独立(同一台设备的多次记录、同一门店的多期数据):分层交叉验证只按类别分层、不按个体分组,同一个体会被拆到训练折与验证折两边,成绩虚高;有个体—时间结构用「面板模型」,分层嵌套用「混合模型」。
- 你要的只是“哪些变量与结局有关”的排序,不打算真的部署模型:建一个提升树模型是多余的,用「特征筛选」。
容易误读的地方
- “叶子数”这个控件在小样本上很可能完全没有效果,而卡① 照样把你填的数字印出来。 实测:演示数据(240 行、训练折约 192 行)上把叶子数从默认 31 改到 255,卡① 表1 老老实实印“超参数·叶子数 | 255”,但表4 的每一个数都和 31 时逐位相同(Accuracy 0.7500、折间标准差 0.0531、95%CI [0.6840, 0.8160]、Macro-F1 0.7487、κ 0.4995),200 棵树的实际叶子数最大仍是 10 片、均值 7.45。真正卡住的是没有暴露成控件的“每片叶子至少 20 个样本”。反过来把叶子数调到 4 就真的生效了:实际叶子数变成 4,Accuracy 升到 0.7667、κ 升到 0.5319。要压复杂度就得往下压过实际值,往上加是没有反应的。
- 调参没反应时,先确认它有没有被别的限制先卡住。 上一条不是个例,而是一类现象:卡① 的“超参数”几行是请求值的回显,不是生效值;模型内部的默认下限、样本量、每折训练集大小都可能让你改的那个数变成一个够不着的上限。判断办法只有一个——改完重跑,逐位对比表4:数字完全不动(包括折间标准差与 95%CI)就说明这次改动没有任何效果。
- “叶子优先”意味着树深不再是复杂度的好指标。 按层生长的树,深度 6 大致对应 2⁶ 片叶子;叶子优先只沿最有收益的方向劈,同样 6 层可能只有几片叶子,也可能沿一条路径一直深下去。所以卡① 的“最大深度 | 6”和“叶子数”不是两个独立的旋钮,它们与那条隐藏的叶子样本下限一起决定实际形状。判断模型有多复杂,看表4 的折间标准差比看这两个数字可靠。
- 本模块最容易被误读的一步是“它慢不慢”与“它准不准”被混为一谈。 卡① 的方法学说明写的是“训练速度快、内存占用较低,适合样本量较大或特征较多的分类场景”——这是关于成本的陈述。在几百行的数据上,速度优势体现不出来,精度也不会因为算法“更先进”而自动更高。要判断该用哪个算法,只能在同一份数据上各跑一遍,比表4 的交叉验证均值,并连折间标准差与 95%CI 一起看是否重叠。
- 表4 最右列比交叉验证均值高,不是好消息也不是坏消息。 本次留出测试集的 Accuracy 是 0.7917、Macro-F1 是 0.7917,都高于交叉验证的 0.7500 与 0.7487。那一列只有 48 例,一次划分的运气足以造成这个差距;表注写着“仅一次划分,波动大,列此仅作对照”。而且交叉验证是在全部 240 行上跑的,那 48 行照样落在各折的训练折里,两列不构成互相独立的两次验证。
报告里有什么
- 输出结果一:数据概览与前提检验
- 输出结果二:交叉验证性能主结果表
- 输出结果三:分类效果可视化
- 输出结果四:效应量与事后分析
- 输出结果五:结论与学术表述
卡③ 全部基于交叉验证折外预测绘制:混淆矩阵与曲线所用的预测都来自模型未见过该样本的那一折,不是训练集回代结果。