5.5 与随机森林、LightGBM、神经网络的对比


文档摘要

5.5 与随机森林、LightGBM、神经网络的对比 选型对比的正确姿势是同数据同折同指标实测加机理分析:随机森林稳、XGBoost 精、LightGBM 快、神经网络擅长非结构化。 本节做一次四模型同台实验,解释结果差异的机理,并把结论整理成场景对号表。 第 5 章四条岔路在此收束。学完 XGBoost 的最后一问是反身性的:什么时候不该用它?本节两个知识点:同台实验的正确姿势、四个模型差异的机理根源。 一、同台实验:同数据、同折、同指标 对比实验的最大陷阱是"各模型都用默认参数"——默认参数的强弱差异会污染算法差异。像样的做法:每个模型都做同等力度的粗调、同一交叉验证折、同一指标: 三个模型都做了同等粗调(树数 300–600、特征采样、学习率 0.06–0.

5.5 与随机森林、LightGBM、神经网络的对比

选型对比的正确姿势是同数据同折同指标实测加机理分析:随机森林稳、XGBoost 精、LightGBM 快、神经网络擅长非结构化。 本节做一次四模型同台实验,解释结果差异的机理,并把结论整理成场景对号表。

第 5 章四条岔路在此收束。学完 XGBoost 的最后一问是反身性的:什么时候不该用它?本节两个知识点:同台实验的正确姿势、四个模型差异的机理根源。

一、同台实验:同数据、同折、同指标

对比实验的最大陷阱是"各模型都用默认参数"——默认参数的强弱差异会污染算法差异。像样的做法:每个模型都做同等力度的粗调、同一交叉验证折、同一指标:

import numpy as np, time from sklearn.datasets import fetch_california_housing from sklearn.model_selection import KFold from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error import xgboost as xgb import lightgbm as lgb housing = fetch_california_housing() X, y = housing.data[:8000], housing.target[:8000] # 取子集控制时长 kf = KFold(n_splits=4, shuffle=True, random_state=0) def run(model_name, fit_predict): t0, scores = time.perf_counter(), [] for tr, va in kf.split(X): score = fit_predict(X[tr], y[tr], X[va], y[va]) scores.append(score) print(f"{model_name:12s} RMSE={np.mean(scores):.4f} ±{np.std(scores):.4f}" f" 总耗时={time.perf_counter()-t0:.1f}s") run("随机森林", lambda a,b,c,d: (lambda m: mean_squared_error(d, m.predict(c))**0.5)( RandomForestRegressor(n_estimators=300, max_features=0.5, n_jobs=4, random_state=0).fit(a, b))) run("XGBoost", lambda a,b,c,d: (lambda m: mean_squared_error(d, m.predict(c))**0.5)( xgb.XGBRegressor(n_estimators=600, max_depth=6, learning_rate=0.06, subsample=0.8, early_stopping_rounds=30).fit( a, b, eval_set=[(c, d)], verbose=False))) run("LightGBM", lambda a,b,c,d: mean_squared_error(d, lgb.LGBMRegressor( n_estimators=600, num_leaves=48, learning_rate=0.06, subsample=0.8, random_state=0).fit(a, b).predict(c))**0.5) # 运行输出(4 核参考环境): # 随机森林 RMSE=0.5884 ±0.0121 总耗时=6.9s # XGBoost RMSE=0.4637 ±0.0093 总耗时=9.4s # LightGBM RMSE=0.4602 ±0.0087 总耗时=3.1s

三个模型都做了同等粗调(树数 300–600、特征采样、学习率 0.06–0.1 量级),结论才有意义:两个提升框架明显优于随机森林(偏差压得更狠),LightGBM 与 XGBoost 精度相当但快三倍(直方图加叶子生长策略的工程优势)。

二、机理差异:结果从哪来

随机森林是 Bagging(第 1.2 节):深树并联取平均,主要压方差。它几乎不需要调参就有及格线以上的表现,但上限低于提升框架——平均结构对偏差无能为力。XGBoost 与 LightGBM 同属 Boosting,差异在工程:XGBoost 经典精确模式按层生长、预排序;LightGBM 按叶子生长(每次分增益最大的叶子,树形不规则)加直方图加速,快但小数据上偶有过拟合倾向。神经网络的比较维度完全不同:表格数据上树模型至今强势(分裂天然处理不规则边界与混合类型),但在图像、语音、长文本等空间或序列结构数据上,树模型无法利用局部相关性,神经网络一旦数据量足够就碾压。

维度 随机森林 XGBoost LightGBM 神经网络
结构 Bagging 并联 Boosting 串联 Boosting 串联 层间可微变换
调参负担 极低 高(含结构设计)
训练速度 很快 慢、依赖 GPU
表格数据上限 数据极大时高
非结构化数据
可解释工具 TreeSHAP 精确 TreeSHAP 事后近似方法

选型决策路径

选型:按数据形态与工程约束走分支

💡 关键直觉:四个模型不是四个等级,而是四套取舍。真实项目的常见路线是"随机森林当天出基线 → XGBoost 或 LightGBM 冲精度 → 数据或任务形态变了再考虑神经网络"。选型看数据形态、调参预算、延迟约束三件事,不看排行榜情怀。

本节要点回顾

  • 同折同指标同力度调参是对比实验的底线,默认参数对比只会测出默认值好坏
  • 实验结论:提升框架显著优于随机森林;LightGBM 与 XGBoost 精度相当、快三倍
  • 机理根源:Bagging 压方差上限低;直方图加叶子生长是 LightGBM 速度来源
  • 树模型的主场是表格数据;空间序列结构数据是神经网络主场
  • 实践路线:森林基线 → 提升冲精度 → 任务形态变化再换神经网络

高级主题收官。第 6 章进入行业现场,看这些武器在金融、推荐、内容场景的大尺度组合。

补一个小体量数据上的反向对照,避免"提升框架永远赢"的错觉:

from sklearn.datasets import load_digits from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score Xd, yd = load_digits(return_X_y=True) # 1797 条 8x8 手写数字 rf = RandomForestClassifier(n_estimators=300, random_state=0) xg = xgb.XGBClassifier(n_estimators=300, max_depth=6, learning_rate=0.1, eval_metric='mlogloss') print("随机森林:", cross_val_score(rf, Xd, yd, cv=5).mean().round(4)) print("XGBoost :", cross_val_score(xg, Xd, yd, cv=5).mean().round(4)) # 运行输出: # 随机森林: 0.9722 # XGBoost : 0.9711

千行级小数据上两者打平(森林甚至略胜)——提升框架的容量优势需要足够样本才能兑现,这正印证了选型路径图"小数据用森林起步"的第一分支。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U