TowardsDataScience 博客中文翻译 2019(三百零九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

机器学习中的核心秘密。2

原文:https://towardsdatascience.com/kernel-secrets-in-machine-learning-pt-2-16266c3ac37c?source=collection_archive---------21-----------------------

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

想使用内核吗?让我们通过几个众所周知的内核来感受一下吧!

在关于这个主题的第一篇文章机器学习中的内核秘密中,我以最基本的方式解释了内核。在继续阅读之前,我建议你快速浏览一下这篇文章,如果你还不知道内核是什么的话。希望你会得出这个结论:

核是映射空间中两个向量之间的相似性度量。

很好。现在我们可以检查和讨论一些众所周知的内核,以及我们如何组合内核来产生其他内核。请记住,对于我们将要使用的示例,x 是用于绘图目的的一维向量,我们将 x '的值固定为 2。事不宜迟,让我们开始 kerneling。

线性核

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

这个核的超参数是 sigma 和 offset 参数 c,直观来看,这个核是什么意思?如果我们取一个特定的 x,和其他所有的 x 比较,我们会得到一条直线。这就是为什么它被称为线性核。固定 x 和改变 x '实际上意味着我们沿着这条线移动。

这个内核的另一个特点是它是不稳定的。这意味着它的值相对于 x 的绝对位置而非相对位置变化。这个内核的另一个好处是,由于它是线性的,所以在优化中计算起来非常有效。

多项式核

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

顾名思义,这个内核是一个偏移量为 c 的多项式函数。我认为值得花一点时间来考虑一下导致这个内核的映射函数ϕ,因为如果你记得内核是映射空间中的一个相似性函数(点积),那么它返回一个标量!二维空间中 2 次多项式核的映射函数如下所示:

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

当增加输入维数 d 和多项式的次数时,我们映射到的结果特征空间变得相当大。好的一面是,我们可以计算点积,而不需要进行转换,就像上面的公式中指定的那样。这是内核理论中许多美丽的公式之一。

径向基函数核

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

这是一个非常著名并且经常使用的内核。请注意,由于指数中的负指数,指数值的范围是从 0 到 1,这是一个很好的特性,因为我们可以说 1 表示非常相似,或者相同,接近 0 表示完全不同。指数中的σ参数控制内核的灵敏度。对于低σ值,我们预计只有非常接近的点才会相似。对于更大的σ,我们放宽了相似性标准,因为稍微远一点的点会更相似。

但是当然,内核看起来是这样的,因为我们把 X 固定为 0,改变了 X ',逻辑上足够我们想要计算点之间在整个 X 域中的相似性。这暗示了一个平面,实际上,这个平面就是内核的一个例子:

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

不够令人印象深刻的是,内核的值在对角线上最高,这里 x 和 x '是相同的。

周期核

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

当你想到周期性时,你会不由自主地想到正弦和余弦这样的周期函数。逻辑上,周期核有正弦函数在里面。核的超参数再次是σ,其指定相似性的灵敏度,但是另外,我们有参数 p,其指定正弦函数的周期。这应该完全说得通。此外,请注意径向基核和周期核之间的相似性,两者都被限制为输出 0 和 1 之间的值。

什么时候需要使用周期性内核?这是很符合逻辑的,比如说你想建立一个正弦函数的模型。仅仅从这个函数中取两个距离欧几里德距离较远的点,并不意味着函数值有意义的不同。为了解决这类问题,你需要周期内核。为了完整起见,看看当我们调整周期内核的周期性时会发生什么(没有什么意外):

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

局部周期核

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

我们基本上只是通过取径向基核,并将其与周期核相乘来得到这个核。我们由此实现的是,所得到的核还随着 x 和 x’之间的距离而改变其值,而不仅仅是随着距离的周期性而改变。这导致了所谓的局部周期性。

只是因为我很好奇,让我们用 3D 绘制这个内核,并得到下面这个漂亮时髦的形状:

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

看起来相当酷!

构建新内核

现在我们已经看到了一些内核的例子。问题来了,我们需要什么来构造新的内核?内核有两个很好的特性:

  1. 添加带有内核的内核会产生一个新的内核。
  2. 内核相乘产生一个新的内核

这些允许你基本上不需要做太多的数学运算就能构建出非平凡的内核,这真的很直观。乘法也许可以看作是一种 and 运算,特别是当考虑 0 和 1 之间的核时。因此,我们可以通过将周期核与径向基函数核相结合来得到局部周期核。

这些是让您开始您的内核冒险的几个例子。当然,这仅仅触及了所有有趣内核的表面。为某个问题量身定制内核设计是一项重要的任务。精通它需要一定的经验。此外,机器学习中有一整个领域致力于学习内核函数。

由于算法要求,内核设计也可能很棘手。由于许多基于核的算法涉及到所谓的逆矩阵,我们要求我们的核是正定的,但这是我将在未来讨论的内容。

现在我们知道了一些有用的内核,我们可以更深入地研究希尔伯特空间的理论以及它们与内核的关系,但是这要等到下一篇文章。在此之前,如果你在阅读本文时遇到困难,这里有一些推荐读物:

  1. 机器学习中的内核秘密 Pt。1
  2. 关于维度的诅咒
  3. 用内核学习

干得好!

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

数据科学工厂的关键组成部分:模型开发

原文:https://towardsdatascience.com/key-components-of-a-data-science-factory-model-development-1113b54f6505?source=collection_archive---------26-----------------------

看看模型开发过程,企业可用的新兴替代方案,以及人工智能行业的未来。

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

Image source

人工智能(AI)领域继续快速扩张。根据 Statista 的数据,到 2025 年,企业人工智能应用的全球收入预计将达到 312 亿美元。从 2018 年开始的预测期内,这一趋势将实现 52.59%的复合年增长率(CAGR)。

对于业内人士来说,这种强劲的扩张将继续推动创新。随着现有工作流的发展,许多企业开始利用人工智能的力量。从图像识别到使用算法和机器学习来防范安全威胁,企业用例正显示出持续的多样化

企业现在正在建立机器学习模型,这些模型有可能彻底改变他们的业务。然而,在缺乏必要的工具和专业知识的情况下,许多这种模式无法产生真正的回报。因此,许多公司转向简化模型开发、减少摩擦和改善结果的解决方案。

在这篇文章中,我们将探索模型开发过程,企业可用的新兴替代方案,以及人工智能行业的未来。

人工智能模型开发过程

建立一个人工智能模型的过程是复杂而艰巨的。因此,许多企业在开发和实施人工智能解决方案时都在努力保持势头。但是这个过程到底意味着什么呢?让我们仔细看看人工智能模型开发过程的每个组成部分。

问题定义

与任何商业努力一样,从一开始就确定必须解决的问题是至关重要的。业务目标必须足够具体,以指导模型开发过程;像“降低成本”这样的一般目标不会产生最佳结果。对于公司来说,量化他们希望实现的改进量也是至关重要的,这为有意义的 ROI 评估奠定了基础。

数据采集

获取正确数量和质量的数据对任何人工智能模型的成功都至关重要。这里偷工减料会大大降低输出的准确性。该过程的这一步骤产生了训练模型所必需的数据表示。

数据准备

因为算法不够智能,无法从原始数据中提取有意义的见解,所以必须首先使用各种方法进行准备。这些方法从预处理后的原始数据中获得有意义的见解。

特征工程

特征工程是构建任何人工智能系统的重要组成部分。特征是数据中影响模型的参数。识别这些特征的过程被称为特征工程,这非常耗时。据福布斯报道,数据科学家 80%的时间都花在建模前的数据准备阶段。

模型开发

创建模型的第一步包括选择合适的算法。这些算法依赖于准备好的数据来创建和训练模型。数据科学家可以访问数百种机器学习算法,并且每天都有新的算法出现。在生产一个功能性的商业工具时,正确的算法和机器学习问题必须是一致的。

模型验证

模型完成后,公司必须审查结果。这个过程可能涉及评估变更的影响、评估风险和做出部署决策。在模型开发的详尽开发和实验阶段之后,公司必须确保他们保持对原始业务目标的关注。

多模式开发

使用正确的工具来构建人工智能模型取决于正在解决的问题,以及致力于解决该问题的人员的技能。幸运的是,今天的市场为企业提供了几种选择。我们可以将这些选项细分为提供独特功能的精选类别。

基于代码的模型开发

基于代码的模型开发是指在笔记本或 ide 中使用 R、Python、Spark、TensorFlow 等编码语言构建智能模型的那些平台。这些解决方案非常适合拥有丰富开源开发经验的精通技术的团队。

低代码 GUI 模型开发

就目前情况而言,人工智能算法存在于复杂代码层之下。然而,随着用于数据准备、特征工程、模型开发和验证的图形用户界面(GUI)的出现,这种动态正在改变。这些视觉环境使得构建机器学习模型变得更加容易。

因为更广泛的用户可以使用它们,它们促进了人工智能的民主化,也有助于确保该技术得到负责任和合乎道德的使用。

AutoML 解决方案

像谷歌和亚马逊这样的行业巨头可以访问全栈人工智能团队,但大多数公司都没有——这就是 AutoML 的用武之地。AutoML 是指能够实现机器学习过程自动化的技术和工具。例如,AutoML 可以自动化数据收集和清理、模型开发和测试,或者生产部署和扩展。

因为生产成功的企业级人工智能模型仍然具有巨大的抑制性,随着专业技能的短缺持续存在,AutoML 继续获得牵引力。然而,重要的是要注意,虽然 AutoML 可以使模型生产和验证更容易,但它也有局限性。

人工智能建模的演变

虽然开发人工智能模型仍然是一个密集的过程,但像 Quickpath 这样的公司正在努力简化这种体验。通过使用 GUI 和 AutoML 平台,企业可以更好地部署资源,以实现可行的项目成果,并在更广泛的混合技能群体中提高生产力。

尽管这一运动还处于早期阶段,但市场混乱已经开始。随着生态系统的不断发展,人工智能的民主化似乎将继续。随着可访问性进一步推动增长,人工智能产业和由此产生的模型显示出巨大的潜力。

人工智能和机器学习的主要区别

原文:https://towardsdatascience.com/key-differences-between-artificial-intelligence-and-machine-learning-fe637cd0deca?source=collection_archive---------5-----------------------

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

人工智能和机器学习是市场上最流行的两个术语,很多时候可以互换使用。它们已经成为日常生活的一部分,但这并不意味着我们很好地理解它们。在什么是机器学习和什么是人工智能之间存在很多混淆。在大多数公司里;营销忽略了广告和销售的这种区别。

让我们在接下来的几个章节中来看看人工智能和机器学习之间的一些主要区别。

什么是机器学习

在机器学习中,算法通过经验获得知识或技能。机器学习依靠大数据集来提醒数据找到共同的模式。

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

例如,假设你向机器学习程序提供大量皮肤状况的图像,以及这些状况意味着什么。该算法可以挖掘这些图像数据,并在未来帮助分析皮肤状况。该算法检查图像并识别具有相似条件的这些图像之间存在的模式。

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

当该算法在未来被给予新的皮肤图像(其状况未知)时,它将当前图像中存在的模式与它通过分析所有过去的图片而学习到的模式进行比较,并且能够预测它是哪种皮肤状况。

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

如果有新的皮肤状况,或者如果皮肤状况的现有模式发生变化,该算法将不能正确预测这些状况。人们必须将所有新数据输入算法,让它学会根据新的皮肤状况进行预测。

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

同样,如果您向算法提供客户数据集,该数据集既有流失客户的样本,也有未流失客户的样本,它就可以挖掘这些数据,以了解流失客户和未流失客户的模式。如果给出了新的客户信息,它可以将所提供的客户信息中存在的模式与它之前学习的模式进行比较,并且可以预测该客户是否会流失。

如果客户行为有任何变化,该算法必须输入捕捉新客户行为的新数据,以便能够准确预测未来。

什么是人工智能

另一方面,人工智能通过获取知识和学习如何应用知识来学习。人工智能的目的是增加成功的机会,并找到最优解。人工智能是研究训练计算机去尝试做目前人类能做得更好的事情。人工智能倾向于在适应新场景很重要的情况下使用。

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

让我们来看一个简单的视频游戏,游戏的目标是使用自动导航汽车穿过雷区,从一边走到另一边。最初,汽车不知道避开地雷的最佳路径是什么。比方说,我们进行模拟运行,以获得关于哪条路径可行、哪条路径不可行的大量数据。这是可以提供给机器学习的数据,因此它可以从过去的驾驶经验中学习,并使用这些数据来安全地驾驶汽车。

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

让我们把问题复杂化。假设地雷的位置被移动了。机器学习算法将不再有效。机器学习不知道有地雷存在。它所知道的是从最初提供的数据中提取的路径中存在什么模式,并且这是它将继续引导的相同路径,除非提供新的数据供它学习。

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

另一方面,人工智能将对这些数据做的是分析这些路径为什么会改变,并编纂规则以识别那些(危险)点,以及如何通过留下可见的痕迹来避免它们。它学习知识并应用它们,就像大脑如何工作一样。当地雷被改变时,AI 将开始寻找那些危险点,并通过遵循新的路径慢慢开始避开它们,就像人类大脑如何学习和适应一样。

总结

总之,机器学习使用经验来寻找它所学习的模式。人工智能利用经验来获取知识/技能,以及如何将这些知识应用到新的环境中。

AI 和 ML 都可以有有价值的商业应用。但是在许多公司中,ML 已经被更多的采用来解决关键的商业问题。

数据驱动的关键要素

原文:https://towardsdatascience.com/key-ingredients-to-being-data-driven-f76ab8140bc?source=collection_archive---------17-----------------------

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

PSA: if you’re still showing data in pie charts, stop.

公司喜欢宣称“我们是数据驱动的”。成为一个数据驱动的组织有明显的好处,现在每个人都有比他们能处理的更多的数据。但是,一个组织究竟需要什么来“数据驱动”呢?

仅仅因为你有大量的数据,并且你已经雇人分析它或建立模型,那使你成为数据驱动的吗?不。这还不够。

虽然我们对数据以及如何使用数据想了很多。数据驱动需要成为管理层的优先事项,并成为组织文化的一部分;不仅仅是拥有一个具备必要能力的团队。

以下是我认为有效实现“数据驱动”所必需的基本素质。现在我在造词。

数据驱动:

  • 测试设计和分析由分析/数据科学团队负责。
  • 仪表板已经到位,使利益相关者能够自助访问关键指标。(否则,您将收到低价值的临时请求来获取这些指标,这将是一个时间浪费。)
  • 分析/数据科学团队与企业合作以了解问题并设计适当的方法。
  • 跨部门/组织的数据治理和数据定义的一致使用。
  • 你有一个数据策略。

你会注意到上面缺少花哨的炒作流行语。你不需要“利用人工智能”或将事实上是假设测试、商业逻辑或简单回归的东西称为人工智能。

我不相信花哨的模型需要考虑你自己的数据驱动。上面列出的许多要点涉及组织的态度,以及他们如何与分析和数据科学团队合作和协作。我和下一个数据科学家一样喜欢建立模型,但你不能在不存在的基础上建立下一级智能。

澄清一下,我并不是说组织中的每个决策都需要由数据来驱动。特别是,如果你要做出一个战略决策,而不考虑测试或分析的结果,那么你应该跳过这个测试。我强烈主张,如果你真的要用结果来做决定,就只把资源分配给一个项目。

让我们从上面的几点来看看。

测试设计和分析由分析/数据科学团队负责:

尽管数据科学和分析团队经常会提出一些奇妙的测试想法。还有许多想法来自一个不属于分析部门的部门。例如,在电子商务中,营销团队会有许多新的提议。网站团队可能想要测试对 UI 的更改。这有时会被传达给数据团队,就像“我们想以这种方式测试这个东西”。虽然这些非分析团队在市场营销和网站设计方面有很强的技巧,并且理解 A/B 测试的力量;他们通常不理解效应大小、样本大小、可靠测试设计等之间的不同权衡。

我在不止一家公司遇到过不止一次这种情况,他们告诉我“我们理解你的担忧,但无论如何我们都会按照自己的方式去做。”这是他们的要求,因为在这些情况下,这些部门在技术上“拥有”测试设计。然而,从这些测试中得到的数据通常不能被分析。所以虽然我们按照他们的方式做了,但是最后的结果并没有回答任何问题。时间被浪费了。

仪表板就位:

这是真正的基础步骤。如果您让分析师每月手动或临时提取相同的数字,会浪费很多时间。这些信息可以实现自动化,利益相关者可以浏览仪表板,这样您就不会收到诸如“按收购渠道统计,每月的流失情况如何?”它在仪表板中,利益相关者可以自己查看。节省下来的时间可以用来深入研究更有趣、更有启发性的问题,而不是提取简单的关键绩效指标。

分析/数据科学团队与企业合作定义问题:

这种关系需要努力,因为它是一种关系。高层领导需要明确表示,数据驱动的方法是实现这一目标的首要条件。此外,分析人员通常需要邀请他们自己参加原本没有被邀请的会议。分析需要提出正确的问题,并引导分析朝着正确的方向发展,才能赢得这个席位。没有关系是一夜之间建立起来的,但这对每个人来说都是双赢的。当您不确定企业试图解决什么问题时,没有什么比提取数据更令人沮丧的了。这是潘多拉魔盒。你拉他们要求的数据,它没有回答问题,所以业务要求你拉他们更多的数据。停下来。坐下来,讨论问题,让企业知道你是来帮忙的。

跨部门/组织的数据治理和数据定义的一致使用:

这一次可能需要对目前的计算方式进行彻底改革。渠道团队、产品团队、站点团队、其他团队,如果企业没有传达一个公认的定义,他们可能会以不同的方式计算事情。这些定义不一定是由分析本身决定的,它们是一致同意的。对于一个已经建立的企业来说,已经做了大量的发展,但是没有足够的治理,可能会感觉到试图说服每个人使用一致的定义的痛苦。但是如果两个人试图做同样的分析,得出不同的数字,你就有问题了。这也是一个基础,你需要这个基础才能前进,才能从事更酷的更高价值的项目,但是如果你把时间花在协调团队之间的数字上就不行了。

您有一个数据策略:

这种数据战略将由业务战略驱动。这个策略将会有目标并且是可衡量的。您计划的分析有很强的用例。人们不会凭空要求与业务的更大优先级不一致的分析。像“我们是优化我们的广告支出还是先解决我们的保留问题?”归结为业务的预期成本。当分析应该致力于解决将为企业节省最多资金的问题时,他们不会偏离正题来回答价值较低的问题。

总而言之:

我希望这篇文章对你有所帮助。数据驱动显然会帮助你更好地利用你的数据。然而,实现数据驱动需要将流程落实到位,并在管理层就谁拥有什么达成一致。这是值得的,但这不是一朝一夕的事。如果你还不是数据驱动型的,我祝你一路走好。你的分析师和数据科学家会感谢你的。

如果您对数据驱动还需要什么有建议,请告诉我您的想法!

原载于 2019 年 3 月 15 日【datamovesme.com】

Kubernetes 键盘命令

原文:https://towardsdatascience.com/key-kubernetes-commands-741fe61fde8?source=collection_archive---------8-----------------------

使用 K8s 启动并运行

Kubernetes 是部署和管理大型应用程序的首要技术。在本文中,我们将在您的本地机器上启动并运行 K8s。然后您将部署您的第一个应用程序。最后,您将看到需要了解的 K8s 命令。

如果你是 Kubernetes 的新手,可以看看我的上一篇文章来学习基本的 K8s 概念。

我们起航吧!⛵️

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

Lots of containers on a ship.

本地运行 K8s

直到最近, Minikube 还是创建本地单节点 Kubernetes 集群的主要手段。它可以在 Mac、Windows 和 Linux 上运行。Minikube 在一个虚拟环境中运行,带有许多不同虚拟环境的驱动程序。它还有一个扩展的 API。然而,当我将 Minikube 与 VirtualBox 配合使用时,我发现它速度很慢,而且漏洞百出。

如果你是在 Mac 或 Windows 机器上本地玩 K8s,我推荐你使用 Docker 桌面自带的 K8s 版本。它使用 HyperKit 作为它的虚拟环境。我发现这是一股新鲜空气。🌷

如果你在本地使用装有 K8s 的 Linux 机器,请查看一下 MicroK8s 。它是轻量级的,使用一个快照而不是虚拟环境。

本文我运行的是 Docker Desktop CE 的 K8s v1.13.0,2019 年 4 月 Edge 版本。

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

要在 Mac 上安装并启动 K8s,首先在这里下载带有 K8s 的 Docker Desktop

安装完成后,进入你的应用程序并启动 Docker。从屏幕顶部的 Docker 图标中选择 Preferences 来安装并启动 K8s。

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

选择 Kubernetes 选项卡并勾选 Enable Kubernetes 复选框。

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

同意安装 Kubernetes。可能需要一两分钟才能启动。点击 Docker 下拉菜单,您应该会看到 Kubernetes 正在启动,最后 Kubernetes 正在运行

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

如果你看到两个绿色的圆圈,那么你就准备好了!如果没有看到两个绿圈,Google 和 Stack Overflow 是一个开发者最好的朋友。😄

你的第一个 K8s 应用

让我们做一个 hello world 部署,它将为 node.js 应用程序拉一个 Docker 映像。我们的应用程序将在浏览器中显示 Hello World 。在生产中,你会以不同的方式做事。这个练习是让你开始练习的第一步。👣

在 K8s 运行的情况下,在终端中输入以下命令:

kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

我们使用kubectl API 来创建一个名为 hello-node 的部署,它使用存储在 Google 容器注册表中的 Docker 映像。我们正在使用官方 Kubernetes 的 Docker 容器。

以下是 Dockerfile 文件的内容:

FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js

我们使用的是官方的 node.js 镜像,复制 *server.js 的内容,*公开端口 8080,用 node 运行 server.js 程序。关于 Docker 文件的更多信息,请点击这里查看我的文章

下面是 server.js app 代码:

**var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);**

