时间序列预测实战——Transformer模型实现长期预测并可视化结果(附代码+数据集+原理介绍)

news2025/2/25 6:33:12

论文地址->Transformer官方论文地址

官方代码地址->暂时还没有找到有官方的Transformer用于时间序列预测的代码地址

一、本文介绍

这篇文章给大家带来是Transformer在时间序列预测上的应用,这种模型最初是为了处理自然语言处理(NLP)任务而设计的,但由于其独特的架构和能力,**它也被用于时间序列分析。**Transformer应用于时间序列分析中的基本思想是:**Transformer 在时间序列分析中的应用核心在于其自注意力机制,**这使其能够有效捕捉时间序列数据中的长期依赖关系。通过并行处理能力和位置编码,Transformer 不仅提高了处理效率,而且确保了时间顺序的准确性。其灵活的模型结构允许调整以适应不同复杂度的数据,而编码器-解码器架构则特别适用于预测未来的时间点。**本文的讲解内容包括:**Transfomrer的基本原理、数据集介绍、模型的详细参数讲解、项目的构造、模型的训练和预测、如何用个人数据集进行训练,下面的为本文的讲解顺序图->

预测类型-> 单元预测、多元预测、长期预测、滚动预测、定制化数据集预测

二、Transformer的基本框架原理

Transformer的最开始提出是为了处理自然语言处理(NLP)任务而设计的,但由于其独特的架构和能力,所以被用于时间序列分析,但其实本身的Transformer作用于时间序列上的效果其实不是很好,**它的应用主要是其变体类似于informer、FNet、MTS等模型效果比较好,在Transformer的基础上增添一些改进从而达到更高的效果,大家如果对其变体有兴趣可以看我的其它博客都有详细的实战讲解。

1.Transformer的基本原理

Transformer 在时间序列分析中的应用核心在于其自注意力机制,这使其能够有效捕捉时间序列数据中的长期依赖关系。通过并行处理能力和位置编码,Transformer 不仅提高了处理效率,而且确保了时间顺序的准确性。其灵活的模型结构允许调整以适应不同复杂度的数据,而编码器-解码器架构则特别适用于预测未来的时间点,以下是这一思想的几个关键方面->

  1. 捕捉时间依赖性:

    时间序列数据的关键特征之一是其内在的时间依赖性。Transformer 通过自注意力机制能够捕捉这种依赖性,无论它们在序列中的距离有多远。

  2. 并行处理序列数据

    与传统的循环神经网络(RNN)或长短时记忆网络(LSTM)不同,Transformer 可以并行处理序列数据,从而提高处理效率。

  3. 位置编码

    由于 Transformer 缺乏处理序列顺序的内在机制,因此它引入位置编码来保持时间序列数据中的时间顺序信息。

  4. 处理长期依赖关系

    在时间序列分析中,了解长期依赖关系很重要。Transformer 的自注意力机制能够处理长距离的依赖关系,这在传统方法中往往是个挑战。

  5. 灵活的模型结构

    Transformer 模型可以根据需要调整其复杂性,例如通过增加层数或调整头的数量来处理不同规模和复杂度的时间序列数据。

  6. 编码器-解码器架构

    一些 Transformer 变体采用编码器-解码器架构,这对于预测未来时间点的时间序列数据特别有效。

2.Transformer的基本结构

