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

解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器

一、引言

在机器学习的广阔领域中,算法的选择犹如为一场冒险挑选趁手的武器,至关重要。面对海量的数据和复杂的任务,合适的算法能够化繁为简,精准地挖掘出数据背后隐藏的模式与价值。机器学习领域有十大核心算法,而随机森林算法(Random Forest Algorithm)以其独特的魅力和卓越的性能,占据着举足轻重的地位。那么,随机森林算法究竟是如何构建起它的 “森林王国”?它的内部运作机制又蕴含着怎样的奥秘?在实际应用中,我们又该如何充分发挥它的优势,避免可能出现的问题呢?接下来,就让我们一同深入探索随机森林算法的奇妙世界,揭开它神秘的面纱。

在这里插入图片描述

二、随机森林算法基础

随机森林算法诞生于集成学习的理念,它巧妙地融合了多个决策树的智慧,如同组建了一支强大的专家团队,每个决策树都从不同的角度对数据进行分析和判断,最终通过综合所有决策树的结果,得出更为准确和可靠的预测。这种独特的 “集体决策” 机制,使得随机森林在面对各种复杂问题时都能游刃有余,展现出强大的适应性和抗干扰能力。

2.1 定义与概念

随机森林(Random Forest)是一种集成学习算法,它由多棵决策树构成,通过构建多个决策树并结合它们的输出来进行分类或回归。在分类问题中,随机森林的输出类别由个别树输出类别的众数决定,即让每棵决策树对样本进行分类,然后选择出现次数最多的类别作为最终分类结果;在回归问题中,则通过计算所有决策树预测结果的平均值来得到最终预测值。这种 “集思广益” 的方式,使得随机森林能够充分利用多个决策树的优势,有效提高模型的准确性和稳定性。

2.2 工作原理

2.2.1 决策树基础

决策树是随机森林中的核心构建块,它是一种树形结构的分类器,在之前的文章【解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器】中介绍过:决策树是通过一系列的问题将数据分割成不同的节点,直至达到叶节点,从而做出预测。其构建过程主要包括以下几个关键步骤:

  • 特征选择在每个节点上,需要从众多特征中选择一个最优特征进行分割,以使得分割后的子节点尽可能纯净。通常基于信息增益、信息增益比或基尼不纯度等标准来衡量特征的优劣,选择能够最大程度降低数据集不确定性的特征。例如,在预测水果类别时,可能会根据水果的颜色、大小、形状等特征进行判断,若颜色这个特征能够最有效地将不同水果区分开来,那么就选择颜色作为当前节点的分裂特征。

  • 分割点确定对于选定的特征,需要确定一个合适的分割点,将数据分为两个子集,使得子集内部的样本尽可能同质。对于连续型特征,可以通过二分法等方式确定分割点;对于离散型特征,则直接根据特征值进行划分。比如,对于水果的大小这个连续型特征,经过计算发现将大小为 100 克作为分割点时,能够使划分后的两个子集中水果的类别更加单一,那么就将 100 克作为分割点。

  • 树的生长重复以上步骤,对每个子集递归地进行特征选择和分割点确定,不断生长子树,直到达到某个停止条件,如所有样本属于同一类别,或达到预设的最大深度,或节点中的样本数量小于某个阈值等。

决策树的优点在于其可解释性强,能够直观地展示特征与目标变量之间的关系,就像一个清晰的决策流程,让人一目了然。然而,单棵决策树容易过拟合,它可能会学习到数据中的噪声和细节,导致在新数据上的泛化能力较差。例如,在训练数据中,可能存在一些特殊情况或异常值,决策树可能会过度适应这些情况,从而在面对新的正常数据时,做出错误的预测。

2.2.2 Bagging 机制

随机森林通过 Bagging(Bootstrap Aggregating,自助采样聚合)机制来提高模型的泛化能力,其主要步骤如下:

  1. 自助采样从原始数据集中进行有放回的抽样,生成多个不同的训练数据集,每个数据集的大小与原始数据集相同。由于是有放回抽样,每个自助样本集大致包含约 (1 - e^(-M/N)) N 个不同的样本,且大约有 e^(-M/N) N 个样本未被抽中(出现在自助样本集中的次数为 0),这样每个训练数据集都具有一定的随机性和差异性。

  2. 独立建模在每个自助采样得到的训练数据集上,独立地构建一个决策树模型。这些决策树在不同的数据子集上进行训练,学习到的数据特征和模式也会有所不同,从而增加了模型的多样性。

  3. 结果整合对于分类问题,通过多数投票的方式来整合各个模型的预测结果,即选择出现次数最多的类别标签作为最终预测;对于回归问题,则通过计算所有决策树预测结果的平均值作为最终的预测值。

Bagging 机制通过减少模型之间的相关性,有效降低了过拟合的风险,并提高了模型的稳定性。就好比一群人对同一个问题进行判断,每个人都有自己的观点和思考方式,将他们的意见综合起来,往往比单个个体的判断更加准确和可靠。

2.2.3 随机性引入

随机森林的强大之处还在于它引入了随机性,这主要体现在两个方面:

  • 样本随机性通过自助采样方法,每棵决策树训练时使用的样本集都是随机的,这使得每棵树面对的数据略有不同,从而学习到不同的特征和模式,增加了模型的多样性。即使某棵树在某些样本上表现不佳,但其他树可能会在这些样本上表现良好,通过综合所有树的结果,可以提高整体的预测性能。

  • 特征随机性在决策树的每个分裂节点上,不是使用所有可能的特征,而是随机选择一个特征子集,并从中选择最佳特征进行分裂。这种方式进一步增加了模型的泛化能力,避免了某些特征对模型的过度影响,使得模型对特征的微小变化不敏感,从而提高了模型的鲁棒性。例如,在一个包含众多特征的数据集上,随机选择部分特征进行分裂,能够让模型更加全面地学习数据的特征,而不是依赖于某些特定的特征。

三、随机森林算法的构建过程

