目 录

  • Boosting方法
  • AdaBoost算法
  • AdaBoost案例

Bagging的核心是bootstrap,得到几组不同的训练数据集,主要通过降低 方差来减少预测误差;
Boosting则是对同一组数据集反复学习,得到一系列简单模型,再组合这些模型,主要通过不断减少 偏差。

Boosting方法

概率近似正确(Probably Approximately Correct,PAC) 学习的框架下:

  • 弱可学习:存在准确率仅比随机猜测略高的多项式学习算法
  • 强可学习:存在准确率很高的多项式学习算法

在PAC学习的框架下,强可学习和弱可学习是等价的。
弱可学习算法比强可学习算法容易得多。
提升方法从弱可学习算法出发,反复学习,得到一系列弱分类器,然后对其进行组合,构成一个强分类器。

大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。

AdaBoost算法

  • 如何改变训练数据的权值或概率分布?
    提高被前一轮弱分类器错误分类的样本的权值,降低被正确分类样本的权值;
  • 如何组合弱分类器?
    加权多数表决的方法,加大分类误差率小的弱分类器的权值,减小分类误差率大的弱分类器的权值。

Adaboost算法如下:

AdaBoost案例

UCI机器学习库里的开源数据集:葡萄酒数据集
包含173个样本和13个特征,预测红酒属于哪个类别(案例来源《python机器学习(第二版》)

数据集下载

import pandas as pd
wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data",header=None)
wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash','Magnesium', 'Total phenols','Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins','Color intensity', 'Hue','OD280/OD315 of diluted wines','Proline']
wine.head()

  • Class label:分类标签

13维特征的含义:

  • Alcohol:酒精
  • Malic acid:苹果酸
  • Ash:灰
  • Alcalinity of ash:灰的碱度
  • Magnesium:镁
  • Total phenols:总酚
  • Flavanoids:黄酮类化合物
  • Nonflavanoid phenols:非黄烷类酚类
  • Proanthocyanins:原花青素
  • Color intensity:色彩强度
  • Hue:色调
  • OD280/OD315 of diluted wines:稀释酒OD280 OD350
  • Proline:脯氨酸
print("Class labels",np.unique(wine["Class label"]))

Class labels [1 2 3]
共有三类,label为1,2,3

数据预处理

# 去掉label=1,变为一个二分类问题
# 只取两个特征
wine = wine[wine['Class label']!=1]
y = wine['Class label'].values
X = wine[['Alcohol','OD280/OD315 of diluted wines']].values
# X (119,2)# 将分类标签变成二进制编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)#label变为0和1# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1,stratify=y)
# stratify参数代表了按照y的类别等比例抽样

使用单一决策树建模

DecisionTreeClassifier() 相关参数

  • criterion:gini(基尼系数,default)或entropy(信息熵)
  • splitter:best(在所有特征中找最好的切分点)或random(在部分特征中找)。默认为‘best’,适合样本量不大的时候,样本量大时,推荐‘random’
  • max_depth:树的最大深度,若为None,则为不作限制
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=1)
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('train/test accuracies %.3f/%.3f.' % (tree_train,tree_test))


AdaBoost,以决策树为基分类器
AdaBoostClassifier() 相关参数

  • best_estimator:默认为DecisionTreeClassifier(max_depth=1)
  • n_estimators:终止迭代的次数,默认是50次。过大,模型容易过拟合;过小,模型容易欠拟合。
  • learning_rate:学习率,默认为1。过大,容易错过最优值;过小,收敛速度慢。与n_estimators做一个权衡。
  • algorithm:训练的相关算法,
  • random_state
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=1)
ada = ada.fit(X_train,y_train)
y_train_pred = ada.predict(X_train)
y_test_pred = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
print('train/test accuracies %.3f/%.3f.' % (ada_train,ada_test))


Adaboost的训练和测试accuracy都比单层决策树要高。

单层决策树与Adaboost的决策边界

x_min = X_train[:, 0].min() - 1
x_max = X_train[:, 0].max() + 1
y_min = X_train[:, 1].min() - 1
y_max = X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
f, axarr = plt.subplots(nrows=1, ncols=2,sharex='col',sharey='row',figsize=(12, 6))
for idx, clf, tt in zip([0, 1],[tree, ada],['Decision tree', 'Adaboost']):clf.fit(X_train, y_train)Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)axarr[idx].contourf(xx, yy, Z, alpha=0.3)axarr[idx].scatter(X_train[y_train==0, 0],X_train[y_train==0, 1],c='blue', marker='^')axarr[idx].scatter(X_train[y_train==1, 0],X_train[y_train==1, 1],c='red', marker='o')axarr[idx].set_title(tt)
axarr[0].set_ylabel('Alcohol', fontsize=12)
plt.tight_layout()
plt.text(0, -0.2,s='OD280/OD315 of diluted wines',ha='center',va='center',fontsize=12,transform=axarr[1].transAxes)
plt.show()