这个图片展示了一个标准的 Transformer 模型的架构, 这个结构用于序列到序列的任务,如机器翻译。下面是各个部分的分析:

  1. 输入嵌入(Input Embedding):

    • 输入序列的每个元素首先被转换成一个高维空间的嵌入向量。
  2. 位置编码(Positional Encoding):

    • 由于 Transformer 没有递归结构来处理序列的顺序,位置编码向量被加到输入嵌入中以提供序列中每个元素的位置信息。
  3. 编码器(左侧):

    • 编码器由 N个相同的层堆叠而成。
    • 每层包含两个主要部分:多头注意力(Multi-Head Attention)和前馈(Feed Forward)网络。
    • 每个部分后面都跟着一个加法 & 归一化(Add & Norm)步骤,这实际上是一个残差连接和层归一化。
  4. 多头注意力:

    • 这个部分让模型同时关注输入序列的不同部分(称为“头”),每个头捕获序列中不同的信息。
  5. 前馈网络:

    • 这是一个简单的全连接网络,对每个位置应用相同的操作,但是独立于其他位置。
  6. 解码器(右侧):

    • 解码器也由 N个相同的层组成,每层有三个主要部分:遮蔽多头注意力(Masked Multi-Head Attention)、多头注意力和前馈网络。
    • 遮蔽机制确保在预测一个序列的当前位置时,模型不会看到未来的位置。
  7. 输出嵌入(Output Embedding)和位置编码:

    • 解码器的输出嵌入和位置编码与编码器端类似,位置编码提供了输出序列中元素的位置信息。
  8. 线性层和 Softmax:

    • 解码器的最顶层输出通过一个线性层,然后是一个 Softmax 层,它预测下一个序列元素的概率分布,并且根据Sofrtmax进行输出最大值**(需要注意的是我们在时间序列中将softmax替换为Linear线性层处理)。**

总结: 整个模型通过训练来同时优化所有这些部分,学习将输入序列转换为输出序列,从而具有预测的功能。

下面是定义的Transformer的网络结构代码 (如果想研究可以配合网络结构图看看是有差别的)

class Model(nn.Module):
    """
    Vanilla Transformer with O(L^2) complexity
    """
    def __init__(self, configs):
        super(Model, self).__init__()
        self.label_len = configs.label_len
        self.pred_len = configs.pred_len
        self.output_attention = configs.output_attention

        # Embedding
        if configs.embed_type == 0:
            self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq, configs.dropout)
            self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq, configs.dropout)
        elif configs.embed_type == 1:
            self.enc_embedding = DataEmbedding_wo_temp(configs.enc_in, configs.d_model, configs.dropout)
            self.dec_embedding = DataEmbedding_wo_temp(configs.dec_in, configs.d_model, configs.dropout)

        # Encoder
        self.encoder = Encoder(
            configs.e_layers, configs.n_heads, configs.d_model, configs.d_ff, 
            configs.dropout, configs.activation, configs.output_attention,
            norm_layer=torch.nn.LayerNorm(configs.d_model)
        )

        # Decoder
        self.decoder = Decoder(
            configs.d_layers, configs.n_heads, configs.d_model, configs.d_ff,
            configs.dropout, configs.activation, configs.output_attention,
            norm_layer=torch.nn.LayerNorm(configs.d_model),
        )
        self.projection = nn.Linear(configs.d_model, configs.c_out)
        self.rev = RevIN(configs.c_out) if configs.rev else None

    def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, enc_self_mask=None, dec_self_mask=None, dec_enc_mask=None):
        x_enc = self.rev(x_enc, 'norm') if self.rev else x_enc

        enc_out = self.enc_embedding(x_enc, x_mark_enc)
        enc_out, attns = self.encoder(enc_out, attn_mask=enc_self_mask)
        
        dec_out = self.dec_embedding(x_dec, x_mark_dec)
        dec_out = self.decoder(dec_out, enc_out, x_mask=dec_self_mask, cross_mask=dec_enc_mask)
        dec_out = self.projection(dec_out)

        dec_out = self.rev(dec_out, 'denorm') if self.rev else dec_out

        if self.output_attention:
            return dec_out[:, -self.pred_len:, :], attns
        else:
            return dec_out[:, -self.pred_len:, :]  # [B, L, D]

三、数据集介绍

所用到的数据集为某公司的业务水平评估和其它参数具体的内容我就介绍了估计大家都是想用自己的数据进行训练模型,这里展示部分图片给大家提供参考->

四、参数讲解