3.1 数据准备

在构建随机森林模型之前,首先需要进行数据准备工作,这是确保模型性能的关键步骤。

  • 数据收集从各种数据源收集与问题相关的数据,这些数据源可以是数据库、文件系统、传感器等。例如,在预测房价的任务中,需要收集房屋的面积、房间数量、地理位置、房龄等特征数据,以及对应的房价信息。

  • 数据清洗对收集到的数据进行清洗,去除其中的噪声和错误数据。这包括处理缺失值、异常值等问题。例如,可以使用均值、中位数或其他统计方法填充缺失值;对于异常值,可以根据数据的分布情况,使用 3σ 原则或箱线图等方法进行识别和处理。

  • 数据预处理对数据进行预处理,使其适合模型训练。这包括数据转换、归一化、标准化等操作。例如,对于分类变量,可以使用独热编码(One - Hot Encoding)将其转换为数值型变量;对于数值型变量,可以使用 Min - Max 归一化或 Z - Score 标准化方法,将其缩放到特定的范围,以消除不同特征之间量纲的影响。

此外,还需要将数据集划分为训练集和测试集,通常按照 70% - 30% 或 80% - 20% 的比例进行划分。训练集用于训练模型,测试集用于评估模型的性能。在某些情况下,还可以进一步划分出验证集,用于调整模型的超参数。同时,为每个样本分配权重,以反映样本的重要性。在不平衡数据集上,为少数类样本分配更高的权重,有助于模型更好地学习少数类样本的特征。

3.2 特征选择

随机森林算法在构建决策树时,会对特征进行随机选择,以增加模型的多样性和泛化能力。具体来说,在每个决策树的节点分裂时,会从所有特征中随机选择一个特征子集,并在该子集中选择最优的特征进行分裂。

特征选择的方法有很多种,常见的有以下几种:

  • 基于统计检验使用卡方检验、F 检验等统计方法,评估每个特征与目标变量之间的相关性,选择相关性较高的特征。例如,在一个分类问题中,可以使用卡方检验来判断每个特征对分类结果的影响程度,选择卡方值较大的特征。

  • 基于信息增益根据信息论中的信息增益概念,计算每个特征在分裂节点时所带来的信息增益,选择信息增益较大的特征。信息增益越大,说明该特征对数据的划分能力越强。

  • 基于特征重要性通过计算每个特征在随机森林中的重要性,选择重要性较高的特征。特征重要性的计算方法通常基于特征在决策树中的分裂次数、基尼不纯度减少量等指标。例如,在 Scikit-learn 库中,可以使用 feature_importances_ 属性来获取随机森林模型中每个特征的重要性。

通过特征选择,可以减少特征的数量,降低模型的复杂度,提高模型的训练效率和泛化能力。同时,也有助于我们更好地理解数据,发现数据中潜在的规律。

3.3 多棵树的集成

在完成数据准备和特征选择后,就可以开始构建随机森林模型了。随机森林模型的核心是构建多棵决策树,并将它们的预测结果进行集成。具体步骤如下:

  1. 自助采样从原始训练数据集中进行有放回的抽样,生成多个不同的训练数据集,每个数据集的大小与原始数据集相同。由于是有放回抽样,每个自助样本集大致包含约 ( 1 − e − M N ) N (1-e^\frac{-M}{N})^N (1eNM)N 个不同的样本,且大约有 ( e − M N ) N (e^\frac{-M}{N})^N (eNM)N 个样本未被抽中(出现在自助样本集中的次数为 0),这样每个训练数据集都具有一定的随机性和差异性。

  2. 决策树构建在每个自助采样得到的训练数据集上,独立地构建一个决策树模型。在构建决策树时,每个节点的分裂特征从随机选择的特征子集中选取,以增加决策树之间的差异性。决策树的生长过程可以一直持续到叶节点的样本纯度达到 100%(即叶节点中的样本都属于同一类别),或者达到预设的最大深度、最小样本数等停止条件。

  3. 结果集成当所有决策树构建完成后,对于新的样本,随机森林通过以下方式进行预测:

  4. 分类任务让每棵决策树对样本进行分类,然后统计所有决策树的分类结果,将出现次数最多的类别作为最终的分类结果,即多数投票法。例如,在一个三分类问题中,有 100 棵决策树,其中 40 棵树预测样本为类别 A,35 棵树预测为类别 B,25 棵树预测为类别 C,那么最终该样本被分类为类别 A。

  5. 回归任务计算所有决策树对样本的预测值的平均值,作为最终的预测值。例如,对于一个房价预测问题,10 棵决策树对某套房屋的预测价格分别为 100 万、105 万、98 万、110 万、102 万、99 万、103 万、107 万、101 万、104 万,那么最终的预测价格为 (100 + 105 + 98 + 110 + 102 + 99 + 103 + 107 + 101 + 104) / 10 = 103 万。

通过多棵树的集成,随机森林能够充分利用多个决策树的优势,有效提高模型的准确性和稳定性,降低过拟合的风险。

四、随机森林算法的优缺点

4.1 优势

  • 准确性高随机森林通过集成多个决策树的预测结果,能够充分利用数据中的各种信息,从而提高整体的预测准确性。在许多实际应用中,如图像识别、疾病诊断等领域,随机森林都展现出了比单一决策树更好的性能。例如,在医学图像识别中,随机森林可以综合考虑图像的多个特征,更准确地判断疾病类型。

  • 防止过拟合随机森林在构建过程中引入了样本随机性和特征随机性,这使得每棵决策树都基于不同的数据子集和特征子集进行训练,从而减少了决策树之间的相关性,降低了模型对训练数据的过拟合风险,提高了模型的泛化能力。即使在训练数据有限的情况下,随机森林也能表现出较好的性能。

  • 适用性广随机森林既可以用于分类问题,也可以用于回归问题,并且对数据的分布没有严格要求,无论是线性可分的数据还是非线性数据,随机森林都能进行有效的处理。在金融领域,随机森林可以用于预测股票价格走势(回归问题),也可以用于判断客户是否会违约(分类问题)。

  • 特征评估随机森林能够评估各个特征对预测结果的重要性,这对于特征选择和理解数据具有重要意义。通过了解哪些特征对模型的贡献较大,可以有针对性地进行数据预处理和特征工程,提高模型的性能和可解释性。在分析影响房价的因素时,随机森林可以帮助我们确定房屋面积、地理位置、房龄等特征对房价的影响程度。

  • 并行处理由于每棵决策树的构建是相互独立的,随机森林天然支持并行计算,能够充分利用多核处理器的优势,大大加快训练速度。在处理大规模数据集时,并行计算可以显著缩短训练时间,提高工作效率。

