集成学习
什么是集成学习
集成学习(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) # 在测试集上评估分类准确率