TowardsDataScience 博客中文翻译 2021(二十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

4 最新的图像数据增强技术

原文:https://towardsdatascience.com/4-up-to-date-techniques-for-image-data-augmentation-5bdf34ace063?source=collection_archive---------41-----------------------

想把你的精确度再提高一点吗?

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

图一。演示不同的图像增强技术。从https://arxiv.org/abs/1905.04899检索的图像。

数据扩充是几乎每个机器学习工程师用来提高结果的技巧。翻转图像等简单技巧可以轻松获得图像分类模型的百分之几的准确度,而无需进行太多的微调。

然而,这些简单的技术,如翻转、旋转和抖动图像,并不是我们今天要讨论的内容。相反,我们将讨论在深度学习时代引入的 4 种非正统技术,这些技术在改善图像相关任务(如分类、检测和分割)方面表现出了巨大的潜力。请做好准备,因为这些增强技术中的一些可能看起来太过奇怪而不真实!

1.断流器

剪切可能是本文介绍的四种技术中最直观的一种。目标是“切掉”图像的一部分,并将剩余部分用作具有相同标签的新图像数据(见图 1)。由于增强技术,如抖动和添加颜色,使图像更具挑战性,已被证明是有益的,它应该没有什么不同的方法剪切工作。

2.混合

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

图二。图像混合的简单可视化。图片作者。

2017 年推出的这种数据增强策略非常简单,乍一看常常会怀疑它的能力。张等人在他们的论文中首先提出了这种技术:我们对两幅图像进行插值,然后我们插值相应的标签作为新的标签。

通过在不同数据集上的大量测试,我们实际上可以看到这种简单的技术提高了各种模型主干的性能。结果被推测是由于在数据集上创建的软标签混合,使得在训练期间可以看到更广泛的数据分布。

边注:这里 我还有一篇关于实现 Mixup 的文章。

3.剪切混合

现在,如果你对 mixup 的工作感到惊讶,你会惊叹于 CutMix 工作得更好!Yun 等人决定将一幅图像的一部分剪切并粘贴到另一幅图像上,而不是将每个像素混合在一起,剪切-粘贴比率用作生成图像的新标签(见图 1)。同样,这种技术非常简单,易于实现,但在处理图像分类任务时却非常强大。

另外,最近的论文attention cut mix引入了 attentive feature map 来决定在哪里剪切和粘贴,这显示了更好的效果。

4.复制并粘贴

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

图 3。复制粘贴演示。图片来自 https://arxiv.org/abs/2012.07177 的

Ghiasi 等人决定将 CutMix 的成功转移到实例分割中,方法是将一个实例从一个图像随机复制到另一个图像,以允许图像将其正确分割出来。同样,研究结果表明,这种增强技术在提高性能方面非常有效。

自己测试

使用 PyTorch 之类的框架测试所有这些数据扩充技术非常简单。人们可以容易地改变数据加载器内的图像和相应的标签,以实现所有上述数据扩充技术。

然而,由于我们必须深入研究数据加载器,所以我们不能直接使用 PyTorch 提供的数据加载器。我发现一个有用的平台是 Graviti Open Dataset 平台,它连接到许多学术上著名的数据集(例如,CIFAR10、ImageNet),这样就不需要查看哪些数据集经常用于特定任务。我还会推荐 PyTorch 的教程,当你添加你的扩充时。

结论

所以你有它!希望这些增加了一些你可以玩的技巧来提升你的图像模型到一个新的水平!

感谢您坚持到现在🙏*!* 我会在计算机视觉/深度学习的不同领域发布更多内容,所以 加入并订阅 如果你有兴趣了解更多!

您应该考虑参加的 4 个即将到来的数据科学活动

原文:https://towardsdatascience.com/4-upcoming-data-science-events-you-should-consider-attending-93160bdae0ab?source=collection_archive---------21-----------------------

April 有很多东西要学。

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

萨曼莎·博尔热斯在 Unsplash 拍摄的照片

自从一年多前 COVID 袭击以来,我们都被困在家里,不能去工作,上学,娱乐,或参加娱乐或教育活动。尽管被困在室内在很多层面上都是不好的,但一直呆在室内还是有一些好处的。COVID 迫使大学和活动举办者在网上组织和举办他们的活动,允许来自世界各地的人参加——包括否则无法参加这些活动的人。

是的,COVID 之前的一些活动在活动期间提供在线流媒体,但不是全部。现在,几乎所有的活动都在网上进行,而且大多数都是免费或收取少量费用的。

现在有这么多很棒的网络研讨会、会议和虚拟活动,有时候我真希望能全部参加。我是说,你永远学不完东西!但是,我知道我不能参加所有的活动,主要是因为时间限制。

</6-machine-learning-certificates-to-pursue-in-2021-2070e024ae9d>

因此,我决定浏览本月所有与数据科学相关的活动,并选择我认为非常有利于参加的四个活动,我想与您分享这些活动,以防您正在寻找好的活动来关注和学习新的东西,或者只是与社区进行社交。

№1:数据科学高级计算研讨会

4 月 9 日和 10 日

由南康涅狄格州立大学计算机科学系提供的这是一个为期两天的系列讲座,重点是高级计算在数据科学领域的应用。高级计算在数据科学的各个领域都有许多应用,包括机器学习、大数据、计算机版本和数据挖掘。

这些为期两天的研讨会讲座包括深度学习及其在人工智能中的应用、智能数据分析在建筑中的应用、数字数据如何在医疗保健中发挥重要作用以及敏捷数据科学背后的科学。

参加本次活动没有要求或注册费,将有利于任何人在数据科学或感兴趣的数据科学。无论你是学习数学、计算机科学、商业还是教育,在这个为期两天的活动中,你都会有所收获。

№2: AI 与 AI 为善

4 月 15 日

哈佛大学的数据科学倡议提供了一个伟大的演讲,作者是来自微软人工智能优秀研究实验室的胡安·m·拉维斯塔·费雷斯。人工智能近年来一直是热门话题之一,许多人对它的使用及其伦理方面持怀疑态度。

AI for Good lab 团队专注于应用数据科学概念、机器学习和人工智能来解决人类最具挑战性的问题。文化遗产、健康、司法改革、守法等问题。在这次演讲中,演讲者将带你了解他们所做的研究类型,他们所解决的问题,以及他们希望对社会产生的影响。

本次网络研讨会免费参加,通过注册本次网络研讨会,您将能够收到一份录音,以防因时差原因无法现场参加。

</5-online-data-science-courses-you-can-start-now-748e4a2b5403>

№3:2021 年数据科学日

4 月 22 日

每年,哥伦比亚大学数据科学研究所都会举办一个关于数据科学的活动,即数据科学日。今年,该活动将完全虚拟化,并将以不同的主题演讲、闪电演讲和关于数据科学一切的互动海报会议为特色。

这一天将包括讨论用于设计和自动化的人工智能工具,人类和机器如何共同努力建设更美好的未来,将大数据应用于不同领域的基本挑战,以及构建和实施大规模图形算法。

在我看来,这一天最精彩的部分将是互动海报会议,在这里,你将有机会了解数据科学研究的最新进展,并与来自世界各地的伟大研究人员接触。这项活动的门票不是免费的,但它只收取 20 美元的小额费用。

№4:数据科学&未来博览会和会议的 AI 领袖

4 月 24 日-25 日

这份名单上的最后一项活动是由佐治亚理工学院、加州大学伯克利分校、UT 奥斯汀分校和卡内基梅隆大学提供和组织的数据科学和人工智能明日领袖会议。这项活动将由大型科技公司赞助,如脸书、微软、谷歌和英伟达。

本次会议的重点是主办大学的研究人员和学生展示他们在数据科学领域的最新工作。不仅如此,在演讲之间,还会有来自行业的专业人士就今年的会议主题发表演讲,主题是数据科学和人工智能的多样化应用。

这次会议将是一个为期一天半的活动,充满了教育讲座,社交和该领域的最新进展。这个会议是免费的。

外卖食品

参加教育活动、讲座和会议是任何领域的任何人拓宽人脉、参与社区活动和结识志同道合者的主要途径。但是最近出去认识新的人,讨论研究或者仅仅是最近的技术进步并不是一个选择——希望这很快会改变。

</6-nlp-techniques-every-data-scientist-should-know-7cdea012e5c3>

所以,现在,如果我们想“认识”新朋友,我们必须虚拟地去做,因为科学不会因为任何事情而停止,它将继续前进,我们必须跟上它。幸运的是,一旦 COVID 来袭,许多大学、学院和组织者决定将他们为学生提供的所有活动扩展到任何地方任何想学习新事物的人。

这一令人惊叹的机会让世界各地的每个人,无论他们的教育背景如何,都参加了他们感兴趣的活动,这些活动是他们因为资金和地点原因而无法参加的。否则,无论我们在世界的哪个角落,我们都可以向最优秀的人学习。

在本文中,我提出了 4 个即将举行的数据科学相关活动,我个人将会参加,希望您也能考虑参加。

每个数据科学家都应该知道的 4 种使用情形

原文:https://towardsdatascience.com/4-use-cases-every-data-scientist-should-know-49dccd4d533f?source=collection_archive---------29-----------------------

意见

如何处理常见机器学习算法问题的示例

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

Icons8 团队Unsplash【1】上的照片。

目录

  1. 介绍
  2. 信用卡欺诈检测
  3. 客户细分
  4. 客户流失预测
  5. 销售预测
  6. 摘要
  7. 参考

介绍

如果您是一名资深的数据科学家,您可能已经看到了其中的一些用例,但是,如果您是相当新的,这些用例可以让您实践各种数据科学概念,这些概念可以进一步应用于多个行业。不幸的是,数据科学用例通常不会在公司中很快得到很好的开发,相反,用例将根据项目的需求和期望经过几次会议来构建。重要的是要有一种通用用例的感觉,这种感觉可以被调整并应用到更新的用例中,因为有时,你会遇到文章中没有提到或大学没有研究过的全新场景。然而,数据科学的美妙之处在于,它是可扩展的,并且只需要相对较少的工作量就可以应用于多个问题。话虽如此,让我们检查四个用例,您可以直接应用到您的工作中,也可以调整用于未来的应用程序,包括模型的可能功能,以及所使用的算法本身。

信用卡欺诈检测

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

埃弗里·埃文斯在Unsplash【2】上拍照。

在本例中,我们将构建一个受监督的模型,其分类为fraudno fraud。理想情况下,在你的数据集中,你会有很多欺诈看起来像什么看起来不像的例子。下一步是获取或创建几个描述欺诈行为以及正常行为的特征,这样算法就可以轻松区分这两种标签。

以下是您可以在随机森林算法中使用的功能:

  • 货币金额
  • 频率
  • 位置
  • 日期
  • 交易描述
  • 交易类别

以下是在获得训练和测试数据集后可以使用的示例代码:

RF = RandomForestClassifier()RF.fit(X_train, y_train)predictions = RF.predict(X_test)

你可以从几个功能开始,然后努力构建新的功能,例如,aggregatesper功能(例如:每天花费的钱,等等。)

客户细分

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

照片由粘土堤un splash【3】上拍摄。

与上面的例子相反,这个场景将使用无监督学习,而不是分类,使用聚类。典型的聚类算法是 K-Means 。这个问题不受监督的原因是因为您没有标签,并且您不知道要对什么进行分组,但是您会希望根据新组的共享特征来找到新组的模式。在本例中,使用该模型的具体原因是,您想要找到购买某些产品的人的模式。这样,你就可以为这些客户设计一个有针对性的营销活动。

以下是您可以在 K 均值算法中使用的可能特征:

  • 购买的产品
  • 他们的位置
  • 产品或商家位置
  • 消费频率
  • 产品工业
  • 教育
  • 收入
  • 年龄

以下是获得数据和要素后可以使用的示例代码:

kmeans = KMeans(
         init="random",
         n_clusters=6
         )kmeans.fit(X)predictions = kmeans.fit_predict(X)

这种算法通常用于电子商务、商品销售以及任何有客户数据和营销的行业。

客户流失预测

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

Icons8 团队Unsplash【4】上的照片。

这种情况可以受益于各种机器学习算法。这个问题也类似于信用卡欺诈检测问题,我们希望收集带有预定义标签的客户的特征,特别是churnno-churn。您可以再次使用随机森林,或者不同的算法,例如 XGBoost 。因此,这个场景是一个使用监督学习的分类问题。我们将预测网站上购买了一种或多种产品的用户的客户流失。

以下是您可以在 XGBoost 算法中使用的功能:

  • 登录金额
  • 日期功能(月、周等。
  • 位置
  • 年龄
  • 产品历史
  • 产品多样性
  • 产品使用时间长度
  • 产品使用频率
  • 登录时间
  • 客户通过电子邮件发送给客户服务的金额
  • 客户与聊天机器人聊天的数量
  • 如果他们提到产品

这些特征可以表明某人是长期用户还是短期用户。一些功能,如推荐,将清楚地表明他们是否喜欢该产品,而产品多样性在分类中可能是任何一种方式,例如,如果他们购买了四种不同的产品,但确实多次使用它们。

以下是获得数据和要素后可以使用的示例代码:

model = XGBClassifier()model.fit(X_train, y_train)predictions = model.predict(X_test)

销售预测

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

照片由 M. B. M.Unsplash【5】拍摄。

也许与前三个用例最不同的是预测销售。在这个例子中,我们可以使用 深度学习 来预测某个产品的未来销量。使用的算法被称为 LSTM ,代表长短期记忆。

以下是您可以在 LSTM 算法中使用的功能:

  • 日期
  • 制品
  • 商人
  • 销售额

以下是获得数据和要素后可以使用的示例代码:

model = Sequential()model.add(LSTM(4, batch_input_shape=(1, X_train.shape[1], X_train.shape[2])))model.add(Dense(1))model.compile(loss='mean_squared_error')model.fit(X_train, y_train)predictions = model.predict(X_test)

摘要

本文展示了常见算法的常见用例,还涵盖了您可以使用数据科学解决的各种特定类型的问题。例如,我们研究了监督和非监督学习,以及另一种算法亚型,它使用深度学习进行预测。尽管这些都是特定的用例,但无论您的行业是医疗保健还是金融,您都可以将这些特性(中的子不同特性)和 Python 代码应用于您业务中的大多数数据科学问题。

总而言之,我们比较了涵盖各种算法的数据科学的四个用例:

* Credit Card Fraud Detection — using Random Forest* Customer Segmentation — using K-Means* Customer Churn Prediction — using XGBoost* Sales Forecasting — using LSTM

我希望你觉得我的文章既有趣又有用。如果您在这些用例中使用了机器学习算法,请随时在下面发表评论。你使用了不同于我举例的算法吗?为什么或为什么不?您还可以将其他哪些可以从示例算法中受益的用例组合在一起?

请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。感谢您的阅读!

参考

[1]图片由 Icons8 团队Unsplash 上拍摄,(2018)

[2]埃弗里·埃文斯在 Unsplash 上拍摄的照片,(2020)

[3]照片由粘土银行un splash(2019)拍摄

[4]图片由 Icons8 团队Unsplash 上拍摄,(2018)

[5]照片由 M. B. M.Unsplash(2018)上拍摄

2021 年你应该知道的 4 种有用的聚类方法

原文:https://towardsdatascience.com/4-useful-clustering-methods-you-should-know-in-2021-ac61301e968e?source=collection_archive---------17-----------------------

根据距离形成相似的观察组

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

凯利·西克玛在 Unsplash 上的照片

聚类分析的主要目的是通常基于 欧几里德 距离形成相似观察值的组(称为 )。在机器学习术语中,聚类是一个 无监督的 任务。今天,我们讨论 4 种有用的聚类方法,它们属于两个主要类别——层次聚类非层次聚类

在层次聚类下,我们将讨论 3 种聚集层次方法——单连锁完全连锁平均连锁。在非层次聚类方法下,我们将讨论 K-Means 聚类

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

(图片由作者提供)

我们在这里讨论的每种方法都是使用 Scikit-learn 机器学习库实现的。我还将为分层方法创建 树状图 ,以显示观察值之间的分层关系。阅读本文后,您将能够区分每种聚类方法,并使用真实数据集实现每种方法。

分层和非分层聚类

层次聚类 由一系列连续的合并组成。这里,我们不需要知道要查找的簇的数量。与 K-Means 聚类相比,这是层次聚类的一大优势。这种聚类方法可以应用于更小的数据集。使用层次聚类,我们不仅可以对观察值进行分组,还可以对变量进行分组。凝聚法如单连锁、完全连锁和平均连锁都是层次聚类的例子。

非层次聚类 不是由一系列连续的合并组成的。这里,应该在聚类之前指定聚类的数量。这种方法适用于大得多的数据集。使用非层次聚类,我们可以只对观察值进行分组。K-means 聚类是非层次聚类的一个例子。在 Scikit-learn 中,可以通过使用 KMeans() 类来实现。

凝聚方法

开始时,单个观察值被认为是凝聚方法中的主要聚类。然后,我们将最相似的对象组合成簇。通过考虑观察值之间的最小距离或最大相关性来找到最相似的对象。单个连接、完全连接和平均连接是聚集方法的例子。在 Scikit-learn 中,凝聚方法可以通过使用**college veclustering()类来实现。通过在该类内部定义联动:*{‘完全’,‘平均’,‘单一’}***超参数,可以建立基于单一联动、完全联动、平均联动的不同集聚模型。

分层方法

凝聚-单键

联动法中,我们结合观测值考虑了两个集合的所有观测值之间距离的最小*。*

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

单一链接(图片由作者提供)

凝聚—完全连锁

完成 联动的方法中,我们结合观测值考虑了 最大 的两组所有观测值之间的距离。

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

完整链接(图片由作者提供)

凝聚平均连锁

平均 联动法中,我们结合观测值考虑了 平均 两组各观测值的距离。

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

平均链接(作者图片)

履行

以下 Python 代码块解释了如何将完全链接方法实现到“鸢尾数据集”中,以找到鸢尾花的不同物种(簇)。为了可视化的目的,我们还应用主成分分析将 4 维虹膜数据减少为可以用 2D 图绘制的 2 维数据,同时保留原始数据中 95.8%的变化!

第一步:绘制树状图

在这里,我们绘制了完全连锁方法的树状图,以显示观察值之间的层次关系,并猜测聚类的数量。

等到加载 Python 代码!

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

层次聚类树状图(图片由作者提供)

通过查看树状图,可以更好地获得“Iris”数据的 3 簇解决方案。

步骤 2:获取分类标签

对于“Iris”数据中的每个观察,我们得到 3 个聚类标签(0、1 或 2)。

等到加载 Python 代码!

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

使用完全链接方法对“Iris”数据进行分类标签(图片由作者提供)

步骤 3:绘制聚类图

在主成分分析的帮助下,我们可以绘制“Iris”数据的 3 个聚类。

等到加载 Python 代码!

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

(图片由作者提供)

在散点图中,我们可以清楚地看到 3 个集群。事实上,鸢尾花实际上有 3 个品种,分别叫做 SetosaVersicolourVirginica ,我们发现的 3 个簇代表了它们!

非等级方法

K 均值聚类

k-means 聚类 中,算法试图将观察值分组到 k 组(簇)中,观察值数量大致相同。组数 k 应由用户指定为 超参数

要了解更多关于 K-means 聚类的工作原理、分步实现、目标和假设以及如何找到最优的聚类数(针对 k 的超参数调优),请阅读我的*动手 K-means 聚类帖子。***

履行

以下 Python 代码解释了如何对“鸢尾数据集”实施 K-means 聚类,以找到鸢尾花的不同种类(聚类)。为了可视化的目的,我们还应用主成分分析将 4 维虹膜数据减少为可以用 2D 图绘制的 2 维数据,同时保留原始数据中 95.8%的变化!

步骤 1:获取分类标签

使用 K-Means 方法,我们为“Iris”数据中的每个观察值获得 3 个聚类标签(0、1 或 2)。

等到加载 Python 代码!

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

使用 K-Means 方法对“Iris”数据进行聚类标签(图片由作者提供)

步骤 2:绘制聚类图

在主成分分析的帮助下,我们可以绘制“Iris”数据的 3 个聚类。

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

(图片由作者提供)

第三步:创建剪影图****

让我们看看我们发现的集群是平衡的(即,每个集群具有大致相同的观察数量)并且分离良好。为此,我们可以创建一个剪影图。想了解更多,请阅读我的动手 K-Means 聚类帖子。****

*******from yellowbrick.cluster import silhouette_visualizer
silhouette_visualizer(K_Means, X_pca, colors='yellowbrick')*******

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

剪影图— K-Means 方法(图片由作者提供)

该图包含每个簇的一个刀形。刀形的宽度表示集群中实例的数量。条形长度表示每个实例的轮廓系数。虚线表示平均轮廓分数。

我们可以看到我们发现的星团是。这是因为刀具形状的宽度大致相同。**

3 个集群中的大多数点具有大的轮廓值,并且向右延伸超过虚线,指示我们发现的集群是 良好分离的

摘要

聚类是一种有用的技术,可用于根据距离形成相似观察值的组。在机器学习术语中,聚类是一个 无监督的 任务。如果数据中的变量不是在相似的比例上测量的,则执行要素缩放是非常重要的。今天,我们讨论了 4 种不同的聚类方法,并用“Iris”数据实现了它们。Scikit-learn 提供了易于使用的函数来实现这些方法。

聚类分析有三个目标:

  1. 形成相似观察的组
  2. 为每个观察值分配聚类标签
  3. 找到每个集群的中心

第一个目标对于发现数据中的一些重要模式(如果有的话)非常有用。出于可视化的目的,我们可以使用主成分分析来降低数据的维度。

如果数据中没有指示标签的目标列,那么第二个目标对于获取每个观察的分类标签非常有用。这就是为什么聚类是一个 无监督 任务,其中数据中没有目标列。

第三个目标对于获得特定集群中观察值的平均度量非常有用。例如,一家服装厂计划设计一个新系列的衬衫。但是他们不知道适合大多数人的衬衫尺寸。他们有关于人体测量的数据。他们可以应用聚类技术,根据对这些人身体部位的具体测量,将他们分组。一旦找到聚类,他们可以使用聚类中心的值作为衬衫的尺寸。

聚类的主要挑战之一是找到最佳的聚类数。聚类算法本身并不学习最佳聚类数。我们必须在训练模型之前将其指定为超参数。用机器学习的术语来说,也叫 超参数调谐 。为此,我们可以尝试不同的可视化技术。有时,问题的领域知识将帮助您推断出正确的聚类数。要了解更多关于聚类中超参数调优的知识,我邀请您阅读我的动手 K-Means 聚类帖子。它将为你提供一步一步的指导。****

感谢阅读!

*本教程由Rukshan Pramoditha*,数据科学 365 博客作者设计创作。

在 https://rukshanpramoditha.medium.com 阅读我的其他文章

2021–03–30

Python 的 More-Itertools 库的 4 个有用函数

原文:https://towardsdatascience.com/4-useful-functions-of-the-more-itertools-library-for-python-6915a10781ce?source=collection_archive---------20-----------------------

使得使用 Python iterables 更加容易

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

照片由 Chor 曾Unsplash 上拍摄

Python 的 itertools 模块提供了几个函数,允许创建迭代器来执行高效的循环操作。

more-itertools 是一个 Python 库,为 iterables 带来了额外的功能。

我们将浏览 more-itertools 库的 5 个非常有用的函数,并查看演示如何使用它们的示例。

先简单解释一下 Python 中的可迭代器和迭代器。

  • iterable 是一个 Python 对象,它可以一次返回一个元素,比如列表和元组。iterable 对象有一个返回迭代器的__iter__方法。
  • 迭代器是一个拥有__next__方法的对象。我们可以把迭代器想象成一个表示数据流的对象。每次调用 next 方法时,迭代器都返回行中的下一个元素。因此,迭代器有一个在迭代过程中记住当前位置的状态。

这里有一个简单的例子来说明 iterable 和 iterator 之间的区别。

mylist = [3, 1, 4, 21, 13, 5]print(mylist)
[3, 1, 4, 21, 13, 5]

变量“mylist”是一个列表,所以它是可迭代的。

myiterator = iter(mylist)print(myiterator)
<list_iterator object at 0x000002C9E5860070>

当我们在“mylist”上应用iter函数时,我们得到一个迭代器对象。我们不能像打印可迭代的那样打印迭代器。但是我们可以得到下一个项目。

next(myiterator)
3next(myiterator)
1

我们还可以使用如下的循环来打印每个项目:

for i in myiterator:
    print(i)# output
4
21
13
5

当我们到达终点时它就停止了。如果我们现在调用下一个函数,我们会得到一个StopIteration错误。一旦我们到达一个迭代器的末尾,就是这样!我们不能从头开始。因此,从某种意义上说,迭代器是可任意使用的。

我们现在已经理解了什么时候可迭代和迭代器。让我们开始探索 more-itertools 库的伟大特性。

它可以很容易地通过 pip 安装。然后,我们只需要导入它。

# install from cmd
pip install more-itertools# install in jupyter notebook
pip install more-itertools

1.块状的

我们有一个需要分割成固定长度的小块的列表。有多种方法可以完成这个操作,但是使用chunked功能非常简单。

from more_itertools import chunkedmylist = [1,2,3,4,5,6,7,8,9,10]chunked_list = list(chunked(mylist, 3))chunked_list
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

chunked函数返回一个迭代器,使用list函数可以很容易地将它转换成一个列表。它接受要分块的列表和每个块的大小。

在我们的例子中,块大小是 3,所以最后一个块只剩下一个项目。

我们可以通过使用列表索引来访问块:

chunked_list[0]
[1, 2, 3]

2.变平

flatten函数接受嵌套的 iterable 并将它们转换成平面 iterable。例如,我们可以通过使用列表的列表来创建列表。

nested_list = [[1,4], [3,8], [1,10]]list(flatten(nested_list))
[1, 4, 3, 8, 1, 10]

类似地,我们可以使用嵌套元组列表和列表。

nested = [(5,2), (9,2), [1,5]]list(flatten(nested))
[5, 2, 9, 2, 1, 5]

3.最小最大值

minmax函数是一种快速找到 iterable 中的最小值和最大值的方法。

from more_itertools import minmaxmylist = [3, 1, 4, 21, 13, 5]minmax(mylist)
(1, 21)

它返回一个具有最小值和最大值的元组。

它还可以处理字符串,并根据字母顺序查找最小值和最大值。

mylist = ["A", "C", "Z", "M"]minmax(mylist)
('A', 'Z')

4.每个都是唯一的

假设我们有一组可重复项。unique_to_each函数给出了每个可迭代变量的唯一值。换句话说,这个函数返回的值只存在于相关的 iterable 中。

当我们做一个例子时,它会变得更加清楚。

from more_itertools import unique_to_eachA = ["John", "Jane"]
B = ["John", "Max"]
C = ["Jane", "Emily"]unique_to_each(A, B, C)
[[], ['Max'], ['Emily']]

列表 A 中的值是同样存在于列表 C 中的“John”和同样存在于列表 C 中的“Jane”。因此,列表 A 没有唯一的值。正如我们在输出中看到的,unique_to_each函数为列表 A 返回一个空列表。

列表 B 中的“Max”在任何其他列表中都不存在,因此它对于列表 B 是唯一的,我们也可以在输出中看到。

我们也可以在字符串上使用这个函数。请注意,字符串也是可迭代的。

unique_to_each("John","Jane")
[['o', 'h'], ['a', 'e']]

我们已经在 more-itertools 库中介绍了 4 个有用的函数。我强烈建议浏览一下这个库的文档,因为它有更多的功能。

文档组织得很好,因此您可以毫无问题地使用它。

你可以成为一名媒介会员来解锁我的作品的全部权限,以及媒介的其余部分。如果您使用以下链接,我将收取您的一部分会员费,无需您支付额外费用。

https://sonery.medium.com/membership

感谢您的阅读。如果您有任何反馈,请告诉我。

4 种可以减轻决策树过度拟合的有用技术

原文:https://towardsdatascience.com/4-useful-techniques-that-can-mitigate-overfitting-in-decision-trees-87380098bd3c?source=collection_archive---------12-----------------------

预修剪、后修剪和创建系综

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

照片由玛丽莎&埃里克Unsplash 上拍摄

过拟合 对于数据科学家来说,这是继缺失值和离群值之后的第二大问题。与其他机器学习模型相比,决策树中的过度拟合很容易发生,因为它们的学习算法可以产生大型复杂的决策树,这些决策树完全适合训练实例。一般来说,过度拟合是当学习算法完美地拟合训练数据但未能对新的看不见的数据(测试/验证数据)进行概括时发生的问题。在过度拟合中,模型正在记忆数据集中的噪声,并且未能学习数据中的重要模式。过度拟合会影响由不属于训练集的样本做出的预测的准确性(或任何其他模型评估矩阵)。

人们可以在训练数据上以 100%的准确度建立完美的决策树模型,但是在测试数据上的准确度非常低。看看下面的 Python 代码,它在“heart _ disease”数据集上构建了这样一个决策树模型。

代码片段 1:决策树基础模型(等到加载!)

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

输出 1(图片由作者提供)

正如您在输出中看到的,训练准确率为 100%,测试准确率为 71%,远低于训练准确率。所以,很明显我们的决策树模型是过拟合的。在本文中,我们将使用这个模型作为基础模型以便与其他模型进行比较。

有很多可用的通用技术可以减轻或防止机器学习模型中的过拟合问题。然而,在本文中,我们将讨论 4 种特定于决策树的技术。

**注:**如果你想了解更多关于使用决策树进行回归任务的知识,请阅读我写的这篇文章。但是,这并不是今天内容的前提。

技术概述

这里是我们将在本帖中讨论的技术的概述。

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

(图片由作者提供)

决策树剪枝的一般思想

在一般情况下,修剪是指移除树木或植物的特定部分以促进其生长的过程。同样的事情也适用于决策树,它不是真正的树,而是机器学习模型。在决策树中,修剪是用于控制或限制树的深度(大小)的过程。默认情况下,创建决策树模型超参数是为了将树扩展到其最大深度。这些树被称为 成年树 ,它们总是过度生长。然而,我们可以调整这些超参数来生成没有完全生长和没有过度拟合的树!

有两种类型的修剪技术:预修剪后修剪

预修剪

预剪枝是一个早期停止规则,在早期停止决策树的生长。它会生成一棵分枝较少的树。可以通过调整 Scikit-learn**decision tree classifier()decision tree regressor()**类中的以下超参数来应用预修剪。这些超参数指定了停止条件的阈值。

  • max_depth: 指定树的最大深度。这控制了分支的复杂性(即进行分割的次数)。如果 None (默认),则节点被扩展,直到所有叶子都是纯的(即以 100%的准确度拟合模型)。减小该值可以防止过度拟合。
  • min_samples_leaf: 决定一个叶节点需要的最小样本数。默认值为 1。增加该值可以防止过度拟合。
  • min_samples_split: 指定分割内部节点所需的最小样本数。默认值为 2。如果我们将它的值设置为 5,那么不允许对具有 5 个或更少样本的节点进行进一步的分割。

这些超参数中, max_depth 是最重要的一个。我们可以通过单独调整 max_depth 超参数轻松地对决策树进行预修剪。现在,我们将看到单独使用 max_depth 的影响,同时保持其他预修剪超参数的默认值。

技术 1:单独调整 max_depth,观察单个超参数的影响

在不进行网格搜索或随机搜索的情况下,找出单个 max_depth 超参数对训练和测试数据的影响有时是有用的。验证曲线是一种非常有用的技术,可用于测量单个超参数的影响。以下代码使用上述决策树基本模型创建验证曲线。请注意,下面的代码是从代码片段 1(见上文)开始的。

代码片段 2:绘制 max_depth 的影响(等到加载!)

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

输出 2(图片由作者提供)

注意,在图中,训练集的准确度分数被标记为“训练分数”,测试集的准确度分数被标记为“交叉验证分数”。在 max_depth 值为 3 时,模型正好合适(不会过拟合或欠拟合)。该模型非常适合训练数据,并且还可以推广到新的未见过的数据。让我们再次构建决策树,但现在使用 max_depth=3 ,并将预测与基础模型的预测进行比较。

代码片段 3:创建 max_depth=3 的决策树(等到加载!)

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

输出 3(图片由作者提供)

与基本模型相比,测试精度从 0.71 提高到 0.74。除此之外,假阴性的数量(将真正的心脏病患者归类为非心脏病患者——这要危险得多!)已显著减少。因此,模型按照我们想要的方式运行。

**注:**如果你想了解更多关于绘制和解释验证曲线的知识,请阅读我写的这篇文章

技术 2:一次调优多个超参数

有时,单独调整单个超参数可能效率不高。另一种预修剪技术是寻找多个超参数值的新组合,以减轻过拟合。在这种情况下,不能使用验证曲线,因为它被设计用于绘制单个超参数的影响。这里,我们可以使用网格搜索结合交叉验证来一次调优多个超参数。下面的代码使用上面的基本模型执行交叉验证的超参数调整。请注意,下面的代码是从代码片段 1(见上文)开始的。

代码片段 4:一次调优多个超参数(等到加载!)

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

输出 4(图片由作者提供)

与基础模型和之前的 max_depth=3 模型相比,测试精度有了显著提高。除此之外,假阳性和假阴性都大大减少了。现在,我们的模型没有过度拟合,测试数据的性能也得到了提高。

**注:**如果你想了解更多关于 k-fold 交叉验证和超参数调优技术的知识,请阅读我写的这篇帖子

修剪后

后剪枝技术允许完整地增长决策树,然后删除它的一部分。

技巧 3: 成本复杂度剪枝

成本复杂度剪枝(ccp) 是后剪枝技术的一种。它提供了另一个控制树大小的选项。这可以通过为 alpha 找到正确的值来实现,该值在 Scikit-learn 决策树类中通常被称为 ccp_alphaCCP _ 阿尔法的值越大,修剪的节点数量越多。默认情况下,该值为零,表示不执行修剪。

sci kit-learndecision tree classifier类提供了一个名为cost _ complexity _ pruning _ path的方法,该方法返回一个类似字典的对象,该对象包含 alpha 的有效值(通过CCP _ 阿尔法属性访问)以及在修剪过程的每一步子树的相应杂质(通过杂质属性访问)。我们可以通过执行以下命令来获得基础决策树模型的 alpha 值:

path = dtclf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas
ccp_alphas

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

输出 5(图片由作者提供)

现在,我们可以使用这些阿尔法值来修剪我们的决策树。通过循环遍历CCP _ 阿尔法值数组,我们将每个阿尔法值传递给决策树分类器CCP _ 阿尔法值超参数,然后计算每次迭代的训练和测试准确度分数,并将它们存储在两个列表中。

代码片段 5(等待加载!)

然后,我们绘制训练和测试准确度分数。

代码片段 6:绘制 ccp 阿尔法值与精确度的关系图(等待加载!)

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

输出 6(图片由作者提供)

通过查看该图,我们可以决定减轻决策树模型中过度拟合的最佳 alpha 值是 0.06

现在,我们通过设置CCP _ 阿尔法=0.06 再次创建决策树。

代码片段 7:创建一个 ccp 阿尔法=0.06 的决策树(等到加载!)

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

输出 7(图片由作者提供)

与基本模型相比,测试精度从 0.71 提高到 0.77。除此之外,假阳性和假阴性都减少了!现在,我们的模型没有过度拟合,测试数据的性能也有所提高。

我们可以想象修剪后的决策树。

代码片段 8:可视化决策树(等到加载!)

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

输出 8(图片由作者提供)

现在,我们意识到后期修剪是在幕后进行的,因此如果我们选择第二个大的 alpha 值(或更接近的值),树会以自下而上的方式进行修剪,直到最大深度为 2。CCP _ 阿尔法值越大,修剪的节点数越多!

**注:**如果你想了解更多可视化决策树的不同方法,请阅读我写的这篇文章

创建合奏

另一种减少决策树过度拟合的技术是从训练数据和特征的子集创建多个决策树。这些树的集合称为系综(群)。

技术 4:创建随机森林

随机森林顾名思义,就是决策树的集合体。一个随机森林中的不相关决策树的大集合可以产生比任何单个决策树更准确和稳定的结果。在正常的决策树中,当算法想要分割一个节点时,它从所有特征中搜索最佳特征*。相反,随机森林中的每棵树都从特征的随机子集中搜索最佳特征。当在随机森林中种植树木时,这会产生额外的随机性。*

**注:**如果你想了解更多关于随机森林的知识,请看我写的这个帖子

下面的代码创建了一个包含 100 棵决策树的随机森林。

代码片段 9:创建一个有 100 棵树的随机森林(等待加载!)

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

输出 9(图片由作者提供)

即使不调整任何超参数,随机森林模型也比基本模型表现得好!但是,这个模型仍然是过度拟合的。建议应用一些超参数调整技术来进一步减轻过拟合。

摘要

我们今天讨论的所有技术只能减轻决策树中的过度拟合,但是它们不能完全防止过度拟合的问题。决策树是其他基于树的学习器的基础学习器,例如 Random Forest,XGBoost。因此,我们今天讨论的技术几乎也可以应用于那些基于树的学习者。

决策树中的过度拟合很容易发生。正因为如此,决策树很少在建模任务中单独使用。但是,如果您应用适当的超参数调整技术或使用多棵树进行集成,您可以减轻决策树中的过度拟合,甚至在模型构建任务中单独使用它们。

我们在这里使用的模型评估指标是**“准确性”**指标,当目标变量具有 类别不平衡 时,这不是最佳选择。我们可以检查我们的“心脏病”数据集的目标变量是否有类别不平衡:

import seaborn as sns
sns.catplot("target", data=df, kind="count",
            aspect=1.0, height=4)

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

(图片由作者提供)

在我们的目标变量中没有明显的阶级不平衡。

**注:**sci kit-learn 中使用的模型评估指标和评分方法的完整列表可在此处找到

感谢阅读!

在 https://rukshanpramoditha.medium.com阅读我的其他文章

除封面图片外的所有图片、代码示例、图表及所有内容均归作者版权所有。特别感谢 Unsplash 上的玛丽莎&埃里克是封面图片的所有者。非常感谢你,玛丽莎&埃里克,为我提供了一张出色的封面图片!

2021–05–16

为数据科学选择业务用例的 4 个重要提示

原文:https://towardsdatascience.com/4-vital-tips-for-choosing-a-business-use-case-for-data-science-bf9343b6ef18?source=collection_archive---------49-----------------------

根据 Gartner 的数据,到 2022 年,只有 20%的数据科学项目带来业务成果。因此,应用数据科学是一项有前途但有风险的工作。

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

米利安·耶西耶在 Unsplash 上拍摄的照片

电子邮件、社交媒体内容、应用程序日志、图像——鉴于我们每天生成的数据量和多样性,利用这些数据自然就像是应对任何业务挑战的良方。这种心态很容易理解,因为数据科学的成功案例比比皆是:

●在电子商务领域,推荐引擎将客户与他们最有可能购买的产品匹配起来。

●金融服务提供商利用防欺诈算法来检测诈骗企图。

●制造商可以利用预测分析准确调整供需预测。

这些只是数据科学服务如何惠及各行各业的几个例子。事实上,数据分析在所有垂直业务领域的应用是无限的。但是,尽管数据驱动的解决方案可以为任何行业的公司提供支持,但它们的有效性永远不应该被视为理所当然。

根据 Gartner 的数据,到 2022 年,只有 20%的数据科学项目会带来商业成果。大多数甚至不能保证能进入生产阶段。这表明应用数据科学是一项有前途但有风险的工作。

如果一个项目没有建立在正确的前提上,单靠成本投资和技术不足以将数据科学的发现转化为切实的商业利益。这些是什么?让我们看看。

为什么这么多数据科学项目失败?

虽然每个项目都是不同的,失败通常是许多错误的总和,但一些错误是常见的。在启动数据科学项目之前,您应该了解以下五点。

预评估不佳

这个项目需要多长时间?预计费用是多少?影响是否大于风险?不幸的是,许多企业主在受到数据科学优势前景的诱惑时,忘记了这些基本的考虑。

问错误的问题

数据可能包含所有的答案,但是如果你不知道你在寻找什么或者你打算解决什么问题,你就找不到答案。在没有明确定义问题的情况下一头扎进大量数据中,是从一开始就苦干项目的秘诀。

没有明确的商业目的

无论项目有多创新,它的成功最终将取决于它交付的具体业务成果。忘记商业目标,你可能会在项目进行到一半时发现,你的洞察力对投资回报率没有多大贡献。

数据问题

作为项目的核心,您使用的数据不能是不一致的、不完整的、低质量的、孤立的或有缺陷的。在项目已经开始的时候解决这些问题必然会严重阻碍工作。

利益相关者参与度低

随着工作拖上几周甚至几个月,数据科学团队的士气会下降。最初的热情消退,涉众失去兴趣,他们逐渐转向其他项目。实际上,该项目缺乏支持,最终被放弃。

以上所有的失败都有一个共同点:它们发生在项目的最早阶段,在任何实际工作完成之前。因此,让我们来看看如何通过规划和选择正确的案例来避免困难。

从评估开始

提出数据科学的新用例是容易的部分;当选择要投入生产的产品时,斗争就开始了。对选项的全面评估使选择变得更加容易。

●从比较你正在考虑的用例的好处开始。确定那些解决紧急业务问题的方案和那些将刺激增长的方案。要具体——如果项目的目的太抽象,很有可能只是在纸上看起来不错。

●然后,估计每个案例所需的工作量。这是起草一个粗略的项目路线图来了解其规模和时间表的绝佳时机。

●潜在风险是另一个重要考虑因素。假设最坏的情况,选择失败时不会导致灾难性后果的用例。

关注关键业务问题

承认项目的商业目标是评估阶段的一部分,但是它值得在这个列表中有一个单独的部分。

●数据的使用必须以某种形式带来积极的商业成果。减少用户流失,简化客户旅程,或者简单地用更高效的流程替换现有流程,这些都是您正在寻找的目标。扪心自问,数据是否真的有助于实现这些目标。

●为了实现目标,一套定义明确的 KPI 是必要的。在规划阶段,与其他风险承担者讨论您可以使用哪些指标来跟踪进度。

●将洞察力转化为利润是一项多学科的工作。你需要数据科学家进行分析和算法培训,需要 IT 团队维护数据流,需要营销专家将项目推向市场,以防项目面向消费者。从一开始就让每个人都参与进来会给你一系列的视角,增加选择正确用例的几率。

请记住,面对如此多的利益相关者,你需要有人来协调这个过程。任命一个项目负责人来负责这个项目,并确保事情向前发展。

指定并保护必要的数据

不同的用例需要不同类型的数据。外部还是内部,结构化还是非结构化,自有还是收购?尽早回答这些问题,看看你能做什么,需要什么。

●不要把自己局限于现有的数据集或特定的数据源,从而限制了你的创造力。相反,专注于与你的兴趣和专长相匹配的广泛的主题领域,同时与公司的目标相一致。

●数据治理是另一个最好尽早解决的问题。确保每个人都有适当的访问权限,并且数据质量足够高。识别任何关于隐私、安全和数据使用道德的可能问题。

从小规模开始,随着时间的推移不断发展

如果你不能在一个有很大影响力但有挑战性的用例与一个利润较低但更具可操作性的用例之间做出选择,你可能会选择后者。这种方法有几个优点。

●小范围的项目可以在几周内而不是几个月内带来结果。除了业务成果之外,这还将提高您团队的士气,并增加其未来的参与度。

●出于同样的原因,小项目更安全,因为它们涉及的人员和工作量更少。它们也没那么复杂,因此出错的事情也更少。

●然而,选择低挂的果实并不意味着完全放弃更雄心勃勃的用例。相反,通过这种方式,您的团队将获得处理更大项目所需的专业知识。此外,来自小项目的洞察力可以促进工作,甚至激发新的令人兴奋的想法。

结果

尽管有大量可能的应用,但为数据科学找到正确的用例可能很困难。没有一种放之四海而皆准的方法可以保证任何数据科学项目的成功,这就是为什么许多公司将项目委托给外部顾问。无论你是与专家合作还是单干,有一件事你需要记住:在数据科学中,明智的选择决定一切。

为数据科学工作积累业务知识的 4 种方法

原文:https://towardsdatascience.com/4-way-to-build-your-business-knowledge-for-data-science-job-4c3c04ea3d8a?source=collection_archive---------15-----------------------

商业是这份工作最重要的方面

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

泰勒·弗兰塔在 Unsplash 上的照片

如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。

我是你任何工作岗位的忠实信徒;你总是需要了解你的公司在卖什么,也就是业务。毕竟,公司雇佣你是为了改善业务流程。

当你申请这个行业的任何工作时,都是关于了解你申请的职位和公司经营的业务类型。这也适用于数据科学家的工作。拥有你申请的公司的商业知识会增加你获得数据科学工作的机会。

想象一下这样一种情况,你是数据领域的新人,发现你的竞争对手拥有和你一样的技能。你是如何与其他人相比脱颖而出的?这就是商业知识发挥作用的地方——公司更希望拥有更好的商业知识。这就是为什么我从不建议人们大量申请这份工作——你需要根据工作要求量身定制你的申请。

最大的问题是:“作为数据领域的应届毕业生或新手,如何获得这种业务经验?”。这篇文章就是为了回答这个问题而写的,所以让我们开始吧。

1。特定数据科学项目

除了展示您的数据科学项目的产品,还有什么更好的方式来展示您的数据科学能力?毕竟,你被雇佣是因为你可以用你的项目解决业务问题。虽然,你对数据科学项目的第一个想法是展示你所有的技术技能。不,如果你能更聪明地工作是最好的。

虽然从事机器学习很有趣,比如 NLP 项目、时间序列项目、图像识别等等,但你有没有考虑过你正在从事的项目会对你想进入的公司有所帮助?如果没有,那就试着改变心态。

正如我上面提到的,技术技能是必需的,但是你被雇佣是因为你的技能可以解决商业问题。这就是为什么创建数据科学项目来解决业务问题总是更好的原因。

例如,您正在申请一份保险公司数据科学家的工作,您的图像识别项目是否适合他们经营的业务?大概不会吧?。如果你创建一个信用评分项目呢?现在,这是一个更适合向保险公司展示的项目。

也许你会想,通过从事这个数据科学项目,我将如何理解他们经营的业务?嗯,做一些研究是你的工作。我不会纵容你,说你需要做的是创建一些适合公司的数据科学项目,并与它一起运行。如果你对该公司(或至少是该行业)的业务和他们面临的业务问题有深入的研究,从而创建一个吸引他们的特定项目,这将会很有帮助。所有的材料都在那里——公司网站、文章、研究论文等等。

建立专门针对你申请的业务的数据科学项目将有助于积累你的业务知识,并减少你在人们永远不需要的项目上工作的时间。总之,我的建议是:专注于一项业务,并围绕它建立一个数据科学项目

2。实习

没有比与企业本身合作更好的获得实际商业经验的方法了。虽然在你想去的公司获得你想要的职位竞争很激烈,但你可以尝试通过实习经历来帮助你的潜在客户。

我们都知道获得实习职位本身并不容易,但从来都不容易。然而,我可以从我自己的经历和一些实习生的经历中给你一些建议,帮助你获得实习职位。一个字——连接

利用你的关系,你可能不会马上得到你想要的职位,但是实习职位是一个稍微不同的故事。这仍然是可能的,因为你是公司的临时合同,而不是全职合同。还有,如果你认为因为你是应届毕业生,所以不可能得到实习机会;不,这是可能的。我知道许多人利用他们的关系在他们想去的地方得到了实习机会,他们甚至还没有毕业。

这种联系并不意味着来自你的家人或密友,而是你可以自己建立的。尝试通过社交媒体或公司活动建立联系;从那里开始,试着进行对话,建立更好的联系。许多人通过这种方式获得实习机会——白手起家,仅仅依靠他们的社交技能。这就是为什么要建立联系,不要回避或错过一些重要的东西。

实习有那么重要吗?如果你从未在你想要的某个行业有过任何工作经验或商业知识,我会说是的。我认识一些人,他们在招聘过程中因为实习经历而被评为比竞争对手更高的职位,尽管竞争对手的教育机构排名更高。很疯狂,对吧?这就是为什么如果你想学习商业流程,我总是建议你去实习。

3.自由记者

你可能没有时间去实习,或者已经有了一份全职工作,但有了其他让你感兴趣的事情,那么自由职业者可能是获得商业知识的机会,同时还能赚点钱。听起来很容易?嗯,你还需要在这里和很多竞争对手竞争。

根据我的经验,你需要建立一个体面的技术技能,并从低水平开始,以获得在独立项目中签约的任何机会。此外,如果你建立你的存在来提高你的个人品牌,这将是最好的。

那么,如何从自由职业中获得商业知识呢?这种方式稍微难一点,因为自由职业是接受你得到的工作,而不是选择你想做什么(当然,这取决于人),但你总能从你得到的每份工作中学到商业知识。这是因为自由职业者的工作仍然是解决商业问题的工作。这仍然是一个提高你的商业和技术知识的学习过程。

4。被聘用,但职能不同

就像实习岗位一样,最好的商业经历是当你被你想要的商业行业雇佣的时候。但是,有些时候你必须接受,你应该从一个不同的角度出发,才能进入你想要的位置。

我见过许多受雇于企业的人希望将他们的职业生涯转向数据——他们更容易被接受为数据科学家;为什么?他们已经了解了这个行业,只学到了支持他们转行的技术技能。

业务中的每个功能都将使用数据;这就是为什么你可以利用任何职位成为数据科学家。数据科学家在现代不是受雇于某个特定的部门,而是无处不在;营销、财务、沟通、人力资源——企业中的每一个部门现在都雇佣数据科学家来帮助他们的工作。虽然,还是要说到你公司的成熟度。从任何位置看都是重点;你可以成为一名数据科学家,这是学习业务的最佳方式

结论

申请数据科学工作很难,尤其是在当前竞争激烈的情况下。为了给你一个优势,你需要了解你申请的公司。我推荐四种获取商业知识的方法,它们是:

  1. 特定数据科学项目
  2. 实习
  3. 自由记者
  4. 被雇用,但是在不同的功能上

希望有帮助!

如果你想知道作为一名数据科学家,商业知识有多重要,你可以看看我的其他文章。

在我的 LinkedInTwitter 上访问我。

如果您没有订阅为中等会员,请考虑通过我的推荐订阅。

Apache Beam 中有效调试数据管道的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-effectively-debug-data-pipelines-in-apache-beam-6508a880f0b4?source=collection_archive---------37-----------------------

通过在部署到云之前运行单元测试、使用模块化结构以及以编程方式生成唯一标签来节省调试时间

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

作者图片

Apache Beam 是一个开源框架,对于大规模清理和处理数据非常有用。它对于实时处理流数据也很有用。事实上,你甚至可以在笔记本电脑上用 Apache Beam 进行开发,并部署到 Google Cloud 进行处理(Google Cloud 版本称为 DataFlow)。

除此之外,Beam 还涉足人工智能领域。更正式的说法是,它被用作机器学习管道的一部分,或者用于机器学习模型的自动部署(MLOps)。作为一个具体的例子,Beam 可以用来清除 Twitter 数据中的拼写错误或标点符号,然后将数据发送到机器学习模型,该模型可以确定推文是否代表快乐或悲伤的情绪。

使用 Beam 的一个挑战是如何进行调试,以及如何在笔记本电脑上调试基本功能。在这篇博文中,我将展示 4 种可以帮助你改进调试的方法。

快速提示:

这篇博客高度概括了如何调试数据管道。为了更深入的了解,你可能想看一下这个视频,它讲述了 Apache Beam 的单元测试;还有这个视频,它带你完成了一个基本数据管道的调试过程。

1)如果安装了依赖库,只运行耗时的单元测试

如果您使用的是 unittest,那么让测试只在安装了正确的库的情况下运行会很有帮助。在上面的 Python 例子中,我有一个 try 块,它在 Google Cloud 库中寻找一个类。如果找不到该类,将跳过单元测试,并显示一条消息,提示“未安装 GCP 依赖项”

2)运行本地单元测试时使用测试管道