4.2 局限性

  • 模型解释性差与单棵决策树相比,随机森林作为一个集成模型,内部结构较为复杂,难以直观地解释其预测结果和决策过程,这在一些对模型可解释性要求较高的场景中,如医疗诊断、金融风险评估等,可能会限制其应用。例如,在医疗诊断中,医生需要了解模型做出诊断的依据,而随机森林较难提供清晰的解释。

  • 计算资源消耗大构建大量的决策树需要较多的计算资源和内存,训练时间也会随着决策树数量的增加而显著增长。在处理大规模数据集或实时性要求较高的任务时,可能会面临计算资源不足的问题。比如,在实时推荐系统中,需要快速响应用户请求,随机森林的计算成本可能无法满足实时性要求。

  • 对噪声数据敏感尽管随机森林在一定程度上具有抗噪声能力,但如果数据中的噪声较多,尤其是在数据预处理不充分的情况下,随机森林可能会对噪声过度拟合,从而影响模型的准确性和泛化能力。在一些含有大量异常值的数据集上,随机森林的性能可能会受到较大影响 。

五、随机森林算法的应用场景

5.1 分类问题

随机森林在分类问题中有着广泛的应用,以垃圾邮件检测为例,它可以根据邮件的文本内容、发件人信息、邮件主题等多个特征,判断一封邮件是否为垃圾邮件。通过对大量已知垃圾邮件和正常邮件的学习,随机森林能够捕捉到垃圾邮件的特征模式,如常见的垃圾词汇、特定的发件人域名等。在实际应用中,它可以快速准确地对新收到的邮件进行分类,将垃圾邮件自动过滤到垃圾箱,大大提高了用户处理邮件的效率,减少了用户受到垃圾邮件干扰的可能性。

疾病诊断领域,随机森林同样发挥着重要作用。医生可以将患者的症状、病史、检查结果等数据作为特征输入到随机森林模型中,模型通过学习大量的病例数据,能够对疾病进行准确的分类和诊断。例如,在癌症诊断中,随机森林可以综合分析患者的影像学检查结果、肿瘤标志物水平等信息,判断患者是否患有癌症以及癌症的类型,为医生提供重要的诊断参考,有助于提高诊断的准确性和及时性,为患者的治疗争取宝贵的时间。

5.2 回归问题

房价预测是随机森林在回归问题中的典型应用。房屋的价格受到多种因素的影响,如房屋面积、地理位置、房龄、周边配套设施等。随机森林可以对这些因素进行综合分析,建立房价预测模型。通过对大量历史房屋交易数据的学习,它能够发现各个因素与房价之间的复杂关系,从而对新的房屋价格进行预测。对于购房者来说,房价预测结果可以帮助他们合理评估房屋的价值,做出更明智的购房决策;对于房地产开发商和投资者来说,准确的房价预测有助于他们制定合理的开发和投资策略。

股票价格预测方面,随机森林也能派上用场。股票价格的波动受到众多因素的影响,包括宏观经济数据、公司财务状况、行业趋势、市场情绪等。随机森林可以整合这些多维度的数据,挖掘数据背后隐藏的规律,对股票价格的走势进行预测。虽然股票市场具有高度的不确定性和复杂性,随机森林的预测结果不能保证完全准确,但它可以为投资者提供有价值的参考,帮助投资者更好地理解市场,制定投资策略,降低投资风险。

5.3 特征重要性评估

随机森林能够有效地评估各个特征对预测结果的重要性。它主要通过两种常见的方法来实现:基于基尼指数(Gini Index)基于特征重要性的排列方法。

  • 基于基尼指数的评估方法,是计算所有决策树上使用该特征的节点的基尼指数之和,以此作为该特征的重要性评分。基尼指数用于衡量决策树节点的不纯度,不纯度越低,说明该节点的样本越属于同一类别,分类效果越好。如果一个特征在决策树的节点分裂中,能够使基尼指数显著降低,即该特征能够有效地划分样本,使得子节点的样本更加纯净,那么这个特征的重要性就越高。例如,在预测水果类别的随机森林模型中,如果颜色这个特征在多个决策树的节点分裂中,都能很好地将不同水果区分开来,使得基尼指数大幅下降,那么颜色就是一个对预测结果很重要的特征。

  • 基于特征重要性的排列方法,原理是通过随机打乱某个特征的值,然后重新计算模型的预测结果。如果重新排列后的预测结果变化很大,说明该特征对模型的影响力很大,其重要性也就越高;反之,如果变化很小,说明该特征对模型的影响较小。例如,在一个预测客户购买行为的模型中,将客户的购买历史这个特征的值随机打乱后,模型的预测结果发生了明显的变化,这就表明购买历史是影响客户购买行为的重要特征。

这种特征重要性评估在实际应用中具有重要作用。在特征选择方面,我们可以根据评估结果,选择重要性较高的特征,去除不重要的特征,从而减少数据的维度,降低模型的复杂度,提高模型的训练效率和泛化能力。在模型解释中,特征重要性评估结果可以帮助我们理解模型的决策过程,了解哪些因素对预测结果的影响最大,为我们的决策提供依据。例如,在分析影响产品销量的因素时,通过随机森林的特征重要性评估,我们可以确定价格、广告投入、产品质量等因素对销量的影响程度,从而有针对性地制定营销策略 。