下面是模型声明的所有参数->

    parser.add_argument('--train', type=bool, default=True, help='Whether to conduct training')
    parser.add_argument('--rollingforecast', type=bool, default=True, help='rolling forecast True or False')
    parser.add_argument('--rolling_data_path', type=str, default='ETTh1-Test.csv', help='rolling data file')
    parser.add_argument('--show_results', type=bool, default=True, help='Whether show forecast and real results graph')
    parser.add_argument('--model', type=str, default='FNet',help='Model name')

    # data loader
    parser.add_argument('--root_path', type=str, default='./data/', help='root path of the data file')
    parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')
    parser.add_argument('--features', type=str, default='MS',
                        help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
    parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')
    parser.add_argument('--freq', type=str, default='h',
                        help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
    parser.add_argument('--checkpoints', type=str, default='./models/', help='location of model models')

    # forecasting task
    parser.add_argument('--seq_len', type=int, default=126, help='input sequence length')
    parser.add_argument('--label_len', type=int, default=64, help='start token length')
    parser.add_argument('--pred_len', type=int, default=4, help='prediction sequence length')

    # model
    parser.add_argument('--norm', action='store_false', default=True, help='whether to apply LayerNorm')
    parser.add_argument('--rev', action='store_true', default=True, help='whether to apply RevIN')
    parser.add_argument('--d_model', type=int, default=512, help='dimension of model')
    parser.add_argument('--n_heads', type=int, default=1, help='num of heads')
    parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers')
    parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers')
    parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')
    parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')
    parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')
    parser.add_argument('--c_out', type=int, default=7, help='output size')
    parser.add_argument('--dropout', type=float, default=0.05, help='dropout')
    parser.add_argument('--embed', type=str, default='timeF',
                        help='time features encoding, options:[timeF, fixed, learned]')
    parser.add_argument('--output_attention', action='store_true', help='whether to output attention in ecoder')
    parser.add_argument('--activation', type=str, default='gelu', help='activation')
    parser.add_argument('--embed_type', type=int, default=1,
                        help='0: default 1: value embedding + temporal embedding + positional embedding 2: value embedding + positional embedding')
    # optimization
    parser.add_argument('--num_workers', type=int, default=0, help='data loader num workers')
    parser.add_argument('--train_epochs', type=int, default=10, help='train epochs')
    parser.add_argument('--batch_size', type=int, default=16, help='batch size of train input data')
    parser.add_argument('--learning_rate', type=float, default=0.001, help='optimizer learning rate')
    parser.add_argument('--loss', type=str, default='mse', help='loss function')
    parser.add_argument('--lradj', type=str, default='type1', help='adjust learning rate')

    # GPU
    parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu')
    parser.add_argument('--device', type=int, default=0, help='gpu')

1.详细的参数讲解

五、项目结构

项目的目录结构如下图->

六、模型的训练和预测

6.1训练模型

配置好我们的所有参数之后,我们可以运行main.py文件之后就可以开始训练, 可以看到控制台开始输出训练批次和损失->

当我们训练完成之后,训练好的模型会保存到该目录下->

6.2滚动长期预测

当我们保存之后可以开启滚动预测了,预测是每次预测未来四个点的数据 (这个是根据你自己设定的就是参数中的pred_len) 控制台输出如下->

6.2.1滚动长期预测结果展示

我将你目标列其你的OT列进行了保存为csv的格式文件方便大家进行二次修改或者分析,结果保存在如下的文件中。

然后可视化结果保存在下图的results.png中,

我们的预测结果图片如下->

6.2.2结果分析

可以看到结果是十分的一般,我甚至怀疑Transformer模型是对于预测是否是真的有效,最近的DLinear提出了一个十分简单的模型就是为了推翻Transformer模型的预测是否有效,参数量比Transformer少了上百倍但是结果却比Transformer好的很多很多,所以我也对Transformer模型表示怀疑,当然Transformer的变体还是有预测效果的类似于informer毕竟是当年的bestpaper ,但是我试验过很多模型我觉得Transformer的模型整体效果预测都一般(以上仅代表我个人观点)

七、定制化训练个人数据集

这个模型我在写的过程中为了节省大家训练自己数据集,我基本上把大部分的参数都写好了,需要大家注意的就是如果要进行滚动预测下面的参数要设置为True。

    parser.add_argument('--rollingforecast', type=bool, default=True, help='rolling forecast True or False')

如果上面的参数设置为True那么下面就要提供一个进行滚动预测的数据集该数据集的格式要和你训练模型的数据集格式完全一致(重要!!!),如果没有可以考虑在自己数据的尾部剪切一部分,不要粘贴否则数据模型已经训练过了的话预测就没有效果了。

    parser.add_argument('--rolling_data_path', type=str, default='ETTh1-Test.csv', help='rolling data file')

其它的没什么可以讲的了大部分的修改操作在参数讲解的部分我都详细讲过了,这里的滚动预测可能是大家想看的所以摘出来详细讲讲。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多微信运营管理方案

微信作为一款社交通讯软件,已经成为人们日常生活中不可缺少的工具。不仅个人,很多企业都用微信来联系客户、维护客户和营销,这自然而然就会有很多微信账号、手机也多,那管理起来就会带来很多的不便,而多微信私域管理系…

CS2黑屏、闪退、掉线的解决方法一览

历时近一年,V社终于针对CS2进行了实质性更新,而不是做一些华而不实的升级。本次更新V社带来了五张全新地图,让各位可以在游戏内尽情享受混战和新地图带来的新乐趣。不过有很多玩家吐槽,自己在游玩CS2时,老遇到黑屏、闪…

wasm的逆向之旅一

目录 概要 技术名词解释 1、WebAssembly 指令集概览 1)基本结构 2)数据类型 3)模块和函数 4)指令概览 1.i32 整数运算 2.i32 浮点数运算(用法同整数运算) 3.逻辑运算和位移(用法同整数运算) 4.内存访问指令 6.控制流指令 7.模块和导出指令 8.其他常…

