☰
集成学习四大流派:投票、Bagging、随机森林与Boosting实战
2026/10/13 5:07:10 网站建设 项目流程

做机器学习项目做到一定阶段,很多人都会碰到同一个瓶颈:单个模型的表现死活上不去,调参调到头秃,验证集分数还是纹丝不动。我前几年带某个分类项目的时候也踩过这个坑,后来把思路从“训练一个完美模型”转成“组合多个不那么完美的模型”,效果立刻就不一样了。这个思路,就是集成学习(Ensemble Learning)。

集成学习的核心逻辑一句话就能讲明白:三个臭皮匠,顶个诸葛亮。单个决策树可能又蠢又容易过拟合,但一千棵又蠢又容易过拟合的树放在一起投票,结果往往出奇地稳。围绕这个逻辑,业界发展出了投票分类器(Voting Classifier)、Bagging/Pasting、随机森林(Random Forest)和Boosting这四大流派。这篇文章就围绕这四块内容,把原理、代码、调参经验和踩坑记录一次性讲透,适合已经会用 scikit-learn 跑基础模型、但想进一步提升效果的读者。我尽量不堆公式,用场景和代码说话。

1. 为什么单个模型会到瓶颈:集成学习的核心动机

先说动机。你用逻辑回归、SVM、决策树分别跑同一个分类任务,可能发现它们各有优劣:逻辑回归对线性边界很干净,但对非线性关系束手无策;决策树能拟合很复杂的边界,可稍微换个数据划分,树结构就完全变了——这就是高方差。SVM 在小样本上表现惊艳,但数据量一大,训练成本直线上升。

这些模型的“偏科”本质上是偏差-方差权衡(Bias-Variance Tradeoff)在起作用。单个模型要么偏差高(欠拟合),要么方差高(过拟合),很难两全。集成学习的思路不是去造一个全能模型,而是把一堆“偏科生”组合起来,让它们的错误互相抵消。就像你问十个路人一道难题,单个人可能错得离谱,但多数人指向的那个答案,往往比最聪明那个人单独给出的答案还靠谱——前提是这些路人的错误不是同一个方向。

这里有个关键的统计学直觉:假设你有 N 个独立同分布的模型,每个模型的错误率是 0.4,那多数表决后整体错误率的期望会随着 N 增大而急剧下降。这个结论听着很美好,但它有两个前提:一是每个模型不能太差(至少好于随机猜测),二是模型之间的错误要尽量相互独立。现实里模型用的都是同一份训练数据,错误肯定有相关性,所以集成的提升幅度会打折扣。不过没关系,后面要讲的随机森林和 Boosting,本质上都是在用不同手段去“人为制造”这种不相关性。

我刚入门的时候犯过一个错误:以为集成就是把最好的几个模型直接扔在一起投票,结果发现效果还不如单模型。后来才明白,集成有效的前提是“多样性”——模型之间的差异越大,集成收益才越大。这一条在后面的每一个方法里都会反复出现。

2. 投票分类器:最直观的集成方式

投票分类器是集成学习里最简单、也最适合做基线的方法。它的逻辑一句话描述:训练 N 个不同的分类器,预测时让它们投票,票数最多的类别胜出。scikit-learn 里实现非常简单:

from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC from sklearn.datasets import make_classification from sklearn.model_selection import cross_val_score X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, random_state=42) clf1 = LogisticRegression(max_iter=1000) clf2 = DecisionTreeClassifier(max_depth=5, random_state=42) clf3 = SVC(probability=True, random_state=42) voting_hard = VotingClassifier( estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)], voting='hard' ) print(cross_val_score(voting_hard, X, y, cv=5, scoring='accuracy').mean())

2.1 硬投票与软投票:不是一回事

投票分类器有两种模式,区别很容易被忽略,但效果差异很大。

硬投票(hard voting):每个模型预测出一个类别标签,然后统计众数。比如逻辑回归说“类别A”,决策树说“类别A”,SVM说“类别B”,那最终结果就是“类别A”。这种方式实现简单,但它把所有模型当成了同等权重的“意见提供者”,完全不看每个模型对自己预测的置信度。