这段代码将创建一个监听端口 8080 的服务器。当服务器收到请求时,它会向控制台写入一条有用的消息,并返回“Hello World!”。

在运行了 kubectl create 命令之后,您应该会在终端中看到一条消息,说明您的部署已经创建好了。不过,你的应用还不能马上投入使用。K8s 需要提取 Docker 图像并旋转您的容器。

您可以通过kubectl get all查看所有 K8s 资源的状态。提取图像并旋转容器需要几分钟的时间,所以您可能需要输入这个命令几次。你可以到幕后高峰,看看 K8s 在用kubectl get events做什么。

当你看到 1 Pod 显示可用时,你就可以开始了。

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

为了使 Pod 能够被 K8s 集群之外的世界访问,您需要将 Pod 公开为服务。使用命令kubectl expose deployment hello-node --type=LoadBalancer --port=8080创建服务。

您指定了群集的名称、服务的类型以及它要使用的端口。不是所有的服务类型都创建一个可以从外界访问的 IP,但是负载平衡器可以。

您应该能够通过在 shell 中输入kubectl get services看到服务已经创建。

假设您正在本地运行 K8s,将您的浏览器导航到 http://localhost:8080/ ,您应该会看到消息“Hello World!”。👍

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

Hello World!

您可以在 YAML 文件中指定它们,而不是通过命令行创建和指定整个部署和服务。使用文件有几个优点,包括可重用性和文档化。我计划在以后的文章中深入讨论 YAML 规范文件,所以请关注 me 以确保您不会错过它们。

现在让我们来看看流行的 K8s 命令。

库贝特尔

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

Cubes

ku bectl——读作立方体控制、立方体切割*——或其他多种方式——是 K8s 的命令行工具。它是这样工作的:*

  • 一个 kubectl 命令执行一个动作,如 getcreatedescribe。
  • 该操作在资源上执行,如部署、状态集或服务。
  • kubectl 命令遵循以下格式:

kubectl an_action a_resource a_resource_name --flags

在许多情况下,名称和标志是可选的。

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

Flags

例如,要获得关于所有现有 pod 的信息,您可以运行这个常见命令:kubectl get pods

提示:如果您想避免键入 kubectl a bajilllion 次,那么创建一个 Bash 别名。有了alias k='kubectl',你可以只输入k而不是kubectl。我在本文中展示了如何在 Mac 上创建 Bash 别名。

事不宜迟,下面是最常见的 K8s 资源及其快捷方式。

11 大 kubectl 资源

你可以写出完整的术语或捷径。

pods, po nodes, no deployments, deploy replicasets, rs daemonsets, ds statefulsets, sts jobs cronjobs, cj services, svc persistentvolumes, pv persistentvolumeclaims, pvc

如果你对这些资源不清楚,可以看看我之前关于 K8s 概念的文章。另外两个需要了解的术语是所有事件*。*

不出所料,all用来指代所有现有的资源。kubectl get all显示了有关运行 pod、服务、部署和复制集的基本信息。这个命令非常方便。😄

同样,kubectl get events显示事件的历史。就像是 K8s 级别的日志而不是容器级别的。

如果你想看更多的 kubectl 资源,请点击这里查看官方文档。现在,让我们看看应用于我们的资源的行动。

7 大 kubectl 行动

help —获取帮助
get —显示关于一个或多个资源的信息
describe —显示关于一个或多个资源的详细信息
logs —显示容器的日志
exec —进入容器中正在运行的进程
apply —创建或更改资源
delete —删除一个或多个资源

让我们简单地看一下每个命令。

求助

在命令后键入--help以获取该命令的帮助。比如kubectl get pods --help

得到

kubectl get all显示了有关运行 pod、服务、部署和副本集的基本信息。这是检查事物状态的常用命令。您可以对单个对象使用get并添加--watch标志来观察实时更新。

形容

kubectl describe all显示了与您的集群相关的几乎所有内容的大量详细信息。您也可以对单个对象使用describe。调试的时候很有帮助。

日志

logs需要一个 Pod 名称。我的“hello world”应用程序使用命令kubectl logs hello-node-7f5b6bd6b8-gr7m7显示了我的 Pod 的日志。当多个容器在一个容器中时,使用标志-c my-container指定一个容器。使用--previous标志获取不再运行的容器的信息。

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

Wish my logs looked like this.

执行

exec帮助你调试一个容器进程。它允许您通过一个带有-it的伪终端在容器内执行一个流程。例如,要在 my_pod 中输入容器并运行 Bash,输入kubectl exec -it my_pod bash

应用

apply与 YAML 或 JSON 文件一起使用是创建或更改资源的推荐方式。如果一个资源不存在,apply将创建它。如果它确实存在,apply会改变它。apply可以向适用的资源添加服务,或者通过添加 pod 来自动横向扩展部署。

注意,您可以使用create进行部署,使用expose进行服务——这就是我们在上面所做的。然而,使用带有apply的 YAML 文件对于文档和重用来说是一个更好的选择。我们将在以后的文章中介绍这种方法。在这里查看关于创建资源的最佳实践的讨论。

apply是您创建和更新资源的瑞士军刀。

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

SwissArmy knife

删除

kubectl delete pod my_pod删除名为 my_pod 的 Pod。

要删除相同类型的所有资源,请传递--all标志。例如,您可以用kubectl delete rs --all删除所有的副本集。请注意,如果您尝试这样做,除非您先删除部署,否则副本集将会重新启动。😄

现在您已经看到了关键的 K8s 命令。当你成为一名库伯内特 n̵i̵n̵j̵a̵和平战士,你会获得其他人。可以在这里找到 kubectl 动作的完整列表。

概述

要记住的命令。

带快捷方式的前 11 项资源

pods, po nodes, no deployments, deploy replicasets, rs daemonsets, ds statefulsets, sts jobs cronjobs, cj services, svc persistentvolumes, pv persistentvolumeclaims, pvc

前 7 项行动

--help —获取关于资源的帮助
get —显示关于一个或多个资源的信息。
describe —显示一个或多个资源的详细信息。
logs —显示容器的日志。
exec —进入容器中正在运行的进程。
apply —创建或更改资源。
delete —删除一个或多个资源。

如果你想更深入地了解清单,看看这张更长的备忘单

当你探索 K8s 的时候,一定要花一些时间和官方的 Kubernetes docs 在一起。它们非常详细,一开始可能会让人不知所措,但它们写得非常好。🎉

包装

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

That’s a wrap.

我希望这篇文章对你有用。您看到了如何设置 K8s 和运行您的第一个 K8s 应用程序。然后,您了解了如何使用常见命令检查、创建和删除 K8 资源。如果你觉得这篇文章有帮助,请在你最喜欢的社交媒体渠道上分享,这样其他人也可以找到它。👍

我在工作中有未来的 K8s 文章。跟随 me 确保你不会错过它们。😃

我撰写关于数据科学、云计算和 DevOps 的文章。如果你对这些感兴趣,可以在这里查看我的其他文章。

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

kubectl开!🚀

Kubernetes 的关键概念

原文:https://towardsdatascience.com/key-kubernetes-concepts-62939f4bc08e?source=collection_archive---------3-----------------------

云计算、容器化和容器编排是 DevOps 中最重要的趋势。无论您是数据科学家、软件开发人员还是产品经理,了解 Docker 和 Kubernetes 的基础知识都是有益的。这两种技术都有助于你与其他人合作,部署你的项目,并增加你对雇主的价值。

在本文中,我们将介绍 Kubernetes 的基本概念。有很多 Kubernetes 的术语,这可能会使它变得令人生畏。我会帮你做一个心智模型来加速你对技术的理解。

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

Orchestrating the movement of shipping containers

如果你首先了解 Docker 概念,Kubernetes 会更有意义。查看我的码头指南,学习基本原理。

[## 学习足够的码头工人是有用的

第 1 部分:概念景观

towardsdatascience.com](/learn-enough-docker-to-be-useful-b7ba70caeb4b)

然后回到这里学习如何编排这些 Docker 容器。

Kuberwhat?

Kubernetes 是一个开源平台,用于管理生产中的容器化应用。Kubernetes 简称 K8s。展望未来,我将主要使用术语 K8s ,因为谁不喜欢效率呢?😃

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

K8s 火爆。正如你在下面的图表中看到的,谷歌对它的搜索在过去的五年中增长迅速。

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

Worldwide search interest for kubernetes

K8s 为什么这么抢手?Kubernetes 使您更容易自动扩展应用程序,减少停机时间,并提高安全性。无需再编写脚本来检查、重启和更改 Docker 容器的数量。取而代之的是,你告诉 K8s 你想要的集装箱数量,它会为你完成工作。K8s 甚至可以根据使用的资源自动缩放容器。

Kubernetes 是所有关于抽象的复杂性。它提供了与应用程序开发环境接口的清晰要点。

K8s 对于一个每天只有少量访问者的基本静态网站来说没有太大意义。它的用例是用于可能需要快速伸缩的大型应用程序。

对于大型应用程序,您可以使用 K8s 来充分利用您的计算和存储资源。当与云提供商配对时,K8s 可以为您省钱。💰无论您在哪里运行 K8s,它都应该可以帮助您节省时间并减少 DevOps 的麻烦。

Docker 有一个名为的竞争产品 Docker Swarm ,它编排容器。但是,它没有 K8s 那样的功能和市场份额。虽然你可能认为 Docker 在 K8s 有自己的产品时不会很好地与 K8s 配合,但两者配合得非常好。我强烈建议你使用 K8s 来编排你的容器。

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

Playing nicely

保持许多 K8s 抽象的直线可能是棘手的。我将解释关键部分是如何组合在一起的,这样您就可以理解这个强大的平台了。让我们来探讨 K8s 的关键概念以及它们之间的关系。

首先,我们将看看六个抽象层和组成它们的部分。然后我们将看看其他七个关键的 K8s API 对象。

K8s 的六层

让我们假设你有一个持续运行的应用,不需要存储状态。

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

Kubernetes abstractions for a Deployment. © Jeff Hale 2019

以下是 K8s 概念的六层,从最高层的抽象开始。

  1. 部署
  2. 复制集
  3. 豆荚
  4. 节点集群
  5. 节点流程
  6. 码头集装箱

部署创建和管理复制集,复制集创建和管理 pod,pod 运行在节点上,节点上有容器运行时,运行您放在 Docker 映像中的应用程序代码。听起来像爱尔兰民歌“拉特林沼泽”。😄

这是一个分解了工作节点流程的图表。让我们挖一点。

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

Detailed Kubernetes abstraction Deployment levels. © Jeff Hale 2019

蓝色阴影的层次是更高层次的 K8s 抽象。绿色级别表示您应该知道但不能接触的节点和节点子流程。

请注意,您的 K8s 实例通常会有多个可以在单个节点上运行的 pod。

Docker 容器包含您的应用程序代码。

**语法插曲 * *

根据 K8s 自己的风格指南,API 对象如 Pods 的大写应该遵循“实际对象名中使用的相同的大写和小写字母”然而,在文档中经常没有遵循这一准则——API 对象的大写或小写似乎是随机的。

我将遵循我的 K8s 文章和大写错误中的风格指南声明的政策。

    • 语法插曲结束。😄**

让我们从最高的抽象层次开始,分别看一下这六个层次。

部署

如果你想创建一个持续运行的无状态应用,比如 HTTP 服务器,你需要一个部署。部署允许您在不停机的情况下更新正在运行的应用程序。部署还指定了一个当吊舱死亡时重启的策略。

您可以从命令行或配置文件创建部署。我将在以后的文章中向您展示这两种方法,所以请跟随 me 以确保您不会错过它们。😄

复制集

部署会创建一个副本集,确保您的应用程序具有所需数量的 pod。复制集将根据您在部署中指定的触发器创建和缩放窗格。

复制控制器执行与复制集相同的功能,但是复制控制器是老式的。复制集是 2019 年管理复制 pod 的智能方式。

豆荚

Pod 是 Kubernetes 的基本构建模块。一个 Pod 包含一组一个或多个容器。通常,每个 Pod 有一个容器。

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

Pod

pod 处理容器的容量、机密和配置。

豆荚是短暂的。它们在死亡时会自动重启。

当应用程序被 ReplicationSet 水平缩放时,窗格被复制。每个 Pod 将运行相同的容器代码。

豆荚生活在工人节点上。

集群级别

一个 K8s 集群由一个 C 集群主节点工作节点组成。

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

Star Cluster. Credit: NASA, ESA and the Hubble Heritage (STScI/AURA)-ESA/Hubble Collaboration

下面是一个集群的示意图。该图强调了如何在一个 Worker 节点上运行多个 Pods,以及如何由一个 Master 管理多个 Worker 节点。

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

Kubernetes Nodes, Pods, & Containers © Jeff Hale 2019

工作节点

一个 职工节点 就是也简称节点简称*。*节点是机器的抽象,可以是物理机,也可以是虚拟机。把一个节点想象成一台计算机服务器。

一个或多个 pod 在单个工作节点上运行。

Pod 从不在两个节点之间拆分,它的内容总是位于同一节点上并一起计划。

谁在告诉工人节点做什么?大师。

集群主机

群主 有着多得严重可笑的别名。它也被称为*主节点、Kubernetes 主节点、集群控制平面、*控制平面、主节点。不管你叫它什么,它都指挥工人节点。主设备做出调度决策、响应事件、实施更改并监控集群。

工作节点和主节点都有子流程组件。

节点流程

主组件

主要组件是 API 服务器(又名 kube-apiserver)etcd 、S 调度器(又名kube-调度器)、kube-控制器-管理器和云控制器管理器。*为了完整起见,我于 2019 年 4 月 10 日添加了控制者-管理者 *

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

Cluster Master subprocesses

让我们简单看一下每一个。

API 服务器 —公开 K8s API。这是 Kubernetes 控制的前端。(又名。kube-apiserver)认为枢纽
etcd —集群状态数据的分布式键值存储。思考集群信息
调度器 —选择新窗格的节点。好导这里。(又名 kube-scheduler)想想匹配器
kube-controller-manager—运行控制器来处理集群后台任务的进程。想想集群控制器
云控制器管理器 运行与云提供商交互的控制器。想云接口

工作节点组件

Worker 节点的组件kubeletkube-proxy容器运行时

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

Worker Node subprocesses

—负责工人节点上的一切。它与主服务器的 API 服务器通信。想为工节点。
kube-proxy—将连接路由到正确的 pod。还跨服务单元执行负载平衡。想想
交警*。
容器运行时 —下载图像并运行容器。例如,Docker 是一个容器运行时。想码头工人。*

让我们深入到最后一个层次,看看那些容器运行时运行的是什么。😄

码头集装箱水平

如果你想用 K8s 运行你的应用,你的应用需要在某种容器中。Docker 是目前最常见的容器平台。我们假设你正在使用它。

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

在创建部署时,您将指定 pod 应该使用哪个 Docker 映像。容器运行时将下载映像并创建容器。

K8s 不直接创建容器。它创造了容纳容器的容器。Pod 中的容器共享任何已配置的资源,例如卷存储。

*有五个管理和运行 pod 的高级 K8s API 资源:*部署、StatefulSets、DaemonSets、Jobs、CronJobs 。这些对象负责管理和运行创建和运行容器的窗格。让我们看看这些创建和管理连续流程的控制器

副本集、状态集和守护集

如你所见,一个复制集创建并管理 pod。如果一个 Pod 由于一个节点故障而关闭,复制集可以自动替换另一个节点上的 Pod。通常应该通过部署创建副本集,而不是直接创建,因为使用部署更新应用程序更容易。

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

A Volume can be attached to a ReplicaSet or a StatefulSet. © Jeff Hale 2019

有时候你的程序需要保存状态信息。你可以把状态想象成你的用户与你的应用程序交互的当前状态。所以在一个视频游戏中,它是用户角色在某个时间点的所有独特方面。

例如,最初的超级马里奥兄弟游戏中的状态将包括用户游戏的每个相关方面:什么级别,该级别中的什么位置,大还是小,火球还是没有火球,多少硬币,多少点数,以及多少条生命。

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

当你的应用程序有你需要跟踪的状态时,你会怎么做?使用 StatefulSet。

状态集

像 ReplicaSet 一样,stateful set根据容器规范管理一组 pod 的部署和伸缩。与部署不同,StatefulSet 的 pod 不可互换。每个 Pod 都有一个唯一的、持久的标识符,控制器在任何重新调度中都维护该标识符。StatefulSets 适用于持久的、有状态的后端,如数据库。**

Pod 的状态信息保存在与 StatefulSet 相关联的卷中。我们稍后将讨论体积。

达蒙塞特

DaemonSets 为连续过程。每个节点运行一个 Pod。添加到群集的每个新节点都会自动获得一个由 DaemonSet 启动的 Pod。DaemonSets 对于正在进行的后台任务(如监控和日志收集)非常有用。

StatefulSets 和 DaemonSets 不受部署控制。尽管它们与副本集处于同一抽象级别,但在当前的 API 中,它们并没有更高的抽象级别。

现在我们来看看乔布斯和 CronJobs。

乔布斯和克朗乔布斯

职位

