机器学习之集成学习

发布于:2025-09-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、集成学习基础

1.核心定义

        集成学习是机器学习中的重要思想,通过组合多个弱学习器(性能略优于随机猜测的模型,如简单决策树),构建出精度更高、泛化能力更强的强学习器。训练时按特定策略依次训练弱学习器,预测时通过弱学习器联合决策输出结果。

2.核心优势:“弱者联盟”vs“超级个体”

        超级个体:如高次多项式模型,单模型拟合能力强,但易过拟合(对训练数据过度适配,测试数据表现差)。

        弱者联盟:组合多个简单弱学习器(如一次函数、浅层决策树),既能通过协同提升整体性能,又因弱学习器复杂度低,有效降低过拟合风险。

3.两大核心分类

        集成学习主要分为BaggingBoosting两类,二者在数据采样、训练顺序、投票方式上差异显著,具体对比如下表:

对比维度 Bagging(并行集成) Boosting(串行集成)
数据采样 有放回抽样(Bootstrap)生成多个独立训练集 全量样本参与训练,但根据前一轮模型误差调整样本权重(错分样本权重升高)
投票方式 平权投票(分类任务)/ 简单平均(回归任务) 加权投票(分类)/ 加权平均(回归),性能好的弱学习器权重更高
学习顺序 弱学习器可并行训练(无依赖关系) 弱学习器串行训练(后一个模型依赖前一个模型的误差调整)
代表算法 随机森林 AdaBoost、GBDT、XGBoost、LightGBM
核心目标 降低方差(减少过拟合,提升泛化能力) 降低偏差(提升模型拟合能力,修正前序模型误差)

二、Bagging代表:随机森林

1.算法本质

        基于 Bagging 思想,以CART 决策树为弱学习器,通过 "数据随机 + 特征随机" 双重随机性进一步降低过拟合风险。

2.构建步骤

        (1)数据随机采样:对原始训练集进行有放回抽样(Bootstrap),生成多个不同的子训练集(每个子集中约 63.2% 原始样本,未被采样的 "袋外样本" 可用于无监督验证)。

        (2)特征随机选择:每个弱决策树训练时,从总特征中随机选取部分特征(默认取√总特征数),仅用选中特征构建树。

        (3)训练弱学习器:用每个子训练集 + 对应随机特征集,训练一个 CART 决策树(默认不剪枝,依赖集成效果控制过拟合)。

        (4)基础决策:分类任务通过所有弱学习器平权投票(少数服从多数),回归任务通过所有弱学习器预测值平均,得到最终结果。

3.关键问题解析

        (1)为何有放回抽样?

                若无放回抽样,各弱学习器训练集完全无交集,会导致每个模型 "偏置过大"(仅学习部分数据特征);有放回抽样使训练集既有交集(保证基础一致性)又有差异(引入多样性),更易通过投票发挥集成效果。

        (2)为何随机选特征?

                若全量特征训练,各决策树易因 "强特征主导"(如分类任务中区分度极高的特征)导致结果趋同,集成失去意义;随机选特征强制引入多样性,让每个弱学习器关注不同特征,提升集成鲁棒性。

4.sklearnAPI与关键参数

        核心API:sklearn.ensemble.RandomForestClassifier(分类)/ RandomForestRegressor(回归)

关键参数:

        n_estimators:弱学习器(决策树)数量,默认 100,需适中(过少易欠拟合,过多增加计算成本无明显收益)。

        max_depth:决策树最大深度,默认 None(不限制),建议手动设置(如 3-10),防止单棵树过拟合。

        min_samples_split:节点分裂所需最小样本数,默认 2,样本量大时可增大(如 5-10),减少冗余分裂。

        min_samples_leaf:叶子节点最小样本数,默认 1,过小易捕捉噪声,建议设为 5-20。

        random_state:随机种子,保证实验可复现。

三、Boosting代表1:AdaBoost(自适应提升)

1.核心思想

        基于 "自适应修正" 策略,通过逐步提升错分样本权重,让后续弱学习器聚焦前序模型的误差,最终通过加权集成形成强学习器。

2.构建步骤(以二分类为例)

(1).初始化样本权重:假设训练集有 N 个样本,每个样本初始权重w_i = 1/N(权重均等)

(2).迭代训练弱学习器:

        用当前权重的训练集训练 1 个弱学习器(常用浅层决策树,如深度为 1 的 "决策桩")。

        计算该弱学习器的错误率ε = Σ(w_i * I(h(x_i)≠y_i))I为指示函数,预测错误则为 1)

        计算弱学习器权重α = 0.5 * log((1-ε)/ε):错误率越低,α越大,模型在集成中权重越高。

(3).集成预测:对新样本,计算所有弱学习器预测值的加权和H(x) = sign(Σ(α_h * h(x)))sign函数将结果映射为 ±1(二分类标签)。

