TowardsDataScience 博客中文翻译 2019(二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

关于网络抓取的 10 个误区

原文:https://towardsdatascience.com/10-myths-about-web-scraping-34824beb5dba?source=collection_archive---------20-----------------------

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

Photo by Amel Majanovic on Unsplash

许多人对网络抓取有错误的印象。这是因为有人不尊重互联网上的伟大作品,并通过窃取内容来使用它。网络抓取本身并不违法,但是当人们在没有网站所有者的许可和无视 ToS(服务条款)的情况下使用它时,问题就来了。根据该报告,有 2%的在线收入可能会由于通过网络抓取误用内容而损失。尽管网络抓取没有明确的法律和条款来解决其应用,但它包含在法律法规中。例如:

2。网页抓取和网页抓取是一样的

网络抓取涉及对目标网页的特定数据提取,例如,提取关于销售线索、房地产列表和产品定价的数据。相比之下,网络爬行是搜索引擎做的事情。它扫描和索引整个网站及其内部链接。“爬虫”在没有特定目标的情况下浏览网页。

3。可以刮任何网站

经常有人要求搜集电子邮件地址、脸书帖子和 LinkedIn 信息。根据一篇题为“网络抓取合法吗?”在进行网页抓取之前,请务必注意以下规则:

  • 需要用户名和密码的私人数据不能废弃。
  • 遵守明确禁止网页抓取行为的 TOS(服务条款)。
  • 不要复制受版权保护的数据。

一个人可以根据几项法律被起诉。例如,一个人收集了一些机密信息,并将其出售给第三方,而无视网站所有者发出的终止信。此人可能会受到侵犯动产、违反数字千年版权法(DMCA)、违反计算机欺诈和滥用法(CFAA)和盗用等法律的起诉。

这并不意味着你可以利用 Twitter、脸书、Instagram 和 YouTube 等社交媒体渠道。它们对遵循 robots.txt 文件规定的抓取服务很友好。对于脸书,在进行自动数据收集行为之前,您需要获得其书面许可

4。你需要知道如何编码

网络抓取工具(数据提取工具)对于非技术专业人士非常有用,如营销人员、统计人员、金融顾问、比特币投资者、研究人员、记者等。Octoparse 推出了同类功能之一——网络抓取模板,这是一种预格式化的抓取工具,涵盖 30 多个网站的 14 个类别,包括脸书、推特、亚马逊、易贝、Instagram 等。您只需在参数处输入关键字/URL,无需任何复杂的任务配置。使用 Python 进行 Web 抓取非常耗时。另一方面,网页抓取模板可以高效方便地抓取你需要的数据。

5。您可以将抓取的数据用于任何事情

如果你从网站上收集数据并用于公共消费分析,这是完全合法的。但是,如果你为了利益而抓取机密信息,这是不合法的。例如,未经许可收集私人联系信息,并将其出售给第三方以获取利润是非法的。此外,不贡献源代码就把抓取的内容重新打包成你自己的也是不道德的。你应该遵循没有垃圾邮件,没有抄袭,或根据法律禁止任何欺诈性使用数据的想法。

6。刮网器是多功能的

如果你有过偶尔改变布局或结构的特殊网站的经历。如果你遇到这样的网站,而你的刮刀第二次没有阅读,不要沮丧。原因有很多。这并不一定是因为你是一个可疑的机器人。这也可能是由不同的地理位置或机器访问造成的。在这种情况下,在我们设置调整之前,web scraper 无法解析网站是正常的。

7。可以很快的速度刮

你可能已经看过 scraper 的广告,说他们的爬行器有多快。这听起来不错,因为他们告诉你他们可以在几秒钟内收集数据。然而,如果造成损害,你是将被起诉的违法者。这是因为快速的可伸缩数据请求将使 web 服务器过载,这可能导致服务器崩溃。在这种情况下,根据“侵犯动产”法(Dryer and Stockton 2013),该人应对损害负责。如果你不确定网站是否可刮,请询问网络刮除服务提供商。Octoparse 是一家负责任的网络抓取服务提供商,将客户的满意度放在首位。对于 Octoparse 来说,帮助我们的客户解决问题并取得成功是至关重要的。

8。API 和网页抓取相同

API 就像一个通道,将您的数据请求发送到 web 服务器并获取所需的数据。API 将通过 HTTP 协议返回 JSON 格式的数据。比如脸书 API,Twitter API,Instagram API。然而,这并不意味着你可以得到你所要求的任何数据。网络抓取可以可视化这个过程,因为它允许你与网站互动。Octoparse 有网页抓取模板。对于非技术专业人员来说,通过用关键字/URL 填充参数来提取数据就更加方便了。

9。刮出的数据只有经过清理和分析后才能为我们的业务服务

许多数据集成平台可以帮助可视化和分析数据。相比之下,数据搜集看起来对商业决策没有直接影响。网络抓取确实提取了网页的原始数据,这些数据需要被处理,以获得像情感分析这样的见解。然而,有原始数据在金矿工人手中可能是极其宝贵的。

用 Octoparse Google 搜索网页抓取模板搜索一个有机的搜索结果。你可以提取信息,包括你的竞争对手的标题和元描述,以确定你的搜索引擎优化策略;对于零售行业,网络抓取可用于监控产品定价和分销。例如,亚马逊可能会在“电子”目录下抓取 Flipkart 和 Walmart,以评估电子商品的性能。

10。网页抓取只能在业务中使用

网页抓取广泛应用于各个领域。除了销售线索生成,价格监控,价格跟踪,市场分析业务。学生们也可以利用谷歌学者网络抓取模板进行论文研究。房地产经纪人能够进行住房研究并预测住房市场。你将能够找到 Youtube 有影响力的人或 Twitter 的传播者,以推广你的品牌或你自己的新闻聚合,通过抓取新闻媒体和 RSS 源,涵盖你想要的唯一主题。

来源:

干燥器,A.J .和斯托克顿,J. 2013。“互联网‘数据搜集’:咨询客户入门”,《纽约法律期刊》。从 https://www.law.com/newyorklawjournal/almID/1202610687621取回

原载于 2019 年 7 月 30 日【https://www.octoparse.com】

我从 fast.ai v3 中学到的 10 件新事情

原文:https://towardsdatascience.com/10-new-things-i-learnt-from-fast-ai-v3-4d79c1f07e33?source=collection_archive---------3-----------------------

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

参加课程 3 周后的学习要点

2022 年 1 月 12 日—修正错别字并提高清晰度

E 每个人都在谈论 fast.ai 大规模开放在线课程(MOOC),所以我决定试一试他们 2019 年的深度学习课程程序员实用深度学习,v3

我一直知道一些深度学习的概念/想法(我在这个领域已经有一年左右了,主要是处理计算机视觉),但从来没有真正理解过一些直觉或解释。课程导师杰瑞米·霍华德瑞秋·托马斯和西尔万·古格(在推特上关注他们!)都是深度学习领域有影响力的人(Jeremy 有很多 Kaggle 比赛的经验),所以我希望从他们那里获得直觉,新的见解,以及一些模型训练的技巧和诀窍。我有很多东西要向这些人学习。

所以我在看了 3 周视频后(我没有做任何练习🤫🤫🤫🤫)写这篇文章是为了把我学到的新东西与你分享。当然,有些事情我一无所知,所以我对它们做了一些研究,并在这篇文章中提出了它们。最后,我还写了我对这门课程的感受(剧透:我喜欢❣️).

免责声明 : 不同的人聚集不同的学习点,看你的深度学习背景。这篇文章不推荐给深度学习的初学者,也不是课程内容的总结。相反,这篇文章假设你有神经网络、梯度下降、损失函数、正则化技术和生成嵌入的基础知识。有以下方面的经验也很好:图像分类、文本分类、语义分割和生成对抗网络。

我组织了我的 10 个学习点的内容:从神经网络理论到架构,到与损失函数相关的事情(学习率、优化器),到模型训练(和正则化),到深度学习任务,最后是模型可解释性。

内容:我学到的 10 件新事情

  1. 普适逼近定理
  2. 神经网络:设计&架构
  3. 了解亏损情况
  4. 梯度下降优化器
  5. 损失函数
  6. 培训
  7. 规范化
  8. 任务
  9. 模型可解释性
  10. 附录:关于模型复杂性的杰瑞米·霍华德&规范化

0.Fast.ai &迁移学习

“如果可以的话,使用迁移学习(来训练你的模型)总是好的。”—杰瑞米·霍华德

Fast.ai 是转移学习和在短时间内取得巨大成果的同义词。这门课程名副其实。迁移学习和实验主义是杰瑞米·霍华德强调要成为高效机器学习实践者的两个基本理念。

1.通用逼近定理

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

Photo by Vincentiu Solomon on Unsplash

通用逼近定理说你可以在前向神经网络中仅用一个隐藏层来逼近任何函数。由此得出结论,你也可以对任何更深层次的神经网络实现同样的近似。

我是说,哇!我现在才知道这件事。这个就是深度学习的根本。如果你有一堆仿射函数(或矩阵乘法)和非线性函数,你最终得到的东西可以任意接近任何函数。这就是仿射函数和非线性的不同组合竞赛背后的原因。这是架构越来越深入的原因。

2.神经网络:设计与架构

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

本节将重点介绍课程中引人注目的架构,以及融入最先进(SOTA)模型(如 dropout)的具体设计。

  • 相当于 SOTA;因此,您通常会使用它来完成许多与图像相关的任务,如图像分类和对象检测。这种架构在本课程的 Jupyter 笔记本中被大量使用。
  • 对于图像分割任务来说,U-net 是非常先进的。
  • 对于卷积神经网络(CNN ),步长=2 的卷积是前几层的标准
  • DenseNet 使用串联作为构建块中的最终操作,而 ResNet 使用加法操作。
  • 随意退出
    ,我们扔掉激活。直觉:因此没有激活可以记忆输入的任何部分。这将有助于过度拟合,其中模型的某些部分学习识别特定的图像,而不是特定的特征或项目。还有**嵌入丢失、**但这只是简单地提到了一下。
  • 批量规格化(BatchNorm)
    BatchNorm 做两件事:(1)规格化激活和(2)为每个规格化激活引入缩放和移动参数。但是,事实证明(1)没有(2)重要。在论文中,批处理规范化如何帮助优化?,提到“[BatchNorm]重新参数化潜在的优化问题,使其景观显著平滑[er]。”直觉是这样的:因为现在不那么颠簸了,我们可以使用更高的学习率,因此收敛更快(见图 3.1)。

3.了解损失情况

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

Fig 3.1: Loss landscapes; the left landscape has many bumps, and the right is smooth. Source: https://arxiv.org/abs/1712.09913

损失函数通常有凹凸不平和平坦的区域(如果你在 2D 或 3D 图中可视化它们)。请看图 3.2。如果你最终处于一个崎岖不平的区域,这个解决方案可能不太适用。这是因为你在一个地方找到了很好的解决方案,但在另一个地方却不是很好。但是如果你在一个平坦的区域找到了一个解决方案,你可能会概括得很好。那是因为你找到了一个解决方案,它不仅适用于某一点,也适用于整个问题。

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

Fig. 3.2: Loss landscape visualised in a 2D diagram. Screenshot from course.fast.ai

上面的大部分段落都引自杰瑞米·霍华德。如此美丽而直白的解释。

4.梯度下降优化器

我学到的新东西是 RMSprop 优化器充当了一个“加速器”。直觉:如果你的梯度在过去的几步中一直很小,你现在需要走快一点。

(关于梯度下降优化器的概述,我写了一篇名为 10 梯度下降优化算法的文章。)

5。损失函数

学习了两个新的损失函数:

  1. 像素均方误差(像素 MSE )。这可以用在语义分割中,语义分割是课程内容之一,但不在本文中讨论。
  2. 特征丢失🤗。这可以用于图像恢复任务。请参见任务:图像生成。

6。培训

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

Photo by Victor Freitas from Pexels

本节研究了针对的调整组合

  • 重量初始化
  • 超参数设置
  • 模型拟合/微调
  • 其他改进

转移学习
模型权重既可以(I)随机初始化,也可以(ii)在称为转移学习的过程中从预先训练的模型转移。迁移学习利用预先训练的权重。预训练的重量
有有用的信息
。**

适用于迁移学习的常见模型是这样工作的:训练更接近输出的权重,并冻结其他层。

对于迁移学习来说,使用与预训练模型应用的相同的统计数据是至关重要的,例如,使用特定偏差校正图像 RGB 值。****

❤️1 周期政策❤️ 这确实是我在这个课程中学到的最好的东西。我很抱歉一直认为学习率是理所当然的。找到一个好的学习率是至关重要的,因为我们至少可以为我们的梯度下降提供一个学习率的有根据的猜测,而不是一些可能是次优的直觉值。

杰瑞米·霍华德一直在他的代码中使用lr_finder()fit_one_cycle()——这让我很困扰,它工作得很好,我不知道为什么它会工作。于是我看了莱斯利·史密斯的论文和西尔万·古格的博文(推荐阅读!),这就是1 周期的工作方式:

1.执行 LR 范围测试:以从小数值(10e-8)到大数值(1 或 10)的(线性)递增学习率训练模型。绘制一个损失与学习率的关系图,如下所示。

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

Fig 6.1: Loss vs learning rate. Source: https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html

2.选择最小和最大学习率。要选择最大学习率,请查看图表,选择一个足够高的学习率,并给出较低的损失值(不要太高,也不要太低)。这里你会选择 10e-2。选择最小值可以低十倍左右。这里应该是 10e-3。有关确定这些值的更多信息,请参见博客文章。

3.通过周期学习率的周期数拟合模型。一个周期是你的训练经历从最小到最大,然后回到最小的学习率。

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

Source: https://sgugger.github.io/the-1cycle-policy.html

那么,我们为什么要这样做呢?整个想法如下。在亏损的情况下,我们想跳过它的突起(因为我们不想被困在某个沟里)。所以,在开始时增加学习率有助于模型跳出那个沟,探索函数曲面,并试图找到损失低且区域不均匀的区域(因为如果是,它又会被踢出去)。这使我们能够更快地训练模型。我们也倾向于以更一般化的解决方案结束。

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

Fig. 6.2: Screenshot from course.fast.ai

预训练模型的判别学习率 用超低学习率训练前面的层,用较高的学习率训练最后的层。这个想法是不要剧烈改变几乎完美的预训练权重,除了极少量的,并且更积极地教导输出附近的层。在 ULMFiT 中引入了判别学习率。

一个幻数除数

在 1 周期拟合中,为获得最小学习率,用 2.6⁴.除以最大值这个数字适用于 NLP 任务。更多信息见 https://course.fast.ai/videos/?lesson=4 33:30。

用于超参数搜索的随机森林 提到了随机森林可用于搜索超参数。

使用默认值 使用库或实现论文的代码时,使用默认的超参数值和“不要逞英雄”。

预训练模型的模型微调

我注意到了杰里米的风格:训练最后几层,解冻所有层,训练所有重量。然而,这一步是实验性的,因为它可能会也可能不会提高准确性。如果没有,我希望你已经保存了你最后一次训练的重量😅。

渐进式调整大小 这最适用于与图像相关的任务。使用较小版本的图像开始训练。然后,使用更大的版本进行训练。为此,使用迁移学习将训练的权重移植到具有相同架构但接受不同输入大小的模型。天才。

混合精度训练

7。正规化

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

Photo by Rosemary Ketchum from Pexels

使用幻数 0.1** 进行重量衰减。如果你使用太多的权重衰减,你的模型将不会训练得足够好(拟合不足)。如果太少,你会倾向于过量,但没关系,因为你可以提前停止训练。**

8.任务

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

请注意,此处并未提及本课程涵盖的所有任务。

  • 多标签分类
  • 语言建模
  • 表列数据
  • 协同过滤
  • 图象生成

a)多标签分类

我一直想知道你如何执行一个标签数量可变的[n 图像]分类任务,即多标签分类(不要和多类分类/多项式分类混淆,它的同胞是二分类)。

没有详细提到损失函数如何用于多标签分类。但是谷歌了一下,发现标签应该是多热点编码的向量。这意味着每个元素必须应用于最终模型输出中的 sigmoid 函数。损失函数是输出和地面实况的函数,使用二进制交叉熵来计算,以独立地惩罚每个元素。

b)语言建模

对于这个语言建模任务,我喜欢“语言模型”的定义(重新措辞):

语言模型是学习预测句子的下一个单词的模型。为此,你需要了解相当多的英语和世界知识。

这意味着你需要用大量的数据来训练模型。这就是本课程介绍 ULMFiT 的地方,这是一个可以基于预训练(换句话说,迁移学习)重用的模型。

c)表格数据

这是我第一次使用深度学习处理带有分类变量的表格数据!我不知道你可以这样做?无论如何,我们能做的是从分类变量中创建嵌入。如果我没有选这门课,我不会想到这些。稍微搜索了一下,我就找到了 Rachel Thomas 关于表格数据深度学习介绍的帖子。****

那么,如何将(a)连续变量的向量和(b)分类变量的嵌入结合起来呢?课程没有提到这方面的任何东西,但是这篇 StackOverflow 帖子强调了 3 种可能的方法:

  1. 两种型号–一种用于(a),一种用于(b)。让他们合奏。
  2. 一个模型,一个输入。这个输入是(a)和(b)之间的连接。
  3. 一个模型,两个输入。这两个输入是(a)和(b)。您在模型本身中将这两者连接起来。

