TowardsDataScience 博客中文翻译 2020(一百二十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

你仍然没有使用“整洁”的数据集吗?—以下是您应该这么做的原因

原文:https://towardsdatascience.com/are-you-still-not-using-a-tidy-dataset-here-s-why-you-should-5c4b79d5c9bc?source=collection_archive---------20-----------------------

什么是整洁的数据集,它们的好处,以及如何用 Python(带代码)将杂乱的数据转换成整洁的数据

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

照片由埃德加·恰帕罗Unsplash 拍摄

所以你有一个数据集。它可能是您自己生成的,也可能是您组织内的另一个部门交付给您的。你们中的一些人甚至可能刚刚从 Kaggle 等地方下载了它。

你通常用它做的第一件事是什么?(嗯,在您加载了它的内容并验证了数据是您所期望的之后。)

你们中的许多人可能已经回答了探索性数据分析——我认为这是一种伟大的本能。

话虽如此,我还是想说,实际上我们应该首先考虑将我们的数据转换成“整洁”的数据。但首先,我们来说说什么是整齐的数据。

(如果你希望跟随我的例子,我在我的 GitLab repo 这里,在tidy_your_data下面包括我的代码和例子)

在开始之前

我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。

你需要pandasplotly。用一个简单的pip install [PACKAGE_NAME]安装每一个(在您的虚拟环境中)。

数据怎么整理?

数据科学中提到的“整洁”数据是指数据的特定排列。请看一下这个来自世界银行的特殊数据集,它显示了各个国家的病床数量:

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

“杂乱”数据的例子

这个数据集是“混乱”数据的一个例子,为什么会混乱?这和缺失值的数量,不同的小数位数,或者任何排序都没有关系。

简单来说,tidy data 排列信息,使得每一行对应一个观察值,每一列对应一个变量。

同样的数据,经过整理后,看起来像这样:

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

数据,但要让它整洁

看到那里发生了什么吗?在杂乱的数据集中,每一行都包括多个观察值,因为一个变量(年份)的变化由列表示。而在下面的 tidy 数据集中,每个观察值都有自己的行,并且 year 变量在每一行中都有表示。

这确实是它的范围。整齐的数据将每一行限制为仅一个观察值,并且将列限制为变量。凌乱的数据是…字面上任何不是整齐的数据。

(一个更严格的定义出现在哈德利·威克姆的一篇论文中,题目很恰当,叫做“整洁数据”。)

尽管如此,那又怎样?你为什么要关心,我为什么要写这个?让我们来了解一下以这种方式排列数据的好处:

我为什么要关心整洁的数据?

在这一节中,我们将通过一些简单的练习,用一个杂乱的数据集和等价的整齐数据集进行比较和对比。两者都加载:

messy_df = pd.read_csv('srcdata/demo_messy.csv', skiprows=4)
tidy_df = pd.read_csv('srcdata/demo_tidy.csv', index_col=0)

提取/过滤

只是提醒一下,这个数据集包括了各个国家的人均医院床位数(每 1000 人)。假设我们只想获得几个国家的数据,比如中国、德国、新西兰、南非和美国。

在这两种情况下,这样做都很简单:

countries_list = ['China', 'Germany', 'New Zealand', 'South Africa', 'United States']
messy_df_sm = messy_df[messy_df['Country Name'].isin(countries_list)]
tidy_df_sm = tidy_df[tidy_df['Country Name'].isin(countries_list)]

“国家”数据基本上是一个整洁的格式。如果我们想通过多年的观察来筛选呢?

在我们研究精确解之前,让我们停下来,看一下包含在混乱数据集中的列。他们在这里:

['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code', '1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989',
       '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']

您将看到包含各个年份的列列表。为了过滤某些年份,需要保留相关的年份列,而拒绝其他年份。

但这正是数据不整洁成为问题的地方。在杂乱的数据中,每一行都包含多个观察值,一些列(如“国家代码”)与所有这些观察值相关,而另一些列(如“2010”)只与其中一个观察值相关。

因此,在这种情况下,过滤掉数据将需要保留那些引用该行上所有观测值的列,以及那些引用相关年份的列。

这实际上意味着什么?两件事之一,真的。删除引用不相关年份观察值的列,或者筛选相关年份的数据,然后添加可变列。

在代码中,它可能是这样的:

year_list = ['1995', '2000', '2005', '2010']
var_list = ['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code']
messy_df_sm2 = messy_df[var_list + year_list]

而对于整齐的数据,您应该运行:

year_list = ['1995', '2000', '2005', '2010']
tidy_df_sm2 = tidy_df[tidy_df['year'].isin(year_list)]

我们可以开始看到这两个数据集中所需的工作量有所不同。随着查询复杂度的增加,差异可能会增加。看一看数据操作。

处理混乱(-y 数据集)

如何生成整个数据集的平均值?这对于我们整洁的数据来说是微不足道的:

print(tidy_df['hosp_per_1000'].mean())

就是这样!我们所做的只是简单地从列中抓取所有的数据(观察值),并将其平均。

在杂乱的数据集中,我们需要从包含观察值的所有列中获取所有数据,然后生成一个平均值。由于一些值是 null (nan)值,这就更加复杂了。

获取每一列的平均值,然后再获取一个平均值是行不通的,因为空值的存在意味着每一列的权重不同。

所以这可能是一种方法。

all_years = ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']
messy_df_obs = messy_df[all_years]
messy_avg = np.sum(messy_df_obs.sum()) / sum(sum(messy_df_obs.notna().values))

可以想象,处理混乱的数据集所增加的复杂性可能会导致更多的错误。这是一个像取平均值一样简单的运算——你可以想象,随着数据或运算的复杂性增加,差异只会增加。

(哦,使用整齐的数据可能也有速度上的优势,但是除非你的数据集很大,否则这很难理解)。

那么——我们如何将杂乱的数据转换成整齐的数据呢?

创建整洁的数据

正如他们所说,有一个应用程序可以做到这一点。准确地说,是一种功能。

Pandas 包含了一个[.melt](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html)功能,可以将杂乱的数据转换成整洁的形式。用 pandas 文档自己的话来说,这个函数将一个“宽的”(杂乱的)数据帧转换成一个“长的”(整齐的)数据帧,可选地留下标识符。

在我们的例子中,这些标识符是变量列表:

var_list = ['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code']

创建一个整洁的数据帧就像messy_df.melt(var_list)一样简单——看看这个例子:

如果您要构建一个新的示例,只需确保每行只包含一个观察。让我们假设我们需要遍历数据并创建一个数据帧。您可能会这样做:

# With loops
data_list = list()
for i, row in messy_df.iterrows():
    for yr in [str(i) for i in list(range(1960, 2020))]:
        temp_dict = {k: row[k] for k in var_list}
        temp_dict['year'] = yr
        temp_dict['hosp_per_1000'] = row[yr]
        data_list.append(temp_dict)
tidy_df_2 = pd.DataFrame(data_list)

这需要一些时间来适应,但是一旦你习惯了,它就会成为你的第二天性。

在我们开始之前——让我们来看看一些可视化选项,这些选项打开了整洁的数据。

数据可视化——但要保持整洁。

整洁的数据也更容易可视化。还记得我们之前提到的哈雷·威克姆吗?嗯,他是ggplot2的创造者,也是整洁数据的最大拥护者之一。因此,ggplot2 更好地迎合整洁数据也就不足为奇了。

类似地,在 Python 中,像 Plotly Express 这样的包被编写为使用整齐的数据,专注于使语法简洁和一致。

因此,一旦 Plotly 被导入:

import plotly.express as px

绘制散点图:

fig = px.scatter(tidy_df_sm, y='hosp_per_1000', x='year', color='Country Name', template='plotly_white')
fig.show()

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

简单散点图

或者条形图

fig = px.bar(tidy_df_sm, y='hosp_per_1000', x='year', color='Country Name', template='plotly_white', barmode='group')
fig.show()

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

简单分组条形图

可以用基本相同的一行函数调用语法来完成,除了几个特定于图形类型的参数。

我想继续讨论可视化整齐的数据集,特别是与探索性数据分析相关的,但现在可能已经足够了。

(在 twitter 上关注我,或者点击这里获取更新!)

我希望这篇文章有助于你熟悉什么是整洁数据,它的好处是什么,以及它们是如何产生的。由于这是一个相当简单的概述,我确信有比我展示的更好的好处的例子。请在这里或者在推特上告诉我你的进展如何——如果你有任何建议的话!

下次再见,注意安全!

ICYMI,我也写了这些文章,你可能会感兴趣:

[## 使用 Python 在几分钟内构建一个 web 数据仪表板

通过将您的数据可视化转换为基于 web 的仪表板,以指数方式提高功能和可访问性…

towardsdatascience.com](/build-a-web-data-dashboard-in-just-minutes-with-python-d722076aee2b) [## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析

使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…

towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50)

你仍然没有对数据使用版本控制吗?

原文:https://towardsdatascience.com/are-you-still-not-using-version-control-for-data-d79a8b004c18?source=collection_archive---------24-----------------------

什么是数据的版本控制?该不该用?你可以去哪里试试?我做了调查所以你不用做了。

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

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

最近,在一次公司会议上,我的一个同事问道:我们对数据使用某种版本控制吗?我惊讶地看了他一眼。你是指代码的版本控制吗?我的同事坚持说,不要数据。我从来没有听说过或想过数据的版本控制,但它让我思考,所以我就这个主题做了一些研究。在帖子的最后,我也分享一下我的看法。

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

- [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)

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

有没有产品提供数据的版本控制?有必要吗?让我们找出答案。

我在谷歌上输入任何改变游戏规则的产品想法,市场上已经有十个成熟的产品了——这是一个充满活力的时代。在谷歌上搜索数据的版本控制没有区别。引起我注意的产品是 dolt

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

Gif 来自 giphy

dolt 是什么?

Dolt 是 SQL 数据库中数据体验的真正 Git,为模式提供版本控制,为数据提供单元级控制,所有这些都针对协作进行了优化。使用 Dolt,您可以查看上次收到的数据与这次收到的数据之间的人类可读差异。在部署新数据之前,您可以很容易地看到意料之外的更新并解决问题。

作者说,它就像 Git,但不是数据。它是一个具有 Git 风格版本的开源 SQL 数据库。在从事数据科学项目时,我们自己对数据集进行版本化。很多时候我们不记得 v5 和 v6 有什么区别。当我们将代码提交到存储库时,Dolt 会存储提交日志,这样更容易返回并查看更改。

存储库托管在哪里?

就像 Github 之于 Git,DoltHub 之于 Dolt。 **DoltHub 只对在 DoltHub 上公开的数据集免费。**价格为每月 50 美元,用于托管私人存储库。

数据的版本控制有哪些用例?

这是一个百万美元的问题,我一直在问自己。作者声称,指导性用例是在互联网上共享数据。Dolt 允许您共享数据库,包括模式和视图,允许您删除所有用于传输数据的代码。

DoltHub 允许你“先试后买”数据。您可以在 web 上运行 SQL 查询来查看数据是否符合您的需求。数据提供者甚至可以构建示例查询来指导消费者的探索。通过提交日志,您可以看到数据更新的频率。您可以看到谁更改了数据以及更改的原因。

怎么才能试试?

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

https://www.dolthub.com/

DoltHub 对公共数据集是免费的。您可以使用 Google 帐户登录。我创建了一个新的公共存储库,名为 iris(数据科学家知道我所说的数据集)。

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

带虹膜数据集的 Dolthub

然后,您可以像 wit Git 一样克隆存储库——这一切感觉如此熟悉。但是,在克隆 repo 之前,您需要安装 dolt CLI。开发人员考虑到这一点,所以他们将 install 命令放在 clone 旁边。

sudo curl -L https://github.com/liquidat

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

安装 dolt 后,您需要使用 CLI 工具登录,将密钥与您的帐户相关联。这将在 web 浏览器中打开页面。

dolt login

现在,您可以克隆存储库了。

dolt clone romanorac/iris

让我们放一些数据进去。我从 sklearn 上获取了虹膜数据集,将其转换为 pandas DataFrame 并保存为 CSV 格式。

import numpy as np
import pandas as pd
from sklearn import datasetsiris = datasets.load_iris()
df = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
                  columns=iris['feature_names'] + ['target'])
df.target = df.target.astype(int)
df = df.reset_index()df = df.rename(
    columns={
        'index': 'identifier',
        'sepal length (cm)': 'sepal_length',
        'sepal width (cm)': 'sepal_width',
        'petal length (cm)': 'petal_length',
        'petal width (cm)': 'petal_width'
    })
df.to_csv('~/Downloads/iris/iris.csv', index=False)

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

要将 CSV 文件放入 Dolt,您需要创建 SQL 表。

dolt sql -q "create table iris ( identifier int, sepal_length float, sepal_width float,petal_length float ,petal_width float, target int, primary key (identifier) )"

然后,您只需导入该表。

dolt table import -u -pk=identifier iris iris.csv

导入表后,您需要添加文件,编写提交消息并将其推送到存储库——就像使用 Git 一样。

git add .
dolt commit -m "Initial commit"
dolt remote add origin romanorac/iris
dolt push origin master

让我们来看看数据在 DoltHub 中的样子。我们看到了熟悉的虹膜数据集。

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

现在,让我们改变一个虹膜样本,看看不同的行动。

dolt sql --query 'UPDATE iris SET target=0 where identifier = 100'git add .
dolt commit -m "Change sample 100"
dolt push origin master

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

我们换了 100 排的班级。DoltHub 很好地将它可视化。

我的看法

作为一名数据科学家,我知道管理多个版本的数据集可能会很麻烦。尤其是对于已经在生产中的模型和多个数据科学家正在研究的模型。在这里我看到了 Dolt 的潜力。diff 功能看起来对较小的数据集很有用,但我不确定它对较大的数据集有什么帮助,因为在较大的数据集里,每一行都是变化的。我还必须用更大的数据集(几千兆字节的数据)对 Dolt 进行压力测试。它会随着时间变慢吗?

我认为 Dolt 和 DoltHub 的真实用例是共享数据。出售数据的公司可以记录每一个变化,因此客户可以透明地观察变化。DoltHub 还在冠状病毒流行期间展示了它的可用性,因为您可以使用分支管理具有相同模式的不同质量的提要。

在你走之前

Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的

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

考特尼·海杰Unsplash 拍摄的照片

你还在用 JupyterLab 吗?

原文:https://towardsdatascience.com/are-you-still-using-jupyterlab-ce1a4339c0a9?source=collection_archive---------2-----------------------

数据科学城推出了一款新的高端产品。它有超强的编码辅助,调试等等……值得切换吗?

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

约书亚·索蒂诺在 Unsplash 上拍摄的照片

我喜欢它们或者讨厌它们,有一件事是肯定的——Jupyter 笔记本已经成为从事数据科学的事实标准。虽然这产品不错,但也有它的缺点。JupyterLab 解决了其中的许多问题,增加了选项卡扩展管理器主题快捷方式编辑器。作为一个重度 JupyterLabs 用户,我 80%的时间花在 JupyterLab 上(另外 20%花在 SQL 编辑器上),所以编辑器必须是好的。有更好的选择吗?

Jupyter 笔记本已经成为从事数据科学的事实标准

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

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意阅读更多这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

认识一下 PyCharm 的笔记本

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

PyCharm 中的 Jupyter 笔记本支持。编辑器在左边,演示视图在右边。

PyCharm 最近获得了另一个超级能力——对 Jupyter 笔记本的原生支持。这使得 PyCharm 处于与 JupyterLab 竞争的最前线。但是有一个问题——**Jupyter 笔记本支持只在 PyCharm 的专业版中提供,**但是你可以免费试用。

主要特点是什么?

PyCharm 将编辑和查看结果分成两个独立的窗格(看上面的图片),而在 Jupyter 笔记本中,我们得到了两者的混合。当编写 markdown 或 LaTeX 方程时,这种分离非常有效,因为它可以实时呈现。

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

编写 markdown 时的实时预览

PyCharm 的杀手级特性是编码辅助。虽然 JupyterLab 有某种代码补全功能,但它很快就会丢失。代码完成只需与 PyCharm 一起工作。它显示了所有可用的方法,该方法采用了哪些参数,并突出显示了错误。这就是 PyCharm 领先 JupyterLab 多年的地方。

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

使用 PyCharm 完成代码

PyCharm 笔记本的杀手锏是编码辅助

PyCharm 远胜于 JupyterLab 的另一个领域是调试。祝 JupyterLab 调试方法好运。我试过 pdb 和 ipdb 包,但感觉很笨重。PyCharm 有一个优秀的调试查看器,您可以在其中列出对象并观察其变量的所有值。

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

在 PyCharm 中调试笔记本

我也喜欢开箱即用的代码格式化和强大的扩展支持——不需要像 JupyterLab 那样安装代码格式化扩展。PyCharm 还有一个很棒的扩展 IdeaVim,它比当前 JupyterLab 的 Vim 扩展更好。这主要是因为浏览器的限制,比如复制粘贴和 ctrl+n 和 ctrl + p 快捷键——Vim 用户会知道我在说什么。

它在幕后是如何工作的?

PyCharm 只是在端口 8889 上启动自己的 Jupyter 笔记本服务器,这样就不会与已经运行的 Jupyter 服务器发生冲突。

jupyter notebook --no-browser

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

如何试用 PyCharm 的笔记本?

PyCharm 的专业版有 1 个月的免费试用期,任何人都可以试用。如果你是学生,JetBrains(py charm 背后的公司)为一些大学提供免费的教育许可。

值得转行吗?

虽然毫无疑问 PyCharm 笔记本支持优于 JupyterLab,但它也不是免费的。我要说,如果你把大部分时间都花在编辑 Jupyter 笔记本上,那还是值得一试的。询问你的公司或大学是否能给你提供许可证。决不,我会说 PyCharm Jupyter 笔记本支持是一个必须使用的工具。我在 JupyterLab 工作多年,效率很高。

我在 JupyterLab 工作多年,效率很高

在你走之前

推特上关注我,在那里我定期发关于数据科学和机器学习的推特

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

照片由Courtney hedgeUnsplash 上拍摄

你还在用熊猫做大数据吗?

原文:https://towardsdatascience.com/are-you-still-using-pandas-for-big-data-12788018ba1a?source=collection_archive---------1-----------------------

Pandas 不支持多重处理,处理大数据集时速度很慢。有一个更好的工具可以让这些 CPU 内核发挥作用!

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

克里斯·库里在 Unsplash 上的照片

谈到探索性数据分析,Pandas 是最好的工具之一。但这并不意味着它是每项任务的最佳工具,比如大数据处理。我花了太多时间等待熊猫读取一堆文件,或者聚合它们并计算特征。

最近,我花时间找到了一个更好的工具,它使我更新了我的数据处理管道。我使用这个工具处理大量数据——比如读取多个 10gb 数据的文件,对它们应用过滤器并进行聚合。当我完成繁重的处理后,我将结果保存到一个较小的“熊猫友好”CSV 文件中,并继续对熊猫进行探索性数据分析。

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

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

