当前位置: 首页 > news >正文

混合学习:Bagging与Boosting的深度解析与实践指南


引言

在机器学习的世界里,模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务,我们都希望模型能够在新的数据上表现出色,即具有良好的泛化能力。然而,实际应用中常常遇到模型过拟合(高方差)或欠拟合(高偏差)的问题。为了解决这些问题,集成学习(Ensemble Learning)应运而生。集成学习通过组合多个模型来提高预测性能,已经成为机器学习中一个非常重要的研究方向。

本文将深入探讨两种经典的集成学习方法:Bagging和Boosting。我们将从理论基础出发,详细分析它们的原理、区别、应用场景,并通过实际案例展示它们的实现和优化。最后,我们还将讨论如何选择合适的集成方法以应对不同的机器学习问题。


第一部分:集成学习基础

1.1 机器学习中的偏差与方差

在机器学习中,模型的性能通常受到偏差(Bias)和方差(Variance)的影响。理解这两个概念对于深入理解集成学习方法至关重要。

1.1.1 偏差(Bias)

定义:偏差衡量的是模型预测值与真实值之间的差距。如果偏差大,说明模型预测的结果离真实值很远,模型不能很好地捕捉数据中的模式。

影响因素

  • 模型的复杂度:简单模型(如线性回归)通常偏差较大,因为它们无法捕捉数据中的复杂关系。
  • 数据特征:如果数据中存在重要特征未被模型考虑,会导致偏差增大。

如何衡量:通常通过计算模型预测值与真实值之间的均方误差(MSE)或平均绝对误差(MAE)来衡量偏差。

1.1.2 方差(Variance)

定义:方差衡量的是模型预测值在不同数据集上的波动程度。如果方差大,说明模型对数据的微小变化非常敏感,预测结果不稳定。

影响因素

  • 模型的复杂度:复杂模型(如深度神经网络、高阶多项式回归)通常方差较大,因为它们对数据中的噪声和异常值非常敏感。
  • 数据的多样性:如果训练数据中存在噪声或异常值,模型的方差可能会增大。

如何衡量:通过计算模型在不同数据集上的预测值的方差来衡量。

1.1.3 偏差-方差权衡

在实际应用中,我们需要在偏差和方差之间找到平衡。一个理想的模型应该具有低偏差和低方差,但通常很难同时实现。因此,我们需要根据具体问题的性质和数据的特点,选择合适的模型复杂度和正则化方法来优化模型性能。

实例分析:假设我们有一个简单的线性回归模型和一个复杂的多项式回归模型。线性回归模型可能无法捕捉数据中的复杂关系,导致偏差较大;而多项式回归模型可能对数据中的噪声非常敏感,导致方差较大。通过调整模型的复杂度,我们可以找到一个平衡点,使得模型的偏差和方差都较低。

1.2 集成学习的概念

集成学习是一种通过组合多个模型来提高预测性能的方法。它基于“三个臭皮匠,顶个诸葛亮”的思想,通过集合多个模型的智慧来提升整体的预测能力。

1.2.1 集成学习的优势
  1. 降低方差:通过组合多个模型,可以减少模型对数据的波动敏感性,从而提高模型的稳定性。
  2. 提高稳定性:集成模型对异常值和噪声数据的鲁棒性更强,因为多个模型的聚合结果能够更好地反映数据的总体特征。
  3. 增强泛化能力:集成模型通常比单一模型具有更好的泛化能力,能够在新的数据上表现更好。
1.2.2 集成学习的分类

集成学习主要分为以下几类:

  1. Bagging(Bootstrap Aggregating):通过自助采样生成多个不同的训练数据集,训练多个基础模型,并通过聚合方式(如多数投票或平均)得到最终预测结果。
  2. Boosting:通过逐步训练多个弱学习器,每个弱学习器根据前一个模型的错误进行调整,最终通过加权组合得到强学习器。
  3. Stacking:将多个基础模型的输出作为特征,训练一个元模型(Meta-model)来进行最终预测。

第二部分:Bagging方法

2.1 Bagging的基本原理

Bagging是一种通过自助采样(Bootstrap Sampling)生成多个不同训练数据集,并训练多个基础模型的方法。这些基础模型的预测结果通过聚合方式(如多数投票或平均)得到最终预测结果。

2.1.1 自助采样(Bootstrap Sampling)

自助采样是从原始训练数据集中有放回地抽取样本。假设原始数据集有N个样本,每次采样都随机选择一个样本,记录下来后将其放回数据集,然后再进行下一次随机选择。这样重复N次采样后,就得到了一个新的数据集,这个新数据集可能包含重复的样本,也可能有些样本没有被选中。

通过自助采样,Bagging可以生成多个不同的训练数据集。因为每次采样都是独立进行的,所以这些数据集之间存在一定的差异。这种差异为后续训练出不同的基础模型提供了基础。

2.1.2 独立训练基础模型

在每个通过自助采样得到的训练数据集上,分别训练一个基础模型。这些基础模型通常是同类型的模型,比如都是决策树。由于每个数据集的样本组成不同,训练出来的基础模型也会有所不同。例如,在一个数据集上训练的决策树可能在某些特征上分裂,而在另一个数据集上训练的决策树可能在不同的特征上分裂,从而捕捉到数据的不同特征模式。

2.1.3 模型聚合(Aggregating)

对于分类问题,Bagging通常采用多数投票法来聚合多个基础模型的预测结果。每个基础模型对测试样本进行分类预测,然后统计所有基础模型的预测结果,选择得票最多的类别作为最终的预测类别。

对于回归问题,Bagging采用平均法来聚合预测结果。将所有基础模型对测试样本的预测值取平均值,作为最终的预测结果。这种聚合方式可以有效地降低模型的方差,提高预测的稳定性。

2.2 Bagging的典型应用:随机森林

随机森林(Random Forest)是Bagging方法的一个经典应用。它在Bagging的基础上进行了扩展,除了对训练数据进行自助采样外,还在每次分裂节点时对特征进行随机选择。这种双重随机性使得随机森林能够进一步降低模型的方差,并且能够处理高维数据。

2.2.1 随机森林的原理

