TowardsDataScience 博客中文翻译 2021(一百三十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

BBN:贝叶斯信念网络——如何用 Python 有效地构建它们

原文:https://towardsdatascience.com/bbn-bayesian-belief-networks-how-to-build-them-effectively-in-python-6b7f93435bba?source=collection_archive---------0-----------------------

机器学习

使用真实生活数据在 Python 中构建模型的贝叶斯信念网络的详细解释

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

图片由皮克斯拜的 Gerd Altmann 提供

简介

大多数人可能已经熟悉朴素贝叶斯算法,这是一种用于分类问题的快速而简单的建模技术。虽然朴素贝叶斯由于其速度和相对较好的性能而被广泛使用,但它是建立在所有变量(模型特征)都是独立的假设之上的,而这在现实中往往是不正确的。

在某些情况下,您可能想要构建一个模型,在其中您可以指定哪些变量是从属的、独立的或者条件独立的(这将在下一节中解释)。您可能还希望实时跟踪事件概率随着新证据引入模型而发生的变化。

这就是贝叶斯信念网络派上用场的地方,因为它们允许你通过清晰地勾勒变量之间的关系来构建一个带有节点和有向边的模型。

内容

  • 贝叶斯信念网络(BBN)属于哪一类算法
  • 贝叶斯信念网络(BBN)和有向无环图(DAG)简介
  • 使用真实生活数据的贝叶斯信念网络 Python 示例
    -用于天气预测的有向无环图
    -数据和 Python 库设置
    • BBN 设置
      -使用 BBN 进行预测
  • 结论

贝叶斯信念网络(BBN)属于哪一类算法?

从技术上讲,BBN 国内没有培训。我们简单地定义了网络中不同的节点是如何连接在一起的。然后,我们观察在将一些证据传递到特定节点后,概率如何变化。因此,我将概率图形模型归入它们自己的类别(见下文)。

旁注,由于神经网络独特的机器学习方法,我已经将它们归为一类。然而,它们可以用于解决广泛的问题,包括但不限于分类和回归。下图是交互式,请务必点击👇在不同的类别上对进行放大并展示更多的

机器学习算法分类。互动图表由作者创作。

如果你也热爱数据科学和机器学习 ,请 订阅 每当我发布新故事时,你都会收到一封电子邮件。

贝叶斯信念网络(BBN)和有向无环图(DAG)

贝叶斯信念网络(BBN)是一种概率图形模型(PGM),它通过有向无环图(DAG)表示一组变量及其条件依赖关系。

为了理解这意味着什么,让我们画一个 DAG 并分析不同节点之间的关系。

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

有向无环图。图片由作者提供。

利用上述内容,我们可以陈述变量(节点)之间的关系:

  • 独立性: A 和 C 相互独立。B 和 C 也是如此。这是因为知道 C 是否发生并不会改变我们对 A 或 B 的认识,反之亦然。
  • 依赖: B 依赖 A,因为 A 是 B 的父,这个关系可以写成条件概率:P(B|A)。d 还依赖于其他变量,在这种情况下,它依赖于其中的两个——B 和 c,同样,这可以写成一个条件概率:P(D|B,C)
  • 条件独立: D 被认为是条件独立于 A 的,这是因为一旦我们知道事件 B 是否发生了,A 从 D 的角度来看就变得无关紧要了,换句话说,下面是真的:P(D|B,A) = P(D|B)

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

使用真实数据的贝叶斯信任网络 Python 示例

用于天气预报的有向无环图

让我们用澳大利亚的天气数据来建造一个 BBN。这将使我们能够根据今天的一些天气观测来预测明天是否会下雨。

首先,在详细介绍如何构建 DAG 之前,让我们先来看看它。注意,我已经显示了所有不同事件组合的概率。在接下来的几节中,你会看到我们是如何使用天气数据来计算这些数据的。

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

贝叶斯信念网络(BBN)预测明天是否下雨的有向无环图(DAG)。图片由作者提供。

数据和 Python 库设置

我们将使用以下数据和库:

让我们导入所有的库:

然后我们从 Kaggle 获取澳大利亚的天气数据,你可以按照这个链接下载:https://www . ka ggle . com/jsphyg/weather-dataset-rattle-package

我们接收数据并推导出一些新的变量用于模型中。

以下是数据的快照:

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

经过一些修改的 Kaggle 的澳大利亚天气数据片段。图片由作者提供。

建立贝叶斯信念网络

现在我们已经准备好了所有的库和数据,是时候建立一个 BBN 了。第一阶段要求我们定义节点。

需要注意一些事情:

  • 这里的概率是数据中变量类别的归一化频率。例如,“H9am”变量在值≤60 时有 43,594 个观察值,在值> 60 时有 98,599 个观察值。

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

变量值计数。图片由作者提供。

  • 虽然我使用了归一化频率(概率),但如果你使用实际频率,它也是有效的。在这种情况下,您的代码应该是这样的:H9am = BbnNode(Variable(0, 'H9am',['<=60', '>60']), [43594, 98599])
  • 对于子节点,如“Humidity3pmCat”,它有一个父节点“Humidity9amCat”,我们需要为每个组合提供概率(或频率),如 DAG 中所示(注意每行加起来为 1):

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

“湿度 3pmCat”标准化频率(概率)。图片由作者提供。

  • 您可以通过两次计算“H3pm”的概率/频率来实现这一点,第一次通过获取“H9am”≤60 的数据子集,第二次通过获取“H9am”> 60 的数据子集。
  • 因为一次计算一个频率很费时间,所以我写了一个简短的函数来给出我们所需要的。

因此,让我们使用上面的函数,而不是手动输入所有的概率。同时,我们将创建一个实际的网络:

请注意,如果您正在处理一个小的数据样本,则存在某些事件组合不存在的风险。在这种情况下,您会得到一个“列表索引超出范围”的错误。一个解决方案是扩展您的数据以包含所有可能的事件组合,或者识别缺失的组合并添加它们。

现在,我们要绘制图表来检查我们是否按照预期进行了设置:

下面是结果图,它符合我们的预期设计:

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

BBN 天气预报的有向无环图。图片由作者提供。

利用 BBN 进行预测

我们的模型准备好了,我们可以用它来预测明天是否会下雨。

首先,让我们画出每个节点的概率,而不向图中传递任何附加信息。注意,我已经设置了一个简单的函数,这样我们就不必在以后重新输入相同的代码,因为我们需要多次重新生成结果。

上面的代码打印了以下内容:

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

原始 BBN 概率。图片由作者提供。

如你所见,这给了我们每个事件发生的可能性,即“明天下雨(RT)”的概率为 22%。虽然这很酷,但我们可以通过查看原始数据集中“RainTomorrow”变量的频率来获得同样的 22%的概率。

说接下来的步骤是我们从 BBN 中获得大量价值的地方。我们可以将证据传入 BBN,看看这如何影响网络中每个节点的概率。

假设现在是上午 9 点,我们已经测量了室外的湿度。上面写着 72,显然属于“> 60”的波段。因此,让我们把这个证据传递到 BBN,看看会发生什么。注意,我创建了另一个小函数来帮助我们。

这给了我们以下结果:

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

BBN 概率与“H9am”证据。图片由作者提供。

大家可以看到,“湿度 9am>60”现在等于 100%,“湿度 3pm>60”的可能性从 32.8%上升到了 44.2%。与此同时,“明天下雨”的几率上升到了 26.1%。

此外,请注意“风速”的概率没有变化,因为**“W”和“H9am”相互独立**。

您可以再次运行相同的证据代码,以从网络中移除证据。之后再来传“H3pm”和“w”的两个证据。

结果如下:

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

具有“H3pm”和“W”证据的 BBN 概率。图片由作者提供。

不出所料,这告诉我们明天下雨的可能性上升到了 67.8%。请注意“H9am”的概率也发生了变化,这告诉我们,尽管我们只测量了下午 3 点的湿度,但我们 93%确定今天上午 9 点的湿度也在 60 以上。

结论

贝叶斯信念网络有许多用例,从帮助诊断疾病到实时预测比赛结果。

你也可以建立 bbn 来帮助你做营销决策。说,我可能想知道这篇文章有多大可能达到 10K 的观点。因此,我可以构建一个 BBN 来告诉我某些事件发生的概率,例如在 Twitter 上发布这篇文章的链接,然后评估当我获得十次转发时这一概率如何变化。

最终,可能性几乎是无限的,有能力生成实时预测,一旦引入新的证据,就会自动更新整个网络。

我希望你和我一样发现了贝叶斯信念网络。如果您有任何问题或建议,请随时联系我们。感谢阅读!

干杯!👏
索尔·多比拉斯

如果你已经花光了这个月的学习预算,下次请记得我。 我的个性化链接加入媒介是:

https://solclover.com/membership

如果你想继续学习贝叶斯主题,你可以看看下面这篇关于朴素贝叶斯分类器的文章。

用 Python 做蛋白质组学侦探

原文:https://towardsdatascience.com/be-a-proteomic-detective-with-python-6ea18ef3f8f3?source=collection_archive---------28-----------------------

在 Jupyter 笔记本中检查同量异位标记蛋白质组学结果的质量

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

我们应该用我们的质谱数据跟随福尔摩斯和华生的脚步。西德尼·佩吉特的《海滨杂志》(1892)插图,目前在公共领域

同量异位标记定量蛋白质组学很复杂,需要大量的样品制备、质谱(MS)采集和数据分析。样品被溶解和增溶,半胱氨酸残基通常被还原和烷基化,蛋白质被消化成肽,肽被同位素标记的试剂标记,通常被分馏和脱盐[1]。而这只是从样品瓶到质谱仪的路径!很多事情都可能出错,因此仔细检查数据的质量非常重要,这些数据将成为生物学和医学结论的基础。

今天,我想分享一个 Jupyter 笔记本,其中包含一系列处理和可视化步骤的 Python 代码,我发现在检查蛋白质组发现者 (PD)套件的输出时,这些代码非常方便。它是 PD,因为我们在实验室中使用它,当然,如果输出足够全面,也可以使用其他数据处理管道。完整的笔记本已经上传到 Github 库,这里我将展示一些我认为对了解数据集质量特别有用的图。

本示例数据由 10 份标有串联质谱标签(TMT) 试剂的大肠杆菌样本组成,是图林和安德森【2】最近一项研究的一部分。MS 文件在项目 PXD007647 中公开,可从 PRIDE 档案中获得;我已经下载了原始文件,并使用 PD 2.4 和工作流中的频谱导出器节点对其进行了重新处理。激活所述节点后,输出由一堆制表符分隔的文本文件组成:

/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_QuanSpectra.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_SpecializedTraces.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_Proteins.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_PeptideGroups.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_MSMSSpectrumInfo.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_PSMs.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_ResultStatistics.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_ProteinGroups.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_InputFiles.txt
/PD_Out/PXD007647_Reproc_TMT-set-2_8fracs_PrSMs.txt

让我们看看所选的收藏夹,按照在笔记本中出现的顺序(即任意顺序)。

文件 MSMSSpectrumInfo

研究中的标记批次已被分成几个部分,在 MS 上对每个部分进行分析,形成一个单独的文件。有趣的是检查分数是否正常,例如,查看每分钟采集多少碎片光谱:

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

作者形象

但可能更重要的是每分钟的识别数量。不规则的分布和缺乏标识可能表明,除其他选择外,需要修改分馏方案。在这个项目中,情况相当不错,没有一个文件在很大程度上没有标识,尽管对于某些人来说,配置文件看起来有点扭曲:

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

作者形象

文件全光谱

由于这是一项定量研究,我肯定想检查正常化前后 quan 通道中的值分布(在 PD 中进行)。我们希望看到标准化的通道排列在一个好看且统一的范围内:

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

作者形象

使用 SN 值的平方根而不是 log 值有助于保持零值,从而更全面地了解强度分布。该数据集没有太多零强度光谱,中位强度似乎在 100 左右,这是很高的。同时,在 y- 轴上的刻度显示许多高强度光谱没有指定的肽 id(可以选择“sharey=True”来同等地缩放子图并强调这一点)。

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

作者形象

文件 PSm

由于通常有成千上万的肽谱匹配(PSM ),当试图表示点的密度时,使用六邻体蛋白图可能是一个好主意,参见下面的质量误差图示例。我们可以用非常小且高度透明的单个点来绘制散点图,但是六边形的面元非常清楚地代表了分布。在这个项目中,质量准确度符合要求,集中在百万分之五(ppm)以内:

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

作者图片

文件肽组

在研究同量异位数据集时,我经常检查每种蛋白质中肽定量值的相对标准偏差(RSD ):

在最简单的情况下,我们期望来自蛋白质的肽重复该蛋白质的定量特征。数据集中大多数蛋白质内肽的高变异系数可能是低信号强度(因此,高相对噪声水平)的证据。在我们的例子中,不同样品的平均值和中值 RSD 在 8%和 19%之间,这是相当合理的:

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

作者图片

半胱氨酸衍生可以影响蛋白质的结构,并影响最终数据集中一些肽的量。如果出现问题,修饰的半胱氨酸肽的相对水平可能较低(对数比<< 0) on a global scale for the affected samples. One of the ways to express that is a clustered heatmap, which is conveniently available via seaborn 库。在我们的案例中,不同的肽具有不同的丰度分布,但是没有样品在整个样品的规模上具有低丰度的含半胱氨酸的肽:

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

作者图片

文件蛋白质

古老的主成分分析(PCA)也值得一看。它可以帮助发现异常样本,并检查样本组是否如预期的那样(我还没有为这个项目提取这些信息)。让我们绘制两个主要的主成分,稍微修改默认的 matplotlib 散点图,并将解释方差的百分比添加到轴标签:

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

作者图片

摘要

这篇文章介绍了我用来检查蛋白质组发现者的同量异位素标记质谱蛋白质组数据质量的 Jupyter 笔记本。代码和示例数据可以在的 Github 库中找到。

参考

[1] N .劳尼亚尔和 J. R .耶茨,三。鸟枪法蛋白质组学中基于同量异位标记的相对定量 (2014),蛋白质组学研究杂志,13,12,5293–5309。开放访问。

[2] E .图林和 D.I .安德森。PBP1B 和 LpoB 在 cysB 突变株中的上调赋予了大肠杆菌 (2019),抗微生物药。化学药剂。,63,10,e 00612–19。开放访问。

在解释预测模型以寻求因果洞察力时要小心

原文:https://towardsdatascience.com/be-careful-when-interpreting-predictive-models-in-search-of-causal-insights-e68626e664b6?source=collection_archive---------1-----------------------

思想和理论

对试图从现代预测机器学习模型中提取因果洞察力的陷阱进行了仔细的探索。

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

斯科特·伦德伯格/伊尔克切利克-伊斯托克

与来自微软的 Eleanor Dillon、Jacob LaRiviere、Jonathan Roth 和 Vasilis Syrgkanis 关于因果关系和可解释机器学习的联合文章。

像 XGBoost 这样的预测性机器学习模型在与 SHAP 这样的可解释性工具搭配时变得更加强大。这些工具可识别输入要素和预测结果之间最具信息性的关系,这对于解释模型的作用、获得利益相关方的认可以及诊断潜在问题非常有用。很容易将这种分析向前推进一步,并假设解释工具也可以识别决策者如果想要在未来改变结果应该操纵什么特征。然而,在这篇文章中,我们讨论了使用预测模型来指导这种政策选择经常会产生误导。

原因与相关因果的根本区别有关。SHAP 将预测性 ML 模型获得的相关性透明化。但是,让相关性变得透明并不能让它们成为因果关系!所有的预测模型都隐含地假设每个人在未来都将保持同样的行为方式,因此相关模式将保持不变。为了理解如果有人开始表现不同会发生什么,我们需要建立因果模型,这需要做出假设并使用因果分析工具。

订户保留示例

假设我们的任务是构建一个模型来预测客户是否会续订产品。让我们假设,经过一番挖掘,我们设法获得了对预测客户流失很重要的八个特征:客户折扣、广告支出、客户每月使用量、上次升级、客户报告的错误、与客户的互动、与客户的销售电话以及宏观经济活动。然后,我们使用这些功能来训练一个基本的 XGBoost 模型,以预测客户是否会在订阅到期时续订:

X, y = user_retention_dataset()
model = fit_xgboost(X, y)

一旦我们有了 XGBoost 客户保持模型,我们就可以开始探索它从像 SHAP 这样的可解释性工具中学到了什么。我们从绘制模型中每个特征的全局重要性开始:

explainer = shap.Explainer(model)
shap_values = explainer(X)clust = shap.utils.hclust(X, y, linkage="single")
shap.plots.bar(shap_values, clustering=clust, clustering_cutoff=1)

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

该条形图显示,提供的折扣、广告支出和报告的错误数量是驱动模型预测客户保留率的三大因素(它还包括我们稍后将使用的功能冗余聚类)。这很有趣,乍看起来很合理。

然而,当我们更深入地研究改变每个特征的值如何影响模型的预测时,我们发现了一些不直观的模式。SHAP 散点图显示了更改特性值如何影响模型对更新概率的预测。如果蓝点遵循递增模式,这意味着特征越大,模型的预测更新概率越高。

shap.plots.scatter(shap_values)

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

预测任务与因果任务

散点图显示了一些令人惊讶的发现:

  • 报错多的用户更有可能续费!
  • 折扣较大的用户不太可能续约!

我们反复检查我们的代码和数据管道以排除错误,然后与一些业务合作伙伴交流,他们给出了直观的解释:

  • 重视产品的高使用率用户更有可能报告错误并更新他们的订阅。
  • 销售人员倾向于给他们认为对产品不太感兴趣的客户高折扣,这些客户的流失率更高。

模型中这些起初与直觉相反的关系是个问题吗?那取决于我们的目标是什么!

我们这个模型的最初目标是预测客户保持率,这对于像为财务规划估计未来收入这样的项目很有用。由于用户报告的错误越多,更新的可能性就越大,在模型中捕捉这种关系有助于预测。只要我们的模型具有良好的样本外拟合,我们就应该能够为金融提供良好的预测,因此不应该担心模型中这种关系的方向。

这是一类称为预测任务的任务的例子。在预测任务中,目标是在给定一组特征X的情况下预测结果Y(例如更新)。预测练习的一个关键组成部分是,我们只关心预测model(X)在类似于我们的训练集的数据分布中接近YXY之间的简单关联有助于这类预测。

然而,假设第二个团队选择了我们的预测模型,新的目标是确定我们公司可以采取什么行动来留住更多的客户。这个团队非常关心每个X特性如何与Y相关联,不仅仅是在我们的培训分布中,还包括世界变化时产生的反事实场景。在这种用例中,识别变量之间的稳定相关性已经不够了;这个团队想知道操作特征X是否会导致Y的变化。想象一下当你告诉工程主管你想让他引入新的 bug 来增加客户更新时他的表情!

这是一类叫做因果任务的任务的例子。在因果任务中,我们想知道改变世界的一个方面X(例如报告的错误)如何影响结果Y(更新)。在这种情况下,关键是要知道改变X是否会导致Y增加,或者数据中的关系是否仅仅是相关的。

估计因果效应的挑战

理解因果关系的一个有用工具是写下我们感兴趣的数据生成过程的因果图。我们的示例中的因果图说明了为什么我们的 XGBoost 客户保留模型获得的稳健预测关系不同于团队感兴趣的因果关系,该团队希望计划干预以增加保留。这个图只是真实数据生成机制的总结(可以在本文的笔记本版本中找到)。实心椭圆表示我们观察到的特征,而虚线椭圆表示我们不测量的隐藏特征。每一个特征都是一个带有箭头的所有特征的函数,外加一些随机效果。

在我们的例子中,我们知道因果图,因为我们模拟数据。在实践中,真正的因果图是未知的,但是我们可以使用关于世界如何工作的上下文特定的领域知识来推断哪些关系可以或不可以存在。

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

在这个图表中有许多关系,但是第一个重要的关注点是我们可以测量的一些特征受到不可测量的混杂特征的影响,比如产品需求和面临的缺陷。例如,报告更多错误的用户会遇到更多的错误,因为他们使用产品的次数越多,他们也更有可能报告这些错误,因为他们更需要产品。产品需求对更新有直接的因果影响。因为我们不能直接测量产品需求,我们最终在预测模型中捕捉到的缺陷报告和更新之间的相关性结合了所面临的缺陷的小的负面直接影响和来自产品需求的大的正面混杂影响。下图描绘了我们示例中的 SHAP 值与每个特征的真实因果关系(由于我们生成了数据,所以在此示例中是已知的)。

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

预测模型捕捉了报告的错误对保留的总体积极影响(如 SHAP 所示),即使报告错误的因果影响为零,而发现错误的影响是负面的。

我们在折扣方面也看到了类似的问题,这也是由未被观察到的客户对产品的需求所驱动的。我们的预测模型发现折扣和保留率之间存在负相关关系,这是由这种与未观察到的特征(产品需求)的相关性驱动的,尽管实际上折扣对续订有很小的正面因果影响!换句话说,如果两个客户有相同的产品需求,并且在其他方面相似,那么折扣较大的客户更有可能续订。

当我们开始将预测模型解释为因果关系时,这个图还揭示了第二个更隐蔽的问题。请注意,广告支出也有类似的问题——它对保留没有因果关系(黑线是平的),但预测模型显示出积极的影响!

在这种情况下,广告支出只受上次升级和每月使用量的驱动,因此我们不存在未观察到的混淆问题,而是存在观察到的混淆问题。在广告花费和影响广告花费的特征之间存在统计冗余。当我们通过几个特征获得相同的信息时,预测模型可以使用这些特征中的任何一个进行预测,即使它们并不都是因果关系。虽然广告支出对更新本身没有因果关系,但它与推动更新的几个特征密切相关。我们的正则化模型将广告支出确定为一个有用的预测因素,因为它总结了多个因果驱动因素(因此导致了一个更稀疏的模型),但如果我们开始将它解释为因果效应,那就变得严重误导了。

我们现在将依次处理我们例子中的每一个部分,以说明预测模型何时能够准确地测量因果关系,何时不能。我们还将介绍一些因果工具,这些工具有时可以在预测模型失败的情况下估计因果影响。

当预测模型可以回答因果问题时

让我们从例子中的成功开始。请注意,我们的预测模型很好地捕捉了经济特征的真实因果效应(更好的经济对保留有积极影响)。那么,我们什么时候才能期待预测模型捕捉到真正的因果效应呢?

允许 XGBoost 获得良好的经济因果效应估计的重要因素是特性的强独立分量(在此模拟中);它对记忆的预测能力与任何其他可测量的特征或任何不可测量的混杂因素相比并没有很大的冗余。因此,它不受未测量的混杂因素或特征冗余的影响。

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

经济性与其他测量特征无关。

由于我们已经在 SHAP 条形图的右侧添加了聚类,我们可以将数据的冗余结构视为一个树状图。当特征在树状图的底部(左侧)合并在一起时,这意味着这些特征包含的关于结果(更新)的信息是非常多余的,并且模型可能已经使用了任一特征。当特征在树状图的顶部(右侧)合并在一起时,意味着它们包含的关于结果的信息是相互独立的。

通过注意到经济直到聚类树状图的最顶端才与任何其他特征合并,我们可以看到经济独立于所有其他测量的特征。这告诉我们,经济不会遭受观察混淆。但是,要相信经济效应是因果关系,我们还需要检查未观察到的混淆。检查不可测量的混杂因素更加困难,并且需要使用领域知识(在上面的例子中由业务伙伴提供)。

对于提供因果结果的经典预测 ML 模型,特征不仅需要独立于模型中的其他特征,还需要独立于未观察到的混杂因素。很难找到感兴趣的驱动因素自然表现出这种独立性的例子,但当我们的数据包含一些实验时,我们经常可以找到独立特征的例子。

当预测模型不能回答因果问题,但因果推断方法可以帮助

在大多数真实世界的数据集中,特征不是独立的和无根据的,因此标准预测模型将不会了解真正的因果关系。因此,用 SHAP 解释它们不会揭示因果关系。但是并不是一切都完了,有时我们可以使用观察因果推理的工具来解决或者至少最小化这个问题。

观察混杂

因果推理有帮助的第一种情况是观察混淆。当有另一个特征对原始特征和我们预测的结果都有因果影响时,这个特征就是“混杂的”。如果我们可以测量另一个特征,它被称为观察混杂

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

每月使用和最后升级的广告花费是非常多余的。

我们场景中的一个例子是广告支出特性。尽管广告支出对保留没有直接的因果影响,但它与上次升级和每月使用功能相关,而这些确实会推动保留。我们的预测模型将广告支出确定为保留率的最佳单一预测指标之一,因为它通过相关性捕捉了如此多的真正因果驱动因素。XGBoost 强加了正则化,这是一种奇特的说法,它试图选择仍然预测良好的最简单的可能模型。如果使用一个特征而不是三个特征也能预测得一样好,它会倾向于这样做以避免过度拟合。但这意味着,如果广告支出与上次升级和每月使用量高度相关,XGBoost 可能会使用广告支出而不是因果特征!XGBoost(或任何其他具有正则化的机器学习模型)的这一属性对于生成未来保持力的鲁棒预测非常有用,但对于理解如果我们想要增加保持力,我们应该操纵哪些特征却不是很好。

这突出了为每个问题匹配正确的建模工具的重要性。与错误报告的例子不同,增加广告支出会增加用户保留率的结论在直觉上没有错。如果没有适当关注我们的预测模型是什么,而不是什么,我们可能会很容易地继续这一发现,并在增加广告支出后才知道我们的错误,没有得到我们预期的更新结果。

观察因果推理

对广告支出来说,好消息是我们可以衡量所有可能混淆它的特征(在上面的因果图中,这些特征带有指向广告支出的箭头)。因此,这是一个观察到混淆的例子,我们应该能够仅使用我们已经收集的数据来解开相关模式;我们只需要从观察因果推断中使用正确的工具。这些工具允许我们指定哪些特征会混淆广告支出,然后针对这些特征进行调整,以获得广告支出对产品更新的因果影响的无根据估计。

一个特别灵活的观察因果推理工具是双/去偏机器学习。它使用您想要的任何机器学习模型,首先去发现感兴趣的特征(即广告支出),然后估计改变该特征的平均因果效应(即因果效应的平均斜率)。

双 ML 的工作方式如下:

  1. 使用一组可能的混杂因素(即,不是由广告花费引起的任何特征)训练模型来预测感兴趣的特征(即,广告花费)。
  2. 使用同一组可能的混杂因素训练一个模型来预测结果(即确实更新)。
  3. 使用感兴趣的因果特征的残差变异来训练模型以预测结果的残差变异(减去我们的预测后剩余的变异)。

直觉是,如果广告支出导致更新,那么不能被其他混杂特征预测的广告支出部分应该与不能被其他混杂特征预测的更新部分相关。换句话说,double ML 假设存在影响广告花费的独立(未观察到的)噪声特征(因为广告花费并不完全由其他特征决定),因此我们可以估算该独立噪声特征的值,然后在该独立特征上训练模型以预测输出。

虽然我们可以手动完成所有双 ML 步骤,但使用像 econML 或 causaml 这样的因果推理包更容易。这里我们用的是 econML 的 LinearDML 模型(详见笔记本)。这将返回一个 P 值,表明该治疗是否具有非零因果效应,并且在我们的场景中运行良好,正确地识别出没有证据表明广告支出对更新有因果效应(P 值= 0.85):

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

请记住,双最大似然(或任何其他观察因果推断方法)只有在您可以测量和识别您想要估计因果效应的特征的所有可能混杂因素时才有效。这里我们知道因果图,可以看到每月使用量和上次升级是我们需要控制的两个直接混杂因素。但是,如果我们不知道因果图,我们仍然可以查看 SHAP 条形图中的冗余,并看到每月使用量和上次升级是最冗余的功能,因此是控制的良好候选项(折扣和报告的错误也是如此)。

非混淆冗余

因果推理有帮助的第二种情况是非混淆冗余。当我们想要因果效应的特征驱动模型中包含的另一个特征,或者被另一个特征驱动,但是该另一个特征不是我们感兴趣的特征的混杂因素时,就会发生这种情况。

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

销售拜访功能就是一个例子。销售电话会直接影响客户保持,但也会通过互动间接影响客户保持。当我们在模型中同时包含交互和销售拜访功能时,这两种功能共享的因果关系被迫在它们之间展开。我们可以在上面的 SHAP 散点图中看到这一点,它显示了 XGBoost 如何低估了销售电话的真正因果影响,因为大部分影响都放在了交互功能上。

非混杂冗余原则上可以通过去除模型中的冗余变量来固定(见笔记本)。例如,如果我们将互动从模型中移除,那么我们将获得销售电话对续订概率的全部影响。这种移除对于双 ML 也很重要,因为如果控制由感兴趣的特征引起的下游特征,双 ML 将不能捕捉间接因果效应。在这种情况下,double ML 将只测量不通过其他特征的“直接”效果。然而,双 ML 对于控制上游非混杂冗余(冗余特征引起感兴趣特征)是稳健的,尽管这将降低您检测真实效应的统计能力。

不幸的是,我们通常不知道真正的因果图,因此很难知道另一个特征何时对我们感兴趣的特征是冗余的,因为观察到了混杂与非混杂冗余。如果是因为混淆,那么我们应该使用像 double ML 这样的方法来控制该特征,而如果是下游结果,那么如果我们想要完全的因果影响而不仅仅是直接影响,我们应该从我们的模型中删除该特征。控制一个我们不应该控制的特征往往会隐藏或分割因果关系,而未能控制一个我们应该控制的特征往往会推断出不存在的因果关系。当你不确定的时候,这通常使控制一个特性成为更安全的选择。

当预测模型和非发现方法都不能回答因果问题时

双最大似然法(或任何其他假设未发现的因果推断方法)仅在您可以测量和识别您想要估计因果效应的特征的所有可能混杂因素时才有效。如果你不能测量所有的混杂因素,那么你就处于最困难的情况:未被观察到的混杂因素。

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

折扣和 bug 报告功能都受到未观察到的混淆的影响,因为并非所有重要的变量(例如,产品需求和面临的 bug)都在数据中进行了测量。尽管这两个功能相对独立于模型中的所有其他功能,但仍有一些重要的驱动因素无法衡量。在这种情况下,需要观察混杂因素的预测模型和因果模型(如 double ML)都将失败。这就是为什么 double ML 估计了折扣特征的一个很大的负因果效应,即使在控制所有其他观察到的特征时也是如此:

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

除非能够测量先前未测量的特征(或与其相关的特征),否则很难在未观察到的混杂因素中找到因果关系。在这些情况下,识别能够为政策提供信息的因果效应的唯一方法是创建或利用一些随机化,打破感兴趣的特征和不可测量的混杂因素之间的相关性。在这种情况下,随机实验仍然是寻找因果关系的黄金标准。

基于工具变量、差异中的差异或回归不连续性原理的专门因果工具有时可以利用部分随机化,即使在不可能进行完整实验的情况下。例如,在我们无法随机指定治疗方法的情况下,可以使用工具变量技术来确定因果关系,但我们可以随机推动一些客户接受治疗,如发送电子邮件鼓励他们探索新产品功能。当新的治疗方法在不同组间交错引入时,差异中的差异方法可能是有帮助的。最后,当治疗模式表现出明显的截止点时,回归不连续性方法是一个很好的选择(例如,基于特定的、可测量的特征(如每月收入超过 5000 美元)的治疗资格)。

摘要

像 XGBoost 或 LightGBM 这样灵活的预测模型是解决预测问题的强大工具。然而,它们不是固有的因果模型,因此用 SHAP 解释它们将无法准确回答许多常见情况下的因果问题。除非模型中的特征是实验变化的结果,否则在不考虑混杂因素的情况下将 SHAP 应用于预测模型通常不是一个合适的工具来测量用于为政策提供信息的因果影响。SHAP 和其他可解释性工具可以用于因果推理,SHAP 被集成到许多因果推理包中,但那些用例本质上是明确的因果关系。为此,使用我们将为预测问题收集的相同数据,并使用像 double ML 这样专门设计来返回因果影响的因果推断方法,通常是为政策提供信息的好方法。在其他情况下,只有实验或其他随机来源才能真正回答如果的问题。因果推断总是需要我们做出重要的假设。本文的主要观点是,我们通过将正常的预测模型解释为因果关系而做出的假设通常是不现实的。

由决策驱动,而不是数据驱动

原文:https://towardsdatascience.com/be-decision-driven-not-data-driven-d12b9b7edd8b?source=collection_archive---------24-----------------------

在你的合作决策过程中需要考虑的七点

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

杰瑞米·帕金斯的 Unsplash

科技媒体痴迷于数据。但是在对企业数据素养进行了八年的测量后,只有 24%的公司报告已经达到了数据驱动的涅槃。这比去年少了家公司。

也许数据驱动是错误的目标。

研究者 Bart de Langhe 和 Stefano Puntoni 是这样认为的。他们主张变成决策驱动,而不是数据驱动。

这种区别似乎很小,但事实并非如此。这就像共产主义者对资本家,民主党人对共和党人,或者红袜队对扬基队球迷。

决策文化并不像说波士顿是一个比纽约更好的体育城市那样一成不变。数据科学既是创造性的,也是技术性的,就像盖房子一样——建筑师、设计师、建筑商和管道工必须一起工作。起初,架构师领导;在施工阶段,建筑商主导,在完工阶段,设计主导;房主是最终的决策者。

决策驱动的思维在七个方面不同于数据驱动的方法:

  1. 从问题开始,**不是数据。**决策驱动思维花更多时间设计问题。测题两遍,切数据一遍!
  2. 决策者领导项目,而不是数据科学家。房主设定基调,而不是建筑商。
  3. 思考未知多于已知。在零售业,一个常见的数据驱动项目找出如何优化忠诚度计划;决策驱动型思维首先探究是什么让客户犹豫不决。
  4. 先看宽,潜深。数据驱动的团队经常一头扎进他们已经拥有的数据池。Puntoni 和 de Lange 建议决策优先团队“先宽后窄”
  5. 构建新的数据盒子。当你开始提问时,你会很快发现你丢失了数据。以决策为中心的团队可以更快地确定对新调查、模拟或第三方数据的需求。
  6. 定位并减少偏差。通过预先接纳更广泛的团队,决策导向的团队往往更加多样化。多样性有助于通过质疑假设来根除偏见。
  7. **不是后视镜。**数据驱动思维从历史数据开始,说明已经发生的事情。虽然过去可能只是序幕,但疫情之前的模式可能不再适用。

巴勃罗·毕加索说:“计算机的问题在于它们所能做的只是提供答案。”他的信息很深刻:不要让技术领先;领导你的技术。由决策驱动,而不是数据驱动。

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

马克·帕尔默(www.techno-sapien.com)

在谷歌数据流上传送(批量+流)你的数据管道

原文:https://towardsdatascience.com/beam-batch-stream-your-data-pipelines-on-google-dataflow-2e3230bcdc21?source=collection_archive---------23-----------------------

Apache Beam 是批处理和流处理的统一编程模型

为什么需要数据管道?

在 21 世纪,大多数企业依靠可扩展的平台&服务或产品的数据化来保持市场竞争力。随着来自不同来源、具有不同数量、速度和种类的数据激增,企业需要新的数据战略。因此,需要数据管道将所有不同来源的数据整合到一个共同的目的地,以进行快速分析,或者在连接的应用程序和系统之间处理和传输数据。

因此,组织开始根据其业务需求部署批处理或流式管道。

P

批量处理:

  • 与有界数据集一起使用。
  • 在一段时间内收集一组数据,然后一次性处理。
  • 更关心吞吐量而不是延迟。
  • 用例:寻找一家银行的忠实客户;折扣后的销售差额等。

流处理:

  • 用于未绑定的数据集。
  • 数据一生成就被馈送到处理引擎。
  • 更关心延迟而不是吞吐量。
  • 用例:股市情绪分析;实时检测欺诈交易、物联网设备等。

R 例如,在 Spark 中,rdd/data frame 用于批处理,而您需要为流处理编写数据流。因此,他们需要维护两个不同的流水线以及各自的执行引擎,这不仅增加了总的维护开销,而且将它们与相关的执行引擎锁定在一起。

为了缓解这些挑战,谷歌孵化了一个数据流模型,可以应用于有界和无界数据集,然后将其 SDK 捐赠给 Apache 基金会。

从那时起,贡献者社区培育了它,因此,我们有了" Apache Beam "一个统一的编程模型,它易于使用,对流和批处理工作流进行数据并行处理,最重要的是平台独立性(可移植,支持多个运行程序),以消除任何 API 锁定。

Apache Beam 是批处理&流处理的统一编程模型,抽象层允许用任何语言(Java、Python、Go 等)创建。)并且可以在 Google Cloud Dataflow、Spark、Flink 等任何执行框架上执行。