见见达斯克

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

来自 Dask 的 dask 标志。组织

Dask 为分析提供了先进的并行性,为您喜爱的工具提供了大规模性能。这包括 numpy,熊猫和 sklearn。**它是开源的,可以免费获得。**它使用现有的 Python APIs 和数据结构,使得在 Dask 支持的等价物之间切换变得容易。

Dask 让简单的事情变得简单,让复杂的事情变得可能

熊猫大战达斯克

我可以继续描述 Dask,因为它有如此多的特性,但是,让我们看一个实际的例子。在工作中,我通常会收到一堆需要分析的文件。让我们模拟我的工作日,创建 10 个 100K 条目的文件(每个文件有 196 MB)。

from sklearn.datasets import make_classification
**import** pandas **as** pdfor i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

现在,让我们一起阅读那些有熊猫的文件,并测量时间。Pandas 没有本地 glob 支持,所以我们需要循环读取文件。

%%timeimport globdf_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

熊猫读文件花了 16 秒。

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

现在,想象一下如果这些文件大 100 倍——你甚至不能用熊猫来读它们。

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

imgflip 创建的迷因

Dask 可以通过将数据分成块并指定任务链来处理不适合内存的数据。让我们测量一下 Dask 加载这些文件需要多长时间。

import dask.dataframe as dd%%time
df = dd.read_csv('trainset_*.csv')CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

Dask 需要 154 毫秒!这怎么可能呢?嗯,不是的。 Dask 有延迟执行范式。它只在需要的时候计算东西。我们定义执行图,这样 Dask 就可以优化任务的执行。让我们重复这个实验——还要注意 Dask 的 read_csv 函数本身就接受 glob。

%%timedf = dd.read_csv('trainset_*.csv').compute()CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

compute 函数强制 Dask 返回结果。Dask 读取文件的速度是熊猫的两倍。

Dask 原生缩放 Python

熊猫与 Dask CPU 使用率

Dask 使用您购买的所有内核吗?我们来比较一下熊猫和 Dask 在读取文件时的 CPU 使用情况——代码同上。

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

读取文件时熊猫的 CPU 使用率

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

读取文件时 Dask 的 CPU 使用情况

在上面的屏幕记录中,当读取文件时,pandas 和 Dask 在多重处理上的差异是显而易见的。

幕后发生了什么?

Dask 的数据帧由多个熊猫数据帧组成,这些数据帧通过索引进行拆分。当我们用 Dask 执行 read_csv 时,多个进程读取一个文件。

我们甚至可以可视化执行图。

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()

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

读取多个文件时的 Dask 执行图。

Dask 的缺点

你可能会想,如果达斯克这么伟大,为什么不一起抛弃熊猫呢?嗯,没那么简单。只有熊猫的某些功能被移植到 Dask。其中一些很难并行化,比如对值进行排序和对未排序的列设置索引。Dask 不是灵丹妙药——建议只对不适合主存的数据集使用 Dask。由于 Dask 是建立在熊猫的基础上的,所以在熊猫中慢的操作在 Dask 中也会慢下来。就像我之前提到的,Dask 是数据管道过程中的一个有用的工具,但是它不能取代其他库。

Dask 仅推荐用于不适合主存的数据集

如何安装 Dask

要安装 Dask,只需运行:

python -m pip install "dask[complete]"

这将安装整个 Dask 库。

结论

在这篇博文中,我只触及了 Dask 库的皮毛。如果你想更深入地研究,请查看令人惊叹的 Dask 教程Dask 的数据框架文档。对 Dask 支持哪些 DataFrame 函数感兴趣?检查数据帧 API

下载 Jupyter 笔记本跟随示例。

在你走之前

Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的

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

考特尼·海杰Unsplash 拍摄的照片

你还在用 sklearn 做回归分析吗?

原文:https://towardsdatascience.com/are-you-still-using-sklearn-for-regression-analysis-fb06bb06ce96?source=collection_archive---------24-----------------------

当谈到 Python 中的经典机器学习算法时,sklearn 是第一个要去的包——还有其他你应该知道的。

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

安东·达利斯在 Unsplash 上的照片

对于大多数数据科学家来说,当谈到 Python 中的经典机器学习算法时,sklearn 是第一个首选包。但是这并不意味着没有其他优秀的软件包可以用来建模。我在本文中展示的软件包主要与回归分析有关,许多数据科学家不合理地将回归分析与简单化的建模联系起来。

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

- [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)

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

大多数认为他们需要高级人工智能/人工智能的公司实际上只需要对清理后的数据进行线性回归。罗宾·汉森发推文。

虽然我在上面的推文中感觉到了讽刺,但掌握线性回归的主要假设远远不是简单的(例如,多重共线性,多元正态性,同方差性等)。).许多数据科学家不知道的另一件事是,线性回归和逻辑回归是同一算法家族的一部分——广义线性模型(GLM)。

认识统计模型

我一直很喜欢 R 在训练一个回归模型后给你一个详细的输出。一个提供类似输出的 Python 包是stats models——一个用于估计许多不同统计模型,以及进行统计测试和统计数据探索的包。

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

r 中训练的回归模型的详细摘要。

在下图中,我们可以观察到用 statsmodels 训练的回归模型的摘要。看起来和 r 里面的差不多,甚至还会显示警告,这是相对于 sklearn 的另一个优势。

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

使用 statsmodels 训练的回归模型的摘要。

广义线性模型

如上所述,逻辑回归和线性回归是广义线性模型的一部分。GLM 通过链接函数将线性模型与响应变量相关联,并允许每个测量值的方差大小是其预测值的函数,从而推广了线性回归。广义线性模型由约翰·内尔德和罗伯特·威德伯恩提出,作为一种统一各种其他统计模型的方式,包括线性回归、逻辑回归和泊松回归。

想更多地了解 GLM,请听一听伟大的吴恩达的演讲:

吴恩达关于广义线性模型的讲座

GLM 让你使用概率分布作为建模的基础。让我们看一个使用 statsmodels 的逻辑回归的例子:

import statsmodels.api as smmodel = sm.GLM(y_train, x_train, family=sm.families.Binomial(link=sm.families.links.logit()))

在上面的例子中,逻辑回归是用二项式概率分布和 Logit 链接函数定义的。注意,y_train 是一个带有目标变量的数组,x_train 表示一个特征数组。

默认情况下,statsmodels 中不添加截距列(1 的列)。我们可以添加以下内容:

sm.add_constant(x_train)

要用线性回归(普通最小二乘回归)代替逻辑回归,我们只需要改变家族分布:

model = sm.GLM(y_train, x_train, family=sm.families.Gaussian(link=sm.families.links.identity()))

另一种常用的回归是泊松回归,它假设目标变量具有泊松分布。它被用来模拟计数变量,比如在学校患感冒的人数。同样,使用 statsmodels,我们只需要更改家族分布:

model = sm.GLM(y_train, x_train, family=sm.families.Poisson())

虽然 sklearn 中有线性回归逻辑回归泊松回归,但我真的很喜欢 statsmodels API 的实现方式。它还提供了许多定制,我将在下一篇关于 statsmodels 的文章中谈到这些。

下降趋势

在 sklearn 上使用 statsmodels 的一个缺点是它不支持稀疏矩阵。这使得用许多稀疏特征来训练模型是不可行的,例如用单词包方法转换的文本特征。

sklearn 文档优于 statsmodels 文档。

总的来说,sklearn 似乎比 statsmodels 更优化。

参考

在你走之前

Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的

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

考特尼·海杰Unsplash 拍摄的照片

当你的机器人队友完成更多工作时,你会感到不安吗?

原文:https://towardsdatascience.com/are-you-upset-when-your-robot-teammate-gets-more-work-done-202b5184523e?source=collection_archive---------42-----------------------

与机器人合作测量人类的成就感

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

列宁·艾斯特拉达在 Unsplash 上的照片

作为一名受人类心理学好奇心驱使的研究人员,我一直想探索更多关于用户的自我感知和成就感。在卡内基梅隆大学学习人机交互课程期间,我设计了一个项目,并带领另外两名队友探索人机合作如何影响人类的成就感

在整个研究过程中,我发现当机器人做的工作比他们多得多时,人们对自己的自我表现不满意,尤其是如果机器人纠正了他们!

动机:为什么是成就感?为什么要共享任务?

因为人类是复杂的…机器人可以帮助我们更快更容易地完成工作,但当机器人做得比我们更多更好时,我们是否还会自我感觉良好,就像我们自己做时一样(即使我们对机器人的工作结果感到满意)?

假设

在人-机器人协作场景中,机器人参与程度的提高会导致人类成就感的降低。

研究设计

2x1 研究:每个参与者和一个 Cozmo 组成的团队玩一个 9x9 的数独游戏。在游戏过程中,参与者和科兹莫轮流填写答案,每轮持续 30 秒。轮流是为了确保他们都有平等的机会做出贡献,他们可以根据需要使用尽可能多的回合来完成游戏。由于 Cozmo 能力有限,其答案由语音宣布,由参与者填写。答案用颜色编码以区分玩家,整个研究过程被录像。

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

条件:

  1. 正常情况:Cozmo 作为参与者输入了相同数量的答案
  2. 过度条件:Cozmo 作为参与者输入了两倍的输入数。

**独立变量:**coz mo 的输入/转数

**因变量:**参与者的成就感

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

测量:

  1. 定量研究——调查(预测试调查和赛后调查);
  2. 定性研究——赛后访谈、观察。

测量人类的成就感

成就感被定义为“当个人受到挑战并意识到结果将反映他们个人的成功或失败时,他们会被激励去实现目标”(Smith,R. L .,2015)。在设计调查时,我“借鉴”了一些心理测量方法:

  • need(N)——非常想达到某个目的;
  • 成功的希望(HOS)——在成功实现之前期待成功;
  • 成功感受(SF)——成功后的良好感受;

赛前调查

人口统计:

  1. 你多大了?
  2. 你的性别是?
  3. 你想获得哪个教育学位?
  4. 你以前和机器人交流过吗?

请用 1-5 分来评定您对以下陈述的同意或不同意程度(1-完全不同意,5-完全同意)。

熟练度:

  1. 我精通数独。

成就动机:

  1. 我渴望赢得这场比赛。
  2. 我渴望看到我在比赛中的表现。
  3. 如果我赢了这场比赛,我会自我感觉良好。

关于与机器人合作的感知

  1. 我渴望在游戏中与 Cozmo 合作。

赛后调查

请用 1-5 分来评定您对以下陈述的同意或不同意程度(1-完全不同意,5-完全同意)。

成就感:

  1. 这个游戏对我来说很有挑战性。
  2. 我喜欢这项运动的挑战。
  3. 我对比赛的结果很满意。

成就动机的变化:

  1. 如果我下次再玩,我会渴望赢得这场比赛。
  2. 赛后自我感觉良好。
  3. 我认为游戏结果反映了我对游戏的熟练程度。

对与机器人合作的看法

  1. 我对科兹莫在比赛中的贡献感到满意。
  2. 我对我和科兹莫在比赛中的配合很满意。
  3. 如果下次再玩的话,我很想和 Cozmo 再次合作。
  4. 游戏中你会如何在 Cozmo 的贡献和你的贡献之间分配 10 分?
  5. 如果 Cozmo 纠正了你在游戏中的输入,你对此作何感想?

除了调查之外,半结构式访谈观察也补充了我的研究发现。

激动人心的部分…我发现了什么?

以下发现基于 16 名在校园招募的参与者的结果。性别分布和游戏水平分布是相等的。与机器人互动体验的比例为 9(是):7(否)。

一.关于成就

当人们需要帮助时,他们会重视机器人的输入。但是当机器人做了这个人本来可以做的那部分工作时,他/她的成就感很可能会降低。

在赛前和赛后比较以下 3 个要素时,正常组无显著性差异(P>0.05)。

然而,过度组明显增加了赢得游戏的欲望,降低了自我认知,减少了合作的欲望(P <0.05), which showed that 他们在游戏后变得更具竞争性,他们不像以前那样自我感觉良好,他们也不那么渴望与 Cozmo 合作。

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

这些发现得到了以下观察到的行为的支持:

  • 轮流抢着写更多的答案😣
  • 甚至在回合即将结束的时候,匆忙写下最后一个答案🤯
  • 预测了科兹莫的答案,表明他们知道答案😒
  • 冲着科兹莫大喊“站住!!"😫
  • 发誓“啊,XXCK!Cozmo!”🤬

当机器人纠正人类时会发生什么…

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

在正常组中,Cozmo 纠正参与者越多,他们对自己的合作越满意。在过度组中,当 Cozmo 纠正他们时,参与者不太满意。当机器人以一种流畅的方式纠正人们时,这是完全可以接受的,甚至是有帮助的。但是当机器人本身具有攻击性时,人们会强烈地消极地看待纠正。

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

一个参与者的黑板上写满了更正

“我很沮丧,因为科兹莫不喜欢我的答案,他几乎纠正了一切。”

“我觉得自己不够聪明,无法独自解决这个游戏”

当有人有机会纠正一个机器人时(我们在遥控 Cozmo 时犯了一个错误……),这个人说**“那很有趣。那真的很有趣。”**🤣— 这向我们展示了一个人的自信可以通过纠正一个机器人来重建

二。关于信任

在人机协作任务中,人们依赖机器人的贡献。但他们的信任可能会随着时间的推移而建立起来。

科兹莫是一个令人满意的队友吗?

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

两组人都认可 Cozmo 的贡献,Cozmo 贡献越多,越多人对游戏结果感到高兴。

人们信任科兹莫的能力吗?

总的来说,当 Cozmo 纠正参与者的答案时,有两种反应。

首先,一些参与者立即信任了 Cozmo。

“我会盲目地信任他,因为他是一个机器人,我会假设他有完美的程序来解决世界上任何数独难题。”

其次,对于其他参与者来说,信任需要时间来建立。

“起初我不相信,但这些数字是合理的,所以我知道他是对的”

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

一名参与者将科兹莫的答案更正回他的答案

限制

一如既往,还是有局限性的。

首先,轮流设置很棘手。它给参与者增加了更多的竞争氛围,但也可能会打断他们的思维过程,就像他们在玩数独时通常会做的那样——不过我确实认为利大于弊。在真正的人-机器人协作任务中,花费的时间是一个重要的衡量标准,因为我们希望优化成本和效率。

第二,让参与者填写 Cozmo 的答案需要更多的认知努力,这对他们来说更困难。

第三,我们需要一个更加多样化的小组和大量的参与者来获得有统计学意义的发现。

参考

史密斯,R. L. 《成就动机的情境测量:对咨询研究的意义》 (2015)

你用够优惠券了吗?

原文:https://towardsdatascience.com/are-you-using-enough-coupons-d18c2d18dd5f?source=collection_archive---------10-----------------------

建立模型来预测优惠券的兑现和设计更好的促销活动

图片取自giphy.com

我喜欢好的销售。在网上商店的收银台点击购买按钮之前,看到总价打折是如此令人满意。此外,我定期购买家庭用品或我的狗和猫的药物和补充剂,我需要定期获得更多的折扣。我们会收到关于特别优惠和优惠券的通知和电子邮件,我们有时会等待交易来进行大额采购和购买礼物,如黑色星期五。

优惠券营销策略有很多好处。优惠券吸引新客户,重新激活老客户。使用优惠券的促销活动可以吸引客户尝试新产品或相关产品并购买更多产品,从而创造非常有效的广告机会。例如,亚马逊 2019 年的 Prime Day 的销售总额超过了 2018 年黑色星期五和网络星期一的总和。

为了衡量促销活动是否成功以及如何改进,调查优惠券的兑现情况以及影响优惠券兑现行为的因素非常重要。在这篇文章中,我想介绍我的项目对预测优惠券赎回使用机器学习技术。通过构建模型,我们还可以了解哪些因素会影响客户兑换优惠券,以及我们是否可以提出一些建议来设计更好的促销活动。

这篇文章将主要集中在总结这个过程——我如何以及为什么选择在每个步骤中使用的特定方法和技术,以及我如何解释建模结果。

关于数据集

以下是该网站的部分描述:

ABC 促销活动通过各种渠道共享,包括电子邮件、通知等。许多此类活动包括为特定产品/产品系列提供的优惠券折扣。零售商希望能够预测客户是否会兑现跨渠道收到的优惠券,这将使零售商的营销团队能够准确地设计优惠券结构,并制定更精确和更有针对性的营销策略。

此问题中的可用数据包含以下信息,包括活动样本和先前活动中使用的优惠券的详细信息-

用户人口统计详细信息

活动和优惠券详情

产品详情

以前的交易

根据过去 18 次活动的交易和绩效数据,预测每个优惠券和客户组合的测试集中接下来 10 次活动的概率,客户是否会兑现优惠券?

请注意,我只使用了包含 18 个活动信息的训练数据集,将该数据集分为两组——训练集和测试集,因为它具有已知的目标变量值。

数据从 Kaggle 获得,由 6 个表格组成。

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

来自 Kaggle 的数据库模式

目标变量是序列中的 redemption_status ,预测变量从其余特征中创建。该网站描述的最初任务是使用训练数据集训练模型,这是大多数功能不言自明的结果,所以我只想说明其中一些功能并不明显。但是你可以访问我的 GitHub 库或者ka ggle 站点来获得每个特性的定义。活动数据中的特征 campaign_type 为匿名活动类型(X 或 Y);例如,像半年一次或一年一次的定期销售和像季节性活动这样的不定期销售可以归类为 X 类型,而其他不一致的活动可以归类为 Y 类型。客户人口统计表中的 income_bracket 表示一个标签编码的收入等级,较高的收入对应于较高的数字。

数据理解

我在这些数据中发现了三大特征。

首先,目标变量*、redemption_statuse、*是分类变量,0(否)或 1(是)用于息票兑现,因此这是一个分类问题。

第二,目标变量不平衡。用数据准备步骤前的原始数据,赎回率为 0.93%!很难为一小部分人正确训练模型,因为预测 100%的“未赎回”将产生超过 99%的准确性。

第三,表格需要仔细合并,需要创建更多的功能。上面的模式显示它是一个关系数据库,除了客户交易数据之外,所有的表都有一个主键,这个主键是表中每个数据点的惟一值。表中包含“id”的模式的列表中的第一个功能是主键,但是客户事务数据没有唯一的事务 id。因此,为了使用此表中的数据,需要按关键字聚合数据,例如使用客户人口统计数据和客户交易数据中的 customer_id 的每个客户使用的优惠券折扣数。

数据准备

我不会重复我所经历的每个数据准备过程,但我会强调主要步骤。你可以访问我的 GitHub 库来查看整个过程和代码。

