机器学习方法_机器学习模型应用方法综述

408c2e815459d1bc75410705637a074d.png

2bb16899bba1c328b12446028564895a.gif

14bc814d3a07df426faf53d189a93f5e.png

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。

来源 | 数据派THU(id:DatapiTHU)
作者:Julien Kervizic
翻译:陈之炎 校对:李海明

本文整理比较模型部署到生产中使用的不同部署模型方式、生命周期管理方法及数据存储格式。

e2e5d16fa2923433cf8abb2c2516134e.png

Mantas Hesthaven拍的发表在 Unspash上的照片

机器学习模型的应用方法多种多样,不一而足。 例如,在客户流失预测中,当客户呼叫服务时,系统中便可以查找到一个静态统计值,但对于特定事件来说,系统则可以获得一些额外值来重新运行模型。

通常,有很多方法可以对模型进行训练,并将其转化为应用产品:

1. 训练:一次性训练、批量训练和实时训练/在线训练

2. 应用:批训练、实时训练 (数据库触发器、Pub/Sub、Web服务、inApp)

每种方法都有各自的优劣,需要折中考虑。

01一次性训练

模型在应用前,无需进行连续的多次训练。通常情况下,在数据科学家完成对模型的特定训练之后,便可进行应用,待模型性能无法满足使用要求时,再对其进行更新。

01从Jupyter到Prod

通常,数据科学家会在Jupyter Notebooks环境中组建原型和使用机器学习算法。Jupyter Notebooks是repl上的高级GUI,可以在这个环境中同时保存代码和命令行输出。

采用这种方法,完全可以将一个经过特别训练的模型从Jupyter中的某个代码推向量产。多种类型的库和其他笔记本环境有助于加强数据科学家工作台和最终产品之间的联系。

02模型格式

Pickle将python对象转换为比特流,并将其存储到磁盘以便后续重新加载。它提供了一种很好的格式来存储机器学习模型,亦可在python中构建其应用程序。

ONNX为开放式神经网络交换格式,作为一种开放格式,它支持跨库、跨语言存储和移植预测模型。大多数深度学习库都支持该格式, sklearn还有一个扩展库来将模型转换为ONNX格式。

PMML或预测模型标记语言,是另一种用于预测模型的交换格式。sklearn还有另一个扩展库,可用于将模型转换为PMML格式,这与ONNX是一致的。然而,它的缺点是只支持某些类型的预测模型,PMML从1997年开始出现,大量的应用程序均采用这种格式。例如:像SAP这样的应用程序能够利用PMML标准的某些版本,对于CRM应用程序(如PEGA)也是如此。

POJOMOJO是两种H2O.ai的导出格式,他们旨在为Java应用程序提供一个易于嵌入的模型。然而,这两种导出格式只在H2O平台上使用。

03训练

对一次性训练模型,可以由数据科学家专门对模型进行训练和精调,或者也可以通过AutoML库进行训练。通过简单设置,便可将模型产品化推进到下一个阶段,例如批训练。

02批训练

虽然不是所有的模型都需要应用,但批训练可以根据最新的训练结果使模型的版本得到连续刷新。

批训练受益于AutoML框架,其通过AutoML能够自动执行一系列动作。例如:特征处理、特征选择、模型选择和参数优化。AutoML新近的表现与最勤奋的数据科学家不相上下,甚至超过了他们。

b7a4c2407f335868aa4d4069c2ba2059.png

LinkedIn上的帖子

利用它们可以进行更为全面的模型训练,而不是做预训练:简单地重新训练模型的权重。

目前有多种不同的技术来支持连续的批训练,例如,可以通过多种混合 airflow来管理不同的工作流和类似tpot的AutoML库。

不同的云服务提供商为 AutoML 提供了各种解决方案,并把这些解决方案放到数据工作流中。例如,Azure将机器学习预测和模型训练与其数据工厂进行了整合。

03实时训练

实时训练可以通过“在线机器学习”模型实现,支持这种训练方法的算法包括:K-均值(通过小批处理)、线性回归和 Logistic 回归(利用随机梯度下降)以及朴素贝叶斯分类器。