一个 任务 是运行批处理的 pod 的主管。作业创建 Pod,并通过跟踪成功完成 Pod 的数量来确保它们执行任务。与复制集不同,一旦容器内的进程成功完成,容器不会重新启动。当您想要运行一次流程时,请使用作业。

克朗乔布

**如果您想要在定期、指定的时间(例如每小时、每天或每月)运行作业,请创建一个 CronJob cron Job 类似于一个作业,但被安排在固定的时间间隔或设定的时间重复。

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

Time

您通常需要创建一个服务来提供对临时 pod 的一致访问。

服务

K8s 服务 为一组 pod 创建单个接入点。服务提供一致的 IP 地址和端口来访问底层 pod。外部用户和内部 pod 都使用服务与其他 pod 通信。

服务有多种形式。与 K8s 联网是一个值得自己指导的话题。幸运的是,这里有一本由 Sandeep Dinesh 写的好书。

现在,让我们看看用卷和持久卷存储数据。

卷、持久卷和持久卷声明

一个 是一个可以容纳数据的目录。卷是 Pod 的一个组件,并不独立于它。在 Pod 规格中创建一个卷。不能单独删除卷。

一个卷可供 Pod 中的所有容器访问。您想要访问卷的每个容器必须单独装载它。

K8s 卷比任何单个容器都长寿,但是当封装容器死亡时,该卷也会死亡。但是,某些卷类型的文件会继续存在于本地或云存储中,即使在卷消失后也是如此。

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

Volumes

K8s 卷比 Docker 卷具有更多功能。卷可以提供对本地磁盘存储、内存存储或云存储的访问。一个 Pod 可以同时使用它们的组合。

K8s 卷类型包括空目录、工作节点的文件系统和特定于云提供商的存储。例如,awsElasticBlockStore 和 gcePersistentDisk 是用于长期存储的特定于提供程序的选项。点击查看更多文档

持久卷和持久卷声明

为了帮助抽象出基础设施细节,K8s 开发了 持久卷持久卷声明。不幸的是,这些名称有点误导,因为普通卷也可以有持久存储。

与单独使用卷相比,PersisententVolumes (PV)和 PersisentVolumeClaims (PVC)增加了复杂性。但是,PV 对于管理大型项目的存储资源非常有用。

使用 PVs,K8s 用户最终仍然会使用一个卷,但是首先需要两步。

  1. 持久卷由群集管理员提供(或动态提供)。
  2. 需要存储 Pod 的单个集群用户创建了一个 PersistentVolumeClaim 清单。它指定了他们需要多少和什么类型的存储。K8s 然后找到并保留所需的存储。

然后,用户创建一个包含使用 PVC 的卷的 Pod。

持久卷具有独立于任何 Pod 的生命周期。事实上,Pod 甚至不知道 PV,只知道 PVC。

PVC 消耗 PV 资源,类似于 pod 消耗节点资源的方式。狂野!

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

Wild

包装

我希望这篇 K8s 概念的介绍对您有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。👍

让我们回顾一下我们见过的 K8s 概念。以下是部署的六个抽象级别:

  • 部署:管理副本集。用于持久、无状态的应用程序(例如 HTTP 服务器)。
  • 复制集 : 创建并管理 pod。
  • Pod:K8s 的基本单位。
  • **节点集群:工作节点+集群主节点。
    • 工人 节点:用于 pod 的机器。
    • 集群主 : 指挥工作节点。**
  • **节点进程
    Master 子组件:
    • API 服务器 : hub。
    • etcd :集群信息。
    • 调度器:匹配器。
      -*kube-controller-manager😗**集群控制器。
    • **云-控制器-管理器:**云接口。
      工作者节点子组件:
    • kubelet :工作者节点大脑。
    • kube-proxy :交警。
    • 容器-运行时 : Docker。**
  • ****Docker 容器:app 代码所在的地方。

下面是需要了解的 7 个额外的高级 K8s API 对象:

  • StatefulSet :类似于有状态进程的复制集。想好状态。**
  • DaemonSet: 每个节点一个自动 Pod。想班长。**
  • 作业:运行容器直至完成。想。**
  • CronJob: 重复作业。想时间。**
  • 服务:吊舱的接入点。想接入点。**
  • :保存数据。想想盘。**
  • PersistentVolume,PersistentVolumeClaim: 分配存储的系统。认为存储索赔。**

把你的头缠在 K8s 上需要理解很多抽象的概念。不要期望你第一次就能记住它们。查看下面的一些资源来建立你的心智模型。

资源

以下是巩固你所学内容的资源。

  • 这里有一幅来自谷歌的很好的漫画,介绍了一些关键概念。
  • Daniel Sanche对关键 K8s 概念的另一个很好的概述。
  • 看看奈杰尔·波尔顿的《库伯内特的书》——现在在 v3。Kindle Book 最后一次更新是在 2018 年 11 月。

还有,关注确保你不会错过我以后在 K8s 上的文章。在的下一篇文章中,我将向您介绍如何设置和运行您的第一个 K8s 部署,并介绍关键的 K8s 命令。

我写关于 PythonSQLDocker 和数据科学的文章。查看我的文章这里如果你对这些感兴趣,请关注我。😄

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

开心 K8ing!

使用 Reddit 作为数据源时的关键人口统计点

原文:https://towardsdatascience.com/key-points-when-using-reddit-as-a-source-of-data-4f943918913f?source=collection_archive---------24-----------------------

你应该引用的学术期刊文章和资源列表。

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

Image: Unsplash/Lukas Blazek

人们一直在使用 Reddit 上的数据。有时他们是学生、学者数据科学家

这是三篇来自 Reddit 学术文献的同行评议文章,从方法论的角度来看是最具实质性的。将它们放在研究设计或方法部分绝对是个好主意。

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

Image: Reddit Inc.

Adams、Artigiani 和 Wish ( 2019 )对比了 Twitter 和 Reddit 进行社交媒体药物研究的情况。他们把重点放在关键词的使用上,以此作为发现人们如何在网上谈论毒品的主要方式。

…子编辑可以被视为自选采样帧。

主要重点和调查结果是:

  • 像许多在线论坛一样,Reddit 很方便地将相关帖子和评论归类到热门子论坛中。被称为“subreddits”。因为主题的范围可以从议题(见/r/政治)、地点(/r/联合王国)或兴趣(/r/电影)等,所以子编辑可以被视为自选的采样框架
  • 因为 Reddit 拥有大量年轻白人男性,它可以成为研究影响这一群体的现象的一个途径。如美国阿片类药物的流行
  • 与 Twitter 相比,讨论毒品时俚语较少,但毒品和毒品相关行为的同义词较多

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

Image: Unsplash

Shatz ( 2016 )直接将 Reddit 概括为“快速、免费和有针对性”的在线招募参与者平台的来源。

旧的研究指出了很大的性别差异,而新的研究通常指出了一个小的差异,或接近平等的用户群

主要的人口统计亮点是:

  • 早期的研究指出了用户群的性别差异,这种差异偏向男性。尽管新的研究似乎不同意这一点,一些研究通常发现两性之间有微小的差异或几乎相等的代表性
  • 一项针对美国成年用户(约占活跃用户的一半)的人口统计数据的研究发现,在控制年龄时,他们相对代表美国成年人口
  • 人口统计数据可能会因子区域而异,而且也没有大的子区域数据库。然而,网站的用户和志愿者有时会进行他们自己的“子编辑调查”,询问各种人口统计信息

Shatz 指出了几个优势:

  • 潜在的大样本,并在短时间内招募
  • 有针对性的基于特定主题的子主题允许从特定人群、特殊利益群体或传统上被边缘化的人群中招募
  • 研究通常可以免费进行。这对学生和早期职业研究者来说很重要

和几个缺点或限制:

  • 低招聘率或保留率的可能性
  • 招聘过程依赖于用户根据帖子标准进行的自我选择,这意味着人们可以撒谎并参与其中。然而,他指出,大多数研究没有提供货币补偿,这可能会减少问题
  • Reddit 不能成为招聘的通用方法。对于某些研究,这可能是一种不合适的招募方法。
  • 与在线招聘相关的一般问题仍然适用。例如伦理考虑、所需的技术专业知识以及采样、测量和无响应方面的各种错误。

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

Image: Unsplash

Jamik 和 Lane ( 2017 )将 Reddit 的使用与心理学中使用的其他招聘来源进行了比较。

他们将从 Reddit 上抽取的样本与亚马逊的在线众包机械土耳其 (MTurk)和一个典型的本科大学样本进行了比较。由于易于获取且成本低廉,这些类型的样本通常用于心理学(波莱,2019 )。

主要调查结果是:

  • Reddit 样本中男性多于女性,种族多样性低于本科生样本,包含更多非美国人,以及更多受过高等教育的个人,其中一些人已经大学毕业
  • Reddit 的样本比大学生样本更古老,覆盖范围更广。然而,总的平均绩点是相似的
  • 他们得出结论,使用 Reddit 作为招聘来源可能会产生比传统大学生样本更多样化的样本。

主要引文

Adams,Artigiani,E.E .和 Wish,E.D. (2019)“选择你的社交媒体药物研究平台并改进你的关键词过滤器列表”,《药物问题杂志,49(3),第 477-492 页。doi:10.1177/0022042619833911。

Jamnik,M.R .和 Lane,D.J. (2017) “使用 Reddit 作为高质量数据的廉价来源”实践评估,研究&评估,22(4/5),第 1-10 页。

Shatz,I. (2016)“快速、免费和有针对性:Reddit 作为在线招募参与者的来源”,社会科学计算机评论,35(4),第 537-549 页。doi:10.1177/0894439316650163。

建立有效人工智能组织的关键步骤

原文:https://towardsdatascience.com/key-steps-for-building-an-effective-ai-organization-cad45b1992d7?source=collection_archive---------18-----------------------

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

Photo by Randy Fath on Unsplash

最近,我迷上了人工智能对任何行业(科技、银行、制造等)的任何业务的影响。)这让我进一步探索这个主题,同时试图理解一家公司应该如何使用人工智能来转变其流程。

在这篇文章中,我很乐意将我的观察总结成一套可行的步骤,可以帮助任何组织启动他们的人工智能转型。我的想法受到了 Landing AI 创始人吴恩达写的令人惊叹的 12 页论文的严重影响,名为“AI 转型剧本”。此外,我还从许多麦肯锡公司的报告中得到了建议,如《麦肯锡关于支付:银行业高级分析特别版》

#1.组织在部署 AI 时会面临哪些问题?

未能利用人工智能算法和数据实现运营转型的组织通常会面临以下一项或多项挑战:

  • 未能计划和战略性地迈出第一步。
  • 没有专注于交付商业价值。
  • 缺乏高级管理层的承诺。
  • 找不到 AI 人才。

让我们分别检查每个问题。

未能在计划和战略上迈出第一步

如果一个组织决定试点并开始部署人工智能能力,它必须努力准备这个过程。这包括选择正确的试点项目、估计交付时间、与业务部门沟通等。

一个不正确的开始方式是雇佣几个数据工程师/科学家,把他们和公司的其他人隔离开来,希望能施展他们的魔法。不幸的是,没有足够的东西可以交付,这将导致一个错误的结论,即 AI 转型不适合这个组织。

稍后,我会列出一些实用的建议,引导你进行有效的计划。

没有专注于交付商业价值

我将允许自己引用吴恩达的话,他说一个初始的飞行员需要*“有一个明确定义的、可衡量的、创造商业价值的目标”*。

如果人工智能团队未能交付直接影响底线的可测量结果,试点结果可能会被视为太不重要,这可能会导致资金减少,并缺乏进一步试验人工智能的自由。

这个挑战可以通过对人工智能团队最初的努力方向进行战略和仔细的规划来克服。

缺乏高级管理层的承诺

将高级管理层的注意力集中在一个新的实验性过程上是一个具有挑战性但并非不可能的任务,大多数人工智能团队都将面临这一任务。这与前一点关注交付商业价值高度相关。

高层管理人员和人工智能团队应该经常保持透明的沟通,这样项目的焦点仍然是向组织交付有用的结果。

找不到 AI 人才

目前,有能力使用人工智能技术产生有意义的结果的人非常短缺。大多数攻读高级计算机科学学位的博士生都选择了最大的科技巨头。

金融、制造、电信、制药和其他行业的公司没有机会建立强大的内部人工智能团队来解决复杂的问题。

幸运的是,这种挑战可能只是短期的,最终,组织将能够雇用受过教育的人。

但是,在这个非常时刻,公司应该寻找创新的方式来聚集人工智能人才。我将在下面概述一些有用的方法。

#2.实现人工智能转型的可行步骤

您的组织的人工智能转型经历了几个阶段,从精心选择的试点项目开始,慢慢建立一个人工智能单位,为所有其他业务单位提供支持。

从试点项目开始

吴恩达指出*“对你的最初几个人工智能项目来说,成功比成为最有价值的人工智能项目更重要”和补充道“重要的是让飞轮旋转起来,这样你的人工智能团队才能获得动力”。*

上述陈述将我们引向以下一套策略:

  1. 人工智能试点项目应该由一个独立的人工智能团队来执行(我已经在下一节概述了人工智能团队的细节)。
  2. 第一个人工智能项目应该直接与 组织的商业战略联系起来。
  3. 为了确保交付商业价值,人工智能团队应该与对业务有深入了解的内部团队密切合作。这将确保现有问题的人工智能解决方案正在建立。
  4. 这些首批人工智能项目应该产生可测量的结果,这些结果可以(用数字)向执行委员会解释。
  5. 项目价值应尽快交付(少于 18 个月)。
  6. AI 团队应该对项目的范围形成一个健壮而简洁的计划,这样它在技术上是可行的,并且不会一下子覆盖太多。公司经常无法评估人工智能的力量,认为许多复杂的问题可以用这项技术解决。

一旦你的初始试点获得牵引力并带来商业价值,你公司的其他单位将与人工智能团队展开对话,开始探索转型的可能性。

组建你的人工智能团队

如上所述,建立一个强大的内部人工智能团队是相当具有挑战性的,因为有经验的人供应高,但需求低。

在吴恩达和他的 deeplearning.ai 课程、Siraj Raval 和人工智能学院以及众多书籍和课程(如我最近的书“递归神经网络与 Python 快速入门指南”)的帮助下,这种情况可能会在长期内发生变化。

为了立即采取行动,公司可能需要使用稍微有点不平凡的方法。其中一些包括:

  • 外包 AI 团队

你的组织可以雇佣一个数据工程师/科学家的外部供应商来构建所有的 AI 解决方案。

这种方法被推荐用于较小的和不太关键的项目。理想情况下,你应该拥有你的人工智能团队的“大脑”,并外包需要独特数据源和高级解决方案的项目。

  • 与其他组织合作获取人工智能人才

麦肯锡公司(McKinsey&Company)最近的一份报告解释了一家大型零售组织如何与一家初创企业孵化器建立战略合作伙伴关系,这使他们能够接触到许多已经拥有人才的小公司。将这种合作与核心人工智能内部团队相结合可以促进你的转型。

  • 提供广泛的人工智能培训

从长远来看,培训员工的想法是最有效的,但随之而来的是更多的挑战。

首先,你需要咨询人工智能领域的专家,他曾领导过这次行动,并把方向引导到正确的道路上。

其次,你的首席学习官(CLO)需要仔细策划培训内容。这包括在线视频教程、付费课程、电子书等。

最后,你的组织需要为每一个角色(行政领导、部门/业务单位经理和 AI 工程师/数据科学家)提供培训程序。

为了确保这些步骤得到正确执行,您的组织可能需要像 Landing AI 这样的外部合作伙伴的帮助,目前,该公司旨在用人工智能技术为制造公司提供支持。

选择如何组建你的人工智能团队并不是一个全有或全无的决定,你最有可能混合上述方法来实现所需的结果。

每个公司的内部人工智能团队的结构都会略有不同。在这一部分,我将给出一个分解的例子,包括数据科学家、数据工程师、工作流集成者、数据架构师、交付经理、可视化分析师和翻译。让我们来看看每个角色:

  • 翻译者与业务所有者沟通,以识别业务请求并确定其优先级。
  • 数据科学家与翻译一起开发一个特定的用例。
  • 一名数据工程师与相关业务部门合作,了解数据特征(需求、来源等。)的用例。
  • 数据科学家对算法进行编程,并分析沙盒中的数据以产生见解。
  • 一个可视化分析师为业务用户开发报告和仪表板。
  • 一个工作流集成者与业务所有者一起开发模型和工具的原型。
  • 一个交付经理引导原型和仪表板,并努力获得通过或失败的决定。
  • 交付经理和工作流集成人员与 IT 部门合作,将原型扩展到企业级。
  • 交付经理和翻译人员与业务和 IT 部门合作,以确保采用和持续的模型维护。

正如你所看到的,在人工智能团队(通过翻译、工作流集成和交付经理)和特定的业务单元之间有着持续的沟通。这对于交付成功的试点项目至关重要。

让人工智能部门成为您组织的关键组成部分

在这最后一部分,我想把注意力集中在一个更广阔的画面上,并建议一个人工智能单位如何适应你的组织。

典型地,大公司被分成子单位(营销、IT、法律等)。)向高级管理层报告。为了实现全面的人工智能转型,每个部门都应该采用新技术。

人工智能团队可以作为一个独立的中央单位,它将加强人工智能项目和人才的不同部门。最终,这些项目可以从特定的业务单元进行控制和管理。

使用人工智能的力量,您的公司可以转变成一个更有效的组织,并始终领先于竞争对手。你的重点不应该是成为全球人工智能的领导者,而是用这项技术彻底改变你的特定流程。

谢谢你的阅读。如果你喜欢这篇文章,给它一些掌声👏。希望你有一个伟大的一天!

来自 Strata 2019 @London 的关键要点

原文:https://towardsdatascience.com/key-takeaways-from-strata-2019-london-e623189bea84?source=collection_archive---------28-----------------------

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

Screenshot from https://learning.oreilly.com/videos/strata-data-conference/9781492050568

这几周我花了一些业余时间观看了 2019 年伦敦地层的主题演讲。有一件特别吸引我的事情,我想和你分享。

我订阅了几个关注技术的播客,毫不奇怪,这些天他们都在谈论数据科学、人工智能。那么这些术语是什么意思呢?这是否意味着我们正在研究的技术将很快消失?这些新技术将如何改变我们的生活?我们将如何更新我们的技能来适应这些新的变化?

来自谷歌的 Cassie Kozyrkov 在会议上指出了一些非常实际的东西,让数据科学变得有用。收集的数据比以往任何时候都多。这是确保我们正确使用数据来分析和构建功能的绝佳机会。

来自金融时报的首席产品和信息官 Cait O’Riordan 讲述了 FT 如何利用北极星指标来提高用户增长并增强工程和产品团队的绩效

稍微介绍一下北极星指标(NSM) 的背景,这是近年来来自硅谷的一个概念,它是一个单一的指标,捕捉产品向客户提供的核心价值。

回到《金融时报》,这家有着 130 年历史的出版商在商业上是一家基于订阅的数字公司。Cait 分享了他们如何通过使用 NSM 获得 100 万付费客户的经验。他们对收入、使用率、取消率、转换率等等做了研究。他们关心的是客户对其内容的参与度。

新盖·曼真瓜,炉边分析公司首席执行官。讨论了如何在组织内培养数据科学能力,尤其是什么类型的个人已准备好成为数据科学家。

