一、平行集成 Parallel ensemble learning
Bagging : bootstrap aggregating 的缩写 (有放回采样)在从样本中抽样给classifier 或者predictor来训练集成模型里面的单个模型的时候,这里的采样方式是有放回的。如下图中,假设总样本为9个不同颜色的球,其中红色4个,绿色3个,蓝色两个。现在要从这个样本中抽取两个子集(subset),分别命名为bag1和bag2,在一中抽取的为4个红球,两个蓝球,此时如果不将球放回的话,那么bag2中只能从剩下的三个绿色的球中抽取,bagging是有放回的采样,所以这里相当于还是从原来的总样本中抽取一些球来作为bag2的子集,下图中抽取的是两个蓝球和两个绿球来作为bag2的样本集。
这里一个iteration,就是一个predictor, T个iteration最后结果的平均值。每个predictor里面F%个抽出来训练,剩下的用来test。
Pasting: (无放回采样)
同样的在选取子样本时,和bagging不一样的是,当bag1已经选取好之后,bag2只能从bag1中选取剩下的里面做出选择,因为bag1中采样之后,并没有放回,所以bag2所采样的总体样本中就不存在bag1中已有的样本,bag2只能从剩下的三个绿球中选择。
其中每一个bag的样本会传到一个predictor里面,让predictor计算得出一个结果。如下图所示。
一旦所有的predictor被训练完成,这个集成算法就可以对新的样本进行预测,其预测的结果可以通过简单地汇总所有的预测变量来得到。分类中的典型统计模式通常是使用聚合函数(aggregating function), 回归中通常是使用平均值。
In database management, aggregate function or aggregation function is a function where the values of multiple rows are grouped together to form a single summary value. --wiki
下图也是以bagging的方式采样到predictors的过程。
我们可以通过不同的CPU核甚至不同的服务器平行训练Bagging中的predictors。类似的,也可以平行地做出预测。Scikit-Learn 同时为bagging和pasting提供了简单的API,BaggingClassifier 用来分类,BaggingRegressor用来做回归。
下面我们看一下如何用Scikit Learn实现bagging和pasting。
我们使用的是sklearn.datasets中的make_moons来产生两个交织半圈的数据集(一共有500个samples),如下图所示。
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
X,y=make_moons(n_samples=500,noise=0.3,random_state=42)
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=42)
plt.scatter(X[:,0],X[:,1],c=y)
现在分别使用DecisionTreeClassifier和BaggingClassifier为它们分类,其中BaggingClassifier中里面的basic classifier 为DecisionTreeClassifier。
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
import numpy as np
def visualize_classifier(model, X, y, ax=None, cmap='rainbow'):
ax = ax or plt.gca()
# Plot the training points
ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=cmap,clim=(y.min