六、随机森林算法与其他算法的比较

6.1 与决策树的比较

  • 结构差异决策树是一种单一的树形结构,通过一系列的条件判断来对数据进行分类或回归。而随机森林则是由多棵决策树组成的集成模型,每棵决策树都基于不同的自助样本集和特征子集进行训练,这些决策树之间相互独立。

  • 性能差异单棵决策树训练速度相对较快,但是容易过拟合,尤其是在面对复杂的数据分布时,它可能会学习到数据中的噪声和细节,导致在新数据上的泛化能力较差。随机森林通过集成多棵决策树,有效地降低了过拟合的风险,提高了模型的泛化能力和稳定性。在大多数情况下,随机森林的预测准确性要高于单棵决策树。

  • 应用差异决策树由于其结构简单、可解释性强,适用于对模型可解释性要求较高,且数据规模较小、数据分布相对简单的场景,如简单的规则分类问题。随机森林则更适用于数据规模较大、数据分布复杂的场景,能够在各种复杂的分类和回归任务中表现出色,如图像识别、语音识别等领域 。

6.2 与支持向量机(SVM)的比较

  • 核心思想支持向量机的核心思想是寻找一个最优的超平面,将不同类别的数据点尽可能地分隔开,通过最大化间隔来提高模型的泛化能力。而随机森林则是基于集成学习的思想,通过构建多个决策树,并综合它们的预测结果来进行分类或回归。

  • 算法原理SVM 在处理线性可分问题时,直接寻找线性分类超平面;对于非线性问题,通过核函数将数据映射到高维空间,在高维空间中寻找线性分类超平面。随机森林则是通过自助采样和随机特征选择构建多棵决策树,决策树的构建基于特征的划分和节点的分裂。

  • 应用场景SVM 在高维数据和小样本数据上表现较好,适用于数据维度较高且样本数量相对较少的场景,如文本分类、生物信息学等领域。随机森林则对数据的适应性更强,无论是高维数据还是低维数据,大样本数据还是小样本数据,都能有较好的表现,广泛应用于各种分类和回归问题。

  • 优缺点SVM 的优点是在高维空间中表现出色,能够处理非线性问题,并且理论基础较为完善。然而,它的训练时间较长,对参数的选择较为敏感,且在处理大规模数据集时计算成本较高。随机森林的优点在于训练速度相对较快,对数据的适应性强,能够评估特征的重要性,并且不容易过拟合。缺点是模型的可解释性相对较差,当决策树数量过多时,计算资源消耗较大 。

6.3 与神经网络的比较

  • 模型复杂度神经网络通常具有复杂的结构,包含多个隐藏层和大量的神经元,模型的参数众多,需要进行大量的计算和训练。随机森林的结构相对简单,由多棵决策树组成,每棵决策树的结构也较为直观,易于理解。

  • 特征提取神经网络可以自动学习数据中的特征表示,通过多层神经元的非线性变换,能够提取到数据中复杂的高级特征。随机森林则依赖于人为选择的特征,在构建决策树时,通过对给定特征的划分来进行决策。

  • 数据量需求神经网络通常需要大量的数据进行训练,以学习到数据中的复杂模式和规律。如果数据量不足,容易出现过拟合现象。随机森林对数据量的要求相对较低,在数据量有限的情况下也能有较好的表现,并且能够通过自助采样和随机特征选择等方式,增强模型的泛化能力。

  • 训练时间与计算资源神经网络的训练过程通常需要较长的时间,尤其是在处理大规模数据集和复杂模型时,需要消耗大量的计算资源,如 GPU 等。随机森林的训练时间相对较短,并且可以并行构建多棵决策树,充分利用多核处理器的优势,提高训练效率。

  • 可解释性神经网络通常被视为黑盒模型,其内部的决策过程和特征学习机制难以直观理解。虽然可以通过一些技术进行可视化和解释,但相对较为复杂。随机森林的可解释性相对较好,可以通过分析决策树的结构和特征重要性,了解模型的决策依据和各个特征对预测结果的影响 。

七、随机森林算法的调优策略

7.1 参数选择

  • n_estimators:该参数表示随机森林中树的数量,是对随机森林模型的精确程度、复杂度、学习能力、过拟合情况、需要的计算量和计算时间都有很大的影响,通常树的数量越多,模型的泛化能力越强,对训练数据的拟合效果越好,但相应的计算成本也会增加。当 n_estimators 较小时,模型可能欠拟合,随着 n_estimators 不断增大,模型的性能逐渐提升,但达到一定程度后,性能提升会变得不明显,甚至可能因为计算资源的限制而导致训练时间过长。在实际应用中,需要根据数据集的大小、计算资源以及对模型性能的要求来合理选择 n_estimators 的值,可以通过实验和调参来确定最优值,一般建议从较小的值开始尝试,如 50 或 100,然后逐步增加,观察模型性能的变化。

  • max_depth:此参数指单颗决策树的最大深度,它控制着树的生长。如果 max_depth 设置过大,决策树可能会过度拟合训练数据,学习到数据中的噪声和细节;如果设置过小,决策树可能无法充分学习数据的特征,导致欠拟合。当数据量较小且特征较少时,可以适当增大 max_depth,让决策树充分生长;当数据量较大且特征较多时,为了防止过拟合,需要限制 max_depth 的值,一般可以在 10 - 100 之间进行尝试,通过交叉验证等方法来确定最佳值。

  • min_samples_split:该参数决定一个节点是否分裂所需的最小样本数。如果节点中的样本数小于 min_samples_split,节点将不再分裂。它可以防止决策树在样本数较少的节点上继续分裂,从而避免过拟合。默认值为 2,在数据量较小的情况下,使用默认值通常即可;若数据量较大,为降低计算量,可以适当增大这个值,比如设置为 5 或 10 。

  • min_samples_leaf:表示叶子节点上所需的最小样本数。如果叶子节点的样本数小于 min_samples_leaf,该叶子节点可能会被剪枝。它有助于防止决策树过度生长,提高模型的泛化能力。默认值是 1,在实际应用中,若数据量较大且存在噪声,可以适当增大该值,如设置为 5 或 10,以增强模型的稳定性。

  • max_features:该参数决定了每次节点分裂时考虑的特征数。默认值为 auto,表示考虑所有特征。此外,还可以设置为’sqrt’,表示考虑特征数的平方根;‘log2’ 表示考虑特征数的对数;也可以指定具体的整数或浮点数(表示特征数的比例)。选择合适的 max_features 可以增加决策树之间的差异性,减少过拟合的风险。例如,在特征较多的情况下,可以尝试使用’sqrt’ 或 ‘log2’ 来限制特征的选择范围;如果特征之间的相关性较低,也可以适当增大 max_features 的值 。