那么,什么是数据科学?在她的演讲中,你可以找到的答案是,“数据科学是分析、可视化和货币化数据的过程”,这意味着,数据科学家不是开发人员、统计学家或业务分析师,而是能够处理这些的人,她称之为具有超能力的人。

还有谁有超能力?自学者。这不是第一次看到有人突出这个技能。在这个快节奏的世界里,技术已经发生了很大的变化。以我自己为例,我是微软动态 365 顾问。在我近 3 年的短暂职业生涯中,微软发布了新的功能,废弃了许多客户系统中使用的一些功能。我必须学习一些新的技能来适应这个行业,我相信其他领域的每个人都必须这样做。

来自牛津大学的桑德拉·沃希特戴着律师帽分享了她对**【大数据和人工智能时代的隐私、身份和自主性】**的见解。当我在伦敦大学学院学习数字人文科学的时候,我参加了一些关于电子出版的法律和社会方面的研讨会。我们讨论了监控和合法获取信息、信息安全和治理。

Sandra 提到脸书、亚马逊、微软等大型科技公司最近被指控在用户不知情的情况下推断用户的非常敏感的信息。他们被指控推断民族、种族、性别、性取向、健康状况,所有这些,即使他们的顾客对此一无所知。更糟糕的是,这些信息通常会与第三方共享,例如信贷机构。

听起来很可怕,是吗?很高兴一些组织已经将道德和合理的数据使用提上日程。她用一句简单的话结束了她的演讲:是时候了,我们不仅要关注什么是可能的,还要关注什么是合理的。

强烈推荐对数据科学感兴趣的人关注 O’Reilly 和 Strata 数据会议。相信我,你会学到很多!

KGCNs:基于 TensorFlow 的知识图机器学习

原文:https://towardsdatascience.com/kgcns-machine-learning-over-knowledge-graphs-with-tensorflow-a1d3328b8f02?source=collection_archive---------9-----------------------

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

这个项目引入了一个新颖的模型:知识图卷积网络 (KGCN),可以在 Apache 许可下从的 GitHub repo 免费使用。它是用 Python 编写的,可以通过 PyPi 的 pip 安装。

这项工作的主要思想是使用 TypeDB 作为知识图,在知识图、自动逻辑推理和机器学习之间建立一座桥梁。

摘要

通过监督学习,KGCN 可用于创建任何标记的 TypeDB 事物集合的矢量表示嵌入

  1. KGCN 可以被直接训练用于存储在 TypeDB 中的事物的分类或回归。
  2. 未来的工作将包括通过无监督学习构建嵌入。

它是用来做什么的?

通常,数据不太适合表格格式。在知识图中存储复杂和相互关联的数据有很多好处,尤其是每个数据点的上下文可以完整地存储。

然而,许多现有的机器学习技术依赖于每个示例的输入向量的存在。创建这样一个向量来表示知识图中的一个节点是很重要的。

为了利用机器学习中现有的想法、工具和管道的财富,我们需要一种构建这些向量的方法。通过这种方式,我们可以利用知识图中的上下文信息进行机器学习。

这是 KGCN 能做到的。给定知识图中的一个示例节点,它可以检查该示例、其上下文附近的节点。基于这个上下文,它可以确定一个向量表示,例如一个嵌入了的*。*

KGCN 适合完成两种广泛的学习任务

  1. 从知识图进行监督学习以进行预测,例如多类分类(已实施)、回归、链接预测
  2. 知识图嵌入的无监督创建,例如用于聚类和节点比较任务

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

为了构建一个有用的表示,KGCN 需要进行一些学习。为此,它需要一个函数来优化。回顾我们可以执行的广泛任务,我们有不同的案例来配置学习:

  1. 在受监督的情况下,我们可以针对我们想要执行的确切任务进行优化。在这种情况下,嵌入是学习管道中的过渡张量
  2. 为了构建无监督嵌入作为输出,我们优化以最小化图中的一些相似性度量

方法学

这个项目背后的意识形态在这里描述,还有一个的演示视频。实现的原理基于来自斯坦福 SNAP 小组的 GraphSAGE,经过大量修改后可用于知识图。KGCN 从存储在类型超图类型数据库中的上下文数据中学习,而不是处理典型的属性图。此外,它还从 TypeDB 的自动逻辑推理器推导出的事实中学习。从这一点开始,假设对 TypeDB 的文档有所了解。

现在,我们介绍关键组件及其交互方式。

KGCN

KGCN 负责导出一组事物的嵌入(从而直接学习对它们进行分类)。我们从查询 TypeDB 开始,以找到一组带标签的示例。接下来,我们收集关于每个例子的上下文的数据。我们通过递归地考虑它们的邻居,以及它们邻居的邻居,直到 K 跳远,来做到这一点。

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

我们从 TypeDB(上图)中检索关于这个邻域的数据。该信息包括所遇到的每个相邻事物的类型层次角色属性值,以及任何推断的邻居(上面用虚线表示)。这些数据被编译成数组,由神经网络接收。

通过操作聚合和组合,为一个事物建立一个单一的矢量表示。这个过程可以递归链接到相邻事物的 K 跳。这为感兴趣的事物构建了一个表示,其中包含从广泛的上下文中提取的信息。

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

在监督学习中,这些嵌入被直接优化以执行手边的任务。对于多类分类,这是通过将嵌入传递到单个后续密集层并通过 softmax 交叉熵确定损失(针对示例事物的标签)来实现的;然后,优化以尽量减少损失。

一个 KGCN 对象集合了许多子组件,一个上下文构建器、邻居发现器、编码器和嵌入器。

输入管道组件不太有趣,所以我们将跳到有趣的部分。你可以在 KGCN 的自述中读到其余的内容。

嵌入器

为了创建嵌入,我们在 TensorFlow 中构建了一个网络,该网络连续聚合和组合来自 K 跳的特征,直到保留一个“摘要”表示,即嵌入(如下图所示)。

为了创建流水线,嵌入器链聚合并组合所考虑的邻居的 K 跳操作。例如,对于 2 跳的情况,这意味着聚合-组合-聚合-组合。

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

上图显示了在监督分类的情况下这种链接是如何工作的。

嵌入器负责链接子组件聚合器和组合器,如下所述。

集合商

一个聚合器(如下图)接受一个事物邻居的子样本的向量表示。它产生一个代表所有这些输入的向量。它必须以一种顺序不可知的方式做到这一点,因为邻居是无序的。为了实现这一点,我们使用一个密集连接的层,以及 maxpool 输出(maxpool 是顺序不可知的)。

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

组合器

一旦我们将一个事物的邻居聚合成一个单一的向量表示,我们需要将它与该事物本身的向量表示结合起来。一个组合器通过连接两个向量来实现这一点,并使用单个密集连接的层来降低维度。

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

监督 KGCN 分类器

受监督的 KGCN 分类器负责编排实际的学习。它包含一个 KGCN 实例,对于任何使用 KGCN 的学习者,它提供:

  • 训练/评估/预测的方法
  • 从嵌入张量到预测的管道
  • 接受预测和标签的损失函数
  • 乐观主义者
  • 反向传播训练循环

必须是提供这些行为的类,因为 KGCN 不与任何特定的学习任务相关联。因此,这门课提供了监督学习框架所需的所有专业知识。

下面是一个稍微简化的程序流程的 UML 活动图。

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

使用 KGCNs 构建

要开始使用 KGCNs 进行构建,请查看自述文件的快速入门,确保您具备所有要求,并遵循示例用法说明,重申如下:

这将帮助您为自己的知识图构建一个多类分类器!存储库中还有一个例子,其中有真实的数据,可以填补模板使用中遗漏的任何空白。

如果您喜欢我们正在做的事情,并且您使用 KGCNs 或对其感兴趣,您可以做几件事情:

  • 提交问题以解决您在安装或使用 KGCNs 时遇到的任何问题
  • 如果你愿意帮助我们提升这部作品的知名度,就开始回购吧:)
  • Vaticle Discord channel 上提出问题、提出想法或与我们对话

这篇文章是为第三个 kglib 预发布而写的,使用了 TypeDB commit 20750ca0a46b4bc252ad81edccdfd8d8b7c46caa,随后可能会与回购不一致。查看那里的最新消息!

旧金山社区中的数据聚类

原文:https://towardsdatascience.com/kickstart-your-first-clustering-project-in-san-francisco-neighborhoods-e258e659440c?source=collection_archive---------12-----------------------

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

在这个项目中,我们将使用 Foursquare API 来探索旧金山的街区,获取每个街区中最常见的场地类别,使用 k -means 聚类算法来查找相似的街区,使用follow库来可视化旧金山的街区及其新兴的集群。

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

Project Flow

这是我们在这个项目结束时得到的聚类图:

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

这篇文章的灵感来自 Coursera 上的应用数据科学顶点课程。

先决条件:注册 Foursquare 开发者账户

Foursquare 是一家建立了海量位置数据数据集的科技公司。通过与 Foursquare 数据库通信并调用它的 API,我们可以检索给定位置周围特定类型的场所或商店。

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

这个项目一个免费账户就够了。创建完帐户后,单击创建新应用程序。标记您的客户端 ID 和客户端密码以备后用。

第一步:从网站上搜集邮编和邻居

导入库:

我们抓取下面的页面,http://www.healthysf.org/bdi/outcomes/zipmap.htm,以便获得邮政编码表中的数据,并将数据转换成熊猫数据帧。

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

我们删除了不必要的列和行,并将数据分配给新的数据帧sf_data

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

sf_data.head()

我们的数据帧中有 21 行。

步骤 2:将地址转换成纬度和经度

为了利用 Foursquare 位置数据,我们需要获得每个邻域的纬度和经度坐标。

我们将使用uszipcode,这是一个在 Python 中易于使用的 zipcode 数据库。

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

第三步:探索旧金山的街区

1.创建一张旧金山地图,在上面叠加街区。

使用geopy库获得三藩市的纬度和经度值。

旧金山的地理坐标是 37.7792808,-122.4192363。

然后我们使用folium库来绘制地图。 叶子 既可以将数据绑定到地图上,也可以将丰富的矢量/光栅/HTML 可视化作为标记在地图上传递。

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

Map of San Francisco with neighborhoods

你可以在这里找到其他更漂亮的 Matplotlib 颜色调色板。

接下来,我们将开始利用 Foursquare API 来探索社区并对其进行细分。

2.定义 Foursquare 凭证和版本

3。获取 500 米范围内每个社区排名前 100 的场馆。

对每个邻域运行上面的getNearbyVenues函数,并创建一个名为sf_venues的新数据帧。

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

sf_venues

1084 个场地被 Foursquare 退回。

让我们检查一下每个街区返回了多少个场地:

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

让我们看看有多少独特的类别可以从所有返回的场馆策划。

共有 214 个独特的类别。

第四步:分析每个邻居

我们首先将Venue Category变量转换成虚拟变量。

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

sf_onehot

根据邻近区域和每个场地类别出现频率的平均值对行进行分组。

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

创建一个新的数据框架return_most_common_venues并显示每个街区的前 10 个场馆。

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

第五步:聚集邻居

如果您需要从未标记的数据中快速发现见解,那么k-means尤其有用。

运行 k-means 将邻域聚类为 5 个聚类。k-means 会把我们的邻居分成 5 组。就数据集中包含的要素而言,每个聚类中的邻域彼此相似。

KMeans 内部参数的简要汇报:

1.random_state : KMeans 是随机的(即使使用相同的输入值运行该函数,结果也可能不同)。为了使结果可重复,可以指定一个 int 来确定随机性。

2.KMeans.fit():用特征矩阵拟合 KMeans 模型。

将原始的sf_data数据帧与聚集的neighborhoods_venues_sorted数据帧合并。

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

sf_merged

最后,让我们来看一看产生的集群:

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

步骤 6:检查集群

现在,我们可以检查每个集群,并确定区分每个集群的不同场馆类别。

集群 1

聚类 1 中有 16 个邻域。我们可以很容易地注意到,集群 1 中的大多数社区在他们的前 10 个场馆中都有Coffee Shop

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

集群 2

簇 2 中只有 1 个邻域。

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

集群 3

簇 3 中只有 1 个邻域。

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

集群 4

簇 4 中只有 1 个邻域。

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

集群 5

聚类 5 中有 1 个邻域。

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

结论

因为旧金山只有几个街区,我们无法真正获得有见地的集群。然而,你可以尝试使用更大城市的数据集:多伦多纽约

参考

  1. 应用数据科学顶点
  2. uszipcode
  3. k-means
  4. 术语“随机状态”在 KMeans 中是什么意思
  5. 叶子

美国军队中的黑仔机器人:事后的伦理

原文:https://towardsdatascience.com/killer-robots-in-the-us-military-ethics-as-an-afterthought-baf07e500d9?source=collection_archive---------24-----------------------

国防部在伟大的人工智能竞赛中争夺第一名的时候,把伦理道德抛在了脑后。

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

Image by bamenny from Pixabay.

作为美国战争机器中的代理人,美国军方并没有低估杀手机器人或致命自主武器系统(LAWS)的未来发展。人工智能(AI)自最初由艾伦·图灵(Alan Turing)等先驱创立以来,以及他对能够像人类一样学习思考和行为的机器的思考,已经显示出了很大的前景。机器学习及其子集深度学习激发了机器有朝一日能够发展甚至取代人类认知的希望。这是一项潜在的技术,国防部不能也不会忽视。虽然国防部已经制定了第 3000.09 号指令(T0),为开发自主武器系统(AWS)和致命的对应法律制定了一个实用的框架,但他们制定一个全面的伦理框架,充分回应国家和国际关注,目前只是事后的想法。但是,当走向机器人可能夺走人类生命的未来时,伦理难道不应该是这项技术的核心吗?

人工智能军备竞赛

根据美国和国际上的倡导者,AWS 和法律都有可能在战场上拯救生命,。更少的地面部队意味着更少的军事死亡,更精确和高效的任务意味着更少的平民伤亡。虽然接受战争的不可避免性可能是对人类原始本能的压抑提醒,但世界各地的战争机器运转良好,资金充足,并与时俱进。中国、俄罗斯、以色列、澳大利亚、英国和欧盟都在开发 AWS,随着技术的进步,这些 AWS 有可能成为杀手机器人。美国无意落在后面。事实上,在 2020 年的预算中,国防部希望在无人驾驶和人工智能系统上花费46 亿美元

美国已经有了完善的政府机构,如国防高级研究计划局(DARPA),该机构资助机器人自主和人工智能系统的研究。DARPA 在过去的六十年里一直在运作,现在它正通过它的 AI Next 活动展望未来。DARPA 在考虑国家安全的情况下处理高风险、高回报和长期的项目。DARPA 的 AI Next 项目之一是自主团队的上下文推理( CREATE )。CREATE 的目标是在较小的自主代理团队中建立决策能力,使他们不依赖于集中控制。想想成群的无人机,它们可以在本地协同工作,并立即做出决定,而不是听从命令。

虽然 DARPA 致力于一些长期项目,但联合人工智能中心(JAIC)于 2018 年成立,以跟上和部署技术在私营部门和学术界的开发和使用速度。JAIC 监督国防部各部门对人工智能的采用,并正在发展学术界和私营部门的合作伙伴关系,以获得快速发展和可部署的人工智能技术。但是国防部感受到的不仅仅是国家压力。国际人工智能竞赛的想法已经引起了一些关注,甚至是令人恐惧的法律军备竞赛的想法。这种速度和紧迫性是最令人担忧的。没有哪个州想输掉人工智能竞赛。随着俄罗斯总统弗拉基米尔·普京称“谁成为这个(人工智能)领域的领导者,谁将成为世界的统治者”,忧心忡忡的国家正在加快步伐。美国很有可能赢得研发和部署自主武器的竞赛,但代价是什么?如果没有一个经过深思熟虑的道德框架的约束,美国可能会以一种比 1945 年广岛和长崎原子弹袭击更令人羞愧的方式开发和部署自主武器。

道德问题

像人权观察(HRW)和哈佛法学院国际人权诊所(IHRC)这样的组织正在利用像阻止黑仔机器人的运动这样的目标来减缓人工智能军备竞赛,围绕这项技术的伦理展开讨论。当涉及到发动战争时,人们开始质疑超然的道德标准。由于风险更小,自主系统会让开战的决定更容易吗?给机器杀人的权力和意志意味着什么?出了问题谁来负责?有一种风险是,为了让我们在肮脏的战争事务中保持清白,人类军官监管致命机器的经过消毒的作战室将看不到流血。

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

Traditional horrors of war. Image by Jonny Lindner from Pixabay.

在国际舞台上,“有意义的人类控制”一词被作为法律伦理发展的一个关键组成部分来讨论。然而,对于“有意义的人类控制”在现实中是什么样子,人们还没有达成共识。在 3000.09 指令中,国防部讨论了人类判断的适当水平,而不是控制。国防部不排除完全自主的武器系统能够在没有人类直接参与的情况下选择目标和部署致命武器的可能性。然而,半自动武器系统将(并且确实)需要人类授权才能使用致命武力。

在联合国内部,《特定常规武器公约》( CCW)主持了关于法律未来的国际讨论,一些国家和组织呼吁全面禁止。但是世界上的大国(和军事支出大国)中国和美国都不希望限制这项技术的潜力。然而,美国公众并没有完全同意。在美国,2019 年 T4 益普索民意调查中,52%的受访者或多或少反对或强烈反对使用法律,而只有 24%的人支持使用法律。如果美国继续发展完全自主的武器,法律伦理将是获得公众支持的关键。民意调查收集了 26 个国家的意见,发现 66%反对使用法律的人认为这种武器越过了道德底线。人们只是对机器决定夺走一个人的生命感到不舒服。

伦理是事后的想法

那么,国防部在法律的道德发展和使用方面的立场是什么?国防部确实承认道德在法律方面的重要性,因为他们最初在宣布需要自己的伦理学家之前从技术行业寻求指导。然而,国防部已经致力于开发人工智能技术一段时间了,像机器人 Shakey 这样的项目可以追溯到 1966 年。最近,2019 年 2 月,国防部公布了其 2018 人工智能战略。然而,直到 2019 年 9 月,国防部才透露了聘请伦理学家的计划,这表明制定一个强大的道德框架并不是一个紧迫的优先事项。随着人工智能竞赛的升温,中国的目标是到 2030 年成为人工智能世界的领导者,谁有时间讨论伦理?

JAIC 主任空军中将杰克·沙纳汉指出,中国与学术界和工业界的紧密联系使他们在人工智能竞赛中占据优势。为了不被超越,国防部计划加强与一系列开发具有双重用途能力的人工智能技术的行为者的联系。根据 2018 年人工智能战略,国防部打算与学术界和工业界合作,为人道主义援助提供人工智能知识和专业知识。这种人道主义的面孔可能使他们成为更有吸引力的合作伙伴,因为一些科技行业的人发现与军队合作在道德上令人反感。谷歌拒绝继续执行五角大楼的项目 Maven 合同,此前其员工抗议以致命意图开发技术。

与担心落后于中国相比,道德根本不是国防部的首要任务。然而,可能并不是麻木不仁让伦理成为一个落后的优先事项。目前,人工智能技术只达到了让机器执行一些基本任务的水平与人类相同,或者略高。图像识别癌症检测只是两个例子。我们还需要几十年才能开发出一种技术,让机器能够完成人类能够完成的一系列复杂认知任务,更不用说将这种技术与能够像人类一样灵活移动的机器人结合起来了。随着人工智能的大肆宣传,人们很容易认为杀手机器人就在眼前,而事实上,我们可能需要几十年才能开发出这种复杂的技术。国防部可能认为他们有足够的时间来严肃对待法律伦理。与此同时,DARPA 和 JAIC 正在大力推进 AWS 的研发。在幕后的某个地方,国防部正在采取一种悠闲的方式来确保伦理学家和形成透明的道德准则,这将使他们在向人工智能终点线的比赛中承担责任(如果有一个的话)。