阿帕奇波束的体系结构;

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

作者的 Apache Beam 架构

  • 使用您选择的编程语言 SDK——Java、Python 或 Go——编写管道。
  • Beam / Runner API 将其转换为可由执行引擎使用的语言通用标准。
  • Fn API 提供了特定于语言的 SDK 工作器,这些工作器充当嵌入到管道中作为函数规范的 UDF 的 RPC 接口。
  • 选定的运行器在底层资源上执行流水线,正确选择运行器是高效执行的关键。

Apache 射束工作流程:

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

作者的 Apache 工作流

**:Pipeline:**封装了从开始到结束的数据处理任务,包括读取 I/P 数据、转换和写入 O/P 数据。

PCollection: 波束流水线操作的分布式数据集。它可以是有界的,也可以是无界的。它本质上是不可变的,因此,对 PCollection 的任何转换都会创建一个新的 PCollection。

PTransform: 表示应用于 PCollection 的数据处理操作或转换步骤。

**I/O Sink&Sources:**Source 和 Sink APIs 提供了将数据读入集合或从集合中写出的函数。

阿帕奇波束能力矩阵;

Apache Beam 的主要优势是它的可移植 API 层,可以跨多种执行引擎或运行程序执行。因为它为不同的赛跑者提供了在技术创新上竞争的公平场所,这些技术创新提供了更好的性能、可靠性、操作管理的简易性等。因此,Apache 发布了一个能力矩阵,将不同跑步者的能力按照其相应的“什么/哪里/何时&如何”问题进行分组:

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