7.2 避免过拟合

  • 增加树的数量适当增加随机森林中树的数量,能够降低模型的方差,提高模型的稳定性和泛化能力。因为随着树的数量增多,个别树的过拟合对整体模型的影响会被削弱,就像一个团队中成员越多,个别成员的失误对整体的影响就越小。但要注意,树的数量并非越多越好,过多的树会增加计算成本和训练时间,并且当树的数量达到一定程度后,模型性能提升可能不明显。

  • 限制树的深度通过设置合理的 max_depth 参数,限制决策树的生长深度,可以有效防止决策树过度拟合训练数据。较浅的树结构能够避免学习到数据中的噪声和局部细节,从而提高模型的泛化能力。在实际应用中,需要根据数据集的特点和问题的复杂程度来调整 max_depth 的值,通过实验和验证来找到最优的深度。

  • 使用袋外数据评估随机森林在构建每棵决策树时,由于采用有放回的自助采样法,会有一部分样本没有被用于训练当前的决策树,这部分样本称为袋外(Out - of - Bag,OOB)数据。利用 OOB 数据可以对模型进行评估,无需额外划分验证集。通过观察模型在袋外数据上的表现,如准确率、误差等指标,来调整模型的参数,以避免过拟合。如果模型在袋外数据上的表现与在训练数据上的表现相差较大,可能存在过拟合问题,需要进一步优化模型。

  • 特征选择在构建随机森林之前,对特征进行筛选,去除那些对目标变量影响较小或冗余的特征,可以减少模型的复杂度,降低过拟合的风险。可以使用基于统计检验、信息增益、特征重要性等方法来进行特征选择,保留对模型预测结果贡献较大的特征,提高模型的性能和泛化能力。

八、实践中的随机森林算法

8.1 代码实现(Python 示例)

下面是使用 Python 和 scikit - learn 库实现随机森林算法进行分类任务的完整代码示例,我们将使用经典的鸢尾花数据集来进行演示。鸢尾花数据集包含了鸢尾花的四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)以及对应的类别标签(山鸢尾、变色鸢尾、维吉尼亚鸢尾),通过这个数据集,我们可以训练一个随机森林分类模型,用于预测鸢尾花的类别。

# 导入必要的库from sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score, classification_report# 加载鸢尾花数据集iris = load_iris()X = iris.datay = iris.target# 将数据集划分为训练集和测试集,测试集占比30%X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=20)# 创建随机森林分类器,设置树的数量为2rf = RandomForestClassifier(n_estimators=2, random_state=20)# 训练模型rf.fit(X_train, y_train)# 对测试集进行预测y_pred = rf.predict(X_test)# 计算模型的准确率accuracy = accuracy_score(y_test, y_pred)print(f"模型的准确率为: {accuracy}")# 生成分类报告print("分类报告:\n", classification_report(y_test, y_pred))

在这里插入图片描述

这里我们使用的鸢尾花数据集数据特征有4个,所以我们将 n_estimators 初始值设为2。大家可以尝试将该值设置成其他值,看看最终的预测结果有啥不一样?欢迎在评论区交流。

8.2 结果分析与可视化

1. 模型评估指标计算

  • 准确率(Accuracy)表示模型正确预测的样本数占总样本数的比例,在上述代码中,我们使用accuracy_score函数计算得到。它反映了模型在整体上的预测准确性,但在类别不平衡的数据集上,准确率可能会掩盖模型对少数类别的预测能力。

  • 精确率(Precision)针对每个类别,精确率是指模型预测为该类别的样本中,实际属于该类别的样本比例。在分类报告中,精确率对于评估模型在识别正样本(或特定类别样本)时的准确性非常重要。例如,如果我们关注的是某种罕见疾病的诊断,精确率可以告诉我们模型诊断为患病的样本中,真正患病的比例。

  • 召回率(Recall)也称为灵敏度或真正率,它表示实际属于某个类别的样本中,被模型正确预测为该类别的样本比例。召回率对于评估模型捕捉所有正样本(或特定类别样本)的能力至关重要。在疾病诊断场景中,召回率可以反映模型是否能够准确地检测出所有患病的样本,避免漏诊。

  • F1 值(F1 - score)是精确率和召回率的调和平均数,综合考虑了两者的因素。F1 值越高,说明模型在精确率和召回率之间取得了较好的平衡,在评估模型性能时,F1 值提供了一个更全面的指标。

2. 特征重要性可视化

随机森林可以评估每个特征对预测结果的重要性,我们可以使用 feature_importances_ 属性获取每个特征的重要性得分,并使用 matplotlib 库进行可视化。以下是实现代码:

import matplotlib.pyplot as pltimport numpy as np# 获取特征重要性得分importances = rf.feature_importances_# 获取特征名称feature_names = iris.feature_names# 对特征重要性进行排序indices = np.argsort(importances)[::-1]# 绘制特征重要性条形图plt.figure(figsize=(10, 6))plt.title("特征重要性")plt.bar(range(len(feature_names)), importances[indices])plt.xticks(range(len(feature_names)), [feature_names[i] for i in indices], rotation=45)plt.xlim([-1, len(feature_names)])plt.show()