正如我们在 bias 中看到的,人工智能系统学到的变成了嵌入和复制。如果法律的发展在每个方面都以伦理为核心,而不仅仅是事后的想法,那么我们创造出比我们更好的机器的机会就会增加。在一台机器内完全复制人类的意识可能是不可能的,在这种情况下,反对杀手机器人的论点可能会变得更强。归根结底(如果技术允许的话),将生死决定权交给一台比我们更有道德的机器可能会带来安慰,而不是引发恐惧。如果国防部想带领美国进入人工智能军备竞赛,它必须从一个强大的道德立场出发,跟上伟大的人工智能竞赛带来的快速技术进步。

KL Divergence Python 示例

原文:https://towardsdatascience.com/kl-divergence-python-example-b87069e4b810?source=collection_archive---------1-----------------------

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

Photo by Immo Wegmann on Unsplash

随着您作为数据科学家的职业生涯的进展,您将不可避免地遇到 kull back-lei bler(KL)分歧。我们可以把 KL 散度看作距离度量(尽管它是不对称的),它量化了两个概率分布之间的差异。这很有用的一个常见场景是当我们处理一个复杂的发行版时。与直接使用分布相比,我们可以使用另一种具有众所周知特性的分布(即正态分布)来更好地描述数据,从而使我们的生活更加轻松。换句话说,我们可以使用 KL 散度来判断是泊松分布还是正态分布更适合逼近数据。KL 散度也是高斯混合模型t-SNE 的关键组成部分。

对于连续随机变量的分布 P 和 Q,Kullback-Leibler 散度被计算为积分。

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

另一方面,如果 P 和 Q 表示离散随机变量的概率分布,则 Kullback-Leibler 散度被计算为总和。

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

Python 代码

首先,我们导入以下库。

import numpy as np
from scipy.stats import norm
from matplotlib import pyplot as plt
import tensorflow as tf
import seaborn as sns
sns.set()

接下来,我们定义一个函数来计算两个概率分布的 KL 散度。我们需要确保不包含任何等于 0 的概率,因为 0 的对数是负无穷大。

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

https://en.wikipedia.org/wiki/Binary_logarithm

def kl_divergence(p, q):
    return np.sum(np.where(p != 0, p * np.log(p / q), 0))

均值为 0 且标准差为 2 的正态分布与均值为 2 且标准差为 2 的另一分布之间的 KL 散度等于 500。

x = np.arange(-10, 10, 0.001)
p = norm.pdf(x, 0, 2)
q = norm.pdf(x, 2, 2)plt.title('KL(P||Q) = %1.3f' % kl_divergence(p, q))
plt.plot(x, p)
plt.plot(x, q, c='red')

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

如果我们测量初始概率分布和另一个平均值为 5、标准差为 4 的分布之间的 KL 散度,我们预计 KL 散度将高于上一个示例。

q = norm.pdf(x, 5, 4)plt.title('KL(P||Q) = %1.3f' % kl_divergence(p, q))
plt.plot(x, p)
plt.plot(x, q, c='red')

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

值得注意的是,KL 散度是不对称的。换句话说,如果我们把 P 换成 Q,反之亦然,我们会得到不同的结果。

q = norm.pdf(x, 5, 4)plt.title('KL(P||Q) = %1.3f' % kl_divergence(q, p))
plt.plot(x, p)
plt.plot(x, q, c='red')

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

KL 散度越低,两个分布就越接近。因此,在 t-SNE 和高斯混合模型的情况下,我们可以通过最小化一个分布相对于另一个分布的 KL 散度来估计该分布的高斯参数。

最小化 KL 散度

让我们看看如何利用梯度下降来最小化两个概率分布之间的 KL 散度。首先,我们创建一个具有已知均值(0)和方差(2)的概率分布。然后,我们用随机参数创建另一个分布。

x = np.arange(-10, 10, 0.001)
p_pdf = norm.pdf(x, 0, 2).reshape(1, -1)
np.random.seed(0)
random_mean = np.random.randint(10, size=1)
random_sigma = np.random.randint(10, size=1)
random_pdf = norm.pdf(x, random_mean, random_sigma).reshape(1, -1)

假设我们使用梯度下降,我们需要为超参数(即步长、迭代次数)选择值。

learning_rate = 0.001
epochs = 100

就像numpy一样,在tensorflow中我们需要为变量分配内存。对于变量q,我们使用给定 mu 和 sigma 的正态分布方程,只是我们排除了指数之前的部分,因为我们正在归一化结果。

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

p = tf.placeholder(tf.float64, shape=pdf.shape)
mu = tf.Variable(np.zeros(1))
sigma = tf.Variable(np.eye(1))
normal = tf.exp(-tf.square(x - mu) / (2 * sigma))
q = normal / tf.reduce_sum(normal)

就像之前一样,我们定义一个函数来计算 KL 散度,它排除了概率等于零的情况。

kl_divergence = tf.reduce_sum(
    tf.where(p == 0, tf.zeros(pdf.shape, tf.float64), p * tf.log(p / q))
)

接下来,我们初始化GradientDescentOptimizer类的一个实例,并使用 KL divergence 函数作为参数调用minimize方法。

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(kl_divergence)

只有在运行tf.global_variables_initializer()之后,变量才会保持我们声明它们时设置的值(即tf.zeros)。

init = tf.global_variables_initializer()

tensorflow 中的所有操作都必须在一个会话中完成。在前面的代码块中,我们使用梯度下降来最小化 KL 散度。

with tf.Session() as sess:
    sess.run(init)

    history = []
    means = []
    variances = []

    for i in range(epochs):
        sess.run(optimizer, { p: pdf })

        if i % 10 == 0:
            history.append(sess.run(kl_divergence, { p: pdf }))
            means.append(sess.run(mu)[0])
            variances.append(sess.run(sigma)[0][0])

    for mean, variance in zip(means, variances):
        q_pdf = norm.pdf(x, mean, np.sqrt(variance))
        plt.plot(x, q_pdf.reshape(-1, 1), c='red')plt.title('KL(P||Q) = %1.3f' % history[-1])
    plt.plot(x, p_pdf.reshape(-1, 1), linewidth=3)
    plt.show()

    plt.plot(history)
    plt.show()

    sess.close()

然后,我们绘制不同时间点的概率分布和 KL 散度。

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

KNIME 分析平台是机器学习和统计的“杀手级应用”

原文:https://towardsdatascience.com/knime-desktop-the-killer-app-for-machine-learning-cb07dbef1375?source=collection_archive---------11-----------------------

数据科学|机器学习|数据可视化

一个免费、简单、开源的数据工具?是的,请!

免责声明:

我现在在 KNIME 工作,是一名数据科学家/数据工程师!大约在我申请 KNIME 的一年前,我写了这篇文章。这篇文章的标题和内容是(现在仍然是)我的个人观点。

史蒂文·波特

如果您以任何身份处理数据,请继续并帮自己一个忙:在此下载 KNIME 分析平台。

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

More data science, less slamming of the mouse and keyboard.

什么是 KNIME 分析平台?

KNIME Analytics Platform 是我迄今为止发现的最强大、最全面的拖放分析、机器学习、统计和 ETL 免费平台。既没有付费墙也没有锁定功能的事实意味着进入的障碍是不存在的。

所有主要提供商都可以使用数据源连接器(内部和云上),从而可以轻松地在不同环境之间移动数据。SQL Server 到 Azure?没问题。谷歌床单到亚马逊红移?当然,为什么不呢?应用机器学习算法并过滤/转换结果如何?你被保护了。

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

Big data? Small data? Doesn’t matter too much provided that your computer has a solid CPU and 16+ GB RAM.

同样值得一提的是,该社区非常活跃。KNIME 的开发人员和产品负责人是一个很好的合作伙伴,论坛非常活跃。

我可以深入快速入门教程或展示一些更高级的功能,但老实说,它使用起来非常直观。文档直接集成到桌面客户端,用户界面非常简单,UX 很好地融合了复杂性/可定制性(如果需要)和用户友好性。

我可以用 KNIME 分析平台做什么?

KNIME 分析平台非常适合以下情况:

  • ETL 过程(将数据从这里移动到那里并清理)
  • 机器学习
  • 深度学习
  • 自然语言处理
  • API 集成
  • 交互式视觉分析(某种程度上是测试版功能)

有什么条件?

KNIME 分析平台是 100%免费的。在 knime.com 的可以很容易地获得文档,并且有很多对平台的免费扩展。只要你是每次程序运行时点击“Go”的那个人,你就不用付一分钱。永远不会。这就是使用植根于学术界的软件包的好处。

如果您想安排工作流,KNIME Server 是一个高级产品,它允许在其他特性中安排进程。基本层 KNIME Server Small 在 AWS 上的价格大约是每小时 1.67 美元。如果您在 EC2 实例上托管 KNIME 服务器,并安排一个 cron 作业来打开和关闭实例,这是一个 非常 划算的选择。

KNIME 服务器的更高层允许使用 REST APIWebPortal 。这些功能允许您自动部署工作流,从另一个服务远程执行工作流,并为用户创建一个交互式中心。自动化工作流的能力使 KNIME Server Medium 成为一个有吸引力的选择。如果您购买了带有 BYOL 选项的最高层(KNIME Server Large ),那么您就可以使用同一个许可证来托管服务器的多个实例。

我如何学习 KNIME 分析平台?

他们的学习页面是这里是,但是如果你精通数据,那么只需下载该平台并尝试一两件事。只要将一些数据加载到应用程序中,剩下的就很直观了,可以从应用程序中访问文档。将节点从“节点资源管理器”拖到视图上。有一个搜索栏…尝试搜索“Excel”并从那里开始。

针织和建议

原文:https://towardsdatascience.com/knitting-and-recommendations-b9d178a86c97?source=collection_archive---------12-----------------------

计算机如何思考:第三部分

事实证明,我对编织所知不多。回过头来看,我想当然地认为我可以在几个小时的网上浏览中获得对如此复杂的领域做出有意义的陈述所需要的所有知识,这看起来太天真了。认为一个好的数据集和一个智能算法可以完全取代专家知识是一种危险的傲慢,但这种想法太普遍了。它源于对数学解决复杂问题的能力的乐观信心,以及对“硬”工程和数学问题相对于“软”社会和人际问题的相对复杂性的一种沙文主义。它导致了许多构想拙劣的初创企业,以及许多用手机应用解决棘手社会问题的善意尝试。幸运的是,我自己对盲目无知的尝试的风险大大降低了。

我这篇文章的计划是演示两种推荐算法。推荐可能是最常见的,也绝对是人工智能在当今互联网上最明显的表现。大型在线零售商试图从浏览器中榨取尽可能多的钱,通过向你展示表面上相关的商品来诱惑你额外购买。在线内容提供商试图让你留在他们的网站上,用另一篇文章或视频提示你,他们猜测是一个类似的主题。音乐网站在提供好的推荐方面做了也许是最深的投资。当使一首歌伟大而另一首歌糟糕的因素如此模糊不清、不可捉摸时,理解音乐品味的复杂性是他们都在竞相解决的问题。

广义来说,推荐算法就是计算相似度。他们从用户喜欢的一个或多个项目中进行推断,以找到用户也会喜欢的一组类似项目。就他们如何计算这种相似性而言,大多数推荐系统分为两大类。第一个可能是最明显的。“基于内容”的推荐假设两个项目相似,如果它们具有相似的质量。要进行基于内容的推荐,你需要对你推荐的东西有很多了解。如果你推荐的东西具有清晰、可比较和可量化的属性,那就很容易了。例如,比较一台冰箱和另一台冰箱是很简单的:大小、瓦数、是否有冷冻室、冰块制造机等等。将冰箱比作搅拌机更困难。基于内容的推荐也经常错过更微妙的环境。如果你最近购买了一台冰箱,该算法可能会假设你一定非常喜欢冰箱,因此你想开始收集它们。

第二种算法叫做“协同过滤”,更加微妙。它假设如果同样的人喜欢两个东西,那么它们是相似的。换句话说,如果你和我都喜欢冰箱,我们都喜欢搅拌机,那么这意味着,在某种程度上,冰箱和搅拌机必须有一些共同点。显然,如果你只看两个人的样本,这种方法会有相当大的误差。你和我碰巧对乡村音乐和自然纪录片都有热情,这并不意味着这两件事之间有很强的联系。但是有了足够多的人,它变得非常可靠。通过汇总大量用户的意见,虚假连接往往会被大量更有意义的连接所淹没——一般来说,购买冰箱的人也更有可能看搅拌机,而不是看弧焊机。在识别难以标记的微妙文化标记方面,这些算法通常比基于内容的方法好得多。由于这个原因,它们经常被用来推荐音乐或电视节目。例如,对于基于内容的算法来说,甲壳虫乐队和门基乐队之间的区别可能很难解析。他们都是 20 世纪 60 年代的四人流行乐队。他们拥有基本相同的乐器,相似的乐观声音,他们都不幸在职业生涯后期涉足迷幻音乐。只考虑这些事实的算法可能会假设这两组非常相似。但是披头士的粉丝不太可能乐意听到 Monkees 出现在他们的播放列表中。一种协同过滤算法能够检测到这些差异——可能会建议一些听起来与披头士很不一样,但有相似粉丝群的歌曲。协同过滤算法有几个弱点。首先,他们依赖用户行为的事实意味着他们容易过度解读异常的离群值。少数有不寻常习惯的用户有时会以不可预知的方式歪曲数据。其次,与第一点相关的是,在他们能够提出合理的建议之前,他们需要与一个新项目进行大量的互动。只有少数用户看到过的项目会有一个基于小数据集的建议,因此可能会反映这一小部分用户的特质。这被称为“冷启动问题”,因为算法需要大量数据来“预热”以提供良好的推荐。

记住这两个算法,让我们回到我尴尬的失败。为了演示这两种推荐方法,我需要一个大型的项目数据集、关于这些项目的一些属性的信息(形成基于内容的算法的基础),以及关于用户及其与这些项目的交互的信息(构建协作过滤算法)。在网上搜索了一段时间,并与一些朋友交谈后,我选择了 Ravelry,一个分享针织图案的网站,作为我的数据来源。Ravelry 可能是互联网上最大的针织和钩针图案在线收藏,其广大用户全年在世界各地上传、评论、分享、下载和保存数十万种图案。他们收集了大量我需要的数据。一封非常大胆的电子邮件之后,Ravelry 非常乐于助人的人给我提供了下载我需要的数据的方法。

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

Thanks, Ravelry!

现在。这是我应该停下来的地方。盘点一下。思考我正在着手的项目,对我的专业知识进行诚实的评估,并寻求一些专家的帮助。读者,我没有。这件事的后果直到很久以后才变得明显。

为了帮助用户在他们的网站上找到模式,Ravelry 记录了大量的“元数据”。这包括图案的“难度等级”,关于风格的关键词,图案是针织还是钩编,是套头衫还是手套,以及一大堆更模糊的指标。出于我们的目的,这将形成“基于内容”算法的基础。我们要建立一个算法,可以根据一个针织图案的元数据,找到另一个相似的图案。忽略网站上提供的更深奥的信息,我下载了几百个模式的最重要的度量,并开始准备数据。

以下是图案的主要特征——在这种情况下是可爱的针织毛绒玩具——出现在 Ravelry 网站上的方式:

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

Mr. Dangly, in a contemplative mood

姓名:“丹格里先生”

类别:动物

难度:1.9

工艺:针织

关键词:条纹、接缝、文字图案、加工平面

要将这一团关于针织图案的非结构化信息转化为适合我们算法的数据集,需要一系列数学技巧和转换。首先,除了“困难”之外,所有这些数据都是英语单词的形式,这些单词对计算机的意义就像一串二进制 1 和 0 对你和我的意义一样。我们的首要任务是将这些单词转化为数字。为了做到这一点,我们使用了一种叫做“一键编码”的技巧。

一键编码因电子工程中的一项技术而得名。假设您有一台机器,它可以处于两种状态之一:开或关。你可以很容易地用一盏灯来指示机器的状态。如果灯亮着(或“热”),则机器启动。如果灯关了,机器也关了。但是如果机器有三种状态呢?说,开,关,还有“预热”。现在显示机器的状态就更复杂了。你需要第二盏灯。没有灯意味着机器关闭,第一盏灯意味着机器正在预热,如果第二盏灯亮着,则机器准备就绪。如果两盏灯都亮着,你的机器有问题。对于你的机器可能处于的每一种状态,你都需要增加一个额外的灯。这不是最有效的信息编码方式——如果机器非常复杂,你需要很多灯——但它的优点是可靠性。很难意外地发出错误状态的信号,并且很容易判断是否出了什么问题——一次有多个灯亮着。

我们可以使用相同的技术来编码我们的类别数据。我们有一个单列的数据,每行表示几个类别中的一个,而不是一个可以处于不同状态的机器。我们不使用灯光,而是将单列数据转换成多列,每一列对应一个类别,“围巾”、“套头衫”、“无檐帽”、“羊毛衫”、“围巾”等。对于每一行,所有这些列的值都是零,除了与我们的项目类别相对应的列,它被设置为 1。我们可以通过查看哪一列的值为 1 来确定数据集中每一项的类别。

关键字数据——如“fringe”、“granny-squares”等——基本上得到相同的处理:每个可能的关键字对应一列,如果该项目不包含该关键字,每行包含 0,如果包含该关键字,则包含 1。这创建了一个非常“宽”的表,有许多列。我们的填充朋友,上面的 Dangly 先生,可能(部分)由我们表中的以下行表示:

现在我们已经对这些数据进行了编码,我们可以用它来进行基于内容的推荐。

这类推荐本质上是关于计算相似度的。我们想找到与丹格里先生最相似的模式。为此,我们将使用一种叫做“欧几里德距离”的度量。

欧几里德距离测量距离就像我们在现实生活中测量距离一样——两点间直线的长度。正如我们可以计算地图上两组经纬度坐标之间的距离一样,我们也可以计算表格中两行数值数据之间的距离。如果我们想象我们的数据集只有两列,这很容易想象,“困难”(2 代表丹格里先生),和“动物”(1 代表丹格里先生,他是一只猴子)。我们可以将它绘制在二维图表上,并将其与其他三种假设模式进行比较:“狡猾先生”——一种填充动物,像丹格利先生一样,但制作起来更复杂,难度等级为 3;“易跳投”——像丹格利先生一样容易制作,但不是填充动物玩具;还有“狡猾的手套”——一点也不像丹格利先生,既不容易制作,也不是毛绒动物。

这些假设模式的数据如下:

当我们在二维图表上绘制时,距离计算变得很清楚:

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

Figure 1: Euclidean distances

丹格利先生和其他三种模式之间的欧几里德距离实际上是它们之间的直线长度,就像你用尺子测量它一样。“狡猾的手套”,由于有一个更长的对角线,丹格里先生,有最大的欧几里德距离,是最不相似的。“轻松跳投”和“狡猾先生”离丹格利先生同样遥远——它们同样相似。

关于欧几里德距离的有趣而又令人困惑的事情是,这个计算适用于任何数量的额外维度。您可以想象在这个图表中添加第三个高度轴,代表其中一个关键字。对于那些不共享关键字的模式,三维空间中的线会更长。(至少对我来说)在三维以上的空间中想象这一点变得越来越困难,但我确信数学是完全正确的,实践证明了这一点。

