TowardsDataScience 博客中文翻译 2019(十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据科学家的 7 条经验教训

原文:https://towardsdatascience.com/7-lessons-learned-for-data-scientists-461d435d68d5?source=collection_archive---------27-----------------------

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

Photo by Justin Main on Unsplash

从错误中学习是件好事。不如从别人的错误中吸取教训。”—沃伦·巴菲特

我们即将进入一个新的十年。你们中的许多人正在开始一份新的职业,成为一名数据科学家。你们中的一些人正在考虑采取行动。最好有更多的信息,更多的视角,来做出最好的决定。因此,这篇文章。我并不自称聪明,但这 7 条建议比其他任何东西都更符合智慧。它们是我在 Guidehouse 担任咨询数据科学家的经验的精华。他们学到了迄今为止非常有趣的旅程。我希望我从第一天就认识他们。此外,我希望它们能帮助你在自己的 DS 之旅中更上一层楼。把肉拿走,把骨头吐出来。

课程

  1. 尽可能多地使用函数式编程 (FP)的基础知识,并且对你的项目环境有意义。我之所以这么说,是因为我不是编程范例方面的专家,也不想把 FP 作为某种灵丹妙药,在 15 分钟之内摧毁你的数据难题。面向对象编程也存在,还有其他的。但是在 FP 有意义的地方,使用下面的技巧来增强你的代码。首先,必要时避免循环。使用映射函数或递归。“扁平胜过嵌套”—python 的禅。第二,方法链接功能强大,可读性强。python Pandas 包有一些像这样的内置函数,包括管道方法,但是我相信 R 中的% > %比 python 中的对等函数更优雅,所以我打算学习它们。最后,函数应该在每次运行时返回相同的输入值。这条规则使你的程序函数符合函数的数学定义。函数应该只对局部范围内的变量进行操作,而不是全局。这减少了可能在代码中导致意想不到的后果的副作用,并且通过使您的代码更具可重用性和“功能性”来增加函数的安全性记住,计算机会完全按照你的要求去做,只是不总是你希望发生的。
  2. 易于记录的数据清理流程 —使用有向无环图或类似的流程图来可视化您选择的数据清理流程。由于分析高度依赖于您应用于数据的任何过滤器、聚合或转换,因此,如果您需要改变方向或进行更正,您需要一种方法来与利益相关方交流您的清理选择。始终记录。这与版本控制和命名结构密切相关,它们应该被仔细地实现,但是对它们的深入讨论将在另一篇文章中进行。
  3. 简单的往往比复杂的好。从那里开始,然后迭代。始终获得中间步骤的反馈。不要总是去寻找最炫的新算法,要加倍努力寻找有效的算法。了解没有免费的午餐定理
  4. 可解释性——在生产环境中,你可能不需要可解释性,因为模型预测才是最重要的。但在咨询环境中,我发现自己所处的环境,可解释性是至关重要的。如果你不能解释你的分析结果,没有人会相信你,或者更糟,没有人会关心你的工作。可解释性发生在两个方面,一方面是模型的可解释性,另一方面是你解释你的模型/分析做了什么以及从中可以得出什么见解的能力。有些模型比其他模型更难描述,但是你对它们的直觉是可以培养的。两者兼而有之,这样人们就会利用你脑力劳动的成果。
  5. 可再现性(Reproducibility)——尽可能写容易理解的代码,但不要太简单。其他人会阅读和使用你的代码,所以记住这一点。你可能要把分析结果搁置 6 个月,然后再拿起来。所以,帮你自己和其他人一个忙,写一些可读的注释代码。
  6. 考虑 你要面对的观众他们关心什么,以及你如何通过讲述一个关于数据和你利用数据的发现的故事来说服他们。这和第 4 点类似。也许这更重要。学习如何讲述一个关于数据的故事,并问问自己,在这个特定的时间点,这个故事是否值得告诉风险承担者,并牢记您特定的项目目标。
  7. 你需要的工具可能是另一种语言。不要害怕学习,也不要卷入关于什么是最好的争论。“在 medio veritas 中”。每种语言都有它的长处。在记住之前的经验(简单性、可再现性)的同时,关注这些以及将它们结合起来的方法

记住,“大事始于小事。”——大卫,在普罗米修斯里。长期持续的努力可以带来巨大的收益。如果您不能立即开始实施所有这些,或者在您所处的 DS 环境中实施它们没有意义,请将重点放在最有效的 1 或 2 项上(帕累托原则)。实施这些,给这个世界你能提供的最好的东西。

今年让我难忘的 7 堂机器学习课

原文:https://towardsdatascience.com/7-machine-learning-lessons-that-stuck-with-me-this-year-27138a96281b?source=collection_archive---------14-----------------------

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

不,这不是用什么机器学习库的问题。

在过去的两年里,我一直是机器学习的学生,但在过去的一年里,我终于能够应用我所学到的东西,并巩固我对它的理解。所以我决定分享我在机器学习的“第一年”学到的 7 个教训,并希望让这篇文章成为每年的传统。

1.数据是女王

开始之前考虑一下数据

如今,由于网上存在大量的学习资源,学习机器学习相对容易。不幸的是,他们中的许多人倾向于掩盖数据收集清理步骤。

在我的第一个严肃的机器学习项目中,我和我的团队遇到了一个大问题:我们从哪里获得数据?我们需要数以千计的动物图像,在放弃搜索网络的想法后,我们遇到了 CIFAR-100 数据集。但是就在我们认为所有的问题都解决了的时候,我们意识到我们需要预处理我们的数据(去除背景,缩小比例,转换成矢量等等。)然后再馈入我们的深度学习模型。这被证明是我们项目中最耗时的部分(除了大约一周的通宵训练和调整我们的模型)。

任何机器学习项目的数据部分都不应该被忽视,“数据来自哪里?”应该是你开始前首先要问的问题之一。

2.领域知识很重要

领域知识有时和技术技能一样重要

人们很容易陷入这样的想法,即使用机器学习解决问题只需要技术技能。现实是,如果你只从数字和算法的角度考虑你面前的问题,你将很难走得很远。就这一次,在一个你不太了解的领域里想出项目点子可能会很困难。但是,即使你设法提出了一个伟大的想法,领域知识在决定你需要收集什么样的数据以及在训练你的机器学习模型时应该使用什么类型的特征时,也会非常有帮助。

你当然不需要成为应用机器学习技术的每个领域的专家,但你应该准备好尽可能多地学习,并与那些拥有领域专业知识的人合作。

3.机器学习不是银弹

机器学习不是一切的答案

过去几年,机器学习发展如此迅速,人工智能初创公司的数量在增加也就不足为奇了。有一种驾驭人工智能浪潮的冲动,越来越多的公司似乎正在投资聘请机器学习工程师和数据科学家,希望在竞争中领先。但现实是,机器学习并不总是答案,基本分析往往是最佳和最具成本效益的解决方案。

即使一家公司可以证明机器学习的使用是合理的,这也不意味着它准备实施它。我在我工作过的几家公司看到了利用机器学习能力的渴望,但他们往往没有足够的相关数据,质量也值得怀疑。

在你开始建立一个机器学习模型之前,你应该总是做你的研究并尝试不同的技术来解决一个问题,这可以节省你大量的时间和金钱。

4.无需从头开始编码

拥抱社区已经创造的工具

学习基础知识是至关重要的,它将确保你在处理问题时做出最好的决定,但从头开始编写机器学习模型不是很实际。

当我在学校开始学习机器学习时,我从头开始编写基本算法,但我很快意识到,我不需要为了将理论付诸实践而重新发明轮子。事实上,通过使用基本的机器学习库和 API 解决问题,我开始在学习中进步得更快,这只是给了我更多的时间来明智地思考失败的方法和思考优化。

下一次你有问题时,你的目标应该是在你从头开始编码之前,找出是否有一个 ML 工具来帮助你解决它。

5.人在回路中

人类和机器一起更强大

不管主流媒体想让我们相信什么,人工智能的当前状态还没有能力取代人类。

YouTube 是一个很好的例子,说明了人在循环中的重要性,即人参与到机器学习过程的每个阶段。例如,考虑一下 YouTube 的算法是如何错误地对成千上万的视频进行版权保护和去货币化的,创作者群体真的很痛苦。机器学习算法还不够“智能”,不足以单独区分合理使用和版权,使用人类判断来检查算法建议并提供反馈极其重要。

机器驱动的系统非常强大,但它们仍然达不到预期的准确率,在人类的帮助下,它们可以实现超出我们想象的伟大成就。

6.这是一门艺术!!

有时这全靠经验和大量的尝试和错误

我记得在讲座结束后,我找到我的教授,问他如何在人工神经网络中选择正确的神经元数量和隐藏层。我希望有一个公式或某种标准方法来得出正确的组合,但我得到的只是轻微的傻笑和“这是一门艺术!”。我的教授解释说,找到正确的组合取决于经验和大量的尝试和错误。听到这一点我有点失望,但我越是与机器学习算法,特别是神经网络打交道,我就越能接受这样一个事实,即在机器学习中没有“一刀切”的做法。

有许多不同的方法可以帮助你优化机器学习算法,你应该尽可能多地熟悉这些方法,但最重要的是,要习惯于跳出框框思考,进行大量的试错。

7.找一个导师或伙伴

愿意寻求帮助

这一课不仅仅适用于机器学习工程师,无论你在哪个领域,你都应该认识到寻求帮助的力量!

独自工作当然没有错,但不可否认的是,有一个伙伴或导师往往能帮助你更快更远地前进。在我的学习过程中,有一位导师是至关重要的,有第二双眼睛来修改我的作品让我受益匪浅。

我们很多人都避免寻求帮助,要么是因为害怕被拒绝,要么只是因为给别人带来不便,但你会惊讶地发现有多少人愿意不怕麻烦地伸出援助之手。练习寻求帮助,并见证它如何让你的生活变得更好。

希望这些教训对你的机器学习生涯有所帮助。如果你有任何问题或者想分享你自己的经验,我很乐意在评论中看到它们!

当你开始与图书馆合作时,7 个实用的熊猫提示

原文:https://towardsdatascience.com/7-practical-pandas-tips-when-you-start-working-with-the-library-e4a9205eb443?source=collection_archive---------10-----------------------

解释一些乍一看不那么明显的东西…

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

简介

在本文中,我想分享一些我认为对任何开始数据科学之旅的人都有用的技巧。Python pandas 包是数据科学家使用最多的库之一,对于任何想要涉足该领域的人来说,它绝对是必不可少的。

有时候学习之旅并不那么直截了当,所以我想分享一些让学习变得更容易的小技巧。一些提示是熊猫最重要的一些功能的更传统的用法,而其他的是关于如何在包装内做一些事情的实用建议。

请继续阅读!

使用这三个函数来检查你的数据:head()、info()、describe()

这三个函数将帮助您进行初始数据分析,并且已经为您提供了关于数据集的大量信息。加载数据集后运行这三个工具总是一个好的开始。

我们将加载 iris 数据集来演示它们是如何工作的。您可能会在加载 csv 文件后立即这样做。

from sklearn.datasets import load_iris
import pandas as pddata = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['species'] = data['target']

现在数据已经加载,您可以看到 head 函数是如何工作的:

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

您可以看到它显示了数据框的前 5 行,其列名在顶部,索引在左侧。这已经是一些有趣的信息了。现在让我们尝试使用 info()函数:

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

这为我们提供了关于行数、150 个条目和 5 列数的信息。您可以在我们的列中看到哪些数据类型。在这个例子中,除了 species 列是一个整数之外,所有的列都是浮动的。

让我们看看 describe()函数可以在这里添加什么:

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

这里有更多的信息。我们可以看到每一列的最大值和最小值。我们也可以阅读集中趋势摘要:平均值和标准差,以及四分位范围(25%,50。75%).

这里还有一点没有探讨。在我的数据集中,所有的列都是数值型的,describe()函数对数值型和分类型变量的工作方式不同。为了演示如何使用这两者,我将添加一个名为“is_dangerous”的伪分类列。

import numpy as np
df['is_dangerous'] = np.where(df['sepal length (cm)']>6, 'yes', 'no')

我刚刚使所有萼片长度大于 6 的行变得危险。我们现在打电话描述一下。

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

请注意,我已经在 describe()中使用了 include 参数,并将其设置为“全部”。这使得函数也包括分类变量的数据描述。您可以看到 is_dangerous 列有两个唯一的值,最常见的是“no ”,它出现了 83 次。

我希望您可以看到,仅仅通过这三个函数:head()、info()和 describe()您就可以了解到许多关于数据的信息。

如何查看数据框中的所有列

如果您的数据框中有许多列,jupyter 笔记本的默认行为是显示一些第一列和最后一列以及中间的三个点(…)。如果您的数据框有许多行,并且您想要查看所有行,情况也是如此。简单的解决方法是使用以下代码检查数据框的尺寸并更改默认显示设置:

pd.set_option('display.max_columns', 500)  
pd.set_option('display.max_rows', 500)

在代码中导入后添加此内容,并将数字设置为您的数据框尺寸。

如有必要,重命名列名

如果列名过长,包含空格,或者不是好的列名,最好的方法是重命名它们。在你分析的一开始就这么做,会解决很多问题。让我们看看 iris 数据集中的默认列名。

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

您可以看到这里的列名并不理想。我认为公制(厘米)是多余的,我建议使用下划线代替空格。这将允许您稍后使用点符号选择数据框中的列。那我们换个名字吧:

df.columns = df.columns.str.replace(' \(cm\)', '').str.replace(' ', '_')

我删除了列名中的’(cm)'并用下划线替换了空格。通常的做法是删除列名中的尾随空格(如果有的话)。此外,如果列名没有遵循可以应用于所有列名的模式,您可以一个一个地更改它们。

使用内置的绘图功能绘制简单的数据图

要做简单的绘图,你可以使用内置的熊猫函数。Pandas 函数在某种程度上是有限的,为了进行进一步的分析,你可能需要学习如何使用 matplotlib 或 seaborn,但是如果你想制作一个快速图表来查看你的数据,你可以使用这些一行程序。让我们用 Iris 数据集再次探索它们。我将绘制数据集中所有例子的萼片长度:

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

这里的 x 轴代表指数(单个例子), y 轴代表萼片长度。记住在 matplotlib 导入后添加’ %matplotlib inline’ ,这样您的图形就会显示在笔记本中。

你也可以把这两个变量分散开来。让我们通过将萼片长度与萼片宽度进行分散来展示这一点。

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

另一个有用的熊猫图是直方图,它可以应用于整个数据框。这样,它将为所有数字列绘制直方图:

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

为了可视化分类数据,您可以使用 pandas 的 value_counts()函数和条形图:

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

可以看到用熊猫库绝对可以做一些简单的图形。深入研究文档,了解更多信息,并学习如何使用不同的参数使您的图形更好。

了解 loc 和 iloc 选择的工作原理,并能够自信地使用它

Loc 和 iloc 是从数据框中选择数据的方法。loc 允许您通过名称(列名和索引名)访问数据,而 iloc 也是如此,但是您需要对列和索引都使用整数索引(因此 iloc 表示 int number)。

让我们看看它们在实践中是如何工作的:

df.loc[:, ['sepal_length', 'sepal_width']]

上面的代码为 sepal_length 和 sepal_width 两列选择了所有行(冒号是 all 的快捷方式)。

df.loc[10:50, ['sepal_length', 'sepal_width']]

上面的代码选择了相同的列,但只选择了 10 到 50 之间的行。我们在这里使用整数来选择行,而我们使用 loc,这可能会令人困惑。这是因为我们的索引是整数,因为我们在创建数据框时使用了默认索引。你可以有字符串形式的索引,比如唯一的行标识符。为了展示这一点,让我们将索引改为字符串:

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

我现在已经将索引改为字符串,并调用 head 函数来查看一些数据条目。

乍一看,数据框看起来是一样的,但我想说明有一个重要的区别。让我们尝试与上一个示例相同的选择:

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

尝试这段代码时,应该会出现错误。我不打算深究错误的细节,但这是因为 loc 需要使用特定的索引值,这些值现在是字符串,而不是整数。但是,您可以使用 iloc 来执行相同的操作。

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

您能看到我们必须将列名更改为相应的列号吗?这是因为 iloc 不处理列名,而是处理它们的索引(第一列从 0 开始)。

您可以在“走向数据科学”上找到有关数据框选择的更多详细教程,但我想说的主要观点是,您希望尽快了解如何使用它们,以便能够快速有效地操作您的数据框。

轴:0 代表行,1 代表列

对于不记得的人来说,这是一个相当快速实用的提示。在熊猫中,我们总是首先提到行,然后是列。因此,如果 df.shape 给定为(160,2),则意味着有 160 行和 2 列。当我们使用 loc 和 iloc 时,方括号中的第一项是指行,第二项是指列。当我们使用 pandas 函数时,需要轴参数,比如 apply(),那么轴=0 表示行,轴=1 表示列。

使用自动补全功能

我的最后一个技巧是在 jupyter notebook 中使用自动完成功能。它是内置的,当你开始输入变量来激活它时,你只需要点击 tab 键。这会节省你打字和调试错别字的时间。如果你仍然不知道如何使用它,检查一下我不久前写的 j upyter 自动完成文章

结论

我已经给了你一些关于如何使用熊猫的实用技巧,现在是时候在一些真实的数据集上尝试它们了。这绝对不是一个排他性的列表,还有很多要学习和涵盖。我认为这可以让你走上正确的道路,并在开始使用一个新的库时消除一些最初的困惑。

祝你好运!

原载于 about datablog . com:2019 年 11 月 11 日开始与图书馆合作时的 7 个实用熊猫小贴士。

PS:我正在 Medium 和aboutdatablog.com上撰写以简单易懂的方式解释基本数据科学概念的文章。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入

下面还有一些你可能喜欢的帖子

* [## python 中的 lambda 函数是什么,为什么你现在就应该开始使用它们

初学者在 python 和 pandas 中开始使用 lambda 函数的快速指南。

towardsdatascience.com](/what-are-lambda-functions-in-python-and-why-you-should-start-using-them-right-now-75ab85655dc6) [## Pandas 数据操作函数:apply()、map()和 applymap()

以及如何在熊猫身上正确使用它们…

towardsdatascience.com](/pandas-data-manipulation-functions-7b3519fc1370) [## 对熊猫中的数据框进行排序

如何快速有效地排序数据帧

towardsdatascience.com](/sorting-data-frames-in-pandas-a5a3af6f346a)*

确保和维持数据质量的 7 个步骤

原文:https://towardsdatascience.com/7-steps-to-ensure-and-sustain-data-quality-3c0040591366?source=collection_archive---------1-----------------------

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

Image by Gerd Altmann from Pixabay (CC0)

几年前,我遇到了一个大公司的高级主管。他提到,他工作的公司面临着影响客户满意度的数据质量问题,他花了几个月的时间调查潜在的原因以及如何解决这些问题。“你发现了什么?”我急切地问。“这是一个棘手的问题。我没有找到一个单一的原因,相反,许多事情出了差错,”他回答说。然后,他开始列举一长串导致数据质量问题的原因——几乎公司的每个部门都参与其中,他很难决定下一步从哪里开始。这是处理数据质量的一个典型案例,数据质量直接关系到一个组织如何开展业务以及数据本身的整个生命周期。

在数据科学成为主流之前,对于交付给内部或外部客户的报告,数据质量最常被提及。如今,由于机器学习需要大量的训练数据,组织内部的数据集需求很大。此外,分析人员总是渴望获得数据,并不断搜索可能增加价值的数据资产,这导致人们快速采用以前未探索或使用过的新数据集或数据源。这一趋势使得数据管理和确保良好数据质量的良好实践比以往任何时候都更加重要。

本文的目标是让您清楚地了解如何构建一个数据管道,从一开始就创建并维持良好的数据质量。换句话说,数据质量不是通过发现问题并修复问题就能从根本上改善的。相反,每个组织都应该首先从生产高质量的数据开始。

首先,什么是数据质量?一般来说,当数据满足客户、决策者、下游应用程序和流程的预期用途要求时,它就是高质量的。一个很好的类比是制造商生产的产品质量,对于制造商来说,好的产品质量不是业务成果,而是推动客户满意度并影响产品本身的价值和生命周期。同样,数据质量也是一个重要的属性,它可以推动数据的价值,从而影响业务成果的各个方面,如法规遵从性、客户满意度或决策的准确性。下面列出了用于衡量数据质量的 5 个主要标准:

  • **准确性:**无论描述什么数据,都需要准确。
  • **相关性:**数据应满足预期用途的要求。
  • **完整性:**数据不应有缺失值或缺失数据记录。
  • **时效性:**数据要最新。
  • **一致性:**数据应该具有预期的数据格式,并且可以与相同的结果进行交叉引用。

良好数据质量的标准可能因要求和数据本身的性质而异。例如,一家公司的核心客户数据集需要满足上述标准的非常高的标准,而对于第三方数据源,可能存在更高的错误或不完整性容忍度。对于一个交付高质量数据的组织来说,它需要从头到尾管理和控制在管道中创建的每个数据存储。许多组织只是关注最终数据,并在数据交付之前投资于数据质量控制工作。这还不够好,而且通常情况下,当问题最终被发现时,已经太晚了—要么需要很长时间才能找到问题的来源,要么解决问题的成本和时间都太长了。然而,如果一个公司能够在接收或创建每个数据集时管理其数据质量,那么数据质量自然是有保证的。实现这一目标有 7 个基本步骤:

1。严格的数据分析和输入数据控制

大多数情况下,坏数据来自数据接收。在一个组织中,数据通常来自公司或部门控制之外的其他来源。它可能是从另一个组织发送的数据,或者在许多情况下是由第三方软件收集的数据。因此,其数据质量无法得到保证,对输入数据进行严格的数据质量控制可能是所有数据质量控制任务中最重要的方面。一个好的数据分析工具就派上了用场;这种工具应该能够检查数据的以下方面:

  • 数据格式和数据模式
  • 每个记录的数据一致性
  • 数据值分布和异常
  • 数据的完整性

此外,还必须实现数据分析和数据质量警报的自动化,以便无论何时收到传入数据,都可以对其质量进行一致的控制和管理——在没有进行分析和检查的情况下,永远不要认为传入数据与预期的一样好。最后,应该使用相同的标准和最佳实践来管理每个传入的数据,并且应该建立一个集中的目录和 KPI 仪表板来准确记录和监控数据的质量。

2。精心设计数据管道,避免重复数据

重复数据是指全部或部分数据是使用相同的逻辑从相同的数据源创建的,但是由不同的人或团队出于不同的下游目的创建的。当创建重复数据时,它很可能不同步,并导致不同的结果,在多个系统或数据库中产生级联效应。最后,当出现数据问题时,跟踪根本原因变得困难或耗时,更不用说修复它了。

为了防止这种情况发生,组织需要在数据资产、数据建模、业务规则和体系结构等领域对数据管道进行清晰的定义和精心的设计。还需要有效的沟通来促进和加强组织内的数据共享,这将提高整体效率,减少数据重复造成的任何潜在的数据质量问题。这涉及到数据管理的核心,其细节超出了本文的范围。概括地说,需要建立 3 个方面来防止创建重复数据:

  1. 数据治理计划,明确定义数据集的所有权,并有效沟通和促进数据集共享,以避免任何部门孤岛。
  2. 集中式数据资产管理和数据建模,并定期进行审查和审计。
  3. 企业级数据管道的清晰逻辑设计,在整个组织内共享。

随着当今技术平台的快速变化,可靠的数据管理和企业级数据治理对于未来成功的平台迁移至关重要。

3。准确收集数据要求

拥有良好的数据质量的一个重要方面是满足需求,并根据数据的用途将数据交付给客户端和用户。这并不像听起来那么简单,因为:

  • 恰当地呈现数据并不容易。真正理解客户的需求需要彻底的数据发现、数据分析和清晰的沟通,通常是通过数据示例和可视化。
  • 需求应该捕获所有的数据条件和场景——如果没有评审和记录所有的依赖关系或条件,那么它就被认为是不完整的。
  • 清晰的需求文档,易于访问和共享,是另一个重要的方面,应该由数据治理委员会强制执行。

业务分析师的角色在需求收集中是必不可少的。他们对客户以及当前系统的了解,让他们能够说双方的语言。在收集了需求之后,业务分析师还执行影响分析,并帮助提出测试计划,以确保生成的数据满足需求。

4。数据完整性的实施

关系数据库的一个重要特性是能够使用外键、检查约束和触发器等技术来加强数据完整性。随着数据量的增长,以及越来越多的数据源和可交付成果,并非所有数据集都可以存在于单个数据库系统中。因此,数据的引用完整性需要由应用程序和流程来实施,它们需要由数据治理的最佳实践来定义,并包含在实现的设计中。在当今的大数据世界中,引用实施变得越来越困难。如果一开始就没有实施完整性的观念,引用的数据可能会过时、不完整或延迟,从而导致严重的数据质量问题。

5。将数据谱系可追溯性集成到数据管道中

对于设计良好的数据管道,解决数据问题的时间不应随着系统的复杂性或数据量的增加而增加。如果没有管道中内置的数据沿袭可追溯性,当数据问题发生时,可能需要几个小时或几天才能找到原因。有时它可能会经过多个团队,需要数据工程师查看代码进行调查。

数据沿袭可追溯性有两个方面:

  • **元数据:**追踪数据集、数据字段之间的关系以及它们之间的转换逻辑的能力。
  • **数据本身:**快速跟踪数据问题到上游数据源中的单个记录的能力。

元数据可追溯性是有效数据治理的重要组成部分。这是通过从一开始就对每个数据集(包括其字段和结构)进行清晰的文档记录和建模来实现的。当数据管道由数据治理设计和执行时,应该同时建立元数据可追溯性。如今,元数据沿袭跟踪是市场上任何数据治理工具的必备功能,这使得通过几次点击来存储和跟踪数据集和字段变得更加容易,而不是让数据专家浏览文档、数据库甚至程序。

数据追溯比元数据追溯更难。下面列出了实现这种能力的一些常用技术:

  1. 通过每个数据集的唯一键进行跟踪:这首先要求每个数据集有一个或一组唯一键,然后通过管道传递到下游数据集。但是,并不是每个数据集都可以通过唯一键进行跟踪。例如,当数据集被聚合时,来自源的键会在聚合数据中丢失。
  2. 当数据本身没有明显的唯一键时,构建一个唯一的序列号,例如事务标识符或记录标识符。
  3. 当存在多对多关系,而不是一对一或一对多关系时,构建链接表。
  4. 为每个数据记录添加时间戳(或版本),以表明它是何时添加或更改的。
  5. 在日志表中记录数据更改,包括更改前的值和更改发生时的时间戳

数据可追溯性需要时间来设计和实现。然而,对于数据架构师和工程师来说,从一开始就将其构建到管道中具有战略重要性;考虑到当数据质量问题发生时,这将节省大量的时间,这绝对是值得的。此外,数据可追溯性为进一步改进数据质量报告和仪表板奠定了基础,使人们能够在数据交付给客户或内部用户之前尽早发现数据问题。

6。作为变更管理一部分的自动化回归测试

显然,当引入新数据集或修改现有数据集时,数据质量问题经常发生。为了有效的变更管理,测试计划应该建立两个主题:1)确认变更满足需求;2)确保改变不会对管道中不应该改变的数据产生无意的影响。对于任务关键型数据集,当发生变化时,应对每个可交付成果实施常规回归测试,并对数据集的每个字段和每一行进行比较。随着大数据技术的快速进步,系统迁移在几年内不断发生。具有彻底数据比较的自动化回归测试是必须的,以确保始终保持良好的数据质量。

