:集成学习,Bagging、Boosting 与随机森林)
系列第六篇。上一篇文章的结论是单棵决策树容易过拟合、结果不稳定。集成学习就是针对这两个弱点的正面回应也是面试的重灾区Bagging 和 Boosting 的区别几乎必考。这篇沿用泰坦尼克数据把随机森林一定比单棵树强这个流行说法实测了一遍结论有点反套路。本篇看完要回答的四个面试题Bagging 和 Boosting 的区别随机森林的随机体现在哪里为什么要有放回抽样随机森林怎么免训练评估OOB 是什么n_estimators 越大越好吗一、集成学习三个臭皮匠的数学版集成学习的定义一句话把多个弱学习器组合成一个更强大的学习器。训练时依次或并行训练出多个弱学习器预测时让它们联合给出结果。组合为什么能变强直觉上是个投票问题单个分类器有噪声、会犯随机错误把很多错误方向不同的分类器放在一起投票错误会互相抵消。但注意前提弱学习器之间要有差异且各自不能太差。如果 100 个人犯的是同一个错误投票投 100 次也是同一个错。两大流派 Bagging 和 Boosting 的全部区别就在于怎么制造差异和怎么合并结果。二、Bagging有放回抽样 平权投票BaggingBootstrap Aggregating的流程三步有放回的随机抽样bootstrap 抽样从训练集产生多个不同的训练子集在每个子集上并行训练一个弱学习器各学各的、互不依赖预测时所有学习器平权投票分类取多数表决回归取平均有放回抽样有个容易忽略的细节每次抽出的子集大约只包含63.2%的原始样本1−1/e1 - 1/e1−1/e剩下的约 36.8% 没被抽到这部分叫袋外样本Out of Bag第五节有它的大用。代表算法就是随机森林。三、Boosting串行纠错 加权投票Boosting 的流程反着来全部样本参与每一轮训练串行训练每一个训练器重点关注前一个训练器做错的地方提高错样本的权重专门补短板预测时按各学习器的表现加权投票强的说话声音大课件的比喻很形象Boosting 像数码宝贝进化滚球兽到亚古兽到暴龙兽到机械暴龙兽到战斗暴龙兽每一步都站在上一步的肩膀上从弱到强。代表算法Adaboost、GBDT、XGBoost、LightGBM这一条线就是后来大模型时代之前 tabular 数据竞赛的统治家族。Bagging vs Boosting 对比表面试背这个BaggingBoosting数据采样有放回抽样产生不同子集全部样本按前一轮结果调整样本权重学习器关系并行互不依赖串行下一个补上一个的不足投票方式平权投票加权投票目标降低方差求稳降低偏差求准代表随机森林Adaboost、GBDT、XGBoost降方差 vs 降偏差这行表里没有但面试常追问提前放这里Bagging 靠平均抵消单个模型的波动是降方差Boosting 一轮轮纠错把整体错误率逐步压低是降偏差。四、随机森林Bagging 思想 决策树随机森林用决策树当弱学习器构建过程五步有放回地随机抽取训练样本从全部特征中随机挑选 n 个特征n 小于总特征数用抽到的样本和特征训练一棵决策树重复 1~3训练出多棵树预测时平权投票分类或取均值回归随机体现在两处随机抽样本 随机选特征。两处缺一不可。课件里两道思考题值得原样记下来为什么不随机抽样森林就废了每棵树的训练集完全一样决策树又是确定性算法训练出的树分类结果也完全一样投票投出的是同一个答案等于还是一棵树。为什么要放回抽样如果不放回各棵树的训练样本完全没有交集每棵树都是有偏的差异过大。有放回抽样让树之间大部分相似、小部分不同投票才能既有多样性又不离谱。核心 APIfromsklearn.ensembleimportRandomForestClassifier,RandomForestRegressor modelRandomForestClassifier(n_estimators100,max_depthNone,oob_scoreTrue,random_state22)关键参数n_estimators树的数量、max_depth每棵树的深度限制预剪枝继承自决策树、max_features每次分裂随机考察的特征比例、oob_score是否用袋外样本评估、n_jobs-1并行训练Bagging 并行的红利。五、泰坦尼克实战随机森林真的更强吗沿用决策树篇的预处理Age 均值填充、Sex 做 one-hot、8 : 2 划分random_state22三组对照dtcDecisionTreeClassifier(random_state22)dtc.fit(x_train,y_train)rfcRandomForestClassifier(n_estimators100,random_state22)rfc.fit(x_train,y_train)rfc_oobRandomForestClassifier(n_estimators100,oob_scoreTrue,random_state22)rfc_oob.fit(x_train,y_train)模型训练集测试集单棵决策树不限深度0.88620.7821随机森林100 棵不限深度0.88480.7765随机森林 OOB 得分不可比0.8118第一个反直觉的结果出现了随机森林的测试集分数没有超过单棵树0.7765 vs 0.7821反而略低。先别急着说森林不行这里有两个原因一个是数据太小一个是评估方式本身。5.1 测试集只有 179 个样本分数波动是噪声179 个测试样本分对一个贡献 0.56%。0.7765 和 0.7821 之间差一个样本都不到这个量级的差异没有任何统计意义。真正可靠的参照是网格搜索在训练集内部做 5 折交叉验证得到 0.8231OOB 得分 0.8118两者互相印证。小测试集上的单个分数本来就不该当成结论。5.2 OOB不用写测试代码的免费评估每棵树的袋外样本那 36.8% 没参与它训练的数据就是它天然的验证集让每棵树对自己没见过的袋外样本做预测汇总起来就是 OOB 得分。它等价于一次内置的交叉验证不占用测试集、不用额外代码。实测 OOB 0.8118 和交叉验证 0.8231 量级一致都在小测试集分数的噪声之上说明这两个数字更接近模型真实泛化能力。5.3 n_estimators 越大越好吗n_estimators15103050100200300测试集0.77650.77650.78770.79330.77090.77650.77090.7821不是。树的数量增加会平滑预测、降低方差但对偏差没有帮助涨到一定程度后收益趋近于零本实验里 30 棵之后基本就是在噪声里横跳。实践上取几十到几百用交叉验证确认收益饱和即可再多只是浪费训练时间和推理延迟。5.4 网格搜索调参param{n_estimators:[40,50,60,70,100],max_depth:[2,4,6,8,10]}grid_searchGridSearchCV(RandomForestClassifier(random_state22),param_gridparam,cv5,n_jobs-1)grid_search.fit(x_train,y_train)结果最优参数max_depth8, n_estimators40交叉验证最高分 0.8231测试集 0.7709。两点说明。第一课件里这段代码用的是cv2两折交叉验证的估计太粗糙本文改用cv5。第二交叉验证 0.8231 对应的测试集只有 0.7709差的这部分还是 5.1 说的测试集噪声问题交叉验证均值是 5 次评估的平均天然比一次 179 样本的测试更可信两个数字打架时信交叉验证。5.5 一个更公平的比法换 10 次数据划分上面的对照都是一次划分下的一组数字容易被单次划分带偏。把划分种子从 0 换到 9 重复 10 次每次单棵树和森林都用同样的划分单棵决策树随机森林100 棵测试集准确率均值0.80390.7989标准差0.01650.0189极差0.05590.0614第二个反直觉的结果连稳定性都没拉开差距。诚实的解释单棵决策树的不稳定体现在模型内部数据稍微一动树的分裂结构剧变而 Bagging 的平均确实消除了这部分波动。但这个实验里波动的最大来源不是模型是测试集本身太小换一次划分测试集就换成另一批 179 个人谁来预测都会跟着抖。森林的方差优势淹没在测试集的方差里了。所以这一节的真实结论是在 891 行、3 个特征的小数据上随机森林对比单棵树既没有准确率优势也没有可观测的稳定性优势这不是随机森林不行是这份数据太小喂不出集成的收益。集成的价值要在特征多、噪声大、数据量大的真实场景也就是工业界爱用它 tabular 场景的原因才能体现。面试里如果被问随机森林一定比决策树好吗标准答案就藏在上面这句话里。5.6 特征重要性的变化对比单棵树和森林给出的特征重要性特征单棵树深度 3随机森林100 棵Age0.09470.3764Sex_female0.66210.2270Sex_male0.00000.2421Pclass0.24310.1545单棵树把宝几乎全押在性别上第一层就按性别分裂Sex_female 独占 0.66森林平均了几百棵在不同子集上训练的树重要性分布被摊平了年龄的重要性大幅上升。单棵树的重要性有强烈的结构偶然性森林的重要性更稳健这也是特征筛选常用随机森林的原因之一。六、易错点随机森林不限深度时照样过拟合上表里森林训练集 0.8848、测试集 0.7765差距没有比单棵树小多少。Bagging 降低的是多棵树投票这个整体模型的方差但每棵深树仍在背训练数据工程上通常给每棵树配max_depth或max_features限制n_estimators 不是越大越好收益会饱和多出的树只费时间不涨分OOB 得分不能和训练集准确率比它衡量的是泛化能力参照对象应该是交叉验证和测试集小测试集上的单次分数没有结论价值179 个样本一格 0.56%比较模型优劣时先看样本量再用交叉验证课件里的cv2别照抄折数太少估计粗糙常规起点是 5随机森林的random_state控制的是抽样随机性改它结果会变对比实验必须固定七、知识清单集成学习多个弱学习器组合成强学习器前提是学习器之间有差异且各自不太差Bagging有放回抽样、并行训练、平权投票降方差代表随机森林Boosting全样本、串行纠错、加权投票降偏差代表 Adaboost、GBDT、XGBoost、LightGBM随机森林双随机随机抽样本有放回 随机选特征n 小于总数袋外样本约 36.8%OOB 得分是免代码的内置验证APIRandomForestClassifier/RandomForestRegressor核心参数n_estimators、max_depth、max_features、oob_score、n_jobs随机森林是 XGBoost 之前工业界 tabular 数据的默认强基线也是下一篇之后回看树模型家族的主线八、面试高频问答Q1Bagging 和 Boosting 的区别Bagging 对数据有放回抽样产生多个子集各学习器并行训练、互不依赖预测时平权投票目标是降低方差Boosting 用全部样本串行训练每个学习器重点纠正前一个的错误预测时加权投票目标是降低偏差。代表分别是随机森林和 GBDT/XGBoost。Q2随机森林的两处随机分别解决什么问题随机抽样本保证树之间看到的数据不同随机选特征保证树之间的分裂结构不同。两处随机共同制造弱学习器之间的差异性投票才有意义。只有一处随机树会趋同只抽样本时特征还是全量强特征每棵树都先分裂它或差异过大不放回抽样时每棵树都有偏。Q3OOB 得分是什么原理每棵树有约 36.8% 的原始样本没被 bootstrap 抽到袋外样本它们没参与该树训练天然就是该树的验证集。让每棵树预测自己的袋外样本并汇总得到 OOB 得分。它不占用测试集、无需额外代码效果近似交叉验证适合大数据集的快速评估。Q4随机森林一定比单棵决策树好吗不一定。数据量小、特征少时两者差距在噪声范围内集成收益体现不出来数据量大、特征多、噪声大的场景下随机森林凭借降方差和平滑预测通常明显更强。此外随机森林可解释性弱于单棵树、训练和推理成本更高选型要看场景而不是默认堆模型。