一、学习目标
- 了解什么是集成学习
- 了解机器学习中的两个核⼼任务
- 理解Bagging集成原理
- 理解随机森林构造过程
- 掌握RandomForestClassifier的使⽤
- 掌握boosting集成原理和实现过程
- 理解bagging和boosting集成的区别
- 理解AdaBoost集成原理
- 理解GBDT的算法原理
二、集成学习算法简介
2.1 机器学习两大核心任务(回顾)
- 任务一:如何优化训练数据及其目的 --> 目的主要用于解决:欠拟合问题
- 任务二:如何提升泛化能力及其目的 --> 目的主要用于解决:过拟合问题
2.2 什么是集成学习
-
含义:集成学习通过建立几个模型来解决单一预测问题。
-
工作原理:集成学习通过生成多个分类器/模型,各自独立地学习和做出预测。由这些预测结合形成组合预测,该组合预测将优于单个分类器。
-
举例说明:【三个臭皮匠顶个诸葛亮】
-
集成学习的必要性:
集成学习是机器学习中的一种思想,通过组合多个模型(弱学习器/基学习器)来形成一个精度更高的模型。训练时,依次使用训练集训练出这些弱学习器,预测时则联合这些弱学习器进行预测。
-
用代码来说明:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets # 数据集:使用生成500个样本点,噪声参数设为0.3,随机种子固定为42保证可复现性。 # 数据特点:生成的双月牙形数据集具有明显非线性特征,噪声设置使分类更具挑战性。 X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42) # 绘制图像 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=42)
-
使用逻辑回归算法:分类器1
from sklearn.linear_model import LogisticRegression log_clf = LogisticRegression() log_clf.fit(X_train,y_train) log_clf.score(X_test,y_test)
0.864
-
使用SVM支撑向量机:作为分类器2
from sklearn.svm import SVC svm_clf = SVC() svm_clf.fit(X_train,y_train) svm_clf.score(X_test,y_test)
0.896
-
使用决策树算法:作为分类器3
from sklearn.tree import DecisionTreeClassifier dt_clf = DecisionTreeClassifier() dt_clf.fit(X_train,y_train) dt_clf.score(X_test,y_test)
0.856
-
算法预测及投票(少数服从多数)
-
投票机制:将三个模型的预测结果相加,则判定为1类,否则为0类。
-
技术细节:使用将布尔结果显式转换为整型,保证后续计算一致性。
log_clf_predict = log_clf.predict(X_test) svm_clf_predict = svm_clf.predict(X_test) dt_clf_predict = dt_clf.predict(X_test)
log_clf_predict[:10]
array([1, 0, 0, 1, 1, 1, 0, 0, 0, 0], dtype=int64)
svm_clf_predict[:10]
array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0], dtype=int64)
dt_clf_predict[:10]
array([1, 0, 1, 1, 1, 1, 0, 0, 0, 0], dtype=int64)
-
-
投票:
将三个模型的预测结果相加,则判定为1类,否则为0类。# 将三个模型的预测结果相加,则判定为1类,否则为0类。 y_predict = np.array((log_clf_predict + svm_clf_predict + dt_clf_predict)>=2,dtype='int') y_predict[:10]
array([1, 0, 0, 1, 1, 1, 0, 0, 0, 0])
# 计算模型准确度 from sklearn.metrics import accuracy_score accuracy_score(y_test,y_predict)
0.912
-
集成效果:投票集成后的准确率达到90.4%,超过所有单一模型表现。
-
提升原理:通过算法间的误差互补,降低了过拟合风险,增强模型鲁棒性。
-
使用sklearn中的VotingClassifier(Hard Voting)
from sklearn.ensemble import VotingClassifier voting_clf = VotingClassifier(estimators=[ ("log_clf",LogisticRegression()), ("svm_clf",SVC()), ("dt_clf",DecisionTreeClassifier()) ],voting='hard') voting_clf.fit(X_train,y_train)
voting_clf.score(X_test,y_test)
0.912
-
参数配置:
- estimators : 接收包含(名称,模型实例)元组的列表,示例包含逻辑回归、SVM和决策树
- voting: 表示使用硬投票(直接比较类别标签)
-
验证结果:接口实现的集成分类器准确率与手动实现完全一致(90.4%)
-
优化建议:实际应用中应先对各个基模型进行调参优化,再组合使用。
-
使用sklearn中的VotingClassifier(soft Voting)
voting_clf2 = VotingClassifier(estimators=[ ("log_clf",LogisticRegression()), ("svm_clf",SVC(probability=True)), # 使用概率 ("dt_clf",DecisionTreeClassifier(random_state=666)) ],voting='soft') voting_clf2.fit(X_train,y_train)
voting_clf2.score(X_test,y_test)
0.904
2.3 集成学习中Boosting(提升法)、Bagging(自助聚集法)和Stacking(堆叠法)
2.3.1 Boosting(提升算法)
-
含义:
Boosting 是一种通过迭代训练弱学习器,逐步提升模型预测能力的集成学习方法。
其核心思想是:让后续的弱学习器重点关注前序模型预测错误的样本,通过加权调整样本或学习器的权重,最终将多个弱学习器按权重组合成一个强学习器。
通俗来说:Boosting通过知错能改的迭代机制,将弱学习器逐步升级为强学习器,适合需要高精度的场景,但需注意过拟合风险(可通过正则化、早停等控制)。
-
产生背景:
- 弱学习器(如决策树桩)通常简单且预测能力有限,但计算成本低。
- 如何通过组合弱学习器提升性能?Boosting 通过自适应迭代,让每个新学习器聚焦于前序模型的缺陷,从而 “循序渐进” 地优化整体效果。
-
解决的问题:
- 分类与回归问题:通过迭代优化,提升模型对复杂数据分布的拟合能力。
- 欠拟合到过拟合的平衡:弱学习器本身不易过拟合,Boosting 通过调整权重避免单一模型的偏差,同时通过组合降低方差。
-
现实意义:
- 高精度模型构建:在结构化数据(如金融风控、医疗诊断)中表现优异,典型算法如 AdaBoost、Gradient Boosting(GBM)、XGBoost、LightGBM 已成为工业界标准工具。
- 可解释性增强:通过特征重要性分析(如 XGBoost 的 feature_importance),帮助理解数据中的关键驱动因素。
- 处理不平衡数据:通过调整样本权重,提升对少数类的识别能力(如 AdaBoost 的权重机制)。
-
实现方式:
- 迭代训练:
- 初始化样本权重(通常均匀分布)。
- 训练第ttt个弱学习器,计算其在训练集上的错误率ete_tet。
- 根据错误率调整样本权重:预测错误的样本权重增加,正确的减少。
- 根据弱学习器的表现分配权重αt\alpha_tαt(错误率越低,权重越高)。
- 重复步骤2-4,直至满足停止条件(如学习器数量达到上限)。
- 组合方式:最终模型为弱学习器的加权和,即
f(x)=∑t=1Tαtht(x)f(x) = \sum_{t=1}^T \alpha_t h_t(x)f(x)=∑t=1Tαtht(x)
(分类问题通常通过符号函数或投票决策,回归问题直接求和)。 - 典型算法:
- AdaBoost:通过指数损失函数调整样本权重。
- Gradient Boosting:利用梯度下降原理,将损失函数的负梯度作为残差,训练弱学习器拟合残差。
- 迭代训练:
2.3.2 Bagging(自助聚集算法)
-
1. 含义
Bagging(Bootstrap Aggregating)是一种通过自助采样(Bootstrap,统计学上称之为放回取样)生成多个独立训练集,并行训练弱学习器,最终通过投票或平均组合结果的集成方法。其核心思想是:利用样本随机性降低模型方差,提升泛化能力。
通俗来讲:Bagging通过“集体智慧”的并行机制,利用样本和特征的随机性降低方差,适合泛化能力优先、可并行计算的场景。
-
2. 产生背景
- 单一模型(如决策树)易受训练数据波动影响,导致方差较大(过拟合)。
- Bootstrap采样(有放回抽样)可生成多个不同的训练子集,减少模型对特定样本的依赖。
-
3. 解决的问题
- 降低模型方差:通过并行训练多个独立模型,平均化各自的预测偏差,避免单一模型过拟合。
- 处理高维数据:在特征维度较高时(如图像、文本),通过随机子空间(Random Subspace)进一步降低方差(如随机森林)。
-
4. 实际意义
- 简单高效的泛化能力:典型算法如随机森林(Random Forest)在结构化数据和非结构化数据中均表现稳定,且无需复杂调参。
- 并行计算支持:由于各学习器独立训练,可利用多核计算加速,适合大规模数据。
- 特征重要性评估:通过随机森林的OOB(袋外数据)或排列重要性,可量化特征对预测的贡献。
-
5. 实现方式
- 自助采样:
- 从原始数据集DDD中有放回地随机采样nnn个样本(nnn为原始样本数),生成TTT个独立训练集{ D1,D2,…,DT}\{D_1, D_2, \dots, D_T\}{ D1,D2,…,DT}。
- 每个训练集DtD_tDt训练一个弱学习器ht(x)h_t(x)ht(x)。
- 组合方式:
- 分类问题:通过多数投票(Majority Voting)确定最终类别。
- 回归问题:通过简单平均或加权平均得到预测值。
- 扩展:随机森林(Random Forest)
在Bagging基础上,对每个弱学习器(决策树)进一步引入特征随机采样:- 每次分裂时,从全部特征中随机选择kkk个特征(k≪总特征数k \ll \text{总特征数}k≪总特征数)作为候选分裂特征。
- 进一步增强学习器的独立性,降低方差。
- 自助采样:
-
6. 举例代码实现
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets # 数据集:使用生成500个样本点,噪声参数设为0.3,随机种子固定为42保证可复现性。 # 数据特点:生成的双月牙形数据集具有明显非线性特征,噪声设置使分类更具挑战性。 X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42) # 绘制图像 plt.scatter(X[y==0,0], X[y==0,1]) plt.scatter(X[y==1,0], X[y==1,1]) plt.show()