为了处理不平衡类问题,实现了 SMOTE(综合少数过采样技术)重采样方法。它在训练数据中生成了更多的正类(1,“已兑换”)数据点,这些数据点具有与原始数据点“相似”的属性。由于我们正在干预模型的训练方式,过采样数据的大小应该尽可能小。在图 1 中,当少数类与多数类之比大于 0.33 时,ROC 曲线下面积(AUC)值彼此相似,这是为重采样过程选择的。

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

图一。测试数据集预测的 ROC 曲线。训练数据集随着少数类(1,赎回)与多数类(0,未赎回)的不同比率而变化。曲线离直线越远(AUC 值越大),模型拟合越好。

注意,SMOTE 方法很容易使用imblearn包在 python 中实现。

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

图 2。SMOTE 方法的示例代码。在 SMOTE_ratio = 0.33 的情况下,两个类别之间的比率变为大约 1:3。

此外,数据准备的最大部分之一是组合来自多个表的信息的特征工程。例如,如果我们要从客户交易数据中获得关于商品的信息,我们需要通过 item_id 聚集交易表。我们可以使用pandas.pivot_table功能创建列表中描述的新特征。

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

表 1。通过聚合客户交易数据中的列创建的新功能。

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

图 3。由pivotting tables汇总数据的示例代码

例如,我无法组合上表中与项目相关的特性列表,因为它们不包括训练和测试数据中的 item_id 。所以transaction1是通过来自客户交易数据的数据聚合(代码中的transaction)用新特性创建的。然后合并到物品数据表和优惠券物品映射表。最后,合并的表中的特征通过 coupon_id 聚集,其是训练和测试数据集*中的列之一。*重复数据聚合和两个表的合并,以提取尽可能多的信息,将它们与训练和测试数据集相结合,作为新特征。

模型建立的过程

在我们进入数据分析和建模之前,我们需要对这个项目的建模有一个清晰的预期。我发现询问和回答这些问题对于选择模型的类型和度量模型性能的标准非常有帮助。

—我想从建模中得到什么?

我想知道是什么影响顾客不使用或使用优惠券,这样我就可以设计有效的促销活动,让更多的顾客参与进来。这意味着我希望模型具有解释哪些预测变量对预测目标变量值影响更大的特征重要性。我选择使用逻辑回归、随机森林和梯度推进方法,因为它们都可以提供特征重要性,并且这三种方法在寻找预测变量和目标变量之间的关系时彼此有很大不同。

—在目标变量(息票兑现状态)的两个类别之间,预测哪个(或曾经哪个)更重要?

由于给定数据集中的大多数交易没有使用优惠券来获得折扣(因此是不平衡的数据集),我希望模型了解优惠券兑换交易的条件。因此,我想专注于预测积极的类权利,并通过专注于回忆分数来检测它们中的大多数;在已知的正类总数中,预测的正类数所占的比率。准确度分数仍然很重要。然而,如前所述,即使大多数正类都是错误的,仍然会产生高精度的模型,而这并不是判断模型的最有用的度量。只要准确度“稍微”高,我们就将模型调成具有高召回分数。

—预测错误的后果(成本)是什么?精准评分怎么样?

在这种情况下,具有相对高数量的假阳性从而具有低精度分数的后果不是很严重。与信用卡欺诈检测或疾病检测问题不同,包括许多假阳性只是意味着基于该模型的下一次推广将针对更广泛的条件。此外,请注意,召回分数和精确度分数是相反的关系。为了增加召回分数,挑选肯定类的规则将是宽松的,并且将接受更多的假肯定,因此精度分数下降。

通过回答以上问题,我的计划变成了:

  1. 使用逻辑回归、随机森林和梯度推进方法建立模型,
  2. 调整侧重于召回分数的模型,
  3. 分析模型结果和特征重要性。

模型评估和结果

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

表二。不同模型在列车组上的评估分数

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

表 3。不同模型在测试集上的评估分数

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

图 4。通过图比较训练集和测试集之间的评估分数

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

图 5。三种模型的混淆矩阵比较:随着真阳性(右下值)数量的增加,假阴性数量减少。

对于这三种数据,准确度分数表明模型没有过度拟合——训练数据和测试数据之间的准确度分数差异不是太大。然而,训练和测试数据集之间的召回分数的差异更大,尤其是梯度增强模型。正如我们之前所讨论的,当一个模型具有较高的回忆分数(尤其是对于次要肯定类)时,它具有相对较低的 F-1 分数和准确性分数,因为精确度分数较低。对于我们的需求,我们应该选择哪种模式作为最佳模式?嗯,检测更多的正类比预测的准确性更重要。所以我会选择逻辑回归模型和随机森林模型,而不是梯度推进模型。在这两个模型之间,尽管逻辑模型的准确度分数比随机森林模型的分数低大约 16%,但是其召回分数比随机森林模型的高大约 14%。因此,在分析以前的促销活动时,逻辑模型将是我依赖其特征影响的模型。另一方面,我会使用随机森林模型来估计促销活动设计时优惠券兑换的结果,因为它的准确性和 F1 分数高于具有相对较高回忆分数的先前模型。但是现在,让我们分析和比较所有三个模型的特性重要性和我们心目中模型的排序。在下面的图中值得注意的一件事是,从一个图到另一个图,有许多特征是一致的。事实上,随机森林模型中前 10 个重要特征中的每一个特征都在梯度增强模型中的列表上,只是在等级上有所不同。

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

图 6。每个模型的前 10 个最重要的特征:顶部)逻辑回归,中间)随机森林,底部)梯度增强。请注意,衡量每个模型重要性的系数和分数的尺度是不同的,因为它们的计算方式因模型而异。

首先,请注意,从模型到分级特征的系数和分数是不同的尺度,因为计算这些数字的公式因模型而异。此外,来自最后两个模型的分数现在确实指示每个特征是否对目标变量具有负面或正面影响,不像逻辑回归模型的系数那样假设预测变量之间的线性关系。我使用上述图中的特性重要性列出了解释和建议

客户特征分析

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

图 7。按优惠券使用次数统计的客户数量:兑换优惠券的大多数客户都不止一次使用过优惠券。

  • 每位客户的平均优惠券使用量:平均使用很多优惠券的客户可能会使用更多优惠券:通过改善促销/优惠券广告的来源来鼓励客户使用更多优惠券
  • 客户消费总额:在整个交易历史中具有高消费水平的客户,即忠诚客户或挥金如土的人,更有可能使用优惠券——想办法培养和保持忠诚客户,如启动奖励计划。
  • 年龄范围:任何年龄范围特征都有负面影响,所以我们应该在相对意义上比较年龄范围相关特征。—调查 36 岁至 55 岁年龄段的客户不太可能使用优惠券的原因,并想办法鼓励他们参与促销活动。

促进

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

图 8。按活动类型统计的平均事务数:平均而言,X 类型活动期间的事务数要高得多。

  • 活动类型 Y(-):虽然有 14 个 Y 类型促销和 4 个 X 类型促销,但 X 类型的交易和优惠券兑换的数量远远大于 Y 类型。通过观察两种类型的频率,X 类型的活动似乎是季节性销售,通常是大销售,而 Y 类型的活动在给定的数据时间内定期进行。对这一特征的负面影响可以被认为是,客户将预期在 X 类型活动期间使用更多优惠券,并且将较少关注通过电子邮件等渠道发送给他们的 Y 类型活动的优惠券。—通过将 type_Y 促销更改为 type_X 促销,在根据随机森林模型增加了 660%的测试数据集中,优惠券兑现率从 0.85%更改为 6.5%。这一预测表明,增加 X 型促销的规模可以导致息票兑现率的增加。另一方面,零售商可能会想出更好地宣传 Y 类促销的方法。

优惠券

  • 优惠券使用总数:过去受欢迎的优惠券将有更高的机会被兑换。—调查使某些优惠券受欢迎并推广其他优惠券的因素。
  • 优惠券覆盖的品牌数量:不同品牌的广泛适用优惠券更有可能被兑换。—制作不太针对品牌的优惠券

未来方向和局限性

虽然我能够提出有见地的结论和建议来提高息票兑现率,但这个建模工作有一些局限性。

模型通过最小化或最大化数学公式(如损失函数或信息增益公式)来导航和预测结果。他们没有关于这个数据集的业务理解或背景信息。因此,当我们从一个对我们没有意义的模型中得到结果时,我们必须以正确的方式分析它们。例如,根据逻辑回归模型,平均息票折扣对息票赎回有负面影响;顾客拥有的折扣券越多,他/她使用优惠券的可能性就越小。嗯,对我来说没什么意义。但我们可以看到它是平均优惠券折扣。如果每张优惠券的折扣值不像钟形曲线那样分布在中间,它们的平均值就不是表示数据集的最佳方式。这些值的中值或众数可能更好。

此外,虽然实现了三种方法来创建模型,但是可能有更好的方法来再现数据的行为。如果 XGBoost 库可以构建一个提供更好结果的模型,我以后会尝试使用它。

我希望这篇文章对你有用。我试图告诉你整个故事,而不是集中在一个特定的主题或技术。我将真诚地感谢您的评论和问题。

你使用马尔可夫链解决多渠道归因的方法正确吗

原文:https://towardsdatascience.com/are-you-using-markov-chains-to-solve-multi-channel-attribution-the-right-way-53b204412e0b?source=collection_archive---------54-----------------------

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

马库斯·温克勒在 Unsplash 上的照片

多渠道归属没有一站式解决方案

在过去的一年里,我花了一些时间研究多渠道归因问题。在这个旅程中,我被马尔可夫链解决这个问题的潜力所吸引。由于某些原因,马尔可夫链背后的数学概念非常容易理解,它的实现也很容易理解。然而,这并不是所有情况下的解决方案,我认为,在关于这个主题的文章中,并没有充分考虑到解决多渠道归因的设置是否符合使用马尔可夫链的必要条件。

在这篇文章中,你会发现一个快速演示的条件,需要尊重使用马尔可夫链作为工具来做多渠道归因。

多渠道归因问题:

问题很简单,当有一个涉及多个渠道(广告、网站页面、社交媒体帖子)的营销设置旨在推动客户转化时,我们如何评估每个渠道对转化的整体影响?

为了理解马尔可夫链在多渠道归因环境中的局限性,我们需要快速回顾一下。

马尔可夫链 101:

马尔可夫链是由两组参数定义的数学对象:状态和这些状态之间的转移概率。

对于多渠道归因问题,状态由您想要建模的流程/设置定义,这些是客户在“转换”之前可以采取的各种渠道/步骤(展示、社交媒体、谷歌广告等)。

转移概率是从一个状态转移到另一个状态的概率。它们可以用下面的公式计算。

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

另一个用例示例是使用马尔可夫链对儿童一天的活动进行建模。这些状态就是活动,比如玩、吃和哭。转移概率是一个活动接一个活动的概率。

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

路易斯·福克在 Quora

根据定义,马尔可夫链是内存小于,这意味着它只考虑当前状态来评估最可能的下一个状态。它带有强假设,即当前状态拥有关于下一个状态的所有信息。

如果你想了解更多关于马尔可夫链及其用例的知识,这篇文章是一个很好的起点。

多渠道归因的马尔可夫链

多渠道属性的马尔可夫链表示如下:

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

杰里米·纳尔逊在 Dev

马尔可夫链在哪些情况下可以用来做多渠道归因?

只要客户端从一个状态移动到另一个状态而没有任何中断,使用马尔可夫链进行多通道归因是有意义的,从而尊重无记忆假设。

假设您想要解决多渠道归因问题的设置由以下两个组件组成。首先,广告、文章和社交媒体文章的目标是增加你登陆页面的流量。其次是登陆页面和网站的其余部分(如果有的话)。在这种情况下,状态将是不同的进入通道(第一组件)、网站页面(第二组件)加上转换和空状态,它们分别对应于订单和订单的缺失。在本例中,我选择下订单作为转换状态,但根据您的分析重点,它可能是客户可以对您的业务进行的任何有价值的操作,例如:注册活动、将产品添加到购物篮、订阅时事通讯、请求销售电话等。

基于这种设置,我将给出一个用例示例,对于该用例,使用马尔可夫链作为解决多通道问题的工具是有意义的,而对于该用例,则没有意义。

工作用例示例

分析客户在您网站上的旅程,从引导他们进入您网站的入口渠道(第一部分)开始,到他们退出网站或下订单时结束。在这种情况下,顾客从一个状态到另一个状态没有任何中断地移动,因此无记忆假设得到尊重。

即使它允许将相对影响归因于花费金钱的媒介(展示、谷歌广告、社交媒体广告等),它们之间的预算优化也不应仅仅基于马尔可夫链结果。

非工作用例示例

分析客户的整个购买过程,包括从他们与你的品牌的第一次互动或最后一个订单后的第一次互动到(下一个)订单的所有状态(即转化),或者如果没有订单,直到研究时间框架结束(非转化)。在这种情况下,无记忆的假设是不被尊重的(至少在大多数时候),因为购买旅程只不过是你网站上不同的连续(有时是独立的)旅程的集合。事实上,一个客户最终在谷歌广告上点击了你网站的链接,这并不(完全)是因为他两周前滚动的最后一页,而是因为他通过他所经历的各种状态对你的品牌有了全面的体验。因此,当评估状态(即渠道)对整个购买过程的影响时,无记忆假设是不可接受的。此外,在这种情况下,将未转化状态定义为在研究时间框架结束时没有订单也是一个重要的假设,因为他可以在研究时间框架结束后几天转化。

履行

如果你对使用马尔可夫链解决多渠道归因问题有信心,你可以不遵循本文中的指南。

另外,R 中有一个由 CRAN 开发的很棒的包,用于将马尔可夫链应用于多通道属性问题。它附带了一个文档,将向您介绍使用它之前要做的数据处理步骤。

如果你想帮助我和其他人发现我们如何利用数据科学改善营销,我很乐意在Linkedin上讨论。

你在 Scikit-Learn 中使用 Pipeline 了吗?

原文:https://towardsdatascience.com/are-you-using-pipeline-in-scikit-learn-ac4cd85cb27f?source=collection_archive---------24-----------------------

使用 Pipeline 和 GridSearchCV 找到最佳的定标器、估算器和不同的变压器。

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

来源:作者图片

如果你在做机器学习,你会遇到管道,因为它们可以帮助你做出更好的机器学习工作流程,易于理解和重现。

如果你不知道管道,你可以参考 Rebecca Vickery 的博客Scikit-learn 管道的简单指南Saptashwa BhattacharyyaScikit-learn 的机器学习管道的简单例子

我最近发现,你可以将 Pipeline 和 GridSearchCV 结合起来,不仅可以为你的模型找到最好的超参数,还可以为你的机器学习任务找到最好的变压器

  1. 缩放器缩放您的数据。
  2. 填补缺失值的估算策略。
  3. 您应该使用的 PCA 成分数量。

和许多其他人。让我们看看如何能做到这一点。

数据集详细信息

为了更好地演示,我将使用 OpenML 中的 Titanic 数据集来演示如何创建数据管道。

您可以使用以下命令下载数据集-

from sklearn.datasets import fetch_openml# Dataset details at- [https://www.openml.org/d/40945](https://www.openml.org/d/40945)
X, y = fetch_openml("titanic", version=1, as_frame=True, return_X_y=True)

此外,看看我的笔记本,里面有关于每个操作的更多细节,可以随意下载并导入到您的环境中,然后进行试验-