Spark 中包含 StreamingLinear 算法 / StreamingLinearRegressionWithSGD 算法来执行这些操作, Skinlear 具有 SGDRegressor 和 SGD 分类器,可实现增量训练。在 sklearn 中,增量训练通过 partial_fit 方法完成,如下所示:

9eabee1a091e3e26057091b7d32afd3f.png

在部署这类模型时,需要严格的操作支持和监控,因为模型对新的数据和噪声很敏感,所以需要动态地监控模型性能。在离线训练中,可以过滤掉高位的点值,并对输入数据进行校正。当需要根据新的数据流不断更新模型训练时,难度系数会高出许多。

在线模型训练的另一个挑战是,过往历史信息得不到衰减。 这意味着,如果数据集的结构有新的变化,则需要重新对模型训练,这在模型生命周期管理中将是一个很大的挑战。

04

批量预测与实时预测的比较

当选择是设置批量预测还是设置实时预测时,必须了解实时预测的重要性。如果发生重大事件,有可能会获得新的分数,例如当客户呼叫联络中心时,客户流失评分又会是多少。在实时预测时,需要对这些因素进行加权,以克服由于进行实时预测而产生的复杂性和成本影响。

01载荷的影响

在进行实时预测时,需要有一种处理高峰负荷的方法。需要根据所采用的途径以及使用的预测如何结束,来选择一种实时方法,可能还需要有具有额外计算能力的超级机器,以便在某个SLA中提供预测。这与批量预测的处理方法形成了对比,在批量预测中,可以根据可用容量将预测计算分散到一整天。

02架构的影响

在实时预测时,运营责任会更高一些,人们需要对系统是如何工作进行监测,在出现问题时有告警,并考虑到故障转移责任。 对于批量预测来说,运营责任要低得多,只需要对告警进行一些必要的监测,而对于了解产生问题的直接原因的需求要低得多。

03成本的影响

实时预测也受成本因素的影响,一味追求高算力,而却没有选择将计算负荷分散在全天进行,可能会迫使你购买那些超出算力需求的硬件设备或提高现货价格。根据所用方法和需求,可能还需要投入额外的成本购买更强大的计算能力来满足SLA的需求。此外,在选择实时预测时,可能会有更高的架构要求。需要注意的是,在应用程序中,所做出的选择要依赖应用程序的预测,对于这样的特定场景,实时预测的成本最终可能会比批量预测的成本更低。

04评估的影响

实时预测的预测性能评估比批量预测的预测性能评估更具挑战性。例如,当在短时间内遇到一连串的突发行为时,如何评估性能,会不会为特定的客户产生多个预测结果?实时预测模型的评估和调试要复杂得多,它还需要一个日志收集机制,既允许收集不同的预测结果和特征,也可以生成分数以供进一步评估。

05批量预测集成

批量预测依赖于两个不同的信息:一个是预测模型,另一个是提供给模型的特征。在大多数批处理预测体系结构中,ETL既可以从特定的数据存储(特征存储)中获取预先计算的特征,也可以跨多个数据集执行某种类型的转换,并向预测模型提供输入。然后,预测模型对数据集中所有的行数据进行迭代,并输出不同的分值。

9e14296e2d6f05fdce487815b6a0bc13.png

用于批量预测的示例流模型

一旦计算得到所有的预测结果,便可以将分数“投入”到那些有信息使用需求的不同系统中。可以根据不同的应用实例,并通过不同的方式来实现分数的使用。例如,如果想在前端应用程序上使用分数,则很可能将数据推送到“缓存”或NoSQL数据库:比如Redis,这样可以提供毫秒的响应;而对于某些用例,比如创建电子邮件,可能只是依赖CSV SFTP导出或将数据加载到更传统的RDBMS。

06实时预测集成

基于实时应用的模型使用需要3个基本组件:客户/用户配置文件、一组触发器和预测模型。

0cab34b58c34c9dd6b5a1e8138e83ae0.png

配置文件:客户配置文件包含和客户相关的所有属性,以及给出预测所必需的不同属性(例如:计数器)。对于客户级预测,为了减少从多个地方提取信息的延迟,以及简化机器学习模型的量产化过程,配置文件是必须的。在大多数情况下,为了更有效地获取数据,需要相似的数据存储类型。

触发器:触发器是引导进程启动的事件,它们可以用于客户流失的预测。例如调用客户服务中心、检查订单历史记录中的信息等。