7。有能力的数据质量控制团队

最后,两类团队在确保组织的高数据质量方面发挥着关键作用:

**质量保证:**这个团队检查软件和程序的质量,无论何时发生变化。该团队执行的严格变更管理对于确保组织中的数据质量至关重要,因为该组织正在经历数据密集型应用程序的快速转变和变化。

**生产质量控制:**根据组织的不同,这个团队并不一定是一个独立的团队。有时它可能是质量保证或业务分析师团队的一个功能。团队需要很好地理解业务规则和业务需求,并配备工具和仪表板,以检测生产中发生的异常、异常值、中断的趋势和任何其他不寻常的场景。该团队的目标是识别任何数据质量问题,并在用户和客户之前解决这些问题。这个团队还需要与客户服务团队合作,可以从客户那里获得直接反馈,并快速解决他们的问题。随着现代人工智能技术的进步,效率可能会大幅提高。然而,正如本文开头所述,最终的质量控制是必要的,但不足以确保公司创建和维持良好的数据质量。上述 6 个步骤也是必需的。

总结

总之,良好的数据质量需要严格的数据治理、对传入数据的严格管理、准确的需求收集、针对变更管理的全面回归测试以及数据管道的精心设计,此外还需要针对外部和内部交付数据的数据质量控制计划。对于所有质量问题,从一开始就防止数据问题的发生要比依靠防御系统和临时修复来处理数据质量问题容易得多,成本也低得多。最后,通过遵循本文中的 7 个步骤,良好的数据质量不仅可以得到保证,而且可以持续下去。

帮助您发现数据真正潜力的 7 个步骤

原文:https://towardsdatascience.com/7-steps-towards-putting-that-data-to-good-use-37e5c9670ea0?source=collection_archive---------34-----------------------

别再看数据了。看看你的用户。

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

相信我,我知道我在做什么

我以前是开发商。奥尔德斯库尔。当我们不得不解决一个问题时,我们会一头扎进去。除了代码什么都没有。码码码。我们知道我们在做什么。我们知道人们想要什么。对吗?

今天,这几乎是不可想象的(除了这里和那里,但这里和那里可能没有做好生意)。UX(用户体验)设计改变了我们看待解决(数字)问题的方式。我们让用户参与进来。首先!

我做了 10 年的开发人员(2003-2013)。我只见过两次用户参与。我的第一次经历是在英国纪念运动会上。我们正在为 Xbox 和 PlayStation 开发 MotoGP 09/10。现在,随着游戏的发展,事情变得越来越复杂。而且你需要一个 QA 团队来发现一个未完成的游戏中自然出现的成千上万的 bug(我不是说这不能部分改进)。第二个病例发生在比利时的 iChoosr。我们租了一个 UX 的地方:单向镜玻璃,麦克风和摄像机,屏幕录制,眼球追踪,等等!我们必须弄清楚用户是否真正理解并能使用我们的 web 应用程序。

请注意,这两种情况都发生在大部分开发工作完成之后。焦点是可用性。不是的用处。现在,这比没有用户参与要好,但仍然不够好。

2013 年,我开始在比利时鲁汶大学的人机交互小组攻读博士学位。我的目标?创建仪表板,帮助学生更好地了解他们的活动,帮助他们思考和收集关于他们的过程和进度的见解。那我是怎么做到的呢?

通过先深入代码头…

我为什么要在不知道学生需要什么的情况下创造一些东西?

是时候赶上了

让数据得到好的利用通常是这样的:雇佣一群非常聪明的人,让他们自由使用你的数据。一去不复返了(可能不会,但让我们想象一下),我们报告说忍者制作出你所见过的最疯狂的交互式电子表格,这在 Excel 中是不可能的。不,今天数据科学家将挖掘你的数据并找到模式,或者机器学习专家将创建预测未来的模型。数据可视化和仪表板通常是事后才想到的,导致在支持或业务团队办公室的大显示器上显示过于复杂的仪表板,他们甚至很可能不会看它。(我确实过于简单化了)。

为了创建可用的,但更重要的是有用和有价值的应用程序,你需要让用户参与进来。我们看到越来越多的行业出现这种情况。然而,在设计数据可视化或仪表板时,我们中的一些人似乎仍然落后。

不要让数据说话

我花了六年多的时间从用户的角度研究数据可视化设计。虽然在考虑解决方案之前对自己拥有的数据有一个大致的概念是很重要的,但是你应该问自己的第一个问题是“用户需要什么”。因为,如果用户不需要,又何苦呢?你可以省去很多麻烦。

如果您希望改进您的数据解决方案,或者探索新的途径,请采取小步骤。按正确的顺序拿就行了。以下是让你开始的列表(顺便说一下,这种 UX 方法适用于任何数字解决方案):

  1. 开始对话:
    通过与其他团队(业务、营销等)交流,探索您数据的潜力,组织头脑风暴会议,让对话持续下去!
  2. 让客户参与:
    如果你的数据有任何公共/客户价值,在你的网站上建立调查,分析你的客户行为,……问他们他们需要什么。你会对你的发现感到惊讶。
  3. 草图: 不要开始实施!在白板、纸上探索想法,无论什么最快的方式。
  4. 获取反馈:
    把你的想法反馈给你的潜在用户。征求他们的反馈,根据你的草图进一步探索他们的需求。试着理解你做得好的地方,你可以改进的地方,以及你应该放弃的道路。
  5. 原型: 为你的想法创造一个视觉表现。不要开发,而是通过创建真实的模型来帮助你的用户“想象”可视化的潜力。如果你还没有得到项目所需的预算,这是将你的结果提交给管理层的绝佳机会。说服他们这是值得追求的(不要忘记包括步骤 1-4 的结果)。
  6. 迭代:
    让你的客户参与设计过程。在设计和评估之间来来回回。逐步完善你的解决方案。如果很难联系到客户,那就求助于你的同事。任何你自己以外的反馈都是有用的。
  7. 实现: 使之实现。交给开发团队。但是不要止步于此。让你的用户保持亲密。向他们学习(通过跟踪、采访等方式)

整个过程需要时间。但每一步都有有价值的、切实的、可操作的结果。我被一些公司雇佣去研究他们的数据潜力,几天内就有了结果!他们从未考虑过的新解决方案很快变成了新项目。

现在,你 可以雇佣像我 这样的人,他们会和你一起经历这些步骤(对所有在另一个大陆的人:是的,这也是完全可行的远程工作)。我在这个问题上的经验确实加快了这个过程,我非常擅长设计数据可视化原型,并且我总是很乐意帮助公司发现他们的数据拥有的潜力!

但是!如果你想把事情掌握在自己手中,我会建议检查一下 这个我创造的 课程。它会带你走过所有的步骤。如果你已经有了一个项目,它实际上是一个很好的指南,因为它是一个基于项目的课程。