软投票(soft voting):每个模型输出每个类别的预测概率,然后对所有模型的概率取平均,再取平均概率最大的类别。比如逻辑回归认为类别A的概率是 0.8,决策树认为类别A的概率是 0.3,SVM认为类别A的概率是 0.6,平均下来是 0.57;类别B的平均概率是 0.43,那最终选类别A。

我实测下来,绝大多数情况下软投票比硬投票效果好,原因在于软投票用上了更多信息——概率本身是连续的,比离散的标签更能反映模型内部对样本的把握程度。使用软投票有一个硬性条件:每个基模型必须支持predict_proba方法。SVM 默认不支持,需要设置SVC(probability=True),这会让训练变慢,因为它内部要额外做一次交叉验证来拟合概率。如果你对推理速度敏感,要慎重使用probability=True。

2.2 权重投票:给靠谱的模型更大的话语权

投票分类器还支持每个基模型带权重。默认情况下权重都是 1,但你可以通过weights参数手动指定:

voting_weighted = VotingClassifier( estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)], voting='soft', weights=[2, 1, 1] # 逻辑回归的话语权更大 )

权重怎么定?我的经验是先用交叉验证跑一遍每个单模型的效果,按准确率相对高低粗略设置权重,再微调。权重设置本身也值得做一次小规模网格搜索,别拍脑袋直接写。不过要注意,权重过高会导致优势模型主导整个投票,集成也就退化成了那个单模型,多样性优势就没了。

2.3 投票分类器的定位

我个人的体会是,投票分类器适合做两件事:

  • 作为项目的基线模型,在一开始快速验证“集成是否有效”。如果连投票都打不过最好的单模型,说明你选的那些基模型本身就太弱或太相似,需要换更不一样的模型进来。
  • 在模型融合阶段,把几个经过独立调优的异质模型(比如XGBoost、LightGBM、神经网络)用软投票融合,往往能再涨一个点。这个用法在竞赛里极其常见。

但投票分类器有它的天花板:它不会去主动优化每个基模型的弱点,只是被动合并结果。另外,它不支持端到端的联合训练,所有基模型独立训练,这也限制了可能取得的提升空间。如果你想要那种“越合越强、错误互补”的效果,就得看接下来的 Bagging 和 Boosting。

3. Bagging 与 Pasting:并行训练多个同质模型

Bagging(Bootstrap Aggregating)解决的是单个高方差模型的过拟合问题,尤其是决策树这种一换数据就变结构的模型。思路是这样:与其只训练一棵树,不如用不同的数据子集训练几百棵树,最后汇总预测结果。这个“不同的数据子集”是关键,两种采样方式对应两个名字:

  • Bagging:有放回抽样(Bootstrap 抽样),每棵树的训练集允许出现重复样本,原始数据里约 63.2% 的样本会被抽到至少一次。剩下的约 36.8% 的样本没有进入当前这棵树的训练集,这些样本叫OOB(Out-of-Bag)样本。
  • Pasting:无放回抽样,每棵树的训练集是原始数据的互不重叠或部分重叠的子集。

scikit-learn 里用同一个类实现:

from sklearn.ensemble import BaggingClassifier # Bagging:有放回抽样 bag_clf = BaggingClassifier( estimator=DecisionTreeClassifier(random_state=42), n_estimators=500, max_samples=1.0, # 每棵树使用原始数据100%的样本量(有放回) bootstrap=True, # 有放回 n_jobs=-1, random_state=42 ) # Pasting:无放回抽样 past_clf = BaggingClassifier( estimator=DecisionTreeClassifier(random_state=42), n_estimators=500, max_samples=0.7, # 每棵树使用原始数据70%的样本量 bootstrap=False, # 无放回 n_jobs=-1, random_state=42 )

注意:新版 scikit-learn 中base_estimator参数已改名为estimator,旧代码如果报参数错误,多半是这个原因。

3.1 采样策略:放回与不放回到底差在哪

有放回和无放回听起来只是抽签方式的区别,但实际影响很大。

无放回抽样(Pasting)的问题在于:每棵树用的数据是原始数据的严格子集,如果数据量本身不大,每棵树看到的样本更少,模型会变得不够强壮。有放回抽样(Bagging)的好处在于:每棵树虽然都是用同样数量的样本训练(max_samples=1.0),但因为采样是有放回的,每棵树的“数据构成”都不同,而且训练数据里天然产生了大量重复样本。这让每棵树各有侧重,多样性反而更好。所以实践中 Bagging 更常用,Pasting 更多是在数据量超大或必须严格避免重复数据的场景里才考虑。

我建议大多数场景直接选择 Bagging。另外还有个细节:bootstrap=True时,max_samples=1.0意味着每棵树用的是原始样本量的 100%,但由于有放回,实际有效的独特样本比例大约是 63.2%。

3.2 OOB 评估:不用额外留验证集

Bagging 最妙的一点是它能免费提供一个“验证集”——那 36.8% 的 OOB 样本。每棵树没见过这些样本,所以可以用这些样本的预测结果来近似评估整体模型的泛化误差。scikit-learn 里只需要:

bag_clf = BaggingClassifier( estimator=DecisionTreeClassifier(random_state=42), n_estimators=500, bootstrap=True, oob_score=True, n_jobs=-1, random_state=42 ) bag_clf.fit(X, y) print(bag_clf.oob_score_)

oob_score_在训练完成后会直接给出 OOB 准确率,它的数值一般和交叉验证的结果比较接近,而且省去了额外划分验证集的麻烦。当你需要快速评估一组参数、又不想跑完整 CV 的时候,OOB 分数是个很好的快速参考。

3.3 并行化与特征采样

Bagging 有天然的并行性:每棵树互不依赖,可以同时训练。代码里设n_jobs=-1就能用满所有 CPU 核心,这在n_estimators很大的时候特别重要。另外,scikit-learn 的 Bagging 还支持对特征抽样(max_features和bootstrap_features),即每棵树只随机看一部分特征。这与随机森林的思想一致,但更灵活——你可以用 BaggingClassifier 包任何模型,而随机森林则固定使用决策树作为基模型。如果你只想包决策树,直接用 RandomForest 就好,性能和方便程度都更优。

4. RandomForest:Bagging 决策树的集大成者

随机森林可以说是 Bagging + 决策树 + 特征随机性的集大成者,也是工业界最常用、最不需要过分调参就能取得不错效果的模型之一。它的核心创新,是在 Bagging 的基础上,又加了一层“特征扰动”。

4.1 双重随机性从哪里来

Bagging 只随机样本,而随机森林在每棵树的每个节点分裂时,不是从全部特征里选最优分裂特征,而是先从全部特征里随机抽取一个子集(默认大约是 $\sqrt{n_features}$ 个),再在这个子集里找最优分裂。这看起来像是“退步”——明明全部特征里有更好的,为什么偏要限制选择范围?

答案还是“多样性”。如果每个节点都用全部特征找最优分裂,那所有树的最优分裂往往是一样的,树与树之间高度相关,投票的“相互纠错”效果就大打折扣。随机限制特征后,每棵树被迫看到不同的特征组合,会在完全不同的“角度”下生长。树的个体可能变差一些,但整体集成出来的系统方差大幅下降。这就是随机森林通常优于朴素 Bagging 的原因。

4.2 特征重要性:一个免费的分析工具

随机森林另一个吸引人的副产品是特征重要性(Feature Importance)。计算逻辑大概是:对每棵树,记录每个特征在所有节点分裂时带来的不纯度(Gini 不纯度或熵)下降量,按树加权平均,再归一化。这个数值反映了“如果删掉这个特征,模型的不纯度平均会增加多少”。用起来很简单:

from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier( n_estimators=500, max_depth=None, max_features='sqrt', random_state=42, n_jobs=-1 ) rf.fit(X, y) for name, importance in zip(feature_names, rf.feature_importances_): print(f"{name}: {importance:.4f}")

我在实际项目里常用它在做特征筛选之前先看一眼,高重要性特征大概率值得保留,末尾重要性趋近于 0 的特征可以考虑先剔除。要注意的是,特征重要性是基于训练集的拟合结果计算的,它反映的是特征对模型预测的贡献,不代表因果,尤其是在特征高度共线的时候,重要性在几个强相关特征之间分摊会失真。

4.3 随机森林的关键参数怎么调