模型: 模型需要经过预先训练,通常导出到前面提到的 3 种格式之一 (pickle、 ONNX 或 PMML) ,以便可以将其移植到量产中。

还有许多方法可以将模型应用至评分产品中:

1. 取决于数据库集成:诸多数据库供应商为在数据库中绑定高级分析用例做出了重大努力,既可以直接集成Python或R代码,也可以导入PMML模型。

2. 利用Pub/Sub模型:预测模型本质上是对数据流的输入执行某些操作,例如提取客户配置信息等。

3. Webservice:围绕模型预测设置API封装器,并将其部署为Web服务。根据Web服务的设置方式,它可能执行或不执行驱动模型所需的数据操作。

4. inApp:也可以将模型直接部署到本地或Web应用程序中,并让模型在本地或外部数据源上运行。

07

数据库集成

如果数据库的总体大小不大 (用户配置文件<1M),并且更新频率也不大,那么将一些实时更新过程直接集成到数据库中会很有意义。

Postgres允许将Python代码作为函数或称为PL/Python的存储过程来运行。该实现可以访问所有作为PYTHONPATH的一部分库,也可以使用Pandas和SKLearning等库来运行某些操作。

此外,还可以与Postgres的触发器机制相结合来运行数据库,并更新客户流失分数。比如,如果在投诉表中输入了一个新条目,那么让模型实时重新运行的话便很有价值。

137c4b287520f7296517fc3f1f99e6ab.png

01流程

流程以如下方式设置:

1. 新事件: 当在投诉表中插入新行时,将生成事件触发器。

2. 触发器: 触发器功能将更新该客户在客户配置文件表中提出的投诉数量,并为客户更新记录。

3. 预测请求:使用PL/Python重新运行客户流失模型并检索预测结果。

4. 用户配置文件的更新:根据更新后的预测结果重新更新客户配置文件。然后,当检查客户配置文件是否已经用客户流失预测值进行更新时,就会生成下游流。

02技术

Different databases are able to support the running of多种数据库支持Python脚本的运行,如前所述, Postgres集成有本地Python, MSSQL Server也可以通过其“机器学习服务(在数据库中)”运行R/Python脚本,诸如Teradata等其他数据库可以通过外部脚本命令运行R/Python脚本。Oracle通过其数据挖掘扩展支持PMML模型。

08Pub/Sub

通过pub/sub模型实现实时预测,可以通过节流正确地处理负载。对于工程师而言,这也意味着可以通过一个单独的“日志”提要来输入事件数据,不同的应用程序均可以订阅这个提要。

设置示例:

472beffa364f4edf3d3acc1ab15d7d13.png

页面查看事件被触发到特定的事件主题,在该主题中,两个应用程序订阅一个页面查看计数器和一个预测器。这两个应用程序都从主题中筛选出特定的相关事件,并在该主题中使用不同的消息。页面查看计数器为仪表板提供数据,而预测应用程序则负责更新客户配置文件。

ea1a0801da6618443953ca3d57ecbe3a.png

01流程

事件消息在发生时被推送到pub/sub主题,预测应用程序会轮询新消息的主题。当预测应用程序检索到新消息时,该程序将请求并检索客户配置文件,并使用消息和配置文件信息进行预测,预测结果最终返回客户配置文件以供进一步使用。

还可以设置一个稍微不同的流程:数据首先被一个“富集应用程序”使用,该应用程序将配置文件信息添加到消息中,然后返回一个新主题,并最终交由预测应用程序推送到客户配置文件上。

02技术

您会发现,在数据生态系统中支持这种用例的典型的开源组合是Kafka和SPark流的组合,但是云上可能有不同的设置。值得注意的是:Google发布的pub-sub /数据流(BEAM)提供了一个很好的替代方案,在Azure上,Azure-Service总线或Eventub和Azure函数的组合可以作为一种很好的方式来利用消息生成这些预测。

09网络服务Web Service

我们还可以将模型作为互联网服务产品。将预测模型作为互联网服务产品对于工程团队尤为有用,这些团队通常需要处理Web、桌面和移动等多个不同的接口。

可以有多种方式设置Web服务的接口:

1. 提供标识符,然后让web服务提取所需的信息,计算预测值,然后返回该值

2. 或者通过接受有效载荷,将其转换为数据帧,进行预测并返回该值。

当发生大量交互,并且使用本地缓存与后端系统的同步,或者当需要在不同的粒度上进行预测时,比如:在进行基于会话的预测时,通常建议使用第二种方法。

使用本地存储的系统往往具有还原功能,其作用是计算客户配置文件的内容,因此,它提供了基于本地数据的客户配置文件的近似值。

91d1e6a950b50eaeac359e9ce5af2d47.png

01流程

使用移动应用程序处理预测的流程可分为4个阶段进行描述:

1. 应用程序初始化(1至3)阶段:应用程序初始化,向客户配置文件发出请求,检索其初始值,在本地存储中初始化配置文件。

2. 应用程序(4)阶段:应用程序将与该程序中出现的不同事件存储到本地存储区的数组中。

3. 预测准备阶段(5-8):如果应用程序想要检索一个新的客户流失预测,那么它需要将互联网服务所需的信息准备好。首先对本地存储进行初始请求,并检索客户配置文件的值及其存储的事件数组,检索完成后,向还原器函数提出请求,将这些值作为参数,还原器函数输出一个更新后的客户配置文件,并将本地事件合并到这个客户配置文件中。

4. Web服务预测阶段(9至10):应用程序向客户流失预测的互联网服务产品发出请求,将第8步骤中的有效载荷提供给更新后的客户配置文件。然后,互联网服务产品可以使用载荷提供的信息生成预测并将其值输出给应用程序。

02技术

有很多技术可以用来支持互联网服务产品预测:

1. 函数

AWS Lambda函数、GoogleCloud函数和MicrosoftAzure函数(尽管目前只支持Beta版Python)提供了一个易于设置的界面,可以轻松地部署可伸缩的Web服务。
例如,在Azure上,可以通过如下函数实现web-service预测:

8bfde80ef483cd42f59a756abb2262ab.png

80ef9b3128762d2388a987b89b772089.png

2. 容器

除了函数之外的另一种选择是通过docker容器(AmazonECS、Azure容器实例或Google Kubernetes引擎)部署一个Flask或Django应用程序。例如,Azure通过“AzureMachineLearning服务”提供了一种简单的方法来设置预测容器。

3. 笔记簿

不同的笔记薄提供商,如Databricks和dataiku,都致力于简化其环境中的模型部署。它们具有将webservice设置到本地环境或部署到外部系统(如Azure ML服务、Kubernetes引擎等)的功能。

10应用程序内部

在某些情况下,因为法律和隐私的要求,不允许数据被存储在应用程序外部时,或者必须上传大量文件时,往往会在应用程序内部调用模型。

Android-MLKit 或 Caffe2类似的工具允许在本地应用程序中调用模型,而Tensorflow.js和ONNXJS允许直接在浏览器中或在JavaScript的应用程序中运行模型。

11需要综合考虑的几点

除了模型的部署方法外,部署模型到量产时需要考虑以下重要因素。

01模型的复杂度

模型本身的复杂程度,是应首先要考虑的因素。像线性回归和Logistic回归这样的模型非常容易部署,通常不会占用太多的存储空间。使用更为复杂的模型,如神经网络或复杂集成决策树,计算将占用更长时间,冷启动时加载到内存中的时间也会更长,而且运行成本会更高。

02数据来源

需要着重考虑的是实际应用中的数据源与用于训练的数据源之间可能存在的差异。虽然用于训练的数据必须与生产中实际使用数据内容同步,但是重新计算每个值以使其完全同步是不切实际的。

03实验框架

建立一个实验框架,用于客观度量不同模型性能的A/B测试,并确保有足够的跟踪来准确地调试和评估模型的性能。

11小结

选择如何将预测模型部署到生产中是一件相当复杂的事情,可以有多种不同的方法来处理预测模型的生命周期管理,也可以用不同的格式来存储它们,从多种方法中选取恰当的方法来部署模型,包含非常宽泛的技术含量。

深入理解特定的用例、团队的技术和分析成熟度、整体组织结构及其交互,有助于找到将预测模型部署到生产中的正确方法。

d0c6f731ab3293c5fe185554408f7bbd.png