3.关键特性与注意事项

        适用场景:主要用于二分类(视觉领域应用广泛,如人脸检测),多分类需扩展(如 One-Vs-Rest)。

        过拟合风险:弱学习器复杂度需控制(如决策树深度设为 1-3),过深易过拟合;learning_rate(学习率,默认 1.0)可调节权重更新幅度,过小需更多弱学习器,过大易震荡。

        SklearnAPI:sklearn.ensemble.AdaBoostClassifier,核心参数base_estimator(弱学习器类型,默认决策树)、n_estimators(弱学习器数量)、learning_rate

四、Boosting代表2:GBDT(梯度提升决策树)

1.核心思想:从“拟合残差”到“拟合负梯度”

        提升树基础:传统提升树通过拟合残差(真实值 - 前序模型预测值)构建弱学习器,如预测年龄 100 岁:

        第1 轮预测 80 岁,残差 20 岁;第 2 轮拟合残差预测 16 岁,残差 4 岁;第 3 轮拟合残差预测 3.2 岁,总预测 80+16+3.2=99.2 岁,逐步逼近真实值。

        GBDT改进:不再直接拟合残差,而是拟合损失函数的负梯度(将残差推广到任意损失函数)。对平方损失(回归),负梯度等价于残差;对对数损失(分类),负梯度为 "伪残差",适配更多任务场景。

2.构建步骤(以回归任务为例)

        初始化弱学习器:用训练集目标值的均值作为初始预测值(f_0(x) = mean(y)),最小化初始损失。

        迭代训练弱学习器(共M轮):

                计算负梯度(残差近似):r_im = -∂L(y_i, f(x_i))/∂f(x_i)L为损失函数,如平方损失L=(y-f(x))²,则r_im = y_i - f_{m-1}(x_i))。

                用r_im作为新目标值,训练 CART 决策树h_m(x)(弱学习器)。

                计算树的叶子节点最优输出值(最小化损失):对叶子节点jw_j = -Σ(r_im)/Σ(h''(x_i))h''为损失函数二阶导,平方损失下h''=2,简化为w_j = mean(r_im))。

                更新强学习器:f_m(x) = f_{m-1}(x) + ν * h_m(x)ν为学习率,默认 0.1,防止过拟合)。

                最终预测:f_M(x) = f_0(x) + ν * Σ(h_m(x))

3.关键特性与sklearnAPI

        弱学习器限制:仅支持 CART 决策树(回归树 / 分类树),需控制树深度(max_depth=3-5),避免过拟合。

        核心APIsklearn.ensemble.GradientBoostingClassifier(分类)/ GradientBoostingRegressor(回归)。

五、Boosting进阶:XGBoost(极端梯度提升)

1.核心定位于改进

XGBoost 是 GBDT 的工程化改进版本,因高效性、鲁棒性,成为数据挖掘竞赛 "王牌算法",核心改进包括:

        加入正则化项:控制模型复杂度,降低过拟合。

        支持二阶泰勒展开:更精准近似目标函数,提升收敛速度。

        工程优化:支持并行特征分裂、缺失值自动处理、树剪枝策略,训练效率更高。

2.目标函数与正则化

基本目标函数:Obj(θ) = ΣL(y_i, f(x_i)) + ΣΩ(f_k)

        L(y_i, f(x_i)):损失函数(如平方损失、对数损失),衡量预测值与真实值的误差。

        Ω(f_k):第 k 棵树的复杂度正则化项,Ω(f_k) = γT + 0.5λ||w||²,其中:

                T:树的叶子节点数量,γ(gamma)控制叶子节点数量(γ越大,越难生成新叶子,树越简单)。

                W:叶子节点输出值向量,λ(lambda)控制w的 L2 正则化(减小w波动,提升泛化)。

二阶泰勒展开近似:

迭代训练第 t 棵树时,前 t-1 棵树的预测值f_{t-1}(x_i)视为常数,对损失函数L(y_i, f_{t-1}(x_i) + h_t(x_i))做二阶泰勒展开:

L ≈ L(y_i, f_{t-1}(x_i)) + g_i h_t(x_i) + 0.5 h_i h_t(x_i)²

        g_i=∂L/∂f_{t-1}(x_i):损失函数一阶导(梯度)。

        h_i= ∂²L/∂f_{t-1}(x_i)²:损失函数二阶导(海森矩阵对角线元素)。

        消去常数项后,目标函数简化为:Obj(t) ≈ Σ(g_i h_t(x_i) + 0.5 h_i h_t(x_i)²) + γT + 0.5λ||w||²

叶子节点最优输出与目标函数最小值:

        对树的叶子节点 j,聚合该节点所有样本的g_ih_i(记为G_j = Σg_iH_j = Σh_i),则叶子节点最优输出w_j = -G_j/(H_j + λ),代入目标函数得最小值:Obj(t) = -0.5Σ(G_j²/(H_j + λ)) + γT

