装袋法Bagging详解:从偏差方差分解到Python实现与调参
1. 装袋法到底是什么一次讲透它的来龙去脉1.1 从三个臭皮匠聊到集成学习先直接说结论装袋法Bagging是机器学习里集成学习家族最基础、最实用的一支全称叫 Bootstrap Aggregating翻译过来就是自助采样聚合。这个名称虽然听起来有点学术但拆开看就两个字——采样和投票。它的思想朴素得惊人既然一个模型容易犯错那我就多训练几个模型让它们各自做判断最后大家一起投票决定最终答案。这跟现实里三个臭皮匠顶个诸葛亮是同一个道理只不过机器学习把它变成了严密的数学流程。我在实际项目中用装袋法的次数非常多尤其是处理表格型数据、高方差模型、样本量不大不小的场景时它几乎是默认的起手式。很多人分不清装袋法和其他集成方法比如Boosting、Stacking的区别这里先给个最直观的比较装袋法训练多个基础模型是并行的彼此独立最后做平均或投票Boosting是串行的每个模型都试图纠正前面模型的错误Stacking则是用另一个模型来学习如何组合这些模型的输出。理解了这个区别后面讲原理时你会顺很多。这篇文章适合谁看如果你是机器学习初学者正好学到集成学习这一章读完之后你能彻底搞懂装袋法的原理、推导、代码实现和调参技巧如果你已经有实战经验这篇文章里关于OOB评估、特征重要性、偏差-方差分解的细节可能会帮你补上一些平时容易忽略的盲区。1.2 装袋法在机器学习全家桶里的准确位置机器学习的算法家族里监督学习有线性回归、逻辑回归、决策树、SVM、神经网络等基础模型。这些模型各有各的毛病决策树容易过拟合SVM对参数敏感线性模型又太简单、拟合不了复杂关系。集成学习就是来解决这些毛病的——把多个不太完美的模型组合起来得到一个更不完美但整体很强的模型。集成学习往下细分Bagging装袋法并行训练降低方差代表算法是随机森林。Boosting提升法串行训练降低偏差代表算法是AdaBoost、GBDT、XGBoost。Stacking堆叠法用元模型组合多个基础模型的输出。装袋法最核心的贡献不在于它能让你拿到某个竞赛冠军而在于它极其稳定。它不会像Boosting那样对异常值敏感也不会像Stacking那样需要小心翼翼地做交叉验证防泄漏。它就像一个稳重的老员工可能不是最聪明的但可靠、不犯错用起来很安心。另外搜索结果里那些高频热搜词——机器学习期末复习机器学习知识总结机器学习算法机器学习基础——正好说明装袋法是考试和面试的常客。无论你是为了应对期末考试还是准备算法岗面试装袋法的原理、推导、优缺点都必须滚瓜烂熟。这篇文章也会特意兼顾这两个场景。2. 装袋法的核心原理偏差-方差分解与Bootstrap采样2.1 为什么装袋法能降低方差偏差-方差分解是理解一切的钥匙学装袋法的人容易卡在一个问题上为什么对多个模型的结果做平均效果就会变好答案藏在统计学习理论里的偏差-方差分解Bias-Variance Decomposition中。先理想化地推导一下。假设我们有 $N$ 个独立同分布的基础模型每个模型的预测误差方差都是 $\sigma^2$。如果我们把这 $N$ 个模型的结果取平均那么平均结果的方差是$$Var\left(\frac{1}{N}\sum_{i1}^{N} f_i(x)\right) \frac{1}{N^2}\sum_{i1}^{N} Var(f_i(x)) \frac{\sigma^2}{N}$$也就是说模型越多平均结果的方差越小。这是装袋法有效的最理想化证明。但现实世界里有一个致命的bug你训练出的N个模型根本不独立因为它们是用同一份训练数据训练出来的数据相似性导致模型之间高度相关。如果模型之间相关系数为 $\rho$方差的表达式会变成$$Var\left(\frac{1}{N}\sum_{i1}^{N} f_i(x)\right) \rho\sigma^2 \frac{1-\rho}{N}\sigma^2$$看这个公式就能明白如果 $\rho1$所有模型完全一样那再怎么平均也没用方差还是 $\sigma^2$。如果 $\rho0$模型完全独立方差就是 $\sigma^2/N$效果最好。真实情况介于两者之间——所以装袋法要做的核心事情就变成了如何让训练出的N个模型尽可能不一样答案就是Bootstrap自助采样。2.2 Bootstrap自助采样到底做了什么Bootstrap是统计学家Efron在1979年提出的重采样技术后来被Breiman在1994年引入机器学习和决策树结合成了Bagging。它的做法简单粗暴给定一份包含 $m$ 个样本的训练集每次有放回地随机抽取一个样本重复 $m$ 次得到一份同样大小$m$ 条样本的新训练集。关键点是有放回。一次抽样中某个样本被抽中的概率是 $1/m$没被抽中的概率是 $1 - 1/m$。抽 $m$ 次都没被抽中的概率是$$\left(1 - \frac{1}{m}\right)^m$$当 $m$ 足够大时这个值趋近于 $e^{-1} \approx 0.368$。也就是说每一份自助采样得到的训练集里大约会有36.8% 的原始样本没有出现剩下的 63.2% 会重复出现。这些没被抽中的样本被称为袋外数据Out-of-Bag简称OOB它们天生就是最合适的验证集。这个设计精妙在哪里我用一个生活里的例子给你说透。假设你是一个美食博主要评定一家餐厅的水平。你不能只吃一次就下结论单模型不可靠也不能把整本菜单全点一遍过拟合食材和做法细节。你每次随机点几个菜自助采样多来几次每次点到的菜都不一样最后综合判断。而那些你从没点过的菜OOB样本恰好可以用来检验你试吃得出的结论是否可靠。从另一个角度看Bootstrap采样相当于人为地给每个训练集加了一点扰动让每棵决策树看到的训练数据略有差异。数据稍有不同决策树的分裂点就可能完全不同——尤其是对高方差模型来说数据一点细微的变化就可能导致结构剧变。正是这份数据多样性让模型之间的相关性 $\rho$ 降了下来方差削减公式才能起效。2.3 装袋法流程的每一步拆解把装袋法的完整流程写下来你会发现它出奇地简单确定基础学习器通常是决策树但也可以换成KNN、神经网络、SVM等任意模型。从实践角度看装袋法对高方差、低偏差的模型增益最大对低方差的模型比如线性回归、KNN的小K值增益很小。生成T份自助采样集从原始训练集 $D$ 中做 $T$ 次有放回抽样每次抽 $m$ 个样本得到 $D_1, D_2, ..., D_T$。每份采样集彼此独立。并行训练T个基础模型在 $D_t$ 上训练一个基础学习器 $h_t(x)$。这些模型可以完全并行训练这是装袋法最大的工程优势。聚合预测结果分类任务用多数投票每个模型投一票票数多的类别获胜回归任务用简单平均所有模型预测结果取均值。这里面有个常被忽略的细节投票时如果出现平票怎么办多数实现会随机选择一个类别或者用类别标签排序优先级来打破平局。实际工程中平票情况不多但在类别数少比如二分类、模型数偶数时可能出现。建议你把基础模型的数量设成奇数这是最省事的规避方式。2.4 偏差-方差视角下的一个常见误区很多人把装袋法的表述背得很熟一开口就是装袋法降低方差但问他为什么它不降低偏差他就卡壳了。这里讲清楚偏差Bias衡量的是模型本身的表达能力够不够方差Variance衡量的是模型对训练数据变化的敏感度。装袋法通过平均多个模型的预测来平滑掉某一个模型因训练集波动而产生的偶然误差但它无法改变基础模型本身的表达能力上限。举个例子如果你的基础模型是线性回归低方差、高偏差用装袋法把100个线性回归模型平均一下得到的还是线性模型表达能力的天花板没变。反之如果基础模型是深决策树高方差、低偏差它能拟合非常复杂的关系装袋法正好抑制它的过拟合倾向两者是一对理想组合。这直接引出一个实战选型原则装袋法应该搭配高方差模型使用。如果你手里只有逻辑回归或线性SVM第一反应不该是装袋而是先考虑特征工程或者换更强的模型。决策树之所以成为装袋法的默认搭档就是因为它天生具有高方差、低偏差的特性。3. 从零实现装袋法代码与关键细节3.1 先用scikit-learn跑通整个流程理论讲再多不如跑通一段代码。下面我用scikit-learn给你演示一个最标准的装袋法分类流程数据集用手写数字识别Digits基础模型用决策树桩深度很小的决策树刻意制造弱学习器更能体现装袋法的提升效果。import numpy as np from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import BaggingClassifier from sklearn.metrics import accuracy_score # 加载数据集 digits load_digits() X, y digits.data, digits.target # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 先看单个决策树的表现 single_tree DecisionTreeClassifier(max_depth3, random_state42) single_tree.fit(X_train, y_train) y_pred_single single_tree.predict(X_test) print(f单棵深度为3的决策树准确率: {accuracy_score(y_test, y_pred_single):.4f}) # 再用装袋法包100个同样的决策树 bag_clf BaggingClassifier( estimatorDecisionTreeClassifier(max_depth3, random_state42), n_estimators100, max_samples1.0, # 每棵树的训练集大小 原始训练集大小 bootstrapTrue, # 有放回采样这就是Bootstrap bootstrap_featuresFalse, n_jobs-1, # 并行训练 random_state42, oob_scoreTrue # 开启袋外样本评估 ) bag_clf.fit(X_train, y_train) y_pred_bag bag_clf.predict(X_test) print(f100棵决策树装袋后准确率: {accuracy_score(y_test, y_pred_bag):.4f}) print(fOOB评估准确率: {bag_clf.oob_score_:.4f})我用 digits 数据集实测的结果大致是这样单棵深度为3的决策树准确率大概是 0.70 左右装袋100棵后准确率能到 0.94 以上OOB分数和测试集分数非常接近。这就是装袋法最直观的威力单个弱学习器不算聪明但100个弱学习器合在一起就很强了。注意我刻意选了max_depth3的浅决策树当基础模型。这样做的用意是深度为3的决策树本身偏差很大欠拟合单棵树效果很差但装袋法把它提升到接近顶级模型的水平——这说明装袋法不仅能降方差实际上还通过平均降低了有效偏差的波动。反过来如果你用完整生长的深决策树max_depthNone单棵树准确率可能有0.85装袋后能到0.97左右但提升幅度不如浅树装袋的组合那么戏剧化。3.2 那些要命的参数max_samples、bootstrap_features与n_estimatorsscikit-learn 的BaggingClassifier参数不算多但每个参数都值得琢磨。max_samples控制每棵基础模型从训练集中抽取的样本比例。它默认是1.0即每棵树用等于原始训练集大小的自助采样集。这个参数隐藏着一个细节当max_samples 1.0时每棵树看到的样本量更少模型之间的差异性会更大但也可能让每棵树学到的信息不够。我实测过不同的值max_samples1.0默认最常用理论依据就是Bootstrap的 $e^{-1} \approx 0.632$ 袋外比例。max_samples0.8训练集变小方差降得更明显但偏差略有上升整体效果通常和默认值差不多。max_samples0.3每棵树只看到30%的样本偏差太大效果反而下降。bootstrap_features是另一个有意思的参数。当它为True时算法不仅对样本做自助采样还对特征做自助采样——相当于随机森林的特征子采样。这是装袋法往随机森林过渡的桥梁。如果你用BaggingClassifier搭配bootstrap_featuresTrue本质上你就在实现一个随机森林前提是基础模型为决策树。但通常还是直接使用RandomForestClassifier更方便因为后者做了更多内部优化。n_estimators是装袋法最重要的参数。理论上越大越好但边际收益递减。我用一个真实经验给你参考在大多数表格数据集上当n_estimators超过50棵后准确率提升开始放缓超过200棵后基本进入平台期。所以别一上来就设10000先跑一个50到200的范围看OOB分数变化趋势就够了。提示oob_scoreTrue这个参数强烈建议打开。它利用袋外样本评估模型的泛化能力效果接近交叉验证却几乎不增加计算成本。尤其在调参阶段OOB分数可以替代一部分交叉验证大幅缩短实验周期。3.3 用纯Python手写一个装袋法彻底看清内部机制如果你只是调用库函数很难真正理解装袋法的内部逻辑。我建议任何一个认真学机器学习的人都手写一遍。下面给出一个极简版本基础模型用三层深的决策树直接复用tree.DecisionTreeClassifier核心逻辑就是Bootstrap采样加多数投票import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score class SimpleBagging: def __init__(self, n_estimators50, max_depth3, random_state42): self.n_estimators n_estimators self.max_depth max_depth self.random_state random_state self.models [] def fit(self, X, y): rng np.random.RandomState(self.random_state) n_samples X.shape[0] self.models [] for _ in range(self.n_estimators): # Bootstrap采样有放回地抽取n_samples个样本 idx rng.choice(n_samples, sizen_samples, replaceTrue) X_boot X[idx] y_boot y[idx] # 训练一个决策树 tree DecisionTreeClassifier(max_depthself.max_depth) tree.fit(X_boot, y_boot) self.models.append(tree) return self def predict(self, X): # 每棵树单独预测 preds np.zeros((X.shape[0], len(self.models)), dtypeint) for i, tree in enumerate(self.models): preds[:, i] tree.predict(X) # 多数投票取每行出现次数最多的类别 votes np.array([np.bincount(row).argmax() for row in preds]) return votes这段代码只有30行左右但每一步都和装袋法的定义严格对应rng.choice里replaceTrue就是有放回抽样n_estimators是模型数量bincount(...).argmax()是多数投票。手写一遍之后你对Bootstrap的理解会立刻从背定义变成肌肉记忆。手写时最容易犯的错误是忘记设置随机种子导致每次实验结果不一致误以为是装袋法的问题。务必要用一个固定的random_state才能保证实验可复现。我当初踩过这个坑调参调到一半发现结果忽高忽低排查了半天才发现是随机种子没固定白白浪费了两个小时。4. 装袋法的实战经验与调参心得4.1 什么场景下用装袋法收益最大装袋法不是万能药用错场景等于白费功夫。我以多年实战经验给你总结几个判断标准。第一表格型中小规模数据。1000到50000行左右、几十到几百个特征的数据是装袋法的最佳舞台。对于超过百万行的大规模数据装袋法训练成本急剧上升此时更推荐LightGBM或XGBoost这类梯度提升框架——它们本质上是Boosting但也有Bagging的随机采样机制。第二基础模型是高方差模型时收益最大。决策树、KNN小K值、神经网络都是高方差模型。为什么高方差模型配装袋法收益大因为方差削减公式的效果取决于模型之间是否足够不同——高方差模型对数据扰动敏感Bootstrap采样制造的一点数据差异就能让模型千差万别方差削减的效果随之显现。反过来线性回归这类低方差模型Bootstrap采样制造的数据差异很难让模型有本质变化装了等于白装。第三数据中含有较多噪声时。装袋法的多数投票和平均机制对噪声有天然的中和效果。有个极端案例我印象很深在某企业年流失预测项目中员工离职数据噪声极大同一特征组合下的离职行为完全不一致同样的年龄段、部门、薪资水平有人走有人留单个决策树的准确率勉强到70%装袋法直接拉到了84%。这并非模型多么聪明而是平均机制把不可预测的部分给平滑掉了。哪些场景装袋法不适用高维稀疏数据比如文本的TF-IDF特征上线性模型配合正则化效果好得多图像和序列数据CNN/RNN是更合适的选择对推理延迟要求极高的在线预测场景100棵树比1棵树慢100倍但随机森林可以并行预测倒是可以缓解不过单棵树仍然更快。4.2 装袋法、随机森林、Boosting怎么选我把三者的对比整理在下面方便你复习和做选型方法训练方式降低的对象代表算法优点缺点Bagging并行方差BaggingClassifier、RandomForest稳定、抗过拟合、可并行偏差降低有限Boosting串行偏差AdaBoost、GBDT、XGBoost精度上限更高对噪声/异常值敏感训练慢Stacking并行元模型两者兼顾StackingClassifier理论上限最高容易过拟合工程复杂选型建议是这样的如果是一个干净的结构化数据比赛优先试XGBoost/LightGBM因为Boosting类一般精度上限更高如果是业务风控、金融违约预测这类噪声大、负样本少、需要解释性的场景随机森林在默认参数下的表现往往最稳而且它自带feature_importances_可以做特征筛选如果不确定用哪种直接先跑一个随机森林当baseline再用其他模型去超越它——这是最务实的做法。4.3 特征重要性、OOB与过拟合控制三个实战利器特征重要性。装袋法尤其是随机森林能输出特征重要性但要理解它的计算逻辑才不会被误导。随机森林的特征重要性主要通过两种方式计算基于不纯度减少把某个特征在所有树中带来的基尼不纯度减少量累加起来越重要的特征减少越多。基于OOB误差的置换重要性把某一列特征的取值随机打乱观察OOB误差的上升幅度上升越多说明该特征越重要。我建议优先看置换重要性。因为基于不纯净度的方法有个已知问题数值型特征连续性高的特征容易被高估而分类特征容易被低估。置换重要性更客观基本不受特征类型干扰。OOB评估与交叉验证的取舍。OOB分数等于一个免费的验证集但它也有局限当样本量特别小比如几百条OOB评估的方差可能很大不够稳定。我的建议是——数据量小于500条时用交叉验证而不是OOB数据量大于几千条时OOB和交叉验证的结论基本一致用OOB更省时间。过拟合控制的时机。在机器学习圈子里很多初学者以为装袋法永远不会过拟合这是绝对错误的。随着树的数量增多装袋模型在训练集上的误差可以降到极低甚至为零——因为它本质上是一个高容量模型。但它真正的优势在于即使训练误差很低泛化误差测试集误差仍然不会随之反弹这正是方差降低的效果。换句话说不是不过拟合而是过拟合的速度远慢于单模型。我实测过很多次n_estimators从1到500训练集准确率一直缓慢上升直到接近100%而测试集准确率在前50棵左右快速爬升之后进入稳定期波动幅度在1个百分点以内。如果你想追求极致稳定的线上表现可以把树的数量定在150到300之间性价比最高。4.4 从装袋法到随机森林一个关键演化必须单独提一下装袋法到随机森林的演化过程这是机器学习面试里出现频率极高的问题也是实操中你一定会用到的升级。装袋法的极限在哪里它通过Bootstrap采样让每棵树看到不同的样本但每棵树分裂时面对的是全部特征。如果数据中有一个特征特别强比如业务数据里的用户年龄那么每一棵树的根节点分裂都会优先用这个特征导致所有树在上层结构上高度相似。树与树之间的相关性 $\rho$ 依然很高方差削减效果被削弱。随机森林在装袋法的基础上加了一个关键操作在每个节点分裂时只随机选择一部分特征通常是 $\sqrt{p}$ 个其中p是总特征数候选参与分裂。这就强行打断了最强的那个特征垄断所有树的根节点的现象让不同树从不同的特征视角去学习进一步降低树之间的相关性。用一个生活类比装袋法就像一群评委对同一份材料各自打分但如果所有评委都只盯着同一个关键数据看他们的打分差异不会太大随机森林则相当于给每个评委随机分发不同侧重点的材料评委们考虑的角度多样了最终的综合评价就更稳健。因此如果你发现自己的Bagging模型树与树之间太相似可以通过观察特征重要性过于集中来间接发现升级到随机森林几乎总能看到进一步的效果提升。5. 装袋法的高阶话题与常见问题排查5.1 面试和考试里关于装袋法的5个高频追问这个部分写给正在准备期末或者算法面试的人全是高频考点考核概率极大。Q1装袋法为什么比单个决策树好回答框架单棵决策树可能过拟合对训练数据的细微变化非常敏感高方差。装袋法通过Bootstrap采样制造多份不同的训练集训练出多棵差异化的树再通过投票/平均降低方差从而提升泛化性能。Q2装袋法会降低偏差吗严格来说装袋法主要降低方差。但注意有个微妙之处如果基础模型存在欠拟合高偏差倾向装袋法在平均过程中也能略微改善有效偏差——因为多模型平均后的预测边界更平滑近似拟合能力更强。但这是次要效应主流表述仍然是装袋法降低方差。Q3为什么Bootstrap抽样有放回无放回行不行无放回抽样就是普通的子采样Pasting粘贴法每棵树只能看到原始数据的一部分样本多样性不如有放回抽样。更重要的是无放回抽样会产生样本重叠树与树之间的相关性更高方差削减效果更差。有放回抽样还有额外的bonus——每份采样集大约包含63.2%的原始样本剩下36.8%天然成为OOB验证集。Q4为什么分类用投票、回归用平均分类任务输出的是离散类别标签少数服从多数是最自然的整合方式如果输出的是类别概率也可以先对所有模型的概率取平均再取概率最大的类别——这种方式称为软投票通常比硬投票直接对类别标签投票更稳定因为概率编码了模型的置信度信息。回归任务的输出是连续值取平均能够最大程度地平滑掉个别模型的极端预测。Q5OOB样本和测试集有什么本质区别OOB样本来自训练集本身只是每个基础模型训练时没看到这些样本但它们仍然被其他树看到过。测试集是模型从未见过的全新数据。严格来说OOB评估仍然略有一点乐观偏差因为它无法完全模拟真正的新数据分布。但相对于在同一份训练集上做自评OOB已经客观太多了是数据量有限时最划算的评估方式。5.2 训练装袋模型时最常踩的5个坑我自己这些年用装袋法踩过不少坑整理成一份避坑清单每一条都是真金白银换来的经验。第一忽略了特征尺度。虽然决策树不受特征尺度影响但如果你把基础模型换成KNN或SVM特征尺度的差异会极大地影响距离计算。装袋法不会自动帮你做特征标准化。用装袋法之前一定要先确认你用的基础模型对特征尺度是否敏感敏感则先做标准化或归一化。第二类别不平衡没处理。装袋法对类别不平衡并不免疫。如果训练集中正负样本比例是1:99每棵树的Bootstrap采样结果大概率还是1:99投票时少数类几乎没有话语权。先做分层采样、使用SMOTE过采样、或者在投票时给少数类加权都是有效的处理方式。第三盲目增加树的棵树忽视了内存。1000棵树乘以200MB的单棵树模型就是200GB的内存消耗。训练前预估一下模型体积保守点先用50到200棵树验证效果再决定是否大规模扩展。第四用默认的max_depthNone却不限制树的深度。完全生长的决策树在Bootstrap采样下虽然不容易过拟合但训练时间和内存开销会显著增加。实践上限制max_depth到10到20层可以大幅降低训练成本效果几乎不变。第五随机种子不固定就反复对比实验。装袋法引入了随机抽样每次运行结果都不一样。如果你做实验对比不固定随机种子你比较的就不是算法的优劣而是随机波动的差异。这是实验设计最基本的纪律务必养成习惯。5.3 装袋法在各行业应用中的实际操作经验最后讲讲装袋法在各行各业里的真实应用经验这些内容能帮助你理解学了这个算法到底能干什么。金融风控领域装袋法随机森林广泛用于信用评分、欺诈检测。为什么选它而非XGBoost因为风控模型要过监管审查可解释性很重要。随机森林能输出特征重要性配合SHAP等解释工具能让业务方清楚知道为什么拒绝这笔贷款。我在信贷场景中的经验是随机森林作为风控模型的baselineAUC通常在0.75到0.85之间后续再通过特征工程和样本权重调优能稳定到0.87以上。营销领域的用户流失预测。这类数据噪声大、正负样本不均衡装袋法的稳定性就派上了用场。实际操作中我会结合分层采样保证每个Bootstrap训练集中正负样本比例与原始数据一致同时开启OOB评分监控模型的稳定程度。医疗健康领域的数据分析比如基于体检指标预测患病风险样本量往往只有几千条但特征有几十到上百个特征之间还有复杂的相关性。此时装袋法比深度学习更合适——不需要大量调参、不需要GPU、结果的解释性也让医生更容易接受。工业界的在线预测场景比如广告点击率预估、推荐系统的实时打分用装袋法的时候要特别注意推理速度。100棵树单次预测虽然也就几毫秒级别但在吞吐量每秒几十万的场景下这个开销会急剧放大。我的建议是线上用减少到30到100棵树或者把树模型转成SQL/嵌入式规则后再部署以速度换精度。我没有刻意把每个领域的技术细节堆满是因为表格型数据的处理流程大体相似关键在于理解装袋法在其中的角色和取舍逻辑。掌握了这套判断框架换到任何领域你都知道该从哪里下手。装袋法这套方法我用了很多年至今仍然觉得它是机器学习里性价比最高的算法之一——原理简单到高中生都能理解数学推导不超过三行实践效果却极其可靠。如果你正在面临期末考试或者第一次做机器学习项目我的建议是不要急着去啃XGBoost的源码先把装袋法吃透亲手用纯Python实现一个在真实数据集上对比一下单个模型和装袋模型的差异再用OOB评估去验证你感受到的提升。把这件事做扎实你对方差偏差泛化这些概念的直觉会比只读书的人扎实得多。这套先理解、再实现、后调优的路线是我自己一路走来验证过最有效的学习方式。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →