Python 中的自动图像质量评估
图像质量是一个高度依赖于观察者的概念。一般来说,
它与观看它的条件相联系;所以是一个主观性很强的话题。图像质量评估旨在定量地表示人类对质量的感知。这些指标通常用于分析计算机视觉不同领域中算法的性能,如图像压缩、图像传输和图像处理[1]。
图像质量评价(IQA)主要分为两个研究领域(1)基于参考的评价和(2)无参考的评价。主要区别在于,基于参考的方法依赖于高质量的图像作为源来评估图像之间的差异。基于参考的评估的一个例子是结构相似性指数(SSIM) [2]。
无参考图像质量评估
无参考图像质量评估不需要基础图像来评估图像质量,该算法接收的唯一信息是其质量正在被评估的失真图像。
盲法主要由两个步骤组成。第一步是计算描述图像结构的特征,第二步是根据人类的意见在特征中寻找模式。TID2008 是一个著名的数据库,遵循一种描述如何从参考图像中测量人类意见得分的方法[3]。它被广泛用于比较 IQA 算法的性能。
对于使用 TensorFlow 2.0 的深度学习方法的实现,请检查:
[## 使用 TensorFlow 2.0 进行深度图像质量评估
使用 TensorFlow 2.0 实现基于深度 CNN 的盲图像质量预测器(DIQA)的分步指南
medium.com](https://medium.com/@ocampor/deep-image-quality-assessment-with-tensorflow-2-0-69ed8c32f195)
盲/无参考图像空间质量评估器(BRISQUE)
在这一节中,我们将一步一步地编写 python 中的 BRISQUE 方法。你可以在这里找到完整的笔记本。
BRISQUE [4]是一种仅使用图像像素来计算特征的模型(其他方法是基于图像到其他空间的变换,如小波或 DCT)。由于它不需要任何变换来计算其特征,因此被证明是高效的。
BRISQUE 依赖于空间域中局部归一化亮度系数的空间自然场景统计(NSS)模型,以及这些系数的成对乘积的模型。
空间域中的自然场景统计
给定一幅图像,我们需要通过局部均值减法计算局部归一化的发光,并将其除以局部偏差。添加一个常数是为了避免零除法。
*Hint: If I(i, j) domain is [0, 255] then C=1 if the domain is [0, 1] then C=1/255.
为了计算局部归一化发光,也称为均值减去对比度归一化(MSCN)系数,我们必须计算局部均值。这里, w 是大小为(K,L)的高斯核。
作者显示局部平均值的方式可能有点混乱,但它是通过对图像应用高斯滤波器计算出来的。
然后,我们计算局部偏差
最后,我们计算 MSCN 系数
作者发现,对于失真图像的更宽频谱,MSCN 系数分布为广义高斯分布(GGD)。GGD 密度函数为
在哪里
г是伽玛函数。参数α控制形状,σ控制方差。
相邻 MSCN 系数的成对乘积
相邻系数的符号也呈现出规则的结构,在失真的情况下会受到干扰。作者提出了沿四个方向(1)水平方向 H 、(2)垂直方向 V 、(3)主对角线方向 D1 、(4)次对角线方向 D2 的相邻 MSCN 系数的成对乘积模型。
此外,他还提到 GGD 并不能很好地拟合系数乘积的经验直方图。因此,他们建议拟合非对称广义高斯分布(AGGD)模型,而不是将这些系数拟合到 GGD[5]。AGGD 密度函数为
在哪里
并且侧可以是 r 或 l 。前一个公式中没有反映的另一个参数是平均值
拟合非对称广义高斯分布
[5]中描述了拟合非对称广义高斯分布的方法。总之,算法步骤是:
- 计算γ,其中 Nₗ是阴性样本的数量,Nᵣ是阳性样本的数量。
2.计算 r 帽子。
3.使用γ和 r hat 估算值计算 R hat 。
4.使用逆广义高斯比的近似值估计α。
5.估计左右比例参数。
计算 BRISQUE 特征
计算图像质量所需的特征是将 MSCN 系数和移位乘积拟合到广义高斯分布的结果。首先,我们需要将 MSCN 系数拟合到 GDD,然后将成对乘积拟合到 AGGD。这些功能的摘要如下:
亲自动手
在创建了计算 BRISQUE 特征所需的所有函数之后,我们可以估计给定图像的图像质量。在[4]中,他们使用了来自柯达数据集[6]的图像,所以我们在这里也将使用它。
辅助功能
1.加载图像
2.计算系数
在计算了 MSCN 系数和成对乘积之后,我们可以验证分布实际上是不同的。
3.用系数拟合广义高斯分布
4.调整图像大小并计算 BRISQUE 特征
5.缩放特征并馈送给 SVR
作者提供了一个预先训练的 SVR 模型来计算质量评估。然而,为了得到好的结果,我们需要将特征缩放到[-1,1]。对于后者,我们需要与作者用来缩放特征向量的参数相同的参数。
用于表示图像质量的标度从 0 到 100。图像质量为 100 意味着图像质量非常差。在被分析的图像的情况下,我们得到它是一个好质量的图像。
结论
该方法在 TID2008 数据库中进行了测试,效果良好;即使与参考的 IQA 方法相比。我想检查其他机器学习算法的性能,如 XGBoost,LightGBM,用于模式识别步骤。
Python 笔记本
**更新 2019–12–02:**包含对 Windows 10 的支持
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
bit.ly](http://bit.ly/github-brisque)
参考
[1]matre,H. (2017)。从光子到像素:数码相机手册。约翰·威利父子公司。
[2]王,z .,博维克,A. C .,谢赫,H. R .,,西蒙切利,E. P. (2004 年)。图像质量评估:从误差可见性到结构相似性。IEEE 图像处理汇刊,13(4),600–612。
[3]波诺马伦科,n .,卢金,v .,泽连斯基,a .,埃吉亚扎里安,k .,卡利,m .,&巴蒂斯蒂,F. (2009 年)。tid 2008-评估全参考视觉质量评估指标的数据库。现代无线电电子学进展,10(4),30–45。
[4]米塔尔、穆尔西和博维克(2012 年)。空间域中的无参考图像质量评估。IEEE 图像处理汇刊,21(12),4695–4708。
[5]n . e . las mar,y . Stitou 和 Berthoumieu,Y. (2009 年)。用于纹理分析的多尺度偏斜重尾模型。国际图像处理会议论文集,ICIP,(1),2281–2284。
自动问答
从结构化和非结构化数据中查询信息变得非常重要。有大量的文本数据、FAQ、报纸、文章、文档、用户案例、客户服务请求等。很难记住所有的信息。谁赢得了上届欧洲杯足球赛?比特币是什么?一个著名歌手的生日是什么时候?为了找到一些信息,我们需要搜索一个文档,在找到答案之前花几分钟阅读。适马软件公司的数据科学家、本文作者纳扎尔·格里舒克认为,自动 QnA 系统可以节省我们生活中最宝贵的资源——时间。
首先,让我们讨论一下有哪些类型的问题,以及用户可以期待这些问题的什么答案。
所有的问题都可以分为几种类型:
- 一般问题,有是/否答案
- 疑问句,开头是:谁,什么,哪里,什么时候,为什么,如何,多少
- 选择题,问题中有一些选项
- 仿真问题,在文本中可以找到完整的答案。这类问题的答案由一个或几个相继出现的单词组成
在本文中,我们将重点关注仿真陈述问题回答方法,它可以处理广泛的问题,并涵盖其中最困难的一种类型。
本文将要讨论的方法是基于一种专门为仿真问答设计的算法。至于其他问题类型(一般问题、特殊疑问句、选择问题),该算法可以在一些调整之后应用。此外,一些想法可以被重用来创建您自己的方法。
主要仿真问答方法
通常,问答系统由几个逻辑块组成:
- 数据源,
- 信息检索系统,
- 机器阅读理解模型(MR 模型)
- 一个或多个附加模块,例如用于文本预处理、答案后处理、检查和稳定的模块。
让我们看看这些模块是如何相互作用的:
如图所示,当问题被转移到系统时,要做的第一步是搜索可以包含问题答案的文本。这种文本的来源可以包括各种网页、存储在本地盘上的文档、维基百科等。
下一步是从找到的所有信息中选择最相关的文本。为此,可以使用以下方法:TF-IDF 相似度、Jaccard 索引、单词嵌入、深度学习文本相似度算法。所有这些方法都有优点和缺点,预处理和获得相似性指数需要不同的时间/内存。没有适用于所有情况的灵丹妙药或最佳方法。哪种方法最适合具体的任务取决于几个因素,如领域、数据集、数据量。这个问题很复杂,有很多方面,每个月都会有一些关于信息检索/文本相似性任务的文章发表。
信息检索系统
根据维基百科,“开放领域问答系统旨在针对用户的问题返回答案。返回的答案是短文本的形式,而不是相关文档的列表。”
如果你选择回答开放领域的问题,信息的来源可以是:你自己的文档,常见的抓取,维基百科,一些本体像 DBpedia 或谷歌知识图,你也可以尝试谷歌自定义搜索引擎。
如果你决定使用维基百科,有两种方法。第一个是在下载的维基百科页面中搜索。第二个是从问题中提取实体(例如,人名、位置、日期),然后提取具有这些实体的所有维基页面。但是,有一种可能性是,带有实体的 Wiki 页面没有涵盖您的问题,您将无法在文本中找到答案。
在我们的项目中,选择了 Google 定制搜索引擎,因为它不仅从 Wiki 返回最相关的信息,还从其他索引页面返回。可以通过添加特殊参数、位置、主题、网站类型等来调整搜索。此外,Google 自定义搜索引擎会返回一个带有简短摘要的 URL 列表,可用作接下来步骤的答案段落。
这是一个使用不同方法自动找到相同问题答案的例子。
在前面的步骤中,我们得到了一个相关文档的列表。下一步是将文档拆分成段落,并找到最相关的段落。
使用了以下算法:
- 基于单词嵌入的 TF-IDF/JAC card/余弦距离的段落排序
- 深度学习(DL)方法,如具有平均集中和注意力的双 LSTM 模型(https://arxiv.org/pdf/1511.04108.pdf)
根据数据,0.63-0.85 的 F1 分数可以存档。作为这一步的结果,我们将得到一个按照相似性指数排序的段落列表。让我们选择与下一步最相关的 5-10 个。
机器阅读
最后一步是最有趣的。我们有一个问题和一篇文章。这个想法是从文章中提取答案。这里有很多方法可以应用。例如,您可以为问题和段落建立一个抽象表示,获得一个问题类型(这样您就会知道答案类型),并获得一个答案。但是在实践中,这种方法是相当复杂的,即使对于具有受限问题类型和实体的封闭领域问题。
大多数现代方法都基于深度学习。为了使用这些方法,我们需要数据集。有一个数据集列表,比如 SQuAD,CNN\Dayli Mail,MSMarco,TriviaQA,WikiReading,用来训练神经网络(NN)。
我们已经在小队数据集 v1 和 v2 上训练了我们的模型。V1 包含 100,000 多个问答配对,内容来自 500 多个与不同主题相关的文档。在 v2 中,增加了 50K 个没有答案的问题。在这个数据集上训练和测试的模型可以通过排行榜进行比较。数据集的结构如下所示:
还有另一种类型的数据集,问题的答案不在上下文中。Marco 女士就是这种数据集类型的一个例子。有 1M+ Bing 用户查询,160к+回答。
这里有一个问题回答的好的神经网络结构的列表,可以帮助创建一个问题回答系统。
- https://arxiv.org/abs/1607.04423
- r-NEThttps://www . Microsoft . com/en-us/research/WP-content/uploads/2017/05/r-NET . pdf
- https://arxiv.org/abs/1609.05284
- https://arxiv.org/abs/1711.07341
- 超级问答https://github.com/tjurczyk/HyperQA/blob/master/LICENSE
- 比达夫https://allenai.github.io/bi-att-flow/
- RDFhttps://www . semantic scholar . org/paper/Natural-language-question-answering-over-RDF % 3A-a-Zou-Huang/cb4d 277 a 51 da 6894 Fe 5143013978567 ef 5 f 805 c8
- https://arxiv.org/pdf/1705.02798.pdf强化记忆阅读
对于我们的任务,R-网模型被使用。之所以选择这种模型,是因为它在最先进的 leader boards 上获得了很好的分数,并且具有描述良好的架构。R-Net 模型是基于双向递归网络的,在双向递归网络中,问题和段落被分开处理。之后,一个基于门控注意力的递归网络将一个问题和一篇文章进行匹配,以获得这篇文章的问题感知表示。然后,自我匹配的注意力为整篇文章聚合证据。输出层预测答案在文章中的开始和结束位置。
图片来自www . Microsoft . com/en-us/research/WP-content/uploads/2017/05/r-net . pdf。
随机问题的答案
我们在仿真陈述问题数据集上的测试:62%(EM)精确匹配
总结:
结合基于 Wiki 和 Google 定制搜索信息检索系统,我们最终得到了相当好的机器阅读模型。可以通过组合不同的信息源、对组合和评分结果进行后处理、训练新的架构和建立集成模型、增加用于训练 MR 模型的数据集和一些具体的案例来提高系统质量。
这种方法可以作为问答/用户支持系统的一部分应用于真实的商业案例。如果你正在建立一个问答系统,并使用自然语言处理引擎,像拉莎 NLU,对话流,路易斯,这个自然语言处理引擎可以回答预定义的问题。但是,如果没有预先定义的意图,您可以调用这个自动 QnA 系统在文档中搜索并返回答案。可以通过获得用户的反馈来组织持续学习。就目前而言,这个模型的质量不能胜过人,但根据一个数据集,它确实接近它(70–80%)。这些模型的质量每个月都在提高。这意味着在不久的将来,这种模型可能会像人类一样准确地回答问题,但速度要快得多。
我希望这篇文章能帮助你创建你的问题回答系统,而不用花时间去尝试非最优的方法或工具。
适马软件 AI 专长
适马软件公司聚集了人工智能专家,支持他们研究机器学习、计算机视觉、自然语言处理、机器人和人工智能的其他方面。我们的专家以这种方式获得的经验应用于现实世界的项目和产品,从聊天机器人到自动化采购规划解决方案。了解更多适马软件人工智能专业知识。
基于迁移学习的自动说话人识别
由 Christopher Gill、Hamza Ghani、Yousef Abdelrazzaq、Minkoo Park 设计的项目
当面临创建一个动态的声音识别器的挑战时,我们团队自然会选择一个图像分类器
即使今天语音交互设备(想想 Siri 和 Alexa)的技术突破频繁,也很少有公司尝试过支持多用户配置文件。Google Home 在这一领域最为雄心勃勃,允许多达六个用户配置文件。这项技术最近的蓬勃发展使得这个项目的潜力让我们的团队非常兴奋。我们还想从事一个在深度学习研究中仍然是热门话题的项目,创建有趣的工具,了解更多关于神经网络架构的知识,并在可能的情况下做出原创贡献。
我们试图创建一个系统,能够快速添加用户资料,并准确地识别他们的声音,只有很少的训练数据,最多几个句子!这种从一个样本到仅有几个样本的学习被称为 一次学习 。本文将详细概述我们项目的各个阶段。
一.项目概述
**目标:**用最少的训练对说话者进行分类,这样只需要几个单词或句子就可以达到很高的准确率。
**数据:**训练数据是从开放域有声读物的来源 Librivox 上刮下来的。测试数据要么是从 YouTube 上刮下来的,要么是现场收集的。
**方法:总之,我们将所有的音频数据转换为声谱图形式。然后,我们在许多说话人身上训练了一个来自 Cifar-10 的 CNN 作为特征提取器,输入到 SVM 中进行最终分类。这种方法被称为转移学习。这种方法使我们能够获得 SVM 的小样本高性能和 CNN 的特征学习。
我们提出的系统有很多潜在的应用。它们的范围从家庭助理需求(想想 Alexa 和 Google Home)到生物安全、营销工具,甚至是间谍活动(识别高调目标)。它也可以用作语音数据收集中说话人日记化的工具。给定先前对所包含的语音的一些小的暴露,具有多个扬声器的音频文件可以被准确地分离。这为更多潜在的“干净数据”打开了大门,这些数据可用于创建更复杂的特定于语音的模型。
****业绩:结果基本上是积极的。通过 20-35 秒的训练音频,我们的模型能够在我们的测试中以 63-95%的准确率区分三个扬声器。然而,在 5 个以上的发言者或统一的性别测试组中,表现会严重下降。
****Github 链接:【https://github.com/hamzag95/voice-classification】T4
二。数据收集
背景
说话人和语音识别领域的最大挑战之一是缺乏开源数据。大多数语音数据要么是专有的、难以访问的、未被充分标记的、每个说话者的数量不足的,要么是嘈杂的。在许多相关研究论文中,数据不足被引用作为不追求更进一步、更复杂的模型和应用的理由。
我们看到这是一个为这一领域的研究做出新贡献的机会。几个小时的谷歌搜索后,我们的团队得出结论,我们项目的最佳潜在音频来源是 LibriVox ,一个开放领域有声读物的广泛来源,以及 YouTube 。这些来源是根据最符合我们的标准(如下所示)而选择的。
音频源标准
- 一个模型有足够多的独特说话者来学习语音中的普遍差异
- 男性和女性发言人,最好使用多种语言
- 每个扬声器至少有 1 小时的音频可用
- 音频可以自动标记元数据
- 音频噪音极小(几乎没有背景噪音/音乐,质量不错,几乎没有外来声音)
- 用于合法使用和数据集使用的开放域或知识共享许可
从 Librivox 中抓取音频
我们使用 BeautifulSoup 和 Selenium 编写了脚本来解析网站 LibriVox 并下载我们想要的有声书。BeautifulSoup 本身是不够的,因为部分网站需要时间(1-2 秒)来加载。因此,我们使用 selenium 来等待,直到网页上的某些元素出现并变得可废弃。
我们的第一次尝试使用了一个脚本,该脚本从 LibriVox 的默认主页开始移动,并下载页面中特定文件大小范围内的所有音频。我们后来意识到这是有缺陷的,因为许多有声读物实际上是多个叙述者的合作,很难自动分离。因此,我们必须找到一种方法来获得带有独特扬声器的有声读物。不幸的是,LibriVox API 没有包含一个根据项目类型(单独或协作)或讲述人姓名进行过滤的字段。
相反,我们使用高级搜索,只包括“独唱”叙述者书籍。很快我们意识到假设每本书都有一个独特的演讲者是有问题的,因为 LibriVox 有许多重复的叙述者。为了解决这个问题,我们必须阅读每本书的元数据,以维护一个勉强的叙述者列表,以确保我们的数据被正确标记。最终,我们拥有 6000 多个独特的扬声器和 24000 多个小时的音频链接。然而,由于时间限制,我们对 162 个不同的说话人进行了采样,以进行声谱图转换。下载链接的完整列表可以在我们的项目 GitHub 这里找到。
从 Youtube 上抓取音频
从 Youtube 上,我们搜集了 7 个 Youtube 明星的视频链接和他们的教程/信息视频。我们发现教程往往最符合我们的标准,因为它们大多包含干净的语言。Selenium 需要自动化这个过程,因为抓取 YouTube 需要滚动。这个过程可以在下面的视频中实时看到。
Scraping videos on Youtube using Selenium
我们没有收集更多的个人资料,因为根据视频中包括的嘉宾、音乐等来手动过滤和验证视频的效率很低。尽管就语言清洁度而言,教程频道通常符合要求,但它们在性别上严重偏向男性。视频也会有不同质量的音频和背景噪音。我们决定不使用我们收集的数据来训练神经网络,但认为它们对测试是有用的。YouTube 仍然是一个音频来源,具有很大的数据收集潜力,但在日期验证和清理方面要求非常高。
三。数据处理
背景
最终,所有收集的音频都必须转换为 503x800(x3)的声谱图图像,这些图像可以捕捉 5 秒钟的音频。由于下载格式不同,转换从 Librivox 和 YouTube 收集的数据的步骤略有不同。
对于我们的各种处理需求,我们非常幸运地拥有诸如 ffmpeg 、 sox 和 mp3splt 等工具,它们加快了处理速度,同时最大限度地降低了音频质量损失。
YoutTube 音频处理
一旦收集了 YouTube 视频链接,我们很幸运地找到了 YouTube-DL 库,它允许我们轻松地下载我们想要的 WAV 格式的视频。当试图将这些数据转换成频谱图时,我们发现每个文件都产生了两个频谱图,因为它是立体声音频。这是我们遇到的与 LibriVox 音频处理的主要区别。
因此,该过程可以总结为以下几点:
- 手动检查抓取的 YouTube 链接以验证可用性
- 以 WAV 格式下载所有经过验证的链接,并自动标记/分类音频
- 将单声道 WAV 文件分割成 5 秒钟的片段
- 将所有立体声 WAV 文件转换为单声道 WAV
- 将所有音频片段转换为频谱图
YouTube data processing phases.
YouTube 音频处理的视频可以在下面看到:
LibriVox 音频处理
我们使用单个脚本处理 LibriVox 音频,该脚本将不同处理级别的数据放入不同的目录中,以便潜在的未来用户可以按照他们的意愿更改片段长度或转换类型。
这一过程可以概括为以下几点:
- 为单个扬声器组合所有下载的章节
- 将组合音频修剪到所需长度
- 使用 ffmpeg 将微调音频转换为 16 位 16khz 单声道 WAV
- 移除超过 0.5 秒的静默
- 将 WAV 文件分割成 5 秒钟的片段
- 将每个片段转换成声谱图
LibriVox data processing stages
四。学问
我们的模型
我们通过修改现有的 Cifar-10 架构来创建 CNN,并在来自 57 个不同扬声器的频谱图上对其进行训练。使用这个经过训练的神经网络,我们通过移除最后一个完全连接的层来提取特征,并将展平层的输出输入到 SVM 中,这一过程称为迁移学习。没有公开可用的预先训练好的声音分类模型,所以我们创建并训练自己的神经网络。
CNN 架构
我们架构中的绿色层是卷积层,而蓝色层是最大池化层。对于所有卷积层,我们使用 3×3 内核。对于最大池,我们使用 2x2 的池大小。我们在每层之间使用 relu 激活函数,在最后一层使用 softmax 激活函数。我们的损失函数是分类交叉熵。
Modified Cifar-10 Architecture
CNN 培训
当对 6 个不同的人进行训练时,神经网络的准确率为 97%。这 6 个人中的每一个都有大约一个小时的 CNN 训练音频。在我们对 162 个不同说话人的更大数据集进行数据采集和处理之后,由于 AWS 上训练和存储空间的时间限制,我们在 57 个不同说话人上训练了我们的神经网络。我们用 45 分钟的音频(大约 2700 秒)训练了 57 个扬声器中的每一个。一个时代后,我们的 CNN 是 97%准确。CNN 花了大约一个半小时来训练大约 24000 幅声谱图。
SVM 与迁移学习
我们现在已经有了一个不错的神经网络来识别 57 个不同的人。我们切断了最后一层,这是一个密集层分类 57 人,并使用展平层馈入一个 SVM。支持向量机应该在数据量较小(与神经网络相比)和维数较高的情况下表现良好。使用我们的 CNN 作为特征提取器,我们有大约 400,000 个维度的数据。我们使用径向基函数作为 SVM 的核。
使用 35 秒的音频在 3 个不同的扬声器上进行训练,并在 35 秒上进行测试,结果准确率为 95%。输入 SVM,我们看到,通过对 3 个不同说话者中的每一个进行 15 秒的训练,并对每个说话者进行 15 秒的测试,我们的 SVM 得到了 83%的准确率。我们看到,我们现在能够在 15-20 秒内学会某人的声音,而不是 45 分钟的音频。
更多示例和结果
我们所有的例子都将试图区分三种新的声音。
当我们第一次测试 SVM 时,我们在三个 YouTubers 上测试了它,每个训练集和测试集有 7 个样本。我们有 95%的准确率。
这些指数对应于特定的人。本例中的阵列是这样设置的:
输出 0 是 Christen(女性),1 是 Tushar(男性),2 是 Sriraj(男性)。
我们在这里看到,该模型从未错误分类 Christen,但对于一个样本,将 Sriraj 分类为 Tushar。对于未来的测试,我们试图将用于训练的样本数量减少到大约 5 个。人名在数组中出现的次数就是测试集的样本数。
为了测试我们的程序,我们制作了一个界面,在这个界面上,我们记录发言者,并创建一个测试和训练集。我们使用这个程序来运行现场演示,并在真人身上进行测试,而不仅仅是收集数据。
此外,我们的分类器是语言不可知的;它可以独立于语言识别你的声音。一个名字在数组中出现的顺序是分类器在这个人说话时预测的索引。看到的第一个数组是预测,第二个数组是真实的说话者。
下面是我们的模型的一些现场测试的结果。
在我们班做现场演示的时候,学习三个人的声音,两男一女,达到了 63%的准确率。这是基于 5 个用于训练的样本和 3 个用于测试的样本。下面是我们做的课堂演示的一个例子。(0 →卡拉马尼斯,1 →迪马基斯,2 →莫尼卡)
In class live demo with our professors and teaching assistant with some mixed language
另一个例子包括两个男性和一个女性声音,所有声音都在英语和各自不同的外语(西班牙语、阿拉伯语和乌尔都语)之间切换。我们的模型有 90%的准确性。
Demo among friends mixing english and their native languages
这是另一个准确率为 86%的例子。
Demo among friends in purely english
结果普遍是积极的!对不同性别的 3 人小组进行测试,通常会产生 60-90%的准确率。然而,我们的模型确实有局限性。当在完全相同性别的群体中进行测试时,或者随着群体规模的增加,表现会下降。对同性群体的测试通常会产生 40-60%的准确率。当群体规模超过 6 时,准确性接近随机猜测。
五、结论
摘要
我们想创建一个模型,仅用几个句子的训练数据来识别说话者。我们选择通过使用现有的图像分类架构来实现这一点,使用频谱图来表示音频。这包括一个重要的数据收集组件,使我们创建了一个包含 162 个扬声器的数据集,包括分段音频文件和分段频谱图。我们选择使用 take transfer learning 方法,训练 Cifar-10 CNN 的衍生物,并提取特征以馈送给 SVM 来分类新的说话者。我们将我们的训练数据限制在每人 20-35 秒(4-7 个样本)。这种方法为不同性别的三人组带来了惊人的准确率(60-90%)。性别一致的小组的结果不那么令人印象深刻,但始终比随机猜测好得多。
投稿
按照我们在开始这个项目时设定的目标,我们的团队成功地对这个研究领域做出了原创性的贡献。在一个缺乏开源数据是研究项目常见障碍的领域,我们设法为独特的演讲者创建了一个非常大的音频下载链接集。同样,这个链接列表可以在这里找到。此外,我们对音频数据使用图像识别结合 SVM 的迁移学习的方法还没有被深入研究。我们希望我们的架构和方法对未来的研究有用。
注:链接到完整的数据集,包括音频和频谱图即将推出…
未来的变化/改进
这个项目的许多障碍包括时间和计算机资源,如存储和计算能力。以下是我们的团队或其他希望改进我们工作的人未来可能采取的步骤
首先是访问更多的存储空间,这样我们就可以用每人 4 小时的音频来训练我们的神经网络,并使用我们收集的所有 162 个扬声器。我们相信这将会成为一个更好的特征提取器,用于 SVM。
其次,在将特征输入 SVM 之前,进行一些特征选择。尽管具有非线性核的支持向量机能够抵抗过拟合,但是用如此少的样本获得如此多的特征可能会导致过拟合,这可以解释准确度分数的高变化。如果有更多的时间,我们会对神经网络的架构进行更多的实验,特别是在分类层之前添加另一个密集层。这将把 SVM 的输入从大约 400,000 个要素减少到我们在新的密集图层中设置的任意结点数。另一个可以探索的架构是基于 VGG19 的模型。
第三,争取更多的发言人。我们能够从 LibriVox 中抓取 6000 多个独特的扬声器,尽管这需要时间来下载和预处理数据,以及惊人的存储量。我们将尝试刮约 500-1000,使用约 30-45 分钟。来看看这是如何改进我们的特征提取器的。这需要很多时间来训练。供参考:57 位发言人,45 分钟。花了一个半小时来训练。
使用 Youtube V3 API、Mask-RCNN 和 Google Vision API 自动收集语音识别数据
Image source: Pixabay
背景
随着机器学习特别是深度学习的快速发展,语音识别得到了显著的提高。这种技术依赖于大量高质量的数据。然而,为非流行语言建立的模型比那些流行语言(如英语)的模型表现差。这是因为只有几个可用的训练数据集,并且很难有效地收集高质量的数据。这篇博文将向你展示如何高效地****收集任何语言的语音识别数据**。**
虽然 Mozilla 去年推出了一个名为 Common Voice 的开源项目,鼓励人们贡献自己的声音,但大多数人要么不知道这个项目,要么不愿意参与其中。下图显示了来自 Common Voice 的不同语言的小数据收集进度。
Little collection progress of Common Voice (https://voice.mozilla.org/en/languages)
由于 Youtube 上有大量的电视节目和电视剧,几乎没有人的参与,就可以高效地收集语音识别数据。
Meteor Garden (https://www.youtube.com/watch?v=DsuN185H58I)
如上图所示,这些剧或者节目中,有的嵌入了字幕,可以通过 OCR 提取出来。提取的文本和剪辑的音频可以形成语音识别数据的样本。
概观
下图概述了包含几个模块的整个数据收集管道。我们首先使用 Youtube V3 API 来搜索下载与我们指定的电视节目名称相关联的视频。FFMPEG 被用来将视频分割成帧,每个帧都由一个自训练的 Mask-RCNN(稍后将详细介绍)进行处理,以仅保留图像的字幕区域。然后,处理后的图像被发送到 Google Vision API,以获得预测的文本和置信度。通过 Pandas 库,我们按照时间戳对结果进行排序,然后将它们聚合起来,为每个视频生成一个 SRT 文件。下面将向您展示如何实现这些模块。
先决条件
- Python==3.6
- FFMPEG
- joblib==0.12.0
- numpy==1.13.3
- 熊猫==0.23.3
- 张量流-gpu==1.4.0
- keras==2.1.3
- 谷歌云视觉==0.32.0
- pafy==0.5.4
- youtube-dl==2017.12.2
- tqdm==4.23.4
- 编辑距离==0.4
履行
该部分由数据收集管道中的模块划分,每个子部分对应一个模块。
下载视频和提取音频
去 Youtube 搜一部你感兴趣的电视剧。确保您可以找到该节目播放列表,因为播放列表中的视频质量趋于一致。检查第一个视频是否包含嵌入的字幕,我们可以假设整个播放列表都是嵌入字幕的。
Youtube videos in a playlist
上面的代码向你展示了如何搜索 Youtube 播放列表。您需要申请一个 API 密钥才能使用 Youtube V3 API 客户端。在第 27 行,
youtube.search().list(q=name, type="playlist",part="id",maxResults=1).execute()
使用 query 作为戏剧名称执行 Youtube 搜索,并返回第一个结果的播放列表 id。
有了播放列表 ID,我们就可以得到这个播放列表中所有视频的视频 ID。
类似地,在第 15 行,
youtube.playlistItems().list(part='contentDetails',maxResults=50, playlistId=playlist_id).execute()
给定播放列表 ID,搜索多达 50 个视频的 ID(受 API 限制)。
然后,我们可以开始下载视频。
Pafy Python 包用于下载可用的最高分辨率的视频。下载完视频后,我们利用 FFMPEG 从每个视频中提取音频。
由于 FFMPEG 不支持 python SDK,我们需要在 shell 中调用它。通过触发 subprocess.call()函数,我们可以执行参数中指定的 shell 命令。现在,您已经成功下载了您指定的电视节目的视频和音频。
分割视频
然后,我们将下载的视频分割成帧,并运行 OCR。
只有视频的中间 60%部分被分割成帧,因为第一和最后 20%部分可能包含开始或结束歌曲,这不能用于语音识别。
同样,在 shell 中用子进程调用 FFMPEG。分割视频的参数描述如下:
- ss:以秒为单位的开始时间
- t:分割视频的时间跨度,单位为秒
- r:采样速率
采样率越高,预测的字幕时间跨度就越精确。然而,在时间和准确性之间有一个权衡。在这里,我把它设置为 2。
训练和评估 Mask-RCNN
现在,你已经有了每个视频的画面。如果你在 Google Vision API 官网试用几张图片进行 OCR (文档文本检测,由于字幕是打字字符)。你会发现结果并不令人满意,因为这些图像的背景非常复杂。
这就是 Mask-RCNN 发挥作用的时候。Mask-RCNN 是 2017 年发布的用于对象检测和实例分割的 RCNN 家族的一部分。它能够在像素级别进行分类。
Mask-RCNN demo (https://github.com/matterport/Mask_RCNN)
我们的目标是训练 Mask-RCNN 来帮助我们识别哪些像素是字幕。
培养
为了确保训练好的模型足够通用,适合各种视频,我从十几部电视剧和动画中下载了视频。应用不同的字体大小、字体类型和字体垂直位置来丰富训练数据集。底部 40%的图像被裁剪,以确保手动添加到训练数据上的字幕不会与原始字幕重叠。这也确保了非字幕部分来自高度相似的色彩空间分布。
The above code leverages Python PIL package to add texts onto images. Since Mask-RCNN treats each connected component as an instance, in some languages, a character can be composed of different instances. For example, the character “把” comprises the left and right two components. To find the connected component, we can use the label() function in the skimage package as shown in the following code.
生成的训练数据显示在下图中。左侧显示输入图像,而右侧显示地面实况。正如您从右侧一些字符的颜色差异中所看到的,一个字符可以由几个实例组成。
Generated Mask-RCNN Training Data
为了训练 Mask-RCNN,我在这个 Github Repo 中使用了一个使用 Keras 和 Tensorflow 的优秀实现。我们需要做的是指定我们的训练模型的配置,如下所示。
你只需要设置 NUM_CLASSES = 1+1(字幕+背景),指定 IMAGE_MIN_DIM 以及 IMAGE_MAX_DIM,这取决于你训练数据的分辨率。MEAN_PIXEL 需要手动计算,以便在预处理阶段标准化。然后,就可以开始加载数据和训练了。
估价
在训练了 100 个纪元之后,让我们开始在一些图像上运行训练好的模型。
****
Evaluation Results on Different TV Shows
The left shows the input images, whereas the right show the output one. You can see that the subtitle has been clearly identified. Although there are some noise above they have no effect on the prediction of the subtitle below when running OCR. The main issue is that sometimes Mask-RCNN is too strict that it removes some parts of the text. In the second example above, the second character “難” was partially erased, which might decrease the performance of OCR. In order to recover this error, I decided to use Ensemble.
Single model prediction
集成是指使用多个模型进行预测。我没有使用上图所示的单一模型进行预测,而是训练了另一个具有不同配置的模型。输入图像被输入到这两个模型中,最终结果将是这两个模型预测的联合。
Ensemble prediction
由 Mask-RCNN 处理的结果帧如下所示。左下方是原始输入图像,右下方是只有一个模型的预测,左上方是集成结果。(右上方是测试时间增强结果,该结果已被当前管道中的系综所取代)
Mask-RCNN processed images. bottom-left: original. bottom-right: single model. top-left: ensemble. top-right: test-time-augmented (not discussed).
运行 OCR
用 Mask-RCNN 模块处理完图像后,我们就可以对这些图像运行 OCR 了。与 Youtube API Key 不同的是,你需要在 Google 云平台上申请一个 Vision API 凭据,并存储在本地磁盘中。
上面的代码编码你的图像文件,发送到 OCR API,并接收响应。响应包含预测字符、每个字符的边界框坐标以及每个字符的置信度。您可以决定自己的阈值来过滤掉低置信度的结果。最终结果被写入 CSV 文件,每行代表一帧。
生成 SRT 最终结果
最后,流水线的最后一个模块来了!通常一段字幕持续 2-3 秒,这意味着大约有 4-6 个连续的帧包含相同的字幕。剩下的问题是我们如何将不同帧的结果合并成一个,决定演讲的开始时间、结束时间和字幕。我们只需要检查当前字幕是否与上一个匹配。一个主要挑战是,有时两个帧具有相同的字幕,但 OCR 预测了不同的结果。你判断两个字幕是否相同的算法应该可以处理这些情况。
上面的代码是基于启发式的。如果当前帧和最后一帧的这两个字符串中的字符有 70%相同,而不考虑每个字符的顺序,则返回 True。
结论
如果您正确地遵循了上面的说明,那么您已经成功地构建了一个自动语音识别数据集收集管道。您可以很容易地根据 FFMPEG 指定的时间分割音频,但我将把这留给您。一个小问题是,由于字幕出现的时间和相应语音的时间可能有些不同,所以语音和文本之间可能会有一点不对齐。这可以通过语言模型来解决,以根据语音稍微调整每个字幕的时间。更多信息和详细实现,请参考本 Github Repo 。如果您有任何问题,请随时通过电子邮件联系我:【huangkh19951228@gmail.com。
使用 Doc2Vec 的自动主题聚类
假设你是一家大公司的经理,想要保存你的客户数据。这意味着你必须跟上当前网络安全的趋势和威胁。然而,网络安全领域发展非常迅速,因此很难跟上形势。”。
这是我们上周末在 HackDelft 黑客马拉松上做的推介的开始。我们项目的目标是创造一种向管理者展示网络安全趋势的新方式。在这篇博客中,我将解释我们是如何解决这个问题的,以及我们使用了什么技术。
目前,毕马威和 Owlin(我们案例的发起人)有一个门户,提供按重要性排序的关于网络安全话题的文章。这些都很好,但是为了能够理解这些趋势,你仍然需要阅读大量的文章。因此,我们希望建立一个门户,可以将最近的文章聚集到主题中,并在旁边附上该主题的摘要。这样你就能一眼看出当前重要的是什么。
LDA 是一种常用的主题发现算法。不过以我的经验 LDA 可以吐槽一些难以理解的话题簇。另一种方法可以是基于 tf-idf 向量的聚类,但因为 Word2Vec 和 Doc2Vec 已经显示出在自然语言处理场景中生成令人敬畏的结果,我们决定尝试这些,只是为了好玩。
Word2Vec 是谷歌开发的一种无监督算法,它试图从文本数据集中学习单词的有意义的矢量表示。它这样做是基于*分布假设,*假设出现在相同上下文中的单词可能有相似的意思。
你可以用这些词向量做很酷的事情,比如做下面的向量计算: King - Man + Woman 会给你一个和 Queen 的词向量非常接近的向量。如果你想自己尝试这些,你可以在这里做。此外,Google 在这里提供了一个预训练的 Word2Vec 模型。Doc2Vec(也称为段落向量)是 Word2Vec 的扩展,它学习文档的意思,而不是单词。
本文表明,通过一起训练 Word2Vec 和 Doc2Vec,文档的向量被放置在描述那些文档的主题的单词附近。这给了我们以下的想法:*如果我们聚类文档,取这些聚类的平均值,并查看与这些平均值的向量表示相似的单词,会怎么样?*也许这会给我们一些描述星团的词汇。
我们首先在数据集上一起训练 Doc2Vec 和 Word2Vec,由 KPMG 和 Owlin 提供,使用 Gensim Python 库。这个数据集包含了过去 200 天的大约 10 万篇新闻文章。因为它包含了许多重复的内容,我们必须先删除它们。此外,我们还删除了特殊字符和网址,并在训练前降低所有内容的大小写,以消除噪音。
训练后,我们从过去 3 天的新闻文章中提取,并使用训练好的 Doc2Vec 模型检索这些文章的向量表示。然后我们使用 K-means 算法(来自 nltk python 库)对向量进行聚类。因为相似性通常使用*余弦距离来度量,*我们使用余弦距离来代替欧几里德距离。
这给了我们一些很好的结果。它生成的集群的一些示例如下:
- 川普解雇联邦调查局局长詹姆斯·科米
- 三星 Z4 手机的发布
- 传播中的勒索病毒 WannaCry
- Wannacry 袭击了很多医院
- 微软发布 Windows XP 补丁
有趣的是,它把关于惠普笔记本电脑键盘记录器的文章和关于三星智能手机发布的文章放在了一起。也许它了解到两家公司都在开发消费硬件?此外,它还产生了多个关于wanna cry*:*的集群,一个关于它的传播,一个关于它袭击了许多医院,一个关于微软为它发布了 Windows XP 补丁。
不幸的是,我们关于使用 Word2Vec 总结集群的想法没有实现。它产生的单词根本不能概括集群。相反,我们尝试了一种简单得多的方法:我们从每组中取出所有标题,去掉停用词和数字,并计算每个词出现的次数。然后,我们选择每个聚类中出现次数最多的 5 个单词作为该聚类的关键字。这种方法出奇地有效。
以下是一些例子:
- 三星、tizen、安卓、惠普、z4
- 特朗普,科米,联邦调查局,维基解密,总统
- 勒索软件,攻击,恶意软件,wannacry,攻击
- 勒索软件,攻击,国家,医院,hit
- 市场,证券,报告,全球,研究
最后,我们创建了一个模型,能够使用 Doc2Vec 对相似的文章进行聚类,并在 24 小时内生成描述这些聚类内容的关键字。我们已经在 Github 这里发布了我们的代码,所以你可以自己玩。它在周末生成的集群可以在这个 JSON 文件中找到。
自动驾驶汽车的自动车辆检测
第 2 章:用数据做酷事!
我们如何教会自动驾驶汽车“看到”路上的其他汽车,并在它们移动时跟踪它们?仅仅用一个比雷达和激光雷达便宜得多的相机就能做到吗?
是啊!请看下面的视频。
这是通过使用计算机视觉技术和支持向量机(SVM)分类器来完成的。使用深度学习也可以做到这一点,但是我更喜欢计算机视觉,因为它比深度学习更直接,深度学习可能是一个黑盒。
链接到我的 GitHub 用 Python 写的完整代码。
我们是这样做的:
- HOG 特征提取寻找图像的特征
HOG(梯度下降直方图)是一种强大的计算机视觉技术,利用沿边缘的梯度方向来识别对象的形状。我们可以使用 skimage.hog() 函数来实现。关键参数是“方向”、“每个单元的像素”和“每个单元的块”。方向是渐变方向的数量。pixels_per_cell 参数指定计算每个梯度直方图的像元大小。cells_per_block 参数指定给定像元的直方图计数将被归一化的局部区域。为了感受 pixels_per_cell 和 cells_per_block 的影响,我查看了每单元像素和每块单元的不同设置的 hog 图像。
HOG — 8 pixels per cell and 1 cell per block
HOG — 16 pixels per cell and 1 cell per block
HOG — 8 pixels per cell and 2 cell per block
每次调用的低像素数和每块的高单元数(上图的最后一张)具有最大的 HOG 特征,使得检测汽车相当容易。然而,这也意味着缓慢的计算
2.训练支持向量机(SVM)分类器
一旦我们从汽车中提取了猪的特征,我们就可以训练 SVM 分类器来学习汽车和非汽车图像。在这个练习中,Udacity 提供了 2826 辆汽车和 8968 张非汽车图片的数据集。非汽车图像是由非汽车的前置摄像头可视化的任何图像。
为了给 SVM 选择最佳的 HOG 参数,我尝试了各种参数组合并观察了视频中的性能。最佳选择是:
- color_space = ‘YCrCb’ — YCrCb 的性能远远优于 RGB、HSV 和 HLS
- orient = 9 # HOG orientations——我试过 6、9 和 12。模型性能变化不大
- pix_per_cell = 16 —我尝试了 8 和 16,最终选择了 16,因为它显著减少了计算时间
- cell_per_block = 1 —我尝试了 1 和 2。性能差异不大,但每个块 1 个单元的特征数量明显减少,并加快了训练和流水线的速度
- hog_channel = ‘ALL’ —所有这些都比任何其他单个通道产生了更好的性能
使用 sklearn.svm.LinearSVC()训练线性 SVM。
3.实现滑动窗口以检测图像中汽车的存在
为了检测图像中的汽车,我们定义了不同大小的窗口,并在图像中滑动它们。在每一点上,我们提取 HOG 特征并通过我们的分类器来预测窗口中汽车的存在。如果检测到汽车,我们保存窗口位置。下面是一个用不同大小的窗口进行搜索的例子。
下面是在一些测试图像上运行上述步骤的一些例子。如您所见,存在多重检测和误报。为了平滑多次检测并消除假阳性,我们可以创建所有检测的热图,并对其进行阈值处理以消除假阳性。
4.组合重叠的框并移除假阳性检测
快到了!正如你所看到的,上面的技术容易产生误报和多重包围盒。为了解决这个问题,我们可以结合多个窗口帧的检测(20)和热图阈值(22 检测),以消除出现在几个帧中但不一致的假阳性“噪声”。
结果是对道路上的其他车辆的相当鲁棒的检测。这种技术也可以扩展到检测道路上的行人。
车道线的检测由我在另一篇博客上发表。
然而,这种技术有一些缺点。首先,我不确定这个模型在有多辆车的交通拥挤的情况下是否表现良好。你需要有近乎完美的准确性,以避免撞到其他车辆,或确保在交叉路口没有碰撞。更重要的是,该模型运行缓慢。处理 1 分钟的视频需要 6–7 分钟。我不确定这个模型在现实生活中有汽车和行人的情况下是否有效。
参考资料:
Udacity 无人驾驶汽车 Nano Degree——我感谢 Udacity 给我机会成为他们新的无人驾驶汽车项目的一部分。这是一次非常有趣的旅程。我使用的大部分代码都是在课堂讲课中建议的。
Python OpenCV 库让应用计算机视觉技术变得如此简单
自动视觉目标跟踪
一种平移/倾斜伺服设备,帮助摄像机使用视觉自动跟踪彩色对象。
1.介绍
在之前的教程中,我们探讨了如何控制平移/倾斜伺服设备来定位 PiCam。现在我们将使用我们的设备来帮助相机自动跟踪彩色物体,如下图所示:
这是我第一次使用 OpenCV,我必须承认,我爱上了这个神奇的“开源计算机视觉库”。
OpenCV 对于学术和商业用途都是免费的。它有 C++,C,Python 和 Java 接口,支持 Windows,Linux,Mac OS,iOS 和,Android。在我的 OpenCV 系列教程中,我们将重点关注 Raspberry Pi(所以,Raspbian 是 OS)和 Python。OpenCV 是为计算效率而设计的,非常注重实时应用。所以,它非常适合物理计算项目!
2.安装 OpenCV 3 包
我用的是 Raspberry Pi V3,更新到了 Raspbian (Stretch)的最新版本,所以安装 OpenCV 的最好方法是遵循 Adrian Rosebrock 开发的优秀教程: Raspbian Stretch:在你的 Raspberry Pi 上安装 OpenCV 3+Python。
我尝试了几种不同的指南在我的 Pi 上安装 OpenCV。阿德里安的教程是最好的。我建议你也这样做,一步一步地遵循他的指导方针。
一旦您完成了 Adrian 的教程,您就应该有一个 OpenCV 虚拟环境,可以在您的 Pi 上运行我们的实验。
让我们进入虚拟环境,确认 OpenCV 3 安装正确。
Adrian 建议每次打开新终端时运行命令“source ”,以确保系统变量设置正确。
source ~/.profile
接下来,让我们进入虚拟环境:
workon cv
如果您在提示前看到文本(cv ),则您处于 cv 虚拟环境中:
(cv) pi@raspberry:~$
Adrian 提醒注意, cv Python 虚拟环境 完全独立于 Raspbian Stretch 下载中包含的默认 Python 版本。因此,全局站点包目录中的任何 Python 包对于 cv 虚拟环境都是不可用的。类似地,任何安装在 cv 的 site-packages 中的 Python 包对于 Python 的全局安装都是不可用的。
现在,在 Python 解释器中输入:
python
并确认您运行的是 3.5(或更高)版本
在解释器内部(会出现" > > > "),导入 OpenCV 库:
import cv2
如果没有出现错误消息,则 OpenCV 已正确安装在您的 PYTHON 虚拟环境中。
您也可以检查安装的 OpenCV 版本:
cv2.__version__
3.3.0 应该会出现(或者将来可能发布的更高版本)。上面的终端打印屏幕显示了前面的步骤。
3.测试您的相机
一旦你在 RPi 中安装了 OpenCV,让我们测试一下你的相机是否工作正常。
我假设你已经在你的 Raspberry Pi 上安装了 PiCam。
在您的 IDE 上输入以下 Python 代码:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)while(True):
ret, frame = cap.read()
frame = cv2.flip(frame, -1) # Flip camera vertically
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
breakcap.release()
cv2.destroyAllWindows()
上述代码将捕获 PiCam 生成的视频流,并以 BGR 彩色和灰色模式显示。
请注意,由于组装的方式,我垂直旋转了我的相机。如果不是你的情况,评论或删除“翻转”命令行。
你也可以从我的 GitHub 下载代码: simpleCamTest.py
要执行,请输入命令:
python simpleCamTest.py
要完成该程序,您必须按键盘上的[q]或[Ctrl] + [C]键
图为结果。
了解 OpenCV 的更多内容,可以关注教程:加载-视频-python-OpenCV-教程
4.用 OpenCV 实现 Python 中的颜色检测
我们将尝试完成的一件事是检测和跟踪某种颜色的物体。为此,我们必须对 OpenCV 如何解释颜色有更多的了解。
Henri Dang 用 OpenCV 用 Python 写了一个很棒的关于颜色检测的教程。
通常,我们的相机将以 RGB 颜色模式工作,这可以理解为可以由红、绿、蓝三种颜色的光组成的所有可能的颜色。我们将在这里用 BGR(蓝色、绿色、红色)代替。
如上所述,对于 BGR,像素由 3 个参数表示,蓝色、绿色和红色。每个参数通常有一个从 0 到 255 的值(或十六进制的 0 到 FF)。例如,计算机屏幕上的纯蓝色像素的 B 值为 255,G 值为 0,R 值为 0。
OpenCV 使用 HSV(色调、饱和度、值)颜色模型,它是 RGB 颜色模型的替代表示,由计算机图形研究人员在 20 世纪 70 年代设计,以更接近人类视觉感知颜色生成属性的方式:
太好了。因此,如果您想使用 OpenCV 跟踪某种颜色,您必须使用 HSV 模型来定义它。
例子
比方说,我必须跟踪一个黄色物体,如上图所示的塑料盒。容易的部分是找到它的 BGR 元素。你可以用任何设计程序去找(我用的是 PowerPoint)。
在我的案例中,我发现:
- 蓝色:71
- 绿色:234
- 红色:213
接下来,我们必须将 BGR (71,234,213)模型转换为 HSV 模型,这将由范围的上限和下限来定义。为此,让我们运行下面的代码:
import sys
import numpy as np
import cv2blue = sys.argv[1]
green = sys.argv[2]
red = sys.argv[3] color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
hue = hsv_color[0][0][0]print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")
print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")
你也可以从我的 GitHub 下载代码: bgr_hsv_converter.py
要执行该命令,请输入以下命令,并将之前找到的 BGR 值作为参数:
python bgr_hsv_converter.py 71 234 213
该程序将打印我们的对象颜色的上下边界。
在这种情况下:
lower bound: [24, 100, 100]
和
upper bound: [44, 255, 255]
终端打印屏幕显示结果。
最后,同样重要的是,让我们看看一旦我们确定了对象的颜色,OpenCV 如何“屏蔽”它:
import cv2
import numpy as np# Read the picure - The 1 means we want the image in BGR
img = cv2.imread('yellow_object.JPG', 1) # resize imag to 20% in each axis
img = cv2.resize(img, (0,0), fx=0.2, fy=0.2)# convert BGR image to a HSV image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # NumPy to create arrays to hold lower and upper range
# The “dtype = np.uint8” means that data type is an 8 bit integer
lower_range = np.array([24, 100, 100], dtype=np.uint8)
upper_range = np.array([44, 255, 255], dtype=np.uint8)# create a mask for image
mask = cv2.inRange(hsv, lower_range, upper_range)# display both the mask and the image side-by-side
cv2.imshow('mask',mask)
cv2.imshow('image', img)# wait to user to press [ ESC ]
while(1):
k = cv2.waitKey(0)
if(k == 27):
breakcv2.destroyAllWindows()
你也可以从我的 GitHub 下载代码: colorDetection.py
要执行,输入下面的命令,在你的目录中有一张你的目标对象的照片(在我的例子中:yellow_object。JPG):
python colorDetection.py
上面的图片将显示原始图像(“图像”)以及应用蒙版后对象的外观(“蒙版”)。
5.物体运动跟踪
现在我们知道如何使用蒙版“选择”我们的对象,让我们使用相机实时跟踪它的运动。为此,我用 OpenCV tutoria l 基于 Adrian Rosebrock 的球跟踪编写了我的代码
我强烈建议你详细阅读阿德里安的教程。
首先,确认你是否安装了 imutils 库。它是 Adrian 收集的 OpenCV 便利函数,使一些基本任务(如调整大小或翻转屏幕)变得更加容易。如果没有,请输入以下命令,在您的虚拟 Python 环境中安装库:
pip install imutils
接下来,从我的 GitHub 下载代码 ball_tracking.py ,并使用以下命令执行它:
python ball_traking.py
因此,您将看到类似于下面的 gif:
基本上,它和 Adrian 的代码是一样的,除非是“视频垂直翻转”,这是我用下面一行代码得到的:
frame = imutils.rotate(frame, angle=180)
另外,请注意,所使用的遮罩边界是我们在上一步中获得的。
6.测试 GPIOs
现在我们已经玩了 OpenCV 的基础,让我们安装一个 LED 到我们的 RPi,并开始与我们的 GPIOs 交互。
遵循上面的电路图:LED 的阴极将通过 220 欧姆的电阻器连接到 GPIO 21,其阳极连接到 GND。
让我们在虚拟 Python 环境中测试我们的 LED。
请记住,RPi 有可能。您的 Python 虚拟环境中没有安装 GPIO!要解决这个问题,一旦您到达那里(记得确认(cv)在您的终端中),您需要使用 pip 将其安装到您的虚拟环境中:
pip install RPi.GPIO
让我们使用 python 脚本来执行一个简单的测试:
import sys
import time
import RPi.GPIO as GPIO# initialize GPIO and variables
redLed = int(sys.argv[1])
freq = int(sys.argv[2])
GPIO.setmode(GPIO.BCM)
GPIO.setup(redLed, GPIO.OUT)
GPIO.setwarnings(False)print("\n [INFO] Blinking LED (5 times) connected at GPIO {0} \
at every {1} second(s)".format(redLed, freq))
for i in range(5):
GPIO.output(redLed, GPIO.LOW)
time.sleep(freq)
GPIO.output(redLed, GPIO.HIGH)
time.sleep(freq)# do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff \n")
GPIO.cleanup()
该代码将接收一个 GPIO 号和 LED 闪烁的频率(秒)作为参数。LED 将闪烁 5 次,程序将被终止。请注意,在终止之前,我们将释放 GPIOs。
所以,要执行这个脚本,你必须输入参数, LED GPIO 和频率。
例如:
python LED_simple_test.py 21 1
上述命令将使连接到“GPIO 21”的红色 LED 每“1”秒闪烁 5 次。
文件 GPIO_LED_test.py 可以从我的 GitHub 下载
上面的终端打印屏幕显示了结果(当然,您应该确认 LED 在闪烁。
现在,让我们使用 OpenCV 和一些基本的 GPIO 东西。
7.识别颜色和 GPIO 交互
让我们开始将 OpenCV 代码与 GPIO 交互集成。我们将从最后一个 OpenCV 代码开始,我们将在其上集成 GPIO-RPI 库,因此我们将在相机发现我们的彩色对象时打开红色 LED。这一步使用的代码基于 Adrian 的优秀教程 OpenCV,RPi。GPIO,和树莓 Pi 上的 GPIO 零点:
首先要做的是“创建”我们的 LED,将其连接到特定的 GPIO:
import RPi.GPIO as GPIO
redLed = 21
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(redLed, GPIO.OUT)
其次,我们必须初始化我们的 LED(关闭):
GPIO.output(redLed, GPIO.LOW)
ledOn = False
现在,在循环中,当找到对象时会创建“圆圈”,我们将打开 LED:
GPIO.output(redLed, GPIO.HIGH)
ledOn = True
让我们从我的 GitHub 下载完整的代码: object_detection_LED.py
使用以下命令运行代码:
python object_detection_LED.py
这是结果。注意:每次检测到物体时,LED(左下角)都会亮起:
尝试不同的对象(颜色和格式)。你会看到,一旦遮罩边界内的颜色匹配,LED 就会打开。
下面的视频展示了一些经验。请注意,只有处于颜色范围内的黄色物体才会被检测到,从而打开 LED。具有不同颜色的对象被忽略。
我们在这里仅使用上一步中解释的 LED。我做视频的时候已经把云台组装好了,所以忽略它。我们将在下一步处理平移/倾斜机制。
8.平移倾斜机构
既然我们已经玩了 OpenCV 和 GPIO 的基础,让我们安装我们的平移/倾斜机制。
详情请访问我的教程: 云台多伺服控制
伺服系统应连接到外部 5V 电源,其数据引脚(在我的例子中,它们的黄色接线)连接到 Raspberry Pi GPIO,如下所示:
- GPIO 17 == >倾斜伺服
- GPIO 27 == >平移伺服
不要忘记将 gnd 连接在一起==> Raspberry Pi —伺服—外部电源)
您可以选择在 Raspberry Pi GPIO 和服务器数据输入引脚之间串联一个 1K 欧姆的电阻。这将保护你的 RPi 以防伺服问题。
让我们也利用这个机会,在我们的虚拟 Python 环境中测试我们的伺服系统。
让我们使用 Python 脚本对我们的驱动程序执行一些测试:
from time import sleep
import RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)def setServoAngle(servo, angle):
pwm = GPIO.PWM(servo, 50)
pwm.start(8)
dutyCycle = angle / 18\. + 3.
pwm.ChangeDutyCycle(dutyCycle)
sleep(0.3)
pwm.stop()if __name__ == '__main__':
import sys
servo = int(sys.argv[1])
GPIO.setup(servo, GPIO.OUT)
setServoAngle(servo, int(sys.argv[2]))
GPIO.cleanup()
上面代码的核心是函数 setServoAngle(伺服,角度)。这个函数接收一个伺服 GPIO 号和一个伺服必须定位的角度值作为参数。一旦这个函数的输入是“角度”,我们必须将其转换为等效占空比。
要执行该脚本,必须输入伺服 GPIO 和角度作为参数。
例如:
python angleServoCtrl.py 17 45
上述命令将连接在 GPIO 17(“倾斜”)上的伺服定位为“仰角”45 度。
文件angleservocctrl . py可以从我的 GitHub 下载
9.寻找物体的实时位置
这里的想法是使用平移/倾斜机制将对象定位在屏幕的中间。坏消息是,首先我们必须知道物体的实时位置。但好消息是,一旦我们已经有了物体中心的坐标,这是非常容易的。
首先,让我们把之前使用的“object_detect_LED”代码修改为打印被发现对象的 x,y 坐标。
从我的 GitHub 下载代码: objectDetectCoord.py
代码的“核心”是我们找到对象并在它的中心画一个红点的圆的部分。
# only proceed if the radius meets a minimum size
if radius > 10:
# draw the circle and centroid on the frame,
# then update the list of tracked points
cv2.circle(frame, (int(x), int(y)), int(radius),
(0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
# print center of circle coordinates
mapObjectPosition(int(x), int(y))
# if the led is not already on, turn the LED on
if not ledOn:
GPIO.output(redLed, GPIO.HIGH)
ledOn = True
让我们将中心坐标“导出”到 mapObjectPosition(int(x),int(y)) 函数,以便打印其坐标。功能下方:
def mapObjectPosition (x, y):
print ("[INFO] Object Center coordinates at \
X0 = {0} and Y0 = {1}".format(x, y))
运行该程序,我们将在终端上看到(x,y)位置坐标,如上所示。移动物体,观察坐标。我们会意识到 x 从 0 到 500(从左到右),y 从 o 到 350(从上到下)。见上图。
太好了!现在,我们必须使用这些坐标作为平移/倾斜跟踪系统的起点
10.物体位置跟踪系统
我们希望我们的对象总是在屏幕上居中。因此,让我们定义,例如,我们将认为我们的对象“居中”,如果:
- 220 < x < 280
- 160 < y < 210
在这些界限之外,我们必须移动我们的平移/倾斜机构来补偿偏差。基于此,我们可以构建函数mapservosition(x,y) 如下。请注意,此功能中用作参数的“x”和“y”与我们之前用于打印中心位置的参数相同:
# position servos to present object at center of the frame
def mapServoPosition (x, y):
global panAngle
global tiltAngle
if (x < 220):
panAngle += 10
if panAngle > 140:
panAngle = 140
positionServo (panServo, panAngle)
if (x > 280):
panAngle -= 10
if panAngle < 40:
panAngle = 40
positionServo (panServo, panAngle)
if (y < 160):
tiltAngle += 10
if tiltAngle > 140:
tiltAngle = 140
positionServo (tiltServo, tiltAngle)
if (y > 210):
tiltAngle -= 10
if tiltAngle < 40:
tiltAngle = 40
positionServo (tiltServo, tiltAngle)
基于(x,y)坐标,使用功能*位置伺服(伺服,角度)生成伺服位置命令。*例如,假设 y 位置是“50”,这意味着我们的对象几乎在屏幕的顶部,这可以解释为我们的“摄像机视线”是“低的”(比如说 120 度的倾斜角),所以我们必须“减小”倾斜角(比如说 100 度),所以摄像机视线将是“向上的”,对象将在屏幕上“向下”(y 将增加到比如说 190 度)。
上图显示了几何方面的示例。
想想全景摄像机将如何操作。请注意,屏幕不是镜像的,这意味着如果你将对象移动到“你的左边”,一旦你与相机相对,它将在屏幕上移动到“你的右边”。
函数 positionServo(伺服,角度)可以写成:
def positionServo (servo, angle):
os.system("python angleServoCtrl.py " + str(servo) + " " +
str(angle))
print("[INFO] Positioning servo at GPIO {0} to {1} \
degrees\n".format(servo, angle))
我们将调用之前显示的脚本进行伺服定位。
请注意,angleServoCtrl.py 必须与 objectDetectTrac.py 位于同一目录中
完整的代码可以从我的 GitHub 下载: objectDetectTrack.py
下面的 gif 展示了我们的项目工作的一个例子:
11.结论
一如既往,我希望这个项目可以帮助其他人找到进入令人兴奋的电子世界的方法!
详情和最终代码,请访问我的 GitHub 仓库:OpenCV-Object-Face-Tracking
更多项目,请访问我的博客:MJRoBot.org
下面是我的下一个教程,我们将探索“人脸跟踪和检测”:
来自世界南部的 Saludos!
我的下一篇文章再见!
谢谢你,
马塞洛
使用依赖解析从自然语言目标语句自动生成目标-进度界面
okr 是一种可衡量的目标
okr 是公司和团队设定可衡量目标的一种流行方式,这种方式自然会带来进步。基本的想法是,你要努力实现一些(经过深思熟虑的)可衡量的关键结果(KRs)。通过实现这些目标,你更有可能实现你更广泛的目标(O ),而不是仅仅陈述目标并试图忙碌起来。
有很多 OKR 工具可以提供帮助。当整个公司在其许多不同的团队中使用 OKRs 时,这些特别有用。在一个层级中,团队的 okr 共同实现公司的 okr。
我的公司 Saberr 正在开发 CoachBot ,这是一款帮助团队实现目标和集体目标以及其他一切让团队更好合作的应用。通过 CoachBot ,我们试图让一个团队非常容易地设定一些 OKR 式的目标——即使他们以前从未实现过这些目标,即使他们的公司也没有(还没有)?)更广泛地使用它们。
有时候,目标进度工具可能是一种痛苦
我们一直在寻找方法使设置和审查 OKRs 的过程快速而直接。团队目标应该是有用的,而不是负担。
但这通常是一个团队在关键结果上输入进度的方式:
Who wants to fiddle with dropdowns?
关键结果通常是可以衡量的——但不总是这样,尤其是当人们对他们来说是陌生人的时候。通常人们最终会写出任务,或者布尔型的结果(“创建新网站”、“启动网站”)。
我们可以使用机器学习来消除一些痛苦
为了节省时间,让我们试着自动计算出我们要处理的关键结果,如果是数字,单位是什么。
这对于依存解析来说是一个很好的任务:一种自然语言处理,预测句子中所有单词的角色和关系。
我们可以用预先训练好的模型很快完成这个任务。
加载教程,键入我们的关键结果,我们会看到一个解析树,如下所示:
Dependency parse tree for a key result: “We will have 1000 meetings”
“会议”是一个被“1000”引用的 对象 ,而“1000”是它的 nummod 或数字修饰符。所以看起来我们的工作会很容易!我们只需要寻找带有数字的对象。
显然有一些边缘情况和陷阱。需要几行代码来处理像“一千次会议”这样的 kr,对于复杂的句子,我们必须跟踪句子最可能的实际宾语——通过查看哪个更接近地引用句子的根(“have”)。
方便的是,当 KR 被写成布尔结果或任务时,句子的词根通常是动词。
举例来说,如果你很匆忙,并作出了“装运它”的 KR,我们会解析为:
Dependency parse tree for key result: “Ship it”
这很方便,因为完成这个关键结果的动作是句子的词根(“ship”)。
这意味着我们通常可以依靠句根作为非数字目标的行动:
Automatically detecting numeric goals, their units and range, or boolean goals
这是一个很好的例子,说明预先训练好的模型可以很快地用于解决小问题。
自动化日常生活中的点点滴滴
作为一个狂热的技术人员和问题解决者,我的头脑总是在寻找机会应用我所学的东西。除了实习期间,我还没有好好利用我的学费。直到有一天,一个通知出现在我的手机上:
My mum’s daily routine of collating meal attendance from everyone
我没有多想,只是像往常一样回答“是”。我妈妈通常要问每个家庭成员我们是否会在家里吃饭,这样她就可以相应地分配。(希望这是所有家庭的共性😇).我一点也不知道,我是在享受:
BAM. Clearly this a problem right now. Cue awkward “haha”.
毫无疑问,我立刻感到内疚和懊悔,我应该更主动地减轻她的工作量。回顾我们的信息历史,我知道是时候做点什么了……终于
This went on for years without me consciously noticing, sorry mum
快进到解决方案
基于这个问题的性质,我觉得聊天机器人将是最合适的。考虑到我妈妈对技术的基本了解,我决定开发一个在 WhatsApp 上运行的 MumBot 。花了 3 天的时间修修补补, MumBot v0.1 上线了!
下面是它的工作原理(没有技术细节):
The bot messages you privately at pre-defined timings and send collated responses to everyone. #SmartNation
Taaadaaaa !妈妈快乐,生活幸福!在向她推销了这个机器人和现场演示后,这是她的回应:
你再也没有借口不回复了啊!假笑
哦,天哪,她满意了!虽然我不太确定我是不是给自己制造了更多的麻烦。尽管如此,我还是完成了我设定的目标,并赢得了 4 个快乐的顾客(我的家人)。希望这能激励你们中的一些人在家里想出一些有趣的方法!
奖金
在采用该机器人 2 周后,每个人的生活都变得轻松多了。然而,我注意到我的妈妈仍然不得不把吃午餐/晚餐的人数告诉我的助手。因此,我想看看这能带来多大的好处:
DIY box on the bar counter to notify my helper. Am I opening a store?
由于我的助手没有的 WhatsApp(或者她有……),我拼凑了一个显示盒,MumBot 可以与之通信。女士们先生们,这就是我如何取代我妈妈的。(开玩笑,她是不可替代的❤️)
用户会成为顶级客户吗?
自动化可解释的特征工程
Source: Pixabay
介绍
这篇文章将展示自动化可解释特征工程和深度特征综合的有效性,并将其应用于预测客户终身价值。
首先,我将写客户终身价值预测的商业价值,并将其扩展到用户的分类,分为顶级客户和非顶级客户,并对每种客户进行定义。随后是机器学习方法,并显示管道在这个特定问题上表现如何的结果。
如果你还没有,请在继续之前阅读这篇由威廉·科尔森撰写的帖子,它提供了对 DFS 的解释。如果你只对问题和结果感兴趣,那么你可以简单地跳过方法论部分。项目中使用的所有代码都可以在 Github 上找到。
问题定义
清楚地了解一家企业的经营状况至关重要,可以通过多种方式进行衡量。
在 SaaS 企业中,用于衡量这一点的一个基本指标是 CLV(客户终身价值)和 CAC(客户获取成本),当这两个指标结合起来时,对于确定企业的盈利能力是一个有用的启发。
CLV 衡量的是一个特定的客户在他们的整个生命周期中能为企业创造多少收入,而 CAC 衡量的是企业为获得这个客户所花费的成本。CAC 更容易衡量,因为它在漏斗开始时(T4 收购阶段)在大多数企业中变得可以量化。CLV 只有在一定时间后才变得清晰(在收入阶段)。例如,一年的使用量可以代表客户一生中会花费多少。
一般的经验法则是 CAC 不应该超过 CLV 的 1/3,但是在这个问题上几乎没有共识。这是一个商业决策,如果关注的是盈利能力,那么通过更多地依赖有机增长(降低 CAC)来最小化阈值是一个优先事项(1/4 或更低)。另一方面,如果重点是高增长,那么一个公司可能倾向于 1/1 甚至更高。
SaaS 企业的用户群产生的收入通常遵循幂律分布:一小部分用户(定义为顶级客户)产生大部分收入。(帕累托原理)。
Power-law distribution of generated revenue per user
那么,我们如何预测客户的终身价值呢?或者更进一步,我们如何预测哪个用户将成为顶级客户?
方法学
这是我在 BUX 实习期间完成的硕士论文中研究的问题,该公司是一家总部位于阿姆斯特丹的金融科技公司,它开发了一款移动应用,可以实现简单实惠的交易。他们面临着许多其他 SaaS 企业面临的类似问题——根据使用其产品的客户/用户的行为数据预测客户终身价值。
如上所述,该管道已用于 BUX 的用户。使用该产品有两个阶段。第一阶段是用户处于 funBUX 阶段,为了学习如何交易而交易虚拟货币。当用户转换到 seriousBUX 阶段,他就变成了客户,开始用真金白银交易。由于该业务通过严肃的 BUX 交易的佣金和融资费产生收入,这种转换也成为用户成为顶级客户的条件。这是用户和客户的区别——只有客户产生收入,当用户开始使用产品时,不知道他们是否会最终转化为客户。当解释由深度特征合成构建的特征时,这在结果部分将是有用的。
论文背后的主要思想是建立一个通用的机器学习管道,使可解释的特征工程自动化。让我们把它分解成两个部分:
- 可推广的机器学习管道:管道可以在具有相同数据结构的其他问题上重用(下面将详细介绍,描述为实体集)。
- 可解释特征工程的自动化:大量特征是基于底层数据表和这些表之间的关系自动构建的。使用两种算法来解释模型水平和个体水平上的预测,而不是使用黑盒算法来提供更少的可解释预测。
当建立了所有的特征时,选择最相关的特征以避免过度拟合(以最小化样本外误差)。当业务中出现不同的问题时(如预测客户流失、预测转化率等),可以通过改变目标值来选择不同的特性。在这种情况下,这是可推广管道的主要价值主张。
如今,数据科学家经常面临的问题是无法回答所有的业务问题。这样,投入的精力和时间就可以回答“我们可以用我们的数据预测吗?”因为在该过程中投入的人力较少。它远没有取代数据科学家,而是让他们的工作更有成效。当底层数据显然可以回答一个业务问题时,可以投入额外的时间,凭直觉手动构建功能,而这种直觉是 DFS 构建的现有功能中所没有的。该算法的作者在他们的论文中对此进行了更深入的研究。
对企业来说,回答 5 个 80%正确率的问题通常比回答 1 个 95%正确率的问题更有价值
当然,这取决于商业案例,但有时甚至简单的启发式方法也可能奏效——见规则 1)。在优化渠道上投入的额外时间与在其他问题上投入的精力和时间的机会成本相结合,往往会产生收益递减。不过,这条规则也有例外。
为了自动构建功能,数据被分为三个实体(DFS 的必要输入):群组、用户和交易。
Entity set (input into Deep Feature Synthesis)
这些实体定义了问题空间,它可以被描述为人类行为的预测。这显然是一个模糊的定义,它只能解决行为预测问题的子集。为了使系统具有通用性,数据需要以这种方式构建,否则,需要构建不同的实体结构(正如在 DFS 的文档中看到的那样,这并不难改变)。
使用的主要底层算法是深度特征合成(DFS)和局部可解释模型不可知解释(LIME)。DFS 侧重于自动化特征工程和生成可解释的特征,而 LIME 侧重于为单个预测创建可解释的解释。
对于 DFS 来说,上面提到的两个来源肯定为其背后提供了充分的直觉。对于石灰,有一个帖子提供了解释,你也可以找到的原始论文。LIME 是模型不可知的,它提供了一个局部的近似值,而不是试图理解整个模型,它只提供了对单个实例的预测的解释。
Explaining individual predictions to a human decision-maker (source)
随机森林算法被用作预测器,因为与更复杂的基于树的算法(如梯度提升树和 XGBoost)相比,其性能差异很小。
该系统有两部分——通用部分和定制部分。可概括部分可用于上述实体集结构的任何问题,而定制部分使系统能够用于更改数据源、目标值、添加手动功能等。这两个部分都表示为效用函数,即构建整个端到端管道的构件。在整个实现过程中还有很多细节,所以这篇论文可以在这里看到更多的细节。
DFS 构建的功能是从 3 周的行为数据中提取的,以预测 6 个月使用后的客户价值,该价值用作实际客户终身价值的代理。
选择 6 个月的时间跨度而不是更长的时间跨度,因为这样可以将更多最近的客户包括在学习过程中(因为每个客户都需要至少 6 个月的数据,而不是更多)。6 个月的客户价值和 1 年的客户价值之间的皮尔逊相关系数是 0.95,这表明 6 个月的时间提供了足够的信息来使用它作为 CLV 的代理。
结果
性能赋值
该管道在顶级客户分类中进行了测试,这些客户根据产生的收入位于第 99 个百分点。正如分类问题经常出现的情况那样,这意味着高度的类别不平衡。准确性不是评估渠道的有用指标(将所有客户分类为非顶级客户的无用模型提供了 99%的准确性)。
这就是为什么要使用 precision(正确分类的顶级客户在所有顶级客户中所占的比例)、recall(正确分类的顶级客户在顶级客户总数中所占的比例)和 F1 得分(两者之间的调和平均值)。
基于所建立的特征,产生用户成为顶层客户的概率。默认的决策边界为 0.5。这意味着,如果一个用户成为顶层客户的概率是 0.6,就会被归类为顶层客户。如果是 0.4,就归类为非顶级客户。
使用 5 重交叉验证评估管道,同时考虑数据中不同折叠的性能差异。
这些指标是:
AUC 分数:0.83
F1 分数:0.56 ± 0.03
精度:0.73 ± 0.05
召回率:0.48 ± 0.05
不同性能指标的微小差异表明,管道在不同的折叠上表现同样出色。
Confusion matrix before thresholding (threshold = 0.5)
业务问题的本质更重视识别尽可能多的顶层客户,因此最小化假阴性率(将顶层客户识别为非顶层客户)比假阳性率(将非顶层客户识别为顶层客户)更重要。
为了做到这一点,我们最大化回忆。通过使用阈值函数,阈值变为 0.2。这产生了 0.65 的召回率和 0.5 的精确度。这直观地意味着,我们能够正确识别 65%的顶级客户,同时在对一个客户进行分类时有 50%的把握是正确的。
考虑到行为数据并不是特别细粒度的(产品中交互的每日摘要),而且绝大多数特性都是自动构建的,这无疑是一个很好的性能。除此之外,由于特征的最大深度是 2(因为有 3 个实体), DFS 的全部能力没有被探索,而有许多更复杂的实体集的例子可以探索更广泛的特征空间。
Confusion matrix after thresholding (threshold = 0.2)
解释
说到管道的可解释性,有两个部分:
- 功能解释(使用 DFS 构建)
- 个别预测的解释(用石灰建造)
用管道构建 292 个特征,选择其中 20 个最相关的特征,并基于这些特征进行最终预测(可以作为管道参数改变的任意数目)。
DFS 支持用自然语言解释所有功能,如以下 5 个最相关的功能示例所示:
5 most relevant features for predicting whether a user will become a top-tier customer
正如我们所看到的,这些特性可以用自然语言来解释,并融入了直觉,否则将由数据科学家手动构建,通常需要领域专家的帮助。这个列表中唯一手动构建的功能是Conversion _ Completed _ hours _ till _ event,因为这是一个明显的低挂水果,没有被 DFS 捕获。
某一事件的时间是一组人工构建的特征。还有来自群组实体的其他手动构建的特征,描述用户开始使用产品的环境——主要是不同产品类型(如货币、指数或股票)的市场波动性。在用户实体上,人工特征描述了用户的交易部分,例如加密交易者或外汇交易者(由各种产品类型的交易决定)。虽然这些功能最初被期望提供一些有价值的信息增益,但是聚集的 DFS 功能提供了最大的价值。
使用黑盒算法(如性能通常更好的神经网络)还不可能对这些特征做出如此清晰的解释。石灰和 SHAP 是一些旨在改变这种状况的方法。使用像 DFS 这样的技术的理由是,执行速度、可解释性和较低的计算复杂性超过了额外性能的重要性。
除了对特征的解释,管道的输出还提供了对单个预测的概率的解释。例如,下面我们可以看到一个用户成为顶级客户的概率为 0.74。它还包括单个特征的贡献,如交易价值的分散程度、最大交易金额和总投资额。
Interpretation of an individual prediction (using LIME)
结论
考虑到绝大多数特性都是使用 DFS 构建的,这表明有可能快速回答这样的问题:“我们能使用我们的数据预测这一点吗?”。如果问题是肯定的,那么可以应用管道来解决问题。
如前所述,目标值是应用于根据业务用例产生分类的管道。虽然它被应用于对顶级客户进行分类,但它也可以用于行为数据的任何维度(例如,哪个用户将流失,哪个用户将购买特定产品,等等)。)这个用例特别有趣,因为用户群中的幂律分布式收入生成的业务动态(这导致数据集中目标值的高等级不平衡)。
当定期预测新的传入用户时,可以通过将管道脚本作为作业进行调度,并将预测加载到数据库中进行可视化来实现。
值得一提的是,构建整个管道花了 6 周时间,如果没有 DFS 和 LIME 的库,这绝对是不可能的,这两个库都提供了很好的例子。所以我要感谢作者们为开源社区创造的所有价值。
通过网络抓取实现社交媒体竞赛的自动化
随着我的第三学期即将结束,我也结束了在汤森路透实验室的兼职实习,并完成了我在学校的项目和作业。醒来时盘子里什么都没有(我吃了早餐),这是非常不舒服的,我决定学习一些似乎总是可以做到,但从来没有机会动手做的事情。
灵感
我这么做是因为我的朋友在一家数字机构工作,她的部分工作需要管理社交媒体竞赛。基本上这个想法是做赠品来换取客户更多的宣传。
Random example found on the web doing an Instagram giveaway
甚至在您的“提交”被考虑参加竞赛之前,也有一些特定的要求需要满足,并且每个竞赛在性质上可能非常不同。比如 FB 而不是 Instagram,需要赞而不是关注和标签。浏览每个评论并访问每个标记用户的个人资料以确保他们是合法的,这是一项极其乏味的工作。她还必须手动捕捉每条评论和标记的用户,以便进行社交媒体分析。我的意思是手动将每个评论转换成 Excel 表格。这太疯狂了,很多时间都浪费在处理这些每周都频繁发生的比赛上。
如果你有一个标准化的简单任务,并且要重复无数次,它绝对应该自动化,让你做更有意义的工作。
在我开始之前,我对网络抓取的唯一了解是大量使用 HTML/CSS 知识操作页面的结构/模板,以及使用名为 BeautifulSoup 的 Python 包。
are you real?
主要任务之一是检查被标记的用户是否合法。我们通常凭直觉做出决定,但为了设定一个标准定义,我将其定义为至少拥有 100 个关注者、50 个关注者和 10 篇帖子的用户。
代码演练
检查用户是否合法
我在 Windows 上,用的是 Python 3.7,但是大部分代码和思路完全一样。允许您获取页面源代码,我们会将其加载到 init BeautifulSoup。在这个例子中,我将检查我的 Instagram 是否处理了is_legit
。
输出被打印成一大块代码,实际上是我的 Instagram 句柄页面的 html。我在打印输出中搜索“Followers ”,找到了下面一行。
<meta content=”978 Followers, 652 Following, 677 Posts — See Instagram photos and videos from Jason Yip ([@jasonyippee](http://twitter.com/jasonyippee))” property=”og:description”/>
执行这个将帮助我提取数字。
string = soup.find("meta", property="og:description")['content']
print(string)- 978 Followers, 652 Following, 677 Posts - See Instagram photos and videos from Jason Yip ([@jasonyippee](http://twitter.com/jasonyippee))
现在我只需要操作字符串来得到我想要的计数。
- 978 652 677
最后,我可以查看它是否满足阈值,并返回用户是否有效。我们还考虑了 Instagram 显示 243.8k 和 1,000 而不是 2438,000 和 1000 粉丝的情况。
自动化“加载更多评论”
现在,同样的想法,我们可以看看我们的比赛后,并检查评论,以检查有效的条目。你可以在页面上做 Ctrl+Shift+C 或者 Command + Option + I (Mac) ,将鼠标悬停在每个评论上来检查各自的元素。类似地,我们可以获得用户的类、标签和评论中的文本,我们可以使用 soup.find_all()使用 BeautifulSoup 进行搜索
然而,我遇到了一个关于加载更多评论按钮的问题。大多数页面只有在你进一步滚动或者点击按钮时才会加载内容。这使得我们无法获得每一条评论。
点击按钮后,页面源将只包含新的评论。这意味着我们不能简单地使用urllib
来获取 url 的 html,因为它没有考虑这种动态性。
我搜索了一下,发现了一个叫做 WebDriver 的东西,它有助于在 Web 上自动执行操作。基本上你可以写一个脚本来自动访问一个 URL,点击按钮,甚至为你滚动,同时为每个单独的动作计时。
Python 有对 Selenium WebDriver 的绑定 API,我们现在将把它与轻量级包 BeautifulSoup 结合起来。Selenium 还能够通过类、标签、CSS 选择器和 XPath 来查找元素。策略是对动态部分使用 Selenium 并保持简单,对静态部分使用 BeautifulSoup】。
Selenium + BeautifulSoup. A great combination but they definitely cannot be served together.
下载 ChromeDriver 以便 Selenium 自动运行您的 Chrome 浏览器,并将单个文件 chromedriver.exe 保存在您的目录中。通过运行下面的代码,你可以看到它会自动打开你的 chrome 浏览器来访问这个例子链接。
There is a X button for that annoying grey panel which pops up when we are not logged in to Instagram. The script will find the specified element to that button and click on it.
下一个块将继续点击加载更多评论,直到所有评论都已加载完毕。
Notice how upon running the code, the browser loads the page, removes the popup, and loads all comments on its own before I scrolled up to check that there is no more Load more comments button.
在每个评论中搜索标记的用户
现在所有的评论都被加载了,我们可以像之前一样使用driver.find_elements_by_class_name()
和 BeautifulSoup 来获取每个评论的用户和文本。我们还可以拆分文本,查找以“@”开头的标记,以识别标记的用户。
User glampalmusa
Text a great pic... lets follow each other so that we can be connected with various hairstyles! . .
User yorke173
Text yes please 🍁😍😍 [@avril](http://twitter.com/avril).yorke
[@avril](http://twitter.com/avril).yorke
既然我们能够从每个评论中提取标记的 Instagram 句柄,我们就可以遍历评论中的所有句柄,并将它们提供给is_legit()
。如果评论具有足够数量的有效用户,并且该数量满足阈值,则评论是有效的。最后,我们只需将结果写入 csv 文件。我还为每个标记的用户添加了一个额外的行。这将提供功能,让用户谁标记更多的站在一个更高的机会获胜。
导出应用程序
核心功能已经完成。现在我只需要使它可用,我不能指望我的朋友安装 Python 及其所有的依赖。我试图用 Heroku 上的 Flask 创建一个 chrome 扩展和一个 web 应用程序,但在一天结束时,这对我来说太难了。我怀疑这主要是由于与 chromedriver.exe 的兼容性问题。
我用了 2-3 个小时写了上面的脚本,但是所有这些部署的东西花了我大约 4-5 个小时,我不能让它工作。我寻找替代方案,并意识到我可以将它打包成可执行文件。exe 文件,人们无需安装任何东西就可以运行它。用 PyInstaller 可以很容易地做到这一点。
在此之前,我意识到我不能期望用户在命令行中输入竞赛页面的 URL 和所有阈值。我搜索并找到了 TkInter ,它实际上是一个标准的 Python 包,允许我们非常容易地创建一个简单的 GUI。有了这段代码,我就能够完成我的简单应用程序。
在 Python 控制台中运行这个简单的命令来创建。可执行程序的扩展名
pyinstaller scrape.py
Creating the scrape.exe file which can be transferred around and allows us to run our program without installing anything.
我们还必须将 chromedriver.exe 复制到 scrape.exe 文件所在的文件夹中。剩下的就是把文件夹“刮”起来,发给任何人。
Process of running the app
就在那里。最终生成的 csv 文件以前需要花很多时间来手动编译。
我相信网络抓取对整个数据科学领域都很重要。有更多的数据总是好的,不是吗?这肯定可以在许多领域进行探索,如销售线索挖掘、在 LinkedIn 等专业社交网站上寻找新员工等。我们可以抓取网址、照片、视频,为自己创造如此多的免费数据,这些数据就在网上。
希望你喜欢读这篇文章。向普通观众传达这一点很有趣。分享你的想法,如果有反馈请留下:)
注意: 我与我的示例中使用的任何用户和帐户都没有关系。它们都是从网上随机找到的,我只是搜集公开的内容。
在 LinkedIn 或通过 jasonyip184@gmail.com 与我进一步讨论!
自动化和取样
正如我前面提到的,我已经从爱立信过渡到了 Shopify。作为这种转变的一部分,我开始体验公共交通(以前工作离家需要 15 分钟的车程,现在,在市中心工作,我必须乘火车上下班)。今天早上,我旁边有一个女人正在用她的电脑工作,显然是在编辑一份文件,或者更可能是在里面写评论。在编辑的几分钟内,她打了一个电话,通过电话要求某人修改文档中的一些措辞,并痛苦地口述这些修改(几个词)。这个游戏大概进行了几次;在文档中编写注释,然后呼叫某人进行适当的编辑。本来可以是简单的编辑,然后通过电子邮件发送编辑过的文档变成了明显痛苦的听写练习。重点不在于找出她为什么不通过电子邮件发送文档,这可能很简单,因为没有数据计划,不愿意等待 wifi 连接,谁知道呢,但非自动化“过程”的使用使通常很简单的事情(在文档中编辑几个句子)变成了痛苦的听写体验。这也有带宽有限的后果,因此只有少数意见可以在该文件上进行修改。
这让我想起了前段时间和一个朋友的对话。他提到了他感到自豪的是,在他的组织中为两个数据源的提取、转换和存储建立了数据管道。一些数据是由他公司的系统生成的。靠近数据源,他有一个服务器,用于收集和减少/转换数据,并将结果作为文本文件存储在本地文件系统中。他每天都查看该服务器上的提取过程,以确保它仍在运行,每隔几天,他就会将新的文本文件从该服务器下载到一个服务器群和一个数据库中,他通常使用该数据库来对数据进行分析。如你所见,这也是一个痛苦的、非自动化的过程。因此,数据量很可能比自动化过程更有限,因为我的朋友需要手动满足这些管道的需求。
在 Shopify,我很高兴能够对我想分析的数据进行自动 ETL(提取、转换和加载)处理。如果您想了解一下 Shopify 在 ETL 方面提供了什么,我邀请您观看来自 Franç oise Provencher 的Shopify 的数据科学视频演示,她略微谈到了这一点以及 Shopify 数据科学家工作的其他方面。简而言之,我们使用 pyspark 和我们的数据工程师开发的定制库,从我们的来源提取、转换和加载数据到前厅数据库,公司中的任何人都可以使用该数据库获得关于我们业务的信息和见解。如果您通过 Franç oise video 收听,您将会理解自动化 ETL 方案的好处之一是我们将原始数据(大部分不可用)转换为存储在前厅数据库中的信息。然后,这些信息可用于进一步处理,以提取对公司有价值的见解。你会立即看到好处。一旦这样一个管道建立起来,它就会自动地执行它的工作,并且由于我们的数据工程团队,它会一直自我监控。显然,如果出现问题,必须有人采取行动并纠正这种情况,否则,您可以忘记管道,它总是更新的数据可供所有人使用。无需一个人花费大量时间监控和手动导入数据。一个必然的结果是,新信息的带宽相当高,我们可以获得大量的信息来进行分析。
让这么多信息唾手可得带来了新的挑战,而这些挑战是那些拥有手动管道的人从未遇到过的。对整个群体进行分析变得越来越困难和低效。你需要从样本的角度开始思考。取样时要记住几个因素:样本大小和你要取样的东西。
有数学和分析的方法来确定你的样本量,但是一个快速的方法是从一个适度的随机样本开始,进行你的分析,查看你的结果并保存它们。然后,你重复这个循环几次,看看你是否一直得到相同的结果。如果你的结果变化很大,你可能没有足够大的样本。否则你是好的。如果尽可能有效地提高未来的可重复性很重要,您可以尝试减少您的样本量,直到您的结果开始变化(此时您应该恢复到以前的样本量),但如果不是这样,足够好就是足够好!只要记住那些样本必须是随机的!如果你一次又一次地使用相同的样本重复你的分析,你没有证明任何事情。在 SQL 术语中,它是以下两者之间的区别:
SELECT * FROM table
TABLESAMPLE BERNOULLI(10)
另一方面,这将产生 10%的表的随机样本:
SELECT * FROM table
LIMIT 1000
将很可能总是产生相同的前 1000 个元素…这不是一个随机样本!
你应该记住的另一个考虑是关于你应该取样什么,你想要观察的人群是什么。比方说,用 Shopify 的行话来说,我有一个所有商家客户的表,其中包含一个 orders 表的外键。如果我想了解客户执行了多少订单,那么被观察的人群是来自客户,而不是订单。换句话说,在这种情况下,我应该随机抽取我的客户,然后查看他们有多少订单。我不应该对订单进行抽样,以汇总每个客户的订单,并希望这将产生预期的结果。
从视觉上,我们可以看到,从订单中抽样会导致我们错误地认为每个客户平均执行两个订单。随机重采样将导致相同的错误结果。
而从客户那里取样,将得出每个客户平均执行四个订单的正确答案。
总结一下,假设您有手动(甚至半手动)ETL 管道,那么您需要将它们自动化,以提供一致性和吞吐量。一旦做到这一点,你最终会发现采样的乐趣(和需要)。取样时,您必须确保选择了合适的样本群体,并且您的样本是随机选取的。最后,你总是可以通过分析找到合适的样本量,但是通过几次试验,如果你的发现在大量随机样本中保持一致,你很可能就没事了。
封面照片由 Stefan Schweihofer 在 Pixabay 。
原载于 2018 年 9 月 18 日【thelonenutblog.wordpress.com】。
自动车辆专用扩充库
在 Udacity 的自动驾驶汽车纳米级课程开始不久,我就意识到,除了通常遵循的增强技术,自动驾驶汽车还需要专门的增强。无人驾驶汽车是人工智能最复杂的挑战之一,在许多方面也不同于其他挑战。它不仅能看到白天和夜晚的世界,还能看到各种天气变化。对于一辆汽车来说,在雪地里行驶和在常规的夏季道路上行驶是完全不同的。为了使汽车比以前更安全,并将其推广到道路的各个方面,有必要在所有可能的环境中训练它们。
我搜索了互联网的深渊,但找不到人为创造这种场景的具体方法。到目前为止,训练车辆的唯一且更可靠的方法是在实际道路上训练它们。但是,道路并不是所有想训练他们汽车的 CNN 在所有条件下优雅驾驶的天才都可以到达的。
于是我决定创建****。这个库是用 python 写的,底层使用 OpenCV 和 Numpy。自动造型有助于增强图像,使其具有不同的季节。无论你想添加更多的阳光或雨水,雾或雪,或者一些速度,砾石和秋叶, Automold 都可以帮助你实现,而不会让你陷入自己编写整个代码的麻烦中。
下面是我将测试自动成型的一些图片。
original images
将雪添加到图像中真的可以帮助自动驾驶汽车工程师让汽车理解,在雪中驾驶是怎样的。下雪和下雨的道路在驾驶时会造成很大的威胁。甚至人类也发现识别路径真的很难,因此训练 CNN 识别路线是很麻烦的。
下面是一些由 Automold 生成的带有新雪和雨的图像。
adding snow
adding rain
雨雪量也是可配置的。有三种雨可供选择,分别是“毛毛雨”、“大雨”和“暴雨”。如果你不想做太多的配置,只需设置雨的类型,你就可以了。如果你想让图像或多或少有点阴影,你可以通过设置相应的系数来使图像变暗或变亮,也可以选择随机值。
brightened images
darkened images
这不需要进入 OpenCV 颜色通道和修改像素值。你也不需要遍历你的图像列表,并在每个图像上调用函数。不管是一张图片还是整个图片列表,只要把它传递给函数就行了。整件事就像:
bright_images= am.brighten(images)
除此之外,如果你想在道路上引入阴影或砾石,Automold 可以帮助你立即做到这一点。然而,同时允许您做各种配置。定义感兴趣区域或指定引入多少砾石块有时会非常方便。如果你不想配置,你可以使用默认值。
random shadows on road
gravel patches on road
引入雾或太阳耀斑也非常容易,而且是可配置的。雾的强度,太阳耀斑的位置,耀斑的颜色,角度等。可以设置为创建所需的效果。
adding sun flare
adding fog
此外,还有两个新增加的库,允许我们添加速度运动和秋天的图像。运动模糊实际上是一个东西,当你开快车时就会发生。道路上远处的位置清晰可见,但当它们靠近时就模糊了。
adding speed
adding autumn
让树叶变成红色和橙色可能不是描述秋天的最佳方式,但仍然是人工复制这种效果的最接近的方式。尽管我仍在考虑一种更好、更健壮的方法来这样做。因此,有许多功能供您使用,可以帮助您放大专门针对道路的图像。但是,难道没有一种更好的方法来进行增强,而不是手动调用这些函数吗?嗯,是的!!您只需输入以下命令即可:
aug_images= am.augment_random(images)
该函数在输入图像上应用一组增强,并将整个增强代码减少到只有一行。
你可以在我的 Github 简介上找到文档和库代码以及其他自动驾驶汽车项目,更多我的文章请访问 Medium 或 Wordpress 。
AutoWorkout:如何改进运动活动分类器预测?
最近我开始开发自动锻炼 iOS/WatchOS 应用程序。它自动识别健身运动,并提供每次运动花费的时间和重复次数(在未来的版本中)。这款应用的想法自然源于我第一次尝试通过机器学习识别运动活动类型,首先是收集运动数据,设计神经网络分类器,然后在核心 ML 的帮助下在 iOS 应用中利用它。
在这篇文章中,我有意跳过应用程序实现细节,专注于使运动活动分类器预测有用,因为这是最具挑战性的问题。
没有 UI 才是最好的 UI
在将预先训练好的模型导入 AutoWorkout 之前,我非常确定它们会在预测健身运动方面做得很好。他们确实这样做了,但各有各的方式。在这里,我将离开一点,描述我是如何识别运动活动的。
由于手腕可穿戴设备能够提供足够的传感器数据来预测人类的运动活动,而且我已经专注于 iOS/Watch OS 开发,所以我选择 Apple Watch 作为我的应用程序的目标设备。由于 WatchOS 支持 Core ML,我可以直接在 Apple Watch 上运行分类器,避免 iOS 和 Watch OS 之间昂贵且不总是可靠的通信,以传输传感器数据,从而在 iPhone 上进行预测。iOS 应用程序主要包含 UI 演示代码,以显示正在 Apple Watch 上收集和计算的锻炼统计数据。
我是拥抱的粉丝,没有 UI 是最好的 UI 方法,因此 WatchOS 应用程序中唯一的 UI 元素是“开始”和“停止”按钮。只需点击“开始”,开始锻炼,做你的练习,并在结束时点击“停止”。你所有的练习都会被认可,每一次花费的时间会被计算出来,重复次数会被记录下来。
Interface of the Apple Watch app
Workout statistics
预训练神经网络分类器
为了使这一切成为可能,我需要利用预训练的分类器,这些分类器每隔 1.7 秒根据传感器数据进行预测。注意到“量词”了吗?是的,我需要一个传感器数据来源——X、Y、Z 加速度计——总共 3 个分类器,每个分类器实时预测 5 种活动(跳跃、俯卧撑、下蹲、弓步和练习之间的暂停)。
在无数个小时调整他们的性能后,我最终获得了可接受的精确度:
- x 轴分类器:89.09%
- y 轴分类器:85.01%
- z 轴分类器:81.66%
对于今天的分类问题来说,这些数字可能看起来并不令人印象深刻,但是考虑到我所受的时间和数据收集的限制,我发现它们相当不错。
N 个分类器,N 个观点
在我将分类器集成到应用程序中后,很明显它们能够预测健身运动,我必须检查这些预测的质量。
理想情况下,应用程序应该记录,比如说一个俯卧撑练习,如果所有 3 个分类器都预测这是一个俯卧撑练习。在现实生活中,我有不到 5%的情况下,所有 3 个模型都预测同一类。在几乎 50%的情况下,3 个模型中的 2 个模型的预测是匹配的。另外 45%的病例是所有 3 个模型预测的不同类别。
当你有三个数据来源,并且它们告诉你不同的事情时,不容易做出决定,对吗?这是机器学习环境中的一个众所周知的问题,在机器学习环境中,存在不止一个分类器,并且存在利用由多个来源提供的预测的技术。
投票
在分类机器学习问题中投票可能是从多个预测中导出单个类别的最简单也是最强大的方法。在实施投票算法时,你问自己的第一个问题是,它将是多数投票还是加权投票?
在我的案例中,很明显模型 X 具有最高的准确性,但是根据地面事实标签进行的测试表明模型 X 预测 A 类(这是不正确的)和模型 Y 和 Z 都预测 B 类(并且是正确的)的情况并不少见。因此,我不能只给 model X 在投票中最大的影响力,并使用加权投票— 它必须是加权和多数投票的混合来涵盖这种情况。
虽然,在现实生活中的测试表明,如果至少有一个模型预测“暂停”类,用户有非常高的概率确实在那一刻暂停。
所有这些观察给了我一套简单的规则,供我在投票算法中考虑:
- 如果一个模型预测“暂停”,记录“暂停”
- 如果≥ 2 个模型预测“A”类,记录“A”
- 如果所有模型预测不同的类别,使用来自模型 X 的预测
看,规则#2 实现了多数投票方法,而规则#3 利用了加权投票方法,通过给予模型 X 在不确定时期被选择的权利。
在投票算法被纳入分类管道后,我能够主观和客观地注意到预测变得正确且不那么混乱了。
离群值随处可见
然而,最终用户可以看到的锻炼统计数据仍然不完美:在锻炼期间没有执行的锻炼到处出现。
这一切都感觉有一些改进的空间,我开始将投票算法做出的预测与地面真相进行比较。当我知道我做了 15 秒长的深蹲,之后停顿 20 秒,然后是 30 秒的弓箭步时,在一次锻炼中,这 3 个动作中应该没有其他的训练项目。
Cells with red background contain incorrect predictions. Rows with a black background and bold text are latest exercises of each kind in a row.
在上面的例子中,你可以看到用户不太可能在一直做深蹲的同时做几个深蹲动作(第 6、9、11 行),也不太可能在做深蹲时多次做暂停或深蹲(第 24、26、29 行)。第 21 行告诉我们,与地面事实相比,弓箭步检测得太早。
当然,也可能有例外,人们可以按照他们想要的任何顺序和序列进行练习,这使得检测异常(最有可能是不正确的预测)的问题几乎根本无法解决。
然而,我做了一个有根据的猜测,并决定设计一个算法,该算法将从给定锻炼时段的所有预测数组中检测并移除异常预测。
没有要检测的单一模式
当谈到任何人类活动时,很难挑出会在用户之间重复的模式。所有人都是独一无二的,每个人的锻炼方式都不一样。
我很难推导出这种异常预测检测算法的规则,因为异常预测和的可变性实在太大了。但是有了预测的基础,我可以发现最常见的模式来检测异常值,并得出以下规则:
- 如果当前预测与下一个预测相同,则什么也不做。
- 如果当前预测与先前预测相同,则不采取任何措施。
- 如果前一个和下一个预测都不等于当前预测,则使用前一个预测。
查看在执行一次算法后,它如何帮助消除第 6、9、21、24、26 行中的红斑:
然而,异常值去除算法在第 10 行引入了另一个红点,也没有解决第 11 行的问题,因此我决定多次应用相同的算法:
通过对我所拥有的练习模式进行实验,我发现对由投票算法产生的“原始”预测进行 3 次算法传递就足以去除大部分异常值,并使结果预测尽可能接近真实情况。
为了获得对算法的更大信心,我进行了一项测试,同时比较了仅应用投票算法的预测与异常值检测算法 3 次通过后获得的预测的基本事实的标准偏差:
- “原始”预测与基本事实的标准偏差:15.41
- 从异常值检测算法获得的预测值与真实值的标准偏差:8.09
预测准确率提高了近 2 倍,不错!
结论
当然,在一些极端情况下,离群值检测算法会对原始数据产生扭曲,使一项或另一项锻炼持续几秒钟以上,但尽管如此,在分类器不能提供足够准确性的情况下,它在使锻炼统计数据看起来足够方面做得很好。
投票算法也是分类管道的重要补充,因为没有单一的分类器可以在检测健身运动中提供接近理想的准确性。
这两种方法使 AutoWorkout 应用程序能够更准确地检测运动活动,并提供更好的用户体验。
在 Medium 和 Twitter 上关注我,看看 AutoWorkout 应用程序如何使用机器学习来计算锻炼次数。
Avinash Kaushik 谈机器学习和人工智能营销——本周的六像素分离播客
《六个像素的分离》第 580 集 Mirum 播客 现已直播,等待您的收听。
他回来了!谷歌的数字营销布道者、畅销书作者( Web Analytics —每天一小时和 Web Analytics 2.0 )、有影响力的作家(奥卡姆剃刀)、朋友和营销大脑、阿维纳什·考什克。他的每月帖子也可以是商业书籍,他对当今市场营销真正重要的东西的见解令人耳目一新。他有一种态度,他充满激情,他对我们在这个时代需要思考的问题有一些想法。最近,阿维纳什还推出了他自己的个人电子通讯,名为营销-分析交叉(你最好注册一下),我们回来讨论他为什么花这么多时间思考和研究机器学习、人工智能……以及一旦商业领袖真正参与进来,营销将如何发生巨大变化(以及其他一切)。享受谈话…
你可以在这里抓取最新一集的六像素分离(或者随意 通过 iTunes 订阅) : 六像素分离 Mirum 播客#580 。
米奇·乔尔 是 Mirum 的总裁,这是一家在近 20 个国家运营的全球数字营销机构。他的第一本书 【六像素的分离】 ,以他成功的 博客 和 播客 命名,是一本商业和营销畅销书。他的第二本书CTRL ALT Delete,被亚马逊评为 2013 年度最佳商业书籍之一。了解详情请点击:【www.mitchjoel.com】。
避免以错误的精确度呈现产品测试结果
我开始写这篇博文是因为我不断看到 A/B 类产品测试的结果被引用到小数点后两位的演示文稿,即使产生这些数据的样本量相当小。我最终重写了很多次,因为我试图吸收和反复误解这些测试背后的数学。最后,我得出了一个相当简单的结论:
泰勒:博士
在一个典型的测试中,测量数字产品**上某件事情发生的百分比,引用超过一位小数的结果几乎是不合适的。**要自信地引用精确到百分之一的数字,需要大量的样本。为了更好地交流结果,请计算与测量相关的置信区间,并将数字表示为一系列似是而非的值。
对单一数字的信心
暂时忘掉“A/B”这个方面。让我们想象一下,对一些简单的事情,比如点击网站上某个按钮的访问者数量,进行一次单独的测量。我们对 10,000 名访问者进行了抽样调查,发现其中 984 人点击了按钮。然后,你可能会天真地把它表示为 9.84%。
但是想想这个数字意味着什么。如果你说某样东西是“9.84”,那么这意味着它不是 9.83 或 9.85。如果你选择了一个不同的 10,000 个访问者的样本,你仍然会发现其中有 984 个点击了按钮。这当然不太可能。
如果您选择 10,000 个不同的样本,您预计会有多少点击量?这取决于我们有多确信我们的抽样计数或点估计值接近全部访问者的“真实”潜在比率。这种单点估计的置信区间可以计算如下[1,2]:
**p̂ = ∓ Z √(p̂(1-p̂)/n)**
其中,p̂是点估计值(即 984),n 是样本大小,z 是与我们寻求的置信水平相关的数字。
“信心水平”是什么意思?这是相当微妙的。置信区间是分布在点估计值两侧的一系列值,根据这些数据,整个总体的“真实”值可能在这个区间内。置信水平设置了间隔应该有多宽。
普遍接受的实验标准是寻求 95%的置信水平。这意味着,如果我们取 20 个样本,那么 20 次中有 19 次,点估计的置信区间将覆盖真实的总体值。鉴于我们在这里是定位按钮而不是治疗疾病,90%置信度的较低标准似乎被广泛接受为 A/B 测试的默认标准,这意味着 10 次中有 9 次与估计值相关的区间将包含真实值。
对于不同的置信水平,Z 的值可以代入上面的公式:
**Confidence Level Z (approx)
---------------- ----------
99% 2.58
95% 1.96
90% 1.69**
假设在 10,000 个样本中有 984 次点击,对于 90%的置信度,我们得到:
**0.0984 ∓ 1.69 √(0.0984(1-0.0984)/10000) = 0.0984 ∓ 0.005**
因此,9.8%的测量值与+/- 0.5%的置信区间相关,我们认为真实值可能在 9.3%到 10.3%的范围内。你可以看到,以 0.5%的间隔,引用中心测量值到百分之一是愚蠢的。
我们需要多少数据来证明一个引用到百分之二小数的数字?为此,我们需要一个不超过 0.005%或 0.00005 的置信区间。重新排列公式,我们会得到 n 的值,大约是 1 亿。这就是你需要多少数据来证明一个百分比的两位小数。
参考文献和注释
- Bryan Gumm,A/B 测试背后的度量和统计数据。
- Beaulieu-Prévost,D. (2006) 《置信区间:从统计显著性测试到置信区间、范围假设和实质影响,心理学定量方法教程,2(1),11–19。
- 这里假设 n 大于 5,大到足以使用二项式分布的正态近似。数字环境中的任何测试都应该通过这个数量级。
避免机器学习错误 101
Machines Learning
比尔·盖茨曾经说过“我们总是高估未来两年将发生的变化,而低估未来十年将发生的变化;不要让自己被麻痹而无所作为。”没有什么比正在进行的机器学习革命更真实的了。
近年来,我很高兴共同开发了三个新的人工智能-人工智能解决方案,这些解决方案通过了领先公司或专家的尽职调查,并被用于解决现实世界的问题,在一所排名前 10 的大学获得了以人工智能预测分析为重点的信息学高级学位,荣获两项全球创新奖的决赛入围奖,并在美国和亚洲旅行,在技术路演上交谈和倾听。这些是我学到的一些东西:
1。天赋失焦——人工智能(AI)和机器学习(ML)需要昂贵的精通 R 或基于 Python 的平台(如 SAS、TensorFlow、Spark MLib、scikit-learn、Theano、Torch、Caffe、CNTK 或 Keras)的程序员的想法——已经成为一个神话,因为机器学习现在已经在很大程度上自动化了。如果你是数千家想象 AI & ML 可以产生非凡投资回报率和竞争优势的公司之一的决策者,那么最好是停止参与这些稀有编码员的竞标战,而是将你的人才决策集中在了解数据科学的技术专家身上。正是后一组人知道如何做两件对有效使用人工智能至关重要的事情:第一,问正确的问题;第二,部署自动化技术。你大概不想要一个能再造 TensorFlow 的专家;您希望有一位专家能够应用它和数十种类似的工具来尽快获得正确的信息,以了解因果要素并建立预测未来的模型。把软件编码(这永远都要不断重做)留给软件公司(反正你公司的市场可能更好)。
2 。 AI-ML 即服务 —在这个软件、平台和基础设施都可以作为服务随时随地使用的时代,AI-ML 也是如此。正如现在没有人需要自己的数据中心或下载的软件许可证一样,那些花费过多时间、金钱和精力来识别和招募自己的 AI-ML 团队的公司正在浪费这三者(除非你是创建自动化 ML 工具的公司之一)。人工智能专家可以通过自动化的人工智能工具以更小的时间增量“出租”,而不是以每年 20-30 万美元的工资重新创造人工智能轮子(然后在下一次更酷的东西出现时试图留住他们,这将以月为单位)。他们可以在几周或几个月内,而不是几个季度或几年内,找到您的大数据中的因果元素、它们的比例贡献,并从几十个模型中找出最佳预测模型,而不是 6-18 个月的软件开发生命周期,而成本只是几分之一。
3。知道你不知道的事情——前国防部长唐纳德·拉姆斯菲尔德,甚至被他的许多批评者认为是一个极其聪明的人,发明了一句格言:有些事情我们知道,有些事情我们知道我们不知道,有些事情我们不知道我们不知道。坦率地与专门的数据科学招聘人员交谈,他们会告诉你几乎每天都会收到或阅读职位描述,对于擅长数据科学的技术人员来说,很明显,无论是谁写的职位描述,都不知道他们在谈论什么。他们可能理解机器学习的基本前提,从而认识到它的价值。他们可能听说过一些领先产品。从这两个入门级仿真陈述中,他们写了一份工作描述,说明谁最适合通过人工智能-人工智能策略使他们的任务超级有利可图,并且做得更好。他们很困惑,得到了他们想要的,却没有得到他们需要的。当他们意识到这一点时,那些对这个发展中的领域一无所知并问了很多问题的人已经领先了几年,而他们的成本只是这个领域的一小部分。
4。不是一个模型——已经走上人工智能道路的公司经常说类似“我们已经在 _____ 建立了一个初始模型,现在我们想优化它。”错误在于数据和模型的单一框架。事实上,他们可能有许多数据集组合。首先,每个数据集都有不同的因果要素和不同的预测模型。因此,每次添加或修改数据集时,都需要确定新的因果比例和预测模型。第二,最好的预测来自被称为集成的 ML 模型的组合,其中不同的算法在连续的步骤中被使用或者被混合,这正被迅速地接受为几乎普遍的 ML 真理。人们可以看到这种情况很快会发展到什么地步。假设有 20 个数据组合、20 个 ML 模型和三个步骤,即 20 x 20 x 20 x 20,即 160,000 种排列。将 ML 自动化而不是一次编码一个是将它们并置并发现什么是最好的唯一方法。
最近,AirBnB 的一位数据科学领导者写道,他们通过在可用的真实世界应用程序中短时间内使用自动化 ML,在很小的时间和费用内学到了增长业务的洞察力。AirBnB 可以说是通过熟练地应用数据成为世界上最大的酒店公司之一。一个季度花费 2-3 万美元,而不是几十年几十万或几百万美元,大多数业务部门或公司就可以对驱动其业务、使命和增长的数据元素有非凡的新见解,并有一个预测模型来最大化他们的未来。所以,套用盖茨先生的话来说,你为什么会被蒙骗而无所作为?
适用于您的机器学习解决方案的 AWS 架构
利用 AWS 支持的销售智能 ML 渠道推动数百万的收入
Photo by Franck V. on Unsplash
前言
在为我们的客户公司设计企业级解决方案时,我面临的一个常见挑战是缺乏关于真实世界架构用例的在线参考。
您会发现大量关于如何开始学习个别技术的教程,当您的关注点仅限于特定的框架或服务时,这些教程非常有用。为了评估现有的各种方法,并预先确定将这些方法捆绑在一起的含义,你要么必须找到一个以前走过这条路的人,要么自己冒险进行一次独立的实验。
这就是为什么我决定开始分享我自己在为多家财富 200 强公司和新兴创业公司设计和开发技术解决方案时收集的一些见解。希望今天的用例能够帮助您为您的机器学习解决方案规划 AWS 架构。
这项事业
最近,我参与了为北美最大的钢铁制造商之一开发机器学习解决方案。
该公司希望利用 ML 的力量来深入了解客户细分、订单预测和产品数量建议。
本文围绕我们为什么以及如何利用 AWS 来部署我们的可交付成果,以便销售团队可以根据这些见解采取行动,而不需要通过复杂的技术障碍,并且让任何未来想要在公司内部增强它的数据科学家或工程师无缝地开始。
打嗝
从第一天开始,我们必须考虑的一个主要因素是,开发的解决方案最终会交给一个没有计算机科学背景的团队。是的,你没看错。
另一端最接近数据科学家的人是 IT 部门的人,他以前编程过,但没有调试完整的机器学习笔记本的能力。
因此,自动化是我们设计中的一个关键——不仅能够交付打包的解决方案,还能够交付自动化的管道,这种管道可以在非程序员之间进行自我维护,而不需要每周进行人工干预。
这些碎片
我不会详细讨论实现的细节*(为了防止“40 分钟读取”标签出现)*,但是我会给你一个涉及到的各种活动部分的细目分类。
- 数据源
- 机器学习和数据工程笔记本
- 使用 Python Flask 构建的 Web 应用程序
- 自动化流水线
服务
以下是我们使用的 AWS 服务,根据它们服务的区域进行分类,并简要概述了它们的用法。下面的图表直观地解释了这个架构,但是我建议通读这一部分,特别是如果你不知道这些服务是做什么的话。
数据源和目标
- S3: 大容量数据存储旨在从任何地方存储和检索任意数量的数据。这就是我们用来训练模型的数据湖所在的地方。运行模型后,一个额外的 S3 存储桶足够我们存储临时和最终的输出。
- Athena: 允许您使用普通的 SQL 查询来查询 S3 对象系统中的数据文件。这有助于快速浏览数据和分析行,而不必每次都打开 Jupyter 笔记本。我们还使用 Athena APIs 在笔记本中提取数据。
代码版本控制
- CodeCommit: 亚马逊的 git 版本,用于版本控制和协作。我们使用了两个独立的存储库——一个用于 ML 和数据工程笔记本,另一个用于 Web 应用。
数据工程和机器学习
- Amazon SageMaker: 平台,使开发人员和数据科学家能够构建、训练和部署任何规模的机器学习模型。这是执行数据工程和机器学习的笔记本运行的地方。如果您已经在本地 Anaconda 实例中进行了开发,那么完全没问题,您可以在 SageMaker 中运行这些笔记本,不会有任何问题。我们使用了一个 m5.4xlarge (16 个 vCPUs,64 GB RAM)实例用于我们的培训目的,每小时大约花费一美元。每个数据工程周期处理大约 70 GB 的数据,它需要大约两个小时来端到端地运行并为 ML 笔记本电脑生成可用的文件。您可以以此为参考来决定是否需要放大或缩小实例。
完成模型训练后,关闭 SageMaker 实例是很重要的,因为费用会很快增加。这是为什么您的最终序列化模型输出应该存储在其他地方的另一个原因,比如在 S3,而不是 SageMaker 的附加 EBS 实例。不要担心,当您启动 SageMaker back up 时,它会将您的更改恢复到您在新实例中的位置。
Web 应用程序部署
- Elastic Beanstalk: 部署和扩展使用各种语言和服务器端框架构建的 web 应用程序的服务。它初始化了部署 web 应用程序所需的所有其他必要的 AWS 服务,包括下面描述的 EC2 和 CloudWatch。在我们的例子中,这是部署 Python Flask 应用程序的地方。一个没有自动缩放的 t2.large (2 个 vCPUs,8gb RAM)EC2 实例对我们来说已经足够了,因为它将在内部使用。如果你预计流量很大,你可以使用 Beanstalk 的自动缩放功能,它会根据网络流量自动添加和删除服务器实例,这太棒了!
- CodePipeline: 持续交付服务,帮助您自动化发布渠道,实现快速可靠的应用和基础设施更新。我们使用它来自动将合并到 CodeCommit 存储库主分支的最新代码更改推送到 Web 应用程序的实时版本。
幕后的其他服务
- EC2: 在云中提供安全、可调整计算能力的 Web 服务。基本上,把它们想象成云上的虚拟机。其他 AWS 服务,如 Elastic Beanstalk 和 SageMaker 利用这一服务来满足他们的计算需求。
- CloudWatch: 监控和管理服务提供数据和见解来监控您的应用,并触发自动化流程。由利用它的 AWS 服务管理,在这种情况下不需要人工干预。
建筑
自动化是我们设计中的一个关键——能够交付一个打包的解决方案,它可以在非程序员中自行处理,而不需要每周人工干预。
Machine Learning and Data Engineering
上图概述了机器学习和数据工程方面的 AWS 部署架构。如您所见,SageMaker 实例是开发人员和数据科学家主要工作的地方。笔记本拉和推数据,并直接输出到 S3 桶。如果数据驻留在其他数据库系统中,您可以随时将数据源更改为其他数据库系统。代码(即笔记本)本身实际上位于 CodeCommit 存储库中。您可以在 SageMaker 实例中克隆这个存储库,以便定期将您的更改提交给它。如果你只是玩玩,你确实可以选择在 SageMaker 中直接创建或上传笔记本,但是强烈建议你为任何严肃的开发工作准备一个版本控制系统。
Web Application
这向您展示了 web 应用程序部署的架构。web 应用程序所依赖的数据和序列化的 ML 模型存放在 S3 桶中。部署 web 应用程序的弹性 Beanstalk 实例在应用程序重启时获取新数据,并将其存储在本地系统中。这对我们来说很好,因为文件不是很大,保存在本地节省了频繁往返 S3 的时间和成本。但是如果您正在获取大量数据,您可能需要重新考虑它。
CodeCommit 中托管的 web 应用程序存储库由 CodePipeline 持续监控(code pipeline 有一个 CloudWatch 服务在幕后运行,用于监控存储库中的更改)。在我们的例子中,任何时候,新的变更被合并到主分支中,新的版本被 CodePipeline 服务自动提取并部署到 Beanstalk 实例中。
问题和反馈?
我希望这能够让你明白如何利用 AWS 服务来生产你的机器学习解决方案。我计划根据我围绕应用程序开发、大数据和机器学习所开发或遇到的内容,写更多关于这一系列架构用例的文章。请让我知道你对这篇文章的想法,以及你希望我写更多的什么样的主题。
感谢你的阅读!
是时尚科技初创公司Qarece&hack wears以及开源电子商务框架 的创建者之一他还为多家美国财富 500 强公司担任顾问,这些公司都是技术负责人、数据科学家和高级全栈工程师,涉及从应用开发到大数据分析和机器学习的项目。
加入 EJ 的邮件列表,这样就能收到新故事的通知!❤
如果你已经读过,并且喜欢一个媒介上的故事,请鼓掌👏!它鼓励作者多写,并让你成为读者。❤
你可能会喜欢 EJ 的其他文章
** [## 6 分钟学会 hip lot——脸书用于机器学习可视化的 Python 库
高维互动情节变得简单。实践教程。
medium.com](https://medium.com/@viveckh/learn-hiplot-in-6-mins-facebooks-python-library-for-machine-learning-visualizations-330129d558ac) [## 10 分钟学会元流——网飞的数据科学 Python/R 框架
花更多时间建模,花更少时间管理基础架构。实践教程。
towardsdatascience.com](/learn-metaflow-in-10-mins-netflixs-python-r-framework-for-data-scientists-2ef124c716e4) [## 在 10 分钟内建立一个量子电路。Qiskit,IBM 用于量子编程的 Python SDK
学习量子力学的基本概念,在真实的量子上使用 Python 构建和执行量子电路…
medium.com](https://medium.com/@viveckh/build-a-quantum-circuit-in-10-mins-ft-qiskit-ibms-sdk-for-quantum-programming-75435b99ee9e) [## 为什么我的创业公司从未上线,尽管它已经有了可以投入生产的技术
技术型联合创始人的 6 个关键咒语。
medium.com](https://medium.com/swlh/why-my-startup-never-went-live-despite-a-production-ready-tech-55d344c0c057)**
面向初学者的 AWS EC2
了解为什么应该使用 Amazon Web Services Elastic Compute Cloud(EC2 ),以及如何在 Windows 虚拟机(Windows Server)上设置基本的数据科学环境。
有时候,人们会受到台式机或笔记本电脑性能的限制。假设一位数据科学家有一个大型数据集,他们想对其进行一些分析。科学家继续尝试将整个数据集加载到内存中,出现了如下所示的错误。
Unable to load a CSV file into Memory (R Code)
由于可用内存耗尽,导致了该错误。操作系统无法再分配 500Mb 内存。虽然对于这种类型的问题有许多不同的解决方案,但是一种可能的解决方案是升级计算机的 RAM。除了必须在更多的 RAM 上投资之外,一些计算机可以升级的范围也有限制。本教程中探讨的潜在解决方案是在云中使用一个具有更多 RAM 和 CPU 的虚拟机(AWS)。
AWS EC2 上的虚拟机,也称为实例,有许多优点。一些优势包括高度可伸缩性(人们可以选择具有更多 RAM、CPU 等的实例),它们易于启动和停止(在免费层之外,客户为他们使用的东西付费),并且它们允许选择不同的平台(操作系统)。需要强调的重要一点是,虽然本教程涵盖了如何启动基于 Windows 的虚拟机,但有许多不同类型的虚拟机用于许多不同的目的。
就这样,让我们开始吧。如果你迷路了,我推荐看一下附带的视频。
创建一个 AWS 帐户并登录 AWS。
1.在亚马逊网站上(这是链接,点击“登录控制台”。如果您有帐户,请登录。如果你没有,你将需要做一个。
2.在 EC2 仪表板上,单击 EC2。
创建实例
3.在 Amazon EC2 控制台上,单击 Launch Instance。
4.单击 Microsoft Windows Server 2016 Base 所在行中的“选择”按钮。请注意,这将创建一个基于 Windows 的实例,而不是典型的基于 Linux 的实例。这将影响您连接到实例的方式。如果你对启动 Linux 实例感兴趣,请看这篇教程。
5.确保选择 t2 micro(自由实例类型)。
然后点击“查看并启动”
6.点击启动。
7.选择“创建新的密钥对”。在下面的框(“密钥对名称”)中,填写密钥对名称。我将我的关键数据命名为 DataCampTutorial,但是您可以随意命名。点击“下载密钥对”。这将下载密钥。把它放在安全的地方。
接下来,单击“启动实例”
8.实例现在已经启动。回到亚马逊 EC2 控制台。我建议您单击红色矩形中的内容,因为它会将您带回控制台。
9.等到看到“实例状态”正在运行时,再继续下一步。这可能需要几分钟时间。
连接到您的实例
10.点击连接。如果您选择一个 linux 实例,您可以使用 SSH 连接到一个 Linux 实例。
11.点击“下载远程桌面文件”。将远程桌面文件(rdp)保存在安全的地方。
12.点击“获取密码”。请记住,在启动实例后,您必须等待至少 4 分钟才能尝试检索您的密码。
13.选择从步骤 7 下载的 pem 文件,然后单击“解密密码”。
14.解密密码后,将其保存在安全的地方。您将需要它来登录您的实例。
15.打开您的 rdp 文件。点击继续。如果您的本地电脑是 Mac,您需要从 App Store 下载“Microsoft Remote Desktop”才能打开您的 rdp 文件。
16.输入您在步骤 14 中获得的密码
输入密码后,您应该会看到这样的屏幕
下载 Firefox
为了能够安装 R、 Python 和/或 Git,拥有一个浏览器真的很有帮助。该实例预装了启用了增强安全配置的 Internet Explorer,这可能很难使用。下载 FireFox 作为替代浏览器,以避免 Internet Explorer 增强的安全性。
- 当您看到下面的弹出窗口时,单击“添加”。
再次点击“添加”。
3.当你进入 FireFox 页面时,你可能需要点击几次 add(类似于步骤 1 和 2 ),直到 FireFox 下载开始。如果下载没有自动开始,那么点击“点击这里”。
现在已经安装了 FireFox,请确保使用 FireFox 作为您的浏览器。这将比从 Internet Explorer 中持续处理安全问题要简单得多。
安装 R、Python 和 Git
现在已经安装了 FireFox,您可以像在普通的 windows 机器上一样安装 R 和 Python 了。如果您需要帮助安装,这里有一些链接到下面的指南。
停止或终止实例(重要)
在使用完一个实例后,最好是停止或者终止该实例。为此,请转到 Amazon EC2 控制台,单击“Actions ”,然后单击“Instance State ”,您将可以选择停止或终止实例。
如果您计划再次使用该实例,请停止该实例。如果您不打算再次使用该实例,请终止该实例。
虽然本教程中的实例在“自由层”中,但我建议终止该实例,这样你就不会忘记它。
Please Terminate your Instance
结论
本教程提供了启动和连接 EC2 实例的快速指南,以及如何着手建立一个基本的数据科学环境。如果您想继续 EC2 学习,我建议您查看教程“使用云中的 Jupyter 笔记本进行深度学习”,其中介绍了如何为深度学习应用程序设置基于 linux 的 EC2 GPU 实例。如果您对本教程有任何问题或想法,请在下面的评论中或通过 Twitter 联系我们。
原载于www.datacamp.com。
AWS SageMaker:人工智能的下一个游戏规则改变者
今天 AWS SageMaker 发布,是牛逼。我在以前的文章中提到过,我们主要为客户进行 AWS 部署。较小的模型适合数字海洋水滴,但是 CNN 和 word 嵌入模型确实需要 GPU 和大量 RAM。这将是另一篇技术文章,向您展示为什么今天的发布是一件大事。
让我们快速进入闪亮的新 SageMaker 服务,感受一下它能做什么。这是冰山一角。
逐步运行笔记本电脑:
首先登录您的 AWS 控制台:
接下来,跳到 SageMaker 快速启动页面来创建一个笔记本实例:
让我们在 ml.t2.medium 实例上运行笔记本本身。在 IAM 角色下,使用向导创建可以访问您的数据的角色。当然,定义一个加密密钥。
一旦你的笔记本创建完成,只需点击打开动作,熟悉的 jupyter 笔记本环境就出现了。
以下是您应该看到的内容:
要在大脑中验证系统是否安全,只需在一个匿名窗口中尝试访问笔记本的 URL,您将会看到该会话未通过身份验证。没错。可以继续了。
在 sample-notebooks 文件夹中有很多例子。确保您有一个 S3 存储桶来连接到上面定义的 IAM 角色可以访问的这些笔记本。我们的桶名是“lemaysolutions-demo”,因此在笔记本“notebooks/sample-notebooks/sage maker-python-SDK/1P _ k means _ high level/k means _ mnist . ipynb”中将桶引用更改为您的 S3 桶的正确名称。该模型旨在从 Yann LeCun 著名的 MNIST 数据集中识别手写数字。
Make sure the text where the red circle is has the name of your S3 bucket.
好的。因此,运行前几个单元格,您应该会看到如下结果:
数据存储在您的 S3 存储桶中,如下所示:
请注意,培训实例是在代码中按需提供的(疯狂!)并且是 ml.c4.8xlarge 实例。它会运行一段时间,所以请耐心等待。
Provisioning jobs from code on demand. I think the mind blowing I just had got brain all over my keyboard.
文档显示培训工作需要“7 到 11 分钟”,而实际上手机上的计时器显示该工作需要 6 分 32 秒!
Don’t worry if you see lots of red. These are just INFO messages, not crashes.
为训练好的模型设置主机也通过编程完成。文档显示还有 7 到 11 分钟的设置时间,结果更像是 12 分 39 秒。这里有个提示。如果笔记本的图标上有圆点,说明它正在运行。
The three grey dots in the red circle I added to the picture indicate something is running in the notebook. The star in the red square tells you that this is the cell that’s running.
这是数据集上模型的输出。在非常基本的意义上,这 10 个聚类表示 K-means 分类器根据它们的相似性将这些数字分组为 10 堆的结果。通过观察形状,你可以直观地看出这个系统不费吹灰之力就做得不错。
The results of the model are quite nice. We see the same digits being confounded in the embedding demo of TensorFlow’s TensorBoard.
在一天结束时,您应该已经创建了一个 S3 存储桶、一个笔记本实例、一个作业和一个经过训练的模型。
总之,AWS SageMaker 非常棒。这将彻底改变我们的咨询方式。我们都致力于快节奏的开发并尽早展现价值,SageMaker 帮助我们在第一天就做到这一点。亚马逊甚至没有付钱让我说出来😜。
如果你喜欢全新的 AWS SageMaker 上的这篇文章,可以看看我过去阅读量最大的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”除了与商业相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习
编码快乐!
-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
Azure Data Studio:初步想法和演练
在微软 Ignite 上,Azure Data Studio 已经全面上市。Azure Data Studio 以前被称为 SQL Operations Studio,是一个跨平台的数据库工具,可以用来管理本地和云数据源。
当我第一次安装并运行 Azure Data Studio 时,我对它的最初印象是它几乎是一个 Visual Studio 数据代码。它带有智能感知、代码片段、源代码控制集成和一个集成终端。
Azure Data Studio 中支持 Git,但是您需要安装 2.0.0 版或更高版本才能使用它。
与 Visual Studio 代码非常相似,您可以同时运行多个集成的终端,而不是在每次想要执行一些命令行工作时切换出编辑器:
All the terminals!
Windows 10 中的终端默认使用 Powershell,而 Linux 和 macOS 使用$SHELL。点击可以了解更多关于终端的配置。
还支持扩展。Azure Data Studio 中的扩展允许我们向基础安装添加更多功能,就像 Visual Studio 代码一样。你也可以开发自己的扩展,这非常棒!
让我们通过一个简单的教程来连接和查询 Azure SQL 数据库。我将假设您知道如何在 Azure 中创建数据库。如果没有,可以按照这个教程来入门。
打开 Azure Studio 开始使用。如果这是你第一次运行 Azure Data Studio,你会自动看到一个连接页面打开。如果没有,您可以通过单击服务器侧边栏中的图标来添加新连接(见下文):
Azure Data Studio 支持 SQL 登录和 Windows 身份验证。我使用过 SQL 登录,所以我需要提供我的服务器名、用户名和密码。
(注意:确保您在 Azure 中为您的服务器启用了 防火墙规则 。如果你不这样做,你可以在 Azure Data Studio 中通过一个简单的 UI 向导来完成。相当酷!)
登录后,让我们创建一个数据库和一个要使用的表。右键单击您的服务器并选择新查询。在查询编辑器中,运行以下 SQL 代码:
IF NOT EXISTS (
SELECT name
FROM sys.databases
WHERE name = N'PersonDB'
)CREATE DATABASE [PersonDB]
GOALTER DATABASE [PersonDB] SET QUERY_STORE=ON
GO
一旦我们的数据库被创建,我们想改变我们的数据库到 PersonBD。我们可以使用下拉菜单来完成此操作:
然后,我们可以通过运行以下代码来创建人员表:
IF OBJECT_ID('dbo.People', 'U') IS NOT NULL
DROP TABLE dbo.People
GOCREATE TABLE dbo.People
(
PeopleId INT NOT NULL PRIMARY KEY,
Name [NVARCHAR](50) NOT NULL,
Age INT NOT NULL,
Email [NVARCHAR](50) NOT NULL
);
GO
我们可以在服务器侧栏中看到我们的新表:
现在让我们在新表中插入一些行:
INSERT INTO dbo.People
([PeopleID], [Name], [Age], [Email])
VALUES
(1, N'Will', 27, N'will@example.com'),
(2, N'Isaac', 7, N'isaac@example.com'),
(3, N'Sam', 4, N'sam@example.com'),
(4, N'Jan', 33, N'jan@example.com'),
(5, N'Jane', 57, N'jane@example.com')
GO
最后,我们可以查询它以查看其内容:
SELECT * FROM dbo.People;
我们应该会看到以下结果:
既然我们已经创建了表并在其中插入了一些数据,现在让我们通过创建一个 insight 小部件来管理我们的数据库,它为我们提供了表在数据库中使用了多少空间的视图。
与 Visual Studio 代码非常相似,我们可以使用命令面板快速查找内容。要打开它,按下 Ctrl+Shift+P. 打开后,输入设置,选择首选项:打开用户设置。
我们将看到一个 JSON 文件和一个搜索输入框一起打开。在这里,键入 dashboard 并找到dashboard . database . widgets设置:
在默认用户设置中找到该设置后,您需要点击铅笔图标并选择复制到设置。如果设置中显示替换,请不要点击它!
当您将设置复制到您的用户设置文件中时,您想要添加以下 JSON:
{
"name": "Space Used by Tables",
"gridItemConfig": {
"sizex": 2,
"sizey": 1
},
"widget": {
"table-space-db-insight": null
}
},
右键单击您的 PeopleDB 并单击管理,保存您的设置并打开您的数据库仪表板。您应该会在控制面板中看到以下小部件:
现在,您可以通过使用过滤等方式,使用该洞察力图表来获得不同的洞察力。
一旦你使用完你的资源,你可以自由地回到 Azure 并清理掉你不再需要的资源。
正如你所看到的,Azure Data Studio 是一个非常棒的工具,可以让数据工程师管理本地和云数据源。就我个人而言,我迫不及待地想看到这个产品如何随着社区的投入而发展。
如果你想查看源代码,这里有 GitHub repo。同样,你也可以在这里看到发布说明。