这张图表也暴露了这种方法的一个问题。你会注意到从丹格里先生到“狡猾先生”和“容易跳楼者”的欧几里得距离是完全相等的。我们的算法假设这两种模式都与丹格利先生相似,都是同样好的推荐。这是一个好的假设吗?一个难度点的区别就相当于一个毛绒动物和一个跳楼者的区别吗?直觉上,感觉是没有。但是我怎么知道呢?如果这两个差别不是一个量级,那么差别有多大?与类别差异相比,我应该给难度差异多少权重?我完全没有资格回答。这是我选择寻求一些外界帮助的时候(太晚了),这样我就能更多地了解编织者是如何选择图案的。结果是…令人羞愧。

事实证明,我之前丢弃的所有晦涩难懂的指标,比如“纱线重量”、“针距”和“码数”,实际上对许多针织者来说至关重要。我是个傻瓜!针织者通常会寻找与现有纱线搭配的图案,而不是为每个图案购买新的纱线。这意味着她们对图案的选择常常受到制作图案所需纱线种类的限制。将它们排除在我的算法之外意味着它生成的建议通常表面上可以接受,但根本不能反映编织者的实际偏好。

为了解决这些问题,首先我不得不回到数据的来源,诅咒自己,重新下载所有数据,包括我现在意识到对分析至关重要的额外指标。然后,在咨询了我匆忙招募的针织专家后,我创建了权重——一个衡量每个指标的值,以反映它对针织者选择图案的重要性。有了这些改进,我可以提出对真正的编织者有意义的建议。

最终的算法主要考虑图案的工艺(无论是针织、钩编还是其他)、类别、纱线重量和难度。但它也考虑了关键词、针规格和许多其他因素。对于其中的每一个,它都会计算出模式之间的“距离”。他们的共同点越多,距离就越小。

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

The “Spring Collection”

对于上面的毛绒玩具猴子 Dangly 先生,该算法推荐了“春季系列”,一套毛绒玩具图案,包括刺猬、青蛙、兔子和羔羊。它们同样易于编织,采用了相似的技术——有接缝的结构和流苏的使用(丹格里先生用的是一簇整洁的头发,春季系列用的是刺猬的刺)。从很多方面来说,这都是一个非常好的推荐。但是有些事情不太对劲。丹格利先生有一种怪癖,某种程度的奇思妙想或风格使他脱颖而出。相比之下,虽然表面上与丹格利相似,但春季系列缺少他的独特魅力。它们似乎有点乏味,而且有点甜。我觉得丹格利先生的朋友不太可能和春季系列的成员相处融洽。该算法提出了一个理论上正确的建议,但它忽略了模式的一些细微差别。它错过了一些人类看不到的东西。它忽略了他们的个性。

这使得协作算法试图做得更好。协同过滤算法与基于内容的算法非常不同。我们的基于内容的算法使用关于模式本身的元数据,而协作过滤方法关注与这些模式交互的的信息。Ravelry 允许用户“喜爱”图案,并存储他们喜爱的列表。这些列表是公开的,这意味着我可以下载几十万个 Ravelry 用户的“最爱”模式列表。就个人而言,这些列表是独特的,信息不多。喜欢厚针织围巾的人可能也对新奇的茶具感兴趣,这不应该暗示我们关于围巾或廉价家居装饰的任何事情。但总的来说,在我能够从 Ravelry 检索到的各种卷中,这些信息确实变得非常有用。因为协同过滤使用了关于人类行为和偏好的相对更复杂和微妙的信息,我希望我能够更准确地捕捉到难以捉摸的丹格利先生的一些信息。

尽管数据量要大得多,但在许多方面,这种算法构造起来要简单得多。基于内容的算法使用一个数据集,其中每一列代表模式的某个方面,而对于协作算法,我构建了一个数据集,其中每一列代表一个用户,每一行的值反映了该用户是否“偏爱”该模式:

有了这个数据集,我们可以用与基于内容的算法完全相同的方式来计算相似性。在欧几里德距离计算中,每个用户是一个“维度”。相同用户喜欢的模式被认为是相似的。

在我看来,这个算法的第一个结果并不乐观。根据算法,一个小小的针织钱包非常类似于一条花边毛巾。一双编织袜子类似于一条精致的披肩。这毫无意义,直到我与我的编织专家交谈,他们指出了我未经训练的眼睛所忽略的更微妙的相似之处。钱包和毛巾都是小项目,使用各种各样的技术和模式,一个新的编织者可以用来发展他们的技能。袜子和围巾都使用了两种颜色的细纱线,这可能是那些想要用完现有羊毛库存的人的首选。但是其他的建议甚至让我的专业编织者也感到困惑。交互很少的模式——新模式或模糊模式——往往会得到特殊的或明显错误的推荐,算法的产品几乎没有任何信息来作为其相似性计算的基础。这是协作算法的一个弱点,即“冷启动问题”。有一些数学技巧可以用来解决这个问题,我最终使用了很多这些技巧(我不会在这里详细讨论它们),但如果没有良好的用户交互,该算法对任何项目的推荐都很差。

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

The Socktopus

但是我们的朋友丹格里先生怎么样了?幸运的是,丹格里先生独特的魅力已经为他赢得了足够的关注,并为他提供了一系列的建议。领先推荐是合作推荐优势的理想例证。“Socktopus”顾名思义就是穿袜子的章鱼。他很容易制作,并使用了一些与丹格利先生相似的技术,但也缺少丹格利先生的一些特征——没有接缝,没有边缘。但至关重要的是,Socktopus 与 Dangly 先生有着相同的古怪风格和个性。协作算法发现了一些基于内容的算法没有发现的东西——不仅仅是原始信息,还有人们如何将这些信息联系起来。它能理解它们的的含义

出于这个原因,协作算法非常受任何试图推荐复杂文化产品的人的欢迎,无论是书籍、电影、音乐,甚至是针织图案。但是,当在线平台广泛使用协作推荐来指导他们向用户展示什么内容时,他们有可能成为这种算法的另一个致命弱点的受害者。协作算法非常擅长发现项目之间的微妙联系,擅长定义品味的界限。他们可以区分音乐的子流派,所以死亡金属的粉丝永远不会因为听到毁灭金属(我敢保证,这是完全不同的事情)而被冒犯。他们可以很好地解析新闻文章的主题,这样那些关注他们当地运动队的人就不会被当地的政治所困扰。但是这种边界管理是有代价的。它们可以产生“泡沫”效应。

气泡效应是指用户只看到更大的内容池中的一小部分,而永远不会意识到他们那一小部分之外的任何东西。当一个算法由用户交互的内容驱动,而用户只看到算法展示给他们的内容时,就存在一个反馈回路。用户与展示给他们的东西互动,他们也与展示给他们(或喜欢他们的用户)互动的东西互动。如果不小心,用户会发现自己被包裹在“安全”内容的茧中,只能看到相同种类的内容。从商业上来说,这是在线平台的一个风险。如果用户从来没有发现他们可能喜欢的新东西,如果他们从来没有机会扩展他们的口味,他们会感到厌倦并继续前进。但这也有更微妙的社会风险。在反馈循环中,人们只看到符合他们口味的内容,他们同意的内容,符合他们现有世界观的内容。遇到挑战你对世界的信念的事情是令人不快的;听你不喜欢的音乐,看关于你不了解的事情的电影,或者读关于可怕事件的新闻。但是,遇到并试图理解新的和具有挑战性的事情是我们如何学会适应和与不同于自己的人合作。通过把自己与志同道合的人隔离开来,只看到我们喜欢的东西,我们把自己与更广阔的世界隔离开来。

当你对某件事了解不多的时候,很容易做出假设。我低估了针织及其爱好者的复杂性和细微差别。我以前从未真正遇到过这种情况,这种无知暴露出来让我很不舒服。协作式和基于内容的推荐算法都只能从过去看到的内容中推断出模式。他们和我一样,倾向于根据他们已经知道的东西做出假设。这不是算法本身的问题——数学是无可指责的。问题在于构建算法的人和使用算法的人。我对基于内容的算法的失败在于,我认为大量的数据和一些巧妙的数学运算足以理解一个复杂的领域。协作算法的风险更加微妙,但它们也源于一种傲慢,一种我们可以完全预见用户需求的信念,这种信念就像找到他们已经喜欢的东西一样简单。在这两种情况下,拥抱复杂性,并采用更全面的方法,可以帮助减轻这些风险。

这是我们在之前的算法中看到的主题,我们将在未来的文章中再次看到。这是机器学习算法的一个共同特征。它们只和用来创建它们的数据一样聪明。如果他们要真正学习,真正创造新的东西,而不仅仅是反映我们现有的知识和偏见,那么我们必须教他们。我们必须正视我们的无知。我们必须学习。

本系列上一篇,《线性回归与数列》可用 此处 。本文的代码可以在我的 github 中找到, 这里 。下一篇文章将于 4 月发表。

制作自己的 丹格利 Socktopus,前往www.ravelry.com(账号必填)。

仅用 13 行代码实现 KNN 可视化

原文:https://towardsdatascience.com/knn-visualization-in-just-13-lines-of-code-32820d72c6b6?source=collection_archive---------5-----------------------

是啊!就这么简单。让我们用数据集来想象当“k”变化时,决策边界是如何变化的。

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

让我们快速回顾一下…

K-NN 是什么?它是如何工作的?

k 最近邻(KNN)算法是一种非常简单、易于理解、通用性强的机器学习算法。在 k-NN 分类中,输出是一个类成员。通过其邻居的多个投票对对象进行分类,将该对象分配到其 k 个最近邻居中最常见的类别(k 是正整数,通常很小)。如果 k = 1,那么该对象被简单地分配到该单个最近邻的类中。

在 KNN,K 是最近邻居的数量。邻居的数量是核心决定因素。如果类的数量是 2,k 通常是奇数。当 K=1 时,该算法称为最近邻算法。这是最简单的情况。假设 P1 是需要预测标签的点。

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

Basic steps in KNN.

KNN 有三个基本步骤。
1。计算距离。
2。找出 k 个最近的邻居。
3。为班级投票

K 的重要性

你不能为 k 取任何随机值,整个算法都是基于 k 值的。即使对 k 的微小改变也可能导致大的变化。像大多数机器学习算法一样,KNN 的 K 是一个超参数。您可以将 K 视为预测模型的控制变量。

在这篇博客中,我们将看到决策边界如何随 k 变化。为此,我将使用不同类型的玩具数据集。你可以很容易地从下面的链接下载所有这些数据集。

[## 可视化 KNN

下载数千个项目的开放数据集+在一个平台上共享项目。

www.kaggle.com](https://www.kaggle.com/deepthiar/toydatasets)

了解数据集

  1. u 形的

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

在这个数据集中,我们可以观察到这些类是一个互锁的 u 形。这是一个非线性数据集。
蓝色点属于 0 类,橙色点属于 1 类。

2.两组同心圆

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

在这个数据集中,我们可以看到这些点形成了两组同心圆。这是一个非线性数据集。
蓝色点属于 0 类,橙色点属于 1 类。

3.异或运算

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

该数据集类似于 2 变量 XOR k 图。这是一个非线性线性数据集。

蓝色点属于 1 类,橙色点属于 1 类。

4.线性可分的

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

这是一个线性数据集,其中的点可以线性分离。

蓝色点属于 0 类,橙色点属于 1 类。

5.极端值

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

在这个数据集中,我们可以观察到两个类中都有异常点。我们将看到异常值的存在如何影响决策边界。这是一个线性数据集。
蓝色点属于 0 类,橙色点属于 1 类。

现在,我们知道了我们的外观,我们现在将继续下去,看看决策边界如何随着 k 值的变化而变化。在这里,我将 1,5,20,30,40 和 60 作为 k 值。您可以尝试任何一组值

首先,让我们导入库。

import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets, neighbors
from mlxtend.plotting import plot_decision_regions

需要以下核心功能。

def knn_comparison(data, k):
 x = data[[‘X’,’Y’]].values
 y = data[‘class’].astype(int).values
 clf = neighbors.KNeighborsClassifier(n_neighbors=k)
 clf.fit(x, y)# Plotting decision region
 plot_decision_regions(x, y, clf=clf, legend=2)# Adding axes annotations
 plt.xlabel(‘X’)
 plt.ylabel(‘Y’)
 plt.title(‘Knn with K=’+ str(k))
 plt.show()

你可以观察到它只是一行代码,做了所有的事情—
clf = neighbors。KNeighborsClassifier(n _ neighbors = k)

就是这么简单优雅。现在,我们只需加载我们的 CSV 文件,并将其与 k 一起传递给该函数。我们将对所有数据集逐一执行此操作。

让我们开始吧…

1.u 形

data1 = pd.read_csv(‘ushape.csv’)
for i in [1,5,20,30,40,80]:
    knn_comparison(data1, i)

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

KNN visualization for the U-shaped dataset

2.两组同心圆

data2 = pd.read_csv(‘concertriccir2.csv’)
for i in [1,5,20,30,40,60]:
    knn_comparison(data2, i)

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

KNN visualization for the two concentric circles dataset

3.异或运算

data3 = pd.read_csv(‘xor.csv’)
for i in [1,5,20,30,40,60]:
   knn_comparison(data3, i)

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

KNN visualization for the XOR dataset

4.线性可分的

data4 = pd.read_csv(‘linearsep.csv’)
for i in [1,5,20,30,40,60]:
    knn_comparison(data4, i)

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

KNN visualization for the linearly separable dataset

5.极端值

data5 = pd.read_csv(‘outlier.csv’)
for i in [1, 5,20,30,40,60]:
    knn_comparison(data5, i)

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

KNN visualization for the outliers dataset

观察结果:

在所有数据集中,我们可以观察到,当 k=1 时,我们过度拟合模型。也就是说,每个点都被正确分类,你可能会认为这是一件好事,正如俗话所说的“太多太坏”,过度拟合本质上意味着我们的模型训练得太好,以至于对模型产生负面影响。

在所有的数据集中,我们可以观察到当 k = 60(一个很大的数字)时,我们对模型拟合不足。欠拟合指的是既不能对训练数据建模也不能推广到新数据的模型。欠拟合的机器学习模型不是合适的模型。在离群数据集的情况下,对于 k=60,我们的模型做得相当好。我们怎么知道这个?因为我们知道那些点是异常值,数据是线性可分的,但并不是每次都是这样,我们无法确定。此外,在 XOR 数据集中,与其他模型不同,k 的值不会在很大程度上影响模型。

研究表明,不存在适合所有类型数据集的超参数(k)的最佳值。每个数据集都有自己的要求。在小 k 的情况下,噪声将对结果具有更高的影响,而大 k 将使其计算代价昂贵。研究还表明,小 k 是最灵活的拟合,它将具有低偏差但高方差,而大 k 将具有更平滑的决策边界,这意味着较低的方差但较高的偏差。

过拟合和欠拟合是机器学习算法性能差的两个最大原因。

结论:

当 K 较小时,我们会限制给定预测的区域,并迫使我们的分类器对整体分布“视而不见”。K 值越小,拟合越灵活,偏差越小,但方差越大。从图形上看,我们的决策边界将会像上面观察到的那样更加参差不齐。另一方面,K 值越高,每次预测的平均点数越多,因此对异常值的适应能力越强。K 值越大,决策边界越平滑,意味着方差越低,但偏差越大。

参考

  1. www . data camp . com/community/tutorials/k-nearest-neighbor-class ification-sci kit-learn
  2. scott.fortmann-roe.com/docs/BiasVariance.html
  3. rasbt . github . io/mlx tend/user _ guide/plotting/plot _ decision _ regions/# references

你还在等什么?继续玩数据集吧!!

了解分类编码,甚至是新的编码!

原文:https://towardsdatascience.com/know-about-categorical-encoding-even-new-ones-c266227b9cbd?source=collection_archive---------7-----------------------

对分类数据进行编码会对 ML 模型的性能产生影响。在本文中,我将向您介绍广泛的编码方法:最常用的和最近使用的。****

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

Photo by Patrick Fore on Unsplash

介绍

在数据科学问题中,数据集通常会包含分类特征。分类变量通常包含固定数量的可能值。
这些值中的每一个都被称为一个电平。 与分类变量相关的概率分布称为分类分布(伯努利或多项式分布)。

不幸的是,大多数机器学习算法无法处理分类特征。因此,我们必须对这些变量进行编码,以收集尽可能多的信息。

本文旨在介绍其中的一些方法。在处理更复杂的方法之前,我们先介绍一种简单的技术。

方法列表:

  • 一键编码
  • 标签编码
  • 目标编码
  • 特征散列
  • 证据的重要性
  • 轻型 G-Boost 编码

一键编码

独热编码包括为给定定性变量的每个类别生成一个布尔列

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

一键编码的限制

**一键编码是对分类变量的一种非常流行的转换。然而,它增加了数据的**维度(维度的诅咒)。
当数据集中的定性变量有多种模态时,通过一键编码进行的转换将导致大小显著增加。这是不可取的,尤其是当原始数据集已经很大的时候。

标签编码

标签编码就是用一个介于 0n_classes -1 之间的值来替换一个类别值的过程(类别数)。然后,机器学习算法可以更好地决定应该如何操纵这些标签。

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

标签编码的限制

这里的问题是模型可能会误解数据。
事实上,通过应用标签编码,分类特征可以被视为连续特征。

这种方法的另一个限制是,具有高值的标签可能被认为比具有较低值的标签具有更高的优先级。

目标编码

目标编码是指通过用特定目标的后验概率和训练数据上所有目标的先验概率的混合来替换特征,从而将标签转换成数字形式。
好像我们在为每个目标值计算类别的频率。

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

标签编码的局限性

这种方法的主要缺点是它依赖于目标的分布,并且它的预测能力低于二进制编码方法。

特征散列

特征哈希,被称为哈希技巧,是降维和实用非参数估计的有效策略。

但是,在我们深入这个方法的定义之前,我们将解释一下数组链表的一些基本概念。

  • 数组: 数组是具有固定大小的项目集合。所有元素都有索引,我们使用索引来访问数组中的特定项。****

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

https://o7planning.org/fr/11567

  • 链表:
    链表是数据元素的线性集合。当您不想担心数组大小时,这是一种非常流行的数据结构。
    链表可以
    动态增长
    。我们简单地将下一个元素的地址存储在前一个元素中。这样,我们就可以把它长到任何大小。但是我们总是需要以一种
    顺序的方式从一个元素到另一个元素。********

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

https://hackernoon.com/implementing-singly-linked-list-with-ruby-om2df3ya6

这些概念构成了方法散列技巧的基础。

顾名思义,我们将一个散列函数应用于特性,并直接使用它们的散列值作为索引,而不是在关联数组中查找索引。

现在,我们将逐步解释“特征散列”算法😗***

1 — MOD 功能:

我们为什么使用 MOD?我们需要创建一个散列表来存储 MOD 值。提醒指示了索引号,我们可以将分类值(蓝色))存储在散列表中。

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

2-哈希表:

我们使用散列位大小来指定创建散列表时使用的位数。例如,在我们的例子中,我们有 MOD 8,那么比特大小是 8。

如果我们对“blue”的哈希值 7 进行 mod 8,它会将值“Blue”存储在哈希表的索引 7 中,如下所示。

有时候,我们会遇到碰撞的问题(比如“蓝色”&“绿色”),所以我们可以通过使用分离链接来解决这个问题,分离链接是链表的组合。

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

3-单独链接:

