多样性抽样备忘单
当您构建受监督的机器学习模型时,您希望确保它尽可能覆盖一组不同的数据和真实世界的人口统计数据。确保你的模型有多样化的训练数据的方法是一种叫做多样化抽样的主动学习。
备忘单中涵盖的四种多样性采样类型是:
- **基于模型的异常值:**对逻辑和隐藏层中的低激活进行采样,以找到由于缺乏信息而使模型混乱的项目
- **基于聚类的采样:**使用无监督的机器学习从数据的特征空间中所有有意义的趋势中采样数据
- **代表性采样:**相对于当前训练数据,最能代表模型目标领域的采样项目
- **现实世界的多样性:**当试图支持现实世界的多样性时,使用增加公平性的采样策略
本文分享了实现分集采样的四种常用方法的备忘单。下次当您需要决定如何为一个需要支持不同用例的模型创建训练数据时,请使用它作为参考!
Voice technologies supporting different variants of a language
在之前的一篇文章中,我分享了一份不确定性采样的备忘单。不确定性抽样是看你的模型在哪里混淆了。在机器学习的知识象限中,不确定性采样是您的“已知未知”。也就是说,您知道您的模型由于低置信度预测而变得混乱。多样性抽样是你的“未知的未知”,你的模型知识中的差距不是那么明显:
不用说,很难发现你不知道的东西,所以分集采样的算法比不确定性采样的算法更具探索性和多样性。这变得更加困难,因为你的模型需要知道的往往是一个不断变化的世界中的移动目标。正如人类每天都在学习新单词、新对象和新行为以应对不断变化的环境一样,大多数机器学习算法也部署在不断变化的环境中。
一个需要多样性采样的例子
想象一下,你的工作是建立一个语音助手,它可以为尽可能多的用户带来成功。你公司的领导希望你的机器学习算法比任何一个人都拥有更广泛的知识:一个典型的英语使用者从英语的 20 万个单词中知道大约 4 万个单词,这只占语言的 20%,但你的模型应该有接近 100%的覆盖率。你有许多未标记的录音可以标记,但人们使用的一些词非常罕见。如果你随机抽样录音,那么你会错过这些罕见的单词。因此,您需要明确地尝试获取涵盖尽可能多的不同单词的训练数据。你可能还想知道当人们和他们的语音助手说话时最常用的词是什么,并从中抽取更多的例子。
你也担心人口的多样性。这些录音主要来自一种性别和居住在少数地方的人,这意味着产生的机器学习模型可能对该性别更准确,而且只对某些口音更准确。因此,您希望尽可能公平地从不同的人口统计数据中进行采样,并使模型对所有人口统计数据都同样准确。
最后,有许多人不会说英语,他们想要一个语音助手,但你只有很少的非英语数据。所以,你可能不得不坦诚面对语言多样性的限制。
这显然是一个比简单地知道你的模型何时被混淆更困难的问题,这就是为什么多样性抽样的解决方案本身比不确定性抽样的解决方案在算法上更多样化。这也是为什么我可以将不确定性采样的实际代码和方程压缩在一页的备忘单中,但这对于多样性采样是不可能的。
下载代码和备忘单:
您可以在此下载 diversity_sampling.py 文件中的代码:
[## rmunro/pytorch_active_learning
用于将新闻标题分类为与灾难相关或无关的人在回路机器学习系统的代码…
github.com](https://github.com/rmunro/pytorch_active_learning)
该代码包含使用 PyTorch 的所有算法的实现,以及对灾难响应相关文本进行分类的用例。这是我最喜欢的一个用例,因为我从事灾难响应的时间几乎和我从事机器学习的时间一样长。
您可以在此下载 PDF 版本的备忘单:
http://www . Robert Munro . com/Diversity _ Sampling _ cheat sheet . pdf
另见最近的这篇伟大文章:神经网络知道它不知道的时候吗?蒂瓦达·卡丹
这份备忘单摘自我的书《人在回路中的机器学习:
https://www . manning . com/books/human-in-the-loop-machine-learning
有关每种方法的更多细节以及比图像和文档级标记更复杂的问题,如预测文本序列和图像的语义分割,请参见该书。多样性的原理是一样的,但是多样性的计算会有所不同。
我的书的章节已经出版了——多样性抽样章节已经出版了,下一个将是高级主动学习章节。我会一边走一边分享摘录!
罗伯特·芒罗
2019 年 9 月
端到端食谱烹饪分类
AWS Lambda 函数,BeautifulSoup,Python,Sci-Kit Learn
Preparing Breakfast photo credit: Mark Weins @ https://migrationology.com/pakistan-travel-guide/
谁应该读这篇文章?
如果您有兴趣从零开始了解机器学习系统的高级概述,包括:
—数据收集(网络搜集)
—处理和清理数据
—建模、培训和测试
—部署为云服务
—重新运行系统、获取任何新配方以及重新训练模型的计划
介绍
因为好奇,成长和学习的愿望——我决定从头开始构建一个 ML 系统,涵盖从数据收集和清理、建模、培训和测试,以及作为云服务部署的所有内容。也就是现实生活中适用的东西。
我已经找到了关于各部分的有用文章,但是将信息拼凑在一起,从导师和同事那里获得进一步的指导,以及阅读文档来填补知识空白,这些都需要时间。我决定记录我的过程,希望它能帮助其他人在谷歌上搜索“如何做”我的文章可以解决的事情。
本文不是我所使用的工具的教程,而是描述我如何构建这个系统,以及我在这个过程中所做的决定,用最低的成本和最简单的方法来完成工作。
概观
整个项目分为两部分:
- AWS 管道
- 建模工作和结果
所有的代码都托管在我的 GitHub repo 这里。
即将发布的第三部分将介绍如何使用 AWS API 向序列化模型提交输入数据并发回响应(预测)。
为什么食谱美食分类?
Mark Weins @ https://migrationology.com/pakistan-travel-guide/
为什么我选择建立一个美食分类器?我喜欢食物。从小到大,我既品尝过巴基斯坦北部的美食,也品尝过我生活过的美国城市的美食。我一直喜欢尝试来自美国以外的其他国家的朋友和同事的其他美食,当我去旅行时,我已经接触到了。随着时间的推移,全球美食是如何起源和发展的。我注意到成分和方法的区别和重叠,以及它是如何基于人口迁移和殖民主义而融合的。今天,所有类型的食物都有信息,人们几乎可以尝试任何一种食物,而不必去旅行。
Spices on Plate With Knife — Creative Commons Images https://www.pexels.com/
这方面的商业应用可用于节省人类在标记错误分类的食谱、为数据库或档案分类新食谱方面的审核时间。
使用 AWS Lambda 函数实现无服务器
AWS Lambda 函数等无服务器架构流行的原因之一是不需要在云端管理服务器。用亚马逊的话说:
AWS Lambda 是一个无服务器计算服务,它运行您的代码来响应事件,并自动为您管理底层计算资源。AWS Lambda 可以自动运行代码来响应多个事件 …
我使用的组件是写入和检索数据的 S3 桶、分发 web 抓取的简单服务队列(SQS)和处理模型端点的 API 网关。
注意:对于权限,我将我的 lambda 函数设置为对我使用的 S3 桶和 SQS 有完全访问权。出于安全原因,可以也应该设置一个精确的权限类型列表,以避免事故,尤其是在有更多移动部件的设置中。
配方数据收集
我的目标是对几个菜系进行分类,并且来自一个有大量食谱的网站。我最终选择了allrecipes.com,因为它很受欢迎,而且在食谱公布前会有一个审核检查来确认其有效性。如果没有提及,可能会有偏见问题,如菜肴中主菜类型的分布,以及拼写错误、不真实或放错地方的菜肴配方等问题。业务问题是,it 需要预测的数据是什么样的?训练数据是否反映了这一点?我想简单地开始——我能用我能得到的做什么。
allrecipes.com world cuisine page
每个美食网址滚动时动态生成单独的食谱链接,这些链接是我需要刮。我想把我选择的 6 个菜系的抓取任务分配到单独的 lambda 调用中,并且在 900 秒的限制内。为了实现这一点,我使用了 lambda 函数, queue_cuisine_URLs.py 将 6 个美食 URL 发送到一个简单的服务队列(SQS), cuisine_URLs ,这触发了 lambda 函数, scrape_html_links.py *。*它首先通过获取 S3 桶 *recipe-url-page-numbers、*中的任何对象来检查是否已经抓取了某个菜系,否则从第 1 页开始抓取食谱 url,并将它们放入 recipe-scraped-data S3 桶中。
AWS Architecture Flowchart
然后[parse_direct_URLs.py](https://github.com/kulsoom-abdullah/kulsoom-abdullah.github.io/blob/master/AWS-lambda-implementation/src/parse_direct_URLs.py)
Lambda 函数从配方抓取数据 S3 桶中抓取配方文本,并将它们放入配方-全部接收数据 S3 桶中。我从每个配方中解析的字段是:
- 身份证明(identification)
- 标题
- 描述
- 等级
- 复习
- 佐料
我决定的配方文本解析规则和模型管道(在第 2 节中描述)受 Sagemaker 支持,并且不需要创建容器来使用我的代码。我用 Python 代码创建了一个 Sagemaker notebook 实例来解析菜谱、向量化和训练模型。模型管线被酸洗(序列化)并保存到 S3 桶中。
当事件触发按其常规时间表(每周)发生时,整个流程重新开始,获取任何新的配方,并重新训练模型。数据的规模非常小,模型足够简单,因此我不需要担心训练数据的存储问题、对整个训练数据的子集进行采样,或者对数据进行训练所需的时间。
进行中——使用 S3 的静态网页为模型提供服务,接收用户输入的食谱,转到 AWS API,输入到模型中,并获得预测结果。这篇博文将会被编辑,第二部分将会发表。
建模工作
我想回答的一些问题是:
- 仅用配料就能正确地将菜谱从 6 种不同的菜系中分类吗?
- 我能对每一类做得多好,而不仅仅是所有类的平均准确度?
- 是否有必要收集更多的训练数据,或者我是否可以使用其他方法来解决这个问题?
二元情况
为了开始并找出是否值得推进这个项目,我从二进制案例开始。
意大利和印度——截然不同的两极?
第一次尝试将使用印度和意大利食谱,提出预处理成分列表的规则,并尝试一个简单的 BagofWords 分类模型。我从意大利菜和印度菜开始,因为它们似乎是一个简单问题的对比菜系,而且这些菜系的食谱数量是最多的。
解析文本规则
—重量和度量
我认为,重量和度量是那种不会给模型增加价值的词(除非我将数量作为一个特征,而不仅仅是成分词)。以下是成分列表的一个示例:
- 1 汤匙植物油
- 1/4 杯白糖
- 1/4 茶匙盐
- 两杯万能面粉
- 2/3 杯水
结果,这留下了这些成分名称:,植物油,白糖,盐,面粉,和水,因此过滤。
—数据泄漏
在检查这些成分时,我发现了可能会泄露数据的单词,并将它们添加到我的过滤列表中:“意大利风格”、“法国风格”、“泰国风格”、“中国风格”、“墨西哥风格”、“西班牙风格”、“印度风格”、“意大利风格”
—词汇化
另外,我只做了词条整理,没有选择词干。这是为了让我更容易理解成分的重要性,如果我认不出这个词,就不必回头去查这个没有成分的词。例如,“1 片朝鲜蓟”,我想要的是朝鲜蓟,而不是带茎的结果 朝鲜蓟。这样做并没有增加不同单词的数量。
—其余的
那还剩下很多其他的词。有先进的 NLP 技术来识别单词的实体,这将计算单词是成分的概率,而其余的是成分单词周围的度量、纹理、动作和其他类型的单词。简单地打印出最常用的单词,并目测哪些单词没有用添加到过滤规则中,结果很好,并且只有相对较少的一组独特的单词需要向量化,我采用了这种方法。另一个原因是这样做也节省了很多时间。
这些最终的成分名称使用 scikit-learn 中的计数矢量器库转换成来自训练集的单词矩阵。
类别计数
Count of Indian and Italian cuisines
意大利食谱比印度食谱多 3 倍多(2520 比 787)。一个 ML 模型学习什么是印度的数据够吗?ML 会比 76%更好吗(一个虚拟分类器,每个食谱都被归类为意大利菜)
多项式朴素贝叶斯
使用简单快速的多项朴素贝叶斯方法在训练集和测试集上得到了两种菜系几乎“完美”的 f1 加权分数。三重分层交叉验证的得分是一致的:
- 平均训练分数:0.986
- 平均测试分数:0.984
因为训练和测试分数几乎相等,所以过度拟合不是问题。因为训练分数不是完美的 1,所以我们训练不足。为了减少欠拟合从而增加训练分数,选项是增加模型复杂度或使用更复杂的模型。未来的工作可以集中在使用更复杂的模型,如随机森林。我在这里停下来,因为我对这个分数很满意,并继续进行多类案例。
多类案件
作品在这个 Jupyter 笔记本里。这 6 个班级是中国人、法国人、印度人、意大利人、墨西哥人和泰国人。最终结果在下面的汇总表中。
相关著作
我发现的一些基于成分文本分析的食谱烹饪分类的相关工作与我的工作有相似的发现。他们都没有一个平衡的类数据集。这个团队由于其庞大的训练集,在逻辑回归方面取得了最好的结果。他们发现,对实例规模较小的类进行上采样不会产生更好的结果。这个团队使用随机森林,在训练集上比回归有更好的训练分数,但由于测试结果更差而过度拟合。他们对 39,774 个食谱的准确率为 77.87%。两个团队都不报告每种菜系的单项得分,而是报告所有菜系的总体准确度。
初步分析
我发现使用二元模型给了整体分数一些提升,使用计数矢量器相对于 TFIDF 有更好的结果。基于相关的工作成果和我对某些菜系的专业知识,这是意料之中的。(第 4 页,共页)本文解释了为什么 tf idf 在食谱分类问题上比计数矢量器差。)由于这些结果,我修改了我的parse_recipes
函数,将有用的两个单词成分考虑到文档字符串中,并使用 BagofWords。
随机森林过拟合数据,由于数据的增加,逻辑回归比多项式朴素贝叶斯具有更好的结果。我还通过实现每个模型并查看混淆矩阵来检查 F1 分数。结果如下,选择的型号和代码留在 Jupyter 笔记本中。
Initial results
最佳模型性能是具有计数矢量化的逻辑回归,其平均测试分数为 0.870,训练分数为 0.997。我开始更详细地分析这个模型。
逻辑回归
随着数据量的增长,逻辑回归比朴素贝叶斯表现更好。对于配方数据集也是如此。查看每个菜系的个人得分,有过度拟合的情况,不清楚阶级不平衡是否是一个问题。例如,总共有 75 种墨西哥食谱的 F1 得分 = 为 0.73,而有 387 种法国食谱的 F1 得分为 0 。 63 。
Logistic Regression train/test confusion matrix heat maps
一些观察结果:
- 法语通常被误认为是意大利语
- 墨西哥人最容易被误认为意大利人
- 泰语被误归类为汉语,然后是印度语。
- 墨西哥作为意大利有点出乎意料,但我可以看到为什么一些印刷案件。
—一个墨西哥食谱和意大利食谱一样的例子:
梅子牛至鱼汤香蕉大蒜番茄肉汤黄油梅子番茄洋葱橄榄油黑胡椒马槟榔橄榄海湾盐油胡椒白鱼腌绿橄榄肉桂
训练集的分数高于测试,我试图处理这种过度拟合和可能的类不平衡贡献。
损失函数中的类权重
[class_weight='balanced'](https://chrisalbon.com/machine_learning/logistic_regression/handling_imbalanced_classes_in_logistic_regression/)
参数将与它们在 sci-kit learn 逻辑回归类中的频率成反比地对类进行加权。这给出了更高的 F1 平均训练分数 0.997 和测试分数 0.892。在没有班级加权损失的情况下,个别班级的表现有所改善。
Logistic Regression (class weighted loss) train/test confusion matrix heat maps
过采样和欠采样
我使用了一个名为不平衡学习的 Python 包来实现过采样和欠采样,并找出这对美食的评分有多大帮助。
Logistic Regression (oversampling) train/test confusion matrix heat maps
Logistic Regression (undersampling) train/test confusion matrix heat maps
相比之下,过采样除了降低墨西哥分数和法国分数之外,并没有产生太大的影响。F1 训练的总得分为 1.0,测试得分为 0.89。欠采样表现最差,训练 F1 得分为 0.77,测试 F1 得分为 0.75
卡方检验 (χ)
最后,对成分特征使用χ检验并选择前 K 个显著特征是处理训练集过拟合的另一种方法。训练 F1 得分为 0.934,测试 F1 得分为 0.866。与类加权损失函数逻辑回归等其他模型相比,训练分数略有下降,测试分数没有提高。
Logistic Regression (χ² 600 best) train/test confusion matrix heat maps
以下是根据类别频率按 chi2 排序的前 10 个成分词:
- 鱼:1897.8449503573233
[(‘泰国’,48),(‘中国’,8),(‘印度’,6),(‘法国’,5),(‘意大利’,4),(‘墨西哥’,1)] - 孜然:1575.1841574113994
[(‘印度’,275),(‘意大利’,16),(‘墨西哥’,9),(‘泰国’,6),(‘中国’,1),(‘法国’,1)] - 外壳:138.64852859006
[(‘墨西哥’,12),(‘印度’,3)] - 马萨拉:146 页,146 页,147 页,147 页,147 页,148 页,148 页,146 页,147 页,146 页,146 页,146 页,146 页,146 页,146 页,147 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,147 页,146 页,146 页,146 页,16 页,16 页
- 奶酪:1155.8931811338373
[(‘意大利人’,1074)、(‘法国人’,85)、(‘印度人’,22)、(‘墨西哥人’,9)、(‘泰国人’,3)、(‘中国人’,2)] - 鱼酱:1119.2711018711018
[(‘泰国’,45),(‘法国’,2),(‘中国’,2)] - 姜黄:999.0619453767151
[(‘印度’,225),(‘泰国’,8),(‘意大利’,1)] - 花生:994.6422201344235
[(‘泰国’,42),(‘中国’,26),(‘印度’,24),(‘意大利’,3)] - lime: 991.2019982362463
[(‘泰国’,43),(‘印度’,33),(‘墨西哥’,17),(‘意大利’,8),(‘法国’,4),(‘中国’,3)] - 芝麻:958.9888557397035
[(‘中国人’,77)、(‘印度人’,8)、(‘意大利人’,7)、(‘泰国人’,7)、(‘法国人’,1)]
得分最高和最频繁出现在法语中的成分直到#66:
格鲁耶尔:291.2451127819549
[(‘法语’,17),(‘意大利语’,2)]
深度学习
出于好玩和好奇,我还用 Keras 实现了两个深度学习架构。密集连接的 2 层网络具有 0.996 的训练 F1 分数,并且通过 tad 以上类加权逻辑回归得到的最佳测试 F1 分数为 0.8995。
在第二个架构中,我使用了具有嵌入和 Conv1D 的多通道 2-gram,得到的训练 F1 分数为 0.945,测试 F1 分数为 0.8699。我想尝试使用二元模型来看看简单的深度学习架构会有多大的不同。我在这里找到了一个实现,我将其用作指南。我认为 RNN 不会像 word2vec 那样做太多,因为配料的顺序与菜肴无关。
Final Results
实验:更多的数据会有助于过度拟合、分数不高的类和类不平衡吗?
【编辑于 2019 年 6 月 1 日】
我总共收集了 4177 个数据点——按类别细分:中国人= 260,法国人= 387,印度人= 787,意大利人= 2520,墨西哥人= 75,泰国人= 148。这让我尝试一个实验来测试获取更多的数据来平衡这些类是否会有所改进。如果获取更多数据非常耗时或昂贵,这可能是一个重要的量化指标。根据我得到的结果,还不清楚班级的不平衡是否导致了低的考试分数。
我画出了每种菜肴的测试和训练分数。测试数据是固定的。培训班级的规模从 25 人开始,并以 25 人为增量继续。如果大小小于类计数,则向下采样以将它们设置为相等。这种情况一直持续到人数超过班级人数。
垂直彩色线标记 x 轴上的最大类计数。印度和中国在 1000+左右的训练规模时达到顶峰,而在这个分数以下则持平。墨西哥的峰值更早,接近 500,持平略低。印度,意大利和法国在 1400 左右,然后逐渐减少,以接近相同的分数。泰国在 1300 点,然后也平线收盘。我可以通过绘制更多的网格线并获得最大 f1 分数出现的确切 x 值来进行深入研究,但总体趋势表明,收集更多的数据将会有所帮助。本笔记中所有其他尝试的结果表明,收集更多数据是提高训练分数的最后选择。
结果摘要
结论摘要
- 中国人、法国人和印度人的班级加权得分最高
- 意大利语用 Conv1D 和 multigram 嵌入 DL 做得最好,其次是类加权逻辑回归。
- 墨西哥在过采样方面做得最好,其次是类别加权逻辑回归。
我为 AWS 部署选择的模型是逻辑回归中的类加权损失函数,这是最简单也是最好的。商业决策可以基于你想要的分类器有多完美,基于它训练和执行的速度,你有多少数据,以及它在生产中需要如何工作。
除了收集更多数据之外,其他想法是将成分的数量作为特征权重的一部分。
关于动画条形图你需要知道的一切
用 R 语言生成动画条形图的分步指南
一个动画条形图基本上是一个迷人的动画趋势图,棒线根据等级上升到顶端。制作一个动画条形图通常涉及 3 个变量,其中之一通常是时间变量。剩下的两个变量是
- 代表国家名称、公司名称等类别的变量
- 代表每个类别的相应值的变量。
下面是一些动画条形图的例子*(图片来自谷歌,给所有者的信用)😗
你希望在这篇文章中找到什么?
在这篇文章中,我将提出两个要点:
- 为什么动画条形图如此受欢迎和重要?(简短地)
- 如何在 R 中创建动画条形图?(本文主要关注点)
- 如何将 excel 文件导入 R
- 使用“ggplot2”包可视化静态图
- 用“gganimate”包创建动画
当然,你可以在网上找到很多关于如何创建动画条形图的不同来源。有各种各样的工具可以用来创建这样一个柱状图,比如 Tableau、Power BI、Visme、fluore 等等。然而,更多的时候,这些工具并不是免费的。因此,我想介绍如何在 R 中做到这一点,这是一个免费的统计软件,每个人都可以使用。
在 R 中创建一个动画柱状图并不是什么新鲜事。你肯定可以在网上找到很多关于如何在 r 中做到这一点的资源。然而, 就像我的许多其他文章一样,我想给你们一个简单而详细的分步指南(带有一些解释和数据在每个步骤中的样子的截图,这样每个人都可以很容易地跟随,即使没有实际下载数据并亲自尝试) 。
如果这听起来像是你喜欢的,那我们就开始吧!!
为什么动画条形图如此受欢迎?
我们都喜欢用数据讲故事。然而,制作一个既能讲述一个故事又能在视觉上吸引大量观众的图表并不总是容易的。既然我们想提供大量的信息,但同时又不想用一个图表/图轰炸观众太多的信息,那么为什么不创建一个动画可视化,将所有的图结合在一起呢?
动画条形图帮助我们可视化趋势随时间的变化,这种类型的图表非常受欢迎,尤其是在社交媒体上,因为它们在简洁易懂的图表中提供了整体数据故事/见解。
如何在 R 中创建动画条形图?
下载数据并导入到 R
在这篇文章中,我将查看 2002 年至 2018 年在澳大利亚大学注册的国际学生的国籍,并查看这些年来,排名前 10 位的国籍是什么。数据集在这里可用。点击“获取数据”,然后就完成了。
原始数据集如下所示:
“月”列包含两个类别:8 月和 12 月。由于 8 月摄入的数据仅在 2019 年可用,我决定使用 12 月摄入的数据,因为数据在 2002 年至 2018 年的 12 月可用。因此更容易创建动画条形图。注意,最后我们只需要 3 列,即年份、国籍和学生。这足以产生一个动画条形图。最终数据集将如下所示:
使用 Filter 函数,然后删除不相关的行和列,清理原始数据集以获得如上的最终数据集的过程简单明了。我不会详细讲述如何去做,因为这不是本文的重点。如果你有任何困难,请在评论区告诉我。你也可以先把原始数据导入 R,然后用‘tidy verse’包清理数据。但是,既然我们大多数人都是在 Excel 中打开下载的文件,为什么不干脆一直清理那里的数据呢:)?
现在,让我们假设我们已经获得了只有 3 列的最终数据集。我会把它命名为“Dec Intake.xlsx”。
现在让我们将这些数据导入到 R ,中,只需使用 read_excel()函数
library(readxl) # remember to install before loading this package dec_intake = read_excel('Dec Intake.xlsx')
View(dec_intake)
由于我们希望以这样的方式创建一个条形图,即每年只显示前 10 个国籍,我们需要用“tidyverse”包整理上面的数据集。
library(tidyverse)dec_intake_formatted = dec_intake %>%
group_by(Year)%>%
mutate(rank = rank(-Students),
Value_rel = Students/Students[rank==1],
Value_lbl = paste0(" ",Students)) %>%
group_by(Nationality) %>%
filter(rank <= 10)View(dec_intake_formatted)
让我解释一下代码:
- group_by(Year) :首先,我按照年份对数据进行分组
- mutate() :创建新列
- rank = rank(-Students) :创建“rank”列,对该年的学生人数进行排名。“学生”旁边的“-”号表示最大的人数将排在 1 号,第二大的人数排在 2 号,依此类推。
- Value_rel = Students/Students[rank = = 1]:创建“Value _ rel”列,其中国籍等级编号 1 的值为 1.0,以下国家的值小于 1.0
- Value_lbl = paste0(",Students) :创建“Value_lbl”列,用于标记每个等级中的学生人数。该列在后面很有用,因为它将在动画条形图中为我们提供标签。
- filter() :每年只选择前 10 个国家
我们现在有一个干净的数据集准备绘图。让我们进入下一步。
在绘图中创建动画
library(ggplot2) # to create static plot
library(gganimate) # to add animation to static plot
让我们创建一个名为’ anim '的新变量。以下是本部分的完整代码:
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA) +
**geom_text**(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) + #determine size of the Nationlity label
**geom_text**(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) + #determine size of the value label
**coord_flip**(clip = "off", expand = TRUE) +
**scale_x_reverse**() +
**theme_minimal**() +
**theme**(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm")) +
**transition_states**(Year, transition_length = 4, state_length = 1) +
**ease_aes**('sine-in-out') +
**labs**(title = 'Number of International Students Enrolled in Australia per Year by Nationality: {closest_state}',
caption = "Data Source: [https://internationaleducation.gov.au/Pages/default.aspx](https://internationaleducation.gov.au/Pages/default.aspx)")
不要被上面的代码吓到!如果您熟悉 ggplot2 中的语法,它们实际上非常简单。如果你是新来的,也没关系,因为这篇文章是给初学者的。我现在将解释上面的每一行代码。
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA)
这里要创建柱状图,可以使用 geom_bar()。不过这里我要介绍一下 geom_tile(),就是在地块中创建瓦片。这在我们处理 3 个变量,即国家、学生和时间时特别有用。对于 geom_bar(),如果我们使用两个变量,通常会更有用。这里的是我觉得非常有用的帮助表。更多信息也可以参考一下。
aes(y = Students/2, ...)
现在,为什么是“学生/2”而不仅仅是“学生”,或者“学生/3”等等?让我们来测试一下:
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/2**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/3**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/4**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)
至此,你大概知道我为什么选择 Students/2 作为论点了。代码的下一部分将是:
**geom_text**(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) #determine size of the Nationlity label
+ **geom_text**(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) #determine size of the value label
这两行代码允许我们确定标签的大小,即国籍名称和学生人数。
**coord_flip**(clip = "off", expand = TRUE) +
**scale_x_reverse**() +
**theme_minimal**()
- 坐标翻转():翻转坐标以便更好的可视化
- scale_x_reverse() :让排名靠前的国家名称出现在顶部,并随着我们沿轴向下移动而减少。
- 这是一种定制我们剧情主题的方式。根据您的风格,您也可以使用各种其他主题。我选择了 theme_minimal(),因为我希望一切都简单。
**theme**(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm"))
这里是 ggplot2 包中主题的完整列表。来源解释了我在上面的块中使用的每一个元素。所以这真的取决于你希望你的动画条形图看起来像什么。对我来说,同样,我希望我的情节看起来简单,所以你可以看到我把大部分参数作为 **element_blank()。**这样你就可以随心所欲地定制自己的主题。
但是我想请你注意这一部分:
plot.margin = margin(1, 4, 1, 8, "cm")
第一个和第三个数字表示顶部和底部边缘。
第二和第四数字表示右和左余量。
没有固定的边距。一切都取决于你情节的尺度。换句话说,这是一个反复试验的过程。例如,如果国家的名称很长,您可能希望增加一点边距,以便它能适合框架。经过几次试验后,获得了上述裕度组合(1,4,1,8)。
酷!现在我们有了静态图。让我们创建过渡来制作动画图表。
anim <- ggplot(dec_intake_formatted, aes(rank, group = Nationality)) + geom_tile(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) + #determine size of the Nationlity label
geom_text(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) + #determine size of the value label
coord_flip(clip = "off", expand = TRUE) +
scale_x_reverse() +
theme_minimal() +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm")) +
**transition_states**(Year, **transition_length** = 4, **state_length** = 1) +
**ease_aes**('sine-in-out') +
**labs**(title = 'Number of International Students Enrolled in Australia per Year by Nationality: {closest_state}',
caption = "Data Source: [https://internationaleducation.gov.au/Pages/default.aspx](https://internationaleducation.gov.au/Pages/default.aspx)")
- 过渡 _ 长度:动画长度
- state_length :状态停顿的相对长度
- ease_aes() :表示在动画中应该如何缓和不同的美感
- labs() :这是你添加标题、说明、副标题的地方。
也可以使用:enter _ fade()+**exit _ fade()**使过渡更加平滑。有关参数的更多信息,您可以参考“gganimate”包指南 此处 。然而,在我看来,您不需要使用软件包中介绍的所有参数。就像我在这里介绍的一些论点就足够了。
创建 gif
使用 animate() 函数,
library(gifski)
library(png)animate(anim, nframes = 350,fps = 25, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))
- nframes 是帧数。数字越大,过渡越好。这和画漫画差不多。想象一下,如果你画了许多捕捉角色单个动作的页面,然后翻阅所有页面,动作会显得非常流畅。同样的概念也适用于此。但是,帧数越多,处理时间就越长。r 将花费更多的时间和消耗更多的能量。
- fps 是每秒花费在每一帧上的时间(默认为 10)
- 宽度、高度:动画的尺寸,以像素为单位
- Renderer: 设置将每一帧合成一个动画的函数(默认为 gifski_renderer())
完整的论据列表,你也可以在这里 参考指南 。
将所有东西放在一起,这就是最终的输出
就是这样!希望你们喜欢这篇文章,并从中有所收获。下次当你们在网上或任何地方遇到动画趋势柱状图时,我希望你们都能有信心用像 r 这样简单免费的工具生成这样的图表。
如果你有任何问题,请在下面的评论区写下来。让我知道你们用什么样的数据集来做这种图表。谢谢你的阅读。祝您愉快,编程愉快!!!
如果您有兴趣了解更多关于 R 的信息,请查看我在 R 、随机森林和预测中关于探索性数据分析的其他文章!
在 Excel 中生成新闻情感评分
具有单一功能
Null result for days which have no news articles on The Business Times
刮掉的新闻文章
Search result for USD on the 8th July, Sentiment Score: -0.1409
我收到了我的一个读者的请求,他在的算法交易中使用了对新闻文章的情绪分析,来创建一个通用工具,让你可以从网上搜集的新闻文章(《商业时报》)中获得情绪分数。我以前在 algo 交易中用它作为衡量标准,但我认为它对投资组合管理或金融风险方面的人也非常有用。
想法
这个想法是为了让非技术用户更容易在 Excel 上根据他们在不同的日子里感兴趣的各种术语得到简单的一对一的分数。我可以想象这将被用于投资组合的重新平衡,甚至作为媒体监控的自动化形式。我在之前的帖子中描述了网络抓取和情感评分。
设置的 9 个简单步骤
***仅限 Windows ***
1。 LinkedIn 消息我用你的电子邮件获取了项目文件夹
2。打开项目文件夹中的 perspective . py
Replace the highlighted path with your own aka C:/Users/bob/Desktop/sentiment/stock_lexicon.pickle
3.下载并安装 Anaconda (Python)
https://www.anaconda.com/distribution/#download-section
4。打开命令提示符,创建 conda 环境
conda create -n py36 python=3.6 && activate py36
5。进入情感项目目录并安装包
假设文件夹在您的桌面上
cd desktop/sentiment && pip install -r requirements.txt
6。在 Excel 中显示开发者标签
File > Options > Customize Ribbon
7。启用设置
File > Options > Trust Center > Trust Center Settings > Macro Settings > Trust access to the VBA project object model
8。打开 perspective . xlsm 并启用 xlwings
9。将 xlwings 指向您的 conda 环境并导入 python 函数
指定 Anaconda3 的安装路径
Conda Base: C:\Users\bob\Anaconda3
和…我们完了!
欢迎分享任何意见或想法!
如何分析训练一个聊天机器人的质量?
评估聊天机器人训练的一些重要指标。
目前,聊天机器人已经出现。我们可以说,大多数有网站的公司都有一些机器人,甚至在不知道的情况下(因为有特别训练有素和实施的机器人),大多数人已经与一个机器人互动过。
伴随着机器人,出现了无限的概念,例如:实体、意图、对话节点、工作空间、技能等等。还需要评估机器人提供的培训和服务表现。亲爱的读者,我们已经进入了…超级数据科学家。
举一个很肤浅的一笔,下面对齐一下:
- **AI 模型:**由一组意图和实体组成。
- 人工智能提供商:它是一个工具,使用人工智能模型对机器人用户发送的新消息进行分类(该引擎的例子是 Watson)。
如果“人工智能模型”是好的,“人工智能提供者”将在用户与聊天机器人的对话中按预期执行。同样,这就像评估老师教给学生的内容(人工智能模型),从而确保如果内容是正确的,学生(机器人)能够在日常生活中应用这些知识。
IBM 推荐的注意点之一是,在训练中不存在重复表达,无论是与意图相关还是与实体相关。在这篇文章中,我展示了如何评估这些重复的存在与否。
所以来吧,让我们开始吧…
1-意向
意图意味着用户期望机器人支持什么。
Example of intent used in bot training.
- 结构:
在机器人工作区有几个对象,其中之一是“意图”。**里面的‘意图’:[]**都是在 bot 训练中使用的意图。
每个意向都有 { ‘意向’和’实例’ } 对象。在 ‘intent’ 对象中是意图的名称,在 ‘examples’: [] 中是该意图的所有表达式示例,这些示例在’ examples '对象中报告:[ {‘text’: ‘’} ,…, {‘text’: ‘’} ]。
不应该重复的是 {‘text’: ‘’} 中的表达式。
Structure of intents in the workspace — Watson Assistant.
分析:
为了检查机器人是否被训练了重复的例子,我在 jupyter 笔记本上创建了一个脚本,可以在我的 github 上找到
- 导入所需的库,并使用沃森助手中的凭据创建对象;
- 用 bot 训练中使用的工作空间创建“original_workspace”对象;
- 对进行循环,遍历每个意图的例子,寻找重复;
2 个实体
实体意味着信息的补充,即用户希望执行的动作的参数。
Example of entities used in bot training.
- 结构:
在 bot 工作区中有几个对象,其中之一是“实体”。在**‘实体’:[]**对象内部是所有用于训练机器人的实体。
每个实体都有 { ‘实体’和’值’ } 。在对象**‘entity’中是实体的名称,在‘values’:[]**对象中是该实体的值和同义词。
值在’ values’: [{‘value’: ‘’}]内报告,同义词在’ values’: [{‘synonyms’: [‘’]}]内报告。
Structure of entities in the workspace — Watson Assistant.
分析:
继续我在 github 上提供的脚本。对于实体,建议实体名称、值和同义词之间不要有重复的表达式。
- 为创建一个循环,通过寻找重复项来遍历实体名称、值和同义词:
感谢阅读。
给我看看代码!
要使用我在 github 中分享的代码,您必须安装 python 和 jupyter notebook,或者使用 IBM 创建的允许您在云端执行分析的平台。为此,只需实例化您的数据科学体验版本。
步骤:
- 接近 DSX 号。
- 创建新项目。
- 在“资产”选项卡上,单击“创建笔记本”。
- 在 github 中访问我的代码。复制粘贴。
- 在笔记本中,根据您要分析的助手更改凭据。
搞定了。
如何闪电般下载文件
以及不同解析工具之间的详细比较
你可以有没有信息的数据,但你不能有没有数据的信息。— 丹尼尔·凯斯·莫兰
随着分析技能在最近几天受到高度重视,如何获得高质量的数据也很重要。如果没有更多或高质量的数据,伟大的分析总是无法进行。
有一天,
我的一个朋友问我。
“伟鸿,在点击下载音乐文件的链接之前,你知道媒体文件是否会立即下载吗?
如果链接指向另一个网站,并显示错误信息,该怎么办?我不想下载邮件,我只需要媒体文件。"
我说,“这是个好问题。让我想清楚,然后尽快回复你。”
过了一会儿,我说:“给你!”
def is_downloadable(url):
"""
Does the url contain a downloadable resource
"""
h = requests.head(url, allow_redirects=True)
header = h.headers
content_type = header.get('content-type')
if 'text' in content_type.lower():
return False
if 'html' in content_type.lower():
return False
return True
上述函数将用于检查 URL 是否包含可下载的源,其逻辑如下所示:
- 不是直接下载 URL 的内容并检查源的类型,而是检查 URL 的请求头。
- 检查标题的内容类型,如果它既不是文本也不是 Html,这意味着 URL 带有可以下载的源。
接下来,我在考虑加速代码。除了使用 BeautifulSoup 来解析 Html,有没有其他替代方法可以得到同样的结果,但比 BeautifulSoup 更快?
答案是肯定的,下面我将向你展示如何使用其他更快的 Html 解析器。在此之前,让我们比较一下从 Html 中提取数据的各种比较著名的工具。
- 美丽的声音
- Lxml
- html 解析器
- Selectolax
这是我们将要抓取的网站,我们将点击 M 来下载巴赫约翰的音乐。
美丽的声音
from bs4 import BeautifulSoup
import wget
soup = BeautifulSoup(r.text, 'lxml')css_path = 'tr > td:nth-child(2) > a:nth-child(3)'for node_link in soup.select(css_path):
url = node_link['href']
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
上面的代码片段是使用 BeautifulSoup 作为我们工具的代码。
如 BeautifulSoup 文档中所述,
漂亮的汤永远不会像它上面的解析器一样快。
因为它是建立在 LXML 之上的,所以我们将把它用作我们的解析器。如您所知,我们使用 CSS 来定位数据。
LXML
import lxml.html
import wgetdom = lxml.html.fromstring(r.text)
css_path = 'tr > td:nth-child(2) > a:nth-child(3)'for node_link in dom.cssselect(css_path):
url = node_link.get('href') # OR node_link.attrib['href'] # check whether the url is downloadable
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
上面的代码说明了如何使用 LXML 解析器访问 HTML。正如您所观察到的,语法看起来非常类似于 BeautifulSoup。此外,Lxml 不仅支持 CSS,还支持 Xpath,因此如果您更熟悉使用 Xpath,那么 LXML 将是您更好的选择,而不是 BeautifulSoup。
html 解析器
from html.parser import HTMLParser
import wgetclass MyHTMLParser(HTMLParser):
links = []
def handle_starttag(self, tag, attrs):
if tag != 'a':
returnfor attr in attrs:
if 'href' in attr[0]:
if attr[1].endswith('format=midi'):
self.links.append(attr[1])
breakparser = MyHTMLParser()
parser.feed(r.text)for url in parser.links:
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
Python 框架内置了一个 HTML 解析器,上面的代码用它来提取 URL。这有点复杂,因为我们需要创建自己的 HTMLParser 类来覆盖原始类中的handle_starttag
方法。对我来说,我很少使用 HTMLParser,因为其他可用的工具更容易实现。
Selectolax
from selectolax.parser import HTMLParser
import wgetfor node_link in dom.css(selector):
url = node_link.attributes['href'] if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
我开始知道 Selectolax 包是当有人回复我的 Reddit 评论,告诉我试试这个包。(感谢这位 Reddit 的朋友!🤗)基本上,它是一个适度的引擎的 Cython 包装器。经过尝试,解析 HTML 页面的速度有所提高,但幅度不大。同样的建议,如果你更熟悉 XPATH,就用 LXML 代替。
性能概述
作为实验,我使用不同的工具总共下载了 1349 个 MID 文件。运行 20 次后,平均每个工具所用的时间,结果如下:
+---------------+--------------------+
| Package | Average Time taken |
+---------------+--------------------+
| BeautifulSoup | 1300.94s |
| LXML | 1258.89s |
| Selectolax | 1241.85s |
| HTMLParser | 1265.95s |
+---------------+--------------------+
Selectolax 是最快的,但差别并不明显。
总之,如果你真的需要提高你的铲运机或爬虫的速度,那么也许选择 Selectolax 更好。如果您更熟悉 Xpath,请使用 LXML。此外,也许你正在处理一个设计糟糕的网站(就 Html 文档结构而言),最好选择 BeautifulSoup。最后但同样重要的是,如果您想挑战自己,那么就使用 HTMLParser 吧😎😎😎。
到目前为止,我希望您对用于解析 Html 页面的每个 Python 包有了更好的理解。
参考
- https://stack overflow . com/questions/4967103/beautiful soup-and-lxml-html-what-to-preferred
- https://www . mschweighauser . com/fast-URL-parsing-with-python/
- https://www . code mentor . io/aviar Yan/downloading-files-from-URLs-in-python-77 q3b S10 un
- https://stack overflow . com/questions/71151/html-parser-in-python
- https://stack overflow . com/questions/6126789/selecting-attribute-values-from-lxml
关于作者
Low 魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,能够为你提供你所需要的准确和干净的数据。你可以访问 这个网站 查看他的作品集,也可以联系他获取抓取服务。
在媒体上阅读低纬鸿的作品。数据科学家|网络搜集服务:http://datainfinite.mystrikingly.com/…
medium.com](https://medium.com/@lowweihong?source=post_page-----3efb6878f8db----------------------)
如何使用深度学习为您的视频找到合适的音乐
假设您有一个自定义视频,并且想要其中某些场景的配乐。这种方法描述了如何通过数字指纹技术将动作、文本和音乐链接在一起。
Photo by Denise Jans on Unsplash
在这篇文章中,我将介绍一种可能的方法,可以给你一个关于如何选择视频背景音乐的答案。无论你做什么:你的 Youtube 频道的博客或电影比赛的业余电影,或者你经营一个专业的制作工作室,或者你是一个游戏开发者,你需要为你的游戏找到一个配乐——无论如何,好的音乐都会增加你的视频的价值。
这种方法描述了如何使用机器学习为视频挑选音乐。这个概念可以使用深度学习作为更广泛的机器学习方法家族的一部分来实现。
在看了 Instagram 视频和商品评论后,我萌生了自动为视频挑选音乐的想法。我开始研究并试图理解这是否是一种先验的可能性。最后,我发现我的想法有权利被转化为一种方法,甚至转化为一种产品。然而,这将是一个资源密集型的机器学习系统开发。
你需要的音乐
当我们为一个视频选择音乐时,我们会遇到许多挑战,有些挑战来自一系列演绎和归纳的思维方式。
首先我们从一个场景描述开始。让我们把这种思维方式命名为‘向前’,在这里,我们观看视频,然后对我们所看到的进行分析和分类,并试图理解和描述我们产生的情绪。
之后要逆向思考。利用我们对情感的分析和描述的结果,我们需要在我们的脑海中找到一段适合所讨论场景的音乐。
所以,音乐和动作有一个共同点,那就是可以用语言来表达,但如果你没有这方面的经验,这就不那么容易了。描述一首音乐的一种方式是遵循的建议,将音乐作为一种艺术形式来分析。这将非常复杂,结果可能会变得非常主观。
然而,如果我们打算使用人工智能来挑选音乐,我们将需要找到另一个共同的数字分母。应该是来自原始媒体的少量相关特征,它们可以像数据库的关键字段一样相互链接。该方法基于数字视频和声学指纹之间的时间一致性的概念。
动作识别
第一步,我们将解决动作识别的任务。今天,机器学习系统能够使用视频指纹来检测和识别视频中的活动。你甚至可以在微软的计算机视觉服务上测试它。
这个领域也在 Kaggle 上流行起来。去年,谷歌开始了第一阶段的竞赛来开发分类算法,该算法使用来自 Youtube 的新的和改进的 YT-8M V2 数据集准确地分配视频级别标签。
动作识别的目的是从电影帧中识别出场景。作为这一阶段的结果,我们将有一个数字视频指纹和一个行动的文本描述。
最佳音乐
第二步是定义什么音乐最适合视频场景。幸运的是,在很多情况下,我们知道什么音乐应该适合一个动态图片所代表的故事。我们的生活经验帮助我们。电影充满了动作和声音的结合。从童年起,我们就知道什么声音符合追逐,或者恐惧、爱、快乐等情绪。
电影摄影,由于其受欢迎程度,为选择合适的轨道设定了质量标准。所以,我们可以用电影原声作为视频的例子。
在这种情况下, Movieclips 可以提供帮助,因为它是 YouTube 上最大的电影网络。每个剪辑包含一个简短的电影场景和一段简短的文字。
然而,配乐并没有覆盖电影或场景的整个持续时间。音乐出现在作者决定强调观众注意力的地方。因此,下一个任务是从其他声音或其缺失中选择音乐。类似于 YouTube 、内容 ID 或 Shazam 的系统可以通过声音指纹的技术来实现。
Image source: https://support.google.com/youtube/answer/2797370
从音频中生成签名对于通过声音进行搜索至关重要。一种常见的技术是创建一个称为频谱图的时频图。任何一段音频都可以翻译成声谱图。随着时间的推移,每段音频被分割成一些片段。在某些情况下,相邻的时间段共享一个公共的时间边界,而在其他情况下,相邻的时间段可能会重叠。结果是一个图表,它描绘了音频的三维:频率对振幅(强度)对时间。
概念
正如我之前提到的,这个概念很简单。它表示视频的一个动作和一首歌曲之间的相互联系,作为数字视频指纹和声音指纹之间的时间一致性。
Image by author
旨在解决分类任务的监督深度学习算法可以分为两个阶段:
- 训练-分析标记的电影数据库(检测动作和声音)并利用标记的动作和相应的配乐建立指纹数据库。
2.工作-从音乐数据库中选择曲目名称。
警告:当我们使用计算机视觉 神经网络 时,我们应该考虑到 概率 这些术语。对于一个新的独特的视频,我们将使用 的不确定性 来获利。
两种选择
未来系统的输入数据有两种可能的选择:视频及其文本描述。声音、视频和文本在媒体文件或流式视频中是相互联系的。
Image by author
1.录像
机器学习系统将识别视频上的一个动作,创建一个视频指纹,在电影数据库中搜索相似的指纹,根据符合程度对结果进行排名,将结果与电影配乐相关联,并返回带有链接的配乐列表,例如,谷歌音乐或苹果 iTunes。
2.文本
通过视频的文字描述来搜索音轨,或者搜索你想要的音轨的关键部分,会让这个概念变得有点困难。该算法必须添加搜索动作-描述对应关系的过程。
副作用
在研究这个主题时,我公开了另一个有用的选项,该选项基于来自新视频和系统学习的视频之间的指纹差异的不确定性。
深度学习分类模型往往给出归一化的得分向量,不一定能捕捉到模型的不确定性。它可以通过贝叶斯深度学习方法来捕获,贝叶斯深度学习方法为理解深度学习模型的不确定性提供了一个实用的框架。
这种不确定性可以被用作潜在修改的度量,以使用生成对抗网络来生成新的音频指纹。另一种选择是快速傅立叶逆变换(FFT)的实现,其可以生成新的唯一音轨(音乐片段)。来自 FFT 的自然损失可以通过来自先前生成的音轨列表的最佳匹配音乐的最近比特来补偿。
结论
所描述的概念示出了如何使用机器学习系统为视频选择音乐。它可以轻松找到视频项目或流媒体所需的最佳歌曲曲目。它还可以为最佳选择提供曲目的变体。
这一概念显示了其成为强大服务的重要功能的潜力,如 Youtube、谷歌照片、微软 Azure、 Adobe Premiere Pro 、 Corel VideoStudio 和 Pinnacle Studio 。然而,我认为基于概念的独立产品开发是低效的。
动作和文本可以用作音乐生成的输入数据。它可能没有人类的作品漂亮,但很可能是独一无二的,可以激发作者的创造力。
被揭示的副作用可能是人类创造力的一个伟大领域。它可以创造出了解一个活动或一个故事听起来如何的可能性。
使卷积网络再次保持平移不变
现代卷积网络有什么问题,如何修复?如果你使用 CNN,你可能想读这个。
2019 年 4 月,一篇新的计算机视觉论文出现,标题为“让卷积网络再次保持平移不变”。为什么现代卷积网络不再是平移不变的,这意味着什么,我们如何使它们再次平移不变?
现代卷积网络怎么了?
大多数现代的卷积网络对于小的移位或转换来说是不健壮的。例如,网络输出可能会根据输入位置发生剧烈变化。
The two sets of images look identical to us, but not to the convolutional network!
尽管卷积是平移不变的,并且汇集建立了平移不变性,但是跨越的忽略了奈奎斯特采样定理和混叠,这破坏了平移不变性**。在最大汇集和跨步回旋期间可以看到跨步。**
采样定理:如果对波形的采样速度是其最高频率分量的两倍,则可以对带限连续时间信号进行采样,并从其样本中完美地重建信号。
在信号处理中,模糊在二次采样之前用作抗混叠手段。在深度学习中,这种方法最终被 max-pooling 所取代,当时后者从经验上证明了更好的性能。
Max-Pooling operation on the same signal with two different shifts. The outputs are different, Max-Pooling breaks shift-equivariance
现有的工作提出了各种方法来增加下采样的抗混叠能力,例如通过密集地提取特征,通过在最大和平均池之间软选通,或者利用卷积核网络。然而,这些方法要么计算量大,没有充分利用平均池的抗锯齿能力,要么精确度较低。此外,大多数现有工作将最大池和平均池视为两个独立的、不兼容的下采样策略。
怎样才能给强大的网络加上抗锯齿?
本文试图调和经典反走样和最大池。首先,请注意,最大池操作相当于以密集的方式获取最大值,并从该中间特征图中进行子采样。第一个操作,密评,其实根本不别名;问题在于二次采样操作。因此,我们可以在二次采样之前添加一个模糊滤波器来减少混叠。模糊和子采样一起被评估为模糊池。
抗混叠可以类似地应用于其他卷积网络。对于步进卷积,我们可以在卷积和激活后简单地添加一个模糊池层。平均池相当于使用箱式滤镜的模糊缩减像素采样,因此用使用更强滤镜的模糊池替换它可以提供更好的等偏移方差。BlurPool 使用以下模糊滤镜进行测试:矩形-2 [1,1],三角形-3 [1,2,1]和二项式-5 [1,4,6,4,1]。
我们如何评价抗锯齿?
在不同的计算机视觉架构上,对新的子采样策略进行了图像分类和生成测试。为了评估抗混叠性能,提出了三种移位不变性/等方差度量:
首先,将卷积网络视为特征提取器,其中每一层都是一个特征图。然后,一个度量是内部特征距离,它是特征映射的移位输出和具有移位输入的特征映射的输出之间的余弦距离。
Internal feature distance for a feature map F tilda
接下来,我们可以通过检查模型多长时间预测来自同一图像的两个不同偏移的相同类别来评估分类一致性。
Classification consistency for prediction on different shifts
对于图像生成,我们可以通过测试输入图像的偏移是否会生成原始图像输出的偏移版本来评估生成稳定性。
Peak signal-to-noise ratio between generated images with shifted and non-shifted input
结果
通过针对各种水平和垂直偏移计算 VGG 网络各层的内部特征距离,我们观察到抗锯齿网络保持了更好的偏移-等方差,并且最终输出更加偏移-可变。与基线网络不同,在缩减采样图层中,与理想的等偏移方差没有太大的偏差。
Each pixel in the heatmap corresponds to a shift (∆h, ∆w) where its color indicates feature distance. Big distance or large deviation is red, zero distance or perfect shift-equivariance is blue.
对于图像分类,添加低通滤波器可通过 ResNet50 增加分类一致性,其中强滤波器可进一步提高稳定性。此外,绝对分类精度也随着这些滤波器的增加而提高,而无需增加可学习的参数。事实上,低通滤波可以作为有效的正则化。
ImageNet classification consistency vs. accuracy
对于图像生成,低通滤波器被添加到 U-Net 架构的步长卷积层。输入有偏移和无偏移时生成的图像之间的 PSNR 也会增加,这意味着输出更加相似。
Selected example to demonstrate generation stability. Without anti-aliasing (top), shifting produces different looking windows. With anti-aliasing (bottom), the same window pattern is generated regardless of shifts.
此外,这种抗锯齿方法还提高了对噪声等其他扰动的稳定性。它还降低了对受损图像进行分类的平均错误率。因此,抗锯齿有助于为各种架构和任务获得更健壮和更通用的网络。
讨论
我自己尝试了这个模型,对一个预先训练好的反锯齿 Resnet18 模型进行了微调,用于灰度图像的图像分类,训练数据不到 4 000 个。最初,这项任务是具有挑战性的,因为该模型倾向于过度拟合稀缺的训练数据。反走样确实帮助模型一般化,测试精度从 0.95865 提高到 0.97115。
本文提出的方法值得注意,因为它在不增加任何可学习参数的情况下提高了性能。拥有移位不变卷积网络意味着我们不再需要移位数据增强。两者都有助于缩短计算时间,并在计算机视觉任务中更好地概括。
最初的问题在于图像在视觉上可能看起来相似,但实际上它们之间有很大的距离。移位图像正是这种现象的一个常见例子。让我们提醒自己,好的卷积网络应该迎合人类的视觉。对我们来说看起来一样的图像对机器来说也应该如此。因此,平移不变网络更好地模拟人类感知,因为由网络提取的特征具有更好的平移等方差,并且平移后的图像更经常被认为是相同的。
经典的信号处理实践模糊抗混叠,但它已经在现代卷积网络中消失,目的是优化性能。本文的结果表明,在当前的卷积网络中添加抗锯齿功能可以同时提高平移方差和任务性能,现在也许是时候恢复模糊滤波器,让卷积网络再次保持平移不变了!
多重共线性-它是如何产生问题的?
深入了解多重共线性如何影响模型的性能
Photo by Luke Chesser on Unsplash
在回归分析过程中,我们在实际执行回归之前检查许多东西。我们检查独立值是否相关,我们检查我们选择的特征是否重要,以及是否有任何缺失值,如果是,那么如何处理它们。
首先,让我们了解什么是因变量和自变量—
- 因变量,回归过程中必须预测的值。也称为目标值。
- 自变量,我们用来预测目标值或因变量的值。也被称为预测器。
如果我们有这样一个等式
y = w*x
这里,y 是因变量,w 是自变量。
我们稍后会看到它是如何被检测到的,但首先,让我们看看如果变量是相关的,会有什么问题。
从概念上理解—
想象你去观看一个摇滚乐队的音乐会。有两名歌手,一名鼓手,一名键盘手和两名吉他手。你很容易区分歌手的声音,因为一个是男性,另一个是女性,但你似乎很难分辨谁弹得更好。
两个吉他手都以相同的音调、音高和速度演奏。如果你能去掉其中一个,那就不成问题了,因为两者几乎一样。
去掉一个吉他手的好处是降低成本,减少团队成员。在机器学习中,训练的特征越少,模型就越简单。
这里两个吉他手共线。如果一个人弹吉他很慢,那么另一个吉他手也会弹得很慢。如果一个人弹得快,那么另一个人也弹得快。
如果两个变量共线,这意味着如果一个变量增加,那么另一个也增加,反之亦然。
数学上的理解—
让我们考虑这个等式
考虑 A 和 B 是高度相关的。
y = w1*A + w2*B
系数 w1 是在保持 B 不变的情况下,A 每增加一个单位 y 的增加量。但是实际上这是不可能的,因为 A 和 B 是相关的,如果 A 增加一个单位,那么 B 也增加一个单位。因此,我们不能检查 A 或 b 的个人贡献。解决方案是删除他们中的任何一个。
检查多重共线性—
通常有两种方法来检查多重共线性
- 相关矩阵
- 差异通货膨胀系数(VIF)
相关矩阵—****相关矩阵是显示变量间相关系数的表格。
我们不打算讨论相关矩阵是如何计算的。
create_correlation_matrix
我认为高于 0.75 的值是高度相关的。
方差膨胀因子— 方差膨胀因子(VIF)是多项模型中的方差与单项模型中的方差之比。它量化了普通最小二乘回归分析中多重共线性的严重程度。VIF 值可以解释为
- 1(非共线)
- 1–5(中等共线)
-
5(高度共线)
移除 VIF 值大于 5 的值。
VIF Python
结论—
多重共线性会显著降低模型的性能,而我们可能不知道这一点。这是特征选择过程中非常重要的一步。移除多重共线性还可以减少要素,这最终会降低模型的复杂性,并且存储这些要素的开销也会减少。
确保在执行任何回归分析之前运行多重共线性测试。
关于数据和科学
第一部分:将科学引入讨论的重要性。
Illustration by Héizel Vázquez
我们从事科学研究已经有一段时间了。我打算把开端放在 1637 年笛卡尔发表《方法的论述》的时候。这本书的主要结果是知识和真理之间的区别,科学家的话语与知识有关(我们后来发现知识总是不完整的)而不是寻找真理。
这是非常重要的一点,因为它给了我们一个焦点,科学想要知道那些不是“无可争议的真理”的东西。
数据在科学中的作用
Illustration by Héizel Vázquez
几乎在科学的历史中,数据一直是接近科学的。有时是理论,然后得到数据,但对于我们在这里讨论的大部分内容和其他即将到来的文章,它将在模型数据->理论中。
我想告诉你一个小故事,它会让你更好地理解为什么数据很重要,但不是科学中最重要的部分。
故事讲的是一个叫第谷·布拉尼的人。他几乎一生都在测量恒星、行星、月亮和太阳的位置。为了什么?他想学习如何预测椭圆,而且他对托勒密体系不满意,哥白尼理论对他来说也不够。所以他想找到描述天空及其运动部分的最佳方式。
遗憾的是,他不确定如何测量,但他一直坚持测量,直到生命的最后几天。他死于 1601 年,一个名叫约翰尼斯·开普勒的人在一年前成为他的助手,他是一位伟大的数学家,可以接触到他几乎所有的数据。利用这些数据,开普勒改进了哥白尼的宇宙理论,并发展了描述行星运动的三大定律。开普勒的工作为艾萨克·牛顿后来关于引力理论和物体运动的研究奠定了基础。
这个故事更长更有趣,如果你想知道更多,请上网看看。但是此时你可能会问自己,这个故事与数据科学有什么关系?
我们从这个故事中最大的收获是拥有数据,有时很多数据是没有价值的,除非你有一个好问题要回答。如今仍然如此,现代人对数据的热爱始于统计学。
统计的作用
Illustration by Héizel Vázquez
我不打算在这里写太多关于统计学的东西,但我会指出两件永远改变了世界的具体事情。第一篇是 John Tukey 在 1962 年发表的一篇名为“数据分析的未来的文章,另一篇是 Jeff Wu 教授在 1997 年发表的一篇名为“统计学=数据科学的演讲。
我知道这些都是很老的参考资料了,但它们非常重要。相信我。
在图基的文章中,他这样说:
很长一段时间以来,我一直认为自己是一名统计学家,对从特殊到一般的推论感兴趣。但是当我看到数理统计学的发展时,我有理由感到惊奇和怀疑。[……]总而言之,我觉得我最感兴趣的是数据分析……
这是一个统计学家的巨大声明。在这个时代,“数据科学”这个词并没有像今天这样存在,但图基描述数据分析的方式非常接近我们现在所说的数据科学。他甚至称数据分析是一门科学,因为它通过了这三项测试:
- 知识性内容。
- 组织成一种可以理解的形式。
- 依赖经验测试作为有效性的最终标准。
也就是说,这门“新科学”是由一个普遍存在的问题而不是一个具体的学科来定义的。然后,他开始讲述如何学习和开始数据分析,以及如何成为一名数据分析师以及如何教授数据分析。这是一篇令人惊叹的文章,如果我们想了解这个领域的开端,我们都应该读一读。
在 Tukey 出版 35 年后的第二篇文章中,Jeff Wu 说:
统计学=数据科学?
他在会上提议将统计学重新命名为“数据科学”,将统计学家命名为“数据科学家”。按照今天的标准,我们知道统计学是数据科学的一部分,但是为什么呢?因为我们说我们还需要编程,商业理解,机器学习等等。可能只是统计学进化了,现在一些统计学家变成了数据科学家。但是其中有一些。
为了理解成为数据科学和数据科学家的统计学家和统计学家,我们需要阅读 Leo Breiman 在 2001 年发表的文章“统计建模:两种文化”。
他在这里提到,在统计文化中,有些人受数据建模的驱动,有些人受算法建模的驱动。其中第一个假设我们有一个随机数据模型,它将输入变量 x 映射到响应变量 y 。第二种方法认为映射过程既复杂又未知,他们的方法是找到一个作用于 x 的函数 f(x) 来预测响应 y 。
然后,他继续讨论为什么数据建模文化长期以来对统计学不利,导致不相关的理论和可疑的科学结论,阻止统计学家使用更合适的算法模型和解决现有的新问题。他还谈到了光谱的另一部分的奇迹,算法建模文化从他自己的作品和其他作品中给出了如何解决困难和复杂问题的例子。
数据科学的作用
Illustration by Héizel Vázquez
数据科学是目前大多数科学和研究的主要焦点,它需要许多东西,如人工智能、编程、统计、商业理解、有效的演示技巧等等。所以才不容易理解,也不容易学习。但是我们能做到,我们正在做。
数据科学已经成为学术界和工业界解决问题的标准框架,而且这种情况还会持续一段时间。但是我们需要记住我们从哪里来,我们是谁,我们要去哪里。
我会在这个主题上写更多的文章,你可以把这看作是一个介绍。
感谢阅读:)
如需了解更多信息,请点击此处关注我:
[## 法维奥瓦兹奎-首席执行官-克洛斯特| LinkedIn
‼️‼️重要提示:由于 LinkedIn 的技术限制,我现在只能接受来自我…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)
Python 基础:可变对象与不可变对象
Source: https://www.quora.com/Can-you-suggest-some-good-books-websites-for-learning-Python-for-a-layman
读完这篇博客后,你会知道:
- 什么是对象的身份、类型和值
- 什么是可变和不可变 对象
简介(对象、值和类型)
Python 代码中的所有数据都由对象或对象之间的关系来表示。每个对象都有标识、类型和值。
身份
一个对象的标识 一旦被创建就不会改变**;你可能认为它是内存中对象的地址。
[**is**](https://docs.python.org/3/reference/expressions.html#is)
运算符比较两个对象的身份;[**id()**](https://docs.python.org/3/library/functions.html#id)
函数返回一个表示其身份的整数。**
类型
一个对象的类型定义了可能的值 和操作(例如“它有长度吗?”)该类型支持。[**type()**](https://docs.python.org/3/library/functions.html#type)
函数返回对象的类型。像身份一样,对象类型是不可改变的。
价值
某些对象的值可以改变。值可以变化的对象被称为可变*;一旦被创建,其值不可改变的对象**称为*。****
对象的可变性是由其类型决定的。
重要提示 有些对象包含对其他对象的引用,这些对象被称为容器。容器的一些例子有元组、列表和字典。如果可变对象被改变,包含对可变对象 的引用的不可变容器的值可以被改变**。然而,容器仍然被认为是不可变的,因为当我们谈论容器的可变性时,只有被包含对象的身份是隐含的。******
在下一节中,我们将看到更多的信息和详细的例子来理解可变和不可变对象之间的区别。
Python 中的可变和不可变数据类型
- Python 中的一些可变数据类型有列表、字典、集合和用户自定义类。
- 另一方面,一些不可变的数据类型是 int、float、decimal、bool、string、tuple 和 range 。
是时候举些例子了。先来比较一下元组 ( 不可变)和列表 ( 可变)的数据类型。我们可以像这样用方括号 **[]**
定义一个列表:numbers = [1, 2, 3]
。定义一个 tuple,我们只需要把括号替换成圆括号 **()**
就像这样:numbers = (1, 2, 3)
。从这两种数据类型中,我们可以通过索引访问元素,并且可以对它们进行迭代。主要区别在于元组一旦定义就不能更改。
索引列表和元组
输出:
****1
10****
改变值:列表与元组
输出:
****[100, 2, 3]**--------------------------------------------------------------------**
**TypeError** Traceback (most recent call last)
**<ipython-input-2-286c46a29f5d>** in <module>**()**
3 list_values**[0]** **=** **100**
4 print**(**list_values**)**
**----> 5** set_values**[0]** **=** **100**
**TypeError**: 'tuple' object does not support item assignment****
我们可以看到,当我们试图改变元组时,我们得到了一个错误,但我们没有这个问题的列表。
元组与列表扩展
现在,我们可以尝试使用+=
操作符来扩展我们的列表和元组。这将对两种数据类型都起作用。让我们看看会发生什么。
输出:
****2450343168136
2450343205552
2450343168136
2450341742248****
我们可以看到,列表标识没有改变,而元组标识改变了。这意味着扩展了我们的列表,但是创建了一个完全的新元组。列表比元组更节省内存。
其他不可变数据类型示例
我们已经看到其他一些不可变的数据类型是整数和字符串。一旦它们被初始化,它们的值就不能被改变。
输出:
****1657696608
1657696640****
输出:
****2450343168944
2450343426208****
我们看到,对于数字和文本变量,它们的标识都发生了变化。这意味着新变量在两种情况下都被创建。
通过引用复制可变对象
让我们看看,如果我们为一个可变数据类型给同一个对象的两个名字会发生什么。
输出:
****2450343166664
2450343166664
True
[4, 5, 6, 7]
[4, 5, 6, 7]****
我们可以看到变量名具有相同的标识,这意味着它们引用了计算机内存中相同的对象。提醒:[**is**](https://docs.python.org/3/reference/expressions.html#is)
运算符比较两个对象的身份。
所以,当我们改变第二个变量的值时,第一个变量的值也会改变。这只发生在可变对象上。你可以在我之前的博客文章中看到如何避免这种情况。
复制不可变对象
让我们尝试用一个不可变的对象做一个类似的例子。我们可以尝试复制两个字符串,并更改其中任何一个字符串的值。
输出:
****3063511450488
3063511450488
True
3063551623648
3063511450488
False
Python is awesome
Python****
每次当我们试图用更新一个不可变对象的值时,一个新的对象就会被创建。当我们更新第一个字符串时,第二个字符串的值不会改变。
==运算符
有时候我们不是要比较两个对象的同一性,而是要比较这些对象的价值。我们可以使用==
操作符来做到这一点。
输出:
****True
False****
我们可以清楚地看到这两个对象具有相同的值,但是它们的身份不同。
不可变对象改变它的值
正如我们之前所说的,如果可变对象被改变,包含对可变对象的引用的不可变容器的值可以被改变。让我们来看一个例子。
输出:
****<class 'tuple'>
(129392130, ['Programming', 'Machine Learning', 'Statistics'])
(129392130, ['Programming', 'Machine Learning', 'Maths'])****
我们已经改变了skills
变量的值。另一个变量person
包含对skills
变量的引用,这也是它的值被更新的原因。
提醒
对象仍然被认为是不可变的,因为当我们谈论容器的可变性时,只有被包含对象的标识是隐含的。****
然而,如果你的不可变对象只包含不可变对象,我们不能改变它们的值。让我们看一个例子。
输出:
****1657696608
1657696032
(42, 24, ('Python', 'pandas', 'scikit-learn'))
1657696864
1657696064
(42, 24, ('Python', 'pandas', 'scikit-learn'))****
请记住,当您试图更新一个不可变对象的值时,会创建一个新的对象。
摘要
- Python 代码中所有的数据都是用对象或对象之间的关系来表示的。****
- 每个对象都有一个标识,一个类型,以及一个值。
- 对象的标识一旦被创建就不会改变 。你可以认为它是对象在内存中的地址。
- 一个对象的类型定义了可能的值 和操作。
- 值可以改变的对象称为可变的 。 对象一旦被创建,其值就不可改变的对象称为。**
- 当我们谈论容器的可变性时,只有被包含对象的身份*是隐含的。*******
资源
- https://www . python forthe lab . com/blog/mutable-and-immutable-objects/
- https://standupdev.com/wiki/doku.php?id = python _ tuples _ are _ immutable _ but _ may _ change
- https://www . geeks forgeeks . org/mutable-vs-immutable-objects-in-python/
- https://docs.python.org/3/reference/datamodel.html
- https://docs.python.org/3/library/functions.html#id
我的其他博客文章
你也可以看看我以前的博文。
- Jupyter 笔记本快捷键
- 数据科学的 Python 基础知识
- Python 基础:迭代、可迭代、迭代器和循环
- Python 基础:列表理解
- Python 数据科学:Matplotlib 数据可视化简介
- 使用 Python 的数据科学:使用 pandas 加载、子集化和过滤数据简介
- [文本自然语言处理导论](http://Introduction to Natural Language Processing for Text)
时事通讯
如果你想在我发表新的博客文章时得到通知,你可以订阅我的简讯。
商务化人际关系网
这是我在 LinkedIn 上的简介,如果你想和我联系的话。我将很高兴与你联系在一起。
最后的话
谢谢你的阅读。我希望你喜欢这篇文章。如果你喜欢,请按住拍手键,分享给你的朋友。我很高兴听到你的反馈。如果你有什么问题,尽管问。😉
不平衡数据集的重采样方法-欺诈交易
假设你的任务是开发一个简单的机器学习算法,无论是有监督的(有明确的目标变量)还是无监督的(没有预定义的结果变量)。但是看你的数据,好像是一个阶级统治了另一个阶级。在这种情况下,您的模型将很难从您的数据中学习来预测未来的类。
Data Sampling Source
仍然不确定这里的问题是什么?让我们看一个恰当的例子。
可视化不平衡数据集
让我们看看不平衡数据在实践中是什么样子的。出于本文的目的,以及即将发布的一系列专注于检测欺诈者的文章,我从 Kaggle 挑选了信用卡欺诈数据集。
该数据集是大约 28.5k 信用卡交易的集合,其中维度是从 V1 到 V28 的一组理论特征,不包括交易金额,以及后者是否是欺诈交易,以分类变量的形式表示(当没有欺诈时,Class == 0,否则,Class == 1)。
#Import libraries & Read Data
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdf = pd.read_csv("creditcard.csv")
现在让我们来数一数欺诈案件相对于非欺诈案件出现的次数。
occ = df['Class'].value_counts()
print(occ)Output:
#0 284315
#1 492
因此,在总共 284807 笔信用卡交易中,我们总共发现了 492 起欺诈案件。
print(occ / df.shape[0])
这只占所有病例的 0.17%。对于训练我们的模型来说,这可以说是相当微不足道的欺诈性数据,这就是我们所说的类不平衡问题。
在我们做出任何更改之前,让我们先直观地看一下。
首先,让我们定义一个函数来创建数据和标签的散点图。
def plot_data(X, y):
plt.scatter(X[y == 0, 0], X[y == 0, 1], label="Class #0", alpha=0.5, linewidth=0.15)
plt.scatter(X[y == 1, 0], X[y == 1, 1], label="Class #1", alpha=0.5, linewidth=0.15, c='r')
plt.legend()
return plt.show()
我们希望在我们的图表上尽可能避免噪音和维度。因此,我们将创建一个将所有特性放在一起的向量 X ,以及一个包含目标变量(类变量)的向量 y 。
我们将为此定义一个附加函数。
def prep_data(df):
X = df.iloc[:, 1:29].values
X = np.array(X).astype(np.float)
y = df.iloc[:, 30].values
y=np.array(y).astype(np.float)
return X,y
我们现在定义变量 X 和 y:
X, y = prep_data(df)
准备好了吗?我们走吧:
plot_data(X, y)
Visualization of Class Imbalance
您可以很容易地看到,红色的欺诈案例明显多于蓝色的非欺诈案例。在这种情况下,机器学习算法解释的主要是非欺诈事件。当成功训练我们的模型时,这将被证明是具有挑战性的,因为当数据集保持原样时,它很可能会产生假阴性。
那么我们能做些什么呢?这就是重采样派上用场的地方,作为一种提高欺诈与非欺诈比率的方法。
什么是重采样&什么时候用? 重采样是从原始数据集中抽取重复样本的过程。重采样方法背后的直觉是,它为我们的数据类创建“相似”案例,以便呈现代表我们希望调查的人群的数据,并因此向算法提供足够的数据以输出更准确的结果(当数据不够时)。
有哪些类型的重采样方法?
- 欠采样多数类
- 对少数民族阶层进行过度采样
- 合成少数过采样技术(SMOTE)
显然有更多的重采样方法(例如,自举、交叉验证等。)但在本文中,我们将重点定义以上三种。
欠采样多数类(在这种情况下,非欺诈情况)从数据集中随机抽取主要类,以匹配非主要类的数量。一般来说,这通常是最不可取的方法,因为它会导致我们丢弃一些有价值的数据,但是当您有一个大型数据集时,欠采样在计算上可能会更好(除非您同时煮咖啡)。
过采样少数类则相反。与前面的方法不同,我们随机抽取非支配类,并创建“假”副本来匹配支配类中的案例数量。在这种情况下,我们实际上是在创建数据的副本,并在此基础上训练我们的模型。当我们的非支配类没有分散在数据集中时,这可能不是一个理想的方法。复制只会有效地再造相似的实例,而没有“合成的”种类。
这就引出了第三个也是最后一个方法!
合成少数过采样技术(SMOTE) 是另一种类型的少数过采样技术,只是这种技术考虑了非支配类的现有情况的特征,并以“最近邻居”的方式创建合成副本*(无法控制自己来自东南亚的说法:相同,但不同!).*
对于这三种方法,一个经验法则是只对你的训练数据进行重采样!
重采样不平衡类—击杀方式 (看我在那里做了什么?永远不要错过任何插上一句双关语的机会)
!pip install imblearn
from imblearn.over_sampling import SMOTEmethod = SMOTE(kind='regular')
让我们将该方法应用于我们的特性&目标变量。
X_resampled, y_resampled = method.fit_sample(X, y)
现在让我们来看看我们新的平衡数据集:
plot_data(X_resampled, y_resampled)
瞧啊!
Balanced Dataset — using SMOTE Technique
结论
正如你所看到的,我们的非主导类(红色的欺诈案例)在数据上更加明显。如果我们运行一个快速的数字检查,我们会看到 y 和y _ 重采样的计数现在是相似的。
SMOTE 已经在 imblearn 软件包中预定义的特征空间中有效地合成了新的欺诈案例(对于更倾向于数学的人来说,对 K-最近邻和欧几里德空间的理解在这一点上可能会派上用场)。
不过,尽管如此,还是要记住一些限制,因为最近的邻居可能并不总是欺诈案例。将 SMOTE 方法与其他一些基于规则的系统结合起来以获得更高的准确性将是一个明智的决定,但这取决于手头的任务和数据。
玩得开心! 现在,可以说你已经准备好继续使用你的预测模型了(别忘了只在训练集上应用 SMOTE)!
这是我关于检测信用卡欺诈的系列文章中的第一篇(因此选择了这里的数据集)。如果您有兴趣了解更多信息并尝试一下,请订阅我的频道,不要犹豫,请在下面留下您的反馈:)谢谢!
商业分析的转变与扭曲:来自 Qlik Qonnections 和 Alteryx Inspire 的思考
Transfăgărășan Pass in Romania by Cristian Bortes, Flickr #1414351112 — CC BY-NC-SA 2.0
就像开车上山一样,商业分析主要是向上发展的,但是伴随着意想不到的思维转变和技术的突然转变。在这篇文章中,最近的两个事件提供了关于转变的线索,以及我们何时能登上这个山口。我小儿子的声音在我脑海中回响,“爸爸,我们到了吗?”
摘要:在最近的厂商简报会上,我观察到分析系统的七个行业变化,这些变化可能预示着未来几年思维的根本转变和技术的扭曲。给出了组织如何为这些变化做好准备的建议。
作为一名研究商业智能(BI)行业几十年的技术分析师,我见证了信息技术(IT)的许多变化,尤其是商业分析(BA)的变化。
在早期,最先进的分析技术包括生成带有少量计数和总计的财务报告。换句话说,是在描述已知数据,而 T5 凭借其实时性能仪表盘和交互式可视化分析工具,一直是 BI 行业背后的驱动力。
最近,机器学习算法的快速发展推动了分析技术的发展,尤其是那些基于人工神经网络的算法。更重要的是,重点已经转向超越已知数据的概括。这些变化令人着迷,而且往往出乎意料,因为它们正在改变和扭曲着商业智能的面貌。
兜售他们的最新产品,几十年来已经购买了 BI 供应商的持续游行,很像节日游行,喇叭响着,财富飙升。每一次新技术浪潮都会引起人群的欢呼,承诺解决我们的业务问题。
Qlik Qonnections in May 2019 — Alteryx Inspire in June 2019
最近,我参加了 Qlik 和 Alteryx 的分析师简报会,听取了他们的最新和最伟大的,期待看到更多的游行。
又一个转变和转折?
然而,事实并非如此!Qlik 会议强调了在前一周对 Attunity 的收购。[01]同样,Alteryx 大会在第一天就迎来了 Salesforce 对 Tableau 的收购。[02]这些游行不同寻常…
Qlik 以超过 6 亿美元的价格从私人资本手中收购了 Attunity。我想知道…为什么仪表板公司要收购一家公司来提供企业级数据管道?就因为他们可以?你只能把这么多像素放入这些仪表板。
会议的讨论围绕着这些大的收购,一些人暗示商业智能产业现在只对成年人开放。对技术古怪的企业家和手推车小贩来说,商业智能创新结束了吗?BI 游戏现在的赌注是否超过 10 亿?
从表面上看,这些趋势看起来是一样的——旧技术的重新混合和整合,在海量数据、无处不在的云、洞察狂热和大量分析的混乱中。这些发展是否足够重要和根本,足以暗示新的转变或扭曲?
我对这两个事件的主要观察是什么?下面的章节详细阐述了七个观察结果,并提出了一些实用的建议。
- 驱动因素 —分析发展迅速,但分布不均
- 障碍—分析需要坚实的数据运营基础设施
- 障碍 —分析需要新思维,但大多数人缺乏基本素养
- 乘数 —分析应该使孤立的应用成熟为集成的系统
- 决策 —商务智能供应商面临关于分析的关键决策
- 促成者 —业务/数据分析师必须在分析中扮演促成角色
- 能源 —推动上述发展的燃料来自下一代数据极客
下面的章节详细阐述了这些观察结果,并为经理们提供了一些建议。
驱动因素—分析正在快速发展,并且分布不均匀
这两次活动的主题都是分析。因此,我问了每个人他们是否、如何以及为什么使用分析。我数不清有多少人用青少年性行为的类比来描述他们组织中分析的使用。每个人都在谈论它,但是……
我的评估是,大多数人使用传统的机器学习(如随机森林)来进行决策支持项目,这些项目通常由外部专家领导,具有精选的一次性数据集。然而,目前最先进的分析技术已经迅速发展,超越了传统的机器学习技术,几乎成为一个独立的类别。只有 3–5%的普通组织 [03]正在使用当前一代的分析,并准备利用下一代的分析。
我对这些未来分析使用的术语是下一代分析,它基于乐高式神经网络架构动物园,消耗大量数据流,需要相当大的张量处理能力。人们可以把由此产生的模型想象成信息海绵,能够将数十亿字节的原始数据提取成一百万个权重(简单的数字)。然后,这些权重可以用于各种任务,例如对未来销售进行单一预测,对用于癌症检测的图像进行分类,将俄语语音翻译成英语文本,执行复杂的机器人动作序列,或者生成初始数据集的样本。
不幸的是,很少有公司能够具备这样的企业级能力:从 github 获取预先训练好的模型,在 Jupyter 笔记本电脑中定制代码,通过迁移学习使用其独特的数据集进行再培训,作为 web 服务部署到生产中,与现有的 it 基础设施集成,实现实际的业务价值,并满怀信心地进行管理。这不再是你奶奶的监督学习了。然而今天,对于任何好奇的技术人员来说,所有必要的工具和技能都是现成的。[04]
那么,为什么这些未来的分析不是均匀分布的呢?
障碍—缺乏可靠的数据运营基础架构
如前所述,我在这些活动中观察到的分析示例通常是独立的分析应用程序,带有手动管理的一次性培训数据集。此外,数据准备通常需要一个月,而数据分析需要几天,这意味着…
大多数公司只谈论分析的原因是他们挣扎于基本的数据获取和整合。具有讽刺意味的是,我们的 It 行业已经花了 70 年的时间来解决一般的数据集成问题,取得了巨大的进步,但从未到达终点线。
在 20 世纪 90 年代接受数据仓库课程的组织现在正在进行分析。对数据的贪得无厌的渴望作为商业环境的例子来推动学习分析,这对所有人来说都是一个惊喜,对那些早期投资 DataOps 的人来说也是一种祝福。 [05]。
如果没有可靠的数据操作基础架构,每个分析项目都是从零开始,以创建带标签的训练/测试数据集。这应该在单个 SQL 语句中执行。当成功时,部署创建了另一个独立的烟囱系统,漂浮在云中的某个地方。这应该是集中管理的正常生产工作负载的一部分。
Qlik 为什么收购 Attunity?…因为他们的企业级数据操作非常成熟。SalesForce 为什么收购 Tableau?…因为 SalesForce 拥有大量数据和可靠的数据运营基础架构,但需要一种更好的分析方法。为什么 Alteryx 非常适合分析系统?…因为他们有用户友好的 DIY 数据操作工具,可以轻松地将分析模块(像另一个 ETL 转换)添加到他们的工具箱中,并且只需单击一下就可以部署数据管道到 web 服务。
要点:对于一名高管来说,确定他们的公司是否准备好采用分析系统的一个有见地的练习如下:要求对最近的制造缺陷(或类似缺陷)进行简单的逻辑回归分析。这些缺陷的根本原因是什么?忽略结果,但记下花费的时间。询问有关持续时间、人-小时和分析所需步骤的具体问题,尤其是数据准备。然后,表现出兴奋的样子,要求尽快将此分析模型部署到生产中。做好被人弄湿衣服的准备。最后,乘以 x10-x100 来估计实际分析系统的资源和持续时间。在分析成熟的公司中,这个估计应该是几个人一周。
Barrier 每个人对数据及其分析的人工智能素养
我对 Qlik 在开放数据扫盲计划中所做的努力印象深刻。[06]他们花费了必要的资源和才能来做好这件事,并与所有人分享。我敦促 BI 社区中的每个组织都支持这个数据扫盲计划(或类似的计划)。
下一步是用大量的分析素养来扩展基本的数据素养。雇佣一些有才华的数据科学家不会充分改变组织文化来确保你的开发团队成功。每个人都应该用共同的术语和概念来思考和讨论问题。
分析素养有几个微妙的变化。这里有两个关键的转变。有关详细信息,请参见[07]
首先,重要的是理解从描述已知数据的到概括已知数据的的转变。这就是分析的本质!这是一个概念上的飞跃,每个人都自然而迅速地执行,但也是可预见的非理性和次优。[08]**
第二,从精心制作的(或静态的)逻辑*(这是几十年来的标准)到学习逻辑的转变。在后一种情况下,应用程序是从分析模型中创建的,这些模型经过训练和验证(称为 Fit ),并带有包含已标记(或已分类)示例的训练数据集。然后用来从一个输入推断出一个输出(称为预测)。这种 Fit-Predict 舞蹈被称为监督学习(虽然它实际上是训练,而不是学习)。*
要点:第一步是定义你关于分析和相关主题的术语。它每月都在变化。从拟合和预测开始,继续其他对你的分析计划至关重要的概念。确保每个人都说同一种语言。
要点:最后,确保你的公司信息与上述内容同步。特别是,定义你对人工智能这个术语的具体用法,或者完全避免使用它。[09]
决策—商业智能供应商重新分析的战略选择
在展览中,我询问了供应商他们如何为客户提供分析支持,以及他们如何将分析嵌入到他们的产品中。每个供应商的标牌都说明了一些关于分析的内容;然而,只有大约一半支持(或嵌入)固定的机器学习模块,如逻辑二元分类器、K 均值聚类和各种决策树。只有一个供应商(一个全球系统集成商)明智地谈论了神经网络,并理解它们的意义和差异。当被问及他们的客户项目中有多少应用了神经技术时,他回答说“没有”!
这给 BI 供应商带来了一个普遍的困境。他们关于下一代分析的战略选项包括:
- 忽略 —短期内无收益。太冒险了,不宜过早采用。目前生意很好。
- 炒作——这是下一个大的科技浪潮。让我们把我们公司的未来赌在它上面。把目前所有的产品和服务都贴上 AI 的标签。
- 领导 —成为思想领袖。公开承认潜力和局限。教育大家。想想准备情况。
作为 BI 供应商,哪个选项最适合您?
我推荐选项 3 — 领导,但是要运用谨慎的商业头脑。作为思想领袖,投入资源提高组织内部、外部客户以及整个行业的数据和分析素养。确定并消除组织内采用新一代分析的关键障碍。在大赌注上慢慢来,但是尝试许多小赌注来为你的组织学习最佳实践。
要点:启动一个小型分析创新团队,通过以下方式确定问题的范围:(a)自我教育,(b)汇编有效的用例,©实现 2-3 个原型,以及(d)为管理层讨论创建准备计划。建立一个六个月的计划,明确每个月的里程碑。
外卖:开始监控以 arXiv.org为中心的分析研究流,因为每周都有很多帖子。此外,从研究到应用的等待时间正在稳步下降。指派一个有才能的人,他可以扫描学术研究,并提取实际的见解。这个人应该花至少 20%的时间监控、提炼和定期汇报。为了辅助,开放聚合服务正在稳步改善,如代码为arXiv-Sanity两分钟论文O ’ Reilly AI 简讯和语义学者。[10]
要点:成为思想领袖也意味着对分析系统日益增长的社会影响和道德问题负有专业责任。否则,这类似于 20 世纪 40 年代理论物理学家的疏忽,他们在鼓吹核能发电的同时忽视了核技术武器化的危险。是时候抓住这个领导机会了!让分析道德成为一个可接受的专业话题,在您的组织内进行讨论。与其他组织合作,集中人工智能未来的智慧。[11]
乘数——从开发应用程序到部署系统
如前所述,我观察到的大多数分析示例都是使用一次性精选数据集训练的独立决策支持应用程序。
为了从分析中获得更大的商业价值,应该将注意力从为单一分析用例开发应用转移到部署增强了多个分析模块的系统上*。引人注目的分析应用程序会吸引注意力,但是嵌入在企业系统中的无关紧要的分析模块可能是价值的主要乘数。***
想想这些分析模块,比如 20 世纪 90 年代 Informatica 的 ETL 模块或者今天 Teradata 的 ELT 转换。它们是将 A 映射到 B 的可定制的通用转换函数,其中 A 和 B 现在大不相同。如果正确实现,系统模块将逐渐增强组织对客户、供应商和其他人的行为。
十多年来,BI 一直稳步向数据消费者转变,成为数据开发者,学习必要的技术技能,重新设计易于使用的工具。术语普及 BI* 经常被用来表示这种趋势。供应商迎合了各种形式的自助 BI。最新的是辅助分析,分析工具根据数据的性质建议适当的图表来可视化。*
总的来说,辅助分析是商业智能工具成熟的健康趋势。问题是,辅助分析通过关注模型开发中的小问题而分散了对大问题的注意力。你看到了树,却看不到森林。较大的问题(森林)处理业务用例及其分析价值主张,以及特定的技术用例、其参数和期望的度量。支持分析系统工作的工具甚至方法中应该嵌入更多的严格性和验证性。
要点:升级您的 DevOps 和 DataOps 敏捷开发方法,以用于未来的分析系统。这应该是全行业的努力。一旦标准出现,供应商就可以创建支持这种方法所需的工具。如果这种分析开发方法构建得当,那么部署到生产环境应该只需一次点击(加上大量的测试)。依靠您的分析供应商合作伙伴提供帮助。
推动者—业务/数据分析师的角色至关重要
在 Qonnections,在 Elif Tutuk 和 Vinay Kapoor 关于 Qlik Sense 的增强智能的演讲之前,我被要求做一个解释人工智能的简短介绍。我挣扎着在十分钟内能说些什么实质性的东西。我考虑了受众的性质,主要是数据分析师(精通技术)和一些业务线业务分析师(精通业务)。答案似乎显而易见。有一个非常重要的消息要传递!**
IT 专业人员(尤其是业务分析师)和数据科学家之间的文化差异越来越大。他们说不同的语言。除非得到解决,否则结果可能会限制组织的 BI 发展,从而伤害组织。为了完成他们的工作,数据科学家将会离开并实施烟囱系统,漂浮在云中,不受 IT 部门的影响。并且,商业分析师将否认对那些人工智能系统的任何责任或知识。数据分析师将继续涉足描述历史数据的可视化图表。管理两个不沟通的 IT 团队以及维护不兼容的系统会让高管们感到沮丧。而且,没有人会为分析模块执行概念化业务用例的艰苦工作。大家都会不开心!
纵观商业智能在企业中的发展历史,现在最需要的是强有力的行政领导,来引领整个组织进入商业智能发展的下一个阶段。治理和敏捷性之间的平衡从未如此微妙。IT 角色和职责发生了前所未有的巨大变化。而且,技术变革的速度从未如此之快。
在神经网络技术飞速发展的今天,数据科学团队必须专注于细节,确保分析模型得到正确的构建、训练和反复验证。他们需要用例目标和标准的清晰陈述,以及部署后的持续模型评估。数据科学家不适合编写这些需求陈述,这需要对业务有深入的了解。对这些声明负责的是从高层到中层的管理层。
最后,猜测谁应该是所有管理层和技术专家(尤其是数据科学)之间的桥梁,确保分析用例的目标和标准正确完成。
重点是… 业务/数据分析师是未来成功分析系统的推动者。[12]
收获:对整个企业中业务/数据分析师的角色进行战略性重新评估。这些人目前是如何被利用的?相对于他们在组织中的位置,商业知识和技术知识的平衡是什么?他们的角色应该如何发展以支持未来的分析系统?他们应该有哪些新的职责?此外,他们需要哪些新技能和工具来完成这些新的以分析为中心的任务?
要点:设计一个培训下一代业务/数据分析师的计划,以提升他们的技能和对分析系统这一新兴新角色的渴望。如果成功,他们应该成为数据科学家的好朋友,而不是试图取代他们成为公民数据科学家。[13]
要点:从战略角度思考数据科学团队的职能。你真的想雇佣整个团队作为员工吗?也许几个协调数据科学家就足够了。定制的分析工作可以外包给高度专业化的开发团队,而常见的分析任务可以由云供应商提供 web 服务。如果是这样的话,全球 SI 公司,加上 AWS 和 Azure 将会掀起一场疯狂。
能源——新一代数据极客的好奇心
我立刻注意到,这两个活动的参与者都很好奇,精力充沛,干劲十足,而且都不到 40 岁。对我来说,进入这个房间并戏剧性地提高平均年龄有点不和谐。观众的注意力中有复兴的能量,就像这些技术对他们个人来说真的很重要。但是,为什么呢?
早餐时,我和一个随机的 Alteryx 客户聊了聊。他没有提示就说:“使用这个产品很有趣,也很吸引人。我真的很喜欢图标中的艺术细节。让他们与众不同。简单易学。令人愉快。我的工作日过得很快
他的情绪呼应了过去几十年 SAS 用户群爱节和过去几年 Tableau 摇滚音乐会的能量。这种能量似乎来自他们的内心,而不是他们的头脑或钱包。以下是我对这种年轻活力背后原因的解释…
*首先,**他们的动机已经从以技术为中心的喜爱转变为以故事为中心的好奇。*他们不关心技术,只关心获得工具和技能,根据数据讲述故事。他们不关心分析产生的洞察力本身,而是那些洞察力所预言的故事。
其次,分析公司给他们的故事增加了色彩*(更有深度和戏剧性)。分析正在将注意力从洞察“什么是有趣或重要的”转移到了解谁造成了什么以及为什么。这就像是一个调查海伦女士是如何被杀害的神秘事件。他们的角色变得像一个调查记者,新闻截止时间是下午 6 点。*
第三,**任何故事都不会以谁干的*结束。必须有决心。*我最喜欢的问题是,“你用你知道的东西做什么?“换句话说,故事必须以解决业务问题的具体行动结束。这将需要了解要雇用的相关临时关系。[14]或者简单地说,下一代数据极客想要了解商业是如何运作的,以便完成他们的故事。
要点:高管们,通过证实他们对组织的贡献来支持你们的下一代数据极客。他们的贡献往往被埋没了几层,或者从未引起管理层的注意。
要点:新一代数据极客非常清楚他们工作职责的社会意义和道德问题。他们意识到现在忽视这些问题或者对这些问题过于天真是一种职业过失。现在这被认为是他们讲故事的一部分。高管应该支持这种趋势,促进对这些问题的公开和诚实的讨论,并使这些讨论成为组织文化中安全和正常的一部分。
我们到了吗?
我认为我们离山口还很远。在接下来的几十年里,商业智能的发展将以其令人惊讶的转变和曲折继续向上。所以,系紧你的安全带。欣赏风景!
这里有一些总结之前的最后建议…
收获:一旦你有了一个可行的分析用例,将你的思维从以分析为中心的应用程序转移到分析驱动的系统。由于价值乘数,正确实现的分析用例将开始从外部改变组织行为。引人注目的分析应用程序固然不错,但是嵌入在企业系统中的几个无关紧要的分析模块可能会产生巨大的业务影响。处理部署、运营和治理问题。
外卖:忘掉你认为自己对分析的了解。分析每天都在发展,从应用研究到实际应用的延迟正在快速下降。例如,研究论文会在早上发布在 arXiv 上;成功的 github 分叉在下午被报告,web 服务在第二天可用。现成的下一代分析的潜在用例现在已经超出了行业吸收这些新的 BI 创新的能力。
要点:要扩展你的团队对下一代分析的想法,试试这个练习:点击这里;)
承认
我收到了以下人员对文章草稿的许多有用建议:Remco Broekmans、Rob Gerritsen、Dan Graham、April Healy、Julie Hunt、Dave Imhoff、Todd Margolis、Joseph A. di Paolantonio、Neil Raden 和 Elif Tutuk。谢谢你帮我理清思路!
笔记
[01] Qlik 新闻稿位于https://www . Qlik . com/us/company/press-room/press-releases/Qlik-to-acquire-attunity。再加上埃克尔森集团的韦恩·埃克尔森在https://www . Eckerson . com/articles/qlik-acquisites-at unity-fleshes-out-its-data-analytics-platform的一篇文章。Eckerson 表示,Qlik“希望成为大型企业集成数据和分析的一站式商店”。
[02]位于https://investor . Salesforce . com/press-releases/press-release-details/2019/sales force-Signs-Definitive-Agreement-to-Acquire-Tableau/default . aspx 的 sales force 新闻稿。加上《福布斯》在的一篇文章 https://www . Forbes . com/sites/patrickmoorhead/2019/06/18/sales forces-tableau-acquisition-admission-organic-innovation-failure/# 1e 26457 B3 ca 2。
*[03]艾米·韦伯(Amy Webb)题为《九大巨头》(The Big Nine)的有争议的书(2019 年 3 月 5 日)指出,“九大巨头——亚马逊、谷歌、脸书、腾讯、百度、阿里巴巴、微软、IBM 和苹果——是人工智能的新神,它们正在改变我们的未来,以获取直接的经济利益。”对当前人工智能歇斯底里的技术、经济和政治的有用(但有争议)见解,以及有据可查的事实。【https://www.amazon.com/dp/B07H7G7CMN/ *
[04]即将发表的关于新一代分析的文章。当发表在《走向数据科学》上时,我会在这里发布一个链接。有人对合作感兴趣吗?
[05]维基百科条目有关于 https://en.wikipedia.org/wiki/DataOps的数据操作的有用背景。然而,在别处搜索更多当前和详细的材料,例如在 https://www.eckerson.com/thought-leadership的埃克尔森集团思想领导部分。
[06]https://thedataliteracyproject.org/的数据扫盲计划。浏览网站。参加在线评估。
[07]这里有几个关于分析素养的资源:
- https://towards data science . com/data-science-literacy-for-the-enterprise-fadaf 9268494
- https://www . Gartner . com/smarterwithgartner/a-data-and-analytics-leaders-guide-to-data-literature/
- https://tdwi . org/events/on site-education/on site/sessions/business-analytics/adv-all-developing-data-analytics-literacy-workshop . aspx
- https://HBR . org/2018/10/your-data-literacy-on-understanding-the-types-of-data-and-how-they-capture
[08]2008 年出版的令人愉快的经典著作《可预测的非理性》,在 https://www.amazon.com/dp/B002C949KE/的找到。值得每隔几年读一读,再加上搜索参考这一经典的书籍和文章。
[09]我讨厌人工智能这个术语的含义。要了解更多我的观点,请访问 https://towardsdatascience . com/Vendors-Define-Your-Usage-of-AI-9495 b 30 EBD 28
[10]开放 arXiv 聚合服务的完整 URL 是:
- https://arxiv.org/
- https://paperswithcode.com/
- http://www.arxiv-sanity.com/
- https://www.patreon.com/TwoMinutePapers
- https://www.oreilly.com/ai/newsletter.html
- https://www.semanticscholar.org/search?q=deep%20learning 排序=相关性&fos =计算机科学
[11]人工智能伦理资源有:
- 与艾在https://www.partnershiponai.org/的合作
- fast.ai 艾伦理资源https://www.fast.ai/2018/09/24/ai-ethics-resources/
- https://allenai.org/index.html 艾伦人工智能研究所
- 位于https://intelligence.org/的机器智能研究所(MIRI)
- 在https://intelligence.weforum.org/举行的世界战略情报经济论坛
[12]即将发表的关于业务/数据分析师新角色的文章。将在《走向数据科学》发表时在此处发布链接。有人有兴趣合作吗?
[13]小心公民数据科学家计划。只有少数下一代数据极客想调整张量的位,但不是大多数。这就像将赛车手改造成汽车工程师。该组织需要两者,密切合作。[13]
[14]即将发表的关于因果分析出现的文章。将在《走向数据科学》发表时在此处发布链接。需研究朱迪亚·珀尔(https://en.wikipedia.org/wiki/Judea_Pearl)等人的文献。有人有兴趣合作吗?
“嘿,那是什么?”使用解释调试预测
机器学习(ML)模型到处都在涌现。有许多技术创新(例如,深度学习、可解释的人工智能)使它们更加准确,适用范围更广,可供更多人在更多商业应用中使用。名单无处不在:银行业,医疗保健,科技,以上全部。
然而,与任何计算机程序一样,模型也会有错误,或者更通俗地说,就是bug。发现这些 bug 的过程与以前的技术有很大不同,需要一个新的开发者栈。“很快我们就不会给电脑编程了,我们会像训练狗一样训练它们”(《连线》,2016)。“梯度下降能比你写的代码更好。对不起”(安德烈·卡帕西,2017)。
在深度学习神经网络中,我们看到的可能是数百万个连接在一起的权重,而不是人们编写的一行行代码,形成了一个不可理解的网络。(图片鸣谢)
How do we find bugs in this network?
那么我们如何在这个网络中找到 bug 呢?一种方法是解释你的模型预测。让我们看看通过解释可以发现的两种类型的错误(数据泄漏和数据偏差),并用预测贷款违约的例子进行说明。这两个其实都是数据 bug,但是一个模型总结了数据,所以在模型中表现出来。
大部分 ML 模型都是有监督的。您选择一个精确的预测目标(也称为“预测目标”),收集一个具有特征的数据集,并用目标标记每个示例。然后你训练一个模型使用这些特征来预测目标。令人惊讶的是,数据集中经常存在与预测目标相关但对预测无用的要素。例如,它们可能是从未来添加的(即,在预测时间之后很久),或者在预测时间不可用。
这里有一个来自 Lending Club 数据集的例子。我们可以使用这个数据集尝试用 loan_status 字段作为我们的预测目标来建模预测贷款违约。它取值为“全额支付”(好的)或“注销”(银行宣布损失,即借款人违约)。在这个数据集中,还有 total_pymnt(收到的付款)和 loan_amnt(借入的金额)等字段。以下是一些示例值:
Whenever the loan is “Charged Off”, delta is positive. But, we don’t know delta at loan time.
注意到什么了吗?每当贷款违约(“冲销”)时,总支付额小于贷款额,delta (=loan_amnt-total_pymnt)为正。这并不奇怪。相反,这几乎是违约的定义:在贷款期限结束时,借款人支付的金额少于贷款金额。现在,德尔塔没有有肯定违约:你可以在偿还全部贷款本金而不是全部利息后违约。但是,在这个数据中,98%的情况下,如果 delta 为负,则贷款已全部付清;并且 100%的时间 delta 是正的,贷款被注销。包含 total_pymnt 给了我们近乎完美的信息,但是我们直到整个贷款期限(3 年)结束后才得到 total_pymnt!
在数据中包含 loan_amnt 和 total_pymnt 有可能实现近乎完美的预测,但是我们不会真正使用 total_pymnt 来完成真正的预测任务。将它们都包含在训练数据中是预测目标的数据泄漏。
如果我们做一个(作弊)模型,它会表现得很好。太好了。而且,如果我们对一些预测运行特征重要性算法(模型解释的一种常见形式),我们将看到这两个变量变得很重要,如果运气好的话,会发现这种数据泄漏。
下面,Fiddler 解释界面显示“delta”是提高这个示例预测的一个重要因素。
“delta” really stands out, because it’s data leakage.
这个数据集中还有其他更微妙的潜在数据泄漏。例如,等级和子等级由 Lending Club 专有模型分配,该模型几乎完全决定利率。所以,如果你想在没有 Lending Club 的情况下建立自己的风险评分模型,那么 grade、sub_grade、int_rate 都是数据泄露。他们不会让你完美地预测违约,但想必他们会帮忙,否则 Lending Club 不会使用他们自己的模型。此外,对于他们的模型,他们包括 FICO 评分,另一个专有的风险评分,但大多数金融机构购买和使用。如果你不想用 FICO score,那么那也是数据泄露。
数据泄漏是任何你不能或不愿用于预测的预测数据。建立在有泄漏的数据上的模型是有缺陷的。
假设由于糟糕的数据收集或预处理中的错误,我们的数据有偏差。更具体地说,在特征和预测目标之间存在虚假的相关性。在这种情况下,解释预测将显示一个意想不到的特点往往是重要的。
我们可以通过删除邮政编码从 1 到 5 的所有注销贷款来模拟贷款数据中的数据处理错误。在这个 bug 之前,邮政编码并不能很好地预测 chargeoff(一个 0.54 的 AUC ,仅略高于 random)。在这个 bug 之后,任何以 1 到 5 开头的邮政编码都不会被注销,AUC 会跳到 0.78。因此,在根据邮政编码的数据预测(无)贷款违约时,邮政编码将成为一个重要特征。在本例中,我们可以通过查看邮政编码很重要的预测来进行调查。如果我们善于观察,我们可能会注意到这种模式,并意识到这种偏见。
如果用邮政编码的第一个数字来概括,下面是销账率的样子。一些邮政编码没有冲销,而其余的邮政编码的比率与整个数据集相似。
In this buggy dataset, there are no charged-off loans with zip codes starting with 6, 7, 8, 9, 0.
下面,Fiddler 解释 UI 显示邮政编码前缀是降低这个示例预测的一个重要因素。
“zip_code_prefix” really stands out, because the model has a bug related to zip code.
从这种有偏差的数据中建立的模型对于根据我们还没有看到的(无偏差的)数据进行预测是没有用的。它只在有偏差的数据中是准确的。因此,建立在有偏差数据上的模型是有缺陷的。
对于不涉及模型解释的模型调试,还有许多其他的可能性。例如:
- 查找过度配合或配合不足。如果你的模型架构过于简单,它将会不适应。如果太复杂,就会过拟合。
- 对你理解的黄金预测集进行回归测试。如果这些失败了,您也许能够缩小哪些场景被破坏。
由于解释不涉及这些方法,我在这里就不多说了。
如果您不确定模型是否正确使用了数据,请使用要素重要性解释来检查其行为。您可能会看到数据泄漏或数据偏差。然后,您可以修复您的数据,这是修复您的模型的最佳方式。
Fiddler 正在构建一个可解释的人工智能引擎,它可以帮助调试模型。请发邮件至 info@fiddler.ai 联系我们。
原载于 2019 年 7 月 22 日https://blog . fiddler . ai。
数据结构、容器、Kubernetes、知识图表等等…
在这里看完所有的部分:第一部分、第一部分 1b 、第二部分。
在上一篇文章中,我们讨论了知识图的构建模块,现在我们将更进一步,学习构建知识图所需的基本概念、技术和语言。
Image by Héizel Vázquez
目录
- 简介
- 目标
- 集装箱和码头简介
- 什么是容器?
- 我们为什么需要容器?
- 码头工人
- Kubernetes
- 在 Docker 和 Kubernetes 部署 AnzoGraph
- Anzo 和 AnzoGraph 的基础知识
- SPARQL 基础知识
- 齐柏林飞艇在安兹图
- 结论
- 资源
介绍
https://towardsdatascience.com/the-data-fabric-for-machine-learning-part-1-2c558b7035d7
在本系列的上一篇文章中,我谈到了知识图的概念及其与数据结构的关系:
数据结构中的结构是从知识图构建的,为了创建知识图,你需要语义和本体来找到一种链接数据的有用方法,这种方法可以唯一地识别和连接具有常见业务术语的数据。
我还谈到了三元组 : 主体、客体和谓词(或实体-属性-值)以及资源描述框架(RDF)的概念。现在,在所有这些和讨论之后,我们应该准备好创建我们的数据结构了,对吗?没有。
在本文中,我将详细介绍我们需要理解的最后几个部分,以便为我们的公司实际构建知识图和部署数据结构。我将使用由 Cambridge Semantics 开发的独立 AnzoGraph 数据库,并将它与 Docker 和 Kubernetes 一起部署。
可以想象,我们必须了解更多关于容器、docker、kubernetes 等的知识。,但是还有别的。我们需要有一种与数据对话的方式,通常我们用 SQL,但是当你有图形数据时,最好的语言之一叫做 SPARQL,所以我们也将学习它。
本文是一篇教程,提供了关于如何在 Kubernetes 上部署 AnzoGraph 的理论信息,基于剑桥语义的教程:
[## 用 Docker 设置沙盒
编辑描述
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/sandbox-docker.htm)
教程的免责声明:我将测试 MacOS 中的所有东西,但是你可以在上面的链接中找到更多关于其他平台的信息。
目标
在文章的最后,你将能够理解容器、Kubernetes 的基础知识,如何在它们之上构建平台,以及我们将使用的图形数据库语言 SPARQL,所有这些都与独立的 AnzoGraph 图形数据库相关。
集装箱和码头简介
https://www.tintri.com/blog/2017/03/tintri-supports-containers-advanced-storage-features
T 这不会是容器的完整概述,只是足够的信息让你知道我们为什么需要它们。请查看下面的参考资料。
什么是容器?
在 docker 的网页上,有一个关于什么是容器的很好的例子:
软件的标准化单位
容器的正式定义是:
容器是一个标准的软件单元,它将代码及其所有依赖项打包,以便应用程序能够快速可靠地从一个计算环境运行到另一个计算环境。
简而言之,容器是一个隔离的环境,您可以在其中设置执行任务所需的依赖关系。它们类似于虚拟机,但功能不同,因为容器虚拟化的是操作系统而不是硬件。
我们可以想象这样一个容器:
https://www.docker.com/resources/what-container
每个容器都有自己独立的用户空间,允许多个容器在一台主机上运行。
为什么我们需要容器?
容器让我们的生活变得更容易。有了它们,我们可以测试编程环境、软件和工具,而不会损害我们的主操作系统,而且它们在我们产品的分销部分也有惊人的应用。
像本·韦伯、威尔·科尔森、马克·纳格尔伯格和萨钦·阿贝瓦达纳这样的伟人在数据科学领域写了关于容器需求的精彩文章,你可以在下面的参考资料中找到它们。
最大的使用案例是:
- 再现性
- 改善协作
- 节省开发运维时间和数据运维时间
- 更容易分配
当然还有更多,但在数据空间中,这些是最重要的。我们将使用容器创建一个完整的隔离系统来运行 AnzoGraph 数据库,并将其部署在那里。
码头工人
Docker 是创建容器的最佳工具。Docker 是一个基于 Linux 容器的开源项目。
Docker 容器映像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
Docker 图像更像是蓝图。图像是不可变的主模板,用于抽取完全相同的容器。
这是使用 docker 的基本工作流程:
https://towardsdatascience.com/digging-into-data-science-tools-docker-bbb9f3579c87
我们将使用 docker 和 kubernetes(见下文)来部署我们的 AnzoGraph 实例,所以我们需要做的第一件事是安装 docker。在此之前,您需要知道使用 docker 运行 AnzoGraph 有一些要求:
- Docker 版本:需要 Docker 社区版 18 版或更高版本。
- 操作系统 : MacOS、Linux、Windows 10 专业版或企业版。Docker 使用虚拟机管理程序,主机服务器必须支持虚拟化。由于较旧的 Windows 版本和 Windows 10 家庭版不支持 Hyper-V,Windows 上的 Docker 需要 Windows 10 Professional 或 Enterprise。另外,在 Windows 上使用 Docker CE 时,配置 Docker 使用 Linux 容器。不支持使用 Microsoft Windows 容器,因为它为 Windows 容器服务实例提供 Windows API 支持。
- 可用内存:最低 12gb;推荐:32 GB。AnzoGraph 需要足够的 RAM 来存储数据、中间查询结果和运行服务器进程。Cambridge Semantics 建议您分配 3 到 4 倍于计划数据大小的 RAM。
- 可用磁盘空间 : AnzoGraph 内部需要 10 GB。加载文件转移、持久化或备份所需的额外磁盘空间量取决于要加载的数据的大小。对于持久性,Cambridge Semantics 建议您在服务器上拥有两倍于 RAM 的可用磁盘空间。
- CPU 计数:最小值:2;推荐 4+。
让我们从安装 docker 开始。对于 Mac,请点击此处:
[## Mac Docker 桌面- Docker Hub
在 Mac 上开始使用 Docker 的最快和最简单的方法
hub.docker.com](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
点击获取 Docker:
并按照 Docker 文档中的说明安装和运行 Docker。
AnzoGraph 映像需要至少 10 GB 的可用磁盘空间和 7 GiB 的可用 RAM 来启动数据库。
要调整设置,右击 Docker 图标并选择设置。点击磁盘查看可用的磁盘镜像大小。例如:
根据需要调整磁盘大小,然后点击应用保存更改。点击高级查看 CPU 和内存设置。例如:
根据需要调整数值,然后点击应用并重启以应用更改并重启 Docker。
注意:为了记录,我使用了 80GB 的磁盘和 16GB 的内存。
库伯内特斯
https://svitla.com/blog/kubernetes-vs-docker
首先。Kubernetes 怎么发音?根据这个 GitHub 线程的正确说法是:
koo-ber-nay-TACE
这是我说的:
它的意思是“航海大师”。很酷的名字,不是吗?
所以,如果这是水手,船在哪里?还有,是什么船?
根据官方文档, Kubernetes (K8s) 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。所以“船”就是我们的容器,以及里面的应用程序。Kubernetes 是所有关于抽象的复杂性。
欲了解更多信息,请点击此处:
Kubernetes 基础本教程提供了一个 Kubernetes 集群编排系统基础的演练…
kubernetes.io](https://kubernetes.io/docs/tutorials/kubernetes-basics/)
和下面的参考资料部分。
在 Docker 和 Kubernetes 中部署 AnzoGraph
H 在这里,我们将专注于运动学,因为这是我们如何使用 Kubernetes 和 Docker 与 AnzoGraph。Kitematic 是一个简单的应用程序,用于管理 Mac、Linux 和 Windows 上的 Docker 容器。
所以,我们要做的第一件事就是通过点击苹果菜单中的 Docker 图标并选择 Kitematic 来启动 Docker Kitematic。
这将引导您下载软件:
然后,当所有的东西都安装好后,只需打开 Kinematic 并在搜索字段中键入 anzograph 并找到 anzograph 库:
然后点击 Create 启动 AnzoGraph 部署,您将看到:
等待几秒钟,当您看到消息Press [CTRL+C] to stop
时,按 CTRL+C 关闭引导日志。AnzoGraph 现在在您的 Docker 实例中运行。
现在您可以点击 web 预览来查看 AnzoGraph 在哪里运行:
在我的例子中,它运行在http://localhost:32871/上,但是它可以为你改变。
在登录界面上,输入用户名 admin 和密码 Passw0rd1 ,然后点击登录。
你被录取了!!!你应该会看到这个:
因此,查询部分看起来像 SQL,但不是。什么是 AnzoGraph??我希望你记得。如果没有,我给你出个主意。
Anzo 和 AnzoGraph 的基础知识
https://towardsdatascience.com/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b
你可以用 Anzo 建立一个叫做“企业知识图”的东西。
AnzoGraph 是一个独立的本地大规模并行处理(MPP)图形 OLAP 数据库,旨在提供大数据规模的快速高级分析,AnzoGraph 的一个版本与 Anzo 集成。
随着机器学习和人工智能的发展,图 OLAP 数据库变得非常重要,因为许多机器学习算法本身就是图算法,在图 OLAP 数据库上运行比在 RDBMS 上运行更有效。
图中的节点和边灵活地捕捉了每个数据源的高分辨率孪生数据—结构化的或非结构化的。该图表可以帮助用户快速、交互式地回答任何问题,允许用户与数据进行对话以揭示见解。
所有这些的目标是构建一个数据结构:
数据结构是支持公司所有数据的平台。它是如何被管理、描述、组合和普遍访问的。该平台由企业知识图构成,以创建统一的数据环境。
如果你想了解更多,请查看我在该系列上的文章:
对现有数据的研究如何帮助我们成为更好的数据科学家。
towardsdatascience.com](/ontology-and-data-science-45e916288cc5) [## 图形数据库。有什么大不了的?
继续对语义和数据科学的分析,是时候讨论图形数据库以及它们必须…
towardsdatascience.com](/graph-databases-whats-the-big-deal-ec310b1bc0ed) [## 面向大众的深度学习(…和语义层)
深度学习现在无处不在,在你的手表里,在你的电视里,在你的电话里,在某种程度上,在你的平台上…
towardsdatascience.com](/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b)
SPARQL 基础知识
PARQL 发音为“sparkle ”,是资源描述框架(RDF)的查询语言。如果您想了解更多关于 RDF 的信息,请查看:
在能够开发数据结构之前,我们需要构建一个知识图。在这篇文章中,我将建立一个基础…
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-2-building-a-knowledge-graph-2fdd1370bb0a)
但基本上,RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。RDF 通常用于表示个人信息、社交网络、关于数字制品的元数据等,并提供一种集成不同信息源的方法。
我们将在这里理解 SPARQL 的基础知识,目标是至少理解这个查询:
SELECT ?g (COUNT(*) as ?count)
WHERE {
graph ?g{
?s ?p ?o
}
}
GROUP BY ?g
ORDER BY DESC(?count)
如果您想了解关于 SPARQL 的更多信息,请查看官方文档:
[## RDF 的 SPARQL 查询语言
RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。本规范定义了…
www.w3.org](https://www.w3.org/TR/rdf-sparql-query/)
让我们从一些样本数据开始运行一些查询。在查询控制台上,用以下语句替换默认查询:
LOAD WITH 'global' <s3://csi-sdl-data-tickit/tickit.ttl.gz> INTO GRAPH <tickit>
该语句从 csi-sdl-data-tickit S3 桶上的tickit.ttl.gz目录中加载样本 Tickit 数据。顺便说一下,Tickit 数据集捕获了虚构的 Tickit 网站的销售活动,人们在该网站上买卖体育赛事、演出和音乐会的门票。
数据包括人员、地点、类别、日期、事件、列表和销售信息。通过识别一段时间内的门票移动、卖家的成功率、最畅销的活动和场地以及一年中最赚钱的时间,分析师可以使用这些数据来确定提供什么激励措施、如何吸引新人以及如何推动广告和促销。
下图显示了 tickit 图的模型或本体。圆圈代表数据的主题或类别,矩形代表属性:
https://docs.cambridgesemantics.com/anzograph/userdoc/tickit.htm
然后单击 Run,过一会儿您应该会看到消息“更新成功”
为了检查一切是否正确,运行以下查询:
SELECT (count(*) as ?number_of_triples)
FROM <tickit>
WHERE { ?s ?p ?o }
统计 Tickit 数据集中三元组的数量。您应该得到:
SPARQL 惯例:
- 大写:虽然 SPARQL 不区分大小写,但是为了可读性,本节中的 SPARQL 关键字都是大写的。
- 斜体 :斜体术语是您在查询中替换的占位符值。
- [ ] :表示可选条款。
- | :表示或。指示您可以使用一个或多个指定的选项。
- ^ :表示异或(XOR)。表示您只能选择一个指定的选项。
学习数据库语言的基本部分是选择和检索一些数据。对于类似 SQL 的 SPARQL,提供了一个用于选择或查找数据的选择查询表单。
以下简单的 SELECT 语句查询样本 Tickit 数据集,以返回 event100 的所有谓词和对象:
SELECT ?predicate ?object
FROM <tickit>
WHERE {
<event100> ?predicate ?object
}
ORDER BY ?predicate
您应该看到:
你可能在想什么是*?谓词和?object* 部分是,因为其他的东西,FROM,WHERE 和 ORDER BY,似乎和 SQL 中的一样。
在过去的一篇文章中,我用一个例子解释过:
To have a triple we need a subject and object, and a predicate linking the two.
谓语和宾语的概念来源于三元组的概念。所以你可以看到我们有了主语 < Geoffrey Hinton >与宾语 <研究者>由谓语 <构成>。这对我们人类来说可能听起来很容易,但需要一个非常全面的框架来用机器做到这一点。
你会在其他地方发现这些概念是实体-属性-值。
仅此而已,它们只是我们在构成知识图的图形数据库中的普通名称和概念。
再来做一个例子。我们将在 Tickit 数据集中列出每个不同的事件名称:
SELECT DISTINCT ?name
FROM <tickit>
WHERE {
?event <eventname> ?name.
}
您应该得到:
SPARQL 的另一个重要部分是构造的概念。
我们使用构造查询表单从现有数据创建新数据。构造查询采用每个解决方案,并用它替换图或三元模板中的变量。
以下示例查询指定了一个三元组模板,该模板为样本 Tickit 数据集中的 person 三元组构造了一个新的年龄谓词和大约年龄值:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
CONSTRUCT { ?person <age> ?age . }
WHERE { GRAPH <tickit> {
{ SELECT ?person ((YEAR(?date))-(YEAR(xsd:dateTime(?birthdate))) AS ?age)
WHERE {
?person <birthday> ?birthdate .
BIND(xsd:dateTime(NOW()) AS ?date)
}
}
}
}
ORDER BY ?person
LIMIT 50
您应该得到:
这里,PREFIX 子句声明了您希望在查询中引用的 URIs 的任何缩写。BIND 将表达式的结果赋给一个新变量。WHERE 子句中的图形部分仅用于匹配。其他的我觉得和 SQL 很像,可以理解。
我们可以用子句 ask 向我们的图提问。我们使用 ASK 查询表单来确定特定的三元组模式是否存在于指定的数据集中。ASK 返回 true 或 false,这取决于解决方案或匹配是否存在。
例如:
ASK FROM <tickit> { ?s <eventname> "Wicked" . }
对于这一个,你将得到真😃
我们将使用的最后一个子句是 DESCRIBE。我们使用 DESCRIBE 查询表单返回与指定资源相关联的所有三元组,而不仅仅是绑定到您指定的任何变量的三元组。
例如,以下简单的 DESCRIBE 示例查询样本 Tickit 数据集,以描述与 person2 相关联的所有资源:
DESCRIBE <person2>
FROM <tickit>
您将获得:
s | p | o
--------------+-------------------------------------------------+------------------
person6048 | friend | person2
person9251 | friend | person2
listing30988 | sellerid | person2
sales28393 | sellerid | person2
sales28394 | sellerid | person2
person2 | lastname | Humphrey
person2 | like | musicals
person2 | birthday | 1995-01-03
person2 | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | person
person2 | card | 9955429152637722
person2 | city | Murfreesboro
person2 | friend | person48892
person2 | friend | person15323
...
99 rows
关于 SPARQL 还有很多要学习的,另一个很好的信息来源是剑桥语义本身的 SPARQL 参考:
[## SPARQL 参考
AnzoGraph 实现了 W3C SPARQL 1.1 查询语言中描述的标准 SPARQL 形式和函数…
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/sparql-ref.htm)
齐柏林飞艇
我们要讨论的最后一部分是如何使用 Zeppelin 并将其与独立的图形分析数据库 AnzoGraph 连接。Zeppelin 是一款基于网络的笔记本电脑,类似于 Jupyter,我们将使用它的部署来拥有一个集成的 SPARQL 解释器,使我们能够使用 gRPC 协议与 AnzoGraph 建立一个安全的、经过身份验证的连接。
第一步是访问 docker CLI 并选择一个文件夹来存储 Zeppelin。我是这样做的:
- 打开 Kinematic 并点击 Docker CLI
2.选择一个文件夹,然后运行:
[ -d $PWD/logs ] || mkdir -p $PWD/logs
[ -d $PWD/notebook ] || mkdir -p $PWD/notebook
最后,运行以下命令,在端口 8080 上下载并运行 Zeppelin 映像:
docker run -p 8080:8080 --name=zeppelin -v $PWD/logs:/logs -v $PWD/notebook:/notebook \
-e ZEPPELIN_NOTEBOOK_DIR='/notebook' \
-e ZEPPELIN_LOG_DIR='/logs' \
-e ZEPPELIN_WEBSOCKET_MAX_TEXT_MESSAGE_SIZE=10240000 \
-d cambridgesemantics/contrib-zeppelin:latest \
/zeppelin/bin/zeppelin.sh
部署完成后,在浏览器中转至以下 URL 打开 Zeppelin:
[http://localhost:8080/#/](http://localhost:8080/#/) # this may be different
此刻您应该会看到这个屏幕:
要连接 AnzoGraph,点击匿名下拉列表,选择翻译:
现在输入“sparql”并找到 SPARQL 解释器:
点击编辑按钮,修改解释器,输入您的 AnzoGraph 部署细节,并与数据库建立安全连接:
- anzo . graph . host:AnzoGraph 主机的 IP 地址。
- anzo . graph . password:anzo . graph . user 字段中用户的密码。
- anzo.graph.port :用于 AnzoGraph 的 gRPC 端口。默认值为 5700 。不要更改该值。
- anzo.graph.trust.all :指示 Zeppelin 信任 AnzoGraph SSL 证书。接受默认值真。
- anzo.graph.user :登录 AnzoGraph 的用户名。
添加完连接详情后,点击屏幕底部的保存。Zeppelin 会显示一个对话框,询问您是否要使用新设置重新启动解释器。点击确定配置连接。
当解释器重新启动完成时,单击屏幕顶部的 Zeppelin 徽标返回到欢迎屏幕。
现在使用平台下载 AnzoGraph 教程 Zeppelin 笔记本,并在电脑上解压下载的笔记本 ZIP 文件。ZIP 文件包含 AnzoGraph-Tutorial-notebook . JSON。
在 Zeppelin 欢迎界面上,点击导入注意:
在导入界面,点击选择 JSON 文件,然后选择要导入的 AnzoGraph-Tutorial-notebook . JSON 文件。现在,要在文件中运行查询,请单击该段落的 run 按钮。看一下我们讨论 SPARQL 的上一节,以理解这些查询:)
你应该会看到这个:
结论
这只是我们创建数据结构过程的开始。到目前为止,我们已经建立了理论框架,现在是在本地推出 AnzoGraph 的第一个实际步骤。
我们学习了容器、Docker、Kubernetes、SPARQL、RDF 和 Zeppelin,以及如何查询图形数据。如果你已经知道 SQL,这种改变并不疯狂,但是你需要了解一门新的语言。
在未来,我们将把我们的“公共数据集”转换成图表,然后开始构建我们的知识图表和数据结构,在其上运行查询,最后通过机器学习来预测未来。
感谢您的阅读,如果您想了解更多信息,请关注我这里,以及 LinkedIn 和 Twitter:
[## 法维奥·瓦兹奎-科学与数据公司创始人/首席数据科学家| LinkedIn
加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/) [## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
资源
如果你是一个程序员或技术人员,你可能至少听说过 Docker:一个打包、运输…
medium.com](https://medium.com/free-code-camp/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b) [## 创业公司的数据科学:容器
为机器学习构建可重复的设置
towardsdatascience.com](/data-science-for-startups-containers-d1d785bfe5b) [## 没有麻烦的码头工人
使用 repo2docker 自动构建 docker 容器
towardsdatascience.com](/docker-without-the-hassle-b98447caedd8) [## 挖掘数据科学工具:Docker
Docker 是一个创建和管理“容器”的工具,它就像一个小虚拟机,你可以在其中运行你的…
towardsdatascience.com](/digging-into-data-science-tools-docker-bbb9f3579c87) [## 数据科学码头工人
Docker 是一个为软件工程师简化安装过程的工具。来自统计背景的我…
towardsdatascience.com](/docker-for-data-science-4901f35d7cf9) [## Kubernetes 的关键概念
云计算、容器化和容器编排是 DevOps 中最重要的趋势。无论你是…
towardsdatascience.com](/key-kubernetes-concepts-62939f4bc08e) [## RDF 的 SPARQL 查询语言
RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。本规范定义了…
www.w3.org](https://www.w3.org/TR/rdf-sparql-query/) [## AnzoGraph 部署和用户指南
欢迎使用 AnzoGraph 部署和用户指南!本指南包括 AnzoGraph 部署说明、指南和…
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/home.htm)