TowardsDataScience-博客中文翻译-2020-三-

news/2024/10/15 13:46:12

TowardsDataScience 博客中文翻译 2020(三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

做出更好决策的 3 个要素

原文:https://towardsdatascience.com/3-essentials-to-make-better-decisions-9b2cdc60365e?source=collection_archive---------47-----------------------

数据科学只是其中之一

照片由晨酿在 Unsplash 拍摄

你有没有想过:

  • 谷歌是如何统治 92.1%的搜索引擎市场份额的?
  • 脸书是如何获得社交媒体 74.1%的市场份额的?
  • 微软是如何拿下桌面 OS77.7%的市场份额的?

除了伟大的愿景之外,他们都决定如何做事,引领他们走向成功。谷歌决定专注于其搜索引擎,以提供更好的用户体验,而不是盈利。从早期采用者那里学习,脸书决定计划它的成长,选择它进入的时间,明智地管理它的公共关系。微软决定在构建 Windows 时考虑到兼容性,减少未来的问题,这样他们就可以有更多的创新。

他们都做出了伟大的决定,并赌上了胜利。

作为数据科学领域的一员,数据驱动是必须的。根据数据决定我们的行动是一件很正常的事情。毕竟工作描述里有。然而,我的导师曾经说过,“不仅仅是一个数据科学家”。后来我明白了这意味着什么。不是所有的问题都能用数据解决。也许可以,但这是最好的方法吗?

除了数据科学和分析,还有两个要素可以帮助我们做出更好的决策。找到这三者的平衡很重要,因为我们的决定决定了我们的未来。无论我们是想解决个人问题、制造产品还是创业,我们都必须决定下一步。

看一下这个图表。想象你已经建立了一个创业公司。这些条形代表你每月的产品销售额。

  1. 前 8 根棒线显示稳定增长,这很好。
  2. 你尝试并设法在下个月增长 3 倍。
  3. 你很高兴,但对发生的事情没有绝对的概念。

从我的中等统计截图完美地展示了 3 个要点。图片作者。

通读时请记住这张图表。

分析学

根据剑桥大学的说法,分析是一个过程,在这个过程中,计算机使用数学方法检查信息,以便找到有用的模式。

数据是新的石油。分析通过数据洞察帮助我们实现更好的业务绩效。对分析的需求正在增长,催生了成为 21 世纪最性感工作的数据科学家。如今,大多数组织已经应用描述性、规范性和预测性分析来释放他们的全部潜力。

我自己从事分析工作。我的大部分产出被用来决定战略行动和发现商业问题的答案。此外,它可以将新的机会转化为现实。没有数据,就像没有方向的流浪。

谷歌甚至弄了个首席决策科学家;确保使用数据和分析来推动对其产品的决策——或者他们称之为决策智能。他们投资 it 以换取更好的商业决策。

美容数据是基于事实的。只有用数据才能找到真相。

  • 你的新公司运转良好吗?
  • 我们能降低成本吗?
  • 实施哪种策略更有效?
  • 未来趋势如何?

分析可以回答所有这些问题。

假设您已经使用定量数据来优化流程并推动您的业务战略。你的初创企业在第 8 个月之前一直以恒定的速度增长。但是,就这样吗?难道你不想提高天花板,超越吗?你还能做什么?

直觉

根据剑桥的说法,直觉是一种基于你的感觉而非事实来立即理解或知道某件事的能力。

有多少次你相信自己的直觉并成功了?大概几次吧。直觉只是在你意识到之前突然出现在你的脑海里。如果做对了,这个瞬间的想法可能会让你产生重大影响。

人们梦想去太空,但很少有人认真考虑如何到达那里。埃隆·马斯克决定相信自己的直觉和远见。然后他建立了一个创新,一个还不存在的东西。现在,他已经证明“ SpaceX 可以做它说想做的事情”。

然而,像他这样的直觉是独一无二的。我们其余的人呢?我们无法量化某人直觉的价值,但好消息是:随着时间的推移,每个人都可以通过使用直觉来加强他/她的直觉。

尽管如此,当直觉得到逻辑、推理和数据的验证时,最好还是相信直觉。在工作中,我偶尔会相信自己盲目的直觉,但大多数时候,这种直觉并不奏效。仅凭感觉建立的想法更容易失败。光靠直觉是走不了多远的。毕竟每一段旅程都是马拉松,不是短跑。

第 9 个月,你相信了自己的直觉,实施了一个怪异的策略。下个月你的销售额增长了 3 倍。你很开心。出乎意料。尽管真正的原因仍然是个问题。

研究

根据剑桥大学的说法,研究是对一个主题的详细研究,尤其是为了发现(新的)信息或达成(新的)理解。

分析是定量的。直觉或多或少是个谜。研究以其定性研究填补了这一空白。有了它,我们可以获得超越感觉和数字的更深层次的理解。

在 Interbrand 举办的 2019 年最佳全球品牌评选中,苹果排名第一,三星排名第六。作为一家手机供应商,他们以 30.9%和 24.8%的全球市场份额引领行业发展。但是撇开这个不谈,让我们来看看中国的苹果。

与那些创新并为用户树立标杆的前 2 名不同,小米的做法正好相反。雷军建立了一个生态系统,在这里“粉丝”共同设计并宣传他们的产品。雷认真地考虑了所有的研究和反馈,然后——拿下了在印度的市场份额第一名,把三星甩在了后面。

我们可以在数字上运用逻辑,但在反馈上运用同理心。研究可以通过了解人来回答问题。这与高效能人士的 7 个习惯中的一个习惯非常吻合——“先寻求理解,再寻求被理解”。

当面对涉及几个人的问题时,我会记住这个习惯。理解他们的观点——思考——然后提供解决方案。结果:我们更快地决定了解决方案,没有不必要的争论。如果你是一个数据科学爱好者,可以考虑在这里阅读更多关于其他习惯的文章。

不管你的分析和直觉有多好,人们总是会参与其中。听听他们的声音。

但是要注意,太多没有好的感觉和数据的研究可能会导致错误的决定。一个常见的错误是糟糕的研究抽样:过多地听取少数人的意见,而忽视大多数人。

在第 10 个月的开始,你和你的客户联系并聊天。不是两个而是很多。现在你明白了你突然成长背后的原因——在接下来的一个月里,你轻而易举地创造了新的记录。

恭喜你!✋

找到平衡

我们每天都在做决定。有些好,有些坏。把不好的作为我们的学习曲线,每天争取更好的决策。我们决定成为什么样的人。

"我不是环境的产物,我是我决定的产物."—斯蒂芬·R·科维

总而言之,这三个要素相互联系,相互促进:

1 分析将支持和验证你的直觉&研究。它帮助你更好地维持你的事业,并发挥其最大潜力。即便如此,过分依赖它也不会有什么结果。

2 直觉可以产生巨大的影响,并作为从你的分析研究中提取有价值见解的指南&。相信你的直觉,同时用你的经验来支持它。错误的预感可能会导致失败。

3 研究通过理解问题来丰富直觉&分析。利用定性的洞察力,你可以用多种方式复制你的决定。不过,一定要听听各种各样的人的意见。

记住:重大决策会带来巨大的风险。平衡所有这三个要素,以减轻它,并找到你的下一个最佳行动。

这篇帖子的灵感来自“# first principles Ep06 with拉维梅塔 ”。谢谢分享!🙌

所有市场份额数据均为 2020 年 7 月起最近 1 年的数据,来源于Statcounter Global Stats

Scikit-learn 的 3 个特征选择技术

原文:https://towardsdatascience.com/3-feature-selection-techniques-of-scikit-learn-c9a5f7eb7364?source=collection_archive---------25-----------------------

使用 scikit-learn 增强您的数据预处理步骤。

维多利亚诺·伊斯基耶多在 Unsplash 上的照片

Scikit-learn 是一个广泛使用的 python 机器学习库。它以现成的机器学习算法而闻名。然而,scikit-learn 也为数据预处理提供了许多有用的工具。

数据预处理是机器学习流水线中的一个重要步骤。我们不能只是将原始数据转储到模型中。我们需要清理数据,并应用一些预处理技术,以便能够创建一个健壮而准确的机器学习模型。

特性选择仅仅意味着使用更有价值的特性。这里的价值是信息。就目标变量而言,我们希望使用信息更丰富的特性。在监督学习任务中,我们通常有许多特征(独立变量),其中一些很可能很少或没有关于目标(因变量)的有价值的见解。另一方面,一些特征非常关键,以至于它们解释了目标的大部分变化。特征选择就是寻找那些有价值的特征。特征选择的另一个应用是降维,这意味着通过使用现有特征导出新特征来减少特征的数量。当我们有高维(大量特征)数据时,降维特别有用。

在本帖中,我们将介绍 scikit-learn 提供的 3 种特征选择技术。

1。变化阈值

VarianceThreshold 移除方差小于指定阈值的要素。考虑一个对数据集中的所有观测值(行)采用相同值的要素。它不会给模型增加任何信息能力。使用此功能还会增加不必要的计算负担。因此,我们应该将它从数据集中删除。类似地,方差非常小的特征也可以被省略。

让我们创建三个具有不同方差值的要素。

import numpy as np
import pandas as pdcol_a = pd.Series(np.ones(50))
col_b = pd.Series(np.ones(50))
col_b[:5] = 0
col_c = pd.Series(np.random.randint(20,30, size=50))features = pd.concat([col_a,col_b,col_c], axis=1)

特征的差异:

我们可以创建 VarianceThreshold 的选择器实例,并使用它只选择方差大于 0.1 的要素。

from sklearn.feature_selection import VarianceThresholdselector = VarianceThreshold(threshold=(0.1))
selector.fit_transform(features)

它只选择了预期的 col_c。

2。递归特征消除

顾名思义,递归特征消除(RFE)通过递归消除特征来工作。该消除是基于来自估计器的输出来完成的,该估计器将某种权重分配给特征。例如,权重可以是线性回归的系数或决策树的特征重要性。

该过程从在整个数据集上训练估计器开始。然后,删除最不重要的特征。之后,用剩余的特征训练估计器,并再次修剪最不重要的特征。重复该过程,直到达到期望的特征数量。

让我们使用一个样本房价数据集。在 kaggle 上可以获得数据集。我将只使用其中的一些功能。

df = pd.read_csv("/content/train_houseprices.csv")X = df[['LotArea','YearBuilt','GrLivArea','TotRmsAbvGrd',
'OverallQual','OverallCond','TotalBsmtSF']]y = df['SalePrice']

我们有 7 个特征和一个目标变量。下面这段代码将使用 RFE 来选择最好的 4 个特性。

from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFElr = LinearRegression()
rfe = RFE(estimator=lr, n_features_to_select=4, step=1)
rfe.fit(X, y)

我们使用线性回归作为估计量。所需的特征数量由 n_features_to_select 参数决定。RFE 给每个特征分配一个等级。分配有 1 的功能是选定的功能。

rfe.ranking_
array([4, 1, 2, 1, 1, 1, 3])

3。从模型中选择

与 RFE 一样,SelectFromModel 与具有系数或特征重要性属性的估计器一起使用。根据特征的权重选择更重要的特征。

让我们使用在上一节中使用的相同的特性子集。我们将使用岭回归作为估计量。作为选择特征的阈值,我们使用“均值”关键字。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Ridgeridge = Ridge().fit(X, y)
model = SelectFromModel(ridge, prefit=True, threshold='mean')
X_transformed = model.transform(X)

我们从 7 个功能中选择了 2 个。所选择的特征是“总体相同”和“总体一致”,这是有意义的,因为这些是决定房子价格的关键因素。它们还与使用递归特征消除技术选择的特征相匹配。

在这种情况下,我们可以通过直觉在某种程度上确定重要的特征。然而,现实生活中的案例更加复杂,可能包含许多特征。对于这些情况,特征选择技术很方便。

Scikit-learn 提供了许多特征选择和数据预处理工具。我们已经讨论了其中的三个。您可以随时访问整个范围的文档。

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

3 个免费的应用程序来学习编码和建立你的 MVP

原文:https://towardsdatascience.com/3-free-apps-to-learn-coding-build-your-mvp-ee9f7423f42?source=collection_archive---------43-----------------------

妮可·沃尔夫在 Unsplash 上的照片

学习编码很容易,尤其是如果你使用正确的资源。

这是许多有抱负的企业家都在纠结的问题:他们有一个想法,他们有一个计划,但他们不知道如何将这个想法变成一个 MVP。几乎每隔一天,在 /r/Startups 上,我都会看到有人问社区如何在没有技术知识的情况下创建一个 MVP。在我的回答中,我通常会列出三个选项:

  1. **你可以找到一个技术型的联合创始人,**但是找到合适的人可能会很棘手。一方面,你必须找到一个真正相信愿景和用例的人,这个人应该有很高的适应能力(这样他们就不会一有麻烦就跑了)。另一方面,这个人需要有相关的技能来构建准确的产品或服务。
  2. 你可以外包,但这需要一些前期资金。不是每个人都有。还有,外包有很多细微差别;如果你做得不对,你最终会付出比你预期更多的钱,你的产品甚至可能不工作。通常,激励措施并不一致:外包承包商是按小时计酬的,他们的激励措施是最大化他们的报酬。另一方面,你的动机是得到一个工作产品。此外,没有详细的说明,你可能会得到一个不满意的产品。
  3. 最后,你可以自学编程。这是一个令人惊讶的选择,人们没有考虑,因为非技术型企业家可能会对复杂的编码感到害怕。然而,现实是编码很简单,需要一些实践和熟悉。在我看来,学习编码是最好的选择,因为你将拥有一项在你的创业过程中会派上用场的技能。除了自己编写程序之外,您还将更好地了解未来的工程团队和产品规划,并为产品里程碑或客户约定设定准确的时间表/截止日期。

与普遍的看法相反,学习如何编码并不复杂。对于以前从未接触过代码的人来说,学习在 Python 上构建一个基本的计算器程序可能需要大约 30 分钟。一旦你熟悉了基础知识,你就能构建许多程序了。此外,对于一个 MVP 来说,你不需要任何花哨的东西。如果你有一些有用的东西,可以开始展示给你的第一批用户和投资者,那会很有帮助。无论如何,MVP 很少是最终产品。

我开第一家公司的时候,没有任何编程经验。我通过各种免费工具学习,成功构建了 MVP,并在几个月后开始获得公司的第一批客户。一年过去了,财富 500 强公司都在使用我们公司最新版本的工具。为了可伸缩性、弹性和许多其他特性,该工具的大部分被重新构建和重构,但是一些核心代码仍然使用我最初的 MVP。现在,我使用免费(和付费版本)工具继续自我教育。

我试过很多,下面是我推荐的前三种。前两个,Scrimba 和 Codecademy,有免费和付费课程,但不要误解:免费课程是完整的,独立的课程,给你所有的培训,你需要开始建立程序。他们甚至还附带了练习应用程序,你可以在整个课程中使用。

斯克林巴

  • 免费和高级课程
  • 通过这个免费课程学会了反应

Scrimba 是一个更新的网站,有很多令人惊叹的功能。如果你喜欢听而不是读,那么 Scrimba 是你的正确选择。体验中的声音叠加会让你感觉你的老师就在你身边。最值得注意的是,在教程中,你从听和看你的老师在看似视频的内容中键入代码开始。之后,你可以在同一个屏幕上输入代码,亲自尝试一下。你的老师也会在视频的最后给你留一些挑战来帮助你练习,你也可以随时用他们做的来检查你的工作。虽然 Scrimba 确实有很棒的 Python 课程,但它的大部分课程目前都集中在 JavaScript 上。

代码集

  • 免费和高级课程
  • 通过这个免费课程 我学会了 Python

Codecademy 的 Python 3 课程,第 1 课

Codecademy 是我第一次开始学习编程的地方。如果你更喜欢阅读指南而不是通过视频观看/收听,那么 Codeacademy 非常适合你。阅读的好处是,你可以回过头去重读特定的部分,这比你回过头去看视频的特定部分要容易得多。它类似于 Scrimba,因为它提供了一个文本编辑器,你可以在其中输入代码,程序会检查你输入的代码是否正确。虽然 Codecademy 的免费课程足以让你入门,但如果你想要额外的练习,它的付费选项会很有用。

自由代码营

  • 免费课程
  • 通过这个课程 我学会了 JavaScript

FreeCodeCamp 关于 JavaScript 的课程

顾名思义, FreeCodeCamp 是完全免费的,并且依靠捐款。它注册为非营利组织。但它的目标是让人们获得合适的技能,在大公司找到工作。根据他们的网站,他们已经为超过 40,000 人安排了工作,包括谷歌和微软。经过他们的教训,我不怀疑这一点。课程很全面。用户体验类似于 Codecademy,它提供基于文本的指导。不过,如果你想要视频,FreeCodeCamp 也有一个充满教程的 YouTube 频道。因为你是在 YouTube 上看的,所以你需要自己的应用程序来编写和测试你的代码。

对大多数企业家来说,学习编程是一项无价的技能。它让你具备走出去,从零开始构建自己愿景的技能。此外,你还会学到更多关于工程流程的知识,当你有了团队后,你会成为一个更有效的领导者。有了技术上的理解,你会更好地管理时间和期望,因为你知道发生了什么。

虽然找到一个技术型的联合创始人很好,但找到合适的人可能需要一些时间。对于那些有一些现金的人来说,外包听起来可能是一个诱人的替代选择,但它可能会变得非常混乱,尤其是如果你不太懂编码的话。花一两个星期学习编码将使你获得开始构建自己的 MVP 的基础,并且你不必继续依赖他人。

创业很辛苦。我是来帮忙的——注册我的时事通讯,让我们一起聊天吧!

更好代码的 3 个基础

原文:https://towardsdatascience.com/3-fundamentals-of-better-code-f25421d2a081?source=collection_archive---------46-----------------------

什么使代码对你、你的团队和项目更好?

制造者在 Unsplash 上 NESA 的照片

关于最好的软件工程师(程序员、编码员、开发员,无论你喜欢什么称呼)的真相不是他们写的代码更优化,或者他们解决的问题非常困难。而是他们会考虑他们编写的代码之外的所有其他事情。他们理解协作和知识共享的重要性,他们知道自己会犯错误,他们意识到让自己和同事的生活更轻松的好处。下面是关于编写更好的代码的三个基本原则,集中在这些方面。

人类可读的代码比完美优化的代码更好

首先,我不是说你不应该优化你的代码,或者去寻找一个更有效的实现。我想说的是,你不应该为此牺牲代码的可读性。在软件工程的某些领域,效率是必须不惜一切代价优先考虑的基本驱动需求,但这只是 1%。大多数代码运行在具有足够资源的机器上,并且有足够的时间来执行。但是所有的产品代码都需要维护。有人会在它写了 6 个月之后读它,而且很可能是最初没有写它的人。即使是你写的,很有可能 6 个月后代码看起来像是别人写的,而你对它是如何工作的没有牢固的记忆。这就是为什么人类可读的代码是重中之重。人类可读意味着很多事情,但应该包括:描述性变量、类和方法名;数据处理步骤的逻辑进展;和注释(但是请保持注释随着代码的变化而更新)。通过使代码简洁明了,您降低了将来维护和扩展代码的门槛。相信我,未来的你,还有你的继任者,会感谢你的。

[## 通过我的推荐链接加入媒体-罗伊·赫罗德

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@royherrod/membership)

单元可测试代码是可扩展代码

如果您不能测试您的代码,您就不能有效地扩展它,在它的基础上构建新的特性,或者修复其中的错误。如果编写单元测试因为相互交织的依赖关系而变得困难,那么将来修改代码也会因为同样的原因而变得困难。此外,如果你没有单元测试,你就不会对你所做的任何改变有信心。更重要的是,没有破坏现有的预期功能。单元测试在这里至关重要的原因是,虽然您可能在较大的功能或集成测试中发现错误,但是您将有更大的表面积来调试以找到问题。调试单元测试失败实际上是在您开始之前就指出了少数几行存在问题的代码。

单元测试是基本的需求,除此之外,可能的和合适的可用测试级别因项目和环境而异。有时完整的端到端特性测试是可行的,但有时所需的模拟设置的成本超过了它将捕获的新问题。有时候组件级集成测试是有意义的,有时候除了单独的单元测试和共享契约之外,它们没有增加什么价值。无论你的团队称之为功能测试、特性测试、集成测试,还是其他不同的名称和类型,重要的第一道防线是单元测试。

独立构建的代码尚未准备好投入生产

这同样适用于系统整体和代码。如果它们是由一个单独的开发人员孤立地设计和/或构建的,那么它们就不适合任何有意义规模的生产使用。代码/系统可能会运行得非常好,当然这对于个人项目来说是可以接受的。但是,当你作为团队的一员,在数千或数百万人使用的项目中工作时,仅仅“功能正常”并不是生产就绪的衡量标准。

*那么,孤立地做事情会遗漏什么呢?*至少,外界的观点、经验和问题不会被考虑在内。由此产生的创造不可能让所有利益相关者都满意。允许利益相关者有发言权和输入是很重要的,无论他们是最终产品的客户,负责维护和构建它的开发伙伴,专注于“销售”它的业务或营销人员,还是必须支持、使用或“袖手旁观”创作的任何人。

然而,比这更重要的是,单独的开发人员将是结果的唯一“所有者”,当出现问题时,这是一个真正的问题。当有一个“T0”彩票因素“T1”为 1 时,这对建造它的开发者和其他必须帮助处理它的人来说是不利的。*(附注:我更喜欢彩票因素这个术语,而不是公交车因素,因为同事中了彩票和被公交车撞的形象要好得多。两者本质上都代表了有多少人不再可用会将项目置于危险之中。)*低抽签系数也不利于项目未来改进的速度。让各种各样的人了解某样东西是如何建造的以及它是如何工作的,这意味着他们都可以帮助推动它向前发展,并帮助与他人分享知识。

初学者的 3 个好的 Python 实践

原文:https://towardsdatascience.com/3-good-python-practices-for-beginners-3e747b28f3e5?source=collection_archive---------5-----------------------

Python 初学者

今天就开始编写可重用的代码

杰弗里·F·林在 Unsplash 上的照片

让我们面对现实吧。 编码比较辛苦。 你只想把事情做完,然后收工。但是,如果你很快地编写代码,却没有重构和注释你那勉强可读的意大利面条式代码,它会回来困扰你。或者其他人收拾你的烂摊子。

为了可读性和可重用性,负责任地重构和记录代码是非常重要的。这里有 3 个好的 Python 实践,你应该学会,成为一个更好的程序员。

由共同导师在媒介上形成的迷因

1.文档字符串

Python 文档字符串,又名 docstring ,是由三重双引号 """括起的模块、函数、类或方法定义中的第一条语句。下面是一个函数中 docstring 的最小例子。

def foo():"""This function does nothing."""passprint(foo.__doc__) # This function does nothing.

函数的 docstring 应该包含一个(单行的)简短描述其目的,后面是描述调用函数的约定的段落。有许多不同的风格,但这里有一个我最喜欢的模板:

安妮·斯普拉特在 Unsplash 上拍摄的照片

2.f 弦

您可能习惯于使用%.format()来格式化字符串。

name = 'World'
'Hello %s' % name        # Hello World
'Hello {}'.format(name)  # Hello World

扔掉它们。一旦你需要在更长的字符串中打印多个变量,代码很快就会变得凌乱不堪,可读性更差。无论如何,这些格式化方法并不简单直观

Python f-string 是 Python 3.6 中引入的游戏规则改变者。在字符串内部嵌入表达式,是一种可读性强、优雅的字符串格式化语法。这是通过语法f'{expr}'完成的,其中表达式被 f 字符串中的花括号括起来,在单引号之前的开头有一个f

name = 'World'
print(f'Hello {name}')   # Hello World

您还可以将任何语法上有效的表达式放在花括号内,它工作得很好,您甚至可以在表达式中调用函数!

a = [1,2.2,3]
print(f'Sum of squares of {a} is {sum_of_squares(a)}')
# Sum of squares of [1, 2.2, 3] is 14.84

照片由丹金在 Unsplash 上拍摄

3.命名约定

给事物命名是计算机科学中最难的事情之一。你没有主意了。您不知道如何命名临时中间变量。 你并不孤单。

尽管有这些困难,Python 中有命名约定来“缩小”命名变量的选择范围。它们有助于提高代码的一致性、可读性和可重用性。

所以你不应该再用像ax这样的小写字母来声明所有的变量。如果字母本身没有意义。还有,你要用有意义的、通俗易懂的、易认的词来命名,比如用user_profile代替uspr

这里有 6 个关于命名事物的额外建议:

  1. 出于显而易见的原因,避免使用单个字母命名事物,如OIl
  2. 变量和函数名都应该用小写的
  3. 变量或函数名中的单词应该用一个下划线隔开。
  4. 私有变量(比如在一个类中)可能以一个下划线开始。
  5. 类名中的单词应该连在一起并大写,比如MarioKart
  6. 常量名要用大写,比如GOLDEN_RATIO

这份清单绝非详尽无遗。命名变量可以说是编程中最难学的事情之一。我发现在 GitHub 上看别人的代码,学习他们的命名风格很有好处。

Bekky Bekks 在 Unsplash 上拍摄的照片

相关文章

感谢您的阅读!你觉得这些 Python 实践有用吗?下面留言评论!你可以查看官方风格指南了解更多 Python 约定。

你也可以注册我的时事通讯来接收我的新文章的更新。如果您对提高 Python 技能感兴趣,以下文章可能会有所帮助:

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性

请做好准备,因为 Python 2 不再受支持

towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc) [## Python 初学者应该避免的 4 个常见错误

我很艰难地学会了,但你不需要

towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)

最初发表于edenau . github . io

数据科学家的 3 大设计模式

原文:https://towardsdatascience.com/3-great-design-patterns-for-data-science-workflows-d3bf162d74e6?source=collection_archive---------15-----------------------

想学习如何写出更好的数据科学代码?使用设计模式编写干净、可维护、可测试的代码。

介绍

当作为数据科学家编写代码时,您的目标通常是快速编写代码,这样您就可以在走得太远之前检查某个东西是否是个好主意。没有人喜欢在一个项目上工作了几个月却发现它是垃圾。

因此,在构建原型时,您要尽可能快地编写代码。但是,当您的刚刚开始工作的代码不再有效,并且您的代码需要更加健壮和可维护时,会发生什么呢?这就是设计模式派上用场的地方。

由里奇·弗罗斯特创造的迷因,使用的迷因

什么是设计模式?

简单来说,设计模式是编写软件时常见问题的常见解决方案。它们之所以如此伟大,是因为它们如此普遍适用,但你必须知道如何应用它们。你可以在这里更深入地了解一些常见的设计模式。

为什么要使用设计模式?

我能想到一些我喜欢使用它们的原因。

  • 编码时减少认知负荷
  • 花更少的时间调试
  • 代码更容易测试
  • 更容易构建可重用的工具

因此,事不宜迟,让我们来了解一下数据科学工作流的 3 种优秀设计模式。

1.构建器模式

这是什么?

构建器模式是一种创建复杂对象的灵活方式,尤其是当这些对象有很多相似之处但有很多可选参数时。构建器模式将对象构造逻辑从对象本身中取出,并动态地为对象创建相关属性——通常使用方法链接技术。启用方法链接的关键是从用于构建所需对象的方法中返回对象本身,以便链接的方法可以修改同一个对象。

示例:生成 SQL 查询

我每天都写大量的 SQL 查询,并且发现我的大多数查询在结构上有很多相似之处。然而,手工编写它们是一个非常容易出错的过程,并且会产生大量重复的代码。因此,我使用 builder 模式为自己生成查询,而不是编写许多单独的查询。当我用嵌套的 select 语句和多个连接编写大型的、令人讨厌的查询时,这也很方便,在手工编写查询时,很容易迷失方向并出错。更不用说这种方法很容易测试,而手工编写 SQL 查询更难测试!

让我们编写一个简单的查询构建器来说明这个模式是如何有用的。

我首先用我将从中选择元组的基表初始化构建器。然后,我可以根据需要添加要选择的列、“group by”子句、连接和“where”子句。对于一个简单的“SELECT * FROM foo”类型的查询来说,这是多余的,但是这些构建块使得构建越来越复杂的查询变得更加容易。

下面是一个使用 builder 模式制作简单 SQL 查询生成器的示例:

使用构建器模式生成 SQL 查询

2.依赖注入

这是什么?

最简单的形式是,依赖注入就是将依赖的东西作为参数插入。不知道用哪个数据库类?你的函数不需要知道数据库类是如何工作的,只要知道就行了。将数据库类实例作为参数传入使得维护更容易——您可以使用遵循相同接口的任何类型的数据库类。

如果不使用依赖注入,您将很难维护像数据库类这样的关键基础设施。

使用依赖注入的另一个好处是你的代码更容易编写测试。例如,只需编写一个模拟类(即模拟数据库类)并在测试中使用它,而不必使用运行 HTTP 请求和降低测试速度的代码。

示例:数据库类

我的团队使用 SQL Server 和 Cosmos DB,以及其他数据源。将数据库类作为参数传入,可以很容易地将不同的数据库换成不同的想法,并使编写可测试的代码变得容易得多,因为数据库类很容易被模仿。

下面是一个使用依赖注入的简单例子:

使用依赖注入模式从数据库获取数据

3.装饰图案

这是什么?

当您想在函数之前和/或之后做一些事情,但不想修改函数本身时,装饰器模式非常有用。本质上,你所做的是在函数运行前捕捉一些状态,然后在函数运行后捕捉一些状态。当你有几十个函数需要以同样的方式修改,但又无力单独修改时,这一点就变得非常明显了。

示例:日志记录函数元数据

我发现有用的东西是函数运行多长时间,函数的名称,以及有时关于输出的不同特性。幸运的是,Python 函数是对象,所以您可以对这种模式使用' @ '修饰语法。您需要做的就是创建一个包装内部函数的函数,然后将@my_decorator_name decorator 放在您想要装饰的函数之前。

看例子比用通俗易懂的英语解释容易:)

我不会深入探究装饰者如何在 Python 中工作,但是 RealPython 有一篇很棒的文章,我强烈推荐作为入门读物。

重用依赖注入示例中的一些代码,我们可以计算数据库事务需要多长时间:

使用装饰模式来计时函数

把它放在一起

设计模式产生了非常可重用的代码,您可以像构建模块一样将各个部分组合在一起,使您作为数据科学家的工作变得容易得多。例如,我经常将这三种模式结合起来编写数据库查询,并查看查询需要多长时间,以便知道是否需要优化。

结论

在本文中,我展示了作为数据科学家使用设计模式的三种方法,以获得更健壮、可维护的代码。当您在数据科学中使用设计模式时,您的代码质量会提高,您的维护会更容易,您的结果也更容易重现和共享。

如何在数据科学项目中身兼数职

原文:https://towardsdatascience.com/3-hats-to-wear-for-a-data-science-project-443c877b03f0?source=collection_archive---------48-----------------------

工程师、科学家和销售主管。图片由 GraphicMama-team 、 Clker-Free-Vector-Images 、 isuru prabath 来自 CC0 的 Pixabay

除了 Kaggle 竞赛之外,数据科学项目还需要什么?

如何通过戴上三顶帽子(工程师帽、数据科学家帽和售前顾问帽)来实现小规模数据科学项目的不同视角。

您加入了一个新团队,该团队为数据科学家创造了一个新角色,因为他们有一些令人兴奋的问题需要解决。你是一个单人数据科学团队,很高兴接受这一挑战。由于你正在努力使这个项目有一个良好的开端,

我在问你(作为你的祝福者):“为了让这个项目成功,除了 Kaggle 竞赛之外,你还需要什么?”

你可能会说:“C 计算能力、需求收集、软件工程原则、领域专业知识等等

我说:“精彩!你有没有一本关于如何有效地做到这些的剧本?”

我相信,即使你是一个人的数据科学团队,你也可以通过身兼工程师、科学家和售前顾问的多重角色,仔细平衡三个不同的角度,为项目创造更好的结果。在这篇文章中,我想阐述三个主要观点。

  • 在数据科学项目中,身兼工程师、科学家和售前顾问三职时需要考虑什么?
  • 戴着工程师、科学家和售前顾问的帽子,如果没有任何约束,你可以追求什么。
  • 设计中这三个视角之间如何产生张力,以及如何平衡这三个视角的建议。

让我们从这三个角度来探讨这些想法。

1.帽子# 1:工程师

像伟大的工程师一样做机器学习,而不是像伟大的机器学习专家一样——ML 规则来自 Google

图片来自 Pixabay 的 GraphicMama-team

成为一名伟大的工程师意味着什么?一个伟大的工程师会产生可靠的设计,同时确保工作是可复制的、可重复的和高质量的。

关于如何有效地戴上工程师的帽子,我们可以看看 A-Team,这个来自谷歌的团队阐明了理想的机器学习生产系统的规则。本文引入了 ML 测试分数的概念,其中 是评估您在数据科学项目中如何戴上工程帽子的一个极好的衡量标准。本文件描述了以下类别中需要考虑的各个方面(高度概括)

  1. 对特征和数据的测试,例如每个特征的分布、特征和目标之间的关系以及单个特征的成对相关性。
  2. 模型开发的测试,例如作为基线的简单模型的测试,对重要数据切片的模型质量的测试,以及对模型的隐含偏差的测试。
  3. 对模型基础设施的测试,例如训练的再现性,以及对 ML 管道的集成测试。
  4. 用于监控 ML 的测试,例如特征中的上游不稳定性、训练和服务中的数据分布变化。

对于以上每一点,都有各种场景需要考虑。对于每个场景,如果您已经执行了手动测试,记录并发布了结果,您将得到 1 分。如果你有自动运行测试的系统,你就得到了第二点。 ML 测试分数 是每一节中的最小值的总和。

虽然我们现在知道我们需要朝着什么方向努力,但要达到这个目标,我们需要基本的基础。所以,让我们从一些软件工程的最佳实践开始,然后慢慢地向上达到 Google 的 ML 测试分数。

以下是一些关于如何从基础开始有效佩戴工程师帽的指南:

  1. 采用在 GIT 中提交所有增量变更的最佳实践。
  2. 通过编写环境细节的脚本并对其进行版本控制,采用将环境与代码分离的最佳实践。
  3. 通过将配置细节分离到一个设置文件中,采用从代码中分离配置的最佳实践。它将简化部署。
  4. 通过记录实验特征、条件和结果,让事情变得简单。我已经使用了 MLFlow 进行跟踪,我发现它减轻了跟踪迭代的痛苦。
  5. 小规模项目的目标是 ML 测试分数至少为 5 分。

如果你拥有世界上所有的资源,戴着工程师的帽子你能渴望得到什么?。

使用 Google 论文中的框架,获得 12+的 ML 测试分数表明自动化测试和监控的卓越水平。这将是你戴着工程师帽时的终极目标。

2.帽子# 2:科学家

图片来自 CC0 pix abay 的Clker-Free-Vector-Images

科学家帽是为你试图解决的问题提供最佳模型的帽子。科学家知道对于类似的研究问题和有条不紊的实验来说什么是最好的结果

科学家唯一的使命:尽可能好的模型。

没有免费的午餐定理表明,没有一个模型是所有问题的最佳解决方案。您的数据集分布是独一无二的。你的问题空间是独特的。作为一名科学家,你在不断地实验,以改进之前的迭代。

了解你的技术水平(SOTA)

作为一名科学家,你会在相似的数据集上遇到相似问题的当前研究。随着越来越多的研究人员公开他们的 GitHub 库,通过网站查看代码变得更加容易。几个领域也有研究人员公开跟踪最新成果。例如,对于自然语言处理, Sebastian Ruder 维护着各种自然语言处理问题和数据集的所有最新成果的列表。

如果你有必要的技能、足够的时间和培训资源,戴着科学家的帽子你能渴望什么?

作为一名科学家,你会渴望超越最先进的技术。也许,你会梦想发现一项新技术。说起来容易做起来难,哈!

3.帽子# 3:售前顾问

图片来自 CC0 的pix abayISU ru pra bath

假设您是一家价值数百万美元的软件供应商的售前顾问。你的主要角色是向公司客户销售你的软件产品。你会根据顾客的需求和要求来调整你的陈述吗?当然,你会的。如果你在 A-league,你将超越客户正在寻求解决的当前问题,真正理解客户的目标。然后,你将描绘出你的软件产品将如何帮助公司客户解决手头的问题并实现客户更广泛的目标的完美画面。

现在,让我们过渡到现实。您不再是在销售周期结束时与首席执行官会面并获得巨额奖金的售前顾问。您是一位优秀的数据科学家,与运营团队密切合作。来戴上您的售前帽子吧!

a)售前顾问任务#1:销售产品

你需要推销你的项目如何解决客户的问题,你需要和客户一起踏上探索之旅。这里有一些问题让你开始。

  • 对利益相关者来说,成功是什么样的?利益相关者的未来是什么样的?
  • 我们正在解决的问题的影响是什么?
  • 理解我们正确解决问题的关键指标是什么?
  • 问题是否有可能自行消失(有时,我们可能正在解决系统约束,但是系统约束将会消失,因为我们正在替换系统)

在与客户的梦想阶段结束时,您的售前顾问需要提出一个计划。该计划需要有一个快速的途径来获得一个最小可行的产品,该产品将验证解决方案的可行性。它还需要关注迭代方面,这是解决方案的下一级调整。

b)售前顾问任务#2:建立信任

信任等于长期的一致性。两者都没有捷径可走。

杰夫·韦纳,领英

作为售前顾问,您的第二个也是更重要的任务是建立信任。当然,为了长期持续地交付,你需要最好的科学家和最好的工程师。能够听取客户的反馈,解决反馈,并衡量您的机器学习解决方案的执行情况将大有裨益。

如果您拥有必要的技能、足够的时间和培训资源,您对售前人员有什么期望?

一种机器学习解决方案,受到客户的信任,并已证明其有效。

这三种不同的观点之间会有张力吗?

100%.嗯,科学家想永远实验,以提高模型的准确性。工程师希望确保我们构建可伸缩性,自动检查一切,并避免任何技术债务。售前顾问希望向客户展示最好的结果,这是昨天就需要的。问题是,只有一两个人承担所有的角色。所以,平衡之举来了。

那么,它将如何工作呢?这三种观点能友好共存吗? 明确,通过在项目 的不同时间给予不同的视角以关注和优先权。

根据我有限的经验,这里有一个关于如何组织它的建议。(你可以把这当作一个起点,然后即兴创作。)

  • 在项目开始的时候,你戴上了售前顾问和工程师的帽子。这有助于理解您正在解决的问题,并为成功奠定工程基础。
  • 然后,你继续成为实验模式(Kaggle 模式)中的科学家,同时不断与客户沟通,建立信任并展示进展。
  • 然后,一旦你有了一个合理的工作原型,你就戴上了工程师即兴 MLTest 分数和科学家即兴模型的帽子。
  • 您的工程师负责部署,售前顾问则滔滔不绝地谈论新产品。

这是一个敏捷方式下的大概情况

图片作者(请点击图片放大)**

在上图中,Sprint 2 到 Sprint 4 以及后续 Sprint 的部分可能在 Kaggle 竞争的领域中。

如果您是一个试图交付数据科学项目的小团队,戴上这三顶帽子可能会变得必不可少。如果你是一个大规模的团队,它可能与你无关,因为你可能有不同的团队来执行这些观点。在这种情况下,这篇文章可能会帮助你从另一个角度更好地理解其他角色。祝你在下一个项目中成功,同时扮演工程师、科学家和售前顾问三个角色。如果你已经采用了这种方法的变体,请分享你对什么对你有效以及你如何克服挑战的想法。

参考资料:

[1]马丁·津克维奇,ML 规则https://developers . Google . com/machine-learning/guides/Rules-of-ML

[2]埃里克·布雷克,山青·蔡,埃里克·尼尔森,迈克尔·萨利布,D·斯卡利,你的 ML 测试分数是多少?ML 生产系统的规则

https://storage . Google APIs . com/pub-tools-public-publication-data/pdf/45742 . pdf

您应该知道的 3 个高可用性云概念

原文:https://towardsdatascience.com/3-high-availability-cloud-concepts-you-should-know-93f3bab2cb4a?source=collection_archive---------17-----------------------

从扩展到虚拟机放置策略

Josep Castells 在 Unsplash 上拍摄的照片

拥有一个公开可用的解决方案通常意味着你需要在某个地方部署并保持它的工作。如今“某处”经常是云环境。这是一个灵活的解决方案,您可以从小规模开始,随着业务的增长而增加容量。然而,不管您拥有什么样的系统,您都需要使它高度可用,以便用户可以依赖它。

云环境使得构建可靠的系统成为可能,但这并不意味着云本身不会出现故障。事情不是这样的。您需要意识到并让您的系统准备好处理故障,而不是相信您使用的所有云组件总是可用的。

让我们来了解一下对于提高系统可用性至关重要的主要云概念。

缩放比例

垂直与水平缩放(图片由作者提供,使用 Pixabay 上 1117826 的监视器图片)。

让您的系统为不断变化的负载做好准备并保持所需的最小容量是确保高可用性的一种方式。当你开始小的时候,大的负载不是问题,但是,使用云机制比如 scale sets 仍然是一个好主意。他们可以保持系统需要启动的最少数量的虚拟机。如果出现意外事件,比如机器停机,那么 scale set 规则应该会为您创建一个新的实例。有两种主要的缩放方式,水平缩放和垂直缩放。

水平扩展意味着向堆栈中添加或移除相同类型的实例(如虚拟机实例或运行应用程序的容器)。就其使用的资源而言,新实例与其他实例相同,并且能够处理负载。也称为向外扩展(增加实例数量)和向内扩展(减少实例数量)。要水平扩展,您的系统需要为此做好准备,并且每个实例都必须能够独立工作。当需要某种同步时,这在有状态系统的情况下尤其重要。

垂直扩展是在您增加一个实例的资源时完成的。您可以添加更多的 RAM、CPU、GPU、磁盘空间或任何其他资源。就像让你的机器变得更强大,这一点在本节开头的图片中有很好的描述。垂直扩展也称为向上扩展(添加资源)或向下扩展(移除资源)。这种扩展的主要缺点是,有时需要停止一个实例,添加资源,然后重新启动。它会引起混乱。使用水平缩放时,情况并非如此。

扩展您的系统不是一件容易的事情。如果负载波动很大,可能很难找到保持低成本并为高需求做好准备的方法。通常,您可以使用系统的不同指标来构建缩放规则。CPU 利用率、内存量或磁盘空间是这些指标的一些示例。您还可以考虑使用诸如到达系统的请求数量、队列容量(如果使用的话)或任何与负载变化相关的特定信息等指标。对于更复杂的情况,甚至有机器学习算法帮助找到最佳的缩放规则。

多区域部署

基本云单位(图片由作者使用 camelia_sasquana 在 Pixabay 上的云图制作)。

在云环境中,系统部署在称为区域的单元中。区域是一个或一组彼此靠近的数据中心。区域内部还有一个更细粒度的单元,称为可用性区域。每个可用性分区是一个区域内的单个数据中心。

区域和可用性区域都很好地服务于系统的可用性。此外,当您在西欧和美国东部等不同地区部署该系统时,用户可以受益于更低的延迟,因为他们将连接到最近的实例。

将您的系统部署在不同的区域和/或不同的可用性区域中,可以使其更好地抵御区域故障。它只是给你的架构增加了更多的冗余。当你使用的云服务在你所在的地区出现故障时,你仍然有另一个运行良好的地区。这是多区域部署背后的主要思想。

有时整个地区或几个地区可能会下降,这种情况很少见,但也有可能发生。在这种情况下,如果你使用一个云提供商,你不能做太多。另一方面,使用多个提供商和多个地区是很昂贵的,所以你需要计算什么是最适合你的选择。

在不同的云环境中有多少区域可用?再来看看 Azure 和 AWS。

在 Azure [1]中有:

  • 51 个地区
  • 至少有 3 个可用区域的 12 个区域

在 AWS [2]中,您可以使用:

  • 25 个地区
  • 72 个可用区域
  • 除大阪外,每个地区至少有 2 个可用区

如你所见,这些供应商选择了不同的策略。微软将区域和可用性区域作为扩展,而亚马逊选择为每个区域配备可用性区域,但区域较少。无论您选择哪种解决方案,它都将符合您的高可用性要求。

比例集 vs 可用区域 vs 区域(图片由作者提供,使用图片由 camelia_sasquana 、 1117826 、openclipbart-Vectorsonpix abay)。

如果你决定采用多区域策略,你需要考虑你的架构是否适合它。假设您有一个可以部署在多个地区的系统,每个部署都可以独立工作。在这种情况下,没有问题,您可以选择适合您的用户需求的任何地区或可用区域。

但是,如果您的系统具有需要相互通信并通过网络发送大量数据的组件,多区域部署可能会损害其性能。在图中,您可以看到可用性和延迟之间的权衡。

如果您选择只有一个区域,一个可用性区域,您的实例将在一个数据中心。它会降低可用性,因为如果数据中心停机,系统也会停机。但是,系统组件将彼此靠近放置,因此它将具有最低的延迟。

如果您选择在一个区域内的许多可用性区域中部署系统,那么您将把实例分散到不同的数据中心。它将增加您系统的理论可用性。您会增加一些延迟,但是,可用性区域是通过快速光纤网络连接的,所以应该不会太差。

最后,如果您进行多区域部署,您的组件将在很远的距离之间进行通信。它具有最高的可用性,因为各地区相距遥远,自然灾害不应影响多个地区。但是区域之间的延迟将比其他情况高得多。

虚拟机放置策略

AWS 虚拟机放置组(图片由作者使用服务器图片由 Clker-Free-Vector-Images 在 Pixabay 上制作)。

无论您选择哪种策略,最终都会在一个数据中心内至少有一个部署。这就是为什么了解故障域和更新域很重要。

实例可以位于相同或不同的故障域。一个故障域基本上是一个带电源的机架。如果故障域停止运行,机架中的所有实例也会停止运行。您可以检查在您选择的区域中有多少个可用的故障域。

更新域的工作方式与故障域相同,但当云提供商引入更改(如修补操作系统)或需要运行一些维护操作时,它们会有所帮助。如果实例分布在不同的更新域中,您可以确保在维护期间只有一部分实例(在一个更新域中)不可用。

在 AWS 中,您还可以定义虚拟机放置组。他们有三种类型。集群类型将实例放在一个机架上。Partition 使您能够创建一个逻辑分区,并决定哪个实例去哪个分区。最后,spread(默认)试图尽可能多地调度实例,这样它们就不太容易受到中断的影响。

我为什么要在乎?

好吧,但是为什么我需要理解和照顾它?我只是一个云用户,我为服务付费,我想让它工作。正如我之前所写的,使用云并不意味着你可以忽略它是如何工作的。您负责系统的架构并使其高度可用。

我们用一个例子来描述一下。在我们的理论系统中,我们有一个 Apache Zookeeper 集群[1]。这是一个支持分布式系统协调的工具。它有助于分布式配置和状态。

动物园管理员需要在法定人数内工作。非常特别的法定人数。基本上你需要有 2N + 1 个动物园管理员。n 是自然数。最小的高可用性设置包含三个动物园管理员。一个宕机,群集可以正常工作,但是,如果两个宕机,整个群集都会宕机。假设您不太在意,并且在具有两个故障域(机架)的数据中心中部署了您的动物园管理员。动物园管理员会这样传播:

动物园管理员分布在两个故障域(图片由作者提供,使用 Apache Zookeeper 徽标)。

现在,当其中一个机架损坏时,您的群集有 50%的几率会停机。因此,您的系统并不真正具有高可用性,一次故障就会导致系统停机:

有两个动物园管理员的机架下降(图片由作者提供,使用 Apache Zookeeper 徽标)。

好吧,也许我们可以衡量动物园管理员?让我们假设 N = 2,在这样的设置中,两个动物园管理员可以毫无问题地倒下:

5 个实例的 Zookeepers 集群(图片由作者提供,使用 Apache Zookeeper 徽标)。

但是,请稍等,如果您只有两个机架,它们可以像这样展开(最佳情况):

三个动物园管理员的架子放下来了(图片由作者提供,使用阿帕奇动物园管理员标志)。

如你所见,这没有多大帮助。你的集群就像三个动物园管理员一样脆弱。这说明了为什么理解幕后发生的事情很重要。

准备好!

我们讨论了三个基本但有用的概念,它们有助于使您的系统高度可用。将它们与设计良好的体系结构一起实现将提高服务的可用性,并使它们为意外但可能发生的事件做好准备。相信我,如果你使用云,你迟早会体验到。

参考书目:

  1. https://azure . Microsoft . com/en-us/global-infra structure/geographies/
  2. https://AWS . Amazon . com/about-AWS/global-infra structure/regions _ az/
  3. https://zookeeper.apache.org/

3 熊猫高度实用的操作

原文:https://towardsdatascience.com/3-highly-practical-operations-of-pandas-61d86ca09979?source=collection_archive---------78-----------------------

Sample,其中,isin 用例子详细解释。

张家瑜在 Unsplash 上拍照

Pandas 是一个非常强大和通用的 Python 数据分析库,它加速了数据科学项目的预处理步骤。它提供了许多在数据分析中非常有用的函数和方法。

在这篇文章中,我的目标是涵盖一些我经常使用的非常方便的操作。本帖将涉及的主题有:

  • 样品
  • 其中
  • Isin

样品

样本方法允许您从系列数据帧中随机选择数值。当我们想从分布中选择一个随机样本时,这是很有用的。假设我们有一个随机变量,它的值存储在数据帧的序列或列中。我们可以使用 loc 或 iloc 方法选择它的一部分,但我们需要指定索引或选择范围。但是,使用样本方法,我们可以随机选择值。在开始举例之前,我们先导入 numpy 和 pandas:

import numpy as np
import pandas as pd

让我们创建一个具有 3 列和 10000 行的数据帧:

col_a = np.random.random(10000)
col_b = np.random.randint(50, size=10000)
col_c = np.random.randn(10000)df = pd.DataFrame({'col_a':col_a,'col_b':col_b,'col_c':col_c
})print(df.shape)
(10000, 3)df.head()

我们可以从任何列中选择 n 个值:

sample1 = df.col_a.sample(n=5)sample1
3309    0.049868
7856    0.121563
3012    0.073021
9660    0.436145
8782    0.343959
Name: col_a, dtype: float64

sample() 返回值和索引。我们用 n 参数指定值的数量,但是我们也可以将一个比率传递给 frac 参数。例如,0.0005 将返回一行中 10000 个值中的 5 个:

sample2 = df.col_c.sample(frac=0.0005)sample2
8955    1.774066
8619   -0.218752
8612    0.170621
9523   -1.518800
597     1.151987
Name: col_c, dtype: float64

默认情况下,采样在完成,无需更换。因此,每个值只能选择一次。我们可以通过将替换参数设置为真来改变这种选择方式。则可以多次选择这些值。请注意,这并不意味着样本一定会多次包含一个值。它可能选择相同的值,也可能不选择相同的值。

sample3 = df.col_c.sample(n=5, replace=True)sample3
3775    0.898356
761    -0.758081
522    -0.221239
6586   -1.404669
5940    0.053480
Name: col_c, dtype: float64

默认情况下,每个值被选中的概率相同。在某些情况下,我们可能希望从一个系列或数据帧的特定部分中随机选择。例如,我们可能希望跳过前 9000 行,并希望从剩余的 1000 行中随机选择。为此,我们可以使用权重参数。

我们给每个数据点分配权重,表示被选中的概率。权重之和必须为 1。

weights = np.zeros(10000)
weights[9000:] = 0.0001sample4 = df.col_c.sample(n=5, weights=weights)sample4
9232   -0.429183
9556   -1.282052
9388   -1.041973
9868   -1.809887
9032   -0.330297
Name: col_c, dtype: float64

我们将第一个 9000 的权重设置为零,因此结果样本只包括索引 9000 之后的值。

为了获得可再现的样本,我们可以使用 random_state 参数。如果将整数值传递给 random_state,则每次运行代码时都会产生相同的样本。

sample6 = df.col_b.sample(n=5, random_state=1)sample6
9953    31
3850    47
4962    35
3886    16
5437    23
Name: col_b, dtype: int32

我们也可以通过将轴参数设置为 1 来随机选择一列。

sample5 = df.sample(n=1, axis=1)sample5[:5]

哪里

“Where”用于根据条件替换行或列中的值。默认的替换值是 NaN,但是我们也可以指定替换值。让我们复习一个例子,这样就清楚了。

让我们首先创建一个示例数据帧:

df2 = pd.DataFrame({'A':[0,0,1,2,4,3,5,8],'B':[-1,3,4,-2,2,-4,6,5],'C':[9,11,13,5,8,9,11,19]
})df2

考虑这样一种情况,我们需要用 0 替换负值。我们不用遍历 if 语句和 for 循环,而是使用 where 轻松实现这一点:

df2.where(df2 > 0, 0)

“where”的工作方式是选择符合条件的值,并用指定的值替换剩余的值。其中(df2 > 0,0) 选择所有大于 0 的值,其余值替换为 0。因此,where 也可以被认为是一个掩码操作。

让我们再看一个例子。我们希望保持负值不变,但将正值转换为负值(即 2 替换为-2):

df2.where(df2 < 0, -df2)

为了保存原始数据帧中的更改,我们需要将 inplace 参数设置为 True。

重要的一点是,熊猫和熊猫的“T10”和“T11”并不完全相同。我们可以获得相同的结果,但语法略有不同。使用 DataFrame.where ,选择符合条件的值作为,其他值替换为指定值。 Np.where 还要求指定符合条件的值。以下两行返回相同的结果:

df2['B'].where(df2['B'] < 0, 0)np.where(df2['B'] < 0, df2['B'], 0)

因此,numpy 版本更加灵活。我们也可以改变符合条件的值。例如,我们可能希望将负值乘以 2:

np.where(df2['B'] < 0, df2['B']*2 , 0)

isin

在处理数据帧时,我们经常使用过滤或选择方法。我们可以像使用 where 那样基于条件进行过滤,或者使用行或列索引选择数据帧的一部分。Isin 方法是一种先进的滤波方法。例如,我们可以选择符合一系列条件的值。

让我们为“isin”示例创建一个不同的数据帧:

df3 = pd.DataFrame({'A':[7,4,1,2,4,3,5,8],'B':['cat','cat','dog','bird','bird','cat','dog','chicken'],'C':['brown','black','black','yellow','green','brown','white','brown']
})df3

我们可以使用简单的掩码操作设置一个条件:

isin 允许在一个列表中设置多个条件:

我们还可以在 isin 中使用波浪号(~)运算符。然后返回不符合条件的值:

我们还可以将一个过滤器以字典的形式传递给 isin。将基于以下条件返回布尔值:

values = {'B':['cat','dog'], 'C':['brown','black']}df3.isin(values)

我认为熊猫的成功和流行来自于其多功能、强大且易于使用的操作和分析数据的功能。和熊猫一起完成一项任务几乎总是有多种方式。由于花在数据科学项目上的大部分时间都花在了数据清理和预处理步骤上,Pandas 是您武库中的宝贵资产。

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

Pandas 的 Merge 和 Concat 功能之间的 3 个主要区别

原文:https://towardsdatascience.com/3-key-differences-between-merge-and-concat-functions-of-pandas-ab2bab224b59?source=collection_archive---------6-----------------------

何时以及如何使用它。

安德烈·亨特在 Unsplash 上的照片

Pandas 是一个高效且广泛使用的数据分析工具。Pandas 的核心数据结构是 dataframe,它用带有标签的行和列的表格形式表示数据。DataFrame 有许多强大而灵活的功能和方法,可以简化和加快数据清理和分析过程。

数据科学项目通常需要我们从不同的来源收集数据。因此,作为数据准备的一部分,我们可能需要组合数据框架。 concatmerge 功能都用于合并数据帧。在这篇文章中,我将解释它们之间的 3 个主要区别。

1。结合的方式

Concat 函数沿行或列连接数据帧。我们可以把它想象成多个数据帧的叠加。

合并根据共享列中的值合并数据帧。与 concat 函数相比,Merge 函数提供了更大的灵活性,因为它允许基于条件的组合。

假设您有一个包含信用卡交易的数据集。您有一组关于交易细节的列和一个指示客户 ID 的列。另一个数据帧包括关于客户和客户 ID 的更详细的信息。为了组合这两个数据框架,我们可以在“客户 ID”列上合并它们,以便条目匹配。我们使用 concat 的一个例子是合并包含 2019 年和 2020 年信用卡交易的数据帧。我们可以用 concat 函数把它们堆叠起来。

2。轴参数

只有 concat 函数有轴参数。Merge 用于根据共享列中的值并排组合数据帧,因此不需要轴参数。

根据 axis 参数的值,我们可以将数据帧按行(上下重叠)或列(并排)连接起来。axis 参数的默认值为 0,表示沿行组合。

我们来做几个例子。

import numpy as np
import pandas as pddf1 = pd.DataFrame({
'A':[1,2,3,4],
'B':[True,False,True,True],
'C':['C1','C2','C3','C4']
})df2 = pd.DataFrame({
'A':[5,7,8,5],
'B':[False,False,True,False],
'C':['C1','C3','C5','C8']
})

轴=0:

轴=1:

3。加入 vs 如何加入

Join 是 concat 函数的参数,how 是 merge 函数的参数。他们的目标是一样的,但是他们工作的方式有点不同。

Join 指定在数据帧具有不同索引的情况下如何处理索引。让我们用不同的索引创建前面的数据帧。

df2 = pd.DataFrame({
'A':[5,7,8,5],
'B':[False,False,True,False],
'C':['C1','C3','C5','C8']},
index=[2,3,4,5]
)

我们只是通过将索引值传递给 index 参数来更改第二个数据帧的索引。

Join 参数取两个值,

  • 外部:取所有索引( join 参数的默认值)
  • 内部:仅采用共享索引

我们获取所有索引,但是第二个数据帧没有索引为 0 和 1 的行。因此,第二个数据帧中的值用 NaN(缺省缺失值标记)填充。类似地,第一个数据帧中的行 4 和行 5 被填充 NaN 值。

如果我们将 join 设置为 inner ,那么只有存在于两个数据帧中的索引才会显示出来。因此,我们不会因为连接而丢失任何值。

合并功能的参数的工作方式类似。如何的可能值为

  • inner:只有在参数指定的列中有相同值的行( how 参数的默认值)
  • 外部:所有行
  • 左侧:左侧数据帧中的所有行
  • 右侧:右侧数据帧中的所有行

下面的数字更清楚地代表了参数的概念。

在做一些例子之前,让我们先回忆一下我们的数据框架。

我们将在列‘C’上合并 df1 和 df1

df1 和 df1 在列 C 中的值都是 C1 和 C3,因此当 how 设置为“inner”时,只有这些值才会显示。

外面怎么样?

当选择 outer 作为 how 参数时,合并的数据帧包括列“C”的所有值。公共值不重复,df1 或 df2 中不存在的值用 NaN 填充。

当选择 left 作为 how 参数时,合并的数据帧包括左侧数据帧中的所有行。如果列“C”(传递给 on 参数的列)中的值不在右数据帧中,则来自右数据帧的列将填充 NaN 值。选项很少使用,因为我们可以只改变 merge 函数中 dataframe 的顺序(而不是(df1,df2)使用(df2,df1))。

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

机器学习课程的 3 个关键要点

原文:https://towardsdatascience.com/3-key-takeaways-from-a-machine-learning-course-4a36030960d5?source=collection_archive---------21-----------------------

机器学习

为期一周的现场培训带来的非技术性收益

由卡拉·伊德斯在 Unsplash 上拍摄的照片

上周,我参加了一个现场机器学习课程,从技术和非技术的角度拓宽了我的视野。这是鹿特丹伊拉兹马斯大学教授的这门课程的强化版。在这篇博文中,我将总结 3 个对我来说最重要的非技术性成果。

在开始之前,我想强调一下,我交替使用了“机器学习”(ML)和“数据科学”这两个术语。

事不宜迟,我们开始吧!

1.用理论解释机器学习算法是至关重要的

作为一名自学成才的数据科学家,我用基于应用的方法学习了机器学习算法。我的意思是,我首先应用算法,然后通过文章和开源文档探索它们是如何工作的。

这种方法在构建解决方案时效果很好;但是,当需要向你的观众(或老板)展示你的模型时,你需要简单而令人信服的解释来翻译机器学习的概念和结果。总而言之,我们(数据科学家)是我们的模型和观众之间的桥梁。

形成这种桥梁的一种方法是理解算法背后的理论和数学。乍一看,理解这个充满数学符号的理论似乎有些吓人。一旦你迈出了理解它们的第一步,你就会认识到,从最简单的线性回归到最复杂的神经网络模型,理论都遵循相似的逻辑。

了解理论将是建立坚实基础的关键,并有助于将您的模型结果和机器学习概念方便地传递给非技术受众。

支持向量机背后的理论:算法如何在二元和非线性分类中找到最佳分离边界的证明

2.人工智能领域正在不同学科的人们的努力下成长

与会者来自不同背景(学者和专业人士),课程讲师解释说,他们是有意从不同背景中挑选出来的。多亏了这次选拔,我认识了非常有趣的人:)

例如,有一位正在研究架构背景下的 GAN 网络的博士生建筑师提出了这样一个问题:

一个 GAN(生成对抗网络)算法能生成平面图吗?

如果答案是肯定的,从长远来看,这项研究可能会改变建筑师在我们社会中的地位。

我的一个同桌是计算机科学学生和艺术家。他受到了媒体艺术家 Refik Anadol 的启发,他利用机器学习和人工智能将数据转化为艺术雕塑和装置。他正在考虑跟随他的脚步,这是对人工智能领域的独特贡献。

Refik Anadol 的资料雕塑:博斯普鲁斯。视频源

3。在人工智能的世界里总会有“已知的未知”和**“未知的未知”**

尽管我很喜欢我在数据科学方面的学习之旅,但有时我会对我尚未发现或不知道它们存在的算法和应用程序感到气馁。

但我意识到的是,即使我在这个领域花了几十年时间;将会有“已知的未知”和“未知的未知”,因为这个领域本身是不断发展的,它的应用范围也在扩大。

图片来源: freeCodeCamp

由于这次培训,我探索了一些未知的未知——我不知道它们已经存在——机器学习和人工智能在艺术中的应用。通过理解机器学习算法背后的理论,我从已知的未知领域中划掉了一些。

尽管如此,在前进的道路上仍有许多有待发现的东西!

感谢您的阅读,我将在下一篇博文中分享我在本课程中的技术收获,请关注我的媒体来了解他们😉

对于评论或建设性的反馈,您可以通过回复、 Twitter 或 Linkedin 联系我!

我希望在成为数据科学家之前学到的 3 课

原文:https://towardsdatascience.com/3-lessons-i-wish-id-learned-before-becoming-a-data-scientist-79ff3206d1dd?source=collection_archive---------27-----------------------

不要犯和我一样的错误

在过去的五年里,我从事过多种数据工作,我觉得分享我的一些主要经验是个好主意,因为我看到其他作者也是这样做的。我主要在“数据”是业务支持功能的公司工作,所以我的经历可能与 100%数据驱动的公司不同。还有,这只是个人经验:不同意随便!

第 1 课—数据与数据科学家

我学到的第一课是人们或多或少为我准备的。数据比一切都重要:在开始之前确保你理解了数据。然而,当听到这个消息时,我从来没有想到许多真实数据的不正确程度。

真实世界的数据通常是完全错误的

问问这家伙你的数据在实践中是怎么收集的!在 Unsplash 上阿三 S. 的照片

而且不仅仅是数据问题,还是公司问题。有时候,人们似乎花钱收集毫无意义的数据。例如,我曾经参与过一些项目,其目标是预测一个目标变量,即生产线上缺陷的百分比。

项目进行了四个月,我发现测量我们目标值的跟踪器完全错误:生产线的操作人员使用检测器的方式与他们应该使用的方式不同,导致数据出现巨大偏差。结果:项目被取消了,我可以丢掉四个月的工作。

要了解数据是如何真正生成的,您需要询问合适的人:您的用户或生成数据的现场工作人员

结论:数据往往是错误的。观察个人观察和深入研究数据收集过程的工作方式具有巨大的价值。不是理论上的,是实践上的!如果可能的话,去访问数据生成。在开始之前,请每天使用这些工具的人给你一个可用性评估。你真的想在一开始就发现这一点,而不是在最后。

第 2 课—机器学习 KPI 与业务逻辑

我的第二课是关于我们数据科学家工具箱中的统计和机器学习模型。

理解你的模型比你想象的要重要得多。

我明白了,理解你的模型比你想象的要重要得多。在数据科学中,我们总是在谈论准确性分数。它们非常重要。此外,提高模型的准确性是我的工作,所以我们不能忽视它。

著名的黑天鹅效应是众所周知的,但却被忽视了。在 Unsplash 上阿三 S. 的照片

有些事件非常罕见,可能不会出现在你的训练数据中:你知道你的模型会做什么吗?

但我们都知道,当我们建立一个模型时,准确性就像乐透一样。有时是好的,有时是坏的。最坏的情况:有些事件非常罕见,可能不会出现在你的训练数据中。这也被称为黑天鹅效应。

我的经验是:当你的生产模型变坏的时候,你发现有时会出现一个罕见的值,你的模型开始做出非常糟糕的决定,你会希望你已经检查了你的模型的实际拟合度。

第 3 课—数据科学家与他的客户

我得到的最糟糕的教训是:许多客户、利益相关者、经理对第一课和第二课根本不感兴趣。有时候,数据科学最难的部分是证明什么可以做,什么不可以做,以及某些项目需要多少时间。

有时候数据科学最难的部分是证明你能做什么或不能做什么。

一个著名的网络迷因。

我听说过这样的情况,在选定的 KPI 上表现优异的模型会被送到 prod,不管数据科学家是否同意。你可以说 KPI 是错的,但有时客户会非常关注 KPI,而不是拥有一个可靠的解决方案。

与你的客户合作,而不是与他们作对。照片由塞巴斯蒂安·赫尔曼在 Unsplash 上拍摄

在数据科学中,通常很难预先知道一个项目是否可行。在这个领域,理由、沟通和反馈循环非常重要,适应不同类型的客户是最基本的。

渐进式的工作方式改善了与利益相关者的合作,并能使最终结果更好。

我知道了一种渐进的工作方式可以改善与利益相关者的合作:从构建一个最小的解决方案开始——无论是数据分析还是工作模型——并询问利益相关者的反馈。然后,如果他们想继续你提议的方向,增加你的产品,直到你的利益相关者发现它足够好。

使用增量产品交付一步一步从一无所有到一个伟大的产品。艾萨克·史密斯在 Unsplash 上拍摄的照片

这种增量和反馈循环实践基于敏捷方法,避免了数据科学项目最终没有好的解决方案的部分风险。你甚至可以根据这种方法制定合同,在没有事先确定总金额的情况下,说明每一产品增量或每一花费时间的价格。这在一开始看起来很冒险,但是它可以让你的最终结果好得多。

感谢阅读。不要犹豫,在评论中分享你的学习,这样我们就可以互相学习了!

钢琴家成为伟大数据科学家的经验

原文:https://towardsdatascience.com/3-lessons-of-data-science-harmony-b204840f6ce7?source=collection_archive---------66-----------------------

我对数据科学同事和低年级学生的建议

关于为什么数据科学就像弹钢琴的 3 堂课

来源 Unsplash

“过度使用”的数据科学家维恩图

我在数据科学家课程简介中对数据科学家/数据专家的定义

这是一个典型的过度使用的图表,你总是在数据科学导论中看到。在这个图表中,我们可以看到 3 个不同的领域:计算机科学技能、统计技能和领域专长。

然后,在这一切的中间,我们放置了久负盛名的数据科学家,我认为这是一个超卖的头衔,他们被创业公司广泛滥用来吸引人才。虽然维恩图是对数据科学的很好介绍,但它缺乏价值主张的批判性思维。

就像任何需要起草商业模式以获得公司投资的企业一样。没有客户需要的附加值,您就无法解释数据科学的真正工作。典型的数据科学维恩图有几个问题。

  1. **它没有解释数据科学的核心目标。**我们在为谁分析?我们如何知道我们是否成功?
  2. 它不激发行动。好的..我该如何开始?
  3. 它没有强调与不同团队合作的环境。数据科学永远是团队的成就。

在这种情况下,我想介绍一个类比,为您提供更多关于如何成为一名伟大的数据科学家的信息。

通过向钢琴家学习。

有一天,我支持我的一个好朋友,他是一个优秀的钢琴家。在他的钢琴音乐会之后,我祝贺了他。我们聊了一会儿,直到他问我“数据科学家是做什么的?”我想了想,编造了一个比喻来解释。现在,我想和你分享。

我希望这种理解有助于你理解数据科学家作为职业的核心思维模式。

观众:你会对牛弹琴吗?

来源

战国时期,有一个叫的音乐家,擅长演奏乐器。有许多人喜欢听他演奏,并且非常尊敬他。

一天,伊在乡下休息时看见一头牛。他想,“每个人都称赞我的音乐。要不我给这头牛放点音乐?”

他为牛演奏了一首优雅古雅的音乐,但牛只是低着头不停地吃草。他又放了一段欢快的音乐,但牛还是低着头吃草,完全不理他。伊展示了他所有的技能,但牛仍然不理他。

然后他调整他的演奏来模仿小牛的声音。奶牛做出了反应。

—中国民间故事(对牛弹琴)——

这是一个简单而伟大的教训。不管你的解决方案有多复杂。如果你的利益相关者/听众不理解,你将不会有任何结果。数据科学的关键成果是做出数据驱动的决策。要做到这一点,你需要你的关键利益相关者的认可和支持。

这包括你的应用程序用户,你的 ML 应用程序的用户,甚至是支持你的应用程序发布的工程师。你不应该想太多,应该开发简单的解决方案,旨在解释而不是复杂。

例如,如果项目很小,并且您的利益相关者需要概念证明来确定其连续性,则不要将深度学习作为您的第一个赌注。相反,要理解问题和数据,并创建一个交互式仪表板来提取见解。

做对你的利益相关者有益和足够的事情,而不是为了你的自我。

同样对我来说,每当我收到一个新项目,我总是强调最小可行产品(MVP ),并在我有利益相关者购买时冒险进入复杂的机器学习/深度学习。

这意味着,我会从探索性的分析开始。我用基于阈值的规则(例如:决策树)对结果进行分类,以产生 80%的影响。总是尝试 20/80 帕累托比较,以确认你正朝着正确的方向前进。

如果你忽略了这一点,你将会给你的利益相关者带来巨大的成本,而不是你在解决方案中承诺的影响。 【网飞】因工程费用从未使用过其 100 万美元的算法。这可能是你的下一个头条。

了解你在为谁演奏音乐,这是成为伟大的数据科学家的关键

学科:学钢琴用钢琴 tab 吗?

钢琴标签的普及学习

不懂统计学可以学数据科学吗?

我能实现深度学习并自称数据科学家吗?

简单的回答就是……可以。

您可以在不知道回归如何工作的情况下进行回归。你可以策划并理解它。你甚至可以按照 Keras 教程为 Kaggle 比赛快速实现深度学习。

毕竟学校不就是这么教我们的吗?饼干切刀和结果生产?

想象一个钢琴标签

你演奏冬季奏鸣曲。有了钢琴标签,当你一个键一个键地跟随作者的指示时,你可以给你的女朋友留下深刻印象。你甚至不需要读一个音符。

但是你是一个伟大的音乐家吗?

是的,你可以演奏音乐,但你不会成为伟大的钢琴家。钢琴键是训练轮。你永远不会听到一个职业自行车手用训练轮训练。

你可以训练和演奏任何你想要的歌曲。但是不懂看音符,你的理解就会很浅。除非你懂音符,否则你永远不会编曲自己的曲子。

同样,一个伟大的数据科学家会在以下几个方面下大力气,磨砺自己的技能:

  1. 你的观众:你在为谁演奏?
  2. 您的作品:ML 模型/分析的里外是什么?
  3. 你的工具:你如何利用现有资源制作高质量的作品?

同样,没有统计学,你能成为伟大的数据科学家吗?

团队合作:音符形成和谐

来源: Unsplash

自己做项目能成为数据科学家吗?

数据科学永远是团队合作。唱诗班里有女高音、男高音、女低音和男低音的合奏。每一个都不能独立存在,但是他们一起创造和谐。

同样,在数据科学领域,您会发现启动概念验证的工程师、查看您的分析并做出决策的产品经理,甚至其他拥有不同专业知识的数据科学家。

作为数据科学家,我们不能孤军奋战。我们可以建立基础设施和模型。但是,如果我们不尊重和协调我们的工作,我们就会失败。

同样的,对于我来说,我总是很庆幸自己身边总是有比我懂得多的同事。他们有不同的专长(Yara/ Yodalog/ ML Ops)在我冒险进入未知领域时帮助我。我们通过产品发布同步我们的工作。

就像音调如何形成和声一样,同步的作品传递着冲击力。

结论

综上所述,通过向钢琴家学习。你学到了成为伟大数据科学家的更多观点:

  1. ***受众:*在着手每一个数据项目之前,充分了解你的受众。得到他们的认同,你就不会浪费你的努力。
  2. ***纪律:*努力学习自己的技能。明白你需要你的观众、作品和工具的多种技能。
  3. ***团队合作:*了解如何建立人际关系,将项目协调成和谐/有影响力的项目。

索利·德奥·格洛丽亚

关于作者

文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。

除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。

在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。

最后,请通过 LinkedIn Medium Youtube 频道 联系文森特

掌握 Python 中的 Apache Kafka 应该知道的 3 个库

原文:https://towardsdatascience.com/3-libraries-you-should-know-to-master-apache-kafka-in-python-c95fdf8700f2?source=collection_archive---------4-----------------------

Python 开发者使用 Kafka 的手册

杰克·吉文斯在 Unsplash 上的照片

数据赋予世界力量。我们每秒钟都会获得大量信息,我们对其进行清理、分析并创造出更有价值的输出,无论是日志文件、用户活动、聊天消息还是其他内容。我们交付得越快,我们给客户带来的价值就越多。我们处在一个快节奏和不断变化的环境中。

Apache Kafka 是一个分布式流媒体平台,可以实时发布、订阅、存储和处理消息。其基于拉的架构减轻了负载较重的服务的压力,并使其易于扩展。它以低延迟将大量数据从源移动到目的地。

[## 关于推与拉架构的思考

我最近和一些人讨论了不同服务架构的优缺点…

medium.com](https://medium.com/@_JeffPoole/thoughts-on-push-vs-pull-architectures-666f1eab20c2)

Kafka 是一个基于 JVM 的平台,所以客户端的主流编程语言是 Java。但是随着社区的快速发展,高质量的开源 Python 客户端也可以使用,并被用于生产中。

在本文中,我将涵盖最知名的 Python Kafka 客户端: kafka-pythonpykafkaconfluent-kafka 并对它们进行比较。最后,我会给出我对每个库的利弊的看法。

我们为什么要卡夫卡?

首先要做的事。为什么是卡夫卡?Kafka 旨在推动事件驱动的架构。它通过提供高吞吐量、低延迟、高耐用性和高可用性解决方案来增强架构。(这并不意味着你可以同时拥有它们,总会有所取舍。阅读此白皮书了解更多信息。)

[## 如何部署和优化 Kafka 以实现高性能和低延迟

Apache Kafka 是一个 power stream 处理平台。本白皮书讨论了如何优化 Kafka 部署,以用于…

www.confluent.io](https://www.confluent.io/white-paper/optimizing-your-apache-kafka-deployment/)

除了它的高性能,另一个吸引人的特性是发布/订阅模型,其中发送者不专门向接收者发送消息。取而代之的是,根据 主题 ,消息被传送到接收者可以订阅的集中地点。

通过这样做,我们可以轻松地分离应用程序,摆脱单一设计。让我们看一个例子来理解为什么解耦更好。

您创建了一个需要将用户活动发送到某个地方的网站,因此您编写了一个从您的网站到实时监控仪表板的直接连接。这是一个简单的解决方案,效果很好。有一天,您决定将用户活动存储在数据库中以供将来分析。所以,你写另一个直接的数据库连接到你的网站。与此同时,您的网站获得了越来越多的流量,您希望通过添加警报服务、实时分析服务等来增强它的能力。

你的架构最终会变成这样。诸如大量代码回购、安全问题、可伸缩性问题和可维护性问题等问题会伤害到你。

无解耦建筑(由高创作)

你需要一个中枢来分离不同角色的应用程序。对于创建事件的应用程序,我们称之为 生产者 。他们将事件发布到一个集中的中心。每个事件(即消息)属于一个 主题 。在枢纽的另一侧坐着 消费者 。他们从中心订阅他们需要的话题,而不直接与制作人对话。

有了这个模型,架构可以很容易地扩展和维护。工程师可以更专注于核心业务。

解耦建筑(由高创作)

简而言之卡夫卡的设置

可以从 官网 下载阿帕奇卡夫卡。快速启动帮助你在 10 秒内启动服务器。

也可以从 合流平台 下载阿帕奇卡夫卡。这是迄今为止最大的面向 Kafka 的流媒体数据平台。它为个人和企业提供了一系列围绕 Kafka 的基础设施服务,使数据可以作为实时流使用。创始人是最初创建 Apache Kafka 的团队成员。

每个 Kafka 服务器被称为一个 代理 ,你可以独立运行它或者组成一个集群。除了卡夫卡,我们还需要 Zookeeper 来存储关于卡夫卡的元数据。Zookeeper 就像一个指挥者,管理分布式系统中每个代理的状态。

卡夫卡装置(由高创作)

假设我们已经用 1 个动物园管理员和 1 个 Kafka 经纪人建立了基础设施。是时候连接它了!原 Java 客户端提供了 5 个 API:

  • 生产者 API:向 Kafka 集群中的主题发布消息。
  • 消费者 API:消费 Kafka 集群中主题的消息。
  • Streams API:消费来自主题的消息,并将它们转换成 Kafka 集群中的其他主题。操作可以是过滤、连接、映射、分组等。
  • Connect API:无需编码,直接将 Kafka 集群连接到源系统或接收系统。该系统可以是文件、关系数据库、弹性搜索等。
  • Admin API:管理和检查 Kafka 集群中的主题和代理。

卡夫卡的 Python 库

在 Python 世界中,已经实现了 5 个 API 中的 3 个,它们是生产者 API、消费者 API 和管理 API。Python 中还没有这样的 Kafka Stream API,但是一个不错的替代品是 Faust

本节中的测试是基于本地安装的 1 个 Zookeeper 和 1 个 Kafka broker 执行的。这与性能调优无关,所以我主要使用库提供的默认配置。

卡夫卡-巨蟒

kafka-python 的设计功能非常类似于官方的 java 客户端,只带有少量 python 接口。最好配合卡夫卡 0.9+版使用。第一次发布是在 2014 年 3 月。它被积极地维护着。

安装

pip install kafka-python

制片人

每条消息通过send() 异步发送。当被调用时,它将记录添加到缓冲区并立即返回。这允许制作人以批处理模式向 Kafka 经纪人发送记录以提高效率。异步可以极大地提高速度,但是我们也应该理解一些事情:

  1. 在异步模式下,不保证排序。你不能控制每个消息何时被 Kafka 代理确认(ack)。
  2. 对于生产者来说,有一个成功的回调和一个失败的回调是一个很好的实践。例如,您可以在成功回调中写入一条信息日志消息,在失败回调中写入一条异常日志消息。
  3. 由于无法保证排序,在您收到回调中的异常之前,可能会发送额外的消息。

如果想避免这些问题,可以选择同步发送消息。send()的返回是一个FutureRecordMetadata。通过执行future.get(timeout=60),生产者将被阻止最多 60 秒,直到消息被代理成功确认。缺点是速度,与异步模式相比相对较慢。

消费者

消费者实例是一个 Python 迭代器。消费类的核心是poll()方法。它允许消费者不断从主题中提取信息。它的一个输入参数timeout_ms缺省为 0,这意味着该方法会立即返回任何提取的记录以及缓冲区中的可用记录。您可以增加timeout_ms返回更大的批次。

默认情况下,每个消费者都是一个无限的侦听器,所以它不会停止,直到程序中断。但另一方面,你可以根据收到的信息阻止消费者。例如,如果达到某个偏移量,您可以退出循环并关闭使用者。

还可以将消费者分配到多个主题的一个分区或多个分区。

卡夫卡-python-consumer.py

这是 kafka-python 库的测试结果。每条消息的大小为 100 字节。生产者的平均吞吐量是 1.4MB/s。消费者的平均吞吐量是 2.8MB/s

Kafka-python-result . CSV

——卡夫卡

Confluent-kafka 是一个用于 Python 的高性能 kafka 客户端,它利用了高性能 C 客户端 librdkafka 。从 1.0 版本开始,它们作为独立的二进制轮子在 PyPi 上为 OS X 和 Linux 分发。它支持 Kafka 版本。第一次发布是在 2016 年 5 月。它被积极地维护着。

安装

对于 OS X 和 Linux,librdkafka 包含在软件包中,需要单独安装。

pip install confluent-kafka

对于 windows 用户,在我写这篇文章的时候, confluent-kafka 还不支持 Python3.8 二进制轮子。你会碰到 librdkafka 的问题。请检查他们的发布说明,它正在积极开发中。另一个解决方案是降级到 Python3.7。

制片人

合流——卡夫卡在速度方面有着不可思议的表现。API 设计有点类似于 kafka-python 。您可以通过将flush()放入循环中来使其同步。

合流-卡夫卡-制片人. py

消费者

confluent-kafka 中的消费者 API 需要更多代码。您需要自己处理 while 循环,而不是调用像consume()这样的高级方法。我建议你创建自己的consume(),它本质上是一个 Python 生成器。每当有一个消息被拉出来并在缓冲区中可用时,它就产生该消息。

这样做,主要功能将是干净的,你可以自由地控制你的消费者的行为。例如,您可以在consume()中定义一个“会话窗口”。如果在 X 秒钟内没有提取任何消息,那么消费者将停止。或者您可以添加一个标志 infinite=True 作为输入参数来控制消费者是否应该是一个无限的监听器。

汇合-卡夫卡-消费者. py

这是 conflunet-kafka 库的测试结果。每条消息的大小为 100 字节。生产者的平均吞吐量为 21.97MB/s,消费者的平均吞吐量为 16.8~28.7 MB/s

汇合-卡夫卡-结果. csv

卡夫卡

PyKafka 是一个程序员友好的 Python Kafka 客户端。它包括 Kafka 生产者和消费者的 Python 实现,可选地由构建在 librdkafka 上的 C 扩展支持。它支持 Kafka 版本。第一次发布是在 2012 年 8 月,但自 2018 年 11 月以来就没有更新过。

安装

pip install pykafka

librdkafka 不附带软件包,你需要在所有操作系统中单独安装。

制片人

pykafka 有一个 KafkaClient 接口,它覆盖了生产者 API 和消费者 API。

消息可以在异步和同步模式下发送。我发现 pykafka 修改了一些生产者配置的默认值,例如 linger_ms 和 *min_queued_messages,*这可能会对发送少量数据产生影响。

你可以和 Apache Kafka 网站上的默认配置对比一下。

如果您想要获得每个消息的回调,请确保将 min_queued_messages 更改为 1,否则如果您的数据集小于 70000,您将不会获得任何报告。

pykafka-producer-config

pykafka-producer.py

消费者

你可以从 KafkaClinet 接口得到一个SimpleConsumer。这类似于 *kafka-python,*poll 被包装在SimpleConsumer类中。

pykafka-consumer.py

这是 pykafka 库的测试结果。每条消息的大小为 100 字节。生产者的平均吞吐量是 2.1MB/s。消费者的平均吞吐量是 1.57MB/s

pykafka-result.csv

结论

到目前为止,我已经解释了每个库的生产者 API 和消费者 API。在管理 API 方面, kafka-pythonconfluent-kafka 确实提供了显式的管理 API。您可以在您的单元测试中使用它,您想要创建一个主题,然后在执行下一个测试之前删除它。此外,如果您想用 Python 构建 Kafka 监控仪表板,Admin API 可以帮助您检索集群和主题的元数据。

Kafka-python-result . CSV

汇合——卡夫卡:

毫无疑问,在这三个图书馆中,合流-卡夫卡的表现最好。API 设计得很好,参数与最初的 Apache Kafka 保持相同的名称和默认设置。您可以很容易地将其链接到原始参数。就我个人而言,我喜欢定制消费者行为的灵活性。它也正在积极开发和支持汇合。

一个缺点是,Windows 用户可能需要努力一点才能让它工作。由于它的 C 扩展,调试可能会很棘手。

卡夫卡-巨蟒:

kafka-python 是一个没有 C 扩展的纯 python 库。该 API 设计良好,对于初学者来说简单易用。这也是一个正在积极开发的项目。

python-kafka 的缺点是速度。如果你真的关心性能,我会推荐你切换到汇合-卡夫卡

卡夫卡:

相对于 kafka-python 和 *conflunet-kafka,*py Kafka 的开发不太活跃。发布历史显示自 2018 年 11 月以来未更新。此外, pykafka 有不同的 API 设计和使用不同的默认参数,这可能不是第一次直截了当。

我希望你喜欢这篇文章!如果你有任何想法,请在下面留下你的评论。

资源

[## 卡夫卡-巨蟒

Apache Kafka 分布式流处理系统的 Python 客户端。kafka-python 的设计功能很像…

pypi.org](https://pypi.org/project/kafka-python/#history) [## 汇流-卡夫卡

Confluent 的用于 Apache Kafka 的 Python 客户端

pypi.org](https://pypi.org/project/confluent-kafka/) [## pykafka

PyKafka 是一个程序员友好的 Python Kafka 客户端。它包括 Kafka 生产者的 Python 实现和…

pypi.org](https://pypi.org/project/pykafka/) [## 阿帕奇卡夫卡:权威指南

什么是卡夫卡,它是如何工作的?在这本全面的电子书中,你会得到阿帕奇卡夫卡的全面介绍…

www.confluent.io](https://www.confluent.io/resources/kafka-the-definitive-guide/?utm_medium=sem&utm_source=google&utm_campaign=ch.sem_br.nonbrand_tp.prs_tgt.content-search_mt.xct_rgn.emea_lng.eng_dv.all&utm_term=kafka%20the%20definitive%20guide&creative=&device=c&placement=&gclid=CjwKCAjw8J32BRBCEiwApQEKgZ1vBxyFB-DnTvXRClVBHzHX8NERiYyF_2Go5iYHYP6f3aP_l9xNBhoCUi0QAvD_BwE)

3 行 Python 代码创建了一个交互式可玩的新冠肺炎泡泡地图

原文:https://towardsdatascience.com/3-lines-of-python-code-to-create-an-interactive-playable-covid-19-bubble-map-74807939e887?source=collection_archive---------22-----------------------

由马丁·桑切斯在 Unsplash 上拍摄的照片

使用 Plotly Express 创建一个可播放和交互式的全球新冠肺炎确诊病例气泡图。

上面的 GIF 显示了我用 Python 中的 Plotly Express 创建的全球地图上的交互式气泡图。如果你对用 3 行代码创建这个感兴趣,请通读。

毫无疑问,Plotly 是最流行的数据可视化库之一,支持许多编程语言。在本文中,我将演示如何使用 Python 中的 Plotly Express 绘制全球新冠肺炎病例数据。

关于 Plotly Express

[## plot ly:ML 和数据科学模型的前端

Python、R 和 Julia 中 ML 和数据科学模型的领先前端。作为 ML 和数据的领先 UI 层…

plotly.com](https://plotly.com/)

作为 Plotly 库的一个子模块,Plotly Express 是为了最有效地传递常用图表而创建的。这是一个简洁、一致、非常高级的 API,可以用漂亮的图形绘制数据。

如果你有很多定制的需求,Plotly Express 不是你的选择。如果是这样的话,您可能需要检查一下常规的 Plotly 库 API。否则,强烈推荐使用 Plotly Express,因为它可以节省您的时间,并且与常规 API 一样出色。

新冠肺炎数据源

照片由米卡·鲍梅斯特在 Unsplash 上拍摄

许多组织目前正在提供最新的新冠肺炎数据。我在欧盟找到了这个:

[## 下载今天全球新冠肺炎病例地理分布的数据

每天在欧洲中部时间 6:00 到 10:00 之间,一组流行病学家筛选多达 500 个相关来源,以收集…

www.ecdc.europa.eu](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide)

说明:数据来源可以通过搜索引擎简单地找到,本文使用的新冠肺炎数据仅用于数据可视化技术演示,因此我不对数据的准确性负责。

你可以从上面的链接下载 CSV。但是,我们可以使用熊猫直接读取 Python 中的一个 URL。

import pandas as pddf = pd.read_csv('[https://opendata.ecdc.europa.eu/covid19/casedistribution/csv'](https://opendata.ecdc.europa.eu/covid19/casedistribution/csv'))

下面是数据的样子。请注意,我使用的是sample函数,而不是head,因为我想看到数据集不同部分的数据,而不仅仅是顶部的几个条目。

在本教程中,我们将使用数据集中的以下字段:

  • 日期
  • 案例数量
  • 死亡人数
  • 国家
  • 大陆

因此,让我们删除无用的列,并将这些列重命名为 preferences。请注意,这一步是可选的,但这是保持熊猫数据框整洁的好方法。

# Remove unuseful columns
df = df[['dateRep', 'cases', 'deaths', 'countriesAndTerritories', 'countryterritoryCode', 'continentExp']]# Rename columns
df = df.rename(columns={'dateRep': 'date','countriesAndTerritories': 'country','countryterritoryCode': 'countryCode','continentExp': 'continent'
})# Convert string to datetime
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')# Preview the data frame
df.sample(10)

创建气泡图

马库斯·斯皮斯克在 Unsplash 上拍摄的照片

在创建交互式地图之前,让我们先创建一个静态地图。稍后,你会惊讶地发现创建一个可玩的交互式地图是多么容易。

对于静态地图,我想为“今天”创建它。因此,让我们获得全球所有国家的数据框架,但仅限于“今天”。

from datetime import datetime# Get today as string
today = datetime.now().strftime('%Y-%m-%d')# Get a data frame only for today
df_today = df[df.date == today]# Preview the data frame
df_today.head()

我现在的日子是 4 月 26 日,所以我得到的数据框如上图所示。

然后,让我们使用 Plotly Express 绘制数据框。

import plotly.express as pxfig = px.scatter_geo(df_today, locations='countryCode',color='continent',hover_name='country',size='cases',projection="natural earth",title=f'World COVID-19 Cases for {today}'
)
fig.show()

简单地说上面的 3 行(这里有 12 行,因为我想以更好的可读性来显示它们),带有气泡的全球地图显示了今天的确诊病例数,如下所示。

我来解释一下px.scatter_geo()函数的参数。

  • 对于第一个参数,我们需要提供 Pandas 数据框。Plotly Express 与 Pandas 完全兼容,因此我们可以始终使用数据帧。
  • locations采用国家代码对地图上的国家进行地理编码。请注意,我们只是让 Plotly Express 知道名为“countryCode”的列是指示位置的列。我们也可以使用纬度和经度。然而,由于数据源提供了“ ISO-Alpha ”国家代码,因此使用起来更加方便。
  • color在这里是可选的,但是根据不同的洲用不同的颜色代码显示气泡是很好的,这样可以使图形更清晰。
  • hover_name决定当鼠标悬停在气泡上时显示什么。这里我们让它显示国家名称,因此我们从数据框中指定列名“country”。
  • size是决定地图上的气泡有多大的重要参数。当然,我们希望它表明每个国家有多少病例,所以我们指定“病例”。
  • projection告诉 Plotly 表达我们要使用的地图的呈现方式。还有许多其他选项,如“等矩形”将显示如下矩形地图。

  • title就是简单的设置图形的标题。

现在,创建一个“可玩的泡泡地图”怎么样?轻松点。

让我们放弃df_today数据帧,因为它只有今天的数据。我们的原始数据帧df有所有的数据。

在我们制作地图动画之前,需要提到的是,Plotly Express 目前只支持“播放”基于整数或字符串类型的数据。我们希望根据日期“播放”气泡图,因此需要将它们转换成数据类型。此外,不要忘记根据日期对数据框进行排序,因为我们希望在自然时间轴中“播放”地图。

# Convert date to string type
df['date'] = df.date.dt.strftime('%Y%m%d')# Sort the data frame on date
df = df.sort_values(by=['date'])# Some countries does not have code, let's drop all the invalid rows
df = df.dropna()# Preview the data frame
df.head(10)

好的。数据帧现在准备好了。请参考之前我们为今天的数据创建的px.scatter_geo()函数。要使其“可播放”,只需让 Plotly 知道哪一列将用于“播放”animation_frame=”date”。完整的功能如下。

fig = px.scatter_geo(df, locations='countryCode',color='continent',hover_name='country',size='cases',projection="natural earth",title=f'World COVID-19 Cases',animation_frame="date"
)
fig.show()

我们还可以拖动进度条快速导航到特定日期,以及与地图进行交互以放大/缩小和平移。

看看有多简单!多亏了 Plotly,我们可以在几秒钟内创建精美的图表。

摘要

照片由亚伦·伯顿在 Unsplash 上拍摄

的确,Plotly Express 的功能是有限的。例如,如果我们想在地图上自定义气泡大小的比例(一些病例较少的国家不可见),这将是不方便的。

然而,这些限制是一种权衡,因为 Plotly Express 旨在提供简洁的 API 来非常快速地创建漂亮的图形。因此,我们可以选择使用 Graph Objects 等非常常规的 API 来实现那些定制的需求。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

用 3 行 Python 代码编写一个 Web 服务器

原文:https://towardsdatascience.com/3-lines-of-python-code-to-write-a-web-server-46a109666dbf?source=collection_archive---------4-----------------------

照片由卡伦·艾姆斯利在 Unsplash 上拍摄

使用内置库“http.server”用 Python 编写的最简单的 web 服务器

要知道 Python 可以非常有效的用来写 web 服务器。据了解,目前有许多流行和优秀的框架和库,如 Django 和 Flask,这使得后端开发人员可以专注于业务逻辑,节省了大量的编码时间。

但是,你知道 Python 的内置库http.server也可以用来写 web 服务器吗?还有,你知道你甚至可能只用三行代码就写出一个吗?在本文中,我将向您展示如何在一分钟内编写并运行一个 web 服务器!

简单的准备

Toa Heftiba 在 Unsplash 上拍摄的照片

web 服务器将需要在某个地方启动,因此您需要考虑要在哪里启动它。然后,你可能想把你的代码放在那里。

此外,我们需要导入http.server库。可选地,建议导入os库,以确保 web 服务器确实运行在“当前”目录中。换句话说,使用当前目录作为 web 服务器的根路径。

import os
from http.server import HTTPServer, CGIHTTPRequestHandler

http.server库中,我们需要HTTPServer类来实例化服务器对象,以及CGIHTTPRequestHandler类作为请求处理器。

如果你不知道什么是CGI,这里有一个来自维基百科的简短定义:

在计算中,公共网关接口 ( CGI )是一种接口规范,用于 web 服务器执行程序,如运行在动态生成网页的服务器上的控制台应用程序(也称为命令行接口程序)。这样的程序被称为 CGI 脚本或简称为 T21 CGI。服务器如何执行脚本的细节由服务器决定。在一般情况下,CGI 脚本在发出请求时执行,并生成 HTML。[1]

三行代码

乔希·里默尔在 Unsplash 上拍摄的照片

然后,让我们用三行代码编写服务器,不开玩笑。

第一行

让我们确保在当前目录下创建服务器,并将其用作根路径。os.chdir()方法会将路径设置为当前工作目录。这里我们将当前目录.设置为它的工作目录。

# Make sure the server is created at current directory
os.chdir('.')

第二行

让我们从HTTPServer类创建一个“服务器对象”。它有两个参数,第一个是server_address,它是

  • 侦听的地址,其中空字符串表示侦听本地主机
  • 侦听的端口号。我将使用端口 80,这样我就不必输入端口号来访问。您可以选择使用其他端口号,如 8080
# Create server object listening the port 80
server_object = HTTPServer(server_address=('', 80), RequestHandlerClass=CGIHTTPRequestHandler)

第二个参数是请求处理程序类。这里我们使用已经导入的CGIHTTPRequestHandler

第三行

没别的,我们跑吧!

# Start the web server
server_object.serve_forever()

serve_forever()方法将基于我们刚刚创建的服务器对象启动服务器,并确保它持续运行。

所有代码放在一起

Here is all the code:import os
from http.server import HTTPServer, CGIHTTPRequestHandler# Make sure the server is created at current directory
os.chdir('.')
# Create server object listening the port 80
server_object = HTTPServer(server_address=('', 80), RequestHandlerClass=CGIHTTPRequestHandler)
# Start the web server
server_object.serve_forever()

测试服务器以及我们为什么需要它

本·怀特在 Unsplash 上的照片

将所有代码保存到一个名为pyserver.py的文件中。然后,转到命令行并运行 Python 脚本。

python pyserver.py

您将在 stdout 中看到预期的任何输出。去你的浏览器输入localhost,网络服务器已经开始工作了。

web 服务器根目录的屏幕截图

因此,这个 web 服务器将允许您从根路径浏览文件。

现在,你可能会问我为什么需要这个 web 服务器?对,没那么有用。但是想想你能用网络浏览器做什么?例如,我过去常常下载一些通常是 PDF 格式的学术研究论文。你会发现在网页浏览器中浏览子文件夹和打开 PDF 文件比使用 Windows 资源管理器和 Mac OS Finder 要快得多。

包含 PDF 文件的文件夹的屏幕截图

打开的 PDF 文件的屏幕截图

同样,在这个例子中,我们在本地机器上运行 web 服务器。如果您可以在远程机器上运行这个 Python 脚本,那么您将获得一个非常快速的文件共享服务器!

总结和注意事项

照片由吴礼仁在 Unsplash 上拍摄

在本文中,我介绍了如何只用三行 Python 代码编写一个 web 服务器,让您可以浏览服务器上的文件。

然而,需要注意的是,实现如此简单的http.server是不安全的。因此,请不要在重要的环境中只使用这三行代码,这可能会成为潜在的安全漏洞。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和其他成千上万的作者!(点击上面的链接)

参考

[1]通用网关接口,维基百科https://en.wikipedia.org/wiki/Common_Gateway_Interface

2021 年你应该阅读的 4 篇重要的机器学习和深度学习论文

原文:https://towardsdatascience.com/3-machine-learning-research-papers-you-should-read-in-2020-9b639bd0b8f0?source=collection_archive---------9-----------------------

2021 年机器学习的突破

从数百篇高质量的 ML 研究论文中筛选出来的,这些是最突出的。

丹·迪莫克在 Unsplash 上拍摄的照片

2021 年重要的机器学习和深度学习论文

机器学习 突然成为计算机科学最关键的领域之一,几乎涉及到所有与人工智能相关的领域。

每个公司都在应用 机器学习 并开发利用这个领域的产品来更有效地解决他们的问题。

每年都有数千篇与 机器学习 相关的研究论文发表在 NeurIPS、ICML、ICLR、ACL、MLDS 等热门刊物上。

该标准使用来自三个学术来源的引用计数:scholar.google.com;academic.microsoft.com;还有 semanticscholar.org 的。

自然语言处理、对话式人工智能、计算机视觉、强化学习和人工智能伦理方面的重要研究论文每年发表一次

几乎所有的论文都提供了在 机器学习 领域的某种程度的发现。然而,有三篇论文特别站得住脚,它们在 机器学习 领域,特别是在 神经网络 领域提供了一些真正的突破。

用于图像识别的深度残差学习

arvix:https://www . cv-foundation . org/open access/content _ cvpr _ 2016/papers/He _ Deep _ Residual _ Learning _ CVPR _ 2016 _ paper . pdf

摘要:

越深的神经网络越难训练。我们提出了一个剩余学习框架来简化比以前使用的网络更深入的网络训练。我们明确地将这些层重新表述为参考层输入的学习剩余函数,而不是学习未被参考的函数。

在深度意义的驱动下,一个问题产生了:学习更好的网络是不是和堆叠更多层一样简单?

具有 20 层和 56 层平面网络的 CIFAR-10 上的训练误差(左)和测试误差(右)。

学习身份函数极其困难,因为权重和偏差的所有可能组合的范围都是巨大的,因此学习身份函数的机会微乎其微。如上所述,给神经网络增加更多的层实际上可能会适得其反:更多的层=更低的精度(收益递减)。

该文件指出,对此有一个解决办法。也就是通过将隐藏层的输入与输出相加

剩余学习:一个积木。

通过在更深的网络上实现这一想法,他们能够在 COCO 对象检测数据集上获得 28%的相对改善。深度残差网络是我们提交给 ILSVRC 和 COCO 2015 竞赛的基础,在那里他们还在 ImageNet 检测、ImageNet 定位、COCO 检测和 COCO 分割任务中获得了第一名。

单头注意力 RNN:停止用你的头脑思考

arvix:作者:史蒂文

在这篇论文中,哈佛毕业生史蒂文·梅里蒂介绍了一种最新的自然语言处理模型,称为单头注意力 RNN 或沙-RNN。Stephen Merity,独立研究员,主要专注于 机器学习、NLP 和深度学习 。作者通过一个简单的带有 SHA 的 LSTM 模型进行演示,在 enwik8 上实现了最先进的字节级语言模型结果。

作者的主要目标是表明,如果我们沉迷于稍微不同的首字母缩写词和稍微不同的结果,整个领域可能会朝着不同的方向发展。

* [## Smerity/sha-rnn

要了解全部细节,请参见题为《单头注意力 RNN:停止用你的头脑思考》的论文。总而言之,“停止思考…

github.com](https://github.com/smerity/sha-rnn)

Steven 提出的模型架构的中心概念由一个 LSTM 架构和一个基于阿沙的网络组成,该网络具有三个变量(Q、K 和 V)。

来源:Arvix(https://arxiv.org/pdf/1911.11423.pdf)

每个 SHA-RNN 层只包含一个关注点,通过消除更新和维护多个矩阵的需要,有助于将模型的内存消耗保持在最低水平。

Boom 层与在变形金刚 和其他架构中发现的 l arge 前馈层紧密相关。与传统的向下投影层相比,该块通过使用高斯误差线性单元(GeLu)乘法来分解输入以最小化计算,从而减少并移除了整个参数矩阵。

下面我们来看实际对比。2016 年,RNN 正则化方法 surprise-Driven zone out在 Hutter Prize 数据集 enwiki8 上取得了 1.313bpc 的优异压缩成绩,该数据集是一个百兆字节的维基百科页面文件。

与 2016 年的车型相比,SHA-RNN 的 bpc 甚至更低。令人印象深刻。每个字符的位数是由 Alex Graves 提出的模型,用于在给定过去字符的情况下近似下一个字符的概率分布。

来源:https://arxiv.org/pdf/1911.11423.pdf

此外,单头注意力 RNN(沙-RNN)设法实现了强大的最先进的结果,几乎没有超参数调整,并通过使用一个单一的泰坦 V GPU 工作站。此外,他的工作没有经历过密集的超参数调整,完全依赖于一台商用台式机,这使得作者的小工作室公寓有点太温暖了,他不喜欢。这就是对 机器学习 的热情。*

EfficientNet:重新思考卷积神经网络的模型缩放

arvix:【https://arxiv.org/abs/1905.11946】
作者: 谭明兴
郭诉乐**

在本文中,作者系统地研究了模型缩放,并确定仔细平衡网络深度、宽度和分辨率可以获得更好的性能。本文展示了一种新的缩放方法,它使用一个简单而高效的复合系数统一缩放深度、宽度和分辨率的所有维度。

** [## narumiruna/efficient net-pytorch

“EfficientNet:卷积神经网络模型缩放的再思考”的 PyTorch 实现。…

github.com](https://github.com/narumiruna/efficientnet-pytorch)

论文提出了一种简单然而有效的复合缩放方法,描述如下:

来源:Arvix()https://arxiv.org/abs/1905.11946)

经过尺寸缩放(宽度、深度或分辨率)的网络可提高精度。但是需要注意的是,模型精度随着模型的增大而下降。因此,在 CNN 缩放过程中平衡网络的所有三个维度(宽度、深度和分辨率)对于提高精度和效率至关重要。

与传统的缩放方法相比,如上所述的复合缩放方法 持续提高了放大现有模型的模型精度和效率,例如 MobileNet (+1.4%图像净精度)和 ResNet (+0.7%)

缩放不会改变图层操作;相反,他们通过进行神经架构搜索(NAS)获得了他们的基本网络,该网络同时优化了准确性和 FLOPS。与 ResNet-50 和 DenseNet-169 等现有 ConvNets 相比,扩展的 EfficientNet 模型始终将参数和 FLOPS 减少了一个数量级(参数减少高达 8.4 倍,FLOPS 减少高达 16 倍)。

EfficientNets 还在八个数据集的五个中实现了最先进的准确性,如 CIFAR-100 (91.7%)和 Flowers (98.8%),参数数量级更少(参数减少高达 21 倍),这表明 EfficientNets 也传输良好。**

深度双重下降:更大的模型和更多的数据会造成伤害

arvix: 作者:普雷顿·纳克兰加尔·卡普伦亚米尼·班萨尔特里斯坦·杨****

在本文中,作者在 OpenAI 将神经网络的一个训练过程的有效模型复杂度(EMC) 定义为它能达到接近零训练误差的最大样本数。进行的实验表明,在插值阈值附近存在一个临界区间。

插值阈值意味着模型随着模型参数的数量、训练的长度、分布中的标签噪声量以及训练样本的数量而变化。临界区域只是参数化不足和参数化过度的风险域之间的一个小区域。

来源:https://www . less wrong . com/posts/frv 7 ryoqtvsuqbxut/understanding-deep-double-descent

在大多数研究中,偏差-方差权衡是经典统计学习理论中的一个基本概念。这个想法是,模型越复杂,偏差越小,但方差越大。

一旦模型复杂性超过临界区间,模型会过度拟合,方差项会控制测试误差,因此从这一点开始,增加模型复杂性只会降低性能,这称为双下降现象。

** [## 深度双重下降

我们证明了双重下降现象发生在 CNN、ResNets 和 transformers 中:性能首先提高,然后…

openai.com](https://openai.com/blog/deep-double-descent/)

本文定义了模型性能降低的三种情况,因为下面的状态变得更加重要。

(按型号)双重下降—型号越大,伤害越大

模范政权(来源:【https://arxiv.org/abs/1912.02292】)

论文展示了不同架构、数据集、优化器和训练过程中的模型式双下降现象。

该论文的结论是,通过在训练之前对数据集进行的常规修改(例如,添加标签噪声、使用数据扩充和增加训练样本的数量),测试误差峰值会向更大的模型移动**。**

此外,在上面的图表中,测试误差的峰值出现在插值阈值附近,此时模型刚好大到足以适合训练集。

(样本方面)非单调性—更多数据会造成伤害

样本政权(来源:https://arxiv.org/abs/1912.02292)

在本节中,图表显示了改变固定模型的训练样本数量的效果。增加样本数量会使曲线向较低的测试误差方向下移,但也会使峰值误差向右移动。

(纪元方式)双重下降-更高的纪元伤害

历朝政权(来源:【https://arxiv.org/abs/1912.02292】T21)

对于给定数量的优化步骤(固定的 y 坐标),测试和训练误差呈现出模型大小的双重下降。对于给定的模型尺寸,随着训练过程的进行,测试和训练误差减小、增大、再减小;我们称这种现象为划时代的双重下降。

增加训练时间会增加 EMC,因此在整个训练阶段,一个足够大的模型会从参数不足过渡到参数过多。

此外,具有更多宽度参数的较大模型(如 ResNet 架构)可能会经历显著的双下降行为,其中测试误差首先下降(比其他尺寸模型更快),然后在插值阈值附近上升,然后再次下降,如下所示。

来源:https://mltheory.org/deep.pdf

对于处于插值阈值的模型,实际上只有一个全局模型适合训练数据,强制它适应甚至小的错误指定的标签将破坏它的全局结构。然后,该论文得出结论,没有好的模型既能对训练集进行插值,又能在测试集上表现良好。

如上所述,这些关键机制的特征为实践者提供了一种有用的思维方式,希望很快在机器学习方面取得突破。

参考

[## 理解“深度双重下降”——less wrong 2.0

如果你不熟悉双重下降现象,我想你应该熟悉。我认为双重血统是一种…

www.lesswrong.com](https://www.lesswrong.com/posts/FRv7ryoqtvSuqBxuT/understanding-deep-double-descent) [## 深度双重下降

我们证明了双重下降现象发生在 CNN、ResNets 和 transformers 中:性能首先提高,然后…

openai.com](https://openai.com/blog/deep-double-descent/)

最后

随着 机器学习 社区每年的成长,会有越来越多的论文发表。这是我们的一部分,阅读新的和合理的文章,以装备自己在社区的最新和最先进的突破。继续阅读爱好者伙伴!

如果我已经设法让你注意到这一点,请留下评论,如果你对这个系列有任何建议,因为它将大大增加我的知识,改善我的写作方式。Prem Kumar是一个无私的学习者,对我们身边的日常数据充满热情。如果你想谈论这个故事和等待的未来发展,请在LinkedIn上与我联系。**

初级开发人员在面试中犯的 3 个错误

原文:https://towardsdatascience.com/3-mistakes-junior-developers-make-during-an-interview-1d624892fad0?source=collection_archive---------57-----------------------

对我采访软件开发人员的反思

丹尼尔·麦卡洛在 Unsplash 上的照片

如果你不能通过面试,成为一名天才软件工程师不会让你走得很远。我不是在谈论沟通技巧或不了解你面试的公司的实质性细节。那些问题在我看来在大多数情况下都不是决定因素。

相反,我会提到我见过的开发人员犯的错误,这些错误最终成为他们被拒绝的原因。这些问题也很容易解决,会在面试中产生巨大的影响。

反应太快

我在面试候选人时看到的最大错误是在了解问题之前就跳到解决方案。候选人渴望回答问题,所以他们相信自己越快想出解决方案,听起来就越聪明。但这不是我们的工作。

不要像翻译一样,把业务问题翻译成代码。你首先是一个问题解决者,然后才是程序员。你应该始终了解问题,尽可能多地提问,以了解问题的动态。不要急!

没有人指望你马上提供解决方案。被评估的是你处理问题的方式。

东奔西跑

我经常看到的另一个问题是,候选人害怕说“我不知道”你不必假装自己无所不知。即使是你在简历中提到过的事情,你也可以大声说出来。

当你不知道一些琐事时,很容易弄清楚(“Python 中如何处理哈希冲突?”).优秀的候选人知道总会有一些他们不知道的事情,所以他们只会给出一个自信的、没有歉意的“我不知道”这完全没问题,也是一个有效的答案。

你只有不到一个小时的面试时间。除了展示为什么你是最好的候选人之外,你必须确保你不会把它浪费在其他任何事情上。

质量差的代码提交

很多时候,在技术面试之前,你应该解决一个问题,然后把代码送回去。通常给你两天时间来写答案。你可以选择你觉得舒服的语言,如果你不太明白,也可以做一些假设。

一个糟糕的提交通常有两个错误——假设代码质量良好,解决方案可行。

  • 糟糕的文档:对于第一次看你的代码的人来说,没有以书面形式提及解决方案的关键部分是非常令人恼火的。在编写假设、使用的依赖项以及如何运行应用程序时,您必须非常谨慎。
  • 测试覆盖率:考虑到你通常得到的时间量,添加适当的测试并拥有最低 80 %的测试覆盖率应该不会太难。

一个快速的技巧是让你的朋友试着运行代码。如果他们能够运行并理解它,那么你就可以走了。

结论

这是我在面试应聘者时注意到的几件事。对我来说,做最后的决定有很大的不同。

“一般人只把 25%的精力放在工作上。这个世界向那些贡献了超过 50%能力的人脱帽致敬,而向那些贡献了 100%的人致敬。”—安德鲁·卡内基

这绝不是一个详尽的列表,也不能保证任何事情。但是把这些方面考虑进去肯定会给你的面试经历增加很多价值。

这是另一篇你可能会感兴趣的文章。

[## 3 个有助于你成为顶级开发者的习惯

这将有助于大大减少返工,并增强您的整体理解

levelup.gitconnected.com](https://levelup.gitconnected.com/3-habits-that-will-help-you-become-a-top-developer-7f310fa2c3b0)

我希望这篇文章对你有用!你可以跟着我。我也在推特上。欢迎在下面的评论中留下任何问题。我很乐意帮忙!

学生在开始学习数据科学时会犯的 3 个错误

原文:https://towardsdatascience.com/3-mistakes-students-make-when-starting-data-science-aa6081733a54?source=collection_archive---------11-----------------------

成为更好的数据科学家的技巧和资源

最近,我有幸作为小组成员参加了东北大学的新冠肺炎发现数据大会。目标很简单:从开源新冠肺炎数据中产生可操作的见解和/或预测模型,以帮助社区做出更好的决策。

我想写下一些我注意到的学生在资源上犯的常见错误,他们可以在那里找到更多的帮助。

忽略了良好可视化的价值

我坚信,如果没有有意义的可视化,您的分析和建模工作是没有价值的。视觉化不需要新颖,但必须是深思熟虑的和完整的。提高可视化的一些技巧:

  1. 添加轴标签和绘图标题:对“x”和“y”轴标签和 df $变量标题说不!这就像穿着运动裤去参加一个聚会,没什么不对,但你可能要重新考虑一下。

添加轴标签和标题(必要时添加图例)会使可视化更加有效。图片作者。

2.彩虹色是一大禁忌!色彩可以让剧情在视觉上刺激,但是太多了从来都不好。彩虹调色板的衰落已经被记录了几次,无数的帖子对此进行了更详细的讨论,一个简单的谷歌搜索就会发现无数的文章。
我的经验法则是:少用颜色,让观众注意到视觉的某个方面。

虽然彩虹调色板的颜色更丰富,但黑白更有价值。彩虹是混乱的,需要观看者不断地看着传说,然后理解故事情节。图片作者。

下面的帖子详细介绍了如何使用一些简单的工具来挑选更好的颜色,colorbrewer2.org是我经常使用的一个网站。

[## 如何为数据可视化选择更漂亮的颜色

为图表选择好的颜色很难。这篇文章试图让它变得更简单。我希望你感觉更自信…

blog.datawrapper.de](https://blog.datawrapper.de/beautifulcolors/)

3.选择正确的可视化:这听起来像是一句“废话,天才!”点,但从传达信息的意义上来考虑一个情节,而不是从数据中传达一个观察结果,这是值得的。下面的帖子是一个很好的起点。提示:试着为给出的例子想出不太理想的可视化效果。

[## 如何为您的数据选择正确的图表

如果您想要可视化数据,请确保使用正确的图表。虽然您的数据可能适用于多个…

infogram.com](https://infogram.com/page/choose-the-right-chart-data-visualization)

最后,如果你是一名东北学生,我强烈建议你参加一门可视化课程——比如 DS5500。

幻灯片很无聊,故事很有趣

讲故事非常有效地帮助观众理解你对数据和你试图解决的问题的观点。我喜欢带领我的观众踏上数据之旅,向他们展示我在哪里遇到了麻烦,并用可靠的数据可视化来支持我的决策。从一个简单的结构开始:

  1. 分析的目的:清楚地陈述你想要达到的目标和一个小要点,以及为什么这对某人有用。
  2. 数据:数据的一个小片段(标题)有助于将听众与手边的问题联系起来。当使用大型数据集时,重要变量的汇总统计会很有帮助。
  3. 分析、方法和结果:向观众介绍一些你执行的分析和使用的建模方法,必要时用可视化来补充。显示变量中的异常值、不一致和缺失,以及如何处理它们。
  4. 结论:这个比你想象的简单多了,重申结果,以及为什么有意义。我喜欢把这一部分看作是我的一两张幻灯片的概述。

熟能生巧,我发现 YouTube 是一个很好的资源。观察演讲者如何分析,并尝试思考是否有其他方式可以传达相同的信息。

最终想法:演示者就像牧羊人引导观众(羊)通过数据得出结论。当你得出结论的时候,你不希望羊群走失。

太快开始做模特了

从数据科学开始,我也渴望拟合模型,并在测试集上呈现最高的准确性。但是随着时间的推移,我意识到一个模型的好坏取决于用来建立模型的数据。探索性数据分析不仅能让你更好地理解数据,还能让你更好地向听众传达为什么要做出某些决定。作为一名数据科学家,我 70%的时间都花在清理数据和发现不一致的地方。

建模前需要考虑的几件事:

  1. 多重共线性和混杂变量:数据通常充满了噪音和混杂变量。查看可以消除哪些变量的一个简单方法是查看相关性热图,并对保留/删除显示明显相关性的变量进行推理。在我看来,这为你和你的观众完成了 80%的工作。
  2. 数据很乱!清理异常值,并考虑如何处理缺失值。真实世界的数据永远不会像你期望的那样,这很容易打乱你的分析,得出错误的结论。

这不是数据科学。来源:https://xkcd.com/1838/

[## 为什么数据科学不仅仅是?适合()。预测()

在这篇文章中,我将回顾一些我学到的让我从一名技术数据科学家变成…

towardsdatascience.com](/top-examples-of-why-data-science-is-not-just-fit-predict-ce7a13ef7663)

总之,关注你的听众,从数据中呈现一个故事。使用正确的可视化来帮助你的故事,并验证你选择的变量来创建模型。记住这些提示,通过实践,你将学会成为一名更好的数据科学家。

感谢阅读!

数据科学家最常被问到的 3 个 Python 面试问题

原文:https://towardsdatascience.com/3-most-asked-python-interview-questions-for-data-scientists-1a2ad63ebe56?source=collection_archive---------28-----------------------

面向数据科学家的顶级 python 面试问题

照片由法比奥在 Unsplash 上拍摄

许多博客和网站都有一些关于数据科学面试的问题和建议。然而,大多数数据科学面试也想测试候选人的软件工程技能。在这里,我们列出了在数据科学访谈中最常被问到的关于 Python 编程的 3 个问题。

链表和元组有什么区别?

这个问题其实是关于理解 Python 中的数据结构。什么时候使用列表,什么时候使用元组?这与一个没有进入前三名的问题密切相关,这个问题是关于什么是不可变的和易变的对象。我们将直接进入它。

元组是不可变的对象,而列表不是。简单地说,可变对象可以被改变,而不可变对象则不能。因此,一个列表有一个可变的大小,即,可以扩展,我们可以替换它的项目,而一个元组是不可变的,因此我们不能。

这种解释在大多数情况下足以通过面试问题,但在本帖中,我们会给你更多的细节,让你更好地理解它。

元组和列表都是用于存储项目集合的数据结构,这些项目可以是任何数据类型。元组和列表都使用索引来访问这些项目。这就是相似之处的终结。

元组的语法不同于列表,列表中的元组是用‘()’ 和列表‘[]’创建的。如上所述,元组是不可变的,这意味着如果你有一个这样的元组: my_tuple=('A','B','C'),并且你试图覆盖索引“0”处的元素,例如my_tuple[0]='D',这将抛出一个类型错误:TypeError: ‘tuple’ object does not support item assignment。如果你在修改一个列表,这种情况不会发生。

就内存效率而言,由于元组是不可变的,因此可以为它们分配更大的内存块,而列表需要更小的内存块来适应这种可变性。这里不要混淆。更大的内存块实际上意味着更少的内存占用,因为开销很低。因此,元组的内存效率更高,但如果预计它们会发生变化,那么使用元组并不是一个好主意。

什么是列表理解?

任何用 python 编程的人都可能遇到过这种符号,在这里你可以像这样做 for 循环。意志导致['E ',' x ',' a ',' m ',' p ',' l ',' e']。

列表理解是一种创建和定义列表的优雅方式,无需编写太多代码。此外,您可以像这样向列表理解添加条件:[ x for x in range(20) if x % 2 == 0]它只返回能被 2 整除的数字(包括 0)。

这里的一个关键点是,每个列表理解都可以使用普通的 for 循环重写。然而,并不是每个 for 循环都可以用列表理解格式重写。然而,通常情况下,列表理解更有效。如需更多分析,请访问此链接。

有时,列表理解被比作 lambda 函数(不要与 AWS Lambda 混淆),这是另一个在面试中经常出现的问题。Lambda function 实际上是做一个函数操作,就像你通常做的那样,但它是在一行中完成的。

举个例子,

def my_func(x):print(x+1)

可以转到这个 lambda 函数my_func=lambda x: print(x+1),这里可以像普通函数一样调用这个函数,例如my_func(2)

什么是装修工?

Python 中的装饰器是任何可调用的 Python 对象,用于修改函数或类,而不改变其底层结构。使用装饰器很容易,对于一个没有经验的程序员来说,编写装饰器可能很复杂。

让我们看看如何创建一个。

假设我们想要创建一个装饰器来将字符串转换成小写。

def lowercase_decorator(function): def wrapper():func = function()make_lowercase = func.lower()return make_lowercase return wrapper

我们定义了一个函数,它将另一个函数作为参数,并对传递的函数执行小写操作。

def say_hello():return ‘HELLO WORLD’decorate = lowercase_decorator(say_hello) 
decorate()

输出将是“hello world”。

然而,在实践中,我们使用' @ '符号作为我们上面所做的语法糖,以减少改变函数行为所需的代码。

在定义了我们的装饰器之后,我们可以得到如下结果:

@lowercase_decorator
def say_hello():return ‘HELLO WORLD’say_hello()

我们希望输出是相同的,即,“你好世界”。

用这三个数据科学项目打动你的招聘经理

原文:https://towardsdatascience.com/3-must-do-projects-for-every-aspiring-data-scientist-in-2020-c03ed888c017?source=collection_archive---------49-----------------------

用有影响力的项目打动你的招聘经理

向您展示各种不同的现实世界问题以及如何解决它们。

蒂姆·范德奎普在 Unsplash 上拍摄的照片

2020 年,如果你想进入数据科学和机器学习行业,教育背景是不够的。招聘人员和招聘经理希望看到真正的时间被投入到解决可能对企业和世界产生影响的现实问题中。如今,商业世界将数据科学用于各种目的,包括金融、零售、制造、运输等。拥有技术和实际的实践技能是将你与其他数据科学家区分开来的最重要的标准之一。您必须能够理解如何识别哪些业务相关的问题可以通过使用您所拥有的特定技能得到最好的解决。这就是为什么做那些接近真实世界的项目是重要的。我列出了 3 个与现实环境密切相关的项目,以及如何利用这些项目建立一个坚实有效的个人技能组合。

以下 3 个项目旨在解决成为数据科学家的一些核心基础问题:

统计和概率、数学、预测和逻辑建模、数据争论和预处理技能、数据可视化、机器学习、神经网络、CNN 等等。

新冠肺炎全球研究项目(CORD-19)

照片由空气焦点在 Unsplash 上拍摄

新冠肺炎全球疫情为数据科学家同事提供了一个绝佳的机会,让他们可以将自己的一些崇高工作投入到当前的形势中。CORD-19 数据集是与白宫和领先的研究小组联盟合作编制的,其中包括超过 140,000 篇学术文章,包括超过 65,000 篇全文,涉及新冠肺炎,新型冠状病毒和相关的冠状病毒病例。

你的目标?—开发强大的数据和文本挖掘工具,帮助医疗机构回答高优先级的科学问题

目前有 18 项任务需要一个全面的解决方案来准确回答美国国家科学院、工程和医学委员会新兴传染病和 21 世纪健康威胁常设委员会(NASEM 的 SCIED)和世界卫生组织(世卫组织)在疫情援助中提出的一些紧迫的科学问题。

[## tarunk 04/新冠肺炎案例研究和预测

这个库是一个案例研究,分析和新冠肺炎疫情传播的可视化,以及预测模型…

github.com](https://github.com/tarunk04/COVID-19-CaseStudy-and-Predictions) [## 新型冠状病毒 2019 数据集

新冠肺炎受影响病例的日水平信息

www.kaggle.com](https://www.kaggle.com/sudalairajkumar/novel-corona-virus-2019-dataset)

CORD-19 是一个巨大的 13.3Gb 数据集,包括超过 114k 个文件和 3000+列,具有 8 个不同的目标表— 人口、患者描述、材料、诊断、治疗干预、风险因素和模型,以准确提供关于该疫情的一些关键科学问题的相关答案。迄今为止,CORD-19 数据集已有超过 178 万次浏览和 73,000 次下载。许多重要的基础知识,如时序分析可视化 都经过测试,以开发出最终的工具。这个项目确实值得一试。

信用卡欺诈交易检测

由塞巴斯蒂安·赫尔曼在 Unsplash 上拍摄的照片

想象一下。你正在研究你的每月信用卡账单,你注意到附近的一家杂货店收取了 150 美元。问题是,你已经几个月没去商店买东西了。那笔可疑的费用可能是一个信号——你是信用卡诈骗的受害者。检测信用卡交易中的欺诈是金融研究中的一个巨大课题,具有深远的经济意义。此外,检测未经授权的信用卡交易是一个极其复杂的问题,因为如果单独使用,这些特征很少有用。

你的目标?— 预测和分析任何特定的信用卡交易是否是欺诈交易

* [## 信用卡欺诈检测

被标记为欺诈或真实的匿名信用卡交易

www.kaggle.com](https://www.kaggle.com/mlg-ulb/creditcardfraud)

布鲁塞尔自由大学(ULB)提供了 143Mb 的数据集,这是欧洲持卡人在 2013 年进行的交易。它包含 284,807 笔交易中的 492 个欺诈和 28 个匿名特征,这些特征经过了主成分分析(PCA)以保护用户身份和敏感特征。处理不平衡/偏斜数据异常检测逻辑回归等。是你在这个项目中会面临的一些问题,如果彻底分析,这些问题是真正有益的。*

项目推荐模型

照片由自由使用声音上的 Unsplash

随着 Youtube、亚马逊、网飞等在线公司和许多其他类似网络服务的兴起,推荐系统在我们的生活中占据了越来越多的位置,而我们却没有意识到这一点。最近的一项研究表明,网飞有超过 1300 个关于其所有用户的推荐集群,可以根据他们的观看行为(类型、观看时间、兴趣等)将正确的电影准确地部署在正确的用户面前。推荐系统目前被部署用于大型互联网公司和企业的各种任务,包括广告点击率(CTR)预测和排名。这些系统有时在一些行业中至关重要,因为当它们有效时可以产生大量的收入,或者是在市场中脱颖而出的一种方式。

你的目标?—使用 TensorFlow 开发基于客户项目的推荐模型

* [## 在 TensorFlow 中构建推荐系统:概述|解决方案

本文是一个多部分教程系列的概述,向您展示如何实现一个推荐系统…

cloud.google.com](https://cloud.google.com/solutions/machine-learning/recommendation-system-tensorflow-overview)

推荐模型是一种简单的算法,用于将正确的内容呈现在正确的用户面前。有相当多的方法被用来建立模型,如协同过滤、内容过滤、神经网络等。协同过滤是最广泛使用的系统,因为它们不同于基于内容的方法,因为它们不需要关于用户或项目的大量信息,并且它们仅基于用户和项目之间的交互信息(例如点击、浏览和评级)来做出准确的推荐。随着用户信息变得越来越丰富,这些算法中的每一个算法的复杂度都在增加。除了可视化统计分析数据处理等,该项目主要关注当前算法的实现,以构建一个健壮的推荐模型。

此外,推荐模型目前也在研究使用深度神经网络。在中国科学院大学 2017 年提出的一篇论文中,作者演示了基于深度神经网络的推荐模型的实现

来源:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8247172

DNN 的方法正在获得巨大的吸引力,甚至谷歌也有一个关于如何构建、测试和部署系统的使用 TensorFlow 的迷你课程。

[## 深度神经网络模型|推荐系统

上一节向您展示了如何使用矩阵分解来学习嵌入。矩阵的一些限制…

developers.google.com](https://developers.google.com/machine-learning/recommendation/dnn/softmax)

从整体上看,推荐模型仍然是数据科学中最重要的支柱之一,它为企业和经济带来了积极的好处。如上所述,将 DNN 模型应用于基于内容的推荐系统的有效性和实现细节也与机器学习领域中的原始算法一起被积极地研究。

最后

上述项目对我们当前的经济产生了切实的影响。从在疫情中提供真正的价值到识别无现金欺诈,我相信不仅学到了新的技能,而且最终推动了使用数据科学和机器学习可以解决什么问题的界限。

如果我成功地让你注意到了这一点,请留下你的评论,如果你对这个系列有任何建议,因为这将大大增加我的知识,改善我的写作方式。 普雷姆·库马尔 是一个无私的学习者,对我们身边的日常数据充满热情。如果你想谈论这个故事和等待的未来发展,请在LinkedIn上与我联系。*

3 个必备的 JupyterLab 2.0 扩展

原文:https://towardsdatascience.com/3-must-have-jupyterlab-2-0-extensions-41024fe455cc?source=collection_archive---------3-----------------------

JupyterLab 刚刚成为一个成熟的 IDE,具有代码辅助、调试和 Git 等功能——欢迎来到笔记本编辑的未来。

维克多·加西亚在 Unsplash 上拍摄的照片

我很高兴地确认,在最新扩展的帮助下,JupyterLab 刚刚成为一个成熟的 IDE。一周前,我提到了我在用 JupyterLab 编辑笔记本时注意到的几个缺陷——不存在的代码帮助就是其中之一。

不久之后,JupyterLab-LSP 的一位主要开发人员联系了我,并向我展示了他们的扩展。我尝试了一下——这是 Jupyter 生态系统的一大进步。

在 JupyterLab 生态系统中仍然有一些缺失的部分,使它至少在功能上等同于 PyCharm。但现在不是了。

这里有几个你可能会感兴趣的链接:

- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)

上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。

如果你错过了我之前关于这个话题的文章:

[## 你还在用 JupyterLab 吗?

数据科学城推出了一款新的高端产品。它有优越的编码辅助,调试和更多…是吗…

towardsdatascience.com](/are-you-still-using-jupyterlab-ce1a4339c0a9) [## JupyterLab 2.0

让我们来一窥 Jupyter 笔记本编辑的未来。有了编码等特性,未来看起来一片光明…

towardsdatascience.com](/jupyterlab-2-0-edd4155ab897)

JupyterLab-LSP

LSP 为 JupyterLab 增加了代码辅助功能。阅读 JupyterLab 2.0 。要了解更多信息:

[## JupyterLab 2.0

让我们来一窥 Jupyter 笔记本编辑的未来。有了编码等特性,未来看起来一片光明…

towardsdatascience.com](/jupyterlab-2-0-edd4155ab897)

使用 JupyterLab-LSP 在 JupyterLab 中完成代码

调试器

我曾经用 pdb 包在 JupyterLab 做调试——那是一个痛苦的过程。几天前,我听说了一个新的调试扩展,我很想尝试一下:

[## jupyterlab/调试器

JupyterLab 调试器 UI 扩展。这个扩展正在积极开发中。JupyterLab 2.0+xeus-python 0 . 7 . 1+…

github.com](https://github.com/jupyterlab/debugger)

合适的调试器是 JupyterLab 生态系统中最后缺失的部分之一。所有对最新的 JupyterLab 扩展的开发者的赞美——第一次安装就能工作,写得很好的文档等等。调试器扩展也是如此。注意,调试器仅支持 JupyterLab ≥ 2.0,它仍在积极开发中。

如何启用调试器?

创建一个新的 xpython 笔记本,启用调试并打开调试窗格。

调试器在 xpython Notebook 中工作——x 是 xeus 的缩写,xeus 是一个旨在帮助 Jupyter 实现内核的库。它承担了实现 Jupyter 内核协议的负担,因此开发人员可以专注于实现内核的解释器部分。

如何使用调试器?

要使用调试器,请启用右上角的橙色开关,设置一个断点并执行代码。使用右边的调试面板调查变量。

我通过调查函数中变量的值来尝试调试器——这是使用 pdb 包时最大的痛点——它工作得很好。我还试图研究一个类和一个数据帧的值。这一切都完美无缺。

怎么安装?

请确保您安装了 JupyterLab 2.0 或更高版本,并且启用了扩展管理器。然后安装要求:

pip install xeus-python==0.7.1
pip install ptvsd

要安装扩展,请运行:

jupyter labextension install [@jupyterlab/debugger](http://twitter.com/jupyterlab/debugger)

JupyterLab-Git

如果你曾经将一个 Jupyter 笔记本推送到 Git,然后对它做了一些修改,再推一次,你就知道 Git 的 diff 功能是没用的——它标记了一切。我使用了一个在推之前重置所有输出的变通方法,但有时我会忘记(或者 JupyterLab 没有保存最新的状态),最后出现了一个大混乱。我真的对这一个感到兴奋。它会符合我的期望吗?

让我们试试吧

我打开右边的 git 面板。然后我去掉 3 个细胞,再加上 3 个细胞。diff 功能运行良好。

哇,我真的被这一个惊呆了。我在笔记本上做了一些改动,diff 功能运行得很好。向 jupyterlab-git 团队致敬。

提示:还原笔记本中的更改时,首先关闭笔记本,然后使用“还原”。效果更好

提交历史记录

探索带有 jupyter-git 责任的提交历史

您可以观察提交历史—这是一个致命的特性。它甚至显示图像。你终于可以观察到同事做了什么改变,而不用翻阅整个笔记本。

怎么安装?

请确保您安装了 JupyterLab 2.0 或更高版本,并且启用了扩展管理器。然后运行:

pip install --upgrade jupyterlab-git
jupyter lab build

安装完成后,Extension Manager 显示软件包已经过时,所以我点击了 update,等待了一段时间,确认了重建并重启 jupyter-lab。然后成功了!

结论

就像我在以前关于 JupyterLab 的文章中提到的——笔记本编辑的未来是光明的,☀️。当 vim 扩展和代码格式化程序扩展可用时,我将切换到 JupyterLab 2.x。在那之前,我将坚持 will JupyterLab 1.2。

在你走之前

在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。

由考特尼·海杰在 Unsplash 拍摄的照片

给初学者的 3 个 MySQL 头脑风暴问题

原文:https://towardsdatascience.com/3-mysql-brain-storming-questions-for-a-beginner-c99ad01963ee?source=collection_archive---------54-----------------------

SQL 问题,以评估和提高初学者的技能

内特·格兰特在 Unsplash 上的照片

T 他的文章总结了我在解决各种 MySQL 难题时发现的有趣且具有挑战性的问题。这些将向您介绍 MySQL 世界的 3 个领域,即:

  1. CASE WHEN 语句。
  2. 比较运算符。
  3. 正则表达式。

我相信尝试解决这些问题是 MySQL 初学者评估他们目前所学技能的一个更好的方法。让我们来看看这些问题。

1.标记二叉树节点

这个挑战是标记二叉树的节点。

查询:将二叉树节点标记为根节点、内部节点和叶节点。

对于那些不熟悉二叉树的人来说,它看起来会像下面这样:

二叉树

节点 1:根节点(没有父节点,有 0 个或更多子节点)

节点 4、5:内部节点(具有父节点和一个或多个子节点)

节点 9、8、2、3:叶节点(有父节点,没有子节点)

设 N 为节点,P 为 N 的父节点,则上述二叉树的数据表如下:

双星树

为了解决上述问题,可以使用 MySQL CASE,其语法如下。

基本 SQL CASE 语句语法:

CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...WHEN conditionN THEN resultNELSE result
END;

SQL 将二叉树节点标注为根节点、内节点和叶节点:

SELECT N,
CASEWHEN P IS NULL THEN 'Root'WHEN N IN (SELECT P FROM BinaryTree) THEN 'Inner'ELSE 'Leaf'
END
from BinaryTree;

输出:

解释:

  1. 节点 1:P 的值为空,因此节点 1 是根节点。
  2. 节点 4、5:满足这个条件“当 N 在(从 BinaryTree 中选择 P)”因此它们是内部节点。
  3. 节点 9、8、2、3:无法满足上述两种情况中的任何一种,因此它们是叶节点。

2.查找中间值

不幸的是,MySQL 没有计算列的中值的默认函数。有多种方法可以实现这一点,但是,我想分享实现这一点的详细解决方案。

**中位数:**中位数是奇数排序列表中的中间数,也是偶数排序列表中中间数的平均值。

考虑以下数据:

标记数据集—奇数

上述案例中的中位数是 30

标记数据集—偶数

上述案例中的中位数是 35 岁

奇数值集的 MySQL 解决方案:

当参考标记数据集-奇数时,很明显,值 30 在其之前具有相同数量的元素(aka。2 个值)和它下面的元素的相同元素(也称为。2 值)。可以按照下面的步骤找到中间值。

  1. 对于每个值,计算比它小的值的个数。
  2. 对于每个值,计算大于它的值的个数。
  3. 找出上面和下面有相同数量的值的值。这将是中间值。

伯爵

在上表中,值 30 有相等数量的大于它的值和相等数量的小于它的值。因此,中值为 30。

SQL 查找奇数个数据值的中值:

SELECT marks as Median FROM MarksTable m
WHERE (SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks);

偶数集的 MySQL 解决方案:

可以按照下面的步骤找到偶数组值的中值。

  1. 对于每个值,找出值的个数加上大于它的个数的 1,并在该计数上加 1。就当是 x 吧。
  2. 对于每个值,找出小于它的值的个数。顺其自然吧。
  3. 找出数据集中 X = Y 的值,设它为 z。
  4. 对于每个值,找出值的个数加一,小于它的个数加一。假设它是 X1。
  5. 对于每个值,找出大于它的值的个数。就当是 Y1 吧。
  6. 找出数据集中 X1 = Y1 的值。假设是 Z1。
  7. 中位数是 Z 和 Z1 的平均值。

计数

根据上表,Z 值为 40,Z1 值为 30。因此,中位数是这两个值的平均值,即 35。

SQL 查找偶数个数据值的中位数:

SELECT avg(marks)as Median FROM MarksTable m
WHERE (SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) + 1 = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks)
OR(SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks) + 1)

因此整个查询找出的中位数会如下:

如果数据值的数目可被 2 整除,则该列中的值为偶数,否则为奇数。

SELECT IF (SELECT COUNT(marks, 2) FROM MarksTable) = 0,(SELECT avg(marks)as Median FROM MarksTable mWHERE (SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) + 1 = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks)OR(SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks) + 1)
),SELECT marks as Median FROM MarksTable mWHERE (SELECT COUNT(marks) from MarksTableWHERE m.marks > marks) = SELECT COUNT(marks) from MarksTableWHERE m.marks < marks)
));

3。查找不以元音字母开头和结尾的名字:

考虑下面的学生姓名数据表:

学生表

查询:查找不以元音字母 开头和结尾的学生姓名

MySQL 支持 REGEXP 操作符进行基于正则表达式的模式匹配操作。

解决上述查询所需的模式是:

  1. ^:检查字符串的开头。
  2. $:检查字符串的结尾

查询:

SELECT name FROM studentTable WHERE name NOT IN (SELECT name FROM studentTable WHERE name REGEXP '^[aeiou]' or name REGEXP '[aeiou]$';

输出:

感谢阅读!

用于地理空间分析数据科学项目的 3 个新数据集

原文:https://towardsdatascience.com/3-new-datasets-to-use-for-your-geospatial-analysis-data-science-projects-1fc210488e2?source=collection_archive---------37-----------------------

新数据科学项目的新数据集

格雷格·罗森克在 Unsplash 上的照片

早在三月份,我写了一篇关于“冠状病毒数据可视化使用 Plotly ”的文章,这篇文章引起了很多关注。由于受欢迎程度,我带着更多专注于地理空间分析的数据科学项目回来了。

如果你想学习如何使用 Plotly 创建可视化效果(如下图所示),点击这里 查看我的教程

这一次,我带来了三个新的数据集,您可以使用它们来构建新的、令人兴奋的可视化效果!

说到这里,我们开始吧…

北美停车统计

[## 北美停车统计

在北美搜索停车位所需时间的数据

www.kaggle.com](https://www.kaggle.com/terenceshin/searching-for-parking-statistics-in-north-america)

该数据集可识别城市中驾驶员在寻找停车位时遇到困难的区域。城市可以利用这些数据来识别问题区域、调整标识等。仅包括人口超过 10 万的城市。

下面列出了一些有趣的统计数据:

  • AvgTimeToPark:搜索停车场所用的平均时间(分钟)
  • AvgTimeToParkRatio:在当前 geohash 中搜索停车场所花费的平均时间与未搜索停车场所花费的平均时间之比
  • TotalSearching:寻找停车位的司机数量
  • 搜索百分比:搜索停车位的司机的百分比

世界各地的危险驾驶点

[## 世界各地的危险驾驶点

事故发生率最高、刹车最猛的地方

www.kaggle.com](https://www.kaggle.com/terenceshin/hazardous-driving-spots-around-the-world)

该数据集根据特定区域内的紧急制动和事故级别事件来识别驾驶的危险区域。每个月都会生成一组新的危险驾驶区域,并封装一年的滚动数据(即从前一个月到前一年)。与每个区域相关联的是基于该区域中的发生频率和所述发生的严重性的严重性分数。数据是过去 12 个月的汇总数据。

下面列出了一些有趣的统计数据:

  • SeverityScore:每个区域的严重性分数,即每 100 个交通流量单位的紧急制动事件和事故级别事件的数量。交通流量定义为 geohash 中每小时的车辆总量
  • 事件总数:geohash 中发生的紧急制动事件和事故级事件的总数

新冠肺炎对机场交通的影响

[## 新冠肺炎对机场交通的影响

COVID 后交通量分析

www.kaggle.com](https://www.kaggle.com/terenceshin/covid19s-impact-on-airport-traffic)

该数据集显示了进出机场的交通量占基线期交通量的百分比。用于计算此指标的基线期是从 2020 年 2 月 1 日到 3 月 15 日。数据集每月更新一次。

下面列出了一些有趣的统计数据:

  • PercentofBaseline:该日期的旅行与基线期内一周同一天的平均旅行次数相比所占的比例

感谢阅读!

我希望你觉得这些数据集有趣/有用。欢迎在评论中分享你的可视化链接。一如既往,我祝你在努力中好运!

不确定接下来要读什么?我为你挑选了另一篇文章:

[## 如何用 Choropleth 图显示疫情冠状病毒

关于 Choropleth 地图的介绍和教程

towardsdatascience.com](/visualizing-the-coronavirus-pandemic-with-choropleth-maps-7f30fccaecf5)

特伦斯·申

  • 如果你喜欢这个, 跟我上 Medium 了解更多
  • 关注我Kaggle了解更多内容!
  • 我们连线上LinkedIn

3 开源安全风险以及如何解决它们

原文:https://towardsdatascience.com/3-open-source-security-risks-and-how-to-address-them-82f5cc776bd1?source=collection_archive---------36-----------------------

你需要知道的是

迈克尔·盖格在 Unsplash 上的照片

开源软件非常受欢迎,并构成了商业应用程序的重要组成部分。据 Synopsys 报道,99%的商业数据库至少包含一个开源组件,这些代码库中有近 75%包含开源安全漏洞。

公司和开发人员选择使用开源软件的一个主要原因是,它使他们不必自己开发这些基本功能。

哦,开源软件是免费的!

尽管有其优势,开源软件往往有可能影响您的数据和组织的漏洞。为了让您大致了解开源安全风险如何影响您的业务,我们列出了三大开源安全风险以及解决它们的方法。

在深入本文之前,我们先来看看开源漏洞到底是什么。

什么是开源漏洞?

开源漏洞基本上是开源软件中的安全隐患。这些是脆弱或易受攻击的代码,使得攻击者能够进行恶意攻击或执行未经授权的意外操作。

在某些情况下,开源漏洞会导致拒绝服务(DoS)等网络攻击。它还可能导致重大违规,在此期间,攻击者可能会未经授权访问组织的敏感信息。

当谈到开源软件时,有很多安全问题。例如,OpenSSL 是一个加密库,负责管理各种互联网连接软件的高度敏感的数据传输功能,包括运行一些最流行的电子邮件、消息和 web 服务的软件。

你还记得《心脏出血》吗?是的,那引起了不小的轰动!是的,那是 SSH 库中一个严重的开源漏洞。

同样,2014 年在 Bash shell 中发现了另一个流行的开源漏洞,Bash shell 是许多 Linux 发行版上的默认命令处理器。它有一个任意命令执行漏洞,可以通过 web 服务器上的服务器端 CGI 脚本和其他机制进行远程攻击。这种开源漏洞通常被称为“Shellshock”。

3 大开源安全风险是什么?

既然您已经对什么是开源安全风险有了一个合理的想法,那么让我们来探讨一下目前存在的三大开源安全风险,以及如何减轻这些风险。

软件安全风险

开源漏洞一旦被发现,就可能成为攻击者利用它们的诱人目标。

通常情况下,这些开源漏洞以及关于如何利用漏洞的细节都是公开的。这使得黑客能够获得实施攻击所需的所有必要信息。结合开源软件的广泛使用,你可以想象当一个开源漏洞被发现时,它会造成多大的破坏。

组织在解决开源漏洞时面临的主要挑战之一是跟踪漏洞及其修复并不像人们想象的那么容易。

由于这些开源漏洞发布在各种平台上,因此很难跟踪它们。此外,查找更新版本、补丁或修复程序来解决安全风险是一个耗时且昂贵的过程。

一旦开源漏洞及其利用途径被公布,攻击者利用它们并侵入您的组织只是时间问题。企业必须集成必要的工具和流程来快速解决开源漏洞。

功勋的宣传

开源漏洞在国家漏洞数据库(NVD) 等平台上公开,任何人都可以访问。

公开可用的开源漏洞导致的攻击的一个著名例子是 2017 年的重大 Equifax 违规,该信用报告公司泄露了 1.43 亿人的个人信息。这次攻击的发生是因为 Equifax 使用了一个具有高风险漏洞的开源 Apache Struts 框架版本,攻击者利用了这个漏洞。

这种对开源软件的攻击不仅会导致数据泄露或丢失,还会影响公司的市场声誉、估值和客户关系。这反过来会影响您的客户流失率、保留率、销售额和收入。处理由开源漏洞造成的违规影响可能是一个漫长而痛苦的过程。

许可合规风险

开源软件附带一个许可证,允许在定义的准则下使用、修改或共享源代码。然而,这些许可证的问题是,它们中的大多数不符合开源的严格的 OSI 和 SPDX 定义。

除此之外,单个专有应用程序通常包括几个开源组件,这些项目以各种许可类型发布,如 GPL、Apache 许可或 MIT 许可。

组织被要求遵守每一个单独的开源许可,这可能是相当压倒性的。尤其是随着快速开发和发布周期的到来,商业随之而来的事实是,现在存在将近 200 多种开源许可类型。

一项对 1253 个应用程序的研究发现,大约 67%的代码库有许可冲突,33%的代码库有未经许可的软件。不遵守许可证规定会使企业面临法律诉讼的风险,影响您的运营和财务安全。

您如何战胜这些开源安全风险?

接下来,让我们仔细看看这些开源安全风险的解决方案。

建立安全第一的文化

开发人员常常根据他们需要的功能和编程语言选择使用开源组件。虽然功能很重要,但也应该包括其他标准。

例如,项目的每个单独的组件都可以提供功能,而不需要集成整个项目代码库。这有助于限制开源软件的数量,并有助于简化集成,消除安全风险,以及降低非必需组件中的源代码复杂性。

开源软件和其他软件一样可能存在安全风险,所以你选择使用的每个组件都必须提供功能并且安全。

除此之外,开源项目通常专注于为最终用户提供具有新特性的新更新。由于时间和预算的限制,企业不太重视安全性,更倾向于尽快发布更新。

然而,公司应该在新版本之间保持平衡,同时确保设计、实现和代码是安全的。

你可以做的最重要的事情之一是清点你使用的开源软件,并跟踪与这些库相关的漏洞。

拥抱自动化和扫描开源软件中的漏洞

发现并修复开源软件中的漏洞本身就是一个巨大的挑战。公司需要找到一种方法来检测其环境中开放源代码中的所有安全漏洞,定期更新列表,促使开发人员远离旧的、不安全的软件组件,并最终在发现安全漏洞时部署补丁。

解决这个问题的一个方法是引入自动化工具,帮助您持续跟踪您的开源使用情况,并识别安全弱点、漏洞、修复和更新。

开源软件的自动化工具有助于识别哪些项目中使用了哪些包,它们包含哪些安全漏洞,以及如何修复它们。这些工具通常还带有警报功能。如果发现了漏洞,就会向相关的开发和安全团队发送通知,提醒他们新发现的安全风险。

集成自动化来扫描开源软件中的安全漏洞对于大型组织来说尤其重要,因为很难跟踪和识别所有正在使用的源代码中的漏洞。

大多数企业甚至不知道他们拥有的应用程序的完整清单,这使得他们更容易受到网络攻击,因为源代码中存在未知的漏洞。一份报告称,近 88%的代码库在过去两年中没有任何开发活动。

交叉培训你的员工

雇佣既精通开发又精通安全的专业人士并不总是容易,甚至是不可能的。然而,培训你的团队是可能的,这样他们可以从两端着手解决问题。虽然为不同的团队定期举行网络安全意识培训并不容易,但这对项目的整体安全性至关重要。

企业应确保其开发人员对网络安全有一个大致的了解,以及最新的趋势和更新。您的开发人员应该能够识别开源代码中出现的常见安全问题,如果没有修复它们的话。

同样,安全团队应该从早期阶段就参与开发过程。与其让安全性成为事后的想法,不如从项目一开始就把它放在优先位置。

正如您分析和跟踪您的开发过程一样,您也应该主动监控您的安全工作。采取积极主动的方法对准备处理开源安全风险大有帮助。

最后的想法

开源是一个优秀的模型,在当今的许多项目中都可以找到。然而,为了确保安全的开源代码,您需要认识到开源软件带来的安全风险。您必须确保您的每个开源组件都为项目提供了价值,并且是安全的。

Cypress Data Defense 通过推荐最佳安全实践,帮助公司进行安全审计并加强其项目的整体安全性。

我们帮助企业创建发布安全更新的路线图,提供开源支持、扫描、监控,并提供安全有效利用开源软件的解决方案。借助 Cypress Data Defense,组织可以获得对其开源组件的必要控制,以降低开源安全风险,同时增加成本节约。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

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

3 Pandas 函数控制数据帧

原文:https://towardsdatascience.com/3-pandas-functions-to-rule-the-data-frames-813b46ff3099?source=collection_archive---------28-----------------------

照片由 Xtina Yu 在 Unsplash 上拍摄

Pandas 是一个广泛的 Python 库,数据科学家在许多领域使用它。如果你使用过微软的 Excel 或者 MySQL,你应该已经熟悉了关系数据结构。您必须熟悉按行和列排列的数据。我是在学习 Python 的机器学习的时候开始了解这个库的。Pandas 不仅为你提供了进行大量数据分析和统计推断的工具,而且因为它是建立在 Numpy(另一个重要的 Python 库)之上,它被证明是一个构建高度复杂的机器学习和人工神经网络算法的平台。Pandas 提供的三种主要数据结构是数据序列(一维)、数据帧(二维)和数据面板(多维)。Pandas 配备了大量的函数和类,给你足够的能力来处理任何数据分析问题。在本文中,我们将讨论数据框的三个主要功能,这些功能不仅在几乎所有问题/项目中都有应用,而且如果理解了这些功能,将会证明是至关重要的。让我们不要进一步延伸,直接跳到函数。

  1. **布尔屏蔽:**布尔屏蔽是一种数据帧切片技术。在大多数问题中,我们需要满足特定条件的数据框的子集,例如,可能会要求您在学生分数和成绩的数据框中过滤出通过特定测试的学生的数据,或者从人口普查数据框中过滤出识字的男性的数据。熊猫的这类问题可以很容易地通过布尔掩蔽来解决。为了理解这个概念,让我们考虑如下所示的数据帧(df1 ):

上述数据表总结了 4 名学生(A、B、C、D)在 4 门学科(数学、物理)中取得的分数百分比。,化学。,和 Prog。).为了便于理解,只显示了 10 个数据条目。在 pandas 中,每个数据帧都有一个与之相关的索引。它是标识数据条目或数据行的东西。在当前数据框中,Student 列被视为索引(还要注意,Pandas 中的索引与 MySQL 中的主键不同,因为索引条目可以重复)。在布尔屏蔽中,我们将一个布尔序列(一系列真、假值)传递给数据帧,然后根据数据帧索引进行匹配。返回索引与真值匹配的所有数据条目,不返回索引与假值匹配的那些条目(行)。通过回答与上述数据框相关的几个问题,我们将更清楚地理解布尔掩蔽。如果我们被要求从上面的数据框中只取出学生 A 的数据,我们将不得不首先创建条件语句,这将创建一个我们想要的布尔序列。如果我们写 df1['学生']= ' A ',它会将值' A '与学生列匹配,如果满足条件则返回 True,否则返回 False】。上述条件语句将返回如下所示的序列:

错误的

错误的

错误的

错误的

错误的

错误的

错误的

错误的

仔细观察以上系列。该系列仅在满足给定条件df1[' Student ']= = ' A '【T11]的地方包含真值。上面创建的布尔序列可以作为索引参数传递给数据框,以过滤掉数据。该语句可以写成:

*df1[ df1[‘Student’] == ‘A’ ]*

上述语句将只返回学生姓名为 A 的那些数据条目,而忽略所有其他条目:

到目前为止,布尔屏蔽背后的思想应该是清楚的。这是一个强大的工具,也可以解决更复杂的问题,例如:提取那些数学成绩超过 50%的学生的数据

*df1[ (df1[‘Subject’] == ‘Maths’) & (df1[‘%age Marks’] > 50) ]*

布尔掩码适用于所有类型数据框架,且在几乎所有类型的问题/项目中被证明是一个方便的工具

2.**分组数据:**分组数据是数据科学家面临的另一个要求,例如,在当前数据框架的上下文中,我们可能会被要求找出每个学生获得的总分或平均分,或者学生获得的学科总分或平均分等。熊猫通过群和函数解决这类问题。我们就直接用这个函数来理解吧。让我们试着解决第一个问题。“每个学生获得的总分数”。这些问题要求我们首先将每个学生的数据分组,然后找出总分或平均分。编程方式如下所示:

*df1.groupby(‘Student’)*

它会将相同的学生及其相关数据分组在一起。通过下图可以理解:

当运行*df1 . group by(‘Student’)*时,可以认为原始数据帧根据学生的名字分成了 4 个不同的数据帧。现在我们有了不同学生的不同数据框架,通过熊猫提供的聚合函数,我们可以很容易地找出每个学生获得的总和或平均分数。

*df1.groupby(‘Student’).sum()* 

会给我们每个学生的总分表

*df1.groupby(‘Student’).mean()* 

会得出平均值。通常,我们可以通过下面提到的命令创建基于列的组:

df1.groupby('col_name')

或者,我们可以将列名列表传递给 groupby 命令,根据多个列进行分组:

df1.groupby([‘col_1’, ‘col_2’, ‘col_3’])

3.**合并:**到目前为止,我们只讨论了适用于单个数据帧的操作,但这并不是数据分析受限的地方。很多时候,我们被要求对多个数据框架进行分析。为了了解合并的概念,让我们介绍另一个学生数据框( df2 ):

上述数据框显示了学生参加体育活动的信息。与前一个数据框架一起,体育数据框架可以与它合并,以提取许多有意义的信息。在开始编程之前,让我们先了解一下合并过程。两个数据帧主要可以通过如下所示的 4 种不同方式进行合并:

两个圆圈表示任意两个数据帧,而 a、b、c 表示三个可能的区域。区域 b 被称为两个数据帧的交集。类似地,区域 a 是数据帧 1 ( df1 )减去交集部分,类似的解释也适用于区域 c

四种可能的合并过程是:

  1. **左合并:**区域 a +区域 b 。在当前数据框的上下文中,它将是 marks 数据框中提到的所有学生的运动详细信息。在 Pandas 中,它是通过运行以下命令来实现的:
 *df1.merge(df2, on = ‘Student’, how = ‘left’)*

on = 'Student '属性表示合并必须在 Student 列上完成,how = 'left '表示合并过程必须是左侧的。上述命令将生成如下所示的表格:

注意,在左侧合并中,左侧数据帧占优势,并且从右侧数据帧中提取附加信息。此外,请注意 Nan 值,这些值会在缺少信息的地方插入。

2 **。右合并:**右合并与左合并含义相同,只是数据帧被翻转,即代表区域 b + c 。在 Pandas 中,它是通过运行以下命令来实现的:

*df1.merge(df2, on = ‘Student’, how = ‘right’)*

这些属性具有通常的含义,并将生成如下所示的数据框:

上表包含右表中的所有条目,以及从左表中提取的附加信息。此外,请注意,所有在右表中而不在左表中的条目在左数据框的列上都有 Nan 值

3.内部合并:这代表两个数据帧的交集,即区域 b 。熊猫同样的命令如下:

*df1.merge(df2, on = ‘Student’, how = ‘inner’)*

结果数据帧将是:

请注意,只包括了出现在两个数据帧中的那些条目的信息

**4。外部合并:**外部合并是指两个数据帧的合并。在上述图表的上下文中,它表示区域 a +区域 b +区域 c 。在熊猫中,这种现象表现为:

*df1.merge(df2, on = ‘Student’, how = ‘outer’)*

并将产生如下所示的数据帧:

在外部合并中,包含两个数据帧中存在的所有条目,并且所呈现的数据点由 Nan 表示

虽然 Pandas 是一个由许多强大的类和函数组成的包,但上面包含的三个是经常使用的,很少有其他函数足以执行非常复杂的数据分析任务。要进一步了解这个话题,你可以参加密歇根大学 Coursera 上的数据分析课程,或者阅读 Matt Harrison 的书《学习熊猫》

希望你喜欢这篇文章,你可以在下面提出你的疑问,或者通过 LinkedIn 联系我,了解关于这个话题的更多问题。

谢谢,

祝你玩得愉快😊

原载于 2020 年 5 月 14 日 https://www.wildregressor.com

3 只熊猫让你的数据生活变得轻松

原文:https://towardsdatascience.com/3-pandas-trick-to-easing-your-data-life-984a0dac5311?source=collection_archive---------32-----------------------

你可以在日常工作中运用的一些熊猫技巧

由 Unsplash 上的回声网格拍摄

作为一名数据科学家,我们的日常工作包括提取数据、理解数据、清理数据、转换数据和创建新功能。注意我没有包括创建一个机器学习模型?因为创建一个模型将是我们做的最后一件事,它不一定是我们的日常工作。然而,清理数据是日常工作。

基于以上原因,我想向你展示三个漂亮的熊猫技巧,让你的数据工作变得更简单。

1.使用查询进行数据选择

作为数据科学家,数据选择是最基本的活动,但也是最麻烦的事情之一,尤其是在重复进行的时候。让我给你看一个例子。

#Let's use a dataset example
import pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.head()

上面是我们的数据集示例,假设我想选择 mpg 小于 11 或马力小于 50 且 model_year 等于 73 的行。这意味着我需要像下面这样写代码。

mpg[(mpg['mpg'] < 11) | (mpg['horsepower'] <50) & (mpg['model_year'] ==73)]

典型数据选择方法结果

这是选择数据的通常方式,但有时因为条件太多而很麻烦。在这种情况下,我们可以使用来自 Pandas 数据框对象的查询方法

那么,这个查询方法是什么呢?这是一种从熊猫数据框中选择的更人性化的方法。下面让我给你看一个例子。

mpg.query('mpg < 11 or horsepower < 50 and model_year == 73')

查询方法的结果

结果和平时的选拔方式一模一样吧?唯一的区别是,对于查询,我们有一个不太冗长的条件,我们将它写在字符串中,其中查询方法接受字符串英语单词,如示例中所示。

通常的选择方法和查询方法的另一个简单区别是执行时间。让我们看看下面的例子。

通常的选择方法需要 18ms,查询方法执行代码需要 13ms。在这种情况下,查询方法是一种更快的选择方法。

2.用替换、掩码和 where 替换值

当我们处理数据时,我确信有时需要用其他特定值替换列中的一些值。如果我们手动操作,可能会很麻烦。让我们说,在我的 mpg 数据集之前,我想取代所有的气缸整数值到一个字符串值。我举个例子,说明如何手动替换。

def change_value(x):if x == 3:return 'Three'elif x == 4:return 'Four'elif x == 5:return 'Five'elif x == 6:return 'Six'else:return 'Eight'mpg['cylinders'] = mpg['cylinders'].apply(change_value) mpg.head()

用函数替换值的结果表

在最简单的情况下,我们需要使用 Pandas 数据框对象中的 apply 方法,或者您可以使用 for 循环方法手动完成。无论哪种方式,每次需要替换一个值时都要这么做,这很麻烦。

在这种情况下,我们可以使用 Pandas 数据框对象中的替换方法。这是一种专门用来帮助我们替换数据框中特定值的方法。下面让我给你看一个例子。

mpg.replace({'cylinders' : {3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six', 8 : 'Eight'}}, inplace = True)mpg.head()

用 replace 方法替换值的结果表

结果是一样的,唯一的区别是我们用来替换值的行有多短。在我上面的例子中,我使用 dictionary 对象来指定我想要替换哪些列的值,并使用字典中的另一个字典来选择我想要替换哪些值和替换值。换句话说,它可以概括为{列名:{列中的值:替换值}}。

如果你想用一个特定的条件替换这些值呢?在这种情况下,我们可以尝试使用蒙版法。此方法是一种 if-then 方法,最适用于系列对象,而不是数据框对象。让我给你演示一下蒙版法是如何工作的。

mpg['mpg'].mask(mpg['mpg'] < 20, 'Less than Twenty' )

使用掩码方法时,我们通常会向方法传递两个参数;要替换的条件和值。在这种情况下,我给出了一个 mpg 值小于 20 的条件,然后用“小于 20”替换这些值。

如果您需要不止一个条件,您需要将这些方法链接起来。

mpg['mpg'].mask(mpg['mpg'] < 20, 'Less than Twenty' ).mask(mpg['mpg'] > 40, 'More than Fourty')

还有一个 where 方法,它的工作方式与 mask 方法相反。

mpg['mpg'].where(mpg['mpg'] < 20, 'More than Twenty' )

从结果中,您可以看到不符合条件的值被替换了。

在任何情况下,您都可以用自己喜欢的方法替换这些值。

3.隐藏不需要的索引和/或列

有时,您希望展示您的数据框,但不希望内容分散观众的注意力(我经常遇到这种情况,尤其是索引值)。

例如,我想给你看 mpg 数据集的前五名。

mpg.head()

上面的结果显示了整个表,表中有索引。有一次,我展示了一张和上面一样的桌子,被问及桌子旁边的数字,需要时间向大家解释。这当然是浪费时间。这就是为什么我们可以用下面的代码隐藏索引。

mpg.head().style.hide_index()

我们可以从数据框对象中使用 style.hide_index() 方法。

此外,可能有这样一种情况,您可能希望只保留一列,而呈现数据框的其余部分。要选择你想要的每一列,只留下一个不必要的列,这将是一项很大的工作。

在这种情况下,我们可以使用数据框对象中的 style.hide_columns() 。让我们看看下面的例子。

mpg.head().style.hide_index().hide_columns(['weight'])

在我上面的例子中,我想省去权重列,这就是为什么我只在方法中传递权重。当然,您可以隐藏任意多的列。你只需要把值传入列表。

结论

在这篇文章中,我向您展示了三个技巧来简化您的日常数据工作。这包括:

  1. 使用查询
  2. 用 replace、mask 和 where 替换值
  3. 使用 hide_index 和 hide_columns 隐藏

希望有帮助!

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

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

你应该知道的熊猫数据选择的 3 个主要方法

原文:https://towardsdatascience.com/3-primary-methods-for-pandas-data-selection-you-should-know-21c3153b7fc1?source=collection_archive---------62-----------------------

以您需要的方式选择您的数据

罗伯特·卡茨基在 Unsplash 上的照片

熊猫作为一个数据科学家是一个不可分割的库,尤其是对于 Pythonist 来说。这是因为库能够轻松地存储和操作数据。熊猫图书馆力量的一个例子是我们可以多么容易地选择我们想要的数据。下面让我用 seaborn 库中的 mpg 数据集给你举个例子。

#importing the library
import pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.head()

这是数据框形式的 mpg 数据集。现在,假设我只想要 mpg 列,我们可以用下面的代码得到它。

#Getting the data column with bracket and the column name
mpg['mpg'].head()

我们最终得到了之前选择的列的系列数据。这只是选择数据的例子。在下一节中,我将展示使用 Pandas 选择数据的四种不同的主要方法。

"熊猫是一个不可分割的图书馆作为一个数据科学家,尤其是对 Pythonist 来说."

1.按标签选择

取自熊猫文献。

“pandas 提供了一套方法来让完全基于标签的索引。这是一个基于严格包含的协议。要求的每个标签都必须在索引中,否则将引发一个*KeyError*

熊猫让我们根据标签选择数据。如果你意识到,在我们之前的例子中,我们只选择了基于列的数据。对于基于标签的选择,我们需要熊猫.loc属性。让我们在下面的例子中展示它是如何工作的。

#Selecting data on index 0
mpg.loc[0]

使用.loc属性,我们选择标签 0 数据,并以标签 0 行的序列结束。现在,如果我们想要在我们的选择中包含更多的标签,我们需要选择一系列带有:符号的标签,如下所示。

#Selecting data from index 0 to 4
mpg.loc[0:4]

假设我只想从各行中选择某个标签,我需要把它放入列表对象中。

#Selecting data from index 0,4,6
mpg.loc[[0,4,6]]

我们也可以添加我们希望.loc属性中选择的列,如下所示。

#Select the column we want with the list of the columns name
mpg.loc[[0,4,6], ['mpg', 'cylinders', 'origin']]

在熊猫对象中,第一个位置是行位置,第二个位置是列位置。这就是为什么当我们选择数据时,我们首先根据行,然后根据列进行选择。

我们的数据框大部分时间都有默认标签,但是我们可以将另一列设置为标签并基于新索引选择数据。我将在下面的例子中展示它。

#Set the 'origin' column as the new index using .set_index then selecting the data using .locmpg.set_index('origin').loc['europe']

在上面的数据框中,现在我只得到带有‘欧洲’标签的数据。

2.按位置选择

如果在前面的部分中我们基于标签选择数据,Pandas 也提供了一个基于整数索引位置的选择方法。我们将使用的熊猫属性是.iloc属性。

这些是*0-based*索引。切片时,起始边界为包含,上限为排除。试图使用一个非整数,甚至一个有效的标签都会引发一个*IndexError*

以上是熊猫官方文档说明。从解释中我们可以看到,当我们选择数据时,我们 使用 整数值作为从 0 开始的位置,而不是标签。让我在下面的例子中展示一下。

#Selecting the data in the index position two
mpg.iloc[2]

我们从位置索引位置 2 的数据帧中获取序列。一目了然,与使用标签方法相比没有什么不同,但如果我们将标签更改为非整数标签,会有什么不同。

mpg.set_index('origin').iloc['europe']

这会引发一个错误,因为使用.iloc属性是基于位置的,而不是标签本身。现在,如果使用与上面相同的数据,但是我使用一个整数值来选择数据,会发生什么呢?

mpg.set_index('origin').iloc[2]

我们可以看到,如果我们不改变指数,结果是相似的。这是因为我们根据位置而不是标签来选择数据。现在,像上一节那样的序列索引怎么样?它还能用吗?

#Selecting a sequence index based on position
mpg.iloc[0:4]

是的,我们仍然可以基于序列选择,但是我们需要记住的是,在基于位置的选择中,下限不包括在内。我们选择0:4,但是我们最终只得到从位置 0 到 3 的数据。

就像以前一样,我们也可以通过使用 list 对象来选择一个特定的位置。

mpg.iloc[[0,4,6]]

但是,如果我们想在这里包含列选择。

mpg.iloc[[0,4,6], ['mpg', 'cylinders', 'origin']]

会出现错误,因为.iloc函数只接受数字索引,不接受其他内容。

3.布尔选择

在我们继续讨论之前,我想解释一下熊猫怎么会有布尔结果。试试下面的代码。

#Comparing the 'mpg' data with integer 17
mpg['mpg'] > 17

结果将是一系列布尔值,这些值指示结果状态。True 表示大于 17 的数据,False 表示小于 17 的数据。现在,我们可以把布尔值作为选择标准。让我们试试下面的代码。

#Inputing the criteria within the square bracket
mpg[mpg['mpg'] > 17]

结果将是“mpg”数据大于 17 的所有数据或每个单个真布尔结果。如果我们想要两个或更多的标准呢?我们也可以像下面的代码那样做。

mpg[(mpg['mpg'] > 17) & (mpg['origin'] == 'japan')|~(mpg['horsepower'] <120)]

在上面的代码中,我指定了三个标准;“mpg”数据高于 17,“原产地”数据等于日本,“马力”数据不低于 120。当我们提出一个以上的标准时,我们需要把它放在括号中。而且,我们用&符号作为与,|符号作为或,~符号作为非。

结论

在这里,我向您展示了如何根据标签、位置和布尔值选择数据。虽然有许多选择数据的方法,但请使用您更熟悉的方法。

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

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

你应该知道的 3 个概率框架|贝叶斯工具包

原文:https://towardsdatascience.com/3-probabilistic-frameworks-you-should-know-the-bayesian-toolkit-c13fe7c4b12e?source=collection_archive---------24-----------------------

用概率编程语言构建更好的数据科学工作流程,克服经典 ML 的缺点。

构建、训练和调整概率模型的工具。帕特里克·grądys 在 Unsplash 上拍摄的照片。

我们应该始终致力于创建更好的数据科学工作流。
但是为了实现这个目标,我们应该找出我们还缺少什么。

传统的 ML 工作流程缺少一些东西

经典的机器学习是流水线作业。通常的工作流程如下所示:

  1. 有一个带有潜在假设的用例或研究问题,
  2. 构建和管理与用例或研究问题相关的数据集,
  3. 建立一个模型,
  4. 训练和验证模型,
  5. 甚至可能交叉验证,同时网格搜索超参数,
  6. 测试拟合的模型,
  7. 为用例部署模型,
  8. 回答你提出的研究问题或假设。

您可能已经注意到,一个严重的缺点是要考虑模型的确定性和对输出的信心。

确定不确定

在经历了这个工作流程之后,假设模型结果看起来是合理的,我们认为输出是理所当然的。那么缺少什么呢?
首先是,我们有没有考虑我们工作流程中出现的丢失或移位的数据
你们中的一些人可能会插话说,他们对自己的数据有一些增强程序(例如图像预处理)。那很好——但是你把它正式化了吗?
其次是,在看到数据之前构建一个原型怎么样——类似于建模健全性检查?模拟一些数据并在投入资源收集数据并拟合不充分的模型之前建立一个原型**。
Andrew gel man 在 2017 纽约 PyData 主题演讲中已经指出了这一点。
最后,获得更好的直觉和参数洞察!对于深度学习模型,你需要依靠像
SHAP 和绘图库这样的老生常谈的工具来解释你的模型学到了什么。
对于概率方法,您可以快速了解参数。那么,我们希望在生产环境中使用什么工具呢?**

一.斯坦——统计学家的选择

STAN 是研究的一个完善的框架和工具。严格地说,这个框架有自己的概率语言,Stan-code 看起来更像是你正在拟合的模型的统计公式。
一旦你用你的模型建立并完成了推理,你就可以把所有的东西保存到文件中,这带来了一个很大的好处,那就是所有的东西都是可复制的。
STAN 在 R 中通过
RStan ,Python 带 PyStan ,以及其他接口得到很好的支持。
在后台,框架将模型编译成高效的 C++代码。
最后,通过 MCMC 推理(例如 NUTS sampler)来完成计算,该推理易于访问,甚至支持变分推理。
如果你想开始使用贝叶斯方法,我们推荐案例研究。

二。pyro——编程方法

我个人最喜欢的深度概率模型工具是 Pyro 。这种语言由优步工程部门开发和维护。该框架由 PyTorch 提供支持。这意味着您正在进行的建模与您可能已经完成的 PyTorch 工作无缝集成。
构建你的模型和训练例程,编写和感觉像任何其他 Python 代码一样,带有一些概率方法带来的特殊规则和公式。

作为概述,我们已经在以前的帖子中比较了 STAN 和 Pyro 建模的一个小问题集:

[## 单参数模型| Pyro 与 STAN

用两种贝叶斯方法模拟美国癌症死亡率:STAN 的 MCMC 和 Pyro 的 SVI。

towardsdatascience.com](/single-parameter-models-pyro-vs-stan-e7e69b45d95c)

当你想找到随机分布的参数,采样数据和执行有效的推断时,Pyro 表现出色。由于这种语言在不断发展,并不是你所做的每件事都会被记录下来。有很多用例以及已经存在的模型实现和例子。此外,文档一天比一天好。
示例和教程是一个很好的起点,尤其是当你是概率编程和统计建模领域的新手时。

三。张量流概率——谷歌的最爱

说起机器学习,尤其是深度学习,很多人想到的是 TensorFlow 。因为 TensorFlow 是由 Google 开发者支持的,所以你可以肯定它得到了很好的维护,并且有很好的文档。
当您的工作流程中已经有 TensorFlow 或更好的 TF2 时,您就可以使用 TF Probability 了。
Josh Dillon 在 Tensorflow Dev Summit 2019 上做了一个很好的案例,说明为什么概率建模值得学习曲线,以及为什么您应该考虑 TensorFlow 概率:

张量流概率:信心学习(TF Dev Summit '19)张量流频道

这里有一个简短的笔记本,让你开始写张量流概率模型:

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/github/tensorflow/probability/blob/master/tensorflow_probability/g3doc/_index.ipynb)

荣誉奖

PyMC3 是一个公开可用的 python 概率建模 API。它在研究中有广泛的应用,有强大的社区支持,你可以在 YouTube 上找到一些关于概率建模的演讲来帮助你开始。

如果你在给 Julia 编程,看看 Gen 。这也是公开提供的,并且处于非常早期的阶段。因此仍然缺少文档,事情可能会出错。无论如何,这似乎是一个令人兴奋的框架。如果你愿意尝试,那么到目前为止的出版物和讲座都非常有前途。

参考

[1]保罗-克里斯蒂安·布克纳。 brms:使用 Stan 的贝叶斯多水平模型的 R 包
【2】b . Carpenter,A. Gelman 等人 STAN:一种概率编程语言
【3】e . Bingham,J. Chen 等人 Pyro:深度泛概率编程

数据科学教育的 3 个问题…以及如何解决它们。

原文:https://towardsdatascience.com/3-problems-with-data-science-education-and-how-you-can-fix-them-d904a9a11c3a?source=collection_archive---------38-----------------------

你想在大学里学习数据科学。你的大学提供了一个全新的数据科学学位,你可以用它来获得“ 全美最好的工作 ”。你看看那些充斥着一些世界上最时髦词汇的课程描述:“机器学习”、“人工智能”、“大数据”、“神经网络”等等……你激动了!

你应该感到兴奋。许多大学正在创建数据科学/机器学习学科的全新课程和计划,以满足行业的高需求。虽然这些课程很好地为学生提供了数据科学基础的良好概述,但我确实相信,有一些主题和想法被忽略了,这些主题和想法可以为学生在大学毕业后有所作为做好更好的准备。

旁注:这些想法都是我根据大学经历得出的个人看法。我并不是说数据科学项目在任何方面都不好。我只是想分享一些我自己研究过的帮助我在行业中脱颖而出的东西。

来源: XKCD (CC BY-NC 2.5)

1.数据清理

数据清洗是我要讲的第一个话题。数据清理可能是机器学习管道中最重要的部分。没有好的数据,计算机就无法学会有效地做出自主决策。

问题是

许多机器学习课程旨在让学生探索不同的 ML 算法,甚至可能建立自己的神经网络。项目的分配是为了让每个学生都能得到相同的、干净的数据来进行分析。这不实际!

在“真实世界”中,数据是肮脏、丑陋的,并且通常对数据科学家来说不是很好——当我们运行第一个机器学习脚本时,我们都被 iris 数据集欺骗了。下图显示,数据科学家花费大约 80%的时间清理和准备数据,不到 20%的时间实际运行分析。

解决办法

数据科学家花费如此多的时间准备数据的想法得到了一个非常坏的名声。相反,我们应该接受它,并在这方面变得很棒。

这将需要一些课外的工作。做自己的项目是好的,但是要为此收集自己的数据。虽然 Kaggle 是磨练数据科学技能的绝佳资源,但它并不是练习数据清理和准备的好资源。我提出一个想法:

做包含数据争论的非学术项目。使用以下建议作为练习:

  • 编写脚本从网络上抓取数据(查看 BeautifulSoup
  • 搜索那些而非必须用于机器学习的数据(查看谷歌的数据集搜索
  • 使用你已经有的数据,但是尝试解决一个不同的问题
  • 给一家拥有有趣数据的公司发电子邮件,要求将其用于研究(这可能很难,除非你给他们一些回报,一些公司可以提供学术许可证)

2.可解释性

好的…这是一个大的。这不仅是数据科学教育的问题,也可能是数据科学和机器学习领域的最大问题。

我将这一部分命名为“可解释性”,因为它很模糊——抱歉。我这么说的意思是,优秀的数据科学家需要有能力向非技术专业人士解释他们的模型。这对于能够交付业界最强大的模型至关重要。

我不是在谈论“模型可解释性”,这意味着准确描述一个模型如何做出决策。Cassie Kozyrkov 写了一篇非常全面的文章关于为什么可解释的 AI 不会交付。她文章中的一段话是:

“复杂性是所有这一切的原因”

是的,人工智能和人工智能的全部目的是从如此复杂的数据中产生洞察力,以至于人类自己无法完成这项任务。

所以你问我的‘可解释性’是什么意思?嗯,问题来了。

问题

在大学里:你是一名数据科学专业的学生,由一名数据科学教授授课,他会为你设计全面的编程作业,让你和你的数据科学同学一起完成,然后交给数据科学博士生助教,助教会给你打分。

你从未被要求向一个非数据科学家解释你的工作,更不用说向一个非技术人员解释了。在工业界,如果你在一家大公司工作,这种交流每天都会发生。构建复杂的模型,然后向项目经理和执行人员解释它们的用途,这对于部署您的模型至关重要。通常人们发现自己在大学毕业后第一次做这种“解释”。拥有解释模型的能力将使你在工作中表现出色,更好地理解你自己的工作,并能够接触到更广泛的受众。此外,人们通常害怕改变。如果一个公司的功能在历史上是以一种方式完成的,如果没有一个好的解释,人们会犹豫是否要转换到“现代机器学习方法”。

解决办法

对于如何在大学期间获得这种体验,我提出了一些建议:

  • 与专业以外的人或教授讨论你的工作
  • 在非技术层面上写关于你的工作的文章(这就是我所做的,查看我的第一篇文章这里!)
  • 我个人认为《走向数据科学》出版物有许多文章,它们以简单的方式很好地解释了高水平的技术主题。订阅并关注您最喜欢的作家!
  • 在你热爱的学科中做自己的项目总是一个好主意。我喜欢棒球,所以我做了很多关于棒球的预测模型的工作。我总是觉得解释这些模型很容易,因为我对这个学科非常熟悉。如果你不是植物学家,就很难解释为什么鸢尾花是一种植物!(哇,我的第二个 iris 笑话,这是个问题)

总之:我不认为有必要解释你的模型是如何得出一个决定的,但我认为很好地解释你的模型的本质以及它们如何适应一个生态系统是必要的。

3.可量测性

用可以在你的笔记本电脑上安装的数据集做项目是很好的。但在“现实世界”中,你将经常处理如此庞大的数据,你的笔记本电脑根本不够用!我们需要知道如何扩展!

(可伸缩性)是指当计算机应用程序或产品(硬件或软件)的大小或容量发生变化以满足用户需求时,它仍能继续正常运行的能力。通常,重新调整是为了更大的尺寸或体积。-TechTarget

问题

换句话说,知道如何编写代码和使用可用的资源来构建可以在企业级部署的应用程序是很重要的。这种类型的教育很少在本科阶段教授。

有些课程将涵盖这一领域的特定技术,如大数据和云计算。然而,根据我的经验,这些课程涵盖了这些概念的架构,而不是将它们具体应用于数据科学。我不想贬低这些课程的价值,但是对于数据科学家来说,使用 Amazon Web Services 并不完全需要知道 Amazon Web Services 的幕后是什么。我的解决方案将突出一些在工业中广泛使用,但在学校中很少涉及的重要技术。

解决办法

**云服务:**学习如何使用云服务是一项无价的技能(尤其是在这个时代)。云服务是构建可伸缩程序的最新技术。幸运的是,世界上最大的三家云提供商——亚马逊网络服务、谷歌云、微软 Azure——都有免费服务可供尝试。唉,我提出我的第一个解决方案:

  • 在 AWS 、 Google Cloud 或 Azure 上注册账户,开始了解他们的服务。
  • 拿一个你的深度学习模型,试着在云上构建它。看到它跑得多快了吗?看,可扩展性。这里是帮助你入门的教程。

**大数据:**下一个解决方案与大数据有关。许多云提供商都有大数据存储服务。这些都值得探讨。此外,其他公司专门从事大数据存储,如 Splunk 。我的第二个解决方案是:

  • 查看 Splunk 获取大数据。Splunk 被许多大公司用于他们的大数据解决方案,他们的许多服务也是免费的。

**集装箱化:**接下来,值得一提的是码头工人集装箱。简而言之,使用 Docker 容器是一种“打包项目”的方式。它们将运行一个项目所需的所有不同的依赖项包装在一个容器中。这使得在任何地方运行你的项目都很容易(甚至是云端!).了解如何使用 Docker 容器很重要,因为这是一种在企业级部署应用程序的广泛使用的技术。我的第三个解决方案如下:

  • 练习创建和使用 Docker 容器。从查看这篇教程开始。本教程非常强大,但是入门部分是一个很好的入门地方。

荣誉奖

以下是一些优化数据科学工作流程的重要技术。这些工具很少在学校教授,因为它们不够全面,不足以让整个班级都来讨论它们。我会把它们列为“荣誉奖”。

饭桶

令我非常惊讶的是,一些计算机科学和数据科学课程并没有涵盖 git。Git 是一个允许程序员分享他们项目工作的系统。它跟踪每个人对文件所做的更改,并可以将它们合并在一起。这对团队发展是绝对必要的。无论你是和 1 个人一起工作,还是和 100 个人一起工作,git 都是行业标准。

Git 是一个重要的软件,在合作编程项目时可以使用。它是一个足够广泛的工具,通常有资格进入自己的大学课堂。因此,学生通常被迫自己学习 git。

以下是一些开始的想法:

  • GitHub 是使用 git 最流行的客户端。GitHub 为你的在线存储提供了一个很好的用户界面。关于如何使用 GitHub,网上有无限的教程。这里是我喜欢的一个。
  • BitBucket 类似 GitHub。
  • 另一个很少被提及的协作工具是 Google Colab 。Google Colab 就像编码的 Google Docs。为此,它使用了一个 Jupyter 笔记本类型的界面。

想知道为什么我没有进一步解释 Jupyter 笔记本?只是等待…

Jupyter 笔记本

是的,你猜对了……Jupyter 笔记本是文本编辑器的替代品。它们允许您一次运行特定的代码块,也可以写入 Markdown。下面是一个笔记本的截图:

我的 Jupyter 笔记本样本。

Jupyter 笔记本很重要,因为它们可以让您轻松地可视化数据,而不必重新运行脚本和恢复数据,并且可以快速运行。

以下是开始使用 Jupyter 的分步过程:

  1. 打开一个终端窗口。
  2. 运行命令:pip3 install jupyter
  3. 等待 jupyter 安装其依赖项。
  4. 运行命令jupyter notebook启动你的第一个笔记本。
  5. 将其中一个 URL 复制并粘贴到 web 浏览器中,按 enter 键。
  6. 单击右上角的“新建”创建新笔记本

总结一下…

我希望你从中吸取了一些东西。我想再次重申,这些是我的意见。我对持肯定态度有些学校提供涵盖这些话题的课程。然而,这 4 个主题非常重要,我的节目没有深入讨论它们。我写这篇文章是为了帮助那些发现自己和我处境相同的人。

一如既往,非常感谢您的反馈。感谢阅读!

J

每个数据科学家必读的 3 本编程书籍

原文:https://towardsdatascience.com/3-programming-books-every-data-scientist-must-read-db1d3a1a284c?source=collection_archive---------5-----------------------

用 Python 掌握数据科学的编程方面

实用数据科学更多的是关于编程,而不是数学。Python 是大多数人选择的语言,所以掌握这种语言的非数据科学方面是很重要的。今天我们将讨论 3 本基本的书来做到这一点。

普里西拉·杜·普里兹在 Unsplash 上的照片

但是,作为一名数据科学家,掌握编程为何如此重要?好吧,我会碰碰运气,说你将为一家有其他软件开发人员的公司工作,所以了解你的角色如何融入大局是很重要的。

让我们快速地对此进行详细说明。

大多数数据科学家在提供一些产品/服务的公司工作,这些产品/服务主要由软件开发团队开发。数据科学家的角色是通过数据分析或某种预测性建模来扩展上述产品/服务的功能。

知道如何在笔记本上训练机器学习模型是不够的。此外,了解软件开发的基础知识对于软件开发部门的高效工作也是不够的。

您需要知道如何编写简单、可读且高效的代码,还需要知道如何以最佳方式组织代码。

这就是更高级的编程概念发挥作用的地方——如数据结构算法设计模式面试问题等主题——它们不一定只与面试相关。但稍后会详细介绍。

请记住,在这篇文章中,你会找到我推荐的书籍的链接。这对你来说没什么,因为价格是一样的,但是如果你决定购买,我会得到一点佣金。此外,我只收录了我亲自阅读过的书籍,可以保证 100%的质量。

好吧,我们从第一个开始。

用 Python 实践数据结构和算法

https://amzn.to/3zXJ57I

如果你认真对待你的编程工作,学习数据结构和算法是必须的。

这是那些一开始你不理解要点的概念之一,但是一旦你浏览了材料,一切都变了。你将了解到高效编写的代码有多优雅,还将了解一些最常见的面试问题的答案。

这是学习 Python 编程语言中的数据结构和算法的入门书籍,它涵盖了内置数据类型、集合模块中的数据类型、单向和双向链表、堆栈、队列、树和树遍历、哈希表、图形、搜索和排序算法等主题。

网上有很多学习这些话题的资源,但我发现这本书的价格非常不错。它大约有 400 页长,所以不要指望很快就能完成。至少花两个月的时间,因为主题相当复杂。

你可以在这里得到《T2》这本书。

掌握 Python 设计模式

【https://amzn.to/3GsYU97

将设计模式视为一组最佳实践,您可以在设计应用程序时使用它们来解决特定的问题。

这本书将教你如何构建你的代码。呆在笔记本电脑里不是生产环境的解决方案,所以学习如何正确地组织代码是必须的——即使你不是在编写应用程序(从传统意义上来说)。

这本书涵盖了绝大多数的设计模式,比如抽象工厂模式、构建器模式、适配器模式、装饰器模式、桥模式、门面模式、命令模式、观察者模式等等。

这些被分成几个部分以使学习变得合理和容易,主要部分是创造模式结构模式行为模式

它只有大约 250 页,所以它不应该花费你那么长时间来完成。再说一次,这不是最简单的话题,所以慢慢来,不要着急。

你可以在这里得到书。

Python 中编程面试的要素

https://amzn.to/3GA5qLq

又一本很棒的书。如果你已经阅读了列表中的第一个——用 Python 实践数据结构和算法*——你可能会发现这个有点类似。这并不是一件坏事。我来详细说明一下。*

你需要学好数据结构和算法,重复几个月前学过的概念只会有好处。此外,你应该学习或至少浏览一些最常见的编码面试问题。

为什么?因为这些很可能会在你的求职面试中发生。你应该知道这些东西,尽管它与数据科学没有直接联系。我知道这很糟糕。

这就是数据科学的情况——面试官要求的大量先决条件,其中你将在工作中用到 5%。也许吧。但事实就是如此。

你可以在这里得到这本书。

在你走之前

编程和软件工程比人们想象的要广泛得多。学习如何编写代码是不够的,因为我们必须以最简单和最有效的解决方案为目标。

这些书是我推荐的让你的 Python 技能达到最高水平的方法。如果你是 Python 初学者,这里有一篇文章值得一读:

[## 以下是我如何学习足够的数据科学编程

如何学习编程和我推荐的最佳书籍

towardsdatascience.com](/heres-how-i-learned-just-enough-programming-for-data-science-58389f50c570)

感谢阅读,我希望你喜欢它。

加入我的私人邮件列表,获取更多有用的见解。

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

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

每个数据科学家都应该阅读的 3 本编程书籍

原文:https://towardsdatascience.com/3-programming-books-every-data-scientist-should-read-badbb7a64c4a?source=collection_archive---------48-----------------------

用 Python 掌握数据科学的编程和架构

照片来自 Unsplash 上的Janko ferli

如果你读了我上一篇关于数据科学工程师书籍资源的文章,你就会知道我在毕业前从来没有太喜欢过教科书。回头看看我的书架,我发现了另外三本对 Python 编程有帮助的书。在过去的一年里,我致力于为公司内部的数据科学家设计新的工具和技术,并发现当我陷入某个问题时,这些资源非常有价值。到目前为止,我发现最有帮助的三本书是《面向所有人的 Python:探索 Python3 中的数据》、《Python 食谱》和《干净的架构》。

面向所有人的 Python:探索 Python3 中的数据

来自亚马逊列表的图书封面图片

**作者:**查尔斯·塞弗伦

即使你已经编程一段时间了,这也是一本很好的复习书。Python for Everybody 首先介绍了为什么应该学习编程以及编程意味着什么。这本书对于没有编程经验的人来说是一本很好的入门读物。在浏览了为什么你应该编程和什么是编程之后,这本书详细介绍了变量、表达式和语句。这篇简介很好地介绍了如何使用条件执行、函数和迭代。在本书的结尾,作者讨论了面向对象编程,与数据库和 SQL 交互,并简要介绍了数据可视化。

如果你正在学习编程或者需要复习基础知识,我强烈推荐你去读一读。这是一本帮助阐明 Python 中具体编程要点的好书,并且有助于强化基本编程原则。作者有简单明了的例子,容易理解。

Python 食谱

来自亚马逊列表的图书封面图片

作者:大卫·比兹利和布莱恩·k·琼斯

Python Cookbook 在我的书架上已经有一段时间了,当你需要你可能遇到的日常 Python 任务的快速例子时,它是一个很好的参考。这本书一章一章地分解主题,每一节都有几个详细的例子。在阅读这本书的序言时,您会注意到作者是为那些希望更好地理解 Python 和现代编程习惯用法的更有经验的 Python 程序员写的这本书。书中的每个食谱都被写成一个框架例子,为读者提供必要的信息。你得到了一个基本的理解,如果需要的话,你可以去做更深入的研究。

我最初被这本书吸引是基于食谱是如何设置的。每个食谱在一章的一个小节中都是独立的。例如,第 8 章关注类和对象,而配方 8.9 讨论创建新的类或实例属性。在每份食谱中,你会发现三个部分:问题、解决方案和讨论。第一部分详述了问题陈述。然后,解决方案进入一个代码示例和输出的简要描述。讨论将深入到解决方案的更多细节,以及这种方法的任何顾虑、缺点或劣势。这些例子并不都是包罗万象的方法,但它们是理解一个概念并决定是否需要为手头的问题研究进一步信息的一个很好的起点。

干净的建筑

亚马逊列表的封面图片

**作者:**罗伯特·c·马丁

在我的上一篇文章中,我讨论了同一作者的《干净的代码》一书,认为这是一本适合软件工程师和数据科学家的完美书籍。与这本书一起的是《干净的建筑》,这是你图书馆的另一个极好的补充。在工作中开发了不同的工具和库之后,我今年购买了这本书。在本书中,作者分解了软件设计和架构的含义,并简要讨论了不同的编程范例。他详细介绍了如何设计软件架构以及如何处理业务规则。

通过阅读这本书,你将更好地理解架构代码意味着什么,以及你如何在你的工作中使用不同的范例和原则。每一部分都详细描述了开发干净架构的各个方面,比如第 3 部分,他详细描述了架构方面的坚实原则。总的来说,这是一本很好的读物,它讨论了业务逻辑应该如何在一个干净的架构代码基中自包含。总而言之,如果你想学习更多关于架构代码的知识,这是添加你的书架的一个很好的参考。

摘要

如果你读了我上一篇关于这个主题的文章,你会知道我向对数据科学和软件开发感兴趣的人推荐的前三本书是:

  • 罗伯特·塞西尔·马丁的《干净的代码》
  • 统计学习介绍作者 Gareth James,Daniela Witten,Trevor Hastie,Robert Tibshirani
  • 每个程序员都应该知道的 40 种算法

[## 每位数据科学工程师的前三本书

我放在书架上的伟大资源,我喜欢介绍给软件工程师和数据科学家。

towardsdatascience.com](/top-3-books-for-every-data-science-engineer-e1180ab041f1)

当你继续你的旅程时,我推荐以下三本书:

  • 面向所有人的 Python:探索 Python3 中的数据
  • 大卫·比兹利和布莱恩·k·琼斯的 Python 食谱
  • 罗伯特·塞西尔·马丁的清洁建筑

按照这个顺序,您将首先获得关于 Python 的精彩介绍。随着您对这种语言的了解越来越多,并寻找更复杂的例子,您可以浏览 Python 指南。这本书是一个很好的资源,可以通过框架例子来解决常见问题。从框架例子中走出来,你可以开始理解架构你的代码的方法,并且清楚地做出更好的设计决策。

你的书架上有什么有用的书吗?如果有,它们是什么?

如果你想阅读更多,看看我下面的其他文章吧!

[## 每位数据科学家的 8 大技能

当我参加大学讲座时,最常被问到的问题是“我需要具备什么技能?”

towardsdatascience.com](/top-8-skills-for-every-data-scientist-79e6b1faf3e1) [## 停止浪费你的时间,咨询一个主题专家

在从事数据科学项目时,请一位主题专家来审查您的工作可能会有所帮助。

towardsdatascience.com](/stop-wasting-your-time-and-consult-a-subject-matter-expert-f6ee9bffd0fe) [## 创建用于熊猫分组的自定义聚合

Pandas groupby 是一个函数,您可以在数据帧上使用它来分割对象、应用函数以及组合…

towardsdatascience.com](/creating-custom-aggregations-to-use-with-pandas-groupby-e3f5ef8cb43e) [## 数据可视化的前 3 篇文章

如果您想更好地构建数据可视化,这些文章很有帮助。

towardsdatascience.com](/top-3-articles-for-data-visualization-956a08a54b04) [## 不要太骄傲而不愿寻求帮助

如果你被一个 bug 卡住了或者感到不知所措,你可以寻求你需要的帮助。

towardsdatascience.com](/dont-be-too-proud-to-ask-for-help-76f21d16f318) [## 理解分析开发生命周期

将您的分析从摇篮带到坟墓。

towardsdatascience.com](/understanding-the-analytic-development-lifecycle-2d1c9cd5692e)

3 分钟内 3 个 Python 概念

原文:https://towardsdatascience.com/3-python-concepts-in-under-3-minutes-d7dd33a14550?source=collection_archive---------28-----------------------

利用视频游戏开发的背景获得直觉

照片由像素的皮克斯拜拍摄

在这篇文章中,我谈到了用 Python 开发代码的 3 个关键概念。我将使用游戏开发的背景作为每个概念的例子,因为我相信这有助于最直观的理解。

让我们开始吧…

1.班级

面向对象编程的标志:类。这些可以被看作是你试图编码的任何东西的计算模型。请允许我详细说明,在我们假设的视频游戏中,我们可以用一个类来表示一个玩家和他们的属性…

这里我们设计了一个类来代表游戏中的玩家。玩家将有三个主要属性:力量、智力和魅力——他们的其他属性将基于之前的值进行调整。要创建一个在我们的游戏中使用的类的实例,我们可以编写以下代码…

我们现在可以在游戏中玩家发生任何事情时引用 player_1 变量。

这个概念可以扩展到建立从狗到数据库的任何东西的计算模型。唯一的区别在于类的结构和实现。

2.子类

对类和面向对象编程的扩展是子类的概念。每当不同的计算模型之间有共同的属性时,使用超类可能是最佳的。考虑一下我们正在创建的游戏中的敌人——所有的敌人,不管他们是什么类型(骷髅、僵尸等等),都有共同的属性(生命值、攻击力),所以我们可以创建一个名为“敌人”的超类,并将所有不同类型的敌人编码为子类…

现在让我们创建一个僵尸和骷髅子类,使用敌人类作为超类。你会看到我们可以修改属性,这样每个敌人类型可以被不同地初始化(增加多样性),但仍然有相同的标准参数(生命值和攻击力)…

要实现这些类,我们可以创建实例,就像我们创建 player 类一样…

我们可以参考 skeleton_1zombie_1 的统计数据,无论游戏中发生什么事情。

3.枚举类型

通常在游戏中用来表示物品稀有性的是枚举类型。它允许我们通过名字和数字来引用一个变量,例如,我们游戏中的一个基本稀有系统可以如下工作…

如果我们想从敌人身上“随机掉落”一件物品,我们可以用一个随机小数来确定稀有度…

  • 0 –. 5=普通
  • .51-.75 =不常见
  • . 76-. 9=稀有
  • .91-.98 =传奇
  • .981+ =异国情调

代码看起来会像这样…

为了检查稀有性选择是否正确(并且公平)地工作,我们可以运行一个 for 循环来确保所有选项都是统计上可用的…

这将打印一组稀有值作为枚举类型。利用我们之前学到的职业,我们可以制造物品(剑、弓等)和子类,它们的属性会随着物品的稀有程度而改变,就像僵尸和骷髅有不同的生命值和攻击值一样。

2020 年你不能错过的 3 个 Python 库

原文:https://towardsdatascience.com/3-python-libraries-you-cant-miss-in-2020-2ee4a7277cf1?source=collection_archive---------26-----------------------

给新的一年开个好头。

在这篇文章中,我将展示 3 个你可能不知道的强大的库。我们开始吧!

python-dateutil

你可能已经使用过 Python 的标准日期时间模块,尽管它在大多数情况下已经很好了,但你可能觉得它缺少了什么。好吧,让我告诉你,在 python-dateutil 中可能已经有了一些东西,你可以安装如下:

pip3 install python-dateutil

这个库提供了许多强大的功能,例如,您可以用自然语言解析包含日期的字符串。让我们通过一个例子来看看如何做到这一点:

from dateutil.parser import parse
s = "Today is the 31st of January of the 91\. And the current time is 12:34:56 AM"
parse(s, fuzzy=True)

…提供以下输出:

datetime.datetime(1991, 1, 31, 0, 34, 56)

在我看来,相当令人印象深刻。这个库中还有许多其他有趣的特性,所以我真的推荐你去看看。

降价

如果你曾经觉得有必要将 Markdown 转换成 HTML,这是为你准备的。 Markdown 库,也可以安装 pip:

pip3 install Markdown

然后,它允许您解析 Markdown 格式的字符串或 Markdown 文件。例如,您可以按如下方式转换字符串:

import markdown
markdown.markdown('1\. **Hello**')

…提供以下输出:

'<ol>\n<li><strong>Hello</strong></li>\n</ol>'

彩色光

你刚刚在你的网站上发布了一个新的特性,然后走向实时日志的海洋,寻找错误信息。然而都是黑白的,你几乎分辨不出什么。为什么不给你的标准输出增加一些色彩呢?例如,您可能想用红色打印您的错误消息。有了 colorama ,这就变得容易了,可按如下方式安装:

pip3 install colorama

下面的例子摘自库的 PyPI 站点,很好地总结了这个库的强大之处:

from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')

…给出这样的结果!

您有更多颜色和款式可供选择:

Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Style: DIM, NORMAL, BRIGHT, RESET_ALL

提取文本数据应该知道的 3 个 Python 模块

原文:https://towardsdatascience.com/3-python-modules-you-should-know-to-extract-text-data-3be373a2c2f9?source=collection_archive---------21-----------------------

用于文本分析的 Python

joo ferro在 Unsplash 上拍照

提取文本数据是进一步分析数据的第一步。我们在社交媒体上有大量的数据。然而,我们需要一个能帮助我们从大量文本数据中提取有用信息的系统。一些使用文本提取的著名应用程序是简历解析和发票阅读。在本文中,我们将看到一些最新的免费使用 python 库来提取文本数据以及如何使用它们。

1.Pdf 水管工

PDF 水管工库是用 python 写的。这个库可以在提取文本时解决不同的目的。如果我们想从任何文档中提取文本或表格数据,这个库会非常方便。

如何安装

要安装此库,请打开命令提示符并键入以下命令。确保 python 在机器中可用。

pip install pdfplumber

如何使用

要使用这个库,首先,我们需要导入它,然后使用pdfplumber.open来读取任何 pdf 文件。

import requests
import pdfplumberwith pdfplumber.open("Pranjal Saxena Resume.pdf") as pdf:page=pdf.pages[0]text=page.extract_text()

输出

我已经用我的简历提取了数据,并得到了一个很棒的结果来对文本做进一步的处理。

PDF 水管工

2.PyPDF2

Matthew Stamy 的 PyPDF2 是另一个很好的库,可以帮助我们从文档中提取数据。它可以执行以下操作。

  • 提取文档信息。
  • 逐页拆分文档
  • 逐页合并文档
  • 裁剪页面
  • 将多页合并成一页
  • 加密和解密 PDF 文件

它执行 pdf 文档中的所有操作。让我们看看它如何从文档中提取文本数据。

如何安装

要安装 PyPDF2 库,请打开命令提示符并键入以下命令。确保 python 在机器中可用。

pip install PyPDF2

如何使用

要使用这个 PyPDF2 库,首先,我们需要导入它,然后使用PdfFileReader读取任何 PDF 文件。然后,最后使用extractText()来获取文本数据。

from PyPDF2 import PdfFileReader
pdfFile_pypdf = open('Pranjal Saxena Resume.pdf', 'rb')
pdfReader = PdfFileReader(pdfFile_pypdf)print(pdfReader.getPage(0).extractText())

输出

如果我们将它与 PDF Plumber 库进行比较,这里的输出并不那么令人满意,因为这个库也关注其他 PDF 文档操作任务。

PyPDF2

PyPDF2

3.阿帕奇蒂卡

Apache Tika 是一个内容检测和分析框架,用 Java 编写,由 Apache Software Foundation 管理。看到它所能提供的输出,我感到很惊讶(你也会这样)。因为它对用户友好,易于转换成有价值的数据。

如何安装

要安装和使用 Apache Tika python 库,您应该安装最新版本的 Java。安装 Java 后,打开命令提示符并键入以下命令。确保 python 在机器中可用。

pip install tika==1.23

而且,如果你是用 Jupyter Notebook 来运行代码,那么 Jupyter Notebook 会自己安装所需的 java 环境。

如何使用

要使用 Apache Tika 库,首先,我们需要从 Tika 导入解析器,然后使用parser.from_file读取任何 pdf 文件。然后,最后使用[“content”]来获取文本数据。

from tika import parser
parsed_tika=parser.from_file("Pranjal Saxena Resume.pdf")print(parsed_tika["content"])

输出

输出看起来很有趣。我们可以从文档中提取适当组织的文本。

阿帕奇蒂卡

结束点

我们已经讨论了一些最新的免费使用 python 库从文档中提取文本或表格数据。这些库非常有助于从文档中收集信息数据。我们可以尝试这三个库,并根据文档的格式相应地使用它们。现在我们有了数据,下一步是使用正则表达式找到数据中的模式,并存储提取的数据以供进一步操作。

这就是本文的全部内容。我会在附近的某个地方见到你。

在你走之前……

如果你喜欢这篇文章,并希望继续关注更多关于 Python &数据科学精彩文章**——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。**

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

自动读取、创建和运行多个模型的 3 个 Python 技巧

原文:https://towardsdatascience.com/3-python-tricks-to-read-create-and-run-multiple-files-automatically-5221ebaad2ba?source=collection_archive---------2-----------------------

用 Python 和 Bash For Loop 自动化枯燥的东西

由真诚媒体在 Unsplash 上拍摄

动机

将代码投入生产时,您很可能需要组织代码文件。读取、创建和运行许多数据文件非常耗时。本文将向您展示如何自动

  • 遍历目录中的文件
  • 如果嵌套文件不存在,则创建嵌套文件
  • 使用 bash for 循环运行一个具有不同输入的文件

这些技巧让我在从事数据科学项目时节省了大量时间。我希望你也会发现它们很有用!

遍历目录中的文件

如果我们有多个数据要像这样读取和处理:

├── data
│   ├── data1.csv
│   ├── data2.csv
│   └── data3.csv
└── main.py

我们可以尝试一次手动读取一个文件

import pandas as pd def process_data(df):passdf = pd.read_csv(data1.csv)
process_data(df)df2 = pd.read_csv(data2.csv)
process_data(df2)df3 = pd.read_csv(data3.csv)
process_data(df3)

当我们有 3 个以上的数据时,这种方法是可行的,但效率不高。如果我们在上面的脚本中唯一改变的是数据,为什么不使用 for 循环来访问每个数据呢?

下面的脚本允许我们遍历指定目录中的文件

data/data3.csv
data/data2.csv
data/data1.csv

以下是对上述脚本的解释

  • *for* filename *in* os.listdir(*directory*):遍历特定目录下的文件
  • if filename.endswith(".csv"):访问以'结尾的文件。csv '
  • file_directory = os.path.join(*directory*, filename):连接父目录(‘数据’)和目录内的文件。

现在我们可以访问“数据”目录中的所有文件了!

如果嵌套文件不存在,则创建嵌套文件

有时我们可能想要创建嵌套文件来组织我们的代码或模型,这使得我们将来更容易找到它们。例如,我们可以使用“模型 1”来指定特定的特征工程。

在使用模型 1 时,我们可能希望使用不同类型的机器学习模型来训练我们的数据(“模型 1/XGBoost”)。

在使用每个机器学习模型时,由于模型使用的超参数的差异,我们甚至可能希望保存模型的不同版本。

因此,我们的模型目录可能看起来像下面这样复杂

model
├── model1
│   ├── NaiveBayes
│   └── XGBoost
│       ├── version_1
│       └── version_2
└── model2├── NaiveBayes└── XGBoost├── version_1└── version_2

为我们创建的每个模型手动创建一个嵌套文件可能会花费我们很多时间。有没有一种方法可以让这个过程自动化?是的,用os.makedirs(datapath).

运行上面的文件,您应该看到自动创建的嵌套文件“model/model2/XGBoost/version_2 ”!

现在您可以将您的模型或数据保存到新目录中了!

Bash for 循环:用不同的参数运行一个文件

如果我们想用不同的参数运行一个文件呢?例如,我们可能希望使用相同的脚本来预测使用不同模型的数据。

如果一个脚本需要很长时间来运行,并且我们有多个模型要运行,那么等待脚本运行完毕然后运行下一个脚本将会非常耗时。有没有办法让电脑运行模型 1,2,3,..,10,然后去做别的事情。

是的,我们可以用 for bash for loop。首先,我们使用sys.argv来解析命令行参数。如果你想在命令行中覆盖你的配置文件,你也可以使用像 hydra 这样的工具。

>>> python train.py XGBoost 1
Loading model from model/model1/XGBoost/version_1 for training

太棒了。我们刚刚告诉我们的脚本使用模型 XGBoost,版本 1 来预测命令行上的数据。现在我们可以使用 bash for 循环遍历模型的不同版本。

如果你可以用 Python 做 for 循环,你也可以在终端上这样做,如下所示

$ for version in 2 3 4
> do
> python train.py XGBoost $version
> done

键入 Enter 来分隔各行

输出:

Loading model from model/model1/XGBoost/version_1 for training
Loading model from model/model1/XGBoost/version_2 for training
Loading model from model/model1/XGBoost/version_3 for training
Loading model from model/model1/XGBoost/version_4 for training

现在,您可以在让您的脚本使用不同的模型运行的同时做其他事情!多方便啊!

结论

恭喜你!您刚刚学习了如何一次自动读取和创建多个文件。您还学习了如何使用不同的参数运行一个文件。现在,您可以将手动读取、写入和运行文件的时间节省下来,用于更重要的任务。

如果你对文章中的某些部分感到困惑,我在这个回购中创建了具体的例子。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上联系我。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 使用 Python 获得通知的 3 种方式

现在,您可以在等待培训完成的同时从事其他项目

towardsdatascience.com](/how-to-get-a-notification-when-your-training-is-complete-with-python-2d39679d5f0f) [## 如何创建可重用的命令行

你能把你的多个有用的命令行打包成一个文件以便快速执行吗?

towardsdatascience.com](/how-to-create-reusable-command-line-f9a2bb356bc9) [## 如何用 Faker 创建假数据

您可以收集数据或创建自己的数据

towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## cy thon——Python 函数的加速工具

当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,一个…

towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd) [## 高效 Python 代码的计时

如何比较列表、集合和其他方法的性能

towardsdatascience.com](/timing-the-performance-to-choose-the-right-python-object-for-your-data-science-project-670db6f11b8e)

作为数据科学家,你必须了解的 3 个 Python 可视化库

原文:https://towardsdatascience.com/3-python-visualization-libraries-you-must-know-as-a-data-scientist-8d0cd25e1c73?source=collection_archive---------15-----------------------

在现实生活中,数据预处理对于大多数数据科学家来说确实是一件痛苦的事情。但是在数据可视化库的帮助下,玩起来会很有趣。

视觉通过加里·基利安,经由矢量控制

以我为例,我经常处理医疗行业的数据,通常面对稀疏、误标记和遗留的数据集(oops)。一种优秀的可视化技术可以让您快速深入了解数据,有时甚至在训练之前,或者更好地表示现有的模型解释和提取。

如标题所示,我们将快速地用 Python 编写三个最令人兴奋的可视化库,并帮助您看穿劣质数据的伪装。

概述:

  • Matplotlib :底层详细开发工具,自由编码
  • Seaborn :“统计数据可视化”,基于 Matplotlib
  • Missingno :一个小巧轻便的 NaN 表示工具

环境设置:

我们正在利用 熊猫Numpy 的力量。如果您手中没有这些工具,只需单击上面的链接并按照说明进行操作。我个人推荐使用 Anaconda 来安装这两个依赖项,在 Anaconda 提示符下键入以下命令,就大功告成了!

conda install -c anaconda pandasconda install -c anaconda numpy

然后,设置我们的五个可视化库:

Matplotlib:

conda install -c conda-forge matplotlib 

Seaborn:

conda install -c anaconda seaborn

缺失编号:

conda install -c conda-forge missingno

现在,一切都准备好了!

数据设置:

我正在使用来自 Kaggle open dataset 的数据,并在 Colab 中设置。我不会用 API 调用和设置的细节来烦你,如果你需要帮助,你可以给我发邮件,我会帮你完成的!如果你真的想在 Colab 工作,这些文档可能会有帮助,我也在这里 分享我的工作空间

这个脚本用于 Colab,在本地 env 上创建一个工作区,从 Kaggle 获取数据,然后安装 missingno。我们使用的数据是 ka ggle“ka ggle Learn 用户的房价竞争”,这是一个记录良好的开源数据集。

现在,我们导入所有依赖项,读取数据,浏览数据集的前几行

整个数据集

然后,出于演示的目的,我们仅使用整个数据集的子集

选择感兴趣的列

所选列的标题()

希博恩-马特普罗特里布公司

正如我们上面提到的,Matplotlib 是一个支持所有绘图功能的低级绘图工具。我们通常结合 Seaborn 和 Matplotlib 的力量来获得更好的表示。Seaborn 中一些常用的图形:

  1. 热图:

我们通常使用heatmap 来绘制特征之间的相关性,但它也可以用来绘制 3D 轮廓图中任意三个特征之间的关系(至少一个必须是数字字段)

列之间关联的热图

只有带有dtype!=string的数据才会计算相关性。我们看到变量YearBuildYearRemodAdd之间的高度相关性

2.配对图:

pairplot 也是一个非常方便的数据汇总工具。您不仅可以看到特征之间的成对关系,还可以看到单变量图、概率质量图等。

子集数据的配对图

随特征“景观”变化的数据对绘图

3.紫罗兰花:

violinplot 一般用于分布可视化和分布比较。对于只有两个唯一条目的不同特征,我们使用split=True在它们之间进行比较

小提琴在'土地斜坡','空地'和'街道'之间

如图所示,我们看到LandSlopeLotArea只受Street影响,它只有两种类型的入口: PaveGrvl 。板变量选择该图的颜色主题和对应于每个数据集条目的inner=”stick”

missingno & Matplotlib

Missingno 是一个很小但很棒的数据可视化库。它有像 Seaborn 一样的常规图表,如heatmapBar Chart,但也有一些独特的图表,如空图MatrixDendrogram

在医学数据中,经常会有大量的空数据,这些空数据用零空间表示非常直观,不推荐!

缺少矩阵号

缺少的数字用横条表示数据,缺少横条表示空值。我们看到特性Alley非常稀疏,而特性LotFrontAge 有相当数量的有用数据。因此,对于数据预处理,我们可以决定丢弃Alley 并估算LotFrontage

关于如何处理数据科学中的缺失数据,可以参考这篇文章:

[## 现实生活中的机器学习:处理原始数据中的缺失值

预处理对于现实生活中的机器学习非常重要,通常我们会看到一个数据集包含很多…

medium.com](https://medium.com/@haoyanjiang0709/real-life-machine-learning-deal-with-missing-values-in-raw-data-29c5e9b6f00d)

下一步及以后:

这三个库非常基础,但在数据科学领域非常强大,足以满足行业中 95%的数据可视化工作。一些下一级工具,如 Plotly 或 Bokeh ,也建立在 Matplotplib 之上,让您能够构建交互式绘图并在 Web 应用程序上提供服务。当我学习了更多关于 Python 后端技术和前端工程的知识后,我将进入这个领域👊

如果你正在考虑获得计算机科学学位,要问的 3 个问题

原文:https://towardsdatascience.com/3-questions-to-ask-if-you-are-considering-getting-a-computer-science-degree-7901ff018950?source=collection_archive---------15-----------------------

史丹利戴在 Unsplash 上的照片

自从我在早先的一篇文章中分享了关于重返校园攻读计算机科学学位的内容后,一些读者联系我说他们正在考虑走同样的路。他们中的许多人也已经在数据科学/工程领域或完全不相关的领域工作,但觉得他们可能仍然想学习——不管出于什么原因。

因此,我写下这篇后续文章,与你分享我对在即将完成大一学业后攻读计算机科学第二个本科学位的“精炼”意见。希望我能告知并帮助你做出自己的决定。在本文的最后,我还列出了一些免费资源供您参考。这可能是一个好的开始。

我自己的简史:我有经济学学士学位和硕士学位。在获得计算机科学的第二个学士学位之前,我已经工作了 3 年。它是在线交付的(期末考试除外),这使我能够将学习与我目前在普华永道的工作结合起来。

NESA 摄制作者在 Unsplash

好吧,你在想 CS 学位是否适合你,尤其是当你已经工作的时候。这是一个很难的问题,涉及到你生活中很多不同的方面,但是我们不要让它变得比它应该的更难。这里有几个简单的问题可能会有帮助。

1.你想从一个 CS 学位中获得什么价值?

才能胜任那份该死的工作?

我怕可能不值得。

信不信由你,我们大多数人不需要一个 CS 学位就能得到我们真正想要的工作。到目前为止,我只听说过谷歌的一些工程职位明确不雇佣没有计算机科学本科学位的人(这可能会改变)。因此,如果这是你的唯一目标,你最好去上在线课程,阅读书籍,建立一个好的投资组合。你实际上可以在网上找到整个 CS 学位(我在本文末尾列出了一些有用的资源)。这可能会节省你大量的时间和金钱。

但是如果一个学位能让你在这个领域更加自信和全面,那就去做吧!

满足你的好奇心?

我们中的一些人有幸(或被诅咒)拥有前所未有的好奇心。

我们重视知识和理解胜过很多东西——包括学习和为考试而学习的艰苦经历。如果你对编程和抽象的东西非常感兴趣,你可能会发现自己处于学习计算机科学的最佳位置。

我可以告诉你,最终理解互联网和计算机是如何工作的是非常令人满意的,尽管我们大多数人认为它们是理所当然的。熟知不同的计算机算法也是非常令人满足的。

也就是说,任何 CS 项目的一部分都会让你厌烦。有一天,你可能会发现自己在阅读那些疯狂抽象的计算理论,这些理论可能会让你觉得毫无兴趣,毫无意义。

如果你觉得自己有足够的好奇心去学习,这是一个非常好的动力。也就是说,你也可以自学所有的东西,唯一不同的是有人指导你,支持你,和你一起学习,最后你会拿到学位。

更有创造力,更善于解决问题?

你可能从学位中获得的另一个价值是从老师和同学那里获得大量的想法和资源。你有机会创造一些非常酷的应用程序、游戏或工具。这些通常是作为不同模块的一部分的项目,它们真的很有趣。

您还将学习解决许多不同类型的问题,不仅通过编码实践,还通过概念理解和设计技巧。

计算机科学是一门奇怪的学科——人们基本上是凭空创造东西。因此, 如果你热爱创造现实世界的技术应用 并从技术角度解决问题,你可能会发现攻读计算机科学学位是一次非常有益的经历。

也就是说,我绝不是说 CS 学位是发挥创造力的唯一途径。但我确实相信它能帮助你敞开心扉接受新的概念和想法;最棒的是,你还知道如何用你的知识和解决问题的技巧来实现它们。

接受更多的机会?

一个 CS 学位大概是中最通用的学历了。它可以为一些非常令人兴奋的职业奠定良好的基础,从软件工程师、机器学习工程师、全栈开发人员到技术作家。

这里有一份关于计算机科学专业的 100 种职业的列表。

你认为自己几年后会从事这些工作吗?有许多工作可能还不存在,所以如果你还没有找到理想的职业,不要失望。

老实说,我自己仍然没有一个确切的答案,比如说,5 年后我将从事什么类型的工作,但我可以看到自己修补软件、数据、安全,并思考它如何帮助我们人类。或者我可能最终成为一名作家或艺术家——当计算机最终取代我们的工作,我们不再需要工作时:)。

这让我想到了下一个大问题。

2.你想在职业生涯中有怎样的感受?

鉴于计算机科学学位可能会扭曲你的职业道路,值得考虑你在工作和职业中的感受。这个想法来自丹妮尔·拉波特和欲望地图。他们建议我们应该更多地关注我们在职业和工作中的感受,而不是我们想做什么。

你喜欢处于心流状态吗?

你喜欢感觉对别人有帮助吗(以一种书呆子的方式)?

在解决重要问题时,你喜欢感觉自己有能力吗(用逻辑、软件、算法和数据)?

在某些情况下,你会因为某些事情而感到有动力吗?

你喜欢被某些类型的人包围吗?

当你想诚实地看待你想从计算机专业的职业生涯中得到什么和期望时,这些可能是有用的问题。

3.你权衡过潜在的成本吗?

时间和精力

攻读学位不是一件容易的事。工作量很大,尤其是如果你像我一样几乎是全职工作的话。这意味着您需要做好准备:

工作时间比大多数人都长:

是的,听起来很残忍。但这是一个可悲的现实。除了 8 个小时的工作时间,准备好每天学习 1-2 个小时,否则你将不得不在周末学习很多。我发现每周 10 小时的学习对于我所学的课程来说已经足够了,但是这可能会在考试期间延长。此外,你很快会发现很多你可能对 CS 项目之外的新东西感兴趣。

上学期我上了一门网络开发课程。不知何故,我对深入了解这一领域如此感兴趣,以至于我最后又花了 30 个小时在 Udemy 上学习了高级 Javascript 和 T2 的 Web 开发者入门课程。除了课本,你可能还想阅读某些模块的相关书籍,这将很快增加所需的时间。

有些人加快学习速度,每学期少选一些课程,这样他们就可以轻松地将学习融入繁忙的生活。我的步调几乎正常(作为一名全日制学生),所以说实话,我可能比我应该抱怨的更多😉。

我也尽量高效地管理工作和学习。这包括:

  • 保持一个良好的笔记系统(对我来说,这只是简单地意味着采取可以理解的手写笔记和索引)。
  • 保存每天/每周的待办事项和可能要做的事情清单
  • 提前做好计划(有时仍在为此挣扎,因为我总是倾向于把事情留到最后一分钟)
  • 同时应用不同的策略,如以两倍的速度播放视频,专注于最重要和最有价值的核心知识,以及一系列生产力技巧。我曾经不喜欢 hacks,因为它们听起来有点“廉价”,我的骄傲尖叫着“我这辈子不需要黑任何东西”。但是,他们工作了!

机会成本:

你可能已经知道没有什么是真正免费的。经济学教授喜欢称之为“机会成本”。我们只有有限的时间、精力和金钱。当你把钱花在某件事情上时,你就牺牲了做其他事情的机会。

如果你不是在攻读学位,你有什么更想做的事吗?

思考你是否处于职业生涯和生活的低机会成本时期也是有用的。

这类似于漫长工作周之后的一个慵懒的周五下午,你只是懒洋洋地坐下来,看看 YouTube 和网飞,或者清理一下邮箱。这是一个低机会成本的时刻,风险很小,这意味着你可以将它投入到更有意义的事情中。

同样,如果你在职业生涯和生活的某个阶段有时间做 却没有更好的事情做 ,那么学习就是一个非常好的选择。但是,如果你有孩子或打算这么做,或者如果你想专注于你的人际关系,或者如果你想追求其他的努力和副业,那么你需要权衡学习的成本和收益。

金融

一个学位会花掉你一大笔钱,即使在线课程可以减少一半的费用。如果你在工作,你可能有更好的选择:让你的雇主赞助你的学习。大多数情况下,这是有条件的。比如要求你在公司待一定时间,除非你偿还学习费用。

学习 CS 的一些有用资源:

  1. 计算机科学概要
  2. 自学计算机科学
  3. CS50:计算机科学入门:CS 最佳入门。
  4. 开源计算机科学学位
  5. 绝佳的计算机科学机会

我希望这篇文章能为你做出自己的决定提供一些启发。感谢您的阅读。

原载于https://www.thuhienvu.com。**

通过问自己以下三个问题,轻松完成任何数据可视化项目

原文:https://towardsdatascience.com/3-questions-you-must-ask-yourself-before-visualizing-any-data-set-85df509c81fc?source=collection_archive---------46-----------------------

Metis 设计师在 Unsplash 上拍摄的照片

作为一名数据分析师,我的大部分时间都用来为不同的利益相关者可视化数据集。数据可视化可以采取多种形式。它们可以是简单的 Google Sheets 图表、Python 笔记本上的一些可视化内容,或者是复杂的 Tableau 仪表板。在可视化任何数据集之前,我总是会问自己以下三个问题。

你的目标受众是谁?

这无疑是问自己最重要的问题。涉众是技术还是非技术受众?他们对您要可视化的数据的熟悉程度如何?他们是你的同事还是管理层的经理?您是否为不同的受众群体或特定团队可视化数据?在考虑可视化数据之前,充分了解你的目标受众有助于你取得一半的成功。

我经常通过回答上面的所有问题来记录我的观众档案。我有不同的可视化方法来适应不同的观众类型。例如,如果我的读者是要求我做一些探索性分析的非技术人员,我会想到一些 Google Sheets 图表,而不是 Tableau 仪表板。这样,我也可以轻松地与他们共享数据集。他们可以根据需要调整图形或图表。例如,他们可能后来意识到,他们只对上个月的数据感兴趣,而不是最初询问的 6 个月的数据。

如果我知道我将要向一个庞大而多样化的群体展示一些视觉化的东西,我会更加注意在视觉化的东西中加入更多的解释。例如,“日活跃用户”或“留存率”可能一开始听起来微不足道。然而,这些指标在不同的业务或行业中可能有非常不同的定义。我会在我的图表下面添加一个简短的标题来解释我是如何计算这些指标的。

这种可视化的目的是什么?

在了解了我的听众之后,我通常会和他们展开一个简短的讨论,以了解他们的期望。简单地问“你的目标是什么?”可能行得通,但并不总是像看起来那么容易。然而,我仍然建议非常直截了当地询问他们的需求和期望。然后,我问一些试探性的问题,归结为我需要满足的最重要的需求。

例如,客户成功团队希望更多地了解客户投诉及其团队绩效。在最初的对话中,我会核实他们是否需要临时分析或深入的仪表板。在第一种情况下,一些 Excel 图表应该足以解决他们的燃眉之急。在第二种情况下,我需要构建一个显示各种指标的仪表板,以帮助他们全面了解历史数据、当前性能和未来趋势。

假设他们想要一个仪表板。然后,我们一起集思广益,列出他们希望看到的指标。在头脑风暴阶段,我与我的利益相关者分享,他们不应该担心可行性或优先级。让我们考虑尽可能多的指标。之后,我们根据优先级对指标进行排序。如果我们确切地知道什么应该放在优先列表的首位,这个任务就很容易。否则,我们会为每个指标分配相对分数,然后选择前三名或前五名。一旦确定了优先级,我们就开始讨论可行性。有些指标很容易构建,有些则不容易,主要是因为用于构建这些指标的相关数据还不可用。

我提到的过程可能需要一到两次 30 分钟的会议。排名指标的列表保存在一个共享的 Google Docs 文件中,该文件是可共享的,并允许其他人进行评论。对于如何理解他们的期望和需求有一个清晰的结构有助于您更容易地浏览数据可视化过程。

数据背后有什么故事?

如果这些数据没有引起你的注意,也许你需要花些时间更深入地思考。例如,您可能会对显示按类别细分的客户投诉数量的堆积条形图感到非常自豪。图表看起来很清晰,有所有必要的标题。调色板看起来很棒。然而,通过查看这个图表,您发现了哪些真知灼见?你可能会意识到一个类别可能会支配其他类别。在这种情况下,按降序对字段进行排序是最有帮助的操作。当查看您的图表时,观众可以很容易地在第一时间发现主导类别。

一些类型的数据可视化在开始时看起来是最好的选择,但是直到你思考数据背后的故事时才知道。当您处理时间序列数据时,很容易认为折线图是一个显而易见的答案。然而,你认为有时条形图是更好的候选吗?条形图不仅能帮助你看到趋势,还能帮助你更快地发现异常值,这要归功于这些条形图相对于其他条形图的突出优势。

让我们回到客户成功仪表板的例子。假设您正在可视化一段时间内客户服务票据的数量,x 轴是周期,y 轴是票据的数量。折线图强调你对整体趋势的关注。然而,条形图可能会将您的注意力转移到 8 月份门票数量出现峰值的几周。在做了一些研究后,你可能会发现根本原因是在那几周有新产品发布。由于顾客对新产品不熟悉,他们问了很多问题,这增加了门票的数量。因此,团队意识到他们应该添加更多关于新产品的说明,以减少该产品的标签数量。

结论

这三个问题是我在做任何数据可视化项目之前的自制清单。这帮助我非常有效地浏览流程,为每个人节省时间,并使我的工作流程更加结构化。我给你的建议是创建你的清单。如果您觉得有帮助,请随意添加更多步骤。我希望您在交付任何数据可视化时能够更加自信。

原载于 2020 年 10 月 16 日【http://baovinhnguyen.com】

创建数据可视化时,你应该问自己的 3 个问题

原文:https://towardsdatascience.com/3-questions-you-should-ask-yourself-when-creating-data-visualizations-fa255652508a?source=collection_archive---------22-----------------------

和 3 个记忆它们的迷因

作为一名有抱负的数据分析师,我一直热衷于创建各种数据可视化。虽然我的第一次试验非常基础(如果我想完全诚实的话,相当难看),但我发现自己在进入任何数据可视化的图形执行之前开发了一个简单的方法。在图形创建的概念阶段,我问了自己 3 个主要问题。在构思、构建和分享图表时回答这些问题,将有助于我了解我构建这个图表的目的。我希望这些技巧能帮助你创建有洞察力的漂亮的图表!

以下图为例,让我带你了解这 3 个技巧。如果你愿意,你可以在我的 GitHub 页面 找到这个图背后的代码。

玛丽·勒费夫尔

1.你的图表回答了一个有趣的问题吗?

在你开始创建你的梦想图表之前,问自己这个简单的问题:我的图表会引起某人的注意吗?要回答这个问题,你需要迈出关键的第一步:确定这个图表是写给谁的。一旦你确定了你的目标受众(难怪我在这里使用营销术语),你应该设身处地为你的受众着想,提出一个能引起他们兴趣的问题——一些能让他们看你的图表超过半秒钟的问题。为了让你的读者相信他们应该花些时间在你的图表上,你需要创造出我称之为的“Mhmh”效应**——这种“mh”是一种响亮的反射噪音。**

就我而言,我一直对一个群体的感知回收行为和这个群体的实际回收行为之间可能存在的差距感兴趣。一些调查或意见晴雨表经常显示一个国家人口的自我报告再循环率。然而,这些数字并不一定与当地政府公布的实际回收率相符。因此,问题来了:欧盟 28 个国家自我报告的回收率有多接近现实?我制作的图表告诉我们的不仅仅是简单地显示市政当局的回收利用率,或者一项调查的结果。通过结合两种数据来源,它向读者展示了哪些国家的实际回收率与调查报告的回收率之间存在显著差异(以及差异的方向)。

使用 Imgflip 创建

2.你的图表真实吗?

一旦你确定了你想回答的有趣问题,你必须确保你会如实回答。这主要取决于你收集数据和处理数据的方式。

苹果和橘子:比较什么是可比较的

首先,检查你的数据集的可靠性。如果您使用的是来自企业的内部数据或您自己构建的数据集,那么您将使用的数据很可能是一致的。即使这听起来很愚蠢,在继续下一步之前,也要检查一下是否确实如此。如果您正在寻找开源数据集,确保数据源的可靠性和可比性的第一步是非常重要的。

对我来说,主要的挑战是从专注于欧洲的开源平台上找到可比较的数据集。此外,我必须找到一些关于欧洲国家实际回收利用率的数据,以及一些关于其人口回收习惯的数据(例如,来自机构报告或人口调查)。最后,两套数据必须涵盖相同的国家和相同的时间范围。经过一番研究,我在两个不同的网站上发现了一致的数据——耶!一份来自欧洲环境署,涵盖 2014 年和 2017 年的 34 个国家,另一份来自欧盟开放数据门户,涵盖 2017 年的 28 个国家。因此,结合两个数据集使我能够在一个一致的数据库上工作。

少即是多:注意你的图形选择可能产生的影响

你要仔细观察的第二件事与你所做的图形选择有关。构建一个图表是许多决策和设计选择的结果。确保你所有的图形选择服务于你可视化的数据的真实性。特别是,我想提醒您注意以下几点,这将防止图形表示中的偏差,并确保您的图形真实地代表所选数据:

  • 数字单位和刻度:您会使用百分比还是绝对值?如何在同一个图上表示不同刻度的值?在哪里显示图表中使用的单位和比例?
  • 颜色:读者会如何看待所选的颜色?你应该使用连续色标还是离散色标?我的图表会导致哪些误导性的解释?
  • 投影:对于一张地图,你会使用哪种地球投影?3D 形式或阴影等视觉效果是否会影响您对图表的理解?线条粗细等设计元素在你的图表可读性中扮演什么角色?
  • 辅助元素:你将如何在图表周围安排框架和文本元素?你使用哪种文字字体和风格?如何在图表上和图表周围的过多和过少信息之间找到正确的组合?

至于我的图表,我选择了常用的地球投影和专注于欧洲的比例,以便符合所显示国家的地理现实,而不是通过在地图上显示不相关的国家来误导读者。我选择了三种我认为和谐的颜色,这有助于强调我的关键信息:我选择橙色代表实际回收率低于自我报告的回收率的国家,紫色代表中性色,绿色代表实际回收率高于感知回收率的国家。最后,我故意留下了额外的帧或视觉效果,因为它们会妨碍对图形的平滑读取。

使用 Imgflip 创建

3.你的图表以一种清晰的方式教授了一些新的东西吗?

教新东西…

这与第一个问题“你的图表回答了一个有趣的问题吗?”。在你吸引了读者的注意力之后,你必须保持他的注意力,并最终导致某种“啊哈!”效果 —当你意识到图表真正表达了什么,以及这可能会产生什么后果时的这种反应。

**我想通过我的图表传达的信息是,**大多数国家报告的回收利用率比实际回收利用率高,而且这种趋势在一些国家比其他国家更高。为了避免对这个话题的任何判断,我用图表展示了欧洲不同国家的实际回收率和自我报告的回收率之间的差距。我用颜色来传达我的信息,并用标题、图例和旁注中的有用信息来补充图表本身,以帮助读者快速理解我的图表所展示的内容。

…以明确的方式

如果你的图表提出的问题真的很有趣,那么答案可能是多方面的。但是你应该选择一个清晰的信息,而不是试图在一张图上传达太多的想法。如果你想传达许多彼此相关的想法,你可以将一个复杂的信息分成两个或三个图表,每个图表包含一个有效的关键信息。这确实是伟大的数据可视化的秘密。

在我的例子中,我想显示每个国家的实际回收率的值,以及这个实际回收率和自我报告的回收率之间的差距。但是这个图表的地理维度加上一个色阶构成了我能用一个图表传达的最大信息量**——增加每个国家的实际回收率会使图表超载,关键信息会丢失。因此,我回到了我最初的问题“欧盟 28 个国家自我报告的回收率有多接近现实?”。对此给出最明确答案的图形决策是在地图上显示一个色标,用适当选择的颜色突出实际和自我报告的回收率之间的差距。**

使用 Imgflip 创建

受《权力的游戏》启发的 3 种快速简单的数据可视化

原文:https://towardsdatascience.com/3-quick-and-easy-data-visualisations-inspired-by-game-of-thrones-37c0e611b9bf?source=collection_archive---------50-----------------------

回答问题:我在看什么?

由mauricio Santos在 Unsplash 上拍摄的照片

又被隔离了一个下午。我决定通过玩一些有趣的数据来提高我的视觉化技能。在这篇文章中,你会发现:

  • Seaborn 图书馆提供的热图
  • 由 Plotly Express 提供的条形图
  • 散点图(带注释!)动力 Seaborn

我会揭开浏览量、收视率、每集死亡人数和史诗战役之间的关系!剧透警告:如果你认为你知道大量观众喜欢什么,请三思!

使用的数据集

用于收集每集收视率和浏览量的第一个数据集可以在Kaggle这里找到。

我使用的第二个数据集总结了每集的死亡人数和可以在数据世界 这里找到。

关于我是如何根据季节和剧集连接这两个数据帧的更多信息可以在下面找到。

IMDb 评级所有季节

我希望能够看到的第一件事是每集的收视率,以及它在不同季节的变化。为此,我使用了 Seaborn 热图。

df1=pd.read_csv("Data/Heatmap_GOT.csv"**,** index_col=**0**)sns.heatmap(df1**,** annot=True**,** cmap='RdPu'**,** annot_kws={"size":**8**}**,** linewidths=**.5**)plt.title('Game of Thrones - Rate IMDb'**,** fontsize=**15**)
plt.show()

我们可以清楚地看到,《权力的游戏》前七季的收视率非常出色,每一季的最后几集收视率都明显较高。当我们到达第八季时,出现了相当大的下降。我不喜欢批评…但是这里有几个可能导致低收视率的原因…

每季浏览量

最后一季的收视率明显较低,这是否意味着观看人数减少?

让我们通过绘制每个季节的点击率来看一下。该柱状图是使用 plotly express 绘制的。这里是如何使用这个最近更新的新库的一步一步的教程。

条形图在试图可视化少于 10 个类别的分类数据时非常有效。多了这些,剧情就会杂乱无章,难以理解。在处理分类数据时,我更喜欢使用条形图,因为我们可以通过简单地查看条形的大小来轻松地可视化类别之间的差异。此外,我们可以按颜色分类。

views =df.groupby(['Season']).mean().reset_index()
fig = px.bar(views,x='Season',y= 'views',color='Season',title = "Views (in millions) per season")
fig.show()

从第一季的 230 万到第八季的 1200 万,浏览量直线上升。这解释了为什么预算从第一季的 600 万美元增加到最后一季的 1500 万美元。不幸的是,我提出的假设被证明是错误的,因为收视率最低的那个季节有最多的浏览量!

每集死亡人数—假设检验 v.1

我的一个假设是,有更多动作的剧集会转化成更多的观看次数,并且会从公众那里获得更高的收视率。为了形象化这种关系,我决定实现一个散点图,将浏览量和收视率联系起来。

散点图非常适合显示多个变量之间的关系,因为我们可以看到原始数据的分布。通过对各组进行颜色编码,我们可以查看不同数据组之间的关系。为了形象化三个变量,我们创建了另一个参数,比如点的大小,或者颜色。

我做的第一件事是合并两个数据帧(视图和死亡)。我创建了一个公共列,对季节和情节进行编码。以第一季第二集为例,结果采用这种格式(1,2)。

df["episode"] = df["Season"].astype(str) + ","+df["Number in Season"].astype(str)
deaths["episode"] = deaths["death_season"].astype(str) + ","+ deaths["death_episode"].astype(str)merged = pd.merge(df**,** deaths**,** on='episode'**,** how='inner')

使用 groupby 函数,我对剧集进行排序,并保存“浏览量”、“收视率”和“死亡人数”这三列。

new_merged = merged.groupby(['episode'**,**'views'**,**'Rating'**,** 'Season'**,** 'Death_Count']).size().reset_index(name='deaths')ax = sns.scatterplot(data=new_merged**,** x="views"**,** y="Rating"**,** hue="deaths"**,** size="deaths")
plt.show()

情节上的每个圆圈代表系列中的一集。大小和颜色与事件中重大死亡的数量成线性关系。这种观想所提供的信息并没有导致任何结论性的结果。这一集的内容一定会强烈影响收视率,而且不仅仅是死亡**!这是我将在下一节研究的内容。**

每集战斗—假设检验 v.2

我的第二个假设是观众喜欢战斗。谁不喜欢穿着闪亮盔甲的男人和女人为他们所爱的人而战。让我们看看这是否可以用数据来佐证。

我找不到包含该系列主要战役的数据集。我决定手动创建一个,用下面的网站花了大约 8 分钟。

# Create dataframe with main battles
battles = {'Name': ["Frozen Lake Battle"**,** " Loot Train Attack"**,** "Battle of Blackwater"**,** "Battle of Castle Black"**,** "Battle of the Bastards"**,** "Fall of King’s Landing"**,** "Battle of Winterfell"**,** "Dance of Dragons"**,** "Stormbron"]**,** 'Episode': [**6, 4, 9, 9, 9, 5, 3, 9, 2**]**,** 'Season': [**7, 7, 2, 4, 6, 8, 8, 5, 7**]}
battles = pd.DataFrame(data=battles)

我将“战斗”数据帧与包含视图和评级的数据帧合并。我决定保持散点图的可视化,但是为包含一场战斗的每一集增加了一个标记

battles["episode"] = battles["Season"].astype(str) + ","+ battles["Episode"].astype(str)
d.drop(['Season'**,**'Episode' ]**,** axis=**1,** inplace=True)
merged = pd.merge(df**,** battles**,** on='episode'**,** how='outer')
merged = merged.replace(np.nan**,** ''**,** regex=True)p1=sns.scatterplot(data=merged**,** x="views"**,** y="Rating"**,** hue = 'Season')for n in range(**0,** merged.shape[**0**]):p1.text(merged.views[n] + **0.2,** merged.Rating[n]**,** merged.Name[n]**,** horizontalalignment='center'**,** color='black'**,**weight='semibold'**,** fontsize=**9**)
plt.show()

清澈见底,不是吗?有战斗的剧集收视率一直较高。唯一的例外仍然是排名较低的最后一季剧集,这可以从对应于该季的每个点的颜色看出。

感谢阅读!

如果你喜欢我的作品,我会非常感激你跟随我来到这里。

如果您对如何改进有任何问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。

Github 知识库

所有代码都可以在 Github 这里的gameoftrones . py文件中找到!

在神经网络上使用随机森林的 3 个理由——比较机器学习和深度学习

原文:https://towardsdatascience.com/3-reasons-to-use-random-forest-over-a-neural-network-comparing-machine-learning-versus-deep-f9d65a154d89?source=collection_archive---------5-----------------------

由于几个主要原因,随机森林是比神经网络更好的选择。下面是比较机器学习和深度学习需要知道的。

神经网络已被证明在许多行业领域胜过许多机器学习算法。它们不断地学习,直到得出最佳特征集,以获得令人满意的预测性能。然而,神经网络会将你的变量换算成一系列数字,一旦神经网络完成学习阶段,这些特征对我们来说就变得无法区分了。

图片来源

如果我们关心的只是预测,那么神经网络将是一直在使用的事实上的算法。但是在一个行业环境中,我们需要一个能给利益相关者赋予特征/变量意义的模型。这些利益相关者很可能是除了具有深度学习或机器学习知识的人之外的任何人。

随机森林和神经网络的主要区别是什么?

随机森林和神经网络是学习方式不同的不同技术,但可以用于类似的领域。随机森林是机器学习的技术,而神经网络是深度学习的专属。

什么是神经网络?

一个神经网络是一个松散地基于人类大脑皮层功能的计算模型,用于复制相同类型的思维和感知。神经网络被组织成由互连节点组成的层,这些节点包含计算网络输出的激活函数。

图像来源

神经网络是机器学习的另一种方式,其中计算机通过分析训练样本来学习执行任务。由于神经网络松散地基于人脑,它将由数千或数百万相互连接的节点组成。一个节点可以连接到它下面的层中的几个节点,它从这些节点接收数据,也可以连接到它上面的几个节点接收数据。每个输入的数据点接收一个权重,然后相乘并相加。如果加权和等于零,则添加偏差,然后传递给激活函数。

神经网络的体系结构

神经网络有 3 种基本架构:

  1. 单层前馈网络
  • 它是最简单的网络,是感知器的扩展版本。它在输入层和输出层之间有额外的隐藏节点。

2.多层前馈网络

  • 除了输入和输出之外,这种类型的网络具有一个或多个隐藏层。它的作用是干预输入和输出层之间的数据传输。

3。循环网络

  • 递归神经网络与上述类似,但被广泛用于预测序列数据,如文本和时间序列。最著名的递归神经网络是“长短期记忆”模型(LSTM) 。

什么是随机森林?

图片来源

随机森林是决策树的集合,其中最终/叶节点要么是分类问题的多数类,要么是回归问题的平均值。

随机森林将生长许多分类树,并且对于来自该树的每个输出,我们说树'为该类投票'。使用以下步骤来生长树:

  1. 将为每棵树从训练数据中随机抽取行样本。
  2. 从步骤(1)中获取的样本中,将获取一个特征子集用于在每棵树上进行分割。
  3. 每个树都增长到参数指定的最大程度,直到达到该类的投票。

为什么应该使用随机森林?

使用随机森林而不是决策树的根本原因是将许多决策树的预测合并到一个模型中。逻辑是,由许多平庸的模型组成的单个 even 仍将优于一个好模型。鉴于随机森林的主流表现,这是有道理的。因此,随机森林不太容易过度适应。

像决策树这样的灵活模型可能会出现过拟合,其中模型会记忆训练数据并学习数据中的任何噪声。这将使其无法预测测试数据。

随机森林可以通过将许多树组合成一个集成模型来减少来自决策树等灵活模型的高方差。

什么时候应该使用随机森林而不是神经网络?

随机森林的计算成本较低,并且不需要 GPU 来完成训练。随机森林可以给你一个不同的决策树解释,但性能更好。神经网络需要比普通人手头更多的数据才能真正有效。神经网络会简单地降低要素的可解释性,以至于对性能而言变得毫无意义。虽然对某些人来说这听起来很合理,但这取决于每个项目。

如果目标是在不考虑变量的情况下创建一个预测模型,那么尽一切可能使用神经网络,但是这样做需要资源。如果需要了解变量,那么不管我们喜欢与否,在这种情况下通常会发生的情况是,性能将不得不受到轻微的影响,以确保我们仍然能够了解每个变量对预测模型的影响。

我在这里遗漏了什么吗?

请让我知道,我很乐意把它加进去。

我喜欢成为数据科学家的 3 个原因

原文:https://towardsdatascience.com/3-reasons-why-i-love-to-be-a-data-scientist-90696ac0d314?source=collection_archive---------55-----------------------

这一切都归结于马尔科姆·格拉德威尔在他的书《局外人》中解释的“有意义的工作”的概念。

由摄影爱好在 Unsplash 上拍照

在马尔科姆·格拉德威尔的《局外人》一书中,他解释了比尔·盖茨和披头士等伟大人物的成功,涵盖了教育、价值观甚至出生日期等话题,以确定一个人是否具备成为局外人并取得成功的要素。他还谈到了是什么让工作充满成就感和动力,让我们每天早上醒来寻找下一个挑战。

在 60 年代中期,甲壳虫乐队有了重大突破,他们已经演奏了疯狂的小时数。1959 年,他们搬到德国汉堡,在一家脱衣舞俱乐部里表演了很多年,每周 7 天,每天 8 小时,几乎拿着最低工资。他们全身心地投入到自己热爱的事情中,努力追求自己的梦想。

比尔·盖茨十几岁的时候,接触电脑不仅仅是一件商品。他第一次发现计算机是在湖边学校的计算机俱乐部,一台 ASR-33 电传打字机终端,他被迷住了。后来,他的同学保罗·艾伦发现华盛顿大学健康中心的一台主机在凌晨 2 点到 6 点是免费的。尽管是凌晨时分,这两个朋友还是开始去大学使用大型机,将他们的身心完全投入到探索计算世界中。盖茨会离家出走,在大学里通宵编程。几年后,当他的母亲听到这个故事时,她终于明白了为什么早上把他从床上叫起来这么难。

我们如何解释他们的动机和火花,激发他们不顾任何障碍投入如此疯狂的时间和精力?正如马尔科姆·格拉德威尔所说,他们相信有意义的工作的概念,这个概念的基石是,如果你付出努力和工作,你会得到回报(T21)。更确切地说,有意义工作的概念由三个支柱组成:

  • 自主:掌控我们自己的决定。
  • 复杂:受到任务难度的挑战。
  • 努力和回报之间的联系。

大多数人都会同意,自主性、复杂性以及努力和回报之间的联系这三点是工作要令人满意必须具备的三个品质。"

马尔科姆·格拉德威尔,局外人:成功的故事

1 —自主

在我们生活的这个时代,成为自己的老板变得前所未有的容易。即使在企业界,也出现了向更大自主权的转变,以推动创新。作为一名数据科学家,尽管你在工作,但你有很多机会开发自己的项目,因为你是这艘船的船长。

它可以是一场 Kaggle 比赛,一个由人工智能驱动的应用程序,甚至是互联网上的出版物或教程。我们不需要征得任何房东或老板的同意。我们可以自由开发,随心所欲地创造和分享。

更大的自主权意味着更大的责任,你发展了一套新的技能,让你能够以创造性的方式面对挑战。你自己做决定,并从中学习;您知道您的选择会对业务和团队产生影响。有了自主权,你可以建立自尊和自我意识,这是成功人士的关键能力。

它不需要是一个巨大的项目、突破性的技术或重大的创新。开始一个副业,你自己的项目。做决定,失败学习,然后继续。参加 Kaggle 竞赛,开始在 Medium 上发布,开发自己的项目并在 Github 上共享代码,创建自己的应用程序。机会是无止境的,从小处着手,往大处想

2 —复杂性

如果我给你一个选择,要么做一名建筑师,年薪 75,000 美元,要么在收费站工作一辈子,年薪 100,000 美元,你会选哪个?

马尔科姆·格拉德威尔,局外人:成功的故事

金钱是我们社会的一大动力,但不是最强大的动力。能够以新的方式挑战自我和克服困难是我们最大的快乐。

作为一名数据科学家,你需要具备三种技能。首先,你需要学习数学来理解像反向传播、卷积神经网络或递归神经网络这样的概念。这些概念需要与技术技能联系起来,如编程、数据库管理,甚至云计算或 DevOps,这些创造了第二个支柱,即计算机科学。最后,这两种技能只是达到目的的手段,而不是最终的结果。你需要一个应用这些技能的领域专家。很明显,在这三个领域超越他人是很困难的,但是你需要在这三者之间保持一定程度的平衡。

为了让你的工作有意义,它需要带你到新的极限,挑战你。当然,并不是一切都应该是痛苦和困难。你想发现在困难的情况下你能走多远,从山顶回首过去,为你为了达到现在的位置所付出的巨大努力和取得的成就而自豪。每个人都能爬山,但不是每个人都能爬喜马拉雅山。它需要专业知识,领域特定的知识和勇敢的个性来面对障碍。

3——努力和回报之间的联系

第三点背后的想法很简单,你付出的努力越多,得到的回报就越多。

我来自西班牙南部,那里到处都是橄榄园和农田。从事农业的人知道,即使你愿意工作很长时间,尽你最大的努力,也有一个点,你不能推动事情向前发展。植物的生长需要时间和一系列条件,如果它们不匹配,你可以想多早醒来就多早醒来,或者尽你所能努力工作,但植物不会长得更快或更大。从事农业是一件艰难的事情,如果你想让你的事业发展,你还需要培养耐心和尊重自然。

作为一名数据科学家,我们没有这种限制,没有一个季节用于训练模型,另一个季节用于测试,下雨或寒冷不会阻止你的发展,你可以贡献尽可能多的时间,你会得到奖励。当然,这并不是简单的投入一定的时间获得一定的回报,这取决于你的技能,你组织工作的能力或你的能力。

努力和回报之间的这种积极关系让那些愿意投入工作的人有机会脱颖而出,有所作为。如果你管理好自己的时间,专注于重要的事情,你就有机会成为一名伟大的数据科学家。

结论

数据科学家是一个非常复杂和具有挑战性的工作,但你可以从中获得一个最重要的回报,那就是工作有意义的感觉。一份能让你成长和拓展能力的工作,一份值得骄傲的工作,不管有什么困难,如果你付出了努力,就会得到回报。你不需要请求许可,你可以自主设计和开发你自己的项目。而且是对当今社会影响较高的工作,处于创新生态系统的最前沿。

[## 如何建立一个编码器解码器翻译模型使用 LSTM 与 Python 和 Keras。

按照这一步一步的指南来建立一个编码器和解码器模型,并创建自己的翻译模型。

towardsdatascience.com](/how-to-build-an-encoder-decoder-translation-model-using-lstm-with-python-and-keras-a31e9d864b9b) [## 我从人工智能中学到的关于生命的 3 件事

当你意识到你的生活是由算法管理的时候,重新获得控制权的唯一方法就是像算法一样思考。

medium.com](https://medium.com/@dbenzaquenm/the-3-things-i-learned-from-artificial-intelligence-about-life-355713237e59)

我推荐你先学习 Python 的 3 个理由

原文:https://towardsdatascience.com/3-reasons-why-i-recommend-you-to-learn-python-first-8e72ed4a6c65?source=collection_archive---------71-----------------------

马库斯·斯皮斯克在 Unsplash 上的照片

如果你想从数据科学开始而不是先学 R

P ython 和 R 是数据科学和机器学习领域最常用的语言。两种语言各有优势。

在过去的两年里,我已经在我的数据科学和机器学习项目中使用了这两种语言。如果你想在这个领域起步,我强烈建议你先开始学习 Python,几个月后你已经习惯了,你可以学习 r。相信我,你会意识到这两种语言都有简单易学的语法。

原因

为什么我推荐你先学 Python,而不是两个都学?以下是我认为你应该首先学习 Python 的 3 个理由,然后我会给你我对 R 语言的看法,不建议你先学习它。

Python 有很多应用

Python 是计算机科学的流行语言。这种语言非常流行,因为它有简单的语法,而且是开源的。这意味着这种语言是由世界各地的社区贡献的,你可以通过使用它来制作任何东西,例如制作游戏、web 应用程序、自动化非常无聊的事情,以及进行数据科学。

对于新人来说,Python 很难但是值得学

对于第一个进入数据科学领域的人来说,您可能没有使用任何编程语言的经验。从计算机科学的角度来看,Python 很容易学,但是我知道您可能认为这并不容易。在转到另一种语言之前,先花时间学习编程语言是没问题的,例如 r。在你习惯了它之后,你就可以探索任何其他语言了。但是记住,只学习基础知识,然后用它做你自己的项目。

深度学习库主要工作在 Python 上

这就是我认为的 R 语言的缺点。也许它有一些可以用于深度学习的库,比如 Keras 和 TensorFlow,但它的后端仍然需要 Python。如果你也对深度学习感兴趣,我真的建议你先学习 Python,然后花上几个月的时间。

这是我能给你的为什么你应该首先学习 Python 的主要原因,即使你是编程语言的新手或者你是数据科学领域的新手。

比较

那么,如果你是数据科学或者编程的新手,为什么我不建议你先学习 R 呢?

我不想让你先学习 R 的主要原因是因为它的语法太容易学了,尤其是在他们的数据科学库上,例如 ggplot2,dplyr,tidyr 等。看看我最近收到的很多笑声的推文,

另一个,

可能你现在还不明白,尤其是那些数据科学的新手,但这只是因为这些推文而让我的一天变得美好。我得说他们刚才说的是真的,我是说真的。

原因是 dplyr 和 ggplot2 包具有独特且易于学习的语法,而不是像 pandas 和 matplotlib 这样的 python 库。

让我举一些例子,特别是关于如何使用 Python 和 r 操作数据和可视化数据。这次我将使用约翰·霍普斯金大学的冠状病毒数据集向您演示这两种语言是如何完成这项任务的。

假设我们要绘制一个线图,其中包含全球确诊率最高的 10 个病例。

这是如何在 Python 上实现的,

**# Import the data**
import pandas as pd
df = pd.read_csv("[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)")**# Get the columns**
get_top_10 = df.iloc[:,[0, 1, 2, -1]]**# Summarize by country/region**
get_top_10 = get_top_10.groupby(['Country/Region']).sum().reset_index()**# Sort by the value and get the top 10**
get_top_10 = get_top_10.sort_values('5/17/20', ascending=False)**# Convert it as an array**
countries = get_top_10.iloc[:10, 0].values**# Melt (Pivot) the table**
df_tidy = df.melt(id_vars=df.columns[:4], var_name='date')**# Set the date column type as datetime**
df_tidy['date'] = pd.to_datetime(df_tidy['date'])**# Group by countries and dates** 
df_tidy = df_tidy.groupby(['Country/Region', 'date']).sum().reset_index()**# Filter it by top 10 countries**
df_tidy = df_tidy[df_tidy['Country/Region'].isin(countries)]
df_tidy.head()**# Create the plot**
import seaborn as sns
import matplotlib.pyplot as plt
sns.lineplot(x='date', y='value', hue='Country/Region', data=df_tidy)

这是结果,

然后,看看 R 是怎么做的,

**# Import the data**
library(readr)
confirmed <- read_csv("[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)")
head(confirmed)**# Get the 10 most confirmed cases countries**
library(dplyr)
get_top_10 <- confirmed %>%select(`Country/Region`, "5/17/20")
colnames(get_top_10) <- c("country", "total")get_top_10 %>%arrange(desc(total)) %>%top_n(10) %>%select(country)countries <- c("US", "Russia", "United Kingdom", "Brazil", "Spain", "Italy", "France", "Germany", "Turkey", "Iran")**# Make the data prepared for analysis by tidying it**
library(tidyr)
confirmed_tidy <- confirmed %>%pivot_longer(5:(length(colnames(confirmed))), names_to = "date", values_to = "total")
colnames(confirmed_tidy) <- c("province", "country", "lat", "long", "date", "total")
confirmed_tidy$date <- as.Date(confirmed_tidy$date, format="%m/%d/%y")
confirmed_tidy**# Summarize for countries that have province on it**
library(ggplot2)
confirmed_tidy %>%group_by(country, date) %>%summarise(total = sum(total)) %>%ungroup() %>%filter(country %in% countries) %>%**# Create line plot from it**ggplot(aes(x=date, y=total, color=country)) +geom_line()

这是结果,

那么,基于这些例子,你更喜欢用哪一个呢?r 还是 Python?请在下面的评论区告诉我!

结论

总之,Python 和 R 各有各的功能。先学哪个,我会推荐你先学 Python 而不是 r。

除了我上面给出的所有理由之外,Python 比 R 更具有面向对象的语法,使用函数来完成它,但是两者具有相同的功能。如果你花更多的时间学习 python,那么你会对编程语法,尤其是面向对象的编程语法很熟悉。如果你在 R 上投资很多,可能你会喜欢它的语法,但是不要一开始就学,因为你不会有面向对象编程的感觉。

我不想劝阻你学 R,但是如果你先学 R 而不学 Python 你懂吗?看看吧,它的语法比 Python 好得多,不是吗?

尽管如此,我还是建议你先学习 Python,因为当你学习 Python 的时候,你可以很容易地学习其他语言。

感谢您阅读我的文章。我在这里发表过其他文章。下面是我以前的文章:

[## NumPy 矩阵计算

NumPy 如何简化您的代码,同时提高其性能。广播和 SIMD 来救援了!

towardsdatascience.com](/matrix-computation-with-numpy-a865ebaf2005) [## 如果我有自己的时间,我会这样学习数据科学

感觉不知所措和筋疲力尽让我在释放数据科学技能方面表现不佳。这个…

towardsdatascience.com](/this-is-how-i-will-learn-data-science-if-i-got-back-my-own-time-e9148c909ce9) [## 更高的准确性并不意味着更好的机器学习模型性能

我们可以定量地衡量机器学习模型的性能,但不仅仅是准确性,还有很多…

towardsdatascience.com](/greater-accuracy-does-not-mean-greater-machine-learning-model-performance-771222345e61)

聪明的 CEO 立即开始机器学习项目的 3 个原因

原文:https://towardsdatascience.com/3-reasons-why-smart-ceos-start-machine-learning-projects-right-now-3815badf21f9?source=collection_archive---------23-----------------------

InsideAI

虽然大多数首席执行官都在努力应对新冠肺炎,但有些人利用数据,以不同的方式做事

今天,利用数据比过去容易得多……[图片由 NCI 在 Unsplash 上拍摄]

新冠肺炎危机全力打击组织。这只黑天鹅向首席执行官们提出了独特的领导力挑战。自疫情爆发以来,我亲身经历了领导者和员工的挣扎——他们中的许多人无法适应急剧变化的环境。

然而,过去六周与我们共事过的一些首席执行官正在以不同的方式行事。除了确保他们社区的健康,他们还能够通过启动或提升他们的机器学习(ML)活动来塑造他们濒危业务的未来。原因如下。

1.ML 激活了公司和顾客

危机本身创造了一个全新的机会空间。行动的紧迫性创造了倾听的意愿,减少了惰性,并培养了员工的开放性。最重要的是,它创造了完成事情的动力!

所谓的人工智能长期以来在德国的员工中遭到抵制(相信我,我和许多认为它就像区块链一样的人谈过)。如果做得好,现在不再是这样了。首席执行官可以通过让他们的员工推动 ML 项目并让他们为企业的未来做出贡献来引导动力。你不会相信现在这样做的员工有多有权力和责任感。

与我们合作的一家钢铁加工公司的首席执行官知道,他的组织将受到新冠肺炎后果的沉重打击。尽管如此,他并没有退出我们的合作,而是利用这一势头进一步加强了他的核心业务。现在,我们共同开发了一个推荐系统的原型(类似于亚马逊的“喜欢这个的客户也喜欢……”)。我们的系统会就客户的需求提出建议——尤其是在危机期间。这确保了他的销售额下降幅度大大低于预期。

2.ML 项目在家就能完美工作

嗯,看看下面这张图就知道了。那曾经是我们数据科学负责人的办公室(别担心,他回来了,很安全)。Alessandro 几乎无所不在——冲浪、玩 Hang(如果你不知道它是什么,去查一下)和编码。是的,尽管有时旅行,我们从来没有感觉到他走了。这也是由于像 GitHub 这样的平台允许在分布式团队中开发 ML 模型和原型。

对于数据科学家和机器学习工程师来说,远程工作是(旧的)常态。其实这是他们习惯了的。聪明的首席执行官知道,ML 项目可以很容易地远程实施。最重要的是,他们清楚地意识到,他们的组织可以通过与那些真正知道如何做的人密切合作来提高其虚拟协作能力。很简单:ML 项目在新冠肺炎时代也有效!

我们的数据科学主管 Alessandro 在巴厘岛的前“办公室”

3.ML 即使没有多少钱也很强大

在过去的几年里,我遇到的最大的误区之一就是 ML 贵得惊人。直到今天,我还不明白这是怎么发生的。先说清楚:不一定是这样。我的观察是,聪明的首席执行官通过原型思维来保持低成本。只有在值经过验证的情况下,它们才会缩放。

坚持上面的例子:对于钢铁加工公司,我们一开始没有全面地做推荐系统。我们开始时只使用一小部分数据和工具,但很快就和销售人员一起验证了我们模型的建议是否有用——或者这个项目是否容易失败。我们不介意杀死原型!

另外,从我个人的经验来看,我认为大约三分之一的 ML 社区是真正使命驱动的。这组开发人员和创新经理都相信,在创造商业价值的同时,有能力让社会变得更好。所以不管有没有大预算,人家都愿意支持!

聪明的首席执行官现在开始机器学习项目的最大原因可能是他们无论如何都必须这样做。为了保持成功,ML 迟早要成为每个组织的基本支柱。你开始得越早,你的组织就能做得越好——这就是数据的好处。

时机可能比你想象的要好。

你应该拥有数据科学博客的 3 个理由

原文:https://towardsdatascience.com/3-reasons-why-you-should-have-a-data-science-blog-cdc1d4b0e8f4?source=collection_archive---------47-----------------------

我认为写博客对你有利的原因

普里西拉·杜·普里兹在 Unsplash 上的照片

“开一个博客来巩固你学到的东西。当你以博客的形式教授你所学的东西时,你可以看到你知识中的差距并填补它们。”——我的经理(2019)

我第一次开始写博客是在 8 个月前,当时我的经理在工作中建议我这样做,作为巩固我学到的新东西的一种方式。他说“当你以博客的形式教授你所学的东西时,你可以看到你知识中的缺口,并在中填补它们”。快进 8 个月,我现在已经是 Medium 人工智能类别的顶级作家,同时也是该平台上收入最高的 5%到 8%的人之一——公平地说,以这种方式巩固我的知识已经产生了一些非常酷的副产品,这些副产品也为我打开了许多大门。

我会像我的经理告诉我的那样告诉你…

开一个博客来巩固你的知识。当你以博客的形式教授你所学的东西时,你可以看到你知识中的缺口并填补它们!

我相信我可以在这里结束这篇文章,但如果你仍然不相信,我会给出一些理由,说明为什么我认为开设数据科学博客对你来说极其重要,即使你是一名有抱负的数据科学家,昨天开始了他/她的第一门课程。

注意:这只是你将要开展的最伟大的数据科学项目的一个方面。查看下面的链接,了解更多关于您必须完成的最重要的数据科学项目的信息。

[## 最重要的数据科学项目

每个数据科学家都必须做的项目

towardsdatascience.com](/the-most-important-data-science-project-458d016ef8a6)

建立你的在线足迹/个人品牌

我要你在键盘上按下 Ctrl + T 键,在谷歌(或者任何你喜欢的搜索引擎)上输入你的名字。出现了什么?什么都没有?好的,输入你最喜欢的艺术家的名字。出现了什么?他们的背景,他们的专辑,他们的巡演和其他与他们联系的渠道,等等。

如果你想成为一名摇滚明星数据科学家,人们至少应该知道在哪里可以找到你的作品——Kurtis Pykes

是的,你可能会觉得在谷歌(或者你喜欢的搜索引擎)上输入自己的名字很别扭,我不怪你,我会怪你。然而,对于你申请的大多数公司来说,他们很可能会这样做。或者,如果你搜索自己的名字,出现大量数据科学文章,你基本上已经给了他们第二份简历,他们可以根据你的工作对你产生印象。雇主有机会在他们坐下来和你谈工作之前向你请教,这会给你比其他候选人更强的竞争优势。

此外,你可以开始将自己树立为你所写主题的专家,你发表的任何东西都可以被认为是知识产权。酷的壮举!

注意:仔细考虑你决定发布的东西是很重要的,因为你会和你写的东西联系在一起。

软技能发展

让我们来看看 4 项被高度视为促进职业发展的软技能,并将它们与数据科学博客的帮助联系起来——有 4 项以上的软技能,但关键是要认识到拥有一个数据科学博客是你应该做的事情。

情商

情商是指识别他人情绪和管理自己情绪的能力。作为一名数据科学作家,提高本身就意味着了解人们的情绪和他们的行为之间的联系,从而让你能够设身处地地为目标受众着想,这为你提供了一个平台来影响他们实现共同的目标。例如,你可以把自己放在一个初学者的位置,学习一个非常困难的技术主题,并且能够用一种非常简单的方式把它分解,让目标受众理解。

成长心态

成长心态是相信你对自己的能力有最终的控制权,并且可以学习和提高。我认为这是不言自明的。如果你不想在写作的主题上耗尽灵感,你就必须不断学习——就这么简单。

对反馈的开放性

反馈是工作环境中的一项重要技能。开放并能够接受发展反馈对任何工作的成功都至关重要。你猜怎么着?从你发表文章公开你的作品的那一刻起,你就向反馈敞开了大门。例如,我记得当我对线性回归的假设犯了一个错误时,在 LinkedIn 上引起的剧变——是的,我在讨论有史以来最简单的机器学习算法之一时犯了一个错误。虽然人们可能会认为这是一个公开的尴尬,人们分享的许多评论都是火上浇油,但相反,我感到有更大的责任感来适当地研究我写的任何东西,我很快就和那个叫我出来帮助我变得更好的人成为朋友。

“把纠正你错误的人视为希望你尽可能做到最好的人,并和他们交朋友!”

职业道德

如果你真的想在工作中获得成功,你需要投入时间、努力和精力来实现你的目标。开始(和维护)你自己的数据科学博客不是先决条件,事实上,你不必必须。然而,如果你决定不仅向你周围的每个人表达你的职业道德,你也要发展你自己的职业道德。有些人这样做是因为想要通过他们的博客达到金钱目标,有些人是出于社会目标(即拥有 3000 名粉丝),还有一些人是为了确保他们保持自律(即确保每周发布 3 次)。不管是什么原因,你培养了自己的勇气,这是一种值得珍惜的生活技能。

机会

通过您的数据科学博客,您本质上是在营销自己,良好的营销将吸引愿意的客户。换句话说,如果你很好地描述了你所拥有的技能和品质,人们会注意到你并就这些事情接近你。请注意,这并不仅仅是工作机会,但它可能是一些重要的事情,让你遇到有工作机会的人,或者遇到你继续创业的人,比如让你成为播客的客座演讲人,在那里你可以讨论你写的博客帖子,或者为出版商写作——谁知道呢?

“做能增加你成功机会的事情”

包裹

关于为什么你应该有一个数据科学博客,我可以添加更多的理由,但我希望这 3 个理由足以说服你开始。总的来说,我认为拥有一个博客的总体目的应该是学习新的令人兴奋的东西,然后你可以继续教授这些东西。然而,考虑写博客的好处可以作为一种有效的激励工具,帮助你处理写博客所需的棘手工作。

谢谢你看完。如果你喜欢这篇文章,你可能会喜欢下面链接的一些文章:

[## 从 Jupyter 笔记本发布到媒体

在媒体上创建技术职位的更有效方法

towardsdatascience.com](/publishing-to-medium-from-jupyter-notebooks-53978dd21fac) [## 用 4 个步骤开始您的数据科学之旅

开始数据科学职业生涯的自以为是的路径指南

towardsdatascience.com](/start-your-data-science-journey-in-4-steps-f5b5a6e7e80b) [## 为您的数据科学事业保持动力

我们可以长期保持动力。

towardsdatascience.com](/staying-motivated-for-your-data-science-career-e845f18421e1)

如果你想和我联系,最好在 LinkedIn 上联系我!

[## 人工智能作家 kurtis Pykes——走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

你不应该成为数据科学家的 3 个理由

原文:https://towardsdatascience.com/3-reasons-why-you-shouldnt-become-a-data-scientist-93cfeb9a6ce7?source=collection_archive---------5-----------------------

意见

在转行之前,一定要了解这三点。

21 世纪最热门的工作可能并不适合你。我并不是说学习数据科学不值得(恰恰相反),但是如果你确实有一些你试图解决的问题,最好还是参与到这个领域中来。

Joshua Rawson-Harris 在 Unsplash 上拍摄的照片

作者注: 这是一个观点片,所以大概有一定程度的偏颇。你所在国家的工作和你的技能可能会有所不同。我们用不同的眼睛看世界。请在评论区留下你的想法和经历。

在进入这个行业一段时间后,我每天花 10-12 个小时探索这个领域,写了近 100 篇关于数据科学的文章,我觉得自己有资格谈论一些非常令人失望但在我的研究中从未提及的事情。

对我来说,实用数据科学是最有趣的领域之一——尤其是随着深度学习的进步。

**那又怎样?**仅仅为了数据科学而做数据科学有什么意义?嗯,如果你不是一名研究人员,全职从事这个领域几乎没有意义。

你花时间训练一个模特的原因是什么?是因为你计划在网络和/或移动应用中部署它吗?是要解决一些现实问题吗?还是只会闲置在笔记本里?

一段时间以来,我一直觉得数据科学正在成为软件开发的另一个分支。这不一定是一件坏事,因为模型训练和优化现在已经非常自动化了(可以使用正确的工具),作为一名“数据科学家”,你唯一要做的就是以正确的方式准备数据,并向上级展示你的工作。

对我来说,这很好,因为我可以花更多的时间做有趣的事情,如应用程序开发,从而交付整个包并实际解决问题,而不是让模型闲置在我的笔记本电脑上。

但是如果你计划从 9 点到 5 点为别人工作,那么一定要阅读这篇文章,因为它会谈到一些不太好的方面。此外,正如我以前的一篇文章所述,你应该知道在这个领域注册的好处,并想了解可能的缺点。

好了,废话不多说,让我们来看看第一个原因。

#1 -你不关心业务

我给你讲个故事吧。除了在 Medium 和 TDS 写博客之外,我还有一份全职工作,即数据科学家。我工作的公司并不专注于该行业的任何一个分支,它只是一家主要专注于咨询的 it 公司。

马文·迈耶在 Unsplash 上的照片

**这对我意味着什么?**这意味着我不是在一个项目或一个产品上工作,而是在不同行业的 3-5 个不同项目上工作。如你所料,我不是这些领域的专家。

这就是你可能最终不喜欢你的数据科学工作的地方——因为你不太了解你正在工作的领域,但也不急于了解它,因为它让你厌烦透了。

现在,对于在感兴趣的领域工作的数据科学家来说,情况可能不是这样。假设你在 X 领域受过教育,但也非常了解数学和统计学,所以你被雇佣在你的领域做更多的数据密集型工作。那是完全不同的。

这里我说的是通才数据科学家,那些从一个项目跳到另一个项目的人从来不觉得他们实际上在做贡献。

#2 -你看不到全局

与前面的原因不同,这个原因适用于数据科学领域的通才和专家。

照片由诺亚·西利曼在 Unsplash 上拍摄

假设你被一个项目团队邀请参加一个会议,因为他们的应用可以从你的“数据科学魔法”中受益。诸如此类的问题在所难免:“你的模型能做到这一点吗?”“你能在我们的 10KB 数据集上实现这些现代神经网络吗?”。也许不是确切意义上的最后一个,但如果有人需要一个预测模型,而只有 30 行数据,也不要感到惊讶。

这就是问题所在,因为不知何故,你应该在对项目及其结构一无所知的情况下立即交付一个最先进的解决方案——因此出现了大图问题。祝你好运。

对于专业数据科学家来说,这里的情况又变得更好了,因为至少拥有一些领域专业知识,并知道自己如何适应全局,会让你更容易正确地完成工作。

# 3——你的老板是个商人

或者女商人。

关键是,你的上司并不是任何数据相关领域的专家,他对数据科学的了解和普通人从新闻中了解的一样多。

在 Unsplash 上猎人赛跑的照片

作者注: 这一原因的影响程度可能因国家而异,因为工作和生活文化可能会有很大差异。

这就带来了一个潜在的问题,因为你的团队可能会被赋予一项需要数月研究的任务,但根据业务的需要,这是不可能的。

希望你会有一个部门经理,他/她了解一个特定的解决方案需要多少时间和工作,并且他/她能够和他的上级谈一些道理,但是你不能指望这种假设。

这就是拥有出色的人际交往能力的用处。解释为什么要花一两个月的时间找出 100 个不起作用的东西并不是一件愉快的事情,但拥有这些人和演示技巧可能会扭转局面。

结论

首先,这是一篇观点文章。请务必在下面的评论区留下你的想法。

在我看来,知道很多关于数据科学和预测建模的知识应该会让你成为一名合格的员工,但前提是要解决与数据科学相关的实际问题。

归根结底,数据科学只是一种技能组合,如果不应用于业务问题,它就毫无价值。如果你不关心那件事,或者只是不知道你如何适应,事情可能不会有那么好的结局。

感谢阅读。

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

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

人们实际关注的仪表板的 3 条规则

原文:https://towardsdatascience.com/3-rules-for-dashboards-people-actually-look-at-7d7c60fa3353?source=collection_archive---------41-----------------------

大多数仪表盘都没用,让我们来解决这个问题。

1)仪表板应该简单。

在我的职业生涯中,有人要求我为几家公司设计仪表板。令我惊讶的是,世界上最大的技术公司之一的营销团队要求我的团队为他们开发仪表板。我以为大型科技公司已经想通了所有这些事情。特别是这家公司,有一整个部门致力于营销分析和测量,并有数百个仪表板供他们使用。

问题是,没有人使用它们中的任何一个

图片来源:https://www . pexels . com/photo/business-charts-commerce-computer-265087/

当我最终看了一下团队已经准备好的仪表板时,不难发现为什么。没有人使用仪表盘,因为没有人知道他们在看什么。请注意,这些是我见过的最漂亮、最复杂的仪表盘——它们充满了许多 KPI、高级图表、统计数据、仪表和表格。这些仪表板是根据最高程度的技术熟练程度和分析能力构建的,但它们未能解决它们应该解决的问题:为业务提供可操作的信息。

不要陷入复杂性=复杂性这一常见陷阱。做得多肯定不一定好。我真的相信莱昂纳多·达芬奇的这句话:“简单是终极的复杂”在你的仪表盘上遵循这个信条(以及你做的几乎所有事情)。如果业务用户不能清楚地理解仪表板给他们带来的价值,他们将永远不会看它。它需要简单易用,让企业用户没有它就无法运营他们的业务。

不幸的是,即使是业务方面的人也可能被非常漂亮的图表和图形所蒙蔽——您甚至可能因为自己构建的极其复杂的仪表板而受到业务部门的称赞。但是这种认可仅仅是企业认可你的技术能力,而不是对你解决了他们的问题感到满意。乍一看,他们会认为你已经解决了他们的问题,因为一切看起来都很棒。但是想都不用想,他们会在一个月之内回到数据透视表和手动数据提取。

2)仪表板用于跟踪和测量,而不是分析。

将大量信息放在仪表板上的诱惑是对数据分析的总体渴望的一部分——业务用户希望获得洞察力,以使他们更好地完成工作。问题是,仪表板是最糟糕的数据分析工具之一。它们不是为回答有关数据的深层问题而设计的,但它们非常适合跟踪和测量。

仪表板擅长回答以下类型的问题:

  • 我表现最好的营销活动是什么?
  • 我们这个月赚了多少钱?
  • 哪些活动的投资回报率最高?
  • 我们表现最好的产品是什么?
  • 有多少物品的库存很低?

仪表板不擅长回答以下类型的问题:

  • 为什么我们的搜索活动胜过我们的社交活动?
  • 明年我们应该在每个渠道上花多少钱做广告?
  • 我们的高价值电子商务客户最常购买的产品是什么?
  • 哪些客户最有可能再次购买我们的产品?

开发你的仪表板,着眼于那些可以 a) 长期跟踪和 b) 根据某些东西衡量的指标。不要只是将数字形象化,将它们与目标、历史时间表或竞争产品进行比较。可视化不仅要回答“什么”的问题以及“什么时候?”而是“跟什么比?”

仪表板应该衡量重要的事情,而不是容易的事情。

工作理论不仅教授如何创新的框架,还教授如何围绕“要做的工作”建立你的组织,并确定重要的衡量标准。工作理论的创始人 Clayton Christensen 博士将这些指标称为“客户利益指标”——换句话说,这些指标表明你的产品或服务在多大程度上解决了它设计解决的工作(与运气竞争,第 161 页)。不幸的是,“客户利益指标”背后的数据通常难以收集。随后,作为分析专家和数据科学家,我们默认使用最容易获得和最容易获得的数据。为了努力让自己感觉有所成就,我们引入、透视并分析了数百个数据源,创建了复杂的模型和令人惊叹的可视化效果,虽然看起来很美,并展示了我们的技术技能,但最终还是达不到目标,即尽可能为企业提供最重要、最有价值的信息。

减少制作仪表板小部件、精美图表或创建新数据管道的时间,将更多时间用于定义最重要的 KPI。然后,制定策略来获取对您的业务真正重要的数据。

规则:

  1. 仪表板应该简单。
  2. 仪表板跟踪和测量,它们不进行分析。
  3. 仪表板应该衡量重要的事情,而不是容易的事情。

有问题或意见吗?你可以给我发电子邮件,地址是 cwarren@stitcher.tech,或者在 Linkedin 上关注我,地址是https://www.linkedin.com/in/cameronwarren/

我还提供数据服务,你可以在 http://stitcher.tech/的[了解更多。](http://stitcher.tech/)

每个数据科学家都需要的 3 种简单的异常值/异常检测算法

原文:https://towardsdatascience.com/3-simple-outlier-anomaly-detection-algorithms-every-data-scientist-needs-e71b1304a932?source=collection_archive---------0-----------------------

深入了解异常值检测,以及如何在 Python 中实现 3 种简单、直观且强大的异常值检测算法

斯科特拍摄的照片。在 Flickr 上的 T

我相信你已经遇到了以下几种情况:

  1. 你的模型没有像你希望的那样运行。
  2. 你会不由自主地注意到,有些地方似乎与其他地方大相径庭。

恭喜你,因为你的数据中可能有异常值!

什么是离群值?

照片可以在证券交易所找到

在统计学中,异常值是与其他观察值显著不同的数据点。从上图中,我们可以清楚地看到,虽然大多数点位于线性超平面中或其周围,但可以看到一个点与其他点有所不同。这个点是一个离群点

例如,看看下面的列表:

[**1**,35,20,32,40,46,45,**4500**]

在这里,很容易看出 1 和 4500 是数据集中的异常值。

为什么我的数据中有异常值?

通常,异常值可能发生在以下情况之一:

  1. 有时它们可能是偶然发生的,可能是因为测量误差。
  2. 有时它们会出现在数据中,因为数据很少是 100%干净的,没有任何异常值。

为什么离群值是一个问题?

以下是几个原因:

  1. 线性模型

假设你有一些数据,你想用线性回归来预测房价。一个可能的假设可能是这样的:

作者照片

在这种情况下,我们实际上对数据拟合得太好了(过拟合)。然而,请注意所有的点是如何位于大致相同的范围。

现在,让我们看看当我们添加一个离群值时会发生什么。

作者照片

很明显,我们看到我们的假设是如何改变的,因此,推论会比没有异常值时更糟糕。线性模型包括:

  • 感知器
  • 线性+逻辑回归
  • 神经网络
  • KNN

2.数据输入

Ehimetalor Akhere Unuabona 在 Unsplash 拍摄的照片

一种常见的情况是丢失数据,可以采取以下两种方法之一:

  1. 删除缺少行的实例
  2. 使用统计方法估算数据

如果我们采用第二种选择,我们可能会有有问题的估算,因为异常值可以极大地改变统计方法的价值。例如,回到我们没有异常值的虚构数据:

# Data with no outliers
np.array([35,20,32,40,46,45]).mean() = 36.333333333333336# Data with 2 outliers
np.array([1,35,20,32,40,46,45,4500]).mean() = 589.875

显然这个类比很极端,但是想法是一样的;数据中的异常值通常是一个问题,因为异常值会在统计分析和建模中导致严重的问题。然而,在这篇文章中,我们将研究一些方法来检测和对付它们。

解决方案 1: DBSCAN

图片来自维基百科

对有噪声的应用程序进行基于密度的空间聚类(或者更简单地说,DBSCAN)实际上是一种无监督的聚类算法,就像 KMeans 一样。然而,它的用途之一是能够检测数据中的异常值。

DBSCAN 之所以受欢迎,是因为它可以找到非线性可分的聚类,而这是 KMeans 和高斯混合所做不到的。当集群足够密集并且被低密度区域分隔开时,它工作得很好。

DBSCAN 如何工作的高级概述

该算法将聚类定义为高密度的连续区域。算法非常简单:

  1. 对于每个实例,它计算有多少实例位于距离它很小的距离ε (epsilon)内。这个区域被称为实例的 ε-邻域。
  2. 如果实例在其ε-邻域中有超过个 min_samples 实例,那么它被认为是一个*核心实例。*这意味着实例位于高密度区域(内部有许多实例的区域)。)
  3. 核心实例的ε-邻域内的所有实例都被分配到同一个集群。这可能包括其他核心实例,因此一长串相邻的核心实例构成一个集群。
  4. 任何不是核心实例或者不位于任何核心实例的ε-邻域中的实例都是离群值。

DBSCAN 正在运行

由于 Scikit-Learn 的直观 API,DBSCAN 算法非常易于使用。让我们来看一个运行中的算法示例:

fromsklearn.cluster import DBSCAN 
from sklearn.datasets importmake_moonsX, y = make_moons(n_samples=1000, noise=0.05)
dbscan = DBSCAN(eps=0.2, min_samples=5)
dbscan.fit(X)

这里,我们将使用 0.05 的ε-邻域长度来实例化 DBSCAN,5 是将一个实例视为核心实例所需的最小样本数

记住,我们不传递我们的标签,因为这是一个*无监督算法。*我们可以看到标签算法使用以下命令生成的标签:

dbscan.labels_OUT:
array([ 0,  2, -1, -1,  1,  0,  0,  0, ...,  3,  2,  3,  3,  4,  2,  6,  3])

注意一些标签的值等于-1:这些是异常值。

DBSCAN 没有预测方法,只有 fit_predict 方法,这意味着它不能对新实例进行集群。相反,我们可以使用不同的分类器来训练和预测。对于这个例子,让我们使用一个 KNN:

from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors=50)
knn.fit(dbscan.components_, dbscan.labels_[dbscan.core_sample_indices_])X_new = np.array([[-0.5, 0], [0, 0.5], [1, -0.1], [2, 1]])knn.predict(X_new)OUT:
array([1, 0, 1, 0])

这里,我们在核心样本和它们各自的邻居上拟合 KNN 分类器。

然而,我们遇到了一个问题;我们给出了没有任何异常值的 KNN 数据。这是有问题的,因为它将迫使 KNN 为新实例选择一个集群,即使新实例确实是一个离群值。

为了解决这个问题,我们利用 KNN 分类器的杠杆 kneighbors 方法,该方法在给定一组实例的情况下,返回训练集的 k 个最近邻居的距离和索引。然后我们可以设置一个最大距离,如果一个实例超过了这个距离,我们就把它定义为离群值:

y_dist, y_pred_idx = knn.kneighbors(X_new, n_neighbors=1)
y_pred = dbscan.labels_[dbscan.core_sample_indices_][y_pred_idx]
y_pred[y_dist > 0.2] = -1
y_pred.ravel()OUT:
array([-1, 0, 1, -1])

这里我们讨论并实现了用于异常检测的 DBSCAN。DBSCAN 很棒,因为它很快,只有两个超参数,并且对异常值很鲁棒。

解决方案 2:隔离森林

照片由作者

IsolationForest 是一种集成学习异常检测算法,特别适用于检测高维数据集中的异常值。该算法基本上执行以下操作:

  1. 它创建了一个随机森林,其中决策树随机生长:在每个节点上,随机选取特征,并选取一个随机阈值将数据集一分为二。
  2. 它继续切割数据集,直到所有实例都相互隔离。
  3. 异常通常远离其他实例,因此,平均而言(在所有决策树中),它变得比正常实例孤立的步骤少。

隔离森林在行动

再次感谢 Scikit-Learn 的直观 API,我们可以轻松实现 IsolationForest 类。让我们来看一个运行中的算法示例:

from sklearn.ensemble import IsolationForest
from sklearn.metrics import mean_absolute_error
import pandas as pd

我们还将引入 mean_absolute_error 来度量我们的误差。对于数据,我们将使用可以从 Jason Brownlee 的 GitHub 获得的数据集:

url='[https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'](https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv')df = pd.read_csv(url, header=None)data = df.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]

在拟合隔离森林之前,让我们尝试对数据拟合一个简单的线性回归模型,并获得我们的 MAE:

from sklearn.linear_model import LinearRegressionlr = LinearRegression()
lr.fit(X,y)mean_absolute_error(lr.predict(X),y)OUT:
3.2708628109003177

相对较好的分数。现在,让我们看看隔离林是否可以通过移除异常来提高分数!

首先,我们将实例化我们的 IsolationForest:

iso = IsolationForest(contamination='auto',random_state=42)

算法中最重要的超参数可能是污染参数,它用于帮助估计数据集中异常值的数量。这是一个介于 0.0 和 0.5 之间的值,默认设置为 0.1

然而,它本质上是一个随机化的随机森林,因此随机森林的所有超参数也可以用在算法中。

接下来,我们将使数据符合算法:

y_pred = iso.fit_predict(X,y)
mask = y_pred != -1

请注意我们如何过滤掉预测值= -1,就像在 DBSCAN 中一样,这些预测值被视为异常值。

现在,我们将为 X 和 Y 重新分配异常值过滤后的数据:

X,y = X[mask,:],y[mask]

现在,让我们尝试用线性回归模型来拟合数据,并测量 MAE:

lr.fit(X,y)
mean_absolute_error(lr.predict(X),y)OUT:
2.643367450077622

哇,成本大大降低了。这清楚地表明了隔离林的威力。

解决方案 3:箱线图+塔克法

虽然箱线图是识别异常值的一种非常常见的方法,但我真的发现后者可能是识别异常值最被低估的方法。但是在我们进入 Tuckey 方法之前,让我们谈谈箱线图:

箱线图

图片来自维基百科

箱线图本质上提供了一种通过分位数显示数字数据的图形方式。这是一个非常简单而有效的方法来可视化离群值。

上下须显示分布的边界,任何高于或低于的都被认为是异常值。在上图中,任何高于 80 和低于 62 的都被认为是异常值。

箱线图如何工作

基本上,盒状图的工作原理是将数据集分成 5 个部分:

照片来自 StackOverflow

  • Min :分布中排除任何异常值的最低数据点。
  • Max :分布中排除任何异常值的最高数据点。
  • Median ( Q 2 /第 50 百分位):数据集的中间值。
  • 第一个四分位数(Q1/25 个百分点):是数据集下半部分的中位数。
  • 三分位数( Q3 /第 75 百分位):数据集上半部分的中位数。

四分位距(IQR)很重要,因为它定义了异常值。本质上,它如下:

**IQR** = Q3 - Q1**Q3**: third quartile
**Q1**: first quartile

在箱线图中,测量出 1.5 * IQR 的距离,并包含数据集的较高观察点。类似地,在数据集的较低观察点上测量出 1.5 * IQR 的距离。任何超出这些距离的都是异常值。更具体地说:

  • 如果观察点低于(Q1 1.5 * IQR)或箱线图下须线,则被视为异常值。
  • 类似地,如果观察点高于(Q3 + 1.5 * IQR)或箱线图上须,,那么它们也被视为异常值。

图片来自维基百科

行动中的箱线图

让我们看看如何使用 Python 中的箱线图来检测异常值!

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as npX = np.array([45,56,78,34,1,2,67,68,87,203,-200,-150])
y = np.array([1,1,0,0,1,0,1,1,0,0,1,1])

让我们绘制一个数据的箱线图:

sns.boxplot(X)
plt.show()

作者照片

根据我们的箱线图,我们看到我们的数据中有 50 个中值和 3 个异常值。让我们去掉这几点:

X = X[(X < 150) & (X > -50)]sns.boxplot(X)
plt.show()

作者照片

在这里,我基本上设置了一个门槛,所有小于-50 大于 150 的点都会被排除在外。而结果;平均分配!

Tuckey 方法异常检测

tuckey 方法异常值检测实际上是盒图的非可视化方法;方法是一样的,除了没有观想。

我有时更喜欢这种方法,而不是箱线图的原因是,有时看一看可视化并粗略估计阈值应该设置为什么并不真正有效。

相反,我们可以编写一个算法,它实际上可以返回它定义为离群值的实例。

实现的代码如下:

import numpy as np
from collections import Counterdef detect_outliers(df, n, features):# list to store outlier indicesoutlier_indices = [] # iterate over features(columns) for col in features:# Get the 1st quartile (25%)Q1 = np.percentile(df[col], 25)# Get the 3rd quartile (75%)Q3 = np.percentile(df[col], 75)# Get the Interquartile range (IQR)IQR = Q3 - Q1 # Define our outlier stepoutlier_step = 1.5 * IQR # Determine a list of indices of outliers outlier_list_col = df[(df[col] < Q1 - outlier_step) |     (df[col] > Q3 + outlier_step)].index # append outlier indices for column to the list of outlier indices outlier_indices.extend(outlier_list_col) # select observations containing more than 2 outliersoutlier_indices = Counter(outlier_indices)        multiple_outliers = list(k for k, v in outlier_indices.items() if v > n)return multiple_outliers# detect outliers from list of features
list_of_features = ['x1', 'x2']
# params dataset, number of outliers for rejection, list of features Outliers_to_drop = detect_outliers(dataset, 2, list_of_features)

基本上,该代码执行以下操作:

  1. 对于每个特征,它获得:
  • 第一个四分位数
  • 第三个四分位数
  • IQR

2.接下来,它定义了异常值步长,就像在箱线图中一样,它是 1.5 * IQR

3.它通过以下方式检测异常值:

  • 查看观察点是否为< Q1 — outlier step
  • Seeing if the observed point is Q3 + outlier step

4. It then checks selects observations that have k 异常值(在这种情况下,k = 2)

结论

总之,有许多离群点检测算法,但我们通过 3 个最常见的:DBSCAN,IsolationForest 和 Boxplots。我鼓励你:

  1. 在 Titanic 数据集上尝试这些方法。哪一个检测异常值最好?
  2. 寻找其他异常值检测方法,看看它们的性能比您最初尝试的方法更好还是更差。

我真的很感激我的追随者,我也希望不断地写作,给每个人提供很好的精神食粮。然而现在,我必须说再见;}

照片由 ZoeyMoey 在 Flickr 上拍摄

为什么在做其他事情之前应该首先可视化数据的 3 个简单原因

原文:https://towardsdatascience.com/3-simple-reasons-why-you-should-first-visualize-data-before-doing-anything-else-63ec05d86d9?source=collection_archive---------21-----------------------

由西部边界摄影 chris gill 在 Unsplash 上拍摄

我们大脑处理的 90%的信息是视觉的,我们大脑处理视觉的速度比文本快几千倍。为什么不利用一下呢?

介绍

当我在中学解决几何问题时,我总是做的第一件事是将可用的数据可视化,尤其是那些只有文字描述的问题。把它放在一个环境中,假设小学生要解决下面的假设问题。

三角形的边长分别是 3 厘米、4 厘米和 5 厘米。最大的角度是多少度?

A. 85 度
b .90 度
c .95 度

对于开始上四五年级的小学生来说,他们可能还不知道勾股定理。他们解决这个问题的最好办法是画一个精确尺寸为 3、4 和 5 厘米的三角形(希望如下),然后测量最大的角度。他们应该能发现最大的角度是 90 度。

边长分别为 3、4 和 5 厘米的三角形—作者

做数据科学不仅仅是处理三个数据点。对于更复杂的数据,可视化数据对于理解我们的数据更加重要。在这里,我看到了许多优秀的文章,它们介绍了各种方便的数据可视化工具(例如 Tableau 和 Python 模块,如matplotlibseaborn)以及各种用于不同场景的精美图表(例如热图、蜘蛛图),主要用于结果报告。

令人惊讶的是,据我所知,在数据科学项目的早期阶段,很少有人讨论数据可视化的重要性。缺乏广泛的讨论可能是因为 1)经验丰富的数据科学家认为这是他们懒得谈论的例行步骤,2)新数据科学家可能没有意识到可视化数据作为关键预处理步骤的必要性。

在这篇文章中,我想与您分享为什么我们应该在开始任何后续数据处理和分析步骤之前可视化我们的数据的三个主要原因。在我们开始之前,有四件事需要注意。

  1. 为了提供概念证明,我将使用模拟相关数据模式的合成数据,这些数据模式在现实世界中可能会遇到,也可能不会遇到。如果您愿意,请随意使用您的数据。BTW:你可以在 GitHub 上找到本文使用的代码。
  2. 只有当分辨率合理时,可视化才有意义。因此,对于一个庞大的数据集,您必须运行一些迭代来逐段查看数据,以生成清晰的图表。
  3. 本文面向初级到中级水平的数据科学家。优先考虑使用 Python 及其相关模块(例如 Pandas)的知识,但是这里介绍的原理仍然适用于使用其他数据处理和可视化工具。
  4. 这篇文章并不详尽。对于下面讨论的每一个原因,都有其他可视化方法来实现相同的目标。此外,在运行任何分析或构建模型之前,我们应该可视化我们的数据还有其他原因。

1.理解缺失模式

由于各种原因,真实世界的数据存在缺失问题。由于种族和收入等隐私问题,受试者拒绝回答具体问题。受试者意外输入了不正确的数据(例如,电话号码中缺少一个数字)。在纵向研究中,一些受试者因退出或死亡而退出研究。

因此,了解我们数据的缺失是很重要的,尤其是那些从现实生活研究中收集的数据。事实上,我们可以用描述性统计来计算缺失的数据,但是可视化数据是生成数据缺失的总体印象的一种强大而直接的方法。

合成数据的生成

在上面的代码片段中,我们生成了随机数的数据帧。然后我们注入一些缺失的数据。了解总体缺失模式的最简单方法是使用热图,如下所示。浅米色的每个单元格代表一个缺失值。

热图揭示的缺失模式

根据这张热图,我们可以得出以下观察结果。1)总体来说,这个模拟数据集的缺失度还不错。为了找出每个变量的确切数量,我们可以使用一些描述性统计。2).如果每行代表一个纵向研究中受试者的数据,似乎有些受试者在不同的时间点退出了研究。我们可以对照他们的数据图表。3).两栏中缺少所有受试者的数据,这非常令人担忧。工作人员可能误解了该方案,因此没有按预期收集这些数据。或者,这些数据可能还没有输入数据库。

使用这个简单的热图可视化丢失的数据有助于我们理解这个数据集的丢失模式,**,更重要的是,它可以引导我们回到数据源以恢复一些丢失的数据。**最后,我们可以减少数据中的遗漏,我们都知道完整的数据集对任何数据科学项目来说有多么重要。

2.识别异常值

数据预处理的一个早期步骤是处理离群值,离群值是与数据集中的其他数据值明显不同的数据值。它们的发生至少有两个原因。第一,数据输入错误。例如,缺少一个小数会使值增大 100 倍(10.24 对 1024)。第二,数据集有真正的离群值。例如,在健康人群的生理学研究中,大多数受试者的静息心率为 60-100 BPM,但出于某种原因,受试者的心率为 130 bpm,这可能是一个真正的异常值。

我们会知道异常值对数据分析的负面影响。这里有一个真实的例子,我不知道它是否被研究过。考虑研究大学辍学对一个人在商业上成功的影响。我们可能会错误地得出这样的结论:与在哈佛读完四年相比,从哈佛退学会大大增加你成为亿万富翁的可能性。为什么会这样?这都是因为比尔·盖茨和马克·扎克伯格这两个真正的异类都从哈佛退学了。

玩笑归玩笑,数据可视化是识别数据集中可能的异常值的强大方法。根据数据结构的性质,有不同类型的图表可以显示异常值。在这里,我只是给大家展示一些常见的。

要使用单变量方法可视化异常值,箱线图在大多数情况下都适用。 如下图所示,我生成了 10000 个正态分布的随机数。使用箱线图,我们可以看到这个数据集有异常值,我们必须处理。处理异常值可能是未来一篇文章的另一个主题。

箱形图

如果我们要研究两个连续变量之间的关系,我们在大多数情况下可以使用散点图。 如下图,我生成了两个一维的随机数数组,它们之间有一个投影的线性关系。我人为地添加了一些可能的异常值。如您所见,这四个异常值明显远离散点图中的其他点。请注意,对于真实世界的数据集,如果可能的话,我们需要回到数据源,以验证这些数据是在没有任何人为错误的情况下收集的有效值。

散点图

3.产生有意义的假设

在我正在进行的数据科学或神经科学研究中,利用现有数据开发一些可测试的假设至关重要。类似地,在机器学习设置中,总是需要形成一些假设,并用训练数据集开发一些有意义的模型,我们希望在测试数据集中运行模型时能够保持这些假设。

类似于离群值的识别,给定数据集的特定数据结构将决定我们在进行任何测试之前如何可视化数据。例如,如果您试图确定两个连续变量之间可能的线性关系,您可以从散点图开始,如上一节所示。既然您已经看到了,我将向您展示另外两种类型的图,以针对特定的研究需求生成其他潜在的假设。

**如果你试图在纵向研究中找出一个趋势,最好从折线图开始。**在下面的例子中,我从 Kaggle 下载了烟草使用数据。为简单起见,我只将全国平均数据归入日常吸烟者和戒烟者类别。因为百分比数据是作为字符串读取的,所以为了绘图的目的,我将它们转换为浮点数。从线图中,我们可以观察到每日吸烟率下降的趋势,而以前吸烟者的流行率保持不变。通过确定这一趋势,我们可能会产生一个假设,即 2010 年后,每日吸烟率将继续下降。

线形图

**如果您试图研究两个变量(连续和/或分类)之间的关系,有几个选项可用,例如散点图(我们在上一节中用于线性关系的那个)、热图和条形图。**为了向您展示一些不同的东西,我将向您展示蜂群图,它有助于检查分类变量和连续变量之间的关系,并显示了后者的分布。

典型的例子包括比较两组之间特定测量的差异,以及比较同一组手术前后的差异。很大程度上,这就像是独立 t 检验和从属 t 检验。

群体图和箱线图

假设我们想要研究性别(生物医学研究中使用的一种生物因素,而不是使用性别,这具有一些社会影响)是否影响新冠肺炎的特定严重性度量 ABC。上图显示了使用seaborn模块混合盒状图的群体图的数据模拟和生成。有了这个数字,我们可以假设男性的 ABC 因子水平可能比女性高,这个假设我们可以在以后用更大的人群进行测试。

结论

数据预处理是一门艺术,它将顶尖的数据科学家与平庸的科学家区分开来。数据预处理步骤中的一些关键部分是缺失值和异常值的识别和处理。我们必须仔细观察数据,以确保数据本身的质量。如果条件允许,回到数据源验证数据完整性,从源头上消除人为错误总是一个好主意。

除了检查我们数据的文本描述之外,在我们数据处理步骤的早期阶段可视化数据,而不是保存可视化工具以便稍后展示最终产品,这是非常有用的。这种可视化提供了一种基本的方式来告知数据质量并为接下来的分析步骤生成可能的有意义的假设。

传达数据见解的 3 个简单步骤

原文:https://towardsdatascience.com/3-simple-steps-to-communicating-data-insights-6eeac0f790ba?source=collection_archive---------38-----------------------

使数据可操作的简单框架。

照片由马太·亨利发自突发

在 People Analytics 工作时,我经常发送数据,尤其是以仪表板的形式。仪表板很棒,因为它们能以简洁的方式直观地显示大量信息。我喜欢构建仪表板,因为它可以让我发挥创造力,以直观的方式显示不同类型的数据。

对我来说,这些仪表盘充满了等待实施的见解。我非常兴奋,全心全意地投入到这些吸盘中,并高兴地将它们发送给利益相关者。然后,什么也没发生。而且令人心碎。

经过一段时间的哀悼,我开始挖掘哪里出了问题。我不明白我是如何将所有这些伟大的数据交到需要它们的人手中,但他们却没有使用它们。你还想从我这里得到什么?!

问题是,人们被仪表盘弄得不知所措,不知道从哪里开始。我看到了数据但那又怎样?我在数据上花费了太多的时间,以至于有时我忘记了大多数人并没有这样做。虽然解释数据对我来说已经变得很直观,但那些没有整天、每天忙于数字的人需要花更多有意识的努力来解释。

我发现一个非常简单的交流数据的公式非常有用。我开始自己使用这个公式,然后开始把它教给其他人,这样他们就可以从他们的数据中得出自己的见解。

[性能]与[性能指标评测]= >[操作]

  1. 选择一个基准
  2. 情境化表演
  3. 行动计划

完成这些步骤后,您就可以交流从数据中获得的见解。根据我们的基准,我们的表现如何?我们应该做些什么?

1.选择一个基准

让我们从选择一个基准开始。在我们知道自己表现如何之前,我们首先需要知道什么是“好”。我们需要把我们的表演放在上下文中。

假设我们正在查看一个营业额仪表板,并希望向领导报告结果。有几种方法可以选择要比较的基准:

  • 行业标准其他公司客服员工平均离职金额是多少?
  • 内部组比较一个部门的营业额与整个公司的营业额相比如何?一个办公地点的营业额与另一个办公地点的营业额相比如何?
  • 历史对比。这个团队去年的营业额是多少?
  • 公司目标。我们公司的目标是将营业额保持在 25%以下。

决定使用哪种类型的比较的关键是,你希望它足够相似,这样才有意义。例如,如果您正在查看两个完全不同的办公地点(例如,不同的员工数量、不同的角色等),则内部组比较可能没有意义。).类似地,如果在过去的一年中发生了显著的变化(例如,您的规模扩大了一倍),那么历史比较可能没有意义。虽然苹果和苹果的比较几乎是不可能的,但我们希望避免苹果和长颈鹿的比较。

除了上述考虑,使用公司目标应该谨慎。目标理论又是一堆令人着迷的蠕虫,但请记住,这些目标通常需要灵活。这个目标对这个部门有意义吗(即,这是一个我们可能有不同期望的特定类型的部门吗)?考虑到当前背景(如组织变革、就业市场等),此目标是否有意义。)?

2.周边绩效

一旦我们选择了我们的基准,我们就可以将我们的表现联系起来。这可能非常简单。我们本质上需要与领导者沟通,如果他们需要坚持到底,或者如果他们需要做出改变。

以下是一些将我们的表演放在上下文中使用的形容词示例:

  • 更高或更低
  • 更好还是更坏
  • 更快还是更慢
  • 赛道上还是赛道外

假设我们将发送一封电子邮件给 Jolly,他是我们位于棒棒糖森林的客户服务呼叫中心的领导。我们决定使用内部组比较作为我们的基准:甘草泻湖一个类似规模的客户服务呼叫中心。

在我们的示例中,假设甘草泻湖的年初至今周转率为 18%,棒棒糖伍兹的年初至今周转率为 24%。简单来说,你可以简单地说棒棒糖伍兹的营业额比我们的对照组高,或者更低。这至少给了领导者一个衡量他们营业额表现的标准。

如果我们想更进一步,我们可以使用多个基准测试。喔,小心。我们可以说棒棒糖伍兹的营业额高于我们的对照组,也略高于他们去年的营业额。这是令人兴奋的东西!现在我们开始深入研究我们该做些什么。

3.行动计划

现在,我们知道了与我们的基准相比我们的表现如何,我们需要知道如何去做。

拥有一个潜在行动计划库是一个很好的做法,您的组织愿意为各种情况做出承诺(例如,如果我们的人员流动率高,我们的参与度低,等等,我们准备采取什么行动)。).例如,一个降低流动率的潜在行动计划是给每个人加薪 100 万美元,但这对你的公司可行吗?(如果是,请打电话给我)。这样,当我们准备好从我们的数据中提取见解时,我们可以根据我们的绩效和基准选择最佳的预先审核的行动计划。

也许我们已经了解到以下做法有助于降低离职率:与员工进行职业对话、轮岗计划、增加学习机会。一旦我们有了可用的可能选项库,我们就可以根据绩效和环境选择适当的行动计划。

如果我们回到棒棒糖森林的例子,我们知道我们的营业额高于去年,也高于我们的对照组。我们在棒棒糖森林的营业额偏离了轨道。

我们来看看我们的银行降低流动率的潜在行动计划。在查看我们的行动计划时,我们知道我们目前没有增加学习机会的预算,所以我们现在忽略这一点。在考虑其他选择时,我们可能不知道员工是愿意进行更多的职业对话还是愿意参加轮岗计划。

如果我们需要更多信息,我们可以查看对离职调查的回复(如果我们有),或者我们可以与员工组成焦点小组,讨论目前是什么让他们留在自己的岗位上,以及什么会让他们对组织更加忠诚。

在查看了离职调查的反馈后,我们发现大多数离开公司的员工表示,他们离开公司是因为他们觉得在公司内没有明确的职业发展道路。正因为如此,你决定与员工进行职业对话,讨论他们的目标是什么,他们在组织中的下一步是什么,这是解决棒棒糖森林中人员流动增加的最佳行动方案。

现在,我们已经选择了最合适的行动方案,我们准备完成给我们的领导 Jolly 的电子邮件。

今年迄今为止,棒棒糖森林的营业额高于去年,也高于对照组。为了让棒棒糖森林的营业额重回正轨,我建议我们与所有员工进行职业对话。这些对话旨在通过确保员工感觉到他们有一个清晰的职业道路和在组织中成长的方向来增加保留率。

灯光,摄像机,开拍。

照片由马太·亨利发自突发

摘要

只要记住,和领导分享数据洞察的时候,不需要很复杂。领导者需要知道他们是否需要继续做他们正在做的事情,或者他们是否需要做一些不同的事情。按照以下步骤开始:

  1. 选个标杆
    -行业标准
    -集团内部对比
    -历史对比
    -公司目标
  2. 将表现
    -更高或更低
    -更好或更差
    -更快或更慢
    -在轨或离轨
  3. 行动计划
    -有银行
    -考虑背景
    -获得更多反馈

继续用你的头撞墙,这样会好很多!

我是一名工业组织心理学家,在 People Analytics 工作。我相信工作应该是有趣的,龙舌兰酒应该被认为是药用的,数据应该民主化。

3 个简单的步骤来大幅改善你的代码

原文:https://towardsdatascience.com/3-simple-steps-to-make-your-code-startlingly-better-f6505aa4e125?source=collection_archive---------44-----------------------

编写更干净代码的快速指南。

Mahmudul Hasan Shaon 在 Unsplash 上拍摄的照片

“当我在解决一个问题时,我从不考虑美。但当我完成后,如果解决方案不漂亮,我知道它是错的。”— 巴克明斯特富勒

现在是下午晚些时候。你有一个你已经做了一整天的功能,你被一个你无法解决的 bug 卡住了——你知道这种 bug 会产生这样的想法:“也许我应该把整个电脑扔掉,去做桌子谋生”听起来是个好主意。但是你咬紧牙关,挺过去了。

你终于找到了解决办法。这是丑陋的地狱,你知道这一点,但它的工作…目前。

作为开发人员,我们都对此感到内疚。我们制定了一个可行的计划,但不幸的是,这是对我们工匠精神的嘲弄。

我将与你分享我获得的 5 个简单的技巧,它们将对你的代码质量产生巨大的影响。

命名你的函数来反映你的意图

写程序时,函数的命名是非常重要的。它会对理解代码的难易程度产生巨大的影响。

一个名副其实的函数可以传达你的意图,让你的代码看起来更像自然语言。而命名不当的函数会掩盖程序员的真实意图。

这里有一个简单的例子来说明我的观点。你能告诉我这个函数在做什么吗?

handleEdit = (e) => {// Prevent navigation to axios post.e.preventDefault();// Get user id from contextconst userId = this.context.user._id;// Get updated user info from statelet user = {fname: this.state.fname,lname: this.state.lname}// Send PUT request to edit route using updated useraxios.put(`http://localhost:3000/user/edit/${userId}`, user).then( res => {if ( res.status === 200 ){this.setState({ successMessage : res.data });this.context.user.fname = res.data.fname;this.context.user.lname = res.data.lname;this.toggleInputs();}}).catch( err => {console.log(err);});
}

逐行阅读代码后,您可能会认为代码试图更新用户。标题 handleEdit 回避了“我们到底在编辑什么?”

现在来看看这个名字更新后的例子。

updateUser = (e) => {// Code here
}

你看到了吗?代码不需要确定这个函数在做什么。这是一个将会更新用户的功能。这个名字清楚地表明了我的意图。

这就引出了下一点。

命名您的变量以反映您的意图

命名变量以反映您的意图会对您的代码产生很好的影响。

考虑这个例子。这段代码旨在让用户确认他们想要停用他们的帐户。这是原始代码。

var deactivationResponse = window.confirm("Are you sure you would like to deactivate your account?"); if( deactivationResponse ){doSomething()
}

还不错。它确实传达了我们正在依赖某种回应。但是它可以自动阅读。这是更新的版本。

var userConfirmsDeactivation = window.confirm("Are you sure you would like to deactivate your account?");if( userConfirmsDeactivation ){doSomething()
}

这样好多了。你甚至不需要阅读原始变量来完全理解我们正在检查的条件。

去掉那些臭评论!!

照片由 Unsplash 上的 u j e s h 拍摄

评论有多种形式。有些是有用的,提供了丰富的上下文和信息,这些信息可能是非常特定于领域的,并且可能难以置信地难以通过单独的代码进行交流。这些注释很重要,可以为您和其他必须编写代码的人节省宝贵的时间。

但是,大部分评论都是训练轮。当我们为变量和函数留下一串无意义的名字时,我们依靠注释来帮助我们找到一个有效的程序。

注释帮助我们对写得不好的代码感觉更好,或者更糟的是,它们重述了显而易见的事实。你应该尽可能地写好你的代码,因为当你的代码读起来像自然语言的时候,注释就会碍事。

软件开发既是一门科学,也是一门艺术。作为开发人员,我们最崇高的目标是编写不仅仅是工作的代码——而是编写我们可以毫无压力地阅读的代码,易于维护的代码,以及我们可以引以为豪的代码。

我想以对罗伯特·塞西尔·马丁(Robert Cecil Martin)的快速点头作为结束,他是*《干净的代码:敏捷软件工艺手册》*的作者,这篇文章的灵感很大程度上来自于测试他的作品中分享的设计原则对我来说是多么有效。如果你觉得这篇文章有用,我强烈建议你把这本书加入你的阅读清单!

理解数据变化的 3 个简单步骤

原文:https://towardsdatascience.com/3-simple-steps-to-understand-changing-data-871e829c7785?source=collection_archive---------37-----------------------

数据分析师探索数据的框架

今天,深入分析数据分析中的变化。图片来源:艾米·李斯特。

“每周购买量下降了!!为什么??怎么会??救命啊!!"—如果你是一名数据分析师,你肯定以前从苦恼的同事那里听说过类似的事情。变化是每项业务的一部分,并且发生在所有时间范围内。它可以影响许多领域,如网站上的每周购买量、生产的单位数量或天气。当人们看到变化时,他们会被驱使去理解是什么导致了变化,这样他们就可以制定合适的行动计划。作为分析师,我们应该促进这种理解,并概述核心问题。

在这篇文章中,我们将探索一些常见类型的变化进行分析。我们还将讨论您可以用来理解这些变化的方法。这些是数据分析师使用的基本描述性(或诊断性)分析方法,但任何对利用数据感兴趣的人都可以应用它们。

请注意,当某个值或指标与之前的值不同时,我们定义了该值或指标的变化。除了时间之外,维度也会发生变化,比如位置的变化。可以将下面讨论的许多方法应用于这些其他类型的方差。

我们将遵循这个粗略的结构:

  1. 考虑系统环境中的指标,以及其他可能相关的指标。
  2. 按不同维度分解指标,检查总体变化。
  3. 寻找可能引起变化的事件,发现相互关系。

我们将采取的分析变化的步骤的概要。虽然我通常会建议遵循这里描述的顺序,但是从一个开始并在另一个停止肯定是可能的。

第一步:查看其他指标

当查看正在变化的特定指标时,我们倾向于采用狭隘的观点。我们专注于这个单一指标,以及它是如何上下波动的。这对于那些严格跟踪既定指标的成熟团队来说尤其如此。查看指标时要记住的一个关键点是,所有指标都有缺陷。虽然一个给定的度量标准对某些用例可能是好的,但它在其他用例中可能会失败。一个指标可能很好地代表了一种行为,但却无法捕捉到另一种行为。因此,最好的第一步是查看其他指标,看看它们是如何受到影响的。

最好的第一步是查看其他指标,看看它们是如何受到影响的。

您可以从查看竞争指标开始。竞争指标是指在竞争相同资源时会向相反方向移动的指标。Youtube 视频上的赞和评论就是一个例子。一个引起人们注意“喜欢”按钮的产品变化会增加喜欢,但会减少评论。在这里,这两个功能争夺用户的注意力,以获得留下反馈的方法。当然,随着总浏览量的增加,喜欢和评论可能会一起上升。其他例子包括不同服装品牌的销售额或使用不同应用程序的时间。对于您的分析,您可能会发现,当您的典型指标下降时,另一个指标却上升了。这甚至可能对业务有益!

其他值得关注的指标是组成指标。组成指标是由其他指标“组成”的指标。拿某电商网站上的购买次数来说;这可以用一种方式分解为:

purchases = no. visitors x sign-up rate x sign-up to purchase rate

在分析每个指标时,可以看到后两个指标是恒定的,而访问者的数量却下降了。总的来说,组成指标通过将指标分解成更小的块,为您提供了另一种研究指标的方法。

与分支根类似,组成指标可以以多种不同的方式组合起来,组成一个被研究的指标。图片来源:佩里克利斯 Lolis 。

请注意,在选择如何分解指标时,有许多可能的选项。通常有些并不比其他的更明显,这使得做出正确的决定成为一种艺术。在这种情况下,拥有强大的业务经验是相当有价值的。例如,对于某些业务来说,一些指标会有内在的利益。当然,如果你能调查所有的指标,那是最好的。通过使用脚本和警报的更加自动化的方法,这当然是可以实现的。

在这个过程中,其他指标没有以预期的方式变化也变得很明显。这通常是引起警报的原因,因为问题可能是由数据跟踪错误引起的。

无论是组成指标、竞争指标还是其他指标,停下来想想其他可能影响系统变化的指标。通常,通过分析其他指标,我们可以检测到更强的信号,从而显著降低分析的难度。

第二步:分析不同的维度

一旦你有了你确定要分析的指标,是时候深入细节了。检测变化的下一步是分析数据中的各个维度。我们所说的维度指的是数据点的各种属性。你可以考虑用户有不同的维度,比如年龄、性别、设备、国家和语言。这些维度描述了用户,并允许我们将数据分成不同的组。

检测变化的下一步是分析数据中的各个维度。

客户细分是数据分析的经典之一。

通常我们把用户组(或者任何东西,真的)称为细分。对于数据分析师来说,确定业务的关键部分非常重要。这可以通过业务驱动的方法来实现,例如,我们了解不同国家的用户有不同的行为,或者通过应用一些统计分析(数据科学),如用户聚类。识别不同的细分市场后,就可以分析指标的相应变化。这可以显示更改如何影响不同的用户,并缩小搜索范围。

另一个需要注意的关键是混合换档。在混合移位的情况下,段的混合有一个移位。这有点棘手,所以让我们考虑一个电子商务商店的例子,它销售两种产品,下面是两个不同时期的数据。

Product A: 100->200 Sales, 5% CVR

Product B: 200->200 Sales, 10% CVR

老板注意到网站的整体转化率(销售/用户)有所下降,并要求分析师进行调查。根据以上所学,分析师决定按产品进行分解。他们很快发现每个产品都有稳定的转化率——这怎么可能呢?这是一个典型的混合换档案例。由于 A:B 的产品比例(组合)已从 1:2 变为 1:1,因此转换率较低的产品 A 现在对总指标有更大的影响。实际上,我们的销售有所增长,两种产品都卖得很好,我们只是看到了衡量标准的假象。

理解 Mix-shift 很重要,因为它通常可以将坏的变化转变为中性的,甚至是好的变化(正如我们在本例中看到的)。在分析长期趋势(如同比变化)时,许多宏观事件会影响分析结果,这种情况也很常见。

理解关键维度以及它们如何变化通常有助于理解事物为什么会发生变化并缩小搜索范围。

**最后一步:**确定原因

确定并理解了指标和细分后,最后一步是找出导致变化发生的确切原因。用更专业的术语来说,我们在寻找指标和一些潜在事件之间的相关性。获取事件列表的常见位置有:

  • 产品发布历史;例如新的推荐算法、界面更新
  • 所采取的营销或业务发展行动的清单;例如,新的广告活动开始,新的产品列表添加到库存中
  • 和世界大事;例如公共假日或自然灾害。

总的来说,从一个组织内的不同团队收集信息,找出可能与问题相关的东西,是有启发性的。理想情况下,上述所有内容都已被记录下来,以便轻松利用,但如果没有,最好开始记录!

确定并理解了指标和细分后,最后一步是找出导致变化发生的确切原因。

在一个理想的世界中,我们可能会看到类似下面第一幅图的东西:一个独特的事件导致了一个显著的、值得注意的变化。这种情况可能发生在低噪声环境或有较大变化的环境中(这里我们关心的是信噪比),但在日常实践中非常罕见。我们通常看到的更像是第二幅图,我们有相同的指标平均差异,但噪声要高得多。

来自单一事件的度量阶跃变化的两个示例。在左图中,潜在的变化或噪声相当低,因此变化非常明显。在右图中,变化是相同的,但是潜在的噪声要高得多,使得用肉眼和任何平稳性分析都很难检测到这种变化。

对于第一种情况,让某人相信变化是由特定事件带来的是相当容易的。在第二种情况下,我们可以通过一些统计显著性测试来达到这个目的。一种常见的方法是平稳性测试,例如增强的 Dickey-Fuller 测试。

也可能不是单个事件导致了度量的变化,它可能是一个累积的过程,在上面讨论的方法中是检测不到的。在这种情况下,及时做一个相关性分析可能是有建设性的。一种方法是识别竞争对手,并将您的指标与其他平台的日常指标进行对比。根据公司的规模,您可能会看到正相关或负相关,随着时间的推移,这些指标会以显著的方式相互移动。这将告诉您,变化的一部分是由于相关的指标。

其他要考虑的事情

在进行数据分析时,需要考虑更多的事情(否则我们就失业了),其中一些包括设置假设、将数据放在上下文中并纳入更广泛的理解。

在以上各点中,我们一直在含蓄地做出假设。这是值得明确的,因为陈述你的假设创造了一个更科学和可重复的方法。创建假设也有助于避免持续的挑选数据的风险,在这种情况下,选择数据是为了找到一个结论,但我们没有找到数据的负面情况会被忽略。

我们经常没有花足够的时间坐下来思考潜在的假设。一开始就投资这一次真的很值得,因为它可以在以后省去很多痛苦。投入的时间也可以提高对产品的总体理解。做的时候尽量不要做这个表情就好!图片来源:布鲁斯·马尔斯。

我们应该始终努力将数据放入背景中。在执行分析时,说某个指标下降可能很容易,但为什么要止步于此呢?如前所述,大多数企业都有许多相互交织的指标,因此如果一个指标下降,另一个指标可能上升。值得检查其他关键指标,并标记是否有任何其他原始请求者可能没有注意到的意外差异。也许这次下跌意味着另一次上涨,这将对企业产生整体的良好影响。同时,记录下你分析过的所有其他领域也很有用,因为这些问题不可避免地会出现。

变化本身,就是变化。虽然我们可能会看到指标的变化,但未来的预期行为是什么样的?该指标会稳定在新值,还是会继续发展?这对于产品的变化特别有意思。你可以想象一个类似 Snapchat 过滤器更新的功能。当过滤器被更新时,许多用户将与它交互,并且最初的分析可能显示出改进,但是随着用户对该特性感到厌倦,它将再次开始改变。在大多数情况下,预测长期行为并不容易,但值得注意的是它是否可能发生,并计划在以后重新分析。

当我们谈论基于时间的事件时,我们没有进入季节性的话题。由于月与月之间的波动,指标以相对可预测的方式上下波动是很常见的。执行分析时,最好通过将指标值与您预期的指标值进行比较来调整这种季节性。预测可以是单纯基于去年的简单预测,也可以是使用像脸书的预言家这样的模型进行更详细的预测。

这篇文章中的语言集中在坏的变化上——但是我们不要忘记事情并不总是在下降,它们也会上升。然而在商业中,我们倾向于关注消极的一面,试图理解哪里出了问题,而不是正确的一面。同样重要的是,花时间了解事情为什么会上涨,这样这些知识就可以用于进一步发展业务。

结论

分别考虑上面讨论的每一点是很重要的。它们各有千秋,可以帮助构建更全面的数据视图。我们讨论了在系统的上下文中考虑指标,按照不同的维度分解指标,以及搜索可能导致变化的事件。

在整个数据中,我特别提到了数据分析师作为受众,但在现实中,许多工作现在都是数据驱动的,我认为对数据分析和如何思考变化的基本理解对我们所有人都是必要的。因此,如果你有同事可能从中受益,请与他们分享!或者,如果你有没有提到的你喜欢使用的技术,让我们来讨论一下。

更好地构建 SQL 查询的 3 个简单技巧

原文:https://towardsdatascience.com/3-simple-tricks-to-better-structure-your-sql-queries-f5e3b38d58e2?source=collection_archive---------5-----------------------

以及立即应用它们的实际例子

卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

SQL 代表结构化查询语言。不幸的是,这并不意味着一旦你开始用这种计算机语言编程,你就会自然而然地写出一段结构完美的代码。

作为一名数据分析师,我不断地应用三个简单的规则来更好地组织我的 SQL 查询。它们不仅让我避免了从数据库中查询的错误,还为我自己和与我分享查询的同事节省了时间。让我向您展示这些技巧,并用一个真实的例子来说明它们。

1.可视化您的查询输出

高效地构建 SQL 代码始于牢记您想要实现的结果。问自己这个简单的问题:我希望我的输出表看起来像什么?

特别要注意以下几点:

  • 粒度级别:您希望您的输出表处于哪种聚合级别?换句话说,每行应该对应什么?
  • 输出字段:根据查询生成的表格,您将使用哪些字段?换句话说,每一列应该对应什么?
  • 输入变量:你的数据从哪里来?换句话说,您将在查询中处理的变量的性质是什么?

让我们用一个例子来实践第一个技巧。想象一下,你的老板刚刚让你分析上个月销量的演变。为此,您将需要检索每天(粒度级别)的产品数量(输出字段),知道您可以访问一个数据库表,该表汇总了客户在过去几个月中所做的购买(输入变量)。

因此,您的查询输出应该如下表所示:

玛丽·勒费夫尔

2.使用 WITH 子句

要生成所需的表,您需要采取许多步骤。当我开始用 SQL 编码时,我的第一反应是从关键字“SELECT”开始。但有了经验,我现在系统地从“用”这个关键词入手。乍一看,使用 WITH 子句可能会让您认为这会使您的查询看起来过于复杂。但是我可以向你保证即使对于相对简单的查询,它也可以让你组织你的思维,让你的查询更容易阅读和理解

WITH 子句的另一个主要优点是,您可以构造一系列子查询,每个子查询都可以引用(或不引用)前一个子查询。通过这样做,您将避免在主查询中编写无穷无尽的嵌入式子查询,从而减少失去思路的风险。使用 WITH 子句允许您在代码底部编写主查询之前,首先检索并计算主查询中请求的所有字段。

让我用前面的例子来说明这一点。编写获得所需输出所需的代码的第一种方法是:

使用 WITH 子句的另一种方法是:

请注意,这两个查询具有相同的性能,并且具有相同的代码行数。然而,第二段代码向读者展示了通向主查询的逻辑步骤:首先从表“sales”中检索原始字段,在适当的级别对它们进行计算,然后在主查询中使用它们。虽然对于这个示例,第一个版本对大多数用户来说可能已经足够清楚了,但是您可以很容易地想象到,对于更复杂的查询,不使用 WITH 子句可能会导致大量的嵌入式子查询,从而导致代码的高度复杂性。

3.勤奋写作

在行动最激烈的时候,你可能没有花时间以最干净的方式编写代码。不关心代码中的每一个语法规则的诱惑确实很大。协调一段代码也可能是痛苦的,似乎是浪费时间,特别是如果原始代码正确运行并做了它应该做的事情。

然而,我建议你在把你的代码放在一边之前花点时间仔细检查一下——也许六个月后再回来问自己“这部分代码应该做什么?”。首先,即使你现在确信你将永远记住你的代码的逻辑,你以后可能会回想起它,并且不记得它是如何被构造的。如果做得好,你会节省很多时间。第二,其他人可能需要阅读和重用你的代码。除非你确定你或其他任何人以后都不会使用你的作品,否则请考虑以下部分。

协调你的代码语法并确保其风格的一致性并不意味着你必须花费数小时来重写你的代码。一些免费工具允许你根据广泛使用的标准或者你自己定义的格式化规则来重新格式化你的代码。它们可以是您的查询工具中的功能(例如 Google 的 BigQuery 控制台中的“格式查询”)、在线工具(例如像 Poor-SQL 或 sql-format 这样的网站)或您的文本编辑器中的附加包(例如 Sublime Text 的“SqlBeautifier”)。

校对您的代码时,请注意以下元素的一致性:

  • 缩进:对齐所有具有相同性质并且处于相同聚合级别的字段,可以更容易理解代码背后的逻辑。
  • 大小写:对所有 SQL 关键字使用相同的大小写规则(通常为大写)和另一种独特的字段大小写逻辑(例如 camelCase、snake_case 或 PascalCase)可以更容易地理解每个单词在查询中扮演的角色。
  • 注释:用来注释一段代码的字符可能会根据你使用的数据库管理系统(RDBMS)而有所不同(双连字符、斜杠、hashtag…),因此,调整整个代码中用来注释它的语法是至关重要的。

如果回到前面的例子,您会注意到我对 SQL 关键字使用了大写,对字段名使用了 snake case。由于我习惯于 BigQuery 中的标准 SQL,所以我使用双连字符来添加注释。

结论

如果您处于 SQL 编程的初级阶段,这些技巧将有助于您更加自信地编写查询,因为它们鼓励您组织自己的思维,并通过这样做,使您编写的代码更加清晰。

如果您在 SQL 掌握方面处于更高级的水平,这些技巧将鼓励您更好地组织代码,并使其易于被其他人理解,而不管他们的背景和 SQL 熟练程度如何。

你喜欢阅读这篇文章吗? 成为 的一员,加入一个不断成长的充满好奇心的社区吧!

[## 加入 Medium!

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

marie-lefevre.medium.com](https://marie-lefevre.medium.com/membership)

强化学习(RL)前需要掌握的 3 项技能

原文:https://towardsdatascience.com/3-skills-to-master-before-reinforcement-learning-rl-4176508aa324?source=collection_archive---------30-----------------------

你需要能够训练神经网络,将搜索视为规划,并理解学术论文。

当我在搜索强化学习的掌握时,通过所有的教程和课程,有一些他们认为你知道的常用工具。最终,你要应用的领域中的小弱点会变成大错误。

来源——作者在俄勒冈州本德的冒险经历。

1.监督学习

现代强化学习几乎完全专注于深度强化学习。短语深度强化学习中的单词 深度 暗示了在算法的核心方面使用神经网络。神经网络在学习过程中进行一些高维近似。也就是说,模型不需要有许多层和特性,这是一个常见的误解,即深度意味着许多层。

几乎所有的课程和教程都会假设你能够微调简单的神经网络来逼近状态值或者创建最终的策略。这些模型在历史上对以下所有训练参数高度敏感:学习率、批量大小、模型参数、数据标准化等等。再加上难以解决的任务,调试 RL 可能会非常困难,就像一个二元的它工作它不工作。通过了解所有的次近似都达到标准,消除混淆的尾巴。最好的方法是学习监督学习,然后让一个 AutoML 工具为你完成这项工作。

从一些代码开始,破坏一切,然后重新构建。这样做几次,你应该很好去。监督学习也是一项技能,在未来十年里,它将转化到计算机科学的几乎所有领域,所以,努力追求它吧。

在使用现代人工智能系统时,你会经常看到这个草图。

2.人工智能中的搜索方法

RL 是策略空间中的搜索问题。近年来最具影响力的报纸一直从过去的搜索问题中获得严肃的灵感。让我们来看看最近 RL 最有影响力的三篇论文:

  1. 迄今为止最主流的强化学习成果: Deepmind 用 at-scale 强化学习对很多游戏的掌握。最近的结果是使用规划网络来探索未来行动的长链。
  2. 基于模型的 RL 的最新发展水平:基于模型的策略优化 (MBPO)。MBPO 正在状态-动作空间的附近区域进行搜索,以获得系统动力学的更完整的知识。这种模拟的知识就像一种肤浅的、面包优先的搜索。
  3. 无模型 RL 中的艺术状态:软演员-评论家(SAC)。SAC 以结合高效探索和高峰性能而闻名。它通过最大化策略上的熵项来做到这一点。直接策略搜索是 RL 作为搜索问题的最关键的方面。

RL 中的规划对于基于模型的强化学习的子领域(相对较小,但正在增长)来说是一个巨大的胜利,该子领域试图学习离线规划的环境模型。

*你问:我在哪里可以重温一下**搜索的概念?*这里是我学习的地方:加州大学伯克利分校的和麻省理工学院的人工智能课程简介。然后做一两个代码项目,挑战自己。

来源——我们在 CS188 的一次讲座。

3.理解学术论文

请注意,我没有说阅读学术论文。关键是要能够理解他们。

学术领域变化很快,活跃的 Twitter 社区每天都有论文发布(说真的,关注几个著名的研究人员——这对让你跟上进度很有帮助)。你需要学习的是区分有影响力的论文噪音以及进度炒作*。*

现在不是转发或引用的问题——尽管我承认引用是一个很好的替代——而是实质性的实验。机器学习的出版周期是粘性的,研究人员预计一年出版多次。你应该看的是实验:它们是遵循一个问题、实验、然后解决的弧线,还是只是逐步改进另一个人的方法?最好的论文是在寻找真理,而不是数字。

最好的研究寻找最重要的问题,不管学术讨论的浪潮如何。学会辨别这些信号,你就能跟上这个领域,成为下一个十年有价值的人力资源。

来源,我在机器人学和 ML 方面的 3 篇论文

我已经写了很多在强化学习中建立基本技能的教程,见下面的大纲。

* [## 到底什么是马尔可夫决策过程?

了解大多数强化学习问题中使用的模型。

towardsdatascience.com](/what-is-a-markov-decision-process-anyways-bdab65fd310c) [## 强化学习的隐藏线性代数

线性代数的基础如何支持深度强化学习的顶点?

towardsdatascience.com](/the-hidden-linear-algebra-of-reinforcement-learning-406efdf066a) [## 强化学习的基本迭代方法

学习价值和策略迭代能掌握多少强化学习?很多。

towardsdatascience.com](/fundamental-iterative-methods-of-reinforcement-learning-df8ff078652a) [## 强化学习算法的收敛性

有什么简单的收敛界限吗?

towardsdatascience.com](/convergence-of-reinforcement-learning-algorithms-3d917f66b3b7)

继续学习!

更多?订阅我关于机器人、人工智能和社会的时事通讯!

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)*

给 Julia 的 3 个流畅的语法技巧

原文:https://towardsdatascience.com/3-smooth-syntactical-tips-for-julia-65ddf577f071?source=collection_archive---------61-----------------------

用这些令人兴奋的技巧最大化你的语法!

(茱莉亚标志由 http://julialang.org/提供)

伟大的代码编写艺术,尤其是像 Python 和 Julia 这样的高级语言,是一种相当容易学习的东西——但却难以掌握。即使非常熟练的程序员也有可能在他们的语法中犯看似基本的错误。然而,拥有清晰简洁的代码不仅在可读性标准上很重要,而且在做错的时候也会产生非常严重的影响。学习一些伟大的技术和快捷方式来执行操作,这绝对是一个让你的代码发光并让你的同事喜欢你的绝妙方法。幸运的是,有成千上万的小技巧可以用来增强你的代码。

笔记本

№1:布尔逆

让我们来看看下面的场景:

mutable struct lightstatus
end
function turn_on(light)light.status = truereturn(light)
end
function turn_off(light)light.status = falsereturn(light)
end

在这个例子中,我们可以使用 turn_on 和 turn_off 方法打开或关闭灯光。

如果我们想把两者结合成一个功能呢?

对于条件语句来说,这是一项显而易见的工作,许多程序员会这样处理这个问题:

function use_switch(light)if light.status == truelight.status = falseelselight.status = trueend
end

首先,我们检查灯光是否设置为 true。这将首先需要来自处理器的 MOV 指令,其中由变量 light.status 表示的数据将被移动到注册表核心中进行比较。接下来,还需要将 true 移动到注册表核心中。然后,将执行一个 CMP 指令来比较这两个值,这将改变一个标志—(但在这种情况下,他们可能会使用 JNE 条件转移来代替。)

接下来,计算机需要将我们的 false 移动到当前保存 light.status 变量数据的内存中。如果我们的标志从未被更改,那么下面将有一个部分,它将在代表 light.status 变量的地址处移入我们的内存。

因此,如果 light.status 为真,这个条件语句至少需要 4 条指令。如果是假的,最少需要 6 个指令。幸运的是,在 Julia 中,我们有一个用于反转 bool 类型的操作符。为了在 Julia 中这样做,我们可以使用=!。

function use_efficient_switch(light)light.status =! light.statusreturn(light)
end

现在让我们建立一个小的性能测试,并测量这两种方法之间的差异。我构造了两个函数在 for 循环中调用这些不同的方法。然后我用@time 宏运行这两个函数,看看这个小小的改进会带来什么样的不同。

function flick(bulb, iters)for i in 1:itersuse_switch(bulb)end
end
function flickeff(bulb, iters)for i in 1:itersuse_efficient_switch(bulb)end
end

显然好多了

由于需要移动到内存中的值更少了,我们浪费的时间更少了,甚至减少了分配。不仅如此,还有这个:

看起来比这好多了:

№2:调度一切!

如果您是 Julia 的新手,您可能会很高兴了解到该语言有一个多态分派,允许您基于某些标准(如类型或值)来路由方法。下面是调度用法的一个基本示例:

从两个函数开始,在这个例子中,我们想要打印一个数组的每个元素,或者打印一个整数。下面是实现这一目的的两个函数:

function handle_array(arr)[println(i) for i in arr]
end
function handle_int(int)println(int)
end

需要明确的是,迭代地执行 println()和在一行上打印数组是有区别的。

我们还从 for 循环中得到一个有趣的三元素 nothing 返回。如果您想取消它,您总是可以添加一个;到循环的终点。我们可以将这些合并到一个函数中,通过使用 Julia 的调度来处理这两种类型,如下所示。为此,我们只需使用=运算符。

inlineprint(arr::Array) = handle_array(arr)
inlineprint(arr::Int64) = handle_int(arr)

结果是:

现在我们可以就此打住,这本身就是一个强大的工具,但重要的是要记住,函数只是一个有着花哨名字的类型。朱莉娅的伟大之处在于我们能够利用这一点。首先,你应该理解语法表达。这些当然是朱莉娅语法的一大部分,而且是一种只因为分派而存在的能力。让我们举一个速度的例子:

mutable struct car_statsdistancetimespeed
end
honda_civic = car_stats(25, 40, nothing)

在这个特定的场景中,我们知道汽车行驶的距离,以及汽车行驶那么远所用的时间。我们缺少这辆车的速度数据,我们需要找到它。如果你还记得的话,这个公式就是距离除以时间得到速度。所以与其写这样一个函数:

function speed(carstat)mph = carstat.distance / carstat.timereturn(mph)
end

我们可以用 Julia 返回时间的调度创建一个语法表达式:

我们甚至可以更进一步,使用 dispatch 将这些方法作为一种类型的子方法,这是非常不可思议的!为此,我们首先需要创建另一个分派函数来返回我们的类型:

typemaker(speedfunc,civic) = ()->(speedfunc;civic)

然后,我们将为变量分配相应的方法和速度统计类型:

d = typemaker(speed,honda_civic)

现在我们可以跑了

d.speedfunc(d.civic)

作为一个新的 Julia 开发人员,你可能犯的最大错误之一就是没有利用 Julia 的调度并充分发挥它的潜力!

№3:滤镜!

Filter 可能是来自 Julia 库的最有用和最通用的工具之一,尤其是如果你像我一样,经常发现自己在对大量数据进行排序。您可以花费数小时构建循环来确定数据中是否满足某些条件,或者您可以只使用 filter!Filter 是 Python 的 Pandas 的条件屏蔽的 Julian 等价物,然而,它被合并到语言的基础中,使它更快并且与语言的其余部分的语法非常一致。

在数据操作中,过滤是实现各种不同目标的一种很好的方法。毫无疑问,能够有效地使用这种方法将会使您在 Julia 中管理数据时受益匪浅。考虑以下数据:

x = 1:10

使用过滤器!,我们可以根据每个 dim 是否满足特定条件来决定包含或排除哪些数据。比方说,我们只想得到能被 3 整除的值:

filter((x) -> x % 3 == 0, x)

虽然这是一个相当不实用的例子,但它确实以最基本的方式展示了 filter 的用法。在基本的统计测试中,这可能会派上用场。在 Julia 中有许多方法可以做到这一点,但是 filter 始终是一种非常有效的方法。

结论

在 Julia 语言中,有很多很酷的小技巧可以用来升级语法,让事情变得更简单。从像操作符和多态调度这样令人惊奇和复杂的工具到像过滤器这样简单的基本功能!,使用 Julia 语言总有一些很好的东西可以让你的代码更快更简洁。

学习数据科学的 3 个阶段

原文:https://towardsdatascience.com/3-stages-of-learning-data-science-9a04e96ba415?source=collection_archive---------42-----------------------

了解学习的 3 个阶段,以及我们如何将其应用于学习数据科学

本·怀特在 Unsplash 上的照片

人们常说数据科学是 21 世纪最性感的工作。在这方面,在某种程度上,为什么这么多人想学习数据科学是有道理的。

数据科学是一个巨大的领域,通常将它作为一门非学术学科来对待是极其令人生畏的。我哪里知道?看看我的 LinkedIn 个人资料…

[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

我已经从一名送信员到一名房间助理,再到作为一名机器学习工程师的实习,为了让你更加放心,在那之前我在职业水平上踢足球,如果我们再往前追溯,在某个阶段我已经准备好成为一名主要的跆拳道战士——我知道,这是很大的变化,少谈我没有分享的东西,但也许我可以在以后的帖子中详细介绍。

我最大的技能是我的学习能力。我一直都知道这个。我从来不相信我学不到东西,但我从来不知道为什么或如何做到这一点。我花时间研究和思考我是如何学会走到现在这一步的,并认为我应该与我的同行分享我发现的信息,这样我们就可以一起将数据科学领域提升到难以想象的高度。因此,为了加速数据科学的发展,我有责任与尽可能多的有兴趣的人分享我是如何学习数据科学的。

该过程

学习有一个过程。为什么这很重要?知道有一个过程是很重要的,因为过程描述了事情是如何完成的。如果我们知道事情是如何完成的,那么这将为我们提供关注和使过程变得更好的潜力。如果我们能够改进流程,我们就更有可能取得成功。

如果你以正确的方式关注正确的过程,你就能设计出通往成功的道路。—我不知道这是否是其他人的真实引用,但如果不是,我要求第一 dabs!

听过“爱上过程这句话吗?是的,这很常见,但是我们很少思考我们说的话。我会证明,爱上下一个你见到的陌生人。我这么说是为了向你证明,爱上一个你不了解的东西是非常困难的,所以我们要想爱上过程,就需要了解过程。我们知道精通需要时间。它需要持续一段时间的计划和专注。考虑到这一点,我们可以开始…

为了有效地规划您的数据科学职业生涯,重要的是要知道您想要去哪里,然后弄清楚您想要如何到达那里。这里有一些你可能想回答的问题:

我的目标是什么?

我想去哪里?

为了弄清楚如何到达那里,知道你目前在哪里是很重要的。你可能会问自己:

我有什么技能?

要达到我的目标,我需要哪些技能?

在回答这些问题时,你做了两件对获得新技能至关重要的事情。首先,你给了自己一个方向感,其次,尽管如果你是一个领域的新手,可能需要一些研究来知道你需要什么技能,但你给了自己一条可以遵循的路线。把你的精力用在你需要学习的每一项技能上,可以被认为是实现总体目标的动力。

“要到达你要去的地方,你必须知道你在哪里”——鲍勃·普罗克特

学习的三个阶段

当我们获得新技能时,我们会经历 3 个阶段,作为一名数据科学家,有许多技能是必需的,理解这些阶段是学习令人兴奋的原因。为什么?因为当你回顾这些阶段时,你可以指出你在哪里,这将使你更清楚地知道你需要做什么。

认知阶段

*问题:*在这个阶段,我们要解决的问题是理解我们要做什么。

在没有获得关于你所学内容的先验知识的情况下,学习一个主题是非常困难的。

许多人决定上大学,许多人喜欢书本,许多人喜欢在线课程。他们都有什么共同点?有一个人,一名教师,积累了该主题的先验知识,他们正在将他们的经验传授给你——我看到许多人问学习数据科学是否需要博士或硕士学位,我认为这是主观的。你必须评估你的目标来做决定。

*特点:*你可以期待在有很多不一致的情况下,在你的表现中体验到巨大的收益。在这个阶段,指导是必要的,反馈也是必要的。

一个与数据科学相关的指令的例子可以是每周学习 2 个算法,并从头开始对它们进行编码。这项任务的反馈可以通过对照工作实现测试您的解决方案来给出,以查看您的得分是否相同。

目标:这一部分的目标是以一种可转移的格式吸收和有意义地组织信息,以便在下一阶段使用。

由 Robina Weermeijer 在 Unsplash 上拍摄的照片

关联阶段

问题:这个阶段我们要解决的问题是把潜在的动力转化为现实的动力。

我们都听说过这样一句话:知识就是力量。在信息时代的崛起中,我们通过一两次点击就可以获得大量的信息,事实证明知识并不是真正的力量。知识是潜在的力量,因为知道一些事情并不一定会影响变化。

我们在认知阶段积累了我们想要学习的技能,在这个过程中积累了大量的潜在能力。要认识到这种力量,我们必须付诸行动。

练习,练习,再练习!

正如你从我上面的简历中看到的,我在两个方面都是运动员,我能回忆起这个阶段的一件事是进入这个阶段的重复时间。我会花一个小时表演同样的反踢,或者当我踢足球时,我会花几个小时练习任意球来完善我的技术(如果我找不到我的视频,如果有足够多的人要求观看,我可能会把我的靴子挂起来)。

照片由海莉·凯瑟琳在 Unsplash 上拍摄

就数据科学而言,这可能只是简单的特征工程。想做好人?利用您在认知阶段学到的关于特征工程的知识,有意识地将它们应用到不同的数据集,并评估它如何影响您的模型的结果。在这样做的过程中,你可以了解什么样的策略对不同的数据集是有效的,并从本质上消除那些不起作用的东西。

这是我关于特征工程的文章,可以帮助你开始…

[## 数字数据的特征工程

工程数值的技巧

towardsdatascience.com](/feature-engineering-for-numerical-data-e20167ec18)

*特点:*这个阶段需要大量有意识的努力。事实上,开始的时候可能会感觉非常别扭,需要做很多小的调整来提高你的表现。完成任务可能比有经验的人多花你几个小时、几天或一周的时间,但关键是要记住,从前他们也像你一样,他们也经历过这个阶段。

目标:这里的目标是把许多小技能放在一起,这些技能反过来会积累起来,让你在将来不被你的同龄人认出来。

自治阶段

呜…流动的状态。

戈登·威廉姆斯在 Unsplash 上的照片

我们在播客、TED 演讲等中听说过它。我们都渴望的心流状态。

在这种状态下,我们可以以最高的熟练程度进行表演。我们不太关注技能,因为我们可以自动做到这一点——这意味着我们不必去想它,它只是流动。

这在数据科学中有什么用?这样想,你有没有见过当一个新的比赛在 Kaggle 上开始时,总是同一批人直接冲到排行榜的顶端?是的,他们!他们在流动。他们已经学会了在 Kaggle 上竞争,什么可行,什么不可行。他们在无数的比赛中一遍又一遍地练习,现在你所看到的当他们冲向顶峰时是他们劳动的成果。

这项技能已经被编入你的潜意识中,现在你可以将注意力集中到表演的其他方面。

结论

这个过程可能需要很长时间,但是相信这个过程会让旅途变得轻松。尽管要记住的一件关键事情是,自动阶段会强化任何在这个过程中养成的坏习惯,而坏习惯是很难改变的。从经验丰富的专业人士那里学习最佳实践,永远是最好的开始方式,而不是从头开始。

如果您认为我遗漏了什么或不同意某些观点,您的反馈很有价值。发个回应!如果你想和我联系,我是 LinkedIn 上最活跃的,我也很乐意和你联系。

[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

这里是我的一些其他文章,你可能会觉得有趣…

[## 用随机模型预测

使用 ARIMA 模型预测沃尔玛的销售数据

towardsdatascience.com](/forecasting-with-stochastic-models-abf2e85c9679) [## 有效的数据可视化

构建有效的数据可视化的技巧可以简化为 3 个简单的步骤

towardsdatascience.com](/effective-data-visualization-ef30ae560961) [## 特征选择入门

选择有用功能的初学者指南

towardsdatascience.com](/getting-started-with-feature-selection-3ecfb4957fd4)

数据科学面试中你应该知道的 3 个统计学概念

原文:https://towardsdatascience.com/3-statistics-concepts-you-should-know-for-data-science-interviews-54d827ec242c?source=collection_archive---------16-----------------------

你应该知道的基本统计概念

由故事创建的数据向量—www.freepik.com

数据科学家基本上是现代统计学家。以下是你在数据科学面试中最有可能遇到的 3 种常见的统计学问题。出现如此频繁的原因是,它们是许多数据科学应用程序的基本构建模块,如贝叶斯机器学习或假设检验。

请记住,有许多许多统计概念是重要的,例如,我没有包括中心极限定理,但在谈论概率分布时,这仍然是一个重要的概念,所以从这里拿走你想要的东西。

说到这里,我们开始吧!

除此之外我推荐的另一个资源是StrataScratch。它有数百个数据科学面试问题,并帮助我提供了像这样的资源!所以查一下 这里

1.贝叶斯定理/条件概率

简单明了,你需要了解贝叶斯定理和条件概率(方程见下文)。最流行的机器学习算法之一 Naive Bayes 就是建立在这两个概念之上的。此外,如果你进入在线机器学习领域,你很可能会使用贝叶斯方法。

贝叶斯定理

条件概率

例题:你即将登上飞往西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 2/3 的机会对你说真话,1/3 的机会用谎言来搞乱你。三个朋友都告诉你“是的”下雨了。西雅图真的下雨的概率有多大?

回答:你可以看出这个问题与贝叶斯理论有关,因为最后一个陈述本质上遵循这样的结构,“给定 B 为真,A 为真的概率是多少?”因此,我们需要知道西雅图在某一天下雨的概率。假设是 25%。

P(A) =下雨的概率= 25%
P(B) =三个朋友都说在下雨的概率
P(A|B)假定他们说在下雨的概率
P(B|A)假定在下雨的情况下三个朋友都说在下雨的概率= (2/3) = 8/27

第一步:求解 P(B)
P(A | B)= P(B | A) * P(A)/P(B),可以改写为
P(B)= P(B | A)* P(A)+P(B |非 A)* P(非 A)
P(B)=(2/3)* 0.25+(1/3)* 0.75 = 0.25 * 8/27+0.75 * 1/27

第二步:求解 P(A | B)
P(A | B)= 0.25 *(8/27)/(0.25 * 8/27+0.75 * 1/27)
P(A | B)= 8/(8+3)= 8/11

因此,如果三个朋友都说在下雨,那么有 8/11 的几率是真的在下雨。

更多类似问题,查看我的免费资源 这里

2.计数应用程序

如果你从事网络安全、模式分析、运筹学等工作,组合和排列是非常重要的。让我们再来回顾一下这两者分别是什么:

排列

定义:n 个元素的排列是这 n 个元素按照确定的顺序的任意排列。有 n 个阶乘(n!)排列 n 个元素的方式。注意粗体字:顺序很重要!

一次取 r 的 n 个事物的排列数被定义为可以从 n 个不同元素中取出的 r 元组的数目,并且等于以下等式:

例题:一个 6 位数的车牌有多少种排列?

回答

组合

定义:在顺序不重要的情况下,从 n 个对象中选择 r 的方式数。

一次取 r 个的 n 个事物的组合数定义为一个具有 n 个元素的集合中具有 r 个元素的子集的数目,等于以下等式:

例题:从一副 52 张牌中抽出 6 张牌有多少种方法?

回答

请注意,这些都是非常非常简单的问题,可能会比这复杂得多,但是您应该很清楚上面的例子是如何工作的!

3.概率分布/置信区间

人们很容易在概率分布中迷失方向,因为概率分布太多了。也就是说,如果我必须选择五个主要的发行版,它们是:

  1. 正态分布
  2. 泊松分布
  3. 二项分布
  4. 指数分布
  5. 均匀分布

例句问题:苏格兰的凶杀率从前一年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?

回答:由于这是一个泊松分布问题,所以均值=λ=方差,也就是说标准差=均值的平方根。

  • 95%的置信区间意味着 z 值为 1.96
  • 一个标准偏差= sqrt(115) = 10.724

因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。

感谢阅读!

仅此而已!我希望这对你的面试准备有所帮助,并祝你在未来的努力中好运。读完这篇文章后,希望你对这三个概念有一个基本的理解。如果你觉得你需要更多地研究这些概念,我会查看我的免费数据科学资源,它涵盖了概率基础和概率分布。

特伦斯·申

  • 如果你喜欢这个, 跟我上 Medium 了解更多
  • 我们来连线一下LinkedIn
  • 检出StrataScratch

定义有效数据科学流程的 3 个步骤

原文:https://towardsdatascience.com/3-steps-to-define-an-effective-data-science-process-60df5724fe18?source=collection_archive---------73-----------------------

图片来自:https://unsplash.com/photos/pKeF6Tt3c08

在本文中,我将探索如何创建一个定义良好的数据科学过程。

具体来说,我将解释团队的数据科学流程是如何由(1)团队的数据科学生命周期框架(即团队的数据科学流程工作流),(2)团队的协调框架,以及(3)这两个框架的集成组成的。

数据科学流程培训

如果您正在寻找关于如何在项目中有效使用数据科学流程的更深入的解释,请探索来自数据科学流程联盟的培训。

但请阅读下文,快速了解如何定义数据科学流程。

数据科学流程不仅仅是数据科学生命周期

当我向领导数据科学团队的人询问他们的数据科学流程时,许多人会描述一个数据科学生命周期(即他们的数据科学流程工作流——比如首先获取数据,然后清理数据,然后创建一个机器学习模型)。其他人对“作为一个团队工作以完成工作”给出了模糊的回答。

然而,尽管定义生命周期肯定是有用的,但是定义生命周期并不等同于定义健壮的数据科学团队流程。

换句话说,虽然拥有定义良好的数据科学生命周期肯定是团队流程的一个重要方面,但如果只谈论团队的生命周期(即团队的数据科学工作流),就错过了流程的一个关键方面!即团队应该如何协调他们的工作。

定义协作流程

虽然大多数生命周期框架明确指出团队可能需要“循环回到”先前的阶段,但是这些框架并没有定义团队应该何时(或者为什么或者如何)循环回到先前的阶段。因此,如果一个数据科学团队仅仅使用一个生命周期框架,团队本身仍然需要定义如何/何时返回到先前的阶段。

这就是为什么定义团队如何在项目团队中区分工作优先级和交流信息的流程也很重要(我称之为“数据科学协作流程”)。如果没有有效的方法在团队中沟通,团队经常会听到他们的利益相关者/客户认为:

  • 生成的模型/洞察没有用(或者他们不信任数据和/或模型)。
  • 数据科学团队没有生产力(因为利益相关者不理解做一个完整的机器学习项目需要什么)。
  • 数据科学团队没有专注于最高优先级的任务(因为利益相关者没有明确的方式与数据科学团队协调和协作)。

在许多方面,数据科学团队使用的流程类似于 30 年前软件团队的领导方式——团队专注于做什么,而不是如何做。

因此,为了帮助团队定义有效的数据科学流程,本博客的其余部分将解决以下三个关键问题:

  1. 团队在项目期间可能会使用什么数据科学生命周期(数据科学工作流程)?
  2. 什么样的框架可以用来帮助团队改进他们的合作方式?
  3. 数据科学团队应该如何将他们的数据科学生命周期框架与其数据科学协调框架相集成?

1.选择一个数据科学生命周期

(数据科学流程工作流)

CRISP-DM 于 20 世纪 90 年代设计,是描述数据科学项目中步骤最常用的框架。它定义了项目的 6 个阶段:

  1. **业务理解:**确定业务目标;评估形势;确定数据挖掘目标;制定项目计划
  2. **数据理解:**收集初始数据;描述数据;探索数据;验证数据质量
  3. 资料准备(一般是最耗时的阶段):选择资料;干净的数据;构建数据;整合数据;格式化数据
  4. **建模:**选择建模技术;生成测试设计;建立模型;评估模型
  5. **评估:**评估结果;审查过程;确定后续步骤
  6. **部署:**计划部署;计划监控和维护;制作最终报告;审查项目

另一个定义数据科学生命周期的框架是 TDSP (团队数据科学过程),是微软在 2016 年推出的。它定义了数据科学生命周期的 5 个阶段(业务理解、数据获取和理解、建模、部署、客户接受)、4 个项目角色(小组经理、团队领导、项目领导和个人贡献者)以及要在指定项目阶段完成的 10 个工件。简而言之,TDSP 试图使 CRISP-DM 阶段现代化,并引入一些额外的结构(例如,角色)。

还有许多其他生命周期框架,但其中大多数(如 Domino Data Lab 的 框架 )在本质上是相当相似的——即描述数据科学项目中的步骤。

2.选择数据科学协调框架

团队用来帮助协调和区分工作优先级的一种方法是 看板 ,它帮助团队将工作分成几个部分(每个部分都是一项任务),然后在能力允许的情况下将工作拉出来(而不是在需要时将工作推入流程)。看板提供了一套原则,通过减少他们的在制品,并使团队能够根据需要(基于之前任务的结果)重新确定任务的优先级,来帮助团队变得更加敏捷。简而言之,看板的两个主要原则是:

  • 可视化流程——看板直观地展示了通过任务进行的工作,这些任务在指定的工作完成度增加的列中流动
  • 最小化进行中的工作——专注于完成进行中的任务,以便可以通过已完成的任务获得洞察力(通知什么可能是有用的未来任务)

然而,尽管有用,看板并没有定义团队如何协调和优先处理要做的事情。因此,一个使用看板的团队需要定义额外的结构来帮助他们,例如,区分任务的优先级。

敏捷协调框架

像 CRISP-DM 在 20 世纪 90 年代定义的 Scrum ,确实定义了一个协调框架(例如,团队如何区分任务的优先级,从而帮助他们决定何时“循环返回”)。事实上,Scrum 是软件开发项目中最流行的团队协作框架,因此,许多人很自然地想到在数据科学项目中使用 Scrum。例如,Scrum 定义了会议、角色、工件和执行迭代的固定持续时间冲刺的过程。然而,在数据科学环境中使用 Scrum 有几个挑战(比如很难估计数据科学任务需要多长时间,这使得定义 sprint 中的内容非常具有挑战性)。

数据驱动 Scrum (DDS)是一个较新的框架,解决了使用 Scrum 时遇到的许多挑战。DDS 利用了最初 scrum 的一些关键方面(比如角色),但是定义了一个更适用于数据科学项目的迭代框架。例如,迭代不是有时间限制的,而是由一小组任务(通常是实验或假设)定义的,这些任务包括创建、观察和分析任务。

3.整合团队的生命周期和协调框架

如果一个数据科学团队(或数据科学团队领导)选择一个生命周期框架以及一个数据科学适当的协调框架,一个明显的问题是“我们如何集成这两个框架”?

实现这种集成的一种方法是将迭代定义为贯穿项目生命周期阶段的一个“循环”。另一种方法是让迭代包含项目生命周期中的一个阶段。

这两种方法都可以独立于团队使用 CRISP-DM、TDSP 或任何其他生命周期框架。

了解更多信息

本文只是简单地解释了什么是适合数据科学团队的数据科学过程。定义和使用一个有效的敏捷数据科学过程当然比阅读这篇文章需要更多的时间、精力和知识。如果您有兴趣更深入地了解这个主题,您可以探索成为 认证数据科学团队领导

虽然这需要一些时间和精力,但是定义一个健壮的数据科学过程是值得的。我亲眼看到,通过解决这三个关键问题,人们可以更有效地领导数据科学团队。这种改进是由这样一个事实推动的,即数据科学团队在需要完成的工作(例如,实施机器学习模型)方面将有一个共同的词汇表(在团队内部以及与利益相关方)。它还将提供一种更容易与利益相关者讨论如何对潜在工作进行优先排序以及如何确保从机器学习模型中生成的见解可由客户组织执行的方式。

原载于 2020 年 8 月 31 日 https://www.datascience-pm.com

预测时间序列的三个步骤:LSTM 与张量流 Keras

原文:https://towardsdatascience.com/3-steps-to-forecast-time-series-lstm-with-tensorflow-keras-ba88c6f05237?source=collection_archive---------4-----------------------

Python 中的一个实用示例,提供了有用的技巧

来源: Adobe 股票

在本教程中,我们用 Python 呈现一个深度学习时间序列分析实例。你会看到:

  • 如何预处理/转换用于时间序列预测的数据集。
  • 当我们的计算机内存有限时,如何处理大型时间序列数据集
  • 如何用tensor flow****Keras神经网络模型拟合长短期记忆( LSTM ) 。
  • 还有更多。

如果你想用机器学习技术分析大型时间序列数据集,你会喜欢这个带有实用提示的指南。

让我们现在开始吧!

我们正在使用的数据集是来自 Kaggle 的家庭用电量。它以一分钟的采样率测量一个家庭的电力消耗。

在 4 年内收集了 2,075,259 个测量值。不同的电量和一些分计量值是可用的。但是我们将只关注三个特性:

  • 日期:日/月/年格式的日期
  • 时间:时间格式为 hh:mm:ss
  • 全局有功功率:家庭全局分钟平均有功功率(千瓦)

在这个项目中,我们将预测 10 分钟后 Global_active_power 的电量。

步骤#1:为时间序列分析预处理数据集

首先,让我们处理数据集,为时间序列分析做好准备。

我们通过以下方式转换数据集 df :

  • 通过组合日期和时间以日期时间格式创建特征日期时间
  • 将 Global_active_power 转换为数字并删除缺失值(1.25%)。
  • 在新数据集中按时间对要素进行排序。

现在我们有一个数据集 df 如下。

接下来,我们将数据集分为训练、验证和测试数据集。

df_test 保存原始数据集中最近 7 天的数据。 df_val 有测试数据集前 14 天的数据。 df_train 有剩余的数据。

相关文章 : 时间序列分析,可视化&与 LSTM
预测本文仅比历史数据提前 1 分钟预测 Global_active_power。
但实际上,我们希望在更长的时间内进行预测,我们将在本文中这样做。

步骤 2:为 TensorFlow Keras 转换数据集

在我们可以拟合张量流 Keras LSTM 之前,还有其他过程需要完成。

让我们一点一点地对付他们!

将数据集分成更小的数据帧

如前所述,我们希望预测未来 10 分钟的 Global_active_power。

下图将问题可视化:使用滞后数据(从 t-n 到 t-1)来预测目标(t+10)。

单位:分钟

在训练模型时遍历数据集是没有效率的。因此,我们希望用代表历史数据和目标的每一行来转换数据集。

单位:分钟

这样,我们只需要使用上述矩阵的每一行来训练模型。

现在挑战来了:

  • 我们如何将数据集转换成新的结构?
  • 当我们的计算机内存有限时,我们如何处理这个更大的新数据结构呢?

因此,函数 create_ts_files 被定义为:

  • 将原始数据集转换为上面的新数据集。
  • 同时,将新数据集分成更小的文件,这样更容易处理。

在该函数中,我们定义了以下参数:

  • start_index :包含在所有历史数据中进行预测的最早时间。
    在本练习中,我们希望从一开始就包含历史记录,因此我们将其默认值设置为 0。
  • end_index :被纳入所有历史数据进行预测的最晚时间。
    在本练习中,我们希望包括所有历史记录,因此我们将其默认值设置为无。
  • history_length :这是前面提到的 n,是每次预测要回顾的时间步数。
  • step_size :历史窗口的步幅。随着时间的推移,Global_active_power 不会快速变化。所以为了更有效率,我们可以让 step_size = 10。这样,我们下采样使用过去每 10 分钟的数据来预测未来的量。我们只看 t-1,t-11,t-21 直到 t-n 来预测 t+10。
  • target_step :未来要预测的期数。
    如前所述,我们试图提前 10 分钟预测 global_active_power。所以这个特性= 10。
  • num_rows_per_file :放入每个文件的记录数。
    这是将大型新数据集分割成较小文件所必需的。
  • data_folder :包含所有文件的单一文件夹。

那是一大堆复杂的参数!

最后只要知道这个函数创建一个文件夹里面有文件就行了。
每个文件包含一个熊猫数据帧,看起来像上面图表中的新数据集。
每个数据帧都有列:

  • y ,这是要预测的目标。这将是 t + target_step (t + 10)时的值。
  • x_lag ,时间 t + target_step — i 的值(t+10–11,t+10–21 等等),即相对于 y 的滞后值。

同时,该函数还返回数据帧中的滞后数(len(col_names)-1)。稍后为张量流模型定义形状时,将需要此数字。

在应用 create_ts_files 函数之前,我们还需要:

  • 缩放 global_active_power 以与神经网络一起工作。
  • 将历史记录长度 n 定义为 7 天(72460 分钟)。
  • 将历史数据中的步长定义为 10 分钟。
  • 将 target_step 设置为 10,这样我们就可以预测历史数据 10 分钟后的 global_active_power。

之后,我们将创建 ts 文件应用于:

  • 在文件夹 ts_data 中创建 158 个文件(每个文件包括一个熊猫数据帧)。
  • 返回 num_timesteps 作为滞后数。

当函数运行时,它打印每 10 个文件的名称。

ts_data 文件夹大约有 16 GB,我们仅使用过去 7 天的数据进行预测。现在,您可以看到为什么需要将数据集分成更小的数据帧了!

定义时间序列对象类

在这个过程中,我们创建一个类 TimeSeriesLoader 来转换数据帧并将其输入到模型中。

有来自 Keras 的内置函数比如 Keras Sequence,tf.data API。但是它们在这方面效率不高。

在这个类别中,我们定义:

  • init :对象的初始设置,包括:
    • ts_folder ,这将是我们刚刚创建的 ts_data。
    • filename_format ,ts_folder 中文件名的字符串格式。
      例如,当文件为 ts_file0.pkl、ts_file1.pkl、…、ts_file100.pkl 时,格式为 ts _ file 。pkl。
  • num_chunks :文件总数(块)。
  • get_chunk :这个方法从一个文件中取出数据帧,对其进行处理,为训练做准备。
  • shuffle_chunks :这个方法打乱了 get_chunk 中返回的块的顺序。这对于建模来说是一个很好的实践。

这些定义可能看起来有点混乱。但是请继续阅读,您将在下一步中看到这个对象的作用。

定义之后,我们将这个 TimeSeriesLoader 应用到 ts_data 文件夹。

现在对象 tss 指向了我们的数据集,我们终于为 LSTM 做好了准备!

步骤 3:创建 LSTM 模型

长短期记忆 ( LSTM )是一种用于深度学习领域的人工递归神经网络(RNN)架构。

LSTM 网络非常适合基于时间序列数据进行分类、处理和预测,因为时间序列中的重要事件之间可能存在未知持续时间的滞后。

如前所述,我们将基于 TensorFlow Keras 库构建一个 LSTM 模型。

根据我们的指南,我们都知道超参数调整的重要性。但是在本文中,我们只是简单地演示了没有调整的模型拟合。

程序如下:

  • 定义输入数据集的形状:
    • num_timesteps ,我们在步骤#2 中设置的数据帧中的滞后数。
      -时间序列的为 1。因为我们只使用了 global_active_power 的一个功能。
  • 定义的数量单位,4 单位(单位+2)是 LSTM 的参数数量。
    数字越高,模型中的参数越多。
  • 定义下降率,用于防止过拟合。
  • 指定输出层具有线性激活功能
  • 定义型号

然后我们还定义了优化函数和损失函数。同样,调整这些超参数以找到最佳选项将是一种更好的做法。

为了在运行之前查看一下我们刚刚定义的模型,我们可以打印出摘要。

可以看到输出形状看起来不错,是 n / step_size (72460 / 10 = 1008)。需要训练的参数数量看起来也很合适(4 单位(单位+2) = 480)。

开始建模吧!

我们分批训练每个组块,只运行一个历元。理想情况下,你可以为神经网络训练多个时期。

在拟合模型之后,我们还可以使用验证数据集来评估模型性能。

与训练数据集相同,我们还创建了一个验证数据文件夹,为模型拟合准备验证数据集。

除了使用验证数据集进行测试,我们还使用最近的历史点(t+10–11)对基线模型进行测试。

下面是详细的 Python 代码。

使用 LSTM 的验证数据集给出的均方误差(MSE)为 0.418。而基线模型的 MSE 为 0.428。LSTM 的表现略好于基线。

我们可以通过超参数调整和更多的纪元做得更好。此外,一些其他重要的时间序列分析技巧,如季节性,也会有所帮助。

相关文章 : 用 Python 调优超参数:完整分步指南

感谢您的阅读!

希望你能在本指南中找到有用的东西。如果你有任何问题,请留言。

在离开之前,别忘了 报名参加刚刚进入数据快讯 !或者通过推特、脸书与我们联系。
因此,您不会错过我们的任何新数据科学文章!

原载于 2020 年 3 月 22 日https://www.justintodata.com

[## 如何在线学习数据科学:你需要知道的一切——进入数据

这是利用在线资源进入数据科学的完整路线图/课程。你是否想学习…

www.justintodata.com](https://www.justintodata.com/how-to-learn-data-science-online-all-you-need-to-know/) [## 什么是冠状病毒死亡率与超参数调整-只是进入数据

我们用 Python 给出了一个深度学习时间序列分析的例子。您将看到:-如何预处理/转换…

www.justintodata.com](https://www.justintodata.com/coronavirus-death-rate-with-hyperparameter-tuning/) [## 如何在 Python 中使用 NLP:一个实用的分步示例——只进入数据

在这篇文章中,我们展示了一个分步的 NLP 应用程序。这是对…的技术解释

www.justintodata.com](https://www.justintodata.com/use-nlp-in-python-practical-step-by-step-example/)

超调 ML 模型时提高效率的 3 个步骤

原文:https://towardsdatascience.com/3-steps-to-improve-your-efficiency-when-hypertuning-ml-models-5a579d57065e?source=collection_archive---------40-----------------------

毫不费力地在不同型号之间切换,不会弄乱代码

由马库斯·佩特里茨在 Unsplash 上拍摄的照片

动机

你可能听说过“没有免费的午餐”(NFL)定理,该定理表明对于每一个数据都不存在最佳算法。一种算法可能在一种数据中表现良好,但在其他数据中表现不佳。这就是为什么有这么多的机器学习算法可以用来训练数据。

我们如何知道哪种机器学习模型是最好的?在我们实验和比较不同模型的性能之前,我们无法知道。但是试验不同的模型可能会很麻烦,尤其是当您使用 GridSearchCV 找到模型的最佳参数时。

例如,当我们完成对 RandomForestClassifier 的实验并切换到 SVC 时,我们可能希望保存 RandomForestClassifier 的参数,以备我们想要重现 RandomForestClassifier 的结果。但是我们如何高效的保存这些参数呢?

如果我们将每个型号的信息保存在不同的配置文件中,就像下面这样,不是很好吗?

experiments/
├── data_preprocess.yaml
├── hyperparameters.yaml
└── model├── random_forest.yaml└── svc.yaml

model下的每个文件将像这样指定它们的参数

当我们想要使用一个特定的模型(假设是 RandomForestClassifier)时,我们需要做的就是运行训练文件,用model=modelname指定我们想要训练的模型

python train.py model=random_forest

能够做到这一点帮助我更快地试验不同的模型,而不用担心丢失用于 GridSearchCV 的特定模型的超参数。这篇文章将向你展示如何毫不费力地在不同的模型之间切换,就像上面的 Hydra 一样。

1:添加九头蛇

Hydra 是一个优雅地配置复杂应用程序的框架。我在这里写了如何使用 hydra 进行数据科学项目。除了配置一个配置文件之外,hydra 还使得处理不同的配置文件变得更加容易。

按照这个教程,简单地克隆这个 repo 。这是我们项目的树形结构

.
├── data
├── experiments
│   ├── data_preprocess.yaml
│   ├── hyperparameters.yaml
│   └── model
│       ├── random_forest.yaml
│       └── svc.yaml
├── predict.py
├── preprocessing.py
├── train_pipeline.py
└── train.py

为了访问experiment中的配置文件,我们将添加hydra.main作为train.py中函数的装饰器,如下所示。config_path指定配置文件的路径,config_name指定配置文件的名称

这就是hyperparameters.yaml的样子

YAML 是最容易理解和使用配置文件的语言。如您所见,要访问训练数据,我们只需使用config.processed_data.text.train

hyperparameters.yaml中,我们放入了与训练相关的一般信息,如数据路径、GridSearchCV 的得分,而不是特定模型的超参数。我们希望在根据我们使用的型号更改型号的配置时,保持文件静态

如果我们想用 SVC 开始训练我们的模型,在hyperparameters.yaml中,我们用

defaults:- model: svc

步骤 2:配置机器学习模型

现在当我们运行python train.py时,Hydra 将尝试在目录模型下搜索文件svc.yaml

因此,我们的下一步是在模型目录下创建一个名为svc.yaml(或者您喜欢的任何其他名称)的文件,如下所示

experiments/
├── data_preprocess.yaml
├── hyperparameters.yaml
└── model├── random_forest.yaml└── svc.yaml

我们的svc.yaml文件将包含模型的名称和用于 GridSearchCV 搜索的超参数

现在当我们跑的时候

python train.py

Hydra 将自动访问模型目录中的svc.yaml配置并使用svc.yaml中的参数!

如果您想使用 RandomForestClassifier,创建名为random_forest.yaml的文件,然后插入关于我们的 RandomForestClassifier 的信息

我们可以在终端中覆盖默认模型,而不是在hyperparameter.yaml文件中更改默认模型!

python train.py model=random_forest

现在我们在train.py中的函数可以通过配置访问这些参数。例如,如果我使用svc模型,这将是我看到的

>>> print(config.model)
SVC>>> print(hyperparameters))
{classifier__C: [.05, .12]classifier__kernel: ['linear', 'poly']classifier__gamma: [0.1, 1]classifier__degree: [0, 1, 2]
}

相当酷!

最后一步:将配置文件放入 GridSearchCV 的参数中

要将字符串“SVC”转换成一个类,请使用eval

*from* sklearn.svm *import* SVCclassifier = eval(config.model)()

现在分类器像普通的 SVC 类一样工作了!

为了将配置文件中的超参数用于值为 Python list 的 Python 字典中,我们使用

现在,您可以像这样在终端的不同型号之间自由切换

python train.py model=random_forest

从现在开始,如果您想要使用一个具有不同超参数的新模型,您需要做的就是为该模型添加配置文件,然后运行

python train.py model=<newmodel>

您的模型无需更改train.py!中的代码即可运行

但是如果我想在配置文件中使用 Python 函数呢?

有时,我们可能想使用不被 YAML 识别的函数,比如classifier__C: np.logspace(-4, 4, 20),而不是写下一些被 YAML 文件识别的特定值,比如列表classifier__C: [.05, .12]

model: LogisticRegressionhyperparameters: classifier__penalty: ['l1', 'l2'] classifier__C: np.logspace(-4, 4, 20) classifier__solver: ['qn', 'lbfgs', 'owl']

放心吧!我们仍然可以通过在字符串周围包装eval()函数来找到解决这种情况的方法!这将把你的字符串np.logspace(-4, 4, 20)变成一个真正的 python 函数!

*for* key, value *in* param_grid.items(): *if* isinstance(value, str): param_grid[key] = eval(param_grid[key])

然后将字典中的所有值转换成 Python 列表,这样它们就是 GridSearchCV 的有效参数

param_grid = {ele: (list(param_grid[ele])) *for* ele *in* param_grid}

结论

恭喜你!您刚刚学习了如何使用 Hydra 来试验不同的机器学习模型。使用这个工具,您可以将代码与数据的特定信息分开。

如果你想改变你的机器学习模型的超参数,你不需要回到你的代码。您只需要为额外的模型再添加一个配置文件,并使用

python train.py model=<modelname>

下面是使用 hydra.cc 和 config 文件的示例项目。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如

[## 如何在一行代码中跨不同环境共享 Python 对象

为建立与他人分享你的发现的环境而感到沮丧?以下是如何让它变得更简单

towardsdatascience.com](/how-to-share-your-python-objects-across-different-environments-in-one-line-of-code-f30a25e5f50e) [## VSCode 中数据科学家的 4 大代码查看器

让 YAML、JSON、CSV 和 Jupyter Notebook 为你工作,而不是与你作对

towardsdatascience.com](/top-4-code-viewers-for-data-scientist-in-vscode-e275e492350d) [## 如何在命令行上创建和查看交互式备忘单

停止搜索命令行。用作弊来节省时间

towardsdatascience.com](/how-to-create-and-view-interactive-cheatsheets-on-the-command-line-6578641039ff) [## 如何有效地微调你的机器学习模型

发现为您的 ML 模型寻找最佳参数非常耗时?用这三招

towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## IBM 联邦学习简介:一种在私有数据上训练 ML 模型的协作方法

在训练来自不同来源的数据时,如何保证数据的安全?

towardsdatascience.com](/introduction-to-ibm-federated-learning-a-collaborative-approach-to-train-ml-models-on-private-data-2b4221c3839)

成功转入繁荣的数据科学职业的 3 个策略

原文:https://towardsdatascience.com/3-strategies-to-successfully-switch-to-a-thriving-data-science-career-5cf0cbe1f010?source=collection_archive---------39-----------------------

有抱负的数据科学家的 2 个常见陷阱,以及如何通过这些简单的方法避免它们。

完整视频此处

TowardsDataScience.com 大学的面试官

受访者: Amit Jain 技术主管,ML at Trade Rev

欲了解更多仅限 TDS 的面试,请点击此处查看:

** [## Tds 访谈-走向数据科学

阅读《走向数据科学》中关于 Tds 采访的文章。共享概念、想法和代码的媒体出版物。

towardsdatascience.com](https://towardsdatascience.com/tagged/tds-interview)

你能告诉我们你的专业背景吗?

到目前为止,它已经在许多垂直行业积累了 15 年的丰富经验。我做过团队经理、团队领导之类的工作。在这 15 年的时间里,我的职业生涯分为三个阶段。前 5 年是在电信行业度过的。我在开发 3G 协议栈的算法,用 C,汇编代码等等。接下来的 5 年,我投身于云计算和应用编程。在过去的 5 年里,我磨练了我的后端技能,并将 ML 加入到我的技能组合中。

最近,我于 2017 年 9 月搬到多伦多,并加入 TradeRev,担任 ML 团队的技术主管。

你在 TradeRev 的重点是什么?

TradeRev 是 B2B 领域的二手车在线平台。因此,他们使用 TradeRev 的在线平台,而不是经销商在实物拍卖中拍卖经销商。就像易贝经销商对经销商的汽车交易一样。

机器学习进入画面,给汽车、经销商等带来信心。一些常规用途是推荐系统、价格预测、回归问题和从视频中识别汽车视图的计算机视觉问题。

我在 TradeRev 的角色非常独特。我主要负责 ML 产品的交付。这意味着将研究转化为生产。我领导着 ML 团队,参与了产品生命周期的所有方面。

这始于产品团队对您正在寻找的解决方案的构想。然后与数据工程师和数据科学家合作,构建原型,到处选择 AWS 服务,然后将原型转化为完善的解决方案。我们的技术栈是 python、Scikit-Learn、Tensorflow 和其他普通库。

另一项重要的工作是在数据科学中引入软件最佳实践,例如机器学习领域的 CI/CD、模型监控(我们如何实际建模我们的模型)、单元测试等。

你能谈谈你的团队使用 ML 在 Trade Rev 上产生的商业影响吗?

将研究带入生产的一件重要事情是理解 ML 实际上是如何对业务产生影响的。推荐系统就是一个例子。这是很基本的事情;根据我以前的经历,我对哪些新项目感兴趣?

因此,基于汽车经销商以前的历史(他对购买什么汽车感兴趣),我们可以帮助客户销售团队通过 ML 算法只锁定特定的经销商(专注于 10 家经销商,而不是 100 家)。这可能会减少完成交易的时间。这是在生产中使用 ML 算法的一个非常直接的影响。

对于像你这样背景(软件工程)的人来说,你有什么建议要转到数据科学行业吗?

我有 3 个具体的建议。

  1. 清楚了解数据科学中的各种角色。他们是产品经理、SDE、ML 工程师、数据工程师、研究员、数据科学家、商业分析师等等。询问你对哪个角色感兴趣,你拥有哪些相关技能。此外,将领域专业知识与机器学习技能结合起来。
  2. 确定技能差距。如果你的目标是职业生涯的一部分,找到你的技能差距,参加适当的数学、编码等课程。
  3. 专注于 ML 的应用方面。假设你有一个住房数据集,你想预测一些东西。使用现有的库看看你能找到什么。获得对你所构建的东西的反馈。

您谈到了领域专业知识。它在机器学习中的作用是什么,有多重要?

我的观点是,这里没有灵丹妙药。ML 只不过是统计、数学和新的库。这是一种古老的技术,有新的库,新的框架,有更多的数据和计算能力(简而言之)。

假设你没有某个领域的专业知识,你只知道工具。在这种情况下,把这种情况想象成马拉松而不是短跑。对于马拉松来说,你需要有自己的基础——所以要学习新的跑步技术或什么的。但问题是你有没有毅力,也就是说你有没有该领域专业知识的基础。

因此,让我们以药物发现为例(考虑到冠状病毒季节)。对于一个在 Tensorflow 或 Scikit-Learn 方面是专家,但对分子一无所知的人来说——我不认为这个人能在药物发现方面创造奇迹。但是如果另一个人在这个领域有专业知识,两个人可以一起获得更大的成功。当然,有些独角兽拥有所有的技能,但平均来说,如果我们建立一个拥有不同技能的团队,团队的成功率会提高。

对于你关于药物发现的观点,我确实看到很多人在没有真正理解生物领域的情况下就把他们的模型贴在了网上。这似乎很危险。

是的,我看到的是许多人孤立地看待这件事。它更应该是一种用 ML 构建产品的整体方法。在金融领域,如果这个人没有任何经济学背景,并且在股票市场上建立模型,而明天股票市场表现怪异,那么 ML 单独不起作用。

您经常提到模型生产,我经常听到这是数据科学项目生命周期的最后一部分。能不能多讲讲这个话题的重要性,新人如何学习?

对此我想引用吴恩达的话。他说“我们知道 ML 的工作原理。现在是时候将它投入生产并实现货币化了。”但我看到的是,数据科学家通常专注于 Jupyter 笔记本和超参数。

我要说的是不要有如此狭隘的方法。考虑业务环境——ML 如何适应业务。ML 是商业的一部分,就像推荐系统一样。推荐系统不是业务,而是业务的一部分。

另一部分是思考 ML 发布到产品中意味着什么。例如,您的现场数据可能与训练/测试数据具有不同的分布。因此,如果你没有这种心态,如果明天出现一些错误,预测变得偏离,并且变得难以修复,那就麻烦了。这就引出了一些问题,比如“你如何改进你的训练?你如何改进你的 API?”

完整的采访,请点击查看视频:

**

获得数据科学领域工作的 3 个宝贵建议

原文:https://towardsdatascience.com/3-successful-tips-to-landing-a-job-in-data-science-7d3c00e7924e?source=collection_archive---------54-----------------------

找到正确的关注领域可以帮助你脱颖而出

在 Unsplash 上由 Helloquence 拍摄的照片

一年半前,我在一家医疗保健管理机构担任数据分析师。厌倦了整天在 excel 电子表格中辛苦工作,并看到了将我正在做的大量手工工作自动化的机会,我发现 Python 和 data science stack 是改善我处理每周项目的方式的有效工具。

快进到大约 6 个月后,我发现了一个数据科学训练营,它接受来自学术界或以前在数据领域工作过的个人的申请,并有在学生完成项目后安排他们的记录。是的,失业几个月的机会成本,以及堆积如山的账单,感觉就像是几个月内无法承受的负担。但是一旦我有了必要的专业知识,这是一种让我现在的收入翻倍的方法。

以下是我毕业后在数据科学领域找工作时遇到的一些小技巧:

1)通过项目快速获得经验,并真正投入其中。

这一步非常重要。人们喜欢淡化项目,因为大多数招聘人员不会在简历上看到这些项目,但最终它将决定或破坏你熟悉在该领域取得成功所必需的工具的能力,并在面试中讲述你与他们共事的经历。如果你决定参加训练营,导师会帮助你形成你的任何想法,但最终还是要靠你在课外投入尽可能多的时间,使用多种工具来提升你的经验和技术能力。即使你不在训练营中,(也许你正在完成一门在线课程或自己学习),尝试新工具不仅拓宽了你解决各种问题的方法,还展示了知道如何更聪明地工作,而不是更努力地工作,以取得成果。项目还可以强化新学到的概念(即机器学习算法),并加深你对何时使用某些方法的理解。

拥有显示如何解决问题或可视化解决方案的 python 脚本,以及编写高级 SQL 查询的额外练习,将很好地适用于任何给定的业务。(提示:数据科学家主要使用这两个最重要的工具)

从头开始构建项目几乎总是需要使用 Python 和 SQL。但是如果不行,想办法在你的解决方案中实现它。如果您查询一个大规模数据集,并在完成任何转换之前将整个数据集加载到 Python 的内存中,那么在处理 100GB 的数据(需要一台超级计算机来处理内存中的数据)时,您无法证明您可以在业务环境中工作。因此,找到任何数据集,即使只有几百行,在将必要的部分加载到 Python 之前,先在 SQL 中执行小的转换。你可以在面试中谈及这段经历,让你在竞争中占得先机。如果你想查看潜在的数据集,我会说一定要看看 Kaggle,浏览数以千计的免费公开数据集。如果你在这个过程中停滞不前,你也可以找到很棒的数据集的文章,这提供了另一个学习机会。

在一天结束的时候,你希望拓展自己的视野,加入任何有能力做出贡献的团队。因此,即使你发现了别人没有使用的新东西,学习如何使用它,并在适当的时候将这种深度的信息带到桌面上,可以转化为即时的信任和认可。

2)非常非常擅长理解 ML。

是的,我指的是机器学习!几乎每个组织都在寻找有解决问题经验的人,并且可以用多种方法解决问题。我讨厌白板问题,面试中问这些问题的做法正在慢慢被淘汰,取而代之的是统计学和数学中更多的理论问题。像说明如何计算联合概率这样简单的事情可以找出知道如何很好地实现机器学习的人与已经学会如何将一堆模型扔向一个问题以查看什么返回最佳准确性或最低 MSE(均方差)的人。一旦你去参加现场面试,即使了解回归的基本知识也会大大提高你获得工作的机会(它给我的同行创造了很多机会,也破坏了很多机会)。

我训练营的几个同事分享了一些资源,虽然很有帮助,但往往会偷工减料,没有对某些主题进行深入的解释。我相信长且慢是理解机器学习高级话题的关键,推荐 ISLR(统计学习入门)作为一个很棒的起点,甚至是面试前的打磨点,来提振你的信心。此外,如果你是一个音频/视频学习者,社区会强烈推荐吴恩达的机器学习课程。一旦你打下了基础,你就可以开始进入更高级的话题,比如深度学习。

即使你不是所有方面的专家,精通回归(线性和逻辑)和决策树的基础知识可以成为学习更高级算法的坚实基础。如果你发现任何特定的算法与你之前遇到的问题有关,专注于真正了解这些算法,并能够提供更深入的解释,这可能是面试中紧张时期的一个很好的依靠。如果你在简历上写下项目,你使用的每一个算法都必须是你知道如何很好解释的东西,否则你会被发现看起来像个骗子!专家和冒名顶替者之间的界限非常模糊。

3)网络将有助于吸引你的应用。

一天坐下来申请数百份工作似乎是获得成功的一种方式。你的分析头脑可能在想,“如果我只是申请一千份工作,这只是一个数字游戏,最终会有一份得到,对吗?”

错了。申请如此多的工作岗位可能会让你的简历到处移动,但这不会让你出现在招聘经理面前。这就是为什么你必须尽你所能利用你的关系网,尽可能地获得每一个推荐。这是几乎可以保证你发送的大部分简历至少会被人审查一次的唯一方法,即使你的简历不符合他们所有的内部标准,你甚至可以在最初的电话筛选中受益。

一旦你进入了电话面试阶段,就要做真实的自己,用你的能力让自己成为一个有吸引力的候选人。那些东西是随着经验和时间而来的。除了不断重复你的方法并对你所知道的保持自信,没有简单的快速解决方法。

但是为了达到这个关键的第一步,你必须首先让别人注意到你。唯一的方法就是和社区里的人交朋友,建立关系网。参加任何一个聚会看起来像是人们常说的一条建议,但实际上对你没什么用,除非你和在这个领域工作的人接触并寻求建议。仅仅要求推荐通常会让你得到奇怪的眼神。如果你真诚地从人们那里寻求关于他们的经历和工作的信息,他们会更倾向于继续对话,这最终会让你获得推荐。

参加训练营可以极大地帮助建立人脉,因为公司通常倾向于从他们过去挖掘并取得成功的人才库中招聘人才。训练营的职业生涯日最初只会让一部分人被录用,但这仍然是一个很好的机会来了解招聘者在寻找什么,这样你就可以计划你的方法来有效地引起注意。

在一天结束时,这些提示将有助于指导您在数据科学领域找到工作的核心领域。无论你处于什么样的经验水平,通过这些简单的步骤,你都能更好地准备找到你一直想要的职位。只要确保永远不要怀疑自己和自己的知识。自信有助于向招聘经理和招聘人员展示你已经准备好为他们的组织带来成功。

使用 Python 学习自然语言处理的 3 个超级简单的项目

原文:https://towardsdatascience.com/3-super-simple-projects-to-learn-natural-language-processing-using-python-8ef74c757cd9?source=collection_archive---------6-----------------------

单词云、垃圾邮件检测和情感分析的简单代码示例

照片由 Siora 摄影在 Unsplash 上拍摄

什么是 NLP?

从事数据科学工作并有技术写作背景的我被自然语言处理(NLP)领域所吸引。理解语言的机器令我着迷,我经常思考,如果亚里士多德有机会,他会使用哪些算法来建立一个修辞分析机器。如果你是数据科学的新手,进入 NLP 可能看起来很复杂,尤其是因为该领域最近有如此多的进展。很难知道从哪里开始。

项目和数据

这三个超级简单的项目将向您介绍自然语言处理中使用的概念和技术。

字云
情感分析
垃圾邮件检测

这些项目使用的数据是垃圾邮件数据集,可以在我的 GitHub 中的所有代码中找到:

[## bendgame/nlpBeginnerProjects

github.com](https://github.com/bendgame/nlpBeginnerProjects/blob/master/NLP_beginner_projects.ipynb)

机器能理解什么?

虽然计算机实际上很擅长寻找模式和总结文档,但它必须先将单词转换成数字,然后才能理解它们。这种转变是必要的,因为机器“学习”归功于数学,而数学在文字上不太管用。在将单词转换成数字之前,它们通常会被清除掉特殊字符和标点符号之类的东西,并被修改成更统一、更易解释的形式。

项目一:词云

清洗单词通常被称为预处理,这是项目 1 的重点:单词云

导入依赖项和数据

从导入依赖项和数据开始。数据存储为逗号分隔值(csv)文件,所以我将使用 pandas 的 read_csv() 函数将其打开到 DataFrame 中。

import pandas as pd
import sqlite3
import regex as re
import matplotlib.pyplot as plt
from wordcloud import WordCloud#create dataframe from csv
df = pd.read_csv('emails.csv')df.head()

df.head()

探索性分析

在做任何事情之前,最好对数据进行快速分析,以消除重复的行并建立一些基线计数。我使用 pandas drop_duplicates 来删除重复的行。

print("spam count: " +str(len(df.loc[df.spam==1])))
print("not spam count: " +str(len(df.loc[df.spam==0])))
print(df.shape)
df['spam'] = df['spam'].astype(int)df = df.drop_duplicates()
df = df.reset_index(inplace = False)[['text','spam']]print(df.shape)

删除重复之前/之后的计数和形状

什么是词云?

词云是可视化文本数据的一种有用方式,因为它们使理解词频变得更容易。在电子邮件文本中出现频率更高的单词在云中显得更大。词云使识别“关键词”变得容易

词云示例

注意在单词云图片中,所有的文字都是小写的。没有标点符号或特殊字符。那是因为文本已经被清理了,以便于分析。使用正则表达式,很容易通过循环来清理文本:

clean_desc = []
for w in range(len(df.text)):desc = df['text'][w].lower()#remove punctuationdesc = re.sub('[^a-zA-Z]', ' ', desc)#remove tagsdesc=re.sub("&lt;/?.*?&gt;"," &lt;&gt; ",desc)#remove digits and special charsdesc=re.sub("(\\d|\\W)+"," ",desc)clean_desc.append(desc)#assign the cleaned descriptions to the data frame
df['text'] = clean_descdf.head(3)

注意,我创建了一个空列表 clean_desc ,然后使用一个 for 循环逐行遍历文本,将其设置为小写,删除标点符号和特殊字符,并将其追加到列表中。然后我用 clean_desc 列表中的数据替换文本列。

停止言语

停用词是最常见的词,如“the”和“of”将它们从电子邮件文本中删除可以突出更相关的常用词。去掉停用词是常用的技巧!一些 Python 库,比如 NLTK,预加载了一个停用词列表,但是从头开始创建也很容易。

stop_words = ['is','you','your','and', 'the', 'to', 'from', 'or', 'I', 'for', 'do', 'get', 'not', 'here', 'in', 'im', 'have', 'on', 're', 'new', 'subject']

请注意,我包含了一些与电子邮件相关的词,如“回复”和“主题”由分析师决定应该包含或排除哪些单词。有时候包含所有单词是有益的!

构造单词 Could

方便的是,有一个 Python 库用于创建单词云。它可以使用 pip 安装。

pip install wordcloud

当构建单词云时,可以设置几个参数,如高度和宽度、停止单词和最大单词。甚至可以对其进行整形,而不是显示默认的矩形。

wordcloud = WordCloud(width = 800, height = 800, background_color = 'black', stopwords = stop_words, max_words = 1000, min_font_size = 20).generate(str(df1['text']))#plot the word cloud
fig = plt.figure(figsize = (8,8), facecolor = None)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

使用 matplotlib 和可以保存和显示单词云。show() 。这是所有记录的结果,不管它是不是垃圾邮件。

通过分割数据框和制作两个词云来进一步推动练习,以帮助分析垃圾邮件和非垃圾邮件中使用的关键词之间的差异。

项目 2:垃圾邮件检测

这是一个二元分类问题,因为电子邮件可能是垃圾邮件(1),也可能不是垃圾邮件(0)。我想建立一个机器学习模型,可以识别电子邮件是否是垃圾邮件。我将使用 Python 库 Scikit-Learn 来探索记号化、矢量化和统计分类算法。

needpix.com

导入依赖项

导入转换和建模数据所需的 Scikit-Learn 功能。我将使用计数矢量器训练 _ 测试 _ 分割集成模型,以及一些度量标准。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn import ensemble 
from sklearn.metrics import classification_report, accuracy_score

将文本转换为数字

在项目 1 中,文本被清理。当你看一个词云时,注意它主要是单个的词。单词越大,出现的频率越高。为了防止单词云输出句子,文本要经过一个称为标记化的过程。这是把一个句子分解成单个单词的过程。单个的单词被称为记号。

使用 SciKit-Learn 的 CountVectorizer() ,可以很容易地将文本主体转换为计算机可以传递给机器学习算法的稀疏数字矩阵。为了简化计数矢量化的概念,假设您有两个句子:

狗是白色的
猫是黑色的

将句子转换为向量空间模型会以这样的方式转换它们,即查看所有句子中的单词,然后用数字表示句子中的单词。

狗猫是白的黑的
狗是白的= [1,1,0,1,1,0]
猫是黑的= [1,0,1,1,0,1]

我们也可以用代码来展示这一点。我将添加第三句话来说明它计算令牌。

#list of sentences
**text = ["the dog is white", "the cat is black", "the cat and the dog are friends"]**#instantiate the class
cv = CountVectorizer()#tokenize and build vocab
cv.fit(text)print(cv.vocabulary_)#transform the text
vector = cv.transform(text)print(vector.toarray())

字数的稀疏矩阵。

注意在最后一个向量中,你可以看到一个 2,因为单词“出现了两次。 CountVectorizer 正在对记号进行计数,并允许我构建包含单词到数字的转换的稀疏矩阵。

词汇袋法

因为该模型没有考虑单词的位置,而是将单词混合起来,就像它们是拼字游戏中的瓷砖一样,这被称为单词袋方法。我将创建稀疏矩阵,然后使用 sk-learn**train _ test _ split()**拆分数据。

**text_vec** = CountVectorizer().fit_transform(df['text'])X_train, X_test, y_train, y_test = train_test_split(**text_vec**, **df['spam']**, test_size = 0.45, random_state = 42, shuffle = True)

注意,我将稀疏矩阵 text_vec 设置为 X,将df[' spam ']【T26]列设置为 y。

分类器

我强烈建议尝试几种分类器,并确定哪一种最适合这个场景。在本例中,我使用的是 Scikit-Learn 集合中的**GradientBoostingClassifier()**模型。

**classifier** = ensemble.GradientBoostingClassifier(n_estimators = 100, #how many decision trees to buildlearning_rate = 0.5, #learning ratemax_depth = 6
)

每个算法都有自己的一套参数,你可以调整。这就是所谓的超参数调整。浏览文档以了解模型中使用的每个参数的更多信息。

生成预测

最后,我们拟合数据,调用预测并生成分类报告。使用class ification _ report(),很容易构建一个显示主要分类指标的文本报告。

classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)print(classification_report(y_test, predictions))

分类报告

注意我们的模型达到了 97%的准确率。通过调整超参数、探索不同的分类器和尝试不同的矢量器来进一步推动练习!

项目 3:情感分析

情感分析也是一种分类问题。这篇文章本质上反映了一种积极的、中立的或消极的情绪。这被称为文本的极性。也有可能衡量和说明文本的主观性!有大量的资源涵盖了情绪分析背后的理论。

该项目没有构建另一个模型,而是使用一个简单的开箱即用工具来分析名为 TextBlob 的情感。我将使用 TextBlob 向 DataFrame 添加情感列,以便可以对其进行分析。

表情符号

什么是 TextBlob?

Python 2 和 3 的 TextBlob 库建立在 NLTK 和模式之上,试图简化一些文本处理任务。它提供了分类、词性标注、名词短语提取、情感分析等工具。使用 pip 安装,并查看安装指南。

pip install -U textblob
python -m textblob.download_corpora

文本 Blob 情感

使用情感属性,TextBlob 返回一个名为元组的表单情感(极性,主观性)。极性是范围[-1.0,1.0]内的浮点数,其中-1 为最大负值,1 为最大正值。主观性是在【0.0,1.0】范围内的浮动,其中 0.0 非常客观1.0 非常主观

blob = TextBlob("This is a good example of a TextBlob")
print(blob)blob.sentiment#Sentiment(polarity=0.7, subjectivity=0.6000000000000001)

应用 TextBlob

使用列表理解,很容易将文本列作为 TextBlob 加载,然后创建两个新列来存储极性主观性。

#load the descriptions into textblob
email_blob = [TextBlob(text) for text in df['text']]#add the sentiment metrics to the dataframe
df['tb_Pol'] = [b.sentiment.polarity for b in email_blob]
df['tb_Subj'] = [b.sentiment.subjectivity for b in email_blob]#show dataframe
df.head(3)

TextBlob 使生成极性和主观性的基线情感分数变得非常简单。为了进一步推动这一训练工具,看看您能否将这些新功能添加到垃圾邮件检测模型中,以提高准确性!

包扎

尽管自然语言处理看起来是一个令人生畏的话题,但基础部分并不难掌握。有大量的库使得开始探索数据科学和 NLP 变得容易。完成这三个项目:

词云
垃圾邮件检测
情感分析

您将探索对文本数据应用预处理、标记化、矢量化和特征工程的具体示例。

如果您有兴趣学习更多关于数据科学或编程的知识,请查看我的其他文章!

[## 在 SkLearn 中使用 FunctionTransformer 和 Pipeline 预测 Chardonnay 评级

一个将函数转换成可用的管道代码,然后通过传递数据帧来预测葡萄酒评级的例子…

towardsdatascience.com](/using-functiontransformer-and-pipeline-in-sklearn-to-predict-chardonnay-ratings-9b13fdd6c6fd)

谢谢大家!

  • 如果你喜欢这个, 在 Medium 上关注我 了解更多
  • 通过订阅 获得完全访问权限并帮助支持我的内容
  • 我们连线上LinkedIn
  • 用 Python 分析数据?查看我的 网站

—埃里克·克莱本

打击数据科学偏见的 3 个切实步骤— ClosedLoop.ai

原文:https://towardsdatascience.com/3-tangible-steps-in-combating-prejudice-in-data-science-closedloop-ai-fb514b4d8400?source=collection_archive---------49-----------------------

我们都希望我们的算法是公平的,但有时,很难知道如何开始。

图片由皮克斯拜的 Gerd Altmann 提供

当我们想到偏见时,我们往往会想到它最明显的表现方式。当前的时代精神暴露了被动接受不公正所造成的危害。作为一名数据科学家,你有责任朝着公平的方向前进。通常,驱动力必须来自作为实践者的你。可能很难知道如何处理这个问题。我将重点介绍三种具体方法,通过这些方法,您可以努力消除数据科学决策中的偏见。

1.以有意义的方式衡量公平

在提到机器学习模型时说出“准确性”这个词,数据科学家就会凭空解释为什么这不是正确的指标。他们将继续列举六种更好的量化有效性的方法。令人怀疑的是,同样的语义战士也精通在 ML 模型中测量公平性的方法。我们希望我们的模型是公平的,就像我们希望我们的模型是有效的和高性能的一样。因此,我们衡量公平。你对一个模型的报道反映了你的优先考虑,衡量公平应该是优先考虑的。

衡量模型的公平性可能具有挑战性。为了避免在我们的模型中引入偏见,许多数据集将不包括人口统计信息。这是好心导致坏结果的一个很好的例子。您应该记录人口统计信息,即使它从模型中保留。没有这些信息,就不可能衡量您的模型在这些线上的表现。如果您的公司没有记录这些信息,请考虑倡导代表这样做。

一旦你有能力衡量公平性,你就需要选择正确的度量标准。在之前的一篇文章中,我讨论了一种用于量化医疗保健中的偏见的指标,称为群体利益平等,并深入探讨了为什么我认为这是医疗保健背景下最合适的衡量标准。如果您在算法中发现了偏见,提供了一个很好的描述,说明了如何使用 SHAP 分数来量化决策存在偏见的原因。

2.不要让你的数据变得奇怪

社会科学领域的研究人员经常在归纳他们的理论时遇到问题。一个原因是,他们在大学生身上进行实验,而大学生代表了社会的一小部分。对这些数据集的描述很奇怪:西方的、受过教育的、工业化的、富裕的、民主的。如果你只是想预测这些群体,这样的现象是可以的。当你试图将社会理论应用到世界其他地方时,关于规范的潜在假设就失效了。我们使用的大多数数据集对个人如何生成数据都有类似的假设,这往往会导致不平等。

这种影响在医疗保健领域尤其糟糕。富人和穷人使用卫生系统的方式存在明显差异。例如,较穷的人使用流动服务乘车去正常的约会。当你从未缺少汽车时,这是很难预料的。通常,主题专家(SME)会敏锐地意识到这种现象。与 SME 合作对于集思广益解决这种影响是非常有价值的,尤其是在特征工程阶段。

那些没有被数据记录下来的东西是一个更大的挑战。医疗专业人员知道,决定你健康的很大一部分因素是基于你的家庭和工作环境。与财富和邮政编码相关的健康因素的几个例子是获得健康食品、接触有害化学物质和容易进入绿色空间。解释这些影响是困难的,但往往是理解为什么一个群体在公平性方面表现不佳的关键。

3.关注真实世界的效果

伟大的数据科学家与其他人最大的区别之一是他们理解他们的模型如何影响现实世界的能力。这一点之所以如此重要,是因为理解预期用途会影响到你如何定义你所预测的群体,以及你如何定义你的结果。虽然关注预期结果会让你成为一名优秀的数据科学家,但考虑非预期结果会让你成为一名伟大的数据科学家。

例如,您可以考虑建立一个模型来预测一个人是否会因心脏病发作而住院。一个合理的步骤可能是将你的人群限制在那些先前被诊断患有心脏病的人群中。以这种方式过滤人口是一把双刃剑。虽然它会使您的模型更加精确,但它也会过滤掉那些以前没有诊断过的人。如果一个人定期检查,更有可能记录下心脏病发作的情况。通过排除那些有不寻常使用模式的人,你最终建立了一个模型,将资源导向那些已经得到最好治疗的人。

从事数据科学工作的最大好处之一是医疗服务提供商和患者的利益一致。医疗保健提供者希望预测严重的医疗并发症,以便可以应用干预措施。举个例子,如果你注意到一个人有跌倒受伤的风险,干预措施可能是给他们一个踏凳。这非常简单而且非常有效。双赢。医疗保健中许多已知的不平等是有影响的。积极参与 SME 应该指导您的建模工作,以帮助使这些工作更加有效。你的模型有潜力让人们更健康,帮助底线,并创造一个更公平的医疗保健计划。这是一个很大的双赢局面。

原载于 2020 年 9 月 18 日https://closed loop . ai

每个数据科学家都应该知道的 3 种文本距离

原文:https://towardsdatascience.com/3-text-distances-that-every-data-scientist-should-know-7fcdf850e510?source=collection_archive---------15-----------------------

无论您是刚刚开始研究数据科学,还是已经在这个领域工作了很长时间,您都需要了解这三种文本距离

在之前的一篇文章中,我描述了每个数据科学家都应该知道的三个距离。那些距离几何距离:从一个点到一个点。在这篇文章中,我谈论从一个文本到另一个文本的距离度量。

测量从一个文本到另一个文本的距离和从一个点到另一个点的距离是不同的。

如何定义两个文本之间的距离?

解决方案 1 —汉明距离

汉明距离根据位置比较两个字符串中的每个字母。所以单词 1 的第一个字母与单词 2 的第一个字母相比较,等等。

汉明距离纯粹基于位置来比较两个字符串中的每个字母。

要计算两个字符串之间的汉明距离,需要比较字符串中每个位置的字符。不相等字符的个数就是汉明距离。

汉明距离的一个优点是进行这种位置比较非常快速和简单。另一方面,批评者认为它不能考虑到两个字母数不相等的字符串。另一个批评者是太严格了,比如“*abcdefg”*和“*bcdefgh”*被认为完全不同,而 7 个字符中有 6 个是相同的。

解决方案 2 — Levenshtein 距离

Levenshtein 距离是将一个字符串转换成另一个字符串所需的运算次数。所以每一次编辑都需要在 Levenshtein 距离上加 1。

Levenshtein 距离是将一个字符串转换成另一个字符串所需的运算次数。

三种类型的操作很重要:

  • 插入/添加一个字符算作一个操作
  • 删除一个字符算作一次操作
  • 替换一个字符算作一个操作

要计算 Levenshtein 距离,您需要确定将一个字符串转换为另一个字符串所需的编辑操作(删除、插入或替换)的数量。

Levenshtein 距离要直观得多。当汉明距离表示' abcdefg '和' bcdefgh '完全不同时,在 Levenshtein 距离中它们相对相似。

另一方面,Levenshtein 距离确实需要更多的时间来计算,并且算法不太简单。

解决方案 3 —余弦距离

余弦距离与前面讨论的度量有很大不同,因为它考虑了两个文档之间的距离。它通常用于自然语言处理。

余弦距离适用于文档的矢量表示。

余弦距离或更常用的余弦相似度的核心思想是对文本进行矢量化:将文本转换成数字数据。最简单的方法是使用字数矢量器:

步骤 1:获取组合文本文档中的所有独特单词

文本矢量化的第一步:获取所有文档中的独特单词

第二步:通过字数统计为每个文档制作一个向量

文本矢量化的第二步:通过计算每个句子的字数来获得矢量

步骤 3:使用余弦相似度计算向量之间的相似度(相似度与距离相反)

相似性的公式是通过计算你的两个向量的点积除以 a 的范数乘以 b 的范数来计算的。

余弦相似性公式

为了计算这个,我们可以使用 Python 中的 scikit 学习库。对于当前示例,它给出了以下结果:

这意味着:

  • 句子 1 和句子 2 的相似度是 0.816…
  • 句子 1 和 3 的相似度是 0.369…
  • 句子 2 和 3 的相似度是 0.452…

所以 1 和 2 最相似,那么 2 和 3 最相似,1 和 3 最不同,和预期完全一样。

结论

在本文中,我分享了 3 种计算文本数据距离的方法,从非常基本到相对复杂。

我希望这对您有所帮助,并祝您在数据科学之旅中好运!敬请期待更多;)

成为数据科学家的 3 个惊人理由

原文:https://towardsdatascience.com/3-things-i-enjoy-as-a-data-scientist-cd2306c0521b?source=collection_archive---------47-----------------------

意见

作为一名数据科学家,积极看待日常工作生活。

艾迪尔·华在Unsplash【1】上的照片。

目录

  1. 介绍
  2. 自由
  3. 影响
  4. 增长
  5. 摘要
  6. 参考

介绍

我想暂时停止撰写更多基于技术和事实的文章,来讨论我喜欢的数据科学工作的三个要点。有很多文章对作为一名数据科学家持否定态度,也有一些文章赞同一些观点,但在这篇文章中,我想把重点放在我个人经历的优点上。也许这些好处或快乐也会是你所经历的。我将讨论的主要话题是在日常工作中作为数据科学家的自由,对你工作地点的影响(业务,以及作为数据科学家你将能够获得的成长。请继续阅读,了解更多作为数据科学家的乐趣。

自由

Pablo Heimplatz 在Unsplash【2】上拍照。

在我工作过的大多数公司,数据科学团队都是分开的,有时与工程和产品部门分开(数据科学家可以期望与之合作的两个主要部门,或者是的一部分)。因为数据科学的角色不仅仅是工程或产品,所以你会发现自己有点孤军奋战。对我来说,这个结果是有利的。当你或者一个更小的团队是一个紧密团结的团队的一部分时,你可以专注于几个项目,而不是像软件工程师或者产品经理那样,最多 10 个项目。在你的角色中,自由的好处当然是值得拥有的。你可能有更少的会议,更多的时间专注于你的项目,并且有能力与更少的了解你的项目并且可以合作的人一起工作。

以下是我作为数据科学家享受自由的主要原因:

  • 研究能力
  • 独立工作的能力
  • 能够在较小的团队中协作
  • 更少的会议(有时)
  • 远程工作是一个简单的过渡

影响

李维·许在 Unsplash 上的照片

接下来,是我在工作中感受到的影响。在每家公司,无论是我的还是我们团队的数据科学项目都是一个重要的项目,它给整个公司带来了巨大的变化。有时候,一个数据科学项目可以成为一家公司的主要产品——比如网飞和他们的推荐系统,他们的很多业务都围绕着为消费者推荐服务(现在他们有了自己的节目和电影的附加产品)。虽然数据科学项目可能需要相当长的时间,但它们通常会产生一些影响,这当然会给你的日常工作带来成就感。

以下是我作为数据科学家喜欢 impact 的原因:

* be the cause of change in a company* apply your knowledge directly to the business* sometimes your project is the business itself* sense of accomplishment 

增长

Francesco Gallarotti 在Unsplash【4】上拍摄的照片。

最后,不仅要有能力在你的公司里获得相当大的发展,在职位方面,还要有能力成长为一个人。有时,角色会变得相当停滞不前,但在数据科学中,有几个不同的子职位可以让你移动。

这些职位包括但不限于:

  • 数据科学家 I、II、III 和高级数据科学家
  • 数据科学经理
  • 计算机视觉工程师
  • 机器学习工程师
  • 自然语言处理工程师或科学家
  • 人工工程师或科学家
  • 数据工程师
  • 有时甚至是软件工程师

因为数据科学家的角色涵盖了工程和产品的许多方面,如软件、编码、编程、产品管理、商业分析和商业智能,所以你可以找到自己的位置,朝着更专业的角色努力(或成为多面手并征服它们)。

就个人成长而言,数据科学需要批判性思维,独自工作,但也需要与需要沟通和推理技能的利益相关者和高层管理人员合作,所有这些都可以应用于数据科学之外。

摘要

如您所见,作为一名数据科学家,有许多令人愉快的好处。我讨论了角色本身的自由、影响和成长。还有无数其他专业人士。欢迎在下面发表评论,描述和讨论你喜欢成为数据科学家的一些原因。

概括起来,这三个原因是:

freedomimpactgrowth

感谢您的阅读!我希望您喜欢我围绕我喜欢成为数据科学家的三个主要原因展开的讨论!

参考

[1]照片由艾迪尔·华在Unsplash(2020)上拍摄

[2]由 Pablo Heimplatz 在 Unsplash 上拍摄的照片,(2017)

[3]照片由 Levi XU 在 Unsplash 上拍摄,(2016)

[4]Francesco Gallarotti 在 Unsplash 上拍摄的照片,(2016)

我们可以从挥杆时机分析中学到的 3 件事

原文:https://towardsdatascience.com/3-things-we-could-learn-from-swing-timing-analysis-84486fdab209?source=collection_archive---------60-----------------------

对美国职业棒球大联盟数据进行新型分析的机会可能很快就会到来。我们可以这样准备。

人们很容易认为我们目前正在追踪棒球比赛中的一切,但这是不真实的。尽管我们随时都有大量与棒球位置相关的数据,但在我们的数据收集中,仍然有很多游戏的方面被完全忽略了(据我所知)。在我看来,一旦我们开始跟踪它,分析的首要方面就成熟了,那就是与每次挥杆是早了、准时了还是晚了相关的数据,我将这些数据称为挥杆计时数据。

虽然我们几十年前就知道挥杆时机会影响球是否被击中,但是这方面的信息却没有公开的数据。在棒球的数据革命中,每次挥杆的时间都没有被记录下来。一个可能的原因是,很难判断一次挥杆是太早、太晚还是准时,但这并没有阻止我去尝试!

有了一点样本数据和一些想象力,我开始挖掘一个全新的棒球分析领域,这可能是 MLB 球队竞相寻找鹰眼数据最佳新用途的军备竞赛的重要组成部分。

抽样资料

为了这个项目,我观察了 2020 年来自 5 个不同击球手的总共 160 次挥杆,并尽最大努力将每次挥杆标记为早挥杆、准时挥杆、晚挥杆或检查挥杆。收集这些数据是为了让我们知道,利用全面的挥杆时机数据,我们可以回答什么样的问题,而不是用而不是来确定地回答这些问题。

我选择了五名具有不同进攻特征的样本球员,观看了他们 2020 年的每一次(截至 8 月 13 日),根据他们的时机将他们分组,早,准时,晚,或检查。这些击球手是:

DJ LeMahieu: 高产量,低气味(第 88 百分位 xwOBA,第 99 百分位气味率)

**埃迪·罗萨里奥:**低产量,低排名(第 22,第 87)

**小费尔南多·塔蒂斯:**高产,高人气(第 87,21)

迈克·祖尼诺:产量低,气味大(第 0,第 6)

最大 Muncy: 平均产量,平均气味(第 52,52)

通过选择一组不同的击球手,我能够从这种分析中扩展我可以提出的问题类型!不再赘述,下面是我认为可以用全面的挥杆时机数据来回答的最有趣的问题。

#1.为什么打者挥棒不中?

打棒球很难。但是为什么呢?在我看来,击球有三个主要组成部分:时机、力量和枪管位置。你需要这三个人来进行艰难的接触。如果你的挥杆只有两个主要部分,你可以预期会有微弱的接触。

作者图片

正如你所看到的,我相信不是所有的气味都是同样产生的,这里我将命名和描述两种主要的气味。

一个1 型挥杆 是一个具有力量和良好时机的挥杆,但是球棒打错了地方。这种味道是由于打者误算了球越过本垒板时在好球区的位置。在 8 月 7 日对阵雅各布·朱尼斯的比赛中,罗萨里奥在一个高速球下挥棒。他的挥杆既有力又准时,但是球下太远,导致了 1 型挥杆。(视频)

相比之下,2 型挥杆 是一种具有力量和良好杆身位置但时机不好的挥杆。这种味道是由于打者错误估计球何时会越过好球带造成的。当击球手挥棒太晚或太早时,就会出现这种情况。7 月 24 日对阵玄柳镇,迈克·祖尼诺的变速球太早了。(视频)

祖尼诺有很好的桶放置,因为他的球棒的路径与球的路径相交(因为两者是重叠的),但他挥棒太早,所以他的球棒错过了球。

我的理论是有两种截然不同的气味。当球的移动与打者预期的不同时,就会发生第一种类型的波动。当投球速度比打者预期的慢或快时,就会发生第二种类型的喷击。第三种气味是遵循前两种气味定义的气味,这是典型的非常丑陋的气味。

拥有全面的挥杆时机数据可以从本质上证明或否定这个理论,并帮助我们更好地理解为什么打者会挥杆。

#2.不同的击球手有不同的气味特征吗?

根据目前的公开数据,我们可以量化哪些投球类型给每个击球手带来了最大的麻烦,但看一下时机可以让我们对为什么击球手在某些投球中挣扎有另一层理解。

2009 年至 2010 年间,何塞·包蒂斯塔将自己从第四外野手转变为全垒打联盟的领导者。在这部 [ESPN 特写](http://between 2009 and 2010)(我强烈推荐)中,包蒂斯塔提到他在 2009 和 2010 之间增加了一个腿踢,这有助于改善他在本垒板的计时。

本质上,包蒂斯塔将这十年最大的球员发展成功故事之一归功于固定他的挥杆时机,这是我们目前没有衡量的。有多少其他玩家目前正因为未被发现的可修复的计时问题而苦苦挣扎?

我的理论是每个击球手对他的时机都有一定的倾向。以下是这种数据能够为我们提供的时间配置文件的量化示例,有助于我们诊断和了解我们的攻击者:

作者图片

在这张图上,长条的高度代表快速球的总击球次数。塔蒂斯的最多,莱马约的最少。这是重要的信息。在快速球方面,曼西最擅长守时,罗萨里奥通常会迟到。也非常重要!

比如说,曲线球的气味特征呢?

作者图片

我们可以看到 Tatis 从弧线球中吸取了最多的东西(尽管更大规模的分析可能应该着眼于吸取率,而不是原始吸取)。当罗萨里奥打出弧线球时,他总是很早。当祖尼诺打出弧线球时,他总是很准时。有意思!

从更大的画面来看,我们可以很容易地看到,我们的打者在这个赛季对快速球的打击比曲线球更多,打者通常在快速球上的打击晚,在曲线球上的打击早,但这并不总是如此。类似的图表和趋势可以针对所有音高类型和许多不同的场景进行分析。

我们还可以回答关于联盟范围内趋势的问题,比如那些把握好时机的球员在他们不击球的时候是否更有效率:

作者图片

回答问题:是的,样本数据中存在正关联!(不,这个趋势不应该在这个时候推广到联盟!)

在我看来,挥杆时机变量可能有很多预测能力,可以帮助我们更好地预测击球手可能会如何前进。但不管是不是这种情况,能够可视化击球手的时间配置文件有机会成为一个有价值的球员评估工具。

#3.其他因素如何影响挥杆时机?

有这么多的变量会影响一个板块的表现,那么哪些变量会影响挥杆时机呢?之前的推销?板外观的间距数?

我听到一些传闻说,如果一个打者连续两次看到球,他就更有可能有好的投球时机。挥杆时机分析可以测试这一点!但更广泛地说,我们将能够更好地理解后续音高之间的相互作用。当先前的球是一个缓慢的曲线时,打者是否更有可能在一个高快速球上迟到?当打者投出一个快速球后,投手接下来应该投哪个球?

目前,我们可以整天推测这些问题的答案,并尝试估计音高如何相互作用。有了全面的挥杆时机数据,我们基本上可以确定。

在我的样本数据中,我制作了一些有趣的图表:

作者图片

我发现我们的打者样本最常见的是在一个接一个的快速球投出时迟到,但也有相当一部分时间是准时的。请记住,你在上面看到的每一个观察都是一种暗示。在这些数据中,快速球之后的慢速球最常引发晚期挥杆。这一切都符合我们现有的理解,这是一个好迹象!

此外,我们可以看看打者在投球区看到的投球越多,他们是否更有可能准时:

作者图片

通过跟踪紫色柱的高度,我们可以看到,在这个样本中,击球手不太可能在盘子出现时准时。但是联盟的其他人都是这样吗?我们不知道,但我们会用摆动计时数据!

结论

希望这篇文章激发了你的想象力,并让你相信从挥杆计时数据中可以学到很多关于棒球比赛的知识(尤其是击球手和投手的互动)。这篇文章只关注了 MLB 队 3 周比赛中 5 名 MLB 击球手的挥杆和失误。想象一下,我们可以从所有比赛中所有击球手的挥杆计时数据中学到多少东西!

摆动时间数据目前还没有公开(据我所知),但如果鹰眼能够像宣传的那样发挥作用,它可能在不远的将来可用。如果是这样,团队将有很大的机会比他们的竞争对手更好地使用这些数据来获得竞争优势,就像任何大型的新数据源一样,甚至很难知道从哪里开始分析。但读完这篇文章后,我希望团队能够从这个潜在的改变游戏规则的话题开始。

感谢您的阅读!如果您有任何意见或问题,请在 Twitter 上告诉我: @Moore_Stats

来自 baseballsavant.com 的数据和视频

任何人都可以建立的 3 个时间序列模型

原文:https://towardsdatascience.com/3-time-series-models-anyone-can-build-e6943b017c41?source=collection_archive---------26-----------------------

艾萨克·史密斯在 Unsplash 上拍摄的照片

最近接受了预测时间序列数据的挑战,我自学习机器学习以来第一次深入研究时间序列预测的细节。

这是我发现的。

—时间序列预测与通常的机器学习模型完全不同。

您的数据是不同的格式,您的数据清理过程是不同的,并且所使用的模型没有在其他任何地方使用过。似乎时间序列本身就是一种不同的技术。斯坎达的帖子完美地描述了这一现象。

因此,在花了几个小时钻研时间序列之后,我决定写这个简单的指南来帮助你建立你的第一个时间序列模型。

在这篇短文中,我将使用卡格尔·M5 预测比赛数据。

由于数据由沃尔玛中各种商品的销售数据组成,我将只关注单个商品的销售数据。

# Reading various csv into dataframe
sales_train = pd.read_csv("sales_train_validation.csv")
date = pd.read_csv("calendar.csv")# filter to get single item
single = sales_train[sales_train["id"]=="FOODS_3_090_CA_3_validation"].iloc[:,6:].T.reset_index().copy()datetime = date[["date","d"]].copy()single = pd.merge(left=single,right=datetime,left_on="index",right_on="d",how="left")#  Data processing to prepare for modeling
single.drop(["d","index"],axis=1,inplace=True)
single["date"] = pd.to_datetime(single["date"])
single = single.rename({"date":"ds",single.columns[0]:"y"},axis=1)[["ds","y"]]
ts= single.iloc[-98:,:].copy()

对于培训和测试分割,我决定使用过去 3 个月(84 天)的数据来预测未来 2 周(14 天)的销售数量。

# use past 3 months (84 days) data to forecast the next 2 weeks
duration = 14
train = ts.iloc[:-duration,:].copy()
test = ts.iloc[-duration:,:].copy()

绘制数据,

# Visualization
plt.figure(figsize=(12,12))
plt.plot(train["ds"],train["y"],label="Train")
plt.plot(test["ds"],test["y"],label="Test")
plt.title("Time Series Forecasting")
plt.legend()

现在来建造我们的第一个模型。我要介绍的第一个算法是持久性算法。通过预测下一个时间步长与前一个时间步长的值相同,这种方法是获得时间序列数据基线预测的简便方法。

这意味着 t+1 的值就是 t 的真实值。

用代码实现它,

## Persistence algorithm
pred= []
for i in range(duration):pred.append(train.iloc[-1,1]) # add test data to traintrain = train.append(test.iloc[i])

这就是结果。

看起来很准确吧。但是外表是会骗人的。让我们来计算均方根误差(RMSE),这是时间序列预测中使用的一个常用指标。

from sklearn.metrics import mean_squared_error
rmse =  np.sqrt(mean_squared_error(pred,test["y"]))
print("RMSE:",rmse)

41.2 的 RMSE,现在记住这一点,因为这是我们基线模型的误差。

接下来,我们转到时间序列预测的统计方法。ARIMA 是该领域许多从业者使用的一种常见和流行的预测方法。算法的细节不是这里的重点,但是你可以在这个详细的指南中找到更多关于 ARIMA 的信息。

首先,如果你还没有下载 pmdarima 包,请确保下载到你的机器中。这是 auto-arima 包,我们将使用它来获得模型的最佳参数。

需要注意的另一点是,该包只需要值的一维输入。

# Split into train and test set
duration = 14
train = ts.iloc[:-duration,:].copy().set_index("ds")
test = ts.iloc[-duration:,:].copy().set_index("ds")

使用自动 arima 建立模型并进行预测。

import pmdarima as pmmodel = pm.auto_arima(train,start_p=0,start_q=0,test="adf",max_p=3,max_q=3,error_action="ignore",suppress_warnings=True,seasonal=False)# prediction
pred = model.predict(duration)

看剧情…

预测值几乎形成一条直线。然而,如果你计算 RMSE,你会发现你的模型提高了 36.7 的 RMSE。

我们要看的最后一个模型是由脸书的数据科学家团队开发的一个包,名为 Prophet 。对于那些对使用的算法感兴趣的人,你可以在这里找到论文。

prophet 模型所需的数据格式非常具体。它需要一个名为‘ds’的日期列和一个名为‘y’的值列,这解释了为什么需要在前面的预处理阶段重命名我们的列。

一旦数据格式正确,您就可以开始训练模型了。

from fbprophet import Prophet
model = Prophet()
model.fit(train)

预测是通过一个特殊的函数来完成的,这个函数为未来的日期创建数据帧。

# Making prediction
future = model.make_future_dataframe(duration,include_history=False)
pred = model.predict(future)
pred = pred[["yhat","yhat_lower","yhat_upper"]]

几行代码所能实现的东西非常惊人。这款车型的 RMSE 只有 22.5,比之前的任何一款车型都要好。

这就是你要的,3 个时间序列模型,你可以快速的建立来探索你的数据。

快乐学习!

首次机器学习项目的 3 个技巧

原文:https://towardsdatascience.com/3-tips-for-first-time-machine-learning-projects-9f1495c5aac0?source=collection_archive---------46-----------------------

帮助构建成功顶点项目的实用工具和技术。

来源

自从我的顶点团队完成我们的森林火灾管理机器学习项目以来,已经过去了几个月。这是一次很棒的经历,最终让我们赢得了 2020 年安大略省软件工程顶点竞赛!随着学校开学,学生们开始新的项目,我认为分享一些在这个项目中帮助我的技巧是有用的。

总的来说,我从涉及机器学习的顶点工作中获得的最大收获是,90%的工作都是让数据屈服(或者与数据成为朋友,这取决于你的观点)。

理解干净数据、探索性数据分析、数据争论的重要性对我们项目的成功绝对至关重要。我认为这一点在课程工作中经常被忽视,这会导致人们对这样一个项目中所涉及的工作有一种扭曲的看法。因此,这里有一些工具和技术(有例子)帮助我的团队与数据保持健康的关系,并使项目更加愉快。

1。与 Google Colab 的合作

Google Colab 是一款来自 Google Drive 的用于编码和运行 Jupyter 笔记本(常用于机器学习项目)的工具。与本地 Python 脚本甚至本地 Jupyter 笔记本相比,使用 Google Colab 有两大优势。

首先,Colab 让你可以使用免费的云图形处理器,这可以真正加快你的工作流程。第二,使用 Colab 允许在 Google Drive 上存储数据(每个帐户最多有 15GB),这使得在数据争论上的合作更加容易。为了利用这些功能,我们的团队在 Google Drive 上使用了一个包含我们的 Colab 笔记本的共享文件夹,以及一个包含 gzipped csv 文件的共享数据文件夹,这些文件由一些笔记本输出,由其他笔记本用作输入。由于 Google Drive 文件夹是共享的,所以每个人都可以很容易地访问团队其他成员产生的最新数据。

下面是一个使用 Google Colab 笔记本从共享文件夹导入 gzipped csv 的示例:

如果你正在使用大的 csv 文件,我建议使用 gzip 压缩来存储它们,因为 pandas 包可以在一行代码中快速地解压缩和读入文件。

在我们的项目中,我们有 15 个活动的笔记本文件,它们有不同的相互依赖关系,因此有一个明确的位置来存储数据是非常有帮助的。

2。使用 aiohttp 加速数据采集

温度、风和湿度都对森林火灾是否会发生以及是否会蔓延有重大影响。由于这些值在一天中变化很大,我们必须从加拿大各地的气象站获得几年来的每小时数据。

对我们来说幸运的是,加拿大政府(加拿大环境和气候变化部)拥有加拿大数百个气象站的历史每小时天气数据,有些数据甚至可以追溯到 1866 年!他们甚至提供了完全免费的 API 来批量下载历史天气数据。

下载每小时数据的 API 要求用户指定站 ID、年份和月份。因此,如果我们想要过去 10 年中 150 个站点的数据,这将意味着 150x10x12 = 18,000 个 API 调用。按顺序执行这些调用需要很长时间,所以我们使用 aiohttp 包并发地执行 API 调用。

上面的代码可以用来获取任何类型的 csv 数据。

3。矢量化

在特征工程中,我们的团队假设绝对湿度可以提供额外的信息,有助于森林火灾的预测。绝对湿度可以从温度和相对湿度中导出,使用一个特殊的公式导出这里是。

下面是代码中的公式:

有几种方法可以将它应用于熊猫数据框中每小时的天气数据。我们可以遍历数据帧中的每一行,计算绝对湿度:

**%%timeit -n 3** abs_humidity_list = []
for index, row in df.iterrows():temperature = row['Temp (°C)']rel_humidity = row['Rel Hum (%)']abs_humidity = calculate_abs_humidity(temperature, rel_humidity)abs_humidity_list.append(abs_humidity)

结果: 3 次循环,3 次最佳:每次循环 8.49 秒

虽然上面的代码完成了这项工作,但是它为每一行计算一次函数。为了更快获得结果,可以使用熊猫应用功能:

**%%timeit -n 3** abs_humidity_series = df.apply(lambda row:calculate_abs_humidity(row['Temp (°C)'], row['Rel Hum (%)']),axis=1)

结果: 3 次循环,3 次最佳:每次循环 1.9 秒

即使这样更快,pandas apply 函数基本上仍然是一个循环。为了真正实现快速计算,我们希望将create _ ABS _ weather函数应用于同时的所有温度和相对湿度对。在我们的大多数项目笔记本中,我们的团队为此使用了 numpy 的 矢量化 功能:

import numpy as np**%%timeit -n 3** abs_humidity_np = np.vectorize(calculate_abs_humidity)(df[‘Temp (°C)’],df[‘Rel Hum (%)’])

结果: 3 次循环,3 次最佳:每次循环 34.2 毫秒

不错的进步。然而,在这篇文章的写作过程中,我发现使用 numpy 的矢量化仍然不是真正的矢量化。事实上,我们无法使用calculate _ ABS _ weather进行真正的矢量化,因为在该函数中,我们使用了 math.exp ,它一次只能对一个数字进行操作,而不能对一长串数字(向量)进行操作。

幸运的是,numpy 有一个等效的指数函数,它作用于向量, np.exp, 因此,如果我们对原来的calculate _ ABS _ weather函数做一点小调整,去掉指数函数,我们会得到:

突然间,我们有了一个可以接收整个熊猫数据帧列的函数:

***%%timeit -n 3**
calculate_abs_humidity_np(df[‘Temp (°C)’], df[‘Rel Hum (%)’])*

结果: 3 次循环,3 次最佳:每次循环 5.64 毫秒

真正的矢量化!

你可能会说,“矢量化真的那么重要吗?节省 8 秒钟似乎没什么大不了的。”对于小数据集,我同意它不会产生巨大的差异。作为参考,上面的示例使用了过去 10 年来自单个气象站的每小时数据,结果为 78,888 行(仍然相对较小)。

但是,如果我们想计算同一时期 100 个气象站数据的绝对湿度呢?现在,如果您正在遍历每一行,您将不得不等待 13 分钟,这就是矢量化开始产生重大影响的地方。矢量化还有一个额外的好处,就是可以让代码更加简洁易读,所以我建议尽可能养成使用它的习惯。

最终注释

顶点项目中使用的最终森林火灾预测模型是在包含超过 1600 万行的数据集上训练的(每行包含过去 10 年中某一天 20x20 公里网格的信息)。组装该数据集被证明是项目的关键部分,通过使用以下工具,整个过程变得更加简单:

  • Google Colab——方便分享和协作数据
  • 用于快速获取大量数据
  • 向量化函数 —用于对具有数百万行的数据集执行高效操作

我已经将所有示例代码包含在一个笔记本文件中:https://github . com/ivanzvonkov/examples-3-tips-for-ml-projects/blob/master/example-notebook . ipynb。

我希望您有机会在您的下一个项目中尝试这些工具!

如果你想查看实际的顶点工程库,你可以在这里找到:https://github.com/ivanzvonkov/forestcasting。

感谢阅读,感谢所有反馈!

从数据科学文章中获取更多信息的 3 个技巧

原文:https://towardsdatascience.com/3-tips-to-get-more-out-of-data-science-articles-9228feee7266?source=collection_archive---------66-----------------------

阅读在机器学习中的作用

本·怀特在 Unsplash 上的照片

数据科学作为计算机科学、统计学和许多其他学科的交叉学科,对学生来说有几个障碍。其中之一就是知识的获取。
除了获得过去几十年的基础知识,数据科学的一个关键挑战是跟上每天发布的最新技术。所以,三点是每一个数据科学家和想成为数据科学家的人必须认真考虑的。

1.你不能什么都读

首先,你必须承认不可能阅读所有发表在数据科学网站或学术期刊上的文章。

每天都有大量关于数据科学和机器学习的文章发表。由于我们每个人每天只有 24 小时可以支配,我们应该问自己到底如何利用这些时间来最大限度地提高我们的学习进度。最好的办法就是找到符合你目前问题的文章,仔细阅读。偶尔,偶然选择和阅读一篇文章也会有所帮助。这允许你以新的视角,以新的创造性方式解决当前的数据科学问题。
您可能还会发现,使用媒体和数据科学时事通讯来选择您的阅读材料很有帮助。《月刊》和《每日文摘》帮助你追踪 TWDS 的最佳文章。确保您的时事通讯偏好和您的兴趣保持最新。

2.笔记和草图

第二点,对技能和工具的理解应该是机器学习学生的核心。因此,不仅要读一篇文章,而且要做笔记和画提纲。

试着从一篇文章中记录下你的结论。此外,你还应该把你的发现画下来。除了 PC 上的笔记之外,您还可以使用 Medium 的突出显示和注释功能。

3.落实!

最后,尝试将新获得的能力应用到自己的项目中。

光读书并不能让你成为数据科学家。在您自己的项目中实现并重现本文中描述的功能和过程。通过这种方式,你可以从你阅读的文章中产生可持续的知识,这将对你产生最显著的长期附加值。这也是扩展你的 GitHub 投资组合的一个很好的方式,因此雇主将能够更快地看到你在多大程度上真正处理了数据科学问题。

结论

仔细选择你的阅读材料。上面的提示将帮助你选择。此外,尝试将新获得的能力应用到自己的项目中。这是您从阅读数据科学文章中获得最大收益的方式。

从任何领域过渡到数据科学的 3 个技巧

原文:https://towardsdatascience.com/3-tips-to-transition-into-data-science-from-any-field-6baaecdcac2d?source=collection_archive---------12-----------------------

没有确定的路径

凯勒·琼斯在 Unsplash 上拍摄的照片

自从我上次投递邮件已经有两年了。坦率地说,我并不想念它,事实上,我成为一名邮递员的想法对我来说似乎是荒谬的。但这确实发生了,在转到伦敦市政厅的邮件收发室之前,我先在皇家邮政工作,皇家邮政是英国的邮政服务和信使。

由于没受过什么教育,也没有网络指导,我蹒跚着进入了数据科学领域。虽然我还有很多东西要学,但我现在可以回顾过去,自豪地说,我已经完成了我说过要做的事情,尽管机会对我不利。

之前,我写过许多关于学习数据科学的文章:

[## 数据科学家如何更快地学习

学会学习的有效策略

towardsdatascience.com](/how-to-learn-faster-for-data-scientist-cfd96d317ce6) [## 当你试图成为一名数据科学家时感到沮丧的原因

将最优秀的人与众不同的隐藏技能

towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811) [## 学习数据科学的 3 个阶段

了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习

towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)

然而,我从未直接回答过“我如何成功过渡到数据科学的问题?“这正是你将从这篇文章中学到的(根据我的经验)。

利用你的差异成为你的优势

如果你目前在一个没有直接转化为数据科学的领域,你是非常独特的,你可以利用这一点。这并不是说在相关领域(或学术界)工作的人不独特,相反,我的意思是,你的独特之处在于,你没有遵循一条直接的道路,所以你必须展现出很多个性,才能在就业市场上与有这种经历的人竞争。

为了让你的不同成为你的优势,你必须能够以一种让招聘经理和公司满意的方式包装你的经历。你可能没有学术或经验来支持你,但不可否认的是你有勇气,但你必须将这种勇气包装成有形的东西。

“当你来自一个完全不同的世界时,你总会遇到更有趣的事情”

想想看,如果你看到有人从零开始制造一辆汽车,而他们并没有沿着一条直线的道路进入汽车制造,但这辆车和其他人一样好,甚至更好,你不会对他们是如何做到的感到好奇吗?知道资源有限、没有传统教育/经验的情况下,他们有足够的弹性去寻求解决方案,你难道不乐意让这个人加入你的团队吗?没错。

这里的关键是包装你的不同之处,在你的简历上写“我有很多勇气”或“我愿意学习”是没有意义的,因为这些都是通用的东西,我个人认为应该是一个技术领域的人所期望的。

超越骗子综合症

最近,我开始注意到,冒名顶替综合症并不仅仅适用于那些没有“资格”成为数据科学家的人,因为我遇到过一些学习数学、计算机科学、统计学等的人,他们也有同样的遭遇。事实上,我曾和数据科学家交谈过,他们说感觉自己在作假。

“要成功地从你的职业转向数据科学,你必须克服在你耳边低语说你不够好的心理障碍。”

冒名顶替综合症会让你停滞不前、绝望并质疑自己。然而,过渡到数据科学的一部分是关于识别使你有资格担任你想要的角色的品质和经验。对我来说,成为我效力过的每一个足球队的队长让我有信心发表意见,而作为一名邮递员,我培养了极其彻底和密切关注细节的能力,这在我试图编写算法时(例如在《从头开始的算法》系列中)或在我进行错误分析等时对我有所帮助。

另一个克服冒名顶替综合症的方法是说服自己,你有勇气把事情搞清楚。我个人认为最好的方法是做自己的端到端项目。

找一个曾经在你船上的人

你可能很高兴知道你不是世界上第一个从另一个领域转向数据科学的人。找一个以前做过的人,听听他们是怎么做的——这不是一个人的推销。

这个人不一定要和你来自同一个领域。我还没有看到另一个前职位的人变成数据科学家,但我并没有期待这一点。我只是在寻找一个已经完成转变的人。

“听到走上你这条路的其他人的声音会给你带来渴望和激情”。

我从我收听的播客中注意到一个有趣的趋势(在 我如何了解数据科学 中了解更多信息),许多人并不认为他们已经走上了数据科学的明确道路,他们几乎是跌跌撞撞地来到这里的。这绝对有道理!

数据科学是一个非常新的领域,目前还没有很好的定义。不同的公司对什么是数据科学家有不同的看法,因此许多人觉得他们所走的道路似乎是非线性的。你不是第一个,也不会是最后一个,但你绝对应该站在前人的肩膀上。

包裹

转行比换雇主更困难和可怕。然而,我相信这些前兆在我的过渡阶段帮助了我,并且对任何试图过渡到数据科学的人都有很大的好处。

如果你认为我错过了什么,请留下回复或在 LinkedIn 上与我联系…

[## Kurtis Pykes -数据科学家-自由职业者,自由职业者| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有 3 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

你需要保存数据科学项目范围的 3 个技巧

原文:https://towardsdatascience.com/3-tips-you-need-to-save-your-data-science-project-scope-832c38c8fd17?source=collection_archive---------58-----------------------

如何以数据科学家的身份与企业交流

永远不要花时间去构建一个与最初的提议相去甚远的巨型应用。并为此受到责备。

作为一名数据科学家,你希望得到一份能让你做酷事情的工作——大数据、大机器(或者像成年人一样的云)和深度神经网络。当你意识到你的模型、你的项目经理的时间表和你的利益相关者的期望之间的不匹配时,现实很快就来了。

您的项目离最初的范围越来越远,而您离完成还有很长的路要走。演示是在星期二,你眼睛流泪,手心冒汗。

照片由agrêBarros上Unsplash 。作者通过 AdobeSpark 添加的引文。

“那不在要求里!”—几乎每个开发人员

之前,我写过关于与业务利益相关者一起定义数据科学范围的重要性。通过引导企业从他们认为他们需要的到他们真正想要的,它可以省去很多麻烦。不幸的是,有一个明确的目标是不够的。业务需求一直在变化,昨天重要的事情不是今天紧迫的事情。谁知道明天会怎样?

这篇文章旨在讨论 3 个技巧(还有一个额外的!)来管理不断变化的数据科学项目范围。为了说明这一点,让我们从一个非常熟悉的例子开始。

建立一个客户流失模型,他们说

作为一个连续场景,让我们假设你公司新产品的保留率很低。你的老板比尔让你建立一个客户流失模型,找出是谁取消了他们的订阅。您花了一周时间收集需求,又花了两周时间清理数据,现在您终于准备好开始工作了。

直到。

范围蔓延:让我们包括一些新的数据源…

老板比尔认为社交媒体在预测客户行为方面至关重要。这可能是真的,这是可以做到的,但你的时间表没有改变,你没有得到更多的报酬。

范围蔓延示例。由作者创建。

对你来说不幸的是,比尔说你项目的部分预算来自用户参与团队。如果他们的数据没有被使用,这是一种侮辱。所以现在你必须这么做。哦,等等,我有没有提到数据是如此稀少,无论如何都很可能会被丢弃。

然后。

范围变化:让我们完全改变我们的假设…

有时,当这些“额外的特性”在项目中表现得太深入时,它就变成了一个范围变更。例如,夜间运行的批处理过程与实时预测有着根本不同的架构。

范围变更示例。由作者创建。

让我们在这里暂停一下,回想一下这是什么时候发生在你身上的。看看下面三个与范围蔓延或范围变更相关的选项。如果你能回到过去选一个,你会怎么做?

这里(或永远)没有正确或错误的答案,考虑到时间表和预算的灵活性,这些都是可以采用的好方法。与其试图重新定义或盲目地完成改变,我建议的是问更多的问题**。**

范围变更问题发生在我们当中最优秀的人身上。尽管不是所有的范围变化都是不好的(有些是有害的),但是它们确实给我们带来了不必要的压力。让我们深入探讨一下有望挽救你一些白发的建议。

技巧 1:知道谁是你的项目干系人

一旦我们得到了一个明确的项目纲要,我们当中的问题解决者就很自然地投入到开发模式中。这些是我们通常采取的步骤:

1⃣ 与拥有我们所需数据的团队对话

2⃣ 火车模型

3⃣ 与将帮助我们部署模式的团队交谈(比如数据工程和基础设施团队,如果你还没有足够幸运与他们一起工作的话)

酷,但是这里出了什么问题?

看看下面复杂的组织结构。大多数数据科学项目在组织内都有多个接触点。需要管理的不同数据源,由具有不同需求的部门提供的联合预算,以及具有我们需要的洞察力的支持业务职能。

简单机器学习模型的复杂组织接触点。由作者创建。

如果没有牢牢抓住众多的利益相关者,你就会意识到…

❌:你的生命周期价值计算是不正确的,因为你不知道定价团队给了在正式发布前注册的客户折扣。

❌:你创建的产品满意度指数是 NPS 的一个糟糕的代理,因为你不知道产品团队在把它传递给关系管理团队之前会多次转换它。

❌:最重要的是,你没有搞清楚谁是你的型号的用户。一线呼叫中心员工需要在短时间内访问预测。或许,他们也不太在乎精度,想优化召回。

通常,范围的改变是由于在开始时没有涉及正确的涉众。

如果我们知道关系管理团队为项目提供资金,我们会包括他们关心的指标——无论是 NPS 还是转发次数。如果我们知道呼叫中心的员工是我们的用户,我们会包括一个强大的模型解释器,这样他们就可以在客户放下电话说“不,我不需要新的手机合同,这是本周第三次了”之前优化电话的前 3 秒钟。

所有这些涉众都有需求,随着时间的推移,这些需求会逐渐融入到项目中。在项目早期绘制出利益相关者矩阵是在整个项目生命周期中管理他们的好方法。

项目利益相关者矩阵示例(利益相关者的位置因项目而异)。由作者创建。

有很多关于利益相关者分析的好材料,但是要点是:

不要寻求让每个人都满意。

根据这些风险承担者对项目成功的重要性对变更请求的类型进行分类。

否则,你将会耗尽时间和预算。

提示 2:使用非常具体的句子来传达问题陈述

一个项目通常有多个接触点,功能请求可能会飞来。你需要通过创造一个非常具体的句子来记住你项目的目标。****

使用一个非常具体的句子来记住目标和包含的范围

每次收到请求时,你可以很快决定它是否与你想要达到的目标一致。

例如,你可以有一个模糊的句子说:

含糊不清且不具体的问题陈述示例

然而,客户保持是一个宽泛的说法。主动取消是唯一的客户流失类型,还是套餐降级和过期订阅也包括在内?我们的目标仅仅是合同客户,还是我们更关心高价值或高影响力的客户?

以下三个句子是提炼问题陈述的更好例子:

精炼的问题陈述示例

这有助于将句子分成四部分:

🔍识别/洞察**:是有人监督还是无人监督的问题?是分类问题还是回归问题?**

我们试图优化的指标是什么:主动取消的数量,或呼出电话的转换率?

🙋‍♀:我们的目标客户是谁:所有合同客户还是有资格升级的高价值客户?

🕰 应该在什么时候进行预测:当客户打电话进来时,是否需要快速的预测时间,或者是否可以是一个每夜批处理的过程来创建第二天的呼出电话列表?

如果你不能缩小你的句子,那么你很可能需要把你的项目分成几个阶段。对于流失模型,您可以从识别客户群开始,并将结果用作主动取消模型的输入特征。

技巧 3:定义明确的成功标准

在模型培训期间,许多想法被抛出,并由多个团队成员进行测试。度量越简单,我们就越容易快速确定我们的努力是否朝着正确的方向前进。

我们的大脑更容易理解 F1 的分数,而不是试图平衡精确性和回忆性。不比较区域 A 和区域 B 之间的 F1 分数,更容易理解两个区域之间的加权 F1 分数。

一个精心选择的度量标准可以确保你不会乱搞和调优不必要的东西

看到 0.1%的精度收益很有趣,但投入往往不实际。

有时,当您有多个度量标准(比如说 n 个度量标准)无法组合时,您应该选择 n-1 个满意度量标准和仅仅 1 个优化度量标准 :

👍满意度度量:足够好的度量。通常有一个阈值,如模型大小小于 5MB 或运行时间小于 1 秒。

🚀优化指标:最小化或最大化的指标。通常没有界限,比如我能得到的最高精度(理论上是 100%,但你明白我的意思)。

只有一个优化指标是比较多个实验的关键。如果我们使用上面的例子:

👍满意度指标**:评分速度低于 2 秒。这使得呼叫中心代理能够根据客户流失的可能性,快速决定是否要为该客户提供更好的交易。**

🚀优化指标:预测取消的 F1 分数。需要一个平衡的观点,所以我们要确保为可能流失的客户提供好的交易,但不要给那些可能不会流失的客户太多好的交易。

吴恩达在他的书《机器学习的渴望》中讨论了选择单一指标的想法。我鼓励数据专业的每一个人去读这本书。他还在 Coursera 上发布了关于这个主题的结构化机器学习项目课程(以及更多)。

好处:使用路线图来跟踪和展示进展

项目一直在运行,没什么大不了的。重要的是当你告诉你的利益相关者你还没有完成,在你应该完成的那天。企业想要的只是知道你有一个计划——并且你在积极地跟踪它。

安迪·比厄斯在 Unsplash 上的照片。

“除非做出承诺,否则只有承诺和希望;但是没有计划。”~彼得·德鲁克

除了传统的软件项目之外,数据科学项目还面临着许多挑战:不确定的结果、准确性或相关性的不确定性、不透明性、公平性问题。这些使得 AI 很难被决策者和上层管理人员接受。

我们总是回避给出数据科学项目的时间表,这是可以理解的。但是这产生了两个问题:

  • 缺乏透明度使商业变得非常可怕,所以他们对你的一举一动都进行微观管理。
  • 比起交付商业价值,你太容易陷入研究一些无关紧要的新技术了。

制定一个路线图,让你和你所依赖的每个人都负起责任。

路线图示例。由作者创建。

路线图至少需要包括以下 4 项:

****1⃣你要做什么:你要做的实际任务,比如评估环境准备情况,整合输入数据,或者创建基线模型。这些应该是小的冲刺阶段(比如 2-6 周),所以如果超过了,很容易增加风险。

****2⃣他们能得到什么:并不是你做的每件事都能直接转化为企业可以利用的成果,但重要的是要努力让你的任务适合他们可以消费的东西。例如,在整合输入数据后,可以很容易地组合一个快速幻灯片或仪表板来传达您的结果。企业可以玩仪表板,询问结果,甚至可能帮助您创建一两个功能。

3⃣他们什么时候能得到它:给出任务完成的估计日期。想象一下,你登上一架飞机,飞行员告诉你他不确定你什么时候能到达目的地——可变风速等等。承诺一个你认为合理的日期,并尽早提出问题以控制期望。

****4⃣保护以防出错:在大型项目中,每个人都必须一起工作,向利益相关者强调这种依赖性是很重要的。要么他们可以帮你追着团队给你你需要的数据,要么他们让你再有一周的时间完成。

最后…

不要害怕寻求帮助。

除非你问,否则你永远不知道他们会说什么。令我惊讶的是,当我向一位前客户解释说他可以更快地得到他需要的结果时,他决定雇用另外两个资源。

如果你喜欢这篇文章,我以前也在这方面发表过类似的文章:

  • 定义数据科学项目业务范围的 3 个技巧
  • 超越平凡——数据科学阅读榜

感谢阅读 ⭐在中、 LinkedIn 上关注我,或访问我的网站。此外,如果您想要对您的机器学习部署框架进行评估,请通过电子邮件向我们发送位于 Melio Consulting 的。

3 种类型的数据科学工程师面试问题

原文:https://towardsdatascience.com/3-types-of-data-science-engineer-interview-questions-1b612676d049?source=collection_archive---------38-----------------------

自信地完成数据科学工程师面试

照片来自猎人在 Unsplash 上比赛

我的背景主要是软件工程和数据科学。当我开始寻找数据科学方面的工作时,面试官注意到了我在软件方面的经验。许多受访者没有软件背景,但来自数学、物理或信号处理领域。在我的采访中,我经常在三个主要领域看到问题:数据接收和清理、可伸缩性和研发。

1.数据接收和清理

数据接收和清理是任何数据科学工作中的两个基本主题。在数据科学领域工作时,你会非常关注你称之为基础事实的数据源,你如何吸收这些数据源,然后你用什么方法来清理数据。

数据摄取

数据摄取可以有多种形式,根据您所工作的团队,问题可能会有很大的不同。假设你想成为一名数据工程师。在这种情况下,您将需要良好的数据库概念基础知识,并回答关于如何与新数据库交互或开发新数据库的更有针对性的问题。您可能会遇到的问题类型包括:

  • 数据体验 —解释你处理过的数据类型以及你是如何存储这些数据的?比如你用过多少图像数据?你是如何存储和使用这些图像的?面试官想了解你对哪种类型的数据有经验。
  • 数据量 —这是一个常见的问题:你处理过的数据量有多大?面试官想知道你是否处理过大型数据集,特别是如果职位描述中提到处理大数据。
  • 大数据摄取 —您能对大型数据集执行 ETL 吗?在执行 ETL 时,您使用过哪些工具和技术?
  • 数据库类型 —不同数据库类型之间的主要区别是什么,比如 NoSQL 与 SQL 数据库?您何时会使用每种类型的数据库?
  • 合并 —你会如何合并两个数据集?
  • 联接—SQL 中有哪些不同种类的联接,在什么情况下会使用每种联接?

在任何问题中,一定要大声说出解决方案。解释你到目前为止的经历,并诚实地说出你所不知道的。

数据清理

在我做过的每一次采访中,数据清理并不是一个被提及的话题,但是在某些情况下,它是被提及的。所以,我相信准备这些类型的问题是有好处的。最值得注意的一个案例是,采访者在白板上展示了一个微小的数据集。

以样本假数据集为例—图片来自作者。

查看一个数据集,如上所示,面试官问—“你如何清理这个数据集的每一列? “这项任务的目标是讨论你在数据集中看到的问题,以及你将如何处理每个案例。当你审视这样一个问题时,请考虑:

  • 列名 —它们是否一致,如果不一致,如何创建兼容的模式?
  • 字符串列——哪些价值观让你印象深刻?你如何清除这些价值,为什么?如果缺少值,您会如何处理这些数据?
  • 日期 —是否使用了一致的日期格式?如果不是,你应该使用什么格式,为什么?如果日期不完整或错误会怎样?
  • 数字——你觉得哪些值应该删除或清理?如果数据缺失,您会估算缺失点还是将其留空?

当你在做这样的例子时,试着一栏一栏地讲述你的决定。解释您将经历的清理数据的过程以及您根据您的信息做出的任何假设。如果你没有 100%的把握,可以提问。如果您不知道他们想对缺少信息的列或行做什么,您可以推荐一些您可以考虑的想法,并询问他们的想法。这种类型的问题是衡量你将如何处理数据清理问题的一种方式。我发现这是我在面试时收到的最难忘的问题之一,因为它引出了一些非常吸引人的对话。

在这样的例子中,您会考虑数据清理的其他哪些方面?

2.可量测性

从摄取和清理开始,另一个常见的问题是可伸缩性。采访者希望了解两件事,(1)您如何利用他们当前的流程和规模分析来运行大数据,以及(2)您如何将代码带入生产状态。

  • 并行化 —您需要了解如何并行化大量数据,以快速生成分析结果和可视化。我经常看到的一个焦点领域是如何将处理和重现结果的速度提高 10 倍?
  • 软件开发流程 —根据访谈情况,编码和开发可能不会关注讨论。假设你作为一名软件开发人员加入了一个数据科学团队。在这种情况下,对话可能包括如何生产代码、开发更严格的流程以及引入 CI/CD 管道。能够谈论你在这方面的技能,并解释它们如何为团队提供价值。解释这些类型的过程和开发实践可以做些什么来确保一个更健壮的分析集。
  • 自动化 —如何自动化流程以加快分析速度?我们如何以 10 倍的速度重现结果?当讨论团队已经在工作的方法以及他们将如何利用你的软件技能来扩展过程时,自动化通常会在访谈中出现。

如果您来自软件背景,可伸缩性和自动化是讨论的基本话题。软件工程师拥有开发生产代码、使用 CI/CD 管道和自动化流程的经验。让你的技能在这里大放异彩,并解释它们如何对数据科学团队有价值。

3.研究与开发

最后一个面试领域更宽泛,因为它将研发作为一个整体来看待。在与数据科学团队的许多工作面试中,您将浏览您所从事的项目和您所做的分析。

  • 关键成就——知道你在简历、求职信、LinkedIn 或申请中做了哪些研究工作。只在你的简历上写你知道你能说好的内容。你想在这里展示你最好的作品,与面试官一起讨论。
  • 合作 —了解你在研究项目中的角色,并解释你是如何与他人合作完成这项工作的。这个项目的总体成果是什么?这项工作完成后,流程是如何改进的?
  • 万无一失 —研发的另一个方面是,并非每个项目都能带来生产就绪的解决方案。学会识别运行不佳的实例,并能够快速排除故障。在面试中解释这一点有助于面试官理解你的项目管理和批判性思维技能。他们希望看到你能在这种环境下工作。

数据科学就是研究和开发新的流程和方法来推动商业价值。了解如何在 R&D 团队中工作以推动有价值的行动将非常有帮助。

最后的想法

数据科学面试因公司而异,但一些常见的问题是数据接收和清理、可扩展性以及研发。面试你的团队想知道你能处理各种数据源,并有效地清理数据以用于分析。他们想知道您是否以及如何扩展他们的流程,并使用大数据和自动化流程。最后,他们希望看到你能在快节奏的研究环境中发挥作用。

你们在面试中讨论过哪些常见的问题或领域?

如果你想阅读更多,看看我下面的其他文章吧!

[## 每位数据科学家的 8 大技能

当我参加大学讲座时,最常被问到的问题是“我需要具备什么技能?”

towardsdatascience.com](/top-8-skills-for-every-data-scientist-79e6b1faf3e1) [## 每个数据科学家都应该阅读的 3 本编程书籍

用 Python 掌握数据科学的编程和架构

towardsdatascience.com](/3-programming-books-every-data-scientist-should-read-badbb7a64c4a) [## 创建用于熊猫分组的自定义聚合

Pandas groupby 是一个函数,您可以在数据帧上使用它来分割对象、应用函数以及组合…

towardsdatascience.com](/creating-custom-aggregations-to-use-with-pandas-groupby-e3f5ef8cb43e) [## 数据可视化的前 3 篇文章

如果您想更好地构建数据可视化,这些文章很有帮助。

towardsdatascience.com](/top-3-articles-for-data-visualization-956a08a54b04) [## 不要太骄傲而不愿寻求帮助

如果你被一个 bug 卡住了或者感到不知所措,你可以寻求你需要的帮助。

towardsdatascience.com](/dont-be-too-proud-to-ask-for-help-76f21d16f318) [## 理解分析开发生命周期

将您的分析从摇篮带到坟墓。

towardsdatascience.com](/understanding-the-analytic-development-lifecycle-2d1c9cd5692e)

3 种类型的序列预测问题

原文:https://towardsdatascience.com/3-types-of-sequence-prediction-problems-97f22e946318?source=collection_archive---------21-----------------------

在实现序列预测模型之前了解您的问题。

[ 来源

序列预测是一种流行的机器学习任务,它包括基于先前观察到的符号序列来预测下一个符号。这些符号可以是一个数字、一个字母、一个单词、一个事件或一个对象,如网页或产品。例如:

  • 文本中的一系列单词或字符
  • 客户购买的一系列产品
  • 在日志上观察到的一系列事件

序列预测不同于其他类型的监督学习问题,因为它要求在训练模型和进行预测时必须保持数据的顺序。

序列预测是一个常见的问题,在现实生活中发现各种行业的应用。在本文中,我将向您介绍三种类型的序列预测问题:

☝Predicting 下一个值
✌️Predicting 一个类标签
👌预测序列

☝Predicting 的下一个价值

在许多应用中,猜测序列的下一个元素是一个重要的问题。序列预测模型学习识别顺序输入数据中的模式并预测下一个值。

时间序列预测

时间序列是指有序的数据序列,其中观察序列在时间维度上是连续的。时间序列预测是对序列中接下来发生的事情进行预测。因此,时间序列预测包括根据历史数据训练模型,并使用它们来预测未来的观察结果。

但是时间序列预测和回归问题有什么不同呢?有两件事:

  • 时间序列是时间相关的,是按时间排序的。但是回归可以应用于无序数据,其中目标变量依赖于特征所取的值。
  • 时间序列寻找季节性趋势。例如,一天中的电力需求在夜间会下降,而在夏季,航空乘客的数量会增加。

左图:历年航空旅客数量。右图:预测次日微软股价。

你可以尝试在航空乘客数据集上用 LSTM 或 ARIMA 建立你的时间序列预测模型,或者试试这个 TensorFlow.js 演示。

网页/产品推荐

你有没有搜索过什么东西,接下来看到的每一个广告都和你搜索的内容有关?

例如,在看完电影《复仇者联盟 4:终局之战》后,我在寻找某些场景的解释。从那时起, Google Discover Feed 开始向我展示围绕漫威电影宇宙的内容,甚至直到今天。

谷歌发现提要

尽管看起来 Google Discover Feed 是在推荐一组网页,但每个网页都是一个单独的输出。

同样,我们可以将这个想法应用于产品推荐。如果我们用所有过去的交易训练一个顺序预测模型,我们也许能够预测客户的下一次购买。

✌️Predicting a 级标签

序列分类使用带有一些序列输入和类别标签作为输出的标记数据集来训练分类模型,该分类模型可用于预测未知序列的类别标签。

序列分类应用的一些例子:

文本分类。给用自然语言写的文档分配标签有许多现实世界的应用,包括情感分类和主题分类。

异常检测。研究人员探索在 4 个不同的时间序列数据集中检测异常行为,1)心电图,2)航天飞机马洛塔阀门,3)电力需求和发动机传感器数据集。

基因组研究。研究人员一直在对蛋白质序列进行分类。这项工作可能有助于发现广泛的蛋白质功能。

健康信息学。研究人员使用 LSTM 将心电图信号分为五个不同的类别,以识别患者的心脏状况。这允许端到端学习,在没有任何专家干预的情况下提取与 ECG 信号相关的特征。

脑机接口。我们从脑电图中提取大脑信号,解码用户操作辅助设备的意图。

👌预测序列

序列到序列学习(Seq2Seq)是关于训练模型来转换一个输入序列并输出另一个序列。像所有的监督学习一样,Seq2Seq 模型是用对的数据集训练的,但是输入序列和输出序列可以有不同的长度。

该模型由两个 LSTMs 组成;一个将充当编码器,它编码输入序列并产生内部状态表示。这些表示对输入序列的“含义”进行编码,并作为解码器的输入,解码器负责生成目标序列。实际上,Seq2Seq 模型的训练是通过“强迫”解码器生成完美序列并因生成错误序列而惩罚它来完成的。

机器翻译

“有一只白猫”,翻译过来就是“一只白猫”Seq2Seq 模型将我们从序列长度和顺序中解放出来,这使它成为语言翻译的理想选择。在神经机器翻译之前,机器翻译是基于规则的,专注于逐字关系,使用上下文无关语法。

2013 年, Sutskever 等人推出了用于机器翻译的 Seq2Seq 架构,而 Cho 等人提出了编码器和解码器架构。在过去的几年里,这方面的发展非常活跃。当前为谷歌翻译实现的最先进的机器翻译是基于注意力和转换的。

图像字幕生成

根据图像中观察到的内容自动生成自然语言描述吸引了许多人工智能领域的研究人员。这是具有挑战性的,因为它结合了计算机视觉和自然语言处理的知识,涉及到物体检测以推断图像中的物体和物体的关系,并学习语法以生成文本描述。

Vinyals 等人介绍了一种端到端的神经网络,由视觉卷积神经网络和随后的语言生成递归神经网络组成。

展示和讲述:一个神经图像字幕生成器

在这个模型中,编码器是一个卷积神经网络,用于提取图像中的特征。解码器是一个递归神经网络,主要用于生成文本描述。与机器翻译类似,当前的技术水平使用注意机制,其中网络注意输入的部分,并将有限的信息处理资源分配给那些重要的部分。

3 个被低估的应对缺失价值观的策略

原文:https://towardsdatascience.com/3-underrated-strategies-to-deal-with-missing-values-a539fb6c0690?source=collection_archive---------15-----------------------

实施、理解和学习如何使用 3 种强大的方法(包括深度学习)来估算数据。

照片由像素上的 Pixabay 拍摄

我相信每个数据科学家/ ML 从业者都面临过数据集中缺失值的挑战。这是一个常见的数据清理过程,但坦率地说,是一个非常容易被忽视的过程。但是,有效的缺失值策略会对模型的性能产生重大影响。

出现缺失值的原因

缺失值出现的原因通常是特定于问题域的。但是,大多数情况下,它们发生在以下场景中:

  • 代码错误:数据收集方法遇到了一个错误,一些值没有被正确获取(例如,如果您要通过 REST API 收集数据,并且您可能没有正确解析响应,那么值将会丢失。)
  • 不可用:对于给定的观察,没有足够的数据可用(例如,如果有一个名为“学院”的特征,但是该观察(人/运动员等)没有上过学院,那么显然该值将为空。)
  • **故意 NaN 插补:**这可能发生在 Kaggle 等编码竞赛中,其中部分挑战是处理缺失值。

照片由 GeeksForGeeks

您应该处理缺失值的原因是因为许多 ML 算法需要数字输入值,并且不能对缺失值进行操作,因此如果您尝试运行缺失值的算法,它将会响应一个错误(scikit-learn)。然而,一些算法,如 XGBoost,将基于训练损失减少来估算值。

缺失值的处理方法:

有两种方法可以用来处理丢失的值:

  • 插补:使用某种方法填充数据
  • 删除:删除缺失值的行

虽然没有真正的"最佳"选项,但是通常 估算数据比删除数据更好,因为不这样做可能会导致大量信息丢失,以及更有可能对数据进行欠填充的模型。

然而,请注意,有时删除行可能是更好的选择,因为它创建了一个更健壮的模型,并且可以加速训练。

好吧,我知道你可能很想得到深度学习法(我知道,太神奇了!).所以,事不宜迟,让我们来了解一下技术!

策略 1: KNNImputer

图片来自维基百科

这种方法基本上使用 KNN,一种机器学习算法,来估算缺失值,每个值是在样本附近找到的 n_neighbors 个样本的平均值。

如果你不知道 KNN 是如何工作的,你可以看看我关于它的文章。但本质上,KNNImputer 将执行以下操作:

  1. 测量新样本和第 N 个最近样本之间的距离(由N _ neighbors参数指定)
  • 基于其最近的邻居,它将把第 N 个最近的非空邻居的平均值作为缺失值。

KNNImputer 在行动

让我们看一个使用 KNNImputer 的简单例子:

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputerdf = pd.read_csv('[https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'](https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'))

我们将使用著名的泰坦尼克号数据集作为我们的示例数据集。

接下来,我们检查哪些要素缺少值:

df.isnull().sum()OUT:
passengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

使用这种方法,我们可以看到哪些值需要估算。

df = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]

在这里,我们删除了一些不需要的特征,并快速地对我们的性特征进行一次性编码。

注意:通常人们会做一些特性工程和转换,但这不是本文的目的,因此我跳过这一部分。然而,在一个正常的项目中,您应该总是正确地检查和清理您的数据。

接下来,我们实例化我们的 KNNImputer,并给它一个 n _ neighbours 值 5。

imputer = KNNImputer(n_neighbors=5)
imputer.fit(df)

现在剩下要做的就是转换数据,以便估算值:

imputer.transform(df)

这就是你要的。KNNImputer。scikit-learn 再次使这个过程变得非常简单和直观,但是我建议在 Github 上查看这个算法的代码,以便更好地理解 KNNImputer 真正做了什么。

KNNImputer 的优点:

  • 可能比平均值、中间值或众数更准确(取决于数据集)。

KNNImputer 的缺点:

  • 计算开销很大,因为它存储在内存中的整个数据集中。
  • 对异常值非常敏感,因此估算值可能会导致模型无法尽可能好地运行。
  • 您必须指定邻居的数量

策略 2:通过链式方程进行多重插补(小鼠)

照片可以从栈中找到

这是一种非常强大的算法,其基本工作原理是选择一个具有缺失值的要素作为目标变量,并利用回归模型根据数据集中的所有其他变量来估算缺失值。

然后,它以循环方式重复这一过程,这意味着将针对所有其他要素回归每个缺失值的要素。

有点迷惑?没错。这就是为什么它的…类比时间!

用类比的方法理解老鼠

由邦妮·凯特在 Unsplash 上拍摄

假设您的数据集具有以下特征:

  • 年龄
  • 性别
  • 身体质量指数
  • 收入

而每个特征,除了性别,都有缺失值。在这个场景中,鼠标算法将执行以下操作:

  1. 对于每个缺少值的特性(年龄、身体质量指数、收入),您用一些临时的“占位符”来填充这些值。这通常是要素中所有值的平均值,因此,在这种情况下,我们将使用数据的平均年龄填充缺失的年龄,使用身体质量指数的平均值填充缺失的身体质量指数,等等。
  2. 返回到缺少一个要估算的要素。因此,如果我们选择估算年龄,那么年龄将是一个缺少值的要素,正如我们在上一步中估算其他要素一样。
  3. 回归所有(或部分)要素的年龄。为了使这一步起作用,删除 age 可能包含的所有 NaN 值。本质上我们是在拟合线性回归,年龄是目标特征,其他特征是独立特征。
  4. 使用之前拟合的回归模型来预测缺少的年龄值。(**重要提示:**当年龄稍后被用作独立变量来预测其他特征的缺失值时,观察值和预测值都将被使用)。随机成分也被添加到该预测中。
  5. 对所有缺失数据的要素(在本例中为身体质量指数和收入)重复步骤 2-4

鼠标算法完成了从 1 到 5 的所有步骤时,这就是所谓的**循环。**通常,鼠标需要用户浏览数据 5-10 次左右。

一旦我们到了最后一个周期,我们输出一个估算数据集。通常,我们希望在数据集的 5 个副本上运行该算法,然后将我们的结果放在一起。完成此操作后,我们可以分析结果并报告综合结果。

老鼠在行动

虽然这些步骤可能看起来漫长而困难,但多亏了我们的朋友 scikit-learn,实现 mice 就像做馅饼一样简单:

import numpy as np 
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputerdf = pd.read_csv('[https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'](https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'))df = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]

注意:确保在导入迭代估算器之前导入enable _ iterative _ inputr函数,因为该特性被归类为实验性的,否则将导致导入错误。

现在让我们调用实例化 IterativeImputer 类:

imputer = IterativeImputer(imputation_order='ascending',max_iter=10,random_state=42,n_nearest_features=None)

这里需要注意一些事情:

max_iter :返回插补数据集之前要进行插补的周期数

**插补 _ 顺序:**特征插补的顺序。

可能的值:

升序
从缺失值最少的特征到最多的特征。
降序
从缺失值最多的特征到最少的特征。
罗马
从左到右。
阿拉伯文
从右向左。
随机
每轮随机下单。

n_nearest_features :用于估计每个特征列缺失值的其他特征的数量。特征的接近度由绝对相关系数决定

random_state: 为使您的结果可重复而设置的随机种子

接下来,我们只需将它与数据相匹配,并对其进行转换!

imputed_dataset = imputer.fit_transform(df)

鼠标的优点:

  • 非常灵活,可以处理二进制和连续值
  • 通常比简单的均值/众数/中位数插补更准确。

鼠标的缺点:

  • 计算量很大,因为它存储数据集并循环 N 次。
  • 对于大型数据集可能会很慢

策略 3:利用深度学习进行插补

由计算机科学维基拍摄的照片

这可能是现有的最强大和最准确的插补方法。它本质上利用 MXnet 的深度神经网络来预测缺失值。它非常灵活,因为它支持分类变量和连续变量,可以在 CPU 和 GPU 上运行。

行动中的深度学习归因

我们正在使用的库名为 datawig 。来安装它。只需运行:

pip3 install datawig

在您的终端/命令行中。

import pandas as pd
import numpy as np
import datawigdf = df.drop(['PassengerId','Name'],axis=1)
df = df[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]df["Sex"] = [1 if x=="male" else 0 for x in df["Sex"]]

现在,我们将实例化 datawig 的 SimpleImputer 类:

imputer = datawig.SimpleImputer(input_columns=['Pclass','SibSp','Parch'], output_column= 'Age', output_path = 'imputer_model')

这里需要注意一些参数:

  • input_columns :包含我们想要估算的列的信息的列
  • output_columns: 我们要为其估算值的列
  • 输出 _ 模型:存储模型数据和度量

接下来,我们将估算值与我们的数据进行拟合,估算缺失值并返回估算数据框架:

# Fit an imputer model on the train data
# num_epochs: defines how many times to loop through the network
imputer.fit(train_df=df, num_epochs=50)# Impute missing values and return original dataframe with predictions
imputed = imputer.predict(df)

这就是深度学习的估算方法。

深度学习插补的优势

  • 与其他方法相比相当准确。
  • 它具有可以处理分类数据的功能(特征编码器)。
  • 它支持 CPU 和 GPU。

深度学习插补的缺点

  • 在大型数据集上可能会很慢
  • 一次只能估算一个特征
  • 您必须指定输入和输出列

结论

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

总而言之,我们必须承认,没有一种有保证的策略可以永远适用于每一个数据集。有些方法可能对一个数据集非常有效,但对另一些数据集则很差。

因此,检查您的数据,看看您应该如何输入值,以及使用什么策略总是好的。确保对不同的插补方法进行交叉验证,看看哪种方法最适合给定的数据集。

我希望你喜欢这篇文章,非常感谢我所有的追随者,他们让我保持不断的动力和求知欲!我希望你今天学到了一些新东西,请继续关注,因为我还有更多内容要发布!

照片由普里西拉·杜·普里兹在 Unsplash 上拍摄

终身学习需要的三个视角

原文:https://towardsdatascience.com/3-valuable-perspectives-that-data-scientists-need-for-lifelong-learning-f2421fe618d0?source=collection_archive---------31-----------------------

获得数据科学和 MBA 硕士学位后的升级课程

作为一名最近的数据科学毕业生,我一直感到一种健康的毕业焦虑。用不确定的事物代替熟悉的事物。应对工作的高压。弄清楚“我这辈子要做什么?”这些是一些主题,但是我不想谈论它们,尽管它们都很重要。在我的毕业焦虑中,最突出的线索远没有那么明显,更长远,而且令人惊讶地被以前的学生忽略了:我们思考和对待终身学习的方式。

为了让我正在穿越的交叉点有意义,我决定描述三个从根本上改变了我思考学习方式的观点。没有一个要点是技术性质的,更不用说特定于任何内容领域。这是故意的。数据科学专业人员面临着在职业生涯中获得大量“什么”的问题,工具和技术的选择将不断发展。不变的(也是更难遇到的)是我们必须在持续的数据科学教育中坚持的高层次观点。

由菲利普·布特在 Unsplash 拍摄的照片

1。你的答案的质量取决于你的问题的质量

我曾经开玩笑地告诉自己,伟大的数据科学家和平庸的数据科学家之间的唯一区别是一个人在谷歌上搜索他们的问题的熟练程度。这个笑话的核心(以及与现实世界相似的部分)是:伟大的问题胜过伟大的证据。Roger Peng 写了关于这一点,他描述了数据科学家如此努力地优化一种方法,却忽略了构建适当问题的陷阱。这是一个听起来非常像金锤偏见的盲点,发生在很大程度上是因为数据科学家(包括我自己)喜欢闪亮而复杂的工具,不幸的是,这些工具更多的是掩盖而不是明确问题。

我在商学院也见过同样的“证据胜于问题”现象。我们倾向于使用相同的通用框架:一个细分竞争的矩阵,一个增长盈利能力的树形图,一个显示需求弹性的定价模型。所有这些都擅长简化外部世界,但它们的应用在实践中要微妙得多。我相信,所需要的是“提问”技巧中的例外主义——涉及、探索和阐明个人或部分人群的隐藏需求。虽然我很感激我从研究生院带走了这么多有启发性的框架,但我教育的最大价值是学会了如何利用问题的惊人力量。

提出伟大的问题有两点值得注意:有提出问题的创造力和有提出问题的勇气。那么,今天我们能做什么来提出更好的问题呢?当我回顾我的研究时,设计思维是我为提高我所提问题的质量而做的最有价值的一件事。虽然在设计思维领域有很多伟大的金块,但最大的想法是移情 *。*同理心使你(一个局外人)能够近距离接触到你正在为其设计解决方案的人,无论是顾客、客户还是同事。首先,你不仅要熟悉被问到的问题类型,还要熟悉实践者坚持设计思维过程的方式。

逐步完成设计思维过程就是遇到了无拘无束的提问艺术。我数不清有多少次我不得不拒绝相信“我明白了”或“我有解决办法”的诱惑。知道你需要问题是一回事,但是给提问过程带来纪律和耐心是完全不同的另一回事:前者只是触及表面,而后者挖掘出深刻的洞察力。当你不断改进和强化被问到的问题时,纪律就以反复面试的形式出现了。耐心来自于不断挖掘每个观察背后的“为什么”。结果是对利益相关者以及他们思考、感受和行为的环境有了深刻的理解。这种理解能够在当下产生可操作的洞察力,并为未来开启更高形式的学习。我们不是通过对算法和框架的死记硬背,而是通过对我们需要问的问题的高度感知来达到目的。

就像我以前的教授常说的:

"错误问题的正确答案仍然是错误的答案。"

**那又怎样:**听。重新表述你所听到的。换一种方式问。重复一遍。

2。力量和弱点是有条件的替代品:力量因自我而变弱,弱点因真实性 而变强

我两年前下的一个决心是变得擅长用数据讲故事(这是我想要强化的优势),而不是构建伟大的预测模型(这是我选择搁置的弱点)。当我回顾这些技能的演变时,我发现我的数据叙事愿望是正确的:一位客户对我从他们的数据中获得的见解感到高兴,一位教授称赞我对商业机会的介绍,一位学生误认为我是专业的推动者。这里很容易看出强项叙述:先天实力×毅力=超级能力。不太明显的是一对条件变量,它们让优势成为你的弱点,让弱点成为你的优势。

第一个变量是自我,它警告我们最好的属性也是我们的致命弱点。我曾经参加过 USAFacts 数据可视化挑战赛,这是一个全校范围的比赛,似乎正合我的胃口,如果获胜,将有机会见到世界上最有影响力的商业领袖之一,前微软首席执行官史蒂夫·鲍尔默。和四个同学一起,我花了几个小时在数据中寻找正确的故事——如果说实话,我有点狂妄自大:我是一名正在接受培训的数据科学家,在一个充满数据的竞技场上与几十名 Excel 爱好者竞争。如果你听到我说我从未期望过获得高分,那一定是在撒谎。

第二天,在一次练习中,我的团队的可视化被教授和同学提名为比赛中“不要做什么”的示范展品:它提供了太多的信息,包含了过多的华而不实的干扰,并且未能清楚地传达预期的信息。过度自信削弱了我。我不需要更多的说服,它会再次得到我,如果它不加检查。

第二个变量是真实性,它建议你将自己的弱点与透明度结合起来。现在,我并不是说要以脆弱的精神在屋顶上尖叫你的弱点。然而,我学到的是,对你自己和你的同事开放你希望改进的地方。关于弱点,有两点需要记住:

  • 首先,我们不必全心全意地忽视它们。有时,我可能需要建立一个预测模型,这将有助于达到令人满意的熟练程度,而不是停留在功能失调的无能水平。
  • 第二——这与传统观点相反——当你以正确的态度对待你的弱点时,它们很有可能成为你的优势。

我从未想过有一天我会在我天生不擅长的方面变得“比一般人更好”,但在我之前的人已经找到了实现这种阶跃变化的途径。在学校的最后一周,一名校友回到课堂,分享了他在一家财富 50 强公司担任首席执行官和董事长的经历。他用 20 分钟的时间反思了自己是一个多么平庸的学生,甚至详细描述了几十年后仍萦绕在他心头的一次糟糕的课堂演讲的记忆。所有这些都是为了强调,今天的明显弱点(在他的例子中,是管理沟通)不一定会阻碍你明天成为行业的领导者。这是一个有着令人印象深刻的资历的人,他当时说得如此雄辩,却放弃了他的过去的如此不同的画面。这种不和谐非常吸引我,他的建议在我脑海中形成了一个关于终身学习的具体教训。套用他的话:

“我把弱点和真实联系在一起。早期,人们因为我擅长什么而尊重我——以至于当谈到我缺乏什么时,他们会支持我的缺点,这要归功于信任的基础。承认并公开自己的弱点是克服它的关键。”

那又怎样: 保持谦逊。保持开放。

3。管理自我是成功的基石——在数据科学、商业和生活中

在运营管理中,有一个常见的案例是这样的:

你正在创建一个产品,并且正在考虑增加哪些功能。你的选择是快速交货 ,或者 廉价生产 。选择两者的任意组合,因为同时满足这三个条件的可能性很低。

想要便宜又快速?去吃麦当劳,但别指望米其林星级质量。模型提醒你,每一次努力都需要你权衡取舍,做出决定。在思考了所有这些之后,我受到启发,为我自己的个人困境画了以下图表:

双学位爸爸问题

目标是在这三方面都做得好。但我该如何在备受追捧的文本分析培训和高度实用的小企业咨询之间做出选择呢?我可以和我的儿子们共度几个晚上来换取几个小时的数据可视化竞赛吗?答案似乎不言自明,但对我来说,它们是经常发生的事情,也是困惑和遗憾的共同来源。

作为研究生选择学习重点和作为专业人士选择工作重点没什么区别。真的很难。面临无数请求的数据科学家必须平衡哪些是新颖的,哪些是重要的,哪些是对公司可行的。危机中的总经理必须知道现在做什么决策,以后做什么决策,把什么事情委托给别人。如果成功是由学习使能的,而学习是由时间支配的,那么时间是由什么力量委托的呢?我什么都不知道,只知道我自己的失望表明我没有足够深入地思考我最重视的事情,以及我可能将它们结合起来的方式。

在我寻找答案的过程中,研究生院提供了一个意想不到的指南针:文学。在亚里士多德和本杰明·富兰克林的书中,我发现了创造更好学习习惯的方法。在像大卫·布鲁克斯和 T21 这样的同龄人中,我找到了定义和衡量我成功的蓝图。不久之后,我开始每天花一个小时进行反思,在那里我会列举每天的想法和活动,以便辨别哪些是重要的,哪些是可以放弃的。在研究生院尝试这一切,起初感觉就像在泳池跳水,对如何狗刨式游泳只有模糊的概念。然而,渐渐地,救生衣分两批出现:

  • 目的明确(去掉不重要的东西)
  • 创造性重组(在现有材料中寻找联系)

目标明确通常能为投入的时间带来最大的回报,尤其是在工作和生活方面。虽然你肯定不需要一个硕士学位来找到你的目标,但在一段漫长的艰难时期,有必要关注你的“为什么”并确定你的原则。对我来说,研究生院并没有定义我的目的,但这是一个奇妙的揭示它的迫使机制。

我发现的第二个想法叫做创造性重组。我曾经认为,管理自己就是尽职尽责地使用强大的规划工具——创建主列表、按日历工作、同步虚拟助理。没过多久,我就意识到这些工具更适合于取得小的进步,而不是想出重塑自我管理的方法。对我来说,改变游戏规则的策略源于重新定位,这是一种来自创新研究的技术,它问“我身边有什么,通过合并它们我能利用什么机会?”

例如,在研究生院的最后一个季度,我首先阐明了我需要追求的学习成果:能够在真实的应用医疗保健问题中设计和实现一系列机器学习算法。这听起来很简单,但这种专注是我发现在我的生态系统中有哪些“重组体”的一个重要原因:将我与医生联系起来的教授*,医生非常了解医院面临的业务问题,这可以提供大量的数据。业务和数据科学元素已经在等待了,当它们合并在一起时,它们开辟了一个学习里程碑,否则单独追求会更加困难和耗时。我只是需要更多的关注和创造力。这是一个强有力的警钟,我相信它将在未来几年激励和维持我的数据科学学习。*

那又怎样: 明确你的目的,制定指导原则,并坚持下去。

收尾思路

如今,自学数据科学并不缺乏资源。虽然这种丰富可以提升终身学习的努力,但它也会以三种微妙的方式侵蚀这些努力:

  1. 当我们强调证据多于问题时
  2. 当我们屈服于优越感时
  3. 当我们错误分配时间和精力时

因此,在您开始学习新的数据科学课程之前,请记住,加快学习曲线不仅仅是以附加的方式收集技术。这也是关于用更高的视角来复合学习的效果。我们朝着这个方向前进,将注意力转移到(1)对我们面临的问题有更细致的理解,(2)对队友真诚坦诚,以及(3)清楚地意识到我们为什么选择钻研一个想法。

为了更好地了解你的用户,你必须知道的 3 个变量

原文:https://towardsdatascience.com/3-variables-you-most-know-to-understand-your-users-better-94a3763ac9d9?source=collection_archive---------23-----------------------

用户、顾客或受众:多少,多少,多久一次?

迈克·什切潘斯基在 Unsplash 上的照片

T 根据产品或服务的不同,它们有不同的名称,无论我们谈论的是用户、客户或受众,媒介或网络平台,还是衡量的方法。但无论你是否拥有一家餐厅、一个应用程序或一个电视广播频道,你都必须了解它们。

别担心,你不需要成为数学家就能理解它们。

餐馆的模型

每个人都去过那家很受欢迎的餐馆,那里总是挤满了食客,很难找到座位。你猜这是一个成功,你甚至私下想有一个这样的企业。

但客户数量是一个不完整的衡量标准。如果每个顾客只是要一杯咖啡会怎么样?你可以为客户创造完美的体验,一个伟大的环境,卓越的服务,但这可能不是你的服务或产品的目标。

所以,在餐馆里,顾客的数量不足以衡量成功。你需要知道他们在这上面花了多少钱。

照片由在 Unsplash 上提升

让我们假设这家餐馆有大量的顾客,每个人的平均消费也不错。这个概念很棒,每个人都想了解这家餐厅。在最初的几周,也许是最初的几个月,餐馆里挤满了顾客。但是突然,有一天你从它面前经过,发现它是空的。发生了什么事?

再说一次,你为顾客创造了最好的体验,一个很棒的环境,优质的服务,但是出于某种原因,顾客不会再回到餐厅。

因此,在一家餐馆里,顾客数量和消费金额不足以衡量成功与否。你需要知道他们来餐馆的频率。

网站、应用程序、服务或产品也是如此。

1.到达

你需要知道你有多少用户、客户或受众。为此,您需要定义用户、客户或受众的含义。

在餐馆里,这似乎是显而易见的。每个支付最低金额的人。但要小心,因为你可以有一个人谁支付,但一个或多个来与她或他吃饭。你应该衡量食客。

用户可以是使用你的应用的人。但在这些时候,下载是不够的,所以你可以将你的用户定义为订阅者,或者基于应用程序中的一些交互。

对于电视和视频来说,观众通常是根据最少消耗的秒数或分钟数来定义的,但在电影中是根据门票来定义的。

在广告和媒体中,你使用词语 受众到达 意味着在给定的时期内,不同的人至少接触过一次媒体的总数。

在社交媒体营销中,您使用了术语社交媒体接触,它指的是在社交平台上接触过特定内容的用户数量。

无论我们谈论的是用户、顾客还是受众,你都必须知道你接触了多少人。

2.平均花费

一旦你定义了你的顾客,你需要知道他们在你的餐馆消费了多少。在这种情况下,你必须考虑到每一个用餐者,而不仅仅是付钱的人。一般来说,这被称为每位顾客的平均花费,在餐饮业中被称为每位用餐者的平均花费。

在某些情况下,您希望增加客户数量。但是一旦你有了足够多的顾客(你的桌子都坐满了),你就想增加每个顾客(或用餐者)的平均消费。

照片由伊尔努尔·卡里穆林在 Unsplash 上拍摄

在电视、音频或视频等媒体中,交换的货币是时间。你可能听说过注意力经济。嗯,衡量你的产品或服务得到多少关注的唯一方法是通过观众花在它上面的时间。

如果你提供一个 60 分钟长的播客或视频,每人平均花费 30 分钟,你说你的内容有 50%的保真度*。*

一旦你有了用户或观众,你希望他们在你的产品或服务上花更多的时间。

一些在线服务或应用程序也是如此。在 web analytics 中,保真度被称为页面平均停留时间。但在大多数 web 和 app 案例中,时间并不是度量的统一,因为它没有太大意义。

你还记得你的用户旅程或者你的用户流吗?还是你的营销漏斗?嗯,你通过它建立某些互动,你衡量你的用户走了多远。例如,在游戏中,你有关卡或阶段。在登录页面上,您可以在行动号召之前执行一些步骤。

在 web analytics 中,除了在页面上的平均时间,你还有每个用户的会话数,每个会话的平均时间…所有这些都是同一个概念的变体。

然而,无论你衡量的是金钱、时间还是行动,这都是一个试图衡量与你的目标相关的用户行为的变量。或者换句话说,用户做什么。

3.频率

在餐馆里,如果你把每个顾客的账单或购买作为你的第一个衡量标准,你将无法识别顾客和他们的行为。例如,在一周内,你可以有一百张账单或购物单。但这并不意味着你有一百个顾客。有些顾客可能每天早上都来吃早餐,有些则一周来几次。

识别客户有助于测量重要的变量,如回头客的百分比。不管顾客已经回头客多少次,你的顾客中有多少是回头客?15%, 20%, 50%?**

但最重要的是,你可以计算出购买频率,即你的客户在给定时期内返回的平均次数。

对于一家餐馆,你可以用几周或几个月的时间。例如,你的顾客每月来你的餐馆两次。请记住,我们谈论的是平均值。你有几乎每个工作日都来的大客户,也有永远不会回来的客户。

照片由丽贝卡·阿尔达马在 Unsplash 上拍摄

在实体店的情况下,你如何识别顾客而不是账单或购买?你见过那些“顾客忠诚卡”吗?忠诚度计划的优势之一是你可以从中获得数据。

在媒体和广告中,频率也是一个人接触内容的次数。这在广告中很重要,因为为了传递广告信息,观众需要不止一次地看到它。根据内容的不同——从简单的品牌信息到带有说明的具体促销活动——活动可能需要或多或少的频率。

在网站和应用上,你有回头客或用户。你可能在社交网络或订阅服务中听过“活跃用户”这个词。有时用户数量不够,您希望将用户定义为在给定时间段内使用过该服务或登录过该服务的人。

与餐馆的例子及其购买与客户的情况类似,在 web 和应用程序中,您可能有很多视图、下载或任何定义的交互,但识别实际用户很重要。某些视图、下载或交互可以由同一用户多次完成。

变量有变化

这只是对了解你的用户的 3 个基本变量的介绍。考虑到一旦你有了这些变量的数据,你就可以测量它们的变化或片段而不仅仅是平均值。

例如,你可以根据不同种类的顾客或用户花了多少钱,他们来的频率,或者任何有用的人口统计学分类,比如流派,年龄,学者等等。一个目标是一个特定的人口统计。要不要多卖给青少年?嗯,你把青少年定义为你的目标,开始衡量他们的行为。

或者你可以找出你的重度用户,并试着了解他们相对于轻度用户的特征。当你开始玩数据的时候,天空就是极限。

外卖食品

照片由米歇尔·亨德森在 Unsplash 上拍摄

了解你的用户、客户或受众是提供更好的服务、产品、内容或体验的基础。这是适用于任何类型企业的三个基本变量。

下一次,尝试使用餐馆示例作为参考:用餐者的数量、每个人的支付金额和返回频率。

在某种程度上,这些变量对于任何一个拥有餐馆或商店的人来说都是直观的。但在其他层面上,如果我们理解并利用它们,它们可以为我们的决策提供大量信息。

资源

  • 受众测量—维基百科
  • 什么是受众研究?(+如何进行)
  • Reach(广告)—维基百科
  • 社交媒体覆盖范围—维基百科
  • 重复购买率,如何计算
  • 为什么您的变量需要变化—统计解决方案
  • 用户之前是什么

风险管理方法可能误导的 3 种方式以及如何纠正!

原文:https://towardsdatascience.com/3-ways-risk-management-methods-can-be-misleading-and-how-to-fix-it-c9b60ae0f535?source=collection_archive---------16-----------------------

常见的错误会使你的风险管理努力完全无用,甚至适得其反。

埃斯彭·比埃尔德的照片

🔥【公告】
在你继续阅读这篇文章之前,我只想让你知道,几天前,我发布了一个完整的课程,帮助你提高你的决策技能,并在竞争中领先
它是多年研究的成果,在有限的时间内免费提供。
👉如果你想用科学的方法做出更好的决定,这里有一个链接:https://smart-decision-makers.streamlit.app/
[/Announcement]🔥

为了最大化任何努力的成功机会,关键是要正确地识别和优先考虑风险,将你的精力和注意力集中在最重要的事情上。

在本文中,我将与您分享三个常见的错误,这些错误可能会使您的风险管理努力完全无用,甚至适得其反。

首先,我们来回忆一下一些定义;PMBoK(项目管理知识体系)指南将风险描述为:不确定的事件或条件,如果发生,会对项目目标产生积极或消极的影响。

因此,为了正确管理您在项目中识别的风险,您需要评估它们的概率和影响。

大多数风险管理方法依靠简单的尺度来评估风险的概率或影响。

例如,PMBoK 指南建议使用下面的定义表,按照从“非常高”到“非常低”的明确范围对概率和影响进行分类

PMBOK 指南 2017 年第 6 版—项目管理协会,表 11–1,第 407 页

错误#1:重复使用现有的比例定义

在许多情况下,比例定义是标准化的,由您的组织提供。您也可能会尝试重用以前项目中的比例定义。

为了说明这种做法有多危险,让我们举个例子。

如果你被告知优先考虑两个风险,一个可能会给你的项目增加 17%的延迟,另一个可能会使你的总预算增加 2 倍。你认为哪一个更重要?

这个问题的答案取决于你的项目的性质,然而,大多数人会同意损失 100%比损失 17%更重要。

现在,让我们使用 PMBOK 中提供的以前的规模定义表,并将其应用于一个预计持续两年的 50 万美元的项目。

假设您必须以相同的概率优先考虑两个风险,一个可能会使您的项目延迟 17% (4 个月),第二个风险可能会使您损失 100%的预算(50 万美元)。

根据定义表,第一个风险(17%延迟)将被评定为“高优先级”,而第二个风险(100%超出预算)将被评定为“中等”。这和我们之前做出的直观结论正好相反!

作为一个收获,在使用任何尺度的定义之前,即使它是由您的组织提供的,您也应该始终确保不同的尺度是一致的、连贯的,并且非常适合您的项目环境。

错误#2:秤的压缩偏差

一旦您使用明确定义的等级评估了概率和影响级别,传统的风险管理方法会建议为每个等级关联一个分数。然后将概率和影响得分相乘,计算风险的重要程度。

这种危险程度越高,风险就越被认为是重要的,值得您采取行动,将其可能性或影响降低到可接受的水平。

在 PMBoK 指南中提供的示例中,建议的分数范围从 0.9 表示“非常高”的概率到 0.1 表示“非常低”的概率,影响分数范围从 0.8 到 0.05。

用这样的尺度,两个显著不同的随机事件可以被认为是等同的。例如,概率分别等于 0.71 和 0.99 的两个事件将具有相同的分数 0.9。

这种规模压缩现象甚至可以颠倒风险的优先顺序。例如,考虑两种风险:

  • 风险 1:高概率(51% — 70%)和中等影响(50.1 万美元—100 万美元)
  • 风险 2:低概率(11% — 30%)和高影响(100 万美元—500 万美元)

根据上面的概率-影响矩阵,第一个风险的重要程度(0.14)高于第二个风险(0.12)。我们希望它有更高的优先级。

但是,如果我们计算在两种情况下都有风险的最大预期影响,我们会发现优先级顺序相反!

事实上,第一种风险的最坏情况是 70 万美元(70% * 100 万美元:损失 100 万美元的可能性为 70%),而第二种风险的最坏情况是 150 万美元(损失 500 万美元的可能性为 30%)。

如果我们将预算影响的所有可能值与关键程度的演变进行绘图,我们可以看到该函数正在减少的其他几个点。这意味着它颠倒了已识别风险的自然优先级顺序。

风险预算是风险重要程度的函数

我们刚刚证明,由于规模的压缩效应,风险管理方法可能导致风险优先级的逆转。

错误#3:秤的解释

我们在处理风险时犯的最后一种错误与人们(错误地)解释概率尺度的方式有关。

福特汉姆大学(Fordham University)心理计量学和定量心理学教授大卫·布德斯库(David Budescu)进行了几项研究,他询问了成千上万不同国籍的人对政府间气候变化专门委员会(IPCC)报告中句子的理解。

IPCC 是联合国评估气候变化相关科学的机构。IPCC 依靠概率尺度(如“不太可能”和“非常可能”)来传达其预测的潜在不确定性。

David Budescu 证明了人们系统地曲解概率陈述,即使他们被提供了这些尺度的明确定义(例如,不太可能< 33%; very likely > 90%)。

大卫·布德斯库的团队通过改变量表的定义,以匹配参与者将“可能”、“非常可能”和其他日常生活中使用的词联系起来的概率,成功地提高了与定义一致的解释的百分比。

因此,一致解释的百分比从 26%跃升至 40%。然而,40%的理解尺度的一致性仍然很低。
想象一下,你正在和你的同事开会,刚刚同意将一个特定的风险归类为“非常可能”,而你指的是“非常可能”与高于 90%的概率相关联的等级定义。
根据这项研究,您的团队中仍有 40%的人同意您使用“非常可能”这一级别,而如果让他们为同一事件分配一个概率,他们会说> 50%。

在这次会议中,你唯一成功做到的事情就是在你的团队中创造一种沟通和一致的假象,让他们知道什么是最重要的要解决的风险。

结论:

在本文中,我们刚刚分享了传统风险管理方法可能产生误导和模糊的 3 种方式。

我不是说你应该停止使用这些方法。然而,重要的是要意识到这些偏差,以便最大限度地利用这些方法,同时限制它们可能的缺点。
以下是增加你成功机会的几条指导方针:

  • 如果你使用的是天平,确保它们是一致的,并且相互对齐。
  • 当把你的量表转换成分数时,总是使用对称的分数,否则你会偏爱一种类型的影响。
  • 总是倾向于直接使用定量概率,而不依赖于中间尺度。这是对不确定性进行明确描述的最佳方式。

参考

布德斯库,D.V .,波尔 h .,,布鲁姆尔,S. (2012 年)。IPCC 报告中不确定性的有效沟通。气候变化,113,181–200。

布德斯库,D.V .,波尔,h .,布鲁姆尔,s .,,史密森,M. (2014)。世界范围内 IPCC 概率声明的解释。自然气候变化,4508–512。DOI:10.1038。/NCLIMATE2194。

使用 Keras API 在 TensorFlow 中构建神经网络的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-build-neural-networks-in-tensorflow-with-the-keras-api-80e92d3b5b7e?source=collection_archive---------10-----------------------

在 TensorFlow 2.x 中使用 Keras 构建深度学习模型,可以使用顺序 API功能 API 和模型子类

图一。顺序 API、函数 API、并行的子类化方法模型

如果你四处逛逛,查看不同的教程,进行谷歌搜索,花大量时间研究 TensorFlow 的堆栈溢出,你可能已经意识到有大量不同的方法来建立神经网络模型。长期以来,这一直是 TensorFlow 的一个问题。这几乎就像 TensorFlow 试图找到通往光明的深度学习环境的道路。如果你仔细想想,这正是正在发生的事情,对于 2.x 版本的库来说,这很正常。由于 TensorFlow 是迄今为止市场上最成熟的深度学习库,这基本上是你能得到的最好的库。

克拉斯-张量流关系

一点背景

TensorFlow 向深度学习平台的进化不是一蹴而就的。最初,TensorFlow 将自己推销为一个符号数学库,用于跨一系列任务的数据流编程。所以 TensorFlow 最初提供的价值主张并不是一个纯粹的机器学习库。目标是创建一个高效的数学库,以便在这个高效结构之上构建的定制机器学习算法可以在短时间内以高精度进行训练。

然而,用低级 API 重复地从零开始构建模型并不是很理想。所以,谷歌工程师 Franç ois Chollet 开发了 Keras,作为一个独立的高级深度学习库。虽然 Keras 已经能够在不同的库上运行,如 TensorFlow、Microsoft Cognitive Toolkit、Theano 或 PlaidML,但 TensorFlow 过去是,现在仍然是人们使用 Keras 的最常见的库。

现状

在看到模型构建过程的混乱之后,TensorFlow 团队宣布【Keras 将成为用于在 TensorFlow 2.0 中构建和训练模型的核心高级 API。另一个高级 APIEstimator API,在这个声明之后,已经开始失去它已经逐渐减少的受欢迎程度。

Estimator API 和 Keras API

图二。Keras API 和估算器 API 在张量流图中的位置

现在,让我们回到问题上:人们使用 TensorFlow 建立模型的方法有很多种。造成这个问题的主要原因是 TensorFlow 没有采用单一模型 API。

在 1.x 版本中,对于生产级项目,最常用的模型构建 API 是 Estimator API。但是,随着最近的变化,Keras API 几乎赶上了 Estimator API。最初,Estimator API 更具可伸缩性,允许多种分布,并且具有方便的跨平台功能。然而,Estimator API的大部分优势现在都消失了,因此,很快 Keras API 可能会成为构建 TensorFlow 模型的单一标准 API。

因此,在本文中,我们将只关注在 TensorFlow 中构建模型的 Keras API 方法,其中有三种方法:

  • 使用顺序 API
  • 使用函数式 API
  • 模型子类化

我将直接将它们与相应的模型构建代码进行比较,这样您就可以亲自测试它们了。让我们深入编码。

进行比较的初始代码

为了测试这三种 Keras 方法,我们需要选择一个深度学习问题。用 MNIST 进行图像分类是一项非常简单的任务。我们试图实现的是训练一个模型来识别手写数字,使用著名的 MNIST 数据集。

图 3。基准分析的虚拟任务:MNIST 图像分类

MNIST 数据集,代表修改的国家标准和技术研究所数据库,是一个手写数字的大型数据库,通常用于训练各种图像处理系统。MNIST 数据库包含来自美国人口普查局员工和美国高中生的 60,000 幅训练图像和 10,000 幅测试图像。如果你想看完整的教程,你可以找到我关于图像分类的单独教程。

[## 使用 MNIST 数据集在 10 分钟内完成图像分类

利用 TensorFlow 和 Keras |监督深度学习使用卷积神经网络来分类手写数字

towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d)

使用下面的代码,我们将导入所有的层和模型,这样在接下来的部分就不会打扰我们了。我们还下载了 MNIST 数据集并对其进行预处理,以便它可以用于我们将使用这三种不同方法构建的所有模型中。只需运行下面的代码:

要点 1。必要的进口,MNIST 装载,预处理

现在,这部分就不碍事了,让我们把重点放在建立张量流模型的三种方法上。

构建 Keras 模型的 3 种方法

在 TensorFlow 中构建 Keras 模型有三种方法:

  • 顺序 API: 当你试图构建一个只有一个输入、输出和层分支的简单模型时,顺序 API 是最好的方法。对于想快速学习的新人来说,这是一个很好的选择。
  • 函数式 API: 函数式 API 是构建 Keras 模型最流行的方法。它能做顺序 API 能做的一切。此外,它允许多输入、多输出、分支和层共享。这是一种简洁易用的方法,并且仍然允许很好的定制灵活性。
  • **模型子类化:**模型子类化适用于需要完全控制他们的模型、层和训练过程的高级开发人员。您需要创建一个定义模型的定制类,并且您可能在日常任务中不需要它。但是,如果你是一个有实验需求的研究者,那么模型子类化可能是你最好的选择,因为它会给你所有你需要的灵活性。

图 4。使用展平图层将二维图像阵列转换为一维阵列

让我们看看这些方法是如何实现的。我们将建立一个基本前馈神经网络,它具有一个平坦层,将二维图像阵列转换为一维阵列和两个密集层。

顺序 API

在顺序 API 中,我们需要从 tf.keras.Models 模块创建一个顺序对象。我们可以简单地将所有层作为列表格式的单个参数传递,如下所示。如你所见,这很简单。

要点 2。用 Keras 顺序 API 构建的前馈神经网络

功能 API

对于函数式 API,我们需要单独定义我们的输入。然后,我们需要创建一个输出对象,方法是创建所有相互关联并与输出关联的层。最后,我们创建一个模型对象,它接受输入和输出作为参数。代码仍然非常干净,但是我们在函数式 API 中有了更多的灵活性。

要点三。用 Keras Functional API 构建的前馈神经网络

模型子类化

让我们继续讨论模型子类化。在模型子类化中,我们从创建一个扩展 tf.keras.Model 类的类开始。模型子类化有两个关键功能:

  • init 函数充当构造函数。多亏了 init ,我们可以初始化模型的属性(例如层)。用于调用父构造函数(构造函数在 tf.keras.Model )和 self 用于引用实例属性(如图层)。
  • 调用 函数是在 init 函数中定义图层后定义操作的地方。

为了用模型子类化构建相同的模型,我们需要编写更多的代码,如下所示:

要点 4。基于 Keras 模型子类化的前馈神经网络

结束代码

既然您可以用三种不同的方法创建同一个模型,那么您可以选择其中的任何一种,构建模型,并运行下面的代码。

要点 5。模型配置、培训和评估

上面几行负责模型配置、训练和评估。当我们比较这三种方法的性能时,我们看到它们非常接近,但略有不同。

表 1。不同 Keras 方法的性能:顺序 API、函数 API 和模型子类化

Jonathan Chng 在 Unsplash 上的照片

我们更复杂的模型子类化方法优于顺序 API 和函数 API。这表明这些方法在低端的设计上也有细微的差别。然而,这些差异可以忽略不计。

最终评估

到目前为止,您已经了解了这三种 Keras 方法之间的异同。但是,让我们用一个表格来总结一下:

表二。TensorFlow 中构建 Keras 模型的不同方法比较:顺序 API、函数 API 和模型子类化

总之,如果您刚刚开始,请坚持使用顺序 API。当您深入到更复杂的模型时,尝试一下函数式 API。如果你正在读博士或者只是喜欢进行独立的研究,试试模型子类化。如果你是专业人士,坚持使用功能 API。它可能会满足你的需要。

在评论中让我知道你最喜欢的建立 Keras 模型的方法。

订阅邮件列表获取完整代码

如果你想在 Google Colab 上获得完整的代码,并获得我的最新内容,请订阅邮件列表:✉️

现在就订阅

喜欢这篇文章吗?

如果你喜欢这篇文章,可以考虑看看我的其他类似文章:

* [## 4 个预训练的 CNN 模型,用于具有迁移学习的计算机视觉

使用最先进的预训练神经网络模型,通过迁移学习解决计算机视觉问题

towardsdatascience.com](/4-pre-trained-cnn-models-to-use-for-computer-vision-with-transfer-learning-885cb1b2dfc) [## TensorFlow Hub & Magenta 在 5 分钟内实现快速神经风格转换

利用 Magenta 的任意图像风格化网络和深度学习,将梵高的独特风格转移到照片中

towardsdatascience.com](/fast-neural-style-transfer-in-5-minutes-with-tensorflow-hub-magenta-110b60431dcc) [## 使用 MNIST 数据集在 10 分钟内完成图像分类

利用 TensorFlow 和 Keras |监督深度学习使用卷积神经网络来分类手写数字

towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d)*

Python 中计算加权平均值的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-compute-a-weighted-average-in-python-4e066de7a719?source=collection_archive---------1-----------------------

编程 | 面试 | 办公时间

在这篇简短的教程中,我将展示如何在 Python 中定义自己的函数或使用 NumPy 来计算加权平均值

照片来自像素

更新:你们中的许多人联系我,要求提供宝贵的资源,以便使用 Python 自动化 Excel 任务,或者使用 Python应用流行的统计概念 。下面我分享我推荐的四门课程:

  • Python 中的数据科学编程(纳米级)
  • Python 中练习统计面试题

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

何时使用加权平均值?

假设您必须分析下表,该表显示了一家小公司员工的年薪,这些员工分为五组(从工资):

作者在 Tableau 中创建的图像。使用了模拟数据。

如果您计算Salary Per Year列的简单平均值,您将获得:

但是 62000 英镑能准确代表所有群体的平均工资吗?因为数据已经汇总,每个组有不同的Employees Number,每个组的平均Salary Per Year在总平均值中的权重不同。在计算简单平均值时,每组的权重相同,导致结果有偏差。

在这种情况下,解决方案是通过计算加权平均值来考虑每组的权重,加权平均值可以用以下公式用代数表示:

其中x代表分配(Salary Per Year),w代表待分配的权重(Employees Number)。假设该表包括五个组,则上述公式变为:

用实际数字代替xw,你应该得到下面的结果:

请注意,考虑到权重因素,各组的平均值Salary Per Year几乎比简单平均法计算出的值低 18,000,这是描述数据集的一种准确方式,因为每组都有一定数量的员工。

既然已经介绍了理论,让我们看看如何使用 3 种不同的方法在 Python 中获得加权平均值。为此,第一步是导入包和employees_salary表本身:

import pandas as pd
from numpy import averagedf = pd.read_csv(‘C:/Users/anbento/Desktop/employee_salary.csv’)df.head()
distribution = df[‘salary_p_year’]
weights = df[‘employees_number’]

[## 3 纳米学位你应该考虑在 2021 年推进你的数据工程职业

towardsdatascience.com](/3-nanodegrees-you-should-consider-to-advance-your-data-engineering-career-in-2021-baf597debc72)

方法 1:使用列表理解的功能

如果您希望编写自己的算法,计算加权平均值的第一个非常简单的方法是使用列表理解来获得每个Salary Per Year与相应的Employee Number ( numerator)的乘积,然后除以权重之和(denominator)。

Output:
44225.35

上面的函数可以很容易地重写为一行代码:

Output:
44225.35

方法 2:使用 Zip()函数

除了使用列表理解,您可以简单地从空列表(weighted_sum)开始,并通过其weight附加每个组的平均值salary的乘积。zip()函数非常方便,因为它生成一个元组迭代器,帮助将每个salary与对应的weight配对。

Output:
44225.35

方法 3:使用 Numpy Average()函数

numpy包包括一个average()函数(已经在上导入),您可以在其中指定一个权重列表来计算加权平均值。这是迄今为止在生产中执行此类计算最简单、最灵活的方法:

Output:
44225.35

[## Python 编码面试前要解决的 10 个算法

在这篇文章中,我介绍并分享了 FAANG 中经常出现的一些基本算法的解决方案

towardsdatascience.com](/10-algorithms-to-solve-before-your-python-coding-interview-feb74fb9bc27)

结论

在这个简短的教程中,我们了解了每次以汇总或分组的方式呈现数据时,加权平均值应该是首选选项,其中可以确定一些数量或频率。我们还发现了至少 3 种使用 Python 计算加权平均值的方法,要么使用自定义函数,要么使用内置函数。我很想知道你是否使用其他算法或软件包来计算加权平均值,所以请留下你的评论!

给我的读者一个提示

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

你可能也喜欢

[## 下一次编码面试前要掌握的 7 个基本 SQL 概念

通过从真实面试中解决问题来练习,最终得到你应得的工作。

towardsdatascience.com](/7-fundamental-sql-concepts-you-will-be-challenged-with-in-faang-interviews-d26097a8d867) [## 使用环境变量隐藏您的密码

关于如何在使用 Python 连接到数据库时使用环境变量隐藏密钥的教程

towardsdatascience.com](/connect-to-databases-using-python-and-hide-secret-keys-with-env-variables-a-brief-tutorial-4f68e33a6dc6) [## 在你开始第一个项目之前,要掌握 15 个 Git 命令

您需要掌握的最后一个 Git 教程是命令行版本控制。

towardsdatascience.com](/15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9)

使用 Keras 和 TensorFlow 2.0 创建机器学习模型的 3 种方法(顺序、函数和模型子类化)

原文:https://towardsdatascience.com/3-ways-to-create-a-machine-learning-model-with-keras-and-tensorflow-2-0-de09323af4d3?source=collection_archive---------13-----------------------

为初学者构建机器学习模型的分步教程

使用 Keras 和 TensorFlow 2.0 创建机器学习模型的 3 种方法

在我之前的文章 Google 机器学习实践的 7 个步骤:结构化数据的 TensorFlow 示例中,我提到了用 Keras 和 TensorFlow 2.0 实现机器学习模型的 3 种不同方法

  • 顺序模型是在 TensorFlow 2.0 中启动和运行 Keras 的最简单方法
  • 功能 API 用于更复杂的模型,尤其是具有多个输入或输出的模型。
  • 模型子类化是完全可定制的,使我们能够实现我们自己定制的模型前向传递

在本文中,我们将学习如何用三种不同的方法建立一个机器学习模型,以及如何为我们的项目选择正确的方法。

环境设置、源代码和数据集准备

为了运行本教程,您需要安装

TensorFlow 2,numpy,pandas,sklean,matplotlib

它们都可以直接安装在 vis PyPI 上,我强烈建议创建一个新的虚拟环境。最佳实践是避免使用 base(root) ,因为这可能会破坏您的系统。

有关创建 Python 虚拟环境的教程,您可以在这里查看:

[## 使用“virtualenv”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你是机器学习工程师,正在使用 Python 和 Jupyter Notebook 吗?在这篇文章中,你会看到为什么…

towardsdatascience.com](/create-virtual-environment-using-virtualenv-and-add-it-to-jupyter-notebook-6e1bf4e03415) [## 使用“conda”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你正在使用 anaconda 和使用 Jupyter Notebook 和 Python 吗?在这篇文章中,你将看到如何创建虚拟的…

medium.com](https://medium.com/analytics-vidhya/create-virtual-environment-using-conda-and-add-it-to-jupyter-notebook-d319a81dfd1)

源代码

这是一个循序渐进的教程,所有的说明都在这篇文章中。我已经把笔记本开源了,请查看最后的 Github 链接。

数据集准备

本教程使用安德森鸢尾花(iris) 数据集进行演示。该数据集包含五个属性下的一组 150 条记录:萼片长度萼片宽度花瓣长度花瓣宽度、(从 sklearn 数据集称为目标)。

首先,让我们导入库并从 scikit-learn 库中获取虹膜数据集。你也可以从 UCI 虹膜数据集下载。

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split**iris = load_iris()**

为了研究数据,让我们将数据加载到一个数据帧中

# Load data into a DataFrame
**df = pd.DataFrame(iris.data, columns=iris.feature_names)** # Convert datatype to float
**df = df.astype(float)** # append "target" and name it "label"
**df['label'] = iris.target** # Use string label instead
**df['label'] = df.label.replace(dict(enumerate(iris.target_names)))**

并且df应该如下所示:

运行df.head()预览虹膜数据

我们注意到 标签 列是一个分类特征,需要将其转换成一个热编码。否则,我们的机器学习算法将无法直接将其作为输入。

# label -> one-hot encoding
**label = pd.get_dummies(df['label'])
label.columns = ['label_' + str(x) for x in label.columns]**
**df = pd.concat([df, label], axis=1)**# drop old label
df.drop(['label'], axis=1, inplace=True)

现在,df应该是这样的:

接下来,让我们创建Xy。Keras 和 TensorFlow 2.0 只接受 Numpy 数组作为输入,所以我们必须将 DataFrame 转换回 Numpy 数组。

# Creating X and y**X = df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]**
# Convert DataFrame into np array
**X = np.asarray(X)****y = df[['label_setosa', 'label_versicolor', 'label_virginica']]** # Convert DataFrame into np array
**y = np.asarray(y)**

最后,让我们使用来自 sklearn 库的**train_test_split()** 将数据集拆分成训练集(75%)和测试集(25%)。

X_train, X_test, y_train, y_test **= train_test_split(X,Y,test_size=0.25
)**

太好了!我们的数据已经准备好建立一个机器学习模型。

1.顺序模型

顺序模型是层的线性堆叠。创建顺序模型有两种方法

  • 将层列表传递给构造函数
  • 只需通过.add()方法添加图层:

让我们继续建立一个具有 3 个密集层的神经网络。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# Passing a list of layers to the constructor
model = Sequential(**[Dense(5, activation='relu', input_shape=(4,)),Dense(10, activation='relu'),Dense(3, activation='softmax'),
]**)model.summary()

通过.add()方法,以上与以下相同

# Adding layer via add() method
model = Sequential()
model.**add(Dense(5, activation='relu', input_shape=(4,)))**
model.**add(Dense(10, activation='relu'))**
model.**add(Dense(3, activation='softmax'))**model.summary()

顺序模型需要知道它应该期望什么样的输入形状。因此,顺序模型中的第一层需要接收关于其输入形状的信息,这通常通过指定input_shape参数来完成。

1.1 训练一个序列模型

为了训练一个序列模型,我们首先必须使用model.compile()配置我们的模型,参数如下:

  • 使用优化器 RMSProps ( rmsprop)
  • 对于我们的 多类分类 问题,使用分类交叉熵损失函数(categorical_crossentropy
  • 为简单起见,使用accuracy作为我们在训练和测试期间评估模型的评估指标。
model.compile(**optimizer='rmsprop',****loss='categorical_crossentropy',****metrics=['accuracy']**
)

之后,我们可以调用model.fit()来训练我们的模型

history = **model.fit**(X_train, y_train,batch_size= 64,epochs= 30,validation_split=0.2)

如果一切顺利,我们应该得到如下输出

Train on 89 samples, validate on 23 samples
Epoch 1/30
89/89 [==============================] - 1s 13ms/sample - loss: 1.4717 - accuracy: 0.3258 - val_loss: 1.1884 - val_accuracy: 0.3478
Epoch 2/30
89/89 [==============================] - 0s 465us/sample - loss: 1.4152 - accuracy: 0.3258 - val_loss: 1.1683 - val_accuracy: 0.3478
Epoch 3/30
89/89 [==============================] - 0s 463us/sample - loss: 1.3836 - accuracy: 0.3258 - val_loss: 1.1503 - val_accuracy: 0.3478
......
......
Epoch 30/30
89/89 [==============================] - 0s 488us/sample - loss: 1.0734 - accuracy: 0.3258 - val_loss: 1.0290 - val_accuracy: 0.3478

1.2 模型评估

一旦训练完成,就该看看模型是否适合模型评估了。模型评估通常包括

  1. 绘制损失准确度指标的进度
  2. 用从未用于训练的数据来测试我们的模型。这就是我们之前搁置的测试数据集X_test发挥作用的地方。

让我们创建一个函数plot_metric()来绘制指标。

%matplotlib inline
%config InlineBackend.figure_format = 'svg'
def plot_metric(history, metric):train_metrics = history.history[metric]val_metrics = history.history['val_'+metric]epochs = range(1, len(train_metrics) + 1)plt.plot(epochs, train_metrics, 'bo--')plt.plot(epochs, val_metrics, 'ro-')plt.title('Training and validation '+ metric)plt.xlabel("Epochs")plt.ylabel(metric)plt.legend(["train_"+metric, 'val_'+metric])plt.show()

通过运行plot_metric(history, 'loss')来绘制损失进度。

通过运行plot_metric(history, 'accuracy')绘制精度进度。

根据测试数据集测试我们的模型

model.**evaluate**(x = **X_test**,y = **y_test**)

我们应该得到一个具有损耗和精度的输出,如下所示:

38/1 [===] - 0s 139us/sample - **loss: 0.9356** - **accuracy: 0.7105**[0.9538187102267617, 0.7105263]

1.3 何时使用顺序模型

顺序模型适用于简单的层堆叠,其中每层都有一个输入和一个输出

一个顺序模型是不合适当[1]:

  • 您的模型有多个输入或多个输出
  • 您的任何图层都有多个输入或多个输出
  • 您需要进行图层共享
  • 您需要非线性拓扑(例如,剩余连接、多分支模型)

2.功能 API

Keras functional API 提供了一种更加灵活的定义模型的方式。特别是,它允许我们定义多个输入或输出模型以及共享层的模型。

让我们使用函数式 API 创建相同的神经网络

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense# This returns a tensor
**inputs = Input(shape=(4,))**# A layer instance is callable on a tensor, and returns a tensor
**x = Dense(5, activation='relu')(inputs)
x = Dense(10, activation='relu')(x)
outputs = Dense(3, activation='softmax')(x)**# This creates a model that includes
# the Input layer and three Dense layers
**model = Model(inputs=inputs, outputs=outputs)**model.summary()

在函数式 API 中:

  • 每一层实例都是 上一个可调用的张量 ,而 则返回一个张量
  • Input()用于定义以输入形状为自变量的输入层**shape=(4,)**
  • Model()中我们只需要引用inputsoutputs张量

2.1 训练一个功能 API 模型

功能 API 模型可以像顺序模型一样被训练。

# First configure model using model.compile()
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy']
)# Then, train the model with fit()
history = model.fit(X_train, y_train,batch_size= 64,epochs= 30,validation_split=0.2)

如果一切顺利,我们应该得到如下输出

Train on 89 samples, validate on 23 samples
Epoch 1/30
89/89 [==============================] - 1s 10ms/sample - loss: 1.5887 - accuracy: 0.3596 - val_loss: 2.0215 - val_accuracy: 0.1739
Epoch 2/30
89/89 [==============================] - 0s 475us/sample - loss: 1.4872 - accuracy: 0.3596 - val_loss: 1.9218 - val_accuracy: 0.1739
Epoch 3/30
89/89 [==============================] - 0s 470us/sample - loss: 1.4204 - accuracy: 0.3596 - val_loss: 1.8256 - val_accuracy: 0.1739
Epoch 4/30
89/89 [==============================] - 0s 486us/sample - loss: 1.3627 - accuracy: 0.3596 - val_loss: 1.7535 - val_accuracy: 0.1739
......
......
Epoch 30/30
89/89 [==============================] - 0s 477us/sample - loss: 0.8373 - accuracy: 0.4719 - val_loss: 0.9029 - val_accuracy: 0.3043

2.2 模型评估

这个模型可以像我们在序列模型中所做的那样进行评估

通过运行plot_metric(history, 'loss')绘制损失进度。

通过运行plot_metric(history, 'accuracy')绘制精度进度。

根据测试数据集测试我们的模型

model.**evaluate**(x = **X_test**,y = **y_test**)

我们应该得到一个具有损耗和精度的输出,如下所示:

38/1 [===] - 0s 139us/sample - **loss: 0.7776** - **accuracy: 0.6053**[0.8011450893000552, 0.6052632]

2.3 多输入多输出模型

具有多输入或多输出的模型是函数式 API 的良好用例。这里,我展示了 3 种不同的场景:

  • 具有 2 个输入和 1 个输出的模型
  • 具有 1 个输入和 2 个输出的模型
  • 具有两个输入和两个输出的模型

**对于有 2 个输入和 1 个输出的模型。**假设我们有用于鸢尾花分类的图像数据和结构化数据。我们想建立一个机器学习模型,如下所示:

2 输入 1 输出神经网络

函数式 API 使得构建它变得很容易

from tensorflow.keras.layers import concatenate# 2 inputs, one structure data, the other image data
**input_structure = Input(shape=(4,), name='input_structure')
input_image = Input(shape=(256,), name='input_image')**# middle layers
x_1 = Dense(10, activation='relu')(input_structure)
x_2 = Dense(100, activation='relu')(input_image)**c = concatenate([x_1, x_2])**outputs = Dense(3, activation='sigmoid', name='outputs')(c)model = Model(**inputs=[input_structure, input_image], outputs=outputs**)model.summary()

为了获得 2 个不同的输入,我们需要使用**concatenate([x_1, x_2])**将它们连接起来。要定义一个有多个输入的模型,我们只需要指定一个输入列表**inputs=[input_structure, input_image]**

如果全部运行成功,我们应该得到如下摘要:

**对于有 1 个输入和 2 个输出的模型。**假设我们只有图像数据,任务是识别给定图像是否是花,如果是,是什么类型的鸢尾花?

并用功能 API 来构建它

from tensorflow.keras.layers import concatenate# only one input
**input_image = Input(shape=(256,), name='input_image')**# middle layer
x = Dense(300, activation='relu')(input_image)# output layser
output_1 = Dense(1, activation='sigmoid', name='output_1')(x)
output_2 = Dense(3, activation='softmax', name='output_2')(x)model = Model(inputs=input_image, **outputs=[output_1, output_2]**)model.summary()

为了定义一个有多个输出的模型,我们只需要指定一个输出列表**outputs=[output_1, output_2]**

如果一切顺利,我们应该会得到如下摘要。

**对于有 2 个输入和 2 个输出的模型。**假设我们有结构化数据和图像数据。任务是识别图像中是否有鸢尾花,以及它是什么类型的鸢尾花。

2 个输入和 2 个输出

有了函数式 API,构建它相当容易

from tensorflow.keras.layers import concatenate# 2 inputs, one structured data, the other image data
**input_structured = Input(shape=(4,), name='input_structured')
input_image = Input(shape=(256,), name='input_image')**# middle layers
x_1 = Dense(10, activation='relu')(input_structure)
x_2 = Dense(300, activation='relu')(input_image)**c = concatenate([x_1, x_2])**# output layser
**output_1 = Dense(1, activation='sigmoid', name='output_1')(c)
output_2 = Dense(3, activation='softmax', name='output_2')(c)**model = Model(**inputs=[input_structured, input_image], outputs=[output_1, output_2]**)model.summary()

要定义一个有多个输入和多个输出的模型,我们只需要使用**concatenate([x_1, x_2])**连接输入,并指定输入和输出列表来建模Model(**inputs=[input_structured, input_image], outputs=[output_1, output_2]**)

如果一切顺利,我们应该会得到如下摘要。

2.4 功能 API 中的共享层

函数式 API 的另一个好用途是使用共享层的模型。让我们来看看共享图层。

inputs = Input(shape=(4,))# a layer instance is callable on a tensor, and returns a tensor
**shared_layer = Dense(4, activation='relu')**# Now we apply the layer three times
x = **shared_layer**(inputs)
x = **shared_layer**(x)
x = **shared_layer**(x)
x = **shared_layer**(x)predictions = Dense(3, activation='softmax')(x)model = Model(inputs=inputs, outputs=predictions)model.summary()

一个层实例在张量上是可调用的,并返回一个张量,这就是我们如何创建一个共享层。

3.模型子类化

最后一种用 Keras 和 TensorFlow 2.0 实现机器学习模型的方法叫做模型子类化。这种构建模型的方式为您提供了对模型的构造和操作的低级控制。

让我们看看如何使用它来建立我们的虹膜流量分类器。

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Denseclass **CustomModel(Model)**:def __init__(self, **kwargs):super(CustomModel, self).__init__(**kwargs)**self.dense1 = Dense(5, activation='relu', )self.dense2 = Dense(10, activation='relu')self.dense3 = Dense(3, activation='softmax')**def call(self, **inputs**):**x = self.dense1(inputs)x = self.dense2(x)return self.dense3(x)**my_custom_model = CustomModel(name='my_custom_model')

这个模型类CustomModel与我们使用顺序模型和函数式 API 制作的模型相同。事实上,顺序模型和函数 API 都继承自Model类。

如您所见,CustomModel继承自模型类。当模型子类化时要记住的基本结构是,我们在初始化器__init__()中创建层,并在call()方法中定义向前传递。

3.1 训练模型子类化模型

可以像顺序模型和函数 API 一样训练模型子类模型。

my_custom_model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])history = my_custom_model.fit(X_train, y_train,batch_size= 64,epochs= 30,validation_split=0.2)

如果一切运行顺利,您应该得到如下输出:

Train on 89 samples, validate on 23 samples
Epoch 1/30
89/89 [==============================] - 1s 13ms/sample - loss: 1.5281 - accuracy: 0.3596 - val_loss: 1.6140 - val_accuracy: 0.1739
Epoch 2/30
89/89 [==============================] - 0s 571us/sample - loss: 1.3818 - accuracy: 0.3596 - val_loss: 1.4869 - val_accuracy: 0.1739
Epoch 3/30
89/89 [==============================] - 0s 711us/sample - loss: 1.3231 - accuracy: 0.3596 - val_loss: 1.4209 - val_accuracy: 0.1739
Epoch 4/30
89/89 [==============================] - 0s 598us/sample - loss: 1.2934 - accuracy: 0.3596 - val_loss: 1.3799 - val_accuracy: 0.1739
......
......
Epoch 30/30
89/89 [==============================] - 0s 555us/sample - loss: 1.1350 - accuracy: 0.4831 - val_loss: 1.1362 - val_accuracy: 0.6087

我们也可以调用my_custom_model.summary()来显示它的内容:

模型子类化摘要的输出

3.2 模型评估

这个模型可以像我们在顺序模型和函数式 API 中那样进行评估。

通过运行plot_metric(history, 'loss')来绘制损失进度。

通过运行plot_metric(history, 'accuracy')绘制精度进度。

根据测试数据集测试我们的模型

my_custom_model.**evaluate**(x = **X_test**,y = **y_test**)

我们应该得到一个具有损耗和精度的输出,如下所示:

38/1 [===] - 0s 139us/sample - **loss: 1.1417** - **accuracy: 0.4737**[1.1410379598015232, 0.47368422]

3.3 什么时候使用模型子类化?

模型子类化为我们提供了对模型的构造和操作的低级控制。然而,它的灵活性给 bug 带来了更多的机会,而且比顺序模型和函数式 API 更难利用。模型子类化主要由研究人员用来实现奇异的架构或定制的层/模型,这是使用顺序模型和功能 API 不可能实现的。

因此,尽管模型子类化使我们能够做任何事情,我还是建议只在你真正需要的时候才使用这种方法。

就这样,接下来呢?

本文是快速介绍,主要是给大家展示用 Keras 和 TensorFlow 2 实现一个机器学习模型的三种不同方式。我已经尽量避免了很多机器学习的概念和配置,让这个教程对于初学者来说尽可能的简单。

请在我的 Github 上查看笔记本的源代码。

在实际项目中,使用 Keras 和 TensorFlow 2 构建模型时,需要考虑更多的配置。例如,优化器、损失函数、评估指标、批量、验证分割等。另外,本教程只使用了Dense()层,还没有提到任何关于深度学习的内容。

下一步是什么?既然有几个人问我超参数调优的问题,那我们下次就用网格搜索,随机搜索,超带算法做个教程吧。

如果你对机器学习的实用方面感兴趣,请继续关注。

参考

  • [1] Keras 官方文档:何时使用顺序模型
  • [2] Keras 官方文档:功能 API

使用 Python 从日期中提取要素的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-extract-features-from-dates-927bd89cd5b9?source=collection_archive---------25-----------------------

在一行代码中从时间序列数据集中获取更多要素

由马迪·巴佐科在 Unsplash 拍摄的照片

动机

处理时间序列时,数据集的值可能会受到节假日、一周中的哪一天以及一个月中有多少天的影响。有没有一种方法可以用一行代码从日期特性中提取这些特性?

是啊!在本文中,我将向您展示如何使用两个不同的 Python 库从 date 列中提取上述三个特性。

导入和处理数据

我们将使用每日女性出生数据集。这个数据集描述了 1959 年加州每天女性出生的数量。

使用以下方式下载数据:

!wget [https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.csv](https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.csv)

Datapane 随机分配时间,因此您可以忽略表中的时间。现在我们将数据可视化

df.set_index('Date').plot()

提取工作日

一周中不同的日子可能会影响出生的数量。因此,我们将添加工作日作为我们数据的一个特征

提取假期

节假日也会影响生育数量。父母可能会避免在新年或圣诞节等节日带孩子。在这篇博客中,圣诞节被认为是出生婴儿最少的一天。

基于日期提取假日的最简单方法是使用名为 holidays 的 Python 库。安装假日使用

pip install holidays

假日图书馆提供许多国家的假日。我们还可以指定要从国家的哪个州或省提取假期。

由于我们的数据描述了加州每天女性分娩的数量,因此我们将找到加州的假期。在得到一个假期字典后,我们简单地使用holiday_dict.get(date)来得到那个日期的假期。

Timestamp('1959-01-01 00:00:00')"New Year's Day"

我们也可以在所有可用的假期达到顶峰

datetime.date(1959, 1, 1): "New Year's Day",
datetime.date(1959, 2, 22): "Washington's Birthday",
datetime.date(1959, 5, 30): 'Memorial Day',
datetime.date(1959, 7, 4): 'Independence Day',
datetime.date(1959, 7, 3): 'Independence Day (Observed)',
datetime.date(1959, 9, 7): 'Labor Day',
datetime.date(1959, 10, 12): 'Columbus Day',
datetime.date(1959, 11, 11): 'Veterans Day',
datetime.date(1959, 11, 26): 'Thanksgiving',
datetime.date(1959, 12, 25): 'Christmas Day'}

尝试调用字典中没有的日期

None

如果您发现字典中缺少一些日期,您还可以创建自定义假日对象。

让我们使用这个库为数据集创建一个假日要素。

厉害!现在我们有了一个具有假日特征的数据集。为了比较节假日和正常工作日的出生人数,我们将数据按节假日分组,并取同一天所有出生人数的中位数。

可视化我们的数据

元旦出生人数最少。与正常日期的出生人数相比,其他节日的出生人数似乎相当高。

然而,这个数据仅仅是一年内的,所以不足以让我们确定假期对出生人数的实际影响。如果我们有一个 3 年或 4 年的数据集,我们可能会发现在其他节假日出生的人数比正常日期少。

提取一个月中的天数

父母也可能避免在 2 月 29 日生孩子,因为这是每四年一次的日子。

如果我们想比较不同月份之间的出生人数,一个月中的日期数也可能会影响出生人数。因此,在分析我们的时间序列数据集时,将一个月中的日期数量考虑在内可能很重要。

提取特定月份和年份的天数的一个非常快速的方法是使用calendar.monthrange.这是一个内置的 Python 库,所以我们不需要安装这个库来使用它。

monthrange()方法用于获取指定年份和月份中每月第一天的工作日和一个月中的天数。

Weekday of first day of the month: 5
Number of days in month: 29

自从我们知道 2020 年 2 月有 29 天以来,这个库似乎工作得很好。我们将使用它为我们的数据集创建一个days_in_a_month

厉害!现在我们可以比较每月平均出生人数和每月天数

9 月份平均出生人数有一个高峰。可能是因为 9 月份的天数比其他月份多?你可能已经知道答案了,但是让我们用一个月中的天数柱状图来确认一下

不完全是。九月只有 30 天。一月、三月、五月等月份的天数更多。

即使我们在这里看不到直接的相关性,但一个月中的天数和其他特征的组合可以给我们一些与出生人数的相关性。

结论

恭喜你!您已经学习了如何使用日期为时间序列数据集创建更多要素。我希望这些想法能帮助你想出创造性的方法来处理时间序列数据集。

本文的源代码可以在这里找到。

[## khuyentran 1401/数据科学

github.com](https://github.com/khuyentran1401/Data-science/blob/master/time_series/extract_features/extract_features_from_dates.ipynb)

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和推特上和我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 自动读取、创建和运行多个文件的 3 个 Python 技巧

用 Python 和 Bash For Loop 自动化枯燥的东西

towardsdatascience.com](/3-python-tricks-to-read-create-and-run-multiple-files-automatically-5221ebaad2ba) [## 可视化的 6 大 Python 库:使用哪一个?

对使用哪种可视化工具感到困惑?我为你分析了每个图书馆的利弊

towardsdatascience.com](/top-6-python-libraries-for-visualization-which-one-to-use-fe43381cd658) [## 我收集了超过 1k 的顶级机器学习 Github 配置文件,这就是我的发现

从 Github 上的顶级机器学习档案中获得见解

towardsdatascience.com](/i-scraped-more-than-1k-top-machine-learning-github-profiles-and-this-is-what-i-found-1ab4fb0c0474) [## 使用 TextBlob 增强您的 Python 字符串

在一行代码中获得更多关于文本的见解!

towardsdatascience.com](/supercharge-your-python-string-with-textblob-2d9c08a8da05)

在你第一份工作之前获得现实生活数据科学经验的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-get-real-life-data-science-experience-before-your-first-job-545db436ef12?source=collection_archive---------2-----------------------

如何通过实际项目发展您的数据科学技能

由故事创建的信息图向量—www.freepik.com

介绍

获得我的第一份数据科学工作很难。

当公司通常要求硕士学位和至少 2-3 年的经验时,进入数据科学领域尤其困难。也就是说,我发现了一些很棒的资源,想和大家分享一下。

在本文中,我将向您介绍三种可以让您自己获得实际数据科学经验的方法。通过完成这些项目,你将对 SQL熊猫机器学习建模有一个深刻的理解。

  1. 首先,我将为您提供真实的 SQL 案例研究,在这些案例中,您遇到了一个业务问题,需要查询数据库来诊断问题并制定解决方案。
  2. 其次,我将为你提供几十个熊猫练习题,熊猫是 Python 中的一个库,用于数据操作和分析。这将有助于您发展数据争论和数据清理所需的技能。
  3. 最后,我将为您提供各种机器学习问题,您可以开发一个机器学习模型来进行预测。通过这样做,您将学习如何处理机器学习问题,以及从头到尾开发机器学习模型所需的基本步骤。

说了这么多,让我们开始吧!

1.SQL 案例研究

如果你想成为一名数据科学家,你必须有很强的 SQL 技能。Mode 提供了三个模拟真实业务问题的实用 SQL 案例研究,以及一个在线 SQL 编辑器,您可以在其中编写和运行查询。

要打开 Mode 的 SQL 编辑器,请转到 此链接 并单击显示“打开另一个 Mode 窗口”的超链接。

学习 SQL

如果您是 SQL 新手,我会首先从 Mode 的 SQL 教程开始,在那里您可以学习基本、中级和高级 SQL 技术。如果您已经对 SQL 有了很好的理解,可以跳过这一步。

案例研究 1:调查用户参与度的下降

链接到案例

本案例的目的是确定 Yammer 项目用户参与度下降的原因。在深入研究这些数据之前,您应该先阅读一下 Yammer 的概述这里是。您应该使用 4 张表。

到案例的链接将为您提供关于问题、数据和应该回答的问题的更多细节。

如果你需要指导,请点击这里的查看我是如何完成这个案例研究的。

案例研究 2:了解搜索功能

链接到案例

这个案例更侧重于产品分析。在这里,您需要深入研究数据,确定用户体验是好是坏。这个案例的有趣之处在于,由你来决定什么是“好”和“坏”以及如何评估用户体验。

案例研究 3:验证 A/B 测试结果

链接到案例

最实际的数据科学应用之一是执行 A/B 测试。在本案例研究中,您将深入研究 A/B 测试的结果,其中对照组和治疗组之间存在 50%的差异。在这种情况下,您的任务是在彻底分析后验证或否定结果。

2.熊猫练习题

当我第一次开始开发机器学习模型时,我发现我缺乏熊猫技能是我所能做的一个很大的限制。不幸的是,互联网上没有多少资源可以让你练习熊猫技能,不像 Python 和 SQL…

然而,几周前,我偶然发现了这个资源——这是一个专门为熊猫准备的练习题资源库。通过完成这些练习题,您将知道如何:

  • 过滤和排序您的数据
  • 分组和聚合数据
  • 使用。apply()操作数据
  • 合并数据集
  • 还有更多。

如果你能完成这些练习题,你应该可以自信地说,你知道如何使用熊猫进行数据科学项目。这也将对你下一节有很大的帮助。

3.机器学习建模

获得数据科学经验的最佳方式之一是创建自己的机器学习模型。这意味着找到一个公共数据集,定义一个问题,用机器学习解决问题。

Kaggle 是世界上最大的数据科学社区之一,有数百个数据集可供选择。以下是一些你可以用来开始的想法。

预测葡萄酒质量

数据集此处

特里·维利迪斯在 Unsplash 上拍摄的照片

该数据集包含各种葡萄酒、其成分和葡萄酒质量的数据。这可能是一个回归或分类问题,取决于你如何设计它。看看你能否预测给定 11 个输入(固定酸度、挥发性酸度、柠檬酸、残糖、氯化物、游离二氧化硫、总二氧化硫、密度、pH、硫酸盐和酒精)的红酒质量。

如果你想要一些为这个数据集创建机器学习模型的指导,请查看我的方法 这里

二手车价格评估员

数据集 此处

帕克·吉布斯在 Unsplash 上拍摄的照片

Craigslist 是世界上最大的二手车销售网站。这个数据集由 Craigslist 搜集的数据组成,每隔几个月更新一次。使用这个数据集,看看是否可以创建一个数据集来预测一个汽车列表是过高还是过低。

感谢阅读!

我希望这些资源和想法对您的数据科学之旅有所帮助。:)

特伦斯·申

如果你喜欢这样,你应该每周查看一下 我的免费数据科学资源 有新素材!

创始人ShinTwin|我们连线上LinkedIn|项目组合这里是。******

第一份工作前获得 SQL 实战经验的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-get-real-life-sql-experience-before-your-first-job-508c7346f9ca?source=collection_archive---------9-----------------------

如何在实际项目中发展您的 SQL 技能

由 fullvector 创建的技术向量—www.freepik.com

介绍

“如果我没有任何 SQL 经验,如何获得数据分析师/数据科学工作?”

当我开始我的数据科学之旅时,我注意到能够获得实际的 SQL 经验是多么重要,如果你仍在努力获得第一份工作,或者如果你正在进行重大的职业转换,这可能会非常困难。

本文旨在解决这一问题。

下面是三种获得真实 SQL 体验的有效方法。您不仅可以解决实际问题,还可以在 GitHub 上展示这些问题,并将其添加到简历的项目部分!

本文将重点讨论三种类型的问题:

  1. 从原始数据创建数据管道
  2. SQL 编码(面试)问题
  3. SQL 案例研究

1.从原始数据创建数据管道

询问任何数据科学家、数据分析师或数据工程师,他们都会告诉你将原始数据转化为干净、可用和可靠的数据是多么重要。创建可靠的数据管道的能力将使你在数据职业生涯中走得更远,所以为什么不现在就开始呢?

作者创建的图像

如果你不确定我的意思,看看上面的图片。在许多情况下,您将直接从其来源获得原始数据,并负责将其转换为与您的同事和利益相关者相关的表格。

下面是几个例子,如果你想出点子需要帮助,你可以自己尝试一下。这些例子使用来自 Kaggle 的数据集,所以我将创建一个新的笔记本,并使用 SQLite 直接在其中编写查询。

案例 1:苹果公司的乔布斯

假设这个数据集在这里是一个存储苹果所有工作列表的活动表,但是你的经理只需要一个显示所有提到的不同技能的表,以及每个提到的技能按州细分的计数。

看看是否可以使用 SQL 操作数据来创建所需的表。

案例 2: Kickstarter 项目

这个数据集在这里包含了许多 Kickstarter 项目及其细节。

看看您是否可以使用 SQL 操作该表,以便显示每个类别的项目数量、每个类别的平均目标金额、每个类别的平均承诺金额、每个类别达到目标的项目百分比,以及每个类别从启动到截止日期的平均时间。

2.SQL 编码问题

Leetcode 和 Hackerrank 是很棒的资源,它们帮助我学会了我从来不认为可能的技能和技巧。这是我在找工作时充分利用的东西,也是我会经常回去查阅的资源。

这类网站最大的好处是它们通常有推荐的解决方案和讨论板,所以你可以了解更有效的解决方案和技术。

不确定从哪里开始?以下是一些你可以尝试的好问题:

  1. 查找重复邮件
  2. 排名分数
  3. 员工收入高于经理
  4. 温度上升
  5. 行程和用户

3.SQL 案例研究

作为数据分析师/数据科学家,案例研究是模拟现实生活问题的最佳方式。Mode 提供了三个模拟真实业务问题的实用 SQL 案例研究,以及一个在线 SQL 编辑器,您可以在其中编写和运行查询。Mode 提供了 3 个案例研究,我将在下面介绍:

要打开 Mode 的 SQL 编辑器,请转到 此链接 并点击显示“打开另一个模式窗口”的超链接。

案例研究 1:调查用户参与度的下降

链接到案例

本案例的目的是确定 Yammer 项目用户参与度下降的原因。在深入研究这些数据之前,您应该先阅读一下 Yammer 的概述这里的。您应该使用 4 张表。

到案例的链接将为您提供关于问题、数据和应该回答的问题的更多细节。

如果您需要指导,请点击此处查看我是如何完成这个案例研究的。

案例研究 2:了解搜索功能

链接到案例

这个案例更侧重于产品分析。在这里,您需要深入研究数据,确定用户体验是好是坏。这个案例的有趣之处在于,由你来决定什么是“好”和“坏”以及如何评估用户体验。

案例研究 3:验证 A/B 测试结果

链接到

最实际的数据科学应用之一是执行 A/B 测试。在本案例研究中,您将深入研究 A/B 测试的结果,其中对照组和治疗组之间存在 50%的差异。在这种情况下,您的任务是在彻底分析后验证或否定结果。

感谢阅读!

我相信完成这些项目会给你知识和信心,让你在实践中获得成功。一如既往,我祝你在努力中好运!:)

不确定接下来要读什么?我为你挑选了另一篇文章:

[## 数据科学面试中你应该知道的十个 SQL 概念

学习聪明,不努力。

towardsdatascience.com](/ten-sql-concepts-you-should-know-for-data-science-interviews-7acf3e428185)

特伦斯·申

  • 如果你喜欢这个, 在 Medium 上关注我 了解更多
  • 关注我关于Kaggle了解更多内容!
  • 我们连线上LinkedIn
  • 有兴趣合作吗?查看我的 [网站](http://Want to collaborate?)
  • 查看 我的免费数据科学资源 每周都有新素材!

在 Python 中处理参数的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-handle-args-in-python-47216827831a?source=collection_archive---------3-----------------------

直奔主题的指南

照片由 Maja Petric 在 Unsplash 上拍摄

#1 系统模块

Python 中的sys模块具有argv功能。当通过终端触发执行时,该功能返回提供给main.py的所有命令行参数的列表。除了其他参数,返回列表中的第一个元素是main.py的路径。

考虑下面这个main.py的例子

import syslist_of_arguments = sys.argvprint(list_of_args[0]) 
print(list_of_args[1]) 
print(list_of_args[2]) 
print(list_of_args[3])

触发main.py为:

python main.py first_arg "[second_arg]" "{\"arg\": 3}"

会返回:

test.py
first_arg
[second_arg]
{"arg": 3}

#2 带有一个大参数的 sys 模块

这是为 Python 代码提供参数的一种简单而强大的方法。您提供了一个单一的“大”参数,而不是提供许多按空格分开的参数。这个大参数是一个字符串字典,其中 dict-keys 表示参数名,dict-values 表示它们对应的值。

因为这个字典参数在 Python 中被表示为一个字符串,所以您应该将其转换为字典。这可以通过使用ast.literal_evaljson.loads功能来完成。需要相应地导入astjson模块。

考虑下面这个main.py的例子:

import sys
import astraw_arguments = sys.argv[1]print(raw_arguments)
arguments = ast.literal_eval(raw_arguments)print(arguments['name']) # John
print(arguments['surname']) # Doe
print(arguments['age']) # 22

触发main.py为:

python main.py "{\"name\": \"John\", \"surname\": \"Doe\", \"age\": 22}"

会返回:

{"name": "John", "surname": "Doe", "age": 22}
John
Doe
22

# 3 arg parse 模块

如果您想为您的应用程序提供一个合适的命令行界面,那么argparse就是您需要的模块。这是一个完整的模块,它提供了开箱即用的参数解析、帮助消息以及在参数被误用时自动抛出错误。这个模块预装在 Python 中。

为了充分利用 **argparse 提供的功能,**需要一些时间来掌握。作为开始,考虑以下main.py的例子:

import argparseparser = argparse.ArgumentParser(description='Personal information')parser.add_argument('--name', dest='name', type=str, help='Name of the candidate')parser.add_argument('--surname', dest='surname', type=str, help='Surname of the candidate')parser.add_argument('--age', dest='age', type=int, help='Age of the candidate')args = parser.parse_args()print(args.name)
print(args.surname)
print(args.age)

在初始化一个ArgumentParses的对象后,我们使用add_argument函数添加所有期望的参数。该函数接收多个参数,其中包括参数名称(例如--name)目标变量预期数据类型、、要显示的帮助消息等。

触发main.py为:

python main.py --name John --surname Doe --age 22

会回来

John
Doe
22

要找到关于这个模块的更多信息,请看一下 argparse 文档。

结论

很多时候,您需要向 Python 脚本传递参数。Python 通过sys模块提供对这些参数的访问。您可以直接访问argv功能并处理您自己的参数解析,或者您可以使用其他模块作为argparse来为您完成这项工作。

在我的日常编码生活中,我使用小脚本中的 sys 和arg parse 时,我是它们的唯一用户/维护者。

编码快乐!

[## 数据工程中听到的 150 多个概念

面向数据工程师的综合词汇表

towardsdatascience.com](/150-concepts-heard-in-data-engineering-a2e3a99212ed) [## 如何用 Python 生成 MS Word 表格

30 秒内自动生成报告

towardsdatascience.com](/how-to-generate-ms-word-tables-with-python-6ca584df350e) [## 新手通常误用 Python 的 5 种场景

更好地利用 Python

towardsdatascience.com](/5-scenarios-where-beginners-usually-misuse-python-98bac34e6978)

作为数据科学家赚取额外收入的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-make-extra-income-as-a-data-scientist-eed02749208c?source=collection_archive---------4-----------------------

建立收入来源来补充或取代你朝九晚五的工作。

毫无疑问,数据科学是一个利润丰厚的职业。来自 Glassdoor 的最新报告称,美国数据科学家——所有行业、所有公司类型,与工作经验无关——的平均年薪为 11.33 万美元。相比之下,2020 年第一季度美国的薪酬中值为4.97 万美元。

照片由莎伦·麦卡琴在 Unsplash 拍摄

这只是美国的情况,实际数字因国家而异,但让我们假设比率大致相同——平均而言,数据科学家的平均收入大约是世界任何地方普通居民的两倍。

但是,做同样的工作,怎么可能从 11.3 万美元涨到 20 万美元呢?
这就是副业收入的威力发挥的地方。作为一名数据科学家,你有潜力赚很多钱。

原因有很多。让我们通过谷歌趋势来探索数据科学机器学习的趋势:

蓝色:数据科学;红色:机器学习

这是 5 年的数据,这两个术语之间似乎有很强的关系(如预期的那样)。此外,我们可以清楚地看到趋势是积极的。我怀疑我们可以期待任何时间很快会有任何剧烈的变化。

另一个显而易见的原因是你技能的价值。我在各种脸书小组中看到许多初学者问一些任何有 6 个月经验的人都能毫不费力回答的问题。向完全的初学者教授基础知识可能是一个可行的方法,但稍后会有更多的介绍。

在今天的文章中,我将与你分享我每天使用的赚取额外收入的三大方法。这三个因素使我在不到一年的时间里收入增加了 2.5 倍。大部分额外收入来自第一条建议,所以让我们直接跳到它。

#1:写博客

拥有一个博客会影响你职业生活的方方面面。我将整篇文章都献给了这个主题,所以可以随意阅读:

[## 拥有一个博客如何推进你作为数据科学家的职业生涯

提示:这也适用于其他职业

towardsdatascience.com](/how-having-a-blog-can-advance-your-career-as-a-data-scientist-245270cc281e)

概括一下,以下是写博客的最大好处:

  • 你可以更深入地学习事物
  • 出色的声誉建立者——带来更多的工作机会
  • 惊人的收入潜力

我建议你通读这篇文章以获得深入的解释,因为它只有 5 分钟的阅读时间。撰写数据科学文章或任何技术主题的文章需要首先对主题有很好的理解。成为一个成功的博客需要你用最简单的词语解释复杂的话题,这将进一步帮助你理解。

我知道你现在的想法——在我开始写作之前,我需要多年的经验——这与事实相去甚远。事实是,你只需要比你的目标读者领先一步。就是这样。我来详细说明一下。

假设你想写关于的主成分分析。要做到这一点,你需要对主题有一个像样的理解,你的目标读者要么是对 PCA 一无所知的人,要么是理解得不够好的人。因此,你只比你的读者领先一步,因为你对 PCA 的了解足以解释它。

另外,写一篇教育性的文章首先是学习某个主题的一个很大的动力。放轻松,不要想太多。没有人会因为你犯了一些错误而怨恨你,即使有人怨恨,那也是他们的问题。

即使你做的每件事都是对的,仍然有很大的可能会有没事可做的人来纠正你的语法,所以要学会忽略它。

#2:教育视频

我发现教育视频是补充你博客的好方法。以文本和视频的形式报道相同的主题会让你的内容更加清晰可见。

不是每个人都想通读一篇难懂的科技文章。此外,有些主题过于直观,无法用文本进行深入解释。我一直记得来自 3Blue1Brown 的线性代数视频。
*你能想象从课本上学习线性代数这样复杂的题目吗?*这很可能是你最初学习的方式,但你的理解有多好呢?

我敢打赌,你已经记住了如何为了考试而计算东西,但完全错过了事物在视觉层面上如何工作的更大图景。这没什么丢人的,因为我们都经历过。我再说一遍,有些事情通过视频可以更好地解释。

好吧,那么你有哪些制作数据科学视频的选择?

嗯,第一个也是最明显的一个是 YouTube 。只要不违反他们的内容政策,你基本上可以上传任何东西,但新手很难赚钱。我来解释一下原因。

要想在 YouTube 上赚钱,你需要至少 1000 名订户,并且在去年至少有 4000 小时的公众观看时间。对于初学者来说,这不是一件容易的事情。我的频道还没有上线,但我希望它会很快上线。你需要投入大量的时间才能看到结果,一般来说,制作视频比你想象的要花更多的时间。

我知道在制作了我的第一个视频后,我感到很累,尽管我已经准备好了代码。

但是我的母语不是英语

我也不是,而且我对说英语给世界听的想法不是最舒服的。谷歌一下斯拉夫口音——你马上就会明白为什么。您可以:

  • 不管怎样,忍着点去做吧
  • 使用文本到语音转换软件

后一种选择让我受益匪浅,因为随着时间的推移,这些工具变得越来越好。 IBM 的 Watson TTS 是一个廉价入门的好方法。

如果你觉得 YouTube 太饱和了,还有其他平台可以考虑。我想到的一个是 Udemy ,但是我对它们没有任何经验,所以我会把它留给你去研究。

#3:联盟营销

时不时地,你会读一本很棒的书或看一堂很棒的课程。如果你认为这是他们可以从中受益的东西,没有理由不与你的观众分享。

你可以用两种方式推荐这本书或一门课程:

  • 通过正常的链接
  • 通过附属链接

唯一的区别是联盟链接会为你的每次购买/订阅赚取一些钱,而正常的不会。如果有人决定购买一本书或一门课程,链接的类型对他们来说并不重要。此外,如果他们喜欢你的内容,他们很有可能会支持你。

我最近的一篇文章是这种想法的一个很好的例子:

[## 数据科学的最佳入门统计学书籍

了解数据科学最重要的支柱

towardsdatascience.com](/the-single-best-introductory-statistics-book-for-data-science-a2601ea7c0be)

所以,简单地说,我读了一本很棒的书。我 100%确定至少我的观众中有人能从中受益,所以我写了一篇简短的评论并放了一个联盟链接。这是双赢的局面。

然而,你应该小心联盟营销。我永远不会推荐我没有亲自读过或看过,也不是 100%满意的东西。这是联盟营销的一大禁忌,因为当你不知道自己在说什么时,读者很容易感觉到。

那么,从哪里开始呢?

亚马逊有一个惊人的联盟计划,我用它来推荐高质量的书籍。
Udemy 有一个很棒的程序,我用它来推荐在线课程。

在你走之前

作为一名数据科学家,你有很大的收入潜力,这不应该仅限于你工作的公司愿意付给你多少钱。随着时间的推移,你的收入会翻倍——这是有保证的。这取决于你努力工作,直到它发生,但它将不可避免地发生。

然后你可以自由选择是否朝九晚五真的值得,因为你的大部分额外收入将是被动的,这意味着你不需要真的为之工作。

只要投入时间并相信这个过程。你会成功的。

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

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

加入我的私人邮件列表,获取更多有用的见解。

思考贝叶斯法则的三种方式

原文:https://towardsdatascience.com/3-ways-to-think-about-bayes-rule-b6f5b4ef87d6?source=collection_archive---------8-----------------------

对“引擎盖下”真正发生的事情发展直觉

贝叶斯法则是数据科学的核心。它也是所有科学的基础和批判性思维的关键工具。不幸的是,它经常被教成只是一个要记忆的公式,花在真正探究正在发生的事情上的时间太少。当第一次有人教我这个的时候,我真的很难接受,这是我希望当时有人告诉我的。

预赛

贝叶斯法则相对简单:

英语中,**“给定 B 的条件概率等于给定 A 的 B 的条件概率乘以 A 的概率再除以 B 的概率”**如果这看起来很拗口,不用担心;视觉上会更有感觉。

证明也很简单:
根据定义, P(X|Y) = P(X ⋂ Y) / P(Y) ,所以 P(X ⋂ Y) = P(X|Y) P(Y)。
p(a⋂b)= p(b⋂a)
p(a | b)p(b)= p(b | a)p(a)
p(a | b)= p(b | a)p(a)/p(b)

到目前为止,这只是一个有证明的公式,一些需要记忆和应用的东西。幸运的是,有一些思考方式让它感觉更自然,并提供一些关于真实发生的事情的见解。

1.重新构建宇宙

第一种是可视化方法,将公式的右侧分解为 3 个步骤,每个步骤都有清晰的图形解释。把宇宙想象成一个实验所有可能结果的集合。例如,掷骰子的宇宙 U 是{1,2,3,4,5,6}。但是如果我告诉你我掷出了一个偶数,而你不知道是哪一个,那就把 U 缩小到{2,4,6}。我们在这里做同样的事情,但是用图形来说明。

首先,我们的基本设置:

我们有两个事件,A 和 B,它们有时会一起发生:A ∩ B .我们的宇宙 U 是一切可能发生的事情,面积代表概率。因为它是我们现在所有其他事情的参考框架,我们用蓝色突出显示它。

第一步:P(B|A)

这是我们的起点——一个条件概率,但不是我们真正想要的。在某种意义上,这给了我们一个新的、更小的宇宙:A(用蓝色突出显示)。我们感兴趣的事件是灰色区域 ab。area(ab)/area(a)回答问题,“如果我们已经知道 a 已经发生了,b 的可能性有多大?”

第二步:p(b | a)****p(a)=p(a⋂b)

这是我们将画面拉回到原始宇宙的方式。感兴趣的事件 A B 保持不变,但是宇宙(我们概率分数的分母,如果你愿意的话)变大了。

第三步:****P(B | A)****P(A)/P(B)= P(A | B)

最后,我们通过除以 P(B)把宇宙缩小到 B。感兴趣的事件仍然没有改变。现在我们有了 P(A|B),我们感兴趣的贝叶斯法则的左边。

对于以视觉为导向的学习者(大多数人),这是一种令人满意且直观的思考概率的方式。只要你能描绘出“框架”移动来收缩或拉伸我们的宇宙,你就能描绘出贝叶斯法则到底发生了什么,希望这能帮助你理解为什么它总是正确的。它甚至可以帮助你记住公式。

2.更新我们的先验 P(A):

这是真正的统计学家谈论贝叶斯法则时最常用的词汇。“贝叶斯更新”是每个科学分支中的一个重要概念。它的基本主旨是,虽然我们最终想知道 P(A|B ),但我们从我们的先验概率 P(A ),即 A 的无条件概率开始。在此基础上,我们使用 P(B|A)和 P(B)将 P(A)调整到它应该在的位置——这是我们在考虑所有相关信息后现在知道的。

我喜欢把 P(B|A)/P(B)想象成一个比例因子,我们用它来更新 P(A)。本质上,我们用 P(B|A)/P(B)来加权 P(A ),以确定我们应该根据新信息改变我们的先验多少。

我们可以认为我们的比例因子是“A 产生 B 的可能性有多大”。如果 A 和 B 是独立的,这将是 1。如果不相交,则为 0。如果是同一事件,则为 1/ P(B) =1/ P(A) 。如果 A 的发生使 B 发生的概率增加了λ倍,那么给定 B 的条件概率应该比 P(A)大λ倍。

如果你仍然不知道为什么这是真的,就用等式
P(A | B)/P(A)=P(B | A)/**P(B)把它想成: “多了多少可能性 B 使得A“=”多了多少可能性A 右边是我们的比例因子,而左边包含我们的起点和终点。

万一你不明白为什么必须是真的,A 增加 B 的概率正好等于 B 增加 A 的概率,看看下面明显是真的等式,尤其是第二个。(提示:取消什么?每个分数代表哪个概率?分数的每个乘积代表什么?)这是很好的锻炼。如果你愿意,让 Area(U)=1。

贝叶斯法则的高明之处在于,它将我们在日常生活中如何做决定的关键观点形式化了。我们从关于现实的基线信息开始,通常是假设。每一点点新信息都会导致我们更新我们的信念,当然,除非它完美地证实了我们的信念(不幸的是,我们经常发现新信息比我们应该的更加确定——工作中的确认偏差)。或者至少新的证据应该促使我们更新信念,因为这是理性的一个重要组成部分。

如果我们已经很自然地做到了这一点,为什么我们还需要贝叶斯法则?好问题。问题是,在一些情况下,包括一些非常高风险和重要的情况,我们的猴脑直觉会崩溃,将这种信念更新的过程形式化可以帮助我们避免错误。我们稍后将考虑一个这样的例子。

3.调整“其他”条件概率 P(B|A)

如果已知给定 A 的 B 的条件概率,但想得到另一个条件概率 P(A|B),我们只需要知道两个事件的无条件概率。从一个条件概率到另一个条件概率,我们需要做的就是乘以无条件概率的比率。以这种方式陈述,这种关系可能看起来令人惊讶或随机,但形象地思考它可以帮助你明白为什么它一定是真的。

事实上,这可能看起来只是视觉解释的一种不太有用的重述,但事实证明,作为一名数据科学家,这是一种特别好的思考方式。这是因为它允许我们从回忆到精确,反之亦然。一旦我们看到了一个例子,我们将详细讨论这个问题,这样会更有意义。

需要注意的是,这些都是思考贝叶斯法则的等价方式。你不需要在脑子里把它们都变戏法。如果有一个真的合你意,那就用那个。我发现通常在不同的情况下,一个比另一个更有意义。

经典贝叶斯例子

让我们来看看这三种解释中的每一种在现实世界中的应用。考虑以下场景:

  • 有一种罕见的疾病困扰着 0.01%的人口
  • 有一种检测这种疾病的方法可以检测出 98%的病例
  • 只有 1%的人检测出该疾病呈阳性

(注:具体数字没太大关系。我们可以选择不同的数字。一个有趣的练习是一次改变一个数字,看看每次改变对结果有什么影响。)

为了简单起见,我们可以重命名我们的事件,并确定哪个概率在公式中的位置:

  • A = {你有这种病}
  • ā= {你没有病}
  • B = {你测试呈阳性}
  • b̅= {你测试阴性}
  • P(A) = 0.0001
  • p(ā)= 0.9999
  • P(B) = 0.01
  • P(B̅) = 0.99
  • P(B|A) = 0.98
  • P(A|B) =?

注意,这里我们没有明确给出 P(A ⋂ B) 。不过,这是隐含的,如果必要的话,计算起来并不困难。

现在,我们准备将这三种解释应用到我们的数字中。

解释#1(视觉)

由于患有这种疾病的人群非常少,我们只能放大到我们宇宙的一个小角落。这不是完全按比例绘制的,但对我们的目的来说已经足够接近了。

第一步:P(B | A) 从我们知道的条件概率开始:如果你确实患有疾病,正确诊断的概率。

第二步:P(B | A) P(A) = P(A ⋂ B) 乘以 P(A)得到交集的概率。我们也可以认为这是对条件概率的“去条件化”。

**第三步:P(B | A)P(A)****/**P(B)= P(A | B) 现在我们再放大,但是到一个不同的宇宙(B),给我们真正关心的条件概率。

这个故事的寓意是什么?测试非常罕见的疾病是非常困难的。这并不是说考试本身很糟糕;只是当这么少的人患有这种疾病时,不可能有很多假阳性,而不会使测试对那些测试阳性的人非常不可靠。这是医生使用多种测试的一个原因,像这种假设的测试被用来筛选谁应该接受进一步的(通常更昂贵的)测试。毕竟,它的召回率真的相当高——在患有疾病的人中,它检测到了绝大多数人(代价是警告了更多健康的人→低精度)。

解释#2(更新信念)

在这个框架下,你去看医生,假设你得这种病的概率是 0.01%,或者 0.0001。然后,你将利用测试结果来更新你对自己是否患有这种疾病的信念。

结果是,你的测试呈阳性。所以你需要用
P(B|A) / P(B) = 0.98/0.01 = 98 来衡量你的信念。这听起来很多——你有 98 倍以上的把握确定自己患有这种疾病。这里的好消息当然是你更新后的概率 P(A|B) = 98 P(A) = 98 0.0001 = 0.0098,即 0.98%。换句话说,你仍然有不到 1%的机会真正患上这种疾病。

在这个上下文中,比例因子到底是什么意思?它本质上告诉我们,相对于在人群中随机选择的任何人[=P(B)],当你患有疾病时,你得到阳性的可能性有多大。这个比例很大的事实告诉我们,我们应该通过增加我们对自己患有疾病的相信程度来相应地更新。在这种情况下,如果我们患有这种疾病,我们检测阳性的可能性是 98 倍,所以我们采用 0.01%的事前比率,并将其放大 98 倍。换句话说,1/10,000 的人患有这种疾病,但 1/10,000 的测试阳性者中有 98 人确实患有这种疾病,所以阳性诊断会让你相应地更新你的信念。

练习:为了看到这个测试的好处,考虑一下如果测试结果是阴性的话,比例因子会是多少。

解释#3(回忆的精确性)

在这种解释中,你从“其他”条件概率开始,用无条件概率的比率来衡量它,以获得我们对你患有该疾病的最终相信程度。

“如果我真的患有这种疾病,我检测呈阳性的概率有多大?”这个问题我们已经有了答案如果你已经检测为阳性,现在你想从那里得到你患这种疾病的概率。就像在第二个范例中一样,我们对它进行缩放,以获得我们最终的信任度。

在这种方法中,比例因子为 P(A) / P(B) = 0.0001/0.01 = 0.01。
所以 P(A | B)= 0.01 P(B | A)= 0.01 0.98 = 0.0098。

当然,我们得到了与上面相同的答案,但有趣的部分是我们如何到达那里的不同。

有趣的是,我们可以从精确度和召回率的角度来看这个问题。高精度意味着很少的假阳性,高召回意味着很少的假阴性。我们知道,测试中的高召回率(99%)意味着更高的精确度,保持所有其他因素不变(因为两个公式的 TP 都在增加)。但是我们需要把其他因素考虑进去,才能知道高召回率是否真的转化为高精确度,在这种情况下,它不是。

这是为什么呢?我们的比例因子 P(A)/P(B)告诉我们,对于我们人口中随机选择的个体,实际患有该疾病的概率远低于检测为阳性的概率。事实上,它告诉我们,你测试呈阳性的可能性是你患病的 100 倍。因此,尽管绝大多数患病者都能被准确检测出来,但他们仍将是所有检测呈阳性者中的少数。

换句话说,我们的比例因子将假阴性的数量与假阳性的数量进行比较。这并不完全是它们的比率,而是每一个与真阳性数量相加的比率。

简而言之:从回忆开始,然后通过“与得到阳性诊断相比,患这种疾病的可能性有多大”来衡量,以获得精确度。在下一节,也是最后一节,我们将详细介绍这一点。

额外收获:根据精确度和召回率重新陈述贝叶斯法则

作为一个临时演员,让我们深入研究这个问题,并展示贝叶斯法则与精确度和召回率之间的关系。

设置:

  • TP,TN,FP,FN 是真/假阳性/阴性
  • A = TP + FN(所有实际患病的人)
  • B = TP + FP(所有疾病检测呈阳性的人)
  • A B = TP
  • P(A ⋂ B) = TP / (TP + TN + FP + FN)
  • P(A) = (TP + FN) / (TP + TN + FP + FN)
  • P(B) = (TP + FP) / (TP + TN + FP + FN)
  • prec = TP/(TP+FP)= p(a⋂b)/p(b)= p(a | b)
  • rec = TP/(TP+fn)= p(a⋂b)/p(a)= p(b | a)

派生:

  • P(A|B) = P(B|A) P(A) / P(B)
  • Prec = Rec P(A) / P(B)
  • prec = Rec((TP+FN)/(TP+TN+FP+FN))/((TP+FP)/(TP+TN+FP+FN))
  • Prec = Rec (TP + FN) / (TP + FP)

当我们这样陈述时,它似乎是微不足道的。“精确就是回忆,只不过你取消了让它回忆起来的那部分,加上了让它精确的那部分。”我们可以更进一步

  • Prec = Rec Prec / Rec

这是显而易见的,一点帮助都没有。不过,这种方法的真正价值在于,我们现在有办法将两个不同的概念联系在一起,这两个概念有时被视为完全不同,但实际上密切相关。

使用 SAS-SQL 转变您的 SAS 数据工作流的 3 种方式

原文:https://towardsdatascience.com/3-ways-to-transform-your-sas-workflow-with-sas-sql-e121968b2029?source=collection_archive---------58-----------------------

用 SAS?利用 SQL 来简化您的工作。

照片由 Roma Ryabchenko 在 Unsplash 上拍摄

  1. 介绍
  2. 在 SAS 中使用 SQL 的好处
  3. 示例数据集
  4. 示例 1:连接数据集
  5. 示例#2:向新列添加值
  6. 示例#3:选择列中的唯一值
  7. 结论

1。简介

作为一个必须在新的工作场所快速掌握 SAS 的人,我很高兴看到我可以使用我现有的 SQL 知识来补充我公司主要使用 SAS 的分析团队。一般来说,我发现在 MySQL 和 PostgreSQL 等其他 SQL 平台上可以做的大多数事情都是适用的,尽管语法可能会有所不同。

在对我们现有的 SAS 代码进行了一些故障排除之后,我能够向我的同事展示 SQL 可以改进我们工作流的一些方便的方法。下面我用三个例子来演示其中的一些方法。

2。在 SAS 中使用 SQL 的一些好处

  1. 可读性 — SQL 可读性强,学习直观。
  2. SQL 可以一步完成操作、汇总、排序等多种功能。
  3. 如果您已经了解 SQL,并且是 SAS 新手,您可以立即开始为您的团队做出贡献。
  4. 结合 SQL 和 SAS 数据步骤可以简化工作流程。
  5. SQL 是大多数数据库使用的 ANSI 标准语言。

3。我们的示例数据集

我们在示例中使用的两个表来自 Beth Morrison 创建的巴塔哥尼亚服装数据集。注意,对于这些例子,我使用的是 SAS Studio ,尽管同样的语法也可以用在其他 SAS 平台上,比如 SAS Viya 或 SAS Enterprise。

“服装 _ 类别”表。图片作者。

“服装 _ 列表”表。图片由作者提供。

4。示例 1:连接数据集

假设您想找出“服装列表”表中哪些服装适合陆地或水域。在这种情况下,您需要使用公共列“item_category”将“clothing_category”表连接到“clothing_list”表。

SAS: 在 SAS 中将表连接或合并在一起的等效操作可能是一个多步骤的过程。请在此参考 SAS 文档。

SQL: 用 SQL-SAS 连接表很简单,可以节省时间。注意,SQL-SAS 中的“JOIN”和“LEFT JOIN”是相同的。

PROC SQL;
SELECT *
FROM clothing_category
JOIN clothing_listON
clothing_category.item_category = clothing_list.item_category;
QUIT;

上述连接产生的输出表。现在,您可以看到“服装列表”表中的“物品类别”与“服装类别”表中的“土地”或“水”值相匹配。图片由作者提供。

5。示例 2:向新列添加值

假设您希望根据另一列的值为新列赋值。这里,我们将添加一个列,该列的值将指定“clothing_list”中的每件商品的价格是低于 100 美元还是高于 100 美元。

SAS: 在 SAS 中,您可以运行一个数据步骤,使用 LENGTH 函数创建一个新列“price_category”,然后使用“IF-THEN-ELSE”语句为该列中的行赋值。

DATA work.output_table;
SET work.clothing_list;
LENGTH price_category $50.; IF item_price < 100 THEN price_category = 'Less than $100';ELSE IF item_price > 100 THEN price_category = 'More than $100';ELSE price_category = 'Not available';
RUN;

SQL: 您可以在 SQL-SAS 中使用 CASE WHEN 语句,而不是使用带有多个 IF 语句的 SAS 来运行数据步骤。这也为您提供了在单步中进行聚合(分组依据)、排序(排序依据)等操作的灵活性。

PROC SQL;
SELECT item_category, item_name, item_price,(CASEWHEN item_price < 100 THEN 'Less than $100'WHEN item_price > 100 THEN 'More than $100'ELSE 'Not available'END) AS price_category
FROM work.clothing_list
;
QUIT;

运行上述任一代码块都将输出下表:

请注意“价格类别”列。图片由作者提供。

6。示例#3:选择列中的唯一值

假设您想在一个列中查找唯一值,例如商店中服装的唯一商品价格的数量。这就是 SAS-SQL 中的 SELECT DISTINCT 大放异彩的地方。

SAS: 在 SAS 中,您可以使用 PROC SORT 找到唯一值:

PROC SORT DATA = work.clothing_listOUT = work.unique_values(KEEP = item_price) DUPOUT = work.duplicate_table(KEEP = item_price) NODUPKEY;BY item_price; /*this is the column of interest*/
RUN;

在这种情况下,SAS 的优点在于,“DUPOUT”选项除了输出包含唯一商品价格列表的“work.unique_values”表之外,还输出“work.duplicate_table”表中额外重复值的表。您还可以选择输出整个匹配行。

“NODUPKEY”告诉 SAS 只保留输出表中 BY 语句中列出的列的每个唯一值的第一个匹配项。

工作中的重复项目价格。重复 _ 表格。图片作者。

作品中独特的物品价格。唯一值表。这里可以看到“75”和 429”也在这个表中。图片由作者提供。

SQL: 在 SQL 中,只需编写如下几行代码,就可以获得与上面的表相同的输出,其中包含唯一的值。注意:这不会输出带有额外重复行的表。

PROC SQL;
SELECT DISTINCT item_price
FROM clothing_list;
QUIT;

7。结论

我希望这能帮助您更多地了解在 SAS 中使用 SQL 的潜力!在实践中,我发现使用 SAS 数据步骤和 SQL 代码块最适合我的数据准备工作。

您如何在 SAS 中使用 SQL 来改进您的工作流程?想了解 SQL-SAS 如何节省您的时间并简化您的代码吗?请在下面的评论中告诉我!

—吉米

FAANG 科技巨头的 30 多个数据科学面试问题

原文:https://towardsdatascience.com/30-data-science-interview-questions-from-faang-tech-giants-1eea134db7c7?source=collection_archive---------11-----------------------

来自脸书、亚马逊、苹果、网飞和谷歌的深度访谈问答

图片由皮克斯拜的 Gerd Altmann 提供

本文汇集了来自顶级科技巨头(也称为 FAANG 公司,如脸书、亚马逊、苹果、网飞、谷歌)的三十多个数据科学面试问题和答案。随意用这个来准备面试,看看哪里需要多学习,甚至你只是想看看顶级公司都问些什么!

脸谱网

问:你从 100 枚硬币中随机抽取一枚——1 枚不公平硬币(正面朝上),99 枚公平硬币(正面朝下),然后掷 10 次。如果结果是 10 头,硬币不公平的概率是多少?

这可以用贝叶斯定理来回答。贝叶斯定理的扩展方程如下:

假设选到不公平硬币的概率表示为 P(A),连续翻转 10 个头像的概率表示为 P(B)。那么 P(B|A)等于 1,P(B∣ A)等于 0。⁵ ⁰,P( A)等于 0.99。

如果填入等式,那么 P(A|B) = 0.9118 或者 91.18%。

问:有一栋楼有 100 层。你有两个相同的鸡蛋。如何用 2 个鸡蛋找到门槛楼层,在这里鸡蛋肯定会从 N 层以上的任何一层破开,包括 N 层本身。

更具体地说,问题是在给定两个鸡蛋的情况下,寻找阈值下限的最优方法。

为了更好地理解这个问题,我们假设你只有一个鸡蛋。要找到门槛楼层,你可以简单地从第一层开始,放下鸡蛋,然后一层一层往上爬,直到鸡蛋裂开。

现在想象我们有无限的鸡蛋。寻找最低门槛的最佳方法是通过二分搜索法。首先,你会从 50 楼开始。如果鸡蛋裂开了,你就在 25 楼扔一个鸡蛋,如果鸡蛋没有裂开,你就在 75 楼扔一个鸡蛋,重复这个过程,直到你找到门槛楼层。

对于两个鸡蛋,寻找阈值下限的最佳方法是上述两种解决方案的混合…

例如,你可以每隔 5 层扔第一个鸡蛋,直到它破了,然后用第二个鸡蛋找出在 5 个增量之间的哪一层是门槛层。在最坏的情况下,这将需要 24 滴。

如果你每隔 10 层楼丢下第一个鸡蛋,直到它破掉,在最坏的情况下需要 19 次,这比每隔 5 层楼丢下第一个鸡蛋要好得多。但是如果你想做得更好呢?

这就是最大遗憾最小化这个概念发挥作用的地方。基本上,这意味着当你以给定的增量完成更多的下降(你跳过多少层)时,你希望每次都缓慢地减少增量,因为阈值楼层的可能楼层会更少。这意味着如果你的第一次下落是在 n 层,那么你的第二次下落应该是在 n + (n-1)层,假设它没有破裂。这可以写成下面的等式:

更进一步,这可以简化为:

求解 n,你得到大约 14。因此,你的策略将是从第 14 层开始,然后 14+13,然后 14+13+12,等等,直到它打破,然后使用第二个蛋一次一层地找到门槛层!

问:我们有两种在 Newsfeed 中投放广告的选择。方案一:每 25 个故事中,就有一个是 ad。方案二:每个故事都有 4%的几率成为广告。对于每个选项,100 个新闻故事中显示的广告的预期数量是多少?

两种选择的预期赔率都是 4/100。

对于选项 1,1/25 相当于 4/100。
对于选项 2,100 的 4%是 4/100。

如果我遗漏了什么,请随时告诉我,因为这个问题似乎太直截了当了!

问:只知道性别身高,你如何证明男性平均比女性高?

你可以用假设检验来证明男性平均比女性高。

零假设是男性和女性平均身高相同,而另一个假设是男性的平均身高高于女性的平均身高。

然后,您将收集男性和女性身高的随机样本,并使用 t 检验来确定您是否拒绝空值。

问:如果 iOS 上 70%的脸书用户使用 Instagram,但 Android 上只有 35%的脸书用户使用 Instagram,你会如何调查这种差异?

有许多可能的变量会导致这种差异,我将检查一下:

  • iOS 和 Android 用户的人口统计数据可能会有很大差异。例如,根据 Hootsuite 的调查,43%的女性使用 Instagram,而男性只有 31%。如果 iOS 的女性用户比例明显高于 Android,那么这可以解释这种差异(或者至少是部分差异)。这也适用于年龄、种族、民族、地点等
  • 行为因素也会对差异产生影响。如果 iOS 用户比 Android 用户更频繁地使用手机,他们更有可能沉迷于 Instagram 和其他应用程序,而不是那些在手机上花费时间少得多的人。
  • 另一个需要考虑的因素是 Google Play 和 App Store 有什么不同。例如,如果 Android 用户有明显更多的应用程序(和社交媒体应用程序)可供选择,这可能会导致用户的更大稀释。
  • 最后,与 iOS 用户相比,用户体验的任何差异都会阻止 Android 用户使用 Instagram。如果这款应用对安卓用户来说比 iOS 用户更容易出错,他们就不太可能在这款应用上活跃。

问:每个用户的点赞数和在一个平台上花费的时间在增加,但用户总数在减少。它的根本原因是什么?

一般来说,你会想从面试官那里获得更多的信息,但是让我们假设这是他/她唯一愿意提供的信息。

关注每个用户的点赞数,有两个原因可以解释为什么这个数字会上升。第一个原因是,随着时间的推移,用户的平均参与度普遍提高了——这是有道理的,因为随着使用该平台成为一种习惯性做法,久而久之的活跃用户更有可能成为忠实用户。每个用户点赞数会增加的另一个原因是分母,即用户总数,在减少。假设停止使用该平台的用户是不活跃的用户,也就是参与度和点赞数低于平均水平的用户,这将增加每个用户的平均点赞数。

上面的解释也适用于在平台上花费的时间。随着时间的推移,活跃用户变得越来越活跃,而很少使用的用户变得不活跃。总体而言,参与度的增加超过了参与度很低的用户。

更进一步说,有可能“参与度低的用户”是脸书能够检测到的机器人。但随着时间的推移,脸书已经能够开发出识别和删除机器人的算法。如果以前有大量的机器人,这可能是这种现象的根本原因。

问:脸书发现赞数每年增长 10%,为什么会这样?

给定年份的总赞数是用户总数和每个用户的平均赞数的函数(我称之为参与度)。

用户总数增加的一些潜在原因如下:由于国际扩张而获得的用户以及随着年龄增长而注册脸书的年轻群体。

参与度增加的一些潜在原因是用户对应用程序的使用增加,用户变得越来越忠诚,新的特性和功能以及用户体验的改善。

问:如果一个项目经理说他们想把新闻订阅的广告数量增加一倍,你如何判断这是不是一个好主意?

您可以通过将用户分成两组来执行 A/B 测试:一组是广告数量正常的对照组,一组是广告数量翻倍的测试组。然后,您将选择指标来定义什么是“好主意”。例如,我们可以说零假设是广告数量翻倍会减少花在脸书上的时间,另一个假设是广告数量翻倍不会对花在脸书上的时间有任何影响。但是,您可以选择不同的指标,如活跃用户数或流失率。然后,您将进行测试,并确定拒绝或不拒绝 null 的测试的统计显著性。

问:有一个游戏,给你两个公平的六面骰子,让你掷骰子。如果骰子上的数值之和等于 7,那么您将赢得 21 美元。但是,每次掷出两个骰子,你都必须支付 5 美元。你玩这个游戏吗?

掷出 7 的几率是 1/6。
这意味着期望支付 30 美元(5*6)赢得 21 美元。
取这两个数字,预期支付额为-$ 9(21–30)。
由于预期付款为负,你不会想要支付此游戏。

亚马孙

问:如果有 8 个重量相等的弹珠和 1 个稍重的弹珠(总共 9 个弹珠),需要称重多少次才能确定哪个弹珠最重?

作者创建的图像

需要称重两次(见上文 A 和 B 部分):

  1. 你将九个弹珠分成三组,每组三个,称其中两组的重量。如果天平平衡(选择 1),你知道重的弹球在第三组弹球中。否则,您将选择权重更大的组(选项 2)。
  2. 然后你将练习同样的步骤,但是你将有三组一个弹球,而不是三组三个。

问:凸与非凸代价函数的区别;当一个代价函数是非凸的时候意味着什么?

凸函数是指在图上任意两点之间画的一条线位于图上或图上。它有一个最小值。

非凸函数是在图上任意两点之间画的线可能与图上其他点相交的函数。它的特征是“波浪形”。

当成本函数是非凸的时,这意味着该函数有可能找到局部最小值而不是全局最小值,从优化的角度来看,这在机器学习模型中通常是不期望的。

问:什么是过度拟合?

过度拟合是一种错误,即模型“拟合”数据太好,导致模型具有高方差和低偏差。因此,过度拟合模型将会不准确地预测新的数据点,即使它对训练数据具有高的准确性。

问:改变基本会员费会对市场产生什么影响?

我对这个问题的答案没有 100%的把握,但我会尽力而为!

让我们举一个主要会员费上涨的例子——有两方参与,买方和卖方。

对于买家来说,提高会员费的影响最终取决于买家需求的价格弹性。如果价格弹性很高,那么给定的价格上涨将导致需求大幅下降,反之亦然。继续购买会员费的买家可能是亚马逊最忠诚和最活跃的客户——他们也可能更加重视 prime 产品。

卖家将受到打击,因为现在购买亚马逊一篮子产品的成本更高了。也就是说,一些产品将受到更严重的打击,而其他产品可能不会受到影响。亚马逊最忠实的顾客购买的高端产品可能不会受到太大影响,比如电子产品。

问:描述决策树、支持向量机和随机森林。谈论他们的优点和缺点。

决策树:一种树状模型,用于根据一个或多个条件对决策进行建模。

  • 优点:易于实现,直观,处理缺失值
  • 缺点:高方差,不准确

支持向量机(Support Vector Machines):一种分类技术,可以找到一个超平面或两类数据之间的边界,从而最大化两类数据之间的差距。有许多平面可以分隔这两个类别,但只有一个平面可以最大化类别之间的边距或距离。

  • 优点:高维精确
  • 缺点:容易过度拟合,不能直接提供概率估计

随机森林:一种基于决策树的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。

  • 优点:可以实现更高的准确性,处理缺失值,不需要特征缩放,可以确定特征重要性。
  • 缺点:黑盒,计算量大

问:为什么降维很重要?

降维是减少数据集中要素数量的过程。这主要在您想要减少模型中的方差(过度拟合)的情况下很重要。

维基百科陈述了降维的四大优势(见此处):

  1. 它减少了所需的时间和存储空间
  2. 多重共线性的消除改善了机器学习模型参数的解释
  3. 当数据降低到非常低的维度时,如 2D 或 3D,就变得更容易可视化
  4. 它避免了维数灾难

问:商品在位置 A 的概率是 0.6,在位置 b 的概率是 0.8。在亚马逊网站上找到该商品的概率是多少?

我们需要对这个问题做一些假设才能回答。让我们假设在亚马逊上有两个可能的地方购买一件特定的商品,在位置 A 找到它的概率是 0.6,在位置 B 找到它的概率是 0.8。在亚马逊上找到该商品的概率可以这么解释:

我们可以把上面的话重新措辞为 P(A) = 0.6,P(B) = 0.8。此外,让我们假设这些是独立的事件,这意味着一个事件的概率不受另一个事件的影响。然后我们可以使用公式…

P(A 或 B) = P(A) + P(B) — P(A 和 B)
P(A 或 B) = 0.6 + 0.8 — (0.6*0.8)
P(A 或 B) = 0.92

问:什么是助推?

Boosting 是一种集成方法,通过减少模型的偏差和方差来改进模型,最终将弱学习者转换为强学习者。总体思路是训练一个弱学习器,通过对前一个学习器的学习,依次迭代改进模型。这里 可以了解更多

苹果

问:描述 L1 和 L2 正则化之间的区别,特别是关于它们对模型训练过程的影响的区别。

L1 和 L2 正则化都是用于减少训练数据过拟合的方法。最小二乘法使残差平方和最小,这可能导致低偏差但高方差。

L2 正则化,也称为岭回归,最小化残差平方和加上λ乘以斜率平方。这个附加项被称为岭回归损失。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。

如果您采用岭回归罚分并用斜率的绝对值替换它,那么您将得到套索回归或 L1 正则化。

L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。

问:ACF 和 PACF 的含义是什么?

要了解 ACF 和 PACF,首先需要知道什么是自相关序列相关。自相关着眼于给定时间序列与其自身滞后版本之间的相似程度。

因此,自相关函数(ACF) 是一种工具,用于发现数据中的模式,具体而言,是指由各种时间滞后分隔的点之间的相关性。例如,ACF(0)=1 意味着所有数据点都与自身完美相关,ACF(1)=0.9 意味着一个点与下一个点之间的相关性为 0.9。

PACF偏自相关函数的简称。引用 StackExchange 中的一段文字,“它可以被认为是由若干个周期 n 分隔的两个点之间的相关性,但中间相关性的影响已被消除。”比如说。如果 T1 与 T2 直接相关,而 T2 与 T3 直接相关,则似乎 T1 与 T3 相关。PACF 将消除与 T2 之间的关联。

这里很棒的解释了 ACF 和 PACF 这里

问:什么是偏差-方差权衡?

估计值的偏差是期望值和真实值之间的差值。具有高偏差的模型往往过于简单,导致拟合不足。方差表示模型对数据和噪声的敏感度。具有高方差的模型导致过度拟合。

因此,偏差-方差权衡是机器学习模型的一个属性,其中较低的方差导致较高的偏差,反之亦然。一般来说,可以找到两者的最佳平衡,使误差最小化。

作者创建的图像

问:XGBoost 如何处理偏差-方差权衡?

作者创建的图像

XGBoost 是一种利用梯度推进算法的集成机器学习算法。本质上,XGBoost 就像是类固醇上的装袋助推技术。因此,可以说 XGBoost 处理偏差和方差的方式类似于任何 boosting 技术。Boosting 是一种集成元算法,通过对许多弱模型进行加权平均来减少偏差和方差。通过关注弱预测和迭代模型,误差(从而偏差)减少了。类似地,因为它对许多弱模型进行加权平均,所以最终的模型比每个弱模型本身具有更低的方差。

问:什么是随机森林?为什么朴素贝叶斯更好?

随机森林是一种建立在决策树基础上的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。依靠“多数获胜”模型,它降低了单个树出错的风险。

作者创建的图像

例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是随机森林的力量。

随机森林提供了其他几个好处,包括强大的性能,可以模拟非线性边界,不需要交叉验证,并赋予功能重要性。

从过程和结果易于训练和理解的意义上来说,朴素贝叶斯更好。一个随机的森林看起来就像一个黑盒。因此,在实现和理解方面,朴素贝叶斯算法可能更好。但是,就性能而言,随机森林通常更强,因为它是一种集合技术。

网飞

问:为什么整流线性单位是一个很好的激活函数?

由作者创建

整流线性单元,也称为 ReLU 函数,已知是比 sigmoid 函数和 tanh 函数更好的激活函数,因为它执行梯度下降更快。请注意,在左侧的图像中,当 x(或 z)非常大时,斜率非常小,这会显著降低梯度下降的速度。然而,这不是 ReLU 函数的情况。

问:正规化有什么用?L1 正则化和 L2 正则化有什么区别?

L1 和 L2 正则化都是用于减少训练数据过拟合的方法。最小二乘法使残差平方和最小,这可能导致低偏差但高方差。

L1 vs L2 正规化

L2 正则化,也称为岭回归,最小化残差平方和加上λ乘以斜率平方。这个附加项被称为岭回归损失。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。
如果取岭回归罚分,用斜率的绝对值代替,那么就得到套索回归L1 正则化
L2 不太稳健,但有一个稳定的解决方案,并且总是有一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。

问:在线学习和批量学习有什么区别?

批量学习,也称为离线学习,就是你对一组组的模式进行学习。这是大多数人都熟悉的学习类型,在这种情况下,您可以获取一个数据集,然后一次性在整个数据集上构建一个模型。

另一方面,在线学习是一种一次吸收一个观察数据的方法。在线学习是数据高效的,因为数据一旦被消费就不再需要,这在技术上意味着你不必存储你的数据。

问:在查询数据集时,如何处理空值?还有其他方法吗?

有多种方法可以处理空值,包括:

  • 您可以完全忽略空值行
  • 您可以用集中趋势的度量值(平均值、中值、众数)替换空值,或者用新的类别替换空值(如“无”)
  • 您可以根据其他变量预测空值。例如,如果某一行的 weight 值为空,但它的 height 值为空,则可以用该给定高度的平均重量替换该空值。
  • 最后,如果您正在使用自动处理空值的机器学习模型,则可以保留空值。

问:如何防止模型的过度拟合和复杂性?

对于那些不知道的人来说,过度拟合是一种建模错误,当一个函数与数据过于接近时,会导致新数据引入模型时出现高水平的错误。

有多种方法可以防止模型过度拟合:

  • 交叉验证:交叉验证是一种用于评估模型在新的独立数据集上表现如何的技术。交叉验证最简单的例子是将数据分成两组:定型数据和测试数据,其中定型数据用于构建模型,测试数据用于测试模型。
  • 正则化:当模型具有更高次的多项式时,会发生过度拟合。因此,正则化通过惩罚高次多项式来减少过拟合。
  • 减少特征数量:你也可以通过减少输入特征的数量来减少过度拟合。您可以通过手动移除特征来实现这一点,或者您可以使用一种称为主成分分析的技术,该技术将高维数据(例如 3 维)投影到较小的空间(例如 2 维)。
  • 集成学习技术:集成技术通过 bagging 和 boosting 将许多弱学习者转化为强学习者。通过装袋和增压,这些技术比它们的替代技术更容易过度适应。

问:对于我们正在考虑的新功能,你会如何设计实验?什么样的指标是重要的?

作者创建的图像

我会进行 A/B 测试,以确定新特性的引入是否会在我们关心的给定指标上带来统计上的显著改进。度量标准的选择取决于功能的目标。例如,可以引入一个功能来提高转换率、web 流量或保留率。

首先,我会制定我的零假设(特征 X 不会改善度量 A)和我的替代假设(特征 X 会改善度量 A)。

接下来,我会通过随机抽样来创建我的控制组和测试组。因为 t 检验天生就考虑样本量,所以我不打算指定一个必要的样本量,虽然越大越好。

一旦我收集了我的数据,根据我的数据的特点,我会进行 t 检验,韦尔奇的 t 检验,卡方检验,或贝叶斯 A/B 检验,以确定我的控制组和测试组之间的差异是否有统计学意义。

谷歌

问:一个盒子里有 12 张红卡和 12 张黑卡。另一个盒子里有 24 张红牌和 24 张黑牌。你想从两个盒子中的一个里随机抽取两张卡片,一次抽取一张。哪个盒子得到同色卡片的概率更大,为什么?

有 24 张红卡和 24 张黑卡的盒子获得两张同色卡片的概率更大。让我们走过每一步。

假设你从每副牌中抽出的第一张牌是红色的 a。

这意味着在有 12 个红和 12 个黑的牌组中,现在有 11 个红和 12 个黑。因此,你再抽一张红色的几率等于 11/(11+12)或 11/23。

一副牌中有 24 个红和 24 个黑,那么就有 23 个红和 24 个黑。因此,你再抽一张红色的几率等于 23/(23+24)或 23/47。

由于 23/47 > 11/23,所以卡数较多的第二副牌有较大概率得到相同的两张牌。

问:你在赌场,有两个骰子可以玩。你每掷一次 5 就赢 10 美元。如果你一直玩到你赢了然后停止,预期的回报是多少?

  • 我们假设每次你想玩的时候要花 5 美元。
  • 两个骰子有 36 种可能的组合。
  • 在 36 种组合中,有 4 种组合会掷出 5(见蓝色)。这意味着有 4/36 或 1/9 的机会掷出 5。
  • 1/9 的胜算意味着你会输八次,赢一次(理论上)。
  • 因此,您的预期支出等于$ 10.00 * 1-$ 5.00 * 9 =-35.00。

编辑:谢谢各位的评论和指出,应该是——35 美元!

问:如何判断给定的硬币是否有偏差?

这不是一个难题。答案很简单,就是进行假设检验:

  1. 零假设是硬币没有偏向,翻转头的概率应该等于 50% (p=0.5)。另一个假设是硬币有偏差,p!= 0.5.
  2. 抛硬币 500 次。
  3. 计算 Z 得分(如果样本小于 30,则需要计算 t 统计量)。
  4. 对比 alpha(双尾检验所以 0.05/2 = 0.025)。
  5. 如果 p 值>α,则不拒绝 null,硬币不偏。
    如果 p 值< alpha,则拒绝 null,硬币有偏。

了解更多假设检验 这里

让不公平的硬币变得公平

由于抛硬币是二进制的结果,你可以通过抛两次硬币来使不公平的硬币变得公平。如果你掷两次,有两种结果可以赌:正面跟着反面或者反面跟着正面。

P(正面)* P(反面)= P(反面)* P(正面)

这是有意义的,因为每一次抛硬币都是一个独立的事件。这意味着如果你得到正面→正面或反面→反面,你需要重新抛硬币。

问:你即将登上去伦敦的飞机,你想知道你是否需要带雨伞。你随便打电话给三个朋友,问他们是否在下雨。你的朋友说实话的概率是 2/3,他们通过撒谎对你恶作剧的概率是 1/3。如果他们三个都说在下雨,那么伦敦下雨的概率是多少。

你可以看出这个问题与贝叶斯理论有关,因为最后一个陈述本质上遵循这样的结构,“假设 B 为真,A 为真的概率是多少?”因此,我们需要知道某一天伦敦下雨的概率。假设是 25%。

P(A) =下雨的概率= 25%
P(B) =三个朋友都说在下雨的概率
P(A|B)假定他们说在下雨的概率
P(B|A)假定在下雨的情况下三个朋友都说在下雨的概率= (2/3) = 8/27

第一步:求解 P(B)
P(A | B)= P(B | A) * P(A)/P(B),可以改写为
P(B)= P(B | A)* P(A)+P(B |非 A)* P(非 A)
P(B)=(2/3)* 0.25+(1/3)* 0.75 = 0.25 * 8/27+0.75 * 1

第二步:求解 P(A | B)
P(A | B)= 0.25 *(8/27)/(0.25 * 8/27+0.75 * 1/27)
P(A | B)= 8/(8+3)= 8/11

因此,如果三个朋友都说在下雨,那么有 8/11 的几率是真的在下雨。

问:给你 40 张四种不同颜色的卡片——10 张绿卡、10 张红牌、10 张蓝卡和 10 张黄牌。每种颜色的卡片都从一到十编号。随机抽取两张牌。找出所选卡片不是相同号码和相同颜色的概率。

由于这些事件不是独立的,我们可以使用规则:
P(A 和 B) = P(A) * P(B|A),也等于
P(非 A 非 B) = P(非 A) * P(非 B |非 A)

例如:

P(非 4 非黄)= P(非 4) * P(非黄|非 4)
P(非 4 非黄)= (36/39) * (27/36)
P(非 4 非黄)= 0.692

所以,挑出来的牌不是同号同色的概率是 69.2%。

感谢阅读!

如果你喜欢我的工作并想支持我,我会非常感谢你在我的社交媒体频道上关注我:

  1. 支持我的最好方式就是在媒体 这里关注我。
  2. LinkedIn 这里关注我。
  3. 推特关注我这里。
  4. 点击这里订阅我的新 YouTube 频道

有兴趣合作?查看我的写作机构,ShinTwin,我们来连线吧!

一篇文章中的熊猫 30 天

原文:https://towardsdatascience.com/30-days-of-pandas-in-an-article-b328cfb83d50?source=collection_archive---------53-----------------------

总结了 30 种有用的熊猫功能和方法

照片由法比奥在 Unsplash 上拍摄

Pandas 是一个专门用于数据操作的 Python 包。这个包是数据科学家生活中不可分割的一部分,了解它不会给你带来任何伤害。

之前,在我的 LinkedIn 帖子中,我在三十天中每天发布我认为有用的熊猫包中的新函数和方法。有些人要求我做一个总结,正因为如此,我会在这里写一篇关于它的文章。

继续读!

第一天:style.bar

我想展示一个名为style.bar的 Pandas 数据框对象的方法,它允许你在数据框中创建一个数值列的柱状图。您只需在数据框对象后使用. style.bar 来调用此方法。

如果你想让你的数据展示更有冲击力,更清楚地说明你的观点,这种方法很有用

#Day 1 style.barimport pandas as pd
import seaborn as snsplanets = sns.load_dataset('planets')planets.head(10)[['method','year', 'distance']].sort_values(by = 'distance').style.bar(color = 'lightblue',                                                                                  subset = 'distance').hide_index()

第二天:qcut

今天我要给大家展示一个从熊猫到划分你的数据的有用函数叫做qcut

熊猫的功能qcut是什么?qcut函数将对连续变量进行分箱,其中基于等级或基于样本分位数,分箱大小相等。

那么什么是分位数呢?分位数基本上是一种以相等方式划分连续值的除法技术。例如,如果我们将连续值分为 4 部分;它被称为四分位,如图所示。

#Day 2 qcutimport seaborn as sns
import pandas as pd
mpg = sns.load_dataset('mpg')pd.qcut(x = mpg['mpg'], q = 4, labels = [1,2,3,4])

第三天:数据透视表

在这篇文章中,我想向你介绍一种最强大的方法,叫做 pivot_table。

通过调用方法,可以在数据框对象中访问此方法。数据框对象后的 pivot_table。

那么这个方法是干什么的呢?它根据我们传递给 columns 参数的 categorical 对象创建一个数据透视表,values 参数接受数值。

pivot_table 的特殊之处在于,结果不仅仅是值,还有传递给参数的聚合函数。

您可以查看示例图片了解更多信息。希望有帮助!

#Day 3 pivot_tableimport pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')tips.pivot_table(columns = 'sex', values = 'total_bill', aggfunc = 'mean', index = 'size', margins = True)

第四天:agg

今天先说一个比较简单的方法。在这里,我要介绍一个来自数据框对象的方法,叫做 agg。

就像名字一样,这个方法创建一个聚合表。也就是说,我们将预期的聚合放在。agg 方法和所有数字列都由创建表的聚合函数处理。

这个函数的伟大之处在于,我们可以通过创建自己的函数来放置我们想要的聚合,并且结果表会像示例图片中一样显示出来。

#Day 4 aggimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')def mean_divided_by_2(col):return (col.mean())/2mpg.agg(['mean', 'std',mean_divided_by_2])

第五天:融化

我想给你介绍一种来自熊猫数据帧的奇特方法,叫做融化。

当我们将每个值和变量分解到另一个表中时,这种方法与 pivot 方法相反。

请看下面的例子,这次我将 id_vars 指定为 tip 列,值为 sex 列。我们得到的是 tip 列中的每个值和 sex 列中的每个值都是成对的。

#Day 5 meltimport pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')tips.melt(id_vars = 'tip', value_vars = 'sex')

第六天:style.applymap

今天我要给大家介绍一个来自熊猫 Dataframe 的令人兴奋的方法,叫做style.applymap

那么这个方法是干什么的呢?看一下这个例子,你可以看到一些数字是红色的,而另一些是黑色的。这是因为我们使用了 style.applymap 方法。

这个方法所做的是接受一个函数来修改我们 Jupyter 笔记本中的 CSS,并应用于我们数据框中的每一个值。

例如,在我的示例中,该函数将对小于等于 20 的数值进行着色。该函数需要为每个改变颜色的值返回的是一个带有颜色规范的字符串;例如'【T1 ')。

#Day 6 style.applymapimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')def mean_divided_by_2(col):return (col.mean())/2mpg.agg(['mean', 'std',mean_divided_by_2])

第 7 天:选择类型

我想分享一个来自熊猫数据框架的简单而强大的方法,叫做.select_dtypes

在数据清理和工程过程中,我经常使用这种方法,如果没有.select_dtypes方法,我会很难受。

那么,这是什么方法呢?很简单,这个方法用于根据特定的数据类型选择数据框中的列。例如“数字”或“对象”。

在示例中,我向您展示了我将“数字”数据类型传递给该方法;这意味着我只选择数字列(浮点数或整数)。我使用的另一个例子是“object ”,这意味着我只选择对象列。

#Day 7 select_dtypesimport seaborn as sns
import pandas as pd
mpg = sns.load_dataset('mpg')#Selecting the number data type
mpg.select_dtypes('number')#Selecting the object data type
mpg.select_dtypes('object')

第八天:style.hide_

今天我想向你介绍一个简单而有用的方法,尤其是在演讲中。这些方法是 style.hide_index 和 style.hide_columns。

所以,仅仅通过方法名,我想你可以猜到这个函数是用来隐藏索引和/或列的。

从示例中,您可以看到我隐藏了数据框索引和数据框列(通过传递列名)。

希望有帮助!

#Day 8 style.hide_import seaborn as sns
import pandas as pd
mpg = sns.load_dataset('mpg')mpg.head(10).style.hide_index().hide_columns(['mpg', 'name', 'model_year'])

第九天:更正

好吧,我很肯定很多人都知道。来自数据框对象的 corr 方法。

好吧,如果你不知道它是什么;。corr 是一种自动计算两个数值变量之间的相关性并将结果显示为矩阵图的方法。

默认情况下。corr 法有三种相关法计算;皮尔森,斯皮尔曼和肯德尔。但是,您知道您可以使用自己的相关函数计算吗?

在这个例子中,我从 scipy.stats weightedtau 创建了自己的函数来创建一个 weighted_tau 相关计算。我们需要的是。工作的 corr 方法是一个接受双参数并返回一个浮点对象的函数。

希望有帮助!

#Day 9 corrimport pandas as pd
import seaborn as sns
from scipy.stats import weightedtaudef weight_tau(x, y):return weightedtau(x, y)[0]tips= sns.load_dataset('tips')
tips.corr(weight_tau)

第 10 天:更换

今天我要给大家介绍的数据框对象方法叫做. replace。

所以,这个方法顾名思义;它曾经取代了一些东西,但是什么呢?

这个方法做的主要事情是替换值;是的,列中的值。

从这个例子中,您可以看到我通过在方法中传递一个 dictionary 对象来替换这个值。所以我例子中的逻辑是: {columns name: {values you want to replace: values to replace}}

#Day 10 replaceimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.replace({'cylinders' : {3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six', 8 : 'Eight'}}, inplace = True)
mpg.head()

第 11 天:历史

嗯,我想给你介绍一个来自熊猫系列对象的很酷的方法,叫做. hist。

所以,这种方法工作简单;它从您的数字系列对象创建一个直方图。简单吧?

你只需要调用它,它会自动创建你的直方图,就像例子一样。

#Day 11 histimport seaborn as sns
import pandas as pd
mpg = sns.load_dataset('mpg')mpg['mpg'].hist()

第 12 天:拿假人

我想给你介绍一个熊猫的特殊功能,叫做 get_dummies。

从这个例子中,你可能得到它所做的,但对你来说没有;这种方法被称为一个热编码或 OHE。

get_dummies 函数用于基于一个变量中的分类类创建新要素,新要素的值为 0 或 1;0 表示不存在,1 表示存在。

当您需要将分类数据转换为数字数据时,最常用的一种编码方式。

#Day 12 get_dummiesimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
pd.get_dummies(mpg['origin'])

第 13 天:查询

我想给大家介绍一种很酷的数据帧方法,叫做.query

那么,这个方法是干什么的呢?这个方法允许使用字符串表达式进行选择。这是什么意思?

看例子图片,它就像一些有条件的选择,对不对?这是一种基于布尔的选择方法。毕竟。

在示例表中,我们经常需要像mpg[(mpg['mpg'] <=11) & (mpg['origin] == 'usa')]那样为选择指定条件,但是使用 query 这一切都被简化了。只要向方法传递一个字符串条件,我们就会得到相同的选择结果。

#Day 13 queryimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.query("mpg <= 11 & origin == 'usa'")

第 14 天:面膜

我想给大家介绍一个 if-then 方法,叫做. mask。

那么这个方法是干什么的呢?它用于将特定值替换为满足给定条件的另一个值。

在我的例子中,我传递了一个 mpg 值小于 20 的条件,然后用“大于 20”替换它。多酷啊!

#Day 14 maskimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg['mpg'].mask(mpg['mpg'] < 20, 'More than Twenty' )

第 15 天:交叉表

已经完成一半了,所以今天我想向大家介绍一个叫做 crosstab 的表格格式化函数。

那么,这个函数是做什么的呢?这个函数将帮助我们创建一个分类类的数据透视表,使用一个数值列的聚合函数作为值,尽管您也可以创建分类类之间的计数。

看看这个例子,你可以看到我指定了 origin 和 model_year(两者都是分类的)分别作为索引和列。此外,我将 mpg 列作为数值,并使用平均值作为聚合函数。

#Day 15 crosstabimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
pd.crosstab(index = mpg['origin'], columns = mpg['model_year'], values = mpg['mpg'], aggfunc = 'mean' )

第 16 天:申请

熊猫法是我在分析时经常使用的一种方法,我已经习惯了它的简洁。熊猫数据框方法是适用的。

这种方法接受一个函数,并将其应用于整个数据(以行的方式或列的方式)。函数返回的是结果。

看看这个例子,我应用了一个 lambda 函数,它返回每个数据值的长度。

#Day 16 applyimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg['name'].apply(lambda x: len(str(x)))

第 17 天:设置选项

今天我想给你介绍熊猫的一个特殊功能。这个函数被称为。设置选项。

这个功能是什么?所以,这个函数不是直接应用到你的数据上,而是影响到对象本身。

让我们看看下面的例子,我传递字符串来设置笔记本中显示的最大列数和最大行数。你可以在这里阅读所有选项。

希望有帮助!

#Day 17 set_optionimport pandas as pd
import seaborn as sns
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', 50)mpg = sns.load_dataset('mpg')
mpg

第 18 天:描述

我只想向你展示一个来自 Pandas 数据帧对象的最广为人知的方法,叫做.describe

我敢打赌,大多数用 Python 开始数据科学之旅的人都知道这种方法。对于不了解的人来说,这种方法可以生成包含所有基本统计数据的数据框。

虽然,这个 API 里有个小技巧。默认情况下,describe 只计算所有数字列,这些数字列依次为您提供平均值、标准差、百分位数等信息。

但是,如果像示例中那样排除数字列,最终会得到不同的数据框。这一次,将计算非数字列。在这里,我们得到的是频率和顶级类。

#Day 18 describeimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')#Describe numerical columns
mpg.describe()#Describe non-numerical columns
mpg.describe(exclude = 'number')

数字描述

分类描述

第 19 天:因子分解

我想给你介绍一个有用的熊猫函数和称为因式分解的级数方法。

首先看一下这个例子,这里我取了分类变量 origin,并对它使用了因式分解方法。结果如何呢?有两件事,数字数组和独特的类。

那么这种方法有什么特别之处呢?您刚才看到的数字数组是编码为数值的分类变量中的类。如何知道哪个数字代表哪个阶级?这就是为什么我们也有独特的类。

在下面的示例中,0 代表美国,1 代表日本,2 代表欧洲。就像独一无二的位置。

当您需要将分类编码成数值时,这个函数是最有用的,但是其中有一个序数假设。

#Day 19 factorizeimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg['origin'].factorize()

第 20 天:绘图

第 20 天,我要介绍一个来自熊猫的绘图功能,叫做 pd.plotting.radviz。

那么,这个函数是做什么的呢?据 Pandas 称,radviz 允许我们将一个 N 维数据集投影到一个 2D 空间,其中每个维度的影响都可以被解释为所有维度影响之间的平衡。

简单来说,这意味着我们可以用原始的方式将多维数据投影到 2D 空间。

数据帧中的每个系列都表示为一个圆形上均匀分布的切片。只看例子,有一个带系列名称的圆圈。

每个数据点都根据每个系列的值呈现在圆圈中。数据框中高度相关的系列更靠近单位圆。

要使用pd.plotting.radviz,您需要一个多维数据集,其中除了 class 列(应该是 categorical)之外,其他都是数字列。

#Day 20 plotting.radvizimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
pd.plotting.radviz(mpg.drop(['name'], axis =1), 'origin')

第 21 天:散点矩阵

今天我要介绍的是熊猫的另一个绘图功能。这一次,该函数被称为 plotting.scatter_matrix。

这是一个简单的函数,但在我们的数据分析生活中非常有用。主要的事情很简单,它在数据框中的所有数值变量之间创建了一个散点图。

对于对角线位置的图(变量本身)将是一个分布图(直方图或 KDE)。

如何使用该函数很简单,你只需要将数据框变量传递给该函数,它就会自动检测数值列。

#Day 21 scatter_matrix
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as pltmpg = sns.load_dataset('mpg')
pd.plotting.scatter_matrix(mpg, figsize = (8,8))
plt.show()

第 22 天:绘图

我想介绍一个简单的方法,从名为 plotting.boxplot 的 series 对象创建一个 boxplot。

如果你不知道箱线图是什么,引用熊猫指南箱线图是“一种通过四分位数图形化描述数字数据组的方法”。该方框从数据的 Q1 值延伸到第三季度的四分位值,中间有一条线(Q2)。触须从框的边缘延伸出来,以显示数据的范围。默认情况下,它们从盒子的边缘延伸不超过 1.5 * IQR(IQR = Q3-Q1),在该间隔内最远的数据点结束。离群值标为单独的点”。

您只需要传递系列或数据框,数字列就会自动绘制出来。

#Day 22 plotting.boxplotimport pandas as pd
import seaborn as sns
import matplotlib.pyplot as pltmpg = sns.load_dataset('mpg')
pd.plotting.boxplot(mpg['mpg'])

第 23 天:任何

我将向您介绍一个简单而有用的 Series 和 DataFrame 方法。

这是什么方法呢?所以,。any 将返回布尔值,如果任何元素为 True,则返回 True;如果系列或列中没有 True 布尔值,则返回 False。

当我们想检查数据集中是否有缺失值时,这是最有用的。看看这个例子,我们被锁住了。isna with .any。只有马力返回 True,因为此列中缺少数据。

#Day 23 anyimport pandas as pd
import seaborn as sns
import matplotlib.pyplot as pltmpg = sns.load_dataset('mpg')
mpg.isna().any()

第 24 天:哪里

我想向您介绍一个 DataFrame 方法,类似于我之前发布的方法。

因此,与。我之前贴的蒙版方法。基本上,这是一种接受条件的方法,不满足条件的值将被替换。

看看这个例子,我给出了寻找低于 20 的值的标准,任何低于 20 的值都将保持它们的值,否则,它将被替换为“大于 20”。

#Day 24 whereimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg['mpg'].where(mpg['mpg'] < 20, 'More than Twenty' )

第 25 天:换位

今天我将向你展示一个简单而有用的方法。转置或. t。

这个方法很简单,通过执行。转置方法我们将切换数据帧列成为索引,而索引将成为数据帧列。

看看这个例子,我们有一个数据框,所有的位置都被调换了。当我们希望我们的行变成列时,这个函数很有用,反之亦然。

希望有帮助!

#Day 25 transposeimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.transpose() 
#or mpg.T

第 26 天:阴谋.散布

今天我想介绍一个熊猫数据帧对象的快速绘图方法,名为 plot.scatter。

我相信很多人都知道散点图是什么,虽然对你来说谁也不知道;它基本上是一个图,我们在 2 个不同的数字列中绘制每个数据,其中的值在图中是可视化的。

我们可以通过在数据框对象中使用. plot.scatter 创建一个快速散点图,并传递您想要的 2 列名称。

#Day 26 plot.scatterimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg.plot.scatter('mpg', 'weight')

第 27 天:转变

今天要介绍一个来自 Series 和 Data Frame 对象的方法,叫做.transform

这是一个简单的功能,但功能强大。此函数的主要前提是我们传递一个函数或聚合字符串名称,并且该函数应用于所有的值。

如果在 DataFrame 对象中使用它,该函数将应用于每列中的每个值。

#Day 27 transformimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
mpg['mpg'].transform(lambda x: x/2)

第 28 天:自举 _ 情节

今天我要介绍一个熊猫独有的绘图功能,叫做.bootstrap_plot

根据 Pandas 的说法,bootstrap 图用于通过依赖带有替换的随机抽样来估计统计的不确定性。

简而言之,它用于通过替换重新采样数据(您可以多次采样相同的数据)来尝试确定基本统计数据(如平均值和中值)中的不确定性。

boostrap_plot函数将为给定数量和给定大小的样本生成均值、中值和中间值统计的自举图。就像下面的例子一样。

#Day 28 bootstrap_plot
import pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
pd.plotting.bootstrap_plot(mpg['mpg'], size = 50, samples = 500)
plt.show()

第 29 天:烟斗

在今天的熊猫贴子里,我想介绍一个我鼓励大家多使用的方法。方法是. pipe。

所以,熊猫鼓励我们使用方法链来操作我们的数据。通常我们会通过在函数或方法后面传递函数来链接方法。

与。管道函数,Pandas DataFrame 中的链接方法可以减少我们编写的行数并更快地执行函数。

的示例。管道方法如下图。我创建了两个不同的函数,并通过执行。管两次。这是为了创建一个链方法和更快的执行。

#Day 29 pipeimport pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')#Function to extract the car first name and create a new column called car_first_name
def extract_car_first_name(df):df['car_first_name'] = df['name'].str.split(' ').str.get(0)return df#Function to add my_name after the car_first_name and create a new column called car_and_name
def add_car_my_name(df, my_name = None):df['car_and_name'] = df['car_first_name'] + my_namempg.pipe(extract_car_first_name).pipe(add_car_my_name, my_name = 'Cornellius')mpg.head()

第 30 天:显示版本

在最后一天,我想向你们展示熊猫的一个特殊功能,叫做。显示版本。这个函数是做什么的?

这个函数给我们提供关于主机操作系统,熊猫版本,以及其他相关软件包版本的信息。它提供了有用的信息,尤其是当您处理相关的包时,并且对于 bug 报告也很重要。

#Day 30 show_versionsimport pandas as pdpd.show_versions(True)

结论

所以。这就是我的熊猫 30 天帖子。对我来说,这是一个非常有趣和有见地的活动。我喜欢为人们创造这样的内容,我希望它对我接触到的任何人都有用。

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

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

掌握熊猫的 30 个例子

原文:https://towardsdatascience.com/30-examples-to-master-pandas-f8a2da751fa4?source=collection_archive---------2-----------------------

学习熊猫的综合实践指南

照片由恒电影在 Unsplash 拍摄

Pandas 是一个广泛使用的 Python 数据分析和操作库。它提供了许多加快数据分析和预处理步骤的功能和方法。

由于它的流行,有许多关于熊猫的文章和教程。这一个将会是其中之一,但是非常注重实际的一面。我将在 Kaggle 上的客户流失数据集上做例子。

这些示例将涵盖您可能在典型的数据分析过程中使用的几乎所有函数和方法。

让我们从将 csv 文件读入熊猫数据帧开始。

import numpy as np
import pandas as pddf = pd.read_csv("/content/churn.csv")df.shape
(10000,14)df.columns
Index(['RowNumber', 'CustomerId', 'Surname', 'CreditScore', 'Geography', 'Gender', 'Age', 'Tenure', 'Balance', 'NumOfProducts', 'HasCrCard','IsActiveMember','EstimatedSalary', 'Exited'], dtype='object')

1。删除列

drop 函数用于删除列和行。我们传递要删除的行或列的标签。

df.drop(['RowNumber', 'CustomerId', 'Surname', 'CreditScore'], axis=1, inplace=True)df.shape
(10000,10)

axis 参数设置为 1 表示删除列,设置为 0 表示删除行。将 inplace 参数设置为 True 以保存更改。我们删除了 4 列,所以列数从 14 列减少到了 10 列。

2.阅读时选择特定的列

我们只能从 csv 文件中读取一些列。读取时,列的列表被传递给 usecols 参数。如果您事先知道列名,这比以后再删除要好。

df_spec = pd.read_csv("/content/churn.csv", usecols=['Gender', 'Age', 'Tenure', 'Balance'])df_spec.head()

(图片由作者提供)

3.读取数据帧的一部分

read_csv 函数允许按照行读取数据帧的一部分。有两个选择。第一个是读取前 n 行。

df_partial = pd.read_csv("/content/churn.csv", nrows=5000)df_partial.shape
(5000,14)

使用 nrows 参数,我们创建了一个包含 csv 文件前 5000 行的数据帧。

我们还可以使用 skiprows 参数从文件的末尾选择行。Skiprows=5000 意味着我们在读取 csv 文件时将跳过前 5000 行。

4.样品

创建数据帧后,我们可能想要绘制一个小样本来工作。我们可以使用 n 参数或 frac 参数来确定样本大小。

  • n:样本中的行数
  • frac:样本大小与整个数据框架大小的比率
df_sample = df.sample(n=1000)
df_sample.shape
(1000,10)df_sample2 = df.sample(frac=0.1)
df_sample2.shape
(1000,10)

5.检查缺少的值

isna 函数确定数据帧中缺失的值。通过将 isna 与 sum 函数结合使用,我们可以看到每一列中缺失值的数量。

df.isna().sum()

(图片由作者提供)

没有丢失的值。

6.使用 loc 和 iloc 添加缺失值

我做这个例子是为了练习“loc”和“iloc”。这些方法基于索引或标签选择行和列。

  • loc:使用标签选择
  • iloc:带索引选择

让我们首先创建 20 个随机指数来选择。

missing_index = np.random.randint(10000, size=20)

我们将使用这些索引将一些值更改为 np.nan(缺失值)。

df.loc[missing_index, ['Balance','Geography']] = np.nan

“余额”和“地理位置”列中缺少 20 个值。让我们用索引代替标签来做另一个例子。

df.iloc[missing_index, -1] = np.nan

“-1”是“已退出”的最后一列的索引。

尽管我们对 loc 和 iloc 使用了不同的列表示,但是行值没有改变。原因是我们正在使用数字索引标签。因此,行的标签和索引是相同的。

丢失值的数量已更改:

(图片由作者提供)

7.填充缺失值

fillna 函数用于填充缺失的值。它提供了许多选项。我们可以使用特定的值、聚合函数(例如平均值),或者前一个或下一个值。

对于 geography 列,我将使用最常见的值。

(图片由作者提供)

mode = df['Geography'].value_counts().index[0]
df['Geography'].fillna(value=mode, inplace=True)

(图片由作者提供)

同样,对于 balance 列,我将使用该列的平均值来替换缺失的值。

avg = df['Balance'].mean()
df['Balance'].fillna(value=avg, inplace=True)

fillna 函数的 method 参数可用于根据列中的上一个或下一个值填充缺失值(例如 method='ffill ')。这对于序列数据(例如时间序列)非常有用。

8.删除丢失的值

处理缺失值的另一种方法是删除它们。“已退出”列中仍有缺失值。下面的代码将删除任何缺少值的行。

df.dropna(axis=0, how='any', inplace=True)

轴=1 用于删除缺少值的列。我们还可以为一列或一行所需的非缺失值的数量设置一个阈值。例如,thresh=5 意味着一行必须至少有 5 个非缺失值才不会被删除。缺少 4 个或更少值的行将被删除。

dataframe 现在没有任何缺失值。

df.isna().sum().sum()
0

9.基于条件选择行

在某些情况下,我们需要符合某些条件的观察值(即行)。例如,下面的代码将选择居住在法国的客户。

france_churn = df[(df.Geography == 'France') & (df.Exited == 1)]france_churn.Geography.value_counts()
France    808

10.用查询描述条件

查询函数提供了一种更灵活的传递条件的方式。我们可以用字符串来描述它们。

df2 = df.query('80000 < Balance < 100000')

让我们通过绘制余额柱的直方图来确认结果。

df2['Balance'].plot(kind='hist', figsize=(8,5))

(图片由作者提供)

11.用 isin 描述条件

条件可能有几个值。在这种情况下,最好使用 isin 方法,而不是单独写入值。

我们只是传递一个所需值的列表。

df[df['Tenure'].isin([4,6,9,10])][:3]

(图片由作者提供)

12.groupby 函数

Pandas Groupby 函数是一个多功能且易于使用的函数,有助于获得数据的概览。这使得探索数据集和揭示变量之间的潜在关系变得更加容易。

我们将做几个 groupby 函数的例子。先说一个简单的。下面的代码将根据地理-性别组合对行进行分组,然后给出每组的平均流失率。

df[['Geography','Gender','Exited']].groupby(['Geography','Gender']).mean()

(图片由作者提供)

13.通过 groupby 应用多个聚合函数

agg 函数允许对组应用多个聚合函数。函数列表作为参数传递。

df[['Geography','Gender','Exited']].groupby(['Geography','Gender']).agg(['mean','count'])

(图片由作者提供)

我们可以看到每个组中的观察计数(行)和平均流失率。

14.对不同的组应用不同的聚合函数

我们不必对所有列应用相同的函数。例如,我们可能希望看到每个国家的平均余额和客户总数。

我们将传递一个字典,指示哪些函数将应用于哪些列。

df_summary = df[['Geography','Exited','Balance']].groupby('Geography')\
.agg({'Exited':'sum', 'Balance':'mean'})df_summary.rename(columns={'Exited':'# of churned customers', 'Balance':'Average Balance of Customers'},inplace=True)df_summary

(图片由作者提供)

我还重命名了这些列。

编辑 :感谢罗恩在评论区的提醒。NamedAgg 函数允许重命名聚合中的列。语法如下:

df_summary = df[['Geography','Exited','Balance']].groupby('Geography')\
.agg(Number_of_churned_customers = pd.NamedAgg('Exited', 'Sum'),Average_balance_of_customers = pd.NamedAgg('Balance', 'Mean')
)

15.重置索引

您可能已经注意到,groupby 返回的数据帧的索引由组名组成。我们可以通过重置索引来改变它。

df_new = df[['Geography','Exited','Balance']]\
.groupby(['Geography','Exited']).mean().reset_index()df_new

(图片由作者提供)

编辑 :感谢罗恩在评论区的提醒。如果我们将 groupby 函数的 as_index 参数设置为 False,那么组名将不会用作索引。

16.用 drop 重置索引

在某些情况下,我们需要重置索引,同时删除原始索引。考虑从数据帧中抽取样本的情况。该示例将保留原始数据帧的索引,因此我们希望重置它。

df[['Geography','Exited','Balance']].sample(n=6).reset_index()

(图片由作者提供)

索引被重置,但原始索引作为新列保留。我们可以在重置索引时删除它。

df[['Geography','Exited','Balance']]\
.sample(n=6).reset_index(drop=True)

(图片由作者提供)

17.将特定列设置为索引

我们可以将数据帧中的任何一列设置为索引。

df_new.set_index('Geography')

(图片由作者提供)

18.插入新列

我们可以向数据帧添加一个新列,如下所示:

group = np.random.randint(10, size=6)
df_new['Group'] = groupdf_new

(图片由作者提供)

但是新列被添加在末尾。如果想把新列放在特定的位置,可以使用 insert 函数。

df_new.insert(0, 'Group', group)df_new

(图片由作者提供)

第一个参数是位置的索引,第二个是列的名称,第三个是值。

19.where 函数

它用于根据条件替换行或列中的值。默认的替换值是 NaN,但是我们也可以指定替换值。

考虑上一步中的数据帧(df_new)。对于属于小于 6 的组的客户,我们希望将余额设置为 0。

df_new['Balance'] = df_new['Balance'].where(df_new['Group'] >= 6, 0)df_new

(图片由作者提供)

符合指定条件的值保持不变,其他值被指定的值替换。

20。排名函数

它给这些值分配一个等级。让我们创建一个根据客户余额对客户进行排名的列。

df_new['rank'] = df_new['Balance'].rank(method='first', ascending=False).astype('int')df_new

(图片由作者提供)

method 参数指定如何处理具有相同值的行。“第一个”意味着根据它们在数组(即列)中的顺序对它们进行排序。

21.列中唯一值的数量

在处理分类变量时,这很方便。我们可能需要检查唯一类别的数量。

我们可以检查由 value counts 函数返回的序列的大小,或者使用 nunique 函数。

(图片由作者提供)

22.内存使用

这是由 memory_usage 函数简单完成的。

(图片由作者提供)

这些值以字节为单位显示使用了多少内存。

23.类别数据类型

默认情况下,分类数据与对象数据类型一起存储。但是,这可能会导致不必要的内存使用,尤其是当分类变量的基数较低时。

低基数意味着与行数相比,一列只有很少的唯一值。例如,geography 列有 3 个唯一值和 10000 行。

我们可以通过将它的数据类型改为“类别”来节省内存。

df['Geography'] = df['Geography'].astype('category')

(图片由作者提供)

地理列的内存消耗减少了近 8 倍。

24.替换值

replace 函数可用于替换数据帧中的值。

(图片由作者提供)

第一个参数是要替换的值,第二个参数是新值。

我们可以用字典做多次替换。

(图片由作者提供)

25.绘制直方图

Pandas 不是一个数据可视化库,但它使创建基本绘图变得非常简单。

我发现用熊猫创建基本图比使用额外的数据可视化库更容易。

让我们创建一个余额柱状图。

df['Balance'].plot(kind='hist', figsize=(10,6), 
title='Customer Balance')

(图片由作者提供)

由于 pandas 不是一个数据可视化库,所以我不想详细介绍绘图。然而,图函数能够创建许多不同的图,如折线图、条形图、kde 图、面积图、散点图等。

26.减少浮点数的小数点

熊猫可能会为浮动显示过多的小数点。我们可以使用 round 函数轻松调整它。

df_new.round(1) #number of desired decimal points

(图片由作者提供)

27.更改显示选项

我们可以更改各种参数的默认显示选项,而不是每次都手动调整显示选项。

  • get_option:返回当前选项
  • set_option:更改选项

让我们将小数点的显示选项改为 2。

pd.set_option("display.precision", 2)

(图片由作者提供)

您可能希望更改的其他一些选项有:

  • max_colwidth:列中显示的最大字符数
  • max_columns:要显示的最大列数
  • max_rows:要显示的最大行数

28.通过列计算百分比变化

pct_change 用于通过系列中的值计算百分比变化。它在计算时间序列或连续元素数组中的变化百分比时非常有用。

(图片由作者提供)

从第一个元素(4)到第二个元素(5)的变化是%25,因此第二个值是 0.25。

29.基于字符串的过滤

我们可能需要根据文本数据(如客户姓名)过滤观察结果(行)。我已经向 df_new 数据帧添加了虚构的名称。

(图片由作者提供)

让我们选择客户名称以“Mi”开头的行。

我们将使用 str 访问器的 startswith 方法。

df_new[df_new.Names.str.startswith('Mi')]

(图片由作者提供)

endswith 函数根据字符串末尾的字符进行同样的过滤。

熊猫可以用绳子做很多操作。如果你想进一步阅读,我有一篇关于这个主题的单独文章。

[## 熊猫 5 个必知的串线操作

熊猫让字符串操作变得简单

towardsdatascience.com](/5-must-know-pandas-operations-on-strings-4f88ca6b8e25)

30.设计数据框架的样式

我们可以通过使用返回一个 styler 对象的 Style 属性来实现这一点,它为格式化和显示数据帧提供了许多选项。例如,我们可以突出显示最小值或最大值。

它还允许应用自定义样式功能。

df_new.style.highlight_max(axis=0, color='darkgreen')

(图片由作者提供)

如果你想进一步阅读的话,我有一篇关于设计熊猫数据框架的详细文章。

[## 设计你的熊猫数据框

让我们创造出比简单数字更多的东西。

towardsdatascience.com](/style-your-pandas-dataframes-814e6a078c6d)

结论

我们已经介绍了大量的数据分析功能和方法。当然,熊猫提供的还有很多,但不可能在一篇文章中涵盖所有内容。

随着您继续使用 pandas 进行数据分析任务,您可能会发现新的功能和方法。如同任何其他科目一样,熟能生巧。

我想分享另外两个帖子,它们涵盖了与这篇帖子不同的操作。

  • 20 分掌握熊猫时间序列分析
  • Pandas 特定于类型的操作:访问器

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

编码前要问的 30 个问题

原文:https://towardsdatascience.com/30-questions-to-ask-before-you-code-5f2c486641b0?source=collection_archive---------31-----------------------

入门

在为我的下一个数据科学工程项目编码之前,我会问这些问题。

照片来自像素上的棉花兄弟

我是一名软件工程师和数据科学家,在笔记本和软件包中编写代码。编码时最难学的一课是"在写代码之前先停下来想一想。投入到编码中感觉很棒,但是你可能会错过更大的画面或者基于当前假设的项目的一个重要方面。软件工程和数据科学可以带来令人兴奋的项目组合,包括数据清理、自动化、开发运维、分析开发、工具等等。一些项目可以很容易地跨越几个不同的领域。从最初的工作中退一步,开始思考手头的问题,这是很有价值的。至此,我想向你介绍我在着手一个新项目之前考虑的 30 个常见问题。

用例:过去、现在和未来

我想考虑的第一个领域是用例。当我着手一个项目时,我可能只知道最初的用例,但是在与其他涉众、客户或团队成员交谈后,可能会有更多的用例。

1\. Sit down and think about your current use case. How would you design the code for this use case? 
2\. If there are past use cases you can examine, would you design the code differently to accommodate those?
3\. Are there potential future use cases that may differ from your past and present cases? How would these change the way you develop your code? 
4\. Thinking about your code structure, sit down, and discuss it with one or more other developers. Would they approach the problem differently? Why?
5\. As you develop your code, consider how it can expand in the future. Would that be an easy feat, or will it be hard to accomplish? How can you make it more reusable or repeatable?

数据采集和清理

在理解了项目可能的用例之后,下一个要考虑的领域是数据获取和清理。根据您使用的数据,您可能需要考虑如何在工作中吸收、清理和利用这些数据。

6\. What data is required for this project to be successful? 
7\. Do you need more than one dataset that requires some aggregation, or will you utilize one dataset? Do you need to get this data yourself? If so, how will you get this data? 
8\. Will your code handle the I/O in your Python package or within a separate notebook that runs the code? 
9\. Will you interface with another team that already gives you access through a database or API? 
10\. Are there any processes you need to develop around the acquisition or cleaning this data that will ease the process? 
11\. What format is your data? Does this format matter to your code?

自动化、测试和 CI/CD 管道

在理解了我的项目的用例以及你需要什么数据之后,我想回答的下一个问题是关于过程的自动化。我喜欢尽我所能实现自动化,因为这可以让我专注于其他工作。考虑使用可以根据需要运行的快速脚本来自动化代码的不同部分,创建按计划运行的作业,或者利用 CI/CD 管道来执行部署等日常任务。

12\. Should the output of the work get created regularly? Will, you ever need to repeat your analysis or output generation?
13\. Does the output get used in a nightly job, a dashboard, or frequent report? 
14\. How often should the output be produced? Daily? Weekly? Monthly? 
15\. Would anyone else need to reproduce your results?
16\. Now that you know your code structure, does it live in a notebook, standalone script, or within a Python package? 
17\. Does your code need to be unit tested for stability?
18\. If you need unit testing for your Python package, will you set up a CI/CD pipeline to run automated testing of the code? 
19\. How can a CI/CD pipeline help ensure your work is stable and doing as expected? 
20\. If you are creating an analytic, do you need to develop metrics around the analytics to prove they produce the expected results?
21\. Can any aspect of this work be automated?

可重用性和可读性

我关注的最后一组问题集中在代码的可重用性和可读性上。你的团队中会不会有新人捡起你的代码,学习它,并快速使用它?

我喜欢写文档,这意味着我的代码通常会被很好地注释,并附有如何运行它的例子。当引入新的开发者时,添加文档、例子和教程是非常有用的,因为他们可以很快加入进来,并感觉他们正在很快做出贡献。没有人喜欢花很长时间去理解事情,并感觉自己在为团队做贡献。

就可重用性而言,这是您的用例可以派上用场的地方。如何在你的用例中使用你的代码,但又足够一般化,让其他人从你停止的地方继续,并在他们的用例中使用它。

22\. You have looked at your use cases. Can you standardize the classes or methods to fit the code's expansion? 
23\. Is it possible to create a standardized library for your work?
24\. Can you expand your work to provide a utility or tool to others related to this work?
25\. As you write code, is it clear to others what the code is doing? 
26\. Are you providing enough documentation to quickly onboard a new data scientist or software developer?

代码审查

最后,还有代码审查。在开始编码之前考虑代码评审似乎有点奇怪,但是让我们后退一步。在你的评估或经常性的讨论中,你会遇到一些常见的问题吗?思考这些案例,并在开发代码时利用它们。从过去关于代码实现的评论中学习,并不断发展您的技能。

27\. Do you need to have a code review for your project? 
28\. If so, what comments do you anticipate getting on your work? 
29\. Who can you meet with before the code review to discuss architecture or design decisions? 
30\. What comments are you required to address, and what comments can you use for later investigation?

摘要

总的来说,这听起来可能很多,但这 30 个问题是思考如何设计下一个数据科学工程项目的好方法。当你回顾过去时,你在开始一个新项目之前会考虑哪些事情?我关注五个方面:

  • 确定此项目工作存在哪些用例。
  • 了解所需的数据采集和清理。
  • 研究在您的流程中添加自动化、测试和 CI/CD 管道的可能性。
  • 努力使您的代码可读和可重用,以便快速加入新的团队成员,并使代码在以后的阶段易于扩展。
  • 利用代码评审的优势,并从中学习。

产品分析数据治理的 31 个最佳实践

原文:https://towardsdatascience.com/31-best-practices-for-product-analytics-data-governance-d03f23b0e841?source=collection_archive---------24-----------------------

来源: 坎瓦

当您组织的分析能力成熟时,数据治理的实施至关重要。一个目的是用可信的数据促进更快的决策。这是我们在这篇文章中关注的目标。

这篇文章将分享你的产品分析数据的数据治理最佳实践。结构如下:

  • 定义角色和职责
  • 分享治理的最佳实践和指导原则
  • 执行治理策略和流程

随着数据量的增加和访问规模的扩大,实现这一目标变得更加困难。因此,尽快建立您的治理策略非常重要。

在 Cornerstone 的产品分析工具中,有一款产品的参与度高于预期。这些增加的参与人数转化为成功。因此,他们在商业评论中被介绍给领导层。这些数字如此突然地上升,确实令人感到奇怪。所以我们深入调查了一下。

当我们映射事件触发器时,我们注意到有些事件会触发两次。我们了解到,两个独立的团队以两种方式测试了同一个事件。一个来自前端,另一个来自后端。

每个团队都有不同但有效的理由来衡量同一事件。前端仪器测量用户参与度。后端检测跟踪成功/失败的方法调用。

我们要求后端团队更改活动名称。我们还要求他们提供触发事件的描述,以及应该如何解释数据。

如您所见,该解决方案非常简单,与分类相关。但是,令人头痛的问题已经存在了——对更高参与度的错误警报和对现实的模糊理解。如果根据这些数据做出决策,就会产生相关成本。

角色和责任:数据治理的“谁是谁”

A 在你的组织中给个人分配角色可以防止分析的狂野西部。大多数分析平台指导如何分配角色。而且,如果你有一个客户成功经理,她将能够帮助你在你的组织中找到合适的人。

本·斯威特在 Unsplash 上的照片

管理员

根据策略,您可能有一个或多个系统管理员。管理员负责:

  • 确保数据系统的连续运行
  • 设置访问和权限
  • 发布功能并传播新功能
  • 传达系统状态,如维护窗口、停机或策略更改

数据架构师

数据架构师将设计如何创建、管理和使用产品数据。这个角色有点宽泛,但是对于组织中适当的数据管理非常重要。

建筑师处理:

  • 管理数据结构
  • 设定术语和报告标准
  • 指导解决数据质量问题
  • 指导如何使用可用数据。
  • 负责变更管理,并就此类流程和结构的任何变更进行沟通

在某些情况下,架构师与管理员是同一个人。

理事

管理者是执行既定政策的个人。州长的主要职责是:

  • 确保所有贡献或使用数据的个人都遵守法规
  • 咨询数据架构师和经理,进行必要的策略更改
  • 针对任何不合规或政策变更实施补救流程

需要做出一个组织决策。州长在执法中应该扮演积极还是消极的角色?拥有专用资源的管理者将从积极的执行中受益。在许多情况下,州长已经有了一大堆的职责。在这种情况下,他们可能想要一个更被动的角色。

在实现 Amplitude 时,我的团队以积极的治理姿态开始。当项目经理建立他们的分类法时,我们有一个咨询和批准过程。这发生在他们把他们的提议变成用户故事之前。在我的团队批准之前,没有事件被检测。这确保了更干净和可靠的数据。

不幸的是,我的团队(三个人)花了很多时间来咨询和批准 30 多个 pm 的仪器。我们转向了一种被动的方法,允许团队检测和发布。然后,当数据被捕获时,我们将定期(两周一次)审查分类法。代价是我们会不时地捕捉不符合规范的事件。每当发生这种情况,我们都会执行补救过程(也是治理文档的一部分)。

经理和成员

经理和会员是产品分析数据的主要消费者。这些角色的需求围绕着报告和洞察生成。它们将是:

  • 根据现有数据进行分析
  • 从可用数据创建报告
  • 在报告或仪表板上共享和协作
  • 创建报告集合或组织数据

对于经理来说,关键的区别在于扩充分类法的能力。经理可以创建新事件或对分类进行更改。

在 Cornerstone,我们分配 PMs 经理角色。我们希望他们拥有各自产品的工具和分类法。UX/用户界面设计师是成员,因为他们可以创建洞察力,但不需要对数据结构进行更改。

观看者

视图通常是为仪表板和报告的纯粹消费者保留的。他们很少制作图表和进行分析。相反,他们在感兴趣的任何时候都会收到链接或读数。

在 Cornerstone,我们将观众权限分配给客户成功和营销等团队。在理想情况下,这些团队可以是成员。但是我们需要在允许他们分析能力之前,训练他们什么数据是可用的和正确的解释。

数据治理最佳实践

在构建治理策略时,有许多可能的领域需要关注。这些包括安全性、隐私、有效的存储/仓储等。提醒一下,我们这里的重点是用可信的数据帮助更快地做出决策

照片由马丁·亚当斯在 Unsplash 上拍摄

根据经验,以下领域是组织治理文档的好方法:

1.访问和权限

以下最佳实践适用于上述角色定义。支持变更是指以任何方式改变数据分类或管理系统的能力。

  • 将访问权限与一个人的工作和需求相匹配。
  • 有一个请求更多权限的正当程序。
  • 保守提供变更授权权限。
  • 就正确管理培训变革授权角色。
  • 首先从直属团队开始。
  • 有一个常规的撤销和降级流程。

2.分类定义和管理

分类法是被度量的东西、如何被度量以及为什么被度量的官方记录。定义良好的分类法增加了分析和决策的信心。

  • 标准化命名和语法
  • 注重可读性和可报道性。
  • 使字段和事件名称具有描述性。
  • 需要一个清晰的定义——它是如何产生和解释的。
  • 建立分类审核流程。
  • 强制合规并执行补救措施。
  • 建立变更管理流程。
  • 定义负责沟通变更的人员。

3.质量和信任

在数据被捕获和报告的过程中,质量和信任关系到数据。质量被定义为完整性和与其目的(计划、决策等)的相关性。).信任围绕着准确性、精确性和整体一致性。

  • 检查错误日志,确保数据质量和完整性。
  • 定期审计数据的使用和生成
  • 推荐数据完整性审计
  • 定义数据完整性的流程/清单
  • 定期审核“适当”分析报告
  • 针对质量或信任问题制定沟通计划
  • 注意盲点和重复计算

4.标准流程

治理关注使数据对组织有用的构造和契约。流程确保我们达到预期和标准。下面是您可能想要定义的一些流程。

  • 审核流程以确保上述领域的合规性
  • 促进遵守的补救程序
  • 公告和变更的常规沟通流程
  • 传福音节奏传播意识和用法
  • 定期架构审查
  • 业务影响审查
  • 定额或预算评审

5.数据集成和导出

当产品分析数据与其他数据源(运营和经验)混合时,它最有价值。因此,与其他数据系统集成和导出以进行混合是组织的关键功能。

  • 列出未来可能的整合需求
  • 了解数据导出选项和限制
  • 构建数据结构以简化集成

执行您的治理

政府政策和流程只有在可见、已知、可执行和最新的情况下才有价值。

调整政策和流程,使其有效运作。(来源:坎瓦)

传播

在易于访问的资源中编写治理策略和过程。无论是可共享的 PDF 还是全球可用的链接,请确保那些有权访问您的数据的人也有权访问文档。

一旦这些都写好了,就在所有适用的频道上大肆宣扬,以确保每个人都知道它们。

在 Cornerstone,我们将政策存储在一个集中的维基页面中。我们通过电子邮件和所有与分析相关的 Slack 渠道与产品和工程团队分享了这一点。

培养

在您共享文档之后,安排一个时间向接收者展示并讨论治理策略。治理文档是活的文档,应该随着组织的需求而变化。

将讨论作为测试策略和流程的一种方式。寻找机会使政策更加有效和简化。

更新

继续最后一段,不断寻找改进政策和简化流程的方法。随着组织的成熟,你也许可以放宽某些政策。

另一方面,您可能会发现您需要增加治理或者改变其他领域的行为。如有必要,接受调整。

结论

D 数据治理可能不是转型变革中最激动人心的部分。但是,确保您的所有其他投资(文化、数据系统、分析培训)都有回报是至关重要的。

正确的策略和流程可以确保数据可靠,并由正确的受众处理。编写这些治理文档不需要很多时间。但这确实需要开放的心态和灵活性,不断调整以使他们为一个组织工作。

如果您希望我详细说明或提供特定最佳实践的示例,请给我留言!

投资于你的战略技能。在这里注册订阅我的时事通讯。

面试准备的数据科学问题(机器学习概念)——第一部分

原文:https://towardsdatascience.com/33-data-science-questions-for-interview-prep-machine-learning-concepts-6b1718397431?source=collection_archive---------47-----------------------

这两部分系列的这一部分包括模型评估技术、正则化技术、逻辑回归和偏差方差权衡。

我最近在 Youtube 上看完了这个机器学习播放列表(Josh Starmer 的 stat quest),并想到将每个概念总结成一个 Q/A。随着我为更多的数据科学面试做准备,我认为这将是一个很好的练习,以确保我在面试中清晰简洁地交流我的想法。如果我没有很好地解释任何概念,请在评论中告诉我。

注意:本文的目的不是向初学者教授一个概念。它假设读者在数据科学概念方面有足够的背景知识。如果你刚刚开始学习 ML,我强烈推荐你去 Youtube 上看看 StatQuest,这是我的最爱之一。

1.什么是交叉验证?什么时候用?我们可以使用交叉验证来调整模型参数吗?交叉验证有哪些类型?

交叉验证是一种模型评估技术,我们将给定的数据集分成不同的折叠,比如说 5 个,然后迭代地使用 4 个折叠进行训练,1 个折叠进行验证。使用这种技术的目的是检查模型对不同的训练集和测试集组合的稳健性。它还用于比较两个模型,看哪一个整体性能更好。

是的,我们可以使用交叉验证来调整模型参数。还有一种更常用的 N 重交叉验证,去掉一个交叉验证,取一个样本作为测试集,其余的作为训练集。

2.什么是混淆矩阵?

混淆矩阵是我们用于分类问题的另一种模型评估技术。在这种技术中,我们制作一个 NxN 矩阵,其中 N 是要预测的不同类别的数量,因此对于二进制分类问题,N=2。我们在 X 轴上有实际值,在 Y 轴上有预测值。模型评估是基于由此产生的一些指标完成的,如特异性、敏感性、精确度和召回率。

来源

3.我们如何定义灵敏度、特异性和精确度?

灵敏度、回忆、功效或真阳性率是真阳性与阳性总数的比率。对于给定的分类问题,它告诉我们从所有阳性中正确分类的阳性的比例。

特异性或真阴性率是真阴性与总阴性的比率。它告诉我们正确分类的否定在所有否定中所占的比例。

精确度是真阳性与所有预测为阳性的病例的比例

4.什么是 F 分数?

f 分数是测试二元分类准确性的一种度量。这是精确和回忆的调和平均值。F 值取 0 到 1 之间的值,F 值越高,分类模型的能力越强。

5.我们什么时候用 ROC 和 AUC?它们代表什么?为什么我们要用 ROC 曲线?

ROC 曲线绘制了真阳性率(灵敏度)对假阳性率(1-特异性)。ROC 曲线用于参数调整。假设我们有一个逻辑回归模型,我们不知道使用什么阈值来分类真阳性和真阴性,那么在这种情况下,为每个阈值生成混淆矩阵可能是一个繁琐的过程,以决定使用哪个阈值。因此,我们制作 ROC 曲线,根据最适合我们的真阳性率和假阳性率来决定使用哪个阈值。我们用 AUC 来决定哪个模型更好。具有最大曲线下面积的模型是最佳模型。

6.偏差-方差权衡是什么?

在理解偏差和方差之间的权衡之前,让我们试着理解偏差和方差的含义:

偏差是指通过一个简单得多的模型[1] 来近似一个可能极其复杂的现实生活问题而引入的误差

另一方面,方差是如果我们使用不同的训练集对预测值 y-hat 进行估计,预测值 y-hat 将会改变的量[2]

偏差方差权衡有助于我们决定模型与训练集和测试集的匹配程度。完全符合训练集但在测试集上表现很差的模型被称为具有高方差,而符合测试集但不符合训练集的模型被称为具有高偏差。

7.赔率和概率有什么区别?各自是如何定义的?对数与逻辑回归有什么关系?

几率是某事发生与某事不发生的比率,而概率是某事发生与可能性总数的比率。

逻辑回归中的概率建模为

如果我们变换这个方程,使它在 X 轴上是线性的,我们会得到这样的结果

其中左边代表对数(赔率)

8.什么是逻辑回归?解释逻辑回归和线性回归的区别?

逻辑回归是一种机器学习技术,它根据一组观察到的 X 变量对响应 Y 属于特定类别的概率进行建模。概率由逻辑函数建模,其写作如下

线性回归用于预测持续反应,而逻辑回归用于分类。

9.比较线性回归和逻辑回归的系数。

简单线性回归的等式可以写成 Y = b0 + b1*X,其中 b1 表示 X 增加 1 个单位时 Y 的平均增加量,b0 是 Y 截距。

逻辑回归的方程式可以写成

这个方程表示一条 S 形曲线,为了将这个方程形象化为一条直线,我们可以对逻辑函数进行一些处理,得到

左边的函数表示对数(赔率),右边的方程现在是 x 的线性方程。因此,在逻辑回归的情况下,x 增加 1 个单位,对数(赔率)增加β1,或者相当于赔率乘以 e^β1.

然而,在线性回归和逻辑回归两种情况下,β1 的正值与 Y 的增加相关,在线性回归的情况下与 log(odds)相关,在逻辑回归的情况下与 Y 的增加相关。

10.解释最大似然法?为什么我们使用最大似然法而不是最小二乘法来计算逻辑回归的系数?

这是一种技术,用于估计最佳描述给定数据的分布的未知参数。可能性的等式是

其中θ是未知参数,x1,x2,…,xn 是数据点

逻辑函数是非线性函数,用 S 形曲线表示。现在,为了计算最小二乘,我们需要拟合一条线,使每个数据点到这条线的平方距离之和最小。因为计算 S 形曲线的残差更加复杂,所以最适合的方法是似然法,这是一种参数估计技术。

11.概率和似然的区别是什么?

概率和可能性虽然经常互换使用,但在某些情况下是不同的。在离散的情况下,它们代表相同的东西,但在连续分布的情况下,它们的意义完全不同。

在连续场景中,概率为**(数据|分布),读作数据给定分布**,而似然为(分布|数据),读作分布给定数据。

让我们从概率开始,每当我们被问到连续分布的概率时,它就是曲线下的面积。简而言之,给我们一个分布,曲线下的面积帮助我们找到在某个范围内观察到某个值的概率,即 P(数据|分布)。下图显示了代表篮球运动员身高的正态分布,平均值= 6.583,标准差= 0.3。曲线下的面积给出了 P(身高介于 6.7 & 6.9 |平均值= 6.583 &标准差= 0.3)

然而,在可能性的情况下,我们被给定一个数据集,我们的工作是找到最佳描述给定数据集的分布的参数,即 L(分布|数据)。我们通过对每个参数(平均值、标准偏差)取似然函数的导数来做到这一点,直到我们找到最大化似然函数的参数。在下图中,橙色分布底部的 x 表示我们要估计其平均值和标准差的给定样本集。因此,我们首先假设均值和标准差的值,并继续这一过程,直到我们找到一个分布,在这种情况下是橙色分布,它最大化了似然函数 **L(均值,标准差)**或最好地描述了数据。

12.我们为什么要使用正则化?

正则化技术用于减少模型过拟合。有两种常用的正则化方法,L1 正则化或套索和 L2 或岭回归。我们通过引入少量的偏差(或惩罚项)来做到这一点,使模型对训练数据不太敏感,从而避免过度拟合并减少测试数据的差异。正则化技术的目标是最小化下列山脊方程

接着是套索

λ决定斜率的惩罚,ε项是残差,β项是斜率。λ越高,惩罚越高。

13.套索和山脊有什么区别?我们如何选择调谐参数λ?

Lasso 和 Ridge 的最大区别在于,Ridge 回归可以将斜率渐近收缩到接近 0,而 Lasso 回归可以将斜率一直收缩到 0。当有许多无用的变量时,套索是有用的,而当大多数变量都有用时,山脊是有用的。

Lambda 可以取从 0 到无穷大的任何值。如果λ= 0,我们有最小二乘直线。我们可以通过交叉验证来选择 lambda 的值。λ越大,模型系数的变化越大。

14.拟合最小二乘回归线时,变量个数和样本个数之间的关系是什么?

n 应该总是至少等于 p,其中 n 是样本大小,p 是变量的数量。假设 n = 1,p = 2,不拟合任何线,我们至少需要 2 个数据点,对于一个数据点,我们可以有无限多条线通过该点。

15.有哪些方法可以替换丢失的数据?

有很多方法可以处理这种情况。

  1. 如果丢失值的实例数量只占整个数据集的一小部分,那么它们可以被安全地删除。
  2. 用平均值、中值或众数估算缺失值。这项技术的唯一警告是,如果数据有偏差,估算可能会导致错误的表示。例如,假设我们的数据集有两列,一列是个人的年龄,另一列是衡量个人健康状况的指数。现在,如果我们的数据集有健康指数的缺失值,并且如果数据偏向年轻人群,那么如果有老年人的缺失值,我们可能会用代表年轻人群的健康指数来替代它。
  3. 第三种方法是,我们可以找到与缺失值的变量高度相关的变量,并进行回归拟合。

16.解释朴素贝叶斯算法

“朴素贝叶斯”是一种分类算法,它使用贝叶斯定理将实例分类到特定类别。它假设预测值之间是独立的,这是一个主要的假设,因为一组预测值几乎不可能完全独立。当预测器是明确的时,它工作得很好。

这应该是一个停下来的好地方。在第二部分中,我们将讨论一些最常见的关于不同 ML 算法的面试问题。

面试准备的数据科学问题(机器学习概念)—第二部分

参考:

[1]统计学习介绍— Gareth James,Daniela Witten,Trevor Hastie,Robert Tibshirani

[2]《统计学习导论》——加雷斯·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂、罗伯特·蒂布拉尼

乔希·斯塔默的 stat quest

2020 年在 Twitter 上关注的顶级数据科学家

原文:https://towardsdatascience.com/33-data-scientists-to-follow-on-twitter-77f70c59339f?source=collection_archive---------7-----------------------

freestocks.org在 Unsplash 上拍照

数据科学|推特

这里有一份你应该关注的杰出数据科学家的名单。

用一句话来说就是——“世界上正在发生什么,人们在谈论什么。”这是 21 世纪媒体最热门的技术和领先的社交媒体平台之一。凭借高达 3 . 35 亿的月活跃用户,它也是模因病毒式传播和全世界分享人们观点的地方。

与其把 Twitter 作为一种娱乐机制,分散你对深层工作的注意力,让你被这个吸引你注意力的精心设计的产品所淹没,为什么不把它转变成一个学习和探索新想法的平台呢?

数据科学将在未来发挥至关重要的作用,甚至将帮助拯救世界免受气候变化。随着人工智能的激增,从年轻人到人工智能专家,每个人都必须了解关于人工智能的最新消息。还有比推特更好的地方吗?

在这篇文章中,我整理了一份 Twitter 上著名数据科学家的名单,我认为他们对数据科学领域做出了重大贡献,带来了这场伟大的革命。

没有他们,今天的四大科技公司——谷歌、亚马逊、脸书、苹果(GAFA)——就不会取得今天在人工智能和人工智能方面的进展。

为什么要在 twitter 上关注他们?

学习一个新话题的最好方法之一是通过从专家那里挑选。如果你想进入这个领域,为什么不跟随这些数据科学家,一窥在这个领域工作是什么样子。通过关注他们,你可以在你的 feed 中分享他们的经验、他们使用的工具、他们发现的有见地的帖子和文章、聚会、会议等。

事不宜迟,下面是在 Twitter 上关注的 33 位数据科学家的名单。它们没有任何特定的顺序。在 Twitter 上了解数据科学领域的顶尖人物,如果你还没有,现在就关注他们。

1.韦斯·麦金尼

Pandas 创始人,数据分析 Python 作者

[## 韦斯·麦金尼(@韦斯·麦金尼)|推特

韦斯·麦金尼的最新推文(@韦斯·麦金尼)。OSS 的非盈利主管 https://t.co/YVn0VFqgj0 专注于…

twitter.com](https://twitter.com/wesmckinn?s=20)

2. Yann LeCun

NYU 教授,脸书首席人工智能科学家

[## 扬·勒村

Yann LeCun (@ylecun)的最新推文。NYU 大学教授。脸书首席人工智能科学家。人工智能研究员…

twitter.com](https://twitter.com/ylecun?s=20)

3.院长阿博特

smarter HQ 联合创始人兼首席数据科学家

[## 院长艾伯特

院长阿博特的最新推文(@deanabb)。联合创始人+首席数据科学家/ SmarterHQ,@smarterhq,作者…

www.twitter.com](http://www.twitter.com/deanabb)

4.柯克通天

博思艾伦首席数据科学家

[## 柯克·伯恩(@KirkDBorne) |推特

Kirk Borne 的最新推文(@KirkDBorne)。首席数据科学家@BoozAllen。全球发言人。Top #BigData…

twitter.com](https://twitter.com/KirkDBorne?s=20)

5.迈克·塔米尔博士

首席 ML 科学家&SIG 机器学习/AI 主管,伯克利数据科学学院

[## 迈克·塔米尔博士

Mike Tamir 博士的最新推文(@MikeTamir)。#UberATG &加州大学伯克利分校#DataScience 的负责人(推文是…

twitter.com](https://twitter.com/MikeTamir?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor)

6.道格切割

cloud era 首席架构师

[## 道格·卡丁(@卡丁)|推特

Doug Cutting 的最新推文(@cutting)。Lucene,Nutch,Hadoop & Avro 的创始人。美国加州

twitter.com](https://twitter.com/cutting?lang=en)

7.彼得·斯科莫洛赫

机器学习、人工智能、数据科学执行官&投资人

[## 彼得·斯科莫罗奇(@彼得·斯科莫罗奇)|推特

彼得·斯科莫罗奇的最新推文(@peteskomoroch)。机器学习、人工智能、数据科学高管和投资者。过去…

twitter.com](https://twitter.com/peteskomoroch?s=20)

8.莫妮卡·罗加蒂

数据科学&人工智能顾问

[## 莫妮卡·罗加蒂(@mrogati) |推特

莫妮卡·罗加蒂的最新推文(@mrogati)。数据科学和人工智能顾问;分数 CDO。前数据副总裁@Jawbone…

twitter.com](https://twitter.com/mrogati?lang=en)

9. DJ 帕蒂尔

前美国首席数据科学家

[## DJ 帕蒂尔(@dpatil) |推特

DJ Patil 的最新推文(@dpatil)。前美国首席数据科学家。我建造东西。美国加州

twitter.com](https://twitter.com/dpatil)

10.卢卡斯·比沃德

Weights and bias 的创始人/首席执行官

[## 卢卡斯·比沃德(@l2k) |推特

Lukas Biewald 的最新推文(@l2k)。Weights and bias(@ Weights _ bias)的创始人/CEO。前情提要…

twitter.com](https://twitter.com/l2k)

11.阿龙·哈勒维

艾,董事,前谷歌人,教授。

[## 阿龙·哈利维

AlonHalevy 的最新推文(@AlonHalevy)。计算机科学家和咖啡栽培学家。脸书艾导演…

twitter.com](https://twitter.com/alonhalevy?lang=en)

12.肯尼斯·库基尔

*高级编辑,*经济学家

[## 肯尼斯·库基尔(@kncukier) |推特

肯尼斯·库基尔的最新推文(@kncukier)。《经济学人》的高级编辑。NYT 畅销书《大…

www.twitter.com](http://www.twitter.com/kncukier)

13.南多·德弗雷塔斯

谷歌 DeepMind 机器学习团队的科学家领导

[## 南多·德弗雷塔斯

南多·德·弗雷塔斯的最新推文(@NandoDF)。我研究智能来理解我们是什么,并利用…

www.twitter.com](http://www.twitter.com/NandoDF)

14.约翰·艾尔德

艾尔德研究公司创始人

[## 约翰·艾尔德

约翰·埃尔德的最新推文(@johnelder4)。艾尔德研究的创始人,最大最有经验的数据…

www.twitter.com](http://www.twitter.com/johnelder4)

15.费-李非

斯坦福大学计算机科学教授

[## 飞-李非(@drfeifei) |推特

飞的最新推文(@drfeifei)。斯坦福大学以人为中心的人工智能研究所副主任

www.twitter.com](http://www.twitter.com/drfeifei)

16.伯纳德·马尔

Bernard Marr&Co创始人兼首席执行官

[## 伯纳德·马尔

Bernard Marr 的最新推文(@BernardMarr)。国际畅销作家;主旨发言人;未来学家…

www.twitter.com](http://www.twitter.com/BernardMarr)

17.希拉里·梅森

前机器学习总经理 Clouder

[## 希拉里·梅森(@hmason) |推特

希拉里·梅森的最新推文(@hmason)。做一些新的东西。我♥数据和芝士汉堡。纽约市

www.twitter.com](http://www.twitter.com/hmason)

18.吴恩达

创始人兼 CEO,落地 AI

[## 吴恩达(@AndrewYNg) |推特

来自吴恩达的最新推文(@AndrewYNg)。Coursera 联合创始人;斯坦福计算机学院兼职教授。…的前任负责人

twitter.com](https://twitter.com/AndrewYNg)

19.伊利亚·苏茨基弗

OpenAI 的首席科学家

[## 伊利亚·苏茨基弗

Ilya Sutskever 的最新推文(@ilyasut)。@openai

twitter.com](https://twitter.com/ilyasut)

20. Ben Lorica 罗瑞卡

奥莱利媒体公司首席数据科学家

[## Ben Lorica 罗瑞卡

The latest Tweets from Ben Lorica 罗瑞卡 (@bigdata). Data scientist starting anew in 2020; Past: Program Chair of…

twitter.com](https://twitter.com/bigdata)

21.杰克·波威

数据王创始人兼执行董事

[## 杰克·波威

杰克·波威的最新推文(@杰克·波威)。首席执行官@DataKind ||非常乐观||主要谈论民主…

twitter.com](https://twitter.com/jakeporway)

22.莉莲·皮尔森,体育专家

Data-Mania LLC 商业和数据策略师

[## 莉莲·皮尔森,体育

莉莲皮尔森的最新推文,PE (@Strategy_Gal)。🇺🇸 3x 首席执行官在#科技⤸ ✮ B2B 首席执行官→#数据战略家+…

twitter.com](https://twitter.com/Strategy_Gal)

23.哈德利·韦翰

R for Data Science 的作者

[## 哈德利·威克姆(@哈德利·威克姆)|推特

哈德利·威克姆的最新推文(@哈德利·威克姆)。r,数据,可视化,🐕,🍸,🌈。他/她。德克萨斯州休斯顿

twitter.com](https://twitter.com/hadleywickham?s=20)

24.基拉·雷丁斯基

诊断机器人董事长兼首席技术官

[## 基拉·雷丁斯基

Kira Radinsky 的最新推文(@KiraRadinsky)。诊断机器人董事长兼首席技术官(前易贝首席科学家…

www.twitter.com](http://www.twitter.com/KiraRadinsky)

25.理查德·索切尔

首席科学家,销售团队

[## 理查德·索赫尔(@理查德·索赫尔)|推特

理查德·索彻的最新推文(@RichardSocher)。Salesforce 的首席科学家。热爱人工智能研究和…

www.twitter.com](http://www.twitter.com/RichardSocher)

26.克里斯·苏尔达克

高德纳公司执行合伙人

[## 克里斯·苏尔达克

克里斯·苏尔达克的最新推文(@CSurdak)。作家,火箭科学家,#rpa 和#bigdata 的家伙。专栏作家@TEBReview…

www.twitter.com](http://www.twitter.com/CSurdak)

27.巴斯蒂安·特龙

uda city 创始人兼总裁

[## 巴斯蒂安·特龙

来自巴斯蒂安·特龙的最新推文。创始人,乌达城总裁。加利福尼亚州山景城

www.twitter.com](http://www.twitter.com/SebastianThrun)

28.约翰·迈尔斯·怀特

脸书数据科学家

[## 约翰·迈尔斯·怀特

约翰·迈尔斯·怀特的最新推文(@johnmyleswhite)。纽约脸书数据基础设施团队的工程经理。前…

www.twitter.com](http://www.twitter.com/johnmyleswhite)

29.瑞安·罗萨里奥

Riot Games 的数据科学家/研究工程师

[## 瑞安·罗萨里奥

Ryan R. Rosario 的最新推文(@DataJunkie)。加州大学洛杉矶分校统计学博士:数据科学家@谷歌,讲师@加州大学洛杉矶分校…

twitter.com](http://twitter.com/DataJunkie)

30.奥利维尔·格里塞尔

Inria 的软件工程师

[## 奥利维尔·格里塞尔

Olivier Grisel 的最新推文(@ogrisel)。@Inria 的工程师,sci-kit-learn 开发人员,由…

twitter.com](http://twitter.com/ogrisel)

31.格雷戈里·皮亚泰茨基

KD nuggets 总裁,LinkedIn 数据科学最高权威& Analytics

[## KDnuggets

KDnuggets 的最新推文(@kdnuggets)。涵盖#人工智能、#分析、#大数据、#数据挖掘、#数据科学…

twitter.com](http://twitter.com/kdnuggets)

32.大卫·史密斯

虚拟城市的数据科学家

[## 大卫·史密斯

大卫·史密斯的最新推文(@revodavid)。微软的云倡导者。关于人工智能、数据科学、R #rstats 的推文…

twitter.com](http://twitter.com/revodavid)

33.德鲁·康威

冲积层的首席执行官和创始人

[## 德鲁·康威(@德鲁康威)|推特

德鲁·康威的最新推文(@drewconway)。1994 年 CT 布里奇波特的大片电玩商店冠军。新…

twitter.com](http://twitter.com/drewconway)

一个行动计划

查尔斯在 Unsplash 上的照片

我希望你喜欢这篇文章,并且我成功说服你清理了你的 Twitter。社交媒体正在吞噬我们的生活,如果你不找到一种方法将它转变成一个学习的地方,你很快就会被它吞噬。所以,开始过滤噪音,让高质量的信息进入你的生活,观察你的变化,一次一条。

如果一个一个地点击它们很辛苦,而且你是个大忙人,那就去我的个人资料,在这个推特 列表 上找到它们!

查看我关于数据科学最佳 TED 演讲的文章

[## 数据科学最佳 TED 演讲

这里列出了最精彩的 TED 演讲,这些演讲启发了你,并向你展示了数据的力量。

towardsdatascience.com](/best-ted-talks-for-data-science-11b699544f)

联系人

如果你想了解我的最新文章,请关注我的媒体。

其他联系方式:

  • 领英
  • 推特
  • GitHub
  • Reddit

快乐发微博,快乐学习,快乐编码。

35 个问题来测试你的 Python 集知识

原文:https://towardsdatascience.com/35-questions-to-test-your-knowledge-of-python-sets-ad95267c43d9?source=collection_archive---------22-----------------------

如何通过掌握集合基础来碾压算法题

来自 Pexels 的 Andrea Piacquadio 的照片

在我追求精通采访算法的过程中,我发现钻研 Python 的基本数据结构很有用。

这是我写的个人问题列表,用来评估我对 Python 集合的了解。

你对 python 集合了解多少?

1.将一个对象转换成一个集合会保持对象的顺序吗?

不。集合不是有序的数据结构,所以不保持顺序。

看看当我们将列表[3,2,1]转换为集合时会发生什么。就变成了{1,2,3}

a = set([3,2,1])
a 
#=> {1, 2, 3}

2.检查一个集合是否是另一个集合的子集

这可以用issubset()方法来完成。

a = {4,5}
b = {1,2,3,4,5}a.issubset(b) 
#=> Trueb.issubset(a)
#=> False

3.使用比较运算符检查集合是否是子集

如果s1的所有元素都在s2中,那么集合s1就是s2的子集。

如果第一个集合中的所有元素都存在于第二个集合中,那么操作符<=将返回True。是子集)。

a = {'a','b'}
b = {'a','b','c'}a <= b
#=> True
b <= a 
#=> False

4.集合是自身的子集吗?

是的。

因为集合包含了自身的所有元素,所以它确实是自身的子集。当我们稍后对比“子集”和“真子集”时,理解这一点很重要。

a = {10,20}a.issubset(a) 
#=> True

5.检查集合中是否存在特定值

像其他类型的 iterables 一样,我们可以用in操作符检查一个值是否存在于一个集合中。

s = {5,7,9}5 in s
#=> True6 in s
#=> False

6.检查值是否不在集合中

我们可以再次使用in操作符,但这次是以not开头。

s = {'x','y''z'}'w' not in s
#=> True'x' not in s
#=> False

7.什么是集合?

集合是唯一对象的无序集合。

当任何对象转换为集合时,重复值将被删除。

set([1,1,1,3,5])
#=> {1, 3, 5}

以我个人的经验来看,我使用集合是因为它们使得寻找交集、并集和差这样的运算变得容易。

8.子集和真子集有什么区别?

真子集是集合的子集,不等于自身。

比如:

{1,2,3}{1,2,3,4}的真子集。

{1,2,3}不是{1,2,3}的真子集,但它是子集。

9.检查一个集合是否是真子集

我们可以使用<操作符检查一个集合是否是另一个集合的真子集。

{1,2,3} < {1,2,3,4}
#=> True{1,2,3} < {1,2,3}
#=> False

10.向集合中添加元素

与列表不同,我们不能使用+操作符向集合中添加元素。

{1,2,3} + {4}
#=> TypeError: unsupported operand type(s) for +: 'set' and 'set'

使用add方法添加元素。

s = {'a','b','c'}
s.add('d')
s
#=> {'a', 'b', 'c', 'd'}

照片由杰森·维拉纽瓦从佩克斯拍摄

11.复制一套

copy()方法对集合进行浅层复制。

s1 = {'a','b','c'}s2 = s1.copy()
s2 
#=> {'c', 'b', 'a'}

12.检查一个集合是否是另一个集合的超集

一个集合s1是另一个集合s2的超集,如果s2中的所有值都能在s1中找到。

您可以使用issuperset()方法检查一个集合是否是另一个集合的超集。

a = {10,20,30}
b = {10,20}a.issuperset(b) #=> True
b.issuperset(a) #=> False

13.用比较运算符检查一个集合是否是超集

除了issuperset(),我们还可以使用>=比较操作符来检查一个集合是否是一个超集。

a = {10,20,30}
b = {10,20}a >= b #=> True
b >= a #=> False

14.集合是自身的超集吗?

因为集合s1中的所有值都在s1中,所以它是自身的超集。尽管它不是一个合适的超集。

a = {10,20,30}a.issuperset(a) 
#=> True

15.检查一个集合是否是另一个集合的适当超集

如果s2中的所有值都在s1s1 != s2中,则集合s1是另一个集合s2的真超集。

这可以用>操作器进行检查。

a = {10,20,30}
b = {10,20}
c = {10,20}a > b #=> True
b > c #=> False

16.将集合转换为列表

在集合上调用列表构造函数list(),将集合转换为列表。但是注意,不保证顺序。

a = {4,2,3}
list(a)
#=> [2, 3, 4]

17.如何迭代集合中的值?

一个集合可以像其他迭代器一样通过循环进行迭代。但是再次注意,顺序不保证。

s = {'a','b','c','d','e'}for i in s:print(i)#=> b
#=> c
#=> e
#=> d
#=> a

18.返回集合的长度

集合中元素的数量可以通过len()函数返回。

s = {'a','b','c','d','e'}len(s)
#=> 5

19.创建集合

可以使用带花括号的集合符号创建集合,例如,{…},示例:

{1,2,3}
#=> {1, 2, 3}

或使用 set 构造函数,示例:

# set(1,2,3)
=> TypeError: set expected at most 1 arguments, got 3set([1,2,3])
#=> {1, 2, 3}

但是请注意,后者需要传入另一个 iterable 对象,比如 list。

20.求两个集合的并集。

使用union()方法可以找到两个集合的并集。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1.union(s2)
#=> {1, 2, 3, 4, 5, 6, 7, 8}

也可以用|操作符找到。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1 | s2
#=> {1, 2, 3, 4, 5, 6, 7, 8}

照片由迪贝拉咖啡从 Pexels 拍摄

21.求两个集合的交集

两个集合的交集可以用intersection()方法获得。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1.intersection(s2)
# => {4, 5}

也可以用&操作器拍摄。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1 & s2
# => {4, 5}

22.找出 s1 中不在 s2 中的元素

这可以用difference()方法找到。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1.difference(s2)
{1, 2, 3}

也可以用-操作符找到它。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1 - s2
{1, 2, 3}

23.从集合中移除元素

remove()按值从集合中删除元素。

s = {'x','y','z'}
s.remove('x')
s
#=> {'y', 'z'}

24.从集合中移除并返回未指定的元素

从集合中移除并返回一个元素,将集合视为一个无序队列。

s = {'z','y','x'}
s.pop()
s
#=> {'y', 'z'}

25.检查 2 个集合是否不相交

如果集合、s1s2没有公共元素,则它们是不相交的。

a = {1,2,3}
b = {4,5,6}
c = {3}a.isdisjoint(b) #=> True
a.isdisjoint(c) #=> False

26.将另一个集合中的所有元素添加到现有集合中

方法从另一个集合中添加元素。

a = {1,2,3}
b = {3,4,5}a.update(b)
a
#=> {1, 2, 3, 4, 5}

这也可以通过|=操作器来完成。

a = {1,2,3}
b = {3,4,5}a |= b
a
#=> {1, 2, 3, 4, 5}

注意这与union不同。union()返回新集合,而不是更新现有集合。

27.从集合中移除所有元素

clear()从集合中删除所有元素。然后,该集合可用于将来的操作并存储其他值。

a = {1,2,3}
a.clear()
a
#=> set()

28.从集合中移除元素(如果存在)

discard()如果某个元素存在,则删除该元素,否则不执行任何操作。

a = {1,2,3}
a.discard(1)
a
#=> {2, 3}a = {1,2,3}
a.discard(5)
a
#=> {1, 2, 3}

与此形成对比的是remove(),如果您试图删除一个不存在的元素,它会抛出一个错误。

a = {1,2,3}
a.remove(5)
a
#=> KeyError: 5

29.将字典传递给 set 构造函数的结果是什么?

只有字典的键会存在于返回的集合中。

d = {'dog': 1, 'cat':2, 'fish':3}
set(d)
#=> {'cat', 'dog', 'fish'}

30.你能把两套拉链拉上吗?

是的。但是每个集合中的值可能不会按顺序连接。

请注意整数集中的第一个值是如何与字母集中的第三个值组合在一起的,(1, 'c')

z = zip({1,2,3},{'a','b','c'}
)
list(z)
#=> [(1, 'c'), (2, 'b'), (3, 'a')]

照片由梅莉·迪·罗科从派克斯拍摄

31.集合可以通过索引访问吗?

不可以。试图通过索引访问集合将会引发错误。

s = {1,2,3}
s[0]
#=> TypeError: 'set' object is not subscriptable

32.集合和元组有什么区别?

元组是不可变的。集合是可变的。

元组中的值可以通过索引来访问。集合中的值只能通过值来访问。

元组有顺序。集合没有顺序。

集合实现了集合论,所以它们有很多有趣的功能,如并、交、差等。

33.set 和 frozenset 有什么区别?

冷冻集的行为就像集合一样,只是它们是不可变的。

s = set([1,2,3])
fs = frozenset([1,2,3])s #=> {1, 2, 3}
fs #=> frozenset({1, 2, 3})s.add(4)
s #=> {1, 2, 3, 4}fs.add(4)
fs #=> AttributeError: 'frozenset' object has no attribute 'add'

34.更新一个集合使其等于另一个集合的交集

intersection_update()将第一个集合更新为等于交集。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1.intersection_update(s2)
s1
#=> {4, 5}

这也可以用&=操作符来完成。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1 &= s2
s1
#=> {4, 5}

35.从第一个集合中移除第二个集合的交集

difference_update()从第一个集合中删除交集。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1.difference_update(s2)
s1
#=> {1, 2, 3}

操作员-=也工作。

s1 = {1,2,3,4,5}
s2 = {4,5,6,7,8}s1 -= s2
s1
#=> {1, 2, 3}

结论

你做得怎么样?

老实说,我在这里做得比我的字符串问题和列表问题差。

我们在日常编程中不经常使用集合,我们大多数人在编写 SQL 连接时只接触过集合论。也就是说,熟悉基础知识并没有坏处。

如果你觉得这很有趣,你可能也会喜欢我的 python 面试问题。

向前向上。

3D 深度学习变得更简单——脸书 PyTorch3D 框架简介

原文:https://towardsdatascience.com/3d-deep-learning-made-easier-a-brief-introduction-to-facebooks-pytorch3d-framework-9fe3075f388a?source=collection_archive---------24-----------------------

来源:脸书研究 GitHub 页面

脸书发布了支持 3D 环境中深度学习的 PyTorch3D 框架。找出它是什么。

介绍

作为一个开源的机器学习库,PyTorch 越来越受到人工智能(AI)研究人员的欢迎,用于各种应用,包括计算机视觉和自然语言处理。作为其主要开发者,脸书人工智能研究中心(FAIR)已经注意到 PyTorch 和其他可用工具包中处理 3D(即 3 维)数据的有限功能,因此他们开发了 PyTorch3D 框架,旨在促进 3D 深度学习领域的创新研究。

该框架有三个关键特性,包括使用网格的数据结构、这些网格的操作和可区分的渲染器。下面介绍这些功能。

使用三角形网格的数据结构

对于 2D 图像输入,批处理很简单,包括生成一个形状为N X 3 X H X W的四维张量,如下所示。然而,3D 图像输入不是平坦的(即 2D),并且这种对 2D 图像输入的批处理将不起作用。

图像批处理 2D vs. 3D(来源: PyTorch3D

为了解决 PyTorch3D 中的这个问题,FAIR team 使用网格作为数据结构来处理 3D 图像输入。具体来说,3D 图像输入将被处理为多个顶点和面,从这些顶点和面可以形成三角形网格。如下面的动画图像所示,要批处理异构网格,网格数据结构可以是张量列表、打包张量和填充张量。更多细节可以参考这个链接。

PyTorch3D 中作为数据结构的网格(来源:脸书)

三角形网格上的操作

除了上面提到的对异构批处理输入的支持之外,PyTorch3D 还优化了几种常见运算符和损失函数的实现,如 Chamfer 和 Lapacian,前者是一种比较两组 3D 数据点云的方法。这些内置操作允许研究人员训练他们的模型,而不需要自己实现这些操作。

三角形网格上的操作(来源:脸书)

可微分网格渲染器

PyTorch3D 提供了一个高效的模块化可区分渲染器,允许研究人员将他们的 3D 模型转换为 2D 图像。这种模块化的可区分渲染器是创新的,因为传统的渲染引擎由于不可区分而无法融入深度学习。下面的动画图像显示了渲染器如何作为相机扫描工作。

可微分网格渲染器(来源:脸书

外卖和后续步骤

感谢 FAIR 开发这一强大工具包的工作以及作为开源项目的慷慨共享,这使得 3D 深度学习对许多人工智能研究人员来说更容易。如果你想探索这个工具包,在它的 GitHub 上有几个入门教程。

PyTorch3D 教程

参考

脸书在 PyTorch3D 上的博客

PyTorch3D 官网

PyTorch3D GitHub 页面

使用高岭土和 Colab 的 6 步 3D 对象检测分类器

原文:https://towardsdatascience.com/3d-object-classification-in-6-steps-using-kaolin-and-colab-9ecb079143a8?source=collection_archive---------26-----------------------

一步一步的实际操作的 3D 对象检测分类器,没有 Linux 机器或 GPU 的先决条件

三维物体检测分类器

在本文中,您将学习开发 3D 对象检测分类器,而无需预先准备 Linux 机器或手中的 GPU。

3D 对象检测是解决诸如自动驾驶汽车、机器人和 AR/VR 应用等现实世界应用的一个重要方面。3D 数据提供可靠的深度信息,可用于精确定位物体/车辆。

3D 表示

以下是 3D 表示的一些类型

3D 表示

点云是 3D 空间中的点的集合,每个点由一个(XYZ)坐标指定,可选地还有其他属性(如 RGB 颜色)。点云被称为从诸如激光雷达的传感器获得的原始数据。在进一步处理之前,这些被转换成其他表示,例如多边形网格、体素网格。

点云(PC)表示更为可取,因为 PC 到其他格式的转换很容易,反之亦然。点表示保留了 3D 空间中原始的几何信息,没有任何离散化。

多边形网格由组多边形面组成,这些多边形面具有近似几何表面的共享顶点。

体积表示规则间隔的 3D 网格上的单个样本或数据点,体素网格是 3D 网格,其中每个单元或“体素”具有固定的大小和离散的坐标。

投影视图 RGB(D) 将 3D 对象投影到多个视图中,并提取相应的视图特征,然后融合这些特征以进行精确的对象检测。

Google Colab -简介

Google colaboratory 又名 colab,是一款免费使用 GPU 的 jupyter 笔记本电脑。当您在 colaboratory 上训练您的模型时,您可以使用基于 GPU 的虚拟机,每次最多给你 12 个小时。之后失去对该特定虚拟机实例的访问,并在 12 小时后连接到不同的虚拟机实例。所以请定期保存数据或检查点。可乐是完全免费的。

选择 GPU

要选择用于训练的 GPU,请选择运行时 > 更改运行时类型选择硬件加速器(无更改为 GPU)。

colab 预装了各大库(NumPy,matplotlib)和框架(TensorFlow,PyTorch)并进行定制安装尝试(!pip 安装

探索谷歌实验室这里

高岭土- 3D 深度学习研究框架

Kaolin 是由 NVIDIA 的一个团队开发的开源 PyTorch 库,旨在加速 3D 深度学习研究。高岭土框架用几行代码将 3D 模型转换成深度学习数据集。高岭土为加载和预处理流行的 3D 数据集提供了便捷的途径。

Kaolin 框架将复杂的 3D 算法归结为简单的步骤,如点云数据到体素网格的转换,三角形网格表示。

高岭土框架使机器人、自动驾驶汽车、增强和虚拟现实等领域的研究人员受益。

现在,对于 3D 对象检测分类器,我们将使用高岭土框架。git 回购可以在这里找到

总之,这是我们一直在寻找的高岭土特性。

高岭土特征

资料组

该数据集可从普林斯顿模型网获得。model net 10 . ZIPZIP 文件包含来自 10 个类别的 CAD 模型,用于在我们的 3D 对象检测分类器中训练深度网络。培训和测试分割包含在文件中。CAD 模型在内部被完全清理,模型的方向(非比例)由我们自己手动调整。

MODELNET 10 有下面提到的 10 个类别:

浴缸,床,椅子,书桌,梳妆台,显示器,床头柜,沙发,桌子,卫生间

让我们开始吧…

3D 对象检测分类器

第一步:打开 google colab 这里,将运行时间改为 GPU(大约 4-5 分钟)

安装软件包

安装软件包

步骤 2:下载 MODELNET10 数据集

通过 X、Y、Z 移动可视化 3D 模型

步骤 3:数据加载

Kaolin 提供了方便的功能来加载流行的 3D 数据集(ModelNet10)。首先,我们将定义几个重要参数:

model_path该变量将保存 ModelNet10 数据集的路径。categories变量来指定我们要学习分类哪些类。num_points是我们将网格转换为点云时从网格中采样的点数。

最后,如果我们使用 CUDA 进行转换操作,我们将禁用多处理和内存锁定。

该命令定义了一个transform,它首先将一个网格表示转换为一个点云,然后标准化为以原点为中心,标准偏差为 1。与图像非常相似,点云等 3D 数据需要进行归一化处理,以获得更好的分类性能。

split='train'参数表明我们正在装载“火车”拆分。rep='pointcloud'加载网格并转换成点云。transform=norm对每个点云应用标准化变换。

步骤 4:建立我们的模型、优化器和损失标准

步骤 5:训练点云分类器(大约 15-20 分钟)

以下代码行将训练和验证一个 PointNet 分类器

划时代训练

万岁!!!,就这样,你已经用高岭土训练了你的第一个 3D 物体检测分类器!!

步骤 6:在测试数据上评估训练的 3D 对象检测模型

我们将创建一个新的数据加载器,它将加载与我们以前的 val_loader 相同的数据,但是会进行混排,并获取一个样本批次。

接下来,我们使用一个小的可视化函数设置一个图形来可视化点云、地面实况标签和我们的预测。

对结果进行颜色编码,绿色表示正确,红色表示不正确。****

可视化结果

地面真相,Pred 预测。

拍拍背,完成 3D 对象检测分类器。

感谢阅读…

Jupyter 笔记本可以在这里找到

文章更新:2021 年 10 月 31 日

引用 URL

  1. Krishna mur thy Jatavallabhula等《高岭土:加速 3D 深度学习研究的 PyTorch 库》arXiv:1911.05063 v2论文
  2. https://github.com/NVIDIAGameWorks/kaolin
  3. 普林斯顿模型网

4.Google colab 指南

用人工智能探索艺术。

原文:https://towardsdatascience.com/3d-photography-inpainting-exploring-art-with-ai-adb390a09810?source=collection_archive---------28-----------------------

新模型的用法,有例子和 Colab 笔记本。

达芬奇《最后的晚餐》。通过 Merzmensch 的 3D 照片修复进行转换

我们生活在一个实验的大时代。嗯,科学、社会和文化一直在经历新的故事。想想文艺复兴或达达主义运动。但是数据科学,在计算边缘的当前状态下,允许我们做一些超出我们想象的事情。机器学习是通往未知的新旅程的最初起点。深度(无监督)学习则更进一步。

经过特定数据集的训练,人工智能可以可视化其对现实的感知——或增强现有的概念。当然,这取决于培训来源和能力。但我们人类也是如此——我们了解我们所知道的。我们知道我们所理解的。

艺术品背后的一瞥。

我一直想知道人工智能在特定情况下解释现实和艺术的能力。还有:用机器探索“幻觉”难道不是一件令人兴奋的事情吗?

就像我们的大脑用**补充了一个盲点(又见:盲点)中的信息缺失,用它“假设”的东西去补全缺失区域应该有的东西。**

有时它会朝着令人惊讶的方向发展。一个基于 StyleGAN 的网络应用程序以一种意想不到的方式“纠正”了我上传的图片:

NVIDIA AI 的 AI 实验图像修复给了我一些令人毛骨悚然的结果:

这是另一个奇妙的修复故障,由乔纳森·弗莱观察到:

西蒙·尼克劳斯(Simon Niklaus)等人的 3D 本·伯恩斯效应 为我们提供了一个全新的激动人心的维度——使用单一图像,分析整体的遮挡、深度和几何形状,使我们能够“进入”照片。

您可以将历史照片变得栩栩如生:

或者你甚至可以更进一步,在图片后面:

3D 本·伯恩斯效果非常适合透视清晰的照片或图像。当深度不容易确定时,情况就变得复杂了:

3D 摄影修复

凭借他们的论文“使用上下文感知分层深度修复的 3D 摄影”( PDF )有一个来自弗吉尼亚理工国立清华大学脸书的团队将图像的探索带到了另一个层次。**

****3D Photography using Context-aware Layered Depth Inpainting:**
[Project Website](https://shihmengli.github.io/3D-Photo-Inpainting/) / [Paper](https://drive.google.com/file/d/17ki_YAL1k5CaHHP3pIBFWvw-ztF4CCPP/view?usp=sharing) / [GitHub](https://github.com/vt-vl-lab/3d-photo-inpainting.git) / [Colab Notebook](https://colab.research.google.com/drive/1706ToQrkIZshRSJSHvZ1RuCiM__YX3Bz)Team: [Meng-Li Shih](https://shihmengli.github.io/) (1,2)
[Shih-Yang Su](https://lemonatsu.github.io/) (1)
[Johannes Kopf](https://johanneskopf.de/) (3)
[Jia-Bin Huang](https://filebox.ece.vt.edu/~jbhuang/) (1)1) Virginia Tech   
2) National Tsing Hua University   
3) Facebook**

在他们的项目网站上,可以看到各种各样的演示视频。

这里是各种现有模型之间的视频比较:

多层次深度的新方法给游戏带来了更多的维度。可移动对象后面的背景仍然是用修补填充的,但结果的三维效果令人惊叹。

使用基于 CNN 的深度估计和图像预处理,该模型以连接的方式延续不可见的区域:线条和图案的上下文感知延续非常令人信服。

将我制作的马格里特的图片与新模型进行比较:

或者偷偷溜进萨瓦尔多·达利和弗雷德里科·加西亚·洛卡的肖像照:

用 3D 照片修复探索艺术

如你所见,机器对隐藏层的解释令人着迷。

演示视频中的结果非常令人信服,但毕加索修改后的肖像最吸引我的是:

来自 3D 摄影 Inpaiting 演示视频(来源),摄影师:Herbert List / Magnum Photos

这里使用的照片描绘了毕加索在他的大奥古斯丁街工作室的《美食》(1948)前。而艺术家背后的绘画区域则由 AI 填充。

那么在机器的大脑里发生了什么呢?我做了一些实验,不知所措。

达芬奇《最后的晚餐》中耶稣背后的风景清晰而独特:

另一个马格里特——感受超现实梦境中的空间:

勒内·马格里特以他的幻觉和玩弄现实层面而闻名。在他的作品“L'Heureux donateur ”中,观者无法辨认,这是一个戴着帽子的男人的轮廓,上面画着夜景——还是一个男人形状的剪影,引导我们看到更远处的风景。

3D 照片修复带来了它的解释:

安德鲁·怀斯荒凉的世界变得更加生动:

皮拉内西乌托邦式的后城市结构有了深度:

在这些例子中,你可以清楚地看到深度层,由 CNN 以一种非常复杂和精确的方式生成。几何学和内容感知图像绘画展示了图像探索的未来。

该方法还包括图像的 3D 图,其可以在其他实现中使用。

目前 Twitter 上充斥着 3D 照片修复的实验。这里由runner 01(btw。一个精彩的必关注推特,最新人工智能模型和实验的来源):

此外,使用这种方法,历史摄影变得更有表现力。彩色的老爱尔兰实验用去彩色化(基于人工智能的彩色化)和 3D 本·伯恩斯效果对历史上的爱尔兰摄影。3D 照片修复在这里得到了完美的运用:

艺术家和数字探险家 马里奥·克林格曼 在博世**的尘世快乐花园中探索:****

作为上周的总结(随着《3D 照片在绘画中》的出版),他写道:

的确,是时候进行人工智能解读艺术的探索和实验了。

更新Manuel Romero的这款 Colab 专为将图像转换成视频而设计,无需耗时的 3D 元数据。多文件上传和下载也是可用的。如果你想转换一堆照片,这款 Colab 适合你。

亲爱的读者们,你们会发现什么?

4.5 年的恋爱关系,在脸书活动

原文:https://towardsdatascience.com/4-5-years-of-a-relationship-in-facebook-activity-13a8ddfc6a85?source=collection_archive---------50-----------------------

分析脸书与我女朋友的互动和信息数据

我最近下载了脸书所有关于我的数据。我发现了许多有趣的事情,但我特别想研究的一个领域是这些数据如何反映了我和我女朋友关系的进展。

在这篇文章中,我将(再次)通过数据科学与世界分享我们 21 世纪的爱情故事。在真正的千禧年时尚中,我将把我们的浪漫减少到我们在社交媒体上互动的总和,然而,看到相似之处将是有趣的——既与现实生活相似,也与我们在其他社交媒体上出现的关系相似。

正如我在本系列中的所有博客文章一样,分析和可视化都是使用 R 创建的。查看 my Github 中使用的代码以及帮助分析您自己的脸书数据的 R 包。

这可能是一个新的开始

2015 年 12 月 7 日星期一,晚上 7 点 30 分 11 秒整,我和我女朋友成为了脸书的朋友。那时我们已经认识了几个月,在同一个友谊小组,但是以前没有太多的交流。三天后,第一条信息被发送出去,剩下的,正如他们所说,就成为历史了…直到它在一篇博客文章中被分析。

数据集的性质意味着我没有我们在脸书关系的全貌,我只有从我这边看得见的东西。就信息而言,这不是问题,因为我可以看到所有的信息,但就喜欢、反应、评论和帖子而言,我只能看到我对我的女朋友采取了什么行动,而不是相反。

所以让我快速的分解一下:

  • 正如我所说的,2015 年 12 月 7 日是开始日期,这是近 5 年的活动。作为参考,我们从 2016 年 3 月 31 日开始约会。
  • 我在评论中提到她 213 次,在状态中提到她 4 次(我不经常发布状态)。
  • 我对她的一些东西(帖子、评论、照片等)做出了“反应”。)209 次。
  • 我们已经相互发送了 8598 条信息。虽然没有 Whatsapp 上的多,但还是远远超过了我的预期。和以前一样,我惊讶地发现我发的消息(4539 条)比她发的多(4092 条)。
  • 还是像以前一样,我使用的独特词汇(3193 个)比我的女朋友(3049 个)多。
  • 我还可以看到,我们使用 messenger 进行通话或视频聊天的时间达到了 125.1 分钟。

脸书调情

要显示上面的数字:

自从我们第一次互动以来的每 28 天内,我和我女朋友之间的脸书互动次数。

从我们第一条信息开始的 28 天内,我和女朋友之间发送的脸书信息的数量。

第一张图显示,随着时间的推移,我对脸书的使用越来越少,我们的互动在评论和反应之间平分秋色。

你可以看到我们的信息大多是在我们正式开始约会前的一个半月。我想在这之后,我们只是转移到 Whatsapp/text。由此得出一个有争议的结论: Messenger 是用来调情的,Whatsapp 是用来谈恋爱的

这两个图表显示了我在 2017 年 9 月开始工作后活动增加的相同模式(我希望我的老板没有看到这一点)。对此的解释是,在这之前的几个月,我们住在一起,每天大部分时间都在一起,所以我们的大部分互动都是面对面的,而当我开始工作时,我大部分时间都在办公室,不得不出差,所以我们的社交媒体交流增加了。或者,你可以暗示我在应该工作的时候使用社交媒体。我不知道你怎么想,但我认为前者比后者更有说服力…

我喜欢“喜欢”你

除了观察一段时间内的反应,我们还可以根据类型和目标来分解反应。

我在女朋友的帖子、评论、照片或视频上使用了多少次每个反应。

毫不奇怪,喜欢比其他任何东西都要普遍得多。其余的,爱和哈哈是下一个最常用的。我很高兴不是‘愤怒’和‘抱歉’。

上图考虑了我对我女朋友在脸书上发布的每一类内容的所有反应。然而,如果我们考虑到(就像我们现实生活中的关系一样)我们在脸书的关系在过去 5 年里并没有保持不变,就会发现一些有趣的模式。这反映了的喜欢。

随着时间的推移,我在脸书上对我女朋友的内容类型做出了反应。

众所周知,21 世纪的调情通常包括喜欢社交媒体上的照片。看看 2016 年上半年,我会觉得我也有这种感觉。

然而,在 2017 年年中之后,所有的照片反应都是在我们一起度假之后直接出现的。现在看来,这是我们俩唯一一次在脸书的个人资料上贴照片了。

我不想引起更多的关注,但在我 2017 年底开始工作后,活动也(再次)激增。你还可以看到前面提到的使用减少的模式,在 2020 年封锁期间,社交媒体互动几乎不存在。

为了与我之前关于 Whatsapp 聊天的文章进行更多的比较,我现在将快速浏览一下我们在脸书互相发送的消息内容…

嗯,你看怎么样?

下图显示了我们在 Facebook Messenger 上最常用的词——与所有文本分析一样,常见的停用词(“The”、“and”等)。)已被删除。

我女朋友和我在 Facebook Messenger 上最常用的词。

首先,我向你保证我们不会用第三人称称呼自己…这只是显示我们在 Facebook Messenger 上玩游戏的时间(例如,“Chris 开始了一个游戏。马上回复!”).

可笑的是,我们俩有了和在 Whatsapp 上一样的最常用词。上次我有一些评论,问我们是否已经解决了关于 yeah/yeh 拼写的分歧。这似乎只是火上浇油…

不出所料,所有“哈哈”的变体也很常见——我们都经常发这种消息,即使我们实际上并没有笑(我们不都是这样吗)。也许在“哈哈”和“哈哈哈”和“哈哈哈”的比较背后有一些有趣的心理学意义,但我会让你去想象。

我也认为我欠我的女朋友一个道歉,oi 出现在我最常用的 10 个词中对我来说并不是一种恭维…但是在我的辩护中,我没有辩护。

深呼吸

好了,差不多够了。希望你喜欢在社交媒体上看到对一段关系的现实描述,而不仅仅是我们在大多数人的时间线上看到的亮点。尽管一个“有影响力的人”社交媒体账户看起来和你在这里看到的很不一样,但在现实生活中,他们可能会说“哈哈”,尽管听起来很不酷。

我也希望你能借此反思你在社交媒体上的人际关系,以及这与现实世界有何不同。

如果你喜欢读这篇文章,那么请考虑分享并给我或我的出版物数据片一个关注,以便将来有更多的关注!

动机

本文是两件事的续篇/后续:

1)我之前的一篇文章《 3.5 年的一段感情,在 Whatsapp 留言 》,这是我写作时看得最多的故事。

我最近的系列作品“脸书到底了解我多少?”在那里,我用数据科学分析了脸书收集的 7500 份关于我的资料。请看 第一部分第一眼 第二部分位置数据可视化 第三部分了解我的好恶 第四部分了解我在脸书以外的活动。

您尚未充分使用的 4 个高级 SQL 特性

原文:https://towardsdatascience.com/4-advanced-sql-features-you-havent-used-enough-919f154ff530?source=collection_archive---------9-----------------------

萨法尔·萨法罗夫在 Unsplash 上拍摄的照片

数据科学

从分层查询的能力到 SQL 中过程结构的范围

SQL 是一种强大的语言。SQL 是你将要使用的大部分技术的一部分。对于开发人员来说,SQL 的使用可能仅限于在数据库中插入和检索数据,但对于数据分析师、数据科学家和数据工程师来说,它通常远不止于此。SQL 让您可以直接访问数据库——有大量的分析可以在那里完成——而无需从数据库中获取数据并将其加载到 pandas 或 PySpark 中。显然,由于资源的原因,您在数据库中所能做的事情是有限的。

根据我多年来的观察,使用 R、Julia 或 Python 等统计编程语言的人倾向于用这种语言做几乎所有的事情,而有些事情实际上用 SQL 有时会更有效。除了基本的选择、插入、更新、连接和子查询之外,SQL 还有许多高级特性可用于数据分析,但我们并没有充分利用这些特性。

在 KDNuggets 上有一个帖子说这是你进行数据分析需要的最后一个指南。虽然这是一份写得很好的指南,但我认为它绝对是而不是你进行数据分析所需的最后一份指南。你需要知道更多。我要说的是,你现在正在阅读的 Medium 帖子也不是你成为 SQL 高手所需的最后指南。这里只讨论了 SQL 的一些被忽视、未被充分利用但却很强大的特性。让我们继续讨论其中的一些。

分层查询

像 Oracle 这样的企业关系数据库很久以前就开始支持分层数据的存储和检索。在 MySQL 8 发布之前,MySQL 可能是少数几个不支持直接查询分层数据的数据库之一。在过去的几年里,当我在 MySQL 中实现分层存储时,我不得不多次参考 Mike Hillyer 的这篇文章。这是一本很棒的读物。

想想看,分层数据无处不在——产品的类别和子类别以及进一步的子类别、组织结构、动物和植物物种、家谱等等。普通的 SQL 特性不足以高效地查询分层数据,因为这会导致大量的子查询(和混乱)。在 MySQL 5.7 或更早的版本中,您会使用一种叫做会话变量的东西来进行分层查询,而在 MySQL 8 或更高版本以及其他数据库中,您会使用递归公共表表达式。

分层数据无处不在——产品类别和子类别、组织结构、家谱等等。

我会给你一些这方面的背景。一天,一位前同事打电话给我,问我如何在 MySQL 5.7 上运行分层查询——直到这个版本的 MySQL 不支持公共表表达式。所以,下面是这个查询的样子。现在让我们来谈谈 cte😄

MySQL 8.0 之前的 MySQL 中的分层查询示例

递归公用表表达式

被亲切地称为 CTE,这是一个非常强大的构造,所有主要的关系数据库(包括大多数关系数据仓库)都支持它。它本质上减少了在一个查询中编写另一个查询的需要,即嵌套子查询。CTE 本质上是在查询范围内定义的视图。CTE 不以数据库对象的形式存在,而是作为查询的一部分存在。cte 对于可读性也非常好(如果做得好的话)。

CTE 本质上是在查询范围内定义的视图。

不久前,我写了一篇关于使用 SQL 生成随机数据的文章,并在一些查询中使用了 cte。你可以在这里快速浏览一下。同样,递归 CTE 就像一个调用自身的递归函数或方法。想象一个树形数据结构,开始解析并一直解析到一个叶子节点。也就是使用递归 cte 查询的数据的递归性。

在 MariaDB 中使用递归 cte

窗口功能

SQL 中最常用的分析函数是聚合函数。SQL 中的聚合函数与GROUP BY子句一起作用于整个数据集或数据集的一部分,而窗口函数扩展了聚合函数的功能,不仅仅是计算基本的聚合。窗口函数提供了对数据集和部分数据集进行二级聚合&汇总操作的能力,可选地具有移动窗口和其他有趣的功能。这给了我们计算的机会,比如

  • 过去七个工作日的销售移动平均值
  • 月收入累计

这给了我们在 SQL 中分析数据的强大能力,而不需要将数据带到外面的 pandas 或 PySpark 中进行处理。

在没有定义任何窗口的情况下,这里有一些可以加窗的基本分析函数。

表定义可以在 dataset 中找到— NASA 喷气推进实验室 编译成 GitHub 项目 devstrology

这里有一篇关于 SQL 中窗口函数的很有深度的文章。如果你感兴趣的话,一定要读一读。

[## SQL 窗口函数|高级 SQL 模式分析

从这里开始?本课是使用 SQL 进行数据分析的完整教程的一部分。看看开头…

mode.com](https://mode.com/sql-tutorial/sql-window-functions/)

过程语言

在之前的一篇文章中,我写了关于 SQL 的多种风格

衡量您的 SQL 风格有多强大的一个方法是,浏览数据库提供的全部特性集,并找出您的 SQL 风格是否完全符合 。但是,即使是图灵完整的 SQL 也不能保证处理查询 DSL 允许但架构不允许的特定用例。由于这个原因,存在如此多种风格的数据库/SQL。

一些主要的关系数据库提供的对 SQL 的过程语言扩展使它们变成了完整的语言。一些扩展是 PL/SQL、T-SQL 和 plgsql。过程语言允许您访问成熟编程语言中可用的大量结构,这些结构本身就在数据库中。例如,在 SQL 的过程版本中,您将能够编写循环结构,您将能够使用函数和过程编写结构化程序,您将能够访问许多数据类型和数据结构,您将能够进行面向对象的编程。

您可以想象,使用完整的编程语言的特性,直接在 SQL 中访问数据,而不用将数据推送到外部系统,可以完成很多工作。这样做不仅去除了额外的一层,还节省了移动数据所花费的大量网络时间。

结论

我们可以谈论 SQL 的更多强大功能,但是根据我的经验,我觉得我所观察和共事的许多人(和团队)都没有充分利用其中的一些功能,其中也包括数据库工程师!

4 个银行分析用例以及您需要哪些数据

原文:https://towardsdatascience.com/4-analytics-use-cases-in-banking-and-what-data-you-need-5f654235bbf?source=collection_archive---------14-----------------------

商业

数据团队早期采用阶段的示例用例

安娜斯塔西娅·奥斯塔波维奇在 Unsplash 上的照片

用例是任何概念的可靠证明。通过预定义的成功指标,您可以轻松认识到这一概念的好处。当数字上升或下降时,您可以将其与传统数字进行比较。在整个数字中,每个人都相信它的价值,这是如此容易和舒适。

在我的工作生涯中,当管理团队必须投资或花钱做任何事情时,他们会请求一个称为 POC(概念验证)的流程。这就像你需要实现小业务领域的任务,并证明它是真正的工作之前,扩大概念。在决定采取任何重大行动之前,管理团队总是希望先看到 POC 的结果。

然而,如果您从未在该领域有过经验,就很难想到要用的用例。怎么知道哪种分析会带来大量的收益或者转化率?我可以提出哪些最佳实践分析用例来最大限度地提高实施成功率?这就是我们今天要看的。

照片由内森·杜姆劳在 Unsplash 上拍摄

在银行业,几个部门贡献了公司的总收入。例如,创造性地创造出具有许多有趣特性的新产品的产品团队。营销团队进行有吸引力的促销,以获得新客户或提高基线收入。渴望与客户达成交易的一线和销售团队。

分析可以帮助这些团队实现更好的绩效,如以下使用案例所示。

销售团队

马库斯·斯皮斯克在 Unsplash 上拍摄的照片

倾向模型

销售团队的首选数据科学模型是倾向模型。

倾向模型是试图预测有意向或可能购买特定产品的客户的模型。任何产品包括投资基金、保险产品、贷款和任何产品。

它的好处是缩小了要接触的客户规模。假设我们有一个 1000 万左右的基础客户。如果销售团队需要在 1 个月的活动期内联系所有客户,由于资源有限,他们无法实现。

分析有助于选择有很大潜力购买产品的目标客户,这样销售团队就可以花时间和精力说服那些感兴趣的人。此外,如果您需要更有效的目标客户,该模型可以从倾向模型升级为提升模型。

这节省了大量的时间,并大大增加了活动的收入和转化率。我在一家银行公司工作时,有机会开发几个倾向模型。当您在公司中没有任何已实施的分析用例时,这是一个首选方法。

it 的好处可以通过进行 A/B 测试并比较各组之间产生的收入或转换率来衡量。根据我的经验,当我们用传统的基于规则的方法测试模型性能时。事实证明,该模型几乎总是能击败传统的基于规则的模型。

**数据:**可以根据买/卖交易做一个倾向模型。您可以进行二进制分类,并将目标值设为 1,表示购买产品,设为 0,表示不购买产品。

消费能力预测

在我们从倾向模型中获得目标客户后,我们可以通过添加有用的维度(如每个客户的消费能力)来提高销售线索的质量。

购买力是指消费者会接受多少产品。例如,如果客户想购买人寿保险,销售人员应该向他们提供什么样的合适机票。这里模型的目标是每个顾客在产品上花费的钱数。这些特征可以是你拥有的任何东西,但最重要的是金融行为特征。

这种分析用例的好处是,通过只选择那些有机会在我们的产品上花大钱的人,你可以直接提高收入指标。通常,我会首先尝试开发倾向模型,然后我会说服他们通过添加消费能力预测来不断提高线索的质量。

销售团队会对这个模型结果更加满意,因为他们有销售金额的激励。如果我们向他们提供高消费能力的线索,他们也会得到更高的激励。对于数据和销售团队来说,这似乎是一个双赢的局面。

**数据:**你需要有你为每个客户销售的产品的大小,并把它作为一个目标变量。你可以使用任何回归模型来预测目标金额的消费能力。

产品推荐

接触客户的机会有限。在银行业务中,如果在特定月份有任何活动接触到客户。该客户将被列入排除名单 6 个月。这是为了保持顾客的新鲜感。你自己知道,你不希望销售人员一周给你打 3 次电话,推销同样的产品。这就是为什么我们必须限制顾客接触的数量。

鉴于上述原因,销售一种以上的产品对销售人员来说可能是个好主意,因为这增加了提供产品的可能性。

分析可以帮助对每个客户的首选产品进行排名,并将它们列给销售团队,以便主动为几种产品制定流畅的销售脚本。这里可以使用的技术是多类分类模型或排序模型。这要看你有什么数据,你是只有交易数据还是排名数据。

这些用例的范围也可以用于集客营销。当客户来到分行进行任何金融交易时,分行官员可以向客户建议排名产品,以增加产品提供的机会。

这些分析用例的优势可以通过比较推荐的产品排名和受欢迎的产品或基于政策的产品来衡量。我们可以测量每个组的占用率和收入。

这里需要注意的一点是,模型预测了客户购买产品的概率。但是没有考虑到客户将在建议的时间服用该产品。它只给出了客户可能购买的前 3 种产品。

**数据:**产品推荐是倾向模型的升级,基于所有目标产品而不是每个产品的 1/0 进行多类分类。

营销团队

照片由帕特里克·托马索在 Unsplash 上拍摄

分割

细分是商业智能的基本分析用例。它使客户的视野更加清晰。营销团队可以从每个客户群的深入行为中受益。此外,他们可以跟踪时间流逝后客户的行为变化。

分割可以从几种方法和数据维度的许多视图中导出。基本维度可以是人口统计、使用活动、地理位置、心理等。我们可以将细分的每个维度结合起来,进行复杂的多维度细分。例如,您可以从人口统计中导出第一个批发商细分,并从使用活动维度与高使用率客户相结合。

在实现方面,您可以基于启发式方法进行细分,例如基于探索性数据分析和一些基本统计的规则。

另一方面,您可以基于建模技术(如 K 均值、分层分割等)进行分割。建模有很多选择。您需要仔细检查并选择合适的方法。了解每种技术的利弊,以便分析结果在决策时更加可靠。

结果可能是一个带有其角色命名的客户列表,或者您可以将它放在仪表板中,以便营销团队在一段时间内掌握其客户角色,并将其附加到绩效指标的数量上。营销团队可以考虑他们必须向客户提供的下一个行动,以保持或提高绩效指标。

对于这些用例,很难衡量分析用例的成功,因为没有衡量这是否是一个好的客户群的指标。这取决于分析团队和终端用户之间的共识。但是,如果您可以获得具有一些收入相关特征的细分市场,您可以进行 AB 测试来比较每组之间的销售收入和增长,并查看细分的有效性。

**数据:**你在客户/会员层面的任何数据,都可以根据每个维度和特征进行细分。这里的想法是无限的。

结论

根据我在这里的经验,我列出了成功率最高的分析用例。这些使用案例可以应用到其他行业,因为我们有相同的业务运营基础,即创造收入。

这里还有很多我没有提到的分析用例。请随意分享你的方法。我们分享得越多,我们就越能相互学习,并将我们的最佳实践提高到一个新的水平。

成功的机器学习项目的 4 个拦截器和 4 个解锁器

原文:https://towardsdatascience.com/4-blockers-and-4-unlockers-for-successful-machine-learning-projects-86d409b7eb03?source=collection_archive---------57-----------------------

如何构建可靠有用的机器学习系统

扬·阿莱格在 Unsplash 上的照片

众所周知,机器学习项目经常失败,根据 Gartner 的数据,85%的人工智能项目失败,甚至 96%的项目处理问题。当谈到新技术时,高学位是正常的,但这些数字是惊人的。这可能是因为没有满足机器学习的要求,没有增加价值,或者由于工程原因,模型没有投入生产。通常有可能提前发现潜在的问题。这篇文章是基于我过去五年在应用机器学习方面的经验来早期识别这些陷阱的。

一般要求

机器学习项目应该自动化决策。这可以是任何事情,从最终决定在图像上显示什么(图像分类),用户得到哪些推荐(推荐系统)或哪台机器需要维护(预测性维护)。

为了使机器学习项目成功,有一些主要的要求,可以事先评估。这四个是潜在的障碍(数量、质量、复杂性、可解释性)

在这一点上应该提到的是,这篇文章不是关于研究,而是应用机器学习。

ML 项目合理性的最重要的方面是必须做出的决策的数量(以及节省了多少时间)。不值得开发一个机器学习系统来自动化罕见的决策甚至频繁的决策,总的来说几乎不花费任何时间。开发成本太高了。训练一个可以每天对物体进行几次视觉检查的图像识别模型是不值得的。机器学习是优化频繁重复任务的工具。

质量

通常有一些频繁重复的任务,但是没有人的监督是无法完成的。例如,如果一个模型的质量要求很高,以至于总是需要一个人(例如,法规),机器学习几乎不会优化任何东西。虽然存在所谓的人在回路系统,但这些系统更复杂、成本更高,并且需要 ML 模型来可靠地对不确定性进行分类,这种不确定性目前通常是不可靠的。

对于大多数任务来说,不可能 达到 人类表现。在完全受控的环境和非常狭窄的任务中,超人的表现甚至很少被期待。要评估一个模型是否能达到这个阈值,看看其他人已经做了什么。通常应用机器学习的会议非常有用。小心研究论文,它们并不总是适用于真实世界的数据。

复杂性

人工智能和 ML 是时髦的词,有时它们被使用,在那里一个适应良好的过程和基于规则的系统解决底层的任务。好多这么- 叫 AI 其实不是 AI 。通常更明智的做法是首先依赖手工制作的基于规则的系统(基于统计数据),如果它们失败或变得太复杂,只使用 ML。这些基于规则的系统失败的领域有:计算机视觉、自然语言处理、语音识别、序列建模等。

可解释性

任何最大似然模型都只能和训练它的数据一样好。人工智能不是可以预测未来的黑魔法,即使媒体经常给人这样的印象。机器学习系统通过示例进行学习,并允许一定程度的泛化。最终,数据总能解释模型是如何做出决定的,即使事情没那么简单。

一个经过训练可以区分猫和狗图像的模型只会识别猫和狗。这样的模型概括了品种、比例、光照条件等。但是如果你让这样一个模型对一个咖啡杯进行分类,它会把它看成一只狗或者一只猫,因为除此之外它什么都不知道。

即使你试图预测股市崩盘,你也可以训练一个模型来识别所有过去的崩盘。关键是,下一次崩盘不太可能像前几次一样,因此所有这些模型在实践中都失败了。

这里的例子可能是显而易见的,但有时不可能知道数据是否包含所需的信息。机器学习模型没有常识或世界知识,这仍然取决于我们。他们应该预测的必须是数据中存在的**,并且必须与算法可以找到的模式相匹配。**

运行模型

以上几点比较抽象,概念性强。以下几点与技术和工程更相关。

技术复杂性

模型需要的技术基础设施和模型本身的一般复杂性决定了构建这样一个模型的时间。例如,使用像 SVM、KNN 和决策树这样的传统方法要容易得多,因为它们可以通过与周围系统相同的编程语言编写的现有框架和库来轻松集成。如果涉及到一些最先进的神经网络,通常会复杂得多。如果不是关于图像识别、文本或语音(……),这种改善通常与付出的努力不成比例**。**

做预测

一个模型是否必须按需(即“实时”)提供预测,或者该模型是否用于批处理,这两者之间有着巨大的差异。和其他软件系统一样,这里的问题不仅仅是关于可伸缩性和可用性,也是关于用例。

如果 ML 模型在本地可用,并且不需要通过 API 访问,则每天使用模型进行数百万次预测的过程可以调度得更快。另一方面,推荐系统是按需激活的,并且必须提供低延迟。微服务并不总是最好的解决方案。

训练数据量也起着重要作用。大型深度学习模型喜欢用几万亿字节的数据训练几周。显然,这种模型比直接从数据库中训练的随机森林要复杂得多。或者一个简单的 CSV 文件。

维护和监控

监控和可维护性是一个关键概念。一旦模型开始生产并停止工作,如果没有适当的监控,您就会发现这一点,但为时已晚。通过从硬编码规则转移到数据驱动模型,错误变得不那么明显。因此,除了生产软件系统的典型指标之外,还需要进一步的特定于 ML 的监控。

半衰期

机器学习模型很少无限有效。通常数据在一段时间后会发生变化,模型会失效。对于自动重新训练的模型或在线学习系统,这方面实际上是免费的,但所有其他模型都需要不时地重新训练(模型漂移)。

由于要识别新的对象,需要每两周训练一次图像识别系统,但是训练时间为两周的图像识别系统可能不是最佳方法。

结论

我希望我能鼓励一些读者思考这些问题。当建立一个人工智能驱动的系统时,在概念上和技术上有许多陷阱和障碍。确保给出了数量、质量、复杂性和可解释性要求,并设置了技术资源,项目成功的可能性最大化。

我在学习 Python 时犯的 4 个编码错误

原文:https://towardsdatascience.com/4-coding-mistakes-i-did-when-i-was-learning-python-bbc6824bdd8c?source=collection_archive---------24-----------------------

更好的编程

一起学习我最纠结的 Python 概念

照片由 NeONBRAND 在 Unsplash 上拍摄

几年前,我开始了学习 Python 的冒险,我已经知道了一些其他的编程语言,比如 PHP(第一种将我引入 web 开发的语言),JavaScript(我已经很擅长了,并且正在编写一个 UI 库)和 C#,这是我当时收入的来源。

我通过自己开发一个应用程序来学习 Python,因此我将许多 JavaScript 和 C#的做事方式融入到我的代码中,这很糟糕,尽管有时它会工作。我花了一些时间,阅读他人的代码,并与他人合作,实际上提高了语言水平。今天我想和你一起回顾一下我在学习 Python 时犯的一些错误(代码方面的)。

#1 误解 Python 范围

Python 范围解析基于所谓的 LEGB 规则,这是 L ocal、 E nclosing、 G lobal、 B 内建的简写。尽管看起来非常简单,但当时我还是有点迷惑,例如,考虑下面的例子:

x = 5
def foo():x += 1print(x)foo()-----------
Output
-----------
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment

对于上面的代码,我希望它能够工作,并修改全局变量x以最终打印6。但是,事情可能会变得更奇怪,让我们来看看下面修改过的代码:

y = 5
def foo_y():print(y)foo_y()-----------
Output
-----------
5

这到底是怎么回事?在一段代码中,全局变量X给出了一个UnboundLocalError,然而,当我们试图打印变量时,它工作了。原因与范围有关。当你在一个作用域(比如函数作用域)中给一个变量赋值时,这个变量就变成了这个作用域的局部变量,并且隐藏了外部作用域中任何相似命名的变量。这是我们拍摄《T4》时第一个场景中发生的事情。

如果我们打算像函数foo()一样访问全局变量x,我们可以这样做:

x = 5
def foo():global xx += 1print(x)foo()-----------
Output
-----------
6

通过使用关键字global允许内部作用域访问全局作用域中声明的变量,这意味着变量没有在任何函数中定义。类似地,我们可以使用nonlocal来产生类似的效果:

def foo():x = 5def bar():nonlocal xx += 1print(x)bar()foo()-----------
Output
-----------
6

nonlocal正如global允许你从外部作用域访问变量,然而,在nonlocal的情况下,你可以绑定到一个父作用域或全局作用域上的一个对象。

#2 迭代时修改列表

虽然这个错误不仅在 Python 中很常见,但我发现它在新的 Python 开发人员中很常见,甚至对一些有经验的开发人员也是如此。虽然有时可能看起来不那么明显,但在某些情况下,我们最终会修改当前正在迭代的数组,导致不恰当的行为,或者如果我们幸运的话,我们会得到一个错误并很容易注意到它。

但是让我给你一个例子来说明我的意思,假设给定一个数组,你需要减少数组,只包含偶数元素,你可以尝试这样做:

def odd(x): return bool(x % 2)
numbers = [n for n in range(10)]
for i in range(len(numbers)):if odd(numbers[i]):del numbers[i]-----------
Output
-----------
Traceback (most recent call last):File "<stdin>", line 2, in <module>
IndexError: list index out of range

在所描述的场景中,当在迭代过程中删除一个列表或数组的元素时,我们会得到一个错误,因为我们试图访问一个不再存在的项目。这是一种不好的做法,应该避免,在 python 中有更好的方法来实现类似的事情,其中包括:

def odd(x): return bool(x % 2)
numbers = [n for n in range(10)]
numbers[:] = [n for n in numbers if not odd(n)]
print(numbers)-----------
Output
-----------
[0, 2, 4, 6, 8]

您也可以使用filter函数来实现同样的功能,虽然它可以工作,但有些人认为这不是 Pythonic 的工作方式,我也有点同意,但我不想卷入这场讨论。我宁愿给你选择,你可以研究和决定:

def even(x): return not bool(x % 2)
numbers = [n for n in range(10)]
numbers = list(filter(even, numbers))
numbers-----------
Output
-----------
[0, 2, 4, 6, 8]

#3 闭包中的变量绑定

我想从我在 twitter ( @livecodestream )上发布的一个测试开始,我问人们他们认为下面的片段会是什么结果:

def create_multipliers():return [lambda x : i * x for i in range(5)]for multiplier in create_multipliers():print(multiplier(2))-----------
Output
-----------
8
8
8
8
8

对许多人来说,包括我自己,当我们第一次遇到这个问题时,我们认为结果会是:

0
2
4
6
8

然而,代码实际上导致了完全不同的结果,我们对此感到非常困惑。实际发生的是 Python 会做一个后期绑定行为,根据这个行为,在调用内部函数的时候会查找闭包中使用的变量值。所以在我们的例子中,无论何时调用任何返回的函数,在调用它的时候都在周围的范围内查找i的值。

这个问题的解决方案可能看起来有点粗糙,但它确实有效

def create_multipliers():return [lambda x, i=i : i * x for i in range(5)]for multiplier in create_multipliers():print(multiplier(2))-----------
Output
-----------
0
2
4
6
8

通过使用 lambda 函数的默认参数来传递i的值,我们可以生成函数来执行所需的行为。我对这个解决方案感到非常困惑,我仍然认为它不是很优雅,但是,有些人喜欢它。如果你知道这个问题的另一个可能的解决方案,请在评论中告诉我,我很乐意阅读。

#4 名称与 Python 标准库模块冲突这个问题实际上在我刚开始的时候相当普遍,即使是现在,有时我也会犯这个错误。这个问题是由于将一个模块命名为与 Python 附带的标准库中的一个模块同名而引起的。(例如,您的代码中可能有一个名为 email.py 的模块,这将与同名的标准库模块相冲突)。

也许名称冲突本身不会对您的代码产生任何问题,但有时我们会覆盖 Python 标准库的函数或模块,这些函数或模块稍后会在已安装的库中使用,并且它会因抛出错误或行为不当而发生冲突。无论如何,这是一个糟糕的情况。

一个典型的错误如下:

a = list()
print(a)list = [1, 2, 3] # This is where we break it
a = list()-----------
Output
-----------
[]
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

通过简单地创建一个名为list的变量,我们中断了对list函数的访问。而且,即使有其他的访问方式(比如__builtins__.list(),我们也要避免这种名字。

结论

本文并没有涵盖开发人员在用 Python 编码时会犯的所有常见错误,而是那些我最纠结的事情。如果您想了解更多关于如何编写出色的 Python 代码以及避免其他一些错误的信息,我推荐您阅读:

[## 让你的代码变得伟大,Python 风格

让我们一起学习一些简单的技巧来编写更多的 Pythonic 代码。

medium.com](https://medium.com/swlh/make-your-code-great-python-style-3223c1160299)

感谢阅读!

Python 初学者应该避免的 4 个常见错误

原文:https://towardsdatascience.com/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628?source=collection_archive---------6-----------------------

Python 初学者

我很艰难地学会了,但你不需要

由拍摄的杰米街上的 Unsplash

让我们面对现实吧。学习编程很难。

许多人会同意,但有些人不同意。我不相信。

这是因为我总能在不同的编程语言中发现微妙的方法来做我想做的事情。我以为我已经掌握了它们。但我错了。你可以在你的代码中做任何事情,但是你不应该做任何你想做的事情。

我很快意识到我尝试的那些“微妙”的方法是不好的做法。但是一段有效的代码怎么会是坏的呢?我习惯于采用这些不好的(和微妙的)做法,它回来困扰着我。我是吃了苦头才知道的。

在分享每个 Python 新手都应该知道的 4 个常见错误之前,确保你熟悉下面这篇文章中的一些 Python 内置特性。

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4)

1.不使用迭代器

每个 Python 新手都这么做,不管他们对其他编程语言的熟练程度如何。无处可逃。

给定一个列表list_,如何使用 for 循环逐个访问列表中的元素?我们知道 Python 中的列表是由索引的,因此我们可以通过list_[i]访问第 I 个元素。然后我们可以为 for 循环创建一个范围从0len(list_)的整数迭代器,如下所示:

**for** i **in** **range**(**len**(list_)):foo(list_[i])

它工作了。代码没有问题。这也是在其他语言如 C 中构造 for 循环的标准方式。但是实际上我们可以用 Python 做得更好。

如何?

你知道 Python 中的列表是可迭代的吗?通过利用它的可迭代特性,我们可以生成可读性更好的代码,如下所示:

**for** element **in** list_:foo(element)

由在 Unsplash 上创意交流拍摄的照片

在 for 循环中并行遍历多个列表可以通过zip函数实现,而enumerate可以帮助你在迭代一个 iterable 对象时获取索引号(即计数器)。在 5 Python 特性中介绍和解释了它们,我希望我能早点知道。

2.使用全局变量

全局变量是在主脚本中声明的具有全局作用域的变量,而局部变量是在具有局部作用域的函数中声明的变量。在 Python 中使用global关键字允许你在一个函数中局部访问和修改全局变量。这里有一个例子:

许多初学者喜欢它,因为使用global似乎可以避免传递函数所需的所有参数。但这其实不是真的。它只是隐藏了动作。

使用global s 也不利于调试目的。功能应被视为块盒,并且应该是可重用的。修改全局变量的函数可能会给主脚本带来副作用,这很难发现,而且很可能会导致复杂的代码,调试起来更加困难。

在局部函数中修改全局变量是一种糟糕的编程实践。您应该将变量作为参数传入,对其进行修改,并在函数结束时将其返回。

照片由弗拉季斯拉夫·克拉平在 Unsplash 上拍摄

*不要混淆全局变量和全局常量,因为在大多数情况下使用后者是完全可以的。

3.不理解可变对象

对于新的 Python 学习者来说,这可能是最常见的惊喜,因为这个特性在这种语言中是非常独特的。

Python 中有两种对象。可变对象可以在运行时改变它们的状态或内容**,而不可变对象则不能。很多内置对象类型是不可变的,包括 **int、float、string、bool、tuple

st **=** 'A string' 
st[0] **=** 'B' # You cannot do this in Python

另一方面,像 listsetdict 这样的数据类型是可变的。因此,您可以更改列表中元素的内容,例如list_[0] = 'new'

当函数中的默认参数可变时,会发生意想不到的事情。让我们以下面的函数为例,其中一个可变 空列表是参数list_的默认值。

**def** foo(element, list_=[]):list_.**append**(element)**return** list_

让我们调用函数两次,而不为list_输入参数,这样它就取默认值。理想情况下,如果没有提供第二个参数,那么每次调用函数时都会创建一个新的空列表。

a = foo(1) # returns [1]
b = foo(2) # returns [1,2], not [2]! WHY?

什么?

原来 Python 中的默认参数是在定义函数时计算一次的**。这意味着调用函数不会刷新默认参数。**

Ravi Roshan 在 Unsplash 上拍摄的照片

因此,如果默认参数是可变的,并且每次调用函数时都会发生变化。变异后的默认参数将用于所有未来的函数调用。“标准”修复是使用(不可变)None作为默认值,如下所示。

**def** foo(element, list_=**None**):if list_ is **None**:list_ = []list_.**append**(element)**return** list_

4.不复制

对于学习者来说,复制的概念可能是外国的,甚至是违反直觉的 T42。假设你有一个列表a = [[0,1],[2,3]],然后你在b = a前声明一个新列表。您现在有两个具有相同元素的列表。通过改变列表b中的一些元素,应该不会对列表a有什么(副作用)影响吧?

错了。

当您使用赋值语句b = a来“复制”一个列表时,对一个列表的元素所做的任何修改在两个列表中都是可见的。赋值操作符只在目标和对象之间创建绑定,因此示例中的ab列表共享同一个引用,即 Python 中的id()

如何复制对象?

如果您想要“复制”对象,并且只修改新(或旧)对象中的值而不进行绑定,有两种方法可以创建副本:浅层复制深层复制。两个对象将有不同的引用。

由路易·汉瑟在 Unsplash 上拍摄

使用我们之前的例子,您可以通过b = copy.copy(a)创建一个a的浅层副本。浅层拷贝创建了一个新对象,它存储了原始元素的引用。这听起来可能很复杂,但让我们看看下面的例子:

在创建了一个嵌套列表 a的浅层副本之后,我们称之为b,两个列表有不同的引用id(a) != id(b),用符号!=表示‘不相等’。然而,它们的元素具有相同的引用,因此id(a[0]) == id(b[0])

这意味着改变b中的元素不会影响列表a,但是修改b[1]中的元素会影响a[1],因此这个副本是浅层的。

简而言之,如果 **b** **a**的浅层拷贝,那么 **b** 中嵌套对象内元素的任何更改都会出现在 **a** 中。

如果你想复制一个嵌套的对象,而在它们的元素之间没有任何绑定,你需要一个由b = copy.deepcopy(a)生成的a的深层副本。深度复制创建一个新对象,而递归地在原始元素中创建嵌套对象的副本。

简而言之,深度拷贝无任何绑定复制一切

由德鲁·科夫曼在 Unsplash 上拍摄的照片

外卖

这就是 Python 初学者应该避免的 4 个常见错误。我很艰难地学会了,但你不需要。你可以注册我的时事通讯来接收我的新文章的更新。如果您对 Python 感兴趣,您可能会发现以下文章很有用:

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性

请做好准备,因为 Python 2 不再受支持

towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc) [## 每个 Python 初学者都应该学习的 4 个 NumPy 技巧

编写可读代码的技巧

towardsdatascience.com](/4-numpy-tricks-every-python-beginner-should-learn-bdb41febc2f2)

编码快乐!

4 种不同的方法来有效地排序熊猫数据帧

原文:https://towardsdatascience.com/4-different-ways-to-efficiently-sort-a-pandas-dataframe-9aba423f12db?source=collection_archive---------14-----------------------

大蟒

正确探索、理解和组织您的数据。

小姐姐塑造的形象

对数据进行适当的分类可以让你更容易理解。

许多人求助于 Pandas 中的高级索引和聚合功能来回答每个分析阶段的问题。当您需要操作数据时,这些特性会非常有用。然而,Pandas 还提供了对数据帧进行排序的不同方式,这可能比其他矢量化解决方案更适合分析数据。

如果您想要对多个列进行排序,或者如果您只需要对一个系列进行排序,Pandas 内置的功能可以帮助您做到这一点。

在这篇文章的最后,使用不同的分类方法,我们将回答以下问题:

  • 哪五款电子游戏在欧洲市场销量最多? 用: .sort_values()解决
  • 哪款游戏发布最早,当年全球销量最低? *用:*多重论证.sort_values()解决
  • 北美市场销售额最高和最低的四大视频游戏是什么? 用: nsmallest()nlargest()解决
  • 哪家发行商一年内 Xbox One 销量最高,同年其 PC 和 PS4 销量如何? *求解用:*多指标.sort_values()

我们将使用这个视频游戏销售数据,所以如果你想继续的话,请下载 csv 文件。一如既往,出发前别忘了进口熊猫。

import pandas as pd# load data
df = pd.read_csv('vgsales.csv').dropna()
df['Year'] = df['Year'].astype(int)
df.head()

来自 Kaggle 的视频游戏销售数据(销量以千计)

排序的快速介绍

Pandas 中所有可用的分类方法分为以下三类:

  • 按索引标签排序;
  • 按列值排序;
  • 按索引标签和列值的组合排序。

Pandas 会自动为您创建的每个数据框生成一个索引。索引标签从 0 开始,每行递增 1。您可以在上面的截图中看到,索引标签出现在最左边的列中(没有列名的那一列)。

您可以看到,根据自动生成的索引对数据帧进行排序实际上没有意义。但是,如果我们将“Name”列设置为数据帧的索引,那么我们可以按字母顺序对表进行排序。我们可以通过一行简单的代码来改变索引并对其进行排序:

df.set_index('Name').sort_index()

在这里,我们可以看到.sort_index()函数重新组织了数据,因此以标点符号作为名称第一个字符的游戏位于列表的顶部。

如果你再往下看,它会显示游戏名称的第一个字符是数字,然后是以字母开头的游戏。排序层次结构中的最后一个是特殊符号,就像上表中的最后一个条目。

这是一个根据数据帧的索引进行排序的非常快速的例子。现在让我们进入一些更高级的排序!

用不同的熊猫分类方法回答视频游戏销售问题

哪五款电子游戏在欧洲市场销量最多?

为了回答这个问题,我们将使用.sort_values()函数。代码如下:

df.sort_values(by='EU_Sales', ascending=False).head(5)

这里,我们输入要排序的列(EU_Sales)并组织我们的数据,使最高值排在最前面(将升序设置为“False”)。您可以在下面看到输出。

已排序的数据框架已经重新组织,因此我们现在可以看到,欧盟销量最多的游戏与全球销量最多的游戏并不完全相同。

什么游戏出版最早,当年全球销量最低?

为了回答这个问题,我们对“Year”列和“Global_Sales”列都感兴趣。我们将再次使用.sort_values()函数,但略有不同:

df.sort_values(by=['Year','Global_Sales']).head(1)

在这种情况下,我们希望按多列对数据进行排序。使用这个函数,只需传递一个列名列表,就可以对任意多的列进行排序。在这种情况下,我们首先编写“Year ”,然后编写“Global_Sales ”,这意味着该函数将首先根据数据帧的发布年份对其进行排序,然后根据其销售额进行排序。

默认情况下,该函数将首先对数值最低的数据帧进行排序,因此我们不需要传递ascending=True(尽管如果您愿意,您可以传递)。你可以在下面看到结果。

在这里,我们将“Atari”发布的游戏“Checkers”认定为数据集中最早发布(1980 年)的全球销量最低的游戏。

北美市场销售额最高和最低的四个视频游戏是什么?

带着这个问题,我们只关心销售值,这意味着我们不需要像“名称”和“平台”这样的视频游戏元数据。我们只关心一列,即“NA_Sales ”,它给出了北美市场的值。这意味着我们正在与一个“系列”一起工作,这是熊猫中的一维数组。

因为我们处理的是一个序列,所以我们可以使用nsmallest()nlargest()方法来给出序列中最小或最大的“n”值。要使用这个函数,您只需传递一个值“n ”,它表示您想要查看的结果的数量。为了回答这个问题,我们写出如下内容:

df['NA_Sales'].nlargest(4)

并且:

df['NA_Sales'].nsmallest(4)

根据熊猫文档,你可以使用这些方法,因为它们可能比我们目前使用的.sort_values()head()方法更快。然而,这似乎更适用于非常大的数据集,因为即使是 16,291 行的数据集也没有什么不同。例如:

df['NA_Sales'].sort_values(ascending=False).head(4)

您可以看到,我们用不同的代码行获得了相同的值,并且花费了相同的时间(11 毫秒)。然而,我认为使用nlargest()nsmallest()会使代码更简洁。函数名不言自明且易于理解,因此您不必为了一个漂亮的函数而牺牲可读性。

哪家发行商一年内 Xbox One 销量最高,同年其 PC 和 PS4 销量如何?

为了回答这个问题,我们将创建一个数据透视表。当您希望在一个易读的表格中聚集和呈现数据时,这些功能非常有用。

创建数据透视表的代码如下所示:

df_pivot = df.loc[df['Platform'].isin(['PC','XOne','PS4'])]
df_pivot = df_pivot[['Platform','Year','Publisher','Global_Sales']]df_pivot = df_pivot.pivot_table(index = ['Publisher','Year'],columns = 'Platform',aggfunc = 'sum',fill_value = 0)

如果你不熟悉数据透视表和多索引的使用,我建议你看看我以前的文章。

[## 如何在 Pandas 中使用 MultiIndex 来提升您的分析

复杂数据分析中数据帧的层次索引介绍

towardsdatascience.com](/how-to-use-multiindex-in-pandas-to-level-up-your-analysis-aeac7f451fce)

为了回答我们的问题,我们希望能够比较 PC、PS4 和 Xbox One 的销售情况,因此该数据透视表便于我们查看数据。初始数据透视表如下所示:

现在,在对这些数据进行排序时,我们感兴趣的是“XOne”的最高“Global_Sales”。如果我们看一下这个数据帧中的列,我们会看到有一个多索引。

df_pivot.columns

当按 MultiIndex 列排序时,需要确保指定相关 MultiIndex 的所有级别。为了对新创建的数据透视表进行排序,我们使用了以下代码:

df_pivot.sort_values(by=('Global_Sales','XOne'), ascending=False)

在这里,您可以看到我们将一个元组传递给了.sort_values()函数。这是因为我们要排序的列名是(' Global_Sales ',' XOne ')。您不能只传递“XOne ”,因为在这种情况下这不是一个有效的列名。因此,在对这种数据帧进行排序时,一定要指定 MultiIndex 的每个级别。生成的表格如下所示:

基于此,我们可以看到电子艺界(EA)2015 年全年 Xbox One 销量最高。我们还可以看到其同年在 PC 和 PS4 细分市场的销量。排序后的数据透视表可以很容易地对不同的列进行并排比较,所以请记住这种方法,因为您可以在许多不同的情况下使用它。

我们完事了。

这只是对熊猫分类的介绍。有许多不同的方法可以找到我们所经历的问题的答案,但我发现排序是进行初步分析的一种快速而简单的方法。

请记住,排序数据帧的方法不止一种。有些方法可能比其他方法更有效,Pandas 提供了内置方法来帮助您编写看起来更整洁的代码。

祝你的分类冒险好运!

BigData/ETL:从头开始设置 ETL 数据管道的 4 个简单步骤

原文:https://towardsdatascience.com/4-easy-steps-to-setting-up-an-etl-data-pipeline-from-scratch-a6e67c40b6e1?source=collection_archive---------21-----------------------

用几个命令建立 ETL 管道

ETL(提取转换负载)

这个博客有什么不可期待的?AWS Glue、AWS 数据迁移服务或 Apache Airflow 等托管 ETL 解决方案。基于云的技术是受管理的,但不是免费的。并且不在本文的讨论范围内。

目录

  1. 什么是 ETL 管道?
  2. ETL 管道有哪些不同的用例?
  3. ETL 先决条件—Docker+Debezium+Kafka+Kafka Connect—鸟瞰图
  4. ETL 设置——4 步流程

1:什么是 ETL?

ETL 代表提取转换加载管道。它用于建立数据仓库或数据湖。

注意:数据仓库收集多种结构化数据源,如关系数据库,但是在数据湖中,我们存储结构化和非结构化数据。

2: 一个 ETL 管道的各种用例有哪些?

ETL 有广泛的用例,如下所示:

  • 为非结构化数据赋予结构,因为我们将它存储到数据仓库中,通常我们使用数据仓库来存储来自多个资源的结构化数据。
  • ML 工程师获取模型训练数据的数据管道。并且经常是 ML 工程师/数据科学家(L1)的首要任务。
  • 用于制作备份或临时数据源。

**注意:**在这个例子中,我们将使用源作为 MySQL 数据库,目的地作为 Elasticsearch,它固有地与 Kibana 集成,用于数据可视化和机器学习。

3: ETL 先决条件—Docker+Debezium+Kafka+Kafka Connect—鸟瞰图

MySQL(源)+Debezium+Kafka/Kafka Connect+elastic search(目的地)+ Kibana

从上图中可以看出,我们将使用以下内容:

  • Docker: 一个容器管理系统(CMS)。为了简单起见,我们使用 Docker。https://www.docker.com/
  • Debezium: Debezium 只不过是一个变更数据捕获(CDC)。它跟踪来自源数据库的每个事件(插入、更新、删除),并使用 Kafka Connect 将事件推送到 Kafka。它使用源数据库日志来读取每个事务,并为特定的事务创建一个事件。

**注意:**对于 MySQL,我们称之为 binlog,对于 PostgreSQL,我们称之为 wal-logs(预写日志)

  • 卡夫卡连接: 顾名思义,帮助 Debezium 与卡夫卡连接。
  • 卡夫卡: 卡夫卡帮助事件流和实时消费。卡夫卡和动物园管理员一起追踪这些事件。https://bit.ly/2Gb9Sm7
  • ***ELK(destination):***我们考虑将 Elasticsearch 作为我们的目标数据源,默认情况下,它与 Kibana 集成在一起,用于数据可视化&机器学习,这就是俗称的 elastic search+Logstash+Kibana(ELK stack)https://bit.ly/36dmioe

4:让我们开始设置它——一个 4 步流程

第一步: 更改 Debezium 喜欢的 MySQL binlog 格式:只需进入/etc/my.cnf,基本上在 MySQL 配置文件中添加以下配置即可:

/etc/my.cnf (MySQL 配置文件)

第二步: 启动 Zookeeper,Kafka & Kafka 使用 Docker 连接:

$ docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper $ docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.0$ docker run -it --rm --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses --link zookeeper:zookeeper --link kafka:kafka --link mysql:mysql debezium/connect:1.0

**注:**熟悉 Docker 的可以用 docker-compose.yaml,可以在这里找到:https://github . com/debezium/debezium-examples/blob/master/tutorial/

步骤 3(提取) :我们将使用curl向我们的 Kafka Connect 服务提交一个 JSON 请求消息,以开始使用 Debezium 从源数据库捕获事件(它需要下面的源数据库凭证):

curl -i -X POST 
-H "Accept:application/json" 
-H "Content-Type:application/json" 
localhost:8083/connectors/ -d 
'{ "name": "etl-connector", 
"config": {                                                 "connector.class":      "io.debezium.connector.mysql.MySqlConnector", 
"tasks.max": "1", 
"database.hostname": "<mysql_host>", 
"database.port": "3306", 
"database.user": "<mysql_username>", 
"database.password": "<mysql_password>", 
"database.server.id": "184054", 
"database.server.name": "dbserver1", 
"database.whitelist": "<database_name>", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.<db_name>" } }'

第四步(变换&加载) :最后一步,写一个卡夫卡式的消费者。消费者只不过是一个简单的函数/代码,它将提取 Debezium 事件,对其进行转换,并将其加载到 ELK 目的地。

请在这里找到完整的参考源代码模板:https://github . com/burhanuddinbhopalwala/ETL-elastic search-app

搞定了!在本例中,我们使用批量插入进行弹性搜索。你可以从上面的源代码中看到下面的日志。

...
2017-09-21 07:38:48,385 INFO   MySQL|dbserver1|task  Kafka version : 0.11.0.0   [org.apache.kafka.common.utils.AppInfoParser]
2org.apache.kafka.clients.consumer.internals.AbstractCoordinator]
2017-09-21 07:38:48,402 INFO   MySQL|dbserver1|task  Successfully joined group inventory-connector-dbhistory with generation 1   [org.apache.kafka.clients.consumer.internals.AbstractCoordinator]
2017-09-21 07:38:48,403 INFO   MySQL|dbserver1|task  Setting newly assigned partitions [dbhistory.inventory-0] for group inventory-connect WorkerSourceTask{id=inventory-connector-0} finished initialization and start   [org.apache.kafka.connect.runtime.WorkerSourceTaskINFO -- : CREATING MASTER DB CONNECTION
INFO -- : CONNECT ELASTICSEARCH
INFO -- : CONNECTED KAFKA
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 1, ID: 685475
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 2, ID: 457548
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 3, ID: 985484
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 4, ID: 258547
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 5, ID: 257544

错误:如果你有任何错误,你可以去 Debezium 网站:https://debezium.io/。

最后,感谢阅读。我希望这篇博客对你有所帮助。一如既往地记得呼吸:)

连接 🤝***:***

  • 邮箱:bbhopalw @ Gmail
  • Linkedin:www.linkedin.com/in/bbhoaplw

用于进一步阅读✍️***:***

大数据&云工程博客:

  • 【https://medium.com/@burhanuddinbhopalwala】走向数据科学出版:

后端工程&软件工程博客:

  • DEV 社区: https://dev.to/burhanuddinbhopalwala

Python 中 4 个易于使用的自省函数

原文:https://towardsdatascience.com/4-easy-to-use-introspection-functions-in-python-49bd5ee3a2e8?source=collection_archive---------16-----------------------

Python 初学者

如何在运行时检查对象

照片由埃迪·利贝丁斯基在 Unsplash 拍摄

Python 是近年来最流行的编程语言。很多人都知道。但如果你问 Python 有哪些与众不同的优势?不是每个人都能回答这个问题。可能有很多答案。

对我来说,肯定是'对象内省'或者'类型内省'。虽然您可以在许多其他语言中找到类似的特性,但 Python 无疑为您提供了最适合初学者的内置工具。

但首先,什么是对象内省?

它能够在运行时检查对象的类型或属性,并在代码中利用它们的属性。下面是初学者应该学习的 4 个简单易用的自省功能。

1.类型()

数据类型是对象的分类,决定了可以对其执行何种操作。例如,加号运算符+可以应用于整数,也可以应用于字符串,但是它们的执行方式不同。

a = 1 + 1 # 2
b = 'Hello' + 'World' # 'HelloWorld'

前者是求和运算,而后者是串联运算。如果你试着把1 + 'Hello'加在一起,你会得到一个错误,因为这个操作是未定义的。

因此,数据类型非常重要,因为它影响操作的执行方式。然而,Python 中的数据类型是一个噩梦。这是因为不同的库有许多不同的数据类型,由不同的人群用不同的标准和用法编写。

例如,在 Python 中有许多不同的方法来“包含”或“保存”数字 1,下面是一些例子:

a = 1
b = 1.0
c = [1]
d = (1,)
e = np.int64(1)
f = pd.DataFrame([1])
g = 'one' # well, why not?

照片由伊丽莎白·罗威尔·马特森在 Unsplash 上拍摄

在同一个脚本中使用不同的数据类型是很常见的。为诊断目的检索对象数据类型的最简单方法是使用type()

print( [type(x) for x in [a,b,c,d,e,f,g]] )
# [<class 'int'>, <class 'float'>, <class 'list'>, <class 'tuple'>, <class 'numpy.int64'>, <class 'pandas.core.frame.DataFrame'>, <class 'str'>]

2.isinstance()

要检查一个对象是否是一个类的实例,标准的方法是isinstance(object, class)。它有两个参数,一个对象和一个类。如果objectclass的实例,函数返回True,否则返回False

a = 1
if isinstance(a, int):print('a is an integer.')
else:print('a is not an integer.')# 'a is an integer.'

因为它返回一个布尔对象,所以通常用在条件子句中。如果class参数是一个元组,如果对象是元组中的类型之一,它将返回True

my_fav_numbers = [-1, 1, 5]
print(isinstance(my_fav_numbers, (dict, list))) # True

假设你定义了一个函数,它应该只接受整数作为参数,否则,就会出现意想不到的后果,比如一个永不结束的递归函数。您可能想要检查参数是否是int的实例。

assert isinstance(n, int), 'n should be an integer!'

本文中的更多信息:

[## 如何用 3 个步骤编写递归

Python 中的分步示例

medium.com](https://medium.com/better-programming/how-to-write-recursion-in-3-steps-9d512189a94e)

蒂莫西·戴克斯在 Unsplash 上拍摄的照片

3.目录()

这可以说是 Python 中最强大的内省功能。您可以看到对象的所有有效属性和方法。

a = [1,2,3]
print(dir(a))
# ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

这里有一个可以应用在对象a上的方法列表(以字符串的形式),比如sort对列表进行排序,pop获取和移除列表的最后一个元素等等..因此,如果您不确定是否存在方法sort,只需检查'sort' in dir(a),如果存在,它将返回True

另一方面,当你在没有任何参数的情况下调用dir()时,你会期待什么?一个错误?不要!

它返回当前范围内的名称列表!记得我之前定义过my_fav_numbers吗?或者我有吗?让我们检查一下:

'my_fav_numbers' in dir() # True

4.id()

id()返回对象的内存地址。Python 没有指针的概念,但是您仍然可以使用id()来模拟指针操作。这可能太高级了,但是仍然有一些简单的事情可以通过这个函数来完成。

a = [1,2,3]
b = aprint(id(a), id(b))
# 140301827626760 140301827626760print(id(a[0]))
# 140302068451232

通过检查对象ab的 id,我们知道它们有相同的内存地址。

照片由 Unsplash 上的 MARK S. 拍摄

另一方面,如果您想更多地了解可变对象,检查它们的内存地址会有所帮助。

a = [1,2,3]
print(id(a)) # 140298456699464a = [4,5]
print(id(a)) # 140298456729672a[0] = -1
print(id(a)) # 140298456729672

你能解释一下上面片段中发生的事情吗?如果您不知道什么是可变对象,请查看下面的文章:

[## Python 初学者应该避免的 4 个常见错误

我很艰难地学会了,但你不需要

towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)

外卖

我们仅仅触及了 Python 中内省函数的皮毛。你觉得那些功能有趣有用吗?下面留言评论!你也可以注册我的时事通讯来接收我的新文章的更新。如果您对提高 Python 技能感兴趣,以下文章可能会有所帮助:

[## 初学者应该知道的 4 个隐藏的 Python 特性

如何轻松增强您的 Python 代码

towardsdatascience.com](/4-hidden-python-features-that-beginners-should-know-ec9de65ff9f8) [## Python 初学者应该避免的 4 个常见错误

我很艰难地学会了,但你不需要

towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)

4 个基本的 A/B 测试部分

原文:https://towardsdatascience.com/4-essential-a-b-testing-segments-c966f01b0b0e?source=collection_archive---------43-----------------------

进行 A/B 测试时,您应该回顾的 4 个部分

动机

根据 Fast.ai / FastBook ,

试着思考反馈回路在你的系统中的所有表现方式,以及如何在你的数据中识别它们。最后,这又回到了我们最初的建议,即在推出任何类型的机器学习系统时,如何避免灾难。

简而言之,考虑您的用户群和可能影响您的 ML 系统的特定细分市场是有好处的(部署前或部署后,但在这种情况下,我们更关注部署后)。Fast.ai 很好地解释了各种用户群如何影响你的整体 ML 系统。如果我们想一想——如果我们使用 A/B 测试来评估我们的 ML 系统,那么这个想法也适用于 A/B 测试。所以,重要的是我们要思考我们的 A/B 测试可能会出错的原因。

介绍

几年前,我看到了一个关于 A/B 测试的精彩演示。该演示介绍了进行 A/B 测试时需要注意的 4 个部分。我的老板*(当时)*和我在工作中使用这个术语,发现它非常有见地。

快进到今天,到处都找不到原来的讲座 lol。所以我想我应该写一篇关于这个主题的文章*(为我自己也为别人)。同样,如果我能找到的话,我会参考最初的演讲(可能是优步)*。

那么这些神奇的段子我们应该考虑哪些呢?

这些片段

由作者用 MS Paint 创建

他们来了,光彩照人。我尽力记住了原来的段名,但是失败了,所以我创造了新的名字。这些原则应该仍然有效。好了,下面我给出了更多关于如何解读这张图的细节。

  • 影响了! =如果你做出改变*(一个或多个)*这些是你帮助过的人。假设你正在 A/B 测试一个新的通知,这些人会在你的通知生效时积极行动!由于你所做的改变,这些人更多地使用你的应用程序。他们说“干得好!坚持下去!”
  • 不管你在做什么,不管你在做什么实验,这些人都会继续使用你的应用。这些是你的收养者。他们采纳了你的应用,超越了所有的实验。不管你的应用程序有没有变化,这些都是你的强用户。不利的一面是,你做的任何事情都不能真正增强它们的用途。从好的方面来说,谁在乎呢?!这些人喜欢你的申请!
  • 打乱了! = Ut-oh!以前有人很开心,现在你的改变让他们抓狂了。这些人要么不喜欢你所做的改变,要么他们讨厌改变,不管是哪种情况,都不要去管他们。
  • 憎恨者 =“这个应用程序很愚蠢”是这些人说的,不管你对你的应用程序做了什么改变。这些人只是不喜欢你所拥有的,很难将他们切换到*【受影响】的部分。祝他们成为【领养者】好运。对一些人来说,你可能有更好的机会赢得乐透。例如,也许你有一个社交媒体应用程序,并说你有一个【仇恨者】注册了,因为他们的朋友制作了它们。因此,这位客户确实不喜欢社交媒体,但他们碰巧有一个个人资料,只是为了取悦一个朋友。你的新通知系统不太可能赢得他们的支持*(有可能但不太可能)

迷茫?别担心。让我们试一个例子。

假设你拥有世界上最好的纸尿裤在线零售商 Diapers.com。你的顾客需要注册一个账户,然后才能去买他们想要的所有尿布。因为你的网站没有顾客结账,你知道谁是你的顾客,他们买什么,他们不买什么。您想要测试您的结帐页面的新外观。你想看看新的背景色是否能促进销售。您有一个通常的结帐页面,它有一个浅红色的背景颜色,我们称之为'红色'视图。你想引入一个新的浅蓝色背景视图,我们称之为新的'T14 蓝色 T15'视图。我们希望新的'蓝色'结账视图将有助于增加销售额。

*当你有'红色'页面时购买量减少,但有了新的'蓝色'页面时购买量增加的客户——这些是你的'**影响!”*顾客。这些顾客喜欢你新的结帐背景色!

那些在“红色页面购买了大量商品,并且仍然在新的“蓝色页面购买了大量商品的人——这些人就是你的“采纳者”。不管你做什么网站改变,这些顾客都会买纸尿裤。

那些以前没有买很多东西,并且仍然没有用你的新'蓝色'页面买很多东西的人——这些是你的'憎恨者。不管你做什么网站改变,这些顾客几乎不买纸尿裤。

最后,那些曾经购买很多,但现在随着您的新'T34 蓝色 T35'页面,他们购买较少-这些是您的'T36 中断!‘顾客’。这些顾客以前会买很多纸尿裤,但是你的新背景色导致他们买的纸尿裤变少了!哎呦!

摘要

这有什么大不了的?嗯,你可以做你的 A/B 测试,汇总你所有客户的结果,然后报告你的发现。其实这是你应该做的事情。但是,如果你发现你的 A/B 测试对你的人群几乎没有什么影响呢?你最终可能会扔掉一些用户非常喜欢的非常好的特性。将你所有客户(在你的测试人群中)的 A/B 测试结果汇总是你应该做的事情,但这不应该是你唯一做的事情。

既然【仇恨者】采纳者没有受到你的实验的影响,也许你应该把他们从你的 A/B 测试结果中去掉(或者至少有一个排除了这些群体的结果版本)。为什么?好吧,在你的结果中包括这些客户会给你的结果增加很多噪音,从而淹没你对业务的真正影响。

你能识别出“中断的”片段吗?如果是这样的话,您可以为这些客户关闭该功能。为什么要从你的“影响”中去掉一个特征呢顾客爱在你没有的时候?也许你可以定制每个客户的体验?为什么要扔掉能让你赚钱的东西呢?

此外,您可以在宏观和/或微观层面上查看这些细分市场。例如,您可以通过多次实验对您的客户进行细分。或者,您可以针对一个实验对您的客户进行细分。无论哪种方式,都有新的信息可以获得。这种细分之所以如此有效,是因为它让你更好地了解你的实验表现和你的客户群。哪些客户在拖后腿?哪些客户喜欢你做的一切?分解你的 A/B 测试结果会有很多收获。

结束了

就是这样!感谢您的阅读,并希望您发现这是有帮助的!

数据科学家经常低估的 4 项基本技能

原文:https://towardsdatascience.com/4-essential-skills-often-underestimated-by-data-scientists-4650a7c11eee?source=collection_archive---------28-----------------------

数据科学不仅仅是数据

照片由像素的皮克斯拜拍摄

每当您查找成为数据科学家的路线图时,您经常会面临一系列需要发展和提高的技术技能,以便开始您的职业生涯。然而,这些指南中的大部分经常会错过——或者故意忽略——它们和所有的技术技能一样重要,但是经常被低估。

数据科学家或开发人员不仅仅是程序员或数据挖掘者;他们集不同角色于一身。他们有点像商业规划者、科学传播者、分析师和想法产生者。

作为一门数据科学,不仅仅是编写高精度的模型;它不仅仅是坐在电脑前,学习如何编码,如何使用特定的模型,或者阅读该领域的最新研究。

在本文中,我将介绍一些技能,我认为这些技能对于一名数据科学家在职业生涯中脱颖而出至关重要。这些技能大部分都是软技能,有一个技术技能似乎大部分时间都被忽略了。

清晰有效的沟通技巧

沟通是最重要的技能,在大多数技术领域都被遗忘了,不仅仅是数据科学。当你的工作是处理复杂的方面,试图理解我们周围的世界时,我们会让一切变得过于复杂。

这是有原因的,在大多数技术领域,当我们与其他开发人员和程序员,甚至是研究人员开会时,我们需要看起来既精通又聪明。所以,我们使用花哨的词语和复杂的例子。

如果不能简单的解释,说明你理解的不够好。——爱因斯坦

这种策略在技术环境中可能行得通,但如果你需要将你的发现传达给更广泛的受众,它就行不通了。有效沟通的能力不仅仅是简单地解释复杂的想法。要成为一名有效的沟通者,你需要练习用正确的词语表达你的想法。

此外,有效沟通的一个重要部分是使用正确的视觉辅助工具,它不会与你的话相矛盾,而是支持它,并有助于更好地传递你的想法。

要成为一个更好的沟通者,练习做以下事情:

  1. 适应口头和非口头交流。肢体语言和你实际说的话一样多。
  2. 保持事情简明扼要。一种方法是使用 PIP 模型(目的、重要性、预览)。陈述你工作的原因,它为什么重要,以及它是如何工作的。
  3. 不要仅仅依赖你的视觉辅助工具——图表。当你展示它们时,简单地解释它们各自代表了什么。
  4. 掌握好时机。人类的一个坏习惯是,当我们在公共场合讲话时,我们倾向于东拉西扯。为自己设定一个明确的时间目标将有助于你避免这种情况。

[## 数据可视化 101:有效可视化的 7 个步骤

用引人注目的视觉效果讲述您的数据故事。

towardsdatascience.com](/data-visualization-101-7-steps-for-effective-visualizations-491a17d974de)

基本的业务理解

任何数据科学项目的第一步都是数据。你需要收集数据,清理数据,然后分析数据。要做到这一点,就要分析数据,理解它试图告诉你的故事;您需要对数据源有一些基本的了解。

大多数时候,我们使用特定的业务模型收集数据,以服务于特定的目标。了解业务模型的基础可以帮助您更好地理解数据,从而更好地分析数据。

“数据科学不仅仅是处理数字:它是应用各种技能来解决行业中的特定问题”——n . r . Srinivasa Raghavan

成为一名数据科学家不仅仅是数字;虽然数字在该领域发挥着巨大的作用,但每个数据科学家都需要知道他们工作领域的商业模式。他们需要知道为什么要遵循这种模式,以及它对业务有何益处。

一个收集和分析数据却不知道数据背后的商业模式的数据科学家,就像是在读一个用另一种语言写的故事,但用的是你母语的字母表。你可以阅读它,但除非你翻译它,否则你无法理解它。

你不需要深入研究或者去商学院更好地理解你的数据。你只需要知道在你的工作场所遵循的特定模式的基础。

协作和团队精神

作为一名数据科学家,你永远不会独自工作。你总是为同一个目标而努力的团队中的一员。你可能需要与经理、设计师、市场以及最重要的客户打交道。当然,还有其他数据科学家。

为了能够在这样的工作环境中成长和证明自己,你需要成为一名优秀的团队成员,乐于听取新的想法,并总是欢迎建设性的反馈。你应该保持开放和客观,同时保持你独特的视角。

作为团队成员的另一个方面是与开源项目合作。开源软件是你发展技能、回报社区/社会以及结识与你有相同兴趣和想法的人的一种方式。

最后,成为团队成员的一个好方法是指导。当你主动提出成为新人的导师时,无论是在一般领域还是在你特定的工作场所,你不仅仅要证明你知识渊博,显示你灵活并愿意与他人分享你的知识。

维护代码的能力

我想谈的最后一项技能是一项技术技能,当我们进入这个领域时,我们(包括我自己)似乎需要克服这项技能。这个技能就是版本控制的流畅性。

用最先进的模型编写好的代码并不是终点。在软件开发中,没有终点;总有一些东西需要添加和改进。编写可维护的代码并绘制代码是一项需要大量时间和实践才能掌握的技能。

第一步是熟悉版本控制。我意识到版本控制并不有趣,而且在大多数时候,非常令人困惑,但尽管如此,这是每个数据科学家都应该掌握的基本技能。

如果你的代码维护得很好,其他数据科学家会很容易理解。它很容易构建和扩展。如果您的数据结构发生变化,拥有一个可维护的代码将使适应新数据的过程更加顺利。

[## 版本控制 101:定义和好处

什么是版本控制,为什么它很重要?

towardsdatascience.com](/version-control-101-definition-and-benefits-6fd7ad49e5f1)

结论

成为一名数据科学家不仅仅是为了数据。有时它是商业、营销和沟通的结合。为了成为一名有影响力的数据科学家,你需要掌握一些技能。

技能,如有效和清晰的沟通技巧,对商业模式的一些基本理解,以及成为一名优秀团队成员的能力。这些软技能可以改变你的职业生涯,为你的未来打开新的机会和视角。

一开始,从事数据科学职业可能会让人望而生畏,但我认为这是非常值得的。当你用数据讲述一个故事,在选择中找到模式,并帮助让这个世界变得更美好时,你会获得这种令人惊叹的成就感,让你忘记所有你必须经历的麻烦。

管理大型分布式数据团队的 4 个基本策略

原文:https://towardsdatascience.com/4-essential-tactics-for-managing-a-great-distributed-data-team-e7df9f85e6fa?source=collection_archive---------46-----------------------

给我们远程第一世界的数据领导者的建议。

图片由克里斯·蒙哥马利在 Unsplash 上提供。

新冠肺炎已经迫使几乎每个组织适应新的劳动力现实:分布式团队。我们分享四个关键策略,让您的远程数据团队成为整个公司的力量倍增器。

现在是第 6 个月(还是 72 个月?很难说)全球疫情,尽管从你的卧室到餐桌的通勤时间很短,但你仍在适应这种新常态。

您的团队负责所有相同的任务(处理临时查询、修复损坏的管道、实现新的规则和逻辑等)。),但是对损坏的数据进行故障排除只会变得更加困难。当你们彼此相距 5 英尺远时,确定一个 数据停机 事件的根本原因已经足够困难了;当你在不同的时区工作时,这要困难 10 倍。

分布式团队并不新奇,事实上,在过去的几十年里,它们变得越来越普遍,但是在疫情期间工作对每个人来说都是新的。虽然这种转变扩大了地理人才库,但这种规模的合作会带来不可预见的障碍,特别是在处理实时数据时。

你每天的站立只能让你到此为止。

以下是管理大型分布式数据团队的 4 个基本步骤:

记录所有的事情

当团队被分配时,关于哪些表和列是“好的或坏的”的信息被分解。我们在一家领先的电子商务公司采访的一位数据科学家告诉我们,团队需要花 9 个月的时间来开发一种蜘蛛感知能力,了解哪些数据位于何处,哪些表是“正确的”,哪些列是健康的,哪些是实验性的。

答案?考虑投资数据目录或沿袭解决方案。这种技术提供了一个关于团队数据资产的真实来源,并使理解数据输入的格式和样式指南变得容易。当数据治理和法规遵从性开始发挥作用时,数据目录变得尤为重要,这是金融服务、医疗保健和许多其他行业的数据团队最关心的问题。

为数据设置 SLA 和 SLO

不仅要确保数据团队成员之间的一致性,还要确保与数据消费者(即营销、高管或运营团队)的一致性,这一点非常重要。要做到这一点,我们建议从站点可靠性工程书籍中抽出一页,为数据设置并调整清晰的服务级别协议(SLA)和服务级别目标(SLO)。围绕数据新鲜度、数量和分布的期望 SLA,以及可观察性的其他支柱,在这里将是至关重要的。

Reddit 的数据科学经理 Katie Bauer 建议分布式数据团队保留一份重要项目的预期交付日期的中心文件,并每周审查该文件。

她说:“当利益相关者提出问题时,我可以很容易地访问这份文件来寻找答案,而不是在一周内 ping 我的团队进行更新。”“这让我们专注于交付工作,避免不必要的转移。”

投资自助工具

投资自助式数据工具(包括像雪花和红移这样的云仓库,以及像 Mode、Tableau 和 Looker 这样的数据分析解决方案)将简化数据民主化,无论数据用户的位置或角色如何。

同样,自助式版本控制系统有助于每个人在大型工作流上进行协作时保持一致,这在跨时区利用实时数据时变得极其重要。

优先考虑数据可靠性

负责管理 PII 和其他敏感客户信息的行业,如医疗保健和金融服务,对错误的容忍度很低。数据团队需要确信,从消费到输出,数据在整个管道中都是安全和准确的。围绕数据可靠性的正确流程和程序可以防止此类数据停机事件并恢复对您数据的信任。

许多年来,数据质量监控是数据团队捕获不完整数据的主要方式,但这种方式不再适用,尤其是当实时数据和分布式团队成为常态时。我们的远程优先世界需要一个更全面的解决方案,能够无缝跟踪数据可观察性的五大支柱以及根据您组织的需求量身定制的其他重要数据健康指标。

记住:不好也是好的

我们希望这些建议能帮助你接受甚至拥抱数据世界的新常态。

然而,除了这些更具战术性的建议之外,记住不好也没关系也无妨。git lab 的第一位数据分析师 Emilie Schario ,现在是内部战略顾问,说得好:“这不是普通的远程工作。在全球疫情的强制远程工作期间取得成功的要素与“照常远程工作”的含义不同。”

我们很想听听你对领导分布式团队的建议!向 巴尔摩西 伸出你的智慧之言。

这篇文章是由威尔·罗宾斯 & 巴尔·摩西写的。

4 门免费数学课程,用于隔离和提升您的数据科学技能

原文:https://towardsdatascience.com/4-free-maths-courses-to-do-in-quarantine-and-level-up-your-data-science-skills-f815daca56f7?source=collection_archive---------3-----------------------

来源:this is engineering@ Pexels—免费库存图片

因为没有数学数据就没有科学

当我进入数据科学和机器学习领域时,任何与数学和统计相关的东西都是我在大约 10 年前最后一次访问的,我估计这可能是我一开始觉得很难的原因。我花了很多时间阅读和观看视频,对我们在行业中日常使用的许多工具的事情是如何发生的有了一些基本的了解。然而,到了一定程度,我觉得有必要对我在 Jupyter 笔记本上做的所有“导入”和“适应”背后发生的事情有一个坚实的理解。所以我决定是时候擦掉我数学知识上的灰尘了。

现在,我还在做这件事,我想这永远不够。此外,我来自商界,身处一个充斥着来自工程、统计、物理和其他精确科学的专业人士的行业。我知道在数据科学的世界里有很多东西要学,但是你知道吗?技术和语言可能来来去去,但是这个领域的数学背景将会一直存在。

这就是为什么今天我总结了 4 门课程来提高你的数学知识,并利用一些由于这种不幸的情况而给予我们的空闲时间。因为,你知道,这些天你应该呆在家里😉。

1。 机器学习的数学

地点:Coursera

参与机构:伦敦帝国理工学院

所需时间:104 小时(实际上至少+50%)

先前要求:无

课程本身的摘要:

对于机器学习和数据科学中的许多高级课程,你发现你需要更新数学基础知识——这些东西你可能以前在学校或大学里学过,但在另一种背景下教授,或者不是很直观,以至于你很难将其与计算机科学中的使用联系起来。这个专业旨在弥合这一差距,让你跟上基础数学的速度,建立直观的理解,并将其与机器学习和数据科学联系起来。

涵盖的主题:

  • 线性代数
  • 多元微积分
  • 主成分分析

提示:Coursera 的大部分课程和专业都有审核的选项。你不会获得证书,但你可以使用课程的大部分资源。我个人觉得这已经足够了。注册时,只需选择课程审核选项:)。

2。 机器学习必备数学:Python 版

地点:edX

参与机构:微软

所需时间:50 小时

先决条件:Python 和一些数学基础知识

课程本身的摘要:

想学习机器学习或人工智能,但又担心自己的数学能力可能达不到?像“代数”和“微积分”这样的词会让你感到恐惧吗?你是否已经很久没有在学校学过数学了,以至于你已经忘记了很多当初学过的东西?

你并不孤单。机器学习和人工智能建立在数学原理上,如微积分、线性代数、概率、统计和优化;许多潜在的人工智能实践者发现这令人望而生畏。这门课程不是为了让你成为数学家而设计的。相反,它旨在帮助你学习一些重要的基本概念和用来表达它们的符号。本课程提供了处理数据和应用所学技术的实践方法。

涵盖的主题:

  • 方程式、函数和图形
  • 差异化和最优化
  • 向量和矩阵
  • 统计和概率

提示:本课程有开始日期,但你可以选择一个更早的开始日期,并免费查看该群组的所有内容。

3。 数据科学中的概率统计使用 Python

地点:edX

参与机构:加州大学圣地亚哥分校

所需时间:100-120 小时

先修要求:多元微积分和线性代数

课程本身的摘要:

对不确定性的推理是噪声数据分析中固有的。概率和统计为这种推理提供了数学基础。

在这门课程中,你将学习概率和统计的基础。您将学习数学理论,并获得使用 Jupyter 笔记本将该理论应用于实际数据的实践经验。

涵盖的主题:

  • 机器学习的数学基础
  • 统计素养:理解诸如“在 99%的置信水平上”这样的陈述的含义

提示:本课程有开始日期,但您可以选择一个更早的开始日期,并免费查看该群组的所有内容。

4。 贝叶斯统计:从概念到数据分析

地点:Coursera

参与机构:加州大学圣克鲁斯分校

所需时间:22 小时(实际上不少于 30 小时)

先决条件:对概率有一些基本的了解

课程本身的摘要:

本课程介绍了统计的贝叶斯方法,从概率的概念开始,到数据的分析。我们将学习贝叶斯方法的哲学,以及如何对常见类型的数据实施它。我们将比较贝叶斯方法和更普遍教授的频率主义方法,并看到贝叶斯方法的一些好处。

涵盖的主题:

  • 概率和贝叶斯定理
  • 统计推断
  • 离散数据的先验和模型
  • 连续数据模型

这就是现在所有的窥视。我建议按照给出的顺序学习这些课程,当然,如果你符合要求,也可以学习你喜欢的任何课程:)。

别忘了看看我的一些最新故事:

  • 我们数据人为什么以及如何帮助对抗新冠肺炎
  • 官方:时间不存在;如何处理时间特征?
  • 我应该在我的机器学习模型中包含截距吗?

此外,请随意访问我在 Medium 上的个人资料,查看我的其他故事和如果您想直接在您的电子邮件上收到我的最新文章,只需 订阅我的简讯 **:)。**最后,我想知道您是否对未来故事的其他特定类型的课程感兴趣:

回头见!感谢您的阅读!

地道熊猫代码的 4 个隐藏的宝石

原文:https://towardsdatascience.com/4-hidden-gems-for-idiomatic-pandas-code-99c706e6ce93?source=collection_archive---------24-----------------------

图片来源:像素

分享更多熊猫提示来提高你的数据处理水平

我的上一篇文章,熊猫的 6 个鲜为人知但令人敬畏的技巧,希望已经给你一些熊猫高效编码的味道。继续这个话题,如果你还不知道的话,让我们来探索更多关于熊猫的小技巧和窍门。

这篇博客将使用我们在上一篇博客中讨论过的 html 技巧,使用直接从维基页面食物营养成分表中抓取的乳制品表。这是一张表格的快照,显示了食物名称、度量单位/克数以及相应的热量值。

1。 **Pandas series** **list** **series of lists**

简单来说,Pandas 中的 series 是一个带有索引标签的一维数组。与设计用于指示元素位置的列表索引不同,序列中的索引标签可以是用户定义的任何内容。这当然在使用序列时提供了灵活性,但是如果你不熟悉索引标签在 pandas 中是如何工作的,这也“设置了一个陷阱”。

所以我们今天的任务#1 是检查一个值(例如,skim, instant)是否存在于一个序列中(例如,dairy_table[‘Food’])。如果是,则返回 true 否则为假。很简单,这个任务只需要一行代码,如下图所示,

惊讶和困惑?用最直观的 in 操作符,我们的第一个代码返回,然而第二个代码返回?为什么 Python 告诉我食物一栏不含skim, instant,含index6

嗯,原因是使用in直接检查熊猫系列将检查skim, instant是否存在于索引标签中,而不是我们的食物列的。因此,为了避免落入这个“陷阱”,我们必须指定值/值列表作为我们的搜索空间,下面演示了几种方法,

当在 Pandas 中处理系列时,继续下一个潜在的“陷阱”,也就是说,允许一个单独的系列包含列表/元组,并且需要额外的步骤将它们解析到它们自己的列中。例如,让我们将我们的 dairy 表修改为一个包含值元组的数据帧,作为一个新的列 Nums

现在,我们的任务#2 是将 Nums 列分成两个单独的列。同样,最直观的方式是通过索引来访问元组中的每个元素,

当然,对于每个元组中只有两个值的例子来说,这是可行的。如果我们有数百个值,而无法手动访问每个元素,该怎么办?另外,正如我们从输出中看到的,这个 list comprehension 返回一个必须进一步转换为整数值的字符串列表。相当多的基本细节!

那么有没有一个简单的方法来实现它呢?答案是肯定的,而且非常简单,如下所示,

**** * 更新 2022:加入我们的 YouTube 社区🎦** 【数据说话带吉】 😄

2。宁滨值潇洒地用 **map** **applymap**

我们的任务#3 是将食物值分为三类——牛奶、布丁和奶油,定义如下:

与其单调乏味地创建多个if语句或isin()函数,不如通过利用映射技巧以更智能的方式来实现。首先,我们将值组织到一个映射字典中,其中每个值属于其对应的 bin,

然后,我们使用mapapplymap来替换原始值,

这里有两点需要注意:

(1)我们交换了原始映射字典中的键和值,以便它的键与数据集中的实际食物名称匹配。

(2)我们演示了两种实现方式:mapapplymap,我经常被问到这两个概念的区别。简单来说,**map** 取入并返回系列,而**applymap**取入并返回数据帧。例如,上面代码中的map()函数用于食物序列,它用序列方法fillna()将字典中没有的值重新编码为*‘其他’*。

相比之下,第二个函数applymap()用于整个数据帧,搜索与字典关键字匹配的值(即食物名称),然后用相应的字典值(即 bin 名称)替换它们。如果没有找到匹配的键,代码将保持原始值不变。

因此,map()applymap()都可以工作,上面的一行代码写起来简洁且易于维护,更不用说它应该比遍历每个食物名称的组要快得多。

3。 **where** 用作相当于 **ifelse** 中的 R

R 中我最喜欢的一个函数是ifelse;类似地,Pandas 提供了where函数来做同样的事情:当指定的布尔条件不满足时替换值。

例如,下面显示了一个食品名称列表,我们的目标是用*‘其他’*替换列表中省略的食品名称。现在,让我们看看where(other)如何方便地完成这个数据操作任务,

4。类型**category** 类型保存内存

最后但同样重要的是,我想讨论一个关于 Pandas 中的分类数据类型的技巧,这是为对象数据节省空间的另一种选择。保存为object-dtype的字符串通常会占用大量内存,而category-dtype在后端使用整数值来表示原始值,因此更节省空间和时间。现在,让我们仔细看看我们刚刚创建的 object-dtypeFood _ Category列,

这里有几个注意事项,(1)一旦被转换为类别类型, Food_Category 被编码为整数;(2)通过将对象数据类型转换成类别数据类型,存储器使用从 1051 字节减少到 427 字节(即,减少 60%)。

然而,关于 category-dtype 的两个警告不能被忽略。首先,就像 R 中的factorscategory-dtype在新值赋值方面不像object-dtype那样灵活。例如,如果我们想用下面的代码向 Food_Category 列添加一个新的类别/级别,我们将得到臭名昭著的 ValueError msg。该错误指示新级别(即,另一个 _ 类别)在被分配给任何行之前必须首先被添加到容器中,

因此,正确的方法是首先使用add_categories()方法设置电平值,

关于category-dtype的另一个警告是,对于具有较少重复值的列,极端情况是所有的值都是唯一的,category-dtype将比object-dtype占用更多的内存。让我们以食物列为例,这里所有的值都是唯一的,

我们可以看到,一旦食物列被转换为category-dtype,memory_usage 从 1605 字节增加到 2262 字节(即增加了 41%)。因此,当一个object-dtype 列包含许多重复值时,分类将最有利于高效存储。

上前练习

总而言之,我已经分享了我的熊猫小贴士和技巧,我希望我能早点知道。完整代码链接在我的 Github 里。现在轮到你开始编码了!😃

没有不断的练习,就不会有优秀的音乐[熊猫]。

简·奥斯汀《傲慢与偏见》中的凯瑟琳夫人(第 31 章)

我希望你喜欢这个博客! 想要更多数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的全部访问权限。

还订阅我新创建的 YouTube 频道 《数据与吉谈》

以下是我的其他博客,你可能也会觉得很有启发性。

* [## 每个数据科学家都应该知道的 6 个 SQL 技巧

提高分析效率的 SQL 技巧

towardsdatascience.com](/6-sql-tricks-every-data-scientist-should-know-f84be499aea5) [## SQL、R 和 Python 中的数据整形

从 Python vs. R 到 Python & R

towardsdatascience.com](/data-reshaping-in-sql-r-and-python-d44ca19e71b8)*

初学者应该知道的 4 个隐藏的 Python 特性

原文:https://towardsdatascience.com/4-hidden-python-features-that-beginners-should-know-ec9de65ff9f8?source=collection_archive---------4-----------------------

Python 初学者

如何轻松增强您的 Python 代码

本·怀特在 Unsplash 上拍摄的照片

学习是永无止境的。你将永远学不完如何用 Python 编程。你可能会不断发现Python 中有用的新特性,你可能会被需要学习的内容淹没。

不存在一本书或一个网站包含你需要了解的关于 Python 的一切。甚至官方文件也没有。Python 的可能性基本上是无限

我用 Python 编码已经很多年了,并且发现了一些有趣的 Python 特性,这些特性非常独特。你在其他编程语言中找不到的东西。这里有 4 个隐藏的 Python 特性,Python 初学者可能会觉得有用。

1.For-else 循环

你熟悉 Python 中的条件语句吗?

while循环,打勾
for循环往复,轻松
if else从句,你把它钉在了上。

for else条款呢?什么?

只有当 for 循环完成而没有遇到 a break语句时,else块中的代码才会运行。如果你不知道什么是break,那么看看下面的文章了解更多信息。

[## 如何在 Python 中使用传递、中断和继续

Python 中退出子句的三种方法

medium.com](https://medium.com/better-programming/how-to-use-pass-break-and-continue-in-python-6e0201fc032a)

那么这个 for-else 循环怎么有用呢?也许用户在for _ in range(3):循环中有 3 次尝试输入正确的密码,只有正确的密码激活break语句。else块包含连续 3 次输入错误密码的后果,例如锁定用户使用系统。

令人惊讶的巨蟒。

照片由 Ali Gooya 在 Unsplash 上拍摄

2.比较运算符链接

您希望检查a中的值是否在 0 到 100 的范围内,因此您将进行两次比较,并使用and将它们组合起来。0 <= aa <= 100。这很简单。

但是你可以链接这些比较,并以一种更容易被人理解和更直观的方式0 <= a <= 100写出来。解释器会将它们分开,并读取类似0 <= a and a <= 100的比较操作。

a = 25
0 <= a <= 100       # True
0 <= a and a <= 100 # True
# The two expressions above are **equivalent** in Python

也可以把链条做得更长,比如0 < a < 10 < b < 100

直觉蟒。

3.扩展切片

我们可以使用语法a[start:stop:step]和可选的第三个步骤参数分割列表a。它读取切片序列的一部分,从start开始,到stop结束,步长为step。步长必须是整数,并且可以是负的。

a = list(range(10))
print(a[::2])   # [0, 2, 4, 6, 8]
print(a[3::-1]) # [3, 2, 1, 0]

我们可以通过将步骤参数设置为-1简单地通过a[::-1]反转列表。如果没有指定,该步骤默认为1,这意味着没有元素跳过或列表反转

令人印象深刻的蟒蛇。

西蒙·马辛格在 Unsplash 上拍摄的照片

4.价值交换

Python 中如何交换两个对象的值?轻松点。你只需创建一个临时对象temp,就像你在其他语言中做的那样。

# Standard way to swap values of two objects in other languages
temp = a
a = b
b = temp

但这不是很可读性也远非优雅。但是您实际上可以使用 Python 中的一行简单代码轻松地交换这些值。

# Standard Python way to swap values
b, a = a, b

为什么有效?解释器首先评估右侧,并在内存中创建一个元组 (a,b)。然后对左侧进行评估,其中元组中的两个元素分别被解包赋值ba。它实质上交换了分配给ab的对象。

极小的蟒蛇。

Jakub Dziubak 在 Unsplash 上拍摄的照片

相关文章

感谢您的阅读!你觉得那些功能有趣有用吗?下面留言评论!你也可以注册我的时事通讯来接收我的新文章的更新。如果您对提高 Python 技能感兴趣,以下文章可能会有所帮助:

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性

请做好准备,因为 Python 2 不再受支持

towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc) [## Python 初学者应该避免的 4 个常见错误

我很艰难地学会了,但你不需要

towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)

原载于edenau . github . io

数据科学家本周应该阅读的 4 篇有趣文章(11 月 13 日)

原文:https://towardsdatascience.com/4-interesting-articles-data-scientists-should-read-this-week-nov-13-cf7c73229aef?source=collection_archive---------40-----------------------

为机器学习从业者和数据科学家编写的优秀文章

作者图片

大师算法——比尔·盖茨建议你阅读《更好地理解人工智能》,作者是贝尔纳多·佩雷拉

Bernardo 提供了一本书的评论,该书提供了机器学习领域和相关主题的非技术视角。

Bernardo 的文章中提到的书名叫“大师算法”,这是一个吸引大多数机器学习从业者的标题。

贝尔纳多提出,围绕人工智能有几个模糊的陈述、承诺和问题,但他的总体努力指向寻求更多知识的愿望。

Bernardo 对“主算法”的评论详细而直接,因为它总结了本书十章的主题和关注点,并提供了 Bernardo 对本书作者意图和本书欠缺方面的个人意见。

也许你是一名数据科学家,需要从 Jupyter 笔记本、无休止的教程博客和黑屏中休息一下,那么“大师算法”可能是你需要的新鲜空气,不会偏离人工智能领域太远。

阅读贝尔纳多的评论,了解更多信息。

[## 主算法——书评和评论文章

书评和评论文章。

towardsdatascience.com](/the-master-algorithm-a-book-review-and-opinion-piece-f3a3f2cf5606)

邻里监督有了新工具:私人拥有的车牌阅读器

在人类社会众目睽睽之下整合各种形式的人工智能技术通常是有争议的。

争议源于政府管理机构的持续监控,这侵犯了不知情的公民的隐私。如果你仍然不确定我所描述的有争议的人工智能,那么想想配备人工智能的面部识别系统或监控系统。

Ella 的文章探讨了人工智能技术在社区中的集成所带来的影响,这些社区不欢迎他们不得不以安全性来换取高水平的隐私。

尤其是当这些系统的数据不再掌握在政府管理机构手中,而且日常公民也可以访问时。

计算机视觉和深度学习技术在创造高效的车牌阅读器方面发挥了重要作用,其速度之快,使得想法能够成为研究工作,现在则成为实际产品。

Ella 的文章关注的是一家特殊的自动车牌阅读器制造商,群体安全。这篇文章还包括了在他们的社区内使用过羊群安全提供的工具的公民的陈述和意见。

对于寻求获得我们开发的算法的社会影响的高层次概述的机器学习从业者来说,这是一本好书。

[## 邻里守望有了新工具:私人拥有的车牌阅读器

居民们担心这些小玩意会让人窥探——甚至更糟

onezero.medium.com](https://onezero.medium.com/neighborhood-watch-has-a-new-tool-privately-owned-license-plate-readers-302f296abb27)

用 Fairlearn 创建公平的机器学习模型作者鲁本·克霍夫

如果你是一个对创建机器学习模型感兴趣的数据科学家,请阅读这篇文章。

机器学习模型中的偏见一直是最近讨论的话题,特别是随着面部识别和跟踪等人工智能技术的采用增加。

Ruben 关于减轻从数据集到训练模型的偏差传播的帖子与所有级别的数据科学家都有很高的相关性。

Ruben 通过向读者提供术语“公平建模”的描述,介绍了在机器学习模型中实施公平的关键思想。

除了提供与公平性建模主题相关的一些概念信息和关键术语,Ruben 的文章还包括在数据集内实施公平性的技术实现细节。

Ruben 演示了如何利用微软开发的名为 Fairlearn 的 python 包;该软件包用于根据某些关键指标和受保护的变量来衡量数据集内的公平程度。

[## 用 Fairlearn 创建公平的机器学习模型

微软防止模特歧视人的工具

towardsdatascience.com](/creating-fair-machine-learning-models-with-fairlearn-d9946c32d48)

10 种不同的数据科学职位名称及其含义BySara a . Metwalli

面向希望了解数据科学领域内角色定义的数据科学求职者。

数据科学作为一个领域,涉及到不同的角色和学科。试图准确地找到什么样的角色最能概括你在数据科学方面的兴趣和技能是一项挑战,有时会令人困惑。

Sara 的最新文章探讨了十种角色的定义和职责,所有这些角色都与数据科学领域相关。

您可能正在阅读本文,并认为您已经非常了解与数据科学领域相关的所有角色,但是请相信我,本文中包含的一些角色和描述可能会让您感到惊讶。

Sara 写了一篇文章,许多数据科学求职者都会喜欢,因为了解什么样的角色最适合你的专业知识非常重要。

[## 10 种不同的数据科学职称及其含义

为你的技能选择合适的角色。

towardsdatascience.com](/10-different-data-science-job-titles-and-what-they-mean-d385fc3c58ae)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

雇用数据科学家时要寻找的 4 个关键特征

原文:https://towardsdatascience.com/4-key-traits-to-look-for-when-hiring-a-data-scientist-6ea4d53c8d98?source=collection_archive---------40-----------------------

外加面试中使用的样题

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

寻找优秀的数据科学家可能是一项棘手的任务。谷歌搜索“数据科学技能缺口”显示,在世界上许多国家,公司正在努力寻找合适的候选人来满足他们不断增长的数据科学需求。

一个糟糕的招聘选择可能会非常昂贵,因此,能够有效地审查候选人非常重要,以确保他们非常适合这个职位,并且能够有效地在您的公司引入/扩展数据科学。

严格

理解可用数据的来源,以及任何数据质量问题,对于产生高质量的输出是必不可少的。当使用任何数据集时,数据科学家应该做的第一件事是执行深入的统计分析,以深入研究他们的原始材料,并避免做出任何懒惰的假设。

伴随严谨而来的是好奇心。一名优秀的数据科学家会对他们正在处理的数据提出许多问题,并且很快就会理解其属性、限制、怪癖和有趣的内部关系。毕竟,数据描述了现实世界中发生的一些事情,主动深入数据并发现其秘密会带来超出原始简报的新机会。

示例问题:

  • “举例说明数据质量问题影响您工作的时候,您是如何发现的,以及您是如何处理的。”
  • 使用与你的行业相关的公开可用的数据集设置一个实际问题。一个很好的迹象是,如果候选人在开始提供见解之前问了很多问题,以确认他们对数据的理解。

弹性

处理数据可能是一项艰苦的工作。

但通常,最难处理的是不确定性。当你开始一个建模或分析项目时,不能保证你能找到任何有用的东西。无论你投入多少时间和精力,你得到的数据可能都是噪音,没有信号。

当一切似乎都不起作用时,可能会令人沮丧和沮丧,因此韧性是一个重要的特质。有能力不断推动和尝试新事物而不放弃,或者更糟的是,不损害你的职业操守是至关重要的。但保持清醒的商业头脑也很重要,知道一旦收益递减法则使任何进一步的努力都变得徒劳,什么时候该收手。

示例问题:

  • “告诉我一件让你感到兴奋的工作没有按计划进行的时候。”
  • “你如何决定一件作品何时可以交付?”

神入

数据科学是一种翻译练习。随之而来的是一个混乱的、定义不清的现实世界中的人类问题。这个问题的一个清晰明确的数字近似解决方案出来了。数据科学家的工作是确保近似值很好地映射到人类问题,捕捉其细微差别,并满足利益相关者和用户的要求。为此,他们需要设身处地地为许多人着想,提出许多问题,并真诚地寻求理解是什么让人们这样做。

因此,实践同理心是数据科学的核心技能。理解参与项目的每个人的特殊经历和愿望,并进行有效的沟通,对于项目的成功至关重要,不应该为了技术技能而降低优先级。

示例问题:

  • “告诉我最近参与一个项目的人的情况,他们有什么不同的期望?”

技术

我们都看到了工作中不断增加的每一项技术的清单,他们希望应聘者成为这方面的专家。

理想的候选人将拥有 10 年以上的 SQL、Python、SAS、TensorFlow、Keras、PyTorch、Tableau、PowerBI、Qlikview、yadda yadda yadda,所有这些都在企业级财务环境中提供给 C-Level 高管”。

数据科学的技术前景一直在变化。因此,最重要的能力是能够快速掌握新的技术技能,并将其融入自己的技能。

在特定技术领域的经验在你的公司可能特别重要,所以在工作描述中说明这一点是很好的。但是要尽量保持宽松,不要把技术上有天赋的候选人排除在外,他们可能不完全符合那种经验,但会很快获得所需的能力。

样题

  • 不要靠自我标榜的经验或者 LinkedIn 的背书。不是所有的“经验”都是平等的!一个实际的问题,通过你所在行业的一个案例研究,你会更多地了解一个人的思维过程是如何运作的,以及他们如何运用自己的技能来解决问题。例如,我过去面试过几个声称精通 SQL 的候选人,但是当面对一些表和一个关于数据的问题时,他们很难应用连接的概念。
  • 像 HackerRank 这样的网站提供了许多编程语言的测试环境,这在筛选候选人的早期阶段可以作为验证。测试每个候选人自我描述的优势,而不仅仅是工作描述中列出的技能。

4 个鲜为人知的熊猫功能,可以让你的工作更轻松

原文:https://towardsdatascience.com/4-less-known-pandas-functions-that-can-make-your-work-easier-5e430cac7a82?source=collection_archive---------25-----------------------

为数据科学学习熊猫

增强你的数据科学项目

照片由 Jérémy Stenuit 在 Unsplash 上拍摄

许多数据科学家一直使用 Python 作为他们的编程语言选择。作为一种开源语言,Python 通过提供各种数据科学相关的库获得了相当大的流行。特别是,pandas 库可以说是基于 Python 的数据科学家中最流行的工具箱。

不得不说熊猫库开发的太好了,为各种操作提供了非常庞大的函数集合。然而,这个强大的工具箱的缺点是,一些有用的功能可能不太为初学者所知。在这篇文章中,我想分享四个这样的功能。

1.where()函数

大多数时候,对于我们正在处理的数据集,我们必须进行一些数据转换,以使数据具有可分析的格式。[where()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html)函数用于替换不满足条件的值。让我们考虑下面的例子来了解它的用法。当然,我们首先需要导入 pandas 和 numpy,就像我们处理所有数据操作步骤一样。

对 Series 使用 where()

在上图中,我们创建了一个序列并应用了where()函数。具体来说,这个函数的签名用法是where(condition, other)。在这个调用中,condition参数将产生布尔值,当它们为True时,原始值被保留,当它们为False时,将使用由另一个参数指定的值。在我们的例子中,任何低于 1000 的值都被保留,而等于或大于 1000 的值被分配给 1000。

该函数不仅可用于 Series,也可用于 DataFrame。让我们看看 DataFrame 的类似用法。在下面的例子中,数据帧df0的奇数将全部增加 1,偶数保持不变。

将 where()与 DataFrame 一起使用

2.函数的作用是

where()函数不同,[pivot_table()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html)函数仅适用于 DataFrame。这个函数创建一个电子表格风格的数据透视表,因此它是一个很好的工具,通过以一种简单的方式显示数据来汇总、分析和呈现数据。用一个更现实的例子可以最好地展示它的威力。

对 DataFrame 使用 pivot_table()

在上图中,我们创建了一个数据框架,其中包含工资和奖金记录以及雇员的性别和部门信息。然后,我们使用pivot_table()函数创建了一个数据透视表。具体来说,我们将工资和奖金列设置为values参数,将部门设置为index参数,将性别设置为columns参数,将[np.mean, np.median, np.amax]设置为aggfunc参数。

在输出中,您可以看到我们有一个数据透视表,其中显示了 2(性别)乘 2(部门)的表格,分别是工资和奖金变量的平均值、中值和最大值。一些有趣的观察结果包括,在 A 部门,女性的工资高于男性,而在 b 部门,情况正好相反。在这两个部门,女性和男性的奖金相似。

3.函数的作用是

当我们有一个包含序数度量的数据集时,有时创建分类分位数来识别可能的模式比参数化地检查这些序数度量更有意义。理论上,我们可以自己计算分位数临界值,并使用这些临界值映射数据,以创建新的分类变量。

然而,这个操作可以通过[qcut()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html)函数轻松实现,该函数根据变量的等级将变量离散成大小相等的池(例如,分位数和十分位数)。让我们通过下面的例子来看看这个函数是如何工作的。

对 DataFrame 使用 qcut()

在上图中,我们创建了一个包含 3 列的数据帧。我们对生成var2列的分位数感兴趣。因此,我们将q参数指定为 4(如果需要十分位数,也可以是 10)。我们还指定了标签列表来标记这些分位数。

4.melt()函数

根据数据科学家使用的工具,一些人喜欢“宽”格式(例如,一个主题一行多个变量),而另一些人喜欢“长”格式(例如,一个主题多行一个变量)。因此,我们经常需要在这些格式之间进行数据转换。

与完全转置数据帧的转置 [T](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.T.html) 函数不同,[melt()](https://pandas.pydata.org/docs/reference/api/pandas.melt.html)函数对于将数据从宽格式转换为长格式特别有用。让我们通过下面的例子来看看它是如何工作的。

对 DataFrame 使用 melt()

在上图中,我们创建了一个宽格式的数据帧。具体来说,我们有服药前和服药后两种措施。然后我们使用melt()函数产生一个长格式的数据帧。我们将SubjectID指定为id_vars,将两个度量指定为value_vars,并将列重命名为更有意义。

在你走之前

我们可以探索熊猫的更多功能。在本文中,我们刚刚学习了四个我们有些人不太了解的函数,但它们在我们的日常数据操作工作中非常有用。

我希望你喜欢读这篇文章。你可以在 GitHub 上找到代码。

关于作者

我写关于 Python 和数据处理与分析的博客。万一你错过了我以前的一些博客,这里有一些与当前文章相关的文章链接。

[## 提升 Python 编码水平的 30 个简单技巧

更好的 Python

medium.com](https://medium.com/better-programming/30-simple-tricks-to-level-up-your-python-coding-5b625c15b79a) [## 理解 map()函数操纵熊猫系列

了解使用 map()函数将数据转换为所需格式的基本原理

towardsdatascience.com](/understand-map-function-to-manipulate-pandas-series-8ac340d514f7) [## 关于在 NumPy 中生成随机数的备忘单

查看 NumPy 中最常用的生成随机数的函数。

towardsdatascience.com](/a-cheat-sheet-on-generating-random-numbers-in-numpy-5fe95ec2286)

4 个鲜为人知但非常实用的熊猫手术

原文:https://towardsdatascience.com/4-less-known-yet-very-functional-pandas-operations-46dcf2bd9688?source=collection_archive---------42-----------------------

发现更多的熊猫

照片由金莎·艾利斯在 Unsplash 上拍摄

Pandas 是使用最广泛的数据分析和操作库,它提供了许多处理数据的函数和方法。由于它们执行的任务,其中一些比其他的更频繁地被使用。

在本帖中,我们将介绍 4 个熊猫手术,它们不太常用,但仍然非常实用。

先说进口 NumPy 和熊猫。

import numpy as np
import pandas as pd

1。因式分解

它提供了一种编码分类变量的简单方法,这是大多数机器学习技术中的一项必需任务。

这是来自客户流失数据集的分类变量。

df = pd.read_csv('/content/Churn_Modelling.csv')df['Geography'].value_counts()
France     5014 
Germany    2509 
Spain      2477 
Name: Geography, dtype: int64

我们可以用一行代码对类别进行编码(即转换成数字)。

df['Geography'], unique_values = pd.factorize(df['Geography'])

factorize 函数返回转换后的值以及类别索引。

df['Geography'].value_counts()
0    5014 
2    2509 
1    2477 
Name: Geography, dtype: int64unique_values
Index(['France', 'Spain', 'Germany'], dtype='object')

如果原始数据中有丢失的值,您可以为它们指定一个值。默认值为-1。

A = ['a','b','a','c','b', np.nan]
A, unique_values = pd.factorize(A)
array([ 0,  1,  0,  2,  1, -1])A = ['a','b','a','c','b', np.nan]
A, unique_values = pd.factorize(A, na_sentinel=99)
array([ 0,  1,  0,  2,  1, 99])

2。分类

它可用于创建分类变量。

A = pd.Categorical(['a','c','b','a','c'])

类别属性用于访问类别:

A.categories
Index(['a', 'b', 'c'], dtype='object')

我们只能从一个现有类别中分配新值。否则,我们将得到一个值错误。

A[0] = 'd'

我们还可以使用 dtype 参数指定数据类型。缺省值是 CategoricalDtype,由于内存消耗,它实际上是最好的选择。

我们来做一个例子,比较一下内存使用情况。

这是每列的内存使用量(以字节为单位)。

countries = pd.Categorical(df['Geography'])
df['Geography'] = countries

内存使用比原始功能少 8 倍。对于较大的数据集,节省的内存量将进一步增加,尤其是当我们只有很少的类别时。

3。区间

它返回一个表示区间的不可变对象。

iv = pd.Interval(left=1, right=5, closed='both')3 in iv
True5 in iv
True

closed 参数指示边界是否包含在内。它取的值是“两个”、“左”、“右”和“都不是”。默认值为“右”。

iv = pd.Interval(left=1, right=5, closed='neither')5 in iv
False

当我们处理日期-时间数据时,时间间隔很方便。我们可以很容易地检查日期是否在指定的间隔内。

date_iv = pd.Interval(left = pd.Timestamp('2019-10-02'), right = pd.Timestamp('2019-11-08'))date = pd.Timestamp('2019-10-10')date in date_iv
True

4。宽到长

Melt 将宽数据帧转换为长数据帧。这个任务也可以用融化功能来完成。Wide_to_long 提供了一种不太灵活但更用户友好的方式。

考虑下面的样本数据帧。

它包含了一些人不同的分数。我们希望以一行(而不是单独的一列)表示分数类型的方式来修改(或重塑)该数据帧。例如,A 下面有 3 种分数类型(A1、A2、A3)。在我们转换数据帧之后,将只有列(A)和类型(1,2,3)将用行值表示。

pd.wide_to_long(df, stubnames=['A','B'], i='names', j='score_type')

stubnames 参数指示将包含这些值的新列的名称。宽格式的列名需要以 stubnames 开头。“I”参数是用作 id 变量的列,“j”参数是包含子类别的列的名称。

返回的数据帧有一个多级索引,但我们可以通过应用 reset_index 函数将其转换为普通索引。

pd.wide_to_long(df, stubnames=['A','B'], i='names', j='score_type').reset_index()

Pandas 在数据科学和机器学习领域的成功和优势归功于功能和方法的多样性和灵活性。一些方法执行基本的任务,但是也有更详细和更具体的任务。

熊猫通常有多种方式来完成一项任务,这使得它很容易很好地适应特定的任务。

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

4 个可以在一行 python 代码中执行 EDA 的库

原文:https://towardsdatascience.com/4-libraries-that-can-perform-eda-in-one-line-of-python-code-b13938a06ae?source=collection_archive---------3-----------------------

使用 Pandas Profiling、Sweetviz、Autoviz 和 D-Tale 进行探索性数据分析

图片由 Pixabay 的 Mudassar Iqbal 拍摄,使用 Pixlr 编辑

探索性数据分析(EDA)是一种分析数据并发现模式、视觉洞察等的方法。在继续建模之前。人们花费大量时间进行 EDA 以更好地理解数据,这可以通过使用自动可视化工具来最小化,例如 **Pandas-profiling、Sweetviz、Autoviz、**或 D-Tale

EDA 涉及许多步骤,包括一些统计测试、使用不同类型的图来可视化数据等等。EDA 的一些步骤讨论如下:

  • **数据质量检查:**可以使用describe()info()dtypes()等熊猫库函数完成。它用于查找多个特征、其数据类型、重复值、缺失值等。
  • **统计测试:**进行一些统计测试,如皮尔逊相关、斯皮尔曼相关、肯德尔测试等,以获得特征之间的相关性。它可以使用 stats 库在 python 中实现。
  • **定量检验:**一些定量检验用于发现数值特征的扩散,计数分类特征。它可以使用 pandas 库的函数在 python 中实现。
  • **可视化:**特征可视化对于理解数据非常重要。条形图、饼图等图形技术用于了解分类特征,而散点图、直方图则用于数字特征。

为了执行上述任务,我们需要输入几行代码。这里自动可视化库开始发挥作用,它可以使用一行代码执行所有这些任务。我们将在本文中讨论一些自动可视化工具:

  • 熊猫简介
  • Sweetviz
  • Autoviz
  • D-Tale

使用 pandas-profiling 库进行探索性数据分析的数据集是从 Kaggle 下载的 Titanic 数据集。

熊猫-简介:

Pandas profiling 是一个开源的 python 库,可以自动化 EDA 过程并创建详细的报告。Pandas Profiling 可以很容易地用于大型数据集,因为它非常快,可以在几秒钟内创建报告。

安装:

您可以使用 PyPl 安装 pandas-profiling:

**pip install pandas-profiling**

GitHub 熊猫档案库。

用法:

报告:

pandas-profiling 库生成一个报告,其中包含:

  • 数据集概述
  • 可变属性
  • 变量的相互作用
  • 变量的相关性
  • 缺少值
  • 抽样资料

(作者 GIF)

Sweetviz:

Sweetviz 是一个开源的 python 自动可视化库,它可以生成一份报告,在高密度绘图的帮助下探索数据。它不仅自动化了 EDA,还用于比较数据集并从中得出推论。可以通过将一个数据集视为训练数据集而将另一个数据集视为测试数据集来对两个数据集进行比较。

安装:

您可以使用 PyPl 安装 Sweetviz:

**pip install sweetviz**

Sweetviz 的 GitHub 存储库。

用法:

报告:

Sweetviz 库生成一份报告,其中包含:

  • 数据集概述
  • 可变属性
  • 范畴关联
  • 数字联想
  • 数字特征的最频繁、最小、最大值

(作者 GIF)

Autoviz:

Autoviz 是一个开源的 python 自动可视化库,主要致力于通过生成不同类型的绘图来可视化数据之间的关系。

安装:

您可以使用 PyPl 安装 Autoviz:

**pip install autoviz**

用于 Autoviz 的 GitHub 库。

用法:

报告:

Autoviz 库生成一份报告,其中包含:

  • 数据集概述
  • 连续变量的成对散点图
  • 分类变量的分布
  • 连续变量的热图
  • 每个分类变量的平均数值变量

(作者 GIF)

d-童话:

D-Tale 是一个开源的 python 自动可视化库。它是最好的自动化数据可视化库之一。D-Tale 帮助您获得数据的详细 EDA。它还有一个功能是代码导出,用于报告中的每个绘图或分析。

安装:

您可以使用 PyPl 安装 D-Tale:

**pip install dtale**

用于 D-Tale 的 GitHub 库。

用法:

报告:

dtale 库生成一份报告,其中包含:

  • 数据集概述
  • 自定义过滤器
  • 相关性、图表和热图
  • 突出显示数据类型、缺失值、范围
  • 代码导出

(作者 GIF)

结论:

我更喜欢使用几个 python 库,通过自定义函数来完成我的 EDA。应该使用上面讨论的库来加速您的工作。

对于初学者来说,在尝试这些库之前,使用 pandas 的库开始做 EDA 并编写 python 代码是很好的,因为更重要的是具备基础知识和编程实践。

上面讨论的最好的数据自动可视化是 DTale 库,因为它报告了详细的 EDA、定制过滤器和代码导出。代码输出是这个库比其他库更好的主要亮点

参考资料:

[1]走向数据科学(2020 年 8 月 30 日):一行 python 代码的 EDA

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

[## 加入我的推荐链接-萨蒂扬库马尔媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

satyam-kumar.medium.com](https://satyam-kumar.medium.com/membership)

感谢您的阅读

数据科学中需要掌握的 4 个线性代数主题

原文:https://towardsdatascience.com/4-linear-algebra-topics-you-need-to-domain-in-data-science-73e5c5f4f2ae?source=collection_archive---------28-----------------------

来源:路易斯·鲍尔斯@ Pexels-免费股票图片

以及在哪里可以学到它们

首先也是最重要的,我想为过去几周缺乏故事和内容向自己道歉…它们太忙了!在确认了我们在 Ravelin 的最后 2000 万英镑的新成立之后,我们看到了一波新客户的到来,这总是好消息,但也有相当多的工作!好了,现在,我已经说够了这些废话,我将开始这个故事,介绍一件我打算从现在开始在我的所有内容中开始做的新事情:包括我最近阅读的一段引文或一段文字,我发现它对从事数据科学的人来说特别有趣和相关。

我们将从我亲爱的同事亚当·格拉斯最近在讨论模特的表现时告诉我的一件事开始这一部分。他说:

死亡,税收和误报?

他聪明的声明引用了最初的一句话“除了死亡和税收,没有什么是确定的”,这句话有时出自本·富兰克林,有时出自马克·吐温或丹尼尔·笛福。我特别喜欢亚当的信息,因为不知何故它减轻了我们的负担。怎么会?从这个意义上说,当我们在处理分类问题时,如果我们不仅要追求精确度,还要追求准确性和其他相关的分类指标,那么假阳性几乎是不可能避免的。如果你对阅读这方面的更多内容感兴趣,我的这个故事讨论了分类问题中的类别不平衡,对这些度量和概念做了更多的解释。

敬请期待下一段引言!但是现在我们马上跳到我们今天的主题:你需要在数据科学领域的线性代数的 4 个主题。正如我在以前的故事中说过的,技术和语言可能来来去去,但这个领域的数学背景将永远存在。这就是为什么,很好地理解数据科学中使用的主要概念,尤其是机器学习,是理解我们从库中导入的算法实际上如何工作以及我们应该做什么(和避免什么)的关键。)当我们使用它们的时候。这就是为什么今天我们要从最基础的开始,一路向上,介绍一些我个人认为应该学习的东西。

1.线性代数

1.1.向量和矩阵

向量和矩阵是我们在数据科学领域所做的一切的关键部分。例如,当我们训练模型时,我们拟合特征矩阵,当我们查看数据中元素之间的距离时,我们通常会发现特征向量之间的某种几何距离,当我们使用降维技术时,我们通常只是找到一种简洁的方式来表示一组向量,而不会失去它们之间的潜在关系。这就是为什么我们需要从理解这些元素是什么开始。

资源:

  • 矢量介绍,来自《数学透视》
  • 向量和空间,来自可汗学院

1.2.矩阵运算

机器学习中,矩阵运算无处不在。矩阵只不过是一个具有一列或多列以及一行或多行的二维数组。听起来很熟悉?这听起来像熊猫的数据帧吗?答对了。你猜怎么着:每次我们对我们的任何特征执行加法、减法或乘法时,我们通常都是在执行矩阵运算。此外,我们使用最多的大多数算法在某种程度上都使用了矩阵运算。例如,神经网络是一系列一个接一个发生的矩阵运算。机器学习大师的以下文章包含了对该主题的很好的介绍,如果您想阅读更多内容,可以看看更多资源:

资源:

  • 矩阵和矩阵运算简介,来自机器学习大师

1.3.碱基和格拉姆-施密特过程

我们在数据科学中经常使用的一些算法使用逆矩阵作为它们求解过程的一部分。这就是为什么在数据科学中,我们总是希望矩阵尽可能正交。这使得逆变换更容易计算,这意味着变换之后是可逆的,因此投影也更容易计算。如果这一切听起来有点令人困惑,我强烈推荐以下链接。

资源:

  • 改变基底,从 YouTube 上的 3Blue1Brown
  • 汗学院备用坐标系的前 4 章
  • 帝国理工学院 ML 视频数学(视频: 1 , 2 , 3 , 4 )

1.4.特征向量和特征值

特征向量和特征值是我们线性代数旅程的最后一个里程碑。降维算法,正如主成分分析严重依赖于这些概念,一些现实世界的工具,如谷歌搜索算法,将它们作为其逻辑的关键部分。如果你已经对前面推荐的所有主题感到满意,那么理解最后一点将是非常重要的!

资源:

  • 最温和的主成分分析介绍,我之前的一个关于走向数据科学的故事
  • [谷歌如何在网络大海捞针](http://Feature Column How Google Finds Your Needle in the Web's Haystack),来自美国数学协会网站
  • 特征向量和特征值,来自 YouTube 上的 3Blue1Brown

这就是线性代数。如果你认为我错过了任何相关的话题,请让我知道!在未来的故事中,我们将在微积分的世界中经历一个类似的列表!

同时,别忘了查看我之前的一些故事:)

[## 5 更好的绘图工具和技术

充分利用您的数据

towardsdatascience.com](/5-more-tools-and-techniques-for-better-plotting-ee5ecaa358b) [## 机器学习和数据科学隔离免费在线课程

从初级到高级。充分利用 covid 19-锁定

towardsdatascience.com](/machine-learning-free-online-courses-from-beginner-to-advanced-f50982dce950) [## 我应该在我的机器学习模型中包括截距吗?

并简要介绍了数据科学中的回归建模

towardsdatascience.com](/should-i-inlcude-the-intercept-in-my-machine-learning-model-2efa2a3eb58b)

或者直接访问我在 Medium 上的个人资料,查看我的其他故事。还有如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 **:)。**再见,感谢阅读!

媒体上见!

每个数据科学家都应该知道的 4 种机器学习方法

原文:https://towardsdatascience.com/4-machine-learning-approaches-that-every-data-scientist-should-know-e3a9350ec0b9?source=collection_archive---------7-----------------------

人工智能精要

了解主要的最大似然学习方法:监督学习,非监督学习,半监督学习,强化学习

图一。阿德里安·特林考斯在 Unsplash 上拍摄的照片

随着人工智能的不断进步,这个领域已经变得太大了,以至于无法全部专攻。有无数的问题,我们可以用无数的方法去解决。一个经验丰富的人工智能研究人员在一个领域的知识可能对另一个领域毫无用处。理解不同机器学习问题的本质非常重要。尽管机器学习问题的列表很长,不可能在一篇文章中解释清楚,但我们可以将这些问题分为四种不同的学习方法:

  • 监督学习;
  • 无监督学习;
  • 半监督学习;和
  • 强化学习。

在我们深入研究这些方法之前,让我们先来看看什么是机器学习:

什么是机器学习?

“机器学习”一词是由 IBM 科学家、计算机游戏和人工智能领域的先驱阿瑟·塞缪尔在 1959 年首次提出的。机器学习被认为是人工智能领域下的一个子学科。它旨在利用经验自动提高为特定任务设计的计算机算法的性能。在机器学习研究中,经验来自训练数据,训练数据可以被定义为根据先前记录的观察或实时反馈收集的样本数据。通过这种体验,机器学习算法可以学习和建立数学模型来进行预测和决策。

学习过程从将训练数据(例如,示例、直接经验、基本说明)输入模型开始。通过使用这些数据,模型可以非常快速地在数据中找到有价值的模式。这些模式然后被用于对相关事件进行预测和决策。如果开发者构建了允许连续训练的合适的机器学习系统,则即使在部署之后,学习也可以继续。

四种机器学习方法

顶级机器学习方法根据其学习反馈机制的性质进行分类。大多数机器学习问题可以通过采用这些方法中的一种来解决。然而,我们可能仍然会遇到不适合这些方法之一的复杂的机器学习解决方案。

这种分类是必要的,因为它将帮助您快速发现将来可能遇到的问题的本质,分析您的资源,并开发合适的解决方案。

让我们从监督学习方法开始。

监督学习

有监督的学习是机器学习任务,学习基于示例输入-输出对将输入映射到输出的函数。它从由一组训练样本组成的带标签的训练数据中推断出一个函数。

T 当数据集包含响应变量值(或标签)的记录时,可以采用监督学习方法。根据上下文,这些带有标签的数据通常被称为“标签数据”和“训练数据”

示例 1: 当我们试图使用一个人的体重、年龄和性别来预测他的身高时,我们需要包含他的体重、年龄、性别信息以及实际身高的训练数据。这些数据允许机器学习算法发现身高和其他变量之间的关系。然后,使用这些知识,该模型可以预测给定人的身高。

示例 2: 我们可以根据之前看到的垃圾邮件和非垃圾邮件的区别特征,例如电子邮件的长度和电子邮件中特定关键字的使用,将电子邮件标记为“垃圾邮件”或“非垃圾邮件”。从训练数据的学习持续进行,直到机器学习模型在训练数据上达到高水平的准确度。

图二。关键点——监督学习(作者提供的图表)

有两个主要的监督学习问题:(I)分类问题和(ii)回归问题。

分类问题

在分类问题中,模型学习根据它们的变量值对观察值进行分类。在学习过程中,模型会接触到大量带有标签的观察结果。例如,在看到数千名顾客的购物习惯和性别信息后,模型可以根据他/她的购物习惯成功预测新顾客的性别。二元分类是用于在两个标签下分组的术语,例如男性和女性。另一个二元分类的例子可能是预测图片中的动物是“猫”还是“不是猫”,如图 2–4 所示。

图 3。监督学习中的分类问题(作者图)(由 Freepik 制作的图标,那些图标,来自 Flaticon 的桉树)

另一方面,当有两个以上的标签时,使用多标签分类。识别和预测图像上的手写字母和数字是多标签分类的一个例子。

回归问题

在回归问题中,目标是通过利用其他变量(即自变量、解释变量或特征)和目标变量(即因变量、响应变量或标签)之间的关系来计算值。我们的目标变量和其他变量之间的关系强度是预测值的关键决定因素。根据客户的历史数据预测客户会花多少钱是一个回归问题。

无监督学习

无监督学习是一种机器学习,在没有预先存在的标签和最少人工监督的情况下,在数据集中寻找以前未检测到的模式。

监督学习是一种在 ML 算法中使用的学习方法,用于从不包含标签的数据集进行推断。

图 4。关键点——无监督学习(作者提供的图表)

有两个主要的无监督学习问题:(I)聚类和(ii)降维。

使聚集

无监督学习主要用于聚类分析。

聚类分析是一种分组工作,其中一个组(即一个聚类)的成员比其他聚类的成员彼此更相似。

有许多不同的聚类方法可用。它们通常利用一种基于选定度量的相似性度量,例如欧几里德距离或概率距离。生物信息学序列分析、遗传聚类、模式挖掘和对象识别是可以用无监督学习方法解决的一些聚类问题。

降维

无监督学习的另一个用例是降维。维度相当于数据集中使用的要素数量。在某些数据集中,您可能会发现存储在各个列中的数百个潜在要素。在大多数数据集中,这些列中有几个是高度相关的。因此,要么选择最好的,即特征选择,要么结合已有特征提取新的特征,即特征提取。这就是无监督学习发挥作用的地方。降维方法帮助我们创建更整洁的模型,没有噪音和不必要的特征。

半监督学习

EMI-监督学习是一种结合了监督学习和非监督学习特点的机器学习方法。当我们有少量标记数据和大量未标记数据可用于训练时,半监督学习方法特别有用。监督学习特征有助于利用少量的标签数据。相比之下,无监督学习特征对于利用大量未标记数据是有用的。

半监督学习(Semi-supervised learning)是一种在训练过程中结合少量已标记数据和大量未标记数据的机器学习方法。

嗯,你可能会想,如果半监督学习有实用的现实应用。虽然监督学习是一种强大的学习方法,但标记数据(用于监督学习)是一个昂贵而耗时的过程。另一方面,即使没有标记,大量的数据也是有益的。因此,在现实生活中,如果做得正确,半监督学习可能会成为最合适和最有成效的 ML 方法。

在半监督学习中,我们通常从聚类未标记的数据开始。然后,我们使用标记数据来标记聚类的未标记数据。最后,大量现在标记的数据用于训练机器学习模型。半监督学习模型可能非常强大,因为它们可以利用大量的数据。

图 5。关键点——半监督学习(作者提供的图表)

半监督学习模型通常是监督和非监督学习中使用的现有机器学习算法的转换和调整版本的组合。这种方法成功地应用于语音分析、内容分类和蛋白质序列分类等领域。这些领域的相似之处在于,它们提供了丰富的未标记数据,而只有少量的标记数据。

强化学习

强化学习是机器学习的主要方法之一,它涉及在特定的环境中寻找最优的代理行为来最大化回报。代理人学习完善自己的行动,以获得尽可能高的累积回报。

强化学习(RL)是机器学习的一个领域,涉及软件代理应该如何在环境中采取行动,以最大化累积回报的概念。

强化学习有四个主要元素:

  • 代理:执行分配给它的任务的可训练程序
  • **环境:**代理完成任务的真实或虚拟世界。
  • **动作:**导致环境中状态改变的代理的移动
  • **奖励:**基于行动的消极或积极的报酬。

强化学习既可用于现实世界,也可用于虚拟世界:

例 1: 你可以创建一个不断发展的广告投放系统,根据不同设置产生的广告收入来决定在网站上投放多少广告。广告投放系统将是现实世界应用的一个很好的例子。

例 2: 另一方面,你可以在一个具有强化学习的视频游戏中训练一个代理,与其他玩家竞争,通常被称为机器人。

例 3: 最后,用强化学习方法进行虚拟和真实机器人的运动训练。

图 6。要点—强化学习(作者提供的图表)

一些流行的强化学习模型可以列举如下:

  • Q-学习,
  • 状态-动作-奖励-状态-动作(SARSA) ,
  • 深 Q 网(DQN) ,
  • 深度确定性政策梯度(DDPG) ,

流行的深度学习框架的一个缺点是缺乏对强化学习的全面模块支持, TensorFlow 和 PyTorch 也不例外。深度强化学习只能用建立在现有深度学习库之上的扩展库来完成,比如 Keras-RL 、 TF。代理,和 Tensorforce 或者专用的强化学习库比如开放 AI 基线和稳定基线。

既然我们已经介绍了所有四种方法,下面是一个总结图,可以对不同的 ML 方法进行基本比较:

图 7。关键点——所有四种 ML 方法(作者提供的图表)

最终注释

人工智能领域正在迅速发展,并成为一个主要的研究领域。随着领域的扩大,AI 的子领域、子子领域已经开始出现。虽然我们不能掌握整个领域,但我们至少可以了解主要的学习方法。

这篇文章的目的是让你熟悉这四种机器学习方法。在接下来的文章中,我们将会介绍其他的人工智能要素。

订阅邮件列表获取我的最新内容

如果你喜欢这篇文章,可以考虑订阅简讯 !✉️

除了我的最新内容,我还分享我的 Google Colab 笔记本,其中包含我发表的每篇文章的完整代码。

既然你正在阅读这篇文章,我确信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin

看看我的内容指南:

[## 我的人工智能内容指南

帮助您轻松浏览我的内容的指南。

oyalcin.medium.com](https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17)

地理空间数据科学的 4 个必备 JupyterLab 扩展

原文:https://towardsdatascience.com/4-must-have-jupyterlab-extensions-for-geospatial-data-science-f3cf7822de4b?source=collection_archive---------20-----------------------

GIS 和交互式地理空间数据的基本 JupyterLab 扩展。

由 Lucas Ludwig 在 Unsplash 拍摄

毫无疑问,JupyterLab 是研究数据科学的最佳工具之一。它被设计成可扩展和可定制的,事实上,有很多可用的扩展。

作为一名地理空间数据科学家,我在考虑一些我在新安装 Anaconda 环境后经常使用的 JupyterLab 扩展。我意识到我错过了一些扩展,并思考了它们在我的 JupyterLab 体验中的重要性。

在本文中,我将分享四个最受欢迎和最基本的 JupyterLab 扩展,用于使用 JupyterLab 进行空间数据科学研究。这些是用于在 JupyterLab 中渲染地图或地理空间数据的特定工具。

1.geo JSON-扩展

geo Jon 扩展使您能够在 Jupyter 实验室内快速绘制 geo Jon 数据。无需读取数据或使用其他桌面软件将其可视化。

在这个例子中,我们用 JupyterLab 单元格中的几何图形绘制一个类似 JSON 的数据。

在 JupyterLab 中直接绘制 GeoJSON 数据—图片由作者提供。

它还可以让你渲染 Geosjon 文件,并在 Jupyter notebook 中显示出来。GeoJSON-extension 创建一个单独的输出,并附带从 Openstreetmap 加载的底图。多方便啊?💪只需将您的数据作为 Geosjon 文件,然后双击它。

GeoJSON 输出视图-图片由作者提供。

使用 GeoJSON-extension 是一种快速便捷的可视化地理空间数据的方法,无需使用 Geopandas 等 python 库在内存中读取数据。要启用 GeoJSON-extension,您可以在 Conda 终端上运行以下命令:

jupyter labextension install @jupyterlab/geojson-extension

有关更多信息,请访问 GeoJSON-extension 资源库。

[## @jupyterlab/geojson-extension

用于渲染 GeoJSON 的 JupyterLab 扩展安装@jupyterlab/geojson-extension 以渲染…

www.npmjs.com](https://www.npmjs.com/package/@jupyterlab/geojson-extension)

Jupyter Matplotlib — Ipympl

我喜欢使用 Geopandas 和 Matplotlib 来创建非交互式地理空间数据可视化。但是,我最近发现可以用 Jupyter matplotlib 扩展— Ipympl 来扩展 Matplotlib 交互式绘图。从那时起,它就是我的 go 工具,可以通过 Geopandas 实现快速交互式地理空间数据可视化。

以下示例显示了 Jupyter Matplotlib 扩展的交互功能。可以像往常一样创建 Geopandas 地块,只需要调用 Jupyter magic 命令:%matplotlib widget

交互式 Geopandas plot 与 Ipympl——图片由作者提供。

要使用 Ipympl 的交互功能,您可以使用 Conda/ pip 安装它:

conda install -c conda-forge ipympl
pip install ipympl

如果使用的是 jupyterLab,还需要安装 node js 和 Jupyter Lab 扩展管理器。

conda install -c conda-forge nodejsjupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter lab build

如果您想开始并设置您的环境,您可以阅读这篇文章。

[## 如何在 Jupyter 环境下生成交互式 Matplotlib 图

使用所有使用 Matplotlib 的 Python 库创建交互式绘图/地图

towardsdatascience.com](/how-to-produce-interactive-matplotlib-plots-in-jupyter-environment-1e4329d71651)

IpyLeaflet

IpyLeaflet 是 Jupyter 笔记本世界和流行传单可视化图书馆之间的桥梁。通过 Ipyleaflet,您可以在 Ipywidgets 的帮助下创建交互式的高级地理空间数据可视化。它还允许您创建双向通信地图。

使用 IpyLeaflet 的搜索栏和全屏缩放—图片由作者提供

要安装 IpyLeaflet,您可以使用 Conda 或 pip。

conda install -c conda-forge ipyleafletpip install ipyleaflet

您还需要启用 JupyterLab 扩展:

jupyter labextension install **@jupyter**-widgets/jupyterlab-manager jupyter-leaflet

我在这里还有一份关于 Ipyleaflet 交互式制图的广泛的初学者指南:

[## IpyLeaflet:Jupyter 笔记本中的交互式映射

IpyLeaflet 交互式地理空间数据可视化初学者指南。

towardsdatascience.com](/ipyleaflet-interactive-mapping-in-jupyter-notebook-994f19611e79)

开普勒格尔-朱皮特

KeplerGL Jupyter 笔记本扩展附带了一个最好的大数据地理空间数据可视化工具。有了这个扩展,你在 Jupyter 中就有了一个强大的用户界面来创建交互式的、漂亮的地图。

借助 KeplerGL Jupyter Lab extension,您可以将世界一流的可视化工具、易于使用的用户界面(UI)以及 python 和 Jupyter 笔记本的灵活性(3D 可视化 GIF)结合起来

KeplerGL Jupyter 的 3D 建筑足迹—图片由作者提供

要安装 Keplergl Jupyter notebook,只需在终端上运行这三行代码。

pip install ipywidgets
pip install keplergl
$ jupyter labextension install [@jupyter](http://twitter.com/jupyter)-widgets/jupyterlab-manager keplergl-jupyter

要开始使用开普勒,您可以阅读这篇文章:

[## 开普勒。GL & Jupyter 笔记本:优步开源开普勒的地理空间数据可视化。标距长度

在 Jupyter 笔记本中绘制地理空间数据&轻松地与开普勒的用户界面交互以调整可视化。

towardsdatascience.com](/kepler-gl-jupyter-notebooks-geospatial-data-visualization-with-ubers-opensource-kepler-gl-b1c2423d066f)

结论

JupyterLab 是我最喜欢的工具,这些地理空间扩展的可用性让我坚持下来👌🏻带着它而不是回到 Jupyter 笔记本。在本文中,我分享了专门为地理空间数据科学家和 Geo 人员必备的四个 JupyterLab 扩展。

如果您在地理空间数据科学应用中使用了其他特定的 JupyterLab 扩展,请告诉我。你可以在推特上找到我。

熊猫生态系统中 4 个必去的图书馆

原文:https://towardsdatascience.com/4-must-know-libraries-in-pandas-ecosystem-7c01326c4724?source=collection_archive---------30-----------------------

用这些附件增强你的熊猫技能。

公园巡警在 Unsplash 拍摄的照片

Pandas 是一个非常强大和通用的 Python 数据分析库,它加速了数据科学项目的预处理步骤。它提供了许多在数据分析中非常有用的函数和方法。

虽然熊猫的内置功能能够进行有效的数据分析,但定制的工具或库为熊猫增加了价值。在本帖中,我们将探索 4 种工具来增强熊猫的数据分析过程。

失踪人口

Pandas 提供了检查数据集中缺失值数量的函数。 Missingno 库更进一步,通过信息可视化提供数据集中缺失值的分布。

使用缺失号的图,我们能够看到缺失值在每一列中的位置,以及不同列的缺失值之间是否存在相关性。在处理缺失值之前,在数据集中探索它们是非常重要的。因此,我认为 Missingno 是数据清理和预处理步骤中非常有价值的资产。

让我们首先尝试探索一个关于流媒体平台上电影的数据集。数据集可在 Kaggle 上的这里获得。

该数据集包含 16744 部电影和描述每部电影的 17 个特征。Pandas isna 函数结合 sum() 给出了每一列中缺失值的数量。但是,在某些情况下,我们需要的不仅仅是计数。让我们用 Missingno 来探究缺失值。

import missingno as msno
%matplotlib inline #render plots within jupyter notebook

我们将使用的第一个工具是缺失值矩阵。

msno.matrix(df)

白线表示缺少值。“年龄”和“烂番茄”栏以白线为主。但是,在其他缺少值的列中有一个有趣的趋势。它们通常在公共行中缺少值。如果某行的“导演”列中缺少值,则很可能“流派”、“国家”、“语言”和“运行时间”列中也缺少值。在处理缺失值时,这是非常有价值的信息。

Missingno 还提供了热图和条形图,可以更深入地了解数据帧中缺失的值。如果你想进一步阅读,这里有一个更详细的帖子和例子:

[## 可视化缺失值和缺失号

浏览数据集中缺失的值。

towardsdatascience.com](/visualize-missing-values-with-missingno-ad4d938b00a1)

侧钻

Sidetable 根据选择的列创建频率表。假设我们有一个数据集,其中包含某个分类变量的一些测量值(例如模型)。我们有许多不同的类别,每个类别有许多观察值(行)。通过使用 sidetable,我们可以了解每个模型在数据集中所占的份额。这也可以使用 pandas 的 value_counts 函数来实现,但是 sidetable 提供的信息更多,我们将在示例中看到。

如果您使用 jupyter 笔记本,我们首先需要用pip!pip安装它:

!pip install sidetable

然后导入它:

import pandas as pd
import sidetable

我们现在可以使用 stb 作为数据帧的存取器。我将使用 Kaggle 上可用的数据集。它包含了拍卖的二手车的数据。

df = pd.read_csv("/content/USA_cars_datasets.csv")#drop redundant columns
df.drop(['Unnamed: 0','vin','lot'], axis=1, inplace=True)df.head()

Sidetable 返回每个类别的计数和百分比以及累积值。让我们将它应用于“品牌”栏:

df.stb.freq(['brand'])[:10]

它肯定比 value_counts 更能提供信息。我们对数据集中的分布有了更多的了解。累积值的一个额外特性是我们可以设置累积百分比的阈值。然后,达到阈值后的类别被标记为“其他”。

如果你想获得更详细的概述并了解 sidetable 的其他功能,这里有一个关于 sidetable 的更详细的帖子:

[## 熊猫侧桌刚刚宣布

对数据框架的信息丰富、见解深刻的概述。

towardsdatascience.com](/pandas-sidetable-just-announced-708e5f65938f)

熊猫-datareader

Pandas-datareader 是熊猫的远程数据访问库。它使得用几行代码获取股票价格数据变得非常简单。如果您想从事时间序列预测或算法交易,您可以使用 datareader 轻松获得股票价格的原始数据。

我们来做一个简单的例子。

import numpy as np
import pandas as pd
from pandas_datareader import dataaapl = data.DataReader("AAPL", start='2015-1-1',end='2019-12-31',data_source='yahoo')

仅此而已!我们现在已经将 2015 年至 2020 年的苹果股价数据保存在熊猫数据框架中。

如果您计划使用 LSTMs(一种特殊类型的递归神经网络)做项目,预测股票价格是一个不错的选择。通过 pandas-datareader 可以很容易地访问流程的原始数据。当然,在将数据输入模型之前,您需要对数据进行一些预处理和重新格式化。

特征工具

Featuretools 是构建在 pandas 之上的自动化特征工程工具。这在构建机器学习模型时非常有用,因为特征工程是机器学习管道的关键预处理步骤。

我们对这些特征和它们之间的关系了解得越多,我们建立的机器学习模型就越好,越健壮。因此,Featuretools 是您的宝贵财富。

熊猫的功能丰富了第三方包。你可以选择长的方法,只用熊猫自己的函数和方法来做你的分析。但是,最好简化某些任务以节省时间。此外,第三方软件包通过展示不同的方法和视角来改进数据分析过程。

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

4 个必知的熊猫功能应用

原文:https://towardsdatascience.com/4-must-know-pandas-function-application-852f5c4b4a1e?source=collection_archive---------27-----------------------

用函数转换数据

照片由卢卡·布拉沃在 Unsplash 上拍摄

对于数据科学家来说,Pandas 是一个必不可少的模块,尤其是对于 Pythonist 爱好者来说。它允许我们用几行代码来存储、探索和操作数据,从而使我们的生活变得更加轻松。但是,有时您希望使用函数来管理数据。出于这个原因,我试图写一篇文章向您介绍一些我们可以在函数中用于数据操作的属性。

下面是熊猫功能应用四大必看。

1 .管道()

熊猫鼓励我们使用方法链来操作我们的数据。如果你不知道什么是方法链接,让我用下面的例子给你演示一下。

import pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')#Method Chaining
mpg.head().info()

方法链接是在同一行代码中执行的连续函数。我们使用链式方法来减少我们编写的行数,从而更快地执行函数。

如果我们想链接我们的函数呢?下面我们来看一个简单的例子。

#Function to extract the car first name and create a new column called car_first_namedef extract_car_first_name(df):df['car_first_name'] = df['name'].str.split(' ').str.get(0)return df#Function to add my_name after the car_first_name and create a new column called car_and_namedef add_car_my_name(df, my_name = None):df['car_and_name'] = df['car_first_name'] + my_nameadd_car_my_name(extract_car_first_name(mpg), my_name = 'Cornellius')mpg.head()

正如我们所看到的,我们需要在另一个函数中执行我们的函数来产生结果。执行这些功能需要多长时间?

函数内函数的执行时间

执行一个功能代码中的一个功能需要 18ms。现在,让我向您介绍一个使用下面的pipe属性的链接方法。

mpg.pipe(extract_car_first_name).pipe(add_car_my_name, my_name = 'Cornellius')

Pandas 对象中的方法链接需要使用pipe属性。我们想要链接的每个函数都在pipe属性中输入。我们可以看到结果类似于上面的例子。执行时间呢?

使用管道属性的方法链接的执行时间

使用pipe属性进行方法链接只花了 6 毫秒。很清楚哪一个更快。看起来在执行时间上没有太大的不同,但是想象一下如果我们使用大数据。执行时间将发挥更大的作用。这就是为什么当我们对函数进行方法链接时,使用pipe是明智的。

2 .应用()

之前我们讨论了整个数据集的链接方法,但是如果我们想按行或按列传播我们的函数呢?在这种情况下,我们可以使用apply属性。让我用下面的例子来展示一下。

import numpy as np#Selecting only the numerical columns then applying mean function to each columnmpg.select_dtypes('number').apply(np.mean)

默认情况下,我们在apply 属性中输入的函数将被广播到每一列。结果是以列名作为索引、以函数返回值作为序列值的序列。

我们也可以创建自己的函数。事实上,这就是我们使用apply属性的原因。这是因为我们可以实现函数来按列或行转换数据。让我给你看下面的例子。

#Creating a function that accepting the column and return each column mean divided by 2def mean_divided_by_2(col):return (col.mean())/2mpg.select_dtypes('number').apply(mean_divided_by_2)

使用我自己的函数,我得到了每列平均值除以 2 的结果。如果您知道,我创建的函数接受一个名为 col 的参数,使用这个 col 参数,我通过使用mean属性返回每一列的平均值。这意味着我们为apply属性创建的函数将接受每列的一系列对象。这样,我们可以在自己的函数中使用任何一个系列方法。

行方式应用怎么样?是的,我们可以按行的方式将函数应用于数据集。下面让我用一个简单的例子来告诉你。

#Using print function and change the axis parameter to 1 in order for a row-wise applicationmpg.select_dtypes('number').apply(print, axis =1)

从结果中我们可以看到,我们正在打印每一行数据,其中每一行都被转换成一个 series 对象。序列索引是列名,序列值是每行中的值,序列名称是每行的索引名。

就像以前一样,我们可以创建自己的函数。下面让我给你看一个例子。

#Creating a classification function. If the mpg is below 18 and the model_year below 75 it would return Old-School, else it would return New-Schooldef mpg_classification(cols):if cols['mpg'] <18 and cols['model_year'] <75:return 'Old-School'else:return 'New-School'#Creating a new column called Classification by using the mpg_classification function input on apply attributempg['Classification'] = mpg.apply(mpg_classification, axis = 1)mpg.head()

如您所见,我们现在有了一个名为“分类”的新列。这些值基于我们在apply属性中使用的 mpg_classification 函数。在行方式的情况下,我们在每一行中迭代,所以我们输入的函数在每一行中都被应用。每次迭代都是一个系列对象,由行值组成,索引是列名。在我上面的函数中,cols 参数将由每行的 series 对象填充;这就是为什么我在 cols 参数中指定了我使用的列(cols['mpg']和 cols['model_year'])。

3.agg()

aggregationagg允许以一种简洁的方式表达可能的多个聚合操作。对于不知道什么是聚合的人来说,让我用下面的例子来说明一下。

mpg.agg(np.mean)

使用一个函数的聚合类似于我们之前使用的apply属性。它对每一列应用一个函数并产生一个系列对象。agg的特别之处在于它可以实现多种功能。

#Instead of function, agg could receive the string of the basic statistic function. Additionaly, we could implement our own function here as well. If we have multiple function, we put it in the list.mpg.agg(['mean', 'std',mean_divided_by_2])

使用多个函数作为输入,我们得到一个数据框对象。agg属性的伟大之处在于该函数只适用于有效对象。如果我们输入的函数不能接受某些数据类型,它将被忽略。

将 dictionary 对象传递给agg属性允许我们指定哪个函数应用于哪个列。

#For example, I only use mpg and acceleration column. If we pass dictionary to the agg attribute, we need to specify the function we want to every column.mpg[['mpg', 'acceleration']].agg({'mpg': ['mean',mean_divided_by_2], 'acceleration': 'std'})

4.应用地图()

我们之前学习的所有属性都是基于整个数据集或列/行的。如果我们只想将函数应用于每个元素或值呢?在这种情况下,我们将使用applymap属性。下面让我给你看一个例子。

#You could input a lambda function as well. Here I create a function to transform each value into string object and return the length of the stringmpg.applymap(lambda x: len(str(x)))

结果是一个数据框对象,其中我们输入到applymap的函数被应用到数据集中的每个值。我们还为系列对象设置了map属性,它相当于数据框的applymap属性。

#Using map attribute on the series objectmpg['name'].apply(lambda x: len(str(x)))

结论

在本文中,我向您展示了四个熊猫函数应用程序,它们被证明在我们的日常数据科学工作中非常有用。它们是:

  1. 应用
  2. 集料
  3. 应用地图

希望有帮助!

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

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

成为优秀分析师可以做的 4 件非技术性的事情

原文:https://towardsdatascience.com/4-non-technical-things-you-can-do-to-become-a-great-analyst-9f18c74e45d5?source=collection_archive---------27-----------------------

不是你做什么,而是你怎么做

当谈到作为数据分析分析师的职业发展时,非技术或“软”技能可能在你的优先列表中相当低。毕竟,想到一个分析师职位,首先想到的是技术技能。你可能只是想利用你的技术技能来回答商业问题或制造产品,从而获得经验。你不会真的想做更多的事情。

然而,这个职位(或任何职位)对非技术性技能的需求也非常重要。作为一名分析师,您在组织的有效性中扮演着至关重要的角色。但是如果你不能有效地交流你的工作,或者问一些能引导你找到正确答案的问题,那么你会发现你的硬技能也会落后。

软技能很重要,不仅因为它们能帮助你更好地完成工作,还因为它们能帮助你推进职业发展。

在这篇文章中,我们将探讨成为一名有效的分析师可以做的 4 件非技术性的事情。这些东西将与你的技术能力相结合,使你成为最有效的分析师。

图片来自 Unsplash

1.有效沟通

我们将从对分析师来说可能是最重要的软技能——沟通开始。在你的技术能力之外,你可能会发现沟通是你做任何事情的基础。

无论是与他人分享你的工作,提出建议,还是仅仅出于尊重和友好,沟通对于融入任何工作环境都是必不可少的。作为一名分析师,这变得尤其重要,因为你的工作本质上是技术性的,所以知道如何向他人传达你的发现对于确保他们知道你所贡献的价值是非常重要的。

归根结底,人们希望和自己喜欢的人一起工作。真的就这么简单。融入一个组织有时和你的工作质量一样重要,而沟通是你融入的一个重要部分。

为了在职业生涯中前进,你需要尊重,你需要善良,你需要与他人合作愉快。

图片来自 Unsplash

2.解释你在做什么

分析师应该采取的下一个重要步骤是确保他们解释他们在做什么。你可以认为这是沟通技巧的一个分支。一个简单的事实是,大多数分析师所做的工作并不为组织中的其他人所理解。因此,一个好的分析师会尽最大努力让其他人知道他们在做什么,并确保详细记录他们的工作。

高效完成工作固然重要,但让你的同事和经理知道你在做什么也很重要。这会让人们对你的表现满意,也会增加你晋升的机会。

作为一名分析师,你的工作是技术性的。你的技能允许你解读别人无法解读的领域。然而,你的工作仍然意味着帮助组织实现某些目标,并朝着最终目标努力。这就是为什么你需要知道如何有效地向组织的其他部门分享你的发现。

有效的翻译意味着你需要知道如何把你做的复杂的事情用任何人都能理解的术语表达出来。

图片来自 Unsplash

3.开诚布公,乐于助人

作为一名分析师,您负责组织中其他人可能不了解的领域。人们可能会带着他们不知道如何回答的问题来找你。你必须开诚布公,乐于助人。即使答案对你来说很简单,你也应该始终确信你愿意以非居高临下的方式提供帮助。

分析师需要与组织中的其他人和谐地工作,而你愿意帮助他人解决他们的问题是这种和谐的主要部分。因此,以开放的心态对待任何问题,并认识到你在组织中的角色有时是帮助澄清困惑。

4.提问

在任何角色中,你能学会做的最重要的事情之一就是提问。通常,人们不敢问问题,因为他们觉得这代表他们不理解自己的任务,或者他们对自己的角色感到困惑。

现实情况是,任何经理最关心的是你能否正确完成工作。所以你需要学会,当你有一个你认为会决定你在某项任务上表现的问题时,不要犹豫。

当然,你不想成为问不必要的问题的人。减少你需要问的问题数量的一个好方法是认真听并做笔记。

携带笔记本是一个很好的策略,可以确保你记住所有重要的信息,同时也向你的同事和经理表明你在认真对待你的任务。一旦他们知道这一点,他们会非常乐意帮助你解决你可能有的任何问题。

结论

如你所见,作为一名分析师,软技能对你的职业发展非常重要。你可以认为沟通是你所有软技能的基础。知道如何有效地与他人沟通会提高你工作的各个方面。这将使其他人更有效地获得你的发现,并有助于整个组织。

掌握这些技能并使之成为习惯是很重要的。由于分析师职位的技术性质,许多人并不总是花足够的时间学习软技能。作为一名分析师,你应该每天花时间来提高这些技能。这可能需要走出你的舒适区,但是你会发现付出额外的努力是值得的。

4 熊猫功能重塑餐桌布局

原文:https://towardsdatascience.com/4-pandas-function-to-reshape-table-layout-f08e760c4602?source=collection_archive---------23-----------------------

根据你的需求改造你的熊猫桌

安视觉在 Unsplash 上拍照

在处理数据时,有时您需要以您需要的方式转换您的表。这可能是因为您需要更清楚地查看您的数据,或者您需要将您的数据转换成更好的形式。

无论如何,本文将重点介绍四个不同的函数,您可以使用它们来转换您的 Pandas 数据框。让我们开始吧。

1 .排序值

简单而有用。这种优雅的方法是熊猫武器库中最有用的方法之一。仅仅从名字上,你就能猜出这个函数是做什么的。是的,这个函数根据特定列中的值对表进行排序。

让我用一个数据集的例子来说明。

import pandas as pd
import seaborn as sns#Loading dataset example
tips = sns.load_dataset('tips')
tips.head()

原始提示表

以上是我们的数据集示例。假设我想根据已排序的 total_bill 列重新调整我的表布局。我可以用下面的代码来做。

tips.sort_values('total_bill').head()

基于 total_bill 列的排序提示表

就像这样,我们根据 total_bill 列对表进行升序排序。如果您想基于大小列对列进行排序,然后以降序方式提示列,又会如何呢?用下面的代码也可以做到这一点。

#We put our columns in the list and input False value in the ascending parameter to change the sorting directiontips.sort_values(['size', 'tip'], ascending = False).head()

根据大小和提示列对表进行降序排序

现在我们首先按照 size 列对表进行排序,然后按照 tip 列降序排序。

2 .枢轴

Pivot 是一种基于列值从数据框重塑数据(生成“pivot”表)的方法。它使用指定索引/列中的唯一值来形成结果数据帧的轴。

我们所做的枢轴的另一个名称是**长到宽的桌子。**为了说明原因,让我们用 tips 数据集来尝试一下。

#I specify the as the column and the both total_bill and tip column as the valuetips.pivot(columns = 'sex', values = ['total_bill', 'tip'])

如您所见,我们现在将表布局更改为数据透视表。性别列中的前一个类现在变成了它们各自的列,并且在它们的位置上用数值填充了值。

NaN 值,因为在原始数据的该行中不存在任何值。例如,索引 0 在男性列中包含 NaN 发生这种情况是因为在行索引 0 中,性别值是女性。看下图就知道了。

3 .数据透视表 _ 表格

熊猫数据框对象中有一个方法。与 pivot 方法相比有什么不同?我们就试试吧。

tips.pivot_table(columns = 'sex', values = ['total_bill', 'tip'])

现在,结果与 pivot 方法相比明显不同。这是因为在 pivot_table 函数中,我们得到的不是包含每个数据值的行,而是聚合值。

默认情况下,聚合函数是 mean(平均值);这就是为什么在上面的数据透视表中,值是每个组合的平均值。

我们可以尝试在我们的数据透视表中有另外几个聚合函数。

tips.pivot_table(columns = 'sex', values = ['total_bill', 'tip'], aggfunc = ['mean', 'std', 'median'])

在上面的数据透视表中,我们添加了 mean 之外的另一个聚合函数;标准差和中位数。它创建了一个附加的多级数据透视表,其中包含聚合函数的所有值。

如果您想要创建一个更详细的分离和汇总值,我们可以用下面的代码来完成。

#Specificed the size column as the index and margins as True to get the total summarytips.pivot_table(columns = 'sex', values = ['total_bill', 'tip'], aggfunc = ['mean', 'std', 'median'], index = 'size',margins = True)

上面我们得到了我们需要的详细的数据透视表。

4.熔化

熔化是枢轴功能的逆过程。在这个函数中,我们创建了一个从宽到长的表。或者换句话说,我们把桌子拆了。让我们试一下这个函数的功能。

tips.melt(id_vars = 'tip', value_vars = 'sex')

就这样,我们得到了融化的桌子。在上面的非透视表中,我们得到三列;提示、变量和值列。提示列是提示列的原始值,可变列值是原始列名,值列值是类类别或可变列值中的值。

结论

在本文中,我向您展示了四个熊猫函数来重塑表格布局:

  1. 排序值
  2. 在枢轴上转动
  3. 数据透视表 _ 表格
  4. 熔化

希望有帮助!

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

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

4 你应该知道的熊猫绘图功能

原文:https://towardsdatascience.com/4-pandas-plotting-function-you-should-know-5a788d848963?source=collection_archive---------18-----------------------

一些你可能从来不知道的熊猫的简单策划

艾萨克·史密斯在 Unsplash 上拍摄的照片

对于数据科学家来说,Pandas 是一个强大的软件包。我们使用熊猫有很多原因,例如数据争论、数据清理和数据操作。虽然,有一种关于熊猫包装的方法很少被提及,那就是数据绘制

数据绘图,顾名思义,是将数据绘制成一些图形或图表以使数据可视化的过程。虽然我们有更好的可视化软件包,但是一些方法在熊猫绘图 API 中是可用的。

让我们来看看我选择的几个精选方法。

1.拉德维兹

RadViz 是一种将 N 维数据集可视化为 2D 图的方法。当我们拥有超过 3 维(特征)数据或更多数据时,问题是我们不能可视化它,但是 RadViz 允许它发生。

据 Pandas 称,radviz 允许我们将一个 N 维数据集投影到 2D 空间,其中每个维度的影响都可以被解释为所有维度重要性之间的平衡。用一个更简单的术语来说,这意味着我们可以用一种原始的方式把多维数据投射到 2D 空间。

让我们试着在一个样本数据集中使用这个函数。

#RadViz example
import pandas as pd
import seaborn as sns#To use the pd.plotting.radviz, you need a multidimensional data set with all numerical columns but one as the class column (should be categorical).mpg = sns.load_dataset('mpg')
**pd.plotting.radviz(mpg.drop(['name'], axis =1), 'origin')**

RadViz 结果

以上是 RadViz 函数的结果,但是你会如何解读这个情节呢?

因此,数据帧中的每个系列都表示为一个圆形上均匀分布的切片。只看上面的例子,有一个圆圈,上面有系列名称。

然后,根据每个系列的值,将每个数据点绘制在圆圈中。数据框中高度相关的系列更靠近单位圆。在本例中,我们可以看到日本和欧洲的汽车数据更接近车型年份,而美国汽车更接近排量。这意味着日本和欧洲汽车最有可能与年款相关,而美国汽车与排量相关。

如果你想了解更多关于 RadViz 的信息,你可以点击查看论文。

2.自举图

根据 Pandas 的说法, bootstrap plot 用于通过依赖替换随机抽样来估计统计数据的不确定性。更简单地说,通过替换(你可以多次采样相同的数据)对数据进行重采样,试图确定基础统计中的不确定性,如均值和中值。你可以在这里阅读更多关于 bootstrap 的信息。

boostrap_plot 函数将为给定大小的给定数量的样本生成均值、中值和中间范围统计的自举图。让我们通过一个示例数据集来尝试使用该函数。

例如,我有 mpg 数据集,并且已经有关于 mpg 特征数据的信息。

mpg['mpg'].describe()

我们可以看到平均每加仑跑 23.51 英里,中位数是 23 英里。虽然这只是真实世界数据的快照。总体中的值实际上是多少是未知的,这就是为什么我们可以用 bootstrap 方法来测量不确定性。

#bootstrap_plot examplepd.plotting.bootstrap_plot(mpg['mpg'],size = 50 , samples = 500)

以上是 bootstap_plot 函数的结果示例。请注意,结果可能与示例不同,因为它依赖于随机重采样。

我们可以在第一组图(第一行)中看到采样结果,其中 x 轴是重复,y 轴是统计数据。第二组是统计分布图(平均值、中间值和中间值)。

以平均值为例,大多数结果在 23 左右,但也可能在 22.5 到 25 之间(或多或少)。这在现实世界中设定了不确定性,即人口中的平均值可能在 22.5 和 25 之间。请注意,有一种方法可以通过取位置 2.5%和 97.5%分位数(95%置信)的值来估计不确定性,尽管这仍然取决于您的判断。

3.滞后 _ 绘图

滞后图是一个时间序列的散点图,同样的数据滞后。滞后本身是一个固定量的流逝时间;例如,滞后 1 是具有 1 天时间滞后的第 1 天(Y1)(Y1+1 或 Y2)。

滞后图用于检验时间序列数据是否随机,以及数据之间是否相关。随机数据不应该有任何可识别的模式,如线性。尽管如此,我们为什么要为随机性或相关性而烦恼呢?这是因为许多时间序列模型是基于线性回归的,并且一个假设是没有相关性(具体来说就是没有自相关)。

让我们用一个例子数据来试试。在这种情况下,我将使用一个名为 yahoo_historical 的特定包从 Yahoo Finance 中删除股票数据。

pip install yahoo_historical

有了这个包,我们可以废弃特定的股票数据历史。让我们试一试。

from yahoo_historical import Fetcher#We would scrap the Apple stock data. I would take the data between 1 January 2007 to 1 January 2017 
data = Fetcher("AAPL", [2007,1,1], [2017,1,1])
apple_df = data.getHistorical()#Set the date as the index
apple_df['Date'] = pd.to_datetime(apple_df['Date'])
apple_df = apple_df.set_index('Date')

上面是我们以日期为索引的苹果股票数据集。我们可以尝试用一种简单的方法来绘制数据,以观察随时间变化的模式。

apple_df['Adj Close'].plot()

我们可以看到 Adj Close 随着时间的推移而增加,但数据本身是否显示出任何滞后模式?在这种情况下,我们将使用 lag_plot。

#Try lag 1 day
pd.plotting.lag_plot(apple_df['Adj Close'], lag = 1)

正如我们在上面的图中看到的,它几乎是线性的。这意味着每日的密切相关。这是意料之中的,因为股票的每日价格每天不会有太大的变化。

每周一次怎么样?让我们试着画出来

#The data only consist of work days, so one week is 5 dayspd.plotting.lag_plot(apple_df['Adj Close'], lag = 5)

我们可以看到模式类似于滞后 1 图。365 天怎么样?会有什么不同吗?

pd.plotting.lag_plot(apple_df['Adj Close'], lag = 365)

我们现在可以看到模式变得更加随机,尽管非线性模式仍然存在。

4.散布矩阵

scatter_matrix 顾名思义;它创建了一个散点图矩阵。我们马上用一个例子来试试。

import matplotlib.pyplot as plttips = sns.load_dataset('tips')
pd.plotting.scatter_matrix(tips, figsize = (8,8))
plt.show()

我们可以看到,scatter_matrix 函数自动检测传递给该函数的数据框中的数字特征,并创建散点图的矩阵。

在上面的示例中,两个数字特征之间绘制在一起以创建散点图(total_bill 和大小、total_bill 和小费以及小费和大小)。而对角线部分是数字特征的直方图。

这是一个简单的函数,但是足够强大,因为我们可以通过一行代码获得很多信息。

结论

在这里,我向你展示了 4 种不同的熊猫绘图功能,你应该知道,其中包括:

  1. 拉德维兹
  2. 自举图
  3. 滞后 _ 绘图
  4. 散布矩阵

希望有帮助!

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

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

大多数人不知道的 4 个熊猫戏法

原文:https://towardsdatascience.com/4-pandas-tricks-that-most-people-dont-know-86a70a007993?source=collection_archive---------12-----------------------

PublicDomainPictures 在 Pixabay 拍摄的照片

熊猫的一些不常见但有趣的方法可以节省我们的时间

如果你是数据分析师或数据科学家,你一定知道 Python 中的 Pandas 库,它已经成为 Python 中数据角力/清理工具的标准。然而,熊猫有一些小技巧,我打赌你可能不知道所有的技巧。

在这篇文章中,我将分享一些我知道的熊猫技巧。我相信它们会加快我们的工作,有时会让我们的生活更轻松。现在我们应该开始了!

1.从剪贴板创建数据帧

由 StockSnap 在 Pixabay 上拍摄的照片

好吧,你一定知道熊猫可以很容易的从 CSV,JSON 甚至直接从数据库中使用 SQLAlchemy 读取,但是你知道熊猫也可以从我们操作系统的剪贴板中读取吗?

假设我们有一个包含多个数据表的 Excel 文件。现在,我们希望用 Python 处理一个表中的部分数据。为了实现这一点,我们通常会做些什么?

  1. 从数据表中复制我们需要用 Python 处理的数据。
  2. 将其粘贴到另一个数据表中。
  3. 将当前工作表保存为 CSV 文件。
  4. 获取新 CSV 文件的路径。
  5. 转到 Python,使用pd.read_csv('path/to/csv/file')将文件读入 Pandas 数据框。

肯定有更简单的方法,那就是pd.read_clipboard()

  1. 复制您需要的数据区域。
  2. 去 Python,用pd.read_clipboard()

如上图,多简单啊!如果您只是想将一些数据加载到 Pandas 中,则不需要有单独的 CSV 或 Excel 文件。

这个函数也有更多的技巧。例如,当我们有日期格式的数据时,它可能无法正确加载,如下所示。

诀窍是让熊猫知道哪一列是需要解析的日期格式。

df = pd.read_clipboard(parse_dates=['dob'])

2.使用测试方法生成虚拟数据

照片由 pszmajduch 在 Pixabay 上拍摄

有时我们可能想生成一些样本数据帧。最常见的方法可能是使用 NumPy 生成一个带有随机值的数组,然后从该数组生成数据帧。

我会说,如果我们需要数据具有某种分布,比如正态分布,我们就必须使用 Numpy。但是,很多时候我们可能并不关心数据是否正态分布,我们只是希望有一些数据可以随便玩玩。在这种情况下,有一种更简单的方法。即使用pandas.util.testing包生成样本数据帧。

pd.util.testing.makeDataFrame()

数据框的索引将使用随机字符串生成。默认情况下,将有 30 行 4 列。

如果我们需要一定数量的行和列,我们可以将testing.N定义为行数,将testing.K定义为列数。

pd.util.testing.N = 10
pd.util.testing.K = 5
pd.util.testing.makeDataFrame()

3.将数据帧输出到压缩文件

照片由 stevepb 在 Pixabay 上拍摄

你要知道我们可以很容易的将一个数据帧输出到一个文件中,比如df.to_csv()df.to_json()等等。但有时,我们可能希望压缩文件以节省磁盘空间或用于其他目的。

举个例子,作为一个数据工程师,我确实满足了这样一个要求,就是把熊猫数据帧输出成 CSV 文件,传输到远程服务器。为了节省空间和带宽,文件需要在发送前压缩。

通常,典型的解决方案可能是在正在使用的调度工具(如 Airflow 或 Oozie)中增加一个步骤。但是我们知道我们可以直接让熊猫输出一个压缩文件。因此,解决方案会更简洁,步骤更少,也更简单。

让我们使用技巧№2 生成一个随机数据帧:)

pd.util.testing.N = 100000
pd.util.testing.K = 5
df = pd.util.testing.makeDataFrame()

在这种情况下,我们只需要一个数据框,其中的值完全不重要。

现在,让我们将数据帧保存到 CSV 文件中,并检查其大小。

import osdf.to_csv('sample.csv')os.path.getsize('sample.csv')

然后,我们可以测试将相同的数据帧输出到一个压缩文件中,并检查文件的大小。

df.to_csv('sample.csv.gz', compression='gzip')os.path.getsize('sample.csv.gz')

我们可以看到压缩后的文件不到正常 CSV 文件的一半。

请注意,这可能不是一个好例子,因为在我们的随机数据框中没有任何重复的值。在实践中,如果我们有任何分类值,压缩率可以非常高!

顺便说一句,也许你在想我要说的事情。可以,熊猫可以直接把压缩文件读回一个数据帧。不需要在文件系统中解压。

df = pd.read_csv('sample.csv.gz', compression='gzip', index_col=0)

我更喜欢用gzip,因为它默认存在于大多数 Linux 系统中。熊猫也支持更多的压缩格式,比如“zip”和“bz2”。

4.从多列获取日期时间

布鲁诺在皮克斯贝拍摄的照片

相信你在熊猫里一定用过pd.to_datetime()方法把某种字符串转换成 DateTime 格式。我们通常将这种方法与格式字符串一起使用,比如%Y%m%d

但是,有时我们可能会使用以下类型的数据框作为原始数据。

df = pd.DataFrame({'year': np.arange(2000, 2012),'month': np.arange(1, 13),'day': np.arange(1, 13),'value': np.random.randn(12)
})

在数据框中将年、月和日作为单独的列并不罕见。事实上,我们可以使用pd.to_dateframe()一步将它们转换成日期时间列。

df['date'] = pd.to_datetime(df[['year', 'month', 'day']])

多简单啊!

摘要

照片由 Engin_Akyurt 在 Pixabay 上拍摄

在本文中,我分享了一些我认为在 Python Pandas 库中非常有用的技巧。我会说,这些小技巧当然不是我们必须知道的要点。但是了解它们有时可以节省我们生活中的时间。

我会继续为 Python 寻找更多有趣的东西。请关注我的个人资料。

[## 通过我的推荐链接加入灵媒-陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

走向数据驱动文化的 4 个悖论

原文:https://towardsdatascience.com/4-paradoxes-on-the-way-to-data-driven-culture-c378a5e99187?source=collection_archive---------50-----------------------

来源:娜塔莉亚·基塞列娃经由分析师的漫画 (CC BY-NC-ND)

构建数据驱动系统时,分析师需要具备哪些技能?

M 通过 KPI 管理企业,根据运营数据和预测做出决策,在人工智能的帮助下找到商业见解是每个经理和企业主的梦想。然而,构建这样一个系统并不容易——有一个完整的 IT 服务动物园,每个都需要支持。最终,一切都归结到人身上,那些知道如何“与机器交流”并将工作结果转化为商业语言的数据分析师。

将大数据转化为商业解决方案(一种信息产品)的过程包括几个阶段,需要不同人员的团队合作。甚至还有这样一个名词——数据驱动型组织。这是一家管理层根据分析做出决策的公司,而不仅仅是经验、意见或直觉。

为了成为这样的公司,仅仅雇佣一个顶尖的程序员团队或购买一个先进的 CRM 系统是不够的,你需要改变企业沟通的文化,了解这些过程的参与者的心理。

分析师不一定是一个职位,它是一个角色,最重要的是:许多员工参与管理报告的编写。但是,客户和经理经常从他们的分析师那里收到大量的表格和幻灯片,而不是适合决策的信息。

在我整合公司报告系统的 10 年中,我观察到许多期望与现实不符的情况,并在本文中进行了描述。这将有助于你了解你的公司在沟通方面存在哪些缺陷,以及如何消除你走向数据驱动文化的障碍。

3 种类型的分析师

处理数据和报告的人员可以分为三组:**分析师、图片人员和技术人员。**他们对数据、数据处理和结果有不同的角色、任务和要求。他们都使用不同的方法共同工作。这就是他们工作态度的矛盾之处。

  1. 分析师是寻找特定问题答案的金融专家、经济学家和营销专家。为此,他们进行研究,收集信息,并得出结论。他们的任务是分析数据,确定因果关系,研究各种因素对业务流程的影响。例如,一位经济学家确定了影响成本增长的因素,而一位网络分析师从搜索查询关键词中构建了网站的语义核心。
  2. 技术人员是数据库开发人员、数学家和数据科学专家。他们衍生信息处理算法,设计数据仓库,并自动生成报告。对他们来说重要的是系统是如何工作的,是什么影响了它,如何让这个过程不出错不中断,也就是创造一个完美的算法。
  3. 图片人制作最终产品,知道如何把表格变成清晰的图表、幻灯片甚至仪表盘。通常,他们不担任设计师的职位,而是了解业务需要什么并能为设计师和开发人员设定任务的经理。一个分析师也可以扮演一个形象化的角色,在可用性的类别中思考,并且有一种美感。

他们每个人都认为他们那部分工作是最重要的。分析师认为是寻找问题答案的过程,图片人认为是呈现的美感和可及性,技术人员认为是模型和算法。结果是对最终客户来说不明显的矛盾。

悖论 1。分析师不需要可视化

分析师的完美工具是 Excel 电子表格、OLAP 立方体或可以通过 Qlik 或 Power BI 连接的数据展示。对他们来说,结果是几个表或数组的交集。他们感到舒适和方便,他们理解他们。他们把一切都切成薄片,用细胞组织起来,这不是没有原因的。

简单的图表或演示幻灯片对分析师来说并不有趣,对他们来说,它们只是“美丽的图片”,如果不沉浸在上下文中,这些图片毫无用处。毕竟你总是可以钻研表格,刨根问底的。他们理解仪表板的价值,但使它们过于复杂,许多书签过滤器占据了屏幕的一半。

只有分析师才能理解的多过滤器仪表板

这是一个常见的问题—

分析师不知道如何授权访问信息。

他们为自己建立了不同的报告,他们将根据您的要求收集数据并准备必要的样本。但这样一来,它们自己就成了汇总表的构造者,封闭了自身的信息流。这样的员工会花半天时间创建相同的报告,只是从不同的角度,抱怨他们没有足够的时间进行分析。

悖论二。图片人不关心数据质量

我说的‘图片人’,指的是视觉思维发达的分析师,而不是设计师。他们塑造分析结果,在追求和谐和美学的过程中,信息的可靠性对他们来说变得无足轻重。那么一个喜欢图片的人可能会错过一些重要的细节,而这些细节是分析研究人员肯定会注意的。例如,在这个因素分析图中,颜色选择不正确。

实际工资总额偏离计划工资总额的因素

根据图表的想法,那些带负号的因素用红色表示,增加的用绿色表示。但是在这里我们分析工资超支的原因,减少、节约是好的,相反,费用的增加应该被标上红色。

但是画这幅图的人并没有注意上下文,因为这幅图本身看起来清晰而有逻辑。

悖论三。程序员不关心商业结果

数据科学家,机器学习者,这听起来很酷,但事实上这是数学家的职业,一个与算法打交道的程序员。对他们来说,技术方面很重要,机器学习的模型所描述的关系的性质,但如何进一步处理这些信息并不困扰他们。他们会为你建立一个理想员工职业能力的模型,但不会告诉你如何找到一个,如何管理它们。

我并不是批评开发人员关心数据库结构的完整性,而不是如何增加客户忠诚度。相反,我说的是这样一个事实,即期望从他们那里获得现成的商业发展解决方案是幼稚的。

如果可视化不是一种数据库通信方案,程序员也不会感兴趣。他们也不对数据质量负责。

他们的职责范围是稳定工作、系统性能和无错误。

不过,这也非常重要。

悖论 4。业务需要文本

在文章的开始,我谈到了三个角色,但是在这个过程中还有另一个参与者——业务客户,决策者。最令人惊讶的是,他们不关心可视化,分析研究的深度,或算法的可行性。

业务需要结论、明确定义的解决方案或策略选项,以及对结果的预测。理想情况下,他们需要一个坚实、清晰的文本,包含简单的句子,没有任何分词从句:什么价格将确保最大的销售量,为什么在这个特定项目上的投资会有回报。

当然,如果给一位高管提供一份分析报告的直截了当的文本,他们不会高兴。

他们需要文本、可视化和结论,都在一个屏幕上。

我开始看到越来越多的仪表板包含一个带有书面结论的模块,甚至还有自动从仪表板生成文本的双系统插件。

管理仪表板,带有一组书面结论

起初,我认为这样的需求是异想天开的,但是现在我承认这是有效性控制的一个额外阶段,在这个阶段,分析师可以理解结论。这不是关于从表格到图表的手工复制数据,而是关于理解偏离计划的原因,关于会议的准备。

下一步是什么?

因此,分析师寻找问题的答案并构建数据,图片人员创建和谐的图片,技术人员推导算法,并监控他们工作的连续性。企业等待简单明了的结论,以便做出具体的决策。

你不应该期望一个专家,即使他们和你有相同的观点和看法,来建立你的端到端的业务流程分析系统。这里你需要团队合作,人们互相补充,正确理解顾客的期望。

如果你从一个设计师那里订购了一个房子或公寓的项目,那么期望他们也会为交流设计一个布局是天真的。同样,去理发店时,你也不希望修指甲或背部按摩。虽然你可以在综合大楼里得到所有这些服务,但前者是在建筑公司,后者是在美容院。

你可以争辩说雇佣一整个团队的各种各样的分析师太贵了,从系统集成商那里订购一个项目甚至更贵。当然,如果您有一个简单的任务来优化当前流程或执行一个修饰性的报告刷新,那么您可以自行处理。只是不会是那种数字化转型,向数据驱动文化的过渡。

有一个选项,你可以在不增加人力资源的情况下得到结果。为了达到平衡,你必须让管理团队参与进来,让他们沉浸在操作活动、过程度量中,扮演技术人员的角色,或者至少是分析师、研究人员或图片人员。当主管成为首席分析师和数据驱动决策文化的领导者时,这是“最正确”的选择。

数据可视化的 4 大支柱:分布、关系、组合和比较

原文:https://towardsdatascience.com/4-pillars-of-data-visualization-distribution-relationship-composition-comparison-935cf9248f97?source=collection_archive---------12-----------------------

在 Unsplash 上由 Kelli Tungay 拍摄的照片

数据可视化的原理

几个世纪前,科学家们没有照相机来拍摄遥远的星系或显微镜下的微小细菌。绘画是交流观察、想法甚至理论的主要媒介。事实上,绘制抽象概念和物体的能力是科学家的一项基本技能(查看威廉·普莱费尔18 世纪的收藏)。

显示苏格兰进出口的条形图(威廉·普莱费尔:公共领域)

现在依然如此。我们不能拍摄分布变量或它们的相关性。相反,我们通过现代工具和技术,通过绘图和插图(也称为数据可视化)来传达它们。

数据集包含一个或多个变量,我们可以以多种方式可视化每个变量及其与其他变量的交互。选择哪种可视化取决于数据和我们想要交流的信息类型。然而,从根本上说,它们有四种不同的类型:

  • 单变量的分布
  • 两个变量之间的关系
  • 单个或多个变量的组成
  • 不同类别/个人之间的比较

在本文中,我将通过插图来分解数据可视化的这 4 个基石。

1)分配

统计学和数据科学中的一个重要概念是分布。分布一般指一个结果发生的概率。在 100 次抛硬币的分配中,有多少次是正面,多少次是反面?像这样的频率分布用直方图或曲线表示。

下面是游泳课上学生身高分布的示意图。x 轴显示不同的身高类别,y 轴显示每个类别的学生人数。

学生身高频率分布(图:作者)

这是一个频率分布。但还有另一种分布——更广为人知的是分散——它显示了一个变量相对于其中心趋势是如何分散/扩散的。

离差的一个经典表示是箱线图。

分解箱线图以显示变量值的离差

上面的箱线图代表了几年来周六飞机乘客数量的分布。这张图揭示了如此多的信息——周六乘客的平均/中值数量、最小值和最大值、异常值等等!

**2)**关系

树木在早年随着年龄的增长而长高。这是两个变量之间的关系——身高和年龄。

身高= f(年龄)

在另一个例子中,房子的价格取决于床的数量、浴室的数量、位置、面积等等。这是一个因变量和许多解释变量之间的关系。

价格= f(床位、浴室、位置、面积)

如果你只把数据集看成数字,就没有办法识别这些关系。但事实上,你可以,不需要进入复杂的统计分析,借助于一个好的可视化。

一个班学生年龄与身高的关系

**3)**比较

数据可视化的第三个基石是*比较。*这种可视化材料比较数据集内的多个变量或单个变量内的多个类别。

让我们来看看下面两张图片:

展示对比的视觉效果

左边的一个在条形图上比较了两组观察结果(科学家和律师)之间的变量(工资)。右边的面板也是一个比较图表——在这种情况下,比较两组(英国和加拿大)之间的变量(GDP ),但沿着时间维度。

**4)**作文

你听说过堆积条形图吗?但我相信你知道什么是饼状图。

这些图表的目的是以绝对数和标准化形式(如百分比)显示一个或多个变量的构成。

合成图是一些老派的可视化技术,现在的用例有限(你真的需要一个饼图来显示黄色 10%和红色 15%的合成吗?).尽管如此,有时他们能以一种视觉上的美感和熟悉的、复古的方式呈现信息。

合成图:堆积条形图(左)和饼图(右)

一锤定音

本文的目的是讨论数据可视化的四个基石:分布、关系、比较和组合。在学习可视化工具和技术之前,理解可视化的目的是什么以及你想要传达什么信息是很重要的。在以后的文章中,我将会写关于 python 和 R 编程语言中的特定工具,包括matplotlibseabonggplot2。敬请期待!

[注:除了作者绘制的第一幅图之外,所有图]

4 个预训练的 CNN 模型,用于具有迁移学习的计算机视觉

原文:https://towardsdatascience.com/4-pre-trained-cnn-models-to-use-for-computer-vision-with-transfer-learning-885cb1b2dfc?source=collection_archive---------0-----------------------

深度学习案例研究

使用最先进的预训练神经网络模型,通过迁移学习解决计算机视觉问题

在我们开始之前,如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过 Linkedin 来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin

图一。迁移学习如何工作(图片由作者提供)

如果你一直在尝试建立高精度的机器学习模型;但从未尝试过迁移学习,这篇文章将改变你的生活。至少,它做到了我的!

我们大多数人已经尝试了几个机器学习教程来掌握神经网络的基础知识。这些教程非常有助于理解人工神经网络的基础知识,例如递归神经网络、卷积神经网络、 GANs 和自动编码器。但是,它们的主要功能是让您为现实世界的实现做好准备。

现在,如果你计划建立一个利用深度学习的人工智能系统,你要么(I)必须有非常大的培训预算和优秀的人工智能研究人员供你使用,要么(ii)必须从迁移学习中受益。

什么是迁移学习?

迁移学习是机器学习和人工智能的一个分支,旨在将从一个任务(源任务)获得的知识应用到一个不同但相似的任务(目标任务)。

例如,在学习维基百科文本分类时获得的知识可以用来解决法律文本分类问题。另一个例子是使用在学习分类汽车时获得的知识来识别天空中的鸟。正如你所看到的,这些例子之间是有联系的。我们没有在鸟类检测上使用文本分类模型。

总之,迁移学习是一个 让你不必重新发明轮子 并帮助你在很短的时间内构建人工智能应用的领域。

图二。不要重新发明轮子,转移现有的知识(照片由乔恩·卡塔赫纳在 Unsplash 上拍摄)

迁移学习的历史

为了展示迁移学习的力量,我们可以引用吴恩达的话:

迁移学习将是继监督学习之后,机器学习商业成功的下一个驱动力。

迁移学习的历史可以追溯到 1993 年。在她的论文中,Lorien Pratt 打开了潘多拉的盒子,向世界展示了迁移学习的潜力。1997 年 7 月,《机器学习》杂志发表了一篇专刊进行转移学习的论文。随着该领域的发展,多任务学习等相关主题也被纳入迁移学习领域。学会学习是这方面的先驱书籍之一。今天,迁移学习是科技企业家构建新的人工智能解决方案和研究人员推动机器学习前沿的强大来源。

图 3。吴恩达对机器学习子领域商业成功的期望(图片由作者提供)

迁移学习是如何工作的?

实现迁移学习有三个要求:

  • 由第三方开发开源预训练模型
  • 改变模型的用途
  • 针对问题的微调

开发一个开源的预训练模型

预训练模型是由其他人创建和训练的模型,用于解决与我们类似的问题。在实践中,有人几乎总是一个科技巨头或一群明星研究员。他们通常选择一个非常大的数据集作为他们的基础数据集,如 ImageNet 或维基百科语料库。然后,他们创建一个大型神经网络(例如,VGG19 有 143,667,240 个参数)来解决一个特定的问题(例如,这个问题是 VGG19 的图像分类)。当然,这种预先训练好的模型必须公开,以便我们可以利用这些模型并重新调整它们的用途。

改变模型的用途

在得到这些预先训练好的模型后,我们重新利用学到的知识,包括层次、特征、权重和偏差。有几种方法可以将预先训练好的模型加载到我们的环境中。最终,它只是一个包含相关信息的文件/文件夹。然而,深度学习库已经托管了许多这些预训练的模型,这使得它们更容易访问和方便:

  • TensorFlow Hub
  • Keras 应用
  • PyTorch 轮毂

您可以使用上面的来源之一来加载已训练的模型。它通常带有所有的层和权重,你可以随意编辑网络。

针对问题的微调

虽然目前的模型可能对我们的问题有效。由于以下两个原因,对预训练模型进行微调通常更好:

  • 这样我们可以达到更高的精确度;
  • 我们的微调模型可以以正确的格式生成输出。

一般来说,在神经网络中,底层和中间层通常表示一般特征,而顶层表示特定问题的特征。由于我们的新问题不同于原始问题,我们倾向于放弃顶层。通过针对我们的问题添加特定的层,我们可以实现更高的准确性。

放下顶层之后,我们需要放置我们自己的层,这样我们就可以得到我们想要的输出。例如,用 ImageNet 训练的模型可以分类多达 1000 个对象。如果我们试图对手写数字进行分类(例如, MNIST 分类),最终得到只有 10 个神经元的最终层可能会更好。

在我们将自定义层添加到预训练模型后,我们可以使用特殊的损失函数和优化器对其进行配置,并通过额外的训练进行微调。

要获得快速转移学习教程,您可以访问下面的帖子:

[## TensorFlow Hub & Magenta 在 5 分钟内实现快速神经风格转换

利用 Magenta 的任意图像风格化网络和深度学习,将梵高的独特风格转移到照片中

towardsdatascience.com](/fast-neural-style-transfer-in-5-minutes-with-tensorflow-hub-magenta-110b60431dcc)

计算机视觉的 4 个预训练模型

下面是四个预先训练好的网络,您可以使用它们来完成计算机视觉任务,例如图像生成、神经类型转移、图像分类、图像字幕、异常检测等:

  • VGG19
  • 第三版(谷歌网)
  • ResNet50
  • 效率网

让我们一个一个地深入研究它们。

VGG-19

VGG 是一个深度为 19 层的卷积神经网络。它是由牛津大学的卡伦·西蒙扬和安德鲁·齐泽曼在 2014 年构建和训练的,你可以访问他们在 2015 年发表的论文大规模图像识别的超深度卷积网络中的所有信息。VGG-19 网络也使用来自 ImageNet 数据库的超过一百万幅图像进行训练。当然,您可以导入带有 ImageNet 训练权重的模型。这个预先训练好的网络可以对多达 1000 个对象进行分类。该网络在 224×224 像素的彩色图像上被训练。以下是关于其尺寸和性能的简要信息:

  • 大小: 549 MB
  • Top-1: 准确率:71.3%
  • **前五名:**准确率:90.0%
  • **参数个数:**143667240
  • 深度: 26

图 4。VGG-19 网络图(图由 Clifford K. Yang 和 Yufeng Zheng 在 ResearchGate 上提供)

第三版(谷歌网)

Inceptionv3 是一个具有 50 层深度的卷积神经网络。它是由谷歌构建和训练的,你可以访问论文上的所有信息,标题是“用卷积深入”。带有 ImageNet 权重的预训练版本的 Inceptionv3 可以对多达 1000 个对象进行分类。该网络的图像输入大小为 299x299 像素,大于 VGG19 网络。虽然 VGG19 在 2014 年的 ImageNet 比赛中获得亚军,但《盗梦空间》却获得了冠军。Inceptionv3 特性的简要总结如下:

  • 大小: 92 MB
  • Top-1: 准确率:77.9%
  • **前五名:**准确率:93.7%
  • **参数个数:**23851784
  • 深度: 159

图 5。Inceptionv3 网络图(图由 Masoud Mahdianpari 、 Bahram Salehi 和 Mohammad Rezaee 在 ResearchGate 上提供)

ResNet50(剩余网络)

ResNet50 是一个深度为 50 层的卷积神经网络。它是由微软在 2015 年建立和训练的,你可以在他们题为[图像识别的深度剩余学习](http://Deep Residual Learning for Image Recognition)的论文中访问模型性能结果。该模型还在来自 ImageNet 数据库的超过 100 万幅图像上进行训练。就像 VGG-19 一样,它可以分类多达 1000 个物体,网络是在 224x224 像素的彩色图像上训练的。以下是关于其尺寸和性能的简要信息:

  • 大小: 98 MB
  • Top-1: 准确率:74.9%
  • **前五名:**准确率:92.1%
  • **参数个数:**25636712

如果您将 ResNet50 与 VGG19 进行比较,您会发现 ResNet50 实际上优于 VGG19,尽管它的复杂性更低。ResNet50 经过多次改进,您还可以获得更新的版本,如 ResNet101 、 ResNet152 、 ResNet50V2 、 ResNet101V2 、 ResNet152V2 。

图 6。ResNet50 网络的图解(图由马苏德·马赫迪安帕里、巴赫拉姆·萨利希和穆罕默德·雷扎伊在研究之门上提供)

效率网

EfficientNet 是一个最先进的卷积神经网络,由谷歌在 2019 年通过论文“ EfficientNet:反思卷积神经网络的模型缩放”进行训练并向公众发布。EfficientNet (B0 到 B7)有 8 个备选实现,即使是最简单的一个,EfficientNetB0 也很出色。它拥有 530 万个参数,实现了 77.1%的顶级精度性能。

图 7。EfficientNet 模型大小与 ImageNet 精度(由 Mingxing Tan 和 Quoc V. Le 在 Arxiv 上绘制)

EfficientNetB0 功能的简要概述如下:

  • 大小: 29 MB
  • **前 1 名:**准确率:77.1%
  • 前五名:准确率:93.3%
  • 参数个数:~ 530 万
  • 深度: 159

计算机视觉问题的其他预训练模型

我们列出了四个一流的获奖卷积神经网络模型。然而,还有许多其他模式可用于迁移学习。以下是对这些模型的基准分析,这些模型都可以在 Keras 应用中找到。

表 1。预训练 CNN 模型的基准分析(作者列表)

结论

在一个我们可以轻松获得最先进的神经网络模型的世界里,试图用有限的资源建立自己的模型就像试图重新发明轮子一样。这毫无意义。

相反,尝试使用这些训练模型,考虑到您特定的计算机视觉任务,在顶部添加几个新层,然后进行训练。结果会比你从零开始建立的模型更成功。

订阅邮件列表获取完整代码

如果你想在 Google Colab 上获得完整的代码,并获得我的最新内容,请订阅邮件列表:✉️

现在就订阅

喜欢这篇文章吗?

如果你喜欢这篇文章,可以考虑看看我的其他类似文章:

[## 使用 MNIST 数据集在 10 分钟内完成图像分类

towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d) [## TensorFlow 和 VGG19 可以帮助您将照片转换成美丽的波普艺术作品

神经风格转移基于安迪沃霍尔的门罗双联画与预训练的计算机视觉网络 VGG19,转移…

towardsdatascience.com](/tensorflow-and-vgg19-can-help-you-convert-your-photos-into-beautiful-pop-art-pieces-c1abe87e7e01) [## 利用生成性对抗网络在 10 分钟内生成图像

使用无监督深度学习生成手写数字与深度卷积甘斯使用张量流和…

towardsdatascience.com](/image-generation-in-10-minutes-with-generative-adversarial-networks-c2afc56bfa3b) [## 伯特和拥抱脸 10 分钟情感分析

学习预训练的自然语言处理模型的基础,伯特,并建立一个使用 IMDB 电影评论的情感分类器…

towardsdatascience.com](/sentiment-analysis-in-10-minutes-with-bert-and-hugging-face-294e8a04b671)

每个数据科学家都应该知道的 4 个 Python AutoML 库

原文:https://towardsdatascience.com/4-python-automl-libraries-every-data-scientist-should-know-680ff5d6ad08?source=collection_archive---------6-----------------------

来源: Unsplash

让你的生活更轻松

自动机器学习,通常缩写为 AutoML,是一个新兴领域,其中建立机器学习模型以对数据建模的过程是自动化的。AutoML 有能力使建模变得更容易,更容易为每个人所接受。

如果您对查看 AutoML 感兴趣,这四个 Python 库是不错的选择。最后将提供一个比较。

1 |自动 sklearn

auto-sklearn是一个自动化的机器学习工具包,它与社区中许多人熟悉的标准sklearn接口无缝集成。随着贝叶斯优化等最新方法的使用,该库被构建为在可能的模型空间中导航,并学习推断特定配置是否将在给定任务中工作良好。

由马蒂亚斯·福雷尔等人创建的这个库的技术细节在一篇论文《高效和健壮的机器学习》中有所描述。福雷尔写道:

…我们引入了一个基于 scikit-learn 的强大的新 AutoML 系统(使用 15 个分类器、14 种特征预处理方法和 4 种数据预处理方法,产生了一个具有 110 个超参数的结构化假设空间)。

auto-sklearn也许是开始使用 AutoML 的最好的库。除了发现数据集的数据准备和模型选择,它还从在类似数据集上表现良好的模型中学习。表现最好的模型聚集在一个集合中。

来源:高效健壮的自动化机器学习,2015。图片免费分享。

在高效的实现之上,auto-sklearn需要最少的用户交互。用pip install auto-sklearn安装库。

可以使用的主要类是AutoSklearnClassifierAutoSklearnRegressor,它们分别操作分类和回归任务。两者都具有相同的用户指定参数,其中最重要的参数涉及时间约束和集合大小。

点击查看更多 AutoSklearn 文档。如果您遇到安装问题,请查看一些线程:安装 pyfyr 的问题,pyfyr的构建轮失败。

2 | TPOT

TPOT 是另一个自动化建模管道的 Python 库,更强调数据准备以及建模算法和模型超参数。它通过一种称为基于树的管道优化工具(TPOT)的基于进化树的结构来自动进行特征选择、预处理和构建,该工具可以自动设计和优化机器学习管道 (TPOT 纸)

来源:基于树的自动化数据科学管道优化工具评估,2016。图片免费分享。

程序或管道用树来表示。遗传程序选择和进化某些程序,以最大化每个自动化机器学习管道的最终结果。

正如佩德罗·多明戈斯所说,“拥有大量数据的愚蠢算法胜过拥有有限数据的聪明算法。”事实的确如此:TPOT 可以生成复杂的数据预处理管道。

潜在管道。来源: TPOT 文件。图片免费分享。

正如许多 AutoML 算法一样,TPOT 管道优化器可能需要几个小时才能产生很好的结果(除非数据集很小)。例如,你可以在 Kaggle commits 或 Google Colab 中运行这些长程序。

也许 TPOT 最好的特性是它将你的模型导出为 Python 代码文件,供以后使用。

点击查看 TPOT 文档。这个库提供了很多可定制性和深度特性。在此查看使用 TPOT 的示例,包括在没有任何深度学习的情况下,在 MNIST 数据集的子样本上实现了 98%的准确率——只有标准sklearn模型。

3 |远视

HyperOpt 是一个用于贝叶斯优化的 Python 库,由 James Bergstra 开发。该库专为大规模优化具有数百个参数的模型而设计,明确用于优化机器学习管道,并提供跨几个内核和机器扩展优化过程的选项。

我们的方法是揭示如何从超参数计算性能度量(例如,验证示例的分类准确度)的基础表达式图,超参数不仅控制如何应用各个处理步骤,甚至控制包括哪些处理步骤。 -来源: 做模型搜索的科学:视觉架构的数百维超参数优化

然而,hyperpt很难直接使用,因为它技术性很强,需要仔细指定优化程序和参数。相反,建议使用 HyperOpt-sklearn,它是 HyperOpt 的一个包装器,包含了 sklearn 库。

具体来说,HyperOpt 非常关注进入特定模型的几十个超参数,尽管它支持预处理。考虑一个 HyperOpt-sklearn 搜索的结果,该结果导致没有预处理的梯度增强分类器:

构建 HyperOpt-sklearn 模型的文档可以在这里找到。它比 auto-sklearn 要复杂得多,也比 TPOT 多一点,但是如果超参数很重要的话,这可能是值得的。

4 | AutoKeras

神经网络和深度学习明显比标准的机器学习库更强大,因此更难以自动化。

  • 使用 AutoKeras,神经架构搜索算法可以找到最佳架构,如一层中的神经元数量、层数、要合并哪些层、特定于层的参数,如过滤器大小或丢弃的神经元百分比等。搜索完成后,您可以将该模型用作普通的 TensorFlow/Keras 模型。
  • 通过使用 AutoKeras,您可以构建一个包含嵌入和空间缩减等复杂元素的模型,否则那些仍在学习深度学习的人就不太容易获得这些元素。
  • 当 AutoKeras 为您创建模型时,许多预处理(如矢量化或清理文本数据)都已为您完成并优化。
  • 启动和训练搜索需要两行代码。AutoKeras 拥有一个类似 Keras 的界面,所以根本不难记忆和使用。

凭借对文本、图像和结构化数据的支持,以及面向初学者和寻求更多技术知识的人的界面,AutoKeras 使用进化的神经架构搜索方法来为您消除困难和歧义。

尽管运行 AutoKeras 需要很长时间,但有许多用户指定的参数可用于控制运行时间、探索的模型数量、搜索空间大小等。

考虑这个使用 AutoKeras 生成的文本分类任务的架构。

点击阅读关于在结构化、图像和文本数据上使用 AutoKeras 的教程。点击查看 AutoKeras 文档。

比较—我应该使用哪一个?

  • 如果你优先考虑一个干净、简单的界面和相对快速的结果,使用auto-sklearn。另外:与sklearn的自然集成,与常用的模型和方法一起工作,对时间有很多控制。
  • 如果你优先考虑的是高精度,不考虑潜在的长训练时间,使用TPOT。强调高级预处理方法,通过将管道表示为树结构来实现。额外收获:为最佳模型输出 Python 代码。
  • 如果您优先考虑的是高精度,而不考虑潜在的长训练时间,请使用HyperOpt-sklearn。强调模型的超参数优化,这可能是也可能不是有效的,取决于数据集和算法。
  • 如果你的问题需要神经网络,使用AutoKeras(警告:不要高估它们的能力),特别是如果它以文本或图像的形式出现。训练确实需要很长时间,但是提供了广泛的措施来控制时间和搜索空间的大小。

感谢阅读!祝你一路顺风。😃

进行数据分析时要记住的 4 个问题

原文:https://towardsdatascience.com/4-questions-to-keep-in-mind-when-doing-data-analysis-be011079889a?source=collection_archive---------31-----------------------

要成为一名高效的数据分析师,应该问自己什么问题,使用什么样的工具

安德里亚斯·克拉森在 Unsplash 上拍摄的照片

动机

前几天,我意识到我开始数据分析师工作的一周年即将到来。我真的很喜欢作为一名数据分析师工作,我很幸运在工作中被真正聪明的人包围着。我的许多同事对我养成的一些好习惯产生了非常直接的影响。

我决定花些时间写下一些我学到的并融入到日常工作中的“最佳实践”。特别是,我想 1)分享我在每个项目工作时问自己的一些问题,2)说出我为什么认为基于笔记本的工作流非常适合数据分析师。这篇文章更多的是反思而不是技术,但是我希望它能帮助你更好地处理数据。

那么,好的分析有哪些关键要素呢?

弗洛里安·伯杰在 Unsplash 上拍摄的照片

根据我的经验,我发现对以下问题回答“是”有助于确保你的分析朝着好的方向前进。

  1. 分析从开始到结束是否遵循逻辑流程?
  2. 是否有清晰的解释说明做出了什么假设以及为什么?
  3. 结果呈现的整齐吗?
  4. 是否有基于结果的行动呼吁?

奖金:

  • 这种分析以后会很容易重现吗?
  • 我可以轻松地与他人分享分析结果吗?

这些问题的重要性会根据分析的背景而有所不同,但是(特别是考虑到我是在用一把大刷子画画),它们应该为你的分析打下一个非常坚实的基础。

我发现像 Jupyter 或 Rmarkdown 这样的基于代码的笔记本是创建符合上述模型的分析的好工具。能够将代码、描述性文本和输出都包含在一个地方是非常强大的。当我更详细地研究以上每个问题时,就很容易明白为什么我是这些问题的超级粉丝了😃

分析从开始到结束是否遵循逻辑流程?

我是 OSEMN(发音为“awesome”)数据分析模型的忠实粉丝。翻译过来就是Ob ain, S crub, E xplore, M odel,i N terpret。以我的经验来看,这个模型提供了一个有效的大纲,可以快速地将想法转化为可操作的结果。笔记本非常适合实现 OSEMN 模型,因为您可以为每个步骤创建一个部分,从笔记本的顶部平滑地流向底部。

是否有清晰的解释说明做出了什么假设以及为什么?

我发现笔记本对于获取擦洗步骤特别方便。使用 Rmarkdown 文件或 Rnotebooks,您可以包含直接从公司数据库中提取数据的 SQL 代码块。对于使用 Python 的 Jupyter 笔记本,我发现pyodbc模块可以用来完成同样的事情。在您收集了原始数据集之后,就可以很容易地通过您所拥有的任何必要的清理功能来运行它。在这里使用笔记本的降价功能非常方便,因为您可以详细说明如何以及为什么选择格式化数据以便进行分析。这些简短的注释在以后再次回顾分析时也会派上用场。

结果呈现的整齐吗?

斯蒂芬·道森在 Unsplash 上拍摄的照片

一旦你的数据是干净的,你就可以完成剩下的步骤数据 E 探索, M 建模,以及 i N 解释结果。笔记本很棒,因为它允许你在代码中包含你的输出(如图表、图形、数据透视表、模型系数等)。您还可以使用 markdown 来补充视觉效果,提供您希望观众了解的具体见解。

根据受众的技术水平,将代码显示在视觉效果旁边可能是好的也可能是坏的。幸运的是,笔记本也允许显示或隐藏代码的灵活性。在 Rmarkdown 中,你所要做的就是在你想要排除的代码块的头中添加include=FALSE(或者全局设置它来排除所有代码块)。在 Jupyter 中也可以进行代码隐藏,但是要简单得多。在这种情况下,我认为 Rmarkdown 有一点优势。

是否有基于结果的行动呼吁?

杰米·坦普尔顿在 Unsplash 上拍摄的照片

在我看来,这个问题经常被忽视,但是它确实区分了一个好的分析师和一个伟大的分析师。一个好的分析师可以快速处理数字,并将数据转化为可解释的东西,但一个伟大的分析师会采取额外的步骤,解释数据应该如何用于推动特定的商业决策。分析师通常不会对更大的商业决策做出最终决定。通常,他们的工作会交给发号施令的经理和主管。然而,由于分析师是接触数据最多的人,他们绝对不应该仅仅是把一个基本的幻灯片和一些图表交给他们的经理,然后就完事了。我真的相信分析师可以在工作场所产生比现在更大的影响。

N 如何回答奖金问题!这才是笔记本在我看来真正出彩的地方。

这种分析以后会很容易重现吗?

我感觉更多的时候,分析师会在某个时候被要求重温以前的分析,以验证以前的结果是否仍然保持一致,或者查看结果可能发生了什么变化。仅仅因为这个原因,就很难反驳笔记本。我发现能够打开一个旧的笔记本文件并重新运行它以获得更新的结果是一个不可思议的时间节省。它还保证您从第一次开始就保持所有相同的假设和数据清理过程。如果没有别的,这肯定比从旧的电子表格中复制公式和过滤器,然后重新创建所有重要的表格和图像要好(从经验上来说)。

我可以轻松地与他人分享分析结果吗?

用笔记本,绝对!鉴于整个分析包含在一个文件中,很容易与人分享。对于那些计算机上没有安装 R 或 python 的用户,结果可以输出到 pdf 或 HTML 文件。

结论

这绝不是数据分析最佳实践的详尽或权威列表。相反,它只是我发现有用的基本原则的汇编。鉴于我的经验非常有限,我很想听听你对数据分析的“最佳实践”有什么想法。欢迎在 LinkedIn 上与我联系,或者在评论中留下你的想法。感谢阅读!

AI/ML 不是新 SaaS 的 4 个理由?

原文:https://towardsdatascience.com/4-reasons-why-ai-ml-is-not-the-new-saas-834d436eebcf?source=collection_archive---------44-----------------------

人工智能被预测为云计算的顶级领域之一。然而,AIaaS 和 SaaS 有着天壤之别。

Denys Nevozhai 在 Unsplash 上拍摄的照片

*大家好,我将运行几个“远程人工智能/人工智能智囊团”,让人工智能/人工智能领域的人们交流思想并保持联系。如果你有兴趣,在这里注册以获得更多信息。

根据最近的 Gartner 调查,超过 40%的公司计划在今年年底部署人工智能解决方案。然而,高昂的基础设施成本和对 AI/ML 专业知识的需求让大多数组织望而生畏。这就是为什么 AIaaS (AI 即服务)或 MLaaS 开始出现的原因。

超过 40%的公司计划在今年年底部署人工智能解决方案— Gartner 。

由 Salesforce 推广的 SaaS 指的是一种授权模式,在这种模式下,软件被集中托管,供客户通过浏览器访问。SaaS 公司有时也会提供免费试用(免费增值)来鼓励采用。

不断增加的收入和不断降低的成本使得 SaaS 的商业模式更加可预测、有利可图和可扩展。因此,对于创业者和投资者来说,它都成为了一种极具吸引力的模式。

自 2004 年 Salesforce 上市以来,SaaS 已有 70 多家公司上市。平均而言,SaaS 公司的表现明显优于市场。SaaS 公司往往有更高的毛利润和更低的 R&D 费用,因为他们不需要支持多个版本或技术栈。

同样,AIaaS 允许公司利用现成的人工智能解决方案,而不是从头开始建立自己的团队和基础设施。AIaaS 通过最小化前期投资为用户提供了更好的可扩展性和灵活性。

人工智能将从 2019 年到 2023 年增加 5X。

人工智能爱好者还预计,AIaaS 商业模式可以帮助推动采用和盈利。Gartner 预测,从 2019 年到 2023 年,基于云的人工智能将增加 5X,这似乎证实了这一趋势。

从亚马逊和微软等科技巨头到初创公司,许多公司都开始提供 AIaaS,包括聊天机器人、数字助理、认知 API 和机器学习框架。利用这些服务可以简化复杂的过程,减轻部署人工智能的计算负担。

AIaaS 似乎是解决你所有问题的灵丹妙药。它实现了快速和节省成本的人工智能部署,因此公司不需要依赖目前到处都缺乏的内部人工智能专家。将模型托管在云中,这样它们可以利用更多的数据不断改进,这也带来了 ML 的最大好处。

然而,现实是,部署 AIaaS 比部署 SaaS 面临更多的挑战。原因如下。

比“垃圾进,垃圾出”更糟糕的是什么

在计算机科学中,垃圾输入,垃圾输出(或 GIGO)意味着即使有一个有效的系统,它的输出也只能和输入的信息一样好。这个概念似乎适用于 ML。没有高质量的数据,模型不会有好的表现。然而,这个概念几乎没有抓住 ML 中质量数据问题的严重性。

ML 模型从训练数据中学习,而不是被显式编程来执行任务。学习过程需要严格控制。训练集中的坏数据会污染整个结果池。即使您之后使用良好的数据训练模型,性能也可能无法恢复。这就像教育一样:我们不能简单地忘记我们被教导的东西。有缺陷的输入不仅会产生无意义的输出,还会破坏模型。

模糊线

AIaaS 依赖客户提供培训数据。但是客户并不总是知道如何生成合适的数据集。当系统表现不佳时,他们倾向于责怪模型。人工智能公司需要花大量时间教育用户并与用户一起工作,以建立数据管道并确保高质量的数据。

事实上,公司花费超过 80%的时间在数据工程上。即使有客户培训,AI 公司仍然需要(手动)验证所有来自客户的输入数据,以确保数据完整性。这就是 AIaaS 与 SaaS 显著不同的原因。

ML 模糊了客户和 ML 提供者之间的界限,使性能成为共同的责任。这不再是一个明确的 API 调用了。如果模型表现不佳,数据和模型一样难辞其咎。

水下藏着什么?

正如我在上一篇文章中提到的,模特培训只是冰山一角。大多数公司没有考虑到的是获取、清理、存储、聚合和标记数据集以及构建基础设施的隐性成本。

这就是为什么免费增值模式对人工智能初创公司不起作用,因为即使是 PoC(概念证明)也需要大量的数据收集和培训来证明价值。如上所述,这超过了工作的 80%。

SaaS 模式的美妙之处在于它的可扩展性和不断降低的成本,这并不真正适用于 ML。模型训练和推理都需要大量的计算。持续训练给计算带来更多挑战,进一步增加成本。

处理边缘案件

ML 并不完美。它可以帮助我们自动化大多数重复的任务,但几乎总是有需要人工干预的边缘情况。随着越来越多的 ML 系统在现场部署,我们看到越来越多的公司专注于鲁棒性指标,以最大限度地减少人为干预。

然而,至少在不久的将来,人类仍然被要求处于循环中。即使有正确设计的移交过程和接口,它仍然会影响整体的可伸缩性。

许多研究人员一直在解决 ML 的一般性问题。迁移学习和元学习取得了很大进展。然而,在我们能够完全解决通用性之前,可扩展性仍然是(狭义)人工智能的一个关键问题。我们必须仔细选择用例,并尽可能地专注于标准产品。

我们连线吧!如果你喜欢读这篇文章,请在这里订阅我的个人博客!

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于打造人工智能定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于 ML、机器人和产品管理的文章。跟着她到这里 。

我选择 Plotly 作为我的主要可视化库的 4 个原因

原文:https://towardsdatascience.com/4-reasons-why-im-choosing-plotly-as-the-main-visualization-library-dc4a961a402f?source=collection_archive---------11-----------------------

把你的想象带到 21 世纪

选择一个完美的数据可视化平台可能很难,因为这在很大程度上取决于你最擅长哪种编程语言,或者你是否愿意使用编程语言来进行可视化——因为这不是强制性的。

在一个有如此多优秀绘图库的世界里——特别是对于 JavaScript 用户——今天我将向你解释为什么我选择了 Plotly 而不是其他任何东西。

这可能不是你会同意的事情,但是给我几分钟时间来通读这些论点——这是值得的。

在开始之前,我只想说,我没有以任何方式,形状或形式与 Plotly 背后的开发人员有任何关系,也没有参与开发。这篇文章纯粹基于的个人经验,旨在帮助你为你的项目选择一个完美的可视化库。

话虽如此,让我们进入你在这里的原因。

#1.是 Python

现在,只有当你已经了解 Python 时,你才会认为这是一个好处——但是既然你正在阅读一个数据科学博客,我想你也是。

Python 的语法清晰、干净、易于使用,Plotly 也不例外。看看生成一个简单的气泡图需要多少代码:

import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=[1, 2, 3, 4],y=[10, 11, 12, 13],mode=’markers’,marker=dict(size=[40, 60, 80, 100],color=[0, 1, 2, 3])
))
fig.show()

运行此代码将生成一个视觉上吸引人的图表,如下所示:

来自文档

众所周知,我是 Python 语法的粉丝,但如果你不是,你仍然可以将 Plotly 与 RJavaScript 一起使用。然而,让我们继续下一点。

#2.它是互动的

如果您遵循了第一点并执行了所提供的代码,那么您已经意识到 Plotly 中的可视化是交互式的。

照片由 Isaac Smith 在 Unsplash 上拍摄

如果您来自 JavaScript 背景,这可能对您来说不是一件大事,但是对于来自 Python 的任何人来说都是一件大事。通过Matplotlib制作的可视化效果不是交互式的,默认情况下看起来比 Plotly 的可视化效果差很多。

你不需要指定你希望你的图表是交互式的,但是你可以调整鼠标悬停时的可见性。

在后面的文章中会有更多的介绍,在这个 Plotly 系列中还会有更多的介绍。

#3.清晰语法

您的 Plotly 图表将有一个Figure对象,填充有:

  • Data对象
  • Layout对象

正如您可能想到的,您将把制作图表的数据放在data中,在layout中,您将指定图表应该是什么样子。让我们看一个例子。

先来做几个进口:

import numpy as np
np.random.seed(42)
import plotly.offline as pyo
import plotly.graph_objs as go

现在让我们定义将进入图表的数据:

x = np.random.randint(1, 101, 100)
y = np.random.randint(1, 101, 100)data = [go.Scatter(x=x,y=y,mode='markers',
)]

就是这样。这将根据 x 轴和 y 轴上的随机整数创建散点图。现在让我们定义布局:

layout = go.Layout(title=’Plot title’,xaxis=dict(title=’X-Axis’),yaxis=dict(title=’Y-Axis’),hovermode=’closest’
)

现在让我们把所有的东西都放到一个Figure对象中,然后绘制它:

fig = go.Figure(data=data, layout=layout)
pyo.plot(fig)

如果你问我,这是数据可视化所能做到的最干净的了。如果您将这段代码放入一个单独的.py脚本中并运行它,可视化将被保存为一个html文件并自动在您的浏览器中打开:

不算太差,但是我们将在下面的文章中更深入地探讨样式。

#4.仪表板

如果你知道一些基本的 HTML 和 CSS,那么将多个图表合并到一个单一的、好看的仪表板中是非常容易的。

卡洛斯·穆扎在 Unsplash 上的照片

Plotly 图表可以与Dash整合,这是一个构建网络应用的框架。

这里有一段来自官方文档:

Dash 基于 Flask、Plotly.js 和 React.js 编写,非常适合用纯 Python 构建具有高度自定义用户界面的数据可视化应用程序。它特别适合任何使用 Python 处理数据的人。

这个React部分将把你的应用程序转变成一个单页应用程序,这意味着点击内容时不会有那些尴尬的刷新。所有这些都是在不了解任何网络开发的情况下完成的。太棒了。

我们现在不会深入仪表板开发,但是以后很少有文章会深入讨论它。

如果你迫不及待地想看看用Dash能制作出什么,这里有官方的图库:

[## Dash 企业

Dash 企业

dash enterprise dash-gallery . plot ly . host](https://dash-gallery.plotly.host/Portal/)

在你走之前

我对查看表格数据非常满意。但是我工作的很大一部分是向他人展示调查结果和结论,每次展示图表都是一种有效得多的方法。

在接下来的一个月左右的时间里,我决定发表 10 篇左右的文章,这些文章将从上到下地详细介绍,确保数据可视化不会成为你未来痛苦的过程。

感谢阅读,敬请关注。

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

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

你不应该成为数据科学家的 4 个理由

原文:https://towardsdatascience.com/4-reasons-why-you-shouldnt-be-a-data-scientist-e3cc6c1d50e?source=collection_archive---------1-----------------------

为什么数据科学工作可能不适合你

克里斯蒂安·埃尔富特在 Unsplash 上拍摄的照片

我相信你们大多数人都看过 HBR 的文章,“数据科学家:21 世纪最性感的工作”,他们不是唯一声称数据科学是所有工作的圣杯的人。

许多人似乎有这样一种错误的观念,即数据科学家的工作只包括日夜构建这些革命性的、复杂的、有影响力的机器学习模型,这是完全不正确的。

当你们中的许多人在寻找适合自己兴趣的职业时,或者对于那些正在寻找职业转换的人来说,你可能已经考虑过成为一名数据科学家。由于你可能只听说过数据科学的好的方面,我将给出数据科学工作不适合你的 4 个原因。

让我们开始吧!

1.你不喜欢在职业生涯中不断学习的想法。

数据科学是一个非常宽泛的术语,这意味着它对不同的公司意味着不同的东西,因此,不同的公司需要不同的技能组合。例如,一些公司需要机器学习知识,另一些公司需要实验设计和 A/B 测试,一些公司需要 Python 程序员,还有一些公司需要 R 程序员,等等。因此,你在一家公司发展的技能不一定能让你走完整个职业生涯。

最重要的是,数据科学是一项多学科的工作。人们期望你在编程、统计、数学、商业理解等方面有一定的知识水平,这意味着你在这些领域中的某一个领域总会有发展的空间。

最后,像科技中的一切一样,数据科学也在不断发展。例如,TensorFlow 是在 2015 年才创建的,现在,它是最受欢迎的技能之一。随着新技术的产生和不断完善,你也应该学习新技术。

2.你不喜欢“肮脏的工作”。

从事像构建机器学习模型这样有趣的工作只占数据科学家工作的一小部分——我认为不到一个人时间的 25%。

您的大量时间很可能会花在理解数据、数据来自哪里以及数据是如何被操纵的)以及准备数据(EDA、数据争论、特征工程等)上。).如果你没有开发一个好模型所需的数据,你将不得不开发管道来获得你需要的数据。

原因很简单。模型的性能受到用于创建模型的数据质量的限制。

“垃圾进,垃圾出。”

因此,如果你不愿意做“脏活”来研究机器学习模型,那么数据科学可能不是最好的选择。

3.你不喜欢与商业利益相关者持续谈判、沟通和教育的想法。

你必须会谈判。

作为数据科学家,你既是数据科学家,也是销售代表:

  • 你必须向商业利益相关者推销你的想法和新的数据科学计划。
  • 你也可能是那个不得不争取额外资源的人,比如新技术、更多劳动力、更多存储等等。
  • 最后,您可能会发现自己不得不在时间和完美之间进行权衡——在某些情况下,您可能需要额外的一两周时间来提高模型的准确性,而您的业务利益相关者可能看不到增量改进的价值。

你必须是一个好的沟通者和教育者。

通常情况下,你会和那些不了解技术,也不了解你正在做的项目的利益相关者一起工作。因此,你的工作是以员工和利益相关者易于理解的方式沟通和教育他们。

同样,你还需要将你的数据科学项目分解成步骤。商业利益相关者关心进展,他们希望看到项目如何随着时间的推移而改进,而不是等待 5 个月的最终结果。因此,你有责任传达你的进展和结果。

4.你不认为自己是一个足智多谋的人。

说到数据科学,没有太多的牵手。在一天结束时完成工作是你的责任,如果你发现自己陷入困境,你需要随机应变,找到问题的答案。

如果你需要了解 XGBoost 是如何工作的,或者如何构建一个 API,你需要随机应变,观看 YouTube 视频,阅读文档,或者参加一个训练营。

此外,您还必须主动安排与相关利益相关者的会议,以了解更多关于业务问题、预期结果和相关指标的信息。

如果你不是那种足智多谋、积极主动、坚持不懈的人,那么数据科学可能不适合你。

感谢阅读!

虽然这是一篇固执己见的文章,但我希望这能对数据科学有所启发。在一天结束的时候,我仍然认为利远大于弊,但我认为这些都是值得思考和考虑的好点子。一如既往,我祝你在努力中好运!

不确定接下来要读什么?我为你挑选了另一篇文章:

[## 开始学习数据科学时,我希望知道的 5 件事

到目前为止,我在数据科学之旅中学到的见解

towardsdatascience.com](/5-things-i-wish-i-knew-when-i-started-learning-data-science-24d6f9a2d1e0)

特伦斯·申

  • 如果你喜欢这个, 在 Medium 上关注我 获取更多
  • 关注我的Kaggle了解更多内容!
  • 想要合作?让我们连线上LinkedIn
  • 查看 我的免费数据科学资源 每周有新素材!

你永远无法完成在线数据科学课程的 4 个原因

原文:https://towardsdatascience.com/4-reasons-you-never-end-up-completing-those-online-data-science-courses-6b636669dab1?source=collection_archive---------54-----------------------

这可能既不是你的自律,也不是你对这个主题的天赋。这可能会阻碍您的数据科学学习!

威廉·艾文在 Unsplash 上的照片

还记得您开始学习数据科学课程但从未完成的时候吗?或者上百次你做了完全相同的事情,但是用了你认为更“完美匹配”的课程,或者像数据科学家喜欢说的那样“更性感”?

不要慌!我们都经历过!不,这可能不是你的自律,也不是你对这个主题的天赋。

以下四个原因可能会阻止你完成在线课程并获得证书:

  1. 信息超载!信息过载!信息过载!

让我们现实一点,外面有大量的在线课程、数据科学课程、YouTube 视频、会议、播客和书籍,这可能会让人不知所措。几乎不可能知道从哪里开始最好!即使你做了,你也总是问自己:“我做了正确的决定吗?”,“这个课程对我来说是最好的吗?”当然还有价值百万的问题“我应该继续吗?”。

对于初学者,我有一个建议:一头扎进学习过程,不要想太多!如果你正在开始一个由知名大学、组织或公司提供的在线课程,你将有机会向该领域的专家学习基础知识。这总是一件好事。不要想太多。把基本的记下来。练习。练习。练习。继续前进。

如果你已经有了基础知识,请继续阅读!

2.归零地和“无聊”基础

照片由 Ethan Hu 在 Unsplash 上拍摄

一旦你掌握了基础知识,你自然会想把你的技能提升一个档次。所以你开始了另一门课程…只是在取得进展几分钟/几小时后就放弃了。

为什么会这样?

其实很简单。大多数课程是以线性方式设计的,因此最初的几个视频/讲座/章节侧重于确保学习者在引入更复杂的想法和概念之前已经掌握了先决技术。

但是你已经掌握了这些基础知识!你第一百次想听到的最后一件事是 Python 如何处理不同的数据类型!这些你已经知道了!

你很无聊。你关闭标签。剩下的就是历史了。

每次你开始一门新课程都从零开始并不是最好的方法。你需要不断接受挑战。我的两点意见是,如果你已经知道了,跳过它!接受挑战,不断学习新东西。每次你开始一门新的 Python 课程,你都不需要重新学习什么是变量或者 Python 如何存储变量!

3.信息的价值大大降低——行动的价值更大!

让我们面对现实吧。你在过去已经完成了一两门课程,你厌倦了让自己超负荷地学习更多的信息,却在一两个星期后忘记了如何使用它们。

在 2020 年,“知道”是远远不够的。反正要知道的东西太多了。用信息淹没你的“学习自我”可能是阻止你的原因。

你开始了一门新课程,但是你渴望应用你在以前的课程中学到的东西。被动地吸收新信息在这一点上只会让你厌烦。

马上停下来!拿起一个探索你感兴趣的主题的数据集,把你能记住的所有可能适用的东西应用到这个数据集上。此刻,你的数据科学技能有多基础或多高级并不重要。通过这样做,通过“现实核查”你实际上知道如何应用而不是你实际上知道什么,你可能会学到更多。

不要害怕独自面对数据集!犯错误,陷入困境,谷歌搜索,找到例子,从中学习,使它们更好,应用它们。重新开始,并申请更多!

4.你已经知道的和你需要知道的

这是一个有用的提示/练习,而不是你没有完成在线课程的原因。但是我觉得很有帮助!

照片由 Tachina Lee 在 Unsplash 上拍摄

找一张白纸。拿支笔。独自坐在办公桌前。关闭所有笔记本和书籍。在这个练习过程中,远离你的手机和笔记本电脑。

现在将这张纸分成 5 栏:统计学、Python 编程(或者你选择的另一种数据科学语言——你可以将它分成其他栏,也可以按库划分,如 pandas、Numpy、Matplotlib、Seaborn……)、机器学习、深度学习、数据技术(Tableau、Power BI、Spark 或者你试图添加到你的数据仓库中的任何东西!)

在每一栏中,记下你最近几周知道/学到的所有概念。想一想在这些类别中你能做的每一件事。把它写下来,同时思考你将如何实际应用它,它应该应用在哪里,在什么约束下。

看看你的单子!在你做这个练习的特定时刻,你现在才意识到自己的优势和劣势。这个列表告诉你确切的你已经知道的和适合应用的东西。这些应该是你已经知道如何和在哪里使用的东西。

这个列表缺少的是你还不知道的东西。从那里开始!挑选一本著名的数据科学书籍(网上有很多好的推荐)并查看目录!采取小步骤,逐一解决所有缺失的概念和技术。

每隔一周重做以上练习!这将帮助你现实地检查你的进步和什么是最重要的:也就是说,你知道如何应用和使用什么,而不是你在两年前的课程中学到的,但不知道如何或在哪里正确有效地使用。

我希望这有助于您重拾数据科学知识!祝你学习好运,记得确保并记住这个过程其实很有趣!

为数据科学面试做准备的 4 种资源

原文:https://towardsdatascience.com/4-resources-to-prepare-for-your-data-science-interviews-f73847fc70e?source=collection_archive---------39-----------------------

帮助您准备数据科学面试的在线资源

韦斯·希克斯在 Unsplash 上的照片

只是一点点关于我的旅程!我已经在数据科学领域工作了大约 10 年。我做过各种形式的数据科学家,比如商业分析、增长分析、营销分析和营销科学。这些天来,虽然我更倾向于产品,但我仍然定期采访数据科学家。

多年来,我收集了 4 个在线资源,它们总能帮助我准备数据科学面试。我想与你分享它们。

如果你更喜欢看内容而不是阅读,这里有视频。

数据科学面试技巧

首先,我们来了解一下数据科学的面试形式。

数据科学面试的形式

数据科学面试技巧的第一件事也是其中之一是了解面试中将涉及的不同类型的主题。

数据科学面试通常会涉及几个不同的主题。招聘人员应该告诉你面试会涉及哪些话题,面试的形式会是怎样的。

例如,你的第一次技术面试可能是通过视频会议。因此,你将与面试官共享一个屏幕,在那里你可以写并向他们展示你的代码。然后你的第二次面试可能是面对面的,你会遇到几个数据科学家,你会通过四到五个不同的面试官,涵盖四到五个不同的主题。了解所有这些话题是很重要的,这样你就可以做好充分的准备,在面试中取得成功。

数据科学面试中涵盖的四个主题

在很大程度上,数据科学访谈涵盖了四个主题。

  1. 编码
  2. 产品意识/商业案例
  3. 统计和概率
  4. 建模技术

第一个是编码。然后是产品意识或商业案例。第三个是统计学,也包括概率和基本定理。最后一个主题可能是建模,包括随机森林、梯度推进、K-means 聚类和其他几种常见的模型。

选择学习资源时要考虑的两件事

现在,我们已经介绍了这四个主题,并且知道了数据科学面试将涵盖的内容,是时候为面试做最后的准备了。

我在资源中寻找两样东西:

  1. 很多练习题
  2. 真实面试中的真实问题

我想尽可能多地练习一些问题,以强化面试中会涉及到的所有概念。第二件事是与面试和公司非常相关的练习题和面试问题。这就是我要找的。过去在面试中被问到的真正的问题,这就是我想要得到的。

马库斯·斯皮斯克在 Unsplash 上的照片

为数据科学面试做准备的四种在线资源

以下是我过去用来准备数据科学面试的四个在线资源。最后,我将向大家介绍一个额外的第五个。

1.作为学习平台的 Glassdoor

第一个在线资源是 Glassdoor。当我准备数据科学面试时,这是我最喜欢使用的平台之一。

上面的图像是玻璃门。我在脸书输入,从菜单中选择采访。如果我们向下滚动到页面的中间,我们会看到脸书不同职位的面试问题。当我们向下滚动时,我们会看到数据科学家、前端工程师、iOS 开发人员、软件工程师等职位。但是你也可以找到很多数据科学的面试问题。我喜欢的是,这些问题是在脸书数据科学面试中被问到的真实问题。他们尽可能的真实。

我真正喜欢的第二件事是,这些问题涵盖了我们上面讨论的所有主题。我做的另一件事是,如果我准备参加脸书大学的数据科学面试,除了在脸书输入和查看所有问题外,我还会搜索与脸书处于同一行业的其他公司。如果我更关心社交媒体公司,我可能会输入 Snapchat 或抖音。如果我想扩大一点范围,我可能会输入科技领域的其他公司。所以谷歌可能是另一个,LinkedIn 可能是另一个。所以你可以从 Glassdoor 获得许多面试问题和答案。

2.Brilliant.org 统计与概率奖

现在让我们来看看统计和概率。我用过一个叫 brilliant.org 的网站。它实际上是一个数学网站。他们还涵盖其他类型的主题,如计算机编程,计算机科学,定量金融等。但是我用这个来复习我的统计和概率。这也是脸书招聘人员推荐的一个网站,以获得统计和概率方面的额外实践。

在这个网站上,我从上面的菜单进入练习部分。有很多可以选择的。但我最关心的是概率选择,如下图所示。

如果我们去概率部分,我们有基本面和赌场概率。基本上,我想尽我所能去尝试。当我或多或少地钻研这些实践问题时,我就会知道它们是否会成为数据科学面试的一部分。

在 Brilliant 网站上,我推荐几个部分——概率、随机变量、统计测试和分布。

交叉检查你是否应该做这些问题的一个好方法是先上 Glassdoor。阅读那里的一些统计问题,然后看看这些概念是否能在 Brilliant 上找到。

这是我推荐的。这是提高你的统计和概率的在线资源。

3.学习建模技术的多种资源

现在,我们将检查专门用于建模机器学习模型的在线资源。我不一定要去一个地方学习机器学习模型或温习这些概念。

在面试中,我看到建模问题以两种方式出现:

  1. 理论
  2. 模型在项目中的应用

第一种方式是理论题。第二种方式是当你谈论你的项目时。他们间接地或直接地询问您关于您在那些项目中使用和实现的模型。

1。理论

您可以获得关于特定模型的问题,如随机森林、梯度增强、k-means 聚类,以及关于模型本身的问题。

你可能会问这样的问题:

你为什么会想使用这种模式?
您为什么不想使用这种模式?
如何用代码实现这个模型?
如何阅读这个模型的结果解读结果?

这些是你在建模时会遇到的大多数理论问题。

2。模型在项目中的应用

你可以谈论一个使用这些模型的项目。面试官可以越来越深入地挖掘项目本身和模型本身,并问你为什么选择该模型,或者你在开发模型时有哪些假设。

重点是,你需要了解关于机器学习模型的理论。你不需要知道所有的机器学习模型,只需要知道常见的模型。

我使用的一些在线资源:

我倾向于大量阅读博客。而'*走向数据科学'*是我经常去的一个热门网站。他们有很多关于机器学习模型的博客文章。

除了阅读这些博客文章来重温我的机器学习理论和理解之外,我还会尽可能多地去 YouTube 观看视频。我推荐几个频道,比如'*' simpli learn '*和一个新人' Data Professor' 。他们经常谈论机器学习模型、理论和应用,这很重要。

除了关注其中的一些渠道,我还搜索机器学习模型,尽可能多地获取视频。

4.面试编码部分的 LeetCode

面试的编码部分,我以前用的在线平台叫' LeetCode' 。这实质上是一个为计算机科学家和软件开发人员准备面试而开发的平台。但是他们有一个很好的小数据库部分,在那里你可以练习你的 SQL。

如果你点击任何一个话题,你会看到一个练习题,你可以输入 SQL 代码,执行代码,它会输出一些东西。这是一个成熟的工作空间,也是一个实践 MySQL 查询的 IDE。

我喜欢这个平台的一点是,它有成百上千的练习 SQL 问题。我真的很擅长为面试本身提高我的 SQL 和编码技能。

我想对 LeetCode 说的一个缺点是,它是为软件开发人员量身定制的。这个平台上的许多问题只是帮助你更好地使用 SQL,但他们不会问数据科学类型的问题来处理数据。因此,我会去 Glassdoor,尝试为我面试的公司找到一些编码问题,然后了解这些编码问题中涵盖了哪些数据科学概念。如果我只是想练习 SQL,我会去 LeetCode,试着回答尽可能多的问题。

5.奖金— StrataScratch 为数据科学面试做准备

这是我在开始时向你们承诺的第五个在线资源:这是“StrataScratch”。这是一个为实现一件事而设计和构建的平台;帮助数据科学家准备面试。

这是一个为数据科学家搭建的平台。它将我之前提到的四种在线资源的最佳部分整合到一个平台中。

在 StrataScratch 上,我们有编码问题,您可以根据公司选择问题。您还可以根据您更熟悉 SQL 还是 Python 来选择问题。如果你想点击其中一个,你有问题,有提示,你可以看到解决方案以及其他用户的解决方案。

这些问题是来自数据科学面试的真实问题。你可以确定你所做的直接映射到数据科学面试。

现在,如果你去非编码问题,你有不同问题类型的技术问题。

你有概率、商业案例、产品感觉类型的问题、建模问题、统计、各种技术问题和系统设计,以及许多其他将在数据科学面试中测试的概念。

如果你点击这些问题中的一个,你会得到这个问题,一个能够评论和提供你的解决方案的编辑器,然后你会看到其他用户和他们的解决方案。

跨越编码和非编码问题,实际上 StrataScratch 上有超过一千个面试问题,这些问题是从真实的公司中提取出来供你练习的。

这是帮助你准备数据科学面试的五个在线平台。希望这有帮助。

最初发表于T5【https://www.stratascratch.com】

每个数据科学家都应该知道的 4 个简单技巧。

原文:https://towardsdatascience.com/4-simple-hacks-every-data-scientist-should-know-45928b3dda37?source=collection_archive---------52-----------------------

机器学习技巧/窍门

这些技巧肯定会在任何项目中节省你的时间,并提高你的工作效率。

照片由🇸🇮·扬科·菲利在 Unsplash 上拍摄

T 通过这篇文章,我们将了解一些简单的技巧,它们可以真正提高您的机器学习、人工智能或数据科学项目的生产率。📔

希望你喜欢!!😊

1。树木的可视化

在使用任何机器学习模型时,我们只知道哪个模型将适合数据集来解决特定问题,并且基于数据集,我们通过一些数学/逻辑推理来设置模型的参数。该模型工作完全正常,符合目的。但是没人关心黑盒里有什么。听起来没那么吸引人,对吧?对于任何一个树模型来说都不是。让我们看看如何可视化黑盒。

我们将导入一些必要的库来设置我们自己的任务!

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,plot_tree
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

为此,我们将使用著名的葡萄酒数据集。将数据集加载到 Pandas 数据框中,并分离为预测变量和响应变量。

wine=load_wine()df = pd.DataFrame(data= np.c_[wine['data'], wine['target']],columns= wine['feature_names'] + ['target'])X = df.drop('target',axis=1)
y = df["target"]features = df.columns[:-1].values.tolist()

将数据分成训练集和测试集,选择适当的模型并拟合该模型。

X_train, X_test, y_train, y_test = train_test_split(X, y,random_state = 2020)model = DecisionTreeClassifier()distinguish between two thingsmodel.fit(X_train, y_train)

我们将使用 sklearn 的库。(导入 sklearn.tree.plot_tree )

plt.figure(figsize = (20, 10))
plot_tree(model, feature_names = features, filled = True)

来源:我的谷歌 Colab 笔记本

它告诉我们关于样本(元组的数量)、每个节点中的特征、节点的数量、我们制作树的标准(这里,默认情况下,我们使用基尼指数)。

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

**2。**在单个图中绘制 ROC 曲线

ROC ( 受试者操作特征)曲线告诉我们该模型在将班级分成两个或更多个班级方面有多好。更好的模型可以准确地区分两者或更多。然而,一个差的模型将很难在两者之间进行分离。更多细节请参考文章。

导入一些必需的库

from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_roc_curve
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer

为此,我们将使用乳腺癌数据集。将数据集加载到 Pandas 数据框中,并分离为预测变量和响应变量。

db=load_breast_cancer()
df = pd.DataFrame(data= np.c_[db['data'], db['target']])df=df.rename(columns={30:'target'})X = df.drop('target',axis=1)
y = df['target']

将数据分成训练集和测试集,选择适当的模型并拟合该模型。

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)dt = DecisionTreeClassifier()
rf = RandomForestClassifier()dt.fit(X_train, y_train)
rf.fit(X_train, y_train)

使用sk learn . metrics . plot _ roc _ curve库显示图形。

disp = plot_roc_curve(dt, X_test, y_test)
plot_roc_curve(rf, X_test, y_test, ax = disp.ax_)

来源:我的谷歌 Colab 笔记本

我们可以看到两个分类器之间的 ROC 曲线以及 AUC 分数。随机森林分类器的 AUC 大于决策树分类器,因此随机森林分类器比决策树分类器更合适。

更多细节和示例请参考文档。

3。修剪决策树

当在某些数据集上训练决策树时,我们经常过度拟合训练集,因此我们的模型在测试集上的精度较低。这个问题可以通过修剪树的方法来解决。这种修剪过的树比没有修剪过的树表现更好。有不同的方法可以用来修剪树木。它们是后剪枝、前剪枝、成本复杂性剪枝,我们将对我们的模型使用成本复杂性剪枝。

DecisionTreeClassifier 提供了各种参数来防止树过度拟合。其中一个是成本复杂度参数,CCP _ 阿尔法CCP _ 阿尔法 的值越大,修剪的节点数越多。这里我们只展示了CCP _ 阿尔法 对正则化树的影响,以及如何根据验证分数选择一个CCP _ 阿尔法

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancerdb=load_breast_cancer()df = pd.DataFrame(data= np.c_[db['data'], db['target']])df=df.rename(columns={30:'target'})X = df.drop('target',axis=1)
y = df['target']

型号 1。(此处 Random_state 是为了再现性)

model = DecisionTreeClassifier(random_state = 2020)model.fit(X, y)score = cross_val_score(model, X, y, scoring = "accuracy")
print("Model 1 has {} nodes and score is {}".format(model.tree_.node_count, score.mean()))

型号 2 的CCP _ 阿尔法 值等于 0.01

model = DecisionTreeClassifier(ccp_alpha = 0.01, random_state = 2020)model.fit(X, y)score = cross_val_score(model, X, y, scoring = "accuracy")
print("Model 2 has {} nodes and score is {}".format(model.tree_.node_count, score.mean()))

来源:我的谷歌 Colab 笔记本

注意,分数上升了。修剪树木有很多好处,主要的好处是减少过度修剪。

更多细节和示例,请参考文档。

4.情节混乱矩阵

来源

混淆矩阵,名字本身就包含了混淆在里面。为什么会这样呢?第一次理解时,这个问题的答案似乎令人困惑,但一旦你理解了,它肯定会帮助你对你的模型做出一个富有成效的决定。更多细节请参考文章。

注意:-在任何其他来源中,混淆矩阵的表示可以不同。

导入一些必要的库

from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_digits

为此,我们将使用数字数据集。将数据集加载到 Pandas 数据框中,并分离为预测变量和响应变量。

db=load_digits()df = pd.DataFrame(data= np.c_[db['data'], db['target']])df=df.rename(columns={64:'target'})X = df.drop('target',axis=1)y = df['target']

将数据分成训练集和测试集,选择适当的模型并拟合该模型。

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)model = LogisticRegression(random_state = 2020)model.fit(X_train, y_train)disp = plot_confusion_matrix(model, X_test, y_test, cmap = "Blues")

来源:我的谷歌 Colab 笔记本

更多细节和示例请参考文档。

我相信这个技巧对你会有用,你会从这篇文章中有所收获。直到那时快乐编码!。

当 Pandas 失败时,将 Word 和 PDF 数据导入 Python 的 4 种简单方法

原文:https://towardsdatascience.com/4-simple-ways-to-import-word-and-pdf-files-into-python-when-pandas-fails-43cf81599461?source=collection_archive---------14-----------------------

导入非结构化文本/图像数据的实用指南

作为数据科学/分析团队的一员,您可能会遇到许多要在 Python 中导入和分析的文件类型。在理想世界中,我们所有的数据都驻留在基于云的数据库(例如 SQL、NoSQL)中,这些数据库易于查询和提取。然而,在现实世界中,我们很少得到整洁的表格数据。此外,如果我们需要额外的数据(结构化或非结构化的)来增强分析,我们将不可避免地使用不同格式的原始数据文件。

照片由 Pexels 的 Skitterphoto 拍摄

最近,我的团队开始了一个项目,作为第一步,包括将原始数据文件整合成格式。csv,。xlsx,。pdf,。docx、。doc 。我的第一反应:威武 熊猫 !其中当然处理了*。csv* 和*。xlsx* ,但是关于*。pdf* 和*。docx* ,我们将不得不探索超越 熊猫 的可能性。

在这篇博客中,我将分享我的技巧和诀窍,以帮助您轻松地导入 PDF 和 Word 文档(到 Python 中),以防它出现在您自己的工作中,尤其是在您的 NLP 自然语言处理项目中。所有样本数据文件都可以公开访问,文件副本以及相应的下载链接可以在 my Github repo 中找到。

  1. Python-docx → 用MS Word 工作。docx 文件

作为最常用的文档工具之一,MS Word 经常是人们编写和共享文本的首选。对于带有。 docx 扩展,Python 模块docx是一个得心应手的工具,下面展示如何导入*。docx* 段落只有 2 行代码,

现在让我们打印出输出信息,

docx 返回的信息和示例段落

正如我们所看到的,返回的是一个字符串/句子的列表,因此我们可以利用字符串处理技术和正则表达式来获取文本数据以备进一步分析(例如,NLP)。

2。win 32 com→用 MS Word 工作。doc 文件

尽管很容易使用,python-docx 模块不能接受老化的 T2。doc 分机,信不信由你,。doc 文件仍然是许多利益相关者的首选文字处理器(尽管有*)。docx* 已经存在十多年了)。如果在这种情况下,转换文件类型不是一个选项,我们可以求助于win32 com . client包中的几个技巧。

基本技术是首先启动一个 Word 应用程序作为活动文档,然后读取 Python 中的内容/段落。下面定义的函数 docReader()展示了如何(并且完全烘焙的代码片段链接到这里),

运行这个函数后,我们应该会看到与第 1 部分相同的输出。两个小技巧: (1)我们设置字。Visible = False 隐藏物理文件,这样所有的处理工作都在后台完成;(2)参数 doc_file_name 需要完整的文件路径,而不仅仅是文件名。否则,函数文档。Open()不会识别文件,即使将工作目录设置为当前文件夹。

加入我们的 YouTube 社区🎦 【数据与 Kat 谈判】 😄

现在,让我们来看看 PDF 文件,

3。 **Pdfminer(代替 pypdf F2)→使用 PDF 文本

说到在 Python 中处理 PDF 文件,大家熟知的模块py PDF 2大概会是包括我自己在内的大部分分析师最初的尝试。因此,我使用 PyPDF2 (完整代码可在我的 Github repo 中获得)对其进行编码,这给出了文本输出,如下所示。

嗯,显然这看起来不对,因为所有的空格都不见了!没有合适的空格,我们就无法正确解析字符串。

事实上,这个例子揭示了 PyPDF2 中的函数 extractText()的一个警告:它对于包含复杂文本或不可打印的空格字符的 PDF 执行得不好。因此,让我们切换到 pdfminer 并探索如何将这个 pdf 文本导入,

现在,输出看起来好多了,可以用文本挖掘技术轻松清理,

4。Pdf 2 image+Pytesseract→处理 PDF 扫描图像

对于数据科学家来说更复杂的是(当然), pdf 可以(并且经常)由扫描图像代替文本文档创建;因此,它们不能被 pdf 阅读器呈现为纯文本,不管它们被组织得多么整齐。

在这种情况下,我发现的最佳技术是首先显式地提取图像,然后用 Python 读取和解析这些图像。我们将用模块pdf 2 imagepytesract来实现这个想法。 如果后者听起来比较陌生,那么pytesserac是 Python 的 OCR 光学字符识别工具,可以识别和读取图像中嵌入的文字。现在,这是基本功能,

在输出中,您应该会看到如下所示的扫描图像文本:

PREFACE   In 1939 the Yorkshire Parish Register Society, of which the Parish Register Section of the Yorkshire Archaeological Society is the successor (the publications having been issued in numerical sequence without any break) published as its Volume No. 108 the entries in the Register of Wensley Parish Church from 1538 to 1700 inclusive. These entries comprised the first 110 pages (and a few lines of p. 111) of the oldest register at Wensley.

任务完成!另外,您现在还知道了如何从图像中提取数据,即pytesserac模块中的 image_to_string()。

**注意:**要使 宇宙魔方 模块成功运行,您可能需要执行额外的配置步骤,包括安装 poppler宇宙魔方 包。同样,请在 my Github 这里随意抓取更健壮的实现和详细的配置列表。

最后,Greg Horton 提到了一个数据科学笑话,他在文章中谈到了数据争论中的 80-20 法则:

数据科学家花 80%的时间处理数据准备问题,另外 20%的时间抱怨处理数据准备问题需要多长时间。

通过经历从 Word 和 PDF 文件中抓取文本的不同方式,我希望这个博客可以让你的 80%变得更容易/不那么无聊,这样你就不会拔头发,也可以减少另外 20%,这样你就可以花更多的时间阅读有趣的中等文章。

最后提示:一旦完成了对文件的处理,关闭连接以便其他应用程序可以访问该文件总是一个好的编码实践。这就是为什么你在上面每个函数的末尾看到了close()方法。😃

想要更多的数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的完全访问权限。

还订阅我新创建的 YouTube 频道 《数据与吉谈》

喜欢这个博客吗?这是另一个你可能喜欢的数据科学博客:

* [## 每个数据科学家都应该知道的 6 个 SQL 技巧

提高分析效率的 SQL 技巧

towardsdatascience.com](/6-sql-tricks-every-data-scientist-should-know-f84be499aea5)*

提升数据科学项目的 4 种软件开发技术

原文:https://towardsdatascience.com/4-software-development-techniques-to-level-up-your-data-science-project-59a44498ca3f?source=collection_archive---------27-----------------------

让您的项目更清晰、更高效、更专业

照片由负空间发自像素

软件开发是开发人员和程序员设计、编写、记录和测试代码的过程。无论您使用什么编程语言,或者您的目标应用领域是什么,遵循良好软件开发的特定指导方针对于构建高质量、可维护的项目是必不可少的。

数据科学项目——可能比其他类型的软件项目更多——应该以可维护性的心态来构建。这是因为,在大多数数据科学项目中,数据不是恒定的,而是频繁更新的。此外,任何数据科学项目都期望它具有可扩展性抗崩溃性。它应该不受数据中任何错误的影响。

因为在数据科学项目中,代码的每一个部分都是为适应特定的数据形式而构建的,所以如果给代码一个特定的数据,它就可能会崩溃。当然,无论输入什么数据,您都不希望代码出错。因此,在设计和构建代码时,要记住一些事情,以使您的代码更具弹性。

要设计和编写好的、稳定的代码,有许多准则可以遵循。然而,在本文中,我们将重点关注我认为的构建可靠的数据科学项目所需的 5 个最重要的规则或技能。

所以,让我们开门见山吧…

[## 提升你的代码

编写干净、高质量代码的 5 个简单步骤

towardsdatascience.com](/level-up-your-code-e1424fff031d)

文件编制

不提到文档,就谈不上好的软件。现在,有两个步骤来保持代码的整洁和良好的文档记录。第一步是注释你的代码。注释对于阅读你的代码的人来说是至关重要的,更重要的是,通过你写代码时的思考过程,对于你未来的自我来说也是至关重要的。

评论需要简单,不超过两句,开门见山。无论何时定义一个类或函数,或者创建自己的模块,都不要忘记编写一个描述性的 docstring。写评论时,请始终记住:

注释不是用来向人们解释代码的;代码是用来向计算机解释注释的。

一旦你的代码和注释完成了——好吧,暂时因为代码永远不会完成——你需要为你的代码建立足够的文档。文档通常是用简单的英语编写的代码的外部解释。文档通常使用文档处理工具创建,例如 Sphinx 和 [DocUtils](http://docutils.sourceforge.net/ reStructuredText) 。文档通常是项目网站的一部分。

说到最佳实践,在开始编码之前开始编写文档是一个好主意。它将作为需要做什么的指南。不幸的是,我们大多数人——包括我自己——都不遵守这条规则。然而,我们都需要开始实践它。

测试

我们写代码的时候,往往是基于一些变量和数据集来写的。然而,很常见的是,您的代码可能包含一些只会在某些特定情况下或特定数据集上出现的错误。因此,在部署应用程序之前对其进行测试至关重要。

但是,测试可能会变得非常复杂,尤其是当涉及到数据科学项目时。通常,数据科学项目使用其他数据科学家的评论进行测试,因为大多数众所周知的测试方法很难应用于数据科学项目。

这是因为数据的简单变化可能会导致代码性能的显著变化。多年来,研究人员和开发人员一直在寻找测试数据科学项目的最佳方式。他们发现测试数据科学应用程序的最佳方式是通过单元测试。

单元测试是一种测试类型,用于检测可能中断程序流程的变化。他们帮助维护和更改代码。有许多 Python 测试库可以用来执行单元测试。

  1. Unittest 是 Python 中的内置库,用于执行单元测试。Unittest 通常被称为 PyUnit,这是一种创建单元测试程序的简单方法。
  2. Pytest 是一个完整的测试工具——这是我最喜欢的。Pytest 有一个简单直接的方法来构建和使用单元测试。
  3. 假设 是一个单元测试生成工具。开发假设的目标是帮助开发人员创建和使用单元测试来处理代码的边缘情况。

数据管理

具体到数据科学项目,在处理数据时,我们需要注意的一件事是管理我们的数据。我们需要考虑很多事情,比如你的数据是怎么创建的?它有多大?是每次都加载还是存储在内存里?

当处理数据时,我们需要非常小心内存管理以及代码如何与数据交互。需要考虑的一点是 Python 函数调用如何影响代码的内存使用。有时候,函数调用占用的内存比你意识到的要多。

克服这个问题的一个方法是使用 Python 的自动内存管理功能。下面是 Python 处理函数调用的方式:

  1. 每次你调用一个函数和对象时,就用一个计数器计算创建的位数;使用此功能。
  2. 每当我们使用或引用这个函数时,计数器就增加 1。
  3. 当代码引用离开函数对象时,计数器递减 1,直到达到 0。一旦完成,内存将被释放。

[## 当你的数据对于你的内存来说太大了怎么办?

使用 Panda 处理大数据

towardsdatascience.com](/what-to-do-when-your-data-is-too-big-for-your-memory-65c84c600585)

如果您想知道如何编写使用这种自动内存管理的代码,请不要再想了。 Itamar Turner 提出了 3 种不同的方法,可以让你的功能更有内存效率:

  1. 尽量减少局部变量的使用。
  2. 如果不能,那么重用变量,而不是定义新的变量。
  3. 转移占用大量内存的函数的对象所有权。

使用特定领域的工具

最后但同样重要的是,为了帮助您构建弹性项目,请使用专门为数据科学构建的工具。当然还有大家熟知的工具,比如 IPython,Pandas,Numpy,Matplotlib。

但是,让我来介绍两个不太为人所知的工具:

  1. graph lab Create**:**是一个用于快速构建大规模、高性能数据产品的 Python 库。您可以使用 GraphLab Create 来应用最先进的机器学习算法,如深度学习、提升树和因式分解。您可以通过可视化执行数据探索,并且可以使用预测服务快速部署项目。
  2. Fil: 是用于数据科学的 Python 内存管理工具。您可以使用 Fil 来测量 Jupyter 笔记本中的内存使用峰值。以及测量普通(非基于 Jupyter 的)Python 脚本的内存使用峰值,并调试代码中的内存不足崩溃。此外,Fil 有助于显著减少内存使用。

外卖食品

如今,建立一个好的数据科学项目并不足以让你脱颖而出。你需要你的项目具有抗崩溃性和内存效率。这就是为什么使用一些软件开发技巧;你可以让你的数据科学项目更上一层楼,让它脱颖而出。

我们在本文中讨论的软件开发技能是:

  1. 高效的记录和评论。
  2. 测试,测试,然后更多的测试。
  3. 明智的数据和内存管理。
  4. 可以简化您的工作并提高项目效率的特殊工具。

然而,我们没有谈到的是任何开发人员都必须获得的最重要的技能,即始终致力于改进您的技能和知识库,以及跟上最新技术和工具的能力。

用 Python 和 Bin 打包轻松分配资源的🧱 4 步骤

原文:https://towardsdatascience.com/4-steps-to-easily-allocate-resources-with-python-bin-packing-5933fb8e53a9?source=collection_archive---------22-----------------------

瞬间解决一维资源分配问题

【图片由作者提供】

在本文中,我们将使用 Python 和 binpacking 包来解决一个最常见的 NP-hard 问题:Bin Packing 问题。 🗑️

具体来说,通过贪婪的方法,我们将根据价值/分数在 n 个项目上分配 m 个资源。开始吧!

0.问题的简要介绍

假设您有 m 个不同重量(或值)的物品,您需要将这些物品放入 n 个相等的平衡箱(图 1 )。

💡这就是通常所说的 箱柜装箱问题

BPP 被计算复杂性理论归类为 NP-hard 问题,简而言之,其难度不亚于在 N 非确定性 P 多项式时间 NP 问题中最难解决的问题。

很简单,不是吗? …🤔

图 1-小心:尽管使用了多边形,但问题仍然是一维的,因为所有矩形的宽度都是相同的。【图片作者】

虽然这些话看似近乎理解(我可以向你发誓前面的句子没有打字错误),但是 装箱问题在日常生活中经常发生

以下是一些例子:

  • 🛒:你在超市。你刚刚付了款,你要把所有的 m 产品放在数量最少的 n 袋子里,尽量装得满满的,均衡的。
  • 👔你是一个项目经理,需要人员 m 资源进行 n 项目。假设同样复杂的项目,你的目标将- 可能- 是通过了解你的资源的估计贡献值来实现平衡的团队。
  • 🚣‍♂️:你正计划和几个朋友去乘船旅行。不幸的是,船是有最大载重量的。你必须将你的 m 个朋友平均分配到由你支配的 n 艘船上。

是的。顾名思义 每当我们要用别的东西 来“填充”某物的时候,装箱问题就出现了。
正如你所想象的,有 n 维变量,这些变量考虑了其他有用的信息,如 体积成本 ( 背包问题)。

1.摆桌子的时间到了:打包

让我们开始预热引擎。我们将只使用这两个包:

  • matplotlib :超流行的可视化软件包;
  • binpacking :一个贪心的 binpacking 问题求解器包;

要安装它们,只需在命令提示符中输入💻:

pip install binpacking matplotlib

等你瞧。搞定了。

2.导入包

现在让我们打开我们最喜欢的笔记本或者 IDE ,通过导入这两个包开始代码。

3.将笔放在纸上:参数

下面是我最喜欢的一个步骤: 参数定义

🗑️让我们首先定义我们想要的 个仓 的数量,然后字典包含资源 的估计/测量 值。

我们将 21 个资源 分配给 6 个项目 的员工。👨‍👩‍👧‍👦

字典的每个关键字将对应于该资源的贡献值的估计。是的, 一种分数的排序

4.打开箱子包装问题

考虑到在 NP-hard 问题、 中寻找最优解的极端复杂性,没有贪婪的方法 我们不可能成功。这里开始使用 binpacking package。

🧮贪婪算法允许以近似但可接受的方式找到困难问题的解决方案。简而言之,随着贪婪的逼近,我们以牺牲问题的准确性为代价来支付问题的解决方案。

好的,我喜欢。那是给我们的。 ✌️

该软件包的使用非常简单。

搞定了。难以置信的无痛。让我们试着 以不同的方式可视化结果 使用列表理解清除值。

我们配备了所有资源并创建了 6 个(可能是)平衡小组。

好了,不过现在 是时候看看算法表现如何了 。让我们看看这些群体之间是否真正平衡。

5.让我们探索结果

我们期望的是 6 个组,每个组的总值非常接近于总值除以组数的和。

这样就很容易计算出每组的 理想值 和每组的 **。**

📊让我们试着给他们看看。

下面是图表: 红色横线 代表每组 理想平均期望值(图 2 )。

图 2 -这是我们的垃圾箱。它们的值都在理想平均值(红线)左右。【图片由作者提供】

Ta daa!正如我们所料,我们建立了 6 个平衡组。每个组实际上都有一个非常接近理想值的分数。我认为目标已经达到。🥳**

记住,事实上,我们得到的是一个与我们的问题兼容的 的 解,但是 不是最优的 ,因为我们使用了一个贪婪的*算法。*

-1.结论

总之 装箱问题 真的是日常生活中很常见的。**

一些精神食粮?如果我们想试着考虑物品 的 成本呢?如果我们还想整合第二维或第三维呢?简单的 1D 垃圾桶包装可能会有点紧。

我认为我们应该在接下来的文章中谈论它…所以,敬请期待!😉

🤝如有任何疑问、反馈或协作要求,请随时 联系我Linkedin。我会很高兴和你聊天!

👉要获得更多类似的内容,并关注即将发布的文章,请不要忘记在 Medium 上 关注我。

🙏如需参考本文,请联系我。谢谢你。

4 个非常有用的 Python 特性

原文:https://towardsdatascience.com/4-super-useful-python-features-993ae484fbb8?source=collection_archive---------6-----------------------

四个不太知名但非常有用的 Python 功能

克里斯·里德在 Unsplash 上拍摄的照片

ython 是一种非常易读的语言,越来越成为许多程序员的首选。然而,这种易用性和大规模采用导致一些真正有用的功能消失在噪音中。

这里有四个超级有用的功能,在过去的几个月里,我越来越多地使用它们。

( 意大利文 )

列表方法:追加和扩展

。append() 将参数作为单个元素添加到给定列表的末尾。例如:

x = [1, 2, 3]
y = [4, 5]
x.append(y)
print(x)

**[Out]:** [1, 2, 3, [4, 5]]

。extend() 遍历参数并将每个元素添加到列表中。例如:

x = [1, 2, 3]
y = [4, 5]
x.extend(y)
print(x)

**[Out]:** [1, 2, 3, 4, 5]

使用加法运算符 +扩展也有区别。x + y给出了一个新的列表,而x.extend(y) 对原来的列表进行了变异。

收益与回报

yield 语句向调用者发回一个值,但保持函数的状态。这意味着下一次调用这个函数时,它将从它结束的地方继续。

我们在生成器函数中使用这个功能——例如,让我们使用yield构建一个生成器,使用return构建一个等价的函数:

def gen_yield():yield "hel"yield "lo "yield "wor"yield "ld!"def func_return():return "hel"return "lo "return "wor"return "ld!"

如果我们打印这些生成器给出的值,首先使用**yield**:

for value in generator_yield():print(value, end="")

**[Out]:** "hello world!"

现在用**return**:

for value in generator_return():print(value, end="")

**[Out]:** "hel"

打印(开始,结束)

另一个,我刚刚在上面用过。print函数实际上由要打印的字符串对象和一个end组成!

我在快速代码中经常使用这种方法,通常是当我想迭代地打印出变量而不为每个变量换行时,例如:

generator = (x for x in [1, 2, 3])
for _ in generator:print(_, end=" ")

**[Out]:** "1 2 3 "

与普通打印相比:

for _ in generator:print(_)**[Out]:** "1""2""3"

map 和 lambda

的。map()函数允许我们将一个 iterable 映射到一个函数。例如:

def add2(x):return x + 2list(**map(add2, [1, 2, 3])**)

**[Out]:** [3, 4, 5]

我最喜欢的是我们也可以使用 lambda 函数,就像这样:

results = [(0.1, 0.2), (0.3, 0.1), (0.2, 0.4)]list(**map(lambda x: x[0], results)**)

**[Out]:** [0.1, 0.3, 0.2]

在过去的几个月里,我一直在使用这四种方法——不久前,我要么没有意识到,要么根本就没有使用其中的任何一种。

如果你最近有什么不常用但有用的功能,请告诉我,我很感兴趣!欢迎通过推特或在下面的评论中联系我们。如果你想要更多这样的内容,我也会在 YouTube 上发布。

感谢阅读!

让你在数据科学职业生涯中不可或缺的 4 种超能力

原文:https://towardsdatascience.com/4-superpowers-that-will-make-you-indispensable-in-a-data-science-career-6571e8e7d504?source=collection_archive---------19-----------------------

了解数据科学行业的这些最大挑战,以避免职业生涯停滞不前

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

人们在数据科学职业生涯中遇到的挑战远比他们进入 it 行业时面临的挑战严重。

通常,工作期望和实际责任之间存在很大的不匹配。如果你有幸在你向往的领域工作,在数据科学项目中与其他角色合作可能是一场真正的斗争。

拔牙可能比应付项目经理的日常要求更容易。做好这一切,你可能会发现你的解决方案没有被用户触及。你可能会奇怪,为什么没有人理解或使用如此显而易见的东西。

在你的数据科学职业生涯的早期,所有这些都可能导致生存危机。对于这个领域的许多专业人士来说,职业停滞的风险很高。你如何解决这个问题?

我将分享数据科学项目中导致你许多个人奋斗的 4 大棘手挑战。基于我们在 Gramener 的工作经验,我们将讨论它们对您的意义。以及如何粉碎它们,使它们在您的项目和数据科学行业中变得不可或缺。

1.提高您处理杂乱数据的能力

照片由卡里姆·曼吉拉在 Unsplash 拍摄

数据质量差是数据科学面临的最大挑战之一。坏数据每年给组织造成超过 1500 万美元的损失。你需要干净、结构化的数据来得出大的、有用的、令人惊讶的见解。想不到使用了深度学习技术?然后,你将需要更多的数据,并且这些数据必须被整齐地标记。

在数据科学中,80%的时间花在准备数据上,另外 20%的时间花在抱怨数据上! —柯克·伯恩

您必须学会发现您的业务问题所需的数据的技能。了解如何管理和转换用于分析的数据。是的,数据清理在很大程度上是数据科学家的工作。玩数据,弄脏自己的手。你会发展出一双发现异常的眼睛,模式会开始跃入你的眼帘。

假设您的项目旨在分析客户体验。第一项任务是搜寻所有潜在的数据资产,如客户资料、交易、调查、社交活动。任何与你的业务问题无关的都必须放弃。检查和清理数据,你会丢失更多。这样做几周或几个月,然后你就准备好你的分析了!

2.学习技术,不要担心工具

数据和 AI 景观由马特图尔克。看不懂这个图表?别急,那是题外话!

数据科学行业充斥着数百种工具。没有一种工具能涵盖整个工作流程。每周都会有新的工具诞生。十几家倒闭或被收购。许多公司花费数百万购买企业许可证,却发现它们不再具有吸引力。

这个支离破碎的生态系统给有志之士带来了巨大的挑战。我经常被问到的一个问题是,*“我应该学习 Python 还是 R?PowerBI 还是 D3?”*我一直说工具真的不重要。对技术了如指掌。你可以在几周内将你的知识从一个工具转移到另一个工具。

工具真的不重要。重要的是这个人使用工具的技巧。

例如,要掌握可视化,不要从工具开始。学习信息设计的原则,视觉设计的基础,和色彩理论。然后获取一些真实的数据,通过解题将技巧内化。任何你能得到的可视化工具都可以。不要过度优化。

3.掌握解决现实世界问题的技术应用

奥拉夫·阿伦斯·罗特内在 Unsplash 上的照片

超过 80%的数据科学项目失败。想知道为什么吗?在整个生命周期中都有挑战:从选择错误的业务问题到构建不正确的解决方案。从选择错误的技术到未能将它们传达给用户。数据科学中的每个角色都会导致这些失误。不,这些差距大多不是技术性的。

大多数数据科学项目没有带来业务投资回报,因为它们解决了错误的问题。

这里的共同点是什么?这是技能在商业问题上的拙劣应用。例如,当数据科学家只是想要构建伟大的模型,却忽略了关注他们用户的需求时,这就伤害了项目。不要停留在对某项技术或其背后的数学的直觉上。找到它的相关之处以及应用它需要什么。致力于解决用户的问题。

假设你已经掌握了十几种预测技术。当你的用户需要明天的价格进行交易,但只有一个过去的数据点时,你会选择哪一个?有 100 分或者 10000 分会有变化吗?如果她只需要知道是'持有还是'以市场价卖出怎么办?

4.超越数据和分析技能,在数据分析中取得成功!

公司通常雇佣来学习机器技能。他们投资于数据工程,可能会接受一些可视化和数据素养方面的培训。但是,这个团队是不平衡的,将交付次优的结果。每个数据科学团队都必须具备 5 项技能才能取得有效的项目成果。

在数据科学中实现价值的 5 个关键角色和技能(漫画:www.gramener.com/comicgen)

如果你正在扮演这些角色中的一个,你应该关心这个吗?绝对的。以下是你如何在任何项目中增加影响力的方法。掌握一项技能作为你的核心领域。这是你的主要角色。投资并学习一项次要技能。你应该能够在这一点上作为备份和支持介入。

其他三个呢?获得广泛的熟悉感。你必须能够与他们联系起来,理解痛点,并将他们与你的工作联系起来。做到这一点,你将价值连城!

要在数据分析行业取得成功,你需要的不仅仅是数据和分析

这里的一个关键要点是,数据科学职业生涯中有 5 个角色。不仅仅是“数据科学家”。假设你是一名 ML 工程师。你的第二技能可以是信息设计。了解图表以及如何选择正确的图表。找出用户在视觉上寻找什么,以及它对你正在构建的 UI 有什么意义。

现在是时候让自己变得不可或缺了

数据科学中的每个项目都面临这四个挑战。组织因失败的数据科学投资而损失数百万。客户很担心,因为他们的业务问题仍未解决。数据科学的领导者和管理者都吓坏了,因为项目的失败率是疯狂的。

所有这些通常会转化为对数据科学专业人员的过度需求和高压力。理解这些大的挑战对你来说是一个很好的起点。同情你的项目团队和领导。

你在这里学到的四个技巧将帮助你迎头应对挑战。开始实践它们,你会发现你的工作得到了更多的信任和认可。很快,你会变得不可或缺,在你的职业生涯中上升得更快。

祝你在项目中战胜这些挑战!

发现这些建议有用吗?有更多应对这些挑战的技巧吗?将它们添加到评论中。在LinkedinTwitter上与我保持联系。

标题照片由 史蒂文·利布拉龙

增强你在机器学习项目中的研究的 4 种技术

原文:https://towardsdatascience.com/4-techniques-to-enhance-your-research-in-machine-learning-projects-c691892ab9dd?source=collection_archive---------27-----------------------

在我的帖子机器学习项目的研究指南中,我解释了如何将任何机器学习项目分成两个阶段(研究和开发)以及一些推动研究阶段的技巧。

在这篇文章中,我将深入研究一些技术和工具,帮助你掌握你的研究。在这个阶段工作时,你应该力求简单和专注。

项目布局

这是我倾向于在任何 ML 项目开始时使用的文件夹布局。只要项目需要成长,这个布局就可以扩展(例如添加一个tests文件夹、deploy文件夹等)。

project          # project root
├── data         # data files
├── models       # machine learning models
├── notebooks    # notebook files
└── src          # helper functions

与常规的软件开发项目不同,ML 项目有三块基石:由代码消耗/产生的源代码(笔记本和 src)、由代码和数据构建/消耗的数据模型

📁数据

在获取数据之后,我的建议是分阶段处理数据,每个阶段都有自己的文件夹。例如:

data
├── raw        # original files
├── interim    # preprocessed files
└── processed  # result files

从这个布局中,您可以像在管道中一样跟随数据流:从rawinterim,然后到processed

首先是📁raw文件夹以原始格式存储数据。如果您可以使用离线数据,那么总是保存一份数据的冻结副本(只读)会非常方便。第二📁interim文件夹用于存储数据转换产生的数据。很可能,这些转换最终会扩大数据集。这就是我倾向于使用二进制格式的原因,二进制格式可以在序列化/反序列化任务中获得更好的性能。最常用的二进制格式之一是 拼花 (查看如何使用pandas读取/保存拼花数据)。

加载. csv 文件的时间与加载拼花文件的时间

最后,在📁processed文件夹用于存储机器学习模型的结果。

即使raw文件夹可以存储多种格式的文件()。csv。json。xls 等),我的建议是在interim文件夹中使用一些常用的格式(例如:二进制格式如*)。拼花地板*、。羽化,或 raw 格式,如*。csv* 、。png )并在processed文件夹中使用用户友好的格式(例如:)。csv 或 excel 文件允许利益相关者查看您的模型的结果)。有时,包含模型结果的汇总图是有意义的(例如:在构建推荐系统时,您的推荐分布是否遵循与您的销售分布相似的模式?)

📁笔记本电脑

在研究阶段工作时,我使用 Jupyter 笔记本作为我的执行平台/IDE。这就是为什么大多数支持机器学习生命周期的代码都存放在 Jupyter 笔记本上的原因

机器学习(简化)生命周期

因此,笔记本文件夹类似于(在某种程度上)ML 生命周期:

notebooks
├── 1__ingestion                 # |-> data/raw
├── 1_1__eda
├── 2__preprocessing             # |<- data/raw  
│                                  |-> data/interim
├── 2_1__eda
├── 3_1__model_fit_variant_1     # |-> model/variant_1.pkl
├── 3_2__model_fit_variant_2     # |-> model/variant_2.pkl
├── 3_3__models_validation       
└── 4__model_predict             # |<- data/interim, model/*.pkl  |-> data/processed

我不会深入研究每个笔记本负责什么的细节,因为我认为你们大多数人应该与机器学习生命周期有关。

在任何情况下,你都应该应用适合你工作方式的布局和命名约定(如果你愿意,也可以使用更复杂的布局模板)。也许你需要几次或更多的迭代来找到你自己的蓝图,但是把它作为学习过程的一部分。例如,我喜欢将 EDA 分成两部分,第一部分仅使用原始数据,第二部分关注预处理阶段后产生的“新数据”。但是,如果你喜欢做一个单一的 EDA,这也很好。这里展示的这些项目布局是为了让你有目的地做事,而不是按照你的自由意志行事。一旦您将项目移交到下一个阶段(开发),这将非常重要,因为您的团队成员将能够识别您的项目的形状和组件。**

📁模型

建模笔记本的结果(训练后的 ML 模型)可以存储在该文件夹中。大多数 ML 框架(如 scikit-learn、spacy、PyTorch)都内置了对模型序列化的支持()。pkl.h5 等);否则,检查出宏伟的 cloudpickle 包。

📁科学研究委员会

研发阶段的一个区别是,在研发阶段,src将会很小(包含助手和笔记本使用的其他常用功能),而在研发阶段,这个文件夹将会被其他文件夹和填满。py 文件(为生产部署准备的代码)。

WSL2

【Linux 的 Windows 子系统 (v2)是这个领域的新成员。如果您已经在使用 Linux 或 MacOS,可以跳过这一节。否则,如果你属于 Windows 用户类别,你应该继续阅读。大多数 python 包与 Windows 系统兼容;但是你永远不知道什么时候会面临不兼容 OS 包的逆境(比如:apache airflow 不在 Windows 环境下运行)。在这段时间里,您将学会爱上 WSL,因为它的行为就像一个完全成熟的 Linux 系统,无需离开您的 Windows 环境。性能相当不错,大多数 IDE 都兼容 WSL。

运行 WSL 的 Windows 终端

例如, Visual Studio 代码有对 WSL 的原生支持。这意味着使用常规插件加载任何 python 项目/文件夹,并执行或调试代码。因为 WSL 将主机驱动器挂载在/mnt文件夹中,所以您仍然可以访问 windows 主机文件夹。如果您最终在 Windows 和 WSL 中使用同一个项目,请考虑您可能会遇到一些互操作性问题。例如,由于文件权限或 CRLF 行尾,git 可能会错误地将文件检测为已更改。要解决这些问题,您可以在 WSL 中执行以下命令:

git config --global core.filemode false
git config --global core.autocrlf true

WSL 的未来充满希望:原生访问 GPU (=使用 GPU 训练深度学习模型)和 Linux GUI (=不仅支持终端应用,也支持 GUI 应用)。最后,不要错过与 WSL 一起使用令人惊叹的 Windows 终端的机会。

Jupyter 笔记本

毫无疑问,Jupyter 笔记本是我进行探索和研究的首选工具。但与此同时,Jupyter 笔记本电脑并不是将您的模型投入生产的最佳工具。在这两个对立的术语(研究/开发)之间,有一个共同点,那就是您可以改进如何使用 Jupyter 笔记本电脑。

装置

我推荐使用 Anaconda 和 conda 环境安装 Jupyter 笔记本。但是你可以使用任何其他的包管理工具(比如 virtualenv 、 pipenv 等)。但是你必须使用某人,因此,也在你的项目中使用它。

如何安装 Jupyter Notebook(或者更确切地说,我是如何将其安装在我的机器中的):

使用 Anaconda 安装 Jupyter 笔记本(因此,首先需要安装 Anaconda);然后在基本/默认(conda)环境中安装 Jupyter Notebook,执行以下命令:

conda activate base
conda install -c conda-forge notebook

这听起来违背了所有的良好实践(Jupyter Notebook 应该是一个项目依赖项),但我认为作为 Visual Studio 代码(或name-your-preferred-IDE-here)本身,Jupyter Notebook 应该是一个机器级的依赖项,而不是项目级的依赖项。这使得以后的定制更容易管理:例如,在使用 Jupyter 扩展的情况下(下一节将详细介绍),您只需配置一次扩展,然后它们就可以用于所有的内核/项目。

安装 Jupyter 笔记本后,就轮到 Jupyter 笔记本扩展了;在控制台中运行以下命令:

conda install -c conda-forge jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
conda install -c conda-forge jupyter_nbextensions_configurator

然后,每当您创建一个新的 conda 环境时(您应该在每次启动一个新项目时创建一个新的环境),您需要使它作为 Jupyter 内核可用,执行以下命令:

python -m ipykernel install --user --name retail --display-name "Python (retail)"

最后,要启动 Jupyter Notebook,您应该在基本环境中,然后执行:

project          # project root (launch jupyter notebook from here,
│                # using the base/default conda environment)
├── data
├── models
├── notebooks
└── srcconda activate base
jupyter notebook

Jupyter Notebook 在您的网络浏览器中启动后,您可以为您的笔记本选择所需的环境(内核):

Jupyter 笔记本—更改内核

第一次在笔记本中设置内核时,它将被记录在笔记本元数据中,您无需在每次启动笔记本时进行设置。

笔记本扩展

使用 Jupyter 笔记本扩展。只是为了启用Collapsing headers扩展。当您使用大型笔记本时,这对于将信息组织到您的笔记本中非常有帮助,并且不会忘记在笔记本中来回翻页。我认为这是必须的。句号。

交付笔记本电脑时,您应该提供的最重要的事情之一是可执行性(一旦设置了依赖关系——内核和源文件,笔记本电脑必须从上到下都是可运行的)和可再现性(当笔记本电脑被执行时,应该总是返回相同的结果)。

但是由于我们处于研究阶段,我们可以允许一定程度的不确定性。支持这一点的一个很好的工具是Freeze text扩展,允许我们保存您过去实验的结果。使用工具栏,您可以将单元格变为只读(可以执行,但其输入不能更改)或冻结(不能更改或执行)。因此,如果您不能强制执行可再现性,至少您可以保留一些基本结果来与您当前的执行进行比较。

Freeze text Jupyter 笔记本扩展

例如,在上图中,您可以比较最后一个纪元和执行时间的准确性。此外,考虑到为了记录/跟踪您的实验,有更好的工具,如 mlFlow 和 wandb (尽管我认为这些工具在开发阶段更相关)。

最后,我鼓励你去看看其他可用的扩展(比如 scratchpad,autopep,code folding 等等)。如果你按照我的安装设置,应该有一个名为Nbextensions的选项卡可供你配置笔记本扩展:

Jupyter 笔记本扩展管理器

否则,您可以通过命令行启用扩展。

笔记本测试和源代码控制

Jupyter 笔记本在测试和源代码控制方面都表现不佳。在测试的情况下,使用造纸厂和 nbdev 会有一些帮助。另外,我强烈推荐使用老派技巧作为assert命令来验证你的代码假设。例如,在每个pd.merge之后,检查结果数据帧的基数(初始行数==最终行数)总是一个好的做法:

nrows_initial = df.shape[0]
df = pd.merge(df, df_sub, how="left")
assert nrows_initial == df.shape[0]

源控制的情况下,可以检查[nbdime](https://github.com/jupyter/nbdime),进行区分合并笔记本。通常git在检测笔记本文件的变化方面提供的体验很差,但是相比之下nbdime是一个强大的工具,你可以从命令行(提供了与 git、bash 和 PowerShell 的集成)或者从 web 界面使用,这提供了更丰富的体验(也提供了与 Jupyter Notebook 的集成)。我非常欣赏nbdime根据输入单元格的变化、输出单元格的变化和单元格元数据的变化对更新进行分类。

NBD ime—Jupyter 笔记本的区分和合并

笔记本魔术命令

使用 Jupyter 笔记本的另一个建议是充分利用内置的 %magic commands 。我最喜欢的魔法命令是:

%load_ext autoreload
%autoreload 2
%matplotlib inline

在不重启内核的情况下,在内存中重新加载模块和包时,%autoreload这个神奇的命令变得非常方便。例如,如果你正在处理存储在经典中的代码。py 文件,当源文件被更新时,只要你执行笔记本中的一个单元格,新的源文件就会被重新加载到当前内核中,所做的更改就可以使用了。这种技术的另一个好处是,您可以在笔记本的环境中安装新的包,并且(大多数情况下)它可以导入到当前的笔记本中(同样,不需要重新启动内核)。另一方面,魔术命令%matplotlib用于将matplotlib输出重定向到当前画布笔记本。

另一个鲜为人知的魔法命令是:

%%time当您需要分析在笔记本中执行一个单元格所花费的时间时。我喜欢对需要长时间执行的复杂单元使用这个命令,因为我知道完成执行需要多少时间。如果你想了解更多这方面的信息,你可以阅读优秀的剖析和计时代码——Python 数据科学手册章节。

使用%%time分析执行时间

另一种分析代码的方法是使用 tqdm ,当执行“成批代码”时,它会显示一个漂亮的进度条。根据执行上下文(python、interactive 或 Jupyter Notebook),输出可以很好地适应。

tqdm

如果您需要并行执行“成批代码”并显示它们的进度,您可以使用 pqdm 。

%debug ( 可以调试),当一个单元因错误而执行失败后,执行下一个单元的%%debug魔法命令。在此之后,您将进入(华丽【挖苦本意】)pdb调试界面;请记住,没有设置断点的花哨用户界面,只有“老式的”命令 alas ' s ' for step,q ' for quit,等等;您可以检查其余的 pdb 命令以自娱自乐。

预处理

数据管道

在我的上一个项目中,我从这篇文章中获得了很大的灵感,这篇文章解释了如何构建机器学习预处理管道。最重要的想法是而不是推迟之前可以做的事情,并按照以下顺序转换数据:

  1. 预处理:列操作(即map转换)
  2. 特征工程:逐行操作(即group by变换)
  3. 合并:数据帧方式操作(即merge转换)
  4. 上下文:跨数据帧操作(即map跨上下文操作)

压型

从头开始做 EDA 很费力,因为你需要事先查询数据,以便知道要显示什么(或寻找什么)。这种情况最终导致编写重复的查询来显示数值变量的直方图、检查列中缺少的值、验证列的类型等。另一个选择是自动生成这些信息,使用像 pandas-profiling 这样的包,它可以报告各种信息。

熊猫简介

检查缺失数据的经典方法是使用df.isna().sum()中的pandasAPI;同样,您可以查询执行df.species.value_counts()的数据频率。但是这些命令的输出是“不完整的”,因为只返回绝对数字。欢迎使用 sidetable ,它以一种漂亮的表格方式丰富了过去的查询:

熊猫value_counts() vs 侧桌freq()

sidetablepandas-profiling API 完全集成到pandas DataFrame API 中,支持 Jupyter 笔记本。

PS: 这个区域目前“炙手可热”,所以期待未来会有更多的包裹到来( klib )

形象化

对我们许多人来说,Seaborn 是一个老伙伴。下一个版本(0.11)要带来我期待了一段时间的东西:堆积条形图。

堆积条形图

如果你在这个特性还没有发布的时候读到这篇文章,记住你可以使用下面的命令直接从 GitHub 安装“开发”包:

pip install  [https://github.com/mwaskom/seaborn.git@4375cd8f636e49226bf88ac05c32ada9baab34a8#egg=seaborn](https://github.com/mwaskom/seaborn.git@4375cd8f636e49226bf88ac05c32ada9baab34a8#egg=seaborn)

您也可以在您的requirements.txtenvironment.yml文件中使用这种 URL,尽管我建议确定存储库的提交散列(如后面的代码片段所示)。否则,您将安装“安装时可用的最新存储库版本”。此外,在产品中安装“测试”或“开发”版本时要小心。警告你

【更新】Seaborn 0.11 版本目前已经上市,不需要从 GitHub 安装开发版。尽管如此,为了知识的缘故,我将留下关于安装开发版本的注释。

在我的上一个项目中,我了解了一个非常方便的软件包,用于可视化地图和统计信息: kepler.gl ,这是一个最初的 node.js 模块,最近被移植到 Python,并且还获得了一个友好的扩展,可以将地图加载到 Jupyter 笔记本。

我喜欢 kepler.gl 最重要的特点是:

  1. pandas API 紧密集成。
  2. 我能够制作一个令人印象深刻的 3D 地图可视化,包括一个在短时间内自动动画的动态时间轴。
  3. UI 具有许多 GIS 功能(图层等),因此地图具有高度的交互性和可定制性。但最棒的是,你可以保存这些 UI 设置,并将其导出为一个 python 对象(准确地说是一个 python 字典);下次加载地图时,可以传递这个 python 对象,避免从头开始重新设置地图。
from keplergl import KeplerGl
sales_map = KeplerGl(height=900, data={"company sales" : df,"box info" : df.drop_duplicates(subset=["product_id"]), "kid_info" : df.drop_duplicates(subset=["user_id"]) },config=config # configuration dictionary)
sales_map

感谢你花时间阅读这篇文章。

  • 我在这篇文章中解释的大多数问题都是基于我在 ML 项目中的工作经验。但它们不一定适合你的工作环境,但至少,我希望它们能为你提供一些思考的素材。
  • 请记住,这篇文章关注的是研究阶段的实验,所以我允许一些许可,但我不会允许自己出现在最终产品中。同时,我尝试使用正确的工具来加强容易覆盖的领域(例如:使用assert的简单测试,管道的良好实践,等等)。
  • 我不描述机器学习模型问题(训练、验证和部署)似乎会适得其反。但是在开始的时候,你将会花更多的时间来计划你的项目,转换你的数据和处理软件相关的麻烦,而不是执行 fit/predict 方法。
  • 请在评论中分享你的笔记或经历。正如我之前所说的,我离开了多个领域,没有进一步的细节,但如果你对其中任何一个感兴趣,请说出来。这将有助于推进这个了不起的社区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

git怎么查看每次的提交记录控制台输出日志乱码

今天来和各位小伙伴分享一下怎么查看git的每次提交(commit)的记录: 1.打开idea ——2.点击做下加的git ——3.点击log ——4.选择自己的分支 ——5.查看每次提交的代码 二、控制台log4j输出的日志乱码: 解决办法: 1、将图中几处地方变为urf-8 2、

How to create a PDF programming cheat sheet All In One

How to create a PDF programming cheat sheet All In One 如何创建 PDF 编程备忘单 / 速查表How to create a PDF programming cheat sheet All In One如何创建 PDF 编程备忘单 / 速查表tools vscode pdf 编辑器 solutionsExport web page to pdf / 网页导出为 pdf优点:可以高…

基础靶场搭建

为什么要搭建靶场? 在我们后续的学习当中会涉及到漏洞的利用,那我们小白肯定是不能直接实操哒(如果你很刑就当我没说)所以就找了几个靶场进行搭建,我们这里搭建几个比较简单具有针对性的靶场进行练习后续更新完了十大漏洞,在上有难度的靶场😁😁😁 phpstudy搭建 201…

监控下抽烟检测系统

监控下抽烟检测系统具有以下优势:监控下抽烟检测系统通过视频监控设备对工地和工厂的作业区域进行实时监测,准确捕捉人员抽烟的行为。监控下抽烟检测系统采用先进的图像识别技术,能够准确识别人员抽烟的动作和烟雾。监控下抽烟检测系统一旦系统发现有人员在禁烟区域内抽烟,…

shiro 反序列化漏洞

shiro 反序列化漏洞 Shiro-550 漏洞原理 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段。 为了让浏览器或服务器重启后用户不丢失登录状态,Shiro 支持将持久化信息序列化并加密后保存在 Cookie 的 rememberMe 字段中,下次读取时进行解密…

人员闯入报警系统

人员闯入报警系统是一种应用于工厂危险作业区域、工地危险作业区域或者重要区域保护等场景的创新解决方案,人员闯入报警系统旨在通过实时监测和识别,对未经许可或非法进入的人员进行及时报警。人员闯入报警系统利用先进的感应与识别技术,确保对危险区域的安全管理和保护。人…

我也不知道我是不是糖丸

模拟赛碰到一个很纸张的题目,但是自己没有做出来,于是记一下。 description\(1 \le n, a_i \le 3 \times 10^5\)。 solution 首先场上我写了一个很典的暴力做法。 考虑到预处理出所有阶乘的质因子幂次,然后相当于我从大往小枚举,能除多少就除多少,这样肯定能够满足字典序最…

B 站 硬币奖励不合理规则 All In One

B 站 硬币奖励不合理规则 All In One 💩 观众投币的百分之十将作为UP主的硬币收入奖励, 那 90% 的硬币去哪了呢?B 站 硬币奖励不合理规则 All In One💩 观众投币的百分之十将作为UP主的硬币收入奖励, 那 90% 的硬币去哪了呢?硬币规则如何给稿件投硬币?1.正式会员可以通过…