【机器学习】集成学习算法及实现过程

一、学习目标

  • 了解什么是集成学习
  • 了解机器学习中的两个核⼼任务
  • 理解Bagging集成原理
  • 理解随机森林构造过程
  • 掌握RandomForestClassifier的使⽤
  • 掌握boosting集成原理和实现过程
  • 理解bagging和boosting集成的区别
  • 理解AdaBoost集成原理
  • 理解GBDT的算法原理

二、集成学习算法简介

2.1 机器学习两大核心任务(回顾)

  • 任务一:如何优化训练数据及其目的 --> 目的主要用于解决:欠拟合问题
  • 任务二:如何提升泛化能力及其目的 --> 目的主要用于解决:过拟合问题

2.2 什么是集成学习

  • 含义:集成学习通过建立几个模型来解决单一预测问题。

  • 工作原理:集成学习通过生成多个分类器/模型,各自独立地学习和做出预测。由这些预测结合形成组合预测,该组合预测将优于单个分类器。

  • 举例说明:【三个臭皮匠顶个诸葛亮】
    在这里插入图片描述

  • 集成学习的必要性:

    集成学习是机器学习中的一种思想,通过组合多个模型(弱学习器/基学习器)来形成一个精度更高的模型。训练时,依次使用训练集训练出这些弱学习器,预测时则联合这些弱学习器进行预测。
    在这里插入图片描述

  • 用代码来说明:

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    # 数据集:使用生成500个样本点,噪声参数设为0.3,随机种子固定为42保证可复现性。
    # 数据特点:生成的双月牙形数据集具有明显非线性特征,噪声设置使分类更具挑战性。
    X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
    
    # 绘制图像
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()
    

    在这里插入图片描述

  • 数据集划分:测试集和训练集

    from sklearn.model_selection import train_test_split
    
    X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
    
  • 使用逻辑回归算法:分类器1

    from sklearn.linear_model import LogisticRegression
    
    log_clf = LogisticRegression()
    log_clf.fit(X_train,y_train)
    log_clf.score(X_test,y_test)
    

    0.864

  • 使用SVM支撑向量机:作为分类器2

    from sklearn.svm import SVC
    
    svm_clf = SVC()
    svm_clf.fit(X_train,y_train)
    svm_clf.score(X_test,y_test)
    

    0.896

  • 使用决策树算法:作为分类器3

    from sklearn.tree import DecisionTreeClassifier
    
    dt_clf = DecisionTreeClassifier()
    dt_clf.fit(X_train,y_train)
    dt_clf.score(X_test,y_test)
    

    0.856

  • 算法预测及投票(少数服从多数)

    • 投票机制:将三个模型的预测结果相加,则判定为1类,否则为0类。

    • 技术细节:使用将布尔结果显式转换为整型,保证后续计算一致性。

      log_clf_predict = log_clf.predict(X_test)
      svm_clf_predict = svm_clf.predict(X_test)
      dt_clf_predict = dt_clf.predict(X_test)
      
      log_clf_predict[:10]
      

      array([1, 0, 0, 1, 1, 1, 0, 0, 0, 0], dtype=int64)

      svm_clf_predict[:10]
      

      array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0], dtype=int64)

      dt_clf_predict[:10]
      

      array([1, 0, 1, 1, 1, 1, 0, 0, 0, 0], dtype=int64)

  • 投票:
    将三个模型的预测结果相加,则判定为1类,否则为0类。

    # 将三个模型的预测结果相加,则判定为1类,否则为0类。
    y_predict = np.array((log_clf_predict + svm_clf_predict + dt_clf_predict)>=2,dtype='int')
    y_predict[:10]
    

    array([1, 0, 0, 1, 1, 1, 0, 0, 0, 0])

    # 计算模型准确度
    from sklearn.metrics import accuracy_score
    
    accuracy_score(y_test,y_predict)
    

    0.912

  • 集成效果:投票集成后的准确率达到90.4%,超过所有单一模型表现。

  • 提升原理:通过算法间的误差互补,降低了过拟合风险,增强模型鲁棒性。

  • 使用sklearn中的VotingClassifier(Hard Voting)

    from sklearn.ensemble import VotingClassifier
    
    voting_clf = VotingClassifier(estimators=[
        ("log_clf",LogisticRegression()),
        ("svm_clf",SVC()),
        ("dt_clf",DecisionTreeClassifier())
    ],voting='hard')
    
    voting_clf.fit(X_train,y_train)
    

    在这里插入图片描述

    voting_clf.score(X_test,y_test)
    

    0.912

  • 参数配置

    • estimators : 接收包含(名称,模型实例)元组的列表,示例包含逻辑回归、SVM和决策树
    • voting: 表示使用硬投票(直接比较类别标签)
  • 验证结果:接口实现的集成分类器准确率与手动实现完全一致(90.4%)

  • 优化建议:实际应用中应先对各个基模型进行调参优化,再组合使用。

  • 使用sklearn中的VotingClassifier(soft Voting)

    voting_clf2 = VotingClassifier(estimators=[
        ("log_clf",LogisticRegression()),
        ("svm_clf",SVC(probability=True)), # 使用概率
        ("dt_clf",DecisionTreeClassifier(random_state=666))
    ],voting='soft')
    
    voting_clf2.fit(X_train,y_train)
    

    在这里插入图片描述

    voting_clf2.score(X_test,y_test)
    

    0.904