398d14c453d0e9d816c0cdb36a3b945c.png

星标我,每天多一点智慧

90f5ae8ecb129ee688aadf4e8520cb9d.gif

7e6a45dcfcee7b2f95ddc71c48df977b.png

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

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

相关文章

程序员面试金典 - 面试题 16.21. 交换和(哈希set)

1. 题目 给定两个整数数组&#xff0c;请交换一对数值&#xff08;每个数组中取一个数值&#xff09;&#xff0c;使得两个数组所有元素的和相等。 返回一个数组&#xff0c;第一个元素是第一个数组中要交换的元素&#xff0c;第二个元素是第二个数组中要交换的元素。 若有多…

来,教你成为科研卷王

作为曾经熬通宵肝论文的过来人&#xff0c;小编要吐槽&#xff0c;论文写久了真的会头秃&#xff0c;尤其是确定选题和创新点的时候&#xff0c;是薅头发事件的高发阶段。对于那些导师放养、在自己的摸索中磕磕绊绊前行的科研新手们&#xff0c;焦虑总是瞅准时机就扑面而来——…

DEBUG主要命令(转)

1、如何调用DEBUG程序语法格式&#xff1a;DEBUG &#xff3b;驱动器名&#xff1a;&#xff3d;&#xff3b;路径&#xff3d;&#xff3b;文件名&#xff3d;如有文件名&#xff0c;则将指定的文件调入内存。如命令中没有指定文件名&#xff0c;则DEBUG可以与正在内存中的内…

python手机编译器可以干什么_Python是什么?Python学习用哪些编译器?

Python是什么&#xff1f;Python是一个非常好用的程序语言&#xff0c;开发的速度非常快。Python的设计哲学是优雅、明确、简单。因此&#xff0c;Perl语言中总是有多种方法来做同一件事的理念在Python开发者中通常是难以忍受的。 Python开发者的哲学是用一种方法&#xff0c;最…

程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

文章目录1. 题目2. 解题2.1 排序2.2 不排序1. 题目 给定一个整数数组&#xff0c;编写一个函数&#xff0c;找出索引 m 和 n &#xff0c;只要将索引区间 [m,n] 的元素排好序&#xff0c;整个数组就是有序的。 注意&#xff1a;n-m 尽量最小&#xff0c;也就是说&#xff0c;找…

福州公交车与拖拉机相撞1人死亡

2007年7月3日下午17时许&#xff0c;福州地区大学新校区学园路路段发生一起交通事故。郑久忠(男&#xff0c;35岁&#xff0c;鼓楼区八一七中路734号弄一号)驾驶41路公交车沿学园路由北往南行驶&#xff0c;途经厚庭路和学园路交叉路口&#xff0c;与林亮(男&#xff0c;34岁&a…

综述|视觉Transformer在CV中的现状、趋势和未来方向

文 | 汽车人源 | 自动驾驶之心摘要Transformer&#xff0c;一种基于注意力的编码器-解码器模型&#xff0c;已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域。受这些重大成就的启发&#xff0c;最近在计算机视觉&#xff08;CV&#xff09;领域采用类似Transformer…

python变量定义问题_python 定义n个变量方法 (变量声明自动化)

python 定义n个变量方法 (变量声明自动化) code&#xff1a; for i in range(100): cmd "t%s 1" % i exec cmd eval("t%s" % i) print t10 输出 1 &#xff0c; 表示我们创建了 t0 - t99 这样的变量 以上这篇python 定义n个变量方法 (变量声明自动化)就是…

CodeFileBaseClass 属性

asp.net 2.0 中&#xff0c;今天遇到了一个错误&#xff1a;Make sure that the class defined in this code file matches the inherits attribute, and that it extends the correct base class (e.g. Page or UserControl)原因是我的 CodeBehind 类继承了自定义的页面基类。…

程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)

1. 题目 搜索旋转数组。给定一个排序后的数组&#xff0c;包含n个整数&#xff0c;但这个数组已被旋转过很多次了&#xff0c;次数不详。 请编写代码找出数组中的某个元素&#xff0c;假设数组元素原先是按升序排列的。若有多个相同元素&#xff0c;返回索引值最小的一个。 示…

强化学习,商业化之路宣告死亡了吗?