3.数分裂策略:打分函数(Gain)

         XGBoost 通过计算分裂增益判断节点是否分裂,公式为:
Gain = 0.5[G_L²/(H_L + λ) + G_R²/(H_R + λ) - (G_L+G_R)²/(H_L+H_R + λ)] - γ      

        G_L/H_L:左子树样本一阶导 / 二阶导总和,G_R/H_R:右子树对应值。

        分裂条件:若Gain > 0,分裂后目标函数降低,可分裂;否则不分裂。

        停止分裂条件:达到最大深度(max_depth)、叶子节点样本数低于阈值(min_child_weight)、Gain ≤ 0等。

4.常见误区与练习解析

(1)XGBoost 只能用决策树做弱学习器?

错误。XGBoost 支持线性模型(booster='gblinear'),可用于高维稀疏数据(如推荐系统)。

(2)gamma对树结构无影响?

错误。gamma是叶子节点生成的 "代价",gamma越大,需分裂增益越高,树越简单。

六、四大算法核心对比与使用场景

算法 集成策略 核心优势 核心劣势 适用场景
随机森林 Bagging(并行) 抗过拟合能力强、训练速度快 对噪声数据敏感、可解释性差 分类 / 回归任务通用,尤其适合高维数据(如图像特征)、工业质检
AdaBoost Boosting(串行) 对简单数据拟合效果好 对异常值敏感、易过拟合 二分类任务(如人脸检测、垃圾邮件识别)、低维数据
GBDT Boosting(串行) 拟合精度高、支持多任务 训练速度慢、对参数敏感 回归任务(如房价预测)、分类任务(如用户流失预测)
XGBoost Boosting(串行) 精度最高、鲁棒性强、支持并行优化 调参复杂、内存消耗大 数据挖掘竞赛、高价值业务场景(如金融风控、推荐系统)

七、集成学习关键扩展知识点

1.弱学习器选择原则

        多样性优先:弱学习器需具备 "互补性",如随机森林用决策树(树间差异通过数据 / 特征随机保证),AdaBoost 用决策桩(简单模型易产生差异)。

        复杂度适中:弱学习器不能过强(如深度 10 的决策树),否则单模型易过拟合,集成失去意义;也不能过弱(如随机猜测),否则需极多模型才能提升性能。

        常见弱学习器:决策树(最常用,易实现、可处理非线性)、线性模型(适合高维数据)、SVM(小样本场景)。

2.超参数调优核心思路

        调优顺序:先调核心参数(如弱学习器数量n_estimators),再调结构参数(如树深度max_depth),最后调正则化参数(如lambdagamma)。

        工具选择:1.网格搜索(GridSearchCV):适合参数范围小、维度低的场景,遍历所有组合,结果稳定。2.随机搜索(RandomizedSearchCV):适合参数范围大、维度高的场景,随机采样组合,效率更高。

        关键参数优先级:

                随机森林:n_estimators > max_depth > min_samples_leaf

      XGBoost:eta(学习率)> n_estimators > max_depth > gamma > lambda

3.避免过拟合的使用技巧

   数据层面:

        增加训练数据(如数据增强、爬虫补充),减少数据噪声(如异常值检测、缺失值合理填充)。

                      分层抽样(尤其分类任务),避免样本分布不均导致模型偏向多数类。

        模型层面:

                        Bagging类:增加n_estimators(但需平衡计算成本),限制单棵树深度(max_depth)。

                        Boosting类:降低学习率eta(配合增加n_estimators),增加正则化参数(lambdagamma),限制树深度。

        验证层面:

                        用K 折交叉验证(如 5 折、10 折)替代简单 train-test 分割,避免因数据划分偶然导致的过拟合误判。

                        监控验证集损失,若验证集损失上升而训练集损失下降,及时停止训练(早停策略,XGBoost 支持early_stopping_rounds)。

4.集成学习的工程化注意事项

并行训练优化:

        随机森林:天然支持并行(各树独立训练),可通过n_jobs=-1调用所有 CPU 核心加速。

        XGBoost:虽为串行集成,但特征分裂时支持并行(预计算特征排序),可通过tree_method='hist'(直方图优化)提升速度。

内存管理:

        处理超大规模数据时,可采用分块训练(如 XGBoost 的subsample参数,采样部分数据训练每棵树),或使用轻量级模型(如 LightGBM,基于直方图的梯度提升,内存消耗仅为 XGBoost 的 1/10)。

可解释性提升:

        特征重要性:随机森林 / XGBoost 均支持输出特征重要性(如feature_importances_属性),可用于特征筛选、业务解释。

        可视化工具:用graphviz绘制单棵决策树,用 SHAP 值(SHapley Additive exPlanations)解释模型预测结果(尤其金融、医疗等需可解释性的场景)。


网站公告

今日签到

点亮在社区的每一天
去签到