首页 > 编程语言 >【耗时8个小时整理】硬核集成算法,学习完你会哭着感谢自己!

【耗时8个小时整理】硬核集成算法,学习完你会哭着感谢自己!

时间:2024-06-04 13:02:30浏览次数:31  
标签:集成 分类器 plt 学习 耗时 算法 np import 硬核

纯  干  货

目录

纯  干  货

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、深度学习集成

标签:集成,分类器,plt,学习,耗时,算法,np,import,硬核
From: https://blog.csdn.net/CKissjy/article/details/139439918

相关文章

  • 程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!
    纯 干 货目录纯 干 货1线性支持向量机2非线性支持向量机3多类别支持向量机4核函数支持向量机5稀疏支持向量机6核贝叶斯支持向量机7不平衡类别支持向量机在这之前咱们已经接触了各个算法的优缺点的总结,以及8个回归类算法、7个正则化......
  • 代码随想录算法训练营第二十四天 | 回溯算法 77.组合
    回溯算法理论基础文章讲解视频讲解回溯是递归的副产品,只要有回溯就会有递归回溯的本质是琼剧,所以效率不高回溯法可以解决的问题组合问题切割问题子集问题排列问题棋盘问题如何理解回溯回溯算法的问题都可以抽象为树形结构集合的大小就构成了书的快读,递归的深度......
  • 暗水印——变换域DCT水印算法(一种通用性强,能有抵御攻击的手段)
     随着计算机和网络技术的飞速发展,信息的安全保护问题日益突出。数字图像、音频和视频等多媒体数字产品愈来愈需要一种有效的版权保护方法——水印技术,通常用于保护知识产权、防止未经授权的访问、作弊等。广义上可以把水印技术划分为四大类:图像水印、视频水印、音频水印和......
  • 代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向
    注:今天是代码随想录训练营的最后一天啦!!!本文目录84.柱状图中最大的矩形做题看文章以往忽略的知识点小结个人体会84.柱状图中最大的矩形代码随想录:84.柱状图中最大的矩形Leetcode:84.柱状图中最大的矩形做题无思路。看文章与42.接雨水很像,42.接雨水是找每个......
  • Carmack的快速开平方根倒数算法(Fast inverse square root)
    基本原理需求\(y=\frac{1}{\sqrt{x}}\)\(log(a^b×a^c)=bloga+cloga=(b+c)loga\)32位浮点表示法:二进制的科学计数法符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可)-20240511163945890.webp)字符串形式:\(S_0​E_1​E_2​...E_7......
  • 代码随想录算法训练营第27天 | 39. 组合总和 、 40.组合总和II 、 131.分割回文串
    组合总和本题是集合里元素可以用无数次,那么和组合问题的差别其实仅在于startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.组合总和.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ/***@param{number[]}candidates*@param{number......
  • 最小二乘法算法(个人总结版)
    最小二乘法(LeastSquaresMethod)是一种通过最小化误差平方和来拟合数据的回归分析方法。它被广泛应用于线性回归、多元回归以及其他数据拟合问题中。以下是详细的教程,涵盖基本概念、数学推导、具体步骤和实现代码。1.最小二乘法基本概念最小二乘法是一种用于数据拟合的统计......
  • 代码随想录算法训练营day13(栈与队列)
    代码随想录算法训练营day:学习内容:今天主要学习队列239347学习产出:239一开始想着直接暴力遍历,但是时间复杂度为nk。采用deque实现一个单调队列,因为我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最......
  • 代码随想录算法训练营第二十三天 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索
    669.修剪二叉搜索树题目链接文章讲解视频讲解classSolution{public:TreeNode*trimBST(TreeNode*root,intlow,inthigh){if(root==nullptr)returnnullptr;//当前值小于左边界时,当前节点的左子树全部小于左边界,所以全部删除,直接处理右子树......
  • 混合高斯背景减除算法实现背景建模
     本代码将实现视频中的背景和前景分离,并定位行人。1.实现效果以下为处理后的视频截图2.定义卷积核importcv2cap=cv2.VideoCapture('test.avi')kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))#kernel:[[010],[111],[010]]#定义一个3*3的......