d)协同过滤

协同过滤是当你的任务是预测一个用户会有多喜欢一个特定的项目(在这个例子中,假设我们使用电影评级)。课程介绍了使用嵌入来解决这个问题。这是我第一次遇到使用深度学习的协同过滤(好像我一开始就对协同过滤很有经验)!

目标是为每个用户和项目创建大小为 n 的嵌入。为此,我们随机初始化每个嵌入向量。然后,对于一部电影的每个用户评级,我们将其与他们各自嵌入的点积进行比较,例如使用 MSE。然后我们执行梯度下降优化。

e)图像生成

以下是我学到的一些东西:

  • 可根据我们的期望生成数据。我只是喜欢这个被创造出来的术语。
  • 生成敌对网络(GANs) 讨厌 气势,所以设置为 0。
  • 看亏损很难知道模型表现如何。人们必须不时亲自看到生成的图像**(尽管对于鉴别器和发生器来说,最后的损耗应该大致相同)。**
  • 提高生成图像质量的一种方法是在我们的损失函数中包含感知损失(在 fast.ai 中也称为特征损失**)。通过从网络中间某处的张量中取值来计算特征损失。**

9。模型可解释性

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

Photo by Maria Teneva on Unsplash

在其中一堂课上,杰瑞米·霍华德展示了一幅图像的激活** 热图用于图像分类任务。该热图显示了“激活”的像素。这种可视化将帮助我们理解图像的哪些特征或部分导致了模型的输出👍🏼。**

10.附录:杰瑞米·霍华德关于模型复杂性和正则化

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

Photo by NEW DATA SERVICES on Unsplash

我转录了课程的这一部分(第五课),因为直觉是如此令人信服❤️.在这里,Jeremy 首先召集了那些认为增加模型复杂性不可取的人,重塑他们的观点,然后将他们带到 L2 规则

哦,我是统计部的,所以他让我措手不及😱。

所以如果你们中的任何一个人不幸被统计学、心理学、计量经济学或任何这类课程的背景所洗脑,你必须放弃你需要更少参数的想法,因为你需要意识到的是你将会适应你需要更少参数的谎言,因为这是一个方便的虚构,真实的事实是你不希望你的函数太复杂。拥有更少的参数是降低复杂性的一种方式。

但是如果你有 1000 个参数,其中 999 个是 1e-9 呢?或者如果有 0 呢?如果是 0,那么它们就不存在。或者如果他们是 1e-9,他们几乎不在那里。

如果很多参数都很小,为什么我不能有很多参数呢?答案是你可以。所以这个东西,计算参数的数量是我们限制复杂性的方式,实际上是非常有限的。这是一部存在很多问题的小说,对吗?所以,如果在你的头脑中,复杂性是通过你有多少参数来评分的,那你就大错特错了。适当评分。

那么我们为什么要在乎呢?为什么我要使用更多的参数?

因为更多的参数意味着更多的非线性,更多的相互作用,更多的弯曲位,对吗?现实生活充满了曲折。现实生活不是这样的[温饱线]。但是我们不希望它们比必要的更弯曲,或者比必要的更互动。

因此,让我们使用大量的参数,然后惩罚复杂性。

好的,惩罚复杂性的一个方法是,就像我之前建议的,让我们总结一下参数的值。因为有些参数是正的,有些是负的,所以这不太适用,对吧?那么如果我们对参数的平方求和。

这确实是个好主意。

让我们实际创建一个模型,在损失函数中,我们将添加参数的平方和。现在有一个问题。也许这个数字太大了,以至于最好的损失是将所有参数设置为 0。这可不好。所以实际上我们想确保这不会发生。因此,我们不仅要将参数的平方和加到模型中,还要乘以我们选择的某个数字。我们在斋戒中选择的数字叫做wd

你可能也想看看我是如何在我的文章L1 和 L2 正则化的直觉中使用梯度下降解释这两种正则化技术的。

结论

我喜欢这门课。以下是一些原因:

  • 他们给出直觉和易于理解的解释。
  • 他们用丰富的资源补充功课。
  • 他们鼓励你将深度学习应用到各自的领域来构建东西。
  • 他们似乎总是与令人兴奋的和新颖的出版物保持同步,然后在适当的时候将它们整合到 fastai 图书馆中。
  • 他们也对深度学习做了很多研究(阅读:ULMFiT)。
  • 他们围绕 fastai 图书馆建立了一个社区;因此你会很快得到支持。
  • 他们的技巧和诀窍对 Kagglers 和精度驱动的建模很有帮助。

我期待着课程的下一部分!

如果你喜欢这篇文章,请给我一两个掌声:)如果你看到任何错误,请突出显示并告诉我。另外,看看我写的关于深度学习的其他文章:

通用

统计深度学习模型中的参数数量

语言

RNN、LSTM 和 GRU 的动画

经办人:图文并茂的注意事项

图文并茂:自我关注

逐行 Word2Vec 实现(由我的朋友 Derek 完成)

计算机视觉

分解平均平均精度(图)(朋友任杰写的)

神经架构搜索

图文并茂:高效的神经架构搜索

优化

随机梯度下降线性回归分步指南

10 种梯度下降优化算法+备忘单

关注我上Twitter@ remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io**

你应该知道的 10 种 Python 文件系统方法

原文:https://towardsdatascience.com/10-python-file-system-methods-you-should-know-799f90ef13c2?source=collection_archive---------6-----------------------

用 os 和 shutil 操作文件和文件夹

您可以编写 Python 程序来与文件系统交互,做一些很酷的事情。如何做到这一点并不总是非常清楚。

本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍 10 个基本的 osshutil 命令,这样您就可以编写脚本来自动化与文件系统的交互。

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

Like a file system

文件系统有点像房子。假设你正在进行大扫除,你需要把笔记本从一个房间搬到另一个房间。

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

Directories are like boxes. They hold things.

这些盒子就像目录。他们拿着东西。在这种情况下,笔记本。

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

笔记本就像文件一样。你可以给他们读和写。你可以把它们放在你的目录箱里。

明白吗?

在本指南中,我们将看看来自 osshutil 模块的方法。 os 模块是用于与操作系统交互的主要 Python 模块。 shutil 模块也包含高级文件操作。出于某种原因,你用 os 创建目录,但是用 shutil 移动和复制它们。去想想。😏

更新:pathlib 讨论于 2019 年 2 月 16 日添加

在 Python 3.4 中, pathlib 模块被添加到标准库中,以改进文件路径的工作,从 3.6 开始,它与标准库的其余部分配合得很好。与我们将在下面讨论的方法相比, pathlib 方法为解析文件路径提供了一些好处——即 pathlib 将路径视为对象而不是字符串。虽然 pathlib 很方便,但是它没有我们将要探索的所有底层功能。此外,在未来几年的代码中,你无疑会看到下面的 osshutil 方法。所以熟悉他们绝对是个好主意。

我打算在以后的文章中讨论 pathlib ,所以跟着我确保你不会错过。现在要了解更多关于 pathlib 模块的信息,请看这篇文章和这篇文章

在我们深入研究之前,还需要知道其他一些事情:

  • 本指南是为 Python 3 设计的。2020 年 1 月 1 日之后将不再支持 Python 2。
  • 您需要将 osshutil 导入到您的文件中才能使用这些命令。
  • 我的示例代码可以在 GitHub 上找到。
  • 用你自己的论点代替下面引号中的论点。

现在我们已经了解了上下文,让我们开始吧!这里列出了你应该知道的 10 个命令。

10 种文件系统方法

下面的列表遵循这种模式:

方法—描述—等效 macOS Shell 命令

获取信息

  • **os.getcwd()** —以字符串形式获取当前工作目录路径— pwd
  • **os.listdir()** —以字符串列表的形式获取当前工作目录的内容— ls
  • **os.walk("starting_directory_path")** —返回当前目录和所有子目录中的目录和文件的名称和路径信息的生成器—没有完全等效的简短 CLI,但ls -R提供子目录名称和子目录中文件的名称

改变事物

  • **os.chdir("/absolute/or/relative/path")** —改变当前工作目录— cd
  • **os.path.join()**—创建路径供以后使用—没有等效的简短 CLI
  • **os.makedirs("dir1/dir2")** —制作目录— mkdir -p
  • **shutil.copy2("source_file_path", "destination_directory_path")** —复制文件或目录— cp
  • **shutil.move("source_file_path*"*, "destination_directory_path")** —移动文件或目录— mv
  • **os.remove("my_file_path")** —删除文件— rm
  • **shutil.rmtree("my_directory_path")** —删除一个目录以及其中的所有文件和目录— rm -rf

大家讨论一下。

获取信息

**os.getcwd()**

os.getcwd()以字符串形式返回当前工作目录。😄

**os.listdir()**

os.listdir()以字符串列表的形式返回当前工作目录的内容。😄

**os.walk("my_start_directory")**

os.walk()创建一个生成器,可以返回当前目录和子目录的信息。它遍历指定起始目录中的目录。

os.walk()为其遍历的每个目录返回以下项目:

  1. 字符串形式的当前目录路径
  2. 字符串列表形式的当前目录中的子目录名称
  3. 字符串列表形式的当前目录中的文件名

它对每个目录都这样做!

使用带有 for 循环的os.walk()来遍历目录及其子目录的内容通常很有用。例如,下面的代码将打印当前工作目录的目录和子目录中的所有文件。

import oscwd = os.getcwd()for dir_path, dir_names, file_names in os.walk(cwd):
    for f in file_names:
        print(f)

这就是我们获取信息的方式,现在让我们看看改变工作目录或移动、复制或删除文件系统的命令。

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

改变事物

**os.chdir("/absolute/or/relative/path")**

此方法将当前工作目录更改为提供的绝对或相对路径。

如果您的代码随后对文件系统进行了其他更改,那么最好处理使用 try-except 方法时引发的任何异常。否则,您可能会删除不想删除的目录或文件。😢

**os.path.join()**

[os.path](https://docs.python.org/3/library/os.path.html#module-os.path)模块有许多常用的路径名操作方法。您可以使用它来查找有关目录名和部分目录名的信息。该模块还有检查文件或目录是否存在的方法。

os.path.join()通过将多个字符串连接成一个漂亮的文件路径,创建一个可以在几乎任何操作系统上工作的路径。😄

以下是来自文档的描述:

智能地连接一个或多个路径组件。返回值是路径和**路径*的任何成员的串联,每个非空部分后面都有一个目录分隔符(*os.sep*),最后一个除外…

基本上,如果您在 Unix 或 macOS 系统上,os.path.join()会在您提供的每个字符串之间添加一个正斜杠(“/”)来创建一个路径。如果操作系统需要一个“\”来代替,那么 join 知道使用反斜杠。

os.path.join()向其他开发者提供了清晰的信息你正在创造一条道路。一定要用它来代替手动的字符串连接,以免看起来像个菜鸟。😉

**os.makedirs("dir1/dir2")**

os.makedirs()制作目录。mkdir()方法也创建目录,但是它不创建中间目录。所以我建议你用os.makedirs()

**shutil.copy2("source_file", "destination")**

在 Python 中有很多复制文件和目录的方法。shutil.copy2()是一个很好的选择,因为它试图尽可能多地保留源文件的元数据。更多讨论见这篇文章

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

Move things

**shutil.move("source_file*"*, "destination")**

使用shutil.move()改变文件的位置。它使用copy2作为引擎盖下的默认。

**os.remove("my_file_path")**

有时你需要删除一个文件。os.remove()是你的工具。

**shutil.rmtree("my_directory_path")**

shutil.rmtree()删除目录以及其中的所有文件和目录。

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

Remove things

小心删除东西的函数!您可能希望使用 print() 打印将要删除的内容。然后在您的 remove 函数中运行 substitute for*print()*当您确定它不会删除错误的文件时。向 Al Sweigart 致敬,他在中提出了用 Python 自动完成枯燥工作的想法。

这是完整的名单。

10 个文件系统方法概述

下面的列表遵循这种模式:方法—描述—等效的 macOS Shell 命令

获取信息

  • **os.getcwd()** —以字符串形式获取当前工作目录路径— pwd
  • **os.listdir()** —以字符串列表的形式获取当前工作目录的内容— ls
  • **os.walk("starting_directory_path")** —返回包含当前目录和所有子目录中的目录和文件的名称和路径信息的生成器—没有完全等效的简短 CLI,但ls -R提供子目录名称和子目录中文件的名称

改变事物

  • **os.chdir("/absolute/or/relative/path")** —改变当前工作目录— cd
  • **os.path.join()**—创建路径供以后使用—没有等效的简短 CLI
  • **os.makedirs("dir1/dir2")** —制作目录— mkdir-p
  • **shutil.copy2("source_file_path", "destination_directory_path")** —复制文件或目录— cp
  • **shutil.move("source_file_path*"*, "destination_directory_path")** —移动文件或目录— mv
  • **os.remove("my_file_path")** —删除文件— rm
  • **shutil.rmtree("my_directory_path")** —删除一个目录以及其中的所有文件和目录— rm -rf

包装

现在您已经看到了在 Python 中与文件系统交互的基础。在您的 IPython 解释器中尝试这些命令以获得快速反馈。然后向其他人解释它们来巩固你的知识。你会比在你的房子里搬动一箱箱笔记本时更少疼痛。🏠但是锻炼会很好,所以现在你可以去健身房了。🏋️‍♀️😉

如果你想学习用 Python 读写文件,请查看 打开函数。记得像这样使用上下文管理器: with open(‘myfile’) as file:。😄

我希望这篇 Python 文件系统操作的介绍对您有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。

我写关于 Python、Docker、数据科学等等的文章。如果你对此感兴趣,请阅读更多此处并关注我的 Medium。

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

感谢阅读!👏

让你的工作更有效率的 10 个技巧

原文:https://towardsdatascience.com/10-python-pandas-tricks-that-make-your-work-more-efficient-2e8e483808ba?source=collection_archive---------0-----------------------

有些命令您可能已经知道,但可能不知道它们可以这样使用

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

Photo from https://unsplash.com/

Pandas 是一个广泛用于结构化数据的 Python 包。有很多很好的教程,但在这里我还是想介绍一些读者以前可能不知道的很酷的技巧,我相信它们是有用的。

阅读 _csv

每个人都知道这个命令。但是您试图读取的数据很大,尝试添加这个参数: nrows = 5 以便在实际加载整个表之前只读取表的一小部分。那么你可以通过选择错误的分隔符来避免这个错误(它可能不总是用逗号分隔)。

(或者,您可以使用 linux 中的’ head '命令检查任何文本文件中的前 5 行: head -n 5 data.txt (感谢 Ilya Levinson 在这里指出了一个拼写错误))

然后,可以通过使用df.columns.tolist()提取所有列来提取列列表,然后添加 usecols = ['c1 ‘,’ c2 ',…]【T10]参数来加载需要的列。此外,如果您知道一些特定列的数据类型,您可以添加参数 dtype = {‘c1’: str,’ c2’: int,…} ,这样它会加载得更快。这个参数的另一个优点是,如果您有一个既包含字符串又包含数字的列,那么将它的类型声明为 string 是一个很好的做法,这样当您试图使用这个列作为键来合并表时就不会出现错误。

select_dtypes

如果数据预处理必须在 Python 中完成,那么这个命令会节省您一些时间。读入表后,每列的默认数据类型可以是 bool、int64、float64、object、category、timedelta64 或 datetime64。您可以首先通过以下方式检查分布

df.dtypes.value_counts()

要了解数据帧的所有可能的数据类型,那么

df.select_dtypes(include=['float64', 'int64'])

选择只有数字特征的子数据帧。

复制

如果您还没有听说过,这是一个重要的命令。如果您执行以下命令:

import pandas as pd
df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]})
df2 = df1
df2['a'] = df2['a'] + 1
df1.head()

你会发现 df1 变了。这是因为 df2 = df1 不是制作 df1 的副本并将其分配给 df2,而是建立一个指向 df1 的指针。所以 df2 的任何变化都会导致 df1 的变化。要解决这个问题,您可以

df2 = df1.copy()

或者

from copy import deepcopy
df2 = deepcopy(df1)

地图

这是一个很酷的命令,可以进行简单的数据转换。首先定义一个字典,其中“键”是旧值,“值”是新值。

level_map = {1: 'high', 2: 'medium', 3: 'low'}
df['c_level'] = df['c'].map(level_map)

举几个例子:真,假到 1,0(用于建模);定义级别;用户定义的词汇编码。

申请还是不申请?

如果我们想创建一个新列,并以其他几列作为输入,apply 函数有时会非常有用。

def rule(x, y):
    if x == 'high' and y > 10:
         return 1
    else:
         return 0df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)
df.head()

在上面的代码中,我们定义了一个具有两个输入变量的函数,并使用 apply 函数将其应用于列“c1”和“c2”。

但是“应用”的问题是它有时太慢了。比方说,如果你想计算两列“c1”和“c2”的最大值,你当然可以这样做

df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)

但是您会发现它比这个命令慢得多:

df['maximum'] = df[['c1','c2']].max(axis =1)