随机森林的主要思想是通过随机化特征选择来进一步降低模型的方差。具体来说,在每次分裂节点时,随机森林会从所有特征中随机选择一部分特征作为候选特征,然后从这些候选特征中选择最优的特征进行分裂。通过这种方式,随机森林不仅在数据层面上引入了随机性(通过自助采样),还在特征层面上引入了随机性(通过随机选择特征)。

2.2.2 随机森林的优势
  1. 降低方差:随机森林通过双重随机性(数据随机性和特征随机性)进一步降低了模型的方差,提高了模型的稳定性。
  2. 处理高维数据:随机森林能够处理高维数据,即使数据中存在大量无关特征,也不会对模型性能产生太大影响。
  3. 特征重要性评估:随机森林可以评估特征的重要性,帮助我们了解哪些特征对模型的预测结果影响最大。
  4. 鲁棒性强:随机森林对异常值和噪声数据具有较强的鲁棒性,因为多个基础模型的聚合结果能够更好地反映数据的总体特征。
2.2.3 随机森林的实现

随机森林可以通过Python的scikit-learn库轻松实现。以下是一个简单的示例代码:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)# 训练模型
rf.fit(X_train, y_train)# 预测测试集
y_pred = rf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
2.2.4 案例分析

为了更好地理解随机森林的工作原理,我们可以通过一个实际案例进行分析。假设我们有一个鸢尾花数据集,包含三种鸢尾花的特征(如花瓣长度、花瓣宽度、花萼长度、花萼宽度)。我们的目标是根据这些特征预测鸢尾花的种类。

在上述代码中,我们首先加载了鸢尾花数据集,并将其划分为训练集和测试集。然后,我们创建了一个随机森林分类器,并使用训练集对其进行训练。最后,我们使用测试集对模型进行评估,并计算了模型的准确率。

通过随机森林,我们可以看到模型在测试集上的准确率通常很高,这说明随机森林能够很好地捕捉数据中的模式,并且对噪声和异常值具有较强的鲁棒性。

2.3 Bagging的其他应用

除了随机森林,Bagging还可以应用于其他类型的模型,如Bagging回归树和Bagging分类器。

2.3.1 Bagging回归树

Bagging回归树是Bagging方法在回归任务中的应用。它通过自助采样生成多个不同的训练数据集,并在每个数据集上训练一个回归树。最终,通过平均法聚合多个回归树的预测结果,得到最终的预测值。

Bagging回归树的主要优势是能够降低回归树的方差,提高模型的稳定性。由于回归树对数据的微小变化非常敏感,Bagging可以通过组合多个回归树来减少这种敏感性。

2.3.2 Bagging分类器

Bagging分类器是Bagging方法在分类任务中的应用。它通过自助采样生成多个不同的训练数据集,并在每个数据集上训练一个分类器。最终,通过多数投票法聚合多个分类器的预测结果,得到最终的预测类别。

Bagging分类器的主要优势是能够降低分类器的方差,提高模型的稳定性。对于那些方差较大的分类器(如决策树),Bagging可以通过组合多个分类器来减少这种敏感性。

2.4 Bagging的局限性

尽管Bagging具有许多优点,但它也有一些局限性:

  1. 计算资源消耗:Bagging需要训练多个基础模型,这可能会消耗大量的计算资源,尤其是当基础模型复杂时。
  2. 模型复杂度:Bagging的最终模型是一个集成模型,包含多个基础模型,这可能会使模型的解释性变差。
  3. 对偏差的影响有限:Bagging主要通过降低方差来提高模型性能,但它对模型的偏差影响有限。如果基础模型本身偏差较大,Bagging可能无法显著提高模型性能。

第三部分:Boosting方法

3.1 Boosting的基本原理

Boosting是一种通过逐步训练多个弱学习器来构建强学习器的方法。每个弱学习器根据前一个模型的错误进行调整,最终通过加权组合得到强学习器。

3.1.1 弱学习器的概念

弱学习器是指那些性能略好于随机猜测的模型。它们通常具有较低的复杂度,例如单层决策树(决策树桩)。Boosting算法通过组合多个弱学习器来构建一个强学习器,从而提高模型的性能。

3.1.2 逐步训练

Boosting算法通过逐步训练多个弱学习器来构建强学习器。每个弱学习器的训练依赖于前一个模型的输出,即后一个模型会根据前一个模型的错误进行调整。例如,在AdaBoost中,每个弱学习器会根据前一个模型的错误分布重新调整样本权重,重点关注前一个模型分类错误的样本。

3.1.3 样本权重调整

Boosting算法通过调整样本权重来引导后续模型的学习。初始时,所有样本权重相同;后续模型会增加分类错误样本的权重,减少分类正确样本的权重,使得后续模型更关注之前模型的错误。

3.1.4 模型组合

Boosting算法通过加权组合的方式将多个弱学习器组合成一个强学习器。每个弱学习器的输出会根据其性能被赋予不同的权重。例如,在AdaBoost中,每个弱学习器的权重与其分类错误率相关。分类错误率越低,模型的权重越高。最终的预测结果是所有弱学习器的加权组合,权重反映了每个模型的可靠性。

3.2 Boosting的典型应用:AdaBoost

AdaBoost(Adaptive Boosting)是Boosting方法的一个经典应用。它通过逐步训练多个弱学习器,并根据每个弱学习器的错误率调整样本权重,最终通过加权组合得到强学习器。

3.2.1 AdaBoost算法

AdaBoost算法的主要步骤如下:

  1. 初始化样本权重:初始时,所有样本的权重相同。
  2. 训练弱学习器:在每一轮中,使用当前样本权重训练一个弱学习器。
  3. 计算弱学习器的错误率:计算弱学习器在训练数据上的错误率。
  4. 计算弱学习器的权重:根据弱学习器的错误率计算其权重。错误率越低,权重越高。
  5. 更新样本权重:增加分类错误样本的权重,减少分类正确样本的权重。
  6. 重复步骤2-5:重复上述步骤,直到达到预定的弱学习器数量或错误率低于阈值。
  7. 加权组合:将所有弱学习器的输出进行加权组合,得到最终的预测结果。