[## 创建可视化模型:图形设计师的数据可视化和 UX 基础

学习 UX 和数据可视化设计的基础知识!在本课程中,您将学习如何创建数据可视化…

skl.sh](https://skl.sh/2ylWvvq)

如果你两周后碰巧在布鲁塞尔附近,我会在做一个演讲讲讲这种方法如何在教育和失业领域产生了几个成功的仪表板。

我很想了解更多以用户为中心的数据可视化成功案例。所以请在评论里分享!

我是一名 自由职业数据可视化 x UX 研究员/顾问/设计师 。想聊天或者雇佣我,来 svencharleer.com打个招呼吧!

快速改进 Python 数据分析的 7 件事

原文:https://towardsdatascience.com/7-things-to-quickly-improve-your-data-analysis-in-python-3d434243da7?source=collection_archive---------5-----------------------

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

A pretty picture to catch your eye.

让您的数据分析更上一层楼!

再次感谢你

对听起来像破记录的完全明显的风险视而不见我只想对另一个巨人说一声谢谢感谢所有阅读和分享我上两篇文章的人: Python 窍门 101,每个新程序员都应该知道的事情只用一行 Python 代码 探索您的数据。在这里,我认为“Python 技巧 101…”的文章是成功的,然后你继续前进,再次吹走任何期望。
所以,引用我自己的话:

“谢谢,让我们继续吧!”

在这篇文章中,我认为创建一个我学到的东西的列表会很好,这些东西加速或改进了我的日常数据分析。所以,事不宜迟,这里列出了我们将在文章中涉及的内容:

内容概述:

  1. 熊猫简介
  2. 使用袖扣绘制熊猫数据& Plotly
  3. IPython 魔法命令
  4. Jupyter 中的奇特格式
  5. Jupyter 快捷键
  6. Jupyter(或 IPython)中每个单元的多个输出
  7. 立即在你的 Jupyter 笔记本上制作幻灯片

如果这些听起来像是你可能喜欢学习的东西,继续滚动。

请注意,这将是一个相当长的问题。尽管如此,我还是尽可能做到简明扼要。我希望你喜欢!

#1:熊猫简介

对于那些一直关注我的人来说,这并不奇怪。这个工具的好处是显而易见的。下面的动画是调用简单方法df.profile_report()的结果,自己看看结果报告:

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

使用这个工具很简单,只需安装和导入 Pandas Profiling 包。

我不会在这个问题上花太多时间,因为我已经写了一篇关于这个主题的小文章,所以如果你想知道更多关于这个包的宝石,那么请在这里阅读我关于熊猫简介的文章:

[## 仅用一行 Python 代码探索您的数据

在不到 30 秒的时间内完成所有标准数据分析。熊猫侧写的奇迹。

towardsdatascience.com](/exploring-your-data-with-just-1-line-of-python-4b35ce21a82d)

#2:使用袖扣绘制熊猫数据& Plotly

我们当中大多数有着经验的数据科学家或数据分析师,都会对【matplotlib】熊猫 之间的集成相当熟悉。也就是说,你可以快速绘制一个简单的 pd 图。数据帧或 pd。系列,只需调用.plot()方法:

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

Kind of boring right?

现在,这一切都很好,但如何一个互动的,可平移,可缩放,可缩放的情节呢? 袖扣 来救场了!(承蒙)****

要在您的环境中安装袖扣,只需在您最喜欢的终端上运行! pip install cufflinks --upgrade,您就可以开始了。看一看以下内容:

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

Much better!

注意,上面唯一改变的是袖扣的进口和cf.go_offline() 的设置。除此之外,只需将你的.plot()方法改为.iplot()即可。

.scatter_matrix()这样的其他方法也能给你一些非常好的观想:

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

Very cool!

我强烈建议任何从事大量数据可视化工作的人看看 袖扣plottly的文档,为自己发现更多的方法!

#3: IPython 魔法命令

IPython 的“魔力”基本上是 IPython 在标准 Python 语法之上的一系列增强。魔术命令有两种风格:线魔术,由单个%前缀表示并在单行输入上操作,以及单元魔术,由双%%前缀表示并在多行输入上操作。以下是“魔术”提供的一些有用的功能:

%lsmagic:找到他们。

为什么不从一些古老的自助开始呢?如果你要记住一个魔法命令,它应该是这个。执行%lsmagic命令将授予您所有可用魔法命令的完整列表:

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

%debug:交互式调试。

这大概是我用的最多的魔法命令了。

我们大多数人都尝试过:你发现自己正在执行一个不断中断的代码块,而你——在极度绝望中——编写 20 条 print()——语句来输出每个变量的内容。然后,当您最终解决问题时,您必须返回并再次删除所有打印功能。

但现在不是了!遇到问题后,只需执行%debug命令,并执行您想要的任何代码部分:

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

那么上面发生了什么?

  1. 我们有一个函数,它接受一个列表作为输入,对所有偶数求平方。
  2. 我们运行我们的函数,但是有东西坏了。我们没被告知什么!
  3. 我们使用%debug命令在函数中断时进入函数。
  4. 我们要求调试器告诉我们xtype(x)的值。
  5. 失败是明显的。我们将'6'作为字符串传递!****

这对于更复杂的函数非常有用,我相信你可以想象得到!

%store:在笔记本之间传递变量。

这个也很酷。为了便于讨论,假设您花了一段时间清理笔记本中的一些数据,现在您想在另一台笔记本中测试一些功能,因此您必须在同一台笔记本中实现这些功能,或者保存您的数据并将其加载到另一台笔记本中,对吗?不是用%store!只需存储变量并在您想要的任何其他笔记本中检索它:

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

%store [variable]存储变量。
%store -r [variable]读取/检索存储的变量。

%who:列出全局范围的所有变量。

曾经给一个变量赋值却忘记了变量名?也许你不小心删除了单元格为变量赋值的职责?用%who你会得到一个所有全局赋值变量的列表:

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

%%time:魔法计时。

通过这个小命令,您可以获得您可能需要的所有时间信息。只需将%%time命令应用于您想要的任何一段可执行代码,您将得到如下输出:

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

24 micro-seconds… Sloppy

%%writefile:将单元格内容写入文件。

而这也将是我在本文中要讲的最后一个。当您在笔记本中编写了一些复杂的函数或类,并希望将其保存在独立于笔记本的文件中时,这种方法特别有用。只需在函数或类的单元格前加上%%writefile命令,后跟一个文件名来保存它:

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

如您所见,我们可以简单地将我们创建的函数保存到一个" utils.py "文件中,然后我们就可以随意地导入它。在其他笔记本中也是如此!(只要它们在 utils.py 文件的同一个目录中)

# 4:Jupyter 中的奇特格式

这个超级酷!基本上,Jupyter 允许在 markdown 单元格中设置一些 HTML / CSS 格式。这些是我用过最多的一次:

蓝色时尚的那款:

***<div class="alert alert-block alert-info">
    This is <b>fancy</b>!
</div>***

红色的有点吓人的那个:

***<div class="alert alert-block alert-danger">
    This is <b>baaaaad</b>!
</div>***

绿色和宁静的那个:

***<div class="alert alert-block alert-success">
    This is <b>gooood</b>!
</div>***

在这里看看他们的行动:

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

当你想用笔记本的形式展示一些发现时,这些是很好的选择!

#5: Jupyter 快捷键

访问和学习键盘快捷键,可以使用命令调板:Ctrl + Shift + P。这将显示笔记本所有功能的列表。以下是最基本命令的摘录:

Esc:这将带你进入 命令模式 。这也是您可以使用箭头键浏览笔记本的模式。

而在 命令模式下 :

  • AB:在当前单元格的上方或下方插入一个新单元格。
  • M:将当前单元格改为[Mark down。
  • Y:将当前单元格改为编码。(y tho?)
  • D,D:[D]有效[D]删除当前单元格。

Enter:返回当前单元格的 编辑模式

编辑模式下 :

  • Shift + Tab:显示您在当前单元格中键入的对象的Docstring(documentation)——按住快捷键在文档模式间循环。****
  • Ctrl + Shift + -:从光标所在位置拆分当前单元格。
  • Esc + F:查找并替换除输出之外的代码。
  • Esc + O:切换单元格输出。

选择多个单元格:

  • Shift + DownShift + Up:选择向下或向上的下一次卖出。我认为你可以用推理的力量找出哪个是哪个。
  • Shift + M:合并选中的单元格。
  • 作为旁注,请记住,一旦选择了单元格,您就可以批量删除/复制/剪切/粘贴/运行它们。

# 6:Jupyter(或 IPython)中每个单元的多个输出

这个很棒。你有没有想过展示?head()和。tail()但是你中途放弃了,因为创建额外的代码单元来运行。tail()方法?不用担心,现在您可以使用以下代码行显示您想要的所有输出:

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

瞧,多路输出的力量:

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

Easy peasy lemon squeezy

#7:即时制作笔记本幻灯片

使用 RISE 功能,只需轻轻一击,你就可以将你的 Jupyter 笔记本变成幻灯片。最棒的是,笔记本还是活动的,可以边演示边进行现场编码!看一看:

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

Source: https://github.com/damianavila/RISE

要使用这款出色的工具,只需根据您的环境使用 conda 或 pip 安装 RISE 即可:

***conda install -c conda-forge rise
/// OR ///
pip install RISE***

现在,只需单击“新建”按钮,您就可以从笔记本中创建精美的幻灯片:

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

结束语

感谢阅读。我鼓励任何人自己更详细地探索每一点,找出你想要在自己的工作流程中应用它们的确切内容和方式。

如果你想看和了解更多,一定要关注我的 媒体 🔍碎碎念 🐦****

***** [## 彼得·尼斯特鲁普-中等

阅读彼得·尼斯特拉普在媒介上的作品。数据科学、统计和人工智能…推特:@PeterNistrup,LinkedIn…

medium.com](https://medium.com/@peter.nistrup)*****

关于 ROC AUC 你应该知道的 7 件事

原文:https://towardsdatascience.com/7-things-you-should-know-about-roc-auc-b4389ea2b2e3?source=collection_archive---------7-----------------------

流行的性能指标的几个警告

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

Image by Gerd Altmann from Pixabay

不同分类问题的模型可以通过尝试最大化或最小化各种性能测量来拟合。针对模型性能的一个方面而非另一个方面的测量非常重要,以便我们能够做出明智的决策,并选择最适合我们设计的性能测量。

ROC AUC 通常在许多领域中被用作评估分类器性能的突出度量,并且研究人员可能由于较高的 AUC 而偏爱一个分类器。

关于 ROC AUC 的复习,可以在这里找到清晰简明的解释。如果你对 ROC AUC 完全不熟悉,你可能会发现这篇文章对这个主题挖掘得有点太深,但我希望你仍然会发现它很有用,或者将它收藏起来以供将来参考。

此处提供的大部分材料基于[ Lobo 等人,2008 ]的一篇论文,其中作者阐述了关于使用 ROC AUC 评估分类模型性能的几个问题。

我们将回顾使用 ROC AUC 时应该注意的几个问题,并查看一些示例以更好地理解它们。

苹果不是橘子

乍一看,似乎使用两个分类器的决策函数计算的单个数字(ROC AUC)确实可以用于比较它们。这个想法是基于隐含的假设,即两个分类器的 AUC 是以独立于分类器决策函数输出(即分数)分布的方式导出的。
然而,在手,2009 作者表明,事实并非如此:

AUC 使用取决于分类器本身的度量来评估分类器。也就是说,AUC 使用不同的度量来评估不同的分类器。

并进一步提供了以下类比:

这就好像一个人用一把以英寸为单位的尺子测量一个人 A 的身高,而另一个人用一把以厘米为单位的尺子测量一个人 B 的身高,然后仅仅通过比较数字来决定谁更高,而忽略了测量单位不同的事实。"

简而言之 AUC 是一个平均的最小损失度量,其中错误分类损失是在一个成本比分布上平均的,该成本比分布取决于所讨论的分类器的分数分布。

换句话说,我们可以计算分类器 A 的 AUC 并得到 0.7,然后计算分类器 B 的 AUC 并得到相同的 AUC 0.7,但这并不一定意味着它们的性能相似。

我们鼓励好奇的读者阅读[ Hand,2009 ],在那里他会找到对该问题非常直观的解释,以及严格的数学分析,然后是建议的解决方案。

概率值被忽略

让我们比较两个假设的二元分类模型,它们适用于来自数据的相同样本:

  • 模型 A 预测许多正面例子有 ~0.55 的概率为正面,许多负面例子有 ~0.45 的概率。
  • 模型 B 预测许多正面例子有概率 ~0.85 为正面,许多负面例子有概率~ 0.25

两个模型可以有非常相似的 AUC,但模型 B 在区分正面和负面例子方面显然做得更好。选择不同的样本并重新调整我们的模型会产生不同的结果,而模型 B 的卓越的分类能力会更加明显。

如果我们仅依靠 AUC 来评估模型表现,我们可能会认为模型 A 和 B 非常相似,而事实上它们并不相似。

“曲线下面积”不等于“感兴趣面积”

评估 ROC 曲线时,有两个区域描述了模型在“极端”阈值下的表现:

  • 曲线的左侧有一个小的真阳性率,也有一个小的假阳性率。
  • 曲线的右边,我们有很大的真阳性率,也有很大的假阳性率。

我们显然不会仅仅因为一个模型在这些区域有较大的 AUC 而偏爱它,但是 AUC 只是一个单一的数字,它也包括这些区域的 ROC 曲线下的面积。

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

Image by Author

A 型比 B 型好吗?

两个模型的 AUC 非常相似,但模型 A 在真阳性率与假阳性率(对于所有阈值)方面更一致,而对于模型 B,真阳性率和假阳性率之间的比率高度依赖于阈值选择-阈值越低越好。

哪个更重要?真阳性率还是假阳性率?

在某些情况下,最小化假阳性率比最大化真阳性率更重要,而在某些情况下,可能正好相反。这完全取决于我们的模型将如何被使用。

当计算 AUC 时,假阳性率和真阳性率的权重相等,因此它不能帮助我们选择适合我们特定用例的模型。

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

Image by Author

A 和 B 哪个型号更好?

这取决于我们的领域和我们打算使用模型的方式。

  • 考虑到模型 A 的 ROC 曲线,如果我们决定我们必须有至少 60% 的真阳性率,我们将不得不接受该模型也将有 30% 的假阳性率。
  • 考虑到模型 B 的 ROC 曲线,我们可以实现至少 60% 的真阳性率和 20% 的假阳性率。

如果最小化假阳性率是我们案例中最重要的衡量标准,那么模型 B 优于模型 A,即使它们具有非常相似的 AUC。

模型误差在特征范围内的分布

让我们比较两个简单的二元分类模型,它们使用单个特征 x 来预测类别 y
假设两个模型达到相同的精度。

  • 模型 A 的误分类错误发生在 x 的小值以及 x 的大值。
  • 模型 B 的误分类错误多发生在 x 的低值,很少发生在 x 的大值。

两种模型可以具有非常相似的 AUC,但是:

  • 对于 x 的大值,模型 B 在预测 y 方面要好得多。
  • 型号 A 在 x 范围内具有更一致的性能

AUC 本身无法让我们知道模型之间的性能有如此大的差异,我们也不知道它们的误差分布是否不同。

评估不平衡类的性能

我们经常会遇到类别不平衡的数据。
考虑两个混淆矩阵,这两个混淆矩阵是通过对来自数据的两个不同样本拟合相同的模型而获得的:

: AUC 使用模型的单一阈值计算,如[ Sokolova & Lapalme,2009 ]:
AUC = 0.5*(灵敏度+特异性)。

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

Image by Author

我们的混淆矩阵如下:

  • 混淆矩阵 A 是在样本上评估模型的结果,其中正例构成数据的 10%
  • 混淆矩阵 B 是在样本上评估相同模型的结果,其中正面例子构成数据的 3%
    我们通过将反面案例的数量增加一倍、正面案例的数量减半来实现这一目标

性能指标包括:

  • 混淆矩阵 A
    精度:0.5
    召回:1
    F1-得分:0.666
    AUC: 0.5625
  • 混淆矩阵 B
    精度:0.2
    召回:1
    F1-得分:0.333
    AUC: 0.5625

在这两种情况下,我们获得了相同的 AUC,但是其他测量值(例如 F1 分数)的变化表明,我们的模型的性能根据正例的比例而变化,而 AUC 在上述条件下是不变的-将负行和正行乘以不同的标量[ Sokolova & Lapalme,2009 ]。

同样,AUC 本身并不能提供我们评估模型性能所需的所有信息。

小样本精度

在[ Hanczar 等人,2010 ]中,作者进行了模拟研究以及对真实数据的分析,并发现 ROC 相关的估计值(AUC 是其中之一)是实际指标的相当糟糕的估计值。这在小样本(50-200 个示例)中更为突出,当类别不平衡时,情况会变得更糟。

换句话说,当我们使用 AUC 评估分类器的性能时,我们这样做是为了尝试和估计分类器 真实的 AUC,当它将“在野外”用于真实数据时(即,当我们的分类器将在生产中运行时)。然而,我们计算的 AUC(对于小样本)是一个糟糕的估计值——它离真正的 AUC 太远了,我们应该非常小心,不要相信它。

需要明确的是,如果我们基于包含 200 个样本的样本计算 AUC,并且我们获得的 AUC 为 0.9,那么真实的 AUC 可能是 0.75,我们无法知道(至少在不查看置信区间或其他一些工具的情况下,这些工具将使我们能够衡量估计量的方差)。

我们应该如何使用 ROC AUC 来衡量绩效?

而一些性能测量更容易解释(精确度、召回率等)。)ROC AUC 有时被视为一个神奇的数字,它以某种方式量化了我们需要了解的关于模型性能的所有信息。

正如我们所指出的,如果我们选择使用 ROC AUC,我们需要了解它的各种问题。如果在考虑了这些问题之后,我们仍然认为我们希望使用 ROC AUC 来评估分类器的性能,我们可以这样做。我们可以使用任何我们想要的方法,只要我们充分意识到它的局限性和缺点——正如我们使用 Recall 并记住它对于假阳性的数量是不变的一样,我们也可以使用 ROC-AUC,同时记住它的局限性。

重要的是要强调,不应该只使用单一的指标来比较分类模型的性能。在这方面,ROC AUC 与精确度、召回率或任何其他常用指标没有什么不同。为了全面地评估性能,我们最好考虑几个感兴趣的指标,同时了解它们的特征。

摘要

我们讨论了关于 ROC AUC 的几个问题:

  1. AUC 依赖于分类器的内在属性,这使得基于 AUC 的分类器比较不适合于比较(在许多常见情况下)。
  2. AUC 不反映分类器预测的潜在概率值。
  3. AUC 是通过考虑所有可能的评分阈值来计算的,无论我们是否会选择使用这些阈值。
  4. 假阳性和真阳性是同等重要的,不管它是否适合我们。
  5. AUC 不提供关于分类器误差分布的信息。
  6. AUC 相对于数据中阳性样本的比率是不变的。
  7. AUC 对于小样本是不可靠的。

ROC AUC 与其他指标相似,有其优点和缺点。因为有很多资料都提到了它的优点,所以这篇文章重点介绍了它的一些其他特征。这些是 ROC AUC 测量的特性,不一定是缺点。每个度量在某些条件下是可变的,而在另一些条件下是不变的(正如你可以在[ 索科洛娃&拉帕尔梅,2009 ]中看到的那样),这些属性是有利还是不利由用户决定。

最好使用几个指标来比较分类器,而不仅仅是一个,当使用 ROC AUC 时,人们还可以查看 ROC 曲线,它可以提供有价值的信息[ Fawcett,2004 ]。

好了

感谢您的阅读!我希望这篇文章对你有用。如果您有任何问题或建议,请留下评论。欢迎各种形式的反馈!

进一步阅读

[ Sokolova & Lapalme,2009 ]提供了在机器学习分类任务的完整频谱中使用的 24 个性能测量的分析,并审查了这些测量在混淆矩阵变化下出现的 8 个不变性属性的方差和不变性。

关于如何解读 ROC 图的非常好的论文,你可以参考[ Fawcett,2004 ]。作者自下而上非常透彻地解释了这个主题。

如果你对 ROC 曲线的置信带感兴趣[ Macskassy & Provost,2004 ]提供几个选项。

[ Ferri et al. 2005 ]引入了一种新的概率版 AUC,称为 pAUC,它在评估排名表现的同时也考虑了概率的大小。

参考

  1. 洛博,J. M .,希门尼斯-瓦尔夫德,a .,&雷亚尔,R. (2008)。 AUC:对预测分布模型表现的误导性衡量全球生态与生物地理学17 (2),145–151。
  2. Hand,D. J. (2009)。测量分类器性能:ROC 曲线下面积的连贯替代方法机器学习77 (1),103–123。
  3. m .索科洛娃和 g .拉帕尔梅(2009 年)。对分类任务的性能测量的系统分析信息处理&管理45 (4)、427–437。
  4. 汉扎尔,b .,华,j .,西玛,c .,温斯坦,j .,,m .,&多尔蒂,E. R. (2010)。ROC 相关估计的小样本精度生物信息学26 (6),822–830。
  5. 麦克卡西和教务长(2004 年)。ROC 曲线的置信带:方法和实证研究。第一届人工智能 ROC 分析研讨会会议录。2004 年 8 月。
  6. 茨韦塔纳·福塞特(2004 年)。ROC 图:研究者注意事项和实际考虑机器学习31 (1),1–38。
  7. Ferri,c .,Flach,p .,Hernández-Orallo,j .,和 Senad,A. (2005 年 8 月)。修改 ROC 曲线,纳入预测概率。在第二届机器学习 ROC 分析研讨会会议录(第 33–40 页)。机器学习国际会议。

优化表格数据显示的 7 条经验法则

原文:https://towardsdatascience.com/7-thumb-rules-to-optimize-your-tabular-data-presentation-97da86bbbf46?source=collection_archive---------25-----------------------

有时当你向观众展示你的研究成果时,你需要用一张表格。表格很难理解,因为它们可以同时显示多个维度,并且通常只使用标题来定义选择数据的方式。

当以表格的方式显示记录时,你的数据有可能不被识别。表格不会引起任何人的注意。你可以尽力解释每个单元格内的值,但你可能会失败。当与表格打交道时,人们首先需要理解表格是关于阅读标题的。然后,他们必须随机选择单元格来理解数据类型,并调整数值以评估他们所读取的数据量。最后,他们需要大量的精力来理解你在说什么。

TL;DR: 我将向您展示一些针对表格数据的数据识别技术。这些技术将帮助您的受众更多地关注您的单元格的影响,而不是表格定义本身——请随意下结论以获得快速的项目符号列表。

何时使用桌子

由于表格风险很大,你必须谨慎选择何时使用它们。它们能很好地展示分析数据和多维信息,但很难一目了然。在讨论你的发现时,只有在你离不开的情况下才选择一张桌子。

「只有离不开才选桌子」是什么意思?嗯,当一个事件的大小需要用数字来描述时,或者当需要一个数字参考来捕捉数据的影响时,你不能没有。当您需要进行分析并显示不同维度和统计样本之间的相关性时,您可能需要一个表格。

表格也是表示数据的最结构化的方式:每次想要显示原始数据或精确数据时,都需要使用表格。

数据库隐喻

我们的大脑就像一个数据库。它需要指数才能表现良好。颜色是它索引表格的方式。

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

我们的大脑没有能力看一张表,一眼就看到所有的信息。如果你不添加一些色彩,你的观众将需要大量的时间和精力来理解和处理你的数据。值得一提的是,由于理解和处理数据需要集中注意力,他们必须在停止听你说话或阅读表格之间做出选择。

在最好的情况下,当你想让你的读者理解你的研究的总体结果时,他们只会阅读一些随机的单元格。

按照我们的数据库比喻,当显示一个表时,我们需要:

  1. 运行一个“创建表格”命令。我们需要确定所有的列,并仔细阅读它们,一个接一个。从左到右(当有许多列时,人们使用从中心到最外围的列来阅读:使用此信息将最有用的信息放在中心区域)。这是识别阶段。
  2. “改变表格”以找到数据类型。因为我们不是真正的数据库,所以我们需要从单元格中选取随机值来理解每个列的数据类型。这个过程很慢,如果在标题上添加度量单位,也会发生这种情况:理解人类的数据类型发生在表定义之后。这就是“理解阶段”。
  3. 有一个时刻你必须得到你的数据的上下文。你需要给自己定位。这就像一个测试,以确保您理解了模式。我们需要选择随机值,并将这些值与其他值进行比较,以确定“大于”和“小于”的良好定义。注意:如果可以的话,你应该标准化你的数据以使这个阶段更快。这就是我所说的“处理阶段”。
  4. 应用“选择”语句这是最重要的部分,因为这是唯一一个给你的表增加商业价值的部分。你需要以某种方式指定一个“往哪里看”或“如何分组”的条件,让人们找到一些证据。标题是达到这一效果的最常见方式。我将向你展示如何用颜色来强调事实观察。这就是“查询阶段”。

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

你知道,当你运行“选择语句”时,你还需要一些索引来加快搜索速度。如果你不使用索引,你需要扫描整个表。我们来讨论一下这个问题。

为你的餐桌增添色彩

热图对你有帮助。我建议你在任何可能的地方(总是)使用它们。

考虑下表:

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

这显示了应用程序统计样本在谷歌 Play 商店上的平均评论,分为安装应用程序的设备数量和评论数。以这种方式显示数据很容易理解 3.9 左右的值是我们的预期值。

我在没有上下文的情况下提出了这个表,在阅读它之前,你已经知道有一个模式。在阅读标题之前,你已经意识到数值是以一种统一的方式分布在对角线上的,并且你已经了解了一般事件的大小。

如果你想让你的读者稍后再处理标题(这样他们就可以先关注价值),你应该使用更大更鲜艳的单元格。在我们的例子中,在知道表的内容之前,您就知道值是平均分布的。

如何快速选择数据

继续我们的比喻,我们可以说我们的眼睛把一个表看作一个数据库引擎。如果没有索引,检索数据会花费很多时间。

还有一个问题。数据库在两个不同的时间运行 create-table 命令和 select 命令,我们也是这样做的。问题是在演示过程中,我们必须同时处理这两个命令。

我们可以说表更像是一个“数据库视图”:它们在我们的 RAM 中:我们每次都需要重新创建它们。当访问(查询)数据时,我们几乎每次都必须提取列来获得上下文。

我们需要一种方法来“物化”我们的视图并添加索引。颜色就像聚簇索引:它们帮助你查找数据,将信息存储在彩色(索引)栏中。它们也是以语义有效的方式对数据进行排序的一种很好的实用方法。

考虑这个例子:

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

这些表格以 3 种不同的方式向我们展示了相同的数据:

  1. 第一张是无色的。你需要很多时间来阅读所有的数据,你也不知道它们有什么有趣的地方。低值比高值好吗?这个表也根本不包含“select”语句。
  2. 第二张显示了一些绿色和彩色值。我们的大脑会理解我们应该关注(并希望记住)一两行,因为其他行不太相关。绿色还会告诉我们的大脑,这几个值与积极的发现有关。
  3. 第三个表格的第二列背景颜色为绿红色。由于有更多的颜色,它需要更多的时间来处理比第二个。它向我们表明,积极的项目很多,消极的项目很少。

尽管第二个和第三个表包含相同的原始数据,但它们显示了不同的证据。我们可以说它们与不同的“select”语句绑定在一起。

作为一名数据科学家,你应该问问自己为什么要提出这个表格。如果你想强调你的统计总体缺乏一致性,你应该使用第三表:许多颜色的梯度有助于你的大脑划分数据。如果你想告诉你的观众,在 Play Store 上有更多的“家庭”和“工具”应用程序,你应该使用第二张表。

这是因为颜色代表我们大脑中的集群。它们不仅与情感有关,而且是宁滨事实的有力证明。在处理数据时,将颜色视为分组数据的盒子,将相同颜色的阴影视为盒子内的排序优先级。

结论(TL;博士)

现在,我们有了一种实用的方法来将表定义与索引绑定在一起,并将表与查询命令链接在一起。让我们总结一下我们的发现:

  1. 如果你需要表格并且你想让你的数据被理解,那么将它们着色
  2. 始终建议您的表(定义)和要应用的查询。如果你能展示你的查询结果就更好了:用颜色来达到这个目标。
  3. 如果你希望你的数据是中性的,就不要使用绿色或红色:颜色具有基于文化的情感价值。
  4. 大而填充的单元格在标题前被阅读:如果你想让你的读者在知道数据是关于什么之前找到一个模式,现在你知道该怎么做了。
  5. 颜色就像聚集索引:它们是在“数据库扫描”所有行之前得到一个点的唯一方法。
  6. 使用“选择…位置”条件绑定表格,使用相同颜色的阴影。阴影既是索引又是过滤器。
  7. 使用多种颜色在你的“选择”语句中应用“分组依据”。在 faster 中按索引分组。

处理小数据的 7 个技巧

原文:https://towardsdatascience.com/7-tips-for-dealing-with-small-data-7ffbd3d399a3?source=collection_archive---------3-----------------------

因为通常情况下,这就是你要得到的。

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

我们经常听说 大数据 是构建成功机器学习项目的关键。

这是一个主要问题:许多组织没有你需要的数据。

没有最基本的原材料,我们如何原型化和验证机器学习的想法?在资源稀缺的情况下,如何高效地获取数据并利用数据创造价值?

在我的工作场所,我们为客户制作了很多功能原型。正因为如此,我经常需要让 小数据 大有作为。在这篇文章中,我将分享 7 个小技巧来改善你的小数据集的原型制作结果。

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

1:意识到你的模型不会概括得那么好。

这应该是首要任务。你正在建立一个模型,它的知识是基于宇宙的一小部分,这应该是唯一一个可以期望它很好工作的地方。

如果你正在基于一系列室内照片构建一个计算机视觉原型,不要指望它在室外也能很好地工作。如果你有一个基于聊天室玩笑的语言模型,不要指望它能为奇幻小说工作。

**确保你的经理或客户理解这一点。**这样,每个人都可以对你的模型应该交付的结果有一个现实的期望。它还创造了一个机会,可以提出有用的新 KPI 来量化原型范围内外的模型性能。

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

2:建立良好的数据基础设施。

在许多情况下,客户端没有您需要的数据,公共数据也不是一个选项。如果原型的一部分需要收集和标记新的数据,确保你的基础设施尽可能少地产生摩擦。

你需要确保数据标记非常简单,这样非技术人员也可以使用。我们已经开始使用 神童 ,我认为这是一个很好的工具:既可访问又可扩展。根据项目的规模,您可能还希望设置一个自动数据接收,它可以接收新数据,并自动将其提供给标签系统。

如果把新数据输入你的系统又快又容易,你会得到更多的数据。

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

3:做一些数据扩充。

您通常可以通过增加现有数据来扩展数据集。它是关于对数据进行微小的改变,而不应该显著地改变模型输出。例如,如果将猫的图像旋转 40 度,它仍然是猫的图像。

在大多数情况下,增强技术允许你产生更多的“半唯一”数据点来训练你的模型。首先,你可以尝试在你的数据中加入少量的高斯噪声。

对于计算机视觉来说,有很多巧妙的方法来增强你的图像。我有过使用 相册 库的正面体验,它可以进行许多有用的图像转换,同时保持你的标签不受伤害。

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

Photo credit: Albumentations on Github

另一个很多人发现有用的增强技术是 这种技术直接获取两幅输入图像,将它们混合在一起,并组合它们的标签。

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

Photo credit: Cecilia Summers & Michael J. Dinneen

当扩充其他输入数据类型时,需要考虑哪些转换会改变标签,哪些不会。

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

4:生成一些合成数据。

如果您已经用尽了增加真实数据的方法,您可以开始考虑创建一些假数据。生成合成数据也是一种很好的方法,可以覆盖真实数据集没有覆盖的一些边缘情况。

举例来说,许多用于机器人的强化学习系统(如 OpenAI 的Dactyl)在部署到真实机器人之前,在模拟的 3D 环境中进行训练。对于图像识别系统,您可以类似地构建 3D 场景,为您提供成千上万的新数据点。

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

15 simulated instances of Dactyltraining in parallel.

创建合成数据有多种方法。在 Kanda ,我们正在开发一种基于转盘的解决方案,为物体检测创建数据。如果你有很高的数据需求,你可以考虑使用生成合成数据。要知道,GANs 是出了名的难训练,所以首先要确定这是值得的。**

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

NVIDIAs GauGANin action!

有时你可以结合各种方法:苹果有一个非常聪明的方法 使用 GAN 来处理 3D 建模面部的图像,以看起来更加逼真 。如果你有时间的话,这是一个扩展数据集的很棒的技术。

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

5。当心幸运劈叉。

在训练机器学习模型时,按照某种比例将数据集随机拆分成训练集和测试集 是相当常见的。通常,这是好的。但是当处理小数据集时,由于训练样本的数量很少,因此存在很高的噪声风险。

在这种情况下,您可能会意外地得到一个幸运的分割:一个特定的数据集分割,在这个分割中,您的模型将会很好地执行并推广到测试集。然而在现实中,这可能只是因为测试集(巧合)不包含困难的例子。

在这种场景下, k 倍交叉验证 是更好的选择。本质上,您将数据集分成 k “折叠”并为每个 k 训练一个新模型,其中一个折叠用于测试集,其余的用于训练。这控制了你所看到的测试性能不仅仅是由于幸运(或不幸)的分裂。

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

6。利用迁移学习。

如果你正在处理某种标准化的数据格式,如文本、图像、视频或声音,你可以利用迁移学习来利用其他人在这些领域所做的工作。就像站在巨人的肩膀上。

*当你进行迁移学习时,你采用其他人建立的模型(通常,*“其他人”是谷歌、脸书或一所主要大学),然后 对它们进行微调,以适应你的特殊需求

迁移学习之所以有效,是因为大多数与语言、图像或声音有关的任务都有许多共同的特征。例如,对于计算机视觉来说,它可以检测某些类型的形状、颜色或图案。

最近,我为一个有高精度要求的客户开发了一个对象检测原型。我能够通过微调一个MobileNet*单发探测器 极大地加快开发速度,该探测器已经在谷歌的 开放图像 v4 数据集(~ 900 万标记图像!).经过一天的训练,我能够使用大约 1500 张标记图像生成一个相当健壮的对象检测模型,其测试图为 0.85。*****

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

7。试试“弱学习者”的合奏。

有时候,你不得不面对这样一个事实:你没有足够的数据来做任何新奇的事情。幸运的是,有许多传统的机器学习算法可供选择,这些算法对数据集的大小不太敏感。

当数据集很小并且数据点的维数很高时,像 支持向量机 这样的算法是很好的选择。

不幸的是,这些算法并不总是像最先进的方法一样准确。这就是为什么它们可以被称为“弱学习者”,至少与高度参数化的神经网络相比是如此。

提高性能的一种方法是组合几个这样的“弱学习器”(这可以是一组支持向量机决策树),以便它们“一起工作”来产生预测。 这就是集成学习的全部。

7 种新年决心推文

原文:https://towardsdatascience.com/7-types-of-new-years-resolution-tweets-d437c87d5f9c?source=collection_archive---------30-----------------------

对 4 万条推文的分析揭示了我们如何实现 2019 年的目标。

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

这是新一年的开始!人们正在更换日历,联系所爱的人,并决定他们今年想要尝试和坚持的决心。如果人们正在做某事(真的是任何事),你可以打赌他们中有相当多的人会在推特上谈论这件事。

有一些关于的文章,最受欢迎的决心是什么实现它们不会让我们快乐,以及我们可能无论如何都不会实现它们。愉快。我决定,没有什么真正着眼于人们如何处理整个决议企业。为此,我上了推特,并利用一些很好的计算社会科学,决定看看人们是如何对待决心的。推特用户在推特上发布的关于决议的话题是什么?那些题目中最常见的词是什么?它有没有说我们如何对待决心的想法?这些就是我们今天要回答的问题。

在深入研究之前,先简单说一下。虽然这个项目使用了计算社会科学的技术,但我并不急于给它贴上“科学”的标签。这是我强调不要说的:“计算机算法显示只有 7 种新年决心推特。这就是大数据带给他们的一切。”相反,这只是一种有趣的方式,可以让你了解 Twitter 上围绕新年决心的一些更广泛的模式。

数据

使用 Twitter 的 API,我搜索了包含#newyearsresolutions2019、#resolutions、#newyearsresolution、#newyearsresolutions(是的,这里有的区别)的推文,以及任何包含“新年决议”字样的推文,而没有笨拙地将它们塞进一个标签。我在 12 月 31 日中午 12:00 左右开始收集数据,并在 1 月 1 日凌晨 12:00 后做了最后一次拉动。最早的推文可以追溯到 12 月 22 日,多亏了时区的魔力,一直延续到 1 月 1 日早上 5:17。这一过程产生了 41502 条独特的推文。我并不完全有条不紊地决定何时拉车,因为我太忙于享受与 2018 年说再见了。依照之前的引子,对此半信半疑。

在清理数据(删除停用词和标点符号,对文本进行词干处理,删除 htmls 等)后,我使用潜在狄利克雷分配(LDA)对推文中的潜在主题进行建模。LDA 假设语料库中的所有文档都有固定数量的主题——在我们的例子中,是我们搜集的所有 tweets 并允许在单个文档中出现多个主题。然后,该方法会告诉您任何特定单词出现在主题中的概率。因此,“苹果”出现在第一个主题中的概率可能是 0.0002,出现在第二个主题中的概率可能是 0.05(据推测,该数据来自一个苹果爱好者论坛)。你可以选择这些单词中最流行的,调查它们何时出现在一起,并了解它们出现的时间

对 LDA 有一个警告。你必须选择数据中存在多少主题,以便实现它。也是由我们来决定那些话题的意思。虽然有很多方法可以很好地了解正确的主题数量,但是在这些数据中尝试它们会产生超过 25 个不同的主题。这从直觉上讲是有道理的,但是坦率地说,这导致了糟糕的博客文章。我开始看到,在 7 岁以后,模型解释的回报越来越少,所以这是我选择的数字。同样,不科学,但足够的一些乐趣。

没有任何进一步的麻烦。

7 种新年决心

有抱负的读者和作家们:

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

人们喜欢阅读,也喜欢写作。或者说,最起码,爱到读,写。多读多写是很常见的决心,所以这一条并没有让我太惊讶。

“我 2019 年的一个安静的决议是避免在线讨论写作过程,而是花一些时间实际阅读或写作。”— SheerHubris

“思考人生……我想多跑步、少吃饭、多欢笑、少压力、多唱歌、少喊叫、多听、少说、多阅读、少滚动、多写作、少发短信#新年决心#作家#写作目标”——Grumpy _ SENCO

希望爱自己,变得更快乐

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

自我关心和爱是解决推特的另一个话题。在过去的一年里,人们越来越关注心理健康。看到人们关心照顾自己,我心里很高兴。

“新年决心:——不骂人——交更多的朋友——更快乐——达到更健康的体重——在我的 a 级考试中做好事——发现自我”— PaizuriRS

“新年决心:真诚地爱自己&继续自我成长。今年我确实成长了很多,但我想继续变得更快乐、更健康,成为一个更成熟的人。永远传播积极&永远善待他人。”— 剪影阴影

最后一个触及了我们列表中的下一个主题,很好地展示了这样一个事实,即即使是很小的文本也可以触及多种事物!

爱他人

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

人们不仅仅希望自己新年快乐,他们也希望其他人也有一个快乐的新年!尽管如此,如果我暗示相当一部分包含这个话题的推文不是来自品牌账户,那我就是在撒谎。

“新年快乐!我们真诚地祝愿大家在 2019 年幸福快乐,万事如意。这是你的一年,你的时间就是现在,去得到它!!!!感谢你今年所有的爱和支持。爱瑞秋和瑞#快乐新年#新年 2019 #新年决心”——对立旅行

“新年快乐!!为你的健康和幸福干杯!!# behappy # behe health # new years resolutions # get fit # dont wait # livenow # bein the moment # happy and healthy # sharing scaring”——aloha rush

病毒性法西斯追捕

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

我们从你的预期票价中休息一下,给你带来这个分析的第一部分,让我去“嗯。”下一组单词实际上只有一条与之相关的 tweet。事实证明,这只是为数不多的几条关于新年决心的微博中的一条。

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

有趣的是,这些都不是法西斯的决定性因素——有些是混蛋的决定性因素——但这是推特。髓和 snark 基本上是一个注册的要求。

这带来了一个有趣的问题:转发算不算这类分析?他们中的许多人会做这里发生的事情,构建一个基本上围绕原始推文的“主题”。但是如果这就是人们在推特上真正做的事情,知道这一点也很重要。

值得一提的是,我认为转发通常是一种认可。有些人会用它们来引起对争论的注意,但他们这么做主要是为了说“我也有这种感觉!”所以我觉得这是可以辩护的,但是一条病毒式的推文可以非常明显地搞乱定量内容分析的工作。

淘汰旧的…

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

在这些话题的基调发生转折之后,我们转向一个与你所期待的更相称的话题。人们想要变得更好——但重点是他们会放弃的东西。与其说是蜕变成一只美丽的蝴蝶,不如说是停止吃那么多垃圾食品,这样我们才能更好地适应这个茧。

所以……已经 2018 年的最后一天了。时间去了哪里?决心并不总是能实现,但目标是增加锻炼,减少加工肉类和精制糖,活在当下,更善良,花时间和你爱的人在一起,这似乎是 2019 年的一个好计划。你呢?— 和 YC2311

新年快乐除了#keepingwildfishfree,我们还致力于在 2019 年减少#一次性塑料和生活#塑料 free,以保持我们美丽的珊瑚礁(和地球)的活力。你 2019 年的#新年决心是什么?你打算采取什么步骤来实现它们?— 萨维内莫

成为一盏明灯

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

与流行的观点相反,大多数人不仅仅是为了自己。(我的意思是,如果一个社会物种完全由反社会者组成,它将很难生存)。很多人不仅想为自己做好事,也想为别人做好事。

“你知道我喜欢什么,有勇气为小人物辩护的人。你知道,那个感觉被冷落的学生。帮助他们实现他们的全部潜力。让我们把它作为今年的新年决心吧!#提倡#坚持不懈#黄蜂#下一级#勇气#充分发挥潜力”——多样性 54

它总是回到特朗普身上

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

让我把我的卡放在桌子上:对于那些不知道的人,我是一名政治学博士候选人,专攻政治行为和心理学。这意味着我必须忍受与特朗普有关的事情——很多。当我构思这个项目时,我认为这是一种逃离不断加深的新低点坑的有趣方式,这些新低点坑是由争议的不断轰炸挖掘出来的。另一方面,特朗普总统花在推特上的时间比新闻发布会上的时间还多,所以我可能不应该如此惊讶。尽管我确实感觉到与那些愤怒地进入这个话题的人有一种亲切感。

“我的新年决心是将支持议长@NancyPelosi 和@TheDemocrats 作为我的使命,因为他们反对特朗普政权的法西斯冲动,倡导进步议程,并为 2020 年的巨大胜利做准备。谁在里面?# new years resolutions”-DEM write

“媒体和我们公众做出承诺,停止报道@realDonaldTrump 在 2019 年发布的每一条推文,怎么样?停止给予他他极度渴望的关注。# new years resolutions # notrumtweets "missangeleyes

“你们所有憎恨特朗普的自由主义者应该制定一个新年决议:停止为 2019 年的人类提供嫉妒、愤怒、仇恨、可悲的可怜借口。”— Anthony14133926

现在你知道了!纽约决议推文的 7 种类型!

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

Note: The reason that the-x axes are unlabeled is because the probabilities vary across topics but the presentation of the bar graph can give the incorrect impression that a word appears with equal/greater frequency than another.

我已经把这个分析的注释代码放在我的 GitHub 上了。(我今年的一个决心是更好地张贴在那里)。请在评论中让我知道你对这个分析的看法。

新年快乐!

彼得·r·利卡利是弗罗里达大学政治学博士生,专攻美国政治、政治行为和政治方法论。所表达的意见是他自己的。也可以在 YouTube 和推特( @prlitics13 )上找到他。剩下的一点点业余时间都花在了长跑,和他耐心的妻子玩电子游戏,遛狗,和他的猫 Asia 进行奇怪的富有成效的单边对话上。

注释和资源:

社会科学计算

通过 R 掌握文本挖掘

用 R 进行文本挖掘:朱莉娅·西尔格和大卫·罗宾逊的整洁方法

Isis 推文的主题建模

7 个有用的熊猫数据管理技巧

原文:https://towardsdatascience.com/7-useful-pandas-tips-for-data-management-8b23a85bf41f?source=collection_archive---------12-----------------------

一个英超金融评论的例子

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

Image Courtesy of Firmbee.com via Unsplash

金钱球

英超联赛是一项大生意。事实上,英超俱乐部在 2018-19 赛季向足球经纪人支付了超过 2.6 亿英镑——比前 12 个月增加了 4900 万英镑。仅这个统计数据就激起了我的兴趣,并驱使我更深入地研究 2018-19 赛季的英超联赛支出。

为了对刚刚结束的这个赛季的英超联赛进行全面的财务评估,我使用了 Python Pandas 模块。在这样做的时候,我使用了 Pandas 库的许多特性,这使得数据管理变得稍微容易了一些。

这篇教程文章包括了我所从事的数据收集和管理的这些有用的 Pandas 技巧和特性。

提示 1:查找数据

花在经纪人身上的钱和估计的转会支出是我想为每个英超俱乐部确定的两个关键变量。我快速搜索了一下,找到了 BBC 的网页,标题是:英超:俱乐部 2018-19 赛季足球经纪人支出增至 2.6 亿。下面是我要刮的表。使用熊猫很容易做到这一点。

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

这里的技巧不是使用 pd.read_html 方法(,对于本文来说,它本身就是一个技巧),而是使用索引。我怎么知道索引第 0 个元素呢?答案就在这里,切换到 Chrome 中的开发者工具,使用控制台标签。在这里,我搜索 table 标记,结果是一个长度为 1 的数组。这意味着在这个特定的网页上只有一个表格。如果我索引,第一个(并且只有)元素我将能够刮表。

然而,现在我们遇到了一个小小的障碍,所以是时候给熊猫第二个提示了!。

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

技巧 2:多索引到单索引

当抓取该表时,将返回一个多索引,如下所示。在大多数情况下,最好有一个单一的索引。这将使数据排序和过滤更容易。现在,最高层的一栏“2018-19 英超联赛支出”需要删除。

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

为此,我使用了**。xs()方法。在这个方法中,我指定的第一个参数是我想要得到其横截面的列的名称。在这里,我指定“2018-19 赛季英超联赛支出”。轴=1 获取列的横截面,并且 drop_level 参数=True,返回没有多级索引的横截面。**

显然,现在有了单一索引,但是列名之间仍然有很多空格,这使得某些任务,比如过滤变得更加麻烦。理想情况下,这些列都应该是单个字符串元素。

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

技巧 3:快速简单的列重命名

列名非常能说明它们的内容。因此,我只想稍微改变它们,这样下游的数据操作就更容易了。这里,我使用了 df.columns.str.replace 方法,用下划线替换所有空格、连字符和星号。

需要删除这些字符,因为当我们尝试过滤(稍后)时,它们会导致语法错误。因此,最佳做法是移除/更换它们。

为了演示这个字符串函数有多有用,我加入了等价的代码,注释掉了,这是使用 df.rename 函数获得相同结果所必需的。如图所示,这要简单得多。

简单,当你知道怎么做的时候!

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

现在,我执行一些简单的字符串操作函数,如下面的 GitHub 要点所示,将字符串条目转换成数字数据类型。

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

这张表有一些有趣的数据,但我真正想要的是对 2018–19 赛季英超财务的全面看法。所以,说到第四点。

技巧 4: Pdf 转熊猫数据框

导航到英超新闻文章,我获得了关于 2018/19 赛季中央支付给俱乐部的英超价值的信息。该页面包含一个可下载 pdf 的链接(如下所示)。接下来的几个任务包括抓取这个表,并将其与从 BBC 足球网页中提取的支出表合并。

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

我从 tabula 导入了 read_pdf 方法,并将文件路径传递给了这个方法。我最初给数据帧分配了变量名 df,并检查了它的类型。返回一个熊猫数据帧。随后进行了简单的清理和重命名,但是我包含了这个技巧,因为它真实地展示了将 pdf 表格转换成适合分析的 Pandas 数据框架是多么简单。

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

技巧 5:多列字符串操作

league_club_revenue 数据帧中的列是字符串数据类型,需要转换为数值数据类型。但是,通过仔细检查,除了“俱乐部名称”和“英国直播”之外,所有的列值都以“”符号为前缀,中间用逗号隔开。

要一起更改这些列,我只需创建一个列列表(熊猫系列)。然后,我在 DataFrame 内的 for 循环中迭代这些列,用空字符串替换“”和“,”,然后使用。a 类型方法。我还除以 100 万,因为最终我想将“支出”和“联赛 _ 俱乐部 _ 收入”数据框架合并在一起,因此我需要这两个数据框架之间的数据保持一致。我需要所有的列都以百万来表示它们的值。

几乎一行代码就清理了整个数据帧!

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

技巧 6:简单合并

为了合并并成功对齐数据,我在 league_club_revenue 数据帧中生成了一个新列。这是必要的,因为两个表中的团队顺序不同。我创建了一个名为“Team”的新列,其中球队按顺序排列,它们出现在 league_club_revenue 数据框架中。然后,我可以在这两个数据帧之间共享的公共列上进行合并,每个数据帧上的行将对齐。

新的数据框架 Financial_review 现在是合并后的产品。数据格式是一致的,除了“UK_live_broadcast”和“Current_Position”以百万(英镑)表示。

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

技巧 7:过滤

新合并的数据帧现在可修改用于查询。从一个基本查询开始,我指定了两个条件。我想知道那些花费超过 800 万英镑的经纪人费用的球队,最终排名低于第 10 位(截至 4 月 4 日,BBC 关于经纪人和估计费用的文章撰写时)。

结果可能表明,这些球队的经纪人可以做得更好,因为他们为之物色球员的球队位于排行榜的下半部分!

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

现在假设,我们想要查询另一个条件。然而,这一次我们不希望返回整个记录(行)。为此,只需编写过滤条件,后跟一个句点,然后是要返回的列。在这里,我只想知道那些估计花了 6000 多万转会费,收到的支付功绩不到 2000 万的球队的名字。

看起来伯恩茅斯、布莱顿和富勒姆花费很大,但在基于成绩的奖金方面没有很好地收回投资。与其他球队相比,这些球队的财政状况目前看来并不乐观!

出于比较的目的,我已经包括了如果我不使用 not 符号后跟列“Team”时返回的结果。这里,返回整个记录或行。

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

最后,我将通过演示如何使用一个简单的聚合函数来做总结。首先,计算英超联赛中所有球队的经纪人支出的平均值(以百万计)。显示了实现这一结果的两种不同方法,第一种方法是使用方括号,第二种方法是使用点符号(更常用),这也是为什么像空格这样的非法字符需要被删除并替换为下划线的原因。

假设你想分别找出英超联赛上半区和下半区球队的平均英国转播比赛。为了获得更深入的了解,确定排名上半部分的球队与排名下半部分的球队的平均转播比赛之间的差异是很有趣的。

简单用**。loc** 然后使用[:10 后跟一个逗号,最后是引号中的列后跟一个右方括号,选择前 10 行。对表格的后半部分重复这一过程,[10:,我们可以清楚地看到,上半部分的球队比下半部分的球队平均多 8.49 场英国广播比赛。

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

我希望这个例子展示了一些有用的 Pandas 特性,使数据处理和管理变得更容易。如果你喜欢英超联赛的例子,我已经写了一篇介绍性的文章,题为“英超联赛中的熊猫”,展示了熊猫如何帮助清理初始数据。

让软件开发人员开心的 7 种方法

原文:https://towardsdatascience.com/7-ways-to-make-software-developers-happy-d4b72c07584e?source=collection_archive---------3-----------------------

如果你适当地关心你的开发者,他们会关心你和你的项目!

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

*什么让软件开发者快乐?*没有回答这个百万美元问题的灵丹妙药!在这个快节奏的世界里留住顶尖人才势在必行!当 睡眠舱乒乓球桌私人厨师和其他花哨的福利不起作用时,我们真的需要好好想想如何取悦他们,提高他们的参与度和积极性。

在这篇文章中,我将介绍在我 15 年的 it 生涯中最能让我(工作)快乐的驱动因素,以及我所面临的问题的后果和建议,所以如果你是一个团队领导、经理或企业家,它可能会给你一些如何让你的团队满意和忠诚的想法!

❶——使用金钱能买到的最好的装备

这绝对是我清单上的第一项。没有什么比打开项目的代码,编译它,或者在本地运行一个测试,然后不得不等待几秒钟以上的时间来返回结果更令人沮丧的了。开发人员工作匆忙,因此任何无效的工具,即使是最轻微的延迟,都是他们快乐的一大制约。

在拥有高端机器(可能有点过头)和低端机器(这些显然会抹杀性能)之间有一个平衡,但要有足够的内存CPU磁盘空间/速度( SSD,非常感谢!这是三个最重要的因素,不仅能保持开发人员的理智,还能保持公司的长期成本。多显示器生产力工具也是提高效率的基础。

这些到处浪费的时间的小增量,可能会增加到每周一个小时(可能更少,但最有可能更多),但是如果你考虑每个开发人员一年所花费的总时间,乘以每小时的费用,大多数这种类型的投资在纯粹的财务基础上是合理的。

那就去做吧…升级他们的机器,给他们一台额外的显示器,给他们提供付费版的生产力工具!你不会期望一个管弦乐队用平庸的乐器演奏,为什么开发人员必须使用过时和缓慢的计算机?

❷ —实现深度聚焦

软件开发如何需要专注是一件趣闻。

深刻的,不可分割的,强烈的关注。

为了产生优雅的代码,进入没有干扰和有限背景噪音的区域是必不可少的。一个小分心,思路就丢了。不幸的是,相对较新的开放式办公室趋势肯定会带来噪音,所有这些在程序员头脑中精心放置的想法都消失了。以我的经验来看,开放式办公室增强沟通的概念是有缺陷的:

  • 有些人避免一起在办公桌前讨论,因为他们知道说话会打扰周围的同事
  • 有些人不介意打电话或在办公桌前开会,但他们会引起“邻居”的不满。后者经常使用噪音消除耳机,这意味着很难引起他们的注意,即使有些事情可能真的需要他们的投入。

编程是艺术!对于艺术家来说,幸福的圣杯是一种的心流状态 …所以为了让开发人员开心并提高他们的生产力,给他们一个不受干扰的工作场所,或者至少给开放式办公室的礼仪制定一些规则!

📌 **State of Flow:**
Positive psychologist Mihály Csíkszentmihályi, describes a state of flow as "*Being completely involved in an activity for its own sake. Time flies. Every action, movement and thought follows inevitably from the previous one, like playing jazz. Your whole being is involved, and you are using your skills to the utmost*".To find out more, please watch this extraordinary TED talk:
[Flow, the secret to Happiness](https://www.ted.com/talks/mihaly_csikszentmihalyi_on_flow?language=en).

❸——接受灵活的工作时间

灵活的工作安排是必备的。这包括了所有新老的时髦词汇,比如远程工作、弹性工作时间、远程办公、压缩工作周、数字流浪者 ( *太极端了?*😃).

标准办公时间并不适合每个人。有些开发人员在早上 7 点工作得最好,有些在晚上 7 点,有些(我们当中的夜猫子)在凌晨 1 点!国际人才可能会在很长一段时间内访问他们的祖国。此外,家庭责任(尤其是照顾孩子)或各种生活方式的选择(完成学位、兼职等)可能会阻止一些开发人员朝九晚五地工作。然而,安全的 VPN 连接、实时协作平台和团队消息应用触手可及,这意味着一切都可以在远处完成

虽然对个人的好处非常明显,但对公司的影响并不总是那么明显,一些“逆向思维”的观点声称,弹性工作时间会导致不可靠的结果,并因减少实际存在而扼杀团队合作。这里的关键是要勤于任务估算!例如,如果一个信息技术资源可以在两周的冲刺中交付 10 个故事点,只要在规定的时间内完成,这个贡献什么时候完成并不重要。

作为一种妥协,为了加强团队沟通,可以商定每个人都在线的核心时间(例如上午 11 点到下午 3 点),在此之后,每个开发人员都可以管理自己的时间——这显然是合理的!例如,如果有一个支持任务需要在一个特定的班次完成,它应该坚持。

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

Inspired by R.E.M.’s ‘Shiny Happy People’ — my daughter’s favourite song!

❹——这是烧毁,不是燃尽!

项目有截止日期——冲刺目标会溢出来!这是事实!
尽管交付经理掌握着规划和即将到来的里程碑,但有时团队中的每个人都必须投入大量时间来完成工作并将新功能发布到产品中,这是无法回避的事实。在合理的范围内,这是可以的,所有在商业项目中工作的开发人员都期望这种情况偶尔发生一次。

尽管这种节奏是不可持续的,但一些经理习惯了增加的产量和更快的交付速度,他们认为在未来的冲刺中过度承诺不切实际的目标是理所当然的。更有甚者,团队开始精疲力竭,这不仅对他们的健康有显著影响,还会引起怨恨和工作不满。

“退让一步,他们会退让一步”

作为一名领导者,要保持团队的高昂士气,你需要尊重他们的工作生活平衡。如果你要求你的开发人员熬夜加班以满足一个紧迫的期限,请确保你不是一直这样要求。

📌 **Autonomy - Mastery - Purpose:**
I recently read Daniel Pink's new book: '[Drive: The Surprising Truth About What Motivates Us](https://www.amazon.co.uk/Drive-Surprising-Truth-About-Motivates/dp/1786891700/)'.
It made me realise that motivation is directly affecting our work-happiness. Small wonder then, that the following 'happiness' factors (5, 6, 7) match Pink's motivation trifecta.To find out more, please watch another fabulous TED talk:
[The puzzle of motivation](https://www.ted.com/talks/dan_pink_on_motivation?language=en).

❺——赋权

工作中的自主性对我来说是一个非常重要的方面,我的事业发展得越快,我就越不愿意在完成任务或做出决定的自由度上妥协。像我一样,大多数开发人员喜欢形成自己的观点,并拥有独立的决定权。

因此,表达对你团队决策能力的信心:让他们参与评估过程,请他们提出解决方案,在做出选择时咨询他们。你会惊讶地发现,他们倾向于满足自己设定的时间表,解决方案富有创意(毕竟他们以解决问题的能力而闻名),而且建议也是经过深思熟虑的。不要微观管理他们也很重要——这是精神杀手!

自治和结构之间需要有一个平衡。因此,不要告诉你的团队如何做他们的工作,只需要设定战略,给他们一个框架,让他们可以做出自己的选择。例如,设定目标、期限和基准,然后让他们定义如何实现目标。这让你专注于大图和管理高层次的“东西”,并给开发人员设计他们自己的任务的自主权。

这是双赢的局面!

所需要的只是相信人性本善——以及足够的勇气把你的人当成主人而不是机器。机器做他们的工作;所有者尽一切努力让他们的公司和团队成功。
—拉兹洛·博克

❻——促进持续学习

如果你一直在关注我的文章,你就会知道我对持续学习重要性的看法,开发者也明白这一点!玩着掌握的概念,软件工程师热爱新技术,紧跟现代思想。新的工具、框架和范例在不断建立,但一些管理者不允许他们尝试新事物,害怕现有现状的任何改变。这会导致一种停滞不前的文化,在这种文化中,开发人员失去了他们好奇心的火花。结果,代码库变得很难维护,阅读起来很难看,支持起来也很昂贵。最终,你的顶尖人才将会离开,你将很难找到愿意为过时的棕色地带项目工作的人。

因此,对团队学习的任何投资都是值得的!一定要送他们去参加会议和课程,买书,给他们订阅学习资源,应有尽有!

此外,在任何新项目开始之前,给你的开发团队时间和空间来提高技能是一个好主意。一项新技术的概念验证可以为组织节省大量的时间和金钱,如今软件生态系统的现代化已经成为一个先决条件。另一个让开发人员兴奋的简单方法是鼓励他们使用不同于普通堆栈的语言、数据库或框架来构建 DevOps 工具。

最后,你不应该低估任务转移的重要性。一遍又一遍地重复同样的工作令人厌烦,开发人员觉得他们没有提高自己的技能。如果你让任务在你的团队中轮换,即使在开始时需要更长的时间,也能减轻持续的痛苦。被压在 L3 支架上 ( 那个可怕的 S 字!)是很好的轮换人选。

❼——灌输目标感

当你意识到你的工作有所作为时,没有比这更好的感觉了。无论大小,都没关系!它可以是小的速赢:例如,创建一个自动化回归测试的新工具,或者增加测试覆盖范围,或者提高长期运行过程的性能。也可能是巨大的成就:新发布的特性给企业带来了几百万美元的资本收益。不管怎样,不要忘记庆祝你的成功。也要具体!被表扬的开发者是快乐的开发者!

编程是一项热爱的工作!目的和工艺之间的一个很强的相关性是开发者倾向于完美主义和对最终产品的骄傲。作为他们的经理,你需要尊重这种行为,给他们时间来编写单元和 BDD(行为驱动开发)测试,并分配一些额外的时间来进行重构和代码优化。这种完美主义的特质凸显了开发人员的主人翁意识,认可他们的努力只会让这种意识更加强烈!

参考

一些关于工作快乐的研究资源:

闪亮快乐的开发人员

快乐的开发人员可以将项目引向无数的高度!通过关注这 7 个因素,并将它们移植到你领导团队的方式中,你将建立一个“闪亮的”开发人员会蜂拥而至的工作场所。

感谢阅读!Arigato Gozaimasu!

我定期 ******* 在媒体上写关于领导、技术&的数据——如果您想阅读我未来的帖子,请‘关注’我

***** If you were wondering why I had gone radio silent for a couple of months, I was moving houses on a longitude rather than a postcode level! 🌏

保护亚马逊雅典娜的 7 种方法

原文:https://towardsdatascience.com/7-ways-to-secure-amazon-athena-db31a7cb6c88?source=collection_archive---------23-----------------------

[专业数据技能](http://towardsdatascience.com/tagged/Professional Data Skills)

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

Photo by MILKOVÍ on Unsplash

亚马逊雅典娜 是来自亚马逊网络服务的无服务器数据分析工具。它易于使用,不需要设置任何服务器,支持 ANSI SQL 从亚马逊 S3 查询结构化和半结构化数据。许多公司选择 Athena 是因为它的简单性和低成本。

在互联网上甚至在 Medium 这里有很多关于 Athena 能做什么和不能做什么的资源,以及应该遵循的最佳实践。我就不细说了。相反,让我们来谈谈在设计会议上经常出现的棘手但必要的问题:安全性

当考虑将 Athena 作为一个工具时,首先要问的问题之一是它有多安全?Athena 是一个无服务器工具:您不需要在 VPC 中设置任何 Athena 实例,也没有安全组来过滤掉不需要的流量。就像 S3 一样,雅典娜必须通过互联网访问。

这时,安全和数据架构团队会有些惊讶。为什么你被问到,你应该选择这样一个有风险的工具吗?

嗯,它一点风险都没有,而且像任何其他技术一样——你让它多安全真的取决于你。

以下是您需要了解的关于 Athena security 的信息。

从广义上讲,数据安全性可以从两个方面来考虑:当数据处于静止状态时和当数据正在传输时。

让我们考虑静态数据。

场景#1: 您有一个 S3 存储桶,其中包含您想要从 Athena 查询的数据。您如何确保桶中的数据是安全的?

首先,确保源 bucket 是不可公开访问的——除非您出于一个非常好的理由有意识地希望它公开。句号。这是考虑 Athena 安全性时要做的第一件事(事实上,当您出于任何目的使用 S3 时)。很少有关于公开的 S3 桶导致的数据泄露的恐怖故事。下面是如何从 AWS 控制台更改存储桶的该属性:

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

Changing the public access policy for individual buckets

其次,确保桶中的数据是加密的。这是静态加密。有两种方法可以做到这一点:您可以加密桶:

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

Encrypting an S3 bucket from AWS console

或者您可以加密源文件:

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

Encrypting an S3 object from AWS console

无论哪种方式,您都可以使用 AWS 密钥管理服务 来进行加密。有三种类型的钥匙:

  • SSE-S3:这是你让 S3 管理加密密钥的地方
  • KMS:给,你有自己的钥匙,让 KMS 用吧
  • 上交所-KMS :你使用 KMS 生成的密钥,让 KMS 管理它

除非有必要,否则使用 SSE-KMS 密钥。通过 SSE-KMS,你可以控制谁可以访问密钥。下图显示了 KMS 键的两种访问级别。

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

IAM users and roles can be made KMS key administrators

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

IAM users and roles can be made KMS key users

第三,确保您的查询结果被加密。Amazon Athena 将查询结果存储在一个名为 S3 暂存目录的 S3 位置(可以配置)。加密 S3 桶或源文件并不意味着查询结果也被加密。除非您加密暂存目录,否则您并没有真正加密您的静态数据。

考虑一下:您从 Athena 运行一个关于一些敏感数据的查询。结果集作为文件保存在临时位置。现在,如果您的查询正在获取敏感数据,并且您没有对暂存位置进行加密,那么一些敏感信息将保持不加密状态。

加密单个查询结果怎么样?加密临时目录后,每个后续查询结果都将被加密。

这是加密暂存目录的方式:

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

Encrypting the Athena query result location

您应该使用相同的密钥来加密数据和查询结果吗?我建议使用不同的钥匙。这是一个管理开销,但是如果一个密钥被破坏,你知道至少另一个是安全的。

第四,你可以加密你的胶水数据目录。数据目录包含所有 Athena 表定义(以及其他内容)。一旦加密了目录,Athena 表定义(而不是数据)就被加密了。取决于你想在加密方面走多远,这可能是一个不错的补充。

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

Encrypting AWS Glue data catalog

场景#2 :你已经加密了数据;如何控制对数据的访问?

您可以使用 存储桶策略 微调对源数据的访问。存储桶策略规定了谁可以访问存储桶以及他们可以对其内容做什么(例如,解密数据)。存储桶策略可以允许来自同一个或另一个 AWS 帐户的 IAM 用户访问存储桶。这意味着,如果策略明确拒绝角色、用户或组的访问,即使某人有权访问桶加密 KMS 密钥,他/她也可能无法访问其内容。

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

The S3 bucket policy editor allows writing bucket policy

场景#3 :您只希望某些用户从 Athena 运行查询。

Athena 不像传统数据库那样支持用户帐户。控制谁可以访问 Athena 的唯一方法是通过 IAM 策略 。Athena 有两个 AWS 管理的 IAM 策略:

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

AWS managed policies for Amazon Athena

第一个策略(AmazonAthenaFullAccess)允许用户在 Athena 上执行任何操作。第二个(AWSQuicksightAthenaAccess)应该分配给使用 Amazon Quicksight 访问 Athena 的 IAM 用户。

我建议您为 Athena 用户创建两个自定义 IAM 策略。一个是“超级用户”策略,允许创建、修改或删除 Athena 对象,如数据库、表或视图。另一个是“分析师”政策。它没有管理权限。

创建策略后,创建两个角色并将每个策略分配给一个角色。接下来,将角色分配给 IAM 组。最后,根据访问要求将各个 IAM 用户分配到这些组中。

如果您的 Athena 查询是从 EC2 实例运行的,那么您可以将角色分配给该实例。

如何保护传输中的数据?你如何控制它?

在这里你不需要做什么。Amazon 服务端点是 SSL 加密的。这意味着传输层安全性(TLS)用于加密在 S3 和雅典娜之间传输的对象。

如果您使用符合 JDBC 标准的 SQL 查询工具来运行 Athena 查询,则返回给客户端的数据将被 SSL 加密。

最后一个选项实际上不是为了保护任何东西,而是为了监控。

您可以在您的 AWS 帐户上启用 CloudTrail ,一旦启用,它将记录对该帐户中任何 AWS 服务的每个 API 调用。这些事件的日志文件将以压缩和加密的格式存储在 S3。

由于 CloudTrail 日志保存在 S3,所以可以从 Athena 上搜索到它们。事实上,CloudTrail 控制台提供了为日志创建 Athena 表的工具。

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

Creating an Athena table from the AWS CloudTrail console

一旦创建了表,就可以搜索日志。

您还可以配置 CloudTrail 为 Athena 源桶捕获 S3 数据事件,如 GetObject (Read)和 PutObject (Write)。您可以使用这些数据事件的日志来查看 AWS Athena 何时访问 S3。

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

AWS CloudTrail configuration for S3 data events

现在,您已经看到了保护 Amazon Athena 的几个选项。你实现哪一个取决于你自己。

其他先进地区呢?比如自动化雅典娜?或者让它与 BI 分析工具一起工作?要通过动手练习学习这些和更多内容,你可以在 Pluralsight 注册我的在线课程:亚马逊雅典娜高级运营。

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

除 Console.log()以外的 8 个控制台 API 函数

原文:https://towardsdatascience.com/8-console-api-functions-other-than-console-log-81cc6b7164b?source=collection_archive---------8-----------------------

除 console.log 之外的一些重要控制台 API 函数的深入指南

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

Console API Functions

控制台 API 最常用的方法无疑是console.log。然而,它还附带了几个其他有用的方法,可以提高我们的调试效率。

让我们开始吧🏊并了解其他一些方法👇

注意:从 10.0.0 版本开始,NodeJS 和几乎所有主流浏览器都提供了所有方法。

console.table(数据[,属性])👇

在调试时,如果有一个复杂的嵌套对象或一组相同类型的对象,我们在阅读、理解和比较对象时会遇到困难。

console.table()是来救我们的。它以清晰的表格格式呈现数据。因此提高了可读性。

该方法有两个参数:

  • data:任意类型的数据集合,通常是对象数组。
  • properties:您想要用来显示表格的字段的字符串数组。

让我们用一个例子来了解更多:

const data = [
  {
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
  },
  {
    "id": "0002",
    "type": "donut",
    "name": "Raised",
    "ppu": 0.55,
  }
];

我们有一系列的对象data。让我们来看看数据的表格方法输出。

  1. console.table(data)

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

console.table(data)

2.console.table(data, ['name'])

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

console.table(data, ['name'])

对嵌套对象进行同样的尝试,并查看输出😄

注意:您可以通过单击列的标签按列对表格进行排序。

**控制台.组(标签)&控制台.组结束(标签)**👇

有时,可能会有这样一种情况,我们希望在一个循环中记录值。最好的办法是在每个循环的末尾添加一个分隔符来分隔每次迭代的值,但这仍然不够有效,因为没有标签来描述日志。

使用console.group,在登录到控制台时,正确组织相关数据并使用确定的组标签表示每个组变得非常简单。

这些方法带有一个可选参数— label,它是组的名称。

尽管不要求将参数传递给console.group(),但是我们还是应该这样做,以便弄清楚哪些值被分组在一起。

我们不必将组名传递给console.groupEnd(),因为它总是会关闭最近创建的组。

如果我们在一个已经创建的组中调用console.group(),我们也可以创建嵌套组。这里有一个简单的例子,可以帮助我们更好地理解它。

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

console.group() and console.groupEnd()

注意:由console.group(label)创建的组最初是打开的,如果我们调用console.groupCollapsed(label),我们可以从一开始就将组显示为折叠的。这里有一个例子:

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

console.groupCollapsed(label)

console.dir(对象)和 console.dirxml(对象)👇

在过去,console.logconsole.dir之间的行为非常不同,特别是在记录对象内容时,但是新的 JavaScript 引擎已经扩展了console.log的功能,所以和console.dir已经没有太大的区别了。

我发现的唯一区别是在浏览器控制台中访问 DOM 元素时。

  • console.log在类似 HTML 的树中打印元素
  • console.dir在一个类似 JSON 的树中打印元素,从这里我们可以检查元素的 DOM 属性

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

Difference between console.log() and console.dir()

在 Node.js 的情况下,console.dir(obj[, options])函数接受一个可选参数,该参数是一个可以有以下键的对象:

  • showHidden <布尔> 。如果true那么对象的不可枚举和符号属性也将被显示。默认: false
  • depth <编号> 。告知在格式化对象时递归的次数。这对于检查大型复杂物体很有用。要使其无限递归,请传递null默认: 2
  • colors <布尔> 。如果true,则输出将采用 ANSI 颜色代码。颜色可定制。默认: false

注意:如果你知道更多的区别,请随时用例子在下面评论😊

对 HTML 和 XML 元素或对象调用console.dirxml()等同于调用console.log()

注意:Node.js 内部的console.dirxml也调用console.log作为其参数。

让我们看一个例子

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

Difference between console.log() and console.dirxml()

console.profile([,label]) & console.profileEnd([,label])👇

console.profile([,label])开始记录调用它的地方(Browser 或 Node.js)的 CPU 和内存使用情况的性能概要。

探查器的每次运行都保存为一个单独的选项卡,由作为参数传递的标签标识。

记住使用console.profileEnd(label)结束剖析。

让我们通过一个例子来理解:

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

这会创建一个名为test1的 JavaScript 分析器,并开始记录浏览器的性能(假设它运行在浏览器中)。以查看 Chrome 浏览器中记录的性能。

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

console.profile([, label]) & console.profileEnd([, label])

注意:如果你在开发者工具中没有看到 JavaScript profiler 面板,那么请点击这个——点击三点菜单(在右上角)⋮->更多工具-> JavaScript Profiler。

对于 Node.js,该方法不显示任何内容,除非在检查器中使用。停止当前的 JavaScript CPU 性能分析会话(如果已经启动),并将报告打印到检查器的性能分析面板。

如果在没有标签的情况下调用console.profileEnd()方法,最近启动的概要文件将被停止。

注意:此功能是非标准的,不在标准轨道上。不要在面向 Web 的生产网站上使用它。

控制台.时间([,标签]) &控制台.时间结束([,标签]) 👇

console.time()启动可用于计算操作持续时间的计时器。console.timeEnd()停止计时器并以毫秒为单位打印总运行时间。

定时器由唯一的label标识,如果没有指定,timeEnd将采用最近的时间功能并停止它。

当您需要对一段代码进行性能检查时,通常会用到它们。你也可以向timetimeEnd传递一个字符串,它将启动另一个同名的定时器。

我们用一个小例子来了解一下

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

console.time([, label]) & console.timeEnd([, label])

循环完成所用的时间是 0.01784375 毫秒

注:查看这个性能分析开源代码完全是使用上述两个函数制作的。

console.count([,label])&console . count reset([,label] ) 👇

[console.count](https://developer.mozilla.org/en-US/docs/Web/API/Console/count)([,label])在作为参数传递的标签上放置一个计数器。每次调用它时,计数器的值都会增加。调试控制台中显示一个标签和一个数字,如果label没有通过,console.count()将记录当时它被调用的次数,默认标签如下:

[label]: X    //when label is passed
default: X    //when label is not passed

console.countReset()将重置 count 的值,如果它与参数label一起使用,那么它将重置该特定标签的计数值。

这里有一个例子可以更好地理解这些方法。

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

console.count([, label]) & console.countReset([, label])

在上面的例子中,当我们使用console.countReset()重置计数器的值,并再次调用console.count()方法时,我们看到它返回计数器 1,就像它调用一次一样。

此外,请注意带标签和不带标签调用这些方法的区别。🌟

console.assert(表达式,消息)👇

该方法用于运行简单的断言测试。它需要两个必需的参数:

  • expression:布尔表达式。
  • message : 写入控制台的字符串或对象。

注意:如果一个表达式为 false,它会向控制台写入一条消息并抛出异常。如果这是真的,那么它将什么也不做。

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

console.assert(expression, message)

console.trace([,data])👇

有时,在调试复杂的函数调用时,我们会陷入检测可调用函数及其参数值的困境。这就是console.trace()出现的地方,它从被调用的点打印可调用函数的堆栈跟踪到控制台。

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

console.trace([,data])

注意:当 Node.js 中抛出异常时,或者当我们在浏览器中调试函数时,可以使用这种方法的一个实例是跟踪堆栈。

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

A stack trace example from Node.js

输出太多?

使用**console.clear()** 清除所有内容即可😃

如果您想加入我的电子邮件列表,请考虑在此处输入您的电子邮件地址 和关注我的medium阅读更多关于 javascript 和Github的文章,查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。

你可能也会喜欢我的其他文章

  1. 20 VS 快速编码的代码快捷键
  2. VS Web 开发效率的代码扩展
  3. Nodejs 应用程序结构——构建高度可扩展的架构。

如果你喜欢这篇文章,请随意分享,帮助他人找到它!

谢谢!

8 机器学习实施中的经验教训

原文:https://towardsdatascience.com/8-lessons-learned-in-machine-learning-implementation-86cede701eb1?source=collection_archive---------29-----------------------

机器学习和数据科学发展中该做什么和不该做什么的快速概述

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

在过去的三年里,我在 DataArt 领导机器学习和数据科学,研究不同业务的痛点,提出技术解决方案并进行实施。

在我与技术打交道的时间里,我已经确定了我使用的八个关键规则。

1.如果工具存在,不要重新发明轮子

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

Not invented here syndrome. Image: source.

一个在技术社区流行的想法,为每一个新问题建立定制的解决方案。许多工程师真的相信,他们非常定制的方法,为适应确切的业务案例而构建,比从货架上拿出一个解决方案并根据特定案例进行调整更好。

云提供商正在快速开发 ML 服务,走着大数据服务在他们之前走过的路。十年前,大数据是一种价格昂贵、易于扩展和容错的奇异水果。现在是标配了。开源工具也是如此。在 99%的情况下,你不需要发明一个新的图书馆或数据库,因为最有可能的是你会在市场上找到一些有用的东西

2.始终考虑商业价值和投资回报率

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

Source: Deloitte.

每个技术任务都应该带来商业价值。如果你做研究,你应该总是能够提供一个你在现实生活中正在处理的案例的例子。通常,如果你不能量化这样一个案例,就没有必要在它上面花费时间。

ROI 计算方法可能需要重新校准。与经典编程相比,机器学习是一种概率方法,永远不会为您提供 100%的准确性,因此您应该始终评估准确性的提高是否会带来价值 2、5、10 或 20 %的投资。

好消息是,数据科学项目非常接近业务,所以你应该有很大的回报感。

假设您有数百人,他们的工作是从文档中提取数据,那么自动化提取结果的准确性增加 5%可能意味着每年数百万美元。但是,如果增加 1%的准确度会花费大量的金钱,这是计算机视觉项目中的一个普遍情况,也许有更有价值的任务,我们仍然可以依靠人类操作员。

3.永远不要在假设形成之前就开始研究

通常,商业人士会以这样的方式提出问题:“我们有大量的数据,我们如何从这些数据中找到意义?你能帮我们找到真知灼见吗?”

没有一个明确的假设,永远不要开始研究这个,否则,这是在大海捞针。把机器学习想象成一个能做好一件事的超级智慧——自动完成由于缺乏计算能力而无法手动处理的事情。如果你不能回答你在寻找什么,很可能你在做一些随机的事情。

总是从这样的问题开始:

  • 我想解决什么样的问题?
  • 我想回答什么样的问题?

4.必须小心处理与现有系统的集成

整合本身没什么大不了。但是一定要考虑到人类的感知。如果公司有一个基于规则的系统来做决策,并且很清楚它是如何工作的,那么一个使用 ML 技术的新解决方案对利益相关者来说就像一个黑盒。因此,制定明确的迁移计划以应对潜在风险至关重要。

我们与一家商务旅游公司合作,这家公司的工作之一就是为客户购买机票。预订需要 17 个小时,在此期间价格可能会波动。波动可能取决于许多因素:客流量、星期几、一天中的时间、季节、重大体育或文化活动、天气等。目标是证明,在 ML 的帮助下,分析历史数据,价格可以在旧的但经过验证的基于规则的系统产生的现有降价的基础上降低几个百分点。

但是没有人愿意依赖一个营业额十亿美元的黑匣子。详细阐述了一个迁移计划:首先,与生产系统并行设置一个基于 ML 的预测器,然后在生产中处理 10%的采购,然后是 30%,不断测量相对性能。当系统在生产中得到验证时,至少 10%的门票仍需要通过旧的基于规则的算法来购买,以获得销售引擎的最新更新,从而避免过度拟合(ML 系统自认为了解周围世界的一切时的状态)。

向所有利益相关者证明 ML 过程是渐进的,并且在失败的情况下是可逆的,这一点非常重要。

5.进行版本控制

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

Image: DVC.

你的 ML 模型的每一个新版本都是一个实验。它可能成功也可能失败,这就是为什么你应该总是有一个工作的 CI/CD 管道,以便能够反向到一个旧版本。

但是,您也不应该忘记数据的正确版本、模型参数和实验结果。这里有专门的工具可以帮忙,比如 DVC——ML 的版本控制系统。

6.不要让轮子在研究中旋转:保持目标集中(但不要忽视伟大的意外发现)

当你开始研究一个问题,然后发现另一个问题,然后你发现自己在一个完全不同的地方,对产品来说并不重要,这很容易被研究的常规所困扰。

专注于你的研究,不要分心,记住你为什么开始,主要目标是什么。

**然而,如果你看到一个对用户来说可能很有价值的唾手可得的果实——去得到它!**当您进行可视化来表示在数据中发现的见解时,这尤其可能发生。从形式上看,这在当时可能并不重要,但是您永远不知道在某个时候什么对业务来说可能是有价值的。

请记住,在您最喜爱的应用程序中接收微小但可爱的更新是多么美好。

7.要有创意!

总有一种复杂而准确的方法来解决大量数据争论、特征工程等问题,这意味着需要数天的手工操作。但是你能简单的用 20%的努力带来 80%的结果吗?

我们已经学会在数据之上运用横向思维。在一个案例中,我们需要在一家大型化学公司中按照业务单元对流程进行分类。我们发现了一种替代手动输入的方法,即使用公开的 NLP 模型,将流程和部门短语转换为向量,并找到最接近的对。

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

Image: source.

有一次,我们需要对包含万事达标识的 20 年的营销材料进行分类,以找出哪些材料仍然是真实的。成千上万的文件。在某个时候,我们意识到万事达卡的最后一次标志变化发生在 2016 年。两个小时来标记和训练基于云的图像识别服务,瞧,我们只剩下新的文档了。

在数据科学项目中,我们总是缺乏数据或专业知识,因此创造力是构建工作解决方案的重要资产。

8.人的因素——保持敏感并管理期望

像 ML 这样的新技术带来了一系列的挑战,这些挑战是更成熟的技术所没有的。像 ML 这样的新技术的一个主要问题是确保提出的解决方案不会因为不可避免的不确定性而使管理层感到沮丧。

对于周围的大多数人来说,ML 和数据科学是一个黑盒子,这就是为什么期望管理比以往任何时候都更重要。不要忘记教育人们,量化研究结果以与目标进行比较,并从技术和人的角度提前考虑集成。

而且,在适当的情况下,人工智能、启发式方法和人工程序的结合是很好的。当人们开始构建一个基于人工智能的解决方案时,往往会有一种建立完全自动化的东西的意图——一个带有铃铛和哨子的 oracle,可以绝对确定地提出建议。

如果这是可能的,你是幸运的,但不要忘记,即使 ML 不允许你完全解决任务,它也可以在准备决策所需的数据方面提供很大的帮助。将最终决定权从 ML 手中夺走有助于避免行业专家的不信任,他们通常更喜欢由人来做出最终决定。

你有什么见解?请在评论中分享。

为什么我认为 Python 非常适合机器学习和人工智能

原文:https://towardsdatascience.com/8-reasons-why-python-is-good-for-artificial-intelligence-and-machine-learning-4a23f6bed2e6?source=collection_archive---------3-----------------------

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

这篇关于 为什么 Python 对 ML 和 AI 有好处的文章,原贴于 Django Stars 博客

人工智能(AI)和机器学习(ML)是 IT 行业的新黑。虽然关于其开发安全性的讨论不断升级,但开发人员扩大了人工智能的能力和容量。今天,人工智能已经远远超出了科幻小说的概念。这成了一种必然。人工智能被广泛用于处理和分析海量数据,有助于处理无法再由人工完成的工作,因为其数量和强度显著增加。

例如,人工智能被应用于分析,以建立预测,帮助人们制定强有力的战略,寻找更有效的解决方案。FinTech 在投资平台中应用人工智能进行市场研究,并预测将资金投入何处以获得更大利润。旅游业使用人工智能来提供个性化建议或推出聊天机器人,并增强整体用户体验。这些例子表明,人工智能和人工智能被用来处理大量数据,以提供更好的用户体验,更个性化和更准确的体验。

人工智能和人工智能如何形成未来的技术

今天,随着数据量和复杂性的增加,人工智能和 ML 被用于数据的处理和分析。平心而论,人脑是可以分析大量数据的,但这种能力受限于它随时可以吸收的数据量。人工智能不受这个限制。人工智能提供的更准确的预测和见解提高了业务效率,降低了生产成本,提高了生产率。难怪许多行业应用人工智能和人工智能来提高性能和推动产品开发。

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

根据德勤的研究,人工智能驱动的公司是旨在提高生产力的技术变革的最新趋势。他们的预测也证明了这一点,即在未来 24 个月内,将在产品和流程中使用人工智能以实现更高效率和战略目标的公司数量可能会增加。简而言之,人工智能有助于用更少的努力做更好的工作。

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

鉴于人工智能使用的优势,越来越多的公司渴望使用它。然而,人工智能是一条双行道——被用于优化分析过程,它不是最容易开发的技术。由于要分析的数据量巨大,人工智能产品必须能够有效地处理高负载的过程,并且不会为此花费太多时间。为了使其正常工作,必须为其开发选择合适的语言。就语法而言,它不会太复杂,能够处理复杂的过程,并且易于支持。

Python 是人工智能和 ML 的最佳编程语言

随着人工智能和人工智能在各种渠道和行业中的应用,大公司在这些领域进行投资,对人工智能和人工智能专家的需求也相应增长。来自 IBM 机器学习部门的 Jean Francois Puget 表达了他的观点,Python 是人工智能和 ML 最受欢迎的语言,并基于 indeed.com 的一个趋势搜索结果。

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

根据 Francois Puget 的图表,Python 是 AI 和 ML 的主要代码语言。

我们对 Python 的优势进行了一些研究,并发现了为什么在将 AI 和 ML 项目付诸实践时应该选择 Python。

您可能还喜欢:

[## 旅游业中的机器学习和数据分析

克里斯托弗·哥伦布是历史上最著名的旅行家之一,他一生只进行了 4 次旅行。其中一个…

djangostars.com](https://djangostars.com/blog/benefits-of-the-use-of-machine-learning-and-ai-in-the-travel-industry/#utm_source=medium&utm_medium=towardsdatascience.com&utm_campaign=8%20reasons%20why%20python%20is%20good%20for%20ml%20and%20ai&utm_content=you%20may%20also%20like%201) [## 金融服务中的 6 个人工智能示例

正如许多其他技术进步一样,人工智能从童话故事中走进了我们的生活…

djangostars.com](https://djangostars.com/blog/6-examples-ai-financial-services/#utm_source=medium&utm_medium=towardsdatascience.com&utm_campaign=8%20reasons%20why%20python%20is%20good%20for%20ml%20and%20ai&utm_content=you%20may%20also%20like%202)

1.一个伟大的图书馆生态系统

丰富的库选择是 Python 成为最流行的人工智能编程语言的主要原因之一。库是一个模块或一组由不同来源发布的模块,如 PyPi ,其中包括一段预先编写的代码,允许用户实现某些功能或执行不同的操作。Python 库提供了基础级别的项目,因此开发人员不必每次都从头开始编码。

ML 需要连续的数据处理,Python 的库让你可以访问、处理和转换数据。这些是你能为 ML 和 AI 使用的一些最广泛的库:

  • Scikit-learn 用于处理基本的 ML 算法,如聚类、线性和逻辑回归、回归、分类等。
  • 熊猫用于高层数据结构和分析。它允许合并和过滤数据,以及从其他外部来源(例如 Excel)收集数据。
  • Keras 进行深度学习。它允许快速计算和原型制作,因为除了计算机的 CPU 之外,它还使用 GPU。
  • TensorFlow 用于通过建立、训练和利用具有大规模数据集的人工神经网络来处理深度学习。
  • Matplotlib 用于创建 2D 图、直方图、图表和其他可视化形式。
  • NLTK 用于处理计算语言学、自然语言识别和处理。
  • Scikit-image 用于图像处理。
  • PyBrain 用于神经网络、无监督和强化学习。
  • Caffe 用于深度学习,允许在 CPU 和 GPU 之间切换,并使用单个 NVIDIA K40 GPU 每天处理 60+ mln 图像。
  • 统计模型用于统计算法和数据探索。

PyPI 库中,你可以发现和比较更多的 Python 库。

2.低准入门槛

在 ML 和 AI 行业工作,意味着要处理一堆你需要用最便捷有效的方式处理的数据。较低的准入门槛允许更多的数据科学家快速掌握 Python,并开始使用它进行人工智能开发,而无需浪费太多精力来学习这种语言。

Python 编程语言类似于日常英语,这使得学习过程更加容易。其简单的语法允许您轻松地处理复杂的系统,确保系统元素之间的清晰关系。

例如,编写这段代码的目的是为了确定输入的数字是否是质数。

下面是代码的视图:

test_number = 407 # our example is not a prime number# prime numbers are greater than 1if test_number > 1:# check for factorsnumber_list = range(2, test_number)for number in number_list:number_of_parts = test_number // numberprint(f"{test_number} is not a prime number")print(f"{number} times {number_of_parts} is {test_number}")breakelse:print(f"{test_number} is a prime number")else:print(f"{test_number} is not a prime number")

正如你在最后一行看到的,这段代码的结果是测试数不是质数。坦率地说,一个说英语的人可以很容易地理解代码的含义,因为它使用简单的英语单词。

除此之外,还有很多可用的文档,Python 社区也随时提供帮助和建议。

3.灵活性

用于机器学习的 Python 是一个很好的选择,因为这种语言非常灵活:

  • 它提供了选择使用 OOPs 或脚本的选项。
  • 也不需要重新编译源代码,开发人员可以实现任何更改并很快看到结果。
  • 程序员可以结合 Python 和其他语言来达到他们的目标。

此外,灵活性允许开发人员选择他们完全熟悉的编程风格,甚至组合这些风格以最有效的方式解决不同类型的问题。

  • 命令式风格由描述计算机如何执行这些命令的命令组成。通过这种方式,你可以定义程序状态改变时的计算顺序。
  • 函数式风格也被称为声明式,因为它声明了应该执行什么操作。它不考虑程序状态,与命令式相比,它以数学方程的形式声明语句。
  • 面向对象风格基于两个概念:类和对象,相似的对象形成类。Python 并不完全支持这种风格,因为它不能完全执行封装,但是开发人员仍然可以在一定程度上使用这种风格。
  • 程序风格在初学者中最常见,因为它以一步一步的方式进行任务。它通常用于排序、迭代、模块化和选择。

灵活性因素降低了出错的可能性,因为程序员有机会控制局面并在舒适的环境中工作。

4.平台独立性

Python 不仅使用起来舒服、容易学习,而且用途广泛。我们的意思是,用于机器学习开发的 Python 可以在任何平台上运行,包括 Windows、MacOS、Linux、Unix 和其他 21 种平台。为了将流程从一个平台转移到另一个平台,开发人员需要实现一些小规模的更改,并修改一些代码行,以创建适用于所选平台的可执行形式的代码。开发者可以使用像 PyInstaller 这样的包来准备他们的代码,以便在不同的平台上运行。

同样,这为各种平台上的测试节省了时间和金钱,并使整个过程更加简单和方便。

5.可读性

Python 非常容易阅读,所以每个 Python 开发者都可以理解他们同行的代码,并修改、复制或分享它们。没有混淆,错误或冲突的范例,这导致了人工智能和人工智能专业人员之间更有效的算法,思想和工具的交流。

也有像 IPython 这样的工具可用,这是一个交互式 shell,提供额外的功能,如测试、调试、制表和其他功能,并简化工作流程。

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

6.良好的可视化选项

我们已经提到 Python 提供了各种各样的库,其中一些是很好的可视化工具。然而,对于 AI 开发人员来说,重要的是要强调,在人工智能、深度学习和机器学习中,能够以人类可读的格式表示数据至关重要。

Matplotlib 这样的库允许数据科学家构建图表、直方图和绘图,以便更好地理解数据、有效地展示和可视化。不同的应用程序编程接口也简化了可视化过程,使创建清晰的报告变得更加容易。

7.社区支持

当围绕编程语言建立了强大的社区支持时,这总是很有帮助的。Python 是一种开源语言,这意味着有很多资源对程序员开放,从初学者到专业人员。

许多 Python 文档可以在网上以及 Python 社区和论坛中获得,程序员和机器学习开发人员在那里讨论错误、解决问题并互相帮助。

Python 编程语言是绝对免费的,各种有用的库和工具也是如此。

8.日益普及

由于上面讨论的优势,Python 在数据科学家中越来越受欢迎。根据 StackOverflow 的消息,Python 的受欢迎程度预计至少会持续到 2020 年。

这意味着寻找开发人员和替换团队成员变得更加容易。此外,他们的工作成本可能没有使用不太流行的编程语言时高。

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

人工智能和人工智能的 Python 用例

Python 提供了许多对 AI 和 ML 特别有用的特性,这使得它成为实现这些目的的最佳语言。难怪各行各业都用 Python 做预测等机器学习任务。

让我们仔细看看中的一些示例:

  • 旅行;
  • Fintech
  • 运输;
  • 医疗保健。

旅行

例如,旅游业巨头 Skyscanner 使用 Python 无监督 ML 算法来预测新飞机航线的行为。他们比较了数千个出发地和目的地,用 30 种不同的标准来评估每一个目的地,以确定乘客的需求。他们的结果显示在仪表盘上,在那里你可以选择任何始发城市来查看从 0 到 9 的目的地组及其特征。

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

这样一个人工智能在旅游行业中实施的例子对于向用户推荐目的地、协助创建营销预算以及为新路线设定初始价格非常有帮助。

金融科技

金融服务中使用的人工智能有助于解决与风险管理、欺诈防范、个性化银行、自动化和其他工具相关的问题,从而为用户提供高质量的金融服务。据预测,到 2030 年,金融科技中的人工智能可以将运营成本降低 22 %( T7 ),产生令人印象深刻的 1 万亿美元。

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

基于 Python 构建的网上银行软件的成功例子有 VenmoAffirmRobinhood 。这些服务不仅允许用户进行和控制他们的支付和购买,而且它们还在软件内部创建了一个社交网络,因此人们可以保持联系。

当谈到加密货币时,Python 被用来构建类似于 Anaconda 的解决方案,以有效地分析市场,进行预测和可视化数据。

运输

优步用 Python 开发了一个 ML 平台米开朗基罗 PyML 。他们用它进行在线和离线预测,解决日常任务。米开朗基罗 PyML 是最初米开朗基罗产品的扩展,它是可扩展的,但不够灵活。现在,用户可以用 PyML 验证模型,然后在米开朗基罗中复制它们,以获得充分的效率和可伸缩性。

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

卫生保健

人工智能正在重塑医疗保健行业,帮助预测和扫描疾病,检测损伤,并帮助人们通过易于使用的移动应用程序在日常生活中保持良好的健康。

业界有很多基于人工智能的伟大项目。例如, Fathom 是一个自然语言处理系统,用于分析电子健康记录,他们的任务是“自动化医疗编码”他们的领导者来自谷歌、亚马逊、脸书等公司,或者斯坦福大学和哈佛大学。

AiCure 是另一家专注于确保患者在正确的时间服用正确药物的初创公司。为此,他们使用面部识别、药丸识别和动作识别等技术。该应用程序还能够分析患者的状态,并了解治疗是否有效。他们使用 IMA,这是一种交互式医疗助手,可以收集临床上有意义的数据,然后通过软件进行分析。

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

越来越受欢迎导致数据科学社区对 Python 程序员的需求越来越大,选择一种需求量大的语言是明智的选择,因为在未来,它将允许更多的功能。

用于机器学习的 Python:有用的开源项目

Python 的开源特性允许任何人工智能开发公司与社区分享他们的成果。如果你已经下定决心,决定学习 Python,或者想在你的人工智能项目中使用这种语言,这里有一个有用的开源项目列表供你开始使用:

  • OpenCog 基金会 OpenCog 致力于创造具有人类能力的人工通用智能(AGI ),以此“共同构建更好的思想”。它成立于 2011 年,现在,它被用于奇点网络项目,以及汉森机器人公司,为索菲亚和其他机器人提供智能。
  • 人工智能研究所人工智能研究所是不来梅大学计算机科学学院的一部分。它对人工智能进行研究,举办不同的研讨会和活动,帮助推动人工智能技术向前发展,让更多年轻人参与该领域并对他们进行教育,同时支持现有的人工智能项目和公司。
  • 这是“世界上最高效的团队聊天”,每天可以处理数千条实时消息。财富 500 强公司和其他大型开源项目使用 Zulip,它提供了清晰的组织、异步通信和其他对团队有用的巨大优势。
  • Magenta
    它致力于图像、歌曲、图画的生成,让艺术家探索新的创作方式。
  • MailPile
    MailPile 是一款创新的电子邮件客户端,专注于安全和私密的通信。这个项目试图回答一个问题:“我如何在网上保护我的隐私?”它速度快,没有广告,有强大的搜索功能,还有隐私和加密功能。

总结一下

人工智能和人工智能是快速发展的通用技术,让科学家解决现实生活中的困境,并提出聪明的解决方案。他们中的许多人认为 Python 是人工智能的完美编程语言的原因是由于以下优点:

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

Python 中加速数据科学发展的 8 个技巧

原文:https://towardsdatascience.com/8-tricks-in-python-to-accelerate-your-data-science-development-cad3b634e140?source=collection_archive---------8-----------------------

让我们简短,让我们有效。少字多码(多模因图解)。这就是你要找的,对吗?;)

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

Python 语言技巧

检查一行代码中的条件(断言)

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

例如,我们将检查训练和测试函数是否具有相同的列(当您预测测试数据集并且没有应用相同的功能工程时,这是一个常见的错误:)

常见 Python:

label = df_train['label_column']
df_train = df_train.drop('label_column',axis=1)
if df_train.column.tolist() != df_test.column.tolist():
   print('Train and test column do not match')
   print(sys.exit())

Python 技巧:

assert df_train.column.tolist() == df_test.column.tolist(),'Train and test column do not match'

在一行代码中循环(单行代码)

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

例如,我们将填充一个从 0 到 100 的偶数列表,并为 ood 编号填充 0(即[0,0,2,0,4,0…])

常见 Python:

my_awesome_list = []
for i in range [0,100]:
    if i%2 = 0:
        my_awesome_list.append(i)
    else:
        my_awesome_list.append(0)**my_awesome_list = [0,0,2,0,3,4]**

Python 技巧:

my_awesome_list = [i if i%2==0 else 0 for i in range(0,100) ]**my_awesome_list = [0,0,2,0,3,4]**

创建函数而不创建函数(lambda)

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

计算列表中每个元素的双精度值:

常见 Python:

a = [2,2,2]
for i in range(0,len(a)):
    a[i] = a[i]*2**[4, 4, 4]**

Python 技巧:

a = [2,2,2]
double = lambda x : x*2
a = [double(a_) for a_ in a]**[4, 4, 4]**

使用另一个列表转换一个列表,不使用循环(map)

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

在一个完全否定列表中转换一个数字列表。

常见 Python:

a = [1,1,1,1]
for i in range(0,len(a)):
    a[i] = -1 * a[i]**[-1, -1, -1, -1]**

Python 技巧:

a = [1,1,1,1]
a = list(map(lambda x: -1*x, a))**[-1, -1, -1, -1]**

乍一看不要滥用简单语法(try: except 和 global)

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

我在初级 Python 开发人员的 lof 代码中注意到的一个常见错误是使用太多 try/except 和全局语法来开发代码,例如:

def compare_two_list(list_a,list_b):
    global len_of_all_list
    try:
        for i in range(0,len_of_all_list):
            if list_a[i] != list_b[i]:
                print('error')
    except:
        print('error')global len_of_all_listlen_of_all_list = 100
list_a = [1]*len_of_all_list
len_of_all_list = len_of_all_list+1
list_b = [1]*len_of_all_listcompare_two_list(list_a,list_b)**'error'**

调试这样的代码真的很复杂。使用 try:除非您需要通过处理特定的异常来操作代码中的某些内容。例如,这里使用“try: except”语句来处理我们的问题的一种方法是忽略 list_a 的最大索引之后的所有索引:

def compare_two_list(list_a,list_b):
    global len_of_all_list
    try:
        for i in range(0,len_of_all_list):
            if list_a[i] != list_b[i]:
                print('error')
    except IndexError:
        print('It seems that the two lists are different sizes. They was similar until index {0}'.format(len_of_all_list-1))
        return

global len_of_all_list
len_of_all_list=100
list_a = [1]*len_of_all_list
len_of_all_list = len_of_all_list+1
list_b = [1]*len_of_all_list
compare_two_list(list_a,list_b)**It seems that the two lists are different sizes. They was similar until index 101.**

数据科学图书馆技巧

基于条件(np.where())填充 DataFrame 列

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

作为示例,我们将基于一个条件来填充一列,如果人数等于 1,则意味着该人是独自一人,否则该人不是独自一人(为了简化,我们假设 0 不存在于“人数”列中):

常见 Python:

df['alone'] = ''
df.loc[df['number_of_persons'] == 1]]['alone'] = 'Yes'
df.loc[['number_of_persons'] != 1]]['alone'] = 'No'

Python 技巧:

df['alone'] = np.where(df['number_of_persons']==1,'Yes','No')

获取所有数字列(pd。DF()。select_dtypes(include=[]))

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

对于大多数机器学习算法,我们需要给它们数值。Pandas DataFrame 提供了一种选择这些列的简单方法。您还可以使用 select_dtypes 选择任何类型的数据类型作为对象、分类…

常见 Python:

df_train.info()**<class 'pandas.core.frame.DataFrame'>
Index: 819 entries, 0_0 to 2_29
Data columns (total 4 columns):
image_id                     812 non-null object
age                          816 non-null int64
gender                       819 non-null object
number_of_persons            734 non-null float64
dtypes: float64(10), object(3)
memory usage: 89.6+ KB** numerical_column = ['age','number_of_persons']
X_train = df_train[numerical_column]

Python 技巧:

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

获取 DataFrame 选择中条件的倒数(。[~条件])

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

例如,我们将为成年人和未成年人创建两个列。

常见 Python:

minor_check = df.age.isin(list(range(0,18)))
df['minor'] = df[minor_check]df['adult’] = df[not (minor_check)]**ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().**

Python 大师:

我们知道。isna()和 isin()可以检索 nan 值和 dataframe 列中的列表值。但是 isNOTna() ans isNOTin()不存在,符号来了~(也可以用 np.invert()😃。

minor_check = df.age.isin(list(range(0,18)))
df['minor'] = df[minor_check]
df['adult’] = df[~minor_check]

希望这些技巧会有所帮助,请不要犹豫,分享你的!😃

用于数据集处理的 8 个有用的 Pandas 特性

原文:https://towardsdatascience.com/8-useful-pandas-features-for-data-set-handling-753e9d8ba8ff?source=collection_archive---------11-----------------------

世界杯和熊猫- Joga bonito

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

Image Courtesy of Fauzan Saari via Unsplash

介绍

本文展示了 8 个简单但有用的 Pandas 操作,展示了 Python 的 Pandas 库如何有效地用于数据集探索。我将在这篇教程中使用的数据集名为“【1872 年至 2019 年的国际足球成绩”,可以在这里找到[,以防出现任何想要测试的代码片段示例。](http://International football results from 1872 to 2019)

1.Pandas read_csv 方法的 parse_dates 参数。

通常,当我第一次导入数据集时,我使用 head()方法读取前 5 行。所示的示例通知我,我有一个日期列。理想情况下,对于基于日期-时间的操作,我希望该列具有日期-时间数据类型。

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

Before assigning the data-set to a variable name, I quickly view the columns to get a sense of the data-set

为了在我第一次导入数据集时做到这一点,您可以简单地使用 Pandas read_csv 方法的 parse_dates 可选参数。此参数采用一个列表,其中您希望作为日期时间数据类型的列名在列表中作为字符串列出。

  • 如果要将多个列解析为 datetime 数据类型,只需将每个列名传递到列表中,用逗号分隔。这可以防止使用 pd.to_datetime 方法重新分配现有列。例如,如果我只是读入数据,不包括 parse_dates 参数,我将不得不使用 pd.to_datetime 方法来获得相同的最终结果。

要确认该列已经成功转换为 datetime 数据类型序列,只需调用 DataFrame 上的 dtypes 属性,我在这里为它指定了变量 football。

(注意:我已经创建了一个名为 match goals 的新列,将在后面的步骤中使用)

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

The parse_dates parameter can simplify and cut down on the amount of code that needs to be written when parsing columns which require a datetime datatype. The pd.to_datetime is an equivalent way of executing this conversion.

2。熊猫系列的中间方法

既然 date 列有 datetime 数据类型,我可以通过在数据集上使用 between 方法来利用这一点。

由于我关注的是 FIFA 世界杯,所以我过滤了足球数据帧,并创建了一个布尔序列,如果锦标赛列中的列值与“FIFA 世界杯”匹配,则返回真值。然后,我将这个布尔序列分配给一个名为世界杯比赛的变量,并使用这个布尔序列过滤足球数据帧。这给了我一个新的数据框架,为简单起见,我称之为世界杯。

我现在可以在我的 world_cup 数据帧中的日期列上使用 between 方法,找出在两个指定日期之间发生的比赛数量。

between 方法的第一个参数是下限字符串日期,第二个参数是上限字符串日期。between 方法返回一个布尔序列,我将它赋给变量 games_range。然后我用这个布尔序列过滤世界杯数据帧。

为了清楚起见,我选择了 2010 年 1 月 1 日和 2016 年 1 月 1 日之间的日期,因为我知道在这两个日期之间有两届世界杯;一次是 2010 年在南非,另一次是 2014 年在巴西。在现代形式下,每届世界杯都由 64 场比赛组成。我用来过滤世界杯数据帧的游戏范围变量应该返回 128 行。确实如此,如代码片段所示。

注意:对于 between 方法,下限是包含性的,上限是排他性的。

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

2.b 过滤日期

此外,在处理 datetime 数据类型时,可以使用比较运算符。在这里,我创建了一个布尔序列,如果“日期”大于 2018 年 1 月 1 日,则返回真值。我用这个布尔序列过滤我的 world_cup 数据帧,并使用 shape 属性快速检查它的形状。这告诉我,世界杯数据帧中的 64 行对应于 2018 年 1 月 1 日之后的日期。这在 2018 年俄罗斯世界杯发生在当年夏天的基础上是有道理的!

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

3.数据透视表方法

数据透视表方法非常适合于将值作为一个整体进行汇总。pivot_tables 方法直接在 DataFrame 上调用,这里是’ recent_wc_games '(上一节的*,基于两届世界杯,参见下面注释掉的代码*)。在所示的示例中,我在“match_goals”列进行汇总,该列对应于每场比赛的比赛进球数。

这些值现在可以根据国家和城市进行分组。这些列作为字符串列表传递给 pivot table 方法的 index 参数,以创建多序列索引。然后,我选择希望对分组数据运行的聚合函数。这里,我将一个列表传递给 aggfunc 参数,它给出了分组数据的计数和平均值。

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

This data output requires some sorting, but shows how simply the data can be summarised

4.整理

-当存在多索引列时,使用元组通过 sort_values 指定。

现在,数据已经根据国家和城市进行了分组,以获得平均比赛进球数和比赛次数,我可以对数据进行排序,使其更易于理解。此外,我可以使用 Pandas 的一行程序来可视化数据。

我使用 sort_values 方法,但是*更重要的是,*要按比赛进球得分排序,我需要传入一个 tuple。我将 ascending 参数设置为 False,从最高平均匹配目标到最低平均匹配目标对数据进行排序。在这里,巴西的阿雷格里港似乎举办了 2014 年巴西世界杯最具娱乐性的比赛。

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

Porto Alegre, the best place to have watched a FIFA World Cup match?

5.测绘

-记得导入 matplotlib。

要通过平均匹配得分来绘制这些排序值,我只需在绘图方法中为 y 参数指定一个元组。元组中的第一个元素是最外面的列索引值,后面是内部列索引,如下所示。为了生成垂直条形图,我将 bar 作为参数传递给 kind 参数。

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

Certain version of the Jupyter Notebook may require the cell magic %matplotlib inline command, so I have included it in this example.

6.get_group 方法

为了利用 get_group 方法,我首先在最初引入的原始足球数据帧中创建锦标赛列的 groupby 对象。我给这个 groupby 对象分配了一个变量名‘锦标赛’。python len 函数和 nunique series 方法告诉我,在原始足球数据帧中有超过 40,000 行,但只有 109 个独特的比赛。

我现在在变量锦标赛上使用 get_group 方法,该方法指向 groupby 对象以返回一个数据帧,其中只有“FIFA World Cup”被列为锦标赛类型。在原始数据帧的 40839 行中,有 900 行对应于 FIFA 世界杯数据。

我现在可以使用这个新的数据帧(我称之为 fifa ),并在其上执行任何操作。例如,我可以按国家分组来确定比赛进球的平均数,如下面的代码片段所示。

get_group 方法在获取新的数据帧时非常好用。我同样可以编写 tournament . get(’ Copa America '),从原始足球数据帧中获取与该锦标赛对应的所有行。

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

To produce this output I have method chained, and ended with the head method. This explains why only 5 horizontal bar columns are shown.

7.单个列上的多个聚合函数。

通常需要对数据帧中的单个列执行多个聚合函数。在给出的例子中,我想确定每一个举办世界杯比赛的国家的记录数量,平均,最小和最大比赛进球得分。

为了做到这一点,我创建了一个 groupby 对象,并传递了 agg 方法(一个字典),其中键表示列,值表示我希望执行的聚合函数。如果我想对这个输出进行排序,就必须将一个元组传递给 sort_values 方法,其中第一个元素是列,第二个元素是我想要排序的聚合函数。

有趣的是,瑞士的一场世界杯比赛似乎上演了一场 12 球的惊悚片!瑞士也拥有最多的平均比赛进球数,平均每场比赛超过 5 个!对于感兴趣的人,我确实在 1954 年 T2 世界杯上检查了这些结果,因为结果甚至让我吃惊!

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

The output is sorted by the ‘mean’ aggregation function and the tail is shown, which defaults to the last 5 rows.

8.pd.cut 创建类别

最后,为了包含,可以方便地使用 pd.cut 方法将数据分类到用户定义的箱中。对于这个例子,我已经为那些离群游戏创建了一系列 4 个容器,-1 对 1 目标(第一个数字是唯一的,因此我不能从 0 开始容器),1-3 目标,3-5 目标和 5-13 目标!

然后,我给每个 bin 一个相应的标签名,并创建一个名为“goal_category”的新系列。用于内部验证的随机抽样确认了色谱柱类别的正确分配。我想运行的最后一个检查是检查我的新列中是否有任何丢失的数据,(null 值/NaN)值。我通过在我创建的新系列上直接调用 isna()方法来实现这一点,这确认了没有丢失数据。

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

Random sampling for internal verification confirms that the column categories are correctly assigned

快速小结

本文展示了各种有用的方法及其参数,可以直观地用来研究数据集。有多种方法可以实现每个步骤,但是我经常坚持使用所示的方法来提高可读性。

使用朴素贝叶斯挖掘“81%的‘嫌疑人’被 Met 的警方面部识别技术标记为无辜”

原文:https://towardsdatascience.com/81-of-suspects-flagged-by-met-s-police-facial-recognition-technology-innocent-independent-5d01be43649d?source=collection_archive---------16-----------------------

天空新闻:伦敦

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

Photo by Daniel Lincoln on Unsplash

最近我在我的朴素贝叶斯帖子中写道“人群中疾病的发病率是许多人忽视的关键变量”。

今天在浏览新闻时,我偶然看到了天空新闻的文章,并注意到他们已经落入了这个陷阱。

研究人员发现这个有争议的系统 81%是不准确的

嫌疑人在人群中的出现率是一个关键变量,而天空新闻却忽略了这个变量

这是为什么呢?让我们试着改变人群中嫌疑人的发生率,看看为什么它如此重要。

**System 1**: Randomly tosses a coin to assess guilt, accuses 50%
**System 2**: Error rate of 1 in 1,000**Crowd A**: 32,000 suspects;      0 innocent people
**Crowd B:** 0 suspects; 32,000 innocent people

哪个系统比较好?

**System 1** on **Crowd A** - 16000 suspects;         100% accurate!
**System 2** on **Crowd B** - 32 mistakes;           100% inaccurate!

人群中嫌疑人的发生率有很大的不同。天空新闻忽略了人群组成,只测量准确性,因此通过这种方法系统 1 的硬币投掷获胜。

因此,让我们试着将我之前的朴素贝叶斯文章中的理论引入到这个现实世界的例子中。

首先,我们需要从这句话开始:

他们发现,在 42 个匹配中,只有 8 个被证实是正确的——错误率为 81%。42 人中有 4 人因为被人群吸收,一直没有找到,所以无法验证是否匹配。

数学很简单:

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

但是*“42 人中有 4 人是永远找不到的人”*所以不知道为什么会被统计。我们不知道这四个是不正确的,正确的还是混合的。在我看来,这些例子需要被丢弃,留给我们 38 个匹配中的 8 个或者 79%不正确,但是我离题了。

我们需要关于系统性能的更多细节。在文章中我们可以找到一个警队误差估计为千分之一:

该部队坚称,他们的技术只会在千分之一的情况下出错——但他们使用了不同的测量方法来得出这一结论。

因为他们引用了一个数字。没有出现假阴性/阳性,所以我们假设两者是一样的。根据贝叶斯理论,这些数字是什么?尽管我不同意,我还是会用他们的 19%或 0.19:

TP = True Positive = 0.999
FP = False Negative = 0.001 P(B ∣ A) P(A)
P(A ∣ B) =  ──────────────
                P(B)
A = Suspect
B = Positive Neoface matchP(A ∣ B) = Probability a person is a suspect given a match = 0.19
P(B ∣ A) = Probability of a match given a suspect = TP = 0.999
P(A) = Probability of a person in the crowd being a criminal
P(B) = Probability of a Neoface match = FP × (1-P(A)) + TP × P(A)

插入公式和数值,求解 P(A),用铅笔算出来(绝对不用 Wolfram Alpha )你得到:

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

19/80938

或者说 4000 分之一。这是对随机人群中被通缉嫌疑人数量的合理估计吗?英国的监狱人口是千分之一。这使得警方已知的嫌疑人数量与囚犯数量处于同一数量级,但却少了 4 倍。似乎很合理。

让我们对 32,000 人的人群进行一次健全性检查,我们估计 4000 人中有 1 人是嫌疑人,并且该系统(据称)在检测他们方面有 99.9%的可靠性。所以 8 个嫌疑犯中有 8 个被发现了。它还(声称)在拒绝非嫌疑人方面有 99.9%的可靠性,因此 31,992 个非嫌疑人中的 32 个将被错误地检测到。让我们扩展一下前面的例子:

**System 1**: Randomly tosses a coin to assess guilt, accuses 50%
**System 2**: Error rate of 1 in 1,000**Crowd A**: 32,000 suspects;      0 innocent people
**Crowd B:** 0 suspects; 32,000 innocent people
**Crowd C**:      8 suspects; 31,992 innocent people**System 1** on **Crowd A** - 16000 suspects;         100% accurate!
**System 2** on **Crowd B** - 32 mistakes;            100% inaccurate!
**System 2** on **Crowd C** - 8 suspects, 32 mistakes; 80% inaccurate!

我们兜了一圈,又回到了 80%不准确的头条数字。所以下面的事情可以同时成立:

  1. 该系统的假阴性和假阳性率为 0.1%
  2. 在 32000 人的人群中,40%或 80%的人会被错误标记

如果在随机人群中以 4000 分之一的概率出现嫌疑人,以上两件事都可能成立。

人群中嫌疑人的发生率是一个关键变量

在文章的后面,我们发现了以下内容:

Met 更喜欢通过将成功和不成功的匹配与面部识别系统处理的面部总数进行比较来测量准确性。根据这一指标,错误率仅为 0.1%。

这并不奇怪,也很合理。在伦敦,随机人群中嫌疑人的频率可能极低,因此,即使是高性能的面部检测系统对那些没有受过贝叶斯定理教育的人来说也表现不佳。

自然,机器学习研究人员已经发现了衡量表现的这个问题,并通过混合使用精度、Recall 等人的衡量标准解决了这个问题,但 F1 分数为我们提供了一个很好的单一衡量标准:

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

F1 Score

 2TP                 2 × 0.999
 F1 =  ─────────────  =  ───────────────────────── = 0.999
       2TP + FP + FN     2 × 0.999 + 0.001 + 0.001

最大可能的 F1 分数是 1,因此这是一个高性能的系统,但当试图检测大海捞针或随机人群中的嫌疑人时,您仍然会遇到很多误报。这是一项艰巨的任务。

我看了半打新闻来源,但只发现同样的故事重复,没有关键的分析。

天空新闻 卫报 ABC 新闻 布莱巴特 麻省理工科技评论 镜报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值