集成学习(Adaboost和Bagging,Randomforest)原理与实现

[集成学习(Adaboost和Bagging,Randomforest)]原理与实现

集成学习(ensemble learning)

基本思想:通过构建并结合多个学习器来完成学习任务,有时也被称为多分类系统(multi-classifier system)/基于委员会的学习等。
集成学习(Adaboost和Bagging,Randomforest)原理与实现_第1张图片
根据个体学习器的生成方式,目前的集成学习方法大致分为两类:
(1)Boosting
个体学习器间存在强依赖关系,必须串行生成的序列化方法。关注降低偏差
(2) Bagging 和 随机森林(Random Forest)
个体学习器不存在强依赖关系,可同时生成的并行化方法。关注降低方差

Boosting

工作机制
1.先从初始训练集训练出一个基学习器(同质集成中的个体学习器的另一种称谓,通俗理解就是个体学习器是同一个类型的);
2.再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到更多关注;
3.然后基于调整后的样本分布来训练下一个基学习器;
4.重复以上步骤,直至基学习器数目达到事先制定的值T;
5.最终将这T个基学习器进行加权结合。
编辑区域与预览区域中间;
Boosting族算法最著名的代表:Adaboost

Adaboost算法

算法原理
输入:
训练集 D={x(i), y(i)} , i =1,2,…,m
基训练器 S(i)
分类器 h(t)
训练轮数T

  1. 初始化样本权值分布 D(x(1)) = 1/m
  2. for t = 1,2,…,T do
  3.  h(t) = S(D, D(t))
    
  4.  训练误差s(t) = P(x~D(t), h(t) != f(x))
    
  5.  if s(t) > 0.5 then break (若当前学习器不满足要求,则当前学习器被抛弃,且学习过程终止)
    
  6.  更新样本分布D(x(t+1))
    
  7. end for
    输出:H(x) = sign()
    Adaboost算法存在的问题
    一旦第5步条件不满足,则当前学习器即被抛弃,且学习器过程停止,学习轮数T也许条件还远未达到,可能最终集成中只包含很少的学习器而性能不佳------早停止
    解决办法
    采用重采(re-sampling), 即在每一轮学习中,根据样本分布对训练集重新采样,再训练。则可获得“重启动”避免早停止。
    代码实现
# 导入库
from sklearn.ensemble import AdaboostClassifier   # 以分类问题为例
from sklearn.tree import DecisionTreeClassifier  # 假定基学习器为决策树
from sklearn.model_selection import GridSearchCV  #自动调参模块
from sklearn.selection import train_test_split  #划分训练集与测试集模块
from sklearn import metrics

# 划分数据集,训练集占80%,测试集占20%,random_state = 1 随机种子,每次划分的数据集是一样的,如果不设值,则每次划分的数据集具有随机性,可能是不同的。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 1)

#搭建并训练基学习器
# max_depth 决策树的最大深度,深度越大,越容易过拟合;criterion 划分原则的选择:基尼系数gini或者信息熵entropy; model.fit()训练学习器
base_model = DecisionTreeClassifier(max_depth=1, criterion = 'gini', random_state=1).fit(x_train, y_train)

# 构建Adaboost模型
# base_estimator 弱学习器,默认为决策树; n_estimators 弱学习器的最大迭代次数,或者说是弱学习器的个数,太小容易欠拟合,太大容易过拟合。实际调参过程中常常和学习率learning_rate一起调。默认为50;learning_rate 模型的学习率,也是每个弱学习器的权重缩减系数。
model = AdaboostClassifier(base_estimator=base_model, n_estimators=50, learning_rate=0.8)

# 训练
model.fit(x_train, y_train)
# 预测
y_pred = model.predict(x_test)
#模型准确率
acc = metrics.accuracy_score(y_test, y_pred)


# 使用 GridSearchCV 实现自动调参(n_estimators & learning_rate)
hyperparameter_space = {'n_estimators':list(range(2,102,2)),
'learning_rate':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,1]}

# 使用准确率作为标准,将得到的准确率最高的参数输出。para_grid 需要优化的参数,值为字典或列表。scoring 模型评价标准。cv=5表示交叉验证参数,这里使用5折交叉验证,n_jobs=-1表示并行数和CPU一致
gs = GridSearchCV(AdaboostClassifier(algorithm='SAMME.R', random_state=1), para_grid=hyperparameter_space, scoring='accuracy', n_jobs=-1, cv=5)
# 训练
gs.fit(x_train, y_train)
# 最优超参数
gs_para = gs.best_params_

Bagging & 随机森林

保持基学习器中的差异性,得到泛化性能强的集成。

Bagging

可不经修改的用于多分类,回归等任务。
采样方式与基本流程
放回抽样,经过m次随机采样操作,得到含m个样本的采样集。
照这样,采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
算法
输入:
训练集D
基学习算法S;
训练轮数T
过程:
1. for t = 1,2,…,T do
2. h(t)=S(D, D(bs) D(bs)是自助采样产生的样本分布
3. end for
输出:
H(x) = argmax()
注意
在对预测输出进行结合时:
分类任务: 简单投票法(相同票数,随机选)
回归任务:简单平均
计算复杂度
基学习器 O(m) 约等于 Bagging复杂度 T(O(m)+O(s)) , 采样O(s)很小
—>Bagging是一个很高效的集成学习算法
代码实现

# 导入包
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.ensemble import BaggingClassifier
import matplotlib.pyplot as plt

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random=1)
base_model = DecisionTreeClassifier(max_depth=1, criterion='gini', random_state=1).fit(x_train, y_train)
model = BaggingClassifier(base_estimator=base_model, n_estimators=50, random_state=1)
model.fit(x_train, y_train)

# 测试估计器器的个数
estimator_num = list(range(2,102,2))
accuracy_list = []
for i in estimator_num:
		model = BaggingClassifier(base_estimator=base_model, n_estimators=i, random_state=1)
		model.fit(x_train, y_train)
		model_auc=accuracy_score(y_test, model.predict(x_test))
		accu_list.append(model_auc)
# 可视化模型准确率随学习器数目的变化情况
plt.style.use('ggplot')
plt.title('effect of n_estimators')
plt.xlabel('number of estimators')
plt.ylabel('accuracy of model')
plt.plot(estimator_num, accu_list)
plt.show()

随机森林(Random Forest, RF)

属于Bagging的一个扩展变体
算法原理
RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程引入了随机属性原则。即在利用信息增益选择属性时,改为先随机选k个子集,再从子集中选最优的。一般:k=log(2,d)
训练效率
随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差,且训练效率常优于Bagging。
代码实现

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=50, random_state=1)  #随机森林的基学习器为决策树
model.fit(x_train, y_train)

# 测试估计器的个数
estimator_num = list(range(2, 102, 2))
accu_list = []
for i in estimator_num:
		model = RandomForestClassifier(n_estimators=i, random_state=1)
		model.fit(x_train, y_train)
		model_accu=accuracy_score(y_test, model.predict(x_test))
		accu_list.append(model_accu)
plt.style.use('ggplot')
plt.title('effect of estimator')
plt.xlabel('number of estimator')
plt.ylabel('accu of model')
plt.plot(estimator_num, accu_list)
plt.show()	

理论参考:《西瓜书》 BY 周志华
代码参考: github:datawhalechina
个人学习笔记

你可能感兴趣的:(机器学习,集成学习,机器学习,python)