甜蜜的家乡芝加哥:审视芝加哥市的犯罪
数据驱动的方法。
由泰勒娃娃,杰夫格林,加齐莫舍德
这篇论文最初是为我大学的数据库课提交的。我们发现它很有趣,我们在它上面花了很多时间,所以我想在这里分享一下。它已被编辑成这种格式。
简介
芝加哥市通常被称为“风城”或“第二大城市”。它经常以它的食物而闻名,包括深盘比萨饼和芝加哥热狗。不幸的是,芝加哥也因其高犯罪率而臭名昭著,而且经常发生暴力性质的犯罪。由于芝加哥市各种犯罪的数据的可用性,我们选择检查芝加哥的犯罪,以确定我们可以从分析数据集得出什么信息。我们很想知道这个城市最常见的犯罪是什么,如果那些高犯罪率每年都有变化,以及不同犯罪的逮捕率是多少。虽然这个数据集可能不包含最令人振奋的信息,但我们认为分析并尝试确定芝加哥是否真的像媒体描绘的那样暴力是有趣的。
数据
我们选择的数据是一个数据集,包含了芝加哥市过去 5 年的犯罪信息。我们认为这将是一个有趣的数据集,因为除了观察芝加哥市的犯罪情况外,我们还可能发现数据中令人信服的趋势。这些数据包括但不限于犯罪日期、犯罪发生的街区、社区区域、伊利诺伊州统一犯罪报告代码(IUCR)、联邦调查局统一报告代码以及报告犯罪的警官的巡逻。该数据集是在 Kaggle 上发现的,该数据集被认为是在知识共享许可 CC0 1.0 公共领域下获得许可的,这意味着我们可以使用这些数据而无需任何进一步的批准。我们总共有四个表,但是其中一个表是用于保存非标准化数据的临时表。在检查完数据并开始对其进行规范化之后,我们最终得到了 3 个主表:芝加哥犯罪数据、芝加哥 IUCR 代码、芝加哥公共区域(邻域)和一个自动生成的 chicago_crime_data 序列表。芝加哥犯罪数据表中的信息和属性在很大程度上是不言自明的。然而,IUCR 表的属性可能需要一点解释。该表中的 id 与 Chicago crime 数据表中使用的 IUCR 代码相匹配。此 id 附加到犯罪的主要描述和次要描述。例如,基于主要描述和次要描述的组合有不同的 id。下面的例子是凶杀案。虽然这三种犯罪都有相同的主要类型,但它们有不同的次要类型和 id。
id | primary_desc | secondary_desc
— — — + — — — — — — — -+ — — — — — — — — — — — — —
0110 | HOMICIDE | FIRST DEGREE MURDER
0141 | HOMICIDE | INVOLUNTARY MANSLAUGHTER
0142 | HOMICIDE | RECKLESS HOMICIDE
为了便于解释每个表所使用的属性和数据类型,我们在下面包含了两个表模式,它们也包含主键和外键:
Table “chicago_crime_data” Column | Type
— — — — — — — — — — — + — — — — — — — — — — — — — — —
id | integer
date | timestamp without time zone
block | text
iucr | text
location_description | text
arrest | boolean
domestic | boolean
community_area | integer
fbi_code | text
latitude | double precision
longitude | double precision
Indexes:
“chicago_crime_data_pkey” PRIMARY KEY, btree (id)
Foreign-key constraints:
“chicago_crime_data_community_area_fkey” FOREIGN KEY (community_area) REFERENCES chicago_common_area(id)
“chicago_crime_data_iucr_fkey” FOREIGN KEY (iucr) REFERENCES chicago_iucr_code(id) Table “chicago_iucr_code”
Column | Type
— — — — — — — — + — — —
id | text
primary_desc | text
secondary_desc | text
Indexes:
“chicago_iucr_code_pkey” PRIMARY KEY, btree (id)
Referenced by:
TABLE “chicago_crime_data” CONSTRAINT “chicago_crime_data_iucr_fkey” FOREIGN KEY (iucr) REFERENCES chicago_iucr_code(id)
结果
我们在数据库上执行的大多数查询都与特定犯罪的数量和不同犯罪的地点有关。尽管我们希望对数据执行各种各样的查询,但总的来说,我们希望将重点放在犯罪数量上,并使用这些信息来确定哪些犯罪发生得最频繁。我们还调查了哪些犯罪的被捕率最高,以及它们在芝加哥的位置。
Figure 1: Chicago’s Crimes 2014–2018
在这里,我们希望发现犯罪的总数,而不考虑其严重性或细节。从图表中我们可以看出,在过去的几年里,盗窃是芝加哥最严重的犯罪,其次是殴打。
Figure 2: Chicago’s Crimes in 2018
Figure 3: Chicago’s Crimes 2017
从图 2 和图 3 中,我们可以看出,在过去的两年中,盗窃是芝加哥犯罪率最高的犯罪。除了这些可视化,我们还查看了从 2014 年开始的前几年的图表。我们可以利用这些图表得出结论,事实上盗窃是最常见的犯罪,并且在过去几年中没有出现激增。
我们也想看看这些犯罪在芝加哥附近的分布情况。这一数据对芝加哥的新来者很有用,他们试图找到一个犯罪率较低的社区居住,同时远离犯罪率最高的社区。描述每个社区遭受的犯罪类型也是有用的。我们在下面的查询中找到了犯罪最少和最多的区域,我们还查看了犯罪分布。
Figure 4: Chicago’s least crime prone neighborhood query and its crime distribution
Figure 5: Chicago’s most crime prone neighborhood query and its crime distribution
此外,我们还可以根据用户的请求查询和显示特定社区的犯罪分布情况。
Figure 6: Arrest rate for different types of assault
根据这些数据,我们可以准确计算出人们因特定犯罪而被捕的频率。例如,我们可以看到,对于不同类型的攻击指控,超过 80%的人被指控严重藏毒:手无/分钟伤害被逮捕。这与类似持枪恶意攻击的情况相比很有意思,后者的逮捕率只有 20%左右。
Figure 7: Assaults in Chicago in 2018
我们也可以看到犯罪的具体地点。图 7 显示了自 2017 年 1 月 1 日以来所有已知地点的袭击事件。然而,图表没有区分不同类型和严重性的攻击。不管怎样,可以肯定地说芝加哥存在人身攻击问题。
Figure 8: Homicides in Chicago in 2018
利用位置数据,我们可以确定整个芝加哥凶杀案高度集中的区域。这里的杀人罪包括一级,二级,过失杀人。
Figure 9: Prostitution in Chicago since 2014
一个相当有趣的图表是整个芝加哥与卖淫有关的犯罪。我们在这里可以看到,相关的犯罪似乎是在独特的线模式,最有可能代表整个城市的各种街道。
技术挑战
获得数据后,我们遇到的唯一主要问题是将数据集从 Kaggle 加载到数据库中。数据集作为 BigQuery 数据集存储在 Kaggle 中,这要求我们使用 Kaggle 内核从数据库中下载有限的数据集。我们选择下载过去 5 年的数据,因为这给了我们一个大数据集来处理。在我们成功地获得数据之后,我们在将数据插入临时表时遇到了问题。我们认为这里的大部分问题源于数据集的大小,它包含了超过 130 万行。当尝试接收如此大量的数据时,我们使用的 Windows 机器出现了内存错误,并且没有确定补救的方法。然而,当数据在 Mac 上接收时,我们没有遇到这些问题。为了解决内存错误问题,我们使用 Mac 将数据集加载到数据库中,然后通过我们在 Piazza 上找到的方法向团队的其他成员提供对表的访问。当试图只关注月份而忽略其他月份时,我们还遇到了时间戳字段查询的问题。幸运的是,我们能够使用 EXTRACT 命令做到这一点。
结论
在分析了图表和其他图像后,我们可以得出这样的结论:芝加哥是一个非常危险的城市,实际上就像媒体描述的那样暴力。光是袭击的数量就已经相当惊人了,更不用说杀人率了。在项目中使用这些数据使作业变得有趣,尽管它不是最令人愉快的数据集。我们觉得使用这个数据集将类似于我们在可能的行业就业中可能必须处理的数据,所以这个任务给了我们对未来就业有帮助的经验。
符号 vs 连接主义人工智能。
随着神经网络等连接主义技术的流行,主要竞争对手符号人工智能被证明是需要动态适应、可验证性和可解释性的任务关键型应用程序的正确战略补充。
Photo by Pablo Rebolledo on Unsplash
似乎只要有两种类型,人们就会很快选择其中一种,然后将两者对立起来。人工智能技术传统上分为两类;象征性人工智能和连接主义人工智能。后一种人工智能随着最近的成功故事和媒体炒作而变得非常受欢迎,没有人会因为认为它们就是人工智能的全部而受到责备。甚至有一些人散布虚假信息来转移对更经典的人工智能研发的注意力和资金。
事实是,每一套技术都有它的位置。目前还没有一种银弹人工智能算法,试图对所有问题使用相同的算法是非常愚蠢的。每种工具都有自己的优点和缺点,选择合适的工具是关键。
什么是象征性人工智能?
这类技术有时被称为 GOFAI(传统的人工智能)。这并不意味着这些技术已经过时或停滞不前。更经典的方法是对问题的模型进行编码,并期望系统根据该模型处理输入数据以提供解决方案。
随着人们认识到基于人工智能的系统要在某些高风险领域被接受,它们的行为需要是可验证的和可解释的,对符号技术的需求最近引起了新一轮的兴趣。这通常很难通过连接主义者算法来实现。
属于这一类的系统通常涉及演绎推理、逻辑推理和某种搜索算法,这种算法在特定模型的约束下找到解决方案。这些包括专家系统,它使用规则和决策树从输入数据中推导出结论,约束解算器,它在可能性空间内搜索解决方案,以及计划系统,它试图找到一系列行动,以从某个初始状态实现明确定义的目标。他们通常还有能够处理不确定性和风险的变种。
A MiniMax Game Tree for Tic-Tac-Toe. (Image Source)
这种算法通常具有算法复杂性,即 NP-hard 或 更糟的是 **,**在试图解决现实世界的问题时面临超大规模的搜索空间。这意味着经典的穷举盲搜索算法将不起作用,除了小的人为限制的情况。相反,最不可能找到解决方案的路径被从搜索空间中剔除,或者尽可能长时间不被探索。
这一类别中有太多的技术。分支定界算法处理启发式算法不可用的优化或约束满足问题,通过上限和下限划分解决方案空间,并在该分区内搜索解决方案。局部搜索着眼于一个解决方案的相近变体,并试图逐步改进它,偶尔执行随机跳跃,试图逃离局部最优。元启发式包含了这种技术的更广阔的前景,其中进化算法模仿自然界中发现的分布式或协作机制,例如自然选择和群体启发行为。
启发式搜索使用评估函数来确定一个状态与目标的接近度,使用比试图找到完整解决方案更便宜的估计值来计算。一个值得注意的独立于领域的启发式方法是 松弛 ,其中算法忽略了一些约束或可能的现实世界挫折以在更松弛的世界中找到更快的解决方案。这被用作在搜索的每个决策点做出更明智选择的指导。一个既 可接受 (永远不会高估成本)又信息丰富的好的启发式算法可以引导诸如 A* 的算法找到最优解,但不幸的是这样的启发式算法通常不容易获得。对于复杂的问题,找到一个满足所有约束的可行的解决方案,尽管不是最优的,也已经是一个很大的壮举了。
A* Heuristic Search for finding Shortest Path (Image Source: Wikipedia)
虽然有些技术也可以处理部分可观测性和概率模型,但是它们通常不适合有噪声的输入数据,或者模型没有很好定义的情况。它们在这样的场景中更有效,即在某些情况下采取特定的行动可能是有益的或灾难性的,并且系统需要提供正确的机制来显式编码和执行这样的规则。
符号算法消除了违反指定模型的选项,并且可以被验证总是比它们的连接主义对应物更容易产生满足所有约束的解决方案。由于通常很少或没有算法训练,模型可以是动态的,并根据需要快速变化。
什么是连接主义者人工智能?
Connectionist A.I .的名字来源于典型的网络拓扑,这一类中的大多数算法都采用这种拓扑。这一类别中最流行的技术是人工神经网络(ANN)。这由多层节点组成,称为神经元,它们处理一些输入信号,用一些权重系数将它们组合在一起,然后挤压它们以馈送到下一层。支持向量机也属于连接主义范畴。
人工神经网络有各种形状和大小,包括卷积神经网络(成功用于图像识别和位图分类),以及长短期记忆网络(通常用于时间序列分析或时间是重要特征的问题)。深度学习本质上也是人工神经网络的同义词。
A neuron of an Artificial Neural Network. (Image source: Wikipedia)
这类技术的关键方面是用户不指定建模领域的规则。网络从训练数据中发现规则。用户提供输入数据和样本输出数据(数据集越大越多样化越好)。然后,连接主义算法应用统计回归模型来调整中间变量的权重系数,直到找到最佳拟合模型。使用梯度下降等技术,在最小化所有训练数据点的累积误差的方向上调整权重。
由于这些技术是有效的误差最小化算法,它们对噪声具有固有的弹性。它们将消除异常值,并汇聚成一个解决方案,在一定的误差范围内对数据进行分类。
这些算法不需要一个世界的模型。他们只需要足够的样本数据,从这些数据中可以统计性地推断出世界的模型。这是一个非常强大的特点,但也是一个弱点。必须非常仔细地选择输入特征。还必须对它们进行标准化或缩放,以避免一个特征压倒其他特征,并对其进行预处理,使其对分类更有意义。
特征工程本身就是一项神秘的技术,通常是决定机器学习项目成功的关键因素。拥有太多的特征,或者没有一个覆盖这些特征的大多数排列的代表性数据集,会导致过拟合或欠拟合。即使有最熟练的数据科学家的帮助,您仍然受到可用数据质量的支配。这些技术也不能免受维数灾难的影响,随着输入特征数量的增加,无效解决方案的风险就越高。
A Data Scientist sifting for Features — Photo by Artem Maltsev on Unsplash
数据驱动算法隐含地假设它们所捕捉的世界模型是相对稳定的。这使得它们对于游戏规则没有显著改变或者改变的速度慢到足以允许收集足够的新数据样本用于重新训练和适应新现实的问题非常有效。图像识别是教科书式的成功故事,因为从现在起一年后热狗很可能看起来还是一样的。
Photo by HBO / Twitter.com/TechatBloomberg
那么应该选择什么呢?
选择正确的算法很大程度上取决于你要解决的问题。一项技术因错误的原因而被选择,这变得非常普遍,通常是因为围绕该技术的炒作,或者缺乏对人工智能算法更广阔前景的认识。当你拥有的工具是一把锤子时,所有的东西看起来都像钉子。
随着人工智能扩散到我们生活的各个方面,需求变得更加复杂,一个应用程序很可能需要不止一种这样的技术。通过传感器收集的噪声数据可以通过人工神经网络进行处理,以推断出关于环境的离散信息,而符号算法使用这些信息来搜索可能的行动空间,这些行动可以在更抽象的逻辑级别上实现某些目标。
在一定概率水平内,机器学习算法在推断自动驾驶汽车的周围环境方面可能非常有效,但如果它可能使汽车驶下悬崖,那么这种错误的可能性是不可接受的,因为这种情况从未在样本训练数据中正确捕捉到。此外,将深度学习引入任务关键型应用程序被证明是具有挑战性的,特别是当一辆摩托车仅仅因为翻倒而被混淆为降落伞时。
覆盖一个符号约束系统可以确保逻辑上显而易见的东西仍然得到执行,即使底层的深度学习层由于一些统计偏差或嘈杂的传感器读数而另有说法。这对于高风险应用变得越来越重要,如管理发电站、调度火车、自动驾驶系统和空间应用。在这样的系统中错误分类的含义比推荐错误的电影要严重得多。
利用连接主义者和符号算法的混合系统将利用两者的优势,同时抵消彼此的弱点。单独使用一种技术的局限性已经被发现,最新的研究已经开始表明将两种方法结合起来可以产生更加智能的解决方案。
Josef Bajada 拥有计算机科学博士学位,专门研究规划和调度的人工智能技术。他是一名技术顾问,为物流和油田技术应用开发人工智能解决方案。上述文章中表达的任何观点纯属其个人观点,不一定代表任何附属机构的观点。
深度学习是如何推动社会公益的?
深度学习如何用于减少野生动物偷猎,帮助贫困农民提高产量,检测非法砍伐森林和拯救濒危语言。
本周图表!
Dragon-Leap! China is surging in AI patents, will it change her IP compliance history? On the other hand, the AI landscape in US is made up by just ~5 tech companies, with IBM being wolf-pack leader.
野生神经细胞
OpenCV to classify elephants with 98% accuracy
今天,几乎所有的保留森林都有照相机陷阱,每天产生数百小时的镜头和数千张图像。所有的语料库都发生了什么?一些人(大多没有报酬或报酬很低)手动分析它的一些基本模式,这总是如果濒危动物存在或不存在,如果一个意想不到的人被看到。庞大的数量造成了系统的滞后和低效率。大多数野生动物保护区仍然使用人工估算来进行动物普查;这会产生错误的数据,进而导致糟糕的决策。当我看到安东尼天真的 CNN 代码如何能探测到大象(为了象牙被大量捕杀)&可以帮助阻止偷猎;我突然意识到,人工智能更多的是想象力,而不是算法。它还可能有助于追踪动物的活动、栖息地的变化以及避免人类冲突。我希望将它扩展到老虎,并很快作为野生神经项目之一部署在老虎保护区。尽管如此,仍然有许多野生物种不需要太多关注! Git
迷失在翻译中
世界上大约有 7000 种语言,但大多数正在消亡。文化、故事以及与人类进化的联系也随之消亡。比如说;著名的丛林小说的发源地的语言——马迪亚正濒临灭绝。灭绝的主要原因是缺乏文字,因为大多数本土语言只是口头语言。技术革命使其更加边缘化。当所有的教育都只能用外语进行时,如何用自己的语言教育当地人就成了一个严重的难题?强迫当地人/部落学习现代语言可能看起来很高尚,但也被他们视为殖民主义。我们怎样才能让他们的语言变得容易理解,从而让他们感受到现代性? @ TeHiku 利用深度学习构建了第一个新西兰土著人毛利语语音识别系统。目标是训练机器转录数千小时的母语说话者音频记录,以便随着母语说话者人口的减少,语言学习者更容易理解母语 te reo 毛利人。Luxembergish 的项目也在进行中。 Github
绿色革命 2.0
60 年代的印度是一个长期挨饿的国家,总是乞求我们养活它饥饿的人群。尽管当时农业是最大的产业。问题?由于陈旧的方法导致产量低!60 年代末,印度在美国和墨西哥的帮助下采用了现代技术,这极大地提高了其粮食产量,甚至在养活了 10 亿人口后还能出口。这种农业技术的转变在印度被称为“绿色革命”。但不幸的是,从那以后,一切都没有改变。现在,它正面临一场由农作物歉收导致的新危机,每年约有 5 万农民自杀,而且这一情况还在恶化。一家德国公司使用作物图片,随后通过深度学习模型处理来预测植物疾病,结合其他特征,可以提供关于作物蠕虫流行病的进一步建议&产量。模型基于标准 CNN 算法。虽然全世界都在关注高风险的人类诊断,但这种低风险的植物诊断对人类的影响更大。完整故事 (5 分钟阅读)
当 AI 不够用的时候…
Keras based DL used to detect illegal mining in over 70,000 acres
非洲和拉丁美洲的非法采矿是个大问题。它不仅造成了致命的污染,还导致了当地人栖息地的丧失、收入掠夺、童工和人口贩卖。一家公司正在通过使用乌克兰的 Keras 进行图像分割来帮助检测这个国家的麻风病。雨林基金会在亚马逊提供无人机武装土著秘鲁人保护他们的栖息地。但是检测真的能治愈疾病吗?随着下面的视频故事展开,我们看到,虽然人工智能&无人机可以检测白天抢劫;在一个正义是奢侈品的社会里还是很无奈的。甚至在警察赤裸裸地看到之后,森林砍伐仍在继续。当他们没有法治和人权的时候,人工智能有用吗?不幸的是,对人工智能的大肆宣传似乎表明它是一种灵丹妙药,但却忘记了加上那颗星星——不是到处都适用的!如果社会建立在平等、自由和公正的基础上,它就能有效地运转。这不是悲观,而是现实检验,人工智能可能有所有的解决方案,但它不能取代人类的斗争!雨林副记 (7 分钟视频) Keras 项目
使用 AWS DMS 将 AWS RDS Postgres 同步到红移
实时仓库更新指南
免责声明:这篇文章假设你对编程有所了解。
Photo by Shahadat Rahman on Unsplash
问题是
当我们第一次开始了解 AWS 红移时,我们爱上了快速聚合查询处理。这种强大的优势意味着在执行统计研究或简单的数据提取时,我们的生产力和速度突飞猛进。所以,当然,我们把它变成了我们管理的所有数据源(Adwords、Salesforce、FBAds、Zendesk 等)的主数据仓库。)—所有这些,使用缝合作为我们主要的 ETL 工具。
RDS Postgres instance vs Redshift on the company’s everyday aggregated query performance time.
Stitch 有一个不错的 100 美元的订阅计划,为 500 万行提供处理能力,每增加 100 万行收费 20 美元。缝合日志和账单发票告诉我们,在一个非常繁忙的月份,使用上面提到的所有数据源,我们勉强达到了 180 美元。这些月份中的大部分只是普通的 100 美元(没有使用额外的百万行)。
我们公司开发、维护和销售其核心 SaaS 产品增卡。我们的生产数据库托管在 AWS 云中,驻留在 AWS RDS 中,每月存储 1000 万到 2000 万行新数据,并且还在大幅增长。
因此,通常情况下,对于一家第三世界的初创公司来说,使用 Stitch 将我们的生产数据库同步到红移仓库会被证明是极其昂贵的。另外考虑到我们国家的货币最近对美元贬值了很多。
Argentina’s Congress — Photo by Sander Crombach on Unsplash
我们还有另一个限制。该公司正在开发其第二个主要产品increacenconcicion。这一个使用 NoSQL Apache Cassandra 数据库来存储和处理其庞大的数据。问题是,两个产品必须同步,以便会议使用卡提取的交易。换句话说,我们必须建立一个可供任何服务消费的数据湖,以按需执行同步操作。
很多事情要考虑,对吧?
测试解决方案
作为一个 2 人的小团队,强大的“数据团队”,我们很容易尝试和测试新事物,尤其是架构。
我们从使用 AWS 数据管道开始,这是一种基于 UI 的服务,用于在一堆数据源之间构建 ETL。尽管构建 ETL 的过程相当简单,但是为了使它有效,我们必须采取一系列的变通方法——记住我们必须更新每一个变化,不管是插入、删除还是更新。由于这里不能使用代码,很快就变成了不可维护。此外,对于这项服务,IMO 没有太多详细的文档或清晰的示例。
我们尝试设置一个 Lambda,每 15 分钟消耗一次 Postgres 数据库的复制槽的日志,并将其发送到 Kinesis Firehose 数据流。在一个生产过程更新了比通常预期更多的行之前,它看起来似乎是安全可靠的。我们发现,在这些情况下,记录来自逻辑解码的方式是充满所涉及的表的大块更改的巨大行,导致函数每次试图加载它时都会因内存不足而死亡。我们通过将true
设置为逻辑解码插件的属性write_in_chunks
来解决这个问题,我们使用(wal2json),使我们能够对传入的 json 日志进行分区。长话短说,由于没有足够的时间来处理巨额交易,该功能仍可能终止不成功。不好的消息。
你来这里做什么
好吧,让我们开始吧。
Architecture diagram — Made with Lucidchart
我们当前的架构包括以下内容:
- DMS(数据库迁移服务)实例复制对红移和 S3 的持续更改。
- 红移源端点。
- DMS 使用 S3 桶作为目标端点。
- 每次在上述 S3 桶中创建对象时触发的 Lambda。
- (可选)订阅同一对象创建事件的 SNS 主题。这使您能够订阅该主题的任何内容,例如,多个 lambdas。更多信息,请点击此链接。
为了让这篇文章更“民主”,我会把它分成两部分。第一个是将变化直接复制到红移的步骤。第二,建立 S3 数据湖供其他服务使用。你可以随意阅读其中一个,或者更好的是,两个都读😄。
首先,启用逻辑解码
由于我不认为自己比编写 AWS 文档的人聪明,我将复制粘贴他们的一些说明如下🤷♂.
找到您的 RDS 实例,查找该实例应用的参数组。使用以下命令直接复制或修改参数组。
1.-将
*rds.logical_replication*
静态参数设置为 1。作为应用该参数的一部分,我们还设置了参数*wal_level*
、*max_wal_senders*
、*max_replication_slots*
和*max_connections*
。这些参数更改会增加 WAL 生成,因此您应该只在使用逻辑插槽时设置*rds.logical_replication*
参数。2.-重新启动 DB 实例以使静态
*rds.logical_replication*
参数生效。
重启后,我们应该准备好了。测试一切是否正常的一个好方法是在数据库控制台上运行下面一行。
increasecard=> show wal_level;
wal_level
-----------
logical
(1 row)
将变化直接复制到红移
首先,我们必须创建任务将要使用的资源。创建端点(源和目标)和复制实例(基本上是负责所有脏工作的 EC2 实例)。
创建复制实例的过程非常简单,所以我不赘述,只需确保使用能够访问您打算使用的源和目标的 VPC。
对于源端点,勾选类似“*选择一个 RDS 实例”*的选项,并有效地选择您的源数据库并填充凭证字段。
对于目标端点,选择红移并在所有文本框中填入主机、端口和凭证。
太好了,现在我们已经有了我们需要的一切,让我们创建一个任务来迁移和复制的东西。
在 DMS 中,按下 Ccreate Task按钮,给它起一个有趣的名字,并开始选择我们之前创建的所有资源。对于迁移类型选择迁移现有数据并复制正在进行的更改,这将首先执行完全迁移,然后开始复制目标数据库上正在进行的 CRUD 操作。
在选择部分,选择您想要使用的任何模式/表,在我的例子中,我将只复制一个模式中的每个更改——此外,检查表是否有主键,如果它们没有主键,DMS 可能会出错。使用 % 字符作为通配符(即*“所有包含单词‘foo’的表格都将是* *table = %foo%*
)。
该任务还可以有转换规则,它使您能够,例如,在目标目的地上更改模式或表名。
准备好让给松绑了吗?点击创建任务按钮并等待它开始——或者如果您选择在创建时不开始,则启动它。现在的任务是将表完全加载到目的地,然后开始复制更改。当完成迁移时,您应该看到加载完成,复制正在进行作为其状态。
aaaaaaand…
*瞧,*搞定!。你的红移仓库现在被你的生产 RDS 数据丰富了,干得好!。此时,如果出现任何问题,您可以随时启用 DMS 任务的日志记录功能来查看发生了什么😄,只要考虑到 Cloudwatch 计费。
您还可以查看 DMS 任务提供给我们的一些有用的图表。
Screenshot of dashboard of migrating task metrics — AWS DMS
下一节将讨论为其他服务创建 S3 数据湖,以消耗数据库更改。如果你现在要离开,感谢你的阅读,我希望这篇文章对你有用。
构建你的 S3 数据湖
创建和测试 DMS 任务以创建我们的 S3 数据湖
和以前一样,创建一个任务,它不是作为目标目的地的红移,而是一个 S3 桶。
对于目标端点,预先创建一个 S3 存储桶,只需输入存储桶的名称和相应的角色就可以访问它。考虑到服务角色应该有以下策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::<name-of-bucket>"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<name-of-bucket>"
]
}
]
}
在附加参数部分,输入以下addColumnName=true;
,包括之前的参数或您可能想要使用的其他参数。
在这种情况下,选择仅复制数据更改作为迁移类型,我们不想让以前的数据充斥我们的 S3 存储桶。
Screenshot of AWS DMS task creation
有关使用 S3 作为 DMS 目标的更多信息,请单击此处的。
Image by Etienne Marais on Pixabay
好了,真相时刻,运行你的小弗兰肯斯坦宝贝。
任务的状态应该是正在复制。否则,检查与复制实例相关的日志,查看 Cloudwatch 服务中的错误。
从现在开始,如果您正在使用一个临时数据库实例(我希望您是这样),那么创建、更新和删除一些行,以便任务能够复制更改。这将有望以您在目的地端点中指定的 S3 存储桶中的 csv 文件结束。
该文件应该类似于:
Op, id, field..fields
I, 1, ...
D, 2
U, 3, ...
如果你不是,这里我们称之为 *salame,*你会意识到 I 代表插入, D 代表删除, U 代表更新。
构建 Lambda 函数
你期待已久的时刻。这是我们编写函数的地方,该函数将解析在我们的 bucket 上创建的 CSV 文档。
对于这一部分,我建议您使用无服务器,这是一个很好的工具,可以使用您的 AWS CLI 凭证轻松部署 Lambda 函数。就像写一个.yml
文件,点击serverless deploy
和瞧那么简单。
现在,让我们创建我们的 Lambda 函数,然后添加 S3 桶事件,以便在每次创建对象时触发该函数。另外,如果你已经指定了文件将被创建在一个特定的文件夹中,你可能想要添加一个前缀,只要把folder/
放在前缀文本框中,你就可以开始了。
Screenshot of AWS Lambda
让我们编写一部分函数,它将从 bucket 中上传的文件中接收和提取数据。
所以,我们首先要做的是构建我们的处理程序函数,你知道,通常的main()
但是委婉地说。
这个主函数将接收 Cloudwatch 处理的 JSON 事件作为参数,基本上是说"哟,桶中创建了一个新文件,这是访问它的键。"
这是 AWS 给我们的示例事件。
下面我粘贴了 Python 代码,用来获得在 S3 创建的文件的最终内容。
现在在file_content
变量中有了 CSV 的数据。如果你有使用解析器的经验,这应该是小菜一碟,如果你没有,我推荐你查看这个链接。
从现在开始,就看你的了。使用 python 驱动程序来处理 CRUD 操作,处理 CSV 中影响红移变化的每一行。在这种情况下,我建议使用像execute_values()
(psycopg2)这样的函数来最小化执行时间,如这里的所解释的。使用 Lambda 环境变量来处理函数要使用的凭证机密,记住硬编码它们不是一个好主意。
一般性结论
我呈现给你的,只是实现数据库同步目标的千万种可能中的一种。如果你不介意花几百块💸在为你处理 ETL 过程的服务上,去做吧。不,真的,去吧。
这个架构给我们带来了两个积极的副作用。首先,拥有关于生产数据库变化的跟踪信息,这是绝对不必要的。如今有了像 AWS Athena 和 Glue 这样的服务,你可以直接通过控制台查询数据。第二个是通过 S3 桶对象创建事件连接/触发任何过程的能力——在我们的例子中,increase cilica ción团队复制他们自己的 Cassandra 数据库中的变更。
我们已经结束了,希望你喜欢我的第一篇文章😄
Python 中的同义词和反义词
文本挖掘—提取同义词和反义词
Photo by micah boswell on Unsplash
语言分析可以通过多种方式进行。在这篇博客中,我们将看到如何使用自然语言处理(NLTK) WordNet 库从文本中提取同义词和反义词。
Source: Vincent Russo
WordNet 是 Python 自然语言工具包的一部分。它是英语中大量单词和词汇的集合,这些单词和词汇相互关联,并以某种方式进行分组。相似词的集合称为词条。此外,它是字典和同义词库的结合。它用于自动文本分析和人工智能应用。它在其集合中支持许多其他语言。请点击查看更多关于 WordNet 的信息
名词、动词、形容词和副词被分成认知同义词组(同义词组),每个同义词组表达一个不同的概念。同素集通过概念语义和词汇关系相互联系。让我们看一些例子
找到这个词的意思
密码
导入 NLTK 库并安装 Wordnet
import nltk
nltk.download('wordnet')
在这个例子中,我们将看到 wordnet 如何返回单词的含义和其他细节。让我们继续查找单词“旅行”
有时,如果有一些例子,它也可以提供。
**#Checking the word "Teaching"**syn = wordnet.synsets(“teaching”)
syn
输出
[Synset('teaching.n.01'),
Synset('teaching.n.02'),
Synset('education.n.01'),
Synset('teach.v.01'),
Synset('teach.v.02')]
我们可以看到,“教”有五层含义。让我们找到第一种感觉,以便更好地理解每个 synset 包含的信息种类。我们可以通过在其名称处索引第一个元素来做到这一点。n,v 代表词性标注。
密码
**# Printing the Synonym, meaning and example of "teaching" for the first two indexes****#First Index**print(‘Word and Type : ‘ + syn[0].name())
print(‘Synonym of teaching is: ‘ + syn[0].lemmas()[0].name())
print(‘The meaning of the teaching: ‘ + syn[0].definition())
print(‘Example of teaching : ‘ + str(syn[0].examples()))**#Second Index**
print(‘Word and Type : ‘ + syn[1].name())
print(‘Synonym of teaching is: ‘ + syn[1].lemmas()[0].name())
print(‘The meaning of the teaching : ‘ + syn[1].definition())
print(‘Example of teaching : ‘ + str(syn[1].examples()))
输出
**# Output for first index**Word and Type : teaching.n.01
Synonym of Teaching is: teaching
The meaning of the Teaching: the profession of a teacher
Example of Teaching : ['he prepared for teaching while still in college', 'pedagogy is recognized as an important profession']**# Output for second index**Word and Type : teaching.n.02
Synonym of Teaching is: teaching
The meaning of the Teaching : a doctrine that is taught
Example of Teaching : ['the teachings of religion', 'he believed all the Christian precepts']
同义词
我们可以使用 synset 的**lemmas()**
函数。它返回该特定同义词集的同义词和反义词。
密码
**#Checking synonym for the word "travel"**
from nltk.corpus import wordnet#Creating a list
synonyms = []for syn in wordnet.synsets("travel"):
for lm in syn.lemmas():
synonyms.append(lm.name())#adding into synonyms
print (set(synonyms))
输出
{'trip', 'locomote', 'jaunt', 'change_of_location', 'go', 'traveling', 'travelling', 'locomotion', 'travel', 'move', 'journey', 'move_around'}
我们可以从上面的输出中看到单词“travel”的同义词。
反义词
密码
**#Checking antonym for the word "increase"**
from nltk.corpus import wordnet
antonyms = []for syn in wordnet.synsets("increase"):
for lm in syn.lemmas():
if lm.antonyms():
antonyms.append(lm.antonyms()[0].name()) #adding into antonymsprint(set(antonyms))
输出
{'decrement', 'decrease'}
WordNet 还有另外一个特性叫做单词相似度。这有助于我们检查我在这篇博客中没有提到的两个词之间的相似性。
感谢阅读。请继续学习,并关注更多内容!
用生成性对抗网络合成音频
毕竟,音频和图像并没有太大的不同
介绍
在过去的几年里,生成对抗网络(GANs)在计算机视觉领域取得了巨大的成功。由于最近的进步,如 Nvidia 的 StyleGAN 和 Google 的 BigGAN,我们现在能够生成高清晰度的高度逼真的图像;通常生成的或“伪造的”图像与真实的图像完全无法区分,这决定了 GAN 的实际发展程度。
Faces generated by StyleGAN
但是图像并不是 GANs 能够吃的唯一食物:音频是这种网络的另一个可能的应用,不知何故这个领域仍然是广泛未被探索的。
在本文中,我们将解释如何将 GANs 应用于音频信号,最后我们将尝试生成一些音频剪辑。
音频信号
音频和图像有什么区别?嗯,它们比你想象的更相似。
在处理数据科学和机器学习的时候,我们必须把一切都想成数字、向量和张量;您可能已经知道,黑白图像可以被视为一个简单的 2D 矩阵,其中每个数字代表一个像素,并表示该像素在特定位置的“白”程度。然而,对于 RGB 图像,我们必须有 3 个矩阵或通道,每种原色一个。
Color Image as 3 matrices (Tensor)
现在我们来看音频信号。听音乐时,你实际上听到的是不同时间的不同声音:这就是为什么我们可以将音频信号视为时间序列。
在每一个时间点上,“声音”可以用一个单一的值来表示;因此,我们可以认为声音(或“振幅” a )是时间的简单函数( t ),因此 a=f(t) 。函数 f 是连续的(本质上),所以要将信号转换成一组有限的数字,我们需要选择一个采样率。
Plot of Audio Signal: Amplitude over Time
如果采样率是 16000 Hz,这意味着我们将以 1/16000 秒的间隔记下幅度值,因此 2 秒的音频剪辑将产生 32000 个数字的单个向量(如果音频是立体声,我们将有 2 个长度相同的向量,每个音频通道一个)。
总之,虽然图像可以被视为矩阵(或张量),但音频信号可以被视为简单的向量。
关于音频信号还有很多有趣的理论,对音频进行编码的方式也很多(例如作为图像),但这对于我们在本文中将要讨论的内容来说已经足够了。
韦弗根
2018 年的一篇论文介绍了 WaveGAN ,一种能够合成音频的生成式对抗性网络架构。网络结构与一种名为 DCGAN 的网络结构极其相似,在生成器和鉴别器中都使用了卷积层:如果你熟悉用于生成图像的传统卷积 GAN 架构,WaveGAN 将非常容易理解。
DCGAN architecture
假设我们有一个发生器,它必须从一个噪声矢量输出 1 秒的音频(如果采样速率为 16 kHz,这将是一个 16000 长的矢量,不考虑它必须是 4 的幂这一事实,我们将在后面解释)。
首先,由于我们不再处理 2D 图像,传统卷积层中使用的 2D 滤波器现在已经没有用了。请记住,音频信号可以被视为简单的向量:因此,我们必须将滤波器更改为一维:DCGAN 中的 5×5 2D 滤波器现在变成了 WaveGAN 中的 25 长 1D 滤波器。
使用转置卷积将音频从噪声放大到 16000 长的矢量会影响合成的音频,因为它们在图像中会产生棋盘状伪影,在音频信号中也会产生类似的伪影。仅仅基于这种人为因素,鉴别者可以很容易地学会识别假音频,从而恶化整个训练过程。该论文提出了一种称为相位混洗的智能解决方案,但我们将避免转置卷积,而是使用上采样层(最近的邻居)后跟正常卷积。
在 DCGAN 中,我们在每一层将“图像”放大 2 倍(例如 32x32 到 64x64),而在一维中,向量每次放大 4 倍(例如 1024 到 4096)。
From 2D (DCGAN) to 1D (WaveGAN)
这一点很重要,因为我们需要记住,对于 1 秒钟的音频,考虑到采样速率为 16 kHz,相应的向量长度为 16000,选择每次以 2 倍的因子进行上采样将需要很多层。
这也是为什么生成的向量的长度是 4 的幂(如果我们想要以 16 kHz 采样约 1 秒的合成音频,则长度为 16384)。
因此,一切也适用于鉴别器:在这种情况下,我们将使用步长为 4 的 1D 卷积,这相当于在每一层以因子 4 进行下采样。
这绝对是你需要知道的使图像的传统 GAN 与音频信号一起工作的一切:改变滤波器为 1 维,放大和缩小 4 倍。这两个网络的训练方式和损失函数是相同的,所以没有什么新的东西。
很简单,对吧?
成果和障碍
最初的 WaveGAN 论文作者在官方网页这里展示了他们的成果。他们试图生成各种各样的音频领域,如人类语音、鸟鸣、鼓和音乐,并获得了令人信服的结果。我真的推荐你亲自去看看。
最难合成的领域之一当然是人类的语音:虽然我们不知道真实的鸟声应该是什么样的,但我们对如何解读人类的声音以及如何辨别真假有着非常深刻的理解。
我们可以说,人类的声音对于音频来说就像人脸对于图像来说一样:对于一台机器来说,学习如何生成这些域同时保持它们与真实域无法区分确实很难。这就是为什么在这种特殊情况下,WaveGAN 的后代对我们的耳朵来说显然是假的:我们必须记住,GAN 对单词、短语组成和语调毫无概念,所有概念都难以学习,在合成样本中对我们来说代表着直接的危险信号。
我们需要在这项技术的发展中采取更多的步骤,以便能够从原始语音数据中创建真实的样本,但我认为我们离这一成就不远了。
我自己曾试图从巴拉克·奥巴马演讲的原始音频中提取一些样本,不出所料,没有任何令人信服的结果。以下是一些例子:
结论
使用 GANs 进行音频生成有很大的潜力,既有积极的一面,也有消极的一面:一些研究人员已经探索了人类语音领域翻译的想法(想象一下将奥巴马的语音转换为特朗普的语音,就像语音的 Deepfakes),使用一些众所周知的 GANs 架构,如 CycleGAN,以达到他们的目标。
正如我们所见,虽然这项技术产生的结果与现实相差甚远,但我们需要考虑这样一个事实,即它为滥用提供了可能性,就像 Deepfakes 所发生的那样。在我看来,这不应该吓退我们探索合成音频生成的世界,而是应该邀请我们拥抱它,并发现它的潜力和弱点。
我想真诚地感谢你阅读这篇文章,我真的很感激,希望你能学到一些新的东西。
玩得开心!
使用 Scikit Learn 为 ML 生成合成数据集等
使用 Scikit 生成合成数据集了解更多信息
越来越明显的是,谷歌、脸书和微软等大型科技巨头对他们最新的机器学习算法和软件包非常慷慨(他们免费提供这些),因为算法世界的准入门槛目前相当低。开源社区和工具(如 Scikit Learn)已经走过了漫长的道路,大量开源项目正在推动数据科学、数字分析和机器学习的发展。站在 2018 年,我们可以有把握地说,算法、编程框架和机器学习包(甚至是如何学习这些技术的教程和课程)不是稀缺资源,而是高质量的数据。
当涉及到调整和微调这些算法时,这往往成为数据科学(DS)和机器学习(ML)领域从业者的一个棘手问题。从一开始就指出这一点也是明智的,当前的文章是关于算法研究、教学学习和模型原型的数据缺乏,而不是关于扩展和运行商业操作的数据缺乏。这不是关于如何为你正在开发的酷旅行或时尚应用获取高质量数据的讨论。这种消费者、社会或行为数据的收集有其自身的问题。然而,即使是像访问高质量数据集来测试特定算法方法的局限性和不可预测性这样简单的事情,往往也不那么简单。
为什么需要合成数据集?
如果您是从零开始学习,最合理的建议是从简单的小规模数据集开始,您可以在二维空间中绘制这些数据集,以便直观地理解模式,并以直观的方式亲自查看 ML 算法的工作情况。
然而,随着数据维度的爆炸式增长,视觉判断必须扩展到更复杂的问题——如*学习和样本复杂性、计算效率、类别不平衡、*等概念。
在这一点上,实验灵活性和数据集的性质之间的权衡开始发挥作用。你总是可以找到一个真实的大型数据集来实践这个算法。但这仍然是一个固定的数据集,具有固定数量的样本、固定的底层模式,以及正负样本之间固定的类别分离度。你也必须调查,
- 测试和训练数据的选定部分如何影响算法的性能和鲁棒性
- 面对不同程度的类别不平衡,这些指标有多稳健
- 必须做出什么样的偏差-方差权衡
- 该算法在训练和测试数据中的各种噪声特征(即标签和特征集中的噪声)下如何执行
- 你是如何实验并梳理出你的 ML 算法的弱点的?
事实证明,使用单个真实数据集很难做到这些,因此,您必须愿意使用合成数据,这些数据足够随机,可以捕捉真实数据集的所有变化,但又足够可控,可以帮助您科学地调查您正在构建的特定 ML 管道的优势和劣势。
虽然我们不会在本文中讨论这个问题,但这种合成数据集的潜在好处可以很容易地在敏感应用程序中衡量出来——医疗分类或金融建模,在这些应用程序中,获得高质量的标记数据集通常是昂贵和令人望而却步的。
用于 ML 的合成数据集的基本特征
应当理解,在这一点上,合成数据集是以编程方式生成的,而不是来源于任何种类的社会或科学实验、商业交易数据、传感器读数或图像的手动标记。然而,这样的数据集肯定不是完全随机的,并且用于 ML 的合成数据的生成和使用必须由一些首要的需求来指导。特别是,
- 它可以是数字、二进制或分类(有序或非有序),并且要素的数量和数据集的长度可以是任意的
- 它必须有一定程度的随机性,但同时,用户应该能够选择各种各样的统计分布作为该数据的基础,即可以精确地控制和调整潜在的随机过程,
- 如果用于分类算法,那么类别分离的程度应该是可控的,以使学习问题容易或困难,
- 可以以可控的方式插入随机噪声
- 生成速度应该非常高,以便能够针对任何特定的 ML 算法对大量这种数据集进行实验,即,如果合成数据是基于真实数据集上的数据扩充,则扩充算法必须在计算上高效
- 对于回归问题,可以使用复杂的非线性生成过程来获取数据——真实的物理模型可能有助于这一努力
在下一节中,我们将展示如何使用一些最流行的 ML 库和编程技术来生成合适的数据集。
使用 Scikit learn 和 Numpy 生成标准回归、分类和聚类数据集
Scikit learn 是基于 Python 的数据科学软件栈中最受欢迎的 ML 库。除了优化的 ML 例程和管道构建方法之外,它还拥有用于合成数据生成的实用方法的可靠集合。
使用 Scikit 学习进行回归
Scikit learn 的dataset.make_regression
函数可以创建任意数量的输入特征、输出目标以及它们之间的可控信息耦合度的随机回归问题。
使用 Scikit 学习进行分类
类似于上面的回归函数,dataset.make_classification
生成一个随机的多类分类问题,具有可控的类分离和添加的噪声。如果需要,还可以随机翻转任意百分比的输出符号来创建更难的分类数据集。
使用 Scikit Learn 进行聚类
Scikit learn 实用程序函数可以产生各种聚类问题。最直接的方法是使用datasets.make_blobs
,它可以用可控的距离参数生成任意数量的集群。
为了测试基于相似性的聚类算法或高斯混合模型,以特殊形状生成聚类是有用的。我们可以使用datasets.make_circles
函数来实现。
对于使用支持向量机(SVM) 算法测试非线性核方法,像 k-NN 这样的最近邻方法,或者甚至测试一个简单的神经网络,通常建议使用某些特定的数据进行实验。我们可以使用噪声可控的dataset.make_moon
函数生成这样的数据。
具有 Scikit 学习高斯混合模型
高斯混合模型(GMM)是文本处理/自然语言处理任务中无监督学习和主题建模的有趣研究对象。下面是一个简单函数的示例,展示了为这种模型生成合成数据是多么容易:
import numpy as np import matplotlib.pyplot as plt import random def gen_GMM(N=1000,n_comp=3, mu=[-1,0,1],sigma=[1,1,1],mult=[1,1,1]): """ Generates a Gaussian mixture model data, from a given list of Gaussian components N: Number of total samples (data points) n_comp: Number of Gaussian components mu: List of mean values of the Gaussian components sigma: List of sigma (std. dev) values of the Gaussian components mult: (Optional) list of multiplier for the Gaussian components ) """ assert n_comp == len(mu), "The length of the list of mean values does not match number of Gaussian components" assert n_comp == len(sigma), "The length of the list of sigma values does not match number of Gaussian components" assert n_comp == len(mult), "The length of the list of multiplier values does not match number of Gaussian components" rand_samples = [] for i in range(N): pivot = random.uniform(0,n_comp) j = int(pivot) rand_samples.append(mult[j]*random.gauss(mu[j],sigma[j])) return np.array(rand_samples)
超越 Scikit 学习:来自符号输入的合成数据
虽然上述函数可能足以解决许多问题,但生成的数据确实是随机的,并且用户对生成过程的实际机制控制较少。在许多情况下,人们可能需要一种可控的方式来基于明确定义的分析函数(涉及线性、非线性、理性甚至超越项)生成回归或分类问题。下面的文章展示了如何结合 SciPy 中的符号数学包 SymPy 和函数,从给定的符号表达式中生成综合回归和分类问题。
从给定的符号表达式生成的回归数据集。
从给定的符号表达式生成的分类数据集。
使用 Scikit-image 的图像数据增强
深度学习系统和算法是数据的贪婪消费者。然而,为了测试深度学习算法的局限性和鲁棒性,人们经常需要向算法提供相似图像的细微变化。 Scikit image 是一个令人惊叹的图像处理库,构建在与 scikit learn 相同的设计原则和 API 模式上,提供了数百个很酷的函数来完成这个图像数据增强任务。
下面这篇文章很好地提供了这些想法的全面概述:
色调、饱和度、价值通道
裁剪
随机噪声
旋转
漩涡
我们展示了这种增强过程的一些精选示例,从单个图像开始,并在同一图像上创建数十种变化,有效地将数据集放大许多倍,并创建一个巨大大小的合成数据集,以稳健的方式训练深度学习模型。
具有分割的随机图像合成器
NVIDIA 提供了一个名为 NDDS 的 UE4 插件,使计算机视觉研究人员能够导出带有元数据的高质量合成图像。它支持图像、分割、深度、对象姿态、边界框、关键点和自定义模板。除了导出器之外,该插件还包括各种组件,能够生成用于数据扩充和对象检测算法训练的随机化图像。随机化工具包括照明、对象、相机位置、姿势、纹理和干扰物。这些组件一起允许深度学习工程师轻松创建随机场景来训练他们的 CNN。这是 Github 的链接,
使用 pydbgen 生成分类数据
Pydbgen
是一个轻量级的纯 python 库,用于生成随机有用的条目(如姓名、地址、信用卡号、日期、时间、公司名称、职位、车牌号等)。)并将它们保存在 Pandas dataframe 对象中,或者作为数据库文件中的 SQLite 表,或者保存在 MS Excel 文件中。你可以在这里阅读文档。这里有一篇文章描述了它的使用和效用,
这里有几个说明性的例子,
合成时间序列数据集
有相当多的论文和代码库使用在现实生活的多元时间序列中观察到的特殊函数和模式来生成合成时间序列数据。下面的 Github 链接给出了一个简单的例子:
合成音频信号数据集
音频/语音处理是深度学习实践者和 ML 爱好者特别感兴趣的领域。谷歌的 NSynth 数据集是一个由各种乐器发出的短音频文件声音合成生成的(使用神经自动编码器以及人工和启发式标记的组合)库。以下是数据集的详细描述。
强化学习的综合环境
奥鹏健身馆
最大的强化 ML 综合学习环境库是 OpenAI Gym 。它由大量预先编程的环境组成,用户可以在这些环境上实现自己的强化学习算法,以对性能进行基准测试或对隐藏的弱点进行故障排除。
随机网格世界
对于强化学习的初学者来说,在一个简单的网格世界中进行练习和实验通常会有所帮助,在这个世界中,代理必须通过迷宫到达一个终端状态,每个步骤和终端状态都有给定的奖励/惩罚。
只需几行简单的代码,就可以合成任意大小和复杂度的网格世界环境(具有用户指定的终端状态和奖励向量分布)。
https://github.com/tirthajyoti/RL_basics
看看这个 Github repo 的想法和代码示例。
Scikit 了解更多关于合成数据生成的信息:摘要和结论
在本文中,我们回顾了几个为机器学习生成合成数据的例子。读者应该清楚,这些绝不是数据生成技术的详尽列表。事实上,除了 Scikit Learn 之外,许多商业应用程序都在提供相同的服务,因为用各种数据训练您的 ML 模型的需求正在快速增长。然而,如果作为一名数据科学家或 ML 工程师,您创建了自己的合成数据生成编程方法,这将为您的组织节省投资第三方应用程序的资金和资源,并让您以整体和有机的方式规划 ML 管道的开发。
希望您喜欢这篇文章,并且能够很快在您自己的项目中使用这里描述的一些技术。
其他注释
原载于 2019 年 8 月 28 日【https://blog.exxactcorp.com】。
系统可用性公式-要记住的假设
Image by Author
系统可用性,即系统在需要时工作的概率,直接影响系统维护策略、效率和系统设计中的冗余。上述公式是描述和计算系统可用性最常用的表达式。这个公式的主要优点是简单。然而,不幸的是,人们经常误解这个公式本身就是可用性的实际定义。它不是。上述公式是一系列数学计算的结果,基于单个独立组件的假设,在稳态条件下故障和修复呈指数分布。
在这篇文章中,我将一步一步地概述这个公式是如何推导出来的。
介绍
假设S(B)= 1表示一个状态( B ),或者一个给定系统被定义为可操作的状态的联合( B ),那么 系统可用性 , *A(t),*是在时间 t ,S() 系统可靠度 , R(t) 是到时间 *t,*系统尚未处于故障状态的概率,S(B)= 0。因此,可靠性可以表示如下:
可靠性与单个部件的故障概率有着简单的关系, F ₁ (t) 。然而,可用性是一个更复杂的问题。有许多不同的方法来解决这个问题。在这篇文章中,我将介绍马尔可夫方程方法。
危险功能和系统工程
在系统工程领域,危险函数*h(x)*描述事件(系统故障)在时间 t 发生的概率,假设该事件在该时间点之前尚未发生。风险函数(也称为失效率、风险率或死亡率) h(x) 是概率密度函数(PDF)*F(t)和生存函数S(t)**1-F(t)*之间的比值。其中 F(t) ,是累积分布函数(CDF)。危险函数在系统工程中起着重要的作用,因为只要系统在运行,系统工程中数据集的收集就通过观察系统中的故障来进行
。
等式(2)是使用贝叶斯定理的危险定义公式,其中:
***【F(t)***表示事件(系统故障)在 0 到 t 之间发生的概率
1- F(t) 表示事件直到时间 t 才发生的概率。
f(t)dt 表示事件在时间 t 的小区间 dt 内发生的概率。
z(t)dt 表示某事件在 t 的小区间 dt 内发生的条件概率,假设该事件在该时间之前尚未发生。
z(t) 采用了危险函数的名称,因为它与故障有关。系统故障是系统工程中的重要事件,但考虑到系统的生命史,它们不是唯一可能的事件。还有许多其他事件,如维修、检查、维护、运行状态的变化,以及许多其他可能具有统计性质的事件。
指数分布
指数分布是风险不变的特殊情况。
因此,指数失效密度对应于一个与时间无关的常数风险函数,换句话说,不会老化。常数风险函数是指数分布的无记忆特性的结果:假设受试者已经存活到时间 t 的剩余存活时间的分布不依赖于 t 。把
换个说法,一个时间区间内的死亡概率【t,t+y】独立于起点,t【1】。
指数分布是系统工程应用中最广泛使用的分布。这主要是因为它是最简单的函数,而不是因为它是正确的函数。
马尔可夫过程
马尔可夫过程是一个随机过程,在这个过程中,给定现在,系统的未来状态独立于过去。在这种模型中,系统的未来状态完全由系统的当前状态决定。如果系统中的所有组件都具有指数分布,那么系统是马尔可夫的,未来只取决于现在的状态。
等式(4)被称为马尔可夫等式【2】。它是一组联立的一阶微分方程,是作为 n 单入口状态传输方程的特例而导出的。马尔可夫方程有一个简单的物理解释。 zᵢ 代表离开状态 i 的比率,因此 zᵢPᵢ(t) 代表该状态下人口的减少。同样,组件从其他状态进入状态 i 。从任一状态 j 转移到状态 i 的速率为 zᵢⱼ ,导致单位时间内zᵢⱼpᵢ(t状态 i 的人口增加。马尔可夫链有有限数量的 n 个状态,在任何时间处于任何状态的概率是 1 (这就是所谓的归一化方程)
对于具有指数分布的两个状态的简单情况,等式(4)采用简单的形式:
其中λ是失效的危险,通常称为失效率*,μ称为修复率。*
利用归一化方程 P₁(t)+P₀(t)=1 ,得出:
具有边界条件 P₁(0)=1 的方程(6)的解产生:
具有两种状态的单个组件的可用性包含两个术语。第二项是瞬态的,随着时间的增加而变为零。第一项称为稳态可用性* A ∞,注意到 1/λ 是平均无故障时间 (MTTF)和1/μ平均修复时间 (MTTR),可以得到:*
这是描述和计算可用性最常用的表达式之一。等式(7)的主要优点是简单。事实上,许多人很直观地认为这个等式就是可用性的定义。可用性公式为真当且仅当故障概率密度函数以及修复 PDF 为指数函数,且仅针对稳态( t → ∞时)。
这种误用公式的情况,在数值计算领域是很常见的。正如英国统计学家乔治·博克斯的名言:“所有的数字计算模型都是错误的,有些是有用的”。由于模型和公式是基于假设的,所以当试图将这些模型应用到现实生活中以产生现实结果时,不应该忘记这些假设。
系统设计思维:区分人工智能和人工智能
人工智能和机器学习有什么不同?
AI 和 ML 的区别有太多松散的定义。大多数定义都比较轻松。我最喜欢的一个是:
如果是在 PowerPoint 上,很可能是 AI。如果是用代码,就是 ML。
大多数定义都不严谨,因为这种定义没有明确的预期结果。
让我们快速给出一个严肃的目的——职业装修。
问题陈述是这样的。你有两个人,一个在多个系统方面经验丰富,但在 ML 方面经验不足。第二个是非常年轻的有 ML 经验的。对于给定的项目,您应该检查您是否对两者都有角色。如果你只有一个角色,你应该决定保留谁。
由此,我们将深入研究一个案例。随着我们的进步,我们只是概述我们得到的主要思想和我们试图解决的主要问题。由此,我们将分离什么是 ML 和 AI。之后,让我们检查完成它所需的经验和成熟程度。
项目案例研究
这是一个农业人工智能的案例研究。这应该有助于玉米田监测。基于图像的系统需要提供关于疾病的警告,以便农民可以迅速处理并控制问题。
一架无人驾驶飞机周期性地飞过田野并收集图像。这些图像将用于疾病症状的预测。假设我们需要提供 3 个标签——健康、早期疾病、晚期疾病。
https://pixabay.com/photos/builder-farmer-hay-apply-computing-4298301/
机器学习的范围和重点
对于上面的案例研究,ML 涉及我们在所有教程中看到的机器学习任务。
我们定义模型。
我们有用于训练和测试集的图像。
最后,我们有一些最终客户提供的图片。
在创建好的模型时,我们可能会调整超参数,改变模型架构,改变模型本身。我们也可能会使用合成图像。我们可能会尝试我们所知道的所有人工智能技术。
要求说,我们需要 3 个标签。也许,我们会为各自的图像创建 3 个文件夹。为了简单起见,我们认为每个文件夹名代表各自的标签名。我们会用这些来训练。一切看起来都很好。验证图像预测看起来也不错。
在我们创建了模型并完成测试后,混淆矩阵看起来很好。假阳性和真阴性在统计要求范围内。
如果一切顺利,如果这是机器学习,那么什么是人工智能?
现在,人工智能的焦点
在最大似然预测成功后,团队向一位农民展示了最大似然预测演示。但是一个农民给出了另一个形象。这个预测完全错了。它有早期疾病。它无法被检测到。农夫很不高兴。
“先生,即使在健康的情况下,我也不介意去野外会有小麻烦。即使它错误地通知了我,也没关系。但是如果有疾病症状没有被发现,那对我来说就是一个大问题。我有好几公顷的庄稼,我需要知道在任何给定的时间里,我应该把精力集中在哪里。我有时间。你的系统应该给我重点关注的优先区域。”
团队意识到他们根本没有考虑过这样的形象。他们专注于提高现有数据集的准确性。他们关注的是准确率。他们遇到了过度拟合的问题。
可接受准确性的统计数据对该客户来说无关紧要。他不介意我们用低信心预测来提示他。他希望我们谨慎行事。
他们擅长机器学习。但在系统级 AI 方面做得不够。
现在,考虑一个完全不同的项目——一个 7-11 商店店主的案例。他想要一个闭路电视监控系统,用于检测商店盗窃和即时报警。这个人想要一个不介意小损失的系统。但他的客户的声誉和假警报是一个更大的问题。如果熟客虚惊一场,一去不返,那损失更大。他只想要非常明确的商店盗窃案件报告。 这个客户也希望我们谨慎稳妥,但方向相反。
我们刚刚讨论了业务影响和准确性。我们也可以看看其他方面。让我们回到玉米地。
训练数据的多样性
研究小组发现,另一组图像的假阳性显著增加。经过更深入的检查,研究小组发现这些图像中的玉米更大。只有团队意识到玉米作物的周期是 100 天左右!在这段漫长的时间里,他们只拍摄了一个实例的图像。需要非常频繁地拍摄训练图像——可能每天都拍?健康和不健康的视觉特征每隔几天就会发生剧烈的变化。现在有多重困难。
如果他们把所有健康的图像放在一个文件夹里,模型就学不到任何有用的东西。请看下面的两张图片。
https://pixabay.com/photos/field-cornfield-arable-corn-4280596/
https://pixabay.com/photos/harvest-cornfield-agriculture-corn-4195417/
这两幅图像如此不同。在第一种情况下,庄稼太小,而在第二种情况下,庄稼已经长得很大了。这些图像来自完全不同的角度。很难想象这个模型能学到什么。
看起来,为不同日期的图像设置不同的文件夹是有意义的。以前,一个标签有一个公共文件夹。
还需要定义图像记录的过程。无人机应在相同的高度和相同的预定路线上飞行。此外,一天中的时间也应该是固定的,以确保颜色或其他属性不会因光线变化而受到影响。此外,数据需要考虑云的阴影。
行…现在有了大数据集,按天分隔。那么训练过的模型也应该是白天分开的?即预测第 1 天的疾病可能性,我能为第 1 天训练一个通用模型,一直到第 100 天吗?这将导致过多的模型。
因此,团队可能不得不将模型分成几个不同的模型。可能是每周一次的数据。当图像被发送到模型进行预测时,元数据也应该有作物的日期。没有它,系统就不知道使用哪个模型进行预测。
部署和再培训策略
对于本案例研究,为了证明系统开发的投资是合理的,它应该可以在大范围内使用,最好可以在农民、州、国家甚至是大洲之间使用。这也有助于在更大的数据集上学习。如果一个地区出现了新的疾病,我们还应该能够重新训练系统,以适应这种新的疾病信息。
人工智能系统的重要方面是它会随着时间的推移变得更好。单靠 ML 并不能保证。它需要重新培训政策和流程。
假设法默发现了一个真正的负片,有没有简单的方法来制作它,并提供这样的图像?如果他不是一个懂电脑的人,可以通过语音命令来贴标签吗?当他以这种方式向系统发出警报时,系统是否能够标记数据的子集,以便进行手动检查?这将非常有帮助。项目发起人可以雇佣有农业背景的兼职承包商,来制作这些有疾病的图像。一旦这一批完成,再培训就可以进行了。
在 ML 中,我们只是谈论训练、交叉验证和预测。算法中不讨论再训练策略。只有这样端到端的思考,才会产生真正的人工智能系统。
更多的系统工程问题
该系统还可以考虑更多的系统工程方面。这可能是相机对焦模式,无人机在捕捉图像时的速度。当查看 ML 模型输入形状时,它对预测时间和所需资源有性能影响。这反过来会影响我们可以提供的用例及系统特性。
如果性能良好,我们可以在无人机飞行时进行实时预测。这可能会让顾客更开心。这可能需要团队降低图像的分辨率,以便更快地进行训练和预测。这可能是 ML 模型调整的一个因素。
商业、经济和法律问题
当我们考虑人工智能时,我们会考虑整体业务流程。我们也关心整个项目的经济效益。在涉及人员数据的项目中,还可能涉及法律问题。
在与安全相关的行业中,如作者工作的汽车、工业自动化,甚至需要证明预测是如何工作的,以及预测的可预测性如何!
定义人工智能
人工智能更多的是关于整个系统,各种角色、算法、业务需求如何相互作用。ML 主要讲的是机器学习的核心技术部分。
正如你所看到的,当我们讨论人工智能时,我们很少谈论技术细节和算法。我们更关心解决方案、部署、用户体验等等。如果我们将 ML 应用于非常具体的小任务,如在手机中找到重复的图像,ML 和 AI 之间的差异并不显著。
midmanager.com
随着世界走向更高的人工智能采用,这种区别变得越来越重要。
最后,职业适应
我们已经定义了 ML 和 AI 之间的焦点差异。
现在让我们回到我们开始思考的最初焦点。这是关于给两个员工安排合适的工作。
对于我们看到的疾病检测示例,ML 工程师可以是接受机器学习培训的人。他或她可以专注于算法、Python、Pytorch、张量流、模型架构、超参数等。
要完成整个系统架构,定义最终使用和部署的业务和技术流程,您需要一个解决方案架构师。即使这样的人可能不知道 ML 非常具体的细节,他应该能够很好地简化解决方案,使其可用,并使其成为一个学习系统。
所以,如果有一个没有 ML 背景的有经验的软件架构师或业务分析师,不要解雇他。也许这样的人更适合项目中的系统级角色。当然,对于 ML 特定的角色,雇佣具有 ML 认证的成员。
总而言之,
是的。AI 代表幻灯片,ML 代表代码。
我们对意义看得越深,我们学到的就越多。随着我们了解得越多,我们在系统设计方面就做得越好。
使用日志分析的系统故障预测
使用递归神经网络预测系统故障的深度学习方法
在现代社会,系统故障是一个严重的问题,需要解决。如果能够获得准确的系统故障预测,IT 公司或各种研究机构将受益匪浅。如果事先作出适当的预测,计算机故障的不利影响会有所减轻。如果这种情况即将发生,则可以限制资源、应用程序和其他消耗内存的进程的使用,从而防止系统崩溃。
在剩余时间充足的情况下实现准确预测相当困难。在这篇博客中,我介绍了一种通过提前解析日志文件来检测故障的简单方法。我们会在故障条件出现之前发出预警。为了达到我们的目的,我们使用了一种循环神经网络,即长短期记忆。本文中的方法使用滑动窗口来获取期望的结果。考虑的重要因素是 RAM、CPU 和硬盘利用率。
下图显示了所使用的方法:
Methodology
系统故障预测在许多应用中是必不可少的,例如计算机需要执行高计算。非常高的硬盘使用率或 RAM 崩溃会阻止应用程序在 HPC 上执行。高性能计算是使用并行编程来高效运行复杂的程序。HPC 的恢复可能需要很长时间,有时甚至是不可能的。时间序列预测的使用也很普遍,但它不包括我们接下来要陈述的参数,这些参数可能是有益的。
从系统中获取的日志文件包含有关系统状态和内存消耗的信息。我们知道计算机的三个主要利用率是 CPU、RAM 和硬盘利用率。这些日志文件可以为我们提供时间戳以及在确定的时间戳上资源的确切利用率。我们已经考虑了具有相同间隔的时间戳的值。我们有一个由过去五天中生成的系统日志文件组成的数据。nmon 格式。所考虑的时间戳变化是固定的,并且具有 10 分钟的固定间隔。
我们有过。已转换为的 nmon 文件。csv 适合学习。我们还可以使用 nmon visualizer 工具可视化数据。我们考虑的 CPU、RAM 和硬盘利用率参数如下:
CPU 利用率:
User%:这表示处理器花费 x%的时间运行用户空间进程。用户空间进程是不使用内核的进程。一些常见的用户空间进程包括外壳、编译器、数据库和所有与桌面相关的程序。如果处理器没有空闲,那么通常大部分 CPU 时间用于运行用户空间进程。
Sys%:这表示处理器花费 x%的时间运行系统进程。系统进程由内核空间程序组成
Wait%:这表示处理器花费 x%的时间运行内核进程。所有的进程和系统资源都由 Linux 内核处理。内核执行的任务包括运行系统进程,管理内核空间中的硬盘等硬件设备。
Idle%:显示等待其他进程完成的 CPU 百分比。有时,处理器可能会启动读/写操作,并需要等待其他进程完成。
CPU 利用率=用户% +系统% +等待%
RAM 利用率:
- MemTotal:总可用内存
- MemFree:系统不使用的物理内存量
- 缓冲区:缓冲区高速缓存中的内存,因此相对临时存储原始磁盘块
- 缓存:页面缓存中的内存(磁盘缓存和共享内存)
- mem used = mem total-mem free-Buffers-Cached
特定时间戳时已用 RAM 的百分比= (MemUsed/MemTotal) * 100
硬盘利用率:
硬盘利用率%=(已用硬盘空间/总硬盘空间)*100
PCA:
现在我们有了时间戳的 CPU、RAM 和硬盘利用率的值。我们应用 PCA 来从这 3 个参数中获得单个缩减值。众所周知,PCA 或主成分分析是一种处理高度相关变量的方法。我们可以得到上述所有利用率的单一值。然后,我们可以应用单变量时间序列预测来预测未来时间戳的单个值。
应用 PCA 的步骤:
a)标准化数据。b)从协方差矩阵计算特征值和特征向量。c)按照降序对特征值进行排序,以对相应的特征向量进行排序。d)选择对应于最大特征值的 1 个特征向量。这为我们提供了每个时间戳的简化参数。
LSTM 模式:
LSTM architecture
我们遵循的步骤:
I)大小为 50 的向前移动窗口,这意味着我们使用前 50 个数据点作为输出输入 X 来预测 Y,即第 51 个数据点。接下来使用从第 1 点到第 51 点的窗口,我们预测第 52 点。
ii)使用结合了密集输出层的两层 LSTM 模型来进行预测。iii)我们使用以下两种方法来预测产量—
a)我们预测了测试数据集中每个项目的值。
b)我们通过向前移动一步将先前做出的预测反馈到输入窗口,并在所需的时间戳做出预测。我们有 LSTM 的 3D 输入向量,包括几个样本、几个时间戳、多个特征。保存训练模型的权重后,我们绘制预测值以可视化数据趋势。我们有一个 2 层 LSTM 模型和一个密集的输出层,如下表 3 所示。我们在两者之间使用 dropout,因为它是一种正则化技术,用于在我们训练 LSTM 模型时防止过拟合。
模型摘要:
Model summary for LSTM
结果:
下图显示了预测值和实际值的图形视图,以找出趋势。尽管训练数据量较少,但我们得到了期望的输出变化。我们的模型能够捕捉趋势。有了更多的训练数据,就可以预测更准确的结果。绿线代表实际值,而蓝线代表预测值。在 X 轴上,我们有时间戳间隔为 10 分钟的日期。Y 轴是我们之前获得的 PCA 缩减值。保存的权重帮助我们预测未来时间戳的缩减值。有了故障情况的时间戳和 PCA 缩减值(可以注意到实际系统故障发生的一些情况),我们可以正确地分类预测值是否属于故障类别。我们使用逻辑回归分类算法来达到我们的目的
该博客将帮助用户防止系统故障,因为它可以在实际故障发生之前向用户发送警告邮件或短信。然后,用户可以通过终止冗余进程来限制系统上正在运行的进程的数量。使用 LSTMs 进行时间序列预测有助于我们获得未来时间戳的缩减值。则可以使用逻辑回归分类模型将这些值用于分类为正常或故障类别。
结论:
这个项目是作为斋浦尔 Celebal 技术公司实习的一部分完成的。
这种方法将帮助用户防止系统故障,因为它可以在实际故障发生之前向用户发送警告邮件或 SMS。然后,用户可以通过终止冗余进程来限制系统上正在运行的进程的数量。使用 LSTMs 进行时间序列预测有助于我们获得未来时间戳的缩减值。然后使用逻辑回归分类模型将该值分类为正常或故障类别。如果我们可以在现有的列表中添加更多的功能,这项工作可以扩展。我们刚刚在研究中考虑了 CPU、RAM 和硬盘的利用率。也可以考虑诸如输入/输出数据传输(即数据写入硬盘的速率)、特定进程运行的时间等参数,以获得更好的准确性。
t-SNE Python 示例
Photo by Matt Wildbore on Unsplash
t 分布随机近邻嵌入(t-SNE)是一种降维技术,用于在二维或三维的低维空间中表示高维数据集,以便我们可以可视化它。与 PCA 等简单地最大化方差的其他降维算法相比,t-SNE 创建了一个降维的特征空间,其中相似的样本由附近的点建模,不相似的样本由远处的点以高概率建模。
在高层次上,t-SNE 为高维样本构建概率分布,使得相似的样本被挑选的可能性很高,而不相似的点被挑选的可能性极小。然后,t-SNE 为低维嵌入中的点定义了类似的分布。最后,t-SNE 最小化关于嵌入中点的位置的两个分布之间的 kull back-lei bler 散度。
算法
如前所述,t-SNE 采用高维数据集,并将其简化为保留大量原始信息的低维图。
假设我们有一个由 3 个不同的类组成的数据集。
我们希望将 2D 图简化为 1D 图,同时保持集群之间的清晰边界。
回想一下,简单地将数据投影到轴上并不是降维的好方法,因为我们丢失了大量的信息。
相反,我们可以使用降维技术(提示:t-SNE)来实现我们想要的。t-SNE 算法的第一步是测量一个点到其他所有点的距离。我们没有直接处理距离,而是将它们映射成概率分布。
在分布中,相对于当前点具有最小距离的点具有高可能性,而远离当前点的点具有非常低的可能性。
再看一下 2D 的图,注意蓝色的星团比绿色的更分散。如果我们不解决这种规模上的差异,绿点的可能性将大于蓝点。为了说明这一事实,我们除以可能性的总和。
因此,尽管两点之间的绝对距离不同,但它们被认为是相似的。
让我们试着将这些概念与基本理论联系起来。从数学上讲,我们将正态分布的方程写成如下。
如果我们抛开指数之前的一切,用另一个点代替平均值,在解决之前讨论的比例问题的同时,我们得到了来自论文的等式。
接下来,让我们来解决我们如何得出减少的特征空间。首先,我们创建一个n_samples
x n_components
矩阵(在本例中为:9x1)并用随机值(即位置)填充它。
如果我们采用与上面类似的方法(测量点之间的距离并将它们映射到概率分布),我们会得到下面的等式。
请注意,像以前一样,我们采用正态分布的方程,去掉前面的所有内容,使用另一个点代替平均值,并通过除以所有其他点的可能性之和来说明规模(不要问我为什么我们去掉了标准偏差)。
如果我们能想出一些办法,使缩减的特征空间中的点的概率分布接近原始特征空间中的点的概率分布,我们就能得到定义良好的聚类。
为了做到这一点,我们利用了一种叫做库尔贝克-莱伯散度的东西。KL 散度是衡量一个概率分布与另一个概率分布的差异程度。
KL 散度值越低,两个分布就越接近。0 的 KL 散度意味着所讨论的两个分布是相同的。
这应该有望带来大量的想法。回想一下,在线性回归的情况下,我们如何通过使用梯度下降来最小化成本函数(即均方误差)来确定最佳拟合线。在 t-SNE 中,我们使用梯度下降来最小化所有数据点上的 Kullback-Leiber 散度之和。
为了给出每次更新的方向,我们对每个点的成本函数取偏导数。
Python 代码
很多时候,我们利用了一些库,但并没有真正理解库下发生了什么。在下一节中,我将尝试(尽管不成功)用 Python 代码实现算法和相关的数学方程。为了帮助这个过程,我从scikit-learn
库中的TSNE
类的源代码中提取了一些片段。
首先,我们将导入以下库并设置一些属性,这些属性将在我们绘制数据时发挥作用。
import numpy as np
from sklearn.datasets import load_digits
from scipy.spatial.distance import pdist
from sklearn.manifold.t_sne import _joint_probabilities
from scipy import linalg
from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import squareform
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
import seaborn as sns
sns.set(rc={'figure.figsize':(11.7,8.27)})
palette = sns.color_palette("bright", 10)
对于这个例子,我们将使用手绘数字。scikit-learn
库提供了将它们导入我们程序的方法。
X, y = load_digits(return_X_y=True)
鉴于 t-SNE 严格用于可视化,我们只能看到最多 3 维的事物,我们将选择 2 或 3 作为组件的数量。另一方面,困惑与算法中使用的最近邻的数量有关。不同的困惑会导致最终结果的剧烈变化。在我们的例子中,我们将其设置为 t-SNE 的scitkit-learn
实现的默认值(30)。根据numpy
文档,机器ε是最小的可表示正数,因此1.0 + eps != 1.0
。换句话说,任何低于机器ε的数字都不能被计算机操纵,因为它缺少必要的位。正如我们将看到的,贡献者使用np.maximum
来检查矩阵中的值是否小于机器ε,如果它们是,就替换它们。我不明白这背后的原因,所以如果有人能留下评论解释原因,我将不胜感激。
MACHINE_EPSILON = np.finfo(np.double).eps
n_components = 2
perplexity = 30
接下来,我们定义fit
函数。当我们转换数据时,我们将调用fit
函数。
def fit(X):
n_samples = X.shape[0]
# Compute euclidean distance
distances = pairwise_distances(X, metric='euclidean', squared=True)
# Compute joint probabilities p_ij from distances.
P = _joint_probabilities(distances=distances, desired_perplexity=perplexity, verbose=False)
# The embedding is initialized with iid samples from Gaussians with standard deviation 1e-4.
X_embedded = 1e-4 * np.random.mtrand._rand.randn(n_samples, n_components).astype(np.float32)
# degrees_of_freedom = n_components - 1 comes from
# "Learning a Parametric Embedding by Preserving Local Structure"
# Laurens van der Maaten, 2009.
degrees_of_freedom = max(n_components - 1, 1)
return _tsne(P, degrees_of_freedom, n_samples, X_embedded=X_embedded)
这个函数中发生了很多事情,所以让我们一步一步地分解它。
1.我们将样本数存储在一个变量中,以备将来参考。
2.我们计算每个数据点之间的欧几里德距离。这对应于前面等式中的||xi — xj||^2
。
3.我们将上一步中计算的欧几里德距离作为参数传递给_join_probabilities
函数,然后该函数计算并返回一个p_ji
值的矩阵(使用相同的等式)。
4.我们使用从标准偏差为 1e-4 的高斯分布中随机选择的值来创建缩减的特征空间。
5.我们定义了degrees_of_freedom
。源代码中有一个注释,告诉你去看看这篇解释他们推理的论文。基本上,经验表明,当我们使用组件数减 1 时,我们会得到更好的结果(粗体)。
Trustworthiness T(12) of low-dimensional representations of the MNIST dataset, the characters dataset, and the 20 newsgroups dataset.
6.最后,我们调用 tsne 函数,其实现如下。
def _tsne(P, degrees_of_freedom, n_samples, X_embedded):params = X_embedded.ravel()
obj_func = _kl_divergence
params = _gradient_descent(obj_func, params, [P, degrees_of_freedom, n_samples, n_components])
X_embedded = params.reshape(n_samples, n_components)return X_embedded
这个函数并没有太多的内容。首先,我们使用 np.ravel 将向量展平成一个一维数组。
>>> x = np.array([[1, 2, 3], [4, 5, 6]])
>>> np.ravel(x)array([1, 2, 3, 4, 5, 6])
然后我们使用梯度下降来最小化 kl 散度。一旦完成,我们将嵌入改回 2D 数组并返回它。
接下来,让我们来看看有更多肉的东西。下面的代码块负责计算 kl 散度和梯度形式的误差。
def _kl_divergence(params, P, degrees_of_freedom, n_samples, n_components):
X_embedded = params.reshape(n_samples, n_components)
dist = pdist(X_embedded, "sqeuclidean")
dist /= degrees_of_freedom
dist += 1.
dist **= (degrees_of_freedom + 1.0) / -2.0
Q = np.maximum(dist / (2.0 * np.sum(dist)), MACHINE_EPSILON)
# Kullback-Leibler divergence of P and Q
kl_divergence = 2.0 * np.dot(P, np.log(np.maximum(P, MACHINE_EPSILON) / Q))
# Gradient: dC/dY
grad = np.ndarray((n_samples, n_components), dtype=params.dtype)
PQd = squareform((P - Q) * dist)
for i in range(n_samples):
grad[i] = np.dot(np.ravel(PQd[i], order='K'),
X_embedded[i] - X_embedded)
grad = grad.ravel()
c = 2.0 * (degrees_of_freedom + 1.0) / degrees_of_freedom
grad *= creturn kl_divergence, grad
同样,让我们一步一步地浏览代码。
1.第一部分计算低维图中点的概率分布。
作者实际上使用了上述方程的一个变体,其中包括自由度。
其中α表示学生 t 分布的自由度数量
2.我们计算 KL 散度(提示:每当你看到np.dot
就想 sum)。
3.我们计算梯度(偏导数)。dist
实际上是yi — yj
在:
同样,他们使用上述方程的一个变型,带有自由度。
其中α代表学生 t 分布的自由度数量
梯度下降函数通过最小化 KL 散度来更新嵌入中的值。当梯度范数低于阈值时,或者当我们达到最大迭代次数而没有取得任何进展时,我们会提前停止。
def _gradient_descent(obj_func, p0, args, it=0, n_iter=1000,
n_iter_check=1, n_iter_without_progress=300,
momentum=0.8, learning_rate=200.0, min_gain=0.01,
min_grad_norm=1e-7):
p = p0.copy().ravel()
update = np.zeros_like(p)
gains = np.ones_like(p)
error = np.finfo(np.float).max
best_error = np.finfo(np.float).max
best_iter = i = it
for i in range(it, n_iter):error, grad = obj_func(p, *args)grad_norm = linalg.norm(grad)inc = update * grad < 0.0
dec = np.invert(inc)
gains[inc] += 0.2
gains[dec] *= 0.8
np.clip(gains, min_gain, np.inf, out=gains)
grad *= gains
update = momentum * update - learning_rate * grad
p += updateprint("[t-SNE] Iteration %d: error = %.7f,"
" gradient norm = %.7f"
% (i + 1, error, grad_norm))
if error < best_error:
best_error = error
best_iter = i
elif i - best_iter > n_iter_without_progress:
break
if grad_norm <= min_grad_norm:
breakreturn p
如果你已经走了这么远,给自己一点鼓励。我们准备用我们的数据调用fit
函数。
X_embedded = fit(X)
正如我们所见,该模型在根据像素位置分离不同数字方面做得相当不错。
sns.scatterplot(X_embedded[:,0], X_embedded[:,1], hue=y, legend='full', palette=palette)
让我们使用 t-SNE 的scikit-learn
实现做同样的事情。
tsne = TSNE()X_embedded = tsne.fit_transform(X)
正如我们所看到的,该模型成功地获得了一个 64 维的数据集,并将其投影到一个 2 维空间中,使得相似的样本聚集在一起。
sns.scatterplot(X_embedded[:,0], X_embedded[:,1], hue=y, legend='full', palette=palette)
t5——探索迁移学习极限的模型
The T5 (Text-To-Text Transfer Transformer) model. The same model is used for a wide variety of tasks by treating all tasks uniformly as taking some input text and outputting some text where the task type is embedded as descriptors in the input(see bold text in the input on the left above). This approach enables a single model to perform a wide variety of supervised tasks such as translation, classification, Q&A, summarization and even regression (e.g. outputting a similarity score between two sentences in the range 1–5. This in reality quite similar to a 21 class classification problem as explained below). The model is first pretrained unsupervised (masked objective like BERT) on a large corpus before supervised training with input text representing all these tasks and the associated labeled data which is also text (where specific tokens in the input stream “translate English to French” or “stsb sentence 1:… sentence2”, “question”/”context” etc. encode the task type as shown in figure above and the model is trained to output text matching the labeled data). With this approach of specifying input and output for supervised learning, the model shares its loss function, decoder etc. across all the disparate tasks.
TL;速度三角形定位法(dead reckoning)
T5 模型通过将不同的任务编码为输入流中的文本指令,以统一的方式处理多种多样的多对多和多对一 NLP 任务。这使得单个模型能够在多种 NLP 任务的监督下进行训练,例如翻译、分类、问答、摘要甚至回归*(尽管实际上它类似于分类)*。
这项工作的主要贡献与其说是模型*(这种编码文本的形式有先例——*【gp T2 使用了相同的想法 【除非在无监督的上下文中,假设它不能完成分类,或者 T5 可以完成的标记问题,给定它的监督学习阶段),即使它是 Q & A、摘要等的当前技术状态。,当与规模相结合时。
本文的主要贡献是通过使用 T5 模型的研究结果
- 从纯无监督的预训练到有监督的任务,检查与大规模利用迁移学习相关的因素
在这个过程中,语言理解的迁移学习的一些限制*(在人类的水平)*对于一些任务也在一些任务的性能度量中显现出来。虽然本文将解决这些限制留给了未来的研究,但已经有工作在进行中,以扩展语言理解,不仅仅是文本 ( )例如,基础语言理解- Yoshua Bengio *)。*这些新方法直接从文本着手解决当前迁移学习方法的一些基本问题——样本效率、常识理解、因果推理等。
论文中的主要观点
- 本文主要只关注基于变压器的模型*(相对于基于 RNN 的序列模型)。基于编码器-解码器的转换器架构最适合 T5 模型中使用的文本到文本方法。通过在编码器和解码器之间共享参数,参数计数保持与仅编码器模型(如 BERT)相同,而性能不会大幅下降(本文中报告的测试是在没有共享参数的情况下完成的)*。
- 掩蔽目标*(去噪)*与 BERT *中使用的相同(以及其变体,如掩蔽跨度)*的性能优于语言建模目标。
- 预训练最好在大型和多样化的数据集上进行,而不是在小型数据集上进行*(特别是如果数据在预训练中多次出现,这在大型数据集的情况下不是问题)。*此外,对域内数据进行预训练有助于提高下游任务的性能。
- 在微调期间更新预训练模型的所有参数比只更新几个参数产生了更好的性能,尽管计算成本*(见下面的最终想法)*。
- 通过在更多数据上训练模型、训练更大的模型或使用一组方法来进行扩展,所有这些都提高了性能。
- 仅在英语上的预训练方法在翻译(到法语、德语和罗马尼亚语)上没有产生艺术状态的结果;见下图)——暗示这不是一种语言不可知的方法。
- 通过使用掩蔽*(去噪)进行预训练以在下游任务中使用提取的知识的知识提取能力似乎受到模型仅从预测文本的损坏范围中学习的内容的约束。这一发现表明,正如前面提到的,学习方法不仅仅局限于文本(例如,基础语言理解)*。
其他详细信息
- 该模型的初始版本仅支持在 TPU 上运行。此链接介绍了设置虚拟机和 TPU 节点的步骤。请注意按照安装说明中的使用正确的 Tensorflow 版本启动 TPU 节点,以避免错误。
- 使用“小”模型解码输入完成的测试的完整结果如下所示(参见 Github 页面 中的 解码部分的说明)。它也有预先训练好的不同尺寸的模型来进行测试。由于更大的内存需求,我无法让基本型号和大型型号正常工作)。一个 Winograd 模式(WSC)样式测试没有产生论文中报告的结果—不确定问题是什么。(更新。11 月 6 日。T5 论文中的一位通讯作者**Colin Raffel【除了指出几处更正之外】优雅地澄清了这个问题。我做的测试和报告都是基于多任务混合训练的模型——对编码不同任务的句子进行监督训练。论文中报告的结果是在模型上进行的测试,这些模型针对特定任务进行了进一步的优化。作者怀疑 WSC 任务可能需要微调——它可能不仅仅适用于预训练的多任务混合,尤其是“小模型”。因此,为了在新领域的特定任务中获得最佳结果,我们首先在该领域的大型语料库中进行无监督训练。然后对输入句子中的多任务混合编码任务进行预训练。最后针对特定任务进行微调,以获得该任务的最佳性能)**
- 这种文本到文本的方法带来的一个挑战是模型可能不输出它在测试阶段期望输出的单词之一。例如,在上面所示的“可乐测试”*(测试句子语法是否可接受)*中,可以想象模型可以输出除“选择 1”或“选择 2”之外的字符串。作者声称这种情况将被视为测试失败,尽管他们没有观察到这种情况。此外,该模型可以为相同的输入产生不同的输出,这在摘要中是显而易见的。
- 最后,现实中回归模型的使用非常类似于分类问题。与输出可以是连续值的真正回归模型不同,该模型仅被定型为预测 1-5 范围内以. 2 为增量的值。这与值 0 一起产生 21 个值,这实质上是一个 21 类分类问题。
最后的想法
虽然在较大数据集上训练的较大模型继续提高了一些标准 NLP 任务的性能,但在大型语料库上预训练的通用知识提取似乎仍然没有在像 Winograd Schema challenge (WSC)这样的任务中带来接近人类水平(100%)的性能。似乎至少有两种不同的方法来解决这个问题。
- 第一种方法是继续增加 T5 论文和其他相关工作所建议的规模和训练策略,例如通过不用替代物(由生成器网络输出)替换标记来改变掩蔽词的当前预训练程序,并让鉴别器预测替换。然而,所有这些方法仍然通过在单词空间中进行预测来学习。
- 尝试预测下一个记号的完全不同的方法,不是在单词的空间,而是在抽象表示的转换空间。这是非常早期的研究,它解决了当前空间预测模型难以克服的一系列挑战——需要大量训练数据*(样本效率低下),无法像 WSC 这样的任务那样进行常识和因果推理。相对于在单词空间(或在图像-像素空间的情况下)中进行预测,在抽象表示空间中进行预测的目标是,通过这样做,模型可以学习潜在的因果变量,除了用这些变量进行推理之外,还能够适应潜在分布的变化(因果结构仍然保持不变)*需要很少的新训练样本,这是迁移学习的关键目标之一。
这篇文章是从 Quorahttps://qr.ae/TWPZq5手动导入的
机器学习和深度学习综述
机器学习和深度学习之旅
机器学习和深度学习模型和算法的映射和总结
这一系列博客将涵盖机器学习和深度学习从理论到实践的主题。目前市场上有许多优秀的教科书,包括模式识别和机器学习,统计学习的元素,深度学习等。然而,似乎那些作者喜欢直接跳到一个算法的结论,而跳过一步一步的解释和说明。因此,对于大一新生来说,那些书不容易消化。还有,那些书没有涉及如何在 R 或 Python 等统计软件中实现算法。我认为要很好的掌握统计模型和算法,理论和数学很重要,实现也很重要。因此,我想在理论和实践之间架起一座桥梁。
经过多年的学习,我认为所有这些方法都是相互联系的,而不是孤立的。当一个传统的方法显示出一些局限性时,那么一个新的方法就被引入来弥补这个局限性,从而进行改进。比如传统的线性回归很难处理多重共线性,于是发明了 LASSO 和岭回归来解决这个问题。另一个例子是引入装袋和增压来提高单棵树模型稳定性和准确性。如今,你也可以看到越来越多的方法涉及到不同领域的知识。将时间序列中的移动平均的思想应用于深度学习中的梯度下降中,以获得更快的收敛并减少振荡,这被称为带动量的梯度下降。因此,首先我想在这个博客中展示方法论之间的关系,然后我想写另外的博客来分别解释每个主题。你可以点击链接阅读你感兴趣的话题。
这个博客会不时更新,将来会增加更多的内容。
1。深度学习:
上图显示了传统统计模型和深度学习模型之间的关系。绿色的术语是用于生成相应模型的算法。
在深入研究神经网络(如 ANN、CNN 或 RNN)之前,让我们从单层神经网络开始我们的旅程。单层神经网络的思想是首先对输入变量进行加权线性组合,然后应用激活函数进行非线性变换。经典的单层神经网络包括逻辑回归和感知器。逻辑回归和感知器的区别在于,逻辑回归使用 sigmoid 函数作为激活函数,而感知器使用符号函数。
关于逻辑回归,请阅读我的博客:
逻辑回归从理论到实践的深度探讨
towardsdatascience.com](/an-introduction-to-logistic-regression-8136ad65da2e)
对于感知器算法,请阅读我的博客:
本博客将涵盖以下问题和主题
medium.com](https://medium.com/@songyangdetang_41589/an-introduction-to-perceptron-algorithm-40f2ab4e2099)
逻辑回归和感知器都使用梯度下降来获得最终模型。对于梯度下降,请阅读我的博客:
本博客将涵盖以下问题和主题:
towardsdatascience.com](/an-introduction-to-gradient-descent-c9cca5739307)
逻辑回归和感知器的限制是这两个模型的决策边界只能是线性的。当我们有一个更复杂的分类问题时,如下图所示,我们可能会期望一个更先进的方法,所以神经网络被引入。
如果你想用简单的数字建立一个神经网络,并更深入地理解这种奇特的算法,请阅读我的博客:
使用 Numpy 实现正向传播和反向传播
medium.com](https://medium.com/@songyangdetang_41589/build-up-a-neural-network-with-python-7faea4561b31)
2。线性回归
经典线性回归提供了另一个引入机器学习的完美角度。普通最小二乘法(OLS)用于估计线性模型的系数。然而,线性模型需要遵循几个假设,这些假设对模型的成功和预测的准确性至关重要。上表显示了假设、测试方法和每个假设的解决方案。
3。贝叶斯统计
贝叶斯统计在机器学习中也起着重要的作用。贝叶斯统计的一个范例是朴素贝叶斯分类器,它可以简单快速地训练。贝叶斯统计也用于无监督学习,如高斯混合模型(GMM)。贝叶斯公式如下所示:
公式中, p(y|x) 为后验概率; p(x|y) 是似然性; p(y) 是先验概率 p(x) 是证据。
对于朴素贝叶斯分类器,请阅读我的博客:
从理论到实践,学习感知机的基本原理
medium.com](https://medium.com/@songyangdetang_41589/introduction-to-na%C3%AFve-bayes-classifier-fa59e3e24aaf)
在频数统计中,分布的参数是一个确定的数,最大似然估计(MLE)用于进行估计;在贝叶斯统计中,分布的参数也是一个随机变量,而是使用最大后验概率(MAP)。MLE 和 MAP 的对比见博客:
最大似然估计(MLE)和最大后验概率(MAP)都被用来估计模型中的一些变量
medium.com](https://medium.com/@songyangdetang_41589/mle-vs-map-a989f423ae5c)
4。基于树的模型
让我们从线性模型转移到非线性模型。非线性模型的一个范例是决策树。决策树是一种基于树的算法,用于解决回归和分类问题。回归树用于具有连续值的因变量,分类树用于具有分类值的因变量。树与更经典的方法(如线性回归或逻辑回归模型)有着非常不同的味道。
特别是,线性回归假设模型的形式为:
而回归树假设模型的形式为:
其中 R1,…,Rm 表示特征空间的一个划分和 Cm: 的表达式
哪款比较好?根据没有免费的午餐定理,没有一个模型能对所有可能的情况都适用。因此,我们选择的方法取决于手头的问题。如果真正的决策边界是线性的,如顶部的两个图(下图)所示。线性模型将优于树模型。同时,如果真正的决策边界是矩形的,如下面的两个图所示。树模型比线性模型更能拟合数据。除了拟合度之外,为了可解释性和可视化,树模型是优选的。
Figures Source: Gareth James, Daniela Witten, Trevor Hastie, Robert Tibshirani, 2017, An Introduction to Statistical Learning
可以在博客中看到决策树的详细信息:
决策树背后的数学原理及其 Python 实现
medium.com](https://medium.com/@songyangdetang_41589/how-decision-tree-model-works-ce681cae10a6)
我的 Github 链接:
在 GitHub 上注册您自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方
github.com](https://github.com/sytangtang1991)
参考
[1]伊恩·古德费勒,约舒阿·本吉奥,亚伦·库维尔,(2017) 深度学习
[2] Gareth James,Daniela Witten,Trevor Hastie,Robert Tibshirani,(2017) 统计学习介绍
[3] Christopher M. Bishop,(2009),模式识别和机器学习
[4]特雷弗·哈斯蒂,罗伯特·蒂布拉尼,杰罗姆·弗里德曼,(2008),统计学习的要素
六分钟内完成基本画面
了解商业智能、数据可视化和仪表板创建的 Tableau
New Belgium Beer Ratings in Tableau
商业智能软件帮助组织做出更好的决策。通过提供良好的可视化仪表板,它们可以更轻松地:
- 查看数据中的关系
- 讲一个清晰的故事
- 将重点放在重要的指标上
Tableau 和微软 Power BI 是数据可视化和商业智能软件领域的领先产品。Tableau 最近以 157 亿美元的价格卖给了 SalesForce】。显然,让公司更容易可视化他们的数据有很大的价值。😁
Tableau 很受欢迎。我之前对数据科学家最需要的技能的分析显示,Tableau 是数据科学家工作清单中第八大最常见的技术技能。
From my article
Tableau 是这个列表中最容易快速精通的技术——假设你已经了解 Excel。我建议你花一点时间在 Tableau 上,这样你就可以把它添加到你的工具箱和简历中。
有了 Tableau,你可以快速做出令人印象深刻的可视化效果。好玩又好用。😀
事不宜迟,让我们看看开始使用 Tableau 时需要知道的最重要的事情,以便为您的成功做好准备。我将用一个新比利时酿造啤酒评级的数据集来演示,这个数据集是我从啤酒倡导者那里搜集来的。🍺
关于 Tableau 要知道的 10 件事
- 几乎都是拖拖拉拉。您可能偶尔需要输入高级计算,但一般来说,只需拖放即可。🖱
Drag and drop
2.您在数据源选项卡中导入数据。拖放数据源以连接或联合它们。Tableau 拥有几乎所有你能想到的数据源的连接器。
Some Tableau Connector Options
3.你的大部分工作都在工作表中完成。每个工作表都在窗口底部的选项卡中,就像在电子表格程序中一样。
将变量从左侧数据栏拖动到工作表顶部的行和列字段和。
Dragging variables to Rows
视图是工作表的主要可视化区域。您也可以将变量拖到视图或标记卡上,以便它们显示在视图中。
4.Tableau 试图提供帮助。它根据列的内容推断数据的类型。它在每个变量名旁边提供了有用的小符号来表示数字、字符串、地理、布尔和日期数据类型。Tableau 将您的数据列拆分为维度和度量。
Dimensions and measures
维度是定性(分类)变量,包括字符串和日期。默认情况下,它们是离散的。离散变量是蓝色的。
度量是可以求和并求平均值的定量(数字)变量。默认情况下,它们是连续的。连续变量标为绿色。
默认情况下,Tableau 会假设您在任何时候使用度量值时都希望对它们求和。您可以通过右键单击该变量来更改聚合函数。
Changing the aggregation function
关于数据科学中离散变量和连续变量之间差异的更多讨论,请参见我的文章这里。有关 Tableau 中变量的更多讨论,请参见文档。
5.标记卡控制许多可视化方面。将变量从左侧栏拖到标记卡,以控制颜色、文本、工具提示等。在设置好行和列后使用它。
Make the size of the bars based on the number of ratings
6.有许多图表选项——Tableau 在右侧可展开的演示菜单中提供建议。建议基于工作表中使用的当前变量。
Show Me menu of visualizations
要知道,如果你点击一个图表选项,Tableau 可能会重新排列工作表中的变量。
7.格式可以更改。右键点击你想改变的,你会看到选项。在右键菜单中,你可以设置格式。
Format most anything with a right click
8.筛选数据就像将变量拖到筛选区域一样简单。右击药丸并选择显示过滤器创建一个交互式过滤器。
Filters are cool!
很圆滑,是吧?
9.右键点击一个变量,可以创建一个组、集合或计算字段。这些选项允许您对数据进行分组并找到更多见解。
Create more things!
10.您可以快速制作仪表板。只需将完成的工作表拖放到新的仪表板上。然后,查看者可以对您的图表进行排序和过滤,但他们不能破坏您的仪表板。😁
Dashboard at Tableau Public
你可以在 Tableau Public 这里玩我创建的仪表板,探索来自啤酒倡导者的新比利时啤酒评级。
你可以用我用来在 GitHub 刮收视率的 Python 代码克隆 Jupyter 笔记本。请注意,我排除了评级低于 300 的啤酒。
结论
Tableau 非常适合快速创建漂亮的可视化仪表盘。Tableau 不太适合机器学习。你可以得到一条趋势线,显示 R2。但其他任何事情都需要一些技巧。🤸🏾♂️
您可以免费使用 Tableau Public,但是使用私有数据创建数据可视化将需要 Tableau Desktop。截至 2019 年底,这将花费你每月 70 美元。这两款 Tableau 产品都是适用于 MacOS 和 Windows 的可下载程序。
建议大家下载 Tableau Public 玩玩。你可以通过拖放操作——以及随意使用撤销按钮。😉然而,知道自己在做什么并能够快速做出改变是很好的。希望这篇指南能激起你学习更多东西欲望。我第一次学习 Tableau 是和基里尔·叶列缅科的优秀 Udemy 课程: Tableau 10 A-Z 。写这篇文章的时候是 9.99 美元。
如果你想用 Python 制作类似的交互式可视化,我是 Plotly 的粉丝。我在这里写了一篇关于使用 Plotly 的介绍。不过,Tableau 要快得多。
我希望这个指南对你有用。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。👍
我撰写关于 Python、Docker、数据科学和其他技术主题的文章。如果你对此感兴趣,请关注我,在这里阅读更多。
用餐愉快!
tableau+Python:tabby 和地理聚类
使用 K-means 聚类分析探索数据的简单方法。
Dashboard for clustering AirBNB
这是一个关于如何使用 Tableau 扩展在地图上进行 K-Means 聚类的简短教程。
TabPy 可以在这里下载或者,如果你使用 conda:
conda install-c anaconda tabby-server
关于如何安装和运行 tabpy server 的文章有很多,但是我个人遇到了两个问题:
- 权限错误:[WinError 5]访问被拒绝。在这里解决
- 无法使用 windows 批处理文件 startup.bat 运行 tabby server解决方法是安装 tornado-5.1。
正如我提到的,我的目标是测试 tabpy 功能,我选择了集群问题作为最常见的问题之一。K-Means 算法是一个很好的工具,可以在不做任何假设的情况下探索你的约会。关于 K-Means 有很多教程:有些是这里和这里。数据来源— 纽约市 Airbnb 房源 公布于 Tableau 公共资源。
该表由几个维度组成:
- 邮政编码
- 属性类型
- 邻近
- 房型等。
我用邮政编码来绘制地图。主要维度,大家可能会感兴趣:物业类型,主机自(时间维度)。
首先,我创建了两个控制参数来管理集群:
Tableau Control Parameters
聚类方法,顾名思义,就是负责一个聚类算法。
使用 SCRIPT_REAL 函数将脚本嵌入到计算字段中:
使用 tapby 的一个特点是,它将数据作为列表发送到服务器,因此需要将数据转换为 np.array 并在一列中整形。另一个技巧是删除所有具有 NAN 值的行,这在第 16 行完成。
_arg5 和 _arg6 对应管理参数。尽管它们是单个值,但它们也被打包到列表中,因此为了对 python 解包它们,应该使用 _arg5[0] 和 _arg6[0] 。
此外,有时算法不起作用,因为表格计算使用了错误的维度。在我的例子中,我使用了沿着邮政编码的计算。默认的表计算很少工作,所以每次在代码中查找错误之前检查这个选项。
Default Table Calculations
为了看看我们的聚类是否有意义,我添加了几个散点图来可视化潜在变量的联合分布:
- 平均值。价格与评论数量
- 平均值。价格与中值评审分数评级
- 审查数量与总数(床位)
Scatterplots of joint distribution
可以看出,聚类没有很好地定义,所以我们的简单模型和随机选取一样好,但至少它没有错误👌。
为了增加图形和地图之间的交互性,可以创建仪表板动作。我在仪表盘>动作中添加了悬停动作。
这是我第一次使用 TabPy,到目前为止,它的用处有限,但我希望 Tasbleau 将进一步发展它。
附言
此外,有时我会给电报(大部分是俄语)写一些关于资产管理的内容。
基于深度神经网络的表格数据分析
深度神经网络现在是用于表格数据分析的有效技术,与其他技术相比,需要较少的特征工程和较少的维护。
目前,在用于表格数据回归和分类任务的机器学习领域中,表现最好的技术被广泛认为是随机森林、梯度推进机器、K 近邻以及诸如支持向量机的较老技术,这些技术遭受维数灾难,最终开始较少使用。
对于大多数从业者来说,深度神经网络被视为对诸如计算机视觉、图像处理、语言处理/理解和信号处理等任务有用。
在过去几年中,使用深度神经网络进行表格数据回归和分类取得了巨大成功。对于著名的深度学习实践者,如杰瑞米·霍华德,90%的时间使用深度神经网络,通常随机森林或其他方法用于剩余的 10%。
深度神经网络对于对表格数据进行预测既可靠又有效。以前,一些从业者认为随机森林在 99%的情况下是表格数据分析的最佳技术。更多信息请看我关于随机森林的文章:https://medium . com/@ CDT _ 9051/Random-Forests-a-free-lunch-that-that-not-founded-662034 D4 BF 46
深度神经网络可用于表格数据分析的示例
深度神经网络模型可以被训练来执行许多表格数据分析任务:
- 欺诈检测
- 销售预测
- 产品故障预测
- 定价
- 信用风险
- 客户保持/流失
- 推荐系统
- 广告优化
- 反洗钱
- 简历筛选
- 销售优先级
- 呼叫中心路由
- 商店布局
- 商店位置优化
- 员工排班
(来源 Fast.ai 课程 v3)
对于上述一些用法,可能存在伦理问题,请参见本文后面的伦理注释。
例如,Pinterest 用神经网络取代了梯度推进机器,因为它们需要更少的特征工程,更准确,需要更少的维护。
特征工程
机器学习中的大多数当前想法是使用特征工程来预处理您的数据以移除特征,有时对从业者认为数据中的特征进行假设。人们习惯于经典统计学,习惯于去除参数。
当对表格数据使用深度神经网络时,仍然需要特征工程,尽管要少得多。所需的特征工程需要更少的维护。理想情况下,使用神经网络的表格数据分析功能不会被删除,所有的数据都可以保留和增加。
有些特征可能需要仔细检查,至于它们是否会造成歧视,请参见本文下面的伦理部分。
分类变量和连续变量
数据将包含分类变量和连续变量。连续变量是像年龄或体重这样的数字,它们在任意两个值之间有无限多个值。分类变量是那些从离散组中选择的变量,例如婚姻状况或狗的品种。
连续数据可以作为数字输入到神经网络中,就像将像素值输入到深度神经网络中一样。
特征预处理
训练深度神经网络不会自己完成所有需要的特征工程,这将发现特征之间的非线性和相互作用。
在基于图像的数据中使用变换的情况下,相反,在训练之前,使用预处理器预先处理表格数据一次。
这种预处理应该包括填充缺失的数据…对于连续数据,缺失值可以用数据集的中值代替。对于神经网络来说,知道该数据行缺少该特征也很重要。可以添加一个新要素来指示该行中该要素缺少的值,因为这本身就是有价值的信息。这可以防止缺失的特征值影响预测,同时仍然知道该行缺失某个要素的数据。
连续变量可以通过减去特征的平均值并除以特征的标准偏差进行归一化,从而得到介于 0 和 1 之间的值。这使得神经网络更容易训练。
应用于定型集的预处理必须以相同的方式应用于验证集和测试集。
分类变量的嵌入
对于每个分类变量,可以创建一组可训练的权重矩阵,分类变量中的每个类别/类都有一行。这些矩阵被称为嵌入。该嵌入矩阵乘以代表数据行的类别/类的一个热编码向量的结果然后被用作神经网络的输入。这些被训练成为每个分类变量中每个类别/类的一组偏差。
用于表格数据分析的深度神经网络架构
一个简单的完全连接的深度神经网络足以完成几乎所有的表格数据分析任务,例如下面概述的网络。
Neural Network architecture for Tabular data analysis, source Christopher Thomas.
输入层
对于输入层,除了来自每个分类变量嵌入矩阵的结果之外,输入是连续变量的数量。每个嵌入矩阵乘以每个分类变量中数据行的类的一个热编码向量,以形成输入的一部分。
对于复杂的表格数据分析任务,该层可能有 1,000 个输出激活。
矩阵乘法是线性函数。
在大多数情况下,非线性应该是整流线性单元(ReLU)或其变体之一。可以在非线性之后应用批量归一化,以避免过度拟合。
中间层
中间层将具有与来自最后一层的输出激活相同数量的输入,在输入层的示例中为 1000 个输入。对于复杂的表格数据分析任务,该层可能有 500 个输出激活。
同样,矩阵乘法是线性函数,非线性在大多数情况下应该是 ReLU,并且可以应用批量归一化。
在这个例子中,权重矩阵中有 500,000 个参数。为了防止过度拟合,可以应用下面描述的技术。
输出层
输出层将具有与最后一层的输出激活相同数量的输入,在本例中为 500 个输入。在大多数情况下,会有一个线性转换到一个输出,预测值。
过度拟合
过度拟合本质上是匹配特定的数据行,而不是该数据的特征。防止过度拟合是成功使用深度神经网络进行表格数据分析的关键。为了帮助防止过度拟合,可以应用以下技术:
- 重量衰减
- 拒绝传统社会的人
- 批量标准化
重量衰减
权重衰减通过每次更新权重来实现,权重乘以小于 1 的因子,通常在 0.01 和 0.1 之间。这可以防止训练过程中重量增长过大。
这项技术于 1992 年被 Anders Krogh 和 John A. Hertz 发现,是减少过拟合的最古老的神经网络泛化技术之一,他们的论文是:https://papers . nips . cc/paper/563-a-simple-weight-decay-can-improve-generalization . pdf
拒绝传统社会的人
对于培训中的每个小批量,可以随机移除(退出)激活。这可以防止对特定数据项的过度拟合。这是在 2014 年发现的,是减少神经网络中过拟合的最重要技术之一。
Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever and Ruslan Salakhutdinov. Source: http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pd
这显然是杰弗里·辛顿辍学的灵感来源:
“我去了我的银行。出纳员一直在变,我问其中一个为什么。他说他不知道,但是他们经常搬家。我想这一定是因为它需要员工之间的合作才能成功地欺骗银行。这让我意识到,随机移除每个例子中不同的神经元子集将防止共谋,从而减少过度拟合。”
丢弃技术也可以应用于来自嵌入矩阵的输入。
批量标准化
批量标准化显著降低了少量外围输入对训练模型产生过多影响的能力,从而减少了过度拟合。此外,批量标准化可以将训练时间增加一个数量级。
这是由 Sergey Ioffe,Christian Szegedy 在 2015 年发现的,是减少神经网络过拟合的最重要的技术之一。
[## 批量标准化:通过减少内部协变量转移加速深度网络训练
训练深度神经网络是复杂的,因为每层输入的分布在训练过程中会发生变化
arxiv.org](https://arxiv.org/abs/1502.03167)
数据扩充
除了上述缺失数据特征扩充之外,其他技术可以帮助发现隐藏在数据中的特征。
时间序列数据扩充
令人惊讶的是,使用具有时间序列数据的神经网络的现有技术结果并不使用递归神经网络(RNNs ),而是使用基于时间元素生成的特征。这使得大多数时间序列任务可以被视为常规的表格任务。
例如,对于给定的日期,可以从日期要素创建以下要素:
- 一周中的某一天(例如 6)
- 一个月中的第几天(例如 30 日)
- 一年中的某一天(例如 361)
- 周(例如 51)
- 月份(例如 10)
- 年份(如 2016 年)
- 是月初(真/假)
- 是月末(真/假)
- 是银行假日(真/假)
- 离下一个银行假日还有几天(例如 2 天)
- 自上次银行假日以来的天数(如 4 天)
- 黑色星期五(对/错)
- 离黑色星期五还有几天(例如 2)
- 自黑色星期五以来的天数(例如 4 天)
- 自 unix 纪元(如 18148 年)以来经过的时间
这使得基于某些周期性事件的行为能够被发现,例如在发薪日或临近银行假日时的变化。
这些特征中的许多可以被视为分类变量,并被嵌入的矩阵所替代。
其他增强
由于特征的数量不是训练深度神经网络的问题,所以可以结合其他数据集来发现新的见解,例如天气数据。
伦理学
深度学习和机器学习中的伦理是一个重要而有争议的问题,有许多不同的观点。在我看来,当使用深度神经网络时,从业者需要非常小心,避免只使用无法解释高成本决策的模型。还有一个额外的风险是,一些经过训练的神经网络模型的非技术消费者实际上更信任它,而不是他们理解的方法,因为他们认为算法已经在数据中发现了一些隐藏的复杂性。
在高成本决策中,如果一个可解释的模型是接近的或同样准确的,它将是一个更好的选择。刑事累犯案例是不可复制的重要案例。设计模型的从业者几乎总是不会因为模型的使用而遭受痛苦。
仅仅因为一个神经网络模型是可解释的,它就不一定是可解释的。
虽然使用深度神经网络进行表格数据分析的优势之一是可以保留所有特征,但需要注意那些可能产生歧视的特征,如种族和性别。收入和地点也可能无意中歧视群体。应删除可能具有歧视性或仅具有统计相关性的特征(超出相关个人或群体的控制范围)。例如,个人的父母离婚或之前有过不愉快关系的特征。
结论
使用这些技术可以快速准确地对表格数据进行预测。
例如,这种方法被用于罗斯曼商店销售数据竞赛的第三名https://www.kaggle.com/c/rossmann-store-sales/leaderboard,这里有对参赛者的采访:http://blog . ka ggle . com/2016/01/22/rossmann-Store-Sales-winners-interview-third-place-cheng-GUI/
在 NVidia K80 GPU 等典型的 GPU 上,训练一个深度神经网络可以在几个小时内完成,我的实验中,我训练的模型可以让我在一个迟到的提交中进入前 10 名。
在今年早些时候的 PUBG 完成位置 Kaggle 数据比赛中,我自己应用了这些技术,这意味着我在比赛中获得了第 6 名,尽管后来在排名中有所下降。精确度比应用随机森林高三倍以上。
最好对您的数据尝试随机森林和神经网络,看看哪一个表现最好,然后在两者上微调您的超参数,看看哪一个改进和表现更好。
深度神经网络表格数据分析为什么没有更普及
阻碍实践者将深度神经网络用于表格数据的主要问题是缺乏易于使用的库。
通过使用 PyTorch 的 Fastai API,现在有了一个易于使用的表格学习器,它将创建一个表格神经网络模型来匹配您的数据。您的数据需要在 Pandas dataframe 中,这是 python 中表格数据的标准格式。Pandas dataframes 可以从许多数据存储中读取数据,包括 csv、关系数据库、Spark 和 Hadoop。
感谢杰瑞米·霍华德和 Fastai 课程,其中详细解释了这些技术,并且是我在本文中的知识和理解的关键来源。对于任何想了解更多的人来说,在 v3 Fastai 课程中,第 4 课和第 6 课应该会有兴趣。
用机器学习应对气候变化
如果这篇博文的标题看起来有些熟悉,很可能是因为你听说过或者读过这篇在今年 6 月发布的来源全面的论文。这篇论文概述了机器学习可以为减轻气候变化的影响提供有效解决方案的无数领域。虽然整篇论文值得总结(和阅读!),在这篇博文中,我将重点关注我感兴趣的两个特定领域:碳排放捕获/减少和气候预测。
碳排放捕获/减少
2018 年,政府间气候变化专门委员会(IPCC)估计,如果我们不限制并大幅减少全球温室气体排放,30 年内,世界将面临灾难性后果。尽管有国际协议,全球抗议,以及压倒性的科学共识,即如果我们要避免灾难,我们需要减少我们的排放,我们的全球排放量继续增加。如果政府不愿意尽可能快地采取行动减少排放,那么对碳捕获技术的投资就是必要的。虽然这项技术本身存在,但它仍处于起步阶段。但是机器学习可以以多种方式帮助这项新技术。
该文件概述了减少碳排放的三种选择。它还承认,尽管这些技术目前确实存在,但它们概述的应用,特别是与机器学习相关的应用,都是推测性的。
1)天然或半天然方法
虽然全球排放量逐年增加,但森林砍伐也火上浇油。世界上大约一半的热带森林已经被砍伐。更糟糕的是,据估计,每年砍伐森林的总面积为 1870 万英亩,相当于每分钟砍伐 27 个足球场大小的森林。总体而言,森林砍伐约占所有温室气体排放的 15%。
鉴于正在发生的所有森林砍伐,提供工具来帮助跟踪森林砍伐可以为决策者和执法人员提供有价值的数据。根据这篇论文,机器学习可以帮助“使用遥感图像区分选择性采伐和皆伐。”它还可以用来“探测半径一公里内的电锯声,并将其报告给附近的手机天线”,以提醒执法官员非法砍伐森林。
此外,重新造林有助于减少森林砍伐的影响。据估计,在现有的森林和废弃的土地上可以种植 1.2 万亿棵树。ML 可用于帮助定位合适的种植地点、监控植物健康状况、评估杂草以及进一步分析趋势。
2)直接空气捕获(DAC)
直接空气捕获是一种从发电厂废气、工业过程或环境空气中提取 CO2 的技术。通过将空气吹到吸附剂(基本上是海绵)上来提取二氧化碳,然后使用热力化学过程以纯化的形式释放二氧化碳进行封存。下图概述了这一过程。
机器学习可以在许多方面帮助提高效率。根据该论文,它可以用于“加速材料发现过程,以最大限度地提高吸附剂的可重复使用性和 CO2 吸收量,同时最大限度地减少 CO2 释放所需的热量。”它还可以帮助开发“能够承受高温的耐腐蚀部件,以及优化它们与空气吸附剂接触的几何形状。”
3)封存二氧化碳
除非永久储存,否则任何捕获的二氧化碳都将不可避免地释放回大气中。因此,捕获的 CO2 必须被隔离。目前最好的方法是直接注入地质构造,如盐水层(类似于石油和天然气储层),并隔离在火山玄武岩构造中。那么 ML 在这里起什么作用呢?就像石油和天然气公司利用 ML 进行基于地震仪轨迹的地下成像以寻找提取点一样,ML 可用于帮助识别潜在的储存位置。石油和天然气公司使用的模型可以重新用于帮助捕获和注入,而不是提取。此外,ML 可用于监测和维护封存地点,尤其是用于 CO2 泄漏和总体排放检测。这个过程是通过使用传感器测量来完成的,这些测量“必须转化为关于地下 CO2 流量和剩余注入能力的推断。”“在全球二氧化碳储存模拟中使用卷积图像到图像回归技术进行不确定性量化”也取得了成功
气候预测
当前的气候预测模型用于为地方和国家政府决策提供信息,帮助个人计算他们的风险和足迹,并估计我们的排放物的潜在影响。机器学习有助于提高更准确地模拟这些预测的能力。这些进步很大程度上源于数据的可用性。虽然更多的数据并不总是等同于更准确的模型,但从全球更多地区获得更多的同类数据有助于提高准确性。例如,根据这篇论文,“更新更便宜的卫星正在产生数十亿字节的气候观测数据。”基于这些信息的模型还会生成数十亿字节的模拟气候数据,因此这些模型往往会相互依赖。最后,这些预测在计算上是昂贵和耗时的。因此,气候科学家已经开始使用 ML 技术来解决这些问题。
1)将数据、ML 和气候科学结合起来
为什么气候科学家越来越依赖机器学习模型?根据这篇论文,这些模型“可能比其他模型更准确或更便宜,因为:1)有丰富的数据,但很难用传统的统计方法对系统进行建模,或者 2)有好的模型,但它们在生产中使用的计算成本太高。”
ML 模型已经在气候科学家中用于各种目的。它们已被用于校准卫星传感器、对作物覆盖进行分类以及识别污染源。也有人提出深度学习可以用于“模式识别、超分辨率和气候模型中的短期预测”,以及汇编环境图像的数据,以进一步加速该领域的 ML 工作。
此外,深度神经网络,结合现有的热力学知识和以前收集的数据,可以用来模拟气候模型中一些最大的不确定性来源:云,冰盖和海平面上升。明亮的云反射光线并帮助冷却地球,而乌云吸收光线并保持地球温暖。这些过程的物理模型和预测它们随着气候变化的最终影响在计算上过于昂贵,无法包括在全球气候模型中,但机器学习模型不是。根据这篇论文,“Gentine 等人训练了一个深度神经网络来模拟高分辨率云模拟的行为,并发现该网络以一小部分成本给出了类似的结果,并且在简化的全球模型中是稳定的。”
由于各种原因,冰盖和海平面上升很难建模。最大的问题是收集数据。因为这些地区是孤立的,黑暗的,寒冷的,它们很难被观察到,因此很难收集数据。然而,在过去的几年里,新的卫星活动使我们能够收集这些地区的万亿字节的数据。然而,最大的问题是准确模拟这些冰盖的质量损失及其对海平面上升的影响。这些模型中最大的改进领域涉及雪和海冰的反射率,因为大部分太阳光被这些冰层反射,热量没有被吸收。随着这些冰原融化,地球将吸收热量并继续融化冰原,从而导致海平面更大的上升。
2)预测极端事件
天气模型比气候模型更容易制作,也更精确。由于天气模型跟踪大气中的快速变化,并且有大量信息可用于预测这些变化将产生的影响,因此模型每天都要进行测试和更新,以准确预测短期天气状况。然而,精确的气候模型要难得多。它们只能通过长期观察来检验,任何超过一周的时间都很难预测。此外,用于预测的所有可用数据集都严重倾斜,因为极端事件很少发生,而且历史数据严重缺乏。虽然目前的气候模型可以帮助预测长期趋势的变化,但这些模型的准确性需要大大提高。
机器学习已经被成功地用于对一些极端天气事件进行分类。深度卷积神经网络已被用于计算过去气候数据集中的气旋和天气锋,一些技术已被用于跟踪风暴和龙卷风。此外,最大似然法还被广泛用于本地天气模型预测。“许多作者已经使用支持向量机、自动编码器、贝叶斯深度学习和超分辨率卷积神经网络进行了尝试。”这些模型已经被用于预测不同地区的洪水模式。随着越来越多的数据可用,长期气候预测的准确性有望提高。
结论
虽然整篇文章都值得一读,但这篇文章特别关注了两个部分:碳捕获和气候预测。机器学习可以像石油和天然气公司一样用于寻找注入点和监控封存的二氧化碳。至于气候预测,随着更多数据的可用,ML 可以得到更好的利用,并用于更好地模拟冰盖融化和海平面上升将带来的不确定性。
用 NLP 解决增长问题
业务增长伴随着一系列挑战。
Photo by Everaldo Coelho on Unsplash
在这个例子中,创建了一组业务规则和一个 NLP ( 自然语言处理)模型来自动回答客户的退货请求。特殊性,我将侧重于 NLP 方面。Tf-idf 用于解析客户注释,以允许或停止对客户退货请求的自动回复。
TLDR
为了解决退货请求增加的问题,我们使用了监督机器学习(NLP) 工具来进一步增加自动回复的数量,从而提高生产率并减少回复时间。
现状
每个零售企业都必须处理退货。与应用过程相关的关键方面与问题的维度有关。如果退货数量很少,也许可以通过在 Excel 电子表格上登记退货并手动回复客户来解决。另一方面,如果返回请求的数量超过了一个控制良好的流程的人工阈值,就必须应用一些自动化。
在我们公司,我们有后者。在没有额外措施来降低回报的情况下,业务增长使得问题更加严重。自 2015 年以来,退货请求的数量翻了一番,显然这是我们未来必须应对的趋势。事情需要改变。
Return requests by year and month
有一段时间,人们更多地关注这项任务,让其他任务退出,从而解决了这个问题。
第二步是创建一组业务规则(自动应答管道),可以解决所有不需要特殊处理的退货请求(经常销售、无损坏或无保修的商品)。这一步骤使我们能够在 2018 年底之前解决很大一部分退货请求。但是,我们开始触及一个平台,再次,新的步骤需要做。
Return answers by type
为客户退货单开发 NLP
在 2019 年初,我们注意到我们无法增加通过自动管道运行的请求数量。
分析发生这种情况的原因,每当客户在退货请求中添加备注时,管道就会停止。我们收到了大约 40%的带有备注的退货请求:
Percentage of return requests with notes on them
当然,其中一些纸币对自动流水线完全无害。像“我请求零件时犯了一个错误”或者“零件不是我想要的”或者甚至“你错误地将零件分类,给我的是左边的而不是右边的”。
这是第三步的开始:向客户退货单引入 NLP,以便可以触发或不触发管道。
这是一个简单的“情绪分析”问题。客户注释阻止了管道(0)或允许了管道(1)。
关于 TF-IDF 的 NLP 的一点背景
TF–IDF 代表词频–逆文档频率。
来自维基百科,是一个数字统计,旨在反映一个单词对集合或语料库中的文档有多重要。在信息检索、文本挖掘和用户建模的搜索中,它经常被用作加权因子。TF–IDF 值与单词在文档中出现的次数成比例增加,并由语料库中包含该单词的文档数抵消,这有助于调整某些单词通常更频繁出现的事实。TF–IDF 是当今最流行的术语加权方案之一;数字图书馆中 83%的基于文本的推荐系统使用 TF–IDF。
TF–IDF 加权方案的变体通常被搜索引擎用作在给定用户查询的情况下对文档的相关性进行评分和排名的核心工具。TF–IDF 可以成功用于各种主题领域的停用词过滤,包括文本摘要和分类。
这是一个重量计算公式:
处理数据
至于任何有监督的机器学习,我们需要为客户笔记贴上标签。
我们已经开始标记大量的客户笔记,时刻意识到平衡分类的重要性。我们可以很容易地用标签 1(允许自动流水线)对更多的笔记进行分类,但这将使训练和测试数据更加偏向一边。
在 5000 张贴有标签的笔记中,我们知道这有点不平衡,但我们可以接受:
然后,我们在训练和测试中分割数据:
并在我们的业务领域词典中增加了葡萄牙语词典中的停用词:
培训和测试
下一步是在分类器中加入所有准备工作,并拟合模型:
并使用测试数据来评估模型:
不错,93.4%的准确率和 94.1%的 F1 分。
分析混淆矩阵,大多数笔记被正确分类,其中 156 被分类为停止流水线但不需要停止(类型 1 错误),124 被分类为不停止但应该停止(类型 2 错误)。对于我们的业务领域,类型 2 的错误是最糟糕的,对于未来的工作,应该进一步处理。
总结
NLP 是提高任务自动化和解决日益复杂的业务流程的关键工具。对于未来的工作,可以采用其他方法(其中之一是 LSTM),甚至可以使用自动化的 ML 工具。
我希望我对我们正在应对的挑战和我们正在应用的解决方案有所了解。在接下来的几个月里,我们将继续进一步增加自动回答的数量,并再次提高效率和客户满意度,让人们专注于更多面向客户的任务。
我将把工作结果留给你:自 2018 年以来,我们使用机器学习将自动答案的数量增加了 20%以上。
Return answers by type
基于潜在狄利克雷分配的标签推荐算法
我们将用 python 开发一个 LDA 模型,根据用户的 StackOverflow 帖子向用户推荐标签
Word Cloud of tags in Stack Overflow
一般来说,LDA 用于对原始数据集进行降维,然后再应用其他机器学习算法,这些算法将受益于更少的维数。这里我们将把它用于另一个目的,即实现一个推荐系统。
资料组
我们的数据集来自 stackexchange explorer,要从网站导出帖子,您必须进行如下 SQL 查询:SELECT * FROM posts WHERE Id < 50000
默认情况下,每个 SQL 查询的执行时间都有时间限制,这使得很难一次恢复所有数据。要检索更多的结果,请记住使用对 id 的约束进行查询。
现在我们有了数据集,下一步是做一些文本预处理,也就是说:
- 使用美汤库移除 html 格式
- 降低文本
- 转换缩写
- 删除停用词
- 单词的词形变化——将单词的词形变化组合在一起
- 去掉动词和形容词,因为它们不能提供关于文章的有价值的信息
Pre-processing functions
TF-IDF
TF-IDF 是 Text Frequency-Inverse Document Frequency 的缩写,它旨在衡量一个术语在文档语料库中对一个文档的重要性。术语权重=术语频率×idf(术语)
definition of inverse document frequency
Converting training and test post to matrices of TF-IDF features
皱胃向左移
LDA (潜在狄利克雷分配)是一种基于以下假设的生成式非监督方法:
- 语料库中的每个文档都是一组没有顺序的单词(单词包)
- 每个文档以不同的比例涵盖了多个主题 p(θm)
- 每个单词都有一个与每个主题相关的分布 p(ϕk) 。因此,每个主题可以由每个单词的概率来表示
- zn 代表单词 wn 的主题
因为访问受限于文档,所以有必要确定什么是主题、每个词在主题上的分布、每个主题在语料库上出现的频率。
LDA representation in the form of a graphical probabilistic model
我们使用**sk learn . decomposition . latentdirichletallocation、**训练不同的 lda 模型,每个模型都有不同数量的主题,然后我们使用度量困惑度在测试集上评估不同的模型。
definition of perplexity
L( w )是看不见的文档 w 的对数似然;困惑度越低,模型越好。
lda algorithm
最低的困惑分数是针对 10 个主题的,所以我们将学习包含 10 个主题的 lda 模型。
推荐算法
现在我们有了模型,我们将研究推荐算法。它将基于两个要点,即:
- 得分=文档被分配给主题的概率×主题生成单词的概率
- 当一个单词的分数高于定义的阈值时,该单词被认为是相关标签
在尝试了阈值的不同值之后,我们选择了阈值 0.010 ,这是因为使用该值,测试集标签具有看起来像训练集标签的分布,并且还因为使用阈值等于 0.010,超过 90% 的帖子具有推荐标签。
Tags recommender using LDA
估价
我们将使用 Jaccard 评分来评估我们的模型,该评分用于将样本的预测标签集与相应的标签集进行比较。
Jaccard score definition
Jaccard score function
我们的 LDA 模型在测试集上的 Jaccard 得分是 3.98% ,而使用 OneVsRest 方法(简单基线)的哑分类器使得 0.90% 。这表明我们的 LDA 模型肯定比随机模型好,因为它已经成功地正确预测了一些标签,尽管事实上它是一个无监督的模型。但是为了有一个我们推荐系统正常运行的真正指标,我们必须对一些帖子,模型输出的标签与我们手动认为相关的所有标签进行比较。
例子
下面的两个例子表明,LDA 推荐器的性能取决于帖子的精确度和用户问题的详细程度。
Recommended tags for example 1
第一个例子是一个详细帖子的完美例子,所以对于基于无监督算法的推荐器来说,返回相关标签很简单,这里就是这种情况。帖子是关于 html/css 的问题,程序显示这 2 个标签。
Recommended tags for example 2
在这个例子(2)中,帖子很短,没有具体的细节来帮助程序推荐感兴趣的标签。这里唯一推荐的标签是*‘table’*,不能真正认为是相关标签。
如果你想有更多相关的标签,你必须给算法更多关于文章的信息,比如在你的程序中考虑文章的标题。
源代码可以在 Github 上找到。请随意分享你的想法和想法。
定制储蓄推荐器
Photo by Fahmi Fakhrudin on Unsplash
我们很可能每天都与推荐系统进行交互。无论是听 Spotify 推荐的歌曲,还是浏览亚马逊网站上的“顾客也购买了……”栏目,或者尽情享受网飞推荐的新电视节目,我们都在使用推荐系统。所以对于这个项目,我想,我如何利用它来节省一些钱?在这篇文章中,我将带您浏览我构建的原型,它根据用户的消费习惯提供量身定制的储蓄建议。这个项目的代码可以在我的 Github 上找到。
让我们以赤道咖啡为例,因为我在那里花了很多钱。赤道公司在旧金山有几个位置,离我的工作地点和家都很近。为了这个例子的目的,我们会说我在工作,准备喝咖啡休息。如果你在 Yelp 上搜索 Equator,它的价格水平是$美元,星级是 4.5,离我工作的地方大约一个半街区。
通常我会去赤道买一杯午后拿铁,但如果有另一家咖啡店,距离和质量都差不多,价格也更便宜,我可能会去那里,这样可以省钱。这个系统的建立是为了帮助我找到像这样的地方,在那里,习惯的轻微改变,可以随着时间的推移积累很多钱。在这个例子中,我的系统推荐了足够的茶和咖啡,它距离我的工作地点大约 2 个街区,星级为 4.5,价格只有$级,如下所示。
目标是:
我这个项目的目标是利用我的个人消费习惯来创建量身定制的储蓄建议,以最小的生活方式影响为我省钱。我仍然希望能够去喝咖啡,但希望能以更便宜的价格去做。
我想象这个推荐系统正在被一家银行使用。他们已经可以接触到你所有的信用卡交易,这是对你消费习惯最准确的描述。一家银行为你推荐与你经常消费的类似的更便宜的商家,可以把省下来的钱转到他们的储蓄账户上。
构建推荐器:
第一步:收集+清洁
构建我的推荐器的第一步是收集旧金山的商业数据。我使用旧金山市和县提供的注册企业位置数据集的子集作为企业列表。从这个业务列表中,我调用了 Google Places 和 Yelp Fusion APIs 来获取业务信息。我主要使用 Yelp Fusion API 数据,并使用 Google Places API 填充空值。
在组合了来自两个 API 的业务信息之后,我仍然有一些空的价格层值。我使用 k=5 最近邻的 KNN 插补来填充这些缺失的价格值。
我还收集了包含 4 个月信用卡交易历史的个人银行对账单。这些将被输入我的原型,作为推荐的基础。
第二步:评论+主题
接下来,我对商业 yelp 评论做了一些自然语言处理。在我的数据集中,每个企业都有一些评论,我把它们合并成一个段落。我首先对段落中的单词进行词条化,然后使用词频-逆文档频率(TF-IDF)进行矢量化。
TF-IDF 是确定一个单词对语料库中的文档有多重要的度量。换句话说,对于商业评论段落中的每个词,我想看看这个词在解释该商业相对于数据集中其他商业的重要性。例如,使用 TF-IDF,单词“food”可能不是一个权重很大的单词。虽然“food”可能经常出现在某个餐馆的评论中,但当数据集主要由餐馆组成时,这对于区分该业务没有太大的价值。另一方面,双字母“asian_food”将具有更高的权重,因为它是该业务与整个业务集的更好区分符。比较两个“亚洲食品”企业会比比较两个“食品”企业提供更多的价值,这两个“食品”企业最终可能完全不同,就像一家高级餐厅和一家廉价咖啡馆。
一旦我有了数据集中每个企业的 TF-IDF 向量,我就使用非负矩阵分解(NMF)进行主题建模。NMF 是一种将一个矩阵分解成两个不包含负元素的矩阵的方法,它在评论和推文等较短的文本上非常有效。我使用一个 scree 图来确定使用 NMF 生成的主题数量(15)。最后,我为我的数据集中的每个企业制作了主题向量,显示了每个主题与该企业的相关性。
第三步:比较+匹配
我现在有了一个数据框架,其中包含旧金山数千家企业的主题向量和其他属性。我的下一步是比较这些企业,寻找相似之处。我使用余弦相似度进行比较,使用每个企业的所有数字特征。余弦相似度查看 2 个企业的向量,并计算这些向量之间角度的余弦,其中相似企业的余弦相似度更接近 1。这给了我一个矩阵余弦相似性得分为每个企业相比,所有其他企业在数据框架。
为了找到对某个企业的推荐,我会首先选择余弦相似度最高的 25 个企业,然后根据匹配类别的数量和它们的哈弗线距离对它们进行加权。我的数据框架包含了来自 yelp 的每家企业的类别,比如“咖啡”、“咖啡馆”、“餐馆”等等。拥有更多与所访问的企业相匹配的类别的企业将更有可能被推荐。类似地,离被访问的企业更近的企业也更有可能被推荐。
第四步:提炼+推荐
我为这个原型使用了一个基于内容的推荐系统。这意味着推荐严格基于个人消费习惯和信用卡交易历史中出现的企业属性。
一旦我有了上一步的匹配列表,我就通过比较价格水平和等级来提炼这些匹配。我的建议将只针对具有同等或更高 yelp 评级以及更低 yelp 价格等级的地方。
最终想法:
为了将所有的东西整合在一起,我开发了一个 Flask 应用程序,它可以读取我过去 4 个月的信用卡交易历史,并提供消费汇总以及储蓄建议。
它首先提供了上传的银行对账单中每个月的 5 个类别的支出明细:食品、咖啡、零售、服务和酒吧/娱乐。右边的图表让我们可以很容易地看到每个类别的支出如何逐月波动。
应用程序的下一部分显示了每个类别中的业务细分,以及在上传的银行对账单的整个跨度内每个业务的支出。
最后,该应用程序根据我已经花钱的业务提供建议,并显示如果我转向这些推荐的业务,我每月和每年可以节省多少钱。我可以点击任何一个推荐,然后直接进入商业 Yelp 页面获取更多信息。
你可以通过下面的链接观看我的应用程序的演示。
drive.google.com](https://drive.google.com/file/d/1dKqGrO_3uEuxEP5yhweVmOlmCtNYqET7/view?usp=sharing)
我真的很喜欢这个项目,并熟悉自己的推荐系统。感谢阅读!
新闻和里程碑
最后更新于 2022 年 10 月
了解 TDS 的最新动态
Photo by Joanna Kosinska on Unsplash
2022
2022 年 9 月 13 日。在 TDS 上提炼作者经验。写一篇 TDS 级别的文章需要花费大量的时间和精力,所以让我们所有的投稿人感受到支持、欢迎和良好的导向对我们来说非常重要。为此,我们最近推出了一个新指南,帮助作者充分利用他们在 TDS 上的体验。它充满了资源和提示,所以我们希望你检查一下。
2022 年 9 月 6 日。我们喜欢和 TDS 作者交谈。我们刚刚与 Barry s myth 进行了一次生动的对话,以此庆祝我们的第 50 个作者聚焦专题。这是浏览我们 Q &深度档案的绝佳时机,因为有各种各样的数据专业人士:从 Cassie Kozykov 和 Sophia Yang 这样的行业领袖到 Eric J. Daza 和 Lowri Williams 这样的研究人员。
2022 年 8 月 29 日。生日快乐,中等! TDS 从第一天起就给 Medium home 打电话,所以纪念平台十周年特别令人激动。
感谢你的阅读、写作和分享。以下是我们第一个十年的一些亮点。
blog.medium.com](https://blog.medium.com/it-happened-on-medium-the-first-10-years-5d55c1e26c1d)
2021
2021 年 7 月 22 日。参与。如果你关心数据科学在为人类和社区建设一个公平、可持续的未来中的作用,我们最近创建了一个充满想法和建议的指南,以激励你采取行动。
2020
2020 年 11 月 28 日。走向数据科学拥有 50 万粉丝!🎉我们非常感谢所有定期加入我们的优秀读者和作家。在过去的几年里,我们一起成长了很多,我们很高兴成为最大的媒体出版物之一。非常感谢您的支持和参与,并加入我们的社区!
2020 年 10 月 20 日。我们刚刚选择了 Medium 的新测试版设计!它提供了我们认为对我们的读者和作者都有价值的新功能。我们确实丢失了我们的菜单(它很快就会回来),但是我们相信我们文章底部的推荐和我们作者在侧边栏上的介绍是非常有价值的。
2020 年 6 月 6 日。阅读我们的媒体出版物时你应该知道的。由于 TDS 在过去几年中发展如此之快,我们决定整理一份术语列表,向读者解释与数据科学的关系。如果您有任何问题,请告诉我们。
2020 年 2 月 26 日。 我们发布了多伦多机器学习峰会的第一个视频!我们希望你喜欢它。🎤
2020 年 1 月 2 日。我们改进了我们的外观和标识!经过三年多的时间,我们决定是时候让我们的出版物焕然一新了。您可以在我们的媒体出版物和社交媒体账户上找到我们的新标志。这些变化并不极端,但我们想让你知道🙂新年快乐!
2019
2019 年 11 月 25 日。**继续学习数据科学。**为了帮助你以适合你的速度学习,我们按照主题选择并组织了所有对你最有帮助的内容。我们希望这能给你一个类似于一些最好的在线课程的学习体验,但采用我们熟悉的数据科学风格。
Toronto Machine Learning Summit
2019 年 11 月 22 日。感谢大家来到多伦多机器学习峰会。我们度过了一段美好的时光,迫不及待地想开始为你们制作在线视频。
2019 年 11 月 5 日。如果你开始写关于数据科学或机器学习的文章,我们收集了一些可能对你有帮助的文章。从我们最好的作者那里获得灵感和探索建议。
2019 年 10 月。走向数据科学三岁了!这是一个奇妙的旅程,我们非常感激有这么多了不起的作家和读者加入我们。从一个致力于发表我们所能找到的最好的数据科学文章的小型出版物到最大的媒体出版物之一,您的支持和参与使这里成为一个令人难以置信的地方。我们迫不及待地想看到我们在接下来的三年里共同打造的东西!非常感谢你成为我们社区的一员。✨
2019 年 10 月 14 日。我们的团队在壮大。感谢 Anne Bonner 和 Amber Teng 加入编辑团队,感谢 mal、Tyler Folkman、Xin-Jou Lin、Jatin Bhasin、Luke Morris、Luca Belmonte、Pier Paolo Ippolito 和 Lester Leong 成为编辑助理。
2019 年 10 月 3 日。我们现在正致力于通过提供一些我们最好的文章的便捷的音频解说,让您的生活更加美好。我们选择的叙述性文章包括由我们的专业叙述者团队精心策划的内容。📖
2019 年 9 月 20 日。我们播客的第一季已经播出。攀登数据科学阶梯,与世界级公司的经验丰富的数据科学家进行对话,如 LinkedIn、脸书和 Airbnb。🎧
2019 年 9 月 13 日。我们的每周精选将很快被我们的每周文摘所取代。我们的文摘将为读者提供个性化的推荐,并将直接发送到您的收件箱。你可以通过我们的媒体出版物订阅。
Get inspired
2019 年 5 月 25 日。我们选择了三篇文章来激励你开始撰写关于数据科学和机器学习的文章。点击上面的图片可以重定向到我们的文章。
2018
Photo by Leone Venter on Unsplash
2018 年 12 月 13 日。 如何充分利用数据科学。我们已经收到反馈,你们中的一些人发现很难有效地浏览我们的媒体出版物。所以我们把几个要点放在一起,希望对你在我们博客上的体验有所帮助。📚
2018 年 10 月 15 日。感谢周宇、Andrew DeCotiis-Mauro、Rui Geng、Hamza Bendemra、Rohan Joseph、Juilien Hsu、Helen Ngo、查敏 Nalinda、Benjamin Cooley、Hessie Jones、Josh Fleming 以及今年作为编辑助理加入并帮助我们的其他人。
2018 年 5 月 5 日。我们新的关于我们的页面:“**我们于 2016 年 10 月加入 Medium 充满活力的社区。**一开始,我们的目标只是收集好的帖子,然后分发给更广泛的受众。仅仅几个月后,我们很高兴地看到,我们的受众增长非常快,并且有许多新的贡献者。”阅读更多
2017
2017 年 8 月 22 日。 Medium 推出了互联网的首个开放式付费墙。这种付费墙使创作者能够*“*从相信想法和创意值得付费的读者群体中赚钱”。
用你自己的方式讲述你的故事——用不同的方式来写作,塑造风格,给你的作品打上烙印。借助简单的工具和功能…
medium.com](https://medium.com/creators)
2017 年 3 月 11 日。我们先来看一下 每周精选 。在这里,我们挑选了一些优秀的帖子,如果你错过了,值得一读。我们希望您能像我们一样发现这些信息和乐趣!
2016
2016 年 10 月。 我们刚刚创建了一个媒体刊物来发表数据科学和机器学习文章。我们正在寻找作家提出最新的内容,主要集中在数据科学,机器学习,人工智能和数据新闻。☀️