Adaboost的决策边界比单层决策树要复杂,Adaboost用增加模型复杂度、降低偏差的方式去减少总误差,但引入了方差,可能会导致过拟合。
Boosting的每一步迭代都基于上一步的基分类器,因此无法并行计算。

参考资料:

  1. DataWhale开源资料
  2. 《统计学习方法》李航
  3. https://www.bilibili.com/video/BV1xK411c7wt
  4. 【报告】Boosting 25年(2014周志华)https://www.bilibili.com/video/BV1Cs411c7Zt?from=search&seid=1529306599377675374
  5. Adaboost:https://link.medium.com/udXDrLndAfb
  6. 清华大学【数据挖掘:集成学习】:https://www.bilibili.com/video/BV1mt411a7FT?p=3&spm_id_from=333.788.b_6d756c74695f70616765.3

DataWhale集成学习(中)——Task09提升(Boosting)方法和Adaboost相关推荐

  1. 图解集成学习中的梯度提升思想

    摘要: 本文讲述集成学习中的梯度提升方法的思想,以简单算术及图片的形式展示整个过程,一看就懂! 简介 机器学习(ML)中的一个关键步骤是选择适合数据的最佳算法,根据数据中的一些统计数据和可视化信息,机 ...

  2. 集成学习中的Boosting和Bagging

    集成学习是一大类模型融合策略和方法的统称,其中包含多种集成学习的思想. Boosting Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖. 它的基本思路是将基分类器层层叠加, ...

  3. (七)集成学习中-投票法Voting

    集成学习第一法宝:投票! 参考:DataWhale教程链接 集成学习(上)所有Task: (一)集成学习上--机器学习三大任务 (二)集成学习上--回归模型 (三)集成学习上--偏差与方差 (四)集成 ...

  4. [白话解析] 通俗解析集成学习之bagging,boosting 随机森林

    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...

  5. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 可以通过聚集多个分类器的预测结果提高分类器的分类准确率,这一方法称为集成(Ensemble)学习或分类器组合(Classifier C ...

  6. 机器学习(九):集成学习(bagging和boosting),随机森林、XGBoost、AdaBoost

    文章目录 一.什么是随机森林? 1.1 定义 1.2 目的 1.3 随机森林 VS bagging 二.集成学习 2.1 定义 2.2 决策树的问题 2.3 袋装法概念与理论 2.4 装袋法的优缺点 ...

  7. 【组队学习】【23期】Datawhale集成学习(上)

    集成学习(上) 开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/IntegratedLearn ...

  8. 集成学习中的随机森林

    摘要:随机森林是集成算法最前沿的代表之一.随机森林是Bagging的升级,它和Bagging的主要区别在于引入了随机特征选择. 本文分享自华为云社区<集成学习中的随机森林>,原文作者:ch ...

  9. python的matmul_浅谈keras中的batch_dot,dot方法和TensorFlow的matmul

    概述 在使用keras中的keras.backend.batch_dot和tf.matmul实现功能其实是一样的智能矩阵乘法,比如A,B,C,D,E,F,G,H,I,J,K,L都是二维矩阵,中间点表示 ...

最新文章

  1. 马化腾很受伤 后果很严重
  2. python中的seth函数_Python入门——turtle库的使用
  3. php设置accept,PHP或htaccess通过Accept-Language重写URL?
  4. 前端学习(2502):vue指令v-if
  5. 我们可以覆盖Java中的main()方法吗?
  6. ambari 修改服务器名,Ambari修改主页面方法
  7. MUI 如何更改单选框样式
  8. 集成CAS单点登录 决策系统的配置以及注意事项
  9. JAVA b2b2c多用户商城系统源码-服务发现服务端EurekaServer微服务
  10. 5导出word_妙招技法 | 教你如何快速导出Word文档中的图片
  11. 阿里云祝顺民:云网络心智大图解读 | 云栖大会
  12. 韦东山linux嵌入式学习之路
  13. PHP常用函数大全500+
  14. java离线地图web
  15. mp4box 编译与常用命令
  16. ABBYY FineReader 15 PDF文档查看功能
  17. UE4-使用WebBrowser插件打开720云全景图
  18. 通过S2B2C供应链电商平台网站解决方案,实现大宗商品万亿产业数字化转型
  19. 那些花儿(吉他版) --朴树
  20. DNS解析超时排查/etc/resolv.conf single-request-reopen参数说明

热门文章

  1. ashx 后台 解析json_Jquery Ajax Json ashx 实现前后台数据传输
  2. linux 服务 init3,Linux系统启动过程详解之UpStart init(三)
  3. vue项目实现屏幕自适应
  4. 3.28工作心得:事事有交代,件件有着落,事事有回音
  5. 几行代码,轻松下载全球股票数据
  6. 网页怎么截长屏?好用的方法分享介绍
  7. 17.C语言进阶——深度理解指针
  8. Pandas数据预处理|数据清理
  9. 洛谷3953:逛公园——题解
  10. ESP32-C3入门教程 基础篇②——GPIO口输入,按键的长按和短按