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

龙哥盟 / 2024-10-15 / 原文

TowardsDataScience 博客中文翻译 2020(六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中字典理解的 7 个便利用例

原文:https://towardsdatascience.com/7-handy-use-cases-of-dictionary-comprehensions-in-python-f7c37e462d92?source=collection_archive---------18-----------------------

PYTHONIC 式的编码方法

展平、反转、合并、过滤等等

照片由 Unsplash 上的 Larm Rmah 拍摄

Python 中的理解是用于从其他序列构建序列的语法结构。本质上,理解是一种更简洁、更易读的编写循环的奇特形式。

所有的理解都可以使用for循环重写,但反之则不成立。总的来说,Python 中有四种理解技术。

  • 列出理解
  • 词典释义
  • 集合理解
  • 生成器理解

这篇文章的目的是向你展示字典理解的力量,以及如何以不同的方式利用它。在我们探索一些有趣的案例之前,让我们先了解一下语法,因为它可能会让许多开发人员在开始时感到困惑。

词典理解的句法

考虑下面的代码,该代码从一系列数字中创建一个字典,其值是键的平方:

square_dict = {num: num*num for num in range(1, 6)}
print(square_dict)
#Output
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

现在让我们使用上面的代码作为参考来分析字典表达式的语法:

上面的语法代表了编写字典理解的最小形式。词典理解的输出以绿色突出显示。所有的键值对都被分配给构造的字典。

iterable 不一定是字典。它可以是任何可以循环的 python 对象——列表、元组、字符串等。

与列表理解不同,字典理解也可以同时迭代一组键和值。通过调用字典上的items()方法,您可以将它转换成一个键值元组列表进行循环。

还可以在字典理解中的for循环后设置一个条件语句,如下所示:

fruits = ['Apple', 'Orange', 'Papaya', 'Banana', '']fruits_dict = {f:len(f) for f in fruits if len(f) > 0}print(fruits_dict)
#Output
{'Apple': 5, 'Orange': 6, 'Papaya': 6, 'Banana': 6}

既然我们已经很好地了解了字典理解的语法,让我们来看看它的应用。

1.字频率

通常情况下,您需要构建一个字典来保存字符串中每个单词的计数。使用 for 循环实现这一点的经典方法是:

s = 'I felt happy because I saw the others were happy and because I knew I should feel happy'dict = {}
for token in s.split(" "):
    dict[token] = dict.get(token, 0) + 1

但是我们可以使用字典理解使它明显更短,如下所示:

frequency_dict = {token: s.split().count(token) for token in set(s.split())}#Output
{'felt': 1, 'and': 1, 'should': 1, 'others': 1, 'saw': 1, 'were': 1, 'knew': 1, 'happy': 3, 'feel': 1, 'the': 1, 'because': 2, 'I': 4}

2.修改字典的键和值

对于大型字典,可能会出现这样的情况,您需要在所有的字典后面追加一个字符。例如,它可以是一个简单的$符号。

在另一种情况下,您可能需要从键或值字符串中删除一个字符。以下是如何使用字典理解功能通过修改键和值来创建新字典的示例:

d = {'My_Article1': '1', 'My_Article2' : '2'}my_dict = { k[3:] : '$' + v for k, v in d.items()}#Output
{'Article1': '$1', 'Article2': '$2'}

3.按一组关键字过滤词典

您可能只对字典中具有特定键集的部分感兴趣。下面是一个基于键列表过滤和创建新字典的示例:

d = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
keys = [1, 2]my_dict = {key: d[key] for key in keys}
#Output
{1: 'a', 2: 'b'}

但是当列表keys包含一个字典中没有的无关值时,上面的代码会抛出一个错误。因此,我们不迭代keys,而是使用sets来寻找dkeys中的公共键,如下所示:

my_dict = {key: d[key] for key in set(keys).intersection(d.keys())}

下面是第三种情况,我们通过包含指定字符串的关键字来过滤字典:

d = {'num_1': 'a', '2': 'b', 'num_3': 'c', '4': 'd'}filter_string = 'num'
filtered_dict = {k:v for (k,v) in d.items() if filter_string in k}
#Output
{'num_1': 'a', 'num_3': 'c'}

4.反转字典的映射

如果您的字典有唯一的键和值,并且想要反转从k:vv:k的映射,您可以通过以下方式使用for循环来实现:

d = {'1': 'a', '2': 'b', '3': 'c', '4': 'd'}my_dict = {}
for k,v in d.items():
    my_dict[v] = k

通过使用字典理解,我们可以在一行中做同样的事情:

my_dict = {v: k for k, v in d.items()}
#Output
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}

5.元组和稀疏向量到字典

接下来,我们有一个元组列表,其中每个元素包含国家代码和名称。我们将使用理解技术创建一个字典,以国家名称作为关键字,以国家代码作为值:

tuples = [("US", '+1'), ("Australia", '+61'), ("India", '+91')]
my_dict = {k[0]: k[1] for k in tuples}

稀疏向量一般包含很多零值。我们可以考虑在字典中只保存非零值,这样可以节省一些空间。通过使用下面的字典理解技术,我们可以将稀疏向量转换成键值对,其中key是稀疏向量的索引:

values = [0,0,21,0,0,0,100]
my_dict = { values.index(v) : v for v in values if v}
#Output
{2: 21, 6: 100}

还有另一种方式来编写上面的字典理解,可读性稍微好一点:

my_dict = {n: v for n,v in enumerate(values) if v}

if v表示仅当稀疏向量的元素不是 False、0、None 等时,才将键和值添加到字典中。

6.整理字典

对字典进行分类有不同的方法。我们可以用键或值,按升序或降序来做。让我们来看看。

下面是一个按关键字升序和降序排序的示例:

d = {"a": 3, "b": 4, "d": 1, "c": 2}
dk_ascending = {k: d[k] for k in sorted(d)}
#Output
{'a': 3, 'b': 4, 'c': 2, 'd': 1}dk_descending = {k: d[k] for k in sorted(d, reverse=True)}
#Output
{'d': 1, 'c': 2, 'b': 4, 'a': 3}

以下示例显示了如何按升序和降序对值进行排序:

d = {"a": 3, "b": 4, "d": 1, "c": 2}
dv_ascending = {k: d[k] for k in sorted(d, key=d.get)}
#Output
{'d': 1, 'c': 2, 'a': 3, 'b': 4}dv_descending = {k: d[k] for k in sorted(d, key=d.get, reverse=True)}
#Output
{'b': 4, 'a': 3, 'c': 2, 'd': 1}

7.将字典列表展平为单个字典

假设 Python 列表中有未知数量的字典,如下所示:

l = [{'a':1}, {'b':2}, {'c':3, 'd' : 4}]

现在,我们想把这个列表展平成一个字典,这样所有的子字典合并成一个字典。我们可以使用下面的双重嵌套字典理解技术:

my_dict = {k: v 
for d in l 
for k, v in d.items()
}#Output
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

结论

我们看到了在 Python 中应用字典理解的许多不同的用例。这个想法是有效地使用它,不要过度使用。很容易误用它来进行相当简单的操作。

这一篇就到此为止——感谢阅读。

每个数据科学家都应该知道的获取缺失值的 7 个习惯用法

原文:https://towardsdatascience.com/7-idioms-to-acquire-missing-values-every-data-scientist-should-know-2edf4224360c?source=collection_archive---------24-----------------------

数据科学提示

你应该把命令自动化

卢多维克·沙雷特在 Unsplash 上的照片

M 缺失数据肯定会在数据集分析过程中产生问题。即使是确定丢失值的事实,更不用说它们的数量和分布,也可能消耗大量的时间。这就是为什么您可能应该保留一些有用的命令,以提高自动化和分析速度,并保持代码整洁和准确。

我们将使用 Kaggle 的免费葡萄酒评论数据集来展示这些命令的影响。

1.DataFrame.describe()(但不完全是)

在这里你可以想到可能和 describe() 方法一样司空见惯的东西。尽管该方法处理了关于整个数据集的大量信息(但没有一个字是关于丢失的数据的)。实际上,我们不会使用这个命令的所有潜力,而是可以应用一个简单的技巧来提取我们需要的数据。只需查看输出的 count 列:

wine_data.**describe**(include='all').loc['count']

我们检索所有列的非缺失值的数量:

Unnamed: 0     150930
country        150925
description    150930
designation    105195
points         150930
price          137235
province       150925
region_1       125870
region_2        60953
variety        150930
winery         150930
Name: count, dtype: object

它不是我们需要的确切信息,因为它期望我们知道数据集的大小来计算数据缺口的数量。但是,我们可以很容易地将输出转换成现值的百分比,这相当有用:

wine_data.**describe**(include='all').loc['count'] / wine_data.shape[0] * 100

describe() 方法的过滤能力(包含/排除参数)为我们提供了必要的灵活性。

2.Series.value_counts()(但不完全是)

通常这是一个非常有用的命令,有很多输出。但是,我们将再次应用一个小技巧。这是我们可以用来检索单个列中缺失值的数量的习语。不再多言:

wine_data['country'].**value_counts**(dropna=**False**).loc[np.nan]Out[1]: 5

3.DataFrame.count()

对于那些不需要 describe()方法及其过滤能力的人来说,pandas 已经内置了 count()方法:

wine_data.**count**()Out[1]:
Unnamed: 0     150930
country        150925
description    150930
designation    105195
points         150930
price          137235
province       150925
region_1       125870
region_2        60953
variety        150930
winery         150930
dtype: int64

对于单列:

wine_data.**count**()['country']Out[1]: 150925

很简单,有点无聊。

4.isnull()。总和()习语

非常常见和非常有用的习语检索缺失数据的数量。看起来正是我们从一开始就想要的命令:

wine_data.**isnull**().sum()Out[1]:
Unnamed: 0         0
country            5
description        0
designation    45735
points             0
price          13695
province           5
region_1       25060
region_2       89977
variety            0
winery             0
dtype: int64

页(page 的缩写)对于紧凑代码爱好者来说, isna() 别名是存在的:

wine_data.**isna**().sum()

5.isnull()。sum()。sum()(深入)

有时我们不需要数据缺口的数量,而是需要它们存在的事实(例如,对于自动化管道)。我们会发现下一个习语很有用:

wine_data.**isnull**().sum().sum()Out[1]: 174477

但是它返回一个数字,我们可能想把它转换成布尔值。所以,还有一个习语返回布尔值:

wine_data.**isnull**().values.**any**()Out[15]: True

简短回答的简短代码。

6.NaNs 热图

但是,如果需要更多关于数据集中缺失值分布的信息,该怎么办呢?我们应该有意识地画出差距的热图!

**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**plt.figure(figsize=(16,10))
sns.heatmap(wine_data.isnull(), cbar=**False**, cmap="YlGnBu")

seaborn 的热图。黑线显示数据差距。

看一下分布就可以为分析提供很多信息。

7.缺失值的索引

之前的所有脚本都没有回答我们数据缺口在哪里。当然,我们可以使用数据帧过滤器来隔离丢失的数据或简单地丢弃它。但是在少量缺失数据的情况下(还记得“国家”栏的 5 个缺口吗?)我们可能希望现在它完全没有重新索引的问题。因此,多一个内置的熊猫方法将帮助我们:

wine_data['country'].isnull().**to_numpy**().**nonzero**()Out[18]:
(array([  1133,   1440,  68226, 113016, 135696], dtype=int64),)

这样,一个索引数组就准备好了。

这种简短紧凑的命令可以在数据集调查过程中节省一些时间。对我来说,我总是在不同的组合中使用它们,用更少的代码获得更多有价值的信息。你可以在我的 GitHub 上找到整个工作笔记本:

[## 中级/中等 _jupyter_notes

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/Midvel/medium_jupyter_notes/blob/master/missing_data_idioms/missing-data-tips.ipynb)

在您的数据科学项目中,您使用了哪些单行惯用语?

机器学习工程师和研究人员之间的 7 个关键区别(包括工资)

原文:https://towardsdatascience.com/7-key-differences-between-machine-learning-engineers-and-researchers-salaries-included-b62c3aaebde9?source=collection_archive---------16-----------------------

包含有关期望薪资、工作量、可交付成果以及更多重要差异的信息。

左:Arif Riyanto 在 Unsplash 上的照片右:Jaredd Craig 在 T2 Unsplash 上的照片

介绍

人工智能目前是一个有趣的行业,机器学习从业者现在是'酷孩子'

但即使在'酷孩子''中,机器学习实践者的群体之间也有明显的区别,更具体地说,是研究解决方案的人和设计解决方案的人之间的区别。

也就是说,这种区别并不像它应该的那样明显。

这篇文章旨在揭示机器学习研究者和 ML 工程师之间的一些关键区别。

强调这两种角色之间的差异可以让你获得做出更好的学术和职业选择所需的信息。

在我们进一步讨论之前,需要注意的是,我将术语机器学习工程师和研究员作为以下角色的总称:

  • 计算机视觉工程师/研究员
  • 自然语言处理工程师/研究员
  • 数据科学家

主要差异

1.工作角色描述

机器学习工程师的角色包括在已实施的软件/硬件解决方案中实施机器学习算法和模型。

机器学习研究人员的角色关注机器学习中特定或利基学科领域的进步。

2.学术背景

科尔·凯斯特在 Unsplash 上拍摄的照片

ML 研究人员通常被教育到博士水平。他们往往是具有强大的学术和研究背景的个人。

他们还拥有计算机科学相关课题的高级学位。

大多数 ML 工程师拥有硕士学位,只有少数 ML 工程师拥有博士学位。

为了了解 ML 工程师和研究人员的学术背景,我利用了 LinkedIn

我查看了一些职位名称中包含“机器学习研究员”、“机器学习科学家”或“机器学习工程师”的个人简介。

3.交付品/最终产品

Rami Al-zayat 在 Unsplash 上拍摄的照片

ML 工程师的可交付成果通常是具有机器学习模型的工程解决方案,能够以自动化、高效或创造性的方式执行一组任务。

对于一个 ML 工程师来说,最终产品或可交付成果可以是一个软件,其中的功能由机器学习方法驱动。

然而,ML 研究人员的可交付成果往往是一篇写得很好的研究论文,其中包括为实现特定机器学习相关任务中性能/准确性的特定进步或改进而进行的实验和调查研究的细节。

一个 ML 研究者的最终产品将是对新发现、改进或分析的探索记录,并提交给国际会议和科学杂志。

4.薪水

照片由 Jp Valery 在 Unsplash 上拍摄

薪水可能是许多读者最感兴趣的关键差异。

机器学习从业者的需求量很大,ML 相关角色提供的薪资就反映了这一点。

例如,纽约时报的这篇文章提到顶级人工智能研究人员的工资超过 100 万美元。

很明显,在高要求的行业中,收入最高的 0.01%的人拥有高额的薪水。

但是让我给出一些适用于大多数人的数据。

在英国,从 2020 年 4 月 3 日算起的 6 个月内,机器学习研究员 的平均 工资为57500 英镑。****

同时,同期机器学习工程师 的平均 工资为68750。****

所以在英国,两个 ML 角色之间有明显的 10000 的差距。

根据 LinkedIn 的数据,在美国的 ML 研究人员 平均** 底薪为14.3 万美元(110 ML 研究人员)**

对于美国的 ML 工程师 ,这个数字降为12.5 万美元,但是包含了 900 多 ML 工程师的更多数据。

就我个人而言,根据我对人工智能行业中与我一起学习和工作的人的观察,金钱动机不是主要的。

接触和获取知识的机会似乎对我的团队更有吸引力,包括我自己。

简单来说,年轻的机器学习工程师可能更关心吹嘘的权利和影响力,而不是金钱激励。

谁不想成为一个FAANG公司的机器学习工程师或研究员,而不考虑报酬?**

请注意,统计数据并不能反映该行业的真实薪资预期,它们应该被用作指导方针,而不是绝对的事实。

5.工作/项目范围

照片由 D A V I D S O N L U N A 在 Unsplash 上拍摄

ML 工程师需要看到更大的画面。ML 研究者需要更集中的视角。

软件工程是一门学科,要求理解与产品、过程或管道相关的组件。这是至关重要的,因为工程师的任务是负责集成几个组件。

以下是一个典型的 ML 工程师在项目中需要解决的几个问题:

  • 理解 ML 模型使用的数据格式
  • 理解从数据源接收的数据格式
  • 实现与数据湖和数据库的连接,以便存储和访问数据。
  • 了解最终产品的使用环境,因为这可以决定分配的资源水平,以确保高效运行和最佳运行能力。

另一方面,一个 ML 研究员的工作范围往往是非常明确的。ML 研究员的角色是一个非常集中的学科。

ML 研究人员不需要非常担心 ML 模型或算法在各种环境中的表现。ML 研究员的工作往往非常关注问题和具体。他们的任务通常是找到解决问题的新方法,或者提高以前设计的解决方案的性能和准确性。

6.工作角色要求

对 ML 研究人员的工作角色描述和要求是精确的,并且集中在机器学习的特定领域。

ML 研究员的典型工作角色要求包括以下内容:

  • 机器学习平台和库的知识,如 TensorFlow、PyTorch、Keras 等。
  • 能够进行文献综述,并以良好的书面研究格式提交报告和实验结果,以提交给会议或科学期刊
  • 机器学习中特定领域的成熟知识,如概率模型、高斯过程、强化学习等
  • 对包括理论知识在内的机器学习的基本主题有很强的理解
  • 扩展利基问题的最新技术

ML 工程师的典型工作角色要求如下:

  • 云计算服务知识,如谷歌云平台(GCP) 和亚马逊网络服务(AWS)
  • 精通 Java、Python、JavaScript 等语言的编程技能
  • 将机器学习模型部署到生产环境中的经验
  • 在手机等边缘设备上部署机器学习模型的经验
  • 能够实施、评估和测试常见问题的最新解决方案,如对象检测、语义分割和图像分类
  • 能够从发表的研究论文中提取关键细节和信息,并向项目利益相关者传达发现。
  • 实施数据挖掘脚本的经验。

7.重叠

ML 研究员可以做工程,ML 工程师做研究。

成为机器学习实践者也意味着精通现代的软件库和硬件。如果机器学习本身是一个多学科的领域,职称通常不能描绘角色的全貌。

为了说明我的观点,ML 研究人员可以在实际研究和工程之间进行 70/30 的划分。而不是硬币的另一面,ML 工程师通常在工程和研究之间有 70/30 的分离。

我可以证明,对于一个 ML 工程师来说,研究和工程是分开的,因为在我目前作为计算机视觉工程师的角色中,我花了很多时间将 ML 模型设计成解决方案,如网站或移动应用程序。与此同时,我会花很少的精力搜索代码为的论文或研究中心发表的关于我正在解决的特定问题的研究论文。

结论

我不得不承认,有几个区别在本文中没有提到,但快速的谷歌搜索会提供一些其他的区别。

无论你选择走哪条职业道路,都要承认这两个角色都需要大量的时间和努力来获得,但是好处是值得的。

为了更多地了解作为一名 ML 工程师是什么样子,我链接了两篇文章,讲述了我作为一名计算机视觉工程师在一家初创公司的第一天和第一个月是如何度过的。

** [## 我作为计算机视觉工程师的第一个月

洞察一个实践机器学习工程师的第一个月。Jupyter 笔记本之外的世界

towardsdatascience.com](/my-first-month-as-a-computer-vision-engineer-5813574d394a) [## 我作为计算机视觉工程师的第一天

剧透:我引起轰动

towardsdatascience.com](/my-first-day-as-a-computer-vision-engineer-8b59750c79a0)

希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 视频内容即将上线 这里
  2. 跟着我上
  3. 通过 LinkedIn 联系我**

7 个机器学习算法的 7 个要点

原文:https://towardsdatascience.com/7-key-points-on-7-machine-learning-algorithms-945ebda7a79?source=collection_archive---------43-----------------------

引擎盖下到底发生了什么?

在 Unsplash 上由 Waldemar Brandt 拍照

感谢各种库和框架,我们可以只用一行代码实现机器学习算法。有些则更进一步,让你立刻实现和比较多种算法。

易用性也有一些缺点。我们可能会忽略这些算法背后的关键概念或思想,而这些概念或思想对于全面理解它们是必不可少的。

在这篇文章中,我将提到 7 个机器学习算法的 7 个关键点。我想指出的是,这不会是对算法的完整解释,所以如果你对它们有一个基本的了解就更好了。

我们开始吧。

1-支持向量机(SVM)

点:C 参数

SVM 创建了一个决策边界来区分两个或更多的类。

软利润 SVM 试图通过以下目标来解决优化问题:

  • 增加决策边界到类别(或支持向量)的距离
  • 最大化训练集中正确分类的点数

这两个目标之间显然有所取舍。决策边界可能必须非常接近某个特定类,才能正确标注所有数据点。然而,在这种情况下,新观测值的准确性可能会较低,因为决策边界对噪声和独立变量的微小变化过于敏感。

另一方面,决策边界可能被放置在尽可能远的每个类,代价是一些错误分类的异常。这种权衡由 c 参数控制。

C 参数为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。

如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不一样的。它与到决策边界的距离成正比。

2-决策树

要点:信息增益

当选择要分割的特征时,决策树算法试图实现

  • 更多的预测
  • 杂质少
  • 低熵

是不确定性或随机性的度量。一个变量的随机性越大,熵就越大。均匀分布的变量具有最高的熵。例如,掷一个公平的骰子有 6 个概率相等的可能结果,所以它有均匀的分布和高熵。

熵 vs 随机性

选择导致更纯节点的分裂。所有这些都表明“信息增益”,这基本上是分裂前后熵的差异。

3-随机森林

要点:引导和特征随机性

随机森林是许多决策树的集合。随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果与单个决策树的结果不会有太大不同。随机森林通过自举特征随机性实现不相关的决策树。

Bootstrapping 是通过替换从训练数据中随机选择样本。它们被称为 bootstrap 样本。

通过为随机森林中的每个决策树随机选择特征来实现特征随机性。随机森林中每棵树使用的特征数量可通过 max_features 参数控制。

特征随机性

4-梯度提升决策树

要点:学习率和 n _ 估计量

GBDT 是决策树与 boosting 方法相结合的集合,这意味着决策树是顺序连接的。

学习率n_estimators 是梯度推进决策树的两个关键超参数。

学习率就是模型学习的速度。较慢学习速率的优点是模型变得更加健壮和通用。然而,学习是要慢慢付出代价的。训练模型需要更多的时间,这就引出了另一个重要的超参数。

n_estimator 参数是模型中使用的树的数量。如果学习率低,我们需要更多的树来训练模型。然而,我们需要非常小心地选择树的数量。使用太多的树会产生过度适应的高风险。

5-朴素贝叶斯分类器

点:天真有什么好处?

朴素贝叶斯是一种用于分类的监督机器学习算法,因此任务是在给定特征值的情况下找到观察值的类别。朴素贝叶斯分类器计算给定一组特征值(即 p(yi | x1,x2,…,xn))的类的概率。

朴素贝叶斯假设特征是相互独立的,特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。

所有特征都是独立的假设使得与复杂的算法相比非常快。在某些情况下,速度优先于更高的精度。

它可以很好地处理文本分类、垃圾邮件检测等高维数据。

6-K-最近邻

要点:何时使用和不使用

k-最近邻(kNN)是一种受监督的机器学习算法,可用于解决分类和回归任务。kNN 的主要原理是一个数据点的值是由其周围的数据点决定的。

随着数据点数量的增加,kNN 算法变得非常慢,因为模型需要存储所有数据点,以便计算它们之间的距离。正是这个原因也使得算法的内存效率不高。

另一个缺点是 kNN 对异常值很敏感,因为异常值对最近的点有影响(即使它太远)。

积极的一面是:

  • 简单易懂
  • 不做任何假设,因此可以在非线性任务中实现。
  • 适用于多个类别的分类
  • 处理分类和回归任务

7-K-均值聚类

要点:何时使用和不使用

k-均值聚类旨在将数据划分为 k 个聚类,使得同一聚类中的数据点相似,而不同聚类中的数据点相距较远。

K-means 算法无法猜测数据中存在多少个聚类。集群的数量必须预先确定,这可能是一项具有挑战性的任务。

随着样本数量的增加,算法会变慢,因为在每一步,它都要访问所有数据点并计算距离。

K-means 只能画线性边界。如果数据中存在非线性结构来分隔组,k-means 将不是一个好的选择。

积极的一面是:

  • 容易理解
  • 相对较快
  • 可扩展用于大型数据集
  • 能够以一种聪明的方式选择初始质心的位置,从而加速收敛
  • 保证收敛

我们已经介绍了每个算法的一些关键概念。给出的要点和注释绝对不是算法的全部解释。然而,在实现这些算法时,了解它们对于做出改变是非常重要的。

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

在接受数据分析师提议之前,要考虑的 7 个鲜为人知的因素

原文:https://towardsdatascience.com/7-little-known-factors-to-consider-before-you-accept-that-data-analyst-offer-a27cb36aa285?source=collection_archive---------51-----------------------

办公时间

剧透一下——这不是薪水或头衔

照片由丹金在 Unsplash 上拍摄

恭喜你!您已经完成了数据分析师面试,并获得了一份工作机会。你再兴奋不过了。

你会接受吗,因为主要原因是比你现在的工作更高的薪水和更高的头衔?如果你的回答是“是”,请继续阅读。

我之前谈过作为一名成功的数据分析师我学到了什么。今天我想更进一步,谈谈你应该考虑的鲜为人知的因素,让你的成功之路更加平坦。

1.对公司业务的兴趣

公司业务是否符合你的个人兴趣?记住,你每周要花 40 多个小时查看未来几年的数据。如果你喜欢玩电子游戏,而这是一家在线游戏公司,你会更喜欢你的工作,而不是为一家卖家具的公司工作吗?

对公司业务感兴趣将增加你的参与度,并帮助你获得第一手的观点,从而找到可行的见解。

2.数据文化

数据在公司的决策中是如何使用的?数据团队是否建立良好?数据基础设施是什么样的?

这些问题的答案将决定你作为数据分析师的生活。

缺乏数据基础设施意味着您可能最终不得不手动提取和加载原始数据来进行分析,因为这些数据不存在于数据库中。你会花大部分时间去获取数据,而不是分析数据。

如果你是第一批数据雇员之一,你想从其他人那里学习,这家公司可能不太适合你。如果你是一名高级分析师,想要展示你的技能,那么成为首批数据雇员对你来说是一个好机会。如果没有数据科学团队,那么就有可能将建模融入到您的工作中,并在工作中学习。

根据你的职业目标决定这家公司的数据文化是否适合你

3.学习潜力

在这家新公司,你还能学到多少额外的技能?

每个公司都有一套不同的工具和系统。学习如何使用这些工具和系统将有助于扩展你的简历。

如果数据团队中有许多分析师,并且数据文化非常强大,那么你有很大的潜力向团队中的其他人学习,并从事你以前从未做过的新型分析。

4.公司增长潜力

这家公司有可能发展壮大数据团队的规模吗?

这可能是一个赔钱的创业公司,但如果业务在增长,你的角色可以随着业务的增长而增长。如果公司停滞不前,业务发展缓慢,那么未来扩大数据团队和提升你的资金就会减少。

5.经理和利益相关者

你的经理会指导你并帮助你更上一层楼吗?

如果你是一名初级分析师,而你的经理似乎太忙或缺乏指导你的技能,那么你只能靠自己,你将更难达到下一个级别。

你的利益相关者使用数据做决策吗?

你可以成为世界上最好的分析师,但如果你的利益相关者不接受你的建议,而依赖直觉,你就无法展示价值。让利益相关者依靠你的分析来改进业务,对建立你的信誉大有帮助。

6.行业

你是支持一个部门还是多个部门?

如果你是一名初级分析师,支持多个部门会让你最大程度地接触到业务的不同部分,并帮助你在各种分析中获得更多经验。如果你是一名高级分析师,这可能并不理想,因为你可能很少有机会展示你在某个领域的专长。

你将支持的部门是成本中心还是收入中心?

营销是一个成本中心。如果你支持市场营销,而事实证明市场营销不能带来比他们花费更多的销售,那么在市场营销中扩大你的角色的机会将非常低。

相反,销售是一个收入中心。如果你支持销售并帮助提高转化率,那么你更有可能被注意到,随着销售的增长,他们可以雇佣更多的分析师并让你领导他们。

7.工作生活平衡

我不知道你怎么想,但是在一天中的某个时间点之后,我会遭受收益递减的痛苦。我需要休息和充电,因为这比连续 12 个小时盯着一个问题更容易帮助我思考问题。

如果你知道你的工作压力大,工作时间长,那么你会很快筋疲力尽,开始寻找新的工作。健康的工作生活平衡会让你保持快乐和投入。

我们如此关注薪水和头衔,是因为这些是人们用来评估工作机会的最常见的因素。现在你知道了在通往成功的道路上要考虑的另外 7 个因素。现在决定权在你手中。明智地选择。

你可能也会喜欢…

*** [## 我作为数据科学家和数据分析师的经历

我希望从一开始就知道的成功秘诀

towardsdatascience.com](/my-experience-as-a-data-scientist-vs-a-data-analyst-91a41d1b4ab1) [## 如何将机器学习成果转化为商业影响

向高管解释模型结果

towardsdatascience.com](/how-to-translate-machine-learning-results-into-business-impact-d0b323112e87) [## 我如何使用机器学习模型来生成可操作的见解

将数据科学与数据分析相结合

medium.com](https://medium.com/swlh/how-i-used-a-machine-learning-model-to-generate-actionable-insights-3aa1dfe2ddfd)***

现在修复 7 个现代 Python 错误!

原文:https://towardsdatascience.com/7-modern-python-mistakes-to-fix-now-6ff6f1dedbf3?source=collection_archive---------14-----------------------

Python 中常见的 7 个不该犯的错误。

笔记本

介绍

Python 是一种相对容易掌握的语言,但是由于很多事情都是假设的,所以很容易出错。此外,这些错误可能会在很长一段时间内被忽视。提前给我的另外四头菜鸟巨蟒失误

[## 避免这些 Python 新手的错误

他们可能会工作,但他们可以工作得更好。

towardsdatascience.com](/avoid-these-rookie-python-mistakes-9cc17cccd051)

今天我将分享更多在 Python 3.8 中容易犯的错误。

№1: +=

在很多情况下,我肯定会犯的一个错误是使用了+=操作数。假设加法必须用两个独立的操作数来完成似乎太容易了,一个用于加法,另一个用于断言。幸运的是,Python(以及许多其他编程语言)支持可以同时执行数学和断言运算的操作数。

而不是:

x = x + 5

做:

x += 5

№2:位置变元表示

在大多数现代脚本语言中,有两种主要类型的参数可以用作函数的参数:

位置和

关键词。

在 Python 3.8 发布之前,没有办法表示位置参数,使得位置参数缺省基本上不可能。然而,由于 Python 3.8 中的更新,我们可以使用\将所有以前的参数表示为位置参数。您应该使用它们,因为位置参数是高性能 Python 代码的基础。如果在 Python 中有什么东西是你的代码需要补偿的,特别是在机器学习的时候,那可能就是性能。

关键字参数在函数定义时计算一次。这对递归算法的性能尤其有害。如果你喜欢写成本函数,使用位置参数是绝对必要的。这并不是说根本不应该使用它们,但是尽可能使用位置参数绝对是一个更好的主意。

而不是:

def numbers(custom, five=5,ten=10,fifteen=15):
    total = five + ten + fifteen + custom
    return(total)

做:

def numbers(custom,\,five=5,ten=10,fifteen=15):
    total = five + ten + fifteen + custom
    return(total)

同样重要的是要记住,这个特性是相当新的,所以为了提高性能而使用仅位置参数的概念将仅限于 Python 3.8+版本

№3:初始化时返回

虽然这种方法并不常见,而且可能是一个相当大的新手动作,但我见过有人尝试在初始化函数中执行 returns。在 Python 面向对象的世界中,每次实例化一个类时都会调用 init 函数。init 函数对于设置变量、移动数据和构造类型非常有价值。然而,随着强大的能力而来的是巨大的责任,Python 的 init 函数应该用于类初始化,而不是监视、循环、定向,只是类初始化。并且拜托(我有经历过有人这么做!)

初始化时不要返回!

(没有任何意义!)

№4:循环依赖

当用完成相似目标的不同部分编写一个大的 Python 包时,通常你的包会互相依赖。这可能会产生很大的问题,并导致所谓的“循环依赖”发生这种情况时,当模块中的不同位置试图相互访问时,就会遇到问题。

№5:空格还是缩进?

众所周知,Python 使用缩进而不是分隔符来将代码包含在其他代码中。对许多人来说,这使得代码更容易阅读和编写,尽管我个人主观上很鄙视它。然而,在其他语言中,我通常倾向于用缩进(tab 键)来缩进代码。)然而,根据 PEP8,你应该使用四个空格来缩进。老实说,这是我和很多人一起做项目时唯一遵循的原则。对我来说,只要保持一致,我不认为空格或缩进有什么关系——但正式来说,你应该使用空格。也就是说,在为一项工作或需要许多其他用户观察的大型团队项目编写代码时,遵循 PEP8 的标准可能是一个好主意。

№6:块迭代

当执行迭代 for 循环时,当您编写完整长度的 for 循环时,在代码中表达您的想法会容易得多。然而,一般来说,如果您需要执行的操作只需要一行,那么最好是循环一行。这不仅会使您的代码更加漂亮和简洁,而且还会带来相关的性能提升。

而不是:

for i in x:
    i += 5

做:

[i + 5 for i in x]

№7:内部字符串

对于要考虑的最后一个错误,我想谈谈互联网字符串。在某些情况下,Python 会尝试重用不可变的对象,字符串实习就是这种情况的一个例子。所有长度为 1 的字符串都被保留。除 ASCII 字符、数字和下划线之外的任何字符串都不会被保留。

这里我试图创建两个不同的对象,a 和 b,但是这不是 Python 所做的。Python 实际上把 b 变成了指向 a 的指针,而不是产生一个新的字符串。但是如果我们添加一个 ASCII 字符:

所以在使用不可变字符串的时候要记住这一点,因为它确实给我带来了很多麻烦。

7 个月的关系,WhatsApp 消息分析

原文:https://towardsdatascience.com/7-months-of-a-relationship-whatsapp-messages-analyzed-e5c34b8aaa63?source=collection_archive---------19-----------------------

莫兰在 Unsplash 上的照片

他们说,交往是关键。没有交流,任何关系都是生不如死。在这个时代,就通信而言,技术占据了中心舞台。在这篇文章中,我们将分析我和我未婚夫之间的 WhatsApp 消息,最终你可以在 WhatsApp 数据上应用这些知识。我们将在这个分析中使用 Python,并具体处理:Pandas 表、数据可视化、数据清理等等。

在我们开始之前,我想提一下,我们已经有一年半的关系了,可用的聊天时间是从 2019 年 12 月 18 日到 2020 年 8 月 10 日(236 天或 7 个月 23 天)。在这期间,我离开了我的祖国,离开了她的家乡。我们是土生土长的肯尼亚人,但我目前在南非。

现在让我们继续分析数据。我希望我们一步一步来,这样你就清楚了。

步骤 1:获取 WhatsApp 数据

WhatsApp 允许用户将整个聊天记录下载到一个文本文件中。要做到这一点,请打开您有兴趣获取数据的对话。在右上角点击 3 个点>更多>导出聊天>无媒体。之后,将下载一个文本文件,它将包含从开始到结束的转换中的所有消息。为了清楚起见,我把我的保存为whatsapp.txt

图 1:获取转换数据的过程。(来源:作者)

第二步:查看数据

打开文件whatsapp.txt时,你会看到这样一个文件

图 whatsapp.txt 文件的前 5 行(来源:作者)

  • 第 1 行:这是 WhatsApp 的一条消息,确保消息是端到端加密的。这是一个特例,我们将在分析中跳过它。
  • 第 2 行到第 5 行:通常,每一行代表发件人的一条消息。它将包含日期、时间、发送者以及消息

:有两个寄件人(我和我未婚夫)。我把我未婚夫的名字保存为我的妻子,我爱你❤ ,我的 WhatsApp 用户名是 koech christian

步骤 3:处理数据并将其保存到 CSV 中

对于每一行,我们需要提取消息发送的日期和时间、发送者和消息本身。

  • 第 2 行:这是一个空列表,用来保存我们的数据。
  • 第 3 行和第 4 行:这里,我们以读取模式(r)读取我们的文件,并且一次遍历每一行。
  • 为了理解第 6–8 行,让我们以其中一行为例:
**line** = 12/18/19, 08:15 - koech christian: Have woken up my dear.In 6, we will **strip** the **line** of trailing white spaces and **split** the **line** by the hyphen (-)Result: 
12/18/19, 08:15 **#send_time**
koech christian: Have woken up my dear. **#message_section**Note: **send_time** still has both the date and the time while **message_section** has the sender and the message.Code line 7: We will split the content of **message_section** by the first occurrence of a full colon (:) hence **maxsplit = 1**. If we don't do this split function may split at the middle of the message in case a sender uses a full colon.You now know what 8 does.
  • 第 9 行到第 15 行:我们将感兴趣的值传递到一个字典中,然后将其追加到数据中。
  • 第 19 行和第 20 行:将数据写入名为messages.csv的 CSV 文件。
  • 行 1 引发的异常将由try...except...处理

步骤 4:查看 CSV 文件

让我们加载我们在步骤 3 中保存的 CSV 文件(messages.csv),看看几行是什么样子的。

输出:

接下来的事情是分析数据,但在此之前,我只是想做出我的猜测,可能是我的预期。第一,我知道这很傻,但我给我的句子加标点符号,她不 LoL!。她睡得很早,甚至没有说晚安,所以我打赌我会在任何一天结束谈话。她也比我醒得早,我想她会开始大部分的“早上好”信息。

当我们回到肯尼亚时,她很少在 WhatsApp 上和我聊天。这意味着我去南非之前(2020 年 2 月 2 日之前)的信息数量肯定会比我在这里时我们互相发送的信息少。

第五步:数据分析

在数据分析中,我们将使用 Pandas 库进行描述性统计,并使用 Matplotlib 中的 Pyplot 模块来可视化我们的分析结果。

让我们开始吧!

活动天数

在我们有数据的 236 天中,有多少天我们实际上交换了 WhatsApp 信息?

输出:

Active days:  222
First Day: 2019-12-18
Last Day:  2020-08-10
Difference of Dates:  236

让我们再来看看代码实际上在做什么

  • 第 1 行:将日期字符串转换成 Python 日期时间对象。
  • 第 3 行和第 4 行:通过简单地计算日期列中唯一值的数量来确定活动天数。
  • 第 6 行到第 10 行:获取聊天历史的第一天和最后一天。对话中包含的消息是从 2019 年 12 月 18 日到 2020 年 8 月 8 日。
  • 第 12–15 行:获取 6–10 中确定的第一个和最后一个日期之间的差值。

从这里可以看到我们在 WhatsApp 上聊过 236 天的 222 天 (94%的时间)。事实上,造成差异的 14 天是选择存在的。我们使用了另一种交流方式(当我回到肯尼亚的时候)。我在南非的时候,我们有 100%活跃的日子。我们马上就会发现。

谁的消息最多?

我想我是留言最多的人,但差别不会很大。让我看看。

输出:

Total Messages:  34491
My Wife, I LOVE YOU ❤   18030
koech christian         16461

哎呀!总共 34491 条信息,其中大部分是她写的。她得听听这个。

第一条和最后一条消息(一天的开始和结束)

正如我所说的,我很确定这一点:她通常会开始这一天,而我通常会结束这一天。那位女士总是在说晚安之前就睡觉,而且总是在早上道歉。

早晚信息(第 1-7 行)

  • 第 2 行:在这一行中,我们按照日期时间对数据帧进行排序,这样我们就可以将第一天的消息放在当天聊天的顶部。我们还删除了重复的消息,这样我们就可以在每天的数据帧中保留最早的消息。最后,我们统计每个发送者的早期消息。
  • 第 3 行:输出(早间消息)
My Wife, I LOVE YOU ❤    157
koech christian           63
  • 第 11 行:输出(当天的最后一条消息)
koech christian          156
My Wife, I LOVE YOU ❤     64

惊人的发现!的确,大多数日子里她写第一条信息,而大多数晚上我写最后一条信息。更令人惊讶的是它们的对称程度。这就好像我们在平等地进行“晨跑”和“夜跑”。

自从我们开始这段关系到现在,我一直不明白为什么她总是不说晚安就睡觉。开始的时候我很不舒服,但是我最终接受了那个层次的她。

一段时间内每天的邮件数量

嗯,对于这一个,我知道期待什么,但我不知道理想的关系应该是怎样的。当关系变得稳固时,发信息的速度是否会下降,或者下降意味着一段失败的关系?我不知道,但对我来说,我认为有一些因素在起作用。首先,我一直致力于减少我的手机瘾。这可能是下降趋势的一个原因。

我也希望当我在家(肯尼亚)的时候会有很少的消息,而在这里(南非)会有更多的消息,因为 WhatsApp 现在是主要的沟通渠道。

让我看看。

看来我的预测是对的。自从我旅行以来,每天的信息数量有所增加,但持续下降。为了真正理解这一点,让我们在上面的图上画一条趋势线,也画一条我出国旅行那天的垂直线。

趋势平滑

有很多方法可以形成平滑的趋势线。这些方法包括重采样和滚动窗口。

重采样

时间序列数据重新采样到更低或更高的频率通常是有用的。重新采样到较低的频率(下采样)通常涉及一个聚合操作——例如,从每日计数中计算每月邮件总数。

重新采样到更高的频率(上采样)不太常见,通常涉及插值或其他数据填充方法,例如,将每日数据插值到每小时间隔中,以输入到模型中。

Pandas resample()方法,该方法将数据索引分成时间仓,并按时间仓对数据进行分组。resample()方法返回一个重采样器对象,类似于熊猫group-by()函数。聚合方法如mean()median()sum()等。,然后可以应用于每个时间仓的数据组。

滚动车窗

滚动窗口操作是时间序列数据的另一个重要转换。类似于下采样,滚动窗口将数据分成时间窗口和,并且每个窗口中的数据用诸如mean()median()sum()等函数聚集。但是,与时间窗不重叠且输出频率低于输入频率的下采样不同,滚动窗口重叠并以与数据相同的频率“滚动”,因此转换后的时间序列与原始时间序列具有相同的频率。

对于我们的数据,我们将使用滚动窗口来拟合趋势线

从上图中,我们可以看到趋势线(窗口大小为 50 天)实际上与我们的预测相匹配。在我旅行之前(洋红色垂直线的左边),我们使用 WhatsApp 的频率比旅行之后(右手边)要少。同样清楚的是,每天的消息数量正在随着时间的推移而下降。

一天中最大和最小的消息数量

最大:一天 461 条消息。日期:2020 年 2 月 13 日

最小:每天 1 条消息。日期:2019 年 12 月 22 日,2020 年 1 月 1 日及其他

实际单词和句子的分析

如果我们了解我们每个人使用的常用单词/表情符号,那将会非常有趣。在本节中,我们正是这样做的。

每位发送者的总字数

在本节中,我们将统计每个发件人的所有消息的所有单词(注意,我们跳过了一些填充词,如下面的行 10 和 16 所示的aand、&、the

输出:

Number of words(Myself): 105612
Number of words(mylove): 113716

又来了!她赢了!。

让我们看一下上面的代码片段,这样你就能理解它是做什么的了。

  • 第 6 行和第 12 行的 If…else…语句用于调节发送器上的过滤器。
  • 第 8 行和第 14 行在理论上做同样的事情。让我们看一个例子。
message = "Okay. Bye for now 💕💕💕💕"word_list = message.strip().lower().translate(str.maketrans('', '', string.punctuation)).split(" ")print(word_list)**Result:** ['okay', 'bye', 'for', 'now', '💕💕💕💕']

在这部分代码中,我们剥离尾部空格的消息,将单词改为小写,将标点符号的消息剥离(注意句号被剥离),最后通过空格分割消息,这样我们就有了一个单词列表。

最常见的单词有哪些?随着时间的推移,有哪些独特的词语被使用?

collections库中的模块让我们的事情变得简单。在第 4 行和第 5 行,我们计算字数。结果是单词计数元组对的列表,例如,

**text** = "dog is a pet, hen is a bird"
**result** = Counter(text.split()).most_common()
**print(result)**
**[('is', 2), ('a', 2), ('dog', 1), ('pet,', 1), ('hen', 1), ('bird', 1)]**

从这里开始,可以通过简单地获得结果列表的长度来确定唯一单词的数量(第 7–9 行)。

第 7–9 行的输出:

Unique words used:
Unique words She used:  8783
Unique words I used:  7281

她又赢了。我不知道这是不是衡量智力的好方法,但我相信她是更聪明的一个。难怪!

接下来,我们想得到最常用的单词

注意,我们已经在两个变量most_common_memost_common_her中有了最常见的单词。在下面的代码片段中,我们将只选择前 10 个。

一旦我们有了最常用单词的列表和计数,我们现在就可以把它们放在一个熊猫的数据框架上,还可以制作一些柱状图来直观显示这些单词,如下所示

结果:

她最常用的词

我常用的词

说实话,数据不会说谎。从她的统计数据来看,我对I, you, mylove名列榜首并不感到惊讶。她经常使用它们,当她写下像“我爱你,我的爱人”这样的信息时,我总是不会感到惊讶,哈哈!。另一方面,我最了解的就是如何笑。难怪😂位居前十。但是相信我,我不会用很多表情符号,我可能只知道两个表情符号:😂和🙈。

事实上,让我们继续分析表情符号的用法。

表情符号爱情

表情符号主要用于表达情感,只是一种增加交流乐趣的方式。让我们深入分析一下

  • Line 1–4:我们正在使用emoji包,借助extract_emojis函数从句子中提取表情符号,例如,
extract_emojis("K😂ip 😆rono🤣   El😂ij😁 😆ah")result: '😂😆🤣😂😁😆'
  • 第 6–24 行:遍历所有消息,并将所有表情提取到发送者列表中。

输出:

Most Common emojis used (Me)
('😂', 1652)
('🙈', 270)
('😍', 85)
('😘', 52)
('😋', 45)
Most Common emojis used (Her)
('😂', 1577)
('♀', 132)
('🤦', 120)
('😘', 81)
('❤️', 67)

情节:

最常用的表情符号

我们是最开心的一家人。我们俩都用😂不过当然我用的最多还是比她多。

时间和活动分析

了解聊天在一段时间内的分布也很有趣。

我们的确主要在周四和周五聊天,但实际上没什么区别。

上图显示了平均一天的聊天分布。在 0000 到 0500 之间的大多数日子里,我们都在睡觉,因此没有太多的活动。聊天量逐渐增加,在 2000 小时到 2100 小时之间达到峰值,然后随着我们继续睡觉,聊天量迅速下降。

我做的最后一项分析是确定我们写过的最长的信息,

再一次,她用她自己最长的包含 166 个单词的信息来引导我,而我只有 62 个单词。

结论

在这篇文章中,我希望你玩得开心,也学到了东西。我们使用 pandas 对数据进行了清理、描述和可视化,通过这样做,你可以做出调整,使你们的关系更好,或者更好地理解字符串操作。

您可以使用自己的 WhatsApp 数据按照相同的步骤复制相同的内容。

一如既往,感谢阅读:-)

数据科学简历中的 7 个必备要素

原文:https://towardsdatascience.com/7-must-haves-in-your-data-science-cv-9316841aeb78?source=collection_archive---------0-----------------------

寻找新角色?一定要检查这些临界点才能脱颖而出,通过简历筛选。

图片由授权(经许可使用)

管理 Riskified 的数据科学部门需要大量招聘——我们在不到一年半的时间里增加了一倍多。作为几个职位的招聘经理,我也看了很多简历。招聘人员用 7.4 秒筛选一份简历,在招聘了几年之后,我的平均时间相当快,但没有那么快。在这篇博客中,我将向你展示我的个人启发法(“作弊”),它可以帮助我筛选简历。虽然我不能保证其他人使用相同的启发式方法,并且不同的角色在每个要点的重要性方面会有所不同,但注意这些要点可以帮助你征服 CV 屏幕阶段。此外,其中一些试探法可能看起来不公平,或者可能会忽略合格的候选人。我同意,没有在简历上投资的有才华的机器学习从业者可能会被这个屏幕拒绝,但考虑到时间,这是最好的权衡。记住,一个非常抢手的职位可能会吸引上百份简历。如果你想要一个高效的流程,简历筛选必须快速。

以下是用于快速筛选你的数据科学简历的 7 种试探法:

1.作为数据科学家的先前经验

我将快速浏览您的简历,看看您以前的职位,看看哪些被标记为“数据科学家”。还有一些其他相邻的术语(取决于我招聘的角色),如“机器学习工程师”、“研究科学家”或“算法工程师”。我没有将“数据分析师”包括在内,因为日常工作通常不同于数据科学家的工作,而且数据分析师的头衔是一个非常宽泛的术语。
如果你在目前的工作岗位上从事数据科学工作,并且你有一些其他创造性的工作描述,那么将你的头衔改为数据科学家可能对你最有利。对于事实上是数据科学家的数据分析师来说,这是千真万确的。请记住,即使简历包含了你所从事项目的描述(其中包括机器学习),除了数据科学家之外的头衔也会增加不必要的模糊性。
此外,如果你参加过数据科学训练营或该领域的全日制硕士课程,这可能会被视为你数据科学经历的开始(除非你之前从事过类似的工作,这将保证在稍后阶段提出问题)。

2.面向业务的成就

理想情况下,我想看看你做了什么(技术方面)和业务成果是什么。缺乏精通技术、能够用商业术语交流的数据科学家。如果你能分享你的工作所影响的业务 KPI,在我看来这是一个很好的建议。例如,表明您的模型在 AUC 方面的改进是没问题的,但解决由于您的模型改进而导致的转化率增加意味着您“明白了”——业务影响才是最终真正重要的。比较以下描述相同工作但侧重点不同(技术与业务)的选项:

a.银行贷款违约率模型——将模型的精确召回 AUC 从 0.94 提高到 0.96。

b.银行贷款违约率模型—将业务部门的年收入提高了 3%(每年 50 万美元),同时保持不变的违约率。

3.教育

你的正规教育是什么,在什么领域。是知名机构吗?对于更多的应届毕业生,我也会看看他们的平均绩点,以及他们是否获得过任何优秀奖或荣誉,比如上了校长或院长的名单。由于数据科学是一个完全开放的领域,没有任何标准化的测试或所需的知识,人们可以通过各种方法进入该领域。在我的上一篇博客中,我写了进入这个领域的 3 条主要途径,基于你的教育和时机,我会找出你可能选择了哪一条。因此,时机有助于理解您的故事,即您是如何以及何时过渡到数据科学的。如果你没有接受过任何数据科学方面的正规教育,那很好,但你需要证明你在该领域的工作记录和/或类似领域的高等学位。

4.布局/视觉吸引力

我见过一些漂亮的简历(我保存了一些作为个人灵感),但我也收到过文本文件(。txt ),缺少任何格式。写简历可能是一件痛苦的事,如果你选择了数据科学作为你的努力方向,那么你很可能不喜欢在业余时间创造美学设计。在不走极端的情况下,您确实希望寻找一个好的模板,使您能够在有限的空间内完成所有工作。明智地使用空间——将页面分开,突出不属于按时间顺序排列的工作/教育经历的特定部分是很有用的。这可以包括你熟悉的技术栈,一个自我项目列表,到你的 github 或博客的链接等等。一些简单的图标也有助于强调章节标题。
许多候选人在他们熟悉的每种语言/工具旁边使用 1-5 颗星或条形图。就我个人而言,我不太喜欢这种方法,原因有几个:

  • 这非常主观——你的“5 星”和别人的“2 星”是一样的吗?
  • 他们把语言和工具混在一起,在最糟糕的情况下,还把软技能混在一起——说你在领导力方面的“4.5 星”没有帮助。作为一个对成长心态深信不疑的人,声称最大限度地发挥一项技能(尤其是一项更难量化、更难掌握的软技能)感觉非常放肆。

我还看到这种方法被进一步滥用,采取主观的方法,并把它们变成一个饼图(30% python,10%团队成员,等等)。虽然这可能被认为是一种脱颖而出的创造性方式,但它表明了对不同图表概念背后的基本理解的缺乏。

这里有两个我觉得视觉上很吸引人的简历例子,为了匿名细节被模糊了。

信用伊娃米舍(经许可使用)

视觉上吸引人的数据科学家简历,细节模糊。请注意两个例子中使用的垂直分割来区分经验、技能、成就和出版物。在这两种情况下,简短的总结段落有助于描述他们的背景和愿望。经所有者许可使用。

5.机器学习种类

我寻找两种类型的变化:

  1. 算法类型—结构化/经典 ML vs 深度学习。一些候选人只从事深度学习,包括可能更适合基于树的模型的结构化数据。虽然成为 DL 专家本身没有问题,但是限制您的工具集会限制您的解决方案。正如马斯洛所说:“如果你拥有的唯一工具是一把锤子,你往往会把每个问题都视为钉子。”在 Riskified ,我们处理结构化的、领域驱动的、特征工程化的数据,这些数据最好用各种形式的提升树来处理。拥有一个整个简历都指向 DL 的人是一个问题。
  2. ML 领域——这通常与两个需要大量专业知识的领域相关——计算机视觉和 NLP。这些领域的专家很受欢迎,在许多情况下,他们的整个职业生涯都将专注于这些领域。如果你正在寻找从事该领域工作的人,这一点至关重要,但通常来说,这不适合从事更一般的数据科学工作的人。因此,如果你的大部分经验是在 NLP 领域,而你申请的是该领域之外的职位,试着强调你在结构化数据领域工作过的职位/项目,以展示多样性。

6.技术堆栈

这通常可以分为语言、特定的包(scikit learn、pandas、dplyr 等)、云和它们的服务(AWS、Azure、GCP)或其他工具。一些候选人将这与他们熟悉的算法或架构混为一谈(RNN,XGBoost,K-NN)。就个人而言,我更喜欢围绕技术和工具;当提到一个特定的算法时,我不禁想知道候选人的理论上的 ML 知识是否仅限于这些特定的算法。在这里,我在寻找技术组合的相关性——它们是否来自过去几年(这是一个积极的迹象,表明候选人正在实践和学习新技能),组合的广度(它们是否非常局限于特定的工具,或者它们是否熟悉相当多的东西)以及与我们的组合的契合度(我们需要教它们多少)。

7.项目

你有什么工作可以在 GitHub 上分享的吗?任何 Kaggle 竞赛或附带项目都非常有帮助,可以查看简明代码、预处理类型、功能工程、EDA、算法选择以及现实项目中需要解决的无数其他问题。给你的 GitHub 和 Kaggle 账户添加一个链接,让面试官深入了解你的代码。如果你没有太多的经验,很有可能你会被问到这些项目中的一个或多个。在我参加的一些面试中,候选人不太记得这个项目,我们无法就他们做出的选择及其背后的原因展开对话。一定要重温你做过的工作,或者把它从简历中去掉。同样,确保你展示了你最好的作品,并且你投入了足够的时间和精力。最好有 2-3 个高质量的项目,而不是 8-10 个中等(或较低)质量的项目。

摘要

如果你正在寻找一个新的数据科学职位,请花些时间浏览一下本文中的要点。如果你不能检查所有这些标记,这没关系,但是你能检查的越多越好。希望这些建议能帮助你脱颖而出,顺利通过简历筛选。

祝你好运,找工作愉快!

在筛选数据科学简历时,你有不同的方法吗?
请在下方评论区分享!

让我的代码更好更聪明的 7 个小技巧

原文:https://towardsdatascience.com/7-numpy-tricks-to-make-my-code-better-and-smarter-9e8a4ccf43d1?source=collection_archive---------25-----------------------

我希望我早点知道的技巧

由 Max Duzij 在 Unsplash 上拍摄的照片

Numpy 是 Python 中最重要和最流行的数值计算库之一。它被广泛应用于数据科学和机器学习,许多库都是基于它建立的。我希望在这篇文章中分享 7 个数字游戏技巧,我希望我作为一个初学者能早点知道。

1.numpy.linspace()

np.linespace(start, stop, num)返回一个数组,数组中的数字从stratstop均匀分布

例如:

画数学函数很方便:

numpy.arange()

np.arange(start, stop, step)提供了类似的功能,它创建了一个从开始到停止的一步数组。

例如:

2.numpy.random

我们经常需要生成随机数来进行统计计算。Numpy 提供了一些函数来生成随机数。

np.random.randint()

randint(low, high, size)生成一个范围(低—高)内的随机整数数组(size=size)。

np.random.rand()

rand()生成在给定形状下均匀分布在 0 到 1 之间的随机数。

随机的

randn()生成正态分布的随机数。

np .随机数.选择()

random.choice()允许我们从给定的数组中随机选择样本。传递一个概率也是可以的。

3.numpy.argmax()

np.argmax()返回沿轴最大值的索引。

在对象分类和检测中,找到具有最高概率的对象是有用的。

还有类似argmin()argwhere()argpartition()的功能

4.numpy.setdiff1d()

np.setdiff1d()返回一个数组中不在另一个数组中的值。

例如,我们有两个数组:

如果我们想找到a中没有出现在b中的值(答案应该是[1,2,3]),我们可以使用setdiff1d():

我们也可以反过来做,在 b 中寻找 a 中没有的值:

numpy.intersect1d()

一个类似的函数是intersect1d(),它返回 2 个数组的交集,在本例中是[4,5,6]。

5.numpy 在哪

np.where(condition,x,y)根据条件返回从 xy 中选择的元素。

例如,我们有一个包含考试分数的数组:

我们想用‘pass’或‘not _ pass’代替分数。条件可以设置为scores>60:

如果 x 和 y 没有传递给np.where,将返回满足条件的元素的索引位置。

6.重塑()

有时我们需要重塑数组,我们可以使用resphape()的方法。

例如,我们有一个一维数组:

我们可以将其改造成 2×5 阵列:

我们可以使用-1,numpy 为您计算尺寸。

展平()

如果你想把一个多维数组重塑成 1D 数组,你可以使用flatten()

堆栈()

您也可以使用np.stack()将多个数组堆叠在一个数组中。

例如:

您可以在其他轴中执行此操作,

您也可以使用hstack()来水平堆叠数组:

7.numpy.clip()

如果您有一个包含一些数字和一个范围的数组,您可以使用clip()将数字限制在该范围内。对于超出范围的数字,它返回边缘值。

例如:

它将数组裁剪在 3 到 5 之间。

就是这样。这些 Numpy 技巧使我的代码变得更加简单和高效。我希望这些也能帮助你

我也写过关于 Python 和熊猫的文章。有兴趣可以看看。

[## 让我的代码更好更聪明的 7 个 Python 技巧。

我希望我能早点知道的技巧。

towardsdatascience.com](/7-python-tricks-to-make-my-code-better-and-smarter-60dfde0b6c49) [## 让我的数据分析过程更高效的 10 个熊猫窍门:第 1 部分

我希望我早点知道的技巧

towardsdatascience.com](/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-1-78a0cc1636f3) [## 让我的数据分析过程更高效的 10 个熊猫窍门:第二部分

我希望我早点知道的技巧

towardsdatascience.com](/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-2-b72ea43a0bb5)

感谢阅读,编码快乐。

7 处理不平衡数据的过采样技术

原文:https://towardsdatascience.com/7-over-sampling-techniques-to-handle-imbalanced-data-ec51c8db349f?source=collection_archive---------8-----------------------

各种过采样技术的深度分析

图片由 LTD EHU 发自 Pixabay

M 对不平衡数据建模是我们在训练模型时面临的主要挑战。为了处理分类问题,目标类别标签的类别平衡在建模中起着重要的作用。对于不平衡类问题,即数据集中存在少数类,模型会尝试只学习多数类,从而导致有偏差的预测。

不平衡的阶级问题的一些著名例子是:

  1. 信用卡欺诈检测
  2. 疾病诊断
  3. 垃圾邮件检测等等

在训练模型之前,需要处理数据集的不平衡。有各种技术来处理类平衡,其中一些是过采样,欠采样,或两者的结合。本文将深入解释 7 种过采样技术:

  1. 随机过采样
  2. 重击
  3. 临界击打
  4. 克平均击打
  5. SVM 击杀
  6. 阿达辛
  7. Smote-NC

对于不同过采样模型的评估,我们使用来自 Kaggle 的流失建模数据集。

不使用任何过采样或欠采样技术的逻辑回归模型的性能。

1.随机过采样:

随机过采样是平衡数据集不平衡性质的最简单的过采样技术。它通过复制少数类样本来平衡数据。这不会导致任何信息丢失,但是当复制相同的信息时,数据集容易过拟合。

(图片由作者提供),左:随机过采样后的散点图,右:随机过采样后模型的性能

2.击打:

在随机过采样的情况下,当少数类样本被复制时,容易出现过拟合,这里 SMOTE 出现了。SMOTE 代表合成少数过采样技术。它创建新的合成样本来平衡数据集。

SMOTE 通过利用k-最近邻算法来创建合成数据。使用 Smote 创建步骤示例:

  • 识别特征向量及其最近邻
  • 计算两个样本点之间的距离
  • 用 0 到 1 之间的随机数乘以距离。
  • 在计算出的距离处识别线段上的新点。
  • 对识别的特征向量重复该过程。

(图片由作者提供),左:SMOTE 后散点图,右:SMOTE 后模型表现

3.临界击打:

由于多数类点区域内存在一些少数类点或异常值,因此会创建少数类点的桥。这是 Smote 中的一个问题,使用边界 Smote 可以解决这个问题。

在边界线 Smote 技术中,只有边界线附近的少数样本被过采样。它将少数类点分类成噪声点、边界点。噪声点是少数类点,其大多数点都是其邻居中的多数点,而边界点在其邻居中既有多数类点也有少数类点。边界线 Smote 算法试图仅使用这些边界点来创建合成点,并忽略噪声点。

(图片由作者提供),左:边界平滑后散点图,右:边界平滑后模型性能

4.KMeans 击打:

K-Means SMOTE 是一种用于类不平衡数据的过采样方法。它通过在输入空间的安全和关键区域生成少数类样本来帮助分类。该方法避免了噪声的产生,并且有效地克服了类之间和类内的不平衡。

K-Means SMOTE 分五步工作:

  1. 使用 k-means 聚类算法对整个数据进行聚类。
  2. 选择具有大量少数类样本的聚类
  3. 将更多合成样本分配给少数类样本分布稀疏的聚类。

这里,使用 SMOTE 对每个滤波后的聚类进行过采样。

(图片由作者提供),左:k means 击打后散点图,右:k means 击打后模型性能

5.SVM 击打:

边界重击的另一个变体是边界重击 SVM,或者我们可以称之为 SVM 重击。这种技术结合了 SVM 算法来识别错误分类点。

在 SVM-SMOTE 中,在原始训练集上训练支持向量机分类器后,边界区域由支持向量近似。然后,沿着将每个少数类支持向量与其多个最近邻居连接起来的线,随机创建合成数据。

(图片由作者提供),左:SVM 击杀后散点图,右:SVM 击杀后模型表现

6.自适应合成采样— ADASYN:

边界线 Smote 更重要,或者仅使用作为边界点的极端观测值创建合成点,而忽略其余的少数类点。ADASYN 算法解决了这个问题,因为它根据数据密度创建合成数据。

合成数据的生成与少数群体的密度成反比。与较高密度的区域相比,在低密度的少数民族类区域中创建了相对较大数量的合成数据。

换句话说,在少数类的不太密集的区域,合成数据被创建得更多。

(图片由作者提供),左:ADASYN 后散点图,右:ADASYN 后模型表现

7.Smote-NC:

Smote 过采样技术仅适用于具有所有连续特征的数据集。对于具有分类特征的数据集,我们有一个 Smote 的变体,它是 Smote-NC(名义的和连续的)。

Smote 也可以通过一键编码用于具有分类特征的数据,但它可能会导致维数增加。标签编码也可以用于将分类转换为数字,但是 smote 之后可能会产生不必要的信息。这就是为什么当我们有混合数据的情况下,我们需要使用 SMOTE-NC。Smote-NC 可以通过表示分类特征来使用,Smote 会对分类数据进行重新采样,而不是创建合成数据。

(图片由作者提供),左:SMOTE-NC 前车型性能,右:SMOTE-NC 后车型性能

实施:

(作者的代码实现)

结论:

对不平衡数据集建模是我们在训练模型时面临的主要挑战,使用上面讨论的各种过采样技术可以提高模型的性能。在本文中,我们还讨论了 SMOTE-NC,它是 SMOTE 的一个变体,可以处理分类特征。

通过使用各种欠采样技术,例如随机欠采样、TomekLinks 等,以及过采样和欠采样技术的组合,例如 SMOTEENN、SMOTETomek 等,也可以提高不平衡数据集的模型性能。

参考资料:

[1] Imblearn 文档:https://unbalanced-learn . readthedocs . io/en/stable/API . html # module-imb learn . over _ sampling

[2]https://pypi.org/project/kmeans-smote/

感谢您的阅读

我最常用的 7 个熊猫功能

原文:https://towardsdatascience.com/7-pandas-functions-that-i-use-the-most-b83ddbaf53bf?source=collection_archive---------18-----------------------

数据分析过程中最常用的函数。

Icons8 团队在 Unsplash 上的照片

Pandas 是一个著名的数据分析和操作库。它提供了许多加快数据分析和探索过程的功能和方法。

在丰富的函数和方法选择中,有些是更常用的。它们提供了一种快速获得手头数据的基本理解的方法。

在这篇文章中,我将介绍我在数据分析项目中最常用的 7 个 pandas 函数。

我将使用 Kaggle 上的糖尿病数据集。让我们首先将数据集读入熊猫数据帧。

import pandas as pd
import numpy as npdiabetes = pd.read_csv("/content/diabetes.csv")

1。头尾

一旦我们将一个数据集读入 pandas 数据帧,我们就想看一看它以获得一个概览。最简单的方法是显示一些行。Head 和 tail 允许我们分别从数据帧的顶部和底部显示行。

diabetes.head()

diabetes.tail()

默认显示 5 行,但是我们可以通过传递我们想要显示的行数来调整它。例如,diabetes.head(10)将显示前 10 行。

2。努尼克

处理具有离散值的分类数据或要素时,了解唯一值的数量非常重要。这是数据探索的重要一步。

一种方法是使用 value_counts 函数,该函数返回一个 pandas 系列,其中包含一列中的唯一值以及每个值出现的次数。这个序列的长度是唯一值的个数。

len(diabetes.Pregnancies.value_counts())
17

我发现 nunique 更容易使用:

diabetes.Pregnancies.nunique()
17

我们还可以将其应用于整个数据帧,并查看每列中唯一值的数量,我认为这使 nunique 更具功能性:

diabetes.nunique()

3。描述

Describe 函数通过提供基本统计数据(如平均值、中值和标准偏差)来快速概述数字列。

diabetes.describe()

25%、50%和 75%是百分位数。50%也称为中值,是所有值排序时位于中间的值。25%是第一个四分位数因此 25%的值低于该点。你可以把它想象成一个列的下半部分的中值。同样,75%是第三个四分位数

基本的统计数据给了我们宝贵的见解。例如,通过比较平均值和中间值(50%),我们可以了解异常值。如果平均值远高于中值,则在上端有异常值。基本统计数据也给我们提供了数据分布的概况。

您也可以使用百分点参数选择不同的百分点进行显示。默认值为[.25、. 50、. 75]。例如,除默认值外,百分点=[.1,. 25,. 5,. 75,.. 9]将显示 10%和 90%的百分点。

4。Isna

处理缺失值是构建稳健数据分析流程的关键步骤。缺少的值应该是最优先考虑的,因为它们对任何分析的准确性都有重大影响。

Isna 函数返回用布尔值填充的数据帧,true 表示缺少值。

diabetes.describe()

除非您想要逐个单元地分析数据帧,否则 isna 应该与聚合结合使用。isna()。any()指示列中是否有任何缺少的值,而 isna()。sum()返回列中缺失值的数量。

diabetes.isna().any()

diabetes.isna().sum()

我们拥有的数据集没有任何缺失值,但这种情况在现实生活中不太可能发生。

5。分组依据

Pandas groupby 函数是探索数据的绝佳工具。它更容易揭示变量之间的潜在关系。下图概述了 groupby 函数的功能。

熊猫分组(图片由作者提供)

假设我们有两个特征。一个是颜色,它是分类特征,另一个是数值特征,即值。我们希望按照颜色对值进行分组,并计算不同颜色值的平均值(或任何其他集合)。然后最后根据平均值对颜色进行排序

当然,您可以创建更复杂的分组操作,但概念是相同的。

让我们用数据集创建一个简单的分组操作。下面的代码将向我们展示糖尿病阳性和阴性人群的平均葡萄糖值。

diabetes[['Outcome','Glucose']].groupby('Outcome').mean()

正如所料,糖尿病阳性患者的血糖值较高(1)。

我们在数据集中没有很多分类变量,所以我们可以在这个数据集上用 groupby 函数做的事情是有限的。然而,如果你想阅读更多关于 groupby 函数的内容,并看到更复杂的例子,我有一个帖子专门讨论熊猫 groupby 函数。

[## 熊猫分组——解释

如何高效利用熊猫的分组功能

towardsdatascience.com](/pandas-groupby-explained-453692519d0)

6。数据类型和数据类型

我们需要将值存储在适当的数据类型中。否则,我们可能会遇到错误。对于大型数据集,正确的数据类型选择会极大地影响内存使用。例如,对于分类数据来说,“分类”数据类型比“对象”数据类型更合适,尤其是当类别的数量远小于行数时。

Dtypes 显示每一列的数据类型。

diabetes.dtypes

“血压”列的数据类型不合适。应该是 int 或者 float。对象数据类型可以是存储字符串或分类数据。

我们可以很容易地用 astype 函数改变数据类型。

diabetes.BloodPressure = diabetes.BloodPressure.astype('int64')diabetes.dtypes

7。形状和尺寸

Shape 可以用在 numpy 数组、pandas 系列和 dataframes 上。它显示维度的数量以及每个维度的大小。

因为数据帧是二维的,所以 shape 返回的是行数和列数。它衡量我们拥有多少数据,是数据分析过程的关键输入。

此外,在设计和实现机器学习模型时,行和列的比率非常重要。如果我们没有足够的关于特征(列)的观察值(行),我们可能需要应用一些预处理技术,如降维或特征提取。

diabetes.shape
(768, 9)

让我们把它用在一个实际上是熊猫系列的专栏上。

diabetes.Glucose.shape
(768,)

顾名思义,Size 返回数据帧的大小,即行数乘以列数。

diabetes.size
6912

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

7 个熊猫功能将减轻您的数据操作压力

原文:https://towardsdatascience.com/7-pandas-functions-to-reduce-your-data-manipulation-stress-25981e44cc7d?source=collection_archive---------9-----------------------

左图和来自 Pixabay 的代码图。来自 Unsplash 的熊猫图像。

熊猫没有白毛是有原因的

熊猫为什么没有灰毛?显然,因为它们有如此多的智能功能来操纵数据,所以它们不会像人类那样过度紧张。

数据似乎永远不会以我们希望的形式出现。以我个人的经验,花在数据科学项目上的绝大部分时间只是花在操纵数据上。当我们想对数据做些什么,但我们不知道一个方便的熊猫函数来做时,是时候使用旧的for循环和.loc手动改变单元格了,由if语句指导。

在本文中,我将展示和解释 7 个 pandas 函数,当它们单独使用或一起使用时,有望为您节省大量数据操作压力。

为了演示,我们将主要对纽约市 Airbnb 开放数据进行操作,该数据混合了数据类型,包括数字、文本和日期。

数据的前几列。

1 | pandas.factorize(x)

当我们需要对一些东西进行标签编码时,通常你会使用sci-kit learnLabelEncoder,但是熊猫可以在没有任何进口的情况下这样做。最重要的是,访问什么标签对应什么需要从sklearn中的LabelEncoder对象调用函数,但是默认情况下包含在pandas中。

假设我们想要对数据中的neighbourhood列进行标签编码。

pd.factorize(data['neighbourhood'])

生产

元组的第一个元素是一个数组,包含序列的标签编码值。元组的第二个元素是索引/列表,其中每个元素的索引对应于第一个元素中的标签。例如,第一个标签编码值是 0。这意味着它的反向编码值是第二个 tuple 元素的第 0 个索引,也就是 Kensington(可以向上滚动来确认这一点)。

2 | pandas.get_dummies(x)

有时,标签编码不起作用,因为它将数字属性分配给本来就不是数字的对象,例如“哈莱姆是肯辛顿的两倍”或“肯辛顿加三是布鲁克林”。在这种情况下,首选一位热编码,它没有数字偏差,表示相同的数据(尽管以非常稀疏的方式)。

传统的方法是使用sklearnOneHotEncoder,这需要导入sklearn,并训练一个OneHotEncoder对象。

假设我们想对数据集中的同一个neighborhood 列进行一次性编码。

pd.get_dummies(data['neighbourhood'])

它甚至按字母顺序排列我们的栏目!

3 | pandas.qcut(x,分位数)

通常,对于回归任务(例如,在本例中预测 Airbnb 房源的价格),将价格范围离散为几个分位数(大小相等的桶)可能会有所帮助。在分位数可接受的情况下,这可以提高精确度并减少模型的不确定性。

将变量离散化为分位数。原象

熊猫可以用.qcut自动为你离散化变量。

假设我们想要将price变量离散化为四个分位数。pandas 会自动将价格区间分成你指定的任意数量的分位数。请注意,pandas 将价格范围分成几个桶,每个桶中有相同数量的商品。

pd.qcut(data['price'],4) #second number specifies num of quantiles

生产

这是一系列的区间对象。在每个间隔中有偶数个对象。看着系列中的第一个物体,

pd.qcut(data['price'],4)[0]

…它是一个区间对象。您可以通过应用str()将其转换成可读性更好的形式。

str(pd.qcut(data['price'],4)[0])

您可以使用.apply()将该功能应用于整个系列。然后,如果你喜欢,你可以使用。因式分解对离散化样本进行标签编码。使用这个函数和前面的.factorize函数的一个好处是,与某些情况不同,标签编码(而不是之后使用.get_dummies的一次性编码)本身是可以的。

一键编码背后的原因是标签编码指定标签之间的数字关系,例如说肯辛顿比哈莱姆小,而对象不能进行数字比较。然而,离散样本可以,因为他们是从一个数字,连续线。

请注意,如果您不希望分位数被分割成每个箱中有相等数量的数据点,而是将范围定量地分成相等的部分,请使用pandas.cut。它与pandas.qcut接受相同的参数并起相同的作用。

pd.cut(data['price'],4)

4 | pandas.to_datetime(x)

转换数据对象是数据清理和数据操作中最令人沮丧的方面之一,其中最令人沮丧的可能就是日期。它们以如此多的形式出现,以如此多的方式编写,以至于将它们全部转换成一个干净的 datetime 对象是一件麻烦的事情。

输入熊猫的to_datetime。这个函数可以合理地推断任何日期,并将其转换为 datetime 对象,而不需要导入 datetime 或任何其他模块!

让我们用不同的命名协议创建四列:

data['date1'] = '1,2,2019'
data['date2'] = '1/2/2019'
data['date3'] = '1-2-2019'
data['date4'] = '1.2.2019'

…然后应用to_datetime看看熊猫是怎么转换的。

熊猫自动为你转换一切!如果日期的排列有点不同,熊猫也可以接受描述月、日和年的排列的字符串。

5 |熊猫。数据框架

矩阵的转置功能是当 xy 轴相互交换时,因此矩阵反映在对角线上。

来源。图像免费分发和商业使用。

这对数据帧也很有帮助。例如,看看这个按日期排列的每个国家因冠状病毒死亡的时间序列数据。

只选择美国来绘制数据,并删除国家、省、纬度和经度等列,我们得到了一个奇怪的数据形状。

us = data[data['Country/Region'] == 'US']
us.drop(['Province/State','Country/Region','Lat','Long'],axis=1,inplace=True)
us

处理这个问题的简单方法是将每个列值复制到一个 numpy 数组中进行可视化。然而,有了移调功能,就简单了。

us = us.T
us

从这里绘图很容易。

us.plot()

那省了我们很多工作!

6 |熊猫。DataFrame.drop_duplicates()

数据中的一个大问题是重复数据。在从多个来源收集的数据中,重复数据通常会出现,从而导致重复行。太多重复的行会使分析或机器学习模型产生偏差,因此删除它们非常重要。

熊猫有一个默认的删除重复的功能,drop_duplicates()

让我们设置第一行等于第二行,然后删除任何重复的。

data.loc[1] = data.loc[0]
data.drop_duplicates()

向右多列。

第一排没了。出于演示的目的,我们保留了索引以演示第一行中的分隔符(第一个索引,第二个“行”,如果您想这样引用它的话)。然而,.drop_duplicates()接受了一个额外的可选参数ignore_index,如果设置为 True,将创建一个不会被删除中断的连续索引。

7 |熊猫。Series.clip()

离群值。他们搞砸了分析,丢弃了数据。为了处理异常值,pandas 有一个方便的函数。clip(),不仅要删除异常值,还要删除数据中的潜在错误(比如我最近在一个数据集中看到的,冠状病毒病例数量为负数)。

.clip()接受两个参数——一个上限和一个下限——并将上限以上的任何值赋给上限,下限以下的任何值赋给下限。

例如,假设 Airbnb 有一个规则,人们可以列出他们的财产的最高价格是 125 美元,最低价格是 100 美元,超出这些界限的任何东西都是错误的(夸大的假设)。

供参考,原始价格:

让我们将 price 列设置为其自身的一个裁剪版本,其下限和上限是我们从真实世界上下文中理解的。

data['price'] = data['price'].clip(100,125)
data.head()

所有高于 125 美元的价格都被设置为 125 美元,任何低于 100 美元的价格都被设置为该值。.clip()应始终与上下文知识一起应用,以确保没有错误,或/和与统计异常值界限一起使用。

感谢阅读!

我希望这七个功能能够让你的数据操作、清理和分析更加顺畅。

更有效地使用 Matplotlib 的 7 个要点

原文:https://towardsdatascience.com/7-points-to-use-matplotlib-more-efficiently-53a1b318b8b1?source=collection_archive---------41-----------------------

理解结构,美化你的情节

卢卡斯·本杰明在 Unsplash 上的照片

Matplotlib 是一个广泛使用的 Python 数据可视化库。在某些情况下,它的语法可能很乏味,但它提供了对情节的大量控制。

在这篇文章中解释的七点都与 matplotlib 的结构和对绘图做小调整的语法有关。

重要的是要很好地了解结构,以便我们理解如何创建和渲染复杂的情节。因此,我们将从结构概述开始。然后,我们会看到几个有助于创造高级剧情的招数。

1。脚本层

Matplotlib 由三层组成。

(图片由作者提供)

脚本层是 matplotlib.pyplot 接口。当我们在下面的命令后使用“plt”创建图时,脚本层就是我们所使用的。

import matplotlib.pyplot as plt

脚本层使得创建情节相对容易,因为它自动化了将所有东西放在一起的过程。因此,它是数据科学家使用最广泛的图层。

2.后端层

除非你是开发人员,否则不要太担心这一层。后端层由三个抽象类组成,分别是 FigureCanvas、Renderer 和 Event。下面的类比将为后端层如何工作提供一些见解。

假设你想画一幅画。你得到一张白纸(图画布)和一个画笔(渲染器)。你问你朋友画什么(事件)。

3.艺术家层

这一层由艺术家对象组成。它是 Matplotlib 的核心对象。我们在图上看到的一切都是 artist 对象的一个实例。

有两种类型的艺术家对象:

  • 复合:图形,轴
  • 图元:直线、圆、文本

4.图形和轴

人物是艺术家的主要对象,它将一切联系在一起。假设你为晚餐准备了 4 种不同的开胃菜。你不能用手端给他们。上菜的好方法是把它们放在盘子里。盘子是图形对象,开胃菜是绘图的组成部分,如线条、刻度、标签等。

让我们使用脚本层创建一个图形。

import matplotlib.pyplot as pltplt.figure()
<Figure size 432x288 with 0 Axes>

我们创建了一个图形,但上面没有任何内容可以构成一个情节。我们需要向 Figure 添加一个 Axes 对象来创建一个实际的绘图。

plt.figure(figsize=(8,5)).add_subplot()

(图片由作者提供)

因为没有数据,所以还是一个空图。绘图功能可用于将数据传递给轴。

arr = np.random.random(100)
plt.figure(figsize=(8,5)).add_subplot().plot(arr)

(图片由作者提供)

我们已经看到了 Matplotlib 结构的概述。下一个技巧将是关于如何在图上做小的调整。

5。Xticks 和 Yticks

这些功能用于调整 x 轴和 y 轴上的刻度标签和位置。默认设置通常是合适的,但在某些情况下可能需要进行细微的调整。

下面是 xticks 和 yticks 用于修改绘图的示例。

plt.figure(figsize=(10,6))
plt.bar(x=[1,2,3,4], height=[3,5,1,6])plt.xticks(ticks=[1,2,3,4],
labels=['Sunday','Monday','Tuesday','Wednesday'], rotation="45", fontsize=12)plt.yticks(ticks=np.arange(10), fontsize=12)

(图片由作者提供)

旋转参数旋转标注,这在长标注的情况下非常有用。它们甚至可能重叠,这绝对不是所希望的。

如果我们不调整,y 轴上的范围将是 0-6。我认为如果顶部有一个空间会更好看。我有时会利用这个空间添加文本或注释。

6。添加文本

文字可以用来指出某事或给情节增加额外的信息。text 函数提供了一种灵活的方式,可以调整文本的位置、字体大小和样式。我们甚至可以把文本放在一个盒子里。

以下代码将在前面的绘图中添加一个文本框。

plt.text(1, 8, '2020 Averages', style='oblique', fontsize=15,
bbox={'facecolor': 'grey', 'alpha': 0.5, 'pad': 5})

(图片由作者提供)

文本功能可应用于 pyplot (plt)界面或 Axes 对象。

7。创建一个有支线剧情的人物

在某些情况下,我们需要在同一个图形上有多个图。Matplotlib 提供了不同的方法来生成这样的图。subplots 函数创建一个具有一组 subplots 的图形。

我们指定行数和列数,然后创建一个绘图网格。支线剧情的数量是行数和列数的乘积。

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2,
                               sharey=True, figsize=(8,5))ax1.plot(np.random.random(30))
ax2.plot(np.random.random(30)*5)

(图片由作者提供)

因为每个子情节都被分配给一个 axes 对象,所以我们可以完全控制它们。下面的代码将分别编辑 ax1 和 ax2。

ax1.set_title("Measurement1", fontsize=14)
ax1.text(1,4, "Before Noon", fontsize=12)ax2.set_title("Measurement2", fontsize=14)

(图片由作者提供)

注:除非另有说明,所有图片均由作者创作。

结论

我们在这篇文章中介绍的只是 Matplotlib 功能的一小部分。我分享的一些信息可以被认为是细节,而其中一些是非常基本的。然而,它们都有助于充分利用 Matplotlib。

和其他学科一样,掌握 Matplotlib 的最好方法是实践。一旦您熟悉了基本功能,就可以继续使用更高级的功能。

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

你(可能)不知道的 7 个 Python 迭代器

原文:https://towardsdatascience.com/7-python-iterators-you-maybe-didnt-know-about-a8f4c9aea981?source=collection_archive---------33-----------------------

以及为什么你应该关心

安德鲁·西曼在 Unsplash 上拍摄的照片

如果你曾经用 Python 编程过,你可能知道迭代器。这些对象包含可计数数量的值。列表、元组、字典和集合都是可迭代的,这意味着你可以对它们调用函数 iter() 来创建遍历它们的值的迭代器。使用函数 next() 遍历迭代器。For 循环即时从可迭代对象实例化迭代器。

除了 Python 结构上的标准迭代器,Python 标准库中还有更高级的迭代器。它们都位于 itertools 模块中。这里我解释 10 个最有趣的。

数数

简单来说, count()range() 类似,但是无穷无尽。它采用一个开始和一个可选的步长参数,并在此之后输出无穷多个值。如果您想要迭代某些值,直到满足特定条件,这是很有用的。与 map 结合使用时,它可以这样使用:

import itertoolsdef sqr(n):
   return n*nfor i in map(sqr, itertools.count(10)):
   if i > 1000:
      break
   print(i)

这段代码输出 i < 1000.

cycle

As the name implies, cycle(p) 循环的所有值,循环次数不限。这个迭代器有用的一个例子是以循环顺序给列表元素分配标签:

import itertoolsa = ‘ABCDEFGH’
print(list(zip(a, itertools.cycle(range(2)))))

在这种情况下,输出将具有值[('A ',0),(' B ',1),(' C ',0),…]。

链条

将多个可重复项链接在一起。像这样使用它:

import itertoolsa = ‘ABCD’
b = ‘EFGH’
print(list(itertools.chain(a,b)))

输出将是“ABCDEFGH”。

星图

该函数采用另一个函数和一个 iterable 作为参数,如下所示:

itertools.starmap(function, iterable)

starmapmap 非常相似,除了它也允许输入函数采用多个参数,这些参数已经分组在 iterable 的元组中,如下所示:

import itertoolsdef compute_sqr_sum(x, y):
   return x**2 + y**2a = [(x,x+1) for x in range(4)]
print(list(itertools.starmap(compute_sqr_sum, a)))

在这种情况下,输出是[1,5,13,25]。

产品

生成参数中可迭代项的笛卡尔乘积。它相当于多个嵌套循环。当你需要计算所有项目组合时,你可以使用它。可选的 repeat 参数允许你计算一个 iterable 与其自身的笛卡尔积。例如,您可能会这样写:

import itertoolsa = [1, 2, 3]
print(list(itertools.product(a,repeat=2)))

输出为[(1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3)、(3,1)、(3,2)、(3,3)]。

伊斯利斯

从 iterable 中返回特定的切片。这和常规的切片()很像。然而,slice()创建了使用它的字符串、列表或元组的副本。

相比之下, islice(iterable,start,stop,[step]) ,除了 iterable 之外,几乎具有完全相同的语法,它返回 iterable,因此速度更快,因为元素是动态生成的。

因此,如果内存效率起作用的话, islice 是首选方法。 islice 的一个警告是它不能使用负索引(因为它总是从开始迭代 iterable,而 iterable 甚至可能不是有限长度的)。如何使用的例子是 ice :

import itertoolsgen = itertools.count()
print(list(itertools.islice(gen, 2, 5)))

输出将是[2,3,4]。

积聚

这个函数在很多函数式编程语言中也被称为 fold 。它允许您迭代地将一个特定的二元函数应用于一个列表的元素,并将集合放入一个新的列表中。accumulate 的默认函数是运算符 add,用于将 iterable 中的项相加,例如[1,2,3,4]->[1,2,6,10]。此时,我将向您展示一个使用多个迭代器的稍微复杂一些的示例:

import itertools
import operatorgen = itertools.count(1)
factorials = itertools.accumulate(itertools.count(1), func=operator.mul)
fac_and_nums = zip(gen, factorials)print(list(itertools.islice(fac_and_nums, 2, 5)))

你认为输出会是什么?

顺便说一下,使用迭代器时必须小心,因为每次调用 next() 函数时迭代器都会递增。因此,这段代码没有实现作者的意图:

import itertools
import operatorgen = itertools.count(1)
factorials = itertools.accumulate(gen, func=operator.mul)
fac_and_nums = zip(gen, factorials)print(list(itertools.islice(fac_and_nums, 2, 5)))

你能找出原因吗?

结论

虽然 Python 绝对不是函数式语言,但是它借用了一些非常有趣的函数式概念。将这些迭代器与 map 之类的函数结合起来,创造了一个全新的机会世界,并允许编写快速有效的对象代码处理序列。

itertools 中还有一些迭代器。所有这些都可能在某种情况下有用。如果你想了解更多,不要害怕看一下官方 Python 文档!

你不想犯的 7 个 Python 错误

原文:https://towardsdatascience.com/7-python-mistakes-you-dont-want-to-make-77ac068c847?source=collection_archive---------13-----------------------

照片由伊万·阿列克西奇在 Unsplash 上拍摄

注意这些可以节省几天的调试时间

早上开始得很完美。甚至在我喝完咖啡之前,我就已经完成了一部新电影。我的生产率直线上升。那时候我还不知道,好得不像真的。

这个问题只花了几个小时就浮出水面了。然而,找到问题的根源需要更多的时间。修复需要一整天的时间。那时我还是个初学者。由此,我学到了关于 Python 中列表的重要一课。

这听起来熟悉吗?这发生在每个人身上,但是从别人的错误中学习总是更好的。在本帖中,我收集了其中的七个,可以为你节省无数个小时的调试时间。

1.有副作用的函数

由于 Python 不是像 Haskell 那样的纯函数式语言,函数会产生副作用。严格来说,这不算是失误,但是很容易无意中把事情搞砸。下面的例子说明了这个问题。

在 Python 中,对象是引用类型。所以当你传递一个列表作为参数时,传递的是一个引用而不是值。这意味着如果你在一个函数中改变它们,这些变化将会反映到外部。

这可能会导致一些令人讨厌的意外和数小时的调试。(见我的介绍。)提防这些,早点给自己省事。

2.默认参数中的函数调用

默认参数有时会很难使用。看看下面。

为什么每次调用的返回值都一样?原因是 Python 在定义函数时会计算默认参数中的表达式。如果希望动态生成默认参数,可以执行以下操作。

3.可变默认参数

这个问题是以上两者的结合。你遇到过以下场景吗?

这里发生了两件事。

  1. 当函数被定义时,Python 对表达式[]求值。(这相当于调用list()。)
  2. 此对象的引用被绑定到参数。因此,无论何时调用该函数,都将使用同一个对象。

因此,使用可变对象作为默认参数不是一个好主意。你永远不应该那样做。

4.意外的参考分配

正如我们所见,Python 中的每个对象都是一个引用类型。除了将它们传递给函数之外,这会导致一些混乱。请参见以下示例:

当你执行b = a时,你实际上存储的是a引用。因此,ab指向同一个对象。要解决这个问题,你应该使用内置的deepcopy函数。这会递归地将所有的值类型属性复制到新变量中。

如果你用整数而不是列表来做同样的尝试,一切都会如你所料。原因是整数类型是不可变的,所以当你改变它们时,你覆盖了引用。

5.从进口的东西*

我知道,我们都曾经这样做过。这有几个缺点。

首先,不同名称空间中的函数可能具有相同的名称,这会在整个代码库中造成混乱。

第二,当您在 Python 中导入一个模块时,该模块中的所有代码都将被执行。如果有许多子模块要导入,这会大大降低速度。因此,如果您只导入 NumPy 来生成随机数,那么您可能更适合使用

from numpy.random import random

import numpy as np

6.用字符串串联连接路径

假设您必须从变量data_folder给出的文件夹中打开一个名为data.csv的文件。应该如何确定文件路径?如果你在做

data_path = data_folder + "/data.csv"

那你做的不对。例如,这在 Windows 上是行不通的。您可能没有亲身经历,但是您的使用不同开发设置的同事肯定会感受到这种痛苦。

要解决这个问题,您应该使用 Python 的内置工具pathlib,或者简单地使用os.path.join函数:

data_path = os.path.join(data_folder, "data.csv")

7.低测试覆盖率

这是一个高层次的问题。尤其是当你是一个初学者时,单元测试的好处并不清楚。然而,每个经验丰富的开发人员都可以告诉你,这是绝对必要的。使用未经测试的代码就像玩打地鼠游戏:修复一个错误,引入另一个错误。

从项目一开始就要避免这种情况。一旦您添加了一个特性(甚至是一个功能),您就应该编写测试用例来验证实现。这方面有几个很棒的库,例如内置的 unittest 或者非常流行的 pytest 。

你应该认真投入时间测试你的代码。这可能需要一些时间,但这是一项长期投资。您将节省更多的调试时间。

摘要

简而言之,这是你在 Python 中可能犯的七个最痛苦的错误。在您追求 Python 熟练程度的过程中,您肯定会遇到更多。然而,有了这个指南,你将有知识避免最常见的错误。

现在去建造一些令人敬畏的东西吧!😃

(通过适当的单元测试。)

如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!

让你的代码更好更聪明的 7 个 Python 技巧

原文:https://towardsdatascience.com/7-python-tricks-to-make-my-code-better-and-smarter-60dfde0b6c49?source=collection_archive---------16-----------------------

我希望我早点知道的技巧

由 Max Duzij 在 Unsplash 上拍摄的照片

我是一名工程师。我在大学学过 Fortran 和 MATLAB 来解决像能量和传质这样的工程问题,但是我没有扎实的软件工程训练。当我最近开始为数据科学和机器学习学习 Python 时,我是以一种“面向结果”的方式进行的,这使得我的代码有点混乱和低效。

通过我的自学之旅,我发现几个 Python 函数极大地改进了我的代码。我希望在这篇文章中分享 7 个 Python 技巧,我希望我作为初学者能早点知道。

1.列表理解

列表理解节省时间和代码。与使用循环相比,这是一种生成列表的简单方法。

我们来看一个例子:我们有一个列表:x,包含 5 个整数,我们想做一个列表,x_square,包含 x 中 5 个整数的平方。

for 循环方法如下所示:

列表理解可以在一行代码中完成同样的工作:

它还可以包含一个条件,比如我们只想要一个包含大于 2 的整数平方的列表。对于循环方法,我们可以添加一个 if 语句:

列表理解:在末尾添加条件——仍然是一行代码

2.λ函数

lambda是一个小型匿名函数,其行为类似于普通函数。

例如,一个计算平方的函数可以定义为:

def cal_square(x):
   returm x**2

使用一个lambda函数,可以这样做

cal_square = lambda(x:x**2)

使用自己定义函数对事物进行排序非常方便,例如:

使用apply操作熊猫数据框也非常有用:

3.地图()

map以一个函数和一个列表作为参数,它将函数应用于列表中的每一项。它确实很方便,因为它避免了使用循环,而且速度更快。

以一个简单的函数为例,如果我们想计算列表中每一项的平方,我们可以定义一个函数来进行计算,并使用map()将该函数应用到列表中

4.过滤器()

顾名思义,filter对列表应用过滤器并返回满足条件的条目。如果我们只想要列表中的肯定项,我们可以定义一个过滤函数,然后将filter应用到列表中。

这里也可以用lambda来简化。

5.加入()

join是一种将字符串连接在一起的方法。连接字符串的直接方法是使用+,例如:

这可以通过使用join更容易地完成:

6.枚举()

enumerate给数据添加计数器。例如:

在循环中使用非常有用:

7.格式()

format()是 Python3 中的一种字符串格式化方法。用多个变量生成或打印字符串是很方便的。

例如:

它在循环中非常有用:

您也可以使用.5f摆弄数字:

f 弦是另一种玩弦的方式,它甚至更聪明,避免了长线。

就是这样。这些技巧使我的代码更简单、更好,而不用编写不必要的循环。希望这些招数也能帮到你。

感谢阅读,编码快乐。

我还写了关于 Numpy 和熊猫的文章,有兴趣的可以看看!

[## 让我的代码更好更聪明的 7 个小技巧

我希望我早点知道的技巧

towardsdatascience.com](/7-numpy-tricks-to-make-my-code-better-and-smarter-9e8a4ccf43d1) [## 让我的数据分析过程更高效的 10 个熊猫窍门:第 1 部分

我希望我早点知道的技巧

towardsdatascience.com](/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-1-78a0cc1636f3)

https://towards data science . com/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-2-b 72 ea 43 A0 bb 5

在开始任何数据科学项目之前,你应该问自己的 7 个问题

原文:https://towardsdatascience.com/7-questions-you-should-ask-yourself-before-starting-any-data-science-project-51c29093c641?source=collection_archive---------31-----------------------

如何成为一名负责任的数据大师

在家里做一些数据分析的时候,试着记住质疑一切

学习成为数据科学家所需的技术技能当然很好。我认为学会像数据科学家一样思考也是非常重要的。这意味着总是质疑…基本上是一切。

显然,每个数据科学问题都需要您以不同的方式质疑您的方法和数据,但我认为,无论何时开始任何新的数据科学项目,都有几件事需要考虑。在这个故事中,我将讨论这些问题,以及为什么我认为这些问题对于一名负责任的数据科学家非常重要。

对于任何新的数据科学项目,我的问题是:

  1. 你想回答的问题是什么?
  2. 你知道你要测量的是什么吗?
  3. 你有正确的数据来回答你的问题吗?
  4. 你足够了解你的数据是如何被收集的吗?
  5. 有没有什么伦理上的考虑?
  6. 谁会看你的分析,他们对统计学了解多少?
  7. 你需要能够质疑你的方法吗?

1.你想回答的问题是什么?

在询问任何数据集之前,至少有一个你试图回答什么问题的想法是极其重要的。

你不想测试多个假设,只看哪一个有意义。如果你这样做,你会遇到多重假设检验的问题。当我们做统计课的时候,我们会更详细地讨论这个问题,但简单地说,当你同时考虑多个假设时,就会发生这种情况。

当我们谈论一个显著的结果时,一般来说,我们指的是一个我们相当有信心不同于“控制”的结果,因为这是一个真实的效果而不是随机的机会。95%置信度最常用(p<0.05)。

这留下了 5%的错误率,当结果实际上不重要时,我们将它标记为重要。同时测试多个假设的问题在于,至少其中一个假设出现这种错误的可能性会增加。因此,一次不加选择地测试许多假设,你会增加做出错误发现的机会。

因此,当你有一个经过深思熟虑和充分研究的假设时,战略性地使用统计测试,而不是随机测试,看看什么是有效的,这是更好的实践。

例如:

  • 如果您有一个包含 4 个不同组的测量值的数据集,并在它们的每个不同组合之间进行 t 检验,以查看它们中的任何一个是否有显著性,那么您将遇到多重假设检验问题。你做出错误结论的可能性会增加。
  • 更好的做法是创建一个无效假设并进行测试。

除了避免多重假设检验的问题之外,清晰地思考你要回答的问题会让你不至于偏离正题。

有时,从一个数据集中可以收集到如此多不同的闪亮而有趣的见解,以至于很容易掉进错误的兔子洞。你可能最终做了很多工作来解决有趣的问题,但对你最初的问题没有答案。

如果数据科学是你的一个爱好,这可能不是什么大不了的事情,但如果你试图在一个截止日期前工作,或者为你工作的公司解决一个特定的问题,这可能会重要得多。

2.你知道你要测量的是什么吗?

一旦你知道你想解决什么问题,你需要知道你将如何解决它。其中一部分是决定你要测量什么。

处理同一个问题往往有多种不同的方法。但是,如果你选择衡量错误的效果或变量,那么你可能无法有效地解决你的问题。因此,非常重要的一点是,要深思熟虑地考虑你试图衡量的东西是否是回答你感兴趣的问题的最有效方式。

类似于上面的第一点,如果你选择了错误的影响或变量来衡量,那么你可能会花很多时间在一个并不真正满足你需求的分析上。

例如:

  • 我曾经需要创建一个预测模型,其中的结果变量是一个人是否接受了特定的医疗程序的治疗。我使用的数据是医疗保健索赔数据,其中程序由代码表示。许多代码都非常具体,所以我需要将一些代码组合在一起,以创建我的二进制结果变量。
  • 当我在研究我感兴趣的程序时,我偶然发现了这些程序的一个子集,引起了我的注意。我很想钻进兔子洞,专注于程序的这个子集,但那不是我工作的公司要求我研究的。所以我不得不把它放到以后,继续工作。

决定采用哪种方法可能是任何数据科学项目中最重要的一步。

这可能需要一点研究来找出什么是适合你的目标的正确变量,但这是值得的。如果你确信你已经正确地选择了测量什么,那么你就可以对你的分析结果更有信心。

此外,当你与他人交流你的发现时,你可以确信你已经适当地考虑了你想要解决的问题以及如何正确地衡量它。

3.你有正确的数据来回答你的问题吗?

因此,一旦你有一个问题要解决,并知道如何衡量你感兴趣的效果,你需要有数据来进行衡量。如果你没有办法去研究最好的、最有趣的问题和变量,那是没有意义的。

拥有完美的数据集来回答确切的问题并测量感兴趣的特定效果是非常罕见的。

作为一名数据科学家,没有正确的数据是一件非常令人沮丧的事情。

我们经常不得不将就我们所拥有的。因此,我们可能不得不测量一些与我们最初打算的略有不同的东西。这可能没问题,只要我们随后调整报告结果的方式,以反映这种调整。

有时可以使用一个有数据的变量来表示另一个无法收集数据的变量。然而,如果你这样做,你必须恰当地报告你的结果。确保你不要声称你的结果没有数据支持。

例如:

  • 如果你想知道哪种狗在澳大利亚最受欢迎,但是你只有一个城市的数据,悉尼。你仍然可以对受欢迎的狗品种进行分析,但你需要在结果中表明你的数据只反映了悉尼的数量。

4.你足够了解你的数据是如何被收集的吗?

仅仅因为你有正确的数据来衡量你的兴趣和解决你心中的问题,并不意味着你可以放松😉

数据集不会凭空出现,不会完全成形,也不会包含完整的数据。有许多不同的方法可以收集数据。其中许多涉及机器或人,这意味着可能会出错。在进行任何分析时,尝试考虑或至少承认尽可能多的潜在误差源。

我不可能描述数据收集出错的所有可能方式。然而,您可以通过一些不同的调查来了解您的数据集。它们可以让你更好地理解它的缺点是什么。

例如:

  • 您知道您的数据集是在哪里收集的吗?许多变量会有区域差异,这应该被数据集捕获。然而,如果没有记录位置数据,这是不可能的。
  • 您知道您的数据集是何时收集的吗?如果你分析的数据存在每日、每周或季节性差异,那么了解你的数据来自哪个时间段是很重要的。
  • 你的数据是由谁收集的?这项研究是由一家可能对结果有既得利益的公司支付的吗?做这项研究的人是否没有偏见?
  • 收集时数据集是否完整?
  • 这些数据是推断出来的还是估算出来的?不同的数据插补方法应与数据集一起记录,以便您可以询问您是否认为所使用的方法适合您的分析。
  • 在您收到数据集之前,是否对其进行过任何收集后修改?
  • 收集方法中是否有其他可能的偏差?如果是这样,它们应该在你的分析中得到解释,或者至少在你的结果陈述中得到承认。

了解数据集的历史非常重要,这样您就可以确定这些潜在的缺点是否会阻止您找到想要的答案。或者,如果它们是您可以处理的数据问题😃

5.有没有什么伦理上的考虑?

这是一个经常被忽视的非常重要的问题。你的分析和你得出的结果合乎道德吗?

你可能想知道一个分析怎么会有伦理方面的考虑。通过仔细分析适当收集和测量的数字肯定不会是不道德的吗?但现实是,有时像性别歧视和种族主义这样的东西会在我们完全没有意识到的情况下悄然而至。尤其是当我们试图用数据描述的世界中存在不平等和偏见的时候。

例如:

  • 如果你在构建一个机器学习算法来预测哪些人会购买产品。根据你的分析,强烈预测你的结果变量的特征之一可能是种族。但是,您应该决定将种族作为一个特征包含在您的模型中是否正确。也许种族实际上并不是你的结果变量差异的原因,相反,它是另一个与种族相关的变量。当你预测人们是否会购买一种产品,以便公司可以向他们推销时,这可能重要也可能不重要。相比之下,如果预测他们是否会偿还抵押贷款来决定他们是否应该获得银行贷款,那么突然之间这就变得更加重要了。
  • 数据科学中最著名的种族主义案例之一是,一种面部识别算法将两名非洲裔美国男子标记为大猩猩。这不是设计软件的人恶意造成的,而是因为训练数据集中没有足够的多样性。

有很多人写过关于数据科学伦理的文章,所以你可以教育自己在设计数据科学项目时做出伦理决策。重要的是要承认世界上存在的偏见,并自己决定你计划完成的分析是否合乎道德。请注意,尽你最大的努力以一种能让世界变得更美好的方式进行分析。

作为数据科学家,我们是数据的管理者。我们可以影响公司如何做生意,政府做什么决定,开发什么药物等等。因此,极其重要的是,我们要负责任地、有意识地这样做。

6.谁会看你的分析,他们对统计学了解多少?

谁将会阅读你的分析或者成为你分析的接受者?是网站或产品的用户吗?数据科学团队?营销团队?业务拓展?销售团队?等等。每一组都有不同程度的统计学理解。所以你可能需要根据你的听众来调整你的分析。特别是,你选择的方法,你如何传达你的结果,以及任何相关的警告。

作为一名数据科学家,您有责任确保将您的发现准确传达给目标受众。你必须考虑到你的听众有多少统计学背景。

我做过的最困难的演讲之一是面对一群对统计学有着不同理解的听众。观众中有神经科学家、神经外科医生,也有遭受过脑损伤的人。关键是要包括足够多的细节,让专家高兴,但不要让其他人觉得我在居高临下地和他们说话,或者把他们排除在对话之外。在向不同的受众传达我的结果时,我一直在努力保持这种平衡。

不同的人希望将您的数据用于他们自己团队的目的也是很常见的。你有义务确保他们知道你的分析的局限性,以及他们是否能够自信地提出他们想要的主张。

这有时会导致冲突。不同的利益相关者可能对你的分析有不同的目的,但重要的是坚持你的立场,确保每个人都清楚地理解你的结果意味着什么。此外,确保他们知道可以得出什么结论。

例如:

  • 我曾经在一家公司工作,为营销团队做分析。和这个团队一起工作很愉快,因为他们和我清楚地交流了他们对我们数据的看法。有几次,我不得不礼貌地纠正他们想说的一些我觉得我们的数据无法支持的东西,但他们很好地接受了这种建设性的批评。
  • 相比之下,这种类型的对话并不总是进行得很顺利。我曾经开发过一个数据产品,销售团队希望对其功能和覆盖范围做出一些声明。我必须非常坚定,以确保我们没有过度宣传我们的能力。但我觉得这大概是科学家和销售人员的自然状态。前者天生保守,后者保守得多😃

7.你需要能够解释或询问你用来回答问题的方法吗?

在您决定在您的数据科学项目中使用什么方法之前,了解您需要多少方法才能质疑您生成的分析或模型是很重要的。

有时你可能需要能够非常详细地解释你采取的每一个步骤。这包括所有被考虑的变量和原因。其他时候,准确性是游戏的名字。在这种情况下,只要模型的预测误差最小,那么模型中包含什么并不重要。

了解这一点将有助于你决定你的方法。

例如:

  • 如果您有一个预测问题,并希望使用监督机器学习算法来预测二元结果变量,您有几个不同的选项。如果您需要能够检查模型中的每个特性,并且能够向某人清楚地解释它,那么最好使用逻辑回归模型。然而,如果您的模型更像是一个黑盒并不重要,那么随机森林模型可能会更好地为您服务。

虽然可解释性不应该是选择机器学习模型进行分析的主要考虑因素,但它值得思考。有时,这可能是准确性和可解释性之间的权衡。所以这真的是由你作为一个数据科学家来决定去哪个方向。

结论

因此,在开始任何数据科学项目之前,问问自己:

  1. 问题是什么?
  2. 你知道你在测量什么吗?
  3. 你有正确的数据来回答你的问题吗?
  4. 你知道你的数据是如何收集的吗?
  5. 有没有什么伦理上的考虑?
  6. 谁会看你的分析,他们有统计学背景吗?
  7. 你需要能够质疑你的方法吗?

我希望这 7 个问题能发人深省。他们将确保在您执行的任何数据科学分析中,您不会完全偏离正轨。希望它们能为你节省一些时间,减少不必要的麻烦。随着您在数据科学方面获得经验,我相信您会提出自己的问题,在开始任何新项目之前,您总是喜欢问自己这些问题。请记住,在您的所有分析中要始终保持警惕,并适当地传达对您的结果的任何警告。

除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术

[## 我如何在 6 个月内从零编码技能成为数据科学家

我用来自学数据科学的 4 个工具没有花一美元

towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## Ldswsd -走向数据科学

阅读《走向数据科学》中关于 Ldswsd 的文章。共享概念、想法和代码的媒体出版物。

towardsdatascience.com](https://towardsdatascience.com/tagged/ldswsd)

基于阿里云容器服务为 Kubernetes (ACK)构建 AI/ML 项目的 7 个理由

原文:https://towardsdatascience.com/7-reason-to-build-your-ai-ml-project-on-alibaba-cloud-container-service-for-kubernetes-ack-423f84bb448d?source=collection_archive---------72-----------------------

来源:截图来自阿里云原生日

作为数据科学家,我们在大规模运行 AI/ML 项目时经常面临一些挑战。

首先,我们需要端到端的支持来做 AI/ML 实验,包括平台来做数据准备,建立/训练/评估模型,并将模型发布到生产中。有时我们需要多个平台来执行这些特定的任务。

第二,为了支持端到端的实验,我们需要异构的资源类型和管理,以便我们可以有一个高效的项目。

最后,为了能够连续大规模地训练和服务我们的模型,我们还需要找到一种经济高效的方法,这可以通过按需将资源使用从零扩展到数千的能力来实现。

那么,我们如何应对这些挑战呢?

下面我要介绍一下 Kubernetes (ACK)的阿里云容器服务。这种容器服务是由阿里云提供的,以应对这些挑战。ACK 可以支持从数据准备、开发、训练、推理、操作、存储、计算引擎和网络管理端到端 AI/ML 项目。

确认时的业务流程。张开在阿里云本土日上的图片

ACK 还提供了该解决方案支持的六个主要特性,这些特性将在本文中描述。

ACK 上云原生 AI/ML 解决方案的关键特性

ACK 的主要特性。张开在阿里云诞生日的图片

1.AI/ML 作业生命周期管理

ACK 使用 Kuberflow 和 Arena 作为生命周期管理工具。Kuberflow 是 K8s 本地平台,用于使用 Kubernetes 构建可移植的 ML 解决方案。有了 Kuberflow,我们可以让机器学习工作流在 Kubernetes 上的部署变得简单、可移植、可扩展。

ACK 也有 Arena 让数据科学家的生活更轻松。Arena 是一个命令行界面,用于运行和监控机器学习训练、推理作业,并轻松检查它们的结果以及实时的 GPU 利用率。Arena 还拥有对 Python 和 Java 的 SDK 支持,可以快速集成到用户的平台中。

要获得关于 Kuberflow 和 Arena 的更多信息,请通过以下链接查看 Github 页面:

[## 库贝弗洛

解散 GitHub 是超过 5000 万开发者一起工作的家。加入他们,发展您自己的开发团队…

github.com](https://github.com/kubeflow)

https://github.com/kubeflow/arena

2.AI/ML 作业的优化调度程序

ACK 支持多种资源分配模式,包括:

  • 一伙
  • 拓扑感知
  • 传播
  • Binpack

资源分配模式。张开在阿里云本土日上的图片

此外,ACK 具有多种类型的调度策略:

  • 先进先出。比较 LIFO
  • 容量
  • 公平分配

ACK 调度策略。张开在阿里云诞生日的图片

3.统一异构资源管理

ACK 支持各种资源管理来管理各种资源类型。

GPU 管理

ACK 支持全自动的 GPU 设置、调度、监控和管理。ACK 还通过在特定场景的多个容器之间共享一个 GPU 设备来实现优化的 GPU 利用率。此外,ACK 提供了 GPU 扩展能力,以按需处理工作负载变化。

GPU 分享图解。张开在阿里云诞生日拍摄的图片

VGPU 管理

这种 VGPU 管理通过 GPU 共享提高了 GPU 利用率,同时确保了多租户的隔离。ACK 支持多种虚拟化比率选择,包括 1:2、1:4、1:8,没有额外的许可证要求。这个 VGPU 适合 AI 推理和图形工作负载。

VGPU 模式。张开在阿里云诞生日的图片

阿林普(汉光 800)

汉光 800 是阿里巴巴做的 AI 推理的神经处理单元。这个单元可以帮助更快更有效地执行机器学习任务。

ACK 有助于提高设备和内核级调度的利用率。ACK 还带来了统一的调度、扩展、监控和管理,以支持端到端的人工智能项目生命周期。

汉光 800 在器件或内核级的应用。张开在阿里云诞生日的图片

FPGA 管理

ACK 可以加速 FPGA H265 编码器的交付,并按需扩展实例。

FPGA 管理。张开在阿里云诞生日拍摄的图片

RDMA 管理

ACK 可以在 Kubernetes 中为 HPC 和深度学习工作负载调度和管理 RDMA 设备。ACK 能够与英伟达 NCCL 集成,以加速分布式培训。

RDMA 管理。张开在阿里云诞生日的图片

4.GPU 监控

ACK 提供了出色的 GPU 监控。通过查看该监视器,我们可以看到节点视图指标或应用程序视图指标。

GPU 监控。张开在阿里云诞生日拍摄的图片

5.自动缩放

ACK 中的自动 GPU 扩展可以通过多种场景完成。例如:

  • 基于 GPU 设备级指标的自动缩放 AI 应用实例
  • 用于运行大型人工智能训练作业的自动缩放 GPU 集群节点

6.利用分布式数据缓存加速计算

ACK 可以通过摆脱 GPU/CPU 等待时间来加速 AI 训练作业的远程数据读取。ACK 分布式数据缓存(DDC)支持水平扩展,支持不同的存储后端,包括 OSS/HDFS/NAS。此外,ACK DDC 支持多个缓存层,包括 RAM/SSD/HDD,并支持预加载一次,由多个作业读取。

DDC 插图。张开在阿里云诞生日拍摄的图片

ACK 还支持运行 Apache Flink 应用程序,以云本地方式处理流数据。此外,ACK 还支持 Spark。

阿帕奇弗林克图。张开在阿里云诞生日拍摄的图片

最后的话

作为总结,在云环境中构建人工智能/人工智能作业可能是解决常见人工智能/人工智能挑战的答案。特别是通过使用阿里云平台,我们可以体验一些关键功能,这些功能将使我们的项目更加高效。

参考

张,凯。(2020).在 Kubernetes 上构建 AI/机器学习【演示】。阿里云原生日。(访问日期:2020 年 6 月 3 日)。

不雇佣数据科学家的 7 个理由

原文:https://towardsdatascience.com/7-reasons-to-not-hire-a-data-scientist-446b5c051f91?source=collection_archive---------36-----------------------

因为谁需要数据?

尼克·科尔曼在 Unsplash 上拍摄的照片

我觉得标题挺清楚的,就开门见山吧。

#1:你没有任何数据

在考虑雇佣数据科学家之前,你应该退一步考虑你的数据。

数据科学家的工作是从数据中创造价值。如果你甚至不确定你是否有数据,这是一个很好的迹象,表明你还没有为数据科学家做好准备。

如果你知道你有数据,但真的不知道如何访问它,它的可靠性或任何细节,那么你应该首先回答这些问题。

如果您的公司对其数据资产有很强的把握,您将从聘用的数据科学家身上获得更多价值。您的理解不必完美,但您应该能够向数据科学家指出一些有文档的数据。

对于一名新的数据科学家来说,最糟糕的感觉是意识到他或她刚刚加入了一家实际上并不掌握他们的数据的公司。

#2:你没有正确的数据

我知道你在想什么。你读了第一条,笑了——谁会雇佣一个没有数据的数据科学家。

好吧,下一个你没有准备好的迹象是你有数据,但没有的数据。

数据是解决您想要解决的问题的数据,并且有望被标记。通过标记,我的意思是你有数据,也有与数据相关的真相吗?

例如,如果您希望一名数据科学家来构建一个系统来检测您网站上的欺诈活动,您可能希望从您的网站获得活动数据,并了解一些数据集,哪些活动是欺诈性的,哪些不是。知道哪些数据点是欺诈性的将被视为标签。

现在—你可以不用标签解决问题,但是如果这是你第一次涉足数据科学,我强烈建议从有标签的数据开始。

如果你的数据还没有标签,投入一些时间和金钱让人们给你的数据贴上标签,或者建立一个可以自动贴标签的系统。

#3 你没有明确的问题要解决

回到拥有正确的数据,要知道你是否拥有正确的数据,你还必须有一个明确的问题要解决。

我怎么强调这有多重要都不为过。

当然——有可能你雇佣了一个伟大的数据科学家,他或她带着一个模糊的问题进来,然后让一些奇迹发生。别指望这个。

准确地知道你想要解决什么问题,以及你将如何评估成功,从而最大化你成功的机会。如果问题通常可以由人类解决而没有太多问题,这也是有帮助的。如果是这样的话,这是一个很好的迹象,你也可以使用数据科学来解决它。

一个很好的例子可能是,你想以至少 70%的准确率检测你网站上的评论是否不恰当。

#4:你真正需要的是分析师

如果你已经到了这一步,那么希望你有正确的数据和明确的问题。

我认为下一个最大的问题是,一家公司认为它需要一名数据科学家,但它实际上需要一名分析师。数据科学家通常可以做分析师的工作,但如果你需要的是分析,你最好雇佣分析师。

一般来说,区别在于你是在试图预测新的事件,还是更好地理解历史事件。

举个例子,如果你想让某人进来,把你的历史销售数据汇总到一个漂亮的带有一些汇总统计数据的仪表板上,那么你要找的就是分析师。

分析师对一家公司来说非常有价值。事实上,他们往往比数据科学家更有价值,因为通常情况下,你希望他们解决的问题更清晰,风险更低。

#5:你没有准备好数据科学家的真实成本

关于数据科学家,一个鲜为人知的事实是,他们是有需求的。一旦你雇佣了一个,他们就会想要更多的数据、更多的存储和更多的计算。在您知道之前,他们会让您相信一台 10 万美元的计算机对您的数据科学计划的成功绝对至关重要。

他们可能没有错。

所以,在雇佣数据科学家之前,请考虑一下数据科学家的真实成本。您的 IT/基础设施成本肯定会上升。

此外,单个数据科学家可能不足以产生重大价值。为了以可接受的速度前进,向团队中添加更多的工程师和数据科学家可能是必要的。

#6:你期待独角兽和彩虹

数据科学项目通常比一般项目风险更大。通常,问题是否可解都是未知的。你可能最终会雇佣一名数据科学家,并投资于一个不容易解决的问题。

您需要适应失败的迭代和不太严格的时间表,以使数据科学项目有效。

这并不是说你不应该期待你的数据科学团队的真正价值,而是你应该期待这条路不那么线性。如果你的公司还没有准备好,那么我会推迟。

#7:你不知道如何雇用数据科学家

最后,如果你不知道如何做,就不应该雇佣数据科学家。

数据科学已经代表了许多不同类型的工作,这使得如果没有该领域的知识,很难知道你得到的是什么类型的数据科学家。

例如,也许你得到了真正的拥有多个博士学位的学术数据科学家,但却非常不擅长编码。或者,你可以聘请一名数据科学家,他更像是一名拥有一些数据科学在线课程的工程师。

这两个都不坏,但是根据你的需要,它可能不适合你的公司。因此,在招聘数据科学人才之前,请确保你对能够真正找到一名好员工感到满意。

你喜欢这篇文章吗?加入我的数据科学社区。

我喜欢 Vaex 用于数据科学的 7 个原因

原文:https://towardsdatascience.com/7-reasons-why-i-love-vaex-for-data-science-99008bc8044b?source=collection_archive---------11-----------------------

摄影:塔拉斯·马卡连科(经由 www.pexels.com)

Vaex 是一个开源的 Python 数据框架库,其 API 与 Pandas 的 API 非常相似。我已经在学术和行业环境中使用 Vaex 好几年了,它是我正在从事的几个数据科学项目的首选库。在本文中,我想分享一些我最喜欢的 Vaex 功能。有些现在可能是显而易见的,但有些可能会让你大吃一惊。

以下代码示例在 MacBook Pro (15 英寸,2018,2.6GHz 英特尔酷睿 i7,32GB 内存)上运行。本文也可以作为 Jupyter 笔记本阅读。

1.易于处理非常大的数据集

如今,遇到大于典型笔记本电脑或台式机工作站可用 RAM 的数据集变得越来越常见。 Vaex 通过使用内存映射和惰性求值,很好地解决了这个问题。只要您的数据以内存可映射文件格式存储,如 Apache Arrow 或 HDF5 ,Vaex 将立即打开它,无论它有多大,或您的机器有多少 RAM。事实上,Vaex 只受您拥有的可用磁盘空间量的限制。如果您的数据不是内存可映射的文件格式(例如 CSV、JSON),您可以通过将丰富的 Pandas I/O 与 Vaex 结合使用来轻松转换它。参见本指南了解如何操作。

使用 Vaex 打开和预览 100GB 的文件是即时的。

2.没有记忆副本

Vaex 有一个零内存复制策略。这意味着过滤数据帧只需要很少的内存,并且不会复制数据。考虑下面的例子。

过滤 Vaex 数据帧不会复制数据,占用的内存可以忽略不计。

创建df_filtered数据帧不需要额外的内存!这是因为df_filtereddf的复制。创建过滤后的数据帧时,Vaex 会创建一个二进制掩码,然后应用于原始数据,而无需制作副本。这种过滤器的内存成本很低:过滤一个10 亿行数据帧需要大约 1.2 GB 的 RAM。与其他“经典”工具相比,这可以忽略不计,在其他“经典”工具中,仅读入数据就需要 100GB,过滤后的数据帧需要大约 100GB。

3.虚拟列

将 Vaex 数据帧的现有列转换为新列会导致创建虚拟列。虚拟列的行为就像普通列一样,但是它们不占用任何内存。这是因为 Vaex 只记得定义它们的表达式,而不会预先计算这些值。这些列仅在必要时进行延迟评估,从而保持较低的内存使用率。

“tip_percentage”列是一个虚拟列:它不占用额外的内存,并且在需要时被动态地延迟计算。

4.表演

Vaex 是快速。我是说认真快。虚拟列的评估是完全并行的,只需对数据进行一次处理即可完成。诸如“value_counts”、“groupby”、“unique”等列方法以及各种字符串操作都使用快速高效的算法,这些算法是在 C++中实现的。它们都以核外方式工作,这意味着您可以处理比 RAM 中容纳的更多的数据,并使用处理器的所有可用内核。例如,对超过 10 亿行执行“value_counts”操作只需一秒钟!

使用 Vaex,“value _ counts”操作对于超过11 亿行需要大约 1 秒的时间!

5.即时编译

只要虚拟列是仅使用 Numpy 或纯 Python 操作定义的,Vaex 就可以通过 jitting 或通过 Numba 或Python ran进行实时编译来加速其求值。如果你的机器有支持 CUDA 的 NVIDIA 显卡,Vaex 还支持通过 CUDA 加速。这对于加速计算量相当大的虚拟列的计算非常有用。

考虑下面的例子。我已经定义了两个地理位置之间的弧距离,这个计算涉及到相当多的代数和三角学。计算平均值将强制执行这个计算量相当大的虚拟列。当执行完全用 Numpy 完成时,只需要 30 秒,我觉得这令人印象深刻,因为它是针对超过11 亿行完成的。现在,当我们对 numba 预编译的表达式做同样的事情时,我们的执行速度提高了 2.5 倍,至少在我的笔记本电脑上是这样。不幸的是,我没有 NVIDIA 显卡,所以我现在不能用 CUDA 做同样的事情。如果你这样做了,如果你能尝试一下并分享结果,我会非常高兴。

一个小但重要的好处:注意缺少一个.compute或任何这样的方法——Vaex 自动知道什么时候懒惰,什么时候执行计算。

对于计算开销很大虚拟列,Jitting 可以使执行速度提高 2.5 倍。

6.选择

Vaex 实现了一个叫做选择的概念,用来选择数据。例如,当您想要通过计算数据不同部分的统计数据来浏览数据,而不需要每次都创建新的参考数据帧时,这是非常有用的。使用选择的真正强大之处在于,我们只需对数据进行一次处理,就可以计算多个选择的统计数据。

您可以通过一次数据计算多个选择的统计数据。

这对于进行各种可视化也是有用的。例如,我们可以使用.count方法在不同的选择上创建一对直方图,只需对数据进行一次遍历。相当高效!

只需对数据进行一次处理,就可以在不同的选择上创建多个直方图。

7.Groupby 带有选择的聚合

我最喜欢的特性之一是在聚合函数中使用选择的能力。我经常发现自己想要进行分组操作,其中的聚合遵循一些附加的规则或过滤器。SQL 式的方法是运行几个单独的查询,首先过滤数据,然后进行分组聚合,最后将这些聚合的输出合并到一个表中。使用 Vaex,只需一次操作,只需一次数据传递,就可以做到这一点!下面的分组示例在我的笔记本电脑上只需要 30 秒就可以执行,运行了超过 11 亿行。

可以在 groupby 聚合函数中使用选择。

奖励:进度条

查看上面的例子,您可能已经注意到在 Vaex 中实现的许多方法都带有进度条。我绝对喜欢这个功能!由于我经常对较大的数据集使用 Vaex,知道一个操作可能需要多长时间非常方便。而且看起来很好看,让时间过得更快:)。

Vaex 是一个相当强大的数据框架库,尤其是对于大型数据集。它有各种有用的数据操作和可视化方法。这些就是我喜欢使用这个库的 7 大原因。你的呢?

程序员精疲力竭的 7 个原因

原文:https://towardsdatascience.com/7-reasons-why-programmers-burn-out-44a40bf8948d?source=collection_archive---------1-----------------------

和 7 种解决方法

倦怠在程序员中极其普遍。杰奎琳·戴在 Unsplash 拍摄的照片

W W 当 Jerry 作为初级开发人员开始工作时,他们每天早上都迫不及待地开始工作。每天晚上,即使他们工作了 10 个小时,他们仍然感到精力充沛。现在,两年后,杰里看起来像他们曾经的影子。现在起床很难,工作更难。一天下来,他们感到筋疲力尽。他们已经开始害怕明天回去,浪费生命中的另一天。

听起来很熟悉?就我个人而言,我还没有见过一个程序员没有经历过至少一次倦怠。

这听起来很矛盾:同一个人在十几岁或二十几岁时爱上了代码,在过去三年里参加了至少五次黑客马拉松,并在周末为开源项目做出贡献——这个人怎么可能抱怨倦怠呢?

是的,他们可以。

原因一:工作单调

编程就是整天坐在屏幕前,除了午休时间和偶尔的几次会议。当然,许多其他工作也是如此。但是坐在非常不健康的位置上盯着屏幕的强度在编程中是最高的。

即使你发现你的工作在精神上很刺激,这种单调也会很快导致身体的迟钝。这意味着你不能很快完成工作,所以你开始变得没有动力,所以你工作得更少,…

走出这种恶性循环意味着采取健康的生活方式。理论上听起来很容易。但是预期寿命的下降显示了这有多难。

[## 健身如何让我成为一名更好的网络开发人员

运行以获得更好的运行时间

medium.com](https://medium.com/better-programming/how-fitness-transformed-me-into-a-better-web-developer-ac51a2b08cb4)

原因 2:赶时间

如果你曾经使用过 Scrum 和类似的方法,或者如果你有一个雄心勃勃的经理,你知道我在说什么。

[## Scrum 方法论的简短介绍

或者我如何学会拥抱变化

medium.com](https://medium.com/chingu/a-short-introduction-to-the-scrum-methodology-7a23431b9f17)

你在追逐一个又一个截止日期。你可能会错过一些截止日期。人们期望你在昨天之前把所有东西都送出去,没人在乎人类没有能力做到这一点。

结果,当你思考你的工作时,你感觉不到快乐或成就感。你感到压力。

这吸干了你对编码的所有热情。你被期望成为一个机器人,总是产生一流的输出,并提前交付。但你是人,所以你会有倦怠的症状。

原因 3:糟糕的同事

考虑以下情况:你的项目让你兴奋,你觉得你正在取得进展。然而,每天你都害怕去工作。这个简单的想法会让你焦虑和不开心。怎么了?

当然,你在工作中的快乐会受到你的工作的影响。但更重要的是,你的快乐会受到你的人际关系的影响——无论是工作中还是工作之外。

所以,如果你对你正在做的事情感到满意,但你仍然害怕,那可能是你的同事。不管是他们不认同你的价值观,还是企业文化让他们做出愚蠢的行为,你都不应该受到如此恶劣的对待。

如果你正经历由讨厌的同事引起的倦怠症状,要知道这不是你的错。您可能想尝试本文后面列出的一些修复方法。或者你可能想更激进一点,换个部门,或者在完全不同的公司找份工作。

这取决于你。只要知道你值得更好的

如果你的同事不认同你的价值观,你的工作会很糟糕。照片由阿里·叶海亚在 Unsplash

原因四:不认可

这部分和你的工作关系有关,但是在另一个层面上。你的项目可能精彩刺激,你的同事可能牛逼。

但是每当你觉得你已经完成了一些事情,你的经理就会带着一个完全不同的任务出现。每当他们这样做的时候,旧的任务就变得完全无关紧要了。

听起来很熟悉?我知道这对我很重要。

你可以对你的领域感到兴奋或充满激情。如果你的工作不断被否定,你会失去动力。

你会开始害怕去那里,因为你知道你不会创造任何有用的东西。当一天结束的时候,你会很开心——因为结束了——但是不开心,因为今天不是星期五,你明天还得去上班。在某些时候,你会开始认为,即使是你通过完成任务而获得的技能也是无关紧要的。

随着时间的推移,这可能会导致更严重的症状。这都是因为你的经理不知道你应该做什么。

原因 5:获得报酬

工资太少——或者太多!—会加重你的倦怠症状。

工资太低是导致精疲力竭的一个显而易见的原因。(是的,爆料程序员存在!如果你对编码的热情不足以维持生计,你可能会觉得自己的工作没有价值。这又让我们回到了原因 4。

但是当你得到太多的报酬时,倦怠也会恶化。虽然大额支票在理论上听起来很棒,但在现实生活中可能会导致灾难。让我用我的亲身经历来说明这一点。

作为一名本科生,我非常喜欢编程。我日日夜夜在研究实验室为科学目的编写软件,有时甚至因此而忽略了我的课程。我太喜欢它了,所以我从来没有期望得到任何补偿。多年来我免费工作。即使这意味着我在超市买不起西红柿。

当我进入研究生院时,这种情况彻底改变了。突然我得到了报酬。突然我所有的账单都被支付了。突然间,我可以买西红柿而不用考虑一分钱。我在谋生。代码!

然后一个愚蠢的想法进入了我的脑海:如果我被支付代码,那么每个月我应该交付一段代码,至少值那么多钱。

突然之间,原本狂热的激情变成了压力的来源。交付压力。执行的压力。返还我收到的金钱价值的压力。

但是你给自己的压力越大,你的表现就越差。尤其是当你想到钱的时候。

沉溺于你的任务会导致灾难。照片由 nikko macaspac 在 Unsplash 上拍摄

原因 6:无意义的任务

原因 3 到 5 解决你可能遇到的问题,尽管有一个伟大的项目。但有时你的项目真的很烂。

也许你的项目只是一堆公司的废话,对程序员来说没什么实质内容。你想要的只是编码,而不是负责所有的管理职责、客户关系等等。

[## 每个数据科学家都需要向商业领袖学习什么

因为软技能很重要。

towardsdatascience.com](/what-every-data-scientist-needs-to-learn-from-business-leaders-47dcf3204076)

也许你看不到你的项目的意义,因为你不能从中学到任何新的东西。程序员属于这个星球上最好奇的生物——如果你不能从中学习,你就不喜欢它。

也许这个项目超出了你的能力范围。你觉得你无法掌握它,你的经理完全高估了你的技能。

或者也许你在过去的几个月里一直在做一个项目,但你仍然不知道你应该做什么。这项任务是个谜,似乎没有人能向你解释清楚。这通常源于管理不善。不幸的是,这种情况发生的次数比你想象的要多。

无论如何,从公司的角度来看,你的项目是你工作的主要原因。所以如果它很糟糕,难怪你会感到精疲力尽。

理由 7:行走死亡之旅

这一条与原因 6 密切相关。简而言之,死亡行军就是当你在做一个注定要失败的项目时。

这可能有很多原因:期限太紧,你没有足够的资源,或者你的团队太小,无法执行。尤其是当你在一个大项目上工作了好几个月,而且风险很高的时候,这会给你带来巨大的压力。

你对此的反应有两种:要么你陷入完全的冷漠,迟到早退,因为你知道你的工作不会改变任何事情。或者你开始每天工作 14 个小时,相信这样你就能扭转乾坤。

你的冷漠是由消极情绪引起的,并导致更多的消极情绪。你基本上是在移除让你的火继续燃烧的燃料。

或者,如果你是那种埋头于工作的人,那么你投入的所有时间都在扼杀你的激情。

这两者都是自然反应。和以前一样,只要知道如果项目进展不顺利,这不是你的错。你是一名优秀的程序员,你可能已经在其他项目中证明了这一点。如果出了问题,那是因为环境,而不是因为你!

[## 一个程序员倦怠的故事;如何识别并避免它| CoderHood

我将告诉你一个名叫博尔博的软件工程师的故事,他在职业生涯的某个时刻陷入了死亡行军。

www.coderhood.com](https://www.coderhood.com/a-programmer-burnout-story-how-to-recognize-it-and-avoid-it/)

程序员不是机器人

精疲力尽的棘手之处在于,始于工作的问题会蔓延到生活的方方面面。你开始忽视你的家庭、你的朋友、你的爱好和你的自我照顾。突然间,你陷入的不是工作危机,而是生活危机。

理解这一点至关重要——我怎么强调都不为过——这不是你的错。当然,认识到自己的错误对个人成长至关重要。但是为你没有犯过的错误责备自己会毁了你。

很多时候,程序员职业倦怠问题的根源在于公司文化内部或者某种形式的管理不善。

这并不意味着你需要马上换部门或者辞职。虽然这对于真正困难的情况可能是一个很好的解决方案,但是使用一些更软的修复已经可以提供巨大的帮助。

同情心是关键。裘德·贝克在 Unsplash 上的照片

修复 1:对自己有同情心

我知道这听起来很无聊。但是听我说完。

精疲力尽不是你的错。这不是软弱的表现。你经历的痛苦不是因为你是个白痴。这是真的。它是有效的。

我如此强调这一点,是因为我是这个谬论的罪魁祸首。当我应该对自己好一点的时候,我倾向于责备自己没有引起的问题,责备自己。

对自己有同情心是我仍在学习的东西。但我发现的一件事是这很有帮助:

做自己最好的朋友。

这并不意味着你不应该和你最好的朋友保持经常联系。但是试着把自己当成最好的朋友。

当你为自己明显的无知、无能或其他原因而自责时,想想这个:如果你最好的朋友处在你的处境,你会对他们说什么?你会怎么和他们说话?

我发现,自怜是获得更多自爱的不可思议的方法。这导致——你猜对了——更多的快乐和生产力。

[## 幸福的秘密是同情

要有同情心,要快乐

medium.com](https://medium.com/publishous/the-secret-to-happiness-is-compassion-e50b37b2a190)

修复 2:想想曾经让你兴奋的事

我曾经对编程非常感兴趣,但当我进入研究生院时,我失去了激情。对我来说,原因是我得到了报酬(原因 5);但对你来说,它可能是上述任何一个原因。

有帮助的是诺贝尔奖获得者物理学家理查德·费曼的回忆录,当他收到非常著名的高等研究院的工作邀请时,他正经历一段精疲力竭的时期:

高等研究院!特殊例外!一个甚至比爱因斯坦更好的位置!这是理想的;这是完美的;这太荒谬了!

这太荒谬了。在某种程度上,其他的提议让我感觉更糟。他们希望我能有所成就。但是这个提议太荒谬了,对我来说是不可能实现的,太荒谬了。【……】我一边刮胡子一边笑,想着这件事。

然后我对自己说,“你知道,他们对你的看法是如此的不可思议,这是不可能实现的。你没有责任辜负它!”

这是一个绝妙的想法:你没有责任达到别人认为你应该达到的目标。我没有责任像他们期望的那样。这是他们的错,不是我的错。

高级研究学院期望我有那么好,这并不是我的失败;这是不可能的。这显然是一个错误,当我意识到他们可能是错的时候,我意识到其他地方也是如此,包括我自己的大学。我就是我,如果他们期望我表现好,并为此给我一些钱,那是他们的不幸。

——摘自《费曼先生,你肯定是在开玩笑吧?》,作者理查德·费曼,版权 1985 年,第。100.

费曼并没有完全编码。尽管如此,还是这篇文章让我在博士之初走出了我的兔子洞。由此我得出结论,如果我的博士学校给我的报酬过高,那是他们的错。我会像费曼先生一样不负责任,随心所欲。我做到了。

先做小任务,然后达到更高的目标。由布拉德·巴莫尔在 Unsplash 上拍摄

修复 3:合并日常任务

当你知道你什么也做不了的时候,不得不去工作是令人畏惧的。根据定义。

不管这个项目是太难了,还是管理不当,或者完全没有意义——你都不得不放弃让你快乐的多巴胺激增。

有一件事可以帮助你重新设定动机,那就是合并日常任务。我喜欢从简单的、几乎是琐碎的事情开始我的一天。这个任务应该是有用的,但主要目的是从我的待办事项列表中去掉一个勾。

这欺骗了我的猴脑,让它想要完成下一个任务——因为这样我就会获得另一个成功的时刻。然后我慢慢地从最容易的部分到最难的部分。

这听起来像是对困难事情的拖延。但是很管用!我经常惊讶于自己通过先做简单的事情实际上完成了多少。

修复 4:反射

每天留出一些时间来练习反思。每个人都有自己的技术,你可以自由发展自己的技术。我使用每天晚上填充的反射矩阵:

我把主动事件和被动事件分开。活动事件是我所做的事情的直接后果。被动事件是在我什么都不做的情况下发生的事情。这让我意识到并非一切都在我的掌控之中。

在“我喜欢”类别中,我写下了那天我感激的事情。这建立了我的成就感和心理弹性。这样我就能积极主动地对抗消极情绪。

“我希望”类别包含了本可以做得更好的事情。这是我吸取教训和寻找解决方案的地方——例如,我可能会以不同的方式设定我的里程碑,或者寻找新的方法来应对我的受伤。

[## 极简主义日志:一个有趣而有效的改变习惯的工具

如何创建你自己的习惯仪表板,激励你坚持任何习惯

medium.com](https://medium.com/better-humans/draft-how-to-hack-your-brain-to-achieve-consistency-that-lasts-7f5fdc520d28)

你可以通过写日记,或者和朋友聊天,或者给自己发电子邮件来反思。我建议你不要只在头脑中做这件事——因为你会忘记这件事,而且很难养成习惯。此外,信不信由你,待会查看积压的工作会很有趣。

你可以在任何你想去的地方这样做——在你的办公室,在家里或者在公园。但是试着每天在同一个地方做——这将帮助你养成习惯。此外,试着在每天的同一时间做这件事,最好在你的日历上把这段时间划掉。

通过反思,你在回顾过去的成功。你意识到你经常无法控制事情。这在应对倦怠症状方面对我帮助很大。

第五招:培养一个爱好

你是个程序员。你是个怪人。我明白了。

当你不在工作的时候,你不是在睡觉就是在编码取乐。这太神奇了。

但是当你面临严重的倦怠时,你可能根本不想碰电脑。现在你的生活面临着巨大的空虚。

积极主动地做这件事,同时做一些活动——最好是不涉及电脑的活动。它可以是一项运动,或者音乐,或者烹饪,或者室内设计。找到你感兴趣的事情——并且定期去做。

对我有帮助的一件事是有一个实用的爱好。比如一周至少一次,我喜欢做好吃的。对我来说保持这种状态很容易,因为我无论如何都需要吃东西。此外,这样我可以确保我得到一些健康的东西,这对我的工作有积极的影响。

无论你选择做什么,任何爱好或业余项目都会给你一种成就感,而这正是你在工作中所缺乏的。爱好有助于稳定你的情绪,这样工作危机就不会变成生活危机。

培养一个能激励你的爱好。自由股票在 Unsplash 上的照片

修正 6:设定不可协商的界限

这是给那些在筋疲力尽时过度补偿的人的。听起来很矛盾,获得空闲时间也需要一些纪律。

例如,我有一个晚上 9 点以后不做任何有成效的事情的界限——编码或媒体或其他。我在过去五年里一直有这个界限,但我只越过了两次。

它不仅能帮助我放松、反思和睡个好觉。这也让我在白天有所期待。不管生活压力有多大,我知道我总能在晚上 9 点和上床睡觉之前把自己的思绪关掉。

[## 为什么你的大脑需要空闲时间

一些重要的大脑功能需要停机

elemental.medium.com](https://elemental.medium.com/why-your-brain-needs-idle-time-e5d90b0ef1df)

重要的是,这些界限是不灵活的。把它们从你的日历上划掉,并清楚地与你的老板和同事交流,这将有助于你保持它们。

你可能害怕自己看起来很懒。有趣的是,事实并非如此。一个界限清晰的人给人的印象是他们能掌控自己的生活。

第七招:为自己辩护

这直接链接到上面。清楚地传达你需要什么——你的界限,以及实现项目目标所需的任何额外资源、人力和资金。

你需要的应该是合理的——否则,你的经理可能会认为你要求太高。但是,表现出要求比羞于表达自己的需求要好。其他人不可能从你的鼻尖上看出来。

一旦你开始养成表达自己需求的习惯,你会惊讶于人们会为你做这么多事情。

最后一句话:你并不孤单

正如我前面提到的,我还没有遇到过一个程序员在他们职业生涯的某个阶段没有经历过主要的倦怠期。因此,如果这篇文章教会了你一件事,那就是你不是一个孤立的案例。

小心对待你自己和其他人,要知道无论此刻是什么让你情绪低落,这都不是你的错

在数据科学之旅中,你应该写博客的 7 个理由

原文:https://towardsdatascience.com/7-reasons-you-should-blog-during-your-data-science-journey-4f542b05dab1?source=collection_archive---------45-----------------------

和建议让你开始

艾玛·马修斯数字内容制作在 Unsplash 拍摄的照片

书面交流是必要的。考虑到在我写这篇文章的时候(Covid time)没有太多的面对面交流,这一点尤其正确。如果你仍然试图进入数据科学领域,你可以通过写博客来提高这一技能。

在这里,我将与您分享博客的好处,以帮助您的数据科学之旅。之后,我会给你提供写博客的建议和其他一些呼应这一信息的文章。

1.提高你解释概念的能力

照片由 Gradikaa Aggi 在 Unsplash 上拍摄

正如我的一位教授告诉我的:

“学习东西的最好方法是教它”。

在我看来,判断你是否理解一个概念的真正测试是你向别人解释它的难易程度。博客提供了练习解释概念的方法。如果你纠结于这个解释,那也没关系。这同时给你提供了一个机会来强化你对这个概念的理解。

也请记住,你将不得不在你未来的职业生涯中与各种各样的观众交流你的工作。这将包括你的同事,以及几乎没有技术或数学知识的股东(如果有的话)。博客可以作为一个安全的平台来练习与这些受众交流。

2.增加你的社区曝光率

照片由凯尔·格伦在 Unsplash 上拍摄

如果你的工作留在本地机器上,世界上没有人会知道你的工作。如果你想让人们知道你在做什么,你需要走出去,那就是万维网。如果你还没有写博客,不要担心你的第一篇是否完美。主要的想法是开始,其他的事情随后就会发生。

3.打开机会

马修·T·雷德在 Unsplash 上的照片

人们会注意到你的帖子。这可能不会马上发生,但他们会的。通过我的一些旧博客帖子,我得到了一家出版公司的关注,该公司出版关于数据科学和其他技术领域的书籍和课程。找到我的那家公司的人认为我写得足够好,他想雇用我为 Tensorflow 制作一个在线课程。但是,如果你只是把所有的工作都放在本地机器上,这种机会的几率将永远为零。

4.帮助他人,即使是多年以后

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

你会惊讶于一篇文章的影响力有多大。我写的第一批博客文章之一是关于网络搜集的。这引起了印度一位微生物学家的注意,他试图在自己选择的地点复制我的例子。在我用他的例子帮助他之后,他让我写下一篇关于他的例子的博客文章。所以我得到了帮助别人的好处,同时也获得了另一种可以写的经历。

我大约一年前写的一些博客帖子今天仍然对人们有帮助。我仍然会收到关于我的帖子如何为某人澄清了一个概念或者为他们提供了有趣的想法的消息。当我写这篇文章的时候,我刚刚在 LinkedIn 上收到一条消息,说有人觉得我写的这篇前一篇很有趣!

5.间接为自己建立参考

照片由凯拉·杜洪在 Unsplash 上拍摄

经验累积分布函数是我在探索性数据分析中经常使用的图表。但是如果很长一段时间我不使用它,我会忘记创建它的确切代码。在我关于重构数据科学代码的帖子中,我使用了我为 ECDF 创建的函数,我可以在将来随时引用它。每当我需要使用 ECDF 很长一段时间后,我总是回到那个职位,以获得代码。

你也可以对你的文章做同样的事情。它可以是任何东西,从一个简单的函数到你发布的整个机器学习管道的代码。你的观众的参考也是你的参考。

6.反思过去的经历

照片由兰迪·雅各布在 Unsplash 拍摄

冒名顶替综合症是一种信念,认为自己不够好,即使你的技能与此相反。回头看看你的帖子会提醒你你有什么能力。它们将提醒您在数据科学之旅中所做的所有艰苦工作。它会提醒你,即使有些人不这么看,你也足够优秀。

7.为你未来的职业生涯提高你的写作技巧

尼克·莫里森在 Unsplash 上拍摄的照片

我在这个领域工作的时间不长,但是我写了相当多的数据科学方面的文章。如果你想让不同技术背景的人理解你的工作,书面交流是一项技能。写博客将帮助你掌握这种技巧,因为你不得不考虑你的用词和写作,因为你要把听众记在心里。也许我在我的位置上写作的目的应该是下一篇博文?你怎么想呢?

博客建议让你开始

照片由莫妮卡·梅尔顿在 Unsplash 上拍摄

既然我们已经讨论了好处,让我们快速讨论一下如何开始。以下是帮助你与世界分享你的第一篇文章的建议列表。

  1. 找个平台:找个让你舒服的地方。我坚持使用 Medium,因为它是免费的,写作工具对我来说足够了,我阅读了他们的大量帖子,考虑到我有一个家庭,我只有这么多时间。如果你想要另一个项目,你可以建立自己的博客网站。你不能马上写博客,但这将是你可以与未来雇主分享的又一个项目。
  2. 选择任何你觉得可以解释的小概念/话题:你不必在第一篇博文中解释整个机器学习工作流程及其背后的数学原理。可以像概率分布、图表类型、您最喜欢的库或如何编写 Python 类一样简单。同样,我的第一篇文章是一个简单的网页抓取的例子。那里没有什么新奇的东西,但它打开了通向更多的大门。
  3. 选择一个你喜欢谈论的话题:这是上述话题的另一种选择。如果你喜欢谈论一些冗长的东西,比如机器学习算法背后的数学或你热衷的项目,那就写下来!这里的主要目标是开始。
  4. 不要担心你的帖子是否完美:写作是一种技能。和其他事情一样,它也需要练习。我个人认为我还需要继续努力。但如果你不开始,你甚至不会变得更好。
  5. 每月至少写一次博客:对我来说,这是一个合理的目标,我希望我能更快地实现它,这样我就有更多的一致性。你需要保持一些博客的一致性,以建立对世界的自我暴露。如果你能并且想写得更频繁,那么一个月一次也可以!
  6. 在发表你的文章之前,大声朗读出来:这是我学会的帮助我检查我的帖子和我写的任何文章的方法。由此,你可以抓住机会优化文章并解决语法错误。

其他数据科学博客参考

我不是第一个写博客如何帮助你进入数据科学及其好处的人。第一个给我建议的数据科学家也推荐了博客。如果你仍然不相信,看看接下来的几个帖子。第一篇文章是大卫·罗宾逊写的,他主动分享了我的前几篇文章,帮助我获得了曝光率。

[## 给有抱负的数据科学家的建议:开一个博客

上周我在 Twitter 上分享了一个想法:当你已经写了三次相同的代码时,写一个函数,当你已经给了…

varianceexplained.org](http://varianceexplained.org/r/start-blog/)

这篇文章描述了作者每周写一次博客的好处。

[## 我从一年来每周写一篇数据科学文章中学到了什么

关于写作和数据科学改变生活的力量的课程

towardsdatascience.com](/what-i-learned-from-writing-a-data-science-article-every-week-for-a-year-201c0357e0ce)

感谢阅读!你可以在 Linkedin 和 Twitter 上关注或联系我。对 Twitter 上的 DM 开放。

那么你还在等什么?开始写博客吧!记住…

照片由艾玛·马修斯在 Unsplash 上进行数字内容制作

直到下一次,

约翰·德杰苏斯

防弹、可复制机器学习的 7 条规则 R&D

原文:https://towardsdatascience.com/7-rules-for-bulletproof-reproducible-machine-learning-r-d-45ceb71e3322?source=collection_archive---------26-----------------------

我精心挑选的明星级研发最佳实践。确保不要错过第三条!

照片由 Unsplash 上的米娜 FC 拍摄

所以,如果你是一个精通键盘的开发人员,这个类比很有可能超出了你的舒适区…请原谅我。

想象一下,两个奥运会级别的花样滑冰运动员日复一日地在冰上一起工作,发展和完善赢得奖牌的表演。每个人都有他或她的角色,他们同步工作以合并他们的行动并微调结果。每一个微小的变化都会影响到对方的动作——有望改善他们的舞蹈,但往往会毁了它。随着时间的推移,他们建立了一个持续的沟通渠道,以确保每个人都知道对方在做什么,从而获得一致的、不断改进的结果。

机器学习代表了一种奇怪的相似动态,其中你的模型和代码加入训练数据,协同工作,产生预期的结果。优化之路——就像溜冰者的路——由小的调整驱动,这些调整需要系统地反复尝试(反复尝试),小心翼翼地。但是每一次变化、每一次调整和每一个新的攻击角度也为错误、混乱和不一致的推论打开了大门。简而言之,缺乏有纪律的结构和计划导致可重复性的不足,很快限制了 ML 的发展。

即使上面的比喻对你来说太老套,在任何业务用例中处理 ML 都应该让你点头。下面是我避免这些陷阱和优化再现性的 7 条指导方针:

0.你的代码不是“自我记录的”

除非您使用非常高级的解决方案,否则产生 ML 模型需要编写代码。专业代码库的基础是适当的结构和可靠的文档。

尽管如此,任何浏览过 GitHub 上开源作品的人都可以证明,我们总是不能很好地做到这一点。我的“第零准则”不是简单地遵守 PEP8 (请遵守!)或者适当的函数命名(你介意吗?).

我们必须认识到,由于我们开发的流程依赖于大量的配置,因此应该强制执行它们的文档和适当的内务管理。

然而,在由于“过早工程化”造成的生产力损失和进一步研究代码的可用性之间的平衡是有价值的。

1.保持跟踪并继续下去

任何成功的数据科学团队的第一条家规是有效的版本控制

机器学习比其他开发学科更依赖于版本控制,因为我们在过程的两个组成部分中利用它:代码和数据。ML 开发的流动性要求数据科学家频繁地修改和优化模型,以及用来训练这些模型的底层数据。

数据科学家和软件本身都必须从每次迭代中学习,然后调整模型以适应预期的数据集。因此,每个迭代都必须被记录和存储,最好使用自动机制来减少手工日志记录的开销。

ML 开发的这个关键方面并不止于此;当作为一个团队工作时,开发人员共享他们的模型和数据以节省时间,互相学习,并避免重复的、多余的工作。

没有有效的、持续的版本控制,可复制性的动态过程往好里说是复杂的,往坏里说是不可能的。

2.苹果对苹果

再现性是 ML 模型开发的核心因素,取决于可比性。如果不能比较模型 A 和模型 B 的培训结果,就无法知道哪些变化导致了结果的改善或下降

根据定义,研究迭代需要在两轮之间进行变更。然而,在实验时,模型之间的架构和逻辑差异是有实际限制的。如果模型的结构不相似,由相同的核心逻辑驱动,但只有细微的差异,就没有办法知道在实验中需要关注什么因素来改进。

您的管道设计应该公开您的更改,并且实际上便于将它们与性能更改联系起来。

3.没有“U”和“I ”,就不能拼出 Production

cloudvisual.co.uk 在 Unsplash 上拍照

前一个准则还扩展到 R&D 和生产之间的接口。如果培训和服务(生产)环境不匹配,即使是最精心设计和仔细审查的模型也可能失败或返回意想不到的结果。

尽管如此,模型还是有严格的性能要求,以及与其余业务逻辑集成的必要性。这些通常会导致最终的实现与研究代码完全不同

当这种情况发生时,模型的创建者很难找到故障,甚至是常见的基本问题。除非有足够的理由这样做,否则生产环境应该完美地模仿孕育模型的环境。

但是不幸的是,由于这种情况很少发生,数据科学团队应该在移交过程中尽可能地与 DevOps 合作。在项目生命周期的早期开始这种协作。

4.针对数据源中的不一致性制定计划

研究和开发是在真实世界数据的子集上完成的。您的用例越依赖时态数据,您就越需要处理模型不匹配的常见问题。

尽管如此,还是要注意【管道债务】的存在:用于提取和格式化数据的机制会随着时间而改变。在这个过程中,即使是一个很小的特性依赖,也足以改变数据,从而改变结果,打破逻辑…由此,您可以根据模型的成功或失败做出推论。

因此,再现性真的始于源头。一个经验丰富的 ML 数据科学家从来不会想当然地认为他或她的数据是“纯净的”和一致的,并检查(经常!)在数据的获取和格式化中没有关键的依赖性发生变化。

虽然模型性能的突然失败是一个幸运的指标,但通常数据的变化只会引发结果中令人困惑、分散注意力且可避免的异常,必须进行调查。

在代码中清楚地指出所有的依赖关系有助于防止这种情况;还建议进行管道测试。

5.测试不仅仅是“度量”

虽然我们的第零指导方针提到了软件开发的最佳实践,但是我们只是讨论了子组件的测试,而不是曲线下面积的意义。这是软件 R&D 的另一个基本方面,在 ML 中通常会避开,但实际上不应该。

粗略地解释,在 ML 开发的每一个阶段,你必须能够确保你对代码库或数据的更改没有引发需要进一步解决的问题。

重要的是要记住,这种测试心态适用于你工作的两个方面。首先是对单个独立组件(单元)的持续审查,以确保对特定构建模块的更改不会产生意外结果。用于预处理的代码就是一个很好的例子,因为这个问题会产生瀑布效应。

同样重要的是,(贵!)在真实世界模拟中测试整个代码库——模型及其数据和配置——有助于防止各种因素的组合产生次优结果

6.追踪,再追踪

模型的再训练和改进很大程度上依赖于结果的跟踪、记录和比较。手动日志记录的缺陷有很多——它会导致人为错误、结果的本地化存储(因此不可访问)、数据格式或帧的变化,以及最糟糕的是,完全或根本无法做到这一点。

使用自动化管道在后台提供持续的结果收集,无需研究人员或开发人员的努力。

为了保持一致性,这些元数据是标准化的,并且经常可以使用图形图表工具自动进行比较,以快速明确一组结果与另一组结果的不同之处。

最后,这些结果是集中的,因此,连同它们的标准化格式,它们可以被团队中的其他人利用。

7.使用一个平台来真正地将它们联系在一起

由马文·迈耶在 Unsplash 上拍摄的照片

因此,我们已经讨论了版本控制和跟踪的许多重要方面(除了测试之外)。遵循以前的指导方针所需的基础设施组件现在已经可以作为开源解决方案获得。

然而,将单个组件组装到一个平台上进行合作研究并不是一件容易的事情,还取决于你的团队的职业道德。

根据经验,选择一个现成的实验平台来自动完成遵守这些准则所需的大部分工作是一个不错的选择:你面临着难以置信的挑战,推动你的创造力和技术技能来构建一些独特、强大、值得他们支付给你的钱的东西。

当您可以部署一个包含最佳实践和简化流程的解决方案时,就没有理由失去重点、牺牲质量和重新发明轮子。

关闭

这些是我的 7 条(实际上是 8 条)机器学习研发的黄金准则。最后一条实际上是结论:使用一个为你保留准则的平台。

当然,在实际部署模型时,需要考虑更多的方面,尤其是监控和日志记录。

每个项目和每个开发人员都是独一无二的,所以我很想听听你的经验,什么是最重要的…留下评论吧!

原载于 2020 年 10 月 5 日https://allegro . ai

数据科学项目开始时应该包括的 7 个设置

原文:https://towardsdatascience.com/7-setups-you-should-include-at-the-beginning-of-a-data-science-project-8232ab10a1ec?source=collection_archive---------16-----------------------

为了在不同的运行中保持输出稳定并加快开发速度

Emile Perron 在 Unsplash 上的照片

在从事数据科学项目时,通常在开始时会有一个设置配置,以确保所需的依赖关系,保持输出稳定,并准备常用功能。

项目设置示例,来自 Handson-ML2

在本文中,您将了解 Juypter 笔记本中一些最有用的项目设置

  1. 确保 Python 版本
  2. 确保包版本
  3. 避免绘制模糊的图像
  4. 在不同的运行中保持输出稳定
  5. 启用多个单元格输出
  6. 本地保存绘图的功能
  7. 下载数据的功能(如果需要,还可以解压)

源代码请查看我的 Github repo 。

1.确保 Python 版本

在 Jupyter 笔记本中检查 Python 解释器版本

**import sys
sys.version**'3.7.6 (default, Jan  8 2020, 13:42:34) \n[Clang 4.0.1 (tags/RELEASE_401/final)]'

为了确保您的项目以 Python 解释器的最低版本要求运行,您可以将以下内容添加到项目设置中。

# Python ≥3.7 is required
**import sys
assert sys.version_info >= (3, 7)**

要求 Python ≥ 3.7。如果不是,它将引发一个assertion error

2.确保包版本

要检查已安装的软件包版本,例如 TensorFlow

**import tensorflow as tf
tf.__version__**'2.0.0'

以确保您的项目使用最低 TensorFlow 2.0 运行。如果不是,它将引发一个assertion error

# TensorFlow ≥2.0 is required
**import tensorflow as tf
assert tf.__version__ >= "2.0"**

3.避免绘制模糊的图像

Juypter Notebook 中的默认绘图可能看起来很模糊。

例如,一个简单的热图来查看哪里缺少值(请查看源代码和来自的数据集准备,使用 Pandas pipe 函数来提高代码可读性以获得详细信息)。

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline# Default figure format png
sns.heatmap(df.isnull(), 
            yticklabels=False, 
            cbar=False, 
            cmap='viridis')

默认图看起来模糊

在上图中,文字看起来真的很模糊, 列中的缺失值看起来太忙, 上船 列中的缺失值完全无法辨认。

要解决这个问题,请使用

  • %config InlineBackend.figure_format = 'retina'
  • 或者%config InlineBackend.figure_format = 'svg'

%matplotlib inline之后

%matplotlib inline
**%config InlineBackend.figure_format = '****retina****'**         # or 'svg'sns.heatmap(df.isnull(), 
            yticklabels=False, 
            cbar=False, 
            cmap='viridis')

图形格式设置为 retina 或 svg

与前一个相比,现在清楚多了,可以看到 已装载 列中缺少的值。

4.在运行过程中保持输出稳定

在数据科学项目中,随机数被用在许多地方。例如

  • train_test_split()Scikit-Learn
  • np.random.rand()初始化权重

如果随机种子未重置,则每次调用都会出现不同的数字:

>>> np.random.rand(4)
array([0.83209492, 0.10917076, 0.15798519, 0.99356723])
>>> np.random.rand(4)
array([0.46183001, 0.7523687 , 0.96599624, 0.32349079])

np.random.seed(0)使随机数可预测:

>>> np.random.seed(0)
>>> np.random.rand(4)
**array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])**
>>> np.random.seed(0)
>>> np.random.rand(4)
**array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])**

随着种子复位(每次),每次都会出现相同的组数字。所以项目应该在不同的运行中保持输出稳定。

5.多单元输出

默认情况下,Jupyter 笔记本不能从同一个单元格输出多个结果。要输出多个结果,可以用 IPython 重新配置 shell。

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

6.将绘图保存到文件

Matplotlib 的一个很好的特性是能够使用savefig()方法保存数字。但是,如果给定的路径不存在,它将引发一个错误。

plt.savefig('./figures/my_plot.png')**FileNotFoundError: [Errno 2] No such file or directory: './figures/my_plot.png'**

最佳实践是将所有图形放在一个地方,例如我们工作区中的figures文件夹。我们可以使用操作系统 GUI 或者运行 Juypter Notebook 中的 magic 命令来手动创建一个figures文件夹,但是最好创建一个小函数来完成这个任务。如果需要一些自定义图形设置或需要附加子文件夹来对图形进行分组,这尤其有用。

这是将绘图保存到文件的功能。

import os
%matplotlib inline
import matplotlib.pyplot as plt# Where to save the figures
PROJECT_ROOT_DIR = "."
SUB_FOLDER = "sub_folder"    # a sub-folder
IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "images", SUB_FOLDER)**def save_fig(name, images_path=IMAGES_PATH, tight_layout=True, extension="png", resolution=300):**
    if not os.path.isdir(images_path):
        os.makedirs(images_path)
    path = os.path.join(images_path, name + "." + extension)
    print("Saving figure:", name)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format=extension, dpi=resolution)

现在当您调用save_fig('figure_name')时,它会在您的工作区创建一个 images/sub_folder 目录,并在该目录下将图形保存为“ figure_name.png ”。此外,还提供了三种最常用的设置:

  • tight_layout自动调整支线剧情填充。
  • extension允许以多种格式保存数字。
  • resolution可用于设置图形的分辨率。

7.下载数据(如果需要,还可以解压)

对我们来说,使用互联网上的数据并不罕见。我们可以使用 web 浏览器下载它,并运行命令来解压或解压缩文件,但最好创建一个小函数来完成这项工作。如果数据定期更改,它尤其有用,因为它允许您编写一个小脚本,您可以在需要获取最新数据的任何时候运行该脚本(或者您可以设置一个计划作业,定期自动执行该任务)。如果需要在多台机器上安装数据集,那么自动获取数据的过程也很有用。

这是下载和解压数据的函数

import os
import tarfile
import zipfile
import urllib

# Where to save the data
PROJECT_ROOT_DIR = "."
SUB_FOLDER = "group_name"
LOCAL_PATH = os.path.join(PROJECT_ROOT_DIR, "datasets", SUB_FOLDER)**def download(file_url, local_path = LOCAL_PATH):**
    if not os.path.isdir(local_path):
        os.makedirs(local_path)

    # Download file
    print(">>> downloading")
    filename = os.path.basename(file_url)
    file_local_path = os.path.join(local_path, filename)
    urllib.request.urlretrieve(file_url, file_local_path)

    # untar/unzip file 
    if filename.endswith("tgz") or filename.endswith("tar.gz"):
        print(">>> unpacking file:", filename)
        tar = tarfile.open(file_local_path, "r:gz")
        tar.extractall(path = local_path)
        tar.close()
    elif filename.endswith("tar"):
        print(">>> unpacking file:", filename)
        tar = tarfile.open(file_local_path, "r:")
        tar.extractall(path = local_path)
        tar.close()
    elif filename.endwith("zip"):
        print(">>> unpacking file:", filename)
        zip_file = zipfile.ZipFile(file_local_path)
        zip_file.extractall(path = local_path)
        zip_file.close()
    print("Done")

现在当你调用download("http://a_valid_url/housing.tgz")时,它会在你的工作区中创建一个 datasets/group_name 目录,下载 housing.tgz ,并在这个目录中从中提取 housing.csv 。这个小函数也适用于 CSV 和文本文件。

好了

感谢阅读。

请在我的 Github 上查看笔记本的源代码。

如果你对机器学习的实用方面感兴趣,请继续关注。

你懂数据的 7 个标志

原文:https://towardsdatascience.com/7-signs-you-are-data-literate-4a844efcdd32?source=collection_archive---------50-----------------------

你有能力处理数据的迹象

布鲁斯·马斯在 Unsplash 上的照片

作为一名数据科学家,理解你的数据是必须的。没有先进的算法或奇特的机器学习模型可以取代一个人分析数据的能力。这意味着,要成为一名伟大的数据科学家,你应该精通数据。

为什么需要了解你的数据?通过分析,企业每天都在应对变化以及由此产生的不确定性。每天的变化和不确定性促使企业加快行动。一家成功的企业应该行动足够迅速,但不够鲁莽。在这里,数据科学家研究情况,进行并找到根本原因分析,评估替代方案,并实施解决方案。企业越快收集足够的数据进行调查,就能越快做出合理的决策。这就是为什么要成为伟大的数据科学家;我们需要理解数据。这也意味着你需要精通数据。

什么是数据素养?根据维基百科,数据素养是指阅读、处理、分析和论证数据的能力,因此数据素养意味着你拥有数据素养知识或者至少在数据素养知识上采取行动。数据素养还包括从事与数据相关的工作的能力。当然,衡量读写能力的方法有很多。尽管如此,这里是我从人们身上看到的数据素养的标志。

“数据素养是指阅读、处理、分析和论证数据的能力”

1.你很好地表达了你的观点

你明白展示给你的是什么东西,你应该如何与他人沟通吗?。我看到的一个迹象是,懂数据的人能够很好地表达自己的观点。没有过于复杂的解释,仅仅是临界点。

阿尔伯特·爱因斯坦曾引用过,

如果不能简单的解释,说明你理解的不够好。——阿尔伯特·爱因斯坦

理解,我的意思是人们可以处理他们得到的信息;这并不意味着他们此刻需要了解一切,但至少,他们可以从信息中得到一个要点。当人们不理解的时候,往往会在解释中放太多的词作为掩护。只有当一个人足够理解的时候,他们才能把他们的经历变成一个简单的理由。如果你能很好地表达你的观点,这是一个很好的数据素养的标志。

2.你不容易被信息淹没

数据无处不在,你很容易被淹没在其中。就拿现在疫情的情况来说吧。我们有很多关于新冠肺炎的信息,从疾病信息,疫情带来的经济痛苦,到如何洗手。我认识的许多人被这个消息弄得不知所措,甚至不知道哪个是真的哪个是假的。

被淹没的信息可能会让你忽略许多重要的事情,并被其他事情分散注意力。在处理数据时,我们总是需要记住什么是业务问题,什么信息是必不可少的。在日常生活中能够很好地管理信息的人有能力成为伟大的数据科学家。

3.你根据数据采取行动

数据素养的重要性在于你可以理解数据并根据信息采取行动。虽然外面有这么多信息,你可以在头脑中很好地处理这些数据,然后根据这些数据采取行动

例如,你想从网上商店买一台电脑。你看,外面有很多选择,所以你首先要做的是“我需要什么样的笔记本电脑?”;你可以说这是为了游戏目的,然后从那里,你试图在互联网上找到哪一个是最好的游戏笔记本电脑,但在你的预算内。你如何定义最好?你可以试着通过许多好的评论来设置它,所以你打开许多技术网站来看别人的评论。你在收集评论,并根据数据决定最好的。

上面的过程就像定义问题(博弈)和范围(预算)->收集数据(回顾)->采取行动。你可能会认为这是一件很平常的事情,但是很多人甚至懒得收集数据。

最后,虽然基于数据产生合理的行动需要领域知识和业务洞察力,但是如果您在采取行动之前尝试了合并数据,那么您的方法是正确的。

4.你行动很快,但不要太快

企业发展迅速;这意味着业务决策需要更快地做出。让事情变得不确定的是何时行动。在数据较少的情况下过早行动无疑是鲁莽的,但等待大量数据可能为时已晚。决定何时采取行动是数据素养所需要的。这就是为什么需要快速响应变化是数据科学家的基本思维模式。

以约会为例;你可以说,如果你向一个刚认识几天的人求婚是鲁莽的,尽管等待太久才采取行动可能意味着某人可能会被另一个人带走。你可能想要收集足够多的关于对方的数据来决定你是否要更进一步。“足够”可以是任何东西;可能是你的价值观或者只是身体特征。如果我把它比喻成一个业务,你可能会说“足够”的部分是在你采取行动之前需要完成的业务数据的基本部分。

5.你对数据感兴趣

虽然有些人被这些数据弄得不知所措,但有些人却直接无视这些数据。他们不关心世界上发生的事情,甚至不去了解最新的信息。在隔离期间,我感到惊讶的是,我的朋友甚至不知道需要聚合酶链式反应测试拭子来确认新冠肺炎是否肯定感染了某人。虽然我不想评判人们的生活方式,但我只是感到惊讶。

有数据素养的人应该会对数据感兴趣。我的意思并不是说他们需要开始到处挖掘数据,但至少是想随时了解最新情况。

此外,我认识的一些数据专家总是对数据可视化艺术感兴趣。他们对数据感兴趣,并不断探索如何以最优雅的形式呈现数据。这是因为他们希望数据可以很好地交流,每个人都可以从数据中获得有价值的信息。

6.你和数据争论

当你在网上的评论中寻找论据时,你会发现很多都是毫无根据的评论或者纯粹是恶作剧。它与现实生活没有太大的不同;在我那里,许多人只会根据他们的感觉或他们此刻的想法来争论,而懂数据的人会根据数据而不是毫无根据的东西来争论。

在业务环境中,数据科学家是数据驱动型业务的驱动者。在数据驱动的业务中,许多元素需要被说服,以便你的业务是数据驱动的(是的,数据驱动的业务涉及许多需要被说服的人)。要做到这一点,数据科学家需要对数据有所了解,以便建立一个合理的论点。

与数据争论比我们想象的更难,因为它需要理解数据,并很好地沟通,这样信息才会被接受。与数据争论也需要很大的责任,因为我们需要澄清我们拥有的数据符合正确的标准。我本人喜欢在有机会的时候与数据争论,但如果我没有足够的证据,我宁愿保持沉默。

7.你质疑事物

在一个充满信息的世界里,每天你都会受到新数据的轰炸。虽然许多是正确的,但有些信息肯定是假的,或者只是无关紧要。懂数据的人会质疑他们得到的信息;“是真是假?”,“对我到底有没有用?”“我需要这些数据吗?”等。

有数据素养的人也是渴望信息的人,这就是为什么他们不断质疑事物以获取新事物。这可能是他们感兴趣的东西,或者只是搜索引擎建议的一个随机想法。

如果我们在商业环境中思考这个问题,你可能已经完成了你的分析并得出了答案,但是这个答案是真的吗?或者你已经建立了最精确的机器学习模型,但是这个模型真的可以在现实世界中实现吗?这是数据科学家工作时经常遇到的情况,也是作为数据科学家应该问的问题。尽管如此,你仍然需要找到那个折中点,因为这个问题可能是无穷无尽的。

结论

我已经提出了我个人对数据素养的看法,或者至少在这方面有天赋。他们善于沟通,不会被信息淹没,使用数据采取行动,与数据争论,采取行动足够快但不鲁莽,对数据感兴趣,并质疑事物。

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

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

每个商业领袖都需要从软件工程师那里学到的 7 课

原文:https://towardsdatascience.com/7-skills-that-every-business-leader-needs-to-learn-from-software-engineers-be26a2869e12?source=collection_archive---------30-----------------------

这不是关于成为一个极客。至少,不完全是

生活的教训可以来自软件工程师。制造者在 Unsplash 上 NESA 的照片

B B 企业领导者总是在学习。因为总有进步的空间!

但是他们也需要提高他们的学习对象。

向投资者学习很棒。许多天使投资人在前世已经建立了自己成功的企业。所以他们给出的建议是无价的。

向他们的销售人员学习也是一个很好的选择。从他们那里,他们可以了解到消费者喜欢他们产品的哪些地方,还有哪些地方需要改进。

向管理团队学习至关重要。他们向领导者反馈他们的商业愿景转化为绩效的情况。此外,他们总能从经理的软技能中学到一两件事。

但是有一个团队经常被商业领袖忽略。这支队伍理应出类拔萃——但由于其书呆子气的装扮,他们独特的技能常常被忽视。

不要提高你所学的东西。提高你向谁学习

你猜对了。IT 团队。

从它所提供的许多角色中,我将在这个故事中把重点放在软件工程师上。

他们通常比开发人员更有经验。他们不断与他们的经理交流。这使他们成为学习的理想群体。

1.好奇心

一个好的工程师像新生的孩子一样好奇。鉴于技术总是在不断变化,这对于与他们的技能保持一致至关重要。

但工程师的好奇心与商业领袖的好奇心有着本质的不同。

一个领导者可能会对他们业务的新方向感到好奇,而一个工程师会对如何转向那个方向感到好奇。领导者对即将推出的新产品感到好奇,而工程师则对如何制造该产品感到好奇。

领导者对“什么”很好奇。一名工程师对“如何”感到好奇。

这正是一个领导者可以学到更多东西的地方。伟大的领导者与平庸的领导者的区别在于,他们不仅对“什么”好奇。他们也思考“如何”。

以埃隆·马斯克为例。他对“什么”非常好奇:向火星和更远的地方发射火箭。但他也对“如何”感到好奇。这让他将 SpaceX 的火箭材料从碳——这是今天的标准——改为不锈钢。

马斯克不可能独自想出那个解决方案。但他听取了工程师的意见,并从他们对新材料的好奇心中学习。

工程师的好奇心在于“如何”,而不在于“什么”。procylink 访客管理系统在 Unsplash 上拍摄的照片

2.耐心

大多数商业领袖都有远见。然后,他们制定了一个三年计划来实现这一愿景。然后……他们制定了这个三年计划,并在三个月内完成。

[## 创业公司如何将三年目标变成 90 天计划

过多的长远眼光会导致短期的失败

marker.medium.com](https://marker.medium.com/how-startups-turn-a-three-year-goal-into-a-90-day-plan-979c155b2b20)

不耐烦是他们的美德。为了把事情做大,领导们尽量把事情做快。

但这有个问题。显而易见,你应该在读下去之前就知道…

好事需要时间。如果你想写一段惊人的代码,你需要投入几周的时间。工程师知道这一点。

同样,如果你想建立一个惊人的企业,你至少需要投资几个月。商业领袖没有意识到这一点。

在创纪录的时间内完成令人惊讶的事情在理论上听起来很棒。这确实发生了——但这是例外。98%的大事都需要很长时间。

平庸的商业领袖希望所有事情都在昨天之前完成。伟大的领导者从他们的工程师那里学到:你在一个项目上工作,直到它完成。不管需要多长时间。只要你每天都在进步,你就在朝着正确的方向前进。

3.教学

平庸的领导者认为他们的愿景不言自明。伟大的领导者无时无刻不在教学。

他们教他们的用户他们的产品如何工作。苹果的主题演讲就是一个很好的例子。

他们教给投资者他们的生意是如何运作的。这对于保持投资者的信任至关重要。

他们教员工如何实现他们的愿景。这是生意兴隆的秘方。

但是为什么领导可以从工程师那里学到那么好的教学技巧呢?

我们回头以埃隆·马斯克为例。他不仅从他的工程师的好奇心中学习,这使他重新思考他的火箭的材料。

他还希望每个工程师都对整个项目有一个了解。这需要大量的教学,从领导者到高级工程师,一直到初级水平。

马斯克不只是教他的工程师。在这个过程中,他学会了如何教授——通过观看工程师们互相教授。

鉴于 T4 对 SpaceX 公司目前的估值超过 300 亿美元,这种教学努力似乎非常值得。

平庸的领导说教。伟大的领导者教导。

伟大的领导者教导。照片由克里斯蒂娜·帕帕罗在 Unsplash 拍摄

4.注意细节

作为一名领导者,了解全局至关重要。迷失在细节中的前景是可怕的。所以很多领导跳过细节。

这是一个巨大的错误。任何工程师——即使是初级开发人员——都知道这一点。当你编码时,一个忘记的分号或者一个错误的缩进都会导致你漂亮的项目崩溃。

类似地,一份推介材料中的一个错别字就足以让投资者逃离领导者。一个小小的错误会让领导显得邋遢、懒惰、注意力不集中。那不会建立信任。

可悲的是,许多领导者完成了粗糙和肮脏的事情,并把小事情——如纠正打字错误——委托给他们的助手。

但是你永远不会看到一个软件工程师写了一段肮脏的代码,然后把它交给他们的初级开发人员去清理。因为效率低。

等到初级开发人员理解了代码是如何工作的,然后清除了所有的错误时,可能就是圣诞节了。想想在工资和基础设施方面有多少钱。

[## 为什么除了计算机科学家,其他人都写马虎代码的四个原因

五次黑客攻击让你的更干净。

towardsdatascience.com](/four-reasons-why-everyone-except-for-computer-scientists-writes-sloppy-code-b8505254e251)

然而,如果工程师自己投资几个小时,成本会下降到一个零头。对于工程师来说,从事如此低级的任务似乎很愚蠢——但就成本而言,这是值得的。

在软件方面很明显的是,直接转化回业务。当领导者的助手在球场上纠正错误时,领导者已经把球场打磨了三遍。

平庸的领导者关注大局。伟大的领导者知道细节也很重要。

5.有效沟通

大多数领导者都擅长沟通。毕竟,他们需要让人们相信他们的愿景。

软件工程师是伟大的沟通者吗?大多数人不会这么说。典型的 IT 成员坐在房间最黑暗的角落里的笔记本电脑前,说话时甚至都不抬头。

但这并不意味着他们不擅长交流。他们只是不怎么做。软件架构师有效地沟通。

有效沟通并不意味着大量沟通。

想想你上一次公司会议。有多少是空洞的废话?三成?六十?八十?

让我们假设有 15 个人参加会议,平均时薪为 20 美元。如果会议持续了一个小时,而百分之六十的时间都是废话连篇,那么公司就把 15 * 20 * 0.6 = 120 美元变成了空气。如果这些会议每周召开一次,那么每年就有 120 * 50 美元= 9,000 美元的浪费!

不幸的是,许多商业领袖说话像政客——他们真的很擅长空洞的废话。

软件工程师擅长保持沉默。不仅如此,重要的时候他们还会说话。

少说话,多说。

这是每个商业领袖的关键技能。

少说话,多说。由 Austin Distel 在 Unsplash 上拍摄

6.闲话少说

这一条与上一课有关。你多久会看到软件工程师边喝咖啡边闲聊?管理者呢?投资人?

你会认为你的经理应该对他们的团队保持谨慎。他们不是。如果你曾经见过两个经理在喝咖啡休息时感觉没人注意,你知道我在说什么。

投资者 98%的时间都花在八卦上——要么制造八卦,要么消费八卦。真正优秀的投资者会尽量减少流言蜚语——但他们中的大多数人不会被打扰。

软件工程师不八卦。

当然,他们会为一个让他们失望的朋友或者今天早上的交通状况而发泄。他们也是人。但是他们所说的 98%都是有用的东西,没有废话

不幸的是,商业领袖经常模仿他们的投资者的沟通方式,而不是他们的 IT 团队。他们为什么这么做?

因为在他们看来,投资者拥有更大的权力。是他们给他们钱让他们发展业务,是他们在每个重大决策中都有发言权。另一方面,IT 团队处于接收端。他们执行公司目标,并以此获得薪水。

所以从表面上看,像投资者一样交流是有意义的。像强者一样行事,你自己也会变得强大——这是座右铭。

但是正如第五点所指出的,这导致了金钱的浪费。更糟糕的是,这破坏了人们对他们作为领导人的信任。毕竟,当有人在你背后笑的时候,你怎么能假设他们说的是真话呢?

像软件工程师一样去做,成为更好的领导者。闲话少说。

7.分析,而不是瘫痪

商业领袖每天都面临着决定公司成败的决策。在 90%的情况下,他们需要快速行动。太可怕了。

为了做出正确的决定,领导者需要建议。但为此,他们依赖于人们所说的。他们依赖流言蜚语。

软件工程师永远不会依赖流言蜚语。如果他们想知道方案 A 或方案 B 哪个更好,他们会进行测试。然后他们让性能数据自己说话。

软件工程师所做的一切都基于定量分析。有问题吗?分析一下!需要选择解决方案?分析一下!

许多投资者依赖流言蜚语。许多商业领袖模仿他们。这是做出糟糕决定的必然方式。想要证据吗?80%的企业家在头 18 个月失败。

伟大的商业领袖密切关注他们的软件工程师如何做决策。他们如何关注实质,而不是流言蜚语。

并以此引领他们的公司走向成功。

[## 给商业领袖的软件工程笔记

你对软件开发的假设阻碍了你的业务。你需要问三个问题来帮助你前进。

medium.com](https://medium.com/nick-tune-tech-strategy-blog/a-note-to-business-leaders-on-software-engineering-178adf2a81f4)

向极客们学习

你会想到那些在你办公室最黑暗的角落里,眼睛疲惫的电脑虫们有培养更好的商业领袖的秘方吗?

他们自己可能也不会这么想。但是我们可以从彼此身上学到很多东西。尤其是极客们。

每个数据科学家都应该知道的 7 种统计分布,以及直观的解释

原文:https://towardsdatascience.com/7-statistical-distributions-that-every-data-scientist-should-know-with-intuitive-explanations-bf967db81f0b?source=collection_archive---------7-----------------------

对正态分布、伯努利分布、二项式分布、泊松分布、指数分布、伽玛分布和威布尔分布的直观解释,以及 Python 示例代码

每个数据科学家都应该知道的 7 种统计分布。卢克·切瑟在 Unsplash 上拍摄的照片。

统计分布是数据科学中的一个重要工具。分布通过给我们一个变量最有可能获得的值的概念来帮助我们理解一个变量。

此外,当知道一个变量的分布时,我们可以做各种概率计算,来计算某些情况发生的概率。

在这篇文章中,我分享了 7 种统计分布,并给出了在现实生活中经常出现的直观例子。

1.正态或高斯分布

正态或高斯分布可以说是最著名的分布,因为它出现在许多自然情况下。

正态分布的变量有一个平均值,这也是最常见的值。越接近平均值的值越有可能出现,越远离平均值的值越不可能出现。

正态分布的特征还在于平均值周围的对称变化,用标准差来描述。这意味着较高的值和较低的值一样普遍。

平均值为 0,标准差为 1 的正态分布。

正态分布的例子可以在许多自然的连续变量中找到。例如,动物的体重或身高将遵循正态分布,因为大多数动物都是平均体重,有些稍微偏胖或偏瘦,但没有那么多动物非常瘦或非常胖。

人类的智商也是正态分布的一个非常著名的例子,平均值为 100,标准差为 15。大多数人智力一般,有些人稍聪明或稍不聪明,少数人非常聪明或非常不聪明。

2.二项分布

伯努利分布描述了一个概率事件,它只重复一次,并且只有两种可能的结果。这两种结果通常被称为成功,或 1,和失败,或 0(你可以把一切都称为成功或失败,取决于你看什么)。

因此,这种分布非常简单。它只有一个参数,就是成功的概率。

一个著名的例子是掷硬币,我们可以称任何一方成功。成功的概率是 0.5。这将导致下图:

成功概率为 0.5 的伯努利分布。

但是 50/50 不是伯努利分布的一部分。伯努利分布的另一个例子是射中靶心的概率。要么在里面,要么不在,所以这是两种结果。对于一个糟糕的飞镖运动员,成功的概率可能是 0.1,给出如下分布:

成功概率为 0.1 的伯努利分布。

3.二项分布

二项式分布就像伯努利分布的兄弟。它模拟了在重复伯努利实验的情况下成功的次数。因此,我们关注的不是成功的概率,而是成功的次数。

二项式分布的两个参数是实验次数和成功概率。一个抛硬币十次的基本例子是,实验次数等于 10 次,成功概率等于 0.5。这给出了每 10 次成功的概率如下:

概率为 0.5 和 10 次重复的二项式分布。

二项式分布的另一个例子是在给定的一周内发生交通堵塞的概率,已知在给定的一天内发生交通堵塞的概率是 0.2。这是在 5 个工作日重复 1 个伯努利是/否变量,因此参数为:实验次数为 5,成功概率为 0.2。下面的结果图显示,最有可能出现 1 次交通堵塞,然后是 0 次,然后分别是 2 次、3 次、4 次和 5 次。

概率为 0.2,重复 5 次的二项分布。

4.泊松分布

泊松分布描述了固定时间范围内的大量事件。您可以考虑的事件类型是每 15 分钟进入商店的顾客数量。在这种情况下,我们将 15 分钟作为一个固定值(单位时间),这样我们就可以在其余的计算中忽略它。

在这种情况下,每个单位时间会有平均数量的顾客进入,这被称为比率。这个速率称为λ,它是泊松分布所需的唯一参数。

在下面的例子中,速率λ是 4,所以平均每单位时间(在这个例子中是 15 分钟)发生 4 个事件。在图中,我们可以看到 3 或 4 个事件是最有可能的,然后计数向两边逐渐减少。任何超过单位时间 12 次的事件都变得不太可能,以至于我们在图上看不到它们的条形。

泊松事件的其他例子可以是在特定位置通过的汽车数量。此外,几乎任何具有单位时间计数的事物都可以被认为是泊松分布。

5.指数分布

指数分布与泊松分布相关。泊松分布描述单位时间内的事件数量,指数分布描述事件之间的等待时间。

它采用与泊松分布相同的参数:事件率。然而,在某些情况下(尤其是在 Python 的 Scipy 中),人们更喜欢使用参数 1 /事件率。

你应该把 x 轴看做单位时间的百分比。在泊松例子中,我们说单位时间是 15 分钟。现在,如果我们在 15 分钟内有 4 个人,我们最有可能为每个新人等待 0.25 分钟,或这个单位时间的 25%。15 分钟的 25%是 3,75 分钟。

6.γ分布

伽马分布是指数分布的变体。它不是描述事件之间的时间,而是描述等待固定数量事件的时间。

它需要两个参数:指数分布的 lambda 参数,加上一个 k 参数,表示要等待的事件数。

举个例子,你可以想到一个景点公园,它只能在满了,比如说 10 个人的时候推出一个景点。如果他们的事件率是平均每 2 分钟有 4 个顾客进来,他们可以使用伽玛分布来描述推出景点的等待时间。

在下图中,我们可以看到顶部大约是 2.5。这意味着,平均下来,10 个人的等待时间是 2 分钟单位时间(即 5 分钟)的 2.5 倍。这是有意义的,因为我们每单位时间有 4 个人,总共需要 10 个人。

图表中有趣的是,我们可能要等待 6 倍的单位时间,所以(6 乘以 2 分钟=) 12 分钟。这远远超过了平均 5 分钟的时间,等待最先到达的顾客可能太长了。

伽马分布的其他例子是你必须等待 x 个事件的一切,假设这些事件不一定同时发生。

当 Gamma 分布用于等待时间时,如本例所示,它也称为 Erlang 分布,但我不会在此详述。

7.威布尔分布

威布尔分布是另一种分布,它是等待时间问题的变体。它描述了一个事件的等待时间,如果该事件随着时间变得更可能或更不可能。

一个明显的例子是计算机的寿命。你可以等一段时间,直到你的电脑太旧,坏了。你用电脑的时间越长,它就越有可能坏掉。所以失败的概率,或者说比率,并不是恒定的。

威布尔分布有两个参数。首先,泊松和指数分布中的速率参数。其次是 c 参数。c 为 1 意味着存在恒定的事件率(因此这实际上是一个指数分布)。高于 1 的 c 意味着事件率随时间增加。c 低于 1 意味着事件发生率随时间而降低。

如果我们采用与泊松例子中相同的λ值(λ= 4),并且我们为 c 增加 1.1 的值(因此速率随时间增加),我们得到以下结果:

感谢您阅读这篇文章。我希望你喜欢它!

7 个统计测试来验证并帮助拟合 ARIMA 模型

原文:https://towardsdatascience.com/7-statistical-tests-to-validate-and-help-to-fit-arima-model-33c5853e2e93?source=collection_archive---------6-----------------------

尼古拉斯·托马斯在 Unsplash 上拍摄的照片

什么是 ARIMA?

在处理单变量时间序列时,ARIMA 模型是最经典和最广泛使用的统计预测技术之一。它基本上使用滞后值滞后预测误差来预测特征值。

完整的 ARIMA(由普拉蒂克·甘地创作)

  • AR: 使用先前值的滞后
  • I: 非平稳差分
  • 马: 移动平均 为误差项

其中一些术语在处理时序数据时非常常用。如果我们深刻理解这些术语或数据的组成部分,ARIMA 模型可以准确地拟合。以下是其中的几个例子:

趋势:

当数据中存在增加或减少方向时,数据被认为具有趋势。例如,夏季期间航空乘客的增加、工作日期间顾客数量的减少等。

克里斯·利维拉尼在 Unsplash 上拍摄的照片

季节性:

如果数据受外部因素影响,则认为数据具有季节性模式。例如,树叶的生长和掉落是由大自然母亲的天气/季节驱动的。

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

周期性:

如果存在重复但非周期性的波动,则认为数据具有循环成分。简单来说,如果图案是因为某种情况造成的,没有设定的时间量,就可以认为是周期性的。例如,由于特定事件的发生,股票市场表现出具有高点和低点的循环行为,并且这些峰值之间的时间从来都不精确。

白噪声:

这是时间序列的随机和不规则部分。换句话说,从信号中提取趋势+季节性+周期性后的残差,大多被认为是白噪声。白噪音最好的例子是当你在 90 年代失去与电视的天线连接时(是的,我是一个 90 年代的孩子!).

由弗兰·雅克耶在 Unsplash 上拍摄的照片

平稳性:

具有常数均值零方差的时间序列被认为是平稳的。当考虑平稳性时,我脑海中总会浮现一个众所周知的图像:

https://beingdatum.com/time-series-forecasting/

我用来解释这些测试的包主要有:

  • stats models:https://www.statsmodels.org/stable/index.html
  • 普姆达里玛:http://alkaline-ml.com/pmdarima/index.html

有很多测试,但我将谈谈我使用过的一些,它们帮助我解决了时间序列问题:

1.增强型迪基-富勒(ADF)试验:

应该使用变换技术(对数、移动平均等)使时间序列平稳。)在应用 ARIMA 模型之前。ADF 检验是一种很好的方法,也是最广泛使用的技术之一,用于确认序列是否平稳。数据可以在卡格尔上找到。下面是代码:

非平稳数据与平稳数据的差异及其 T 统计量

为了使数据稳定,我们对数据进行了一些转换(如上面的代码所示)。在计算 t 统计值时,我们看到该值是显著的,并确认数据现在是稳定的!

2.PP 测试:

PP 代表菲利普斯-佩龙试验。在某些情况下,需要用 ARIMA 的 I 来表示积分。I=1 或 2 的差值通常起作用。这种 PP 检验是一种单位根检验,以确认时间序列是按照顺序 1 整合的。如果要检查平稳性,这也是 ADF 测试的替代方法。它们在金融时间序列的分析中变得相当流行[3]。下面是代码:

这将返回一个布尔值(1 或 0),表明该序列是否稳定。

3.KPSS 测试:

计量经济学中广泛使用的测试是科维亚特科夫斯基-菲利普斯-施密特-辛特,或简称为 KPSS 测试。这个测试与 ADF 非常相似,可以帮助验证零假设,即一个可观察的时间序列在一个确定的趋势周围是平稳的。虽然它有很高的 I 型错误率,但是它有一个很大的缺点。在这种情况下,通常建议将其与 ADF 测试结合使用,并检查两者是否返回相同的结果4。代码类似于 ADF 测试,如下所示:

非平稳数据和平稳数据的区别

从上图中我们可以看到,在应用变换之前(图 A),数据的 p 值< 0.05 ,因此它不是稳定的。转换后(图 B)p 值变为 0.1 to。确认数据的平稳性。

在我们进入下一个测试之前,重要的是要知道 ARIMA 模型可能包含季节性成分,这可以通过在我们的 ARIMA 方程中增加一些参数(P,D,Q,m)来处理。我们可以将 ARIMA 型模型大致分为两种类型:

  1. ARIMA :如开头所述处理非季节性组件
  2. 萨里玛 : S 季节成分 + ARIMA

4.CH 测试:

Canova Hansen(CH)检验主要用于检验季节差异,并验证零假设,即季节模式在一个样本期内是稳定的,或者是随时间变化的。这在经济或气象数据中非常有用[5]。这已经在 pmdarima 库中用 Python 实现了。

5.OCSB 测试:

Osborn,Chui,Smith 和 Birchenhall (OCSB)检验用于确定数据是否需要季节差异(P,D,Q,m 的 D 分量)。 pmdarima 包有一个预定义的功能,用户可以利用如下功能:

这里,我们将 m = 12 定义为月度数据。‘AIC’是绩效评估的默认 lag_method (越低越好)。参考此处的了解其他可接受的指标。这个数据的输出是 1,因为我们已经知道季节性成分是明确可见的。

6.分解绘图:

当你遇到时间序列问题时,这是一个非常有用的工具。我认为这个功能类似于医生在你第一次出诊时测量生命体征。由于生命体征可能表明患者的一些明显情况,分解图给出了数据的细分,并显示是否有任何明确的趋势、季节性和残差模式。下面是代码片段和输出结果:

分解图:显示原始数据(顶部)、趋势、季节和残差(底部)的子图

7.ACF 和 PACF 图:

ACF 和 PACF 图分别代表自相关图和偏自相关图。ACF 和 PACF 图有助于系统地确定时间序列平稳化后所需的 AR 和 MA 项。以下是 ACF 和 PACF 图的代码:

航班乘客数据的自相关图

航空旅客数据的偏自相关图

落在蓝色阴影区域内的滞后被认为不显著。基于 ACF 图,我们可以说它是 AR13 模型,意味着具有 13 个滞后的自回归将有所帮助。基于 PACF 图,我们可以说它是 MA2 模型:移动平均线有两个滞后。有一些方法可以解读这些图,并很好地估计 ARIMA 模型的阶数。

结论:

除了上面列出的,还有许多其他的统计测试可以使用。然而,我在这里提到的测试/工具对于理解数据和拟合精确的 ARIMA 模型来说是非常强大的。

这是我第一次尝试写一篇关于媒介的文章。我从我的作家同事和社区中学到了很多,这是我认为最好的方式来分享或回报我的一些经验给他们。

参考资料:

— — — — —

  1. https://otexts.com/fpp2/stationarity.html
  2. https://en.wikipedia.org/wiki/Decomposition_of_time_series
  3. https://faculty . Washington . edu/ezi vot/econ 584/notes/unit root . pdf
  4. https://www.statisticshowto.com/kpss-test
  5. https://ja lobe . com/testing-for-seasonal-stability-canova-and-Hansen-test-statistic/

使用 R 运行线性回归分析的 7 个步骤

原文:https://towardsdatascience.com/7-steps-to-run-a-linear-regression-analysis-using-r-d5897a66b835?source=collection_archive---------6-----------------------

我学会了如何用蛮力在 R 中做回归分析。通过这 7 个复制和粘贴步骤,你也可以做到。

照片由兰斯·安德森在 Unsplash 上拍摄。

我的经理认为我知道如何使用 r 进行回归分析。所以,为了保住我的位置,我决定用整个周末来学习如何做。把这篇文章看作是一个速成班介绍,学习如何用蛮力去做一件事。

跳到你想读的部分。下面的目录:

  • 第一部分 | 我开始写这篇文章的知识范围
  • 第二部分 | 我如何搜索我的资源
  • 第三部分 | 回归提示:向工程师学习
  • 第四部分 | 7 复制&粘贴步骤使用 R 运行线性回归分析
  • 第五部分|下一步:改进你的模型

开始写这篇文章时,我的知识范围

首先,为了建立基础,让我告诉你我对回归了解多少,以及我能在 r 中做些什么。

我对周末线性回归的了解是:

  • 该方程的格式为:y=ax+b,其中 y 为因变量,x 为自变量,a 为系数,b 为常数/y 截距。我知道这些术语的意思。
  • 这是一种计算自变量 x 对因变量 y 的影响的方法。为了做到这一点,您需要使用现有的数据,并根据该方程测试所有情况,以找到最合适的 a 和 b,从而预测您没有数据的 y 值。
  • 您可以添加任意数量的独立变量,并为每个变量附加一个系数,以查看每个变量对因变量的影响。也就是说,太多的变量不会改善模型,在某些情况下还会损害模型。
  • 最好将数据标准化,以便使用 0 到 1 之间的值。这样,由于独立变量的性质,系数不会很小或很大(例如,4634 天和 13 年是可以在同一个模型中使用的两个变量,但因为它们的大小如此不同,系数可能会有偏差)。

周末我能做的是:

  • dplyr 中的基础数据角力(mutatefilterselect、管道运算符%>%summarize、点占位符、group_byarrangetop_n)
  • dplyr 中的图(plothistboxplot)
  • ggplot2 中的图(几何图、facet_grid、时间序列图、轴变换、stratifyboxplot、斜率图)
  • 到目前为止,我所知道的关于 R 的一切都是从我参加的两门在线课程中学到的(1。 R 基础知识,2。可视化。

第二部分|我如何搜索我的资源

我是如何想出这个周末该关注什么的。

1.在学习 R 基础知识时,r-bloggers 对我来说是一个很好的资源,所以我决定从那里开始。我谷歌了一下“r-bloggers 回归”

谷歌搜索“r-bloggers 回归”结果

这是我想到的前四个链接:

  1. https://www . r-bloggers . com/how-to-apply-linear-regression-in-r/
  2. https://www.r-bloggers.com/linear-regression-using-r/
  3. https://www.r-bloggers.com/regression-analysis-using-r/
  4. https://www . r-bloggers . com/linear-regression-from scratch-in-r/

2.我浏览了每一个结果,并决定把重点放在第二个结果上,因为我在页面的底部看到它提到它将告诉我如何解决“现实世界的商业问题”

我选择引用的博客中的一段话。

我点击了链接“下一篇博客”,结果!"预测跳出率的基础上,在谷歌分析页面加载时间."因为我还没有提到,在这里要注意:我是在性能广告领域,所以这确实是我的拿手好戏。他们甚至做了一个 part 3 上的改进模型!

我已经找到了这个周末我要关注的事情。我要在这里汇编我学到的任何东西!

第三部分|回归技巧:向工程师学习

我和一位工程师进行了一次非常有益的谈话,这位工程师在周末解答了我的问题,我想和你分享一些他分享的技巧。总之,运行回归分析只是评估某些数据是否与其他数据有关系的调查的开始。在这种背景下,这里有一些方法可以确保你得出一个诚实的分析,并帮助你找出下一步。

  • 将数据标准化,以便尽可能公平地比较系数。虽然没有固定的方法来比较自变量之间的系数,但标准化数据至少可以让你看到自变量对因变量的影响。这是一个很好的研究起点:一旦你发现一个系数比另一个系数大,你就可以开始研究是什么导致了任何“高”系数。如果不对数据进行标准化,则每个值的范围可能会很大,从而导致系数的范围也很大,以补偿较大值的权重。
  • p 值显著性是确定性的指标。即使一个系数很高,如果没有统计意义,往好了说是没有意义,往坏了说是毁了模型。(参见这篇博文中的“星号”部分,了解如何解读 p 值。)
  • 运行回归时移除异常值,然后在创建模型后,使用每个异常值测试模型,以比较因变量的预测值和真实值。这可以让你看到你的模型有多健壮。如果离群值的误差很低,那么这个模型就大获全胜;如果误差仍然很高,那么您可以简单地继续断言它们是异常值这一事实。
  • 除了查看总体误差,查看每个数据点的误差也很重要。通过这样做,你可以深入了解为什么某个点或一组点可能比其他点有更大的误差的任何原因或趋势。
  • 废话进,废话出。没有好的数据,你就不会有好的结果。确保你知道你的数据来自哪里,并确保它是高质量的。

第四部分| 7 使用 R 运行线性回归分析的复制和粘贴步骤

所以我们在这里。是时候使用 r 实际运行回归分析了。

一般提示和说明:

  • 对于引入代码的每一步,我都添加了一个例子的截屏,然后添加了一个相同的代码块,您可以将其复制并粘贴到您自己的 R 脚本中。
  • 代码块适用于有 1 个独立变量的情况。如果有一个以上的自变量,请遵循 R 注释中的说明。
  • 在每个代码块中,我都用斜体包含了括号,您可以用自己的代码替换它们,比如:*[[insert your code]]*
  • 当你用你自己的代码替换时,确保你删除了括号和文本。这样做时,不要添加任何空格。
  • 使用我的截图作为指导,特别是如果你有一个以上的自变量。您可以在每个步骤中执行,或者在复制并粘贴所有内容后一次性执行。

开始了。

  1. 获取一个包含所有要测试的变量的数据集。选择要建模的因变量和自变量。所有好的回归都是从一个问题开始的。为了弄清楚你想要什么样的变量,问自己一个现实生活中的问题,以确定你需要什么。你想测试的关系是什么?
  2. 清理您的数据,并将其保存为 csv 文件 —删除所有不需要的变量列。在我的例子中,我想看看转换是否依赖于花费、影响、点击、usv 和 pv,所以我将保留这六个并删除其他所有内容。此外,请确保删除所有包含总计的行。清理后,保存为 csv 文件。

我回归分析要用到的数据。

3。用函数 **read.csv()**将 csv 文件导入 R Studio。(参见此[链接](https://osxdaily.com/2015/11/05/copy-file-path-name-text-mac-os-x-finder/#:~:text=Right-click (or Control%2B,replaces the standard Copy option)了解如何在 mac 上获取路径名。)

将 csv 文件导入 RStudio。

#import data from csv file
data <- read.csv('*[[insert your pathname]]*')

从 3055 行数据开始。

4。使用 tidyverse 中的 **drop_na()** 删除因变量的所有 NA 值。参见此处的了解描述该功能的参考。

删除所有因变量“Conversions”为“NA”的行

#install tidyverse if you don't have it already
install.packages("tidyverse")#launch tidyverse
library(tidyverse)#remove na values of independent variable
data <- data %>% drop_na(*[[insert column name of your independent variable]]*)

删除了因变量的 NA 值(转换)。行数减少到 142。你已经知道这不是最强的数据集。

5。标准化你的自变量。我在 R 中通过将每个独立变量除以它们各自的最大值来做这个。

使用 mutate 为每个独立变量追加规范化列。

#normalize data (add additional %>% for any number of independent variables you have)
norm_data <- data %>% 
mutate(*[[insert a simple name of independent variable]]*_norm = *[[insert column name of independent variable]]*/max(*[[insert column name of independent variable]]*,na.rm=TRUE))

为了分解我在上面所做的事情,让我们看看我对列 Spend 做了什么:mutate(spend_norm = Spend/max(Spend,na.rm=TRUE))

  • mutate():用于向现有数据集追加新列的函数
  • spend_norm=我的新专栏的名字
  • Spend/max(Spend):归一化公式
  • na.rm=TRUE:用于删除空值的参数

因为我用新名称改变了每一列,从而创建了 5 个额外的列,所以我使用了函数select() 以便只保留相关的列。

只选择我需要的数据。

#select relevant columns (add additional commas and variable names for any number of independent variables)
select_data <- norm_data %>% select(*[[insert column name of dependent variable]]*,
*[[insert new normalized column name of independent variable]]*)

将数据标准化。行数保持不变,仍然是 141,因为我只是将原始列换成了它们的规范化版本。

6。查找并删除异常值。

对于我的数据集,我使用的方法是不考虑第一个四分位数以下四分位数间距(IQR)的 1.5 倍或第三个四分位数以上 IQR 的 1.5 倍。见这里我用来确定这个的参考和我复制的函数。这里有两个小步骤:

  • 1.找出异常值。从原始数据集中为每个独立变量确定 IQR 和上/下范围
  • 2.移除异常值。从移除先前独立变量的异常值后获得的更新数据集中,仅选择落在步骤 1 中找到的上限和下限之间的数据。

我对每个独立变量重复这两步,最终得到子集removed5。请参见下面 RStudio 中的我的代码。(你会发现我没有以最有效的方式做到这一点。希望有任何建议能让这更有效率。)

去除每个自变量的异常值的两个步骤。前两个独立变量的屏幕截图。

去除每个自变量的异常值的两个步骤。第三、第四和第五个独立变量的屏幕截图。

#removing outliers
#1\. run this code to determine iqr and upper/lower ranges for independent variable
x <-select_data$*[[insert new normalized column name of independent variable]]*
Q <- quantile(x,probs=c(.25,.75),na.rm=TRUE)
iqr <- IQR(x,na.rm=TRUE)
up <-  Q[2]+1.5*iqr # Upper Range
low<- Q[1]-1.5*iqr # Lower Range#2\. run this code to select only the data that's between the upper and lower ranges
removed1 <- subset(select_data, 
select_data$*[[insert new normalized column name of independent variable]]* > 
(Q[1] - 1.5*iqr) & select_data$*[[insert new normalized column name of independent variable]]* < 
(Q[2]+1.5*iqr))#if you're curious, see the new boxplot
ggplot(removed1,aes(*[[insert new normalized column name of independent variable]]*)) + geom_boxplot()#this is the new dataset you'll be working with
View(removed*[[insert # of total independent variables you normalized data for]]*)########if you have two or more independent variables, copy and paste the code below as many times as you need:#2nd independent variable ranges - repeating #1 and #2 above
#1\. run this code to determine iqr and upper/lower ranges for independent variable
x <-select_data$*[[insert new normalized column name of independent variable]]*
Q <- quantile(x,probs=c(.25,.75),na.rm=TRUE)
iqr <- IQR(x,na.rm=TRUE)
up <-  Q[2]+1.5*iqr # Upper Range
low<- Q[1]-1.5*iqr # Lower Range#2\. run this code to select only the data that's between the upper and lower ranges
removed*[[insert # for what number independent variable you are on]]* <- subset(select_data, select_data$*[[insert new normalized column name of independent variable]]* > (Q[1] - 1.5*iqr) & select_data$*[[insert new normalized column name of independent variable]]* < (Q[2]+1.5*iqr))#if you're curious, see the new boxplot
ggplot(removed*[[insert # for what number independent variable you are on]]*,aes(*[[insert new normalized column name of independent variable]]*)) + geom_boxplot()#this is the new dataset you'll be working with
View(removed*[[insert # of total independent variables you normalized data for]]*)

移除所有独立变量的异常值,行数减少到 14。在这一点上,我不确定这些数据是否真的会对我有所帮助,因为这些行的数量很少,但是无论如何,我将尝试对它们进行回归。

7。回归时间!对数据使用 R 函数 **lm()** 回到我正在学习的原始帖子来了解你在这里做什么的解释。

此数据集的回归模型。

#add additional variables as needed with + sign
Model1 <- lm(removed*[[insert # of total independent variables you normalized data for]]*$*[[insert column name of dependent variable]]* ~
removed*[[insert # of total independent variables you normalized data for]]*$*[[insert new normalized column name of independent variable]]*)

您已经创建了您的模型!现在,为了汇总结果,运行回归的最后一段代码:

summary(Model1)

总结(模型 1):回归的结果显示了“转化率”和自变量之间的关系。

我上面提到的工程师看了这些结果,马上说:“是啊,你的数据很烂。”他说每个变量的 T1 与其 T2 相比都太大了。他还提到,对于只有 15 行数据的模型,使用 5 个变量是没有意义的。

但是没关系…我们做到了!万岁!

第五部分|后续步骤:改进您的模型

所以我们已经进行了回归分析!…但这并不是结束。俗话说“所有的模型都是错的,但有些是有用的。”因此,你的下一步是找出如何改进你的模型,以确保你拉的东西实际上是有用的。从本周末我所学习的系列文章的第三篇文章中,以及一篇更详细的文章的支持下,我发现函数regsubsets() 的组合以及经过调整的 R2、Cp 和 BIC 指标允许我们计算出你的数据集中有多少变量实际上对正在讨论的模型有用。这有助于任何有两个以上自变量的模型。

使用**regsubsets**函数来看看我的变量是否有用。

install.packages("leaps")
library(leaps)#add any number of independent variables that you need to the equation (note: this will not work if you only have 1 independent variable)
leaps <- regsubsets(removed*[[insert # of total independent variables you normalized data for]]*$*[[insert column name of dependent variable]]* ~ 
removed*[[insert # of total independent variables you normalized data for]]*$*[[insert new normalized column name of independent variable]]*,
data=removed*[[insert # of total independent variables you normalized data for]]*,
nvmax=*[[insert # of total independent variables you normalized data for]]*)summary(leaps)res.sum <- summary(leaps)
data.frame(
  Adj.R2 = which.max(res.sum$adjr2),
  CP = which.min(res.sum$cp),
  BIC = which.min(res.sum$bic)
)

为了用我上面链接的帖子的话来解释我在上面做的事情,这里有一个帖子的摘录:

R 函数regsubsets() [ leaps package]可以用来识别不同尺寸的不同最佳模型。您需要指定选项nvmax,它代表了要合并到模型中的预测值的最大数量。例如,如果nvmax = 5,该函数将返回最佳 5 变量模型,即返回最佳 1 变量模型、最佳 2 变量模型、…、最佳 5 变量模型。

在我们的例子中,数据中只有 5 个预测变量。所以,我们就用nvmax = 5( )来源 )

关于上面代码的后半部分:

summary()函数返回一些指标-调整后的 R2、cp 和 BIC(参见第[…]章)-允许我们确定最佳总体模型,其中最佳被定义为最大化调整后的 R2 和最小化预测误差(RSS、Cp 和 BIC)的模型。

调整后的 R2 代表结果中由预测值的变化所解释的变化的比例。调整后的 R2 越高,模型越好。 ( 来源 )

根据他们提到的每个度量标准,最好的模型在下面的代码块中,并产生下面的结果。

res.sum <- summary(leaps)
data.frame(
  Adj.R2 = which.max(res.sum$adjr2),
  CP = which.min(res.sum$cp),
  BIC = which.min(res.sum$bic)
)

基于这些结果,调整后的 R2 告诉我们,最好的模型是有一个预测变量的模型,Cp 和 BIC 标准也是如此。它说我应该把模型中的变量数量从五个减少到一个。这并不奇怪,因为我一开始只有 15 行数据。

就这样,我结束了我周末用 r 学习线性回归的大丰收。如果你和我一样,强行通过做来学习是了解一个主题的完美开端。我希望你和我一样从中获益匪浅。前进!

赢得垄断的 7 个策略

原文:https://towardsdatascience.com/7-strategies-to-win-monopoly-a89ead18b062?source=collection_archive---------6-----------------------

一个关于 Python、统计、可视化和童年记忆的故事

Raivis Razgals 在 Unsplash 上拍摄的照片

大富翁是世界上最受欢迎的棋盘游戏之一。它有许多不同的许可和本地化版本。孩之宝刚刚发布了一个更长版本的大富翁游戏,拥有三重属性,永远玩不完。

这是一款给人(好?)童年回忆。我以前在假期和亲戚的孩子一起玩,通常都是输。

我玩大富翁已经很多年了。但我真的想知道我是否可以打得更好,以增加获胜的机会。也许我能战胜困难。今天,我将分析我们如何最大化赢得垄断游戏的机会。

我们的分析涉及 Python、统计和可视化。

就像在现实世界中,游戏中的属性是不相等的。它们承载着不同的价值观和回报。许多人认为“Go”瓷砖前最昂贵的房产(Mayfair/Boardwalk 或 Blue 2)能给他们带来财富,而其他人更喜欢收集一整套铁路或公用事业。

代码可在 GitHub 上获得。

约定

  • 命名 :我们将根据黑板上的颜色来命名酒店,因为它们在全球的不同版本中有不同的名称。原来还有各种各样的配色方案,但是我们将按照价格的升序使用以下版本——棕色、天空、粉色、橙色、红色、黄色、绿色和蓝色。还有铁路公用事业
  • 标注 :我们用从 0 到 39 的整数来标注从 Go 到 Blue 2(即梅菲尔街/木板路)的每一个方块。
  • 成本 :投资房产的玩家支付 A)一次性土地 价格,以及 b)房价价格,如果他们决定建造一些的话。
  • 收入 :当对手拥有的财产落地时,玩家获得租金收入
  • 双打 :两个骰子有相同的数字。掷出双打的玩家可以再次掷骰子。

1.目标

a.韵律学

你希望在游戏中实现什么?你想赢。成为唯一的幸存者。挣钱。你想明智地投资能给你带来利润的房地产。我们正在到达那里。

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

投资一套房产,需要多长时间才能达到收支平衡?我在游戏中能赚多少钱?我们需要建立一些指标来衡量你的表现。

  1. 盈亏平衡点:你需要多少个对手回合才能收回你投入的资金?棕色的很便宜,但是要很长时间才能收回成本吗?蓝色的很贵,但也许我会很快收回投资?
  2. 预期利润:一个游戏中每套属性的预期利润是多少?如果一场游戏有无限多轮,我们很有信心蓝色的一轮会给你带来最多的利润。然而,当其他人的钱都用完时,游戏就结束了。蓝色的可能不值得在短期游戏中投资。

一组属性的性能取决于 a)收入,b)成本,以及 c)对手登陆的可能性。如果不知何故,你的对手有 2 倍的可能在地产 A 上着陆,即使 B 的租金更高,它也更值得投资。薄利多销

我们知道房产的成本和租金。它们写在他们的地契上。但是我们不知道它们的着陆概率。让我们找出答案。

b.方法—蒙特卡洛

我们将落地概率定义为玩家在回合结束时或下一次掷骰前(如果他们得到双倍)出现在牌上的概率。

游戏中影响落地概率的因素有很多。所有玩家在开始时从 Go(平铺 0)开始。他们在自己的回合中掷出一对公平的骰子,并相应地在棋盘上移动。因为掷出 7 比得到 2 或 12 更有可能,所以有些牌可能比其他牌被访问得更频繁。

Geoff Brooks 在 Unsplash 上拍摄的照片

当玩家落在不是属性的“临时”牌上时,他们会遵循该牌的规则,最终可能会出现在另一张牌上。

  1. 到达的玩家坐牢(平铺 30)显然是被送进了监狱(平铺 10)。
  2. 到达社区公益金 (CC)(牌 2、17 和 33)的玩家从 CC 牌组中抽取牌并相应移动。他们可能会留在目前的位置,但可能会被送进监狱。
  3. 到达机会(牌 7、22 和 36)的玩家从机会牌组中抽取牌并相应移动。他们可能会留在当前的牌,但也可能会被送去监狱、牌 5、11、24 或 39。他们可以后退三步。
  4. 连续三双的玩家被送进监狱。

你马上可以发现,登陆‘坐牢’的概率是。玩家不能留在这个瓷砖上而不被送进监狱。
*注意‘免费出狱’卡让玩家不用付钱给银行就能出狱,它们不能用来避免入狱

非常复杂。

我们可以使用马尔可夫链和一些巨大的矩阵来解析地找到着陆概率。您可以从每个起始方块解析获得落在每个方块上的条件概率。我们不会这么做的。

或者,我们可以通过蒙特卡洛模拟来估算着陆概率。蒙特卡罗方法通过重复随机抽样来近似分布。在这种情况下,我们可以模拟垄断游戏一百万次。我们记录玩家出现在每张牌上的频率。记录的频率是着陆概率的近似值。我们模拟的游戏越多,我们对近似值就越有信心。

但是如何?

c.实现—面向对象的编程

我们模拟棋盘。我们模拟玩家掷骰子,在棋盘上走来走去,以及使用面向对象编程的其他一切。我们正在用 Python 实现它,代码可以在 GitHub 上找到。

米罗斯拉夫·乔纳斯在 Unsplash 上的照片

垄断游戏中有两种对象棋盘和一些玩家。进行模拟时,玩家在棋盘上跑来跑去,通过掷骰子,有时在需要时从机会桌或社区公益金桌上抽牌。然后,玩家在每个牌上结束的概率可以通过蒙特卡洛模拟来近似。

某玩家有 1。状态:

  • a 当前在板上的位置 ∈ [0..39]
  • 一个双倍计数器,它计算连续掷出的双倍数∈[0]..3] 当一名球员连续掷出三个双打时,他会立即被送进监狱,并且计数器会重置
  • 监禁 布尔变量∈【0,1】区分‘只是探望’‘坐牢’

2。所有物:

  • 随机牌组 ∈ [0,1] 中的监狱自由牌,以及
  • 一张社区公益金∈【0,1】的监狱自由牌

3。记录

  • 落在棋盘上每块瓷砖上的事件总数,以及
  • 登陆监狱时“只是访问”和“在监狱中”的总次数。

玩家可以

  1. 掷骰子一对公平的骰子,
  2. 更新并记录他们的新位置
  3. 更新他们的其他状态所有物,以及
  4. 开始新游戏时清理他们的身份和财产。

另一方面,理事会

  1. 名称、物业类型、物业价格、房价、所有瓷砖的不同数量房屋的租金,以及
  2. 在游戏开始时将牌和牌洗一次,在这里可以取出和放回免战牌。

板可以

  1. 模拟一个玩家掷骰子的回合以及之后将要发生的一切,以及
  2. 模拟从每副牌中抽一张牌

迪伦·诺尔特在 Unsplash 上的照片

2.变量

a.着陆概率

让我们模拟一个四人垄断游戏一百万次。为了保持模拟简单,我们没有模拟玩家之间的货币交换或交易,因为这将使事情复杂化。

我们来定义一些变量。

对于一个 N 玩家垄断游戏,我们假设有 R ,其中每个玩家在每轮中进行游戏。对手回合总数为 (N-1)R 。我们假设每个玩家在一场游戏中玩相同的回合数,即没有玩家提前退出。

边注 1:按照官方垄断规则,连续双打算一次单回合。我们的模拟中仍然记录了每个替身的着陆。因此,对于每 100 圈,所有牌的预期落地数约为 119

照片由布雷特·乔丹在 Unsplash 上拍摄

为了获得更真实的近似值,我们将随机性添加到模拟中,其中一局游戏中的回合数 R 遵循平均值为 30 且标准差为 3 的高斯分布。平均值取自网上的一篇文章,方差是任意的。

蒙特卡洛模拟的主脚本

让我们用一个条形图来可视化每个瓷砖 s 的落地概率 p(s)

大富翁棋盘上牌的落地概率

哇。

我当然没想到会这样。着陆概率并不相等。我们可以观察到

  • 你有 0%的几率像预期的那样“进监狱”,
  • 你更有可能出现在 CC 牌上,而不是运气牌上,这可能是因为牌组中的牌组合不同,
  • 你有 6.31% 的几率最终进监狱,包括“只是探访”和“进监狱”两种情况,
  • 监狱最常去的瓦即使我们排除‘只是去看看’,
  • 布朗 1 号(老肯特路/地中海大道)最少光顾的房产有 1.98%的几率,
  • 红色 3(特拉法尔加广场/伊利诺斯大道)最常光顾的酒店,概率为 3.16%,这可能是因为将玩家送到该酒店的机会卡,以及
  • Orange 3(Vine Street/New York Avenue)和 Orange 2(Marlborough Street/Tennessee Avenue)是访问量最大的房地产竞赛的亚军,这使得 Orange 平均成为访问量最大的颜色集。这是因为他们经常被刚离开监狱的玩家访问,监狱是棋盘上被访问最多的地方。

也许棕色的那套不值得投资。也许橙色的是必须买的。我们在现阶段不能确定,因为我们没有考虑到他们的租金和成本。让我们也做那件事。

旁注 2 :监狱落地概率可能低估。我们假设一个玩家通过使用免罪卡或者支付 50 英镑/美元来出狱。他们不会试图不付钱就卷铺盖走人。这个假设在游戏开始时成立,但在游戏结束时不成立,因为呆在监狱里是避免付房租的最佳策略。

b.投资成本

房产的投资成本 c(s,h) 包括土地价格和房屋价格。不同的房产和上面建的房子数量有所不同。它们被硬编码到程序中。

每种颜色、铁路和公用设施的成本矩阵

请注意,我们考虑的是整个色彩组合的投资成本,而不是单个属性。这是因为房子只有在玩家拥有整套颜色时才能被购买。

我们还以类似的方式对租金收入矩阵 r( s,h) 进行了硬编码。

3.估价

a.盈亏平衡点

我们将资产的盈亏平衡点定义为预期的对手回合数收回投资所需的时间。这是通过总财产成本除以每个对手回合的预期租金收入计算出来的。财产的每个对手回合的预期收入与其落地概率和租金收入成比例。我们可以使用相同的逻辑,通过以下公式找出颜色集的盈亏平衡点。

我们还将增量盈亏平衡点定义为收回增量投资所需的预期对手回合数。这意味着如果玩家决定建造额外的房子,他们需要多长时间才能收回他们的钱。

让我们看看盈亏平衡点如何随着不同数量的房屋而变化。为了可视化的目的,5 个房屋对应于一个酒店。

每种颜色的盈亏平衡点作为房屋数量的函数

我们发现

  • 它需要最长的时间来收回你在棕色电视机上的投资,
  • 即使你投资了天空、橘子和 T21,也很容易收支平衡。
  • 与 1 或 2 个房子相比, 3 个房子的房子更容易达到收支平衡
  • 如果你投资绿色或蓝色系列中的第四个房子,你可能无法收回你的钱。

我们仅仅基于盈亏平衡点的比较,就想出了以下策略。你应该

  1. 忌棕色套、
  2. 用你所有的其他颜色快速建造 3 栋房子
  3. 建造天空中的第四座房子和/或橙色布景,如果你拥有它们的话。

蒂埃拉·马洛卡在 Unsplash 上拍摄的照片

b.预期利润

我们都知道游戏的目标不仅仅是收支平衡。

你想挣钱,想让对手破产。一台彩色电视机的利润是该电视机的总收入和总成本之间的差额。收益与对手回合总数成比例,而成本是常数。它们可以通过以下公式计算。

我们之前假设一局游戏中的回合数 R 或多或少是恒定的。对手回合数 T=(N-1)R 线性增加,因此收入(和利润 P )随着玩家人数的增加而线性增加。

让我们看看,如果你拥有不同的颜色组合和不同数量的房屋,你的利润会随着游戏中不同数量的玩家而变化。还绘制了持有所有 4 个站和持有所有 2 个公用事业公司的利润,以供参考。

N 人游戏中每种颜色的预期利润,N 在 2 到 7 之间

我们发现

  • 棕色的那套一文不值,
  • 在玩家开始建造房屋之前,获得 4 条铁路可以在游戏开始时给你带来快速的现金,
  • 建造第三座房子时利润大幅增加,
  • 橙色在双人游戏中占优势,
  • 红色、黄色和绿色也很有希望
  • 蓝色是普通的。

因此,您应该

  1. 避开公用设施,棕色或粉色
  2. 如果你一开始能负担得起,就把所有的 4 条铁路都拿走,不要坚持用其他财产来换取铁路的收藏,因为从长远来看做得不好
  3. 在双人游戏中,选择天空的和橙色的
  4. 在 3+玩家游戏中,选择橙色红色黄色
  5. 选择绿色的 4 人以上的游戏,
  6. 如果你有足够的现金储备,只在 4 人以上游戏中选择蓝色
  7. 快速建造 3 栋房子。这是关键。

由 Alexander Mils 在 Unsplash 上拍摄

4.外卖

总之,我们使用蒙特卡洛模拟法来估算着陆概率,以便计算在 N 人游戏中,在一定数量的房屋下,每个颜色集的盈亏平衡点和预期利润。基于上述观察和策略,我们总结出以下 7 个你应该遵循的策略

  1. 避免公用事业和棕色设置,
  2. 当获得铁路收集以获得短期收益时,或获得 4+玩家游戏中的蓝色设置以获得长期收益时,请注意您的现金储备,
  3. 根据游戏中玩家的数量选择橙色、红色、黄色和/或绿色,
  4. 为你拥有的每种颜色快速建造 3 个房子,
  5. 注意你的现金流,如果经济上可行的话,建造第四所房子来最大化你的利润,
  6. 避免购买旅馆,否则你会为对手腾出房子,因为一场比赛中只有 32 个房子
  7. 以不交钱的方式呆在监狱里,以避免后期交房租。

你应该对我们的分析持保留态度,因为我们做了很多假设,这些假设在某些情况下可能不成立。每个游戏都不一样,很难一概而论。考虑到不可预测的人类行为也是极其困难的,因为玩家被允许和鼓励彼此自由交易

有趣的事实

1.94% 的几率,你在一个回合后入狱。你可以在替身的帮助下点击“进监狱”,或者从任意一副牌中抽取“立即进监狱”牌。

千载难逢的机会。

一生一次机会的蒙特卡罗模拟

感谢阅读!同样,代码可在 GitHub 上获得。你也可以注册我的时事通讯来接收我的新文章的更新。如果您对 Python、统计或可视化感兴趣,以下文章可能会有所帮助:

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

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## 为什么样本方差除以 n-1

解释你的老师没有教过的高中统计学

towardsdatascience.com](/why-sample-variance-is-divided-by-n-1-89821b83ef6d) [## 使用交互式地图和动画可视化伦敦的自行车移动性

探索 Python 中的数据可视化工具

towardsdatascience.com](/visualizing-bike-mobility-in-london-using-interactive-maps-for-absolute-beginners-3b9f55ccb59)

最初发表于edenau . github . io

作为一名初级数据科学家,我在两年中学会了 7 件事

原文:https://towardsdatascience.com/7-things-ive-learned-in-2-years-of-being-a-junior-data-scientist-5652d5c71a49?source=collection_archive---------47-----------------------

我很想让我这个有抱负的数据科学家知道

LinkedIn 销售导航员在 Unsplash 上的照片

得到一份数据科学的工作是目标,但不是目的。第一天,你可能会发现自己置身于一群似乎一直都知道自己在做什么的人当中。老实说,这很可怕,而且一开始会让人不知所措。你努力学习和提高自己的技能,但就在你被录用并认为自己足够优秀的时候,自我怀疑再次袭来。

在我作为初级数据科学家工作的头几个月甚至几年里,我有过相当多的自我怀疑。尽管这让我对自己和这个职业有了更多的了解。这就是为什么我想与你分享我所学到的,希望你的自我怀疑会更容易控制。

如果你是一名有抱负的数据科学家,希望很快被聘用,这篇文章将帮助你了解当你开始职业数据科学家之旅时可能会面临的困难。了解潜在的问题是了解工作现实的好方法。

到目前为止,最重要的事情是要有条理,进行版本控制并记录你的进展

我的许多项目开始得非常慢。数据需要一段时间才能到达,有许多会议要参加,同时我做了一些辅助工作。这就是为什么在我的前几个项目中,我没有从保持一个可靠的文件系统开始,也没有记录我所做的事情。大错特错。当项目开始时,它开始了,一切都进行得如此之快。如此之快,以至于如果你还没有一个系统来跟踪你的进展,一旦项目开始,你可能就没有时间来设置它了。

现在我所做的是组织我的文件夹和文件,在行动开始前设置相关的版本控制环境。最重要的是,我养成了在笔记本上写标题和评论的习惯,甚至在我开始编码之前,这样当我开始编码的时候,我就知道所有东西都放在哪里了。
我还写每周进度日志,记下我每周做了什么,以及下周打算做什么。这样,我可以随时回顾过去,并刷新我对迄今为止所做的事情的记忆。哦,最重要的是,我学会了正确命名。让我告诉你,当你有 10 个不同的笔记本,上面有一个项目的不同部分,有着非常相似或不可描述的名字,并且在 2 个月的休息后试图找出哪个做了什么,这并不好玩。

对自己的能力要有信心,你知道的比你想象的多

当你刚开始工作时,感到不自信是很常见的。你周围的每个人似乎都知道自己在做什么,而你只是在努力学习诀窍。相比较而言,在这个岗位上干了多年的人当然比你懂得多。那很自然,但是你也知道很多。不要认为你的努力是理所当然的。

此外,你总是有机会了解更多。这份工作并不要求你记住所有的东西,而是要求你在需要的时候能够灵活地学习新的东西。这才是你真正的价值所在:具备能够快速学习新工具和技术的基础。

在你不确定的话题上做一些副业

单独或在小组中研究你不确定的话题是非常有帮助的。召集一些资历较浅的同事,说服一些资历较高的同事,一起开展一个副业项目。你的同事基本上就是资源。用他们的知识来提升自己。有一个你们一起工作的课外项目是很棒的。不会有时间,金钱或客户的压力。这将是学习的全部。如果你不能说服你的同事这样做,那就自己去做,也许当你谈论你学到了多少,你有多开心的时候,你的同事会想加入进来。

跟随你的上司并不可耻

你的主管很可能是一名高级数据科学家。如果不是这样,你可能应该找一个资深数据科学家做导师。这个人已经知道什么是商业智慧和技术智慧。这有点像幼狮看着父母学习捕猎。你需要观察和学习这个人。注意他们如何处理日常办公室事务,他们如何与客户交谈,他们如何向非技术人员解释技术问题,他们如何以及为什么对项目做出某些决定。确保在他们周围戴上你的观察帽。

倾听是关键

当我开始工作时,我意识到沟通在数据科学中非常重要。我只是没意识到它有多重要。不管是你的主管,你的客户,还是和你一起工作的团队的领导,你都必须注意他们所说的话。我确信这对许多职位来说都是正确的,但我发现对数据科学家来说尤其如此。这可能是因为数据科学家充当许多不同团队之间的中介,从组织的不同部分获取输入,并负责组合这些信息并从中获得意义。这就是为什么你需要学会倾听和监控你需要的信息。

问吧。全部。你的。问题。

我怎么强调都不为过。你不应该展示你不知道的东西,这是很自然的,但相信我,提问是成为更好的数据科学家的关键。没有人指望你知道所有的事情或者知道所有的答案,尤其是当你是一个大三学生的时候。当你不能马上给出答案时,可以随意说“我不知道”或“我需要再联系你”。如果有人使用你不熟悉的短语和术语,不要害怕问他们在谈论什么。隐瞒你不知道的事情只会妨碍你和某人的职业关系。毕竟,你在讨论中贡献了多少比你给人的印象有多渊博更重要。

相信你的直觉,但要有外界的支持

当你从事数据科学项目时,有许多决策点。我如何分离训练集和测试集,对分类变量使用什么类型的编码,在训练中包括哪些特征,生成哪些新特征…其中一些比其他的更重要,但它们都对最终的模型有影响。在某些时候,你不能到处去试图优化每一个决定。这就是为什么你需要相信你的直觉和你的经验(这在开始时非常少)来决定有时该走哪条路。我发现记下我做出的大部分(如果不是全部的话)决定和假设非常有用,以便能够追踪它们。如果在任何时候你感到不自信或困惑,把你的担忧告诉一个或多个同事,并讨论你的假设。你会从他们的经验和投入中学到很多。

正如你可能已经意识到的,这些要点中有许多是关于学习的。这是因为当你是一名数据科学家时,学习永远不会结束。这可能是你在考虑这个职业时应该记住的第一件事。初级数据科学家的很大一部分时间都花在寻找他们知识中的漏洞,试图修补漏洞,同时努力跟上最新的发展。

我希望这有助于你看到硬币的另一面,看看你开始工作后会发生什么。请在评论中告诉我,你是否希望在你从事数据科学的头几年里遇到任何其他困难!

您是否打算转行从事数据科学职业,但不确定从哪里开始? 通过我的网站免费参加我的数据科学入门课程。

本课程旨在帮助您:

  • 阐明您的数据职业目标,
  • 明白努力的方向,
  • 了解必要的技能,
  • 在您的学习旅程中做出明智的决定

此外,我每周发表文章、采访数据专业人员和免费资源,以帮助专业人员有效地将他们的职业生涯转向数据科学。如果你对你需要学习的东西感到迷茫,对所有声称自己是最好的课程感到困惑,觉得没有一门课程对你的目的来说足够完整,我的网站就是为你准备的。

培养强化学习者时要考虑的 7 件事

原文:https://towardsdatascience.com/7-things-to-think-about-when-developing-reinforcement-learners-71e6fa5434d9?source=collection_archive---------43-----------------------

在 Unsplash 上由 Franck V. 拍摄的照片

尽管我们在强化学习研究方面取得了很大的进展,但是仍然缺少一个统一的框架来比较这些算法。此外,研究论文中报告的指标没有提供足够的信息。在这里,我们讨论一些潜在的东西来使分析更加严谨。

我们都知道强化学习纸是如何工作的。研究人员 A 发布了一个算法 B,算法 B 在策略上选择的环境子集上优于其他“最先进”算法的子集,这些环境子集恰好对该算法工作良好。此外,作者可能会或可能不会优化基线的超参数,但反过来,报告算法 b 的最佳运行。

不去细说是什么导致了这种研究趋势,我们可以做一些事情来改善它。为了进行有效的比较,适当的算法评估指标(除了适当的基准之外)是必不可少的。大多数情况下,研究人员用来评估算法性能的是运行的平均性能,如果你幸运的话,他们甚至会报告中位数,这可能会提供更多的信息。虽然听起来有点愤世嫉俗,但我不得不说,与机器学习的其他子领域相比,RL 是面包和黄油,例如甚至没有多次运行算法(视觉人,我在跟你说话:)。

【https://uscresl.github.io/humanoid-gail/

因此,这篇文章是关于我们必须看什么来比较一种强化学习算法和另一种,一个很好的灵感来源是[1],其中作者建议了一种计算 RL 算法的各种度量的具体方法,但我们将更多地从顶层角度来看它,因为错综复杂只是更大目标的技术细节。

最直观的是,当一个人开发一个算法时,你应该看看它对训练过程中的各种因素有多敏感,比如随机种子和超参数。较少的可变性意味着算法更加稳定、健壮、可靠等。除了一般可变性之外,我们想要查看不同事物的最坏情况,即当有度量时,它在分布的较低尾部是什么。难怪[1]的作者从金融中获得灵感来定义具体的指标,因为事实证明我们也关心 RL 中的风险和可变性。总而言之,不同的“可靠性”类别可以分为以下几类:

http://www . IRI . UPC . edu/files/scidoc/2168-Learning-cloth-manipulation-with-examples . pdf

1.推广培训期间的可变性

理想情况下,我们希望有持续的、单调的改进。这意味着平均性能应该随着每次推出和推出内而增加,并且性能不应该随着推出而(显著地)变得更差。不幸的是,大多数情况下,RL 算法往往是不稳定的。可变性的来源可能是环境,所以您要做的是考虑环境中的随机性,并在指标中对其进行调整。理想情况下,你会
希望在训练结束时获得最佳表现,而不是在中途。

2.不同训练跑的可变性

训练的初始条件不应该显著影响算法的性能,这就是为什么在不同的训练运行中查看不同的随机种子是重要的(视觉人,我在看着你!).还应考虑对超参数的敏感性。

3.评估中各次展开的可变性

我们希望该算法在评估中产生类似的性能和行为。这显示了该算法如何处理环境的随机性和不同的初始化条件。还必须考虑到的是,在首次展示中可实现的最大性能可能取决于初始状态,也应该考虑到这一点。

4.培训推广中的短期风险

该算法应该在最坏情况下表现出一些保证。这在训练期间有安全考虑的情况下尤其重要。在短期情况下,我们希望算法的性能不会局部波动太大。有效地观察风险意味着观察(局部)分布最低尾部的期望值,低于某个百分点(假设为 5%)。

5.培训推广中的长期风险

纵观整个展示,我们希望缩小展示中最差和最佳性能之间的差距。与短期情况相比,这里我们将根据整个部署来拟合分布。我们很少在首次展示中获得最差性能的预期性能值,但这是可能的。显然,同样,这可能来自算法的不稳定性,也可能来自环境的特性。

6.训练中的风险

与 1 相反。我们在丢弃异常值后查看可变性的地方,这里我们想看看在低概率下会发生什么,我们得到一个非常差的种子或一组非常差的超参数。

7.评估时跨展开的风险

相比之下,3。点,我们在评估中查看许多部署的最差情况性能。同样,可变性的来源可能是算法,也可能是环境。

在开发强化学习算法时,这些都是需要考虑的好事情。获得这些指标后,可以使用标准的统计显著性测试来确定算法 A 是否优于算法 b。在研究论文中纳入这些指标可能会为科学家节省大量时间,并且还会引起现实的期望。不限于理科,如果你来自工业界,考虑这些方面可以帮助你决定针对你的具体问题选择哪种算法。

虽然我不完全同意[1]中所写的,但这是一本好书,作者提出了一些重要的观点。更重要的是,代码是开源的,因此您可以立即开始运行评估。

参考

[1]测量强化学习算法的可靠性,陈等,ICLR 2020

我们在视频标签工具中寻找的 7 样东西

原文:https://towardsdatascience.com/7-things-we-looked-for-in-a-video-labelling-tool-705968e39d19?source=collection_archive---------16-----------------------

以下是需要注意的问题和要问的问题:

2020 年 7 月, V7 Labs 发布了其视频标注工具。这是 6 个月开发旅程的一部分。以下是我们不得不注意的,这将不可避免地影响你的机器学习项目的质量。

1.视频帧质量:避免视频压缩

视频压缩,无论是 H264、H265,还是任何以. MP4 结尾的扩展名。AVI。MOV,几乎总是有损耗。大多数流媒体服务中使用的 H264 视频比未压缩的图像系列轻 20 到 200 倍,人眼很难注意到运动中的差异。

然而,当您捕获静止图像时,这种差异是显而易见的,并将影响您的注释质量和训练数据。

来源: Geeksforgeeks

视频压缩主要影响运动中的元素,并且在存在噪声(在黑暗场景中很常见)的情况下表现得非常糟糕。像 H265/HEVC 这样的现代视频压缩在处理较小的移动项目方面做得更好,但是它们仍然比它们应该的更断断续续和更像素化。这将最终影响模型检测运动中较小项目的方式,并学习在运动模糊中检测它们。

来源: Frame.io

你可能还需要注意的是帧采样。大多数视频以 30FPS 拍摄,但除非你正在测试快速对象跟踪算法,否则你不需要频繁地标记。大多数计算机视觉应用需要 2FPS 的高多样性数据集,或者 15FPS 的以人的速度进行实时跟踪(这不是移动的汽车,而是行走/互动的人)。我们已经内置了一个帧采样器,允许您调整视频的帧速率进行标记。这不会影响视频质量,但可以让你不用注释几乎相同的帧。

来源: V7 实验室

确保您使用的任何视频注释系统都允许您以全分辨率标记未压缩的视频帧。通常会避免这种情况,以确保视频可以流畅播放。以下是需要注意的事项:

问题:从原始文件中标记视频时,我们预计会有什么图像质量损失?

2.z 堆叠标签:是什么让视频编辑工具与众不同

早在 2004 年我 11 岁的时候,我的学校购买了一些现已不存在的 Macromedia Flash MX 的许可证。让 Flash 在当时脱颖而出,并导致 2000 年代中期动画和游戏创造性爆发的是它处理如此多同时移动的对象和运动图形关键帧插值的能力。

这是 Adobe Flash Professional 2016,它的化身在被弃用之前的最新版本。来源:Alan Becker flash 教程

类似地,像 Adobe Premiere Pro 或 After Effects 这样的专业视频编辑软件,凭借其可以支持的同步轨道数量,使自己与免费或开源的替代品区分开来。这给 UX 和工程带来了挑战,因为视频注释可能需要数百个同时出现的对象,在时间线中有独立的入口出口点。

Adobe Premiere Pro 中繁忙的时间线,有 11 个音频和视频轨道。我们将不得不处理 100+。来源:Adobe

这意味着我们不能像在视频编辑中那样使用基于轨道的时间轴,因为需要巨大的垂直空间。相反,我们选择在一个单独的层栏中定义重叠的注释,并让时间轴自动调整,以在一个狭窄的范围内适应尽可能多的注释。

我们的视频注释系统的画板草图。来源:V7 实验室,设计

我们选择了基于出现顺序的自动调整时间线,但是水平轨道可以在注释之间共享。这样,当一个对象退出框架时,下一个对象会出现在它的位置上。此外,关键帧会记住它们在时间上的位置,因此如果调整了注释的持续时间,关键帧也会相应地调整。

来源: V7 视频注释

问题:一个视频中可以同时出现多少个物体?
:确保每个都可以有一个在你界面上清晰可见的起点和终点。这将有助于 QA,因为时间错误是视频注释中最常见的错误之一,对网络性能非常不利。

3.关键帧:查看发生变化的地方

关键帧用于地球上的每一个视频编辑和动画软件。就像他们说的,如果它没坏,就不要修理它。
根据软件的用途,它们可能会被不同地处理。例如,在像 Adobe Premiere Pro 这样的视频蒙太奇软件中,它们处于后座位置,只有打开剪辑的设置才能看到。最终剪辑也是如此,一次只能看到一个片段。对于像 After Effects 或 Adobe Animate(ye olde Macromedia Flash)这样的动画软件来说,它们占据了中心位置,因为它们是动画师的主要交互模式。

来源:V7 实验室,Adobe.com,苹果

图像注释比视频编辑更接近运动图形。
在 V7 中,我们希望确保一个形状中的关键帧独立于另一个形状。因此,每个注释都有自己的一组关键帧,可以定义它们的位置、形状、属性或任何其他支持的属性,如可见/隐藏、遮挡等。

来源: V7 视频注释

我在视频编辑套件中发现令人沮丧的事情是错误地在错误的帧中编辑属性,丢失了一个关键帧,所以我们让每个都成为可点击的快捷方式。

问题: 关键帧是如何工作的?注释中发生的事件(如属性变化或形状变化)是如何被明显标记的?
回答:确保很容易发现变化,否则你的 QA 会变得凌乱而耗时。还要确保每种注释类型都支持某种形式的关键帧。

4.插值:走多远?

先说线性 vs 三次插值。这真的重要吗?

来源:V7 实验室,研究

不完全是,不。我们在这里讨论的是空间插值。大多数对象,例如左边的球,都是按照三次样条曲线移动的。然而,在制造业中这是不正确的,因为齿轮的性质,运动几乎总是线性的。即便如此,最大的区别并不在空间插值上,而是在时间插值上**。本质上,难处理的不是物体的弧形运动,而是加速和减速。时间插值让用户感到困惑,以至于“时间插值”是 After Effects 教程中搜索最多的概念之一。我们发现保持时间线性在避免用户沮丧方面做得更好,代价是多点击几次。

来源: V7 达尔文

包围盒插值

最容易处理的是边界框。本质上是两个坐标点的移动。你唯一想要确保的是边界框可以随着时间改变状态,例如添加或丢失属性,或者隐藏。

来源:V7 实验室,研究

多边形插值

当您有潜在的无限数量的点要处理,并且您的源和目标形状使用不同数量的点时,事情会变得更加困难。我们发现在多边形注释中,这几乎适用于每一种情况。

在数学中,这被称为稳定婚姻问题。形状还有一个额外的挑战,就是必须确保目标点和原点彼此靠近。实时计算这可能是一个挑战。

我们包括了实时多边形插值,因为分割遮罩是我们工具的主要组成部分,我们认为我们在解决它方面做得很好,但是它仍然不完美。

如果你有兴趣深入了解为什么多边形插值是棘手的,Flash 动画师 Alan Becker 的这个优秀教程展示了它的一些缺点。

关键点插值

来源: V7 变更日志

关键点骨架是多边形插值的一种变通方法,因为它们有一定数量的点。您还需要确保能够插值骨架或自定义多边形。如果数据中有需要,请确保能够标记被遮挡的关节。这里有一个视频关于我们如何在 V7 上处理视频注释中的关键点骨架。

基于神经网络的插值

最后,我们发现平滑视频中多边形的最有效方法是在每一帧(或 2-5 帧,在它们之间插值)上运行神经网络,并进行任何必要的调整作为网络的输入。这里,我们使用自动注释,它是类不可知的,响应用户的点击,作为重新绘制分割蒙版的提示。

5.擦洗性能:为什么视频编辑花费$000 的权利编辑套件。

因为一个滞后的视频让人抓狂。当人们购买视频编辑软件时,它不是关于预置、效果或过渡的——那些都是购买后从市场上下载的。是因为回放体验和实时渲染的保真度。你要反复播放同一个 3 秒钟的序列十几次,确保它是流畅的!

有两个因素需要注意:

  1. 视频播放得有多好,你能以多快的速度跳过视频的各个部分并播放一个序列。
  2. 视频播放时,注释的渲染有多流畅和忠实?确保您在测试时使用了尽可能多的标签,就像您预计在生产中使用的那样。

并且可能

3.上传视频后,您能以多快的速度处理视频,并在完成后生成导出?

当一个视频被完全标记时,不要低估性能损失。大多数注释系统运行在有性能限制的浏览器上,当您作为数据科学家或评审员检查工作质量时,会变得非常慢。

6.慢速连接性能:它能在世界上的每个地区工作吗?

cdn 是 SaaS 的无名英雄。他们通过让内容的一部分更靠近用户来确保内容交付给用户,同时(如果做得好的话)仍然符合 GDPR 或 HIPAA。
这意味着:如果一个演示在加州的 Macbook Pro 上运行良好,那么它可能在秘鲁的用户中运行不佳。对你来说 2 秒钟就能加载的内容,对某些用户来说可能需要 60 多秒才能加载,这仅仅是因为他们的位置。在这一点上,标记数据的用户并不总是在超快的连接上。

当你能在主题中找到的唯一插图是剪贴画时,你就知道有些东西很无聊

来源:谷歌 Chrome 浏览器

通过使用连接到远程国家的 VPN 来测试视频注释的性能。您也可以通过在浏览器的开发工具(CTRL+ALT+I)中转到网络选项卡来模拟较慢的连接。左图是 Chrome 的。

问题: 【地区】是否有用户,他们报告的网络性能如何?
回答:你应该可以测试该地区服务的性能,得到一些具体的数字。

7.视频数据集管理:当你深陷数据时会发生什么?

事情会大规模崩溃,如果不是不可能的话,修补一个不是为你的最终目标而构建的产品是非常困难的。当寻找一个标签合作伙伴,你把你的业务交付在他们手中。确保他们对其工具的长期和大规模性能坦诚。

我们也遇到规模问题,并且从未停止遇到边缘情况。加载几十个正片长度的视频?检查。8:1 纵横比的视频?检查。拥有数千个类别和数万个属性的视频数据集?检查。如果您没有构建支持它们的先决条件,那么支持它们是很棘手的,并且可能会让您付出高昂的代价。

数据集管理界面中的一系列待标注视频。来源: V7 达尔文

我们遇到了太多的企业因为规模表现不佳而放弃了内部工具或开源标签平台。这是一个痛苦的转变,因为它必须发生在你全力生产的时候。对于视频,这些性能问题会成倍增加。以下是要注意的事项和要问的问题:

问题:数据集大小- 当我的一个数据集达到 10 万个视频时,性能会如何下降?100 万怎么样?你能提供一些你如何克服规模问题的例子吗?
回答:没有什么是完全尺度不变的。你可能会发现在检索和搜索视频时速度变慢了。确保该工具的开发人员已经和另一个客户一起经历过这个挑战,并且没有忽视这个挑战。

问题:数据集管理我可以通过名称、状态、标签或标记它的用户来搜索或检索任何视频吗?
回答:你会需要这个的。在培训结束后,有时需要对数据集进行拆分、重新调整用途、清理或故障排除。

问题:数据集完整性你是否保留了每个视频的变化历史,以备我们遇到地面真相的问题?您是否备份了这些资产?
回答:你至少要确保你有机会发现一批
坏数据,因为错误往往要么发生在同一时间段内,要么发生在用户内。您还希望确保每天都备份注释、数据以及任何性能和历史指标。删除中的人为错误是我们每天都会遇到的事情,而且太常见了。

我希望这是一个有用的指南,告诉你应该注意什么。确保在开始机器学习数据标记时,你已经涵盖了所有可能的场景,因为你使用的工具将是你的 ML 进展的基石。如果你想看看我们最终在 V7 中构建了什么,下面是一个视频摘要:

最大化 PyTorch 性能的 7 个技巧

原文:https://towardsdatascience.com/7-tips-for-squeezing-maximum-performance-from-pytorch-ca4a40951259?source=collection_archive---------1-----------------------

在过去的 10 个月里,在开发 PyTorch Lightning 、时,团队和我已经接触到了许多构建 PyTorch 代码的风格,我们已经确定了一些我们看到人们无意中引入瓶颈的关键地方。

我们非常小心地确保 PyTorch Lightning 不会在我们为您自动化的代码中犯任何这些错误,当我们检测到这些错误时,我们甚至会尝试为用户纠正它们。然而,因为 Lightning 只是结构化的 PyTorch,而你仍然控制着所有的科学 PyTorch,所以在很多情况下我们不能为用户做什么。

此外,如果您不使用 Lightning,您可能会无意中在代码中引入这些问题。

为了帮助你更快地训练,这里有 8 个你应该知道的技巧,它们可能会降低你的代码速度。

在数据加载器中使用工作线程

这第一个错误很容易纠正。PyTorch 允许在多个进程上同时加载数据(文档)。

在这种情况下,PyTorch 可以通过处理 8 个批处理来绕过 GIL 锁,每个批处理在一个单独的进程中进行。你应该用多少工人?一个好的经验法则是:

num_worker = 4 * num_GPU

这个 answe r 对此有很好的论述。

警告:坏处是你的内存使用量也会增加(来源)。

引脚存储器

你知道有时你的 GPU 内存显示已满,但你很确定你的模型没有使用那么多吗?这种开销被称为固定内存。这个内存已经作为一种“工作分配”被保留

当您在数据加载器中启用 pinned_memory 时,它会“自动将获取的数据张量放入 pinned memory,并使数据更快地传输到支持 CUDA 的 GPU”(source)。

在这篇 NVIDIA 博客文章中描述的固定内存。

这也意味着您不应该不必要地呼叫:

torch.cuda.empty_cache()

避免 CPU 到 GPU 的传输,反之亦然

# bad.cpu()
.item()
.numpy()

我看到大量使用。项目()或。cpu()或。numpy()调用。这对性能非常不利,因为这些调用中的每一个都将数据从 GPU 传输到 CPU,并且显著地降低了性能。

如果您试图弄清楚附加的计算图,请使用。请改为分离()。

# good.detach()

这不会将内存转移到 GPU,它会删除任何附加到该变量的计算图形。

直接在 GPU 上构造张量

大多数人都是这样在 GPU 上创建张量的

t = tensor.rand(2,2).cuda()

但是,这个先创建 CPU 张量,然后再传递给 GPU……这个真的很慢。相反,直接在你想要的设备上创建张量。

t = tensor.rand(2,2, device=torch**.**device('cuda:0'))

如果您使用的是 Lightning,我们会自动将您的模型和批次放在正确的 GPU 上。但是,如果你在代码中的某个地方创建了一个新的张量(例如:VAE 的样本随机噪声,或者类似的东西),那么你必须自己放置这个张量。

t = tensor.rand(2,2, device=self.device)

每个 LightningModule 都有一个方便的 self.device 调用,无论你是在 CPU、多 GPU 还是 TPU 上,它都可以工作(即:lightning 将为该张量选择正确的设备。

使用分布式数据并行而不是数据并行

PyTorch 有两个主要模型用于在多个 GPU 上进行训练。第一个,DataParallel(DP),跨多个 GPU 拆分一个批处理。但这也意味着模型必须复制到每个 GPU,一旦在 GPU 0 上计算了梯度,它们必须同步到其他 GPU。

这需要大量昂贵的 GPU 传输!相反,DistributedDataParallel(DDP)在每个 GPU 上创建模型的孤岛副本(在它自己的进程中),并且只使一部分数据对那个 GPU 可用。这就像有 N 个独立的模型训练,除了一旦每个模型计算了梯度,它们都跨模型同步梯度…这意味着我们在每个批处理期间只跨 GPU传输数据一次

在闪电中,你可以在两者之间轻松切换

Trainer(distributed_backend='ddp', gpus=8)
Trainer(distributed_backend='dp', gpus=8)

注意 PyTorch 和 Lightning 都不鼓励 DP 使用。

使用 16 位精度

这是另一种加快训练速度的方法,我们没有看到很多人使用。在 16 位训练中,模型和数据的一部分从 32 位数字变为 16 位数字。这有几个优点:

  1. 您使用了一半的内存(这意味着您可以将批量加倍,并将训练时间减半)。
  2. 某些 GPU(V100,2080Ti)可以自动加速(快 3-8 倍),因为它们针对 16 位计算进行了优化。

在 Lightning 中,这很容易实现:

Trainer(precision=16)

注意:在 PyTorch 1.6 之前,你还必须安装 Nvidia Apex…现在 16 位是 PyTorch 的原生版本。但是如果你使用的是 Lightning,它支持这两种方式,并根据检测到的 PyTorch 版本自动切换。

剖析您的代码

如果没有 Lightning,最后一个技巧可能很难做到,但是您可以使用类似于 cprofiler 这样的工具来做到这一点。但是,在 Lightning 中,您可以通过两种方式获得培训期间所有通话的摘要:

一、内置的基本剖析器

Trainer(profile=True)

它给出了这样的输出:

或者高级分析器:

profiler **=** AdvancedProfiler()
trainer **=** Trainer(profiler**=**profiler)

变得非常精细

闪电剖面仪的完整文档可以在这里找到。

在你的代码中采用闪电

PyTorch 闪电只不过是结构化的 PyTorch。

如果你已经准备好让这些技巧中的大部分为你自动完成(并经过良好的测试),那么看看这个关于将 PyTorch 代码重构为 Lightning 格式的视频!

选择最佳优化器的 7 个技巧

原文:https://towardsdatascience.com/7-tips-to-choose-the-best-optimizer-47bb9c1219e?source=collection_archive---------7-----------------------

根据我的经验。

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

介绍

在机器学习中,当我们需要计算预测值和实际值之间的距离时,我们使用所谓的损失函数。

与许多人认为的相反,损失函数和成本函数不是一回事。虽然损失函数计算单个预测与其实际值的距离,但成本函数通常更通用。事实上,成本函数可以是,例如,训练集上的损失函数之和加上一些正则化。

另一个经常被错误地用作前两个的同义词的术语由目标函数表示,它是在训练期间被优化的任何函数的最一般的术语。

一旦澄清了正确的术语,我们就可以给出优化器的定义。

机器学习中的优化器用于调整神经网络的参数,以便最小化成本函数。

因此,优化器的选择是一个重要的方面,可以区分好的训练和坏的训练。

实际上,有许多优化器,所以选择并不简单。在本文中,我将简要描述最常用的优化器,然后给你一些在不同项目中帮助过我的指导原则,我希望在为你的任务选择最合适的优化器时,这些指导原则也能帮助你。

关于具体优化器如何工作的进一步信息,你可以看看这个网站。

有多少优化者?

就像刚才说的,有很多优化器。它们中的每一种都有与特定任务相关的优点和缺点。

我喜欢把优化器分为两个家族:梯度下降优化器和自适应优化器。这种划分完全基于一个操作方面,在梯度下降算法的情况下,强制您手动调整学习率,而在自适应算法中自动调整——这就是我们使用这个名称的原因。

梯度下降:

  • 批量梯度下降
  • 随机梯度下降
  • 小批量梯度下降

自适应:

  • 阿达格拉德
  • 阿达德尔塔
  • RMSprop
  • 圣经》和《古兰经》传统中)亚当(人类第一人的名字

梯度下降优化器

有三种类型的梯度下降优化器,它们在我们使用多少数据来计算目标函数的梯度方面有所不同。

批量梯度下降

也被称为香草梯度下降,这是三种算法中最基本的算法。它为整个训练集计算目标函数 J 相对于参数 θ 的梯度。

批量梯度下降中更新重量的公式。梯度乘以学习速率η,然后用于更新网络的参数。

由于我们使用整个数据集仅执行一步,批量梯度下降可能会非常慢。此外,它不适合不适合内存的数据集。

随机梯度下降

它是批量梯度下降的改进版本。它不是计算整个数据集的梯度,而是为数据集中的每个示例执行参数更新

因此,该公式现在还取决于输入 x 和输出 y 的值。

用于更新 SGD 中权重的公式

SGD 的问题是更新频繁且具有高方差,因此目标函数在训练期间波动很大。

相对于批量梯度下降,这种波动可能是有利的,因为它允许函数跳到更好的局部最小值,但同时它可能代表相对于在特定局部最小值中的收敛的不利之处。

这个问题的解决方案是缓慢降低学习率值,以便使更新越来越小,从而避免高振荡。

小批量梯度下降

这种算法背后的直觉是利用两种梯度下降方法的优势,我们已经看到了。

它主要计算小批量数据的梯度,以减少更新的方差。

在小批量梯度下降中更新重量的公式

外卖#1

  • 小批量梯度下降是大多数情况下三者中的最佳选择
  • 学习率调优问题:都受制于一个好的学习率的选择。不幸的是,这个选择并不简单。
  • 不适合稀疏数据:没有机制来证明很少出现的特征。所有参数同等更新。
  • 陷入次优局部最小值的可能性很高。

自适应优化器

这个优化器家族已经被引入来解决梯度下降算法的问题。它们最重要的特点是不需要调整学习率值。实际上,一些库——比如 Keras——仍然允许你手动调整它来进行更高级的测试。

阿达格拉德

它使学习速率适应参数,对频繁出现的特征进行小更新,对最罕见的特征进行大更新。

通过这种方式,网络能够捕获属于不经常出现的特征的信息,将它们放在证据中,并给予它们适当的权重。

Adagrad 的问题是,它根据所有过去的梯度来调整每个参数的学习速率。因此,在高数量的步骤之后具有非常小的学习率的可能性——由所有过去梯度的累积产生——是相关的。

如果学习率太小,我们就不能更新权重,结果是网络不再学习。

阿达德尔塔

它通过引入历史窗口来改进先前的算法,该历史窗口设置了在训练期间要考虑的固定数量的过去梯度。

这样,我们就不存在学习率消失的问题。

RMSprop

它与 Adadelta 非常相似。唯一的区别是他们管理过去梯度的方式。

圣经》和《古兰经》传统中)亚当(人类第一人的名字

它增加了 Adadelta 和 RMSprop 的优点,即存储类似于动量的过去梯度的指数衰减平均值。

外卖#2

  • 亚当在大多数情况下是自适应优化者中最好的
  • 擅长稀疏数据:自适应学习速率非常适合这种类型的数据集。
  • 没有必要关注学习率值

梯度下降与自适应

总的来说亚当是最好的选择。无论如何,许多最近的论文指出,如果结合一个良好的学习率退火计划,SGD 可以带来更好的结果,该计划旨在管理其在培训期间的价值。

我的建议是在任何情况下都首先尝试 Adam,因为它更有可能在没有高级微调的情况下返回好的结果。

然后,如果 Adam 取得了好的结果,那么打开 SGD 看看会发生什么是个好主意。

2020 年实现卓越商业智能的 7 种工具

原文:https://towardsdatascience.com/7-tools-for-superior-business-intelligence-in-2020-7fb8dfeb9e1f?source=collection_archive---------54-----------------------

图像通过像素

随着公司的不断发展,理解他们长期收集的大量数据变得越来越困难。关键决策者和高层需要智能数据和分析工具来做出明智且有利可图的决策。

商业智能(BI)工具帮助公司收集、分析、监控和预测各种商业场景。他们通过识别趋势、提供数据可视化和提供实时自助数据分析来实现这一点,用户可以在此基础上做出决策。

更具体地说,决策者可以使用 BI 工具来合并和准备来自不同来源的数据集,这些来源通常是非结构化的,并且采用不同的格式。然后,他们可以使用这些工具在交互式嵌入式仪表板中可视化洞察。与老一代企业商务智能软件相比,新的自助式商务智能使 it 部门能够轻松地为业务线用户(也称为“公民分析师”)设置他们自己的软件环境,让他们能够独立工作。

用户不再需要大量的技术知识或编码查询的能力。这样做的主要好处是业务线用户需要最少的 it 参与,他们能够更快地做出明智的决策,从而增加公司的利润。

在本文中,我们将仔细研究一些商业智能的最佳工具,并强调它们的突出特点。

1. Sisense

Sisense 商业智能平台非常用户友好,需要最少的 IT 参与。这使得它成为混合了需要访问它的公民分析师用户和高级用户的组织的完美候选。

Sisense 是一个可扩展的解决方案,这意味着它非常适合初创公司、中小型企业和企业组织。用户可以随心所欲地扩展核心软件,因为该平台提供了对各种插件和库的支持。此外,Sisense 的 SSO 机制允许系统对用户进行身份验证,而无需用户输入单独的登录凭据。

Sisense 允许用户整合来自各种数据源的数据,包括 Google Analytics、AdWords 和 Salesforce,并将其转换为交互式可视化和可操作的应用程序组件。它还使用户能够将分析嵌入到具有完全定制和白色标签的第三方产品中。

图片来自 Sisense

Sisense 最强大的功能之一是基于 NLP 技术的自然语言查询(NLQ)支持。用户可以简单地问一些复杂的问题,并立即收到数据切片和图像,为他们的搜索查询提供答案。该平台还会在你构建查询时提供建议。例如,你可以问我的总收入是多少?并迅速看到明确的回应。还可以自动合并新的数据集和数据源,甚至是非结构化的数据集和数据源。

使用 Sisense,您可以创建警报,以便您的利益相关者和数据团队可以立即收到 KPI 异常的通知。它还允许您将警报集成并自动化到第三方应用程序中,包括 Slack、Zapier 和 Zendesk,以触发即时响应。最后,您可以使用 Sisense 自动生成每日、每月或每季度报告,按计划向主要利益相关方发送定制的快照。

2.画面

Tableau 是一个用于数据发现和数据可视化的 BI 工具,非常适合个人数据分析师、团队和组织。它让用户能够分析、可视化和共享数据,帮助他们更快地做出明智的业务决策。它提供了一套商业智能工具,包括 Tableau 桌面、Tableau 在线、Tableau 服务器和 Tableau 移动设备。

该平台支持与内部或云中各种数据源的连接。这包括 SQL 数据库、大数据、电子表格和云应用程序,如 Google Analytics 和 Salesforce。用户可以访问和组合来自不同来源的数据集,而无需编写代码。尽管 Tableau 被认为是自助 BI 领域的领导者,但它确实需要一些学习才能有宾至如归的感觉。

用户可以使用自然语言从发布的数据源中提问,并以可视化的形式获得答案。Tableau 的端到端 web 创作功能使用户可以轻松添加额外的数据源或创建交互式仪表板。

该平台还为用户提供人工智能驱动的数据点解释,否则这些数据点可能会被忽视。除此之外,用户还可以将交互式仪表盘嵌入到各种第三方应用中。

3. Domo

Domo 是一个基于云的 BI 软件产品,由多个系统组成,让您能够连接多个数据源(包括数据库、电子表格和社交媒体),并使用 Domo Appstore 中的预建应用程序扩展它们。该工具是为企业用户设计的,尽管它肯定可以被拥有精通技术的数据团队的较小公司使用。

通过 Domo,用户可以用 1000 多个预建的云连接器建立数据管道,并查询它们的托管位置。这包括文件上传(例如 Google Docs 或电子表格)、专有系统和使用 Domo Workbench 的内部部署。

图像通过 Domo

该平台还具有神奇的 ETL 功能,让用户无需了解 SQL 就能利用数据转换。这有助于团队加快数据分析过程。此外,Domo 建议数据可视化自动使团队能够立即从原始数据源到图形、图表和地图。

Domo 还配备了内置的人工智能引擎 Roboto 先生,可以帮助数据团队创建预测分析模型,并允许他们利用人工智能和机器学习。例如,用户可以设置在 KPI 发生变化时提醒他们。

4.清析毕

Clear Analytics BI 是一款功能强大的工具,可以整合来自内部系统、CRM、云应用和会计软件等各种业务工具的数据,允许您将这些数据导入 Excel。该工具与 Microsoft Power BI 配合使用,非常适合精通 Excel 的用户和使用 Microsoft 服务的公司。

Clear Analytics BI 提供的突出功能是,它直接向 Microsoft Power BI 提供自助服务报告。除此之外,它与 Excel 的集成使数据分析师能够随意调整公式,并管理用户查看权限。

Clear Analytics BI 还提供了完整的审计跟踪,让用户可以跟踪数据来自哪里、使用了哪些过滤器、数据是何时提取的以及谁运行了报告。

5.微软 Power BI

Microsoft Power BI 是一个基于 web 的商业智能套件,专注于提供可以在全球数据中心之间共享的交互式数据可视化。它是为企业组织设计的,但它使各个级别的用户都能做出明智的决策。

微软 Power BI 使用户可以轻松地与各种第三方应用程序集成。例如,用户可以将 Excel 查询、数据模型和报告连接到他们的仪表板,以便收集、分析和共享业务数据。

图片来自微软

该平台与 Azure 数据湖无缝集成,这使得用户可以轻松地与主要利益相关者共享大量数据。此外,他们还能够增强部门间的协作,并有效减少获得见解所需的时间。

Microsoft Power BI 使数据分析师能够准备数据并构建机器学习模型,以从结构化和非结构化数据(包括文本和图像)中获得洞察力。更不用说,该平台集成了 Power Apps 和 Power Automate,允许用户构建业务应用和自动化工作流。

6.数据线

datapine 是一个 BI 工具,专为各行各业各种规模的企业而设计。它非常适合高级用户和普通商业用户。该平台允许用户连接来自各种数据源的数据,对其进行分析,创建仪表板,并生成报告。datapine 提供了一个 SQL 模式,使用户能够创建定制查询,尽管它还打包了一个拖放接口,让业务线用户无需高级编码就可以创建数据可视化。

该平台还提供强大的分析功能,包括基于预测引擎的预测分析。用户可以选择 KPI,确定他们想要预测的数据点、特定的先前数据点,并通过设置置信区间来定义模型质量。

此外,datapine 通过简洁的特性简化了数据发现过程,比如向下钻取、小部件链接和层次过滤器。它还提供了与团队成员共享报告的不同方式,包括通过直接 URL、提供查看器访问以及在特定时间间隔发送自动电子邮件。

datapine 基于人工智能的警报和智能洞察在异常情况下向用户发出警报,并且还可以自动生成不同类型的洞察。

7.旁观者

Looker 本质上是一款为初创公司和中小企业设计的数据发现应用。它集成了几乎所有的 SQL 数据库或仓库——包括 Redshift、Snowflake 和 big query——并且非常易于使用。

这款 BI 工具提供强大的协作功能,使用户能够通过电子邮件或第三方应用程序共享数据分析和报告。用户可以利用支持多种数据源和部署方法的多云策略。

图片来自旁观者

Looker 使数据分析师能够跨多个接触点查看每个客户,从而使他们能够基于实际交互发现洞察。这是了解客户使用行为、创建量身定制的信息以及确定追加销售机会以提高业务效率的绝佳方式。

该平台还允许用户集成工具和应用程序,包括 Slack、Segment、Marketo 和 Dropbox,以创建商业智能工作流。

结论

BI 工具使关键决策者、高层、数据团队和利益相关者能够更好地理解大量业务数据,分析这些数据并做出快速(且有利可图)的业务决策。全新的自助式 BI 工具让数据团队中的几乎每个人都可以轻松创建和共享交互式数据可视化,并更快地获得洞察力,而无需编写代码。

您有在组织中使用 BI 工具的经验吗?如果是,哪些特性对你来说最重要?

创建 Rockstar 数据科学产品组合的 7 种工具

原文:https://towardsdatascience.com/7-tools-to-create-a-rockstar-data-science-portfolio-b31928e62395?source=collection_archive---------7-----------------------

照片由奥斯汀·尼尔在 Unsplash 拍摄

使用这些工具脱颖而出

根据 Coursera 的最新统计,超过 300 万人注册了吴恩达流行的机器学习课程。这只是一个在线课程,还有很多其他类似的课程和在线训练营。这意味着有非常多的人希望进入数据科学领域。

超过 300 万人注册了吴恩达广受欢迎的机器学习课程

那么,考虑到这些数字,你如何在申请数据科学职位时脱颖而出呢?企业越来越多地寻找能够证明自己能够实际运用所学技能来改善业务成果的人。

一张课程证书已经不足以在数据科学领域找到一份工作。您需要创建一个实用的数据科学项目组合来展示您的工作,并确保您的应用程序在所有其他应用程序中脱颖而出。

一张课程证书不再足以在数据科学领域找到一份工作

已经有很多关于你可以在投资组合中包含的项目类型的文章,我特别喜欢来自 dataquest 的这篇文章。然而,很少有人写你可以用来实际完成和在线展示这些项目的工具。

我目前正在重建我自己的数据科学组合,我认为值得分享我在本文中使用的一些工具和技术。

Github 页面

Github 可能是任何技术组合中最明显的工具。每个项目都可以很好地展示为一个带有文档和 README.md 的独立存储库。

然而,如果你有许多项目都在不同的存储库中,那么最好在你自己的网站上把这些项目和一些注释整理在一起。Github 有一个非常好的工具来创建一个简单的网站,叫做Github pages

要创建您的网站,只需导航到您的 Github 帐户并选择创建新的存储库选项,就像创建任何新项目一样。但是,在存储库名称框中,您需要在名称的末尾添加.github.io

接下来,您需要以通常的方式克隆存储库。从命令行输入。

git clone https://github.com/myaccount/myname.github.io.git

导航到新目录。

cd rebeccavickerydt.github.io

添加一个 index.md 文件,添加一点内容。

touch index.md

我补充了以下内容。

<html>
<head>
  <title>My Portfolio</title>
</head>
<body>
  <h1>Example projects</h1>
  <footer>rvickery 2020</footer>
</body>
</html>

提交并将更改推送到 Github 存储库。

git add --all
git commit -m "adding landing page"
git push

现在转到您的存储库中的设置,向下滚动到 Github 页面并选择源主分支

您现在可以在“设置”中访问您的网站 URL。

现在你可以访问你的网站了。

wordpress 软件

如果你想创建一个外观更丰富的作品集网站,使用 Wordpress 来创建你的作品集是值得一看的。

Wordpress 是一个完全免费的网站开发方式,有很多我认为非常适合作品集的主题,如果你不使用自定义域名,它是完全免费的。这周我刚开始把我的作品集搬到这里,我用了主题。下面是我的登陆页面截图。

所有的主题都非常灵活,添加新页面和改变布局来适应你的风格非常简单。我发现这是一个非常快速的方法来制作一个专业的作品集。

卡格尔

一旦你选择了创建投资组合的工具,你需要创建一些项目来添加到其中。

Kaggle 是一个受欢迎的机器学习竞赛网站,它有许多功能,可以用来创建项目来展示你的技能。

比赛本身包含一些非常有趣的数据问题,数据集可能非常复杂和具有挑战性,此外还有一个排行榜,使您能够将自己的技能与其他人进行比较。

Kaggle 竞赛页面

Kaggle 还有一个叫做 Kaggle 内核的工具。这些是托管笔记本,用于开发和运行您的数据科学代码。导入 Kaggle 数据集来直接处理它们是非常容易的,而且你写的代码是公开的,因此很容易在投资组合中共享。内核还连接到谷歌云服务,允许你展示你查询存储在关系数据库中的数据和访问云计算资源的技能。

Kaggle 还维护着一个公开可用的数据集的档案。这里有各种不同的数据集可用,这些数据集对于创建更新颖的项目和展示探索性数据分析非常有用。

驱动数据

如果你想展示你的技能,同时帮助解决社会问题,那么 drivendata.org 的是一个很好的开始。与 Kaggle 类似,这个网站举办数据科学比赛,有数据集和排行榜,但这里的不同之处在于,所有比赛的核心都是用数据科学解决的社会问题。

这些比赛背后的数据集很有趣,从初学者友好到更具挑战性。

drivendata.org 竞赛页面

Jovian.ml

如果你正在寻找 Github 的替代品来跟踪、组织或分享你的数据科学代码, Jovian.ml 是一个不错的选择。这是一个用于托管和共享基于笔记本的数据科学项目的开源项目。

您可以创建无限的公共项目,项目中可以包含笔记本、文件(如帮助文件)和环境配置文件。Jovian 还能够跟踪模型版本等输出文件,因此在某些方面比 Github 更适合存储数据科学项目和实验。

jovian . ml个人资料页面

谷歌云平台

如今,绝大多数企业正在转向或已经在利用云数据存储和计算能力。因此,这是一个好主意,包括一些应用你在这方面的技能的实际例子。谷歌云平台(GCP)有很多展示你作品的工具。

GCP 有一个免费使用层,所以你应该能够免费创建一些项目。

BigQuery 是 Google 的云数据仓库产品。在该产品中,Google 托管了大量公共数据集,可以通过 BigQuery web UI 访问这些数据集。通过访问这些数据集的文档可以在这里找到。

一旦你可以访问 BigQuery 中的一些数据,你就可以使用 GCP 人工智能中心创建项目,其中包括云托管笔记本电脑、模型部署工具和机器学习 API。

UCI 机器学习知识库

UCI 机器学习库是另一个公共可用数据集的伟大来源。该网站上有近 500 个数据集,涵盖了广泛的数据科学项目类型。

它们按照任务类型、数据类型、区域和数据集大小进行分类,这很有帮助。这些数据集再次为您的投资组合整合数据科学项目提供了很好的资源。

希望本文为您提供了一系列工具来创建一个真正出色的数据科学组合。我目前正在写我的,但是一旦完成,我会更新这篇文章并提供最终版本的链接。快乐的投资组合建设!

【如约更新——我的作品集现已完成,住在 www.rebecca-vickery.com

感谢阅读!

我每月发一份简讯,如果你想加入,请通过此链接注册。期待成为您学习旅程的一部分!

更好仪表板设计的 7 大技巧

原文:https://towardsdatascience.com/7-top-tips-for-better-dashboard-design-fd577ef2345a?source=collection_archive---------46-----------------------

有效的数据可视化对于使您的报告尽可能易于理解至关重要。是时候升级你的游戏数据了。

在 Unsplash 上由 Carlos Muza 拍摄的照片

在我的职业生涯中,我为不同行业的一些世界知名品牌设计了数百个仪表盘。在这里,我将与您分享在设计业务仪表板以支持您的数据游戏时需要考虑和实施的 7 件最重要的事情。我的最佳建议,如果你愿意的话。

1.提前计划

照片由达里娅·谢夫索娃在 Unsplash 拍摄

在开始向计划发布的报表中添加图表之前,请确保您对其内容和布局有一个清晰的概念。我建议你做的第一件事是写下所有的疑问,或者你想对你的数据提出的问题。列个清单。它应包含:

  • 查询的名称
  • 它来自的数据源
  • 该数据源中的字段需要
  • 可视化类型

如果您还没有进行任何数据发现来查看您将要处理的结果,那么最后一个选项在这一点上并不重要

一旦你列出了清单,我建议你拿一张白纸和一支铅笔,简单地勾画出你希望你的报告看起来是什么样子。没什么细节,只是一个非常粗略的草图。尝试添加列表中的所有查询。相信我,这将是一个很大的帮助。您还会发现您的报告中是否需要超过 1 页,以及如何将某些查询分组在一起。

2.讲故事

我的意思是,你的报告将被它的读者“阅读”,很可能是从左上角到右下角,就像一本书的一页。那只是我们大脑的设置方式。因此,要确保报告在显示哪些查询方面有一定的一致性。

帕特里克·福尔在 Unsplash 上的照片

此外,考虑将包含与相同区域、活动或 KPI 相关的数据的查询分组在一起。你会发现很多有多页的报告,第一页会包含一种主要标题的摘要,而其他页面会专注于特定的领域并更深入。所以这就是我讲故事的意思。

3.避开 TMI

这个技巧与前两个密切相关,那是为了避免 TMI,或“太多的信息”。我的意思是不要在你的报告中加入过多的图表和信息,使其难以阅读和理解。

图片由 Adobe Stock 根据 Adam Finer 的许可提供。

你永远不要问自己“我可以在页面/屏幕上再挤几个图表来避免跳到一个新的图表上吗?”因为通常在这些情况下发生的事情是,你要么最终缩小其他图表的尺寸,使它们不容易阅读。或者您在页面上四处移动图表以尝试容纳更多图表,这可能会扰乱您试图讲述的故事。否则你的星盘会靠得太近;您的数据需要空间来呼吸。你甚至可以反其道而行之,不要给你的浏览者提供过多的信息,更简约地使用尽可能多的页面来确保你的数据能够被正确地阅读。

TMI 也与个人观想有关。例如,不要有一个条形图,里面有太多的条,很难阅读,你不能正确地看到标签。记住,这个想法是让你的观想尽可能容易阅读和理解。

4.墨水与数据比率

这是数据可视化专家爱德华·塔夫特在他 1983 年的著作《定量数据的可视化显示》中引入的概念。

他在书中写道,

“图形上的大部分墨水应该呈现数据信息,墨水随着数据的变化而变化。数据墨水是图形中不可擦除的核心,这种非冗余墨水是根据所代表的数字的变化而安排的

所以本质上,他所说的是,显示(或打印)可视化所需的大部分墨水应该是数据墨水。例如,条形图上的条形或时间序列图上的线条。只要有可能,你应该移除任何对观想不重要的东西。

这意味着图表上的网格、轴标签等。如果观想数据没有它也能被阅读和理解,那么就移除它。

图片由 Adobe Stock 授权给 Adam Finer

时间序列图就是一个很好的例子。x 轴上的值是日期,对观察者来说是显而易见的。所以你不需要有一个写着“日期”的 x 轴标题标签,因为这是多余的。一个例外可能是,当数据集中有不止一个日期时,需要指定日期,但您已经知道了。

如果你有兴趣学习更多关于数据可视化理论的知识,那么我肯定会推荐你买一本量化信息的可视化显示(附属链接)。

5.选择正确的观想

Adeolu Eletu 在 Unsplash 上的照片

确保为正在创建的查询选择正确的可视化类型非常重要。这里有一些你可能想问的问题:

  • 你在比较价值观吗?那么柱形图或条形图可能是最好的。
  • 你是在尝试将关系或等级可视化吗?然后可能是一个树状图。
  • 你显示的是总数的百分比吗?除非您要显示 5 个以上的值,否则饼图可能是最好的选择。
  • 你在和日期打交道吗?那么时间序列图或面积图就是一种方法。

所有这些问题将帮助你决定哪种观想类型最适合你想要传达的东西。我们的目标是让你的数据尽可能容易被浏览者理解,而可视化类型在实现这一点上起着很大的作用。

6.明智地使用颜色

我的意思是不要疯狂,开始为每个观想选择不同的颜色。尽可能简单地使用颜色。

你可以在报告中用不同的颜色来代表不同的区域,所以与销售相关的一切用一种颜色,与营销相关的用另一种颜色,等等。但只有在这样做有意义的时候。我猜一个规则是,如果你要使用不同的颜色,确保它应用于报告中不止一个视觉化。

然而,你会注意到,设计最好的报告和仪表板都保持了非常简单的配色方案。

7.为你的观众设计

这不仅关系到将查看您的报告,还关系到如何查看或消费您的报告。

Jonas Jacobsson 在 Unsplash 上拍摄的照片

关于第一个问题,,他们需要深入数据还是过滤数据?如果是的话,你需要在构建你的可视化和设计你的报告时包括这些选项。您的仪表板查看者对所呈现的数据有多熟悉?这将决定你在观想中有多少描述或非必要的信息来解释正在呈现的东西。

如何查看和使用报告将会对你的仪表板的方向和大小产生影响。会不会主要分享成会打印出来的 pdf?如果是这样,你需要确保它打印正确。在这种情况下,您可能还需要添加更多信息,如在图表中显示某些值,因为您不能将鼠标悬停在图表上以在 pdf 中显示值。

所以你可以看到,当涉及到你的观众时,有许多事情需要考虑。

这就是我为更好的仪表板设计提供的 7 大技巧,帮助你的报告更上一层楼。想要更多类似的文章,别忘了关注和查看我的 YouTube 频道。

7 种人工智能风险以及如何减轻其影响

原文:https://towardsdatascience.com/7-types-of-ai-risk-and-how-to-mitigate-their-impact-36c086bfd732?source=collection_archive---------20-----------------------

识别和管理人工智能风险对所有组织都至关重要

由 Unsplash 上的 Loic Leray 拍摄的照片

从事人工智能/人工智能项目是许多个人和公司的梦想。令人惊叹的人工智能倡议的故事遍布网络,声称拥有这些倡议的人因发言而受到追捧,获得了可观的职位,并赢得了同行的尊重。

在现实中,人工智能工作是高度不确定的,并且有许多类型的风险与人工智能/人工智能工作相关联。

“如果你知道风险可能潜伏在哪里,不被理解,或者只是未被识别,你就有更大的机会在它们赶上你之前抓住它们。”—麦肯锡[1]。

在这篇文章中,我将总结 7 种风险以及如何减轻它们的负面影响。对于那些喜欢简洁视图的人,这是我整理的一张幻灯片。

人工智能风险的 7 个维度— 巴巴尔·巴蒂

  1. 战略风险——正如我在一篇早先的文章中所写的,制定人工智能战略并不简单。早期阶段的错误为其他下游问题埋下了伏笔。不幸的是,战略往往掌握在那些对人工智能能力没有透彻理解的人手中。这一类别包括选择错误(不可行)计划的风险(相对于组织的基础现实)、缺乏高管支持、政策不协调、业务团队之间的摩擦、高估 AI/ML 潜力(与宣传相反, ML 并不是所有分析或预测问题的最佳答案)、目标或成功指标不清晰或不明确。最明显的缓解方法是在人工智能领导和执行团队之间就战略以及与之相关的风险达成一致。准确理解人工智能将如何影响人和流程,以及当事情不顺利时该做什么。
  2. 财务风险 —一个常见但不经常谈论的假设是,模型开发的成本是 AI/ML 的主要财务因素。只有当我们有最好的数据/人工智能科学家时,我们才会一切就绪。正如本文所讨论的,人工智能的整个生命周期更加复杂,包括数据治理和管理、人工监控和基础设施成本(云、容器、GPU 等)。)人工智能工作总是存在不确定因素,这意味着与软件开发相比,该过程将更具实验性和非线性,即使在所有昂贵的开发工作之后,最终结果也不总是积极的。确保你的财务领导明白这一点,不要把 AI/ML 仅仅当作另一个技术项目
  3. 技术风险 —这是最明显的挑战。这项技术还不成熟,但技术专家或供应商想要推动它。或者,也许企业领导想用前瞻性的眼光给媒体或他们的竞争对手留下深刻印象。技术风险以多种形式出现 : 数据:数据质量、适用性、代表性、刚性数据基础设施等等。模型风险:能力、学习方法、现实世界中的糟糕表现或可靠性。概念漂移,即市场或环境随着时间的推移或由于意外事件而发生变化。能力:缺乏合适的技能或经验、实施延迟、错误、测试不彻底、缺乏稳定或成熟的环境、缺乏数据操作、MLOps、IT 团队跟不上 ML/AI 部署或扩展需求、安全漏洞和知识产权盗窃。减轻这些问题的最佳方法是提高您团队的技能,投资现代数据基础设施,并遵循 ML 的最佳实践。
  4. 人员和流程风险 —不言而喻,正确的组织结构、人员和文化对你的工作成功至关重要。有了能干的人和支持性的文化,你就能发现问题,面对挑战。不良文化的标志是人们隐藏问题并逃避所有权。当团队之间有政治和紧张关系时,问题就会被放大。技能差距、僵化的思维模式、沟通不畅、传统 IT 缺乏扩展人工智能的运营知识。流程中的差距、IT 和 AI 之间的协调问题、零散或不一致的实践/工具、供应商炒作。缺乏数据/知识共享(组织结构),缺少领域专家的输入/审查,缺乏监督/政策控制&后备计划,第三方模型依赖,人力监督不足,学习反馈循环。薄弱的技术基础。
  5. 信任和可解释性风险 —你做了所有的工作,但你的人工智能应用程序的最终用户对使用或采用该模型犹豫不决。这是一个共同的挑战。原因包括模型在特定条件下的不良表现、模型的不透明性(缺乏对结果的解释)、出现问题时缺乏帮助、用户体验差、缺乏激励一致性、对人们的工作流程或日常事务的重大干扰。正如 ML/AI 从业者所知,深度神经网络等最佳模型是最难解释的。这导致了一些困难的问题,例如,模型性能和目标用户的采用哪个更重要?
  6. 合规和监管风险 — AI/ML 会给需要遵守规则和法规的用例或垂直行业带来很大的麻烦。这里有一条微妙的界线——如果你不采取一些行动,竞争对手可能会领先太多。当你采取行动时,你必须防范不可预见的后果和监管机构的调查或罚款。金融和医疗保健行业就是这种紧张关系的很好例子。上面讨论的可解释因素是这里的关键。缓解:确保风险管理团队充分了解 AI/ML 工作及其影响。为人员监控和纠正措施分配资源。
  7. 道德风险——你的人工智能/人工智能项目拥有大量数据和超级明星技术团队,利益显而易见,也不存在法律问题——但它是道德的吗?以警察工作中的面部识别为例。供应商们将此作为一种革命性的方式来推动警务工作,但最初的模型缺乏做出公平准确预测所需的稳健性,并导致对某些少数群体的明显偏见。信用评分和保险模型长期以来一直存在偏见——随着 ML 驱动的应用程序的增长,这已经成为一个更大的问题。

上述每个风险领域本身都是一个巨大的领域,需要大量的阅读和实践经验来熟悉这个主题。我鼓励你看看下面的参考资料,以获得更多关于处理人工智能风险的观点。

注意事项:

[1]直面人工智能的风险,麦肯锡。https://www . McKinsey . com/business-functions/McKinsey-analytics/our-insights/对抗人工智能风险

[2] AI 与风险管理,德勤。https://www2 . Deloitte . com/global/en/pages/financial-services/articles/GX-ai-and-risk-management . html

[3]Ulrika jgare,假人的数据科学策略,2019,Wiley。

4衍生机器学习和人工智能,麦肯锡。https://www . McKinsey . com/business-functions/risk/our-insights/derisking-machine-learning-and-artificial-intelligence

[5]理解人工智能和机器学习的模型风险管理,EY。https://www . ey . com/en _ us/banking-capital-markets/understand-model-risk-management-for-ai and-machine-learning

YouTube 上 7 个被低估的频道

原文:https://towardsdatascience.com/7-underrated-channels-to-follow-on-youtube-251a3aedde37?source=collection_archive---------37-----------------------

人工智能、人工智能和数据科学领域的游戏规则改变者

阿瑟尼·托古列夫在 Unsplash 上的照片

A 人工智能,数据科学是一个捆绑在一起的主题海洋,包括统计学、数学、机器学习、深度学习、云、编程知识、领域知识,以及一个永无止境的列表。它是综合性的,这些领域的研究每天都在涌现。自从哈佛商业评论宣布“21 世纪最性感的工作”以来,这份工作的受欢迎程度达到了顶峰。

很多时候我们经常感到困惑,我们问自己这个问题 我从哪里开始?掌握这个领域最好的资源是什么?我们遇到了许多障碍,以我个人的经验,仅仅一种资源不足以理解像线性回归这样简单的主题。

在这篇文章中,我汇集了一些在 YouTube 上被低估但在人工智能数据科学领域却是杰出领导者的最佳创造者。YouTube 是一个获取任何知识的伟大平台。唯一的投资就是你的 时间 。没有包月,只需几分钟就能给你的生活带来纯粹的附加值。

列出的创作者有一个涵盖广泛主题的技术武器库。它包括从你对任何与人工智能&数据科学相关的主题的理论知识,到获得一份工作或破解你的面试。这篇文章是你 一站式目的地 掌握的领域。

要关注的 YouTube 频道

照片由Sara kurfe在 Unsplash 上拍摄

克里斯·纳伊克

克里斯·纳伊克是一名首席数据科学家,在机器学习深度学习计算机视觉领域处于领先地位。他是一个完整的包裹。他用许多真实世界的场景解释了每一个主题,从理论知识到实践方面。他有很多项目,是社区的积极贡献者。Krish 是下一个日复一日真诚提供服务的人。

** [## 克里斯·纳伊克

我是一名首席数据科学家,在机器学习、深度学习和计算机视觉方面处于领先地位,还是一名教育工作者和…

www.youtube.com](https://www.youtube.com/user/krishnaik06/featured)

阿布舍克·塔库尔

Abhishek Thakur 是首席数据科学家,世界第一 【四次 kaggle 特级大师】 。他完全专注于应用机器学习、深度学习和数据科学。他是一个伟大的问题解决者。他在 YouTube 上的视频纯粹是魔术,它会像专家一样帮助你解决问题。他最近还出版了一本关于 “如何处理任何机器学习问题” 的书,绝对是大师级的。

[## 阿布舍克·塔库尔

我制作关于应用机器学习、深度学习和数据科学的视频。我是世界上第一个 4x 特级大师…

www.youtube.com](https://www.youtube.com/c/AbhishekThakurAbhi/featured)

代码基础

Code Basics 是 YouTube 的一个频道,它提供了广泛的工具和技术,如 TensorFlow、PowerBI、Python、数据结构和算法。实践环节非常直观,易于理解。除此之外,他还与其他数据科学家举行各种会议,并在人工智能和数据科学领域提供职业指导。

[## 代码基础

朋友们,我叫 Dhaval Patel,作为一名软件工程师,我已经有超过 15 年的工作经验。我已经…

www.youtube.com](https://www.youtube.com/c/codebasics/featured)

人工智能工程

AIEngineering 是另一个很棒的 YouTube 频道,它涵盖了许多端到端的项目,特别是处理机器学习、人工智能、数据工程开发运营模型部署和 ML/AI 业务用例(概述和实施)等工具和技术。这些视频很深入,对主题进行了详细而简单的解释。

[## 人工智能工程

这个频道将发布“所有数据”的信息..我将通过该频道讨论的主题是机器…

www.youtube.com](https://www.youtube.com/c/AIEngineeringLife/featured)

StatQuest

砰!!!!它已经成为一个标志性的单词。Joshua Starmer 的 StatQuest 是 YouTube 的一个频道,它将帮助你以一种简单的方式理解复杂的统计学和机器学习概念。这些概念被很好地分成多个有趣的小视频,这使得学习更加简单。理想的学习体验旨在适应我们的生活节奏。他是一个伟大的老师,也是一个伟大的艺人。

[## Josh Starmer 的 StatQuest

统计学、机器学习和数据科学有时看起来是非常可怕的话题,但由于每种技术都是…

www.youtube.com](https://www.youtube.com/c/joshstarmer/featured)

跳板

印度跳板是 YouTube 的一个频道,这个频道关注的是这样一个事实,即教育应该让我们为真实世界做好准备&在行业专家的指导下从事有意义的项目是实现这一目标的最佳途径之一。在这个频道中,他们分享 explainer 视频、职业建议和对数据科学、人工智能、机器学习和数据分析的现实生活从业者的采访。

[## 跳板

在线学习,有工作保障。找份工作或者把你的钱要回来。深入数据科学、UX 设计等领域…

www.youtube.com](https://www.youtube.com/channel/UCqd6TofKNjqagInm5Waeu7w)

数据教授

数据教授是 Chanin Nantasenamat 的一个 YouTube 频道。他获得了博士学位,是一所研究型大学的生物信息学副教授,领导着一个研究实验室,利用数据科学来揭示医学中大数据的隐藏知识。在这里,您将获得由讲解者视频和实践教程组成的数据科学内容。该频道的主要目的是帮助学生和数据爱好者了解数据科学以及如何利用它来理解数据。

[## 数据教授

数据科学、机器学习、生物信息学、研究和教学是我的激情所在。数据教授 YouTube…

www.youtube.com](https://www.youtube.com/channel/UCV8e2g4IWQqK71bbzGDEI4Q)

最后说明:—

上面的创作者是一些在他们的领域已经建立的数据科学家,也是 YouTube 上的新兴科学家。现在是我们应该用他们提供的绝对世界级的知识和资源来启发自己的时候了。数据科学是一个热门话题,作为美国顶级企业家之一,马克·库班“如果我们不学习或投资人工智能,并用它来解决商业问题或现实世界的用例,我们将面临成为恐龙的风险”。数据和人工智能将驱动未来,最好是成为趋势的一部分,不要错过机会。**谢谢:)****

人工智能将数字标牌提升到新水平的 7 种方式!

原文:https://towardsdatascience.com/7-ways-ai-is-taking-digital-signage-to-the-next-level-5258c65609ea?source=collection_archive---------38-----------------------

人工智能对我们的生活方式产生了影响。一段时间以来,它一直在数字标牌领域占据一席之地。

AI 正在改变数字标牌,并为其用户提供新的更好的机会。今天,我们专注于这些机会,并看到人工智能和数字标牌相结合的最重要的方面。

目前,你会得出结论,人工智能将增强数字标牌的功能。它将使用所有必须处理的数据来改进内容的创建和向目标受众显示的方式。

数字标牌是一种多方面的工具,人工智能的加入扩展了这种多功能性,并确保它尽可能地流畅。

现在,让我们来看看人工智能和机器学习是如何影响数字标牌世界的。

1)更简单的数据收集

数字标牌的主要目的是传播信息。然而,今天它已经出现到你可以在 AI 的帮助下收集数据的地步。

使用带有面部识别等组件的下一代数字标牌解决方案,零售商可以更清楚地了解他们的客户是谁。

由于面部识别诚实地分享了隐私问题,获得的数据可能会影响企业的商业战略或方向,以适应他们的观众。此外,数字标牌可以获取收集的信息,甚至实时使用这些信息。

2)更个性化的用户体验

作为人类,我们内心是感性的。事实上,像机器人和人工智能这样冰冷和没有生命的东西可以激发我们的情感。研究甚至表明,尽管知道人工智能的本质,人们仍然对它做出反应,就好像它是一个真人一样。这就是为什么 AI 为数字标牌已经提供的个性化用户体验带来了一种新的范式。

在数字标牌中,如果技术以更个性化的方式对待客户,他们会感到很特别。人工智能学习使数字标牌能够以独特的方式学习并与真人互动。

数字标牌人工智能可以识别客户并问候她或他。它可以根据用户的购买历史来传达产品报价和折扣等信息。

3)更具互动性的界面

虽然个性化是一个令人兴奋的元素,但当涉及到交易购买时,每个客户都欣赏效率。

交互式店内数字标牌始终是一种选择。消费者可以看到现有的产品,他们的特点,并获得更多的信息更快,而不必等待工作人员。有些人甚至喜欢不受干扰地浏览网页。

未来,AI 会让顾客的购物体验更好。例如,顾客可以带一件或几件商品到附近的展示区查看价格和特征。

数字标牌甚至可以立刻比较两种产品。通过将在线购物的许多组成部分带到现实世界,这可以真正帮助提供全渠道购物体验。

4)更多相关内容

我们已经提到了根据顾客以前的购买情况推出特别折扣。人工智能的这一方面也可以在生产内容中发挥作用。这些数据可以帮助数字标牌显示特定的广告。

在雨天或寒冷的天气,有些产品可能比其他产品更受欢迎。你会观察现实生活中出现的卖伞小贩。

同样,天气信息可以自动调整数字标牌内容,并可能影响购买决策。广告不仅可以基于分析显示,还可以基于天气、一天中的时间、一周、一年等等。

5)更好的广告安排

人工智能不仅仅是一种识别客户面部的技术。人工智能在购买广告空间方面也起着至关重要的作用。

它已经在网络上展示程序化广告领域存在了相当长的一段时间。它允许传递相关内容,并使实时竞价更加有效。

将这一概念应用于零售数字标牌,可以加速正确的广告投放。零售商可以参与程序化广告,在全球范围内的数字标牌上购买广告空间。这些广告的功效将类似于在线广告,因为数字标牌 AI 使用关于客户的数据来选择向他们显示哪些广告。

随着人工智能的进一步发展以及与数字标牌等技术的融合,个性化水平将在很大程度上增长。问题只是有多远。人工智能将会提高生产力。随着数字标牌已经使顾客在零售中的体验更加舒适,人工智能将进一步推动这一点。消费者找到产品的容易程度和他们意识到适合他们的产品的速度也将增长。

6)深度学习和人工智能

深度学习是人工智能中 ML(机器学习)的一个子集,其中人工神经网络在处理信息和创建用于决策的模式方面模仿人脑。

人工智能驱动的引擎可以访问大量数据。通过深度学习,人工智能驱动的平台可以评估大型数据集,大部分是实时的,从而导致特定的反应。

随着精度和数据处理的提高,对用户的了解也更加深入。但是人工智能不一定会替你思考。都是关于自动化的。它得出结论,检测模式,并对情况做出反应。

7)环境感知型数字标牌

智能数字标牌的适应性允许在一天甚至一周的不同时间安排和显示不同的内容。

内容也可以实时呈现,以反映快速变化的环境。例如,感知环境的数字标牌可以显示与外面天气相关的内容:阳光明媚时可以自动显示太阳镜广告,下雨时可以自动显示雨伞广告。

结论

可以得出结论,人工智能和数字标牌是齐头并进的。到 2023 年,数字标牌市场预计将增长至 328.4 亿美元,到 2024 年,人工智能的市场整体将增长至 1910 亿美元。

无论是从市场增长的角度还是从新发展的角度来看,这两家公司都有着光明的未来。

人工智能的几个方面已经成为数字标牌世界的一部分,它们成为广为人知的匹配只是时间问题。

识破数据科学家谎言和欺骗的 7 种方法

原文:https://towardsdatascience.com/7-ways-to-catch-a-data-scientists-lies-and-deception-5eaae79d2303?source=collection_archive---------7-----------------------

亚历克斯·利特温在 Unsplash 上的照片

确保你不会被卖给你“人工智能”和“机器学习”的人利用的 7 个简单原则

声明:所有表达的观点都是我自己的。

W 无论你是商业领袖、企业家、天使投资人、公司中层管理人员、黑客马拉松的评委,还是参与‘科技’的人,在某个时候,你都可能会遇到有人试图向你‘出售’他们的“人工智能产品”、“机器学习软件”或其他一些时髦词汇的情况。如果你发现自己处于这种情况,很自然地会觉得自己没有足够的知识和专业技能来做出明智的决定。坚持自己的立场,不要被压倒!以下是 7 个常识性的方法,可以帮助你将信号从噪音中分离出来。这些将帮助你切入正题,并帮助你理解你所推销的机器学习解决方案的核心价值主张。

1.“我们用人工智能来……”

来源:https://media2.giphy.com

别人说“艾”的时候要特别小心。虽然这可能是一种幻想营销,但也可能是一种真诚的努力,试图抽象出令人痛苦的复杂细节,以便不打扰你。假定他们是无辜的但是要深入细节。进一步了解他们使用了哪种特定的机器学习模型。让他们举一反三给你解释一下。

如果不能简单的解释,说明你理解的不够好。——阿尔伯特·爱因斯坦

这里有几个要问的其他关键问题:

  1. 您尝试过哪些其他方法(模型/算法/技术),结果与选择的解决方案相比如何?(如有可能,要求提供图形证据)
  2. 你为什么选择这种方法而不是其他方法?
  3. 为什么你认为这种方法在这个数据上优于其他方法?
  4. 有人解决过类似的问题吗?如果是,他们使用了哪种方法?

起初,你可能不一定理解这些问题答案的所有细节,但你应该尽可能多地询问、澄清和理解。

在我的经验中,我还没有遇到一个机器学习概念不能用类比来解释。所以,如果交流太多的技术细节是一个挑战的话,要求一个高层次的解释。这样的审视不仅会扩展你的理解,还会表明解决方案考虑得有多周全。(这也将证明你的会议室是一个禁止废话的区域😎)

2.适应者的生存

来源:https://i.pinimg.com

在 20 世纪 90 年代和 21 世纪初,电子邮件收件箱中的垃圾邮件过滤器会寻找拼写错误和其他简单的指标,自动将垃圾邮件放入垃圾邮件文件夹。现在,垃圾邮件发送者变得越来越聪明,垃圾邮件也变得越来越难以检测。现代电子邮件提供商使用的机器学习模型必须适应并变得更加复杂,才能正确识别垃圾邮件。

“所有的失败都是适应的失败,所有的成功都是成功的适应。”——马克斯·麦克欧文

你必须澄清的一件事是,随着时间的推移和输入数据的演变,机器学习模型在新数据上重新训练或被更具性能的模型取代的难易程度如何。这一点至关重要,因为你有权知道出售给你的解决方案是否有“到期日”。

3.垃圾进垃圾出

来源:https://media.tenor.com

机器学习模型的好坏取决于它的数据。因此,你应该确定用于训练机器学习模型的数据质量。虽然“质量”很难定义,并且可能因环境而异,但了解训练数据质量的一个简单方法是询问— 与模型将面对的“真实世界”数据相比,训练数据的相似性和代表性如何。

“我们相信上帝,所有其他人都会带来(高质量的)数据。”爱德华·戴明

无论一个机器学习模型有多么花哨或者多么先进,如果训练它的数据质量很差,结果肯定会很糟糕。

4.更多,更多,更多!

来源:https://media1.tenor.com/

一般来说,模型训练的数据越多,它的表现就越好(其他条件相同)。深度学习模型更是如此。你可以把一个机器学习模型想象成一个高中生为了 sat 而练习做题。练习更多种类的问题会增加学生在 sat 考试中表现更好的可能性。

"在没有(充分的)数据之前就建立理论是一个严重的错误."—夏洛克·福尔摩斯

确保在训练任何机器学习模型时使用了充足的数据是至关重要的。多少数据才够?很难说需要多少数据,但是越多越好!理想情况下,数据应该来自可靠的来源,并且应该尽可能地使用这些来源。

5.可解释性

来源:https://lh3.googleusercontent.com

在机器学习中,模型的表现如何,以及其表现(尤其是糟糕的表现)可以被解释的难易程度之间,往往存在权衡。一般来说,对于复杂的数据,更精密和复杂的模型往往做得更好。然而,由于这些模型更加复杂,因此很难解释输入数据对输出结果的影响。例如,让我们想象一下,你正在使用一个非常复杂的机器学习模型来预测一种产品的销量。这个模型的输入是花在电视、报纸和广播广告上的钱。复杂的模型可能会给你非常准确的销售预测,但可能无法告诉你电视、广播或报纸这三个广告渠道中哪一个对销售影响更大,更值得花钱。另一方面,一个更简单的模型可能会给出一个不太准确的结果,但却能够解释哪一个商店更值得花钱。你需要意识到模型性能和可解释性之间的权衡。这是至关重要的,因为在可解释性和表现之间的平衡应该取决于目标,因此应该由你来决定。

6.以正确的方式衡量正确的事情

来源:https://media2.giphy.com

准确性是衡量分类机器学习模型性能的一个非常常见的指标。例如,对猫和狗的图片进行分类的机器学习模型,准确率为 96%,可以认为是非常好的。这意味着在 100 张猫和狗的图片中,模型能够猜对 96 张。现在想象一下,一家银行试图应用相同的指标对欺诈交易进行分类。欺诈分类器可能很容易达到 96%的准确率,因为欺诈交易非常罕见。然而,捕捉欺诈交易并不意味着 96%的时间都是正确的。这是关于减少错误和尽可能多地捕捉欺诈交易,因为错误地将 4%的交易归类为非欺诈交易会造成很大的损失。

测量是神话般的。除非你忙着衡量什么是容易衡量的,而不是什么是重要的。——塞思·戈丁

对于银行欺诈的例子,假阴性的数量比准确性更能说明模型的性能。根据问题的不同,应该使用其他一些指标,如精确度、召回率、特异性和 F1 分数,而不是精确度。这里有一篇由 Mohammed Sunasra 撰写的的精彩文章,讲述了这些工具应该在什么时候使用。因此,至关重要的是尽可能注意使用正确的指标和各种指标。

7.那么…你的优势和劣势是什么?

来源:https://i2.wp.com

在企业面试中,优势-劣势问题是一个老生常谈的问题,当试图评估机器学习解决方案时,这个问题会非常方便。当有人提出机器学习解决方案时,你绝对应该询问他们解决方案的局限性。了解回答两个关键问题的局限性是非常重要的:

  1. 实施该解决方案的优势是否足以超过限制?
  2. 这些限制会影响未来的表现吗?

“成功的关键是了解自己的弱点,并成功地弥补它们。缺乏这种能力的人会长期失败。”—雷伊·达里奥

从实现有效和可持续的机器学习解决方案的角度来看,了解其局限性对其成功至关重要。此外,要求支持者坦白他们解决方案的局限性会让你了解他们的透明度。它将表明解决方案考虑得有多周全,以及提出解决方案的人有多值得信任。

结论

不管你感到多么缺乏知识和不知所措,你有一个秘密武器可以帮助你——一个引导你穿过迷雾的手电筒。这个秘密武器就是你提问的能力。提问!质疑、澄清和审视你不确定的一切。上面提到的这 7 个想法会给你一个整体策略和 7 个关键维度,你可以沿着这 7 个维度提问。你可以依靠它们来增强你的理解,并合理地评估机器学习解决方案。

7 种入门 ML 的方法,从最容易到最难排列

原文:https://towardsdatascience.com/7-ways-to-get-started-into-ml-ranked-from-easiest-to-hardest-b631cd57727a?source=collection_archive---------51-----------------------

入门

永远不要因为事情难做而放弃,没有什么值得拥有的东西来之不易。

图片由查克·安德伍德从皮克斯拜拍摄

机器学习是教计算机如何从数据中学习以做出决策(或预测)。坐在计算机科学和统计学的交叉点上,你可能会看到几个热门词汇,比如:

数据科学、大数据、人工智能、预测分析、计算统计、数据挖掘、监督学习、强化学习等。

那么,如何打入机器学习呢?

1.观看 ML 相关视频。

那么,你想开始进入 ML 吗?好消息是网上有无数的教程。YouTubers 没有筛选大量的内容,而是挑选出有趣的内容,使其简洁,并尽可能用通俗的语言解释。

这篇文章介绍了七个 YouTube 频道,旨在揭示机器学习领域最新、最酷的发展。例如,两分钟的论文视频很有趣,很吸引人,看起来绝对是一种享受。

[## 7 个必不可少的人工智能 YouTube 频道

如何跟上最新最酷的机器学习进展

towardsdatascience.com](/7-essential-ai-youtube-channels-d545ab401c4)

许多会议邀请著名的演讲者和作者为那些喜欢听行业专家和研究人员自己演讲的人展示他们的论文。神经信息处理系统会议(NeurIPS),机器学习领域的领先会议之一,发布了他们的免费访问视频。

2.阅读 ML 中的趋势和事件。

在《走向数据科学》杂志上,作者向广大读者呈现内容丰富的书面文章。无论你是在寻找了解更多数据科学的步骤,获得机器学习的最新更新,还是听到关于人工智能职业的建议,走向数据科学都可以为你提供全方位的学习体验。

让你跟上机器学习的其他值得注意的来源是

  • 麻省理工学院新闻
  • 有线
  • 自然研究
  • 企业家

也可以在 LinkedIn 上联系关注 ML 的人。他们自然会分享 how-tos 教程和最新的 ML 开发。

3.参加 ML 课程。

对于初学者来说,AI 的元素是一系列免费的在线课程,适合广大观众学习什么是 ML,可以(和不可以)用 ML 做什么,以及如何开始创建 ML 模型。

吴恩达的《AI For everybody》是一本很好的 ML 入门书;它全面概述了什么是 ML 以及围绕 ML 的各种概念、术语和方法。这门课程大多是非技术性的,适合任何人,是一门优秀的入门课程。

想深潜的可以从选择深度学习专精课程中自己感兴趣的专精开始。无论是计算机视觉还是自然语言处理,吴恩达教授算法工作背后的关键概念和机制。fast.ai 提供免费的在线课程,这是一种实用的方法,通过提供 PyTorch 的实际操作来补充吴恩达的方法。

对于那些对 TensorFlow 感兴趣的人,谷歌有带 TensorFlow APIs 的机器学习速成班。这是对机器学习的实用介绍,有视频讲座、真实案例研究和动手实践练习供您遵循。

4.写下你的 ML 旅程。

定期消费信息并不是学习和成长的理想方式。在你所有的阅读和学习之后,写下你的想法的过程有助于理清你的思路。这是一个时间和空间来处理这些信息并反思你所学到的东西。

在消费更多内容的同时创造内容的过程,写作可以让你强化你的学习。作为一名数据科学家,有效的沟通是需要磨练的最重要的非技术技能之一。

你可以从写关于数据科学的文章开始(如何投稿)。我们的编辑通过提供反馈来帮助作者表达他们的想法。通过依靠不同的流量来源,如媒体源、社交媒体和时事通讯,在《走向数据科学》中发布可让您接触到更广泛的受众。

或者,你可以托管你的网站,完全控制网站的内容和风格。我建议查看一下 GitHub 页面。您的内容直接托管在您的 GitHub 存储库中,您可以通过使用您的用户名(如https://username.github.io)访问这些内容。例如,你可以在 https://jinglescode.github.io/的查看我的。

5.从 ML 宠物项目开始。

现在,这是事情变得更加实际的时候。课程有助于培养基本技能,但参与项目是一种很好的学习方式。你将被迫独自批判性地思考问题和解决方案。它建立了无法教授的特定知识和技能;看别人做比自己学做容易多了。

一个宠物项目可以让你在更深的层次上探索和应用你所学到的东西。从职业角度来看,这将使你能够建立一个投资组合,并向潜在雇主展示。你会知道如何问正确的问题,尤其是如何谷歌正确的问题。它让你在一个端到端的机器学习项目中面临各种各样的问题。

这里是一个宠物项目的例子。一个基于 web 的项目,通过 TensorFlow.js 框架从在线 API 提取股票价格,并使用长短期记忆执行预测。在我称之为的游乐场中查看一些我喜欢的项目。

[## 用 TensorFlow.js - Hong Jing (Jingles)进行时间序列预测

从在线 API 中提取股票价格,并使用递归神经网络和长短期记忆进行预测…

jinglescode.github.io](https://jinglescode.github.io/time-series-forecasting-tensorflowjs/)

当决定做一个自己喜欢的项目时,最困难的事情之一就是找时间开始。因为我们大多数人都有一份全职工作,剩下的“空闲时间”都可以用来看《网飞》。但是你从个人项目中获得的学习和成长是金子。

6.参加纸牌比赛。

对于初学者来说,Kaggle 是一个很好的学习工具,因为每个比赛都是独立的。您不需要确定项目的范围和收集那些数据,这使您可以专注于解决问题。此外,讨论和获奖者访谈很有启发性。每个竞赛都有自己的讨论板,并向获胜者汇报。你可以窥视更有经验的数据科学家的思维过程。

比赛还将迫使你应对应用机器学习过程的每一步,包括探索性分析、数据清理、特征工程和模型训练。团队合作是与比你有更多领域知识的人合作的好方法,可以进一步扩大你的机会和向他人学习。

7.为 ML 创业公司工作。

加入一家初创公司是作为数据科学家学习端到端开发运营的绝佳机会。要构建的东西太多了,您将做所有的事情,从获取和清理数据、组织和理解数据,到构建和部署模型。

如果创业时的沉浮态度没有吓到你或让你放弃在创业公司工作,这可能是快速获得一些有价值技能的好方法。由于你将身兼多职,而且你需要随时学习,你将会更好地掌握机器学习以及将机器学习应用于生产的相关流程。

这就是开始机器学习的 7 种方法,从最容易到最难。

  1. 观看 ML 相关视频
  2. 阅读 ML 中的趋势和事件
  3. 参加 ML 课程
  4. 写下你的 ML 旅程
  5. 从 ML 宠物项目开始
  6. 参加纸牌比赛
  7. 为 ML startup 工作

你目前处于哪个阶段并不重要。选择一种适合你的学习方式,这种方式对你来说很舒服——在感知到的任务挑战和个人感知到的技能之间找到恰当的平衡。

你永远不应该因为某件事难做而放弃它。任何值得拥有的东西都来之不易。

现在就开始吗?

了解卷积的工作原理。

[## 深度学习神经网络中卷积层是如何工作的?

理解卷积及其参数的生动方式

towardsdatascience.com](/how-convolutional-layers-work-in-deep-learning-neural-networks-2913af333b72)

了解更多变形金刚,关注。

[## 变压器图解指南

逐个组件的细分分析

towardsdatascience.com](/illustrated-guide-to-transformer-cf6969ffa067)

机器学习中处理缺失值的 7 种方法

原文:https://towardsdatascience.com/7-ways-to-handle-missing-values-in-machine-learning-1a6326adf79e?source=collection_archive---------1-----------------------

凯文·Ku 在 Unsplash 上的照片

处理数据集中缺失值的常用策略

真实世界的数据通常有很多缺失值。丢失值的原因可能是数据损坏或未能记录数据。在数据集的预处理过程中,缺失数据的处理非常重要,因为许多机器学习算法不支持缺失值。

本文涵盖了处理数据集中缺失值的 7 种方法:

  1. 删除缺少值的行
  2. 估算连续变量的缺失值
  3. 估算分类变量的缺失值
  4. 其他估算方法
  5. 使用支持缺失值的算法
  6. 缺失值的预测
  7. 使用深度学习库 Datawig 进行插补

使用的数据是来自 Kaggle 的泰坦尼克号数据集

data = pd.read_csv("train.csv")
msno.matrix(data)

(图片由作者提供),缺失值的可视化:白线表示存在缺失值

删除缺少值的行:

缺失值可以通过删除具有空值的行或列来处理。如果列中有超过一半的行为 null,则可以删除整列。也可以删除一个或多个列值为 null 的行。

(图片由作者提供)左:具有空值的数据,右:移除空值后的数据

优点:

  • 通过移除所有缺失值来训练的模型创建了稳健的模型。

缺点:

  • 大量信息的丢失。
  • 如果与完整数据集相比,缺失值的百分比过大,则效果不佳。

用平均值/中值估算缺失值:

数据集中具有连续数值的列可以替换为该列中剩余值的平均值、中值或众数。与以前的方法相比,这种方法可以防止数据丢失。替换上述两个近似值(平均值、中值)是处理缺失值的统计方法。

(图片由作者提供)左:插补前的年龄栏,右:按平均值插补后的年龄栏

在上面的例子中,缺失值由平均值代替,同样,它也可以由中值代替。

赞成者:

  • 防止导致行或列删除的数据丢失
  • 适用于小型数据集,并且易于实现。

缺点:

  • 仅适用于数值连续变量。
  • 会导致数据泄露
  • 不要考虑要素之间的协方差。

分类列的插补方法:

当缺失值来自分类列(字符串或数字)时,可以用最常见的类别替换缺失值。如果缺失值的数量非常大,那么可以用新的类别来替换。

(图片由作者提供)左图:插补前的数据,右图:通过“U”插补后的客舱栏

优点:

  • 防止导致行或列删除的数据丢失
  • 适用于小型数据集,并且易于实现。
  • 通过添加唯一的类别来消除数据丢失

缺点:

  • 仅适用于分类变量。
  • 编码时向模型添加新特征,这可能会导致性能下降

其他插补方法:

根据数据的性质或数据类型,其他一些估算方法可能更适合估算缺失值。

例如,对于具有纵向行为的数据变量,使用最后一个有效的观察值来填充缺少的值可能是有意义的。这就是所谓的最后观察结转(LOCF)方法。

对于时序数据集变量,对缺失值使用时间戳前后的变量插值是有意义的。

使用支持缺失值的算法:

所有的机器学习算法都不支持缺失值,但一些 ML 算法对数据集中的缺失值具有鲁棒性。当缺少值时,k-NN 算法可以忽略距离度量中的列。在进行预测时,朴素贝叶斯也可以支持缺失值。当数据集包含空值或缺失值时,可以使用这些算法。

Python 中朴素贝叶斯和 k-最近邻的 sklearn 实现不支持缺失值的存在。

这里可以使用的另一个算法是 RandomForest,它适用于非线性和分类数据。它适应考虑高方差或偏差的数据结构,在大型数据集上产生更好的结果。

优点:

  • 不需要处理每一列中的缺失值,因为 ML 算法将有效地处理它们。

缺点:

  • scikit-learn 库中没有这些 ML 算法的实现。

缺失值的预测:

在早期处理缺失值的方法中,我们没有利用包含缺失值的变量与其他变量的相关性优势。使用没有空值的其他特征可用于预测缺失值。

根据具有缺失值的要素的性质(分类或连续),回归或分类模型可用于缺失值的预测。

Here 'Age' column contains missing values so for prediction of null values the spliting of data will be,**y_train**: rows from data["Age"] with non null values
**y_test**: rows from data["Age"] with null values
**X_train**: Dataset except data["Age"] features with non null values
**X_test**: Dataset except data["Age"] features with null values

(作者代码)

[## 预测数据集中缺失的值

了解如何使用机器学习模型及其实现来预测数据集中的缺失值

towardsdatascience.com](/predict-missing-values-in-the-dataset-897912a54b7b)

优点:

  • 给出比早期方法更好的结果
  • 考虑缺失值列和其他列之间的协方差。

缺点:

  • 仅被视为真实值的代表

使用深度学习库进行插补— Datawig

这种方法非常适用于分类的、连续的和非数字的特征。Datawig 是一个库,它使用深度神经网络来学习 ML 模型,以估算数据报中的缺失值。

Install datawig library,
**pip3 install datawig**

Datawig 可以获取一个数据帧,并以所有其他列作为输入,为每一列的缺失值拟合插补模型。

下面是估算年龄列中缺失值的代码

(作者代码)

优点:

  • 与其他方法相比相当准确。
  • 它支持 CPU 和 GPU。

缺点:

  • 对于大型数据集可能会非常慢。

结论:

每个数据集都有需要智能处理的缺失值,以创建稳健的模型。在本文中,我讨论了 7 种处理缺失值的方法,它们可以处理每种类型的列中的缺失值。没有以特定方式处理缺失值的重击规则,这种方法可以获得具有最佳性能的健壮模型。根据数据的方式和内容,可以对不同的特征使用不同的方法。了解数据集的领域知识非常重要,这有助于了解如何预处理数据和处理缺失值。

参考文献:

[1]数据维格:https://github.com/awslabs/datawig

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

[## 加入我的推荐链接-萨蒂扬库马尔媒体

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

satyam-kumar.medium.com](https://satyam-kumar.medium.com/membership)

感谢您的阅读

操纵熊猫数据框的 7 种方法

原文:https://towardsdatascience.com/7-ways-to-manipulate-pandas-dataframes-f5ec03fe944c?source=collection_archive---------17-----------------------

熊猫提供了很大的灵活性

Pandas 是一个非常强大和通用的 Python 数据分析库,它加速了数据分析和探索过程。Pandas 的优势之一是它提供了多种数据操作的功能和方法。

在 Unsplash 上由 Waldemar Brandt 拍照

数据帧是熊猫的核心数据结构。为了掌握熊猫,你应该能够轻松流畅地摆弄数据帧。在这篇文章中,我们将讨论不同的方法来操作或编辑它们。

让我们从导入 NumPy 和 Pandas 开始,并创建一个示例数据帧。

import numpy as np
import pandas as pdvalues = np.random.randint(10, size=(3,7))
df = pd.DataFrame(values, columns=list('ABCDEFG'))
df.insert(0, 'category', ['cat1','cat2','cat3'])df

我们将提到的第一种操作方式是熔化功能,它将宽数据帧(大量列)转换成窄数据帧。一些数据帧的结构是连续的测量值或变量用列来表示。在某些情况下,将这些列表示为行可能更适合我们的任务。

#1 meltdf_melted = pd.melt(df, id_vars='category')
df_melted.head()

id_vars 参数指定的列保持不变,其他列显示在变量和值列下。

第二种方法是增加索引级别的堆栈函数。

  • 如果 dataframe 有一个简单的列索引,stack 返回一个系列,其索引由原始 dataframe 的行列对组成。
  • 如果数据帧有多级索引,stack 增加索引级别。

考虑以下数据帧:

#2 stackdf_stacked = df_measurements.stack().to_frame()
df_stacked[:6]

在这种情况下,stack 函数返回一个 Series 对象,但是我们使用 to_frame 函数将其转换为 dataframe。

顾名思义,拆分功能是堆栈功能的反向操作。

#3 unstackdf_stacked.unstack()

添加或删除列可能是我们做得最多的操作。让我们添加一个新列并删除一些现有的列。

#4 add or drop columnsdf['city'] = ['Rome','Madrid','Houston']
df.drop(['E','F','G'], axis=1, inplace=True)df

我们创建了一个包含列表的新列。Pandas 系列或 NumPy 数组也可用于创建列。

要删除列,除了列名之外,轴参数应该设置为 1。为了保存更改,将原位参数设置为真。

默认情况下,新列会添加到 dataframe 的末尾。如果希望新列放置在特定位置,应该使用 insert 函数。

#5 insertdf.insert(0, 'first_column', [4,2,5])df

我们可能还想添加或删除行。

append 函数可用于添加新行。

#6 add or drop rowsnew_row = {'A':4, 'B':2, 'C':5, 'D':4, 'city':'Berlin'}
df = df.append(new_row, ignore_index=True)df

我们可以像删除列一样删除 a。唯一的变化是轴参数值。

df.drop([3], axis=0, inplace=True)df

对数据帧的另一个修改可以通过 pivot_table 函数实现。考虑以下具有 30 行的数据帧:

import randomA = np.random.randint(10, size=30)
B = np.random.randint(10, size=30)
city = random.sample(['Rome', 'Houston', 'Berlin']*10, 30)
cat = random.sample(['cat1', 'cat2', 'cat3']*10 ,30)df = pd.DataFrame({'A':A, 'B':B, 'city':city, 'cat':cat})
df.head()

pivot_table 函数也可以被视为从不同的角度查看数据框架的一种方式。它通过允许变量以不同的格式表示数据来探索变量之间的关系。

#7 pivot_tabledf.pivot_table(index='cat', columns='city', aggfunc='mean')

返回的数据帧包含每个 city-cat 对的平均值。

我们已经介绍了 7 种编辑或操作数据帧的方法。其中一些非常常见,你可能几乎每天都在使用它们。也会有需要使用稀有的情况。

我认为熊猫的成功和流行来自于多功能、强大和易于使用的操作和分析数据的功能。和熊猫一起完成一项任务几乎总是有多种方式。由于花在数据科学项目上的大部分时间都花在数据清理和预处理步骤上,所以非常鼓励学习 Pandas。

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

你应该在 LinkedIn 上关注的 7 位数据科学领域的女性

原文:https://towardsdatascience.com/7-women-you-should-be-following-on-linkedin-737362a7777f?source=collection_archive---------34-----------------------

作为一名数据科学家,不断进步并跟上时代的步伐

布鲁克·拉克在 Unsplash 拍摄的照片

P 撤回这篇文章我分享了 你应该在 LinkedIn 上关注的 8 个人 。当我看到帖子的结尾时,我意识到“等一下……我一个字都没有提到一位单身女士!”

考虑到您已经阅读了我的上一篇文章,您会惊讶地发现,实际上有许多女性在数据科学领域做出了值得肯定的非凡成就。在女士们联合起来割破我的喉咙之前,我必须声明我真的在 LinkedIn 上关注了很多女性领导者——事实上,我有策略地计划写两篇独立的帖子!

事不宜迟。女士们先生们,你们应该在 LinkedIn 上关注这些开拓创新的女性。

#1 — 凯特·斯特拉赫妮

任何数据可视化?凯特是只山羊。她是数据化学院的创始人,该学院专注于提供数据可视化最佳实践的培训。哦,我说过她写了 4 本书吗?耶!

  • 数据科学之母
  • 儿童数据素养
  • 数据科学家之旅
  • 颠覆者:数据科学领导者数据科学领导者:有影响力的领导者集体传记:第一卷

我忘了补充一点,她在做这些事情的同时平衡了她作为父母的责任。看,我有一个侄女(我已经提到过几次),当她在我身边时,我不得不停止我的日常工作,因为她成了老板——老实说,我不知道凯特是怎么做到的,但她做到了,因此她在 LinkedIn 上有超过 10 万名粉丝就很有道理了。

来源 : 数据可视化工具的数据化指南

附言凯特还不时在 LinkedIn 上做视频直播,讨论数据可视化。长话短说,跟着凯特就好!

[## 凯特·斯特拉赫尼·♕——数据学院| LinkedIn 创始人

" "我只是想分享一个简短的说明,让你知道你和 StorybyData 的团队已经完成了一项…

www.linkedin.com](https://www.linkedin.com/in/kate-strachnyi-data/)

#2 — 王梦瑶

梦瑶甚至可能会惊讶的发现自己上了这个榜单,不是因为她缺乏自信,不,不可能!梦瑶很可能会因为两个原因而感到惊讶,首先是她可能会对自己受到关注感到震惊,其次是因为她仍在学习数据科学— “但即使是首席数据科学家 Kurtis 也仍在学习”。不,当我说她还在学习的时候,我的意思是她还在学习!

从她的 LinkedIn 个人资料来看,她有一些作为数据分析师的经验,这是进入数据科学的一个非常自然的过程,所以她并不是一无所知。虽然她可能不像凯特或其他一些女士那样拥有以下粉丝,但她的帖子仍然很有冲击力——主要包括围绕机器学习和数据科学的免费书籍的链接。

她的 LinkedIn 上的头条是:

“我与我出色的 LinkedIn 朋友分享我进入数据科学的学习之旅,请关注我,让我们一起成长!”

离开梦瑶的帖子(其中大部分我都会收藏并重新浏览),如果你问我,这不是个坏建议。

[## 王梦瑶-营销经理-黑客制造者| LinkedIn

在全球最大的职业社区 LinkedIn 上查看王梦瑶的个人资料。梦瑶有 3 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/mengyaowang11/)

第三名——凯西·科济尔科夫

凯西有一份这样的简历,你拿起它开始摇晃,然后想知道到目前为止你是否做出了正确的人生决定。伙计,这位女士很在行!然而,作为她的帖子的热心观众,我感觉她是一个充满活力而又温柔的人,超越了她对非常复杂的话题的简单解释。还记得由数据科学家 解释的 P 值的 Admond Lee 的病毒帖子吗?原来是凯西启发阿德蒙德写了那个帖子——这充分说明了她的教学的影响力和有效性。

在谷歌担任首席决策科学家——这是她在谷歌创立的一个领域…

来源 : 卡西解释什么是置信区间

看,如果你现在还不相信,我真的不知道还能说什么。

[## Cassie Kozyrkov -首席决策科学家-谷歌| LinkedIn

我是谷歌的数据科学家和领导者,我的使命是让决策智能和安全可靠的人工智能民主化。我…

www.linkedin.com](https://www.linkedin.com/in/cassie-kozyrkov-9531919/)

#4 — 安吉拉·巴尔蒂斯

首先,祝贺安吉拉在纽约大学担任兼职教授的新职务,她将于 2021 年 1 月开始工作。安吉拉非常特立独行,自从跟随她之后,我在她身上看到了两种类型的人。第一个是这个非常严肃的人,表达了她对招聘数据科学家的欺诈行为的担忧,另一个是有很多玩笑的人。

来源 : 安吉拉·巴尔蒂斯近期活动——LinkedIn

很明显,她非常有激情,非常有趣,是专业人士的完美结合。

[## Angela Baltes -机构数据科学家-新墨西哥大学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看安吉拉·巴尔蒂斯的个人资料。安吉拉有 9 份工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/angelabaltes/)

#5 — 克里斯汀·凯尔勒

我第一次见到克里斯汀是在她和凯特(我在上面提到过她)一起生活的早期阶段。这是一次有趣的讨论,讨论开始时谈到了封锁(孩子们不去上学)的困难。这段对话引起了我的一些兴趣,因为当凯特在 LinkedIn 上直播时,她经常和与她工作相关的人说话。

原来克里斯汀是加州大学伯克利分校的数据科学讲师,也是 Data Moves 的创始人——最重要的是,克里斯汀在该领域有超过 10 年的经验。

[## Kristen Kehrer -加州大学伯克利分校数据科学讲师| LinkedIn

我帮助数据科学团队:-解释他们的机器学习模型,并充分传达警告…

www.linkedin.com](https://www.linkedin.com/in/kristen-kehrer-datamovesme/)

瑞秋·托马斯

在我的经理告诉我写作的事之后,我读了 Rachel title 在 Medium 上的一篇文章,为什么你(是的,你)应该写博客。当我读完这篇文章的时候,我已经开始写我的第一篇文章了。

雷切尔·托马斯是 USF 应用数据伦理中心的创始主任,该中心旨在解决虚假信息、监控、算法偏见和其他数据滥用等危害,但我与雷切尔的第一次相遇是在 Fast.ai 课程上,她与杰瑞米·霍华德是该课程的联合创始人。

Rachel 对数据世界中的道德规范充满热情,最近发布了一门名为应用数据道德规范的免费课程

来源:应用数据伦理

关注 Rachel 是一个很好的方式来了解数据的道德方面。

[## 雷切尔托马斯-主任,应用数据伦理中心-数据研究所,圣…

Rachel Thomas 是 USF 应用数据伦理中心的创始主任,该中心旨在解决诸如…

www.linkedin.com](https://www.linkedin.com/in/rachel-thomas-942a7923/)

第七名——艾琳娜·泰吉·格雷瓦尔博士

Elena 在 AirBnb 工作了大约 7 年,其中她最后一个职位是数据科学主管用了 3 年时间。现在,埃琳娜是数据科学咨询公司 Data 2 the People 的创始人。

我和埃琳娜的第一次相遇是在下面的对话中…

我很好奇,就在 LinkedIn 上找到了她,并关注了她。

[## Elena Tej Grewal 博士-团队成员,创始人- Data 2 the People | LinkedIn

查看 Elena Tej Grewal 博士在世界上最大的职业社区 LinkedIn 上的个人资料。Elena Tej 有 5 份工作…

www.linkedin.com](https://www.linkedin.com/in/elena-grewal/)

包裹

像上一份名单一样,这份名单很难放在一起,数字背后没有任何意义(它们不是排名)。这个名单上可能有很多名字,但我只列出了想到的前 7 个。

如果你有一些很棒的名字要添加,请在评论区用链接随意评论这些名字,让我们在 LinkedIn 上继续对话…

[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

不应错过的 8 个高级 Python 日志功能

原文:https://towardsdatascience.com/8-advanced-python-logging-features-that-you-shouldnt-miss-a68a5ef1b62d?source=collection_archive---------2-----------------------

在不影响性能的情况下理解你的程序

照片由巴迪·阿巴斯在 Unsplash 拍摄

日志是软件开发中非常重要的一个单元。它帮助开发人员更好地理解程序的执行,并对缺陷和意外失败进行推理。日志消息可以存储诸如程序的当前状态或程序运行的位置等信息。如果出现错误,开发人员可以快速找到导致问题的代码行,并采取相应的措施。

Python 提供了一个非常强大和灵活的内置日志模块,具有许多高级特性。在本文中,我想分享 8 个高级特性,它们将有助于我们开发软件。

记录 101

在查看更多高级功能之前,让我们确保对logging模块有一个基本的了解。

记录器

我们创建来生成日志的实例被称为记录器。它是通过logger = logging.getLogger(__name__)实例化的。最佳实践是使用__name__作为记录器名称,包括包名和模块名。该名称将出现在日志消息中,这有助于开发人员快速找到生成日志的位置。

格式化程序&处理程序

每个记录器都有许多可以修改的配置。稍后将讨论更高级的配置,但最常见的是格式化器处理器

格式化程序指定日志消息的结构。每个日志消息都是一个LogRecord对象,带有多个属性(模块名是其中之一)。当我们定义一个格式化程序时,我们可以决定日志消息应该如何使用这些属性,并且可能使用定制的属性。默认格式化程序如下所示:

severity:logger name:message
# e.g: WARNING:root:Program starts!

具有更多属性的自定义格式化程序如下所示:

"%(asctime)s - [%(levelname)s] -  %(name)s - (%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"# 2020-07-26 23:37:15,374 - [INFO] -  __main__ - (main.py).main(18) - Program starts!

处理程序指定日志消息的目的地。日志消息可以发送到多个目的地。日志模块实际上提供了相当多的标准处理程序。最流行的是将日志发送到文件的 FileHandler 和将日志发送到流的 StreamHandler,例如sys.stderrsys.stdout。记录器实例支持 0 个或多个处理程序。如果没有定义处理程序,那么它会将日志发送到sys.stderr。如果定义了多个处理程序,则目标取决于日志消息的级别和处理程序的级别。

例如,我有一个带有级别警告的 FileHandler 和一个带有级别信息的 StreamHandler。如果我写了一个错误日志消息,那么该消息将被发送到 *sys.stdout* 和日志文件中。

例如:

在这个例子中,我们创建了一个main.pypackage1.pyapp_logger.pyapp_logger.py包含一个函数get_logger,它返回一个记录器实例。logger 实例带有一个自定义格式化程序和两个处理程序:带有信息级别的 StreamHandler 和带有警告级别的 FileHandler。重要的是将基本级别设置为 INFO 或 DEBUG (默认日志级别为 WARNING) ,否则低于 WARNING 级别的日志将被过滤掉。main.pypackage1.py都使用get_logger来创建它们自己的记录器。

图高

基本-日志记录. py

警告日志被发送到控制台输出(sys.stdout)和日志文件,但信息日志仅被发送到控制台输出。如果你能完全理解这个例子中发生了什么以及为什么,那么我们就可以继续开发更高级的特性了。

1.使用 LoggerAdapter 创建用户定义的日志记录属性

正如我前面提到的,LogRecord 有许多属性,开发人员可以选择最重要的属性,并将它们放入格式化程序中。除此之外,日志模块还提供了向日志记录添加用户定义属性的可能性。

一种方法是使用LoggerAdapter。当您创建一个适配器时,您将 logger 实例和您的属性(在字典中)传递给它。这个类提供了与Logger相同的接口,所以你仍然可以调用像logger.info这样的方法。

具有固定值的新属性

如果您希望在日志消息中有一种固定值属性,比如应用程序名,那么您可以使用默认的LoggerAdapter类,并在创建日志记录器时获取属性值。不要忘记在格式化程序中添加这个属性,你可以自由选择它的位置。在下面的代码中,我添加了属性app,这个值是在我创建记录器时定义的。

日志适配器固定值. py

带动态值的新属性

在其他情况下,您可能需要动态属性,例如,一种动态 ID。然后你可以扩展基本的LoggerAdapter并创建你自己的。方法是将额外的属性附加到日志消息的地方。在下面的代码中,我添加了一个动态属性id,它可以在每个日志消息中有所不同。在这种情况下,您不需要在格式化程序中添加属性。

日志适配器动态值. py

2.使用过滤器创建用户定义的日志记录属性

添加动态用户定义属性的另一种方法是使用自定义过滤器。过滤器提供了额外的逻辑来确定输出哪些日志消息。这是在检查基本日志级别之后,但在将日志消息传递给处理程序之前的一个步骤。除了确定日志消息是否应该向前移动,我们还可以在方法filter()中插入新的属性。

图来自 Python 官方文档

在这个例子中,我们在filter()中添加了一个新的属性color,它的值是根据日志消息的级别名确定的。在这种情况下,属性名应该再次添加到格式化程序中。

日志过滤器动态属性. py

3.带有日志模块的多线程

日志模块实际上是以线程安全的方式实现的,所以我们不需要额外的努力。下面的代码显示 MainThread 和 WorkThread 共享同一个 logger 实例,没有竞争条件问题。格式化程序还有一个内置属性threadName

记录多线程. py

在幕后,日志模块几乎在任何地方都使用threading.RLock()RLockLock的区别在于:

  1. Lock只能获得一次,发布后才能获得。另一方面,RLock可以在释放前多次获取,但应该释放相同的次数。
  2. Lock可以被任何线程释放,但是RLock只能被获取它的同一个线程释放。

任何从类Handler扩展的处理程序都有一个方法handle()来发出记录。这是Handler.handle()的一个代码块。如您所见,处理程序将在发出记录之前和之后获取和释放锁。emit()方法可以在不同的处理程序中不同地实现。

handle.py

4.带有日志模块的多处理—队列处理器

尽管日志模块是线程安全的,但它不是进程安全的。如果您希望多个进程写入同一个日志文件,那么您必须手动处理对您的文件的访问。根据测井指南,有几个选项。

QueueHandler +【消费者】流程

一种选择是使用QueueHandler。这个想法是创建一个multiprocessing.Queue实例,并在多个进程之间共享它。在下面的示例中,我们有两个“生产者”进程将日志发送到队列,还有一个“消费者”进程从队列中读取日志并将它们写入日志文件。

队列中的日志可能有不同的级别,因此在log_processor中,我们使用logger.log(record.levelno, record.msg)而不是logger.info()logger.warning()。最后,我们发出信号让log_processor停下来。在多个进程或线程之间共享一个队列实例并不是什么新鲜事,但是日志模块可以帮助我们处理这种情况。

日志队列处理程序. py

queue handler+queue listener

logging.handlers模块中,有一个特殊的类叫做[QueueListener](https://docs.python.org/3/library/logging.handlers.html#logging.handlers.QueueListener)。该类创建一个侦听器实例,该实例具有一个日志消息队列和一个处理日志记录的处理程序列表。QueueListener可以用更少的代码替换我们在前一个例子中创建的listener流程。

日志队列 listener.py

SocketHandler

Cookbook 提供的另一个解决方案是将来自多个进程的日志发送到一个T4,并有一个单独的进程实现一个套接字服务器,该服务器读取日志并发送到目的地。该文档有一个相当详细的实现。

所有这些解决方案基本上都遵循相同的原则:将日志从不同的进程发送到一个集中的位置,要么是队列,要么是远程服务器。另一端的接收器负责将日志记录写入目的地。

5.默认情况下不发出任何库日志— NullHandler

到目前为止,我们已经提到了许多由日志模块实现的处理程序。另一个有用的内置处理程序是[NullHandler](https://docs.python.org/3/howto/logging.html#configuring-logging-for-a-library)。NullHandler 的实现基本上什么都没有。然而,它帮助开发人员区分库日志和应用程序日志。

这是NullHandler的实现。

nullhandler.py

为什么我们需要区分库日志和应用日志?

根据测井模块的作者 Vinay Sajip:

默认情况下,使用logging的第三方库不应该输出日志输出,因为使用它的应用程序的开发人员/用户可能不希望这样。

最佳实践是默认情况下不发出库日志,让库的用户决定他们是否希望在应用程序中接收和处理日志。

作为一个库开发者,我们只需要在__init__.py里面一行代码就可以添加NullHandler。在子包和子模块中,记录器照常保存。当我们通过pip install在我们的应用程序中安装这个包时,默认情况下我们不会看到库中的日志。

记录 nullhandler example.py

使这些日志可见的方法是向应用程序中的库记录器添加处理程序。

# your application 
logging.getLogger("package").addHandler(logging.StreamHandler())

如果库不使用NullHandler,但是你想禁用库日志,那么你可以设置logging.getLogger("package").propagate = False。如果 propagate 设置为 False,那么日志将不会传递给处理程序。

6.旋转日志文件—旋转文件处理程序,timedrotating 文件处理程序

RotatingFileHandler支持日志文件轮换,这使得处理程序能够根据日志文件的最大大小来轮换日志文件。这里需要定义 2 个参数: maxBytesbackupCountmaxBytes 告诉处理程序何时旋转日志。 backupCount 是日志文件的数量,每个扩展日志文件都有一个后缀“. 1”,文件名末尾有“. 2”。如果当前日志消息将使日志文件超过最大大小,那么处理程序将关闭当前文件并打开下一个文件。

这是一个非常类似于食谱的例子。您应该得到 6 个日志文件。

日志文件 rotation.py

另一个文件循环处理程序是TimeRotatingFileHandler,它允许开发人员基于运行时间创建循环日志。时间条件包括:秒、分、小时、日、w0-w6(0 =星期一)和午夜(午夜翻转)。

在以下示例中,我们每秒轮换 5 个备份文件的日志文件。每个备份文件都有一个时间戳作为后缀。

时间文件 rotation.py

7.记录期间的异常

在许多情况下,我们在处理异常时使用logger.error()logger.exception()。但是如果记录器本身引发了一个异常,程序会发生什么呢?嗯,看情况。

记录器错误在处理程序调用emit()时被处理,这意味着任何与格式化或写入相关的异常都被处理程序捕获,而不是被引发。更具体地说,handleError()方法将把引用通告打印给stderr,程序将继续。如果你有一个从Handler类扩展的自定义处理程序,你可以实现你自己的handleError()

在本例中,第二条日志消息的参数太多。所以在控制台输出中,我们收到了 trackback,程序仍然可以继续。

但是,如果异常发生在emit()之外,那么可能会引发异常,程序将会停止。例如,在下面的代码中,我们在logger.info()中添加了一个额外的属性id,而没有在 LoggerAdapter 中处理它。此错误未得到处理,导致程序停止。

日志记录异常引发. py

8.3 种不同的方法来配置您的记录器

我想分享的最后一点是关于配置你的日志。有 3 种方法可以配置记录器。

使用代码

最直接的选择是使用代码来配置您的日志记录器,就像我们在本文中看到的所有例子一样。但是这种方法的缺点是任何修改都需要改变源代码。

使用 ***dictConfig***

第二种选择是在字典中编写配置,并使用logging.config.dictConfig来读取它。您还可以将字典保存到 JSON 文件中,并从那里读取。优点是它可以作为外部配置加载,但由于其结构,它可能容易出错。

日志配置 json.py

使用 ***fileConfig***

最后但同样重要的是,第三个选项是使用logging.config.fileConfig。配置被写入一个单独的.ini文件。

日志配置文件. py

可以通过配置服务器在运行时更新配置。食谱展示了一个客户端和服务器端的例子。通过套接字连接更新配置,在客户端,我们使用c = logging.config.listen(PORT) c.start()接收最新的配置。

我希望这些日志提示和技巧可以帮助您在不影响性能的情况下,围绕您的应用程序建立一个良好的日志框架。如果你有什么要分享的,请在下面留下你的评论!

参考:

[## 日志记录指南- Python 3.8.5 文档

这个页面包含了许多与日志记录相关的方法,这些方法在过去很有用。多次呼叫…

docs.python.org](https://docs.python.org/3/howto/logging-cookbook.html#) [## 日志记录-Python-Python 3 . 8 . 5 文档的日志记录工具

源代码:Lib/logging/init。py 这个模块定义了实现灵活事件记录的函数和类…

docs.python.org](https://docs.python.org/3/library/logging.html) [## 日志 Python 的搭便车指南

自版本 2.3 以来,该模块一直是 Python 标准库的一部分。它在 PEP 282 中有简洁的描述。的…

docs.python-guide.org](https://docs.python-guide.org/writing/logging/)

8 款人工智能驱动的创意应用,适合您和您的孩子

原文:https://towardsdatascience.com/8-ai-driven-creative-apps-for-you-and-your-kids-5fdd71407dc4?source=collection_archive---------14-----------------------

新冠肺炎期间你和家人关在一起吗?对整个 AI 宇宙开放。

截图:Merzmensch

它不期而至,改变了一切:我们的生活、工作和日常事务。新冠肺炎正以难以想象的方式扰乱我们的世界。现在#SocialDistancing 和#HomeOffice 是热门话题(如果我们必须避免# social distancing,甚至是,尤其是现在)。

你们中的许多人目前在内政部工作。即使你的雇主不允许,你的孩子也必须在家办公。学校停课了,幼儿园也一样。多重任务不是一种技能:它是存在性的。

日冕的积极影响

那么,我们所有的研究和项目、我们的家庭和孩子都处于危险的边缘吗(考虑到潜伏在外面的病毒)?一点也不。尤其是现在。

让我们说一些挑衅性的,但我认为必要的:

感谢科罗纳,我们社会(全球)的平均数字能力即将提高。人们在网上保持联系,孩子们有更多的机会使用数字工具。可能是最后一个曾经对数字化持怀疑态度的人,现在看到了这种存在水平的重要价值。顺便提一下,孩子们:他们现在有一个很好的机会来学习更多关于数字主题,关于在线层,关于人工智能。呆在里面并不意味着被排除在大的外面。

在这篇文章中,我想与你分享一些策略和工具来吸引我们的孩子,启发他们的未来,并创造性地度过锁定期。一起。

人工智能和孩子:一个爆炸性的组合。一个用例。

去年夏天,我和女儿(当时 7 岁)决定在 AI 的帮助下做一个小本子。我们用 GPT-2 写了几个童话故事,她亲手画了插图。到那时,我用 TalkToTransformer.com 的进行文本生成。这是我们得到的。(我们对这个故事的提示是“ 一个国王想要飞 ”)

插图来自书“世界的开始”(仍未出版),由索菲亚,7

****A king wanted to fly.** His plane would come."You guys are not coming, so let him fly."The pilot stared at that in the mirror, his eyes wide. His eyes were wide and bloodshot. His back was flat against the wall."Get him through."He looked down. It was true, the door had been opened from the inside. An enormous fist from above."What are you doing now?"And the door opened.In the middle of the room, there was a girl. In a green striped dress that was very short, her hair was short and her eyes were wide as well, her eyes were blue as well.She was young, but very ugly. Her lips were a pale yellow and there weren't any teeth here.No!Hundred-year-old!He stared at her for a long time, then smiled."Gee, you look like a normal child and can't help but laugh, I guess.""How old are you, then?"She looked at him, the young girl's mouth dropped slightly, which was not the right expression to say."Five.""Five?"A hundred!**

这个故事很有趣。我的女儿对人工智能作为一种创作工具产生了兴趣——我们开始了我们的人工智能和艺术之旅。

几个月后,我很高兴地读到了贾森·布谷写的这篇美丽而鼓舞人心的文章,这篇文章是关于将纸工艺品和人工智能(GPT-2 和比根)结合起来,增加孩子们的数字技能、乐趣和创造力。

**** [## 帮助孩子们玩人工智能

老派杂志可以教孩子们尖端技能

towardsdatascience.com](/helping-kids-play-with-artificial-intelligence-68af8f8ba280)

因此,让我们收集和分享基于人工智能的创意工具,提高数字能力,并为我们的孩子带来额外的价值——乐趣。****

与您的孩子一起尝试基于人工智能的创意工具。

讲故事

去年 OpenAI 发布的模型GPT-2,对自然语言处理产生了重大影响。与此同时,整个 1.5b 版本已经推出。在 40 Gb 文本上训练,它在叙事质量上令人信服。(当然还有 谷歌 BERT ,但如果你在寻找混乱但一致的小说,GPT-2 是 IMHO 方式有趣)。**

GPT-2 的一个有趣而重要的方面是变压器驱动的算法自我关注:文本生成与第一个人类提示对齐——然后在自身内部保持一致。所以你可以控制最初的倾向或者把注意力放在文本上(文本逐渐变得复杂)。**

有许多方法可以使用 GPT-2。我推荐用两个。在这些情况下,它是原始模型,而不是在其他来源上训练的。

01。与变形金刚对话

最直观的实现就是TalkToTransformer.com,由亚当·金提供。你所要做的就是输入第一句话或一些单词——然后模型继续。

感谢自我关注,你可以,比如,唤起一个童话时代的写作,“从前有一个国王”。

由TalkToTransformer.com生成的具有一个提示的各种文本。Merzmensch 截图。

如你所见,结果可能是滑稽的、超现实的、荒谬的,但也有亵渎的危险。如果这对你来说不成问题,你可以和孩子们一起创造。当然,你可以为你的合作写作“策划”文本。

****优点:

易于使用已经有一些预置可用
系统实现了整个 1.5b 型号
快速可用,甚至可以通过手机使用****

对比:
(实际上只有一个:)它只生成简短的文本片段

02。GPT-2 Colab 笔记本

如果你想给你的孩子关于 Python 的第一印象——以及关于 GPT-2 如何工作的背景,使用 Colab 笔记本(我的一般建议— 有这么多精彩的 Colab 笔记本)。

还有各种各样的 GPT-2 的笔记本电脑。但是我建议试试这个实现:带 JavaScript 接口的 GPT-2。

********

文本,由 GPT-2 笔记本生成。截图:Merzmensch

我喜欢这种实现的原因是:

  • 您可以修改文本长度和其他参数。
  • 如果你有 Google-GPU 的运气,你甚至会得到 1.5b 参数的整个模型(就像上面的截图)
  • 与其他实现相比,Java 接口是直观的(考虑到你的孩子想玩 GPT-2)。
**To parameters (according to definitions by GitHub folk):**temperature:** Float value controlling randomness in boltzmann distribution. Lower temperature results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. Higher temperature results in more random completions.
**top_k:** Integer value controlling diversity. 1 means only 1 word is considered for each step (token), resulting in deterministic completions, while 40 means 40 words are considered at each step. 0 is a special setting meaning no restrictions. 40 generally is a good value.Source: 
[https://github.com/openai/gpt-2/issues/27](https://github.com/openai/gpt-2/issues/27)**

我的收藏设置:
温度 = 0.9,
top_k = 80,
生成多少 = 1000

****优点:

易于使用;可以使用更长的连贯文本(自我关注机制!)
系统实现各种模型,包括 1.5b 参数
更多修改参数的可能性****

对比:
【初始化和文本生成需要时间
较大的模型可能会产生突然的亵渎和其他奇怪的东西,可能不适合您的孩子。你无法控制结果。

语言障碍?假设你的孩子母语不是英语——这不是问题。您可以使用 DL 驱动的翻译服务 Deepl.com,并将其翻译成您的语言:

**** [## DeepL 翻译器

科技巨头谷歌、微软和脸书都在将机器学习的经验应用到翻译中,但是一个小的…

www.deepl.com](https://www.deepl.com/translator)

当然,你甚至可以使用亚马逊 AWS Polly 服务(目前有大约 30 种语言可用),让人工智能用多种语言大声朗读故事:****

画一幅画

03.Pix2Pix

已经一年了,但仍然是由Zaid Alyafeai(GitHub)进行的迷人实验:Image2Image 翻译的 TensorFlow 实现。

Pix2Pix 演示,来源:github.com/zaidalyafeai

我不需要把 Pix2Pix 介绍给你亲爱的数据科学观众,因为它已经在这里得到了很好的检验。它使用模式识别将涂鸦转化为图像,并在特定的数据集上接受训练。

这个基于网络的应用提供了一个孩子友好的界面,有输入输出窗口和各种预先训练好的模型:猫、门面、口袋妖怪等等。

画个口袋妖怪怎么样?

********

一些口袋妖怪,是我女儿画的。截图:Merzmensch

****优点:

易于使用 pix2pix 作为最相关的模型之一的体验
体验乐趣****

对比:
大概没什么

04.高根

这一个达到了另一个层次。我打赌你的孩子会对 GauGAN 上瘾。这个由 NVidia AI Lab 提供的基于 GAN 的实现,将分割图转换为照片级真实感图像。

分割图通过颜色来区分,并归属于各种材质和内容:天空、云、树木、建筑物等。

左边的分割图:女儿涂鸦的。右图由 GauGAN 实时处理。截图:Merzmensch。

如果你使用平板电脑,或者在我的情况下,它是笔记本电脑的触摸屏,你的孩子可以用手(而不是鼠标)画画。触觉体验!

在各种型号上也有大量的风格转换预设。创意遇上惊喜=这是你孩子的天堂。你也可以顺便给你的孩子解释一下图像分割的原理。

以下是 GauGAN 的演示:

****优点:

易于使用
实验视野宽广
几十个分段和预设****

对比:
(…还在找一些不好的地方…)

05.给你孩子的画上色。

你的孩子当然也喜欢用完全模拟的方式(用铅笔在纸上)画画。让 AI 给你孩子的作品上色怎么样?

有各种各样的着色实现。其中之一就是 Petalica Paint ,原名 PaintsChainer ,由日本在线艺术家社区 Pixiv 提供。

你可以用工具画画或者上传你孩子的草图。原始文件的质量并不重要。我用智能手机拍摄了我女儿的素描。这是我在不同模式下得到的结果:

我女儿的涂鸦,还有人工智能着色的版本。截图:Merzmensch

或者这个:

我女儿画的素描,还有人工智能上色的版本。截图:Merzmensch

如你所见,即使是你的孩子画的抽象画也可以用令人惊讶的方式着色。

****优点:

总是出人意料,甚至支持抽象涂鸦****

对比:
【缺少以前版本的 3D 效果

再造一个童话!

06.比根。

老好人 BigGAN 正在用这款 Colab 笔记本稳定工作。你可以生成东西,也可以享受种子间的插值(我写的更多的是 BigGAN 和插值)。

和你的孩子一起重现变形和转变的童话故事怎么样?

灰姑娘,有人吗?

比根插值。截图 ty Merzmensch

午夜时分,马车变成了——好吧,数据集中没有南瓜,但我希望花椰菜会通过。

还是青蛙来个王子

牛蛙(#30) = >温莎领带(#906)。截图:Merzmensch

你还知道哪种变形?

****优点:

为您的孩子提供完美的甘视觉演示
使用有趣
重要方法****

****对比:

有限的预训练类别选择低分辨率(因为已经是历史)****

建立一个新世界。

07.艺术育种家

肯定,艺术培育者。毫无疑问,你已经读过我对这个基于 StyleGAN 的工具集的更长描述,由乔尔·西蒙实现。

你可以创造奇迹。角色生成为你的合作故事?

她你去:一张脸代

艺术育种家。截图:Merzmensch

你的世界需要设定吗?使用风景生成

艺术育种家。截图:Merzmensch

你也可以生成一个全身的角色(注意:因为 Artbreeder 支持全身的服装,如果你尽量少穿衣服,工作会变得不安全,如果你明白我的意思的话)。

Artbreeder 也非常适合 BigGAN 插值函数,但是具有更多可能性和种子。

因此,如果你想穿越书店、飞船和大灰猫头鹰,你可以循序渐进:

截图来自 Merzmensch 的 Artbreeder

现在你和你的孩子可以进行各种不可组合的实验——很有趣,可能是你疯狂童话的一部分。艺术育种界面是用户友好的,你的孩子会很快适应自己。

优点:
【图像生成的多种可能性】
每个模型都有大量的参数可以修改
结果质量惊人

对比:
还不是 StyleGAN2(等待)
“全身人物”的情况下:可以是 NSFW

赋予角色生命

08.一阶运动模型。

现在你的孩子将需要你的帮助,因为这个模型可以通过 Colab 笔记本操作。(提示:RunwayML 也支持它)

aliak sandr Siarohin(等人)的一阶运动模型将视频镜头中的运动数据转换为单张照片。在这种情况下,你可以像我对妮芙缇一样制作脸部动画:

有各种各样的 Colab 笔记本,我推荐这款经过 Bomze 优化的:

而且已经有了孩子和人工智能合作动画的完美样本。

来自创意视觉工作室的数字艺术家 Mar Canet 用他的女儿和第一个动作顺序模型做实验。他们取得了惊人的成绩:

现在想象用动画角色制作一个童话故事(原始的面部镜头可以由你或你的孩子录制并转换)。

优点:
独特的可能性来制作一个小孩画的涂鸦脸。

对比:
并非所有视频格式都可用
Colab 笔记本不可避免(RunwayML 中的这款机型仍有问题)

09.顺便说一下,RunwayML。

如果这还不够——你只需要看看 RunwayML —大量的模型(文本、图像生成、视频、网络摄像头等。).选择是如此之多(并且还在不断增加),以至于它值得一篇特别的大文章。我这就去!

你知道其他适合孩子的创造性人工智能应用吗?

你如何与你的孩子度过隔离时间(关于数据科学?)

初级数据科学家追求的 8 条职业道路

原文:https://towardsdatascience.com/8-career-paths-for-junior-data-scientists-to-pursue-3e6041950e4e?source=collection_archive---------36-----------------------

数据科学家的职业发展战略

资料来源:Freepik

你终于实现了自己的目标,成为了一家自己喜欢的公司的数据科学家。您成功入职,并开始将您的数据科学技能转化为公司的商业价值。在最初的六个月,一年,甚至两年里,一切都很顺利。

……但最终,你会问自己:我的下一步是什么?我如何规划未来的职业生涯,以实现自我、成功并在公司甚至其他地方获得更高的职位?攀登职业阶梯是必然的;你会觉得是时候采取下一步行动了。一些公司也鼓励,甚至推动你采取这些步骤;要么上去,要么出去!

但是,作为一名初级数据科学家,你可以选择哪些最常见的职业道路来提升自己的职业生涯?这里有一个职业道路列表,你可以选择:

1。高级数据科学家
2。咨询
3。机器学习工程
4。数据工程
5。创业
6。项目管理 7。研究
8。用户体验

在这里,我们将详细讨论每一条职业道路:

  1. 高级数据科学家

升职是最自然的选择;这是显而易见的。通常,当您开始担任行业中的数据科学家时,您会在最初的 6-12 个月内获得大量经验。在这个时期,你正在快速学习新技术,并越来越接近成为一名全栈数据科学家。你也将习惯于你的行业是如何做事的,更高级的人是如何解决问题或展示结果的。随着您拥有越来越多的经验,自然会有更多的责任分配给利益相关者沟通,将需求转化为具体的开发故事,高层次的问题解决,甚至监督公司的新员工。

虽然在大多数公司中,初级和高级之间有一个过渡期,称为中级,但通过积累经验,你正在为高级数据科学工作做准备。这种转变通常有三种方式:(a)你明确提出要求,(b)你的经理会提拔你,或者(c)你换公司,协商一个更好的职位。你需要有一个清晰的计划,以最有效的方式从初级水平过渡到高级水平。通过确保你了解这些要求,包括你公司的具体要求,你可以加快你的职业晋升。

[## 全栈数据科学家还是大数据项目的超级英雄?

数据科学就业市场的新兴需求趋势

towardsdatascience.com](/full-stack-data-scientists-or-superheroes-of-the-big-data-projects-f245ec66bb6a)

2。咨询
数据科学咨询也是初级数据科学家的典型职业道路,进入门槛相对较低。咨询行业的主要功能是为他们的客户,主要是跨国公司,提供外部的合格人才。咨询公司以短期和长期合约的形式与客户开展项目。这些项目可能需要几个月到几年时间。

在咨询行业工作通常是积累你不同领域商业知识的好选择;您将参与许多与大客户合作的项目,通过这些项目,您将了解企业决策者的思维模式,以及他们在数据科学解决方案中寻求什么。此外,数据驱动的决策已经成为所有大公司的主要趋势;您甚至可以期望与客户的董事总经理级别的员工进行互动,向他们提供他们新的花哨的分析仪表板。

有些人在进入咨询行业工作之前,先学习工商管理硕士(MBA)。尽管考虑到 MBA 学位对你的商业头脑有用,但如今,在一些大型咨询公司工作相当于上商学院。在咨询行业工作有助于你更多地了解业务流程,并获得关于大型企业最佳实践的实用知识。

也有成为特定领域顾问的机会。例如,如果你做过营销分析方面的项目,并且对这个能力感兴趣,你可以选择营销分析方面的专家路径。作为特定领域的顾问,通常在一些大型咨询公司工作,但主要是在高级管理层,他们有主题专家或能力领导。另一个选择是做一名自由职业顾问,或者在你擅长的特定领域开办你的咨询机构。

[## 担任数据科学顾问

具有企业意识的数据科学家的职业战略

towardsdatascience.com](/working-as-a-data-science-consultant-e626669ab72b) [## 成为数据科学顾问所需的 5 项技能

为数据科学咨询职业发展的软技能

towardsdatascience.com](/5-skills-you-need-to-succeed-as-a-data-science-consultant-1a77c5bba064) [## 数据科学顾问面对客户的技能:奢侈品还是必需品?

成为成功的数据科学顾问需要什么

towardsdatascience.com](/what-is-takes-to-be-a-top-data-science-consultant-part-1-client-facing-skills-7803f5c8974c)

3。机器学习工程

机器学习工程是与数据科学关系密切的领域,在一些公司,这两条职业道路几乎没有区别。通常,机器学习工程更关注数据科学的软件工程方面,而不是分析方面,这意味着,作为一名机器学习工程师,你将做大多数将人工智能集成到软件解决方案中的开发工作。现在机器学习工程师工作的最突出的领域是自动驾驶和云计算。

从数据科学过渡到机器学习工程相当简单。你只需要展示出你有工程思维,能够以实用可靠的方式交付高质量的软件解决方案。你还需要对你所从事的领域有所了解。但这应该不是什么大问题。

一些新兴领域近年来发展得如此突出,以至于它们正在从数据科学和机器学习工程领域中独立出来。这些领域是计算机视觉工程、语音技术工程和自然语言处理工程。

[## 作为一名机器学习工程师

人工智能和数据人才的职业战略

towardsdatascience.com](/working-as-a-machine-learning-engineer-a364545ae93c)

4。数据工程

数据工程是数据科学的另一个姊妹领域。数据工程师是软件开发专家,对大数据基础架构和 DevOps 有深入的了解。数据工程师帮助数据科学家和机器学习工程师获取和准备大型数据集。

数据科学家认为 70%的数据科学工作都致力于数据管理。因此,一些数据科学家很自然地在这部分过程中找到了他们的激情,并转向数据工程。对于这种转变,你将需要变得更有工程师头脑,并对 Hadoop、Spark、Scala 等技术以及几乎所有的数据库技术拥有实践经验。
5。创业

创业是数据科学领域的热门选择。大数据分析和人工智能是热门话题,许多初创公司正在寻求将这些技术应用到他们的产品中。有一些经验的数据科学家可以通过多种方式进入企业家行列:

(a)支持年轻创业人才组建团队和建立公司的创意阶段孵化器。这些通常是长达 6 个月的短期项目,为其中一些项目提供创业人才;你只需要带上你的创业天赋,仅此而已。这些项目帮助你建立团队,生产最小可行的产品,并获得后续投资者,

(b)类似于创意阶段孵化器的公司创建者,区别在于你是这些孵化器的雇员。通常,你被聘为常驻企业家,在孵化器导师的指导下追求一个创业想法。对于这条道路,你通常需要至少在一个业务领域有一个想法或专业知识。对产品开发、筹资和团队建设的支持也是这些公司提供的支持服务,

(c)初创公司(联合)创始人,遵循传统的初创公司成长路径,通常是用一个想法组建一个团队,开发一个最低可行的产品,向投资者展示,筹集资金,扩大公司规模,然后重复。在这条道路上,你不一定要成为首席执行官或拥有强大的商业背景才能经营公司。你可以是专注于产品开发的技术人员,而把业务开发或筹资留给你的联合创始人,

(d)在一些国家,政府为促进创业提供资助。其中一些资助是提供给具有高科技想法的科学创业公司的,所以如果你与你以前的大学仍然有一些联系,那么恢复这些联系并开始申请这些资助将是有用的。

(e)如果你不是一个绝对的风险承担者,也不想创办自己的公司,另一个选择是在年轻或成熟的初创公司工作,你可以担任类似于产品经理甚至首席技术官的角色。这仍然是走向创业职业道路的一个很好的步骤,它包括学习创业成长过程的好处,而不需要承担财务风险。

6。项目管理

项目管理是几乎所有公司的一项必要工作。通常,人们通过两条主要的职业道路成为项目经理:(a)数据科学专业知识道路或(b)面向业务的项目管理道路。

第一个选项是职业道路,在这条道路上,你已经完成了如此多的数据科学项目,你将成为公司中其他初级和高级数据科学家的天然领导者。在你职业生涯的这个阶段,你知道如何与利益相关者沟通,解决业务问题,将任务委派给公司中更初级的数据科学家,在项目中拥有一个主题。为了更好地进行项目管理,你必须在依靠你在数据科学方面的深厚专业知识的同时,明确地接受项目管理技能的培训。

对于第二种选择,你需要在职业生涯早期就开始专注于项目管理职业轨道。这通常是通过承担初级项目管理角色来完成的,比如成为一名 scrum master,或者仅仅是协助你公司当前的项目经理。有些人从职业生涯一开始就选择项目管理角色。这些人通常从成为 scrum 大师开始,获得 scrum 大师证书,并由此获得一些项目管理经验。然而,这些类型的角色仅仅是管理角色,涉及很多人际交往技巧,尤其是公司政治。

7。研究

对于一些在数据科学领域工作过一段时间的人来说,回到研究领域也是一个选择。许多第一年的数据科学家都是直接从研究生院毕业的,有时他们觉得这个行业不适合他们,或者他们想重新做一些研究工作。典型的研究职业道路包括攻读博士学位、在学术界担任博士后研究员,或者在工业界担任研究科学家。

我们需要注意的是,回到研究阶段不应该是行业中充满挑战的第一年的最终解决方案。适应一个新的系统是很困难的,尤其是如果某人来自学术界。例如,与学术界相比,工业界开发工作的速度可能会非常不同。因此,建议是,如果你对数据科学行业充满热情,坚持不懈地在这个行业取得成功,结果就会到来。但是,如果你的动力是回答问题,而不是让事情运转起来,那么再次探索研究职业道路将是值得的。

8。用户体验

在软件行业做项目时,你可能会遇到一些新的角色,这些角色不在你的核心专业范围内,但是你非常感兴趣。在软件开发中,一个选项可以是用户体验设计和研究。用户体验设计是设计用户在工作软件中经历的流程所遵循的过程。这可以是一个简单的网站,也可以是更先进的网络平台,比如社交媒体。另一方面,用户体验研究侧重于用户体验的实验和最佳实践。

对人类行为更感兴趣或者性格外向的人,可以选择用户体验设计作为职业道路。这些角色通常需要与用户或利益相关者进行更多的交流,而不需要成为项目经理。

请记住,就像任何向核心专业以外的职业过渡一样,你将不得不学习许多新技能。尽管如此,如果你热衷于用户体验,这可能是值得的。

关于作者:

Pouyan R. Fard 是 Fard 咨询公司的首席执行官&首席数据科学家。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与医药、汽车、航空、运输、金融、保险、人力资源和销售&营销行业的财富 500 强公司合作。

Pouyan 也在指导活跃在大数据行业的初创公司和人才。他的热情是通过职业培训培养下一代数据科学家,并帮助他们找到数据科学领域的顶级工作机会。

Pouyan 已经完成了关于消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。

8 种填补缺失数据的方法

原文:https://towardsdatascience.com/8-clutch-ways-to-impute-missing-data-690481c6cb2b?source=collection_archive---------15-----------------------

在 Unsplash 上由 Ehimetalor Unuabona 拍摄的照片

如何处理任何数据集中缺失数据的教程

缺失数据可能是任何数据相关项目的瓶颈。虽然拥有高质量的数据总是值得赞赏的,但情况并非总是如此。有时你需要处理你拿到的任何一块半生不熟的蛋糕。因此,处理缺失数据对任何数据科学家/分析师都非常重要,因为这将使他们能够更准确地得出结果。

由弗兰基·查马基在 Unsplash 上拍摄的照片

“估算”一词指的是对我们丢失的任何数据进行统计估计。不同的数据类型有不同的插补技术。例如,您可能有数字数据,并且将应用以下插补技术:

  • 使用数据的平均值/中值估算
  • 使用任意值估算
  • 使用尾部结束法估算。

如果您有分类数据,那么您可以执行以下操作:

  • 使用模式估算数据
  • 为缺失数据添加类别

如果您有混合的数据,包含数值和分类值,那么您可以执行以下操作:

  • 完整的案例分析
  • 为缺失值添加指示器
  • 使用随机抽样方法估算数据

数字数据插补

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

平均值/中值

使用平均值/中值进行估算是最直观的方法之一,在某些情况下,它也可能是最有效的方法。我们基本上取数据的平均值,或者取数据的中位数,用那个值代替所有缺失的值。

  • 假设:数据随机缺失;缺失的观察值看起来像大多数的观察值
  • 优点:实现简单快捷;保留数据的丢失
  • 缺点:协变和方差可能发生变化;丢失的数据越多,失真就越高

任意值方法

照片由戴维斯科在 Unsplash 拍摄

这里,目的是标记数据集中缺失的值。您可以用一个固定的任意值(随机值)来估算缺失的数据。

它主要用于分类变量,但也可用于具有任意值的数值变量,如 0,999 或其他类似的数字组合。

  • 假设:数据不是随机缺失的
  • 优点:快速且易于实现;揭示缺失价值的潜在重要性
  • 缺点:改变共方差/方差;可能会产生异常值

尾部结束法

照片由克里斯蒂安·凯恩德尔在 Unsplash 上拍摄

这种方法类似于任意值方法,但是,这里的任意值是在变量的基本分布的尾端选择的。

如果正态分布,我们使用平均值+/- 3 倍标准差。

如果分布是偏斜的,使用 IQR 邻近规则。

  • 假设:数据不是随机缺失的;数据在尾端是倾斜的
  • 优点:能带出缺失值的重要性;
  • 缺点:改变共方差/方差;可能会产生有偏差的数据。

分类数据插补

由 CJ Dayrit 在 Unsplash 上拍摄的照片

方式

顾名思义,您用最常出现的值来估算缺失数据。这种方法最适合分类数据,因为缺失值最有可能是出现频率最高的值。

  • 假设:数据随机缺失;缺失值看起来像多数
  • 优点:快速且易于实现;适用于分类数据
  • 缺点:可能创建有偏差的数据集,偏向最频繁的值

添加缺失数据的类别

下一个方法非常简单,只适用于分类数据。您可以为缺失值创建一个单独的标签——“缺失”或者任何相关的内容。这个想法是标记缺失的价值观,并理解缺失的重要性。

  • 假设:无假设
  • 优点:快速且易于实现;帮助理解缺失数据的重要性
  • 缺点:可能被误解的数据;缺失数据的数量应该足够大

混合数据插补

布鲁克·拉克在 Unsplash 拍摄的照片

完整的案例分析

在这种方法中,我们基本上放弃了缺少值的选项。我们只考虑所有值都存在的数据行。顾名思义,是只对完整案例的评估。这对混合数据集很有用。

  • 假设:数据在随机点缺失;没有模式的证据
  • 优点:没有数据操纵;保持数据的分布
  • 缺点:数据丢失;如果数据不是随机丢失的,可能会创建有偏差的数据集

为缺失值添加指示器

斯文·舍尔梅尔在 Unsplash 上的照片

在这种方法中,您基本上会创建一个新列来指示数据丢失的位置。这将是一个二进制值(1 或 0 ),表示丢失或未丢失。

您可以将此方法与其他插补方法结合使用,以便更好地理解缺失数据。

  • 假设:数据不是随机缺失的;数据是可预测的
  • 优点:易于实现;抓住缺失数据的本质
  • 缺点:创建另一个列/特征;仍然需要估算

随机抽样方法

该方法包括从变量的数据池中随机抽取样本,并使用随机抽取的值来估算缺失值。

  • 假设:数据随机缺失;数据呈正态分布
  • 优点:快速且易于实现;保留方差
  • 缺点:可能产生随机数据;当丢失数据占数据的百分比很高时不起作用;

照片由 magnezis magnestic 在 Unsplash 上拍摄

感谢阅读。希望你学到了新东西。更多类似内容关注我。

每个程序员都必须知道的 8 种常见数据结构

原文:https://towardsdatascience.com/8-common-data-structures-every-programmer-must-know-171acf6a1a42?source=collection_archive---------0-----------------------

8 种常用数据结构的快速介绍

数据结构是一种在计算机中组织和存储数据的专门方法,通过这种方法,我们可以更有效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域有着广泛而多样的使用范围。

作者图片

几乎每一个已经开发的程序或软件系统都在使用数据结构。此外,数据结构属于计算机科学和软件工程的基础。当涉及到软件工程面试问题时,这是一个关键话题。因此,作为开发人员,我们必须对数据结构有很好的了解。

在这篇文章中,我将简要解释每个程序员都必须知道的 8 种常用数据结构。

1.数组

一个数组是一个固定大小的结构,它可以保存相同数据类型的项目。它可以是整数数组、浮点数数组、字符串数组甚至数组数组(比如二维数组)。数组是有索引的,这意味着随机访问是可能的。

图一。数组基本术语的可视化(图片由作者提供)

数组运算

  • 遍历:遍历元素并打印出来。
  • 搜索:搜索数组中的一个元素。您可以通过元素的值或索引来搜索元素
  • 更新:更新给定索引处现有元素的值

向数组中插入元素和从数组中删除元素不能马上完成,因为数组的大小是固定的。如果你想在一个数组中插入一个元素,首先你需要创建一个新的数组,增加它的大小(当前大小+ 1),复制现有的元素并添加新的元素。这同样适用于删除一个新的减小了大小的数组。

数组的应用

  • 用作构建块来构建其他数据结构,如数组列表、堆、哈希表、向量和矩阵。
  • 用于不同的排序算法,如插入排序、快速排序、冒泡排序和合并排序。

2.链接列表

链表是一个顺序结构,由一系列相互链接的线性顺序的项目组成。因此,你必须按顺序访问数据,随机访问是不可能的。链表提供了一种简单灵活的动态集合表示。

让我们考虑以下关于链表的术语。参考图 2 可以有一个清晰的思路。

  • 链表中的元素被称为节点
  • 每个节点包含一个和一个指向其后继节点的指针,称为下一个
  • 名为 head 的属性指向链表的第一个元素。
  • 链表的最后一个元素被称为

图二。链表基本术语的可视化(图片由作者提供)

以下是可用的各种类型的链表。

  • 单链表 —只能向前遍历项目。
  • 双向链表 —可以向前和向后遍历条目。节点由一个称为 prev 的额外指针组成,指向前一个节点。
  • 循环链表 —头的 prev 指针指向尾,尾的 next 指针指向头的链表。

链表操作

  • Search :通过简单的线性搜索,在给定的链表中找到关键字为 k 的第一个元素,并返回指向该元素的指针
  • 插入:向链表中插入一个键。插入可以通过三种不同的方式完成;在列表的开头插入,在列表的结尾插入,在列表的中间插入。
  • 删除:从给定的链表中删除一个元素 x 。您不能一步删除一个节点。删除可以通过三种不同的方式完成;从列表的开头删除,从列表的结尾删除,从列表的中间删除。

链表的应用

  • 用于编译器设计中的符号表管理
  • 用于使用 Alt + Tab 在程序之间切换(使用循环链表实现)。

3.大量

堆栈是一种 LIFO (后进先出——放在最后的元素可以首先被访问)结构,这在许多编程语言中都很常见。这种结构被命名为“堆栈”,因为它类似于现实世界中的堆栈——一堆盘子。

图片由设计来自像素库

堆栈操作

下面给出了可以在堆栈上执行的两个基本操作。请参考图 3 来更好地理解堆栈操作。

  • 按下:将一个元素插入到栈顶。
  • Pop :删除最上面的元素并返回。

图三。堆栈基本操作的可视化(图片由作者提供)

此外,还为堆栈提供了以下附加功能,以便检查其状态。

  • Peek :返回栈顶元素,不删除。
  • isEmpty :检查堆栈是否为空。
  • 是否已满:检查堆栈是否已满。

堆栈的应用

  • 用于表达式评估(例如:调车场算法用于解析和评估数学表达式)。
  • 用于在递归编程中实现函数调用。

4.行列

一个队列是一个 FIFO (先进先出——放在最前面的元素可以最先被访问)结构,这在许多编程语言中都很常见。这种结构被命名为“队列”,因为它类似于现实世界中的队列——人们在队列中等待。

图片来自 Pixabay 的 Sabine Felidae

队列操作

下面给出了可以在队列上执行的两个基本操作。请参考图 4 来更好地理解队列操作。

  • 入队:在队列末尾插入一个元素。
  • 出列:删除队列开头的元素。

图 4。队列基本操作的可视化(图片由作者提供)

队列的应用

  • 用于管理多线程中的线程。
  • 用于实现排队系统(例如:优先级队列)。

5.哈希表

哈希表是一种存储值的数据结构,这些值具有与每个值相关联的键。此外,如果我们知道与值相关联的键,它可以有效地支持查找。因此,无论数据大小如何,它在插入和搜索方面都非常有效。

直接寻址在表中存储时,使用值和键之间的一对一映射。然而,当有大量的键值对时,这种方法就有一个问题。考虑到典型计算机的可用内存,该表将会非常大,包含如此多的记录,并且可能不切实际,甚至不可能被存储。为了避免这个问题,我们使用了散列表

散列函数

名为散列函数 ( h )的特殊函数用于克服直接寻址中的上述问题。

在直接访问中,具有键 k 的值被存储在槽 k 中。使用散列函数,我们计算每个值所在的表(槽)的索引。使用散列函数为给定键计算的值被称为散列值,它指示该值映射到的表的索引。

h(k) = k % m

  • h: 哈希函数
  • k: 应确定其哈希值的键
  • m: 哈希表的大小(可用的槽数)。对于 m 来说,不接近 2 的精确幂的质数是个不错的选择。

图五。哈希函数的表示(图片由作者提供)

考虑哈希函数 h(k) = k % 20 ,其中哈希表的大小为 20。给定一组键,我们希望计算每个键的哈希值,以确定它在哈希表中的索引位置。假设我们有以下键,散列和散列表索引。

  • 1 → 1%20 → 1
  • 5 → 5%20 → 5
  • 23 → 23%20 → 3
  • 63 → 63%20 → 3

从上面给出的最后两个例子中,我们可以看到,当哈希函数为多个键生成相同的索引时,会出现冲突。我们可以通过选择合适的散列函数 h 来解决冲突,并使用诸如链接开放寻址之类的技术。

哈希表的应用

  • 用于实现数据库索引。
  • 用于实现关联数组。
  • 用于实现“设置”数据结构。

6.树

是一种分层结构,其中数据按层次组织并链接在一起。这种结构不同于链表,而在链表中,项目是以线性顺序链接的。

在过去的几十年中,为了适应特定的应用和满足特定的限制,已经开发了各种类型的树。一些例子是二叉查找树树、B 树、treap 树、红黑树、八字树、AVL 树和 n 叉树。

二分搜索法树

二叉查找树(BST) 顾名思义,是一种二叉树,其中数据以层次结构组织。这种数据结构按排序顺序存储值。

二叉查找树中的每个节点都包含以下属性。

  1. key :存储在节点中的值。
  2. :指向左子的指针。
  3. :指向右孩子的指针。
  4. p :指向父节点的指针。

二叉查找树表现出一种独特的属性,区别于其他树木。这个属性被称为二进制搜索树属性

x 是二叉查找树中的一个节点。

  • 如果 y 是 x 的子树中的一个节点,那么 y.key ≤ x.key
  • 如果 y 是 x 的子树中的一个节点,那么 y.key ≥ x.key

图六。树木基本术语的可视化(图片由作者提供)

树木的应用

  • 二叉树:用于实现表达式解析器和表达式求解器。
  • 二叉查找树:用于许多数据不断进出的搜索应用。
  • :JVM(Java 虚拟机)用来存储 Java 对象。
  • Treaps :用于无线网络。

查看我下面关于 8 个有用的树数据结构和自平衡二分搜索法树的文章。

[## 值得了解的 8 种有用的树数据结构

8 种不同树形数据结构的概述

towardsdatascience.com](/8-useful-tree-data-structures-worth-knowing-8532c7231e8c) [## 自平衡二分搜索法树 101

自平衡二分搜索法树简介

towardsdatascience.com](/self-balancing-binary-search-trees-101-fc4f51199e1d)

7.很

一个是二叉树的一个特例,其中父节点与它们的子节点的值进行比较,并相应地排列。

让我们看看如何表示堆。堆可以用树和数组来表示。图 7 和图 8 展示了我们如何使用二叉树和数组来表示二进制堆。

图 7。堆的二叉树表示(图片由作者提供)

图 8。堆的数组表示(图片由作者提供)

堆可以有两种类型。

  1. 最小堆 —父项的键小于或等于其子项的键。这被称为最小堆属性。根将包含堆的最小值。
  2. 最大堆 —父项的键大于或等于其子项的键。这称为最大堆属性。根将包含堆的最大值。

堆的应用

  • 用于堆排序算法
  • 用于实现优先级队列,因为优先级值可以根据堆属性进行排序,其中堆可以使用数组来实现。
  • 队列函数可以在 O(log n) 时间内使用堆来实现。
  • 用于查找给定数组中 kᵗʰ最小(或最大)值。

查看我下面关于使用 python heapq 模块实现堆的文章。

[## Python Heapq 模块简介

关于如何使用 Python 的 heapq 模块的简单介绍

towardsdatascience.com](/introduction-to-python-heapq-module-53534feda625)

8.图表

一个由一组有限的顶点或节点以及一组连接这些顶点的组成。

图的是图中顶点的个数。图的大小是图中边的数量。

如果两个节点通过同一条边相互连接,则称它们为相邻

有向图

如果一个图 G 的所有边都有一个指示什么是起始顶点,什么是结束顶点的方向,则称该图为有向图

我们说 (u,v) 是从或离开顶点 u事件,是从进入顶点 v事件。

自循环:从顶点到自身的边。

无向图

如果一个图 G 的所有边都没有方向,则称其为无向图。它可以在两个顶点之间双向移动。

如果一个顶点不与图中的任何其他节点相连,则称其为孤立的

图九。图形术语的可视化(图片由作者提供)

你可以从我的文章 10 图算法直观解释中读到更多关于图算法的内容。

[## 直观解释的 10 种图形算法

10 种基本图形算法的快速介绍,包括示例和可视化

medium.com](https://medium.com/@vijinimallawaarachchi/10-graph-algorithms-visually-explained-e57faa1336f3)

图表的应用

  • 用于表示社交媒体网络。每个用户都是一个顶点,当用户连接时,他们就创建了一条边。
  • 用于表示搜索引擎的网页和链接。互联网上的网页通过超链接相互链接。每个页面是一个顶点,两个页面之间的超链接是一条边。用于谷歌的页面排名。
  • 用于在 GPS 中表示位置和路线。位置是顶点,连接位置的路线是边。用于计算两个位置之间的最短路线。

最后的想法

数据结构操作的时间复杂性的备忘单可以在这个链接中找到。此外,请查看我下面的文章,在这篇文章中,我使用 C++从头开始实现了一些常见的数据结构。

[## C++中的数据结构—第 1 部分

在 C++中实现通用数据结构

towardsdatascience.com](/data-structures-in-c-part-1-b64613b0138d)

最后,我要感谢 A Alkaff Ahamed 先生为改进本文提供了宝贵的反馈和建议。

我希望作为对数据结构的简单介绍,这篇文章对您有所帮助。我很想听听你的想法。😇

非常感谢你的阅读。😊

干杯!😃

参考

[1]《算法导论》,第三版,作者:托马斯·h·科尔曼、查尔斯·e·莱瑟森、罗纳德·L·李维斯特和克利福德·斯坦。

[2]维基百科的数据结构列表(https://en.wikipedia.org/wiki/List_of_data_structures)

8 选择模型方法的决定因素

原文:https://towardsdatascience.com/8-determining-factors-for-the-selection-of-the-model-approach-7d06d893d0ca?source=collection_archive---------17-----------------------

而且它们与你的技术技能无关

图片由 Arek Socha 在 Pixabay 上拍摄

最后,所有数据都被清理并准备好进行分析。安迪开始过度热情地将数据可视化,以获得数据的第一印象。他有许多维度和变量,因此他花了几天时间直观地分析它们,并确定应用的最佳方法。在那个周末,团队经理告诉他,下周二他需要一份关于结果的演示稿,因为团队经理必须在一周内将其提交给指导委员会。

安迪告诉他,他还没有结果。但是没有谈判的余地。周二,必须提交结论并整合到 PowerPoint 演示文稿中。

安迪匆忙地制作了一些回归分析,并将其整合到演示文稿中。

在指导委员会会议后,团队经理告诉他,该项目将不会继续进行。

安迪非常沮丧。那是他的第二个项目,第二次也是以同样的决定结束。他之所以选择这个职位,是因为他有潜力在大量可用的数据上做伟大的数据科学工作。

这个故事是一个真实的案例,它不是公司中的一个非典型情况。我想你们中的一些人也已经经历过类似的情况。

发生这种情况的原因不是你的技能。

当投入到企业环境中的数据科学项目时,情况与之前的学习环境不同。

我的经验是,考虑到许多公司的限制和期望,大多数数据科学家都很难管理这个项目。

不少数据科学家在第一个项目后感到失望和沮丧,并寻找另一个职位。

为什么?

他们接受处理数据、技术方法和编程方面的培训。没有人教他们项目、利益相关者或公司数据管理,也没有人教他们公司业务 KPI。

这是因为缺乏处理不言而喻的企业行为的经验。

不幸的是,在这个领域,潜在的陷阱比你所有的技能都要多。

如果您知道决定因素,您可以相应地计划您的数据科学任务,追求令人满意的项目,并指导您的工作。

在下文中,我将向您介绍在企业环境中选择模型方法的八个最重要的驱动因素,以及如何减轻它们。

1。时间、时间表和截止日期

你需要知道的事情

公司已经定义了项目流程。阶段入口或指导委员会会议是必须提交结果的会议的一部分。演示文稿必须提前几天提交,并且必须包含某些预期信息。此外,企业总是面临交付财务成果的压力。这导致持续紧张的最后期限。这些流程是企业文化的一部分,不言而喻,并认为员工知道它们。

如何解决?

问,问,问。询问里程碑,例如,做出项目决策的会议日期。

建立一个时间预算。从里程碑的日期开始,反向计算项目日程。

不仅包括你的任务,还包括周围的行动,如协调会议、演示和提交演示的截止日期。不要忘记,每个演示文稿都有一轮审查,你必须考虑在提交前几天添加内容。包括意外任务和故障排除的时间余量。

只有这样,才能选择在确定的时间表内执行的方法。选择可以快速运行且您熟悉的方法。有了一些成功的结果后,希望还有时间,开始尝试更复杂的新方法。

举例

人力资源迫切需要针对业务部门和人员的人力资源管理关键成功因素模式。根据截止日期设置时间表,我们决定仅执行简单的线性回归,而不考虑这些关键成功因素的任何相互依赖性,例如教育水平和参加的培训项目。我们专注于精确拟合更简单的模型,并确定具有高可靠性的单一贡献因素。

2.模型和结果所需的精确度

你需要知道的事情

可用的现成数据决定了模型的准确性。因此,模型的详细程度和数据的粒度必须匹配。对结果粒度的期望也是如此。方法必须符合预期。任何不匹配都会给出不可靠的结果。

如何解决?

根据可用数据的粒度选择模型。当没有合适的数据时,不要浪费时间去拟合一个非常详细和准确的模型。当没有高质量的数据时,聚合数据并使用粒度更小的模型可以得到更可靠的结果。

当决策所需的准确性水平与数据所能达到的水平不匹配时,您必须尽早上报。不要试图编造一些事情。只有透明的沟通有助于防止意外,并管理期望。否则,你会受到责备。

例子

当我们分析养老院盈利能力的影响模式时,粒度数据太不均匀,结果没有经济意义。因此,我们汇总了数据并应用了更简单的模型。根据调查结果,管理局已经可以做出重要决定,并为未来的数据管理和收集制定指导方针。

3.方法的相关性

你需要知道的事情

的问题必须用合适的方法解决。要回答的问题一定要明确。它不应该允许任何含糊不清。此外,结果的形式必须与其他内部和外部分析具有可比性。两者都指出了应该使用的相关方法的方向。

如何称呼?

确保你理解了要回答的问题。请不要假设它!问!当你用最精确的方法得到一个解决方案,但却是一个错误的问题时,这是没有用的。

基于此,您可以确定它属于描述性、预测性还是规定性领域。如果寻找最有影响的因素,选择描述性方法。当问题是预测时,选择预测性的方法,只有当各种影响下的优化决策是目的时,才选择规定性的模型。不要试图创新。我的经验是,它在大多数情况下都是错误的。

例子

三年前,我以前的团队强烈反对我,并推动实施一种新的流行的资产回报预测时间序列方法。最后,他们只是执行了它——哦,是的,我很生气,但由于最后期限的原因,我们不能搬回来。三年来,他们在没有做出大量调整努力的情况下,努力获得足够的结果。最近,我的一位前团队成员告诉我,他们最终搬回了旧模型,因为新模型包含了几个与结果无关的功能,但增加了很多噪音。

4.数据的准确性

你需要知道的事情

数据的准确性限制了可能方法的范围。非常精确的方法在使用不太精确的数据时不会带来任何价值。误差项将会很高。同样,数据的准确性和方法的准确性必须匹配。质量差会影响结果——垃圾进,垃圾出。

如何解决?

理解数据以及模型的需求。不要仅仅因为试错的原因而应用方法。不要只是重复方法,因为它已经在其他类似的案例中给出了很好的结果。您需要根据数据准确性的要求对它们进行定制。

示例

在优化两家医院的手术室容量时,我们不得不采用两种不同的方法。在一家医院,可以获得每个行动时间点的粒度数据,例如麻醉开始、进入手术室、手术开始等。由于实时电子记录,数据质量良好。

在另一家医院,数据是手工记录的,有时有几个小时的延迟,因此数据非常不准确。例如,数据显示在六个手术室中并行进行八个手术。

在第一种情况下,我们可以拟合粒度时间序列和基于代理的模型,并考虑数据的季节性。相比之下,在第二种情况下,我们必须重建模型,进行回归分析并消除不一致,然后将它们用作基于代理的更小粒度模型的输入。

5.数据可用性和准备使用数据的成本

你需要知道的事情

我经常听到这样的话:“当我们有这样或那样的数据时,我们会有完美的模型,但不幸的是,我们不能在适当的时候访问它们。”一个事实是,如今,企业只能使用大约 12% 到 30% 的数据。在我的讨论中,大多数公司表示,他们使用了大约 20%的数据。在大多数情况下,获取它们的成本太高,而且没有相应的商业案例。如果没有商业案例包含使数据可用的成本,您将无法及时获得数据。

如何解决?

在你对这些奇特的模型有了所有的想法之前,你可以申请,澄清,在适当的时候什么数据是可用的,以及获得它们的成本。仅仅因为在一个公司中“数据是可用的”,并不意味着它在合理的时间范围内和以合理的成本可用。

根据本文中给出的其他七个驱动因素对数据进行优先级排序,并在每种情况下进行成本效益分析:与获取数据的成本相比,从业务角度来看,获得数据的额外收益是什么。永远不要问‘你能给我所有的数据吗?’。这表明你对公司的业务流程一无所知,当你需要支持时,比如说,需要 It 部门的支持时,你会被降低优先级。

例子

在对一家全球银行的日间流动性数据进行模式识别时,我们意外地遇到了存储格式问题。前一年交易的一个所需数据集的数据被存档在磁带上。因此,由于发布周期和转换成可访问的格式,需要几个月的时间才能获得数据。我们必须评估替代数据并调整模型。

6.数据隐私和保密性

你需要知道的事情

客户数据通常是保密的。数据隐私受法律监管,例如欧盟的 GDPR 或加利福尼亚州的 CCPA。金融机构有自己的法规来保护所谓的 CID 数据,即客户识别数据。只有经过授权的人才能访问这些数据,而数据科学家很少在其中。数据只能以匿名、加密或聚合的形式使用,并且必须经过数据所有者、安全官和法律顾问的批准。

如何称呼?

在您开始项目之前,请澄清您的数据科学项目中是否涉及任何受这些限制的个人数据。如果是,请尽早解决这个问题,一方面通过 it,因为他们最终已经有了处理这个问题的加密工具,另一方面通过法律顾问。只有在获得所有批准和适当加密后,才能使用数据。我见过许多无法执行的项目,不是因为数据隐私法案,而是因为它处理得太晚,没有足够的时间及时获得批准和加密数据。

举例

在一个必须将信用卡交易数据用于第三方服务分析的项目中,律师需要七个月的时间来澄清和批准数据的使用。澄清内容不仅包括法律方面,还包括加密方式、应使用的汇总级别,以及软件的访问权限和容器化等技术要求。

7.资源、基础设施和工具的可用性

你需要知道的事情

公司环境中的项目涉及许多不同的部门:IT、业务、创新团队或内部咨询小组。所有人都同时参与几个项目,他们的时间有限。

你需要存储和计算能力。关于软件安装的公司规则已经到位,并且需要相应的批准。如果某个工具需要成本并需要许可,则存在公司批准流程。作为一名数据科学家,你不仅需要 Python 和 Jupyter Notebook,而且很可能需要其他工具,如 Tableau 或 Alteryx。有些公司需要像 Docker 这样的容器。有些工具是公司政策不允许的。

如何解决?

在开始实际项目之前,澄清工具和基础设施。估计所需的存储和计算能力,并确保其可用。阐明公司关于数据科学软件的政策,以及可用的工具。尽早通知其他部门的人员即将到来的支持,以便安排一些专门的时间。在现有的数据科学团队中工作时,您可以首先与您的直线经理澄清这一点。但是,即使在一个已建立的数据科学团队中,也不要假设项目所需的一切都已就绪。

例子

在银行处理大量交易数据时,我们需要更高的计算和存储能力。我们在私有云环境中工作,通常只需要几分钟到几个小时就可以增加容量。但是,由于我们使用的是客户身份识别数据,因此在所谓的红区环境中,这是一个安全性非常严格的虚拟区域,基础架构需要经过安全官的“红区”认证。这花了两个星期。

8.公司产品和项目管理关键绩效指标

你需要知道的事情

企业用 KPI 来衡量产品和项目管理。有一些量化指标,比如短期项目的净现值或产品的盈亏平衡点。还有一些质量上的好处,比如缩短上市时间,一个项目的经验可以用于其他项目,等等。项目的决策和批准是基于这样的标准。

如何称呼?

不管你的数据科学工作成果有多好;它应该始终转化为公司的 KPI。因此,向你的直线经理澄清公司的指导措施是什么。将您的成果转化为这些指标,并传达给公司带来的好处。我的经验是,决策者停止的项目较少,更多的是实施到公司的流程中,最后,它在数据科学团队的工作中建立了很多信任。

例子

一家生命科学公司的一个部门几个月来一直试图为他们计划的数据科学项目获得内部资金,尽管思想、数据和数据科学是该公司战略的支柱。他们最终请求我支持他们。我们发现财务部有项目的投资模板,包括公司的指标。因此,我们向他们索要模板,并将所有数据科学蓝图组装到这样的神殿中。在下一轮演示之后,他们所有项目的 60%都被批准了。导火索是执行委员会现在可以将其与公司的 KPI 和其他项目的绩效进行比较。

连接圆点

许多数据科学家没有意识到,在企业环境中工作,除了建立模型和分析数据之外,还有多达 80%的其他任务。当你读完我所有的评论时,你最终会有点沮丧。

但是,了解上述因素并尽早解决它们,并积极主动地让你回到驾驶座上,避免糟糕的意外。目标是为我们的任务获得尽可能多的自由。它增加了项目的成功,你可以腾出时间用更复杂和新的方法做实验。

数据科学家没有接受过管理此类因素的培训,通常也没有预料到这些因素。正确地管理它们比你所有详细的技术知识更重要。

我所有的解决这些决定性因素的技巧和诀窍既不是火箭科学也不是秘密。但是提高你对它们的认识是至关重要的。我希望能让你对你的项目有更多的控制和更多的乐趣。

你应该在 LinkedIn 上关注的数据科学领域的 7 个人

原文:https://towardsdatascience.com/8-folks-you-should-be-following-on-linkedin-75f8fe9e43db?source=collection_archive---------28-----------------------

作为一名数据科学家不断进步和跟上时代

莫尼卡·梅尔顿在 Unsplash 上的照片

如今很难找到优秀的导师。随着如此多的信息和如此多的观点充斥互联网,找到一个特定领域的权威可能相当困难。

这一壮举并没有贬低在我们生活的不同阶段和领域寻找导师的重要性。长期以来,导师一直被认为是最有效的学习方式,可以将你的学习曲线缩短一半。见鬼,上面甚至有一段圣经经文——箴言 19:20——NLT尽可能得到所有的建议和指导,这样你的余生将会变得聪明”。

“如果说我看得更远,那是因为我站在巨人的肩膀上。”——艾萨克·牛顿

话虽如此,我认为有必要整理一份我们都应该关注的有效数据科学专业人士的名单,特别是在 LinkedIn 上。

列出这份名单非常困难,我可以添加的名字太多了,比如 Dat Tran 、 Kevin Tran 和 Steve Nouri 等等。但我认为“不”这些名字出现得如此频繁——人们现在应该知道并关注它们。我想要新鲜血液,那些我看不到被抛来抛去却为社区做出惊人贡献的名字。

:我还必须考虑到,我并不知道所有在 LinkedIn 上做出惊人工作的数据科学家。如果你愿意,请随意评论一些名字,并添加他们的 LinkedIn 个人资料,以便我们可以关注他们。

#1 — 阿布舍克·塔库尔

他是世界上第一位 4x Kaggle 特级大师,是今年最令人兴奋的机器学习书籍之一的作者,是 Youtuber 和 Boost.AI 的首席数据科学家。

如果你在 LinkedIn 上关注我,你可能知道这是迟早的事,因为我经常分享他的帖子。我个人从 Abhishek 那里获得了大量的灵感,因为他是如此的实际——所有的东西都被应用。我想我从没见过他在分享某件事情时不给出一个真实世界的例子。

来源 : 阿布舍克·塔库尔 Youtube 频道

他的大部分工作无疑是针对具有机器学习经验的人,但最近他一直在发布许多围绕闯入数据科学的视频——下面是一些例子:

  • 如何在 1 年内成为一名数据科学家(从真实世界的例子中学习)
  • 我如何开始我的数据科学职业生涯?
  • 我的旅程:我如何成为 Kaggle 上的世界第一位 4x(和 3x)大师

免责声明:他的发型变化很大但我可以验证还是他!

[## Abhishek Thakur -首席数据科学家- boost.ai | LinkedIn

购买我的书:接近(几乎)任何机器学习问题:美国:https://www.amazon.com/dp/8269211508UK…

www.linkedin.com](https://www.linkedin.com/in/abhi1thakur/)

#2 — 昂舒曼·戈什博士(博士、MBA、MBE)

Angshuman 博士分享了围绕数据科学的极具启发性、教育性和激励性的帖子。我经常发现自己在他发布的有用资源上做书签,这样我就可以在以后的数据中参考,例如这本 47 页的关于 机器学习数学 的书。

他是 Target 的首席数据科学家,现在是 Grab 的高级经理,也是印度管理学院的客座教授。我肯定会建议关注昂舒博士,并与他的帖子互动。

注意:由于某种奇怪的原因,当我分享他页面的链接时,Medium 没有阻塞。在 LinkedIn 上关注昂舒博士

第三名——菲利普·沃莱特

Phillip 是一名高级数据工程师,也是一名激进的自然语言处理传道者——我是指字面上的激进!

他还发布了关于数据可视化、深度学习和机器学习的非常有用的内容,因此在某种程度上使他成为一个多面手,但总的来说,他肯定会谈论 NLP。

来源 : 菲利普·沃莱特领英活动

给他一个关注…

[## Philip Vollet -高级数据工程师-毕马威德国| LinkedIn

⚡Insights 关于自然语言处理机器学习数据科学生物信息学图形技术⚡…

www.linkedin.com](https://www.linkedin.com/in/philipvollet/?originalSubdomain=de)

#4 — 埃里克·韦伯

我最近开始关注埃里克,从那天起,它就一直是我 LinkedIn feed 上的宝石。他的帖子主要是为数据专业人员提供建议,但他偶尔也会提供一些对进入数据领域有用的资源。

来源: 埃里克·韦伯领英帖子

Eric 是 Yelp 的实验负责人数据科学负责人,我肯定会把他列为第一批追随的人之一。

[## 埃里克·韦伯——Yelp | LinkedIn 的实验主管

请点击[关注]获取有关数据专业人士社区(领导者、科学家、分析师等)的更新和建议

www.linkedin.com](https://www.linkedin.com/in/eric-weber-060397b7/)

#5 — 马得

我觉得我和丹尼有很多相似之处,所以我能理解他的帖子。Danny 是一名自学成才的数据科学家和机器学习工程师,没有科学、技术、工程或数学(STEM)学位,也没有硕士或博士学位——他甚至进一步说他没有证书,并努力完成了 3 门在线课程。我相信我们很多人都有同感。

来源 : 马得领英帖子

丹尼分解现场工作的方式消除了人们对与角色相关的巨额薪酬的恐惧。看,自从我在学校放弃食品技术后,我就没做过一顿饭,但看看 how 谈论数据科学饮食。

[## 马得-创始人&首席执行官-悉尼数据科学| LinkedIn

在全球最大的职业社区 LinkedIn 上查看马得的个人资料。丹尼有一份工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/datawithdanny/)

凯尔·麦基乌

介绍凯尔很简单——我只要看他的标题就行了。我教数据科学家如何找到工作,简单明了。当凯尔有话要说时,他会发帖,而且通常很有价值。

来源 : 凯尔·麦基乌帖子

我知道…有争议!

有很多方法可以和凯尔联系:

  • Youtube
  • Instagram

但是这个帖子是关于 LinkedIn 老兵的!

[## Kyle McKiou -创始人兼首席执行官-数据科学梦想工作| LinkedIn

查看 Kyle McKiou 在世界上最大的职业社区 LinkedIn 上的个人资料。凯尔有 8 份工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kylemckiou/)

# 7——莱克斯·弗里德曼

莱克斯·弗里德曼是独一无二的,但他的帖子确实提醒我,他是真正的人——我可以证明这一点,因为我看到他在流汗。他在麻省理工学院从事以人为中心的人工智能、自动驾驶汽车和深度学习方面的研究。

听说过埃隆·马斯克如何管理自己的时间吗?好吧,埃隆·马斯克找到了足够的时间(准确地说是 36 分钟)与“俄罗斯杀手”坐在一起——他说不是我——哦…我忘了补充,乔·罗根也认为有必要。

链接到莱克斯·弗里德曼播客

包裹

读完这篇文章后,你可能会感到惊讶,但你的问题的答案是“是的!有很多杰出的女性从事数据科学研究”,我将在下一篇文章中介绍你应该在 LinkedIn 上关注的 7 位女性——如果你想获得该文章的通知,请在 Medium 上关注我。

我提供的名单没有特定的顺序,而且肯定不是世界上唯一在社区中做伟大事情的人。正如我前面提到的,我想会见更多的权威人士,所以如果你有一些我没有提到的,那么一定要把他们和我联系起来!

让我们继续 LinkedIn 上的对话…

[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

任何数据科学家都必须知道的 Pandas 库中的 8 个函数

原文:https://towardsdatascience.com/8-functions-from-the-pandas-library-that-any-data-scientist-must-know-17f6d33521a?source=collection_archive---------50-----------------------

杰瑞米·C 在 Unsplash 上的照片

如果你是通过“数据科学家荣耀之路”开始你的旅程,也许在你的旅程中会出现一些问题。为了帮助你,我创建了这个指南,展示了这个小而闪亮的库的所有关键方面。

开始之前

你需要使用的任何工具都有一些核心概念,在使用之前必须了解,熊猫也不例外。熊猫开发者将该库描述为“一个快速、强大、灵活且易于使用的开源数据分析和操作工具”

简而言之,我们可以说 Pandas 是一个库,我们总是需要它来阅读和理解我们的结构化数据。我所说的结构化指的是任何表格数据,比如 excel 文件等等。如果您没有收到这些术语,不用担心,它们对本指南并不重要。

我希望你不要忘记的事情更简单:熊猫读取数据并将其转换为一堆系列,将系列想象为“单列多行”。这些“串系列”在熊猫内部被称为数据帧

关于我们的数据集

我将使用我过去工作过的数据集。我们的数据内容是关于佐治亚州亚特兰大市的犯罪。点击这里你可以获得原始版本和更多信息。

好了,我们终于能够开始做一些问题,并用代码回答它们了。我们开始吧!

1)如何读取数据文件?

这里你需要回答的第一个问题是:“我的数据有什么格式?”。答案会指引你的下一步。默认情况下,我们使用。csv(逗号分隔值),但您可以使用任何类型。

上面没找到你的格式?点击此处,您可以找到正确的代码来加载您的数据。

2)如何在我的数据框架内导航?

我所说的“导航”是指毫无问题地在数据集间穿行。默认情况下,我们可以只使用我们的列名来验证我们在特定列中的条目,但是使用 Python 的 slice 还有更高级的方法。

下面你可以验证一些核心导航方式的区别。

如何过滤我的数据框?

这么说吧,你需要数一数有多少数值高于 10,100,1000!啊,我想你明白了…你能做什么?例如,如何获取目标值不低于 100 的所有空单元格。让我们把它编码。

4)如何验证缺失数据?

在数据清理阶段,验证数据集是否有空值非常重要,并据此决定如何处理。不幸的是,丢失的值不仅仅是 NaN 条目,还可能是-1、0 甚至是“丢失”的字符串。我将在这里留下一堆解决这个问题的方法。

5)如何验证我的数据帧类型?以及如何修改?

默认情况下,上面描述的 info()方法可以完成这项工作,但是还有其他方法可以处理。这需要在数据清理/争论期间完成!如果您使用不正确的 dtypes 导出处理过的数据集,您以后需要小心(浪费时间)。这是非常简单的一步,但是非常重要。

6)我需要修改每个条目的值,该怎么办?

通常我们会在数据争论阶段这样做,例如,当您需要基于度量标准的一些问题来修改实际的数据时。有很多方法可以做到这一点,你可以在下面查看。

附加信息

即使有那么多信息,我知道这永远不够。所以我也会回答其他人的问题。把喜欢当成一种奖励。

如何使用 crosstab 和 groupby?

在探索性数据分析阶段,两者都是很好的工具。不用写很长的代码,你可以提取真正重要的东西,然后用一段时间。非常有趣的方法!

交叉表

第一个是 crosstab,它实际上将两个系列“交叉”并返回一个对象。例如,你可以用这个结果为你的客户策划一些真正重要的信息。

使用熊猫的交叉表示例

分组依据

groupby 将基于一个或一小组列对整个数据集进行分组。结果不是将它们交叉,而是该列后跟所有其他列的值,这些值与分组后的值相匹配。用图像更容易理解。

以熊猫为例分组

我需要将这些信息可视化,有办法吗?

啊,我真的很喜欢这个!你想看什么就画什么!Pandas 有一个名为 plot 的内置函数,它使用 Matplotlib(一个绘图库)。作为回应,它可以用一种非常简单的方法为您完成这项工作!让我展示一下。

就是这样,伙计们!

希望你喜欢这个内容,并能熟练运用你的新知识!如果你想每天都学到有趣的东西,我很乐意成为你在 Medium 的老师!

你也可以查看我的 Github 个人资料。我从事一些数据科学项目已经有一段时间了。所有的关键概念都可以学习和重用!

[## 雷南·洛里科

在 GitHub 上注册你自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方…

github.com](https://github.com/renfelo)

解读新冠肺炎统计数据时避免常见陷阱的简短指南

原文:https://towardsdatascience.com/8-key-points-you-might-want-to-think-about-before-sharing-that-next-covid-19-stat-with-your-friends-812c134de124?source=collection_archive---------7-----------------------

在与朋友分享下一个统计数据之前,你可能需要考虑的 8 个要点

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

随着新冠肺炎疫情事件在过去几周的展开,我们被媒体报道的确诊病例、死亡人数、死亡率等数字所淹没。不幸的是,许多报道似乎倾向于对数字的自由解释,这种解释助长了耸人听闻的说法和头条新闻,而牺牲了科学的严谨性和客观的信息传播。

我过去 15 年的大部分时间都在利用大量嘈杂的数据来构建复杂现象的数学模型:我完成了人类大脑建模的研究生学业,并在高盛(Goldman Sachs)担任过定量分析师,在脸书担任过数据科学经理。在我的职业生涯中,我一次又一次地看到,缺乏对数据来源、背景和获取方法的理解,会导致对你正在研究的现象的严重误解。媒体和社交网络上流传的最新新冠肺炎数据和解读也不例外。我想和你分享一个没有术语、不详尽的 8 要点列表,来帮助你避免这些陷阱。

8 个关键点

  • 确诊病例几乎是一个无用的独立指标,它总是低估真实的感染人数。
  • 检测到的病例数量的增加或减少直接受到正在进行的检测数量的影响
  • 报告病例数量的增加并不一定意味着更多的人被感染。
  • 除非对人群的检测是随机进行的,否则检测出的阳性病例的百分比将而不是反映受感染人群的真实百分比。
  • 死亡人数的峰值总是滞后于感染人数的峰值。
  • 病例死亡率(CFR),即检测到的病例中死亡人数的百分比,是对实际感染死亡率(IFR)的高估,并且随着检测的增加而不断降低。
  • 国与国之间的比较应该考虑到人口统计和抽样方法的差异,并以百分比为基础。
  • 一个相关且熟悉的基线让发展对数字的直觉变得更加容易。

深入讨论

绝对检出病例数大多是无用的

新闻标题中经常出现这样的内容:“检测出 1000 例新型冠状病毒”或“T2 冠状病毒病例达到 10 万例”。这些数字并不能说明疫情的进展如何,它们只是一个诱饵。原因如下:

假设一个 1000 万人口的国家有 100 万感染者,那么 10%的感染率。如果我们在第一天随机测试 5000 人(稍后会有更多),检测到的病例数将会是 500。这个数字与实际感染人数相差甚远,由于检测能力有限,确诊病例总是被低估。现在假设第二天,我们检测了 50,000 人,确诊病例总数将增加约 5,000 例。这十倍的每日增长是确诊病例的增长,而不是总感染人数的增长,并且是检测增加的直接后果

作为政府应对新冠肺炎疫情的一部分,每天将进行更多的测试,这些测试的快速增加将远远超过疫情的发展,因此确诊病例数量的变化,特别是在疫情开始时,将主要受测试数量而不是实际感染病例的影响。

更进一步,在感染高峰后,政府加强检测的情况下,T10 每日确诊病例很可能会增加,尽管感染总人数正在减少 T11。想象一下这样一种情况,测试从 5000 次增加到 10000 次,而感染率从 10%下降到 9%(一天内大幅下降),每天确诊的病例仍然会从 500 例增加到 900 例!这再次表明,在评估疫情进展时,单独的确诊病例数是多么不相关。

抽样:细节决定成败

由于在给定的一天内只能进行有限数量的测试,因此需要制定一个关于如何分配这些测试的协议。这种分配策略,在科学界也被称为抽样方法,对被报告的案例有直接影响。让我们继续我们开始的例子,假设政府可以有 2 个策略来分配 5000 个测试:

  • 策略 A:随机敲开人们的门,让他们接受测试。
  • 策略 B:只测试那些在热线上自我报告显示有新冠肺炎症状的人。

策略 B(又名偏倚抽样)将导致比策略 A(又名随机抽样)更高的报告病例数。策略 B 是有偏见的,因为它测试的是被感染的可能性高得多的亚群。现在来看看阳性检测的百分比:策略 B 将给出自报感染症状病例的百分比估计值,而策略 A 将给出总体感染率的估计值。

随着政府提高日常检测率,通常人群的抽样方法将从 B 类策略逐渐变为 A:最初,住院患者和有急性症状的人优先,但随着检测变得更加普遍,更多症状较轻的人以及最终症状很少或没有症状的人将有机会接受这些检测。随着各国积极提高他们的检测能力,越来越接近真实的人口感染率,检测呈阳性的病例的 T4 百分比通常会下降。

与此相关的是,有偏样本仍然可以用来获得我们试图测量的属性的无偏估计。这需要有正确的数据来清楚地量化样本的偏差,并根据总体人口特征进行调整。通常,如果收集到正确的数据,收集数据的组织和政府应该能够共同提供一个无偏见的估计。看到这样的努力,以避免有偏见的估计的传播,这将是伟大的。(我已经发表了一篇简短的后续文章,讨论这样一个框架会是什么样子这里

死亡人数和死亡率

正如我们前面看到的,检测人群中的所有感染是一项重要的任务。那么死亡人数呢?由于大多数新冠肺炎死亡病例是在住院治疗后发生的,在住院治疗中,检测已成为急性症状的标准,因此可以假设记录的死亡人数接近实际死亡人数。这里要注意一点:不同国家记录和归因于新冠肺炎病毒的死亡过程并不总是相同的——稍后将详细介绍。

在跟踪疫情病毒演变的背景下,死亡人数被称为【滞后 指标,因为死亡仅在最初感染后的几个事件中发生:感染→潜伏期→症状→恢复或死亡)世界卫生组织认为仅潜伏期就在 1 至 14 天之间。因此,如果我们在寻找感染人数的峰值,它通常会在死亡人数的峰值被报道之前大约几周出现。

让我们看看死亡率。我们应该明确区分两种不同的指标:

  • 病死率(CFR)是仅检测到的病例的病死率
  • 感染致死率(IFR)是所有感染的人的致死率(已测试&未测试)。

大多数标题中报道的数字,例如“7%的病例现已导致死亡”是 CFR,并且总是高估了真实的感染死亡率。此外,随着测试的增加,CFR 将不变地降低并更倾向于 IFR。

比较和发展对数据的直觉

我希望到目前为止,我已经成功地帮助你更好地理解了媒体上抛出的数字到底代表了什么,以及它们的局限性。在这最后一节,我想给你一些比较各国统计数据的小技巧,以及如何通过将它们联系起来获得更好的直觉。

因此,在进行国家间比较时,让我们从一些警告开始:

  • 正如整篇文章所指出的,比较原始绝对数字在大多数时候是不相关的。始终确保您看到的是比率,而不是绝对数字。例如,在一个 100,000 人口的国家中 5000 人死亡,代表了比一百万人口中 10,000 人死亡更高的死亡率。
  • 正如我在文章前面所指出的,各国将处于不同的测试阶段,这意味着这将直接影响他们的数据有多失真。
  • 各国可能会以不同的方式进行检测和记录,例如,如果没有在更早的时候进行检测,是否在死后检测新冠肺炎病毒,或者受感染者的死亡是否直接归因于新冠肺炎病毒,而不管它是否是死亡的原因。
  • 国与国之间有一些重要的因素会对这些数字产生很大的影响:比如年龄分布、总体人口健康状况以及医疗保健系统的质量

我想说的最后一点是,当你第一次试图通过指标来观察和理解一个现象时,最好是有一个合适的基线或基准来进行比较。这样会更容易获得某种直觉。例如,知道新冠肺炎是病毒流感的一个分支,使用季节性流感的死亡人数,可能是一个很好的基线,例如,假设如果没有采取缓解或遏制策略,新冠肺炎在一个地区的当前死亡人数估计为 10,000 人:如果同一地区的季节性流感死亡人数约为每年 15,000 人,这有多令人担忧?相比之下,季节性流感死亡人数约为 1000 人。

结论

我在这篇文章中试图分享一些指导方针,使读者能够避免在解读新冠肺炎疫情数据和统计数据时最常见的错误。我真诚地希望记者们也把这 8 点作为一个清单,以科学合理的方式报道数据,远离任何耸人听闻和令人恐惧的标题。世界各地的许多政府都按下了恐慌按钮,人们很焦虑,我们的医疗专业人员(衷心感谢他们所有人)在第一线,经历了地狱般的情况。在这个动荡的时代,我们需要基于事实的冷静报道。

下一篇文章将讨论在快速发展的情况下,使用理论模型和不完整数据进行关键决策的最佳实践。敬请关注。

最新文章: 我们该开始问这个难题了

关注作者 @DonRiachi

8 ML/AI 项目,让您的投资组合脱颖而出

原文:https://towardsdatascience.com/8-ml-ai-projects-to-make-your-portfolio-stand-out-bfc5be94e063?source=collection_archive---------0-----------------------

有趣的项目想法与源代码和参考文章,也附上一些研究论文。

来源 Unsplash ,由作者编辑

你对进入数据科学世界感到兴奋吗?
祝贺你!这仍然是正确的选择,因为在这个疫情期间,数据科学和人工智能领域的工作需求将得到最终推动。

虽然,由于危机,市场现在变得更难像以前一样用更多的劳动力重新建立起来。所以,你可能要为长期的招聘之旅和许多拒绝做好心理准备。

因此,在写这篇文章时,我假设你已经知道数据科学投资组合是至关重要的,以及如何建立它。
你可能会把大部分时间花在处理数据和争论上,而不是应用花哨的模型。

数据科学爱好者不断向我提出的一个问题是,他们应该在自己的投资组合中包含什么样的项目,以构建一个非常好且独特的投资组合。

下面,我为您的数据科学产品组合提供了 8 个独特的想法,并附上了参考文章,您可以从这些文章中深入了解如何开始任何特定的想法。

1.基于社交媒体帖子的抑郁症情感分析

照片由 dole777 在 Unsplash 上拍摄

这是一个非常敏感的话题,急需解决。全世界有超过 2.64 亿人患有抑郁症。抑郁症是全球范围内导致残疾的主要原因,也是全球疾病总负担的重要支持者,每年有近 80 万人因自杀而死亡。自杀是 15-29 岁人群死亡的第二大原因。抑郁症的治疗经常被延迟、不精确和/或完全错过。

基于互联网的生活给了主要优势改变早期忧郁调解服务的机会,特别是在年轻的成年人。一直以来,Twitter 上大约有 6000 条推文,这相当于每时每刻发送超过 35 万条推文,每天有 5 亿条推文,每年约有 2000 亿条推文。

皮尤研究中心指出,72%的公众使用某种基于互联网的生活。从社交网络发布的数据集对许多领域都很重要,例如,人类科学和大脑研究。但是从专业的角度来看,这种支持还远远不够,而且显式的方法也很不走运。

通过分析社交媒体帖子中的语言标记,有可能创建一个深度学习模型,该模型可以比传统方法更早地洞察个人的心理健康。

[## 你在推特上说什么就是什么

通过 Twitter 使用检测社交媒体中的抑郁症

towardsdatascience.com](/you-are-what-you-tweet-7e23fb84f4ed) [## 抑郁症的早期检测:社会网络分析和随机森林技术

原始论文 1 西班牙 A . Coruna 大学计算机科学学院计算机科学系 2…

www.jmir.org](https://www.jmir.org/2019/6/e12554/) [## 使用机器学习技术从社交网络数据中检测抑郁症

关键词:社交网络、情绪、抑郁、情绪分析

www.ncbi.nlm.nih.gov](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6111060/)

2.基于神经网络的体育比赛视频文本摘要

照片由阿克什·亚达夫在 Unsplash 上拍摄

所以这个项目的想法基本上是基于从体育比赛视频中获得精确的摘要。有体育网站会告诉你比赛的精彩部分。已经提出了各种模型来完成提取文本摘要的任务,但是神经网络做得最好。一般来说,摘要是指在一个简短的结构中介绍信息,集中在传达事实和信息的部分,同时保护其重要性。

自动创建游戏视频的轮廓带来了区分游戏的精彩部分的挑战。

因此,可以使用一些深度学习技术来实现这一点,如 3D-CNN(三维卷积网络)、RNN(递归神经网络)、、LSTM(长短期记忆网络),也可以通过机器学习算法来实现,将视频分成不同的部分,然后应用 SVM(支持向量机)、神经网络(神经网络)、k-means 算法。

为了更好地理解,请详细参考所附文章。

[## 基于迁移学习的体育视频摘要场景分类

本文针对体育视频场景分类的特殊目的,提出了一种新的分类方法

www.mdpi.com](https://www.mdpi.com/1424-8220/20/6/1702/htm)

3.使用 CNN 的手写方程求解器

安托万·道特里在 Unsplash 上拍摄的照片

其中,手写数学表达式的识别是计算机视觉研究领域中令人困惑的问题之一。您可以使用卷积神经网络(CNN) 和一些图像处理技术,通过手写数字和数学符号训练一个手写方程求解器。开发这样一个系统需要用数据训练我们的机器,使它们能够熟练地学习并做出所需的预测。

为了更好的理解,请参考下面的文章。

[## 使用卷积神经网络的手写方程求解器

介绍

medium.com](https://medium.com/@vipul.gupta73921/handwritten-equation-solver-using-convolutional-neural-network-a44acc0bd9f8) [## vipul 79321/手写方程求解器

一个使用 CNN 方程的手写方程解算器可以包含从 0-9 的任何数字和符号+,x,-在图像上用…

github.com](https://github.com/vipul79321/Handwritten-Equation-Solver) [## 计算机视觉—手写数学答题卡的自动评分

将徒手写在纸上的解数学方程的步骤数字化,验证步骤并最终…

towardsdatascience.com](/computer-vision-auto-grading-handwritten-mathematical-answersheets-8974744f72dd) [## LaTeX 的手写方程式

这篇文章还是关于机器学习,而不是关于优化,但我想提一些事情…

开放源代码](https://opensourc.es/blog/he2latex/)

4.使用 NLP 生成商务会议摘要

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

有没有遇到过这样的情况,每个人都想看到一个摘要而不是完整的报告。我在学校和大学的时候就面临这个问题,我们花了很多时间准备一份完整的报告,但是老师只有时间看摘要。

摘要已经成为解决数据过载问题的一种不可避免的有用方法。从对话中提取信息具有很好的商业和教育价值。这可以通过对对话的对话结构的统计、语言和情感方面的特征捕捉来完成。

手动把报表改成汇总的形式太费时间了,是不是?但是人们可以依靠自然语言处理技术来实现这一点。

使用深度学习的文本摘要可以理解整个文本的上下文。对于我们所有需要快速总结文档的人来说,这难道不是梦想成真吗!!

为了更好的理解,请参考下面的文章。

[## 使用 Python 深度学习的文本摘要综合指南

“我不要完整的报告,只要给我结果的摘要”。我经常发现自己处于这种情况——两者都是…

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2019/06/comprehensive-guide-text-summarization-using-deep-learning-python/) [## 理解文本摘要并在 python 中创建自己的摘要器

摘要可以被定义为一项任务,即产生一个简洁流畅的摘要,同时保留关键信息和…

towardsdatascience.com](/understand-text-summarization-and-create-your-own-summarizer-in-python-b26a9f09fc70)

5.面部识别检测情绪,并相应地建议歌曲

照片由 Unsplash 上的 Alireza Attari 拍摄

人脸是一个人身体的重要组成部分,在了解一个人的精神状态方面尤其重要。这消除了将歌曲手动隔离或分组到各种记录中的沉闷和乏味的任务,并有助于基于个人的情感特征生成适当的播放列表。

人们倾向于根据他们的心情和兴趣来听音乐。人们可以创建一个应用程序,通过捕捉面部表情,根据用户的情绪为他们推荐歌曲。

计算机视觉是一个跨学科领域,有助于向计算机传达对数字图像或视频的高级理解。计算机视觉组件可以用于通过面部表情来确定用户的情绪。

我也发现了一些有趣和有用的 API,虽然我没有做这些,但是把它们附在这里,希望能对你有所帮助。

[## 20 多种情感识别 API 会让您印象深刻,并引起您的关注|北欧 APIs |

如果企业可以一直使用技术来感知情感,他们就可以利用技术向消费者销售…

nordicapis.com](https://nordicapis.com/20-emotion-recognition-apis-that-will-leave-you-impressed-and-concerned/)

6.从开普勒等航天器拍摄的图像中寻找可居住的系外行星

由尼克·奥瓦尔在 Unsplash 上拍摄的照片

在最近的十年里,超过 100 万颗恒星被监测以识别凌日行星。人工解释潜在的系外行星候选者是劳动密集型的,容易出现人为错误,其后果很难评估。卷积神经网络适合于在嘈杂的时间序列数据中识别类地系外行星,比最小二乘法策略具有更高的精度。

[## 使用机器学习搜寻系外行星

搜寻太阳系以外的世界。

towardsdatascience.com](/exoplanet-hunting-using-machine-learning-d615958e1787) [## 人工智能,美国宇航局用于发现系外行星的数据

随着最近发现了第八颗行星,我们的太阳系现在是围绕着一颗恒星的行星数量最多的系

www.nasa.gov](https://www.nasa.gov/press-release/artificial-intelligence-nasa-data-used-to-discover-eighth-planet-circling-distant-star)

7.旧破损卷轴图片的图像再生

来源 Pikist

我知道,把你损坏的旧照片恢复成原来的样子是多么耗时和痛苦。因此,这可以通过找到所有图像缺陷(裂缝、磨损、孔洞)使用深度学习来完成,并使用修复算法,人们可以根据周围的像素值轻松发现缺陷,以恢复和着色旧照片。

[## 利用深度学习对旧图像进行着色和恢复

利用深度学习对黑白图像进行着色已经成为现实世界应用的一个令人印象深刻的展示…

blog.floydhub.com](https://blog.floydhub.com/colorizing-and-restoring-old-images-with-deep-learning/) [## 图像修复指南:使用机器学习来编辑和纠正照片中的缺陷

我们快照中的错误

heartbeat.fritz.ai](https://heartbeat.fritz.ai/guide-to-image-inpainting-using-machine-learning-to-edit-and-correct-defects-in-photos-3c1b0e13bbd0) [## 如何在完全无数据集的情况下执行图像恢复

深度学习需要大量的数据。这个短语在那些考虑使用深层…

towardsdatascience.com](/how-to-perform-image-restoration-absolutely-dataset-free-d08da1a1e96d)

8.使用深度学习的音乐生成

由阿比盖尔·基南在 Unsplash 上拍摄的照片

音乐是各种不同频率音调的组合。因此,自动音乐生成是一个在最少人工干预的情况下创作一小段音乐的过程。最近,深度学习工程已经成为编程音乐生成的前沿。

[## 使用深度学习的音乐生成

“如果我能再活一次,我会定下一个规矩,至少读一些诗,听一些音乐……

medium.com](https://medium.com/analytics-vidhya/music-generation-using-deep-learning-a2b2848ab177) [## 如何在 Keras 中使用 LSTM 神经网络生成音乐

使用 LSTM 神经网络创作音乐的介绍

towardsdatascience.com](/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834d4c5)

一锤定音

我知道建立一个很酷的数据科学投资组合是一件非常困难的事情。但是有了我上面提供的这些,你可以在那个领域取得高于平均水平的进步。该系列是新的,这也为研究目的提供了机会。因此,数据科学的研究人员也可以选择这些想法来工作,这样他们的研究将对数据科学家开始这个项目有很大的帮助。此外,探索以前没有人做过的事情真的很有趣。虽然,这个系列实际上是由从初级到高级的想法组成的。

因此,我不仅会向数据科学领域的新手推荐这个,也会向资深数据科学家推荐。这将在你的职业生涯中开辟许多新的道路,不仅是因为项目,也是通过新获得的网络。

这些想法向你展示了广泛的可能性,并给你跳出框框思考的想法。

话虽如此,但有一个非常有趣的发现会帮助你组织你的深度学习项目。在这里,您甚至可以跟踪您的模型,评估它们的性能,以及部署它们。

对我和我的朋友来说,学习因素、为社会增加价值和未开发的知识是重要的,某种程度上的乐趣是必不可少的。所以,基本上,我喜欢做这样的项目,它给我们一种获得大量知识的方式,让我们探索未被探索的维度。这是我们致力于此类项目时的主要关注点。

我希望你们会发现这篇文章对你们有益。请在评论框中分享你对这些项目想法的想法&如果你有 any✌️,请让我知道其他很酷的想法

所以,如果我的博客帖子对你有所帮助,而你此刻觉得很慷慨,请不要犹豫,请给我买杯咖啡。☕😍

是的,点击我。

And yes, buying me a coffee **(and lots of it if you are feeling extra generous)** goes a long way in ensuring that I keep producing content every day in the years to come.

您可以通过以下方式联系我:

  1. 订阅我的 YouTube 频道 视频内容即将上线 这里
  2. 跟着我上
  3. 通过 LinkedIn 联系我
  4. 跟随我的博客之旅:-https://kajalyadav.com/
  5. 成为会员:-

也可以看看我的其他博客:

** [## 基于 Python 的推特情感分析预测美国总统大选

修订数据科学基础的有趣项目,从数据集创建到数据分析再到数据可视化

medium.com](https://medium.com/datadriveninvestor/predicting-us-presidential-election-using-twitter-sentiment-analysis-with-python-8affe9e9b8f) [## 用 10 个简单的步骤搜集 1000 篇新闻文章

如果你遵循这 10 个简单的步骤,使用 python 进行网络抓取是非常简单的。

towardsdatascience.com](/scraping-1000s-of-news-articles-using-10-simple-steps-d57636a49755)**

Python 中复制的 8 个流行的 SQL 窗口函数

原文:https://towardsdatascience.com/8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7?source=collection_archive---------7-----------------------

编程 | 面试 | 办公时间

关于如何在业务分析中利用 Pandas 高效复制最常用的 SQL 窗口函数的教程。

un splash:David Backer 的紫色建筑仰视图

更新:你们中的许多人联系我,要求在从 SQL 过渡的同时,为数据科学或数据分析学习 Python 提供有价值的资源 下面我分享 4 个我强烈推荐坚持学习的课程/平台:

  • SQL & Python 高级编码问题(StrataScratch)目前为止我找到的准备 SQL 编码面试的最好平台!比 LeetCode 便宜多了。
  • 用 Python 进行数据科学编程 →非常高质量的内容。
  • 用 Python 操纵数据:一只熊猫速成班
  • SQL 汇总统计&窗口功能

希望你也会发现它们有用!现在享受这篇文章:D 这个职位包括附属链接,我可能会赚一小笔佣金,没有额外的费用给你,你应该购买。

任何致力于构建公司 KPI 或创建分析业务绩效的报告的数据分析师都知道 SQL 窗口函数是一个强大的工具。使用它们的真正优势是可以在不同的时间范围内计算许多指标,而不会影响原始数据集的粒度。这反过来意味着不需要使用多个自连接或 cte 就可以实现更多功能,从而节省大量代码。

如果到目前为止,您主要使用 SQL 来构建指标和提取见解,并且正在学习 Python,那么您可能想知道如何在 Pandas 中复制您喜爱的窗口函数。在接下来的教程中,我将展示如何利用 Python 中的窗口函数使代码更加紧凑和高效。

数据集 1

在教程的第一部分,我们将使用一个模拟的客户订单数据集,可以通过 GitHub 下载。数据集最初包括七列(订单日期、订单 ID、客户 ID、商品 ID、商品价格、数量已付金额()),但是我们还将添加订单月份,如下所示:

我们发现数据集包括 50 个不同的订单 id 和 8 列,但是如果我们想进一步研究它,我们可以通过运行以下命令来分析订单的分布和客户支付的金额:

我们可以看到,总共有四个客户,其中 customer_1 是完成订单最多( 18 )和消费金额最高( 1291.75 )的客户。请注意如何在 Python 中使用 DataFrame.groupby() 方法来实现与我们在 SQL 中通过查询末尾的列进行分组相同的结果。但是还有更多,因为这个方法也被用来复制典型的窗口函数的 over(partition by…) 子句,我们将在下面学习。

[## 排名上的 6 个 SQL 窗口函数编码问题——采访倒计时 P1

SQL 面试即将来临,您正在寻找一些具有挑战性的练习来测试您的准备情况?你是…

towardsdatascience.com](/6-sql-window-functions-coding-problems-on-ranking-interview-countdown-p1-9be0ccf66453)

Python 中的窗口函数

  1. 行号()→ Rank(method='first')

SQLRow Number()函数,为数据集分区内的每一行分配一个连续整数。它通常用于创建一个辅助列,根据指定的分区和顺序对字段进行排序。然后,该列可用于更有效地筛选或联接数据集。

假设我们希望根据订单日期按客户对订单进行排序,从最近的订单开始。为了在 SQL 中实现这一结果,我们可以编写:

**row number() over(partition by customer_id order by order_date)**

对于熊猫,同样的结果可以通过应用 来实现。rank(method = ' first ')函数对按订单日期筛选的 GroupBy 对象执行操作,以创建行号列:****

我们可以验证 customer_1 确实完成了 18 个订单,其中第一个订单发生在 2019–02–13(row num = 1),最后一个订单发生在 2020–04–25(row num = 18)。因为我们是按客户 ID 进行划分和排序的,一旦所有 18 个订单都被排序,该函数将开始对 customer_2 的订单进行排序:

问题 1: 如果我们想按降序(从最近到最早的顺序)分配行号会怎样?

这很简单,因为尽管代码中没有显示,pandas rank(method = …) 函数有一个 升序 参数,默认设置为 true 。通过将其设置为,我们将颠倒等级的分配方式:

****orders.groupby([‘Customer ID’])[‘Order Date’].rank(method=’first’, ascending = False)****

问题 2: 如果我们想按多列(如客户 ID 和订单月份)进行分区,该怎么办?

在这种情况下,我们只需要将首选字段添加到 GroupBy 对象中:

****#SQL Syntax
row number() over(partition by customer_id, order_month order by order_date)****#Python Syntax
orders.groupby([‘Customer ID’, 'Order Month'])[‘Order Date’].rank(method=’first')****

#2。Rank() → Rank(method='min')

SQL RANK() 函数,为结果集分区内的每一行分配一个等级。与 ROW NUMBER()不同,等级不是连续的,这意味着一个分区内共享相同值的行将获得相同的等级。使用与上面相同的示例,SQL 语法将是:

****rank() over(partition by customer_id order by order_date)****

而它在 Python 中的对应物是:

因为 customer_1 在 2019–02–21 执行了两个订单,这两个订单都被分配了 rank = 3,下面的订单被分配了 rank = 5,那么完全跳过 rank = 4。如果我们必须使用 SQL rank()窗口函数,这正是我们将得到的排名类型。

#3。dense _ Rank()→Rank(method = ' dense ')

如果我们想避免排名值的差距,我们应该使用 SQL dense_rank() 函数。实际上,与 rank() 函数不同,使用 dense_rank() 会返回连续的等级值。在我们的例子中,SQL 语法应该是:

****dense_rank() over(partition by customer_id order by order_date)****

而在 Python 中,我们只需要在 rank() 函数 : 中将 method='min' 替换为 method='dense'

不出所料, customer_1 于 2019_02_23 执行的订单现在已被分配 rank = 4 ,,尽管它是客户在分析期间的第 5 个订单。

总结一下我们到目前为止所学的内容:尽管在 SQL 中有 3 个不同的函数来计算数字数据的等级,但在 pandas 中,我们只需要使用 rank() 函数和方法(‘first’,【min’,【dense’)以及升序( TrueFalse )参数来获得想要的结果**

#4。Sum(…) over(partition by … order by..前面无界的行)→ cumsum()

我们现在希望计算每个月每个客户支付金额的累计金额,按订单日期排序。这种计算也被称为 运行总数 ,它可能是商业分析中最常用的指标之一。在 SQL 中实现这一点的一种方法是:**

*****sum(amount_paid) over(partition by customer_id, order_month order by order_date rows unbounded preceding)*****

上面的语法并不是最有效和最直观的:有相当多的代码要写,如果我们希望按 order_date 排序,我们还必须包括 rows… 子句来计算所选窗口中的累积和而不是总和。

这是 Python 因其简洁而大放异彩的情况之一,为了达到与上面相同的结果,我们只需要编写:

正如预期的那样, Run Tot ( ) 列显示每个客户在一个月内支付的金额()的累进总和,该行对应于该月内的最后一个订单,最终显示该客户在该月的总消费金额。****

#5。avg(…)over(partition by…)→transform(NP . mean)

以类似的方式,我们可能还希望计算每个客户每月花费的平均金额。这一次,SQL 语法非常直观:

*****avg(amount_paid) over(partition by customer_id, order_month)*****

然而,详细阐述 Python 解决方案是值得的:

我们之所以使用 pandasdata frame . transform()函数,是因为它允许我们在 GroupBy 对象上计算均值后,保持序列的长度等于原始数据集的长度。这种方法让我们得到了想要的结果:

数据集 2

在本教程的第二部分,我们将使用 yfinance 包从雅虎财经获取 AAPLAMZN 股票调整收盘价。我们应该已经在一开始就导入了它,但是如果不是这样,我们现在可以通过运行以下命令来完成:

*****!pip install yfinance # <-- to install the package
import yfinance as yf****aapl = yf.download(“AAPL”, start=”2020–04–20", end=”2020–04–30").resample(‘D’).ffill()****amzn = yf.download(“AMZN”, start=”2020–04–20", end=”2020–04–30").resample(‘D’).ffill()*****

使用上面的代码,我们还使用 yf.download() 方法为2020–04–202020–04–30期间创建了两个新数据集( aaplamzn )。为了将周末和节假日包括在内,数据被重新采样,缺失的股票价格被替换为之前最近的调整收盘价格观察值。对数据集进行了额外的操作(GitHub中提供了全部代码),这些数据集最终被合并到股票数据框架中:****

#6 超前/滞后(返回值,偏移)→移位(n)

使用股票数据集,我们现在希望计算 DoDWoW adj . Close Price % Change并通过保持数据帧长度不变来做到这一点,我们需要一个函数来访问当前行之前特定物理偏移量处的行。在 SQL 中,该窗口函数被命名为 lag() ,在我们的示例中,其语法如下:****

***#Retrieves the stock price located 1 row back from the current row
**lag(adj_close, 1) over(partition by symbol order by date)**#Retrieves the stock price located 7 rows back from the current row
**lag(adj_close, 7) over(partition by symbol order by date)*****

重要提示:因为我们已经对其进行了重新采样,我们的数据集现在有了每日粒度, 这意味着要获得昨天的股票价格,我们只需向后移动一行,而要获得上周同一天记录的股票价格,我们只需向后移动 7 行。如果我们把周末和假期排除在外,这些计算就不会这么简单了。**

在 Python 中,我们可以通过对 GroupBy 对象(按 符号 分组,并按 Adj. Close 过滤)应用 shift() 函数来创建 Lag1Lag7 列,从而获得相同的结果。注意,因为我们希望分别向后移动 1 行和 7 行(我们的数据集有一个降序),shift()函数将一个负整数 作为参数:****

我们可以看到, shift( n ) 函数已经正确地应用于每只股票,因此在第一个观察日期(2020–04–20),在没有先前价格的情况下,显示 NaN 值。同样,Lag7 列中显示的第一个有效值出现在第一个观察日期(2020–04–27)之后 7 天。

到目前为止,我们只是设法检索滞后的股票价格,而不是计算百分比变化。为了做到这一点,我们可以应用公式:

*****[(Adj Close / Lag1) - 1] x 100 <-- DoD % Change****[(Adj Close / Lag7) -1] x 100 <-- WoW % Change*****

或者使用pct _ change(n)函数来计算变动的股票价格,并返回它们的变化百分比:

为了简洁起见,在本教程中我们不会展示一个使用 lead() 函数的等价示例,但是很容易猜到唯一真正的变化是分配给 shift()pct_change() 函数的整数的符号。请记住,数据集的排序方式会影响应该传递给函数以获得预期结果的符号。

#7。第一个/最后一个值()→ rank(method ='first ',ascending = True/False) == 1

first value()last value()窗口函数用于在数据集的有序分区中检索第一行或最后一行的值。让我们假设我们想要找到AAPL 股票每月第一个和最后一个可获得的可调收盘价。我们将使用的修改后的 aapl 数据集的前 10 行如下所示:********

访问我的 GitHub 账户获取完整代码

我们处理 SQL 查询的方式是:

*******#The aapl dataset includes prices for one stock only, therefore the #partition is just applied on order_month****first value(adj_close) over(partition by order_month order by date)****last value(adj_close) over(partition by order_month order by date)*******

在 Python 中,并不存在与 first/last value() 完全相同的函数,但是可以通过使用 Pandasrank(method = ' first ')函数对分区中的值进行排序,然后只返回 rank = 1 的值,从而获得类似的结果。根据我们如何在 rank()函数中设置升序参数,rank = 1 的值将与分区中的第一个或最后一个值匹配。****

尽管不是特别有挑战性,但这个过程还是有点麻烦,因为我们最终需要回填或前填整个分区的第一个或最后一个值,以获得想要的结果:

2020–03–162020–04–14期间有效,三月份 AAPL 的第一个(或最近的)可用调整收盘价为 242.2 美元(排名 Asc = 1 ),最后一个(或最近的)为 254.3 美元(排名 Desc = 1 )。类似地,在 4 月,AAPL 的第一个可用的 Adj. Close 价格是 240.9 美元,最后一个是 287 美元。

#8。Avg(…) over(partition by … order by..前 n 行和当前行之间的行)→滚动(window = …)。平均值()

我们在本教程中要复制的最后一个窗口函数是一个移动平均值。移动平均线是更一般函数的特例:****

*******avg(return_value) over()*******

至于在 SQL 中计算它,我们需要声明一个 rows … 子句(就像我们对运行总数所做的那样)。例如,如果我们想用 SQL ( 假设数据集按升序排列)计算 AAPL 调整收盘价的 7 天移动平均值,我们应该写:

*******avg(adj_close) over(order by date rows between 6 preceding and current row)*******

rows … 子句中,我们简单地说明了我们希望在计算平均值时包括最近的观察值,因此我们只需要前面的 6 条记录就可以得到 7 天的窗口。对于更有经验的分析师来说,这些概念可能看起来微不足道,但是在新手中可能会引起混乱。

幸运的是,用熊猫计算移动平均数是一件真正令人愉快的事情,因为我们只需要创建一个滚动对象(指定所需的 窗口 ),然后对其应用 mean() 函数。或者,我们也不妨计算一下 ,这本身就是移动平均线的一个特例:****

实际上,这两个指标的区别在于当我们对滚动的对象应用函数时,窗口大小保持不变,而对于扩展的对象,窗口保持增长。使用扩展窗口背后的逻辑是,随着每一天的过去,我们都会观察到一个新的价格,可以添加到我们的均值计算中。这是我们希望包含在计算指标中的新信息。****

结论

在这篇文章中,我们学习了如何使用 Pandas 在 Python 中复制 8 个流行的 SQL 窗口函数。如果您正在从事分析工作,那么您现在应该已经准备好使用 SQL 或 Python 来构建 KPI 以监控性能。在这两种语言中,当然有多种方法可以达到相同的效果,因此请在回复部分分享您的经验。希望你喜欢这篇教程,并期待下一篇!

我的读者请注意

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

您可能还喜欢:

***** [## 在你开始第一个项目之前,要掌握 15 个 Git 命令

您需要掌握的最后一个 Git 教程是命令行版本控制。

levelup.gitconnected.com](https://levelup.gitconnected.com/15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9) [## 使用 Python 连接到数据库时使用环境变量隐藏密钥:简要教程

环境变量可用于在连接到数据库时隐藏您的秘密细节。了解如何在这个快速…

medium.com](https://medium.com/@anbento4/connect-to-databases-using-python-and-hide-secret-keys-with-env-variables-a-brief-tutorial-4f68e33a6dc6)*****

数据科学家不应错过的 8 个 Python 迭代技巧

原文:https://towardsdatascience.com/8-python-iteration-skills-that-data-scientists-shouldnt-miss-out-6b57fb35e00f?source=collection_archive---------19-----------------------

您想知道的常见有用迭代技巧的回顾

弗拉德·沙波奇尼科夫在 Unsplash 上拍摄的照片

我们的程序做的一个主要的自动操作是为我们重复特定的任务。这通常使用 for 循环来实现,其最基本的形式如下:

for item in iterable:
    # Your tasks go here

理论上,我们可以利用基本形式来解决所有与迭代相关的需求,但是在许多情况下,如果我们利用 Python 提供的现有功能,我们的代码会变得更加简洁。在本文中,我想回顾一下我们在进行数据科学项目时应该考虑的 8 种有用的技术。

为了说明这些技术的有用性,我将它们与只使用最基本形式的代码进行对比。从这些比较中,您可以看到代码可读性的显著提高。

1.使用 enumerate()跟踪迭代

假设我们需要跟踪迭代的计数。换句话说,我们想知道我们已经迭代了多少次循环。在这种情况下,我们应该考虑enumerate()函数。

使用枚举()

  • 要获得序列中项目的索引,基本方法包括创建一个 range 对象,因为典型方法(即for item in iterable)没有与索引相关的信息。尽管我们可以使用带有列表的index()方法来查找索引,但默认情况下,它会返回第一个找到的元素的索引。因此,当有重复的项目时,它会给出非预期的信息。
  • enumerate()函数创建一个枚举对象作为迭代器。它可以带一个可选参数start,指定计数器的开始。默认情况下,它从 0 开始计数。在我们的例子中,我们从 1 开始计算第一个渲染元素。如你所见,enumerate()函数直接给出了计数器和元素。

2.将 Iterables 与 zip()配对

当我们有几个可重复项,并且需要从这些可重复项的相同位置检索项目时,我们应该考虑zip()函数,如本例所示。

使用 zip()

  • 为了获得相同索引处的元素,我们使用range()函数创建索引,就像我们在上一节中所做的那样。使用索引从每个 iterable 中检索元素有点乏味。
  • zip()函数可以连接多个 iterable,并且在每个循环中,它产生一个 tuple 对象,该对象包含来自相同索引处的每个 iterable 的元素。我们可以解包元组对象来非常方便地检索元素。代码看起来干净多了,不是吗?
  • 另一件需要注意的事情是,zip()函数将压缩匹配其中最短可迭代对象的可迭代对象。如果你想让压缩匹配最长的可重复项,你应该使用 itertools 库中的zip_longest()函数。

3.使用 reversed()进行反向迭代

当需要以逆序迭代一系列元素时,最好使用reversed()函数。假设学生在稍微不同的时间到达教室,您想使用相反的顺序检查他们的作业,即第一个到达的学生最后被检查。

使用反转()

  • 如果您坚持使用range()函数,您将使用序列的反向索引。换句话说,我们用-1 来表示列表的最后一项,依此类推。
  • 或者,我们可以使用[::-1]反转列表,然后迭代新创建的列表对象。
  • 最好的方法就是简单地使用reversed()函数。这是一个非常灵活的函数,因为它可以接受其他序列数据,如元组和字符串。

4.带过滤器的过滤器元件()

您不需要总是使用 iterable 中的所有项目。在这些情况下,我们通常可以在应用所需的操作之前检查项目是否满足特定的标准。这样的条件评估和所需迭代器的创建可以很容易地集成到一个函数调用中— filter()。让我们来看看它是如何与典型的方式进行比较的。

使用过滤器()

  • 典型的方法包括评估每个元素。
  • filter()函数将计算元素,同时将元素呈现为迭代器。换句话说,该函数返回一个迭代器,这样就可以在 for 循环中使用它。
  • 根据您的需要,您可以考虑其他过滤函数,例如 itertools 库中的filterfalse(),它执行相反的操作(即保留那些评估False的函数)。

5.Chain Iterables 与 Chain()

在上一节中,我们已经讨论了如何使用zip()函数处理多个可重复项,对于这一点,您可以认为我们在垂直方向上连接了可重复项。如果想首尾相连,应该使用 itertools 库中的chain()函数。具体来说,假设您有多个可迭代对象,您想要依次迭代它们中的每一个,这是chain()函数的最佳用例。

使用链条()

  • 典型的方法是手动连接 iterables,比如使用一个中间列表。如果你使用其他的可重复项,比如字典和集合,你需要知道如何连接它们。
  • chain()函数可以链接任意数量的可迭代对象,并生成另一个迭代器,从每个可迭代对象中顺序产生元素。您不需要管理保存这些元素的另一个临时对象。

6.迭代字典

字典是一种非常常见的数据类型,它以键值对的形式存储数据。因为使用散列实现,所以从字典中查找和检索条目非常快,因此它们是许多开发人员最喜欢的数据结构。键值对的存储为我们迭代字典提供了不同的选择。

迭代字典

  • 要迭代这些键,我们只需在 dictionary 对象上使用keys()方法。或者,我们可以只使用 dictionary 对象本身作为 iterable,这只是由keys()方法创建的 view 对象的语法糖。
  • 为了迭代这些值,我们将只使用values()方法。
  • 为了以键值对的形式迭代条目,我们将使用items()方法。
  • 值得注意的是,这些方法创建的对象是字典视图对象,这与 SQL 视图非常相似。换句话说,当 dict 对象被更新时,这些视图对象也会被更新,下面显示了一个简单的例子。

字典视图对象

7.将理解视为选择

如果迭代的目的是从 iterable 中创建一个新的 listdictionaryset object,我们应该考虑理解技术,它更具性能,也更简洁。

(听力或阅读)理解测试

  • 列表理解具有以下格式:[expr for item in iterable],与 for 循环相比,这是创建列表对象的首选方式。
  • 字典理解有以下格式:{key_expr: value_expr for item in iterable}。类似地,这是从可迭代对象创建一个字典对象的首选方式。
  • 集合理解具有以下格式:{expr for item in iterable},这是从 iterable 创建集合对象的首选方式,与 for 循环相比。

8.考虑 else 子句

最后但同样重要的是,要考虑在 for 循环中使用 else 子句。应该注意的是,这并不是最直观的技术,因为许多人甚至不知道 for 循环中的 else 子句的存在。下面的案例向您展示了一个微不足道的例子。

For 循环中的 Else 子句

与一些人的错误想法不同,在常规情况下, else 子句中的代码将遵循 for 循环运行。但是,如果执行中遇到任何break语句,将会跳过 else 子句中的代码。如第一个函数调用所示,没有执行 else 子句。

结论

在本文中,我们回顾了除了 for 循环的基本形式之外,我们可以考虑在 for 循环中使用的八种技术。应用这些技术可以让你的代码更加简洁,性能更好。

感谢你阅读这篇文章。

防止过度拟合的 8 个简单技巧

原文:https://towardsdatascience.com/8-simple-techniques-to-prevent-overfitting-4d443da2ef7d?source=collection_archive---------5-----------------------

当模型对训练数据表现良好,但对看不见的数据概括较差时,就会发生过度拟合。过拟合是机器学习中非常普遍的问题,并且已经有大量的文献致力于研究防止过拟合的方法。在下文中,我将描述八种简单的方法,通过在每种方法中只引入一种对数据、模型或学习算法的改变来减轻过度拟合。

目录

1。坚守
2。交叉验证
3。数据扩充
4。特征选择
5。L1 / L2 正规化
6。移除层数/每层单元数
7。辍学
8。提前停止

1.拒绝(数据)

我们可以简单地将数据集分成两组:训练和测试,而不是使用所有的数据进行训练。常见的拆分比例是 80%用于培训,20%用于测试。我们训练我们的模型,直到它不仅在训练集上表现良好,而且在测试集上也表现良好。这表明了良好的泛化能力,因为测试集表示未用于训练的看不见的数据。然而,这种方法需要足够大的数据集来训练,即使在分割之后。

2.交叉验证(数据)

我们可以将数据集分成 k 个组(k 重交叉验证)。我们让其中一个组作为测试集(请参见保留说明),其他组作为训练集,重复这个过程,直到每个单独的组都被用作测试集(例如, k 重复)。与保留不同,交叉验证允许所有数据最终用于训练,但在计算上也比保留更昂贵。

3.数据扩充(数据)

更大的数据集将减少过度拟合。如果我们无法收集更多数据,并且受限于当前数据集中的数据,我们可以应用数据扩充来人为增加数据集的大小。例如,如果我们正在为图像分类任务进行训练,我们可以对我们的图像数据集执行各种图像变换(例如,翻转、旋转、重新缩放、移位)。

4.特征选择(数据)

如果我们只有有限数量的训练样本,每个样本都有大量的特征,我们应该只选择最重要的特征进行训练,这样我们的模型就不需要学习这么多的特征,最终会过度拟合。我们可以简单地测试不同的特征,为这些特征训练单独的模型,并评估泛化能力,或者使用各种广泛使用的特征选择方法之一。

5.L1 / L2 正则化(学习算法)

正则化是一种技术,用于限制我们的网络学习过于复杂的模型,这可能因此而过度拟合。在 L1 或 L2 正则化中,我们可以在成本函数上添加惩罚项,以将估计的系数推向零(并且不取更多的极值)。L2 正则化允许权重向零衰减,但不衰减到零,而 L1 正则化允许权重衰减到零。

6.移除层数/每层的单位数(模型)

正如在 L1 或 L2 正则化中提到的,一个过于复杂的模型更有可能过度拟合。因此,我们可以通过删除层来直接降低模型的复杂性,并减小模型的大小。我们可以通过减少全连接层中神经元的数量来进一步降低复杂性。对于我们的任务,我们应该有一个复杂的模型来充分平衡欠适应和过适应。

7.辍学(模型)

通过对我们的层应用 dropout(一种正则化形式),我们以设定的概率忽略了网络单元的子集。使用 dropout,我们可以减少单元之间的相互依赖学习,这可能会导致过度适应。然而,对于 dropout,我们需要更多的纪元来使我们的模型收敛。

8.提前停止(模型)

我们可以首先为任意大量的时期训练我们的模型,并绘制验证损失图(例如,使用排除)。一旦验证损失开始降低(例如,停止降低而是开始增加),我们停止训练并保存当前模型。我们可以通过监控损失图或设置早期停止触发器来实现这一点。所保存的模型将是在不同训练时期值之间进行概括的最佳模型。

您已经到达文章末尾!希望你现在有一个工具箱的方法来对抗过度适应⚔️.

为你完成这篇文章向你致敬,我希望你喜欢它🎩。如果你对更多与 ML 相关的话题感兴趣,也可以查看一些由 Tim :)撰写的有趣文章。

订阅?🙂

更好的数据可视化的 8 个技巧

原文:https://towardsdatascience.com/8-tips-for-better-data-visualization-2f7118e8a9f4?source=collection_archive---------10-----------------------

照片由爱德华·豪威尔在 Unsplash 拍摄

改善你的地图的实用建议

G gplot 是 R 的首要数据可视化包。它的流行可能归因于它的易用性——只需几行代码,您就能制作出非常棒的可视化效果。这对于刚刚开始 R 之旅的初学者来说尤其重要,因为只用两行代码就可以创建可视化的东西,这非常令人鼓舞:

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point()

上述代码的输出

在本文中,我想强调 ggplot 的灵活性和可定制性。Matplotlib 和 Seaborn(都是 Python)和 Excel 等替代品也很好用,但是可定制性较差。在这篇文章中,我将通过 8 个具体步骤来改善你的 ggplot。

为了确保本文中的建议切实可行,我将遵循两个主题:

  1. 假设读者对 ggplot 有所了解:如果你理解了上面的代码,你应该会很好。如果您不熟悉 ggplot,我将尽量使这些提示与语言无关,因此如果您使用 base R、Python 或其他可视化工具,这些提示可能仍然有用。
  2. 易于理解:如果您想自己运行示例代码,您所需要的只是 R 和 tidyverse。不需要外部数据集,因为我们将使用 ggplot 中包含的diamonds数据集。

来源:https://ggplot2.tidyverse.org/reference/diamonds.html

1.主题是你最好的朋友

主题控制所有非数据显示,是改变图形外观的一种简单方法。为了做到这一点,只需要一行额外的代码,ggplot 已经有了 8 个独立的主题。

ggplot(data = diamonds, aes(x = Sepal.Width, y = Sepal.Length)) + 
  geom_point() + 
 **theme_bw()**

ggplot 主题很简单。它们不会真的突出,但是它们看起来很棒,容易阅读,并且能表达重点。同样,如果你想反复使用同一个主题,你可以用一行代码设置一个全局主题,它将适用于所有的 ggplots。

# Set global themetheme_set(theme_bw())

关于 8 个主题的全部细节,你可以访问 这个链接

ggplot 主题,比较

主题也是超级可定制的。除了 ggplot 自带的 8 个主题,你还可以制作自己的主题,但更重要的是使用其他人已经创建的主题。在我工作过的几个公司里,我们都有内部的 ggplot 主题。例如,我在脸书公司帮助设计了theme_fb(),公司的设计师为它提供了意见。

如果你想在 ggplot 之外使用一些其他的主题,最流行的包是 ggthemes,它有一些有趣的选项,比如theme_fivethirtyeight(), theme_wsj(), and theme_economist()。下面是这些主题的一个例子,但是我绝对推荐查看 这个链接 来了解更多。

ggthemes,比较

2.刻面是一种超能力

在可视化数据时,您总是要考虑的一件事是您想要显示多少维度的数据。大多数图表通常只需要 1-2 维的数据就可以得到一个点,例如:

  • 散点图上篮球运动员的身高 x 体重
  • 柱状图上洛杉矶湖人队球员的身高

随着维度数量的增加,一张图会变得更加混乱,这使得一个点更难被理解。例如:

  • 散点图上篮球运动员的身高 x 体重,但是 30 支球队中的每支球队都有不同的颜色点。这将很难阅读,因为您需要 30 种不同的颜色来代表不同的团队,以及一个列出所有团队名称的图例。

这就是刻面的魅力所在。如果我们不必局限于一个图会怎么样?我的假设是,为什么我们中的许多人会有这种想法,是因为我们习惯于在 Excel 中可视化数据,我们被限制在一个单一的图表中。在 ggplot 中,我们可以打破这种思维模式,只需要一行代码就可以做到。刻面使我们能够轻松地在可视化中添加两个额外的维度。

让我们探索如何使用刻面来可视化钻石数据。

基本上,我们可以查看钻石的克拉数与其价格之间的关系,这是本数据集的主要目的:

ex2 <- 
  diamonds %>%
  sample_n(5000) %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point()ex2

这张图只显示了两个维度的数据,但还有一些其他的数据也很重要。钻石的切割、颜色和净度——所有这些都可能与钻石的价格有关。引入这些维度的一个方法是让点有不同的颜色或者使用不同的点形状,但是让我们试试刻面。

如果您只想通过单一尺寸分解图形,请使用facet _ wrap():

ex2 +
  **facet_wrap(~cut)**

如果您想通过二维分解图形,请使用facet _ grid():

ex2 +
  **facet_grid(color~cut)**

这只是如何使用facet_wrap()facet_grid()的两个例子,但是从这一节中得到的关键是,使用 ggplot,您不会局限于在单个图形中考虑可视化。

3.颜色!

颜色在数据可视化中有两个主要用途:

  1. 使可视化更有吸引力
  2. 表示数据的另一个维度

有很多方法可以给你的 gg 图上色,但是为了简单起见,这一节主要介绍绿色调色板,这是我个人最喜欢的颜色,因为它们是:

  • 丰富多彩:跨越尽可能宽的调色板,使差异显而易见
  • 感知一致:表示彼此接近的值具有相似的外观颜色,而彼此远离的值具有更多不同的外观颜色,在整个值范围内保持一致
  • 对色盲具有鲁棒性:因此上述特性适用于患有常见色盲的人,也适用于灰度打印

来源:https://cran . r-project . org/web/packages/viridis/vignettes/intro-to-viridis . html

你可以在这里 阅读更多关于上面 颜色背后的理论,但是这一节主要讲的是允许你使用这些颜色的 4 个关键功能:

  • scale_color_viridis_d() & scale_fill_viridis_d():将此语句添加到您的 ggplot,以便在离散/分类变量上着色/填充您的图形。(注意功能末尾的“d”)
  • scale_color_viridis_c() & scale_fill_viridis_c():将此语句添加到您的 ggplot 中,以便在连续变量上着色/填充您的图形。(注意功能末尾的“c”)
# Discrete
ggplot(data = diamonds %>% sample_n(1e3), 
         aes(x = carat, y = price,
             color = cut)) + 
  geom_point() +
 **scale_color_viridis_d()**

# Continuous
ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price,
           color = depth)) + 
  geom_point() +
 **scale_color_viridis_c(option = 'A')**

Protip: 这里,我使用option参数来改变 viridis 中的调色板。您可以在选项 A-E 之间切换,这些选项反映了上面的不同配色方案。

4.颜色与填充:了解区别

我在上一节中介绍了这一点,但我想更明确地解决它,因为当您第一次使用 ggplot 时,它可能会令人困惑。要给 ggplot 着色,您可以使用colorfill,这取决于图形类型。

那么有什么区别呢? 一般来说,fill定义了一个几何体填充(即geom_bar())的颜色,而颜色定义了一个几何体勾勒(即geom_point())的颜色。**

**ggplot(data = diamonds, aes(x = price)) +
  geom_histogram(color = 'blue',
                 fill = 'red')**

因此,这里的要点是,如果你试图给一个图形着色,但看起来没有任何变化,只需将color切换到fill,反之亦然。

阅读更多关于 StackOverflow.)

5.给它贴上标签

好的可视化有简洁和描述性的标签。它们帮助读者理解他们所看到的,如果你希望你的视觉化图像被分享,这尤其重要。幸运的是,它在 ggplot 中非常容易标记。

****以下是 ggplot 最有用的标签功能,按使用频率列出。您可以挑选想要使用的标签,例如,如果您只想添加标题,您只需在labs()中输入标题参数。

**ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point() +
 **labs(title = 'title example',
       x = 'x-axis example',
       y = 'y-axis example',
       color = 'color example',
       subtitle = 'subtitle example',
       caption = 'caption example',
       tag = 'tag example')****

注: 只有当您的 ggplot 中有一种颜色作为美感时,才可以访问色域。无论你使用填充、颜色、大小、alpha 等等,这种标记方法都是有效的。

6.线条注释

在用你的视觉化来讲述一个故事的主题上,线条注释是一个非常有用的工具。我个人用过的一些例子包括:

  • 在线图中标记前/后时段
  • 在散点图上绘制 x 或 y 值的平均值
  • 注释我们想要达到的目标度量

无论什么用例,拥有一个线注释都有助于向那些将查看您的可视化的人传达一个重要的观点。要在 ggplot 中添加一条线,您可以使用:

  • geom_hline(): 添加一条水平线(有 y 截距)
  • geom_vline(): 添加一条垂直线(有一个 x 截距)

下面的例子将展示这两者的作用:

**ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point() +
 **geom_hline(data = . %>% summarise(y = mean(price)),
             aes(yintercept = y)) +
  geom_vline(data = . %>% summarise(x = mean(carat)),
             aes(xintercept = x))****

请注意,上面的代码看起来可能比本文中的其他一些 ggplot 代码要复杂一些。我会试着解释那里发生了什么。为了得到平均克拉数和价格,一个更直接的方法是在你的 ggplot 代码之前计算它们。然而,因为我很懒,喜欢减少变量的数量,所以我将数据(diamonds %>% sample_n(1e3))直接传输到geom_line()语句中,这样也能很好地工作。

7.文本注释

除了线条之外,在图表中添加一些数据标签也是很有用的。然而,只有当你的数据标签易于阅读时,它才有用。例如,如果您盲目地应用文本 geom,您最终会得到一个非常难看的图形:

**p <- 
  ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point()p + 
 **geom_text(aes(label = price))****

这很糟糕

在这一部分,我将谈谈有效使用geom_text()的三个关键技巧。

  1. ****过滤显示哪些标签:你可以发挥创意,但这样做的目的是只显示相关的数据标签。在下面的例子中,我只想显示高克拉钻石的价格:
**p + 
 **geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price))****

请注意,现在更容易阅读了,只显示了几个价格

2。hjust + vjust

在上面的图中,你会看到文本完全覆盖了点,看起来很丑。您可以通过在 geom_text()内对齐文本来轻松解决此问题。我认为这类似于微软 Word 中的左右对齐。

通常,vjust 和 hjust 的范围是从[0,1]开始,但它也接受负值和大于 1 的值(它只会在指定的方向上进一步移动标签)。下图显示了如何根据 hjust 和 vjust 值对齐文本:

**p + 
  geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price),
           ** hjust = 0,
            vjust = 0)****

3。颜色

这更多的是一种偏好,但是要知道你可以改变文本的颜色。你通常希望你的文本尽可能与背景形成对比,因为这样最容易辨认。如果您有一些较浅的颜色(如黄色)可能难以阅读,这一点很重要:

**p + 
  geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price),
            hjust = 0,
            vjust = 0,
          **  color = 'black')****

**# Another example where we add contrastdiamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = clarity, y = price)) +
  geom_bar(stat = 'identity') +
  geom_text(aes(label = round(price, 2)),
            vjust = 1.25,
           ** color = 'white')****

8.秩序,秩序,秩序!

最后,对图表进行排序可以使其更容易阅读,这对于条形图尤其有用。你所要做的就是在 x 值上使用fct_reorder(),这样它就按照 y 值排序了:

**# By default, ggplot will order by the x valuediamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = clarity, y = price)) +
  geom_bar(stat = 'identity')**

**# Reordered:diamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = **fct_reorder(clarity, price)**, y = price)) +
  geom_bar(stat = 'identity')**

总结想法

我很难决定我想在这篇文章中涵盖哪些不同的主题。我最终专注于最初令我困惑的主题,我希望我在刚开始学习 ggplot 时能理解更多。希望这篇文章能给你一些关于如何改进可视化的具体想法,或者揭开 ggplot 一些更令人困惑/隐藏的方面。

初级数据分析师的 8 个技巧

原文:https://towardsdatascience.com/8-tips-for-the-junior-data-analyst-afdaea0eb91f?source=collection_archive---------60-----------------------

办公时间

祝贺你!你最近获得了第一份数据分析师的工作!作为一名过去几年的数据分析师,在您开始新的分析师职业生涯时,我想与您分享一些技巧。

由活动创作者在 Unsplash 上拍摄的照片

1)充分了解客户的需求

当你收到客户的请求时,无论是新的报告/具体的分析/项目,都要理解为什么客户会有这样的请求。他到底在寻找什么?了解更大的图片。如果需要,不要不好意思问很多问题,直到你完全理解为止。准确理解他的需求是你工作的一大部分。通过理解工作的价值,它还会帮助你感受到更多与工作的联系。

2)有时你最清楚,提供替代方案

你的顾客可能认为他知道自己需要/想要什么,但有时你最清楚。问一些尖锐的问题,你需要这个做什么?你真的需要这个吗?你确切了解了他需要什么之后,想想替代方案。有没有一个现有的解决方案可以让你适度满足他的需求?技术上的最佳解决方案是什么?提供你认为最好的解决方案。

3)始终尝试自动化您的流程

分析师的部分工作有时包括“繁重的工作”,大量的复制和粘贴 excel 等。然而,在某些情况下,您可以选择来使流程更加自动化。总是寻找更好的自动解决方案。例如——不要在 excel 中做很多你下次无法复制的动作,试着把它放在一个查询表单中。试着从大处着眼——整个数据处理运行不顺畅怎么办?有哪些可以改进的地方

4)“保存您的查询”

尽可能做好记录。总是认为同样的问题会在几周后出现。您会希望轻松访问您所做的事情。例如-在 excel 中添加一个 SQL 表。在长查询中添加注释。甚至你发的邮件——写得非常清楚。添加一个额外的句子,只是为了适当地记录,这样当你或另一个人读回来的时候,就会很清楚了。

5)思考你的下一步职业发展

你不能也不应该确切知道你的职业道路会把你引向何方。最好的还在前面。但是重要的是与你内心的自我和想法联系起来。不要让时间白白流逝。思考你的下一步行动并不是一件容易的事情,但尽管如此,试着想象一下你在未来几年里想在的什么地方。你想去哪里?更技术性?更多的生意?你觉得哪个职位有意思?你喜欢你工作中的什么?你错过了什么?

6)记录你从事的有趣的事情

你在做一些有趣的项目吗?记录下来!可以在 LinkedIn,Medium 或者私人博客上。你还可以制作一个幻灯片,展示给其他可能感兴趣的团队成员。试着想一想,这对其他人来说是否也有价值?也许公司里的其他人也能从中受益?努力让你的工作创造出最大的内部和外部效益

7)了解您的技术前景

除了熟悉你公司使用的软件 ETL、仓库和报告软件,还要彻底理解技术前景。这些选定工具的竞争对手是谁?你的公司为什么选择这些特别的软件?它们的利弊是什么?

信用:blog.aimultiple.com

8)努力让你的工作充满你喜欢的任务

“数据分析师”可能意味着很多不同的东西,这取决于你的公司、它的技术前景和你的特定角色定义。有些角色技术性更强,甚至接近于数据工程师,而有些则更面向产品或业务。虽然你的公司可能已经定义了你的角色,但是你可以自由地改变你的工作定义。你对哪些方面感兴趣?你对商业方面的事情感兴趣吗?靠上去。你喜欢教书吗?靠上去。你的公司只有在你提出新的想法和项目,并在这个过程中利用你最好的技能时才会受益。

分析师可以成为非常有价值的关键人物。如果这是你想要的,那就看你了。或者,您的工作可以简化为更技术性的工作,只是反复运行一些查询。那些成功到达顶端的人,和你我没有什么不同,他们只是想要并被推着到达那里。

值得了解的 8 种有用的树数据结构

原文:https://towardsdatascience.com/8-useful-tree-data-structures-worth-knowing-8532c7231e8c?source=collection_archive---------3-----------------------

8 种不同树形数据结构的概述

当你想到一棵树时,你会想到什么?根、枝、叶?你可能会想到一棵有根、有枝、有叶的大橡树。同样,在计算机科学中,树形数据结构有根,有枝,有叶,但是画倒了。树是一种分层数据结构,可以表示不同节点之间的关系。在本文中,我将简要介绍 8 种类型的树数据结构。

树的属性

  • 一个树可以不包含任何节点,也可以包含一个称为根的特殊节点,根有零个或多个子树。
  • 树的每条边都直接或间接地起源于根。
  • 每个孩子只有一个父母,但一个父母可以有很多孩子。

图一。树木术语

在本文中,我将简要解释以下 10 种树数据结构及其用法。

  1. 通用树
  2. 二叉树
  3. 二叉查找树
  4. AVL 树
  5. 红黑树
  6. 八字树
  7. Treap
  8. B 树

1.通用树

一个通用树是一个树形数据结构,其中没有对层次结构的约束。

性能

  1. 遵循树的属性。
  2. 一个节点可以有任意数量的子节点。

图二。通用树

使用

  1. 用于存储分层数据,如文件夹结构。

1.二叉树

一个二叉树是一个树形数据结构,其中可以找到以下属性。

性能

  1. 遵循树的属性。
  2. 一个节点最多可以有两个子节点(子节点)。
  3. 这两个子节点被称为 左子节点右子节点

图三。二叉树

使用

  1. 由编译器用来构建语法树。
  2. 用于实现表达式解析器和表达式求解器。
  3. 用于存储路由器中的路由表。

3.二叉查找树

二叉查找树是二叉树的一个更严格的扩展。

性能

  1. 遵循二叉树的属性。
  2. 有一个独特的属性叫做二叉搜索树属性。该属性声明给定节点的左子节点的值(或键)应该小于或等于父节点的值,右子节点的值应该大于或等于父节点的值。

图 4。二叉查找树

使用

  1. 用于实现简单的排序算法。
  2. 可以用作优先级队列。
  3. 在许多数据不断进出的搜索应用程序中使用。

4.AVL 树

AVL 树是一种自平衡二叉查找树。这是第一棵自动平衡高度的树。

性能

  1. 遵循二分搜索法树的属性。
  2. 自我平衡。
  3. 每个节点存储一个名为平衡因子的值,该值是其左侧子树和右侧子树之间的高度差。
  4. 所有节点的平衡系数必须为-1、0 或 1。

在执行插入或删除之后,如果至少有一个节点不具有-1、0 或 1 的平衡因子,则应该执行旋转来平衡树(自平衡)。你可以从 这里 阅读我之前文章中关于旋转操作的更多内容。

图五。AVL 树

使用

  1. 用于需要频繁插入的情况。
  2. 在 Linux 内核的内存管理子系统中使用,用于在抢占期间搜索进程的内存区域。

5.红黑树

红黑树是一个自我平衡的二叉查找树,每个节点都有一种颜色;红色或黑色。节点的颜色用于确保树在插入和删除过程中保持近似平衡。

性能

  1. 遵循二分搜索法树的属性。
  2. 自我平衡。
  3. 每个节点不是红色就是黑色。
  4. 根是黑色的(有时省略)。
  5. 所有的叶子(标记为 NIL)都是黑色的。
  6. 如果一个节点是红色的,那么它的两个子节点都是黑色的。
  7. 从给定节点到它的任何叶节点的每条路径必须经过相同数量的黑节点。

图六。AVL 树

使用

  1. 作为计算几何中使用的数据结构的基础。
  2. 用于当前 Linux 内核中使用的完全公平调度器
  3. 用于 Linux 内核的 epoll 系统调用实现。

6.八字树

八字形采油树是一种自平衡二叉查找树。

性能

  1. 遵循二分搜索法树的属性。
  2. 自我平衡。
  3. 最近访问过的元素可以快速地再次访问。

在执行搜索、插入或删除后,张开树执行一个称为张开的动作,其中树被重新排列(使用旋转),使得特定元素被放置在树的根部。

图 7。显示树搜索

使用

  1. 用于实现缓存
  2. 用于垃圾收集器。
  3. 用于数据压缩

7.Treap

一个树堆(这个名字来源于树+堆)就是一个二叉查找树。

性能

  1. 每个节点有两个值;一个和一个优先级
  2. 这些键遵循二进制搜索树属性。
  3. 优先级(随机值)遵循堆属性。

图 8。Treap(红色字母键遵循 BST 属性,蓝色数值遵循最大堆顺序)

使用

  1. 用于维护公钥密码系统中的授权证书。
  2. 可用于执行快速设置操作。

8.B 树

b 树是一个自平衡搜索树,它包含多个节点,这些节点按照排序的顺序保存数据。每个节点有 2 个或更多的子节点,并由多个键组成。

性能

  1. 每个节点 x 都有以下内容:

— x.n(键的数量)

— x.keyᵢ(以升序存储的密钥)

— x.leaf(无论 x 是否为叶子)

2.每个节点 x 都有(x.n + 1)个子节点。

3.键 x.keyᵢ分隔每个子树中存储的键的范围。

4.所有的树叶都有相同的深度,也就是树高。

5.节点对可以存储的键的数量有上限和下限。这里我们考虑一个值 t≥2,称为 B 树的最小度(或分支因子)。

—根必须至少有一个键。

—每个其他节点必须至少有(t-1)个键,最多有(2t-1)个键。因此,每个节点将至少有 t 个子节点,最多有 2t 个子节点。如果节点有(2t-1)个键,我们说它是满的

图九。B 树

使用

  1. 用于数据库索引,以加快搜索速度。
  2. 在文件系统中用来实现目录。

最后的想法

数据结构操作的时间复杂性的备忘单可以在这个链接中找到。

我希望作为对树结构的简单介绍,这篇文章对您有用。我很想听听你的想法。😇

请继续关注关于更多数据结构的后续文章。如果你没有读过我以前写的关于数据结构的文章,可以通过下面的链接来看看。

[## 每个程序员都必须知道的 8 种常见数据结构

数据结构是一种在计算机中组织和存储数据的专门方法,以这种方式我们可以执行…

towardsdatascience.com](/8-common-data-structures-every-programmer-must-know-171acf6a1a42) [## 自平衡二分搜索法树 101

自平衡二分搜索法树简介

towardsdatascience.com](/self-balancing-binary-search-trees-101-fc4f51199e1d)

非常感谢你的阅读!

干杯!😃

参考

[1]《算法导论》(第三版),作者:Thomas H. Cormen、Charles E. Leiserson、Ronald L. Livest 和 Clifford Stein。

https://en.wikipedia.org/wiki/List_of_data_structures

80 个 Python 面试练习题

原文:https://towardsdatascience.com/80-python-interview-practice-questions-f1640eea66ac?source=collection_archive---------2-----------------------

来自许多来源的 Python 问答集

麦克斯韦·尼尔森在 T2 的照片

许多数据爱好者开始用 Python 编程语言学习他们的数据科学之旅。为什么是 Python?因为它很容易理解,而且现在许多公司都在使用 Python 编程语言。此外,Python 是一种多用途语言,不仅仅是数据科学家专用的;人们也将 Python 用于开发目的。

当你申请一个数据科学家的职位时,许多公司会需要你参加一个具有 Python 知识的工作面试。在这种情况下,我试图概述我从许多来源和我自己的来源收集的 Python 面试问题。我试着选择最有可能被问到的问题,以及知道什么是重要的。他们来了。

1。Python 是什么?

Python 是一种具有对象、模块、线程、异常和自动内存管理的编程语言。Python 被设计成具有高度可读性。它经常使用英语关键字,而其他语言使用标点符号,并且它的语法结构比其他语言少。

2。使用 Python 有什么好处?

pythons 的好处在于它是简单易用、可移植、可扩展的内置数据结构,并且是开源的。

3。Python 是怎样一种解释型语言?

解释语言是在运行前不在机器代码中的任何编程语言。因此,Python 是一种解释型语言。

4。Python 是如何解读的?

Python 语言是一种解释型语言。Python 程序直接从源代码运行。它将程序员编写的源代码转换成中间语言,中间语言又被翻译成必须执行的机器语言。

5。Python 中是如何管理内存的?

  • Python 中的内存由 Python 私有堆空间管理。所有 Python 对象和数据结构都位于私有堆中。这个私有堆由 Python 解释器自己负责,程序员无权访问这个私有堆。
  • Python 内存管理器负责 Python 私有堆空间的分配。
  • Python 私有堆空间的内存由 Python 内置的垃圾收集器提供,垃圾收集器回收并释放所有未使用的内存。

6。pep 8 是什么?

PEP 代表 Python 增强提案这是一组规定如何格式化 Python 代码以获得最大可读性的规则。

7。用 python 怎么写注释?

Python 中的注释以#字符开头。

#Comment Example

8。如何在 python 中注释多行?

多行注释出现在多行中。所有要注释的行都要加上前缀#。你也可以用一个非常好的快捷方法来注释多行。你所需要做的就是按住 ctrl 键,在你想要包含#字符的地方点击鼠标左键,然后输入一次#字符。这将对您引入光标的所有行进行注释。

9。Python 中的 docstrings 是什么?

文档字符串实际上不是注释,但是,它们是文档字符串。这些文档字符串在三重引号内。它们不赋给任何变量,因此,有时也可以用作注释。

""" 
This is Docstring example
It is useful for documentation purposes
"""

10。Python 中缩进是可选的吗?

Python 中的缩进是强制性的,是其语法的一部分。

所有编程语言都有某种方式来定义代码块的范围和程度;在 Python 中,它是缩进。缩进为代码提供了更好的可读性,这可能是 Python 强制使用缩进的原因。

11。Python 中的函数是什么?

函数是一段代码,只有在被调用时才会被执行。要定义 Python 函数,需要使用 def 关键字。如果函数返回一些东西,他们需要一个 return 关键字。

def example(a):
   return a*2

12。Python 中的局部变量和全局变量是什么?

全局变量:

在函数外部或全局空间中声明的变量称为全局变量。程序中的任何函数都可以访问这些变量。

局部变量:

任何在函数中声明的变量都称为局部变量。这个变量存在于局部空间,而不存在于全局空间。

#Example of Global Variable
a = 1#Example of Local Variable
def sample():
   #Local Variable
   a = 1

13。什么是 lambda 函数?

匿名或未命名的函数称为 lambda 函数。该函数可以有任意数量的参数,但只能有一条语句。它通常用作一次性功能,而不是重复使用的功能。

#Example of Lambda Functiontest = lambda x,y: x*y
print(test(2,4))

14。为什么 python 中的 lambda forms 没有语句?

python 中的 lambda 表单没有语句,因为它用于创建新的函数对象,然后在运行时返回它们。

15。Python 中支持哪些数据类型?

Python 有五种标准数据类型

  • 数字(整数和浮点数)
  • 线
  • 目录
  • 元组
  • 词典

16。什么是索引?

要访问有序序列中的元素,我们只需使用元素的索引,即特定元素的位置号。索引通常从 0 开始,即第一个元素的索引为 0,第二个元素的索引为 1,依此类推。

#Example usage of indexlist_ex = [1,2, 'Test']
print(list_ex[0])

17。什么是负指数,为什么使用负指数?

当我们使用索引来访问列表末尾的元素时,我们称之为反向索引。在反向索引中,元素的索引从索引号为 1 的最后一个元素开始。倒数第二个元素的索引为“2”,依此类推。反向索引中使用的这些索引称为负索引。

#Example usage of indexlist_ex = [1,2, 'Test']
print(list_ex[-1])

18。Python 中的字典是什么?

Python 字典是 Python 中支持的数据类型之一。这是一个无序的元素集合。字典中的元素存储为键值对。字典是按关键字索引的。数据类型由{}表示。

#Example of Dictionarydictionary = {'key' : 'value'}

19。如何访问字典中的值?

您可以通过使用键进行索引来访问字典中的值。索引由[]呈现。

#Accessing Dictionarydictionary = {'key' : 'value'}
print(dictionary['key'])

20。如何获得字典中所有键的列表?

在字典中,我们可以使用 keys()属性。

dictionary = {'key' : 'value', 'key1': : 'value1'}
print(dictionary.keys())

21。list 和 tuple 有什么区别?

列表和元组的区别在于列表是可变的,而元组不是。元组可以被散列,例如作为字典的关键字。使用[]定义列表,使用()定义元组。

#Example of list and tuple#List
list_ex = [1,2,'test']#List is mutable
list_ex[0] = 100#Tuple
tuple_ex = (1,2,'test)#Tuple is not mutable
tuple_ex[0] = 100 #It would error

22。在 Python 中什么是迭代器?

在 Python 中,迭代器用于迭代一组元素,如列表或字符串等容器。通过迭代,这意味着它可以通过使用语句来循环。

23。[::-1}是做什么的?

[::-1]用于反转任何可迭代对象的顺序。

#Reverse examplestring = 'this is a string'
print(string[::-1])

24。python 中如何使用三元运算符?

三元运算符是用于显示条件语句的运算符。这包括 true 或 false 值以及必须对其进行评估的语句。

#Ternary operators examplea = 1 #The true values
if a < 1:
   print('Less')
#If the previous condition haven't fulfilled
else:
   print('More')

25。休息是如何工作的?

break 语句允许在满足某些条件时终止循环,并将控制权转移到下一条语句。

#Break examplefor i in range(5):
   if i < 3:
      print(i)
   else:
      break

26。python 中的 purpose pass 语句是什么?

Python 中的 pass 语句在语法上需要一个语句,但您不希望执行任何命令或代码时使用。

#Pass examplefor i in range(10):
   if i%2 == 0:
      print(i)
   else:
      pass

27。Python 中的地图函数是什么?

map()函数将一个函数作为参数,然后将该函数应用于 iterable 的所有元素,并作为另一个参数传递给它。它将返回一个 map 对象,所以我们需要将它转换成一个 list 对象。

#map function exampledef number_exponential(num):
   return num**2number_list = [2,3,4,5]print(list(map(number_exponential, number_list)))

28。python 中的枚举函数是什么?

enumerate()方法向 iterable 添加一个计数器,并以 enumerate 对象的形式返回它。该对象将由计数器和可迭代的值组成。

#Enumerate exampleiter_example = ['test', 'test2', 'test3']
for idx, val in enumerate(iter_example):
   print(idx)
   print(val)

29。什么是字典和列表理解?

它们是基于现有 iterable 简化字典或列表创建的语法结构。它是通过在字典或列表对象中循环来创建的。

#Dictionary comprehensiondict_comprehension = {key:val for key, val in emumerate('sample')}
print(dict_comprehension)#List comprehensionlist_comprehension = [i for i in range(5)]
print(list_comprehension)

三十。Python 中的切片是什么?

切片是一种从序列类型(如列表、元组、字符串等)中选择一系列项目的机制。这种切片是通过索引方法完成的。

#Slicing examplelist_example = [1,2,3,4,'test','test2']
print(list_example[1:4])

31。不在运算符中的目的是什么? 运算符是特殊函数。它们接受一个或多个值并产生相应的结果。not将返回布尔值的倒数。

print(not 1 == 2)

32。python 中 **//** 的用途是什么?

它是一个除法运算符,用于将两个操作数相除,结果只显示小数点前的数字。

print(5//2)

33。如何向列表对象添加新值?

您可以通过使用。列表具有的 append()属性。通过将任何值传递给。append()属性,新值将放在列表序列的末尾。

list_example = [1,2,3,4,5]
list_example.append(6)
print(list_example)

34。什么是浅抄?

浅拷贝在创建新的实例类型时使用,它保留在新实例中拷贝的值。浅层复制用于复制引用指针,就像复制值一样。这意味着当我们把一个对象复制到另一个变量时,它会被连接起来。

#Example of shallow copylist_example = [1,2,3,4,5]
another_list = list_example
another_list[0] = 100
print(list_example)

35。什么是深度复制?

深度复制用于存储已经复制的值。深度复制不会复制指向对象的引用指针。它引用一个对象,并存储由其他对象指向的新对象。与浅层副本相比,在原始副本中所做的更改不会影响使用该对象的任何其他副本。这意味着它们没有联系。

#Example of Deep copylist_example = [1,2,3,4,5]#Iniating Deep copy with .copy attribute
another_list = list_example.copy()
another_list[0] = 100
print(list_example)

36。如何在 Python 中创建空类?

空类是指在其块中没有定义任何代码的类。可以使用 pass 关键字创建。但是,您可以在类本身之外创建该类的对象。在 Python 中,pass命令在执行时什么也不做。这是一个无效的声明。

class sample:
    pass
test=sample()
test.name="test1"
print(test.name)

37。Python 中的自关键字是什么?

Self-keyword 用作表示类实例的类中函数的第一个参数。类的对象或实例被自动传递给它所属的方法,并在“self-keyword”中接收。用户可以为捕捉类对象的函数的第一个参数使用另一个名称,但建议使用“self-keyword ”,因为它更符合 Python 约定。

38。如果不以分号结尾,do-while 循环会起作用吗?

这是一个的绝招问题! Python 不支持内在的 do-while 循环。其次,终止 do-while 循环对于像 C++这样的语言来说是必要的。

39。你如何将一个列表转换成一个字符串?

在这种情况下,我们可以使用字符串对象的. join()属性。这里我们将列表对象传递给了属性。

list_example = ['apple', 'grape', 'orange']
print(' '.join(list_example))

40。什么是会员运算符?

运算符可以确认一个值是否是另一个对象中的成员。运算符有“in”和“not in”

#Example membership operatorsprint('me' in 'membership')
print('mes' not in 'membership')

41。Python 中的标识运算符是什么?

恒等运算符是告诉我们两个值是否相同的运算符。运算符有“是”和“不是”。

#Example Identity operators
print(1 is '1')
print(2 is not '2')

42。在 Python 中你是如何接受输入的?

为了获取用户的输入,我们可以使用函数 input()。这个函数将接受用户的输入,并将输入返回到一个字符串对象中。

test = input('input a number: ')
print(test)

43。函数 zip()是做什么的?

它将返回元组的迭代器。它将从传递给函数的 iterable 中形成一个 n 对值。n 是传递给函数的 iterable 的数量。

#Zip function exampleprint(list(zip([1,2,3], ['apple', 'grape', 'orange'], ['x', 2, True])))for num, fruit, thing in zip([1,2,3], ['apple', 'grape', 'orange'], ['x', 2, True]):
    print(num)
    print(fruit)
    print(thing)

44。如果 range()函数采用一个参数、两个参数和三个参数有什么区别?

当我们只传递一个参数时,它把它作为终止值。这里,起始值为 0,步长值为+1。具有范围的迭代将总是在停止值之前停止 1 个值。

for i in range(5):
   print(i)

当我们传递两个参数时,第一个是起始值,第二个是终止值。

for i in range(1,5):
   print(i)

使用三个参数,第一个参数是起始值,第二个是停止值,第三个是步长值。

for i in range(1,10,2):
   print(i)

45。你能写出的交换两个数的最好的代码是什么?

您可以用一行代码来执行擦洗。

a = 1
b = 2#Swab number
a, b = b, a 

46。如何在一行代码中声明多个赋值?

有两种方法可以做到这一点。首先是在同一行中分别声明变量。

a, b, c = 1,2,3 

另一种方法是在同一行中只使用一个值来声明变量。

a=b=c=1

47。如何冲出死循环?

您可以通过按 Ctrl+C 来中断循环过程。

48。Python 中的 **with** 语句是什么?

Python 中的with语句通过封装常见的准备和清理任务,确保在处理非托管资源时执行清理代码。它可以用来打开一个文件,做一些事情,然后在结束时自动关闭文件。它可以用来打开一个数据库连接,进行一些处理,然后自动关闭连接,以确保资源关闭并可供其他人使用。即使引发异常,with 也会清理资源。

#Example of with statementwith open('database.txt') as data:
    print(data)

49。在 try-except 块中,except 块何时执行?

try-except 块通常用于我们希望在出现错误时执行的情况。当 try 块中的代码遇到错误时,将执行 except 块。

a = (1,2,3)
try:
   a[0] = 2
except:
   print('There is an error')

50。哪里会用 **while** 而不是 **for**

对于简单的重复循环,当我们不需要遍历一个项目列表时——比如数据库记录和字符串中的字符。

51。什么是 Python 模块?

模块是独立的 Python 脚本。py 扩展,可以使用 import 语句在其他 Python 代码或脚本中重用。一个模块可以由函数、类、变量或者一些可运行的代码组成。模块不仅有助于保持 Python 代码的组织性,还有助于降低代码的复杂性,提高代码的效率。

import #name of the module

52。什么是 PYTHONPATH?

它是导入模块时使用的环境变量。每当导入一个模块时,还会查找 PYTHONPATH 来检查各个目录中是否存在导入的模块。解释器用它来决定加载哪个模块。

53。举出 Python 的文件处理模式的例子?

我们有以下模式:

  • 只读模式(' r '):打开文件进行读取。这是默认模式。
  • 只写模式(' w '):打开文件进行写入。如果文件包含数据,数据将会丢失。创建另一个新文件。
  • 读写模式(“rw”):以读写模式打开文件。意思是更新模式。
  • Append mode('a '):打开以供写入,如果文件存在,则追加到文件末尾。

54。什么是酸洗和拆线?

Pickle 模块接受任何 Python 对象,并将其转换为字符串表示形式,然后使用转储函数将其转储到一个文件中,这个过程称为 pickle。而从存储的字符串表示中检索原始 Python 对象的过程被称为拆包。

import picklea = 1#Pickling process
pickle.dump(a, open('file.sav', 'wb'))#Unpickling process
file = pickle.load(open('file.sav', 'rb'))

55。python NumPy 数组比 lists 好吗?

我们使用 python NumPy 数组而不是列表是因为以下三个原因:

  1. 内存更少
  2. 快的
  3. 方便的

56。如何用 NumPy 计算百分位数?

百分位数是某个百分位数中有序数字的位置。我们可以使用下面的代码计算 NumPy 的百分比。

import numpy as npa **=** np.array([i for i in range(100)])
p **=** np.percentile(a, 50) #Returns 50th percentile, e.g. medianprint(p)

57。如何使用 Python 获取当前工作目录?

使用 Python 时,您可能需要从不同的目录中读取和写入文件。为了找出我们目前工作在哪个目录下,我们可以使用 os 模块中的 getcwd()方法。

import os
os.getcwd()

58。你在下面看到了什么?如果我们执行它会发生什么?

a = '1'
b = '2'
c = '3's = a + ‘[‘ + b + ‘:’ + c + ‘]’
print(s)

这是字符串连接。如果其中一个变量不是字符串,就会引发一个 TypeError。我们会得到字符串连接的输出。

59。你如何就地随机化列表的内容?

我们可以利用随机模块中的函数 shuffle()的帮助。

from random import shuffle
list_example = [1,2,3,4,5,6,7,8]
shuffle(list_example)

60。Python 中的强制转换是什么?

转换是指我们将一个变量值从一种类型转换成另一种类型。在 Python 中,这可以通过 list()、int()、float()或 str()等函数来完成。例如,当您将字符串转换为整数对象时。

a = '1'
b = int(a)

61。解释为什么我们在这里得到一个错误?

from numpy imprt stdev**ImportError** Traceback (most recent call last)
**<ipython-input-26-685c12521ed4>** in <module>
**----> 1 from** numpy **import** stdev

**ImportError**: cannot import name 'stdev' from 'numpy'

在上面的代码中,我们试图从 numpy 模块中导入一个不存在的函数。这就是为什么我们得到一个错误。

62。如何在 Python 中取消或删除变量?

我们可以使用 del()函数来删除或取消变量。这被认为是一个好的实践,当我们不使用它时,删除所有不必要的变量。

a = 1
del a

63。蟒蛇里的熊猫是什么?

pandas 是一个 Python 包,它提供了快速、灵活、富于表现力的数据结构,旨在使处理“关系”或“标签”数据变得既简单又直观。它的目标是成为用 Python 进行实际的、真实世界的数据分析的基础高级构建块。

64。append()和 extend()方法有什么区别?

append()和 extend()方法都是用于在列表末尾添加元素的方法。

  • append(element):在列表末尾添加给定的元素
  • extend(another-list):在列表末尾添加另一个列表的元素

65。你如何找到当前版本的 Python?

我们可以通过使用 sys.version 找到我们的 Python 当前版本。

import sys
sys.version

66。这是什么意思:*args,**kwargs?我们为什么要用它?

当我们不确定要传递给函数多少个参数时,或者当我们想要传递一个存储的参数列表或元组给函数时,我们使用args。 当我们不知道有多少个关键字参数将被传递给一个函数时,可以使用 kwargs,或者它可以用于将一个字典的值作为关键字参数传递。标识符 args 和 kwargs 是可选的,因为您可以将其更改为另一个名称,例如example **another,但是最好只使用默认名称。

#Example of *args
def sample(*args):
    print(args)sample('time', 1, True)#Example of **kwargs
def sample(**kwargs):
    print(kwargs)sample(a = 'time', b = 1)

67。Python 中的 help()和 dir()函数是什么?

help()函数显示文档字符串及其参数的帮助。

import numpy
help(numpy.array)

函数的作用是:显示一个对象的所有成员(任何类型)。

import numpy
dir(numpy.array)

68。对象名前的单下划线和双下划线是什么意思?

单下划线 —类中带有前导下划线的名称只是为了向其他程序员表明该属性或方法是私有的。但是,名称本身并没有什么特别之处。

双下划线(名称混淆)—任何 __spam 格式的标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中类名是去掉了前导下划线的当前类名。这种处理是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有的实例和类变量、方法、存储在全局变量中的变量,甚至存储在实例中的变量。在其他类的实例上专用于此类。

69。以下查询的输出是什么?

ss = “Python Programming!”
print(ss[5])

答案是“不”

70。用 Python 写一个程序产生一个星形三角形。

def star_triangle(r):
   for x in range(r):
      print(' '*(r-x-1)+'*'*(2*x+1))star_triangle(7)

71。下面这段代码有什么问题?

counter = 0def increment():
   counter += 1increment()

Python 没有变量声明,所以它必须自己确定变量的范围。如果函数内部有一个变量被邀请,那么这个变量就被认为是局部变量。上面的计数器变量是一个全局变量,因此,上面的代码行将引发一个错误。

72。如何把一个字符串拆分成一个列表?

我们可以使用。从字符串中拆分()属性。它将分隔符作为参数,并返回由基于分隔符的字符串分割结果组成的列表。

text = 'hello again world !'
text.split(' ')

73。用 Python 写一个程序,检查你输入的一个序列是不是回文。

a=input("enter the sequence: ")
b=a[::-1]if a==b:
   print("palindrome")
else:
   print("Not a Palindrome")

74。什么是发电机?

Python 生成器通常通过使用函数来生成一系列要迭代的值。我们使用yield来定义一个函数,这个函数曾经一个接一个地产生一个值,然后使用一个 for 循环来迭代它。

def squares(n):
    i=1
    while(i<=n):
        yield i**2
        i+=1
for i in squares(7):
    print(i)

75。用 Python 写一个程序,检查一个数是否是质数。

a=int(input("enter a number"))     
if a>1:
    for x in range(2,a):
        if(a%x)==0:
            print("not prime")
            break
    else:
        print("Prime")
else:
    print("not prime")

76。Python 中单下划线(' _ ')变量的用途是什么?

它用于保存交互式解释器会话中最后执行的表达式(/statement)的结果。这个先例是由标准的 CPython 解释器建立的,其他解释器也遵循了这个先例。

77。Python 中的继承类型有哪些?

Python 支持不同类型的继承,它们是:

  • 单一遗传
  • 多层次继承
  • 分层继承
  • 多重遗传

78。什么是元组解包?

元组解包是将元组中的值解包并将其输入到几个不同的变量中的过程。

tup = (1,2,3)#Tuple unpacking process
a,b,c = tup

79。当你退出 Python 时,所有的内存都被释放了吗?

退出 Python 会释放所有内容,除了:

  1. 具有循环引用的模块

2.从全局命名空间引用的对象

3.C 库保留的部分内存

80。如果一个函数没有 return 语句,它有效吗?

不返回任何内容的函数返回 None 对象。return 关键字不一定标志着函数的结束;它只是在函数中出现时结束它。通常,一个代码块标记一个函数,它结束的地方就是函数体结束的地方。

来源

[## 2020 年 100 大 Python 面试问答| Edureka

是编程领域最受欢迎的技能。在这个 Python 面试问题博客中,我将向您介绍…

www.edureka.co](https://www.edureka.co/blog/interview-questions/python-interview-questions/) [## Python 面试问题

说出 Python 的一些特性。以下是 python 的一些显著特性——它支持函数式和…

www.tutorialspoint.com](https://www.tutorialspoint.com/python/python_interview_questions.htm) [## 2020 年 55 大 Python 面试问答

Python 是一种高级的、解释性的、交互式的、面向对象的脚本语言。Python 被设计成…

intellipaat.com](https://intellipaat.com/blog/interview-question/python-interview-questions/) [## 165+ Python 面试问答经验丰富的 2020

Python 面试问答 2020。这里编码编译器分享了 python 上的 165 个面试问题列表…

codingcompiler.com](https://codingcompiler.com/python-interview-questions-answers-1-2-3-4-5-years/) [## 71 Python 面试问答【新】——准备好技术回合——data flair

欢迎来到 DataFlair 的 Python 面试问答系列的第二部分。如果你是第一次…

数据-天赋.培训](https://data-flair.training/blogs/python-interview-questions/)

如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。

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

4 分钟内 9 个超酷的朱莉娅戏法

原文:https://towardsdatascience.com/9-cool-julia-tricks-in-4-minutes-47a3a4496054?source=collection_archive---------31-----------------------

朱莉娅·REPL 的最佳特征

菲利普·鲍蒂奇在 Unsplash 上的照片

介绍

Julia 是一种新的科学计算语言,像 Python 一样容易学习,但执行速度和 C 语言一样快。Julia 是一种编译语言,但是由于它使用了实时编译器(像 Java),你的代码可以立即执行。这个特性在朱莉娅·REPL 中得到了应用,在这里你可以运行代码行或代码块。REPL 代表读取、执行、打印和循环。

一旦安装了 Julia,在命令行输入 Julia 将打开 REPL。REPL 有许多功能可以帮助您测试代码片段和调试代码。

1.包装模式

包装模式下的朱莉娅·REPL

在行首键入]进入包模式。这是访问 Julia 的包管理器 Pkg 的快捷方式。在这种模式下,你可以安装软件包,更新它们,查看当前软件包的版本等等。在打包模式中有几个有用的命令是addremovebuildupdate

2.外壳模式

外壳模式

在行首键入;进入 shell 模式。这改变了朱莉娅·REPL 来运行 bash 命令,而不是朱莉娅。在 shell 模式下,REPL 的行为类似于 Bash shell,您可以输入标准的 Bash 命令,如lscdmkdir等。这个功能我用过很多次。

3.帮助模式

帮助模式

键入?进入帮助模式。在这种模式下,您可以看到函数或类型文档以及其他提示和提示。当您输入文本时,Julia 将搜索与您输入的文本相匹配的文档和函数名。

4.函数参数制表符结束

**julia>** uppercase([PRESS TAB]
    uppercase(c::T) where T<:AbstractChar in Base.Unicode at strings/unicode.jl:247
    uppercase(s::AbstractString) in Base.Unicode at strings/unicode.jl:518

制表符补全在 REPL 中的工作方式与在 shell 或 iPython 中的工作方式相同,但是它有一个额外的有用特性。键入函数名时,在左括号后按 tab 键。如果这样做了,Julia 将显示与函数名相关的方法列表、它们的参数类型以及它们在源代码中的位置。

5.宏:@doc

**julia>** @doc max
 max(x, y, ...)Return the maximum of the arguments. See also the maximum function  to take the maximum element from a collection.

在函数或类型之前调用@doc将打印该对象的文档。(在 Julia 文档中出现在函数定义前的一个字符串中。)这有助于快速找到您需要的功能,或者提醒自己某个特定功能的用法。

6.宏:@时间

**julia>** @time sum(rand(1000));
 0.000030 seconds (6 allocations: 8.109 KiB)

@time宏是另一个非常有用的工具。正如您所料,它会计算它前面的语句的执行时间。

7.功能:中肯()

**julia>** apropos("capital")
 Base.Unicode.titlecase 
 Base.Unicode.uppercasefirst

该函数接受一个字符串,并在所有文档中搜索相关的函数和类型。这有助于避免在文档中寻找您需要的函数。

8.函数:方法()

**julia>** methods(uppercase)
 # 2 methods for generic function "uppercase":
 [1] uppercase(c::T) where T<:AbstractChar in Base.Unicode at strings/unicode.jl:247
 [2] uppercase(s::AbstractString) in Base.Unicode at strings/unicode.jl:518

methods函数接受一个函数,并返回该函数的所有调度定义,以及它们接受的类型和它们在源代码中的位置。当你试图寻找一个函数或者当你不记得参数的顺序时,这是很有用的。

9.函数:methodswith()

**julia>** using Flux**julia>** methodswith(BatchNorm)
 [1] show(io::IO, l::BatchNorm) in Flux at /Users/djpassey/.julia/packages/Flux/NpkMm/src/layers/normalise.jl:211
 [2] testmode!(m::BatchNorm) in Flux at /Users/djpassey/.julia/packages/Flux/NpkMm/src/layers/normalise.jl:207
 [3] testmode!(m::BatchNorm, mode) in Flux at /Users/djpassey/.julia/packages/Flux/NpkMm/src/layers/normalise.jl:207

这是另一个有用的功能。该函数接受类型并返回作用于该类型的所有函数。在上面的例子中,我导入了一个机器学习包 Flux,并在BatchNorm结构上调用methodswith。它向我们展示了三个接受BatchNorm对象作为参数的函数。

当您开始了解一个新的包并想了解库中定义的结构时,这很有用。当你在寻找一个作用于某种类型的函数时,这也是很有帮助的。

结论

总的来说,朱莉娅·REPL 在帮助开发人员定位正确的功能和测试代码片段方面非常有用。希望这些提示能派上用场,加速你的 Julia 发展。

[## Julia 如何利用多重调度击败 Python

亲自看

medium.com](https://medium.com/swlh/how-julia-uses-multiple-dispatch-to-beat-python-8fab888bb4d8) [## 给 Jupyter 添加一个 Julia 内核只需要 10 分钟

为什么这很酷。

medium.com](https://medium.com/@djpasseyjr/it-only-takes-10-minutes-to-add-a-julia-kernel-to-jupyter-739490456a2b)

关于雪花数据仓库你应该知道的 9 个特性

原文:https://towardsdatascience.com/9-features-that-you-should-know-about-snowflake-data-warehouse-46bdd62995ef?source=collection_archive---------21-----------------------

约翰尼斯·威贝尔在 Unsplash 上拍摄的照片

简单而强大——雪花开箱即用,功能丰富

雪花是一个云数据仓库,与 Google BigQuery 和 Amazon Redshift 等替代产品相比,它已经成为分析和报告的首选解决方案。它越来越受欢迎是因为它的简单——它就是管用。雪花旨在抽象出数据库管理和优化,以便用户可以从一开始就拥有一个高性能的数据仓库,并且无需管理。

如果你熟悉雪花,那么你可能已经知道它独特的整体架构-它如何将存储和计算分开,以允许各自独立扩展。以及它的虚拟仓库(独立的 MPP 集群)如何跨数据库使用,并在不使用时自动挂起。

这篇文章涵盖了 Snowflake 与众不同的一些其他独特特性,如果你打算采用它,你应该考虑一下。

1.合作伙伴连接计划

与 BigQuery 和 Redshift 不同,雪花没有其他内置的专门服务工具,如机器学习和商业智能。相反,雪花与广泛的行业领先的技术合作伙伴和编程接口合作,为更大的分析生态系统构建连接器和驱动器。通过这种方式,客户可以利用雪花作为核心数据存储引擎,同时将数据传输到各种第三方集成,以完成其他专业任务。Partner connect 是生态系统的扩展,让您可以轻松地将雪花帐户与精选第三方集成的试用帐户相连接,以尝试并选择最适合您的帐户。

2.引擎盖下优化的桌子结构

使用雪花,查询性能和表优化不是你必须担心的事情。微分区和数据集群解决了这个问题。所以你不需要考虑索引,计算分区或者分片数据。当数据被加载到表中时,这一切都为您完成了。

微分区

雪花通过将行分组为 50-500 MB 数据的单独微分区来自动划分表。微分区创建了大小更加一致的分区,限制了数据倾斜,并使在极其精细的级别上修剪大型表变得容易。换句话说,查询可以使用微分区元数据来确定哪些分区与查询相关,以便只扫描那些分区。Snowflake 更进一步,将对分区的扫描限制在查询中筛选的列。

聚集表

当表中的数据没有排序时,查询的性能就不会很好。存储在表中的数据可以按照用于协同定位数据的列的子集进行排序,这个子集称为聚集键。在雪花中,为数据加载期间创建的每个微分区收集集群元数据。然后利用元数据来避免不必要的微分区扫描。对于非常大的表,如果查询运行速度比预期慢,可以显式创建聚集键。

3.在帐户之间共享数据

安全数据共享是雪花的一项创新功能,允许您与另一个雪花帐户共享您帐户中数据库的对象(如表),而无需实际创建数据副本。因此,共享数据不会占用额外的存储空间,也不会增加数据消费者的存储成本。由于数据共享是通过雪花的元数据存储完成的,因此设置很快,数据消费者可以即时访问数据。

通过这种架构,Snowflake 可以创建一个数据提供者和数据消费者的网络,支持多种用例。其中之一是雪花数据市场——一个连接希望与消费者分享免费或付费数据的提供商的市场。消费者可以在他们的帐户中直接获得共享数据,以便查询和加入他们喜欢的其他数据源。数据交换是 Snowflake 的另一个用例,它允许用户与受邀成员就数据进行协作。这使得在商业客户、供应商和合作伙伴之间共享数据变得非常容易。

对于没有雪花帐户的数据消费者,雪花使提供商能够创建读者帐户,这是一种经济高效的方式,允许消费者在不成为雪花客户的情况下访问共享数据。

4.零拷贝克隆

在传统的数据仓库服务中,克隆数据是非常痛苦的,因为如果您想要克隆一个现有的数据库,您必须部署一个全新的独立环境并将数据加载到其中。为了测试变更、进行特别分析或创建开发/测试环境而不得不经常这样做是不可行的,因为您要为额外的存储付费。雪花的零拷贝允许您几乎瞬间克隆任何数据库或表,而无需创建新的副本。它通过跟踪元数据存储上克隆的更改来实现这一点,同时在后端仍引用相同的数据文件。零拷贝克隆的好处是,您可以创建相同数据的多个独立克隆,而无需任何额外成本。更酷的是,你可以使用雪花的时间旅行功能来克隆过去某个时间点的数据。

5.使用 undrop 恢复对象

UNDROP 命令对于从错误中恢复是一个很好的特性,比如删除错误的表。通常发生这种情况时,您必须花费大量时间来恢复备份和还原数据。使用 UNDROP 命令,雪花允许您即时恢复对象,只要您仍在恢复窗口内。

6.支持半结构化数据

迈向大数据的最大一步是雪花能够结合结构化和半结构化数据,而不必使用 Hadoop 或 Hive 等复杂技术。数据可以以多种形式来自机器生成的数据、传感器和移动设备等来源。雪花支持摄取各种格式的半结构化数据,如 JSON、Avro、ORC、Parquet 和 XML,VARIANT 数据类型的大小限制为 16MB。Snowflake 还通过以列的形式提取尽可能多的数据并将其余数据存储为一列来优化数据。使用可以解析、提取、转换和操作数据的数据函数,简化半结构化数据中的嵌套结构也很容易。

7.连续数据管道

连续数据管道自动化了将数据加载到雪花表中,然后转换数据以供进一步分析的许多手动步骤。雪花提供了一组功能,支持连续数据接收、变更数据跟踪和设置重复性任务,从而为连续数据管道构建工作流。

Snowpipe 用于连续数据摄取

Snowpipe 是雪花的持续数据摄取服务。Snowpipe 提供了一个管道,一旦 AWS S3 等外部阶段提供了新数据,就可以以微批处理方式加载新数据,使您在几分钟内就可以获得这些数据,而不必使用 COPY 语句手动加载更大的批处理。

Snowpipe 通过利用外部阶段中的事件通知来告诉它有新文件可供接收。这些文件然后被复制到一个队列中,从那里它们被加载到雪花。Snowpipe 也可以通过它的 REST 端点进行调用。这对于可以调用 Snowpipe 的应用程序来说是非常有利的,Snowpipe 提供了一个需要获取的数据文件名列表。

在 Snowpipe 上查看这个教程。

使用流更改数据捕获

当把新数据从临时表复制到其他表时,知道哪些数据发生了变化是很有用的,这样只有发生变化的数据才能被复制。雪花表流是实现这一目的的一个有用特性—捕获关于对表所做的 DML 更改的元数据以及更改前后行的状态,以便可以使用更改的数据采取行动。这也称为变更数据捕获。

这里有一个为 CDC 收集的数据流的例子(来自雪花

使用任务调度 SQL 语句

任务是一种允许 SQL 语句按计划执行的功能,这些 SQL 语句按创建任务时定义的时间间隔触发。任务可以执行单个 SQL 语句,也可以调用存储过程。它们对于定期工作非常有用,比如生成报告表,或者作为数据管道的一部分,从表流中捕获最近更改的表行,并转换它们以插入到其他表中。

8.缓存结果

雪花架构包括不同级别的缓存,有助于加快查询速度和降低成本。例如,当执行一个查询时,雪花将查询结果保存 24 小时。因此,如果相同的用户或帐户中的另一个用户再次执行相同的查询,只要底层数据没有改变,就已经可以返回结果。这对于不需要重新运行复杂查询来访问以前的数据的分析工作,或者当您想要比较复杂查询在更改前后的结果时,尤其有用。

9.外部表格

外部表允许您查询存储在数据湖(如 AWS S3)中的文件中的数据,就好像它在雪花数据库中一样。您不必事先知道数据文件的模式或记录的格式,外部表在读取时使用模式,并将所有常规或半结构化数据转换为变量数据类型。这个特性为您提供了对雪花支持的任何格式的数据文件执行查询的优势,以便在将数据实际接收到雪花中之前查看数据的样子。

结束语…

雪花是功能丰富的开箱即用。我在这里提到的功能只是我们没有提到的许多其他功能中的一部分,如时间旅行和故障保险。了解每种方法的优点需要时间,并且取决于您打算如何使用雪花,但是了解它们可以帮助您决定使用哪个数据仓库。在为你选择合适的数据仓库之前,花时间研究你所有的选择是很重要的。像 Snowflake 这样一个易于设置和操作的平台可以大大简化您的分析用例的构建和维护。

如果您正在研究雪花相对于其他解决方案的利弊,并且需要一些见解,请通过 Waterfront Analytics 联系我们。那里有大量的信息,我们可以根据您的分析目标帮助您决定您需要什么。

让自然语言预处理变得轻而易举的 9 个函数

原文:https://towardsdatascience.com/9-functions-that-make-natural-language-pre-processing-a-piece-of-cake-8b885c151955?source=collection_archive---------16-----------------------

NLP 最耗时的方面可以总结为快速简单的步骤。表情符号处理奖金。

什么是 NLP,为什么它很重要

自然语言处理帮助计算机用人类自己的语言与人类交流。它使计算机有可能阅读文本,听到讲话,翻译它,测量情绪,并确定哪些部分是重要的。

它允许我们和我们的机器发展我们的逻辑、情感和直觉智能,这对当今世界的生存和发展特别有用。

如果您还不是会员,请在此获得您的中级会员资格!

你会在这篇文章中发现什么——清洁和处理

  1. 从文本文件创建熊猫数据帧
  2. 将所有单词变为小写
  3. 删除标点符号
  4. 去掉不必要的空格
  5. 使用正则表达式删除你将在这篇文章中找到的内容
  6. 统计字符单词的重复次数
  7. 数一行中
  8. 计算一行中字符的数量
  9. 统计最多的重复
  10. 处理 表情符号 。奖金❤️

NLP 中一些常用的可视化

  1. 词云
  2. 树形地图

图书馆

我在 Pycharm 上运行我的代码,这些是我在分析的第一部分中使用的库。如你所见,我把事情做得又好又简单:)

import pandas as pd
import numpy as np
import regex as re
from collections import Counter

1.从文本文件创建熊猫数据帧

对于这个例子,我们将使用《权力的游戏》的剧本。每集的文本文件可以在这里找到。

我想做的第一件事是创建一个有两列的熊猫数据帧,第一列是角色的名字,第二列是角色说的台词。

通过添加参数 sep: ":" 我们指出列之间的分隔将使用每个冒号。使用 error_bad_lines=False 参数,当没有找到冒号时,该行将被删除。这对于我们的非语音行特别有效,比如[GARED grubbles],我不想保留它。

df = pd.read_csv('r"file.txt"**,** sep=":"**,** error_bad_lines=False)

2.将所有单词变为小写

ASCII 或 UNICODE 编码区分小写和大写字母,因此在我们开始 NLP 分析之前,所有的单词都是小写是很重要的。否则,我们会得到不必要的重复

df1['name']= df1['name'].str.lower()
df1['line']= df1['line'].str.lower()

3.用一个字符替换另一个字符

我想去掉这一行中的所有标点符号,我决定保持简单,并使用了 replace()函数。我发现这一步在统计单词重复次数和频率时相当重要。逗号后面的单词将被不同地计数,这使得我的结果非常嘈杂,难以分析。

df['line'] = df['line'].str.replace(','**,** '')
df['line'] = df['line'].str.replace('.'**,** '')

4.去掉不必要的空格

区分“提利昂”和“提利昂”。当试图根据名称合并数据帧时,或者当我们生成单词云时,它们以不同的间距多次计数同一个单词,这会导致许多问题。

df1['name'] = df1['name'].str.strip() # Delete preceding spaces

5.使用正则表达式删除特殊字符分组

最近发现了 Regex,心生敬畏。它是如此强大!

一个正则表达式 (Regex) 是一个定义搜索模式的字符序列。通常,字符串搜索算法使用这种模式对字符串进行“查找”或“查找和替换”操作,或者进行输入验证。它是在理论计算机科学和形式语言理论中发展起来的一种技术。

我注意到,有时带有角色名的那一行会在括号中包含情感和语气指示。使用这些正则表达式可以去掉括号和括号内的所有内容。我们得到了结果

Arya (crying and shouting): How dare you!
Arya: How dare you!

这种删除可以通过以下函数和正则表达式编码来实现:

# Delete everything between the brackets
df['person']=df['person'].str.replace(r"\(.*\)","")

另一个方便的 Regex 应用程序的例子是删除 name 列中每个字符的姓。

# Delete last name
df['name']=df['name'].str.replace(r"^(\s*(?:\S+\s+){1})\S+",r"\1")

6.计算字符或单词的重复次数

我想调查一个角色使用感叹号来表达强烈情感的次数。我决定使用 lambdacount() 函数对感叹号进行计数,并创建一个包含总计数的新列。

df['exc'] = df['line'].map(lambda x: x.count("!"))

一行包含感叹号的次数

完全相同的函数也可以用来计算一个特定单词重复出现的次数。

df['queen'] = df['line'].map(lambda x: x.count("Daenerys!"))

每个字符使用的感叹号的数量

7.计算一行中的字数

看一下本文末尾的 树形图 来可视化《权力的游戏》全部 8 季中每个角色说的话的比例。

df['words'] = [len(x.split()) for x in df['line'].tolist()]

8。计算一行中的字符数

df['characters_nb'] = df.line.apply(len)

9.统计重复次数最多的单词

这个函数和 6 中的函数的区别在于,这个函数查看所有的单词,并计算它们被说的次数。步骤 6 中的函数搜索输入中给出的单个特定单词。

wd = pd.DataFrame(Counter(words.split()).most_common(200), columns=[**'word'**, **'frequency'**])

当我们运行这个函数时,我们得到一个字典,映射所有说过的单词和它们被说的次数。

为了只查看一个角色说的话,我可以使用下面的代码行只保留他/她的台词。

df = df[df[‘name’] == “arya”]

看看本文末尾的 词云 来可视化《权力的游戏》全部 8 季中每个角色最常用的词。

10.计算表情符号

我认为添加关于处理表情符号的信息是必要的。它们无处不在,我们必须知道如何充分利用这些新信息。

这是我另一个项目的代码摘录,我在这个项目中分析了一个 WhatsApp 对话。

我导入了表情库,然后使用 append()函数创建了所用表情的列表。然后我用 Counter() 函数统计了每个表情符号在列表中出现的次数。我用所有使用的表情符号和它们相应的频率创建了一个字典。最后,我应用了 sorted()函数来枚举和排序使用最多和最少的表情符号。

import emojiemojis_df=[]for string in df['line']:
    my_str = str(string)
    for each in my_str:
        if each in emoji.UNICODE_EMOJI:
            emojis_df.append(each)freq = dict(Counter(i **for** sub **in** emojis_df **for** i **in** set(sub))) sort_orders = sorted(freq.items(), key=**lambda** x: x[1], reverse=**True**)

对于所有这些功能(尤其是表情符号)的实际应用,看看这篇文章:“WhatsApp 的对话告诉了我们什么关于我们的友谊”

[## WhatsApp 上的对话告诉我们关于友谊的什么

三年的友谊能告诉你什么关于你的交流习惯?

towardsdatascience.com](/what-whatsapp-conversations-tell-us-about-our-friendships-73ce7104d84e)

数据可视化

看着吓人,其实真的不是!

首先,我们选择想要分析的角色。然后我按照和表情符号练习完全一样的步骤。列出单词,统计重复次数,创建词典,最后绘制单词云!容易的。

from wordcloud import WordCloud**,** STOPWORDS**,** ImageColorGenerator# Choose a character
df = df[df[**'name'**]  == **"cersei"**]*# Make all words lowercase and add them to an array*
words = **''
for** i **in** df.line.values:
    words += **'{} '**.format(i.lower())*# Create a pandas dataframe with the word and its frequency* wd = pd.DataFrame(Counter(words.split()).most_common(200), columns=[**'word'**, **'frequency'**])# Convert the dataframe to a dictionary
data = dict(zip(wd[**'word'**].tolist(), wd[**'frequency'**].tolist()))

wc = WordCloud(background_color=**'white'**,
               stopwords=STOPWORDS,
               max_words=200).generate_from_frequencies(data)
plt.imshow(wc, interpolation=**'bilinear'**)
plt.show()

关于颜色、形状和字体,Word Cloud 文档可以在这里找到。

树形地图

这个情节背后的想法是为了形象化电视节目中我和女主角的对话比例。

我把我的数据帧格式化,这样单词就可以按字符计数,每个字符都被赋予一个性别和一种颜色。女人是红色的,男人是蓝色的。我需要改变数据帧的每一列,使其成为熊猫系列。然后,这可以用作使用 squarify.plot()函数的树形图的输入。

import squarifydf = df.groupby([**'name'**,**'sex'**, **'color'**])[**'words'**].sum().reset_index()

x1=pd.Series(df[**'name'**])
x2=pd.Series(df[**'words'**])
x3=pd.Series(df[**'color'**])
x2=x2.tolist()
x1=x1.tolist()
x3=x3.tolist()

squarify.plot(
sizes=x2, 
label=x1, 
color =x3,
alpha=.7,
bar_kwargs=dict(linewidth=1, edgecolor=**"#222222"**))plt.show()

瞧啊。

对于《权力的游戏》的粉丝来说,看看这篇文章:受《权力的游戏》启发的 3 个快速简单的数据可视化

[## 受《权力的游戏》启发的 3 种快速简单的数据可视化

回答这个问题:我在看什么?

towardsdatascience.com](/3-quick-and-easy-data-visualisations-inspired-by-game-of-thrones-37c0e611b9bf)

非常感谢你的阅读!

更多类似的文章,请点击在 Medium 上找到我!

如果你有任何关于如何改进的问题建议想法,请在下面留下评论或通过 LinkedIn 这里取得联系。

照片由威廉·冈克尔在 Unsplash 上拍摄

Github 知识库

所有代码都可以在 Github 上的 got_analysis.py 文件中找到这里。

9 分钟到达数据科学产品组合网站

原文:https://towardsdatascience.com/9-minutes-to-a-data-science-portfolio-website-80b79ced6c54?source=collection_archive---------41-----------------------

如何用 GitHub 页面构建一个简单免费的网络作品集

个人网站是展示你作品的好方法。对于数据科学求职来说,这也是非常有价值的。投资组合使您能够分享您的数据科学项目的高级概述。它比你的简历更深入你的项目,但比你的 github repos 技术性更低,更具说服力。这是招聘人员和数据科学经理的最佳水平。

建立一个简单的投资组合比你想象的要容易。你所需要的只是一个 GitHub 账户和一点 markdown 的知识。不需要 html 或 web 框架!

这种方法使用 GitHub 页面作为网站来提供项目的自述文件。GitHub 托管这些网站,所以它们对你是免费的。这个投资组合只是冰山一角;GitHub 页面也可以用来为你的每个项目制作简单的网站。

在本教程中,我将使用 markdown 建立一个投资组合;然而,如果你想使用更传统的网站创建工具,你也可以使用 html。在我们建立我们的网站后,我们将使用 Jekyll 现有的一个主题,使它更具美感。

最终结果:【https://playingnumbers.github.io/Ken_Portfolio/】

本教程视频版:https://www.youtube.com/watch?v=1aXk2RViq3c

步骤 1:创建一个新的 GitHub repo

首先,我们创建一个新的 repo 并初始化 README.md 文件。

第二步:进入设置,向下滚动到 GitHub 页面部分

单击列表最右侧的“回购设置”选项卡。

向下滚动到 Github 页面框所在的底部。

将源从无切换到主分支。

第三步:检查你的网站是否正常

单击 GitHub 页面部分顶部的链接,转到您的新网站。

网页应该显示你的 repo 的 README.md 的内容。

恭喜你。你已经有一个工作网站。如果您遇到 404 错误,不要担心。有时候服务器设置需要一点时间(根据我的经验,可能需要 5 分钟)

步骤 4:将网站内容添加到 README.md 文件中

因为网页上显示的是自述文件,所以你所要做的就是改变它,在你的网站上显示你想要的内容。你可以使用 markdown 来实现(我强烈推荐这个备忘单https://github . com/Adam-p/Markdown-here/wiki/Markdown-cheat sheet)。

如果您已经有了包含详细自述文件的项目,您只需复制并粘贴它们即可。

首先单击自述文件右上角的编辑图标。

接下来,在这一部分填入你想要的网站内容。对我来说,我只是使用了我以前做过的一些项目的项目概述。我还链接了其他的回复,并添加了一些简单的图片。降价指南(如上)告诉你如何做所有这些事情。

您可以单击“预览更改”按钮来查看网页上的所有内容。

要将图片添加到网站,您需要创建一个单独的图像文件夹。您可以使用该文件夹中图像的路径将它们显示在屏幕上。

要在 github 中创建一个 images 文件夹,您可以在 repo 的内容上单击 create new file 按钮。

在文件目标中,键入 images/README.md

当你输入/后,它会自动将图片变成蓝色

然后转到底部,单击“提交新文件”按钮。这里不用添加任何内容。

当你回到你的文件夹时,你应该会看到一个图片文件夹。

现在,点击图片文件夹,上传你想在网站上展示的文件。

要让图片显示在你的网站上,你必须在你的减价中使用以下路径格式:!

第五步:选择主题

至此,你应该有了一个非常基础的网站,看起来和你的 github repo 自述完全一样。如果你想添加一些基本的格式,你可以使用 Jekyll 的主题。

为此,您可以再次单击 repo settings 按钮,并返回到 Github Pages 设置框。

这一次你点击“改变主题”按钮。

在顶部,选择您想要的主题,然后单击选择主题。

如果您返回到 repo,您现在应该有一个 _config.yml 文件。这就是管理主题的东西。如果你删除它,主题就会消失。

现在去你的网站,你应该有一个简单的投资组合,使用你选择的主题!

9 熊猫有效数据分析的可视化技术

原文:https://towardsdatascience.com/9-pandas-visualizations-techniques-for-effective-data-analysis-fc17feb651db?source=collection_archive---------17-----------------------

学习如何使用线形图,散点图,直方图,箱线图,和一些其他可视化技术只使用熊猫图书馆

图片由 Mediamodifier 来自 Pixabay

简介

在本文中,我将向您介绍九种不同的可视化技术,它们将帮助您分析任何数据集。大多数这些技术只需要一行代码。我们都喜欢简单,不是吗?

您将学习如何使用:

线形图,

散点图,

面积图,

条形图,

饼状图,

直方图,

核密度函数,

箱线图,

和散点图。

我们将讨论所有上述可视化技术,探索使用它们的不同方法,并学习如何定制它们以适应数据集。

让我们开始吧。

加载数据集和快速数据浏览

为简单起见,我们将使用 Iris 数据集,该数据集可通过以下代码从 scikit-learn 库中加载:

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

如您所见,我们的数据集只有五列。让我们调用数据框上的 info()函数进行快速分析:

df.info()

如您所见,只有 150 个条目,任何一列都没有丢失值。

此外,我们已经知道前四列有浮点值,而最后一列只允许整数。事实上,从数据集描述中,我们知道物种列将只取三个值,每个值代表一种花。

要确认这一点,您可以对该列调用 unique()函数:

df.species.unique()
array([0, 1, 2])

实际上物种列只取三个值:0、1 和 2。

了解了数据集的基本信息,我们就可以进行可视化了。请注意,如果列中有一些丢失的值,您应该删除它们或填充它们。这是因为我们稍后将讨论的一些技术不允许丢失值。

线条图

我们将从一个简单的线图开始我们的可视化。我们姑且称之为整个数据框架。

df.plot()

正如您在这里看到的,它用不同的颜色绘制了所有列值与索引值(x 轴)的关系。当我们不为函数提供 x 轴参数时,这是默认行为。

如你所见,这个图不是很有用。如果 x 轴是时间序列,则折线图是一个不错的选择。然后,我们可能会在数据中看到一些时间趋势。

在我们的例子中,我们只能看到数据是按物种列排序的(图中的紫色阶梯),其他一些列有遵循该模式的移动平均值(花瓣长度,特别是用红色标记的)。

散点图

我们将要发现的下一种观想是散点图。这是显示两个连续变量之间相互关系的完美图形。让我们用萼片长度对萼片宽度作图来证明这一点。

df.plot.scatter(x='sepal length (cm)', y='sepal width (cm)')

正如您所看到的,为了生成这个图形,您需要通过提供它的列名来指定绘图的 x 轴和 y 轴。这张图表显示这两个变量之间没有很强的相关性。让我们检查另一对,萼片长度花瓣长度:

df.plot.scatter(x='sepal length (cm)', y='petal length (cm)')

在这种情况下,我们可以看到,当萼片长度增加时,花瓣长度也增加(萼片长度大于 6 cm 的值更强)。

面积图

让我们为数据框创建一个面积图。我将在我的图中包括所有厘米尺寸,但删除物种列,因为在我们的例子中没有意义。

columns = ['sepal length (cm)', 'petal length (cm)', 'petal width (cm)', 'sepal width (cm)']
df[columns].plot.area()

这张图表上的测量值一个压一个。查看此图表,您可以直观地检查图表中包含的每个测量值之间的比率。你可以看到所有尺寸都有向后期条目增长的趋势。

条形图

当显示条目的平均值或计数时,这是一种很好的图表类型。让我们用它来计算数据集中每个物种在每个维度上的平均值。

为此,您需要使用 groupby()和 mean()函数。我不打算在这里详细解释它们是如何工作的,但是你可以查看这篇解释这些概念的文章。

df.groupby('species').mean().plot.bar()

正如你所看到的,这是非常直接的阅读。我可以看到,不同物种和不同列的平均测量值存在差异。

饼状图

您可以使用饼图来可视化目标变量的类计数。我们将在这里为我们正在处理的 Iris 数据集做这件事。同样,我们将需要一些助手功能。这次是 groupby()和 count():

df.groupby('species').count().plot.pie(y='sepal length (cm)')

正如你所看到的,我们的类有完美的比例,因为我们的数据集由每个类的 50 个条目组成。

注意,我们必须在这里使用 y 参数,并将其设置为某个列名。我们在这里使用了萼片长度列,但它可以是任何列,因为所有列的计数都是相同的。

直方图

对于任何连续变量来说,这都是一个完美的可视化。让我们从简单的 hist()函数开始。

import matplotlib.pyplot as plt
df.hist()
plt.tight_layout()

如您所见,这为数据集中的每个数值变量生成了一个直方图。

我不得不添加一些额外的代码行来定制图表。这是第一个导入行,也是我调用 tight_layout()函数的最后一行。如果不添加,标签和子图名称可能会重叠,并且不可见。

核密度函数

与直方图类似,您可以使用核密度函数:

df.plot.kde(subplots=True, figsize=(5,9))

您可以看到它给出了与直方图相似的结果。

我们必须在这里指定一个图形大小,因为没有它,图形在垂直方向上被挤压得太厉害了。此外,我们已经将 subplots 参数设置为 True ,因为默认情况下所有列都将显示在同一个图形上。

箱线图

另一个应该用于数字变量的可视化。让我们为所有测量列创建箱线图(我们排除了物种列,因为箱线图对该分类变量没有意义):

columns = ['sepal length (cm)', 'petal length (cm)', 'petal width (cm)', 'sepal width (cm)']
df[columns].plot.box()
plt.xticks(rotation='vertical')

正如你所看到的,所有的箱线图都绘制在同一个图上。这在我们的情况下很好,因为我们没有太多的变量来可视化。

请注意,我们必须旋转 x 标签,因为没有它,标签的名称会相互重叠。

散点图矩阵图

这是我最喜欢的熊猫可视化技术之一,因为它可以让你快速分析数据集中的所有数值及其相关性。

默认情况下,它将生成数据框中所有数值变量对的散点图和所有数值变量的直方图:

from pandas.plotting import scatter_matrix
scatter_matrix(df, figsize=(10, 10))

正如你所看到的,结果就是这组漂亮的图表,它只用一行代码就能告诉你很多关于数据集的信息。我只需浏览一下,就能发现这个数据集中变量之间的一些相关性。

我必须设置的唯一额外参数是图形大小,这是因为图非常小,具有默认的图表大小。

总结

我希望你已经喜欢这个关于不同熊猫可视化技术的简短教程,并且你将能够把这些知识应用到你选择的数据集上。

制图快乐!

最初发表于 aboutdatablog.com: 9 熊猫有效数据分析可视化技术,2020 年 5 月 13 日。

PS:我正在 Medium 和上撰写深入浅出地解释基本数据科学概念的文章。你可以订阅我的* 邮件列表 *每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入**

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

** [## 对熊猫中的数据框进行排序

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

towardsdatascience.com](/sorting-data-frames-in-pandas-a5a3af6f346a) [## 当你开始与图书馆合作时,7 个实用的熊猫提示

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

towardsdatascience.com](/7-practical-pandas-tips-when-you-start-working-with-the-library-e4a9205eb443) [## Jupyter 笔记本自动完成

数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…

towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c)**

你永远不会成为数据科学家的 9 个原因

原文:https://towardsdatascience.com/9-reasons-why-youll-never-become-a-data-scientist-c8c5b75503cf?source=collection_archive---------0-----------------------

你需要改变你的心态

数据科学是一个艰难的领域。做好准备。安妮·斯普拉特在 Unsplash 上的照片

DDisclaimer:这个故事不是要打击你。更确切地说,它应该是一面长时间的镜子。

你对数据科学充满热情,阅读了几十篇博客文章,完成了几门在线课程。现在你梦想以此为职业。毕竟,根据《哈佛商业评论》的报道,这是 21 世纪最性感的工作。

但是尽管你充满热情,数据科学可能并不适合你。此时此刻,你持有太多的幻想和错误的成见。

现在,你的任务很简单:清除那些阻碍你前进的东西!你会惊讶于自己前进的速度。

1.你认为你的学位足够了

你有定量领域的硕士学位,甚至可能是博士学位。现在,您想要在数据科学方面领先一步。

但是你以前用过贝壳吗?当您遇到错误时,您是否感受到了来自命令行界面的威胁?您是否曾经使用过大型数据库——万亿字节规模的数据库?

如果你对这些问题中的一个回答“不”,你还没有准备好。你需要一些真实世界的经验,建立一些真实的项目。只有这样,你才会遇到作为数据科学家每天都会遇到的问题。只有这样,你才能掌握解决问题的技巧。

祝贺你获得学位。现在开始努力工作吧。

[## 没有量化学位能成为数据科学家吗?

一个故事和一些见解

towardsdatascience.com](/can-you-become-a-data-scientist-without-a-quantitative-degree-8046e254fa48)

2.你缺乏激情

你曾经在一个极客项目上投入了整个周末吗?你有没有在你的朋友出去聚会的时候花了一晚上浏览 GitHub?你有没有因为宁愿编码而对自己最喜欢的爱好说不?

如果你不能用“是”来回答以上任何一个问题,那么你不够热情。数据科学是关于面对真正困难的问题,并坚持下去,直到你找到解决方案。如果你不够热情,你会在第一个困难面前退缩。

想想是什么吸引你成为一名数据科学家。是光鲜亮丽的职称吗?或者是通过挖掘大量数据来寻求见解的前景?如果是后者,你的方向是正确的。

没有最起码的激情,你不会成功。布鲁克·卡吉尔在 Unsplash 上的照片

3.你还不够疯狂

只有疯狂的想法才是好主意。作为一名数据科学家,你需要很多这样的东西。你不仅需要接受意想不到的结果——它们经常发生!

但是你也必须为真正困难的问题开发解决方案。这需要一种超乎寻常的水平,是你用正常的想法无法完成的。

如果人们不断地告诉你,你疯了,你正朝着正确的方向前进。如果没有的话,你需要努力克服你的疯狂。

当然,这需要一些勇气。一旦你发泄出你的怪癖,有些人会挠头,背对着你。

但是值得。因为你对自己真实。你点燃了作为一名数据科学家所需要的伟大火花。

4.你从教科书和网络课程中学习

不要误解我。教科书和在线课程是一个很好的开始方式。但仅仅是为了开始!

你需要尽快着手真正的项目。当然,如果不能用 Python 编写一行代码,构建 Python 项目是没有意义的。但是一旦你建立了一个适度的基础,就开始行动吧。

边做边学是关键。

开始构建您的 GitHub 投资组合。参加一些黑客马拉松和 Kaggle 比赛。写下你的经历。

每个人都可以做教科书。要成为数据科学家,你必须做得更多。

5.你认为你可以在某个时候停止学习

您已经订阅了一些关于数据科学的在线课程,并且正在阅读一些教科书。现在你认为一旦你掌握了这些,你已经学到了足够的东西来突破数据科学。

不对。这还只是开始。如果你认为你现在学到了很多,想想三年后你会学到多少。

如果你最终成为一名数据科学家,你将会学到比现在多十倍的东西。这是一个不断变化的领域,不断需要新技术。如果你一旦找到工作就停止学习,你的轨迹将会从一个数据科学初学者变成一个糟糕的数据科学家。

如果你想在数据科学方面出类拔萃(如果你正在阅读这篇文章,你就会这么做),你需要面对这样一个事实:随着时间的推移,你的学习曲线将变得更加陡峭。如果你不喜欢大规模学习,就不要梦想成为数据科学家。

做一个数据方面的极客是不够的。在 Unsplash 上科学高清拍摄的照片

6.你没有其他领域的专业知识

所以你对计算机科学略知一二,你的数学技能也没那么差。你能在数据科学领域找到工作吗?

不,你不会。你在 IT 和数学方面的技能是必不可少的,但不足以让你从所有其他数据科学爱好者中脱颖而出。

数据科学家在各种公司和各种行业工作。为了给你的客户提供关键的见解,你需要了解他们的领域。

例如,下面故事中的 Kate Marie Lewis 在六个月后获得了数据科学领域的一个职位。但与众不同的是,作为一名神经科学家,她拥有医疗保健领域的知识。

[## 我如何在 6 个月内从零编码技能成为数据科学家

我用来自学数据科学的 4 个工具没有花一美元

towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3)

你擅长哪个领域?你在哪些领域有经验?

试着把自己定位成你所在领域的专家,而不是普通的数据科学家。这才是你真正找到工作的方式。

7.你缺乏商业技能

所以你更喜欢分析。你喜欢数字和定量分析,你讨厌软技能和人际交往。

这并不能让你成为一个好的数据科学家,我的朋友。即使在定量工作中,软技能也很重要。软技能最终会让你在面试中胜出。

[## 每个数据科学家都需要向商业领袖学习什么

因为软技能很重要。

towardsdatascience.com](/what-every-data-scientist-needs-to-learn-from-business-leaders-47dcf3204076)

在你能获得的所有软技能中,你的商业技能需要提高。记住你的客户是商业领袖。因此,他们需要懂商业的人。只有这样,你才能产生为客户增值的洞察力。

8.你没有有意义的联系

你想在这个领域找到一份工作,但你不认识任何数据科学家同事?是时候开始了,我的朋友。

去聚会。加入 LinkedIn 上的相关群组。了解黑客马拉松上的人。在 Twitter 上关注合适的人。会见 GitHub 项目的其他贡献者。做点刺激的事!

就像任何求职一样,你 90%的成功并不取决于你的技能有多强。这取决于谁能为你提供参考,谁能给你介绍。

如果你在 LinkedIn 上的联系仅限于你妈妈和你那份没有前途的工作的同事,那么是时候提升你的个人资料了。如果你在 Twitter 上的追随者屈指可数,那就发微博吧。如果你的博客没有读者,试试 SEOing 和跨平台营销。

联系会来的。但是你需要先开始破解。

见面吧。合作。建立你的人际网络。布鲁克·卡吉尔在 Unsplash 上的照片

9.你不喜欢脏活累活

你已经听到了所有关于机器学习和人工智能的嗡嗡声。你认为数据科学可以打开与尖端技术合作的大门。

也许你会。但我向你保证,你做这件事的时间不会超过你时间的 5%。

一旦你找到了理想的工作,你会花大部分时间清理数据。恭喜你,你刚找到一份看门人的新工作!

如果你不喜欢,回家吧——你不应该读这篇文章。如果你看完这些还想成为一名数据科学家,那你是时候爱上这份脏活了。

[## 数据科学家:21 世纪最肮脏的工作

40%的吸尘器,40%的看门人,20%的算命师。

towardsdatascience.com](/data-scientist-the-dirtiest-job-of-the-21st-century-7f0c8215e845)

数据科学不是职业选择。这是一种职业

数据科学家是非常受欢迎的人——这使得许多人涉足其中。但是要想在这个领域获得一个职位,仅仅涉猎是不够的。你需要努力工作。

如果在读完这个故事后,你仍然坚信要成为一名数据科学家,那么恭喜你。你可能会走上一条非常好的道路。

如果此时你对成为一名数据科学家不确定,找出你怀疑的最大原因。然后开始在这些点上努力。你能做到的!

Web 应用程序的安全代码评审最佳实践

原文:https://towardsdatascience.com/9-secure-code-review-best-practices-for-your-web-application-28a519b079e9?source=collection_archive---------42-----------------------

由 Unsplash 上的émile Perron拍摄的照片

由于不断增长的客户需求和快速的、特性驱动的开发,安全性经常被置于次要位置,漏洞被引入并且经常未被发现。

安全的代码审查有助于识别这些安全漏洞和弱点,否则这些漏洞和弱点可能不会被发现。它将一组安全标准应用于代码,以确保遵循安全的编码最佳实践和开发。

安全代码审查使用自动化工具、清单、线程建模、软件开发经验和安全经验来识别可以减轻的安全漏洞。

9 安全代码评审最佳实践

安全代码审查应该成为软件开发生命周期(SDLC)的一部分。

以下是您应该遵循的一些最有效的安全代码审查最佳实践:

1.创建全面的安全代码审查清单

每个软件解决方案都有自己的安全需求和特性,因此代码审查可能因软件应用程序的不同而不同。

拥有一个全面的安全代码审查清单有助于确保您不会遗漏关键项目,并执行彻底的代码审查。

以下是在进行安全代码审查时应该考虑的一些问题:

  • 您是否实施了适当的授权控制?
  • 您是否实施了适当的身份验证控制?您有双因素或多因素身份认证吗?
  • 敏感数据加密了吗?你如何处理加密密钥?
  • 错误消息是否向用户显示敏感信息?
  • 您是否有其他安全控制措施来防止 SQL 注入、XSS 攻击、恶意软件等?

这些只是您可能希望包含在安全代码审查清单中的几个问题。请记住,清单在许多情况下可能不是详尽的,但是它可以为代码评审者提供方向,并帮助他们执行有效的安全代码评审,并交付高质量和安全的代码。

2.不断回顾

对于公司来说,定期执行安全的代码审查是非常重要的,以确保每当对代码进行重大更改时,它都得到有效的审查。

安全的代码审查不需要您等待开发过程完成。相反,您可以在开发过程中执行代码审查。

通过定期检查您的代码,您可以识别可能被攻击者利用的漏洞或漏洞,并及时修复它们。它还增强了代码的整体安全性,并产生了更高质量的代码,使未来的实现变得快速、简单且负担得起。

3.使用威胁建模

威胁建模使组织能够识别威胁并制定有效的响应措施。拥有结构化的威胁建模流程有助于检测、理解和交流威胁和缓解措施,从而保护应用程序资产。

威胁建模可以在规划、设计、开发和/或后期部署阶段进行。它不仅有助于识别风险,而且有助于团队更好地理解应用程序各种组件之间的关系。

随着应用程序的环境和设计在整个项目生命周期中不断变化,了解组件如何与产品互连是很有价值的。这可以帮助您更好地理解安全威胁和风险。

4.使用自动化工具来节省时间(但是不要让自动化做所有的事情)

自动化工具可以发挥至关重要的作用,尤其是在保护软件时,因为您拥有的代码,您的代码审查在逐行检测代码缺陷时可能效率较低。

对于由成千上万行代码组成的应用程序来说,在合理的时间内手工一行一行地执行全面的代码审查是不可能的。

自动化工具实现了简化的流程,最大限度地减少了人工干预,使他们能够专注于需要逻辑或业务分析的更复杂的任务。自动化静态代码分析工具提供了几乎完整的代码覆盖,以及揭示漏洞的能力,如果手动检查,这些漏洞可能不会被发现。

例如,如果静态代码分析工具发现了一个 SQL 或 XSS 注入漏洞,它可能会导致在代码库中搜索类似的漏洞模式,这是一项耗时的任务,如果手动完成,几乎不可能完成。

虽然您可以在许多事情上依赖自动化,但您不能在所有事情上都依赖它。尽管自动化提供了许多好处,但它也带来了一定的挑战,例如,在自动化不能可靠检测的许多其他缺陷中,自动化不能发现设计和架构缺陷。

由于自动化工具没有对业务流程的正确理解,它们无法发现逻辑区域中的缺陷。除此之外,自动化还会产生许多误报,这会破坏整个测试过程,因为审查人员必须手动检查这些已识别的漏洞。

5.利用应用安全专家的专业知识

虽然自动化工具在执行时间密集型任务(如在大规模代码库中搜索易受攻击的代码模式)时比人类工具更有效,但它们在许多其他方面都有不足。

这就是为什么应用程序安全专家需要将安全代码审查过程结合在一起,并为其提供清晰性和上下文。在 web 应用程序的安全代码审查中,安全分析师或代码审查者的经验和知识是不可或缺的。例如,在代码审查需要他们识别应用程序逻辑问题的任务中。

但是,您可以利用安全专业人员和自动化工具的优势来推进您的安全代码审查过程,允许安全团队确定一系列全面的风险和漏洞。

6.验证您的输入和输出

安全代码审查的主要部分是分析软件的攻击面。攻击者通常使用输入和输出来利用应用程序的漏洞,获取信息或进行其他恶意活动。

主要目标是识别和检查来自所有不可信数据源的各种输入,并验证输出。通过验证输入,可以确保应用程序正确处理不可信的输入,这样潜在的恶意输入就不会被用来攻击应用程序..

通过验证输出,您可以确保您的应用程序不会损害从您的应用程序接收数据的最终用户或其他系统。

输入可能来自 cookies、数据馈送、服务响应、命令行、平面文件、属性文件、环境变量、外部进程和浏览器。检查信息系统输入的有效语义和语法(如字符长度、集合、可接受值和数值范围),以确保输入符合指定的内容和格式标准。

输入验证有助于确保准确的输入,并防止攻击,如 SQL 注入、跨站点脚本和各种其他注入攻击。因此,应用程序在处理输入数据之前对其进行验证至关重要。

此外,当您将输出数据发送到用户的 web 浏览器、网络、文件或其他地方时,您需要确保发送的数据是安全的。

7.强制最低特权

另一个安全代码最佳实践包括最低权限模型的实现,该模型允许授权用户专门访问他们执行工作职能或任务所需的信息。例如,负责维护客户记录的用户帐户不需要访问其他员工的财务记录。

令人惊讶的是, 2019 年全球数据风险报告显示,超过 22%的文件夹对每个员工开放。这些文件夹可能包含敏感数据,恶意的内部参与者可能会使用这些文件夹在其组织中实施数据泄露。因此,实现最低特权访问模型非常重要。

在某些情况下,如果用户需要管理员权限或更高权限来访问特定数据,则必须仅在完成任务所需的最短时间内提供该权限。最低特权模式显著降低了未授权或不必要的网络特权使用所造成的危害范围。

8.开展安全应用程序开发培训

随着越来越多的数据泄露事件发生,网络安全专家试图跟上最新的技术和工具,以确保安全的应用程序或系统。但是不仅仅是安全团队应该负责维护软件的安全性。

定期举办关于安全应用程序开发的培训会议,向您的开发人员介绍安全编码,以及他们如何使用安全编码来改进软件开发过程,同时减少代码漏洞。

安全的应用程序开发将有助于在开发过程的早期识别和降低风险,从而进一步降低数据泄露和网络攻击的可能性。

9.管理您的漏洞

安全的代码审查可能会揭示一系列安全风险和漏洞。识别、评估、缓解和报告系统和运行于其上的软件中的这些安全漏洞非常重要。

管理您的漏洞对于组织确定潜在威胁的优先级并最大限度地减少其攻击面至关重要。

一些扫描工具还包括漏洞修复,它根据漏洞的风险和严重性对漏洞进行分类和分级。这通常通过将漏洞与安全策略进行比较来完成。

随着应用程序的每一次变化,都有可能在您的软件中打开一个潜在的漏洞,被攻击者利用。这可能会影响贵公司的市场声誉和可信度。

最后的想法

安全代码审查是一个耗时的过程,可以利用自动化工具的优势和安全专业人员的专业知识来有效地执行。

安全的代码审查通常会揭示代码的许多细节。除了发现新的安全风险或学习新技术,您还可以检查您的开发团队如何处理编码。可以采用更好的实践来进行更精确和有效的代码审查。

如果您对这些安全代码审查最佳实践有任何疑问,或者在安全代码审查方面需要任何帮助,请联系我们。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

解决数据科学问题的 9 个步骤

原文:https://towardsdatascience.com/9-steps-for-solving-data-science-problems-dc3c238cb58c?source=collection_archive---------19-----------------------

机器学习过程

为了解决你的组织中的任何机器学习问题,你今天必须采取的步骤的列表。

帮助开发美国人口普查局和劳工统计局使用的抽样技术的美国统计学家 w·爱德华兹·戴明曾经说过:

“如果你不能把你正在做的事情描述成一个过程,你就不知道你在做什么。”

错综复杂的数据科学世界

在学习机器学习时,我总是面临这个问题,不知道任何数据科学过程的确切步骤顺序。肯定有很好的资源以复杂的细节和方式解释每个步骤,但是没有一个资源可以给我整个过程的鸟瞰图。在从许多不同的来源学习了所有的步骤后,我给自己写了这个包含九个步骤的过程,我想在这里分享一下。

这是一个高层次的介绍,关于每个步骤的更多细节,建议使用可用的文献进行深入研究。在阅读本文之前,假设读者熟悉一些机器学习技术和相关文献。

第一步:问题公式化

满载着机器学习算法的知识,很容易忘记机器学习的目的是在数据的帮助下解决问题。这既可以包括预测分析,试图预测未来,也可以包括探索分析,试图回答事情是如何以及为什么会发生的问题。我们使用数据科学并不是因为我们想使用 TPU 来应用一些复杂的神经网络,而是简单地想回答一些问题,这些问题将有助于我们的组织、我们的国家和我们的星球变得更好。因此,从你想用你的数据得到的答案开始是绝对重要的。

第二步:数据清理

一旦你知道了问题陈述,清理数据是很重要的。有统计说,数据科学 80%以上的时间都涉及数据清洗。数据清理可以确保数据输入是否正确,是否存在拼写错误,或者是否在不同的地方使用了不同的输入信息模式,例如,包含重量信息的列是磅还是千克。

数据清理中最重要的主题之一是缺失值处理。根据所考虑的问题,可以选择删除缺失的值,或者用零或剩余列的平均值来替换它们。哪种方法是最好的可以讨论,但是大多数情况下,重新审视我的业务问题来做决定是有帮助的。

第三步:探索性数据分析

一旦清理了数据,通过鸟瞰来理解数据是很重要的。我通常首先查看变量的数据类型,看看它们是否与它们应该匹配的内容相匹配。我做的第二步是观察感兴趣变量的分布。我也看到了有多少分类变量和数字变量。计算一些统计数据,如平均值、中位数、四分位数,也有助于理解数据。根据不同的用例,检查一些变量是否相互关联也是有帮助的。来自统计的自相关和多重共线性测试在这里帮助了我。很多时候,一些简单的问题可以通过查看图表直观地得到答案。在分析 NASA 翼型数据时,我通过查看 pair-plot 发现,在这种情况下,线性回归可能不是最好的机器学习算法。我最喜欢的可视化库是 Seaborn ,它建立在 Matplotlib 之上,所以 Matplotlib 的所有功能也都在那里。

第四步:数据准备和预处理

许多机器学习算法,如支持向量机,在使用之前需要对数据进行预处理。分类变量的编码也需要在它被吸收到模型中之前进行。sklearn 提供了许多内置的预处理类,如 MinMaxScaler()StandardScaler() 。一个热编码也可以使用熊猫的 get_dummies() 函数来完成。取决于机器学习算法,该步骤可能不总是需要的。

步骤 5:特征选择

您将获得的数据集的大小会有所不同。为了回答一些商业问题,人们可能不需要所有的变量(或特征)。在这个阶段,与专家交谈是一个谨慎的决定。根据他们的判断,您可以节省很多时间来决定在模型中保留哪些特性和删除哪些特性。另一种策略可以是使用机器学习算法中内置的函数来查看特征在解释模型中可见的可变性方面的相对重要性。第三个非常科学的策略是使用应用机器学习。这可能是违反直觉的,因为有人可能会问,当我们想为我们的模型使用 ML 时,怎么可能使用 ML。主成分分析可用于从数据集中提取重要特征。

特征工程不同于特征选择。我发现在 Stackexchange 上的这个帖子在这种情况下非常有帮助。

第六步:模型开发

这可能是数据科学家群体中最著名的一步。根据问题的不同,可能需要使用监督学习算法或非监督学习算法。有些算法比较快,有些比较慢。目前,随机森林和梯度增强随机森林在解决一些最大的机器学习问题方面非常流行。如果你能负担得起时间和金钱,在这个阶段使用 TensorFlow 使用神经网络也可以是一个非常好的决定。

第 7 步:超参数调整和交叉验证

这是机器学习过程中我最喜欢的部分。尽可能以最好的方式制作模型是非常重要的。过拟合和欠拟合都是模型开发过程中的严重问题。使用错误的技术和错误的参数可能会使宇宙的概括过程变得困难。在 sklearn 中使用 GridSearchCV 有助于在制作 ML 模型时同时执行超参数调整和交叉验证。sklearn 网站上关于这个技术的例子有助于理解整个过程。使用调整过的超参数赋予机器学习算法能力,以便以可能的最佳方式执行。

步骤 8:模型评估

调优了超参数并检查了准确性得分之后,是时候详细评估模型了。混淆矩阵、精确度、召回率、准确度和 f 分数是用于分类问题的一些最重要的度量。本文和关于 KDNuggets 的介绍对它们进行了详细精彩的讲解。对于回归问题,R 平方可以是模型评估的良好度量。大多数情况下,当我仔细执行上述七个步骤时,我的评估矩阵对我的模型和超参数选择给出了满意的回答。

第九步:沟通

最后也是非常关键的一步,就是用相关受众理解的语言,将机器学习算法的结果传达给他们。大多数时候,管理层对查看 ROC 曲线和 AUC 不感兴趣。作为一名数据科学家,他们会对你对他们所提问题的建议感兴趣。无论你是一个多么优秀的数据科学家,如果你不能影响你的观众,你的算法只会停留在你的电脑上,而不会在现实世界中使用。因此,结果的交流是数据科学过程中极其重要的一步。

我希望我能用九个简单的步骤向你解释数据科学的过程。如前所述,并非所有步骤都是必需的,有些步骤必须再次执行才能达到最佳状态。这个列表是详尽的,因为所有更好的技术总是可以按照给定的顺序进行整合。如果你看到有人可以改变这一点,让我知道,我很乐意编辑我写的内容。

模型训练过程中的 9 个步骤需要一个序列

原文:https://towardsdatascience.com/9-steps-in-model-training-process-that-demands-a-sequence-7672a95fcf79?source=collection_archive---------56-----------------------

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

不仅仅是模特训练,生活中的每件事都需要一个顺序。举一个点燃煤气炉的例子:

1)你打开通往炉子的煤气管道阀门。

你打开炉子的旋钮。

3)你传递一个火花去点燃它。

能不能把上面三个步骤重新排一下,还能点炉子?答案是否定的,尝试任何组合,比如先传递一个火花,然后打开炉子的旋钮&然后排好煤气管道。是的,你猜对了,不会有火焰。工程师通常定义操作机器的顺序,他们称之为 sop(标准操作程序)。操作泵的一个简单的标准操作程序是首先将吸入口和排出口排成一行,然后打开它。sop 的定义是为了使流程顺畅、高效、无差错。有些工作非常关键,不定义 SOP 或顺序会造成混乱。

在本文中,我们将讨论在机器学习中模型训练过程的相同程序。我们将考虑一个使用湿度、温度等各种预测因子通过线性回归进行降雨量预测的例子。像其他工程过程一样,顺序在这里也很重要。我们可以称之为“模型训练的一个 SOP”。那么,让我们开始吧。

第 0 步:加载模块

我们将从零开始。零,因为这个步骤的位置在这个地方并不重要,你可以根据需要运行它。步骤是首先导入您认为在培训过程中需要的所有必要的模块和类。您在这里错过的任何内容也可以在以后导入。我们这里需要的模块和类导入如下:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

第一步:加载数据

模型训练过程的第一步是获取、查看和理解训练过程中所需的数据。我们将要使用的数据是带有湿度、温度等预测因子的降雨量数据。如前所述。我们将使用 pandas read_csv 函数来导入数据帧,并使用 head 函数来查看它

df = pd.read_csv(‘rain_data.csv’) print(df.shape)
df.head()

我们先来了解一下数据。这是 10 个国家的数据,它们的名称被标记为 A、B、C…J。因变量是 rain _ AMT,它提到了与特定国家对应的降雨量(mm)。自变量是温度(摄氏度)、湿度(百分比)、风速(高或低)和国家的识字率。数据框的形状是(10,6),这意味着它有 10 行 6 列。

第二步:删除不必要的特征

去掉不必要的功能。您的数据框可能包含许多自变量,您的直觉和经验告诉您这些自变量与因变量无关,因此是不需要的。去除这些额外的信息是必要的,因为为什么要携带垃圾。

在我们的数据框架中,我们不需要国名和识字率,因为这两个变量与降雨量无关。

df.drop([‘Country’,’Literacy_rate’], inplace = True, axis = 1) df.head()

第三步:处理缺失数据

处理丢失的数据。不是每个数据集都是干净的。缺失的价值观无处不在。有必要预先处理丢失的值,以便它们不会影响流程的其余部分。您可以用多种方法处理缺失值。您可以删除包含缺失值的整行,也可以用某个常量值或某个统计值等来替换它们。

让我们首先检查数据框中是否有缺失值:

df.isnull().sum()

我们在湿度栏下缺少一个值。让我们用湿度的平均值来代替它:

df[‘Humidty’].fillna(df[‘Humidty’].mean(), inplace = True)df.isnull().sum()

我们的数据现在没有丢失的值,因此我们可以继续。

第四步:分离出变量

从你的数据集中分离出因变量。既然丢失的值都不见了,是时候分别查看因变量和自变量了。为什么会这样,你会知道的。

在我们的数据框架中,rain _ AMT 列包含因变量的数据,其余变量是独立的。我们把降雨量 _amt 分离出来,称之为 Y.

Y = df.pop(‘Rainfall_amt’) 
print(Y) 
df.head()

第五步:处理分类变量

模型训练程序无法处理分类变量;它需要数字来处理它们。所以是时候处理分类变量了。您可以用数字替换分类值,比如用 0 替换女性,用 1 替换男性,或者您可以使用一键编码,只要适合您。

我们的数据框包含 Wind_speed 列下的分类值。让我们用一键编码来编码它们。

df = pd.get_dummies(df)
df.head()

风速列被分成两列,风速高和风速低。值 1 表示存在,0 表示不存在。

第六步:拆分数据

将数据分为训练集和测试集。根据具体情况,该步骤可以被认为是可选的。在没有向我们提供测试数据文件的场景中,我们需要分割提供给我们的数据,以制作测试数据框架,用于稍后测试我们的模型。

我们的数据帧只有 10 行,因此对其进行分割是不实际的,但我们仍将以 70:30 的训练:测试比率对其进行分割,以理解这一概念。

x_train, x_test, y_train, y_test = train_test_split(df, Y, test_size = 0.30)

第七步:训练模型

这是使用期待已久的拟合模型功能的时候了。到目前为止的等待和上面的 7 个步骤都是值得的。因此,让我们在训练数据上拟合回归模型:

lr = LinearRegression() 
lr.fit(x_train, y_train)

第八步:特征选择。

这一步是最重要的,也是经常被业余爱好者忽略的。当你有了合适的模型,是时候计算哪些特征或独立变量对你的模型真正重要了。总之如果可能的话,我们再废话少说。

特征选择是一个广泛的话题,涉及许多技术。大多数专家会争论这一步的位置是否符合模型。我们将把这一部分留在没有代码的地方,并把它当作一项任务,让读者了解更多。你可以先阅读的这篇文章

第九步:计算分数

使用测试数据集进行预测并计算指标,以了解拟合模型的表现。我们将计算均方差来了解相同的情况。

print(‘The mean square error is ‘,mean_squared_error(lr.predict(x_test),y_test))

以上所有步骤将构成一个典型的培训标准操作程序。这个序列有它自己的含义。像煤气炉的例子,我们不能只是重新安排步骤,继续进行。例如,假设步骤 4:步骤 3:【处理缺失值】之前,您将拥有独立变量和因变量的独立数据。现在,如果在处理缺失值时,这里或那里的几行数据帧被丢弃,这将导致数据帧长度不匹配,并将产生错误。如果碰巧连大小也匹配,这可能会在模型中产生偏差,想象一下删除因变量数据中的第 3 行和自变量数据中的第 5 行。它要么产生错误,要么使结果和模型产生误导。整个过程顺序如下图所示:

上述步骤可以形成递归训练过程的一个循环。大多数时候,我们最后得到的分数并不令人满意,因此整个过程一次又一次地重复。

我希望你喜欢这篇文章。请发表您的评论。如有任何疑问,您也可以通过 LinkedIn联系我。

谢谢,

祝你玩得愉快😊

这篇文章也发表在茶统计上

关于 jupyter 笔记本你不知道的 9 件事

原文:https://towardsdatascience.com/9-things-you-did-not-know-about-jupyter-notebook-d0d995a8efb3?source=collection_archive---------14-----------------------

用这些建议提高你的工作效率

图片来自 Pixabay 的像素

作为一名数据科学家,您将每天使用 jupyter notebook。尽可能熟悉这个工具是至关重要的。

在本文中,我将分享一些我在使用这个工具时使用的 Jupyter 笔记本技巧。这些提示将帮助您更加熟悉笔记本电脑本身,并提高您的工作效率。

让我们开始吧。

1。你可以从 jupyter 笔记本运行 shell 命令

你们中的许多人将熟悉在 Jupyter notebook 中运行 python 代码,并使用 markdown 来创建描述和文本。有些人可能不知道您可以从笔记本本身运行 shell 命令。

为此,您可以在代码单元格中输入命令。该命令的格式与它在 shell 中的格式相同,但是它还附加了一个感叹号(!).

例如,您可以将安装包与 pip 一起使用。

!pip install pandas

或者您可以检查您安装的软件包的版本。

!pip show pandas

您还可以使用标准 shell 命令,例如:

!pwd
!ls

所有这些都不需要打开外壳本身。这意味着在笔记本和终端之间切换不会浪费时间!

2朱庇特笔记本有魔法命令。

如果您使用 shell 命令,您会注意到有些命令无法执行。这种情况的一个例子是“cd”命令。为了证实这一点,您可以在 jupyter notebook 中运行以下代码。

!pwd
!cd <directory name>
!pwd

请注意,第一个和第二个“pwd”命令将产生相同的路径。原因是这些 shell 命令是在临时子 shell 中执行的。

为了有效地更改目录,您将需要一个神奇的命令。

%cd <directory>

魔术命令是帮助你运行和分析你的笔记本中的数据的特殊命令。如果它们在一行代码中,则按%处理;如果它们写在几行代码中,则按%%处理。

最有用的魔术命令之一是列出所有魔术命令的命令。

%lsmagic

解释所有神奇的命令需要整篇新文章,所以让我们仅限于几个例子。

您可以在 jupyter 笔记本上运行 python 文件,方法是:

%run <file name>

或者可以用下面的代码来计时单元格的执行。

%% time

<your code>

你可能见过这个神奇的命令,但不知道它是什么。

%matplotlib inline

以上确实是一个几乎伴随每一个笔记本的神奇命令。它用于在笔记本本身中呈现您的图形。

3。您可以使用快捷方式更快地浏览笔记本。

您是否使用图形用户界面浏览过笔记本电脑?

停下来。

是时候学习 jupyter 笔记本快捷键了。您可以使用“Enter”和“Esc”在命令和编辑模式之间切换。

进入命令模式后,您可以使用以下快捷键:

  • 在当前单元格上方添加一个新单元格,
  • b 在当前单元格下方添加一个新单元格,
  • d + d (d 按两次)删除当前单元格,
  • m 将单元格从编码改为降价,
  • y 将单元格从 markdown 改为 code,
  • 上下箭头使用箭头改变当前单元格,
  • shift + enter(同时按下)运行单元格中的代码。

还是不确定怎么做?我过去写过一篇文章对此有更好的解释。

[## Jupyter 笔记本键盘快捷键,适合初学者

使用 Jupyter 笔记本编辑器时,了解提高工作效率的最重要的快捷方式。

medium.com](https://medium.com/towards-artificial-intelligence/jupyter-notebook-keyboard-shortcuts-for-beginners-5eef2cb14ce8)

4。您可以用分号取消 final 函数的输出。

如果您已经使用 Jupyter notebook 有一段时间了,您可能已经注意到它会自动呈现单元格执行的最后一个函数的输出。这通常是我们想要的行为,但不是在所有情况下!

在笔记本里渲染图形的时候特别烦人。我们来看正弦函数作图的例子。

%matplotlib inline

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting sin function
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)

plt.plot(t, s);

如果您在 Jupyter 笔记本中运行此命令,您将得到类似于以下内容的输出:

请注意,我用红色标记了该图的输出。这些信息通常与我们的分析无关,我们可以通过在代码块的最后一行添加一个分号来隐藏它。

plt.plot(t, s);

5。Jupyter 笔记本具有内置的自动完成功能。

你们中的一些人可能已经知道了,但是对于那些不知道的人来说,这将是一个非常有用的特性。为了使用它,您可以开始键入代码,然后按“Tab”按钮,以便查看自动完成建议。

如果您想了解更多关于自动完成的细节,请查看这篇文章。

[## Jupyter 笔记本自动完成

数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…

towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c)

6。您可以将 jupyter notebook 导出为 HTML 文件。

您可能已经注意到,Jupyter 笔记本保存为。ipynb 文件。如果你把这个发给一个数据科学家或者程序员,他们可能会毫无问题地打开它。

但是如果你想和非技术人员分享你的笔记本会怎么样呢?您可以向他们发送 HTML 版本,他们将能够看到您笔记本的渲染版本。

这很简单。只需导航到文件-> Downloas as -> .HTML。

7。您可以从 Jupyter 笔记本创建演示文稿。

您是否使用过 Microsoft PowerPoint 或 Google slides 来创建演示文稿?虽然这些都是不错的选择,但可能还有更好的方式来制作技术演示文稿。

您可以使用 Jupyter 笔记本本身创建演示文稿。这样做的好处是,您可以重复使用笔记本中已经使用过的内容。它允许您选择要用于演示文稿的单元格、如何组织它们以及跳过哪些幻灯片。

当您的笔记本准备就绪时,您可以通过进入“视图”->“单元格工具栏”->“幻灯片”来创建演示文稿。

一旦你这样做了,每个单元格的右上角应该有一个幻灯片类型选项。你可以选择销售是幻灯片,子幻灯片,片段,笔记,或跳过决定跳过它。

决定每种幻灯片类型后,您可以通过在终端窗口中运行以下命令来呈现您的演示文稿:

jupyter nbconvert <notebook name> --to slides --post serve

或者从笔记本上运行下面的命令。

!jupyter nbconvert <notebook name> --to slides --post serve

这应该会在本地主机上运行的新选项卡中呈现演示文稿。

您可以使用右下角的箭头浏览演示文稿。

适应 Jupyter 笔记本演示需要时间,因此我建议您尝试一下不同的幻灯片类型,以便学习如何有效地使用它们。一旦您掌握了它,jupyter 笔记本可能会成为您创建技术演示文稿的首选工具。

8。你可以在 Jupyter 笔记本上用 LaTeX 做公式。

这是一个简单的提示,可以让你在笔记本上输入数学公式。您可以使用 LaTeX 语法创建一个公式,然后将其嵌入到 markdown 单元格中。

让我们来看一些例子。实际上,有几种方法可以做到这一点,这取决于您希望公式呈现的位置。

如果你想让数学代码与文本一致,你可以使用一个美元符号。

This is an example of $\sqrt{2}$

或者,如果您希望公式呈现在单元格的中间,您可以使用两个美元符号($$),如下所示。

$$\sqrt{2}$$

看看这个更复杂的公式,看看它在笔记本上渲染的有多漂亮!

$$\sum_{i=1}^{n}i=\frac{n(n+1)}{2}$$

9。您可以安装扩展来进一步增强 Jupyter 笔记本的功能。

你觉得 Jupyter 笔记本的能力不够吗?实际上,您可以安装扩展来访问一些附加功能。

不久前,我写了一篇文章,介绍了我最喜欢的 jupyter 笔记本扩展。

[## 9 大 Jupyter 笔记本扩展

改进笔记本电脑功能,提高您的工作效率

towardsdatascience.com](/top-9-jupyter-notebook-extensions-7a5d30269bc8)

如果您想了解如何在笔记本中启用扩展以及如何使用以下扩展,请阅读本手册:

  • 拼写检查器,
  • 目录,
  • 可折叠标题,
  • Autopep8,
  • 执行时间,
  • 切换所有行号,
  • 变量检查器,
  • 隐藏代码,
  • 跳过追溯。

总结

这些是我最喜欢的 Jupyter 笔记本实用技巧。这是一个令人惊奇的工具,遗憾的是有时我们没有使用它的所有功能。

我希望你已经学到了一些新的东西,并且下次你在吃 jupyter 笔记本的时候能够复制一些技巧。

原载于 aboutdatablog.com: 关于朱庇特笔记本你不知道的 9 件事,2020 年 9 月 23 日。

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

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

* [## 最佳数据科学书籍

帮助您学习数据科学的前三本书

towardsdatascience.com](/best-data-science-books-be1ab472876d) [## 作为一名有抱负的数据科学家,你应该关注的中型作家

我最喜欢的 10 个数据科学博主,让你的学习之旅更轻松。

towardsdatascience.com](/medium-writers-you-should-follow-as-an-aspiring-data-scientist-13d5a7e6c5dc) [## 数据科学家的终端

学习你的第一个命令

towardsdatascience.com](/terminal-for-data-scientists-3615159e936c)*

关于 Scikit 你应该知道的 9 件事-学习 0.23🎉

原文:https://towardsdatascience.com/9-things-you-should-know-about-scikit-learn-0-23-9426d8e1772c?source=collection_archive---------45-----------------------

了解 Python 机器学习库的最新版本

Scikit-learn 版本 0.23.0 于 2020 年 5 月 12 日发布。以下是你应该知道的最重要的变化,这样你就能给你的书呆子朋友留下深刻印象。🤓

资料来源:pixabay.com

需要注意的 9 处变更

1.仅限 Python 3.6 或更高版本🐍

使用 scikit-learn 0.23 需要 Python 3.6 或更高版本。不再有 Python 3.5。这是升级的好借口,如果你需要的话。🙂

2.交互式管道图形⬇

现在,您可以在笔记本电脑中以交互式图形的形式直观显示您的管道。数据从上到下流动。从技术上讲,你是在可视化一个 DAG(有向无环图)。这里有一个例子:

你可以在 GitHub 这里看到这篇文章附带的代码。

只需添加以下代码,制作并安装一个管道,图形就出现了!😀

sklearn.set_config(display=”diagram”)

管道是 scikit 的一大特色——学习!管道和列转换器功能强大,但对于新手来说可能很难掌握。这些图表可以帮助人们更快地学习和理解正在发生的事情。👏

一个ColumnTransformer对象允许不同的转换应用于不同的特征。我建议你用make_column_transformer方便法创建它们。注意,如果您使用passthrough参数不加修改地传递列,这不会显示在 DAG 上。☝️

3.泊松和伽马射线已经到达🎉

泊松和伽马广义线性模型可以分别用[linear_model.PoissonRegressor](https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.PoissonRegressor.html#sklearn.linear_model.PoissonRegressor)[linear_model.GammaRegresso](https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.GammaRegressor.html#sklearn.linear_model.GammaRegressor)r导入。现在,如果您需要 scipy.stats 或 statsmodels 的功能,您不需要离开 scikit-learn。

泊松回归通常适用于计数数据,伽玛回归通常适用于预测两个泊松事件之间的时间。如果你正在寻找更多关于何时使用伽马 GLM 的信息,请看这篇交叉验证的文章。

4.呼叫fit()并不能显示所有信息🚫

fit()方法返回您调用它的估计器。现在,如果您打印评估程序,将只显示您更改了默认值的参数。

要像在早期版本中一样,在每次打印评估器时显示所有参数,请运行以下代码:

sklearn.set_config(print_changed_only=False)

或者,只需调用估计器上的get_params()方法来查看参数。😀

2020 年 5 月 14 日更新,以澄清措辞。向尼古拉斯拥抱致敬。

5.n_features_in_ 向您显示有多少功能🔢

大多数估算器现在公开了n_features_in_属性来显示有多少特性被传递给了fit()方法。

请注意,使用 OneHotEncoder n_features_in的管道将向您显示有多少功能进入,而不是有多少适合最终模型。☝️

6.更简单的样本数据集加载🧭

大多数样本数据集可以更容易地加载到 pandas 数据框架中。只需通过论证as_frame=True。那么.frame属性就是一个包含 X 和 y 列的数据帧。

例如,以下是加载糖尿病数据集的方法:

diabetes = load_diabetes(as_frame=True)
df_diabetes = diabetes.frame

2020 年 5 月 25 日更新添加。框架属性。 帽子尖到

.data属性是没有目标列的 DataFrame。

.target属性是一系列目标列。

从 scikit-learn 加载数据集曾经有点麻烦。现在比较容易,但还是没有 seaborn 那么容易。请注意,load_boston()返回波士顿住房数据集,但还没有实现as_frame。☝️

波士顿。资料来源:pixababay.com

7.避免键入提示错误⚠️

Scikit-learn 现在可以和 mypy 一起工作而不会出错。如果你使用类型提示,这很好。😀

8.🧪实验班的改进

[HistGradientBoostingRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.HistGradientBoostingRegressor.html)[HistGradientBoostingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.HistGradientBoostingClassifier.html),这两个受 LightGBM 启发的树集成算法,仍处于实验阶段。它们仍然需要特别进口。然而,他们得到了一些改进。与[IterativeImputer](https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html)相同——它仍然是实验性的,并且已经被改进。

9.和新熊猫一起玩更好🐼

说到 scikit-learn 估算器,它们现在接受 pandas 可空整数 dtype 和缺失值——参见我关于 Pandas 1.0 新特性的文章来了解这些。熊猫和 scikit-learn 之间的持续摩擦对我来说是天籁之音。

音乐。资料来源:pixabay.com

0.23.0 版的完整发行说明可从这里获得。这些文档是目前稳定的文档,可以在这里获得。感谢所有为这次发布做出贡献的人!👍

包装

您已经看到了 scikit-learn 0 . 23 . 0 版中 9 个最重要的变化。现在你可以用你的知识打动你的朋友和同事。😉

我希望这个指南对你有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀

我写关于 Python 、 SQL 、 Docker 、数据科学和其他技术主题的文章。如果你对此感兴趣,请关注我并在此阅读更多。如果你想了解最新的数据科学技巧和工具,请订阅我的 Data Awesome 邮件列表。

sklearning 快乐!🚀

命令行的 9 个省时技巧

原文:https://towardsdatascience.com/9-time-saving-tricks-for-your-command-line-c7535f1aa648?source=collection_archive---------16-----------------------

3.充分利用你的历史

变得更快,更伟大。Alex Kotliarskyi 在 Unsplash 上拍摄的照片

H H 你如何写出伟大的代码?通过提高效率。如果你想创造一些很棒的东西,你必须消除那些让你慢下来的时间。只需几个小技巧,你就可以加快工作速度,专注于重要的事情。

1.创建别名

每个 shell 都有一个名为~/.bashrc~/.bash_profile的文件。您将使用哪一个取决于您的系统。本帖详细讲解。

现在想想您经常使用的命令。每次打字都很费力,如果你容易打错字,你会把事情弄糟。这就是别名存在的原因:它们用快捷方式代替了原来的命令。

alias $preferredAlias='$commandToAlias'

例如,我有一个需要经常访问的 Dropbox 文件夹。由于我不喜欢输入太多的字符,我在我的~/.bash_profile中使用了这个别名:

alias topbox="cd ~/Dropbox/top-eft/"

其他一些有用的别名有:

alias mv="mv -i"
alias cp="cp -i"

选项-i表示在覆盖文件之前会有提示。如果你曾经不小心覆盖了一些重要的东西,你知道我在说什么。

如果您使用了很多别名,那么创建一个单独的文件可能是有意义的。只需将你所有的别名打包到一个名为~/.bash_aliases的新文件中。现在,您需要告诉您的原始配置文件别名所在的位置。为此,在您的~/.bash_profile~/.bashrc顶部添加以下行:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

你完了!

无论何时编辑 bash 文件,都要确保运行以下两个相关命令:

source ~/.bash_profile
source ~/.bashrc

这样,你就告诉你的系统从现在开始坚持你的改变。如果你打开一个新窗口,它将自动获取文件。

创建快捷方式,缩短你的工作日。维多利亚·希斯在 Unsplash 上的照片

2.给你的提示拉皮条

您的命令行提示符是您开始工作时看到的第一样东西,也可能是您离开之前看到的最后一样东西。所以根据你的喜好来定制是有意义的。

我是一个极简主义者,所以我只在提示中包含当前目录。因此,在我的~/.bash_profile中,我指定了:

PS1='[\W]$ '

这里的\W是指当前目录,PS1是指提示的变量。其他受欢迎的选项有:

  • 一个时间戳帮助你追溯你的工作。在你的文件中添加\@
  • 如果你在远程服务器上工作,添加你的用户名主机名是有意义的。添加\u和/或\h
  • 如果与您的工作相关,您可以添加外壳外壳版本。将\s和/或\v添加到您的文件中。
  • 一个美元符号 $通常标志着提示的结束。

您也可以用彩色打印您的提示。当您正在生成大量输出(或错误消息…)并且希望看到程序从哪里开始时,这可能会有所帮助。

3.充分利用你的历史

当然,您不希望一遍又一遍地输入相同的命令。当然还有制表符补全——开始键入命令,然后点击tab自动补全。但是如果想要访问您过去的命令呢?有几个选项:

  • 上下箭头可让您浏览最近的历史记录。
  • 如果你想重新执行你最后的命令,输入!!
  • 如果您想从foo开始重新执行上一个命令,请键入!foo。例如,假设我最后一次使用我最喜欢的文本编辑器时,打开了我的配置文件:vim ~/.bash_profile。下一次,我就输入!vim
  • 如果想访问前面命令的参数,可以使用!$。假设我刚刚用 vim 打开了我的配置文件,但是现在我想使用一个不同的文本编辑器。然后nano !$就够了。
  • 如果您记住了一个长命令的中间部分,但却记不住第一个字母,该怎么办?您可以使用ctrl+R搜索命令,然后键入您知道的字母。找到命令后,像往常一样点击enter
  • 如果你想看到你最近发出的大约 500 条命令,只需输入history。通过在 shell 配置中添加HISTSIZE=1000000HISTFILESIZE=1000000,您可以将存储在历史记录中的命令数量更改为一百万个条目。如果你想删除你的全部历史,输入rm ~/.bash_history

你的壳历史是你的朋友。由 David Rangel 在 Unsplash 上拍摄的照片

4.高效利用你的环境

您已经遇到了一些环境变量— PS1HISTSIZEHISTFILESIZE。一般来说,这些是用大写字母书写的变量,它们定义了系统的重要属性。

您可以使用set命令访问它们的完整列表。另一个例子是SHELLOPTS。它列出了在终端会话启动时设置为“on”的所有程序。预设变量的完整文档可在 GNU 文档中找到。

[## 环境变量及其使用方法介绍

对环境变量内部工作的更深入的指导。

medium.com](https://medium.com/chingu/an-introduction-to-environment-variables-and-how-to-use-them-f602f66d15fa)

5.空壳期权利润

你可以用 shell 选项以多种方式定制你的 shell 。要显示所有选项,请在终端中运行以下命令:

bash -O
bash -o

选项-O指特定于 bash shell 的选项,而-o指所有其他选项。

在显示的列表中,您还可以看到选项是打开还是关闭。您可以通过在配置文件中添加一行来更改默认设置。一些方便的例子是:

*# Correct spelling*
shopt -q -s cdspell*# Cd into directory with only its name* shopt -s autocd*# Get immediate notification of background job termination*
set -o notify

这里列出的第一个选项使 shell 对于输入错误更加健壮。第二种方法可以让你在每次想改变目录的时候都不用输入cd。如果您有许多后台作业正在运行,您可能希望通过将第三个选项添加到您的环境文件中来得到通知。

6.按名称查找文件

假设您正在搜索文件foo.txt,但是不知道放在哪里了。然后在您的主目录中,键入:

find . -name foo.txt

这里,.代表当前工作目录,您可以用选项-name指定文件名。您也可以使用通配符。例如,该命令将以txt格式返回所有文件:

find . -name *.txt

更快地找到重要的东西。在 Unsplash 上由 NESA 拍摄的制造商

7.按内容搜索文件

假设您想在foo.txt中搜索bar的所有事件。然后grep是你的朋友:

grep bar foo.txt

如果您想要搜索多个文件,您可以像这样添加它们:

grep bar foo.txt foo2.txt foo3.txt

如果你想在目录dirfoo的所有文件中搜索bar,你可以使用递归方式:

grep -r bar dirfoo

要了解更多选项,您可以查看手册页。只需在你的终端点击man grep

8.处理大量输出

有时你会想用grep来得到某样东西,但是输出太长了,不能打印在屏幕上。这就是带有符号|的管道派上用场的地方。

例如,目录dirfoo中有一千个包含bar的文件。您可能希望筛选输出,挑选出您感兴趣的文件。然后,您可以键入:

grep -r bar dirfoo | less

这将以更容易理解的方式显示输出。然后,您可以记下您想要的文件,并通过键入q关闭显示。这将使你的命令行界面整洁。

也可以反过来用grep。假设你想运行一个产生大量输出的程序fooprog。但是你只对包含bar的部分感兴趣。

为了使这个输出更容易理解,您可能希望在每次出现bar之前添加三行,在其后添加五行。然后,您可以键入:

./fooprog | grep -B3 -A5 -i bar

这里,-B3指的是bar之前的三行,-A5指的是其后的五行。这样,您可以确保只在终端上打印有意义的信息。

使用 grep-command 使代码更容易理解。由 Markus Spiske 在 Unsplash 上拍摄的照片

9.在文本中移动

你以为你的终端全是按键?嗯,这里有一个:你可以alt-在终端的一行中间点击。有点笨重,但足以打动你的朋友。

然而,能节省你大量时间的是键盘快捷键。首先,我建议你开始采用以下方法:

  • ctrl+a跳到一行的开头。
  • ctrl+e跳到一行的末尾。
  • ctrl+u删除从行首直到光标的所有内容。
  • ctrl+k删除从光标到行尾的所有内容。

你可以使用苹果键盘快捷键的完整列表来采用其他快捷键。它在 Linux 命令行上也能很好地工作。

当然你不可能一下子学会所有的键盘快捷键。我建议从其中的几个开始,一旦你掌握了第一个,就开始下一个。

底线:变得更快,变得更神奇。

您已经学习了如何使用别名、提示符、环境变量和 shell 选项定制您的终端。你现在可以访问它的历史,筛选大量的文件,并导航到有意义的部分。

编码是一个持续的学习过程。变得高效永远不晚!

[## 使用 Unix Bash 命令一行程序提高开发人员的工作效率

用一些魔法击中你的终端。有用的 OSX/Linux/Unix bash 终端命令…适合一行!

itnext.io](https://itnext.io/increase-developer-productivity-with-unix-bash-command-one-liners-2973bccd7600)

Jupyter + TensorFlow 搭配谷歌云…90 秒!

原文:https://towardsdatascience.com/90-second-setup-challenge-jupyter-tensorflow-in-google-cloud-93038bcac996?source=collection_archive---------15-----------------------

数据科学初学者有可能在 2 分钟内启动并运行吗?

数据科学爱好者们,从零到谷歌云 Jupyter 笔记本能有多快?让我们来了解一下!

图片:来源。

定制还是不定制?

如果你想对你的设置进行超级定制,谷歌云会给你令人眼花缭乱的粒度。对于开始企业级项目的团队来说,这是一件令人难以置信的事情,它会扩大你削减的每个角落的后果。

初学者必须在众多选项中跋涉才能入门吗?

但是,如果你是一个只想玩玩数据科学笔记本的初学者,该怎么办呢?你必须在选择的森林中跋涉才能开始吗?好消息:你没有。您可以在 90 秒内启动并运行!(请随意跳到下面的演练。)

您可以在 2 分钟内启动并运行!(下面走一遍。)

如果这是你第一次,我打赌你可能特别渴望尽快到达hello world。你会想跳过控制面板,使用别人的安装解决方案。如果是这样,你会爱上谷歌云市场!

什么是市场?

欢迎来到预先烘焙的机器图像合集,你可以用它作为自己工作的跳板。是的,如果需要的话,您可以在以后定制这些第三方模板(点击了解更多)。

预烘焙模板的集合。

90 秒挑战

序言够了!让我们看看是否有可能在 2 分钟内从零到英雄。我将在下面分解这些步骤——这只是证明它是可行的。我们开始吧:

我屏幕上的这段记录向你展示了在 90 秒内开始是可能的,但是你酸痛的眼睛可能更喜欢下面的一步一步截图指南。

我们刚刚看了什么?

第一,我们有哪些没看的?步骤 0.1–0.3。

步骤 0.1:创建谷歌账户

你需要一个谷歌账户才能使用谷歌云。我已经有一段时间了,所以没有显示出来。

步骤 0.2:打开谷歌云控制台

我的视频从谷歌云仪表盘屏幕开始,你可以点击console.cloud.google.com进入。第一次使用的用户会被提示一些日常用品。

步骤 0.3:创建新项目

我用的是我做的一个项目,名为 ItsTimeForDemos 。为了创建一个新项目,我点击了仪表板的这一部分:

现在我们准备好了,让我们检查一下我们在屏幕上看到的内容。

第一步:去市场!

为了跳过重新发明自己的轮子,你将前往谷歌云市场。

第二步:寻找你需要的解决方案

在搜索栏里,我会输入关键词“ ai cpu。

为什么 AI ?我想用一台支持人工智能的笔记本来做这个演示。如果你在找别的东西,只需问搜索栏。这里几乎有 2000 个解决方案。

为什么是 CPU?这是最普通的选择。更强大的硬件——比如 GPU——更强大……这通常也意味着它更贵,并且会更快地消耗掉你的 300 美元免费积分。除非您已经知道为什么需要 beast 选项,否则从它的轻量级同类开始可能是个好主意。

第三步:选择你的赢家

在解决方案中,我选择了 TensorFlow Jupyter 笔记本。你喜欢什么就挑什么。

为什么是笔记本? 数据科学家喜欢笔记本,因为它们结合了最好的交互式数据分析和漂亮的报告制作。

为什么Jupyter这是你最有可能听说过的笔记本电脑解决方案。

为什么tensor flow这是一个强大的深度学习框架;在这里获得更多信息。

步骤 4:启动和部署

点击蓝色的大按钮。重复一遍。

第五步:复制提供的密码并打开笔记本

将为您创建一个随机生成的密码。耐心等待几秒钟,复制它的文本,然后在该选项可用时打开 Jupyter 笔记本。

第六步:你好世界!

粘贴您复制的密码来打开 Jupyter,然后创建一个新的笔记本。

一旦你进入,你会看到 TensorFlow 已经安装好,你可以开始探索了。

起床跑步用了不到 90 秒!

游戏开始。

这是你能拥有的最好的数据科学环境吗?不,因为为你创造完美的解决方案意味着根据你的个人需求定制一切。有一天,你可能会选择这么做。但与此同时,这是我发现的起床跑步的最短路径。我写这篇博文的目的只是想告诉你,有很多超快速的选择。

你能做得比我快吗?

你能做得比我快吗?也许吧!把它当成一个挑战,然后让我知道你花了多少秒。

别忘了

为了避免充电,当你用完的时候不要忘记关灯;使用搜索栏找到部署管理器页面,在这里您可以删除/停止任何您不再需要的内容。

放弃

这篇博文写于 2020 年 4 月,所以如果你来自未来,你的世界可能会有所不同。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏整个课程播放列表:bit.ly/machinefriend

与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用这种形式取得联系。

93 个进球:打破韦恩·格雷兹基单赛季 92 个进球的记录,蒙特卡洛分析

原文:https://towardsdatascience.com/93-goals-breaking-wayne-gretzkys-92-goal-single-season-record-a-monte-carlo-analysis-62b2fc986c04?source=collection_archive---------18-----------------------

韦恩·格雷兹基的记录保持了将近 40 年。它会被打破吗?

作者图片

在 1981-82 年的国家曲棍球联盟(NHL)赛季中,韦恩·格雷兹基为埃德蒙顿油工队在仅仅 80 场比赛中打入 92 球,创下了单赛季进球最多的纪录。唯一接近格雷茨基进球记录的球员是 1990-91 赛季的布雷特·赫尔,当时他在圣路易斯布鲁斯队的 78 场比赛中打进 86 球。此后再无球员破 80 球,最近 20 年也只有两位球员一个赛季进球超过 60(亚历山大·奥韦奇金' 08 和史蒂文·斯塔姆科斯' 12)。92 球的记录只是韦恩·格雷茨保持的 NHL 记录之一,许多人认为这一记录永远不会被打破。在这篇文章中,我将使用蒙特卡洛分析来估算打破格雷茨基 92 球记录的可能性。我分析了现代最伟大的进球赛季,以测试一名球员打破 92 个进球是多么幸运。

NHL 进球历史

首先,介绍一下格雷茨基 92 球记录的背景,以及为什么这个记录从未被打破。如上所述,在 1981-82 赛季,格雷茨基创造了 NHL 单赛季得分记录,该记录已经保持了 38 年。这不仅仅是因为“伟大的一位”的技术,也是因为当时曲棍球的不同风格。请看下面 NHL 平均每场进球的图表,数据来自Hockey-Reference.com。

作者图片

20 世纪 70-90 年代,每场比赛的进球数大幅增加。NHL 的快速扩张与更高技能的球员相结合,导致了单场比赛中更多的进球。80 年代末和 90 年代带来了更好的守门员,更好的教练,来自世界各地的更好的球员,以及一系列其他因素,这些因素都减少了每场比赛的进球数。一个经常被问到的问题是,“在格雷茨基的职业生涯中,他对场均进球有多大的影响?”。下图显示了除格雷茨基职业生涯进球和助攻之外的平均每场进球。

作者图片

自 20 世纪 80 年代以来,曲棍球运动发生了翻天覆地的变化。场均进球数从 8 个左右下降到 6 个,50 球赛季数也有所下降。在 1979-80 赛季和 1989-90 赛季之间,NHL 球员总共取得了 84 个 50 球的赛季。现在,在 2009-10 和 2019-20 赛季之间,只有 11 个赛季。由于球员技术的提高、教练水平的提高和设备技术的进步,现代的进球率在联盟范围内和个人球员中都有所下降。现代的任何球员都能打破格雷茨基赛季 92 球的记录吗?让我们找出答案。

蒙特卡罗法分析

使用一些现代最伟大的 NHL 进球赛季的球员得分统计数据,我模拟了一名球员在一场 NHL 比赛中的进球数量。然后,我模拟了 82 场比赛来估计整个 NHL 赛季。我重复这个过程数千次,以估计一名选手打破格雷茨基记录的真实概率。这种方法被称为蒙特卡洛分析,我们可以用它来模拟特定球员的 NHL 赛季,并获得可能结果的分布。

我使用来自 NHL.com 的进球数据来为一名球员在一场比赛中的进球数做一个概率分布。然后我随机抽取与概率分布相对应的值,以确定一名球员在一场比赛中的进球数量。例如,在奥韦奇金的 2007-08 赛季,他在 34 场比赛中打入一球,在 10 场比赛中打入两球,在一场比赛中上演帽子戏法,在两场比赛中打入四球,总共 65 球。由此,我们可以估计奥韦奇金 2008 在任何给定的比赛中有(34/82)* 100 = 42.5%的机会打进一球,有(10/82)* 100 = 12.2%的机会奥韦奇金打进两球,有(1/82)* 100 = 1.2%的机会上演帽子戏法,有(2/82)* 100 = 2.4%的机会打进 4 个 goals⁴.下面,我模拟了奥韦奇金的 2008 赛季 10,000 次,看看有多少次奥韦奇金打破了格雷茨基的 92 球纪录。

作者图片

在 10,000 个模拟的 2008 赛季中,奥韦奇金 7 次打破格雷茨基的 92 球记录,在他最好的赛季中打进了 105 球,所有 10,000 个赛季的平均进球数为 65.0851(与实际的 2008 赛季相比,他打进了 65 球,这是我们使用蒙特卡洛分析所预期的)。下面是奥韦奇金最佳模拟赛季和格雷茨基 1992 赛季的对比图。

作者图片

所以在 2008 年,奥韦奇金有大约(7/10000)* 100 = 0.07%的机会打破格雷茨基的单赛季进球纪录。但是,同样,这个估计是缺乏的,因为它是基于一个已经异常的季节。为了获得更准确的百分比,让我们使用奥韦奇金 2008、2009 和 2010 赛季的平均值。我还使用了其他两个现代时期的出色进球表演:2000 年至 2001 年佛罗里达州黑豹队的帕维尔·布尔和 2010 年至 2012 年坦帕湾闪电队的史蒂文·斯塔姆科斯。然后作为一个更近的例子,典型的火箭理查德过去十年的赢家,奥韦奇金 2018-2020。对于每个球员,我模拟了 10 万个赛季,以获得更准确的结果分布。

结果

作者图片

在 10 万个模拟赛季中,布雷 1999 年 48 次打破格雷茨基的进球纪录,奥韦奇金 2008 年 74 次打破纪录,斯塔姆科斯 2012 年仅两次打破纪录,奥韦奇金 2019 年零次打破纪录。在他们各自的最佳模拟赛季中,Bure 1999 年进了 101 个球,Ovechkin 2008 年进了 103 个球,Stamkos 2012 年进了 96 个球,Ovechkin 2019 年进了 84 个球。以下是与格雷茨基 1982 赛季相对照的几个赛季。

作者图片

这些蒙特卡洛分析的结果进一步表明,奥韦奇金的 2008 赛季是现代球员中最接近打破格雷茨基进球纪录的一个赛季。1999 年,帕维尔·布尔打破格雷茨基进球纪录的几率约为(48/100000)* 100 = 0.048%,或者说,2083 年的几率约为 1%。在 2008 年,奥韦奇金有(74/100000)* 100 = 0.074%的机会打破格雷茨基的进球纪录,大约是 1351 分之一。2012 年,斯塔姆科斯有(2/100000)* 100 = 0.002%的机会打破格雷茨基的进球纪录,也就是五万分之一的机会。

那么,怎样才能打破格雷茨基的现代 92 球记录呢?在 2007 年至 2009 年期间,像亚历山大·奥韦奇金这样优秀的球员,在任何一个赛季中,都有 1/1351 的机会打破格雷茨基的单赛季进球纪录。这意味着,如果他们连续打了 1351 个赛季,他们平均只会打破一次记录。自 2009 年以来,没有一个球员的表现像奥韦奇金在 2007 年至 2009 年期间那样好。在我们有生之年,要打破格雷茨基 92 球的赛季记录,需要一个全新的一代人/有天赋的人才和/或曲棍球风格的巨大转变。最后,格雷茨基在仅仅 80 场比赛中打进 92 球。即使一名球员打破了格雷茨基的单赛季纪录,他们也不可能打破格雷茨基 80 场比赛 92 球的纪录。“伟大的一个”是不可改变的。

[1]: 这篇来自 HockeyAnalytics.com 的文章很好地总结了 NHL 这些年来风格的变化。

[2]:https://en . Wikipedia . org/wiki/List _ of _ NHL _ players _ with _ 50-goal _ seasons

[3]:请记住缩短的 2012–13 和 2019–20 赛季。如果打满赛季,那 11 个可能更接近 15 个。

深度学习超参数的 a、B、Cs……

原文:https://towardsdatascience.com/a-b-cs-of-deep-learning-hyperparameters-4d5de9a37de1?source=collection_archive---------66-----------------------

超参数:是福是祸,由你决定。好吧,我们都知道“人工智能是新的电力”,我们不可避免地需要力量和知识来综合和控制它。

Diomari Madulara 在 Unsplash 上拍摄的照片

D eep learning 目前成为新闻,因为它的准确性和对我们现有模型的控制。有了大量的编程软件,如 TensorFlowKerasCaffe ,以及一个巨大的列表,简化了深度学习编程的工作。现在,我们不必担心反向传播步骤、权重更新等,而只需调整超参数。

然而,深度学习的人知道这不是一件简单的事情。由于预测精度高,深度学习有利于拥有大量超参数,这些超参数由从业者根据他们的任务或他们实施深度学习模型的问题类型来使用。

人工智能对世界来说是一种恩惠,但如果你不明智地使用它,它可能会成为你的诅咒,而要明智地使用它,你需要准确地理解它。

因此,为了准确地理解它们,我们需要回答三个问题,即何时、何地以及在何种背景下。在此之前,让我们列出它们,以便顺利开始。

我们将讨论以下超参数的三个 w:

  1. 学习率
  2. 隐藏单元数和隐藏层数
  3. β(带动量的梯度下降)
  4. β1、β2 和ϵ (Adam 优化器)
  5. 学习率衰减
  6. 小批量(小批量梯度下降)

1.学习率

当你写出梯度下降的最基本形式并更新参数时,这里就是学习率出现的地方

梯度下降的步骤(由作者出版)

学习率决定了你在梯度下降的每次迭代中要跳多远。一般来说,学习率在 0.001 和 1 之间,这可以随着你向函数的最小值前进而变化。

2.隐藏层和隐藏单元的数量

另一个重要的超参数是隐藏层中隐藏单元的数量和隐藏层本身。它决定了模型在给定数据点中描述的函数有多复杂。隐藏单元和隐藏层的数量越多,模型概述的函数就越复杂,因此过度拟合的机会就越多。

通常,人们采用许多隐藏层和隐藏单元来构建深度神经网络,并使用一些技术,如 L2 或辍学正则化,以防止数据过拟合的规定。

没有规定的方法来确定正确的或最佳的层数,您必须从某个最小的层数开始并增加它,直到您达到期望的预测精度。这就是为什么应用机器学习是一个高度迭代的过程。

另一个参数是你的系统, CPU ,或者 GPU 决定了隐藏层和单元的数量。因为这是一个高度迭代的过程,你需要迅速得到每次迭代的结果,为此你应该有很高的计算能力。

3.带动量的梯度下降

什么是加权平均?

假设我们记录了夏季 200 天的温度(黄色散点分布)。附加曲线代表不同权重(β)的加权平均温度。

##CODE FOR WEIGHTED AVERAGE
temp                      ## list of temperatures of 200 days
v[0]  = temp[0]           ## random initialization (for scalability)
for i in range(len(temp)) :
    v[i+1] = (beta)*v[i] + (1-beta)*temp[i+1]

印度德里 200 天的温度分布((作者发表))

注意:我们已经初始化了 v[0] = temp[0],以确保加权平均温度保持在实际分布的范围内。

我们如何利用这一点?

假设我们有以下类型的成本函数,我们的梯度下降与它很好地合作。

成本函数上的批量梯度下降(由作者发表)

但是,当我们有足够的数据来训练时,梯度下降在振荡中花费了大量的时间来达到成本函数的最小值。当我们将加权平均应用于梯度下降时,它将两个方向的值平均化。因此,垂直值相互抵消,我们在水平方向获得更多的动量。

成本函数上带有动量的梯度下降(由作者发表)

这叫做动量梯度下降。通常,β的范围从 0.9 到 0.99,我们使用对数标度来寻找该超参数的最佳值。

## UPDATION STEP OF GRADIENT DESCENT
W = W - learning_rate * dW
b = b - learning_rate * db## CHANGE IN UPDATION STEP OF GRDIENT DESCENT
## WEIGHTED AVERAGE form of  GRADIENT DESCENT
VdW = beta * VdW + (1-beta)*dW    ## Taking weighted avg of weights Vdb = beta * Vdb + (1-beta)*db    ## Taking weighted avg of biases## Updating weights and biases
W = W - learning_rate*VdW
b = b - learning_rate*Vdb

4.Adam 优化器

批量标准化

据观察,当我们标准化输入数据时,训练变得更快。那么,为什么我们不对每个隐藏层的输入进行标准化呢?这种技术被称为批处理规范化。通常,在将它们放入激活函数之前,我们会对值进行归一化。

但是,如果我们对如下所示的给定的猫图片进行训练,我们的模型就有可能预测不正确。

(1)Kazuky aka yashi 在 Unsplash 上的照片,(2)Lamna The Shark 在 Unsplash 上的照片,(3)Daria Shatova 在 Unsplash 上的照片,(4)Tran Mau Tri Tam在 Unsplash 上的照片

这是因为训练数据集中的所有猫都是黑色的,而测试数据集中的图片是白色的猫。从数学上讲,测试数据集和训练数据集的数据分布是不同的。

标准化是一种技术,通过这种技术,我们每次必须提供输入时都可以获得相同的数据分布。标准化的一般步骤是:

规范化输入数据的步骤(由作者发布)

这些步骤使平均值为零和单位标准偏差。这种特殊的分布可能并不总是有效。可能存在这样的情况,我们需要具有不同集中趋势的分布。因此,我们需要调整分布参数,即平均值和偏差。

调整标准化数据集中趋势的附加步骤(由作者发布)

步骤 4 允许我们调整分布参数。此外,在步骤 3 中,我们添加了一个ε项,以确保分母永远不等于零。

5.小批量

梯度下降的一次迭代过程:

分批梯度下降法(作者发表)

当训练集非常大时,比如说大约 500 万个样本,那么升级一次参数所需的时间将会很长。因此,作为一种补救措施,我们将大型数据集划分为较小的数据集,对于这些较小数据集的每次迭代,我们都要更新参数。

小批量梯度下降法(作者发表)

这里,我们将训练集分成三个更小的集合,但是有一些规范可以做到这一点。人们建议我们应该在小批量中生产相当于 2 的某个幂的批量,即 64、128、1024 个样品。这在某种程度上优化了内存分配,实际上优化了模型的性能。

整个数据集的一个循环的完成被称为一个时期。当我们使用批量梯度下降(简单梯度下降)时,我们在一个时期内更新一次参数,但是在小批量梯度下降中,在一个时期内更新多次参数。

6.学习率衰减

取学习率的大值可以优化时间,但是我们可能永远达不到最小值。相反,如果我们取一个小的学习率,学习速度就低。那么,为什么我们不能在训练模型时改变学习率呢?

当学习速率接近收敛(成本函数的最小值)时,可以减慢学习速率以获得更好的结果。在这种情况下,学习率的一个非常一般的形式可以表示为

实现学习率衰减(由作者出版)

在这个例子中,我们可以观察到学习率是如何变化的。现在明智地选择“衰变率变得很重要,因此可以称为另一个超参数。

猜测…

当你训练一个模型时,感知每个参数和超参数的细节是非常重要的,因为你梦想它会给世界和社会带来一些变化。即使是一件小事也能引发一项大的创新。

至此,我希望这篇文章能为你增添一些东西。请分享你的想法,因为

"批评是自我吹嘘的一种间接形式。"埃米特·福克斯

A/B 测试统计变得简单

原文:https://towardsdatascience.com/a-b-test-statistics-made-easy-4e94098758d9?source=collection_archive---------17-----------------------

第 1 部分:连续度量

我们的 A/B 测试刚刚结束,看起来测试的表现比控制组好。但是这个结果仅仅是因为随机噪声吗?还是结果大到有统计学意义?本指南将告诉你如何使用推断统计学来回答这些问题。

统计学常常是一门令人生畏的学科。许多教科书,甚至是那些针对初学者的教科书,都太快地陷入像这样看似复杂的公式:σd = sqrt( σ1^2 / n1 + σ2^2 / n2)。或者他们太快进入抽象概念,如“测试统计”。公式和抽象有一个重要的位置:它们允许你快速有效地执行统计分析。但它们不是吸引观众或教授统计概念的最佳工具。

在本文中,我们将使用模拟将关键的统计概念带入生活,而不是依赖于公式。我们将解构抽象来阐明所有隐藏的组件。总之,我们将揭开这个迷人的主题领域的神秘面纱,让读者更容易理解和享受。

唯一的先决知识是熟悉均值、标准差和密度图。这篇文章(第 1 部分)关注于连续指标的分析(考虑年龄、身高、收入等。).在以后的文章中(第二部分),我们将检查比例指标(想想转化率,吸烟者的百分比,满意的顾客比例,等等)。).

1.通过模拟创建采样分布

想象一个有 100 万居民的城镇。一半居民是男性,另一半是女性。每个组的平均年龄是 35 岁。女性年龄的标准差略高于男性年龄。以下是总体参数的汇总:

如果我们要绘制每个群体的年龄密度图,它可能是这样的:

现在想象一下,我们想要探究两个群体之间平均年龄的差异。我们知道它应该是 0,因为两个人口有相同的平均年龄。让我们运行以下过程:

  1. 我们随机抽取 200 名男性样本,计算他们的平均年龄
  2. 我们随机抽取了 200 名女性,并计算了她们的平均年龄
  3. 我们计算平均年龄的差异

在运行完这个过程一次后,我们得到以下结果:

现在,让我们运行一个模拟,将上述过程重复 10,000 次:

尽管我们知道两个群体的平均年龄都是 35 岁,但我们对平均值的估计因样本而异。有些估计值高于 35,有些则低于 35。样本之间的这种自然变化被称为随机 采样误差

抽样误差也会导致样本之间的估计年龄差异(最后一列)不同。有些估计值高于 0,有些则低于 0。让我们来看看这些值的分布情况:

这个图叫做 抽样分布 。具体来说,就是均值之差的抽样分布。大多数差值接近于零,这是意料之中的,因为两个群体的平均值相同。也有一些样本产生很大的差异,也是由于随机采样误差。这些值出现在分布的尾部,这告诉我们它们出现的频率较低。

总结:使用模拟,我们创建了一个抽样分布。这种抽样分布说明了由于随机抽样误差引起的样本之间的自然变化。

2.生成采样分布的一种更快速的方法

模拟有助于我们理解什么是抽样分布以及它是如何创建的。一旦我们理解了这些概念,我们就可以完全不用模拟,直接计算抽样分布。这种方法更快、更准确。

为了计算抽样分布,我们只需要知道三个属性:

  1. 形状。一个抽样分布是总是对称的(给定足够的数据点),不管潜在人口分布的形状如何。具体来说,形状被称为 正常 (对于足够大的样本)。
  2. 的意思是。抽样分布的平均值是两个基础分布的平均值之差。在我们的例子中,这将是零,因为两个潜在的人口有相同的平均年龄。
  3. 标准偏差。当涉及抽样分布时,这也被称为 标准误差 ,因为抽样分布表征了抽样误差。原来我们可以这样计算:

现在我们知道了这三个属性,我们可以使用大多数编程语言快速计算采样分布。例如,在 R 中,我们可以简单地写:

rnorm(n = 10000, mean = 0, sd = 1.27)

这一行代码将生成 10,000 个值的正态分布,平均值为 0,标准偏差为 1.27。让我们绘制这些计算值(红色)相对于我们通过模拟创建的先前分布(黑色)的分布图:

注意这两个发行版是多么的相似。计算出的分布是精确的。模拟分布是一个不完美的估计。因此,两者之间略有差异。

重述:我们不再需要运行许多模拟来估计抽样分布。原来有一个简单的公式来计算我们的抽样分布的标准偏差。有了这个,我们现在可以快速计算精确的采样分布。

3.对一些 A/B 测试结果的初步看法

现在想象你必须解释 A/B 测试的结果。例如,你为你的网站设计了一个全新的主页,你认为这将会给每个访问者带来更高的收入。你设置了一个持续几周的 A/B 测试,其中一半的访问者看到了新的主页(测试组),另一半看到了现有的主页(控制组)。测试结束时,我们会看到以下结果:

乍看起来,测试实际上比控制组的表现要好,每个访问者多花了 7.7 美元。但是我们能相信这个结果代表了总体均值之间的真实差异吗?毕竟,在前面的章节中,我们已经观察到,即使两个总体具有相同的均值,由于抽样误差,我们仍然会产生一系列的差异估计值。

因此,假设测试和控制人口有相同的手段,有多大的可能性,我们会看到高达 7.7 美元的结果,仅由于抽样误差?这种假设——即测试和控制群体均值之间没有实际差异——被称为(H0)。按照惯例,我们总是从 H0 开始,然后着手检查支持或反对它的证据的力度。

总结:尽管第一次看起来测试比控制组表现得更好,但我们需要了解在假设无效的情况下,我们看到 7.7 美元结果的可能性有多大。

4.计算零假设的抽样分布

为了理解在给定零假设的情况下看到结果$7.7 的概率,我们首先需要理解假设测试和控制人群具有相同均值时可能出现的值的分布。

换句话说,我们需要在假设零假设为真的情况下生成结果的抽样分布。我们可以使用与之前相同的步骤进行计算,我们只需要知道三个属性:

  1. 形状=正常(如所示)
  2. 均值=零(如零假设所述)
  3. 标准误差(计算)

请注意,我们使用样本标准差作为总体标准差的最佳猜测。下面是我们的抽样分布图:

回顾:假设假设无效,我们看到 7.7 美元结果的可能性有多大?要回答这个问题,我们首先需要了解零假设下的抽样分布。我们可以这样计算,假设 a)分布的形状是正态的,b)测试和控制群体具有相同的平均值,c)我们的样本标准偏差代表总体标准偏差。

5.解释 A/B 测试结果

给定零假设下的抽样分布,我们有多大可能看到测试和控制均值之间的差异为 7.7 美元?请记住,如果零假设是真的,那么分布是对称的平均值为零。这意味着我们获得 7.7 美元的结果的机会与获得-7.7 美元的机会相等。因此,问题变成了:在给定零假设的情况下,获得极端结果或更极端结果7.7 美元的概率是多少?

让我们重新检查我们的抽样分布:

这里,我们用蓝色阴影标出了曲线上由7.7 美元一样极端或更极端的值所限定的区域。两个面积之和为 2%,该值称为 p 值 。它告诉我们,如果零假设是真的,那么在 100 个 A/B 测试中,只有 2 个测试的结果会达到 7.7 美元或更高。

相比之下,橙色阴影区域(你必须想象橙色区域一直在蓝色区域之后)占曲线下总面积的 5%。5%的值是任意选择的,它被称为 显著性水平 或𝛂.当 p < 𝛂时,我们拒绝零假设。

换句话说,我们是说,如果我们看到一个 A/B 测试结果只可能在 100 个 A/B 测试中出现不到 5 个(假设是零假设),那么我们将拒绝零假设(即使它是真的)。这意味着我们有 5%的几率会冒错误地拒绝零假设的风险。因此,𝛂也被称为第一类错误率。

总结:在零假设下,看到极端或超过 7.7 美元的结果的可能性不大。具体来说,我们的 p 值为 0.02 意味着我们只可能在 100 个实验中的 2 个实验中看到极端或超过 7.7 美元的结果。这个比率小于我们的显著性水平(𝛂)0.05,因此,我们拒绝零假设。这可能是也可能不是正确的结论,从长远来看,我们的 1 型错误率= 0.05 (= 𝛂).

6.计算 p 值的更快方法

在实践中,统计学家不会根据每组 A/B 测试结果创建定制的抽样分布。对于足够大的样本量,他们采用单一的、 标准正态分布 。这个分布的平均值为 0,标准偏差为 1。任何平均值为 0 的正态分布都可以通过除以标准误差转换为标准正态分布。

因此,如果我们将之前分布中的所有值除以标准误差($3.31),我们会得到以下结果:

转换后的值被称为 z 值,它们是无单位的。

对于标准正态分布,5% 的显著性水平始终对应于等于或大于 1.96(大约)的 z 值。我们将 1.96 称为具有 5%显著性的 临界 z 值 。我们的 p 值不变,还是 0.02。在这里,曲线下的面积对应于 z 值达到或超过 2.32(7.7 美元/3.31 美元)。这个值称为 z 得分检验统计量

按照惯例,统计学家使用标准的正态分布,其平均值为 0,标准差为 1。这消除了为每个 A/B 测试计算定制取样分布的需要。我们只需要计算 z 得分(观察到的差异/标准误差)。p 值就是由 z 得分限定的曲线下的面积。

7.置信区间

概括地说,我们的 A/B 测试结果是每个访问者 7.7 美元,我们认为,如果实际上测试人群和控制人群具有相同的平均值,这个值不太可能出现。更正式地说,我们的 p 值 0.02 小于我们的显著性水平 0.05,因此我们拒绝零假设。

我们拒绝了总体均值之差= 0 的(无效)假设。因此,我们自动接受了 的替代假设(HA) 其中,在这里,状态之间的差异意味着≠ 0。

所以如果均值之差不等于等于 0,那么等于什么?一个答案是 7.7 美元。假定我们现在认识到了采样误差的影响,一个更好的答案将确定一个可能值的范围**

那么,给定另一个假设,可能值的范围是什么呢?同样,我们只需要参考抽样分布。替代假设的抽样分布与零假设的抽样分布相同,只有一个例外:它的平均值等于观察结果($7.7):

灰色阴影区域代表图表的中间 95%,对应于(1.21,14.19)或 7.7±6.49 的。每个置信区间都有一个相关的 置信水平 ,该置信水平由显著性水平(𝛂)预先确定,等于 1—𝛂= 1–0.05 = 95%。

置信区间和置信水平的另一种解释是这样的:如果我们要重复整个 A/B 测试,那么我们可能会得到测试和控制样本,由于采样误差,它们的样本标准偏差略有不同。所以我们会产生一个稍微不同的抽样分布,从而产生一个稍微不同的置信区间。现在,如果我们多次重复整个 A/B 测试,那么从长远来看,95%的置信区间将包括总体均值之间的差。请注意,这与说有 95%的概率我们的单一置信区间包含总体间的真实差异是不同的。

概述:置信区间(在相关置信水平上)显示了我们的 A/B 测试结果的可能值范围。在这里,我们报告的置信区间为 7.7±6.49,置信水平为 95%。

8.力量

关于假设检验,需要理解的另一个关键概念是统计功效。权力类似于意义:

  • 显著性(𝛂) =当 H0 为真时拒绝 H0 的概率。
  • 功率(1-𝛃) =当 HA 为真时接受 HA 的概率。

既然我们已经接受了 HA,那么在这里权力的概念基本上是多余的。我们将在以后关于样本大小计算的文章中讨论它。

重述:测试的功效是当 HA 为真时接受 HA 的概率。在测试运行之前,当您计算测试所需的样本量时,这是最重要的。

9.R 中的统计分析

至此,您应该对统计分析的总体框架感到相当满意了。现在,让我们看看如何将上述所有步骤简化为几行代码。在 R 中我们会写:

这会产生:

*[1] "standard error"
3.30989123688377[1] "p-value"
0.0199993307409128[1] "critical value at alpha = 95%"
6.48726761703693[1] "confidence interval, lower bound"
1.21273238296307[1] "confidence interval, upper bound"
14.1872676170369*

回顾:一旦你熟悉了统计分析中的所有步骤,你就可以使用计算机程序,如 R 快速进行计算。

10.摘要

在本文中,我们探讨了统计分析中涉及的许多关键概念和层次。我们回顾了一些捷径,一旦理解了这些概念,就可以更快地找到答案。希望这已经让你对 A/B 测试统计有了更好的理解。在下一篇文章的中,我们将使用我们在这里学到的知识来分析一个不同的 A/B 测试,其中成功度量是一个比例。

A/B 测试统计变得简单

原文:https://towardsdatascience.com/a-b-test-statistics-made-easy-8805ac2533d6?source=collection_archive---------13-----------------------

第 2 部分:比例度量

这篇文章将展示当输出指标是一个比例,比如客户转换率时,如何评估 A/B 测试的结果。这里我们利用了我们在第 1 部分:持续度量中建立的统计基础,所以如果你需要复习,就从这里开始吧。

统计学可能是一门令人望而生畏的学科,但也不尽然。这些指南的目的是让人们更容易使用统计工具。本指南使用模拟数据来揭开主题的神秘面纱,并使关键的统计概念变得生动。尽情享受吧!

1.模拟两个相同网站的转化率

想象一下,我们拥有 2 个网站。每个网站以 30%的比率将访问者转化为客户。让我们看看 1000 个访问者访问每个网站后会发生什么:

现在我们运行一个模拟,可以对总共 100,000 个样本重复上述过程。以下是结果的一瞥:

因此,尽管我们知道真实转换率是 30%,但由于随机 采样误差 ,我们看到这个数字周围有一些变化。现在让我们把上面所有的数字转换成比例:

最后,让我们绘制转换率差异的分布图(最后一列):

总结:我们有两个转化率相同的网站。所以转换率的差异应该等于零。但是由于抽样误差,我们看到结果的抽样分布在零附近。

2.将模拟应用于 A/B 测试

现在假设 A/B 测试产生以下结果:

测试处理真的提高了 45 个客户的转化吗?或者测试组和对照组有相同的转化率吗?在这种情况下,我们观察到的任何差异都只是随机抽样误差的结果?

让我们更正式地捕捉这些假设:

  • (零假设* ):人口转换率之差= 0。任何观察到的差异都是由于采样误差造成的。*
  • ( 替代假设 ):人口转化率之差≠ 0。观察到的差异不太可能仅仅是由于采样误差。

因此,让我们从确定假设为零时的抽样分布开始。我们需要知道的只是真实的(人口)转换率可能是多少。我们最好的猜测是样本转换率的平均值:(0.335 + 0.290) / 2 = 0.3125。现在,让我们模拟一下测试组和对照组的转换率均为 0.3125 时的分布情况:

回顾:我们再次使用模拟来生成抽样分布。这里我们假设测试人群和控制人群具有相同的转化率——这是我们的零假设。

3.生成采样分布的一种更快速的方法

模拟是生成抽样分布以展示抽样误差影响的一个很好的工具。如果我们想移动得更快,我们可以,事实上,计算采样分布如下:

第一步:计算汇集样本比例( p )。

我们已经计算出这是 0.3125。

下面是实际的公式,当测试组和对照组的样本量不同时,这个公式特别有用:

第二步:用 p 计算标准误差( se )。

步骤 3:计算一个均值= 0,标准差= 0.0207 的正态分布。

R 中,我们可以简单地写:

*rnorm(n = 10000, mean = 0, sd = 0.0207)*

让我们来看看这个计算值的分布(红色)与之前我们通过模拟创建的分布(黑色)相比是什么样的:

如你所见,我们有一个几乎完美的匹配!事实上,模拟导致对采样分布的估计。然而,如果我们无限次运行模拟,我们将获得计算出的采样分布。因此,它是精确的抽样分布。

概述:我们不再需要运行许多模拟来估计抽样分布。我们现在可以计算精确的采样分布。

4.解释 A/B 测试结果

那么,给定上面的抽样分布,在零假设下,获得 0.045 或更大的结果的概率是多少?让我们重新检查我们的抽样分布:

这里我们的 p 值 (蓝色阴影)是 3%,它告诉我们,如果零假设为真,那么我们预计在 100 次 A/B 测试中只有 3 次会看到极端或大于 0.045 的结果。由于我们的 p 值小于我们的 显著性水平(【𝛂】)0.05,我们拒绝零假设。

总结:在零假设下,转换率提高到 0.045 或更高的可能性不大。具体来说,我们的 p 值为 0.03 意味着我们只可能在 100 个实验中的 3 个实验中看到极端或大于 0.045 的结果。这个比率小于我们的显著性水平(𝛂)0.05,因此,我们拒绝零假设。

5.计算 p 值的更快方法

我们可以通过使用 标准正态分布 来加速这个过程。我们可以通过除以标准误差将我们的分布转换成标准正态分布。同样,我们也可以通过除以标准误差将我们的测试结果转换成一个 z 分数 。所以这里我们得到 0.045 / 0.0207 = 2.17。

使用这个 z 值,我们现在可以通过查找表快速确定 p 值,或者使用编程语言如 R 计算 p 值:

*pnorm(q = -2.17, mean = 0, sd = 1) * 2*

在这两种情况下,我们得到了与之前相同的 p 值:0.03。

概述:通过将我们观察到的转换率差异(0.045)转换为 z 值(2.17),我们能够利用标准正态分布的查找表来快速得出 p 值。

6.置信区间

概括一下:

  • 我们已经否定了原假设【H0】认为人口转换率之差= 0。**
  • 因此,我们必须 接受 的替代假设 (哈) 即人口转换率之差≠ 0。

如果我们接受人口转换率的差异不等于零,那么等于多少?给定替代假设,可能值的范围是什么?让我们参考给定替代假设的抽样分布:

灰色阴影区域代表图表的中间 95%,对应于置信区间(0.004,0.086)或 0.045±0.041。每个置信区间都有一个相关的置信水平,该置信水平由显著性水平(𝛂)预先确定,等于 1-𝛂= 1–0.05 = 95%。置信区间告诉我们,如果我们多次重复整个 A/B 测试,那么从长远来看,95%的置信区间将捕捉到人口转换率之间的真实差异。

概述:置信区间(在相关的置信水平上)显示了我们的 A/B 测试结果的可能值的范围。在这里,我们报告的置信区间为 0.045±0.041,置信水平为 95%。

7.R 中的统计分析

至此,您应该对统计分析的总体框架感到相当满意了。现在,让我们看看如何将上述所有步骤简化为几行代码。在 R 中我们会写:

这会产生:

8.摘要

在这里,我们探索了分析 A/B 测试所涉及的步骤,以及将所有步骤联系在一起的框架。希望这已经让你对 A/B 测试统计有了更好的理解。在这种情况下,我们有足够的证据(根据 p 值)来拒绝零假设。但是,如果我们没有收集到足够大的样本来产生 p 值怎么办?下一篇文章中,我们将演示如何提前推断出所需的样本量。

A/B 测试-第 1 部分

原文:https://towardsdatascience.com/a-b-testing-c9cb90d2b6aa?source=collection_archive---------34-----------------------

A/B 测试是一个很难理解和解释的概念。在这篇文章中,我将带你了解 A/B 测试背后的理论。

我们将关注以下主题:

  • 什么是假设检验?
  • 选择正确的指标
  • 设计测试
  • 分析测试的结果

什么是 A/B 测试

A/B 测试是一种用于测试在线平台上新功能推出或现有功能变化的性能的方法。这种方法通常被称为假设检验,并被用于许多不同的领域。例如,在医学领域,研究人员进行临床试验,并使用假设检验来衡量新药的有效性。假设检验基本上是用来检验研究人员在他们的新发明背后的假设。

然而在科技领域,假设检验的用例是不同的。比方说,一家科技公司的设计团队对网站上的注册按钮进行了新的设计。我们应该继续改变设计吗,因为我们认为它会对我们的用户更有吸引力?

不要!我们需要测试这个新设计,看看用户对这一变化的反应。为了测试这一点,我们得到了我们人群的一个子集(我所说的人群是指我们平台的所有用户),并将他们分成两个不同的组,名为控制组测试组。控制组中的用户将看到注册按钮的当前设计,测试组中的用户将看到新的设计。

每当我们对一个特性进行修改时,我们应该运行一个测试吗?

不要!而一个数据科学家可能会说:请不要!

但是,为什么呢?

根据测试背后的假设,在某些情况下,A/B 测试可能不会告诉您需要什么。

衡量长期效果:假设一家房屋租赁公司想要对其推荐计划进行一些更改。事实是,用户不会经常寻找公寓,所以需要几个月甚至几年的时间用户才会回到网站,因此,在这种情况下运行 A/B 测试对你没有帮助。

衡量新体验:想象你正在完全改变你的网站首页的用户界面。测试组中的老用户可能会喜欢新的 UI,并想尝试所有的东西。这被称为新奇效应。我们可能会错误地认为测试组表现得更好。在推出新的用户体验时,我们应该始终考虑新鲜感的影响,并记住,在用户适应这种新体验以及你看到他们的真实行为之前,需要一些时间(几天、几周,取决于业务)。

或者,您可以使用其他技术,如焦点小组或调查来获得一些定性数据,并在此基础上做出一些假设。

测试前分析

陈述你的假设:在运行测试甚至设计测试之前,你需要陈述你的假设。你有一个想法,你认为为用户提供了更好的体验,并为你的公司创造了更多的收入。识别测试中的无效假设和替代假设。在注册按钮的设计变更的例子中,你假设设计的变更会鼓励更多的用户注册。

为你的测试选择和描述度量标准:一般来说,我们需要两种不同类型的度量标准。

A.不变度量

在我们进行更改时,这些指标应该保持不变。这些度量标准的完美用途是进行健全性检查和识别实验设置中的问题。在我们的示例中,两组中查看注册按钮的用户数量应该保持不变,因为我们没有做出任何影响用户查看注册按钮的更改。

B.评估指标

这些是我们用来衡量我们所做的改变的影响的指标。评估指标分为不同的类别:

  • 总和与计数
  • 平均值和中位数
  • 概率和比率

在工业中,概率和比率经常被用来检查测试的性能。这两者是有区别的!再次考虑我们的注册按钮:

  • 点击率(CTP)= #点击注册按钮的用户数/#查看注册按钮的用户数
  • 点击率(CTR)= #点击事件/#查看事件

基于上面的定义,CTP 告诉我们有百分之多少的用户会点击这个按钮。它告诉我们有多少百分比的用户进入了我们的用户漏斗的下一步。在计算 CTP 时,你不关心用户点击或查看按钮的次数。只要他们至少有一次浏览/点击,他们就会被考虑计算这个指标。恰恰相反,CTR 经常被用来发现用户点击一个按钮的频率,这使得它们非常适合用来比较两个按钮。通常,点击率的变化会告诉我们一个技术问题,比如当用户使用特定设备时无法点击按钮。

在指标选择的过程中,考虑以下三个重要的事情:

  1. 考虑您的指标的敏感性和健壮性。您需要选择一个对您的变化足够敏感的度量标准,但不要太敏感。基本上,如果没有什么有趣的事情发生,度量标准不应该改变。测量您的度量标准的敏感度或健壮性的一种方法是使用运行 A/B 测试,并查看度量标准在两组之间如何变化。考虑用户在你网站的某一部分花费时间的平均值和中间值。用户在平台上花费的时间通常遵循具有长尾的对数正态分布(显示在平台上花费大量时间的用户)。根据您在产品中所做的更改,您会影响在平台上花费大量时间或中等时间的用户。这个变量(花费的时间)的平均值对在平台上花费大量时间的用户非常敏感,但它的中值实际上更稳健。
  2. 为你的指标设定一个实际的重要水平。从接受测试的商业角度来看,这是您期望看到的变化量。
  3. 检查您的指标的可变性。换句话说,你应该检查多久一次你的指标变化多少。鉴于其可变性,您应该检查实际显著性水平是否可行。

设计测试

在选择了正确的评估和不变的度量标准之后,我们需要设计我们的测试。这是游戏最关键的部分。糟糕的实验设置会导致误导性分析和错误决策!

C 选择分流单位:分流单位是我们根据其组成对照组和测试组的标识符。转移的单元可以是用户 id、cookies 或事件。这里需要注意用户体验!如果您将事件随机分配给控制组和测试组,那么用户在您的网站上停留期间会多次看到控制和测试版本。你不希望你的用户有这种体验吧?您可以使用 user-id,它通常与用户的登录事件相关。但是请记住,一个用户可以拥有与多个帐户相关的多个登录。这意味着如果我改变我的帐户,我可能会在不同的组中结束,并经历不同的体验。

使用用户 id 作为转移单位的另一个缺点是,当变化从测试组泄漏到控制组时,会影响控制组的行为。想象一下,一个约会应用程序允许测试组的用户在他们的个人资料中写一篇关于自己的短文,假设他们的体验会更好(他们会收到更多的消息等等)。同时,我们令人惊奇的控制用户会看到测试用户的个人资料,这也会影响他们的行为。因为他们突然发现了更多有趣的用户!这就是所谓的网络效应。

为了防止网络效应,我们可以按社区运行测试(一个社区中的用户)。但是困难的部分是在你的产品中定义一个社区。社区可以是彼此交互最多的用户,也可以是处于相同地理位置的用户。

使用 cookies 是另一种选择。Cookies 将被分配给特定的浏览器或设备!因此,如果用户更换他们的设备,他们可能会经历不同的体验。

明智地选择你的测试分流单位!检查您的用户在使用您的产品时拥有多个帐户或更换设备的可能性。

C 选择合适的人群:选择你想要锁定的用户子集。这可能基于他们的平台、国家或语言。当脸书推出反应表情符号时,他们必须包括表达情感在文化上并非罕见的国家。想想看,如果测试组中看到新反应特性的用户普遍缺乏表达能力,会发生什么!

S 确定实验的规模:你需要找出测试组和对照组中需要多少用户,才能得到有统计意义的结果。确定测试规模时要考虑的事情有:

  • 评估指标及其可变性
  • 实际意义水平
  • 分流单位

实验的时机:你需要知道什么时候是进行实验的最佳时机。这取决于您的业务、您的实验所需的样本量以及评估指标。

测试的置信水平和功效:95%的置信水平和 80%的功效是工业上最常用的。

分析测试的结果

现在我们已经进行了实验,我们有两个组(测试组和对照组)。请记住,我们没有将测试暴露给整个人群,我们从人群中抽取样本。

我们需要回答的问题是,我们观察到的这两组之间的差异是偶然发生的可能性有多大?

检查不变指标:如前所述,这些指标用于健全性检查。如果测试组和对照组之间的这些指标值存在显著差异,则不要继续分析。试着找出测试的问题。问题出在实验装置上吗?也许一个事件没有被正确捕获,也许你为某种语言传递的过滤器没有工作!在这些情况下,工程师和分析师是最好的帮手。如果您的不变度量的值是预期的,那么进入下一步。

分析结果:终于,我们到了激动人心的部分!还记得我们之前描述的注册按钮测试吗?假设我们决定将点击率作为我们的评估指标。

我们所拥有的数据通常是查看过该按钮的用户数量和点击过该按钮的用户数量。因此,我们可以计算出测试组和对照组中有人点击的估计概率

然后我们计算这两个概率的差(称之为 d)。基于零假设,这两个概率应该没有区别(d 为零),但是替代假设说有区别(d 不为零)。

计算差额还不够!你需要围绕它建立一个置信区间。你需要做的是检查观察到的 d 在置信区间中的位置。置信区间告诉你有 95%可能性的 d 的真值位于置信区间内的某处。如果你的置信区间不包含零,那么你就有充分的证据证明测试组和对照组的 CTP 之间存在有意义的差异。

在对结果过于兴奋之前,请记住您为测试设置的实际显著性水平,并查看它相对于您的置信区间和 d 的观察值的位置。如果结果是显著的,并且我们观察到与对照组相比,测试中增加了 1%,但实际显著性水平是 2%,那么您需要非常小心地接受测试!在接受一个没有给出最低实际意义水平的测试之前,需要考虑工程师构建一个特性并在全球公开它背后的努力。

这是对 A/B 测试背后理论的快速总结和演练。下一个帖子会有更详细的计算, A/B 测试部分 2。

资源

  • Udacity 的 A/B 测试课程
  • A/B 测试的陷阱

简而言之,A/B 测试

原文:https://towardsdatascience.com/a-b-testing-in-a-nutshell-97c6fa86370a?source=collection_archive---------50-----------------------

Pixabay

A/B 测试是如何进行的?

由凯西·科济尔科夫 — 8 分钟阅读

简而言之:A/B 测试就是通过创建可信的克隆来研究因果关系——两个相同的项目(或者,更典型的是,两个统计上相同的组)——然后观察不同对待它们的效果。

照片由 Unsplash 上的 Morning Brew 拍摄,由作者编辑

我如何构建一个深度学习的表情符号 Slackbot

由吴 — 12 分钟读完

当我在加州大学伯克利分校完成我的计算机系统博士论文时,我经常想知道人工智能世界的生活是什么样的。我的人工智能朋友们不断吹嘘深度学习将如何彻底改变从医学到网上购物的一切——他们的论文一经发布就获得了 100 次引用(见鬼!).

弗兰基·查马基在 Unsplash 上的照片

生产中的深度强化学习

由迈赫迪·本·阿耶德和帕特里克·哈林娜——6 分钟阅读

设计用户体验是一门困难的艺术。与其他应用程序相比,视频游戏为设计师提供了一个巨大的工作空间。在 Zynga,我们一直在想创新的方法来最大化用户在玩游戏时的体验。

编写一个 Web 应用程序来模拟赌徒的破产问题

由 Claudia Ng — 4 分钟阅读

我发现模拟是理解数学概念的一种有用的方式,所以我最近编写了一个程序来说明赌徒的破产问题。我做了一个 web app,用 Python 模拟了一系列游戏及其结局。

我们的每日精选将于周一回归!如果你想在周五收到我们的 每周文摘 ,很简单!跟随 我们的出版物 ,然后进入你的设置,打开“接收信件”您可以在此 了解有关如何充分利用数据科学 的更多信息。

R 中的 A/B 测试

原文:https://towardsdatascience.com/a-b-testing-in-r-ae819ce30656?source=collection_archive---------15-----------------------

测量用户体验的分析

什么是 A/B 测试?

A/B 测试是一种用于测试同一特性的两个变体的响应率是否不同的方法。例如,您可能想要测试对网站的特定更改(如将购物车按钮移动到网页的右上角而不是右侧面板)是否会改变点击购物车并购买产品的人数。

A/B 测试也称为分割测试,在这种测试中,同一网页的两个变体同时显示给网站访问者群体中的不同样本。然后,比较两种变体的转换次数。通常,给出更高比例变体的变体是获胜变体。

然而,由于这是一个数据科学博客,我们希望确保两种变体的转换比例差异具有统计学意义。我们可能还想了解访问者的哪些属性在推动这些转化。那么,让我们继续你的数据问题。

数据问题

  • 最近进行了一次 A/B 测试,贵公司的产品经理想知道新版本的网页是否会带来更多的转化率。根据你的分析向你的产品经理提出建议
  • CRM 经理很想知道,根据我们收集的用户首次访问网站时的属性,我们可以多准确地预测用户是否有可能使用我们的电子邮件。向客户关系经理汇报你的发现。

数据集

提供了四个数据集。

  • 访问包含来自 10,000 个不同用户的数据,并包含以下各列:
  • user_id:用户的唯一标识符
  • visit_time:时间戳,表示访问网站的日期和时间
  • 渠道:提示用户访问网站的营销渠道
  • 年龄:用户访问网站时的年龄
  • 性别:用户的性别
  • 电子邮件参与度包含那些参与最近电子邮件活动的用户的数据。该文件包含以下列:
  • user_id:用户的唯一标识符
  • clicked_on_email:表示用户参与电子邮件的标志,其中 1 表示用户点击了电子邮件
  • 变化包含指示每个用户看到 A/B 测试的哪些变化的数据。该文件包含以下列:
  • user_id:用户的唯一标识符
  • 变化:用户看到的变化(控制或处理)
  • 测试转换包含由于 A/B 测试而转换的用户的数据。该文件包含以下列:
  • user_id:用户的唯一标识符
  • converted:表示用户已转换的标志(1 表示已转换

导入数据集并清理

我总是首先使用主键或唯一标识符来组合文件。然后我决定如何处理这些数据。我发现这种方法很有用,因为我可以扔掉以后不需要的东西。它还帮助我从整体上查看数据集。

在这个实例中,我们的惟一标识符是 user_id。使用以下代码合并文件后,

merge_1<-merge(variations_df,visits_df,by.x="user_id",by.y="user_id")  
 merge_2<-merge(merge_1,test_conv_df,by.x="user_id",by.y="user_id",all.x=TRUE)  
 merge_3<-merge(merge_2,eng_df,by.x="user_id",by.y="user_id",all.x=TRUE)

我发现我必须创建自己的二进制变量,来判断用户是否转换了邮件,以及他们是否点击了邮件。这是基于在 test_conversions.csv 和 email_engagement.csv 文件中找不到他们的用户 ID。我用 0 代替了所有的 NA。

merge_3$converted<-if_else(is.na(merge_3$converted),0,1)  
 merge_3$clicked_on_email<-if_else(is.na(merge_3$clicked_on_email),0,1)  
 merge_3$converted<-as.factor(merge_3$converted)  
 merge_3$clicked_on_email<-as.factor(merge_3$clicked_on_email)

下一个任务是将访问时间之类的变量转换成能够为用户提供有意义信息的信息。

merge_3$timeofday<-  mapvalues(hour(merge_3$visit_time),from=c(0:23),  
               to=c(rep("night",times=5), rep("morning",times=6),rep("afternoon",times=5),rep("night", times=8)))  
 merge_3$timeofday<-as.factor(merge_3$timeofday)

现在,数据已经被清理了,是时候探索数据,以了解用户转换和他们在网站上访问的变化之间是否有关联。

数据探索和可视化

要检查的数据的最简单的方面是确定根据用户查看的变化类型转换的用户比例是否确实存在差异。运行博文末尾提供的代码,会给出下面的图形和比例:

对照:0.20 处理:0.24

A/B 检验显著性的统计检验

为了测试比例差异是否具有统计学意义,我们可以进行比例差异测试或独立性卡方测试,其中零假设是用户是否转换与他们访问的变异类型之间没有关联。

对于这两个测试,p 值< 0.05 was observed indicating a statistically significant difference in proportions.

I went a step further and ran logistic regression to understand how the other attributes of the users contributed to the difference in proportions. Only the type of variation and income (p-values less than 0.05) appeared to contribute to the difference in conversion proportions. A calculation of McFadden’s R-squared tells us that only 12.94% of the variation in proportions can be explained by the variation type and user attributes provided within our dataset.
因此,我对产品经理的回答如下:

与对照组相比,治疗组的转换率存在统计学显著差异。然而,很难理解为什么会这样。最好重复这个测试 2-3 次,以交叉验证结果。

探索性数据分析,了解用户参与电子邮件的驱动因素

柱状图的产生是为了检查用户属性和他们是否点击了电子邮件之间的视觉关系。

在运行探索性数据分析时,我注意到 1,243 个用户的年龄缺失。这些用户在分析中被忽略了,因为我无法在没有任何知识的情况下估算他们的年龄。为了了解点击电子邮件的用户平均年龄的差异,制作了箱线图和数字摘要。

结果发现,点击电子邮件(“1”)的人平均收入比不点击的人高。然而,两组都有很高的标准差,因此收入似乎不是一个有用的指标。

使用统计模型进行显著性检验

数据集被随机分为训练集(70%)和测试集(30%)用于建模。运行逻辑回归来确定哪些属性在解释用户是否点击电子邮件方面具有统计上的显著贡献。

该模型在训练集上进行训练,并在测试集上进行准确性预测。通过在不同阈值设置下绘制真阳性率(TPR)对假阳性率(FPR)的曲线来生成 ROC 曲线。AUC 是 ROC 曲线下的面积。根据经验,具有良好预测能力的模型的 AUC 应该更接近 1 (1 是理想的)而不是 0.5。在我们的例子中,我们的 AUC 为 0.84,显示了相当好的准确性。

虽然分数不错,但最好进行某种形式的交叉验证,以进一步验证结果并确保可重复性。

逻辑回归模型的总结证实了我们直观看到的情况,即用户点击电子邮件的可能性的最佳预测因素是:

频道

表示“作用”

-性别

我对 CRM 经理的回答是,电子邮件转化率的主要预测因素是年龄(年长用户更有可能点击)、渠道(点击付费在点击用户中很受欢迎)和性别(男性比女性更有可能点击)。然而,我想通过更大的样本来验证这些结果,以允许交叉验证。

最后的想法

希望这篇博文在某种程度上揭开了 A/B 测试的神秘面纱,为您提供了一些测试统计显著性的方法,并向您展示了探索性数据分析和统计测试如何一起工作来验证结果。

请注意,本例中使用了非常小的样本量(大约 4000 名用户),因此运行和训练复杂的机器学习算法没有意义。

我很喜欢你的反馈和建议,所有有用的代码都在下面提供,也可以在 github 上下载。😃

https://gist . github . com/shedoedasdatascience/de 3c 5d 3c 88132339347 c7da 838 a 126

A/B 测试——有更好的方法吗?多兵种土匪初探

原文:https://towardsdatascience.com/a-b-testing-is-there-a-better-way-an-exploration-of-multi-armed-bandits-98ca927b357d?source=collection_archive---------6-----------------------

使用ε-贪婪算法、Softmax 算法、UCB 算法、Exp3 算法和 Thompson 采样算法

Benoit Dare 在 Unsplash 上的照片

被困在付费墙后面?点击这里阅读完整的故事和朋友链接!

我是 Greg Rafferty,湾区的数据科学家。这个项目的代码可以在我的 GitHub 上找到。

在这篇文章中,我将模拟一个传统的 A/B 测试并讨论其缺点,然后我将使用蒙特卡罗模拟来检查一些不同的多臂 bandit 算法,这些算法可以缓解传统 A/B 测试的许多问题。最后,我将讨论 Thompson 抽样特定情况下的终止标准。

第 1 部分:传统的 A/B 测试

今天的网站精心设计,以最大化一个甚至几个目标。应该“现在就买!”按钮是红色还是蓝色?哪条新闻标题吸引了最多的点击量?哪个版本的广告点击率最高?为了确定这些问题的最佳答案,软件开发人员采用了 A/B 测试——一种统计上合理的技术来比较两种不同的变体,版本 A 和版本 B。本质上,他们试图确定下面蓝色分布的平均值是否实际上不同于红色分布的平均值,或者这种明显的差异实际上只是随机的?

还有一个中心极限定理的例子

在传统的 A/B 测试中,您首先要定义版本之间有意义的最小差异。在上述分布中,版本 A(通常是当前版本)的平均值为 0.01。假设这是 1%的点击率,或者说 CTR。为了将我们的网站改为 B 版,我们希望看到至少 5%的改进,或至少 1.05%的点击率。接下来,我们设置我们的置信水平,即统计置信水平,即我们观察到的结果是由于真实的差异而不是随机的机会。通常,这被称为 alpha ,并被设置为 95%。为了确定要收集多少观察值,我们使用功效分析来确定所需的样本量。如果α可以被认为是产生 I 型错误(假阳性)的可接受的比率,那么可以被认为是产生 II 型错误(假阴性)的可接受的比率。

许多统计学家认为,第一类错误的代价是第二类错误的 4 倍。换句话说:你的电子商务网站目前运行良好。你相信你已经发现了一个可以增加销售额的改变,所以你实施了这个改变,却发现这个改变实际上伤害了网站。这是一个I 型错误,已经让你失去了销售。现在想象一下,你考虑做出改变,但决定它不会改善事情,即使事实上它会改善,所以你没有做出改变。这是一个第二类错误,除了潜在的机会,你什么也没损失。因此,如果我们将我们的置信水平设为 95%,这意味着我们只愿意接受 5%的实验中的 I 型错误。如果第一类错误的代价是第二类错误的 4 倍,这意味着我们将功率设置为 80%;我们愿意保守一点,在 20%的时间里忽略潜在的积极变化。

版本 A 是当前运行的版本。因此,我们有历史数据,可以计算平均 CTR 和相应的标准差。不过,我们需要 B 版本的这些值,而 B 版本还不存在。对于平均值,我们将使用 5%的改进值,因此mean_b = 1.05 * mean_a。尽管标准偏差需要估计。当这种估计很困难时,这对于传统的 A/B 测试来说是一个严重的缺点。在我们的例子中,我们假设版本 B 与版本 a 具有相同的标准偏差。用 sigma 代表标准偏差,用 d 代表我们两个平均值之间的差值,我们需要查找 alphabetaz 值,并用以下等式计算我们的样本量:

这样,我们只需运行我们的 A/B 测试,直到获得所需的样本大小。我们随机向我们网站的访问者展示版本 A 或版本 B,并记录每个版本的点击率。然后,您可以使用统计软件包或t-检验计算和 t-检验表来得出一个 p 值;如果 p 值小于您的 alpha 值,在本例中为 0.05,那么您可以 95%的信心声明您观察到了版本 A 和版本 B 之间的真正差异,而不是偶然的差异。

传统 A/B 测试的缺点

传统的 A/B 测试的最大缺点是一个版本可能比另一个版本差很多,但是你必须继续向访问者提供那个版本,直到测试完成,因此失去了销售。如前所述,您还必须对版本 B 的标准偏差进行估计;如果你的猜测不正确,你可能收集不到足够的样本,无法达到统计功效;也就是说,即使版本 B 确实比版本 A 更好,即使你的实验证明了这一事实,你也没有足够的样本来宣布这种差异具有统计学意义。你会被迫接受假阴性。

如果有一种方法可以运行 A/B 测试,但又不浪费时间在劣质版本 B(或者 C、D、E……)上,那就太好了。

第 2 部分:多股武装匪徒

那些边上只有一个杠杆的老式吃角子老丨虎丨机总是拿走你的钱——那些被称为独臂强盗。想象一下,一整排机器并排排列,以不同的利率和价值支付。这是多臂大盗的想法。如果你是一个想要最大化你的赢款的赌徒,你显然想要玩最高支付的机器。但是你不知道这是哪台机器。你需要随着时间的推移探索不同的机器,以了解它们的收益是多少,但你同时也想利用收益最高的机器。类似的场景还有理查德·费曼的餐厅问题。每当他去餐馆,他都想点菜单上最美味的菜,但他必须点所有可用的菜才能找到最好的菜。这种开发的平衡,选择一个在过去有良好回报的行动的愿望,和探索,尝试可能产生更好结果的选择的愿望,就是多臂强盗算法被开发的目的。

他们是怎么做到的?我们来看几个算法。我不会花太多时间讨论这些算法的数学,但是我会在我的 Github 上链接到每个算法的 Python 实现,您可以参考这些实现了解更多细节。我对每个算法都使用了相同的符号,所以select_arm()update()函数应该能够完整地描述数学。

ε-贪婪的

ε贪婪的 T4 算法基本上平衡了开发和探索。它采用一个介于 0 和 1 之间的参数epsilon,作为探索选项(在多臂土匪讨论中称为 arms)的概率,而不是在测试中利用当前的最佳变体。例如,假设ε被设置为 0.1。每次访问者来到被测试的网站,都会随机抽取一个 0 到 1 之间的数字。如果该数字大于 0.1,那么将向该访问者显示表现最好的变体(最初是版本 A)。如果该随机数小于 0.1,则将从所有可用选项中选择一个随机臂并提供给访问者。访问者的反应将被记录下来(点击或不点击,销售或不销售,等等。)并且那只手臂的成功率也会相应更新。

评估多臂 bandit 算法时,需要考虑几个因素。首先,您可以查看选择当前最佳手臂的概率。每个算法都需要一点时间来稳定和找到最佳臂,但是一旦达到稳定,ε-Greedy 应该以(1-ε)+ε/(臂数)的速率选择最佳臂。这是因为(1-ε)%的时间,它将自动选择最佳臂,然后剩余时间,它将以相等的速率选择所有臂。对于不同的ε值,精度如下:

在所有这些试验中,我模拟了 5 个失败/成功比率为[0.1, 0.25, 0.5, 0.75, 0.9]的手臂。这些值跨越的范围比通常在这样的测试中看到的要宽得多,但它们允许手臂在模拟比其他情况下所需的迭代次数少得多的迭代后显示它们的行为。每张图都是对 5000 次实验进行平均的结果,其中 250 次实验的范围为

epsilon的低值对应于更少的探索和更多的利用,因此该算法需要更长的时间来发现哪个是最好的 arm,但是一旦发现,它就以更高的速率利用它。这一点可以从蓝线开始时的缓慢速度看得最清楚,但随后蓝线穿过其他手臂,并以较高的速度稳定下来。

当有许多武器在使用时,所有武器的预期报酬大致相似,观察算法的平均报酬可能是有价值的。下图再次显示了一些 epsilon 的比较值:

然而,这两种方法都关注于需要多少次试验才能找到最佳的手臂。一种着眼于累积回报的评估方法将更加公平地对待那些预先关注学习的算法。

显然,选择epsilon的值非常重要,而且不是微不足道的。理想情况下,当试验次数很少时,您会想要一个高值(高探索),但是一旦学习完成并且知道了最佳手臂,您会转换到一个低值(高开发)。有一种技术叫做退火,我不会在这里做太多的详细介绍,但它非常简单。再次,查看我的 Github 代码了解详情,但它基本上完全按照我描述的那样做:随着试验次数的增加调整epsilon。使用退火的ε-贪婪算法并绘制选择每个臂的比率看起来像这样:

有了每个臂的这些(公认的极端)值,算法很快就选定了最佳的arm_0,并在很短的时间内选择其余的臂。

多臂 bandit 方法的最大优势之一是,如果一个臂明显是赢家,您可以提前取消测试。在这些实验中,每一次尝试都是伯努利试验——结果要么是成功(一次广告点击、一次销售、一封电子邮件注册),要么是失败(用户不采取任何行动就关闭网页)。这些试验总体上可以用贝塔分布来表示。请看下图。首先,每一组都有相同的概率出现任何结果。但随着越来越多的试验积累,每只手臂的成功概率变得越来越专注于其实际的、长期的成功概率。注意,y 轴是概率密度,并且在每一帧中增加;为了清楚起见,我省略了它,所以只要记住每条曲线下的面积总是正好为 1。随着曲线变得越来越窄,它们相应地变得更高,以保持这个恒定的面积。

注意每只手臂的峰值是如何开始围绕其实际支付概率[0.1, 0.25, 0.5, 0.75, 0.9]的。您可以使用这些分布进行统计分析,如果达到统计显著性,可以提前停止您的实验。另一种静态看待这些变化的方式是:

这显示了一个跨度为 1,000,000 次试验的单个实验(与跨度为 250 的 5000 次实验的平均结果相反),以及更真实的[0.01, 0.009, 0.0105, 0.011, 0.015]值(在这种情况下,我模拟了点击率,CTR)。但我想指出的是,arm_1,最好的手臂,被使用得更频繁,因为ε-Greedy 喜欢它。它周围的 5%置信区间(阴影区域)比其他臂要紧密得多。正如在上面的 gif 中,最佳臂具有更紧密和更高的钟形曲线,代表更精确的价值估计,此图表显示使用多臂 bandit 方法允许您利用最佳臂,同时仍然了解其他臂,并且比传统 A/B 测试更早达到统计显著性。

Softmax

epsilon-Greedy 的一个明显缺陷是它完全随机地进行探索。如果我们有两个回报非常相似的手臂,我们需要探索很多来了解哪个更好,所以选择一个高ε。然而,如果我们的两臂有非常不同的奖励(当然,当我们开始实验时,我们不知道这一点),我们仍然会设置一个高的ε,并在较低的支付奖励上浪费大量时间。 Softmax 算法(和它的退火对应物)试图通过在探索阶段选择每个手臂来解决这个问题,大致与当前预期的回报成比例。

temperature参数的目的与ε贪婪算法中的epsilon相似:它平衡了探索利用的倾向。在极端情况下,0.0 的温度将始终选择性能最佳的手臂。无穷大的温度会随机选择任何一个臂。

在比较这些算法时,我希望您观察它们在探索/利用平衡方面的不同行为。这就是多兵种土匪问题的症结所在。

UCB1

尽管 Softmax 算法考虑了每个 arm 的期望值,但这确实是合理的,因为一个表现不佳的 arm 最初会连续成功几次,从而在利用阶段受到算法的青睐。即使他们没有足够的数据来确定,他们也会对可能有高回报的武器挖掘不足。因此,考虑我们对每个手臂的了解程度,并鼓励算法稍微倾向于那些我们对其行为没有高度信心的手臂,以便我们可以了解更多,这似乎是合理的。算法的置信上限类就是为此而开发的;在这里,我将演示两个版本,UCB1 和 UCB2。它们的操作方式相似。

UCB1 根本不显示任何随机性(你可以在我在 Github 上的代码里看到,我根本不导入random包!).与ε-贪婪和 Softmax 相反,它是完全确定的。此外,UCB1 算法没有任何需要调整的参数,这就是为什么下面的图表只显示了一个变体。UCB1 算法的关键是它的“好奇心红利”。当选择一个手臂时,它会获得每个手臂的预期奖励,然后加上一个奖金,该奖金的计算与奖励的置信度成反比。它对不确定性持乐观态度。因此,相对于可信度较高的手臂,可信度较低的手臂会得到一点提升。这导致算法的结果在不同的试验之间摇摆不定,尤其是在早期阶段,因为每个新的试验都为所选的分支提供了更多的信息,所以在接下来的几轮中,其他分支基本上会更受青睐。

UCB2

UCB2 算法是 UCB1 的进一步发展。UCB2 的创新在于确保我们在尝试新的手臂之前,对同一只手臂进行一段时间的试验。这也确保了从长远来看,我们定期从开发中休息一下,以重新探索其他武器。当预期回报会随着时间变化时,UCB2 是一个很好的算法;在其他算法中,一旦发现最佳臂,它将被优先考虑,直到实验结束。UCB2 挑战了这一假设。

UCB2 有一个参数,alpha,它可以有效地调整 UCB2 支持某些分支的周期长度。

Exp3

最后,我们有 Exp3 算法。UCB 类算法被认为是在随机环境中表现最好的算法;也就是说,每次试验的结果都是完全随机的。相比之下, Exp3 算法被开发用来处理审判对抗的情况;也就是说,我们要考虑未来试验的预期结果可能会被先前试验的结果所改变的可能性。股票市场就是一个很好的例子,可以说明 Exp3 算法什么时候是好的。一些投资者看到一只股票以较低的每股价格上市,即使它目前的回报并不是很大,也买了它,但大量购买股票的行为导致其价格飙升,其表现也是如此。由于我们的算法预测了这样或那样的事情,该股票的预期收益正在发生变化。因此,在这些实验中,Exp3 的表现似乎比其他算法差得多。我完全随机地运行每个试验,这是一个随机设置,Exp3 在其中从未被开发为强大。

比较算法

现在,让我们一起来看看所有这些算法。正如你所看到的,在这一组简短的试验中,UCB2 和 epsilon-Greedy 看起来像是在一起运行,UCB2 有更多的机会进行探索。然而,UCB2 的改进速度稍快,事实上在更长的时间内,它超过了 epsilon-Greedy。Softmax 往往很早就达到峰值,这表明它继续探索,以利用其最佳臂的知识为代价。作为 UCB2 的早期版本,UCB1 落后于其更具创新性的兄弟。Exp3 是一个有趣的例子;这似乎是迄今为止表现最差的,但这是意料之中的,因为这些试验不是 Exp3 所擅长的。相反,如果试验环境是对抗性的,我们预计 Exp3 会更有竞争力。

那些图表中有一个算法我们还没有讨论过, 汤普森采样 。这个算法是完全贝叶斯的。它从后验分布中为每只手臂生成一个期望回报向量,然后更新该分布。

该算法从变化的概率分布中抽取一个随机数,并选择最大值。它只是在每次试验中拉动预期回报最高的杠杆。汤普森取样学非常快哪一个是最好的臂并且非常赞成它向前,以探索为代价。只要看看所有其他手臂中的不确定性(阴影区域的宽度)就知道了!那是近乎纯粹的剥削和极少探索的结果。

你的多臂强盗实验什么时候结束?

因为 Thompson 抽样是以贝塔分布给定的频率抽取臂,我们可以使用许多不确定的统计技术来知道一个臂何时由于优势而领先于机会。Google Analytics 开发了一个合理的解决方案,使用他们所谓的 潜在价值剩余 。他们首先检查是否满足三个标准,然后检查是否出现了“冠军”手臂,并宣布实验完成。这三个标准是:

  • 该网站每天都有活跃的流量
  • 该实验至少运行了两周,以消除任何每周的周期性。
  • 剩余的潜在价值不到 1%

在这一点上,一旦任何一只手臂在至少 95%的情况下被选中,实验就结束了。

潜在价值剩余在文献中也被称为“遗憾”。它描述了 CTR 等指标在领先的基础上还能提高多少。当另一只手只比领先者多 1%的机会时,这种微弱的进步不值得继续测试。

测试中剩余的潜在值计算为(*θ*ₘₐₓ *— θ*) / θ**分布的第 95 个百分位数,其中*θ*ₘₐₓ是一行中*θ*的最大值,*θ**是最有可能达到最优的变异的*θ*值,*θ*是从每个臂的 beta 分布中提取的值。和以前一样,关于数学的细节请参考我的 Github repo ,或者阅读一位谷歌工程师发表的原始论文。

在我在本文开头描述的传统 A/B 测试中,置信区间为 95%,功效为 80%,版本 A 的 CTR 为 1%,假设版本 B 的 CTR 为 1.05%,所需的样本量至少是从每个版本中抽取的 635,829 个样本。在我的实验中,我为每只手臂取了 70 万张画。

当使用带有谷歌终止标准的汤普森抽样时,我模拟了 100 次实验,并对结果进行了平均。该算法确定版本 B 好 5%,平均5357拉动劣质版本 A 臂,6353 拉动优质版本 B

在传统的 A/B 测试中,我会为我的客户提供 60 多万次我的网站的劣质版本,而 Thompson Sampling 只需要 5000 次就能学会同样的事情。错误减少了 120 倍!

那么哪个土匪最好呢?这真的取决于你的应用和需求。它们都有各自的优点和缺点以及对特定情况的适用性。Epsilon-Greedy 和 Softmax 是该领域的早期发展,其性能往往不如置信上限算法。在 web 测试领域,UCB 算法似乎使用得最频繁,尽管 Thompson Sampling 提供了终止标准的好处,并且是 Google Analytics 的优化工具使用的算法。如果你的环境不是随机的,你可以尝试 Exp3 算法,它在敌对环境中表现更好。

A/B 使用 Amazon SageMaker 在生产中测试机器学习模型(讨论)

原文:https://towardsdatascience.com/a-b-testing-machine-learning-models-in-production-using-amazon-sagemaker-discussion-ee8953043397?source=collection_archive---------74-----------------------

用潜在的实时推理 ML 工作流来考虑 A/B 测试生产中的 ML 模型

基兰·卡瓦诺、大卫·尼根达和我,最近为 AWS 机器学习博客写了一篇关于使用亚马逊 SageMaker 在生产中 A/B 测试 ML 模型的文章。我推荐阅读这篇文章,并查看我们附带的 Jupyter 笔记本(亚马逊 SageMaker 的 A/B 测试)。

在这篇文章中,我想通过分享一个潜在的实时推理生产机器学习工作流的高级设计图,为我们的 AWS 博客文章添加背景。

一个潜在的实时推理 ML 工作流

请注意,ML 推理服务有多个模型,可用于向其端点提供推理请求。接下来的问题是,服务使用什么逻辑将推理请求路由到特定的 ML 模型。

在 Amazon SageMaker 上下文中,一个production variant" I标识了您想要托管的模型以及为托管它而部署的资源(直接来自文档!).在本帖中,我们将讨论 SageMaker 端点如何托管多个 ProductionVariant,用户可以(1)使用加权随机方法指定如何在production variant和它们相应的模型之间分配流量,或者覆盖这个默认的流量分配行为,以及(2)明确指定哪个 ProductionVariant 和相应的模型应该服务于一个推理请求。

这种灵活性为以各种方式使用生产流量对新的 ML 模型进行 A/B 测试提供了可能性,从而在新模型的验证过程中增加了一个有效的最终步骤。

AWS 开发者指南:生产中的测试模型。

A/B 测试-第 2 部分

原文:https://towardsdatascience.com/a-b-testing-part-2-42b94e1fb1dc?source=collection_archive---------33-----------------------

这是我的 A/B 测试系列的第二篇文章。在第一部分中,我们学习了 A/B 测试背后的想法。在这篇文章中,我将带你浏览 A/B 测试背后的统计数据,并重点分析测试的结果。我将使用 Udacity 的 A/B 测试课程的最终项目作为案例研究。

我们将回顾:

  • 测试概述
  • 测试前分析
  • 分析测试结果
  • 建议

测试概述

在线学习平台 Udacity 在其课程概览页面有两个选项 开始免费试用获取课程资料

如果学生单击“开始免费试用”按钮,他们将被要求输入信用卡信息,并注册参加付费课程的免费试用。14 天后,除非先取消,否则会自动收费。

如果学生单击“访问课程材料”按钮,他们将能够观看视频并免费参加测验,但他们不会获得辅导支持或认证证书,也不会提交他们的最终项目以获得反馈。

Udacity 看到许多学生注册了免费试用,过了一段时间就放弃了这门课程,因为他们根本没有足够的时间来专注于这门课程。因此,Udacity 决定进行一项测试,如果学生点击开始免费试用按钮,他们将被询问他们有多少时间可以投入到课程中。如果学生选择每周 5 小时或更多,他们将像往常一样通过结账流程。但是,如果他们选择每周少于 5 小时,将会出现一条消息,表明 Udacity 课程通常需要更多的时间才能成功完成。此时,学生可以选择继续注册免费试用,或者免费获取课程材料。这张截图展示了实验的样子。

测试背后的假设

假设是,这可能会预先为学生设定更明确的期望,从而减少因为没有足够的时间而离开免费试用的沮丧学生的数量,而不会显著减少继续通过免费试用并最终完成课程的学生的数量。这将改善学生的整体体验,并提高教练支持可能完成课程的学生的能力。

为了更好地理解用户流程,您可以查看以下图形:

新设计中的用户流

提示:在不知道用户流量的情况下,分析一个测试是没有意义的!此外,不可能对不变量和评估度量做出正确的决定。

测试前分析

在运行测试之前,我们需要执行测试前分析,包括:

  • 选择分流单位
  • 选择不变/评估指标
  • 计算所需的样本量

分流单位

在这个测试中,Udacity 选择 cookie 作为导流单元。如果学生注册了免费试用,从那时起,他们将被一个用户 id 跟踪。同一个用户名不能注册两次免费试用。对于未注册的用户,即使他们在访问课程概述页面时已登录,也不会在实验中跟踪他们的用户 id。

不变/评估指标

不变指标用于健全性检查。换句话说,这些指标的值不应该受到变更的影响。查看用户流程图,我选择以下指标作为不变指标:

不变度量

Udacity 添加到用户漏斗的新层位于用户点击开始免费试用按钮之后。因此,与到达该按钮之前的用户旅程相关的指标应该保持不变。接下来,我们需要确定评估指标:

评估指标

基于我们期望看到的测试假设:

  • 保留率的增加,这意味着更多的学生在免费试用后留在了测试组。
  • 总转化率下降,这意味着测试组中沮丧的学生较少。
  • 对净转换率没有太大影响,这意味着我们在测试组没有失去大量付费用户。

Udacity 给出了变更前每天的指标值。这些是我们的基线值。请注意,这些值与我们的用户数量相关。

人口数据

假设我们取了一个大小为 5000 的样本,这意味着 5k 的 cookies 查看了课程概述页面。基线值需要调整,因为现在我们有 5k cookies,而不是 40k:

抽样资料

设置测试的显著性水平和功效

为了理解测试的显著性水平和功效,让我们看看在无效假设和替代假设下的 d (测试和控制中的度量 X 的值之间的差异)的分布:

零假设和替代假设下 d 的分布

再次记住什么是无效假设和替代假设。零假设表明测试组和对照组之间没有真正的差异( d = 0),替代假设表明有差异( d !=0).你可能会问自己,在零假设下, d 的分布意味着什么?为什么无效假设和替代假设有分布?答案在于我们是从我们的人口中抽样的(还记得 5k 饼干吗?)!也就是说,每次采样,我们都会得到一个新的值。在零假设下,这些值的分布将是平均值为 0 的正态分布。

显著性水平和置信度水平:显著性水平通常被称为 1 类误差,用希腊字母 Alpha 表示。这是错误拒绝零假设的概率,在上图中用绿色标出。该区域位于零假设曲线之下,并且在其置信区间之外。在工业中这个值如果经常设置为 5%。黑色方块(1-alpha)显示的区域称为置信水平。当零假设为真时,置信水平基本上是拒绝替代假设的概率。如果 alpha 设置为 5%,则置信度为 95%。

置信区间:我们不确定 d真值 ,所以我们使用 95%的置信水平在观察到的 d (我们测量的 d 是我们实验的结果)周围建立一个置信区间,我们这样解释: 在 95%的样本中,d 的真值落在置信区间内。

β和功效:类型 2 误差或β是错误拒绝零假设的概率,这是设置为 20%。在上图中,贝塔以紫色突出显示。所以 1-斗鱼 a.k.a 测试的功率是设置为 80%。图表中的红点表示功率。换句话说,能力是在你应该拒绝零假设的时候拒绝零假设的概率!(这是真正,给熟悉混淆矩阵的人看。)

我的朋友就是你所需要的去理解测试背后的数据!

来源

计算所需的样本量

现在我们应该计算我们需要的最小 cookies 数(最小样本大小),以达到期望的统计功效。

总转化、留存、净转化都是概率,也就是说是二项式分布。基于中心极限定理,这些度量的标准偏差由以下公式给出:

为了计算所需的样本大小,假设我们有两个样本,一个是基线(网站的当前版本),另一个是测试版本(我们还没有推出,想找到它的大小)。实验功效与样本量有如下关系:

双尾检验中检验能力与样本量的关系

如您所见,样本大小包含在标准误差中。如果您将比例放入公式中,并假设我们希望在对照组和测试组之间有一个很好的 50/50 分割,那么样本大小将是:

酷!我们有一个样本量的公式!假设功效设置为 80%,显著性水平设置为 5%,则更一般的公式是:

如果我们想要测试组和对照组各占一半,那么 r=1。为了能够计算每个指标所需的样本量,我们需要基线转换最小期望变化(也称为实际显著性水平)。

来源

每个指标的预期实际显著性水平由 Udacity 给出。假设测试组和对照组的比例为 50/50,我们得到每个指标的样本大小的以下值:

每个评估指标所需的样本量

关于工作台的重要注意事项:

  • 您需要选择您在最后一列中为测试计算的最大天数。这属于保留指标,表明需要 100 多天才能获得保留指标所需的 cookies 数量。这将是一个非常长的时间来运行一个测试,这是不值得的努力。我们放弃这一指标,转而使用第二大数字,它属于净转换率。
  • 请注意,最后一列是基于我们每天可以处理 40k cookies 的假设计算的。这不实际!我们绝不会让所有人都参与实验,而是应该选择一定比例的人。假设我选择让 80%的人参与这个实验,那么我大概需要 22 天。

分析测试结果

恭喜你!您设计了您的测试,并运行了大约 3 周,现在您有了结果!

健全性检查

我们需要做的第一件事是健全性检查,我在这篇文章中强调了很多。我们为健全性检查选择了三个不变指标,让我们逐一检查:

  1. 查看课程概述页面的 cookies 数量:

我们决定测试组和对照组各占一半。这意味着浏览课程概览页面的 cookies 数量在两组之间应该不会有太大的差异。我们查看两组中的 cookies 总数,并检查它们是否有显著差异。如果答案是肯定的,我们查看每天的 cookies 数量,并检查差异来自哪里。

这些数字看起来非常相似。但是我们需要确定它们之间的差异是随机还是显著。我们可以通过二项式分布来模拟将 cookies 分配给控制组和测试组,成功概率为 50%(假设成功意味着被分配给控制组)。我们想要回答的问题是,如果我们有一个测试+控制组大小的样本,并且有 50%的概率被分配到控制组,那么在控制组中看到观察到的 cookies 分数有多奇怪?

为了回答这个问题,我们需要建立一个大约 50%概率的置信区间,并检查在控制组中观察到的饼干部分是否在该区间内。

如前所述,二项式分布的标准误差通过以下公式计算:

为了建立置信区间,我们首先需要计算误差幅度:

误差幅度和置信区间关系

为了让事情更容易理解,我做了这张表:

查看课程概述页面的 cookies 数量的健全性检查

请注意,我假设本次计算的置信度为 95%。

由于对照组中观察到的饼干比率在置信区间内,我们认为差异不显著

2.点击开始免费试用按钮的 cookies 数量

按照与上面相同的公式和推理,我们得到这个表:

对点击免费试用按钮的 cookies 数量进行健全性检查

观察到的比例在 CI 范围内,因此我们可以检查第三个指标。

3.点击通过概率(CTP)

我们有两个概率,我们想知道它们之间的差异是否显著。

从总体中抽取两个样本,每个样本都有自己的大小和比例

我们需要利用前面提到的 SE(差异)公式:

两个样本比例的标准误差

我们期望两组的 CTP 之间的差异为零。因此,我们在 d = 0 附近设定一个置信区间,并检查 d 的观测值是否落在该区间内。

CTP 的健全性检查

根据上表,观察到的两组 CTP 之间的差异并不显著。我们的理智检查都完成了!

检查效果大小

现在我们进入有趣的部分!检查测试结果是否具有统计和实际意义。

  1. 总转换

为了计算这个指标,我们需要注册免费试用的用户数和点击免费试用按钮的 cookies 数。注册数据是不完整的,有些日子我们有点击数据,但没有注册数据。因此,在计算总转化率时,我们需要将这些日子过滤掉。

类似于点击率,我们使用 SE(差异)在两组总转化率之间的观察差异周围做出置信区间。与对照组相比,试验组的总转化率降低了 2.06%。

两组总转换值差异的置信区间

回头看看测试的假设,我们预计总转换值会下降。我们预期的最低降幅为 1%,置信区间的下限大于 1%。换句话说,我们可以确定下降幅度将大于 1%,并且由于置信区间不包含 0,因此该结果在统计上和实践上都是有意义的。

2.净转换

与总转化率非常相似,我们围绕两组间观察到的差异建立了 95%置信水平的置信区间。

两组净转换率值差异的置信区间

在这种情况下,结果没有统计学意义,因为我们的置信区间包括 0。

建议

我们唯一有把握谈论的指标是总转化率。我们看到,在测试组中,这个指标的值下降了(正如我们所预料的)。然而,净转换指标的结果并不显著!这意味着我们没有信心说出这个指标会如何变化,或者基本上付费用户数量会如何变化!**

我建议不要启动这项测试。虽然总转化率的下降使得沮丧的学生数量也减少了,但是不清楚通过免费试用期并付款的学生数量如何变化。

资源

  • Udacity A/B 测试课程
  • A/B 测试背后的数学原理
  • 斯坦福讲座
  • 用 Python 进行 A/B 测试

A/B 测试统计:转化率的真实值和估计值

原文:https://towardsdatascience.com/a-b-testing-statistics-true-and-estimated-value-of-conversion-rate-b7a77db6f60e?source=collection_archive---------14-----------------------

如何确保你的分割测试结果在统计上是显著的(简单的说)

相信分割测试还是检查其统计显著性?(感谢❤巴鲁·金的插图)

轶事:
——我如何检查我的测试的统计显著性?
——我可以告诉你。我也能看出来。我如何检查?

A/B 测试是最受欢迎的用户体验研究方法之一,用于评估网站或移动应用的 UX 或 UI 更改的有效性。假设你改变了一些东西,开始了测试——似乎修改后的版本赢了。但是我们能确定吗?我们有百分之几的把握?

为了回答这个问题,让我们把这种方法 A/B 测试不作为一种测量用户参与度和变化满意度的方法,而是作为一种统计实验。那么,你需要知道什么才能确定我们可以接受所获得的结果呢?

A/B 测试结果不显示转化率

我的意思是它没有显示 CR 的实际值,而是估计值。无论你在实验中有多少用户,样本量仍然小于用户总数。因此,当您确定测试所需的样本量时,下一个逻辑问题是“我们需要多少用户来确保测试结果(估计的 CR 值)真正描述了事物的实际状态(真实的 CR 值)?

换句话说,估计 CR (T)真实值(Q) 有多接近。为了回答这个问题,我们需要置信区间。

什么是置信区间?

因此,我们运行了 A/B 测试,现在有了一些估计的转化率(让我们用 T 来表示)。但实际上实际转化率可能略少,也可能略多,我们不知道一个确切的数值,但可以从[a;b]包含它。这被称为置信区间。

样本越大,区间越小。这就是为什么在开始测试之前,确定每个实验组的最小用户数量是如此重要。

置信区间是以一定的置信度计算的。例如,如果置信度为 95% (通常如此),是什么意思?

下面是:如果我们对 100 个不同的样本进行 100 次测试,得到 100 个估计的 CR,并计算每个 CR 的置信区间,那么 100 个区间中有 95 个包含真实的 CR 值。

重要的是要理解置信水平是置信区间计算过程的特征,而不是区间本身。我们可以选择哪个置信度足以让我们相信测试结果。

因此,置信区间是 CR 估计的一种方式,它不仅产生单个值,而且产生包含实际 CR 值的值区间。置信水平显示了它被控制在那里的可能性。

那 95%从何而来?

我希望我已经成功地传达了信心水平概念的含义,所以现在我们来看看为什么通常是 95%,而不是 75%或 80%?

而且这里我还要介绍两个来自数理统计的术语(今天最后一个,我保证!)—显著性水平和统计功效。

但首先,让我们看看下面的图片。这是一个统计测试矩阵(a/b 测试是一个统计测试),它显示了 4 个场景:

统计检验矩阵:4 例

让我们仔细看看。

比方说,我们在网站上有一个红色的按钮,我们决定把它重新漆成蓝色。我们希望蓝色按钮会被更频繁地点击,所以我们运行 a/b 测试来检查这个假设。我们能得到什么结果?

  • 正误:测试显示两个按钮有相同的 CR,这是真的——对我们的用户来说没有区别。
  • 假阴性:测试显示两个按钮具有相同的 CR,但事实并非如此:事实上,用户更频繁地点击蓝色(或红色,无所谓)按钮。测试是错误的。
  • true-positive: 测试显示一个按钮比另一个好,确实如此。
  • 误报:测试显示用户喜欢一个,讨厌另一个按钮,但实际上两个按钮的 CR 是一样的。误导性的发现,测试是错误的。

因此,在两种情况下,结果是真实的,而在另外两种情况下,测试扭曲了真实的情况。

置信度

得到假阳性结果的概率通常被称为 I 型错误,通常用α表示。如果α=5%,这意味着 100 次中有 5 次我们记录到差异,而变量是相同的。

这种误导性的发现对我们意味着什么?很明显,我们很高兴,我们相信测试,我们花费时间和金钱来推出更改并将其介绍给所有用户,并且——没有影响,CR 是相同的,这是唯一可以预期的,因为从一开始就没有什么不同。无论你是在 5%的情况下还是在 1%的情况下做好了准备——这取决于你:)通常,人们同意α=5%,因此置信度(计算为 1-α)为 95%。

因此,置信水平(1-α)是不出现 I 类错误的概率(α)。如果测试显示变量 A 和变量 B 没有差异,则为结果的置信百分比。

如果我想要 99%而不是 95%呢?

请随意。但是你需要更多的人参与实验,或者在冠军和亚军的转化率之间有更大的差异。这会影响实验的时间,所以从你对结果有这么高的信心有多重要开始。

统计功效

然而,另一个错误的场景是可能的——当变体 A 和 B 在其转换率上有真正的差异,但是测试没有检测到它。这被称为假阴性结果或 II 型错误(用β表示)。

我们这是在冒险吗?错过了一个好主意,却没有实施。这是很痛苦的,但比第一类错误要稍微少一些,所以这里我们可以设置错误概率β=20%或更少。那么以 1-β计算的统计功效为 80%或更高。

统计功效是未出现 II 型错误的概率(β),即如果测试显示变量 A 和 b 之间的存在差异,则结果的置信百分比

回到置信区间

好了,现在我们准备计算置信区间,下面是如何做:

1.收集数据:

实验结果:样本量和转化率

2.计算变量 B 和 A 转换率之间的差异(如果变量 A 是赢家,则该差异可以是负数):

CR 差异

3.计算差值的置信区间:

CR 差异的置信区间。如果它不包含零,那就没问题。如果包含-您需要更多的流量或更大的差异之间的转换率您的变种。

可以得出什么结论?

  • 作为 A/B 测试的结果,我们得到的不是真实值,而是每个变量的 CR 估计值
  • 知道了估计的 CR 值,我们就可以计算包含真实 CR 值的置信区间
  • 在计算选项 A 和 B 之间的转化率差异的置信区间后,我们可以得出是否存在真正差异的结论
  • 我们不能 100%肯定这个结论,因为有两种类型的错误:第一类(误导性发现)和第二类(未能发现 CR 的真正差异)
  • 然而,虽然没有 100%的置信度,但如果我们在选择置信度时决定这样做,它可以是 95%甚至 99%(通常仍然是 95%,但可以更大,例如对于 A/B/C 测试)
  • 如果你想要更多的信心,你需要更多的流量或更大的冠军和亚军之间的转换率差异

在关闭时

  1. 只有当我们认为我们的样本分布是正态分布(可以是高斯分布、伯努利分布、皮尔逊分布等)时,上述所有方法才有效。),这意味着我们有均匀分布的概率,即有一个主质量(通过一些参数),在两个方向上都有微小的偏差。
  2. 如果您运行多变量测试或 A/B/n 测试(比较 n 个不同的变量),您应该使用校正值(例如 Bonferroni 校正值 )将置信水平保持在 95%。然而,它可能要求您运行测试一段不合理的长时间。
  3. A/B 测试可能显示错误的结果,这不仅是因为统计错误,也是因为技术错误。因此,在运行 A/B 测试之前,不要忘记通过运行 A/A 测试来检查测试设置:让两个流量组 A 和 B 被分配到相同的体验。如果你在工具的设置上犯了一个错误,你会看到转换率的不同(实际上不可能)。

A/B 测试:基础!

原文:https://towardsdatascience.com/a-b-testing-the-basics-86d6d98525c9?source=collection_archive---------10-----------------------

在 Unsplash 上由法扎德·纳齐菲拍摄的照片

什么、为什么、何时和如何

粉色和蓝色哪个颜色会让更多人点击网站的登录按钮?他们应该在主页上显示 Gif 而不是图片吗有多少菜单选项,五个还是七个,会吸引顾客哪个版本能更好地引导客户到达漏斗的末端

您可以大胆猜测,继续进行更改或 A/B 测试!

作者图片

A/B 测试用于确定某个产品的哪个版本在市场上表现更好。

从初创公司到大型科技公司,各种规模和行业的公司都依赖 A/B 测试来做出更明智的选择。即使是最简单的测试也能帮助做出重大决定。

什么是 A/B 测试?

A/B 测试是同时向网站访问者的不同部分显示同一网页的两个版本,以确定哪一个表现良好的过程。

基本就是确认哪个做的更好——这个版本(A)还是那个版本(B)

A/B 测试,也称为分割测试桶测试,本质上是一个实验,其中一个广告的两个或更多变体、营销电子邮件或网页被随机显示给用户,然后使用不同的统计分析方法来确定哪个变体推动更多的转化。

通常在 A/B 测试中,给出更高转化率的变体是胜出的变体,并且该变体可以帮助你优化你的站点以获得更好的结果。

为什么要进行 A/B 测试?

活动创建者在 Unsplash 上的照片

电子邮件活动中,一个活动的两个变体被发送给用户。通过这样做,营销团队将知道哪封邮件在鼓励打开或点击方面最有效。

但他们不会知道到底是什么导致用户打开邮件。是标题、主题、视觉效果还是邮件内容?这可以通过 A/B 测试来确定,这是邮件中最有说服力的元素?

它可以帮助你在做出改变的重大决定之前检查你的站点上的访问者和客户的行为,并帮助你增加成功的机会。简而言之,A/B 测试通过允许你将资源用于最大效果和效率来帮助你避免不必要的风险。

什么时候使用 A/B 测试?

一个在线学习平台想要改变他们的主页,新的、更吸引人的设计将增加浏览他们课程的用户数量。或者,他们可能希望在他们的课程概述页面上有更多关注职业的描述,这可能会鼓励更多的用户注册并完成他们的课程——A/B 测试可以为他们确认这一点。

的照片在的 Unsplash

可以使用 A/B 测试来测试网页上可能影响访问者在网站上浏览行为的任何内容。

以下是可通过 A/B 测试评估的变化列表— 标题、内容、页面设计、图片、促销和优惠、社交媒体提及、网站导航和用户界面、行动号召(CTA)文本和按钮、支付选项、交付选项等。

在 A/B 测试中,比较应该尽可能简单。例如,不要比较两个完全不同版本的网站,因为你不知道是什么因素造成了不同。同样,如果一个新的模块或菜单被添加到网站,它不能通过 A/B 测试进行测试,因为没有比较点。

如何进行 A/B 测试?

布鲁克·拉克在 Unsplash 上的照片

电子商务商店的理想客户漏斗如下:

首页 - > 分类列表/搜索商品 - > 查看商品页面 - > 购物车 - > 结账

随着用户在这个漏斗的各个阶段的下降,商店会失去用户。然后进行 A/B 测试,尝试有希望提高从一个阶段到下一个阶段的转化率的变化。

A/B 测试大致分为四个步骤:

确定变更和度量

首先,决定你能够收集和分析什么类型的信息。我们不只是猜测,而是使用适当的分析工具来确保您首先遇到了问题,并找到问题的确切位置。

这些分析通常会让你深入了解可以从哪里开始提高。例如,我们决定将产品页面上的行动号召(CTA) 按钮从“立即购买”更改为“立即购买”,以增加向购物车添加商品的用户数量。

然后选择一个指标来衡量用户的参与度。在我们的示例中,指标将是“立即购买”按钮的点击率。点击率(CTR) 是独立用户的点击数除以独立用户的浏览量。您可以选择任意多的指标,但是您评估的指标越多,您就越有可能观察到显著的差异。

定义你的假设

统计学中的假设检验是你对一个实验的结果进行检验,看你是否有有意义的结果。假设检验最重要和最令人困惑的方面是确定无效假设和替代假设

简单来说,在我们收集任何数据之前为真的陈述就是 零假设 。因此,在 A/B 测试中,基本的零假设是新版本并不比旧版本更好,甚至更差。对于我们的例子,新的点击率(CTR)小于或等于旧的点击率。

候补 是相互竞争、互不重叠的无效假设。我们试图证明的陈述总是交替出现。所以,在 A/B 测试中,另一个假设是新版本比旧版本好。对于我们的例子,新的 CTR 大于旧的 CTR。

设计实验(样本量、影响因素、运行时间、参与者 )

通常,用户被随机选择并分配到对照组治疗组。然后我们进行实验,对照组看旧版本,治疗组看新版本。

每个用户只能看到一个设计(A 或 B),即使他们更新了界面。这样,相同数量的人将查看每个版本,你可以衡量哪个版本实现了你认为有意义的提升。

您决定的样本大小将决定您可能需要等待多长时间,直到您收集到足够的数据。

分析 A/B 测试数据

在 Unsplash 上由 Carlos Muza 拍摄的照片

一旦你的实验完成,是时候分析结果了。这是分析师应该更加关注的地方。我们计算对照组和治疗组的度量值。

然后应用不同的统计技术,如使用自举、回归和各种其他机器学习算法的采样分布,来评估指标,并向您显示两个版本的页面表现之间的差异,以及是否存在统计上的显著差异。

A/B 测试困难

当设计 A/B 测试并根据其结果得出结论时,有许多因素需要考虑。一些常见的有:

  1. 现有用户第一次经历变化时的新奇效应和变化厌恶。
  2. 足够的流量和转化,以取得重大和可重复的结果。
  3. 对照组和治疗组受试者之间的一致性。
  4. 做出最终决策的最佳指标选择,例如衡量收入与点击量。
  5. 转换率的实际意义,推出新功能的成本与转换率增加的收益。
  6. 足够长的实验运行时间,以考虑基于一天/一周的时间或季节性事件的行为变化。

尼克·莫里森在 Unsplash 上拍摄的照片

我写这篇博客尽可能简单,这样没有 A/B 测试知识的人也可以对它有一个基本的了解。业界有各种各样的分析工具用于 A/B 测试比如 Google Analytics 和 Google Optimize,Vwo,Optimizely,HubSpot 的 A/B 测试套件,Crazy Egg 等。

对于有空闲时间的营销人员来说,A/B 不是奢侈品;他们是增长黑客的命脉。

A/B 测试最受欢迎的例子之一是41 种蓝色 ,当谷歌无法决定某个设计元素更喜欢两种蓝色中的哪一种时,据报道,他们使用 A/B 测试来评估 41 种不同蓝色的性能。此外,查看真实企业的 7 个令人难以置信的 A/B 测试示例行业级 A/B 测试示例。

精确的 A/B 测试方法可以带来巨大的好处——提高用户参与度、增加转化率、简化分析和增加销售——这是一个双赢的局面!!

A/B 测试:案例研究!

原文:https://towardsdatascience.com/a-b-testing-the-case-study-1030a94f3c4b?source=collection_archive---------19-----------------------

作者图片

使用 Python 分析测试结果。

在理论中,理论和实践是没有区别的,但是
实践中,却有。

我之前的博客给出了什么是 A/B 测试的基本概念。从图像在页面上的定位,到结账流程,我们都是 A/B 测试的坚定拥护者。一个概念的知识是不够的,这种知识的实现提供了最好的学习机会。

这篇博客是我作为 Udacity 的数据分析师 NanoDegree 项目的一部分参与的 A/B 测试案例研究的演练。本案例研究由 Udacity 开发并用于其许多项目中。

Audacity ”是一个在线学习平台,为学生提供各种课程、学位和认证。因此,Audacity 网站上典型新用户的客户漏斗如下:

主页- >探索课程- >查看课程概述页面- >注册课程- >完成课程

就像任何其他网站一样,漏斗顶部的用户数量会比底部多。Audacity 在这个漏斗的各个阶段都会失去用户。因此,它决定测试可以提高学生参与度的功能。Audacity 正在执行 A/B 测试,尝试有望提高从一个阶段到下一个阶段的转化率的变化。

他们决定引入的第一个变化是网页设计。Audacity 决定优化其主页,这样新的、更吸引人的设计将会增加探索他们课程的用户数量。

这基本上涵盖了漏斗的两个阶段,主页- >探索课程

设置了一个实验,以查看在控制组和治疗组中有多少用户参加了漏斗中的探索课程的下一阶段。然后选择主页上“探索课程”按钮的指标点击率(CTR) 来衡量各组用户的参与度。

这里的零假设是新的 CTR 小于或等于旧的 CTR。
H0:CTR _ new—CTR _ old<= 0

另一个假设是我们试图证明的,新的 CTR 大于旧的 CTR。
H1:CTR _ new—CTR _ old>0

数据收集了近 4 个月的时间,对照组人数为 3332 人,治疗组人数为 2996 人。主页动作,即浏览或点击按钮的访问者,被记录下来。

抽样资料

根据这些数据,我们计算了对照组和治疗组的 CTR。

对照组 CTR 为 0.2797 ,治疗组 CTR 为 0.3097 。然后计算两组的 CTR 之间的观察差异,发现为 0.030

然后,我们使用 bootstrapping 对经过 10,000 次迭代的两个页面之间的 CTR 差异模拟采样分布。

在统计学中, Bootstrap 抽样 是一种从数据源中反复抽取样本数据并替换以估计总体参数的方法。

一个 抽样分布 显示了一个统计可以从一个总体的每个可能的样本中得到的每个可能的结果,以及每个结果出现的频率。

我们使用这个抽样分布来模拟零假设下的分布,方法是创建一个以 0 为中心的随机正态分布,具有相同的分布和大小。

零假设下采样分布上的红线是我们之前得到的观察到的差异,在零假设下它看起来很小。

Bootstrapping 下的抽样分布|零假设下的抽样分布

然后,我们通过找出大于我们观察到的差异的零分布值的平均值来计算 p 值。

当你的 p 值很小时,你会随着另一个假设移动。但是有多小呢?因此,这将基于类型 1 误差的阈值来决定。商业与研究的类型 1 错误率 alpha 为 0.05

我们得到的 p 值是 0.0061 ,小于错误率α。所以现在我们有证据拒绝零假设。因此,A/B 测试导致实施新的主页设计。

照片由伊戈尔·米斯克在 Unsplash 上拍摄

接下来是 Audacity 决定尝试的第二个变化。他们在课程概述页面上对课程描述进行了更多的职业关注。他们希望这一改变可以鼓励更多的用户注册该课程并最终完成该课程。

这基本上涵盖了漏斗的三个阶段,查看课程概述页面- >报名课程- >完成课程。

对于这个实验,选择了四个指标。它们的定义如下:

  1. 注册率:注册”按钮的点击率被考虑在内。
  2. 平均阅读时长:用户在课程概览页面上花费的平均秒数。
  3. 平均课堂时间:注册该课程的学生在课堂上度过的平均天数。
  4. 完成率:注册该课程的学生的完成率。

按照第一次更改中提到的相同步骤,对每个指标进行了单独评估。为度量计算观察到的差异,然后通过 10,000 次迭代为两个页面之间的差异模拟使用自举的采样分布。在零假设下进行同样的操作,然后将观察到的差异绘制在获得的正态分布上。

计算了 p 值,我们发现所有的指标都具有统计学意义。您评估的指标越多,您就越有可能偶然观察到显著的差异。因此,我们需要确定每个指标中观察到的差异总体上是否具有统计学意义。

Bonferroni 校正是用来抵消多重比较问题的几种方法之一。

Bonferroni 校正 是一种多重比较校正,用于同时进行多个相关或独立统计测试的情况。

虽然给定的类型 1 误差α值可能适用于每个单独的比较,但它不适用于所有比较的集合。为了避免大量的假阳性,alpha 值需要降低,以考虑正在执行的比较的数量。

使用 Bonferroni 校正,我们将原始的 alpha 值除以度量(测试)的数量,得到错误率 alpha 的新值(0.05/4 = 0.0125)。

我们计算的四个指标的 p 值如下:
入学率- 0.0188
平均阅读时长- 0
平均课堂时间- 0.0384
完成率- 0.0846

新的 alpha 值为 0.0125 ,唯一要考虑的重要度量是平均读取持续时间。下图显示了平均读取持续时间自举下的采样分布和零假设下的采样分布。

Bootstrapping 下的抽样分布|零假设下的抽样分布

p 值应小于或等于拒绝零假设的α值。因为我们有同样的证据,我们将继续改变。因此,A/B 测试的结果是在概览页面上实施了更注重职业发展的课程描述。

上面的 A/B 测试案例研究给出了如何使用统计方法分析测试数据以得到结果的想法。你可以在 my GitHub 上找到从这些实验中收集的数据以及完整的 python 代码。

如果你想提高用户参与度,提高转化率,增加销售额,你需要做出数据驱动的决策。通过 A/B 测试,你可以看到黑色的结果&白色的,这样你就知道什么对你有效了。

A/B 测试:生存还是毁灭

原文:https://towardsdatascience.com/a-b-testing-to-be-or-not-to-be-4097de7b6178?source=collection_archive---------32-----------------------

来源:沉积照片

了解如何改善用户体验,改变用户行为,并通过谷歌优化中的 A/B 测试提高你的转化率

没有痛苦,就没有收获,也就没有领导。为了将你的广告带来的流量转化为销售额,你需要通过改善用户体验、改变用户行为和提高转化率来不断优化你的网站。但是你如何确保你实施的改变会带来预期的结果呢?这就是 A/B 测试的目的。在这篇文章中,我们告诉你什么是 A/B 测试,如何进行,有哪些细微之处值得注意。

什么是 A/B 测试?

营销中的 A/B 测试与分割测试是一样的——比较网站页面的两种变体,它们只有一个参数不同。A/B 测试的目标是确定这两个选项哪个更有效,带来更多的转化。

假设你卖软件。您有一个带有产品描述的登录页面,页面底部有一个按钮可以订阅试用版。为了增加订阅者的数量,您决定在登录页面上为那些已经了解您的产品或喜欢不阅读详细信息就立即试用的人多添加一个按钮。

为了检查您的假设是否正确——通过添加另一个按钮可以获得更多订户——您创建了一个原始登录页面的副本,并在其中添加了一个按钮。然后将页面访问者分成两组:一组显示原始页面(变体 A),另一组显示更新后的页面(变体 B)。在测试的最后,您比较性能指标(在我们的例子中是订阅的数量)并确定获胜者。

图片由作者提供

为什么要进行 A/B 测试?

让我们看看 A/B 测试(或分割测试)帮助我们实现的一些主要事情。

1。更好地理解你的用户,给他们想要的。无论你从事电子商务和在线营销有多长时间,仅仅依靠你的个人经验都是错误的。

即使你似乎可以预测网站用户的行为,并确切地了解如何组织内容,使他们尽快通过销售渠道,进行 A/B 测试。结果可能会让你吃惊。

实践表明,我们的假设并不总是与现实相符。因此,我们不能仅仅根据自己的信念来决定什么对客户最好。

2。依靠数据而不是专家意见。第二个挑战源于第一个挑战,即在现场进行变更并最大限度降低相关风险的可行性。

通常,假设是基于个人观点,可能与观众观点不一致。因此,没有经过 A/B 测试就引入的变更不会达到预期的效果——或者更糟,它们会降低转化率。

因此,当你面临用什么做决策的问题时——数据还是专家意见——总是选择数据。

3。个性化与客户的沟通。客户使用不同的设备,来自不同的来源,以不同的方式与您的网站互动,浏览和购买不同的商品…

网络分析服务,如谷歌分析和 Yandex。度量帮助你组合这些数据,并系统化关于用户的知识。营销人员收集用户访问了哪些页面以及在这些页面上做了什么的信息。这使得将受众分成几十个或几百个部分成为可能,并且可以学习,例如,来自有机或付费流量的用户如何行为。

但是我们并不总是正确地使用这些信息,也不总是从中获取最大的利益。一个简单的例子:大多数在线项目仍然向所有用户显示相同的内容,而不管他们的行为和流量来源:

图片由作者提供

如果你正在这样做,一个分割测试可以帮助你解决这个问题,并使你的网站内容个性化。

A/B 测试的主要阶段

现在让我们来看看分割测试的主要阶段(和细微差别):

图片由作者提供

第一阶段。找出问题所在

你需要做的第一件事是找出你网站的弱点。为此,您可以:

  • 探索谷歌分析和其他网络分析系统中的数据,看看哪些页面失败率高,滚动深度低,转化率差。
  • 使用 Webvisor 并单击热图来了解用户如何与您站点的元素进行交互。
  • 分析支持案例或采访活跃客户,看看他们在网站上错过了什么。

例如,假设您在 Google Analytics 中查看增强的电子商务漏斗,发现很少有人在购物车中添加某样商品。同时,你有一个线下销售点,你知道这个产品很受欢迎。在这种情况下,很可能是你的网上商店出了问题。

第二阶段。提出假设

一旦你决定了要修复什么,你需要考虑你将如何修复它。没有 A/B 假设,测试就没有意义——你的发现的价值就很小。你要清楚的了解实验的目的,你要测试网页的什么元素,你要达到什么量化的结果。

当制定假设时,推回你的转换漏斗。问问你自己:为了让用户更快地通过漏斗,我应该在页面的某个部分改变什么?"每次测试检查一个假设;否则,很难确定什么样的变化对最终结果产生了什么程度的影响。

可以测试的内容:

  • 转换按钮的颜色、大小、文本和位置
  • 标题—更改文本;让它更短、更有趣、更相关
  • 表单—减少字段数量或添加工具提示和填充示例
  • 登录—更改页面结构、字体或调色板
  • 内容——添加高质量的照片和视频、行动呼吁、促销优惠、“免费”一词等。

你对绩效指标的选择取决于你的假设和你想要达到的目标。这些可以是收入、购买数量、转换率、平均支票大小、应用和订阅、失败率等。

第三阶段。检查指标

下一步是确保您实现并记录了所有必要的指标,在此基础上,您将在测试结束时得出结论。在我们的工作中,我们遇到过这样的情况,客户已经确定了弱点并形成了假设,但没有正确地规定一个指标体系,因此他们可以理解转换率的变化恰恰是因为一个按钮的变化,而不是因为其他因素。

第四阶段。运行 A/B 测试

在运行实验之前,请考虑以下因素:

  • 最小样本量。为了确保您的测试结果在统计上具有显著性并且可信,请确定所需的参与者人数。你可以使用免费的在线计算器,如 Abtasty 和 Optimizely 来计算。假设你的原登陆页面转化率为 5%,你期望页面的测试版达到 7%。在这种情况下,最小可见效果为 40%。将这些数字输入计算器,你会发现每个变量至少需要 1964 人:

图片由作者提供

  • 外部因素:季节性、节假日、股票、天气、货币汇率等。因此,外部因素不会扭曲实验结果,在同一时期并行显示页面的两个版本非常重要。
  • 首先测试宏转换。如果你设定了访问某个页面的目标,很可能用户会实现这个目标,但不会进行交易或采取其他目标行动。总有必要将你的漏斗作为一个整体来考虑,以了解网站上哪些用户行为是最高优先级的。
  • 考虑设备的类型。如果你开始对你网站的所有流量进行测试,并且你有移动和桌面版本,检查测试选项在移动设备上看起来如何。
  • 排除内部流量这样你的员工在网站上的行为就不会扭曲统计数据。这可以在 Google Analytics 中通过 IP 地址过滤来实现。

在考虑了这些因素之后,您可以运行测试。稍后,我们将告诉您可以用来做这件事的工具。

第五阶段。分析结果

实验结束时,对结果进行分析。例如,假设您的登录页面上的原始转化率为 3%,您假设您可以将其提高到 5%,测试变量显示为 3.5%。转化率有所提高,但只是略微提高。现在你需要决定是在网站上引入改变还是尝试另一种假设。

您可以使用在线计算器或统计方法检查分割测试的结果是否具有统计学意义。

在我们关于网络分析中的统计或如何成为真正的数据科学家的文章中,阅读更多关于统计能力、样本长度、置信区间、统计显著性以及如何测量它们的内容。
如果这个过程是成功的,并且你已经收到了可靠的数据,把登陆页面的获胜者带到网站,继续下一个实验。

分析结果时可能出现的错误:

  • 过早地评估结果。我们建议进行至少 14 天的分割测试。如果任务已经开始,你正在测试不影响网站全局功能的小变化(例如,你已经改变了一个按钮的颜色),并且你正在使用 Google Optimize,你可以对这个规则做一个例外。如果您在优化报告中看到新选项以 80–90%的概率胜出,您可以停止实验。这些指标不太可能发生巨大变化。
  • 评估有效性阈值低于 95%的结果是优化报告的另一个指标。当你进行实验时,Google Optimize 会考虑最终结果的有效性。如果低于 95%,Optimize 会建议继续实验。您可以在选项卡中的活动实验中看到该阈值。
  • 忽略测试结果为次要。谁不想一次翻倍转换?!然而,即使是这样一个温和的(乍一看)2-3%的转化率增长也不是一个坏结果。尤其是如果登录页面上的变化很小的话。
  • 不检查您站点的全局指标。毕竟,你需要检查你的全球站点指标,而不仅仅是那些你在实验中选择的指标。单个参数可能不足以评估变化的影响。例如,通过提高转换率,平均支票大小可以减小,总收入可以增加。因此,监控所有相互关联的 KPI。

A/B 测试工具

要运行 A/B 测试,您必须创建页面的测试版本,对受众进行细分,并分别计算每个细分的目标指标。如果您有编程技能和足够的资源,您可以手动运行 A/B 测试。但是在特殊工具的帮助下做起来更容易更方便。

我们准备了一个比较流行的分割测试工具的小表格:

图片由作者提供

在 OWOX BI ,我们使用 Google Optimize 进行测试,所以我们将更多地关注这个工具的特性。

谷歌优化的 A/B 测试

优化是一项连接到你网站的在线服务,允许你尝试不同的内容显示方式。

Optimize 允许您使用您在 Google Analytics 中积累的数据,为用户提供对他们最方便、对您的企业最有利的页面版本。

谷歌优化的优势

  • 数据的完整性。要建立和分析一个实验,可以使用谷歌分析的目的和细分。你可以使用谷歌分析中你熟悉和喜爱的常用指标。
  • 个性化的大量机会。成功完成测试后,您可以使用 Google Analytics 受众和变量配置不同内容的演示,例如,在 Google Tag Manager 的 dataLayer 中实现的变量。如果实验让你为普通用户提高网站的生产力,那么基于用户信息的个性化将让你在每个细分市场中获得更高的回报。
  • 与其他谷歌产品集成,实现更深入的定位和分析(谷歌广告、数据工作室、标签管理器等)。)
  • 易于理解的便捷界面。可视化编辑器允许您在没有开发人员参与的情况下配置和启动新的实验。它大大减少了进行实验的时间。
  • 最低限度影响 页面加载速度。
  • 无需手动汇总数据、编制报表、应用统计公式检查结果。谷歌优化自己做一切。

优化缺点

  • 到目前为止,Google Optimize 还不能用来测试移动应用。
  • 你不能安排测试。也就是说,如果您想要准备几十个测试,但由于某种原因无法同时开始,或者如果免费版本对同时测试的数量有限制,或者您不想在同一受众身上尝试几十个选项,这可能会成为一个问题。您需要在界面中手动启动每个测试。这不是一个严重的缺点,但是你仍然可以在其他服务中这样做。

谷歌优化如何工作

Google Optimize 的工作方式类似于其他进行实验和个性化的工具:

图片由作者提供

  1. 首先,您需要创建各种页面、弹出窗口和其他要向用户显示的对象。
  2. 然后,您需要确定目标(衡量标准),通过这些目标来确定获胜的选项。这些可以是优化中内置的指标——页面浏览量、会话持续时间、交易、收入和失败率——或谷歌分析的任何自定义目标。
  3. 之后,你需要确定将参与实验的受众,并启动实验。在这一阶段,您必须通过向用户显示测试选项来决定您可以承担多大的风险。您可以在两个选项之间平均分配流量,或者,例如,进行 20/80 分割。另外,在这个阶段,你必须选择向哪部分观众展示这个实验。给大家看,还是拿 20%把你的两个选项分给他们?你为什么想这么做?如果你有一个大商店,你不确定你的假设,你不想冒险一半的流量。

除了经典的 A/B 测试之外,在 Optimize 中,您还可以运行多元测试(在多种组合中有多个变化的元素)和重定向测试(针对具有不同 URL 和设计的页面)。

在我们关于如何使用 Google Optimize 进行首次 A/B 测试的文章中,你可以了解更多关于 Google Optimize 的界面和设置。

分析结果

使用 Google Optimize 中的报告,您可以在实验过程中监控结果,并在实验结束后立即分析收集的数据。

图片由作者提供

优化报告中的术语:

  • 改进——转换率的可能范围
  • 最佳概率-此选项优于所有其他选项的概率
  • 超出基线的概率——该选项将带来比原来更好的转换率的概率
  • 转换率—预测的平均转换率
  • 转换—具有转换的会话数

获胜者是如何确定的
谷歌优化使用贝叶斯推理生成统计数据。无需深入细节,这意味着在实验过程中,您可以在优化报告中看到变体 B 在实验结束前胜出的概率。如果概率达到一定水平,就有可能提前完成实验,节省时间和金钱。

此外,谷歌团队计划在实验结束前实施一种有利于最佳选项的流量重新分配机制。这将为您节省资金,因为在测试过程中很少用户会看到无效的选项。

如果您将 Optimize 与您的 Google Analytics 帐户集成,您将能够在 Google Analytics 界面的行为/实验部分浏览和分析测试结果:

图片由作者提供

如果您的实验成功,您可以在您的网站上部署获胜选项。

A/B 测试:业务案例的 4 大错误及解决方法

原文:https://towardsdatascience.com/a-b-testing-top-4-mistakes-with-business-cases-fixes-85e76767dfde?source=collection_archive---------22-----------------------

不犯错误的人永远一事无成

你可能有的是 en 忽略直到你发现这篇文章

约翰·施诺布里奇在 Unsplash 上拍摄的照片

介绍

史蒂夫·乔布斯在 1997 年回答一个棘手的问题时说:

“你必须从客户体验开始,然后回溯到技术。你不能从技术入手,试图找出在哪里销售。”

我相信 A/B 测试正是基于这种想法。大多数创新型公司已经从 HiPPO (薪酬最高的人的观点)转向数据驱动的决策。他们在数字实验上投入大量资金,以确保最佳的客户体验和组织决策。

谈及脸书对庞大测试框架的投资,在一次采访中,马克·扎克伯格说,

“在任何给定的时间点,世界上都不会只有一个版本的脸书。大概有一万个版本在运行。”

杰夫·贝索斯也曾经说过:

“我们在亚马逊的成功取决于我们每年、每月、每周、每天做多少实验。”

但是,尽管有适当的预算和努力,一些可以避免的错误还是在实施过程中悄悄出现了。这篇文章指出了在 A/B 测试中经常发生而又被忽视的 4 大错误。

我将把以下内容作为本文框架的一部分:

  • 我用真实的商业案例/假设的案例来阐述错误,帮助你清楚的理解思路。
  • 我还会为它们建议合适的修复方法。

我保证会让你觉得非常有趣和容易理解。所以,泡一杯热咖啡,拿起你最喜欢的扶手椅。

让我们开始吧。

1。 测试变量太多

当您测试一个假设来比较两个变量时,您在某个置信区间执行统计测试。假设您的组织为某个实验决定了 5%的置信区间。这是什么意思?

这意味着有 5%的几率你的测试结果是随机的,你会发现一个错误的赢家。

e.g. Your test will say that Option B is better than Option A, 5 times out of 100 when that is not the case.In statistical terms, there’s a 5% probability of getting a false positive (Type 1 Error).

很简单,对吧?现在让我们更进一步。让我们将这个概念扩展到不止一个测试变量。

得到假阳性的概率的一般公式如下:

False Positive Rate = 1-(1-α)ⁿ
α → significance level
n → total number of test variants (excluding the control)

这个等式目前看起来像这样:

1-(1–0.05)¹=0.05

现在,随着测试变量数量的增加,第一类错误也会增加。下图清楚地描述了这种变化:

图 1 假阳性率随测试变异数的变化(图片由作者提供)

这就是所谓的 【多重比较问题】

让我以谷歌的一个著名实验为基础,叫做【41 种蓝色测试】

图 2 谷歌的“41 种蓝色测试”(图片由作者提供)

2009 年,谷歌想要决定在他们的搜索结果页面上产生最大点击量的蓝色色调。因此,他们进行了“1%实验”来测试 41 种不同深浅的蓝色,给 1%的用户展示一种蓝色,给 1%的用户展示另一种蓝色,以此类推。

这就是你在 Gmail 和谷歌搜索中看到的广告链接中的蓝色是如何选择的。有趣的是,它为该公司带来了每年 2 亿美元的额外收入。

很吸引人,对吧?现在,让我们回到‘多重比较问题’。我们该如何应对?谷歌会怎么做?

修复:

应该测试的变体数量取决于您组织的业务需求、组织效率以及一系列因素,如转化率、收入、流量等。尽管如此,通常还是应该避免测试太多的变化。

据统计,有多种技术可以解决这个问题。我来解释一种叫做 【邦费罗尼校正】 的技术。

到目前为止,您已经知道,随着测试假设数量的增加,第一类错误也会增加。“Bonferroni 校正”对此有何帮助?

“Bonferroni 校正”通过在α/n 的显著性水平上测试每个假设来补偿误差的增加

例如,如果一个实验测试 40 个假设,期望的显著性水平为 0.05,那么“Bonferroni 校正”将在α=0.05/40=0.00125 测试每个假设。

所以,现在你知道了,为了维持“41 度蓝色测试”实验 95%的置信区间,谷歌会以 99.875%的置信区间测试每个假设。

2。 忽略交互影响

当多个实验以相同的观众为目标时,注意交互效应是很重要的。但是互动效应是什么呢?

这是一种在实验过程中两个变量对测量的成功度量的同时影响不是相加的情况。我们通过一个例子来理解这一点。

假设亚马逊正在改善其对外客户沟通,以提高转化率。电子商务分析团队正在对“废弃购物车”推送通知进行 A/B 测试。与此同时,营销分析团队也在对发送给客户的“推荐电子邮件”进行 A/B 测试。

下图显示了测试期间获得的转换率:

图 3 单个 A/B 测试中获得的转化率(图片由作者提供)

图 4 在综合 A/B 测试中获得的转换率(图片由作者提供)

这很奇怪,对吧?这两个新功能在各自的实验中都表现良好,但为什么联合测试槽会如此呢?

这是由于相互作用的结果。亚马逊在对外客户沟通项目上走得太远了。这两个各自表现出色的功能结合在一起的效果是,它惹恼了客户。因此,转换率下降了。****

修复:

有一个双重方法可以消除交互效应对实验成功指标的负面影响:

  • 首先,留意同时推出的两个新功能之间可能存在的交互效应。如果有两个团队参与,组织中的某个人作为两个团队之间的纽带,对两个团队的工作有很好的了解,可以成为有用的资源。
  • 第二,当这种交互作用被识别时,不要同时进行 A/B 测试。相反,按顺序测试它们。

3。 忽略客户价值

有时,组织只关注主要 KPI 的表现,如转换率或每次访问的收入,而忽略了基于客户价值的细分。这可能导致有缺陷的实验结果。让我们看一个例子。

假设沃尔玛超市重新设计了它的主页,改变了“搜索栏”的位置。该团队进行了一项为期两周的实验,但发现转换率和每次访问的收入都下降了。因此,结论是旧的设计更好。

一切看起来都很好,对吗?但是是吗?号码

团队忽略了一个重要的事实,即忠实客户的反应往往比新客户更不利。忠诚的顾客需要更长的时间来适应新的设计。让我们用一个更贴切的例子来理解这一点。

假设你去离你最近的沃尔玛实体店购物,发现他们已经完全重新布置了整个商店。你会在杂货店的通常位置找到电子产品区,在家庭必需品的通常位置找到服装区,等等。如果这是你第一次来,你不会知道有什么不同,你会买你想要的东西。但如果你是那里的常客,你会感到困惑,如果你很着急,你甚至可能会走出去。

我想你明白了。只是类似的网上行为可能性更大。

修复:

我想你现在会同意我的观点,顾客价值和对网页设计修改的积极反应之间存在反比关系,考虑到顾客价值不仅仅是一生收入的函数,也是近期和频率的函数。

换句话说,在一个的 RFM 模型中,上四分之一(在最近、频率和货币价值方面得分最高的客户)不会对新设计做出有利的反应。

让我通过 4 个客户的小样本数据来快速演示 RFM 四分位数的客户细分。

****R (Recency) → Days since last conversion
F (Frequency) → Number of days with conversions
M (Monetary) → Total money spent****

图 5 使用 RFM 模型的客户细分(图片由作者提供)

因此,了解基于客户价值的客户组合和细分非常重要。将它们分为新的和常规的。如果你根据 RFM 四分位数()RFM 细分 ) 来形成细分就更好了。****

图 6 基于 RFM 四分位数的样本客户群(图片由作者提供)

4。 不正确的测试后分割

实验完成后,您开始将数据分成几个部分,如流量大小、新客户与忠实客户、设备类型等。您希望根据您的成功指标对它们进行比较,以挖掘出有用的业务洞察力。这叫做测后分割

但是,在这里你需要小心。请注意以下两个问题:

  • 细分的小样本量:测试后你形成的细分可能会以非常小的规模结束。因此,你通过比较你测试的变量的不同部分得出的商业见解可能不具有统计学意义。
  • 多重比较问题:还记得这个吗?是的,你是对的。我们在文章的第一点就谈到了它。如果比较太多段,类型 1 错误的概率会增加。

修复:

那么,你是怎么处理的呢?

最好的处理方法是选择分层抽样,设计有针对性的测试。将样本分成同质的组,这样组内的差异就很小。这些类别或客户群可以基于设备类别、流量来源、人口统计等属性。根据业务需要和预算。然后,进行实验以比较待测试变量的相应括号。

给你举一个行业的例子, 网飞 使用分层抽样来保持一组关键指标的同质性,这些指标包括国家和设备类型(如智能电视、游戏机等。)才是最关键的。

结论

虽然有许多 A/B 测试错误,我的努力是指出更复杂的错误,这些错误在行业中很有可能被忽略。

我希望我能够兑现我的承诺,让这篇文章变得有趣和容易理解。我希望你觉得有用。

以托马斯·阿尔瓦·爱迪生颂扬错误并从中吸取教训的精神作为结束,

“我没有失败过一万次。我已经成功地找到了一万种行不通的方法。”

请随意看看我写的关于数据分析的其他文章:

**** [## 电子商务零售中的数据分析

电子商务零售中的分析概念和应用,带有简单的演示和有趣的业务示例

towardsdatascience.com](/data-analytics-in-e-commerce-retail-7ea42b561c2f) [## SQL 查询优化的索引

是时候开始你的查询游戏了!

towardsdatascience.com](/indexing-for-sql-query-optimization-139b57db9fc6) [## 7 必须知道 SQL 查询错误和修复

避免这些错误,提高你的查询技巧!

towardsdatascience.com](/7-must-know-sql-querying-mistakes-fixes-321ee292a251)

请随时提供反馈,并关注我以获取更多关于数据分析的有趣文章。在 LinkedIn 上与我联系。****

使用卡方检验进行 A/B 测试,以最大化转化率和 CTR

原文:https://towardsdatascience.com/a-b-testing-with-chi-squared-test-to-maximize-conversions-and-ctrs-6599271a2c31?source=collection_archive---------9-----------------------

面向有抱负的实验者的数据科学项目演练

作者创建的图像

目录

前四节解释了用于此 A/B 测试的概念,后两节介绍了对转换率执行 A/B 测试的分步示例。

  1. 介绍
  2. 什么是 A/B 测试?
  3. 卡方检验
  4. 计算卡方检验统计量
  5. 资料组
  6. A/B 测试项目演练

介绍

可以说,工作场所中最实用的数据科学概念之一是 A/B 测试。然而,这是一个很容易被误解的概念,因为它非常复杂。

举个例子,许多实验主义者使用 t 检验来确定两个选项之间是否有显著差异。但是如果不假设分布是高斯的呢?如果两组的标准差不一样呢?如果分发未知地完成了呢?

在这篇文章中,我将谈论一种特别的 A/B 测试方法,这种方法可以很好地比较点击率和转化率。

什么是 A/B 测试?

从最简单的意义上来说,A/B 测试是对两个变量进行的实验,根据给定的度量标准来看哪一个表现更好。通常,两个消费者群体接触同一事物的两个不同版本,以查看会话、点击率和/或转化率等指标是否有显著差异。

以上面的图片为例,我们可以将我们的客户群随机分成两组,一个对照组和一个变异(或治疗)组。然后,我们可以用一个红色的网站横幅来展示我们的变体组,看看我们是否会获得显著的转化率增加。需要注意的是,在执行 A/B 测试时,所有其他变量都需要保持不变。

更专业地说,A/B 测试是一种统计和双样本假设测试。统计假设检验是一种将样本数据集与总体数据进行比较的方法。两样本假设检验是确定两个样本之间的差异是否具有统计显著性的方法。

卡方检验

点击率和转化率有什么共同点?他们有一个伯努利分布,一个概率为 1,一个概率为 0 的离散概率分布。对于点击率,用户要么点击(1),要么不点击(0)。同样,对于转换,用户要么转换(1),要么不转换(0)。

因为我们正在对遵循伯努利分布的分类变量转换执行 A/B 测试,所以我们将使用卡方测试

进行卡方检验的步骤如下:

  1. 计算卡方检验统计量
  2. 计算 p 值
  3. 将 p 值与显著性水平进行比较

当您跟随项目演练时,这将更有意义。

计算卡方检验统计量

确定卡方检验统计量的公式如下:

让我们通过一个例子来更好地理解这一点。

假设我们展示了两个不同的广告,A 和 B,来测试用户是否点击了广告。测试结束时,收集了以下信息:

在这种情况下,我们必须进行四次计算,然后将它们相加:

  1. 广告 A,点击
  2. 广告 A,无点击
  3. 广告 B,点击
  4. 广告 B,无点击

我们以广告 A 为例。我们需要计算观察值和期望值。

观察值等于 360,如上表所示。

期望值等于广告显示的次数乘以点击的概率。因此,期望值= 500 * (660/1050) = 31.429。这些数字也取自上表。

对所有四种情况进行计算后,可以将这些数字输入到 x 方程中,以确定卡方检验统计量。

资料组

我用来执行这个 A/B 测试的数据集来自 Kaggle ( 这里是数据集的链接)。

该数据集包含 A/B 测试的结果,其中两组(对照组和处理组)分别暴露于旧网页和新网页。该测试的目的是确定与旧网页相比,新网页是否会显著提高转化率。每一行代表一个独特的用户,并显示他们是否在对照组或治疗组,以及他们是否转换。

A/B 测试项目演练

*# Import libraries and data*
import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt

df = pd.read_csv('../input/ab-testing/ab_data.csv')

和往常一样,我从导入相关的库和数据开始。

数据争论

在进行卡方检验之前,我想检查一些东西,因为我不知道数据有多干净。我检查的第一件事是查看控制组中是否有任何用户看到了新的网页,反之亦然。

# Checking to see if there are any users in control that saw new page and users in treatment that saw old page
df.groupby(['group','landing_page']).count()

上面,你可以看到似乎有一个错误,对照组的一些用户看到了新页面,而治疗组的一些用户看到了旧页面。因为我不确定用哪种方法来恢复错误分类的用户,所以我决定用下面的代码删除它。

*# Removing control/new_page and treatment/old_page*
df_cleaned = df.loc[(df['group'] == 'control') & (df['landing_page'] == 'old_page') | (df['group'] == 'treatment') & (df['landing_page'] == 'new_page')df_cleaned.groupby(['group','landing_page']).count()

现在,对照组被限制在旧页面,而治疗组被限制在新页面。我想检查的下一件事是基于 user_id 的重复值。

*# Checking for duplicate values*
df_cleaned['user_id'].duplicated().sum()

因为有一个副本,我想深入研究一下。

*# Finding user_id for duplicate value*
df_cleaned[df_cleaned.duplicated(['user_id'],keep=False)]['user_id']

df[df['user_id'] == 773192]

看起来这位用户看了两次新的登录页面,但两次都没有转换。为了实验的简单,我想把它限制在每个用户的第一个决定上。因此,我删除了这个用户的第二个实例。

df_cleaned = df.drop_duplicates(subset='user_id', keep="first")

探索性数据分析

一旦我的数据被清理,我想更好地了解我的数据。我将数据绘制成柱状图,看看两组的转化率是多少。它们似乎具有相似的转换率(大约。1/7),但是我们将通过卡方检验来看是否有显著差异。

groups = df_cleaned.groupby(['group','landing_page','converted']).size()
groups.plot.bar()

同样,我想用饼状图看看每个组中用户数量之间的比例大小是否相似。

df_cleaned['landing_page'].value_counts().plot.pie()

数据准备

此时,我已经准备好为卡方数据准备数据了。下面的代码相当于上一节中我解释了如何计算卡方检验统计量的示例。

### Re-arrrange data into 2x2 for Chi-Squared# 1) Split groups into two separate DataFrames
a = df_cleaned[df_cleaned['group'] == 'control']
b = df_cleaned[df_cleaned['group'] == 'treatment']# 2) A-click, A-noclick, B-click, B-noclick
a_click = a.converted.sum()
a_noclick = a.converted.size - a.converted.sum()
b_click = b.converted.sum()
b_noclick = b.converted.size - b.converted.sum()# 3) Create np array
T = np.array([[a_click, a_noclick], [b_click, b_noclick]])

卡方检验

一旦我的数据格式正确,我就准备好进行测试了。这可以简单地通过从 Scipy 库中导入统计数据来完成。这一步计算卡方统计量和 p 值。

import scipy
from scipy import statsprint(scipy.stats.chi2_contingency(T,correction=False)[1])

p 值计算为 19%。假设显著性水平为 5%,我们可以推断 p 值大于α值,并且我们不拒绝零假设。简单来说,新旧网页之间的转换没有任何意义。

# Sanity Check
a_CTR = a_click / (a_click + a_noclick)
b_CTR = b_click / (b_click + b_noclick)
print(a_CTR, b_CTR)

作为健全性检查,我计算了两组之间的转换率,它们之间的差异是最小的,这再次保证了这是正确进行的。

本教程到此结束!我希望你觉得这很有用。😃

感谢阅读!

特伦斯·申

创始人ShinTwin|我们来连线一下LinkedIn|项目组合这里是

用概率编程和 PyMC3 进行 A/B 测试(上)

原文:https://towardsdatascience.com/a-b-testing-with-probabilistic-programming-and-pymc3-part-i-7ae52d45bc41?source=collection_archive---------30-----------------------

离散变量的 A/B 测试

声明:这篇文章深受《黑客的概率编程和贝叶斯方法》一书的影响。我们的主要贡献可能是说明性的风格——我们希望这将对概率编程或 A/B 测试或者两者都有好处。我们也将思考我们在 Kibo Commerce 实习时处理这些话题的一些经验。

这是关于概率编程应用的系列文章中的第二篇,特别是 PyMC3。在本文中,我将描述如何使用 PyMC3 对离散变量进行 A/B 测试。由于篇幅已经很长,我将在后续文章中讨论使用连续变量的 A/B 测试。目前的文章结构如下。

1.什么是 A/B 测试,为什么它对商业成功很重要?

2.经典 A/B 测试的一些缺点,对更多信息的 A/B 测试的需求,以及 PyMC3 如何帮助。

3.用离散变量进行 A/B 测试的一个例子。

让我们深入细节。

第一部分:什么是 A/B 测试,为什么它对商业成功很重要?

首先,让我们通过一个具体的例子来简单解释一下什么是 A/B 测试。我们注意到,在实现和部署 A/B 测试时会有各种变化,所以尽管我们的例子相当典型,但它并不具有唯一的代表性。

假设,一个活动组织怀疑,如果主题行更长,会吸引更多人阅读电子邮件,然后捐款。当然,竞选组织者没有办法事先核实这一点。换句话说,它们只是形成了一个需要用数据来检验的假设;否则,如果他们的假设被证明是错误的,这场运动可能会失去捐助者。简单地说,活动组织者计划向 50,000 名潜在捐赠者发送活动电子邮件。一个简单过程如下。

1.将潜在的捐助者随机分成两组:测试组和维持组。

2.顾名思义,我们将使用测试集来测试我们的假设。这一部分可以这样做:我们将测试集随机分为两组:控制组和实验组。然后,我们将把旧的运动策略应用于控制组,把新的策略应用于实验组。我们将等到从这两组中收集到足够的数据来比较这两种策略。

3.然后,我们可以将第二步验证的更好的策略应用于维持集。

这个简单的过程很容易实现,事实上,它被证明是成功的:请看这里的一些真实世界的例子。

第 2 部分:经典 A/B 测试的一些缺点,对更多信息的 A/B 测试的需求,以及 PyMC3 如何能有所帮助。

本文中我们主要关注的是第二步。通常,为了比较这两种策略,我们经常使用 t 检验。虽然这种测试相对容易实现,但也有一些缺点。其中一些是:

㈠它没有提供关于这两种方法之间差异的全部信息。特别是,它并没有真正为我们的最终决定提供一定程度的信心。

(二)它要求我们事先确定一个样本量。

(iii)传统的 t 检验使用 p 值来接受/拒绝零假设。从我和我在 Kibo Commerce 的导师的谈话中, Austin Rochford,我了解到,营销人员经常将 p 值误解为实验组比对照组表现更好的概率。这种误解可能会导致糟糕的商业决策。

(iv)不容易使用 t 检验来回答更复杂的问题,例如差异的量化。例如,有时我们不仅对实验组是否比控制组表现更好感兴趣,而且对好多少感兴趣。这一点很重要,因为实施一项新战略通常需要花费时间和金钱等资源;因此,我们必须从战略上决定这样做是否值得。

这些原因和其他原因是发现更多信息测试的动机。我们在本文中采用的方法是贝叶斯 A/B 测试。粗略地说,在贝叶斯/概率编程框架中进行 A/B 测试的过程如下。

第一步:我们形成了对数据真实性的先验信念。

第二步:从证据/观察到的数据中,我们更新信念;换句话说,我们(数值地)计算后验分布。

步骤 3 :我们从后验分布中抽取样本,并使用这些样本进行统计推断。

正如我们在第一篇文章中解释的,计算后验分布的精确形式通常具有挑战性,尤其是在共轭先验不可用的情况下。幸运的是,我们有 PyMC3 来神奇地帮助我们。

3。使用离散变量进行 A/B 测试的示例

第一部分中讨论的 A/B 测试问题的一个重要指标是转换率:即潜在捐赠者向活动捐赠的概率。

我们将使用模拟数据,如第一部分中的图片所示。更准确地说,假设我们进行实验,结果由下式给出:

donors_A=1300
donors_B=1500
conversions_from_A=273
conversions_from_B=570

请注意,与图片不同,A 组和 B 组的样本量不同。这种情况在实践中并不少见:严格遵循上述 A/B 测试程序通常具有挑战性(例如,我观察到 Kibo 的数据经常出现这种情况。)然而,正如我们所看到的,样本大小几乎相等。此外,在贝叶斯框架中,不相等的样本大小不是一个大问题。

我们可以通过下面几行代码在数字上近似这两组转换率的后验分布。

#group A
with pm.Model() as model_A:
    #set the prior distribution of $p_A$.
    p_A=pm.Uniform('p_A', lower=0, upper=1)  

    #fit the observed data to our model 
    obs=pm.Binomial("obs", n=donors_A, 
                    p=p_A, observed=conversions_from_A) #MCMC algorithm 
    step=pm.Metropolis() #sampling from the posterior distriubtion. 
    trace_A=pm.sample(30000, step=step)
    burned_trace_A=trace_A[1000:]#group B
with pm.Model() as model_B:
    #set the prior distribution of $p_B$. p_B=pm.Uniform('p_B', lower=0, upper=1)  

    #fit the observed data to our model 
    obs=pm.Binomial("obs", n=donors_B, 
                    p=p_B, observed=conversions_from_B)

    #MCMC algorithm 
    step=pm.Metropolis() #sampling from the posterior distriubtion. 
    trace_B=pm.sample(30000, step=step)
    burned_trace_B=trace_B[1000:]

关于代码的一些话。由于我们观察到的数据是转换的数量,我们使用二项分布来描述我们的观察。如果我们有逐点数据(即每个潜在捐献者的转化率),我们可以使用伯努利分布,就像我们在的上一篇文章中描述的那样。当然,不管我们使用什么分布,后验分布都是相同的。从数学上来说,总转化率是对我们问题的充分统计。

我们还注意到这不是计算后验分布的唯一方法。在这种特殊情况下,我们可以显式地计算它们,详见我们的上一篇文章。更准确地说,我们可以证明 p_A 的后验分布是β(274,1028),p_B 的后验分布是β(571,931)。

我们绘制了 A 组样本的直方图及其精确后验分布β(274,1028)。我们看到 PyMC3 在近似 pA 的后验分布方面表现得相当好。

#histogram for samples from the posterior distribution of  $p_A$figsize(12.5, 4)
alpha_prior=beta_prior=1
a=alpha_prior+conversions_from_A
b=beta_prior+donors_A-conversions_from_A
coef=beta(a,b)
plt.title(r"Posterior distribution of $p_A$")
plt.hist(burned_trace_A["p_A"], bins=50, histtype='stepfilled', density=True, color='#348ABD')
x=np.arange(0,1.04,0.001)
y= beta.pdf(x, a, b) 
plt.plot(x, y, color='black', label='True posterior distribution of $p_A$')
plt.xlim(0.15, 0.3)
plt.legend()
plt.show()

我们可以通过取样本平均值来估计 A 组的转化率。

#the sample mean-an estimate for conversion rate of group A. 
samples_posterior_A=burned_trace_A['p_A']
samples_posterior_A.mean()0.21050251102125828

我们看到这个估计非常接近频率主义者的估计。

同样,我们可以对 p_B 做同样的事情。

#histogram for samples from the posterior distribution of  $p_A$figsize(12.5, 4)
alpha_prior=beta_prior=1
a=alpha_prior+conversions_from_B
b=beta_prior+donors_B-conversions_from_B
plt.title(r"Posterior distribution of $p_B$")
plt.hist(burned_trace_B["p_B"], bins=50, histtype='stepfilled', density=True, color='#348ABD')
x=np.arange(0,1.04,0.001)
y= beta.pdf(x, a, b) 
plt.plot(x, y, color='black', label='True posterior distribution of $p_A$')
plt.xlim(0.3, 0.45)
plt.show()

现在,由于我们从 pA 和 pB 的后验分布中获得了足够的样本,我们可以开始进行统计推断。

我们可以一起绘制两个直方图。

figsize(12.5, 4)
plt.hist(samples_posterior_A, bins=40, label='posterior of p_A', density=True)
plt.hist(samples_posterior_B, bins=40, label='posterior of p_B', density=True)
plt.xlabel('Value')
plt.ylabel('Density')
plt.title("Posterior distributions of the conversion rates of group $A$ and group $B$")
plt.legend()
plt.show()

我们清楚地看到,B 组的表现优于 a 组。

但是好多少呢?我们可以用两个指标来回答这个问题:

(一)两种手段的绝对区别。

(二)两种手段的相对区别。

这些是我们之前讨论过的量化问题的例子。这两个问题都可以在贝叶斯框架下解决。首先,我们来回答第一个问题。为此,我们可以绘制 A 组和 b 组样本之间的差异。

difference=samples_posterior_B-samples_posterior_A
figsize(12.5, 4)
plt.hist(difference, bins=40, density=True)
plt.vlines(0.14, 0, 25, linestyle='--', color='red')
plt.title('Posterior distribution of the difference of the two means')
plt.show()

我们可以清楚地看到,这个分布远远不是 0。多远?比如我们有信心说 B 组的转化率比来自 A 组的转化率高 14%吗?我们可以用下面几行代码来近似这个概率。

#probability of 14% increase by group B100*len(difference[difference>0.14])*1.0/len(difference)96.23620689655172

这非常接近 100;所以我们真的对上面的说法很有信心。B 组的转化率比 A 组的转化率高 16%呢?

#probability of 16% increase by group B
100*len(difference[difference>0.16])*1.0/len(difference)71.44913793103449

现在,我们对第二种说法不太有信心。

接下来,我们回答第二个问题。如上所述,我们可以绘制两组转化率之间的相对差异。

rel_difference=100*(samples_posterior_B-samples_posterior_A)/samples_posterior_A
figsize(12.5, 4)
plt.hist(rel_difference, bins=40, density=True)
plt.vlines(60, 0, 0.04, linestyle='--', color='red')
plt.title('Posterior distribution of the relative difference of the two means')
plt.xlabel("percentage")
plt.show()

让我们计算一下 B 组提高转化率至少 60%的概率。

100*len(rel_difference[rel_difference>60])*1.0/len(rel_difference)97.6301724137931

嗯,我们有信心 B 组确实提高了 60%的转化率。80%呢?

100*len(rel_difference[rel_difference>80])*1.0/len(rel_difference)52.0051724137931

正如我们所看到的,这个概率与通过投掷公平硬币获得正面的概率没有太大区别,换句话说,它大多是随机的,我们不应该相信 80%的增长。

结论

如上所述,贝叶斯框架能够克服经典 t 检验的许多缺点。此外,PyMC3 使得在离散变量的情况下实现贝叶斯 A/B 测试变得非常简单。

参考文献

[1] Cameron Davidson-Pilon,黑客的概率编程和贝叶斯方法

[2]安德鲁·盖尔曼、约翰·卡林、哈尔·斯特恩、大卫·邓森、阿基·维赫塔里和唐纳德·鲁宾,贝叶斯数据分析。

用概率编程和 PyMC3 进行 A/B 测试(第二部分)

原文:https://towardsdatascience.com/a-b-testing-with-probabilistic-programming-and-pymc3-part-ii-10f0c16c8d1c?source=collection_archive---------31-----------------------

在我们的上一篇文章中,我们解释了如何使用 PyMC3 对离散变量进行贝叶斯 A/B 测试。在本文中,我们将对连续变量做同样的事情。

这篇文章的结构如下。

1.大约在 2013 年, John Kruschke 发明的最佳方法(贝叶斯取代 t 检验)概述。

2.要进行统计推断,我们需要数据!我们将解释如何使用名为美汤的 Python 包从互联网上抓取数据。在我们的案例中,我们将从 EPSN.com 刮 NBA 的工资来做我们的分析。

3.NBA 球员薪酬最佳方法的一个具体例子。更准确地说,我们将使用第二部分的数据比较不同位置的 NBA 球员的工资。

由于第二部分主要是获取相关数据,那些只想看看最佳作品如何的人可以跳过。我们搜集的数据可以在这个 Github 存储库中找到。

在我们深入细节之前,我们想对我们的分析做一点小小的评论。从我们与奥斯汀·罗奇福德的讨论中,我们了解到薪水和职位之间的关系应该是相关的,而不是因果关系,奥斯汀·罗奇福德是费城 76 人的忠实粉丝。一个特别的原因是,工资完全不是随机的,因为它们取决于过去的表现。我们感谢奥斯汀对我们结果的专业反馈。

第 1 部分:贝叶斯取代了 t 检验

正如我们在第一部分所解释的,经典的 t 检验有几个缺点,尤其是从商业角度来看。为了克服这些问题,2013 年,印第安纳大学的 John Kruschke 从贝叶斯的角度发明了一种新的 A/B 测试程序。

正如我们在第一部分中解释的,经典 t 检验有几个缺点,尤其是从商业角度来看。为了克服这些问题,2013 年,印第安纳大学的 John Kruschke 从贝叶斯的角度发明了一种新的 A/B 测试程序。

在这个过程中,数据由一个学生 t 分布来描述。这种选择无疑比使用正态分布更能提供信息,因为它可以表示带尾部的分布,在我们的例子中就是这样。

我们需要三个参数来描述 Student-t 分布:均值μ、标准差σ和自由度ν。Kruschke 对这些参数使用了以下先验分布。

  • μ服从正态分布。
  • σ遵循均匀分布
  • ν遵循移位指数分布。

请注意,ν参数控制数据的正态性:当ν>30 时,学生 t 分布接近正态分布。然而,如果ν很小,学生 t 分布就有很重的尾部。这就是为什么我们在ν的先验分布中选择参数 1/29:这是正态性的“截止值”。

下面的图形表示总结了上面的描述。

BEST 的图形表示(作者的手绘)

第 1.1 部分。实际等效区域。

实际等价区域(ROPE)是空值周围的区域,其中包含的值与空值的差异可以忽略不计。绳索的选择取决于特定的应用。例如,假设我们怀疑产品描述越简短,人们越有可能购买。在这种情况下,我们可以做一个 A/B 测试来比较这个新策略和旧策略(如何做的过程在我们的上一篇文章中有解释)。在贝叶斯框架中,我们感兴趣的是两个版本的平均订单的平均差异是否合理地接近于 0。如果我们非常有信心新策略会奏效,我们可以选择 0 左右的大绳。另一方面,如果我们不太自信,可以选择小绳子。

关于绳子的更多细节,见本.&text=In%20other%20words%2C%20it%20checks,null%20region%20(the%20ROPE).)。

第 1.2 部分。最高密度区间。

最高密度层段(HDI)的定义相当专业。粗略地说,HDI 是这样一个区间,它包含的点比位于它之外的点具有更高的概率密度。像置信区间一样,我们可以选择人类发展指数覆盖整个人口的程度。通常,我们可以选择覆盖 95%分布的人类发展指数。

贝叶斯世界中一个更一般的概念,直接类似于置信区间,就是可信区间的概念。我们不会详细讨论这个概念;鼓励读者在这里查看详细内容。

第 1.3 部分。最佳决策。

一旦指定了 ROPE 和 HDI,我们就可以使用它们来进行统计决策。

  • 如果 ROPE 位于 HDI 之外,那么我们拒绝零假设。
  • 如果 ROPE 包含 HDI,那么我们接受零假设。
  • 否则,我们保留我们的决定。

在最后一种情况下,最好的测试说,没有足够的证据来做出结论性的决定。在这种情况下,我们有几种选择。例如,我们可以改变绳子和/或 HDI。更实际的是,我们可以获得更多的样品。

第二部分:网络搜集的 NBA 薪资数据

在本节中,我们将解释如何使用 Python 包 Beautiful Soup 从互联网上获取数据。我们将使用 ESPN 网站获取 2019-2020 赛季 NBA 球员的工资。首先,我们需要导入几个包(对于本节,相关的包是 BeautifulSoup、table 和 requests。)

import pandas as pd
import requests
from bs4 import BeautifulSoup
from tabulate import tabulate
import numpy as npimport pymc3 as pm
import scipy.stats as stats
import matplotlib.pyplot as plt
%matplotlib inline
from IPython.core.pylabtools import figsize
import theano.tensor as tt
from scipy.stats.mstats import mquantiles

我们使用下面的函数来获取原始数据。

def get_raw_data(link):
    """
    Given a link, get the raw data from ESPN.com
    """
    #get the raw data from the website
    res = requests.get(link) 
    soup = BeautifulSoup(res.content,'lxml')
    table = soup.find_all('table')[0] 
    df= pd.read_html(str(table))[0]

    #remove irrelevant rows df=df.drop(df[df[1]=='NAME'].index)

    #change the name of the columns  
    df.columns=['RK', 'Name', 'Team', 'Salary']

    #Make the RK column be the index
    df.set_index('RK', inplace=True)
    return df

例如,让我们将这个函数应用于这个链接。

link="http://www.espn.com/nba/salaries/_/seasontype/3"
df1=get_raw_data(link)
df1.head()

结果是

NBA 球员及其工资样本

这不是所有球员及其薪水的完整列表。还有 14 页。幸运的是,当页面在 2–14 之间时,有一个模式。我们可以利用这个事实快速获得数据。

df =df1
for i in range(2,15):
    #get the data for page i df_i=get_raw_data(link=    f"http://www.espn.com/nba/salaries/_/page/{i}/seasontype/3") 

    #combine all the data

    df=pd.concat([df, df_i], axis=0)

接下来,我们需要清理这些数据。首先,我们必须从这些数据中获得 NBA 球员的位置。正如我们所看到的,这个信息包含在 name 列中。我们可以使用下面的函数来提取它。

def get_position(text):
    return text.split(', ')[-1]

其次,薪水有美元符号;我们应该将它们转换成浮点数据类型。为了避免使用大数字,我们将使用百万美元作为单位。下面几行简单的代码完成了这些清理工作。

df['Position']=df['Name'].apply(get_position)df['Salary']=(df['Salary'].apply(convert_string_to_float))/10**6df.head()

NBA 球员的薪水和职位样本

我们可以将数据保存到 CSV 文件中以备将来使用。

df.to_csv('NBA_salary')

第三部分:NBA 不同职位的薪水

我们将使用在第二步中获得的数据来进行分析。我们将采取可视化的方法来帮助读者对我们的分析有一个直观的理解。

首先,让我们得到这个数据集中的所有位置。

figsize(12.5,4)
positions=df['Position'].value_counts()
positions.sort_values(inplace=True)
bar=sns.barplot(x=positions.index, y=positions)
plt.xlabel("Position")
plt.ylabel("Number of players")
plt.title("Number of players by positions")
plt.show()

按位置分列的 NBA 球员人数

有七种不同的位置:

  • 得分后卫
  • 小前锋
  • 大前锋
  • c(中间)
  • 控卫
  • g(防护)
  • f(向前)

其中,SF 和 SG 的玩家数量最多。前锋和后卫位置的样本量明显小于其他位置。

让我们比较一下每种职位的平均工资。

figsize(12.5,4)
salary=df.groupby('Position')['Salary'].mean()
salary.sort_values(inplace=True)
bar=sns.barplot(x=salary.index, y=salary)
plt.xlabel("Position")
plt.ylabel("Salary, million dollar")
plt.title("Average salary across different positions")
plt.show()

不同职位的平均工资

我们看到,平均而言,得分后卫和中锋球员收入最高。另一方面,小后卫球员挣得最少。我们也可以使用箱线图来获得一个更广阔的图景。

figsize(16,6)
my_order = df.groupby("Position")['Salary'].median().sort_values(ascending=False).index
sns.boxplot(data=df, x='Position', y='Salary', order=my_order)
plt.title("Salary for different positions")
plt.show()

每个职位的工资箱线图

对于所有职位,工资都有尾部分布。此外,PG 和 Center 的薪资分布非常相似。总的来说,好像 SG 赚的最少。

第 3.1 部分:得分后卫和控卫

在第一部分,我们比较得分后卫和控球后卫的薪水。如上图所示,我们预计,平均而言,控卫球员比 SG 球员挣得多。

首先,我们过滤掉 SG 和 PG 位置的数据。我们还计算混合样本均值和混合样本方差,如[1]所述。

SG=df[df['Position']=='SG']['Salary']
PG=df[df['Position']=='PG']['Salary']
pooled_mean=np.r_[SG, PG].mean()
pooled_std=np.r_[SG, PG].std()
variance=2*pooled_std

我们为均值、方差和自由度变量设置先验分布。

with pm.Model() as model_1:
    mu_A=pm.Normal("mu_A", pooled_mean, sd=variance)
    mu_B=pm.Normal("mu_B", pooled_mean, sd=variance)
    std_A=pm.Uniform("std_A", 1/100, 100)
    std_B=pm.Uniform("std_B", 1/100, 100)
    nu_minus_1=pm.Exponential("nu-1", 1.0/29)

接下来,我们将数据放入模型中。

with model_1:
    obs_A=pm.StudentT("obs_A", mu=mu_A, lam=1.0/std_A**2, nu=nu_minus_1+1, observed=SG)
    obs_B=pm.StudentT("obs_B", mu=mu_B, lam=1.0/std_B**2, nu=nu_minus_1+1, observed=PG)
    start=pm.find_MAP()
    step=pm.Metropolis(vars=[mu_A, mu_B, std_A, std_B, nu_minus_1])
    trace_1=pm.sample(25000, step=step)
    burned_trace_1=trace_1[10000:]

一旦完成,我们就有了变量后验分布的样本。然后我们可以绘制它们来比较 SG 和 PG 球员的薪水。

首先,我们画出这两个职位的平均工资。

figsize(12.5, 4)
SG_mean=burned_trace_1['mu_A']
PG_mean=burned_trace_1['mu_B']
plt.hist(SG_mean, bins=40, label=r'Posterior distribution of $\mu_{SG}$')
plt.hist(PG_mean, bins=40, label=r'Posterior distribution of $\mu_{PG}$')
plt.title('Posterior distributions of average salaries for SG and PG')
plt.legend()
plt.show()

这个图说明 PG 球员平均收入比 SG 球员高。这些职位的薪资浮动情况如何?

figsize(12.5, 4)
SG_std=burned_trace_1['std_A']
PG_std=burned_trace_1['std_B']
plt.hist(SG_std, bins=40, label=r'Posterior distribution of $\sigma_{SG}$')
plt.hist(PG_std, bins=40, label=r'Posterior distribution of $\sigma_{PG}$')
plt.title('Posterior distributions of  standard derivation derived from PyMC3')
plt.legend()
plt.show()

对于 PG 职位,即使平均工资更高,但波动也更大。

让我们应用 ROPE=[-0.1,0.1]和 95% HDI 的最佳值。这最好通过下面的可视化来完成。

figsize(12.5, 4)
difference=PG_mean-SG_mean #difference of the means hdi=pm.stats.hpd(difference, hdi_prob=0.95) #the 95% HDI interval of the differencerope=[-0.1, 0.1] #the ROPE region plt.hist(difference, bins=50, density=True, label='Differene of the mean salaries')
plt.title('Posterior distribution of the the difference of the means')
plt.vlines(hdi[0], 0,0.6, linestyle='--', color='red', label='HDI')
plt.vlines(hdi[1], 0, 0.6, linestyle='--', color='red')
plt.vlines(rope[0], 0, 0.6, linestyle='--', color='black', label='ROPE')
plt.vlines(rope[1], 0, 0.6, linestyle='--', color='black')
plt.title('Posterior distribution of the the difference of the mean salaries for PG and SG')
plt.legend(loc='upper right')
plt.show()

由于绳子完全在 HDI 区间之外,我们拒绝零假设:我们相信,平均而言,PG 球员比 SG 球员挣得多。我们注意到,在这种情况下,人类发展指数

[0.5580346 , 3.57072747]

所以,即使我们取[-0.5,0.5]这样更宽的绳子,仍然可以拒绝零假设。此外,正如上一篇文章中所讨论的,贝叶斯观点允许我们回答更复杂的问题。比如说,我们有多大把握说一个控卫球员比 SG 球员多赚 50%呢?

figsize(12.5, 4)
rel_difference=100*(PG_mean-SG_mean)/SG_mean #difference of the means
prob=len(rel_difference[rel_difference>50])/len(rel_difference)
plt.hist(rel_difference, bins=50, density=True, label='Relative differene of the mean salaries')
plt.title('Posterior distribution of the the relative difference of the means')
plt.vlines(50, 0,0.011, linestyle='--', color='red', label='HDI')
print(f"The probability that a PG player earn 50% more than an SG player is: {prob}")
plt.show()The probability that a PG player earn 50% more than an SG player is: 0.8830833333333333

我们很有信心 PG 球员比 SG 球员多挣 50%。

第 3.2 部分:小前锋和大前锋

我们可以使用上一节中的框架来做类似的分析。

SF=df[df['Position']=='SF']['Salary']
PF=df[df['Position']=='PF']['Salary']
pooled_mean=np.r_[SF, PF].mean()
pooled_std=np.r_[SF, PF].std()variance=2*pooled_std
with pm.Model() as model_2:
    mu_A=pm.Normal("mu_A", pooled_mean, sd=variance)
    mu_B=pm.Normal("mu_B", pooled_mean, sd=variance)
    std_A=pm.Uniform("std_A", 1/100, 100)
    std_B=pm.Uniform("std_B", 1/100, 100)
    nu_minus_1=pm.Exponential("nu-1", 1.0/29) obs_A=pm.StudentT("obs_A", mu=mu_A, lam=1.0/std_A**2, nu=nu_minus_1+1, observed=SF)
    obs_B=pm.StudentT("obs_B", mu=mu_B, lam=1.0/std_B**2, nu=nu_minus_1+1, observed=PF)
    start=pm.find_MAP()
    step=pm.Metropolis(vars=[mu_A, mu_B, std_A, std_B, nu_minus_1])
    trace_2=pm.sample(25000, step=step)
    burned_trace_2=trace_2[10000:]

我们绘制了 SF 和 PF 职位平均工资的后验分布直方图。

与之前的比较不同,我们看到两个后验分布重叠更多。我们可以研究这两种分布的区别。首先,我们使用 ROPE=[-0.1,0.1]和 95% HDI 区间。

我们没有足够的证据通过上述决策规则拒绝或接受这些 ROPE 和 HDI 选择的零假设。让我们仔细看看人类发展指数。

array([-0.44822444,  1.34450148])

我们看到,如果我们坚持这个人类发展指数,那么除非我们选择一个非常宽的绳子(因此,接受零假设),我们的数据不足以做出结论性的决定。

第 3.3 部分:中锋 vs 大前锋

通过类似的代码,我们可以比较中锋和大前锋的工资。我们将根据几种选择以及 HDI 和 ROPE 绘制平均工资的差异。

我们看到,如果选择 ROPE=[-0.1,0.1]和 95% HDI 区间,我们的数据无法做出最终决定。然而,假设我们把人类发展指数降低到 80%。在这种情况下,我们有信心中锋球员的平均收入高于大前锋球员。

结论

我们希望读者能从这篇文章中学到一些东西。首先,BEST 提供了一个进行贝叶斯 A/B 测试的通用框架,它可以定制客户的业务方法。其次,BEST 可以方便地用 PyMC3 实现。最后但同样重要的是,对于 NBA 来说,我们很有信心得分后卫球员的平均收入高于得分后卫球员。我们不太有信心说中锋比大前锋挣得多。然而,我们没有足够的证据来区分小前锋和大前锋球员的工资。

参考文献

[1] John K. Kruschke,贝叶斯估计取代了 t 检验

[2] PyMC3 最佳教程,https://docs.pymc.io/notebooks/BEST.html

回溯测试不会帮你赢得下一个客户

原文:https://towardsdatascience.com/a-backtest-wont-help-you-win-your-next-customer-d7e5b1facf8e?source=collection_archive---------37-----------------------

回溯测试就像一把双刃剑,通常它制造的模糊多于清晰

照片由石页·康让在 Unsplash

什么是回溯测试?

回测是一种采用预测模型并对历史数据进行测试的验证方法。当这样做时,你预测了“未来”,而事实上未来是已知的(但是对模型是隐藏的)。然后,您可以立即检查您的预测和模型的执行情况。

使用历史数据进行回溯测试

假设我们开发了一个预测航班延误的机器学习产品。为了构建产品模型,我们使用了从不同来源收集的历史航班细节,并且我们根据这些数据不断测试我们的模型(交叉验证)。商业模式是将产品销售给机场和航空公司,这样他们可以更好地运营业务,提高乘客满意度。

你向潜在客户推销这一点,向他们展示在省钱、减少总延误和提高乘客满意度方面的潜在价值。一位客户对该产品感兴趣,您的销售经理提议获取潜在客户数据并进行回溯测试,以证明模型的准确性和产品价值。您的销售经理相信,成功的回溯测试会说服潜在客户达成交易。

含糊而非清晰

在开发和测试模型时,回溯测试是内部使用的一个很好的工具。它有助于发现问题并了解你的预测有多准确,但这绝对不是你希望你的潜在客户和客户衡量你的正确方式或唯一方式。这就是为什么你不应该提供回溯测试来释放产品价值的原因:

1.结果很差

大多数航班延误没有被发现,那些被发现的也没有延误。单一预测不理想的原因可能有很多:

  • 训练数据有限且缺乏
  • 训练数据有偏差
  • 你不能投入太多的资源来为一个单一的回溯测试做出正确的调整
  • 预测数据有太多例外和异常值(例如,极端天气、瘟疫爆发等。)

无论在这个过程中你给出了多少免责声明,你都将仅仅基于那个单一的预测而被评判。要改变这种印象将会非常困难,而且很可能你将不得不投入更多的资源。

2.结果是模糊的

大约 20%的航班延误没有被发现,另外 35%的航班延误被意外发现,因为事实上他们并没有被发现。

当结果非常好的时候,这是显而易见的,当结果很差的时候也是如此。但是当结果处于中间时,就会产生模糊,很难确定回溯测试是否成功。如果我们优化召回而不是精确或者反过来,也许结果会被认为更好?

在流程的这个阶段向潜在客户解释回溯测试 KPI 并不容易。在大多数情况下,潜在客户不知道如何消化它们,不知道会发生什么,也不知道对他们的业务有什么真正的影响。

3.结果很好

大多数延误都被发现了,有限的航班被错误地标记为延误,而实际上并没有。

你建立了一个惊人的模型,它是如此的精确,以至于客户都不敢相信它有那么好。如果你认为一个回溯测试结果就能建立签署协议所需的信任,那你就再想想吧。

取得如此好的结果后,你的潜在客户可能会问:

  • 另一个回溯测试,看看你是否能重现结果
  • 附加产品功能
  • 看到完整的产品流程,他们才会真正信任你这个供应商

在这一点上,潜在客户往往会非常怀疑,并且在这种情况下可能会认为,既然“未来”是已知的,那么它只是偶然地(或者不是)没有从模型中隐藏起来。

4.结果毫无意义

即使你的预测被发现是正确的,价值和信任也不会因此而产生。你需要一个故事,潜在客户需要一些相关的东西。产品价值是通过许多方面来解锁的,包括集成到现有的工作流、洞察力、预测解释(可解释的 AI)和许多其他方面。非常努力地进行概念验证,但最终无法展示您的整体产品价值,这将无法建立您想要达成交易的信任。

你应该怎么做?

发展与潜在客户的关系,围绕完整的产品价值而非一次性预测来构建产品。由于对潜在客户的数据进行完整的回溯测试需要大量资源,因此最好将这些资源投入到完整的产品体验中。这将有助于潜在客户了解它是如何集成到他们的日常工作流程中的,实际使用它,查看外观和感觉,并根据多个标准(包括一系列预测而非单一标准)对其进行判断。此外,预测现在都附有适当的解释,潜在客户可以了解决策过程,并感受到对其业务和运营的真正影响。

确保密切管理流程。这包括每周会议、反馈收集、模型改进和必要时的变更部署。通过参与和体验建立信任,而不是通过底线。

非常感谢您的阅读!如果你喜欢这篇文章,我希望收到你的来信——分享或留下你的评论。如果你想阅读更多的故事,请在 Medium 或 LinkedIn 上关注我。

初始和探索性数据分析的基本指南

原文:https://towardsdatascience.com/a-basic-guide-to-initial-and-exploratory-data-analysis-6d2577dfc242?source=collection_archive---------14-----------------------

用 Python 写了几个例子

本文最后一次更新是在 2021 年 9 月 1 日。

简介

数据分析师在不同的工作环境中有不同的定义。数据分析师可能参与各种工作,包括管理信息系统、报告、数据工程、数据库管理等。在真实场景中。也不一定不好。但在这里,我们将讨论的是数据分析师的实际工作,而不是公司让他们做什么。数据分析师的字面意思是分析数据的人——不是设计管道让数据流动,也不是维护数据库——只是分析。找出数据的含义。识别趋势。支持业务团队做出更好的决策,提高整体效率。这个角色更倾向于核心统计学,而不是核心计算机科学。

记住这一点,对于数据分析师来说,在开始发现数据的含义之前,完成以下两个步骤是很有用的

  • 通过查看不同的数据点及其在给定数据集中的可用性和分布,找出有用的信息。
  • 根据可用性找出不同变量之间的相互关系。人们还可以检查数据的质量,这是我们的第一步。

这不是一篇关于你可以用来执行这两个步骤的所有方法的全面综述。只是对其中一些的基本概述。

照片由艾萨克·史密斯在 Unsplash 上拍摄。希望这不是你作为数据分析师要做的分析。对了,这是不是一个很好的图!😃

初始数据分析

使用 可视化数据集的完整性没有遗漏——数据不完整是一个主要问题——无论是基于机器的数据收集还是基于人类的数据收集。这两种方法都容易出错。如果在分析任何给定的数据集之前确定了数据的完整性,那么数据的完整性就不是问题。如果根据不完整的数据做出决策,那将是一场灾难。思考的食粮——考虑没有数据比不完整数据更好的情况,以得出合理合理的结论/推论。

这个想法是为了检查数据的不完整性

下图显示了数据集中 dbtp 的数据稀少,而 tb、sf、gen 的数据丰富。

故意 扭曲 肝脏患者数据取自https://archive . ics . UCI . edu/ml/datasets/ILPD+(Indian+Liver+Patient+Dataset)

使用以下方法获得上面的图:

**import** pandas **as** pd
**import** missingno **as** mn
**from** IPython **import** get_ipython
get_ipython().run_line_magic(**'matplotlib'**, **'inline'**)
df = pd.read_csv(**'/Users/mac/Downloads/missingno-ex.csv'**)
mn.matrix(df.sample(500), figsize=(10,6))

这个想法是

确定两个或多个字段的数据可用性之间的相关性

对于大型数据集,从该数据集中随机抽取一个样本并绘制数据,以确定数据丢失的频率。此外,使用以下代码行绘制一个树状图来确定两个或更多字段的数据可用性之间的相关性:

mn.dendrogram(df, figsize=(10,6))

为了识别两个变量之间的配对差异,绘制一个树状图。欲知详情,请阅读—http://www . nonlinear . com/support/progenesis/comet/FAQ/v 2.0/dendrogram . aspx

为了简单起见,使用条形图来可视化数据——在特定变量包含数据的地方显示绝对数字。

mn.bar(df, figsize=(10,6))

绝对数字

既然我们对数据的分布和可用性有了一些了解,我们就可以研究数据了。

人们可能想知道的第一件事是数据集实际上是什么样子。为了得到这个提示,可以打印出数据集中的第一个n记录。NaN表示数据不可用。稍后我们将讨论NaN值。

使用 pandas 数据框架探索数据

探索性数据分析

现在我们对数据的外观有了一些了解,是时候使用 Seaborn 来探索数据了。

这个想法是看数据集中的两个给定变量是如何相互关联的?

看完数据后,想到的第一个分析问题是这个数据集中两个相互关联的变量是怎样的?或者说,当某个变量发生变化时,另一个变量的值是如何变化的?或者这两个变量之间是否存在关系。

即使寻找线性回归拟合线可能不是动机,人们可能仍然希望探索数据所承载的价值。重要的是要知道两个变量之间是否存在关系(相关性),如果存在,值如何变化(回归)

使用这个简单的代码得到上面的图表。

**import** matplotlib.pyplot **as** plt
**import** seaborn **as** sns
sns.set_context("**notebook**", font_scale=1.1)
sns.set_style("**ticks**")
sns.lmplot('**alba**', '**tp**',
           data=df,
           fit_reg=True,
           scatter_kws={"marker": "D",
                        "s": 10})
plt.show()

除了上一个图表的内容之外,为了可视化上一个图表中绘制的这些变量的值的分布,而不是sns.lmplot,可以使用下面的代码行使用sns.jointplot:

sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg")

阅读更多关于Pearson r—https://docs . scipy . org/doc/scipy-0 . 14 . 0/reference/generated/scipy . stats . Pearson r . html

让我们来看看可视化数据的最有用的 EDA 方法之一——箱线图。

这个想法是研究数据集中变量的分布

箱线图主要用于研究数据集中变量的分布。尽管直方图也可用于此,但相比之下,箱线图在某些情况下提供了更好的数据汇总。箱线图告诉我们数据的形状、可变性和中心。虽然,当我们只热衷于通过某种方式了解分布情况以告诉我们数据偏向了哪一侧时,直方图可以满足我们的目的,使我们免于其他细节。

**import** pandas **as** pd **import** matplotlib.pyplot **as** plt
**import** seaborn **as** sns
df = pd.read_csv(**'/Users/mac/Downloads/missingno-ex.csv'**)
sns.factorplot(x='**alba**',y= '**ab/gr**',data=df,kind='box',aspect=1)
plt.show()

了解更多关于箱形图** —1 的信息。https://flowing data . com/2008/02/15/how-to-read-and-use-a-box-and-whisker-plot/和 2。https://www . nature . com/nmeth/journal/v11/N2/pdf/nmeth . 2813 . pdf**

在 Seaborn 中使用因子点图,可以像这样可视化上面已经可视化的相同数据。

sns.factorplot(x='**alba**',y= '**ab/gr**',data=df,kind='point',aspect=1)

清理数据 —显然,这需要在我们开始分析之前完成,并且是为使用数据做准备的一部分——因此,它是初始数据分析阶段而不是 EDA 的一部分。

当您使用missing no库来可视化数据丢失的位置时,您没有清理数据以供使用。第一部分是从数据集中移除空值。然后删除重复项。****

****import** pandas **as** pd **import** matplotlib.pyplot **as** plt
**import** seaborn **as** snsdf = pd.read_csv(**'/Users/mac/Downloads/missingno-ex.csv'**)
# Cleaning the data now
df = df.dropna().drop_duplicates()
sns.factorplot(x='**alba**',y= '**ab/gr**',data=df,kind='box',aspect=1)
plt.show()**

这是用 dropna()和 drop_duplicates()清理后数据的样子。注意最左边一列中缺少的索引——顺便说一下,这不是数据集的一部分。它只代表行号。

经过清理后,这就是保留下来供使用的数据。

这是对您可以在数据分析过程的前两步中使用的几个示例的基本介绍,即,

  1. 初始数据分析 —对数据的性质及其收集方式的初步探索。这一部分包括清理和管理数据,以便对分析有用。
  2. 探索性数据分析 —涉及全面的探索,主要是通过可视化的方法,其中一些方法在上面已经提到。
  3. 建模——为给定数据创建模型,并建立不同变量之间的关系——使用训练数据集。
  4. 验证 —检查模型是否适用于未用于训练的数据集,即测试数据集。如果模型有效,那么你继续下一步。否则,你回去改进模型。
  5. 预测 —如果模型得到验证,您可以很有把握地说,数据集中的某个变量相对于数据集中的另一个变量将如何变化。这是最后阶段。

结论

前两步很重要,尤其是在对数据缺乏信任的情况下。这种缺乏信任可能是由各种原因引起的,如您收集数据的方式、数据的来源、数据是否有偏差、数据是否被有意篡改、等等。执行前两个步骤,即初始数据分析和探索性数据分析,很容易识别数据集的问题,而不会花费任何时间来做出错误的和错误的模型和预测。**

生成对抗网络的基本介绍

原文:https://towardsdatascience.com/a-basic-intro-to-gans-generative-adversarial-networks-c62acbcefff3?source=collection_archive---------24-----------------------

入门

甘是如何工作的?他们为什么这么有趣?

我有机会在甘斯做了 3 个月的研究实习。我读了很多科学论文和博客。在这篇文章中,我试图传达我所学到的和觉得值得分享的基本知识。

目录

1)简介
2)GANs 是如何工作的?
2.1)原理:生成器 vs 鉴别器
2.2)数学上:双人极大极小游戏
3)为什么 GANs 这么有趣?
4)结论和参考文献

图 1 :使用 GANs 从原始图像生成的现实而虚构的名人肖像。来源:英伟达【4】

1)简介

在过去的十年里,可用数据量的爆炸式增长——大数据——算法的优化和计算能力的不断进化,使人工智能 (AI)能够执行越来越多的人类任务。2017 年,Andrey Ng 预测人工智能将像电一样产生深远的影响。

如果我们声称 AI 的目的是模拟人类的智能,那么主要的难点就是创造力。在人工智能领域,我们谈论生成模型,当今最流行的模型之一是 GANs(表示“生成对抗网络”)。在 2016 年的一次研讨会上, Yann LeCun 称 GANs 是“过去 20 年深度学习领域最酷的想法”。

甘斯引入了对抗学习的概念,因为它们存在于两个神经网络之间的竞争中。这些技术使研究人员能够创建看起来逼真但完全由计算机生成的人脸照片。他们还允许制作有争议的“深度造假”视频。实际上,GANs 可以用来模仿任何数据分布(图像、文本、声音等。).

GANs 2018 年的结果示例见图 1** :这些图像是假的,但非常真实。这些虚构的名人肖像的生成,来自 Celeba-HQ 的真实肖像数据库,由 30,000 幅图像组成,耗时 19 天。生成的图像大小为 1024×1024。**

GANs 是如何工作的?

生成对抗网络 (GANs)是一种带有隐式密度估计的生成模型,是无监督学习的一部分,使用两个神经网络。因此,我们理解“生成性对抗网络”中的“生成性”和“网络”这两个术语。

2.1)原理:发生器与鉴别器

****图二:发生器和鉴别器的作用。来源:斯坦福 cs 231n【2】

其原理是一个双人游戏:一个被称为生成器的神经网络和一个被称为鉴别器的神经网络。发生器试图通过生成看起来真实的图像来欺骗鉴别器,而鉴别器试图区分真实和虚假的图像。因此,我们理解“生成对抗网络”中的“对抗”一词。参见图 2** 。**

图 3 :解释:发生器和鉴别器的作用。来源: TensorFlow 。

图 2** 的左下方,我们可以看到我们的发生器样本来自一个简单的分布:随机噪声。生成者可以解释为艺术家,鉴别者可以解释为艺术批评家。参见图 3 。**

图 4 :发电机和鉴别器培训。来源: TensorFlow 。

在训练过程中,发生器逐渐变得更擅长创建看起来真实的图像,而鉴别器变得更擅长区分它们。当鉴别器不再能够区分真实图像和伪造图像时,该过程达到平衡。参见图 4** 。因此,如果鉴别器训练有素,并且生成器设法生成看起来真实的图像来欺骗鉴别器,那么我们就有了一个良好的生成模型:我们正在生成看起来像训练集的图像。**

在这个训练阶段之后,我们只需要生成器对新的(错误的)真实数据进行采样。我们不再需要鉴别器了。请注意,随机噪声保证了发生器不会总是产生相同的图像(这会欺骗鉴别器)。

请注意,在图 4 中的训练开始时,发生器仅产生一个看起来不像训练数据的随机噪声。****

2.2)数学上:双人极大极小游戏

生成器 G 和鉴别器 D双人极大极小游戏的形式联合训练。最小最大目标函数是:

方程式(1)

其中 θ_gG 的参数, θ_dD 的参数。

下面我们简单的把 D_{θ_d} 称为 D ,把 G_{θ_g} 称为 G

根据定义, D 输出真实图像在区间 [0,1]:
D(x)等于 1 (或者接近于 1 )如果 D 认为 x 是真实数据,
D(x)等于0

我们可以证明,在均衡状态下, D 处处输出 1/2 ,因为 D 不知道如何区分虚假生成的数据和真实数据。

因为x∞p _ { data }x 是实数据。根据 G 的定义, G(z) 是一个假生成的数据。例如, x 将是一只猫的真实图像,而 G(z) 将是一只猫的假生成图像。因此, D(x) 是鉴别器对于真实输入 x 的输出,而D(G(z)】是鉴别器对于伪生成数据 G(z) 的输出。**

【1】之后,来自等式(1)* 的两人极大极小游戏被写成使得 θ_gθ_d 进化,使得子节 2.1) 中的以下几点为真:
鉴别器 D 试图区分真实数据 x
更准确地说,鉴别器 Dθ_d ( θ_g 固定)一起运行,以最大化目标函数,使得 D(x) 接近于 1 ( x 为真实数据),并且使得D(G(z)接近于 0
生成器 G 试图欺骗鉴别器 D 认为其生成的假数据是真实的。
更准确地说,生成器 Gθ_g ( θ_d 固定)一起运行,以最小化目标函数,使得
D(G(z)】接近于 1 (一个错误生成的数据被鉴别器检测为真)。***

虽然我们是在无监督学习中(数据没有标注),但是我们选择由 G 生成的数据有一个 0 标签为假(不管鉴别器返回什么),真实的学习数据有一个 1 标签为真。因此,我们可以定义一个损失函数。

论文【1】证明了极小极大对策对于 p_g = p_{data} 有一个全局(唯一)最优,其中 p_g 是生成分布, p_{data} 是真实数据分布。然而,在实践中,让 p_gp_{data} 收敛并不容易。**

3)为什么甘这么有意思?

生成模型有几个非常有用的应用:彩色化、超分辨率、艺术作品的生成等。一般来说,使用模拟模型优于真实模型的优点是计算速度更快。

Goodfellow 的教程【3】和 Stanford 的讲座【2】中给出了很多有趣的例子。特别是 Goodfellow 在 4:15 到 12:33 的会议“生成性对抗性网络(NIPS 2016 教程)”中给出的例子,让人印象深刻。**

图 5 : CycleGAN:用 GANs 把真实的影像转置成现实的虚构影像。来源:柏克莱人工智能研究(BAIR)实验室【5】**

图 5 给出了一个例子。伯克利大学研究人员开发的 CycleGan 将这些真实图像转换成现实的虚构图像,反之亦然。这个概念被称为图像到图像转换,是一类视觉和图形问题,其目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射。对于 Tensorflow,CycleGAN 上有一个教程。**

图 6 :使用 GANs 的几种图像变换。来源:柏克莱人工智能研究(BAIR)实验室【6】**

第二个例子如图 6 中的所示。例如,空中转地图功能对谷歌地图或类似的应用程序非常有用,边缘转照片功能可以帮助设计师。****

4)结论

GANs 的应用增长迅速,尤其是在图像方面。我相信 GANs 对公司来说是非常有趣的。例如,GANs 可以生成新医学图像的逼真图像,图像到图像的翻译可以帮助设计人员绘图并更具创造性。此外,当我们只有一百张图像并且希望有更多时,GANs 可以用于数据扩充**

GANs 也被开发用于二进制输出(生病与否)或离散输出(四舍五入的血压、四舍五入的体重……)【7】。这项关于表格数据的新研究带来了很多好处,特别是对于隐私的目的。例如,医院可以向他们的合作伙伴发送虚假的真实数据(保持特征之间的相关性),而不是发送 Excel 表格中的机密数据。**

感谢阅读,希望这篇文章对你有用。不要犹豫,在评论中给出反馈。随时联系我 推特

参考

伊恩·古德菲勒、让·普热-阿巴迪、米尔扎、徐炳、戴维·沃德-法利、谢尔吉尔·奥泽尔、亚伦·库维尔和约舒阿·本吉奥。"生成对抗网" NIPS (2014)。
【2】费-、和杨威。 CS231n:用于视觉识别的卷积神经网络。第 13 讲|生成模型。
斯坦福大学
(2017 年春季)。
【3】伊恩·古德菲勒。" NIPS 2016 教程:生成对抗网络"ArXiv abs/1701.00160 (2017)。
【4】泰罗·卡拉斯、蒂莫·艾拉、s·莱恩和 j·莱蒂宁。为了提高质量、稳定性和多样性而逐步种植甘蔗。ArXiv ABS/1710.10196(2018)。
【5】朱俊彦、t·帕克、菲利普·伊索拉和阿列克谢·阿·埃夫罗斯。"使用循环一致对抗网络的不成对图像到图像翻译" 2017 IEEE 计算机视觉国际会议(ICCV)(2017):2242–2251。
【6】菲利普·伊索拉、、周廷辉和阿列克谢·埃夫罗斯。"用条件对抗网络进行图像到图像的翻译" 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)(2017):5967–5976。
e .崔、s .比斯瓦尔、b .马林、j .杜克、w .斯图尔特和孙。使用生成式对抗网络生成多标签离散患者记录。 MLHC (2017)。
**

TensorFlow Lite 的基本介绍

原文:https://towardsdatascience.com/a-basic-introduction-to-tensorflow-lite-59e480c57292?source=collection_archive---------7-----------------------

介绍 TensorFlow Lite 转换器、量化优化和在边缘运行 Tensorflow Lite 模型的解释器

在本文中,我们将了解在边缘部署深度学习模型所需的功能,什么是 TensorFlow Lite,以及如何使用 TensorFlow Lite 的不同组件在边缘进行推断。

Priscilla Du Preez 在 Unsplash 上拍摄的照片

你正在尝试将你的深度学习模型部署在一个他们没有良好网络连接但仍然需要深度学习模型来提供出色性能的区域。

TensorFlow Lite 可用于这种情况

深度学习模型在边缘进行推理的特征

  1. 轻量级:边缘设备在存储和计算能力方面资源有限。深度学习模型是资源密集型的,因此我们在边缘设备上部署的模型应该是轻量级的,具有较小的二进制大小。
  2. 低延迟:边缘的深度学习模型应该做出更快的推断,而不管网络连接性如何。由于推断是在边缘设备上进行的,因此将消除从设备到服务器的往返行程,从而使推断更快。
  3. 安全:模型部署在边缘设备上,推断在设备上进行,没有数据离开设备或在网络上共享,因此不存在数据隐私问题。
  4. 最佳功耗:网络需要大量功率,边缘设备可能没有连接到网络,因此功耗需求较低。
  5. 预训练:模型可以在内部或云端进行训练,用于不同的深度学习任务,如图像分类、对象检测、语音识别等。并且可以很容易地部署以在边缘做出推断。

Tensorflow Lite 提供了在边缘进行推理所需的所有功能。

但是 TensorFlow Lite 是什么?

TensorFlow Lite 是一个开源、产品就绪、跨平台的深度学习框架,可以将 TensorFlow 中预先训练的模型转换为一种特殊的格式,可以针对速度或存储进行优化

特殊格式模型可以部署在边缘设备上,如使用 Android 或 iOS 或 Linux 的移动设备,基于嵌入式设备,如 Raspberry Pi 或微控制器,以在边缘进行推理

tensor flow Lite(TF Lite)是如何工作的?

选择并训练一个模型

假设您想要执行图像分类任务。第一件事是决定任务的模型。你的选择是

  • 创建自定义模型
  • 使用预先训练好的模型,如 InceptionNet、MobileNet、NASNetLarge 等。
  • 在预先训练的模型上应用迁移学习

使用转换器转换模型

模型定型后,您将把模型转换为 Tensorflow Lite 版本。 TF lite 模型是一种特殊格式的模型,在准确性方面很有效,并且是一种占用空间较少的轻量型模型,这些特性使 TF lite 模型非常适合在移动和嵌入式设备上工作。

TensorFlow Lite 转换流程

来源:https://www.tensorflow.org/lite/convert/index

在从 Tensorflow 模型到 Tensorflow Lite 模型的转换过程中,文件的大小会减小。我们可以选择进一步减小文件大小,同时权衡模型的执行速度。

Tensorflow Lite 转换器将 Tensorflow 模型转换为 Tensorflow Lite 平面缓冲文件()。tflite )。

Tensorflow Lite 平面缓冲文件部署到客户端,在我们的例子中,客户端可以是运行在 iOS 或 Android 上的移动设备或嵌入式设备。

如何将 TensorFlow 模型转换为 TFlite 模型?

训练完模型后,您现在需要保存模型。

保存的模型在单个文件中序列化模型的架构、权重和偏差以及训练配置。保存的模型可以很容易地用于共享或部署模型。

转换器支持使用保存的模型

  • tf.keras.Model: 使用 keras 创建并编译模型,然后使用 TFLite 转换模型。
#Save the keras model after compiling
**model.save('model_keras.h5')
model_keras= tf.keras.models.load_model('model_keras.h5')**# Converting a tf.Keras model to a TensorFlow Lite model.
**converter = tf.lite.TFLiteConverter.from_keras_model(model_keras)
tflite_model = converter.convert()**
  • SavedModel :一个 SavedModel 包含一个完整的 TensorFlow 程序,包括权重和计算。
#save your model in the SavedModel format
**export_dir = 'saved_model/1'
tf.saved_model.save(model, export_dir)**# Converting a SavedModel to a TensorFlow Lite model.
**converter = lite.TFLiteConverter.from_saved_model(export_dir)
tflite_model = converter.convert()**

export_dir 遵循一个惯例,其中最后一个路径组件是模型的版本号。

SavedModel 是保存在 export_dir, 上的元图,使用 lite 转换为 TFLite 模型。TFLiteConverter

  • 具体功能: TF 2.0 默认开启急切执行,影响性能和可部署性。为了克服性能问题,我们可以使用 tf.function 来创建图形。图形包含模型结构,以及模型的所有计算操作、变量和权重。

将模型导出为具体函数,然后将具体函数转换为 TF Lite 模型

**# export model as concrete function**
func = tf.function(model).get_concrete_function(
    tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))#Returns a serialized graphdef representation of the concrte function
**func.graph.as_graph_def()**# converting the concrete function to Tf Lite 
**converter =  tf.lite.TFLiteConverter.from_concrete_functions([func])
tflite_model = converter.convert()**

优化模型

为什么要优化模型?

边缘模型需要重量轻

  • 在边缘设备上占用较少的空间。
  • 在带宽较低的网络上下载速度更快
  • 为模型占用更少的内存,以便更快地做出推断

处于边缘的模型也应该具有运行推理的低延迟。轻量级和低延迟模型可以通过减少预测所需的计算量来实现。

优化减少了模型的大小或改善了延迟。在模型的大小和模型的准确性之间有一个权衡。

tensor flow Lite 中优化是如何实现的?

Tensorflow Lite 通过以下方式实现优化

  • 量化
  • 权重修剪

量子化

当我们保存 TensorFlow 模型时,它存储为包含计算操作、激活函数、权重和偏差的图形。激活函数、权重和偏差是 32 位浮点。

量化降低了用于表示张量流模型的不同参数的数字的精度,这使得模型重量轻。

量化可以应用于权重和激活。

  • 具有 32 位浮点的权重可以转换为 16 位浮点或 8 位浮点或整数,并且将减小模型的大小。
  • 权重和激活都可以通过转换为整数来量化,这将提供低延迟、更小的尺寸和降低的功耗。

权重修剪

正如我们修剪植物以去除植物的非生产性部分,使其更结果实和更健康一样,我们也可以修剪模型的权重。

权重修剪会修剪模型中对模型性能影响很小的参数。

权重剪枝实现模型稀疏,稀疏模型压缩效率更高。修剪后的模型将具有相同的大小和运行时延迟,但具有更好的压缩性能,可在边缘实现更快的下载时间。

部署 TF Lite 模型并进行推理

TF lite 模型可以部署在 Android 和 iOS 等移动设备上,以及 Raspberry 和微控制器等边缘设备上。

要从边缘设备进行推断,您需要

  • 初始化解释器,并用模型加载解释器
  • 分配张量,得到输入和输出张量
  • 通过读入张量对图像进行预处理
  • 通过调用解释器对输入张量进行推理。
  • 通过映射推理的结果来获得图像的结果
# Load TFLite model and allocate tensors.
**interpreter = tf.lite.Interpreter(model_content=tflite_model)
interpreter.allocate_tensors()**#get input and output tensors
**input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()**# Read the image and decode to a tensor
**img = cv2.imread(image_path)
img = cv2.resize(img,(WIDTH,HEIGHT))**#Preprocess the image to required size and cast
**input_shape = input_details[0]['shape']
input_tensor= np.array(np.expand_dims(img,0), dtype=np.float32)**#set the tensor to point to the input data to be inferred
**input_index = interpreter.get_input_details()[0]["index"]
interpreter.set_tensor(input_index, input_tensor)**#Run the inference
**interpreter.invoke()
output_details = interpreter.get_output_details()[0]**

还有其他方法可以改善延迟吗?

Tensorflow lite 使用委托来提高 TF Lite 模型在边缘的性能。 TF lite delegate 是一种将部分图形执行交给另一个硬件加速器的方式,比如 GPU 或 DSP (数字信号处理器)。

TF lite 使用几个硬件加速器来提高速度、准确性和优化功耗,这是在边缘运行推理的重要特性。

结论: TF lite 模型是轻量级模型,可以部署在移动设备、Raspberry Pi 和微控制器等边缘设备上进行低延迟推理。当与硬件加速器一起使用时,TF lite delegate 可用于进一步提高速度、准确性和功耗

参考资料:

[## TensorFlow Lite 指南

www.tensorflow.org](https://www.tensorflow.org/lite/guide)

https://www.tensorflow.org/model_optimization/guide/pruning

[## 训练后量化|张量流模型优化

www.tensorflow.org](https://www.tensorflow.org/model_optimization/guide/quantization/post_training)

https://www . tensor flow . org/lite/performance/model _ optimization

机器学习项目模板

原文:https://towardsdatascience.com/a-basic-machine-learning-project-template-bf0ade0941d3?source=collection_archive---------12-----------------------

总结基本 ML 项目中遵循的步骤

万花筒在 Unsplash 上拍摄的照片

每个机器学习项目都有其独特之处。尽管对于每个这样的项目,可以遵循一组预定义的步骤。没有那么严格的流程可循,但是可以提出一个通用的模板。

1.准备问题

不仅仅是 ML,任何项目的第一步都是简单地定义手头的问题。你首先需要了解情况和需要解决的问题。然后设计机器学习如何有效地解决这个问题。一旦你很好地了解了问题,你就可以着手解决它。

加载库

在本文中,我将坚持使用 Python (原因很明显)。第一步是加载或导入获得想要的结果所需的所有库和包。机器学习的一些非常初级且几乎必不可少的包有— NumPy 、 Pandas 、 Matplotlib 和 Scikit-Learn 。

加载数据集

一旦加载了库,就需要加载数据。Pandas 有一个非常简单的函数来执行这个任务— pandas.read_csv 。read.csv 函数不仅限于 csv 文件,还可以读取其他基于文本的文件。其他格式也可以使用熊猫阅读功能来阅读,如 html,json,腌渍文件等。需要记住的一点是,您的数据需要位于与当前工作目录相同的工作目录中,否则您将需要在函数中提供以“/”为前缀的完整路径。

2.汇总数据

好了,数据已经加载完毕,可以开始行动了。但是您首先需要检查数据的外观以及它包含的所有内容。首先,您会希望看到数据有多少行和列,以及每一列的数据类型是什么(pandas 认为它们是什么)。

查看数据类型和形状的快速方法是— 熊猫。DataFrame.info 。这会告诉您数据帧有多少行和列,以及它们包含哪些数据类型和值。

描述统计学

描述统计学,顾名思义,是用统计学的术语来描述数据——均值、标准差、分位数等。获得完整描述的最简单方法是通过熊猫。data frame . description。您可以很容易地判断出您的数据是否需要缩放,或者是否需要添加缺失的值,等等。(稍后将详细介绍)。

数据可视化

数据可视化非常重要,因为这是了解数据和模式的最快方法——不管它们是否存在。您的数据可能有数千个要素,甚至更多实例。不可能对所有的数字数据进行分析。如果你这样做了,那么拥有像 MatplotlibSeaborn 这样强大的可视化软件包还有什么意义呢?

使用 Matplotlib、Seaborn 的可视化可用于检查特征内的相关性以及与目标、散点图数据、直方图和箱线图的相关性,用于检查分布和 偏斜度 等等。甚至 pandas 也有自己的内置可视化库——pandas。DataFrame.plot 包含条形图、散点图、直方图等。

Seaborn 本质上是 matplotlib 的一个变形,因为它建立在 matplotlib 的基础上,使绘图更漂亮,绘图过程更快。热图和 pairplot 是 Seaborn 快速绘制整个数据可视化的例子,以检查多重共线性,缺失值等。

一个非常有效的方法是通过Pandas Profiling获得上述大部分描述性和推断性统计数据。概要分析会生成一个漂亮的数据报告,包含上面提到的所有细节,让您可以在一个报告中进行分析。

3.准备数据

一旦你知道你的数据有什么和看起来像什么,你将必须转换它,以便使它适合算法处理和更有效地工作,以便给出更准确和精确的结果。这本质上是数据预处理,是任何 ML 项目中最重要也是最耗时的阶段。

数据清理

现实生活中的数据并没有被很好地安排和呈现在你面前,没有任何异常。数据通常有许多所谓的异常,如缺失值、许多格式不正确的要素、不同比例的要素等。所有这些都需要手动处理,这需要大量的时间和编码技能(主要是 python 和熊猫:D)!

熊猫有各种功能来检查像熊猫这样的异常。DataFrame.isna 检查带有 nan 等的值。您可能还需要转换数据格式,以便消除无用的信息,例如当存在单独的性别特征时,从姓名中删除“先生”和“夫人”。您可能需要使用函数 pandas 在整个数据帧中以标准格式获取它。DataFrame .使用熊猫替换或删除不相关的功能。DataFrame.drop 。

特征选择

特征选择是选择一定数量的最有用的特征用于训练模型的过程。这样做是为了在大多数特征对总体方差的贡献不足时减少维数。如果你的数据中有 300 个特征,97%的差异是由前 120 个特征解释的,那么用这么多无用的特征来敲打你的算法是没有意义的。减少功能不仅可以节省时间,还可以节省成本。

一些流行的特征选择技术有选择测试,特征消除方法如 RFE (递归特征消除)和嵌入方法如拉索克。

特征工程

所有功能可能都不在最佳状态。意思是——它们可以通过使用一组函数转换到不同的尺度上。这是为了增加与目标的相关性,从而增加准确性/得分。其中一些转换与 缩放 相关,如 StandardScaler、Normalizer、MinMaxScaler 等。甚至可以通过对一些特征进行线性/二次组合来增加特征,以提高性能。对数变换、交互和 Box-Cox 变换是数字数据的一些其他有用的变换。

对于分类数据,有必要将类别编码成数字,这样算法就可以理解它。一些最有用的编码技术是——labelencorder、OneHotEncoder 和 Binarizer。

4.评估算法

一旦你的数据准备好了,继续检查各种回归/分类算法的性能(基于问题的类型)。您可以首先创建一个基础模型来设置一个比较基准。

分离验证数据集

一旦模型被训练,它也需要被验证,以查看它是否真的概括了数据或者它是否过度/不足拟合。手头的数据可以预先分成训练集和验证集。这种拆分有多种技术——训练测试拆分、洗牌拆分等。您还可以在整个数据集上运行交叉验证,以获得更可靠的验证。交叉验证、留一法是最常用的方法。

测试选项和评估指标

模型需要基于一组需要定义的评估指标进行评估。对于回归算法,一些常见的指标是 MSE 和 R 平方。

与分类相关的评估指标更加多样化——混淆矩阵、F1 得分、AUC/ROC 曲线等。对每种算法的这些分数进行比较,以检查哪种算法比其他算法执行得更好。

抽查算法

一旦数据被分割并且评估指标被定义,您需要运行一组算法,比如说,在一个 for 循环中检查哪一个执行得最好。这是一个反复试验的过程,目的是找到一个能很好地解决你的问题的算法列表,这样你就可以加倍努力,进一步优化它们。

可以制作 流水线 ,并且可以设置线性和非线性算法的混合来检查性能。

比较算法

一旦您现场运行了测试线束,您可以很容易地看到哪些线束对您的数据表现最佳。持续给出高分的算法应该是你的目标。然后,您可以选择最优秀的,并进一步调整它们,以提高它们的性能。**

5.提高准确性

有了性能最好的算法后,可以调整它们的参数和超参数,以获得最佳结果。多个算法也可以链接在一起。

算法调整

维基百科声明“超参数调优就是为一个学习算法选择一组最优的超参数”。超参数是未学习的参数,必须在运行算法之前设置。超参数的一些例子包括逻辑回归中的惩罚、随机梯度下降中的损失和 SVM 的核。

这些参数可以在数组中传递,算法可以递归运行,直到找到完美的超参数。这可以通过像网格搜索和随机搜索这样的方法来实现。

合奏

可以将多种机器学习算法结合起来,以建立一个比单一算法更稳健、更优化的模型,从而提供更好的预测。这被称为合奏。

基本上有两种类型的集成— Bagging(自举聚合)和 Boosting 。例如,随机森林是一种 Bagging ensemble,它结合了多个决策树,并对总输出进行汇总。

另一方面,Boosting 通过以一种自适应的方式学习来组合一组弱学习者:集合中的每个模型都被拟合,从而给予数据集中与序列中的先前模型有较大误差的实例更大的重要性。XGBoost、AdaBoost、CatBoost 就是一些例子。

6.最终确定模型

验证数据集的预测

当您获得了具有最佳超参数和集成的最佳性能模型时,您可以在看不见的测试数据集上验证它。

在整个训练数据集上创建独立模型

验证后,对整个数据集运行一次模型,以确保在训练/测试时没有数据点丢失。现在,你的模型处于最佳位置。

保存模型以备后用

一旦您有了准确的模型,您仍然需要保存并加载它,以便在将来需要时可以使用它。最常见的方法是腌制。

这就是本文的全部内容。当然,这并不是机器学习的全部。但是这可以作为一个很好的路线图来遵循。定制,重复的过程将需要为不同类型的数据/问题。如果你知道更好更关键的技术,请在下面评论你的想法或突出显示。

估计收入增长的贝叶斯方法

原文:https://towardsdatascience.com/a-bayesian-approach-to-estimating-revenue-growth-55d029efe2dd?source=collection_archive---------19-----------------------

使用正态-正态模型的一个实例

图片由来自 Pixabay 的洛伦佐·卡法罗提供

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

也许你是一个投资者,正试图决定一只股票是否值得投资。也许你最近才听说贝叶斯推理,并想了解它在现实世界中的应用。也许您是一位经验丰富的分析师,偶然发现了这篇文章,并觉得标题很有趣。不管你来自哪里,我感谢你阅读这篇文章。我将谈论正态-正态模型,贝叶斯统计中的基础模型之一,以及如何使用它来估计公司收入的增长率。这个评估可以用来决定公司是否值得投资。

这篇文章的第一个目的是展示如何使用正态-正态模型将主观叠加纳入数据分析。第二个是提供一些正态-正态模型和贝叶斯推理背后的直觉,而不会陷入太多的机制中。我会在这里和文末反复说,但这一块不构成投资建议。这是有教育意义的。本文中表达的所有信息和选项均以作者的个人身份发布,独立于作者可能与 RobustWealth,Inc .达成的任何雇佣协议。

有了这个免责声明,让我们开始吧!

手头的任务

财务建模通常是指预测一家公司的基本价值,以得出该公司股票的合理价格估计。一些最常用的评估指标是收入、收益和现金流。我们要考察的公司是 MongoDB,一家软件服务公司。它于 2017 年开始公开交易,收入增长巨大。

在 RStudio 中创建;所有的图和表都是在 RStudio 中创建的

考虑到这家公司还很年轻,而且正处于成长阶段,为了给公司估值,关注收入是合理的。该公司 10-K 文件中的数据,即年度财务报告,显示了从 2016 财年开始的季度收入数据。年度数据从 2014 年开始。为了使用比六个年度数字(转化为五个增长数字)多一点的数据,我计算了季度基础上一年的滚动收入增长。该数据如下所示。

在这篇文章的最后,我将比较使用年终数据和季度数据的分析结果。(虽然我没有进行正式的分析,但我认为季度数据中存在一定程度的序列相关性。这对于解释正态-正态模型的概念来说无关紧要,但在实践中肯定是需要注意的。)

预测公司收入的一种常用方法是使用一定时间内的平均历史收入增长率。对于拥有多年数据的公司来说,这不一定是个坏习惯,尤其是如果增长率遵循正态分布的话。鉴于样本数据如此之少,以及我将在下面绘制的数据直方图,在这种情况下,使用样本均值可能是不明智的。

贝叶斯推理在样本量很小的情况下特别有用,在这种情况下,人们会主观地认为样本数据不能恰当地代表更大样本的情况。

为了进行贝叶斯推理,需要一个先验分布和一个抽样模型。在定义这些分布之前,我将回顾一下贝叶斯推理的一些基础知识,以及先验分布和抽样模型是如何发挥作用的。如果你熟悉贝叶斯定理及其在分布中的应用,可以跳过这一部分。

贝叶斯定理和分布

最简单的形式,贝叶斯定理被定义为

这相当于

如果给一个人明确定义的概率来使用,这一切都很好,但是分布使这个过程有点复杂。

首先,我用 θ 代替 A ,用 Y 代替 B 。在这种情况下, Y 指的是样本数据中的点,而 θ 指的是 MongoDB 收入的真实平均增长率。用上述替换重写公式的第二种形式导致

换句话说,我试图建模的分布是给定样本增长率的平均收入增长率的分布。我将用样本数据和一点点判断来定义这个分布 P ( Y | θ )。我还需要平均增长率的先验分布 P ( θ )和数据的边际分布 P ( Y )。分析员有责任定义抽样分布以及定义 θ 的先验分布。一旦有了采样分布P(Y|θ,获得 P ( Y )的正确方法就是求解下面的积分:

在实践中,这可能很难做到,但有一个捷径。由于在这种情况下 Y 仅取决于 θ ,因此 P ( Y )是一个无条件的概率分布,包含了 Y 的所有可能性。这意味着分布下的面积将等于 1(一个事件的所有概率之和等于 1),积分将等于 1 乘以一个归一化常数。该等式可以更简单地表示为,而不是求解该归一化常数

P(θ|Y)∧P(Y|θ)P(θ)

其中∝代表“与...成比例”换句话说,一个人不需要担心 P ( Y )。完成一项任务后,下一步是定义一个抽样分布和一个先验分布。

(注:技术上, Y 是以样本方差为条件的。在这种情况下,方差被假定为已知的常数。因为方差被假定为已知的常数,所以它可以从符号中省略。)

定义抽样模型和先验分布

我将用一个正态模型来描述抽样分布。查看了数据的直方图后,人们可能会认为有更好的分布来表示数据。在这种情况下,我喜欢正态分布,因为它是连续的,并且沿着所有实数都有支持(收入增长理论上可能是负的或正的)。

为了定义这个采样模型,我将计算这个数据集的均值和方差,并将它们用作采样模型的参数。这将采取的形式是

其中第一项代表 MongoDB 收入的未知真实平均增长率,第二项代表增长率的方差;假设这个方差是已知的。人们可以很容易地假设均值是已知的,而方差是未知的,或者两者都是未知的;所有这三类情况都有很好的记录,并有大量关于如何处理它们的文献。正态-正态模型适用于方差已知而均值未知的情况,因此我做出了目前的假设。

接下来,必须定义θ的先验分布。出于同样的原因,我使用正态分布的采样模型(连续,支持正值和负值),我将使用正态分布作为我的先验。必须为变量θ定义均值和方差。我将这个分布定义为

其中第一项是先验均值,第二项是先验方差。有大量的文献致力于选择先验;这篇文章的主要焦点是如何应用正态-正态模型,所以我没有花大力气定义我的先验分布。

为了选择一个先验均值的值,我查看了过去 19 年(multpl.com)标准普尔 500 指数的平均销售收入增长率,然后乘以 MongoDB 的β。在股票领域,β指的是单个股票回报与更广泛的一篮子股票(通常称为指数)回报的协方差除以指数回报的方差。根据 Seeking Alpha 的数据,MongoDB 的β值约为 1.26,Seeking Alpha 是一个研究网站,提供许多股票的新闻、数据和分析。每当观察到β > 1 时,人们可以假设股票比与之比较的指数更不稳定;为此,我将指数的收入增长乘以β。其他方法可能包括关注软件服务行业中稍微老一点的公司,或者其他行业中年龄相近的公司。没有一种方法是完美的,所有可行的方法都有各自的优点。

下一个必须赋值的参数是先验方差。需要明确的是,这不是增长率的假设方差,而是平均增长率的假设方差;这个先验方差是为了反映先验均值的准确性的确定性。如果完全相信这是使用的正确平均值,方差可以设置为非常接近于 0(出于计算目的,实际上不能使用 0,但一个非常小的数如. 00001 就足够了)。另一方面,如果一个人对估计值没有多少信心,可以用一个很大的方差来表示这个确定性水平。在这种情况下,先验平均值约为 4.5%,我不知道自己对这一估计有多大把握。为了定义我的分布,我将使用 10%的标准差。这样,我可以有效地声明,我 95%相信θ的真实值在-15.5%和 24.5%之间(4.5+/-2 个标准偏差)。鉴于 MongoDB 的平均增长率约为 61%,这一估计可能显得非常保守,但这正是贝叶斯推理强大的原因。MongoDB 大部分时间都在牛市中交易,这对软件公司尤其有利。先验分布反映了来自多个市场周期的数据,从而反映了增长和收缩的多个阶段。在经济收缩的可能性、MongoDB 不能有效地执行其战略的可能性以及仅仅由于规模而导致的收入增长放缓之间,我持有一种主观信念,即 MongoDB 的真实平均增长率低于样本数据所显示的水平。我选择的先验分布代表了这种信念。现在,我可以研究分析的输出。

概括地说,这两个模型的表格如下:

太好了,我们继续分析吧!

后验分析和直觉

我将更多地关注这些形式提供的直觉,而不是手动完成推导。任何真正对使用正态-正态模型感兴趣的人都应该研究上述参数的推导。维基百科有一些很好的文档,大多数贝叶斯统计的入门教材都详细介绍了推导过程。

当正态分布与样本均值上的先验分布的正态结合用于抽样模型时,得到的后验分布是两个正态模型的乘积。正态-正态模型的强大之处在于,这些分布的乘积也是正态分布,尽管有更新的参数。在贝叶斯术语中,正态先验分布是共轭先验分布,这意味着它和它产生的后验分布具有相同的形式。后验分布是正态分布这一事实可能看起来没什么大不了的,但根据要建模的数据和要估计的参数,有许多情况下后验分布并不具有如此熟悉的形式。因为这种后验分布是明确定义的,所以可以直接从中取样,从而很容易计算出它的汇总统计量。

下面的符号和重新参数化来自 Peter Hoff 的教科书“贝叶斯统计的第一课”中的第 5 章,这本书是我在第一次本科贝叶斯统计课程中使用的,也是我最近一直在学习的书。

后验分布采用以下形式

其中第一项指的是后验均值,第二项指的是后验方差。计算这些更新参数的公式如下

这些公式可能看起来有点吓人,但希望你能看到它们之间的一些相似之处。对于获得对这些公式的直觉来说,一个常见的并且特别有用的实践是从精度而不是方差的角度来看公式。精度是方差的倒数。

在这种情况下,我们需要观察三个相关的精度:

如果将后验方差公式倒过来计算后验精度,可以看到后验精度用标准差表示为

这可以精确地写成

在这种形式中,显然后验精度是先验精度和样本精度之和乘以样本大小。后验均值也可以根据精度重写:

这里,很明显,后验均值是先验均值和样本均值的加权平均值。

对于数据,后验参数为:

这就是最新的参数。平均增长率的后验估计值约为 52.7% —比样本平均值略低,但并不低得离谱。我采用了一种主观信念,用一种分布来表示这种信念,并用这种分布来增强分析。万岁!这就是贝叶斯推理的力量。只要信念可以被定义,它们就可以以一种严格的方式被纳入分析中。让我们多谈一点我拥有的和我没有的。

有了后验标准差,我就可以计算出估计值的可信区间。对于那些不熟悉贝叶斯统计的人来说,可信区间和置信区间不是一回事,尽管它们是以相似的方式计算的。后验均值的 95%可信区间为 0.527+/2∫0.0391.527+/2∫0.0391,得出 44.88%和 60.52%的点。有了这个可信的区间,我可以断言,我 95%确定后验均值的真实值落在这个区间内。即使在这一点上,我也不把这个更新的平均值当作一个已知的实体。此外,我并不是说 52.7%是我对未来一年滚动收入增长率的预测。如果我想在这个框架内进行预测,我会使用后验预测分布。因为那是一个单独的主题,所以我在这里不涉及它,但是推导那个分布的过程类似于推导后验分布。

从这个分析中应该注意到两个关键的含义:第一个是随着样本量的增加,后验均值和后验方差越来越多地由样本数据决定。我不会说有一个明确的截止点,但在一定数量的数据中,增加一个先验并不会使指针移动太多。直觉上,这是合理的。如果您有足够丰富的采样数据,采样数据可能代表数据中的实际结构,您可能看不到利用先验分布的必要性。

为了强调第一点,我严格使用年终数据重新运行了分析,这将提供五个数据点的样本大小。使用相同的先验分布,新的抽样均值和方差约为 59.8%和. 012(或 11.1%标准差),后验均值和方差约为 23%和. 0019(或 4.45%标准差)。均值的后验估计值比第一次迭代中观察到的值低得多;随着样本量的显著减少,先验在输出中扮演着更重要的角色。标准差变化不大,但我可以看到它变大了,尽管第二次采样的标准差变小了。我的估计要低得多,对估计的信心也略低(可信区间更宽)。

该分析的第二个含义是,先验方差越小,先验精度越高,对后验均值和后验方差的影响越大。一个人对先验越有信心,对后验估计的影响就越大。为了说明这一点,我用先前方差的不同值重新运行了原始分析。先前均值的值都是 0.045,抽样均值和方差来自滚动收入数据。下表显示了该实验的结果。

我也会画出分布图。

注意先验方差设为 0.05 的后验分布与先验均值的接近程度。随着我增加先验方差(有效地表示先验均值的置信度降低),后验分布的中心向样本均值移动。此外,虽然后验方差的变化幅度在表中可能没有那么大,但从上面的分布图中,我们可以看到分布是如何逐渐变宽的;换句话说,平均增长真实值的可信区间扩大了。

摘要

简单回顾一下,我分析了一家年轻的公司,并想估计其收入的真实增长率。考虑到我拥有的少量样本数据和平均增长率将低于样本数据所显示的主观信念,我使用贝叶斯推理来增强分析。我为数据定义了一个抽样模型,为反映主观观点的平均增长率定义了一个先验,并利用正态-正态模型得出公司平均增长率的后验估计和区间。我希望这篇贝叶斯推理的简介以及对结果的分析对你有所帮助。我不建议使用这篇文章中的具体数字来对 MongoDB 进行任何评估,但是希望您可以将这些概念应用到自己的分析中。我附加了一个到 GitHub 代码库的链接;没有什么特别复杂的,但我会本着透明和可复制的精神来分享。

https://github.com/vinai-oddiraju/TDS_Blog_Post1.git

最后,我要感谢那些花时间阅读我的草稿并在整个过程中提供反馈的朋友和家人。由于这是我第一次以这种方式写一个项目,他们的支持尤其值得感谢。谢谢,保重!

放弃

本报告中表达的想法和观点仅代表我个人,不一定代表我公司的观点。本报告旨在提供教育,不应被理解为个人投资建议,也不应被理解为购买、出售或持有任何证券或采取任何投资策略的建议。

来源

[1]霍夫,彼得 D. 贝叶斯统计方法的第一课 (2007)。打印。

R/Python 中线性混合模型(LMM)的贝叶斯方法

原文:https://towardsdatascience.com/a-bayesian-approach-to-linear-mixed-models-lmm-in-r-python-b2f1378c3ac8?source=collection_archive---------6-----------------------

视频教程

实现这些比你想象的要简单

似乎有一种普遍的误解,认为贝叶斯方法比 T4 的方法更难实现。有时这是真的,但是更多的时候现有的 R 和 Python 库可以帮助简化这个过程。

更简单的实现≠扔进一些数据,看看有什么坚持。(我们已经有了这方面的机器学习。😛)

人们让贝叶斯方法听起来比实际更复杂,主要是因为其中涉及了很多术语(例如弱先验、后验预测分布、等)。)这并不直观,除非您以前使用过这些方法。

意识形态的冲突加剧了这种误解——“频繁主义者与贝叶斯主义者之争。”(如果你以前不知道,现在你知道了。)问题是人们,尤其是统计学家,通常会争论哪种方法更有效,而事实上答案是“视情况而定”

证据一:这是一个温和的例子,说明为什么这场争吵毫无意义https://twitter.com/RevBayes/status/506577193804111872

贝叶斯方法,像其他任何方法一样,只是我们使用的工具。它们有优点也有缺点。

因此,随着一些个人的“热点”的方式,让我们继续有趣的东西,并实现一些贝叶斯线性混合(LMM)模型!

一眼

以下是我将要介绍的内容(包括 R 和 Python):

  1. 选择先验的实用方法(需要定义贝叶斯模型
  2. 如何使用 R 和 Python 实现贝叶斯 LMM 的分步指南(分别使用brmspymc3)
  3. 快速 MCMC 诊断有助于您在流程早期发现潜在问题

贝叶斯模型检查、比较和评估方法不在本文讨论范围内。(评价一个模特的方式比 RMSE 多。)我已经发表了一篇 的后续文章,更详细地介绍了这些

Python 教程

r 教程

设置

如果你对混动车型不熟悉我推荐你先 复习一下这里覆盖的一些基础 。同样,如果你对贝叶斯推论不是很熟悉的话我推荐 艾林金*的惊人文章 向前看。*

让我们回到我在上一篇文章中提到的营销例子。简而言之,我们的数据集由模拟的网站反弹时间(即客户在网站上花费的时间长度)组成,而的总体目标是找出年轻人在网站上花费的时间是否比老年人多。

该数据集有 613 个观察到的“反弹时间”(bounce_time,秒),这些时间是在 8 个位置(county)收集的,每个位置都有一个关联的age,该关联的【】后来被中心缩放(std_age)。但是,每个位置的观测值数量各不相同(例如,一个位置有 150 个观测值,而另一个位置只有 7 个)。

步骤 1:探索性数据分析(EDA)

EDA 是数据分析的无名英雄,你不应该认为它只是绘制数据。

(我会远离那些暗示它是“无聊的东西”的帖子,或者那些只是希望自动化它以便你可以直接进入建模的帖子,即使你使用的是 ML 算法。如果你这样做,你就错过了一个非常强大的工具。)就个人而言,我认为这是你的分析工作流程中最关键的步骤之一。它可以作为一个迭代工具来帮助你调整你的建模策略,特别是当你的策略是从简单的开始,逐步建立更复杂的模型时。

EDA 不仅仅是绘制数据,它还是一种迭代工具,可以帮助您调整建模策略。

例如,在我们的例子中,我们可以拟合的最简单的模型是使用sklearn (Python)或lm (R)的基本线性回归,并看看它如何捕捉我们数据中的可变性。

我们也可以考虑更复杂的模型,比如线性混合效应模型。同样,通过一些 EDA,我们看到这种模型可以更好地捕捉群体可变性,因此可能是更好的策略。我们可以使用seaborn.lmplot或 ggplot2 的geom_smooth快速构建一些直观的 EDA 图。这里看起来变截距和变截距/变斜率模型可能是很好的研究对象。*(我们的 EDA 还揭示了一个辛普森悖论的例子,其中一条全局回归线与单个县的趋势不匹配。)*

我们将继续进行三个候选模型:线性回归、随机截距模型和随机截距+斜率模型。
(简单的线性模型被视为基线,有助于举例说明建模过程。)

步骤 2:在一些虚假数据的帮助下选择先验

注意:在这一点上,我假设你熟悉贝叶斯推理,不会深入到它的主要组成部分。如果你不是,停下来,去看看上面推荐的阅读材料。

贝叶斯推理要求我们在完全定义我们的模型之前为我们的参数选择先验分布(“先验”)。与其使用先验信息,还不如选择先验信息。**************

但是你如何定义什么是“弱”先验呢?

好的弱信息先验考虑了你的数据和被问到的问题,以生成可信的数据集。

定义弱信息先验的一个常用策略是根据你的可能性和先验组合创建一个模拟数据的“活页本”。(该程序被称为预先预测检查。)不要将先验视为独立的(边缘)实体,用它们模拟数据可以让我们了解它们如何与可能性相互作用,以及这对先验是否会生成似是而非的数据点。

我们的变截距模型和先验的概率定义

例如,让我们尝试为我们的随机截距模型参数* (β0、β1、B0、τ0 和σ)选择弱先验,并模拟一些数据。*

我通过一种迭代策略选择了上述先验,这种策略将 EDA 步骤中关于人口和群体趋势的信息与特定群体的经验均值和方差估计相结合(见下文)。你必须根据你自己的数据和正在考虑的问题来探索一些选择。

R 模拟

Python 模拟

定义弱信息先验的常用策略是创建模拟数据的“翻页书”(也称为先验预测检查)。

下面是一本电子书的例子( 左动画 )。我们看到大多数模拟数据点都是“合理的”,这意味着我们看到大多数假数据点都在我们当前的反弹率范围内(≈160–250)。其他数据超出了我们的数据范围,但仍在可信范围内(例如,高达 500–600 秒)。相反,如果我们使用**通用弱先验**[例如 N(0,100)和 Inv-Gamma(1,100)],我们会看到许多模拟的反弹率< 100 秒。甚至是< 0,这显然是概率较小的( )。

**

如果你有兴趣了解更多关于如何选择优先的信息,请查看 Stan 开发团队的资源页面。

步骤 3:拟合贝叶斯模型

在前面的步骤中已经选择了一些合理的弱先验,我们现在可以专注于从步骤 1 构建我们的候选模型。正如我在本文开头提到的,R 和 Python 中有现有的库可以大大简化拟合贝叶斯线性混合模型。

1) [**brms**](https://paul-buerkner.github.io/brms/index.html)**: an** 运行在 Stan 上的 R 包

如果你熟悉lme4lmer函数的公式生成器,那么你已经成功了 90%。是的,就这么简单!除了一些指定贝叶斯设置的附加选项,brms提供了简单明了的功能。如果你深入了解它的所有功能——拟合 gam,模拟高斯过程,甚至通过mice输入数据,这是一个出色的库。我不会在这里讨论这些,但是我鼓励你多读一些。

下面是使用我们的反弹时间数据,用brms实现变截距模型的例子。首先,该软件包通过内置函数prior使定义先验变得容易,该函数将分布分配给选定的模型参数类、组或系数(prior(distribution(...), class=..., group=..., coef=...))。例如,我们可以将截距的法线先验设置为prior(normal(...), class=Intercept)。您可以使用内置函数get_prior()来了解如何设置这些标志。类似地,您可以从广泛的可用分布中选择先验。

接下来,您可以用brm函数拟合模型,该函数提供了与lmer类似的公式生成器和选项。你可以进一步修改贝叶斯方法特有的选项比如要运行的 MCMC 链的数量和运行长度。

从模型中提取基本信息很简单。该库提供打印与模型拟合summary()和后验估计posterior_summary()相关的模型概要的功能。

注:使用bounce_time ~ 1 + std_age公式时,BRMS 假设预测值为均值居中*。如果你的预测不是以均值为中心,你应该使用bounce_time ~ 0 + intercept + std_age来代替。你可以在这里(第 38-39 页)阅读更多内容*

2)运行在和上的 PyMC3 : a Python library

尽管有多种库适合贝叶斯模型,但 PyMC3 无疑提供了 Python 中最用户友好的语法。虽然新版本正在开发中(PyMC4 现在运行在 Tensorflow 上),但这个库中的大多数功能将在未来的版本中继续工作。

与 R 中的 **brms** 包相比,P **yMC3** 要求你显式地陈述模型的每个单独的组件——从先验到似然。

完整的规范并不像听起来那么糟糕。一旦您指定了模型(如左图所示),使用上下文管理器来构建就变得简单了。

嗯,大部分时间😉。

对这个包唯一的警告是你的模型的参数化会对它的采样效率有很大的影响。

例如,下面的模型代码使用了与上面所示模型略有不同的参数化(即居中参数化)。

首先,我们用上下文管理器和pm.Model()方法初始化模型。这将基本上封装一个模型的变量和可能性因素。接下来,我们可以开始使用多种内置分布为我们的每个组件(先验、超先验和似然)分配分布。

建立模型分布很简单。首先通过pm.your_distribution_class()定义你想要使用的分布类,然后给它分配一个标签并修改它的分布参数,最后把它分配给一个上下文变量* (例如beta1=pm.Normal('std_age', mu=mu0, sigma=tau0)用标签std_age和参数mu0tau0beta1定义为普通的)。*

一旦你的模型组件被设置好,你只需要设置pm.trace()函数来存储你的后验样本。与brms类似,您还可以进一步修改贝叶斯方法的特定选项,例如要运行的 MCMC 链的数量和运行长度。

由于 PyMC3 依赖于arviz进行事后可视化,因此有必要将模型输出保存为InferenceData类型,以便以后在模型诊断和事后检查中使用。

上述随机截距模型的输出;alpha 表示特定于县的拦截

步骤 3.a: MCMC 诊断

唷!这是很多信息。然而,没有一些好的诊断,任何建模努力都是不完整的。(注意:模型检查、评估和比较也是这个过程的一部分,但是我会在另一篇文章中更详细地介绍它们。)

传统上,两种诊断可视化方法——MCMC 迹线图和自相关函数(ACF)图——有助于我们了解采样是否存在问题。换句话说,我们的样本以及我们的推论有多可靠?这些工具诉诸于马尔可夫链的一些理论属性,并且是理解马尔可夫链性能的良好的检查。然而,brmspymc3使用先进的 MCMC 方法,这些方法提供了额外的诊断,可以更精确地了解它们的性能。

除了常规诊断之外,其他方法也可用于高级技术,如哈密尔顿蒙特卡罗 (HMC),可以提供更详细的马尔可夫链性能图。

让我们深入了解一个实施传统和 HMC 相关诊断的示例。

传统 MCMC 诊断

上面强调的两个常见的可视化帮助我们理解

  1. 马尔可夫链具有良好的混合(即似乎已经收敛到稳态分布)
  2. 样本不违反马尔可夫特性(例如自相关在滞后 1 之后消失)

在 R 中,您可以使用适合您的模型使用bayesplot中的mcmc_tracemcmc_acf功能轻松生成这些。

线性回归示例

R 中线性回归模型的跟踪图(左)和自相关图(右)

Python pymc3中的有一个内置的集成,通过arviz来可视化这些,你只需要模型中指定的 trace 对象。****

Python 中线性回归模型的追踪图(左)和自相关图(右)

哈密尔顿蒙特卡罗诊断

如上所述,哈密顿蒙特卡罗提供了我们可以使用的额外诊断。pymc3brms都运行在一个叫做不掉头采样的非常高效的 HMC 采样器上。

这里粗一句话,高级总结:

HMC 使用一阶梯度来指导有用方向上的采样,这有助于它比传统的 MCMC 方法更快地收敛到后验,并且 NUTS 动态更新可以影响 HMC 性能的参数(即,步长ε和步数 L)。

坚果,对不对?!(希望大家能原谅不好的双关语)。为了澄清最后一点,考虑一下在类似梯度的更新方面发生了什么,例如,如果你选择的步长太小或步长数太高,你可能会浪费计算时间。虽然这是一个有用的类比,但该算法如何工作的细节更加复杂和优雅。

回到“那又怎样,伙计?”嗯,在链没有混合或者 ACF 显示出对样本的更高依赖性的情况下,很难诊断发生了什么。

然而,如果你使用 HMC 或坚果,你可以看看*发散过渡,这可以帮助你了解你的后臀的几何形状(!!)。当建议的下一步偏离采样器设定的最有效路径时,就会出现这些问题。***

发散是强有力的诊断,它允许你理解后几何。

想象这些可以在两个方面有所帮助:****

  1. ****检测您的采样器在穿越后部“景观”时遇到困难的“位置”(可能是由于局部高度可变性或弯曲的几何形状)。在这种情况下,您可以考虑重新参数化您的模型,以“平滑”那些高曲率区域。
  2. ****排除“假阳性”偏差(标记的偏差转换与非偏差转换表现相同)

下面的例子说明了发散如何帮助识别链被“卡住”或被错误标记为发散 (绿色) 。在左图和右图中,绿色点或线高度集中的区域表明存在收敛问题(即,您可以在下面的tau中看到这种漏斗状集中)。在这里,采样器不能充分探索由tau定义的后部区域,因此我们对tau的推断是不可靠的。相反,在轨迹被错误地标记为发散但表现得像非发散轨迹的情况下,我们也可以获得其他参数推断的置信度(例如theta1,...,theta8)。

Gabry,Jonah 等人(2019 年)

要了解更多关于解释这些强有力的诊断图的信息,请查看迈克尔·贝当古的这篇文章。要在 R 中运行该诊断,使用bayesplot中的 **mcmc_scatter** 功能

Python 中你可以使用plot_parallel PyMC3 内置函数。

在这种情况下,我们可以看到没有任何像上面看到的发散轨迹,因此我们的链毫无困难地探索了后面的几何形状(即收敛)。

**********

Python(左)和 R(右)中的不同诊断

结论

pymc3brms这样的软件包极大地简化了贝叶斯模型的拟合。然而,实现更简单并不意味着我们应该忘记建模过程中的关键步骤,这些步骤可以帮助我们构建更好的模型。

我希望你已经学会了一些选择好的先验分布的新方法,如何对贝叶斯混合模型进行故障诊断,以及为什么 EDA 可以是一个强大的工具(不仅仅是在贝叶斯设置中)。

最后,我的希望是让人们不要因为“它们听起来很难”而回避贝叶斯方法,而是为他们提供可以添加到他们的工具集中的新方法。

参考

  1. Gelman,a .,Carlin,J. B .,Stern,H. S .,Dunson,D. B .,Vehtari,a .,和 Rubin,D. B. (2013 年)。贝叶斯数据分析。CRC 出版社。
  2. 盖布里、乔纳等人,《贝叶斯工作流程中的可视化》英国皇家统计学会杂志:A 辑(社会中的统计学)182.2(2019):389–402。

如果你喜欢这篇文章,请随意分享!如果您有任何问题,或者您看到任何不正确/有问题的内容,请发表评论或发推文( @ecoronado92 )。

所有的 R 代码都可以在这里找到

所有的 Python 代码都可以在这里找到

***** [## ecoronado 92/走向 _ 数据 _ 科学

报告包含的材料和例子实施贝叶斯线性混合效应(层次模型)模拟…

github.com](https://github.com/ecoronado92/towards_data_science/tree/master/hierarchical_models/bayes_lmm) [## 当混合效应(分层)模型失败时:汇集和不确定性

一个直观和可视化的指南,其中部分池变得麻烦,贝叶斯方法可以帮助量化…

towardsdatascience.com](/when-mixed-effects-hierarchical-models-fail-pooling-and-uncertainty-77e667823ae8) [## 在 R/Python 中评估贝叶斯混合模型

了解“后验预测检查”的含义以及如何直观地评估模型性能

towardsdatascience.com](/evaluating-bayesian-mixed-models-in-r-python-27d344a03016)*****

对神经网络如何工作的初学者友好的解释

原文:https://towardsdatascience.com/a-beginner-friendly-explanation-of-how-neural-networks-work-55064db60df4?source=collection_archive---------6-----------------------

五岁儿童理解神经网络基础知识

图片由皮克斯拜的艾哈迈德·加德拍摄

目录

  1. 前言
  2. 人工智能、机器学习和神经网络
  3. 基本神经网络的机制
  4. 神经网络的类型
  5. 神经网络应用

前言

几周前,当我开始学习神经网络时,我发现对于这样一个复杂的主题来说,介绍性信息的质量是不存在的。我经常读到神经网络是模仿大脑的算法,或者具有类似于大脑的结构,这并没有真正帮助我。因此,本文旨在以任何人都可以理解的方式教授神经网络的基础知识,尤其是那些机器学习的新手。

人工智能、机器学习和神经网络

在了解什么是神经网络之前,我们需要先退几步,了解什么是人工智能和机器学习。

人工智能和机器学习

同样,这令人沮丧,因为当你谷歌人工智能的意思时,你会得到类似“它是机器对人类智能的模拟”的定义,尽管这可能是真的,但它可能会对新学习者产生误导。

从最简单的意义上来说,人工智能(AI) 指的是赋予机器或软件基于预定义的规则或模式识别模型做出自己决定的能力的想法。模式识别模型的想法导致了机器学习模型,这是一种基于样本数据建立模型的算法,可以对新数据进行预测。注意,机器学习是人工智能的一个子集。

有许多机器学习模型,如线性回归、支持向量机、随机森林,当然还有神经网络。这让我们回到了最初的问题,什么是神经网络?

神经网络

从根本上来说,神经网络本质上是数学方程的网络。它接受一个或多个输入变量,并通过一个方程式网络,产生一个或多个输出变量。你也可以说一个神经网络接受一个输入向量并返回一个输出向量,但是我不会在本文中讨论矩阵。

基本神经网络的机制

再说一次,我不想太深入地了解其中的机制,但是向您展示一个基本神经网络的结构是什么样子是值得的。

在神经网络中,有一个输入层,一个或多个隐藏层,以及一个输出层。输入层由一个或多个特征变量(或输入变量或独立变量)组成,表示为 x1,x2,…,xn。隐藏层由一个或多个隐藏节点或隐藏单元组成。节点就是上图中的一个圆圈。类似地,输出变量由一个或多个输出单元组成。

给定的层可以有许多节点,如上图所示。

同样,给定的神经网络可以有许多层。通常,更多的节点和更多的层允许神经网络进行更复杂的计算。

上面是一个潜在的神经网络的例子。它有三个输入变量,批量、卧室数量和平均。家庭收入。通过向这个神经网络提供这三条信息,它将返回一个输出,房价。那么它到底是如何做到这一点的呢?

就像我在文章开头说的,神经网络只不过是一个方程网络。神经网络中的每个节点由两个函数组成,一个线性函数和一个激活函数。这是事情变得有点混乱的地方,但是现在,把线性函数想成一些最佳拟合线。另外,把激活功能想象成一个电灯开关,它会产生一个介于 1 或 0 之间的数字。

发生的情况是,输入特征(x)被馈入每个节点的线性函数,产生值 z。然后,值 z 被馈入激活函数,激活函数确定灯开关是否打开(在 0 和 1 之间)。

因此,每个节点最终确定下一层中的哪些节点被激活,直到它到达输出。从概念上讲,这是神经网络的本质。

如果您想了解不同类型的激活函数,神经网络如何确定线性函数的参数,以及它如何像“机器学习”模型一样进行自学,您可以在网上找到专门针对神经网络的完整课程!

神经网络的类型

神经网络发展如此之快,以至于现在有几种类型的神经网络,但下面是你可能经常听说的三种主要类型的神经网络。

人工神经网络

人工神经网络(ann)就像上面图像中的神经网络,它由一组连接的节点组成,这些节点接受一个或一组输入并返回一个输出。这是最基本的神经网络类型,如果你上过课的话,你可能会首先学到。人工神经网络由我们讨论过的所有内容以及传播函数、学习率、成本函数和反向传播组成。

卷积神经网络(CNN)

卷积神经网络(CNN)是一种使用称为卷积的数学运算的神经网络。维基百科将卷积定义为对两个函数进行数学运算,产生第三个函数,表达一个函数的形状如何被另一个函数修改。因此,CNN 在其至少一层中使用卷积而不是一般的矩阵乘法。

递归神经网络(RNN)

递归神经网络(RNNs)是一种人工神经网络,其中节点之间的连接沿着时间序列形成一个有向图,允许它们使用内部存储器来处理可变长度的输入序列。由于这一特性,rnn 在处理序列数据方面表现出色,如文本识别或音频识别。

神经网络应用

神经网络是强大的算法,它带来了一些以前不可能实现的革命性应用,包括但不限于以下内容:

  • 图像和视频识别:由于图像识别功能,我们现在有了像安全面部识别和 Bixby 视觉这样的东西。
  • 推荐系统:有没有想过网飞总是能够推荐你真正喜欢的节目和电影?他们很可能利用神经网络来提供这种体验。
  • 音频识别:如果你没有注意到的话,“OK Google”和 Seri 在理解我们的问题和我们说的话方面已经变得非常好了。这一成功可以归功于神经网络。
  • 自动驾驶:最后,我们在完善自动驾驶方面的进步很大程度上要归功于人工智能和神经网络的进步。

摘要

总结一下,以下是要点:

  • 神经网络是一种机器学习模型或机器学习的子集,机器学习是人工智能的子集。
  • 神经网络是一个方程网络,它接受一个输入(或一组输入)并返回一个输出(或一组输出)
  • 神经网络由各种组件组成,如输入层、隐藏层、输出层和节点。
  • 每个节点由一个线性函数和一个激活函数组成,最终决定了下一层中的哪些节点被激活。
  • 有各种类型的神经网络,如 ann、CNN 和 RNNs

感谢阅读!

特伦斯·申

创始人ShinTwin|我们来连线一下LinkedIn|项目组合这里是

一个初学者友好的数据科学项目列表

原文:https://towardsdatascience.com/a-beginner-friendly-list-of-data-science-projects-74f9da5c8bd1?source=collection_archive---------57-----------------------

通过做开放数据集的项目来学习数据科学

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

数据科学和相关领域是世界上增长最快的就业机会之一。他们使用广泛的方法,包括应用机器学习、人工智能、数据挖掘和数据分析。

在大数据时代,数据工程师变得越来越重要,在数据工程领域有许多不同类型的数据科学家。他们可以被视为一种“数据架构师”,负责数据管理、产品管理和数据可视化。数据科学家在大数据应用程序中使用的数据通常来自多个来源,并以优化分析、商业智能和建模的方式进行提取、存储、转换、集成、移动、提取和集成

数据挖掘将算法应用于复杂的数据集,以发现模式,然后用于从数据集中提取有用和相关的数据。数据科学由多个学科的工具组成,用于收集和提取有意义的数据,并为决策目的解释数据集。

统计测量和预测分析用于提取数据,以根据数据显示的情况和过去发生的情况评估未来事件是否可能发生。

数据科学生命周期的自动化使有经验的数据科学家能够专注于该领域更有趣和创新的方面。数据科学在不断发展,编程经验(模型、机器学习和自动化)的结合使行业保持敏捷和创新。

如今,成功的数据专家明白,他们不仅需要提高分析数据的能力,还需要提高分析数据模型、数据结构和数据分析工具的能力

基于项目的学习是学习新事物的最佳方法之一,它促进思想交流和健康合作。你可以在自己家里进行实验来测试假设和想法。更重要的是,第一手经验提供了成为积极参与者的机会,而不仅仅是旁观者。从错误中学习,帮助你从新手变成这方面的专家。

与项目相关的学习促进通过提问和研究开发的批判性思维技能。历史上一些最伟大的思想家是基于项目的学习方法的支持者。

这里是一些初学者友好的数据科学项目列表;

红酒质量

这两个数据集与葡萄牙“Vinho Verde”葡萄酒的红色和白色变种有关。有关更多详细信息,请参考参考文献[Cortez 等人,2009 年]。由于隐私和逻辑问题,只有物理化学(输入)和感官(输出)变量可用(例如,没有关于葡萄类型、葡萄酒品牌、葡萄酒销售价格等的数据。).

这些数据集可以被视为分类或回归任务。等级是有序的,而不是平衡的(例如,普通葡萄酒比优质或劣质葡萄酒多得多)。

项目类型:预测建模|链接到数据集

麦当劳菜单的营养事实

该数据集提供了美国麦当劳菜单上每个菜单项的营养分析,包括早餐、牛肉汉堡、鸡肉和鱼肉三明治、薯条、沙拉、苏打水、咖啡和茶、奶昔和甜点。

项目类型:探索性数据分析|链接到数据集

美国的污染

该数据集处理美国的污染情况。美国的污染情况已由美国环保局详细记录,但下载所有数据并以数据科学家感兴趣的格式对其进行排列是一件很麻烦的事情。因此,我收集了 2000 年至 2016 年每天的四种主要污染物(二氧化氮、二氧化硫、一氧化碳和臭氧)

项目类型:可视化|链接到数据集

世界幸福报告

幸福得分和排名使用了盖洛普世界民意调查的数据。分数是基于对调查中主要生活评价问题的回答。这个问题被称为坎特里尔阶梯(Cantril ladder),要求受访者想象一个阶梯,其中最美好的生活可能是 10 分,最糟糕的生活可能是 0 分,并在这个尺度上对他们目前的生活进行评级。这些分数来自 2013 年至 2016 年的全国代表性样本,并使用盖洛普权重使估计值具有代表性。

项目类型:探索性数据分析|链接到数据集

夏季奥运会奖牌

这个数据集是从 1976 年蒙特利尔到 2008 年北京的所有夏季奥运会奖牌获得者的列表。它包括在此期间颁发的每一枚奖章。这个数据集是为初学者设计的,这样他们可以体验一下高级的 Excel 函数,这可能是成为一名伟大的数据科学家所需的关键技能之一。我也接触过数据集,玩过一些高级的 Excel 函数。此外,该数据集还可以用于预测模型,例如哪个国家可能在特定的运动类别中获得最高数量的金牌(仅仅是一个例子)等。

项目类型:探索性数据分析|链接到数据集

新冠肺炎开放研究数据集挑战(CORD-19)

作为对新冠肺炎疫情的回应,白宫和一个领先的研究团体联盟准备了新冠肺炎开放研究数据集(CORD-19)。CORD-19 是超过 135,000 篇学术文章的资源,包括超过 68,000 篇关于新冠肺炎、新型冠状病毒和相关冠状病毒的全文。

项目类型:探索性数据分析|链接到数据集

数据科学统计学入门指南第一部分

原文:https://towardsdatascience.com/a-beginner-guide-to-statistics-for-data-science-part-i-741f4d92560b?source=collection_archive---------42-----------------------

统计的内容、原因和方式

使用 python 中的 WordCloud 创建, Github 代码

什么是统计学?我们为什么需要统计数据?如何用统计学做数据分析?什么是人口?为什么我们有样本?…….这样的例子不胜枚举。嗯,这些是初学者在第一次尝试进入这个领域时会问的少数几个问题。在这篇文章和接下来的文章中,我将以一种超级简单的方式解释统计学的基本概念。敬请关注!!

什么是统计?

根据维基百科,“ 统计学 是一门关于数据收集、分析、解释和呈现的数学科学。”

这是一门从数据中学习并做出决策的科学。不多不少。

我们为什么需要统计数据?

我们生活在数字时代,在每一点上,我们都在产生数据,即信息。这些信息中的大部分都是通过使用统计学进行数学解释的。例如,如果你在谷歌上搜索一个印度人的平均身高,它会显示 5 英尺。怎么会?你认为他们问过所有 13.3 亿人吗?嗯,这很难要求(考虑到时间、金钱和资源)……那他们怎么会说印度人的平均身高是 5 英尺。这都是因为统计学及其各种解读感兴趣人群的方法。

统计学提供了更好地理解数据的工具。如果使用得当,统计数据可以告诉我们过去发生的任何趋势,并有助于预测未来可能发生的事情。

统计学中首要的事情是理解人口和样本的含义,以及它们之间的区别。

  • 人群:通俗地说,人群包括每个人和你感兴趣的每个人。例如,如果您对某个特定国家(比如印度)的平均体重感兴趣,那么该国的每个人都属于您的人口数据。
  • 样本:随机选取的总体子集。统计的唯一目的是发现关于人口的一些重要的东西,但是考虑到人口的规模,获得整个人口的数据是不切实际的,并且需要大量的资源和时间。所以通常我们会收集一个代表总体的样本。

通常,统计分为两部分:

  1. 描述性统计:描述数据(样本/可见数据)或通过数值计算或图形或表格对数据进行总结的统计部分。举个例子,假设你有一个 100 人的班级在学习物理。现在你可能会对这些学生在期中的整体表现感兴趣。描述统计学允许我们这样做。
    然而,描述性统计不允许得出数据以外的结论(关于人口)。它只是简单地说明你有什么数据。

    通常,有两种类型的统计用于描述数据:

  • 集中趋势的测量:这些是描述数据中心位置的方法,即一个单一的值,它告诉我们数据的中心在哪里。数据的中心位置可以用 表示方式、中值 来描述。
  • 分布度量:这些是通过描述数据在集中趋势上的分散程度来总结数据的方法。例如,我们 100 名学生在测试中的平均分数可能是 80 分。但是,并不是所有的学生都会有 80 分。相反,他们的分数会分散开来。有些会高于 80,有些会更低。分布的度量帮助我们总结数据围绕中心趋势的分散程度。为了描述这种差异,可以使用几种统计数据,包括 方差标准差四分位数** 等。

2。推断统计:它是统计的一部分,根据从总体中抽取的样本得出关于总体参数的结论,如平均值、众数、中位数。因此,样本准确地代表总体是很重要的。它包括抽样和假设检验。例如,你有 100 名学生学习物理的分数数据。你想总结一个城市所有学习物理的学生的分数,推理统计可以帮助你实现这个目标。

平均值

它是所有数据点的平均值。如果有 n 个数据点 x1,x2,x3,…,xn ,那么数据的平均值将为

样本均值公式

(x-bar)代表统计中的样本均值。
上述公式也可以用希腊符号σ(sigma)来表示

样本均值公式

同样,当我们计算大小为 N 的总体的平均值时,它被称为总体平均值,用 μ (mu)表示

人口平均数公式

中间值

它是分隔数据样本的上半部分和下半部分的值。排序时,它是数据的中点。

要计算 n 个数据点的平均值,只需对数据进行排序,找到中间的元素。可能有两种不同的情况:

图片来源:https://www.teachoo.com/

例如:

图片来源:维基百科

与平均值相比,使用中位数描述数据的主要优点是用于偏斜数据(存在异常值的数据,异常值是指与大多数观察值不同的值。这些或者是自然发生的,由于设备故障,或者是由于输入错误。).在数据有偏差的情况下,中位数更准确地描述了数据。

例如,考虑一下美国个人的收入。如果你把比尔·盖茨的收入作为样本中的一个数据点,这个数据是高度倾斜的,因为与美国任何正常人相比,比尔·盖茨的收入都是巨大的,这使得数据高度倾斜。因此,在这种情况下,通过平均值描述您的数据将不是一个近似的选择,因为平均值将主要代表比尔盖茨的工资。因此,收入中值将是代表美国个人收入的更好方式。

模式

它是数据集中最常见的值,即在数据中出现频率更高的值。比如样本[1,3,3,3,3,6,6,6,7,7,7,7,7,12,12,17]的众数是 7。该模式是最容易理解和快速可见的。日常生活中的许多决定都是基于模态概念做出的,比如去大多数人去的地方看电影,或者选择大多数人买的冰淇淋类型。

如果数据包含多个出现频率最高的值,则您有一个多模态分布。如果没有值重复,则数据没有模式。通常,您可以对分类数据、序号数据和离散数据使用该模式。

模式是可用于分类数据(分为不同类别的数据点)的唯一集中趋势测量方法,例如印度最受欢迎的旅游地点。

均值/众数/中位数用哪个?

这完全取决于你有什么类型的数据。如果您的数据是对称的,平均值是描述数据中心的最佳值。如果你的数据是高度倾斜的,使用中位数;如果你的数据是绝对的,使用众数。

差异

它是平均离差的平方。高方差意味着数据高度分散,而小方差意味着数据紧密聚集。总体方差用σ表示,而样本方差用 s 表示。

让我们考虑 n 个元素的样本总体,x1,x2,…,xn。用样本人口的平均值 x̅.数据的样本方差是样本均值和每个数据值之间的平均平方距离。

样本总体方差公式

同样,对于人口方差

人口方差公式

为什么有 n-1 个欠样本方差计算?样本方差始终小于总体方差,因此,自由度被视为转换因子。这就是所谓的 贝塞尔修正

标准偏差

就像方差一样,标准差也是数据点相对于平均值的分布的度量。唯一的区别是它是方差的平方根。这使得它具有与数据相同的单位,从而便于从洞察力中理解解释。总体标准差用σ表示,而样本标准差用 s 表示。

样本标准差公式

与均值相似,标准差也受异常值和偏斜分布的影响很大。

为什么测量标准差而不是方差?

  • 因为标准差与原始 观察值具有相同的单位。
  • 它是高斯(正态)分布中传播的自然量度。

目前就这些。请继续关注下一篇文章,了解其他有用的概念。快乐学习😊。

使用 Web APIs 访问数据的初学者指南(使用 Python)

原文:https://towardsdatascience.com/a-beginners-guide-to-accessing-data-with-web-apis-using-python-23d262181467?source=collection_archive---------28-----------------------

利用 web APIs 的强大功能,为您的数据科学项目挖掘丰富的结构化数据源

照片由安朵斯·瓦斯在 Unsplash

文章大纲

  1. 什么是 API?什么是 web API,它与数据科学有什么关系?
  2. API 请求的剖析
  3. 发掘 Reddit 的秘密——使用 Python 的 Reddit web API 演练
  4. 用开发工具发现隐藏的 API
  5. API 礼仪和最佳实践

什么是 API?

如果你曾经花时间在编程、数据科学或 web 开发上,你可能会遇到“API”这个术语。即使对一个完全外行的人来说,这个术语也可能耳熟能详。无论您是否熟悉这个概念,您每天都要与 API 进行交互,因为它们在最近几年已经变得无处不在,并且为您可能会发现不可或缺的许多平台和服务提供了便利。

根据字面定义,API 是一个应用程序编程接口。它是一种媒介,不同的应用程序可以通过它以编程的方式相互通信。

举个具体的例子,考虑一下登录一个 app 比如 Medium 的过程。你可以选择使用谷歌或脸书登录。在这种情况下,Medium 应用程序通过谷歌或脸书开发的 API 访问你的用户数据。这种 API 被许多应用程序和平台广泛使用,这减少了应用程序创建者的开发时间,并增加了最终用户的易用性。

API 也有助于数据科学家,因为它们是从各种服务和平台访问大量结构化数据的直接途径。例如,TMDB 的 API 允许用户找到关于电影和表演的信息,而的 Spotify API 给你提供关于他们歌曲的深度信息(比如“danceability”和“valence”),你很难通过其他方式找到这些信息。

还有许多其他有趣的事情可以用 API 来做或自动化,这超出了本文的范围。例如,你可以使用 Spotify 的 API 来编程控制你账户上的音乐播放。您甚至可以将多个 API 连接在一起,让它们协同工作。IFTTT.com网站允许你将 API 链接在一起,以创建基于特定条件触发的小程序。例如,当你收到新的 Twitter 通知时,你可以通过组合相应产品的 API,让你的 Phillips Hue 灯泡改变颜色。

API 请求的剖析

为了利用 web APIs,我们必须发出一个“请求”。这种请求将通过 HTTP 协议进行。请求本质上是您和远程服务器之间的通信,其中您传达了您试图实现的目标(例如,获取一些数据或创建一个新的博客帖子)。收到请求后,服务器会处理您的请求,提供响应,并在后端执行任何额外的过程,这些过程通常对最终用户是不透明的。

有各种类型的 HTTP 请求,但是出于本文的目的,我将把重点放在“获取请求”上,因为我们的目的是使用 API 来获取有用的数据。如果您想了解其他类型请求的更多信息,您可以点击这里查看。

通常,请求将包括以下部分:

  • 端点
  • 请求类型
  • 因素
  • 头球
  • 响应,响应代码

从广义上讲,当我们提出请求时,我们必须将它指向某个位置。位置或“端点”将由我们试图做的事情或我们请求的信息决定。当我们发出请求时,我们可以传递一组参数,这些参数增加了请求的特定性,还可以传递一些消息头,这将在后面解释。然后,服务器将(希望)提供一个响应(通常以 JSON 形式)和一个响应代码(表明请求是否成功)。

为了更好地说明这个过程,我将使用 Reddit API 和 Python 做一个简单的练习。

使用 Reddit API

Reddit API 是由 Reddit 官方创建和维护的,它允许你做任何你能在网站上正常做的事情,比如浏览热门帖子、写评论和提交新的提交内容。出于我们今天的目的,我们将使用 API 来确定任何给定子编辑的前 5 篇帖子,以及与每个帖子相关的一些元数据。在使用新工具时总是这样,在开始编程之前浏览一下官方文档会很有帮助。

我们需要确定的第一件事是端点,它从本质上定义了我们到底想要请求什么。在这种情况下,我们想要的端点是 https://www.reddit.com/r/{subreddit_name}/top.json 的“”,因为这将返回属于给定子编辑的顶部帖子。我通过浏览文档找到了这个端点,并选择了一个符合我需要的端点。我们实际上可以在浏览器中查看这个 URL,并看到响应正文如下所示。默认情况下,我们得到的是一大堆相对难以解读的文本。我强烈推荐安装一个 JSON 解析器,比如 JSONViewer for Chrome,它有助于清理 JSON,使它更容易访问。

(JSON 是一种数据存储格式,代表 Javascript 对象表示法,虽然不是 Javascript 的专属。本质上,它是一个包含一系列键值对的长字符串,类似于 Python 字典。当通过 web 传输数据时,JSON 通常是首选的媒介)

JSON 响应的前几行

我们看到的是,在属性“儿童”下,我们得到一个帖子列表。这里的每个帖子都是给定子编辑中排名靠前的帖子之一。在每个帖子的数据中,我们可以找到关于该帖子的更多元数据,例如“gilded ”,这表明该帖子在 Reddit 的说法中是否被授予了“gold”、“title ”,这是该帖子的标题,以及“ups ”,这表明收到的支持票数。

现在,我们希望能够使用 Python 发出这个请求,并打印出我们希望看到的数据。

import requests, jsonpayload = {
    'limit': 5,
    't': 'all'
}headers = {
    'User-agent': 'Reddit bot 1.0'
}#For the purposes of demonstration, I will use the /r/funny subredditendpoint = '[https://www.reddit.com/r/funny/top.json'](https://www.reddit.com/r/funny/top.json')r = requests.get(endpoint, headers = headers, params = payload)
r = json.loads(r.content)

首先,我们要定义请求的参数。您可以考虑像“过滤器”这样的参数,它修改我们请求的范围。要确定端点可以接受哪些参数,请查看 API 的文档,因为它还会指定任何其他约束/格式要求。在我们的例子中,我们将“limit”参数设置为 5,这意味着我们在响应中只会得到 5 个结果。我们还将“t”参数设置为“all”,这意味着我们希望看到所有时间的热门帖子。我们将所有参数打包到一个名为“有效载荷”的字典中。

接下来,我们为请求头定义一个类似的字典。HTTP 头实质上允许您向服务器传递关于您的请求的附加信息。在我们的例子中,我们不会对标题做太多改动,但是你可以通过这个链接阅读更多关于它们的内容。然而,最好定义一个用户代理,它可以是您想要的任何东西。这是为了避免使用 requests 模块的默认用户代理,因为许多其他人可能正在使用同一个代理,因此可能会阻止您,因为它会认为您正在发出过多的请求。

一旦我们有了头和参数,我们就可以向给定的端点发出请求(使用 requests 模块),同时使用适当的关键字参数传递头和参数,并将响应存储在名为“r”的变量中。因为响应是 JSON 格式的,所以我们想把它转换成 python 字典,这样我们就可以更容易地操作数据。我们可以使用内置的 json 模块来解析响应内容。

现在我们只剩下一个包含所有 JSON 响应数据的字典。我们现在可以做的是打印每个帖子的一些元数据

for i, sub in enumerate(r['data']['children']):
    print(f"{i+1}. {sub['data']['title']}. \n \
          was gilded {sub['data']['gilded']} times \n \
          and was upvoted {sub['data']['ups']} times \n")\------------------------------------------------------------------1\. My cab driver tonight was so excited to share with me that he’d made the cover of the calendar. I told him I’d help let the world see. 
           was gilded 7 times 
           and was upvoted 307860 times 

2\. Guardians of the Front Page. 
           was gilded 17 times 
           and was upvoted 283481 times 

3\. Gas station worker takes precautionary measures after customer refused to put out his cigarette. 
           was gilded 3 times 
           and was upvoted 263008 times 

4\. The conversation my son and I will have on Christmas Eve.. 
           was gilded 23 times 
           and was upvoted 236783 times 

5\. Printers. 
           was gilded 6 times 
           and was upvoted 220424 times

显然,这是一个非常简单的例子。但是根据同样的原理,你可以非常快速地访问大量的数据,并将它们存储在熊猫数据框架中,或者将数据导出为 csv 格式以供将来分析。

发现“隐藏的”API

有大量的功能性的、有用的和有良好文档记录的 API 供您使用。你可以在这个链接看到一些最受欢迎的。然而,有时网站会将 API 用于自己的内部使用,而不是外部用户。这方面的一个例子是 NBA 统计网站。

当你在他们的网站上浏览一个页面,比如这个,你会得到一堆关于一个 NBA 球员的统计数据。访问这些数据的一种方法是编写一个 web scraper,但这是一个更加耗时和脆弱的解决方案。

但是,如果你打开开发者工具(在 Chrome 中:视图→开发者→开发者工具),转到网络选项卡(XHR),然后刷新页面,你会看到网站正在进行一系列 API 调用,以便用相关数据填充页面。

站点在加载时进行的网络调用。如果单击任何给定的请求,还可以查看参数和头,以及其他相关的元数据

其中一项请求如下:

https://stats.nba.com/stats/playerdashboardbyyearoveryear?date from =&DateTo =&game segment =&last games = 0&league id = 00&Location =&measure type = Base&Month = 0&opponenteamid = 0&Outcome =&PORound = 0&pace adjust = N&PerMode = per game&Period = 0&PlayerID = 1628386&plus MINUS

您所看到的基本上是我们在 Reddit 示例中使用的相同的 endpoint + parameters 格式。网站向 https://stats.nba.com/stats/playerdashboardbyyearoveryear 的 T2 发出了一个 API 调用,然后传入了一堆参数(尽管除了 PlayerID 和 Season 之外,它们大部分都是空白的)。

一旦找到这些 API 调用,就可以通过改变参数来尝试编写自己的请求。然而,这种方法的缺点是您需要自己发现所有的端点和参数。幸运的是,至少对于 NBA stats 网站来说,各种在线用户已经为我们记录了端点和参数。

API 礼仪和最佳实践

通常,您希望遵循几个最佳实践。尽量不要向 API 发出过多的请求,因为这样做可能会降低服务速度,并导致自己被阻止。通常,尝试每秒发出少于 1 个请求。

此外,通常最好设置一个描述性的和相关的用户代理头,以便 API 主机可以确定问题可能源自何处,并了解谁正在使用他们的服务。

结论

总之,使用 API 获取数据是数据科学家工具箱中不可或缺的工具。掌握它们可以让你接触到大量的在线数据,使你能够利用更多不同的数据,促进更复杂的分析。我希望这篇文章对你有所帮助,并希望你在编写自己的请求时有乐趣!

使用张量流和 Keras 的人工神经网络初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-artificial-neural-network-using-tensor-flow-keras-41ccd575a876?source=collection_archive---------28-----------------------

使用人工神经网络构建欺诈检测模型&使用 RandomizedSearchCV 微调超参数

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

介绍

ann(人工神经网络)是深度学习的核心,是机器学习技术的高级版本。人工神经网络涉及以下概念。输入和输出层、隐藏层、隐藏层下的神经元、前向传播和反向传播。简而言之,输入层是独立变量的集合,输出层代表最终输出(因变量),隐藏层由神经元组成,在其中开发方程并应用激活函数。前向传播讨论如何开发方程以实现最终输出,而后向传播计算梯度下降以相应地更新学习率。关于操作过程的更多信息可以在下面的文章中找到。

[## 面向初学者的人工神经网络介绍

理解神经网络的概念

towardsdatascience.com](/introduction-to-artificial-neural-networks-for-beginners-2d92a2fb9984)

深度神经网络

当一个 ANN 包含一个很深的隐藏层堆栈时,它被称为一个深度神经网络 (DNN)。DNN 使用多个权重和偏差项,每个权重和偏差项都需要训练。只要两次通过网络,该算法就可以自动计算梯度下降。换句话说,它可以确定如何调整所有神经元的每个权重和每个偏置项以减少误差。该过程重复进行,除非网络收敛到最小误差。

让我们一步一步地运行这个算法:

  • 开发训练和测试数据以训练和验证模型输出。因为它遵循参数结构,其中它优化了权重和偏置参数项。所有涉及相关性、异常值处理的统计假设仍然有效,必须进行处理
  • 输入层由独立变量及其各自的值组成。一个小批量的数据(取决于批量大小)多次通过完整的训练集。每一遍被称为一个时期。纪元越高,训练时间就越长
  • 每个小批量被传递到输入层,输入层将其发送到第一个隐藏层。计算该层中所有神经元的输出(对于每个小批量)。结果传递到下一层,重复这个过程,直到我们得到最后一层的输出,即输出层。这是向前传递:它类似于进行预测,只是所有中间结果都被保留,因为向后传递需要它们
  • 然后使用损失函数测量网络的输出误差,该损失函数将期望输出与网络的实际输出进行比较
  • 计算每个中子对误差项的科学贡献
  • 该算法执行梯度下降以基于学习速率(反向传播)调整权重和参数,并且该过程重复进行

随机初始化所有隐藏层的连接权重是很重要的,否则训练将会失败。例如,如果将所有权重和偏差初始化为零,则给定层中的所有神经元将完全相同,因此反向传播将以完全相同的方式影响它们,因此它们将保持相同。换句话说,尽管每层有数百个神经元,但你的模型将表现得好像每层只有一个神经元:它不会太聪明。相反,如果你随机初始化权重,你会破坏对称性,并允许反向传播来训练一个多样化的神经元团队(Auré lien Gé ron,2017 年,第 290-291 页)

激活功能

激活函数是梯度下降的关键。梯度下降不能在平面上移动,因此有一个明确定义的非零导数以允许梯度下降在每一步都取得进展是很重要的。Sigmoid 通常用于逻辑回归问题,然而,也有其他流行的选择。

双曲正切函数

这个函数是 S 形的,连续的,除了输出范围从-1 到+1 之外可以微分。在训练开始时,每层的输出或多或少以 0 为中心,因此有助于加快收敛。

整流线性单元

在 Z=0 处不可微的连续函数,当 Z<0 时,它的导数为 0。它产生良好的输出,更重要的是有更快的计算。该函数没有最大输出,因此在梯度下降过程中可能出现的一些问题得到了很好的处理。

为什么我们需要一个激活函数?

假设 f(x) = 2x + 5,g(x) = 3x -1。两个不同神经元的方程,其中 x 是输入变量,2 和 3 是权重,5 和-1 是偏差项。在链接这些函数时,我们得到 f(g(x)) = 2(3x -1) + 5 = 6x + 3,这也是一个线性方程。没有非线性类似于在深度神经网络中有一个方程。这种场景下的复杂问题空间是处理不了的。

图一。说明了人工神经网络体系结构中常用的激活函数。作者使用 Excel 开发的图像。

损失函数

在处理回归问题时,我们不需要对输出层使用任何激活函数。训练回归问题时使用的损失函数是均方误差。然而,训练集中的异常值可以使用平均绝对误差来处理。对于基于回归的任务,Huber 损失也是广泛使用的误差函数。

当误差小于阈值 t(通常为 1)时,Huber 损失是二次的,但是当误差大于 t 时,Huber 损失是线性的。当与均方误差相比时,线性部分允许其对异常值不太敏感,并且二次部分允许比平均绝对误差更快的收敛和更精确的数字。

分类问题通常使用二元交叉熵或分类交叉熵或稀疏分类交叉熵。二元交叉熵用于二元分类,而分类或稀疏分类交叉熵用于多类分类问题。你可以在下面的链接中找到更多关于损失函数的细节。

注意: 分类交叉熵用于因变量的一键表示,当标签以整数形式提供时,使用稀疏分类交叉熵。

[## Keras 文件:损失

损失函数的目的是计算模型在训练过程中应该寻求最小化的数量。注意…

keras.io](https://keras.io/api/losses/)

用 Python 开发人工神经网络

我们将使用来自 Kaggle 的信用数据来开发一个使用 Jupyter Notebook 的欺诈检测模型。同样的事情也可以在 Google Colab 中完成。数据集包含欧洲持卡人在 2013 年 9 月的信用卡交易。该数据集显示了两天内发生的交易,其中 284,807 笔交易中有 492 笔欺诈。数据集高度不平衡,正类(欺诈)占所有交易的 0.172%。

import tensorflow as tf
print(tf.__version__)import pandas as pd
import numpy as npfrom sklearn.model_selection import train_test_split
import tensorflow as tffrom sklearn import preprocessingfrom tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, BatchNormalizationfrom sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, f1_score, precision_recall_curve, aucimport matplotlib.pyplot as plt
from tensorflow.keras import optimizersimport seaborn as snsfrom tensorflow import kerasimport random as rnimport os
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
PYTHONHASHSEED=0tf.random.set_seed(1234)
np.random.seed(1234)
rn.seed(1254)

数据集由以下属性组成。时间、主要成分、数量和类别。更多信息请参考 Kaggle 网站。

file = tf.keras.utils
raw_df = pd.read_csv(‘[https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv'](https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv'))
raw_df.head()

因为大多数属性是主成分,所以相关性将总是为 0(主成分中正交向量的属性)。唯一可能存在异常值的列是金额。对其的快速描述提供了下面概述的统计数据。

count    284807.00
mean         88.35
std         250.12
min           0.00
25%           5.60
50%          22.00
75%          77.16
max       25691.16
Name: Amount, dtype: float64

图二。说明了数据中所有属性的相关矩阵。作者使用 Jupyter 笔记本开发的图像。

异常值对于检测欺诈至关重要,因为潜在的假设是,较高的交易可能是欺诈活动的迹象。然而,箱线图没有揭示任何特定的趋势来验证上述假设。

图 3。说明了欺诈性和非欺诈性活动的金额的箱线图表示。作者使用 Jupyter 笔记本开发的图像。

准备输入输出和训练测试数据

X_data = credit_data.iloc[:, :-1]y_data = credit_data.iloc[:, -1]X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.2, random_state = 7)X_train = preprocessing.normalize(X_train)

数量和主成分分析变量使用不同的尺度,因此数据集被归一化。归一化在梯度下降中起着重要的作用。标准化数据的收敛速度要快得多。

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

输出:

(227845, 29) #--Number of records x Number of columns
(56962, 29)
(227845,)
(56962,)

开发人工神经网络层

上面的输出表明我们有 29 个独立变量要处理,因此输入层的形状是 29。任何人工神经网络结构的一般结构概述如下。

+----------------------------+----------------------------+
 |      Hyper Parameter       |   Binary Classification    |
 +----------------------------+----------------------------+
 | # input neurons            | One per input feature      |
 | # hidden layers            | Typically 1 to 5           |
 | # neurons per hidden layer | Typically 10 to 100        |
 | # output neurons           | 1 per prediction dimension |
 | Hidden activation          | ReLU, Tanh, sigmoid        |
 | Output layer activation    | Sigmoid                    |
 | Loss function              | Binary Cross Entropy       |
 +----------------------------+----------------------------++-----------------------------------+----------------------------+
 |          Hyper Parameter          | Multiclass Classification  |
 +-----------------------------------+----------------------------+
 | # input neurons                   | One per input feature      |
 | # hidden layers                   | Typically 1 to 5           |
 | # neurons per hidden layer        | Typically 10 to 100        |
 | # output neurons                  | 1 per prediction dimension |
 | Hidden activation                 | ReLU, Tanh, sigmoid        |
 | Output layer activation           | Softmax                    |
 | Loss function                     | "Categorical Cross Entropy |
 | Sparse Categorical Cross Entropy" |                            |
 +-----------------------------------+----------------------------+

密集函数的输入

  1. 单位-输出的尺寸
  2. 激活—激活功能,如果未指定,则不使用任何内容
  3. use _ bias 表示图层是否使用偏置矢量的布尔值
  4. 内核初始化器——内核权重的初始化器
  5. bias_initializer —偏差向量的初始值设定项。
model = Sequential(layers=None, name=None)
model.add(Dense(10, input_shape = (29,), activation = 'tanh'))
model.add(Dense(5, activation = 'tanh'))
model.add(Dense(1, activation = 'sigmoid'))sgd = optimizers.Adam(lr = 0.001)model.compile(optimizer = sgd, loss = 'binary_crossentropy', metrics=['accuracy'])

架构概要

model.summary()Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 10)                300       
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 55        
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 6         
=================================================================
Total params: 361
Trainable params: 361
Non-trainable params: 0
_________________________________________________________________

让我们试着理解上面的输出(使用两个隐藏层提供输出解释):

  1. 我们已经创建了一个具有一个输入层、两个隐藏层和一个输出层的神经网络
  2. 输入层有 29 个变量和 10 个神经元。因此,权重矩阵的形状为 10×29,偏差矩阵的形状为 10×1
  3. 第 1 层中的参数总数= 10 x 29 + 10 x 1 = 300
  4. 第一层使用 tanh 作为激活函数,有 10 个输出值。第二层有 5 个神经元,使用 10 个输入,因此权重矩阵是 5×10,偏差矩阵是 5×1
  5. 第 2 层中的总参数= 5 x 10 + 5 x 1 = 55
  6. 最后,输出层具有一个神经元,但是它具有来自隐藏层 2 的 5 个不同输入,并且具有偏置项,因此神经元的数量= 5+1=6
model.fit(X_train, y_train.values, batch_size = 2000, epochs = 20, verbose = 1)Epoch 1/20
114/114 [==============================] - 0s 2ms/step - loss: 0.3434 - accuracy: 0.9847
Epoch 2/20
114/114 [==============================] - 0s 2ms/step - loss: 0.1029 - accuracy: 0.9981
Epoch 3/20
114/114 [==============================] - 0s 2ms/step - loss: 0.0518 - accuracy: 0.9983
Epoch 4/20
114/114 [==============================] - 0s 2ms/step - loss: 0.0341 - accuracy: 0.9986
Epoch 5/20
114/114 [==============================] - 0s 2ms/step - loss: 0.0255 - accuracy: 0.9987
Epoch 6/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0206 - accuracy: 0.9988
Epoch 7/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0174 - accuracy: 0.9988
Epoch 8/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0152 - accuracy: 0.9988
Epoch 9/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0137 - accuracy: 0.9989
Epoch 10/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0125 - accuracy: 0.9989
Epoch 11/20
114/114 [==============================] - 0s 2ms/step - loss: 0.0117 - accuracy: 0.9989
Epoch 12/20
114/114 [==============================] - 0s 2ms/step - loss: 0.0110 - accuracy: 0.9989
Epoch 13/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0104 - accuracy: 0.9989
Epoch 14/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0099 - accuracy: 0.9989
Epoch 15/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0095 - accuracy: 0.9989
Epoch 16/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0092 - accuracy: 0.9989
Epoch 17/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0089 - accuracy: 0.9989
Epoch 18/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0087 - accuracy: 0.9989
Epoch 19/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0084 - accuracy: 0.9989
Epoch 20/20
114/114 [==============================] - 0s 1ms/step - loss: 0.0082 - accuracy: 0.9989

评估输出

X_test = preprocessing.normalize(X_test)results = model.evaluate(X_test, y_test.values)1781/1781 [==============================] - 1s 614us/step - loss: 0.0086 - accuracy: 0.9989

使用张量板分析学习曲线

TensorBoard 是一个非常棒的交互式可视化工具,可用于查看训练过程中的学习曲线,比较多次跑步的学习曲线,分析训练指标等等。该工具随 TensorFlow 自动安装。

import os
root_logdir = os.path.join(os.curdir, “my_logs”)def get_run_logdir():
 import time
 run_id = time.strftime(“run_%Y_%m_%d-%H_%M_%S”)
 return os.path.join(root_logdir, run_id)run_logdir = get_run_logdir()tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)model.fit(X_train, y_train.values, batch_size = 2000, epochs = 20, verbose = 1, callbacks=[tensorboard_cb])%load_ext tensorboard
%tensorboard --logdir=./my_logs --port=6006

图 4。说明了人工神经网络运行的张量板输出。作者使用 Jupyter 笔记本开发的图像。

超调模型参数

如前所述,对于有多少隐藏层或多少神经元最适合一个问题空间,没有预定义的规则。我们可以使用 RandomizedSearchCV 或 GridSearchCV 来优化一些参数。可以微调的参数如下:

  • 隐藏层数
  • 隐藏层中的神经元
  • 【计算机】优化程序
  • 学习率

声明开发模型的函数

def build_model(n_hidden_layer=1, n_neurons=10, input_shape=29):

    # create model
    model = Sequential()
    model.add(Dense(10, input_shape = (29,), activation = 'tanh'))for layer in range(n_hidden_layer):
        model.add(Dense(n_neurons, activation="tanh"))model.add(Dense(1, activation = 'sigmoid'))

    # Compile modelmodel.compile(optimizer ='Adam', loss = 'binary_crossentropy', metrics=['accuracy'])

    return model

使用包装类克隆模型

from sklearn.base import clone

keras_class = tf.keras.wrappers.scikit_learn.KerasClassifier(build_fn = build_model,nb_epoch = 100,
 batch_size=10)
clone(keras_class)keras_class.fit(X_train, y_train.values)

创建随机搜索网格

from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCVparam_distribs = {
 “n_hidden_layer”: [1, 2, 3],
 “n_neurons”: [20, 30],
# “learning_rate”: reciprocal(3e-4, 3e-2),
# “opt”:[‘Adam’]
}rnd_search_cv = RandomizedSearchCV(keras_class, param_distribs, n_iter=10, cv=3)rnd_search_cv.fit(X_train, y_train.values, epochs=5)

检查最佳参数

rnd_search_cv.best_params_{'n_neurons': 30, 'n_hidden_layer': 3}rnd_search_cv.best_score_model = rnd_search_cv.best_estimator_.model

优化器也应该微调,因为它们影响梯度下降、收敛和学习率的自动调整。

  • Adadelta—Adadelta 是 Adagrad 的更健壮的扩展,它基于梯度更新的移动窗口来调整学习速率,而不是累积所有过去的梯度
  • 随机梯度下降— 常用。需要使用搜索网格来微调学习率
  • Adagrad — 对于其他优化器,学习率对于所有参数和每个周期都是恒定的。然而,Adagrad 在处理误差函数的导数时,改变每个参数和每个时间步长“t”的学习速率“η”
  • ADAM — Adam(自适应矩估计)与一阶和二阶动量一起工作,以防止跳过局部最小值。亚当保存了过去梯度的指数衰减平均值

图 5。展示了不同优化器之间的收敛性。图片来自 GIPHY。

一般来说,通过增加层数而不是每层神经元的数量可以获得更好的输出。

参考

奥雷连戈罗恩(2017)。用 Scikit-Learn 和 TensorFlow 进行动手机器学习:构建智能系统的概念、工具和技术。塞瓦斯托波尔,加利福尼亚州:奥赖利媒体

关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;可以在LinkedInTwitter上联系我。

计算机视觉入门指南

原文:https://towardsdatascience.com/a-beginners-guide-to-computer-vision-dca81b0e94b4?source=collection_archive---------10-----------------------

情报的

对人工智能中一个重要领域的友好介绍

“人工智能是一门严格的科学,专注于设计智能系统和机器,使用的算法技术多少受到我们对大脑的了解的启发”

— Yann LeCun

计算机视觉(CV)是事实上的人工智能技术之一,存在于我们遇到的许多人工智能应用中。

面部识别、无人驾驶汽车、增强现实和许多其他应用都以某种形式利用了计算机视觉技术。

过去十年,随着人工智能应用获得更多采用,计算机视觉变得更加突出。

人工智能应用采用的增加导致了计算机视觉相关工作和课程数量的增加

本文将简要介绍计算机视觉在过去五十年中的发展,并探索该领域早期使用的传统 CV 技术。本文将探讨深度学习时代,包括解释从传统的 CV 方法到基于深度学习的方法的转变的原因。

计算机视觉

在我们深入研究各种 CV 技术之前,让我们探索一下计算机视觉试图在功能方面模拟的人体部分。

大多数人类不太重视视觉;这是一种身体机能,很少甚至没有刻意的影响就能自动发挥作用。

照片由 v2osk 在 Unsplash 上拍摄

人类视觉感觉系统已经发展了几千年,使人类能够从三维世界中物体反射到我们眼睛的光线中推断出景物的含义和背景。

我们的眼睛和大脑可以从反射光中推断出对环境的理解。

我们的视觉系统使我们能够确定物体的距离,在不直接接触的情况下预测物体的纹理,并识别我们环境中的所有类型的模式和事件。

计算机视觉是一个过程,通过这个过程,我们试图给计算机系统配备与人类视觉感官系统相同的能力。

计算机视觉的适当定义如下:

计算机视觉是机器或系统通过调用一个或多个作用于所提供信息的算法来生成对视觉信息的理解的过程。这些理解然后被转化为决策、分类、模式观察等等。

我们的视觉感觉系统由眼睛和大脑组成,尽管我们知道眼睛的每个组成部分,如角膜、晶状体、视网膜、虹膜等。,我们并不完全了解大脑是如何工作的。

为了创建能够从图像中提取上下文信息的算法和系统,必须观察模式的原因。那么解决方案可以从对特定模式的原因和结果的理解中得出。

计算机视觉有很多应用,下面是几个:

左:人脸检测和面部特征跟踪。中间:tensor flow 的姿态估计。右图: Yolo 对象检测网络

人脸检测 :实现能够自动识别和定位图像和视频中人脸的系统的任务。面部检测存在于与面部识别、摄影和动作捕捉相关联的应用中。

对象分类 :识别关联的 a 类目标对象的过程。对象识别和检测是具有相似结果和实现方法的技术,尽管在各种系统和算法中识别过程先于检测步骤。

物体跟踪 :一种在一段时间内,从一系列图像中识别、检测、跟踪感兴趣物体的方法。在许多监控摄像机和交通监控设备中可以找到系统内跟踪的应用。

姿态估计 :从提供的图像、视频或图像序列等数字资产中推断出身体主要关节位置的过程。姿态估计的形式存在于诸如动作识别、人类交互、虚拟现实和 3D 图形游戏的资产创建、机器人等应用中。

自 20 世纪 70 年代以来,研究人员已经花费了大量的时间和精力,创建了高效而健壮的计算机视觉算法和系统,可以用作上面列出的一些应用的解决方案。

在现代,大多数计算机视觉任务都是使用深度学习方法解决的。

为了更好地理解计算机视觉领域的基础,让我们探索一下传统的算法,这些算法具有用于解决典型计算机视觉问题的基于启发式的逻辑。

传统方法

计算机视觉技术的主要目的是提供对图像数据中的上下文的某种形式的理解;然后,这种理解被用于更多定制的目的,例如识别或检测。

算法和传统计算机视觉技术中的几个子程序被开发来从图像中提取场景理解。

传统的计算机视觉管道。作者图片

计算机视觉中的特征被描述为数据形式中的一条可测量和可量化的信息,它定义了观察的某些特征。

边缘检测

边缘是可以用来描述图像内容的图像特征的例子。边缘检测是开发能够提供一些场景理解的算法的最初尝试之一。

边缘检测属于图像处理的主题,但已经成为计算机视觉中的主要工具。

边缘检测算法识别图像中像素强度急剧变化的点。通过连接这些图像亮度急剧变化的点,我们形成了线条,更正式的说法是边缘。

为什么边缘是图像中的重要特征?

从检测到的边缘的分析和组合中可以检索到关于图像的大量信息。例如,仅通过观察检测到的边缘之间的连接和连续性,就可以从边缘信息推断出物体的 3D 组成。

检测到的边缘还暴露了图像的可测量和可量化的属性,例如深度和方向的变化。弯曲的边缘代表方向的变化。

一旦从图像中提取出特征,在这种情况下是边缘,就有可能确定图像中哪些内容是相关的。

下面举几个传统边缘检测算法的例子: Canny 边缘检测器 Sobel 方法 模糊逻辑方法

由 JonMcLoone 在英语维基百科,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=44894482

识别图像中的特征的重要性在于计算机视觉的基本目标,即理解图像中的内容。

从边缘和线条等衍生特征中,可以构建与图像中对象的基本结构组成相对应的三维对象。

传统的计算机视觉涉及对输入和输出的深入分析。深入的分析揭示了可以从图像中提取哪些数学上可表示的特征,并与有效的算法相结合以产生期望的结果。

封装上述过程的传统计算机视觉技术的一个例子是 Haar-like 特征。

图片来自https://www.researchgate.net/

类哈尔特征用于计算机视觉任务,如物体识别或人脸检测。

它通过使用包含两个相邻矩形的定义窗口来工作,其中每个矩形中像素强度之和之间的差异用于识别面部的片段。

眼睛周围的区域比脸颊周围的相邻区域稍暗,用于眼睛检测的 haar 特征将是所利用的相邻矩形。

可以将计算出的差异与先前确定的阈值进行比较,以识别面部的各个部分,例如眼睛、嘴和鼻子。

另一种用于对象检测的传统计算机视觉技术被称为 SIFT(尺度不变特征变换)。它是在 90 年代后期开发的。

SIFT 技术用于识别图像中的对象,与图像的方向、比例和旋转无关。它主要通过识别图像中感兴趣点并累积它们的梯度来工作;这些信息创建了一个图像描述符。包含关键点的描述符与其他描述符的数据库进行比较和匹配。

传统 CV 技术的功效在于检测和提取的特征的质量。

此外,用于创建场景理解的方法和基于启发式的算法是传统 CV 技术的性能和可靠性的重要组成部分。

更多的研究和努力集中在统一和自动化特征提取、工程、学习和分类的所有过程上。

深度学习方法

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

计算机视觉从传统到深度学习方法的转变

在撰写本文时,大多数计算机视觉相关任务都是使用最先进的深度学习架构解决的。

传统的计算机视觉方法已经被深度学习和随后的神经网络引入的端到端学习解决方案所取代。

计算机视觉的传统方法需要在特征提取阶段开始之前定义特征结构和组成。

计算机视觉从业者必须定义什么样的特定特征最能描述图像中感兴趣的对象。这种特征工程和描述的方法是不可扩展的,尤其是当感兴趣对象的数量很大时。

深度学习在一个自动化的过程中处理特征工程、提取和分类的任务。

通过向神经网络呈现图像,神经网络内的权重和参数呈现概括所呈现图像内的突出特征和空间模式的值。

将标记的图像作为训练数据呈现给神经网络,可以训练神经网络来识别对应于图像数据中特定对象的模式。

神经网络模拟功劳归于德米特列夫

对于需要检测的尽可能多的物体,该过程是可重复的。

深度学习有一些限制和缺点;拥有大量的训练数据以确保神经网络能够很好地推广到看不见的数据是一个问题,这个问题在几年内限制了深度学习策略的采用。

网络容量和对计算资源的访问也可能成为计算机视觉深度学习方法的瓶颈。

在采用深度学习之前,CV 工程师负责定义和选择最能描述图像或对象的特征。现在,在现代,CV 工程师更关心深度学习模型的实现、训练和评估。

深度学习

深度学习是机器学习的一个子领域,它涉及利用人工神经网络(ANN)来解决自然语言和计算机视觉任务,如对象检测、对象识别、人脸检测、姿态估计、语义分割等。

深度学习领域中存在各种各样的 ANN 配置,值得注意的配置是卷积神经网络(CNN)、递归神经网络(RNN)和深度神经网络(DNN)。

深度学习中的“深度”一词指出了这样一个事实,即所提到的 ANN 和其他开发的变体由大量的神经网络层组成。

有些关键词普遍存在于深度学习的各个领域;它们是:

  • 神经网络 :以能够保持知识的方式构造的神经元(处理单元)的集合。它们也可以被描述为并行分布式处理器。
  • 卷积 :卷积是一个数学术语,描述两组元素之间的点积相乘。在深度学习中,卷积运算作用于卷积层中的过滤器/内核和图像数据阵列。因此,卷积层包含发生在滤波器和通过卷积神经网络的图像之间的卷积运算。
  • 卷积神经网络 :这些是利用层内数学卷积运算的神经网络。
  • 权重: 这些都是神经元间连接的强度。它们是神经网络中存储知识的关键元素。

利用计算机视觉的深度学习将特征提取、检测、工程和分类的任务全部委托给神经网络。

因此,深度学习计算机视觉管道看起来类似于下图。

深度学习管道。作者图片

结论

到目前为止,我们已经涵盖了解决计算机视觉任务的传统方法和利用深度学习的更现代的方法。

现代和传统的 CV 方法都有更多的概念、想法和技术可以探索。业界的共识是,深度学习是解决计算机视觉任务的主导方法。

对于那些想要探索计算机视觉世界的人来说,深度学习主题和技术是获得实践和专业经验的有利途径。

然而,重温计算机视觉的根源并理解研究人员和工程师在开发传统算法时的直觉总是很有见地的。

很快,我会写一篇文章,更深入地介绍深度学习。

现在,你可以阅读以下文章,了解现代简历工程师的角色是什么样的,以及从事机器学习和计算机视觉研究需要什么。

[## 6 个月的机器学习/计算机视觉工程师

在一个我几年前都没有涉足的领域呆上半年是什么感觉

towardsdatascience.com](/6-months-as-a-machine-learning-computer-vision-engineer-c05978592368) [## 我从攻读计算机视觉和机器学习硕士学位中学到了什么

如果你打算从事计算机视觉或机器学习方面的任何形式的高级研究,请阅读本文…你可能…

towardsdatascience.com](/what-i-learnt-from-taking-a-masters-in-computer-vision-and-machine-learning-69f0c6dfe9df)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

创建干净而有趣的 Python 图表的初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-creating-clean-and-appetizing-python-charts-f7e1cf1899d2?source=collection_archive---------24-----------------------

照片由斯特凡在 Unsplash 上拍摄

数据可视化

随着诸如 Matplotlib、Seaborn 和 Plotly 之类的优秀图形软件包数量的增加,人们很快就会对如何使它看起来更好感到困惑。这并不意味着你可以偷懒!

当你第一次试图弄清楚如何使你的图表看起来完全符合你的要求时,你会感到困惑,尤其是因为似乎 StackOverflow 上的每个人都有自己绘制和定制图表的方式。当您意识到您不能仅仅应用 Matplotlib 中完全相同的代码来定制 Seaborn 中强大的开箱即用的绘图时,这变得更加令人沮丧。

本文将重点关注在试图用 Matplotlib 创建一个清晰的图表时将会遇到的主要问题,然后深入研究这些工具如何转化为 Seaborn 和 Plotly。

  1. 电镀:标签,支线剧情,轴刻度,旋转,支线剧情
  2. 成分:线宽、线型、色调/Cmap、线条颜色、图例和样式。
  3. 调料: Kwargs,动画,注解,还有其他类似 Seaborn,Plotly 的包。
  4. 上菜:针对你制作的每张图表要问的问题

电镀

"如何设置标题、轴标签、轴限制等?"可能是关于 Matplotlib 最常搜索的问题之一。我喜欢用set()把所有东西都放在一行。

import matplotlib.pyplot as pltfig, ax = plt.subplots(figsize = (10,10))
df.plot(kind="line")
ax.set(Title = "Test Title", xlabel = "x label", ylabel= "y label", xlim= (0,5), ylim = (0,5))

绘制空白图形

支线剧情:关于定制支线剧情已经有很多很棒的文章了,我就简单说一下。以下是你开始时真正需要知道的:

fig, (ax1,ax2) = plt.subplots(2,1, sharex=True) #creating a figure with two charts in the same column, that share an x axis.ax3 = ax1.twinx #creating secondary y axis.

ax1 是第一个图,因此 ax3 在第一个图上创建了一个双轴

有时在你添加了第二个轴或一些支线剧情后,你的情节和标签看起来会被压扁,所以使用fig.tight_layout()来固定间距。

如果你正在绘制一个像pivot.plot(kind=’line’)这样的数据透视表,那么你可以做的一个很酷的技巧是pivot.plot(kind = 'line’, subplots = True)为数据透视表的每一列快速创建支线剧情。使用plot()绘制枢轴将成为你最好的朋友,索引将永远是 x 轴,列将是 y 轴。

刻度管理:假设您想要在折线图中绘制一些“对象”类型的数据,但是轴不允许您这样做,因为它需要是一个 int!首先保存分类变量名称的列表,然后将分类列转换为整数(1,2,3,4…)。

选择频率(1,5,10,…)并将其保存在另一个列表中。现在设置您的滴答频率,然后用您的按滴答频率索引的分类变量列表替换标签。代码应该如下所示:

cat_labels = df[“column_name"].unique()df[“column_name"] = np.arange(1,100,1) tickfrequency = np.arange[1,100,5] #every 5th tick to be shown on axis ax.xaxis.set_ticks(tickfrequency) ax.xaxis.set_ticklabels(cat_labels[tickfrequency])

配料

线条定制:线条宽度、标记、颜色和类型可以在这里找到如果你向下滚动到格式字符串。如果愿意,您可以使用set_dashes()创建自定义模式。

import numpy as np#data for plots
x = np.linspace(0, 10, 100)
y = np.sin(x)fig, ax = plt.subplots()
# Using set_dashes() to modify dashing of an existing lineline1, = ax.plot(x, y, label='line 1')
line1.set_dashes([2, 2, 10, 2]) line2 = ax.plot(x, y-0.4, label='line 3', color='green', marker='o', linestyle='dashed', linewidth=0.5, markersize=0.3)

如果我们在同一图形上先画一条线,然后画一个散点,散点会覆盖这条线。现在解决这个问题的一个方法是最后绘制这条线,但是使用zorder更容易跟踪。较高的zorder 值会覆盖较低的值,把它想象成一个向你走来的 z 轴。

我认为没有足够多的人使用不同的线条模式(我对此也感到内疚),但是数据可视化也需要考虑可访问性。 考虑你的观众是色盲的情况,使用不同的线条图案或色盲友好的颜色图。要了解更多信息,请跟随这条线索,但一般来说你要避免以下组合 : 绿色&棕色,蓝色&紫色,绿色&蓝色,浅绿色&黄色,蓝色&灰色,绿色&灰色,绿色&黑色。

管理颜色:所以你有 20 个不同的列试图绘制(如果你有更多,请考虑过滤或创建不同的图表),但颜色在第一个 10 个之后重复!

unique = example_df["column_name"].unique()
palette = dict(zip(unique, sns.color_palette()))

对于 Matplotlib,你设置color = palette,对于 Seaborn,你在你的绘图函数的参数中设置palette = palette

您还可以将分类变量传递给“hue ”,以便在 Seaborn 中自动分配颜色,或者传递给“c ”,以便使用 matplotlib,如下所示。

c=example_df['column_name'].apply(lambda x: palette[x]) 
#this is replacing the unique label with the color assigned through the whole column.

通过支线剧情和循环,你已经在同一张图表上得到了你的多个情节,但是现在你的传奇完全是一团糟。让我们来看一下如何创建自定义图例。假设您正在绘制第二个 y 轴,但不想要两个图例。

您可以随意设置图例标记,并按如下方式分配标签:

from matplotlib.patches import Patch
from matplotlib.lines import Line2Dlegend_elements = [Line2D([0], [0], color='b', lw=4, label='Line1'),
                   Patch(facecolor='r', edgecolor='g',
                         label='Line2')]ax1.legend(handles = legend_elements,loc='best')

如果你正在绘制一个循环,以下是有用的

from collections import OrderedDicthandles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))    
ax.legend(by_label.values(), by_label.keys())

您可以将图例的loc设置为 9 个位置中的一个(3x3 网格),将其设置为“最佳”,或者通过改变bbox_to_anchor=(1, 1.1))的值将其移出图形。ncols将允许您通过指定每行放置多少个标签来横向压缩您的图例。

ax.legend(by_label.values(), by_label.keys(), bbox_to_anchor=(1,1.1),ncol = 3)

你还是不喜欢你的图表吗?然后使用plt.style.use('ggplot2')更改样式表。要查看完整的风格列表,请点击这里。

调料

现在事情会变得有点复杂。如果你输入help(fig.plot),你会在最后看到**kwargs**kwargs 是一个字典的设置,帮助你定制到一个发球台。这是一篇很好的文章解释了一般的*args**kwargs,但简而言之,因为 Seaborn 方法是建立在 Matplotlib 之上的,所以你可以将任何 Matplotlib 参数传递到 Seaborn 的**kwargs中(并像字体一样进行定制)。我在下面谈到了一个比这更简单的方法,你已经学到了。

你一定要知道 中的一个是gridspec,因为它可以让你改变支线剧情的比例(也就是说,让上面的变小,下面的变大)。

动画:我发现使用这种方法最简单,而不是用matplotlib.animation搞乱不同的编剧和问题。如果你的动画太大使用这个来缩小它们的尺寸。

注解:这个简单,只用于文本,其中前两个值是 x 和 y 坐标:

text = ("This is a really long string that I'd rather have wrapped so that it "
     "doesn't go outside of the figure, but if it's long enough it will go "
     "off the top or bottom!")plt.text(4, 1, text, ha='left', rotation=15, wrap=**True**)

对于箭头和文本之类的东西,也是类似的:

ax.annotate(‘local max’, xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor=’black’, shrink=0.05) 

对于图形上的水平线或垂直线,您可以绘制:

plt.axhline(y=0.5, color='r', linestyle='-')
plt.axvline(x=0.5, color='r', linestyle='-')

这个包完全是基于 Matplotlib 构建的。由于单线图的复杂性,你需要更多地关注args来找出你需要改变的地方。处理所有定制问题的最简单方法是创建一个fig, ax = plt.subplots(),将轴传递给参数ax=ax,然后使用ax.set()定制轴。有些情节不会有“ax”参数,但会有一个“height”你可以设置。其他情节允许你改变情节的类型,但是你不能轻易改变网格/支线剧情的布局。然而,知道了 [gridspec](https://matplotlib.org/3.2.1/tutorials/intermediate/gridspec.html) kwarg 会让你相对轻松地重现许多剧情。

这不是一篇关于最有用的图的文章,但是一定要熟悉pairplot()并通过在sns.heatmap()中插入 df.corr()来创建相关图。这些是让任何人惊叹的快速方法。

谷歌图片相关图示例

Plotly: 它们经历了多次迭代,拥有 Express、Graph Objects、Dash 等子类。它主要是用 Javascript ( D3.js 、 HTML 和 CSS )在前端构建的,这就是为什么你可以在 HTML 文件(或者嵌入)中与它交互。一开始可能会令人困惑,但可以这样想:

  1. plotly . express是给你的 Seaborn 式的俏皮话。
  2. 是为了更复杂的可视化和定制。他们不使用支线剧情,而是使用“轨迹”,你可以在同一个剧情中添加轨迹(就像 Matplotlib 中的轴)或者使用它们来创建支线剧情。查看此链接以深入了解如何定制您的图表。
  3. plotly.dash 是使用回调的能力(比如有一个滑块来更新不同日期的图表,或者下拉菜单来改变你的 x 和 y 轴)。这是一个非常强大的工具,可以部署在 Heroku 或 Jupyter 笔记本上,但需要一些时间来适应。

Plotly 需要记住的一件重要事情是,根据您绘制的数据量,交互速度可能会显著降低。一种方法是使用这个方法。

上菜

如果这太多太混乱,不要担心,因为数据可视化并不容易。就像建立机器学习模型一样,你的大部分时间并没有花在有趣的事情上——而是花在争论和清理数据上,以便可以可视化。你可以做很多改变,这些改变可能看起来微不足道,没有必要,但是当你把它们加起来,这就是星盘和混乱的星盘之间的区别。

在发送任何图表之前,有几个问题需要问自己:

  1. ****对于电镀:我的轴的规模和分布基于域有意义吗?我是否在一张图表上放了太多东西或者太多支线剧情?
  2. ****对于配料:我能否轻松清晰地理解每条线/条/点所指的内容?你通常会有太多或太少的变化,并不是所有的变化都可以通过颜色和图例来补偿!
  3. ****为了调味:我真的需要它是 3D 的、动画的、可交互的吗?一点点盐可以增加味道,但是太多了,人们会感到恶心。在棒线图或哑铃图工作正常的情况下,放入类似桑基图这样的东西是多余的。

任何时候你感到困惑,只要记住你的图表试图从数据中传达一个故事,如果它没有做到这一点,你需要再次浏览它,添加或删除元素。大多数时候,人们不会有足够的耐心耐心听完你对你想要展示的东西的冗长解释。****

祝你们好运,我希望你们都能给出一些令人惊叹的视觉效果!

Python 数据分析初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-data-analysis-in-python-188706df5447?source=collection_archive---------2-----------------------

Python 数据分析入门分步指南

克里斯·利维拉尼在 Unsplash 上的照片

数据分析师的角色

数据分析师使用编程工具来挖掘大量复杂的数据,并从这些数据中找到相关信息。

简而言之,分析师是从杂乱的数据中获取意义的人。为了在工作场所发挥作用,数据分析师需要具备以下方面的技能:

  • 领域专业知识——为了挖掘数据并提出与其工作场所相关的见解,分析师需要具备领域专业知识。
  • 编程技能—作为一名数据分析师,你需要知道使用什么样的库来清理数据、挖掘数据并从中获得洞察力。
  • 统计 —分析师可能需要使用一些统计工具来从数据中获取意义。
  • 可视化技能 —数据分析师需要具备出色的数据可视化技能,以便汇总数据并呈现给第三方。
  • 讲故事— 最后,分析师需要向利益相关者或客户传达他们的发现。这意味着他们需要创建一个数据故事,并有能力讲述它。

在本文中,我将带您完成使用 Python 的端到端数据分析过程。

如果您遵循本教程并按照我的方式编写代码,那么您可以将这些代码和工具用于未来的数据分析项目。

我们将从下载和清理数据集开始,然后继续分析和可视化。最后,我们将围绕我们的数据发现讲述一个故事。

我将使用来自 Kaggle 的一个名为Pima Indian Diabetes Database的数据集,您可以下载该数据集来执行分析。

先决条件

在整个分析过程中,我将使用 Jupyter 笔记本。你可以使用任何你喜欢的 Python IDE。

您将需要沿途安装库,我将提供链接,引导您完成安装过程。

分析

卢克·切瑟在 Unsplash 上的照片

下载完数据集后,你需要阅读。csv 文件作为 Python 中的数据帧。你可以使用熊猫图书馆来做到这一点。

如果您还没有安装它,您可以在您的终端中使用一个简单的“pip install pandas”来完成。如果你在安装时遇到任何困难,或者只是想了解更多关于熊猫库的知识,你可以在这里查看他们的文档。

读取数据

要将数据框读入 Python,首先需要导入 Pandas。然后,您可以读取该文件并使用以下代码行创建数据框:

import pandas as pd
df = pd.read_csv('diabetes.csv')

要检查数据帧的头部,请运行:

df.head()

作者图片

从上面的截图中,您可以看到与患者健康相关的 9 个不同变量。

作为一名分析师,您需要对这些变量有一个基本的了解:

  • 怀孕:患者怀孕的次数
  • 葡萄糖:患者的葡萄糖水平
  • 血压
  • 皮肤厚度:患者皮肤的厚度,单位为毫米
  • 胰岛素:患者的胰岛素水平
  • 身体质量指数:患者体重指数
  • 糖尿病糖尿病功能:亲属有糖尿病史
  • 年龄
  • 结果:患者是否患有糖尿病

作为一名分析师,您需要了解这些变量类型(数值型和分类型)之间的区别。

数值变量是一种测量变量,具有某种数值意义。除了“结果之外,该数据集中的所有变量都是数字。

分类变量也叫名义变量,有两个或两个以上可以分类的类别。

变量“结果”是分类的——0 代表没有糖尿病,1 代表有糖尿病。

快速笔记

在继续分析之前,我想简单说明一下:

分析师也是人,我们经常会对我们期望在数据中看到的东西有先入为主的想法。

例如,你会认为老年人更有可能患糖尿病。您可能希望在数据中看到这种相关性,但情况可能并不总是如此。

在分析过程中保持开放的心态,不要让你的偏见影响决策。

熊猫简介

这是一个非常有用的工具,可供分析师使用。它生成数据框的分析报告,并帮助您更好地理解变量之间的相关性。

要生成 Pandas 分析报告,请运行以下代码行:

import pandas_profiling as pp
pp.ProfileReport(df)

该报告将为您提供数据集的一些总体统计信息,如下所示:

作者图片

通过浏览数据集统计数据,我们可以看到数据框中没有缺失或重复的像元。

上面提供的信息通常需要我们运行几行代码来查找,但是使用 Pandas Profiling 生成这些信息要容易得多。

Pandas Profiling 还提供了每个变量的更多信息。我给你看一个例子:

作者图片

这是为变量“怀孕”生成的信息

作为一名分析师,这份报告节省了大量时间,因为我们不必检查每个变量,也不必运行太多行代码。

从这里,我们可以看出:

  • 变量“怀孕”有 17 个不同的值。
  • 一个人怀孕的次数最少是 0 次,最多是 17 次。
  • 这一列中零值的数量非常少(只有 14.5%)。这意味着数据集中 80%以上的患者都怀孕了。

在报告中,为每个变量提供了这样的信息。这对我们理解数据集和其中的所有列很有帮助。

作者图片

上面的图是一个相关矩阵。它帮助我们更好地理解数据集中变量之间的相关性。

变量“年龄”和“皮肤厚度”之间存在轻微的正相关关系,这可以在分析的可视化部分进一步研究。

由于如上所示,数据帧中没有丢失或重复的行,我们不需要做任何额外的数据清理。

数据可视化

现在我们对每个变量都有了基本的了解,我们可以试着找出它们之间的关系。

最简单快捷的方法是生成可视化效果。

在本教程中,我们将使用三个库来完成这项工作——Matplotlib、Seaborn 和 Plotly。

如果你是 Python 的完全初学者,我建议开始熟悉 Matplotlib 和 Seaborn。

这里的是 Matplotlib 的文档,这里的是 Seaborn 的文档。我强烈建议花一些时间阅读文档,并使用这两个库做教程,以提高您的可视化技能。

Plotly 是一个允许您创建交互式图表的库,需要稍微熟悉 Python 才能掌握。你可以在这里找到安装指南和要求。

如果你完全按照这个教程,你将能够用这三个库制作漂亮的图表。然后,您可以将我的代码用作将来任何分析或可视化任务的模板。

可视化结果变量

首先,运行下面几行代码,在安装后导入 Matplotlib、Seaborn、Numpy 和 Plotly:

# Visualization Importsimport matplotlib.pyplot as plt
import seaborn as sns
color = sns.color_palette()
get_ipython().run_line_magic('matplotlib', 'inline')
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls
import plotly.express as px
import numpy as np

接下来,运行以下代码行来创建一个饼图,可视化结果变量:

dist = df['Outcome'].value_counts()
colors = ['mediumturquoise', 'darkorange']
trace = go.Pie(values=(np.array(dist)),labels=dist.index)
layout = go.Layout(title='Diabetes Outcome')
data = [trace]
fig = go.Figure(trace,layout)
fig.update_traces(marker=dict(colors=colors, line=dict(color='#000000', width=2)))
fig.show()

这是用 Plotly 库完成的,你会得到一个交互式图表,看起来像这样:

作者图片

您可以摆弄图表,选择更改颜色、标签和图例。

然而,从上面的图表中,我们可以看到数据集中的大多数患者都不是糖尿病患者。其中不到一半的结果为 1(患有糖尿病)。

Plotly 相关矩阵

类似于在 Pandas Profiling 中生成的相关矩阵,我们可以使用 Plotly 创建一个:

def df_to_plotly(df):
    return {'z': df.values.tolist(),
            'x': df.columns.tolist(),
            'y': df.index.tolist() }import plotly.graph_objects as go
dfNew = df.corr()
fig = go.Figure(data=go.Heatmap(df_to_plotly(dfNew)))
fig.show()

上面的代码将生成一个类似于上面的相关矩阵:

作者图片

同样,与上面生成的矩阵类似,可以观察到变量之间的正相关关系:

  • 年龄和怀孕
  • 葡萄糖和结果
  • 皮肤厚度和胰岛素

为了进一步了解变量之间的相关性,我们将创建一些图表:

可视化葡萄糖水平和胰岛素

fig = px.scatter(df, x='Glucose', y='Insulin')
fig.update_traces(marker_color="turquoise",marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5)
fig.update_layout(title_text='Glucose and Insulin')
fig.show()

运行上面的代码应该会得到如下图:

作者图片

变量葡萄糖和胰岛素之间存在正相关。这是有道理的,因为血糖水平较高的人应该摄入更多的胰岛素。

想象结果和年龄

现在,我们将可视化变量结果和年龄。为此,我们将使用下面的代码创建一个箱线图:

fig = px.box(df, x='Outcome', y='Age')
fig.update_traces(marker_color="midnightblue",marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5)
fig.update_layout(title_text='Age and Outcome')
fig.show()

结果图看起来有点像这样:

作者图片

从上面的图中,你可以看到老年人更容易患糖尿病。患有糖尿病的成年人的平均年龄在 35 岁左右,而没有糖尿病的人的平均年龄要低得多。

然而,有很多异常值。

有一些没有糖尿病的老年人(一个甚至超过 80 岁),这可以在箱线图中观察到。

想象身体质量指数和结果

最后,我们将把变量“身体质量指数”和“结果”可视化,看看这两个变量之间是否有关联。

为此,我们将使用 Seaborn 库:

plot = sns.boxplot(x='Outcome',y="BMI",data=df)

作者图片

这里创建的箱线图类似于上面使用 Plotly 创建的箱线图。然而,Plotly 更擅长创建交互式的可视化效果,与 Seaborn 制作的图表相比,这些图表看起来更漂亮。

从上面的方框图中,我们可以看到较高的身体质量指数与积极的结果相关。患有糖尿病的人比没有糖尿病的人更容易患身体质量指数氏症。

您可以通过简单地更改变量名并运行相同的代码行来制作更多类似上面的可视化效果。

我将把它作为一个练习留给你去做,让你更好地掌握 Python 的可视化技巧。

数据叙事

照片由 Blaz Photo 在 Unsplash 上拍摄

最后,我们可以围绕我们已经分析和可视化的数据讲一个故事。我们的发现可以细分如下:

糖尿病患者比非糖尿病患者更容易衰老。他们也更有可能有较高的身体质量指数氏症,或患有肥胖症。他们的血液中也更可能有较高的葡萄糖水平。血糖水平较高的人也倾向于服用更多的胰岛素,这种正相关性表明糖尿病患者也可能具有较高的胰岛素水平(这种相关性可以通过创建散点图来检查)。

本文到此为止!我希望本教程对您有所帮助,并且可以作为您需要创建的项目的未来参考。祝您在数据科学之旅中好运,并祝您学习愉快!

随时随地向任何人学习你所能学到的一切;总有一天你会感激你所做的——莎拉·考德威尔。

用 python 进行数据分析和机器学习的初学者指南——成人工资数据集

原文:https://towardsdatascience.com/a-beginners-guide-to-data-analysis-machine-learning-with-python-adult-salary-dataset-e5fc028b6f0a?source=collection_archive---------4-----------------------

使用 python 进行机器学习的入门教程

米卡·鲍梅斯特在 Unsplash 上的照片

你好。如果你想知道机器学习 (ML)到底是什么,数据分析和 ML 有什么关系,为什么每次你碰到 ML/数据分析我们都会听到 Python ?别再担心了,你马上就能找到答案了。

一旦你读完这篇文章,你将对什么是机器学习有一些基本的了解,为什么 Python 如此流行来执行 ML 模型的数据分析,你将能够自信地在你的工作场所加入关于 ML 的对话。本文可能是您学习这些技术的第一步。所以,让我们不要再拖延,直接进入主题。

什么是机器学习?

机器学习是人工智能(AI)的一个子集,通过从提供的数据中提取模式,训练模型像人一样思考和工作。如果一个 ML 程序有 99 行数据,你的算法可以预测第 100 行,而不需要人工编程。机器学习大致分为三种技术,即监督学习、非监督学习强化学习。在本文中,我们将研究监督学习用例,您可以从中了解更多信息。在 medium.com 有许多伟大的文章都在谈论 ML,但我发现有一篇文章,它用简单的术语展示了机器学习的完整概述,可能有助于你更多地了解 ML。

什么是数据分析? 通俗地说,数据分析无非就是了解你的数据。在互联网时代之前,数据非常有限,因为来源很少。但是,现在几乎所有东西都是数据的来源,从你手中的智能手机到你的搜索历史。因此,现在我们不仅拥有海量数据,还拥有各种各样的数据,如结构化、非结构化和半结构化数据。让我们以一个简单的 excel 表格为例,它有 100 列和 50k 多条记录作为数据源。为了从数据中获得一些有用的输出,您需要首先开始理解它。因此,您可以按照这些步骤来分析数据。

  • 从名称理解 excel 中列的用途。
  • 找出对你有用的栏目。
  • 去掉不需要的数据列。
  • 从您感兴趣的列中删除重复值或空值。
  • 将任何特殊或不需要的字符转换成数字或有意义的数据。

就是这样!您已经完成了清理和分析数据源的基本步骤。当然,当你为一个组织工作时,数据不会是简单的 excel 表格。数据可以是任何格式或任何类型:它可以是 CSV 文件、日志转储文件、事务性文件、数据库等。仅通过人工分析它们将是一项具有挑战性且乏味的任务。因此,我们借助各种可用的编程语言,如 Python、R、Java、SQL、Scala 等。还有很多工具,像 IBM SPSS,Power BI,Matlab。现在,这将我们带到文章中的下一个主题,为什么我们使用 Python 进行数据分析,为什么它是数据科学家或爱好者学习的最佳语言。

为什么 Python 这么受机器学习的欢迎?

让你惊讶的是 Python 从 90 年代就存在了。但是最近它变得流行是因为它的开源社区。Python 比许多编程语言有更多的优势,例如:

  • 用 python 编写代码很简单,因为它避免了编写大量样板代码。
  • Python 主要强调其清晰的可读性和自然语言语法。
  • 由于互联网上有大量的教程,这也很容易学会。
  • Python 的主要优势是它的强大的库。

库只不过是函数或方法的集合,你可以在代码中使用它们来执行某些操作,只需在需要时导入并调用它们,而不是从头开始编写。Python 有强大的机器学习库,如 Pandas、NumPy、SciPy、Seaborn、Matplotlib、Scrapy、Scikit-learn、Tensorflow、PyTorch、Plotly 等..

现在,不要被所有这些库和它们的名字所迷惑或淹没。理想情况下,您不会使用所有这些工具来执行数据分析和生成 ML 模型。但是对于一个数据科学家来说,掌握其中一些知识是很有必要的,这样会使他的工作变得容易得多。当您将这些库用于用例时,您会对它们有更好的理解,所以,关于库的讨论已经足够了。让我们在 Python 的帮助下,尝试使用数据分析技术解决一个用例,并建立一个预测性的机器学习模型,从而开始一些行动。

使用案例:

正如我前面提到的,互联网上有大量的资源可以用来学习 ML、数据分析和 Python。通过利用这些资源中的一些,我们将挖掘在 UCI 机器学习回购或 Kaggle 中可用的成人工资数据集

我已经将我在这个数据集上的工作整合到我的 Kaggle 笔记本中,可以在这里找到。为了更好地理解,这本笔记本在每一行代码上都有适当的注释,我也会使用笔记本中的代码片段在本文中进行更多的阐述。

问题陈述 :
你得到了一个 Excel 数据集,它有 15 列 48842 行。我们的任务是分析数据集,并通过开发一个有监督的机器学习模型来预测一个成年人的年收入是否会超过 50k。

由 Alexander Mils 在 Unsplash 上拍摄的照片

好了,让我们从导入一些需要的库/模块开始。正如我在本文前面提到的,库只不过是大量已经编写好的代码,你需要做的就是在需要的时候使用它们。对每个导入的注释将解释其目的。

*# Import libraries* 

**import numpy as np** *# linear algebra*
**import pandas as pd** *# data processing,* 

*# Libraries for data visualization*
**import matplotlib.pyplot as pplt ** 
**import seaborn as sns** 
**from pandas.plotting import scatter_matrix**

*# Import scikit_learn module for the algorithm/model: Linear Regression*
**from sklearn.linear_model import LogisticRegression***# Import scikit_learn module to split the dataset into train.test sub-datasets*
**from sklearn.model_selection import train_test_split** *# Import scikit_learn module for k-fold cross validation*
**from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score***# import the metrics class*
**from sklearn import metrics**# import stats for accuracy 
**import statsmodels.api as sm**

下一步是加载数据集

*#load the dataset provided*
**salary_dataset = pd.read_csv('../input/adult-incomedataset/adult.csv')**

现在,如果你仔细阅读,上面的这一行代码可能会引起你的兴趣。这一行代码解释了很多关于 Python 简单而自然的语言语法。由于我们想要读取/加载一个 CSV,我们只需使用我们已经导入的 Pandas 库提供的 read_csv() 函数,并将其别名为 pd 。所以,现在我们需要做的就是从库中调用适当的函数,即 pd.read_csv() 。这向我们展示了 Python 库有多强大,可以在一行中加载一个 CSV 文件。

分析数据:

让我们开始分析提供的 excel。我们需要知道列、行、空对象等的数量。那么,让我们打开 excel 表,开始计算列数,获得行数,遍历每一行,找出其中的任何特殊字符或空值,找出所提供的每一列的数据类型。听起来单调乏味,对吗?不要担心,Python 和它的库可以提供帮助,让我们来看看如何实现。

*# salary dataset info to find columns and count of the data* 
**salary_dataset.info()**

看看这有多简单,同样只是一行代码,我们在其中调用适当的函数。熊猫提供的 info() 。我们得到了所有我们需要的信息,比如数据类型、空值计数、行数等。

我们看到一些列名中有特殊字符。我们最好删除它们,因为它们可能会给我们的数据分析带来问题。我们可以用熊猫轻松做到这一点。重命名()【函数】如下所示

*#replacing some special character columns names with proper names* 
**df.rename(columns={'capital-gain': 'capital gain', 'capital-loss': 'capital loss', 'native-country': 'country','hours-per-week': 'hours per week','marital-status': 'marital'}, inplace=True)
df.columns**

扫一眼提供的数据,我们可以看到数据中有一些特殊字符,如'?'。因此,让我们来计算数据中出现的特殊字符的数量。

数据清理:

*#Finding the special characters in the data frame* 
**df.isin(['?']).sum(axis=0)**

数据中包含特殊字符是不可取的,因为这可能会导致不正确的数据分析和预测模型。所以,我们需要摆脱他们。为了实现这一点,我们可以利用如下所示的库。

*# code will replace the special character to nan and then drop the columns* 
**df['country'] = df['country'].replace('?',np.nan)
df['workclass'] = df['workclass'].replace('?',np.nan)
df['occupation'] = df['occupation'].replace('?',np.nan)***#dropping the NaN rows now* 
**df.dropna(how='any',inplace=True)**

首先,更换所有的'?'用 NaN(NaN 在 pandas 中用作缺失数据的占位符),为此,使用 python 的 stringreplace()function用 NumPy 的(之前作为 np 导入)NaN。

第二,使用。dropna()** 函数删除缺少值的行。dropna()可以删除列或行,默认情况下,如果没有提到 axis 关键字,它将删除行。如果行中存在任何缺失值,how='any' 将删除这些行。你可以通过 w3resource 链接了解更多关于 dropna()的信息。**

特征工程:

机器学习模型需要用数字符号输入数据,以从中提取模式并进行预测。但是,并不是我们的源数据集中提供的所有数据都是数字的。提供的一些数据是分类数据,如工作类别、教育、婚姻状况、职业、关系等。我们需要把这些转换成数字符号。

在这里,数据只是我们的模型用作输入的一个特征。因此,我们对数据执行特征工程,从源数据集中创建有意义的数字数据。

安德鲁·布坎南在 Unsplash 上的照片

我们有 15 个特征(列),我们的最终目标是预测收入特征,使收入成为我们的因变量。如果其余 14 个特征中的任何一个影响目标特征,那么这些特征被称为独立变量。****

为了保持文章的简洁并避免与模型无关的数据,我们将避免输入数据中不太独特或有噪声的特征。这有助于我们细化我们的特征以识别独立变量。但是,这可能不适用于所有数据集,这取决于您正在处理的数据类型以及要素的重要性。

*#running a loop of value_counts of each column to find out unique values.* 
**for c in df.columns:
    print ("---- %s ---" % c)
    print (df[c].value_counts())**

这里,我们使用对所有列运行了一个 for 循环。Pandas 的 value_counts()** 函数,它获得唯一值的计数。我们可以看到,提供的一些数据是唯一的,如“workclass”属性只有 7 个不同的值,而一些列有很多不同的值,如 fnlgwt 属性有大约 2000 多个值。**

所以,让我们去掉那些有噪声数据的属性。

*#dropping based on uniquness of data from the dataset* 
**df.drop(['educational-num','age', 'hours per week', 'fnlwgt', 'capital gain','capital loss', 'country'], axis=1, inplace=True)**

熊猫。drop()** 函数用来删除指定的列或行。 axis=1 表示我们打算删除列本身, inplace=True 表示我们在删除列后用清理后的数据集替换原始数据帧,即 df。**

现在,我们剩下 8 个特征,它们是分类数据。**正如我们之前讨论的,我们需要将这些数据转换成我们的 ML 模型可以理解的数字符号。有许多不同的方法来实现这种数据转换,如这里的所述。用数字替换分类数据的简单而基本的方法,即使用 Pandas 。【T21 地图()】功能。**

让我们从我们的目标属性开始,它是收入列。我们看到收入列有两个唯一值,分别是 ' < =50K'' > 50K' 。我们可以很容易地将这些字符串字符映射到数字数据。map()函数如下所示。

*#mapping the data into numerical data using map function*
**df['income'] = df['income'].map({'<=50K': 0, '>50K': 1}).astype(int)**

我们可以看到,现在我们的收入属性有了数值数据。熊猫。map()函数已经将每个'<=50K’ with 0 value and ‘> 50K '替换为 1 和。astype(int)** 是指被替换的值应该是类型 int 。**

使用 map 函数,我们可以将数据集中的所有其他分类数据转换为数字数据。

*#gender*
**df['gender'] = df['gender'].map({'Male': 0, 'Female': 1}).astype(int)***#race* **df['race'] = df['race'].map({'Black': 0, 'Asian-Pac-Islander': 1,                     'Other': 2, 'White': 3, 'Amer-Indian-Eskimo': 4}).astype(int)**#marital **df['marital'] = df['marital'].map({'Married-spouse-absent': 0, 'Widowed': 1, 'Married-civ-spouse': 2, 'Separated': 3, 'Divorced': 4,'Never-married': 5, 'Married-AF-spouse': 6}).astype(int)**#workclass **df['workclass'] = df['workclass'].map({'Self-emp-inc': 0, 'State-gov': 1,'Federal-gov': 2, 'Without-pay': 3, 'Local-gov': 4,'Private': 5, 'Self-emp-not-inc': 6}).astype(int)**#education **df['education'] = df['education'].map({'Some-college': 0, 'Preschool': 1, '5th-6th': 2, 'HS-grad': 3, 'Masters': 4, '12th': 5, '7th-8th': 6, 'Prof-school': 7,'1st-4th': 8, 'Assoc-acdm': 9, 'Doctorate': 10, '11th': 11,'Bachelors': 12, '10th': 13,'Assoc-voc': 14,'9th': 15}).astype(int)**#occupation **df['occupation'] = df['occupation'].map({ 'Farming-fishing': 1, 'Tech-support': 2, 'Adm-clerical': 3, 'Handlers-cleaners': 4, 
 'Prof-specialty': 5,'Machine-op-inspct': 6, 'Exec-managerial': 7,'Priv-house-serv': 8,'Craft-repair': 9,'Sales': 10, 'Transport-moving': 11, 'Armed-Forces': 12, 'Other-service': 13,'Protective-     serv':14}).astype(int)***#*relationship
**df['relationship'] = df['relationship'].map({'Not-in-family': 0, 'Wife': 1, 'Other-relative': 2, 'Unmarried': 3,'Husband': 4,'Own-child': 5}).astype(int)**

我们数据集的最终数字输出将是:

这是我们最后的数字符号数据集。其现在可以被馈送到任何 ML 预测建模算法中。在我们尝试这样做之前,我们应该将数据可视化,并寻找我们可以在数据集的变量之间推导出的任何相关性。

数据可视化:

这里,我们将尝试找出最终数值数据集的每一列与目标属性 income 之间的关系。这可以通过在收入和其他各栏之间创建一个条形图来实现。

*#plotting a bar graph for Education against Income to see the co-relation between these columns* 
**df.groupby('education').income.mean().plot(kind='bar')**

我们正在使用熊猫 绘制条形图。plot() 函数可视化教育与收入属性之间的关系。我们通过使用熊猫对教育价值进行分组来实现它。groupby()** 使用对收入属性的平均值执行函数。平均值()。同样,我们可以绘制出所有其他独立属性相对于收入的条形图,如下所示。**

各种特征与收入均值的条形图。

通过这些可视化,我们可以推导出我们的独立属性和从属属性之间的一些相关性:

  1. 拥有专业学校(7)和博士学位(10)教育背景的成年人将有更好的收入,他们的收入很可能高于 5 万英镑。
  2. 我们的数据表明,职业为专业教授(5)和高级管理人员(7)的人收入超过 5 万英镑的可能性更大。
  3. 性别条形图为我们提供了一些有用的数据洞察,即男性(0)更有可能有更高的收入。
  4. 关系图告诉我们,妻子(1)和丈夫(4)有更高的收入。一对已婚夫妇最有可能挣 5 万多英镑。
  5. 根据数据,亚裔 Pac-Islander 人(1)或白人(3)收入超过 5 万英镑的机会更多。
  6. 自我雇佣(0),联邦政府(2)的工人阶级有更高的机会赚取超过 50K。

我们可以看到,我们所有的数字属性对我们的目标可变收入都有一些影响。因此,我们应该创建一个 ML 模型,将我们所有的数字数据作为输入。

型号选择:

大约有 60 多种预测建模算法可供选择。我们必须很好地理解我们的数据和我们正在寻找的理想解决方案,以缩小我们的模型选择。这里我们的目标是预测收入,收入可以是 0 或 1(小于 50K 或大于 50K ),我们希望确定我们的产出(收入)和其余独立特征(教育、工作类别、性别等)之间的关系。).这个场景是分类的经典例子(分类收入是否是<50K or more ).

We are provided with 48K rows of the labeled dataset tagged with the output column “income” to train our model. Whenever the dataset is labeled and output feature is known, we opt for the 监督学习机器学习技术。因此,我们的用例是一个监督学习加分类问题。根据这些标准,我们可以将选择的型号缩小到以下几种:

  • 逻辑回归
  • KNN 或 k-最近邻
  • 支持向量机
  • 朴素贝叶斯分类器
  • 决策图表
  • 随机福里斯特

逻辑回归:

逻辑回归是用于范畴分类的最简单和最常用的监督机器学习算法之一。逻辑回归的基本概念很容易理解,可以用作任何二元(0 或 1)分类问题的基线算法。对于这个用例,我们将选择逻辑回归作为我们的分类模型,因为对于任何初学者来说,从一个简单而流行的算法开始将是一个良好的开端。

逻辑回归是一种统计预测模型,可以预测“是”(1)或“否”(0)。它基于范围在 0 和 1 之间的 Logit 或 Sigmoid 函数。不要因为听到一个数学函数而害怕。让我简单地给你解释一下。

sigmoid 函数

如果我们在这里观察,sigmoid 函数是一条在值 0 和 1 之间延伸的“S”形曲线,它是根据函数输入一组数据时的输出绘制的。我们可以看到,sigmoid 函数方程是 1 除以 1 加上 e 的-z 次方,其中 e 是一个数学常数,称为欧拉数。

所以,等式的输出应该在 0 和 1 之间。如果 z 值为正无穷大,预测值将为 1,如果 z 值为负无穷大,预测值将为 0。如果将我们拥有的数字数据输入 sigmoid 函数,我们将得到一个小于 0.5 的值,即归类为 0,或者大于 0.5 的值,归类为 1。

好吧!这是逻辑回归背后的所有数学,学习和理解它真的取决于你,因为 Python 的 scikit 库将通过一个函数调用为你解决所有这些数学问题。但是,对于一个优秀的数据科学家来说,了解所有的数学背景是必须的。

现在让我们看看如何利用 Scikit python 库来解决我们的分类问题。

识别特征:

*#Transform the data set into a data frame**#X axis = We concatenate the Relationship, Education,Race,Occupation columns concate using np.c_ provided by the numpy library*
**df_x = pd.DataFrame(np.c_[df['relationship'], df['education'], df['race'],df['occupation'],df['gender'],df['marital'],df['workclass']], columns = ['relationship','education','race','occupation','gender','marital','workclass'])***#Y axis = Our* dependent *variable or the income of adult i.e Income* **df_y = pd.DataFrame(df.income)**

在这里,我们将数据分为两个独立特征,一个是作为 df_y 的收入,另一个是作为 df_x 的关系、种族、职业、性别、婚姻、工作类别。

拆分数据:

*#Initialize the linear regression model*
**reg = LogisticRegression()***#Split the data into 77% training and 33% testing data*
*#NOTE: We have to split the dependent variables (x) and the target or independent variable (y)* **x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size=0.33, random_state=42)**

我们从调用 scikit 库中的函数 LogisticRegression() 开始,并将它赋给变量 reg 。然后,我们使用 train_test_split() 将数据分为测试集和训练集,这有助于更好地训练模型并测试其性能。 test_size=0.33 用我们拥有的 33%的数据创建一个测试数据集,剩下的 77%将作为我们的训练集来训练我们的模型。这个 split 函数返回一对训练集(x_train,y_train)和一对测试集(x_test,y_test)。

*#Train our model with the training data* **reg.fit(x_train, y_train)***#print our price predictions on our test data*
**y_pred = reg.predict(x_test)**

然后我们使用训练我们的模型。fit()** 函数为其提供我们的训练集,并使用获得输出预测。预测()【函数】通过饲养测试集。**

预测与评估:

现在让我们验证我们的模型是如何工作的。

*#feeding the predict function with our test values in the format 
[['relationship','education','race','occupation','gender','marital','workclass']]*
**reg.predict([[1,7,3,7,0,2,0]])**

我们向我们的模型提供测试数据,以便根据我们之前使用数据可视化所做的假设进行预测。我们假设,如果关系状态为 1 或 4,教育为 7 或 10,种族为 1 或 3,职业为 5 或 7,性别为男性即 0,婚姻状态为 2 或 6,工作级别为 0 或 2,那么一个人的收入将超过 50K。因此,我们正确地预测了一个具有这些特征的人肯定能够赚到超过 50K,并返回了预测值 1。

我们可以使用各种模型评估指标来评估我们的模型,比如 python 的 sklearn 库提供的准确性。

#printing the accuracy values **
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))**

我们实现了 76% 的准确度值,这对于任何机器学习预测模型都是好的,尤其是对于分类回归问题。

结论:

终于!我们使用 Python 及其强大的库成功创建了一个分类机器学习预测模型,该模型可以预测给定成年人的收入是否会> 50K。

我希望你花 15 分钟的时间阅读这篇文章,并了解什么是数据分析,如何建立机器学习模型,以及 python 如何帮助我们建立这些模型。这篇文章可能是你机器学习旅程的第一步,但是请记住马克·吐温的话:

“取得成功的秘诀在于开始行动”

如果你在这里,我假设你是一个编程爱好者,想学习机器学习方面的知识。我建议你从学习 python 的基本概念开始,如果你不熟悉, w3schools 简单而优雅的 Python 教程是学习基础知识的最好地方。

一旦你掌握了基础知识,不要急于学习 python 上所有可用的库,你不需要所有的库,从一些对 ML 来说最重要的库开始,比如 Numpy,Pandas,拥有这些库的中级知识足以开始你的数据科学家生涯。

Kaggle 是 ML 的一个很好的学习资源,你可以在超过 19,000 个公共数据集上学习和练习。一旦你熟悉了你在这篇文章中学到的基础知识,我建议你去参加 Kaggle 的传奇泰坦尼克号预测比赛,这是一个分类问题,有一些很棒的笔记本可以学习,并开始编写你的预测模型。

让我知道评论中的任何建议或改进。

快乐学习!!再见。

数据库可靠性工程初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-data-reliability-engineering-8bfd9b9fcaf6?source=collection_archive---------17-----------------------

克林特·帕特森在 Unsplash 上拍摄的照片

数据工程

当站点可靠性工程遇到数据工程时

背景

这不是新闻。随着处理、存储和分析大量数据的高度可扩展和高度可用的系统的发展,一个新的工程分支已经诞生。它被称为数据库可靠性工程。它明显源于谷歌新的开发方法,叫做站点可靠性工程。已经有很多关于 SRE 和德国有什么不同的文章发表了。理解为什么会这样很重要。

数据库可靠性工程是 SRE 的一个子领域。就像 SRE 全面处理公司所有系统的可靠性一样,DRE 处理公司所有数据基础设施的系统。想到的第一个问题是,为什么需要这种分离?这是一个合理的问题。在过去的十年中,数据工程本身已经发展成为一个巨大的领域。工具、技术和流程的多样性是巨大的。

[## 完整的数据工程师词汇

数据工程师必须知道的 10 个单词以内的概念

towardsdatascience.com](/complete-data-engineers-vocabulary-87967e374fad)

数据库可靠性工程

在 SRE 的框架内,数据库可靠性已经成为一项独立的专业。然后,DRE 成为负责数据基础设施(可靠性)的人,包括数据管道、数据库、部署、CI/CD、HA、访问和权限(在某些情况下)、数据仓库、存储和归档。简而言之,DRE 负责数据工程师正常工作所需的所有基础设施。同样值得注意的是—

数据可靠性工程对于数据库管理来说并不是一个花哨的词。

数据库管理是一项高度专业化的工作。DBA 的大部分工作已经被 DevOps 或 DRE 占用了。如前所述,数据库可靠性工程师不仅负责数据库,还负责整个数据基础设施。然而,一些公司利用 DBRE 的职位来具体管理数据库的可靠性。我会给你介绍一家法国家居装修技术公司,它帮助人们做一些 DIY 的事情,描述了数据库可靠性工程师的角色

数据库可靠性工程师负责保持支持所有面向用户的服务的数据库系统和许多其他生产系统全天候平稳运行。dre 是数据库工程和管理部门主管和软件开发人员的混合体,他们应用合理的工程原理、操作规程和成熟的软件开发和自动化,专攻数据库。

DRE 的角色和职责

DRE 的职责范围从为数据建模提供建议,到确保数据库在时机成熟时做好伸缩准备。DRE 使用的工具和技术非常相似,在大多数情况下,SRE 使用的工具和技术如 IaC (Terraform,Pulumi,CloudFormation),CI/CD (Jenkins),配置管理(Ansible,Chef,Puppet)等等。除此之外,数据库可靠性工程师还包括数据分析师、数据工程师、数据库工程师、开发人员等。有时建模数据、编写&优化查询、分析日志&访问模式、安全性&合规性、管理复制拓扑、磁盘空间、警报、监控、计费等等。

许多公司已经开始意识到并在其不断增长的工程团队中开放数据库可靠性工程师的职位。我在 Vimeo , Twitch , Pinterest , Okta , DataDog , Fastly , Box , ActiveCampaign , Mambu , Peloton , InVision ,air 分析了其中的一些职位简介我发现许多公司在 DBA 工作中包括数据建模方面,而其他公司则没有。就像任何其他工作一样,这取决于公司决定如何定义数据库可靠性工程师。

基于我的经验和科技行业的趋势,我按照共性递减的顺序列出了数据库可靠性工程师最常见的职责

  • 数据库的高可用性和高可扩展性—包括数据仓库和数据湖
  • 数据库内部性能调优、优化和最佳实践建议方面的专业知识
  • 数据管道、大数据处理系统(MPP)、分布式系统、存储和归档的基础设施可靠性
  • 跨数据基础架构的安全性和法规遵从性,包括上述所有领域以及更多领域

所有这些职责都需要在多个云平台的数据工程服务方面具备一定水平的专业知识。

数据操作与数据库可靠性工程

数据操作是另一个经常与 DRE 混淆的领域。适用于德沃普斯& SRE 公司的类比同样适用于这里。DRE 负责数据系统的工作,而数据运营人员则通过提供基础设施、授予使用基础设施的权限来帮助数据工程师。

如前所述,在许多公司,将这些工作分成不同工作的界限变得模糊不清。例如,在初创公司的早期阶段,可能只有一个人同时负责数据运营和 DBRE,很有可能同一个人同时担任 SRE 和 DevOps 的工程师。

结论

职位描述的演变是不可避免的。随着新技术的不断发展,工程师的工作将会不断变化,而且变化的速度也非常快。工作会不断变得多余。更新的技术将为更新但更少的工作腾出空间。

数据库可靠性工程作为一个概念只有大约五年的时间,仍然是一个非常年轻的职业。它会不断进化。角色和职责将不断变化,随着管理基础架构的自动化程度越来越高,角色和职责可能会减少。不过,就目前而言,这是一个很好的进入领域。一定要看看 Liane Campbell & Charity Majors 写的关于数据库可靠性工程的书,以获得对该领域的全面介绍。

[## 数据库可靠性工程

数据库可靠性工程书籍。阅读来自世界上最大的读者社区的 5 篇评论。的…

www.goodreads.com](https://www.goodreads.com/book/show/36523657-database-reliability-engineering)

资源

  1. Laine Campbells 在 Surge 2015 上谈数据库可靠性工程
  2. 露丝·王君馨对 SRE 可汗学院的采访
  3. git lab 的数据库可靠性工程
  4. Google Cloud Next 2019+devo PS 之间的对比& SRE
  5. Sapient 的客户数据平台 SRE

成为数据科学家的端到端指南

原文:https://towardsdatascience.com/a-beginners-guide-to-data-scientist-67bbc7fc32c9?source=collection_archive---------6-----------------------

数据科学技巧/初学者指南

🤯让我们从零开始学习数据科学吧!

在过去的两年中,数据科学有了很大的进步。近 90%的可用数据是在前两年产生的,证明数据科学家增加了十倍。它现在被全球的大公司和行业广泛使用。数据科学领域的发展速度比其他领域快得多。

你想踏入数据科学的世界并获得与之相关的所有名声吗?那么你来对地方了!我们将在本文中广泛地探讨数据科学中涉及的工具、过程。我们还将提供对数据科学世界的深入见解成为数据科学家的条件。该报告还将涵盖该领域的各个方面以及全球知名公司如何广泛使用该技术。让我们沉浸在增长最快的研究领域的世界中吧!

介绍

数据科学是包括从大量数据中提取关键信息的研究领域。它是通过算法、流程和各种科学方法完成的。

重要的数据科学工作角色包括数据科学家、数据工程师、统计师、业务分析师、数据分析师等。

游戏世界广泛使用 it、银行部门、医疗行业和电子商务网站。

网飞宝洁这样的世界知名公司使用数据科学来获得想要的结果。

这是目前需求量最大的领域之一。

让我们潜入数据科学的世界,由未知用户Reddit使用gi phy创建的****

什么是数据科学?

这是人们在搜索数据科学时想到的最常见的问题之一。

数据科学是一个跨学科领域,从结构化和非结构化数据中获取知识和简化的信息。这种简化的信息便于阅读和保存。

数据科学专指给一组数据赋予意义的过程。

什么是数据科学?, 数据科学面临哪些挑战?,照片由斯蒂芬·道森在 Unsplash 上拍摄

数据科学家使用云计算工具创建虚拟开发环境。数理统计、大数据和机器学习是该过程中使用的一些标准方法。

大型企业以创造性的方式使用数据科学策略。这也增加了他们在商界的竞争优势。

数据科学流程包括商业分析、商业智能、数据挖掘、预测分析、数据分析和数据可视化。

为什么数据科学变得如此流行?

数据科学有助于将问题转化为研究。它同样提出了一个实用的解决方案。

借助数据科学,您可以识别欺诈活动。它使您的企业免于落入虚假和虚拟的陷阱。

你可以增加顾客的品牌忠诚度。数据科学使这成为可能,因为它执行情感分析。它还可以帮助您推荐客户需要的确切产品。

****数据科学变得如此受欢迎,弗兰基·查马基在 Unsplash 上拍摄的照片

它防止任何形式的金钱损失。

它促进了决策过程,使决策越来越快。

数据科学最酷的特征之一是它让你开发你的机器的智能

数据科学类似于商业智能(BI)吗?

虽然经常互换使用,但并不相似!

数据科学是一个广阔的领域,它将商业智能作为其策略之一。因此,BI 属于数据科学的父类别。

BI 侧重于可视化和统计,数据科学侧重于统计、图形和机器学习。

BI 使用的工具有微软 Bl、Pentaho、** QlikView 。数据科学使用像 TensorFlow 和 R 这样的工具。**

商业智能分析历史、经历和相关数据。数据科学利用这些来分析和预测未来。在 BI 发现问题的地方,数据科学通过神经语言编程和分析提供了解决方案。

数据科学的组成部分是什么?

****统计:它是最重要的单位。统计学是指收集和分析大量数字数据的科学方法。它提供了有用的见解。

可视化:它有助于通过易于理解和直观的视觉效果来访问大量数据。它使数据容易破译。

****数据科学有哪些组成部分?,照片由卢克·切瑟在 Unsplash 上拍摄

机器学习:它强调算法的学习。这也有助于建立相同的。这样做是为了对未来数据做出预测。

****深度学习:是机器学习一个比较新的研究领域。这里,算法特别选择将要遵循的分析模型。

数据科学使用的工具有哪些?

****数据集:数据来源于过去进行的大量研究。然后通过分析工具和算法对数据进行分析。没有数据集,数据科学研究是不可能的,因为没有数据可以分析。

****大数据:是非常复杂的海量数据的集合。使用传统数据处理应用手头的数据库管理工具很难处理。传统软件可以免费管理大数据。因此,数据科学家想出了另一种设备。

Hadoop: Hadoop 最初是为了处理传统软件无法管理的大数据而开发的。它存储和处理这些大型数据集。 HDFS 或 Hadoop 分布式文件系统管理 Hadoop 中的存储。它通过在整个生态系统中均匀分布数据,进一步提高了数据的可用性。它首先将信息分成片段,然后将它们传播到集群中的各个节点。

MapReduce 是 Hadoop 最关键的元素。算法通过映射和减少数据来运行。制图者把更重要的任务分成更小的任务。这些较小的任务平均分配。一旦映射完成,结果将被汇总。通过归约过程,效果被归约为相对更简单的值。

****数据科学使用的工具有哪些?,照片由艾萨克·史密斯在 Unsplash 上拍摄

R Studio: 是一个开源的编程语言和软件环境。在 R 基础下处理图形统计计算。它也可以作为编程语言用于分析目的。它可以用于数据可视化。它简单,易于阅读、书写和学习。因为它是开源的,人们可以分发它的拷贝,阅读和修改它的源代码,等等。然而,R studio 无法管理大数据。

使用 Hadoop,用 R Studio 处理输入是相当棘手的,因为它不能在分布式生态系统中运行。因此,我们使用 Spark R. Spark R 是一个 R 包。它提供了一种将 R 与 Apache Spark 一起使用的简单方法。它提供分布式数据帧。这些数据框可用于过滤、选择和聚合大型数据集。

数据科学中使用的流程有哪些?

探索数据:它通常处理从外部和内部来源收集的数据。这样做是为了回答特定的业务问题或提供解决方案。它处理的数据是通过使用 API 从在线资源、人口普查数据集、社交媒体以及网络服务器的日志中收集的。

****数据准备:清除空白列、缺失值、数据格式不正确等不一致。在建模之前,需要对数据进行探索、处理和调整。有了干净的数据,您可以实现更好的预测。

****数据科学中使用的流程有哪些?照片由印尼 UX在 Unsplash 上拍摄

****模型规划:你需要确定在输入变量之间绘制关系的技术和方法。模型规划是通过使用各种统计公式和可视化工具完成的。r,SQL analysis services 是用于模型规划的一些工具。

****模型的建立:数据集均匀分布用于测试和训练聚类、分类和关联技术应用于训练数据集。准备好模型后,将根据测试数据集对其进行测试。

****操作化:最终模型与技术文档、报告和代码一起交付。该模型经过了彻底的测试。如果通过测试,它将被用作实时生产环境。

****结果:结果传达给所有的利益相关者。它真正决定了结果是否成功。决策是基于模型的输入做出的。

哪些工作与数据科学相关?

****数据科学家:数据科学家处理大量数据,为特定业务产生引人注目的愿景。他们利用各种算法、工具、方法和过程。一个数据科学家处理像 R,Python,SAS,SQL,Matlab,Spark,Hive 和 Pig 这样的编程语言。

数据分析师:他们挖掘大量数据。他们在数据中寻找趋势、模式和关系。他们这样做是为了提供引人注目的可视化和报告。这些进一步用于分析数据。只有在这之后才做出商业决策。他们处理像 R、Python、SQL、C++、C、HTML 和 JS 这样的编程语言。

数据工程师:数据工程师处理大量的数据。他们维护、构建、开发和测试架构,如大规模数据库和处理系统。他们处理编程语言,如 Java、C++、R、Python、Hive、SQL、SAS、Perl 和 Ruby。****

****哪些工作是与数据科学相关的角色?,照片由 M. B. M. 在 Unsplash 上拍摄

统计员:他们运用统计方法和理论收集和分析数据。他们也用这些来理解定量和定性数据。他们处理编程语言,比如 Spark、Perl、R、SQL、Python、Tableau 和 Hive。

****业务分析师:他们负责改进业务流程。他们充当了 IT 部门业务主管之间的桥梁。他们处理像 SQL、Python、Tableau 和 Power BI 这样的编程语言。

数据管理员:他们确保所有用户都能访问数据库。他们关心它的正确和安全性能,以防止它被黑客攻击。他们处理编程语言,比如 SQL、Java、Ruby on Rails、Python 和 C#。****

数据科学有哪些应用?

谷歌搜索 : 它利用数据科学在几微秒内搜索出一个特定的结果。

****语音和图像识别:语音处理许多系统,如 Siri、Alexa 和谷歌助手。由于数据科学的应用,所有这一切都成为可能。图像识别的一个例子是当你在社交媒体上上传一张和你朋友的照片时;它能识别你的朋友并显示建议标签。

****推荐系统:数据科学用于创建推荐系统。社交媒体中的建议好友,YouTube 上的建议视频,电子商务网站上的建议购买都是例子。

价格比较: Shopzilla、Junglee 和 PriceRunner 利用数据科学。使用 API,可以从特定的网站获取数据。

游戏:任天堂、索尼、EA Sports 使用数据科学。机器学习技术被用于开发游戏。当你进入更高和更复杂的层次时,它会自我更新以面对更多的复杂情况。你还可以解锁各种奖品。数据科学让这一切成为可能。

哪些部门使用数据科学?

****哪些部门使用数据科学?,照片由 NeONBRAND 在 Unsplash 上拍摄

电子商务 : 在线零售商以 4 种方式利用数据科学。这样做是为了实现商业价值。这四种方法包括确定目标客户,发掘潜在客户,通过产品推荐增加销售,以及从评论中提取有用的反馈。

制造业:它以 8 种方式使用数据科学来分析其生产力,最小化风险,增加利润。这八种方式包括跟踪性能和缺陷、预测性维护、预测需求、供应链关系、全球市场定价、自动化、新产品开发技术以及提高可持续性的效率。

****银行业:银行业在欺诈检测、风险建模、客户价值、客户细分和实时预测分析中使用数据科学。

****医疗保健行业:利用数据科学进行患者预测和患者跟踪。它还将其用于电子健康记录、重要数据成像、和预测分析。

****交通:交通部门使用数据科学来确保为司机提供更安全的驾驶环境。它优化了车辆性能。这也增加了司机的自主性。数据科学也催生了自动驾驶汽车

哪些知名组织利用了数据科学?

网飞 : 对,你没看错。它使用数据科学来理解什么强调了用户的兴趣。根据收集的信息,它首映下一个生产系列。

****宝洁:它使用数据科学的时间序列模型。通过这些模型,它了解未来的需求和相应的生产水平计划。

Target: 它利用数据科学来识别主要客户群及其购物行为。通过这个,他们引导不同的受众。

如何成为一名数据科学家?

****如何成为一名数据科学家?,丹尼尔·麦卡洛在 Unsplash 上拍照

教育资历:你应该在这些领域中的任何一个领域拥有学士学位——计算机科学、物理学、社会科学和统计学。最常见的领域包括统计学和数学,其次是计算机科学和工程。

****学习统计和数学:一个人要成为数据科学家,需要有扎实的数学基础和对统计的基本理解。你必须熟悉因果关系、相关性和假设检验。线性代数和微积分必不可少。

****练习编程:你必须熟悉 Python 的编程语言。数据库交互同样重要。如果你对 Python 有了很好的了解,那么继续学习其他编程语言,比如 Java 和 R。

****专注于机器学习:学习标准算法也是比较热门的。学习复杂的问题并不总是有帮助的。从对我们很重要的简单问题开始,比如你的问题解决和优化能力。

****创建机器学习项目:开始实施你在机器学习上开发的知识。大公司总是寻找那些知道幕后如何运作的人。

跟上潮流:提高技能非常重要。目前,公司正在寻找精通机器人技术、网络安全、RPA、人工智能、自动化、数据分析和金融科技的人才。

创建作品集: 你的简历一定要提到你的编码和软件技能。必须指定求职者的用户名、电子邮件地址、位置和当前雇主。增强你的投资组合的是大量的追随者,在明星、贡献图、编写目标代码、贡献图等方面的改进。

数据科学面临哪些挑战?

****高质量的数据是准确分析所必需的。小组织不可能有数据科学部门。尽管这是一个需求很高的领域,但没有足够的数据科学家。可能会有隐私问题。一家公司的管理层未能提供建立数据科学团队所需的财务支持。向不具备该领域任何知识的人解释数据科学是一项挑战。获取数据要么不可用,要么很困难。业务决策者未能有效利用数据科学成果。

结论

如果你从事数据科学,有大量的职业机会。跨国公司总是在过滤数据并优化数据,以获得更好的客户体验。像银行、医疗保健行业、运输、电子商务站点这样的重要行业使用数据科学来获得最佳结果。这个世界在不断地将自己升级成一个更好的版本。它通常为数据科学处理海量数据和满足客户需求铺平了道路!

结论,照片由托马斯·博曼斯在 Unsplash 上拍摄

未来几年,世界将需要超过 14 万名数据科学家。据报道,美国数据科学家的收入约为每年 14.4 万美元。因此,现在是时候让人们将数据科学视为一个令人信服的职业选择了。这些公司也应该投资于它,并提供它所需要的财政支持。

我总是把生活看作是从一次经历到另一次经历的旅程。到目前为止,这是一条充满有趣事件和人的道路。通过 LinkedIn ,insta gram&Youtube加入我的旅程

有了手头的所有信息,你就有希望在未来成为一名成功的数据科学家。希望这对你有所帮助,并祝你未来一切顺利!感谢阅读本文!如果你有任何问题,请在下面留言。

** [## 西瓦苏布拉马尼亚 B 培养基

阅读 Sivasubramanian B 的作品。创意说书人,品牌战略家。商业智能分析师。

medium.com](https://medium.com/@storieswithsiva)

祝你好运!干杯!**

Python 数据可视化初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-data-visualization-with-python-49f1d257c781?source=collection_archive---------15-----------------------

如何用几行代码创建强大的可视化效果

卢克·切瑟在 Unsplash 上的照片

图表有魔力。一条曲线的轮廓在一瞬间揭示了一个整体的情况——一场流行病、一场恐慌或一个繁荣时代的生活史。曲线通知头脑,唤醒想象力,令人信服。

什么是数据可视化?

数据可视化是获取数据并以可视格式呈现的行为。这是一种用于交流信息的强大技术,它允许读者立即从数据中获得洞察力。

为什么要数据可视化?

让我举一个小例子来展示数据可视化的强大。

这是一些样本数据,有三个变量——“年龄组”、“使用互联网”和“不使用”

免责声明:这不是真实的数据,我只是创建它来展示可视化的重要性。

根据上面的数据,你能找出年龄组和互联网使用之间的关系吗?

你大概可以从数据中看出一些趋势。你也许还能找到互联网使用最频繁的年龄组。

但是,仅仅看上面的数据,很难得到一个清晰的画面。

现在,我用一行代码创建了两个图表来模拟这种关系。

使用互联网

不要使用互联网

看出区别了吗?

从杂乱的数据中生成一个简单的图表可以给我们提供有价值的见解,并帮助我们找到我们从来不知道存在的趋势。

数据可视化通常用于数据科学过程的两个阶段:

  • 当你,数据科学家,试图理解数据的时候。
  • 当您试图向他人展示您的数据发现时。

在本教程中,我将向您展示如何使用内置库(如 Matplotlib 和 Seaborn)在 Python 中执行探索性数据可视化。

我将使用来自 Kaggle 的泰坦尼克号数据 t 的 train.csv 文件。

导入库

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

注意:确保你已经安装了所有这些库。如果没有,您可以使用简单的 pip 命令安装它们。

创建数据框架

df = pd.read_csv("train.csv")
df.head()

看看数据帧的头部,这是我们得到的信息。

数据帧中有 12 个变量。这些是:

  1. PassengerId:每个乘客的唯一 Id
  2. Pclass:客运类;第一、第二和第三。第一个是上层阶级,第三个是下层阶级。
  3. 名字
  4. 年龄
  5. SibSp:船上的兄弟姐妹和/或配偶人数
  6. Parch:船上父母和/或子女的人数
  7. 机票:机票号码
  8. 票价
  9. 小木屋
  10. 装船:装船港
  11. 幸存:是否有乘客在泰坦尼克号上幸存。值 1 表示乘客幸存,值 0 表示他们没有。

如果您想更多地了解您的数据集(例如行数),我建议使用 Pandas profiling。

这是一个功能强大的工具,可用于分析您的数据框。您不必一次又一次地运行代码行来检查缺少的值或变量类型。

import pandas_profiling as pp
pp.ProfileReport(df)

只需这两行代码,就会在您的数据框上生成一个报告,如下所示:

数据框概览为您提供了整个数据集的快速分析,以及缺失值、变量数量和变量类型。

报告的下一部分将为您提供对数据集中每个变量的深入分析,如下所示:

该报告还包括可视化,以映射数据集中不同变量之间的相关性。以下是生成的热图示例:

甚至在我们开始分析数据框中的每个变量之前,热图就告诉了我们许多不同变量之间的关系。

只要看一看,我们就可以知道有些值比其他值更高度相关。这在进行预测或回答某些数据问题时非常有帮助,我们将在后面详细解释。

数据问题

在开始任何类型的数据分析或可视化之前,您必须在头脑中有一个数据问题。

你试图从数据中得出什么样的见解?有什么特定的趋势或模式吗?

写下几个你想借助可视化回答的问题。

在这种情况下,我们希望在本教程结束时能够回答以下数据问题:

  1. 泰坦尼克号上有多少人幸存?
  2. 哪种性别更有可能在泰坦尼克号上幸存?
  3. 乘客所在的班级对他们的生存有影响吗?
  4. 年轻人更有可能在泰坦尼克号上幸存吗?
  5. 支付更高票价的乘客更有可能在泰坦尼克号上幸存吗?

既然我们已经知道要寻找什么,我们就可以开始数据可视化了。

变量类型

在处理数据时,你会遇到两种主要类型的变量,即分类变量定量变量

分类:分类变量,顾名思义,就是有两个或两个以上类别的变量。它表示可以分组的数据类型。

例如:在泰坦尼克号的数据集中,变量“性别”是绝对的。它代表了两类人;男性和女性。

定量:定量,或数字变量代表一个可测量的量。

例如:变量“年龄”是一个数量变量。

有不同的方法来可视化定量和定性变量,我们将继续讨论。

可视化分类变量

我们将首先通过使用 Seaborn 中的“计数图”来可视化单个变量。

计数图是可视化分类变量的一种简单方式。顾名思义,它显示一个变量的频率。

想象泰坦尼克号上有多少人幸存:

sns.countplot(x='Survived',data=df)

泰坦尼克号生存计数图

从这张图表可以看出,泰坦尼克号上没有生还的人比幸存的人多得多。

使用计数图,我们现在可以可视化数据框中的其他分类变量:

  • 性别:
sns.countplot(x='Sex',data=df)

《泰坦尼克号》中的性别分布

泰坦尼克号上的男性乘客似乎比女性乘客多得多。

  • Pclass
# Pclass:
sns.countplot(x='Pclass',data=df)

乘客的等级分布

图表显示泰坦尼克号上三等舱的乘客比其他任何舱都多。

  • 从事

从事

泰坦尼克号上的大多数乘客都是从 s 港上船的。

可视化定量变量

为了形象化定量变量的分布,我们可以使用直方图。

直方图相当于计数图,但用于数值数据。

首先,我们将创建一个直方图来可视化泰坦尼克号上乘客的年龄分布:

sns.distplot(df['Age'])

泰坦尼克号乘客的年龄分布

从上面的柱状图可以看出,泰坦尼克号上的大多数乘客年龄在 20-40 岁之间。

接下来,我们将看看变量“Fare”:

sns.distplot(df['Fare'])

可以观察到,大多数乘客支付了大约 0-50 英镑的车费。有一些异常值——一些价格高达 500 英镑。

较低“等级”的乘客,如三等舱的乘客,支付比较高等级乘客更低的票价是合理的。

我们很容易想象这种关系。

可视化多个变量

在进行数据分析时,我们常常希望找到两个变量之间的关系。

例如,在回答问题‘哪个性别更有可能在泰坦尼克号上幸存?’

我们需要在这里想象两个变量——“性”和“幸存”

一个简单的方法是创建一个计数图,并添加一个色调函数。“色调”参数允许您选择一个用颜色编码来可视化的变量。

这是可视化分类变量的一个很好的方法。

这里有一个例子:

# Visualize survived with sex:
sns.countplot(x='Survived',hue='Sex',data=df)

性别对存活率的影响

从这个图中,我们可以清楚地看到,泰坦尼克号上女性幸存者的数量比男性多。

同样,我们可以回答下面的问题— 乘客所处的阶层对他们的生存有什么影响吗?

sns.countplot(x='Survived',hue='Pclass',data=df)

乘客级别的生存计数

sns.countplot(x='Pclass',hue='Survived',data=df)

乘客级别与存活率相关

从上面的情节中,我们可以看到,三等舱的乘客比一等舱和二等舱的乘客生还的可能性要小得多。

我们现在可以用“幸存”来形象化变量“上船”

# Survived and embarked:
sns.countplot(x='Survived',hue='Embarked',data=df)

船上生存很重要

接下来,我们将看看如何用分类变量可视化一个定量变量。

“年轻人更有可能在泰坦尼克号上幸存吗?”

为了回答这个问题,我们需要将变量“存活”和“年龄”形象化。我们可以用一个简单的方框图来做这件事。

箱形图为我们提供了数值分布的良好指示,并提供了 5 个数字汇总的信息(最小值、第一个四分位数、中值、第三个四分位数、最大值)。

要完全理解盒子情节,你可以阅读这篇文章。

# Age and sex with survived
sns.boxplot(data=df, x='Survived', y='Age')

年龄和幸存

从上面的情节来看,泰坦尼克号上一个人的生存和年龄似乎没有明确的关联。

支付更高票价的乘客更有可能在泰坦尼克号上幸存吗?

为了回答这个问题,我们需要将变量“幸存”和“费用”形象化。

为此,我们可以创建一个条形图:

sns.barplot(x='Survived',y="Fare",data=df)

票价和幸存

可以观察到,支付较高票价的乘客比不支付的乘客更有可能幸存。

这可能是由于他们所处的乘客等级。较高级别的乘客比较低级别的乘客更有可能支付较高的票价。

我们可以想象这种关系:

sns.barplot(x='Pclass',y='Fare',data=df)

乘客等级和票价

看来我们的假设是正确的!

较高等级的乘客确实比较低等级的乘客支付更多的票价。

有时,我们希望将两个以上的变量相互可视化。例如,我们想知道特定年龄组的男性或女性是否更有可能在泰坦尼克号中幸存。

我们需要想象三个变量——“年龄”、“性别”和“存活”这些变量中有两个是分类变量,一个是定量变量。

你可以通过创建一个变量“年龄”和“性别”的方框图来做到这一点,并创建一个“幸存”的色调

# Age and sex with survived:
sns.boxplot(data=df, x='Age', y='Sex', hue ='Survived')

幸存的年龄和性别

我们可以用' Age '、' Pclass '和' Survived '做同样的事情,看看泰坦尼克号幸存乘客的年龄分布。

sns.boxplot(data=df, x='Age', y='Sex', hue ='Pclass')

和乘客发生性关系

大多数头等舱和二等舱的乘客年龄较大,这是有道理的,因为他们会有更多的钱去乘坐更高级别的航班。

最后,要查看乘客类别、已付车费和存活率之间的关系,我们可以运行以下代码:

sns.barplot(data=df, x='Pclass', y='Fare', hue ='Survived')

幸存的票价和乘客等级

从上面的可视化中,我们可以观察到两件事:

  • 高级别的乘客要比不高级别的乘客多付很多钱。
  • 等级较高的乘客更有可能在泰坦尼克号上幸存。

同时可视化两个以上变量之间的关系是非常强大的,因为它可以帮助我们同时找到模式和回答多个数据问题。

使用 Seaborn 中提供的工具创建这样的可视化也非常简单。

配对图

配对图是一种可视化类型,它在一个图中绘制多个变量的成对分布。

Seaborn 中的 Pair plots 只接受数字列,因此您需要选择这些列以传递到您的数据集中。

在这个配对图中,我们将每个数值变量并排显示,并选择用变量“存活”来着色:

numeric = df.iloc[: , [0,1,5,9]]
sns.pairplot(numeric.dropna(), hue='Survived')

生成的配对图如下所示:

数字列与幸存列的配对图

配对图为我们提供了两种类型的可视化效果——散点图和离差图。你可以在这里阅读更多关于剧情类型的内容。

对角线上的距离图为我们提供了单个变量的信息,类似于我们之前创建的直方图。

散点图向我们展示了所有数字变量之间的相关性。从这些变量中似乎没有观察到强有力的关系。

热图

我们可以在 Seaborn 生成一个热图,类似于熊猫概况报告中提供的热图。

在生成热图之前,我们需要根据数据框创建一个关联矩阵:

cor = df.corr()
sns.heatmap(cor)

热图

热图向我们展示了数据集中变量之间的相关性。颜色的变化代表不同层次的相关性。

变量之间的相关性范围从-1 到 1。值-1 表示完全负相关,值 1 表示完全正相关。

零值表示变量之间没有任何相关性。

你会注意到热图中的对角线似乎具有 1 的相关性,这是因为每个变量都与自身完全相关。

我们可以在这里观察到一些强关系。

  • 变量“SibSp”和“Parch”似乎具有正相关性。
  • 变量“票价”和“幸存”似乎也有正相关关系。

然后…我们结束了!

我希望这篇教程能帮助你了解一些基本的可视化技术。

这将有助于在几个不同的数据集上进行探索性数据分析和可视化,以了解不同类型的变量使用何种类型的图。

数据可视化是一项很好的技能,因为您可以帮助分解复杂的数据,并根据您的发现提供有价值的见解。

它不仅能帮助你理解数据,还能让你清楚地向他人展示数据。

深度学习初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-deep-learning-ed41ac75c4e5?source=collection_archive---------10-----------------------

面向新数据科学家的人工神经网络速成班!

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

近年来,“深度学习”一词已经成为众多招聘人员和公司在职位描述中的常用术语。这是一个极其复杂的课题,一些数据科学家花了一生的时间来研究。对于许多将职业转向数据科学或没有广泛人工智能背景的人来说,这似乎是一个令人生畏的课题。作为一个对此感兴趣的人,我写这篇博客是为了给那些想了解这个话题的人一个简单的概述。

本博客结束时,你将能够:

  • 有效地描述什么是深度学习,以及它与机器学习有何不同。
  • 描述人工神经网络及其组成部分。
  • 提供深度学习的现实应用实例。

什么是深度学习?

深度学习是“人工智能”旗下的一类机器学习算法。用最简单的话来说,就是教机器通过例子来学习,很像人类的婴儿!当读到“人工智能”这个词时,你可能会想到流行的科幻电影,这些电影描述了机器人进化到不再需要人类,然后最终毁灭了世界。幸运的是,我们还没有到那一步,但是机器仍然可以做一些令人印象深刻的事情!例如,深度学习可以用于处理 X 射线图像,以便识别肿瘤等不规则性。它还可以用于面部识别、语音识别、文本分类甚至创建自动驾驶汽车!

那么深度学习和机器学习有什么不同呢?

请记住,深度学习是机器学习,这一点很重要。它们都使用给定的数据执行功能,并且随着时间的推移越来越好。主要区别在于数据如何呈现给模型。机器学习算法需要指导和结构化数据,而深度学习网络使用多层人工神经网络(ANN)来自行确定其预测是否准确。这使得深度学习变得极其强大,因为它可以非常好地处理非结构化数据(即图像、音频文件、文本数据)。

什么是人工神经网络?

模仿是最真诚的奉承形式,作为人类,还有什么比模仿人脑的机器学习网络更好的奉承形式呢?!人工神经网络是模仿人脑内部复杂的生物神经系统而设计的计算系统。

显然,人工神经网络不像人类神经系统那样复杂,但我们可以将相似之处可视化。在人类神经元中,有树突、细胞体和轴突。树突从其他神经元接收信号,并将信号向下发送到细胞体,进行一些处理,然后将信号发送到轴突和轴突终末,信号在轴突终末被转移到其他神经元,一遍又一遍(如下所示)。在人工神经网络中,加权输入被输入到一个特征节点,在那里进行一些处理,形成一个输出,然后输入到下一层,一遍又一遍。需要注意的是,输入和输出实际上是二进制的(0 或 1)。图像中没有显示的一点是节点之间的间隙,其中权重被分配给每个输入。

https://www . quora . com/人工神经网络-计算机科学-生物神经网络之间的区别是什么

权重很重要,因为它们决定了哪些特征比其他特征更重要。每个节点都有一个导致该节点“触发”的特定阈值如果加权输入的组合超过阈值,它将触发节点发信号。由于节点是二进制的,网络只是作为一个典型的线性回归模型。通过添加一个激活函数,它向输入提供一个非线性变换,使其能够利用相对于误差的差异进行学习。

因此,简单来说,激活函数就像一个数学“网关”,它接收输入并计算一个带有附加偏差的加权和,以确定该节点是否应该激活。这允许一些连接变得更强,导致新的连接出现,或者变弱,导致连接被消除。在下图中,使用了一个 sigmoid 激活函数。

图片来自熨斗学校

有许多不同类型的激活功能可以应用。我在下面列出了一些最常见的,但是你可以在这里和这里了解更多:

  • Sigmoid 激活函数:二分类问题输出层的 go-to 函数。给出介于 0 和 1 之间的输出值。
  • 双曲正切(tanh)函数:在中间层表现良好,因为它给出的值介于-1 和+1 之间。
  • 反正切(arctan)函数:很多和 tanh 一样的性质,但是范围从-1.6 到+1.6,所以斜率更平缓。
  • 整流线性单元(RELU)功能:与 tanh 一起最流行的激活功能!当输出<为 0 时,激活正好为 0,这在求导时会很麻烦。
  • 漏 RELU 函数:通过在输出<为 0 时允许激活稍微为负,解决了 RELU 遇到的导数问题

真实世界的例子

让我们通过一个例子来形象地说明什么是神经网络。假设我们想在一个有 20 家不同餐馆的镇上开一家新餐馆。我们希望在给定某些输入特征的情况下预测一家餐馆的销售额,这些输入特征包括:位置、不同食品的价格以及食品选择的多样性。

现在,让我们分别看一下每项功能:

  • 位置 —路过餐厅的人都会被算作潜在顾客,所以位置有助于决定路过的人的数量是有道理的。
  • 定价——食品的定价方式决定了人们的承受能力,进而影响销售额。
  • 品种——在一家餐厅有更广泛的选择可能会被认为是一家更高质量的餐厅,并可能吸引更多的顾客。

图片由熨斗学校提供

因此,在食品供应中有更广泛的品种可能会增加餐馆的感知质量,但另一方面,如果价格高,顾客可能会感知餐馆的质量更高。这表明几个输入可能影响一个' '隐藏的 '特征。在传统的神经网络中,输入和输出相互独立,但是在递归神经网络(RNNs) 中,节点可以使用前一个节点的输出作为当前节点的输入。你可以在这里了解更多关于 RNNs 的信息。**

****隐藏层是一层节点(在本例中为路过的人数、可负担性和感知质量),其输出取决于其他节点的输入(在本例中为位置、价格和多样性),因此不像网络输出那样可见。

熨斗学校的人工神经网络图像

要被认为是“深度学习”,人工神经网络需要至少有两个隐藏层。每一层可以有任意数量的节点,并且可以有任意数量的层。如果你有兴趣了解更多关于不同类型的神经网络,你可以在这里了解更多关于。****

感谢您花时间阅读这篇博文!希望这能给你启发和信心,让你了解更多关于深度学习的知识。

参考文献

  1. https://hacker noon . com/deep-learning-vs-machine-learning-a-simple-explain-47405 B3 eef 08
  2. https://www . zendesk . com/blog/machine-learning-and-deep-learning/

3.https://www.asimovinstitute.org/author/fjodorvanveen/

4.https://hacker noon . com/rnn-or-recurrent-neural-network-for-noobs-a9 afbb 00 e 860

5.https://dashee 87 . github . io/deep % 20 learning/visualizing-activation-functions-in-neural-networks/

6.熨斗学校模块 6:第 44 部分

完全管理的机器学习初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-fully-managed-machine-learning-9d4a5e46b419?source=collection_archive---------50-----------------------

从业余项目转向企业规模的机器学习。

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

人们从不同的背景过渡到机器学习,大多数情况下他们是软件开发人员;然而,每个人都从个人或课程项目开始。然而,在这个行业中,项目的规模更大,给开发和维护带来了额外的复杂性。这就是全面管理的 ML 服务或 ML Ops(灵感来自 DevOps)的用武之地。它将流程转移到云中,为团队提供了更大的灵活性、可靠性和透明度。通过这篇文章,我将软件开发和典型的数据科学项目进行了比较。

单一责任

这是借用了软件设计的坚实原则。我们可以将端到端的机器学习模型分成执行单一功能的任务。然后,我们将这些任务连接成一个连续的工作流。每个任务只关心它自己的输入和输出数据以及分配给它的资源。通常,我们可能希望将数据转换、增强或图像/视频预处理等步骤从建模中分离出来。

依赖性倒置

在这种情况下,它可能不是最合适的术语,但是开发人员对此很满意。这个原则指的是模块的解耦——工作流中较高级别的模块应该尽可能少地依赖较低级别的模块。数据可以从多个来源摄取到 ML 模型中;如果这些来源在任何时候发生变化,都不会影响建模过程。低阶模块负责以期望的格式向模型提供数据。

可重用性

机器学习工程师努力在工作流中构建可重用的模块。尽管更高层次的模型发生了变化,但是数据争论任务应该是即插即用的。当训练长时间运行的算法时,特别是可能需要几个小时的神经网络,缓存结果可能会有所帮助,这样每次运行工作流时,您就不必重新执行训练阶段。大多数云 ML 解决方案都提供了这个特性,它节省了大量的时间。

可量测性

与传统软件类似,ML 应用程序也面临着不同的性能需求。完全托管服务的最大优势之一是能够将任务横向扩展到一个机器集群。随着训练数据的大小或请求数量的增加或减少,它会自动在集群中添加或删除机器。规格是可配置的,您也可以添加具有 GPU 的高性能机器。

集装箱化

就像应用程序的容器一样,它也有助于在隔离的环境中运行数据分析脚本。例如,Python 提供了对虚拟环境的支持,虚拟环境指定了 Python 版本和其他依赖项(通常是一个很长的列表)。每次有新的团队成员加入团队或您更换机器时,配置设置都很容易转移。在自己的环境中运行项目还可以防止它们与其他项目(可能使用较低版本的 Python)发生冲突。在集群中运行脚本的每台机器上解析依赖性。

版本控制

系统地跟踪每个模型运行并比较不同模型的能力是每个数据人员的天赋。机器学习中最具挑战性的问题之一是选择超参数的最佳组合,即权衡对性能和准确性的影响。通过专用功能,我们可以在一大组超参数上快速训练模型,并可视化精度(或任何其他指标)。

云服务还促进了与同时在工作流程的不同阶段工作的贡献者的协作。每个服务都通过集成开发环境(ide)提供支持,集成开发环境可用于从本地机器推送更改。

部署和监控

建立机器学习模型几乎永远不是故事的结尾;你产生的见解会有消费者。您可以通过 REST APIs 或作为 web 服务公开您的模型,有时,您可能还需要将输出与其他应用程序集成。

最后,蛋糕上的樱桃是主动监控工作流状态和接收定制通知的能力。

谷歌大查询地理信息系统初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-google-s-bigquery-gis-46a1193499ef?source=collection_archive---------21-----------------------

通过这个循序渐进的教程,免费开始使用 Google Big Query GIS

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

这个大数据时代的云计算无处不在。然而,许多云服务不提供位置组件来分析和可视化地理空间数据。Big Query 具有接收、处理和分析地理空间数据的内置功能。

在本教程中,我将指导您免费设置 BigQuery 沙盒,使用熟悉的 PostGIS/Spatial SQL 接口处理空间数据,并在云中可视化。

设置免费的 BigQuery 沙箱

谷歌慷慨地提供了一个免费的沙盒供你实验。 BigQuery 沙箱让你可以自由尝试 BigQuery 的功能,并带有一些[限制](http://The BigQuery sandbox gives you free access to the power of BigQuery subject to the sandbox's limits. The sandbox lets you use the web UI in the Cloud Console without providing a credit card. You can use the sandbox without creating a billing account or enabling billing for your project. The web UI is the graphical interface that you can use to create and manage BigQuery resources and to run SQL queries. See the BigQuery web UI quickstart for a working introduction to the web UI.)。有了沙盒,您可以使用 BigQuery,而无需为您的项目创建计费帐户或启用计费。

他们还提供 3 个月 300 美元的免费试用,你可能有资格。

要使用 BigQuery 沙盒,只需转到此 URL。

[https://console.cloud.google.com/bigquery](https://console.cloud.google.com/bigquery)

用谷歌账户登录(最好使用匿名模式)。请注意下图左上角的沙盒标志,它表示您现在处于一个免费的沙盒环境中(每月 10 GB 的活动存储和 1 TB 的已处理查询数据)

BigQuery 界面—作者图片

您可以在“资源”面板中添加数据源(左侧以蓝色突出显示)。在中间的面板中,有查询编辑器,您可以在其中编写 SQL 语法(突出显示为绿色)。一旦准备好 SQL,就可以使用 run 按钮运行查询。

BigQuery 公共数据集

谷歌有一个庞大的公共数据集存储库。在撰写本文时,可用的公共数据集数量为 195 个。在本教程中,我们将使用开放的公共数据集之一:芝加哥犯罪。请随意从列表中确定一个感兴趣的数据集并进行实验,但本文中的所有示例都将使用芝加哥的犯罪数据。

要添加公共数据集,您需要点击+ sign ADD DATA,然后点击Explore public data set。选择一个令人兴奋的数据集,点击它查看数据集。在本例中,我们使用芝加哥犯罪数据集。

搜索数据集(左)。正确可用的 big query-big query 界面中的公共数据-作者图片

现在我们已经添加了公共查询数据集,我们可以查询它们了。让我们在下一节看到这一点。

使用 BigQuery 运行 GIS 查询

现在,您可以运行标准的 SQL 查询来浏览公共数据集。但是,由于这些数据集通常很大,您可以运行限制行数的 select 语句来预览数据集的前几行或查看表的架构。但是,您可以预览模式和数据集的几行,而无需运行任何 SQL 代码,从而节省运行查询的成本。

查看数据集的架构。单击数据集和下方的按钮,您将看到表格的Schema(如下所示)。

Bigquery 接口数据集架构-按作者分类的图像

如果您想预览前几行,那么您可以点击Preview,然后您应该会看到数据集的一些行,如下所示。

Bigquery 接口数据集预览-按作者分类的图像

在下一节中,我们将介绍 BigQuery 的地理特性。

创建和处理地理要素

我们的表有经度和纬度列;因此,我们可以使用 SQL 地理函数将这些值转换为地理要素。如果您已经熟悉 PostGIS,BigQuery GIS SQL 语法也应该是典型的。

我们可以使用ST_GeogPoint函数创建一个地理列。让我们看一个例子。

BigQuery 中的 ST_GeogPoint 查询-按作者分类的影像

让我们先来看一下 SQL 语法。我们选择犯罪的主要类型,使用ST_GeogPoint创建一个地理点,并传递纬度和经度列。我们还删除了经度列中的所有空值,因为我们不能用坐标创建地理点。

ST_GeogPoint 查询 SQL 代码-作者图片

如果您查看上面的图像,您可以保存结果,但更重要的是,BigQuery 具有 GIS 可视化功能,您可以在其中交互式地绘制地图。要可视化地理空间数据,点击Explore with GeoViz,会弹出一个新窗口。点击Authorize并使用您的帐户登录。现在,您应该可以将之前运行的 SQL 语法复制到 BigQuery Geo Viz 工具中。点击Run。现在,您应该会看到一个带有 SQL 结果的底图,在本例中是犯罪点。

Geoviz 工具-图片由作者提供

如果数据已经是地理空间格式,运行一个简单的 SQL 查询就足够了。比方说,我们想得到芝加哥的邮政编码。Big Query 在 geo_us_boundaries 上有一个公共数据集,我们可以运行一个包含 geom 列的 select 语句。

多边形几何 SQL 代码-作者图片

现在,我们可以使用 BigQuery Geo Viz 工具可视化结果。

使用 GeoViz 可视化多边形-作者提供的图像

现在,我们可以在 BigQuery 中查询地理数据集,让我们转到一个使用空间连接函数的更高级的示例。

空间连接

空间连接是应用最广泛的空间过程之一。当我们想要按位置连接数据时,我们使用空间连接。假设我们想要将每个犯罪点与其邮政编码关联起来。我们可以使用ST_Within函数来检查该点是在邮政编码以内还是以外。

简单空间连接 SQL 代码-按作者分类的图像

上面的 SQL 查询将芝加哥犯罪点与邮政编码关联起来。我们正在使用ST_Within功能,并通过犯罪和邮政编码几何地理点。结果如下表所示,其中每个点都与其邮政编码相匹配。

如果我们想统计每个邮政编码中的犯罪数量,我们可以添加一个 group by 语句。以下 SQL 查询返回每个邮政编码的犯罪数量。

具有空间连接的分组依据 SQL 代码-按作者排序的图像

结果如下所示。我们统计了每个邮编的所有犯罪。

按结果分组-按作者分组的图像

你知道我们没有任何地理特征,因为我们不能按地理特征分组。但是,我们可以运行 with-statement 查询来获取邮政编码几何以及每个邮政编码中所有犯罪的计数。

让我们尝试一下(参见下面的 SQL 查询)。这里没有什么新的东西,我们首先通过一个带有空间连接的语句运行通常的 group,然后连接到实际的邮政编码几何。

带语句的空间连接 SQL 代码-按作者分类的图像

查询结果如下所示。您现在可以看到,我们已经在结果中包含了几何列。

几何空间连接-作者提供的图像

因为我们有一个几何列,所以我们也可以使用 Goeviz 工具来可视化结果。我需要设计地图的样式,因此我使用了计数栏来绘制一个 choropleth 地图(见下图)。

作者绘制的带 GeoViz- Image 的 Choropleth 地图

结论

在本文中,我们已经使用免费的沙箱介绍了 BigQuery 的一些基本地理功能。在熟悉了 BigQuery 接口之后,我们已经使用 BigQuery GIS 的地理功能创建并运行了简单的查询。最后,我们实现了一个按位置连接数据的例子。

BigQuery GIS 中有大量的地理功能。你可以在这里找到它们。

[## 标准 SQL | BigQuery | Google Cloud 中的地理功能

如果任何输入参数为 NULL,所有 BigQuery 地理函数都将返回 NULL。地理功能分为…

cloud.google.com](https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions)

用 Python 获取和分析工资数据的初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-grabbing-and-analyzing-salary-data-in-python-e8c60eab186e?source=collection_archive---------18-----------------------

提供三个用于探索性数据分析的 Python 库,让您的生活更加轻松

当我第一次开始学习 Python 时,我希望我拥有的资源之一是关于如何获取和分析数据的非常简单、实用的示例。多年来,我坚持使用 Excel 只是因为我可以相对快速地做任何事情,而且在当时,Python 似乎是一个值得怀疑的收益。

下面,我想讨论三个对探索性数据分析(EDA)非常有用的库,向那些可能想知道学习 Python 的成本效益的人强调每个库的价值。下面显示的完整代码可以在这里找到一个 Jupyter 笔记本。

查看 Levels.fyi 数据

如果你在其中一家公司(脸书/苹果/亚马逊/网飞/谷歌)工作,你可能听说过网站 级别。对于那些没有这样做的人来说,levels 可以很容易地比较和对比不同公司的不同职业水平,而且相对于其他薪酬网站,如glassdoor.com,Levels 通常被认为在实际技术工资方面更准确。Levels.fyi 有一个很好的界面,它的可视化使比较不同公司的工资级别变得很容易,但是,我发现自己想以一种网站上预先汇总的视图不允许的方式来分析数据。下面是我如何做的一步一步的过程。接下来,你需要一些东西来编写 Python(推荐 Jupyter ),并且知道如何安装提到的各种库(推荐初学者下载 Anaconda )。

获取数据

检索数据是最令人困惑的部分,因为站点结构决定了数据的可访问性。幸运的是,在使用开发人员工具检查网络调用后,我发现 level.fyi 从单个端点交付其全部薪水有效负载。用 Python 抓取 JSON 数据简单得离谱,我个人就用了[requests](https://github.com/psf/requests/)库。将它与[pandas](https://github.com/pandas-dev/pandas)库结合起来,我们已经用两行代码将 JSON 存储到一个整洁的数据帧中:

import pandas as pd
import requestsdata = requests.get('https://www.levels.fyi/js/salaryData.json').json()
df = pd.DataFrame(data)

使用requests.get允许我们发出适当的 http 请求并返回一个响应对象。在末尾添加json()将响应转换成 JSON。现在我们已经有了 JSON 格式的数据,我们需要做的就是构造一个数据帧,产生如下结果:

我们的数据框架示例

你可以看到有一些无用的栏目,比如rowNumber。我们将继续进行并删除它们,这样我们就不会在接下来的步骤中打乱我们的分析。我们还希望用数字“NaN”替换空白值,以便接下来的步骤中的一些探索性分析能够正常运行:

import numpy as npdf = df.drop(['cityid', 'dmaid','rowNumber'], axis=1)
df = df.replace("", np.nan)

现在我们已经清理了数据框架,让我们开始研究数据集吧!

探索性数据分析

熊猫有很多真正有用的方法来快速理解你的数据集,如describe()info()shape()等。虽然它们本身肯定是有用的,但我发现在早期记住它们会很麻烦。他们也更关注描述性统计,这并不能帮助你理解更大的问题,如数据完整性或相关性。幸运的是,这是 Python 的地盘,有三个库在为我们做繁重的工作方面做得非常好。

了解缺失数据的完整性

对于这个数据集,我首先想了解每个特征的完整性,以及我是否有足够的数据来进行有意义的分析(例如,检查按性别划分的工资差异,或按任期划分的股票/奖金差异)。为了做到这一点,我更喜欢使用 missingno 库,它可以返回各种可视化结果,以帮助更好地理解数据集中缺失的数据。我需要做的就是导入这个库并使用下面的一行程序:

import missingno as msnomsno.matrix(df, figsize=(12, 8))

运行 msno.matrix()的输出

瞧啊。除了查看数据有多完整,我们还了解到某些功能,如“标签”、“基本工资”和“奖金”并不总是表单填写所必需的,但后来变成了必需的。它还显示,除了“其他详细信息”(和“性别”),可选数据如“股票价值”被频繁填写,可以包含在我的初始分析中。

使用 Pandas_profiling 了解数据结构

现在我对数据的完整性有了一个快速的想法,我可以运行一个更深入的探索性分析。为此,我将使用一个名为 Pandas Profiling 的库。把它想象成dataframe.describe(),但是用了类固醇。Pandas Profiling 获取数据集的每个特征,查看数据类型,然后创建一个巨大的页面,使用分布图、分类箱、极值等详细描述每个特征。它还提供了数据集、相关矩阵的概述,以及使用上述 MissingNo 库显示所有缺失数据的部分!Lukas Frei 在这里写了一篇关于图书馆的文章,我强烈推荐这篇文章来更深入地了解熊猫概况。

我们需要做的第一件事是确保我们的数据类型是正确的类型,以便 Pandas Profiling 可以正确地解释它们。使用df.info()表明我们所有的列当前都是对象类型,所以让我们用下面的代码来改变它:

df['timestamp'] = pd.to_datetime(df['timestamp'])df[['yearsofexperience','basesalary','bonus','stockgrantvalue','totalyearlycompensation','yearsatcompany']] = df[['yearsofexperience','basesalary','bonus','stockgrantvalue','totalyearlycompensation','yearsatcompany']].apply(pd.to_numeric)

如果你再次运行df.info(),你会看到‘时间戳’是一个日期时间,其他的都变成了浮点数。现在我们的数据格式正确了,让我们使用单线奇迹来生成熊猫简介!

import pandas_profiling as ppdf.profile_report(style={'full_width':True})

一旦它运行,您应该会看到类似下图的东西,以及数据集的概述!

熊猫概况概述

很酷,对吧?除了汇总数据,它还突出显示相关信息,如高度基数数据、变量中缺失数据的百分比和零值。对于这篇文章,我最感兴趣的是totalyearlycompensation,所以让我们检查一下这个变量,看看我们能学到什么…

“总薪酬”变量的汇总

我们已经可以看到一些东西导致了数据的严重倾斜,因为分布高度集中在左侧。展开详细信息并转到extreme values选项卡,显示如下内容:

“总年度薪酬”的最小值/最大值

最高值是 5000 似乎有点奇怪,所以我们需要去https://www.levels.fyi/addcomp.html了解输入工资数据的表单是什么样子的:

Levels.fyi 表单

查看表单会发现歪斜的几种可能性。有些人可能一年挣 500 多万美元(有可能!),可能有人只是输入了垃圾数据,和/或可能有一段时间网站上的用户输入了不同的数据(整数而不是千)。由于我们无法控制数据质量,让我们看看“统计”选项卡是否能帮助我们了解更多信息:

“总薪酬”变量的统计数据

当查看左侧的分位数数据时,我们可以看到 5/95%标记似乎与整体数据相匹配(范围在 96,000 美元到 500,000 美元之间)。我们可以使用 Python 中另一个令人兴奋的方法quantile来轻松过滤掉前 5%和后 5%的数据,而不是试图创建静态过滤器或梳理数据来删除这些异常值:

df = df[df['totalyearlycompensation'].between(df['totalyearlycompensation'].quantile(.05),df['totalyearlycompensation'].quantile(.95))]

哒哒!我们已经即时动态地从数据集中移除了异常值。如果我们重新运行 pandas-profiling 我们的totalyearlycompensation变量现在看起来像这样:

过滤分位数后的总年薪

您甚至可以进一步推断,使用 pandas 查询方法来分析数据的特定子集。例如:

df.query("company in ('Facebook','Amazon','Apple','Netflix','Google') and title in ('Product Manager','Software Engineer') and yearsofexperience>4 and yearsofexperience<16").profile_report(style={'full_width':True})

为我们提供了一份报告,该报告分析了具有 5-15 年经验的 FAANG 产品经理和软件工程师的子集。

你可以进一步使用一些额外的库来绘制一个 violin plot 的比较图!

看看我的 Jupyter 笔记本如何做到这一点!

用 AutoViz 让电脑为你做一切

最初,我的文章只打算讨论上面的两个库,但是有一个新的版本我也想介绍一下,它叫做 AutoViz 。这是一个较新的库,本质上是寻找数据集的“相关”细节,以逻辑方式将它们组合在一起,然后以各种图形形式向用户提供输出。如本文章所述:

XGBoost 模型被重复用于确定最一致的特征集,每次通过使用随机的特征集来确定该特征集是重要的;然后,最突出的选定特征可用于指导未来的绘图和可视化

要在我们的数据集上应用和尝试这一点,我们需要做的就是添加几行额外的代码,并命名我们要分析的因变量(在本例中为 totalyearlycompensation)。让我们将数据集过滤给软件工程师,这样我们可以在查看输出时分析单个作业类型:

from autoviz.AutoViz_Class import AutoViz_Class
AV = AutoViz_Class()df = df[df['title'] == 'Software Engineer']df_av = AV.AutoViz(filename="", sep=",", depVar="totalyearlycompensation", dfte=df, header=0, verbose=2, lowess=False, chart_format="svg", max_rows_analyzed=15000, max_cols_analyzed=30)

运行上面的代码后,您应该会看到类似这样的内容,后面是一些图表:

AutoViz 的摘要输出

因此,我们可以看到,在数据集中的 13 个特征中,AutoViz 决定放弃 6 个,因为信息相关性低,令人惊讶的是,公司和位置也在其中。然而,如果我们使用df.value_counts(normalize=True)查看位置统计,我们会发现 51%的工资仅来自 5 个位置,因此可能没有足够的数据使位置成为一个强有力的指标。

现在让我们看看它生成的图表,看看我们能学到什么。在“根据目标变量映射的连续变量”下,我们看到以下内容:

根据目标变量映射的连续变量散点图

由此我们可以看出:

  1. 不管年度总薪酬是多少,基本工资一般都在 25 万美元左右
  2. 股票奖励和奖金变化很大,可能占软件工程师年度总薪酬的很大一部分
  3. 奖金往往更均匀地分散,而股票奖励似乎有三个点集群(90/50/20 度角)。这可能是一个数据质量问题,但这也可能意味着股票价值大幅上升

考虑输出时,直方图 KDE 部分非常重要,因此我们接下来讨论这一部分。首先,我们可以看到男性约占数据集的 88%,因此考虑到严重的不平衡,提取性别间有意义的见解将是困难的。其次,数据严重倾向于职业生涯早期的人——63%的报告工资来自有 0-6 年工作经验的人。这告诉我们,那些有更多经验的人可能希望在下太多结论之前考虑有限的样本量。

性别和经验年限

KDE 图部分的下一组变量也显示了强烈的右偏。特别是 Bonus 和 stockgrantvalue 也有几个峰值。这是 KDE 的说法,即这些是数据集中概率最高的选择。

KDE 为股票期权价值和红利绘制图表

为什么这很重要?如果我们继续只查看成对散点图部分,我们会遇到这种情况:

股票价值和奖金与经验年限的关系

如果我们没有看到 KDE 的偏斜,我就无法判断,对于奖金,40%的价值实际上低于数字“40”。

AutoViz 是一个优秀的新库,当您初次查看数据时,它实际上有可能节省您的时间。如上所示,该程序不会将您从畸形或古怪的数据中拯救出来,因此理解您的数据集是生成有用见解的关键!

结论

希望这篇文章给了你一些新的工具,让你在开始使用数据集时可以使用。我可能会在未来的帖子中讨论更多深入和核心的包,但我认为这些包在高价值输出和低强度输入之间实现了良好的混合。就我个人而言,我从 missingno 开始,在我确信数据相对完整后运行 pandas_profile,然后过滤/按摩到更详细的数据集,以针对 AutoViz 运行更细粒度的自动生成的洞察。感谢阅读!

连接数据的初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-joining-data-935c8e579fb7?source=collection_archive---------28-----------------------

照片由来自佩克斯的克里斯蒂娜·莫里洛拍摄

左连接、内连接、外连接

连接数据是数据分析的基本技能之一。不幸的是,当您刚刚开始时,或者当您正在从 excel 过渡到 SQL 或 Python 时,这也可能有点令人困惑。

在本文中,我将直观地解释连接数据意味着什么以及如何有效地进行连接。

加入数据是什么意思?

理解连接的最好方法是通过一个简单的例子来完成。

假设你为一家在网站上销售 t 恤的公司工作。

你有一个数据集告诉你关于你的网站用户的细节。为简单起见,假设该表只包含唯一的客户端 ID、客户端名称和来源国家:

您还有另一个数据集,它告诉您这些网站用户的所有购买行为:

你的老板走进房间,要求你告诉她哪个国家的网站销售额最高。

要回答她的问题,你需要把告诉你客户在哪里的数据和告诉你他们买了什么的数据放在一起。换句话说,对于每一笔交易,您都需要弄清楚客户端位于何处。

使这成为可能的是,这两个数据集之间有一些共性。在这种情况下,它是客户端 ID。

“连接”就是基于一个公共数据点组合数据。恰当地说,这个公共数据点被称为“连接键”

对于本例,我们可以使用下面的 SQL 查询将用户数据连接到购买数据,该查询使用“client ID”作为连接键:

select purchases.client_id, purchases.sale, users.country 
from purchases
left join users
on purchases.client_id = users.client_id;

瞧:

现在我们可以看到墨西哥的销售额最高。(注意:如果我们有多行,我们会希望使用“groupby”和“sum”函数。但是由于我们在上面的例子中没有太多的数据,我们可以很容易地当场回答这个问题,并把那些话题留到另一天。)

为什么我们需要连接数据?

如果您是数据分析的新手,您可能会感到疑惑,为什么我们首先需要连接数据?为什么数据不能只存在一个表中?

这主要有两个原因。首先,数据通常从不同的来源获得。获取用户数据和事务数据的过程可能是分开的。

如果您是 excel 的超级用户,想想您不得不执行 vlookup 来连接两个数据源的所有时间。本质上,这是一个连接。

第二个原因与速度有关。通常,一个表中的数据越多,从表中检索所需内容的时间就越长。

不同类型连接的简单说明

很好,现在我们对什么是联接以及为什么需要联接有了直觉。接下来,我们需要了解不同类型的连接。

这是一个人们经常犯错的领域,所以让我们试着把这部分讲清楚。

我们需要多种类型的连接有一个原因。如果你能记住原因,那么你就能记住类型。

原因如下:当你的连接键中的值不存在于你正在连接的两个数据集时,计算机需要知道返回什么。

现在,让我们看一个基于之前数据集的例子。

“8367”的客户端 id 在用户表中:

但是它不在事务表中:

因此,join 的“类型”只是告诉计算机在这种情况下做什么。

作为该查询的自豪作者,您可以控制希望计算机返回的内容。

左连接

一个“左连接”告诉计算机:“给我左表中的所有东西,即使它不在右表中。”

左边的表是查询中第一个出现的表

还记得前面的例子吗?我们使用了一个左连接,只从左表中获得了 client _ ids:

完全外部连接

“完全外部连接”告诉计算机,“给我两个表中的所有记录。”

因此,我们从两个表中获取客户 id,包括 1902 和 8367(仅在 users 表中)以及 1000(仅在 purchases 表中)。

请注意,上表中的一些单元格有“null”(即。缺少)值。这是有意义的,因为这些数据实际上并不存在于原始表中。

我们知道客户 id 1000 购买了 10 美元,但是不知道这个客户来自哪里。如果它在原始数据中丢失,那么它将在连接后丢失。

内部连接

最后,一个“内部连接”告诉计算机——“只给我那些连接键在两个表中都存在的记录。”

上述查询返回:

请注意,结果集中缺少所有非重叠的客户端 id—1902、8367 和 1000。

需要注意的事项

了解有关连接数据的更多信息时,需要考虑以下几点:

  1. 右连接:一个“右连接”告诉计算机“给我右表中的所有东西,即使它不在左表中”。我从来没用过右连接。为什么?因为任何时候你想做一个右连接,你可以颠倒表的顺序,然后做一个左连接。少了一件需要记住的事。
  2. 多键连接:可以连接多个列值。(即。table1.id1 = table2.id1 和 table1.id2 = table2.id2 的左连接)
  3. Duplicates: 始终注意连接前后表中记录的数量。初学者的一个常见错误是执行一个创建不需要的副本的连接。如果您遇到这种情况,您将不得不批判性地思考如何重写连接以得到您真正想要的。

Python 逻辑回归初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-logistic-regression-in-python-470bdc57a33?source=collection_archive---------19-----------------------

逻辑回归、混淆度量、AOC 和使用 scikit 学习的解算器的基础

由 Celpax 在 Unsplash 上拍摄的照片

介绍

在统计学中,逻辑斯蒂模型被用于预测一个二元因变量。当我们处理需要预测 1 和 0 的数据集时,我们通常依赖逻辑回归或其他分类算法。统计学上,逻辑回归用于预测事件发生的概率。基于概率值和相应的阈值,我们指定事件是否会发生。例如,今天下雨的概率是 0.73,并且考虑到我们的阈值是 0.5,我们可以确认今天会下雨,即输出是 1,这转化为事件(在这种情况下“今天会下雨”)为真的事实。

当我写下这篇文章时,天正在下雨。太巧了!

奥斯曼·拉纳在 Unsplash 上拍摄的照片

现在的问题是这些概率阈值是什么?我们如何对数据建模?我们可以用线性回归来代替吗?简而言之,当因变量为 1 或 0 时,线性回归不是一个选项,因为线性回归遵循因变量连续的基本假设。当我们使用线性回归对数据建模时,因变量(Y)可以取任何范围的值。当使用线性模型进行预测时,将因变量的输出分别定标为 0 和 1 是具有挑战性的。这就是为什么对于逻辑回归,我们给定独立变量 X1、X2、X3 等等,来模拟事件 Y 的概率。迷茫?

让我们用上面的例子来解决这个问题。什么是概率****会下雨(这里的 Y 是今天下雨的概率)给定昨天下雨(X1),今天气温 20 度(X2),月份 10 月(X3),湿度 20% (X4)。现在,如果我们建立一个回归模型,假设 Y = aX1 + bX2 + cX3 + dX4 +常数,Y 的值可以在[A,B]之间,其中 A 和 B 可以取任何可能的值集。然而,我们知道一个概率可以位于【0,1】之间。这要求我们以一种输出总是位于 0 和 1 之间的方式对数据建模,因此我们使用如下图所示的 sigmoid 函数。

图一。使用 Sigmoid 函数的逻辑回归方程。作者使用 Latex 开发的图像。

逻辑回归在哪里?

我们大多数人都会收到品牌或网站的促销信息,这些信息包含我们的电子邮件 id 和个人信息。你有没有注意到像 Dash、Swiggy、Uber Eats 这样的移动应用程序定期(当你在他们的平台上不活跃时)为你提供定制的折扣?像优步这样的大机构如何知道你是否应该得到促销优惠或定制折扣?一切都可以归结为使用上面讨论的概念实现的客户分类。这些公司有机器学习模型来理解或预测你粗制滥造的概率。如果模型将你标记为一个不满意的客户,他们会部署这些个性化的策略来留住你。

由 Unsplash 上的 abillionveg 拍摄

分类的概念

任何分类问题中的因变量都是 0 和 1 的二进制值(也可以是多类,例如产品质量,比如好、中、差)。因此,一旦开发了逻辑回归模型,我们需要将概率转换为 0 和 1。今天下雨的概率是 0.72。这意味着今天会下雨(真/ 1)还是不会下雨(假/ 0)?这里的一般思想是一个事件必须是真(1)或假(0),而不能像“不确定”那样介于两者之间。因此,一旦我们对概率值建模,我们需要将概率得分转换为 1 和 0 的组合。为了达到同样的目的,大多数机器学习算法使用 0.5 的阈值。

这意味着如果一个事件发生的概率是> 0.5,我们通常认为该事件会发生,或者换句话说,如果一个事件发生的概率超过 50%,那么我们可以声称该事件会发生,也就是说,在这种情况下,会下雨。

混乱矩阵

一旦概率被转换成 1 和 0,我们最终得到一个 2 x 2 矩阵,通常被称为混淆矩阵。混淆矩阵主要用于模型验证或预测模型的拟合程度,或模型与现有数据的吻合程度。这里值得注意的是,当我们建立一个逻辑模型时,我们需要确保我们的预测与数据中给出的相似。例如,如果数据中最初有 100 个 1 和 100 个 0,我们的模型应该将所有 1 预测为 1,所有 0 和 0。这意味着任何错误的分类或不正确的预测都会降低我们的准确性。我们先来看看混淆矩阵。

图二。实际值和预测值的混淆矩阵。所有相应的解释都使用这个混淆矩阵来讨论结果。作者使用 Excel 开发的图像。

  • 真阳性 —模型预测为 1 的值中有多少是原始数据集中的 1?真意味着正确的预测,1 在这里指的是积极的,所以简而言之,积极的正确预测
  • 假阴性 —数据集中有多少被模型预测为 0 的值是 1。False 是不正确的预测,这里负数是 0。所以对 0 或负数的错误预测
  • 假阳性 —有多少值被模型预测为 1,但在数据集中却是 0。False 是不正确的,这里的正数是 1。所以对 1 的错误预测
  • 真阴性 —模型预测为 0 的值中有多少是原始数据集中的 0?True 表示正确的预测,0s 在这里指的是否定的,所以简而言之就是否定的正确预测

模型验证术语

  • 准确性:我们的模型在预测真阳性和真阴性时的准确性,换句话说,我们的预测有多少与数据中的类别变量完全匹配。
  • 假设数据集中有 100 个 0 和 1 的观察值,其中 50 个观察值为 0,50 个观察值为 1 (参考实际)
  • 运行模型后,数据集中被标记为 0 的 50 个观察值中的 30 个也被模型 (指真阴性) 标记为 0
  • 在数据集中被标记为 1 的 50 个观察值中,有 25 个被模型 (指真阳性) 标记为 1。所以我们的准确率是(30+25)/100 =55/100 或者 55%。所以准确率是(真阳性+真阴性)/(真阳性+真阴性+假阳性+假阴性)
  • 召回率或敏感度或真阳性率:数据集中原本标记为 1 的值被模型预测为 1 的百分比是多少?所以敏感度是真阳性/(真阳性+假阴性)也就是 25 / (25+25) = 50%。
  • 这告诉我什么?—它告诉我,数据集中只有 50%被归类为 1 的值被模型正确预测到。
  • 特异性或真阴性率:数据集中原本标记为 0 的值有百分之多少被模型预测为 0?所以敏感度是真阴性/(真阴性+假阳性)也就是 30 / (25+25) = 60%。
  • 这告诉我什么?—它告诉我,在数据集中,只有 60%归类为 0 的值被模型正确预测。
  • 1-特异性或假阳性率:数据集中原本标记为 0 的值有百分之多少被模型预测为 1?所以 1-灵敏度是假阳性/(真阴性+假阳性)也就是 20 / (25+25) = 40%。
  • 这告诉我什么?—它告诉我,在数据集中被归类为 0 的值中,只有 40%被模型错误地预测到。
  • 精度:预测为 1s 的值有百分之多少是正确的?所以精度是真正/(真正+假正)也就是 20 / (20+25) = 44.4%。
  • 这告诉我什么?—它告诉我,模型预测为 1s 的值中只有 44.4%是正确的
  • F1 得分:是精度和召回率的调和平均值。它的计算方法是 2 x(精度召回率)/(精度+召回率)。在我们的例子中,它是 2 * (0.440.5) / (0.44+0.5) = 0.46

使用哪个模型验证指标?

现在我们知道了多个度量标准,很难确定使用哪一个。我在这里举个例子。我们先来看看下图。

图 3。四种不同情景的混淆矩阵及其准确性、回忆/敏感度、精确度和 F1 分数。作者使用 Excel 开发的图像。

上图显示了一个经典的场景示例,其中来自不同模型运行的输出产生了相同的准确性分数。当验证一个逻辑模型时,我们需要在进入模型验证度量之前理解业务用例。一个经典的例子是诊断病人的医疗状况。在处理医疗保健行业的问题时,除了准确性,我们还需要关注召回价值。准确度和精确度并不那么重要。我们需要更准确地预测有健康状况的患者,即使这意味着错误地将没有健康状况的患者分类。

这里的基本原理是,即使的精确度很差,即我们错误地预测健康患者患有某种疾病,也会有后续的医学测试来帮助诊断。然而,如果我们的召回率低,即我们不能正确预测患者的医疗状况,那么我们就会危及他们的生命

想一想——在营销活动中,我们需要预测客户是否会购买产品,并向他发送一些促销信息,这种情况如何?

我们应该将阈值从 0.5 更改为不同的值吗?

在统计学中,如果一个事件发生的概率是 0.5,那么就认为是一个随机事件 大多数 ML 算法使用阈值 0.5 将概率转换为 1 和 0,这转化为随机化因子。如果一个事件的概率大于随机概率值,那么这个事件就有可能发生,否则就不会发生。然而,有时我们需要微调这个阈值来改进模型度量之一。

如果我提高或降低阈值,会有什么变化?

  1. 始终记住真阳性+假阴性 是数据集的 常数,这意味着如果其中一个改变,灵敏度也会改变。类似地,数据集的假阳性+真阴性是常数,这意味着如果任一变化特异性也发生变化
  2. 降低阈值意味着我最终预测 1 多于 0?这意味着什么?
    -这意味着真阳性+假阳性 通过增加预测 1
    的数量来增加
    -这导致了假阳性数量增加的可能性,从而降低 精度
    -如果假阳性增加,真阴性将下降,从而降低特异性
  3. 增加阈值意味着我最终会预测更多的 0 而不是 1
    这意味着什么?
    -这意味着真阴性+假阴性增加,因为模型预测的 0 的数量将更高
    -这导致假阴性的数量可能会增加,从而降低灵敏度

如果模型的召回(灵敏度)值很低,您可能希望将阈值从 0.5 降低到一个较低的值。

接收机工作特性曲线

图 4。逻辑回归模型的 ROC 曲线。作者使用 Jupyter 笔记本开发的图像。

  1. 当灵敏度/真阳性率为 0,1-特异性或假阳性率为 0 时,意味着什么?
    -真阳性为 0,这意味着所有的 1 都被模型
    错误地预测到了-假阳性为 0,或者我们可以说真阴性为 100%,即所有的 0 都被模型
    正确地预测到了-我的模型为 0 返回了极好的回报,但未能识别 1
  2. 当灵敏度/真阳性率为 1 且 1-特异性或假阳性为 1 时意味着什么?
    -假阴性为 0,这意味着所有的 0 都被模型
    错误地预测到了-真阳性为 1,或者我们可以说所有的 1 都被模型
    正确地预测到了-我的模型返回了 1 的优秀结果,但未能处理 0
  3. 上面的曲线意味着什么?
    -对于不同的概率阈值,灵敏度和 1-特异性值是多少
    -面积越大,表示 1-特异性低时灵敏度高,之后保持饱和

使用 Python 预测贷款资格

信用风险是指借款人拖欠任何贷款。在银行部门,这是在批准申请人的贷款之前要考虑的一个重要因素。X 公司经营所有房屋贷款。他们在所有地区都有业务。客户申请贷款,在批准之前,贷款官员会对其进行验证。该分析旨在为客户建模,并确定他们是否合格。

实现相同功能的代码片段如下:

import pandas as pd
from sklearn.linear_model import LogisticRegression# importing ploting libraries
import matplotlib.pyplot as plt
# To enable plotting graphs in Jupyter notebook
%matplotlib inline#importing seaborn for statistical plots
import seaborn as sns
sns.set(color_codes=True) # — — — — — — — -adds hue to the color#Let us break the X and y dataframes into training set and test set. For this we will use
#Sklearn package’s data splitting function which is based on random functionfrom sklearn.model_selection import train_test_splitimport numpy as np
import os,sys
from scipy import statsimport warnings
warnings.filterwarnings(‘ignore’)# calculate accuracy measures and confusion matrix
from sklearn import metricsfrom IPython.display import display # — — — — — — — — — — -for displaying multiple data frames in one output

读取数据

df = pd.read_csv(‘CreditRisk.csv’)print(“Shape of the data:”, df.shape)display(df.head())

图 5。来自信用数据的数据元素。作者使用 Jupyter 笔记本开发的图像。

cr_df = df.drop(‘Loan_ID’, axis =1 ) # dropping this column as it will be 1–1 mapping anywayscr_df['Loan_Amount_Term'].value_counts(normalize=True)#The Loan_Amount_Term/Credit_History is highly skewed - so we will delete this columncr_df.drop(['Loan_Amount_Term'], axis=1, inplace=True)

缺失值处理

for i in list(cr_df.columns[cr_df.dtypes==’object’]): # checking value counts of all object type columns
 print(cr_df[i].value_counts(normalize=True))
 print()

图 6。按属性分布数据。作者使用 Jupyter 笔记本开发的图像。

#filling Null Valuescr_df[‘Self_Employed’].fillna(‘No’,inplace=True) #replacing with mode, as maximum people are not self employedcr_df[‘Dependents’].fillna(‘0’,inplace=True) #replacing with modecr_df[‘Credit_History’].fillna(0.0,inplace=True) #replacing with modecr_df['Gender'].fillna('Male',inplace=True) #replacing remaining values with mode as no other relationship founddf.groupby(['Loan_Status','Gender','Property_Area'])['Married'].value_counts()

图 7。为了取代婚姻状况,我们着眼于属性的组合,以确定插补的类型。作者使用 Jupyter 笔记本开发的图像。

cr_df.loc[104,’Married’] = ‘Yes’
cr_df.loc[228,’Married’] = ‘Yes’
cr_df.loc[435,’Married’] = ‘No’

为模型开发准备数据

数据分为训练集和测试集。

图 8。测试列车概念。作者使用 MS Excel 开发的图像。

## Define X and Y variablesX = cr_df.drop([‘Loan_Status’], axis=1)
Y = cr_df[[‘Loan_Status’]]#Convert categorical vriables to dummy variables
X = pd.get_dummies(X, drop_first=True)##Split into training and test setfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.30,random_state=1)from sklearn.metrics import confusion_matrix, recall_score, precision_score, f1_score, roc_auc_score, accuracy_score, log_loss
from sklearn.linear_model import LogisticRegressionlogreg = LogisticRegression(random_state=42);logreg.fit(X_train, y_train)

让我们检查一下测试数据的准确性。

y_predict = logreg.predict(X_train) # — — — — — — — — -Prediction here are 0s and 1s# — — — — — — — to get probability values use this snippety_predict_prob = logreg.predict_proba(X_train)confusion_matrix(y_train,y_predict)#-----------------------------------Regression Score--------------------------------------
print("Trainig accuracy",logreg.score(X_train,y_train))  
print()print("Testing accuracy",logreg.score(X_test, y_test))
print()print("Recall:",recall_score(y_train,y_predict))
print()print("Precision:",precision_score(y_train,y_predict))
print()print("F1 Score:",f1_score(y_train,y_predict))
print()print("Log Loss:",log_loss(y_train,y_predict))
print()

使用解算器、正则化和类权重微调模型

在构建逻辑回归时,我们需要考虑三个可用于提高准确性的参数。这包括解算器(如牛顿-cg、lbfgs、liblinear、sag(随机平均梯度下降)、saga、正则化器(这是 L1 和 L2 罚函数,用于说明较高数量的变量并防止过度拟合)和正则化器的罚函数。我们还可以微调类平衡,以解决数据中的不平衡。下面的代码使用的默认求解器是 lbfgs,惩罚为“l2”,平衡的类权重,惩罚值为 25%。

#Therefore final model is
model = LogisticRegression(random_state=42,penalty=’l2', class_weight=’balanced’,C=0.25)model.fit(X_train, y_train)y_predict = model.predict(X_test)print(“Trainig accuracy”,model.score(X_train,y_train)) 
print()
print(“Testing accuracy”,model.score(X_test, y_test))
print()print(‘Confusion Matrix’)print()
print(“Recall:”,recall_score(y_test,y_predict))
print()
print(“Precision:”,precision_score(y_test,y_predict))
print()
print(“F1 Score:”,f1_score(y_test,y_predict))
print()
print(“Roc Auc Score:”,roc_auc_score(y_test,y_predict))

[## sklearn.linear_model。逻辑回归-sci kit-学习 0.23.2 文档

逻辑回归(又名 logit,MaxEnt)分类器。在多类的情况下,训练算法使用一对其余…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)

关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;你可以在 LinkedIn Twitter上和我联系。