目录
集成学习
Bagging与随机森林
Bagging介绍
随机森林
实战——随机森林实现分类
Adaboost
Adaboost的原理
实战——Adaboost + 决策树
Gradient Boosting
实战——GBDT及其代码实现
XGBoost
实战——XGBoost的sklearn实现
什么是集成学习
集成学习(ensemble learning)本身不是一个单独的机器学习算 法,而是通过构建并结 合多个机器学习模型来完成学习任务——博采众长。集成学习很好 的避免了单一学习模型带 来的过拟合问题。
集成学习的类型
根据个体学习器的生成方式,目前的集成学习方法大致可分为两 大类:
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算法中 没有oob数据集,在使用 Adaboost 算法前,需要划分数据集: train_test_split。
在使用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原理
和Adaboost不同,Gradient Boosting 在迭代的时候选择损失 函数在其梯度方向下降 的方向不停地改进模型。
注意: Adaboost和Gradient Boosting的区别主要在于从不同的角度实 现对上一轮训练错误的数据更多关注,Adaboost主要对数据引 入权重,训练后调整学习错误的数据的权重,从而使得下一轮 学习中给予学习错误的数据更多的关注。
GBDT的组成部分 GBDT由GB(Gradient Boosting)和DT(Regression Decision Tree)组成。
注意: GBDT中的树是回归树(不是分类树),GBDT用来做回归预 测,调整后也可以用于分类
sklearn中的GBDT
在scikit-learn中,GBDT类库包括
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全称是eXtreme Gradient Boosting,可译为极限梯度 提升算法。它由陈天奇 所设计,致力于让提升树突破自身的计算极限,以实现运算快速, 性能优秀的工程目标。 XGBoost已经被认为是在分类和回归上都拥有超高性能的先进评估 器。
XGBoost原理
XGBoost的基础是梯度提升算法 XGBoost中的预测值是所有弱分类器上的叶子节点权重直接求和 得到 例如:要预测一家人对电子游戏的喜好程度。
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) # 在测试集上评估分类准确率