TowardsDataScience 博客中文翻译 2016~2018(一百二十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

流派精要——建立专辑推荐系统

原文:https://towardsdatascience.com/genre-essentials-building-an-album-recommender-system-c89c308d16f0?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个想法

为了练习我的 Python 技能并探索推荐系统的内部工作方式,我决定使用协作过滤来构建一个推荐系统,该系统基于以音乐专辑的用户评级形式的明确反馈。我自己提出的一个约束是我不会使用任何外部库。因此,我没有使用黑盒库方法,而是自己编写了所有代码。

4chan 的音乐鉴赏家创作的generessentials的主要灵感来源是 mu/essential 图表。这些专辑选曲帮助听众对音乐类型有一个基本的了解。每个图表由黑色背景上的专辑封面网格组成,并附有专辑标题列表,以帮助用户识别有问题的专辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Essential Black Metal

我已经使用这些图表很长时间了,它们帮助我找到了一些我最喜欢的专辑(例如。九州——欢迎来到天空谷),它们很棒……但是……它们不切实际。首先,我必须从列表中随机选择一张专辑封面,然后浏览列表找到相应的标题,在音乐流媒体网站上查找,开始听它,如果不好就从头开始。这个过程不仅浪费时间,而且由于下一张专辑的选择是随机的,它还浪费了潜在的有用信息——用户已经听过的专辑列表。

GenreEssentials 保留了这些图表的基本概念,并用推荐系统扩展了它们,该推荐系统可以预测用户将喜欢的专辑列表,并根据这些预测生成个性化的收听顺序。只需点击一下,用户就可以在 YouTube 上找到专辑,听听它,然后在提供反馈后,网络应用程序根据用户的偏好对图表进行排序。

1.获取数据

该应用的架构由两个主要组件组成,一个用 Java 和 Python 编写的数据管道和一个用 JavaScript 编写的演示模块,部署在 PHP 服务器上。我最初的意图是只用 Java 编写 scraper,用 Python 编写数据挖掘模块,但是我对自己的和机器的 Python 缓慢性能感到沮丧,所以我最终用 Java 编写了大部分代码。

管道的输入是包含专辑列表的 TSV 文本文件。Java web scraper 模块解析列表,使用 JSoup 在公共 API 和 web 上查找每个相册,使用 Hibernate 将其映射到一个模式,并将其作为相册包保存在 MySQL 数据库中。大部分信息是从 Discogs、LastFM 和维基百科 API 获得的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GenreEssentials Architecture

数据争论和挖掘模块读取相册包,分析数据,对其执行各种矩阵操作,并使用 Jackson 输出 JSON 包列表。表示层托管在 PHP 服务器上,数据用 d3.js 可视化,UI 交互用 knockout.js 和 jQuery 处理。

2.了解数据

在收集了我需要的所有数据后,第一步是将这些数据转换成有用的格式。我为每张专辑收集了三类信息:风格&流派、标签和用户评分。目标是将它们转换成向量空间模型,这样它们就可以被比较、分解等等。以获得对它们之间关系的有价值的见解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Album information example

风格和流派信息被组合形成一个关联矩阵,其中每行代表一个专辑的术语向量,每个术语的出现得到一个二进制权重。我增加了从中获得有用信息的机会,方法是将每个术语转换为小写,用空格替换破折号、与号和斜线,分解多词术语,并将这些新术语添加到集合中。例如,虽然在原始设置中[“psy-trance”]和[“trance”]是零匹配,但是现在在[“psy “、” Trance “、” psy trance”]和[“trance”]之间有一些重叠。

对于标签“clouds ”,我也有每张专辑的出现次数,所以我使用了与风格和流派相同的替换和拆分方法,但这次我还必须给新术语一些虚拟权重。我决定将原始术语的出现拆分到新术语中。例如,如果一张专辑的标签“另类摇滚”被使用了 240 次,我就添加了 120 x“另类”和 120 x“摇滚”。

可能到目前为止,我得到的最相关的信息是用户评分。我把这些想象成一个 UxI 矩阵来获得第一印象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sparsity of the Rating Matrix of the Pink Floyd Discography

如你所见,它相当稀疏。一些用户对一张专辑进行了评级,使得他们在专辑相似性方面或多或少不相关,所以我最终删除了他们以减少维度。但在此之前,我提取了他们确实会影响的所有相关信息,即总评分(衡量每个项目的知名度)和平均评分(衡量“喜欢”它的程度)。我将该信息存储在 Ix5 矩阵中,其中专辑向量的 5 个值是投票计数,并使用它来确定专辑列表的初始顺序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Essential Metal Albums sorted by average rating with rating distributions visualized

看着相对于总评分和相对于专辑自身评分的评分分布的可视化,我们可以问这样一个问题:这些评分真的有多大意义?如果我们按平均评分对专辑进行排序,我们可以看到,例如 *EyeHateGod,*一个有点地下的乐队拥有最高的平均评分,而“对机器的愤怒”,一个最受欢迎的乐队在名单的下半部分。以 IMDb 为例通过给每一票分配权重来平衡铁杆粉丝的热情,从而消除了这种极端情况。

另一方面,总评分提供了一个很好的专辑受欢迎程度的估计,所以我决定用它作为列表初始排序的基础。

计算相似度

共享评级也揭示了专辑之间的一些相关联系,这给了我探索专辑相似性的想法。计算每个专辑对之间的联系或相似性将产生 IxI 评级-相似性矩阵。因为我已经有了向量空间模型形式的所有数据,所以我可以使用相似性度量从中提取有价值的信息。我将我拥有的 3 个矩阵缩减为 3 个方阵,然后将它们合并在一起。矩阵的值根本不同,所以我不得不选择稍微不同的方法来度量相似性。

算计风格&流派相似点

由于风格&流派向量值是二进制的,所以可以通过使用余弦相似度来计算项目之间的距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果原始值为正(我们的情况),余弦相似性将向量之间的角度映射到[-1,1]或[0,1]的范围。它对相似之处给予了很高的奖励,而没有惩罚差异,所以在这种情况下这是一个很好的选择。这样,IxN 矩阵可以简化为 IxI 矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Comparing genres & styles with Cosine Similarity

计算标签相似度

虽然风格&流派矩阵是二进制的,但是标签矩阵值保存标签计数信息,所以它也是严格正的,但是在可以计算它们之间的相似性之前,必须对这些值进行缩放和平滑。

这个矩阵的一个不便之处是,一些不太出名的专辑在最后一张里没有找到。所以我即兴使用了他们的风格和流派术语。因此,这些专辑的总标签数低于 10,而其他专辑有 100 个标签。这意味着一个不太受欢迎的专辑将错过标签,不是因为这些标签是不相关的,而仅仅是因为标签数量相差很大。为了平滑这一点并减少假阴性的数量,我选择牺牲一些细节,使专辑彼此更加相似。我将计数调整到 0 到 20 之间,并应用 k=1 的拉普拉斯平滑,以确保原始计数和为平滑而添加的计数之间的比率为 1:20,并基于这些值计算余弦相似性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算评分相似度

使用余弦相似度进行评级的问题在于,它对于变化并不是不变的。换句话说,它认为一个给专辑 A 和专辑 B 都打 1 星的用户和一个给 5 星的用户非常相似。我们真的不知道 1 分实际上意味着什么,但更有可能的是,给予 1 星评级更多的是强烈的负面反应,而不是轻微的正面反应。这很重要,因为就矢量而言,尤其是余弦距离而言,原点的不同位置会导致完全不同的相似系数。

如果我们将评级相对于它们的平均值(假设是 3)居中,以前的 1 星和 5 星评级现在变成了-2 和+2,它们之间的角度从 0°变为 180°,它们的余弦相似度从 1 变为 1。例如,假设我们想要比较两个项目,一个项目获得了两个评分[1,1],另一个项目获得了[4,5]。得到的余弦相似度将接近 1。将数据集移动到中心将导致向量[-2,-2]和[1,2]以及接近-1 的相似度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

center shifted Cosine Similarity

因此,如果我们想要更精确,我们可以计算评级的平均值来确定数据集的真正中心,然后从所有评级中减去它。还可以使用皮尔逊相关系数来计算中心的相似性不变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

adjusted cosine similarity

在计算所有 3 个相似性矩阵之后,可以通过计算加权平均值来合并它们,以形成单个正方形矩阵。结果可以用热图的形式显示出来。矩阵是对称的,因此为了节省空间,它可以旋转 45 度并切成两半:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Combined similarities in a random selection of Essential Oldies

3.数据挖掘

对数据集有了基本的了解之后,在深入挖掘之前,应该问一些具体的问题。我到底想知道什么?

这个实验的主要目标是能够根据已经听过和评价过的专辑和/或根据社区的评价(如果用户还没有评价过任何专辑)来对未听过的专辑进行排名。

选择和微调算法是一个反复试验的过程。我的方法是选择一条路,走几步,衡量结果,然后重新评估计划。

计划 A:使用矩阵分解的基于用户的协同过滤

在大多数情况下,推荐系统可以使用的最有价值的信息是评级形式的用户偏好,因为我拥有这些信息,所以围绕这些信息构建算法是一个显而易见的选择。

协同过滤是一种流行的评分预测方法,其基于具有相似品味的用户将对一组项目给出相似评分的假设。例如,一个基于用户的实现将首先找到与当前用户最相似的用户,然后根据这些“邻近”用户给出的评级来预测给定项目的评级。当我们没有关于当前用户的足够信息(冷启动)或者当我们没有足够相似的邻居(稀疏性)时,问题就出现了。

我们如何计算用户的品味或一个项目的质量?假设评级不是随机的,我们可以想象它们是基于一个项目的特性列表和用户对这些特性的偏好列表。实际上,这两个向量不仅是无限的,而且它们的值根据一天中的时间、用户的情绪等不断变化。从数学意义上来说,我们可以把评级的形成想象成特征向量和偏好向量的点积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ratings determined by user preference and item characteristics

当然,不难看出,在计算我们的估计值时,我们考虑的特征数量将对准确性产生积极影响,对计算速度产生消极影响(在某些情况下,会以指数方式减慢计算速度)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

accuracy vs. computation time trade-off

我们的目标是估计这两个无限向量,通过丢弃或组合特征将它们减少到其本质,同时保持结果尽可能接近实际值。每个项目或用户的高度相关特征的数量很少,其余特征的值接近于零。不幸的是,消除这些特性是不可能的,因为它们可能对另一个项目非常重要,所以减少特性数量的最有效方法是将它们组合并分组到相关的桶中。

矩阵分解或矩阵分解是一种技术,简单地说,它帮助我们计算这些最相关的特征桶。已知评级矩阵 R 是包含用户偏好值的矩阵§和包含项目特征值的矩阵(Q)的乘积,我们的目标是尽可能精确地估计这两个未知矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

R = rating matrix, P = user latent feature matrix, Q = item latent feature matrix

计算这些矩阵的值是一个迭代过程,这意味着成本函数的最小化,该成本函数由误差(实际评级-估计评级)加上通常用于保持特征接近于零以避免过拟合的正则化因子加上可以提高精度的任何其他权重来确定。这将导致基于函数梯度的更新公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

η = learning speed, λ = regularization factor, e = error

这种迭代估计最流行的方法是梯度下降和交替最小二乘法,它间歇地固定一个矩阵并调整另一个矩阵。我选择实现一个基于梯度下降的解决方案,选择一个 9 的特征计数,并用 Python 训练模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

latent feature similarities (visualized as radial “petals”)

我在 UI 逻辑中也使用了梯度下降。我根据社区的平均偏好初始化当前用户的用户偏好向量,然后在每次用户对新专辑进行评级后,我重新训练这个向量,以准确匹配给定的评级。然后我预测了其他所有专辑的评分,按升序排序。

不幸的是,在几次 UI 测试运行之后,我发现这些预测是相当随机的。我的结论是,评级数据过于嘈杂和/或过于稀疏。在训练模型时,我认为空评级是不相关的,但也许我可以通过为现有评级分配 1 的重要性权重来改进模型,并降低重要性权重,如 0.01 到 0/缺失评级。

我也不喜欢 MF 方法,因为在训练模型之前的随机初始化,结果不仅是随机的,而且在单次运行之间也不一致。我想要每次都给出相同固定结果的东西,所以我决定后退一步,把事情简化一点。

B 计划——结合协作和基于内容的过滤进行基于项目的排名

虽然矩阵分解和潜在特征绝对值得探索,但我意识到我可以用更简单的方法更快地实现我的目标,所以我简单地建立了基于组合余弦相似矩阵的排名系统。因为我处在一个舒适的环境中,最大项目数只有大约 300 个,了解项目对之间的距离大大简化了这个过程。基于内容的过滤是另一种过滤方法,利用用户简档和物品简档的相关性对物品进行排名。我使用了现有的风格、流派&标签信息来帮助我提高预测的准确性。

基于项目的 CF 是基于用户的过滤的镜像方法:作为第一步,它找到与当前项目最相似的 n 个项目,然后根据其邻居的评级预测其评级。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

item based collaborative filtering

我对预测收视率不感兴趣,所以我决定使用这个公式的修改版本,只保留公式的红利。这样,即使用户只给了 5 分,我也能对项目进行排序。对于每一张未评级的专辑,我将 T2 k 张最相似的 T3 张专辑的相似度按照它们的评级进行加权,然后根据这些总和对列表进行排序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k nearest neighbors

4.数据可视化

名单

对于主图表,我使用了 knockout.js,这是一个极简的前端框架,可以非常容易地将事情联系在一起。图表数据从几个 JSON 文件中读取,然后使用 knockout 呈现。点击一个相册会打开一个带有详细相册信息的旁白。在这里,用户可以对专辑进行评级,这将把它从“未听过”列表移到屏幕左侧的“听过”列表。这触发了预测专辑分数的重新计算。每个“听过”的专辑通过它们的评级来加权(转移到[-2,2]范围),并且每个“没听过”的专辑基于与“听过”的专辑的相似性距离接收新的预测得分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

List View of the Essential Electronic Albums

在重新计算预测得分后,图表被排序,因此用户最可能喜欢的项目总是在列表的顶部。

图表

和弦图最初并没有计划成为应用程序的一部分,它只是我更好地理解数据集的一个工具。但它看起来很酷,所以我决定留着它。它显示每两个相册之间的组合(标签+风格+评分)相似性。

我考虑了几种可能性,具体来说,共同评分的数量会很有趣,但评分计数之间存在巨大差异,所以即使我对它们进行了缩放,也存在太多差异。我最终使用了组合相似度。为了降低图表的复杂性,我选择只显示前 5 个最相似专辑的链接。

我根据相应相似性的强度缩放了每个连接弧的宽度和不透明度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Chart of Essential Jazz Album Similarities

地图

除了列表和图表之外,我认为创建一个 2D 地图来表示数据,以便能够看到相册的位置、它们的链接、组和簇,这将是很好的。

为了获得数据集的 2D 投影,我考虑同时使用主成分分析t 分布随机邻居嵌入。T-SNE 似乎更适合我的情况,因为我的首要任务是保持距离,但 PCA 似乎更直观,我可以自己编写算法而不会浪费太多时间,所以我选择了 PCA。

我运行算法并在 d3 中可视化地图。虽然看起来还可以,而且各个子风格都清晰地聚集在一起,但当我将 5 个最相似的相册链接可视化时,发现它们在地图上并不一定紧挨着。为了解决这个问题,我做了一点手脚,用了一个 d3 力模拟来放松距离。我在 d3 模拟中添加了一些力来使相似的专辑更接近,另一个力迫使图形根据画布的比例来塑造自己。最后,我在图表上应用了一个比例因子,使它很好地适合屏幕。有 250 多个节点时,模拟非常慢,所以我导出了结果坐标,并重用它们来加速这个过程。

应用一些聚类方法来分离专辑组,对它们进行颜色编码,或者基于与专辑相同的空间来计算标签云的 2D 投影并覆盖它,这将是很有趣的。我尝试将 PCA-reduced 或 MF-latent 特征作为径向表示,但对于不了解背景过程的人来说,它们没有多大意义。我认为将这些可视化在一个单独的图表中更有意义,也许结合一些与每个特性相关的标签和样式信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Map of Dream Theater Album Similarities

结论

玩矩阵有点像玩魔方。如果你知道正确的算法,你就可以一层一层地把所有的东西放好,更高层次的东西就会开始显现出来。我在这个项目中探索的数据挖掘和机器学习工具非常容易理解和使用,但是惊人的强大。在我看来,获得最佳结果的关键不仅是拥有正确的工具集,最重要的是对数据的结构和纹理有很好的理解。选择应用哪种算法总是取决于具体的情况,所以下一次我将玩一个类似的项目,我肯定会从探索和可视化数据集的更多方面开始。我发现收集的数据非常有趣,我将来一定会再次访问它,可能会使用 TensorFlow 实现。

#GENSummit 2018: AI 在出版领域的突破之年

原文:https://towardsdatascience.com/gensummit-2018-ais-breakthrough-year-in-publishing-6fa5a78154be?source=collection_archive---------3-----------------------

这篇文章最初发表在在线新闻博客 上。

本周的 GEN 峰会标志着人工智能(AI)在媒体行业的突破性时刻。这个话题主导了会议前两天的议程,从脸书的 Antoine Bordes 开幕主题演讲到人工智能、机器人、货币化和验证——它也主导了我的时间表。

有时感觉像是在 20 世纪 80 年代的一次会议上,讨论如何在新闻编辑室使用“计算机”,或者听人们谈论手机在 21 世纪初用于新闻业——换句话说,感觉非常像早期。但仍然是重要的日子。

Ludovic Blecher 关于获得Google Digital News Initiative资助的人工智能相关项目的幻灯片最好地说明了这个问题,这些提案被分为具体的“个性化”和模糊的“超本地”等类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Marc Springer

那么,深入挖掘一下,以下是我从里斯本学到的一些最具体的观点——以及记者和出版商可以从中得到的启示。

“智能”和你可以教的机器人之间的区别

**本尼迪克特·埃文斯(Benedict Evans)**周四的主题演讲无疑是峰会上最清晰的演讲之一,他成功地从定位(“什么是机器学习”)到潜在应用,再到问题化。

这个演讲呼应了我最近参与的其他讨论,围绕着从谈论人工智能转向像机器学习这样的术语的必要性——能够识别模式,利用这些模式在干草堆中寻找针,自动化重复行为,预测可能性和可能性,等等。

在“人工智能”威胁机器人统治者和机器人新闻业的地方,机器学习更明显地涉及到教一个相对“愚蠢”(但相对而言也是聪明)的机器人如何做我们没有时间或一致性去做的部分工作的过程。

但强大的力量带来了巨大的责任——埃文斯对我们作为其中一部分创造的算法的准确性(特别是由输入形成的)和结果的潜在社会影响之间的责任进行了有益的区分。即使是精确的算法也会产生不良结果。

算法责任和通往可理解性的道路

Jonathan Albright 也提出了类似的观点,他更广泛地谈到了的算法问责制:当涉及到算法对公共和私人生活的影响时,记者的监督作用。

奥尔布赖特的关于“危机演员”YouTube 视频谷歌搜索建议——以及 ProPublica机器偏见系列——作为该领域的介绍,非常值得探索。可能已经开始成为技术和政治节拍特征的东西显然最终将在每个领域发挥重要作用:从报道犯罪、住房到教育、T21、健康,甚至音乐、电影。

媒体公司是最早也是最常见的算法受害者之一,这很有帮助。我们敏锐地意识到,这些食谱中的一个小变化会如何影响我们的观众是否以及如何接受我们的新闻报道,正如艾米丽·贝尔的谈话所示

现在需要的不仅是对算法如何影响我们的社区的认识(以及对此进行报道的愿望),还有对我们自己对算法的依赖的反思态度——以及对此透明的需要。

Nick Diakapoulos工作为主题奠定了一些重要的基础,包括算法透明度的限制和潜在的披露机制,而美联社的 Stuart Myles 已经就算法新闻谈到了同一主题,确定了算法透明度的四个级别。

(一些)数据新闻的商品化——以及从自动化到增强的转变

Frames、Grafiti、RADAR 和 Le Parisien 的 LiveCity 项目显示了数据新闻已经从例外走向了商品化。

Frames 提供一项服务,为新闻机构提供现成的图表,嵌入到他们的文章中,并提供收入共享商业模式,图表也可以通过这种模式得到赞助(他们一直在与一家葡萄牙新闻机构合作,并且声称包含图表可以带来更高的共享和再循环)。

与此同时,Grafiti 的目标是在建立一个图表作为数据的搜索引擎的同时,让图表的社交创作变得更加容易。RADAR 建立了英国最大的数据新闻团队之一,向当地出版商提供新闻专线式的副本;《巴黎人报》正在以个性化小工具的形式将城市数据整合到文章中。

换句话说,数据新闻开始规模化。对于数据记者来说,这意味着两件事:要么从低挂的果实转向更复杂或调查性的故事,要么进入数据新闻本身的规模(即编码)。

…或者,当然,两者兼而有之。

聊天机器人和叙事,机器人和新闻编辑室

与此同时,聊天机器人正朝着相反的方向发展——尽管许多新闻行业的聊天机器人到目前为止只不过是一个美化了的 RSS 警报,Quartz 的约翰·基夫和 BBC 的保罗·萨金特表明,我们越来越多地看到编辑技巧更复杂地应用于表单。

“一个好机器人的成功,”基夫解释道,“是真正的好人。”

换句话说,聊天机器人不仅代表了一个技术挑战,也代表了一个叙事挑战——萨金特在文章中谈到了 BBC 将聊天机器人作为讲故事设备的实验,比如一篇关于英国旁遮普人之间未言明的酒精问题 的文章,而基夫强调了“为机器人编写故事情节的非常有才华的人”以及广告商对这些技能的需求,这使得机器人团队分成了编辑和商业两部分。

“我们发现,我们的才能和我们与一些客户之间的故事有市场。”

这种方法肯定是有效的:BBC 关于皇家婚礼的文章包含了内部聊天机器人看到了 20%的用户使用这些小工具,“通常会问多达五六个问题”。他说,聊天机器人可能不会增加覆盖范围,但会增加参与度。

在 Quartz Keefe,类似地报告说“90%的人一开始就坚持到底。

真正的价值不在于接触到更多的人,而在于加深与你接触到的人的关系

然而,叙事技巧的使用似乎在用户对交互性的期望和传播特定事实的新闻压力之间引入了一种张力。

在另一个单独的会议中 BBC 视觉新闻的 Bella Hurrell 会注意到他们的故事机器人的测试者错过了“直接写文本,问机器人他们自己的问题”的选项

也许人工智能在行业中的越来越多的使用将有助于部分解决这种紧张——事实上,萨金特他认为聊天机器人是“一种过渡形式”。我们知道我们要整合 AI,一起聊天。

“做这些(聊天机器人)你会学到很多关于如何语气,以及如何组织这些对话和讲故事[让你]在人工智能到来时处于有利位置”

与此同时,越来越多的机器人正在开发供内部使用。

Quartz 的 quack bot(GitHub 上的代码 ) 帮助记者缓存网页副本并建议数据来源,而 BBC 使用机器人自动生成选举图片并在 @bbcelection 账户上发布这些图片,Dagens Nyheter 的Martin jnsson已经创建了一个“性别机器人”(“genus roboten”)来帮助记者了解他们的报道有多大代表性

美联社一直在探索技术在验证、转录、个性化和图像识别方面的潜力。他们的人工智能战略小组负责人丽莎·吉布斯 建议“我可以在人工智能(新闻工作的自动化部分)和我们的商业记者能够做的调查性新闻报道的增加之间画一条直接的线。”

如果有一个领域发生自动化与增强之战,一个将算法问责付诸实践并试验人工智能和口述可能性的地方,可能没有比机器人更好的地方了。

第一次介绍 SELUs 以及为什么你应该开始使用它们作为你的激活功能

原文:https://towardsdatascience.com/gentle-introduction-to-selus-b19943068cd9?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Nick Fewings on Unsplash

标度指数线性单位(或 SELUs)于 2017 年 9 月首次出现在本文中。虽然 SELUs 很有前途,但并不像你想象的那么普遍。在这篇博文中,我通过将它们与激活函数的事实标准联系起来来介绍它们:校正线性单位(或 ReLUs)。我先从为什么 ReLUs 没有结束关于激活函数的讨论开始。然后,我转向 SELUs 的主要优势:内部规范化。读完这篇文章后,你会对 SELUs 有一个直观的理解,以及为什么你应该在你的神经网络中使用它们而不是 ReLUs。如果你需要复习激活功能,我推荐这篇由 SAGAR SHARMA 撰写的优秀文章。

为什么 ReLUs 不够?

人工神经网络通过称为反向传播的基于梯度的过程进行学习。我强烈推荐这个由 3Blue1Brown 制作的视频系列作为介绍。基本思想是网络在梯度指示的方向上更新其权重和偏差。

反向传播的一个潜在问题是梯度会变得太小。这个问题被命名为消失渐变。当你的网络遭遇渐变消失时,权重不会调整,学习也就停止了。在高级别上,深度网络在反向传播期间会倍增许多梯度。如果梯度接近零,整个产品下降。这反过来又推动其他梯度更接近零,以此类推。让我们来看看激活函数的事实标准 ReLUs 是如何防止这种情况的。

下面是一个 ReLU 如何将输入(在 x 轴上,在文献中命名为 z )映射到输出(在 y 轴上,命名为 a 用于激活):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ReLU 的规则很简单。如果 z 小于零, a 为零。如果 z 大于零,输出保持 z 。换句话说,ReLU 用零替换负值,而保持正值不变。这个激活函数的梯度非常简单。小于零的值为零,否则为一。这就是 ReLU 防止渐变消失的原因。没有接近零的梯度,这可能会减少其他梯度。信号要么继续流动(如果梯度为 1),要么不流动(如果梯度为零)。

然而,ReLUs 有一个潜在的问题:它们可能陷入停滞状态。也就是说,权重的变化如此之大,并且在下一次迭代中得到的 z 如此之小,以至于激活函数停留在零的左侧。受影响的细胞不再对网络的学习有贡献,并且其梯度保持为零。如果这种情况发生在你的网络中的许多单元上,那么经过训练的网络的能力将低于其理论能力。你摆脱了消失渐变,但现在你必须处理垂死的 ReLUs

ReLU 在计算简单性方面非常出色,所以我们希望尽可能多地保留它,但同时也要处理神经元死亡的问题。形象地说,ReLUs 的墓地在 y 轴的左侧,这里 z 为负值。将墓地变成生命之地的一个突出方法是所谓的 *leaky ReLU。*看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,现在左侧有一个斜坡。这个斜率通常很小(例如 0.01),但它确实存在,所以总是有学习发生,细胞不会死亡。Leaky ReLUs 保持了计算的简单性,因为只有两个不同的和恒定的梯度是可能的(1 和 0.01)。左边的斜率定义了梯度消失的风险。

到目前为止,我们似乎必须在两种风险之间做出选择:死亡神经元(ReLU)或自我施加的消失梯度风险(leaky ReLU)。在这种权衡中,比例指数线性单元 (SELU)处于什么位置?它看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稍后我会展示实际的公式,但是乍一看,您可以看到两件事情。首先,右边(对于大于零的 z T21)类似于 ReLUs。然而,左侧(对于小于零的 z 来说)似乎接近零的梯度。那不是消失渐变的回归吗?那么,如果 SELU 重新引入了一个我们已经和 ReLUs 解决过的问题,为什么还要考虑使用它呢?答案是控制梯度只是一种方法。塞卢斯拿另一个:正常化。

正常化是怎么回事?

就神经网络而言,标准化可以在三个不同的地方发生。首先是输入归一化。一个例子是将灰度图像(0-255)的像素值缩放到 0 和 1 之间的值。这种类型的规范化是机器学习中的一般概念,并被广泛使用。输入规范化对一些算法至关重要,对另一些算法很有帮助。在神经网络的情况下,严格来说这不是必需的,但是很好的实践。

第二,这次与神经网络特别相关的是批量标准化。见此处Jaron Collis 提供的深入解释和编码示例。在网络的每一层之间,对值进行转换,使它们的平均值为零,标准差为一。这种方法有几个优点。关于激活函数的主要一点是,它限制了值,使极端值不太可能发生。

第三,还有**内部正常化,**这就是 SELU 的神奇之处。主要思想(详见原文)是每一层都保留了前一层的均值和方差。那么 SELU 是如何实现这种正常化的呢?更具体地说,它如何调整均值和方差?让我们再看一下图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

激活功能需要正值和负值,以使 y移动平均值。这里给出了两种选择。这也是 ReLU 不是自归一化激活函数的候选函数的原因,因为它不能输出负值。

梯度可用于调整方差。激活函数需要一个梯度大于 1 的区域来增加它。现在是时候看看 SELU 背后的公式了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然它看起来像是大于零的值的 ReLU,但是还涉及到一个额外的参数:λ。这个参数就是 SELUS(caled)的原因。大于 1 时,梯度也大于 1,激活函数可以增加方差。Tensorflow 和 PyTorch 中的实现使用原始论文中的值,大约为 1.0507。

非常接近零的梯度可以用于减小方差**。其他激活函数中梯度消失的原因是内部归一化的必要特征。**

还有更多细节需要讨论(点击这里查看 Elior Cohen 的精彩讨论),但这里是直观的总结。由于激活函数以固定的方差集中值,消失梯度不再是一个问题。信号总是保持在实用范围内。

为什么要用 SELUs 而不是 ReLUs?

总的来说,SELUs 拥有这种优秀的自我规范化的品质,我们不再需要害怕消失的渐变。从现在开始,您应该使用 SELUs 而不是 ReLUs,原因有三:

  1. 与 ReLUs 类似,SELUs 启用深度神经网络**,因为没有消失梯度的问题。**
  2. 与 ReLUs 相反,SELUs 不会死
  3. SELUs 自身比其他激活函数学习得更快更好,即使它们与批处理规范化相结合。

我的实验是初步的,因此不是这篇文章的一部分,支持这些结果。在某些情况下,ReLUs 和 SELUs 之间没有真正的区别。然而,如果有的话,SELUs 的表现远远超过 ReLUs。

实现 SELU 而不是 ReLU 很容易。在 Tensorflow 中,你要做的就是用tensorflow.nn.selu代替tensorflow.nn.relu。在 Pytorch 中,正确的类方法是torch.nn.SELU。如果你知道如何在你选择的框架内建立一个神经网络,把激活函数改成 SELU 没什么大不了的。

我仍然在尝试,所以如果你有一个正在进行的深度学习项目,我将非常感谢听到你的经验!

感谢阅读!如果你喜欢这篇文章,留下一些吧👏🏻并在 LinkedIn 或 Twitter 上分享。请在评论和 推特 上告诉我你的想法。再次感谢,继续学习!

地理编码:OpenStreetMap + R + Tableau

原文:https://towardsdatascience.com/geocoding-tableau-and-r-integration-c5b32dc0eda6?source=collection_archive---------5-----------------------

便捷的地理编码,R + Tableau BI 工具的所有功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Geocoding with OpenStreetMap Without API Token

背景

在过去,谷歌地图不需要 API 令牌,这对于简短的用例很有帮助。现在,必须创建一个云帐户。老实说,令人惊讶的是谷歌允许免费令牌 API 持续这么长时间。

在寻找需要街道地址地理位置的短期用例的替代方案时,我发现 OpenStreetMap 是一个简单而有用的替代方案。

这项功能是为谁设计的?

该特性主要面向已经有一些 r 使用经验的用户,这些用户会发现这种集成有几个好处:

  • 对安装在 R 中的任何 R 包或函数的完全访问权
  • 使用 Tableau 功能进一步分析和理解数据
  • 提供一个平台,将开源数据和软件与专有软件相集成

用户必须能够访问 R/RStudio 和 Tableau。这两个软件可以存在于同一台计算机上,也可以远程存在(云)。

Tableau 脚本— R 和 Python 集成

有一种方法可以从 Tableau 执行 R 或 Python 命令,以便允许我们利用这些编程语言的功能(函数、模型和包)。您可以通过与 R 或 Python 实例动态通信的计算字段来实现这一点,结果将作为预定的数据类型(INT、REAL、BOOL、STR)返回给 Tableau。

当需要动态计算的字段来支持分析师的需求,而不必单独运行代码并发回新的数据集时,这种集成非常有用。出于这个原因,我们不会使用这个功能,但你可以查看下面的相关博客。

地理编码入门

  • 在许多情况下,我们可以访问带有位置信息的数据(例如,地址、城市、县、邮政编码、国家)。如果我们想更详细地可视化这些数据,我们需要使用地理定位。
  • 地理位置坐标(经度、纬度)需要基于位置数据来计算。
  • nomist 是 OpenStreetMap 数据的免费搜索引擎。使用 Nominatim,我们可以很容易地从给定的地址计算地理位置坐标。

OpenStreetMap 由一个地图绘制者社区构建的数据组成,他们贡献并维护世界各地的道路、小径、咖啡馆、火车站等数据。

在 R/RStudio 中加载包

为了在 R/RStudio 中加载包,我们将使用 tidyverse,这是一个为数据科学设计的 R 包以及其他帮助数据清理和处理的包的集合。下面的代码块允许您:

  1. 检查是否安装了所需的软件包
  2. 安装未安装的软件包
  3. 安装后加载软件包

包装潮流

[## Tidyverse

tidyverse 是 R 包的集成集合,旨在使数据科学变得快速、流畅和有趣。

www.tidyverse.org](https://www.tidyverse.org/)

# CHECK IF PACKAGE IS INSTALLED
if(!require("tidyverse")){ # IF PACKAGE NOT FOUND, INSTALL IT
  install.packages("tidyverse", dependencies = TRUE) # LOAD PACKAGE AFTER INSTALLETION
  library("tidyverse")
}

包 rvest

[## tidyverse/rvest

通过在 GitHub 上创建一个帐户,为 tidyverse/rvest 开发做贡献。

github.com](https://github.com/tidyverse/rvest)

# CHECK IF PACKAGE IS INSTALLED
if(!require("rvest")){# IF PACKAGE NOT FOUND, INSTALL IT
  install.packages("rvest", dependencies = TRUE)# LOAD PACKAGE AFTER INSTALLETION
  library("rvest")
}

包青天

[## gagolews/stringi

带 ICU 的 R 的字符串处理包。通过在…上创建一个帐户,为 gagolews/stringi 开发做出贡献

github.com](https://github.com/gagolews/stringi)

# CHECK IF PACKAGE IS INSTALLED
if(!require("stringi")){# IF PACKAGE NOT FOUND, INSTALL IT
  install.packages("stringi", dependencies = TRUE)# LOAD PACKAGE AFTER INSTALLETION
  library("stringi")
}

包 jsonlite

[## jeroen/jsonlite

一个健壮的、高性能的 JSON 解析器和生成器

github.com](https://github.com/jeroen/jsonlite)

# CHECK IF PACKAGE IS INSTALLED
if(!require("jsonlite")){# IF PACKAGE NOT FOUND, INSTALL IT
  install.packages("jsonlite", dependencies = TRUE)# LOAD PACKAGE AFTER INSTALLETION
  library("jsonlite")
}

OpenStreetMap API 搜索函数

下面的地理编码功能允许我们向 nomist im(OpenStreetMap 数据的搜索引擎)发出请求。

该函数获取并输入以下参数,这些参数可以根据您的需要进行修改:【姓名】、【地址】、【城市】、【州】、【邮政编码】

geocode <- function(name, address, city, state, zipcode){
  # NOMINATIM SEARCH API URL
  src_url <- "[https://nominatim.openstreetmap.org/search?q=](https://nominatim.openstreetmap.org/search?q=)"

  # CREATE A FULL ADDRESS
  addr <- paste(address, city, state, zipcode, sep = "%2C")

  # CREATE A SEARCH URL BASED ON NOMINATIM API TO RETURN GEOJSON
  requests <- paste0(src_url, query, "&format=geojson")

  # ITERATE OVER THE URLS AND MAKE REQUEST TO THE SEARCH API
  for (i in 1:length(requests)) {

    # QUERY THE API TRANSFORM RESPONSE FROM JSON TO R LIST
    response <- read_html(requests[i]) %>%
      html_node("p") %>%
      html_text() %>%
      fromJSON()

    # FROM THE RESPONSE EXTRACT LATITUDE AND LONGITUDE COORDINATES
    lon <- response$features$geometry$coordinates[[1]][1]
    lat <- response$features$geometry$coordinates[[1]][2]

    # CREATE A COORDINATES DATAFRAME
    if(i == 1) {
      loc <- tibble(name = name[i], 
                    address = str_replace_all(addr[i], "%2C", ","),
                    latitude = lat, longitude = lon)
    }else{
      df <- tibble(name = name[i], 
                   address = str_replace_all(addr[i], "%2C", ","),
                   latitude = lat, longitude = lon)
      loc <- bind_rows(loc, df)
    }
  }
  return(loc)
}

数据来源:芝加哥市食品检验局

这些信息来源于从 2010 年 1 月 1 日至今对芝加哥的餐馆和其他食品机构的检查。芝加哥公共卫生部食品保护项目的工作人员使用标准化程序进行检查。

[## 芝加哥市|数据门户

关于 2018 年 7 月 1 日影响此数据集的变更的注意事项:http://bit.ly/2yWd2JB-此信息源自检查…

data.cityofchicago.org](https://data.cityofchicago.org/browse?q=food+inspection&sortBy=relevance)

食品检测数据具有地理位置坐标,我们可以使用它们来检查结果的准确性。在这个示例数据集中,我们将只使用 location 列来查找餐馆的坐标。

数据检查和清理

在下面的代码块中,我们正在读取数据并进行一些更改,以确保该地址与 Nominatim API 一起工作。

读取数据

# READ THE DATA
data <- read_csv("food_inspection_sample.csv")# REMOVE SPACE FROM COLUMNS
colnames(data) <- str_replace_all(colnames(data)," ", "_")

清理数据

# REMOVE SPACE FROM RESULTS
data$Results <- data$Results %>% 
  str_replace_all(" w/ ", " with ") %>% 
  str_replace_all(" ", "_")# EXTRACT RISK LEVEL 
data$Risk <- tolower(data$Risk) %>% 
  str_extract("\\(.*\\)") %>% 
  str_extract("[a-z]+")head(data)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://gist.github.com/jlroo/9c65f9e599f116487b33047ed1be0837#file-food_inspection_sample-csv

地址的地理定位

在本节中,我们将准备 address 变量来匹配 nomim API 样式。

# EXTRACT THE ADDRESS VARIABLE 
address <- data$Address

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Original address variable

修改地址变量以匹配 API

# CLEAN SPECIAL CASES (e.g. 1 N MAY BLDG)
query <- str_replace_all(string = address, 
                         pattern = "BLDG", 
                         replacement = " ")# CLEAN SPECIAL CASES (e.g. 3333-3339 N CLARK)
query <- stri_replace(str = query, 
                      replacement = " ", 
                      regex = "(-[0-9]+\\s)")# REPLACE SPACES (\\s) OR COMMAS (,) WITH PLUS SIGN (+)
query <- str_replace_all(string = query, 
                         pattern = "\\s|,", 
                         replacement = "+")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Transformed address variable

发出 API 请求-地理编码功能

为 API 准备好地址变量后,我们可以使用开始时创建的 geocode 函数来查找餐馆的地理坐标。

df <- geocode(name = data$DBA_Name,
              address = query,
              city = data$City, 
              state = data$State,
              zipcode = data$Zipcode)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Returned DataFrame with geo coordinates

最后,我们可以合并两个数据集来创建一个主数据集,并在 Tableau 中工作。为了实现这一点,我们使用了一个 left_join by 变量 name 对返回的数据帧和 DBA_Name 变量进行连接。

geo_df <- data %>% left_join(df, by = c("DBA_Name" = "name"))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://gist.github.com/jlroo/e4518cf821aa1f103f822931db83e418#file-food_inspection-csv

数据可视化:使用 Tableau 进行地理定位分析

现在有了一个带有地理坐标的主数据集,我们可以将其导入 Tableau 进行进一步分析。

要开始处理 Tableau,请通过文本文件(CSV)连接到文件。这是之前在 r 中创建的文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Connect to the food_inspections.csv file

Tableau 数据解释器有助于识别列的数据类型,但是仔细检查以确保数据类型是正确的总是很重要的。在这种情况下,我们将确保变量(纬度和经度)数据类型(地理角色)是正确的。

在 Tableau 中工作的一个好习惯是通过选择屏幕右上角的选项来提取您正在处理的数据集。这将防止您覆盖/损坏原始数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Check that columns data types are correct

完成对数据类型的更改后,转到屏幕左下方突出显示的工作表部分。将出现保存数据集(提取)的提示。按照提示将其保存在默认位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Default Folder Location — My Tableau Repository

测绘经度和纬度

在工作表中,根据数据类型(维度和度量),您将看到数据集列分为两个部分。在 measures 部分,您将找到经度和纬度变量。要映射坐标,请遵循以下步骤:

  1. 双击经度变量,Tableau 会将变量放在正确的轴(列)上。
  2. 双击纬度变量,它将被放置在正确的轴(行)上。
  3. 将变量放入正确的轴后,将每个变量的数据类型从 Measure 更改为 Dimension。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mapping coordinates, change of data type

丰富地图功能-邮政编码、细节、颜色

有了地图中的地址,我们现在可以添加更多的要素,例如县边界、邮政编码、位置详细信息和颜色。

  1. 双击 DBA Name 变量,自动将其指定为细节标记,以查看每个位置的名称。
  2. 双击风险变量。由于有三个类别,颜色标记是自动分配的。
  3. 当鼠标悬停在这些点上时,我们应该能够看到餐馆的名称、风险和地理坐标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

地图图层-邮政编码边界

Tableau 允许我们向默认地图添加额外的图层。在这种情况下,了解邮政编码标签和界限会很有帮助。

  1. 在主工具栏上,选择地图→地图图层。
  2. 工作表的左上角应该会出现一个地图图层视图。向下滚动并启用邮政编码边界邮政编码标签选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,您可以放大以仔细查看特定区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请记住,这篇博客文章只是触及了当我们集成 OpenStreetMap、R 和 Tableau 时可能发生的事情的表面。OpenStreetMap API 不需要令牌,而其他 API(Google,Mapquest)需要令牌。

通过利用 OpenStreetMap 作为资源,简单的用例可以得到极大的丰富。也就是说,要注意你在任何时候提出的请求数量。

GeoPandas 101:在地图上绘制带有纬度和经度的任何数据

原文:https://towardsdatascience.com/geopandas-101-plot-any-data-with-a-latitude-and-longitude-on-a-map-98e01944b972?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我的几个同学问我如何使用 GeoPandas(通常以别名 gpd 导入)之后,我受到了写这篇教程的启发。我最初是从一篇关于媒体的文章中了解到的,但是这个链接似乎已经停止工作了。唉,我们到了。虽然我不可能在一篇博文中分享 GeoPandas 奇妙世界的一切,但我的意图是给你一个起点。我强烈建议你去看看官方文档,即使只是为了看看 GeoPandas 能做的所有很酷的事情。希望你觉得这个教程是有帮助的和令人兴奋的!所有相关的数据和笔记本都可以在我的 GitHub 页面这里找到。

在我看来,GeoPandas 是使用起来最令人满意的 Python 包之一,因为它产生了与现实世界直接相关的有形、可见的输出。此外,我们收集数据的许多对象(例如,人口统计数据、销售指标、传感器数据)至少有一个物理元素,可以帮助我们将数据与特定位置联系起来,并描述有关对象的一些信息。

在本例中,我们将使用芝加哥市的数据来绘制带有西尼罗河病毒的蚊子的位置。第一步是下载一个形状文件。shp 文件),如果您知道地理空间数据所在的大致区域。如果你不知道在哪里可以找到一个形状文件,谷歌一下!形状文件中通常有几个其他的文件;请确保将所有这些文件放在同一个文件夹中,否则您将无法读取您的文件。

下一步是导入库。我们将需要以下内容,所有这些都可以通过快速的“pip install <package_name>”从命令行快速安装:</package_name>

import pandas as pd
import matplotlib.pyplot as plt
import descartes
import geopandas as gpd
from shapely.geometry import Point, Polygon

%matplotlib inline

现在我们已经有了一个形状文件和必要的包,让我们绘制我们的地图!只需用 GeoPandas 读入您的形状文件,并使用 matplotlib 像这样绘制它(用您自己的形状文件的路径替换文件路径):

street_map = gpd.read_file('/path/to/your/geo_export_12345.shp')
fig, ax = plt.subplots(figsize=(15,15))
street_map.plot(ax=ax)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Shapefile of Chicago, IL

请注意,我们的地图显示了街道中心线;您可以找到各种各样不同细节层次的形状文件,所以请选择最适合您特定需求的类型。

下一步是以正确的格式获取数据。我们这样做的方法是将我们的常规 Pandas 数据框架转换为地理数据框架,这将要求我们指定原始数据框架、我们的坐标参考系统(CRS) 以及我们的新数据框架的几何形状作为参数。为了适当地格式化我们的几何图形,我们需要将经度和纬度转换成(我们从上面的 shapely 中导入了点),所以首先让我们读入训练数据集,并像这样指定 EPSG:4326 CRS(用包含纬度和经度坐标的您自己的数据的路径替换文件路径):

df = pd.read_csv('./my_data.csv')
crs = {'init':'epsg:4326'}
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有了纬度和经度信息,我们可以创建。一个本质上是一个描述数据点的经度和纬度的单一对象。使用 list comprehension 将允许我们在一行中完成这项工作,但是要确保总是在“纬度”列之前指定“经度”列:

geometry = [Point(xy) for xy in zip(df['Longitude'], df['Latitude'])]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

One point for each row in our DataFrame. Check the length of the geometry list if you want to make sure.

我们最终应该会得到一个可用于创建地理数据框架的列表:

geo_df = gpd.GeoDataFrame(df, #specify our data
                          crs=crs #specify our coordinate reference system
                          geometry=geometry) #specify the geometry list we created
geo_df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时,如果您愿意,可以删除“纬度”和“经度”列,但是 GeoPandas 会在您绘制数据时自动引用“几何”列。要做到这一点,我们只需将数据放在上面绘制的地图上。我将更改一些显示选项,以便我们的地图更容易看到,使用蒙版用不同的标记绘制 WNV+和 WNV-蚊子,并添加标签和图例:

fig, ax = plt.subplots(figsize=(15,15))
street_map.plot(ax=ax, alpha=0.4, color='grey')
geo_df[geo_df['WnvPresent'] == 0].plot(ax=ax, 
                                       markersize=20, 
                                       color='blue', 
                                       marker='o', 
                                       label='Neg')
geo_df[geo_df['WnvPresent'] == 1].plot(ax=ax, 
                                       markersize=20, 
                                       color='red', 
                                       marker='^', 
                                       label='Pos')
plt.legend(prop={'size':15})

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你做到了!有大量的选项和令人敬畏的包可以使用,并与 GeoPandas 结合使用来制作地图。如果你想深入了解,我建议你从散景开始。虽然它不像单独使用 GeoPandas 绘图那么容易,但它可以为您的地理地图添加一些令人印象深刻的交互功能,并且使用起来非常有趣!

希望到现在为止,你已经习惯于用 GeoPandas 制作简单的图形了。它们非常适合于探索性分析,以及快速直观地传达空间信息。如果你有问题,请随时联系我,或者给我发一些你的 GeoPandas 作品的例子!

地理空间数据—基准入门

原文:https://towardsdatascience.com/geospatial-data-a-datum-primer-479b7ca8635c?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我还是个孩子的时候,我和我爸爸一起看星球大战,他问我斗狗飞船是在上升还是下降。我的反应,“爸爸,那很傻,太空中没有上下之分!”

在太空中,当你在太空中“向上”或“向下”时,没有恒定的参考,并且在许多方面,当提供地面数据的参考时,存在相同的问题。这些年来,这个问题变得越来越复杂,但本质上还是一样的。

地理信息系统 (GIS)的强大之处在于能够创建一个关系空间框架来设置信息层,从而获得洞察力。但是首先最基本的…

投影和纬度/经度

制图学是制作地图的研究和实践,在人类历史中有很深的渊源。公元前 3 世纪的厄拉多塞最早提出以(北/南)和(东/西)作为坐标系。测量分为度、分和秒,可以扩展为小数以提高精确度。如果秒被测量到六个小数位,它们将精确到 4 英尺,而如果只测量到一个小数位,它们将精确到 6.9 英里。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This is an example of a Web Mercator projection

纬度和经度描述了地球的三维结构,但将其转换到 2D 地图上需要使用 投影 ,或者一系列将曲面上的点的位置转换到平面上的位置的变换。很容易就有一整篇文章讨论各种预测的利弊。

精度是对地图要素的观测或估计结果与其真实值或位置的接近程度的测量。现代制图中有两种类型的精度:

  • ****相对精度:相对精度是地图上给定点相对于同一地图内其他点的精确程度。制图通常使用一个已知的点,并根据这个局部参考进行测量。
  • 绝对精度:绝对精度是指地图上的某个点与现实世界中某个固定坐标系的对应程度,即地图上某个点的经纬度与实际 GPS 坐标的对应相当准确。

现代应用,如自动驾驶汽车或飞机自动驾驶,需要比 50 年前更高的精确度。当前标准的发展反映了对提高精确度所面临的问题的解决方案。

位置的问题

在地球上放置一个参考点并不像最初看起来那样简单。首先,地球并不是一个完美的球体,而是由于重力而在中间凸起。它也是由移动的构造板块组成,当它们汇聚时也可能上升或下沉(在佛蒙特州,自 14000 年前冰川融化以来,地面仍在上升!).

最初的解决方案之一产生了自己的问题:平均海平面(MSL) 。这是通过长期测量海面高度并进行数学平均以消除波浪、潮汐以及风和海流短期变化的影响来确定的。

但是,它不会消除当地重力强度、水温和盐度的影响,因此 MSL 相对于大地基准面(不是基于实际海平面)的高度在世界各地会有所不同。通常一个国家会选择一个特定点的平均海平面作为所有制图的标准“海平面”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://wiki.gis.com/wiki/index.php/Chart_datum

当涉及到航海图时,水手必须能够知道在任何一点可能出现的最小水深。海图上的深度和潮汐是相对于海图基准面测量的,该基准面被定义为潮汐很少下降的水平面。这可能会造成船只搁浅或安全通过的差别。

回顾历史,海平面也没有在整个地质时期保持不变。当比较数据时,所有这些变量都会产生巨大的问题。

参考椭球、大地水准面和基准面

为了提供一组通用参考,使用了一个基准。通常,基准面定义了表面和表面相对于地球中心的位置。基准面有两种类型:水平或垂直。绘制北美海岸线的最初努力始于 1807 年杰斐逊总统和费迪南德·哈斯勒领导下的美国海岸测量局,但直到许多年后第一个标准化数据才在北美被广泛采用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

水平基准提供了一个固定点的参考和一个 参考椭球 模型,更好地代表了地球的非球面形状。1927 年的 北美基准 (NAD 27)使用了堪萨斯州米德牧场的一个固定点作为美国和克拉克椭球的邻接中心,因为它与美国非常吻合,并且误差最小。这是多年来的共同标准。它的替代品, 北美基准 1983 (NAD 83),取而代之的是使用地球的引力中心(也叫地心基准)作为椭球的固定参考。

垂直基准面用于根据平均海平面、潮汐数据或使用重力来表示假设海平面的大地水准面来描述某点的高程或正高。目前的 1988 年【NAVD 88】北美垂直基准是一个大地水准面模型,它使用能够高精度测量重力的仪器来创建一个假设的形状,即在没有风和潮汐等其他影响的情况下,海洋表面仅受地球重力和自转的影响。地壳密度和山脉等特征会影响大地水准面的形状,它会偏离基于椭球的基准面,如 WGS84GRS80NAD83 。********

在一个联系日益紧密的世界中,对通用视角的需求导致了以椭球体模型为起点的全球基准,如 WGS72、 大地测量系统参考 1980 (GSR 80),以及最终的 1984【WGS 84】世界大地测量系统

WGS84 是最常用的国际标准,是 1987 年 1 月以后全球定位系统(GPS)使用的参考坐标系。误差被认为小于地球中心质量的 2 厘米。

基准位移

每个数据集应该有哪些数据用于 元数据阅读和理解它可以节省大量的时间和以后的痛苦。不能将两个具有不同基准面的数据集叠加在一起,因为它们不会对齐。相反,有一个将数据从一个数据转换到另一个数据的过程,称为数据转换;也叫坐标变换( EPSGOGC )或地理变换 ( ESRI )。不同基准面之间的误差幅度可以小到几百英尺。

例如,自 1986 年建立原始大地测量基准以来,国家大地测量局已多次调整 NAD 83 基准,必须考虑这些细微差别。所有基准的完整列表太长,无法在此列出,但请看该列表了解更多信息。

同样重要的是要理解,通常局部基准面的坐标系原点不在地球的中心,而是局部基准面的椭球体偏离了地球的中心。NAD 27 和 1950 年欧洲基准(ED 1950)是本地基准。NAD 27 的设计相当适合北美,而 ED 1950 则是为欧洲使用而设计的。因为局部基准面将其椭球体与地球表面的特定区域如此紧密地对齐,所以它不适合在设计区域之外使用。

基准的未来

技术及其应用方式的变化总是需要对基准进行更新,NAD 83 和 NAVD 88 将在 2022 年被更新的版本所取代。这将校正大陆漂移,并有助于提高精度,因为 NAD 83 的非地心距离约为 2.2 米(约 7.2 英尺)。精度方面的一些问题是使用被动大地测量标记确定的基准的产物,这些标记已经随着时间的推移而退化。

取而代之的新数据将主要依赖卫星的 GPS,随着时间的推移,GPS 将变得更容易、更精确。取代三个现有 NAD 83 参考框架的将是四个平板固定地球参考框架:

  • 2022 年北美地球参考框架(NATRF2022)
  • 2022 年太平洋陆地参考框架(PATRF2022)
  • 2022 年马里亚纳地球参考框架(MATRF2022)
  • 2022 年加勒比陆地参考框架(CATRF2022)
  • 2022 年北美-太平洋位势数据(NAPGD2022)

在 NAPGD2022 中,将有一个大地水准面的时间相关模型,在三个区域提供(第一个覆盖整个北美和中美、夏威夷、阿拉斯加、格陵兰和加勒比海,第二个覆盖美属萨摩亚,第三个覆盖关岛和马里亚纳群岛联邦),将被称为大地水准面 22。

像所有科学领域一样,这是一个不断发展的过程,以适应当代人的需求。超级精确的地理空间数据所展现的潜力可能会改变生活,但像大多数事情一样,理解它的遗产也很重要。深入研究,看看元数据,看看你能找到什么!

使用 Dask 和 Geopandas 进行大规模地理空间操作

原文:https://towardsdatascience.com/geospatial-operations-at-scale-with-dask-and-geopandas-4d92d00eb7e8?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

May 2016 New York City Taxi Dropoffs Heatmap by Taxi Zone.

在本文中,我将给出一个空间连接的示例,然后描述如何使用 GeoPandas 和 Dask 执行大规模的空间连接。

**注意:**为了精简这篇文章,我删除了交互式图形和大部分代码。你可以在 nbviewer 上查看 Jupyter 的原始笔记本。

第 1 部分:对空间连接的简单介绍

我在分析纽约市出租车数据集时遇到的一个问题是,从 2009 年到 2016 年 6 月,出租车行程的起点和终点都是以经度和纬度点的形式给出的。2016 年 7 月之后,为了在向公众发布数据时提供一定程度的匿名性,出租车和豪华轿车委员会(TLC)只提供一次旅行的开始和结束“出租车区域”,以及一个指定边界的 shapefile,可在此处获得。为了获得连续的数据集,我需要一种有效的方法将经纬度坐标对转换成“出租车区域”。让我们在 Geopandas 中加载 shapefile,将坐标系设置为’ epsg:4326 ',这是经纬度坐标。以下是前几行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The first few rows of the dataset.

我们看到几何列由多边形(来自 Shapely)组成,这些多边形的顶点由经度和纬度点定义。让我们按照 LocationID 的升序来绘图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Taxi Zones chloropleth colored by taxi zone ID

这是一张熟悉的纽约地图,显示了 262 个出租车区域,用出租车区域的 id 进行着色。我发现 LocationID 没有任何特定的地理顺序。我在洋红色加了一个随机点(-73.966 \u E,40.78˚ N),正好落在中央公园中间。分配一个点在滑行区域内是人类可以很容易做到的事情,但在计算机上,这需要解决多边形问题中的点。幸运的是, Shapely 库为 Python 中的这种几何运算提供了一个简单的接口。但是,多边形中的点在计算上是昂贵的,并且使用 24 亿(纬度,经度)对上的 Shapely 库来分配出租车区域,就像在纽约出租车数据集中一样,将花费现代单核 cpu 大约四年的时间。为了加快速度,我们计算每个滑行区域的边界框,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bounding boxes for each Taxi Zone

现在,给定一个(经度,纬度)坐标对,包含该坐标对的边界框可以用一个 R 树有效地计算出来。你可以在这里找到关于 R 树的精彩介绍。只需要检查具有包含坐标对的边界框的多边形(滑行区域),然后为这几个滑行区域(希望如此)求解多边形中的点。这将计算量减少了大约 100-1000 倍。将坐标对分配给滑行区域的过程就是空间连接的一个例子。 Geopandas 为 Python 中的高效空间连接提供了一个很好的接口,它负责为您计算边界框和 R 树,如执行左空间连接的代码片段所示。

import geopandas as gpd
from shapely.geometry import Pointdf = gpd.read_file('taxi_zones.shp').to_crs({'init': 'epsg:4326'})
df = df.drop(['Shape_Area', 'Shape_Leng', 'OBJECTID'], axis=1)gpd.sjoin(gpd.GeoDataFrame(crs={'init': 'epsg:4326'},
    geometry=[Point(-73.966, 40.78)]), 
    df, how='left', op='within')

此代码对上面地图上的单个点(用洋红色绘制)进行合并,并在中央公园正确地识别它

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The spatial join for the magenta point in the figures above

第 2 部分:使用 Dask 进行大规模空间连接

在我的纽约公交项目中,我下载并处理了整个 200GB 的出租车数据集。在这里,我从 taxi 数据集(2016 年 5 月)加载一个文件到 Dask,并显示前几行和几列。该文件 1.8GB 有点大,Dask 选择将数据帧划分为 30 个分区,以提高计算效率。每个分区都是一个 pandas 数据帧,dask 负责所有的逻辑,将组合视为一个单独的数据帧。这里有几个栏目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The first few rows of time and location data in May 2016

所以每次旅行都有接送(经度,纬度)坐标对。为了让您对数据有个感觉,我画出了第一次旅行的起点和终点,终点在东村。驾驶方向带来了很多额外的复杂性,所以这里我只画了一个直线箭头。空间连接将出租车区域标识为克林顿东和东村。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The first trip in May 2016 — As the crow flies

所以,Dask 数据帧只是熊猫数据帧的集合,我知道如何在熊猫数据帧上执行空间连接。让我们利用 Dask 的[map_partitions](http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.DataFrame.map_partitions)函数对每个分区上的滑行区域进行空间连接。下面是执行空间连接的函数,给定一个 Pandas 数据帧,以及经度、纬度和 taxizone id 列的名称。代码直接链接到这里

按比例

使用map_partitions函数,我将空间连接应用于组成 Dask 数据帧的每个熊猫数据帧。为了简单起见,我只调用该函数两次,一次用于取货地点,一次用于卸货地点。为了帮助 dask 确定返回数据的模式,我们将它指定为一列浮点数(允许 NaN 值)。

trips['pickup_taxizone_id'] = trips.map_partitions(
    assign_taxi_zones, "pickup_longitude", "pickup_latitude",
    "pickup_taxizone_id", meta=('pickup_taxizone_id', np.float64))
trips['dropoff_taxizone_id'] = trips.map_partitions(
    assign_taxi_zones, "dropoff_longitude", "dropoff_latitude",
    "dropoff_taxizone_id", meta=('dropoff_taxizone_id', np.float64))
trips[['pickup_taxizone_id', 'dropoff_taxizone_id']].head()

此时,trips Dask 数据帧将具有有效的 taxizone_id 信息。让我们将这些数据保存到 Parquet 中,这是一种列格式,在 Dask 和 Apache Spark 中得到很好的支持。这可以防止 Dask 在每次需要对 trips 数据帧进行操作时重新计算空间连接(这是非常昂贵的)。

trips.to_parquet('trips_2016-05.parquet', has_nulls=True,
     object_encoding='json', compression="SNAPPY")
trips = dd.read_parquet('trips_2016-05.parquet',
    columns=['pickup_taxizone_id', 'dropoff_taxizone_id'])

为了结束这篇文章,我将使用 Dask 生成一个出租车下车地点的热图,按出租车区域进行汇总。不出所料(至少对纽约人来说),绝大多数出租车停靠点都在曼哈顿的市中心和中城区。我将在以后的文章中进一步分析这个数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

May 2016 New York City Taxi Dropoffs by Taxi Zone.

摘要

在这篇文章中,我描述了空间连接的过程,并使用 Dask 和 Pandas 在集群上进行大规模的空间连接。我忽略了对整个纽约出租车数据集很重要的一些细节,但是我的完整代码可以在 Github 上的这里找到。在以后的文章中,我将更彻底地分析这些数据,并可能将处理后的数据作为一个 parquet 文件发布,供其他人分析。

关于空间连接性能的补充说明

上面使用 GeoPandas 编写的空间连接使用纽约出租车数据集,可以在 4 GHz 4 核 i5 系统上为每小时大约 4000 万次出租车行程分配出租车区域。许多支持这种连接的代码是 Python 和包装 C 代码的某种融合。

这比在高度优化的 PostGIS C/C++代码中执行相同的空间连接大约慢两倍。然而,PostGIS 并没有有效地使用多个内核(至少在没有多个空间连接同时运行的情况下),更重要的是,往返 PostgreSQL 数据库的网络和序列化开销使 PostgreSQL/PostGIS 的速度与我在本文中描述的 GeoPandas 实现的速度大致相同,需要打破的移动部分要多得多。

基本上,对于这些类型的数据结构操作,Python 实际上是相当快的 T2 T3。

开始使用 sci kit-了解 Kaggle

原文:https://towardsdatascience.com/get-going-with-scikit-learn-on-kaggle-32045d238eee?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Taipei, Taiwan

Scikit-learn 一直是机器学习入门的流行库。然而,并不是每个人都有机会尝试它。我将向您展示如何使用 scikit——用最短的路径学习,您只需要一个 web 浏览器!

Taipei, Taiwan

在这篇文章中,我将帮助你开始在一个 Kaggle 内核中使用 scikit-learn ,并为你指出可以用来指导你继续学习的资源。

[## Kaggle 内核简介

在《人工智能历险记》的这一集里,你会发现什么是 Kaggle 内核,以及如何开始使用它们。虽然没有…

towardsdatascience.com](/introduction-to-kaggle-kernels-2ad754ebf77)

简短的历史课

让我们从一点历史开始,作为背景。Scikit-learn 最初被称为 scikits.learn ,最初是由大卫·库尔纳珀发起的谷歌代码之夏项目。名称中的“scikit”部分来自于它是一个 Sci Py 工具工具包

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从那以后,scikit-learn 稳步地获得了采用和流行,直到今天:一个有良好文档记录、深受喜爱的 Python 机器学习库。如果你看一下scikit-learn.org,你会注意到版本号很低,在这篇文章发表时是 0.19。不要被这个吓跑了;图书馆已经存在很长时间了,维护得很好,相当可靠。

Scikit-learn 是做什么的?

它真正出色的地方是一套丰富的工具,我称之为“围绕机器学习的*”,包括从数据集加载和操作到预处理管道和指标的一切。在我看来,scikit-learn 真正令人难以置信的部分是您可以尝试的大量机器学习算法,其中大多数只需进行最小的代码调整!*

这确实是一种令人惊奇的方法,可以掌握不同类型的模型做什么,以及获得一些关于各种参数如何执行的直觉。

我使用 scikit-learn 创建了一个简单的 Kaggle 内核来帮助您入门,它还展示了内核和数据集之间的连接。跟随这个简短的视频一行一行地浏览内核,并讨论每个步骤:

如果你准备好了使用 Kaggle 内核并与其他人合作的更复杂的方法,请查看这篇关于在 Kaggle 上创建数据科学项目的帖子:

[## 使用 Kaggle 数据集和内核设计一个数据科学项目

在《人工智能历险记》的这一集里,我请到了 Kaggle Datasets 的产品负责人 Megan Risdal,带我们参观一些…

towardsdatascience.com](/cooking-up-a-data-science-project-using-kaggle-datasets-and-kernels-fca2b678e268)

后续步骤

这只是非常简单地介绍了如何开始使用 scikit-learn ,但是您应该探索 scikit-learn 提供的广阔的机器学习模型世界,所有这些都是通过一个简单干净的 API 实现的!深入学习教程和文档,制作一些令人敬畏的模型。

下次我们将讨论机器学习的另一面——scikit-learn——进行预测,以及如何扩大规模!

感谢阅读这一集的云人工智能冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注媒体上的订阅 YouTube 频道以观看未来的剧集。更多剧集即将推出!

准备好迎接更快、更简单、更有趣的炉石吧

原文:https://towardsdatascience.com/get-ready-for-a-faster-easier-and-more-fun-hearthstone-c6163e0a0d75?source=collection_archive---------0-----------------------

暴雪最近宣布对其轰动一时的纸牌交易游戏炉石进行一些看似微小的改动。我们来看看。来自暴雪:

“一旦玩家达到15 级、10 级或 5 级,他们将无法在一个赛季内取消该等级,类似于现有的 20 级和传奇等级。”

这将如何改变梯子上的游戏?嗯,会好起来的。好多了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更快、更稳定的攀爬

今天,即使是最好的玩家也需要 400-600 场比赛(在一个月内)才能达到传奇。随着新排名游戏楼层的增加,你将免受这种流失的影响,减少 5-10%的游戏数量。

游戏会更容易

上周我发布了关于游戏难度以及它如何随着等级(duh)和月中的某一天(与赛季中的某一天同义)而变化。我甚至建立了一个模型来展示这个样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 5 级爬到传奇仍然会非常困难,但是爬更低的等级会容易一些。

炉石会更好玩

最令人兴奋的是,这些变化将让你自由地尝试新的甲板,因为当你坐在这些地板之一的北面时,你没有什么可失去的。这种额外的变化将是一个受欢迎的补充,特别是在上层,目前除了 3-5 个顶层甲板中的一个之外,无法使用任何东西。

准备好永远不再相信互联网上的任何东西

原文:https://towardsdatascience.com/get-ready-to-never-trust-anything-on-the-internet-ever-again-8978352fa91b?source=collection_archive---------2-----------------------

伪造一切的兴起

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直到大约 10 年前,伪造照片还极其困难,需要精心的设置、模糊的图像以及古代民间传说和轶事的力量才能让人相信。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天,任何人只要有一台电脑并能上网,就能在几小时内伪造一幅图像,如果不是几分钟的话。

多年来,我们已经不接受我们看到的每一张图片,以防它们被 PS 或编辑成错误的信息。

其他媒体,如音频和视频,还没有被如此仔细地考虑过。最近的技术进步意味着这种情况可能不得不迅速改变。

Lyrebird 是一家人工智能初创公司,它允许通过输入几分钟的讲话内容来克隆任何人的声音。这项技术可能带来的错误信息的可能性是巨大的。几年之内,电话可能完全是伪造的这一点就足够令人信服了。

更重要的是,随着计算能力每 18 个月翻一番,如果今天电影中的 cgi 看起来相当有说服力(查看视频以查看《星球大战 7》的 CGI 与真实对比),等待 5 年,看看差异。

随着越来越多的假新闻在网络上流传,这可能会使问题变得更糟。例如,看下面这个视频,其中前总统奥巴马的视频是根据脚本合成的。

根据摩尔定律,在接下来的几年里,技术将以人类历史上前所未有的速度发展。人们需要在被利用之前意识到人工智能和其他技术的潜力。

虽然它们现在看起来神秘而遥远,但这些技术将很快到来,当它们到来时,我们需要为此做好准备。

想象一下,在未来 10 年内,甚至青少年也能像现在使用 photoshop 一样使用这些技术。

机器人已经在网上传播关于政治的假新闻,而经过 PS 处理的图像正在作为真正的新闻传播。

在开发这些技术的同时,处于各自领域前沿的研究人员和公司需要小心他们的产品不被恶意使用。

为了成功跨越今天的技术与明天的技术之间的鸿沟,我们需要确保负责任地使用它,并让人们了解它可能产生的潜在错误信息。

正如这个短语一样,“PS 图像”已经成为普通大众词汇的一部分,“x-ed 音频”和“y-ed 视频”也是如此。

我们还没有看到这些公司会是谁。

感谢阅读,

¯_(ツ)_/¯

萨尔瓦夫

看看我的其他故事吧!

十五个 Y/O 给聊天机器人工作人员的消息—https://medium . com/swlh/A-Message-From-A-fifty-O-to-any one-Working-With-Chatbots-fd1b c 6292028

因为这个令人难以置信的独特原因,普遍基本收入是必要的—https://medium . com/forward-data-science/why-Universal-Basic-Income-Is-required-it-not-than-what-you-think-ab 602 f62a 207

利用数据科学变得更聪明—应对真正的企业挑战

原文:https://towardsdatascience.com/get-smarter-with-data-science-tackling-real-enterprise-challenges-67ee001f6097?source=collection_archive---------9-----------------------

数据科学战略指南—第 1 部分

让您的数据科学项目从零开始走向生产

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

《数据科学战略指南——用数据科学变得更聪明’ 被设想为一系列文章,这些文章更像是一份战略指南,描述了在现实世界中实施和执行数据科学项目时需要牢记的基本挑战、陷阱和原则。我们还将介绍如何通过关注非常真实的视角并远离炒作,从数据科学和人工智能中获得最大价值。这将使您能够在自己的领域内推动行业成功!这里的重点更多的是在行业中执行的真实项目,但是这些原则中的一些也适用于研究。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

一般来说,我的大部分文章都是面向实践的,针对的是构建系统的人和真正从事数据科学的*。然而,本指南面向更广泛的受众,包括高管、企业、架构师、分析师、工程师和数据科学家。根据我的观点和经验,您需要所有这些来成功执行数据科学项目并获得最大价值!*

您是否厌倦了您的数据科学项目仅仅停留在概念验证阶段?

当您的项目最终投入生产并开始处理真实世界的数据时,您难道不喜欢吗?

你喜欢从数据中提供可行的见解来推动业务目标吗?

你想建立一个成功有效的数据科学团队吗?

我能为我的团队建立有效的数据科学和人工智能战略吗?

如果你对这些问题中的至少一个回答是肯定的,这个指南就是为你准备的!我们将通过一系列文章在本指南中涵盖以下主要方面:

  • 第 1 部分—当前的挑战和潜在的解决方案
  • 第 2 部分—建立有效的数据科学团队
  • 第 3 部分—数据科学项目的流程模型
  • 第 4 部分——有效的数据科学管道
  • 第 5 部分——推动行业成功

本指南中表达的所有观点均基于个人经验、行业趋势以及与行业专家的交流。本指南的目的不是传播任何偏见或成见,而是给出在企业中执行数据科学项目时要检查的核心组件的清晰概念。我仍然不认为自己是这个领域的专家(要学的东西太多了!)但是我希望这个指南能帮助你获得一些关于有效执行数据科学项目的有用观点。

在这篇特别的文章中,我们将关注一些困扰行业的关于执行数据科学项目的非常真实的挑战和一些潜在的解决方案。

当前的挑战和潜在的解决方案

大多数数据科学家(包括我自己)喜欢现成可用的工具、库和框架。在解决不同的问题时,我们有自己的个人偏好。由于这些工具和方法的临时使用,再加上我们的偏好,这导致在实际尝试部署和维护数据科学项目工件和资产时增加了工作量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

在本节中,我们将了解一些最重要的挑战和陷阱,这些挑战和陷阱经常困扰着从未走出概念验证阶段的数据科学项目,以及一些关于我们如何应对它们的指导。

分散的技术格局

数据科学工具的技术前景是巨大的,并且每天都在变得更大。再加上大数据、人工智能和其他一些术语,你会看到一个更大的工具、库和框架的景观。在数据科学中,从数据科学家的角度来看,这一切都是为了使用最好的(或最容易使用和理解的)工具来解决问题,因为方法-统计或机器学习\深度学习都建立在数学、统计和优化的基础上,只要实现的算法或方法是统一的,特定的工具或框架的使用对他们来说并不重要。我相信你一定听说过这样一句话,‘不要专注于工具和框架。专注于要解决的问题!。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

这没有错。通常,一个数据科学家(像我一样)可能喜欢开始查看数据,打开 R 或 Python,开始编写代码来做一些分析或构建模型。基于从事数据科学的人们的使用模式,我们通常有两个极端。有些人喜欢使用编程语言,如 R、Python、Scala 或 Java,加上框架和库,使他们能够轻松地进行复杂的分析。其他人喜欢使用基于“无代码、图形拖放界面”的工具,如 KNIME、RapidMiner、Weka 等等。

拥有使用我最了解的工具的心态,对于数据科学项目来说可能是毁灭性的,因为缺乏标准化、最小架构,尤其是如果构建项目的人最终在项目部署后离开了公司。构建一个概念证明是非常好的,但是当你需要将你的项目转移到生产中时,还要考虑以下几个方面——使用模式、可伸缩性、标准化架构、与现有系统的集成可维护性

从众倾向(和炒作)

让我们面对它,我相信我们都已经看到这种情况在行业中发生,特别是围绕人工智能、自动机器学习、公民数据科学家等产生的所有宣传。C 级高管需要制定适当的数据科学和人工智能战略,并确定他们的关键业务和战略目标、数据可用性和必要性,以及数据科学和分析如何帮助他们实现这些目标。他们当然需要咨询领域专家和员工,以保持技术和业务之间的平衡。请记住,数据科学与现有业务流程的结合是推动成功的因素,两者协同工作,而不是孤立存在。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

盲目追逐大数据、数据科学或深度学习的宣传,没有目的地匆忙制定战略,可能会浪费在这些领域投入的时间、金钱和精力。如果没有最终目标或结果来说明为什么要这样做,那么像*、、【为所有企业数据创建统一的数据湖】这样的战略肯定会发出危险信号。这些说法并不离谱,有趣的是,你可以看看这篇文章* 关于数据湖没有带来商业价值的 3 个原因在过去几年的大肆宣传之后 这篇来自 CIO.com 的文章 还告诉我们,

“数据湖需要证明商业价值,否则就会消亡”

始终将任何战略与定义明确、清晰的成果以及可用于衡量这些成果的关键绩效指标联系起来。这些不必一成不变,但也不应该太模糊。这不是一项简单的任务,但必须完成。

缺乏可重复性和可重用的工件

数据科学分析和代码需要是可复制的。有多少次我们听到这些台词——‘上周模型给了我 90%的准确率’或者‘代码在我的机器上运行良好!’。嘿,我也去过那里,被指控有罪!在使用编程语言和框架时,像设置随机种子这样简单的事情,对可重复分析大有帮助。除此之外,如果你想跟踪一段时间*‘哪个模型训练了什么数据,给出了什么样的性能指标?’那么模型、数据和特性集版本化是必不可少的然后利用最佳模式或恢复到以前的模式。利用虚拟环境和容器是确保你不会陷入“包依赖地狱*”的好方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

Jupyter 笔记本是实现可重复研究和数据分析的一种很好的方式,通常是数据科学家的首选工具。我强烈推荐任何感兴趣的人阅读这篇精彩的文章,这篇文章讲述了笔记本电脑如何在业务中实现可复制性。

* [## Jupyter 笔记本电脑迎接再现性的挑战——新堆栈

每个应用程序都需要有一个杀手锏。对于 Jupyter 笔记本来说,这个特性可能是可再现性…

thenewstack.io](https://thenewstack.io/jupyter-notebooks-challenge-reproducibility/)

甚至 Jake Vanderplas 在他的文章 中也收集了大量关于 Jupyter 笔记本 的视频和教程。另一篇有趣的论文是 Adam Rule 等人的“Jupyter 笔记本中可重复研究的十个简单规则”,可在 此处 找到。他们谈到了一套规则,作为科学家的指南,特别关注计算笔记本系统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://arxiv.org/abs/1810.08055

但是,并非一切都是完美和美好的,在使用 Jupyter 笔记本时,需要记住几个注意事项。我推荐大家一定要看乔尔·格鲁什的这个精彩演讲, “我不喜欢笔记本” 讽刺地在 JupyterCon 2018 上呈现!

这里的另一个重要方面是可重用性。鉴于许多数据科学家通常喜欢以特别的方式单独工作,因此缺乏适当的协作。项目和人员以前所未有的速度流失。因此,如果你的项目是围绕着一堆分布在不同系统中的未记录的代码工件和脚本构建的,那么如果这些工件的开发人员突然离开,你将会猛然惊醒。除此之外,通常还有一些可重复的特定使用模式,如数据提取、ETL(提取-转换-加载)、功能工程,甚至是在相同数据集上建模。开发可重用的工件和组件,并使它们在公共存储库中易于访问,将在未来节省大量时间,而不是数据科学家为每个新项目重新创建这些工件。

缺乏协作—打破孤岛思维

数据科学家通常喜欢按照自己的节奏,以特别的方式做实验和分析数据。这有助于创造性思维和创新。虽然这一点都不坏,但我们确实需要开始合作,分享更多我们正在做的工作,并且在团队中工作(有时结对编程真的很好!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

最好的方法之一是确保围绕项目中正在进行的工作召开定期会议,围绕每个人正在做的事情明确定义具体的交付成果和任务,并进行混合任务,数据科学家可以独自工作,也可以与其他数据科学家甚至工程师协同工作。这将有助于促进知识共享、协作工作,以及在有人突然离开的情况下项目不会沉没。

要避免的一个更关键的陷阱是——【筒仓心态】 ,这基本上是一种心态,出现在某些部门或部门不希望与同一公司的其他人共享信息的时候。

[## 筒仓心态:如何打破壁垒

这篇文章是与互联网营销公司的梅根罗索合著的

www.forbes.com](https://www.forbes.com/sites/brentgleeson/2013/10/02/the-silo-mentality-how-to-break-down-the-barriers/#2cd2652a8c7e)

我相信你们中的很多人以前都面临过这种情况,甚至到今天也面临着这种情况。人们和团队需要认识到,只有通过共享和协作,才能创造伟大的事物,解决问题,项目才能成功。筒仓心态会导致生产力、效率的损失,降低士气,最终项目会被废弃。协作、朝着共同的目标努力、适当的激励和动机可以大大有助于为数据科学培养健康、高效的工作文化。鼓励工程师、分析师、科学家和建筑师在一个项目中一起工作,同时明确他们各自的具体任务。

将关键数据科学项目外包给第三方公司

不要误解我的意思,我们有许多纯粹的分析公司,他们拥有正确的专业知识,可以为希望更多数据驱动的公司提供关键的见解。但是,如果您计划真正长期投资以获得数据科学推动业务决策的好处,请在内部投资一个优秀的数据科学团队(或者根据公司规模、垂直行业等投资多个团队)。这样做的好处是多方面的。你不必担心公司带你去兜风或顾问在项目上工作,然后你不得不忍受维护他们的痛苦,当他们在合同到期后方便地消失时,通常在概念验证或 MVP(最低可行产品)阶段结束时。你也永远不会得到和你自己的员工一样的信任。也就是说,如果你有很多数据科学项目正在进行中,并且有足够的预算,请放心将不太重要的短期项目交给这些纯粹的第三方分析公司。

除此之外,请克服被大肆宣传的公民数据科学家和自动机器学习的概念。让我们面对现实吧!公民数据科学家可以让你更加数据驱动,但不是每个人都可以为你解决棘手的问题。你需要真正的数据科学家来构建模型和系统,并搅动我们的洞察力。自动化机器学习并不是解决所有问题的灵丹妙药。不要因为你可以将一个数据源连接到这些工具中的一个,并开始获得现成的见解而感到失望。许多公司犯了这样的错误,没有被一套工具所束缚,也不知道如何使用它们。您需要知道如何有效地使用这些工具来真正帮助减少您的数据科学项目的开发时间。

技术债务—缺乏标准和项目架构

对于任何与构建软件和产品相关的技术和工程公司来说,这都是事实。通常,从事数据科学项目的人会想,“这些是软件工程方法和原则,我们远不止这些”。不要!你肯定不是最重要的,没有意识到这一点,可能会在你真正复杂的深度学习模型中留下一个巨大的漏洞,导致又一个失败的概念验证,无法投入生产。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

跨团队启用适当的编码标准。在必要的地方构建可重用资产,但不要做得太多。一个关键的方面是不要总是只关注数据科学的工具和框架,还要关注非功能性需求(nfr)。流行的 nfr 有可扩展性可维护性可用性等等。就像我们有软件项目的企业架构一样,我们需要架构师和数据科学家与他们合作,为每个数据科学项目定义项目架构(解决方案-应用程序&数据),其最终目标是部署到生产中。下图描述了一个标准的分层企业架构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Layered Enterprise Architecture Hierarchy (Source: IBM)

许多内容摘自一本名为 “数据科学西部的架构思考” 的优秀指南,该指南实际上谈到了数据科学项目中的许多挑战,以及定义项目架构的潜在优势。

[## 数据科学蛮荒西部的架构思考

自由选择编程语言、工具和框架可以提高创造性思维和发展。

developer.ibm.com](https://developer.ibm.com/articles/architectural-thinking-in-the-wild-west-of-data-science/)

典型地,一个 企业架构师 定义了在整个企业中有效的标准和指导方针。一个 解决方案架构师 在企业架构师定义的框架内工作。这个角色定义了哪些技术组件适合特定的项目和用例。您还可以选择 应用架构师 ,他们更关注解决方案架构框架内与应用相关的组件,以及 数据架构师 ,他们定义与数据相关的组件。解决方案架构师通常会担当这些角色。

通常,数据科学家很少与企业架构师互动,而是更多地与解决方案架构师(以及应用程序/数据架构师)直接合作。数据科学家应该能够为他们的项目设想端到端的解决方案架构,甚至为架构师提供必要的输入,以便随着时间的推移改进和转变企业架构。进化是关键,由于数据科学是一个新兴的创新领域,您需要摆脱数据科学项目的常规软件项目架构模板。

压装工具和行业标准流程

仅仅因为过程模型适用于特定的项目或垂直行业,并不意味着它对数据科学也是有效的。许多企业,尤其是拥有大量员工的公司,往往会在日常运营和项目执行中使用大量流程。我们曾经有瀑布模型。现在我们有了看板缩放敏捷ScrumScrum ban等等更多的变种!这里的意图是不要严格遵循这些过程框架,而是根据项目的类型,将它们改编成可能最适合您的团队的东西。从事与产品开发直接相关的数据科学工作?也许更关注 scrum 驱动的敏捷思维。从事更具探索性或咨询性的特别项目?也许看板或 Scrumban 可能更适合你。关键的想法是从一组标准开始,并具有随时间发展的灵活性。对改变保持开放的心态,但改变某些东西是有原因的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

关于工具和框架,就像我们之前提到的,正确的工具或框架确实是基于要解决的问题,但总是有一套关于从定义的工作流、模式、编码标准和架构开始的使用的标准和指南。也不要把工具强加给问题。不,自动化机器学习不会自动从原始数据中给你最好的模型或见解。您仍然需要了解业务问题、成功标准以及使用这些工具以有效方式帮助解决问题的正确方法。就像你永远不会优化一个模型来最大限度地解决每个问题一样,不要在不知道为什么要使用一个工具的情况下就使用它。

数据科学和工程之间的差距

作为数据科学家,我们往往会忽略一个事实,即纯数据科学或机器学习组件只是构建整个项目或系统的所有其他组件中非常小的一个组件。NIPS 2015 论文, 【机器学习系统中隐藏的技术债务】 以如下视觉的形式完美地解释了这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Major components of a Data Science Project \ System

ML 代码 组件就是你上图看到的那个很小的黑框。但通常数据科学家更专注于开发算法、建立模型、探索和分析数据。因此,这最终导致他们更多地忘记了全局。这不可避免地导致项目停留在概念验证阶段,永远不会被部署。这方面的一个经典例子是从 Netflix 奖挑战赛 中吸取的教训。Netflix 的 是一场公开比赛,争夺最佳协同过滤 算法,根据之前的评分预测电影的用户评分。如果你看看他们在论文 “挖掘大规模用户数据流进行个性化推荐” 中提到的获奖经验,他们必须从获奖解决方案的 107 个模型中提取两个核心算法!然后,他们不得不扩展这些来处理超过 50 亿的收视率。除此之外,他们还提到不包括几个模型,因为将这些模型投入生产需要纯粹的工程努力。

“在网飞,我们评估了最终解决方案中包含的一些新方法。我们测量的额外精度增益似乎并不证明将其引入生产环境所需的工程努力是合理的。”

这清楚地告诉我们,为了整个系统正常运行,即使是数据科学家也需要对问题和端到端解决方案有一个整体的看法。因此,要在生产中部署数据科学项目,您需要将数据科学、数据工程、软件工程、架构、基础设施、监控和质量检查结合起来。忽视工程方面,说我只是建立机器学习模型,这不再是任何在该行业工作的数据科学家应该说的话。学会挺身而出,在需要时专注于项目的工程方面,并最大限度地利用工程团队——持续的合作有助于推动良好的协同作用。

忽略质量检查和操作

通常,在数据科学团队中工作的人认为,在‘所谓的’测试数据集上训练和评估他们的模型之后,他们的工作就完成了。缺乏质量、监控和控制检查可能会导致数据科学项目在部署后崩溃——这通常比实际开发阶段更重要!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://xkcd.com/

永远记住通过使用有效的策略来验证你的模型,比如验证数据集和交叉验证。检查数据泄露和目标标签泄露等问题。这里要记住的另一点是,在调优模型时,不要一直在训练数据上调优您的模型,并在测试数据上检查性能。然后你就间接地在测试数据上训练了你的模型!始终将数据科学和机器学习性能评估指标与您的业务指标和成功指标联系起来。流失模型可能需要更高的召回率,欺诈检测模型可能需要更高的精确度,反之亦然,这取决于业务需求!请记住,随着时间的推移,不断重新审视您的项目的成功标准和指标,因为这是您的项目在生产中部署的关键。

是否有其他的方法来评估和检查您已经部署的(或者将要部署的)模型的质量?典型的离线和在线场景可能保证不同的质量和测试方法。网飞的论文中提到了一个很好的工作流程, 【挖掘大量用户数据进行个性化推荐】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Testing Online and Offline Models (Source: Netflix)

模型度量、假设测试和 A/B 测试是您可以用来进行质量检查的关键工具。除此之外,你也不应该忽视操作方面。这意味着要确保部署适当的模型性能评估监控系统,以便您可以根据实时数据跟踪模型性能。请记住,一旦模型被构建和评估,项目就不会结束。通常,拥有持续集成和交付框架(CI/CD)也有助于持续确保您的代码库工作正常,并且不会在无人知晓的情况下突然中断。

结论

我希望这篇文章能让您对行业中关于执行数据科学项目的典型现实挑战有所了解。这里给出的建议只是一些通用的指导方针,并不是一成不变的。由于数据科学现在已经发展成为一个跨行业的学科,你们每个人都可能会找到更适合自己的特定方面,但要记住的总体挑战应该在本文中。我真诚地祝愿你们所有人在执行自己的数据科学项目中取得成功,如果有什么我忘记在这里提到的,请不要犹豫,告诉我什么最适合你!

下一步是什么?

我们为数据科学战略指南系列计划了许多有趣的内容!在下一篇文章 的 中,我们将从行业专家、企业和你的友好邻居作者——我自己——的角度,探讨如何建立有效的数据科学团队 !敬请关注一些有趣的内容!

有反馈给我吗?或者有兴趣与我一起从事研究、数据科学、人工智能甚至发表一篇关于 TDS 的文章?可以在LinkedIn上联系我。

* [## 人工智能顾问&数据科学导师-跳板| LinkedIn

查看 Dipanjan Sarkar 在世界最大的职业社区 LinkedIn 上的个人资料。Dipanjan 有 2 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/dipanzan/)**

使用 Keras 开始深度学习

原文:https://towardsdatascience.com/get-started-with-deep-learning-using-keras-a45ee421f3ef?source=collection_archive---------7-----------------------

深度学习处于人工智能革命的最前沿,这是有充分理由的——自然语言处理、图像识别,甚至计算机围棋方面令人难以置信的进步,都要归功于深度神经网络的帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alexa in the Amazon Echo uses deep learning to understand human language. Andres Urena on Unsplash

由于大多数神经网络必须完成的任务的复杂性,大多数人会认为很难建立一个神经网络。是的,也许 5 年前那是完全正确的,你必须从头开始建立你的神经网络。但是今天,有了像 Keras 这样的开源框架,开始变得非常简单。以下是方法。(这里是完整的脚本如果你想跳过前面!)

问题:用人口统计学变量预测薪水

首先,我们先找一个玩具问题入手。下面是我找到的一个:1994 年美国人口普查数据库的美国成年人收入数据。我们将尝试使用几个完全连接的神经元层来预测人口普查中给定人员的工资。

老实说,深度神经网络对于这项任务来说可能有点大材小用。传统的数据科学技术,如逻辑回归,非常适合这种情况,并且非常容易解释。尽管如此,这仍然是一个开始使用 Keras 的好方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Markus Spiske on Unsplash

进口

为了遵循这段代码,首先安装 Python 3 。完成后,打开您的操作系统终端,并键入以下内容:

pip install **pandas**

然后在熊猫之后安装以下包: sklearntensorflow ,最后是 keras

首先,我们将从我们的进口开始。该脚本需要:

  1. 熊猫用于数据操作、
  2. numpy 对于一些快速操作,
  3. sklearn 对于数据缩放和性能测量,
  4. 最后, keras ,我们的深度学习框架。

加载数据集

我们的数据集包含各种变量,如员工的年龄、教育水平、受教育年限、婚姻状况、职称等。该数据集中包含的最后一个值是工资范围,低于或高于$50,000。我们将使用前面的变量来预测这个目标。

准备数据集

下一步是为 Keras 准备数据集。我们需要做到以下几点:

  1. 平衡各阶级。不平衡的班级会干扰训练。
  2. 将分类变量(例如职业)转换成一个热点编码变量。基本上是为每个标签创建一个值为 0 或 1 的新列。
  3. 提取训练和测试数据集的 X (变量)和 y (目标)
  4. 标度变量。

喀拉斯的模型

现在是精彩的部分!构建 Keras 模型。在 Keras 中有两个接口来构建模型,顺序模型 API 和函数 API。今天,我们将使用顺序模型 API,因为它更容易理解和构建。

这是我们需要做的。

  1. 首先,我们将设置一个模型检查点对象,以允许我们在训练过程中保存最佳结果。
  2. 然后,我们将创建一个序列模型对象,我们将向其添加不同的神经层。
  3. 我们将需要选择适当的激活函数、优化器损失函数来构建我们的二元分类模型(我们试图预测一个变量的值为 0 或 1)。
  4. 最后,我们将训练我们的网络。

评估模型的性能

我们表现如何?让我们来衡量我们的模型的性能!我们将测量精度,一个精确分类量的值。

  1. 我们将需要加载我们在模型训练期间保存的权重,并且用这些权重编译模型
  2. 使用模型预测测试数据集中的值
  3. 预测的工资与测试数据集中的实际工资进行比较。

最终,该模型对于低于 50K 的工资获得了大约 87%的精度,对于高于 50K 的工资获得了大约 72%的精度。

对于一个没有任何特征工程的模型来说还不错…

GithubGist 上的提供了整个脚本。

我希望你喜欢我的教程!

艾蒂安

从闪亮应用的反应例子开始。

原文:https://towardsdatascience.com/get-started-with-examples-of-reactivity-in-in-shiny-apps-db409079dd11?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo Credit : Pixabay

介绍

让闪亮的应用程序具有交互性的一个因素是反应能力。用最简单的术语来说,反应性/反应性编程是程序根据一组给定的用户输入计算输出的能力。一个闪亮的应用程序处理反应的能力在用户和现有信息之间建立了双向交流。

反应性适用于执行计算、数据操作、收集用户信息等情况。

作为一个开始构建闪亮应用的初学者,掌握处理反应的基本知识将有助于你探索闪亮应用的不同用例。

我们开始吧

直到下面的错误消息,人们才会想到反应性的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

error message

当电抗组件被放置在非电抗函数中时,会出现此错误。该应用程序将不会加载,并将解析此错误。让我们看看什么是反应函数,它有什么作用。

闪亮应用的反应组件

一个闪亮的应用程序有三个主要的反应组件:

无功输入

反应式输入被定义为用户通过浏览器界面提供的输入。例如,当用户填写表单、选择项目或单击按钮时。这些动作将触发从无功输入设置的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Text input and Add button are reactive inputs

无功输出

反应输出被定义为浏览器界面中程序提供的输出。例如图表、地图、曲线图或数值表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table of values as a reactive output

反应式表达

电抗表达式被定义为将电抗输入转换为电抗输出的表达式。它们在发送无功输出之前执行计算。这些还会屏蔽慢速操作,如从服务器读取数据、在其他场景中进行网络调用。我们将在我们的例子中看到一个。

例子

让我们从一个简单的例子开始,将两个整数相加,并在一个闪亮的应用程序中返回它们的和。

用户界面

titlePanel("Sum of two integers"),

  #number input form
  sidebarLayout(
    sidebarPanel(
      textInput("one", "First Integer"),
      textInput("two", "Second Integer"),
      actionButton("add", "Add")
    ),

    # Show result
    mainPanel(

   textOutput("sum")

    )

计算机网络服务器

server <- function(input,output,session) {#observe the add click and perform a reactive expression
  observeEvent( input$add,{
    x <- as.numeric(input$one)
    y <- as.numeric(input$two)
    #reactive expression
    n <- x+y
    output$sum <- renderPrint(n)
  }

  )

结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example

演示

现在,让我们在处理反应性的同时,构建一些稍微复杂的东西。

用户界面

fields <- c("name","age","height","weight")
ui <- fluidPage(

   # Application title
   titlePanel("Health card"),

   # Sidebar with reactive inputs
   sidebarLayout(
      sidebarPanel(
         textInput("name","Your Name"),
        selectInput("age","Age bracket",c("18-25","25-45","above 45")),
         textInput("weight","Please enter your weight in kg"),
         textInput("height","Please enter your height in cm"),
         actionButton("save","Add")

      ),

      # a table of reactive outputs
      mainPanel(
         mainPanel(

            DT::dataTableOutput("responses", width = 500), tags$hr()

         )
      )
   )
)

计算机网络服务器

# Define server logic 
   server <- function(input, output,session) { #create a data frame called responses
      saveData <- function(data) {
         data <- as.data.frame(t(data))
         if (exists("responses")) {
            responses <<- rbind(responses, data)
         } else {
            responses <<- data
         }
      }

      loadData <- function() {
         if (exists("responses")) {
            responses
         }
      }

      # Whenever a field is filled, aggregate all form data
      #formData is a reactive function formData <- reactive({
         data <- sapply(fields, function(x) input[[x]])
         data
      })

      # When the Save button is clicked, save the form data
      observeEvent(input$save, {
         saveData(formData())
      })

      # Show the previous responses
      # (update with current response when save is clicked)
      output$responses <- DT::renderDataTable({
         input$save
         loadData()
      })     
   }

结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

When project is run.

项目演示:【https://rstudio.cloud/project/22236

这就对了。既然你已经掌握了基本知识,请继续尝试。欢迎分享、向我提问或在 twitter 上给出反馈 @lornamariak

使用 OpenCL 的 GPU 图像处理

原文:https://towardsdatascience.com/get-started-with-gpu-image-processing-15e34b787480?source=collection_archive---------2-----------------------

使用 Python 和 OpenCL 以不到 120 行代码实现两种图像处理方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Large speed-ups can be achieved by using GPUs instead of CPUs for certain tasks. (Image: Joseph Greve)

除了图形处理单元(GPU)的明显用例,即渲染 3D 对象,还可以使用 OpenCL 或 CUDA 等框架执行通用计算。一个著名的用例是比特币挖矿。我们将看看另一个有趣的用例:图像处理。在讨论了 GPU 编程的基础之后,我们使用 Python 和 OpenCL 在不到 120 行代码中实现了膨胀和腐蚀。

为什么图像处理非常适合 GPU?

第一个原因

许多图像处理操作在图像中逐个像素地迭代,使用当前像素值进行一些计算,最后将每个计算值写入输出图像。图 1 示出了作为例子的灰度值反转操作。我们单独反转每个像素的灰度值。对于每个像素,这显然可以同时(并行)完成,因为输出值不相互依赖。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1: Inverting the color of an image. The output pixel at some location can be computed by only taking the input pixel at the same location into account. Some corresponding pixels are shown by colored lines.

第二个原因

在进行图像处理时,我们需要快速访问像素值。GPU 是为图形目的而设计的,其中之一是纹理,因此访问和操作像素的硬件得到了很好的优化。图 2 显示了 3D 程序中纹理通常的用途。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 2: Textures are often used to make models (in this case a sphere) make look more realistic.

膨胀和侵蚀

让我们简单看一下我们实现的图像处理方法。这两种运算都属于形态学运算的范畴。掩模(通常称为结构化元素)在输入图像中逐像素移动。对于每个位置,掩膜下的最大(用于膨胀)或最小(用于腐蚀)像素值被写入输出图像。图 3 示出了如何计算膨胀的图示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 3: The 3×3 mask is shifted through the image. For dilation, the maximum pixel value under the mask is taken as the resulting value. Two locations of the mask are shown, one resulting in a black pixel (0), the other one resulting in a white pixel (255).

为了了解这两种操作,请看图 4。此外,图 5 示出了灰度值图像及其腐蚀版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 4: Top: input image. Bottom: output images for dilation and erosion.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 5: This example shows how to increase the pen width using multiple erosions.

利用 GPU 的并行性

正如你所看到的,当应用膨胀或腐蚀时,蒙版在图像中移动。在每个位置,应用相同的基本操作(通过掩模选择像素组,输出最大或最小像素值)。此外,输出像素不相互依赖。

这意味着将基本操作实现为输入图像上的一个函数,并为位置添加一个参数。然后,我们同时(并行)对所有可能的位置(x 在 0 和 width-1 之间,y 在 0 和 height-1 之间)调用该函数,以获得输出图像。

让我们先做一个伪代码实现:要么我们调用 synchronous_work(image)并遍历所有(x,y)位置,在每个迭代步骤应用相同的操作。或者我们调用 parallel_work(image,x,y ),并为所有位置并行调用其附加位置参数(例如,通过为每个实例启动一个线程)。图 6 示出了如何并行计算输出像素值。

同步实施:

**synchronous_work**(image):
   for all (x, y) locations in image:
      1\. select pixels from 3×3 neighborhood of (x, y)
      2\. take maximum (or minimum)
      3\. write this value to output image at (x, y)in main: run one instance of **synchronous_work**(image)

并行实现:

**parallel_work**(image, x, y):
   1\. select pixels from 3×3 neighborhood of (x, y)
   2\. take maximum (or minimum)
   3\. write this value to output image at (x, y)in main: run one instance of **parallel_work**(image, x, y) for each (x, y) location in the image at the same time

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 6: Three mask locations are shown. The resulting pixel values do not depend on each other and can therefore be computed at the same time.

OpenCL 实施

让我们移植我们的伪代码,使它运行在真正的 GPU 上:我们将使用开放计算语言(OpenCL)框架。图 7 说明了我们的实现所做的事情:我们首先将输入图像复制到 GPU,编译内核(GPU 程序),对所有像素位置并行执行,最后从 GPU 复制回结果图像。

我们需要为主机和设备分别实现一个程序:

  • CPU(“主机”):一个 Python 程序,它设置 OpenCL,发布 CPU 和 GPU 之间的数据传输,负责文件处理等等
  • GPU(“设备”):一个 OpenCL 内核,它使用一种类似 C 的语言进行实际的图像处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 7: A rough overview of what our OpenCL implementation does.

入门指南

  • OpenCL 已安装并运行
  • pyopencl 已安装并正常工作
  • GitHub 克隆存储库

CPU 程序(主机)

CPU 或主机代码的大部分可以被视为样板代码。大多数时候,设置主要的 OpenCL 数据结构都是以同样的方式完成的。此外,准备输入和输出数据遵循一定的模式,同样适用于 GPU 程序编译,执行和数据传输。您应该能够使用提供的代码实现其他算法,如边缘检测或亮度调整,而无需接触 CPU 程序。让我们快速浏览一下主要步骤。括号中的数字与代码中的数字相对应,以便于导航。

(1)首先,必须完成 OpenCL 初始化:

  • 选择平台:一个平台对应一个安装的驱动程序,例如 AMD
  • 从所选平台选择 GPU 设备:您可能安装了多个 GPU。我们只取 GPU 列表中的第一个条目
  • 创建一个 cl。上下文对象:该对象将运行 GPU 程序的所有相关信息(选定的设备、数据等)联系在一起
  • 创建 cl 类型的命令队列对象。CommandQueue:这个对象是一个 FIFO 队列,它允许我们发出命令向/从 GPU 发送/接收数据,还允许我们在 GPU 上执行程序

(2)准备资料:

  • 将图像从文件读入数字图像
  • 分配与占位符大小相同的输出数字图像。我们稍后将使用来自 GPU 的结果来填充它
  • 创建 cl 类型的缓冲区。保存 OpenCL 图像数据的图像

(3)准备 GPU 程序(图 8 示出了表示 GPU 程序的对象层次):

  • 从文件中读取 GPU 程序的源代码并创建 cl。从中选择程序对象
  • 用 cl 编译程序。Program.build 方法
  • 创建 cl 类型的内核对象。代表我们的 GPU 程序的入口点的内核
  • 设置内核函数的参数:这是我们的 CPU 程序中的数据和 GPU 程序中访问的数据之间的连接。我们传递输入和输出图像缓冲区以及一个整数,该整数表示我们是要应用膨胀(=0)还是腐蚀(=1)。我们使用 cl。方法,并指定内核参数的索引(例如,0 对应于我们的内核函数的参数列表中的第一个参数)和 CPU 数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 8: OpenCL objects representing GPU program and its arguments.

(4)执行 GPU 程序并传输数据:

  • 使用 cl.enqueue_copy 发出一个命令,将输入图像复制到输入缓冲区
  • 执行 GPU 程序(内核):我们实现了像素级的形态学操作,因此我们将为每个(x,y)位置执行一个内核实例。这种数据和内核的结合称为工作项。我们需要处理整个图像的工作项的数量等于宽度*高度。我们将内核和图像大小传递给 cl.enqueue_nd_range_kernel 函数来执行工作项
  • 当 GPU 程序完成其工作时,我们使用 cl.enqueue_copy 将数据从输出缓冲区复制回输出图像(并等待直到该操作完成,以将填充的输出图像返回到调用 Python 函数)

总结:我们设置 OpenCL,准备输入和输出图像缓冲区,将输入图像复制到 GPU,在每个图像位置并行应用 GPU 程序,最后将结果读回 CPU 程序。

GPU 程序(设备上运行的内核)

OpenCL GPU 程序是用类似 c 的语言写的,入口点叫内核函数,我们这里是函数 morphOpKernel(…)。它的参数对应于我们在 CPU 程序中设置的参数。在内核中,有必要访问工作项 id。您要记住:工作项是代码(内核)和数据(在我们的例子中是图像位置)的组合。当在 CPU 程序中调用 cl.enqueue_nd_range_kernel 时,我们指定图像中的每个(x,y)位置需要一个工作项。我们通过使用函数 get_global_id 来访问工作项 id。因为我们有两个维度(因为图像有两个维度),所以我们得到两个维度的 id。第一个 ID 对应于 x,第二个 ID 对应于 y。现在我们知道了像素位置,我们可以读取 3×3 邻域中的像素值,计算输出值,并最终将其写入输出图像中的相同位置。

(1)内核:

  • 执行 GPU 程序时的入口点(也可能有内核调用的子函数)
  • 我们将一个只读的输入图像和一个只写的输出图像传递给内核。此外,我们传递一个整数,它告诉我们是否必须应用膨胀(=0)或腐蚀(=1)

(2)全局 id 标识工作项,在我们的例子中对应于 x 和 y 坐标。

(3)结构化元素(掩模)由两个嵌套循环实现,这两个嵌套循环表示围绕中心像素的 3×3 正方形邻域。

(4a)使用 read_imagef 函数访问像素数据,该函数返回 4 个浮点数的向量。对于灰度值图像,我们只需要可以用 s0 索引的第一个分量。它是介于 0 和 1 之间的浮点值,表示像素的灰度值。我们将图像、像素位置和一个采样器传递给这个函数。采样器允许在像素之间进行插值,但在我们的例子中,采样器只不过是返回给定位置的像素值。

(4b)采样器由选项组合定义。在我们的例子中,我们希望采样器使用非标准化的坐标(从 0 到 width-1,而不是从 0 到 1)。此外,我们禁用像素之间的插值(因为我们不在像素位置之间采样),并且我们还定义了当我们访问图像外部的位置时会发生什么。

(5)根据操作,我们寻找 3×3 邻域内的最大/最小像素值。

(6)将结果写入输出图像。同样,我们指定图像和位置。我们必须传递 4 个浮点数的向量,但是我们只需要填充第一个条目,因为我们的图像是灰度值的。

测试一下

执行 python main.py ,将这两个操作应用于图 9 所示的输入图像。执行后,目录中出现两个文件:dilate.png 和 erode.png,代表膨胀和腐蚀的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 9: This image is used to test the implementation.

幕后发生了什么?

我们为每个像素创建一个工作项,如图 10 所示。GPU 为每个要并行处理的工作项启动某种硬件线程。当然,同时活动的线程数量受到硬件的限制。一个有趣的特性是,这些线程并不是完全独立的:有多组线程同步执行,对不同的数据实例应用相同的操作(SIMD)。因此,内核中的分支(if-else,switch-case,while,for)可能会降低执行速度:GPU 必须为所有在 lock-step 中执行的线程处理两个分支,即使只有一个线程发生分歧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 10: Work-items are instances of the kernel created for all image-locations. Here, three work-items are shown.

GPU 上有不同类型的并行性(如使用向量类型、分区数据和并行应用操作到每个数据元素等)。我们只使用了其中一种类型,在像素级拆分数据,并单独计算每个像素位置的输出。

如果仔细观察 GPU 程序,您可能会注意到变量有不同的地址空间:输入和输出图像对所有工作项都是全局可见的,而在函数中用作暂存区的变量仅对工作项实例可见。这些地址空间对应于底层硬件。举个例子:图像由纹理单元及其采样器处理。这些单元也用于游戏和类似应用中的 3D 物体纹理。

进一步阅读

如果你想对 GPU 编程和 OpenCL 有更深入的了解,没有办法可以绕过阅读这方面的好书。有许多用例可以在 GPU 上高效地计算,而不仅仅是像图像处理和比特币挖掘这样的著名用例。

我推荐这本书[1]来帮助你开始使用 OpenCL。这本书从像 4D 矩阵向量乘法这样的简单程序开始,以像 FFT 或双调排序这样的复杂主题结束。

此外,这本书[2]也是一本很好的读物,但是它已经期望获得一些 OpenCL 的经验。

根据您的 GPU,您可能会找到有关其 OpenCL 实现的信息,以更好地了解 OpenCL 如何转换为硬件,例如,请参见 AMD 的[3]。

Khronos 提供了规范[4]和一个非常有用的 API 参考卡[5]。

[1] Scarpino — OpenCL 在行动
[2] Gaster 等人— OpenCL 的异构计算
[3] AMD 加速并行处理— OpenCL 编程指南
[4]Khronos—OpenCL 规范
[5] Khronos — OpenCL API 参考卡

自然语言处理入门

原文:https://towardsdatascience.com/get-started-with-natural-language-processing-a-multi-label-text-classification-example-in-r-part-bb8f064be5e4?source=collection_archive---------8-----------------------

R 中的多标签文本分类示例(第 1 部分)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文本分类是自然语言处理的一种。 NLP 可以简单地定义为教授一种算法,像人类一样阅读和分析人类(自然)语言,但速度更快,更准确,并且基于大量数据。

如果你是一个有抱负的数据科学家或分析师,你必须知道如何建立一个文本分类模型。从邮件分类到信息发现,实际应用层出不穷。多标签文本分类简单地说就是将文本数据分成两个以上的类别。初学的数据分析师、没有 NLP 经验的数据分析师或其他好奇的数据科学家会发现这个博客很有趣。

你需要对 R 和 RStudio 有所了解。我将使用 R 中的结构化主题模型(STM)包,这是一个使用文档级协变量的无监督聚类包。我已经用 STM 建模了许多文本分类器,它用最少的训练就给出了极好的结果。你可以在这里阅读更多关于 STM 的内容

让我们开始编码吧!

**第一步:获取数据。**对于这个例子,我将使用。txt 文档,这些是我使用 Python 的 BeautifulSoup 从开源中搜集的新闻文章(是的,在搜集数据时,我更喜欢 Python)。

如果你不知道怎么做,不要担心!您可以在线复制粘贴自由文本数据,并将其另存为。txt 文件(确保阅读版权。只使用免费使用的 web 数据)。这是我的数据的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我保存了我所有的。txt 文件放在一个名为 *STM_trainingdata,*的文件夹里,这个文件夹在我的当前目录下。

第二步:在 RStudio 中摄取数据。一个经验法则是为你经常重复的任务编写函数。为了将我的数据接收到 RStudio 中,我编写了一个简单的函数。根据您正在处理的项目和所需的输出,您的函数可以有不同的输入/输出。这是我的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,调用如下所示的函数,您应该会得到“成功!”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您的数据在 RStudio 中应该是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,每次我需要在我的文件夹中添加/修改训练数据时,我在 RStudio 中更新我的数据变量所要做的就是调用 ReadTxt()

**第三步:预处理你的数据。**数据预处理是任何机器学习过程中最重要的步骤之一。不良清理和/或结构化的数据将产生不良结果。在数据浏览期间,您可以使用各种统计和可视化方法来确保数据准备就绪。

因为我们的数据样本非常小,所以我编写了一个基本函数来清理它。你可以在函数里面读到具体的清洗步骤。此外,正如您将在第 2 部分中看到的,STM 提供了额外的数据修剪选项;所以我在这里只关注基础知识。

自然语言处理中一个非常重要的步骤是去除停用词。停用词是在你的语料库中常见的词,因此在确定文本中讨论的主题时没有权重(它们只是你的数据中的噪音)。一些常见的停用词有冠词、代词、感叹词等。

下面的功能是非常可定制的。根据您的训练数据,您可能需要删除更多的停用字词。你可以将它们直接添加到 rem 向量中。例如,您可能也不需要删除 URL。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写函数时,最好使用描述性名称,并添加一些关于输入、输出和过程的解释。

接下来,按如下方式调用该函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您的干净数据应该如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时,RStudio 的全局环境中应该有 4 个项目。见下文:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这就是第 1 部分!在第 2 部分,我们将进入有趣的部分:训练和测试我们的 STM 模型以及一些可视化。敬请期待!

如果你喜欢这个帖子,请为它鼓掌,并随时在LinkedIn和 Twitter上添加我!

坚持为熊猫做贡献

原文:https://towardsdatascience.com/get-stuck-in-with-contributing-to-pandas-fea87d2ac99?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Polina Razorilova on Unsplash

如果这能引起任何数据人员的共鸣,请举手。你的老板给你一个数据集,让你找一些有趣的东西。你拿起数据,把它粘在笔记本上。现在怎么办?很可能你的手指已经下意识地打出了:

import pandas as pd

在这篇文章中,我们不打算浏览熊猫是什么或如何使用它的本质,你可能比我更了解图书馆!相反,我将专注于通过文档回馈数据分析社区。

在参加 PyData London 2018 时,我遇到了一场熊猫冲刺会议。正是在这里,我了解到开源包的受欢迎程度已经超过了贡献的程度,尤其是它的 API 文档。

类似于的群体智慧现象,这表明最好从一个群体中获取意见,而不是把个人的话当作真理——开源允许专家和业余爱好者在一个项目上合作,这可以使整个社区受益。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直到这个冲刺阶段,我还没有真正为开源做出贡献——老实说,我从来没有真正相信我的编码能力达到了标准。然而,我是一个坚持良好文档化代码的人,所以这个 sprint 关注文档的事实给了我一些非常需要的信心。

因此,如果我的故事引起了你的共鸣,而你从未为开源项目做出过贡献,但想这样做,请继续阅读,我将指导你完成这一过程。

让我们为熊猫做贡献

安装

我可以在这里通过设置步骤,但没有必要重新发明轮子…查看超级简洁的熊猫冲刺设置说明这里

现在一切都准备好了🤞,让我解释一下好的文档是什么样子的,以及我们为什么需要它。

文件 101

文档是一组关于特定函数、方法、类或模块使用的简明信息。没有它,用户要么会误解工具的目的,要么会浪费时间去理解源代码。基本上,文档旨在减少理解如何使用工具所需的时间,以便用户可以继续他们的工作。

那么我包括哪些信息呢?

很高兴你问了这个问题,这里有一个包含在你的文档中的 7 个部分的列表…你不会相信第 5 个!

第 1 部分-简短总结

这是用户看到的第一个东西,所以要让它有冲击力!描述函数本质的简短有力的句子。

第 2 部分-扩展总结

不是所有的事情都可以用一句话来描述,没关系。本节允许您更深入地描述该函数的细微差别。

第 3 节-参数

在这里,您为用户提供了该功能所需的一组输入。这些必须包括每个参数的类型和描述。

第 4 节-退货

如果函数返回一个值或者改变一个状态,这必须引起用户的注意,因为误解可能会对下游产生严重的后果。请务必在此记录。

第 5 节——参见

在本节中,文档试图将用户的注意力吸引到其他相关功能上。与其他功能相关联可以给用户更直观的理解。

第 6 节-注释

这是一个可选部分,在“扩展总结”中没有解释的任何细节都可以在这里讨论。

第 7 节-示例

人们喜欢在实践中学习,没有比在真实场景中使用概念更好的方法来具体理解概念。你应该包括一些如何使用该功能的例子。

文档走查

在冲刺的那一天,每个参与者都有一个功能或方法来记录——我被指定为熊猫。Series.str.contains 。就像第 7 节一样,我会通过这个例子告诉你。

步骤 1-初始概述

查看文档的当前状态。创建一个潜在改进领域的清单,并在每一项都被勾掉后得到急需的多巴胺修复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如您所看到的,上面讨论的一些部分不存在,在参数类型和一些格式问题上有一些差异。总体来说,还不算太寒酸。

第 2 步-试用该功能

在你写一个函数之前,你必须理解这个函数,这很重要。想出尽可能多的理由,为什么你会想在日常编程中使用它,然后实现一些基本的用例。这些可在第 7 节中作为示例使用。您还可以通过编写几个单元测试来进一步阐明您对该函数的理解。

第三步——还有谁在同一条船上?

请记住,我们这样做的原因是为了帮助人们有效地理解代码。在 Google、Stack Overflow 或者 Github 上搜索该功能,看看之前有没有人出现过问题。如果类似的问题不断出现,针对这些问题修改文档以消除任何歧义。当搜索熊猫的问题时。Series.str.contains 我一直碰到涉及正则表达式的。为了解决这个问题,我确保在相关的例子中包含一些这样的例子。

第四步——合规

不同的思想有不同的风格,一般来说,多样性是一件好事。然而,随着代码库的增长,一致性是至关重要的。对于 python,大多数库都试图遵循代码格式指南,pandas 遵循 PEP 257 。这包括从空白到不定式动词使用的所有指南。这听起来可能很迂腐,但是这些指导方针已经被修改和调整了近二十年,它们的存在是有原因的——所以使用它们吧!

幸运的是,pandas 的核心开发人员已经构建了一个脚本来检查您的代码是否符合他们的风格指南。偶尔运行一下并相应地修改代码是很方便的。

python scripts/validate_docstrings.py <insert-your-function-here>

你还应该运行著名的 python linter,flake8 来保持一切整洁。

git diff upstream/master -u -- "*.py" | flake8 --diff

一旦您觉得文档符合标准,请快速预览一下:

python make.py html — single pandas.Series.str.contains

好看吗?是时候发出拉取请求了。查看此页面以获得您的建议。

这个阶段包括你向核心开发者发布你的建议,如果他们喜欢你的建议,他们会在下一个版本中接受它。

还有一件事…核心开发人员会比你更了解好的文档,所以他们可能会对你的建议有一些意见。我的建议是不要把它放在心上,只是冲洗和重复,做修复和推动你的拉请求。

不要害怕公开你的错误,反馈是你的朋友。否则你永远不会从你的错误中吸取教训,或者更糟——养成一个坏习惯。请记住,核心开发人员迫切需要像您这样想要提供帮助的人!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以在这里,在所有的荣耀中,检验我的改进版熊猫。Series.str.contains

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以看到,我对该方法进行了清晰而简明的描述,添加了一个扩展的总结,整理了参数,整理了返回部分,并添加了大量典型用例。

如果这份美丽的文档激励你尝试为熊猫(或任何其他项目)做贡献,请在这里仔细阅读文档,尝试找出任何你认为可以改进的地方。如果您不确定要深入研究什么,可以使用以下脚本返回需要改进的文档列表:

python scripts/validate_docstrings.py

所以我们走吧!我希望这给了你一点信心,让你开始成为一名开源贡献者的旅程。感谢您的阅读,如果您有任何问题,请在下面的评论区留言。

我还要感谢马克·加西亚对熊猫文档冲刺的指导。

使用 Docker、Telegraf、Influxdb 和 Grafana 获取 5 分钟的系统指标

原文:https://towardsdatascience.com/get-system-metrics-for-5-min-with-docker-telegraf-influxdb-and-grafana-97cfd957f0ac?source=collection_archive---------2-----------------------

总之,这里有一个非常快速的指南,告诉你如何使用一系列现代技术,如 Grafana、Docker 和 Telegraf with Influxdb,为一台或多台服务器配置系统监控。

本文的主要目标是展示如何快速简单地从服务器获取系统指标,而无需花费大量时间来配置庞大而复杂的监控系统。尤其是如果您只需要管理少数几个 Web 服务器,而不是监控拥有数百台设备的大公司基础架构。

我们将使用 Docker 来快速部署我们的监控系统,这也将使我们能够自由地使用任何软件,并且保持我们的系统干净。话题性的,你也可以从这个角度看 Docker,作为一个跨平台的包系统。

此外,我们将使用 Tick 堆栈的一部分,即 Influxdb 库来存储我们的指标和 Telegraf,就像远程系统上的代理一样,对于漂亮的图形,我们将采用 Grafana。

图例:

服务器 1 —监控服务器

服务器 2、服务器 3 等—我们需要从中获取指标的服务器

在 server1 上,我们将准备我们的监控系统,为此我们需要一个安装了 Docker 和 Docker Compose 的 Linux。

如何获取并安装 Docker

首先为我们的项目创建一个文件夹,例如/opt/monitoring:

server1$ mkdir /opt/monitoring && cd /opt/monitoring

在目录中,我们需要用 Grafana 和 Influxdb 服务创建 docker-compose.yml 文件:

version: "2"
services:
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    ports:
      - 3000:3000
    networks:
      - monitoring
    volumes:
      - grafana-volume:/var/lib/grafana influxdb:
    image: influxdb
    container_name: influxdb
    restart: always
    ports:
      - 8086:8086
    networks:
      - monitoring
    volumes:
      - influxdb-volume:/var/lib/influxdbnetworks:
  monitoring:volumes:
  grafana-volume:
    external: true
  influxdb-volume:
    external: true

如您所见,我们使用自己的 docker 网络来提供这些服务,包括名称监控和外部卷来存储数据和配置,我们使用外部卷来防止容器重启后的任何数据丢失。

实际上,为容器组使用自己的网络是一个很好的实践,便于逻辑分离属于同一项目的容器,也便于从 docker 引擎获得内置服务发现。

现在我们需要创建 Docker 网络和卷:

server1$ docker network create monitoring
server1$ docker volume create grafana-volume
server1$ docker volume create influxdb-volume

确保一切都创建得很好:

server1$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8a744bc6ce04        bridge              bridge              local
a9fe3f026042        host                host                local
75c2b515def9        monitoring          bridge              local
c1a42ddaa998        none                null                local

server1$ docker volume ls
DRIVER              VOLUME NAME
local               69c5364fab3baa7b1c9418ace9c91dfcf13e54f0adce247136d887e46a347baf
local               grafana-volume
local               influxdb-volume

如我们所见,网络和卷已创建完毕,现在我们需要准备 Influxdb 参数,为此,我们将使用一些环境变量来运行容器,以创建数据库和用户:

server1$ docker run --rm \
  -e INFLUXDB_DB=telegraf -e INFLUXDB_ADMIN_ENABLED=true \
  -e INFLUXDB_ADMIN_USER=admin \
  -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \
  -e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \
  -v influxdb-volume:/var/lib/influxdb \
  influxdb /init-influxdb.sh

我们使用–RM 密钥运行此容器,这将仅创建配置并在之后删除容器。

所有准备工作都已完成,我们准备启动新的监控系统,使用 docker-compose,转到/opt/monitoring 目录并运行:

server1$ docker-compose up -d

Creating network "monitoring_monitoring" with the default driver
Creating grafana
Creating influxdb

server1$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8128b72bdf44        grafana/grafana     "/run.sh"                23 seconds ago      Up 20 seconds       0.0.0.0:3000->3000/tcp   grafana
c00416d0d170        influxdb            "/entrypoint.sh infl…"   23 seconds ago      Up 21 seconds       0.0.0.0:8086->8086/tcp   influxdb

好了,所有的容器都被创建并启动了,所以我们的监控系统准备好为传入的请求服务了。我们公开了几个端口,正如你在 docker-compose 文件中看到的,8086 HTTP API 端口用于 Influxdb 数据,3000 端口用于 Grafana web UI。

我们几乎完成了新的监控系统,使用 Docker 真是又快又简单。为了完全完成,我们只需要稍微配置 Grafana,为 Influxdb 创建一个仪表板和新的数据源。

为此,将在浏览器中访问我们的 server1 public_ip:3000(在我们的示例中为 192.168.0.1:3000 ),并使用以下命令首次登录 Grafana web UI:

登录:管理员

密码:admin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后 Grafana 会要求您更改密码,之后您将进入:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择 Add data source 菜单,告诉 Grafana 从哪里获取 Influxdb 数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我们需要选择 Type = InfluxDB,给出这个数据源的名称,然后使用我们的 InfluxDB 容器名称作为地址放置 URL。正如我之前所说,Docker 给了我们一个简单的服务发现。

好的,我们还需要为我们的数据库插入数据库名称和用户/密码,这些参数是通过之前运行 Influxdb 容器创建的。

单击保存和测试,查看您的数据源是否正常:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太好了,我们刚刚添加了我们的 influxdb 作为 Grafana 的数据源,为了节省时间,我们将准备一个包含最流行参数的仪表板,转到grafana.com并选择一个您喜欢的。举个例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

复制数字 914,然后将其插入您的 grafana 导入菜单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仅此而已,我们只需要在我们想要控制的系统上安装 telegraf,并将其配置为向 server1 上的 influxdb 发送数据。

您可以将 telegraf 作为软件包安装,或者编译最新版本并将其复制到远程服务器。

安装 Telegraf

更改 telegraf 配置并配置 influxdb 数据库参数。

还要启用你需要的插件。

*###############################################################################*
*#                            OUTPUT PLUGINS                                   #*
*###############################################################################**# Configuration for sending metrics to InfluxDB*
[[outputs.influxdb]]
  *## The full HTTP or UDP URL for your InfluxDB instance.#### Multiple URLs can be specified for a single cluster, only ONE of the*urls = ["http://server1_ip:8086"] *## The target database for metrics; will be created as needed.*
   database = "telegraf" *## If true, no CREATE DATABASE queries will be sent.  Set to true when using## Telegraf with a user without permissions to create databases or when the## database already exists.*
  skip_database_creation = true *## Name of existing retention policy to write to.  Empty string writes to## the default retention policy.  Only takes effect when using HTTP.# retention_policy = ""* *## Write consistency (clusters only), can be: "any", "one", "quorum", "all".## Only takes effect when using HTTP.# write_consistency = "any"* *## Timeout for HTTP messages.*
   timeout = "5s" *## HTTP Basic Auth*
   username = "telegraf"
   password = "secretpassword"

干得好:)现在,我们有了一个非常漂亮的仪表板,时间最短:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以在多台服务器上安装 Telegraf,也可以将系统指标发送到一个 InfluxDB base,然后您只需在 Grafana dashboard 中选择服务器名称即可查看它们。

还有一件重要的事情是关于在 InfluxDb 中保存数据的持续时间,默认情况下它设置为 7 天,所以如果您需要比这更长的时间,请执行到 influxdb 容器并手动更改保留策略。

嗯,我想现在我们在 5 分钟内就有了一个很好的监控系统:)

祝你好运。

获取和清理数据(JHU Coursera,课程 3)

原文:https://towardsdatascience.com/getting-and-cleaning-data-jhu-coursera-course-3-c3635747858b?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Getting and Cleaning Data JHU Coursera Course 3 Review

数据科学专业的第三门课程“获取和清理数据”是一门基础课程。一如既往,测验和作业的代码位于我的 github 上。

**第一周复习:**阅读 Excel、XML、JSON 文件必不可少。我很满意关于数据表包的讲座,因为我用它来做这个专业的所有测验和作业。我希望他们有一个以上的讲座,虽然因为它不是那么容易学会。

Getting and Cleaning Data John Hopkins Quiz 1

**第二周回顾:**更多相同的内容。与各种数据源(MySQL、HDF5 等)交互。我希望他们能更多地谈论 github API。我注意到很多学生在那个问题上有很多困难。以至于我写了一篇关于如何用 Github API 访问数据的独立博文。

Getting and Cleaning Data John Hopkins Quiz 2

**第 3 周和第 4 周回顾:**看完 data.table 后再看 dplyr 似乎有点多。第 4 周复习了正则表达式和编辑文本变量,这非常重要,应该在第 3 周测验之前完成,因为这是必要的。

Getting and Cleaning Data John Hopkins Quiz 3

Getting and Cleaning Data John Hopkins Quiz 4

**项目回顾:**这个项目非常有用,因为它让人们下载文件、解压缩、清理和组织数据文件。具有讽刺意味的是,同一周我在工作中也做了类似的事情,这让我对这门课程评价很高。正式任务位于我的 github 上。

Getting and Cleaning Data John Hopkins Project

请让我知道你是否有任何问题,或者如果你有任何关于我如何改进我的编码技巧!这个约翰·霍普斯金专业甚至帮助了我的工作。下一门课程“探索性数据分析”的复习已上线。

将数据导入张量流估算模型

原文:https://towardsdatascience.com/getting-data-into-tensorflow-estimator-models-3432f404a8da?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Mathew Schwartz on Unsplash

机器学习是关于你的数据的数量和质量。上述数据通常可从多种来源获得:

  • 文本文件(CSV、TSV、Excel)
  • 数据库
  • 流媒体源

文本文件是由从其他来源提取数据的某个人或某些人提供的,但他们希望您不必亲自提取数据。数据可以在一个或多个文件中,有或没有标题。

张量流估计器使用输入函数。输入函数的签名返回一组要素和标注。特性是特性名称和数值数组的字典。标签是一组值。需要进行一些管理,比如对数据进行洗牌,然后分批返回。你采取的方法决定了你需要付出多少努力。

让我们从简单的选项开始。如果你把数据放在一个文件中,你可以把它完全读入内存(所谓的玩具例子),而且这个文件是以文本分隔的格式(CSV,TSV 等),所需的工作量是最小的。通常情况下,你可以用 numpy 或 pandas 来读取你的文件。

提醒一下,在使用tf.estimator API 的时候,需要在训练的时候传入一个输入函数。这是用于训练的函数签名:

train(
    input_fn,
    hooks=None,
    steps=None,
    max_steps=None,
    saving_listeners=None
)

我们的重点是input_fn!我们将使用流行的波士顿住房数据,这些数据在这里托管。

如果你有 numpy 格式的数据,你可以使用tf.estimator.inputs.numpy_input_function来获取你的数据。首先,您需要为您的特征定义一个字典:

# extract numpy data from a DataFrame
crim = train_df['crim'].values
zn = train_df['zn'].values
indus = train_df['indus'].values
chas = train_df['chas'].values
nox = train_df['nox'].values
rm = train_df['rm'].values
age = train_df['age'].values
dis = train_df['dis'].values
rad = train_df['rad'].values
tax = train_df['tax'].values
ptratio = train_df['ptratio'].values
black = train_df['black'].values
lstat = train_df['lstat'].values
medv = train_df['medv'].values# create a dictionary
x_dict = {
    'crim': crim,
    'zn': zn,
    'indus': indus,
    'chas': chas,
    'nox': nox,
    'rm': rm,
    'age': age,
    'dis': dis,
    'rad': rad,
    'tax': tax,
    'ptratio': ptratio,
    'black': black,
    'lstat': lstat
}

有了字典,我们可以继续定义输入函数。

def np_training_input_fn(x, y):
  return tf.estimator.inputs.numpy_input_fn(
      x= x,
      y= y,
      batch_size= 32,
      num_epochs= 5, # this way you can leave out steps from training
      shuffle= True,
      queue_capacity= 5000
  )

在我们的函数中,我们传入 x 和 y,x 是我们的字典,y 是我们的标签。我们还可以传入我们的批量大小、时期数以及是否打乱数据。请注意,你总是想打乱你的数据。批量大小是一个超级参数,你应该凭经验归档。epochs 的数量是您想要查看数据的次数。对于训练,设置任何数字。对于测试,将其设置为 1。

在创建评估器之前,您需要特性列。

feature_cols = [tf.feature_column.numeric_column(k) for k in x_dict.keys()]lin_model = tf.estimator.LinearRegressor(feature_columns=feature_cols)lin_model.train(np_training_input_fn(x_dict, medv), steps=10)

您可以省略步骤,以便训练使用在训练输入函数中指定的时段,或者指定用于训练的步骤数。numpy 输入到此为止。

对于数据帧,您将继续定义输入函数如下:

def pd_input_fn(df, y_label):
  return tf.estimator.inputs.pandas_input_fn(
      x=df,
      y=df[y_label],
      batch_size = 32,
      num_epochs = 5,
      shuffle = True,
      queue_capacity = 1000,
      num_threads = 1
  )

请注意,在上面的方法中,我们继续传入数据帧,并在其中添加标签。如果标签不在您传递给x的内容中,您将得到一个错误。你把一个系列传给y。其他参数与处理 numpy 时相同。

该模型在未来会得到同样的对待。创建模型并指定特征列。然后,您继续训练模式。

lin_model = tf.estimator.LinearRegressor(feature_columns=feature_cols)lin_model.train(pd_input_fn(train_df, 'medv'), steps=10)

当您可以将数据读入内存时,一切都很好。但是,当你不能的时候会发生什么。当你的训练数据集是 100GB 时会发生什么?

好消息是,这样的数据集通常由分布式系统生成,因此您的文件将是sharded。这意味着数据将被存储在不同的文件名为data-0001-of-1000的文件中。

如果你从未处理过大数据,你的第一个想法可能是使用glob。不要这样做,除非你知道你正在处理一个玩具的例子。你会耗尽你的记忆,训练也会停止。

这些类型的文件通常没有头文件,这是一件好事。首先,您将定义一个列名列表,这些列名应该按照您的列在文件中存在的顺序排列。其次,定义一个标签列。最后,定义一个缺省值列表,以便在读取过程中遇到缺失值时可以处理它们。

CSV_COLUMNS = ['medv', 'crim', 'zn', 'lstat', 'tax', 'rad', 'chas', 'nox', 'indus', 'ptratio', 'age', 'black', 'rm', 'dis']
LABEL_COLUMN = 'medv'
DEFAULTS = [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]

接下来,我们定义一个函数来读入文本数据,并返回我们的格式,就像我们前面的函数处理它们一样。函数创建方式的一个优点是它可以处理通配符,比如data-*

**def** read_dataset(filename, mode, batch_size = 512):
  **def** _input_fn():
    **def** decode_csv(value_column):
      columns = tf.decode_csv(value_column, record_defaults = DEFAULTS)
      features = dict(zip(CSV_COLUMNS, columns))
      label = features.pop(LABEL_COLUMN)
      **return** features, label

    *# Create list of files that match pattern*
    file_list = tf.gfile.Glob(filename)

    *# Create dataset from file list*
    dataset = tf.data.TextLineDataset(file_list).map(decode_csv)
    **if** mode == tf.estimator.ModeKeys.TRAIN:
        num_epochs = None *# indefinitely*
        dataset = dataset.shuffle(buffer_size = 10 * batch_size)
    **else**:
        num_epochs = 1 *# end-of-input after this*

    dataset = dataset.repeat(num_epochs).batch(batch_size)
    **return** dataset.make_one_shot_iterator().get_next()
  **return** _input_fn

该函数接受三个参数:一个匹配多个文件的模式、一个模式(训练或评估)和一个批处理大小。注意read_dataset返回一个函数。我们称这个函数为_input_fn。在这个函数中,我们有一个名为decode_csv的函数,它将创建一个字典,提取一个序列,并以我们在本文开头提到的元组格式返回两者。

其次,我们的函数使用glob创建一个文件名列表。是的,glob仍然被使用,但是我们不把结果传递给一个pandas.read_csv()。反而遇到了tf.data.TextLineDataset()。它有三个参数:文件名列表、压缩格式(none、ZLIB 或 GZIP)和缓冲区大小。read_csvTextLineDataset的主要区别在于,前者将内容读入内存(我们可以批量读取),而后者返回一个Iterator

因此,我们的函数通过调用map函数,传入decode_csv,使用TextLineDataset创建一个数据集。它做的下一件事是检查我们是否处于训练模式。如果不是,我们的历元数被设置为 1。如果是的话,它会被设置为我们想要的任意多个纪元。我们的训练数据集也被打乱了。然后,我们的数据集被设置为重复我们想要的历元数,并根据我们的批量大小进行配置。

最后,我们返回一个一次性迭代器,并调用get_next()。所有这些工作都由我们前面看到的函数在幕后处理。我们可以使用以下方法创建我们的训练、评估和测试输入函数:

**def** get_train():
  **return** read_dataset('./train-.*', mode = tf.estimator.ModeKeys.TRAIN)

**def** get_valid():
  **return** read_dataset('./valid.csv', mode = tf.estimator.ModeKeys.EVAL)

**def** get_test():
  **return** read_dataset('./test.csv', mode = tf.estimator.ModeKeys.EVAL)

剩下的过程和我们看到的完全一样。我们可以像往常一样创建我们的估计器并训练它。

对于真正的项目,你将从阅读一个使用熊猫和tf.estimator.inputs的训练文件开始。但是,要在培训中使用所有文件,您需要使用tf.data.TextLineDataset

快乐编码。

为建模准备数据:特征工程、特征选择、降维(下)

原文:https://towardsdatascience.com/getting-data-ready-for-modelling-feature-engineering-feature-selection-dimension-reduction-39dfa267b95a?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是为建模准备数据系列的第二部分。如果您还没有阅读第 1 部分,那么我建议您先浏览一遍。因为特征工程通常是第一步。

[## 为建模准备数据:特征工程、特征选择、降维…

特征工程,特征选择,降维

…特征工程、特征选择、尺寸 Reductionmedium.com](https://medium.com/@desardaakash/getting-data-ready-for-modelling-feature-engineering-feature-selection-dimension-reduction-77f2b9fadc0b)

一旦有了足够的、更少的或没有丢失的数据或异常值,接下来就是特征选择或特征提取(这两者通常做相同的工作,可以互换使用)。通常有两种方法:

  1. 特征提取/选择
  2. 维度缩减或特征缩减

让我们一个一个地,一步一步地解决它们。

第 2 部分:特征提取/选择

那么什么是特征选择呢?特征提取?他们的区别?

→在机器学习和统计学中,特征选择也称为变量选择,是选择相关特征(变量、预测器)的子集用于模型构建的过程。

→特征提取用于创建一个新的、更小的特征集,该特征集仍能捕获大部分有用信息。

→同样,特征选择保留原始特征的子集,而特征提取创建新的特征。

特征选择/提取的重要性

→当特征数量非常大时,这变得更加重要。

→你不需要使用你所掌握的每一个特性来创建一个算法。

→你可以通过只输入那些真正重要的特征来帮助你的算法。

为什么要使用特征选择?

→它使机器学习算法能够更快地训练,降低复杂性,并使其更容易解释。

→如果选择了正确的子集,它会提高模型的准确性。

→减少过度拟合。

它可以大致分为两种技术(尽管这不是“T8”的唯一方法)

I .单变量特征选择

二。多元特征选择

U 访问每一个特征,并根据目标检查其重要性。为了实现单变量特征选择,你应该掌握一些技巧。

→如果你有适当的领域知识并且相信你的判断,那么总是从这一步开始。分析所有的特征,去掉所有不需要的。是的,这是费时费力的一步,但是,嘿,你更相信谁呢,“机器还是你自己”

检查所有特征的方差(是的,永远令人困惑的偏差-方差权衡:)。这里的经验法则是设置一个阈值(假设一个特征的方差为 0,意味着它对每个样本都具有相同的值,因此这样的特征不会给模型带来任何预测能力)并相应地移除特征。

→ **皮尔森相关性的使用:**这可能是三种技术中最适用的一种。如果你不知道或者对它感到困惑,那么先看看这篇文章

  • 因此,简而言之,它给了我们目标变量和特征之间的相互依赖性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Thump Rule To analyse Pearson Correlation

  • 使用皮尔逊相关性的经验法则:

I .仅选择与目标变量的中度至强关系。(见上图)。

二。当两个特征本身与目标变量有很强的相互关系时,选择其中任何一个(选择两个都不会增加任何值)。使用’seaborn . heat map()**'**进行可视化和挑选,很有帮助。

三。这里有一个陷阱😢。它最适用于线性数据,不适用于非线性数据(所以请避免使用它)。

M 所以用外行的话来说就是一次选择多个特性。

多元特征选择大致分为三类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们来看看它们(我们将讨论每个类别中最广泛使用的技术)

过滤方法:

→过滤方法通常用作预处理步骤。特征的选择独立于任何机器学习算法。

→过滤方法对特征进行排序。等级表示每个特征对于分类的“有用”程度。一旦计算出这个排序,就创建了由最好的 N 个特征组成的特征集。

→根据其在各种统计测试中的得分选择特征,以确定其与结果变量的相关性。(这里的相关性是一个主观术语)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Blueprint of Filter Method

  1. **皮尔逊相关:**哦对!皮尔逊相关是过滤方法。我们已经讨论过了。
  2. 方差 **阈值:**这一点我们也已经讨论过了。
  3. **线性判别分析:**目标是将数据集投影到一个具有良好类别可分性的低维空间,以避免过拟合()【维数灾难】,同时降低计算成本。

→没有进入数学领域,LDA 将所有的高维变量(我们不能绘制和分析)放到 2D 图上&同时这样做去除了无用的特征。

→ LDA 也是的 监督降维 技术,更像是特征提取而不是选择(因为它通过降低变量的维度来创建一种新的变量)。所以它只对带标签的数据有效。

→最大化类别间的可分性*。(技术术语太多,对。不要担心看视频)。*

Creator: Josh Starmer

其他:

ANOVA: 方差分析除了使用一个或多个分类独立特征和一个连续相关特征进行操作之外,它类似于 LDA。它提供了几个组的平均值是否相等的统计检验。

***卡方:*这是一种应用于分类特征组的统计检验,利用它们的频率分布来评估它们之间相关或关联的可能性。

需要记住的一点是,过滤方法不能去除多重共线性。因此,在为数据训练模型之前,还必须处理要素的多重共线性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

What to choose when

包装方法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Blueprint Of Wrapper Method

→根据我们从之前的模型中得出的推论,我们决定在您的子集中添加或删除特征。

→包装方法之所以被称为包装方法,是因为它们将分类器包装在特征选择算法中。通常选择一组特征;这种设置的效率是确定的;进行一些扰动以改变原始集合,并评估新集合的效率。

→这种方法的问题是特征空间很大,查看每个可能的组合需要大量的时间和计算。

→问题本质上归结为一个搜索问题。这些方法通常在计算上非常昂贵。

  1. ***正向选择:*正向选择是一种迭代方法,我们从模型中没有特征开始。在每一次迭代中,我们不断地添加最能改进我们模型的特性,直到添加一个新变量不能改进模型的性能。
  2. ***向后消除:*在向后消除中,我们从所有特征开始,并在每次迭代中移除最不重要的特征,这提高了模型的性能。我们重复这一过程,直到在特征的移除上没有观察到改进。
  3. 【递归特征消除(RFE) : It 的工作原理是递归地删除属性,并在那些保留的属性上建立模型。它使用外部估计器为要素分配权重(例如,线性模型的系数),以确定哪些属性(以及属性组合)对预测目标属性的贡献最大。

→这是一种贪婪优化算法,旨在找到性能最佳的特征子集。

→它重复创建模型,并在每次迭代中保留最佳或最差的性能特征。

→它用剩下的特征构造下一个模型,直到所有的特征都用完。然后,它根据要素被消除的顺序对其进行排序。

*# Recursive Feature Elimination
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression# create a base classifier used to evaluate a subset of attributes
model = LinearRegression()X, y = iowa.iloc[:,:-1], iowa.iloc[:,-1]
# create the RFE model and select 3 attributes
rfe = RFE(model, 10)
rfe = rfe.fit(X, y)# summarize the selection of the attributes
print(rfe.support_)
print(rfe.ranking_)
***Output:*** [False False  True  True False False False False False False False False
 False False False  True  True  True False  True  True  True  True False
  True False False False False False False False False False]
[16 24  1  1  4  9 18 13 14 15 11  6  7 12 10  1  1  1  2  1  1  1  1  5  1
 23 17 20 22 19  8 21 25  3]*

→下面是上面例子中发生的情况,

I . 'rfe . support _【T9]'按顺序给出了与特性相关的结果(显然是基于所选型号和需求编号)。

二。 rfe.ranking_ ‘分别给出所有特性的等级。当你需要的功能比输入给’ n_features_to_select’ (在上面的例子中是 10 个)的功能更多时,这真的很方便。所以,你可以设置一个阈值&分别选择它上面的所有特征。

4。顺序特征选择器 : 顺序特征选择算法是一类贪婪搜索算法,用于将初始的 d 维特征空间缩减为 k 维特征子空间(其中 k < d)

→逐步推进特性选择从评估每个单独的特性开始,并选择能够产生最佳性能选定算法模型的特性。

→后退功能选择密切相关,正如您可能已经猜到的,它从整个功能集开始,并从那里后退,删除功能以找到预定义大小的最佳子集。

→什么叫“最好?”

这完全取决于定义的评估标准(AUC、预测准确性、RMSE 等。).接下来,评估所选特征和后续特征的所有可能组合,并且选择第二特征,等等,直到选择了所需的预定数量的特征。

→简而言之,SFA 根据分类器性能一次删除或添加一个特征,直到达到所需大小的特征子集 k

注意:我建议你访问官方文档,通过例子了解更多细节

*[## 顺序特征选择器— mlxtend

包含日常数据科学任务的有用工具和扩展的库。

rasbt.github.io](http://rasbt.github.io/mlxtend/user_guide/feature_selection/SequentialFeatureSelector/)*

嵌入式方法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Blueprint of Embbeded Methods

→嵌入式方法结合了过滤器和包装器方法的特性。它是由具有内置特征选择方法的算法实现的。

→因此,这不是任何类型的特殊特征选择或提取技术,它们也有助于避免过度拟合。

  1. 线性回归中的套索正则化
  2. 在随机森林中选择 k-best
  3. 梯度推进机

过滤器和包装器方法之间的区别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 3 部分:降维

所以,还是从同一个问题开始,什么是降维?

简单来说,就是将一个初始的 d 维特征空间缩减为一个 k 维特征子空间(其中k<d】)。

那么特征选择&提取又是为什么呢?

某种程度上,是的(但只是俗人术语’)。为了理解这一点,我们必须深入研究。**

在机器学习中,维度简单来说就是指你的数据集中的个特征**(即输入变量)的数量。当要素的数量相对于数据集中的观察值数量非常大时,某些算法很难训练出有效的模型。这被称为“维数灾难”,它尤其与依赖于距离计算的聚类算法相关。**

(Quora 的一位用户为维度诅咒提供了一个很好的类比,看看吧)

因此,当你拥有 100 个甚至 1000 个特性时,你只有一个选择降维。让我们讨论两种非常健壮和流行的技术。

  1. 线性判别分析(LDA): 是的,与过滤方法(如上所述)一起,它也被用作降维技术。

→当特征被标记时,我们在监督学习中使用 LDA。

→请努力理解 LDA(如果您还没有理解的话)。

2。主成分分析(PCA): 主成分分析的主要目的是对数据进行分析,以识别模式并找出模式,从而以最小的信息损失降低数据集的维度。

→ PCA 将尝试通过探索数据的一个特征如何用其他特征来表示来降低维数(线性相关性)。相反,特征选择会考虑目标。

→ PCA 最适用于 3 维或更高维的数据集。因为随着维度的增加,从产生的数据云中做出解释变得越来越困难。

(PCA 有点复杂,没错。在这里解释会让这篇已经很长的博客更无聊。所以用这两个极好来源来理解,

一、主成分分析一站式服务

二。Josh Starmer 的视频解释(来自 StatQuest 的同一个人)

Creator: Josh Starmer

W 说唱起来:但不是通过包装方法(咄…😜).这是系列的结尾。最后(但不是列表)分钟提示:

永远不要忽视特征工程和特征选择,一切都要依靠算法。

二。在尾注上,我分享了两个非常有用并且非常棒的工具(记住我的话,这会对你有很大帮助)

特征选择器 (这得感谢威廉·科尔森)

特征工具 (或)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值