要点:如果你可以用其他内置函数完成同样的工作,就不要使用 apply(它们通常更快)。例如,如果要将列’ c '舍入为整数,请执行 round(df[‘c’],0)df[‘c’]。round(0) 而不是使用应用函数:df.apply(lambda x: round(x['c'], 0), axis = 1)

值计数

这是一个检查值分布的命令。例如,如果您想检查“c”列中每个单独值的可能值和频率,您可以

df['c'].value_counts()

这里有一些有用的技巧/论据:
A. normalize = True :如果你想检查频率而不是计数。dropna = False :如果你也想在统计数据中包含丢失的值。
C. df['c'].value_counts().reset_index():如果您想将统计表转换成熊猫数据帧并对其进行操作
D. df['c'].value_counts().reset_index().sort_values(by='index'):在‘c’列中显示按不同值排序的统计数据,而不是计数。

(更新 2019.4.18 —针对上面的 d,郝洋指出了一个更简单的办法,没有。reset_index(): df['c'].value_counts().sort_index()

缺失值的数量

构建模型时,您可能希望排除缺少太多值的行/缺少所有值的行。你可以用。isnull()和。sum()计算指定列中缺失值的数量。

import pandas as pd
import numpy as npdf = pd.DataFrame({ 'id': [1,2,3], 'c1':[0,0,np.nan], 'c2': [np.nan,1,1]})
df = df[['id', 'c1', 'c2']]
df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1)
df.head()

选择具有特定 id 的行

在 SQL 中,我们可以使用 SELECT * FROM … WHERE ID in ('A001 ‘,’ C022 ',…)来获得具有特定 ID 的记录。如果你想对熊猫做同样的事情,你可以做

df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]

百分位组

您有一个数字列,并且想要将该列中的值分组,比如前 5%归入第 1 组,5–20%归入第 2 组,20%-50%归入第 3 组,后 50%归入第 4 组。当然,你可以用熊猫来做。切,但我想在这里提供另一种选择:

import numpy as np
cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]]
df['group'] = 1
for i in range(3):
    df['group'] = df['group'] + (df['c'] < cut_points[i])
# or <= cut_points[i]

运行速度更快(不使用应用函数)。

to_csv

同样,这是每个人都会使用的命令。这里我想指出两个窍门。第一个是

print(df[:5].to_csv())

您可以使用这个命令准确地打印出将要写入文件的前五行。

另一个技巧是处理混合在一起的整数和缺失值。如果一个列同时包含缺失值和整数,数据类型仍然是 float 而不是 int。导出表格时,可以添加 float_format=‘%.0f’ 将所有浮点数四舍五入为整数。如果您只想要所有列的整数输出,就使用这个技巧——您将去掉所有烦人的“. 0”

让数据分析更快的 10 个 Python 熊猫技巧

原文:https://towardsdatascience.com/10-python-pandas-tricks-to-make-data-analysis-more-enjoyable-cb8f55af8c30?source=collection_archive---------5-----------------------

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

Photo by Vashishtha Jogi on Unsplash

1.式样

在 Jupyter 笔记本上做.head()的时候,你有没有抱怨过表格输出看起来很无聊?有没有办法不显示索引(尤其是已经有 ID 列的时候)?有办法解决这些问题。