在这里插入图片描述

通过上述代码生成的可视化图表,我们可以直观地看到每个特征对模型预测结果的重要程度。在这个鸢尾花数据集的例子中,我们可以清楚地了解到哪些特征在区分不同种类的鸢尾花时起到了关键作用,这对于我们理解数据和模型的决策过程具有重要意义。如果是在实际应用中,比如在预测客户购买行为时,特征重要性可视化可以帮助我们确定哪些因素(如客户年龄、购买历史、浏览记录等)对购买行为的影响最大,从而有针对性地制定营销策略 。

九、总结与展望

随机森林算法作为机器学习领域中极为重要且备受瞩目的算法,凭借其别具一格的原理以及令人瞩目的出色性能,在诸如金融风险预测、医疗疾病诊断、图像识别、自然语言处理、工业生产质量控制等众多领域里都发挥着无可替代的关键作用。

它是基于决策树的一种集成学习方法,其构建过程具体为:首先,从原始数据集中有放回地随机抽取多个样本子集,针对每个样本子集分别构建决策树;然后,在构建决策树的过程中,对于每一个节点,并不是考虑所有的特征,而是随机选择一部分特征来进行分裂,以此来确定最优的分裂方式。通过这样构建多个决策树,并将它们的预测结果进行组合,例如采用多数投票法(对于分类问题)或者平均值法(对于回归问题),最终实现了对数据精准且高效的分类和预测。

随机森林算法的随机性着重体现在数据采样和特征选择这两个关键方面。数据采样的随机性使得每个决策树所基于的样本都有所不同,从而增加了模型的多样性;特征选择的随机性则避免了某个或某些特征在所有决策树中都占据主导地位的情况。正是这两个方面的随机性,使得它能够有效地减少过拟合问题,显著提高模型的泛化能力,使其能够在不同的数据集和应用场景中都展现出良好的适应性和稳定性 。


机器学习项目代码地址:【传送门】


延伸阅读

  • 机器学习核心算法系列文章
    解锁机器学习核心算法 | K -近邻算法:机器学习的神奇钥匙
    解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
    解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器
    解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
    解锁机器学习核心算法 | 线性回归:机器学习的基石

  • 深度学习框架探系列文章
    深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
    深度学习框架探秘|PyTorch:AI 开发的灵动画笔
    深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
    深度学习框架探秘|Keras:深度学习的魔法钥匙

相关文章:

解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器

一、引言 在机器学习的广阔领域中,算法的选择犹如为一场冒险挑选趁手的武器,至关重要。面对海量的数据和复杂的任务,合适的算法能够化繁为简,精准地挖掘出数据背后隐藏的模式与价值。机器学习领域有十大核心算法,而随…...

JAVA学习第五天

接口的变量定义固定为静态变量 接口里面只能有抽象方法,且不能有构造方法 如果不重写tostring方法,会打印没有价值的信息...

【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(4对角转置)

CUDA C编程笔记 第四章 全局内存4.4 核函数可达到的带宽4.4.2.4 对角转置【让DRAM访问更均匀,提高性能】 待解决的问题: 第四章 全局内存 4.4 核函数可达到的带宽 4.4.2.4 对角转置【让DRAM访问更均匀,提高性能】 前置条件场景&#xff1…...

深入理解 lua_KFunction 和 lua_CFunction

在 Lua C API 中,lua_KFunction 和 lua_CFunction 是两个核心概念,尤其在处理协程和 C 函数扩展时扮演着至关重要的角色。lua_CFunction 作为一种 C 函数类型,允许开发者将 C 函数注册到 Lua 环境中,使得这些 C 函数可以在 Lua 脚本中被调用,进而实现 Lua 的功能扩展。而 …...

Nacos Derby 远程命令执行漏洞修复建议

由于Nacos < 2.4.0 BETA 存在 Derby 远程命令执行漏洞&#xff0c;恶意攻击者利用此漏洞可以未授权执行SQL语句&#xff0c;最终导致任意代码执行。目前该漏洞PoC和技术细节已在互联网上公开。 一、漏洞情况分析 Nacos 是一个功能强大的服务注册与发现、配置管理平台&#…...

MySQL(1)基础篇

执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…...

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL&#xff1a; CREATE DATABASE dbname; 人大金仓&#xff08;Kingbase&#xff09;&#xff1a; 在人大金仓中&#xff0c;CREATE DATABASE 的语法通常相同&#xff0c;但可能需要特别注意字符集的指定&#xff08;如果涉及到多语言支持…...

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…...

C语言流程控制学习笔记

1. 顺序结构 顺序结构是程序中最基本的控制结构&#xff0c;代码按从上到下的顺序依次执行。大多数C语言程序都是由顺序结构组成的。 2. 选择结构 选择结构根据条件的真假来决定执行哪一段代码。在C语言中&#xff0c;选择结构主要有以下几种&#xff1a; 2.1 if 语句 if语…...

解析DrugBank数据库数据|Python

一、DrugBank 数据库简介 DrugBank 是一个综合性的生物信息学和化学信息学数据库&#xff0c;专门收录药物和靶点的详细信息。它由加拿大阿尔伯塔大学的 Wishart 研究组 维护&#xff0c;提供化学、药理学、相互作用、代谢、靶点等多方面的药物数据。DrugBank 结合了实验数据和…...

排序算法:冒泡排序

冒泡排序标准代码&#xff08;C语言&#xff09; c复制代码 #include <stdio.h>// 冒泡排序函数 void bubbleSort(int arr[], int n) {// 外层循环&#xff1a;控制排序轮数for (int i 0; i < n - 1; i) {// 内层循环&#xff1a;控制每轮比较次数for (int j 0; j…...

网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件

一、前言 最近几个月里&#xff0c;我一直在学习网络爬虫方面的知识&#xff0c;每有收获都会将所得整理成文发布&#xff0c;不知不觉已经发了7篇日志了&#xff1a; 网络爬虫学习&#xff1a;从百度搜索结果抓取标题、链接、内容&#xff0c;并保存到xlsx文件中 网络爬虫学…...

