zoukankan      html  css  js  c++  java
  • 机器学习:集成学习(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
    • 这种使用 决策树算法集成学习得到的子模型,称为随机森林;
  • 相关阅读:
    construction of tuples containing 0 or 1 items
    globals()
    __new__
    ubuntu系统安装mysql登陆提示 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题
    ubuntu系统更新源
    Python Web开发问题收集(二)
    linux后台执行./run.py提示python syntax error near unexpected token `('
    linux下执行scrapy的爬虫定时任务
    ubuntu系统中crontab的使用介绍
    JMeter BeanShell断言使用
  • 原文地址:https://www.cnblogs.com/volcao/p/9488113.html
Copyright © 2011-2022 走看看