随机森林是 Bagging 的家族成员,但有三个参数需要特别关注:

  • n_estimators:树的数量。越大越稳定,但边际收益递减,训练时间线性增长。我的习惯是先在 100~500 之间粗调,观察 OOB 分数是否饱和,一般 200~300 棵就够了。
  • max_features:每个节点随机抽样的特征数。分类默认是sqrt(即特征数的平方根),回归默认是n_features(即全部特征)。这一步是随机森林最重要的“多样性”旋钮,值得细致调整。太小会让每棵树太弱,太大又降低多样性。
  • max_depth:树的最大深度。None意味树可以无限生长直到叶子纯,随机森林依靠自身集成来控制方差,所以可以容忍较深的单棵树。但如果数据噪音很多,限制max_depth能加快训练并有一定正则化效果。

4.4 极端随机树:更进一步的随机化

如果你想把“随机限制”推到极致,可以用ExtraTreesClassifier(极端随机树)。它与随机森林的区别在于:随机森林是先随机选特征子集,再在这个子集里找最优分裂阈值;极端随机树是连分裂阈值都随机生成,在随机阈值里选最好的那个。因为分裂完全随机化,单棵树的偏差更大,但多样性也更强,方差更低,训练速度也更快——因为不需要真正去扫描所有候选阈值。

极端随机树不是在所有数据集上都比随机森林好,但数据特征噪音较大的时候它往往表现更稳。我的经验是把它和随机森林、梯度提升树一起放进模型池,用交叉验证选最好的,别主观预设谁一定赢。

5. Boosting:串行纠错,把弱模型“推”成强模型

Bagging 和随机森林是并行思路:同时训练很多模型,最后汇总。Boosting 则是串行思路:一个模型接着一个模型训练,后一个模型专门去“纠正”前一个模型的错误。它不是靠投票的平均效应,而是靠逐步逼近目标函数。Boosting 家族里有几个名字你肯定听过:AdaBoost、梯度提升(Gradient Boosting)、XGBoost、LightGBM、CatBoost。它们骨架相同,进化方向不同。

5.1 AdaBoost:给错分样本加权重

AdaBoost(Adaptive Boosting)是最经典的 Boosting 算法。它的做法是:先训练一个弱分类器(通常是深度很浅的决策树),找出它分错的样本,然后给这些样本增加权重——相当于让下一个分类器“重点关注”这些难分样本。每一轮训练完,分类器对训练集整体的加权错误率会决定它自己的权重,最终预测时,每个分类器按权重投票。

scikit-learn 直接用:

from sklearn.ensemble import AdaBoostClassifier ada = AdaBoostClassifier( estimator=DecisionTreeClassifier(max_depth=1), n_estimators=200, learning_rate=0.5, random_state=42 ) ada.fit(X, y)

learning_rate控制每棵树的贡献被缩小的程度。较小的学习率意味着每棵树贡献小,需要更多树才能达到一样的拟合效果,但往往泛化更好。AdaBoost 对数据噪声比较敏感:如果训练集里有很多错误标签,它会疯狂提高那些误标样本的权重,导致模型被“带偏”。现实中我用到 AdaBoost 的场景在减少,因为它面对噪声标签时不如现代梯度提升方法稳健。

5.2 Gradient Boosting:用残差学习的进阶版

梯度提升是 Boosting 的现代主力形态。它的思路不同:上一轮模型预测完,计算残差(真实值与预测值的差),下一棵树就去拟合这个残差,而不是直接拟合目标值。每一棵树的学习对象都是“前面所有树还没学会的那部分”。把多棵树的结果累加起来,就得到最终预测。

这个思路在数学上等价于在函数空间里做梯度下降——每一步沿着损失函数下降最快的方向,加一棵新的树。这就是“梯度提升”名字的由来。用决策树作为基模型时,就叫做 GBDT(Gradient Boosting Decision Tree)。

scikit-learn 的GradientBoostingClassifier是纯 Python 实现,速度较慢。工业级实现看 XGBoost、LightGBM、CatBoost。它们的差异主要在工程优化和分裂策略:XGBoost 加入了二阶导数、正则项和近似分位数算法;LightGBM 用单边梯度采样(GOSS)和互斥特征捆绑(EFB),训练速度非常快;CatBoost 针对分类特征做了目标编码的处理,对高基数类别特征特别友好。