在上面的例子中,我们需要在索引 7 中插入单词“Blue”和“Green”。因此,我们简单地在散列表的索引 7 中创建一个链表。

数组链表的组合称为分离链接。****

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

3-特征散列:

综上所述,我们首先需要找出分类值(颜色)的哈希值。然后,我们对哈希值应用 MOD 函数,得到这些数字的提示。最后,我们创建新特性集,并用相应的值填充表格。

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

有用的小技巧!

通常,我们在文本挖掘中使用哈希技巧,我们可以将可变长度的文本文档表示为等长的数字特征向量,并实现降维。

下面我们来对比一下单词袋法和哈希法
单词包创建稀疏的特征矩阵。然而,特征散列技术可以用较少数量的特征构建预定义长度的向量。

散列位大小取决于训练集中类别的数量或 n 元语法词汇的大小。如果词汇表很大,可能需要更多的空间来避免冲突。****

证据的重要性

证据权重(WOE)的目标是有效地识别分类预测值列表的证据权重值的最佳记录,并为每个类别分配唯一的证据权重值。

证据权重可用于组合变量组/级别,这个过程称为粗分类。我们组合具有相似 WOE 的类别,然后用连续的 WOE 值替换这些类别。

现在,通过取非事件的百分比与事件的百分比之比的自然对数来计算 WOE。

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

证据权重(WOE)是为信贷金融部门开发的,主要用于创建预测贷款违约风险的更好模型(信贷风险模型)。

有一个经典的例子来突出 WEO 方法,在这里我们可以通过测量“信用评分来区分好客户坏客户。WOE 公式表示为:

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

  • 商品的分布——集团内良好顾客的百分比
  • 不良分布——不良客户在一个组中的百分比

分类转换:

对于分类变量,我们计算每组中事件和非事件的数量和百分比。然后,我们通过取非事件百分比和事件百分比的自然对数来计算权重。

我们将举一个的例子来说清楚。

在本例中,我们有一个分类变量(“特征”)和三个组(“A”、“B”和“C”)以及一个二元目标变量(“结果”)和两个类( 1 和 0 )。
我们将目标变量中的 2 个类视为“事件”(类 1)和“非事件”(类 0)。然后我们计算 WOE 值,如下所示。****

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

转换变量将是一个具有 WOE 值的连续变量。

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

信息价值:

通常,我们将证据权重与信息值相关联,该信息值表示用于将事件与非事件分开的变量的信息量。这有助于根据变量的重要性对其进行排序。
使用以下公式计算 IV:

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

我们计算上例中的 IV 值:

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

信息值相关规则:

在本例中,“特征”变量的 IV 值为 0.221 ,则该预测因子与事件/非事件比值比具有中等强度关系。

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

https://www.listendata.com/2015/03/weight-of-evidence-woe-and-information.html

有用的小技巧!

WOE 转换的优点是:

  • 处理缺失值
  • 处理分类变量,因此不需要虚拟变量。
  • 该变换基于分布的对数值。这与逻辑回归输出函数一致

对于分类预测器,我们可以组与相似的观察值权重组合,以创建具有连续证据权重值的新编码预测器。

为什么要合并具有相似 WOE 的类别?具有相似权重的类别具有几乎相同的事件和非事件比例。换句话说,两个类别的行为是相同的。

轻型 G-Boost 编码

首先简单介绍一下 Light-GBM (光梯度提升)。

什么是梯度增强?

这是一种升压算法,使用梯度下降法将损耗降至最低。我们所说的增强是指将一组弱学习者结合起来形成一个强规则。这是一个反复的过程。

为什么很轻?

Light GBM 是一个快速、分布式、高性能的梯度推进框架。与其他 boosting 算法不同的是,它按叶方式而不是按层方式分割树。LGBM 跑的非常快,所以才有了“这个词。****

分类特征支持:

LightGBM 可以直接使用分类特征(没有独热或标签编码)。它有一种独特的方式来处理分类变量。

LGBM 应用 Fisher 的 方法来寻找类别上的最优拆分**。**

我们经常用一键编码来表示分类变量,但最佳解决方案是通过将分类划分为 2 个子集来分割分类特征。
如果特征有 k 个类别,则有
个 2^(k-1)-1** 个可能的分区。然后我们需要找到最佳分区。**

LightGBM 实现了独占特性捆绑(EFB)** 技术,该技术基于( D. Fisher,1958 )的研究,以找到类别的最佳分割。**

独家功能捆绑:

给定一组类别,将它们分组以使组内的差异最小化的实用程序是什么?
这里,注意力将被限制在原始类别到组中的各种可能的组合,假设在每个组内按比例分配。