参考: 阿帕奇波束能力矩阵 来自 Apache.org

在图表中,你可以看到谷歌云数据流运行检查所有主要功能,但这不是我认为谷歌云数据流是推荐选择的唯一原因。

那么,为什么谷歌云数据流?

首先,谷歌对开源及其社区的承诺无与伦比。自 2016 年以来,谷歌已经为 15,000 多个开源项目做出了贡献,通过云数据流,谷歌甚至减轻了其设置、维护和扩展所需的开销,以高效执行复杂的大规模连续作业,方法是提供:

  • 完全托管的无服务器服务。
  • 自动优化管道,如使用的工人数量,将数据流拆分到关键空间,并并行处理它们。
  • Liquid Sharding(动态工作再平衡)可根据作业管道的需求动态调整工作人员的数量。
  • 用于批处理的低价灵活资源调度(FlexRS ),保证在 6 小时的窗口内执行。
  • 内置的实时人工智能功能允许构建智能解决方案,如预测分析、异常检测等。
  • 开箱即用集成到谷歌云资源的其余部分,实现无缝连接。

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

作者的 Google Cloud 原生数据源和数据流接收器

结论

在这里,我向您概述了 Apache Beam 编程模型,以及为什么 Google Cloud Dataflow 实际上应该是它的运行者,如果您还在阅读这篇文章,我相信您对探索 Apache Beam 的下一个数据管道非常感兴趣,或者希望在一个统一的、独立于平台的模型中转变现有的管道。所以为什么停止,不久我将发布一个实际的场景及其实现,以便更好地理解。

同时,这里有一些我提到的资源,你也应该浏览一下,以便更深入地理解:

用 Python、熊猫和财务规划打败我的银行

原文:https://towardsdatascience.com/beating-monzo-plus-with-python-and-pandas-83cb066c1b95?source=collection_archive---------43-----------------------

我如何用编程超越英国银行的新星

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

图片来自 StockSnap

大约两年前,我开始在 Monzo 银行工作,当时我发现这家完全在线的银行非常有趣——看不到任何高街位置。即使是现在,我也对这些纯数字银行取得的成就印象深刻,它们拥有储蓄罐和交易分类等有用的功能。

老实说,直到最近,我还不太在意 Monzo 根据供应商对交易进行自动分类的能力,但自从开始大学生活以来,管理财务对我来说变得重要多了。我决定仔细看看这个特性,虽然它很酷,但我对选项的缺乏感到非常失望。

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

作者图片

不要误会我的意思,Monzo 的类别选择是好的,但明显缺乏一些重要的选项,如“租赁”或“定期订阅”或类似的。当然,这两项实际上都可以归入“账单”项下,但其他像洗衣服这样乞讨的学生必须支付的费用呢?当然没有这个类别,而“费用”可以是任何东西。

我感到有点挫败,于是就建立了一个电子表格,每周花一个小时左右查看我的交易,填写表格,合计我每个月在不同东西上花了多少钱。我最终为我的三个主要账户——我的 Monzo 账户、我的学生银行账户和我的帮助购买 ISA——配置了电子表格,并设置了一些 Excel 公式,如果我向另一个账户转账,就会自动从一个账户中扣除,等等。

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

作者图片

这在一段时间内运行良好,虽然我仍然对 Monzo 没有默认提供类似的功能感到不高兴,但我还是继续使用该银行。

然而,2020 年 7 月,当 Monzo 为他们的银行账户引入一个新功能时,一切都改变了,这个功能可以同时解决我的问题并产生一个新问题,而且是一个相当大的问题。

你看,2020 年 7 月 15 日,Monzo 发布了 Monzo Plus,这是一种新型账户,提供了许多好处,包括虚拟卡、更多利息,你猜对了,还有自定义类别。

当然,Monzo Plus 的问题在于它是一项付费服务。这不是很多——一个月只有 5 英镑——但是作为一个破产的大学本科生,支付这个不是一个选择。我拒绝再保持沉默了。

在一阵绝对的愤怒中,我冲向我的电脑,设置了一个 virtualenv,打开 PyCharm,开始愤怒地敲键盘。不久后,我有了一个基本的程序,它可以处理我从 Monzo 应用程序下载的 CSV 交易,让我对它们进行分类,然后,如果我愿意,可以存储一个供应商名称分类图,这样我就不必每次都处理每笔交易。然后,我使用 openpyxl 模块将每个类别的总数插入到我已经在使用的电子表格中。

这很棒,随着时间的推移,我对它进行了更新,以存储任何成功解析的事务的事务 ID,这样,在多次使用该软件时,它就不会对同一事务进行两次计数。

实际上,该程序所做的只是将交易数据的 CSV 读入 pandas 数据帧,询问用户交易属于哪一类,将其插入数据帧,并对所有数据进行合计。自然,有很多用户输入检查和后退的废话,但这是它的一般要点。

然而,故事并没有就此结束。有一天,我和我的一个朋友谈到了这个问题,他也在 Monzo 银行工作,他提到他也会发现这样一个程序很有用,但需要它处理不同的类别,并将数据插入到电子表格的不同行中。

因此,我重写了部分内容,从 TXT 文件中提取自定义类别名称和电子表格行,并想“如果他会觉得有用,也许其他人也会觉得有用。”

我最终把这个项目上传到了 GitHub,并扩展了对所有银行的支持,增加了一些功能来改善用户体验。如果您有兴趣检查这个项目或者自己使用它,您可以在 GitHub 上找到它:

https://github.com/isaacharrisholt/vorn-finance-tracker

感谢阅读到底!如果你喜欢这篇文章或者觉得它有用,请告诉我。非常感谢任何反馈!

用 dtreeviz 实现漂亮的决策树可视化

原文:https://towardsdatascience.com/beautiful-decision-tree-visualizations-with-dtreeviz-af1a66c1c180?source=collection_archive---------9-----------------------

入门

改进绘制决策树的旧方法,永不回头!

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

卢克·理查森在 Unsplash 上拍摄的照片

决策树是一类非常重要的机器学习模型,也是许多更高级算法的构建模块,如随机森林或著名的 XGBoost。这些树也是基线模型的良好起点,我们随后会尝试用更复杂的算法对其进行改进。

决策树的最大优势之一是其可解释性——在拟合模型后,它实际上是一组可用于预测目标变量的规则。这也是为什么绘制规则并展示给利益相关者很容易,因此他们可以很容易地理解模型的底层逻辑。当然,前提是树不要太深。

结合使用scikit-learnmatplotlib,可视化决策树会非常简单。然而,有一个叫做dtreeviz的不错的库,它带来了更多的东西,并且创建了不仅更漂亮而且传达了更多关于决策过程的信息的可视化。

在本文中,我将首先展示绘制决策树的“老方法”,然后介绍使用dtreeviz的改进方法。

设置

和往常一样,我们需要从导入所需的库开始。

然后,我们从scikit-learn加载虹膜数据集。我们还将回顾一个回归示例,但我们稍后将加载波士顿住房数据集。

“老方法”

下一步包括创建训练/测试集,并使决策树分类器适合 Iris 数据集。在本文中,我们只关注可视化决策树。因此,我们没有注意拟合模型或找到一组好的超参数(有很多关于这些主题的文章)。我们唯一要“调整”的是树的最大深度——我们将其限制为 3,这样树仍然可以适应图像并保持可读性。

现在我们有了一个合适的决策树模型,我们可以开始可视化该树。我们从最简单的方法开始——使用scikit-learn中的plot_tree函数。

tree.plot_tree(clf);

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

作者图片

好吧,对于一句俏皮话来说还不错。但是可读性不是很好,比如没有特性名(只有它们的列索引)或者类标签。通过运行下面的代码片段,我们可以很容易地改进这一点。

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

作者图片

好多了!现在,我们可以很容易地解释决策树。也可以使用graphviz库来可视化决策树,但是,结果非常相似,具有与上图相同的一组元素。这就是为什么我们会在这里跳过它,但你可以在 GitHub 上的笔记本中找到实现。

dtreeviz 正在运行

看过绘制决策树的老方法后,让我们直接进入dtreeviz方法。

代码片段基本上是不言自明的,所以我们可以继续看结果。首先,让我们花点时间来承认这是一个多么大的改进,特别是考虑到函数调用非常相似。

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

作者图片

让我们一步一步地检查情节。在每个结点上,我们可以看到用于分割观测值的要素的堆积直方图,并按类进行着色。通过这种方式,我们可以看到各个类是如何被每次拆分所分隔的。值在 x 轴的小三角形是分割点。在第一个直方图中,我们可以清楚地看到 setosa 类的所有观测值的花瓣长度都小于 2.45 cm。

树的右边分支表示选择大于或等于分裂值的值,而左边分支表示选择小于分裂值的值。叶节点表示为饼图,它显示叶中的观察值属于哪个类。通过这种方式,我们很容易看出哪个类占多数,因此模型的预测也是如此。

在这张图上我们没有看到的一点是每个节点的基尼系数。在我看来,直方图提供了更多关于分割的直觉,系数的值可能与利益相关者的演示无关。

**注意:**我们也可以为测试集创建一个类似的可视化,我们只需要在调用函数时替换x_datay_data参数。

如果您不喜欢直方图,并且想要简化图形,您可以指定fancy=False来接收下面的简化图形。

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

作者图片

dtreeviz的另一个方便的特性是提高了模型的可解释性,它突出显示了图形上特定观察的路径。这样,我们可以清楚地看到哪些特征有助于分类预测。

使用下面的片段,我们突出了测试集的第一次观察的路径。

该图与前一个非常相似,但是,橙色突出显示清楚地显示了观察遵循的路径。此外,我们可以在每个直方图上看到橙色三角形。它表示给定特征的指示观察值。在最后,我们看到该观察的所有特性的值,用于决策的特性以橙色突出显示。在这种情况下,仅使用两个特征来预测观察值属于云芝类。

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

作者图片

**提示:**我们还可以通过设置orientation=”LR”将绘图的方向从自上而下改为从左向右。我们没有在本文中展示它,因为对于屏幕较窄的设备来说,图表不会被很好地缩放。

最后,我们可以用简单的英语打印出用于该观察预测的决策。为此,我们运行以下命令。

这样,我们可以清楚地看到这个观察满足的条件。

回归示例

我们已经介绍了一个分类示例,它展示了这个库的大多数有趣的功能。但是为了完整起见,我们还看了一个回归问题的例子,以显示这些图是如何不同的。我们使用另一个流行的数据集——波士顿住房数据集。这是一个问题,我们使用一组不同的区域来预测波士顿特定区域内的中值房价。

代码感觉已经差不多了。唯一的变化是我们增加了show_node_labels = True。对于较大的决策树来说,这尤其方便。因此,在与一组人讨论情节时,很容易通过节点的编号来指出我们正在讨论的是哪一部分。

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

作者图片

让我们深入分类树和回归树之间的差异。这一次,我们不是查看直方图,而是检查用于分割的特征与目标的散点图。在这些散点图上,我们看到一些虚线。他们的解释如下:

  • 水平线是决策节点中左右桶的目标平均值。
  • 垂直线是分割点。这与黑色三角形所代表的信息完全相同,但是,它使得比较水平线更容易->更容易将两边分开。

在叶节点中,虚线显示叶内目标的平均值,这也是模型的预测。

我们已经展示了我们可以突出某个观察的决策路径。我们可以更进一步,只绘制用于预测的节点。我们通过指定show_just_path=True来做到这一点。下图仅显示了从上面的树中选择的节点。

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

作者图片

结论

在本文中,我展示了如何使用dtreeviz库来创建优雅且有洞察力的决策树可视化。在使用它一段时间后,我肯定会继续使用它作为可视化决策树的首选工具。我确实相信,使用这个库创建的图对于不每天使用 ML 的人来说更容易理解,并且可以帮助向涉众传达模型的逻辑。

另外值得一提的是,dtreeviz支持 XGBoost 和 Spark MLlib 树的一些可视化。

您可以在我的 GitHub 上找到本文使用的代码。一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。

觉得这篇文章有趣?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,而不需要额外的费用。提前感谢,再见!

如果您喜欢这篇文章,您可能还会对以下内容感兴趣:

参考

用 Python 制作的美丽山脊图

原文:https://towardsdatascience.com/beautiful-ridge-maps-with-python-640906a30e10?source=collection_archive---------32-----------------------

如何用 Python 快速绘制酷炫的立面图

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

这种视觉效果是海拔图和山脊图巧妙结合的结果。

它使用多条水平线来表示地形的高程,就像跟踪各个纬度的峰值,一条在另一条之上。

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

结果是一个看起来非常酷的地图,它塑造了特定区域的山脉和不同的海拔高度。

我不确定这种可视化的实际应用,除了为一份报告制作一个好看的首页或让区域分析 PowerPoint 发光。但它们是一些非常吸引人的地图,值得一些关注。

山脊图

为了快速创建我们的可视化,我们可以使用 ridge_map

该软件包使用来自【SRTM】、Matplotlib 的高程数据来绘制图表,甚至用 Scykit 和 Numpy 检测湖泊。

安装后,我们可以通过导入 ridge_map,运行 plot_map,不需要任何参数来测试。我们应该弄一张白山的地图。

from ridge_map import RidgeMapRidgeMap().plot_map()

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

酷毙了。现在让我们尝试一个不同的位置。

自定义地图

首先,我们需要一些坐标。我用谷歌地图找到了它们。你也可以将地图显示为“地形”,这样你就可以知道最终的可视化效果会是什么样子。

一旦你找到你想要的,你可以在地图上点击鼠标右键来获得坐标。

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

山脊图将需要两组坐标,一组用于左下角,另一组用于右上角。

(-123.2510,49.6902,-122.1194,50.3446)
(左下 Long,左下 Lat,右上 Long,右上 Lat)

Google 的坐标顺序相反,Lat/ Long,所以我们需要反过来。

# coordinates
bl = [49.6902343443372, -123.25105812920076][::-1]
tr = [50.34462404053542, -122.11945787458642][::-1]rm = RidgeMap(bl + tr)
values = rm.get_elevation_data()
rm.plot_map(values=rm.preprocess(values=values), label=None)

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

我们首先定义 RidgeMap 并将坐标传递给构造函数。

获取高程数据

然后,我们使用 get_elevation_data 检索一个带有我们的规范的 NumPy 数组。这里我们有三个方便的论据。让我们试试它们。

# coordinates
bl = [49.6902343443372, -123.25105812920076][::-1]
tr = [50.34462404053542, -122.11945787458642][::-1]rm = RidgeMap(bl + tr)
values = rm.get_elevation_data(**num_lines=160, 
                               elevation_pts=800, 
                               viewpoint="south"**)
rm.plot_map(values=rm.preprocess(values=values), label=None)

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

那更好!

get_elevation_data 方法允许我们选择视点以及可视化的详细程度。

预处理

预处理方法将使我们能够配置高程比以夸大丘陵和山脉,并配置水检测。其中water_ntile删除基于海拔百分比的数据,而lake_flatness删除三个方块内的变化。

# coordinates
bl = [49.6902343443372, -123.25105812920076][::-1]
tr = [50.34462404053542, -122.11945787458642][::-1]rm = RidgeMap(bl + tr)values = rm.get_elevation_data(num_lines=160, 
                               elevation_pts=800, 
                               viewpoint="south")rm.plot_map(values=rm.preprocess(values=values, 
                                 **water_ntile=0, 
                                 lake_flatness=8,
                                 vertical_ratio=80**), 
            label=None)

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

来自 get_elevation_data 和预处理的所有这些参数都是有益的,但有时使用起来很棘手。

绘图地图

对于更加美观的定制,我们有 plot_map 方法。在那里我们可以配置颜色、线宽和标签。

**import seaborn as sb
cmap = sb.light_palette("#69d", as_cmap=True)**# coordinates
bl = [49.6902343443372, -123.25105812920076][::-1]
tr = [50.34462404053542, -122.11945787458642][::-1]rm = RidgeMap(bl + tr)values = rm.get_elevation_data(num_lines=160, 
                               elevation_pts=800, 
                               viewpoint="south")rm.plot_map(values=rm.preprocess(values=values, 
                                 water_ntile=0, 
                                 lake_flatness=8, 
                                 vertical_ratio=80), 
          **  label=None,
            line_color=cmap,
            kind="gradient",
            linewidth=1,
            background_color='black',
            size_scale=15**)

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

山脊图允许我们进行大量的定制。对于所有其他的,我们也有 Matplotlib。

Matplotlib

plot_map 方法返回轴,所以我们可以根据自己的需要进行修改。

import seaborn as sb
**import matplotlib.pyplot as plt**cmap = sb.light_palette("#69d", as_cmap=True)# coordinates
bl = [49.6902343443372, -123.25105812920076][::-1]
tr = [50.34462404053542, -122.11945787458642][::-1]
**whistler = [50.11262255339053, -122.96522325554356][::-1]**rm = RidgeMap(bl + tr)# convert annotation coordinates
**whistler_coords = ((whistler[0] - rm.longs[0])/(rm.longs[1] - rm.longs[0]),(whistler[1] - rm.lats[0])/(rm.lats[1] - rm.lats[0]))**values = rm.get_elevation_data(num_lines=160, 
                               elevation_pts=800, 
                               viewpoint="south")**ax =** rm.plot_map(values=rm.preprocess(values=values, 
                                 water_ntile=0, 
                                 lake_flatness=8, 
                                 vertical_ratio=80), 
            label=None,
            line_color=cmap,
            kind="gradient",
            linewidth=1,
            background_color='black',
            size_scale=15)**ax.plot(*whistler_coords, '.',
        color='white',
        transform=ax.transAxes,
        zorder=len(values)+10)****ax.text(whistler_coords[0]+0.01, 
        whistler_coords[1]+0.02, 
        'Whistler',
        fontproperties=rm.font,
        size=20,
        color="white",
        backgroundcolor='black',
        transform=ax.transAxes,
        verticalalignment="bottom",
        zorder=len(values)+10)**

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

