一、oob(Out - of - Bag)
- 定义:放回取样导致一部分样本很有可能没有取到,这部分样本平均大约有 37% ,把这部分没有取到的样本称为 oob 数据集;
- 根据这种情况,不对数据集进行 train_test_split,也就是不适用 测试数据集,而使用这部分没有取到的样本做测试 / 验证;
2)oob_score 参数
- Bagging 取样方式的集成学习算法,可以不对数据集进行 train_test_split ,而是使用 oob 数据集作为验证数据集;
- oob_score 是 Bagging 取样方式的集成学习算法 BaggingClassifier() 的一个参数:
- oob_score = True:表示使用 oob 数据集作为验证数据集;
- oob_score 默认为 False,不使用 oob 数据集作为验证数据集;
- 可以直接使用 oob_score_ 变量,查看模型在 oob 数据集上的准确率;
3)并行化处理
-
Bagging 取样方式,使得计算机极易进行并行化处理;
- 原因:对于每一个子模型都是独立的随机抽取训练数据集,而且每个子模型的训练也都是独立的,所有系统可以对所有的子模型并行处理;
- 在机器学习中,对于所有可以并行处理的算法,都需要对参数 n_jobs 进行确认:
- n_jobs = n:程序就会使用服务器的 n 个核,同时进行处理;
- 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() 的参数:
- bootstrap = True:表示采用放回的方式对样本进行取样;
- max_samples=100:表示每次取 100 个样本;
- bootstrap_features=True:表示采用放回取样的方式对特征进行取样;
- 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
- 这种使用 决策树算法集成学习得到的子模型,称为随机森林;