3.2.2 AdaBoost的优势
  1. 降低偏差:AdaBoost通过逐步纠正前一个模型的错误,能够显著降低模型的偏差,提高模型的精度。
  2. 适应性强:AdaBoost对不同的数据集和任务具有很强的适应性,能够自动调整模型以适应数据的特点。
  3. 特征选择:AdaBoost可以自动选择重要的特征,帮助我们了解哪些特征对模型的预测结果影响最大。
3.2.3 AdaBoost的实现

AdaBoost可以通过Python的scikit-learn库轻松实现。以下是一个简单的示例代码:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score# 加载数据集
breast_cancer = load_breast_cancer()
X, y = breast_cancer.data, breast_cancer.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建AdaBoost分类器
ada = AdaBoostClassifier(n_estimators=100, random_state=42)# 训练模型
ada.fit(X_train, y_train)# 预测测试集
y_pred = ada.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
3.2.4 案例分析

为了更好地理解AdaBoost的工作原理,我们可以通过一个实际案例进行分析。假设我们有一个乳腺癌数据集,包含乳腺癌患者的特征(如细胞大小、细胞形状等)。我们的目标是根据这些特征预测乳腺癌的类型。

在上述代码中,我们首先加载了乳腺癌数据集,并将其划分为训练集和测试集。然后,我们创建了一个AdaBoost分类器,并使用训练集对其进行训练。最后,我们使用测试集对模型进行评估,并计算了模型的准确率。

通过AdaBoost,我们可以看到模型在测试集上的准确率通常很高,这说明AdaBoost能够很好地捕捉数据中的模式,并且对噪声和异常值具有较强的鲁棒性。

3.3 其他Boosting算法

除了AdaBoost,还有许多其他Boosting算法,如梯度提升树(Gradient Boosting Tree)、XGBoost和LightGBM。

3.3.1 梯度提升树(Gradient Boosting Tree)

梯度提升树是一种基于梯度下降的Boosting算法。它通过逐步训练多个决策树,并在每一轮中优化目标函数的梯度,来构建强学习器。梯度提升树的主要优势是能够处理复杂的非线性关系,并且对数据的噪声和异常值具有较强的鲁棒性。

3.3.2 XGBoost

XGBoost是一种高效的梯度提升算法,它在梯度提升树的基础上进行了优化。XGBoost的主要特点包括:

  • 正则化:通过在目标函数中加入正则化项,减少模型的过拟合。
  • 并行计算:支持并行计算,提高训练效率。
  • 缺失值处理:能够自动处理缺失值,无需事先填充。
  • 自定义优化目标和评估指标:支持用户自定义优化目标和评估指标,满足不同任务的需求。
3.3.3 LightGBM

LightGBM是一种基于梯度提升的高效机器学习算法。它通过使用直方图算法和梯度单边采样(GOSS)技术,显著提高了训练效率。LightGBM的主要特点包括:

  • 高效性:通过直方图算法和GOSS技术,显著减少了计算量和内存占用。
  • 分布式训练:支持分布式训练,能够处理大规模数据集。
  • 特征重要性评估:能够评估特征的重要性,帮助我们了解哪些特征对模型的预测结果影响最大。

3.4 Boosting的局限性

尽管Boosting具有许多优点,但它也有一些局限性:

  1. 对异常值敏感:Boosting算法会逐步调整模型以纠正错误,异常值可能会被过度关注,从而导致模型过拟合。
  2. 训练时间长:Boosting算法需要逐步训练多个弱学习器,这可能会消耗大量的训练时间,尤其是当弱学习器数量较多时。
  3. 模型复杂度:Boosting的最终模型是一个集成模型,包含多个弱学习器,这可能会使模型的解释性变差。

第四部分:Bagging与Boosting的比较

4.1 训练过程的比较

4.1.1 Bagging的独立并行训练

Bagging的基础模型是独立训练的。每个基础模型使用自助采样生成的不同训练数据集进行训练,这些数据集之间是相互独立的。由于每个基础模型的训练数据是独立生成的,因此Bagging的训练过程可以并行化,效率较高。

4.1.2 Boosting的顺序依赖训练

Boosting的基础模型是顺序训练的。每个基础模型的训练依赖于前一个模型的输出,即后一个模型会根据前一个模型的错误进行调整。由于这种依赖关系,Boosting的训练过程不能并行化,只能顺序进行。

4.2 模型组合方式的比较

4.2.1 Bagging的简单聚合

Bagging的模型组合方式相对简单。对于分类问题,通常采用多数投票法(Majority Voting),选择得票最多的类别作为最终预测结果。对于回归问题,通常采用平均法(Averaging),将所有基础模型的预测值取平均值作为最终预测结果。这种聚合方式强调基础模型的独立性,通过减少方差来提高整体模型的性能。

4.2.2 Boosting的加权组合

Boosting的模型组合方式更为复杂。每个基础模型的输出会根据其性能被赋予不同的权重。例如,在AdaBoost中,每个基础模型的权重与其分类错误率相关。分类错误率越低,模型的权重越高。最终的预测结果是所有基础模型的加权组合,权重反映了每个模型的可靠性。这种方式不仅考虑了基础模型的预测结果,还考虑了模型的性能差异。

4.3 偏差与方差的对比

4.3.1 Bagging降低方差

Bagging的主要目标是降低模型的方差,同时保持较低的偏差。它通过生成多个不同的训练数据集并训练多个基础模型,使得最终的集成模型对数据的波动不那么敏感。例如,在决策树这种方差较大的模型上应用Bagging,可以有效地减少因数据扰动导致的模型预测结果的大幅变化。因为每个基础模型都是在不同的数据集上训练的,即使某个基础模型因为数据的特殊性而出现较大的偏差,其他基础模型的预测结果可以通过聚合的方式进行平衡。

4.3.2 Boosting降低偏差

Boosting的主要目标是降低模型的偏差,同时保持较低的方差。它通过逐步纠正前一个模型的错误来提高整体模型的性能。例如,在AdaBoost中,每个弱学习器会根据前一个模型的错误分布重新调整样本权重,重点关注前一个模型分类错误的样本。这种方式使得Boosting能够逐步优化模型,减少偏差,提高模型的精度。