计组_机器指令

2024.06.13:计算机组成原理机器指令学习笔记 第13节 机器指令 3.1 指令的作用3.2 指令的格式3.2.1 操作码字段(用户要干什么)3.2.2 (操作数)地址码字段(对谁进行操作)3.2.3 格式分类*(一步步优化&#xff0…

FDL专题:如何在工作中对Kettle任务进行迁移?可以直接调用吗?

IT团队历史数据同步任务过去都用的Kettle来开发,但kettle的定时调度不方便,维护成本高,遇到报错不知道怎么办。苦寻CSDN无果,只得在公司留下一个个深夜加班的背影...... IT经理想到:是否能将任务一步步迁移到一个统一…

易保全推动区块链应用与AI融合创新发展

数字化时代,区块链和人工智能技术作为当下两大“黑科技”,两者的深度结合,正在为企业数字化转型带来前所未有的机遇。 易保全作为国内权威的电子数据存证保全机构,积极探索两者的融合之道,将区块链的去中心化、不可篡…

解锁科研新动力,QtiPlot for Mac——您的数据可视化与分析首选工具!

QtiPlot for Mac,一款专为科研工作者和数据分析爱好者打造的数据可视化与分析神器,它如同科研道路上的得力助手,让复杂的数据分析变得简单直观。🔬📈 这款软件拥有强大的数据导入与处理能力,支持多种数据格…

电脑本机ip地址怎么查?介绍几种简单快捷方法

在数字时代,无论是网络连接、远程操作还是设备识别,IP地址都扮演着至关重要的角色。然而,对于许多电脑用户来说,如何快速准确地查找本机IP地址仍然是一个挑战。虎观代理小二将为您详细介绍几种简单快捷的IP地址查询方法&#xff0…

openssh9.8p1的rpm包

openssh9.8p1的rpm包 centos7下的openssh9.8p1rpm包 安装环境:centos7全系列 已经集成所有依赖到rpm包中,直接安装即可 rpm包下载链接 (免积分下载) 安装命令 tar -zxvf centos7_openssh-9.8.tar cd centos7_openssh-9.8 rpm -Uvh --force --nodeps *…

快速了解GPT-4o和GPT-4区别

GPT-4o简介 在5月14日的OpenAI举行春季发布会上,OpenAI在活动中发布了新旗舰模型“GPT-4o”!据OpenAI首席技术官穆里穆拉蒂(Muri Murati)介绍,GPT-4o在继承GPT-4强大智能的同时,进一步提升了文本、图像及语…

VS开发QT程序图标修改

VS开发QT程序图标修改 1.双击打开UI界面 2.选择编辑资源 3.添加文件 4.选择ico文件 5.ok确定 6.点击保存 7.选择windowsIcon,倒三角图标 8.选择资源 9.选择图标,点击ok 10.保存 编译运行: 任务栏:

电脑免费压缩软件app哪个好?Top15压缩软件良心测评,图文详解!

你是否在寻找一款能够帮助你释放电脑存储空间的免费压缩软件app呢?在当今数字化生活中,文件和媒体内容日益增多,而硬盘空间却总是显得不够用。优秀的压缩工具不仅能节省空间,还能提升系统效率,让你的电脑运行更加流畅。…

Arthas实战(2)- OOM问题排查

一、 准备测试应用 新建一个 SpringBoot应用&#xff0c;写一段有 OOM bug 的代码&#xff1a; RestController RequestMapping public class JvmThreadController {List<TestWrapper> memoryList new ArrayList<>();GetMapping("/test")public Strin…

年份与产地:解锁红酒的秘密密码

在红酒的世界里&#xff0c;年份与产地如同两把神秘的钥匙&#xff0c;它们背后隐藏着红酒不同的魅力与秘密。今天&#xff0c;就让我们一起揭开这层神秘的面纱&#xff0c;探寻年份与产地如何为红酒赋予不同的灵魂&#xff0c;特别是以雷盛红酒为例&#xff0c;感受那份从岁月…

十 .pfc,bus纹波分析与抑制方法

以apfc为例 在分析时用 uin 和 iin 表示输入电压和输入电流&#xff0c;uo 和 io&#xff0c;表示输出电压和输出电流&#xff0c;Uin 和 Iin 表示输入电压和输入电流的幅值&#xff0c;则输入电压和输入电流可以分别表示为&#xff1a; 从式&#xff08;3-3&#xff09;可以…

Python28-1 机器学习算法之决策树

决策树&#xff08;Decision Tree&#xff09; 决策树算法是一种常用的机器学习算法&#xff0c;属于监督学习范畴。它可以用于分类和回归任务&#xff0c;具有易于理解和解释的特点。决策树通过递归将数据分割成更小的子集&#xff0c;构建一个树形结构&#xff0c;其中每个节…

KV260视觉AI套件--PYNQ-DPU-Resnet50

目录 1. 简介 2. 代码解析 3. 全部代码展示 4. 总结 1. 简介 本文以 Resnet50 为例&#xff0c;展示使用 PYNQ 调用 DPU 运行 Resnet50 网络的详细过程&#xff0c;并对其中关键代码做出解释。 PYNQ是一个针对Xilinx Zynq平台的Python开发框架&#xff0c;它允许开发者使…

学校教室NTP电子钟时间是如何同步北京时间的?-讯鹏时钟

在学校教室里&#xff0c;NTP 电子钟精准地显示着时间&#xff0c;与北京时间保持高度同步&#xff0c;为师生们提供了可靠的时间参考。那么&#xff0c;它是如何做到这一点的呢&#xff1f; NTP 电子钟能够与北京时间同步&#xff0c;主要依赖于网络时间协议&#xff08;NTP&a…

准化 | 水系统碳中和标准体系初见成效

2024年5月31日&#xff0c;中华环保联合会发布《团体标准公告 2024年第10号&#xff08;总第78号&#xff09;》&#xff0c;批准发布了由中华环保联合会提出并归口的《废水处理温室气体监测技术规程》(T/ACEF 142-2024)、《工业水系统碳排放核算方法与报告指南》(T/ACEF143-20…

数据驱动:Facebook的广告策略与商业模式

在现代数字经济中&#xff0c;数据已经成为新的石油&#xff0c;驱动着企业的增长和创新。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;充分利用其庞大的用户数据和先进的算法技术&#xff0c;建立了一个高度精确和高效的广告生态系统。这不仅推动了平台自…