A .突出显示数据帧中的所有负值。(示例修改自https://pandas . pydata . org/pandas-docs/stable/user _ guide/style . html)

import pandas as pd
def color_negative_red(val):
    color = 'red' if val < 0 else 'black'
 return 'color: %s' % colordf = pd.DataFrame(dict(col_1=[1.53,-2.5,3.53], 
                       col_2=[-4.1,5.9,0])
                 )
df.style.applymap(color_negative_red)

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

**B .隐藏索引。**试试df.head().style.hide_index()
C .添加悬停效果。(示例修改自https://pandas . pydata . org/pandas-docs/stable/reference/API/pandas . io . formats . style . styler . set _ table _ styles . html)

df = pd.DataFrame(np.random.randn(5, 3))
df.style.set_table_styles(
[{'selector': 'tr:hover',
  'props': [('background-color', 'yellow')]}]
)

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

D .更多 CSS 样式。你可以使用 CSS 来改变表格的外观。

df = pd.DataFrame(
dict(departure=['SFO', 'SFO', 'LAX', 'LAX', 'JFK', 'SFO'],
     arrival=['ORD', 'DFW', 'DFW', 'ATL', 'ATL', 'ORD'],
     airlines=['Delta','JetBlue','Delta',’AA','SouthWest',  
               'Delta']),
columns=['airlines', 'departure','arrival'])df.style.set_table_styles(
[{'selector': 'tr:nth-of-type(odd)',
  'props': [('background', '#eee')]}, 
 {'selector': 'tr:nth-of-type(even)',
  'props': [('background', 'white')]},
 {'selector': 'th',
  'props': [('background', '#606060'), 
            ('color', 'white'),
            ('font-family', 'verdana')]},
 {'selector': 'td',
  'props': [('font-family', 'verdana')]},
]
).hide_index()

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

2.熊猫选项

读者在使用.head(n)检查数据帧时可能会遇到以下问题:
(1)数据帧中的列/行太多,中间的一些列/行被省略。
(2)包含长文本的列被截断。
(3)包含浮动的列显示的数字太多/太少。

人们可以设定

import pandas as pd 
pd.options.display.max_columns = 50  # None -> No Restrictions
pd.options.display.max_rows = 200    # None -> Be careful with this 
pd.options.display.max_colwidth = 100
pd.options.display.precision = 3

来解决这些问题。

3.使用多个聚合进行分组

在 SQL 中,我们可以像这样进行聚合

SELECT A, B, max(A), avg(A), sum(B), min(B), count(*)
FROM table
GROUP BY A, B

在熊猫身上,这可以通过.groupby().agg()来实现:

import pandas as pd
import numpy as np 
df = pd.DataFrame(dict(A=['coke', 'sprite', 'coke', 'sprite',
                          'sprite', 'coke', 'coke'],
                       B=['alpha','gamma', 'alpha', 'beta',
                          'gamma', 'beta', 'beta'],
                       col_1=[1,2,3,4,5,6,7],
                       col_2=[1,6,2,4,7,9,3]))tbl = df.groupby(['A','B']).agg({'col_1': ['max', np.mean],
                                 'col_2': ['sum','min','count']})# 'count' will always be the count for number of rows in each group.

结果会是这样的:

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

行和列都是多索引的。将其更改为没有多索引的数据帧的快速解决方案是

tbl = tbl.reset_index()
tbl.columns = ['A', 'B', 'col_1_max', 'col_2_sum', 'col_2_min', 'count']

如果您想让列重命名过程自动化,您可以执行tbl.columns.get_level_values(0)tbl.columns.get_level_values(1)来提取每个级别中的索引并组合它们。

4.列切片

你们中的一些人可能对此已经很熟悉了,但是我仍然发现它在处理包含大量列的数据帧时非常有用。

df.iloc[:,2:5].head()             # select the 2nd to the 4th column
df.loc[:,'column_x':].head()   
# select all columns starting from 'column_x'

5.向每个组添加行 ID /随机行 ID

要通过 A、B 为每个组添加行 ID /随机行 ID,可以首先将 ID /随机 ID 附加到所有行:

import numpy as np
# df: target dataframe np.random.seed(0)   # set random seed
df['random_ID_all'] = np.random.permutation(df.shape[0])
df['ID_all'] = [i for i in range(1, df.shape[0]+1)]

要为每个组添加一个随机 ID(通过 A、B),可以这样做

df['ID'] = df.groupby(['A', 'B'])['ID_all'].rank(method='first', ascending=True).astype(int)df['random_ID'] = df.groupby(['A', 'B'])['random_ID_all'].rank(method='first', ascending=True).astype(int)

得到

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

6.列出组中所有唯一的值

有时,在执行 group by 后,我们希望将目标列中的值聚合为唯一值的列表,而不是 max、min 等。这是怎么做的。

df = pd.DataFrame(dict(A=['A','A','A','A','A','B','B','B','B'],
                       B=[1,1,1,2,2,1,1,1,2],
                       C=['CA','NY','CA','FL','FL',     
                          'WA','FL','NY','WA']))tbl = df[['A', 'B', 'C']].drop_duplicates()\
                         .groupby(['A','B'])['C']\
                         .apply(list)\
                         .reset_index()# list to string (separated by commas) 
tbl['C'] = tbl.apply(lambda x: (','.join([str(s) for s in x['C']])), axis = 1)

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

如果您想保存结果,不要忘记将分隔符更改为逗号以外的任何内容。

7.将行总计和列总计添加到数字数据框架中

这是另一种常见的数据操作。你需要的只是.apply()

df = pd.DataFrame(dict(A=[2,6,3],
                       B=[2,2,6], 
                       C=[3,2,3]))df['col_total']     = df.apply(lambda x: x.sum(), axis=1)
df.loc['row_total'] = df.apply(lambda x: x.sum())

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

8.检查内存使用情况

.memory_usage(deep=True)可用于 Pandas 数据帧,查看每一列使用的内存量(以字节为单位)。这在构建机器学习模型时很有用,因为在训练中可能需要大量内存。

9.累积和

有时,当您生成一些统计结果时,需要累积和。干脆做df['cumulative_sum'] = df['target_column'].cumsum()

10.交叉表

当您需要统计由 3 个以上特征组成的组的频率时,pd.crosstab()可以让您的工作变得更加轻松。

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

感谢阅读!如果你发现了错误/更好的解决方案,请在下面评论。

10 个问题,你一直想问一个 AI 颠覆者,却一直没有!

原文:https://towardsdatascience.com/10-questions-you-always-wanted-to-ask-an-ai-disruptor-but-never-did-5203a6d31aa4?source=collection_archive---------24-----------------------

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

Prof. Alexiei Dingli Vs Ms Rachel Falzon

Alexiei Dingli 教授在过去的二十年里一直致力于人工智能(AI)的研究。在这个由两部分组成的采访的第一部分,人力资源顾问雷切尔·法尔松女士问他,那些被技术干扰的人可能一直想问什么,但可能从来没有勇气或机会这样做。在本文的第二部分,角色互换了。他就颠覆性技术对人们和工作文化的影响采访了她,同时深入探讨了工作实践如何受到影响。

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

Photo by Adeolu Eletu on Unsplash

  1. 你能用最简单的术语定义人工智能吗?

人工智能是一个寻求创造智能机器的多学科研究领域。人工智能这个术语是由两个词组成的,人工和智能。人工简单的说就是人类创造的东西。智力的定义有点复杂,因为对于它是什么还没有一个普遍的共识。然而,当我们看到智能行为时,我们往往会立即识别出来。正因为如此,我们倾向于用联想来定义智力。事实上,我们认为一台机器是智能的,如果它能完成只有一个智能有机体(如人类)或一群有机体(如蜜蜂)才能完成的功能。总而言之,人工智能是创造出具有智能行为机器的研究领域。

2。AI 有什么好处/能力?

人工智能的好处是多方面的,它的能力影响深远。它可以像协调汽车中的气候控制一样简单,也可以像自动管理核电站一样简单。正因为如此,人工智能被认为是一个水平的研究领域,可以很容易地改变几乎任何其他领域的研究。人工智能的好处包括各种功能的自动化、不同流程的优化以及对未来事件的准确预测,在大多数情况下,这比任何人都要好得多。

3。它能给组织带来什么价值?有什么缺点吗?

人工智能可以给任何组织带来很多附加值。如果组织坐在一堆数据上,人工智能可以轻松处理这些数据,分析这些数据,提取模式并识别问题。在人工流程的情况下,人工智能可以帮助自动化重复的任务,这些任务可能太单调乏味,在某些情况下,对人类的健康有害。人工智能系统在工作中是精确的,它不会感到厌烦,不会感到疲劳,能够预见未来的趋势,并且能够处理比一个人能够管理的多得多的数据。这种系统的缺点首先是财务上的,因为任何人工智能都需要初始资本投资,然而,一旦它启动并运行,它几乎不需要维护。其次,人工智能系统的部署很可能会影响在组织中工作的人。他们中的一些人可能会失业。其他人需要重新掌握技能,以便学习如何在人工智能系统的帮助下执行不同的任务。

4。最近有很多关于人工智能的炒作,但我们知道它已经存在了大约 70 年。你能举一些我们日常生活中实际应用的例子吗?

正如你正确指出的,人工智能是一项非常成熟的技术。今天,我们几乎可以在我们使用的任何设备中找到它。人工智能的唯一问题是,使用人工智能的系统通常不承认这一事实,因此,人们不知道他们在日常生活中使用的所有不同的人工智能系统。让我给你举几个例子。当一个人在谷歌上搜索时,实际上是人工智能在筛选数百万份文件,以便找到你需要的信息。如果有人去脸书,是人工智能决定用户可以看到的帖子。车内的气候控制由人工智能系统管理。根据烹饪内容自动调节烹饪温度的烤箱都由人工智能系统管理。你的电子邮件客户端的垃圾邮件过滤器是由人工智能驱动的。当然,这个清单可以一直列下去。重要的是要记住,人工智能就在我们周围,并且会一直存在。

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

Photo by Jehyun Sung on Unsplash

5。你预测人工智能将在多大程度上取代工作?已经开始发生了吗?

准确地说,人工智能不一定会取代整个工作,但它肯定会接管特定的任务。人工智能已经开始取代这些任务,这将在未来几年继续加速。事实上,根据世界经济论坛,在 5 年内,自动化将占现有任务的 50%以上。我个人认为有四种情况我们应该考虑;

  1. 有些工作像护理工作(护士等)。),创造性的工作(艺术家等)不会受到 AI 的太大影响,因为 AI 仍然不太擅长这些任务。
  2. 一些工作将会被淘汰。这些人包括司机(因为自动驾驶汽车的兴起)、工厂工人(因为自动化)和许多其他人。
  3. 将会创造一些新的就业机会。这些工作甚至不是我们发明的。它可能包括像器官创造者这样的工作,人们将被要求创造新的器官(如新的心脏、肾脏或肝脏)来取代有缺陷的器官。
  4. 大部分工作都会改变。它们将被人工智能技术增强。这将产生巨大的影响。它可能小到帮助超市的堆垛机使用增强现实识别过期产品,大到在手术中协助外科医生。

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

Photo by Ross Findon on Unsplash

6。通常,在一个组织中实施人工智能时,要遵循什么流程?

人工智能转换过程遵循许多明确定义的步骤。首先,重要的是开始教育人们什么是人工智能。教育活动必须从最高层开始,向下到组织层级的所有级别。第二,执行人工智能准备情况审计,以确定组织在采用人工智能方面的状态。一旦完成,与所有利益相关者进行协商,以确定可以实施的潜在人工智能案例研究。然后,根据可行性、投资和潜在回报,与管理层一起订购这些案例研究。一旦项目被分类,然后管理层决定实施哪些项目。它们是在内部实施还是外包,实际上取决于复杂性和组织中可用的专业知识。人工智能专家将在那里管理和监督项目的运行。当一个项目完成后,另一个更雄心勃勃的项目被选择和执行。如此循环下去,直到组织设法用人工智能来增强其流程。

7。实施过程大约需要多长时间?

长短真的要看项目。你必须记住,在这样的项目中有许多变量,例如:什么数据可用、数据质量、可用数据量、使用哪种算法、识别部署这种系统的最佳方法、需要什么培训等。一个初始项目可能需要六个月到三年的时间。然后循环重复。

8。您需要内部人才来实施它吗?需要哪些技能?

这实际上取决于组织的规模。小企业没有内部人才,而且很可能不值得雇佣一些。较大的组织可能有一些人,但他们需要指导。最好的技能是人工智能毕业生。然而,如果这是不可用的,一个人工智能专家监督软件开发人员应该这样做。聘请人工智能专家的主要好处不仅是因为他的专业知识,而且因为人工智能是一个快速发展的领域,他将能够使用最前沿的技术来指导你。这是非常重要的,无论是谁从事理解人工智能和有经验的人工智能系统,因为这些程序不同于正常的软件。主要元素是学习部分,它超出了可用的数据,但它试图概括,以涵盖看不见的例子。然而,许多人不理解这一部分,认为 AI 只是另一个程序。这将是一个巨大的错误和灾难。

9。你认为人工智能将如何影响未来的工作?

将来的工作可能会大不相同。我们所做的大部分事情都将被人工智能所增强。它将在后台帮助我们有效地解决问题。最有可能的是,计算机将变得更加无处不在。大型台式机将会消失,处理器将会集成到日常设备中。尽管信息现在被限制在屏幕上,但在未来,它将在桌子或墙壁等表面上漫游。任务将在服务之间无缝迁移,从而使工作无处不在。数据操作将变得轻而易举,所有东西都将通过物联网(IOT)设备连接在一起。未来是一个互联的未来,由人工智能驱动,但以人为中心。

10。你会给那些还没有开始研究人工智能的 CEO 们什么建议?

马尔科姆·Ⅹ曾经说过,“未来属于今天为它做准备的人”。有些人已经在梦想和设计明天的解决方案。技术已经成熟,我们拥有了处理能力,也终于有了拥抱人工智能革命的政治意愿。它接管只是时间问题。你还在等什么?迈出第一步,了解 AI。如果你有疑问,和人工智能专家聊聊,你可能会惊讶于人工智能能给你的组织带来的巨大节约。

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

Rachel Falzon 女士拥有雷丁大学亨利商学院人力资源专业的 MBA 学位。她曾担任过研究总监、业务发展和沟通经理、人力资源战略顾问,直到最近,她还担任过四大会计师事务所之一的顾问经理。她最近独自拓展业务,成为了员工绩效顾问。她的目的是培养学习型组织,提供核心技能和领导力培训、战略性人力资源/业务合作、变革管理、设计思维研讨会促进,以培养创新和创造性的方式看待人力资源问题和指导,从而增强个人面向未来的组织面对现代挑战和持续的数字破坏的能力。

10 个你一直想问的关于组织如何准备人工智能颠覆的问题,但是从来没有!

原文:https://towardsdatascience.com/10-questions-you-always-wanted-to-ask-those-organisations-disrupted-by-ai-but-never-did-aed0c361d074?source=collection_archive---------37-----------------------

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

Ms Rachel Falzon Vs Prof. Alexiei Dingli

雷切尔·法尔松女士是一名人事绩效顾问。她曾担任研究总监、业务发展和沟通经理、战略人力资源顾问,直到最近,她还担任四大会计师事务所之一的咨询经理。在第二部分,人工智能专家 Alexei Dingli教授从人类的角度询问了她关于数字颠覆的问题。这是第一篇讨论人工智能造成的破坏的文章。

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

Photo by Markus Spiske on Unsplash

  1. 在这个快速变化的世界里,你如何有效地应对变化?

我认为这是一个整体评估的问题,如何以及为什么商业前景发生了如此巨大的变化。我们谈论的是一个 VUCA 世界(不稳定、不确定、复杂和模糊),在这个世界中,人类和机器将越来越多地并肩工作,技术不断被破坏。从现在开始,商业就变得不同寻常了——我们需要永远处于学习、适应和创新的状态。这在很大程度上是在组织的各个层面培养一种成长心态,发展彼得·圣吉所说的“学习型组织”。没有固定思维模式的空间——我们都需要提高技能来应对不断变化的工作场所的需求,职业的概念正在消失。

2。在当今的数字世界,有哪些受追捧的技能?

例如,除了技术设计、编程、编码和数据分析等技术技能之外,核心技能,有时被称为“软”技能,将越来越受欢迎。这些人类的、更可转移的技能是不可替代的,我们的工作变得越自动化,人际交往、情商和自我意识将在工作场所发挥越重要的作用。根据 Linked-In 所做的调查,公司在候选人身上最看重的 5 种技能是创造力、说服力、协作能力、适应能力和时间管理能力。

3。这种转变就一定意味着人们会失业吗?

有些工作,尤其是有重复性任务的工作,将全部或部分实现自动化。然而,新的工作会被创造出来——因此提高技能和学习很重要。我们仍然非常重视工作角色和工作描述。展望未来,我预计我们将招聘技能人才,而不是“工作”。需要对员工和新员工的硬技能和“软”技能进行描述,以及他们在未来可能为组织带来最大价值的领域的技能提升。我认为,这将是一个招聘更具流动性的理想技能档案的问题,而不是一个工作“角色”。

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

Photo by Austin Chan on Unsplash

4。数字化转型是面向所有人的吗?

我不认为所有的组织都为变革做好了准备,当然也有一些变革失败了(据说 70%的变革都失败了)。从更以人为中心的角度来看,缺乏适当的变革管理技能,将“变革”视为一个不考虑人的因素(如抵制变革)而实施的项目,可能是原因之一。当然,还有技术能力。没有合适的团队和必要的技能,无论是内部的还是通过外部人工智能顾问外包的,适当的数据和能力,转型都不会成功。

5。你如何评估一个组织是否为数字化转型做好了准备,你倡导的流程是什么?

首先,我会评估组织的变革准备情况和内部能力,并确定是否有所需的变革管理技术能力来推动和完成转型。首先,我要确保有必要的基础,并从一开始就让所有利益攸关方参与这一进程。沟通、适当的利益相关者管理和透明度是关键。

6。这个过程需要多长时间?

这将取决于目标最终结果、变化的性质程度。如果我们着眼于更深层次的转型,这将意味着目标的转变,重新定义组织的使命和宗旨,并对商业模式、文化、结构和流程进行重大变革。这还需要改变的思维方式的行为方式——这种转变需要时间。我们正在考虑两到三年的时间,这取决于组织的规模。另一方面,如果是通过人工智能自动化一个简单的过程,这种变化应该更直接,不一定涉及审查底层文化和商业模式。

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

Photo by Proxyclick on Unsplash

7。如今的职场应该有多灵活?

我会说非常灵活和适应性强。劳动力的性质已经发生了变化,我们现在有 Z 世代和婴儿潮一代,自由职业者,零工或合同工和全职员工在同一支劳动力队伍中工作。个人越来越寻求灵活的工作条件、自主权和合理的工作量。雇主和雇员都需要考虑他们是否真的在改变他们“已知的”工作方式来适应新的现实。那些没有重新审视自己屡试不爽的做法的雇主,以及那些没有准备好提升技能、接受更具成长性的思维模式的员工,将会面临严峻的挑战。

8。谁在推动变革/转型,人力资源在其中将扮演什么角色?

通常,转型被视为自上而下的计划,其中变革的方向和启动是一项战略任务。然而,也有成功的自下而上或“紧急”举措,将责任转嫁给员工。事实上,直接的自上而下的方法可能不会获得正确的承诺和认同。这就是为什么英雄领导者作为唯一决策者和推动者的概念正在变得过时,并被一种更具共享性的领导和参与模式所取代,这种模式让更广泛的群体参与到共同创造的决策过程中。创新和变革可以来自组织的所有层级,但高级管理层和组织结构图需要支持这一点。

人力资源的作用至关重要。随着未来劳动力的不断发展,人力资源的角色也在不断发展,以满足转型和变革的需求。例如,即使是人力资源也需要在获取变革管理技能、基于正确的学习和发展、战略性劳动力规划、促进设计思维研讨会以实现共同创造等方面提高技能。我认为这个角色在面向未来的组织中会变得更加重要。可悲的是,我仍然在组织中看到许多例子,人力资源没有被给予所需的权力和预算来实施所需的变革。

9。你建议什么样的培训能让员工适应未来?

最初,我会推荐基于未来的情景规划,以便能够设想你的组织在 5 年后会处于什么位置。接下来,组织应该预测需要什么样的技能组合(在更技术性的“硬”技能和核心“人”技能方面)来提供竞争优势并推动组织前进。

推动所需行为变化并对业务产生积极影响的学习和发展(如采用更多的成长思维或发展情商和自我意识)不会在一夜之间发生,需要周期性的学习干预、辅导和指导。一旦你在目标技术和核心技能方面建立了一个基线,这就是一个为员工提供学习机会和发展动力以弥补技能差距的问题。有许多有效的学习解决方案,但您需要有人来推动学习和发展计划,并确保它能够带来所需的行为变化,从而对业务产生积极影响。

10。如果一个人决定开始这样的转变,第一步是什么?

我认为这将是分析和理解转型的性质和程度、所需的能力以及这将如何影响整个业务。此外,还要规划如何推广,是缓慢渐进的推广,还是因为情况紧急而需要更“大爆炸”的方法?

雷切尔·法尔松 女士拥有雷丁大学亨利商学院人力资源专业的 MBA 学位。她曾担任研究总监、业务发展和沟通经理、战略人力资源顾问,直到最近,她还担任四大会计师事务所之一的顾问经理。她最近独自拓展业务,成为了员工绩效顾问。她的目的是培养学习型组织,提供核心技能和领导力培训、战略性人力资源/业务合作、变革管理、设计思维研讨会促进,以培养创新和创造性的方式看待人力资源问题和指导,从而增强个人面向未来的组织面对现代挑战和持续的数字破坏的能力。

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

数据科学家开始使用商业模型的 10 个阅读材料

原文:https://towardsdatascience.com/10-reads-for-data-scientists-getting-started-with-business-models-78e6a224fd66?source=collection_archive---------14-----------------------

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

Photo by Andrew Gook on Unsplash

弥合技术技能和业务之间的差距

如果您刚开始接触数据科学,您可能会将注意力主要集中在统计和编码上。这没有错,事实上,这是正确的举措——这些是你需要在旅程早期培养的基本技能。

话虽如此,但在我的数据科学之旅中,我遇到的最大知识缺口并不涉及这两个领域。相反,在开始我的第一份全职数据科学家工作时,我惊讶地意识到,我并不真正了解业务。

我怀疑这是一个共同的主题。如果你在大学里学习了某个技术领域,或者通过在线课程学到了一些东西,那么你就不太可能有任何理由去深入研究商业概念,比如模型、战略或者重要的指标。除此之外,我真的没有遇到过对这种理解进行压力测试的数据科学采访。他们中的许多人试图获得产品直觉的感觉,但我发现它很少超越这一点。

事实是,在数据科学社区中,业务理解并没有被教授或传播到实际应用的程度。这篇文章的目标是通过分享一些我发现最有帮助的资源来帮助弥合这一差距,因为我已经了解了企业是如何从内到外运作的。

16 个创业指标

如果你试图熟悉一个企业中出现的大量指标和首字母缩写词,无论它是否是一家初创企业,那么来自的安德森·霍洛维茨的这篇文章是一个很好的起点。总的来说,他们的帖子质量一贯很高,几乎总是值得你花时间。如果你有更大的胃口,查看他们关于 16 个更多指标的后续帖子和下面的帖子,了解更多关于指标的技巧。

Some helpful tips on misleading metrics

30 种成功的商业模式

作为一个全面的可靠资源,FourWeekMBA 上的文章在某种程度上是值得探究的。我特别推荐这本书,因为它是对所有不同商业模式的概述。不学点新的东西,很难从中解脱出来。为了更实际地探究商业模式,我还发现这篇文章讲述了 Slack 如何让金钱变得有趣。

聚集理论

这个比前两个密一点,但是真的很优秀。Stratechery 中不容错过的 Ben Thompson 讲述了市场是如何运作的,以及为什么某些公司主宰着他们的行业。这篇文章的要点是,市场有三个组成部分,能够垄断其中两个的公司通常会大获全胜。想想网飞。

为什么投资者不投资相亲

到目前为止,我们看到的很多都是概念性的,所以让我们来看一个具体的模型,并分析它为什么可行和不可行。我最喜欢的商业作家之一,陈楚翔关注约会行业以及为什么大多数投资者不觉得它有吸引力。这位风险投资家的其他优秀文章通常会涵盖诸如增长指标等内容。

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

Why Investors Don’t Fund Dating

数据工厂

更多来自本·汤普森,这是他的另一篇伟大的文章。这一次是关于大公司,尤其是脸书和谷歌,如何将数据从原始形式处理成有独特价值的东西。该报告于 2018 年秋季发布,为我们现在看到的所有数据隐私和监管问题的商业方面提供了一个良好的早期视角。

LTV 公式的危险诱惑

如果你不熟悉 LTV(终生价值),那么你可能必须在某个时候熟悉它。关于这个指标有很多资源,但这可能是我最喜欢的关于这个主题的方法。它清楚地解释了如何计算 LTV,以及为什么你应该在没有上下文的情况下盲目买入之前三思。

打造 1 亿美元企业的五种方法

这篇短文主要关注 SaaS(软件即服务)商业模式。下图简单地描述了基本的想法,但是我仍然建议你花时间阅读完整的文章。Christoph Janz 在解决复杂问题并将其分解方面做得非常出色。他最近还在的新帖中更新了图表。

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

Five Ways to Build A $100 Million Business

战略信 V

StackOverflow 的联合创始人和前首席执行官 Joel Spolsky 在这里强调了一个重要的半商业半经济学的教训:聪明的公司试图将他们产品的补充物商品化。他们是否成功是一个非常不同的故事,这里有大量的例子。

如何通过捆绑销售获得商业成功

我们讨论了公司赚钱的几种方式,但是这个资源采用了最简单的(也是最准确的)方法。这一切都是从吉姆·巴克斯代尔在一次贸易展览会上开始的。当他出门赶飞机时,他在离开前给观众留下了最后一颗智慧之珠,它很好地总结了这篇文章。

“先生们,我知道的赚钱方式只有两种:捆绑销售和非捆绑销售.”

MBA 案例研究

最后但同样重要的是,如果你想更进一步,我推荐案例研究。你可以从顶尖大学找到很多,比如斯坦福大学、T2 大学和哈佛大学,价格很便宜,或者经常是免费的。一旦你掌握了基本原理,这是继续补充你的学习的极好方法。这就是我目前的处境——我已经挑战自己,整个夏天每两周进行一次案例研究。和我一起上路吧!

包扎

列表就这样了。我知道以上所有的链接真的帮助了我,我希望你花时间去探索它们。您可能已经注意到,并非所有这些都与数据科学家的日常生活息息相关,这是有意的。

我在我的上一篇文章中说过,我将再说一遍——数据科学家是思想家。当我们了解我们周围的系统时,我们的工作做得最好。这种理解为我们设置了很酷的东西:探索性分析、机器学习和数据可视化。先打基础,后收获收益。这就是它的意义所在。

以上选取的资源深受《Squarespace》的 SVP、安德鲁·巴塞洛缪的 阅读清单 的影响。

感谢阅读!请随意查看下面我的一些类似文章,并订阅我的时事通讯中有趣的链接和新内容。

你可以在 Medium 上关注我更多类似的帖子,也可以在 Twitter 上找到我。更多关于我和我在做什么,请查看我的网站

区块链技术成为趋势的 10 个原因

原文:https://towardsdatascience.com/10-reasons-why-blockchain-technology-in-trend-97c947735897?source=collection_archive---------29-----------------------

为什么区块链将成为最热门和最受欢迎的技术?

技术进步不是很快吗?作为互联网的第一批用户,我们知道确实如此。它走过了漫长的道路。从我们最初使用的拨号上网,我们现在有千兆位的网速。选择如此之多,速度如此之快,以至于你最终会困惑于应该选择哪一个频谱束。或者任何互联网服务提供商。

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

Blockchain Technology | Source

所以如果你还在编辑 Java 代码,用 PowerBuilder 工作,我们会说你还活在过去!现在事情发生了革命性的变化,如果你跟不上步伐,你就会被甩在后面。

这些革命性技术之一是区块链技术。现在是了解它的时候了,因为它还处于起步阶段。无论你是渴望成为一名用户、开发者还是投资者,让我们来讨论一下为什么区块链可以提供一个更好、更安全的未来。

区块链是一项有前途的技术的 10 大理由

  1. 尖端技术。

2.需求高。

3.促进通用基础设施。

4.预计投资。

5.数字身份和数据安全。

6.依赖区块链的行业。

7.与新时代技术的结合。

8.链条中的绝对中断。

9.这个时代的转折点。

10.薪水更高的工作。

我们来讨论一下吧!

1.尖端技术

你知道吗,根据一项调查,目前世界上只有 0.5%的人在使用区块链。因为我们相信这项技术有如此大的潜力,我们有机会成为第一批学习它的人。你真正需要做的是:

收集所有有用的资源,并开始有效地运用它们。

尽可能多地学习区块链相关技能。

了解区块链技术的工作原理。

应用所有这些获得的知识来构建分散的应用程序。

高需求

谁不想要新的机会?尤其是当新技术席卷全球的时候!区块链无疑是一个蓬勃发展的领域。如果你掌握了它,你会发现无数的机会。区块链就像一个趋势性的浪潮,一个革命性的平台,将改变一切。由你来决定你是否有合适的技能在这个领域找到你的运气。如果是的话,你将会发现大量的机会。

促进通用基础设施

DLT(分布式账本技术)和区块链本质上连接在一起,形成了一种全新的基础设施。这种基础设施将是通用的,并将集成到现有的流程和系统中。

因此,我们谈论的是单一解决方案设施和基础设施。不仅让事情变得更简单,而且在现有系统中的整合也会很顺畅。

计算投资

如果你了解所有区块链相关概念,你最终会做出更明智的投资和交易决策。在投资一种加密货币之前,你需要了解所有加密货币背后的技术。而那个技术就是区块链!

数字身份和数据安全

数据泄露是一件普遍的事情。它们经常发生。说我们的机密信息很容易受到攻击并不为过。这适用于信用卡号码、位置跟踪、各种档案的活动和密码,等等。

但是你猜怎么着!区块链基础设施完全消除了保存和存储个人数据的需求。也包括你!当区块链有能力解决所有这些安全问题时,难道不值得学习吗?

依赖区块链的行业

谈到市场上的技术,区块链正在发挥主导作用。如果说银行业是唯一会受到上述技术影响的行业,那就错了。相反,超市、医疗保健、投票、能源资源和许多其他行业将在未来融入区块链。这意味着学习一门有如此多依赖行业的技术将为你打开许多门路。

与新时代技术的整合

这项技术渴望改变世界。我们已经讨论过各种行业,这些行业会整合区块链。但是物联网肯定是这个名单中最大的候选者。不必担心用户数据的真实性,为了建立一个自主协作的安全基础设施,很容易发挥创造力。

链条中的绝对中断

这项技术将提高有关各方之间的忠实度和信任度。它降低了价值链,打破了工作流程。这加快了所有相关过程的速度。反过来,将会重新关注价值链的某些参与者。因此,将会有大量的工作机会。为什么?因为玩家将估量未来的位置,经理将重新评估价值链!

这个时代的转折点

世界已经到了一个转折点,这将改变我们做生意的方式。原因是区块链!甚至金融机构也承认区块链的颠覆性。预测表明,到 2024 年,区块链将达到临界质量。趁着还不晚,还是赶紧去冲浪这股潮流吧!

报酬较高的工作

对于区块链爱好者来说,就业市场看起来不可思议。这适用于老牌公司和加密初创公司。这个部门的就业机会将在未来几年成倍增长。我们可以期待的一些职位是加密货币高级软件工程师、加密货币开发人员、加密货币交易员、加密货币分析师等等。

简而言之,就像你在订阅之前尽可能多地了解频谱互联网套餐一样,你必须了解区块链技术。这将是你的优势!

用 Python 加速数据分析的 10 个简单技巧

原文:https://towardsdatascience.com/10-simple-hacks-to-speed-up-your-data-analysis-in-python-ec18c6396e6b?source=collection_archive---------0-----------------------

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

Source

提示和技巧,尤其是在编程领域,非常有用。有时候一点小技巧既能节省时间又能挽救生命。一个小的快捷方式或附加功能有时会被证明是天赐之物,可以成为真正的生产力助推器。所以,这里有一些我最喜欢的技巧和窍门,我用它们汇编成了这篇文章。有些可能是相当有名的,有些可能是新的,但我相信,下次你从事数据分析项目时,它们会非常方便。

1.描绘熊猫数据帧

剖析是一个帮助我们理解数据的过程,而**Pandas Profiling是一个 python 包,它正好可以做到这一点。这是对熊猫数据框架进行探索性数据分析的一种简单而快速的方法。熊猫df.describe()df.info()functions通常被用作 EDA 过程的第一步。但是,它只是给出了数据的一个非常基本的概述,对于大型数据集没有太大的帮助。另一方面,Pandas Profiling 函数使用df.profile_report()扩展了 pandas DataFrame,以便进行快速数据分析。它用一行代码显示了大量信息,在交互式 HTML 报告中也是如此。**

对于给定的数据集,pandas profiling 包计算以下统计数据:

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

Statistics computer by Pandas Profiling package.

装置

pip install pandas-profiling
or
conda install -c anaconda pandas-profiling

使用

让我们使用古老的 titanic 数据集来演示多功能 python 分析器的功能。

#importing the necessary packages
import pandas as pd
import pandas_profiling#Pandas-Profiling 2.0.0
df = pd.read_csv('titanic/train.csv')
df.profile_report()

在 Jupyter 笔记本中显示数据分析报告只需要这一行代码。这份报告非常详细,必要时还附有图表。

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

该报告也可以用下面的代码导出到一个交互式 HTML 文件中。

profile = df.profile_report(title='Pandas Profiling Report')
profile.to_file(outputfile="Titanic data profiling.html")

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

更多细节和示例请参考文件

2.给熊猫情节带来互动性

Pandas 有一个内置的.plot()函数作为 DataFrame 类的一部分。然而,用这个函数呈现的可视化效果不是交互式的,这使得它不那么吸引人。相反,也不能排除用pandas.DataFrame.plot()功能绘制图表的方便性。如果我们不用对代码进行大的修改就能绘制出像熊猫图表那样的交互式图表,会怎么样?嗯,实际上你可以借助 袖扣 库**来做到这一点。**

袖扣库将plottly的力量与熊猫的灵活绑定,方便出图。现在让我们看看如何安装这个库,并让它在 pandas 中工作。

装置

pip install plotly # Plotly is a pre-requisite before installing cufflinks
pip install cufflinks

使用

#importing Pandas 
import pandas as pd
#importing plotly and cufflinks in offline mode
import cufflinks as cfimport plotly.offline
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)