[原创](Modern C++)现代C++的关键性概念: 妙用std::reference_wrapper, 让std::list容器具有随机访问功能.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…...

智享AI直播三代系统,马斯克旗下AI人工智能直播工具,媲美DeepSeek!

智享AI直播三代系统&#xff0c;马斯克旗下AI人工智能直播工具,媲美DeepSeek&#xff01; 在科技飞速发展的当下&#xff0c;人工智能正以前所未有的态势重塑着各个行业的格局。直播领域&#xff0c;作为信息传播与商业交互的前沿阵地&#xff0c;也在AI技术的赋能下迎来了颠覆…...

2.19学习记录

Web easyupload3.0 这是一道构造.htaccess文件的传马 如下&#xff1a; <FilesMatch "jpg">SetHandler application/x-httpd-php </FilesMatch>.htaccess文件可以作为一个解释器&#xff0c;可以将传进去的图片马改为php马上传之后再传个图片马&#…...

RT-Thread+STM32L475VET6实现呼吸灯

文章目录 前言一、板载资源资源说明二、具体步骤1.新建rt_thread项目2. 打开PWM设备驱动3. 在Stm32CubeMX配置定时器3.1打开Stm32CubeMX3.2 使用外部高速时钟&#xff0c;并修改时钟树3.3打开定时器1&#xff0c;并配置通道一为PWM输出模式(定时器根据自己需求调整)3.4 打开串口…...

SpringBoot 项目配置动态数据源

目录 一、前言二、操作1、引入依赖2、配置默认数据库 13、定义数据源实体和 Repository4、定义动态数据源5、配置数据源6、定义切换数据源注解7、定义切面类8、使用注解切换数据源 一、前言 通过切面注解方式根据不同业务动态切换数据库 二、操作 1、引入依赖 <dependen…...

动态订阅kafka mq实现(消费者组动态上下线)

和上篇文章 动态订阅rocket mq实现(消费者组动态上下线) 目的一致&#xff0c;直接上代码 /*** Kafka topic container集合*/private static final Map<String, ConcurrentMessageListenerContainer<String, String>> topics new HashMap<>();public void r…...

Coze扣子怎么使用更强大doubao1.5模型

最近&#xff0c;豆包刚刚发布了最新的doubao1.5系列模型&#xff0c;并且加量不加价。 在性能极大进步的情况下&#xff0c;价格还与之前一致。真是业界良心了。 在同样的价格下&#xff0c;肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…...

Zookeeper 和 Redis 哪种更好?

目录 前言 &#xff1a; 什么是Zookeeper 和 Redis &#xff1f; 1. 核心定位与功能 2. 关键差异点 (1) 一致性模型 (2) 性能 (3) 数据容量 (4) 高可用性 3. 适用场景 使用 Zookeeper 的场景 使用 Redis 的场景 4. 替代方案 5. 如何选择&#xff1f; 6. 常见误区 7. 总结 前言…...

22.4.3.2 TCP/UDP连接信息

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过IPGlobalProperties的方法可以获得有关TCP和UDP连接的信息&#xff1a; GetActiveTcpConnections方法获得所有的TCP连接的信息…...

【Node.js】express框架

目录 1初识express框架 2 初步使用 2.1 安装 2.2 创建基本的Web服务器 2.3 监听方法 2.3.1 监听get请求 2.3.2 监听post请求 2.4 响应客户端 2.5 获取url中的参数(get) 2.5.1 获取查询参数 2.5.2 获取动态参数 2.6 托管静态资源 2.6.1 挂载路径前缀 2.6.2 托管多…...

拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录 一、拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff1a;都是“守门员”&#xff01;二、如何实现拦截器和过滤器&#xff1f;三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 &#x1f31f;如果喜欢作者的讲…...

分布式架构与XXL-JOB

目录 先了解什么是任务调度&#xff1f; 什么是分布式任务调度&#xff1f; 了解XXL-JOB分布式任务调度平台 如何搭建XXL-JOB&#xff1f; 分片广播 作业分片方案 最近学习在项目的媒资管理模块如何高效处理大量视频&#xff0c;上传单个视频可能涉及到转码&#xff0c…...

6121A 音频分析仪

6121A 音频分析仪 音频信号产生 音频信号分析 国产 6121A是具有音频信号产生和音频信号分析功能的测试仪器&#xff0c;适用于语音性能测试和音频功放测试等领域&#xff0c;满足电台、移动通信、音响设备和水声通信设备对频响、谐波失真和信噪比等指标的测试需求&#xff…...

什么是幂等性?

一.幂等性 什么是幂等性&#xff1f; 在计算机科学和数学领域中&#xff0c;” 幂等性 “虽然源于相同的概念&#xff0c;但其应用和具体含义有所不同 在数学中&#xff1a;幂等性是一个代数性质&#xff0c;描述的是一个操作或函数在多次应用后结果不变的特性 在分布式系统…...

2025/2/19机试准备

1.%c不忽略空格&#xff08; &#xff09; 2.启示 #include <stdio.h> #include <string.h> int main(){char str[100]{0};int x,y;int n1,n2,n3;int i;while(scanf("%s",str)!EOF){istrlen(str);if(i%30){//12446-2n1i/3;n3i/3;n2i/32;}else if(i%31){…...

【wrk】wrk 压测工具入门

1. 简介 wrk 是我无意间发现的一款简单好用的 HTTP 接口性能测试工具&#xff0c;目前在 Github 上已经有 38k 的 star 数了&#xff01; ⭐ Github地址&#xff1a;https://github.com/wg/wrk 2. 安装 环境要求&#xff1a; windows10 平台安装过 ubuntu 等 Linux 子系统 …...

12.1 Android中协程的基本使用

文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念&#xff0c;只知道协程能够使得异步操作等同于同步操作&#xff0c;且不会…...