4.4 鲁棒性的对比

4.4.1 Bagging对异常值和噪声的鲁棒性

Bagging对异常值和噪声数据具有较强的鲁棒性。由于每个基础模型使用不同的数据子集进行训练,异常值对整体模型的影响会被分散和削弱。例如,在随机森林中,即使某些基础模型受到异常值的影响,最终的投票或平均结果仍然能够保持稳定。

4.4.2 Boosting对异常值和噪声的敏感性

Boosting对异常值和噪声数据较为敏感。由于Boosting会逐步调整模型以纠正错误,异常值可能会被过度关注,从而导致模型过拟合。例如,在AdaBoost中,异常值可能会被赋予较高的权重,使得后续模型过度关注这些样本,从而影响整体模型的泛化能力。

4.5 应用场景的对比

4.5.1 Bagging的适用场景

Bagging适用于高方差模型,如决策树、神经网络等。这些模型通常对数据的微小变化非常敏感,容易过拟合。通过Bagging,可以有效地降低这些模型的方差,提高模型的稳定性。

4.5.2 Boosting的适用场景

Boosting适用于高偏差模型,如线性模型、浅层决策树等。这些模型通常不能很好地捕捉数据中的复杂模式,容易欠拟合。通过Boosting,可以逐步优化模型,减少偏差,提高模型的精度。

4.6 实际案例分析

为了更好地理解Bagging和Boosting的区别,我们可以通过一个实际案例进行分析。假设我们有一个信用卡欺诈检测数据集,包含用户的交易特征(如交易金额、交易时间、交易地点等)。我们的目标是根据这些特征预测交易是否为欺诈。

我们可以分别使用Bagging和Boosting方法来构建模型,并比较它们的性能。

4.6.1 数据准备

首先,我们需要加载数据集,并将其划分为训练集和测试集。假设我们已经完成了数据清洗和特征工程,得到了一个包含用户交易特征的数据集。

import pandas as pd
from sklearn.model_selection import train_test_split# 加载数据集
data = pd.read_csv('credit_card_fraud.csv')# 划分特征和目标变量
X = data.drop('is_fraud', axis=1)
y = data['is_fraud']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4.6.2 使用Bagging方法

我们可以使用随机森林(Random Forest)作为Bagging方法的实现。随机森林通过自助采样生成多个不同的训练数据集,并在每个数据集上训练一个决策树。最终,通过多数投票法聚合多个决策树的预测结果,得到最终的预测类别。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)# 训练模型
rf.fit(X_train, y_train)# 预测测试集
y_pred_rf = rf.predict(X_test)# 计算准确率
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"Random Forest Accuracy: {accuracy_rf:.2f}")# 打印分类报告
print(classification_report(y_test, y_pred_rf))

通过随机森林,我们可以看到模型在测试集上的准确率通常很高,这说明随机森林能够很好地捕捉数据中的模式,并且对噪声和异常值具有较强的鲁棒性。

4.6.3 使用Boosting方法

我们可以使用AdaBoost作为Boosting方法的实现。AdaBoost通过逐步训练多个弱学习器,并根据每个弱学习器的错误率调整样本权重,最终通过加权组合得到强学习器。

from sklearn.ensemble import AdaBoostClassifier# 创建AdaBoost分类器
ada = AdaBoostClassifier(n_estimators=100, random_state=42)# 训练模型
ada.fit(X_train, y_train)# 预测测试集
y_pred_ada = ada.predict(X_test)# 计算准确率
accuracy_ada = accuracy_score(y_test, y_pred_ada)
print(f"AdaBoost Accuracy: {accuracy_ada:.2f}")# 打印分类报告
print(classification_report(y_test, y_pred_ada))

通过AdaBoost,我们可以看到模型在测试集上的准确率也较高,这说明AdaBoost能够很好地捕捉数据中的模式,并且对噪声和异常值具有较强的鲁棒性。

4.7 性能比较

为了更直观地比较Bagging和Boosting的性能,我们可以绘制一个性能比较图表。以下是一个简单的示例代码:

import matplotlib.pyplot as plt# 性能比较
models = ['Random Forest', 'AdaBoost']
accuracies = [accuracy_rf, accuracy_ada]# 绘制柱状图
plt.bar(models, accuracies, color=['blue', 'orange'])
plt.xlabel('Model')
plt.ylabel('Accuracy')
plt.title('Performance Comparison')
plt.show()

通过性能比较图表,我们可以看到Bagging和Boosting在信用卡欺诈检测任务上的性能表现。虽然两者在准确率上可能非常接近,但在某些情况下,Boosting可能会表现出更高的精度,而Bagging可能会表现出更强的鲁棒性。


第五部分:实践与优化

5.1 Bagging与Boosting的实践指南

5.1.1 数据预处理

在使用Bagging和Boosting方法之前,我们需要对数据进行预处理。数据预处理包括以下几个步骤:

  1. 缺失值处理:填充或删除缺失值。
  2. 特征标准化:将特征值缩放到相同的范围,例如0到1或-1到1。
  3. 特征选择:选择对目标变量有显著影响的特征。
  4. 数据划分:将数据划分为训练集和测试集。
5.1.2 模型选择

选择合适的基础模型是Bagging和Boosting成功的关键。对于Bagging,通常选择高方差模型,如决策树或神经网络。对于Boosting,通常选择高偏差模型,如线性模型或浅层决策树。

5.1.3 超参数调优

Bagging和Boosting方法都有许多超参数需要调整。例如,随机森林的n_estimators(基础模型的数量)、max_depth(决策树的最大深度)等;AdaBoost的n_estimators(弱学习器的数量)、learning_rate(学习率)等。通过网格搜索(Grid Search)或随机搜索(Random Search)等方法,可以找到最优的超参数组合。

5.1.4 模型评估

评估模型性能是实践中的重要步骤。常用的评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分数(F1 Score)等。通过交叉验证(Cross-Validation)等方法,可以更准确地评估模型的泛化能力。

5.2 提高性能的策略