是时候看看泰坦尼克号数据集的神奇之处了。

df.iplot()

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

df.iplot() vs df.plot()**

右边的可视化显示了静态图表,而左边的图表是交互式的,更加详细,所有这些都没有在语法上做任何重大改变。

点击此处 查看更多示例。

3.一丝魔力

Magic commands 是 Jupyter 笔记本中的一组便利功能,旨在解决标准数据分析中的一些常见问题。在%lsmagic的帮助下,你可以看到所有可用的魔法。

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

List of all available magic functions

魔术命令有两种: 行魔术 ,以单个%字符为前缀,对单行输入进行操作;以及 单元格魔术 ,与双%%前缀相关联,对多行输入进行操作。如果设置为 1,魔术函数无需输入初始%即可调用。

让我们看看其中一些在常见数据分析任务中可能有用的工具:

  • % pastebin

%pastebin 上传代码到 Pastebin 并返回 URL。Pastebin 是一个在线内容托管服务,在这里我们可以存储像源代码片段这样的纯文本,然后可以与他人共享 URL。事实上,Github gist 也类似于 pastebin ,尽管有版本控制。

考虑具有以下内容的 python 脚本file.py:

#file.py
def foo(x):
    return x

使用 Jupyter 笔记本中的 %pastebin 生成一个 pastebin url。

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

  • %matplotlib 笔记本

%matplotlib inline函数用于呈现 Jupyter 笔记本中的静态 matplotlib 图。尝试用notebook 替换inline部分,轻松获得可缩放的&可调整大小的图。确保在导入 matplotlib 库之前调用该函数。

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

%matplotlib inline vs %matplotlib notebook

  • %运行

%run函数在笔记本中运行一个 python 脚本。

%run file.py
  • % %写文件

%%writefile将单元格的内容写入文件。这里,代码将被写入一个名为 foo.py 的文件,并保存在当前目录中。

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

  • % %乳胶

%%latex 函数将单元格内容呈现为 latex。这对于在单元格中书写数学公式和方程式非常有用。

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

4.查找和消除错误

交互式调试器也是一个神奇的功能,但是我给了它一个自己的类别。如果在运行代码单元时出现异常,在新的一行中键入%debug并运行它。这将打开一个交互式调试环境,将您带到发生异常的位置。您还可以检查程序中分配的变量值,并在此执行操作。点击q退出调试器。

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

5.印刷也可以很漂亮

如果您想要生成美观的数据结构表示,那么 pprint 是您需要的模块。它在打印字典或 JSON 数据时特别有用。让我们看一个同时使用printpprint来显示输出的例子。

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

6.让音符突出。

我们可以在您的 Jupyter 笔记本中使用提醒/笔记框来突出显示重要的事情或任何需要突出显示的内容。注释的颜色取决于指定的警报类型。只需在需要突出显示的单元格中添加以下任意或所有代码。

  • 蓝色警告框:信息
<div class="alert alert-block alert-info">
<b>Tip:</b> Use blue boxes (alert-info) for tips and notes. 
If it’s a note, you don’t have to include the word “Note”.
</div>

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

  • 黄色警告框:警告
<div class="alert alert-block alert-warning">
<b>Example:</b> Yellow Boxes are generally used to include additional examples or mathematical formulas.
</div>

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

  • 绿色警告框:成功
<div class="alert alert-block alert-success">
Use green box only when necessary like to display links to related content.
</div>

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

  • 红色警告框:危险
<div class="alert alert-block alert-danger">
It is good to avoid red boxes but can be used to alert users to not delete some important part of code etc. 
</div>

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

7.打印单元格的所有输出

考虑包含以下代码行的 Jupyter Notebook 的一个单元格:

In  [1]: 10+5          
         11+6Out [1]: 17

只有最后一个输出被打印出来,这是单元格的正常属性,对于其他输出,我们需要添加print()函数。事实证明,我们可以通过在笔记本顶部添加以下代码片段来打印所有输出。

from IPython.core.interactiveshell import InteractiveShell  InteractiveShell.ast_node_interactivity = "**all**"

现在所有的输出都一个接一个地打印出来了。

In  [1]: 10+5          
         11+6
         12+7Out [1]: 15
Out [1]: 17
Out [1]: 19

要恢复到原始设置:

InteractiveShell.ast_node_interactivity = "**last_expr**"

8.使用“I”选项运行 python 脚本。

从命令行运行 python 脚本的典型方式是:python hello.py.然而,如果在运行相同的脚本时添加一个额外的-i ,例如python -i hello.py,它会提供更多的优势。让我们看看怎么做。

  • 首先,一旦程序结束,python 不会退出解释器。因此,我们可以检查变量值和程序中定义的函数的正确性。

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

  • 其次,我们可以通过以下方式轻松调用 python 调试器,因为我们仍然在解释器中:
import pdb
pdb.pm()

这将把我们带到发生异常的位置,然后我们可以处理代码。

原文 出处 的 hack。

9.自动注释掉代码

Ctrl/Cmd + /自动注释掉单元格中选中的行。再次点击该组合将取消对同一行代码的注释。

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

10.删除是人性,恢复神性

你曾经不小心删除了 Jupyter 笔记本中的单元格吗?如果是,那么这里有一个可以撤消删除操作快捷方式。

  • 如果您删除了单元格中的内容,您可以通过点击CTRL/CMD+Z轻松恢复
  • 如果您需要恢复整个删除的单元格,请点击ESC+ZEDIT > Undo Delete Cells

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

结论

在本文中,我列出了我在使用 Python 和 Jupyter 笔记本时收集的主要技巧。我相信这些简单的技巧会对你有用,你会从这篇文章中受益匪浅。直到那时快乐编码!。

使用云服务安排脚本的 10 步指南(免费)

原文:https://towardsdatascience.com/10-step-guide-to-schedule-your-script-using-cloud-services-7f4a8e517d81?source=collection_archive---------5-----------------------

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

credit: https://www.pexels.com/photo/bandwidth-close-up-computer-connection-1148820/

为什么我不能在我的笔记本上运行它?

嗯…,你可以在本地运行它,我相信如果你是 Windows 用户,很多人可能知道任务调度功能。我们设置触发时间和条件,脚本将根据我们预定义的标准运行。然而,这样做的缺点是,你需要让你的电脑在预定的时间“开机”(如果不是一直开机的话)。

当我想运行我的小脚本来检索每天早上的天气预报时,我遇到了这个问题。让我的笔记本电脑一直开着,只是为了每天运行这个简单的任务,这对我来说是不现实的。

请将此视为带笔记本仪表板的免费指南:第三天 / 第四天。这完全归功于雷切尔博士和 Kaggle 团队。感谢他们在原创内容上的努力,他们还在这里发布了直播录制的

本文旨在帮助那些不是核心程序员并且不熟悉 Bash 和云服务中的文件系统的人。因此,我在这里包括了很多截图和详细的解释。

使用 Kaggle 和 PythonAnywhere 云服务调度 Python/R 脚本

  1. Kaggle account ,我们将使用内核来托管和运行我们的 Python 脚本。
  2. PythonAnywhere account ,我们将使用任务调度来触发我们托管在 Kaggle 上的脚本。

我们需要做什么?

  1. 设置 Kaggle 账户,进入“内核”标签,然后点击“新内核”。您可以选择脚本或笔记本。

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

它将重定向到控制台,带有设置选项卡。在这里,您可以上传数据,选择语言(Python/R /RMarkdown),添加自定义包,还可以在这里为您的脚本设置 GPU/Internet 选项。

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

You can customize your settings here, in my case, I changed option to “Internet connected”. I also added some packages, you can select your “Docker” as well.

保存并提交您的代码,然后返回内核页面,您将在这里看到您的工作。在这个例子中,我的内核名是‘weather alert FB’。

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

‘WeatherAlertFB’ script

现在,你的剧本准备好了…

2.转到您的用户配置文件的“帐户”选项卡,向下滚动直到您找到“创建 API 令牌”。这将下载kaggle.json,一个包含您的 API 凭证的文件。更多关于 Kaggle API 的细节请点击

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

用记事本打开你的kaggle.json文件。

在你的结尾加上一行"proxy": "http://proxy.server:3128"。json 文件。应该是这样的。

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

