完整的数据工程师词汇
阿里安·达尔维什在 Unsplash 上拍摄的照片
数据工程
数据工程师必须知道的 10 个单词以内的概念
更新—建议由 乔治*阿克塞尔【弗尔兰】 和 妮莎 。最近更新—2020 年 7 月 15 日*
这些年来,我使用了许多这样的技术处理数据库、数据仓库、构建数据管道、使用 ETL 框架和处理大数据——甚至处理电子表格。所有这些技术都需要数周的学习和数月的实践来完善。
我认为用 10 个字来总结或介绍一项技术会非常有趣。我在这里列出了大约 150 个概念和技术,以及不超过 10 个字的解释。显然,这个列表受限于我的领域知识,但我认为如果你想在 2020 年成为一名数据工程师,这是一个很好的列表。
几乎所有的链接都指向该技术的主页或者一篇有趣的博客文章。使用名称中嵌入的链接。开始了。
A a
原子性——如果(多步任务中的)一步失败,则整个事务失败
Avro —紧凑、面向行、基于 JSON 的数据格式
阿兹卡班 — LinkedIn 的 Hadoop 作业批处理调度器
气流——Airbnb 基于 DAG 的可编程作业调度器。非常受欢迎的 Apache 项目
解析 函数 —对一组行进行运算的聚合函数
B b
大数据 —大到传统系统无法处理的程度
BI —从数据中获取最佳信息的技术和流程
BigQuery —谷歌的无服务器数据仓库,与 Redshift 和 Azure DW 竞争
BigTable —由 Google 提供的千兆级 NoSQL 数据库
C c
Cassandra —分布式 NoSQL 数据库因其列存储功能而广受欢迎
CTE —可以在 SQL 中通过名称引用的结果集缓存
缓存 —暂时存储数据以备将来再次使用
面向列的数据库 —在磁盘上连续存储列值的存储器
云作曲 —谷歌的气流实现
立方体 —多维数据;数据仓库中使用的术语
目录 —具有管理和搜索能力的元数据的组织
云功能 —谷歌的无服务器计算选项,如 AWS Lambda
D d
DynamoDB—Pb 级键值,AWS 文档数据库
德鲁伊 —分布式柱状数据存储
Drill —用于 Hadoop、NoSQL 数据库中非关系、JSON、嵌套数据的 SQL
分布式处理 —在不同的计算单元上拆分任务和处理,以获得更快的结果
DataFrame —关系数据库表,类似编程语言中的构造
DW —用于业务报告和分析的真实数据存储的单一来源
DAG —没有循环依赖关系的依赖关系图—在编排引擎中使用
数据流 —谷歌托管数据流水线解决方案
data prep—Google 的数据准备(清理、扯皮等。)解决方案
Dataproc —谷歌完全托管的 Spark/Hadoop 产品
仪表板 —用于跟踪绩效、KPI 等的可视化设置。
数据字典 —揭示数据源结构和用途的深度元数据
数据停机 —数据不完整、错误、丢失或不准确的时间
数据集市 —数据仓库的子集,通常用于特定的业务功能
维度 —数据的描述符或分类器
数据保管人 —万物数据的拥有者
DataVault —数据仓库设计方法论
DBT —基于 SQL 的数据流水线和工作流解决方案
Docker —OS 级虚拟化成型容器
E e
elastic search—事实上的全文搜索引擎
EMR—AWS 上的 MapReduce
丰富 —用更多数据丰富数据的过程
ELT —从源提取,加载到目的地并转换
ER 图 —可视化数据库实体间关系的图
麋鹿 —事实上的开源应用日志处理&监控解决方案
F f
水槽 —面向事件流数据的大规模数据流水线
平面文件——通常是文本或二进制文件
事实 —业务流程的度量,例如总销售额
故障转移 —从故障机器转移到正常工作的机器
G g
胶水—AWS 的大规模无服务器 ETL、数据流水线解决方案
金录 —单一来源的真相
H h
Hadoop —由 MapReduce、YARN 和 HDFS 组成的大数据处理框架
Hive —类似 SQL 的查询引擎,用于访问存储在 Hadoop 生态系统上的数据
HBase —运行在 Hadoop 之上的非关系型分布式数据库
HDFS — Hadoop 的分布式文件系统
我我
influx db—非常流行的时间序列数据库
摄取 —将数据插入系统,即数据摄取
集成 —汇集多个数据源
J j
JSON—互联网上事实上的数据传输格式
K K
卡夫卡 — LinkedIn 的分布式流媒体框架
Kinesis — AWS 的托管卡夫卡式流媒体服务
键值存储 —数据存储在类似字典或散列表的结构中
Kubernetes——谷歌的容器编排服务,爱称 K8s
L L
Looker —谷歌最新基于浏览器的商务智能工具收购
Luigi—Spotify 的作业编排引擎
λ——AWS 的 FaaS 发售——非常受欢迎
Logstash —记录 ELK 堆栈中的分析解决方案
谱系——从原始到加工、再加工到最终的旅程
米米
MySQL——非常流行的开源关系数据库
【MongoDB——非常流行的开源 NoSQL 数据库
MariaDB —原 MySQL 团队维护的 MySQL 的 fork
MapReduce —分布式计算的编程模型;Hadoop 的基石
MLlib — Spark 的机器学习库
元数据库 —流行的开源数据可视化解决方案
MDM —对关键业务数据进行单点管理
MDX—MS SQL Server 对 OLAP 查询的特性
测量 —参见**事实**
物化视图 —查询结果集作为数据库对象持久存储在磁盘上
MPP —大量处理器并行协同计算
元数据 —参见**目录**
N n
NoSQL——一组数据库技术,不仅仅是关系数据库
Neo4j —事实上的面向图形的数据库
Nomad —哈希公司的调度解决方案
接近实时——几乎实时,仅因物理限制而有延迟
规范化 —关系数据库中的组织概念
O o
ORC —高性能开源柱状存储格式
Oozie —基于 DAG 的 Hadoop 作业工作流调度程序
OLAP —没有事务的分析处理,通常用于数据仓库
OLTP —事务处理,具有 ACID 属性
ODS —运营数据存储,目的类似于 DW
P p
PostgreSQL —程序员最爱的开源数据库
PostGIS—PostgreSQL 中地理空间数据支持的扩展
Percona —提供 MySQL、MongoDB 等的分支。具有高级功能
Protobuf —
py Spark—Spark 上的 Python 包装器
Presto —脸书开源分布式查询引擎
Plotly —数据科学家& ML 工程师事实上的可视化库
流水线 —转换&传输数据的一系列过程&计算
分区 —将一张表拆分成多个部分,以查询更少的数据
熊猫—Python 中事实上的数据处理库
发布/订阅 —发布、订阅事件流处理的模型
Python —数据工程、数据科学的事实语言
问
查询引擎 —对数据集执行查询的软件
查询优化器 —优化器&重写 SQL 查询的数据库组件
查询计划 —查询引擎执行查询的执行计划
查询成本 —运行一个查询在处理方面的成本
R
RDS—AWS 的托管关系数据库服务
【RBAC】—基于工作角色和某人权限的系统访问
红移 —最受欢迎的托管、Pb 级数据仓库解决方案
Redis —面向应用的流行缓存解决方案
Redash —用于基本报告和分析的出色可视化工具
复制 —制作数据库的冗余副本,用于故障转移、负载分配
—火花内主要加工构造。了解更多在这里。****
面向行的数据库——数据记录/行级数据连续存储在磁盘/内存中
S s
S3 —最受欢迎的云存储服务,由 AWS 提供
SQL — 数据说的语言
Sqoop —与 Hadoop 之间的批量数据传输
爽快 —谷歌的压缩器/解压器
Spark —事实上的 SQL 支持的大数据处理引擎
风暴 —开源、实时计算引擎
超集 — Airbnb 基于网络的数据可视化& BI 工具,孵化于 Apache
分片 —在多台机器上拆分和存储一个数据库
存储引擎 —数据库的数据存储操作层
星型模式 —流行的数据仓库设计方法论。在这里阅读更多
雪花模式 —流行的数据仓库设计方法论。在这里阅读更多
SCD —随时间缓慢变化的数据类别值,如居住城市
单一真实来源 —被认为反映业务真实情况的数据源
结构化数据 —遵循某种预定义模式或格式的数据
半结构化数据 —不遵循正式结构,但仍包含其他标记
SRE——谷歌对可靠性工程师 DevOps 的重塑
T t
terra form——哈希公司事实上的基础设施即代码产品
U u
非结构化数据 —没有模式或预定义结构的数据
V v
Vertica——相当流行的数据仓储 so
VoltDB —具有序列化事务的内存数据库
金库 —哈希公司的秘密经理
视图—由 SQL 查询表示的未持久化的数据库对象
W w
窗口函数 —与当前行相关的多行 SQL 计算
X x
这里什么都没有。或许有。
Y y
YARN—Hadoop 生态系统的资源管理器(用于 MapReduce 和 Spark)
Z z
完整的数据科学项目:业务理解
完整的数据科学项目
根据全球管理挑战预测在证券交易所上市的生产公司订单数量的项目。
这是数据科学项目系列的第一篇文章。我想介绍一个机器学习世界的指南。我将描述基本的理论假设以及实际的解决方案。无论你是一个初学者,你只是对人工智能的主题感兴趣,还是你已经是一名数据科学家,我认为我的文章将会影响到你们每个人,并激励你们继续工作。根据跨行业数据挖掘标准流程 :
1 的方法,每篇文章都被划分为数据科学流程阶段。业务理解 —你在这里
2。数据理解
3。数据准备
4。造型
5。评价
6。部署
数据科学项目生命周期,图片由作者提供,灵感来自来源
数据挖掘的跨行业标准流程没有任何硬性框架。这个过程是高效的、迭代的,当我们发现我们犯了错误或者没有考虑到某些事情时,我们总是可以回到前面的步骤。你会在 GitHub 上找到整个项目。
BATMAJA 团队和全球管理挑战徽标,图片由作者提供,GMC 徽标由来源提供,经作者许可编辑
该项目基于国际全球管理挑战竞赛,预测在证券交易所上市的生产公司的订单数量。我代表 BATMAJA 学生队,和他们一起进入了全国决赛。这是一个基于商业模拟的竞赛。这些团队被分成不同的小组,投资结果(即市场价值和支付的股息)最高的团队进入下一阶段。该公司在欧洲市场、北美自由贸易区和互联网上生产和销售 3 种不同的产品。所有的团队都是从同一个故事开始的。许多因素会影响这些市场的订单数量。
将业务理解作为数据科学项目生命周期的一个阶段,图片由作者提供,灵感来自来源
业务理解 —这个阶段包括对问题的非常精确的说明,以及评估目标实现情况的方法。
Problem➜模型➜解
我们的目标是创建一个问题模型,然后用它来寻找解决方案。模型应该足够精确,以使解决方案有意义,否则,我们会做太多的假设和近似,这将使解决方案远离真实和无意义。需要补充的是,模型并不等同于问题,而只是现实的一种表象。因此,模型应该足够精确以找到解决方案,并且应该足够通用以不包括不相关的变量[ 1 ]。问题的正确解决涉及到对问题的正确认识。真正的商业问题很少是显而易见的。因此,为了使解决方案被认为是可接受的,有必要对项目采用迭代方法,对各个阶段进行多次重复。数据科学家应该有创造力和领域知识来正确地表述问题。我们应该问自己问题,这将导致预期的价值。
~确切的商业目的是什么?
创造一个机器学习模型本身并不是目的。该模式应该为企业增加价值,创造新的利润或降低成本。如果有任何解决方案,应该核实这个问题目前是如何解决的。提出的问题可以公式化为一个或多个机器学习模型:分类、回归或其他[ 2 ]。最后,有必要决定将使用哪些指标来评估模型。该指标还允许您比较模型,并确定模型是欠拟合还是过拟合。好了,这不是过程的结束,还有一步。写下所有的假设并检查它们。这将允许您在设计的早期阶段就发现错误。
GMC 的基本规则,授权图像
让我们继续了解全球管理挑战。参赛队伍被分成小组,最多有 8 支队伍参赛。每个小组从相同的场景开始,这些是公司在前 5 个季度的活动报告。然后,团队根据他们公司的历史,决定公司下一季度的运营方式。做出决策后,每个团队都会收到一份报告,其结构与历史报告相同。在训练阶段团队做出 3 个决定,在每个后续阶段已经 5 个决定。在比赛的第第一阶段中,两支最佳队伍进入下一阶段。在比赛的第二阶段有 8 个小组和最佳小组来自每个小组进入全国决赛**。最佳队伍进入世界决赛。**
表格-你的决定,作者图片
让我们转到报告结构,团队以电子表格的形式收到报告。报告的第一部分包含根据团队决策在上个季度做出的决策,除非并非所有决策都是可能的,并且被系统纠正(标记为*)。团队在截止日期前在专用平台上做出决策。
工作表—资源和产品,按作者分类的图片
报告的下一部分涉及资源和产品,因此公司在工厂和销售部门的活动。右边是这些市场的产品销售信息。这里有一个预测订购产品数量的问题。如果公司生产了太多的产品,就需要储存这些产品,这就带来了成本,或者说是为生产那些未来才销售出去的产品买单。此外,这种情况会在未来造成进一步的问题,因为必须生产的产品比以前设想的要少。问题比较多,但是这样的情况降低了公司的营业利润。相反的例子是相对于订单数量而言,生产的产品太少。客户将不得不等待产品,这将导致公司形象的损失。
工作表—财务报表,按作者分类的图像
然后我们有财务报表,类似于上市公司的财务报表。在这一点上,我们看到了这种竞争的要求有多高,以及它与管理层做出的实际决策有多接近。决策必须结合生产、广告、销售和财务的共同利益。
工作表-按作者分组信息、图像
报告的最后一部分是集团的信息。我们会发现在这个虚构的世界里情况是怎样的,在群体里情况又是怎样的。关注我们竞争对手的行动,包括他们产品的价格,这很重要。只要额外付费,我们就可以收到关于每个球队的市场份额和广告的信息。我们已经有了一些竞争的基础。
按作者分类的业务理解类型、图像
这不是我第一次参加比赛,所以我有一种直觉(经验)订单数量取决于什么。此外,我的团队成员拥有经济、金融、管理和生产或证券交易所运作的领域知识。我们使用了组织者网站上的手册和国际博客中包含的信息,其中提出了解释变量。在下一篇文章中,我将介绍这个项目选择了哪些变量。一个现实的项目远不是一门课程的一部分,也不是 Kaggle 上的一场比赛。在这里,我们没有给定的变量,我们经常感觉自己好像是在雾里去目标。这很令人兴奋,这也是我热爱数据科学的原因。
下期 帖子 见!
参考
M. Michalewicz,Z. Michalewicz,基于难题的学习:批判性思维、数学和问题解决导论(2008),混合出版社
[ 2 ] F. Provost,T. Fawcett,商业数据科学(2013),O’Reilly,
[ 3 ] A. Geron,使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习(2017 年),O’Reilly Media。
Adam 优化完全指南
Adam 优化算法从定义到实现
拉斐尔·比斯卡尔迪在 Unsplash 上拍摄的照片
在 20 世纪 40 年代,数学规划是最优化的同义词。一个优化问题包括一个目标函数,通过从一组允许值【1】中选择输入值,该目标函数将被最大化或最小化。
如今,优化是人工智能中一个非常熟悉的术语。具体来说,在深度学习问题上。而深度学习问题最值得推荐的优化算法之一就是 亚当 。
免责声明:对神经网络优化的基本了解。如梯度下降和随机梯度下降是阅读前的首选。
在这篇文章中,我将强调以下几点:
- Adam 优化的定义
- 亚当之路
- 随机优化的 Adam 算法
- 亚当和其他优化者之间的视觉比较
- 履行
- 亚当的优点和缺点
- 结论和进一步阅读
- 参考
1.Adam 优化的定义
Adam 算法首先在 Diederik P. Kingma 和 Jimmy Ba 的论文 Adam:一种随机优化方法【2】中介绍。Adam 被定义为“一种高效随机优化的方法,其中只需要一阶梯度,几乎不需要内存”[2]。好,让我们把这个定义分解成两部分。
首先,随机优化是在随机性存在的情况下,优化一个目标函数的过程。为了更好地理解这一点,让我们考虑随机梯度下降(SGD)。当我们有很多数据和参数时,SGD 是一个很好的优化器。因为在每一步,SGD 都从数据(小批量)的随机子集计算梯度的估计值。不像梯度下降在每一步都考虑整个数据集。
与 GD 相比,SGD 导致许多振荡。然而,SGD 要快得多,因为它不会遍历整个批处理(来源: deeplearning.ai )
第二,Adam 只需要一阶梯度。也就是说,亚当只需要参数的一阶导数。
现在,算法的名字亚当来源于自适应矩估计。随着我们对算法的研究,这一点将变得显而易见。
2.亚当之路
Adam 基于并结合了以前算法的优点。为了理解 Adam 算法,我们需要快速了解之前算法的背景。
我。带动量的新币
物理学中的动量是运动中的物体,比如一个球沿着斜坡加速下降。因此,带动量的 SGD【3】结合了之前更新步骤的梯度,以加速梯度下降**。这是通过在相关方向上采取小而直接的步骤来实现的。**
SGD 通过计算一个*的梯度移动平均值来实现,然后用它来更新你的参数*****【权重,偏差】。**********
计算指数加权平均值(移动平均值),然后更新参数
- 贝塔项( 𝛽 )控制着均线。β的值是[0,1],一个常见的值是𝛽 = 0.9,这意味着我们对最后 10 次迭代的梯度进行平均,旧的梯度被丢弃或者被遗忘。因此,较大的β值(比如𝛽 = 0.98)意味着我们在更多的梯度上求平均值。
- Alpha ( α )是决定每次迭代步长的学习率。
左 : SGD,右:带动量的 SGD(来源:动量和学习率适应)
二。相关工作(AdaGrad 和 RMSProp)
好的,在我们讨论亚当之前,有两个算法需要了解。 AdaGrad (自适应梯度算法)【4】和 RMSProp (均方根传播)【5】都是 SGD 的扩展。这两种算法与 Adam 有一些相似之处。事实上,亚当结合了两种算法的优点。
三世。自适应学习率
AdaGrad 和 RMSProp 也都是自适应梯度下降算法。意思是,对于参数 (w,b)中的每一个,学习率 (α) 被适配。简而言之,学习率是按参数来维持的。**
为了更好地说明这一点,下面是对 AdaGrad 和 RMSProp 的解释:
- 阿达格勒
阿达格拉德的每参数学习率帮助增加稀疏参数的学习率**。因此, AdaGrad 适用于稀疏梯度,例如在自然语言处理和图像识别应用中【4】。******
- RMSProp
RMSProp 是由 Tielemen 和 Hinton 提出来加速小批量学习的。在 RMSProp 中,学习率基于 最近梯度的幅度的移动平均值来调整 。
也就是说,RMSProp 保持最近梯度平方的移动平均值,用(v)表示。因此,给予最近的梯度更多的权重。
这里,术语β(𝛽)被引入作为遗忘因子(就像在具有动量的 SGD 中一样)。**
计算最近梯度平方的移动平均值
简而言之,在更新 θ (比如 w 或 b )时,将 θ 的前一个值的梯度除以该参数的最近梯度的平方的移动平均值,然后乘以 α**
某些参数的更新步骤 θ
此外,RMSProp 在大的和冗余的数据集(例如噪声数据)上工作良好[5]。
*术语( 𝜖 ) 用于数值稳定性(避免被零除)。
以下是我们目前所学内容的视觉对比:
围绕鞍点的不同优化器(来源: Imgur 亚历克·拉德福德
在上面的 gif 中,你可以看到动量在找到正确的路径之前四处探索。至于 SGD,AdaGrad,和 RMSProp,都是走的差不多的路,但是 AdaGrad 和 RMSProp 显然更快。
3.随机优化的 Adam 算法
好了,现在我们已经得到了算法所需的所有部分。
正如吴恩达所解释的,亚当:自适应力矩估计是动量和 RMSProp 的简单组合。
亚当算法(来源:亚当:随机优化的方法[2])
下面是优化目标函数 f(θ) 的算法,参数 θ (权重和偏差)。
Adam 包括超参数: α ,𝛽 1 (来自动量),𝛽 2 (来自 RMSProp)。
初始化:
- m = 0,这是第一个力矩矢量,按动量处理
- v = 0,这是第二个力矩矢量,在 RMSProp 中处理
- t:0
在迭代 t 时:
- 更新 t,t := t + 1
- 得到 g 相对于 t 的梯度/导数,这里的 g 相当于T25【分别为 dw 和 db**
- 更新第一时刻 mt
- 更新二阶矩 vt
分别更新 mt 和 vt
- 计算偏差修正后的 mt ( 偏差修正后的对移动平均值给出了更好的估计)
- 计算偏差校正后的 v t
分别为偏差校正的 mt 和 vt
- 更新参数θ
更新参数
****就这样!循环将继续,直到 Adam 收敛到一个解。
4.优化器之间的视觉比较
识别前面提到的优化算法之间的差异的更好的方法是查看它们的性能的视觉比较。
不同优化者的培训成本比较[2]
上图来自亚当的论文。它展示了超过 45 个时期的训练成本,你可以看到 CNN 的 Adam 比 AdaGrad 收敛得更快。也许值得一提的是,AdaGrad 对应于一个版本的 Adam,其超参数(α, 𝛽1,𝛽2 )为特定值[2]。为了避免混淆,我决定从这个帖子中删除 AdaGrad 的数学解释,但是如果你想了解更多,这里有 mxnet 的一个简单解释。
Gif 作者使用【7】
在上面的 gif 中,你可以看到亚当和 RMSProp 以相似的速度收敛,而阿达格拉德似乎在努力收敛。
Gif 作者使用【7】
同时,在这张 gif 图中,你可以用动量将 Adam 和 SGD 收敛到一个解。而 SGD、AdaGrad 和 RMSProp 似乎陷入了局部最小值。
5.履行
在这里,我将展示将 Adam 合并到您的模型中的三种不同方法,分别是 TensorFlow、PyTorch 和 NumPy 实现。
-
仅用 NumPy 实现:
这个实现可能不太实用,但它会让您更好地理解 Adam 算法。
但正如你所猜测的,代码相当长,所以为了更好地查看,给出了要点。
6.亚当的优点和缺点
与其他算法相比,Adam 是最好的优化器之一,但它也不是完美的。所以,下面是亚当的一些优点和缺点。
优势:
- 可以处理噪声数据集上的稀疏梯度。
- 默认的超参数值在大多数问题上都做得很好。
- 计算效率高。
- 需要很少的内存,因此内存效率高。
- 适用于大型数据集。
缺点:
- Adam 在某些领域没有收敛到最优解(这是 AMSGrad 的动机)。
- Adam 可能会遇到体重下降的问题(这在 AdamW 中有所论述)。
- 最近的优化算法已经被证明更快更好[6]。
7.结论和进一步阅读
这就是 Adam 的全部内容:自适应矩估计!
Adam 是 SGD 的扩展,它结合了 AdaGrad 和 RMSProp 的优点。Adam 也是一种自适应梯度下降算法,因此它保持每个参数的学习速率。并且它跟踪梯度的第一和第二时刻的移动平均值。因此,使用第一和第二矩,Adam 可以给出参数更新的未缩放的直接估计*。最后,尽管出现了更新的优化算法,Adam(和 SGD)仍然是一个稳定的优化器。*****
进一步阅读(和观看)的绝佳资源:
- 梯度的定义【Denis Auroux 教授(麻省理工学院)
- 带有动量的随机梯度下降作者 Vitaly Bushaev
- 深度学习的 Adam 优化算法简介作者 Jason Brownlee
- 吴恩达(deeplearning.ai)的深度学习专业化,也可以在 YouTube 上找到
- 亚当——深度学习优化的最新趋势维塔利·布沙耶夫
8.参考
- 斯蒂芬·j·赖特,优化 (2016),大英百科全书
- Diederik P. Kingma,Jimmy Ba, Adam:一种随机优化方法 (2015),arxiv
- 通过错误传播学习内部表征 (1986),鲁梅尔哈特,辛顿和威廉姆斯,美国计算机学会
- 杜奇等人,在线学习和随机优化的自适应次梯度方法 (2011),斯坦福
- Geoffrey Hinton 与 Nitish Srivastava Kevin Swersky,用于机器学习的神经网络(讲座 6) (2012),UToronto 和 Coursera
- 陈志强,最近梯度下降算法的最新概述 (2020),GitHub
- kuroitu S,优化方法比较 (2020),Qiita
在生产中构建和部署 Tweet Generator 应用程序的完整指南
学习使用代码从零开始构建一个 Tweet Generator 应用程序,从 Twitter 下载数据,在 Google Colab 上训练 GPT-2 模型,并在 AWS 上部署
🇨🇭·克劳迪奥·施瓦茨| @purzlbaum 在 Unsplash 上拍摄的照片
快速链接
app:【http://botbaby.in/】T4GitHub:https://github.com/nikhilno1/bot-baby
目录:
背景和目标
作为一个痴迷于数据分析的 twitter 用户,我一直想开发应用程序来分析 twitter 数据。我关心的是社交媒体话语演变的方式,尤其是。在推特上。假新闻、钓鱼、仇恨信息、虚假趋势、机器人等的扩散令人担忧,我总是有这种冲动去做些什么。
我也一直希望获得现实世界的工作经验,我相信这对我的下一份工作会有帮助。在我一年的职业生涯中期,我还有 3 个月的休息时间。由于时间不多(因为我也在找工作),我想挑选一个不太关注 ML 算法的问题,但可以让我花足够的时间学习大规模部署 ML 生产模型。
我决定开始为左翼(LW)和右翼(RW)的印度推特建立一个推特生成器应用程序。该应用背后的想法是突出两个阵营的两极分化和使用的语言。在我看来,以此为起点的好处是:
- 允许我建立一个下载/传输 twitter 数据的框架。
- 开发一个语言模型,我可以稍后用于其他下游任务。
- ML 模型培训允许我在大约一个月内建立完整的应用程序。
- 完成 MLOps 生命周期,包括数据和模型的版本控制。
- 使用 Elasticsearch 添加搜索功能,以获得其他有趣的见解。
- 建立解决其他问题(假新闻/趋势、机器人、仇恨信息等)的基础
有了明确的目标后,我开始着手工作,用了大约 3 周的时间完成了这个应用。
现在让我们来看看所有的细节。
大局
这是我们将涉及的所有构建模块的快速快照。
构建数据集
为了生成 LW & RW tweets,我需要两个语言模型,它们分别在自己的数据集上进行训练。在这种情况下,数据集是来自两个阵营的人的推文。
现在获得一份 LW & RW 帐户的列表可能有点困难,因为这些信息不会在任何地方公开。每个人都认为自己是中间派。😃
起初我想建立某种社交图或聚类算法,但后来我发现我不需要做任何复杂的事情。以下是我最后做的事情:
- 我从少数几个经常被贴上 LW 或 RW 标签的客户开始。
- 我利用了 Twitter 自己的推荐引擎,即“与 X 相似”的功能来寻找更多像他们一样的句柄。
- 通过这个,我为每一方建立了一个 35-40 名用户的列表,我称他们为领导者。
- 然后我下载了所有领导人的追随者名单。
- 我合并了关注者列表,并按频率排序。
- 这个想法是,任何追随大多数“领导者”的人都很可能属于同一个阵营。
- 通过这种方式,我获得了双方排名前 15 万的 twitter 账户列表,并删除了两个列表中的共同账户。
- 然后,我会下载所有这些用户的推文,这些推文将成为我的数据集。
从 twitter 上下载数据是一项痛苦的工作,因为存在各种速率限制。我不想冒应用程序被阻塞的风险,创建一大堆节点并下载。所以我公平地使用单个节点来下载数据。
不幸的是,当我开始构建数据集时,我并不知道 twint。我知道了 tweepy ,后来又知道了 GetOldTweets3 图书馆。由于这两个一起满足了我的要求,我与它滚动。但如果让我再来一次,我最有可能选择 twint 。
注:Tweepy vs GetOldTweets3
Tweepy: 7 天,每 15 分钟窗口 18000 条推文。3200 条最近的推文,每条推文都有丰富的信息。
GetOldTweets3:没有授权,信息更少,获取旧的推文
下载推文数据的步骤:
- 使用 *tweepy,*我首先下载了所有的追随者 id。获得关注者 id 而不是用户名的好处是速度提高了 15 倍。id 的速率限制是 45000,而用户名的速率限制是 3000。
- 一旦我有了所有的追随者 id,我就把它们合并,按降序排列,最后删除重复。
- 然后我使用 twitter 的 HTTP GET 请求将 id 转换成用户名,这个请求没有任何速率限制。这一步是必需的,因为 GetOldTweets3 只对用户名有效,对 id 无效。
- 最后,我使用 GetOldTweets3 为每个用户下载推文,时间可以追溯到 2014 年。为什么是 2014 年?那是选举年,许多人在那段时间开始活跃在 twitter 上。
- 在下载了足够的数据后,我执行文本预处理,以删除超链接、非英语字符(因为我的语言模型只理解英语)和极短的推文。我将所有这些推文收集在一个文本文件中(LW 和 RW 分开),这给了我最终的训练数据集。
模型训练(在 Google Colab 上)
当我开始开发这个应用程序时,我首先从零开始训练自己的语言模型。我在谷歌云上的 TPU 训练了一个 GPT-2 模型。但是结果并不像 Max Woolf 的笔记本那样吸引人。它开箱即用,效果极佳,所以我坚持使用它。为了减轻训练的痛苦,我甚至注册了 Colab Pro 订阅,这太便宜了。在 TPU 上进行一天的培训,我花了 100 多澳元,但 Colab Pro 每月花费我 10 美元。我鼓励每个人利用它。它给你更高的超时和内存。
我培训用的笔记本在这里。这与马克斯的原作十分相似。我用的是 GPT-2 的 355 米模型。根据我的数据集的大小,我训练了 2000 到 6000 步,直到我看到平均损失下降。对于我的大约 300 MB(每边)的训练数据集,我训练了 6000 步。
训练完成后,大约需要一个小时,模型输出一堆文件,很好地打包在一个归档文件中,您可以将它复制到 Google Drive 进行进一步分发。
在 AWS 上部署
我最初的计划是在谷歌新发布的 AI 平台管道上做生产部署。它看起来就像是一个全面的产品。然而,当我偶然看到这个博客,它提供了在 AWS 上部署的详细说明,我想为什么我不先这样做。当你独自工作时,获得经常性的激励是很重要的。没有比尽早发布你的应用更好的激励了。所以我决定首先在 AWS 上部署它,然后再考虑在人工智能平台管道上通过适当的工作流程大规模部署它。
正如在的博客中所解释的,我们不能完全没有服务器,因为每个型号都接近 1.5GB,所以我需要至少 3 GB 的内存,仅用于这些型号。另外,我需要进行批量推理,为此我需要一个 GPU 实例。
以下是当前部署架构的样子:
主持:
该网站是静态托管在亚马逊 S3,这是一个真正的廉价和快速的方式把你的网站推向世界。
API 网关:
这将创建一个 API 端点,它将接收来自前端应用程序的传入 HTTP 请求,并调用已配置的 Lambda 函数。
步骤 1)创建一个 API 端点
步骤 2)创建路线
步骤 3)配置 CORS
步骤 4)为 Lambda 函数配置更高的超时
任何集成的默认超时是 3 秒,因此如果您需要进行任何需要更长时间的推理,那么您需要相应地增加这个超时。
λ函数:
Lambda 函数从 API 网关接收 HTTP GET 请求,并执行以下操作:
- 检查提示是否已经存在于 DynamoDB 中。如果是,那么读取记录并返回响应。此操作需要几毫秒才能完成。
- 如果是新的提示,那么将请求添加到 SQS FIFO 队列中,并启动 EC2 g4dn.xlarge 实例。
- 一旦实例启动,继续轮询 DynamoDB 以检查是否有新的提示可供读取。在这种情况下,它读取新添加的记录并将响应返回给 API 网关。
- Lambda 函数在返回响应之前做了一个额外的步骤。它选择生成的 tweets 中的大多数情绪,并只返回这些情绪。例如,如果数据库返回 10 条推文,其中 7 条是正面的,2 条是负面的,1 条是中性的。那么 lambda 函数将返回 7 条正面推文,因为这表明了大多数人的观点。请记住,语言生成本质上是概率性的,因此显示多数输出是有意义的。
像在 API 端点上一样,我们也需要增加 Lambda 上的超时。
λ超时配置
提示:利用 TestEvent 来测试你的 Lambda 函数。您可以按如下方式配置测试事件:
{
“queryStringParameters”: {
“model”: “left”,
“prompt”: “Test prompt”,
“num_samples”: “20”,
“length”: “80”,
“temperature”: “0.7”,
“top_p”: “0.9”,
“top_k”: “40”
}
}
简单队列服务(SQS):
为了序列化传入的 HTTP 请求,我使用了 SQS FIFO 队列。Lambda 函数将传入的请求排入该队列,并启动 EC2 GPU 实例。GPU 实例在启动时从该队列中读取数据,并逐个运行推理。这允许我用一个 EC2 实例以高性价比的方式处理并发请求。
SQS 先进先出队列
EC2 GPU 实例:
对于推理,我使用最近推出的高性价比的 G4 实例(准确地说是 g4dn.xlarge)。G4 实例以每小时 0.58 美元的价格为按需主机提供最新一代的英伟达 T4 GPU。使用 spot 实例可以进一步降低成本。在使用 G4 实例之前,您需要提出一个服务请求来增加 vCPU 限制。
在原始代码中,作者在 EC2 实例上启动了一个 python 脚本。然而,这意味着每次推理都需要额外的 15 秒钟来将模型加载到内存中。我修改了它,改为运行一个网络应用程序(基于 Starlette)。下面是 EC2 实例从头到尾发生的所有事情。
- Lambda 函数触发 EC2 实例的启动
- 两个单独的 web 应用程序作为系统启动的一部分(作为 systemd 服务)运行(每个型号一个),并开始监听端口 8081 和 8082。
- 另一个服务在启动时运行,监视 SQS 队列。每当有新请求进来时,该服务都会处理它,并使用 CURL 调用适当的 GET 请求,这会触发后端 web 应用程序上的推理。
- 后端 web 应用程序收到请求后,调用 GPT2 API 批量生成 20 条 tweets。
- 然后,它会进行清理,保留最合理的推文。它首先删除不必要的字符,如换行符和引号。然后,它使用 NLTK 的 sent_tokenize()函数删除最后一个可能不完整的句子。有时,生成的推文包含重复的单词或句子序列,因此它会删除唯一单词数量较少的推文。
- 然后,网络应用程序使用 AWS 领悟服务对剩余的推文进行情感分析。它保留了得分最高的前 10 条推文。这个想法是,在任何类别(正面、负面或中性)中得分高的推文往往比得分分布更均匀的推文更连贯。
- 然后,前 10 条推文按照排序顺序存储在 DynamoDB 中。
- 如果超过 15 分钟没有收到新的请求,那么 EC2 实例将被关闭以节省成本。
- 作为关闭过程的一部分,会调用一个脚本,该脚本会将新添加的提示更新到 S3 上的一个文件中。这用于在 UI 上提供自动完成功能。
前端
前端使用 HTML、CSS & Javascript 开发。为了复制 twitter 的用户界面,安迪·勒沃伦兹的让我们来构建:利用顺风 CSS——Tweet就像天赐之物。它提供了显示单条推文的基本 UI,稍后我可以扩展它(在马南的帮助下)来显示推文的并排视图。
如前所述,该网站静态托管在亚马逊 S3。
自动完成: 考虑到新提示的推理需要 30-60 秒,而如果用户输入一个现有的提示,那么在大约 250 毫秒内就会得到结果,鼓励用户更多地使用现有的提示是有意义的。因此,添加自动完成功能变得很重要,这样用户可以从列表中选择一个,而不是输入他/她自己的。
在实现一些极其简单的东西之前,我考虑了一些复杂的解决方案(使用 Elasticsearch 或 AWS 云搜索)。
由于我的网站位于 S3,我修改了我的前端代码,以读取来自 S3 的“提示”文件。该文件包含所有现有提示的列表。在用户对新提示进行推理之后,每当实例关闭时,S3 上的提示文件就会更新。有一个小的滞后,但除此之外,这个简单的解决方案工作得非常好。
分析学
我想获得使用统计数据,并为用户提供一个选项来给出他们对应用程序的反馈。
这些是我为此添加的一些东西:
- 向 DynamoDB 添加了一个“已访问”计数器,这样每次读取记录都会触发该计数器的(原子)增量。我可以用它来显示流行的查询。
- 在 API 端点上启用了“详细路由度量”收集。我可以用它来获得更多关于 AWS 内的访问者数量,位置等细节。
- 与谷歌分析集成,以获得更详细的使用统计数据
- 与 mopinion 整合以获得用户反馈。
对于(3)和(4),您只需要将它们提供的几行代码复制到您的 HTML 中。
结果
我尝试了几个温度、top_p 和 top_n 的设置,最终选择了这些能给出最佳结果的设置。这些也是推荐的默认值。
“temperature”: “0.7”,
“top_p”: “0.9”,
“top_k”: “40”
其中,
温度:温度越高,文本越疯狂
top_k :将生成的猜测限制为前 k 个猜测
top_p :核采样:将生成的猜测限制为累积概率
以下是一些结果:
挑战
这一部分列出了我一路上面临的一些挑战。希望它能帮助面临类似问题的人。
(注:我没有做好记录我所面临的所有问题/挑战的工作,所以这些是凭记忆提供的。我会根据我的记忆不断补充。)
-
用命令
nltk.download(‘punkt’)
安装 NLTK 数据 -
app.py
代码取自GPT-2-云运行。我在安装 ujson 包时遇到了构建错误。这个错误是由于缺少g++
库造成的。
运行 -
安装使用 GPU 的正确 tensorflow 1.x 版本时出现问题。我认为正确的安装方法是运行
pip install tensorflow-gpu==1.15
-
SSM 代理存在没有正确权限/策略的问题。始终验证 SSM 代理是否工作正常,并且能够连接到可用的实例。确保您已经在 AWS 控制台上完成了“系统管理器快速设置”。
-
我遇到了一个问题,推理发生在 CPU 上,而不是 GPU 上。这被证明是环境变量问题。LD_LIBRARY_PATH 设置不正确。过了一会儿,我注意到系统日志中有一个错误。参考 gp T2-app-[型号]。正确设置它的服务文件。
-
如果遇到任何问题,请始终查看/var/log/syslog。大多数情况下,错误会被记录在那里。
-
有时,由于可用性区域中的容量不足,GPU 实例将不会运行。您需要尝试不同的 AZ。
下一步怎么样
这个应用程序是为了让我尝试使用 twitter 数据并学习 MLOps。所以我肯定想转移到谷歌的 AI 平台管道,进行更完整的 ML 工作流部署。我还希望有一个易于使用的框架来下载和存储 twitter 数据,所以我将探索 twint 。一旦我有了这个想法,就可以更容易地去想其他的想法了。如果你有任何关于 twitter 的想法/建议,请在下面评论让我知道。
从零开始构建深度学习聊天机器人的完整指南
实践教程
spaCy 用于实体提取,Keras 用于意图分类,等等!
在过去的一个月里,我想寻找一个包含整个数据科学端到端工作流的项目——从数据管道到深度学习,再到部署。它必须具有挑战性,但不是毫无意义的——它仍然必须是有用的东西。这需要一点构思和发散思维,但当制作个人助理的想法出现时,没多久我就选定了它。会话助手无处不在。甚至我所在的大学目前也在使用聊天机器人医生来跟踪其成员的健康状况,以此作为监控当前疫情的有效方式。这很有意义:聊天机器人更快,更容易交互,特别是对于我们只想快速响应的事情来说,非常有用。在这个时代,能够向机器人寻求帮助开始成为新的标准。我个人认为机器人是未来,因为它们让我们的生活变得更加容易。聊天机器人也是机器人流程自动化的关键组成部分。
现在我要介绍EVE bot,我的机器人旨在为 Twitter 上的苹果支持团队增强虚拟参与(见我在那里做的)。虽然这种方法是用来支持苹果产品的,但老实说,它可以应用到任何你能想到聊天机器人有用的领域。
这是我给 EVE 的演示视频。(这是我的 Github 回购这个项目)
演示片段—询问 EVE 如何更新我的 MacBook Pro。图片作者。
图片作者。
为了使演示简洁明了,它对我的工作进行了一个高层次的、不太技术性的概述。但是,如果您想了解我是如何做到的,这正是本文其余部分的目的!
我也希望这篇文章能为那些需要一些关于如何从头构建自己的机器人的结构的人提供指导——从某种意义上说,你只使用众所周知的通用软件包,如 Keras 和 spaCy,而不是专门为聊天机器人设计的大型 API,如 Rasa API。
EVE 是一个基于上下文的机器人,由深度学习提供支持。基于上下文的机器人是你很久以前可能见过的简单的、基于关键字的聊天机器人之上的一步(见:伊莱扎机器人)。虽然我确实有一些灵感,而且它确实与行业中的做法有相似之处,但我提供了一些方法,这些方法是我自己思考如何在 2020 年制作聊天机器人的。
我在这篇文章中展示的这种方法利用了与亚马逊这样的大公司的聊天机器人相同的逻辑,即他们的 Lex conversational AI 服务。
外面有什么?
在我进入技术工作之前,重要的是要知道你想以什么样的粒度来制作聊天机器人。聊天机器人就像煮意大利面条。你可以从生番茄开始,或者从别人已经为你做好的罐装番茄开始。相似之处还在于有许多不同的组件—您有:
- **框架:**你的机器人根据顾客的话语决定如何回应他们。您可以为您的框架使用更高级别的工具,如 DialogFlow(由 Google 提供)、 Amazon Lex 和 Rasa 。与我将在本文中展示的基于 Python 的工作相比,这些更高级别的 API 需要您做的工作更少,但是您可能对后台发生的事情没有信心。我的选择是 Tensorflow、spaCy 和 Python 的白盒方法。
- 对话管理:这是你的机器人的一部分,负责对话的状态和流程——在这里你可以提示用户你需要的信息等等。
- **部署接口:**你可以用 Messenger API 建立一个接口,你可以把它部署在 WhatsApp Business 上(收费),或者任何地方,比如你自己的网站或应用程序,如果你有的话。我在 Streamlit 上部署了我的工具,作为一个非常快速的演示工具。
我的聊天机器人框架的目标应该是什么?
好了,你已经决定做自己的框架了。现在告诉你怎么做。
你的目标是双重的——而这两个都很重要:
- 实体提取
- 意图分类
当开始制作一个新的机器人时,这正是你首先要解决的问题,因为它指导你想要收集或生成什么样的数据。我建议你从你的意图和实体的基本概念开始,然后在你越来越多地测试它的时候迭代地改进它。
实体提取
实体是预定义的名称、组织、时间表达式、数量和其他有意义的通用对象组的类别。
每个聊天机器人都有不同的应该被捕获的实体集合。对于一个披萨递送聊天机器人,您可能希望捕获不同类型的披萨作为一个实体和递送位置。在这种情况下,奶酪或意大利辣香肠可能是披萨实体,而厨师街可能是递送位置实体。在我的例子中,我创建了一个苹果支持机器人,所以我想捕捉用户正在使用的硬件和应用程序。
硬件实体“macbook pro”被标记。其他硬件可能包括 iPhone 和 iPads。图片作者。
捕捉到的应用程序实体“garageband”已被标记。其他应用实体可能包括 Apple Music 或 FaceTime。图片作者。
为了获得这些可视化,使用了 displaCy,这是 spaCy 用于命名实体识别的可视化工具(他们还有更多可视化工具用于其他事情,如依赖解析)。
意图分类
意图就是客户想要做的事情。
他们想问候你吗?他们是想和代表谈吗?如果你是机器人,他们会挑战你吗?他们在尝试更新吗?
意图分类仅仅意味着找出用户话语的用户意图。下面是我在 Eve bot 中想要捕捉的所有意图的列表,以及每个意图各自的用户话语示例,以帮助您理解每个意图是什么。
- **问候:**嗨!
- **信息:**你们现有的最薄的 MacBook 是什么?
- 忘记密码:我忘记了我的登录信息,你能帮我找回吗?
- 发言代表:请问我能和人类说话吗
- 挑战机器人:你是人类吗
- **更新:**我想将我的 MacBook Pro 更新到最新的操作系统
- **付款:**我昨天在百思买买的 iPhone X 被双倍收费
- **位置:**离我最近的苹果店在哪里?
- 电池:我的电池持续耗尽,一小时后就没电了
- 再见:谢谢伊芙,再见
意图和实体基本上是我们解读客户想要什么以及如何给客户一个好的答复的方式。我最初认为我只需要给出一个没有实体的答案的意图,但这导致了很多困难,因为你不能对你的客户做出细致的回应。如果没有多标签分类,也就是给一个用户输入分配多个类别标签(以准确性为代价),就很难得到个性化的响应。实体有助于使你的意图仅仅是意图,并根据用户的细节个性化用户体验。
有了这两个目标,我把我的过程归结为五个步骤,我将在这篇文章中逐一分解:
图片作者。
1.数据预处理
我做数据预处理的笔记本是这里。
我提到的第一步是数据预处理,但实际上这 5 个步骤并不是线性完成的,因为你将在整个聊天机器人创建过程中预处理你的数据。
但是,即使在数据预处理之前,您究竟从哪里获得数据呢?
这真的取决于你的聊天机器人的领域。
数据指南
- **你必须找到能最好地涵盖客户可能会问你的问题以及你想尽可能多地回答的数据。**数据应该包含你希望能够回答的所有意图。这可能是一项非常艰巨的任务,但是要知道你的数据不一定是完美的,它可以来自多个来源,只要它们在同一个通用域内。
- 对于每一个意图,你应该有相当数量的例子,这样你的机器人将能够了解该意图的性质。
- 如果你真的没有任何数据,就像我在我的下一个项目中想到的那样(它不是一个英语聊天机器人),我试图通过制作一个谷歌表单来解决这个问题,让人们向我的机器人提问。整个要点是获得最接近真人将要问你的机器人的问题的数据。
但回到 Eve bot,因为我正在制作一个 Twitter 苹果支持机器人,我从 Kaggle 上的客户支持推文中获得了我的数据。一旦获得了正确的数据集,就可以开始对其进行预处理。这个初始预处理步骤的目标是为我们进一步的数据生成和建模做好准备。
首先,我通过一些 Pandas merge 语句以入站和出站文本的格式获取数据。对于任何类型的客户数据,您都必须确保数据的格式能够区分客户对公司的话语(入站)和公司对客户的话语(出站)。保持足够的敏感,以这样一种方式争论数据,你的客户可能会问你一些问题。
不久之后,我应用了一个 NLP 预处理管道。包括哪些步骤取决于你的用例(比如你想要支持的语言,你想要你的机器人有多口语化,等等。).我的包括:
- 转换为小写
- 使用 NLTK 的 Tweet 标记器进行标记
- 删除标点符号和 URL 链接
- 纠正拼写错误(利维坦距离)
- 删除停用词
- 扩张收缩
- 用 spaCy 删除非英语推文
- 词汇化(您可以选择词干作为替代)
- 移除表情符号和数字(如果您的模型可以读取表情符号,并且如果您计划进行表情符号分析,您可以保留表情符号)
- 将每条推文的长度限制在 50(为了简洁)
我将所有这些步骤编译成一个名为tokenize
的函数。在每一个预处理步骤中,我可视化数据中每个记号的长度。我还提供了每一步的数据头,以便清楚地显示每一步正在进行的处理。
我的整个记号赋予器函数。
我从 106k Apple Suppourt inbound Tweets 开始。这是预处理这些数据之前我的令牌长度的直方图。
图片作者。
在第 10 步之后,我还剩下大约 76k 条推文。一般来说,像删除停用词这样的事情会使分布向左移动,因为我们在每个预处理步骤中的标记越来越少。
图片作者。
这里你可以看到这一步的结果。我让我的数据从左边的青色变为中间的已处理入站列。我还将出站数据放在右边,以防我需要查看 Apple 支持如何回复他们的查询,这将用于我实际回复客户的步骤(这称为自然语言生成)。
我的苹果头支持预处理前后的 Twitter 数据。图片作者。
最后,作为一个简短的 EDA,这里是我在数据集中的表情符号——可视化很有趣,但我最终没有将这些信息用于任何真正有用的东西。
我的数据集中的表情符号:大多数客户表现出负面情绪(愤怒和失望的表情符号排在第二位)。图片作者。
2.数据生成
我生成训练数据的完整脚本是这里的,但是如果你想要一步一步的解释,我这里还有一个笔记本。
*是的,你没看错——数据*一代。你可能会想:
为什么我们需要生成数据?为什么我们不能只使用在上一步中预处理过的数据呢?
这是一个很好的问题。答案是因为数据还没有被标注。而意图分类是一个有监督的学习问题。这意味着我们需要每个数据点的意图标签。
如果您已经有了一个包含您想要分类的所有意图的带标签的数据集,我们不需要这一步。但更多的时候,你不会有这些数据。这就是为什么我们需要做一些额外的工作来将意图标签添加到我们的数据集。这是一个相当复杂的过程,但我相信我们能做到。
我们的目标是:
在这一步,我们希望将推文分组,以代表一种意图,这样我们就可以给它们贴上标签。此外,对于我们的数据中没有表达的意图,我们要么被迫手动添加它们,要么在另一个数据集中找到它们。
例如,我的推文中没有任何一条推文问“你是机器人吗?”这实际上非常有意义,因为 Twitter 苹果支持是由真正的客户支持团队回答的,而不是聊天机器人。因此,在这些情况下,由于在我们的数据集中没有表达挑战机器人意图的文档,我在它自己的组中手动添加了这种意图的示例来表示这种意图。我将在第 4 步中详细解释我是如何做到这一点的。
因为我计划使用一个相当复杂的神经网络架构(双向 LSTM)来对我的意图进行分类,所以我需要为每个意图生成足够多的例子。我选择的数字是 1000——我为每个意图生成 1000 个示例(例如,1000 个问候示例,1000 个遇到更新问题的客户示例,等等)。).我将每一个意图都精确地定义为 1000 个例子,这样我就不用担心以后建模阶段的类不平衡了。一般来说,对于你自己的机器人,机器人越复杂,你需要的训练例子就越多。
嵌入技术
这就是如何发挥作用的地方,我们如何找到每个意图的 1000 个例子?首先,我们需要知道在我们的数据集中是否有 1000 个我们想要的意图的例子。为了做到这一点,我们需要一些推文之间的距离概念,如果两条推文被认为彼此“接近”,它们应该具有相同的意图。同样,两条相距“更远”的推文在含义上应该是非常不同的。
为此,我们使用一种称为 Doc2Vec 的编码方法。嵌入方法是将单词(或单词序列)转换成可以相互比较的数字表示的方法。我用 Streamlit 创建了一个训练数据生成器工具,将我的推文转换为 20D Doc2Vec 表示的数据,其中每个推文可以使用余弦相似性进行相互比较。
(左)Twitter 数据(右)Doc2Vec 20D 矢量化数据。图片作者。
下面的图表说明了 Doc2Vec 可以用来将相似的文档组合在一起。文档是一系列的标记,而标记是一系列的字符,它们被组合在一起作为一个有用的语义单元进行处理。对于这一数据生成步骤,我也用 gloVe 进行了试验,但是它们只在每个单词级别进行了矢量化,如果您想尝试另一种单词嵌入(也许它更适合您的领域),请确保它在文档级别进行了矢量化。
展示距离如何工作的玩具示例。图片作者。
在这个玩具示例中,我们将每一个话语转换为 3D 矢量(可以在每个短语下面的 3 个数字的粉色数组中看到)。这些 3D 向量中的每一个都是该文档的数字表示。例如,“Hi there”在数值上表示为[3.333,0.1125,-0.4869]。
当我们在这个玩具示例中比较 top 两条意思相似的推文时(两者都要求与代表交谈),我们得到的虚拟余弦相似度为 0.8。当我们比较底部两条不同含义的推文(一条是问候,一条是退场)时,我们得到-0.3。
履行
至于实现,我用的是 gensim 的 Doc2Vec。你必须训练它,这类似于你如何训练一个神经网络(使用历元)。
这就是问题所在。在训练 Doc2Vec 矢量器之前,提前了解您想要的意图是很重要的。一旦你知道了你想要什么样的意图,你就可以应用这个程序来获得你的前 N 组意思相似的推文:
- 简单地想出你在这个意图中能想到的最重要的关键词,然后把它作为一行附加到你的训练数据的末尾(所以对于问候,这一行可以是“嗨,你好,嘿”)。
- 您添加的代表各自意图的额外行将被矢量化,这是一个好消息,因为现在您可以用余弦相似性将其与其他每一行进行比较。
- 通过训练 Doc2Vec 矢量器进行矢量化,然后用额外的行来拟合您的数据。
- 您已经成功地使用关键字来表示一种意图,从这种表示中,您将找到与之相似的前 1000 条推文,以便使用 Gensim 的
model.docvecs.most_similar()
方法为该意图生成您的训练数据。
额外的行是 0-5,它们附加在我的 Tweets 训练数据的顶部——0 代表电池意图,1 代表支付意图,等等。图片作者。
请注意,在训练矢量器之前,我们必须将新的 intent 关键字表示附加到训练数据,因为 Gensim 的实现只能比较作为训练数据放入 Doc2Vec 矢量器的文档。此外,它只能访问每条 Tweet 的标签,所以我不得不在 Python 中做额外的工作,根据 Tweet 的内容找到它的标签。
一旦你生成了你的数据,确保你把它存储为两栏“话语”和“意图”。注意,话语被存储为一个标记化列表。这是你会经常遇到的事情,这没关系,因为你可以在任何时候用Series.apply(" ".join)
把它转换成字符串形式。
这就是培训数据格式应该的样子。图片作者。
您也可以在我的 Streamlit 应用程序的侧边栏上访问我的培训数据生成器工具,作为其中一个页面。图片作者。
我尝试了其他一些方法来添加意图标签
我想到要做的第一件事就是聚类。然而,在我尝试了 K-Means 之后,很明显聚类和无监督学习通常产生不好的结果。现实是,尽管它作为一种技术很好,但归根结底它仍然是一种算法。你不能指望算法按照你想要的方式对你的数据进行聚类。
t-SNE 可视化显示 K-Means 聚类失败,因为数据不在自然聚类中。图片作者。
我还尝试了像 gloVe 这样的单词级嵌入技术,但是对于这个数据生成步骤,我们需要文档级的东西,因为我们试图在话语之间进行比较,而不是在话语中的单词之间进行比较。
3.建模
意图分类
我的意图分类笔记本是这里的。
有了我们的数据标签,我们终于可以进入有趣的部分了——实际上是对意图进行分类!我建议你不要花太长时间试图事先得到完美的数据。试着以合理的速度达到这一步,这样你就可以先得到一个最小的可行产品。这个想法是首先得到一个结果作为基准,这样我们就可以迭代地改进数据。
有许多方法可以进行意图分类,例如 Rasa NLU 允许您使用许多不同的模型,如支持向量机(SVMs),但在这里,我将演示如何使用具有双向 LSTM 架构的神经网络进行分类。
我们试图将一个用户话语(它只是一个符号序列)映射到我们指定的 N 个意图之一。我们开始的数据应该只有一个话语和一个意向基础事实标签作为列。这个过程的顺序如下(关于实现,请查看 my Github 上提供的意图分类笔记本):
- 训练测试拆分(是否应该让总是先走,我的导师在我的脑海里钻过这一点)
- Keras 标记器
- 标签编码目标变量(意图)
- 初始化嵌入矩阵(我使用手套嵌入,因为它们有一个在 Twitter 数据上训练的特殊变体)
- 初始化模型架构
- 初始化模型回调(解决过度拟合的技术)
- 拟合模型并保存它
- 加载模型并保存输出(我推荐字典)
对于嵌入层**(步骤 4),需要记住一些事情:**
- 这些预先训练的嵌入本质上就是如何将进入模型的文本转换成数字表示。当您比较不同文档的数字表示的余弦相似性时,它们之间应该有有意义的距离(例如,“king”和“man”之间的余弦相似性应该比“king”和“women”更接近)。
- 选择适合聊天机器人领域的正确的预训练嵌入非常重要。如果你有一个基于 Twitter 的聊天机器人,你可能不希望在维基百科上训练嵌入。
- 我还建议您查看一下,您想要涵盖的所有词汇是否都在您预先训练的嵌入文件中。我检查了我的 gloVe Twitter 嵌入是否包含苹果特有的词,例如“macbook pro ”,幸运的是它包含了。
用 grep 检查“macbook”这个词是否在我的手套嵌入中(结果是!).图片作者。
对于模型架构**(步骤 5),需要记住一些事情:**
- 确保输出图层为 softmax(如果要进行多标签分类,则使用 sigmoid)。
- 确保输出图层的维数与要分类的意图数相同,否则会遇到形状问题。
- 如果您没有标记 encode,那么您对
model.predict()
使用可能会不准确,因为您输出的最终字典(其中的键是意图,值是表达意图的概率)不会被正确映射。 - 当您部署您的机器人时,您不应该重新运行模型。相反,我编写了一个脚本,从读取保存的模型文件开始,并从那里进行预测。
结果
结果是有希望的。损失收敛到一个低水平,我的模型对看不见的数据的准确率是 87%!
图片作者。
图片作者。
如果您将意图分类的输出可视化,这是话语“我的 iphone 电池停止工作了!”:
图片作者。
防止过度拟合
为了防止我的模型过度拟合,我还以 Keras 回调的形式设置了一些其他设置:
- 学习率调度——在学习率超过某个时期数后,减慢学习率
- 提前停止-一旦验证损失(或您选择的任何其他参数)达到某个阈值,就提前停止训练
最后,在我运行模型之后,我将它保存到一个 h5 文件中,这样我就可以在以后初始化它,而不需要使用模型检查点重新训练我的模型。代码如下:
*# Initializing checkpoint settings to view progress and save model*
filename = 'models/intent_classification_b.h5'
*# Learning rate scheduling*
*# This function keeps the initial learning rate for the first ten epochs*
*# and decreases it exponentially after that.*
**def** scheduler(epoch, lr):
**if** epoch < 10:
**return** lr
**else**:
**return** lr * tf.math.exp(-0.1)
lr_sched_checkpoint = tf.keras.callbacks.LearningRateScheduler(scheduler)
*# Early stopping*
early_stopping = tf.keras.callbacks.EarlyStopping(
monitor='val_loss', min_delta=0, patience=3, verbose=0, mode='auto',
baseline=**None**, restore_best_weights=**True**
)
*# This saves the best model*
checkpoint = ModelCheckpoint(filename, monitor='val_loss', verbose=1,
save_best_only=**True**, mode='min')
*# The model you get at the end of it is after 100 epochs, but that might not have been*
*# the weights most associated with validation accuracy*
*# Only save the weights when you model has the lowest val loss. Early stopping*
*# Fitting model with all the callbacks above*
hist = model.fit(padded_X_train, y_train, epochs = 20, batch_size = 32,
validation_data = (padded_X_val, y_val),
callbacks = [checkpoint, lr_sched_checkpoint, early_stopping])
实体提取
这是我完整的关于实体提取的笔记本。
对于 EVE bot,目标是提取符合硬件或应用程序类别的特定于苹果的关键词。像意图分类一样,有许多方法可以做到这一点——根据上下文的不同,每种方法都有其优点。Rasa NLU 使用条件随机场(CRF)模型,但为此我将使用 spaCy 的随机梯度下降(SGD)实现。
第一步是创建一个字典,存储您认为与您的聊天机器人相关的实体类别。然后您会看到 spaCy 是否默认拥有它们。很可能他们不会。因此,在这种情况下,您必须训练自己的自定义空间命名实体识别(NER)模型。对于苹果产品来说,实体是客户正在使用的硬件和应用程序是有意义的。您希望对询问 iPhone 和询问 Macbook Pro 的客户做出不同的回应。
{'hardware': ['macbook pro',
'iphone',
'iphones',
'mac',
'ipad',
'watch',
'TV',
'airpods'],
'apps': ['app store',
'garageband',
'books',
'calendar',
'podcasts',
'notes',
'icloud',
'music',
'messages',
'facetime',
'catalina',
'maverick']}
一旦在字典中存储了实体关键字,您还应该有一个基本上只在句子中使用这些关键字的数据集。幸运的是,我已经有了一个我一直在使用的来自 Kaggle 的大型 Twitter 数据集。如果您输入这些示例并指定哪些单词是实体关键字,您实际上就有了一个带标签的数据集,spaCy 可以了解这些单词在句子中使用的上下文。
为了标注数据集,您需要将数据转换为 spaCy 格式。这是一个样本,我的训练数据应该看起来像是能够被送入 spaCy,用于使用随机梯度下降(SGD)训练您的自定义 NER 模型。我们制作了一个 offsetter,并使用了 spaCy 的 PhraseMatcher,所有这些都是为了更容易地将其转换成这种格式。
TRAIN_DATA = [
('what is the price of polo?', {'entities': [(21, 25, 'PrdName')]}),
('what is the price of ball?', {'entities': [(21, 25, 'PrdName')]}),
('what is the price of jegging?', {'entities': [(21, 28, 'PrdName')]}),
('what is the price of t-shirt?', {'entities': [(21, 28, 'PrdName')]})
]
抵消器
*# Utility function - converts the output of the PhraseMatcher to something usable in training*
**def** offsetter(lbl, doc, matchitem):
*''' Converts word position to string position '''*
one = len(str(doc[0:matchitem[1]]))
subdoc = doc[matchitem[1]:matchitem[2]]
two = one + len(str(subdoc))
*# This function was misaligned by a factor of one character, not sure why, but this is my solution*
**if** one != 0:
one += 1
two += 1
**return** (one, two, lbl)# Example
# offsetter(‘HARDWARE’, nlp(‘hmm macbooks are great’),(2271554079456360229, 1, 2)) -> (4, 12, ‘HARDWARE’)
我在更一般的函数中使用这个函数来“指定”一行,这个函数将原始行数据作为输入,并将其转换为 spaCy 可以读取的标记版本。我不得不修改索引定位,在开始时移动一个索引,我不知道为什么,但它工作得很好。
然后我还创建了一个函数train_spacy
来输入 spaCy,它使用nlp.update
方法来训练我的 NER 模型。它对任意数量的 20 个时期进行训练,其中在每个时期,训练样本被预先打乱。尽量不要选择太高的历元数,否则模型可能会开始“忘记”它在早期阶段已经学习过的模式。因为你是用随机梯度下降来最小化损失,你可以想象你在不同时期的损失。
每次迭代都丢失硬件实体模型。图片作者。
每次迭代都丢失应用程序实体模型。图片作者。
我没有找到一种方法将我训练的所有不同的模型组合到一个 spaCy pipe 对象中,所以我将两个单独的模型序列化到两个 pickle 文件中。同样,这是我上面演示的显示可视化——它成功地将 macbook pro 和 garageband 标记到正确的实体桶中。
硬件实体“macbook pro”被标记。其他硬件可能包括 iPhone 和 iPads。图片作者。
捕捉到的应用程序实体“garageband”已被标记。其他应用实体可能包括 Apple Music 或 FaceTime。图片作者。
从您保存的 pickle 文件中,您可以通过循环 doc 对象的 ents 属性将所有提取的实体存储为一个列表,如下所示:
**def** extract_app(user_input, visualize = **False**):
*# Loading it in*
app_nlp = pickle.load(open("models/app_big_nlp.pkl", "rb"))
doc = app_nlp(user_input)
extracted_entities = []
*# These are the objects you can take out*
**for** ent **in** doc.ents:
extracted_entities.append((ent.text, ent.start_char, ent.end_char, ent.label_))
**return** extracted_entities
4.循环
通过迭代,我真正的意思是改进我的模型。我把它变成了自己的阶段,因为这实际上比你想象的要花更多的时间。我通过以下方式改进我的模型:
- 选择更好的意图和实体
- 提高我的数据质量
- 改进您的模型架构
你不需要像我在步骤 2 中那样生成数据。把它想象成你能够创建完美数据集的工具箱之一。
您输入意图分类器的数据的目标是使每个意图范围广泛(意味着意图示例充分穷尽了用户可能说的话的状态空间和世界)并且彼此不同。
这样,神经网络就能够对以前从未见过的用户话语做出更好的预测。以下是我如何努力实现这个目标的。
手动示例
除了使用 Doc2Vec 相似性来生成训练示例之外,我还在。我从我能想到的几个例子开始,然后我循环这些相同的例子,直到它达到 1000 个阈值。这将决定你的模型有多好。如果您知道某个客户很有可能会写一些东西,您应该将它添加到培训示例中。
关键词探索调优
我们如何选择包含哪些意图和示例?为了帮助做出更有数据依据的决定,我做了一个关键词探索工具,告诉你有多少条推文包含该关键词,并让你预览那些推文实际上是什么。这有助于探索您的客户经常向您询问的问题以及如何回应他们,因为我们也有可以查看的出站数据。
基于关键字过滤推文,以探索我的数据中的主题。图片作者。
我还找到了一种方法来估计我的 Twitter 数据中意图或主题的真实分布,并绘制出来。很简单。你从你的意图开始,然后你想代表那个意图的关键词。
{"update":['update'],
"battery": ['battery','power'],
"forgot_password": ['password', 'account', 'login'],
"repair": ['repair', 'fix', 'broken'],
"payment": ['payment'}
图片作者。
我也鼓励你查看 2 个、3 个甚至 4 个关键词的组合,看看你的数据是否自然地包含了同时具有多种意图的推文。在下面的例子中,您可以看到近 500 条推文同时包含了更新、电池和维修关键词。很明显,在这些推文中,客户希望解决他们的电池问题,这可能是由他们最近的更新引起的。
图片作者。
请记住,这一切都是为了让你的意图桶与众不同,范围广泛。
5.发展
至于这个开发方面,这是您实现您认为最适合您的上下文的业务逻辑的地方。我喜欢用“这解决你的问题了吗”这样的肯定语来重申一个意图。
出于演示的目的,我使用了 Streamlit。它不是部署的理想位置,因为很难动态显示对话历史,但它可以完成工作。实际上,您将部署在一个消息平台上。例如,您可以使用 Flask 在 Facebook Messenger 和其他平台上部署您的聊天机器人。你也可以使用 api.slack.com 进行整合,并在那里快速构建你的 Slack 应用。
对话界面是一个全新的话题,随着我们走向未来,它有着巨大的潜力。有很多指南可以帮助你设计这些对话式界面的 UX 设计。
下一步是什么?
在本文中,我将向您展示如何进行数据生成、意图分类和实体提取。这三个步骤对于制作聊天机器人是绝对必要的。然而,要让聊天机器人功能齐全、感觉自然,还有很多工作要做。这主要取决于你如何将当前的对话状态映射到聊天机器人应该采取的行动——或者简而言之,对话管理。
如果需要回答特定的意图,机器人需要准确地学习何时执行像倾听这样的动作,以及何时询问重要的信息。
以天气机器人为例,当用户询问天气时,机器人需要能够回答该问题的位置,以便它知道如何进行正确的 API 调用来检索天气信息。因此,对于天气检索这一特定目的,将位置保存到内存中的一个槽中是很重要的。如果用户没有提到位置,机器人应该会问用户用户在哪里。要求 bot 对世界上每个城市的天气进行 API 调用是不现实的,也是低效的。
我推荐看看这个视频和 Rasa 文档,看看 Rasa NLU(用于自然语言理解)和 Rasa 核心(用于对话管理)模块是如何被用来创建智能聊天机器人的。我谈了很多关于 Rasa 的事情,因为除了数据生成技术,我还从他们的大师班视频中学到了我的聊天机器人逻辑,并理解了如何使用 Python 包来实现它。他们的框架提供了很多可定制性,以便在聊天机器人的不同阶段使用不同的策略和技术(例如是否使用 LSTMs 或 SVMs 进行意图分类,甚至当机器人对其意图分类没有信心时如何后退的更细粒度的细节)。
此外,我想使用一个元模型来更好地控制我的聊天机器人的对话管理。一个有趣的方法是为此使用变压器神经网络(参考 Rasa 就此发表的论文,他们称之为变压器嵌入对话策略)。这基本上有助于你有更多的自然感觉的对话。
最后,扩展我的聊天机器人也很重要。这只是意味着扩展我的聊天机器人能够响应的意图和实体的领域,以便它覆盖最重要的领域和边缘情况。记住我做的这个框架可以移植到任何其他聊天机器人上是很有帮助的,所以我希望将来也能支持其他语言!
感谢阅读!
当然,这是我在过去一个月里通过观看 NLP 讲座、git 克隆许多 Github repos 亲自动手研究它们是如何工作的、YouTube 视频搜索和文档搜索所了解到的。因此,如果你有任何关于如何改进我的聊天机器人的反馈,或者如果有比我目前的方法更好的做法,请评论或联系我!我总是努力做出我能提供的最好的产品,并且总是努力学习更多。
Python 数据可视化完全指南
让我们来看看使用 Python 进行数据可视化的主要库,以及可以使用它们完成的所有类型的图表。我们还将看到在每种情况下推荐使用哪个库,以及每个库的独特功能。
我们将从直接查看数据的最基本的可视化开始,然后我们将继续绘制图表,最后,我们将制作交互式图表。
数据集
我们将使用两个数据集,它们将适应我们在文章中展示的可视化效果,数据集可以在这里下载。
它们是关于人工智能相关的三个术语(数据科学、机器学习和深度学习)在互联网上的搜索热度的数据。它们是从一个著名的搜索引擎中提取出来的。
有两个文件 temporal.csv 和 mapa.csv 。我们将在本教程的大部分内容中使用的第一个术语包括这三个术语在一段时间内的流行度数据(从 2004 年到现在,2020 年)。此外,我还添加了一个分类变量(1 和 0)来演示带有分类变量的图表的功能。
文件 mapa.csv 包含按国家划分的流行度数据。我们将在文章的最后一部分使用它来处理地图。
熊猫
在我们进入更复杂的方法之前,让我们从最基本的数据可视化方式开始。我们将简单地使用 pandas 来查看数据,并了解数据是如何分布的。
我们必须做的第一件事是可视化一些例子,看看有哪些列,它们包含什么信息,值是如何编码的…
import pandas as pd
df = pd.read_csv('temporal.csv')
df.head(10) #View first 10 data rows
使用 describe 命令,我们将看到数据是如何分布的,最大值、最小值、平均值…
df.describe()
使用 info 命令,我们可以看到每一列包含什么类型的数据。我们可能会发现这样一种情况,当使用 head 命令查看某列时,该列看起来是数字,但是如果我们查看后续数据,就会发现值是字符串格式的,那么该变量将被编码为字符串。
df.info()
默认情况下,pandas 限制它显示的行数和列数。这通常会困扰我,因为我希望能够可视化所有的数据。
使用这些命令,我们增加了限制,并且可以可视化整个数据。对于大数据集,请小心使用这个选项,我们可能会在显示它们时遇到问题。
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
使用 Pandas 样式,我们可以在查看表格时获得更多信息。首先,我们定义一个格式字典,以便数字以清晰的方式显示(有一定数量的小数、相关格式的日期和小时、百分比、货币……)不要惊慌,这只是一个显示,不会改变数据,您稍后处理它不会有任何问题。
为了给出每种类型的示例,我添加了货币和百分比符号,尽管它们对该数据没有任何意义。
format_dict = {'data science':'${0:,.2f}', 'Mes':'{:%m-%Y}', 'machine learning':'{:.2%}'}#We make sure that the Month column has datetime format
df['Mes'] = pd.to_datetime(df['Mes'])#We apply the style to the visualization
df.head().style.format(format_dict)
我们可以用颜色突出最大值和最小值。
format_dict = {'Mes':'{:%m-%Y}'} #Simplified format dictionary with values that do make sense for our data
df.head().style.format(format_dict).highlight_max(color='darkgreen').highlight_min(color='#ff0000')
我们使用颜色渐变来显示数据值。
df.head(10).style.format(format_dict).background_gradient(subset=['data science', 'machine learning'], cmap='BuGn')
我们也可以用条形显示数据值。
df.head().style.format(format_dict).bar(color='red', subset=['data science', 'deep learning'])
此外,我们还可以结合上述功能,生成一个更复杂的可视化。
df.head(10).style.format(format_dict).background_gradient(subset=['data science', 'machine learning'], cmap='BuGn').highlight_max(color='yellow')
点击这里了解更多关于熊猫的可视化样式:https://Pandas . pydata . org/Pandas-docs/stable/user _ guide/style . html
熊猫简介
Pandas profiling 是一个使用我们的数据生成交互式报告的库,我们可以看到数据的分布、数据的类型以及可能存在的问题。它非常容易使用,只用 3 行代码我们就可以生成一个报告,我们可以发送给任何人,即使你不懂编程也可以使用。
from pandas_profiling import ProfileReport
prof = ProfileReport(df)
prof.to_file(output_file='report.html')
你可以看到从文章中使用的数据生成的交互报告,这里。
你可以在这篇文章中找到更多关于熊猫简介的信息。
Matplotlib
Matplotlib 是图形化可视化数据的最基本的库。它包括了许多我们能想到的图表。仅仅因为它是基本的,并不意味着它不强大,我们将要谈到的许多其他数据可视化库都是基于它的。
Matplotlib 的图表由两个主要部分组成,轴(界定图表区域的线条)和图形(我们在这里绘制轴、标题和轴区域之外的东西)。现在让我们创建一个尽可能简单的图表:
import matplotlib.pyplot as plt
plt.plot(df['Mes'], df['data science'], label='data science') #The parameter label is to indicate the legend. This doesn't mean that it will be shown, we'll have to use another command that I'll explain later.
我们可以在同一个图形中制作多个变量的图形,从而进行比较。
plt.plot(df['Mes'], df['data science'], label='data science')
plt.plot(df['Mes'], df['machine learning'], label='machine learning')
plt.plot(df['Mes'], df['deep learning'], label='deep learning')
不是很清楚每种颜色代表哪个变量。我们将通过添加图例和标题来改进图表。
plt.plot(df['Mes'], df['data science'], label='data science')
plt.plot(df['Mes'], df['machine learning'], label='machine learning')
plt.plot(df['Mes'], df['deep learning'], label='deep learning')
plt.xlabel('Date')
plt.ylabel('Popularity')
plt.title('Popularity of AI terms by date')
plt.grid(True)
plt.legend()
如果您正在从终端或脚本使用 Python,在使用我们上面编写的函数定义图形之后,使用 plt.show()。如果您正在 jupyter 笔记本上工作,请在文件的开头内联添加%matplotlib,并在制作图表之前运行它。
我们可以在一个图形中制作多个图形。这非常适用于比较图表,或者使用单个图像轻松共享多种图表类型的数据。
fig, axes = plt.subplots(2,2)
axes[0, 0].hist(df['data science'])
axes[0, 1].scatter(df['Mes'], df['data science'])
axes[1, 0].plot(df['Mes'], df['machine learning'])
axes[1, 1].plot(df['Mes'], df['deep learning'])
我们可以为每个变量的点绘制不同风格的图形:
plt.plot(df['Mes'], df['data science'], 'r-')
plt.plot(df['Mes'], df['data science']*2, 'bs')
plt.plot(df['Mes'], df['data science']*3, 'g^')
现在让我们来看几个我们可以用 Matplotlib 做的不同图形的例子。我们从散点图开始:
plt.scatter(df['data science'], df['machine learning'])
条形图示例:
plt.bar(df['Mes'], df['machine learning'], width=20)
直方图示例:
plt.hist(df['deep learning'], bins=15)
我们可以在图形中添加一段文字,用我们在图形中看到的相同单位来表示文字的位置。在文本中,我们甚至可以在 TeX 语言之后添加特殊字符
我们还可以添加指向图上特定点的标记。
plt.plot(df['Mes'], df['data science'], label='data science')
plt.plot(df['Mes'], df['machine learning'], label='machine learning')
plt.plot(df['Mes'], df['deep learning'], label='deep learning')
plt.xlabel('Date')
plt.ylabel('Popularity')
plt.title('Popularity of AI terms by date')
plt.grid(True)
plt.text(x='2010-01-01', y=80, s=r'$\lambda=1, r^2=0.8$') #Coordinates use the same units as the graph
plt.annotate('Notice something?', xy=('2014-01-01', 30), xytext=('2006-01-01', 50), arrowprops={'facecolor':'red', 'shrink':0.05})
图库示例:
在此链接:https://matplotlib.org/gallery/index.html我们可以看到可以用 Matplotlib 完成的所有类型图形的示例。
海生的
Seaborn 是一个基于 Matplotlib 的库。基本上,它给我们的是更好的图形和函数,只用一行代码就可以制作复杂类型的图形。
我们导入这个库,并用 sns.set()初始化图形的样式,如果没有这个命令,图形仍然具有与 Matplotlib 相同的样式。我们展示一个最简单的图形,一个散点图
import seaborn as sns
sns.set()
sns.scatterplot(df['Mes'], df['data science'])
我们可以在同一张图中添加两个以上变量的信息。为此,我们使用颜色和大小。我们还根据类别列的值制作了一个不同的图表:
sns.relplot(x='Mes', y='deep learning', hue='data science', size='machine learning', col='categorical', data=df)
Seaborn 提供的最受欢迎的图形之一是热图。通常使用它来显示数据集中变量之间的所有相关性:
sns.heatmap(df.corr(), annot=True, fmt='.2f')
另一个最流行的是 pairplot,它向我们展示了所有变量之间的关系。如果您有一个大型数据集,请小心使用此函数,因为它必须显示所有数据点的次数与列数一样多,这意味着通过增加数据的维度,处理时间会呈指数增长。
sns.pairplot(df)
现在让我们做一个 pairplot,展示根据分类变量的值划分的图表
sns.pairplot(df, hue='categorical')
一个非常有用的图表是联合图,它允许我们看到散点图和两个变量的直方图,并看到它们是如何分布的:
sns.jointplot(x='data science', y='machine learning', data=df)
另一个有趣的图形是小提琴图:
sns.catplot(x='categorical', y='data science', kind='violin', data=df)
我们可以在一个图像中创建多个图形,就像我们使用 Matplotlib 一样:
fig, axes = plt.subplots(1, 2, sharey=True, figsize=(8, 4))
sns.scatterplot(x="Mes", y="deep learning", hue="categorical", data=df, ax=axes[0])
axes[0].set_title('Deep Learning')
sns.scatterplot(x="Mes", y="machine learning", hue="categorical", data=df, ax=axes[1])
axes[1].set_title('Machine Learning')
例子图库:
在这个链接中,我们可以看到用 Seaborn 可以做的一切事情的例子。
散景
Bokeh 是一个允许你生成交互式图形的库。我们可以将它们导出到一个 HTML 文档中,与任何拥有网络浏览器的人共享。
当我们有兴趣在图形中寻找东西,并且希望能够放大和移动图形时,它是一个非常有用的库。或者当我们想要分享它们,并给另一个人探索数据的可能性时。
我们首先导入库并定义保存图形的文件:
from bokeh.plotting import figure, output_file, save
output_file('data_science_popularity.html')
我们画出我们想要的并保存在文件中:
p = figure(title='data science', x_axis_label='Mes', y_axis_label='data science')
p.line(df['Mes'], df['data science'], legend='popularity', line_width=2)
save(p)
你可以通过点击这里看到文件data _ science _ popularity . html的样子。它是交互式的,你可以随意移动和放大图片
将多个图形添加到单个文件:
output_file('multiple_graphs.html')s1 = figure(width=250, plot_height=250, title='data science')
s1.circle(df['Mes'], df['data science'], size=10, color='navy', alpha=0.5)
s2 = figure(width=250, height=250, x_range=s1.x_range, y_range=s1.y_range, title='machine learning') #share both axis range
s2.triangle(df['Mes'], df['machine learning'], size=10, color='red', alpha=0.5)
s3 = figure(width=250, height=250, x_range=s1.x_range, title='deep learning') #share only one axis range
s3.square(df['Mes'], df['deep learning'], size=5, color='green', alpha=0.5)p = gridplot([[s1, s2, s3]])
save(p)
点击可以看到文件 multiple_graphs.html 的样子。
示例图库:
在这个链接中https://docs.bokeh.org/en/latest/docs/gallery.html你可以看到用散景可以做的所有事情的示例。
阿尔泰尔
在我看来,Altair 并没有给我们已经讨论过的其他库带来任何新的东西,因此我不会深入讨论它。我想提一下这个库,因为也许在他们的示例库中,我们可以找到一些可以帮助我们的特定图形。
范例库:
在这个链接里你可以找到所有你能用 Altair 做的范例库。
薄层
Folium 是一个允许我们绘制地图和标记的库,我们也可以在上面绘制我们的数据。让我们选择地图供应商,这决定了地图的风格和质量。在本文中,为了简单起见,我们只将 OpenStreetMap 视为一个地图提供商。
使用地图是相当复杂的,值得单独撰写一篇文章。在这里,我们只看一些基础知识,并用现有的数据画几张地图。
让我们从基础开始,我们将画一个简单的地图,上面什么也没有。
import folium
m1 = folium.Map(location=[41.38, 2.17], tiles='openstreetmap', zoom_start=18)
m1.save('map1.html')
我们为地图生成一个交互式文件,你可以随意移动和缩放。这里可以看到。
我们可以在地图上添加标记:
m2 = folium.Map(location=[41.38, 2.17], tiles='openstreetmap', zoom_start=16)folium.Marker([41.38, 2.176], popup='<i>You can use whatever HTML code you want</i>', tooltip='click here').add_to(m2)
folium.Marker([41.38, 2.174], popup='<b>You can use whatever HTML code you want</b>', tooltip='dont click here').add_to(m2)m2.save('map2.html')
您可以看到交互式地图文件,您可以通过点击此处点击标记。
在开始展示的数据集中,我们有国家名称和人工智能术语的流行程度。快速可视化后,您会发现有些国家缺少其中一种价值观。我们将把这些国家排除在外,以便于操作。然后,我们将使用 Geopandas 将国家名称转换为可以在地图上绘制的坐标。
from geopandas.tools import geocode
df2 = pd.read_csv('mapa.csv')
df2.dropna(axis=0, inplace=True)df2['geometry'] = geocode(df2['País'], provider='nominatim')['geometry'] #It may take a while because it downloads a lot of data.
df2['Latitude'] = df2['geometry'].apply(lambda l: l.y)
df2['Longitude'] = df2['geometry'].apply(lambda l: l.x)
现在我们有了用纬度和经度编码的数据,让我们在地图上表示它。我们将从一张泡泡地图开始,我们将在这些国家上画圈。它们的大小将取决于术语的流行度,并且它们的颜色将是红色或绿色,这取决于它们的流行度是否高于某个值。
m3 = folium.Map(location=[39.326234,-4.838065], tiles='openstreetmap', zoom_start=3)def color_producer(val):
if val <= 50:
return 'red'
else:
return 'green'for i in range(0,len(df2)):
folium.Circle(location=[df2.iloc[i]['Latitud'], df2.iloc[i]['Longitud']], radius=5000*df2.iloc[i]['data science'], color=color_producer(df2.iloc[i]['data science'])).add_to(m3)m3.save('map3.html')
点击这里可以查看互动地图文件。
在任何给定的时间使用哪个库?
有了这么多种类的库,您可能想知道哪个库最适合您的项目。快速的答案是库,让您可以轻松地制作您想要的图形。
对于一个项目的初始阶段,随着熊猫和熊猫概况,我们将快速可视化,以了解数据。如果我们需要可视化更多的信息,我们可以使用简单的图表,我们可以在 matplotlib 中找到散点图或直方图。
对于项目的高级阶段,我们可以在主要库(Matplotlib、Seaborn、Bokeh、Altair)的图库中搜索我们喜欢并适合项目的图形。这些图形可用于在报告中给出信息,制作交互式报告,搜索特定值,…
Python 线性回归完全指南
在本文中,我们将使用 sklearn 在波士顿房价数据集上理解和实现线性回归
Emil Widlund 在 Unsplash 上的照片
什么是线性回归?
线性回归是一种有监督的机器学习算法。它根据给定的因变量(x) 预测自变量(y) 之间的线性关系。使得自变量(y)** 具有最低成本。**
应用于数据的线性回归,作者提供照片
线性回归工作
为了解释线性回归的工作原理,我们首先必须假设我们有一些数据,当我们在散点图上绘制这些数据时,我们会得到一个类似这样的图。
数据散点图,作者照片
现在,如果我们将线性回归应用于它,那么它将计算数据之间的关系/线,使得线是距离数据中的所有点最近的。换句话说,它会计算出温度(x) 和冰淇淋(y) 销量之间的关系,并告诉我们在什么温度下销量会大于销量以及在什么温度下销量会小于。********
我们如何找到我们数据之间的这条线/关系?
现在,在我们深入探讨这个问题之前,我们应该先了解一些术语。
- 假设表示
- 成本函数
- 梯度下降
假设表示
假设表示是我们的线的方程,我们用来表示给定的数据之间的关系。
假设表示公式,作者照片
现在,这个方程一开始可能会令人困惑,有些人可能很难把它想象成直线的方程。但是如果我们考虑直线的方程,那就是 y = mx + c 。
在线的方程中, m 对应的是斜率, x 是具有某值的变量 , c 是一个常数**。
在假设表示中, θ1 对应斜率, x 为具有某值的变量, θ0 为常数。**
所以这里的 θ0 & θ1 都是的参数,它们的初始值是我们手动设置的**,但之后又进一步修改为线在数据中完美设置。**
价值函数
现在,每当我们第一次绘制数据和计算线/关系时,我们都必须选择一些参数**,如那条线的起点和线的斜率**。因此,首先,我们不知道任何这些东西的值,我们假设两个参数的值,然后对我们的数据应用成本函数来检查误差(点和我们的线的距离 b/w)。
现在首先我会给你看我们的成本函数的数学版本,然后我会在下面解释它。
平方误差成本函数,作者照片
重要符号:
- m 代表训练样本总数****
- x(i) 代表输入变量 (x(1)表示第一个训练示例)****
- y(i) 代表输出变量****
所以在这个成本函数中,(hθ(x)-y)项用我们的给定值 (y) 减去预测值 ( x) ,这样我们就找到了我们的线和给定点之间的误差(距离)。然后我们取答案的平方,以防得到的值是一个负数。之后,我们对所有训练示例和求和并将乘以 1/2m ,取平均值作为我们训练示例误差。
我们的假设和给定数据之间的误差,中等
【细化 1 / 2m(可选)
现在,我们在这里看到的是这个等式被乘以 1/2m 。这里的 m 是取我们误差的均值/平均值**,这里的 2 是因为当我们取成本函数的导数时,在更新时使用参数在坡度下降时,即 2 在**功率****
梯度下降
现在,当我们对成本函数 & 假设表象有了更好的理解,由此我们走向第三项,梯度下降。
所以,现在我们已经成功地实现了成本函数,并且得到了一些成本(误差)> > 0 。为了减少这个成本(误差)我们应用梯度下降,其中我们更新参数θ0 & θ1 的值,并且保持更新它们,直到我们的成本(误差)几乎等于 0 。因此,梯度下降的数学公式如下
梯度下降公式,中等
重要符号:
- m 代表**训练样本总数**
- α 代表α也叫**学习率**
- x(i) 代表输入变量 (x(1)表示第一个训练样本)
- y(i) 代表**输出变量**
好了,现在深入这个公式,我们可以看到 θ0 & θ1 在不断变化,直到成本函数达到其最小值**。它的意思是,我们将继续改变 θ0 & θ1 的值,直到我们的参数达到值**,其中 c ost(误差)将是最小的。****
现在,如果你看到我们在 α 之后有一个类似于成本函数的等式,那是因为梯度下降是成本函数的导数。
突出成本函数的导数,中
****这里我们将我们的成本函数的导数 (平方误差成本函数)乘以 α ,从当时的 θ 的当前值中减去α,得到一个新值 theta (θ) 。
选择α的值
我们总是选择 α 的一个非常小的值**,因为每次迭代后 θ 值的变化取决于 α 的值(如等式所示)。因此,通过选择 α 的非常小的值,我们的假设采取非常小的步骤并达到其最低成本。通过使用大值的 α ,我们可能开始采取大的步骤,并且可能错过全局最小值,其中我们的成本(误差)将是最低的。**
**使用小值的 α 与使用大值的 **α,作者照片
澄清第二方程中的 x
现在有些人可能会奇怪,在第二个方程中,一个额外的 x(i) 正被乘以我们的方程,而在第一个方程中什么也没有。这里有一个 x(0) ,是用乘以得到的等式,但是我们没有写下来,因为这是偏差,并且总是等于 1。****
梯度下降作业
现在梯度下降所做的是它采取小婴儿步骤并且在每个步骤中,它将假设(线)向位置收敛**,在那里我们的成本(误差)将会是最小。**
假设收敛到全局最小值,图像来自介质
从 这里 阅读更多关于成本函数和梯度下降。****
应用线性回归的步骤:
现在我们对假设表示**、成本函数、和梯度下降有了很好的理解。因此,让我们将线性回归应用于我们的数据集。**
****线性回归可应用于以下步骤:
- 绘制我们的数据(x,y)。
- 取随机值 θ0 & θ1 并初始化我们的假设**。**
- 在我们的假设上应用成本函数**,并计算其成本。**
- 如果我们的花费> > 0** ,那么应用梯度下降和更新我们的参数θ0 & θ1 的**值。****
- 继续计算第 3 步和第 4 步**,直到我们的成本接近等于 0 或最小。**
- 如果我们的成本已经达到它的全局最小值**,那么我们停止应用成本函数和梯度下降,现在我们已经成功地训练了我们的算法来预测我们的数据之间正确的关系。**
对我们的数据集应用线性回归
现在,当我们很好地理解了线性回归的工作原理后,让我们使用 Python 的著名的机器学习库**、 Scikit-learn 将其应用于一个数据集。**
什么是 Scikit-learn?
Scikit-learn (又称 sklearn )是一个针对 Python 的机器学习库。它包括各种分类、回归、和聚类算法以及支持向量机(SVM) 、随机森林、梯度提升、、 k -means 和 DBSCAN ,并且被设计为与类似**的 Python 库一起工作**
使用 Sklearn 进行线性回归
线性回归是一种非常直接且易于使用的算法。特别是在这个 Scikit learn 库的帮助下,它的实现和使用变得相当容易。现在,我们开始使用 Sklearn 。
首先我们需要一些数据对其应用线性回归**。因此,我们将使用来自 sklearn 的波士顿房价数据集。**
在 Python 中导入波士顿数据集
from sklearn.datasets import load_boston
boston = load_boston()
在 Python 中导入其他库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
检查内容我们的数据集
print(boston.keys())
打印输出(波士顿[‘target’])代码
这些键中的每一个都包含了大量的信息和数据。
- ’ data '键包含我们将提供给模型的数据,它也可以被假定为输入(x)变量。可以使用
boston.data
代码进行访问。 - ’ target '键包含我们的模型应该预测的输出数据(y)。可以使用
boston.target
代码访问它。 - ’ feature_names '键包含我们的数据的列/特征的名称。也可以使用
boston.feature_names
代码访问它们。 - ’ DESCR '键将为我们提供关于数据集的所有信息,其中的列数,甚至每一列的细节/描述。我们可以使用
print(boston['DESCR'])
代码获取这些信息。 - “文件名键给了我们这个(波士顿房价)文件的位置。我们可以使用
print(boston['filename'])
代码获得位置。
创建数据帧
现在,为了向前推进并以一种有组织的和可行的方式查看我们的数据,我们将使用 Pandas 创建一个数据框。
bostondf = pd.DataFrame(boston.data, columns=boston.feature_names)
在我们的数据框架被创建并且我们的数据被组织之后。我们使用bostondf.head()
检查数据集的头部。这为我们提供了数据集的整体清晰度/图像。
我们数据框的头
现在,如果我们不明白每一列代表什么,我们可以使用我们之前讨论过的print(boston['DESCR'])
代码来检查每一列的细节。
现在,在对我们的数据做了一些特征工程**之后,当我们觉得我们的数据现在是可以传递给我们的模型的正确格式时,我们就向我们的下一步前进。
注意:我不是在这个数据集上做特征工程。**
将我们的数据集分割成训练、测试值
现在,当我们的数据准备好传递给我们的模型时,我们的第一步是将数据集分成两组,即训练集和测试集**。**
from sklearn.model_selection import train_test_split
X = bostondf
y = boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
这里,X = bostondf
中的 X 包含所有的特征/输入数据(x)** ,我们提供给我们的模型来预测的房价(y),y = boston['target']
中的 y 包含房价。所以现在我们数据的 67% 属于 training_set 而的 33% 属于 test_set 因为 test_size 被设置为 0.33 。**
导入线性回归()
在成功地将我们的数据分成测试和训练集之后,我们将使用 sklearn 和**fit**
将线性回归导入到我们的模型中,然后我们将预测我们的模型从我们的训练数据中学习得有多好。
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
好了,我们在这两个步骤中所做的是,我们导入了 LinearRegression( ) 类,并创建了一个名为 lr 的 LinearRegression 对象。然后我们将我们的训练数据lr.fit(X_train, y_train)
拟合到模型中,为其提供输入特征(X_train)** 和输出值(y_train) 。在模型根据我们的训练数据对进行了训练之后,我们使用lr.score(X_test, y_test)*100
代码来检查我们的模型与我们的训练数据的拟合程度。它会根据 X_test 中提供的特征来预测房屋的**价格,然后将这些价格与 y_test 中给出的实际价格进行交叉核对。然后它会给我们一个 1-100 之间的浮点值,告诉我们模型的精度。****
该模型的精度**为 72.45 %。**
重要提示
现在,在检查了精度之后,如果我们的精度看起来不是很激励**,我们应该继续到我们对我们的数据集进行特征工程的部分,并做一些更多的特征工程。这肯定会提高**的结果。****
恭喜!我们已经在波士顿房价数据集上成功训练了我们的线性回归模型。
学习成果
到目前为止,我们已经了解了什么是假设表示**、代价函数、梯度下降以及它们是如何工作的。此外,我们还学习了如何从 scratch 在数据集上实现线性回归,以及如何使用 Python 著名的机器学习库即 Scikit-learn 构建机器学习模型**。****
到目前为止,我们已经了解了什么是假设表示**、成本函数、梯度下降以及它们是如何工作的。此外,我们还学习了如何从 scratch 在数据集上实现线性回归,以及如何使用 Python 著名的机器学习库即 Scikit-learn 构建机器学习模型**。****
零售业机器学习和深度学习完全指南
商店还没有死
这里有更多有趣的图表!
商店在变化。我们看到它在我们眼前发生,即使我们并不总是意识到这一点。渐渐地,它们正成为日益复杂的顾客旅程中的一个额外步骤。得益于数字化和零售自动化,商店本身不再是目的,而是服务于整个品牌需求的手段。体验的质量、归属感和认同感、购买的舒适度……所有这些参数现在都与每平方米的销售额一样重要,因此必须服从数据科学及其“智能算法”(又名机器学习和深度学习形式的人工智能)规定的优化。
首先,人工智能的使用是竞争的需要。事实上,电子商务玩家不会等待任何人:例如,注意在线搜索结果对最终客户的调整,或者基于数字档案的推荐。这两个方面是砖头和砂浆做不到的(目前来说)。但是,实体商业有自己的优势。嗅觉、视觉、听觉等。数据可以用来给消费者一种体验某种独特的、专为他们制造的东西的感觉。除了改善客户关系,人工智能还使寻求解决长期以来一直是零售商负担的问题成为可能:更好的库存管理、商店空间的优化、员工时间的优化…
我们在下面展示了深度学习/机器学习用例的完整视图,这些用例是为了创建未来的商店而实现的,并有现实生活中的例子支持。
1.调整商店及其库存,以便更好地为顾客服务
众所周知,电子商务参与者可以使用动态统计数据实时优化他们的网站。这使他们能够根据可用资源和预定义的客户细分来定义最有效的策略。像任何物理空间一样,商店没有这种奢侈。
然而,这并不妨碍物理空间的周期性优化,这要归功于从智能算法中收集的洞察力。回到过去(不到 20 年前),我们会雇佣学生跟踪和清点商店特定区域的顾客。谢天谢地,这些时代已经过去了。热图、平均路线图、在屏幕上花费的时间、与总出席率相关的各种比率、相关性……商店里的摄像头和计算机视觉算法现在提供了基于图像的可操作工具。如今,热图和活动识别解决方案不仅有助于定位促销活动,还能帮助制定整体营销策略,并衡量每个部门的绩效以及产品植入的绩效。像 RetailFlux 这样的公司提供的解决方案可以分析商店视频,为零售商提供他们商店里的人数、他们进去后走的路以及他们在哪里逗留的数据。这有助于营销人员确定受欢迎的地点,使他们能够改变家具、展示、广告或员工的布局,以更好地服务他们的客户并增加收入。
随着技术的发展,我们也开始听说“人口统计识别”:这些由初创公司 DeepVision AI 、 MyStore-e 、retail dep和 RetailNext 创造的工具,让我们能够估计从摄像头前走过的人的年龄和性别,从而让商店能够进入这一点对营销人员和品类经理的理性化至关重要。
虽然这些摄像头经常挂在天花板上,但情况并非总是如此: Walgreens (与 Cooler Screens 合作),例如,最近将摄像头、传感器和数字屏幕集成到其商店的冷却器门中,以创建一个“智能”显示器网络,品牌可以使用它来针对特定类型的客户发布广告。这些门可以作为一个数字销售平台,以最佳方式展示食品和饮料,也可以作为一个店内广告牌,根据大致年龄、性别和当前天气等变量,向正在靠近的消费者展示广告。连接的冷却器内的摄像头和传感器还可以确定买家已经拿起或查看了哪些商品,让广告商了解他们的促销活动在屏幕上的效果,并在产品缺货时迅速通知零售商。
因此,关键问题从“在哪里”和“多少”变成了“谁”、“什么时候”、“多长时间一次”、“吃多少饼干?”。
2.增加利润的预测
这些数据与来自结账和忠诚度计划的数据相结合,是预测需求和创建商店集群的关键,从而改善零售商的供应链。通过更好地预测哪些产品将在某个领域表现良好,来自诸如Symphony RetailAI等初创公司的机器学习算法可以减少呆滞库存,帮助优化定价(和利润),并提高客户忠诚度(人们显然倾向于喜欢在最近的商店找到正确的产品组合)。
事实上,未售出的库存可能是零售业最大的障碍之一:未使用的库存每年给美国零售商造成大约 500 亿美元的损失。减少这一数字是该行业长期生存的关键:花在成为死库存的东西上的每一美元都是宝贵的钱,可以用来培训人才,更好的研发,或者,最明显的,全新的智能算法。
预测也有助于零售商优化他们的促销活动:仓库里的死库存越少,促销就越有战略意义,而不仅仅是被动的。许多定价爱好者会特别欣赏这一点,因为这将使他们的工作容易得多,也不那么吃力不讨好。
3.提升店内体验的个性化
与网站可以实时适应最终用户的方式一样,商店也可以增加计算机视觉的粒度,使其能够针对个人。然而,这些算法基于比上述更多的元素,因此更复杂/更不可靠。为了在个人层面上工作,这些算法需要结合人口统计识别、忠诚度代码识别和增强现实,通常集成到镜子等智能物体中。
尽管这些解决方案无法大规模实施,但它们体现了商店销售方式的深刻变化。我们正从销售产品转向销售体验,在这种情况下,实物产品变成了副产品。这就是shopertainment的概念。对顾客来说,低廉的价格和丰富的目录已经不够了,他们可以在网上找到这样的价值主张。真实的品牌体验成为生存的关键:商店是吸引人的体验、想法和互动的仓库。
用例当然是众多的(即使它们经常与人工智能赤道的科幻技术术语边接壤):在 2019 年的 NRF ,谷歌展示了一个连接视觉识别数据和商店产品数据库的连接镜子。例如,在眼镜店的情况下,镜子可以识别测试的模型,并显示关于它的产品或营销信息。卖家还实时统计了镜子的使用情况:他们知道尝试某种类型眼镜的人已经在那里有一段时间了,或者在两副眼镜之间犹豫不决。这方便了销售人员的工作,他们可以向顾客推荐他们真正感兴趣的产品。
就其本身而言,H & M 已经与微软联合测试了一面通过语音指令进行自拍的镜子,而 Lululemon 的镜子则更像是一块板子,鼓励其客户参与该品牌创建和维护的社区。
智能镜子当然可以放置在购买过程的不同时间间隔: 拉夫·劳伦的位于试衣间,以改变试穿衣服时经常令人沮丧的体验。买家可以与镜子互动,改变试衣间的照明,并可以为自己的服装选择不同的尺寸或颜色,员工将获得这些。《镜报》还推荐了与正在尝试的食物相匹配的其他食物。
化妆品公司也采用了这些解决方案: 丝芙兰智能镜子使用一种智能算法,混合看镜子的人的性别、年龄、外貌和风格,以便提出建议。它甚至声称可以区分穿着中性或明亮颜色、大胆或保守风格以及带有花卉和几何图案的衣服的人。
通过深度学习,我们也看到了一项新技术的出现:情感计算。它是计算机识别、解释并可能激发情感的能力。确实有可能识别头部和身体运动等手势,同时声音的语气也能充分说明一个人的情绪状态。这些见解可用于商店,以免给显然不需要帮助或麻烦的顾客带来不便。这些技术仍然是新的(只有 可发布 提供零售用例)和侵入性的:因此最好不要评论未来的用例。
4.让顾客的购物体验更加顺畅
镜子、增强现实、虚拟现实……它们很少回应零售商及其客户的真正痛点。我们对这些痛点了如指掌:结账长度、快速产品本地化和库存管理……这些应该是商店寻求使用机器学习和深度学习解决方案的优先事项。
减少结账时的摩擦
例如,在中国,某些肯德基的顾客可以通过支付宝技术、将他们的面部图像与数字支付系统或银行账户关联后,坐在装有摄像头的 POS 机前进行购物。美国连锁店 Caliburger 也在它的一些餐厅测试了面部识别的想法:顾客第一次使用店内售货亭点餐时,他们被邀请使用(NECs)neo face的面部识别软件将他们的脸与他们的账户联系起来,以便从众多优势中受益。银行卡支付仍然是必要的,但如果初步测试阶段成功,该公司打算改用面部识别支付。
然而,对网络安全的担忧可能会阻止这种解决方案大规模问世。事实上,顾客越来越嫉妒他们的个人数据(这是正确的):根据 Wavestone 的一项研究,只有 11%的消费者准备在商店接受面部识别。对于移动应用程序的识别,这个数字上升到 40% 。
因此,人们正在考虑其他更可行的方法,利用计算机视觉让结账更加流畅。到目前为止,我们都很熟悉亚马逊 Go 的自动化商店(不太熟悉,希望是),它允许拥有 Prime 账户的顾客用手机上的代码进入商店,购物,然后离开商店,而不经过收银台。一种“跟踪”顾客的算法,购买的金额自动记入借方,发票通过电子邮件发送。这项技术的测试也正在与 XXII 合作在赌场 进行。
这个空间里有很多初创公司: 标准认知ZippinTrigo Vision……都声称帮助公司消除客户的结账。与此同时,中国正在通过欧尚的 宾果盒随意地改造商店的概念。
减少缺货
所有这些摄像头可以用来看的不仅仅是顾客:很多监控货架的解决方案确实出现了。他们提出在出现短缺的情况下向员工发送警报,以便迅速做出反应。
这对商店来说很关键:缺货代表北美每年超过 1290 亿美元的销售损失(约占收入的 4%)。不仅如此,缺货还会积极地将顾客推向竞争的怀抱:亚马逊 24%的收入来自在当地零售商那里经历过缺货的顾客。这样的解决方案有很多例子:在法国, 安格斯艾 与Les mousequetaires**合作。在美国,沃尔玛自去年以来一直致力于这一概念,拥有 聚焦系统 **的 ABInbev 也是如此。有趣的是, Yoobic 的解决方案提供了类似的过程,但相机掌握在个人手中,以便拍摄将由算法分析的照片。与此同时,在中国, Hema ( 阿里巴巴的未来商店)比世界上任何其他地方都更能推进扩张商店的边界。
通过语音技术提供购物建议
当然,图像不是商店里唯一可以分析的东西;语音在简化客户旅程方面也发挥着作用。这种不太受欢迎的购物方式将迎来一场小小的革命:根据 C 战略咨询公司的数据,2017 年,13%的美国家庭拥有智能音箱。这个数字预计到 2022 年将上升到 55%。
亚马逊(Amazon)也是语音技术的领导者,这一事实表明了这家西雅图巨头对其实体统治的重视程度(已经征服了虚拟空间)。该品牌于 2019 年推出的 Echo Buds 与 Alexa 合作,在客户移动时回答它理解的任何问题。对于零售业来说,更有趣的是,它还会通知用户最近的全食超市(亚马逊拥有全食超市)是否有顾客正在寻找的商品。一旦他们被告知并进入商店,回声芽可以指引他们到正确的通道。你可以想象 Alexa 不仅会引导你找到一件商品,而且如果你告诉它你想做千层面,它还会引导你逛商店,让你以最快的方式挑选所有必要的配料。未来是耳朵 ( 懂了吗?)。
虚拟助手确实在崛起。例如,玛氏公司已经与美国零售商 BevMo 合作。到测试 SmartAisle ,数字威士忌采购助理。通过混合人工智能、声控技术和货架上的 LED 灯, SmartAisle 帮助买家选择完美的威士忌酒瓶。快速交谈后推荐三瓶,相关货架亮起,引导顾客找到喜欢的瓶子。如果顾客心中已经有了一个品牌,店员可以推荐其他品牌或具有相似风味的瓶子。整个体验不超过 2 分钟。语音助手使它成为一种愉快和有益的体验,混合了戏谑和有用的信息。
从 NLP 到虚拟助理,上面的两个例子表明,如果使用得当,语音技术可以节省更多的员工时间,并为零售商提供关键数据。
机器人自动化
如果没有围绕机器人技术的讨论,关于改进和简化流程的讨论将是不完整的。这些长期以来被归入科幻小说的物品,现在在世界各地的商店中显示出它们的实用性。虽然机器人本身不是人工智能的一个子类,但在过道上漫游的机器人使用了计算机视觉和 NLP 的概念。就像亚马逊**,沃尔玛在这里也处于技术的前沿: 【波沙·诺瓦】 机器人(被称为“Auto-S”)被设计用来扫描货架上的商品,以帮助价格准确性和重新进货,已经出现在他们的 1000 家商店中。这些六英尺高的设备每个都包含 15 个摄像头,可以扫描货架并实时向员工发送警报。这将员工从可重复、可预测的手动任务中解放出来,让他们有时间专注于销售和客户服务。**
沃尔玛还推出了机器人,这些机器人可以清洁地板,从卡车上卸载和分拣物品,并在商店里接订单。有趣的是,这个利基市场正迅速变得极具竞争力, Simbe 的机器人已被部署在美国各地的 Schnuck 商店,其价值主张与波沙·诺瓦相同,而 Lowe 在 2016 年推出了一款可以理解并回答简单客户问题的机器人。几乎可以肯定的是,机器人技术的发展将在未来几个月加速。
5.预防损失的措施
“缩水”(盗窃)成本巨大:在欧洲范围内,€每年 490 亿欧元(占分销行业年营业额的 2.1%),对已经饱受价格战压力的分销商利润造成沉重负担。因此,安全成为一种迫切的需要。因为成本,自动化也是如此。这可以采取多种形式。例如,增强摄像头可以识别产品是否被隐藏,并提醒人们。然而,这将产生大量的假阳性,因为一个无所不知的摄像机在物理上是不可能的。诸如 Vaak 或 DeepCam AI 等公司声称,只有当访客的行为高度可疑时,才能通过向某人发出警报来避免这个问题。像 StopLift 这样的解决方案还可以检测“甜心交易”(员工假装进行交易,但实际上是在没有付款的情况下向熟人赠送产品)。重要的是要记住很大一部分商店盗窃是通过员工进行的。这些解决方案的投资回报率很容易计算:商店确切地知道他们因盗窃和错误而损失了多少。因此,这个用例可能是最先实现的用例之一。
结论
鉴于所有这些发展,尽管它们对零售商和客户都有许多好处,但客户向零售商询问谁有权访问数据以及如何使用数据是至关重要的。不言而喻,透明度必须是任何个人数据使用的口号,以保证消费者的私人生活得到保护。
如果你渴望开始你自己的公司人工智能项目,我建议直接跳到我关于这个问题的最新文章:你自己的公司人工智能项目的 10 个步骤。
这篇文章 原本是我的博客, 的 Pourquoi Pas。过来打个招呼。
媒体行业机器学习完全指南
点击此处查看更多有趣的图表!
在过去的几年里,顾客旅程的日益数字化和云技术和计算能力的指数级提升邀请媒体集团重新思考他们做生意的方式。如果听起来我用了很长的词来说“数字颠覆”,请相信你的直觉。许多中断都集中在媒体集团可以访问的大量数据上,以及人工智能(AI)(更具体地说是机器学习)可以用这些数据做什么。事实上,尽管人工智能已经被过多的纯玩家( Spotify 、网飞、 Buzzfeed 、迪士尼……)完全接受,但传统玩家仍然落后,现在他们将这项技术视为实现急需的新增长的捷径。
下面是世界各地的老一代卫道士目前正在实施的用例的详细情况。
1.创建流程优化
元数据创建/索引自动化
使用机器学习,人工智能既可以翻译数据,也可以使用图像识别来自动创建所有类型内容的元数据(例如,描述一张图像,以便更容易通过谷歌找到)。这使得内部和外部的利益相关者能够更容易地发现内容,允许以更好的标准进行搜索,以获得更精确的结果。自动索引(以及多种数据格式的转换)加快了记者的工作速度,方便了事实的验证,并使人类能够专注于更有附加值的任务。福克斯、纽约时报、BBC……数十家媒体公司已经在其运营中实施了这些解决方案。
文章写作和视频创作的自动化
我们也看到了自动化低附加值文章写作工具的出现,从而使记者能够从事需要更多调查和更专业知识的主题。例如,Syllabs 为记者提供自动处理选举结果的机器人:他们的 Data2Content 工具在信息到达内政部网站后立即生成文本。《华盛顿邮报》的Heliograf从 2016 年开始就在体育方面做的差不多了。其他此类工具通过使用语音识别将音频信息转换为文本,可以大大加快文章写作或视频创作的速度。然后,这些文本被直接“重新编码”到视频中,这使得查找、验证和潜在的修改变得更加容易。
请注意,我们讨论的是非常简单的任务:大多数超越事实报告的机器学习测试都失败了(通常很搞笑)。
发现新趋势
第一个披露新闻故事的记者得到了所有的荣誉,故事就是这样。因此,最重要的是控制和预测信息流动,同时实时跟踪其传播,以便从竞争对手中脱颖而出。为此,路透社新闻机构的 R&D 团队开发了 新闻追踪器 工具,该工具通过一种算法识别 Twitter 上的重大事件。该工具为这些事件分配了一个“媒体分数”,这使得主要关注最重要的事件成为可能。新闻追踪专家也能够对这些事件的真实性产生信心。
这最后一点特别重要,因为它符合媒体对信息可靠性的最高要求。
事实核查
事实上,一些算法也可以帮助记者验证社交网络上发布的图像和视频的可靠性和准确性。 ClaimBuster 和 FactMata 为例,是两家利用智能算法打击虚假信息和深度假货的初创企业。这是通过根据终端用户提供的数据为内容分配置信度指数来实现的。
2.内容的分发、个性化和推荐
尽管上述机会确实会对媒体市场产生破坏性影响,但它们只是机器学习为媒体行业提供的机会的一小部分。虽然科幻爱好者热切期待内容创作的自动化,但人工智能的主要影响将通过内容改编和呈现给观众的过程来实现。
随着市场产生大量质量和吸引力各不相同的内容,有效的配对是将这些内容转化为一套适合每个最终消费者或最终消费者群体的价值主张。这种粒度有多种变化方式:****
它意味着在正确的地方有正确的内容
以 Buzzfeed 和它的 400 个分销渠道为例。利用人类的智慧将正确的内容放在正确的地方将是耗时的,并且任何优化都是非常不完美的。因此,该公司使用人工智能来告知一篇文章的病毒式传播概率,并在最适合公众的频道上推广它,使公众有最大的欣赏机会。这个概率是产品、社交媒体、工程和数据科学团队共同努力的产物,他们基于高性能内容的历史数据开发了一个机器学习模型。
它意味着在正确的时间选择正确的内容
死人复活了。瑞士杂志 Le Temps 使用的机器学习解决方案Zombie ,能够通过交叉引用其档案与来自 Chartbeat (向全球出版商提供数据和分析)和 Google Analytics 的数据来识别该杂志的最佳文章。然后,该算法根据定性指标(阅读时间、受众历史、社交网络上引起的参与度和辩论……)分配相关性分数,并建议重新发布和接触新受众的最佳时间。这给了内容第二次生命,随之而来的收入可以直接到达底线。
它意味着为合适的人群提供合适的内容
Business Insider 的内容比任何人能(或想)阅读或观看的都多。得益于初创企业 Sailthru 的解决方案,出版商因此根据消费内容的历史(由 cookies 跟踪)创建了简档。根据他们的个人资料,网站和电子邮件都会为读者提供合适的内容。这种对读者细分的投资使得 Business Insider 和的点击率分别提高了 60%和 150% 。此外,返回网站的流量跃升了 52% 。
这里最重要的是要注意,这些工具通过提供与现有观点一致的内容,非常有能力进一步分化我们的社会,它们在媒体中的使用不应被轻易接受。
它不能(还)意味着正确的内容适合正确的人
一种算法可以基于上下文数据和客户旅程做出决策,但几乎无法理解每一个客户的偏好:喜欢和不喜欢很少是稳定的,通常是高度上下文相关的。人类口味的多样性暂时仍困扰着机器。因此,任何个人层面的个性化目前都必须由策展人协助。然而,许多这样的角色只是推迟了看似不可避免的事情:根据路透社 T2 的一项研究,几乎四分之三(72%)的媒体玩家计划积极尝试人工智能,以改善推荐并提高制作效率。
3.货币化
由于货币化是传统媒体生存的最重要杠杆之一,从客户参与到广告空间,许多用例开始在这一领域出现。
付费墙
许多主要出版物都以某种形式使用付费墙(一种限制付费用户访问网站的系统)。它通常以在阅读有限数量的文章后阻止内容的形式出现。在这里,人工智能也提供了一个更具活力、更少胁迫的价值主张。以瑞士报业集团Neue zürcher Zeitung为例,该集团使用一种结合了 100 个标准的算法来确定互联网用户最有可能在什么时候触发他的付费参与。一旦发现合适的时机,就会为潜在客户显示个性化的登录页面。三年内转化率乘以 5,结果令人信服。
实时竞价
我们可以想象,当智能算法支持时,实时竞价(RTB)将找到新的维度,特别是在供应商方面:机器学习算法可以优化申请人的选择,管理数据传输的成本,提高绩效的可见性,避免欺诈,甚至检查广告的质量。然而,这样的例子在今天的市场上仍然非常罕见。
结论
A.我将影响媒体价值链的所有部分,帮助内容创作者更具创造性,帮助内容出版商更具生产力,帮助消费者找到符合他们兴趣的内容。
然而,人工智能只是业务优化战略连续性逻辑的一部分,因此,不应被视为一场革命。这一事实以现在的方式最大限度地减少了实现背后的工作:正如科学家 Peter Skomoroch 去年提到的那样:“你可以预计你的公司向机器学习的过渡比你向移动设备的过渡要困难大约 100 倍。
这个故事 本来是为我的博客写的, 这个 Pourquoi Pas。过来打个招呼。
Python 交叉验证的完整指南及示例
Sklearn 的 KFold,洗牌,分层,以及它对训练集和测试集中数据的影响。
sklearn 交叉验证的示例和用例,解释了 KFold、洗牌、分层以及训练集和测试集的数据比率。
使用两个折叠的源数据的示例性分割,图标由 Freepik 提供
交叉验证是机器学习中的一个重要概念,它在两个主要方面帮助了数据科学家:它可以减少数据的大小并确保人工智能模型足够健壮。交叉验证是以消耗资源为代价的,所以在决定使用它之前,理解它是如何工作的是很重要的。
在本文中,我们将简要回顾交叉验证的好处,然后我将使用流行的 python Sklearn 库中的各种方法向您展示详细的应用。我们将学习:
- 什么是折叠、洗牌折叠和分层折叠,看看它们有什么不同
- 如何使用 cross_validate 和 cross_val_score 方法在没有 KFold 的情况下交叉验证您的模型
- 其他的分割选项是什么——重复折叠、离开和离开,以及分组折叠的用例
- 考虑目标和特征分布有多重要
好处 1:减少数据量
通常你把数据分成三组。
- 训练:用于训练模型,优化模型的超参数
- 测试:用于检查优化后的模型对未知数据的作用,测试模型的泛化能力
- 验证:在优化过程中,关于测试集的一些信息通过您选择的参数泄露到模型中,因此您对完全未知的数据执行最终检查
在流程中引入交叉验证有助于减少对验证集的需求,因为您可以对相同的数据进行训练和测试。
五重交叉验证数据分割示例。
在最常见的交叉验证方法中,您使用部分训练集进行测试。这样做几次,以便每个数据点在测试集中出现一次。
好处 2:强大的流程
尽管 sklearn 的 train_test_split 方法使用分层分割,这意味着训练和测试集具有相同的目标变量分布,但您可能会意外地在不反映真实世界的子集上进行训练。
想象一下,你试图通过一个人的身高和体重来预测他是男是女。有人会认为,更高更重的人更愿意是男性;尽管如果你非常不幸,你的训练数据将只包含矮个子男人和高个子亚马逊女人。由于交叉验证,您可以执行多个 train_test 分割,虽然一个折叠可以获得非常好的结果,但另一个折叠可能表现不佳。任何时候一个分割显示出不寻常的结果,就意味着你的数据有异常。
如果你的交叉验证分割没有达到相似的分数,你已经错过了一些重要的数据。
Python 中的交叉验证
你总是可以编写自己的函数来分割数据,但是 scikit-learn 已经包含了 10 种分割数据的方法,这让你可以处理几乎任何问题。
让我们开始编码吧。你可以在 github 上下载完整的例子。
首先,让我们创建一个简单的数字范围,从 1,2,3 … 24,25。
# create the range 1 to 25
rn = range(1,26)
那么我们就启动 sklearn 的 Kfold 方法不洗牌,这是如何拆分数据最简单的选择。我将创建两个 Kfolds,一个将数据分割 3 次,另一个进行 5 次折叠。
from sklearn.model_selection import KFoldkf5 = KFold(n_splits=5, shuffle=False)
kf3 = KFold(n_splits=3, shuffle=False)
如果我将我的范围传递给 KFold,它将返回两个列表,包含属于训练集和测试集的数据点的索引。
# the Kfold function retunrs the indices of the data. Our range goes from 1-25 so the index is 0-24for train_index, test_index in kf3.split(rn):
print(train_index, test_index)
KFold 回报指数
KFold 返回索引,而不是真正的数据点。
因为 KFold 返回索引,如果你想看到真实的数据,我们必须在 NumPy 数组中使用np.take
或者在 pandas 中使用.iloc
。
# to get the values from our data, we use np.take() to access a value at particular indexfor train_index, test_index in kf3.split(rn):
print(np.take(rn,train_index), **np.take**(rn,test_index))
您必须使用 np.take(index)来定位真正的数据点
KFold 如何拆分数据?
为了更好地理解 KFold 方法是如何划分数据的,让我们用图表来展示它。因为我们已经使用了shuffled=False
,第一个数据点属于第一个折叠中的测试集,下一个也是。测试和训练数据点排列得很好。
未折叠的 KFold 具有 5 和 3 个折叠,在 github 上显示代码
重要的是,折叠的数量会影响测试集的大小。对 33%的数据进行 3 次折叠测试,而对 1/5(相当于 20%的数据)进行 5 次折叠测试。
每个数据点在测试集中出现一次,在训练集中出现 k 次
洗牌折叠
您的数据可能遵循特定的顺序,按出现的顺序选择数据可能会有风险。这可以通过将 KFold 的 shuffle 参数设置为True
来解决。在这种情况下,KFold 将随机选取将成为训练和测试集一部分的数据点。或者准确地说,不是完全随机的,random_state
影响每组中出现的点,并且相同的random_state
总是导致相同的分割。
具有不同随机状态的 5 倍混洗分裂
使用真实数据集的折叠
在处理实际问题时,很少会有一个小数组作为输入,所以让我们看看使用众所周知的 Iris 数据集的实际例子。
鸢尾(CC BY _ SA 3.0)海滨鸢尾 ( CC BY_SA 4.0 )和杂色鸢尾 ( CC BY_SA 3.0 ),来源维基百科
鸢尾数据集包含 3 种鸢尾花的花瓣和萼片大小的 150 个测量值——50 个鸢尾、50 个海滨鸢尾和 50 个杂色鸢尾
熊猫虹膜数据集样本
当 KFold 交叉验证遇到问题时
在 github 笔记本中,我只使用一个折叠进行了测试,在训练集和测试集上分别达到了 95%和 100%的准确率。当三重分割的结果正好是 0%的准确度时,我感到很惊讶。你读得很好,我的模型没有选择一朵花是正确的。
i = 1
for train_index, test_index in kf3.split(iris_df):
X_train = iris_df.iloc[train_index].loc[:, features]
X_test = iris_df.iloc[test_index][features]
y_train = iris_df.iloc[train_index].loc[:,'target']
y_test = iris_df.loc[test_index]['target']
#Train the model
model.fit(X_train, y_train) #Training the model
print(f"Accuracy for the fold no. {i} on the test set: {accuracy_score(y_test, model.predict(X_test))}")
i += 1
机器学习模型的准确率在每次折叠时为 0%。为什么?
还记得 unshuffled KFold 按顺序挑选数据吗?我们的数据集包含 150 个观察值,前 50 个属于一个物种,51-100 个属于另一个物种,剩下的属于第三个物种。我们的 3 折模型非常不幸,总是选择两个虹膜的尺寸,而测试集只包含模型从未见过的花。
First fold 未能识别测试集中的鸢尾,因为它在 virginica 和 versicolor 上进行了训练,所以从未见过该测试集。
shuffled KFold 是理想的吗?
为了解决这个问题,我们可以改变shuffled=True
参数并随机选择样本。但这也遇到了问题。
这些组是不均衡的,有时我们在测试很多版本的时候会在很多场景下训练
各组仍然不平衡。在测试不同类型的样本时,您通常会对一种类型的大量样本进行训练。让我们看看我们能做些什么。
分层折叠
在许多情况下,在训练集和测试集中保持相同的样本分布是很重要的。这是通过分层折叠来实现的,分层折叠可以再次洗牌或不洗牌。
样本在第三次洗牌和未洗牌的 StratfiedKFold 中的分布
每个折叠中的训练集和测试集的大小—分层平衡分布
你可以看到 KFold 把数据分成了几组,每一组都保持了相应的比率。StratifiedKFold 反映了目标变量的分布,即使某些值在数据集中出现得更频繁。但是,它不评估输入测量值的分布。我们将在最后详细讨论这个问题。
我需要每次都拆分我的数据吗?
要享受交叉验证的好处,您不必手动分割数据。Sklearn 提供了两种使用交叉验证的快速评估方法。cross-val-score
返回模型分数列表,cross-validate
也报告训练次数。
# cross_validate also allows to specify metrics which you want to see
for i, score in enumerate(cross_validate(model, X,y, cv=3)["test_score"]):
print(f"Accuracy for the fold no. {i} on the test set: {score}")
交叉验证函数的结果
其他 sklearn 拆分选项
除了上面提到的功能之外,sklearn 还提供了一系列其他方法来帮助您解决特定的需求。
重复的 Kfold 将创建多种组合的训练测试分割。
常规折叠和重复折叠的比较
虽然常规的交叉验证可以确保您在测试集中看到每个数据点一次,但是 ShuffleSplit 允许您指定在每个折叠中选择多少个特征进行测试。
Kfold 将每个数据点放入测试集中一次,而使用 ShuffleSplit,您可以设置%的数据进行测试。这里设置为 50%。
LeaveOneOut 和 LeavePOut 解决了其他特殊情况下的需要。第一种方法总是只在测试集中留下一个样本。
LeaveOneOut 在每个文件夹中只将单个值放入测试集。
一般来说,大多数作者和经验证据表明,5 倍或 10 倍交叉验证比 LOO 更可取。— sklearn 文档
集团 Kfolds
当您从同一个主题获取多个数据样本时,GroupKFold 就有了用武之地。例如来自同一个人的不止一次测量。来自同一组的数据很可能表现相似,如果你在一个测量上训练,在另一个上测试,你会得到一个好的分数,但这并不能证明你的模型概括得很好。GroupKFold 确保整个组要么去训练,要么去测试集。在 sklearn 文档中阅读更多关于组的信息。
时序数据
涉及时间序列的问题对数据点的顺序也很敏感。根据现有知识猜测过去通常比预测未来容易得多。因此,在预测较新的数据时,总是向时间序列模型提供较旧的数据是有意义的。Sklearn 的 TimeSeriesSplit 正是这么做的。
分层是否考虑输入特征?
还有最后一件事需要强调。你可能认为分层分裂会解决你所有的机器学习问题,但这不是真的。StratifiedKFold 确保在训练集和测试集中保持相同的目标比率。在我们的例子中,每种类型的虹膜有 33%。
为了证明这一点,在一个不平衡的数据集上,我们将看看流行的 Kaggle 泰坦尼克号竞赛。你的目标是训练一个人工智能模型,预测泰坦尼克号沉没时乘客是死是活。让我们看看 StratiffiedKFold 如何在每个折叠中划分数据集中的幸存者和受害者。
训练集和测试集中的目标变量比率相同
看起来不错,不是吗?但是,您的数据仍可能被不正确地拆分。如果您查看关键特征的分布(我特意选择这种分布来证明我的观点,因为通常只需对数据进行洗牌就可以获得更加平衡的分布),您会发现您通常会尝试基于不同于测试集的训练数据来预测结果。例如,如果你观察训练集和测试集中的性别分布。
女性更有可能从船上的悲剧中幸存下来。当第一个折叠学习一些雌性并试图预测许多的存活时,第三个折叠做相反的事情。
交叉验证至少有助于你认识到这个问题,以防模型的分数对于每个折叠有显著的不同。想象一下,你是如此不幸,只使用了一个完全符合你的测试数据的分割,但是在现实世界中却灾难性地失败了。
平衡数据是一项非常复杂的任务,这样就可以根据理想分布进行训练和测试。许多人认为这是不必要的,因为模型应该足够好地概括未知数据。
尽管如此,我还是鼓励你考虑一下特性的分布。想象一下,你有一家商店,顾客大多是男性,你试图使用针对女性的营销活动的数据来预测销售额。这对你的店来说不是最好的模式。
结论
训练-测试分离是许多机器学习任务中的一个基本概念,但如果你有足够的资源,可以考虑对你的问题应用交叉验证。这不仅有助于你使用更少的数据,而且不同文件夹上不一致的分数表明你已经错过了数据中的一些重要关系。
Sklearn 库包含一堆方法来拆分数据,以适应您的人工智能练习。你可以创建基本的 KFold,打乱数据,或者根据目标变量对它们进行分层。您可以使用额外的方法,或者只使用cross-validate
或cross-val-score
测试您的模型,而不需要手动拆分数据。在任何情况下,你的结果分数应该显示一个稳定的模式,因为你不希望你的模型依赖于“幸运”的数据分割来表现良好。
所有数据、图表和 python 处理都总结在 github 上的笔记本中。
一个数据集和 70 多个图表。交互性和动画通常只需一行代码。
towardsdatascience.com](/visualization-with-plotly-express-comprehensive-guide-eb5ee4b50b57)
# did you like the tutorial, check also* [Pandas alternatives - Vaex, Dash, PySpark and Julia - and when to use them](/is-something-better-than-pandas-when-the-dataset-fits-the-memory-7e8e983c4fe5)
* [Persist pandas in other formats than CSV](/stop-persisting-pandas-data-frames-in-csvs-f369a6440af5)
* [Read CSV in Julia, an alternative to python](/read-csv-to-data-frame-in-julia-programming-lang-77f3d0081c14)
* [How to turn list of addresses or regions into a map](/pythons-geocoding-convert-a-list-of-addresses-into-a-map-f522ef513fd6)
* [Various application of anomaly detection](https://medium.com/@vdekanovsky/machine-learning-saving-machines-cbb715de70b7)
* [How to deal with extra whitespaces in CSV using Pandas](/dealing-with-extra-white-spaces-while-reading-csv-in-pandas-67b0c2b71e6a)