5.2.1 Bagging的优化
  1. 特征选择:通过特征重要性评估选择对目标变量有显著影响的特征,减少模型的复杂度。
  2. 模型剪枝:对基础模型进行剪枝,减少模型的过拟合。
  3. 并行化:利用多核处理器或分布式计算资源,加速模型的训练过程。
5.2.2 Boosting的优化
  1. 正则化:在目标函数中加入正则化项,减少模型的过拟合。
  2. 早停:在训练过程中,如果模型的性能不再提升,则提前停止训练。
  3. 学习率调整:通过调整学习率,控制模型的训练速度,避免过拟合。

5.3 案例分析

为了更好地理解Bagging和Boosting的优化策略,我们可以通过一个实际案例进行分析。假设我们有一个客户流失预测数据集,包含客户的特征(如年龄、收入、消费行为等)。我们的目标是根据这些特征预测客户是否会流失。

我们可以分别使用随机森林和AdaBoost方法来构建模型,并通过优化策略提高模型的性能。

5.3.1 数据准备

首先,我们需要加载数据集,并将其划分为训练集和测试集。假设我们已经完成了数据清洗和特征工程,得到了一个包含客户特征的数据集。

import pandas as pd
from sklearn.model_selection import train_test_split# 加载数据集
data = pd.read_csv('customer_churn.csv')# 划分特征和目标变量
X = data.drop('churn', axis=1)
y = data['churn']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
5.3.2 使用随机森林

我们可以使用随机森林作为Bagging方法的实现。为了优化随机森林的性能,我们可以调整以下超参数:

  • n_estimators:基础模型的数量。
  • max_depth:决策树的最大深度。
  • min_samples_split:分裂内部节点所需的最小样本数。
  • min_samples_leaf:在叶子节点处需要的最小样本数。
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV# 创建随机森林分类器
rf = RandomForestClassifier(random_state=42)# 定义超参数网格
param_grid = {'n_estimators': [50, 100, 200],'max_depth': [None, 10, 20, 30],'min_samples_split': [2, 5, 10],'min_samples_leaf': [1, 2, 4]
}# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 获取最优模型
best_rf = grid_search.best_estimator_# 预测测试集
y_pred_rf = best_rf.predict(X_test)# 计算准确率
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"Optimized Random Forest Accuracy: {accuracy_rf:.2f}")# 打印分类报告
print(classification_report(y_test, y_pred_rf))

通过优化随机森林的超参数,我们可以显著提高模型的性能。

5.3.3 使用AdaBoost

我们可以使用AdaBoost作为Boosting方法的实现。为了优化AdaBoost的性能,我们可以调整以下超参数:

  • n_estimators:弱学习器的数量。
  • learning_rate:学习率。
  • algorithm:使用的算法,如SAMME或SAMME.R。
from sklearn.ensemble import AdaBoostClassifier# 创建AdaBoost分类器
ada = AdaBoostClassifier(random_state=42)# 定义超参数网格
param_grid = {'n_estimators': [50, 100, 200],'learning_rate': [0.01, 0.1, 1.0],'algorithm': ['SAMME', 'SAMME.R']
}# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(estimator=ada, param_grid=param_grid, cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)# 获取最优模型
best_ada = grid_search.best_estimator_# 预测测试集
y_pred_ada = best_ada.predict(X_test)# 计算准确率
accuracy_ada = accuracy_score(y_test, y_pred_ada)
print(f"Optimized AdaBoost Accuracy: {accuracy_ada:.2f}")# 打印分类报告
print(classification_report(y_test, y_pred_ada))

通过优化AdaBoost的超参数,我们可以显著提高模型的性能。

5.4 性能比较

为了更直观地比较优化后的Bagging和Boosting的性能,我们可以绘制一个性能比较图表。以下是一个简单的示例代码:

import matplotlib.pyplot as plt# 性能比较
models = ['Optimized Random Forest', 'Optimized AdaBoost']
accuracies = [accuracy_rf, accuracy_ada]# 绘制柱状图
plt.bar(models, accuracies, color=['blue', 'orange'])
plt.xlabel('Model')
plt.ylabel('Accuracy')
plt.title('Performance Comparison After Optimization')
plt.show()

通过性能比较图表,我们可以看到优化后的Bagging和Boosting在客户流失预测任务上的性能表现。虽然两者在准确率上可能非常接近,但在某些情况下,Boosting可能会表现出更高的精度,而Bagging可能会表现出更强的鲁棒性。


第六部分:选择合适的集成学习方法

6.1 问题分析

在选择Bagging或Boosting方法之前,我们需要对问题进行详细分析。以下是一些需要考虑的因素:

  1. 数据特点:数据是否存在噪声、异常值、不平衡等问题。
  2. 模型复杂度:我们希望模型的复杂度是多少,是否需要考虑模型的解释性。
  3. 任务目标:我们的任务是分类还是回归,是否需要高精度或高鲁棒性。

6.2 Bagging适用场景

Bagging适用于以下场景:

  1. 高方差模型:如果基础模型的方差较大,如决策树、神经网络等,使用Bagging可以有效降低方差,提高模型的稳定性。
  2. 噪声数据:如果数据中存在噪声或异常值,Bagging对这些数据具有较强的鲁棒性。
  3. 并行计算:如果计算资源充足,可以利用Bagging的并行化特性加速模型的训练过程。

6.3 Boosting适用场景

Boosting适用于以下场景:

  1. 高偏差模型:如果基础模型的偏差较大,如线性模型、浅层决策树等,使用Boosting可以有效降低偏差,提高模型的精度。
  2. 复杂数据模式:如果数据中存在复杂的非线性关系,Boosting能够逐步优化模型,捕捉这些复杂模式。
  3. 高精度需求:如果任务对模型的精度要求较高,Boosting通常能够提供更高的精度。

6.4 案例分析

为了更好地理解如何选择合适的集成学习方法,我们可以通过一个实际案例进行分析。假设我们有一个房价预测数据集,包含房屋的特征(如面积、房间数量、位置等)。我们的目标是根据这些特征预测房屋的价格。

我们可以分别使用Bagging回归树和梯度提升树(Gradient Boosting Tree)来构建模型,并比较它们的性能。

