目录
- 关于
- [1 个体与集成](#1 个体与集成)
- [2 Boosting](#2 Boosting)
- [3 Bagging与随机森林](#3 Bagging与随机森林)
- [4 结合策略](#4 结合策略)
- [5 多样性](#5 多样性)
- [X 案例代码](#X 案例代码)
-
- [X.1 分类任务-Adaboost-SVM](#X.1 分类任务-Adaboost-SVM)
-
- [X.1.1 源码](#X.1.1 源码)
- [X.1.2 数据集(鸢尾花数据集)](#X.1.2 数据集(鸢尾花数据集))
- [X.1.3 模型效果](#X.1.3 模型效果)
- [X.2 分类任务-随机森林RF](#X.2 分类任务-随机森林RF)
-
- [X.2.1 源码](#X.2.1 源码)
- [X.2.2 数据集(鸢尾花数据集)](#X.2.2 数据集(鸢尾花数据集))
- [X.2.3 模型效果](#X.2.3 模型效果)
关于
- 本文是基于西瓜书(第八章)的学习记录。内容包括个体学习和集成学习,集成学习介绍了Boosting方法、Bagging方法和随机森林。还讲解了集成学习的结合策略、多样性分析等等,文章附Python实现源码。
- 西瓜书电子版:百度网盘分享链接
1 个体与集成
- 集成学习通过构建并结合多个学习器来完成任务,有时也被称为多分类器系统或基于委员会的学习等。
- 集成学习通过结合多个个体学习器来获得比单一学习器更优越的泛化性能。
- 同质集成与异质集成
- 同质集成:集成的是同种类型的个体学习器
- 异质集成:集成的是不同类型的个体学习器
- 基学习器:同质集成中的个体学习器也称"基学习器",相应的学习算法称为"基学习算法"
- 获得好的集成的关键:个体学习器应"好而不同" ,即个体学习器要有一定的"准确性",即学习器不能太坏,并且要有"多样性",即学习器间具有差异。事实上,如何产生好而不同的个体学习器是研究集成学习的核心。
- 集成学习方法分类:
- 个体学习器间存在强依赖关系、必须串行生成的序列化方法,代表是Boosting。
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表是Bagging和随机森林。
- 弱学习器
- 弱学习器的性能略优于随机猜测
2 Boosting
- Boosting是一族可以将弱学习器提升为强学习器的算法。这族算法的工作机制类似:
- 从初始训练集训练出一个基学习器
- 根据基学习器的表现对训练样本分布进行调整
- 重复进行直至基学习器数目达到指定值T
- 最终将这T个基学习器进行加权结合
- Boosting算法要求基学习器能对特定的数据分布进行学习
- 重赋权法:在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重
- 重采样法:对无法接受带权样本的基学习算法,可在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练
3 Bagging与随机森林
-
Bagging和随机森林是并行式集成学习方法,通过从原始训练集中采样产生不同的子集来训练基学习器。
-
为了使基学习器具有明显差异,一种可能的做法是对训练样本进行采样 ,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。但是为了保证基学习器效果不是太差,可以使用相互有交叠的子集。
-
Bagging
- 使用自助采样法(采样后放回袋子,样本可能被重复采集)产生多个训练样本子集
- 每个子集训练出一个基学习器
- 在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法.
- 训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,
- 与标准AdaBoost只适用于二分类任务不同,Bagging能不经修改地用于多分类、回归等任务.
- 自助采样时包外样本的用处:当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险.
-
随机森林
- RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择:在选择最佳划分属性时,先随机选择k个属性构成子集,然后从中找到最佳属性 ,这里k控制了随机性的引入程度。推荐 k = log 2 d k=\log_2d k=log2d
- 通过样本扰动和属性扰动增加基学习器的多样性
- 随机森林简单、容易实现、计算开销小,令人惊奇的是,它在很多现实任务中展现出强大的性能,被誉为"代表集成学习技术水平的方法"
4 结合策略
集成学习中的结合策略是将多个基学习器的预测结果结合起来以提高整体性能。
-
数值型输出:平均法
- 简单平均法:直接计算所有基学习器预测结果的平均值
- 加权平均法:根据基学习器的权重计算加权平均值
- 加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠。加权平均法未必一定优于简单平均法
- 在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法
-
分类型输出:投票法
- 绝对多数投票法:得票过半数的类别作为预测结果,否则拒绝预测,这在可靠性要求较高的学习任务中是一个很好的机制
- 相对多数投票法:得票最多的类别作为预测结果
- 加权投票法:根据基学习器的权重进行投票
- 虽然分类器估计出的类概率值一般都不太准确,但基于类概率进行结合却往往比直接基于类标记进行结合性能更好.
-
学习法:Stacking
- 当训练数据很多时,一种更为强大的结合策略是使用"学习法",即通过另一个学习器来进行结合
- 我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器
- Stacking先从初始数据集训练出初级学习器,然后"生成" 一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记
5 多样性
-
误差分歧分解:个体学习器准确性越高、多样性越大,则集成越好。
- 误差(E):个体学习器误差的加权均值。
- 分歧(A):个体学习器的加权分歧值。
- 集成的泛化误差: E = E ‾ − A ‾ E=\overline{E}-\overline{A} E=E−A,该式明确提示出:个体学习器准确性越高、多样性越大,则集成越好。
-
多样性度量
-
不合度量:
dis = (b+c) / m
- 值越大表示多样性越大。
-
相关系数(Correlation Coefficient):
p_ij = (ad - bc) / sqrt((a+b)(a+c)(c+d)(b+d)))
- 值为0表示分类器无关,正值表示正相关,负值表示负相关。
-
Q-统计量(Q-Statistic):
Q = (ad - bc) / (ad + bc)
- 与相关系数符号相同,但值域更宽。
-
K-统计量(K-Statistic):
K = (P1 - P2) / (1 - P2)
- 其中P1是两个分类器取得一致的概率,P2是两个分类器偶然达成一致的概率。
-
-
多样性增强
-
数据样本扰动:
- 通过自助采样等方法从初始数据集中产生不同的数据子集,训练出不同的个体学习器。
- 数据样本扰动法对"不稳定基学习器"效果好
- 不稳定基学习器:对训练样本敏感,如决策树和神经网络。
- 稳定基学习器:线性学习器、支持向量机、朴素贝叶斯、k 近邻学习器
-
输入属性扰动:
- 从初始属性集中抽取出若干个属性子集,基于每个属性子集训练一个基学习器。
- 对包含大量冗余属性的数据,在子空间中训练个体学习器不仅能产生多样性大的个体,还会因属性数的减少而大幅节省时间开销
-
输出表示扰动:
- 对训练样本的类标记稍作变动,如"翻转法"随机改变一些训练样本的标记。
-
算法参数扰动:
- 通过随机设置不同的参数,产生差别较大的个体学习器,如神经网络的隐层数量和神经元数量
-
X 案例代码
X.1 分类任务-Adaboost-SVM
X.1.1 源码
python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns
# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')
# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')
# 3. 构建SVM基分类器并应用AdaBoost算法
base_svc = SVC(kernel='linear', probability=True, random_state=42) # 使用线性核并启用概率预测
model = AdaBoostClassifier(estimator=base_svc, n_estimators=50, random_state=42)
model.fit(X_train, y_train)
# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)
# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))
# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset (AdaBoost with SVM)')
plt.tight_layout()
plt.show()
# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({
'Actual': y_test,
'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.1.2 数据集(鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()
函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.1.3 模型效果
X.2 分类任务-随机森林RF
X.2.1 源码
python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns
# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')
# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')
# 3. 构建并训练随机森林分类模型
model = RandomForestClassifier(n_estimators=100, random_state=42) # 使用100棵树的随机森林
model.fit(X_train, y_train)
# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)
# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))
# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset (Random Forest)')
plt.tight_layout()
plt.show()
# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({
'Actual': y_test,
'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.2.2 数据集(鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()
函数来加载这个数据集,并查看其详细信息。
- 可以使用