总的来说,根据我的经验,这种可视化需要大量的实验。因为它更具艺术性而非分析性,你需要测试不同的变量,看看会发生什么,直到你找到你喜欢的东西。

尽管我不需要这样的地图,但我从这些可视化中获得了很多乐趣,并将再次使用它们来美化我的演示。

我用山脊图创建了这篇文章中的所有图像。你可以随意使用它们。

感谢阅读。希望你喜欢:)

更多 Python DataViz 教程

【参考文献:】
https://github.com/ColCarroll/ridge_map
https://github.com/tkrajina/srtm.py

带有 Tableau 和 Google Maps API 的简单精美的地图

原文:https://towardsdatascience.com/beautifully-simple-maps-with-tableau-and-the-google-maps-api-6eeb89263c52?source=collection_archive---------21-----------------------

轻松地将任何城市名称转换成可映射的地理位置。

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

梅丽莎·施密茨 | 制作的图形在 Tableau Public 上直播

Tableau 有一个内置函数,可以识别主要城市的名称。但是,如果 Tableau 不能自动识别可视化所需的城市,该怎么办呢?

如果只有少数几个城市,手动搜索纬度和经度值并将其添加到数据表中可能会更快。但是除此之外,你肯定想用脚本来节省时间。

这个 Python 脚本是通用的,所以你可以在任何需要地理定位的项目中反复使用它,而不仅仅是上面的 Tableau visual 。

另外,内置的安全性可以防止意外的 API 密钥泄漏。

你需要什么

在本文中,我将重点关注 Python 脚本和 Tableau 中的地图。关于安装 Python 库和获取 Google Maps API 密钥,网上有很多其他教程,所以如果你需要帮助,我在上面提供了链接。

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

照片由安德鲁·尼尔Unsplash 上拍摄

准备您的数据

对于这个项目,您的输入数据非常简单:一个. csv 文件,其中有一个名为“city”的列,包含您希望绘制地图的所有城市。这里有一个例子,用一个随机城市生成器制作:

Google Maps 地理定位 API 足够灵活,可以识别州和国家的各种文本表示。我特意包括了上面的例子,以表明即使你不使用缩写,这也是可行的。

提示:确保你的。csv 文件没有用,分隔,否则您可能会遇到由于城市、州对中的,而导致的解析错误。

代码:将城市名称转换成地理位置

首先,我们从导入语句开始:

然后,我们为。csv 文件和您的谷歌地图 API 密钥:

**注意:**这不是传入此信息的唯一方式,但这是的一种方式,有助于确保您不会意外地通过硬编码或在存储库中留下包含您的 API 密钥的文件而暴露 API 密钥。

接下来,我们将定义一个调用 Google Maps 地理位置 API 的函数,将每个城市转换为地理位置(即纬度和经度元组):

这里面有很多东西,所以让我们稍微分解一下。

  • 函数变量:geo变量是您稍后将在脚本中调用的城市列的占位符。api_key不言自明。
  • API 请求:payload遵循 Google Maps 地理定位 API 接受请求参数的格式,在下一行填入params。在这种情况下,geo将指城市。
  • JSON 数据角力: rLocation将原始的 JSON 位置数据收集到一个变量中,然后用这个变量通过解析 JSON 结果找到latitudelongitude
  • 错误处理: 如果你不熟悉tryexcept关键字,这是 Python 中的基本错误处理。这里我们通过传递None值来处理任何IndexError
  • 返回: 最后,我们以latitude, longitude元组的形式返回数据。

**提示:**如果这是您第一次使用 Google Maps 地理定位 API ,我建议在您的 web 浏览器中单独调用该 API,这样您就可以自己查看原始的 JSON 结果,并理解上面完成的复杂解析(特别是如果该 API 在将来更新的话)。

现在我们已经定义了这个函数,我们可以开始使用我们的数据了。

从这里开始,我们来读你的原著。csv 文件转换成 DataFrame,并创建一个空列表,我们将在下一步填充它。

然后我们将遍历city列的每一行,用每个城市填充我们的列表。

还记得在我们的geoGoogle()函数中,我们如何将latitude, longitude作为一个元组返回吗?我们也为此做了准备,创建了latListlonList来存储这些值作为 DataFrame 新列。

现在我们开始这个脚本的核心部分:使用在geoGoogle()中返回的元组将城市名转换成它们的latitude, longitude对。这些然后被存储在我们上面创建的列表中,然后使用pd.Series转换成我们的数据框架df中的新列。

如果您想自己确认生成的纬度和经度是正确的,您会注意到我包含了一个可选的打印语句。

然后我们将这个最终数据集导出到一个新的。csv 文件,确保使用;分隔符,以避免由于城市的city, state文本格式导致的解析错误:

最后,作为最后一笔,我们可以添加一条打印消息来通知用户脚本已经运行完毕,以及生成的新数据文件的名称(将在原始文件名的基础上添加一个前缀geo):

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

丹尼斯·库默在 Unsplash 上拍摄的照片

在 Tableau 中创建最终的地图可视化

现在我们已经准备好了数据,我们可以导入新的。csv 文件作为 Tableau 中的数据源。

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

这一步的关键是确保 Tableau 正确解释数据类型。具体来说,我们希望检查LatitudeLongitude列是否被解释为地理数据类型并被赋予适当的地理角色

为您的地图创建新图纸。在Data侧边栏的Measures部分,右击Latitude并导航至Geographic Role > Latitude

这将把数据类型符号从#变为一个地球,代表一个地理数据类型。对Longitude做同样的操作。

从这里开始,您就可以绘制地图了。您可以通过将Longitude拖动到列,将Latitude拖动到行来实现这一点,如下所示。

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

但是这件事有点奇怪。我们的原始数据集中有许多数据点。那么为什么我们在这里只看到一个呢?

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

如果你仔细观察,你会发现,在默认情况下,Tableau 创建了一个集合度量,这次是以平均值的形式。你看到的这个点是你所有地理位置的平均值。

幸运的是,修复非常简单。导航至Analysis > Aggregate Measures并取消勾选Aggregate Measures。这将为我们提供每个地理位置数据点的预期结果。

这样,我们就得到我们想要的输出,一个简单明了的地图,将每个位置显示为下面地图上的一个单独的点。

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

梅丽莎·施密茨 | 制作的图形在 Tableau Public 上直播

从那里,您可以做自己的 Tableau 魔术自定义颜色,大小,标签,工具提示,等等。在上面的图形中,我改变了颜色以匹配我的客户的红色营销,并放大了圆圈的大小,以便作为一个小图形更容易查看。

想要展示的不仅仅是地点吗?只需添加更多数据。

但是,如果你的目标只是显示一个最小的,干净的地图,每个位置都有统一的点,那就完成了!

感谢阅读!

我希望这篇教程能帮助你发现一种新的方法来使用你的其他技能解决 Tableau 中的问题!

我怀疑在 Tableau 中可能有一个更优雅的方法来解决这个问题(或者甚至是一个更简化的 Python 脚本),我鼓励你在评论中提出建设性的质疑。通过这篇文章,我想展示的是,你不必成为每一种工具的大师,或者作为纯粹主义者,只用一种工具解决每一个问题。利用你所掌握的工具有助于全面提高你解决问题的能力。不要害怕尝试。

与任何类型的编程一样,通常有多种方法来解决同一个问题。这就是我选择如何解决我的问题。

如果你想看本教程中使用的完整的原始脚本,你可以在 GitHub 这里查看它:

https://github.com/schmitzmelissa/geocoding-script

或者,如果您想在 Tableau Public 上开始示例可视化,您可以在此处进行操作:

谢谢你的来访!

知道更好的直接在 Tableau 解决这个问题的方法吗?在评论中分享你的专业知识吧!

美化 Python 中杂乱的情节&解决 Seaborn 中常见的问题

原文:https://towardsdatascience.com/beautifying-the-messy-plots-in-python-solving-common-issues-in-seaborn-7372e6479fb?source=collection_archive---------9-----------------------

让我让你的生活更轻松…

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

用 Python 创建可展示的情节可能有点令人生畏。如果你习惯于使用其他 BI 软件甚至 R 来制作你的可视化效果,尤其是这样,因为大多数的图形已经为你美化过了。另一个问题是,事情可能会以多种方式出错,解决问题的方法将取决于你对剧情的选择。在这里,我将演示几种在 Python 中为各种场景轻松创建绘图的方法,并向您展示如何解决每种情况下可能出现的一些问题。

在这篇文章中,我将重点关注效率,并分享一些将使创建视觉上吸引人的情节快速的花絮。

基本设置

Matplotlib中的 Pyplot 是 Python 中绘图的必备。其他库很可能都使用 Matplotlib 作为后端。Seaborn 就是一个例子。Seaborn 增加了一些不错的功能,但是这些功能有时会造成混乱。让我们先导入所有的包。

**import** pandas **as** pd **
import** matplotlib.pyplot **as** plt
**import** seaborn **as** sns
%matplotlib inline 

如果您使用允许您在前端显示图的 iPython 平台,如 Jupyter Notebook,使用%matplotlib inline显示图。

添加样式

如果你只是想要一些像样的东西快速运行,我强烈推荐分配一个的剧情风格。剧情风格瞬间将多种风格元素应用到你的剧情中,省去一些麻烦。提前指定样式的另一个原因是保持整体外观的一致性。如果在文档中使用不同的绘图方法(sns, plt, pd),可能会导致不一致的绘图。

**plt.style.use**('plot-style-name-goes-here') 

哪种风格是最好的?

我特别喜欢fivethirtyeight的知名度和简单性。学术界的观众可能更熟悉ggplot style,因为它是 r 中的一个流行库。参见下图来比较一些风格。

seaborn很棒,但是它有太多的选择,可能超过了我们现在想要的。如果您想查看可用样式完整列表,请运行plt.style.available。展望未来,我将使用fivethirtyeight来风格化我所有的情节。

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

作者图片

问:我必须使用 Matplotlib 绘图吗?

如果你用的是 Pandas,它还附带了一些绘图功能(但它的后端是 Matplotlib)。如果您只想快速查看分布(直方图或密度图)或两列之间的一对一直接关系(折线图或散点图),这将非常方便。

请注意,熊猫绘图不会自动找到最佳绘图类型。默认始终是线形图。

# Pandas plot example - df is a Pandas dataframedf.*column_name*.**plot**(**title** = '*Title*', **kind** = '*hist*')# Above is identical to below using Matplotlib.pyplot ...plt.**hist**(df.*column_name*)
plt.**title**('*Title*')
plt.**ylabel**('*Frequency*')
plt.**show**()# You can also plot relationship between variablesdf.**plot**(**x** = '*column1_name*', **y** = '*column2_name*', **kind** = '*scatter*')

现在我们有了基本的设置,让我们看看不同的场景。

绘制频率/计数数据

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

Seaborn 的 Countplot 提供了一种快速显示每个值出现频率的方法。