Apache Beam 使用一个管道对象来帮助构建一个有向无环图 (DAG)的转换。您还可以使用 Apache _ beam . testing . test pipeline,这样在构建基本测试时就可以减少配置工作。

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

有向无环图的例子(由https://en.wikipedia.org/wiki/Directed_acyclic_graph提供)

获得关于如何调试数据管道的另外两个技巧。看看https://www . whiteowleduction . com/4-ways-to-effectively-debug-data-pipelines-in-Apache-beam/

改善图像数据类别不平衡的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-improve-class-imbalance-for-image-data-9adec8f390f1?source=collection_archive---------9-----------------------

实践教程

几种再平衡技术的利弊

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

对于许多航空影像数据集来说,“建筑物”是一个极其常见的类。(来源:谷歌地球)

一些数据集包含类别不平衡,并且在一些类别中的实例比其他类别中的多得多。如果训练集中的这种不平衡没有反映在实际的数据流中,它会导致机器学习分类期间的平均精度差。

在这篇文章中,我描述了在数据准备和模型准备中结合几种技术的过程,这些技术可以帮助减轻类的不平衡,并在所有类中产生更高的平均精度。

之前:不平衡的数据集

在这个例子中,我将完成一个理论项目,为无人机镜头建立一个内容识别模型。作为样本数据,我有 800 张来自谷歌地球的随机图片。50 多个类中有 100 万个对象。

数据集包含不平衡的对象类型。有些课程的频率要高得多,高达 100 倍。

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

最高和最低代表类别的每个类别的实例。60%的类只有不到 1000 个实例,而最高级别的类有 300,000 个实例。(图片由作者提供)

如果你天真地预测数据集中的一个对象是一个“建筑物”,你有 50%的可能性是正确的。因此,这种阶级不平衡会让你相信你的模型比实际情况要好。

这些设置对于对象检测算法来说是具有挑战性的,因为模型试图减少整个数据集中的分类错误。因此,许多模型更喜欢接近平等的阶级平衡。

这里有几种可能的方法来处理这种不平衡。

调整#1:切片而不是缩减像素采样

简而言之,原始图像太大,不适合神经网络的输入层。一张 1200 万像素的无人机图像是 4000 x 3000 像素。输入物体检测器的普通图像尺寸为 512×512 像素或更小。

虽然可以对原始图像进行下采样,但是您会丢失重要的信息,并且对于小对象类,模型的精度会较低。

本示例数据集的少数类都比#1 多数类“建筑物”小得多,因此缩减采样对少数类的影响不成比例。

将原始图像切割成更小的图块是缩减像素采样的替代方法。通过保持全分辨率,我们可以确保较小项目的少数类不会变得更加难以识别。

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

一个完整图像的示例被切割成 49 个无重叠的图块。(图片来源:谷歌地球)

每个图像被平铺成更小的正方形单元,这些单元可以在保持原始图像分辨率的同时单独输入网络。为了确保跨单幅图块边界分割的对象不会丢失任何信息,您可以在连续单幅图块之间重叠的情况下对图像进行切片(例如 25%重叠)。

注意:一些数据集可能包含大小差异较大的对象。您可能希望保留完整的原始分辨率,以便能够识别微小的对象,但也可能有太大的对象,以至于无法容纳在一个单幅图块中。在这种情况下,可能需要使用一些全分辨率切片和一些缩减采样的全图图像来构建训练数据集。

当针对切片数据集进行训练时,我们的模型的平均精度(mAP) 比重新调整图像分辨率的数据集版本更高。

缺点:虽然模型可以更好地处理小对象类,但平铺过程会导致更长的训练时间。例如,这种削球方法增加了我们 30%的地图,但也增加了我们 60%的训练时间。

→值得吗?极有可能。

调整#2:合并几乎相同的类

有些类别几乎完全相同,例如“固定翼飞机”和“货机”这两个类的平均边界框直径约为 18 像素。低像素项目上的这种级别的类粒度对于模型来说可能很难学习,尤其是在每个类没有很多数据点的情况下。

我们决定将相似的对象合并到一个合并的类中,这减少了类的数量,并稍微减少了类分布的不平衡。

注意:最好让具有领域专业知识的人参与进来(我这里没有!)合并标签时。他们不仅可以推荐哪些类应该组合在一起,还可以描述最终用户工作流中原始类必须绝对保留的位置。例如,将“Tank”重新归类为“Truck”可能很诱人,但是用户工作流可能会对“Tank”类采取非常具体的操作。此外,为了帮助简化合并过程,您可以通过识别给模型造成最大混乱的类组来创建一个合并候选列表,以供人工审查。

合并后,我们有了 16 个新的类,而原来有 50 个——但是类的不平衡有多大改善呢?我们来看两个分布。

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

将少数民族班级合并在一起后,每个班级的平均人数增加意味着难学的班级减少了。(图片由作者提供)

在合并之前,75%的类包含不到 1,500 个实例。在代表性不足的班级合并后,每个班级的平均人数超过了 1,500 人。(图中未显示异常值,包括 426,000 计数的“建筑物”类)。

→值得吗?有可能,但可行性取决于领域和最终用户工作流。

调整#3:对特定类进行重采样

克服机器学习中大类不平衡的传统方法是调整训练集中的类表示。

过采样非频繁类增加来自少数类的条目,以匹配多数类的数量。这可以通过几种方式来执行,例如通过生成合成数据或通过从少数类中复制条目(例如,通过 sklearn 的‘重采样’TensorFlow 的 tf.data 采样器PyTorch 的 WeightedRandomSampler )。缺点是它会导致过采样类的过度拟合。

欠采样频繁类是从多数类中移除条目,以便它们与少数类中的数量相匹配。不利的一面是,通过删除数据点,您可能会删除有价值的信息或导致对现实世界数据的泛化能力较差。或者不平衡可能非常严重,以至于欠采样的结果对于数据集来说太小。

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

过采样与欠采样(图片由作者提供)

注意:这两种变化都应该在将数据分成训练集和验证集之后发生,以确保验证集中的数据不包含在训练集中。

对于该示例数据集,我们通过在最终训练数据集中选择性地包括切片来实现欠采样。每个图像块中包含的标签被计数并存储在数据帧中。然后,我们创建了一个排序过程来包含或丢弃每个图块。所有包含至少一个少数民族标签实例(除“建筑物”和“小型汽车”之外的任何内容)的图像都包含在训练数据集中。然后,为了完善数据集,我们还包括了 10%的仅包含最频繁类的切片。不包括带有零标签的图块。

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

按类别划分的对象数量的变化。(图片由作者提供)

奖励:磁贴治疗也使训练更有效率。

除了提高少数类的平均精度,我们还减少了训练时间(通过减少数据集大小),同时只删除了大部分冗余信息。

管理训练中包含哪些图块的另一个好处是,您可以剔除包含零边界框的图块。使用航空摄影,原始全尺寸图像有时可能仅包含 5-10 个注释,这导致大量“空”图块。在太多空瓦片上训练的模型可以学习预测没有边界框作为最优解。

在各种使用案例和内容类型中,许多大规模图像包含可以在训练前移除的死区。例如,查看有多少数字化病理切片是 100%白色的:

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

来自 PAIGE.ai 的数字病理切片示例。

因此,当您拥有保证包含空白的大型原始图像时,通常最好将切片数据集视为新的训练数据。您可以开始探索并通过更精细的控制来清理它。

→值得吗?是的。

调整#4:调整损失函数

除了比一些少数阶级多 100 倍的“建筑”阶级,图像的空白背景区域实际上是另一个占主导地位的多数阶级。该模型将看到大量容易分类的负面区域,有时前景与背景的比例为 1:1000。并且当过度表示的类相对容易分类时,它们可以支配整体损失,这操纵梯度下降以优化对那些多数类的检测。

不要平等地对待每个错误,而是把罕见类上的错误看得比普通类上的错误更重要。

作为回应,我们实现了聚焦损失à la FAIR 的密集物体探测聚焦损失论文。损失函数基于每个对象的预测概率是动态的。[0,5]之间的可调“聚焦参数”`γ’将分类良好的示例的损耗(p > 0.5)推向零。这一变化降低了在总损失项中过度代表的类别的优势。

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

来源:脸书艾研究(FAIR)

对于合并类数据集,实现焦点损失提高了少数类的平均精度,并保持了多数类相对较好的平均精度。

→值得吗?是的。

结论

数据集开始时存在明显的类不平衡并不罕见,对于可能包含大量“空”(或背景)类的图像数据集,这种不平衡会进一步加剧。

如果不考虑代表性不足的类,模型可以达到一个精度上限,在该上限下,多数类很容易预测,但除非采取措施解决类的不平衡并提高少数类的性能,否则整体模型精度可能不会提高。

通常,这意味着数据准备技术(如重新采样)和模型准备技术(如调整损失函数)的组合。这些技术中的一些有缺点,如增加模型训练时间,但通常是值得的,因为它们最终可以产生更高的地图。

数据科学家应该 1)准备好花费时间来缓解类别不平衡,2)期望迭代他们的训练数据集。

增加数据科学收入的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-increase-your-data-science-income-cdf09ef5a8f6?source=collection_archive---------18-----------------------

如何在成为更好的数据科学家的同时赚更多的钱

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

丹尼尔·麦金尼斯在Unsplash【1】上的照片。

目录

  1. 介绍
  2. 数据科学博客
  3. 自由职业工作
  4. 促销和营销
  5. 小书创作
  6. 摘要
  7. 参考

介绍

除了在工作日有一份稳定的数据科学工作之外,还有其他几种小方法可以显著增加你的收入。可以说,有一些副业会让你不知所措,会让你远离你的主要工作,然而,我认为情况恰恰相反。当你从事更多的数据科学项目时(到某一点),你正在加强你在数据科学方面的知识基础,这最终可以帮助你在当前的工作中表现得更好。当然,这因人而异,但在其他数据科学项目上投入一些时间可能是成为一名更好的数据科学家的绝佳方式。话虽如此,如果你想从这四种增加数据科学收入的方法中学习,请继续阅读下面的内容。

数据科学博客

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

照片由丹尼尔·麦金尼斯Unsplash【2】上拍摄。

去年春天,我尝试了以数据科学为主题的博客。起初,在一个月内,我想知道我是否能在正常工作的基础上每周写一到两篇文章。当我通过写博客来练习时,我很快变得更加熟练,月收入逐月增加。

写博客的好处在于,随着时间的推移,你可以从旧文章中获益。有些文章会给你带来几美元一天,甚至几个月后写的文章,你可以想象,一旦你达到大约 50 至 100 篇文章,这一小笔支付可以成为显着的,被动的收入。

撰写数据科学文章的最大好处在于,您可以强化当前主题的知识,同时了解新兴主题。例如,你可以在博客中写一篇关于新的机器学习算法的文章,然后在工作中应用它,因为在为这篇文章进行研究之后,你已经成为了某种程度上的 it 专家。这是在日常工作中引入新话题的好方法。通过为博客研究数据科学,您可以研究特定的库、不同的编码技术以及将数据科学融入业务的方法。用最简单的话来说,写关于数据科学的文章是研究数据科学的最好方法之一,不管是旧的还是新的。

除了获得报酬,以下是数据科学博客的一些好处:

  • 实践当前的数据科学技术
  • 练习技术写作,这可以应用到你的主要工作中
  • 实践新的数据科学库和机器学习算法(像发现 Python 库,PyCaret
  • 加入数据科学社区
  • 为更多的博客和自由职业工作建立关系网

自由职业工作

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

医生Unsplash【3】上拍摄的照片。

在我的博客上建立了一个观众群之后,我能够在那些愿意找我做自由职业的人中更加显眼。大部分时间,我做的自由职业也是写作/博客。然而,不同的是,因为你有一个客户,所以有更严格的要求,而不是可以自由写作。

这里有几个地方可以让你自由写作。我个人用过 Fiverr。这个网站更难成功,但一旦你不断增加一些副业,随着时间的推移,钱会越来越多。这也是实践数据科学工作的另一个好方法。

自由职业的一些好处类似于写作和博客,但是,也有一些独特的好处:

  • 练习接收和解释业务需求并执行它们
  • 练习与利益相关者进行沟通
  • 你也可以从事自由职业的数据科学项目,比如一次性项目,这不仅可以赚很多钱,还可以让你成为某个行业的专家,并将这些概念应用到你当前的主要工作中

促销和营销

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

DocuSignUnsplash【4】上拍摄的照片。

下一个增加数据科学收入的方法不太直接,但值得投入时间。我说的推广和营销,是指自我推广和自我营销。这种类型的推广可以有多种方式。我个人认为,简单地写文章是提升你在数据科学领域的能力和重点的一个很好的方式。

另一个推销自己的主要方式是在 LinkedIn 上。这个网站允许你分享帖子,这可以成为其他人看到你过去工作的途径,并证明是未来工作的证据。随着时间的推移,随着 LinkedIn 或类似平台上越来越多的分享、互动或参与,你会看到关于博客/写作/或小型数据科学项目的直接消息增多。

小书创作

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

照片由真诚媒体Unsplash【5】上拍摄。

这最后一种增加收入的方法是我最近一直感兴趣的。虽然写一本书似乎令人生畏,但数据科学和机器学习书籍不一定要非常广泛才能成功。

例如,你可以在亚马逊上推广一本书,由几家知名公司出版。他们会帮你写书,这是一个过程,也是最难的部分。当写真正的书时,你可以为数据科学和机器学习中的某些主题编写教程的章节,而不是用章节讲述故事。然而,为了获得成功,你的书需要有独特之处。

写一本书(或有资格写一本书)可以通过证明你是一个作家和你有一些读者来完成,这可以通过上面的方法获得,如数据科学博客,自由职业和自我推销。第一步是找到一家你想合作的公司,然后为这本书设计一个标题和大纲,这样就有东西可以合作了。总的来说,确保你的想法是独一无二的,易于遵循的,并且对其他人也是有用的。

摘要

正如您所见,除了您的主要工作,还有几种方法可以增加您的数据科学收入。这些方法有更多的细节,所以如果你有任何问题,请在评论中联系我们。我希望我能够启发你,不仅看到你可以赚更多钱的方法,而且增加你的数据科学知识,甚至可能在该领域找到更多的激情。

总而言之,以下是增加数据科学收入的主要方法:

* Data Science Blogging* Freelancing Work* Promotion and Marketing* Small Book Creation

我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些赚取更多数据科学收入的方法,请在下面随意评论。为什么或为什么不?这些当然可以进一步澄清,但我希望我能够阐明数据科学中的一些主要收入渠道。感谢您的阅读!

请随时查看我的个人资料、 马特·普日比拉 和其他文章,也可以在 LinkedIn 上联系我。

我与这些公司没有关系。

参考

[1]照片由 Danielle MacInnesUnsplash(2017)上拍摄

[2]照片由丹妮尔·麦金尼斯Unsplash(2018)上拍摄

[3]照片由医生去毛刺(2021)上拍摄

[4]照片由 DocuSignUnsplash(2018)上拍摄

[5]图片由真诚媒体Unsplash(2018)上拍摄

4 种替换 Python 列表中项目的方法

原文:https://towardsdatascience.com/4-ways-to-replace-items-in-python-lists-68b5ec04f79a?source=collection_archive---------2-----------------------

了解如何通过求解基本算法来替换 Python 列表中的条目,为下一次编码面试做好准备

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

马丁·沃特曼在 Unsplash 上的照片。

更新:你们很多人联系我要有价值的资源 钉 Python 编码访谈 。下面我分享 4 门我强烈推荐在练习完本帖的算法后坚持锻炼的课程:

希望你也会发现它们有用!现在欣赏:D 的文章

💔-nanodegrees-you-should-consider-to-advance-your-data-engineering-career-in-2021-baf597debc72>

介绍

在准备下一轮 Python 编码时,您可能已经注意到需要操作一个或多个列表的算法出现得相当频繁。迟早,你也会在面试中遇到他们中的一员。

需要操作一个或多个列表的算法出现得相当频繁。迟早,你也会在面试中遇到他们中的一员。

为了帮助你在掌握这种数据结构的过程中提高你的编码技能,下面我介绍 4 方法来替换 Python 列表中的一项,以及四个简单的算法供你测试你的技能。

大多数经典的面试问题都可以用多种方法解决,所以对于每个问题,在看我提供的解决方案之前,先试着想出你的解决方案。与其他技能类似,算法面试是一个你可以通过不断练习来大大提高的领域。

1.索引

替换列表中项目的最直接方法是使用索引,因为它允许您选择列表中的一个项目或项目范围,然后使用赋值运算符更改特定位置的值:

例如,假设您正在处理包含六个整数的以下列表:

lst = [10, 7, 12, 56, 3, 14]

你被要求在左起第三个整数上加 10。因为列表是从零开始索引的,所以可以使用下面的语法之一来改变带有index = 2的元素,在我们的例子中是数字12:

#Option 1
lst[2]= lst[2] + 10#Option 2
lst[2]+= 10 #no need to repeat "lst[2]" then more elegant#Option 3
lst[2] = 22 #that is 12 + 10

现在试着用第一种方法解决下面的问题:

问题#1

给定一个包含整数(介于 1 和 9 之间)的非空列表,将其视为表示一个非负的唯一整数,并递增 1。返回更新的列表。

在结果中,必须存储数字,使得通过求和获得的数字的第一个数字位于列表的开头,并且列表中的每个元素包含一个数字。你可以假设整数不包含任何前导零,除了数字 0 本身。

注意,我们的输入列表由四个非负整数组成,它们共同表示整数 9999。这是一种边缘情况,因为通过在这个数字上加 1,您将获得一个 5 位数的整数(而不是原来的 4 )和一个前导 1。

为了解决这种情况,解决方案利用了两个条件语句,从最后一个到第一个开始计算数字(使用 reverse() 翻转索引的顺序)。如果不等于 9,则通过现在熟悉的语法digits += 1仅最后一位数字增加 1,并且立即返回修改后的列表,而不评估剩余的索引。

或者,如果最后一个数字是 9,则用 0 代替,并计算后面的(倒数第二个)数字。如果不等于 9,则加 1 并返回修改后的列表。否则,如果后面的每个数字都是 9,那么该函数将返回一个以 1 开头的列表和与原始列表中的元素数量一样多的 0。

https://anbento4.medium.com/10-mcqs-to-practice-before-your-databricks-apache-spark-3-0-developer-exam-bd886060b9ab

2.For 循环

在上面的问题中,目标只是替换列表中的最后一个整数,将它递增 1,而迭代只是用来覆盖边缘情况。
然而,如果我们想同时替换列表中的多个元素呢?

在这种情况下,使用 for 循环会很好,因为它可以用来迭代列表中的项目。为了展示它是如何工作的,让我们回到原始列表,将所有的整数乘以 2:

lst = [10, 7, 12, 56, 3, 14]for i in range(len(lst)):
    lst[i] = lst[i] * 2print(lst)Output: [20, 14, 24, 112, 6, 28]

上面的例子很简单,但是如果要求您在替换列表中的项目时应用稍微复杂一点的逻辑,该怎么办呢?

问题#2

考虑一个整数列表。如果是奇数,就加 1,如果是偶数,就加 2。

注意,这个解决方案不是使用range(len(nums)),而是使用enumerate()方法迭代列表中的所有元素,通过模操作符检查整数是奇数还是偶数,并通过分别添加 1 或 2 来替换它们。

Enumerate 是 Python 中的内置函数,可用于在遍历 iterable 对象时添加自动计数器。当可选的start参数没有指定时,计数器从 0 开始计数,就像它是一个实际的索引一样。

出于这个原因,通常使用enumerate()来解决需要您根据应用于索引或列表值的条件来操作列表的算法。

3.列出理解

list comprehension 语法是一种更优雅的方法,可以遍历列表元素并应用某种形式的操作。这是因为理解允许你创建一个新的内联列表,使得你的代码看起来非常简洁。

您可以将上面示例中的 for 循环转换为如下理解:

lst = [10, 7, 12, 56, 3, 14]lst = [lst[i] * 2 for i in range(len(lst))]print(lst)Output: [20, 14, 24, 112, 6, 28]

为了填充新列表,还允许您指定基本条件作为列表理解语法的一部分。这正是解决以下算法需要做的事情:

问题#3

给定一个按升序排序的整数列表,返回一个也按升序排序的列表,包括:
-整数的平方,如果能被 3 整除
-原始整数,如果不能被 3 整除

在这种情况下,if 条件在for loop之前指定,因为存在一个else语句。然而,当不需要else时,您可以简单地遵循语法:

output = [ expression for element in list_1 if condition ]

4.切片和洗牌

有时,在编写面试代码时,您可能会被要求重新排列列表中的项目,以便它们以不同的顺序出现。这可以通过切片洗牌来实现。

例如,如果您希望交换初始列表中的前 3 个和后 3 个元素,您可以写:

lst = [10, 7, 12, 56, 3, 14]lst = lst[3:] + lst[:3]print(lst)Output: [56, 3, 14, 10, 7,
 12]

也许,在这种情况下,谈论替换有点牵强,因为您实际上只是改变了元素在列表中的位置。尽管如此,这种方法还是很有效的,可以帮助你解决下面的问题。

问题#4

给出由 2n 个元素组成的 num 列表,形式为[x1,x2,…,xn,y1,y2,…,yn]。以[x1,y1,x2,y2,…,xn,yn]的形式返回数组。

该练习为您提供了用于切片的索引(在本例中为n=3),并要求您通过创建新的整数对来打乱输入列表。

属于每一对的整数应该是共享相同索引的整数,如果我们将原始列表分割成两个子列表(nums[:n]nums[n:]),使用zip()将子列表中包含的元素配对在一起并递归地将它们添加到新的shuffled列表中,可以很容易地获得这个结果。

结论

在本文中,我向您介绍了 4 种方法来替换 Python 列表中的条目,它们是索引、用于循环的、列表理解切片洗牌

每个操作本身都很简单*,但是你应该能够通过选择最合适和有效的方法来掌握它们,同时解决更复杂的挑战,为你的下一轮编码做准备。*

出于这个原因,我还展示并分享了 4 种算法的解决方案(每种方法一个),它们代表了您在面试初级和中级数据角色时会发现的复杂程度。

还要注意的是这篇文章中出现的问题是对 Leetcode 上出现的问题的重新解释。每一个问题都有多种解决方案,因此地雷只是象征性的。**

给我的读者一个提示

这篇文章包括附属链接,如果你购买的话,我可以免费给你一点佣金。

来源

停止在 Python 中使用 range()for Loops | Jonathan Hsu |更好的编程

如何同时迭代两个(或更多)列表| Jonathan Hsu |更好的编程

【在 Python 中替换列表中的项目:完整指南:完整指南(careerkarma.com)

在随机森林中可视化单个决策树的 4 种方法

原文:https://towardsdatascience.com/4-ways-to-visualize-individual-decision-trees-in-a-random-forest-7a9beda1d1b7?source=collection_archive---------2-----------------------

使用 sklearn、graphviz 和 dtreeviz Python 包实现决策树的可视化

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

利亚姆·波兹在 Unsplash 上的照片

数据可视化在数据分析和机器学习领域发挥着关键作用,因为它允许您揭示数据背后的隐藏模式。模型可视化允许您解释模型。如今,可视化过程变得很容易,有了大量可用的 Python 包。

基于树的模型,如决策树、随机森林和 XGBoost,更受监督学习(分类和抑制)任务的欢迎。这是因为这些模型非常适合于现实世界应用中经常使用的非线性数据。

任何基于树的模型的基线模型是 决策树 。随机森林由多个决策树组成。今天,我们将讨论 4 种不同的方法来可视化随机森林中的单个决策树。请注意,这里讨论的方法通常也适用于任何基于树的模型,而不仅仅是随机森林。我们将使用 sklearngraphvizdtreeviz Python 包,这些包只需几行代码就可以轻松创建可视化效果。

下面是我们今天讨论的 4 种可视化树木的方法。

  • 使用**sk learn . tree . plot _ tree()**函数绘制决策树
  • 使用**sk learn . tree . export _ graphviz()**函数绘制决策树
  • 使用 dtreeviz Python 包绘制决策树
  • 使用**sk learn . tree . export _ text()**函数打印决策树详细信息

前三种方法以的形式构建决策树。最后一种方法以文本报告的形式构建决策树。

先决条件

我推荐你阅读我写的以下内容,因为它们是今天内容的先决条件。

基于“葡萄酒数据”构建随机森林模型

在讨论以上 4 种方法之前,首先,我们在“葡萄酒数据”上建立一个随机森林模型。该模型可用作上述 4 种方法的输入。“葡萄酒数据集”在 Scikit-learn 内置数据集中提供。

等到加载 Python 代码!

X 是特征矩阵, y 是标签列。“葡萄酒数据”有 3 个类别标签,分别命名为**、【class_0】、、【class_1】、、【class_2】、Xy 都用作随机森林模型的输入。由于这是一个分类任务,我们在“葡萄酒数据”上构建了一个RandomForestClassifier()。对于回归任务,可以使用RandomForestRegressor()。**

等到加载 Python 代码!

该模型现已安装在“葡萄酒数据”上,可通过 rf 变量访问。

访问随机森林中的单个决策树

随机森林中的树木数量由**RandomForestClassifier()RandomForestRegressor()**类中的 n_estimators 参数定义。在上面我们建立的模型中,有 100 棵树。可以从以下位置访问每棵树:

rf.estimators_[index]

rf 是随机森林模型。这里, 指标 取值范围为 0-99(含)。0 表示第一个决策树。99 代表最后一个。

使用**sk learn . tree . plot _ tree()**函数绘制决策树

这是可视化决策树的最简单和最容易的方法。你不需要安装任何特殊的 Python 包。如果您已经安装了 Anaconda,那么一切都准备好了!此功能不会自动调整图形的大小。所以更大的决策树的较量也不会很明确。为了避免这种情况,你必须使用图形图形尺寸参数来控制图形尺寸。

让我们使用这种方法绘制随机森林模型中的第一个决策树(通过索引 0 访问)。

等到加载 Python 代码!

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

第一个决策树的结构(图片由作者提供)

您可以通过运行以下命令将图形保存为 PNG 文件:

fig.savefig('figure_name.png')

要了解更多关于**sk learn . tree . plot _ tree()**函数的参数,请阅读其文档

使用**sk learn . tree . export _ graphviz()**函数绘制决策树

与前一种方法相比,这种方法有优点也有缺点。优点是该功能可以自动调整图形的大小。因此,在绘制更大的树时,您无需担心这个问题。缺点是您应该通过在 Anaconda 命令提示符下运行以下命令来安装 Graphviz Python 包。

pip install graphviz

如果这对你不起作用,试试下面这个:

conda install -c anaconda graphviz

让我们使用 Graphviz 绘制随机森林模型中的最后一棵决策树(由索引 99 访问)。

等到加载 Python 代码!

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

最后一棵决策树的结构(图片由作者提供)

您可以通过运行以下命令来保存该数字:

graph.render('figure_name')

现在,图形将被保存为 PNG 文件,因为我们在 graphviz 中指定了 format=“png”。Source() 函数。如果指定 format="pdf ",图表将保存为 pdf 文件。

使用 dtreeviz Python 包绘制决策树

dtre evizPython 包可以用来绘制决策树。它创造了一些很好的视觉效果。让我们看看它们在分类和回归数据集上的作用。

在此之前,您需要通过运行以下代码行在您的 Anaconda 环境中安装 dtreeviz :

pip install dtreeviz

如果在您的 Anaconda 环境中运行 dtreeviz 时由于路径问题出现错误,不如在 Google Colab 笔记本环境中使用 dtreeviz 。运行下面一行代码在那里安装 dtreeviz

!pip install dtreeviz

现在,您已经准备好在您自己的 Colab 环境中运行 dtreeviz

Dtreeviz 在分类数据集上绘制决策树

现在,我们使用 dtreeviz 来绘制建立在用于分类的“葡萄酒数据集”上的随机森林模型的最后一棵决策树。这是代码。

等到加载 Python 代码!

运行上述代码后,会出现一个弹出窗口,要求将 SVG 文件保存到您的计算机上。你可以使用这个免费在线转换器将 SVG 文件转换成 PNG 文件。在像素密度框中设置较高的值(如 250)以获得高分辨率图像。

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

(图片由作者提供)

Dtreeviz 在回归数据集上绘制决策树

现在,我们使用 dtreeviz 来绘制建立在用于回归的“波士顿房价数据集”上的随机森林模型的第一棵决策树。这是代码。

等到加载 Python 代码!

运行上述代码后,会出现一个弹出窗口,要求将 SVG 文件保存到您的计算机上。你可以使用这个免费在线转换器将 SVG 文件转换成 PNG 文件。在像素密度框中设置较高的值(如 250)以获得高分辨率图像。

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

(图片由作者提供)

使用**sk learn . tree . export _ text()**函数打印决策树详细信息

与前 3 种方法相比,这种方法以文本报告的形式构建决策树。

让我们使用这种方法打印随机森林模型中第一个决策树(通过索引 0 访问)的决策树细节。

等到加载 Python 代码!

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

第一个决策树的文本报告(图片由作者提供)

细节和我们用**sk learn . tree . plot _ tree()**函数得到的图一模一样。

摘要

sklearngraphvizdtreeviz Python 包提供了绘制决策树的高级函数。sklearn 函数更容易使用,并给出详细的可视化效果。 graphvizdtreeviz Python 包应该在使用前单独安装。在您的 Anaconda 环境中运行 dtreeviz 时,您可能会由于路径问题而得到一个错误。所以在 Google Colab 笔记本环境下最好使用 dtreeviz 。与其他方法相比,dtreeviz 创建了一些不错的可视化效果。我最喜欢的是*。你最喜欢哪一个?写在评论区。也请通过写你的有价值的反馈让我知道我做得如何,以便我可以基于它们开发我未来的内容。*

感谢阅读!

本教程由Rukshan Pramoditha数据科学 365 博客作者设计创作。

https://rukshanpramoditha.medium.com阅读我的其他文章

2021–05–07

你的初创公司现在可以使用人工智能的 4 种方式(不需要倾家荡产)

原文:https://towardsdatascience.com/4-ways-your-startup-can-use-ai-right-now-without-breaking-the-bank-9f1323cbb835?source=collection_archive---------30-----------------------

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

比尔·杰伦在 Unsplash 上的照片

你不需要大笔预算、数据科学家,甚至不需要几个月的努力——如今,你的初创公司可以通过 4 种方式成为人工智能驱动的公司

更新:你可以在 日文 阅读这篇文章(感谢 Koki Yoshimoto!)

计算机科学家吴恩达称人工智能为“新电力”然而,尽管它的能力和吸引力,人工智能并不适合每一种情况。在我之前的文章中,我提出了 5 种避免投资人工智能的场景。要想知道你的初创公司是否需要人工智能,先从优先考虑你的业务问题开始。制定解决这些挑战的最佳方法,并评估技术如何帮助您。大多数时候,基本的分析、统计或简单的机器学习可以有效地完成这项工作。

一些情况确实保证了人工智能的马力。在这些情况下,额外的智能和自动化可以为您的创业带来变革。本文就是针对这些情况的。

当你感觉到需要时,下一个常见的问题是“我真的需要一大笔预算来使用人工智能吗?”不,你的企业不需要几个月的努力、精英数据科学家,甚至是大笔预算就能成为人工智能驱动的。

以下是你的初创公司或 SME(中小型企业)今天可以开始使用人工智能的 4 种方式。这些建议是从最容易到最难排序的,所以从最上面开始,找出最符合你需求的选项。

1.在您已经使用的工具中启用人工智能功能

人工智能无处不在。你的智能手机可能至少有十几个使用人工智能的应用程序。这项技术使您的相机能够拍摄更好的照片,帮助组织您的照片,并为您策划的社交订阅源提供动力。

大多数企业工具都在为自己的产品添加人工智能驱动的功能。微软已经在 Excel 中加入了一些人工智能功能。当你插入来自截图的数据,或者利用 Excel 中创意面板建议的见解时,你就是在使用人工智能。Salesforce 已经整合了其人工智能引擎 Einstein ,作为其流行的 CRM(客户关系管理)平台的智能助手。虽然一些公司将人工智能功能捆绑到他们的核心产品中,但其他公司可能需要升级。

询问供应商你买的软件是否有人工智能功能。你现有的工具集可能已经是人工智能驱动的,或者可以快速升级。

该选项中的 5 个热门工具: MS OfficeGoogle for BusinessDropboxGithubMixmax

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

照片由你好我是尼克Unsplash

2.购买现成的人工智能驱动的 SaaS 工具

今天,有太多的 SaaS(软件即服务)工具可以按月支付。你想润色你的营销文案吗?Grammarly 的俏皮编辑功能可以帮你覆盖好的领域。想要转录您的客户评价视频或进行专业级媒体编辑吗?Descript 的人工智能特性可以让这变得轻而易举。

当您有未满足的业务需求时,寻找由智能功能驱动的功能性 SaaS 工具。它们中的大多数都提供了现成的集成,可以轻松地插入到您现有的 IT 生态系统中。即使他们不是完美的组合,重要的是他们是否能解决你的大部分问题。如果是这样,你可以避免为类似的人工智能能力投资昂贵的企业许可证。

根据您的关键需求评估可用的工具。找出匹配的程度和集成的难易程度。如果结果超过可接受的阈值,您可以继续。

该选项的 5 个流行工具: Zoho ZiaTrelloGrammarlyDescriptWaveApps

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

照片由 Yogi PurnamaUnsplash 上拍摄

3.将现成的人工智能模型嵌入到您的工具中

当你找不到内置智能的工具时,下一个最佳选择是在云中寻找可以连接到你的工具的 AI 模型。例如,如果你试图找出产品中的制造缺陷,你可以使用人工智能来自动化视觉检查。 Amazon Lookout for Vision 是一种基于云的机器学习(ML)服务,可以直接插入到你的工作流程中。

与前面的步骤不同,这一步需要 DevOps(软件开发和 IT 运营)能力。虽然你不需要数据科学家,但你的团队必须具备编程专业知识,才能将你的软件应用与在线 AI 模型联系起来。请注意订阅费用,它通常基于使用量。

为了探索这个选项,识别在线 ML 平台,这些平台有预先构建的人工智能模型来解决你的领域问题。这个领域有来自 Clarifai、Dialogflow 和 SightHound 等有前途的初创公司的产品,以及微软、谷歌和亚马逊等较大的参与者。

该选项的 5 个热门平台:AWS 上的 MLAzure MLGoogle Cloud MLClarifaiSighthound

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

Unsplash 上由伊琳娜·麦卡伊洛娃拍摄的照片

4.重新训练公开可用的人工智能模型

当你穷尽了上述选项时,是时候使用数据科学家在内部训练人工智能模型了。你可以通过重用公开可用的人工智能算法和易于管理的数据集来节省精力,而不是从头开始。它们可以用来解决你的问题。

假设你的初创公司需要通过分析客户调查的文本反馈来了解客户满意度。你需要具有自然语言处理(NLP)能力的算法。与其煞费苦心地训练新的人工智能模型,你的团队可以建立在公共竞赛中获奖模型的工作基础上,如 KaggleDrivenDataAICrowd

互联网上最好的东西往往是免费的,但找到它们需要时间。寻找像 HuggingFace 这样的开放库,它们发布带有预训练权重的模型,或者像 PapersWithCode 这样的社区,它们将 ML 模型公之于众。大多数这些网站共享丰富的、经过筛选的数据,为您的模型构建过程提供一个快速启动。让您的团队评估调整公共模型所需的工作,并确定在生产中维护它们的成本。

该选项的 5 个热门来源: HuggingFaceAllenAIRasaHQKaggleDrivenData

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

Kelly SikkemaUnsplash 上拍摄的照片

人工智能驱动是一个旅程,而不是目的地

我们已经看了 4 种你可以开始使用人工智能并充分利用你的资源的方法。虽然开始人工智能之旅通常很容易,但获得一致的商业价值将需要持续的关注和投资。

你需要培训你的用户,重组你的组织工作流程,并管理与人工智能相关的文化变革。定期重新评估人工智能投资的总拥有成本(TCO)至关重要。今天对你有效的选择可能在一年后变得昂贵。

例如,订阅人工智能驱动的 SaaS 工具(选项#2)可能适合服务于初始客户群的小团队。随着您的团队规模的扩大和使用量的增加,订阅成本可能会变得过高。在那个阶段,你可能会发现雇佣一个小型数据科学家团队并重新训练公开可用的人工智能模型更经济(选项#4)。

为了简化您的人工智能决策,这里有一个可供您选择的选项摘要:

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

总结:你的初创公司现在可以使用人工智能的 4 种方式(图片由 Gramener 拍摄)

本文最初发表于 企业家 。增加了插图。

40 个用于 ML 的开源音频数据集

原文:https://towardsdatascience.com/40-open-source-audio-datasets-for-ml-59dc39d48f06?source=collection_archive---------1-----------------------

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

超过 2tb 的带标签的音频数据集在 DagsHub 上公开提供并可解析

十月已经过去,DagsHub 的 Hacktoberfest 挑战赛也结束了。当宣布挑战时,我们没有想到我们会带着近 40 个新的音频数据集到达终点线,这些数据集在 DagsHub 上公开提供并可解析!我们的社区创造了奇迹,在如此短的时间内完成了如此出色的工作,这是巨大的荣誉。同时,感谢数字海洋GitHubGitLab 组织此次活动。

今年,我们将重点放在音频领域。为此,我们改进了 DagsHub 的音频目录功能。现在,您可以收听 DagsHub 上托管的样本,而无需在本地下载任何内容。对于每个样本,您可以获得额外的信息,如波形、光谱图和文件元数据。最后但并非最不重要的一点是,数据集由 DVC 进行版本化,因此易于改进并随时可用。

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

作者图片

为了让音频从业者更容易找到他们正在寻找的数据集,我们收集了 Hacktoberfest 对这篇文章的所有贡献。我们有来自七个(!idspnonenote)的数据集。)不同的语言,不同的领域,不同的来源。如果您对这里缺少的数据集感兴趣,请让我们知道,我们将确保添加它。

尽管为期一个月的虚拟节日已经结束,我们仍然欢迎对开源数据科学的贡献。如果你想丰富 DagsHub 上的音频数据集,我们很乐意在这个过程中支持你!请通过我们的 Discord 频道了解更多详情。

2022 年黑客啤酒节上见🍻

表演情感语音动态数据库

表演情感语音动态数据库(AESDD)是一个公开可用的语音情感识别数据集。它包含了用希腊语表达情感的话语。它被分为两个主要类别,一个包含行为情感言语的话语,另一个控制自发的情感言语。你可以通过向网站提交情感演讲的录音来为这个数据集做出贡献。它们将被验证并公开提供用于非商业研究目的。

阿拉伯语语音语料库

阿拉伯语语音语料库是南安普敦大学的 Nawar Halabi 博士工作的一部分。该语料库是使用专业工作室用南黎凡特阿拉伯语(大马士革口音)录制的。使用该语料库作为输出的合成语音产生了高质量的自然声音。

Att-hack:法语表达演讲

这些数据是用法语表达的演讲,100 个短语,在四种社会态度中有多种版本/重复(3 到 5):友好、疏远、支配和诱惑。本研究得到了法国 Ph2D/IDF 关于言语态度建模及其在表达性会话主体中的应用项目的支持,并得到了法兰西岛地区的资助。这个数据库为 2020 年东京语音韵律会议带来了一份出版物。关于更详细的描述,请看的研究文章。

音频 MNIST

这个存储库包含用于解释和说明深度神经网络的代码和数据,用于对音频信号进行分类。该数据集由来自 60 个不同说话者的 30,000 个语音数字(0-9)的音频样本组成。此外,它还保存了audioMNIST_meta.txt,它提供了元信息,比如每个说话者的性别或年龄。

BAVED:基本的阿拉伯声乐情感

基础阿拉伯语声乐情感数据集(BAVED)包含以音频/ wav格式记录的不同情感水平拼写的 7 个阿拉伯语单词。每个单词都记录了三个层次的情绪,如下:

  • 0 级——说话者表达的是低水平的情感。这类似于感到疲倦或情绪低落。
  • 级别 1——说话者表达中性情绪的“标准”级别。
  • 第二级——说话者表达了高度的积极或消极情绪。
  • 供稿人:金龟子
  • 原始数据集

鸟音检测

这个数据集是由伦敦玛丽女王大学的机器听力实验室与 T2 的 IEEE 信号处理协会合作主办的一项挑战的一部分。它包含在真实的生物声学监测项目中收集的数据集和一个客观、标准化的评估框架。DagsHub 上举办的 freefield1010 收集了来自世界各地的 7000 多段现场录音,由 FreeSound 项目收集,然后标准化用于研究。这个集合在地点和环境上非常多样化。

报时回家

CHiME-Home 数据集是带注释的家庭环境音频记录的集合。音频记录最初是为钟声项目制作的。在 CHiME-Home 数据集中,基于与声学环境中的声源相关联的一组 7 个标签,每个 4 秒音频块与多个标签相关联。

CMU-多模式 SDK

CMU-MOSI 是多模态情感分析的标准基准。它特别适合于训练和测试多模态模型,因为大多数多模态时态数据的最新作品都在他们的论文中使用该数据集。它保存了 65 小时的注释视频,来自 1000 多名发言者,250 个话题,以及 6 种情绪(快乐,悲伤,愤怒,恐惧,厌恶,惊讶)。

CREMA-D:众包情感多模态演员

CREMA-D 是由 91 位演员的 7442 个原创片段组成的数据集。这些片段来自年龄在 20 至 74 岁之间的 48 名男性和 43 名女性演员,他们来自不同的种族和民族(非洲裔美国人、亚洲人、高加索人、西班牙人和未指明的人)。演员们从精选的 12 个句子中发言。这些句子使用了六种不同的情绪(愤怒、厌恶、恐惧、快乐、中性和悲伤)和四种不同的情绪水平(低、中、高和未指明)。参与者根据组合的视听演示、单独的视频和单独的音频对情绪和情绪水平进行评级。由于需要大量的评级,这项工作是众包的,共有 2443 名参与者每人对 90 个独特的剪辑进行评级,30 个音频,30 个视觉和 30 个视听。

儿歌

儿歌数据集是一个开源的歌唱声音研究数据集。该数据集包含由一名韩国女职业流行歌手演唱的 50 首韩语和 50 首英语歌曲。每首歌都是用两个独立的音调录制的,总共有 200 首录音。每个音频记录都配有一个 MIDI 转录和歌词注释,既有字形层次,也有音素层次。

装置并产生语音

DAPS (设备和制作的语音)数据集是专业制作的录音室语音记录和现实环境中普通消费设备(平板电脑和智能手机)上相同语音记录的对齐版本的集合。它有 15 个音频版本(3 个专业版本和 12 个消费设备/现实环境组合)。每个版本由大约 4 个半小时的数据组成(20 个演讲者中每个人大约 14 分钟)。

深声刻画人物

后者是一个人类非语言人声声音数据集,由来自 1419 个发言者的 56.7 小时的短片组成,由韩国的普通公众众包。此外,数据集包括元数据,如年龄、性别、噪音水平和话语质量。该报告仅包含 723 个话语(大约。1%)并在 CC BY-NC-ND 4.0 下免费使用。要在更严格的许可下访问完整的数据集,请联系 deeplyinc

EMODB

EMODB 数据库是免费提供的德国情感数据库。这个数据库是由柏林技术大学通信科学研究所创建的。十名专业发言人(五名男性和五名女性)参与了数据记录。该数据库包含总共 535 个话语。EMODB 数据库包含七种情绪:愤怒、厌倦、焦虑、快乐、悲伤、厌恶和中性。数据以 48 kHz 的采样速率记录,然后下采样至 16 kHz。

EMOVO 文集

EMOVO 语料库数据库由 6 名演员的声音构建而成,他们播放了 14 句模拟六种情绪状态(厌恶、恐惧、愤怒、喜悦、惊讶、悲伤)和中性状态的句子。这些情绪是众所周知的,在大多数与情绪化语言相关的文献中都可以找到。这些录音是在 Fondazione Ugo Bordoni 实验室用专业设备制作的。

ESC-50:环境声音分类

ESC-50 数据集是 2000 个环境音频记录的标记集合,适用于环境声音分类的基准方法。该数据集由 5 秒长的记录组成,这些记录被组织成 50 个语义类别(每个类别 40 个示例),大致分为 5 个主要类别:

  • 动物。
  • 自然声景和水声。
  • 人类的,非言语的声音。
  • 室内/家庭声音。
  • 室外/城市噪音。

该数据集中的剪辑是从Freesound.org 项目收集的公共现场记录中手动提取的。数据集已经预先安排到五个文件夹中,以便进行可比较的交叉验证,确保来自同一原始源文件的片段包含在一个文件夹中。

EmoSynth:情感合成音频

EmoSynth 是一个由 144 个音频文件组成的数据集,大约 5 秒长,430 KB 大小,40 名听众根据他们对效价和唤醒维度的感知情绪对其进行了标记。它有关于音频分类的元数据,基于效价和唤醒的维度。

爱沙尼亚情感演讲文集

爱沙尼亚情感演讲团是在“2006-2010 年爱沙尼亚语言技术支持”国家方案框架内,在爱沙尼亚语言学院创建的一个团体。该语料库包含 1234 个表达愤怒、喜悦和悲伤或中性的爱沙尼亚句子。

Flickr 8k 音频字幕语料库

Flickr 8k 音频字幕语料库包含 40,000 个语音字幕。wav音频格式,原始语料库中的训练、开发和测试分割中包含的每个字幕一个。音频采样频率为 16000 Hz,深度为 16 位,并以 Microsoft WAVE 音频格式存储。

Golos:俄语 ASR

Golos 是一个适合语音研究的俄语语料库。数据集主要由在众包平台上手动标注的录音文件组成。音频的总时长约为 1240 小时。

JL 文集

新西兰英语中的情感话语。这个语料库是通过保持 4 个长元音的平均分布来构建的。语料库除了五种主要情绪外,还有五种次要情绪。次要情绪在人机交互(HRI)中很重要,其目的是模拟人类和机器人之间的自然对话。

LJ 演讲

一个公共领域的语音数据集,由 13,100 个单个说话者朗读 7 本非小说书籍中的段落的简短音频剪辑组成。为每个剪辑提供一个转录。剪辑的长度从 1 秒到 10 秒不等,总长度约为 24 小时。这些文本出版于 1884 年至 1964 年之间,属于公共领域。该音频由 LibriVox 项目于 2016–17 年录制,也在公共领域。

SNSD 女士

该数据集包含大量的干净语音文件和中的各种环境噪音文件。wav以 16 kHz 采样的格式。它提供了在各种信噪比(SNR)条件下混合干净语音和噪声的方法,以生成一个大的、有噪声的语音数据集。SNR 条件和所需的数据小时数可以根据应用要求进行配置。

公共领域声音

各种各样的声音可以用于对象检测研究。数据集很小(543MB ),根据其格式分为多个子目录。音频文件从 5 秒到 5 分钟不等。

RSC:来自江湖经典的声音

从缓存中提取 RuneScape 经典声音到wav(反之亦然)。Jagex 使用了 Sun 独创的.au声音格式,这是一种无头、8 位、u-law 编码、8000 Hz pcm 样本。这个模块可以从声音档案中解压原始声音作为头文件,并重新压缩(+重新采样)新的 wav 到档案中。

语音口音档案

该数据集包含 2140 个语音样本,每个样本来自不同的朗读者朗读同一篇阅读文章。说话者来自 177 个国家,有 214 种不同的母语。每个谈话者都在用英语说话。

语音命令数据集

数据集(1.4 GB)有 65,000 个一秒钟长的话语,由成千上万不同的人组成,由公众成员通过 AIY 网站贡献。这是一组一秒钟的.wav音频文件,每个文件包含一个英语口语单词。

苔丝:多伦多情感演讲集

西北大学听觉测试 6 号用来创造这些刺激。两名女演员(年龄分别为 26 岁和 64 岁)背诵了载体短语“说出单词 _____”中的 200 个目标单词,并制作了描述七种情绪(愤怒、厌恶、恐惧、快乐、惊喜、悲伤和中性)的录音。总共有 2800 个刺激。

乌尔都语

乌尔都语数据集包含从乌尔都语脱口秀收集的乌尔都语语音的情感话语。书中有四种基本情绪的 400 种说法:愤怒、快乐、中立和情绪。共有 38 名发言者(27 名男性和 11 名女性)。这些数据来自 YouTube。

VIVAE:情感和情绪变化强烈的发声

情感和情绪语料库(VIVAE)由一组人类非语音情感发声组成。全套包括 1085 个音频文件,由 11 个扬声器组成,表达三种积极的(成就/胜利、性快感和惊喜)和三种消极的(愤怒、恐惧、身体疼痛)情感状态。每个参数从低到高的情绪强度变化。

FSDD:免费口语数字数据集

一个简单的音频/语音数据集,由 8kHz 的wav文件中的口述数字记录组成。录音经过修剪,因此在开始和结束时几乎没有静音。

LEGOv2 文集

这个口语对话语料库包含卡耐基梅隆大学在 2006 年和 2007 年从 CMU Let’s Go (LG)系统中捕获的交互。它基于 LG 系统的原始日志文件。347 次对话,9,083 次系统用户交流;情绪分为垃圾,不生气,轻微生气,非常生气。

MUSDB18

用于音乐源分离的多音轨音乐数据集。MUSDB18 有两个版本,压缩版和非压缩版(HQ)。

  • MUSDB18 —由总共 150 首不同风格的全音轨歌曲组成,包括立体声混音和原始源,分为训练子集和测试子集。
  • musdb 18-HQ—musdb 18 数据集的未压缩版本。它由总共 150 首不同风格的完整音轨歌曲组成,包括立体声混音和原始源,分为训练子集和测试子集。
  • 供稿:金杉马
  • 原始数据集

声音性别

VoxCeleb 数据集(7000 多个独特的说话者和话语,3683 名男性/ 2312 名女性)。VoxCeleb 是一个视听数据集,由人类讲话的短片组成,摘自上传到 YouTube 的采访视频。VoxCeleb 包含来自不同种族、口音、职业和年龄的演讲者的演讲。

Pandas 数据帧迭代速度快 400 倍

原文:https://towardsdatascience.com/400x-time-faster-pandas-data-frame-iteration-16fb47871a0a?source=collection_archive---------4-----------------------

避免使用 iterrows()函数

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

图片来自 Pixabay米哈尔·贾莫鲁克

数据处理是数据科学模型开发流程的重要组成部分。数据科学家花费 80%的时间准备数据集,使其适合建模。有时,对大规模数据集进行数据争论和探索成为一项乏味的任务,人们只能等待相当长的时间直到计算完成,或者转移到一些并行处理。

Pandas 是著名的 Python 库之一,它有大量的 API,但是当谈到可伸缩性时,它失败得很惨。对于大型数据集,仅迭代循环就要花费大量时间,有时甚至数小时,即使对于小型数据集,使用标准循环迭代数据帧也非常耗时,

在本文中,我们将讨论在大型数据集上加速迭代过程的技术或技巧。

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

(图片由作者提供),时间约束比较以迭代数据框

Pandas 内置函数:iterrows()

iterrows()是一个内置的 Pandas 库函数,它返回一系列的每个实例或行。它以一对索引和一系列列要素的形式遍历数据框。

为了比较基准时间约束,我使用了一个包含 1000 万条记录和 5 列的数据集。我们的数据集中有一个字符串类型的特征‘name’,需要去除其中的空格。

**temp=[]
for i,row in df.iterrows():
name_new = row['name'].strip()
temp.append(name_new)**

代码片段花了将近 1967 秒来执行,包括悬停在数据框上并执行“name”值的剥离函数。

不建议使用 iterrows,这不仅是因为时间性能问题,而且**iterrows()**函数不能跨行保留数据类型。你可以使用**itertuples()**函数来保存类型。

现在,让我们找出迭代数据帧的其他技术,并比较其时间复杂度。

按索引迭代:

数据帧是有行和列的熊猫对象。数据框的行和列被索引,并且可以循环遍历索引以遍历行。

**temp=[]
for idx in range(0,df.shape[0],1):
name_new = df['name'].iloc[idx].strip()
temp.append(name_new)**

迭代数据帧并执行剥离操作花费了将近 223 秒(比 iterrows 函数快 9 倍)。

使用 to_dict():

您可以迭代数据框并以闪电般的速度执行操作,只需将您的 Pandas 数据框转换为字典即可。可以使用 Pandas 中的**.to_dict()**函数将数据框转换成字典。与**iterrows()**函数相比,现在迭代一个字典相对来说非常快。

**df_dict = df.to_dict('records')****temp=[]
for row in df_dict:
name_new = row['name'].strip()
temp.append(name_new)**

迭代一个字典格式的数据集需要大约 25 条记录,比**iterrows()**函数快 77 倍。

使用 apply():

apply()是一个内置的 Pandas 函数,它允许传递一个函数并将其应用于 Pandas 系列的每个值。apply()函数本身并不快,但是它对 Pandas 库有很大的改进,因为这个函数有助于根据需要的条件分离数据。

**temp = df['name'].apply(lambda x: x.strip())**

**apply()**该函数执行时间为 4.60 秒,比**iterrows()**函数快 427 倍。

从上面的图(本文开始)中,您可以比较在具有 8 个内核和 32GB RAM 的系统上计算的基准时间数。

结论:

在本文中,我们讨论了几种迭代熊猫数据帧的技术,并比较了它们的时间复杂度。建议在非常特殊的情况下使用**iterrows()**功能。人们可以很容易地从使用**iterrows()**或索引方法转移到基于字典的迭代技术,这将工作流的速度提高了 77 倍。

Apply 函数的速度快了大约 400 倍,但它的用途有限,并且需要对代码进行大量修改才能转换到这种方法。我亲自将我的数据框转换成字典,然后继续迭代。

参考资料:

[1]熊猫文献:https://pandas.pydata.org/docs/index.html

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。

https://satyam-kumar.medium.com/membership

感谢您的阅读

Python 字典和集合的 5 个高级技巧

原文:https://towardsdatascience.com/5-advanced-tips-on-python-dicts-and-sets-6ac1685c42b8?source=collection_archive---------12-----------------------

卢西亚诺·拉马尔霍的《流畅的 Python》笔记(第 3 章)

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

美国宇航局在 Unsplash 拍摄的照片

“任何正在运行的 Python 程序都有许多词典同时处于活动状态,即使用户的程序代码没有明确使用词典。”库奇林

如果你对编写更高效的 python 代码感兴趣,这篇文章很适合你。

我们将讨论卢西亚诺·拉马尔霍的 Fluent Python 第三章的主要内容,其中包括散列表,例如字典和集合。

1 — Hashmap 与序列类型

提示:对唯一的无序记录使用字典和集合。

让我们从“基础”开始,讨论字典和集合在 python 变量生态系统中的位置。下面我们可以看到一个字典、集合、列表和元组的示例声明。

my_dict = {'key1': 'value1', 'key2': 'value2'}
my_set = {'a','b','c'}my_list = ['a','b','c']
my_tuple = ('a','b','c')

前两个变量( my_dictmy_set )的主要区别在于它们利用了散列表。元组、列表和其他 python 序列没有。

python 中的 Hashmaps 使用hash(my_key)方法散列一个键,并覆盖其散列键对应于hash(my_key)的值。这个过程也可能涉及到订单的重组。

因此,尽管散列表非常快,但您必须处理唯一的无序数据。

2—创建字典和集合的最佳方式

提示:使用文字声明 {} 而不是 dict()set()

有很多方法可以创建 python 字典和集合,但是并不是所有的方法都是一样的。下面是最具表现力和可读性的方法。

# dicts
d = {1: 1, 'x': 'x'}
d_comp = {k: v for k,v in zip(keys, values)}# sets
s = {1, 'x'}

这里,我们利用花括号 {} 来声明变量,而不是调用像dict()这样的构造函数。根据 Fluent Python 的说法,从可读性和性能的角度来看,这都是最佳实践。

有一个例外。如果我们已经有了一个元素列表,如下所示,我们不能将列表直接传递到文字声明中,所以我们必须使用构造函数。

# elems
dict_elems = [(1,2), ('x','y'), (('my','tuple'), ('my','value'))]
set_vals =   [1, 'x', ('my','tuple')]# dict/set
d = dict(dict_elems)
s = set(set_vals)

效率最低的实现使用带有构造函数的显式变量声明。应该避免。这种声明策略也将键转换成字符串,如果你不想要更复杂的 dict 键,这并不理想。

d = dict(1=1, x='x')
s = set([1,2])

上述代码的性能不如文字声明的原因是因为在后端,当使用构造函数时,传递的值会创建一个列表,然后该列表被转换为我们想要的数据类型。对于文字声明,python 使用 BUILD_SET 字节码,这绕过了列表的创建,因此速度更快。

所以,使用 **{}** 而不是 **dict()** **set()** 创建字典和集合。

3-集合运算

提示:使用集合获取唯一元素并执行查找。

集合是 python 中最有效的数据类型之一。如上所述,它们利用 hashmaps 使得查找非常高效。它们对于获取列表的独特元素也很有用。

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

图 python 中的基本集合操作。图片作者。

然而,set 真正的亮点是它们内置的操作符,如图 1 所示。Fluent Python 引用了一个模拟,我们在不同大小的干草堆中寻找 1000 根针。字典、集合和列表的性能表如下所示。

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

图 2:大海捞针式查找的性能时间— src 。干草堆类型对应于最后 3 列。图片作者。

正如你所看到的,这个列表比 dict 慢了 9000 多倍,并且是为 10000000 个条目而设置的。作为参考,大海捞针数量的代码简单来说就是len(haystack & needle)

因此,如果你在做集合逻辑,使用集合。

但是有一种极端的情况——如果你使用 numpy/pandas,使用.unique()语法对带有数值的数组/序列更有效。如果你正在处理字符串,也就是 python 对象,使用list(set(my_array))src 会更有效。

4 —对字典操作有用的函数

提示:使用内置的 dict 函数来处理缺失值和迭代。

下面是一些最重要的字典函数,但是这个列表并不完整。如果有重要的遗漏方法,lmk。

循环

d.items()返回一系列键值对。这是在 dict 中迭代键和值的最快方法。

d.keys()d.values()分别返回一系列的键和值。它们是迭代 dict 的键值的最快方法。

处理潜在的空值

d.get(k, default)返回键k的值,如果没有找到则返回默认值。注意default默认为None

d.setdefault(k, default)的操作方式与 get 相同,但如果没有找到k,则首先插入默认值。

加入字典

d.update(d2)连接两个字典。重复键的值将被第二个字典d2覆盖。

5 —后端发生了什么

提示:没关系。

但是,因为我们是好奇而聪明的程序员,所以让我们来看看在引擎盖下发生了什么…

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

图 3: Python 的 hashmap 逻辑— src 。图片作者。

如你所见,这是一个非常复杂的过程。对于所有意图和目的,您只需要关注基于 hashmap 的数据类型缺乏顺序和唯一性。但是,这里有一些有趣的事实。

  • python 中的每个数据不可变数据类型都有自己用 c 编写的哈希函数。
  • 任何可散列类型都可以是字典中的一个键。Hashable 被定义为不可变的与其他对象可比的。测试变量是否可散列的一个好方法是将它传递给 python 的hash()函数。
  • 如果您创建了自己的数据类型,要使用字典或集合,您必须实现__hash____eq__ (equality)方法。

感谢阅读!我会再写 27 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

Python 函数的 5 个高级技巧

原文:https://towardsdatascience.com/5-advanced-tips-on-python-functions-1a0918017965?source=collection_archive---------5-----------------------

卢西亚诺·拉马尔霍的《流畅的 Python》笔记(第 5-6 章)

你是学了 Java 编程,然后转到 python 的吗?如果你开始使用 OOP,但现在使用 python,这篇文章是为你准备的。

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

米歇尔·普林在 Unsplash 上的照片

在 Fluent Python 的第 5-6 章中,卢西亚诺·拉马尔霍讨论了传统的面向对象范例在 Python 中并不总是最优的。下面我们将讨论如何利用 python 的函数来编写高效、简洁的代码。

事不宜迟,我们开始吧。

1 —什么是第一类对象?

为了培养一些直觉,让我们首先了解 python 函数是如何工作的。

用最简单的话来说,函数就是一段代码,只有在被调用时才会运行。但是,在 python 中,函数有很多动态功能,允许您像对待对象一样对待它们。

事实上,python 函数实际上被认为是第一类对象,这意味着它们…

  1. 是在运行时创建的吗
  2. 可以将赋给数据结构中的变量或元素
  3. 可以将作为参数传递给函数
  4. 可以通过函数返回

上面的动态功能允许工程师以有趣和创造性的方式利用 python 函数。

但这还不是全部。Python 有许多有趣的关键字和语法结构,可以让您快速编写高效的代码。下面,我们将从如何利用关键字/语法开始,然后以一个利用函数作为对象的高级示例结束。

2 —使用 Yield 缩短助手函数

提示:利用 **yield** 关键字在不破坏局部变量状态的情况下从函数返回。

好吧,除非你已经熟悉了yield,否则上面这句话可能听起来像法语。但是,这个技巧非常有用,可以为大多数返回值的帮助函数节省几行代码。

让我们从返回奇数的基本 python 函数开始。

def odd(my_iterable):
  odd_numbers = []
  for x in my_iterable:
    if x % 2 == 1:
      odd_numbers.append(x)

  return odd_numbers

我们的流程是 1)声明一个列表,2)在列表中添加奇数,3)返回列表。这是一个非常冗长的函数,只能得到一些奇数。让我们看看yield关键词是否能有所帮助…

def odd(my_iterable):
  for x in my_iterable:
    if x % 2 == 1:
      yield x

嘭!我们只是删除了 3 行代码,增加了可读性,并且根据用例,减少了程序使用的内存。但是它是如何工作的呢?

yield关键字迭代返回一个值而不停止函数**。我们的函数不是返回一个列表,而是变成一个生成器,返回一个生成器对象,它是 iterable 的一个子类型。一旦运行,并保存到一个变量,我们可以迭代它,转换成一个列表,等等。**

my_generator = odd([1,2,3,4,5,6])
my_generator # <generator object odd at 0x106c62740>list(my_generator)                              # (1,3,5)
len(list(my_generator))                         # 3
[x for x in my_generator] == list(my_generator) # True

好的,我们可以看到为什么这样可以节省代码行,但是它是如何(潜在地)节省内存的。嗯,生成器和生成器表达式是可迭代的对象,直到程序使用它们时才真正被创建。所以,如果你不需要完整的对象,就不要把它保存到内存中。但是,如果您打算多次使用某个变量,那么将它保存到内存中是最有效的方法。

3-使用列表理解

提示:用列表理解代替**map****reduce****filter******

函数式编程语言使得上面列出的函数变得流行起来。虽然它们在某些 python 包中非常有用,比如 numpy 和 pandas,但是在常规 python 中,你应该尽可能地坚持列出 comps。

为什么?主要原因是可读性。让我们看一行代码,它对奇数调用一个factorial函数。

**good = [factorial(n) for n in range(6) if n % 2 == 1]
bad = list(map(factorial, filter(lambda n: n % 2 == 1, range(6))))**

假设您对 list comprehension 语法很熟悉,那么第一条语句应该比第二条语句更容易阅读。他们有相似的后端效率。

在 python 的新版本中,reduce函数被从内置的 python 函数移到了functools模块中。mapfilter仍然是内置的,但是随着列表构图的改进,它们的使用已经减少。

所以,如果你想写 pythonic 代码,使用 列表理解式和生成器表达式

4 —利用解包函数参数*

提示:使用 **my_func(*args)** 表示未知数量的位置参数,使用 **my_func(**kwargs)** 表示未知数量的关键字参数。

如果您正在创建将被许多其他人使用的代码,比如 API,那么允许传递的参数具有灵活性是一个很好的实践。您可以通过为每个参数指定默认值来做到这一点,或者您可以使用*来“分解”参数…

**# BAD
def declare_defaults(p1=None, p2=None, p3=None):
  print([p1, p2, p3])# GOOD
def positional_arguments(*args):
  print(args)# GOOD
def key_word_arguments(**kwargs):
  print(kwargs)declare_defaults(p1=1, p2=2, p3=3)   # [1,2,3]
positional_arguments(1,2,3)          # [1,2,3]
key_word_arguments(p1=1, p2=2, p3=3) # {'p1': 1, 'p2': 2, 'p3': 3}**

**my_func(*x)** 将所有参数存储在一个名为 **x** 的元组中。 **my_func(**x)** 将所有参数存储在一个名为 **x** 的字典中。

当您有大量参数,并且不希望用户在每个函数调用中都传递每个参数时,利用这些信息会非常有用。或者,当您不知道用户将传入多少参数时,也可以应用它。

5 —使用函数重构您的类

提示:尽可能使用函数而不是类。

最后,让我们讨论一个关于程序设计的高级技巧。在许多 OOP 语言中,你被教导使用大量的类。然而,因为 python 函数可以被当作对象来处理,将它们存储在一个类中会损害可读性、效率和开发时间。

让我们看一个例子…

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

图 1:策略设计模式的简化 UML 图。图片作者。

在图 1 中,我们有一个类结构,它从理论上计算用户在结账时应该得到多少折扣。这是一个经典的 OOP 设计模式,叫做“策略”有三个主要组件:

  1. 上下文:有/无折扣总价信息。这显示在Order类中。
  2. 策略:确定应该应用哪个折扣的简单逻辑。这显示在Promotion类中。
  3. 具体策略:计算折扣的实际“算法”。这显示在BulkItemPremiumUser类中。

看起来很直观,对吧?是的,但是因为 python 函数是一等公民,我们可以极大地简化代码…

**# Concrete Strategies
def bulk_item(price):
  return price * 0.5def premium_user(price):
  return price * 0.75# Strategy
def determine_discount(context, price):
  mappings = {'premium_user': premium_user,
              'bulk_item': bulk_item} relevant_mappings = {k:v for k,v in mappings.items() if k in context}
  return min(discount(price) 
               for discount in relevant_mappings.values())# Context + Run
price = 1000
context = ['bulk_order','premium_user','female','USA']
print(f'Best discount: {determine_discount(context, price)}')**

通过在determine_discount函数中使用函数作为对象,我们能够极大地减少这个逻辑的冗长性。而且,如果我们有 100 个折扣,那么mappings字典可以相应地扩展。

**因此,尽管这是一个过于简单的例子,但是最好的做法是**尽量利用函数作为对象,并尽量少用类。此外,实例化类会花费很多时间——使用更轻量级的数据类型可以提高速度。

感谢阅读!我会再写 22 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

Python 序列的 5 个高级技巧

原文:https://towardsdatascience.com/5-advanced-tips-on-python-sequences-5b0e09a21a83?source=collection_archive---------11-----------------------

卢西亚诺·拉马尔霍的《流畅的 Python》笔记。

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

照片由 NASAUnsplash 上拍摄

“66%的数据科学家每天都在应用 Python。”— src

如果你属于那 66%,这篇文章就是为你写的。

我们将讨论卢西亚诺·拉马尔霍的 Fluent Python 第二章的主要内容,其中包括序列例如列表、元组等。

1-列表与元组

提示:列表应该保存相同种类的信息,而元组可以保存不同种类的信息。

从基础开始,让我们讨论列表和元组之间的主要区别。下面我们可以看到一个例子——列表被方括号[]包围,元组被圆括号()包围。

my_tuple = (1,'a',False)
my_list =  [1,'a',False]

在后端,列表是可变的,但是元组不是。不可变变量通常需要较少的内存,所以尽可能使用元组。

但是,在 Fluent Python 中有一个更深层次的注释。

从语义上来说,最佳实践是在一个元组中存储不同种类的数据,而在一个列表中存储相同种类的数据。注意,元组和列表都支持在同一个变量中使用多种 python 数据类型,但是我们是在概念上讨论变量的类型。

例如,一个元组可以用来存储以下信息:(latitude, longitude, city_name)。不仅这些不同的数据类型(float, float, str),而且它们在概念上也是不同的。另一方面,列表应该只存储纬度、经度、城市名或三者的元组。

# list of [float, float, str]
bad_practice_list = [[39.9526, 75.1652, 'Philadelphia'], 
                     [6.2476, 75.5658m 'Medellín']]# list of tuples
good_practice_list = [(39.9526, 75.1652, 'Philadelphia'), 
                      (6.2476, 75.5658m 'Medellín')]

为了改进 python 代码的组织,应该始终将同类信息保存在一个列表中。元组用于结构,列表用于序列。

2 —解包项目

提示:使用 ***** **_** 来改善你的拆包。

解包是访问 iterable 内部值的一种非常流畅和易读的方式。它们在循环、列表理解和函数调用中很常见。

解包是通过给逗号分隔的变量名分配一个类似序列的数据类型来完成的,例如…

x, y, z = (1,2,3)

然而,Fluent Python 进入了一些花哨的解包方法。一个例子是你可以使用*来解包一个长的可重复项中的“其余”项。当你有一些感兴趣的项目和其他不太重要的项目时,使用星号符号是很常见的。

x, *y, z = [1,2,3,4,5,6,7]
x #1
y #[2,3,4,5,6]
z #7

如您所见,*操作符可以出现在一组变量的中间,python 会将所有未考虑的值赋给该变量。

但是,我们可以进一步使用星号拆包操作符。您可以使用_来解包,并且不保存值。当您想要解包一些东西时,这种约定很方便,但是不像上面的例子,您不需要所有的变量。

x, _ = (1,2)
x #1

下划线_解包操作符的一个用例是如果您正在使用返回多个值的字典或内置方法。

最后,对于顶部的 cherry,我们可以结合两种方法来解包并且不存储“其余”的值。

x, *_ = (1,2,3,5,6)
x #1

3-函数是否返回 None?

提示:如果函数返回 **None** ,则执行就地操作。

很多 python 数据类型都有同一个函数的两个版本,比如下面显示的x.sort()sorted(x)

x = [3,1,5,2]
x.sort()
x # [1,2,3,5]x = [3,1,5,2]
y = sorted(x)
x # [3,1,5,2]
y # [1,2,3,5]

在第一个使用x.sort()的例子中,我们执行了一个就地排序,这个排序更有效,需要的内存更少。但是,在使用sorted(x)的第二个例子中,我们能够保留列表的原始顺序。

一般来说,Python 保留了这种符号。x.sort()这样的点运算符经常返回None并执行就地突变。像sorted(x)这样将变量作为参数的函数返回变异变量的一个副本,但是保持原始变量不变。

4 — GenExps 与 ListComps

提示:如果你只访问一次变量,就使用生成器表达式。如果没有,使用列表理解。

列表理解 (listcomps)和生成器表达式 (genexps)是实例化序列数据类型的不同方式。

list_comp = [x for x in range(5)]
gen_exp = (x for x in range(5))

如上所示,list comps 和 gene XP 之间唯一的语法差异是括号类型——括号()用于 gene XP,方括号[]用于 list comps。

**列表组件被实例化,这意味着它们被评估并保存在内存中。基因 XP 不是。**每当程序需要一个 genexp 时,它将执行计算以评估该表达式。

这就是为什么如果你只使用一次变量,生成器表达式会更好——它们实际上从来没有存储在内存中,所以效率更高。但是,如果您重复访问一个序列或者需要特定于列表的方法,最好将它存储在内存中。

有趣的旁注—你也可以使用列表理解语法创建字典…

my_dict = {k:v for k,v in zip(['a','b'], [1,2])}

5-切片

最后,让我们以切片的快速注释来结束。与解包不同,有时我们希望使用索引来访问 iterable 中的值。切片允许我们通过使用下面的格式来做到这一点:my_list[start:stop:step]

对于那些知道my_list[::-1]颠倒一个列表顺序却不知道为什么的人(比如我自己),这就是为什么。通过传递一个-1作为我们的步骤参数,我们反向遍历列表。

现在大多数 python 包都遵循[start:stop:index]语法。熊猫和熊猫是一些显著的例子。让我们依次看看每个参数…

  • start:切片中的起始索引
  • end:切片中不包含的结束索引
  • step:您的startstop步进内的步长(和方向)

因此,因为这些值都是可选的,我们可以做各种各样的酷切片…

x = [1,2,3,4]x[1:3]                   # [2,3]
x[2:0:-1]                # [3,2]last = [-1::]            # 4
all_but_last = x[:-1:]   # [1,2,3]
reversed = x[::-1]       # [4,3,2,1]

现在你知道了!流利 Python 第二章的 5 个主要技巧。只剩一节了…

数据科学家的有用笔记

免责声明,我不是超级有资格把我的观点加到这一块的。然而,这些笔记应该非常直观。如果你不同意,请告诉我。

  1. 列表理解应该总是取代循环。如果循环体很复杂,你可以创建一个函数来完成这些操作。通过将用户定义的函数与列表理解语法相结合,您可以得到可读且高效的代码。如果你需要迭代多个变量,使用[enumerate()](https://realpython.com/python-enumerate/)[zip()](https://www.w3schools.com/python/ref_func_zip.asp)
  2. 在 python 中“最优”并不重要。如果您正在编写生产级代码,可能会有所不同。但是,实际上,在列表上使用元组时,您不会看到大的性能提升。99%的工作是确保您的数据操作步骤合乎逻辑且高效。如果 1%很重要,那么你可以开始担心元组和列表。此外,如果你真的从事高效代码的工作,你可能不会使用 python。
  3. **最后切片超级爽。**我早就知道x[::-1]会反转列表,但直到读了这一章流畅的 Python 才知道为什么。它对熊猫和熊猫都有效!

感谢阅读!我会再写 35 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

你可能应该知道的 5 个人工智能故障

原文:https://towardsdatascience.com/5-ai-failures-you-probably-should-know-about-417ddebbc323?source=collection_archive---------12-----------------------

如果你从未失败过,那你就没有活过

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

Unsplash 上的 CHUTTERSNAP 拍摄

把失败往坏的方面想是很正常的,失败是痛苦的。但事实上,对于任何敢于尝试新事物的人来说,失败不仅是不可避免的,而且是必要的。拥抱失败是指数增长的催化剂,因为其中蕴含着宝贵的人生经验。从失败中学习的好处在于……他们不一定是你自己的

虽然我们知道人工智能(AI)已经很多年了,但它在工业中的应用仍然处于萌芽阶段。失败是意料之中的。有时失败是致命的,而在其他情况下不完全如此,但都一样,人工智能中的裂缝(或错误的实现)被显示出来,公众的信心丧失。

作为从业者,安全地实践人工智能是我们的责任,因此了解技术失败的次数是值得的,然后继续理解它失败的原因以及应该以不同的方式做什么。也就是说,这里有 5 个人工智能失败的例子。

注意:故障不是按时间顺序排列的

排名第一的微软 Tay

在我看来,聊天机器人有潜力成为技术中最有价值的资源之一。计算机理解自然语言能力的进步使得开发模拟类似人类互动的技术成为可能。微软在 2016 年向 Twitter 发布 Tay 时可能也在想同样的事情。

研究小组将 Tay(thinkingAboutYou 的缩写)描述为“毫无寒意的人工智能”,人们开始注意到这一点,特别是当这个机器人开始发表种族主义和贬损言论来回应其他 Twitter 用户时。

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

https://twitter.com/tayandyou(https://PBS . twimg . com/profile _ images/712494863573356544/vtxa 3 ywk . jpg)、合理使用、https://en.wikipedia.org/w/index.php?curid=49953711

该机器人最初是为了测试和改善微软对对话中自然语言的理解而发布的。Tay 已经利用其人工智能技能从互动中学习,以便在未来进行更好的对话。不久,Twitter 用户开始瞄准人工智能机器人的弱点,从而操纵它学习深刻的性别歧视和种族主义情绪。

微软不得不在发布后不到 24 小时就关闭了这个机器人。在未来的一份声明中,微软首席执行官塞特亚·纳德拉评论了泰对微软如何对待人工智能和问责制的重要性的“巨大影响”。

阅读更多关于微软 Tay 的信息。

#2 亚马逊的招聘工具

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

照片由你好我是尼克Unsplash

使用人工智能来简化人才获取在这个时代很常见,然而,情况并非总是如此。曾几何时,如果你是一名在亚马逊寻求技术职位的女性,你的机会非常渺茫。

自 2014 年以来,亚马逊一直在开发一种软件,可以自动审查求职者的简历,目的是找到前 5 名人才。直到 2015 年,亚马逊的机器学习专家才发现,他们的人工智能招聘工具正在以一种非性别中立的方式招聘技术角色(即软件开发人员)。

事实证明,亚马逊已经在 10 年间提交给该公司的简历上训练了他们的机器学习算法。大多数简历来自男性,因为这在技术岗位上最常见,算法学习了这种模式,并确定女性不适合技术岗位。

我以前写过数据项目中不同类型的偏见。此外,你可以阅读更多关于亚马逊性别歧视招聘工具的信息。

#3 因弗内斯喀里多尼亚蓟足球跟踪系统

苏格兰足球队因弗内斯·喀里多尼亚蓟足球俱乐部宣布在 2020 年 10 月推出他们新的人工智能足球跟踪技术。这一声明是在两次成功的技术测试活动后宣布的,这两次测试增强了俱乐部的信心。

在与 Ayr United FC 的一场比赛中,AI 球跟踪技术无法实现它在测试运行中的成功。该系统反复将球与巡边员的光头混淆,尤其是当球处于不清楚的区域时(即被球员阻挡或处于体育场创造的阴影中)。

详述事件的短片

事后看来,一些球迷可能会看到这一事件有趣的一面,但在当时,如果你是一名付费客户,无辜地试图在全球疫情中观看足球直播,你会被摧毁。

尽量不要笑;原来这个问题是由于边裁的头和球在视觉上的相似性造成的。其他因素也影响了这项技术,例如摄像机的角度给人的印象是边裁的头在足球场的范围内。

了解更多关于 AI 追球事件

#4 优步自动驾驶汽车死亡事故

2018 年 3 月 18 日将被记录为历史上纪念伊莱恩·赫尔茨贝格的一天,她是第一个有记录的涉及自动驾驶汽车的行人死亡事件的受害者。

事件发生在美国亚利桑那州的坦佩。赫尔茨贝格在推着一辆自行车穿过一条四车道的道路时,被优步的测试车撞了个半死。优步意识到了自动驾驶汽车的潜在危险,因此他们整合了一个人在回路系统作为备份。然而,报道称安全驾驶员被她手机上的一段声音分散了注意力,事实上已经错过了三分之一的路程。

伊莱恩·赫尔茨贝格事件中所发生的一切

NBC 新闻的一篇报道称,事件的原因是人工智能无法“将一个物体归类为行人,除非该物体靠近人行横道”。

事件发生后,优步暂停了在亚利桑那州的自动驾驶汽车测试,这是可以理解的,因为自 2016 年以来,该地点一直被批准进行此类测试。

阅读更多关于缩短伊莱恩·赫尔茨贝格生命的事件的信息——我向其家人致以最深切的慰问。

#5 Face ID 使用 3D 打印面具进行黑客攻击

如今,面部识别随处可见,但它可能不像我们最初认为的那样安全。研究人员已经能够找到面部识别被欺骗的实例,使用 3D 打印的面具来描述用于认证面部身份系统的面部。

下面的视频提供了对这一人工智能失败的更多见解。

包裹

失败通常是有代价的,而且代价随着失败影响的人越来越多而增加。有时候,我们不必等到自己犯了错误才去学习。其他人在我们之前犯过错误,所以我们可以从中学习和成长,而不必付出和他们一样的代价。也就是说,要学会拥抱失败,因为这是成长的必由之路。

感谢您的阅读!

如果你喜欢这篇文章,请通过订阅我的**每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。**

相关文章

** </5-best-practices-for-feature-engineering-in-machine-learning-projects-e0a4e74fc4fa> **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值