因此,为了找到最佳分组,计算每个可能的2^(k-1-1分区的 D 值就足够了。

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

N : 一个分区中元素的数量。
w_i :元素 I 的权重
a_i : 元素 I 的数值度量

D 被称为 最小二乘划分 ,其代表与一般平均值的平方偏差之和。为了找到最佳分割,我们选择具有最小 D 值的分区。

有用的小技巧!

轻量级 GBM 支持分类变量,它的方法对于树学习者来说是次优的。

这种方法通常比一键编码执行得更好。
此外,在具有高基数的分类特征的情况下,建立在独热特征上的树往往是不平衡的,并且需要增长得非常深以实现良好的准确性。

leaf-wise 方法(Light GBM 使用)的一个缺点是,当数据很小时,它可能会导致过度拟合。

总结:

在机器学习中,我们通常处理在一列或多列中包含多个标签的数据集。这些标签可以是分类的。因此,我们必须将这些特征转换成机器可读的形式。

在本文中,我们讨论了数据科学问题中一些最常用的编码方法,如上所述。

参考

[1] Deepanshu Bhalla证据权重(WOE)和信息价值(IV)解释

[2] LightGBM 的文档

[3]证据权重(WoE)介绍性概述, Statsoft 网站

[4]目标编码器, Scikit-Learn 网站

脚注:

在这项研究中,我们提出了非常著名的技术,这些技术通常用于特征工程,以提高最大似然模型的准确性。

我感谢你们所有人一直和我们在一起。

感谢阅读。😃
尽情享受吧!

认识你自己:利用数据科学探索你自己的基因组

原文:https://towardsdatascience.com/know-thyself-using-data-science-to-explore-your-own-genome-ec726303f16c?source=collection_archive---------18-----------------------

熊猫和硒的 DNA 分析

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

“Nosce te ipsum”, (“know thyself”), a well-known ancient maxim, frequently associated with anatomical knowledge.

图片来自剑桥大学

23andme 曾经提供给我一套免费的 DNA 和血统测试工具,如果我参加他们的一项临床研究。作为一个脸颊拭子和在大量问卷中展示我的勇气和灵魂的交换,我得到了我的基因组测序,并获得了无数关于我的祖先可能来自哪里,我可能与网站上的其他人有关系,以及我可能遗传了什么健康状况和特征的报告。

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

Seriously?

23andme 已经提供了大量面向消费者的信息图表和工具,但我知道我可以利用这些数据做更多的事情。勇敢者可以下载他们的原始基因数据,如果他们敢的话,所以我当然把它倒在熊猫身上给看我能做什么。

望着。txt 文件,我可以看到我丢失了一些基因型值,用“—”表示。

大多数染色体是整数,但有三个是 X,Y 和 MT(代表线粒体)。我需要正确地指定数据类型,以便 pandas 在输入中发现混合数据时不会抛出错误。

其他专栏相当简单。我还想让 pandas 忽略文件开头的序言注释,这些注释由以八叉线开头的行组成。

因此,我需要传递的参数是:

  • 分隔符(制表符分隔)
  • 数据类型(作为字典)
  • na_values (’ — ') (注意:为了避免和更多的 nan 打交道,我最终决定不这么做)
  • 注释(’ # ')

关于列名的快速注释:

  • rsid 代表参考 SNP 簇 id。它识别独特的 SNPs。
  • SNPs 是单核苷酸多态性(“SNPs”),即个体之间不同的基因组位置。它们可以影响疾病风险和药物效果,告诉你你的祖先,并预测你的外表和行为。
  • 所有人类都有几乎相同的 30 亿个 DNA 碱基序列(A、C、G 或 T ),分布在他们的 23 对染色体之间。但是在某些地方,由于医学或其他原因(如系谱学),研究人员宣称存在一些有意义的差异。

我开始用基本的探索性数据分析和数据清理来导航我的新数据框架。

我将字母染色体转换为数字,将它们转换为整数,并创建了一个字典,以便稍后将它们翻译回来,以便我可以更好地处理数据。

一些可视化

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

RSIDs per chromosome

从 SNPedia 获取 SNPs 数据

为了获得更多关于我的 DNA 的信息,我从 SNPedia 获取了文件,这是一个研究人类遗传学的维基,收集了大量数据并引用了同行评审的科学出版物。SNPedia 对常见的、可重复的 SNP(或在至少 500 名患者的荟萃分析或研究中发现的 SNP)或具有其他历史或医学意义的 SNP 进行分类。

这些列是:

  • 未命名:0(实际上是 SNP 名称)
  • 量级(感兴趣的主观量度)
  • 名声(一种基于研究的基因型是“好”还是“坏”的主观衡量标准,对于血统和眼睛颜色等则为空白)
  • 摘要(叙述性描述)

正则表达式的乐趣

为了与我的原始数据框架一致,我创建了一个基因型列,并使用 regex 分离出基因型,它被缝合到 SNP 名称的末尾。

出于一致性的考虑,我重命名了这些列以匹配我的原始数据帧,并确保 rsids 都是小写的。

我也使用了正则表达式来清理 rsid(因为我会找任何借口使用更多的正则表达式)。

我重写了无效的名声和总结。

将我的数据与 SNPedia 合并

足够恰当的是,我在我的 DNA 上做了 SNPedia 数据框架的内部连接,以查看它在我的特定基因型上有什么数据,如果有的话。

里面藏着什么?

我有很多“好”的基因型,但没有一个是非零的。

我有三个非零的“坏”基因型。

可悲的是,我没有超过 4 的“有趣”基因型,尽管令人振奋的是,我有一些稍微有趣的坏基因型。

用硒刮相关物品

我决定我可能会喜欢阅读我糟糕的遗传学,所以我用 Selenium 从 PubMed 上收集了一些科学论文的摘要。

为了以后疑病症患者的阅读,我使用 pandas DataFrame.to_csv 方法将我的发现连同摘要和超链接导出到一个 CSV 文件中。

研读医学文献

现在我有了一个方便的 CSV 文件,格式很好,引用了科学文章,分析和描述了我的可能没有问题,但具有试验性的基因型。Python 提供了惊人的工具来进行文字自省,这是古代的锯骨人无法想象的。

最初发表于https://www . espritdecorpus . com/posts/using-data-science-to-explore-your-own-genome/

了解您的数据——使用散点图和预测模型为钻石定价

原文:https://towardsdatascience.com/know-your-data-pricing-diamonds-using-scatterplots-and-predictive-models-6cce92d794c1?source=collection_archive---------11-----------------------

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

我的上一篇文章抨击了人们经常用来分组绘制定量数据的糟糕的可视化,并将饼状图、条形图和点状图放在一起进行两种可视化任务。点状图出现在顶部。我认为这是因为与判断长度、面积、阴影、方向、角度、体积、曲率等相比,人类更擅长在一个共同的尺度上比较位置的认知任务。这一发现归功于克利夫兰和麦吉尔。我喜欢写它,人们似乎也喜欢它,所以我继续我的散点图可视化系列。

散点图

散点图是一个二维平面,我们在其上记录一组案例项目的两个测量值的交集,通常是两个定量变量。正如人类擅长在一个维度上比较普通尺度上的位置一样,我们的视觉能力允许我们在二维空间中看到一系列点时做出快速、准确的判断并识别模式。这使得散点图成为数据分析师在探索数据和向他人传达结果时的宝贵工具。

在这篇文章的第一部分中,我将展示散点图的各种用途,并概述一些策略,以帮助确保关键模式不会被数据中的规模或定性群体差异所掩盖(例如,男女测试分数和收入之间的关系不同)。这篇文章的动机是提出一个钻石价格模型,你可以用它来帮助确保你不会被敲竹杠,这个模型是基于探索性散点图结合(某种程度上)有根据的推测得出的。在第 2 部分中,我将讨论使用面板(也称为小面,也称为小倍数)来揭示数据中的关键模式,以及使用局部回归(黄土)来检查数据中的中心趋势。与我上一篇文章中嘲笑的 3D 柱状图和饼状图相比,这种可视化的糟糕例子要少得多,尽管我仍然能够找到这个可爱的散点图+趋势线

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

散点图和笛卡尔坐标系

散点图比我在上一篇文章中提到的可视化有着更丰富的历史。散点图的表面形成了一个二维笛卡尔坐标系,DeCartes 在 1657 年左右发明/发现了这个同名平面,这代表了科学中最基本的发展之一。笛卡尔平面统一了度量、代数和几何,直观地描述了变量(或函数)之间的关系。在笛卡儿平面之前,数学分为代数和几何,两者的统一使许多新的发展成为可能。当然,这包括现代地图制作——制图学,但是笛卡尔平面也是微积分发展的重要一步,没有它,我们的现代几乎不可能。

散点图是帮助理解变量之间关系的强大工具,尤其是在这种关系是非线性的情况下。比方说,你想知道在购买钻石时,你支付的价格是否合适。您可以使用许多钻石的价格和特征数据来帮助确定任何给定钻石的广告价格是否合理,并且可以使用散点图来帮助确定如何以合理的方式对该数据进行建模。考虑一下钻石价格与其克拉重量(与其大小相对应)之间的重要关系:

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

一些事情马上就浮现出来了。我们可以看到一个非线性关系,我们还可以看到,随着克拉大小的增加,关系的离散度(方差)也增加。通过快速浏览数据散点图,我们了解到价格和克拉大小之间的两个重要函数关系。因此,我们也认识到,对这些数据运行线性模型是一个坏主意。

钻石

如果你曾经使用过 R,你可能会看到 Hadley Wickham 的 ggplot2 附带的 diamonds 数据集的引用。它记录了超过 5 万颗钻石的克拉大小和价格,从 2008 年在收集的http://www.diamondse.info/开始,如果你在市场上寻找一颗钻石,探索这个数据集可以帮助你了解商店里有什么以及价格点。这特别有用,因为每颗钻石都是独一无二的,这与我们习惯购买的大多数制成品不同——你不能只输入型号就在亚马逊上查价格。即使是专家也无法像通过数据获得的整个市场的图片一样包含那么多关于价格的信息(尽管没有什么可以替代定性专业知识来确保你的钻石是零售商声称的那样)。

但是,即使你不打算买钻石,钻石行业的社会经济和政治历史也是迷人的。钻石催生了南非的采矿业,如今南非是非洲最大、最先进的经济体。我在约翰内斯堡工作了一个夏天,我可以向你保证,南非的城市看起来更像洛杉矶和旧金山,而不是拉各斯、开罗、摩加迪沙、内罗毕或拉巴特。钻石首先驱使英国人和荷兰人殖民南部非洲,并引发了从布尔战争到塞拉利昂、利比里亚、科特迪瓦、津巴布韦和刚果民主共和国的现代战争的各种冲突,在 20 世纪 90 年代内战最激烈的时候,200 克拉的千年之星钻石被卖给了德比尔人。在 20 世纪 30 年代的“犹太财产的雅利安化”期间,钻石是犹太人可以向纳粹隐瞒的少数资产之一,国会研究服务中心报告说基地组织利用冲突钻石规避国际制裁,并从 1998 年东非爆炸案到 9 月 11 日袭击为行动融资。

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

虽然钻石数据集充满了价格和相当深奥的认证评级,但隐藏在数据中的是一场传奇营销活动如何渗透并被我们的文化所包容的反映,关于不同社会阶层如何反应的暗示,以及对钻石市场如何运作的洞察。

据《大西洋月刊》报道,故事开始于 1870 年,当时在南非奥兰治河附近发现了数吨钻石。在那之前,钻石很稀有——每年从印度和巴西开采的钻石只有几磅。在当时,钻石在珠宝之外没有用途,就像今天在许多工业应用中一样,所以价格只取决于稀缺的供应。因此,该项目的投资者在 1888 年成立了德比尔斯卡特尔,以控制全球价格——大多数人认为这是历史上最成功的卡特尔,直到 2000 年左右控制了全球 90%的钻石供应。但是第一次世界大战和大萧条见证了钻石销售的暴跌。

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

根据《纽约时报》的报道,1938 年,戴比尔斯卡特尔写信给费城广告公司 N. W .艾耶尔父子公司,调查“利用各种形式的宣传”是否会推动美国的钻石销售,当时美国似乎是唯一有潜力的市场。调查显示,钻石在大多数考虑结婚的夫妇的优先考虑清单中排名靠后——这是富人的奢侈品,“钱都打水漂了”被《纽约时报》比作《广告狂人》的佩吉·奥尔森(Peggy Olson)的弗朗西丝·格雷蒂(Frances Gerety)在 N.W .艾耶尔父子公司接管了德比尔夫妇的账户,并朝着公司的目标“创造一种局面,让几乎每个宣誓结婚的人都感到被迫购买一枚订婚钻戒。”几年后,她创造了一个口号,“钻石永恒”

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

《大西洋月刊》的杰伊·爱泼斯坦认为,这一活动催生了现代需求广告——其目的不是直接销售,也不是强化品牌,而仅仅是为了打动产品本身所包含的魅力、情感和情绪。该公司向电影明星赠送钻石,发出强调名人互赠钻石大小的新闻包,将钻石借给参加奥斯卡颁奖典礼和肯塔基赛马会等重要活动的社交名流,并说服英国王室将钻石佩戴在其他宝石之上。在广告中,钻石还被作为一种地位的象征进行营销,以反映“一个男人…生活中的成功”,并带有“粗花呢、旧皮革和抛光木材的香气,这是一个好俱乐部的特征。”20 世纪 80 年代的一则广告引入了两个月的基准:“两个月的工资难道不是为永恒的东西付出的小小代价吗?"

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

以任何合理的标准来衡量,弗朗西斯·格雷蒂成功了——订婚意味着在美国得到一枚钻戒。你能想到两个人订婚不戴钻戒的电影吗?当你在脸书宣布订婚时,网站会显示什么图标?仍然认为这场营销活动可能不是历史上最成功的大规模说服努力?我给你看一部詹姆斯·邦德的电影,片名带有钻石卡特尔的商标:

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

令人肃然起敬,令人恐惧。让我们打开数据集。

您应该考虑做的第一件事是使用 ggpairs()函数绘制关键变量之间的关系。该函数成对地绘制每个变量与其他变量的关系。对于与钻石数据行数一样多的数据集,您可能希望先进行采样,否则会花费很长时间来渲染。另外,如果你的数据集有超过 10 列,将会有太多的绘图窗口,所以首先是列的子集。

不管怎样,情节是这样的:

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

正在发生的是,ggpairs 以一种非常聪明的方式绘制出每个变量与另一个变量的关系。在图矩阵的下三角中,它对定性-定性对使用分组直方图,对定量-定量对使用散点图。在上面的三角形中,它绘制了定性-定性对的分组直方图(使用 x 变量而不是 y 变量作为分组因子),定性-定量对的箱线图,并提供了定量-定量对的相关性。我们真正关心的是价格,所以让我们把重点放在价格上。我们可以看到价格与净度和颜色之间的关系,这一点我们将在以后开始数据建模时记住,但推动价格的关键因素是钻石的大小/重量。然而,正如我们上面看到的,价格和钻石大小之间的关系是非线性的。如何解释这种模式?在供应方面,没有明显瑕疵的大块钻石可能比小块钻石更难找到。这可能有助于解释指数曲线——我想我是在为我即将成为妻子的妻子选购钻石时注意到这一点的。当然,这与钻石的重量是体积的函数这一事实有关,而体积是 x * y * z 的函数,这表明我们可能对克拉重量的立方根特别感兴趣。

在需求方面,市场上购买较便宜、较小钻石的顾客可能比更富有的买家对价格更敏感。如果不是因为求婚时赠送钻石的社会规范,许多小于 1 克拉的顾客肯定不会购买钻石。而且,能买得起一克拉以上钻石的消费者越来越少。因此,我们不应该期望大钻石的市场像小钻石那样竞争激烈,所以随着克拉数的增加,价格的变化也会增加。

通常情况下,任何货币变量的分布都是高度偏斜的,并且会随着数量级的变化而变化。这可能是由路径依赖(例如,富人越来越富)和/或产生最终价格/美元金额的乘法过程(例如,逐年通货膨胀)造成的。因此,通过把它放在对数标度上来研究压缩任何这样的变量是一个好主意(更多信息请看 Tal Galili 博客上的这篇客座博文)。

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

事实上,我们可以看到钻石的价格严重倾斜,但当放在 log10 尺度上时,似乎表现得更好(即,更接近正态分布的钟形曲线)。事实上,我们可以看到,数据显示了 log10 规模上的双峰的一些证据,这与我们关于钻石客户性质的两级“富人买家,穷人买家”推测一致。让我们重新绘制我们的数据,但现在让我们把价格放在 log10 标度上:

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

更好,虽然还是有点古怪——让我们试着使用我们上面推测的克拉的立方根:

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

很好,在应用了上面的变换以在一个很好的尺度上得到我们的变量之后,看起来像一个几乎线性的关系。

过度绘画

请注意,到目前为止,我还没有做任何关于过度绘制的事情——由于舍入的原因,多个点具有相同的值。事实上,价格四舍五入到美元,克拉四舍五入到两位数。不错,尽管当我们得到这么多数据时,我们会有一些严重的过度渲染。

通常,您可以通过使点变小,使用“抖动”随机移动点以使多个点可见,以及使用透明度来处理这一问题,这可以在 ggplot 中使用“alpha”参数来完成。

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

这让我们更好地了解关键位置的数据有多密集和稀疏。

利用颜色了解定性因素

当我环顾钻石时,我也注意到净度似乎是价格的一个因素。当然,许多消费者都在寻找一定大小的钻石,所以我们不应该期望净度像克拉重量一样是一个重要因素。我必须承认,即使我的祖父母是珠宝商,我最初也很难区分 VVS1 级和 SI2 级钻石。当然,大多数人需要一个环来区分。此外,根据 BlueNile 的说法,钻石的切割对珠宝商描述为钻石典型特征的“火热”品质有着更重要的影响。关于净度,该网站称,“许多这些瑕疵都是微小的,不会以任何可察觉的方式影响钻石的美丽”然而,当我们将价格可视化为图上的一种颜色时,清晰度似乎可以解释价格中剩余的大量差异:

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

不管 BlueNile 怎么说,我们在切割上没有看到太多的变化(尽管这个数据集中的大多数钻石都是理想的切割):

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

颜色似乎也解释了价格的一些差异,尽管 BlueNile 声称 D-J 的所有颜色等级基本上都不明显

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

在这一点上,我们已经有了一个很好的想法,我们可能如何建模价格。但是,我们 2008 年的数据存在一些问题——我们不仅需要考虑通货膨胀,而且现在的钻石市场与 2008 年相比也有很大不同。事实上,当我用模型拟合这些数据,然后试图预测我在市场上发现的钻石的价格时,我一直得到的预测都太低了。经过进一步挖掘,我找到了全球钻石报告。事实证明,由于全球金融危机,价格在 2008 年暴跌,自那以后,价格(至少是批发抛光钻石的价格)以大约 6%的复合年增长率增长。中国购买订婚钻戒的夫妇数量迅速增长也可能有助于解释这一增长。在查看了 PriceScope 上的数据后,我意识到不同克拉尺寸的钻石价格增长不均衡,这意味着我最初估计的模型不能简单地通过通货膨胀来调整。虽然我可以用那个模型做得很好,但我真的想根据新的数据来评估一个新的模型。

谢天谢地,我能够没有太多麻烦地拼凑出一个 python 脚本来抓取 diamondse.info 。该数据集的规模约为 2008 年钻石数据集的 10 倍,包含了除美国宝石学院(GIA)之外的一系列权威机构认证的世界各地的钻石。您可以按如下方式读入这些数据(预先警告—超过 50 万行):

我的 github 储存库有复制上面的每一个数字所必需的代码——大多数看起来非常相似,尽管这个数据集包含比原始数据集更昂贵的钻石。无论您使用的是原始的 diamonds 数据集还是当前更大的 diamonds 数据集,您都可以根据我们从散点图中获得的信息来估计模型。我们将回归克拉,克拉的立方根,净度,切割和对数价格的颜色。我在这个模型中只使用 GIA 认证的钻石,并且只看低于$10K 的钻石,因为这些是我见过的大多数零售商出售的钻石类型,因此也是我最关心的类型。通过从数据集中剔除最昂贵的钻石,我们的模型也不太可能被价格和克拉高端的异常值抛弃。新数据集的列与旧数据集的列基本相同,因此我们可以运行下面的代码(如果您想在旧数据集上运行它,只需设置 data=diamonds)。

以下是我搜集的数据集的结果:

这些是非常好的 R 平方值,我们几乎解释了 4c 的所有价格差异。如果我们想知道一颗钻石的价格是否合理,我们现在可以使用这个模型并对结果求幂(因为我们取了价格的对数)。我们需要将结果乘以 exp(sigma /2),因为我们的误差在预期中不再为零:

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

为了更深入地了解最后一步,请看一下关于对数正态分布变量的维基百科页面。感谢米盖尔捕捉到这个。让我们看一个蓝色尼罗河的例子。我就用全型号,m4。

给定我们的钻石的特征和 95%置信区间的上限和下限,结果产生价格的期望值—请注意,因为这是一个线性模型,所以 predict()只是将每个模型系数乘以我们数据中的每个值。结果是这颗钻石比完整模型下的预期值稍微贵了一点,尽管它并没有超出我们 95%的置信区间。大多数人认为 BlueNile 比 diamondse.info 有更好的声誉,然而,在一个依赖于容易伪造的证书并且非专家很容易被愚弄的行业中,声誉是很有价值的。

这说明了将模型从一个数据集推广到另一个数据集的重要一点。首先,数据集之间可能存在重要的差异——正如我在上面所推测的那样——这使得估计值存在系统性偏差。第二,过度拟合——我们的模型可能会拟合数据集中存在的噪声。即使是针对样本外预测进行交叉验证的模型也可能会过度拟合噪声,从而导致数据集之间的差异。当然,虽然这个模型可能会让你感觉到你的钻石是否是对 diamondse.info 钻石的敲竹杠,但并不清楚 diamondse.info 是否应该被视为钻石价格是否合理的普遍真理的来源。尽管如此,在 diamondse.info 上有一个 95%区间的预期价格比我们在开始这个练习之前应该愿意为一颗钻石支付的价格要多得多。

重要的一点是——尽管我们可以根据 4c 的函数几乎完美地预测 diamondse.info 的价格,但你不应该从这个练习中得出一个结论,那就是在哪里购买钻石是不相关的,这显然是过去某些圈子里的传统智慧。如果你在蒂芙尼和好市多购买同样的钻石,你几乎肯定会多付钱。但是好市多也出售一些昂贵的钻石。不管怎样,你可以用这种模型来给你一个指示,看看你是否支付过高。

当然,天然钻石的价值很大程度上是由社会建构的。像金钱一样,钻石只是因为社会认为它们有价值才值钱——投资钻石没有明显的经济效益或回报,除非是在非常主观的意义上,涉及到你和你的另一半的关系。为了了解社会创造了多少价值,你可以比较天然钻石和人造钻石的价格,由于最近的技术发展,人造钻石的质量与“天然”钻石相当。当然,天然钻石的价格要高得多。

最后一件事——生活中很少有保证,我在这里也不能保证。尽管我们在这里所拥有的看起来相当不错,但是数据和模型从来都不是绝对可靠的,显然你仍然可以基于这个模型被采纳(或者被说服传递大量信息)。始终与一个有信誉的经销商购物,并确保她的动机是反对卖给你一个过高的钻石或更糟的是,不符合其证书。没有什么可以替代与一个你可以信任的知名珠宝商建立个人联系和持久的业务关系。

绘制数据有助于您理解数据并获得关键见解。但是如果你不小心的话,即使散点图可视化也可能是欺骗性的。考虑 alr3 软件包附带的另一个数据集——肯尼斯·g·哈伯德(Kenneth G. Hubbard)从 1976 年到 1992 年收集的内布拉斯加州米切尔的土壤温度数据,我在 Weisberg,S. (2005)偶然发现了这些数据。应用线性回归,第三版。纽约:威利(我无耻地窃取了这个例子)。让我们天真地绘制数据:

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

看起来有点像噪音。这里有什么故事?当其他方法都失败时,想想它。X 轴上是什么?月份。Y 轴上是什么?温度。嗯,内布拉斯加州有四季,所以温度应该每 12 个月波动一次。

但是我们把 200 多个月放在一个非常狭小的空间里。

让我们把它拉长,看看它是什么样子:

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

不要犯那个错误。

这就结束了散点图系列的第一部分。第二部分将说明使用分面/面板/小倍数的优势,并展示拟合趋势线的工具(包括线性回归和局部回归(黄土))如何有助于获得关于数据的更多见解。

你还可以通过我的同事迪安·埃克莱斯、莫伊拉·伯克和克里斯·萨登教授的 Udacity 课程了解更多关于探索性数据分析的知识,该课程将在未来几周内推出。–>

最初发布于https://solomonmg . github . io/blog/2018/visualization-series-scatter plot-understand-the-diamond-market/

了解你的敌人

原文:https://towardsdatascience.com/know-your-enemy-7f7c5038bdf3?source=collection_archive---------7-----------------------

你如何创造和抵御对抗性攻击

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

机器学习的当前驱动力是产生越来越精确的模型,而对这些模型的安全性和鲁棒性关注较少。正如我在上一篇文章中提到的,像图像分类器这样的 ML 模型很容易受到输入的微小干扰,从而导致它们做出错误的决定。这篇文章的目的是通过 MNIST 数字分类器的例子告诉你如何创建和防御强大的白盒对抗性攻击。内容:

  1. 计划的梯度下降(PGD)攻击
  2. 对抗性训练产生稳健的模型
  3. 对抗性稳健模型的意想不到的好处(如下)

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

Class interpolation with high epsilon adversarial examples. This isn’t from a VAE or GAN — it’s from an MNIST classifier trained against the projected gradient descent attack.

查看 这款 Jupyter 笔记本 包含了生成本帖中所有数字并训练你自己的对抗性健壮模型的代码。

投影梯度下降(PGD)

PGD 攻击是一种白盒攻击,这意味着攻击者可以访问模型梯度,即攻击者拥有模型权重的副本。这种威胁模型给予攻击者比黑盒攻击更大的权力,因为他们可以专门设计他们的攻击来愚弄您的模型,而不必依赖于通常导致人类可见的干扰的转移攻击。PGD 可以被认为是最“完整”的白盒对手,因为它解除了攻击者在寻找最佳攻击时可以投入的时间和精力的任何限制。

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

Left: natural image. Middle: Adversarial perturbation found by PGD attack against ResNet50 model, size of perturbation is magnified x100 to be more visible. Right: adversarial example.

理解 PGD 攻击的关键是将寻找一个对立的例子框定为一个约束优化问题。 PGD 试图找到使特定输入的模型损失最大化的扰动,同时保持扰动的大小小于指定量,称为ε。这种约束通常表示为扰动的 L 或 L∞ 范数,添加这种约束是为了使对立示例的内容与未受扰动的样本相同,或者甚至是为了使对立示例与人类察觉不到的不同。

PGD 在现实世界中可能遭受的攻击有:

  • 修改恶意软件的代码,以绕过基于ML的检测
  • 扰乱图像以绕过 Tumblr 的色情禁令
  • 欺骗 ML 交易策略让他们放弃所有的钱

PGD 算法可以总结为以下 5 个步骤,尽管攻击者可以自由应用任何优化改进,如动量亚当、多次重启等

  1. 从样品周围 L^p 球的随机扰动开始
  2. 在损失最大的方向采取梯度步骤
  3. 必要时将扰动投射回 L^p 球
  4. 重复 2–3 直到收敛

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

Projected gradient descent with restart. 2nd run finds a high loss adversarial example within the L² ball. Sample is in a region of low loss.

“投射到 L^P 球”可能是一个陌生的术语,但简单地说就是将某个体积外的点移动到该体积内最近的点。在 2D 的 L 范数的情况下,这是将一个点移动到以原点为中心的特定半径的圆上相应的最近点。

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

Projecting a point back into the L² ball in 2 dimensions

对于那些有实践思维的人来说,下面的 PyTorch 函数是 PGD 的一个实现,用于为一批图像生成有针对性的或无针对性的对立示例。

对来自 MNIST 的样本运行这段代码会产生以下结果。请记住,由于其较低的维度/分辨率,MNIST 的对立示例比 ImageNet 等数据集更明显——然而,一个不健壮的分类器会被这些图像完全愚弄。

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

Left column: natural examples. Middle column L² bounded adversarial examples. Right column: L∞ bounded adversarial examples.

然而,我们是数据科学家,可以做得比有趣的图片更好。下面的图表量化了非稳健分类器对不同大小的对抗性扰动ε的准确性。您可以看到性能很差,因为上面显示的 L 和 L∞有界攻击的大小将我们模型的准确性降低到大约随机猜测的水平。让我们看看我们能做些什么!

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

对抗训练

对抗这种攻击的当前技术状态是对抗训练,这与生成对抗网络(GANs)的训练方案不同,尽管对抗训练的分类器表现出类似 GAN 的特性,我将在后面演示。

对抗性训练只是将 PGD 攻击放入你的训练循环中。这可以被视为“终极数据扩充”,而不是执行随机变换(重新缩放、裁剪、镜像等)。)作为预处理步骤,我们创建特定于扰动,这种扰动最能愚弄我们的模型,事实上,当在小数据集上训练时,对抗性训练的模型确实表现出较少的过度拟合。

这似乎是一个显而易见的方法,但这种训练方法是否会真正收敛还不清楚。原因如下:在常规训练中,我们最小化数据集 {x,y} 、模型参数θ的预期自然损失。

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

然而,在对抗训练中,我们最小化下面的损失函数,其中δ是一组扰动,我们希望我们的模型对于例如前面讨论的 L 和 L∞扰动是不变的。

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

因此,我们现在正在解决一个保证是非凸的极大极小问题,也就是鞍点问题。这与下面的 GAN 损失函数有相似之处,GAN 损失函数也是一个两人的 minimax 游戏,其中玩家是鉴别者和生成者,而不是对手和网络。

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

然而,在实践中,这种训练确实以增加训练时间为代价收敛(并且比 GAN 训练更一致),因为我们为网络的每个训练步骤解决多步优化问题(即 PGD)。以下代码片段训练 MNIST 模型对抗 L∞对手。

下面的图量化了针对 L 和 L∞对手训练的模型的对抗准确性——在鲁棒性方面肯定有所提高。

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

这里有几个有趣的地方需要注意:

  • L∞训练的模型(紫色)对 L(左)和 L∞(右)有界攻击都更鲁棒
  • 两种稳健模型在自然样本(ε= 0)上的精度都低于非稳健模型:L∞模型约为 0.5%,L 模型约为 3%
  • 左攻击看起来效力饱和(左)。这是一个错觉,因为为了节省计算时间,我固定了 PGD 步骤的数量。允许 PGD 攻击运行直到收敛,仍然可能增加ε的有效性

我解释 L 训练模型的不良稳健和非稳健性能的假设是 L 有界扰动在 MNIST 上是语义相关的。如果你看一下之前定义的对抗性损失,我们正在训练我们的模型,使其对集合δ中的扰动不变,即 L 扰动。如果这些是语义相关的对 MNIST 的干扰,那么 L 对抗性训练正在积极地阻碍我们模型的学习能力!(另一个假设是,我需要为 L 训练搜索更多的超参数……)

健壮模型的意想不到的好处

MNIST 分类器的对抗性训练有一些意想不到的好处,不仅仅是对攻击的鲁棒性。其中最有趣的是使用大ε对立示例在类之间平滑插值的能力。这些是使用前面描述的 PGD 方法产生的,除了我们允许对抗性扰动的大小比训练中使用的大得多。

下面显示的是在 L 训练模型上使用 PGD 攻击创建的有针对性的大ε对抗示例。有一些伪像,但是最终的结果是非常清楚的期望类的图像。这是可能的,因为输入空间中的鲁棒模型的梯度与人类感知很好地对齐,所以用 PGD 跟踪该梯度产生了似是而非的图像。

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

Leftmost: original sample. Rightmost: targeted (3, 5, 9) adversarial examples with epsilon = 7.5

对非健壮模型做同样的事情会产生垃圾图像,这些图像与所需的类只有一点相似之处。

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

Gross.

有趣的是,对 L 鲁棒模型的无目标对抗性攻击产生了从最相似到最不相似的类的轨迹。下面显示的是当我们将对立扰动的 L 范数从 0 增加到 10 时的对立例子和预测概率。

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

Progression of untargeted attack on L2 model

这种现象不仅仅是 MNIST 独有的,因为 Madry 等人能够在 ImageNet 训练的模型上产生相同类型的插值。

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

Figure 4 from https://arxiv.org/pdf/1805.12152.pdf showing interpolation from turtle -> bird and cat -> dog.

L∞不会产生像 L 模型一样有趣的插值(如果你想产生一些,请查看我的 Juypter 笔记本),但它确实有自己意想不到的好处——即非常稀疏的权重。

稀疏权重本身被认为是有用的,因为它们更易于解释,更易于修剪,因此模型规模更小。对 L∞模型第一层中的 32 个卷积滤波器的人工检查显示了一些有趣的特征。

  • 大多数滤波器是零(即权重是稀疏的)
  • 非零过滤器仅包含 1 个非零权重

由于非零滤波器只有一个权重,因此它们只是原始图像的缩放。将重新缩放与 ReLu 激活相结合意味着这些是阈值滤波器,即 ReLu( ax-b ),对于任何小于 b 的扰动,其激活将保持不变。输入数据的阈值化/二进制化是一种众所周知的对抗性防御,因为它破坏了小扰动——对抗性训练已经使模型独立地学习了这一点!

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

随着深度学习获得更广泛的采用,我们必须保持谨慎不要将人工智能模型拟人化,因为我们已经看到它们可能会以不同于人类的方式灾难性地失败。然而,一些恒星研究正在进行,以防止这种类型的攻击,并在某些情况下证明 对特定扰动的鲁棒性,所以也许真正鲁棒的深度网络可能就在眼前。

感谢阅读。请随意阅读我的 上一篇文章 其中强调了一些关于对抗性例子的令人惊讶的结果,或者查看一下 这个 Jupyter 笔记本 其中包含了生成这篇文章中所有数字的代码,并训练您自己的对抗性健壮模型。

参考

稳健性可能与准确性不一致—齐普拉斯等人 2018 年

走向抗对抗性攻击的深度学习模型 — Madry 等 2017

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值