[## ankitgoel 1602/数据科学

该目录详细介绍了如何使用数据管道对数据进行各种操作。还有…

github.com](https://github.com/ankitgoel1602/data-science/tree/master/data-pipeline)

创建数据转换器管道

在这里,我将使用一部分特性来进行演示。数据集既有分类特征又有数值特征,我们将对它们应用不同的操作。流程是这样的-

1.定义数字和分类特征。

2.对于数字特征,填充缺失值,然后缩放数据。

数据集中的数字特征很少有缺失值,我们在这里使用简单估算器来填充这些值,也可以使用其他估算器。此外,我们应该使用比例来标准化数字特征的范围,因为许多机器学习模型需要遵循相同比例的特征。我还没有定义输入的策略和缩放器需要使用,因为同样可以使用 GridSearchCV 搜索。

3.对于分类特征,填充缺失值,然后应用一键编码。

我们数据集中的“已装船”要素几乎没有缺失值。因为我们有不同的策略来填充分类特征,所以要为此创建不同的估算器。此外,由于分类特性只有几个值,所以我使用 OneHotEncoder,它通常用于为分类列中的每个值创建不同的特性。使用 GridSearchCV 搜索输入策略。

4.使用 ColumnTransformer 组合数字和分类转换器。

ColumnTransformer 有助于为不同类型的输入定义不同的转换器,并在转换后将它们组合到单个特征空间中。在这里,我们应用上面为我们的数字和分类特征创建的数字转换器和分类转换器。

5.应用主成分分析降低维数。

主成分分析(PCA)是一种线性降维算法,用于通过保持最大方差来减少数据集中的特征数量。我们可能不需要在这里应用 PCA,因为它是一个小数据集,但我们的想法是展示如何使用 GridSearchCV 在 PCA 中搜索 number_of _components。

将分类器添加到管道中

上面,我们创建了一个预处理器管道,其中包含了我们希望应用于数据的所有操作。我将在这里使用逻辑回归作为我们问题的分类器。如果你有兴趣知道如何应用多种模型,丽贝卡·维克里在她的博客中提到了一个很好的方法。

应用 GridSearchCV

每个数据科学家都知道 GridSearchCV,它可以帮助我们找到模型的最佳超参数。有一点是错过了的,那就是你甚至可以借助管道用它来找出最好的变形金刚。在我们上面创建的预处理器管道中,你可能已经注意到我们没有定义

  1. 定标器,
  2. 输入缺失值的策略,
  3. PCA 中的组件数量

因为我们可以使用 GridSearchCV 来找到它们的最佳值。这是如何做到的-

以上,我试图从 3 个不同的定标器和估算策略中找出最佳定标器,用于我们的数字和分类列,以及 PCA 的组件和我们模型的超参数。很有帮助,不是吗?

可视化管道

Scikit-Learn 0.23.1 增加了可视化复合估计量的功能,这对于交叉检查您应用的步骤非常有帮助。下面的代码可以帮助你可视化数据管道。

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

来源:作者 GIF

缓存管道中的转换器

在这里,我创建了许多不同的数据可以计算密集型变压器。管道提供了一个参数’存储器,如果参数和输入数据相同,可以用它来缓存转换器。我们可以将“memory”设置为缓存转换器的目录路径,或者它可以是一个 joblib。内存对象。下面,我使用当前目录作为缓存目录,在这里将创建转换器的所有缓存对象。

cache_dir = "."
cached_pipeline = Pipeline(estimators, memory=cache_dir)

我一直在使用管道,因为它非常容易实现,并且帮助我们解决了许多问题。我希望这也能帮助你们改进机器学习的工作流程。如果你刚刚开始你的数据科学之旅,或者想了解一些用于数据科学的很酷的 python 库,那么看看这个- 今天就开始你的数据科学之旅

注意安全!!!继续学习!!!

你使用 Python 和 API 吗?了解如何使用重试装饰器!

原文:https://towardsdatascience.com/are-you-using-python-with-apis-learn-how-to-use-a-retry-decorator-27b6734c3e6?source=collection_archive---------2-----------------------

实现重试装饰器可以防止意外的一次性异常。

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

图片由免费提供-照片来自 Pixabay

人们经常将 Python 描述为“胶合语言”术语“粘合语言”对我来说意味着一种语言有助于连接系统,并确保数据以期望的结构和格式从**A**传到**B**

我用 Python 构建了无数 ETL 脚本( E 提取 T 转换 L oad)。所有这些脚本本质上都是根据相同的原理运行的。他们从某个地方提取数据,转换数据,然后运行最后的操作。最后一个操作通常意味着将数据上传到某个地方,但也可能是有条件的删除。

越来越多的典型公司基础设施正在向云迁移。越来越多的公司转向微服务方式。这些从本地到基于云的范式转变意味着您可能也面临过这样的情况,您必须从本地计算机之外的某个地方提取数据或将数据写入某个地方。

在小范围内,很少会有这方面的问题。如果某些提取或写回失败,您通常会注意到这一点,并能够纠正错误。但是,当您走向更大规模的操作和潜在的成千上万的事务时,您不希望由于 internet 连接的暂时中断、太多的并发写入、暂时无响应的源系统或天知道还有什么其他原因而受到影响。

我发现一个非常简单的 retry-decorator 在无数类似的情况下是一个可取之处。我的大多数项目,或多或少,最终都在某个 util 模块中使用了 retry decorator。

装饰者

函数是一级对象

在 Python 中,函数是一级对象。函数就像任何其他对象一样。这一事实意味着函数可以动态创建、传递给函数本身,甚至可以更改。看看下面这个例子(虽然有点傻):

**def** my_function(x):
    print(x)**IN:** my_function(2)
**OUT:** 2**IN:** my_function.yolo = 'you live only once'
print(my_function.yolo)
**OUT:** 'you live only once'

装饰功能

很高兴知道我们可以用另一个函数包装一个函数来满足特定的需求。例如,我们可以确保函数在被调用时向某个日志记录端点报告,我们可以打印出参数,我们可以实现类型检查、预处理或后处理等等。让我们看一个简单的例子:

**def** first_func(x):
    **return** x**2

**def** second_func(x):
    **return** x - 2

当用字符串'2'调用时,两个函数都失败。我们可以在组合中加入一个类型转换函数,并用它来修饰我们的first_funcsecond_func

**def** convert_to_numeric(func): *# define a function within the outer function*
 **def** new_func(x):
        **return** func(float(x)) *# return the newly defined function*    **return** new_func

这个convert_to_numeric包装函数期望一个函数作为参数,并返回另一个函数。

现在,虽然之前会失败,但是如果您包装这些函数,然后用一个字符串数字调用它们,所有功能都会按预期工作。

**IN:**
new_fist_func = convert_to_numeric(first_func)*###############################*
*convert_to_numeric returns this function:* ***def***new_func*(x):* ***return***first_func*(float(x))
###############################*new_fist_func('2')
**OUT:** 4.0**IN:**
convert_to_numeric(second_func)('2')
**OUT:** 0

那么这到底是怎么回事呢?

嗯,我们的convert_to_numeric以一个函数 (A) 作为参数,返回一个新的函数 (B) 。新函数 (B) 在被调用时,调用函数 (A) ,但是它不是用传递的参数x调用它,而是用float(x)调用函数 (A) ,因此解决了我们之前的TypeError问题。

装饰语法

为了让开发人员更容易理解,Python 提供了一种特殊的语法。我们还可以执行以下操作:

***@convert_to_numeric***
def first_func(x):
    return x**2

上述语法相当于:

**def** first_func(x):
    **return** x**2first_func = convert_to_numeric(first_func)

这个语法让我们更清楚到底发生了什么,尤其是在使用多个 decorators 的时候。

重试!

现在我们已经讨论了基础知识,让我们转到我最喜欢和经常使用的retry——装饰者:

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

此处代码

包装被包装的函数。这是一些盗梦空间的东西。但是请原谅我,这并没有那么复杂!

让我们一步一步地浏览代码:

  1. Outmost 函数**retry**:这将参数化我们的装饰器,即我们想要处理的异常是什么,我们想要多长时间尝试一次,我们在两次尝试之间等待多长时间,以及我们的指数补偿因子是什么(即我们每次失败时用什么数字乘以等待时间)。
  2. **retry_decorator**:这是参数化的装饰器,由我们的**retry** 函数返回。我们正在用**@wraps**装饰**retry_decorator** 内的功能。严格来说,就功能而言,这是不必要的。这个包装器更新被包装函数的__name____doc__(如果我们不这样做,我们的函数__name__将总是**func_with_retries**)
  3. **func_with_retries**应用重试逻辑。该函数将函数调用包装在 try-except 块中,并实现指数后退等待和一些日志记录。

用法:

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

用 retry-decorator 修饰的函数,对任何异常最多尝试四次

或者,更具体一点:

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

用 retry on TimeoutError 修饰的函数将最多尝试两次。

结果:

调用修饰函数并遇到错误会导致如下结果:

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

被调用的函数在 ConnectionRefusedError 上失败了两次,在 ConnectionResetError 上失败了一次,并在第四次尝试时成功。

这里我们有很好的日志记录,我们打印出了argskwargs以及函数名,这将使调试和修复问题变得轻而易举(如果在所有重试次数用完之后错误仍然存在)。

结论

这就是了。您了解了装饰器如何在 Python 中工作,以及如何用一个简单的重试装饰器来装饰您的任务关键型函数,以确保它们即使在面临一些不确定性时也能执行。

如果你喜欢你所阅读的内容,并且不想错过新的故事,请在此订阅:

[## 通过我的推荐链接加入 Medium-Fabian Bosler

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

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

关于如何加速代码的进一步阅读:

[## 每个 Python 程序员都应该知道并不秘密的线程池

通过多线程,您只需要几行代码就可以将代码速度提高几个数量级

medium.com](https://medium.com/better-programming/every-python-programmer-should-know-the-not-so-secret-threadpool-642ec47f2000) [## 每个 Python 程序员都应该知道标准库中的 Lru_cache

通过使用简单的缓存功能,只需一行代码就可以加快函数的速度

medium.com](https://medium.com/better-programming/every-python-programmer-should-know-lru-cache-from-the-standard-library-8e6c20c6bc49)

你在你的 Keras 深度学习模型中使用了“Scikit-learn wrapper”吗?

原文:https://towardsdatascience.com/are-you-using-the-scikit-learn-wrapper-in-your-keras-deep-learning-model-a3005696ff38?source=collection_archive---------6-----------------------

如何使用 Keras 的特殊包装类进行超参数调优?

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

作者使用开源模板创建的图像

介绍

Keras 是深度学习领域最受初学者和专业人士欢迎的 Python 库/API 之一。虽然它最初是由弗朗索瓦·乔莱作为一个独立项目开发的,但从 2.0 版本开始,它已经被原生集成到 TensorFlow 中。点击 了解更多信息

正如官方文档所说,它是“一个为人类而不是机器设计的 API”,因为它“遵循了减少认知负荷的最佳实践

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

图片来源: Pixabay

认知负荷肯定会增加的情况之一是超参数调整。尽管有这么多支持库和框架来处理它,但对于简单的网格搜索,我们总是可以依赖 Keras 中的一些内置的好东西。

[## 机器学习模型的超参数调整。

当创建一个机器学习模型时,你会看到如何定义你的模型的设计选择…

www.jeremyjordan.me](https://www.jeremyjordan.me/hyperparameter-tuning/)

在本文中,我们将快速查看一个这样的内部工具,并研究我们可以用它来进行超参数调优和搜索。

sci kit-学习交叉验证和网格搜索

几乎每个 Python 机器学习实践者都非常熟悉 Scikit-learn 库和它的漂亮的 API 以及简单的方法,比如fitget_paramspredict

该库还为模型选择流水线网格搜索 能力提供了极其有用的方法。如果你环顾四周,你会发现大量使用这些 API 方法解决经典 ML 问题的例子。但是对于你遇到的一个深度学习问题,如何使用相同的 API 呢?

** [## Python 中模型选择的交叉验证和网格搜索

简介典型的机器学习过程包括在数据集上训练不同的模型,并选择一个…

stackabuse.com](https://stackabuse.com/cross-validation-and-grid-search-for-model-selection-in-python/)

认知负荷肯定会增加的情况之一是超参数调整。

当 Keras 与 Scikit-learn 纠缠在一起时

Keras 提供了几个特殊的包装类——都是为了回归和分类问题——来充分利用这些 Scikit-learn 自带的 API 的全部功能。

在本文中,让我向您展示一个使用简单的 k-fold 交叉验证和穷举网格搜索以及 Keras 分类器模型的例子。它利用了针对 Keras 的 Scikit-learn 分类器 API 的实现。

Jupyter 笔记本演示可以在我的 Github repo 中找到

从模型生成函数开始

为了正常工作,我们应该创建一个简单的函数来合成和编译带有一些内置可调参数的 Keras 模型。这里有一个例子,

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

数据

对于这个演示,我们使用的是流行的 皮马印第安人糖尿病 。这个数据集最初来自国家糖尿病、消化和肾脏疾病研究所。数据集的目的是基于数据集中包含的某些诊断测量结果,诊断性地预测患者是否患有糖尿病。所以,这是一个二元分类任务。

  • 我们创建特征和目标向量— XY
  • 我们使用 Scikit 的缩放 API 来缩放特征向量——像MinMaxScaler一样学习。我们称之为X_scaled

数据预处理到此为止。我们可以将这个X_scaledY直接传递给特殊类,我们将在下一步构建。

Keras 提供了几个特殊的包装类——都是为了回归和分类问题——来充分利用这些 Scikit-learn 自带的 API 的全部功能。

KerasClassifier 类

这是来自 Keras 的特殊包装类,它将 Scikit-learn 分类器 API 与 Keras 参数模型结合在一起。我们可以传递与create_model函数对应的各种模型参数,以及其他超参数,比如 epochs 和 batch size。

这是我们如何创造它,

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

请注意,我们是如何将模型创建函数作为**build_fn**参数传递的。这是一个使用函数作为 Python 中一级对象的例子,在这里你可以将函数作为常规参数传递给其他类或函数。

[## Python 的函数是一流的——dbader.org

Python 的函数是一级对象。你可以将它们赋给变量,存储在数据结构中,传递它们…

dbader.org](https://dbader.org/blog/python-first-class-functions)

现在,我们已经确定了批量大小和我们想要运行模型的时期数,因为我们只想在这个模型上运行交叉验证。稍后,我们将这些作为超参数,并进行网格搜索以找到最佳组合。

10 重交叉验证

使用 Scikit-learn API 可以轻松构建 10 重交叉验证估计器。这是代码。请注意我们是如何从 Scikit-learn 的model_selection S 模块导入估算器的。

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

然后,我们可以简单地用这段代码运行模型,在这里我们传递我们之前构建的KerasClassifier对象以及特征和目标向量。这里重要的参数是我们传递上面构建的kfold对象的cv。这告诉cross_val_score估算者在 10 重分层交叉验证设置中使用提供的数据运行 Keras 模型。

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

输出cv_results是所有准确度分数的简单 Numpy 数组。为什么是准确性?因为这是我们在模型编译过程中选择的度量标准。我们可以选择任何其他分类标准,如精确度、召回率等。并且,在这种情况下,该度量将被计算并存储在cv_results数组中。

model.compile(loss='binary_crossentropy', 
                  optimizer='adam', 
                  metrics=['**accuracy**'])

我们可以很容易地计算 10 倍 CV 运行的平均值和标准偏差,以估计模型预测的稳定性。这是交叉验证运行的主要工具之一。

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

增强网格搜索的模型创建功能

穷举(或随机化)网格搜索通常是超参数调整或深入了解机器学习模型工作的常见做法。被赋予了大量超参数的深度学习模型是这种系统搜索的主要候选对象。

在本例中,我们将搜索以下超参数,

  • 激活功能
  • 优化器类型
  • 初始化方法
  • 批量
  • 历元数

不用说,我们必须将前三个参数添加到我们的模型定义中。

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

然后,我们创建和以前一样的KerasClassifier对象,

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

搜索空间

我们决定使穷举超参数搜索空间大小为 3×3×3×3=243。

请注意,Keras 运行的实际数量也将取决于我们选择的交叉验证的数量,因为交叉验证将用于这些组合中的每一个。

以下是选择,

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

要搜索的维度太多了!

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

图片来源: Pixabay

用 Keras 学习 GridSearchCV

我们必须创建一个搜索参数字典,并将其传递给 Scikit-learn GridSearchCV估计器。这是代码,

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

默认情况下,如果没有明确指定cv参数,GridSearchCV 会运行 5 重交叉验证(从 Scikit-learn v0.22 开始)。这里,我们将它保持在 3,以减少总运行次数。

建议将GridSearchCV的详细程度设置为 2,以保持对正在发生的事情的可视化跟踪。记住保留 **verbose=0** 作为主 **KerasClassifier** 类虽然,因为你可能不想显示训练单个时代的所有血淋淋的细节。

然后,就合体了!

当我们都开始欣赏 Scikit-learn 漂亮统一的 API 时,是时候调用这种能力,只需说fit就可以搜索整个空间了!

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

图片来源: Pixabay

喝杯咖啡,因为这可能需要一段时间,具体取决于深度学习模型架构、数据集大小、搜索空间复杂性和您的硬件配置。

总共将有 729 个模型拟合,243 个参数组合中的每一个都有 3 次交叉验证运行。

如果你不喜欢全网格搜索,你可以随时尝试 Scikit-learn stable 的随机网格搜索!

结果看起来怎么样?正如您对 Scikit-learn 估算器的期望一样,为您的探索存储了所有好东西。

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

你能对结果做什么?

您可以根据您的研究兴趣或业务目标,以多种方式探索和分析结果。

最佳精度的组合是什么?

这可能是你最关心的问题。只需使用来自GridSearchCV估算器的best_score_best_params_属性将其打印出来。

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

我们使用ReLU activationAdam optimizer做了最初的 10 重交叉验证,得到的平均准确率为 0.691。在进行彻底的网格搜索后,我们发现tanh activationrms prop optimizer可能是解决这个问题的更好选择。我们有更好的准确性!

提取数据帧中的所有结果

很多时候,我们可能希望在广泛的超参数下分析深度学习模型性能的统计性质。为此,从网格搜索结果中创建一个熊猫数据框架并进一步分析它们是非常容易的。

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

这是结果,

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

视觉分析

我们可以从这个数据集创建漂亮的可视化效果,来检查和分析选择什么样的超参数可以提高性能并减少变化。

这是一组使用 Seaborn 从网格搜索数据集中创建的平均精确度的小提琴图。

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

这是另一个情节,

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

…从网格搜索结果中创建熊猫数据框架并对其进行进一步分析非常容易。

总结和进一步的思考

在本文中,我们介绍了如何使用 Keras 库提供的强大的 Scikit-learn 包装器 API 来进行 10 重交叉验证和超参数网格搜索,以实现二进制分类问题的最佳准确性。

使用该 API,可以融合基于 Scikit-learn 的通用 ML 管道和 Keras 模型的最佳工具和技术。这种方法无疑具有巨大的潜力,可以节省从业者为交叉验证、网格搜索、Keras 模型管道化编写定制代码的大量时间和精力。

同样,这个例子的 演示代码可以在这里 找到。其他相关深度学习教程可以在 同库 中找到。如果您愿意,请随意启动和分叉该存储库。

Y 你可以查看作者的 GitHub 知识库中的代码、思想和机器学习和数据科学方面的资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我

[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…

通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和…

www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)**

你担心感染冠状病毒吗?

原文:https://towardsdatascience.com/are-you-worried-about-getting-coronavirus-well-try-to-help-821302bb07f7?source=collection_archive---------42-----------------------

保持冷静,计算自己生病的概率。

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

如果您有以下任何问题:

  • 我感染冠状病毒的真实几率有多大?
  • 如果我感染了冠状病毒,我死亡的概率有多大?
  • 在我的生活方式中包含社交距离值得吗?
  • 根据我的行为、年龄和居住地,我能得到这些问题的具体答案吗?

在这篇文章的结尾,你将能够自己回答其中的一些问题(直到一些计算和一些数据处理)

这个想法是让你根据你的具体情况获得风险估计。当然,这些概率只是提供信息的统计工具,并不能代替官方或医生的官方信息。

让我们从数据开始

为了创建这个工具,我们依赖了来自世界银行世界卫生组织和《2019 年世卫组织-中国冠状病毒疾病联合任务报告》的公开数据。

  • 世界银行的数据提供了每个国家按年龄和性别区分的人口统计数据。
  • 世界卫生组织提供了每个国家冠状病毒病例数量的信息。我们可以访问一个更加用户友好的数据表单 Worldometer 网页,在那里我们可以找到病例总数、死亡人数、活跃病例等。每日报告。
  • 2019 年世卫组织-中国冠状病毒疾病联合任务报告基于中国 55,924 例实验室确诊病例,并为该样本提供了描述性统计数据。我们感兴趣的报告的主要部分是死亡率,取决于几个因素,如年龄、性别和既往疾病。这些结果也在 Worldometer 网页中进行了总结。我们需要澄清的是,这些统计数据是基于中国的案例。

如果我被感染,死亡的概率

我们将考虑两个特定变量来计算一个人被感染后的死亡概率:居住国家©和年龄(A)。如果我们用(D)来表示“如果我被感染就会死亡”的事件,我们要计算的是:

P(D|A ∩ C) →如果被感染死亡的概率,假设我是“A”岁,我住在“C”。

我们将使用贝叶斯定理的一个版本,其中包括在多个事件中的条件来找到这个概率。

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

多事件贝叶斯定理

特别是 P(D|A∩C)=P(A|D∩C)P(D|C)/P(A|C)。由于原则上我们没有特定国家按死亡年龄区分的特定概率的先验信息,我们可以假设 P(A | D∩C)= P(A | D)= P(D | A) P(A)/P(D)→基本贝叶斯定理。

现在我们得到了一个可以计算的表达式:

P(D | A∩C)= P(D | A)* P(A)* P(D | C)/(P(A | C)* P(D))

我们有全球人口概率,取决于世界银行数据中的年龄 P(A)和 P(A|C)。我们还可以从 worldometer 提供的每日报告中计算出某个国家的当前死亡概率 P(D|C)和全球死亡概率 P(D)。最后,我们有来自世卫组织-中国冠状病毒疾病联合任务 2019 年报告的 P(D|A )(我们可以假设该报告给出了该疾病的“全球”概率)。

编码定制概率

此处我们以 csv 格式提供来自世界银行的世界人口数据,以 xlsx 格式提供来自 Worldometer 的冠状病毒数据(截至 2020 年 4 月 17 日)。

世界银行的年龄范围是 0-14,15-65 和+65,而世卫组织报告的年龄范围是 0-9,10-19,…,70-79,+80。这意味着我们需要对世界银行的数据进行一些插值,以确定世卫组织中国报告的范围:

在我们创建的这个代码片段中

  • 包含所有国家疾病状况的一般信息的数据框。这包括病例数、死亡数、康复病例数、人口等。这允许计算 P(D|C)和 P(D)。
  • 包含 P(A|C),给定一个国家有某个年龄的概率(A)的字典©。这是为每个国家计算的,年龄范围为 0-9 岁,…,70-79 岁,80 岁以上。
  • 根据国家的 ISO ALPHA-3 代码,数据框和字典的主关键字(索引)都是国家代码。使用“WORLD”键,我们可以访问世界概率。

现在我来计算我的概率。我在哥伦比亚,年龄范围是 30-39 岁。

我得到 0.001%。

如果你想要你的原始感染概率,你可以用你国家的病例数除以国家人口数(当然这只是一个说明性的估计。

以我为例,我得到< 0.001%,相当低。

最后,如果你想对你还没有被感染的情况下死于冠状病毒的死亡率有一个估计,你可以把之前的两个值相乘(这肯定是非常低的)。

你担心感染冠状病毒吗?

我的感染概率和感染后死亡的概率并不高,因为哥伦比亚的死亡人数相对于感染人数并不多(截至 2020 年 4 月 17 日),但这在其他国家发生了很大变化,当然,这种情况随着年龄的增长而增加,并取决于你的行为(社会距离)。

你也可以在免费的在线冠状病毒概率计算器****中计算出几个涉及性别、既往状况、社会距离的概率。根据你的社交距离,你可以使用 SEIR 模型看到 15 天的预测!

对于疫情之争,我的建议是保持冷静并遵循世卫组织将军的指示,因为当我们将范围缩小到城市和社区时,你的可能性会大大增加。

好了,现在你可以计算你的概率,并与你的朋友分享!

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

可晕性

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家,这篇文章的观点不应被解释为专业建议。

你的 AWS S3 铲斗安全吗?

原文:https://towardsdatascience.com/are-your-aws-s3-buckets-secure-5cc07f63788?source=collection_archive---------50-----------------------

自动警报系统

学习释放 IAM 政策的全部潜力,并开始利用’*条件’*政策元素

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

克里斯·帕纳斯Unsplash 上拍摄

定义 IAM 安全策略的一个重要方面是减少爆炸半径,这是人们经常忽略的,这实际上意味着,在访问泄漏的情况下,如何进一步减少/消除损害。从这个角度来看安全定义通常可以帮助您考虑其他因素,以便在发生安全违规时限制损害。

安全性通常归结为两件事:身份验证和授权。认证定义你是谁,授权定义你能做什么(认证后)。在使用 AWS 云时,IAM(身份和访问管理)扮演把关者的角色,从而负责我们讨论的两个方面。 IAM 策略管理授权部分,对于限制用户可以/不可以做什么非常重要。

在这篇文章中,我想讨论当你给别人访问你的 AWS 资源时,你应该考虑的最基本的步骤。让我们用最常用的 AWS 服务 S3 来定义一个示例问题陈述

在 EC2 实例中运行某些工作流的不同 AWS 帐户的用户需要在特定的日期和时间间隔内访问您的 S3 对象。访问被进一步限制为列出具有特定前缀的文件,并且只下载具有相关联的特定标签的文件。流量也应该来自白名单网络

首先,将 S3 桶和与对象相关的权限分离到不同的部分通常是一个好的做法。AWS 在政策文件中将它们称为声明

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

基本 IAM 策略框架

谁需要访问权限?

或者用 AWS 的术语来说,谁是**的主要负责人。作为最佳实践,让我们假设没有访问键被提供和注入到消费者 EC2 实例中。相反,有一个 IAM 角色将被承担以访问 S3 资源。要定义主体,您可以扩展策略模板,如下所示:

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

IAM 策略—具有主体(请求资源的实体)

此时,像 EC2 这样映射到 IAM 角色arn:aws:iam::<requester_account_id>:roleaccess-s3-objects的服务可以从位于 http://169.254.169.254 的实例元数据端点获取动态临时凭证。这是由官方 SDK 和 CLI 自动处理的,所以用户不必担心。

需要访问什么?

上面的问题陈述提到了需要从不同的帐户访问的 S3 存储桶。这成为 IAM 策略中的资源元素。让我们假设私有桶的名称为my-test-bucket

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

IAM 策略—需要访问的资源

对于不同的部分,您可以适当地定义资源元素。首先指整个桶,其次指桶内的物体

在 S3 存储桶上应该允许哪些操作?

这由 IAM 策略结构中的动作元素定义。在这里遵循最小特权原则非常重要,要不惜一切代价避免类似s3:*的事情发生。此外,可以使用 AWS 策略模拟器进行简单的测试,以满足模拟/调试需求。

对于这个场景,用户只需要拥有s3:List ucketVersionss3:ListBuckets3:GetObject三个基本权限

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

IAM 策略—允许其他 AWS 帐户执行的操作

应该在哪个日期间隔内允许访问?

输入 条件

条件给 IAM 政策注入了兴奋剂。您现在可以开始使用他们允许您实施的粒度控制。在这个例子中,假设您只想允许2020-04-01T00:00:00Z2020-05-30T23:59:59Z之间的请求。你可以使用任何 ISO 8601 格式来定义这些时间线。条件键有两种风格:全局的和特定于服务的。介绍完这些之后,IAM 策略看起来像:

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

IAM 策略—允许在特定时间间隔内进行访问

如果您希望允许临时访问在预定义时间自动过期的外部实体,这将非常有用。

不仅仅是日期,您还希望只允许来自特定网络流量

让我们假设输出 NAT 网关,或实例公共 IP 是13.126.87.165。您可以限制仅来自此来源的流量。

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

IAM 策略—仅允许来自特定网络的入口

限制对数据子集的访问

如问题陈述中所述,您还希望控制资源访问,这应该仅限于 bucket 中的一些前缀。使用这种方法,您可以限制不同用户看到的内容,以及他们可以从该集中进一步下载的内容。假设您只想限制列出带有前缀test/test/sample-folder的文件夹的能力

此外,用户应该只能下载带有标签available:yes的对象

这可以通过其他有趣的条件键来实现:

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

IAM 策略—标签和文件夹前缀条件

这里需要注意的是,web 控制台中的 S3 看起来像一个典型的目录结构。然而,在内部,它只是名称前缀,您可以使用它来引用单个对象。

完整的 IAM 政策要点可以在这里找到,如果你想复制或编辑的话。

结论和进一步阅读

在这一点上,我相信即使您丢失了访问密钥,您也不会感到害怕,因为粒度策略定义的深度使得黑客在访问您的机密数据之前很难勾选所有的框。

注意事项

  • 无论是全局的还是特定于服务的,并不是所有的条件关键字都会一直存在。记得检查哪些 S3 选项支持哪些条件键。
  • 当涉及到安全性时,考虑使用策略边界。它们定义了最大权限区域,您自己帐户中的用户可以将其权限提升到。
  • 为了更加清晰,将对象和存储桶级别的权限分开
  • 如果你也对 EC2 使用的其他安全实践感兴趣,或者有效地管理你的密码,请随意查看我的其他帖子

我希望这篇文章能帮助你下次定义更安全的 IAM 策略。如果能听到您的评论和您已经完成的其他用例,那就太好了。

下次见, tschüss

对于数据科学的工作,你的编码技能够好吗?

原文:https://towardsdatascience.com/are-your-coding-skills-good-enough-for-a-data-science-job-49af101457aa?source=collection_archive---------9-----------------------

5 编码嗅探如果你在数据科学行业工作,你必须知道

“我 t 是星期五晚上。我清楚地记得那天剩下的时间和家人在一起我是多么兴奋。我的父母第一次去班加罗尔旅行,我已经计划带他们参观这座城市。我已经完成了一天的工作,因此在任何组织中,周五晚上通常都不那么忙碌。我正要离开时,突然收到了一封来自我的利益相关者的电子邮件,要求我提供一份我们一年前就停止提交的非常旧的报告。我很失望,但我知道运行标准代码通常不需要太多努力。唉!我的假设是错误的。因果报应咬了我一口,我整个晚上都在……"

您一定想知道这个故事与数据科学工作所需的任何类型的编码技能有什么关系,或者你们中的一些人可能已经猜到了我的故事和文章其余部分之间的相关性。让我先声明一下*“当今的组织正在将数据科学作为决策周期每个阶段的关键杠杆之一,以推动关键业务战略*。但是什么构成了数据科学问题呢?数据分析师、业务分析师或数据科学家如何在任何组织中工作?

任何数据科学问题都被分解成两个部分,一组**【活动】和一些**【最佳实践流程】。数据收集、数据清理、数据争论、假设检验、模型开发、验证等等都属于“活动”。我们大多数在分析组织工作或渴望成为数据科学家的人都非常熟悉这些术语,但当涉及到“最佳实践流程”时,我们知道的并遵循的很少。

根据我在这个行业 4 年的工作经验,我可以告诉你,作为“最佳实践过程”的一部分,很多重点都放在了项目管理、知识库构建、文档、沟通和代码维护上。作为一名数据科学家,您需要确保遵守“ 3 C、一致性、沟通和消费”。你的工作应该是一致的**,你应该向你的利益相关者传达每一个商业上的错综复杂,最重要的是你的工作应该消耗。**

数据科学行业中的编码与软件开发非常不同。您的编码技能不仅仅局限于您的技术知识,还需要大量的数据和业务理解。今天我将谈论“一致性”以及如何在你的编码实践中实现它。许多这些最佳实践都是基于我在 Mu 适马商业解决方案公司工作的 3 年经验以及我迄今为止所面临的挑战。以下 5 个嗅探会让你简单了解“数学+商业+数据+技术=数据科学”

"O 当今的组织正在寻找能够创建可跨多个团队扩展的解决方案的数据科学家。把它想象成一个产品,任何人、任何人都可以轻松使用。这不仅节省了他们在不同业务部门的类似问题上的投资成本,还减少了未来几天处理该问题的现有资源的时间和精力"

** [## 使用 Python 实现决策树分类器和成本计算剪枝

使用成本计算修剪构建、可视化和微调决策树的完整实践指南…

towardsdatascience.com](/decision-tree-classifier-and-cost-computation-pruning-using-python-b93a0985ea77)

5 个代码嗅探可以提升你的游戏!

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

1.你的代码可读性够吗?

一段格式良好且经过注释的代码是代码大师的天堂。它帮助您轻松调试代码,并确保更顺利的质量检查。任何数据科学团队都遵循同行质量检查 (QC)的概念,以确保输出无误。在向利益相关者交付最终成果之前,让您的同行评审您的代码被认为是一种最佳实践。可读代码包括:

  • 项目名称、代码目的、版本、作者姓名、创建日期、修改日期、最后修改人、开始更改
  • 在每个代码片段开始之前对其进行一行描述(使用这些编码人员跟踪所使用的明确的业务规则或过滤器)
  • 每个片段适当缩进,两个片段之间留有足够的空间
  • 正确使用表名的命名约定。您可以编写“创建表 customer_volume_summary ”,而不是编写类似“创建表 a”的代码片段。这使得您的表格非常直观,甚至无需浏览其余的代码段

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

2。你的代码有可重用的模块吗?

很多时候,您将最终处理具有相似模式的数据集,但是根据所面临的业务问题,对不同的属性(列)使用不同的过滤器。也可能反过来,您最终使用同一个表来总结同一业务问题的不同场景。

例如,假设您有一个包含客户 id、交易 id、购买日期、产品类型和销售额的客户数据集。您需要找出对每种产品类型销售额贡献 80%的顶级客户。在正常情况下,您可以为特定的产品类型创建一组代码,复制粘贴相同的代码,然后使用不同的过滤器对产品类型进行重用。一个好的编码人员会创建一个用户定义的模块,该模块将产品类型和销售阈值作为输入,并生成所需的输出。可以在所有平台上创建可重复使用的模块,从而节省不必要的生产线,并确保轻松进行质量控制。

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

3。您的输出符合数据和商业感觉检查吗?

在任何组织中,交付正确的数字是项目成功的关键。许多业务决策都是基于我们报告的数字做出的,即使是很小的不准确也可能对组织的决策产生更大的影响。

让我们以上面的客户数据集为例。要求您根据交易量确定前 100 名忠实客户。使用您的推荐,该组织将为这些用户提供 30%的折扣券,用于他们即将到来的夏季销售。

这种分析的整体思想是识别忠诚的客户,并影响他们购买更多。该组织正在打击其销售,以确保更高的交易量。现在,我们中的许多人都没有意识到这样一个事实,即大多数组织使用的数据集并不是以最干净的形式出现的,在被消费之前需要进行处理。例如,客户在支付他的账单时可能经历由系统记录的失败的交易。但是,在计算交易量时,应消除此类交易 id,否则我们最终会错误地估计每个客户的交易量。挑战在于识别这种异常现象。以下是您在编码时必须做的一些检查:

  • 在开始任何操作之前,请检查数据集的级别。级别被定义为可用于从数据库/表中唯一标识记录的单个列或列的组合。这将有助于您识别任何重复条目,并防止重复计算
  • 对数据集进行快速描述性统计。这有助于您找出数据的分布和所有可能丢失的值
  • 联接一个或多个表时,请确保它们处于同一级别。务必跟踪所有 join 语句前后的记录数量。这将帮助您识别多重映射或重复计算(如果有)
  • 让您组织的关键绩效指标触手可及。这将有助于你在每一步的基线数字。在上面的例子中,购买的客户总数是组织绩效的关键指标。根据贵组织的年度报告,您知道大约有 12,000 名客户从贵组织的网站上购买了产品。但是,在查询数据集时,您只找到 8000 个客户 id。你的数据正确吗?重新检查您的代码,或者向您的利益相关者指出数据问题

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

4.你的代码输入有弹性吗?

输入弹性意味着无论输入类型如何,代码都应该能够产生输出。任何编码实践中最困难的部分是诱导输入弹性,这导致代码的可重用性。分析师可能会从不同的涉众那里收到类似的数据请求。因此,理想的情况是编写能够满足不同业务需求的代码。

例如,电子产品和化妆品部门的销售主管希望了解不同客户 id 下各自的产品销售情况。由于分析师以前曾在笔记本电脑和平板电脑上工作过,他/她知道所有与电子产品相关联的产品名称都是以小写形式显示的。但是,要检查化妆品,他/她可能必须首先过滤掉所有产品,并查看如何在客户数据中捕获与化妆品相关的交易。相反,在产品列中简单使用 UPPER()可以防止不必要的检查。在真实的场景中,很难使每个代码输入都具有弹性,但是需要考虑所有可能处理的异常。

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

5.归纳异常处理

输入弹性和异常处理听起来可能相似,但工作方式不同。让我问你一个简单的问题?您认为任何组织的客户数据有多少条记录?20,252 条记录,如上例所示?你在开玩笑吧!任何包含不同产品交易信息的客户数据都将有数百万条记录。在 SQL、R、Python 甚至 Alteryx 中查询这样的数据集需要运行数小时。现在想象一个场景,您需要为不同的产品查询这样的表,您如何引发异常处理?

  • 所有编程语言都允许您以这样一种方式设置执行异常过程,即一个失败的查询将停止后续代码片段的执行。这允许您在条件失败或抛出错误时立即做出必要的更正,而不是在整个代码执行之前等待很长时间
  • 请确保检查您的查询时间。由于并发使用,查询较大的数据集通常会花费比预期更多的时间,即多个用户可能会同时查询同一个数据集。确保代码执行超过一定的运行时间后自动停止

米 y 的手机突然开始震动起来。我没有意识到已经是晚上 8 点了。我花了 5 个小时来解决一些数字不匹配的问题。一年前从事这项工作后,我几乎记不起当时使用的商业规则。我希望我把它记录在某个地方。缺少流程和每一步的质量控制数据使得发现问题变得更加困难。现在我意识到良好的编码实践的重要性,我希望这篇文章能帮助你在未来的日子里组织你的编码思维过程"**

面积图:标准、堆叠和重叠:

原文:https://towardsdatascience.com/area-charts-standard-stacked-overlapping-d9b77df5dec8?source=collection_archive---------24-----------------------

为什么&如何

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

图片来自 Unsplash 的 Manny Moreno

面积图是折线图的一种形式,横轴和连接数据点的线之间的区域用颜色填充。它们用于传达总体趋势,而不关心显示准确的值。与折线图不同,轴和线之间区域的着色以更大的视觉力量传递趋势。

如何:面积图是二维的,有两个轴。习惯上,纵轴代表一个数量变量,而横轴是一条时间线或一系列数值区间。数据点由形成折线的线段连接,并且折线和水平轴之间的区域用颜色或某种类型的阴影填充。

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

面积图的示意图

面积图(AC)有四种类型:1)标准 AC;2)堆叠式 AC;3)堆叠交流百分比;4)交迭交流。

让我们分别分析每种类型:

  1. 标准面积图(又名面积图):它们对于显示一个数值变量随时间的演变特别有效。这样做的目的是更加强调整体趋势以及连接数据点的线的波峰和波谷。相比之下,折线图更强调显示数字变量的精确值。

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

资料来源:国家大学政策秘书处

上图显示了 1950-2000 年间阿根廷大学生数量的变化。在 1976 年至 1983 年血腥的军事独裁统治期间,学生人数明显减少。如果没有面积图的视觉效果,同样的故事也可以用折线图来讲述。

就像条形图一样,您必须始终从 0 开始垂直轴。与折线图不同,如果修改基线,我们不可避免地会扭曲信息。

2.堆积面积图:就像几个面积图一个叠一个。在这种类型的图表中,有第三个变量,通常是分类变量,以及相应的数据系列。每一个数据序列的表示都是从前一个数据序列结束的地方开始的(它们不重叠)。最后一个数字表示所有数据的总和。

下面的堆叠式 AC 显示了世界上生活在极端贫困中的人们的历史数据和预测数据。纵轴代表数百万人,而横轴代表 1990 年至 2015 年期间的历史数据和 2015 年至 2030 年的预测数据。第三个分类变量是用不同颜色表示的世界区域。最高线的高度相当于某一年生活在贫困中的所有人的总和。该图清楚地展示了数据故事:南亚、东亚和太平洋地区的贫困率持续下降,而撒哈拉以南非洲却没有出现同样的情况。它还表明,在过去 30 年里,超过 10 亿人摆脱了极端贫困。

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

来源:世界银行,2018 年

现在信息不同了,因为堆积面积图被用来进行成分分析。这是一个典型的部分对整体的图表,其中每个地区(每个部分,每个地区)对整体(整体,生活在极端贫困中的人)的贡献。每个区域的高度代表每个特定类别的值,而最终高度是这些值的总和。

堆叠面积图在可视化时存在一些困难,因为视线移动到每条线的最大值。但是,由于每条线都沿着下面那条线的基线,每个特定的区域都受到下面那条线的强烈影响。因此,随着时间的推移,每一个特定的趋势都类似于下面的趋势。出于这些原因,一些作者警告我们在以下方面谨慎使用它们:“只要确保当你使用这种方法时,你的观众知道不要沿着每个部分顶部的线条斜率来看整体的一部分如何随着时间的推移而变化”(Stephen 少数,2011)。

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

比较上面的数字: A,B & C 区域对于两个图表有完全相同的数据值。堆栈底部的 A 区没有问题。但是看看 B 区(蓝色区域)。看起来它的总体趋势对于每个图都是绝对不同的。这是堆积面积图的真正问题:它们可能会误导人,因为每个区域都遵循下面区域的基线,并类似于其趋势。

此外,即使堆叠的 AC 创建引人入胜和丰富多彩的视觉效果,也要明智地使用它们,因为堆叠中超过四个或五个级别需要大量的视觉处理时间,并可能使观众困惑。

3.百分比堆积面积图(也称为 100%堆积面积图):就像前面的图表一样,几个区域堆叠在另一个区域的顶部,并表示第三个分类变量。这是一个部分对整体的图表,其中每个区域表示每个部分相对于类别总数的百分比。垂直轴的最终高度始终为 100%。这意味着图表顶部有第二条基线,有助于跟踪某些特定趋势。

如何:每一个不同的堆栈代表整体的不同部分。与堆叠面积图类似,堆叠不会重叠。与它们不同,垂直轴的范围总是从 0 到 100%。每个堆栈的高度表明每个类别的百分比如何随时间变化。在下图中,您可以通过观察不同颜色如何沿水平轴增长或收缩来了解不同的趋势。

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

百分比堆积面积图的示意图

当我们向上堆叠时,分类变量的项目之间的差异或贡献更难读取。相应的区域无法进行严格的比较,因为它们偏离了不同的基线。特别是,没有连接到底部或顶部基线的区域很难读取,因为它们受到其邻居的强烈影响(上图中的第 3 类)。

永远记住,你必须选择一个合适的调色板。你可以通过选择分类的、连续的或发散的调色板来赋予故事意义。

下面的 100%堆叠交流显示谷歌音乐时间线。这张图表提供了一张基于 Google Play 用户的粗略地图,显示了这些年来流派和艺术家的流行程度。它有一个互动的版本,你可以点击其中一个流派,并获得该流派当时最受欢迎的专辑列表。我喜欢这个图表,因为它清楚地强调了 60’ & 70’ 的进步摇滚是有史以来最好的音乐。

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

来源:谷歌音乐时间轴

就像堆积条形图一样(https://towards data science . com/stacked-bar-graphs-why-how-f1 b 68 a 7454 b 7),我们仅在相对差异重要时使用 100%堆积面积图,而在相对和绝对差异重要时使用堆积面积图。

4.重叠区域图:在这种图形中,区域之间有一些重叠。颜色和透明度必须适当调整,以便可以很容易地看到特定的线条。它们让我们能够很好地比较不同的趋势。我们的建议是使用不超过两个区域,因为三个或更多区域的重叠(及其相应的重叠颜色)很容易混淆观众。

以下重叠 AC 显示了全球城市和农村人口的历史值和预测值。浅绿色阴影区域对应于农村人口,而浅蓝色对应于城市人口。与讲故事相关,图表显示,1960 年,地球上大约三分之一的人生活在城市,而在 2008 年,人类历史上第一次,城市人口超过了农村人口。此外,据预测,到 2050 年,城市人口将是农村人口的两倍。重叠的 AC 允许我们对各自种群的进化进行适当的比较,并以一种特别有效的方式传达故事。

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

来源:世界银行,2018 年

作为最后的警告,永远记住面积图很难阅读和解释,因为它们依赖于观众通过比较面积来解码数字信息的能力。我们更喜欢通过比较长度或高度来比较数值。通过矩形(条)的高度或坐标矩形中点和线的位置,我们可以很容易地跟踪基于趋势的数据可视化。因此,只使用 AC 来传达整体趋势和每个部分对整体的相对贡献,而不关心显示确切的值。面积图优先考虑数据的清晰性而不是准确性。

如果你对这篇文章感兴趣,请阅读我以前的:

簇状和重叠条形图,为什么和如何

https://towards data science . com/clustered-overlapped-bar-charts-94 f1 db 93778 e

堆积条形图,为什么和如何,讲故事和警告

https://towards data science . com/stacked-bar-graphs-why-how-f1 b 68 a 7454 b 7

参考文献:

少数,Stephen,“组合时间序列和部分到整体关系的定量显示”,https://www . perceptual edge . com/articles/visual _ business _ intelligence/Displays _ for _ Combining _ Time-Series _ and _ Part-to-Whole . pdf

谷歌音乐时间轴,http://research.google.com/bigpicture/music/#

http://estadisticasuniversitarias.me.gov.ar/

世界银行,2018,https://www . world bank . org/en/news/feature/2018/12/21/year-in-review-2018-in-14-charts

你所有的实验不都是神圣的吗?—使用 Sacred 管理您的机器学习实验

原文:https://towardsdatascience.com/arent-all-your-experiments-sacred-managing-your-machine-learning-experiments-4f8a66be65ae?source=collection_archive---------40-----------------------

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

图片由 Luka 从 Pexels

你可能已经花了无数个小时来调整你的超参数,观察你的机器学习模型的性能指标和运行时间,当你想回到你以前的迭代时,你就是无法获得超参数或其他一些正确的配置来重新创建结果。作为一名研究人员,重要的是记录这些超参数和观察值,以便在需要时再次重现相同的结果。手动将它们记录在某个地方既乏味又容易出错,这会使您的进度落后几天。此外,很难理解你的日志,也很难长时间地重现实验。

假设你正在做一个简单的时尚 MNIST 分类项目,下面是你可能想出的用于训练和评估的代码:

该代码在每个时期具有三个配置参数batch_sizenum_epochslearning_rate以及四个性能度量train losstrain accuracyval lossval accuracy。此外,您可能希望跟踪test accuracyrun-time。为每个实验手动地做它是不令人兴奋的,并且你甚至可能有更多的度量想要为每个实验跟踪。

这就是神圣在画面中出现的地方。

每个实验都是神圣的
每个实验都是伟大的
如果一个实验被浪费了
上帝会非常生气

这是《神圣的:D》的标题

什么是神圣?

神圣是由 Instituto Dalle Molle di Studi sull ’ intelligenza artificial e(id sia)开发的工具。它可以帮助您配置、组织、记录和重现您的实验。它旨在完成您在实际实验中需要做的所有繁琐的日常工作,以便:

  • 记录你实验的所有参数
  • 轻松运行不同设置的实验
  • 在数据库中保存单次运行的配置
  • 重现您的结果

神圣是如何工作的?

神圣连接到一个 MongoDB,并把所有关于实验的信息放入一个名为 experiments 的集合中的一个文档中。MongoObserver是神圣附带的默认观察者之一。神圣试图捕捉所有的输出,并将信息传送给观察者。

Experiment是神圣框架的中心类,收集大量关于运行的信息,像:

  • 启动时间和停止时间
  • 使用的配置
  • 结果或发生的任何错误
  • 运行它的机器的基本信息
  • 实验所依赖的包及其版本
  • 所有导入的本地源文件
  • 用 ex.open_resource 打开的文件
  • 使用 ex.add_artifact 添加的文件

安装神圣的

你可以像这样直接从 pypi 获得神圣:

pip install sacred

我们还需要安装 pymango,因为我们需要连接一个 MongoDB

pip install pymango

修改时尚 MNIST 分类脚本以使用神圣

下面是更早的脚本修改使用神圣。

我们首先创建一个名为fashion_mnist的实验实例ex,并将一个观察者链接到它。MongoObserver是圣物自带的默认观察者。你甚至可以使用其他可用的观察者

ex = Experiment("fashion_mnist")
ex.observers.append(MongoObserver())

接下来,我们在用@ex.config修饰的函数cfg()中定义配置变量。这会创建一个配置范围,然后收集函数局部范围内定义的所有变量,并成为实验的配置条目。在我们的示例中,我们将batch_sizenum_epochslearning_rate视为配置变量。

@ex.config
def cfg():
    batch_size = 64
    num_epochs = 10
    learning_rate = 0.01

接下来,我们需要将脚本的模型训练和评估部分放在一个用@ex.automain修饰的函数内。这告诉实验文件在脚本运行时需要执行什么。这个函数将所有的配置变量和一个_run对象作为参数。_run对象表示并管理实验的一次运行。它存储与实验相关的所有信息,然后将这些信息写入观察器。如果您想了解更多关于_run对象的信息,请参考

@ex.automain
def run(_run, batch_size, num_epochs, learning_rate):
    # importing the dataset
    fashion_mnist = keras.datasets.fashion_mnist

    (train_images, train_labels), (test_images, test_labels) = 
         fashion_mnist.load_data() # normalizing the images to 0 and 1
    train_images = train_images / 255.0
    test_images = test_images / 255.0 # setting up the model
    model = keras.Sequential([
        keras.layers.Flatten(input_shape=(28, 28)),
        keras.layers.Dense(128, activation='relu'),
        keras.layers.Dense(10, activation='softmax')
    ]) # compiling the model
    model.compile(optimizer=keras.optimizers.Adam(
        learning_rate=learning_rate),
        loss=keras.losses.SparseCategoricalCrossentropy(
                 from_logits=True
             ),
        metrics=['accuracy']) # training the model
    model.fit(train_images, 
             train_labels,
             batch_size=batch_size,
             epochs=num_epochs,
             validation_data=(test_images, test_labels),
             callbacks=[MetricsLoggerCallback(_run)],
             verbose=2)

    # evaluating the model
    test_loss, test_acc = model.evaluate(
                              test_images, 
                              test_labels, 
                              verbose=2) print('Test loss:', test_loss, ' and Test accuracy:', test_acc) return test_acc

我们还希望记录度量标准,如每个时期的训练和验证的损失和准确性。为此,我们定义了一个名为MetricsLoggerCallback的 Keras 自定义回调类,它有on_epoch_end方法。回调类将_run对象作为参数。_run对象有一个[log_scalar](https://sacred.readthedocs.io/en/stable/apidoc.html?highlight=_run#sacred.run.Run.log_scalar)方法,可以用来捕获指标。

class MetricsLoggerCallback(keras.callbacks.Callback):
    def __init__(self, _run):
        super().__init__()
        self._run = _run 

    def on_epoch_end(self, _, logs):
        self._run.log_scalar("training.loss", logs.get('loss'))
        self._run.log_scalar("training.acc", logs.get('accuracy'))
        self._run.log_scalar("validation.loss",
                             logs.get('val_loss'))
        self._run.log_scalar("validation.acc",
                             logs.get('val_accuracy'))

度量和日志也可以用一个用@ex.capture decorator 修饰的函数以不同的方式捕获,如这个示例所示。

我们的@ex.automain修饰函数也返回test_acc值。该值存储在_run对象的[result](https://sacred.readthedocs.io/en/stable/apidoc.html?highlight=result#sacred.run.Run.result)属性中。它代表了我们实验的主要结果。

运行实验

为了运行实验,您需要在运行脚本时链接一个观察器,如下所示:

python fashion_mnist_sacred.py -m sacred_fashion_mnist

运行脚本时,您还可以从 cli 修改配置变量,如下所示:

python fashion_mnist_sacred.py with learning_rate=0.003 num_epochs= 20 -m sacred_fashion_mnist

一旦运行完成,你可以使用 Sacredboard 或任何其他由 Sacred 支持的前端来查看实验日志。

神圣纸板

SacredBoard 连接到 Sacred 使用的 MongoDB 数据库,显示实验列表、它们的状态、Sacred 的配置和运行程序的标准输出。

您可以用 pypi 安装它:

pip install sacredboard

在运行它时,我们需要将它与我们的观察者连接起来:

sacredboard -m sacred_fashion_mnist

启动后,您可能会看到所有实验的详细信息,如下图所示:

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

配置详细信息

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

捕获的日志

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

结果(即我们的 test_acc)

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

进行实验的主机信息

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

训练和验证损失

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

训练和验证准确性

从这里去哪里?

这只是让你的生活变得简单的一瞥。它有大量的其他功能,更多的功能仍在添加。如果你想进一步探索,他们的文档非常详细。

ARIMA 与预言家:预测航空乘客数量

原文:https://towardsdatascience.com/arima-vs-prophet-forecasting-air-passenger-numbers-4e01b2d93608?source=collection_archive---------12-----------------------

哪个型号性能更好?

这是我之前文章的后续: 用 Prophet 进行时间序列分析:航空旅客数据

在本例中,使用 R 构建了一个 ARIMA(自回归综合移动平均)模型,通过使用三藩市国际机场关于航空公司月度客运量统计的报告来预测航空旅客人数。

具体来说,对航空公司荷航 (enplaned)调整后的乘客人数进行过滤,作为从 2005 年 5 月到 2016 年 3 月期间的时间序列进行分析。

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

资料来源:RStudio

结果将与 Prophet 获得的结果进行比较,以了解 ARIMA 相对于该模型的表现如何。

该模型在 90%的时间序列(训练集)上进行训练,序列的后 10%用于与预测(测试集)进行比较。

ARIMA 的背景

ARIMA 模型由坐标(p,d,q)组成:

  • p 代表自回归项的数量,即用于预测未来值的过去时间值的观测值的数量。例如,如果 p 的值是 2,那么这意味着序列中的两个先前的时间观察被用于预测未来趋势。
  • d 表示使时间序列稳定所需的差异数(即具有恒定均值、方差和自相关的时间序列)。例如,如果 d = 1,则意味着必须获得级数的一阶差分,才能将其转换为平稳的级数。
  • q 代表我们模型中之前预测误差的移动平均值,或误差项的滞后值。例如,如果 q 的值为 1,那么这意味着我们在模型中有一个误差项的滞后值。

平稳性

说到预测,时间序列数据的一个关键假设是平稳性。这是一个序列的均值、方差和自相关是常数的地方。

这种假设的原因是,如果一个序列的均值、方差和自相关性在一段时间内不是常数,那么使用预测模型进行预测就会变得困难得多。

然而,正如我们上面提到的,ARIMA 模型中的 d 参数表示使序列稳定所需的差异数。当使用 R 中的 auto.arima 功能时,自动选择 *p、d、*和 q 值。

平稳性通常可以通过对数据的目视检查直观地表示出来。

我们再来看看时间序列。

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

资料来源:RStudio

我们可以看到——总的来说——时间序列显示出一种之字形模式,在一段时间内总体趋势几乎没有变化。

然而,这可以通过使用迪基-富勒测试进行正式测试。零假设是序列有一个单位根(非平稳),另一个假设是平稳或趋势平稳。

单位根的测试如下:

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

来源:作者图片

对序列运行测试时,获得的 p 值为 0.01,这意味着在 5%的显著性水平上拒绝零假设,表明序列中存在平稳性。

> adf.test(passengernumbers)Augmented Dickey-Fuller Testdata:  passengernumbers
Dickey-Fuller = -8.061, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

自相关

ARIMA 的 p 参数说明了模型中自回归项的数量——这使得模型能够处理自相关。自相关是时间序列中不同观测值的误差项之间存在相关性的一种情况,这也会扭曲预测。

这是时间序列的 ACF(自相关函数)图(设置了 20 的最大滞后):

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

资料来源:RStudio

我们看到自相关在滞后 0 之后持续了两个月,在 6 个月和 12 个月期间持续了正相关和负相关。在这种情况下,滞后是按月计算的,因此 6 个月的周期表示为 0.5 ,而 12 个月的周期表示为 1.0

部分自相关函数试图去除由每个观测值之间存在的固有线性函数产生的间接相关性。

这是该系列的偏相关图:

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

资料来源:RStudio

我们看到偏自相关函数在滞后 0 两个月后仍然显示相关性(尽管是负的)。因此,ARIMA 模型将需要以这样一种方式配置,以便考虑自回归项的正确数量。

以下是时间序列趋势组成部分的概述:

> components <- decompose(passengernumbers)
> components

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

资料来源:RStudio

当观察该系列时,大约每六到八个月就会观察到显著的季节性模式。考虑到这一点,ARIMA 模型将需要在其预测中考虑这种季节性。

使用 auto.arima 建模

给定自相关和季节性的视觉指示, auto.arima 用于自动生成许多具有不同 p、d 和 q 坐标的 arima 模型,然后根据具有最低 BIC(贝叶斯信息标准)的模型选择最佳模型。

> # ARIMA
> fitpassengers<-auto.arima(passengernumbers, trace=TRUE, test="kpss", ic="bic")ARIMA(2,0,2)(1,1,1)[12] with drift         : 1693.37
 ARIMA(0,0,0)(0,1,0)[12] with drift         : 1779.685
 ARIMA(1,0,0)(1,1,0)[12] with drift         : 1682.899
 ARIMA(0,0,1)(0,1,1)[12] with drift         : 1724.722
 ARIMA(0,0,0)(0,1,0)[12]                    : 1775.932
 ARIMA(1,0,0)(0,1,0)[12] with drift         : 1702.397
 ARIMA(1,0,0)(2,1,0)[12] with drift         : 1685.158
 ARIMA(1,0,0)(1,1,1)[12] with drift         : 1684.594
 ARIMA(1,0,0)(0,1,1)[12] with drift         : 1680.905
 ARIMA(1,0,0)(0,1,2)[12] with drift         : 1684.211
 ARIMA(1,0,0)(1,1,2)[12] with drift         : Inf
 ARIMA(0,0,0)(0,1,1)[12] with drift         : 1772.299
 ARIMA(2,0,0)(0,1,1)[12] with drift         : 1684.965
 ARIMA(1,0,1)(0,1,1)[12] with drift         : 1685.149
 ARIMA(2,0,1)(0,1,1)[12] with drift         : 1688.428
 ARIMA(1,0,0)(0,1,1)[12]                    : 1676.443
 ARIMA(1,0,0)(0,1,0)[12]                    : 1697.822
 ARIMA(1,0,0)(1,1,1)[12]                    : 1680.163
 ARIMA(1,0,0)(0,1,2)[12]                    : 1679.795
 ARIMA(1,0,0)(1,1,0)[12]                    : 1678.467
 ARIMA(1,0,0)(1,1,2)[12]                    : Inf
 ARIMA(0,0,0)(0,1,1)[12]                    : 1768.607
 ARIMA(2,0,0)(0,1,1)[12]                    : 1680.489
 ARIMA(1,0,1)(0,1,1)[12]                    : 1680.677
 ARIMA(0,0,1)(0,1,1)[12]                    : 1720.732
 ARIMA(2,0,1)(0,1,1)[12]                    : 1683.954Best model: ARIMA(1,0,0)(0,1,1)[12]

最佳模型配置表示为 ARIMA(1,0,0)(0,1,1)【12】

该模型的系数如下:

> fitpassengers
Series: passengernumbers 
ARIMA(1,0,0)(0,1,1)[12]Coefficients:
         ar1     sma1
      0.7794  -0.5001
s.e.  0.0609   0.0840sigma^2 estimated as 585834:  log likelihood=-831.27
AIC=1668.54   AICc=1668.78   BIC=1676.44

准确(性)

ARIMA 模型生成以下预测:

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

资料来源:RStudio

RMSE(均方根误差)和 MFE(平均预测误差)如下:

  • RMSE: 698
  • MFE: -115
> # Errors
> library(Metrics)
> rmse(df$`Actual Passenger Numbers`, df$`Forecasted Passenger Numbers`)[1] 698.6527

> ## Forecast Error
> forecast_error=(df$`Actual Passenger Numbers`-df$`Forecasted Passenger Numbers`)
> forecast_error
 [1] -415.8149 -982.0972 -273.1147 -539.5008 -520.7138 -845.2062 -824.7485
 [8] -212.4401 -454.4602 1387.1299  962.7507  153.2876  257.2238  687.3703
> mean(forecast_error)[1] -115.7381

与先知的比较

ARIMA 和预言家之间的一个关键区别是,预言家模型解释了“变化点”,或时间序列中趋势的特定变化。虽然在 R 中用 ARIMA 实现这一点在技术上是可行的——但它需要使用一个名为 AEDForecasting 的独立包。

Prophet 通过使用一个加法模型来工作,从而使序列中的非线性趋势与适当的季节性(无论是每天、每周还是每年)相适应。

在这个特定的数据集中,趋势的转变发生在 2009 年之后,当时我们看到乘客需求的总体趋势出现了逆转:

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

来源:Jupyter 笔记本输出

标准 Prophet 模型适用于数据集,没有任何季节性的手动说明:

prophet_basic = Prophet()
prophet_basic.fit(train_dataset)

通过反复试验, 4 个变化点被证明可以最小化 RMSE 和 MFE,因此被定义为模型中适当数量的变化点:

pro_change= Prophet(n_changepoints=4)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)

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

来源:Jupyter 笔记本输出

RMSE 和平均相对误差的计算如下:

>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(passenger_test, yhat14)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)RMSE: 524.263928>>> forecast_error = (passenger_test-yhat14)
>>> forecast_error
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error71.58326743881493

用 Prophet 分别得到 52471 的 RMSE 和 MFE,误差明显低于用 ARIMA 得到的 698-115 的误差。

从这个角度来看,虽然 ARIMA 解释了时间序列中的季节性和自相关性等模式——Prophet 在正确识别序列中的相关变化点方面表现出色——但这似乎提高了模型的预测准确性。

当预测具有更明确定义的趋势或不特别表现出季节性的数据时,ARIMA 可能会表现出色-我们在所讨论的数据集中看到了非常明显的迹象。但是,不存在季节性的其他情况可能不适合使用 Prophet。

结论

在本例中,我们看到:

  • 如何配置 ARIMA 模型
  • 时间序列中变化点的相关性
  • ARIMA 和 Prophet 在计算预报精度方面的比较

非常感谢您的阅读,欢迎提问或反馈。

免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

参考

武装自己选择你的第一个数据库

原文:https://towardsdatascience.com/arm-yourself-to-select-your-first-database-8bc9008bf8ec?source=collection_archive---------28-----------------------

您没有计算机科学背景,希望更好地了解数据基础设施如何影响您的业务或数据分析项目?这篇文章应该为您揭开数据库之谜。

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

为了更好地理解数据库选择的概念,您可以将它想象为选择从 A 点到 b 点的正确交通工具。
许多不同的交通工具可以让您从 A 点到 b 点。同样,许多数据库可以让您存储数据。
诀窍在于理解你的优先事项,以及你可以放弃什么。

在当今世界,如果你正在建立一个企业,你可以获得的数据是一种资产。你必须想出如何最好地利用这一资产。在过去,企业家只会依靠直觉。但如今,数据正指引着未来的方向。从降低成本项目到寻找新的收入来源或改善客户体验,数据分析领域是当今公司的关键。
那么,您是否渴望利用您的数据来更好地服务您的客户或跟踪您的增长?在考虑进行任何分析之前,您应该考虑如何存储您的数据。数据存储的目标是允许您访问完整、准确且可查询的业务数据表示。
我在与企业家讨论时注意到,数据库的选择可能会令人困惑。大多数企业家似乎没有意识到数据库对其数据分析性能的未来可能产生的影响,从而影响到整体业务。数据库前景广阔,他们发现很难理解推动他们选择的数据库需求是什么。
阅读完这篇由 3 部分组成的文章后,您应该能够评估哪种类型的数据库(DB)最适合您当前的业务需求,并了解您选择的解决方案的局限性。

本文分为三个部分:

  • 第 1 部分—选择数据存储解决方案简介
    选择数据库可能会让人不知所措。市场上有数百种数据库解决方案。
    将业务需求转化为技术数据存储需求也很复杂。
    这一部分向您介绍了数据库世界,并帮助您识别和优先考虑您的数据库需求。
  • 第 2 部分—用于克服大数据存储挑战的技术
    五种主要技术用于克服传统关系数据库面临的大数据挑战:横向扩展、反规范化、灵活的模式、最终一致性、图形数据库。这部分解释了这些技术是如何工作的——包括解决了什么问题以及带来了什么缺点。
    如果对技术角度不感兴趣,可以跳过这部分。
  • 第 3 部分—关于选择数据库的可行见解
    这一部分涵盖了传统关系型数据库可能无法满足您的数据库需求的五种边缘情况。对于每一个场景,我们都会向您推荐解决这些挑战的技术、目前非常适合这些要求的特定数据库解决方案,以及这些解决方案的利弊。
    在这五种边缘情况之外,建议从关系数据库开始,例如 PostgreSQL。你可以参考这篇文章和下面的第一部分——“选择你的第一个 DB”部分来理解这种说法背后的原因。

数据库领域正在快速发展。越来越多的数据库可以累积不同的技术,并尽量减少随之而来的权衡。了解 DBs 面临的典型技术问题及其当前的解决方案,将有助于您找到最适合您业务的 DB。

第 1 部分—介绍如何选择数据存储解决方案

这一部分向您介绍了数据库世界,并帮助您识别和优先考虑您的数据库需求。

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

例如,如果我们想从法国的巴黎到厄瓜多尔的明多,我们的要求应该是什么—时间、成本*、环境影响?*

简而言之的数据库历史

回顾 DB 的历史可以让你更好地把握 DB 的前景,并理解各种选择背后的动机。近五十年来,数据主要存储在关系数据库中。关系数据库允许你以一种整洁而有逻辑的方式组织数据:你可以用键列连接的表来组织数据。

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

您可以在上面找到一个存储在关系数据库中的数据示例。

随着可收集数据量的增加,关系数据库面临着更高的性能要求和新的数据存储格式。“不仅仅是 SQL”(no SQL)数据库是为了解决这些新的数据挑战而开发的。然而,这些新类型的数据库只能解决特定的问题,这是以牺牲一些关系数据库的好处为代价的。
到目前为止,NOSQL 数据库有五种类型:文档存储、键值存储、宽列存储、搜索引擎、图形数据库。

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

您可以在上面的表格中找到六种主要类型的数据库以及这些数据库的开源示例。

请注意,本文中提到的数据库是每种数据库类型的 db-engines 排名列表中的前两个开源数据库。开源数据库是指任何人都可以访问和修改源代码的数据库。

了解您的数据库用途

在列出需求之前,你应该试着用一句话概括 DB 要实现的总体目标。
举几个例子,您可能需要一个数据库来接收您的企业在给定期间产生的所有交易。您可能需要一个数据库来对历史数据进行分析。在 web/移动应用程序的情况下,您可能需要一个数据库来支持应用程序后端的实时查询。
所有这些用例都意味着不同的需求,因此会有不同的最适合它们的数据库。
到目前为止,还没有哪种数据库能够同时解决所有的数据存储挑战。这就是为什么在开始选择练习之前,你应该确保对你的主要目标有一个清晰的想法。数据库的第一个目的应该是允许你优先考虑你的需求,并在权衡各种数据库的利弊时支持你。

了解您的数据库要求

选择数据库时,您应该按照重要性顺序列出您的数据库要求,并确保您了解您正在考虑的解决方案的利弊权衡。

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

您可以在上面找到业务需求列表,以及这些需求如何转化为技术需求。

选择您的第一个数据库

如果您还不知道您的业务和性能需求,强烈推荐使用关系数据库
事实上,只有当您知道您的数据库需求时,您才能评估关系数据库是不可行的,并为您的业务选择正确的 NOSQL 数据库。有许多不同的 NOSQL DB 类型,它们不能解决相同的问题。如果没有您的数据库需求,您将无法选择正确类型的 NOSQL 数据库。
您也可能会失去关系数据库的主要优势,却不知道自己在牺牲什么,例如数据一致性。数据一致性确保数据库中没有矛盾的信息,并且所有数据点都符合适当的约束。在关系数据库中,这是由表周围的固定模式允许的——这在大多数 NOSQL 数据库中是不存在的。此外,关系数据库已经被测试和使用了很长时间。因此,技术更稳定,社区更大(这使得寻找资源或解决问题更容易、更便宜)。
最后,尽管当前存在 NOSQL 趋势,但您应该记住,NOSQL 数据库是为了解决特定的大数据难题而开发的。NOSQL 数据库并不意味着要取代关系数据库。如果您正在开始一项新业务,您很可能不需要数据库来立即解决大数据挑战。

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

你可以在上面找到关系数据库的三个主要优势。

最后的想法

随着业务的增长,您的数据库需求也将随之发展,您的数据架构也将随之发展。
通常情况下,最终会形成一个由多个数据库组成的混合结构,以解决数据流不同点的各种挑战。
目前,这第一步不应该是解决您不确定的未来问题,而应该是建立数据架构的基础,让您拥有未来。

第 2 部分—用于克服大数据存储挑战的技术

这一部分解释了主要的 NOSQL 技术是如何工作的——包括解决了什么问题,带来了什么缺点。

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

依靠不同技术的各种引擎可以让我们从欧洲一直旅行到南美洲。

横向扩展—增加存储容量

什么是横向扩展? 扩展数据存储系统的目标是增加其整体存储容量。您可以“横向扩展”或“纵向扩展”。横向扩展或“水平扩展”是指通过增加机器数量来提高解决方案的性能。与扩大规模或“垂直规模”相反,后者是指增加机器的大小。
向外扩展时,数据分布在机器网络的不同节点上。能够向外扩展的系统称为分布式系统。

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

您可以在上面找到纵向扩展与横向扩展的 插图

为什么要横向扩展? 纵向扩展的主要优势在于,在增加数据存储容量时,您无需更改任何数据库管理流程。缺点是您的增长受到硬件的限制,前期成本很高,并且您有更高的系统故障风险。
您的增长能力有限,因为您只能通过购买更大的硬件系统来增加存储容量。换句话说,你被市场上可用的技术所限制。
此外,前期成本很高,因为每次您想要增加存储容量时,都需要购买新的更高性能的硬件。
最后,您有更高的系统故障风险,因为如果管理数据的一台机器出现故障,那么您的整个系统都会出现故障。
横向扩展解决了所有这些问题。
首先,当增加你的存储容量时,你只需要在网络上增加新的机器,所以理论上,你有无限的存储容量。
其次,买多台正常尺寸的机器比买一台性能异常的机器便宜。第三,通过增加机器的数量,你增加了其中一台机器发生故障的风险。因此,这些过程被认为是通过在网络的几个节点中复制数据来降低机器故障的风险。换句话说,即使一个或多个组件出现故障,向外扩展的系统也会继续运行。

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

您可以在上面找到纵向扩展与横向扩展的优缺点。

**横向扩展有什么缺点,为什么?

此外,根据上限定理,分布式系统必须在一致性、可用性和分区容差之间做出选择,并且不能累积这三个属性。
如果位于不同节点的所有副本始终具有相同的值,则系统是一致的。另一种理解方式是,当您读取数据库时,您应该总是在网络的任何位置更新最新的值。
如果每个非故障节点在合理的时间内返回对所有读写请求的响应,则系统可用。
如果一个系统即使在节点间的通信中断时仍能继续工作,则该系统是分区容忍的。另一种理解方式是,系统可以承受任何数量的网络故障,而不会导致整个网络瘫痪。
总结一下 CAP 定理,在分布式系统中,当出现故障时,您必须在数据的可访问性和数据的一致性之间做出选择。
你可以在下面找到一个例子来帮助你理解 CAP 定理。**

让我们举例说明这个定理,以便更好地理解为什么这三个属性不能累积:
让我们考虑两个节点 A 和 B,每个节点上有复制的数据。如果两个节点 A 和 B 之间的通信失败,分区容差要求系统继续工作。如果您想要一致性,您需要节点 A 或节点 B 充当不可用(否则您可能在 A 和 B 上有不同的值),因此您将有一个不会响应的非故障节点,您将失去可用性。按照同样的逻辑,如果您希望保持可用性并让两个非故障节点做出响应,您可能会从节点 A 和节点 B 获得不同的值,因为它们不再通信,从而失去了一致性。为了保持一致性和可用性,您需要两个节点进行通信,以确保它们具有相同的值,因此您会失去分区容差,也就是说,即使网络出现故障,系统也应该能够运行。

最后,跨节点分布数据限制了连接的能力。根据数据的分布情况,您可能无法完成所有可能的[连接](http://you can picture “joins” as VLOOKUP operations in excel)。如果要连接的数据点没有保存在同一个节点上,则连接可能会失败,并且不会返回所需的结果。不能进行连接限制了可以对数据进行的查询的多样性,因为这意味着您只能逐个查询每个表。

非规范化—提高查询的性能

什么是反规范化?
要理解反规格化,我们先来理解什么是规格化。标准化旨在减少数据冗余(数据的复制)并提高数据一致性。换句话说,通过将每个数据点都放在一个地方,您可以确保自己有一个单一的真实来源,并避免在一个数据点的不同位置有不同的值。标准化还减少了用于存储数据的空间,因为每个数据点只存储在一个位置。
另一方面,反规范化是引入数据冗余来构建自动足够的表格。换句话说,回答业务查询所需的所有信息都存储在每个表中,即使这意味着一些信息在多个表中重复。

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

你可以在上面找到一个数据模型规格化与反规格化的例子。

为什么要反规范化?
反规范化的主要目标是提高读取性能。当使用反规范化时,您可以根据您将要询问的查询来创建表。您将所有需要的信息都存储在同一个表中,以便轻松快速地访问。
让我们用一个标准化模型来说明相反的逻辑。在规范化模型中,数据不会跨表复制,只存储在一个位置。当查询数据时,您将不得不执行大量的[连接](http://you can picture “joins” as VLOOKUP operations in excel),从而降低查询的性能。

反规格化的缺点是什么,为什么? 复制数据的一个主要缺点是数据一致性下降。通过在不同的位置复制数据点,您就有可能在不同的位置拥有相同数据点的不同值。
此外,更新数据和写入新数据可能会更加复杂,因为您必须确保在所有位置写入或更新数据。

灵活的模式—提高接收数据的性能

灵活模式是什么意思? 要理解什么是灵活模式,我们先来理解什么是 DB 模式。
DB 模式是如何组织数据的框架,包括所有不同的数据概念(可以在公共主题下分组的数据点)、链接这些数据概念的所有关系以及对所有数据点的约束。
具有灵活模式的数据库是可以存储不遵循任何特定结构并且不必遵守任何配置约束的数据的数据库。

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

您可以在上面找到一个固定模式和灵活模式的数据模型的例子。

为什么要使用灵活的模式数据库?
灵活的模式可以接收任何类型的数据,因为任何模式都没有强制约束。
写入数据的性能得到了提高,因为对于要摄取的数据的结构或格式不再有任何限制。灵活的模式数据库可以适应任何新类型的数据,而不必了解新数据如何与其他数据相适应——因为,同样,对数据的组织方式没有限制。最后,设计固定模式既复杂又耗时。不必在每次新类型的数据进来时都执行这一步,这样可以节省时间。

灵活模式数据库的缺点是什么,为什么?
DB 模式允许您了解数据中有什么,并在存储更多数据的同时保持数据质量。数据质量确保存储的数据是可信的,并且可以用来获得业务洞察力。数据质量通过准确性、完整性、一致性等因素来衡量。对于企业来说,理解数据库应该能够保持的数据质量水平是一件头等大事。
跳过 DB 模式会降低数据质量,最终可能会得到质量差的数据。例如,您可能有错误或没有值的数据点,而您对此一无所知。
此外,因为对数据没有任何约束,也因为没有维护任何类似关系的结构,所以灵活的模式数据库不能执行[连接](http://you can picture “joins” as VLOOKUP operations in excel)。事实上,您将无法找到一个一致的键来连接您的数据。

最终一致性—提高查询的性能

最终一致性是什么意思?
要理解什么是最终一致性,我们先根据 CPA 定理定义来理解什么是一致性。
第 2 部分—横向扩展章节所述,如果位于不同节点的所有副本始终具有相同的值,则系统是一致的。
另一方面,最终的一致性只要求更新在需要的时间内到达所有系统。换句话说,您可能在某个时间点有不一致的数据,但是如果您等待足够长的时间,它应该在所有位置都是相同的,并且处于最新状态。

为什么使用最终一致性?第 2 部分—向外扩展章节所述,根据 CAP 定理,在系统故障的情况下,分布式系统无法同时满足响应性和一致性。为了尽可能地满足这两个要求,系统一直以最终一致性为目标,而不是以完全一致性为目标。
此外,最终一致性还可以通过在写入操作仅排队时考虑写入操作已完成来加快写入过程。

最终一致性的缺点是什么,为什么?
直接的缺点是最终的一致性并不是纯粹的一致性——因此你接受了一个数据点的多个版本同时存储在不同位置的可能性。此外,这意味着在查询数据时,您可能无法获得该数据点的最新版本。
如果你想了解更多关于最终一致性的内容,我建议你看看[碱法和酸法](https://www.freecodecamp.org/news/nosql-databases-5f6639ed9574/  https://medium.com/@katrinagarloff/databases-acid-and-base-simplified-5b0cc5350e90)。

图形数据库—管理具有复杂关系的数据

什么是图形数据库? 图形数据库是不仅存储数据点,还存储链接数据点的关系的数据库。在图 DB 中有两个主要元素,节点(或实体)和边(或关系)。每个节点代表一个概念,如一件事或一个人,通过边链接到其他节点,并由其唯一标识符、传入/传出边及其属性来定义。

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

你可以在上面的 中找到一个 graph DB 数据模型的例子

为什么要使用图结构? 如果存储的数据是高度相关的,使用图形数据库有很多好处。事实上,我们甚至可以说图形数据库比关系数据库更适合于高度相关的数据。图形数据库的主要优点是处理查询的速度和模式的灵活性。
图数据库具有所谓的无索引邻接性质。每个节点和每个边只存储它的邻居信息。它允许查询只遍历需要分析的数据。换句话说,当使用图形数据库运行查询时,查询不必扫描所有数据库,因此查询速度更快。此外,图形数据库支持灵活的模式。换句话说,您不需要预先对数据建模,也不需要构建预定义的数据存储结构。您只能在节点和边到来时更新它们。

graph DB 有哪些弊端,为什么? 图形数据库尚未成熟。图形数据库提出了一种不同于关系数据库的替代方案,因此图形技术的采用比其他 NOSQL 数据库要慢一些。例如,MongoDB(一个文档存储 NOSQL DB)于 2009 年发布,在 DB-engines 流行度排名中排名第 5,而 Neo4j(一个图形 DB——也是 NOSQL)于 2007 年发布,目前排名第 22。因为该解决方案比其他类型的 NOSQL DB 经过的测试和扩展更少,所以 graph DB 的经验更少。
Graph DB 当前状态是求解复杂关系分析。然而,图形数据库在它所能处理的容量方面是有限的。大多数图形数据库都不能横向扩展,因此管理不断增长的数据量并不是现成的。

第 3 部分—关于选择数据库的可行见解

这一部分涵盖了关系数据库可能无法满足您的数据库需求的五种边缘情况。对于每一个场景,我们都会向您推荐解决这些挑战的技术、目前非常适合这一要求的特定数据库解决方案,以及这些解决方案的利弊。

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

那么,你想去哪里?

关系数据库可能无法满足您需求的五种极端情况是:

  • 我希望能够处理大量数据
    您还不知道将如何使用您存储的所有数据,但如果您今天不存储这些数据,您可能会丢失明天的宝贵信息。为了确保你不会失去这种潜在的价值,鼓励你收集和保存尽可能多的数据。
  • 我希望能够存储任何种类的数据 我们特意选择了“任何种类的数据”这个词来说明世界上存在的各种数据。数据可以来自不同的来源(企业内部或外部),以不同的格式(如文本、照片、视频、表格、PDF、音频等),可以由人或机器生成,可以很容易地获取信息,或者可能需要大量的工作才能获取信息。
  • 我希望能够以快速的方式运行查询,与要处理的数据量或同时执行的查询数量无关 网站和应用程序是用户与企业互动的主要窗口。响应时间是关键——如果您的用户等待太久,他们只需点击一下就可以寻找其他选项,或者放弃他们不确定的交易。同时与您的应用程序交互的用户数量或处理的数据量会极大地影响响应时间。
  • 我希望能够以快速的方式摄取尽可能多的数据 随着物联网、移动应用和社交媒体的兴起,可供企业收集的数据每天都在增加。这一要求与存储容量无关,而是与快速存储大量数据的能力有关。它必须足够快,才能存储大量数据,而不会破坏系统或丢失数据点。
  • 我希望能够处理具有复杂和/或有价值关系的数据 数据点的集合在两个方面有价值:每个数据点和组合数据点包含什么信息,以及数据点是如何连接的。虽然可供存储的数据量在快速增长,但企业了解他们可以访问的数据中有哪些是有价值的,这一点非常重要。它可能是一段时间内多次交易的价值,也可能是这些交易之间的联系以及导致它们发生的潜在原因。根据您的优先级,不同的数据库类型会更适合您的用例。

我希望能够处理大量数据,这可以通过“横向扩展”来解决

您的数据存储需求是什么? 如果您已经收集了数据,您可以通过对您当前的数据存储空间应用一个增长因子来估计您未来的数据存储需求。例如,如果您的增长是由您的用户数量推动的,您可以将您当前的数据存储空间乘以您估计的用户增长。
如果您没有收集到任何数据,您可以粗略估计一段时间内您将收集的数据点的数量。
您可以在下面找到一个如何估算未来数据存储需求的示例。

让我们考虑一下书店的例子。如果您希望每周产生 Y 笔销售,并且每笔销售都以 N 个数据点(账面价格、交易日期和时间、客户 ID 等)为特征,您可以估计在一年内,您将在 DB 中累积 Y x 52(一年中的周数)笔销售(或行)x N 笔销售特征(或列)。然后,您可以参考下表来评估公共关系数据库是否能够处理如此大量的数据。

本练习中要考虑的一个更重要的因素是,在将数据移动到另一个存储空间之前,将数据存储多长时间是合适的。

对于关系数据库来说,有多少数据实际上“太大”而无法处理? DB 引擎提供商分享性能容量指标。您可以使用这些准则来确定关系数据库是否能够处理您的大量数据。

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

你可以在上面找到 PostgreSQL 和 MySQL 的关键性能指标——两个关系数据库。

您应该注意到,最大列数和最大行数的范围很宽。这些容量限制受其他参数的影响,例如数据的编码技术和数据模型。编码技术是数据在计算机中的存储方式。
数据模型指的是组织数据的方式。例如,通过标准化你的数据,你可以节省大量的存储空间。规格化在本文的第 2 部分——反规格化章节中有详细解释。

什么数据库可以处理大量数据? 为了管理大量数据或者能够快速增加存储容量,您的数据库需要能够横向扩展。您可以参考第 2 部分—向外扩展部分来深入了解向外扩展技术。如今,关系数据库可以横向扩展。然而,没有为此目的而设计的。换句话说,关系数据库并没有被优化为在分布式服务器上运行,也不是开箱即用的。
另一方面,除了图形数据库之外的所有 NOSQL 数据库都被认为能够向外扩展。它们都能够在分布式系统上快速运行。

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

您可以找到以上针对横向扩展进行了优化的数据库类型和示例。

从业务影响的角度来看,这些 DBs 有哪些缺点?
第 2 部分—横向扩展章节中所述,横向扩展的第一个缺点是在系统出现故障的情况下,必须在能够访问数据和能够读取数据库上的最新更新之间做出选择。另一个缺点是很难在分布式系统中进行[连接](http://you can picture “joins” as VLOOKUP operations in excel)。让我们讨论一下这对您的企业意味着什么。为了在可用性和一致性之间做出选择,你应该回顾你的需求和你的主要目标。
如果您的数据库正在为一个实时应用程序提供服务,那么在系统出现故障的情况下,您不能允许它有任何停机时间。这意味着可用性是必须的,你必须放弃一致性。
如果您的企业需要确保多个用户始终拥有相同的数据视图,例如,如果您正在管理库存,那么您不应该在物品短缺的情况下向不同的客户销售相同的物品。您需要保持一致性而不是可用性。
关于无法进行连接,这对企业意味着什么?
表示只能逐条表查询数据。换句话说,它限制了您可以在数据库上执行的查询,并迫使您根据将要执行的查询对数据建模,而不是根据数据本身对数据建模。具体地说,如果您有新的查询要运行,您很可能必须创建新的表。因此,更难适应不断变化的业务需求。在关系数据库中,数据库是根据数据建模的,您可以在其中执行连接,您的查询可以随着您的业务需求而发展,而不必重新建模数据库。

我希望能够存储任何类型的数据—可以用“灵活的模式”来解决

您正在收集哪些不同的数据类型? 在选择您的数据库之前,您应该列出您想要存储的不同数据元素,并确定它们的来源、创建者、结构级别和类型。
他们的来源至少应该区分内部数据和外部数据,并且最好应该告知是什么系统生成了这些数据。
它们的创造者应该区分这些数据是由人类还是由机器制造的。它会提示您预期的数据质量水平,以及潜在的转换或检查,您应该在接收数据之前应用。
它们的结构级别可以通过以下三个类别之一来限定:结构化数据、半结构化数据和非结构化数据。简而言之,数据的结构化程度可以看作是从数据中提取信息的难易程度。结构化数据被有逻辑地和一致地组织起来(例如:表格),允许你直接从数据中获取有用的信息。而非结构化数据必须经过处理才能从数据(如文本、表格、图像、视频等)中提取有价值的见解。
它们的类型指的是存储数据的格式。docx,xlsx,。jpg,。wmv 等)。

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

你可以在上面找到结构化、半结构化和非结构化数据的例子。

你能用关系数据库收集这些数据类型吗?
来源和创建者不应该影响数据是否可以存储。
关系数据库只能存储结构化数据。关系数据库要求要存储的数据可以用预定义列组织成类似表格的结构。半结构化和非结构化数据不符合这一要求,因此如果您要存储半结构化或非结构化数据,您应该寻找 NOSQL DB 解决方案。
关于数据类型,在关系表中存储任何可能的数据类型在技术上是可能的。然而,它会吃掉大量的存储空间,却没有太多的附加值。在这种情况下,建议存储文件的标题或路径,并将实际文件放在 DB 之外。

什么类型的 NOSQL DB 可以处理哪些具体的数据类型? 根据要存储的数据结构,您可以找到最适合您需求的数据库。
键值存储,顾名思义,只存储一个键和值。您可以通过使用键来检索存储的值,除了这些二元关系之外,几乎不维护任何结构。
文档存储类似于键值存储,但是具有扩展的存储选项。使用文档存储,不仅可以存储成对的键值,还可以将这些键值组合成集合,或者将它们嵌套在一起。
宽列存储,顾名思义,以列的形式存储数据。让我们举个例子来形象化它的意思。
你可以在下面找到一个行存储数据的例子和一个行存储数据的例子。

按行存储的数据(关系数据库中的数据):
用户、国家、性别
1:法国吉恩,男性
2:英国路易斯,男性
3:法国安妮,女性

存储在列中的数据(宽列存储中的数据):
用户,国家,性别
1:让,2:路易斯,3:安妮
2:法国,2:英国,3:法国
1:男性,2:男性,3:女性

与使用关系数据库运行分析相比,这种结构允许使用宽列存储运行更快的分析。此外,与其他 NOSQL 数据库相比,宽列存储允许维护类似表格的结构。

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

你可以根据要存储的数据结构找到上面推荐的 DBs。

就业务影响而言,这些 DBs 的缺点是什么? 正如在第 2 部分—灵活模式章节中所解释的,灵活模式的主要缺点是失去了数据质量,并且失去了对存储内容的跟踪。让我们讨论一下这对您的企业意味着什么。鉴于你要存储的数据将是半结构化或非结构化的,从中提取洞察力将更加困难。存储这些数据只会推迟清理数据和找出如何利用数据的过程。此外,存储这些数据可能会给你一种建立某种资产的感觉,你可以从中创造价值。然而,在你弄清楚如何使用这些数据之前,你不能给你存储的东西赋予任何价值。换句话说,你正在失去对一项资产的清晰性,这项资产可能非常有价值,或者根本没有价值。

我希望能够以一种快速的方式运行查询——可以通过“反规范化”来解决

您的数据库的响应速度应该如何?
根据您的数据库的用途,您可能需要不同级别的响应时间。
如果您的数据库位于面向客户端的应用程序的后端,您需要确保您的响应时间足够短,以让客户端满意。根据用户在应用程序上执行的操作类型,进行了许多研究来了解响应时间限制。给你一个的例子,建议任何对用户动作的响应持续时间少于 1 秒。
另一方面,如果您的数据库是为了内部目的而运行分析,您可以更加灵活地组织您的团队来适应数据库的处理时间。

如何评估关系数据库是否能够处理您所需的读取吞吐量?
如果您已经收集了数据并可以对其运行查询,那么您可以收集性能信息并评估您的数据库是否符合您的响应时间要求。
如果您还没有收集到数据或者还不能在您的数据库上运行查询,您可以参考第 3 部分“我希望能够处理大量数据”一节中提到的容量指标。如果要分析的数据量接近存储容量上限,那么查询将会非常耗时。

什么类型的 NOSQL 数据库可以处理高读取吞吐量? 响应时间不仅受数据量的影响,还受查询和数据模型的影响。
查询优化调查运行和构建查询的不同方式,并比较它们的性能。非规范化的数据模型允许查询运行得更快,因为所有的信息都存储在一起。
此外,使用分布式系统,您可以并行操作并减少整个查询的时间。如上所述,关系数据库可以在分布式系统上运行,但这并不是它的目的。一些 NOSQL DB 类型已经过优化,可以在分布式系统上运行。
根据您想要执行的操作,不同的数据库最适合您的需求。

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

您可以在上面找到多个操作示例和推荐的数据库。

从业务影响的角度来看,这些 DBs 有哪些缺点?
第 2 部分——反规格化章节所述,反规格化的主要缺点是降低数据一致性。让我们讨论一下这对您的企业意味着什么。
数据一致性确保数据库上同时运行的所有读取操作返回相同的值。具体来说,如果你的数据库被用在网站的后端,并且网站的一些标签上的信息没有在所有的标签上更新,它会使你的网站混乱并损害你的可信度。
第 2 部分—最终一致性章节所示,如果您通过追求最终一致性来损害数据一致性,这意味着您的目标是在某个时间点拥有一致的数据,但不一定是在任何时间。换句话说,它不允许你运行实时分析。
最后,如果您还没有阅读过第 2 部分—横向扩展部分,因为上面提到的 NOSQL 数据库类型(键值存储、文档存储、宽列存储)都是分布式数据库。

我希望能够以快速的方式接收尽可能多的数据,这可以通过“灵活的模式”和“最终的一致性”来解决

您的数据库接收大量数据的速度应该有多快? 您的数据库接收数据的速度将直接影响它是否能够接收您所需的数据量。您需要数据库足够快地接收数据,以免丢失任何数据点。
如果您计划进行实时分析,您还需要以足够快的速度存储数据以便能够使用。

您如何评估关系数据库是否能够处理您所需的写吞吐量? 如果您已经有要收集的数据并设置了摄取过程,那么您可以收集性能信息并评估您的数据库是否符合您的存储时间要求。
如果您还没有要收集的数据或还不能接收数据,您可以参考第 3 部分中提到的容量指标—“我希望能够处理大量数据” 部分并检查您要存储的数据量是否至少在容量性能指标范围内。

什么类型的 NOSQL 数据库可以处理高写吞吐量?
在数据库中写入数据的时间受存储数据之前和之后要检查的约束以及理解数据应该存储在哪里所花费的时间的影响。
没有约束的灵活模式数据库将允许跳过约束进行检查,并具有更好的写入性能。文档存储(例如:MongoDB、CouchBase)和键值存储(Redis、Memchached)是具有非常灵活的模式的 NOSQL 数据库。
最终的一致性将允许在数据被接收之后推迟一致性检查,而不是在接收被验证之前进行,这将有助于加快写入过程。一些宽列存储使用最终一致性并保持某种模式(比关系数据库的固定模式更灵活,但比文档存储和键值存储中几乎不存在的模式更严格)。Cassandra 就是其中之一,它允许对存储的数据进行一些分析,同时针对写操作进行优化。

就业务影响而言,这些 DBs 有哪些缺点?第 2 部分—灵活模式章节所述,灵活模式的主要缺点是失去数据质量,这使得利用数据和对数据进行分析变得更加困难。让我们讨论一下这对您的企业意味着什么。
通过跳过 DB 模式,查询数据变得更加困难,因为您不再确切地知道数据中存储了什么以及如何查询它。同样,您应该回顾您的主要目标和需求,以了解对您将要存储的数据进行分析的重要性。如果您的需求包括能够过滤、排序和检索数据以对其进行一些分析,您还可以找到添加模式的方法,就一些指导原则达成一致,并在数据进入数据库之前强制执行(直接在源数据上,或者在到达数据库之前实现转换过程)。
最后,如果您还没有阅读过第 2 部分——横向扩展部分,我建议您阅读一下,因为上面提到的 NOSQL 数据库类型(键值存储、文档存储、宽列存储)都是分布式数据库。

我希望能够存储复杂的数据关系——可以用图形数据库解决

您的数据中的关系有多复杂和有价值?
数据关系中的复杂性可能来自两个因素。第一个是两个点可以通过不同类型的关系链接起来——例如在网飞,用户可以点击、观看或评论一部电影。第二,一个关系可以将一侧的多个点链接到另一侧的多个点——在网飞的例子中,如果我们考虑“点击”关系,许多用户可以点击许多电影。
如果您的数据在数据模型中累积了大量复杂的关系,您应该认为您的数据是高度关联的。
现在的问题是这些联系有多大价值?你应该问问自己,数据的价值是来自于数据点,还是来自于有联系,如何联系的事实。另一种方式是问问自己,在分析数据点时,如果忽略数据点之间的关系,是否会丢失信息。

您能使用关系数据库收集这些数据吗? 虽然顾名思义——关系数据库不是强调数据关系的数据库。尽管存在跟踪和存储数据的关系,但重点是按照相同的模式对数据点进行分组,并通过索引和列来访问这些信息。如果你的数据是高度关联的,理论上你可以把它存储在关系数据库中。但是,在其上运行查询的性能会受到查询复杂性的影响。事实上,关系数据库上的关系是通过连接【1】调用的。因此,如果您要在高度连接的数据库上运行查询,您很可能会使用大量的连接,这会降低查询的速度。

什么类型的 NOSQL DB 可以处理高度连接的数据? 图形数据库旨在突出数据点之间关系的值。
图形数据库不仅能够对具有复杂关系的数据进行分析,而且能够以非常快速的方式执行这种分析。
要了解更多关于图形数据库的优势,您可以查看第 2 部分——图形数据库章节

从业务影响的角度来看,这些 DBs 有哪些缺点?
第 2 部分—图形数据库章节中所述,图形数据库的两个主要缺点是尚未成熟,并且没有横向扩展的设计。让我们讨论一下这对您的企业意味着什么。
事实上,有很多新的数据库还没有被测试过,这使得图形数据库不太可信。此外,这项技术的专家更少,因此更难招募和解决问题。
因为图形数据库不是为横向扩展而设计的,所以如果您确实需要增加存储容量,您必须定制您的架构。定制允许您根据自己的特定需求定制解决方案,但同时也会带来更高的成本和失败风险。

很好地完成了这篇文章的结尾!
我希望你理解并学习了数据库的新概念。如果你只需要记住一件事,我会最后一次强调没有数据库是完美的,它们都有缺点。对您来说,关键是理解这些权衡,并找到最适合您业务需求的方案。

*照片从上至下从左至右由:
凯尔·科特雷尔、考特尼·米勒、安德烈亚斯·海默尔、谢里·胡利、马多·埃尔·胡利、阿玛纳斯·塔德、亚采克·迪拉格、斯蒂芬·塞伯、马丁·卡特勒、克里斯托弗·伯恩斯和阿纳斯塔西娅·彼得罗娃在 Unsplash 上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值