LightGBM 是最常用的梯度提升库是不夸张的说法。一个典型训练脚本长这样:

import lightgbm as lgb params = { 'objective': 'binary', 'metric': 'auc', 'boosting_type': 'gbdt', 'learning_rate': 0.05, 'num_leaves': 31, 'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 1, 'verbose': -1, 'random_state': 42 } train_data = lgb.Dataset(X_train, label=y_train) valid_data = lgb.Dataset(X_val, label=y_val, reference=train_data) model = lgb.train( params, train_data, num_boost_round=2000, valid_sets=[valid_data], callbacks=[lgb.early_stopping(50), lgb.log_evaluation(100)] )

5.3 学习率与树的棵树:一对死对头

Boosting 里有两个参数必须一起调,放在任何单个模型身上都不能割裂:

  • learning_rate(学习率,也叫步长,通常记作 $\eta$):每棵树对最终预测的贡献缩放系数。
  • num_boost_round(迭代轮数,也就是树的数量):串行训练的轮数。

它们的关系是反比:学习率越小,每棵树贡献越少,就需要更多树来达到同样的效果;学习率越大,训练更激进,但也更容易过拟合。我常用的策略是:先固定一个比较小的学习率(比如 0.02~0.05),然后让迭代轮数写大一点,配合早停机制(early stopping)来自动确定最合适的轮数。等到最终确定轮数后,再适度调大学习率、重新搜索轮数,这样做能省下不少时间。

LightGBM 的num_leaves参数也很关键。它控制每棵树的叶子数,与最大深度有关但不完全等价。叶子数越大,树表达能力越强,但也越容易过拟合。业界经验值一般从 15 到 127 之间搜索。

5.4 早停:防过拟合的保命手段

Boosting 训练是串行的,天然支持“中途看效果”。把一部分训练数据留出来当验证集,每训练一轮都看验证集上的指标,当连续多轮(比如 50 轮)没有改善就停止训练。这一招是我做过所有 GBDT 类模型几乎必用的操作,能省下大量调参时间。

在 LightGBM 里有现成实现:

model = lgb.train( params, train_data, num_boost_round=2000, valid_sets=[valid_data], callbacks=[lgb.early_stopping(50)] )

训练完成后,model.best_iteration会告诉你最优轮数。正式预测时可以用这个轮数重新在“训练集+验证集”合并的数据上训练,或者直接用早停返回的模型做预测。

6. 实战对比:同一数据集上四种策略的效果

理论讲了这么多,不如上手跑一遍对比。我用一个合成二分类数据,看四种策略在同一份数据上的表现。数据生成固定随机种子保证可复现。

from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X, y = make_classification( n_samples=2000, n_features=20, n_informative=15, n_redundant=5, class_sep=0.8, random_state=42 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

分别训练单棵决策树、投票分类器、Bagging、随机森林、梯度提升树和 LightGBM,记录测试集准确率。为了公平,基模型统一使用决策树,树数量统一为 200:

from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import VotingClassifier, BaggingClassifier, RandomForestClassifier, GradientBoostingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC single_tree = DecisionTreeClassifier(random_state=42) bag = BaggingClassifier( estimator=DecisionTreeClassifier(random_state=42), n_estimators=200, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42 ) rf = RandomForestClassifier( n_estimators=200, max_features='sqrt', n_jobs=-1, random_state=42 ) gbdt = GradientBoostingClassifier( n_estimators=200, learning_rate=0.1, random_state=42 ) vote = VotingClassifier( estimators=[('lr', LogisticRegression(max_iter=1000)), ('dt', DecisionTreeClassifier(max_depth=5, random_state=42)), ('svc', SVC(probability=True, random_state=42))], voting='soft' ) for name, model in [('Single Tree', single_tree), ('Bagging', bag), ('RandomForest', rf), ('GBDT', gbdt), ('Voting', vote)]: model.fit(X_train, y_train) acc = accuracy_score(y_test, model.predict(X_test)) print(f"{name}: {acc:.4f}")

这类对比最常见的结论:单棵树最差;Bagging 和随机森林明显超过单棵树;随机森林通常比朴素 Bagging 略好;GBDT 在这个数据上往往是最优或与随机森林持平;投票分类器如果选对模型组合,能接近 GBDT。但这些相对排名会随数据集特征改变,不要当成绝对定律。

更值得关注的是决策边界的变化:单棵树的边界非常毛糙,随机森林的边界平滑很多,GBDT 的边界更细腻。数据越干净、规律越明显,GBDT 的优势越大;数据噪音越多,随机森林的鲁棒性优势越明显。

6.1 训练时间对比

时间维度也不可忽视。同一份数据(2000 个样本)上,我的实测经验大致是:

  • 决策树:几乎瞬时
  • Bagging / 随机森林:秒级,且能并行
  • GradientBoostingClassifier(sklearn 实现):秒级到十秒级
  • LightGBM:比 sklearn 的 GBDT 更快,数据量大时优势更明显

在大数据量上,LightGBM 基本是首选。小数据量上,随机森林这个小而稳的选择也很值得考虑,它几乎是“不需要调参就能用”的代名词。

7. 常见问题与排查技巧实录

集成学习在实践中的坑不少,我把遇到过的典型问题整理成一个速查表,方便你对照排查:

问题现象可能原因排查与解决
集成后效果反而不如单模型基模型太弱或太相似换用不同类型的模型;降低模型间相关性;检查是否有模型主导投票
使用软投票时报错,说模型不支持 predict_proba部分模型(如 SVC)未开启概率输出给 SVC 设置probability=True,或更换为其他支持概率输出的模型
Bagging 训练极慢没有并行化,或树数量过多设置n_jobs=-1;适当降低n_estimators
OOB 分数远低于测试分数数据分布不一致或样本量过小确认训练/测试分布;增加数据;检查oob_score与交叉验证是否指代不同指标
AdaBoost 训练时权重爆炸数据中存在噪声标签清理训练数据;降低学习率;改用梯度提升族模型
随机森林特征重要性前几名的特征意义不大特征之间存在高度共线性做相关性分析,适当剔除冗余特征;重要性不等于因果
GBDT 训练轮数过多导致过拟合学习率设置不当,树数量过多配合早停;降低learning_rate,增加轮数,观察验证分数
LightGBM 特征名有特殊符号导致训练失败特征名包含引号、方括号等特殊字符清理特征名;用数字编号代替字符串特征名

还有一个我踩了不止一次的坑:用 Bagging 之前忘记给基模型设随机种子。Bagging 本身有random_state参数,但基模型的random_state如果没设置,每次训练结果会有细微差异——在小数据集上差异尤其明显,甚至会影响模型选择判断。建议从实验一开始就固定所有随机种子,包括数据划分、模型初始化、采样过程,保证结果可复现。

另一个常见误区是盲目加大n_estimators。很多人以为树越多越好,但边际收益递减,训练时间却线性上涨。更合理的做法是观察 OOB 分数或验证分数随树数量的变化曲线,找到“饱和拐点”,然后在这个点附近选树的数量。我见过有人把随机森林的树加到 5000 棵,性能提升不到 0.1%,纯属浪费算力。

最后提一下模型集成之后的调参顺序。我的习惯是先确定基模型类型和数量,再用交叉验证粗略搜索学习率、最大深度、特征比例这些核心参数,最后才轮到正则化参数。别一开始就搞贝叶斯优化或大规模网格搜索,先用最快的方式找到“合理范围”,再精细调。集成学习模型的参数空间很大,但大部分时候默认参数已经能打 90% 的分,剩下 10% 的提升需要投入大量算力,值得不值得要自己掂量。

集成学习这条路,从投票到 Bagging,从随机森林到 Boosting,本质都是在回答同一个问题:怎么让一堆不够强大的模型,通过结构化的组织方式变得更强大。投票靠的是模型类型的互补,Bagging 和随机森林靠的是样本和特征层面的随机化制造多样性,Boosting 靠的是串行纠错逼近目标。理解了这四种“组织方式”,你在面对具体数据时就能少一点盲目调参,多一点针对性的策略选择。先跑通一份小数据,把四种策略都看一遍,再结合你自己的业务场景做取舍,这个流程走下来,集成学习的基本功就算扎实了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询