6.4.1 数据准备

首先,我们需要加载数据集,并将其划分为训练集和测试集。假设我们已经完成了数据清洗和特征工程,得到了一个包含房屋特征的数据集。

import pandas as pd
from sklearn.model_selection import train_test_split# 加载数据集
data = pd.read_csv('house_prices.csv')# 划分特征和目标变量
X = data.drop('price', axis=1)
y = data['price']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
6.4.2 使用Bagging回归树

我们可以使用Bagging回归树作为Bagging方法的实现。Bagging回归树通过自助采样生成多个不同的训练数据集,并在每个数据集上训练一个回归树。最终,通过平均法聚合多个回归树的预测结果,得到最终的预测值。

from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error# 创建Bagging回归树
bagging_tree = BaggingRegressor(base_estimator=DecisionTreeRegressor(), n_estimators=100, random_state=42)# 训练模型
bagging_tree.fit(X_train, y_train)# 预测测试集
y_pred_bagging = bagging_tree.predict(X_test)# 计算均方误差
mse_bagging = mean_squared_error(y_test, y_pred_bagging)
print(f"Bagging Regression Tree MSE: {mse_bagging:.2f}")
6.4.3 使用梯度提升树

我们可以使用梯度提升树作为Boosting方法的实现。梯度提升树通过逐步训练多个决策树,并在每一轮中优化目标函数的梯度,来构建强学习器。

from sklearn.ensemble import GradientBoostingRegressor# 创建梯度提升树
gb_tree = GradientBoostingRegressor(n_estimators=100, random_state=42)# 训练模型
gb_tree.fit(X_train, y_train)# 预测测试集
y_pred_gb = gb_tree.predict(X_test)# 计算均方误差
mse_gb = mean_squared_error(y_test, y_pred_gb)
print(f"Gradient Boosting Regression Tree MSE: {mse_gb:.2f}")

6.5 性能比较

为了更直观地比较Bagging和Boosting的性能,我们可以绘制一个性能比较图表。以下是一个简单的示例代码:

import matplotlib.pyplot as plt# 性能比较
models = ['Bagging Regression Tree', 'Gradient Boosting Regression Tree']
mse = [mse_bagging, mse_gb]# 绘制柱状图
plt.bar(models, mse, color=['blue', 'orange'])
plt.xlabel('Model')
plt.ylabel('Mean Squared Error')
plt.title('Performance Comparison')
plt.show()

通过性能比较图表,我们可以看到Bagging和Boosting在房价预测任务上的性能表现。虽然两者在均方误差上可能非常接近,但在某些情况下,Boosting可能会表现出更低的误差,而Bagging可能会表现出更强的鲁棒性。


第七部分:总结与展望

7.1 集成学习的优势

集成学习通过组合多个模型来提高预测性能,已经成为机器学习中一个非常重要的研究方向。Bagging和Boosting是两种经典的集成学习方法,它们在降低方差、提高稳定性、增强泛化能力等方面具有显著优势。

7.2 Bagging与Boosting的区别

Bagging和Boosting在训练过程、模型组合方式、偏差与方差的权衡等方面存在显著区别。Bagging通过自助采样生成多个不同的训练数据集,并通过简单聚合的方式组合多个基础模型,主要目标是降低方差。Boosting通过逐步训练多个弱学习器,并根据每个弱学习器的错误调整样本权重,最终通过加权组合得到强学习器,主要目标是降低偏差。

7.3 实践指南

在实际应用中,我们需要根据具体问题的性质和数据的特点选择合适的集成学习方法。Bagging适用于高方差模型,对噪声和异常值具有较强的鲁棒性;Boosting适用于高偏差模型,能够逐步优化模型,提高精度。通过优化超参数和采用合适的策略,可以进一步提高模型的性能。

7.4 未来展望

随着机器学习技术的不断发展,集成学习方法也在不断演进。例如,深度学习中的集成方法(如模型融合、集成神经网络)正在成为研究热点。此外,集成学习在实际应用中的可扩展性和效率问题也值得关注。未来的研究可能会集中在如何进一步优化集成学习方法,提高模型的性能和效率,同时保持模型的可解释性。


参考文献

  1. Breiman, L. (1996). Bagging predictors. Machine learning, 24(2), 123-140.
  2. Freund, Y., & Schapire, R. E. (1997). A decision-theoretic generalization of on-line learning and an application to boosting. Journal of computer and system sciences, 55(1), 119-139.
  3. Friedman, J. H. (2001). Greedy function approximation: a gradient boosting machine. Annals of statistics, 29(5), 1189-1232.
  4. Chen, T., & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (pp. 785-794).
  5. Ke, G., Meng, Q., Finley, T., Wang, T., Chen, W., Ma, W., … & Liu, T. Y. (2017). LightGBM: A highly efficient gradient boosting decision tree. In Advances in Neural Information Processing Systems (pp. 3146-3154).

希望这篇技术博客能够帮助你深入理解Bagging和Boosting方法的原理、应用与实践。如果你有任何问题或建议,欢迎随时提出。

相关文章:

混合学习:Bagging与Boosting的深度解析与实践指南

引言 在机器学习的世界里,模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务,我们都希望模型能够在新的数据上表现出色,即具有良好的泛化能力。然而,实际应用中常常遇到模型过拟合(高方差)…...

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作流程关键步骤: 1. 无人机航拍准备 • 设备检查:确保大疆 Mini 3 电量充足,相机设置为 RAW 格式(便于后期调色),关闭自动白平衡。 • 飞行规划&…...

开源项目实战学习之YOLO11:12.1 ultralytics-models-sam-blocks.py源码

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-__init__.py2.sam-modules-blocks.pybl…...

3D个人简历网站 5.天空、鸟、飞机

1.显示天空 models下新建文件Sky.jsx Sky.jsx // 从 React 库中导入 useRef 钩子,用于创建可变的 ref 对象 import { useRef } from "react"; // 从 react-three/drei 库中导入 useGLTF 钩子,用于加载 GLTF 格式的 3D 模型 import { useGLT…...

蓝桥杯-不完整的算式

