【高端局】组合多个弱学习器达到性能跃升的硬核集成算法

今天给大家带来的是「集成算法」的全部整理!

其实今儿的一些内容比较好理解~

目录

1、Bagging(自举汇聚法)

2、Boosting(提升法)

3、Stacking(堆叠法)

4、Voting(投票法)

5、深度学习集成

集成算法(Ensemble Learning)是一种将多个弱学习器组合起来形成一个强大的学习模型的方法。

通过结合多个学习器的预测结果,集成算法能够提升整体的预测性能,并且在泛化能力上通常比单个学习器更好。

下面列举常见的集成算法,先有一个大致的认识:

  • Bagging(自举汇聚法):通过随机从训练集中有放回地抽取样本,构建多个基分类器,并通过投票或平均来进行最终的决策。典型的算法包括随机森林(Random Forest)。

  • Boosting(提升法):按顺序训练一系列的基分类器,每个分类器根据前一个分类器的错误情况对样本权重进行调整。典型的算法包括AdaBoost、Gradient Boosting和XGBoost。

  • Stacking(堆叠法):将多个不同类型的学习器组合起来,其中的元学习器用于融合基学习器的预测结果。通常采用交叉验证的方式来训练。

  • Voting(投票法):基于多数表决规则,将多个独立学习器的预测结果进行投票,选取得票最多的类别作为最终的预测结果。

  • 深度学习集成:深度学习集成是通过结合多个深度学习模型的预测结果来提升整体性能和泛化能力的方法。

集成算法的优势在于,它能够通过结合多个学习器的优点,克服单个学习器的局限性,并提高整体的预测准确性和稳定性。

集成算法还能够减少过拟合的风险,并具备一定的鲁棒性,对噪声数据和异常值的影响相对较小。

然而,在使用集成算法时也需要注意过拟合问题以及计算资源的消耗。

同时,选择适当的弱学习器和合适的集成策略也是至关重要的。

1、Bagging(自举汇聚法)

Bagging 是一种集成学习算法,它的目标是通过组合多个弱分类器来构建一个更强大的分类器。

这个算法的思想有点像"众人拾柴火焰高"的意思。

首先,从训练数据集中随机选择若干个子集,每个子集大小与原始数据集相同,但是可能包含重复的样本。然后,对每个子集使用一个基分类器进行训练,可以是决策树、支持向量机等等。这些基分类器可以并行训练,因为它们之间没有任何依赖关系。

接下来,需要进行预测时,每个基分类器都会对待分类样本进行预测。Bagging通过简单地把所有基分类器的预测结果进行平均或者投票来得出最终的预测结果。这种集成了多个分类器的方法可以减少过拟合的风险,并提高整体的预测准确性。

Bagging 有很多优势,比如它可以降低方差和偏差,并且对于噪声数据的鲁棒性较好。通过使用不同的基分类器和不同的随机子集,Bagging可以在保持模型的复杂度的同时提高预测的准确性。

下面咱们举一个例子:

假设咱们有一个关于花朵的数据集,其中包含花瓣长度、花瓣宽度等特征,以及对应的花的类别(例如玫瑰、郁金香、向日葵等)。希望使用随机森林算法进行分类,并绘制出决策边界的图形。

首先,咱们需要导入必要的库和模块。在下面使用Python实现过程中,使用scikit-learn库来实现随机森林算法,并使用matplotlib库来绘制图形,安装相应的包之后,大家可以直接运行起来。

复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

# 生成一个随机的花朵数据集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0,
                           n_clusters_per_class=1, random_state=42)

# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=10, random_state=42)

# 拟合数据集
rf.fit(X, y)

# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))
Z = rf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.xlabel('Petal Length')
plt.ylabel('Petal Width')
plt.title('Random Forest Decision Boundary')
plt.show()

代码中,生成了一个随机的花朵数据集,并使用RandomForestClassifier创建了一个拥有10颗决策树的随机森林分类器。然后,绘制出决策边界的图形,其中不同的颜色代表不同的类别。

2、Boosting(提升法)

Boosting(提升法)通过反复训练一系列弱学习器(通常是决策树),然后将它们组合成一个强学习器。Boosting的基本思想是对训练样本进行加权,每次训练都关注于之前训练中分类错误的样本,从而逐步减少整体模型的误差。

XGBoost 是 Boosting 算法的一种实现,它结合了Gradient Boosting框架和正则化技术,具有高效、灵活且易于使用的特点,并在许多Kaggle比赛等机器学习任务中取得了很好的表现。

下面是一个使用 XGBoost 进行分类任务的案例,大家可以看看~

复制代码
import xgboost as xgb
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据集
X = np.random.rand(100, 2)  # 特征矩阵
y = np.random.randint(0, 2, size=100)  # 目标变量(二分类)

# 定义XGBoost参数
params = {
    'max_depth': 3,  # 决策树最大深度
    'eta': 0.1,  # 学习率
    'objective': 'binary:logistic'  # 损失函数
}

# 将数据集转换为DMatrix格式
dtrain = xgb.DMatrix(X, label=y)

# 训练XGBoost模型
model = xgb.train(params, dtrain, num_boost_round=10)

# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))
Z = model.predict(xgb.DMatrix(np.c_[xx.ravel(), yy.ravel()]))
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('XGBoost Classifier')
plt.show()

代码中,首先创建了一个示例数据集(两个特征的二分类问题),然后定义了XGBoost的参数。

接下来,使用xgb.DMatrix将数据集转换为XGBoost所需的DMatrix格式,并训练XGBoost模型。最后,通过绘制决策边界的等高线图和散点图,展示了模型在特征空间中的分类效果。

3、Stacking(堆叠法)

Stacking(堆叠法)将多个基学习器结合在一起,使它们的预测结果作为输入来训练一个元学习器。