华为 eNSP:MSTP

一、MSTP是什么 MSTP是多业务传送平台&#xff08;Multi-Service Transport Platform&#xff09;的缩写&#xff0c;它是一种基于SDH&#xff08;同步数字体系&#xff09;技术的传输网络技术&#xff0c;用于同时实现TDM、ATM、以太网等多种业务的接入、处理和传送。 MSTP技…...

HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...

LangChain大模型应用开发:消息管理与聊天历史存储

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天要给大家分享的是LangChain中的消息管理与聊天历史存储。 在LangChain里&#xff0c;消息管理可精细区分用户、助手、系统等不同角色消息&#xff0c;有序调度处理&#xff0c;让交互更顺畅。而聊天历史存储则赋予模型 …...

flink-cdc同步数据到doris中

1 创建数据库和表 1.1 数据库脚本 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 flnk-cdc 参考Flink CDC实时同步MySQL到Doris Flink CDC 概述 2.1.1 最简单的单表同步 从下面的yml脚本可以看到&#xff0c;并没有doris中创建…...

轻量级在线ETL数据集成工具架构设计与技术实现深度剖析

在当今数字化时代,企业面临着海量异构数据的整合挑战。ETL(Extract, Transform, Load)工具作为数据集成的核心,负责将分散在不同数据源中的数据进行抽取、转换和加载,以构建统一的数据视图。本文将深入剖析一款基于诺依框架开发的在线ETL数据集成工具,重点阐述其架构设计…...

【Linux专栏】find命令+同步 实验

Linux & Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.实验背景 需要把一个目录中所有文件,按照目录把某个时间点之前的同步到一个盘中,之后的同步备份到另一个盘中,实现不同时间段的备份。 本次实现目标:把common文件夹中 2025年之后的含文件夹…...

15-最后一个单词的长度

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 方法一&#xff1a;使用字符串分割 可以使用字符串的 split 方法将字符串按空格分割…...

DeepSeek和ChatGPT的全面对比

一、模型基础架构对比&#xff08;2023技术版本&#xff09; 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...

LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装

LlamaFactory https://llamafactory.readthedocs.io/zh-cn/latest/ 安装 必须保证版本匹配&#xff0c;否则到训练时&#xff0c;找不到gpu cuda。 否则需要重装。下面图片仅供参考。因为cuda12.8装了没法用&#xff0c;重新搞12.6 cudacudnnpytorch12.69.612.6最新&#xf…...

什么是网关,网关的作用是什么?网络安全零基础入门到精通实战教程!

1. 什么是网关 网关又称网间连接器、协议转换器&#xff0c;也就是网段(局域网、广域网)关卡&#xff0c;不同网段中的主机不能直接通信&#xff0c;需要通过关卡才能进行互访&#xff0c;比如IP地址为192.168.31.9(子网掩码&#xff1a;255.255.255.0)和192.168.7.13(子网掩码…...

Linux基础25-C语言之分支结构Ⅱ【入门级】

用if语句实现分支结构 单分支&#xff1a;if… 语法&#xff1a; //语法1&#xff1a;舍弃{} if(条件表达式);单语句; //语法2&#xff1a;必须保留{} if(条件表达式) {单语句或者复合语句; }流程图 功能 若表达式值为真&#xff08;非0&#xff09;&#xff0c;则执行表达式…...

实战开发coze应用-姓氏头像生成器(上)

​欢迎关注【AI技术开发者】 上次&#xff0c;我们开发了一个对话形式的头像生成器智能体&#xff08;Agents&#xff09;&#xff0c;广受大家欢迎。 同时也接收到一些用户的反馈&#xff0c;生成前无法看到头像样式、初次使用不会用等等。 对此&#xff0c;我准备使用Coze开…...

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…...

uniapp 滚动尺

scale组件代码&#xff08;部分class样式使用到了uview1.0的样式&#xff09; <template><view><view class"scale"><view class"pointer u-flex-col u-col-center"><u-icon name"arrow-down-fill" size"26&qu…...

vue3之echarts3D圆柱

vue3之echarts3D圆柱 效果&#xff1a; 版本 "echarts": "^5.1.2" 核心代码&#xff1a; <template><div ref"charts" class"charts"></div><svg><linearGradient id"labColor" x1"0&q…...

SQL 优化工具使用之 explain 详解

一、导读 对于大部分开发人员来说&#xff0c;平常接触的无非就是增删改查这些基本操作&#xff0c;创建存储过程&#xff0c;视图等等都是 DBA 该干的活&#xff0c;但是想要把这些基本操作写的近乎完美也是一件难事。 而 explain 显示了 MySQL 如何使用索引来处理 select 语…...

SpringBoot启动失败之application.yml缩进没写好

修改前&#xff1a; spring前面空格了 报错输出&#xff1a;Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...

基于SpringBoot+vue粮油商城小程序系统

粮油商城小程序为用户提供方便快捷的在线购物体验&#xff0c;包括大米、面粉、食用油、调味品等各种粮油产品的选购&#xff0c;用户可以浏览商品详情、对比价格、下单支付等操作。同时&#xff0c;商城还提供优惠活动、积分兑换等福利&#xff0c;让用户享受到更多实惠和便利…...

【JavaEE进阶】Spring MVC(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…...

案例-17.文件上传-阿里云OSS-入门

一.文件上传 我们在OSS页面中找到SDK下载&#xff0c;点击SDK示例&#xff0c;找到帮助文档。 点击JAVA并安装 在安装SDK中找到在Maven项目中加入依赖项(推荐方式) 将其中的依赖复制到pom文件中去。 <dependency><groupId>com.aliyun.oss</groupId><ar…...

java数据结构_优先级队列(堆)_6.2

3. 常用接口 3.1 PriorityQueue的特性 Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列&#xff0c;PriorityQueue的线性不安全的&#xff0c;PriorityBlockingQueue是线程安全的&#xff0c;这里主要介绍PriorityQueueu。 关于PriorityQueue…...