文 | Shona继DeepMind推出AlphaGo已过去7年&#xff0c;强化学习在游戏行业有了不少应用&#xff0c;例如游戏陪玩、AI托管等。在这过程中&#xff0c;越来越多的公司 / 研究院所为强化学习的研究投入了大量的资源与精力。随之而来的&#xff0c;也有不少质疑&#xff0c;不少人…

转usb驱动cmw500 ni_支持USB Type-C接口的外置蓝光驱动器IO Data BRP-UT6 / MC2本月发售...

IO Data以其非正统的数据设备闻名&#xff0c;最近IO Data新推出了一款支持USB Type-C接口的外置超薄蓝光驱动器设备 BRP-UT6 / MC2&#xff0c;除了支持USB-C接口&#xff0c;其配置是非常标准的超薄外置蓝光光驱规格&#xff0c;支持最新的BDXL和M-DISC规格&#xff0c;附赠M…

ajax缓存处理

最近写程序是发现,使用ajax的时候,有时候既然不能访问请求页面了,压根就不走后台代码了.........测试了很久,发现应该是缓存的问题:可以在前台异步调用是加上:xmlHTTP.setRequestHeader("If-Modified-Since","0");或者如果你的后台请求页面是一个.aspx页面…

程序员面试金典 - 面试题 16.26. 计算器(栈)

1. 题目 给定一个包含 正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外)&#xff0c;计算其结果。 表达式仅包含非负整数&#xff0c;&#xff0c; - &#xff0c;*&#xff0c;/ 四种运算符和空格 。 整数除法仅保留整数部分。 示例 1: 输入: "32*2" 输…

深度学习撞墙?谷歌:是时候动用钞能力了

文 | 天于刀刀推特上万众瞩目的明星语言大模型比赛项目 Inverse Scaling Prize 终于在近期落下了帷幕&#xff0c;这也是社区中第一次针对 scaling law 反例的探究&#xff0c;各式各样的大模型和 NLP 任务在比赛期间被提出和应用&#xff0c;同样许许多多的成果也在这次比赛中…

python教程输入_python怎么输入一个集合

set()函数创建一个无序不重复元素集&#xff0c;可进行关系测试&#xff0c;删除重复数据&#xff0c;还可以计算交集、差集、并集等。 set 语法&#xff1a; class set([iterable]) 参数说明&#xff1a; iterable -- 可迭代对象对象&#xff1b; 返回值&#xff1a; 返回新的…

来了就不会空着手回去.

如果您需要帮助,可以到我的"文章"去看看,也许对您有帮助....以动手实践为荣 , 以只看不练为耻;以打印日志为荣 , 以单步跟踪为耻;以空格缩进为荣 , 以制表缩进为耻;以单元测试为荣 , 以人工测试为耻;以模块复用为荣 , 以复制粘贴为耻;以多态应用为荣 , 以分支判断为耻…

LeetCode 第 23 场双周赛(970/2044,前47.5%)

文章目录1. 比赛结果2. 题目1. LeetCode 5360. 统计最大组的数目 easy2. LeetCode 5362. 构造 K 个回文字符串 medium3. LeetCode 5361. 圆和矩形是否有重叠 medium4. LeetCode 5363. 做菜顺序 hard1. 比赛结果 做出来了 1、3 两题&#xff0c;继续加油&#xff01; 第二道字符…

杀疯了…4个月发表论文的实操手册来了!

科研的本质&#xff1a;解决问题&#xff0c;创造新事物(新问题、新方法、新发现、新理论)科研论文的关键的体现在于将所得结果详实记录并进行科学分析后&#xff0c;总结成果写成论文由同行评议认可后发表。科研的完整过程那么如何在4-6个月内产出论文呢&#xff0c;这次我和一…

tkinter的可视化拖拽工具_可视化越做越丑?这五个高级图表效果实现流程分享给你...

今天我们来说一说数据可视化&#xff0c;想必很多人在入门数据分析之后&#xff0c;就会经常进行可视化的工作&#xff0c;所谓一图胜千言&#xff0c;图表用的好&#xff0c;真的是会事半功倍的。但现实情况下&#xff0c;很多人遇到的问题是&#xff1a;你做的图表太丑了&…