Stacking的基本思想是通过将不同的模型组合在一起,利用它们各自的优点来提高整体模型的性能。

下面是一个使用Stacking进行分类任务,并结合交叉验证的案例:

复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import cross_val_predict
from sklearn.ensemble import StackingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

# 创建示例数据集
X, y = make_moons(n_samples=100, noise=0.3, random_state=42)

# 定义基学习器
estimators = [
    ('dt', DecisionTreeClassifier()),
    ('knn', KNeighborsClassifier()),
    ('svm', SVC(probability=True))
]

# 定义元学习器
meta_learner = DecisionTreeClassifier()

# 定义Stacking分类器
model = StackingClassifier(estimators=estimators, final_estimator=meta_learner)

# 交叉验证预测
y_pred = cross_val_predict(model, X, y, cv=5, method='predict_proba')

# 绘制分类效果图
plt.scatter(X[:, 0], X[:, 1], c=y_pred[:, 1], cmap='coolwarm')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Stacking Classifier')
plt.show()

代码中,首先使用make_moons函数创建了一个示例数据集,并定义了三个基学习器(决策树、K近邻和支持向量机)和一个元学习器(决策树)。

然后,通过StackingClassifier将它们组合在一起,并设置元学习器为决策树。

接下来,使用cross_val_predict进行交叉验证预测,得到每个样本属于正类的概率。最后,通过绘制散点图,展示了模型在特征空间中的分类效果。

4、Voting(投票法)

Voting(投票法)通过将多个基学习器的预测结果进行投票或取平均来得出最终的预测结果。

Voting通常用于解决分类问题。

下面是一个使用Voting进行分类任务的案例:

复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

# 创建示例数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, random_state=42)

# 定义基学习器
estimators = [
    ('dt', DecisionTreeClassifier()),
    ('knn', KNeighborsClassifier()),
    ('svm', SVC(probability=True))
]

# 定义Voting分类器
model = VotingClassifier(estimators=estimators, voting='soft')

# 交叉验证评估
scores = cross_val_score(model, X, y, cv=5)

# 绘制性能图
plt.bar(range(1, len(scores)+1), scores)
plt.xlabel('Fold')
plt.ylabel('Accuracy')
plt.title('Voting Classifier Performance')
plt.show()

首先使用make_classification函数创建了一个示例数据集,其中包含2个特征。

然后,定义了三个基学习器(决策树、K最近邻和支持向量机)并构建了一个Voting分类器。

使用cross_val_score进行交叉验证评估,并通过绘制柱状图展示每个折叠的准确率。

实际操作中,可能需要对数据进行更详细的预处理和调整模型参数以获得更好的结果。

此外,也可以尝试使用其他类型的基学习器来构建Voting模型,以获得更好的分类性能。

5、深度学习集成

深度学习集成是指将多个深度学习模型组合起来以达到更好的预测性能或泛化能力的算法。

下面直接给出一个简单的图像分类案例、代码和使用场景来说明深度学习集成。

假设有一个图像分类任务,需要将输入的图像分为不同的类别。可以通过训练多个深度学习模型,并将它们的预测结果进行集成来提高分类性能。

复制代码
import numpy as np

# 假设有3个深度学习模型,每个模型输出一个向量作为预测结果
model1_predictions = np.array([0.2, 0.6, 0.2])
model2_predictions = np.array([0.5, 0.3, 0.2])
model3_predictions = np.array([0.1, 0.1, 0.8])

# 简单平均集成:对所有模型的预测结果进行平均
ensemble_predictions = (model1_predictions + model2_predictions + model3_predictions) / 3

# 输出集成后的预测结果
print(ensemble_predictions)

深度学习集成通常使用场景可以总结为:

  • 不同初始化条件:在深度学习中,模型的初始参数会影响其收敛性能和泛化能力。通过训练多个具有不同初始参数的模型,并将它们进行集成,可以减少模型在某些特定初始化条件下的偏差。

  • 不同架构:通过使用不同的深度学习架构,可以捕捉到不同层次的特征。将多个具有不同架构的模型进行集成,可以提高分类或回归任务的性能。

  • 数据增强:数据增强是一种常用的方法,通过对训练数据进行随机变换来扩充数据集。通过训练多个模型,并对它们的预测结果进行集成,可以减少数据增强引入的噪声,提高模型的鲁棒性。

需要注意的是,深度学习集成有时需要更多的计算资源和时间,因为需要训练多个模型并进行集成。另外,集成算法的选择和调优也需要经验和实践。

最后

今天介绍了5个机器学习中关于集成学习的总结,包括Bagging、Boosting、Stacking、Voting、深度学习集成

喜欢的朋友可以收藏、点赞、转发起来!

相关推荐
MegaDataFlowers几秒前
静态/动态代理模式
java·开发语言·代理模式
进击的阿三姐几秒前
AI工作流:用 Claude + Obsidian 打造全自动技术笔记系统
人工智能·ai
早睡早起好好code几秒前
InternNav 论文回看
笔记·python·深度学习·学习·算法
kcuwu.2 分钟前
Python文件操作零基础及进阶
android·服务器·python
傻啦嘿哟3 分钟前
使用 Python 实现 Word 文档文本格式化全解析
开发语言·python·word
Elastic 中国社区官方博客3 分钟前
使用 Elasticsearch Inference API 结合 Hugging Face 模型
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
九硕智慧建筑一体化厂家3 分钟前
能碳 IBMS 集成平台:打破数据孤岛,实现建筑全维度智能管控
人工智能
2501_945424803 分钟前
调试技巧与核心转储分析
开发语言·c++·算法
2501_921649494 分钟前
外汇实时汇率 API | 24 小时 架构设计与实战指南
大数据·python·websocket·金融·restful