{“username”:”[KAGGLE USERNAME]”,”key”:”[API KEY]“,”proxy”: “http://proxy.server:3128”}

3.到处登记。在您的仪表板页面的“新控制台:”部分,单击$ Bash。您将看到创建了新的 Bash 控制台。运行命令pip install kaggle --user来安装 Kaggle API。

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

上传您的kaggle.json文件。通过运行ls检查您的文件是否已经上传。您应该看到列出了kaggle.json

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

You can also inspect your json file by typing **cat kaggle.json**

4.制造。kaggle 目录;

mkdir --parents /home/[Your_Python_Anywhere_Username]/.kaggle

通过运行命令移动kaggle.json文件;

mv kaggle.json /home/[Your_Python_Anywhere_Username]/.kaggle/kaggle.json

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

kaggle -h will show the help commands.

5.通过运行以下命令将您的凭据设为私有;chmod 600 /home/[Your_Python_Anywhere_Username]/.kaggle/kaggle.json

6.你可以通过运行来搜索你的内核,根据你最近运行它们的时间来排序;kaggle kernels list --user [YOUR KAGGLE USERNAME HERE] --sort-by dateRun

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

kaggle kernels list — user ekapope — sort-by dateRun

通过运行以下命令获取内核的副本:kaggle kernels pull [AUTHOR'S KAGGLE USERNAME]/[KERNEL SLUG FROM URL] -m

正在运行ls。您应该看到笔记本文件和元数据文件都在您当前的工作目录中。

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

kaggle kernels pull ekapope/world-bank-eda-for-dashboard -m

7.通过运行kaggle kernels push推送您的笔记本

该命令将重新运行脚本,并在 Kaggle 上提交新版本。

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

It shows that ‘Kernel version 8’ successfully pushed.

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

Check on Kaggle log, pushed successful. No errors.

8.使用任何文本编辑器创建新的文本文件,将下面的代码放入其中。

#!/usr/bin/env bash
kaggle kernels pull pull [KAGGLE USERNAME]/[KERNEL SLUG] -m
kaggle kernels push -p /home/[Your_Python_Anywhere_Username]

另存为’ run_kernel.sh ',然后上传到 PythonAnywhere。

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

run_kernel.sh file

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

Checking your files in the root directory.

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

You should have 3 new files by now.

9.运行命令chmod u+x run_kernel.sh

然后通过运行./run_kernel.sh来运行您的脚本。这应该会更新您在 Kaggle 上的内核。

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

10.转到 PythonAnywhere 上的 Task 选项卡来计划您的脚本。

时间是 UTC,而不是您当地的时区。输入您的文件路径。sh 脚本。/home/[Your_Python_Anywhere_Username]/run_kernel.sh,点击“创建”按钮。

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

然后…完成了!您的脚本将在每天指定的 UTC 时间运行。

请注意,对于免费层,您的脚本将在一个月后停止运行,除非您手动续订,所以要小心。

感谢您的阅读。请尝试一下,玩得开心,并让我知道你的反馈!与我联系讨论你的鼓舞人心的项目。

如果你喜欢我的做法,可以考虑在 GitHubMediumTwitter 上关注我。😛

成为数据科学家的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-become-a-data-scientist-6c8e7ac6288e?source=collection_archive---------33-----------------------

立即学习数据科学。

即使对于最优秀的工程师来说,成为一名数据科学家也并不容易。然而,这对任何学生来说都不太难,而且有一些事情你应该事先知道。本文将对它们进行研究,为您提供在数据科学领域取得成功的清晰路线图。

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

Become a data scientist in 10 steps. Learn Data Science.

1.你需要做什么

  • 设定目标小时数
  • 为了编写代码,计划你需要知道/经历的事情
  • 为一个能提供好建议的聪明人冒一点时间的风险
  • 选择一个感兴趣的数据集并执行搜索
  • 承认最大的挑战在开始
  • 忘记二元分类:交叉验证和贝叶斯算法将帮助你成为一名真正优秀的数据科学家
  • 了解如何在数据科学面试中提出正确的问题

2.问题陈述

对于每个问题,用简单的英语写下问题陈述。我已经写了一篇关于制作可读数据科学问题的帖子。

这也是一个很好的机会来看看一些真实的公司在数据科学过程中遇到的问题的技术示例。

3.写一些代码

编写代码并运行它。面试官会看一下代码,然后回答问题(见下文)。

  • 估计你需要多少时间来准备数据
  • 你的团队中解决这个问题的平均人数应该是多少
  • 什么会出错?这可能是一个提示,为任务 3 选择一个更容易使用的工具
  • 写下你将用来解决问题的工具

4.准备并评估你的答案

确保有有效的解决方案,既简洁又有创意。

写下你对这些问题的回答。

5.检查您的答案

提炼你的答案,问问你自己为什么不利用一些现有的框架或工具

这将帮助你确定你需要学习更多的领域,并说服自己为将来的面试写一些材料。

6.展示你对这个问题的解决方案

作为奖励,准备并向第三方展示你的解决方案,他们将帮助你与面试应聘者的机构取得联系

准备一个笔记本,记下你所有的解决方案,这样你就可以和你的团队讨论你的解决方案

7.确定假设

定义你认为你的面试官在公司的假设和你将要处理的任务。不要在这些假设上妥协,因为这是将你从人群中分离出来的好方法

8.确定解决方案

确定满足团队期望和任务的解决方案。当你有时间的时候,回顾你的团队的期望和工具。

9.运用帕累托原则

使用帕累托分布定律,这是统计学中的一个概念。在这种情况下,分布描述了任何一对独立事件中最好的一个会给出的最可能的结果。考虑以下值作为数据样本。

10.建立一个模型

每个问题都有一个可能的答案,它符合你所拥有的数据。花时间定义一个强大的解决方案,应用它,并在未来的面试中证明它

编程经验对数据科学至关重要:你必须执行代码,在没有任何代码的情况下发现错误。在这种情况下,没有代码比没有代码更糟糕。如果要求你重写代码和修复 bug,你可以找数据科学家试试。

编程语言的差异没有文化差异重要。两组的学习曲线可以帮助你确定你需要坚持的地方,以获得最好的机会。

如果你很紧张,你也可以在面试中问一些问题,比如如何组织你的代码以适应公司的结构,以及如何跟踪未来几周你需要做什么工作。

结论

每个公司都重视数据科学;他们不太可能雇佣没有足够技能的人。如果你进入这家公司时已经相信自己是这家公司最好的数据科学家,这可能是一个不利因素。

然而,值得记住的是,有些团队并不真的关心或找到优秀的候选人。作为一名数据科学家,你将不得不在面试过程中就你的工资、工作时间和许多其他事情进行谈判。

成为工程师需要很长时间;成为伟大的数据科学家所需的时间更短。

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

Data Science Job

最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。

成功设置 Python 项目的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-set-up-your-python-project-for-success-14ff88b5d13?source=collection_archive---------4-----------------------

如何添加测试、CI、代码覆盖率等等

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

在本指南中,我们将通过添加测试和集成来加速开发并提高代码质量和一致性。如果你没有一个基本的 Python 包,可以看看我的构建指南,然后在这里见面。

[## 构建您的第一个开源 Python 项目

工作包的逐步指南

towardsdatascience.com](/build-your-first-open-source-python-project-53471c9942a7)

酷毙了。以下是本文的十步计划:

  1. 安装黑色
  2. 创造。pycache
  3. 安装 pytest
  4. 创建测试
  5. 注册 Travis CI 并配置
  6. 创建. travis.yaml
  7. 测试 Travis CI
  8. 添加代码覆盖率
  9. 添加工作服
  10. 添加 PyUp

本指南适用于使用 Python 3.7 的 macOS。截至 2019 年初,一切正常,但事情变化很快。

我们有工作要做。让我们开始吧!🐸

第一步:安装黑色

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

您的包代码应该遵循通用的样式约定。 Black 是一个 Python 包,它自动为你格式化你的代码,使之符合 PEP 8 。Black 相对较新,已经有超过一百万的下载量。使用它很快成为 Python 编码中的最佳实践。这里有一个很好的黑色指南。

我使用 Atom 作为我的编辑器,所以我给 Atom 添加了 Python-Black 包— 安装信息在这里是。现在,当您保存文件时,Atom 将重新格式化您的代码。

现在,让我们为我们的合作者将 Black 添加到开发环境中。最终,任何参与该项目的人都将遵循相同的风格指南,否则他们的拉请求将不会被接受。😦

black==18.9b0添加到 requirements_dev.txt 的下一个空行,并运行pip install -r requirements_dev.txt

黑色使 88 个字符成为默认的最大行长度。有些指南和程序需要 79 个字符,例如斯芬克斯风格指南。在黑色原子包中,你可以设置最大长度。

既然我们已经开始节省编写代码的时间,那么让我们节省将应用程序推送到 PyPI 的时间。

第二步:创建。pypirc

当我们使用 twine 将我们的构建推送到 TestPyPI 和 PyPI 时,我们需要手动输入我们的登录信息。如果你对麻线不熟悉,请看我之前的文章。让我们自动化这个过程。

Twine 将查找名为的文件。pypirc 在我们的主目录中。它会在上传文件时获取我们的 url、登录名和密码。

创建您的*。您的主目录中的 pypirc* 文件,包含:

touch ~/.pypirc

将以下内容添加到您的中。pypirc 文件:

[distutils]
index-servers =
    pypi
    testpypi

[testpypi]
repository: https://test.pypi.org/legacy
username = your_username
password = your_pypitest_password

[pypi]
username = your_username
password = your_pypi_password

替换为您的用户名和密码。确保将该文件保存在您的主目录中,而不是当前的工作目录中。如果要确保您机器上的其他用户不能访问该文件,您可以从命令行更改其权限:

chmod 600 ~/.pypirc

现在,您可以使用以下命令将您的包上传到 TestPyPI:

twine upload -r testpypi dist/*

使用以下命令上传到真实的 PyPI:

twine upload dist/*

不再需要输入用户名和密码。这不是很好吗?😄

现在让我们添加一些测试来确保我们的包能够工作。

步骤 3:安装和配置 pytest

Pytest 是测试 Python 代码的最流行、最容易使用的库。在这个例子中,我们将向我们的项目添加简单的测试。如果你想了解 pytest,这里有一个很好的介绍教程。另一个很好的指南是 Brian Okken 的书 Python 测试与 Pytest

使用以下命令将 pytest 添加到 requirements_dev.txt 文件中

pytest==4.3.0

运行pip install requirements_dev.txt

然后运行以下命令,以便 pytest 可以找到您的包:

pip install -e .

如果您停用您的虚拟环境,您将需要再次运行两个 pip 命令来运行您的测试。

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

步骤 4:创建测试

在项目的顶层添加一个测试文件夹。在其中添加一个名为test_your_package_name.py的文件。我的文件命名为test_notebookc.py。以test_开头的文件可以让 pytest 自动发现它。

test_notebookc.py中,我添加了以下测试来检查正确的名称是否作为函数输出的一部分打印出来。修改以适合您自己的文件名和函数名。

这是怎么回事?

我们首先导入我们的模块。然后我们用test_my_function_name创建一个函数。这个命名约定对其他人和我们即将添加的代码覆盖包很有帮助。

然后我们调用我们的函数, convert ,用*“Jill”*作为参数。然后我们捕捉输出。提醒一下,我们的 convert 函数非常基本——它接受参数 my_name 并输出一行:

print(f”I’ll convert a notebook for you some day, {my_name}.”)

Pytest 检查输出中是否有字符串“Jall”。它不应该存在,因为我们传入了“Jill”。参见 pytest 文档中关于捕获输出的内容。

通过在命令行输入pytest来运行您的测试。您的测试应该失败,并显示红色文本。

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

确保您的测试在应该失败的时候失败是一个很好的实践。不要只是写他们,所以他们马上是绿色的。否则,您的测试可能不会测试您认为它们是什么。😉

在测试失败后,我们可以将预期输出从Jall更改为 Jill,我们的测试应该以绿色通过。

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

是的,都很好。现在我们有了一个测试,确保当有人向我们的函数传递一个字符串值时,该字符串被打印出来。

让我们添加一个测试来检查是否只有一个字符串被传递给了我们的函数。如果传递了字符串之外的任何内容,则应该引发 TypeError。这里有一个关于 Python 中异常和错误处理的好指南

当我们在编写通过测试的代码之前编写测试时,我们正在进行测试驱动开发(TDD)。TDD 是一种行之有效的方法,可以编写错误更少的代码。这里有一篇关于 TDD 的好文章。

这次让我们尝试一些不同的东西。作为练习,添加您自己的测试和代码,以确保只有一个字符串可以作为参数传递给convert()。提示:整数、列表和字典被类型转换成字符串。在 Twitter @discdiver 上关注我,我会在那里发布解决方案。

在我们通过测试后,我们准备好将我们的包与 CI 服务集成。

步骤 5:注册 Travis CI 并进行配置

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

Travis CI 是一个“托管的、分布式的持续集成服务,用于构建和测试软件项目”。它最近被 Idera 收购。还有其他 CI 选项,但是 Travis CI 很受欢迎,是免费的开源软件,并且有很好的文档记录。

Travis CI 更容易确保只有通过测试和标准的代码才被集成到项目中。点击了解更多关于 Travis CI 的信息,点击了解更多关于持续集成的信息。

https://travis-ci.org/注册账户。从您的 Travis CI 档案页面点击查看并添加您的授权组织链接。系统会提示您输入 GitHub 密码。点击贵组织访问权限旁边的授予

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

我必须将我的notebook 帐户同步到所有以显示为一个组织,并显示 notebookc 存储库。数据开始流动通常需要一分钟或更长时间。然后将你的回购切换到的*。*

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

点击设置。您可以选择是否希望 Travis 基于推送请求和/或推送分支进行构建。

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

现在我们需要在本地配置一个文件,以便 Travis 为每个 pull 请求构建。

步骤 6:创建. travis.yml

在项目文件夹的顶层,添加一个包含以下内容的. travis.yml 文件:

dist: xenial
language: python
python: 3.7.2
install:
  - pip install -r requirements_dev.txt
  - pip install -e .
script:
  - pytest

需要dist: xenial来指定 Travis 应该为其虚拟环境使用 Ubuntu Xenial 16.04。必须指定 Xenial 来测试 Python 3.7 代码。更多信息点击这里

可以指定不同版本的 Python 进行测试。我们将在以后的文章中讨论这个主题。跟着确保不要错过!

install部分确保我们的开发包被安装。pip install -e .将您的软件包作为轮子安装到 Travis 的虚拟环境中。然后 Travis 会在运行 pytest 时找到您的包。

步骤 7:测试 Travis CI

提交你的修改,推送到 GitHub,做一个公关。Travis 应该会在几秒钟内开始自动运行。

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

特拉维斯是这么做的。

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

From travis.ci

如果你的公关失败了,特拉维斯会告诉你的。

请注意,如果拉请求失败,您可以推送到同一个分支,Travis 会自动重新运行。

去 Travis 上你的回购页面看看吧。崔维斯有很多关于你身材的信息。您将来可能会经常访问这个站点,试图找出您的构建没有通过的原因。😄

假设一切都是绿色的,你就可以走了!

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

如果您没有看到任何红色或绿色,请点击更多选项菜单,并从下拉菜单中选择请求。如果您看到红色,请查看错误消息。如果您看到错误*构建配置文件是必需的,*那么 Travis 没有在 GitHub 上找到您的. travis.yml 文件。确保它在您的 GitHub repo 中。😉

Travis 会向您发送电子邮件,让您知道何时构建失败以及何时失败的构建已被修复。

请记住,您可以继续将您的提交推送到一个开放的 PR,Travis 将自动重新运行。

让我们看看我们的代码有多少测试覆盖率。

步骤 8:添加代码覆盖率

代码覆盖率报告向您展示了多少百分比的代码至少具有一些测试覆盖率。我们将添加 pytest-cov 包来创建一个报告。

将下面一行添加到 requirements_dev.txt 中:

pytest-cov==2.6.1

pytest --cov=my_project_name运行

我对pytest --cov=notebookc的输出是这样的:

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

太好了,我们所有的代码都被覆盖了!当你只有几行的时候,那就不算高了。😄但是我们不需要告诉全世界——让我们向他们展示我们已经覆盖了!

第九步:添加工作服

工作服为全世界提供了您的代码覆盖率的历史。

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

前往https://coveralls.io/用你的 GitHub 证书注册一个账户。添加您的组织,并在 repo 出现时打开它。

requirements_dev.txt 中增加coveralls==1.6.0。你的 requirements_dev.txt 现在应该是这样的:

pip==19.0.3
wheel==0.33.0
twine==1.13.0
pytest==4.3.0
pytest-cov==2.6.1
coveralls==1.6.0

修改您的 .travis.yml 文件,如下所示(替换您的包名):

dist: xenial
language: python
python: 3.7.2
install:
  — pip install -r requirements_dev.txt
  — pip install -e .
script:
  — pytest --cov=my_package_name
after_success:
  — coveralls

现在,当 Travis 构建您的项目时,它将安装必要的包,运行您的测试,并创建一个覆盖报告。然后它将覆盖范围报告发送给工作服。

提交,推送到 GitHub,看看奇迹发生。您的覆盖率报告可能需要几分钟才能完成,请耐心等待。

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

现在工作服显示在你的公关支票上。酷!

在工作服的网页上,我们应该显示 100%的覆盖率。

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

好吧,让我们在腰带上再加一件工具。

步骤 10:添加 PyUp

PyUp.io 让你知道什么时候包依赖过期或者有安全漏洞。它会自动发出一个 pull 请求来更新 GitHub 上的包。

前往https://pyup.io/,通过 GitHub 注册,连接您的组织。

当你添加你的回购,我建议你切换到每周更新时间表。如果你有一堆包依赖,你就不会收到很多拉请求。

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

这里有一个 PyUp 上的存储库的例子,展示了一些过时的包。

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

现在你会知道一个包什么时候更新——知道是成功的一半。自动拉取请求必须是另一半,对吗?😏

包装

在本文中,您学习了如何添加和配置 Black、pytest、Travis CI、连体工作服和 PyUp。我们已经为更安全的代码和更一致的风格做好了准备。那是相当甜蜜的!

在以后的文章中,我们将看看如何配置和构建您的文档,包括阅读文档、添加徽章、管理发布等等。跟着确保你不会错过。

我希望这个指南对你有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。👏

我撰写关于 Python、Docker、数据科学和其他技术主题的文章。如果你对此感兴趣,请关注我,在这里阅读更多。

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

感谢阅读!

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

教好数据科学的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-teaching-data-science-well-322966188323?source=collection_archive---------15-----------------------

数据科学教师资源。

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

Image source: https://broadlygenderphotos.vice.com

随着对数据科学家需求的增加,公司和教育机构内教授数据科学的培训项目也在平行增长。除了专注于满足工作需求之外,讲师还需要更多资源来推动数据科学课堂。以下是当前和未来数据科学教师的十个步骤,以确保他们为学生创造最佳的学习环境。

与一位伟大的老师在一起的一天胜过一千天的勤奋学习。

——日本谚语

1。确保你班上的每个人都乐意参与

创建一个包容性的学习环境,确保每个人都感觉自己属于课堂,并能够参与其中,无论是在所有人面前回答问题,还是一对一地接近讲师。评估课堂参与率时,优先考虑有色人种、女性、LGBTQIA+和残疾人。

2。确保没有技术背景的学生跟上。

您课堂上的学生在数据科学方面的专业知识水平各不相同。在一堂课上,花点时间确定是否所有学生都跟上了材料。这可以通过要求简单的点头来实现,如果是在线授课的话,也可以通过对投票的回应来实现。如果学生觉得自己落后了,鼓励他们向你伸出援手。

3。做一个有魅力的演讲者。

数据科学不是一个容易理解的话题,因为这类工作涉及到所有的编码、数学和分析。在讲授数据科学课程时,请确保您是一位迷人而自信的演讲者。放慢语速,清晰地说话。确保你的学生参与到你的材料中,并很好地理解你的过程中的每一步。

4。从问题集的答案开始上课。

数据科学提供了一套工具来回答和分析现实生活中的问题。有时这些工具会变得过于复杂,在解释一个概念的过程中很容易失去学生。总是从你提出的数据科学问题的答案开始课程。例如,如果问题集是关于预测结果的,那么从展示预测结果可能是什么开始。如果学生们清楚地理解为什么他们进行每一步,那么他们就更容易跟上数据科学过程的细节。

5。将数字输出和数据可视化翻译成清晰的句子。

这一步与上一步相似,但重点在于你如何陈述你的结论。始终将代码的数字输出和数据可视化翻译成清晰的句子。你计算的数字意味着什么?你的数据可视化揭示了你的数据的什么?回到你最初的数据科学问题,清楚地陈述答案。

6。在单独的单元中引入新的和/或替代的编码方法。

大多数数据科学课程使用 Jupyter 笔记本进行教学。如果你展示了编码一个概念的多种方法或者如果你正在编辑一个改变输出的原始代码块,使用一个新的单元格。不要一直迭代一个代码块并在一个单元格内改变输出。逐步教授您的代码,并在新的单元格中展示代码的变体。

7。将以前的课程与当前的课程联系起来。

引入新概念时,演示当前课程与学生已学内容的联系,并将其融入情境中。一种方法是通过使用像思维导图这样的工具来说明主题是如何相互关联的。这使学生能够利用上下文和工具来交流他们到目前为止所学的内容。

8。使用包容性数据集。

数据科学是一个强大的工具,有助于发现隐藏的真相和世界上未知的故事。利用数据科学的潜力探索被忽略的数据集。例如,如果你使用体育数据来说明一个概念,为什么不使用 WNBA 的数据集来代替 NBA 呢?要确定数据集的包容性,请列出您在整个教学过程中使用的所有数据集。您的数据集代表谁和什么?谁和什么没有被表现出来?

9。使用真实数据集。

当我们谈到数据集的话题时,请确保在你的课程中使用真实的数据集。是的,使用虹膜、葡萄酒、乳腺癌和波士顿玩具数据集仍然非常有用。然而,只要有可能,用实际的和可获得的数据集来补充你的教学材料。让学生习惯于使用课堂以外的真实世界的数据来回答现实生活中的问题。有很多地方可以获得你可以使用的开源数据

10。玩得开心!

创造一个有趣的学习环境!这可能是教好数据科学最重要的一步。在你的教室里享受乐趣,无论是面对面还是远程环境。数据科学是一个激动人心的革命性话题,值得学习和分享。作为一名教师,你应该为自己能够将知识大众化并让所有感兴趣的学生都能接触到数据科学而感到自豪。

这篇文章也出现在 女性资料 中。

Jasmine Vasandani 是一名数据科学家和研究员。她热衷于在数据领域建立包容性社区。Jasmine 感谢今天教她数据科学的老师。

你可以在这里了解更多茉莉:https://www.jasminev.co/

实现你自己的公司人工智能项目的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-your-very-own-corporate-a-i-project-ced3949faf7f?source=collection_archive---------31-----------------------

管理者、领导者、思想家和梦想家的非技术性指南

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

像世界其他地方一样,人工智能有 1%的问题。

虽然(非常)大的公司受益于他们可以获得的大量数据,以及商业、技术和监管专业知识的结合,但大多数中小企业没有这样的运气。

然而,这不应该阻止那些寻求踏上数据科学之旅的勇敢者和大胆者。虽然没有捷径,但要开始一个人工智能项目还是有明确的步骤,我在下面列出了这个项目,希望它能消除一些围绕创造“智能”算法的神秘主义。

请注意,这并不意味着是一个技术指南,为了简洁起见,定义将保持在最低限度。

1。制定执行战略

在考虑人工智能之前,一些关键问题必须由各种关键的公司高管来回答:他们想通过创造一种不同类型的价值主张来扰乱他们的市场吗?他们是否寻求成为“班上最好的”?也许他们的目标是在竞争激烈的市场上保持平衡?或者甚至追到现任领导?

在任何人工智能项目启动之前,这些问题都必须得到回答。否则,运营团队将只能漫无目的地挖掘数据,寻找故事来讲述。然而,鉴于大多数行业的性质,它们将追逐一个移动的目标,随着数据的到来改写历史。是的,数据很有趣。是的,很有趣。但是它本身没有任何意义。从它开始,而不是明确的目标,只会产生寻找问题的解决方案。

提示:一个好的策略始于心中不满的客户,而不是技术。

2。识别并优先考虑想法

当然,决策并不仅仅停留在战略的制定上;策略只回答“我是谁”这个问题。“我在干什么?”是一个完全不同的问题,需要通过识别用例来更好地回答。

假设一家公司的长期战略是成为其行业中最“值得信赖”的参与者。It 可以通过确保正确无误地回答所有客户的问题、快速回答客户的问题、让所有打电话的人都受到人而不是机器人的问候来实施这一战略……可以(应该)在研讨会或小型咨询活动中系统地识别、评估、分组、优先排序和讨论数百个这样的想法( woo!)。

有些会直接去销售、营销、会计、人力资源…可能会使用传统的运营/统计方法处理;其中一些将被认为适合作为人工智能的解决方案,以多种形式中的一种。我建议从三个具体问题入手:

  • 瓶颈:公司内部存在能力,但没有得到最佳分配。
  • 扩展:公司内部有能力,但是使用它们的过程耗时太长、太贵或者无法扩展。
  • 资源:该公司收集的数据超过了现有资源目前可以分析和应用的数据量大约 55%的公司收集的数据没有被使用

提示:对公司来说,通过商业能力而不是技术来看待人工智能更有成效。

3。询问关于数据的正确问题

在一个机器学习项目(“机器学习”这个术语比“人工智能”更准确)被认为在操作上合理、技术上可行之后,数据问题立即出现。或者,我应该说,数据问题…

需要什么类型的数据?

从技术上讲,没有很多不同类型的数据:它可以是数字(由于其表格的性质,历史上最容易使用)、文本、图像、视频、声音…任何可以被记录的东西都可以被认为是数据。最终,计算机不知道你给它们的输入是什么类型;对他们来说都只是数字。

需要多少数据?

没有具体数量的数据点可以规定,因为项目与项目之间差异很大;但一个刚刚起步、客户不超过 300 人的初创企业,可能天生就没有启动 ML 项目的资源。此外,注意数据可以由许多数据点(“大 N”)、每个数据点的许多细节(“大 D”)或两者构成。两者都是最好的。

我们有这些数据吗?

数据要么是“可用”的,要么是“要收集的”(是的,我过分简化了,告我吧)。收集可以在内部完成,这可能非常耗时(我们正在谈论几个月和重大重组),也可以通过外部来源收集(例如,预测雨伞需求将使用所有人都可以免费获得的天气数据)。

提示:创造有价值的人工智能解决方案的是独特的数据,而不是尖端的模型。

4。执行必要的风险评估

任何自尊的项目都需要持续的风险评估,以便在问题出现之前解决问题( PMO 101 )。这应该在项目的早期进行,并在项目的整个生命周期中彻底和持续地完成。下面是 10 个问题,你可以先问一下:

  • 我有没有一个 智能目标 :“别人都在做”是进入 A.I 游戏的可怕理由。
  • 我有足够的数据吗?如果不敏锐地意识到过去,算法根本不可能理解现在和未来。
  • 我的数据集 有错误吗?:垃圾进,垃圾出。
  • 我的数据集是 d*ck 吗?:数据必须代表现实,避免反映现实存在的偏见。
  • 我有能让这一切发生的人吗?全球目前只有 22,000 名博士级专家能够开发前沿算法。
  • 我需要改变我的层级结构吗?:如果项目的所有员工都向不同公司分支机构的不同经理负责,那么很可能会出现不同的目标。
  • 我的员工会成为勒德分子吗?:“它会取代乔布斯吗?”以及“我必须接受培训吗?”是需要答案的有效问题。
  • 我有合适的架构吗?:算法存在于依赖数据收集工作流管理IaaS …本身是由API、数据存储、网络安全构成的更大生态系统的一部分…
  • 有监管障碍吗?当前位置不仅要查看当前的法规,还要了解正在讨论的法规,这一直是企业界的关键,并将继续如此。
  • 我有时间吗?如果一家公司正处于时间敏感的紧要关头,人工智能可能不是答案。

提示:风险评估最好由外部人员执行。

5。选择相关方法&型号

一旦以上所有问题都解决了(如果没有,返回步骤 1 ),就该选择技术上最合适的解决方案来解决之前确定的问题了。

在这个过程的后期做这件事可能看起来很奇怪,但当人们意识到下面的技术是高度适应性的,并且只从一个方面开始只会缩小可能性的范围时,这是完全有意义的。在任何情况下,任何在这方面有一些经验的人都会想到在项目的前几个步骤中使用正确的工具。

下面是对机器学习的 7 个主要类别的浅见。具体的例子将在后面的文章中给出,但同时在网络上也可以找到:

监督机器学习

  • 线性算法:基于自变量的 LAs 模型预测。它主要用于找出变量和预测之间的关系,并且在稳定环境中很好地进行预测。→更多详情:线性回归逻辑回归SVM岭/套索……
  • 集成方法:集成学习是一种基于许多不同模型进行预测的系统。通过组合单个模型,集合模型趋向于更加灵活(偏差更小)和对数据更不敏感(方差更小)。→更多详情:随机森林、梯度提升、AdaBoost……
  • 概率分类:概率分类器能够在给定输入观测值的情况下,预测一组类别的概率分布,而不是仅输出该观测值最可能属于的类别。→更多详情:朴素贝叶斯贝叶斯网络MLE……
  • 深度学习:对于有监督的学习任务,深度学习方法通过将数据转化为数据的紧凑中间表示来提高精度,从而使耗时的特征工程任务变得无关紧要(思考类别)。它非常适合分类、处理和基于非数字数据进行预测。→更多详情: CNN,RNN,MLPLSTM

无监督机器学习

  • 聚类:“聚类”是将相似的数据点分组在一起的过程。这种无监督机器学习技术的目标是找到数据点中的相似性,并将相似的数据点自动分组在一起。→更多详情: K-means,DB 扫描层次聚类……
  • 降维:降维,又名降维,是通过获得一组主变量来减少所考虑的随机变量的数量的过程。它还能制作非常漂亮的图形。→更多详情: PCAt-SNE
  • 深度学习:对于无监督的学习任务,深度学习方法允许对未标记的数据进行分类。任何更多的细节都会大大增加这篇文章的篇幅。→更多细节:强化学习,自动编码器GANs

提示:所有的模型都是错误的,但有些是有用的。

6。做出 BBP 的决定

如前所述,很少有公司能够完全开发自己的算法,并在没有帮助的情况下大规模部署它们。不幸的 99%的人不得不做出复杂的选择,是投资成功几率低的大量资金,还是投资成功几率高但与供应商/合作伙伴关系非常密切的少量资金。

没有简单的答案。只是艰难的选择。以下是几个选项:

建设

  • 通过各种技术投资和招聘,进一步提高公司内部现有的分析能力。
  • 通过认知应用增强现有应用。
  • 使用众多可用的开源算法中的一种,以及少数企业家员工。

购买

  • 使用来自已知提供商(如 Oracle、Microsoft、AWS 等)的现有现成软件。
  • 雇佣一个现有的提供商来完全开发一个算法(但是具体的开发意味着完全依赖于该提供商。不好了

伙伴

  • 基于公司数据和初创公司技术的双赢关系。然而,这种关系可能是复杂的,而且很少是可持续的,因为各种行为者很少有相同的短期/长期目标。

提示:BBP 的选择在很大程度上取决于公司的执行策略和所属行业。

7。运行性能检查

一个最近构建的算法不能未经测试就发布到野外。事实上,大多数机器学习系统都是作为“黑箱”运行的(再次强调,这是一种有用的过度简化,由于各种原因,可能对一组训练数据有效的东西可能对另一组数据无效(如果有效的话)。令人欣慰的是,一些工具已经被设计出来,以确保模型按预期工作:

  • 分类准确度:正确预测的数量与做出的预测的数量
  • 对数损失:惩罚数据错误分类的公式
  • 混淆矩阵:类似于准确性,但更直观
  • 曲线下面积:随机选择的正面例子比随机选择的负面例子排名更高的概率
  • F1 得分:兼顾精度和鲁棒性
  • 平均绝对误差:原始值和预测值之差的平均值
  • 均方误差:同上,但更容易计算梯度

只要允许团队告知预先准备好的记分卡,以上所有内容都很重要。外部团队在这里也是有用的,因为他们不会因为项目已经投入的成本而产生偏见。

提示:小心“急于下结论”

8。部署算法

考虑到投入的资源,人工智能项目的部署阶段可能是最关键的。事实上,从原型到生产系统的过渡可以预期是昂贵和耗时的,但是如果风险分析做得适当,至少应该不会遇到重大问题(这是很少的情况)。

除了高效的项目管理团队之外,没有很多方法可以确保部署顺利进行。两种主要技术如下:

  • 静默部署:不要与“静默安装”混淆,静默部署意味着与历史解决方案并行运行算法,以确保它匹配或改进其发现。
  • A/B 测试:也称为“分割测试”或“桶测试”,它要求只在一部分人身上测试新的解决方案,而另一组人继续使用以前的解决方案。

此外,尽管我会鼓励所有首次项目进展缓慢,避免打破常规,但留意扩展潜力往往是未来成功的关键。

提示:不要害怕围绕新解决方案重新设计工作流。

9.交流成功和失败

是时候“把属于凯撒的东西渲染给凯撒”了,和全世界一起分享机器学习算法构建的成功。如果这一努力不成功,也值得讨论,哪怕只是作为整个组织的一次学习机会。

应该让几个关键群体了解成功和失败,原因多种多样:

  • 投资者/股东:在一个流行语可以成就或扼杀股票的时代,分享人工智能的成功故事会让投资者高兴,并有可能增加公司的价值,特别是如果该项目使开发新的、有用的、能产生长期影响的能力成为可能。
  • 政府机构:这当然取决于行业和所用工具的性质,但考虑到当前围绕道德和数据管理的讨论,通过透明获得公共部门的信任可能是明智之举。
  • 客户:客户需要 a)了解解决方案能为他们做什么,b)成为改进服务或产品的大使,从而创造光环效应
  • 候选人:候选人需要意识到公司可能会发生变化,他们的技能可能需要在未来适应这些变化。许多候选人也认为在一家有人工智能能力的公司工作是一件积极的事情,可能会增加申请人的数量。
  • 员工:最重要的是,员工需要知道正在做什么,这会如何影响他们,以及他们的日常生活是否会改变。人们天生反对改变,让自动化的谣言四处传播是毁掉一个好项目的最可靠的方法。

提示:宣传不足往往比宣传过度更有成效。

10.跟踪

我有坏消息。好消息是。

坏消息是这项工作永远不会结束。好消息是这项工作永远不会结束。

事实上,让一个算法在投入生产后不受检查地运行很长一段时间是愚蠢的。世界在变,人和他们的习惯也在变,导致他们的数据也在变。几个月内,用于训练算法的初始数据可能不再相关。

这里的挑战是,一开始可能很难注意到该算法不再代表世界,需要使用在构建该算法 1.0 版本期间获得的专业知识进行返工。谈一个永无止境的任务

提示:世界变化比你想象的要快得多。而算法看不到这一点。

结论

数据驱动项目的本质是它不能是通用的。这意味着花费时间和金钱来创造一些独特的东西,以跨越早期采用者创造的护城河。但是,由于人工智能能力在大公司内部往往以指数速度增长,护城河只会越来越宽。这是许多公司现在面临的挑战,也是为什么他们需要一个坚实的过程来开始:他们的误差范围正在迅速缩小。

因此,我有一些最后的建议:

  1. 从小处着手。
  2. 从试点项目开始。
  3. 设定现实的期望。
  4. 专注于速赢。
  5. 循序渐进地工作。

祝你好运。

参加一项运动

本文最初是为《T2 时报》撰写的,这是一份对当今技术挑战进行深入分析的在线杂志。T5 点击此处进入 T7。

选择最佳集群数量的 10 个技巧

原文:https://towardsdatascience.com/10-tips-for-choosing-the-optimal-number-of-clusters-277e93d72d92?source=collection_archive---------2-----------------------

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

Photo by Pakata Goh on Unsplash

聚类是最常见的无监督机器学习问题之一。使用一些观测值间距离度量或基于相关性的距离度量来定义观测值之间的相似性。

有 5 类聚类方法:

+层次聚类
+划分方法(k-means,PAM,CLARA)
+基于密度的聚类
+基于模型的聚类
+模糊聚类

我写这篇文章的愿望主要来自于阅读关于 clustreedendextend 文档以及由 Alboukadel Kassambara 写的 R 书中的聚类分析实用指南facto extra包的作者。

数据集

我将使用来自集群包的一个不太为人所知的数据集: all .哺乳动物. milk.1956 ,一个我以前没有看过的数据集。

这个小数据集包含 25 种哺乳动物及其乳汁成分(水、蛋白质、脂肪、乳糖、灰分百分比)的列表,来自 John Hartigan,Clustering Algorithms,Wiley,1975

首先让我们加载所需的包。

library(tidyverse)
library(magrittr)
library(cluster)
library(cluster.datasets)
library(cowplot)
library(NbClust)
library(clValid)
library(ggfortify)
library(clustree)
library(dendextend)
library(factoextra)
library(FactoMineR)
library(corrplot)
library(GGally)
library(ggiraphExtra)
library(knitr)
library(kableExtra)

现在加载数据。

data("all.mammals.milk.1956")
raw_mammals <- all.mammals.milk.1956# subset dataset
mammals <- raw_mammals %>% select(-name) # set rownames
mammals <- as_tibble(mammals)

让我们探索并可视化这些数据。

# Glimpse the data set
glimpse(mammals)Observations: 25
Variables: 5
$ water   *<dbl>* 90.1, 88.5, 88.4, 90.3, 90.4, 87.7, 86.9, 82.1, 81.9, 81.6, 81.6, 86.5, 90.0,...
$ protein *<dbl>* 2.6, 1.4, 2.2, 1.7, 0.6, 3.5, 4.8, 5.9, 7.4, 10.1, 6.6, 3.9, 2.0, 7.1, 3.0, 5...
$ fat     *<dbl>* 1.0, 3.5, 2.7, 1.4, 4.5, 3.4, 1.7, 7.9, 7.2, 6.3, 5.9, 3.2, 1.8, 5.1, 4.8, 6....
$ lactose *<dbl>* 6.9, 6.0, 6.4, 6.2, 4.4, 4.8, 5.7, 4.7, 2.7, 4.4, 4.9, 5.6, 5.5, 3.7, 5.3, 4....
$ ash     *<dbl>* 0.35, 0.24, 0.18, 0.40, 0.10, 0.71, 0.90, 0.78, 0.85, 0.75, 0.93, 0.80, 0.47,...

所有的变量都用数字表示。统计分布呢?

# Summary of data set
summary(mammals) %>% kable() %>% kable_styling()

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

# Historgram for each attribute
mammals %>% 
  gather(Attributes, value, 1:5) %>% 
  ggplot(aes(x=value)) +
  geom_histogram(fill = "lightblue2", color = "black") + 
  facet_wrap(~Attributes, scales = "free_x") +
  labs(x = "Value", y = "Frequency")

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

不同属性之间有什么关系?使用’ corrplot()'创建相关矩阵。

corrplot(cor(mammals), type = "upper", method = "ellipse", tl.cex = 0.9)

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

当您有以不同尺度测量的变量时,缩放数据是有用的。

mammals_scaled <- scale(mammals)
rownames(mammals_scaled) <- raw_mammals$name

降维有助于数据可视化( PCA 方法)。

res.pca <- PCA(mammals_scaled,  graph = FALSE)# Visualize eigenvalues/variances
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 50))

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

这些是捕获了 80%方差的 5 件。scree 图显示 PC1 捕获了约 75%的方差

# Extract the results for variables
var <- get_pca_var(res.pca)# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)# Control variable colors using their contributions to the principle axis
fviz_pca_var(res.pca, col.var="contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Avoid text overlapping
             ) + theme_minimal() + ggtitle("Variables - PCA")

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

从这些图像中可以明显看出,水和乳糖会一起增加,蛋白质、灰分和脂肪也会一起增加;这两组是反向相关的。

朴素(K 均值)方法

分区聚类方法,如 k-means 和 Medoids 分区(PAM ),要求您指定要生成的聚类数。

k-means 聚类可能是最著名的划分方法之一。k-means 聚类背后的思想包括定义聚类的总的类内变化**,其测量最小化的聚类的紧密度。**

我们可以用 kmeans() 函数计算 R 中的 k 均值:

km2 <- kmeans(mammals_scaled, centers = 2, nstart = 30)

上面的例子将数据分成两个集群,中心= 2 ,并尝试多个初始配置,报告最佳配置。例如,由于该算法对群集质心的初始位置敏感,所以添加 nstart = 30 将生成 30 个初始配置,然后对所有质心结果进行平均。

因为在我们开始之前需要设置簇的数量( k ),所以检查几个不同的 k 值是有利的。

kmean_calc <- function(df, ...){
  kmeans(df, scaled = ..., nstart = 30)
}km2 <- kmean_calc(mammals_scaled, 2)
km3 <- kmean_calc(mammals_scaled, 3)
km4 <- kmeans(mammals_scaled, 4)
km5 <- kmeans(mammals_scaled, 5)
km6 <- kmeans(mammals_scaled, 6)
km7 <- kmeans(mammals_scaled, 7)
km8 <- kmeans(mammals_scaled, 8)
km9 <- kmeans(mammals_scaled, 9)
km10 <- kmeans(mammals_scaled, 10)
km11 <- kmeans(mammals_scaled, 11)p1 <- fviz_cluster(km2, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 2") 
p2 <- fviz_cluster(km3, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 3")
p3 <- fviz_cluster(km4, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 4")
p4 <- fviz_cluster(km5, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 5")
p5 <- fviz_cluster(km6, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 6")
p6 <- fviz_cluster(km7, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 7")plot_grid(p1, p2, p3, p4, p5, p6, labels = c("k2", "k3", "k4", "k5", "k6", "k7"))

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

尽管这种视觉评估告诉我们在聚类之间的何处发生了描绘,但是它没有告诉我们最优的聚类数目是多少。

确定最佳聚类数

在文献中已经提出了多种评估聚类结果的方法。术语聚类验证用于设计评估聚类算法结果的程序。有三十多种指标和方法可以用来确定最佳集群数量,所以我在这里只关注其中的几种,包括非常简洁的 clustree 包。

“肘”法

可能是最广为人知的方法,即肘形法,在该方法中,计算每个聚类数的平方和并绘制图形,用户寻找从陡到浅的斜率变化(肘形),以确定最佳聚类数。这种方法不精确,但仍有潜在的帮助。

set.seed(31)
# function to compute total within-cluster sum of squares
fviz_nbclust(mammals_scaled, kmeans, method = "wss", k.max = 24) + theme_minimal() + ggtitle("the Elbow Method")

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

肘形曲线法很有帮助,因为它显示了增加聚类数如何有助于以有意义的方式而不是边际方式分离聚类。弯曲表示超过第三个的其他聚类没有什么价值(参见[ 此处的 ]以获得该方法的更精确的数学解释和实现)。肘方法是相当清楚的,如果不是一个基于组内方差的天真的解决方案。间隙统计是一种更复杂的方法,用于处理分布没有明显聚类的数据(对于球状、高斯分布、轻度不相交的数据分布,可以找到正确数量的 k )。

差距统计

缺口统计量k 的不同值的总体组内变异与数据的零参考分布下的预期值进行比较。最佳聚类的估计将是最大化间隙统计的值(,即,其产生最大的间隙统计)。这意味着聚类结构远离点的随机均匀分布。

gap_stat <- clusGap(mammals_scaled, FUN = kmeans, nstart = 30, K.max = 24, B = 50)fviz_gap_stat(gap_stat) + theme_minimal() + ggtitle("fviz_gap_stat: Gap Statistic")

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

gap stats 图按聚类数( k )显示统计数据,标准误差用垂直线段绘制,最佳值 k 用垂直蓝色虚线标记。根据这一观察 k = 2 是数据中聚类的最佳数量。

剪影法

另一种有助于确定最佳聚类数的可视化方法称为剪影法。平均轮廓法计算不同 k 值的观测值的平均轮廓。最佳聚类数 k 是在一系列可能的 k 值上使平均轮廓最大化的聚类数。****

fviz_nbclust(mammals_scaled, kmeans, method = "silhouette", k.max = 24) + theme_minimal() + ggtitle("The Silhouette Plot")

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

这也表明 2 个集群是最佳的。

平方和法

另一种聚类验证方法是通过最小化类内平方和(衡量每个类紧密程度的指标)和最大化类间平方和(衡量每个类与其他类的分离程度的指标)来选择最佳的类数。

ssc <- data.frame(
  kmeans = c(2,3,4,5,6,7,8),
  within_ss = c(mean(km2$withinss), mean(km3$withinss), mean(km4$withinss), mean(km5$withinss), mean(km6$withinss), mean(km7$withinss), mean(km8$withinss)),
  between_ss = c(km2$betweenss, km3$betweenss, km4$betweenss, km5$betweenss, km6$betweenss, km7$betweenss, km8$betweenss)
)ssc %<>% gather(., key = "measurement", value = value, -kmeans)#ssc$value <- log10(ssc$value)ssc %>% ggplot(., aes(x=kmeans, y=log10(value), fill = measurement)) + geom_bar(stat = "identity", position = "dodge") + ggtitle("Cluster Model Comparison") + xlab("Number of Clusters") + ylab("Log10 Total Sum of Squares") + scale_x_discrete(name = "Number of Clusters", limits = c("0", "2", "3", "4", "5", "6", "7", "8"))

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

根据这一测量,似乎 7 个集群将是合适的选择。

NbClust

NbClust 包提供了 30 个指数,用于确定相关的聚类数,并从通过改变聚类数、距离度量和聚类方法的所有组合获得的不同结果中向用户建议最佳聚类方案。

res.nbclust <- NbClust(mammals_scaled, distance = "euclidean",
                  min.nc = 2, max.nc = 9, 
                  method = "complete", index ="all")factoextra::fviz_nbclust(res.nbclust) + theme_minimal() + ggtitle("NbClust's optimal number of clusters")

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

这表明聚类的最佳数目是 3。

克鲁斯特里

上面统计方法产生一个分数,该分数每次只考虑一组聚类。 clustree R 软件包采用了另一种方法,即考虑样本如何随着聚类数量的增加而改变分组。这有助于显示哪些聚类是独特的,哪些是不稳定的。它没有明确地告诉你哪一个选择是最优集群,但是它对于探索可能的选择是有用的。

让我们来看看 1 到 11 个集群。

tmp <- NULL
for (k in 1:11){
  tmp[k] <- kmeans(mammals_scaled, k, nstart = 30)
}df <- data.frame(tmp)# add a prefix to the column names
colnames(df) <- seq(1:11)
colnames(df) <- paste0("k",colnames(df))# get individual PCA
df.pca <- prcomp(df, center = TRUE, scale. = FALSE)ind.coord <- df.pca$x
ind.coord <- ind.coord[,1:2]df <- bind_cols(as.data.frame(df), as.data.frame(ind.coord))clustree(df, prefix = "k")

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

在该图中,每个节点的大小对应于每个聚类中的样本数,并且箭头根据每个聚类接收的样本数来着色。一组独立的箭头,透明的,称为输入节点比例,也是彩色的,显示了一个组中的样本如何在另一个组中结束——聚类不稳定性的指标。

在这个图中,我们看到,当我们从 k=2 移动到 k=3 时,来自观察者左侧群集的许多物种被重新分配到右侧的第三个群集。当我们从 k=8 移动到 k=9 时,我们看到一个节点具有多个传入边,这表明我们过度聚集了数据。

将这个维度覆盖到数据中的其他维度上也是有用的,特别是那些来自降维技术的维度。我们可以使用 clustree_overlay() 函数来实现:

df_subset <- df %>% select(1:8,12:13)clustree_overlay(df_subset, prefix = "k", x_value = "PC1", y_value = "PC2")

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

我更喜欢从侧面看,显示 x 或 y 维度中的一个相对于分辨率维度。

overlay_list <- clustree_overlay(df_subset, prefix = "k", x_value = "PC1",
                                 y_value = "PC2", plot_sides = TRUE)overlay_list$x_sideoverlay_list$y_side

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

这表明,我们可以通过检查边缘来指示正确的聚类分辨率,并且我们可以通过过多的信息来评估聚类的质量。

选择合适的算法

如何选择合适的聚类算法? cValid 包可用于同时比较多个聚类算法,以确定最佳聚类方法和最佳聚类数。我们将比较 k-means、层次聚类和 PAM 聚类。

intern <- clValid(mammals_scaled, nClust = 2:24, 
              clMethods = c("hierarchical","kmeans","pam"), validation = "internal")# Summary
summary(intern) %>% kable() %>% kable_styling()Clustering Methods:
 hierarchical kmeans pam 

Cluster sizes:
 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 

Validation Measures:
                                 2       3       4       5       6       7       8       9      10      11      12      13      14      15      16      17      18      19      20      21      22      23      24

hierarchical Connectivity   4.1829 10.5746 13.2579 20.1579 22.8508 25.8258 32.6270 35.3032 38.2905 39.2405 41.2405 45.7742 47.2742 50.6075 52.6075 55.8575 58.7242 60.7242 63.2242 65.2242 67.2242 69.2242 71.2242
             Dunn           0.3595  0.3086  0.3282  0.2978  0.3430  0.3430  0.4390  0.4390  0.5804  0.5938  0.5938  0.8497  0.8497  0.5848  0.5848  0.4926  0.9138  0.9138  0.8892  0.9049  0.9335  1.0558  2.1253
             Silhouette     0.5098  0.5091  0.4592  0.4077  0.4077  0.3664  0.3484  0.4060  0.3801  0.3749  0.3322  0.3646  0.3418  0.2650  0.2317  0.2166  0.2469  0.2213  0.1659  0.1207  0.1050  0.0832  0.0691
kmeans       Connectivity   7.2385 10.5746 15.8159 20.1579 22.8508 25.8258 33.5198 35.3032 38.2905 39.2405 41.2405 45.7742 47.2742 51.8909 53.8909 57.1409 58.7242 60.7242 63.2242 65.2242 67.2242 69.2242 71.2242
             Dunn           0.2070  0.3086  0.2884  0.2978  0.3430  0.3430  0.3861  0.4390  0.5804  0.5938  0.5938  0.8497  0.8497  0.5866  0.5866  0.5725  0.9138  0.9138  0.8892  0.9049  0.9335  1.0558  2.1253
             Silhouette     0.5122  0.5091  0.4260  0.4077  0.4077  0.3664  0.3676  0.4060  0.3801  0.3749  0.3322  0.3646  0.3418  0.2811  0.2478  0.2402  0.2469  0.2213  0.1659  0.1207  0.1050  0.0832  0.0691
pam          Connectivity   7.2385 14.1385 17.4746 24.0024 26.6857 32.0413 33.8913 36.0579 38.6607 40.6607 42.7869 45.7742 47.2742 51.7242 53.7242 56.9742 58.7242 60.7242 62.7242 64.7242 66.7242 69.2242 71.2242
             Dunn           0.2070  0.1462  0.2180  0.2180  0.2978  0.2980  0.4390  0.4390  0.4390  0.4390  0.4390  0.8497  0.8497  0.5314  0.5314  0.4782  0.9138  0.9138  0.8333  0.8189  0.7937  1.0558  2.1253
             Silhouette     0.5122  0.3716  0.4250  0.3581  0.3587  0.3318  0.3606  0.3592  0.3664  0.3237  0.3665  0.3646  0.3418  0.2830  0.2497  0.2389  0.2469  0.2213  0.1758  0.1598  0.1380  0.0832  0.0691

Optimal Scores:

             Score  Method       Clusters
Connectivity 4.1829 hierarchical 2       
Dunn         2.1253 hierarchical 24      
Silhouette   0.5122 kmeans       2

连通性和轮廓都是连通性的度量,而邓恩指数是不在同一聚类中的观测值之间的最小距离与最大聚类内距离的比率。

提取聚类的特征

**如前所述,很难评估聚类结果的质量。我们没有真正的标签,所以不清楚如何在内部验证方面衡量"它实际上有多好。但是,集群是一个很好的 EDA 起点,可以用来更详细地探索集群之间的差异。把聚类想象成制造衬衫尺寸。我们可以选择只做三种尺寸:小号中号大号。我们肯定会削减成本,但并不是每个人都会非常适应。想想现在的裤子尺码(或者有很多尺码的衬衫品牌(XS、XL、XXL、等)。你有更多的类别(或集群)。对于某些领域,最佳集群的选择可能依赖于一些外部知识,如生产 k 个集群以满足客户的最佳需求的成本。在其他领域,如生物学,你试图确定细胞的准确数量,需要一个更深入的方法。例如,上面的许多试探法在群集的最佳数量上互相矛盾。请记住,这些都是在不同数量的 k 处评估 k 均值算法。这可能意味着 k 均值算法失败,并且没有 k 是好的。 k-means 算法不是一个非常健壮的算法,它对异常值非常敏感,而且这个数据集非常小。最好的办法是在其他算法的输出上探索上述方法(例如 clValid 建议的层次聚类),收集更多的数据,或者如果可能的话花一些时间为其他 ML 方法标记样本。

最终,我们想回答这样的问题:“是什么让这个集群与众不同?”以及“彼此相似的集群是什么”。让我们选择五个集群,并询问这些集群的特征。

# Compute dissimilarity matrix with euclidean distances
d <- dist(mammals_scaled, method = "euclidean")# Hierarchical clustering using Ward's method
res.hc <- hclust(d, method = "ward.D2" )# Cut tree into 5 groups
grp <- cutree(res.hc, k = 5)# Visualize
plot(res.hc, cex = 0.6) # plot tree
rect.hclust(res.hc, k = 5, border = 2:5) # add rectangle

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

# Execution of k-means with k=5
final <- kmeans(mammals_scaled, 5, nstart = 30)fviz_cluster(final, data = mammals_scaled) + theme_minimal() + ggtitle("k = 5")

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

让我们提取聚类并将它们添加回初始数据,以便在聚类级别进行一些描述性统计:

as.data.frame(mammals_scaled) %>% mutate(Cluster = final$cluster) %>% group_by(Cluster) %>% summarise_all("mean") %>% kable() %>% kable_styling()

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

我们看到仅由兔子组成的簇 2 具有高灰分含量。由海豹和海豚组成的第 3 组脂肪含量高,这在如此寒冷的气候下有着苛刻的要求,而第 4 组含有大量的乳糖。

mammals_df <- as.data.frame(mammals_scaled) %>% rownames_to_column()cluster_pos <- as.data.frame(final$cluster) %>% rownames_to_column()
colnames(cluster_pos) <- c("rowname", "cluster")mammals_final <- inner_join(cluster_pos, mammals_df)ggRadar(mammals_final[-1], aes(group = cluster), rescale = FALSE, legend.position = "none", size = 1, interactive = FALSE, use.label = TRUE) + facet_wrap(~cluster) + scale_y_discrete(breaks = NULL) + # don't show ticks
theme(axis.text.x = element_text(size = 10)) + scale_fill_manual(values = rep("#1c6193", nrow(mammals_final))) +
scale_color_manual(values = rep("#1c6193", nrow(mammals_final))) +
ggtitle("Mammals Milk Attributes")

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

mammals_df <- as.data.frame(mammals_scaled)
mammals_df$cluster <- final$cluster
mammals_df$cluster <- as.character(mammals_df$cluster)ggpairs(mammals_df, 1:5, mapping = ggplot2::aes(color = cluster, alpha = 0.5), 
        diag = list(continuous = wrap("densityDiag")), 
        lower=list(continuous = wrap("points", alpha=0.9)))

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

# plot specific graphs from previous matrix with scatterplotg <- ggplot(mammals_df, aes(x = water, y = lactose, color = cluster)) +
        geom_point() +
        theme(legend.position = "bottom")
ggExtra::ggMarginal(g, type = "histogram", bins = 20, color = "grey", fill = "blue")b <- ggplot(mammals_df, aes(x = protein, y = fat, color = cluster)) +
        geom_point() +
        theme(legend.position = "bottom")
ggExtra::ggMarginal(b, type = "histogram", bins = 20, color = "grey", fill = "blue")

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

ggplot(mammals_df, aes(x = cluster, y = protein)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = fat)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = lactose)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = ash)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = water)) + 
        geom_boxplot(aes(fill = cluster))

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

# Parallel coordiante plots allow us to put each feature on seperate column and lines connecting each columnggparcoord(data = mammals_df, columns = 1:5, groupColumn = 6, alphaLines = 0.4, title = "Parallel Coordinate Plot for the Mammals Milk Data", scale = "globalminmax", showPoints = TRUE) + theme(legend.position = "bottom")

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

如果你觉得这篇文章有用,请随意与他人分享或推荐这篇文章!😃

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值