机器学习:集成学习(OOB 和 关于 Bagging 的更多讨论)

一、oob(Out - of - Bag)

  • 定义:放回取样导致一部分样本很有可能没有取到,这部分样本平均大约有 37% ,把这部分没有取到的样本称为 oob 数据集
  • 根据这种情况,不对数据集进行 train_test_split,也就是不适用 测试数据集,而使用这部分没有取到的样本做测试 / 验证;

 

 2)oob_score 参数

  • Bagging 取样方式的集成学习算法,可以不对数据集进行 train_test_split ,而是使用 oob 数据集作为验证数据集;
  • oob_score 是 Bagging 取样方式的集成学习算法  BaggingClassifier() 的一个参数:
  1. oob_score = True:表示使用 oob 数据集作为验证数据集;
  2. oob_score 默认为 False,不使用 oob 数据集作为验证数据集;
  3. 可以直接使用 oob_score_ 变量,查看模型在 oob 数据集上的准确率;

 

 3)并行化处理

  • Bagging 取样方式,使得计算机极易进行并行化处理;

  • 原因:对于每一个子模型都是独立的随机抽取训练数据集,而且每个子模型的训练也都是独立的,所有系统可以对所有的子模型并行处理;
  • 在机器学习中,对于所有可以并行处理的算法,都需要对参数 n_jobs 进行确认:
  1. n_jobs = n:程序就会使用服务器的 n 个核,同时进行处理;
  2. n_jobs = -1:使用电脑所有的核;

 

 

二、子模型产生差异化的方式

 1)对样本进行随机取样 

 2)对特征进行随机取样(Random Subspaces)

  • 也就是 n 维的数据集,每次只取 k 维作为样本的特征,形成一个新的数据集;新的数据集的特征空间是原始数据集的特征空间的子空间;(k < n)

 

 3)即针对样本数量,又针对特征进行随机取样(Random Patches)

  • 相当于即随机抽取矩阵每行的数据,又随机抽取矩阵每列的数据,如下图:

 

  • 一般在图像识别领域,采用特征取样的方式;

 

 

三、scikit-learn 中使用特征取样方式

  • 在 scikit-learn 的集成学习算法 BaggingClassifier 中封装了变量,来使用不同的取样方式:
  • 模拟数据集

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)

     

  • 使用 oob

  • bootstrap = True:使用 Bagging 取样方式按样本取样
  • 复制代码
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import BaggingClassifier
    
    bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                   n_estimators=500, max_samples=100, 
                                   bootstrap=True, oob_score=True)
    bagging_clf.fit(X, y)
    bagging_clf.oob_score_
    # 准确率:0.916
    复制代码

     

  • 设置并行处理:n_jobs

    %%time
    bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(),
                                   n_estimators=500, max_samples=100, 
                                   bootstrap=True, oob_score=True,
                                   n_jobs=-1)
    bagging_clf2.fit(X, y)
    # Wall time:2.26 s

     

  • Random Patches 方式:即针对样本数量,又针对特征进行取样;

  • BaggingClassifier() 的参数:

  1. bootstrap = True:表示采用放回的方式对样本进行取样;
  2. max_samples=100表示每次取 100 个样本;
  3. bootstrap_features=True:表示采用放回取样的方式对特征进行取样;
  4. max_features=1:每次给样本取 1 个特征;
    random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),
                                   n_estimators=500, max_samples=100, 
                                   bootstrap=True, oob_score=True,
                                   n_jobs=-1, max_features=1, bootstrap_features=True)
    random_subspaces_clf.fit(X, y)
    random_subspaces_clf.oob_score_
    # 准确率:0.862

     

  • 这种使用 决策树算法集成学习得到的子模型,称为随机森林;

 

posted @   何永灿  阅读(1966)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示