问题描述 小蓝在黑板上写了一个形如 AopBCAopBC 的算式,其中 AA、BB、CC 都是非负整数,opop 是 、-、*、/、-、*、/(整除)四种运算之一。不过 AA、opop、BB、CC 这四部分有一部分被不小心的同学擦掉了。 给出这个不完整的算式&a…...

【Python 算法零基础 3.递推】

压抑与痛苦,那些辗转反侧的夜,终会让我们更加强大 —— 25.5.16 一、递推的概念 递推 —— 递推最通俗的理解就是数列,递推和数列的关系就好比 算法 和 数据结构 的关系,数列有点像数据结构中的线性表(可以是顺序表,也…...

计算机视觉与深度学习 | Matlab实现EMD-LSTM和LSTM时间序列预测对比(完整源码和数据)

EMD-LSTM与LSTM 一、数据生成与预处理二、经验模态分解(EMD)三、数据预处理四、模型构建与训练1. 单一LSTM模型2. EMD-LSTM混合模型五、预测与结果对比1. 单一LSTM预测2. EMD-LSTM预测3. 性能评估六、结果可视化七、完整代码说明八、典型输出结果九、改进方向以下是用MATLAB实…...

【爬虫】DrissionPage-6

官方文档: https://www.drissionpage.cn/browser_control/visit https://www.drissionpage.cn/browser_control/page_operation 1. Tab 对象概述 Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页,负责执行各种网页…...

C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景

一、发展历史 冒泡排序(Bubble Sort)作为计算机科学领域最基础的排序算法之一,其历史可追溯至计算机编程的早期阶段。尽管具体起源时间难以考证,但它在20世纪50年代至60年代间被广泛讨论和应用。冒泡排序的名称来源于其独特的排序…...

git提交库常用词

新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...

结构化思考力_第一章_明确理念打基础

接收信息的3个步骤 1. 梳理:观点、理由、事实和数据; 2. 画3这的结构图 3. 一句话概括 可套用固定格式。在——的基础上,从——、——、——N个方面,说明了————。 一句话概括主要内容的前提是,一定是结构非常…...

【C语言练习】046. 编写插入排序算法

046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...

Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南

本文将手把手教你如何在Android应用中集成TensorFlow Lite模型,实现端侧机器学习推理能力。我们以图像分类场景为例,提供可直接运行的完整代码示例。 环境准备 1. 开发环境要求 Android Studio Arctic Fox以上版本AGP 7.0Kotlin 1.6Minimum SDK 21 2.…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS(Network File System,网络文件系统) 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议,允许用户通过网络访问远程计算机上的文件,就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中,Redis作为高性能的内存数据库被广泛使用。然而,内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制,包括RDB、AOF以及混合持久化模式,帮助开发者根据业务需求选择最适合的持…...

经典算法 求C(N, K) % mod,保证mod是质数

求C(N, K) % mod,保证mod是质数 问题描述 给你三个整数N,K,mod保证mod是一个质数,求组合数C(N, K) % mod。 输入描述 输入有多组,输入第一行为两个整数T,mod。接下来2 - T 1行,每行输入N, K。 输出描…...

NY309NY318美光科技颗粒NY319NY320

NY309NY318美光科技颗粒NY319NY320 技术解析:架构创新与性能突围 美光科技的NY系列颗粒(如NY309、NY318、NY319、NY320)延续了其在存储技术领域的创新基因。以NY319为例,其采用16层BiCS3 3D NAND工艺,通过浮栅&#…...

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前,需要了解如下事实&#xff1…...

flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面(如表单、静态内容)❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表,自动滚动;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...

OpenCV透视变换

概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程,也叫投影映射 ,属于空间立体三维变换。它基于透视原理,通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 ,能模拟人眼或相机镜头观看三维空间物体时的透视…...

Node.js 实战四:数据库集成最佳实践

你写了个登录接口,用上了 JWT;然后,产品来了句: “用户数据能分页查吗?能关联公司信息吗?我们这边还有多语言字段…” 你发现:SQL 写得越来越长,关联越来越绕,字段越来越…...

【JDBC】JDBC概述、历史版本及特征

1_JDBC概述 什么是JDBC JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC,程序员只需用JDBC API写一个程序…...

redis的pipline使用结合线程池优化实战

文章目录 代码讲解与事务 (MULTI/EXEC) 的区别在你这段代码里的价值可能的坑实战建议 代码 /*** 批量根据用户 ID 查询用户信息** param findUsersByIdsReqDTO* return*/Overridepublic Response<List<FindUserByIdRspDTO>> findByIds(FindUsersByIdsReqDTO findUs…...

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…...

MySQL初阶:sql事务和索引

索引&#xff08;index&#xff09; 可以类似理解为一本书的目录&#xff0c;一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过&#xff1a; 1.先遍历表 2.将条件带入每行记录中进行判断&#xff0c;看是否符合 3.不符合就跳过 但当表中的…...

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示&#xff0c;实际可以连接复杂外设&#xff08;SPI、CAN、ADC等&#xff09; 单模块使用 RX、TX、5V和GND接到串口模块&#xff1b;X5接5V&#xff1b;Y2接LED;LED-接GND 串口模块插上电脑后&#xff0c;LED没有亮&#xff1b;因为此时模…...

很啰嗦,再次总结 DOM

DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM&#xff08;Document Object Model&#xff09;即文档对象模型&#xff0c;是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构&#xff0c;允许程序和脚本动态访问、修改文…...

文件读取漏洞路径与防御总结

文件读取漏洞路径与防御总结 文件读取漏洞允许攻击者通过路径遍历等手段访问未授权的文件。以下是Linux和Windows系统中常见敏感路径的归纳及防御建议&#xff1a; Linux 系统常见敏感路径 系统关键文件&#xff1a; /etc/passwd&#xff1a;用户账户信息&#xff08;可被用来…...

电池的充放电电流中C的含义

充电电池的充放电电流标注为 -0.2C、1C、2C 等参数时&#xff0c;其含义与电池的容量和充放电速率直接相关。以下是详细解释&#xff1a; 1. 什么是 “C” 值&#xff1f; • C 是电池的 额定容量&#xff08;Capacity&#xff09; 的缩写&#xff0c;单位为 Ah&#xff08;安时…...

文章记单词 | 第91篇(六级)

一&#xff0c;单词释义 stride /straɪd/- v. 大步走&#xff1b;跨越&#xff1b;迈进 /n. 大步&#xff1b;进展&#xff1b;步幅diplomatic /ˌdɪpləˈmtɪk/- adj. 外交的&#xff1b;有手腕的conquer /ˈkɒŋkə(r)/- v. 征服&#xff1b;战胜&#xff1b;克服geogra…...

Nginx应用场景详解与配置指南

1. 什么是Nginx&#xff1f; Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它以高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 2. Nginx的主要应用场景 2.1 …...

【Ubuntu】Waydroid-Linux安卓模拟器安装

✅ 1. 安装 Waydroid sudo apt update sudo apt install curl ca-certificates gnupg git -y curl -s https://repo.waydro.id | sudo bash sudo apt install waydroid -y sudo apt install dbus-x11✅ 2. 初始化 Waydroid 使用普通system版本&#xff1a; sudo waydroid in…...

设计模式 - 单例模式 - Tips

为什么双重检查会带来空指针异常问题&#xff1f; if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } …...

设计模式7大原则与UML类图详解

设计模式7大原则与UML类图详解 引言 &#x1f31f; 在软件工程领域&#xff0c;设计模式和UML&#xff08;统一建模语言&#xff09;是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案&#xff0c;而UML则为我们提供了一种可视化的…...

如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践

这篇博客涉及两个知识点&#xff0c;一个是动态采样&#xff0c;另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题&#xff1a;收集统计信息之前&#xff0c;为什么会出现计划不稳定的情况&#xff1f; …...

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…...

HMDB51数据集划分

生成训练集、验证集和测试集 每个split文件应该包含&#xff1a; 训练集(id1): 70个视频测试集(id2): 30个视频未使用(id0): 剩余视频 这是一个70/30的训练/测试分割比例。标记为0的视频被排除在当前实验之外。实际上训练集&#xff08;id1&#xff09;&#xff0c;验证集&am…...

25、DeepSeek-R1论文笔记

DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链&#xff08;Chain of Thought&#xff09;6、强化学习算法&#xff08;GRPO&#xff09;7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…...

CodeBuddy 打造响应式测试平台:ScreenLab 的诞生记

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 开发工具&#xff1a;CodeBuddy&#xff08;AI 代码伙伴&#xff09; 技术栈&#xff1a;Vue3 Vite 原生 CSS…...

STM32实战指南:SG90舵机控制原理与代码详解

知识点1【SG90的简述】 SG90是一款微型舵机&#xff08;Micro Servo&#xff09;&#xff0c;由TowerPro等厂商提供&#xff0c;广泛用于机器人&#xff0c;舵机云台&#xff0c;舵机控制教学等项目中。 1、基本参数 2、工作原理 SG90内部有电机&#xff0c;齿轮组&#xff…...

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…...

开源RTOS(实时操作系统):nuttx 编译

开源RTOS&#xff08;实时操作系统&#xff09;&#xff1a;nuttx 编译 手册&#xff1a;Installing — NuttX latest documentation 源码&#xff1a;GitHub - apache/nuttx: Apache NuttX is a mature, real-time embedded operating system (RTOS) Installing The fir…...

C++学习:六个月从基础到就业——C++11/14:decltype关键字

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;decltype关键字 本文是我C学习之旅系列的第四十二篇技术文章&#xff0c;也是第三阶段"现代C特性"的第四篇&#xff0c;主要介绍C11/14中的decltype关键字。查看完整系列目录了解更多内容。 引言 在现代C…...

【51】快速获取数码管段选表(含小数点)及字母表的工具(分享)

1 介绍 1.1 画面 1.2 用法 输入IO口和段码字母的映射关系&#xff0c;比如这里e4d5dp2&#xff0c;指的是bit4是e段&#xff0c;bit5是d段&#xff0c;bit2是小数点dp段。 然后选择有效电平&#xff08;1表示亮 or 0表示亮&#xff09;。 点击生成段码配置&#xff0c;即可得到…...

高频面试题(含笔试高频算法整理)基本总结回顾120

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

5月17日

这几天不知道为啥没更新。可能是玩得太疯了。或者是考试有点集中&#xff1f;&#xff1f; 线性代数开课了&#xff0c;英语昨天完成了debate 昨天中午debate结束我们就出去玩了&#xff0c;去的那里时光民俗&#xff0c;别墅很好&#xff0c;770平米&#xff0c;但是缺点是可…...

摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程

摩方12代N200迷你主机标配 Intel AX201无线网卡&#xff0c;支持 WiFi 6 协议&#xff08;802.11ax&#xff09;及蓝牙5.2。此网卡兼容主流抓包工具&#xff0c;但需注意&#xff1a; 驱动兼容性&#xff1a;Ubuntu 20.04及以上内核版本&#xff08;5.4&#xff09;默认支持AX2…...

从零开始:使用 PyTorch 构建深度学习网络

从零开始&#xff1a;使用 PyTorch 构建深度学习网络 目录 PyTorch 简介环境配置PyTorch 基础构建神经网络训练模型评估与测试案例实战&#xff1a;手写数字识别进阶技巧常见问题解答 PyTorch 简介 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook&#xff08;现…...

应用层自定义协议与序列化

应用层自定义协议与序列化 应用层协议网络版计算器序列化和反序列化序列化反序列化 重新理解read、write、recv、send和TCP为什么支持全双工代码结构Jsoncpp特性安装序列化使用Json::Value的toStyledString方法使用Json::StreamWriter使用Json::FastWriter 反序列化使用Json::R…...

2025春训第二十场

问题 B: 狗是啥呀 题目描述 在神秘的地狱深处&#xff0c;有着一种神秘的犬类生物&#xff0c;据传这种生物长了x个脑袋&#xff0c;并且具有强大的生命力。由于见过它的人全都下落不明&#xff0c;至今没有人知道它的真面目。 一位勇士为了斩杀这奇怪的生物&#xff0c;来到地…...