sns**.countplot**(df.*column_name*)# to group
sns.**countplot**(**x** = '*column1*', **hue** = '*column2*, **data** = *df2*)

但是有时事情会变得很糟糕…

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

我们在这里看到了一些问题,我们在 x 轴上的刻度标签重叠,图例框在一个不太理想的位置。让我们看看如何解决这些问题。

问:如何旋转标签?

我们可以使用 Matplotlib 覆盖 x 刻度的设置。rotation表示旋转文本的角度,ha(水平对齐)移动标签,使其在右侧对齐。

sns.countplot(x = '*method*', hue = '*number*, data = *df2*)
**plt.xticks(rotation = 45, ha = 'right')**

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

问:如何将图例移出?

要移动图例的位置,我们需要指定图例的位置。我们可以使用 Matplotlib 覆盖图例设置。bbox_to_anchor允许您手动设置图例的位置。如果你只是想把这个放在图的右上角,我们也可以添加位置信息loc = ‘upper right'

sns.countplot(x = '*method*', hue = '*number*, data = *df2*) plt.xticks(rotation = 45, ha = 'right')
**plt.legend(title = '*Number*', bbox_to_anchor = (1, 1))**

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

问:我如何堆叠酒吧?

剧情看起来比较好,但是读起来有点吃力。如果每个方法都堆叠了这些条,就更清楚了。countplot有一个名为dodge的参数,默认设置为 True。如果我们将其设置为 False,它将堆叠条形图。

sns.countplot(x = '*method*', hue = '*number*, data = *df2,* **dodge = *False***) 
plt.xticks(rotation = 45, ha = 'right')
plt.legend(title = '*Number*', bbox_to_anchor = (1, 1))

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

问:顺序似乎是随机的?我如何能改变顺序?

我们的情节看起来更好,但整体顺序似乎非常随机。我们也可以使用countplot手动设置绘图顺序。这个功能也可以作为一个过滤器。(当我们这样做的时候,让我们去掉 x 标签并把它也设置为一个标题。)

sns.countplot(x = '*method*', hue = '*number*, data = *df2,* dodge = *False,* **order = ['Radial Velocity', 'Transit', 'Imaging',         
                       'Microlensing', 'Eclipse Timing Variations'**]) 
plt.xticks(rotation = 45, ha = 'right')
plt.legend(title = '*Number*', bbox_to_anchor = (1, 1))
plt.xlabel('')
plt.title('Method')

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

太好了!现在我们的频率图看起来好多了。

绘制分类 x 定量

使用 Seaborn 的catplot,您可以很容易地尝试许多不同的选项来绘制类别的值。默认情况下, Catplot 是一个带状图,但是您可以通过将kind参数分配给不同的图类型来更改选项,例如boxviolin。只是为了让大家更加迷惑,您也可以通过直接调用它们(例如sns.boxplotsns.violinplot)来绘制这些分类图,并且可用的参数会有所不同。让我们试着修复一个混乱的 catplot。

# first using catplot
sns.**catplot**(**x** = '*year*', **y** = '*distance*', **hue** = '*method*', 
            **data** = df, **kind** = '*box*')

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

哦,不!这一次,它确实将图例放在了外面,但是 x 刻度再次重叠。对于箱线图来说,线条似乎也太粗了,异常值标记非常大。最后,剧情有点太窄了。我们知道如何修复 x 记号,现在让我们修复其他问题。

问:箱线图周围的线条看起来很奇怪,它们太粗了。

为了优化线宽,我们可以手动设置绘图的线宽。

sns.catplot(x = '*year*', y = '*distance*', hue = '*method*', 
            data = df, kind = '*box*', **linewidth = 0.5)**
plt.xticks(rotation = 45, ha = 'right')

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

问:箱线图上的异常值标记太大。

现在,与我们漂亮的新系列相比,离群值似乎不成比例。让我们也把它们变小。如果你想完全删除它们,你可以使用showfliers = False

sns.catplot(x = '*year*', y = '*distance*', hue = '*method*', 
            data = df, kind = '*box',* linewidth = 0.5, **fliersize = 1**)
plt.xticks(rotation = 45, ha = 'right')

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

问:我的情节太狭窄了。怎么才能改变剧情的比例?

最后,整个情节看起来太狭窄了。所以我们试着通过改变长宽比来扩大绘图区域。坡向值改变宽度,保持高度不变。

sns.catplot(x = '*year*', y = '*distance*', hue = '*method*', 
            data = df, kind = '*box',* linewidth = 0.5, fliersize = 1, **aspect = 1.5**)
plt.xticks(rotation = 45, ha = 'right')

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

如果你直接使用sns.boxplot,它将没有aspect参数,我们将需要通过使用 Matplotlib 设置图形大小来改变纵横比。fig = plt.figure(figsize = (w, h))

问:我的绘图在保存到本地时会被切断。

最后,在本地保存时,有时图的标题或图例可能会被裁剪。为了防止这个问题,在保存情节之前调用plt.tight_layout()

今天,我们简要地看了一些使用 MatplotlibSeaborn 在 Python 中设置情节的技巧,以及如何解决使用 Seaborn 时的一些常见问题。如果你经常遇到任何其他问题,请留下评论,我可以添加到帖子中!

新年快乐

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

真诚媒体Unsplash 上拍摄的照片

2022 年成为数据科学家:为期 52 周的实用课程

原文:https://towardsdatascience.com/become-a-data-scientist-in-2022-a-practical-52-week-course-8244cc18284e?source=collection_archive---------1-----------------------

涵盖统计、SQL、Python、数学等内容的完整数据科学课程

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

扎克·杜兰特在 Unsplash 上的照片

如果你一直在考虑转行到数据科学,或者一直在观看自学数据科学的教程,但不确定接下来该学什么,这里有一个完整的 52 周课程,将教你在 2022 年成为数据科学家所需的大部分知识。

该课程涵盖了每个数据科学家都必须知道的东西,如统计学、数学、SQL 和 Python。所有这些都是宽泛的主题,但本课程涵盖了数据科学中大量使用的主题。

请注意,您应该按照本文中列出的顺序学习课程,但是您也可以先学习您最喜欢的科目。例如,我喜欢编程,所以我会先开始学习 Python 和 SQL,但是如果你喜欢概率,那么你应该从统计学开始。

在下面我的 YouTube 视频中,你可以找到成为一名数据科学家需要学习的所有东西的概述。

请务必点击 订阅此处 获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

第 1–10 周:用于数据科学的 SQL

SQL 不仅对于数据科学,而且对于任何与数据相关的领域都是必不可少的。SQL 允许我们使用数据库。作为一名数据科学家,您经常需要从数据库中提取数据来执行您的分析,因此这是一项非常有用的技能,您需要掌握。

这个 4 小时的视频是一个针对初学者的 SQL 课程,它将教你所有你需要知道的关于数据库管理和如何创建 SQL 查询的东西。你将学习使用 MySQL 数据库的 SQL,SQL 理论,一些基本的数据库术语,数据定义语言(DDL),SQL 关键字,数据操作语言(DML),数据控制语言(DCL),事务控制语言(TCL)等等。

让我们更详细地了解一下本课程的课程表(以及我认为数据科学课程中最重要的部分)

  • 关系数据库的核心概念(表和键)
  • SQL 基础知识(DDL、DML、DCL 和查询)
  • 如何创建表和插入数据(创建、删除、插入)
  • 逻辑和比较运算符
  • SQL 约束(非空、唯一、主键等)
  • 聚合(计数、总和、最小值、最大值)
  • 更新和删除(更新,哪里,删除)
  • 基本查询(SELECT …FROM、ORDER BY、LIMIT 等)
  • 通配符(%,_)
  • 联合和联接(内部联接、左联接、右联接等)
  • 嵌套查询

第 11–18 周:学习数据科学的统计学和概率

我们使用数据科学中的统计学来分析和解释数据。统计有助于我们发现异常,以便在项目中区分最佳数据并删除不必要的数据。所有这些都是至关重要的,以确保我们用来训练我们的模型的数据没有偏见。

学习数据科学的统计学

这段 1 小时的 YouTube 视频涵盖了的描述性统计。您将学习不同类型的数据,如何构建直方图和散点图,如何找到平均值、中值和众数,学习偏度、方差和标准差,并查看一些实际示例。

本教程涵盖了正态分布。这是统计学中最重要的概念之一。这是推断统计学的基础(我们对数据点的推断大多基于正态分布)。

本单元的所有视频教程都涵盖了置信区间。您将学习置信区间、如何估计人口比例以及如何估计人口平均值(您将在此学习 t 统计)。

最后,本单元所有视频教程涵盖假设检验。您将学习一些重要的概念,如 p 值、错误类型(I 型和 II 型错误)和显著性检验。除此之外,你将学习如何构造一个关于比例的测试。

学习数据科学的概率

本单元的前 8 节涵盖了概率的基础知识。在那里,您将学习数据科学所需的所有概率概念,如基本理论概率、使用样本空间的概率、基本集合运算、实验概率、随机性、加法规则、独立和相关事件的乘法规则以及条件概率。

该单元包括计数、排列和组合。您将首先学习如何使用树形图和花图计算结果。然后你将学习排列和组合背后的概念,并看到一些应用。

最后,在这个播放列表中,你会发现很多离散分布的教程,作为一个数据科学家你应该知道。至少学习伯努利分布、二项式分布、泊松分布和均匀分布(这里有一些离散分布的概述),而在第二个播放列表中,您会发现一些您也应该知道的连续概率分布(正态分布、学生 T 分布、卡方分布、指数分布和逻辑分布)

第 19–25 周:学习数据科学的数学

数据科学中广泛使用的数学分支有两个:微积分和线性代数。这是理解稍后将使用 Python 实现的机器学习和深度学习模型的基础。

这个第一线性代数单元涵盖了向量和空间。您将学习线性代数的向量、线性组合和跨度、线性相关性和独立性、子空间和子空间的基础、向量点积和叉积以及矩阵。

第二线性代数单元都是关于矩阵变换。它涵盖了函数和线性变换,变换和矩阵乘法,反函数和变换,如何找到逆和行列式以及如何转置一个矩阵。大部分这些东西都可以用 Python 通过几行代码来完成,但是了解它背后的数学原理对你是有好处的。

微积分 1微积分 2 单元涵盖了基本的数学知识,如导数、微分方程、积分、级数以及它们的应用。

第 26–52 周:为数据科学和机器学习学习 Python

学习面向数据科学的 Python 不仅包括听课,还包括解决练习和项目,因此这可能比其他科目需要更多的时间。在之前的一篇文章中,我分享了在 2022 年学习数据科学 Python 的完整的 26 周课程。

课程分为 4 个主要部分:

  • 数据科学的 Python 核心概念
  • 用于数据分析的 Python
  • 用于数据可视化的 Python
  • 用于机器学习的 Python

每个部分都有免费的视频教程、指南、练习和项目,可以帮助您掌握 Python 数据科学。所有的免费资源都可以在下面的文章中找到。

与 6k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑报名成为一名媒体成员。每月 5 美元,让您可以无限制地访问数以千计的 Python 指南和数据科学文章。如果你使用我的链接注册,我会赚一小笔佣金,不需要你额外付费。

https://frank-andrade.medium.com/membership

如何在不编码的情况下成为一名出色的数据科学家(+工程师)

原文:https://towardsdatascience.com/become-a-data-scientist-or-data-engineer-without-coding-skills-fbf11ac8e278?source=collection_archive---------2-----------------------

从数据中获得意义是常识。编码技能不是数据科学家或数据工程师的超能力。

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

数据科学家和数据工程师不需要编码技能。——照片由 PexelsLukas 拍摄

如果你梦想成为一名 数据科学家或数据工程师 ,你可能会在那个梦里看到一个充满代码的黑屏。打磨你的编码技能可能是你在这个旅程中得到的流行建议。然而,令人惊讶的是,它 与编程无关。

数据科学是从原始记录集合中获取意义的过程。编程语言只是一种工具。它就像一个用来做饭的容器。但是容器本身并不是食物。

人们对数据科学失去兴趣是因为有些人不擅长编程。他们甚至无法理解像 Python 这样直观的语言。然而,对其他人来说,这很自然。但这些不是能力,而是不同的能力。

这个故事会改变你的视角。即使你不会或不想编程,你也可以成为一名杰出的数据科学家。 批判性思维和一些数据素养 会让你甚至有能力管理一个数据项目。

今天我们有 不需要编码技能的技术 开始数据科学。他们还有 几个程序员没有 的好处。由于它们的直观性和较少的依赖性,我向所有渴望成为数据科学家的人推荐它们。

我们将在本帖中讨论 KNIME 分析平台。只需要常识就能理解数据。另一个流行的替代是rapid miner。两者都已经存在了一段时间,许多公司也在生产中使用它们。然而,在我看来,他们仍然被低估了。

在继续之前,我们先让你成为一名数据科学家和数据工程师。

用 KNIME 启动数据科学,无需编写任何代码。

你可以下载并像其他应用程序一样在你的电脑上安装 KNIME 。该软件是免费和开源的。 你可以用它来搭建 数据管道,数据角力,训练机器学习模型,实时预测。这几乎是大多数数据科学家和数据工程师的工作。

假设您正在为一家零售连锁店创建一个 客户细分引擎 。您从两个不同的系统接收数据。一个是包含客户人口统计信息的表,另一个是关于他们购买模式的表。您的任务是每天在收到新数据时更新分类表示。

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

数据科学和数据工程项目的工作流程—由作者创建的图像。

这个 的第一部分是一个 ETL。 就是我们例子中的数据工程部分。我们从不同的数据源中读取数据(提取、连接它们、过滤(转换)并保存(加载)数据以备将来参考。

的第二部分,我们创建了一个 K 均值聚类引擎。 这是我们例子中的数据科学部分。它从保存的路径中读取数据,执行聚类,并输出一个表。输出表包含每个客户的分类标签。

关于 KNIME 的界面需要了解什么?

该界面有许多令人难以置信的功能。然而,对于这个介绍性的练习,我们只对两个组件感兴趣。节点存储库在左下角,工作流编辑器在中间。编辑器右侧的描述小部件也很有帮助。

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

截图来自作者。

KNIME 背后的工程团队完成了一项了不起的工作。他们已经为数据科学家将执行的几乎每一项活动创建了节点。我们可以从节点库中搜索任何节点。

您可以将这些节点中的任何一个拖到编辑器中。双击任意节点;您会看到一个配置窗口。您可以在此窗口中进行活动运行所需的所有设置。

您可以通过单击任何节点来调出它的即时文档。它将解释所有的输入要求和节点将返回什么。

从数据源读取数据-提取。

在 KNIME 中,有几种方法可以从数据源中提取数据。您可以读取文件、查询数据库、调用 REST 端点等。

在本例中,我们从本地文件系统中读取了几个 CSV 文件。您可以在节点存储库中搜索 CSV reader 节点,并将其拖到编辑器中。

当你把它拖到主窗口时,你会看到红色的交通灯在节点的下面。说明我们还没有配置。您可以双击它并将其配置为从文件路径中读取。

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

作者截图。

你可以看到指示器现在是黄色的。这意味着该节点已准备好执行。右键单击节点并选择执行。现在指针变成绿色。节点执行成功。

您可以通过右键单击并选择列表中的最后一个元素来查看结果。在 KNIME 中,最后的几个选项总是该节点的输出。CSV reader 节点只输出一项——文件表本身。

在本例中,我正在读取两个 CSV。你可以从这个 Git 库下载它们。

执行连接、过滤等。—转换。

KNIME 有直观的节点来执行各种数据争论任务。在这个例子中,我们使用了其中的两个——连接和行过滤器。您可能需要执行宁滨、规范化、删除重复和空值等操作。

转换一个变量并聚合它是一种常见的任务。这种技术通常被称为 map-reduce 操作。

它们都是 KNIME 中的另一个节点。

我从存储库中取出了 joiner 节点。使用鼠标,我将 CSV 节点的输出(右)与 joiner 节点的输入(左)连接起来。您可以通过选择每个表的列来执行连接操作,从而配置该节点。

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

作者截图。

与 CSV 阅读器节点不同,连接器节点有三个输出。如果您将鼠标悬停在它们上面,工具提示会解释它们是什么。第一个是连接结果。在我们的例子中,我们不使用第二个(左不匹配)和第三个(右不匹配)。

接下来,让我们提取行过滤器节点,并将其与 joiner 节点的输出连接起来。我们可以将其配置为删除一次性购买的客户。将 visit_count 变量的下限设置为 2。

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

作者截图。

保存输出—加载。

ETL 管道的最后一部分是将数据加载到持久存储中。我们不想让这个例子变得复杂。因此我们将其写入 CSV。但是,在实际项目中,您可能必须将其加载到数据库或数据仓库中。不用担心;KNIME 在任何情况下都有帮助。

我抓取了 CSV writer 节点,并以与 CSV reader 非常相似的方式对其进行了配置。

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

作者截图。

这最后一部分总结了 ETL 管道。这是数据工程师的一项重要任务。在 LinkedIn 上找一些职位描述,自己看看。

无需编码即可执行机器学习任务。

我们有干净的数据,并准备好建立令人兴奋的东西。在这个例子中,我们提出了一个市场细分问题。为此,我们将使用 K-Means 聚类算法。同样,您可以在 KNIME 中执行几乎任何机器学习算法,而无需编写一行代码。

K-Means 根据客户属性的相似性创建客户群。除了使用哪些属性,我们还可以指定需要多少个组。

让我们从存储库中取出 k-Means 节点,并将其与行过滤器节点的输出连接起来。我们可以配置它,根据客户的年龄和访问次数将客户分成四个集群。

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

作者截图。

执行节点后,您可以检查输出。您将获得每个客户的分类标签和每个分类的摘要。

我在这个例子中选择 K-Means 是因为它简单。对于大多数机器学习应用程序,您有几个其他任务要执行。重新训练一个模型也很重要。

KNIME 的 youtube 频道有许多有见地的视频来帮助你的数据科学之旅。

在 KNIME 中可视化您的分析。

大多数数据科学项目的最后部分是可视化见解。Tableau 等商业智能(BI)平台专门研究这一领域。你可以连接 KNIME 与他们进行高级分析。然而,场馆本身支持基本的可视化。商业智能平台对更广泛的受众来说是极好的。但是对于数据科学家来说,KNIME 的可视化节点已经足够了。

我们将使用散点图节点在用于聚类的两个变量之间创建一个图表。但在此之前,让我们在工作流中放置一个颜色管理器节点。

与其他可视化工具不同,我们需要在绘制记录之前对其进行着色。

您可以选择颜色和用于颜色选择的变量。然而,在这个例子中,我们对缺省值很满意。颜色管理器为它选择聚类标签,默认颜色也很好。

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

作者截图。

我们现在可以将散点图节点添加到工作流中。让我们将其配置为使用 x 轴中的年龄和 y 轴中的访问计数。此外,请确保您勾选了“在输出时创建图像”复选框。

现在,您可以执行散点图节点并调出图像输出。您也可以使用图像写入器节点将结果导出到文件中。

如果你需要参考,下面是最终的工作流程。

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

作者截图。

最后的想法

非常好。我们建立了一个完整的数据管道,没有一行代码。它涵盖了 ETL,这是数据工程师的一项重要工作。此外,我们还建立了机器学习模型,并将它们的输出可视化。

非常好。我们建立了一个完整的数据管道,没有一行代码。它涵盖了 ETL,这是数据工程师的一项重要工作。此外,我们还建立了机器学习模型,并将它们的输出可视化。

编程对于数据科学是必不可少的是一个神话。这两者是相关的。但它们并不相互依赖。

我不主张完全避免编程。在某些时候,你需要它。例如,数据科学中的一项最新发现可能还没有出现在 KNIME 中。这个平台可以很好地执行已经存在并受欢迎的内容。

还有,如果你是数据科学研究者,KNIME 只有一点用处。你需要用你自己的代码来构建你自己的算法。

由于这个原因,KNIME 本身为程序提供了灵活性。标准安装已经有了 Java 和 JavaScript 节点来完成这项工作。还可以扩展使用 Python 等语言。

重点是,你不需要每次都编码。

谢谢你的阅读,朋友。看来你和我有许多共同的兴趣。也一定要看看我的个人博客

LinkedInTwitterMedium上跟我打招呼。我会为你打破僵局。

还不是中等会员?请使用此链接 成为会员 因为我为你免费推荐赚取佣金。

成为更高效的 Python 程序员

原文:https://towardsdatascience.com/become-a-more-efficient-python-programmer-3850c94b95a4?source=collection_archive---------11-----------------------

了解用 Python 创建列表和完成其他任务的最佳方式

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

照片由 Gema SaputeraUnsplash 上拍摄

任何 python 程序员的目标都是编写可读性最强、计算效率最高的代码。在之前的教程中,我们介绍了用 python 创建列表的几种方法,包括使用 for 循环、map 和 filter 函数以及列表理解。但是哪一个可读性最强并且需要的执行时间最少呢?

在本教程中,我们将使用 Python timeit 模块,首先通过测量它们的执行时间来比较在 Python 中创建列表的所有三种方法的性能,包括 for 循环、map 函数和列表理解。

之后,我们将比较 reduce 函数和一些完成相同任务的内置或专用 Python 函数,并比较它们的执行时间。

要查看 lambda 函数、map 和/或 reduce 函数和/或 list comprehensions,请查看:

创建列表

我们将创建一个包含从 0 到 9 的平方值的数字列表。为此,我们将创建三个函数,一个使用 for 循环,一个使用 map 函数,一个使用 list comprehensions。我们将在这些函数中用来循环的 iterable(我们可以循环的东西)将是一个 range 对象,它是由 python 中内置的 range 函数创建的。

在我们创建这三个函数之后,我们将使用 timeit 模块来测量所有三个函数的执行时间,以便衡量所使用的每种方法的计算效率。

我们开始吧!

For 循环

创建这个列表的一种方法是使用 for 循环遍历 range 对象,并将平方值追加到新列表中。

这是我们如何用代码实现的:

def for_loop():
    squared_list = []

    for num in range(10):
        squared_list.append(num**2) return squared_list

注意我们是如何在 range 对象上循环的,这个对象是由 range 函数创建的,名为 range(10) 。这是一个可迭代的对象,我们可以使用 for 循环来遍历它,这将为我们提供从 0 到 9 的整数。我们也将在其他函数中使用这个相同的对象。

地图功能

制作这个列表的另一种方法是使用名为 map 的内置 python 函数。 map 函数接受两个参数:我们想要应用的函数和我们想要应用它的可迭代对象或序列(比如本例中的 range 对象)。换句话说,map 函数将这个函数映射或应用到我们传入的 iterable 对象的每个元素。

地图(函数,可迭代)

我们可以使用下面的代码利用 map 函数创建上面的列表:

def map_func():
    return list(map(lambda num: num**2, range(10)))

我们使用一个 lambda 函数(匿名函数)作为我们传递给 map 函数的函数,当它遍历 range 对象时,它接受 num 并返回 num 的平方。

记住,map 函数将返回一个 map 对象,它是一个迭代器。如果我们想从这个 map 对象创建一个列表,我们需要将 map 对象传递给内置的 list 函数。

列出理解

我们将编写的最后一个函数将使用 list comprehensions 来创建我们想要的列表。列表理解允许我们从其他序列(或可迭代对象)中以一种非常简洁但可读性很高的方式创建列表。

列表理解由括号组成,括号包含一个表达式,后跟一个 for 循环,以及零个或多个 for 或 if 子句。

中的

我们将使用 list comprehensions 遍历另一个 iterable 对象,特别是 range 对象,并添加从 0 到 9 的数字的平方,如下所示:

def list_comprehension():
    return [num**2 for num in range(10)]

性能比较

为了测量每个函数花费的时间,我们将使用 python 内置的time it模块。这个模块将为我们提供一种简单的方法来测量运行这些函数所花费的时间。

首先,我们将导入 timeit 模块。然后从那个模块我们将使用 timeit 函数。 timeit 函数接受多个参数;但是,我们将只传入一个,其他的使用默认值。

timeit . timeit(stmt = ’ pass 'setup=‘pass’timer= <默认定时器>number=1000000globals=None )

我们将传入的参数是我们想要运行的函数( stmt 参数)。我们可以用 number 参数指定我们希望该函数运行的次数,而 timeit 函数将返回总的执行时间。

我们将每个函数运行 100 万次(这是默认值)。下面是我们的代码和结果:

*import timeitprint(f'Time for the for loop: {timeit.timeit(for_loop)}')
print(f'Time for map: {timeit.timeit(map_func)}')
print(f'Time for the list comprehension: {timeit.timeit(list_comprehension)}')**Results:****Time for the for loop: 3.5020802999999887
Time for map: 4.0746793999999795
Time for the list comprehension: 3.3324222999999904***

正如我们在上面看到的,理解一个列表花费了最少的时间,只有 3.33 秒。for 循环略微落后,为 3.50 秒,map 函数的执行时间最长,为 4.07 秒。

基于这些结果,以及列表理解通常比映射和过滤函数以及 for 循环更容易阅读和理解的事实,使列表理解成为我创建列表的首选方法。

* *

减少功能

我们现在将比较 reduce 和使用 for 循环的执行时间。然后,我们将 reduce 与一些相应的内置或专用 Python 函数进行比较。

Reduce 与 For 循环

我们将编写两个取数字 1 到 9 的乘积的函数。一个函数将使用 for 循环,另一个将使用 reduce 函数。

带 For 循环的函数

*def for_loop_prod():
    product = 1

    for num in range(1,10):
        product*=num

    return product*

我们要将 1 和 9 之间的数相乘,得到它们的乘积,这将由 range(1,10) 提供。我们创建变量 产品 并将其设置为 1。然后,我们使用 for 循环遍历 range 对象,并将每个数字乘以上一次迭代的结果。在循环数字 1-9 之后, 乘积 或累加器将等于 362880,我们将返回该值。

在我们编写将使用 reduce 的函数之前,让我们简单回顾一下 reduce 函数。

什么是 reduce?

简单地说,reduce 函数接受一个 iterable,比如一个 list,或者在本例中是 range 对象,并将其缩减为一个累积值。reduce 函数可以接受三个参数,其中两个是必需的。两个必需的参数是:一个函数(它本身接受两个参数)和一个 iterable。第三个参数是一个初始化器,是可选的。

reduce(函数,可迭代[,初始值设定项])

要使用 reduce 函数,我们需要按如下方式导入它:

*import functoolsorfrom functools import reduce*

reduce 接受的第一个参数,函数本身必须接受两个参数。Reduce 然后将这个函数累积地应用到 iterable 的元素上(从左到右),并将其减少到一个值。

因此,我们可以使用 reduce 函数来计算数字 1–9 的乘积,如下所示:

*def reduce_prod(): 
    return reduce(lambda x,y:x*y, range(1,10))*

我们的 iterable 对象是 range 对象。我们的λ函数接受两个参数, xy 。Reduce 将首先获取 range 对象的前两个元素 1 和 2,并将它们作为参数 xy 传递给 lambda 函数。**λ***函数*返回它们的乘积,即 1 * 2,等于 2。Reduce 随后将使用这个累加值 2 作为新的或更新的 x 值,并使用 range 对象中的下一个元素 3 作为新的或更新的 y 值。然后,它将这两个值(2 和 3)作为 xy 发送给我们的 lambda 函数,然后返回它们的乘积 2 * 3 或 6。然后,这个 6 将被用作我们新的或更新的 x 值,range 对象中的下一个元素将被用作我们新的或更新的 y 值,即 4。依此类推,直到到达 range 对象的末尾。换句话说,x 参数用累积值更新,y 参数从 iterable 更新。

性能比较

我们将再次使用 timeit 函数来测量上述 for 循环和 reduce 函数的执行时间。

*import timeitprint(f'Time for a for loop: {timeit.timeit(for_loop)}')
print(f'Time for reduce: {timeit.timeit(reduce_function)}')**Results:****Time for a for loop: 1.0081427000004624
Time for reduce: 1.684817700000167***

正如我们所看到的,与 reduce 函数相比,for 循环的执行时间更少。然而,在我们决定使用 for 循环来完成类似于获取 iterable 的乘积的任务之前,让我们看看专用函数在计算效率方面能提供什么。

* *

减少与专用功能

我们将 reduce 函数与四个专用的 Python 函数进行比较: prodsummaxminprod 函数实际上在 math 模块中,所以这是我们需要首先导入的唯一函数。

以下是接受 range 对象的乘积、总和、最大值和最小值的函数:

***Product:**def reduce_prod(): 
    return reduce(lambda x,y:x*y, range(1,10))def math_prod():
    return math.prod(range(1,10))**Sum:**def reduce_sum(): 
    return reduce(lambda x,y:x+y, range(1,10))def builtin_sum():
    return sum(range(1,10))**Max:**def reduce_max():
    return reduce(lambda x,y: x if x > y else y, range(1,10))def builtin_max():
    return max(range(1,10))**Min:**def reduce_min():
    return reduce(lambda x,y: x if x < y else y, range(1,10))def builtin_min():
    return min(range(1,10))*

以下是他们的执行时间:

*print(f'Time for reduce product: {timeit.timeit(reduce_prod)}')
print(f'Time for math prod: {timeit.timeit(math_prod)}')print(f'Time for reduce sum: {timeit.timeit(reduce_sum)}')
print(f'Time for builtin sum: {timeit.timeit(builtin_sum)}')print(f'Time for reduce max: {timeit.timeit(reduce_max)}')
print(f'Time for builtin max: {timeit.timeit(builtin_max)}')print(f'Time for reduce min: {timeit.timeit(reduce_min)}')
print(f'Time for builtin min: {timeit.timeit(builtin_min)}')**Results:****Time for reduce product: 1.7645603999999366
Time for math prod: 0.5869173999999475****Time for reduce sum: 1.4824804999998378
Time for builtin sum: 0.4908693999998377****Time for reduce max: 1.6678851000001487
Time for builtin max: 0.591082900000174****Time for reduce min: 1.5096722000000682
Time for builtin min: 0.6109481999999389***

在所有情况下,专用 Python 函数的性能明显优于 reduce 函数。如果我们将数学 prod 函数与上面的 for 循环进行比较,prod 函数的性能要比 for 循环好得多。

结论

看起来,如果 Python 中有一个专门的函数来做我们需要的事情,我们应该使用它,因为它很可能会比用 for 循环或 reduce 函数编写自己的代码给我们带来更好的性能。

注意:**我们可以通过传入操作符函数而不是 lambda 函数作为参数来获得更好的性能。例如,在上面的 sum 函数中,我们可以传入操作符。add 作为 reduce 的函数参数,这将比使用 For 循环提供更好的性能。

因此,如果内置或专用的 Python 函数尚不存在,那么 reduce 函数可以与关联运算符函数一起使用,如果这是一个选项的话。否则,一个编写良好的 for 循环对于可读性和性能来说是最好的。

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 报名,我会赚一小笔佣金。

*https://lmatalka90.medium.com/membership *

摘要

在本文中,我们看到了用 Python 制作列表的不同方法的性能:使用 for 循环、map 函数和列表理解。我们看到,列表理解通过具有最低的执行时间,在这些方法中提供了最大的可读性和最好的性能。接下来,我们看到了使用 for 循环、reduce 函数和一些内置函数的性能。我们发现内置函数大大优于 reduce 函数,并且在较小的程度上,使用 for 循环。总之,为了创建列表,我建议尽可能使用列表理解,而不是使用 reduce 函数,使用专用函数来获得更好的可读性和性能。

成为一名没有编码和技术知识的数据科学家

原文:https://towardsdatascience.com/becoming-a-data-scientist-without-prior-coding-and-technical-knowledge-3d2deea1daa8?source=collection_archive---------47-----------------------

通往数据科学的非编码、非技术之旅

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

照片由 Unsplash 上的 Dmitry Ratushny 拍摄

如果你在这里,你可能会好奇一个没有编码、没有软件工程经验(来自一个完全不相关的领域)的人是如何进入数据科学的。

只是为了让你知道你是否想留下来,我希望为你回答这些问题:

  1. 我如何准备好过渡到数据科学?
  2. 我现在必须开始培养的必备技能是什么?
  3. 我如何开始学习?
  4. 数据科学的研究生学习适合我吗?
  5. 作为一名非技术出身的数据科学家在科技公司工作是什么感觉?

在本文中,我不会与您分享学习数据科学的确切课程或途径。

已经有很多关于这方面的文章了。我不认为这些年来学习的基本领域发生了变化。

可能会有新的技术栈,或尖端的图书馆,或新的训练营或课程发布,但实用数据科学所立足的基础保持不变。

我能提供的更详细的信息是我阅读和参加的向数据世界过渡的书籍、课程和程序,以及我为进入数据科学领域所做的准备。

如果它对我有效,谁知道它可能对你也有效。

我如何准备好过渡到数据科学?

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

弗朗西斯·达·席尔瓦在 Unsplash 上的照片

一个小小的背景故事。

我曾经梦想发明新的神奇材料。我一生中花了相当多的时间在实验室里接受培训,以成为一名化学家(和一名材料工程师)。

我喜欢把东西放在一起创造更好的,潜在的更有用的东西的想法。六年来,我正式接受训练,成为我所在领域的专家(包括在美国的研究生学习),在实验室内外度过时光。

然而,在我作为本领域学生的某个时候,我意识到我创造新的、有用的东西的愿望并没有被限制在实验室里。大约在 2016 年末的这个时候,我了解了数据科学。

巧合的是,也是在那个时候,我决定要温习一些几乎没什么用的高中编码知识,作为一种爱好,我必须学习一些新的东西。

转折点。

随着我对数据科学的了解越来越多,我了解到它并不像我想象的那么陌生。这是解决问题的同一种科学方法——但不是使用不同种类的化学品处理技术来获得想要的输出,而是使用数据统计数据

当我知道如何编写代码,如何使用我在大学学到的现有统计和数学知识,以及我过去学到的研究和实验方法,并在特定的商业环境中使用它来解决问题时,我的内心感到不安——几乎与我最初追求成为一名研究科学家时的感觉一样。

就在那时,我决定温习编码技能,不是为了爱好,而是为了学习如何用它来解决数据问题。

要过渡到像数据科学这样的新领域,请记住以下几点:

  • 有很多东西要学——就像很多很多。没有捷径可走。即使是现在,我几乎每天都在学习。
  • 你需要学会如何学习。知道哪种学习媒介适合你。虽然,我现在告诉你,没有逃避的书,阅读大量的文本。(我提到阅读和编写文档了吗?)学习如何学得最好是一种可以帮助你更快积累知识的技能。
  • 要成为数据科学家,你需要了解你将做出的取舍。这可能意味着你需要连续几个小时学习,一些周末计划被取消,一些深夜会议处理你的文件夹,等等。— 你知道程序
  • 请记住,没有人天生就是数据科学家。当你不明白某件事时,不要轻易不知所措。伟大的人曾经也很糟糕。

此外,要准备过渡,尽可能熟悉话题是很重要的。

我推荐阅读关于数据科学的文章、书籍、研讨会和会议。

我建议你先阅读商业应用,以便在这个领域获得更多的立足点,并对它有更多的了解。

这里有一些很好的书籍可供阅读:

</21-data-science-books-you-should-read-in-2021-db625e97feb6>

我可能会将我对数据科学的热情归因于从我阅读的早期书籍中了解到的公司如何利用数据来做令人惊讶的事情(不要忽视对数据的一些边缘道德使用,这是另一个话题)

谢天谢地,现在的在线资源比五年前丰富多了,更不用说很多都是免费的。

所以,坐下来,上谷歌,做一块海绵,尽可能多地吸收。

我现在必须开始培养的必备技能是什么?

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

韦斯·希克斯在 Unsplash 上的照片

数据科学有三大支柱,即:编程统计业务(领域专长)。通常,我们参考这三个领域的维恩图来定义什么是数据科学家。你可能已经看到了。

简而言之,要开始学习数据科学,您需要掌握三大主题的工作和实践知识。

要知道从哪里开始,我建议直接从你的最薄弱的环节开始。

如果你在大学里已经知道一点数学和统计学,但是从来没有写过一行代码,那就去学编程吧。

如果你是一个业余编程爱好者,但几乎不知道什么是正态分布,那就去查阅和学习统计学吧。

要快速学习,重要的是学习要尽可能直接,尽可能投入。

至于商业,除非你有自己的企业,否则你最好读一些商业书籍和一些不错的老哈佛商业评论。

对我来说,我已经开始描绘我知道的和不知道的。

我确定了编程、统计和商业中对实用数据科学至关重要的哪些子主题是我已经熟悉的,而不是一无所知的。作为我第一次尝试转行的一部分,我决定我需要学习 Python 编程。

然而,就像任何其他具有潜在陡峭学习曲线的学科一样,对我来说,学习我的舒适区之外的东西是一场斗争。

我知道我需要以一种有趣和可以忍受的方式学习。就在那时,我偶然发现了这本书:如何用 Python 自动化枯燥的东西,作者是 Al Sweigart

https://automatetheboringstuff.com/

顾名思义,这本书不是正式文本。它试图取笑我们每天做的许多平凡的任务,并取笑我们以前没有做任何事情来自动化这些任务。

所以我从那本书开始。

此外,我开始在数据科学的背景下审视我的研究生课程。我选修了一门关于高级回归方法的额外课程,以更多地了解高级统计学如何在研究中用于预测事物。

此外,我开始研究人工智能是如何在我的领域中创新的(并了解到我的导师在他的论文中已经做了很多这样的事情!)

就主题而言,重点关注三大领域:

  • 编程;编排
  • 统计数字
  • 商业

如果可能的话,试着由内而外地工作,看看你现在在做什么,看看你可以通过写代码、用统计数据更好地分析数据,以及在你目前的工作中应用一些好的商业或领导实践来改进什么。

你会惊讶地发现,通过首先在内部学习和思考这些主题,你在任何其他背景下学习数据科学都会变得更加容易。

我如何开始学习?

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

照片由 Siora 摄影Unsplash 上拍摄

现在学习的方法太多了,可能会让人不知所措。

除了书籍和正规教育,你现在有了 Youtube 视频,像 UdemyEdXCoursera ,像 DatacampDataquest 这样的互动教育平台,甚至还有关于数据科学的播客

现在,对数据科学一无所知是一种罪过。

我敢肯定,如果你之前问过谷歌关于数据科学的问题,你很可能会被你必须利用的课程和订阅广告轰炸。

不过,棘手的是:

每个人的学习方式不同。

这就是为什么学习如何学得最好很重要。

至于我,我从一个全面结构化的自定进度在线计划开始。

我从微软教授的 EdX 学习课程开始了我的旅程。那时,Udemy 上没有很多高质量的课程,我发现 Youtube 太过杂乱,无法成为一个有效的学习工具。

此外,我还不想从约翰霍普金斯大学的热门课程中学习 R。我想建立在我现有的 Python 知识的基础上,所以参加微软的课程对我来说是有意义的。

我花了一些时间完成所有 10 门课程。它不同于正规学校教育,非常实用。没有人强迫我完成这个项目,所以对我个人来说回报更大。

数据科学的研究生学习适合我吗?

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

琪琪·奥尼肯Unsplash 上拍摄的照片

开门见山地说,是的,我的确上过数据科学的研究生课程。

我这样决定并不是因为我参加的 MOOCs 没有帮助,而是因为我只是渴望结构。更重要的是,我把研究生学习看作是我进入一个充满活力的社区的跳板,这个社区对我想要成长的领域充满热情。

正如我提到的,很多在线学习是分散的,高质量的材料很难找到。有时候,我们不承认我们没有从刚买的课程中得到实惠,因为我们已经为它支付了 xxx 美元。

虽然正式的校内项目也是如此,但是很难犯错误,特别是如果你看看外面的优秀项目。

如果符合以下条件,您可能希望进行数据科学方面的研究生学习:

  • 你想要结构化的学习。
  • 你需要一些外部的学习动力,而不是完全自发的。
  • 你会发现额外的凭证很有价值。
  • 你想建立关系网。
  • 如果你以前尝试过自定进度的学习,想要更多的挑战。
  • 如果你有一些经验,只是想在大学环境中提高技能。

对我来说,我发现数据科学的研究生课程非常有价值。

这让我对数据的肤浅理解更加严谨。它帮助我接触到所有其他相关主题,包括软技能培训,如果没有这个项目,我不会有这些培训。

我可以说我在研究生院度过了比以前任何时候都要艰难的几个月。因为同样的研究生项目,我得以在我现在工作的公司获得面试机会。

这并不是说你需要一个数据科学硕士学位才能成为一名数据科学家。这当然不是一个要求。

我认识的很多从事数据工作的了不起的人都没有高学历,但他们是有能力的数据专业人士,能产生影响。

作为一名数据科学家是什么感觉?

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

蒂尔萨·范·迪克在 Unsplash 上拍摄的照片

三年过去了,我终于完成了从非技术职业到数据科学领域的转变。

如果我在脑子里讨论作为一名数据科学家是什么样的,这篇文章会太长,但我可以说:

  • **数据科学是一个令人兴奋的领域,涉及大量的学习、解决问题和打破常规的思考。**如果你想要挑战,每次都想做不同的事情,那么数据科学就是你的职业。我几乎从不长时间做同样的事情。
  • 真如他们所说: 数据科学家花很多时间清理数据,只有很少一部分时间创建模型 **。**在理想世界中,我们希望我们的科学家 100%地实施尖端算法。然而在现实中,这种情况很少发生。
  • 不要低估更简单的模型而忽视更复杂的模型。通常情况下,非线性模型能够以比复杂模型更低的开销提供相同的价值。有时候,这正是业务所需要的,这很好。
  • **如果和数据打交道,需要学习 SQL。**以前不关心 SQL,从来没有这么错过。我曾经相信我可以用 PandasNumpy 来处理我的数据。不幸的是,我得到了惨痛的教训。如果你打算加入一家大公司,他们的数据很有可能是巨大的,而且他们正在使用 SQL 的某种变体。知道如何查询数据是一项非常强大的技能,你应该花时间去掌握。这将为您的数据职业生涯带来巨大回报。
  • **数据科学家是一个不断发展的角色。**你具体做什么,你如何定义成功,取决于你的组织和你所处的商业环境。众所周知,公司和他们对数据科学的期望之间存在脱节。公司仍在尝试组织结构和有效的方式来部署他们的 DS 人才。
  • 对于公司来说,在整个组织内实现数据民主化和分析数据的技能有很大的价值。如果少数数据科学家能够对公司产生巨大影响,想象一下如果每个人都足够精通数据。
  • 数据科学有时会令人沮丧。有时数据中断,有时您的代码中断。有时候你不知道到底发生了什么。有时候你不得不从头再做一遍。

结束语

数据科学是一个令人兴奋的领域。这不仅仅是一些炒作。这是一个为选择投资 It 的企业带来真正价值的领域。虽然,这需要掌握一些硬技能,并倾向于自主学习(无论你是否选择为此接受正规学校教育)。

有了对组件技能的关注和足够的实践,即使没有以前的编码或技术经验,也一定可以过渡到这个领域。

你打算进军数据科学吗?请在评论中告诉我!🙌

如果你喜欢这个,比如说👋在推特上关注我!

成为人工智能伦理学的后起之秀

原文:https://towardsdatascience.com/becoming-an-upstander-in-ai-ethics-577a38b23e45?source=collection_archive---------41-----------------------

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

照片由阿曼达·林斯Unsplash 拍摄

我们不记得敌人的话语,只记得朋友的沉默。

MLK

在过去的 3 个月里,我们已经看到了人工智能伦理领域的巨大变化,我认为我们应该深入思考我们所有人在对世界产生有意义的积极影响方面所能发挥的作用。这种成为人工智能伦理新贵的想法特别强大,我相信在 2021 年,这是帮助我们所有人创建更健康的生态系统的正确方式。

A.为什么这很重要

正如我在关于为什么 2021 年人工智能伦理需要公民能力的文章中所说的,我认为这是一个额外的附加条款,我们需要对这种能力采取行动。我们经常会遇到这样的情况,当我们看到不公正的事情发生在我们身边或发生在我们身上时,我们可以提高嗓门(尊敬地)指出它们。有时,由于担心我们和我们所珍惜的人的安全,我们会回避采取行动。但是,正如我们在开篇所看到的,有时这个决定的代价可能是巨大的。

以下是我认为我们需要成为暴发户的一些关键驱动因素:

  1. 警惕有好处
  2. 避开无知的面纱
  3. 被动也是一种姿态

1.警惕有好处

在我们有健全的法规和其他安全机制之前,我们需要提高警惕,并在谁有权以及何时指出不公正的问题上更进一步。

大赦国际发布的一个有趣的作品谈到拥有一个众包地图,显示城市中监控技术被发现的地方,这是体现这种方法的重要一步。这提高了我们的警惕性,并有助于我们成为有经验证据支持的后起之秀。当我们站起来要求改变时,这些证据为我们的论点增加了更多的实质内容。

2.避开无知的面纱

即使你认为这些事情中的一些目前并没有影响到你,不要忘记罗尔斯关于“无知之幕”的观点,在这个观点中,如果你不知道你会站在那些互动的哪一边,你会想象在一个世界中互动的规则和机制应该是什么。

从本质上说,这意味着即使你目前没有受到歧视,你也不知道将来事情会怎样发展。最好是做一个反对不公正的暴发户,即使这些不公正现在与你无关,这样当你不可避免地成为科技系统造成的其他形式的不公正的目标时,有人会支持你。

3.被动也是一种姿态

有些人可能会说,保持被动,听其自然,希望市场会自我修正,可能是解决这一问题的一种方法。一些人还认为,不采取积极的立场可以帮助他们避免争议,置身于所有这些混乱的问题之外。

但是,请记住,被动的姿态仍然是一种姿态,正如 MLK 的开场白所示,这将会引起他人的注意,并塑造他们对你是什么样的公民的看法。

B.如何着手此事

空谈是廉价的,行动才是一切!

所以,这就带来了一个问题,一旦我们同意扮演一个更积极的角色,成为一个新崛起的人是一个重要的想法,那么首先应该如何去做这件事。

以下是实现这一目标的一个很好的起点:

  1. 即使没有什么进展也要表现出来
  2. 找到你周围对这个主题感兴趣的人
  3. 与社区直接合作,而不是依赖代理人

1.即使没有什么进展也要表现出来

在积极支持正确的事情方面,缺乏进展往往是一个很大的阻碍和令人沮丧的因素。发展迟缓带来的疲劳和对真正利益的忽视甚至会让最坚定的支持者灰心丧气。然而,正如我在我的文章中概述的,为什么 2021 年的人工智能伦理需要公民能力,这些时刻对我们来说尤其关键,我们需要出现并试图产生影响。

在物理学中,有一个叫做限制摩擦的概念,它谈到了一个临界阈值,在这个阈值之上,需要施加一个恒定的力来使物体运动,在越过这个阈值之后,当一个人从静态摩擦域移动到动态摩擦域时,移动物体会变得稍微容易一些。

这些微小进展的时刻与限制摩擦的想法有很多相似之处,我对那些在这个领域工作的人的建议是,在似乎没有进展的时候,增加一点点额外的推力,让事情向前发展,在这个领域创造进展。

2.找到你周围对这个主题感兴趣的人

现在有很多地方性的和有背景的社区在谈论人工智能伦理的话题。虽然我们还没有针对所有人的有效发现机制,但如果你有一些同伴,成为人工智能伦理领域有效的后起之秀的旅程肯定会更容易。

蒙特利尔人工智能伦理研究所(Montreal AI Ethics Institute)及其学习社区(learning communities)和 T2 公共研讨会(public workshops)是结识世界各地志同道合者的绝佳方式。与社区分享你正在做的工作,作为一种提高兴趣的方式,邀请他们参与你的努力,分享你的时间和专业知识,以进一步推动他们的努力,这总是一个伟大的第一步。

3.与社区直接合作,而不是依赖代理人

这一点我怎么强调都不为过!

正如我在我的文章中提到的,为了实现负责任的人工智能,弥合“可信度差距”,有许多人正在做真正有意义的工作,但不幸的是,他们在当前的生态系统中是隐形的,因为我们将证书和荣誉视为我们应该邀请谁参加不同对话的代理。

当谈到与社区合作时,根据我们在蒙特利尔人工智能伦理研究所的丰富经验,我们发现获得洞察力的最有效方法是直接与面临算法系统不公正问题的社区合作,而不是依赖那些可能准确代表他们利益的代理人。

虽然实际去与各种社区交流需要大量的努力和时间,但这绝对是值得的,因为我们可以更全面地了解人们的利益,同时能够以有意义的方式解决这些问题,希望也能得到他们的参与和支持。

C.怎么办?

到目前为止,我们讨论的所有内容都为我们采取行动提供了强有力的理由和动力,但正如我们之前所说的,空谈是廉价的,没有行动什么都不是。那么我们到底应该怎么做呢?

以下行动为任何想要做出真正改变的人提供了一个很好的起点:

  1. 教育自己去理解其中的细微差别
  2. 寻找可以建设性地分享反馈的渠道
  3. 如果你周围还没有社区,帮助建立一个社区

1.教育自己去理解其中的细微差别

对于一个有效率的州来说,一个人必须首先教育自己对问题有一个细致入微和平衡的理解,这样为一个问题辩护时提出的论点才是实质性的。

这也有助于将补救工作引向一个方向,这将产生真正有所作为的变化,而不是可能会推迟一点对话而没有真正解决核心问题的表面变化。

自我教育的优势也将有助于你反击那些肤浅的措施,指出它们在你更深的理解下可能会失败。最终,这是一个很好的方式来推动人们在行动中承担更高层次的责任。

2.寻找可以建设性地分享反馈的渠道

成为新州并不意味着我们必须参与反对建设性方法的行动主义。我们正在寻求变革,这需要我们认识到,我们需要与现有的利益相关者和行为者合作,这样我们才能实施变革,而不是仅仅提出问题,然后不采取任何行动来帮助那些试图将这些建议付诸行动的人。

提供反馈的渠道,无论是从提出问题的人到负责将建议付诸实践的人,反之亦然,都需要是可访问的和透明的,以便在分享反馈和看到反馈被考虑和采纳的过程中,信任不会成为无意中的牺牲。

3.如果你周围还没有社区,帮助建立一个社区

正如我有机会在许多地方阐述的那样,特别是随着蒙特利尔人工智能伦理研究所的成立,当你踏上改变世界的旅程时,一个社区将非常重要。

这一切都始于一个想法的核心,但它要求我们也有能力战胜失败和挑战,因为它们将不可避免地出现。那时,有一个可以依靠的社区将是必不可少的。有大量的区域性和特定领域的社区正在致力于解决这些问题,但是如果你发现它们并不能完全解决你所看到的问题,那就去创建一个吧!作为奖励,请随时联系蒙特利尔人工智能伦理研究所团队,我们甚至可能在那里帮助你。

要阅读更多见解并了解伦理人工智能,你可以报名参加由蒙特利尔人工智能伦理研究所举办的人工智能伦理简报。

你也可以在这里找到更多关于我工作的信息——https://ATG-abhishek . github . io

在投资机器学习算法之前,先关注端到端的流程策略

原文:https://towardsdatascience.com/before-investing-in-machine-learning-algorithms-focus-on-end-to-end-process-strategy-c9b693865928?source=collection_archive---------36-----------------------

为什么数据科学产品经理应该在制定数据科学要求之前,围绕重新思考和重新设计流程/系统展开对话

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

Clark Van Der Beken 在 Unsplash 上拍摄的照片

企业明白投资人工智能以跟上加速发展趋势的好处。即使是多年来一直为自己能够仅凭“直觉”创造成功企业而自豪的商业领袖,也承认了数据驱动决策的力量。无论组织是想建立自己的全栈数据科学团队,还是决定与人工智能顾问合作,企业领导人都很清楚实施机器学习算法所涉及的高成本和时间。因此,大多数公司都与管理顾问合作,以确定可以通过人工智能转变的关键业务领域,并努力在这些有影响的流程中引入数据科学建议。这种方法比在整个组织中引入机器学习模型更安全、更具成本效益。

业务部门的发现会议和创新日有助于关注业务中的关键挑战,然后数据科学产品经理将负责制定要求并与数据科学团队合作,以自动化和优化流程,同时努力实现精确的产出。大多数数据科学产品经理来自分析或工程背景,他们确实拥有如何与数据科学团队合作交付正确解决方案的智慧。但是这最终也是一个漏洞,因为产品经理热衷于解决方案,并且更经常地假设业务团队已经完成了评估整个过程的基础工作。对于大多数来自工程背景的产品经理来说,总有一个声音在他们的大脑中窃窃私语,讲述推断正确逻辑的所有方法,即使在需求阶段的早期,数据也需要解决问题。抛开技术智慧的提示,数据科学产品经理应该敞开心扉,深入了解业务流程。数据科学产品经理应该从构建端到端的流程流开始,同时在研究解决方案之前考虑互连的系统和流程。仅仅专注于设置并坚持着陆,而不了解中间的所有线程,将扼杀组织从完全采用数据科学成果中获得的好处。

例如,每个零售商都同意,为了在竞争中保持领先,必须使用先进的分析模型,将历史数据与影响消费者行为的所有外部变量相融合,以构建创新和个性化的解决方案。数据科学团队进行了广泛的研究,以分析市场洞察和交易数据,从而为正确的时间和地点推荐正确的产品。但是,为了充分发挥数据科学模型的潜力,产品经理不应该仅仅从商业化的角度来看待这一需求,还应该花时间了解下游供应链的约束。有时,满足高度本地化需求的物流成本超过了个性化产品带来的收入增长。如果产品经理从构建流程图开始,这将有助于从流程中所有相互关联的步骤中产生影响。在这个阶段,如果产品经理希望做出数据驱动的决策,他们应该与业务部门就重新思考和重新设计他们的一些流程进行坦诚的对话。在进行这些对话之前,产品经理应该与数据分析师合作,从分析中创建估计的 ROI,以推动他们的观点。有时,这可能涉及到后退一步,为每个地区提供超定制的产品组合,而不是选择建立最佳的客户群,这有助于在本地化和满足供应链约束之间建立平衡。但是,通过进行端到端的流程分析,并在需求阶段就执行约束进行早期讨论,数据科学产品经理可以确保最终产品被无缝采用和利用。

作为产品经理,最初的问题从来不是“我该如何解决这个问题?”,而是“我们试图解决什么”,更重要的是“你为什么需要这个?”。有时,业务团队如此习惯于执行像第二天性这样的日常任务,以至于他们不希望增强例行程序,这些请求主要是围绕新的挑战。把事情放在上下文中,可能有一个全渠道包优化的请求;一种有效构建最佳装箱组合的算法,用于运送到配送中心或商店。借助 COVID,大多数零售商可能正在寻找一种有效的解决方案来满足地理层面的全方位需求,同时还要考虑物流成本。但是在这个流程的下游可能有其他核心活动,它们使用过时的工具,无法处理复杂算法的输出。在涉及多个领域的情况下,很难保持项目目标的同步。在实现分析输出之前,需要首先更新下游系统和流程。在任何流程重新设计之前构建高级分析解决方案都不会显著节约成本或增加收入,数据科学投资也将变得毫无用处。在投资解决方案之前,澄清当前流程和现有系统的效率。

在流程映射阶段之后,数据科学产品经理在工程或分析方面的优势以及对细节的执着会大放异彩。业务团队往往会忽略任务之间的数据或系统依赖关系,产品经理可以在流程图上叠加一个数据流图,以揭示可能在项目后期突然出现的技术挑战。

总之,数据科学产品经理应该专注于彻底理解业务流程。流程图不应止于分析结果的获取,还应包括通向最终客户的所有系统/流程。在这个阶段之后,数据科学产品经理可以利用他们的工程背景,通过缩小技术细节和解决执行中可能出现的复杂性,为需求添加最后的润色。数据科学产品经理应该在需求阶段扮演业务客户的角色,同时在之后带来分析视图,以揭示如果一个领域要成功实现数据科学解决方案,需要进行的流程/系统重新设计。

在你开始一个数据科学项目之前,问你的用户一个问题

原文:https://towardsdatascience.com/before-you-start-a-data-science-project-ask-your-users-this-one-question-c0b1159f79df?source=collection_archive---------38-----------------------

行业笔记

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

低保真度原型草图

一个好的数据科学家会问用户很多关于他们可能构建的产品的(商业)目的的问题。通过在执行任何技术工作之前与最终用户交谈,我已经能够在一些项目上节省数周的时间。

在数据准备、数据工程或模型建立之前,问你的用户**“你将如何处理最终的输出?”**更进一步,向他们展示带有虚假数据或可视化效果的低保真度输出原型。

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

愤怒客户拓展项目的低保真度原型

我将给出我参与的一个示例项目的概要。该企业有一个模糊的想法,即拓展到客户有一个未解决的愤怒的电话。企业希望用户满意,客户满意度是一个关键的绩效指标,可能会对下游收入和奖金产生影响。此外,如果客户提出正式投诉,则需要提交法规文档,这将自动让公司付出 100 美元的成本以及更多员工时间的成本。

一些同事立即开始了一些复杂的数据工程,以获取大量的呼叫中心记录,并将呼叫与我们数据仓库中的客户信息联系起来。我们开始讨论自然语言处理(NLP)步骤的效果如何,并手动检查通话记录,看看 NLP 摘要是否恰当地将通话标记为愤怒;一些电话开始时很生气,但后来客户看起来很好。但在我们进一步深入之前,我们会见了我们的同事,他们将主动接触这些愤怒的客户,这是他们以前没有做过的任务。当展示低保真度原型时,他们有许多问题和需求。

  • 我如何知道客户为什么生气?
  • 我能看看他们最近的通话记录吗?
  • 我可以查看客户的订单历史吗?
  • 我需要客户的电话号码、电子邮件地址、联系地址和账单地址
  • 我怎么知道别人是否没有给他们打电话?这些数据会与呼叫中心运营团队协调吗?
  • 你能优先考虑金钱数额和愤怒分数较高的人吗?
  • 这个报告每天都会来吗?我们将如何接收它?在内部应用程序中?在 Excel 中?
  • 每天有多少人会出现在这个名单上?我们认为,在我们习惯这种方式之前,我们不会有时间每天联系 10 个以上的人。

最终,我们为我们的同事在输出中添加了一些东西,而不太关注自然语言处理的性能。

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

金融风险模型低保真度原型

对于另一个项目,公司希望我们根据自己的历史数据样本评估一些供应商财务风险模型。我们已经有了其中一个模型的基础设施和合同;企业希望判断是否值得努力潜在地转换模型。我们向他们展示了一个带有假数据的表格,显示了输出的样子(即低保真度原型)。这引发了一些问题和评论:

  • 这个分析的时间段是什么?
  • 什么是人口纳入和排除?
  • 我们更换供应商的标准是什么?我们能否将平均绝对误差的差值乘以我们的总体,以获得潜在的节约金额?
  • 平均绝对误差最合适吗?难道我们对异常值不敏感吗,均方差会更合适吗?或者,我们是否应该在评估中包括多个指标,例如还包括 r 的平方和实际正负 5%以内的人员百分比?
  • 我们是否应该提前与 IT 部门沟通,询问他们实施新的财务风险模型可能需要多少工作和时间?
  • 我们今天如何使用金融风险模型?它的性能有多重要?我们是否只需要一个“在大概范围内”的模型?
  • 这些供应商的未来改进路线图是什么样的?所有的供应商似乎都准备在未来几年取得成功吗?

原型帮助我们数据科学家巩固了我们的方法,并帮助经理们更多地考虑他们所要求的。

尝试为你的下一个项目创建一个低保真度的原型。保真度低意味着你应该能很快做到;它可能看起来不太好,但用户应该有一个好主意。我喜欢在纸上做可视化草图,或者用一些假数据在 Excel 或 r 中创建表格和图表。

数据转换的初级解释

原文:https://towardsdatascience.com/beginner-explanation-for-data-transformation-9add3102f3bf?source=collection_archive---------11-----------------------

数据转换的基本概念

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

克里斯·劳顿在 Unsplash 上的照片

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

介绍

什么是数据转换?—我很确定任何学习数据和统计学的人都会在某个时候碰到这些术语。数据转换是一个概念,指的是应用于数据集中每个值的数学函数,将该值替换为新值。在数学方程式中,我们可以用下图来表示。

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

作者图片

如果我用更简单的解释来说,数据转换是通过数学方程式将你的数据转换成另一种数据的过程。

为什么我们需要做数据转换?转换数据有什么好处吗?从统计学的角度来看,原因是:

  • 转换数据允许您满足某些统计假设,例如,正态性、同质性、线性等。
  • 数据转换将不同列中的值进行缩放以进行比较,例如,以美元为单位的薪金(范围从 100 到 10000)和以千克为单位的体重(范围从 20 到 100)。

数据转换有助于获得新的见解并清除数据中的干扰。但是,使用数据转换方法需要您根据转换后的数据理解转换效果、含义和结论。在我看来,只有在必要的情况下,并且你明白你的转换目标时,你才进行数据转换。

数据转换的方法有哪些?根据 McCune 和 Grace (2002)在他们的生态群落分析书中所述,这些方法是:

  • 单调变换
  • 关系化(标准化)
  • 概率变换(平滑)

如果上面的术语对你来说很陌生,没关系。让我们更深入地探索所有这些方法!

我要说的一个免责声明是,在进行数据转换时,您需要非常小心,因为您最终会得到一个转换后的数据,它不再是您的原始数据。了解数据转换的目的是什么,并报告您已经完成的任何数据转换。

单调变换

什么是单调变换?这是一种数据转换方法,它将数学函数应用于每个独立于其他数据的数据值。单词 monotonic 来自方法 procedure,它转换数据值而不改变它们的等级。用一个更简单的术语来说,单调变换改变了你的数据而不依赖于其他数据,并且不改变它们在列中的排名。

著名的单调变换函数的一个例子是对数变换对数变换。顾名思义,对数转换通过对每个数据值应用对数函数,将数据值转换为对数值。许多变量遵循对数正态分布,这意味着值在对数变换后将遵循正态分布。这是对数变换的好处之一——遵循正态假设,或者至少接近正态假设。

在数学术语中,对数变换用下面的等式表示。

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

作者图片

让我们用样本数据试试对数变换法。我会使用来自 Kaggle 的关于工科毕业生薪水的数据。首先,将数据读入数据框。

import numpy as np
import pandas as pd
import seaborn as snsdata = pd.read_csv('Engineering_graduate_salary.csv')

该数据集中有 33 个要素,但我不会使用所有可用的数据。这个数据是为了知道是什么影响了工资,那么我们就试着把工资数据分布可视化吧。

sns.distplot(data['Salary'])

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

作者图片

正如我们在上面的图像中所看到的,工资特征不是正态分布的。让我们应用对数变换将数据转换为正态分布。

#Salary Log Transformation with base 10
data['log10_Salary'] = data['Salary'].apply(np.log10)

通过一行代码,我们将数据转换为以 10 为底的对数值。让我们再一次想象它。

sns.distplot(data['log10_Salary'])

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

作者图片

工资数据现在更接近正态分布。我们可以尝试使用正态性检验来检验正态性,比如夏皮罗检验,但我不会在本文中解释这个概念。

数据转换的另一个目的是从数据关系中获得更好的洞察力。比如我只对大学的 GPA 和工科毕业生的工资之间的关系感兴趣。让我们试着用散点图把它形象化。

sns.scatterplot(x = 'Salary', y = 'collegeGPA', data = data)

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

作者图片

我正试图将薪水和大学 GPA 之间的关系可视化,结果我得到了一个没有太多洞察力的数据集群。这是我们可以应用对数变换来重新调整数据以获得更好清晰度的时刻之一。

sns.scatterplot(x = 'log10_Salary',y = 'collegeGPA', data = data)

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

作者图片

薪水和大学绩点的关系现在清晰多了,绩点和薪水之间没有太大的关系。尽管如此,我们现在做的是可视化日志值与未缩放特征之间的关系。让我们试着把大学的 GPA 特征也转换一下,并把这种关系形象化。

data['log10_collegeGPA'] = data['collegeGPA'].apply(np.log10)
sns.scatterplot(x = 'log10_Salary',y = 'log10_collegeGPA', data = data)

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

作者图片

与我们在没有任何数据转换的情况下将其可视化时相比,现在这种关系非常明显。这是进行数据转换的另一个好处。

这是有益的,特别是当您需要向业务用户展示数据关系时,但是您的数据是聚集的,因此很难获得任何洞察力。

单调变换有许多方法。不过,我不会在本文中解释它们,因为我计划撰写另一篇文章来概述其他单调转换方法。重要的是你明白什么是单调变换。

关系化(标准化)

相对化或标准化是一种数据转换方法**,其中列或行标准转换数据值**(例如,最大值、总和、平均值)。它不同于单调变换,在单调变换中,标准化不是独立的,而是依赖于另一个统计量。

当出现不同单位的属性时,您通常需要标准化,并且您的分析需要具有相似单位的数据。分析示例是聚类分析或降维,它们依赖于数据距离。

著名的标准化方法是 **Z 分数标准化,**通过特征的平均值和标准偏差将数据转换成比例。转换后的特征均值约为 0,标准差约为 1。Z 得分标准化转换后,转换后的数据本身将被称为 Z 得分。在数学符号中,它用下面的等式表示。

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

作者图片

其中 x =特征值,μ =特征均值,σ =特征标准差。

需要记住的一点是,尽管 Z 分数标准化将您的数据转换为遵循正态分布标准,但要素分布本身并不一定遵循正态分布。毕竟,Z 值标准化的目的是重新调整要素的比例。

让我们用一个数据集示例来尝试 Z 分数标准化。首先,我们需要导入我们想要使用的包。

#Import Z-Score Standard Scaler from the Sklearn package
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

比方说,我想重新调整上一个例子中的工资数据。这是我们的原始数据和统计。

data['Salary'].head()

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

作者图片

data['Salary'].agg(['mean', 'std'])

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

作者图片

我们的数据单位是万,工资平均值如上图所示。然后,我们使用之前导入的缩放器将数据转换为 Z 分数,但首先,我们需要拟合缩放器(这是获取特征的平均值和标准差的过程)。

scaler.fit(np.array(data['Salary']).reshape(-1, 1))

如果您想再次检查我们的定标器是否获得了正确的平均值和标准偏差,我们可以使用下面的代码访问该值。

print('Salary Mean', scaler.mean_)
print('Salary STD', np.sqrt(scaler.var_))

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

作者图片

结果略有不同,但几乎可以忽略不计。让我们将工资数据转换成 Z 分值。

data['Z_Salary'] = scaler.transform(np.array(data['Salary']).reshape(-1, 1))data[['Salary', 'Z_Salary']].head()

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

作者图片

我们现在可以看到原始数据和转换后的数据之间的差异。当您的数据小于平均值时,Z 得分为负值,反之亦然。让我们检查一下转换后的数据统计。

data['Z_Salary'].agg(['mean', 'std'])

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

作者图片

可以看到,转换后的数据均值接近 0,标准差接近 1。使用 Z 分数标准化进行缩放的每个要素都将遵循相同的标准。

Z 分数标准化还有另一个好处,那就是异常值检测。我不会详细解释,但基本上,离群点检测概念与经验法则有关。任何大于 3 或小于 3 的 Z 值都被视为异常值。

像单调转换一样,关系化或标准化也有许多方法,但这将是另一篇文章来详细讨论它。

概率变换(平滑)

概率变换或平滑是一种数据变换过程,用于消除数据中的任何噪声,以增强数据中最强的模式。

这种转换对异类或有噪声的数据特别有效。平滑过程允许您看到以前看不到的数据模式。尽管在解释平滑过程的结果时需要小心,但它可以向您显示一个趋势,即使是从随机数据看也是可靠的。

常用的平滑技术是核密度估计(KDE) 平滑。这种技术基本上是通过估计基于有限数据样本的总体随机变量的数据概率函数来平滑数据。

让我们尝试平滑数据样本以获得数据模式。例如,我想看看计算机编程数据的分布。

sns.distplot(data['ComputerProgramming'], kde = False)

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

作者图片

这里可以看到宁滨数据模式,但是我们可能希望消除任何可能会分散我们对真实模式的注意力的干扰。让我们使用 KDE 平滑来获得该模式。

sns.distplot(data['ComputerProgramming'], hist = False)

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

作者图片

通过平滑技术,我们使用数据的概率函数估计将数据转换成密度值。正如我们所看到的,我们的数据中有两个峰值,一个在 0,另一个在 500 附近,后者的峰值最高。

这种模式只有在我们平滑数据时才能看到。你可能会问,平滑模式似乎显示了不同于宁滨模式的模式。还记得平滑的目的吗?就是消除数据中的噪声,增强最强的模式。此外,KDE 根据样本数据估计人口中的概率函数,这意味着平滑模式是对人口中可能发生的情况的估计。

仍然有许多概率变换或平滑方法可以学习,但我会把它留到下一次。平滑的重点是转换数据以消除任何噪声并增强模式。

结论

数据转换是数据科学家应该知道的一项技术,因为它有好处。根据 McCune 和 Grace (2002)在他们的生态群落分析书中所述,有 3 种数据转换方法。它们是:

  1. 单调变换
  2. 关系化(标准化)
  3. 概率变换(平滑)

希望有帮助!

访问我的LinkedInTwitter

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

初学者友好的数据科学项目接受贡献

原文:https://towardsdatascience.com/beginner-friendly-data-science-projects-accepting-contributions-3b8e26f7e88e?source=collection_archive---------33-----------------------

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

弗雷迪:维克多·福加斯在 Unsplash 上拍摄的照片。

想为开源软件做贡献吗?这里有几个地方可以开始。

TLDR:看看支持数据科学家的四个开源软件项目,包括广受欢迎的熊猫,新兴的数据分析师,被称为人物分析数据(技术上是开放数据)的 R 包,以及熊猫概况。还讨论了支持开源软件项目的原因,包括让世界变得更美好的机会以及增强或构建知识和技能的机会。

更新:本文的更新版本(2022 年 5 月)现已发布:

简介和动机

成为数据科学家的最佳方式是成为一名数据科学家。提高数据科学水平的最好方法是练习、练习、再练习。

为开源软件项目做贡献至少有三个明智的理由:

  1. 你可以为他人创造一个更美好的世界。
  2. 为开源项目做贡献将有助于你学习。
  3. 为开源项目做贡献也是扩展你的专业组合的好方法。

开源软件项目是那些向公众开放代码的项目。每个项目的具体工作方式是不同的。

例如,Python 是在开放软件倡议(OSI)下许可的开源编程语言。Python 软件基金会管理 Python 的开发。为 Python 做贡献不是初学者的命题。

数据科学家熟悉的另一个开源项目是 Pandas。熊猫的作者在 GitHub 上解释说,“欢迎所有的贡献、错误报告、错误修复、文档改进、增强和想法。”

如果你是一名数据科学家,并且希望让世界变得更美好,我建议你考虑为开源项目做一点或多点贡献。

本文确定了四个开源软件项目,它们为初级和中级数据科学家提供了机会。这些项目包括广受欢迎的熊猫,一个新兴的数据列表,一个被称为人物分析数据(技术上公开的数据)的 R 包,以及熊猫档案。

熊猫

一想到要为一个像熊猫这样突出和广泛使用的项目做贡献,可能会令人生畏。不要烦恼。熊猫的贡献者和维护者是受欢迎的人群。

因为有很多用户贡献和报告熊猫的问题,所以有一些不需要写代码的“贡献”方式。

例如,你可以在 GitHub 上浏览问题跟踪器。找到一个你感兴趣的问题。看看您能否重现该问题。无论您能否重现该问题,请务必在问题跟踪器上发布您的努力和结果。

重现问题时,您可能会发现原因。您可能不知道如何消除原因,但如果您发布您所了解的内容,将有助于其他人纠正问题。要了解更多关于为 Pandas 做贡献的信息,请参阅 Pandas project GitHub repository 的 ReadMe.md.

成为数据科学家的最佳方式是成为一名数据科学家。

数据列表

根据其 twitter 简介,Datasist 是一个“用于简单数据分析、可视化和建模的开源 Python 库。”这个项目有投稿指南。瑞星奥德瓜(Twitter 上的)是这个项目最初和主要的编码者。

在投稿指南中,Datasist 强调了文档的重要性。如果你相信高质量文档的重要性,并且你也对编写文档感兴趣,这个项目将欢迎你的贡献。通过增强或改进文档来为项目做贡献也算贡献。文档贡献和贡献新的代码或特性一样重要——这两种贡献类型以不同的方式计算,但是它们确实很重要。

如果您不熟悉 Datasist,它是一个可以让您更快地进行数据探索和建模的库。例如,下面的代码显示了如何将第 4–7 行(四行)重构为第 13–14 行(两行):

人员分析数据

这个项目是一个特例。它不是一个软件项目。相反,它是公开可用的数据。数据科学家可以将这些数据用于测试、培训和其他项目,这些项目可以从备用数据集的使用中受益。

数据来源于 人物分析 中的回归建模手册。作者通过可从综合 R 档案网 (CRAN)获得的 R 包提供该书的数据。R 包使得在 R 中加载这些数据变得很容易。

这个 R 包已经成熟,可以移植到 Python、Stata、Julia、SAS、Matlab 等。也许用一个宏来抓取数据并把它放入 MS Excel 将是聪明而有用的。这是一个良好的开端。把下面变成一个包。

如果你捡到这个,请告诉我。我愿意合作。我还建议在继续之前和作者基思·麦纽提(在 LinkedIn 上)聊一聊。得到他的祝福是有意义的。他已经公开讨论了移植该作品的前景。

熊猫-侧写

这个项目很好地利用了 GitHub 的赞助计划。至少有七个赞助商,这个项目得到了很好的维护。为了支持贡献者,这个项目有一个组织良好的贡献指南。该项目还有一个经常光顾的松弛频道。

初学者或中级数据科学家可以做的贡献的一个例子就是这个,它需要更新包的教程。starter 的另一个贡献是解决这个问题,其中包括添加参数来调整饼图的颜色

如果您还不熟悉这个包,它可以减少您花费在探索性数据分析上的时间。实现只需要五行代码(如下所示)。这五行代码的输出摘录见下文。

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

图片鸣谢:作者实现熊猫——剖析报告(节选)。

对熊猫概况的深思熟虑的贡献将有可能改善你和他人的工作。保证。

https://adamrossnelson.medium.com/membership

感谢阅读

如果你喜欢我要说的话,可以在:adamrossnelson.medium.com找到更多。

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelson| LinkedIn:亚当·罗斯·纳尔逊 |脸书:亚当·罗斯·纳尔逊

初学者友好的虚拟环境管理— Anaconda + PyCharm

原文:https://towardsdatascience.com/beginner-friendly-virtual-environment-management-anaconda-pycharm-36178e20129f?source=collection_archive---------22-----------------------

轻松设置您的第一个虚拟环境

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

杰西卡·路易斯在 Unsplash 上的照片

Python 是趋势语言,因为它是几个专业领域中最流行的选择,如数据科学和机器学习。因此,许多人选择 Python 作为他们学习的第一门编程语言。对于初学者来说,虚拟环境是一个让他们相当困惑的概念。在这篇文章中,我想以初学者友好的方式回顾一下它是什么以及如何设置它。

虚拟环境

Python 是开源的,允许整个社区开发和发布他们的 Python 程序,通常是以框架、库或包的形式。Python 发展很快,从 2 到 3,已经看到了几周前正式发布的 3.10。Python 的第三方包也发展得非常快。原因很简单——越来越多的人在使用 Python,他们正在努力开发有益于其他 Python 程序员的工具。

然而,这是有代价的——用最新的 Python 和第三方包来保持项目的进度是很昂贵的。它们并不总是向后兼容的。例如,您的项目 A 使用 Python 3.6 和包 v1.2 版)。但是,你有另一个项目 B,它使用 Python 3.8 和包 a (v2.2)。很显然,如果两个项目都想留在同一台电脑上,你就不能在你的电脑系统上使用默认的 Python,还有其他的包,都是设置成某个版本的。

因此,您必须适应这些具有冲突的 Python 和包需求的项目。这是为您的项目创建虚拟环境的简单原理。

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

项目之间的冲突需求(图片由作者提供)

本质上,每个虚拟环境都可以被概念化为你的计算机系统中的一个独立的盒子,如上图所示。在这个框中,您有了所需的 Python 版本和项目所需的包。这些框是独立的,这样您在一个项目中所做的不会影响其他项目。

我们总是建议您为您的项目创建不同的虚拟环境,即使目前不同的项目可能共享一个 Python 版本和包。然而,当您想更新 Python 版本和一个项目的一些包,而不是其他项目时,机会就来了。不兼容将会发生,您将不得不再次重新配置项目。因此,我们应该从正确设置的虚拟环境开始我们的任何项目。

Anaconda 用于虚拟环境管理

我希望你现在明白什么是虚拟环境,以及为什么你想为你的项目创建一个虚拟环境。现在,问题来了,我们如何管理虚拟环境。对于初学者,我认为使用命令或终端不是您最喜欢的选择。因此,我将为您提供一个点击式解决方案。我使用最多的工具是 Anaconda ,这是数据科学和机器学习社区中虚拟环境管理最常见的选择。

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

蟒蛇安装者(链接:https://www.anaconda.com/products/individual#Downloads

如图所示,Anaconda 支持主要的操作系统,您应该能够找到您需要的操作系统。完成下载后,只需按照提示进行安装,这应该很简单。

py charm——最大化生产力的 Python 编辑器

Python 编程有多个编辑器,比如 Visual Studio Code,Vim,Jupyter Notebook,当然还有 PyCharm。在这些选择中,PyCharm 是我的最爱,因为它几乎不需要设置。

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

下载 PyCharm(链接:https://www.jetbrains.com/pycharm/download/#section=mac)

您选择与您的操作系统相匹配的安装程序。社区版免费使用。值得注意的是,如果你在教育或学术机构工作,你也可以自由使用专业版。对我来说,因为我在一所非营利性的州立大学工作,所以我可以自由使用专业版。

我认为在您的计算机上安装 PyCharm 应该没有问题。所以,我们继续吧。

使用 Conda 虚拟环境的新项目

在您能够运行 PyCharm 之后,您可以创建一个项目,您将看到如下所示的内容:

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

皮查姆的新项目

你要注意的一件事是,你要用 Conda 创建一个新的环境,尽管还有其他一些选项。如您所见,您可以自由选择想要的 Python 版本。有一个复选框“对所有项目都可用”,通过检查您可以使用哪个解释器(您可以认为它是您的项目运行的 Python 版本)。

在项目中,右键单击项目目录,选择 New,从这里可以创建一个新的 Python 文件,假设它的名字是test_file.py。需要注意的一点是,在右下方,你会看到我们项目的解释器被设置为 Python 3.9 (pythonProject)。

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

显示解释器设置

安装/删除软件包—点击

对于初学者来说,一个方便的特性是 PyCharm 会通过提供适当的提示来尝试安装缺失的包。假设我们想在 Python 文件中使用熊猫。因为我们还没有安装它,您应该会看到一个错误,如下所示。

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

导入丢失的包时出错

你移动你的鼠标到软件包上,弹出菜单可以建议你安装软件包。你只需点击“安装包熊猫”并等待一会儿,你会看到熊猫安装,没有更多的错误指示。

要查看安装了哪些包,可以点击底部的“Python 包”标签。你会发现熊猫现在确实在名单上。

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

Python 包

在搜索框中,可以输入想要安装的 Python 包,比如 matplotlib。您将看到显示了可用的选项。你可以选择正确的安装。此外,您可以选择不同于最新版本的版本。

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

手动安装软件包

另一方面,你也可以删除一个包,通过输入包来显示它的信息,正如你在下面的截图中看到的。

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

手动删除包

使用终端

当您熟悉终端时,您可能会发现使用终端安装软件包更容易。用 PyCharm 也很方便。您只需点击底部的终端选项卡。应该引起您注意的一件事是,您会注意到在提示符前面的括号中有一个名称。

(pythonProject) computer_name:pythonProject ycui1$

如果你记得的话,那是现任翻译的名字。在 conda 的术语中,它是虚拟环境的名称。因此,您所做的一切(例如,软件包的安装)都将发生在虚拟环境中。

一些常用命令如下所示。

**Installation**
*# use conda*
conda install package_name
*# use pip*
pip install package_name**Deletion**
# use conda
conda remove package_name
# use pip
pip uninstall package_name

当然,使用终端还可以做许多其他事情。关于使用终端进行虚拟环境管理的详细说明,请参考我以前的文章:

</8-essential-commands-to-get-started-with-conda-environments-788878afd38e>

结论

在本文中,我们学习了如何使用 Anaconda 和 PyCharm 为我们的项目建立一个虚拟环境,并学习了最基本的操作,比如在环境中安装和删除包。

最后提醒一下,为每个项目建立一个单独的虚拟环境总是一个好的做法。

感谢阅读这篇文章。通过注册我的简讯保持联系。还不是中等会员?通过使用我的会员链接支持我的写作(对你没有额外的费用,但是你的一部分会费作为奖励由 Medium 重新分配给我)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值