Boosting
- 创业
- 2025-09-19 10:45:03

Boosting 学习目标 知道boosting集成原理和实现过程知道bagging和boosting集成的区别知道AdaBoost集成原理
Boosting思想 Boosting思想图 每一个训练器重点关注前一个训练器不足的地方进行训练通过加权投票的方式,得出预测结果串行的训练方式 1 什么是boosting 随着学习的积累从弱到强 简而言之:每新加入一个弱学习器,整体能力就会得到提升 代表算法:Adaboost,GBDT,XGBoost,LightGBM Bagging&Boosting对比
bagging
boosting
数据采样
对数据进行有放回的采样训练
全部样本,根据前一轮学习结果调整数据的重要性
投票方式
所有学习器平权投票
对学习器进行加权投票
学习顺序
并行的,每个学习器没有依赖关系
串行,学习有先后顺序
2 实现过程: 1.训练第一个学习器 2.调整数据分布 3.训练第二个学习器 4.再次调整数据分布 5.依次训练学习器,调整数据分布 6.整体过程实现 3 bagging与boosting的区别 区别一:数据方面 Bagging:对数据进行采样训练;Boosting:根据前一轮学习结果调整数据的重要性。 区别二:投票方面 Bagging:所有学习器平权投票;Boosting:对学习器进行加权投票。 区别三:学习顺序 Bagging的学习是并行的,每个学习器没有依赖关系;Boosting学习是串行,学习有先后顺序。 区别四:主要作用 Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差)Boosting主要用于提高训练精度 (解决欠拟合,也可以说降低偏差) 4 AdaBoost介绍 4.1 Adaboost算法推导 1 初始化训练数据 权重相等,训练第 1 个学习器 如果有 100 个样本,则每个样本的初始化权重为:1/100 根据预测结果找一个错误率最小的分裂点,计算、更新:样本权重、模型权重 2 根据新权重的样本集训练第 2 个学习器 根据预测结果找一个错误率最小的分裂点计算、更新:样本权重、模型权重 3 迭代训练在前一个学习器的基础上,根据新的样本权重训练当前学习 器直到训练出 m 个弱学习器 4 m 个弱学习器集成预测公式: α 为模型的权重,输出结果大于 0 则归为正类,小于 0 则归为负类。 5 模型权重计算公式: 6 样本权重计算公式: 4.2 关键点剖析 如何确认投票权重? 如何调整数据分布? 4.3 案例介绍 给定下面这张训练数据表所示的数据,假设弱分类器由xv产生,其阈值v使该分类器在训练数据集上的分类误差率最低,试用Adaboost算法学习一个强分类器。 问题解答: 构建第一个弱学习器 初始化工作:初始化 10 个样本的权重,每个样本的权重为:0.1构建第一个基学习器:a.寻找最优分裂点
- 1.对特征值 x 进行排序,确定分裂点为:0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5 - 2.当以 0.5 为分裂点时,有 5 个样本分类错误,错误率5/10 - 3.当以 1.5 为分裂点时,有 4 个样本分类错误,错误率4/10 - 4.当以 2.5 为分裂点时,有 3 个样本分类错误,错误率3/10 - 5.当以 3.5 为分裂点时,有 4 个样本分类错误,错误率4/10 - 6.当以 4.5 为分裂点时,有 5 个样本分类错误,错误率5/10 - 7.当以 5.5 为分裂点时,有 4 个样本分类错误,错误率4/10 - 8.当以 6.5 为分裂点时,有 5 个样本分类错误,错误率5/10 - 9.当以 7.5 为分裂点时,有 4 个样本分类错误,错误率4/10 - 10.当以 8.5 为分裂点时,有 3 个样本分类错误,错误率3/10 - 11.最终,选择以 2.5 作为分裂点(出现相同概率的情况使用奥卡姆剃刀选择最简单的情况),计算得出基学习器错误率为:3/10=0.3
b.计算模型权重: 1/2 * np.log((1-0.3)/0.3)=0.4236 (numpy中的计算公式np.log)
c.更新样本权重 - 1.分类正确样本为:1、2、3、4、5、6、10 共 7 个,其计算公式为:,则正确样本权重变化系数为:e-0.4236 = 0.6547
- 2.分类错误样本为:7、8、9 共 3 个,其计算公式为:
,则错误样本权重变化系数为:e0.4236 = 1.5275
- 3.样本 1、2、3、4、5、6、10 权重值为:0.06547 新的权重=权重系数*旧权重值,这里是0.1 - 4.样本 7、8、9 的样本权重值为:0.15275 - 5.归一化 Zt 值为:0.06547 * 7 + 0.15275 * 3 = 0.9165(所有新的权重和) - 6.样本 1、2、3、4、5、6、10 最终权重值为(正样本权重/归一化值): 0.07143 - 7.样本 7、8、9 的样本权重值为(负样本权重/归一化值):0.1667
d.此时得到:
构建第二个弱学习器1.寻找最优分裂点:
对特征值 x 进行排序,确定分裂点为:0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5当以 0.5 为分裂点时,有 5 个样本分类错误,错误率为:0.07143 * 2 +0.16667 * 3= 0.64287当以 1.5 为分裂点时,有 4 个样本分类错误,错误率为:0.07143 * 1 + 0.16667 * 3 = 0.57144 当以 2.5 为分裂点时,有 3 个样本分类错误,错误率为:0.16667 * 3 = 0.57144。。。 。。。当以 8.5 为分裂点时,有 3 个样本分类错误,错误率为:0.07143 * 3 = 0.21429最终,选择以 8.5 作为分裂点,计算得出基学习器错误率为:0.214292.计算模型权重:1/2 * np.log((1-0.21429)/0.21429)=0.64963
3.分类正确的样本:1、2、3、7、8、9、10,其权重调整系数为:0.5222
4.分类错误的样本:4、5、6,其权重调整系数为:1.9148
5.分类正确样本权重值:
a.样本 0、1、2、、9 为:0.0373
b.样本 6、7、8 为:0.087
6.分类错误样本权重值:0.1368
7.归一化 Zt 值为:0.0373 * 4 + 0.087 * 3 + 0.1368 * 3 = 0.8206
8.最终权重:
a.样本 0、1、2、9 为 :0.0455
b.样本 6、7、8 为:0.1060
c.样本 3、4、5 为:0.1667
此时得到:
构建第三个弱学习器 错误率:0.1820,模型权重:0.7514 强学习器 4.4 api from sklearn.ensemble import AdaBoostClassifier api链接:AdaBoostClassifier — scikit-learn 1.6.1 documentation4.5 LabelEncoder标签标准化 LabelEncoder 是一个用于将标签标准化为从 0 到 n_classes-1 的值的工具,通常用于机器学习中的分类任务。它属于 sklearn.preprocessing 模块,可以将类别标签转换为整数编码,以便于模型处理。 以下是如何使用 LabelEncoder 的基本示例: from sklearn.preprocessing import LabelEncoder # 创建一个 LabelEncoder 对象 le = LabelEncoder() # 假设我们有一些类别标签 labels = ['cat', 'dog', 'mouse', 'cat', 'dog'] # 使用 fit_transform 方法将标签转换为整数编码 encoded_labels = le.fit_transform(labels) print(encoded_labels) # 输出: [0 1 2 0 1] # 如果需要将整数编码转换回原始标签,可以使用 inverse_transform 方法 original_labels = le.inverse_transform(encoded_labels) print(original_labels) # 输出: ['cat' 'dog' 'mouse' 'cat' 'dog'] LabelEncoder 会根据类别标签的首次出现顺序为每个类别分配一个整数标签。以下是对输出 [0 1 2 0 2] 的详细解释: 解释 [0 1 2 0 2]: 0:表示类别标签 'cat'。在输入列表 ['cat', 'dog', 'bird', 'cat', 'bird'] 中,'cat' 是第一个出现的类别标签,因此被分配了整数标签 0。1:表示类别标签 'dog'。'dog' 是第二个出现的类别标签,因此被分配了整数标签 1。2:表示类别标签 'bird'。'bird' 是第三个出现的类别标签,因此被分配了整数标签 2。 过程 首次出现顺序: LabelEncoder 会根据类别标签在输入数据中首次出现的顺序进行编码。在这个例子中,'cat' 首次出现,所以被编码为 0;'dog' 第二个出现,所以被编码为 1;'bird' 第三个出现,所以被编码为 2。 重复标签: 如果某个类别标签在输入数据中多次出现,它会被分配相同的整数标签。例如,'cat' 在输入列表中出现了两次,都被编码为 0;'bird' 也出现了两次,都被编码为 2 4.6 AdaBoost实战葡萄酒数据 需求:已知葡萄酒数据,根据数据进行葡萄酒分类 葡萄酒分为白葡萄酒和红葡萄酒两类。 该分析涉及白葡萄酒,并基于数据集中显示的13个变量/特征:固定酸度,挥发性酸度,柠檬酸,残留糖,氯化物,游离二氧化硫,总二氧化硫,密度,pH值,硫酸盐,酒精,质量等。为了评估葡萄酒的质量,我们提出的方法就是根据酒的物理化学性质与质量的关系,找出高品质的葡萄酒具体与什么性质密切相关,这些性质又是如何影响葡萄酒的质量。 1 读数据到内存# 2 特征处理 2-1 修改列名 2-2 Adaboost一般做二分类 去掉一类(1,2,3) 2-4 类别转化 (2,3)=>(0,1) 2-5 划分数据 3 实例化单决策树 实例化Adaboost-由500颗树组成 4 单决策树训练和评估 5 AdaBoost训练和评估 # 获取数据 import pandas as pd df_wine = pd.read_csv('data/wine.data') # 修改列名 df_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'] # 去掉一类(1,2,3) df_wine = df_wine[df_wine['Class label'] != 1] # 获取特征值和目标值 X = df_wine[['Alcohol', 'Hue']].values y = df_wine['Class label'].values from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split # 类别转化 (2,3)=>(0,1) le = LabelEncoder() y = le.fit_transform(y) # 划分训练集和测试集 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=1) from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier # 机器学习(决策树和AdaBoost) tree = DecisionTreeClassifier(criterion='entropy',max_depth=1,random_state=0) ada= AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=0) from sklearn.metrics import accuracy_score # 决策树和AdaBoost分类器性能评估 # 决策树性能评估 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('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test)) # Decision tree train/test accuracies 0.845/0.854 # AdaBoost性能评估 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('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test)) # Adaboost train/test accuracies 1/0.875 总结:AdaBosst预测准确了所有的训练集类标,与单层决策树相比,它在测试机上表现稍微好一些。单决策树对于训练数据过拟合的程度更加严重一些。总之,我们可以发现Adaboost分类器能够些许提高分类器性能,并且与bagging分类器的准确率接近. 5 小结 什么是Boosting 【知道】 随着学习的积累从弱到强代表算法:Adaboost,GBDT,XGBoost,LightGBM bagging和boosting的区别【知道】 区别一:数据方面 Bagging:对数据进行采样训练;Boosting:根据前一轮学习结果调整数据的重要性。 区别二:投票方面 Bagging:所有学习器平权投票;Boosting:对学习器进行加权投票。 区别三:学习顺序 Bagging的学习是并行的,每个学习器没有依赖关系;Boosting学习是串行,学习有先后顺序。 区别四:主要作用 Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差)Boosting主要用于提高训练精度 (解决欠拟合,也可以说降低偏差) AdaBoost构造过程【知道】 步骤一:初始化训练数据权重相等,训练第一个学习器;步骤二:AdaBoost反复学习基本分类器;步骤三:对m个学习器进行加权投票