分子性质预测:机器学习回归算法详解(二)树模型与梯度提升
系列导航:
- 第一篇:基础回归模型 - 线性模型、支持向量机、近邻方法
- 第二篇:树模型与梯度提升(本文)- 决策树、随机森林、XGBoost/LightGBM等
- 第三篇:高级模型与应用指南 - 神经网络、概率模型、VAE、模型选择指南
导读
树模型和梯度提升是实战中最常用的回归方法,在Kaggle竞赛和工业界都有着广泛应用。本篇将详细介绍:
- 决策树与随机森林:从单棵树到集成学习
- 梯度提升家族:GradientBoosting、XGBoost、LightGBM、CatBoost等
- 模型对比:帮助你选择最合适的树模型
这些模型在分子性质预测、药物筛选等任务中表现优异,通常能达到最佳性能。
1. 决策树与随机森林
1.1 DecisionTreeRegressor(决策树回归器)
核心思想:通过一系列if-else规则递归划分特征空间。
sklearn实现:from sklearn.tree import DecisionTreeRegressor
分裂准则(回归): \(\text{MSE} = \frac{1}{N}\sum_{i=1}^{N}(y_i - \bar{y})^2\)
每次选择使得子节点MSE之和最小的特征和阈值进行分裂。
特点:
- ✅ 极高可解释性:决策路径清晰可视化
- ✅ 自动特征交互:无需手动构造交叉项
- ✅ 处理缺失值:部分实现支持
- ❌ 容易过拟合:需要剪枝或限制深度
- ⚙️ 关键参数:
max_depth:树的最大深度(防止过拟合)min_samples_split:分裂节点所需最小样本数min_samples_leaf:叶子节点最小样本数
- 📊 推荐场景:需要解释性的分子性质预测
1.2 RandomForestRegressor(随机森林回归器)
核心思想:训练多棵决策树,通过Bagging + 特征随机采样降低方差。
sklearn实现:from sklearn.ensemble import RandomForestRegressor
算法流程:
- Bootstrap采样:从训练集中有放回抽取 $N$ 个样本
- 特征随机:每次分裂只考虑随机选择的 $\sqrt{p}$ 个特征
- 独立训练每棵树
- 预测时取所有树的平均值
特点:
- ✅ 强大泛化能力:集成学习减少过拟合
- ✅ 特征重要性:可自动评估特征贡献度
- ✅ 鲁棒性强:对噪声和异常值不敏感
- ✅ 并行训练:各棵树独立,GPU加速友好
- ⚙️ 关键参数:
n_estimators:树的数量(通常100-500)max_features:分裂时考虑的特征数(默认 $\sqrt{p}$)max_depth:树的最大深度
📊 推荐场景:通用首选,平衡性能与速度的分子性质预测
1.3 ExtraTreesRegressor(极端随机树回归器)
与随机森林的区别:
- 不使用Bootstrap采样,使用全部训练数据
- 分裂阈值完全随机选择(而非最优阈值)
sklearn实现:from sklearn.ensemble import ExtraTreesRegressor
特点:
- ✅ 训练更快:省去阈值搜索步骤
- ✅ 更低方差:更强的随机性
- 📊 推荐场景:大规模分子数据集,追求训练速度
1.4 决策树与随机森林家族综合对比
| 模型 | sklearn实现 | 核心优势 | 局限性 | 计算复杂度 | 训练速度 | 推荐场景 |
|---|---|---|---|---|---|---|
| DecisionTreeRegressor | DecisionTreeRegressor |
极高可解释性,自动特征交互 | 容易过拟合 | $O(n \log n)$ | 快 | 需要解释性的回归任务 |
| RandomForestRegressor | RandomForestRegressor |
强大泛化,特征重要性,鲁棒 | 内存占用大 | $O(M \cdot n \log n)$ | 中 | 通用首选回归模型 |
| ExtraTreesRegressor | ExtraTreesRegressor |
训练快,方差低 | 随机性大 | $O(M \cdot n \log n)$ | 快 | 大规模数据,追求训练速度 |
对比要点:
- 训练速度:ExtraTrees > RandomForest > DecisionTree
- 预测速度:DecisionTree > RandomForest ≈ ExtraTrees
- 内存占用:DecisionTree < ExtraTrees < RandomForest
- 过拟合风险:DecisionTree > RandomForest ≈ ExtraTrees
2. 梯度提升家族
2.1 核心思想
梯度提升(Gradient Boosting)通过串行训练多个弱学习器,每个新模型专注于拟合前一个模型的残差(或梯度)。
2.2 GradientBoostingRegressor(标准梯度提升回归器)
sklearn实现:from sklearn.ensemble import GradientBoostingRegressor
算法流程:
- 初始化 $F_0(\mathbf{x}) = \bar{y}$
- 对 $m = 1, 2, \ldots, M$:
- 计算负梯度(伪残差):$r_{im} = -\frac{\partial L(y_i, F(\mathbf{x}_i))}{\partial F(\mathbf{x}_i)}$
- 训练决策树 $h_m$ 拟合 $r_{im}$
- 更新模型:$F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \nu \cdot h_m(\mathbf{x})$
其中 $\nu$ 是学习率。
特点:
- ✅ 高准确性:通常优于随机森林
- ✅ 灵活损失函数:支持多种回归任务
- ❌ 训练缓慢:串行训练无法并行
- ❌ 易过拟合:需要精细调参
- ⚙️ 关键参数:
learning_rate:学习率(0.01-0.3)n_estimators:迭代次数max_depth:树深度(通常3-8)
2.3 XGBoostRegressor(极端梯度提升回归器)
创新点:
- 二阶泰勒展开:使用一阶和二阶梯度信息
- 正则化:在目标函数中加入树复杂度惩罚
- 列采样:借鉴随机森林的特征采样
- 工程优化:并行化、缓存优化、GPU加速
sklearn实现:from xgboost import XGBRegressor
目标函数: \(\mathcal{L} = \sum_{i=1}^{n}l(y_i, \hat{y}_i) + \sum_{k=1}^{K}\Omega(f_k)\)
其中 $\Omega(f_k) = \gamma T + \frac{1}{2}\lambda|\mathbf{w}|^2$($T$ 为叶子节点数,$\mathbf{w}$ 为叶子权重)。
特点:
- ✅ Kaggle神器:竞赛中最常用模型之一
- ✅ 处理缺失值:自动学习缺失值的最优方向
- ✅ 速度快:高效工程实现
- ⚙️ 独特参数:
subsample:行采样比例colsample_bytree:列采样比例reg_alpha,reg_lambda:L1/L2正则化
📊 推荐场景:追求极致性能的分子性质预测
2.4 LGBMRegressor(轻量级梯度提升回归器)
创新点:
- GOSS(Gradient-based One-Side Sampling):保留大梯度样本,随机采样小梯度样本
- EFB(Exclusive Feature Bundling):互斥特征打包,减少特征维度
- Leaf-wise生长:按叶子节点最大增益生长(而非level-wise)
sklearn实现:from lightgbm import LGBMRegressor
特点:
- ✅ 训练极快:大数据集上比XGBoost快5-10倍
- ✅ 内存占用低:特征打包技术
- ✅ 高准确性:与XGBoost相当或更好
- ⚠️ 易过拟合:Leaf-wise策略在小数据集上需要谨慎
- ⚙️ 独特参数:
num_leaves:最大叶子节点数(核心参数)min_data_in_leaf:叶子最小样本数
📊 推荐场景:大规模分子数据库(>10万样本)
2.5 CatBoostRegressor(类别提升回归器)
创新点:
- Ordered Boosting:解决梯度估计偏差问题
- 原生支持类别特征:自动处理类别编码
- 对称树:减少预测时间
sklearn实现:from catboost import CatBoostRegressor
特点:
- ✅ 开箱即用:默认参数表现优异
- ✅ 鲁棒性强:对参数不敏感
- ✅ 处理类别特征:SMILES子结构等类别信息
- ❌ 训练稍慢:相比LightGBM
📊 推荐场景:混合特征(连续+类别)的分子数据
2.6 HistGradientBoostingRegressor(直方图梯度提升回归器)
sklearn实现:from sklearn.ensemble import HistGradientBoostingRegressor
特点:
- ✅ 原生支持缺失值:无需预处理
- ✅ 速度快:基于直方图的分裂
- ✅ 无需安装额外库:scikit-learn自带
- 📊 推荐场景:快速原型开发,不需要额外依赖的回归任务
2.7 AdaBoostRegressor(自适应提升回归器)
核心思想:每轮增加错误样本的权重,强迫后续模型关注难分样本。
sklearn实现:from sklearn.ensemble import AdaBoostRegressor
特点:
- ✅ 简单有效:历史悠久,理论成熟
- ❌ 对噪声敏感:异常值会被过度关注
- 📊 推荐场景:数据质量高的回归问题
2.8 梯度提升家族综合对比
| 模型 | sklearn实现 | 核心优势 | 训练方式 | 正则化 | 特征采样 | 适用数据规模 | 计算效率 | 推荐场景 |
|---|---|---|---|---|---|---|---|---|
| GradientBoostingRegressor | GradientBoostingRegressor |
理论成熟,灵活损失函数 | 串行 | 无 | ❌ | 小-中数据集 | 低 | 需要精细调参的回归 |
| XGBRegressor | XGBRegressor |
竞赛级性能,工程优化好 | 串行 | ✓ | ✓ | 中-大数据集 | 高 | 追求极致性能的回归 |
| LGBMRegressor | LGBMRegressor |
训练极快,内存效率高 | 串行 | ✓ | ✓ | 大-超大数据集 | 极高 | 大数据集回归首选 |
| CatBoostRegressor | CatBoostRegressor |
开箱即用,处理类别特征 | 串行 | ✓ | ❌ | 小-中数据集 | 中 | 混合特征的回归 |
| HistGradientBoostingRegressor | HistGradientBoostingRegressor |
原生支持缺失值,sklearn自带 | 串行 | ✓ | ✓ | 中-大数据集 | 高 | 快速原型开发 |
| AdaBoostRegressor | AdaBoostRegressor |
简单有效,历史悠久 | 串行 | ❌ | ❌ | 小数据集 | 低 | 数据质量高的回归 |
对比要点:
- 训练速度:LGBM > HistGB > XGB > CatBoost > GB > AdaBoost
- 内存效率:LGBM > HistGB > XGB > GB ≈ CatBoost > AdaBoost
- 大数据适应性:LGBM > XGB > HistGB > CatBoost > GB > AdaBoost
- 小数据表现:AdaBoost > CatBoost > GB > XGB ≈ HistGB > LGBM
- 类别特征处理:CatBoost > XGB ≈ LGBM > HistGB > GB > AdaBoost
3. 树模型实战建议
3.1 参数调优策略
随机森林调参顺序:
n_estimators:先设置一个足够大的值(如500)max_depth:从5开始逐步增加min_samples_split和min_samples_leaf:防止过拟合max_features:默认 $\sqrt{p}$ 通常已经很好
梯度提升调参顺序:
n_estimators和learning_rate:两者成反比,先固定一个max_depth:通常3-8之间- 正则化参数:
reg_alpha,reg_lambda(XGBoost/LightGBM) - 采样参数:
subsample,colsample_bytree
3.2 性能优化技巧
训练速度优化:
- 使用LightGBM替代XGBoost(大数据集)
- 减少
n_estimators,增加learning_rate - 限制
max_depth - 使用GPU版本(XGBoost/LightGBM)
内存优化:
- 减少
n_estimators(随机森林) - 使用
max_bins参数(LightGBM) - 特征选择,降维
过拟合防止:
- 增加
min_samples_leaf(随机森林) - 减小
learning_rate,增加n_estimators(梯度提升) - 使用正则化参数
- Early stopping(梯度提升)
本篇小结
第二篇介绍了实战中最常用的树模型和梯度提升方法:
✅ 决策树与随机森林:从单棵树的高可解释性,到随机森林的强大泛化能力,再到极端随机树的训练速度优势
✅ 梯度提升家族:从经典的GradientBoosting,到竞赛神器XGBoost,再到大数据杀手LightGBM,以及开箱即用的CatBoost
这些模型的共同特点:
- 准确性高:通常能达到最佳性能
- 特征工程简单:自动处理特征交互
- 鲁棒性强:对异常值和噪声不敏感
实战建议:
- 快速原型:RandomForest
- 追求极致性能:XGBoost或LightGBM
- 大数据集:LightGBM
- 类别特征多:CatBoost
- 需要解释性:DecisionTree或RandomForest(feature_importances_)
下一篇将介绍神经网络、概率模型、深度生成模型(VAE),以及完整的模型选择指南,帮助你在实际项目中做出最佳选择。
参考资料
- Scikit-learn Documentation: https://scikit-learn.org/
- XGBoost Documentation: https://xgboost.readthedocs.io/
- LightGBM Documentation: https://lightgbm.readthedocs.io/
- CatBoost Documentation: https://catboost.ai/docs/
- Breiman (2001). “Random Forests”
- Chen & Guestrin (2016). “XGBoost: A Scalable Tree Boosting System”
- Ke et al. (2017). “LightGBM: A Highly Efficient Gradient Boosting Decision Tree”