目录

集成学习

 Bagging与随机森林

 Bagging介绍

 随机森林

实战——随机森林实现分类 

 Adaboost

Adaboost的原理

 实战——Adaboost + 决策树

 Gradient Boosting

实战——GBDT及其代码实现 

XGBoost 

 实战——XGBoost的sklearn实现

集成学习

 什么是集成学习

集成学习(ensemble learning)本身不是一个单独的机器学习算 法,而是通过构建并结 合多个机器学习模型来完成学习任务——博采众长。集成学习很好 的避免了单一学习模型带 来的过拟合问题。

 集成学习的类型

根据个体学习器的生成方式,目前的集成学习方法大致可分为两 大类:

  • Bagging(个体学习器间不存在强依赖关系、可同时生成的并行化 方法)
  • Boosting(个体学习器间存在强依赖关系、必须串行生成的序列 化方法)

 

 Bagging与随机森林

 Bagging介绍

Bagging是并行式集成学习最著名的代表,它是基于自助采样法 (bootstrap sampling)

自助采样法(bootstrap sampling):

给定包含m个样本的数据集,先随机取出一个样本放入采 样集中并记录,再把该样本放回初始数据集,使得下次采样时 该样本仍有可能被选中,这样,经过m次随机采样操作,我们 得到含m个样本的采样集,初始训练集中有的样本在采样集里 多次出现,有的则从未出现(平均37%没有取到)。

 带外数据OOB(Out of Bag)

自助采样过程导致一部分样本可能没有取到(平均37%没有取到), 这些未取到的样本称为 OOB(Out of Bag),可以使用这部分OOB的数据集作为测试集。

Bagging的基本流程

基于每个采样集训练出一个基学习器,再将这些基学习器进行结 合

  • 对分类任务,使用简单投票法
  • 对回归任务,使用简单平均法

 随机森林

        随机森林(Random Forest,简称RF)是Bagging的一个扩展变体。

        RF在以决策树为基学习器构建Bagging集成的基础上,进一步在 决策树的训练过程中引入了随机属性选择。

        具体来说,传统决策树在选择划分属性时是在当前结点的属性集 合(假定有d个属性) 中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该 结点的属性集合中随机 选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属 性用于划分。这里的参 数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统 决策树相同;若令k=1, 则是随机选择一个属性用于划分;一般情况下,推荐值k=log2d。

实战——随机森林实现分类 

 在sklearn中,使用随机森林算法实现分类的功能使用的是 RandomForestClassifier.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 生成数据集
 
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=555)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,
                               oob_score=True,random_state=666,
                               n_jobs=-1)
rf_clf.fit(X,y)  # 拟合
rf_clf.oob_score_   # 使用OOB数据测试

 Adaboost

Adaboost的原理

        以分类为例,Adaboost算法通过提高前一轮分类器分类错误的 样本的权值,而降低那 些被分类正确的样本的权值。

        需要注意的是,由于每个子模型要使用全部的数据集进行训练, 因此 Adaboost算法中 没有oob数据集,在使用 Adaboost 算法前,需要划分数据集: train_test_split。 

 实战——Adaboost + 决策树

 在使用Adaboost与决策树结合解决分类问题时,使用 AdaBoostClassifier

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 创建数据集
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=666)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
# 创建AdaBoostClassifier对象,结合了AdaBoost提升算法与决策树算法
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),
                            n_estimators=500)
ada_clf.fit(X_train,y_train)  # 在训练集上拟合
ada_clf.score(X_test,y_test)   # 在测试集上测试准确率

 Gradient Boosting

 Gradient Boosting原理

        和Adaboost不同,Gradient Boosting 在迭代的时候选择损失 函数在其梯度方向下降 的方向不停地改进模型。

  • 1 训练一个模型m1,产生错误e1
  • 2 针对e1训练第二个模型m2,产生错误e2
  • 3 针对e2训练第三个模型m3,产生错误e3...
  • 4 最终预测结果是:m1+m2+m3+...

 注意: Adaboost和Gradient Boosting的区别主要在于从不同的角度实 现对上一轮训练错误的数据更多关注,Adaboost主要对数据引 入权重,训练后调整学习错误的数据的权重,从而使得下一轮 学习中给予学习错误的数据更多的关注。

实战——GBDT及其代码实现 

GBDT的组成部分 GBDT由GB(Gradient Boosting)和DT(Regression Decision Tree)组成。

注意: GBDT中的树是回归树(不是分类树),GBDT用来做回归预 测,调整后也可以用于分类

sklearn中的GBDT

在scikit-learn中,GBDT类库包括

  • GradientBoostingClassifier(用于分类)
  • GradientBoostingRegressor(用于回归) 
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=666)
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=666)
from sklearn.ensemble import GradientBoostingClassifier
# 创建GBDT对象,设置树的深度和数量
gb_clf = GradientBoostingClassifier(max_depth=2,n_estimators=30)
gb_clf.fit(X_train,y_train)  # 在训练集上拟合
gb_clf.score(X_test,y_test)  # 在测试集上评测

XGBoost 

XGBoost简介

XGBoost全称是eXtreme Gradient Boosting,可译为极限梯度 提升算法。它由陈天奇 所设计,致力于让提升树突破自身的计算极限,以实现运算快速, 性能优秀的工程目标。 XGBoost已经被认为是在分类和回归上都拥有超高性能的先进评估 器。 

XGBoost原理

XGBoost的基础是梯度提升算法 XGBoost中的预测值是所有弱分类器上的叶子节点权重直接求和 得到 例如:要预测一家人对电子游戏的喜好程度。

 实战——XGBoost的sklearn实现

XGBoost的安装

使用pip直接安装 pip install xgboost

下载相关的whl文件进行安装(https://www.lfd.uci.edu/~gohlk e/pythonlibs/#xgboost)

from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()  # 加载鸢尾花数据集
X = iris.data  # 样本特征
y = iris.target  # 样本标签
 
# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)
from xgboost import XGBClassifier
xgb = XGBClassifier(learning_rate=0.01,
                    n_estimators=10,  # 树的个数
                    max_depth=4   # 树的深度
                    )
xgb.fit(X_train,y_train)  # 在训练集上拟合
xgb.score(X_test,y_test)  # 在测试集上评估分类准确率