AutoML入门
一、理解AutoML组的核心任务
AutoML的目标是在无需大量人工干预的情况下,自动完成机器学习或深度学习建模流程中的一系列关键步骤。你的工作主要涉及自动化大模型应用的构建,涵盖从数据预处理到模型选择、超参数调优、模型评估等多方面,具体任务可能包括:
-
数据预处理自动化:
- 自动化数据清洗、特征工程等流程,确保模型输入数据的质量。
- 支持各种输入数据类型的处理(如文本、图像、结构化数据)。
- 数据增强(如文本的分词、嵌入生成、图像的翻转或剪切等)。
-
模型选择与配置:
- 根据任务需求(如分类、回归、生成、理解等)自动选择合适的大模型架构。
- 模型选择的同时可能包括架构搜索(例如基于特定应用的Transformer架构优化)。
- 自动匹配特定任务的模型参数或配置,如层数、注意力头数等。
-
超参数调优:
- 自动进行超参数调优(Hyperparameter Tuning),使用如贝叶斯优化、随机搜索、进化算法等方法。
- 支持分布式或多任务调优,使得调优过程高效快速。
-
模型评估与选择:
- 自动化评估模型性能,如使用指标(F1-score、BLEU、ROUGE等)评估模型表现,选择最优模型。
- 如果需要支持在线应用,还可能涉及到实时的性能监控和优化反馈。
-
推理优化:
- 自动化地优化模型在推理时的性能,包括量化、剪枝、蒸馏等技术,确保大模型应用在服务端的低延迟和高效性。
- 适配不同硬件资源的推理需求,比如针对CPU、GPU甚至TPU等硬件加速的优化。
-
工作流管理:
- 自动化大模型应用的整体工作流,包括数据流、模型训练、测试和上线等环节的管理和调度。
- 引入工作流管理工具或平台(如Kubeflow、Airflow等),以便追踪和管理不同任务之间的依赖。
二、学习
-
AutoML框架与算法:
- AutoML工具:学习AutoKeras、AutoGluon、H2O.ai等常见AutoML框架,了解其自动建模、特征选择和参数调优的工作方式。
- 超参数调优方法:深入理解如贝叶斯优化、网格搜索、随机搜索、进化算法等调优方法。
- 架构搜索技术(NAS):了解神经架构搜索(Neural Architecture Search)相关算法,尤其是基于强化学习或遗传算法的NAS方法。
-
大模型技术基础:
- Transformer架构:深入理解Transformer的结构、编码器和解码器部分的作用。
- 模型优化:学习模型剪枝、量化、知识蒸馏等技术,这些技术能有效降低模型规模,提高推理效率。
- 分布式训练和推理:掌握大模型分布式训练的基本流程与实现方法,包括数据并行、模型并行等策略。
-
数据处理与特征工程:
- 数据预处理与增强:掌握常见的数据清洗、文本处理(如分词、去停用词、句法分析等)、图像预处理等操作。
- 特征选择和降维:学习特征工程的方法,包括PCA、t-SNE等降维技术,以及特征选择的重要性评估。
-
深度学习与机器学习框架:
- PyTorch、TensorFlow:熟悉这两个主流深度学习框架的API、模型搭建方式、调优和优化工具。
- 其他工具:如Scikit-learn、XGBoost等,尤其是特征工程、模型调优等模块,这些在大模型应用的前期准备阶段会很有用。
-
工作流管理工具:
- Kubeflow:学习基于Kubernetes的ML工作流工具Kubeflow,掌握其对数据预处理、模型训练、评估和发布的自动化管理。
- Airflow:了解Airflow等工作流调度工具,通过DAG(有向无环图)方式管理任务依赖。
-
云计算与分布式计算:
- 云服务:学习云平台的AutoML服务(如Google AutoML、AWS Sagemaker等),理解如何将自己的AutoML系统和云服务无缝集成。
- 分布式计算:掌握分布式计算框架(如Apache Spark、Ray等),适应大规模数据处理和分布式超参数调优的需求。
-
容器化与部署:
- Docker与Kubernetes:掌握容器化技术,能够快速将大模型应用及其AutoML组件封装、部署和管理。
- 模型服务化框架:如TensorFlow Serving、TorchServe等,能够实现模型的快速上线和负载均衡。
三、学习路径建议
-
从基础框架入手:先熟悉如PyTorch、TensorFlow等深度学习框架,结合Scikit-learn等常用的机器学习工具库。
-
学习AutoML理论与实现:通过实际项目了解AutoML的实现过程,如从简单的网格搜索逐步深入到高级的贝叶斯优化、NAS架构搜索等。
-
深入特定领域应用:可以选择一个具体的应用场景(如文本分类、图像识别等)深入研究AutoML的流程,包括数据处理、模型选择、调优等。
-
掌握分布式与云计算:学习分布式训练和云上部署,特别是如何使用云平台的AutoML服务来快速测试不同配置。
-
实践和项目积累:将学习内容运用到实际项目中,尝试从头开始自动化整个工作流,结合Kubeflow或Airflow进行完整的AutoML流程管理和调度。
AutoRAG
这篇论文的主要内容是提出了一种名为AutoRAG的自动化框架,用于优化检索增强生成(RAG,Retrieval-Augmented Generation)管道的性能,尤其适用于结合大型语言模型(LLM)和外部知识源的应用场景。以下是对该论文内容的详细解读:
1. 引言
RAG技术通过将外部知识库整合到生成流程中,有效地提升了生成结果的相关性和准确性。然而,由于不同的数据集可能表现出不同的效果,因此选择适合的RAG模块十分困难。AutoRAG框架旨在解决这一难题,通过自动化实验来识别适合给定数据集的最佳RAG模块组合,类似于AutoML在传统机器学习中的应用。
2. RAG技术模块
AutoRAG框架引入了多种RAG技术,用于在不同的RAG流程中优化模型表现,主要分为以下几类:
- 查询扩展:通过模块对用户的查询进行扩展以改善检索性能,包括“查询分解”和“假设文档嵌入(HyDE)”等方法。
- 检索模块:包括矢量数据库(VectorDB)、BM25算法及其混合方法(如Hybrid RRF、Hybrid CC和Hybrid DBSF),以确保通过语义和词汇相似性找到最相关的文档。
- 段落增强:通过“前后文段落增强”在检索的段落中添加邻近的上下文段落,以便为生成模型提供更多的上下文信息。
- 段落重排序:使用不同的重排序方法(如LM-based rerankers、LLM-based rerankers、基于嵌入的重排序)对检索结果重新排序,以提高生成结果的相关性。
- 提示生成:在生成过程中将检索到的段落、用户查询和指令信息整合成LLM的输入提示,以确保生成的内容紧扣上下文。
3. 实验与优化
AutoRAG的优化流程采用贪心算法,通过一系列“节点”来构建最优的RAG管道。每个节点代表一个特定的RAG步骤,包含不同的模块选择。框架通过测量每个节点的性能指标来选出最佳模块组合,并避免了全面搜索带来的计算负担。为了评估每个RAG模块的效果,实验引入了“RAGAS检索精度”(Ragas Context Precision)等指标。
4. 数据集与评价
本研究使用了ARAGOG数据集,包含了从ArXiv上选择的423篇关于AI和LLM的论文,用于构建RAG数据库和创建测试集。测试集包含107对由GPT-4生成并经人工审核的问题和答案。
5. 实验结果
AutoRAG框架在实验中验证了不同RAG技术的表现:
- 查询扩展:不同的查询扩展方法在性能上表现不一。基础的查询方法(Pass Query Expansion)表现最佳,而HyDE和查询分解(Query Decompose)在部分情况下会导致性能下降。
- 检索方法:Hybrid DBSF(分布式评分融合算法)在检索性能上表现最佳,而混合的RRF方法也表现出较高的精度。
- 段落增强与重排序:实验显示,前后文增强(Prev Next Augmenter)能够显著提升检索精度。Flag Embedding LLM Reranker在段落重排序中效果最佳,且LLM-based的重排序方法在大部分情况下优于传统的基于语言模型的重排序方法。
6. 生成性能评价
生成性能通过多个指标进行评估,包括ROUGE、METEOR和语义相似度得分(Sem Score)。实验结果表明,f-string模块在METEOR和ROUGE指标上表现稍优,而Long Context Reorder在语义相似度上稍占优势。
7. 讨论与局限性
AutoRAG框架有效地优化了RAG系统,但也面临着一些限制,如:
- 归一化方法的多样性:在混合检索时,不同的归一化方法可能影响性能,而本研究仅测试了两种归一化方法。
- 高计算成本:AutoRAG框架的优化和评估过程需要较高的计算资源,尤其是对RAGAS检索指标的计算较为昂贵。
- LLM输出的随机性:LLM的生成结果具有一定的随机性,可能导致输出不一致,影响实验的可复现性。
8. 未来工作
未来研究将致力于在更多的数据集上验证AutoRAG框架的优化能力,并引入更多的RAG模块以提高系统灵活性。还可以进一步评估AutoRAG的自动化优化能力,比较其性能与其他优化框架(如AutoRAG-HP)的差异。
结论
AutoRAG框架为检索增强生成任务提供了一种自动化的优化工具,能有效地选择最优RAG模块组合,从而提升生成质量。这项研究为未来在多数据集、多领域应用AutoRAG提供了可能性,并为检索增强生成的系统优化提供了可行的方向。
AutoRAG-HP
这篇论文提出了一种名为AutoRAG-HP的自动化在线超参数调优框架,旨在优化大语言模型(LLMs)中的检索增强生成(RAG)系统的超参数,以下是详细解读:
1. 引言
AutoRAG-HP通过重新定义AutoML在LLM时代的应用,自动化调整RAG系统中的超参数,如检索的top-k文档数、嵌入方法和压缩比率等。该框架将超参数调优建模为多臂老虎机(MAB)问题,提出了一种两层层次化多臂老虎机方法(Hier-MAB),以便在大规模搜索空间中高效地找到最优参数组合。
2. 相关工作
AutoML近年来取得了巨大成功,提供了多个开源框架如AutoSklearn和AutoKeras用于特征工程、模型构建和超参数优化。然而,传统AutoML方法在LLM时代面临挑战,因为LLM通常作为基础模型使用,省去了复杂的模型设计。过去的优化多集中在模型预训练和微调阶段的超参数上,而LLM的推理阶段中,通过优化超参数来改进生成性能也逐渐被研究。特别是,网格搜索、随机搜索和贝叶斯优化等传统方法虽然能找到最优超参数,但计算成本较高,且缺乏实时在线调整的能力。
3. 方法
AutoRAG-HP将RAG的超参数调优视作多臂老虎机(MAB)问题,其基本思路是将每个超参数组合视为一只“老虎机的臂”,每次实验会拉动一只臂并观察其效果。具体来说:
- 臂(Arm):指超参数组合中的某个选项,如top-k的值。
- 试验(Trial):每次拉动一只臂,观察其效果,并更新该臂的预期收益。
- 奖励(Reward):以生成的准确性和LLM API调用的输入token长度为基础衡量。奖励公式为:
Reward = w ⋅ accuracy − ( 1 − w ) ⋅ token length max token length \text{Reward} = w \cdot \text{accuracy} - (1 - w) \cdot \frac{\text{token length}}{\text{max token length}} Reward=w⋅accuracy−(1−w)⋅max token lengthtoken length
其中, w w w 是平衡准确性和调用成本的权重。
两层层次化MAB(Hier-MAB)
为避免搜索空间过大导致的计算复杂度,AutoRAG-HP采用两层层次化MAB:第一层决定要调优的超参数(如top-k、嵌入方法或压缩比率),第二层则在该超参数内选择具体值。这种分层方式减少了单个MAB的臂数量,提升了搜索效率。
4. 实验
论文在ALCE-ASQA和Natural Questions(NQ)数据集上测试了AutoRAG-HP的效果,比较了多种算法(如UCB、Thompson Sampling等)在不同权重设置下的表现,并采用Recall@x作为指标,评价在线调优的精确性。
主要结果
- 任务复杂性:根据实验,低权重下(如w=0.1)更关注调用成本,较小的top-k和压缩比率值成为最优组合;而在高权重下(如w=0.9),追求准确性的任务较为复杂,难以在众多组合中快速找到最优。
- 算法表现:Hier-UCB在中等复杂任务中表现出色,尤其在调优三个参数的任务中优于其他基准方法,如UCB和随机搜索。
- 迁移实验:在GPT-3.5-Turbo升级到GPT-4的过程中,继续使用已获得的超参数状态(“继续”配置)比重置状态(“重置”配置)更有效,使系统能快速适应新模型。
5. 消融实验
消融实验验证了高层和低层参数的不同设置对调优的影响,结果表明,高层设较大的探索因子(如 α h = 1.5 \alpha_h = 1.5 αh=1.5)和低层较小的探索因子(如 α l = 0.5 \alpha_l = 0.5 αl=0.5)在复杂任务上表现更优。
6. 案例研究:从GPT-3.5-Turbo升级到GPT-4
升级实验表明,当升级基础LLM时,保留内部参数状态能帮助系统迅速适应新模型,这意味着在模型更新的过程中,AutoRAG-HP可以有效地缩短调优时间,提高精确性。
7. 讨论与未来工作
AutoRAG-HP为实现自动化、在线的RAG超参数调优提供了一种新的方法。未来的改进方向包括增加更多超参数、探索多目标优化(如在成本约束下优化准确性),并引入自动化的数据生成能力,最终实现用户提供数据、系统自动配置的“Bring Your Data”愿景。
总结
AutoRAG-HP通过Hier-UCB方法在较少的LLM调用次数下实现了高效的在线超参数调优,使得RAG系统能在多种设置下高效自动化优化,具有广泛的应用潜力。
在这篇论文的方法部分,作者提出了一个创新的框架来解决RAG(检索增强生成)系统中的超参数调优问题。该方法主要通过将超参数调优问题建模为一个多臂老虎机(MAB)问题,并引入了一种**两层层次化MAB(Hier-MAB)**方法来高效地探索大规模的超参数搜索空间。下面我将详细扩展讲解这一部分的核心内容。
3. 方法
3.1 问题建模
论文首先将RAG系统中的超参数调优问题转化为一个在线多臂老虎机(Multi-Armed Bandit, MAB)问题。MAB问题的灵感来自赌场中的老虎机(slot machine),玩家每次拉动一个机器的“臂”,并从中获得奖励。目标是通过多次实验逐渐找到能够提供最大期望回报的臂。在RAG系统的背景下,每个超参数的组合可以看作是一个“臂”,而每次实验则是通过选择某个超参数组合来调优系统,并观察它带来的回报(即生成的结果和成本)。
具体来说:
- 臂(Arm):每个“臂”代表一个可能的超参数组合。假设我们有多个超参数(例如,top-k,嵌入方法,压缩比率等),每个超参数有多个可能的取值。每次选择一个超参数的组合作为一个“臂”来进行实验。
- 试验(Trial):每次试验意味着我们选择一个超参数组合并运行RAG系统,在某个数据集上评估该组合的效果。试验的结果是获得一个“奖励”(Reward),并更新该组合的表现。
- 奖励(Reward):奖励函数用来衡量某个超参数组合的表现。这个奖励通常由系统的输出质量(例如生成文本的准确性)和调用LLM的成本(例如,输入token的长度)共同决定。具体的奖励函数如下:
Reward = w ⋅ accuracy − ( 1 − w ) ⋅ token length max token length \text{Reward} = w \cdot \text{accuracy} - (1 - w) \cdot \frac{\text{token length}}{\text{max token length}} Reward=w⋅accuracy−(1−w)⋅max token lengthtoken length
其中,accuracy是LLM生成的答案的准确性,token length是输入token的长度,w是一个权重系数,决定了准确性与token长度(即成本)之间的权衡。
3.2 两层层次化MAB(Hier-MAB)
问题挑战:
在RAG系统中,我们通常需要同时调优多个超参数(例如,top-k,嵌入模型,压缩比率等)。如果我们使用标准的单一MAB方法进行优化,那么搜索空间会变得非常大,组合数量成倍增加,这会导致搜索过程非常耗时。因此,直接使用MAB进行多超参数优化时,问题的复杂度可能过高。
解决方案:为了解决这个问题,论文提出了一个两层层次化MAB(Hierarchical MAB,Hier-MAB)的方法,旨在通过分层搜索来有效降低搜索空间的复杂性。
两层层次化MAB的结构
Hier-MAB将优化过程分为两层:
-
高层MAB(High-level MAB):在这一层中,MAB的目标是选择需要调优的超参数类型。例如,选择是调优top-k(检索的文档数),还是调优嵌入模型(Embedding Model),或是调优压缩比率(Compression Ratio)。这就相当于首先在多个不同的“大类”中选择一个,然后进入下一层进行进一步的细化。
-
低层MAB(Low-level MAB):在这一层中,针对高层选择的超参数,进一步在其可取值范围内选择具体的超参数值。例如,如果高层选择了top-k,那么低层将决定具体的top-k值(如3,5,7等);如果高层选择了嵌入模型,那么低层将决定是使用mpnet、ada_002还是contriever等嵌入模型。
这种分层的结构有效地降低了每层的搜索空间大小,避免了直接在整个超参数空间中进行穷举搜索。
Hier-MAB的工作流程
- 高层选择:首先,选择一个超参数进行调优。假设系统决定从top-k、嵌入模型或压缩比率中选择一个来调优。
- 低层选择:在选择的超参数类型上,选择一个具体的值。例如,如果选择了top-k,那么选择一个具体的k值(如3、5、7等)。
- 奖励反馈:在每次选择后,系统通过试验(例如,使用该参数组合进行生成任务)来评估该组合的效果,并计算奖励。奖励是基于生成质量(如准确度)和成本(如token数)进行计算的。
- 更新和选择:系统根据奖励更新MAB的选择策略,逐渐优化超参数的选择。通常使用**UCB(Upper Confidence Bound)算法或Thompson Sampling(TS)**算法来平衡探索(exploration)和利用(exploitation),即探索新的超参数组合和利用已知效果较好的组合。
例子:Hier-MAB的具体应用
假设我们要同时优化三个超参数:
- top-k(例如,选择检索的文档数量)
- 嵌入模型(例如,选择用于排序的嵌入模型)
- 压缩比率(例如,选择在压缩过程中保留的token比例)
在Hier-MAB中:
- 高层会选择调优哪个超参数(例如选择top-k)。
- 低层则会在top-k超参数的不同值(如3,5,7)中选择一个,类似地,对于嵌入模型和压缩比率也进行类似操作。
通过这种分层的方法,Hier-MAB可以在较小的搜索空间中高效找到合适的超参数组合,而不需要在所有可能的组合中进行穷举搜索。
3.3 选择优化算法
为实现Hier-MAB,作者选择了两种经典的MAB算法:
- UCB(Upper Confidence Bound):这是一种平衡探索和利用的算法。UCB通过为每个臂计算上置信边界来选择最优臂。UCB的选择公式为:
A t = arg max a ( Q t ( a ) + α ln t N t ( a ) ) A_t = \arg \max_a \left( Q_t(a) + \alpha \sqrt{\frac{\ln t}{N_t(a)}} \right) At=argamax(Qt(a)+αNt(a)lnt)
其中, Q t ( a ) Q_t(a) Qt(a)是臂a在第t轮的预估奖励, N t ( a ) N_t(a) Nt(a)是臂a被选择的次数, α \alpha α是调节探索与利用平衡的参数。
- Thompson Sampling(TS):这种算法通过从每个臂的后验分布中采样来选择臂。它通过不断更新每个臂的奖励分布,从而更好地平衡探索和利用。
这两种算法都能够有效地选择最优的超参数组合,尤其适用于需要在线调整的情况。
总结
在方法部分,作者提出的两层层次化MAB(Hier-MAB)方法,利用了多臂老虎机理论来优化RAG系统中的超参数调优过程。通过分层结构,Hier-MAB显著降低了搜索空间的维度,并且有效提升了调优效率。这一方法不仅能够减少计算资源的消耗,还能在在线学习的环境下动态优化超参数,适应不断变化的需求。
问题模式
在AutoRAG-HP这篇论文中,作者通过将RAG系统中的超参数调优问题转化为多臂老虎机(MAB)问题来进行优化。将超参数调优视为MAB问题,在AutoML领域尤其是在处理大规模模型(如大型语言模型,LLM)时,是一个非常常见且有效的优化策略。下面,我将详细介绍在这种场景下常用的问题模式和优化算法。
1. 常见的问题模式
在AutoML中应用MAB进行超参数调优时,通常遇到以下几种常见的问题模式:
1.1 多目标优化(Multi-Objective Optimization)
超参数调优通常不是仅仅优化一个目标(如生成的准确性),而是需要在多个目标之间找到一个折衷。例如:
- 生成准确性(Accuracy):生成的文本是否满足预期,是否与目标信息一致。
- 计算效率(Cost/Latency):如API调用的次数、输入tokens的数量等,影响计算成本和响应时间。
- 检索精度:对检索到的文档是否准确,以及如何根据检索到的文档生成有效的输出。
在这种情况下,MAB的奖励函数可以是多个目标的加权组合。例如,AutoRAG-HP使用了线性组合:
Reward
=
w
⋅
accuracy
−
(
1
−
w
)
⋅
token length
max token length
\text{Reward} = w \cdot \text{accuracy} - (1 - w) \cdot \frac{\text{token length}}{\text{max token length}}
Reward=w⋅accuracy−(1−w)⋅max token lengthtoken length
这里的w参数平衡了准确性和token长度(即计算成本)之间的权衡。这是一种常见的模式,目标是找到最合适的折衷解,而不是单纯的优化一个目标。
1.2 离线调优 vs 在线调优(Offline vs Online Tuning)
-
离线调优:在这种模式下,所有的超参数组合都会事先经过计算,通常使用**网格搜索(Grid Search)或随机搜索(Random Search)**等方法来寻找最佳的超参数组合。离线调优的一个问题是计算成本高,尤其是对于大规模的超参数空间和计算资源需求较高的场景。
-
在线调优:在很多应用中,模型训练过程是持续的或者随着新的数据流入而不断更新的,超参数的调优也需要随着数据和模型的变化而动态调整。这种情况下,多臂老虎机(MAB)算法非常适用,因为MAB可以在没有完整的先验信息的情况下,通过在线的方式探索和调整超参数。
在AutoRAG-HP中,作者将超参数调优建模为在线MAB问题,这对于快速适应不断变化的模型需求和用户反馈非常有用。
1.3 多超参数调优(Multi-Hyperparameter Tuning)
RAG系统涉及多个超参数(如top-k、嵌入模型、压缩比率等),它们之间可能存在复杂的相互依赖关系。使用MAB进行多超参数调优时,通常有两种策略:
- 独立调优:每个超参数单独优化。例如,首先优化top-k,然后优化嵌入模型,再优化压缩比率,每次调优只关注一个超参数。
- 联合调优:将所有超参数的组合视为一个整体,通过MAB联合优化所有超参数。AutoRAG-HP采用了两层层次化MAB(Hier-MAB)方法,先决定需要调优的超参数,再进一步选择具体的超参数值,避免了“暴力搜索”所有可能的组合。
这种多超参数调优是实际应用中非常常见的模式,因为多个超参数的选择通常相互影响,单独优化可能无法达到最优效果。
2. 常用的优化算法
在MAB框架下进行超参数调优时,常用的优化算法有以下几种,它们各自适用于不同的任务和数据环境:
2.1 Upper Confidence Bound(UCB)
- UCB是最经典的MAB算法之一,它通过计算每个臂的上置信界限(Upper Confidence Bound)来决定下一个选择哪个臂。UCB的基本思想是,选择那些不仅过去表现好,而且具有较高不确定性的臂进行探索。
- 在超参数调优的场景中,UCB可以平衡探索(选择不确定的超参数组合)和利用(选择已经表现好的超参数组合)之间的关系。
UCB算法的选择公式如下:
A
t
=
arg
max
a
(
Q
t
(
a
)
+
α
⋅
ln
t
N
t
(
a
)
)
A_t = \arg\max_a \left( Q_t(a) + \alpha \cdot \sqrt{\frac{\ln t}{N_t(a)}} \right)
At=argamax(Qt(a)+α⋅Nt(a)lnt)
其中:
- Q t ( a ) Q_t(a) Qt(a)是臂a的估计奖励。
- N t ( a ) N_t(a) Nt(a)是臂a被选中的次数。
- α \alpha α是控制探索与利用平衡的系数。
UCB的优势在于其简单且容易实现,能够在动态和在线环境中自适应地调整。
2.2 Thompson Sampling(TS)
- Thompson Sampling是一种基于概率的算法,它通过从每个臂的后验分布中进行采样来选择臂。TS的核心思想是通过不断更新每个臂的奖励分布,逐步探索哪些超参数组合能够带来最优的奖励。
- TS在处理具有不确定性的任务时特别有效,可以通过采样机制自动平衡探索与利用。
TS的选择过程基于每个臂的后验分布,并从中采样出最可能的臂进行选择。这使得TS在面对复杂的多目标优化问题时,能够灵活地选择优先进行探索的超参数组合。
2.3 Bayesian Optimization(贝叶斯优化)
- 贝叶斯优化是一种更为复杂和高效的优化算法,特别适用于优化黑盒函数(即难以解析且计算代价昂贵的函数)。它基于贝叶斯理论构建模型(如高斯过程回归),通过迭代更新来选择最有可能带来最优解的超参数组合。
- 在AutoRAG-HP这种大规模超参数优化的场景中,贝叶斯优化可能会更加适用,尤其是当超参数空间较大且计算代价较高时。贝叶斯优化的优势在于能够充分利用历史实验的结果来引导搜索,减少不必要的计算开销。
2.4 Random Search(随机搜索)
- 随机搜索是一种简单且直观的优化方法,它通过在超参数空间中随机选择组合进行评估。虽然简单,但在一些任务中(尤其是参数空间不规则时),随机搜索能够在一定程度上提供良好的性能,并且计算开销较小。
- 在AutoRAG-HP的实验中,随机搜索作为一个对比基准,用来评估其他更复杂方法的优势。尽管随机搜索可能不能保证最优解,但它的计算成本低,适用于大规模超参数空间的初步探索。
3. 总结
在AutoRAG-HP框架中,作者通过将RAG系统中的超参数调优问题转化为MAB问题,并采用了Hier-MAB(层次化MAB)来有效减少计算复杂度,快速找到最优的超参数组合。在AutoML应用于大模型的调优场景中,常见的优化算法包括:
- UCB:经典的基于置信度的优化算法。
- Thompson Sampling:基于概率的优化算法,更适用于高不确定性的场景。
- 贝叶斯优化:适用于计算开销较大的任务,能够有效地引导搜索过程。
- 随机搜索:简单易用,但效率较低,适合大规模初步搜索。
这些优化算法可以根据具体任务和数据集的特性进行选择,并且能够帮助实现高效的超参数调优,特别是在大规模语言模型和其他复杂模型的自动化调优过程中。
贝叶斯优化
我将详细介绍贝叶斯优化的关键部分,包括高斯过程回归(Gaussian Process Regression)和采集函数的推导。我们将逐步深入,首先讲解高斯过程的原理,然后推导常用采集函数(如期望改进 EI)的公式。
1. 高斯过程回归(Gaussian Process Regression)
在贝叶斯优化中,高斯过程(GP)是用来建模目标函数的代理模型。高斯过程是一种非参数的贝叶斯方法,用于描述函数的分布。
1.1 高斯过程的基本概念
假设我们有一个函数 f ( x ) f(x) f(x),我们并不知道它的具体表达式,但我们可以通过一些样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 来观察目标函数的输出值。高斯过程通过以下方式对目标函数进行建模:
f ( x ) ∼ G P ( m ( x ) , k ( x , x ′ ) ) f(x) \sim \mathcal{GP}(m(x), k(x, x')) f(x)∼GP(m(x),k(x,x′))
- m ( x ) m(x) m(x)是均值函数,通常假设为零函数 m ( x ) = 0 m(x) = 0 m(x)=0,因为在实际应用中,均值函数的影响往往较小。
-
k
(
x
,
x
′
)
k(x, x')
k(x,x′)是协方差函数(或核函数),它定义了函数值之间的相关性。常用的核函数有:
- 平方指数核(RBF): k ( x , x ′ ) = exp ( − ∣ x − x ′ ∣ 2 2 σ 2 ) k(x, x') = \exp(-\frac{|x - x'|^2}{2\sigma^2}) k(x,x′)=exp(−2σ2∣x−x′∣2)
- 马特恩核: k ( x , x ′ ) = ( 1 + ∣ x − x ′ ∣ θ ) exp ( − ∣ x − x ′ ∣ θ ) k(x, x') = (1 + \frac{|x - x'|}{\theta}) \exp(-\frac{|x - x'|}{\theta}) k(x,x′)=(1+θ∣x−x′∣)exp(−θ∣x−x′∣)
协方差函数 k ( x , x ′ ) k(x, x') k(x,x′)控制了目标函数的平滑性和变化。
1.2 高斯过程回归的推导
给定一组训练数据 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,…,xn}和对应的目标函数值 Y = { y 1 , y 2 , … , y n } Y = \{y_1, y_2, \dots, y_n\} Y={y1,y2,…,yn},我们想要预测在新点 x ∗ x_* x∗处的目标函数值 f ( x ∗ ) f(x_*) f(x∗)。根据高斯过程的性质,联合分布为:
( f ( X ) f ( x ∗ ) ) ∼ N ( 0 , ( K ( X , X ) K ( X , x ∗ ) K ( x ∗ , X ) K ( x ∗ , x ∗ ) ) ) \begin{pmatrix} f(X) \\ f(x_*) \end{pmatrix} \sim \mathcal{N}\left( 0, \begin{pmatrix} K(X, X) & K(X, x_*) \\ K(x_*, X) & K(x_*, x_*) \end{pmatrix} \right) (f(X)f(x∗))∼N(0,(K(X,X)K(x∗,X)K(X,x∗)K(x∗,x∗)))
其中, K ( X , X ) K(X, X) K(X,X) 是训练点之间的协方差矩阵,( K(X, x_) ) 是训练点与新点之间的协方差向量,( K(x_, x_*) ) 是新点的自协方差。
通过条件分布公式,我们可以得到预测值的分布:
f ( x ∗ ) ∣ X , Y ∼ N ( K ( x ∗ , X ) K ( X , X ) − 1 Y , K ( x ∗ , x ∗ ) − K ( x ∗ , X ) K ( X , X ) − 1 K ( X , x ∗ ) ) f(x_*) | X, Y \sim \mathcal{N}\left( K(x_*, X) K(X, X)^{-1} Y, K(x_*, x_*) - K(x_*, X) K(X, X)^{-1} K(X, x_*) \right) f(x∗)∣X,Y∼N(K(x∗,X)K(X,X)−1Y,K(x∗,x∗)−K(x∗,X)K(X,X)−1K(X,x∗))
- 预测均值: μ ∗ = K ( x ∗ , X ) K ( X , X ) − 1 Y \mu_* = K(x_*, X) K(X, X)^{-1} Y μ∗=K(x∗,X)K(X,X)−1Y
- 预测方差: σ ∗ 2 = K ( x ∗ , x ∗ ) − K ( x ∗ , X ) K ( X , X ) − 1 K ( X , x ∗ ) \sigma_*^2 = K(x_*, x_*) - K(x_*, X) K(X, X)^{-1} K(X, x_*) σ∗2=K(x∗,x∗)−K(x∗,X)K(X,X)−1K(X,x∗)
1.3 解释
- 均值:预测点的均值 μ ∗ \mu_* μ∗是基于已有数据 Y Y Y和训练点 $X $推算的最可能的目标函数值。
- 方差:预测点的方差 σ ∗ 2 \sigma_*^2 σ∗2表示我们对预测值的不确定性,方差越大,说明我们对目标函数的预测越不确定。
2. 采集函数(Acquisition Function)
贝叶斯优化的核心是选择一个合适的采集函数,用来指导下一个采样点的选择。采集函数通过平衡探索(exploration)和利用(exploitation),在已知数据的基础上探索最优解。
2.1 期望改进(Expected Improvement, EI)
期望改进(EI)是最常用的采集函数,它通过衡量在某一点的期望改进来引导搜索。EI 的目标是找到一个采样点,使得目标函数的值有最大期望的改进。
假设当前的最优目标函数值为 f min f_{\text{min}} fmin,并且我们在点 x ∗ x_* x∗处预测目标函数值为 μ ∗ \mu_* μ∗(均值),不确定性为 σ ∗ \sigma_* σ∗(标准差)。我们定义改进量为:
Δ ( x ∗ ) = max ( f min − μ ∗ , 0 ) \Delta(x_*) = \max(f_{\text{min}} - \mu_*, 0) Δ(x∗)=max(fmin−μ∗,0)
由于目标函数值的分布是高斯分布,我们可以求出期望改进的值。具体地,期望改进为:
EI ( x ∗ ) = ( μ ∗ − f min ) Φ ( μ ∗ − f min σ ∗ ) + σ ∗ ϕ ( μ ∗ − f min σ ∗ ) \text{EI}(x_*) = (\mu_* - f_{\text{min}}) \Phi\left(\frac{\mu_* - f_{\text{min}}}{\sigma_*}\right) + \sigma_* \phi\left(\frac{\mu_* - f_{\text{min}}}{\sigma_*}\right) EI(x∗)=(μ∗−fmin)Φ(σ∗μ∗−fmin)+σ∗ϕ(σ∗μ∗−fmin)
其中, Φ ( ⋅ ) \Phi(\cdot) Φ(⋅) 是标准正态分布的累积分布函数(CDF),而 ϕ ( ⋅ ) \phi(\cdot) ϕ(⋅)是标准正态分布的概率密度函数(PDF)。
2.2 公式推导
- 改进量: μ ∗ − f min \mu_* - f_{\text{min}} μ∗−fmin是当前预测值与已知最优值之间的差距。
- 标准化:通过将改进量除以标准差 σ ∗ \sigma_* σ∗,我们得到一个标准化的量,表示改进相对于不确定性的大小。
- 分布的期望:采集函数的期望值通过正态分布的累积概率和密度函数计算出来,表示我们期望在某一点采样得到改进的概率。
2.3 解释
- 利用(Exploitation):当 μ ∗ \mu_* μ∗接近 f min f_{\text{min}} fmin 时,EI 会较小,表示我们已经比较接近最优解,不需要再去探索太多。
- 探索(Exploration):当 σ ∗ \sigma_* σ∗ 较大时,EI 会较大,表示我们对目标函数的值有较高的不确定性,因此可以选择探索更多的区域。
3. 上置信界(Upper Confidence Bound, UCB)
另一种常见的采集函数是 上置信界(UCB),它通过加权预测均值和不确定性来选择下一个采样点。UCB 公式如下:
UCB ( x ∗ ) = μ ∗ + κ σ ∗ \text{UCB}(x_*) = \mu_* + \kappa \sigma_* UCB(x∗)=μ∗+κσ∗
其中, κ \kappa κ是一个控制探索与利用平衡的超参数。较大的 κ \kappa κ会导致更多的探索,较小的 κ \kappa κ则偏向于利用当前知识。
3.1 UCB 公式推导
UCB 直接通过加权均值和标准差来选择采样点,权重 κ \kappa κ 调节了我们对不确定性的依赖程度。它是一种简单而有效的探索利用平衡策略。
4. 总结
贝叶斯优化的核心思想是通过高斯过程回归来建模目标函数的分布,基于当前的数据来预测目标函数的值和不确定性。然后,通过采集函数(如期望改进 EI、上置信界 UCB)来指导下一个采样点的选择,平衡探索与利用。
贝叶斯优化的数学原理主要涉及高斯过程的条件分布和采集函数的推导。希望上述公式和推导可以帮助你更好地理解贝叶斯优化。如果你对某个部分有疑问,或希望进一步深入某个话题,请随时告知!
集成学习
三大关键领域
集成学习(Ensemble learning)是机器学习中最先进、最有效、最具研究价值的领域之一,这类方法会训练多个弱评估器(base estimators)、并将它们输出的结果以某种方式结合起来解决一个问题。
在过去十年中,人工智能相关产业蓬勃发展,计算机视觉、自然语言处理、语音识别等领域不断推陈出新、硕果累累,但热闹是深度学习的,机器学习好似什么也没有。2012年之后,传统机器学习占据的搜索、推荐、翻译、各类预测领域都被深度学习替代或入侵,在招聘岗位中,69%的岗位明确要求深度学习技能,传统机器学习算法在这一场轰轰烈烈的人工智能热潮当中似乎有些被冷落了。
在人工智能大热的背后,集成学习就如同裂缝中的一道阳光,凭借其先进的思想、优异的性能杀出了一条血路,成为当代机器学习领域中最受学术界和产业界青睐的领域。
从今天的眼光来看,集成学习是:
- 当代工业应用中,唯一能与深度学习算法分庭抗礼的算法
- 数据竞赛高分榜统治者,KDDcup、Kaggle、天池、DC冠军队御用算法
- 在搜索、推荐、广告等众多领域,事实上的工业标准和基准模型
- 任何机器学习/深度学习工作者都必须掌握其原理、熟读其思想的领域
在集成学习的发展历程中,集成的思想以及方法启发了众多深度学习和机器学习方面的工作,在学术界和工业界都取得了巨大的成功。今天,集成学习可以被分为三个主要研究领域:
- 模型融合
模型融合在最初的时候被称为“分类器结合”,这个领域主要关注强评估器,试图设计出强大的规则来融合强分类器的结果、以获取更好的融合结果。这个领域的手段主要包括了投票法Voting、堆叠法Stacking、混合法Blending等,且被融合的模型需要是强分类器。模型融合技巧是机器学习/深度学习竞赛中最为可靠的提分手段之一,常言道:当你做了一切尝试都无效,试试模型融合。 - 弱分类器集成
弱分类器集成主要专注于对传统机器学习算法的集成,这个领域覆盖了大部分我们熟悉的集成算法和集成手段,如装袋法bagging,提升法boosting。这个领域试图设计强大的集成算法、来将多个弱学习器提升成为强学习器。 - 混合专家模型(mixture of experts)
混合专家模型常常出现在深度学习(神经网络)的领域。在其他集成领域当中,不同的学习器是针对同一任务、甚至在同一数据上进行训练,但在混合专家模型中,我们将一个复杂的任务拆解成几个相对简单且更小的子任务,然后针对不同的子任务训练个体学习器(专家),然后再结合这些个体学习器的结果得出最终的输出。
Bagging方法的基本思想
Bagging(Bootstrap Aggregating)是一种常见的集成学习方法,中文常称为“装袋法”。它的核心思想是通过并行训练多个独立的学习器(通常是弱学习器,如决策树大部分情况都是这个),并将这些学习器的预测结果进行融合,从而提高预测的准确性和稳定性。Bagging特别适用于减少模型的方差,特别是在复杂模型容易过拟合的情况下,能够显著提高模型的泛化能力。
Bagging的基本流程
-
数据重采样:从训练数据集中有放回地随机抽取多个不同的子数据集(每个数据集的样本数通常与原始数据集相同)。这一步被称为Bootstrap。
-
并行训练多个弱评估器:每个子数据集都会训练一个独立的模型(弱学习器),常见的弱学习器包括决策树(通常是“决策树桩”),但是Bagging方法也可以用于其他算法。
-
集成预测:弱评估器和集成学习算法必须解决相同的问题,分类分类、回归回归
- 分类任务:每个弱评估器给出一个预测结果,集成学习的输出结果是所有模型的投票结果(即选择最多的类别)。
- 回归任务:集成学习的输出结果是所有弱评估器输出值的平均值。
通过这种方式,Bagging能够降低单一学习器的过拟合风险,提高模型在未见数据上的泛化能力。
分类任务中的Bagging
假设我们有7个弱评估器,它们分别给出以下分类预测结果(假设是分类问题,类别有0、1、2):
r_clf = np.array([0, 2, 1, 1, 2, 1, 0])
Bagging集成算法的目标是对这些预测结果进行投票,最终选择最多投票的类别,作为模型的最终预测结果。1
代码示例
首先,我们可以用np.bincount
来统计每个类别出现的次数,然后用np.argmax
来找出出现次数最多的类别。
np.bincount(r_clf) # 统计每个类别的数量
输出:
array([2, 3, 2])
这表示类别0
出现了2次,类别1
出现了3次,类别2
出现了2次。接下来,使用np.argmax
来选择最多投票的类别:
np.argmax(np.bincount(r_clf)) # 选择最多投票的类别
输出:
1
因此,Bagging集成模型的最终预测类别是1
,因为类别1
获得了最多的票数。
处理二分类问题
如果是二分类问题,输出可能是-1
和1
,我们可以通过以下方式来计算每个类别的票数:
(r_clf == 1).sum() # 统计类别1出现的次数
输出结果:
4
然后我们可以通过比较两类的票数来决定最终的类别:
b_result_clf = 1 if (r_clf == 1).sum() > (r_clf != 1).sum() else -1
如果有平票的情况(即类别数量相同),我们可以根据不同的策略处理:
- 随机选择:从数量相同的类别中随机选择一个。
- 选择较小的类别:如果使用
np.argmax
,可以选择编码数字较小的类别。
回归任务中的Bagging
对于回归任务,Bagging会对多个弱评估器的预测结果进行平均,输出最终的回归结果。
例如,假设我们有7个弱评估器给出的回归预测结果:
r_reg = np.array([-2.082, -0.601, -1.686, -1.001, -2.037, 0.1284, 0.8500])
我们可以计算这些预测结果的平均值,作为最终的回归结果:
b_result_reg = r_reg.mean() # 计算平均值
输出结果:
b_result_reg
这样,集成方法的输出结果就是所有弱评估器的预测值的平均值。
Bagging在Scikit-learn中的实现
在sklearn
库中,Bagging方法有几种常见的实现:
-
随机森林(Random Forest):基于Bagging思想,使用决策树作为弱评估器。它是一种非常强大的集成学习方法,既可以用于回归任务,也可以用于分类任务。
RandomForestClassifier
:用于分类任务RandomForestRegressor
:用于回归任务
-
极端随机树(ExtraTrees):与随机森林类似,但在训练决策树时使用更大的随机性,这通常可以提高模型的泛化能力。
ExtraTreesClassifier
:用于分类任务ExtraTreesRegressor
:用于回归任务
-
Bagging:你还可以使用
BaggingClassifier
和BaggingRegressor
来对其他模型(如SVM、逻辑回归等)进行集成。
Bagging算法 | 集成类型 |
---|---|
随机森林分类 | RandomForestClassifier |
随机森林回归 | RandomForestRegressor |
极端随机树分类 | ExtraTreesClassifier |
极端随机树回归 | ExtraTreesRegressor |
装袋法分类 | BaggingClassifier |
装袋法回归 | BaggingRegressor |
总结
Bagging方法通过并行训练多个弱评估器,并将它们的结果进行集成,从而提高模型的预测准确性和稳定性。在分类任务中,它使用投票机制来选择最终的类别;在回归任务中,使用平均值来生成最终的回归预测。随机森林和极端随机树是Bagging的两个重要应用,它们都利用决策树作为弱评估器,并在很多实际问题中表现出色。
随机森林RandomForest
随机森林回归器(RandomForestRegressor
)与决策树的比较
随机森林是集成学习中非常常见的一种算法,它通过将多个弱分类器(通常是决策树)组合在一起,从而提升模型的准确性和抗过拟合能力。在sklearn
中,随机森林的回归器通过RandomForestRegressor
类实现。它与单一决策树相比,通过集成多个模型来降低过拟合的风险,从而具有更好的泛化能力。
随机森林的基本原理
随机森林算法的构建过程非常简单:
- 数据的随机抽样:从原始数据集中随机抽取不同的子集来训练每一棵决策树(也叫做袋外数据
out-of-bag data
)。这种方法叫做Bootstrap采样(自助采样),每棵树的训练数据是随机抽取且有放回的。 - 多棵决策树的集成:在训练好多棵决策树后,最终通过Bagging(Bootstrap Aggregating)方式进行集成,回归问题通过平均各树的预测结果,分类问题则通过投票方式决定最终类别。
这种方法使得每棵决策树都对数据子集进行了独立训练,从而减少了模型对训练数据的过拟合,提高了模型的泛化能力。
在实现中,通常的操作流程是:
- **实例化模型:**创建
RandomForestRegressor
对象。 - **训练模型:**调用
fit()
方法,用训练数据训练模型。 - **预测结果:**调用
predict()
方法,基于训练好的模型进行预测。
RandomForestRegressor
类和常用参数
在 sklearn
中,RandomForestRegressor
用于回归任务,其主要参数如下:
class sklearn.ensemble.RandomForestRegressor(
n_estimators=100,
*,
criterion='squared_error',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features='auto',
max_leaf_nodes=None,
min_impurity_decrease=0.0,
bootstrap=True,
oob_score=False,
n_jobs=None,
random_state=None,
verbose=0,
warm_start=False,
ccp_alpha=0.0,
max_samples=None
)
以下是几个常用参数的解释:
n_estimators
:森林中树的数量,默认值为100。树的数量越多,模型的精度可能越高,但计算量和内存开销也随之增加。criterion
:用来衡量分枝质量的标准,回归树通常使用'squared_error'
(平方误差),也可以选择'absolute_error'
(绝对误差)或'poisson'
(泊松偏差)。max_depth
:单棵树的最大深度,限制树的最大深度以防止过拟合。min_samples_split
:分枝时一个节点所需的最小样本数,默认为2。min_samples_leaf
:每个叶子节点上的最小样本数,默认为1。bootstrap
:是否使用自助采样法(有放回采样)构建每棵树。oob_score
:是否使用袋外数据进行模型验证,默认False
。max_features
:每棵树构建时,考虑的特征数量。n_jobs
:并行化的工作线程数,-1
表示使用所有可用的CPU核心。
随机森林回归器的实现
我们可以用 RandomForestRegressor
来训练模型并进行交叉验证,以下是一个简单的实现过程:
1. 数据加载与准备
import pandas as pd
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.model_selection import cross_validate, KFold
# 加载数据
data = pd.read_csv("path_to_file.csv", index_col=0)
X = data.iloc[:, :-1] # 特征
y = data.iloc[:, -1] # 目标值
这里,我们加载了一份包含房价数据的CSV文件,并将其分为特征X
和目标值y
。
2. 创建回归模型并进行交叉验证
# 实例化模型
reg_f = RFR() # 随机森林回归器
reg_t = DTR() # 单棵决策树回归器
# 创建交叉验证方式
cv = KFold(n_splits=5, shuffle=True, random_state=1412)
# 交叉验证,计算负均方误差(neg_mean_squared_error)
result_f = cross_validate(reg_f, X, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
result_t = cross_validate(reg_t, X, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
我们使用 cross_validate
对随机森林回归器和决策树回归器进行交叉验证。评估指标是负均方误差(neg_mean_squared_error
),因为在sklearn
中,均方误差是负值,以便与其他指标(如准确率)兼容。
3. 结果分析
# 查看训练结果
result_f # 随机森林的交叉验证结果
result_t # 单棵决策树的交叉验证结果
通过比较训练集和测试集的结果,我们可以发现随机森林比单棵决策树有更好的泛化能力,过拟合的情况较轻。
4. 评估指标 RMSE
为了更直观地理解模型的表现,我们将均方误差(MSE)转换为根均方误差(RMSE)。
# 计算训练和测试集的RMSE
trainRMSE_f = abs(result_f["train_score"])**0.5
testRMSE_f = abs(result_f["test_score"])**0.5
trainRMSE_t = abs(result_t["train_score"])**0.5
testRMSE_t = abs(result_t["test_score"])**0.5
# 查看随机森林和决策树的RMSE
trainRMSE_f.mean(), testRMSE_f.mean(), trainRMSE_t.mean(), testRMSE_t.mean()
通过这种方式,我们可以看到不同模型在训练集和测试集上的RMSE值,进而判断过拟合的情况。
5. 可视化结果
import matplotlib.pyplot as plt
xaxis = range(1, 6)
plt.figure(figsize=(8, 6), dpi=80)
plt.plot(xaxis, trainRMSE_f, color="green", label="RandomForestTrain")
plt.plot(xaxis, testRMSE_f, color="green", linestyle="--", label="RandomForestTest")
plt.plot(xaxis, trainRMSE_t, color="orange", label="DecisionTreeTrain")
plt.plot(xaxis, testRMSE_t, color="orange", linestyle="--", label="DecisionTreeTest")
plt.xticks([1, 2, 3, 4, 5])
plt.xlabel("CVcounts", fontsize=16)
plt.ylabel("RMSE", fontsize=16)
plt.legend()
plt.show()
通过图形展示,我们可以直观地看到随机森林和决策树在训练集和测试集上的RMSE变化,从而进一步分析模型的表现。
随机森林回归器的参数调节
我们接下来会深入了解随机森林中的几个重要参数,并探讨如何调整这些参数来优化模型。
1. 弱分类器数量 (n_estimators
)
n_estimators
控制森林中树的数量。树的数量越多,模型的学习能力越强,但同时计算开销也更大。可以通过交叉验证来选择最佳的 n_estimators
数量。
reg_f = RFR(n_estimators=3)
result_f = cross_validate(reg_f, X, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
2. 树的最大深度 (max_depth
)
max_depth
参数控制树的最大深度,较小的深度可以有效防止过拟合。
reg_f = RFR(max_depth=10)
result_f = cross_validate(reg_f, X, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
3. 树的分枝标准 (criterion
)
criterion
参数用来指定回归树的分枝标准,通常可以选择 squared_error
(平方误差)或 absolute_error
(绝对误差)。
reg_f = RFR(criterion="absolute_error")
result_f = cross_validate(reg_f, X
, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
4. 启用袋外数据 (oob_score
)
oob_score=True
会启用袋外数据来评估模型性能,这样可以在不使用额外验证集的情况下评估模型。
reg_f = RFR(oob_score=True)
reg_f.fit(X, y)
reg_f.oob_score_
5. 随机选择特征 (max_features
)
可以通过 max_features
控制每棵树构建时选择的特征数量,通常选择 sqrt(n_features) 或 log2(n_features)。
reg_f = RFR(max_features="sqrt")
result_f = cross_validate(reg_f, X, y, cv=cv, scoring="neg_mean_squared_error", return_train_score=True, n_jobs=-1)
模型训练与评估
在机器学习和数据科学中,模型训练和评估是确保你所构建的模型能够在实际应用中正确预测和推理的重要步骤。接下来我将详细讲解交叉验证、RMSE和MSE,以及它们在模型训练与评估中的作用。
一、模型训练与评估
在构建机器学习模型时,通常的流程包括以下几个步骤:
- 数据准备:包括数据预处理(如去除缺失值、标准化、归一化等)。
- 模型选择:选择适合当前任务的机器学习模型(例如线性回归、决策树、支持向量机等)。
- 训练模型:使用训练集数据来拟合模型,即通过算法来找到能够最小化误差的参数。
- 评估模型:通过不同的评估指标(如RMSE、MSE、准确率、精度、召回率等)来验证模型在未知数据上的表现。
- 调优模型:通过调整超参数、使用不同的特征工程等来提升模型的性能。
二、交叉验证(Cross-Validation)
交叉验证是一种用于评估模型性能的技术,它能够有效地避免由于数据划分不当引起的过拟合或欠拟合现象。最常见的交叉验证方法是k折交叉验证。
1. k折交叉验证的步骤:
- 将数据集随机分成k个子集(通常k=5或10)。
- 每次选择一个子集作为验证集,剩余的k-1个子集作为训练集。
- 训练模型并在验证集上评估模型的性能。
- 重复以上过程k次,每次选用不同的子集作为验证集,直到每个子集都被用作一次验证集。
- 最后,计算k次评估结果的平均值作为模型的最终评估指标。
2. 优点:
- 减少偏差:每个数据点都有机会作为训练集和验证集的一部分,能有效避免由于数据划分不当导致的偏差。
- 避免过拟合和欠拟合:通过多次训练和评估,模型能更好地在未见数据上表现。
3. 缺点:
- 计算开销大:由于需要进行k次训练和验证,k折交叉验证的计算成本较高。
- 适用于数据量适中的情况:对于数据量非常大的情况,可能需要选择其他评估方法。
4. 常见的变种:
- 留一交叉验证(Leave-One-Out Cross-Validation, LOOCV):k折交叉验证的极端情况,当k等于数据集大小时,每次只用一个样本作为验证集,剩余的样本作为训练集。
- 分层k折交叉验证:对于类别不平衡的数据集,保证每一折中的类别分布与整体数据集相似,通常用于分类问题。
三、均方误差(MSE, Mean Squared Error)
均方误差(Mean Squared Error,MSE)是回归问题中常用的评估指标,用于衡量模型预测值与实际值之间的差异。
1. 公式:
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 n1∑i=1n(yi−y^i)2
- y i y_i yi:实际值
- y ^ i \hat{y}_i y^i:模型预测值
- n n n:样本数量
2. 含义:
MSE计算了预测值和实际值之间差的平方的平均值。它给出了模型预测的误差大小,单位是目标变量的平方。因此,MSE越小,说明模型的预测性能越好。
3. 优点:
- 容易计算,且可以通过梯度下降等方法进行优化。
- 对大误差有较强的惩罚作用,因为误差被平方了。
4. 缺点:
- 对异常值敏感:由于误差平方,MSE对异常值(outliers)非常敏感,异常值会被放大影响。
- 难以解释:由于单位是平方值,有时不好直接解释模型的好坏。
四、均方根误差(RMSE, Root Mean Squared Error)
均方根误差(Root Mean Squared Error,RMSE)是MSE的平方根。它与MSE相似,但由于取了平方根,RMSE的单位与目标变量一致,这使得它比MSE更容易解释。
1. 公式:
RMSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} n1∑i=1n(yi−y^i)2
2. 含义:
RMSE表示了预测值和实际值之间的平均差异,单位与原始数据的单位相同。因此,RMSE通常比MSE更直观易懂。如果RMSE值较小,表示模型的预测误差较小,性能较好。
3. 优点:
- 单位一致性:RMSE的单位与原始数据一致,更容易理解。
- 容易与实际误差进行比较:可以用来直接解释模型的预测误差。
4. 缺点:
- 对异常值敏感:和MSE一样,RMSE对大误差(即异常值)非常敏感。
- 可能低估模型的不稳定性:由于平方根的运算,RMSE有时可能会低估模型的实际误差。
五、MSE与RMSE的对比
- MSE是误差的平方平均值,且由于其对大误差敏感(平方放大效应),它更偏向于惩罚大的错误。
- RMSE是MSE的平方根,通常更为直观,因为它的单位与数据的原始单位相同。因此,RMSE可以更容易地用来判断实际的预测误差。
- 在大多数情况下,RMSE被视为更有意义的评估指标,因为它具有与数据相同的单位,可以直接反映模型预测的平均误差。
总结
- 交叉验证帮助你更全面地评估模型的性能,避免了数据划分的偏差。
- MSE和RMSE都是回归问题中的误差评估指标,MSE更注重大误差的惩罚,而RMSE更直观易懂,且与数据单位一致。
这三个概念在机器学习和数据分析中都非常重要,通过它们的有效结合,可以帮助我们选择最佳的模型并进行更精准的预测。如果你有进一步的问题或者需要对某一部分进行更详细的讲解,随时告诉我!
总结
通过本次笔记的讲解,我们深入了解了 随机森林回归器(RandomForestRegressor
) 的实现和使用,以及如何通过调整参数来优化模型。在实际应用中,通过对不同参数的调整、交叉验证的使用,可以提升模型的准确性和泛化能力,避免过拟合和欠拟合的问题。
代码
这段代码展示了如何使用交叉验证(cross-validation)来评估两种回归算法——随机森林回归器(RandomForestRegressor)和决策树回归器(DecisionTreeRegressor)的性能,并通过均方误差(MSE)和均方根误差(RMSE)来衡量这些模型在训练集和测试集上的表现。接下来,我会逐步解析这段代码的每个部分。
1. 导入所需的库和模块
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.model_selection import cross_validate, KFold
- matplotlib.pyplot:用于绘制图表的库,用于可视化结果。
- RandomForestRegressor:来自
sklearn.ensemble
,用于构建随机森林回归模型。 - DecisionTreeRegressor:来自
sklearn.tree
,用于构建决策树回归模型。 - cross_validate:来自
sklearn.model_selection
,用于交叉验证并返回评估结果,比cross_val_score
更灵活,能同时返回训练和测试分数。 - KFold:用于定义k折交叉验证的划分方式。
2. 读取数据集
data = pd.read_csv(r"D:\Pythonwork\2021ML\PART 2 Ensembles\datasets\House Price\train_encode.csv",index_col=0)
- 使用
pandas
的read_csv
函数加载CSV文件,数据集包含房价信息,index_col=0
表示将第一列作为行索引。
3. 数据的基本检查
data.head()
- 通过
head()
查看数据的前几行,确认数据格式。
data.shape
- 使用
shape
查看数据集的维度,返回的是一个包含行数和列数的元组。
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
- 将数据集分成特征(
X
)和目标变量(y
)。这里使用iloc
,X
包含所有特征(所有列,除去最后一列),而y
包含最后一列的目标变量(房价)。
y.mean()
- 查看目标变量(房价)的均值,帮助理解数据的范围,特别是在回归任务中,目标变量的均值很大时,MSE可能会很大。
X.shape
X.columns.tolist()
- 查看特征
X
的形状和列名列表,帮助确认特征的数量和类型。
4. 模型初始化
reg_f = RFR() # 实例化随机森林回归器
reg_t = DTR() # 实例化决策树回归器
cv = KFold(n_splits=5, shuffle=True, random_state=1412) # 定义KFold交叉验证
- RFR:随机森林回归器实例化。
- DTR:决策树回归器实例化。
- KFold:定义5折交叉验证,
shuffle=True
表示在每次划分前对数据进行洗牌,random_state=1412
确保每次划分一致。
5. 使用cross_validate
进行交叉验证
result_t = cross_validate(
reg_t, # 评估器(决策树回归器)
X, y, # 数据和标签
cv=cv, # 交叉验证划分
scoring="neg_mean_squared_error", # 评估指标,负的MSE(因为cross_validate返回的是负值)
return_train_score=True, # 返回训练集得分
verbose=True, # 打印进度
n_jobs=-1 # 使用所有可用线程
)
- cross_validate:执行交叉验证。
reg_t
:选择的回归模型。X
、y
:特征数据和目标标签。cv
:交叉验证的设置(5折交叉验证)。scoring="neg_mean_squared_error"
:评估指标是负的均方误差。sklearn
中的cross_validate
和cross_val_score
默认返回的是正数,因此选择负数(neg_mean_squared_error
),确保返回的值是负数,表示错误越小越好。return_train_score=True
:返回训练集和测试集的得分。verbose=True
:打印交叉验证的进度。n_jobs=-1
:使用所有可用的计算核心。
随机森林和决策树回归器的评估方式是一样的,分别进行了两次cross_validate
,用于获取它们的评估结果。
6. 查看交叉验证结果
result_t # 决策树回归的评估结果
result_f # 随机森林回归的评估结果
result_t
和result_f
分别存储了决策树和随机森林回归器的交叉验证结果,包含了训练和测试的MSE得分。
7. 转换为RMSE(均方根误差)
trainRMSE_f = abs(result_f["train_score"])**0.5
testRMSE_f = abs(result_f["test_score"])**0.5
trainRMSE_t = abs(result_t["train_score"])**0.5
testRMSE_t = abs(result_t["test_score"])**0.5
result_f["train_score"]
和result_f["test_score"]
返回的是负的均方误差(MSE)。通过abs()
取绝对值后,再对其开根号得到均方根误差(RMSE)。- 这一步的目的是计算每个模型的训练集和测试集的RMSE。
8. 查看训练集和测试集的RMSE均值和标准差
trainRMSE_f.mean()
testRMSE_f.mean()
trainRMSE_f.std() # 使用标准差衡量模型的稳定性
trainRMSE_f.mean()
和testRMSE_f.mean()
计算训练集和测试集上的RMSE的均值。trainRMSE_f.std()
计算训练集上RMSE的标准差,表示模型在训练过程中的稳定性。
9. 绘制结果的可视化图表
xaxis = range(1, 6) # x轴表示交叉验证的折数,1到5折
plt.figure(figsize=(8, 6), dpi=80) # 创建图表
plt.plot(xaxis, trainRMSE_f, color="green", label="RandomForestTrain")
plt.plot(xaxis, testRMSE_f, color="green", linestyle="--", label="RandomForestTest")
plt.plot(xaxis, trainRMSE_t, color="orange", label="DecisionTreeTrain")
plt.plot(xaxis, testRMSE_t, color="orange", linestyle="--", label="DecisionTreeTest")
plt.xticks([1, 2, 3, 4, 5]) # 设置x轴的刻度
plt.xlabel("CV counts", fontsize=16)
plt.ylabel("RMSE", fontsize=16)
plt.legend()
plt.show()
- 绘制折线图,展示训练集和测试集的RMSE(均方根误差)在5折交叉验证过程中的变化。
- 绿色线代表随机森林的训练和测试RMSE,橙色线代表决策树的训练和测试RMSE。
plt.xticks([1, 2, 3, 4, 5])
设置x轴的标签,表示5折交叉验证。
10. 结果分析
- 决策树回归器容易过拟合,因为训练集和测试集的RMSE差异较大。
- 随机森林回归器的过拟合较少,训练集和测试集的RMSE差异较小,说明模型的泛化能力更强。
总结
- 代码通过使用交叉验证对决策树和随机森林回归器的表现进行评估,并计算RMSE指标来衡量模型的预测误差。
- 通过可视化结果,我们可以更直观地看到两种模型在不同折次上的训练集和测试集误差,从而帮助我们判断哪些模型更适合当前的数据集。
随机森林回归器的参数
首先,随机森林回归器(RandomForestRegressor
)有多个参数可以调整,这些参数可以大致分为四类:
- 弱分类器数量(决定森林中树木的数量)
- 弱分类器的训练数据(与数据采样相关)
- 弱分类器结构(与决策树的深度、分枝等结构相关)
- 其他参数(如并行计算、模型详细信息输出等)
每个类别的参数对模型的影响不同,通过合适的调节,可以提升模型的表现,避免过拟合或欠拟合。
1. 弱分类器结构(决策树的参数)
在随机森林中,每棵树都是一个弱分类器,通常是回归树。我们可以通过调整以下参数来控制每棵树的复杂度,从而影响整个随机森林模型的表现:
-
criterion:控制树分枝时的不纯度衡量指标。对于回归任务,常用的有:
"squared_error"
:平方误差(MSE),适用于大多数回归问题。"absolute_error"
:绝对误差(MAE),对异常值更为鲁棒。"poisson"
:泊松偏差,适用于标签呈现泊松分布的场景(例如计数数据)。
选择不同的
criterion
会影响特征重要性的计算,因为feature_importances_
是基于每个特征在分枝时对不纯度下降的贡献量。 -
max_depth:控制树的最大深度。如果深度过大,树可能过拟合。通常在随机森林中,树的深度控制得较为宽松,默认值为
None
(即不限制深度),但如果过拟合,应该限制这个参数。 -
min_samples_split 和 min_samples_leaf:控制节点分裂时需要的最小样本数。通过增大这些值,可以减少树的复杂度,降低过拟合风险。
-
min_impurity_decrease:控制节点分裂时所允许的最小不纯度下降量。此参数用于进一步控制分枝是否发生。
2. 弱分类器数量(n_estimators
)
-
n_estimators:控制森林中树木的数量,即弱分类器的数量。默认值为 100。增大此值通常可以提升模型的精度,但会增加计算开销。在实践中,通过交叉验证选择一个最佳值是非常重要的。过多的树可能导致模型过拟合,且计算时间和资源消耗会大幅增加。
- 当
n_estimators
较小时,模型的训练误差较高,但测试误差较小。 - 随着
n_estimators
增加,训练误差逐渐减少,但测试误差可能在一定程度上增大(过拟合)。
- 当
3. 弱分类器训练的数据(Bagging中的数据随机抽样)
-
bootstrap:控制是否使用放回抽样(即自助法)。如果设置为
True
,每棵树使用的数据集是从训练集随机抽取的,并且允许重复抽样。如果设置为False
,每棵树使用的是原始训练集的所有样本。 -
oob_score:当
bootstrap=True
时,可以启用袋外数据(Out of Bag Data),这部分数据未被某些树使用。oob_score
允许我们利用这些数据来评估模型的性能,这有时可以代替交叉验证,尤其在数据量非常大的时候,袋外数据可以作为验证集来评估模型的泛化能力。 -
max_samples:控制每次从训练集中随机抽取的样本数。可以指定整数或者浮动比例(如
0.8
表示抽取 80% 的样本)。如果设置为None
,则使用训练集的全部数据。
4. 特征的随机抽样
- max_features:控制在每棵树的每个节点分裂时考虑的特征数量。这是增加树之间差异的一个重要参数。不同的值可以影响模型的方差和偏差。
sqrt
:每次分裂时使用特征总数的平方根,通常用于分类任务。log2
:每次分裂时使用特征总数的对数,通常用于回归任务。auto
或None
:每次分裂时使用全部特征。
5. 随机抽样的模式(random_state
)
- random_state:控制所有涉及随机性的操作,如数据抽样和特征抽样等。设置
random_state
可以确保每次模型训练时使用相同的随机模式,这对于模型调优和结果复现非常重要。设置不同的random_state
可以帮助我们了解模型对随机性的敏感程度。
6. 其他参数
-
n_jobs:指定使用的计算核心数。设置为
-1
时,使用所有可用的核心,可以加速模型训练过程。 -
verbose:控制是否输出详细的训练信息。适用于树的数量非常多,且模型训练过程较为耗时的情况。
-
ccp_alpha:用于剪枝。通过控制剪枝的程度来减少过拟合。增加
ccp_alpha
值可以让模型更简单,减少过拟合的风险。 -
warm_start:支持增量学习。如果设置为
True
,则模型将保留之前的树,并在此基础上添加更多的树。适用于大数据集的训练或者模型的在线学习。
7. 总结
在构建随机森林模型时,最重要的参数通常是 n_estimators(弱分类器的数量)和 bootstrap(是否使用自助法进行数据抽样)。其他参数,如 max_depth, max_features, random_state,则用于控制单棵树的复杂度和树之间的多样性。
- 过拟合的防止:通过调节树的深度(
max_depth
)、分枝时的最小样本数(min_samples_split
)和限制树的最大叶节点数(max_leaf_nodes
)来避免单棵树过拟合。 - 提高模型稳定性:通过增加树的数量(
n_estimators
),确保模型的准确性与稳定性。 - 提升计算效率:通过设置
n_jobs
和warm_start
来加速训练,尤其在处理大数据时非常重要。
通过合适地调整这些参数,随机森林可以在提高模型性能的同时,避免过拟合并控制计算复杂度。
网格搜索(Grid Search)
最适合入门
参数空间
网格搜索的理论极限与缺点
在所有超参数优化的算法当中,枚举网格搜索是最为基础和经典的方法。在搜索开始之前,我们需要人工将每个超参数的备选值一一列出,多个不同超参数的不同取值之间排列组合,最终将组成一个参数空间(parameter space)。枚举网格搜索算法会将这个参数空间当中所有的参数组合带入模型进行训练,最终选出泛化能力最强的组合作为模型的最终超参数。
对网格搜索而言,如果参数空间中的某一个点指向了损失函数真正的最小值,那枚举网格搜索时一定能够捕捉到该最小值以及对应的参数(相对的,假如参数空间中没有任意一点指向损失函数真正的最小值,那网格搜索就一定无法找到最小值对应的参数组合)。
参数空间越大、越密,参数空间中的组合刚好覆盖损失函数最小值点的可能性就会越大。这是说,极端情况下,当参数空间穷尽了所有可能的取值时,网格搜索一定能够找到损失函数的最小值所对应的最优参数组合,且该参数组合的泛化能力一定是强于人工调参的。
网格搜索如果足够大足够密的话就一定能捕获损失函数最小值
但是,参数空间越大,网格搜索所需的算力和时间也会越大,当参数维度上升时,网格搜索所需的计算量更是程指数级上升的。以随机森林为例:
只有1个参数n_estimators,备选范围是[50,100,150,200,250,300],需要建模6次。
增加参数max_depth,且备选范围是[2,3,4,5,6],需要建模30次。
增加参数min_sample_split,且备选范围为[2,3,4,5],需要建模120次。
同时,参数优化的目标是找出令模型泛化能力最强的组合,因此需要交叉验证来体现模型的泛化能力,假设交叉验证次数为5,则三个参数就需要建模600次。在面对超参数众多、且超参数取值可能无限的人工神经网络、融合模型、集成模型时,伴随着数据和模型的复杂度提升,网格搜索所需要的时间会急剧增加,完成一次枚举网格搜索可能需要耗费几天几夜。考虑到后续实践过程中,算法和数据都将更加复杂,而建模过程中超参数调优是模型训练的必备环节,因此,我们急需寻找到一种更加高效的超参数搜索方法。在本节课中,我们将介绍三种基于网格进行改进的超参数优化方法,并将他们的结果与网格搜索进行时间/空间/效果上的对比。
建立benchmark
随机森林中枚举网格搜索的结果
贝叶斯优化(Bayesian Optimization)
最成熟