2.3 集成学习中Boosting(提升法)、Bagging(自助聚集法)和Stacking(堆叠法)

2.3.1 Boosting(提升算法)
  • 含义

    Boosting 是一种通过迭代训练弱学习器逐步提升模型预测能力的集成学习方法。

    核心思想是:让后续的弱学习器重点关注前序模型预测错误的样本,通过加权调整样本或学习器的权重,最终将多个弱学习器按权重组合成一个强学习器

    通俗来说:Boosting通过知错能改迭代机制,将弱学习器逐步升级为强学习器,适合需要高精度的场景,但需注意过拟合风险(可通过正则化、早停等控制)。
    在这里插入图片描述

  • 产生背景

    • 弱学习器(如决策树桩)通常简单且预测能力有限,但计算成本低。
    • 如何通过组合弱学习器提升性能?Boosting 通过自适应迭代,让每个新学习器聚焦于前序模型的缺陷,从而 “循序渐进” 地优化整体效果。
  • 解决的问题

    • 分类与回归问题:通过迭代优化,提升模型对复杂数据分布的拟合能力。
    • 欠拟合到过拟合的平衡:弱学习器本身不易过拟合,Boosting 通过调整权重避免单一模型的偏差,同时通过组合降低方差。
  • 现实意义

    • 高精度模型构建:在结构化数据(如金融风控、医疗诊断)中表现优异,典型算法如 AdaBoost、Gradient Boosting(GBM)、XGBoost、LightGBM 已成为工业界标准工具。
    • 可解释性增强:通过特征重要性分析(如 XGBoost 的 feature_importance),帮助理解数据中的关键驱动因素。
    • 处理不平衡数据:通过调整样本权重,提升对少数类的识别能力(如 AdaBoost 的权重机制)。
  • 实现方式

    • 迭代训练
      1. 初始化样本权重(通常均匀分布)。
      2. 训练第ttt个弱学习器,计算其在训练集上的错误率ete_tet
      3. 根据错误率调整样本权重:预测错误的样本权重增加,正确的减少。
      4. 根据弱学习器的表现分配权重αt\alpha_tαt(错误率越低,权重越高)。
      5. 重复步骤2-4,直至满足停止条件(如学习器数量达到上限)。
    • 组合方式:最终模型为弱学习器的加权和,即
      f(x)=∑t=1Tαtht(x)f(x) = \sum_{t=1}^T \alpha_t h_t(x)f(x)=t=1Tαtht(x)
      (分类问题通常通过符号函数或投票决策,回归问题直接求和)。
    • 典型算法
      • AdaBoost:通过指数损失函数调整样本权重。
      • Gradient Boosting:利用梯度下降原理,将损失函数的负梯度作为残差,训练弱学习器拟合残差。
2.3.2 Bagging(自助聚集算法)
  • 1. 含义
    Bagging(Bootstrap Aggregating)是一种通过自助采样(Bootstrap,统计学上称之为放回取样)生成多个独立训练集,并行训练弱学习器,最终通过投票或平均组合结果的集成方法。

    其核心思想是:利用样本随机性降低模型方差,提升泛化能力

    通俗来讲:Bagging通过“集体智慧”的并行机制,利用样本和特征的随机性降低方差,适合泛化能力优先、可并行计算的场景。
    在这里插入图片描述

  • 2. 产生背景

    • 单一模型(如决策树)易受训练数据波动影响,导致方差较大(过拟合)。
    • Bootstrap采样(有放回抽样)可生成多个不同的训练子集,减少模型对特定样本的依赖。
  • 3. 解决的问题

    • 降低模型方差:通过并行训练多个独立模型,平均化各自的预测偏差,避免单一模型过拟合。
    • 处理高维数据:在特征维度较高时(如图像、文本),通过随机子空间(Random Subspace)进一步降低方差(如随机森林)。
  • 4. 实际意义

    • 简单高效的泛化能力:典型算法如随机森林(Random Forest)在结构化数据和非结构化数据中均表现稳定,且无需复杂调参。
    • 并行计算支持:由于各学习器独立训练,可利用多核计算加速,适合大规模数据。
    • 特征重要性评估:通过随机森林的OOB(袋外数据)或排列重要性,可量化特征对预测的贡献。
  • 5. 实现方式

    • 自助采样
      1. 从原始数据集DDD中有放回地随机采样nnn个样本(nnn为原始样本数),生成TTT个独立训练集{ D1,D2,…,DT}\{D_1, D_2, \dots, D_T\}{ D1,D2,,DT}
      2. 每个训练集DtD_tDt训练一个弱学习器ht(x)h_t(x)ht(x)
    • 组合方式
      • 分类问题:通过多数投票(Majority Voting)确定最终类别。
      • 回归问题:通过简单平均加权平均得到预测值。
    • 扩展:随机森林(Random Forest)
      在Bagging基础上,对每个弱学习器(决策树)进一步引入特征随机采样
      • 每次分裂时,从全部特征中随机选择kkk个特征(k≪总特征数k \ll \text{总特征数}k总特征数)作为候选分裂特征。
      • 进一步增强学习器的独立性,降低方差。
  • 6. 举例代码实现

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    # 数据集:使用生成500个样本点,噪声参数设为0.3,随机种子固定为42保证可复现性。
    # 数据特点:生成的双月牙形数据集具有明显非线性特征,噪声设置使分类更具挑战性。
    X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
    
    # 绘制图像
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT喂嘟盲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值