TowardsDataScience-博客中文翻译-2020-五-
TowardsDataScience 博客中文翻译 2020(五)
5 sci kit-学习必须知道的隐藏宝石

数据生成器、管道、验证曲线等
尽管 Scikit-learn 是机器学习中的一个主要部分,但许多人并不知道或没有使用该库中一些最有用的隐藏宝石。这里是 Scikit-learn 最有用的五个隐藏的宝石。
数据集生成器
Scikit-learn 有大量的数据集生成器,可用于创建具有不同复杂性和形状的人工数据集。
例如,make_blobs函数创建“斑点”或数据簇,具有任意数量的样本、中心/簇和特征/维度。
X和y的值为:
当X根据标签y被图形化和着色时,数据的形状可以被可视化:

Scikit-learn 具有许多其他数据集创建功能:

make_moons(n_samples=100, noise=0.1)make_circles(n_samples=100, noise=0.05)make_regression(n_samples=100, n_features=1, noise=15)make_classification(n_samples=100)
管道
管道允许将各种方法合并到一个单一的模型中。在自然语言处理(NLP)应用中尤其如此,这些应用需要需要标准化或规范化的矢量器或数据。可以通过将几个模型组合在一起来创建管道,在管道中,数据按顺序流经聚合模型。它具有标准的拟合和预测能力,使训练过程更有组织性。
各种对象可以放入一个管道中:
- 估算者。你有丢失的数据吗?试试简单的估算器或 KNN 估算器。
- 编码器。如果您的数据是非二进制分类数据,您可能需要使用标签编码器或一次性编码器。
- NLP 矢量器。如果您正在处理 NLP 数据,请使用计数矢量器、TD-IDF 矢量器或哈希矢量器。
- 数值转换。尝试标准化器、规格化器和最小-最大缩放器。
网格搜索
机器学习中的一个常见任务是在模型中找到正确的参数集。通常,人们可以根据他们对任务和模型的了解进行猜测,或者通过编程找到最佳的集合。sklearn有一个内置函数——GridSearchCV——自动为您找到最佳参数集,以优化模型性能。
GridSearchCV对象接受两个参数:首先,要训练的模型对象(在这种情况下是支持向量机分类器),其次,描述模型参数的字典。字典中的每个键都是模型中的一个参数,其中每个值都是一个相应的值列表或元组,参数可以在其中取值。
在网格搜索对象被拟合之后,best_params_属性可用于输出每个模型参数的最佳性能参数值。其他模型参数包括决策树中的树深度和随机森林集合中的投票者数量。
验证曲线
为了可视化参数对模型性能的影响,使用sklearn的validation_curve。它接受几个参数:模型、要调整的参数、参数值的范围以及折叠次数。它类似于对一个变量的网格搜索,可以帮助更好地可视化参数变化的结果。
validation_curve对象的输出是一个元组——一个是训练分数,另一个是测试分数。每个中的行数代表每个参数值的数组值,而数组中的每个元素代表每个 k 折叠的值。
当绘制结果时,参数和精度之间的关系是清楚的。

这使我们可以直观地看到树的深度对精确度的影响。比如说。请注意,树深度为 5 或树深度为 6 时表现相当好。进一步指定树的深度会导致过度拟合,但是需要根据测试精度来评估这一点。
k 倍交叉验证
交叉验证是一种比标准的train_test_split方法给出更准确结果的方法(实际上需要更少的代码!).在传统的训练-测试-拆分中,数据被随机分为训练集和测试集(通常比例为 7:3–8:2),模型在训练集上接受训练,在测试集上进行评估,以真正衡量模型的测量能力,而不仅仅是记忆能力。但是,由于每次分割都是随机的,将数据分割十次将产生十种不同的精度。
为了解决这个问题,使用 k 个折叠的交叉验证将数据分成 k 个类别,在 k 个折叠上训练模型,并在剩余的 1 个折叠上进行测试。重复这一过程后,每个测试折叠最终覆盖整个数据集,人们会对准确性有一个更完整和诚实的看法。更好的是,不需要跟踪 x-train、x-test、y-train 和 y-test 变量。交叉验证的唯一缺点是需要更多的时间——但是更好的结果总是有更高的成本。
感谢阅读!
希望这些 sci-kit learn 隐藏的宝石能够让你的机器学习编码更好。
其他人都知道的 LSTM 和 GRU 的 5 个秘密
力学解释了强大的视觉效果和一个有趣的故事
我们解释了为什么长短期记忆(LSTM)在处理苹果、谷歌、脸书和亚马逊的序列数据时如此有效和流行。

Peggy Choucair 在 Pixabay 上的照片
秘密 1 — LSTMs 极大地改善了超过 40 亿部 Android 手机上的语音识别(自 2015 年年中以来)。
发明 LSTM 是因为 RNNs 有严重的内存泄漏。
之前,我们介绍了递归神经网络(RNNs) ,并演示了它们如何用于情感分析。
【RNNs 的问题是长时间记忆。例如,他们能够预测句子“云在……”中的下一个单词“sky ”,但是他们不能预测下一个句子中遗漏的单词:
“她在法国长大。现在她只在中国呆了几个月。她说得很流利……”
随着这种差距的扩大,rnn 变得无法学习连接信息。在这个例子中,最近的信息表明,下一个单词可能是一种语言的名称,但如果我们想缩小语言的范围,我们需要更早的法国的上下文。在自然语言文本中,相关信息和需要它的点之间的差距是完全可能非常大的。这在德语中也很常见。

图片改编自 FB 工程博客上的 Tejas Patil
为什么 rnn 对于长序列有巨大的问题?通过设计,RNNs 在每个时间步接受两个输入:一个输入向量(例如,来自输入句子的一个单词),和一个隐藏状态(例如,来自先前单词的记忆表示)。
下一个 RNN 步骤采用第二个输入向量和第一个隐藏状态来创建该时间步骤的输出。因此,为了捕捉长序列中的语义,我们需要在许多时间步骤上运行 RNNs,将展开的 RNN 变成非常深的网络。
一个有趣的和有插图的指南来理解直觉。
towardsdatascience.com](/recurrent-neural-networks-explained-ffb9f94c5e09)
长序列并不是 rnn 的唯一麻烦。就像任何非常深的神经网络一样,RNNs 受到消失和爆炸梯度问题的困扰,因此永远需要训练。已经提出了许多技术来缓解这个问题,但是它们不能消除它:
- 小心初始化参数,
- 使用像 ReLU 这样的不饱和激活函数,
- 应用批量标准化、渐变裁剪、丢失,
- 使用截断的反向传播。
这些变通方法仍然有其局限性。此外,除了长的训练时间之外,长时间运行的 RNNs 面临的另一个问题是这样的事实,即第一次输入的记忆逐渐消失。
过了一会儿,RNN 的状态实际上不包含最初输入的痕迹。例如,如果我们想对一个以“我喜欢这个产品”开始的长评论进行情感分析,但是评论的其余部分列出了许多可以使产品变得更好的事情,那么,RNN 将逐渐忘记第一个积极的情感,并将评论完全误解为消极的。
为了解决这些 RNNs 问题,在研究中引入了各种类型的具有长期记忆的细胞。实际上,基本的 rnn 已经不再使用,大部分工作都是使用所谓的长短期记忆(LSTM)网络完成的。它们是由 S. Hochreiter 和 J. Schmidhuber 发明的。
秘密 2——自 2016 年 11 月以来,LSTMs 通过谷歌翻译极大地改善了机器翻译。
LSTM 的一个重要概念是星门。
每一个 LSTM 细胞都控制着记忆什么,忘记什么,以及如何用门来更新记忆。通过这样做,LSTM 网络解决了爆炸或消失梯度的问题,以及所有其他前面提到的问题!
下图描述了 LSTM 细胞的结构。
h 是隐藏状态,代表短时记忆。 C 是细胞状态,代表长期记忆和 x 是输入。
门仅执行少量矩阵变换、 sigmoid 和 tanh 激活,以便神奇地解决所有 RNN 问题。
在接下来的章节中,我们将通过观察细胞如何遗忘、记忆和更新记忆来探究这是如何发生的。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
有趣的故事
让我们在一个有趣的情节中探索这个图表。假设你是老板,你的员工要求加薪。你会同意吗?嗯,这取决于,比方说,你的精神状态。
下面我们认为你的大脑是 LSTM 细胞 T21,无意冒犯你的闪电大脑。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
你的长期状态会影响你的决定。平均来说,70%的时候你心情很好,你还有 30%的预算。因此你的单元格状态是 C =[0.7,0.3]。
最近,事情对你来说真的很好,以 100%的概率提升你的好心情,并且你有 100%的高概率剩余运营预算。这就把你的隐藏状态变成了 h =[1,1]。
今天,发生了三件事:你的孩子在学校考试中取得了成功,尽管你的老板给了你一个难看的评语,但是你发现你仍然有足够的时间来完成这项工作。所以,今天的输入是 x =[1,-1,1]。
根据这个评估,你会给你的员工加薪吗?
秘密 3—脸书每天进行超过 40 亿次基于 LSTM 的翻译。
LSTM 通过使用遗忘门来遗忘。
在上述情况下,你的第一步可能是弄清楚今天发生的事情(输入 x )和最近发生的事情(隐藏状态 h )将如何影响你对情况的长期看法(单元格状态 C )。忘记盖茨控制着多少过去的记忆被保留。
在收到你的员工的加薪请求后,你的遗忘门会运行下面的 f_t 的计算,其值最终会影响你的长期记忆。
下图中显示的权重是为了便于说明而任意选择的。它们的值通常是在网络训练期间计算的。结果[0,0]表示清除(完全忘记)你的长期记忆,不要让它影响你今天的决定。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
秘密 4-Siri 是 LSTM 的,自 2016 年以来,它基于近 20 亿部 iPhones。
LSTM 记得使用输入门。
接下来你需要决定最近发生了什么(隐藏状态 h )和今天发生了什么(输入 x )的哪些信息你要记录在你的长观情境(单元格状态 C )中。LSTM 通过使用输入门来决定要记住什么。
首先,您将计算您的输入门值 i_t ,由于 sigmoid 激活,该值介于 0 和 1 之间。
接下来,您将使用 tanh 激活在-1 和 1 之间缩放您的输入。
最后,您将通过将两个结果相加来估计新的单元格状态。
结果[1,1]表明,根据最近和当前的信息,你 100%的心情很好,并且很可能有可操作的预算。这对你的员工来说很有希望。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
秘密 5——亚马逊的 Alexa 的答案都是基于 LSTMs 的。
LSTM 利用细胞状态保持长期记忆。
现在,你知道最近发生的事情会如何影响你的状态。接下来,是时候根据新的理论更新你对形势的长期观点了。
当新的值进来时,LSTM 决定如何更新它的存储器,再次通过使用门。门控的新值被添加到当前存储器中。这种加法运算解决了简单 rnn 的爆炸或消失梯度问题。
LSTM 将相加来计算新的状态,而不是相乘。结果 C_t 被存储为情况的新的长期视图(单元状态)。
数值[1,1]表明你总的来说 100%的时间心情都很好,并且 100%的可能性一直有钱!你是完美的老板!

资料来源:哈佛大学 P. Protopapas 教授的讲稿
基于这些信息,你可以更新你对局势的短期看法 h_t (下一个隐藏状态)。值[0.9,0.9]表示您有 90%的可能性在下一个时间步增加员工的工资!恭喜他!

资料来源:哈佛大学 P. Protopapas 教授的讲稿
门控循环单元
LSTM 细胞的一种变体被称为门控循环单位,或 gru。GRU 是由 Kyunghyun Cho 等人在 2014 年的一篇论文中提出的。
GRU 是 LSTM 细胞的简化版本,可以比 LSTM 快一点,它似乎表现类似,这解释了它越来越受欢迎。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
如上所示,两个状态向量合并成一个向量。单个门控制器控制遗忘门和输入门。如果门控制器输出 1,则输入门打开,遗忘门关闭。如果它输出 0,就会发生相反的情况。换句话说,每当一个存储器必须被存储时,它将被存储的位置首先被擦除。
没有输出门;在每个时间步输出完整的状态向量。但是,有一个新的门控制器,它控制先前状态的哪一部分将显示给主层。
堆叠 LSTM 细胞
通过排列多个 LSTM 细胞,我们可以处理序列数据的输入,例如,下图中的 4 个单词的句子。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
LSTM 单元通常按层排列,因此每个单元的输出都是其他单元的输入。在本例中,我们有 2 层,每层有 4 个单元。这样,网络变得更丰富,捕捉到更多的依赖。
双向 LSTM
RNNs、LSTMs 和 GRUs 旨在分析值的序列。有时以相反的顺序分析序列是有意义的。
例如,在句子“他需要更努力地工作,老板说关于雇员。”,虽然“他”出现在最开始,但它指的是最后提到的员工。
因此,顺序必须颠倒或通过向前和向后相结合。下图描述了这种双向架构。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
下图进一步说明了双向 LSTMs。底部的网络以原始顺序接收序列,而顶部的网络以相反的顺序接收相同的输入。两个网络不一定完全相同。重要的是,它们的输出被组合用于最终预测。

资料来源:哈佛大学 P. Protopapas 教授的讲稿
进一步阅读
正如我们刚刚解释的,LSTM 细胞可以学习识别重要的输入(这是输入门的作用),将它存储在长期状态中,学习在需要时保存它(这是遗忘门的作用),并学习在需要时提取它。
LSTMs 已经改变了机器学习,现在可以通过世界上最有价值的上市公司,如谷歌、亚马逊和脸书,向数十亿用户提供。
如果你想知道更多关于 LSTMs 和 GRUs 的信息,请查看这篇文章中迈克尔·阮的精彩动画。对于那些喜欢从零开始建造自己的 LSTM 的人来说,这篇文章可能有用。
LSTM 网络在 Python 中的实际实现可以在我下面的文章中找到。
递归神经网络解释。使用 FCNNs、CNN、RNNs 和嵌入对客户评论进行分类。
towardsdatascience.com](/sentiment-analysis-a-benchmark-903279cab44a)
基于注意力的序列到序列模型和变压器超越了 LSTMs,最近在谷歌的机器翻译和 OpenAI 的文本生成方面取得了令人印象深刻的成果,让人们感到惊讶。你可能想看看这个博客或者我下面的文章来了解更多。
测试动手策略以解决注意力问题,从而改进序列到序列模型
towardsdatascience.com](/practical-guide-to-attention-mechanism-for-nlu-tasks-ccc47be8d500)
使用 BERT,FastText,TextCNN,Transformer,Se2seq 等文本分类的综合实现。可以在这个 GitHub 库上找到,或者你可以查看我的关于 BERT 的教程。
变压器 DIY 实用指南。经过实践验证的 PyTorch 代码,用于对 BERT 进行微调的意图分类。
towardsdatascience.com](/bert-for-dummies-step-by-step-tutorial-fb90890ffe03)
感谢《走向数据科学》的 Anne Bonner 提供的编辑注释。
5 个以上简单的一行程序来提升您的 Python 可视化水平

来源: Unsplash
最小的努力,最大的收获
富有洞察力和美感的视觉化设计不一定是一种痛苦的创造。本文将介绍 5 个以上简单的一行程序,您可以将它们添加到代码中,以增加代码的风格和信息价值。
折线图绘制成面积图
考虑下面的标准线图,用 seaborn 的lineplot创建,使用husl调色板和whitegrid风格。数据生成为正弦波,数据呈正态分布,并高于 x 轴。

几个造型的选择,情节看起来像样。然而,有一个问题:默认情况下,Seaborn 不是从零基线开始,并且失去了对 y 轴的数值影响。假设x和y变量如此命名,添加plt.fill_between(x,y,alpha=0.4)将把数据变成一个面积图,更好地从基线开始,并强调 y 轴。

请注意,该行是与原始线图sns.lineplot(x,y)一起添加的,它在顶部提供了加粗的线条。出现在许多 seaborn 图中的参数alpha控制区域的透明度(越小越亮)。plt代表 matplotlib 库。在某些情况下,使用面积可能不合适。
当使用多个面积图时,它可以强调线的重叠和交叉,尽管它可能不适合可视化环境。

折线图到堆积面积图
有时,线之间的关系要求面积图相互堆叠。使用 matplotlib stackplot: plt.stackplot(x,y,alpha=0.4)很容易做到这一点。在这种情况下,颜色是通过colors=[]手动指定的,它接受一个颜色名称或十六进制代码的列表。

注意y是y1和y2的列表,分别代表有噪声的正弦波和余弦波。在面积表达中,它们相互堆叠,可以加深对两个面积地块之间相对距离的理解。
删除讨厌的图例
当调用hue参数来绘制多个相同的图时,Seaborn 通常默认使用图例,不同之处在于指定为hue的列。这些传说虽然有时很有帮助,但往往掩盖了情节的重要部分,包含了可以在其他地方更好地表达的信息(也许在标题中)。
例如,考虑下面的医疗数据集,它包含来自不同对象的信号。在这种情况下,我们希望通过将subject列设置为hue ,使用多条线图来显示不同患者的总体趋势和范围(是的,放置这么多条线被称为“意大利面条图”,通常不建议这样做)。人们可以看到默认标签是如何 a)不有序,b)太长以至于遮挡了图表的一部分,以及 c)不是可视化的点。

这可以通过将情节设置为等于一个变量(通常是g)来实现,比如:g=sns.lineplot(x=…, y=…, hue=…)。然后,通过访问绘图对象的图例属性,我们可以删除它:g.legend_.remove()。如果您正在使用 PairGrid 或 FacetGrid 之类的网格对象,请使用g._legend.remove()。

好多了。
手动 x 轴和 y 轴基线
默认情况下,Seaborn 并不绘制 x 和 y 轴线,但是这些轴线对于理解数据的形状以及它们相对于坐标系的位置非常重要。
Matplotlib 提供了一种简单的方法,通过简单地添加g.axhline(0)来添加x-轴,其中g是网格对象,0 表示水平线所在的y-轴值。此外,用户可以指定color(在本例中为color=’black’)和alpha(透明度,在本例中为alpha=0.5)。linestyle是通过设置为‘--’来创建虚线的参数。

另外,可以通过g.axvline(0)添加垂直线。
您也可以使用axhline显示平均值或基准,比如条形图。例如,假设我们想要显示基于sepal_width能够满足 0.98 petal_width基准的工厂。

对数标度
使用对数标度是因为它们可以显示百分比变化。在许多情况下,这正是必要的——毕竟,一个通常收入 300 美元的企业增加 1000 美元与一个收入数十亿美元的大型企业增加 1000 美元是不同的。matplotlib 不需要计算数据中的百分比,而是可以将比例转换为对数。
与许多 matplotlib 特性一样,对数标度在使用fig, ax = plt.subplots(figsize=(x,y))创建的标准图形的轴上运行。然后,一个对数 x 刻度就像ax.set_xscale(‘log’)一样简单:

正弦波。请注意,matplotlib 为您创建了指数符号 x 标签!
更常用的对数 y 标度可以用ax.setyscale(‘log’)来完成:

带有噪声的正弦波的 y 对数刻度,显示相对于前一时间步长的百分比变化。
荣誉奖
- 投资一个好的默认调色板。颜色是视觉效果最重要的方面之一:它将视觉效果联系在一起,表达了一个主题。你可以用
sns.set_palette(name)选择和设置 Seaborn 众多伟大调色板中的一个。点击查看选择调色板的演示和提示。 - 您可以使用
sns.set_style(name)添加网格和更改背景颜色,其中名称可以是white(默认)、whitegrid、dark或darkgrid。 - 您知道 matplotlib 和 seaborn 可以处理 LaTeX,这种漂亮的数学格式化语言吗?您可以在您的
x/y轴标签、标题、图例等中使用它,方法是将 LaTeX 表达式包含在美元符号$expression$中。 - 探索不同的线型、注释大小和字体。Matplotlib 中有很多这样的例子,只要您愿意探索它的文档页面。
- 大多数图都有附加参数,例如条形图的误差线、厚度、虚线和线形图的透明度。花些时间访问文档页面并浏览所有可用的参数可能只需要一分钟,但有可能使您的可视化具有顶级的美学和信息价值。
例如,在 violinplot 中添加参数inner=’quartile’以虚线绘制分布的第一、第二和第三个四分位数。两个词代表巨大的信息收获——我要说这是一笔好交易!

附加阅读
但是真的应该知道
medium.com](https://medium.com/analytics-vidhya/5-lesser-known-seaborn-plots-most-people-dont-know-82e5a54baea8) [## 在 Python 中创建复杂可视化的最简单方法不是使用 matplotlib。
直接从熊猫身上创造流畅简单的情节
towardsdatascience.com](/the-simplest-way-to-create-complex-visualizations-in-python-isnt-with-matplotlib-a5802f2dba92)
作者创作的所有图表。
给有抱负的数据科学家的 5 个简单提示
我的建议可以帮助你成功成为一名数据科学家

约翰·施诺布里奇在 Unsplash 上的照片
我经常有有抱负的数据科学家联系我,询问如何进入数据科学领域的建议。在这个故事中,我将回顾 5 个简单的提示,这些提示是我经常在回应这些请求时给出的。希望您能够将它们应用到您的数据科学职业探索中。
1.弄清楚你是否真的喜欢这份工作
如果你最终成为了一名数据科学家,却发现自己并不喜欢它,那么你为成为数据科学家所做的一切努力都是毫无意义的。
你可能真的很喜欢参加一系列在线课程或项目,以建立令人印象深刻的数据科学组合。这当然很好,但学习新技能和解决具有挑战性的问题确实是数据科学家的乐趣所在。如果你不喜欢向人们解释困难的概念,也不喜欢与其他团队谈判,你可能不会喜欢数据科学家的日常工作。
如果你想了解更多关于成为数据科学家的真实感受,你可以查看我的其他故事。此外,我最近写了一个数据科学项目的示例工作流。
这引出了我的第二条建议…
2.与正在做你想要的工作的人交谈
与你感兴趣领域的数据科学家坦诚交谈。如果你这样做,你更有可能获得一个数据科学家真正做什么的真实视图。
想想你梦想的数据科学工作是什么,问问你的朋友和关系网,看看是否有人认识已经在做这份工作的人。如果你有一个友好的介绍,你更有可能发现那个人乐于助人且平易近人。
当我正在努力成为一名数据科学家时,我通过朋友介绍给了几位正在工作的数据科学家。他们有学术背景,并像我希望的那样过渡到了数据科学领域。那些谈话很有帮助。我想从这些相对陌生的人那里得到的只是见见他们,简单地谈谈他们做了什么,以及他们经历了怎样的转变。他们很乐意帮忙。
在我进入这个领域的过程中,我与工作数据科学家的对话是无价的。我对自己真正想要的数据科学工作有了更多的了解。
例如,我与一位机器学习专家交谈,并意识到这不是我想要前进的方向。这不仅需要大量的专业训练,而且我对算法的本质并不感兴趣。同样,我和一位做网站分析的数据分析师聊过,发现这也不是我的兴趣所在。
然而,当我与一位参与构建数据产品的数据科学家交谈时,我的兴趣真正被点燃了。她很清楚这样一个事实,她每天大部分时间都在编写 SQL 和参加会议,而不是运行复杂的分析。然而,她对自己工作的描述更能引起我的共鸣。
我很高兴这些人如此慷慨地付出时间,以至于他们根本不认识我。从那以后,我试着把它向前推进,并和几个有抱负的数据科学家谈论我在这个领域的经历。我想写这个故事对我来说是更进一步,也是接触更多人的一种方式。
3.请人帮忙时要具体
无论是你想要的信息,还是介绍或推荐,直截了当总是最好的。明确提出你想要什么。
以我的经验来看,如果你要求别人帮一个不太难的小忙,他们很可能会帮你。我知道,当人们向我寻求帮助学习数据科学时,如果他们有我力所能及的具体要求,我更有可能会答应。如果人们含糊其辞,我发现说“是”要困难得多,因为我不知道我到底在做什么。
例如,如果有人通过朋友介绍给我,要求与我见面半小时,并问我一系列他们准备的关于成为数据科学家应该学习的技能的问题,我会倾向于说是。事实上,我已经多次这样做了。然而,如果同样的人,有着同样的介绍,要求我帮助他们成为数据科学家,我会更加不情愿。说‘帮我成为数据科学家’太含糊了。我想先知道你到底想从我这里得到什么。
4.当你不知道问题的答案时,不要害怕说出来
这对我来说是个大问题。我最讨厌的事情之一是人们假装知道或理解他们实际上不知道的事情。对谁都没有帮助。如果你不知道问题的答案,就说出来。我会对你有更多的尊重,而不是你在回答问题时笨手笨脚,说了很多又长又重要的话,但什么也没说。
更进一步,如果你只是说你不知道或者不明白,那就给了你学习的机会。可能就是你正在与之交谈的那个人。这样,下次有人问你同样的问题时,你就会知道答案,并且能够自信地给出答案。
另一种选择是说:
我不知道,但如果我必须做出一个明智的猜测,那将是…
至少这样你就有机会展示你所拥有的知识,即使你不知道问题的确切答案。
5.追随你的兴趣
有很多原因让你想从事数据科学方面的职业。但是,如果是因为钱和声望,再想想。不是说你没有好的收入和一定程度的尊重,而是如果你不热爱它,这份工作是极其令人沮丧的。
像任何种类的实验一样,并不是所有的数据科学项目都像你希望的那样进行。你也经常感激你工作的公司的其他利益相关者。你可能并不总能解决你想解决或最感兴趣的问题。相反,你更有可能不得不致力于为你的雇主提供价值的问题。
然而,如果你爱:
- 尝试不同的事物
- 学习新技能
- 与利益相关者清晰沟通
- 顽强地解决一个问题,直到你找到一个解决方案或者认为一个解决方案是不可行的
- 清理数据
- 向各种各样的人解释困难的概念
…或者,如果你至少可以每天忍受以上所有这些,那么数据科学可能是你的正确职业。
有许多不同类型的数据科学家。如果你以前从未从事过数据科学工作,找到合适的工作可能会很困难。除非你在现实生活中尝试一下,否则你不会确切知道自己在做什么。
尽管这可能会令人困惑,但我还是建议仔细考虑一下你想找什么样的数据科学工作。
例如,在金融和保险等领域有很多数据科学工作。对我来说,这种领域一点也不有趣。但是如果你对这些领域很感兴趣,那么你应该有很多数据科学的工作可以选择。
另一方面,如果你像我一样,有非常具体的兴趣领域,我会建议你坚持自己的观点,努力在那个领域找到一份工作。如果是在你感兴趣的领域,不仅更容易找到工作,而且你可能还拥有一些领域的专业知识,可以帮助你找工作。
就我个人而言,我对医疗保健、生物学、教育和教学最感兴趣。所以我只考虑过那些领域的工作。
在选择工作时,一家公司关注的实际领域对你来说可能不那么重要,尤其是如果你只是喜欢统计学和算法的话。如果是你,那么确保你专注于职位名称和描述。去做一个机器学习专家的角色,或者一些算法或统计方面的工作,否则你可能很难对自己的工作感到满意。
如果我只是在自己兴趣之外的领域工作以获取经验呢?
…你可能会问。如果你只是为了获得经验而去金融或保险公司工作,你可能会把自己局限在那个行业。你的经历可能不适合你真正想从事的领域。
然后你可能不得不重新开始过渡。
结论
我希望这五个技巧能帮助你成为一名数据科学家。这是一个美妙的职业,我真的很喜欢,但并不适合每个人。这份工作的一些真相有时会在围绕数据科学的炒作中迷失。如果你遵循我的建议,我希望它们能帮助你弄清楚数据科学是否适合你,以及你应该采取什么途径来获得你的第一份数据科学工作。
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术
数据科学家通常在工作中会做些什么?
towardsdatascience.com](/a-day-in-the-life-of-a-data-scientist-in-san-francisco-ffe32ca52d20) [## 我如何在 6 个月内从零编码技能成为数据科学家
我用来自学数据科学的 4 个工具没有花一美元
towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3)
改善你的 Kaggle 模型的 5 个简单技巧
如何在竞赛中获得高性能模型

🇨🇭·克劳迪奥·施瓦茨| @purzlbaum 在 Unsplash 上拍摄的照片
如果你最近才开始使用 Kaggle,或者你是该平台的老用户,你可能想知道如何轻松地提高你的模型的性能。这里是我在我的卡格尔之旅中积累的一些实用技巧。因此,要么构建自己的模型,要么从一个基线公共内核开始,并尝试实现这些建议!
1.总是回顾过去的比赛
虽然 Kaggle 的政策是决不会出现两次相同的比赛,但经常会出现非常相似的问题。例如,一些主持人每年提出一个相同主题的常规挑战(例如 NFL 的大数据碗),只有很小的变化,或者在某些领域(例如医学成像)有很多目标不同但精神非常相似的比赛。
因此,回顾获胜者的解决方案(由于难以置信的 Kaggle 社区,总是在比赛结束后公布)可能是一个很好的补充,因为它给你提供了开始的想法和获胜的策略。如果你有时间回顾它们,你也会很快发现,即使在非常不同的比赛中,一些流行的基线模型似乎总是做得足够好:
- 卷积神经网络或更复杂的 ResNet 或 EfficientNet 在计算机视觉挑战,
- 音频处理中的 WaveNet 挑战(如果你只使用 Mel 频谱图,这也可以通过图像识别模型很好地处理),
- BERT 及其衍生物(RoBERTa 等)在自然语言处理挑战,
- 在表格数据上的光梯度增强方法(或其他梯度增强或树策略)…
你既可以直接在 Kaggle 平台上寻找类似的比赛,也可以看看Sundalai Raj Kumar的这篇很棒的总结。
回顾过去的比赛也可以帮助你得到以下解释的所有其他步骤的提示。例如,获得关于类似问题的预处理的提示和技巧,人们如何选择他们的超参数,他们在他们的模型中实现了哪些额外的工具以使他们赢得比赛,或者他们是否专注于只打包他们的最佳模型的类似版本,或者更确切地说是集合了所有可用公共内核的熔炉。
2.你永远不会在数据准备上花足够的时间
这还远不是这份工作最激动人心的部分。然而,这一步的重要性怎么强调都不为过。
- 清理数据:永远不要认为主机为你提供了尽可能干净的数据。很多时候,是错的。填充异常值,移除异常值,将数据分成同类观测值的类别…
- 做一些简单的探索性数据分析,对你正在做的事情有一个大致的了解(这将帮助你获得洞察力和想法)。这是现阶段最重要的一步。如果对数据的结构、所拥有的信息以及目标个体或集体的一般行为特征没有正确的认识,您将会盲目行事,对如何构建模型没有任何直觉。绘制图表、直方图、相关矩阵。
- 扩充你的数据:这可能是提高性能的最好方法之一。但是注意不要把它做得太大,以至于你的模型不能再处理它了。你可以在互联网上找到一些额外的数据集(非常小心权利,否则你可能会遭受与 100 万美元 Deepfake 检测挑战赛获胜者相同的命运),或者在 Kaggle 平台上(在过去类似的比赛中!),或者只是处理提供给你的数据:翻转和裁剪图像,叠加录音,回译或替换文本中的同义词…
预处理也是你必须仔细考虑你将依赖什么交叉验证方法的步骤。Kaggle 的座右铭基本上可以是:相信你的简历。处理你的数据将帮助你知道如何分割它:根据目标值还是样本类别分层?你的数据不平衡吗?如果你有一个聪明的简历策略,并且完全依赖它而不是排行榜分数(尽管它可能非常诱人),那么你很有可能在私人最终分数上获得惊喜。
3.尝试超参数搜索
超参数搜索可帮助您找到模型应该具有的最佳参数(学习速率、softmax 的温度等),以便获得最佳性能,而无需手动运行一千次枯燥的实验。
最常见的超参数搜索策略包括:
- 网格搜索(请不要这样做) :我认为最差的执行方法,因为您可能完全错过某个模式或某些值的非常局部的性能峰值,它包括测试平均分布在您定义的可能值区间上的超参数值;
- 随机搜索(及其蒙特卡洛衍生物) :你尝试你的参数的随机值。它的主要问题在于,它是一种并行方法,测试的参数越多,成本就越大。但是,它有一个优点,使您能够在测试中包括先验知识:如果您想找到 1e-4 和 1e-1 之间的最佳学习速率,但您假设它必须在 1e-3 左右,您可以从以 1e-3 为中心的对数正态分布中抽取样本。
- 贝叶斯搜索:基本上是随机搜索,但经过改进,因为它是迭代的,因此成本更低。它基于当前模型迭代地评估有希望的超参数配置,然后更新它。这是三个中表现最好的。
- 其他方法包括基于梯度的搜索或进化优化更加危险,一般不适用。在某些特殊情况下可以推荐使用。
有许多自动化工具可以很好地为你完成这项工作。让我们来看看关于这个话题的优秀媒体&数据资源:
- https://towards data science . com/how-to-beat-automl-hyperparameter-optimization-with-flair-3b2f 5092 d9f 5
- https://towards data science . com/automated-machine-learning-hyperparameter-tuning-in-python-dfda 59 b 72 f 8 a
- https://medium . com/@ marts alz/automl-hyperparameter-tuning-with-nni-and-keras-ffbef 61206 cf
但是,您必须小心,并对超参数值的含义保持坚定的直觉。如果没有可靠的验证集和同质数据,过度的超参数优化可能会导致过度拟合。总是更喜欢一些合理解释的参数选择,而不是在训练数据上取得小数精度。
4.简单的练习可以改变游戏
我发现有一些模型包装器可以用来获得更好的结果。他们在不同的层面上工作:
- 在优化过程中,永远不要忘记添加一个学习率调度器,它有助于获得更精确的训练(从小规模开始,当您的模型学习良好时逐步增加,例如减少平台上的步骤)。
- 仍然在优化过程中,您可以将 Lookahead 包装在您的优化器周围;前瞻算法包括向前进行 k 个优化步骤,找到性能最佳的地方,然后向最优方向后退一步,并从那里重新开始训练。理论上你会得到更好的性能,尽管我从未发现这是真的;但是它稳定了训练,这在你的数据非常嘈杂的时候很好。
- 在开始训练之前,为你的权重找到一个好的初始化:如果你正在使用一个流行的架构,从基线权重开始(如图像识别中的 ImageNet ,如果没有,尝试层顺序单元方差初始化(LSUV,最好的可能初始化——理论上)。它包括将您的权重初始化为正交,以及所有可训练层的单位方差。
- 最后,我经常发现从神经网络的最后一层权重训练一个 LGBM,而不是添加一个 softmax 作为输出层,可以出奇地好。
5.包,包,包,包!
除了数据扩充,可能没有比混合(也称为打包)更有效的技术来提高您的性能。
我的个人建议是,我总是保存我运行的每一个模型预测,包括我的折叠和最终模型,并对它们进行平均(只是基本的平均,我从未发现任何证据表明“聪明”的组合,如根据模型的独奏表现加权模型,会增加最终得分)。不要忘记混合公共内核。
你的组合策略中有越多的模型,你就越有可能在私人排行榜变动中幸存下来。事实上,使你的模型多样化会使你的最终结果更加稳健。这与金融中一个潜在的投资组合多样化的想法是一样的:不是一种具有给定回报和给定方差的资产,而是许多具有相同回报和相同方差的不同资产,因为它们同时减少的可能性要小得多,一种资产的损失将由其他资产的盈利来补偿。同样的想法,不要只依赖一个模型,让很多不同的模型投票:它们中的大多数预测的目标(在分类中)或每个预测的目标的平均值(在回归中)将很可能更接近真实的答案。
希望你喜欢这篇文章,感谢 theo Viel 的评论。
建立时间序列预测模型的 5 个简单步骤
从数据准备到模型评估—关于构建简单的预测模型,您只需知道这些

我坚信“边做边学”的哲学。
数据科学是一个应用领域,所以你需要尝试学习一些东西。人们可以阅读所有关于游泳的“如何做”的教程,但在某些时候,他们必须测试水。
数据科学的初学者经常陷入这样一种印象:在做一个项目之前,他们必须学习世界上所有的东西。错了!我相信人们可以通过做一些小事情而不是阅读来学得更快。
在这篇文章中,我想让你学习如何拟合时间序列预测模型 ARIMA——对许多人来说,这是一个令人生畏的算法。在这篇文章中,你将通过 5 个简单的步骤学会它,并做出真正的预测。你不会造一辆法拉利,但我相信你会学会造一辆可以上街的车。
让我们卷起袖子。
步骤 1:数据准备
对于这个演示,我们将在 R 编程环境中使用一个名为fpp2的预测包。让我们装载那个包裹。
# Required packages
library(fpp2)
我从一个真实的时间序列中提取了一些数据。下面是这些值,让我们也把它们复制到 R 脚本中。
# your data
values = c(92.1, 92.6, 89.5, 80.9, 95.6, 72.5, 71.2, 78.8, 73.8, 83.5, 97.9, 93.4, 98.0, 90.2, 96.7, 100.0, 103.6, 74.6, 78.9, 92.0, 83.4, 98.1, 109.9, 102.2, 102.1, 96.2, 106.9, 95.1, 113.4, 84.0, 88.6, 94.9, 94.7, 105.7, 108.6, 101.9, 113.9, 100.9, 100.2, 91.9, 99.6, 87.2, 92.1, 104.9, 103.4, 103.3, 103.9, 108.5)
像其他建模软件一样,这个软件包有特定的数据格式要求。ts()函数通过将数据转换成时间序列对象来处理这个问题。
在此函数中,我们指定起始年份(2015 年)和 12 个月的频率。
# your time series
time_series = ts(values, start = 2015, frequency =12)
步骤 2:时间序列分解
分解基本上意味着将系列分解和可视化为其组成部分。
# time series decomposition
autoplot(decompose(time_series)) + theme(plot.title = element_text(size=8))
下图显示了 4 条信息:您的数据(顶部一条)、总体趋势和季节性。最后一块被称为余数或随机部分。

时间序列分解
第三步:建模
实际的模型构建是一个简单的使用auto.arima()函数的 2 行代码。auto.arima会照顾到最佳的参数值,你只需要指定几个布尔参数。
model = auto.arima(time_series, seasonal = TRUE, stepwise = FALSE, approximation = FALSE)
第四步:预测
做一个实际的预测是上面所有步骤中最简单的,仅仅是半行代码的长度——你能相信吗?我们正在使用forecast()函数,传递上面的模型,并指定你想要预测的未来的时间步数(我指定的是未来 30 个月)
# making forecast
forecast_arima = forecast(model, h=30)
你实际上已经完成了预测。您可以使用print(forecast_arima)功能打印预测值。

预测值
或者,您可能希望将预测值、输入序列和置信区间一起可视化。
# visualizing forecast
autoplot(time_series, series = " Data") +
autolayer(forecast_arima, series = "Forecast") +
ggtitle(" Forecasting with ARIMA") +
theme(plot.title = element_text(size=8))

用 ARIMA 预测
第五步:模型评估
这是模型评估和准确性测试的额外步骤。首先,让我们看看模型描述:
# model description
model['model']
我强调了一些你可能感兴趣的东西:模型的描述(ARIMA(0,1,2(0,1,1)[12])和 AIC 值。AIC 通常用于比较两个或多个模型的性能。

在大多数机器学习模型中,精度是基于 RMSE 或 MAE 值来确定的。我们也把它们打印出来吧。
# accuracy
accuracy(model)

仅此而已!
后续步骤
您刚刚使用 5 个简单的步骤构建并实现了一个预测模型。这是否意味着你成为了预测大师?不,但是你从头到尾都知道模型的整体结构,并且能够用不同的数据集、不同的参数值等来处理它。
就像我一开始说的,你没有造出一辆法拉利,但是你造出了一辆可以带到杂货店的车!
数据科学家应该学习的 5 项技能
有哪些数据科学家在网络课程或大学里学不到的?了解这 5 项技能的基本知识将会让你在职场中领先。

W 当我开始实践数据科学时,我还没有过多考虑在 Jupyter 笔记本之外使用机器学习模型。我的想法是“这个模型达到了很高的分类精度,所以我在这里的工作已经完成了”。通过指导初级数据科学家,我注意到这种心态非常普遍。实际上,Jupyter 笔记本中的模型对公司来说没什么用处。将模型从笔记本转移到现实环境需要几个步骤。这是许多初级数据科学家的不足之处(不仅仅是初级!)—所以不要像他们一样,至少学习这 5 个技能的基础。
机器学习正在发展——它不再仅仅是数学和统计学
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
继续阅读
这篇文章现在发表在 AIgents 的博客上:数据科学家应该学习的 5 项技能。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

照片由Courtney hedge在 Unsplash 拍摄
成为数据科学顾问所需的 5 项技能
为数据科学咨询职业发展的软技能

资料来源:Freepik
咨询行业的一个著名观点是“数据科学与科学无关!”。当我们第一次听到这个概念时,听起来有点奇怪,因为毕竟,数据科学在机器学习和统计学等高度理论化的领域有着重要的路线。但也许这个概念想要指出的是,咨询行业的数据科学不仅仅是使用统计方法或机器学习。
当然,数据科学是一个高度跨学科的领域,结合了机器学习、统计数据分析、商业分析和软件工程。但是有一些隐藏的软技能,一个人需要在作为数据科学顾问的工作中取得成功。在这里,我们讨论这些软技能:
1)面对客户的技巧
面对客户的技能比你想象的更重要。通常在咨询行业,你必须与客户密切互动,或者至少帮助你的上司这样做。因此,你需要有一个管理顾问的心态,理解&管理业务需求,有效地与项目和客户利益相关者沟通,并提出可操作的见解&建议。
2)管理咨询技能
一个高素质的管理顾问拥有许多数据科学家经常忽略的技能。通常,当顾问与客户互动时,不管他们的能力如何,都需要一些特定的语言和沟通方式。管理顾问解决问题、创新和商业分析的方法是独特的,而且大多只在商学院教授。因此,在咨询行业工作的数据科学家要么必须回到商学院学习 MBA,要么在工作中学习这些技能。虽然前一种选择可能看起来很有吸引力,但经验表明,在世界级的咨询公司工作提供了一个增长管理咨询技能的独特机会。
3)敏捷思维
敏捷项目管理和交付是当今全球公认的标准。在几乎所有的数据科学咨询项目中,都在使用敏捷软件开发方法。因此,敏捷思维和在像 Scrum 这样的软件项目管理方法论中的操作是必要的。
敏捷思维对于有学术背景的数据科学家来说尤其重要,因为学术界和咨询行业在运营项目方面存在巨大差距。因此,直接从学术界过渡的数据科学顾问需要快速经历一个学习曲线,以适应新的工作环境。
4)解决问题的方法
在大多数数据科学咨询项目中,业务需求和项目范围给交付团队带来了非常紧迫的时间表。因此,团队需要与项目干系人和敏捷团队紧密合作,开发实用的解决方案。在概念验证项目中,从项目启动到最低可行产品的最终交付,这段时间被限制在大约 2-3 个月。通常,在这些情况下,没有空间一次性提供复杂的解决方案,也没有空间完全隔离项目团队。
来自学术背景的新聘用的数据科学顾问需要注意,他们对业务问题的解决方案需要简单、实用且可解释。解决方案的软件代码需要具有高质量,并且易于与现有的软件生产环境集成。
5)个人品牌
对于年轻的数据科学顾问来说,个人品牌可能听起来有点不必要,因为数据科学顾问不是销售团队的一部分,也不具备需要强大个人品牌的类似能力。我们需要承认,咨询公司的核心商业模式是为客户提供高素质的人才来解决特定的商业问题。高层管理人员和咨询公司的销售团队要求这些人才在客户面前是体面的。因此,数据科学顾问围绕特定的利基专业知识创建一个可展示的个人资料是极其重要的。为了在咨询行业取得成功,数据科学顾问需要创建个人品牌,并在公司内部和潜在客户面前有效地展示自己。
关于作者:
Pouyan R. Fard 是 Fard 咨询公司的首席执行官兼首席数据科学家。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与制药、汽车、航空、运输、金融、保险、人力资源和销售等行业的财富 500 强公司合作。
Pouyan 也在指导活跃在大数据行业的初创公司和人才。他的热情是通过职业培训培养下一代数据科学家,并帮助他们找到数据科学领域的顶级工作机会。
Pouyan 已经完成了关于消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。
面向现代开发人员的 5 个平滑 Python Web 框架
5 个更棒的 Python Web 框架供你欣赏!

(python logo src =http://python.org
大约一个月前,我写了一篇短文,重点介绍了我最喜欢的 Flask 和 Django 的老式轻量级替代方案,我喜欢用它们来部署端点。虽然这肯定是一些伟大的 web 框架的列表,但它们更以轻量级为中心,比可能吸引现代 Python 数据科学家或开发人员的选项更过时。由于这篇文章,我收到了几个惊人的回复,启发我使用 Python 部署端点的更好的选择。其中一些我很熟悉,但另一些对我来说是全新的,尝试这些新模块并使用它们的酷功能是令人兴奋的!如果你想阅读之前的文章,这里是:
[## 用于部署端点的 Django 和 Flask 的 5 个很酷的替代方案
不用 Flask 或 Django 部署 API 的有用框架。
towardsdatascience.com](/5-cool-alternatives-to-django-and-flask-for-deploying-endpoints-5c99a066696)
№1: FastAPI

(https://fastapi.tiangolo.com/的 src =
从我们的列表开始是一个 web 框架,它遵循与我喜欢的许多模块相同的方法。FastAPI 是一个 Python web 框架,专注于轻量级和快速性。我真正喜欢 FastAPI 的一点是它的开发是如此的快速和简单。这对于端点特别有用,因为除了逻辑之外通常没有什么,而且你很可能不需要 Django 或 TurboGears 之类的东西来创建。
FastAPI 也有很棒的文档,很容易学习。考虑到它的易用性和简单性,这一点尤为重要。FastAPI 中的“快”既代表了开发 API 的速度,也代表了这些 API 的返回速度。它还基于为 API 创建而精心编排的开放标准,因此与其他 web 框架类似,您可以在一个方便的包中获得传输数据可能需要的所有工具。
至于语法,FastAPI 采用了一种非常类似 Flask 的方法来创建端点。这是有充分理由的,因为 Flask 是另一个框架,它在保持事物特别小的同时又非常灵活。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
№2:龙卷风

https://www.tornadoweb.org/en/stable/(src =
Tornado 不仅是一个伟大的 web 框架,而且还是一个异步网络库。凭借这一特性,Tornado 能够为数千个开放连接提供服务。这是因为 tornado 使用非阻塞网络进出流。这使得 Tornado 对于需要庞大和可扩展的解决方案非常有用!
Tornado 实际上与大多数其他 Python web 框架有很大不同,因为它不在 WSGI 上运行。虽然这意味着您在网络服务器选项上可能会受到一些限制,但 Tornado 自带预打包的服务器,可以让您立即启动并运行。虽然我很喜欢 Tornado,但要注意的是,当我试图用 NGINX 部署它时,我确实遇到了更多的错误,在某些时候,让 NGINX 路由到正确的位置是非常令人沮丧的。我在用 Genie for Julia 时也遇到过这个问题,所以我不确定是什么原因造成的,但是如果你在用 Tornado,那么你可能想试着设置一个 Apache 服务器,而不是 NGINX 服务器。
在语法方面,Tornado 采用了一种非常类似涡轮的路由方法。使用 Tornado,而不是将逻辑放入路由中,您通常会构建类来处理这些路由上的响应,就像他们文档中的这个示例:
**import** **tornado.ioloop**
**import** **tornado.web**
**class** **MainHandler**(tornado.web.RequestHandler):
**def** get(self):
self.write("Hello, world")
**def** make_app():
**return** tornado.web.Application([
(r"/", MainHandler),
])
**if** __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
№3:金字塔

(src =https://trypyramid.com/
金字塔是我主观上非常喜欢使用的网络框架之一。金字塔有什么了不起的?虽然 Pyramid 坚持轻量级思想,并提供了用最少的代码快速创建端点的非常简单的方法,但它也包括了如果您打算扩大操作规模时可能需要的所有功能。
金字塔吹捧的最大好处之一是可伸缩性。金字塔既可以是基本的,也可以是复杂的,这可能会吸引那些希望在未来扩展其端点的数据科学家。从语法上来说,Pyramid 和 Tornado 的方法论差不多。它一直遵循面向对象的范例,这可能是一件好事,也可能是一件坏事。
**from** wsgiref.simple_server **import** make_server
**from** pyramid.config **import** Configurator
**from** pyramid.response **import** Response
**def** **hello_world**(request):
**return** Response('Hello World!')
**if** __name__ == '__main__':
**with** Configurator() **as** config:
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
№4:夸

(https://pgjones.gitlab.io/quart/的 src =
不要让夸脱的标志欺骗了你,它与模块闪光灯的关系比与瓶子的关系更大。Quart 本质上是放入一个模块中两个 web 框架的组合:
阿辛西奥和弗拉斯克。
这是一件奇妙的事情,因为这两者的结合是一个致命的组合!Quart 是轻量级的,就像 Flask 一样,但是也包含了一个完整的异步特性列表,您可能会从 Tornado 这样的东西中看到这些特性。这是另一个我主观上非常喜欢的作品。Quart 感觉就像一个稍微加强了的烧瓶,在添加更多功能的过程中,它没有牺牲速度或易用性。有趣的是,Quart 文档实际上建议您去访问 Flask 文档,我认为这确实说明了它的分叉性质。
**from** **quart** **import** Quart
app = Quart(__name__)
**@app**.route('/')
**async** **def** hello():
**return** 'hello'
app.run()
如果你曾经想要一个异步的 Flask,Quart 就是你的框架!
№5:害群之马

https://github.com/RobertoPrevato/BlackSheep(src =
现在是时候来点不同的东西了;一只害群之马,如果你愿意的话。
(不好意思,烂笑话。)
Black Sheep 是一个 web 框架,灵感来自于像 ASP.NET 和 Flask 这样的优秀工具,可以用来轻松地创建基于事件的 web 应用程序。考虑到这一点,我真的不明白为什么它被称为害群之马,因为该框架背后的语法和方法与 Flask 非常相似。
from datetime import datetime
from blacksheep.server import Application
from blacksheep.server.responses import text
app = Application()
@app.route('/')
async def home(request):
return text(f'Hello, World! {datetime.utcnow().isoformat()}')
像 Quart 一样,Black Sheep 也包含了用于同步和跨 web 创建非阻塞端点的神奇工具。总的来说,这的确是一个很好的使用框架,但是与 Quart 非常相似——所以如果你使用其中一个,你就已经很好地使用了它们两个,至少就我所知。所以我还是会问这个问题,
“那怎么是败家子?”
(也许我对这个命名方案看得太远了……)
结论
因此,现在有了一些更现代、更常用的网络框架,它们一定会帮助您部署新的终端。虽然在我看来,它们都值得添加,如果我必须选择一个,我可能会选择 FastAPI。FastAPI 简单、轻量,顾名思义;很快。然而,这并不是说 FastAPI 在任何情况下都是最佳选择。没有一个应用程序能够一次突破所有的限制,考虑到这一点,我会决定你的具体情况需要什么样的最佳功能,并根据这个选择,而不是主观意见。
总的来说,我认为所有这些都值得添加和尝试,如果你有足够的存储空间来实现它们的话。将来,我可能会对请求响应进行一些速度测试,看看我们实际上可以获得什么样的收益,并量化这些框架经常声称的速度。
Python 的 5 个流畅语法技巧
通过使用这些极其简单的技巧,让你的代码更加简洁和快速

(图片由作者提供)
介绍
众所周知,编程可能非常复杂。伴随这种复杂性而来的还有语法的复杂性。虽然有时很容易避免在条件语句上堆叠循环,但在某些情况下,在条件语句上堆叠循环可能是您试图解决的问题的唯一解决方案。记住这一点,不管代码的大小或范围如何,都有一些简单的技巧可以让你的操作更加简洁、易读,有时甚至更快!
重要提示:
我不喜欢强调在开发阶段编写“干净”代码的想法。关于这些技巧,要说的重要一点是,虽然它们方便简洁,但相反的往往是而不是错误的做事方式。换句话说,不遵循这些指导方针不会让你成为一个更差的程序员,但是会让你的代码更难看。也就是说,在调试过程中,很难用您所做的每一个测试或打印语句来编写简洁而完美的代码,所以我的建议是——不要!使用干净且格式化的代码的一个很好的方法是在代码完成并工作后让它干净并格式化。
№1:不是
Python 编程语言中一个我认为经常被忽视的伟大特性就是它的英语式语法是多么的直观。如何表达这一点的一个很好的例子是 not 的用法。要完全否定一个布尔值,就像写出一个英文负数一样简单。这当然也适用于条件语句,比如:
if number not in list:
当然,如果给定的数字不在列表中,这个条件将返回 true。这是一种非常简单明了的方法,使得解决这样的问题变得轻而易举。考虑下面的例子:
def toggle_switch(self):
if self.toggled == false:
self.toggled = true
else:
self.toggled = false
这段代码当然可以很好地切换开关,但是坦白地说,这是浪费代码行。我们可以用 not 简单地否定布尔值,而不是首先做一个条件语句。
def toggle_switch(self):
self.toggled = not self.toggled
№2:加/减断言
我不喜欢在代码中看到的一件事是:
newvar = newvar - 5
这当然是正确的。它将从我们的变量中减去 5,并将我们的别名设置为等于差值。然而,我们可以让它看起来更整洁,特别是当它被更多的代码包围时,只需使用-=操作符。
newvar -= 5
与后者相比,我更喜欢后者,因为查看单个操作数更容易理解发生了什么,而不是查看两个操作数的组合并辨别回报是什么。当然,这只是个人偏好,但我确实认为很难争论它是否看起来更好。
№3:反转列表
你曾经需要改变你的生活吗?事情没有按照你的清单进行,而你希望事情是相反的吗?幸运的是,Python 的列表类型有一个默认函数 reverse(),它允许您这样做。
arr = [5,10,15]
revarr = arr.reverse()
print(revarr)[15,10,5]
№4:转置矩阵
在处理线性代数和大型矩阵时,你可能会遇到的一个问题就是转置这些矩阵。当然,您总是可以通过对矩阵使用 Numpy 来实现这一点,但是也可以尝试使用 zip()方法!
x = [[37,22],
[48 ,29],
[18 ,12]]print (zip(*x))[(37, 48, 18), (22, 29, 12)]
№5:系列变量
通常,在 Pythonic 代码中,您可以命名几个变量来执行算术运算,如下所示:
a = 5
b = 8
c = 9
当然,像许多其他人一样,这当然是正确的!如您所料,这会将 a 分配给 5,b 分配给 8,c 分配给 9。然而,我们可以将这三行断言压缩成一行,如下所示:
a, b, c = 5, 8, 9
这当然会产生相同的结果。在我看来,这看起来比后者好得多。当然这不是必须的,是喜好问题。然而在我看来,它一定会让你的作品看起来漂亮很多!
№6:(奖金)计数器
在数据科学中,很有可能会遇到这样的情况,他们可能希望从列表中抽取计数。这可能是为了检查样本中某些属性的表示,或者只是为了查看给定特性中的所有选项。获取列表中计数的最佳方式是使用集合模块中的计数器,如下所示:
from collections import Counter
lst = [4, 3, 3, 2, 4, 3]
print(Counter(lst))
Counter({3: 3, 4: 2, 2: 1})
这将返回一个字典,其中包含列表中每个唯一观察值的键和它们各自的计数。
结论
代码肯定会很快变得糟糕透顶。对 Python 程序员来说幸运的是,Python 有很多相当简单的方法来解决和防止难看的代码。从简单的关键字,如不否定布尔和改变条件,到非常简单的方法来创建交叉列表和转置矩阵。虽然这些技巧中只有一部分可能会让您的代码工作得更好一点,或者运行得更快一点,但所有这些技巧肯定会让您的代码看起来更好。归根结底,可读性是非常重要的,尤其是对你可能与之共事的其他人而言。因此,记住这一点,考虑本文中提出的要点,整理您的代码!
对不平衡数据进行过采样的 5 种 SMOTE 技术
了解过采样数据的 SMOTE 方法

不平衡数据是指分类数据集类的比例不均衡。例如,我将在本文中使用来自 Kaggle 的客户流失数据集。

作者创造的形象
我们可以看到“是”类与“否”类相比存在偏差。如果我们计算一下比例,Yes 类比例在整个数据集的 20.4%左右。虽然,不平衡的数据怎么分类?下表可能对你有所帮助。

作者创造的形象
不平衡有三种情况——轻度、中度和极端;取决于少数类占整个数据集的比例。在上面的例子中,我们只有轻微的不平衡数据。
现在,为什么在创建我们的机器学习模型时,我们需要关心不平衡的数据?嗯,不平衡类会产生偏差,机器学习模型倾向于预测多数类。你不希望预测模型忽略少数阶级,对不对?
这就是为什么存在克服不平衡问题的技术——欠采样和过采样。这两种技术有什么区别?
欠采样会降低多数阶级的比例,直到人数与少数阶级相似。同时,过采样将按照多数类比例对少数类比例进行重新采样。
在本文中,我将只写一种称为 SMOTE 的特定过采样技术和各种 SMOTE。
请注意,我是一名数据科学家,我认为应该保持比例不变,因为它代表了数据。在使用这些技术之前,最好先尝试一下特性工程。
重击
那么,什么是 SMOTE?SMOTE 或合成少数过采样技术是一种过采样技术,但 SMOTE 的工作方式与典型的过采样不同。
在经典的过采样技术中,少数数据是从少数数据总体中复制的。虽然它增加了数据的数量,但它并没有给机器学习模型提供任何新的信息或变化。
出于上述原因, Nitesh Chawla 等人(2002)在他们的 SMOTE 论文中介绍了一种新技术,用于创建用于过采样目的的合成数据。
SMOTE 的工作原理是利用一种 k 近邻算法来创建合成数据。SMOTE 首先从少数类中选择随机数据,然后设置数据的 k-最近邻。然后在随机数据和随机选择的 k-最近邻之间产生合成数据。让我给你看下面的例子。

作者创造的形象
重复该过程足够多次,直到少数类具有与多数类相同的比例。
我省略了更深入的解释,因为上面的段落已经总结了 SMOTE 是如何工作的。在这篇文章中,我想重点介绍 SMOTE 及其变体,以及何时使用它,而不会在理论上触及太多。如果你想知道更多,让我把我在这里提到的每个变化的链接附在纸上。
作为准备,我会使用 imblearn 包,其中包括 SMOTE 及其在包中的变体。
#Installing imblearnpip install -U imbalanced-learn
1.重击
我们将从使用默认形式的 SMOTE 开始。我们将使用上面相同的客户流失数据集。让我们先准备好数据,然后尝试 SMOTE。
如果你从我上面的解释中意识到,SMOTE 用于合成特征连续的数据,是一个分类问题。为此,在本节中,我们将只尝试对分类目标使用两个连续的特征。
import pandas as pd
import seaborns as sns#I read the csv churn data into variable called df. Here I would only use two continuous features CreditScore and Age with the target Exiteddf_example = df[['CreditScore', 'Age', 'Exited']]
sns.scatterplot(data = df, x ='CreditScore', y = 'Age', hue = 'Exited')

作者创造的形象
正如我们在上面“信用分数”和“年龄”特征之间的散点图中看到的,0 和 1 类之间有混淆。
让我们尝试使用 SMOTE 技术对数据进行过采样。
#Importing SMOTE
from imblearn.over_sampling import SMOTE#Oversampling the data
smote = SMOTE(random_state = 101)
X, y = smote.fit_resample(df[['CreditScore', 'Age']], df['Exited'])#Creating a new Oversampling Data Frame
df_oversampler = pd.DataFrame(X, columns = ['CreditScore', 'Age'])
df_oversampler['Exited']sns.countplot(df_oversampler['Exited'])

作者创造的形象
正如我们在上面的图表中看到的,0 类和 1 类现在有相似的比例。让我们看看如果我们像以前一样创建一个相似的散点图会怎么样。
sns.scatterplot(data = df_oversampler, x ='CreditScore', y = 'Age', hue = 'Exited')

作者创造的形象
目前,我们有过采样数据来填充之前用合成数据填充的空白区域。
正如我之前所说,过采样的目的是为了获得更好的预测模型。这项技术不是为任何分析目的而创建的,因为创建的每个数据都是合成的,所以这是一个提醒。
出于上述原因,我们需要评估过采样数据是否会导致更好的模型。让我们从拆分数据来创建预测模型开始。
# Importing the splitter, classification model, and the metric
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report#Splitting the data with stratificationX_train, X_test, y_train, y_test = train_test_split(df_example[['CreditScore', 'Age']], df['Exited'], test_size = 0.2, stratify = df['Exited'], random_state = 101)
此外,您应该只对训练数据而不是整个数据进行过采样,除非您将整个数据用作训练数据。如果要拆分数据,应该先拆分数据,然后再对定型数据进行过采样。
#Create an oversampled training data
smote = SMOTE(random_state = 101)
X_oversample, y_oversample = smote.fit_resample(X_train, y_train)
现在我们有了不平衡数据和过采样数据,让我们尝试使用这两种数据创建分类模型。首先,让我们看看用不平衡数据训练的逻辑回归模型的性能。
#Training with imbalance data
classifier = LogisticRegression()
classifier.fit(X_train, y_train)print(classification_report(y_test, classifier.predict(X_test)))

作者创造的形象
正如我们从指标中看到的,我们用不平衡数据训练的逻辑回归模型倾向于预测 0 类而不是 1 类。偏差存在于我们的模型中。
让我们看看如何使用过采样数据训练模型的结果。
#Training with oversampled dataclassifier_o = LogisticRegression()
classifier_o.fit(X_oversample, y_oversample)print(classification_report(y_test, classifier_o.predict(X_test)))

作者创造的形象
在这种情况下,模型在预测类 1 中表现更好。在这种情况下,我们可以说过采样数据有助于我们的逻辑回归模型更好地预测类别 1。
我可以说,过采样数据改进了用于预测目的的逻辑回归模型,尽管“改进”的上下文再次回到了用户。
2.SMOTE-NC
我提到过 SMOTE 只对连续特征有效。那么,如果你有混合的(分类的和连续的)特征该怎么办呢?在这种情况下,我们有 SMOTE 的另一种变体,称为 SMOTE-NC(标称和连续)。
那么,你可能会想,只是把分类数据转换成数字;因此,我们有一个供 SMOTE 使用的数字特性。问题是当我们这么做的时候。我们会得到毫无意义的数据。
例如,在上面的流失数据中,我们有“IsActiveMember”分类特征,数据为 0 或 1。如果我们使用 SMOTE 对此数据进行过采样,最终可能会得到 0.67 或 0.5 等过采样数据,这根本没有意义。
这就是为什么当我们有混合数据的情况下,我们需要使用 SMOTE-NC。前提很简单,我们表示哪些特征是分类的,SMOTE 将对分类数据进行重采样,而不是创建合成数据。
我们试试应用 SMOTE-NC。在这种情况下,我将选择另一个特征作为示例(一个分类,一个连续)。
df_example = df[['CreditScore', 'IsActiveMember', 'Exited']]
在这种情况下,“CreditScore”是连续特征,“IsActiveMember”是分类特征。然后,让我们像以前一样拆分数据。
X_train, X_test, y_train, y_test = train_test_split(df_example[['CreditScore', 'IsActiveMember']],df['Exited'], test_size = 0.2,stratify = df['Exited'], random_state = 101)
然后,让我们再次创建两个不同的分类模型;一个用不平衡数据训练,一个用过采样数据训练。首先,让我们尝试 SMOTE-NC 对数据进行过采样。
#Import the SMOTE-NC
from imblearn.over_sampling import SMOTENC#Create the oversampler. For SMOTE-NC we need to pinpoint the column position where is the categorical features are. In this case, 'IsActiveMember' is positioned in the second column we input [1] as the parameter. If you have more than one categorical columns, just input all the columns positionsmotenc = SMOTENC([1],random_state = 101)
X_oversample, y_oversample = smotenc.fit_resample(X_train, y_train)
准备好数据后,让我们试着创建分类器。
#Classifier with imbalance dataclassifier = LogisticRegression()
classifier.fit(X_train, y_train)print(classification_report(y_test, classifier.predict(X_test)))

作者创造的形象
有了不平衡数据,我们可以看到分类器偏向类 0,完全忽略类 1。那么,如果我们用 SMOTE-NC 过采样数据来训练它呢?
#Classifier with SMOTE-NCclassifier_o = LogisticRegression()
classifier_o.fit(X_oversample, y_oversample)print(classification_report(y_test, classifier_o.predict(X_test)))

作者创造的形象
就像 SMOTE 一样,具有 SMOTE-NC 过采样数据的分类器为机器学习模型提供了预测不平衡数据的新视角。这不一定是最好的,但比不平衡的数据要好。
3.临界 SMOTE
边界 SMOTE 是 SMOTE 的变体。顾名思义,和边界有关系。
因此,与 SMOTE 不同,在 SMOTE 中,合成数据是在两个数据之间随机创建的, Borderline-SMOTE 仅沿着两个类之间的决策边界生成合成数据。
此外,有两种边界 SMOTE 有边界-SMOTE1 和边界-SMOTE2。区别很简单;Borderline-SMOTE1 还对多数类进行过采样,其中多数数据会导致决策边界中的错误分类,而 Borderline-SMOTE2 只对少数类进行过采样。
让我们用我们以前的数据来试试边界 SMOTE。我会再一次只使用数字特征。
df_example = df[['CreditScore', 'Age', 'Exited']]

作者创造的形象
上图是 SMOTE 过采样数据和 Borderline-SMOTE1 的区别。它可能看起来略有相似,但我们可以看到在创建合成数据的地方存在差异。
机器学习模型的性能如何?让我们试试吧。首先,像往常一样,我们拆分数据。
X_train, X_test, y_train, y_test = train_test_split(df_example[['CreditScore', 'Age']], df['Exited'], test_size = 0.2, stratify = df['Exited'], random_state = 101)
然后,我们使用 Borderline-SMOTE 创建过采样数据。
#By default, the BorderlineSMOTE would use the Borderline-SMOTE1
from imblearn.over_sampling import BorderlineSMOTEbsmote = BorderlineSMOTE(random_state = 101, kind = 'borderline-1')X_oversample_borderline, y_oversample_borderline = bsmote.fit_resample(X_train, y_train)
最后,让我们用边界 SMOTE 过采样数据来检查机器学习性能。
classifier_border = LogisticRegression()
classifier_border.fit(X_oversample_borderline, y_oversample_borderline)print(classification_report(y_test, classifier_border.predict(X_test)))

作者创造的形象
性能与用 SMOTE 过采样数据训练的模型没有太大区别。这意味着我们应该关注特征,而不是对数据进行过采样。
当我们知道错误分类经常发生在边界决策附近时,最好使用 Borderline-SMOTE。否则,我们可以使用通常的 SMOTE。如果你想了解更多关于边界线-SMOTE 的信息,你可以在这里查看论文。
4.濒临崩溃的 SVM
边界重击的另一个变体是边界重击 SVM,或者我们可以称之为 SVM 重击。
SVM-SMOTE 和其他 SMOTE 之间的主要区别在于,该技术将结合 SVM 算法,而不是使用 K-最近邻来识别边界线-SMOTE 中的错误分类。
在 SVM-SMOTE 中,在原始训练集上训练支持向量机分类器后,边界区域由支持向量近似。合成数据将沿着将每个少数类支持向量与其多个最近邻居连接起来的线被随机创建。
与边界线-SMOTE 相比,边界线-SMOTE SVM 的特殊之处在于,更多的数据是在远离类重叠区域的地方合成的。它更关注数据在哪里被分离。
就像以前一样,让我们尝试在模型创建中使用该技术。在边界 SMOTE 示例中,我仍然使用相同的训练数据。
from imblearn.over_sampling import SVMSMOTE
svmsmote = SVMSMOTE(random_state = 101)X_oversample_svm, y_oversample_svm = svmsmote.fit_resample(X_train, y_train)classifier_svm = LogisticRegression()
classifier_svm.fit(X_oversample_svm, y_oversample_svm)print(classification_report(y_test, classifier_svm.predict(X_test)))

作者创造的形象
性能再一次没有太大的不同,虽然我可以说这个时候的模型比我们使用其他技术的时候稍微更喜欢 0 类,但也不是太多。
这再次取决于你,你的预测模型目标是什么,以及受其影响的业务。如果你想了解更多关于被边界袭击的 SVM 的情况,你可以查看这里的文章。
5.自适应合成采样
ADASYN 是 SMOTE 的另一个变体。与 Borderline-SMOTE 相比,ADASYN 采用了一种更加不同的方法。当 Borderline-SMOTE 试图合成数据决策边界附近的数据时, ADASYN 根据数据密度创建合成数据。
合成数据的生成将与少数群体的密度成反比。这意味着在少数样本密度低的特征空间区域中创建更多的合成数据,而在密度高的特征空间区域中创建更少或没有合成数据。
简而言之,在少数民族人口密度较低的地区,会产生更多的合成数据。不然合成数据也没做那么多。
让我们看看使用 ADASYN 的性能如何。在边界 SMOTE 示例中,我仍然使用相同的训练数据。
from imblearn.over_sampling import ADASYN
adasyn = ADASYN(random_state = 101)X_oversample_ada, y_oversample_ada = adasyn.fit_resample(X_train, y_train)classifier_ada = LogisticRegression()
classifier_ada.fit(X_oversample_ada, y_oversample_ada)print(classification_report(y_test, classifier_ada.predict(X_test)))

作者创造的形象
从上面的模型性能可以看出,性能比我们使用其他 SMOTE 方法时稍差。
问题可能在于离群值。正如我之前所说的,ADASYN 将重点关注密度较低的密度数据。通常,低密度数据是一个异常值。ADASYN 方法会将过多的注意力放在特征空间的这些区域上,这可能会导致更差的模型性能。在使用 ADASYN 之前,最好移除异常值。
如果你想了解更多关于 ADASYN 的信息,你可以点击查看论文。
结论
在创建预测性机器学习模型时,不平衡的数据是一个问题。缓解这个问题的一种方法是对少数数据进行过采样。
我们可以通过使用 SMOTE 技术创建合成数据来过采样数据,而不是通过复制数据来过采样数据。SMOTE 有几种变体,包括:
- 重击
- SMOTE-NC
- 临界 SMOTE
- SVM-斯莫特
- 阿达辛
希望有帮助!
如果你没有订阅成为媒体会员,请考虑通过我的推荐订阅来支持我的写作。
在我的 社交媒体 上访问我。
作为机器学习工程师你需要的 5 个软技能(以及为什么)
包括成为任何劳动力的有用组成部分的提示

克林特·帕特森在 Unsplash 上拍摄的照片
介绍
机器学习工程师角色通常与编程、软件实现、数据分析等技术技能相关联。
尽管技术技能对于成为一名称职的 ML 工程师来说是必不可少的,但还有一系列同样重要的软技能。
在这篇文章中,我不仅会培养对上述软技能的意识,还会提供一些技巧和建议来帮助个人发展和培养上述技能。
沟通

沃洛德梅尔·赫里先科在 Unsplash 拍摄的照片
你的声音需要被听到
沟通是 ML 工程师在职业生涯中提升的一项关键技能。下面举例说明了有效沟通的优势。这些例子说明了为什么有效的沟通技巧是重要的。
- ML 工程职位的面试
- 让员工意识到自己的需求
- 协商加薪
- 向非技术人员解释机器学习概念。
在所有提到的场景中,拥有优秀的沟通技巧会让你比没有沟通技巧的人处于更有利的位置。
恰当地交流你的资历和项目可以让你在申请工作职位时领先于竞争对手。
或者,即使是在工作岗位上,有效的沟通技巧也能为薪资谈判提供优势,这可能意味着加薪 5%或 10%。
提高沟通技巧的一个很好的方法是做下面列出的事情。
- 抓住机会公开发言(不一定要和工作有关)。
- 如果你还没有阅读书籍,请阅读。定期阅读可以提高你的词汇量,并为你在对话中表达自己提供口头弹药。
- 心平气和地慢慢说。冷静地说,不管情况如何,都能给别人一种你在控制局面的印象;更重要的是,平静地说话传达出高度的自信。
- 练习向技术和非技术人员解释机器学习概念。通过确保非技术人员理解你正在解释的概念,你正在强化你的知识。向专业人士解释 ML 概念将使你熟悉如何恰当地使用技术术语来描述一个概念或想法。
协同工作

ML 工程师有一个至关重要的责任,通常是公司内部项目和人工智能计划的中心。由于 ML 工程师在公司中扮演着不可或缺的角色,他们需要在跨职能团队中工作。
例如,ML 工程师可能需要与数据库管理员就数据湖和存储的供应进行交流。大多数软件产品需要一个面向前端的界面,因此,ML 工程师与产品设计师、经理、测试人员和软件开发人员密切合作。
有效的团队合作能够创造一个愉快的工作环境,其副产品是高效的工作流程。
团队合作是一种与优秀的沟通技巧相结合的技能。ML 工程师在沟通技术和个人需求方面越有效,就越容易在团队中有效地合作和贡献。
在机器学习中练习团队合作的一个非常有效的方法是利用 Kaggle 。大多数 ML 从业者都熟悉 Kaggle。我发现在 Kaggle 的团队中工作,甚至合并团队,可以获得很多经验和知识。你可以从实际项目和比赛中学到很多东西,团队合作和协作是成功的主要因素。
以下是一些支持团队内有效团队合作的工具:
时间管理

凯文·Ku 在 Unsplash 上的照片
时间管理是将一定数量的时间分配给特定任务以实现一定的成功衡量标准的过程。成功的时间管理的副产品是高效的任务完成和生产力的提高。
虽然 ML 工程师主要被期望实现机器学习模型和系统,但是 ML 工程师也有一些额外的责任(下面列出的例子)。由于额外的职责,ML 工程师需要对任务进行优先排序,并分配适当的时间和精力来完成令人满意的任务。
ML 工程师的其他职责包括:
- 指导初级工程师
- 管理一个工程团队
- 研究最先进的 ML 技术和算法
ML 工程师或从业者可以采取一些步骤来培养良好的时间管理技能。在你的下一个或当前项目中,将完成一个里程碑所需的任务拆分开来,并制定一个包括每项任务描述和预计完成时间的计划。
并非所有的任务都是平等的
制定计划是不够的;通过有效的优先化来最大化生产力是一项相当大的努力。通过首先处理重要的任务,你会有一种有效利用时间的感觉。
这里有一个适用于工作场所的 ML 工程师的巧妙技巧。当你被问及实现一个 ML 模型或算法所需的时间时,无论你第一次想到的是什么时间,加倍它,你甚至可以加倍它以确保安全。例如,如果你的任务是在一个移动应用程序中实现一个语义分段技术,并且你估计这需要三天才能完成,那么把完成时间记为一周。这为您提供了缓冲时间来解决可能出现的任何不可预见的问题。与其低估完成一项任务所花的时间,不如高估。
领导力

马库斯·斯皮斯克在 Unsplash 拍摄的照片
领导力作为一种软技能,对 ML 从业者的重要性怎么强调都不为过。不管你在职业生涯中处于什么水平,你都必须培养领导的特质。
领导力可以被定义为一种习得的特质,它使个人能够激励、激励和引导一群人朝着共同的目标前进。
ML 从业者可以通过以下方式展现领导力:
- 首席工程师或人工智能团队经理应该表现出对他们正在从事的项目的热情,或者至少是对人工智能的渴望。对处于领导或管理位置的人的热情描绘可以在团队成员中产生灵感。
- ML 从业者应该理解一个公司、组织或项目背后的原因。通过了解组织采取行动和决策的“原因”,您可以执行超出您的技术能力的行动。
- 伟大的领导者以身作则。一个完美的场景来说明这一点将是一个 ML 工程师接受并完成一个项目或任务,这被认为是几乎不可能的。此后,教导其他团队成员如何应对未来可能出现的类似任务。
ML 从业者可以通过以下方式培养领导技能:
- 与团队中的个人紧密合作。不要只承担个人项目,要承担涉及各行各业个人协作的大型项目。
- 通过预见项目的长期影响,练习拥有远见和良好的决策技能。
- 一有机会就练习公开演讲。
职业道德

西蒙·艾布拉姆斯在 Unsplash 拍摄的照片
职业道德是指导个人以自律、勤奋和内在的方式行动的内在原则相结合的产物。
一个好的职业道德是几个部分的结合,这些部分和谐地在一起工作。这些要素包括专注、纪律、动机、灵感、愿景、生产力、努力工作等。
从我的观察来看,ML 工程师倾向于努力工作,这个领域本身的性质要求他们在这个领域的学术和实践方面都投入大量的精力。
虽然,努力工作并不构成一般的职业道德。例如,一个 ML 工程师可以在短期内努力工作,但从长期来看,同一个 ML 工程师可能缺乏一致性、动力、专注和纪律来培养良好的职业道德。
如何培养良好职业道德的例子:
- 通过为一项特定的任务留出一定的持续时间来练习提高注意力水平。确保你排除干扰。一个有用的时间追踪工具是 T4 森林。
- 守时是获得良好职业道德的重要组成部分。你可以通过准时出席日常生活中任何计划好的会议来练习守时。即使是社交聚会,也要守时。
- 保持正确的工作生活平衡。离开电脑休息一下会让你的大脑得到休息。培养一个不涉及机器学习的爱好。这些活动的例子可以是绘画、唱歌或学习演奏乐器。大脑是神奇的,从执行活动中获得的创造力可以有助于你的机器学习相关工作的创造力。
- 动机和灵感是非常主观的成分。激励 ML 工程师 A 的可能不会激励 ML 工程师 b。就我个人而言,我通过观看大量以人工智能为中心故事点的科幻电影来激励自己。像《我的世界》、《机器人》、《玛奇纳的世界》、《改变的碳》这样的电影和电视剧展现了一个未来,这个未来可以通过我们作为人工智能从业者今天取得的小小进步而成为可能。
结论
成为一名成功的 ML 工程师需要更多的软技能,比如表达技巧、创造力、倾听、解决问题、灵活性等等。
希望从这篇文章中,你已经确定了至少一项你可以在业余时间开始培养的软技能。
感谢您抽出时间阅读。
请随意查看我写的与机器学习相关的更多文章。
[## 机器学习工程师和研究人员之间的 7 个关键区别(包括工资)
包含有关期望薪资、工作量、可交付成果以及更多重要差异的信息。
towardsdatascience.com](/7-key-differences-between-machine-learning-engineers-and-researchers-salaries-included-b62c3aaebde9) [## 我作为计算机视觉工程师的第一个月
洞察一个实践机器学习工程师的第一个月。Jupyter 笔记本之外的世界
towardsdatascience.com](/my-first-month-as-a-computer-vision-engineer-5813574d394a)
5 Spark 数据科学最佳实践
我希望在开始我的项目之前就知道

由 Unsplash 上的 chuttersnap 拍摄
为什么要搬到 spark?
虽然我们都谈论大数据,但通常在你的职业生涯中需要一些时间,直到你遇到它。对我在 Wix.com 的工作来说,这比我想象的要快,超过 1 . 6 亿的用户产生了大量的数据——随之而来的是对扩展我们数据处理的需求。
虽然有其他选择(例如 Dask ),但我们决定使用 Spark,主要有两个原因:(1)它是当前的技术水平,广泛用于大数据。(2)我们有了 Spark inplace 所需的基础设施。
如何用 PySpark 为熊猫们写作
你可能很熟悉熊猫,我说的熟悉是指流利,你的母语:)
下面这个演讲的标题说明了一切— 了解熊猫的数据科学家与 PySpark 的数据争论这是一个伟大的争论。
这将是一个很好的时机来说明,简单地获得正确的语法可能是一个很好的起点,但是对于一个成功的 PySpark 项目来说,你需要更多的东西,你需要理解 Spark 是如何工作的。
让 Spark 正常工作很难,但当它工作时——它工作得非常好!
一言以蔽之
我在这里只会深入膝盖,但我建议访问以下文章并阅读 MapReduce 解释,以获得更广泛的解释— 使用 Spark 处理大数据的搭便车指南。
这里我们要理解的概念是水平缩放。
从垂直缩放开始更容易。如果我们有一个运行良好的 pandas 代码,但是数据对它来说变得太大了,我们可以转移到一个更强大的有更多内存的机器上,并希望它能管理。这意味着我们仍然有一台机器同时处理全部数据——我们纵向扩展了。****
相反,如果我们决定使用 MapReduce,将数据分割成块,让不同的机器处理每个块——我们就在横向扩展。
5 Spark 最佳实践
这些是 5 spark 最佳实践,帮助我将运行时间减少了 10 倍,并扩展了我们的项目。
1 -从小处着手—对数据进行采样
如果我们想让大数据发挥作用,我们首先希望看到我们使用一小块数据的方向是正确的。在我的项目中,我对 10%的数据进行了采样,并确保管道正常工作,这允许我使用 Spark UI 中的 SQL 部分,并看到数字在整个流程中增长,同时不会等待流程运行太长时间。
从我的经验来看,如果你用小样本达到了你想要的运行时,你通常可以很容易地扩大规模。
2 -了解基础知识—任务、分区、内核
这可能是使用 spark 时需要理解的最重要的事情:
1 个分区支持在 1 个内核上运行 1 个任务
您必须时刻注意您拥有的分区数量——跟踪每个阶段的任务数量,并将它们与您的 spark 连接中正确的内核数量相匹配。一些提示和经验法则可以帮助你做到这一点(所有这些都需要在你的案例中进行测试):
- 任务与内核之间的比率应该是每个内核大约 2-4 个任务。
- 每个分区的大小应该在 200-400 MB 之间,这取决于每个工作者的内存,根据你的需要进行调整。
3 -调试火花
Spark 使用惰性求值,这意味着它在执行计算指令图之前会一直等到一个动作被调用。动作的例子有show(), count(),...
这使得我们很难理解代码中哪里有需要优化的错误/地方。我发现很有帮助的一个实践是使用df.cache()将代码分成几个部分,然后使用df.count()强制 spark 计算每个部分的 df。
现在,使用 spark UI,您可以查看每个部分的计算并找出问题。重要的是要注意,如果不使用我们在(1)中提到的采样,使用这种实践可能会创建一个很长的运行时间,这将很难调试。
4 -寻找和解决偏斜
让我们从定义偏斜度开始。正如我们提到的,我们的数据被划分为分区,随着转换的进行,每个分区的大小可能会发生变化。这可能会在分区之间产生很大的大小差异,这意味着我们的数据存在偏斜。
通过查看 spark UI 中的阶段细节,并寻找最大值和中值之间的显著差异,可以找到偏斜度:

较大的方差(中位数= 3 秒,最大值= 7.5 分钟)可能表明数据存在偏斜
这意味着我们有一些任务比其他任务慢得多。
为什么这不好——这可能会导致其他阶段等待这几个任务,并让内核等待而不做任何事情。
最好是,如果你知道偏斜来自哪里,你可以直接解决它,并改变划分。如果您不知道/没有直接解决它的选项,请尝试以下方法:
调整任务与内核的比例
正如我们提到的,通过拥有比内核更多的任务,我们希望当较长的任务运行时,其他内核将继续忙于其他任务。虽然这是真的,但前面提到的比率(2-4:1)并不能真正解决任务持续时间之间如此大的差异。我们可以尝试将比例提高到 10:1,看看是否有帮助,但这种方法可能有其他缺点。
加盐数据
Salting 是用一个随机键对数据进行重新分区,这样新的分区就会平衡。下面是 pyspark 的代码示例(使用 groupby,这通常是导致偏斜的原因):
spark 中迭代代码的问题
这一次真的很难。正如我们提到的,spark 使用惰性评估,所以当运行代码时,它只构建一个计算图,一个 DAG。但是当你有一个迭代过程时,这种方法可能是非常有问题的,因为 DAG 重新打开先前的迭代,并且变得非常大,我的意思是非常非常大。对于驱动程序来说,这可能太大而无法保存在内存中。这个问题很难定位,因为应用程序被卡住了,但它出现在 spark UI 中,就好像很长时间没有作业运行(这是真的)——直到驱动程序最终崩溃。
这是目前 spark 的一个固有问题,对我有效的解决方法是每 5-6 次迭代使用df.checkpoint() / df.localCheckpoint()(通过一点试验找到你的数字)。这样做的原因是checkpoint()正在打破血统和 DAG(不像cache()),保存结果并从新的检查点开始。缺点是,如果发生了不好的事情,您没有完整的 DAG 来重新创建 df。
摘要
正如我之前所说的,学习如何让 spark 发挥其魔力需要时间,但这 5 个实践确实推动了我的项目向前发展,并在我的代码上洒下了一些 spark 的魔力。
最后,这是我开始我的项目时一直在寻找(但没有找到)的帖子——我希望你及时找到了它。
参考
- 与 PySpark 争夺了解熊猫的数据科学家
- 使用 Spark 处理大数据的搭便车指南
- Spark:权威指南 —关于监控和调试的第 18 章令人惊叹。
学习新编程语言的 5 本精彩书籍
我最喜欢的学习新编程语言的 5 本概念书。

对于任何有抱负的数据科学家、开发人员或工程师来说,书籍都是一种难以置信的学习资源。互联网上的信息经常可能是不正确的,或者可能没有很好的记录,因为向你解释事情的人不一定是一个伟大的作家,尽管他们在编程方面可能是多么伟大。我非常喜欢的一件事是,通过做你热爱的事情,编程和学习变得有趣起来。我喜欢回想我的一位同行,她有很强的医学背景,对数据科学非常着迷。她的所有项目似乎都与这种兴趣相关,这似乎真的使她的项目脱颖而出,因为她在讨论她正在研究的主题时充满激情和乐趣。
学习一门语言本身就很有趣,但加入一点小元素会变得更有趣。一本伟大的编程书和一本不那么伟大的编程书的区别在于自我意识;我们都是程序员,所以没必要把每件事都看得这么严重。我读过很多很酷的书,里面有有趣的项目,可以帮助你学习一门新的编程语言。
№1:艰难地学习 Python
作者:泽德·肖

近年来,随着机器学习的兴起,Python 变得更加流行。这是有充分理由的,因为就数据科学而言,Python 和 C 是一个非常有能力的组合。如果你想学习 Python,现在就是你的机会,“艰难地学习 Python”是一种方法。
这是我的一位导师很久以前就让我意识到的一本书,我很高兴他这么做了。这本书非常悲观,可能会让你发笑,但同时也有非常好的方法论。艰难地学习 Python 背后的想法是把你扔进 Python 的世界,完全不知道如何编程并强迫你打字。毕竟,有什么比做更好的学习方法呢?这本书在引导读者理解概念的同时将他们进一步推出舒适区方面做得很好。
如果你正在考虑学习 Python,我肯定会推荐这本书。如果你欣赏自嘲式的幽默,这本书会非常棒,这一点你可以从副标题中推断出来。
一个非常简单的关于计算机和代码的可怕的美丽世界的介绍。
这显然是一本给编程新手看的书。这本书的伟大之处在于,它将教会那些一生中从未接触过编程语言的人。如果你正在考虑进入编程领域,尤其是机器学习,那么 Python 无疑是一门可以为你打下基础的好语言。
№2:c++编程语言
作者:比雅尼·斯特劳斯特鲁普

如果你不熟悉 Bjarne Stroustup,你可能想在接触 C++之前知道他是谁。Bjarne Stroustup 是丹麦的计算机科学家,被认为是 C++编程语言的创始人。因此,作为该语言的创造者,他可能拥有一些关于该语言编程的最佳书籍。
我喜欢这本书的一点是,它让你对 C++的内部工作有了一点了解,而不会变得太复杂,以至于你不得不重读段落。比约恩的写作是直接的,但几乎有一个机智的暗示,使这本书更令人愉快。思想以一种任何其他语言的大多数用户肯定能够理解的方式呈现。
C++至今仍是一门使用非常广泛的语言。大多数情况下,C++用于以下用途之一:
- 应用开发
- 游戏开发
- 基因组学!
但是 C++还有很多其他的用途没有列出来,就我而言,将这种语言用于几乎任何应用程序都绝对没有错。但是,请注意,C++比 Python 或 Java-script 等简单的脚本语言更难学,更类似于 Java SE。学习 C++作为你的第一次编程入门当然是可能的,因为 C++是我大约 12 年前学习的第一门编程语言。我认为这是因为我当时并没有意识到脚本语言的可用性。
我认为,无论你对一门编程语言有什么实际用途,都应该是决定你选择哪种语言的唯一因素。例如,我主要使用 Python、Julia、R 和 Common Lisp。其中三种是函数式语言,一半基本上是为统计而设计的。我确实时不时地写一些 C 语言甚至汇编语言,但是通常这些语言对我来说没有用,因为我做的事情。所以你应该做的是弄清楚你到底想要什么样的程序,并追求你感兴趣的、广泛用于这种操作的语言。
№3: Common LISP:对符号计算的温和介绍
大卫·s·图雷茨基

暂时以函数为中心,我向您介绍 Common Lisp:对符号计算的简单介绍。这是一本我珍藏的书,因为它是我用来学习 Lisp 的。Lisp 是我一直想学的语言之一,但是直到去年年中才开始学习。
这本书将带你了解 Lisp 基本上是如何处理所有事情的,这真的很好,因为在网上很难找到关于构建 Lisp 包的信息。除此之外,还有对元编程、宏和在数据中使用符号作为代码的简要介绍——Common Lisp 的面包和黄油。
我想说,不管你想做什么,对于你的程序,你至少应该熟悉一点 Common Lisp——或者一些类似 Clojure 或 Scheme 的 Lisp 变体。为什么?好吧,Lisp 的语法和富于表情的打字会让你成为一个更好的程序员。它还会让你非常熟悉底层的方法是如何工作的。每个人都喜欢构建 Lisp 解释器,没有人喜欢构建 C 解释器,这是有原因的。
Lisp 是自然处理的。
换句话说,Lisp 的语法和表达式对处理器来说更容易理解,内存移动和汇编中的 CMPs/JNEs 要少得多。因此,与大多数其他语言相比,用汇编语言来解释 Lisp 是相当自然的。
№4: C 通过解剖
作者:艾拉·波尔和凯利

让我们面对事实:C 是一个相当难学和编程的级别。特别是对于一个新的程序员来说,学习 C 可能是一项艰巨的任务,需要做大量的工作。然而,与此同时,C 语言却没有替代品。C 语言在整个计算生态系统中根深蒂固,我们永远不会摆脱它,所以我们不妨学习它。
我喜欢这本书的一点是,它将每一个单独的部分放在一起,解释它们是如何组合在一起的,它们组合在一起的顺序是什么,最重要的是:
为什么?
像 C++一样,我当然不会建议把 C 作为你的第一语言来学习,即使这是可能的。我这样说只是因为有其他语言可以让你更快地学习编程概念,而不必担心语法和指针。当你熟悉了这些概念后,你所建立的编程基础将会很好地移植到你所接触的任何其他语言中,包括 c。
№5: Java-script 和 JQuery
乔恩·达克特

来个一百八十度的大转弯,请允许我向您介绍乔恩·达克特的 Javascript & JQuery 。这本书的伟大之处在于,它采用了一种相当基础和相对简单的方法来编写一种初学者友好的脚本语言。作为一种语言,Java-script 很像 Python,并且是我们今天可用的 web 开发领域中最大的工具。
JQuery 也是网站上常用的行业标准技术。然而,真正令人兴奋的是当这两者结合在一起并相互协同时。我对这本书的一个批评是,它相当基础,纯粹是解释性的,这使得从头到尾连贯地阅读有点无聊。我对这本书采取的方法是把它作为一本参考书,而不是一本读物。这本书里有很多非常有用的信息,可以很容易地参考和重复利用,因为例子通常都是非常顶尖的。对于绝对的初学者来说,这无疑是这个列表中的最佳选择之一,尤其是如果你也喜欢 web 开发的话。
结论
好吧,你有它;这些是我读过的一些我最喜欢的书,它们要么让我开始学习一门我不熟悉的语言,要么在我陷入代码时作为参考。尽管所有这些书都值得一读,但对有些人来说,读某些书可能比读其他书更有动力。或许还有上百万种不同的书籍可供学习一门新语言。有这么多,我永远不可能量化他们,但我会感谢任何书籍的建议留在回应!请随意留下你认为对学习你选择的语言最有帮助的书!
让您的查询更漂亮、更易读的 5 个 SQL 技巧
适当的查询可以让你省心。

如果我的查询已经可以运行了,为什么我还需要把它变得漂亮呢?
嗯,SQL 查询可以被认为是普通的代码。即使它可以工作,但这可能还不够,肯定可以通过应用一些格式标准来改进。更漂亮的代码易于分析和维护。同样的原则也适用于 SQL 查询。
定时和误差
您公司的同事必须检查您的工作,他将很难理解您试图用一个格式错误的查询做什么。
使用错误的或没有样式的规则将会导致同行评审的时间变慢,进入生产的时间变慢,更多的错误漏过,并且普遍缺乏评审你的工作的动力。当客户或同事要求您更改几个月前的查询时,糟糕的格式和样式也会产生影响。你完全忘记了那个巨大的查询是关于什么的。

我和我的同事遇到的几乎所有奇怪的语法错误都主要是由于糟糕的格式造成的,因为很难发现错误放置的逗号或丢失的括号——这些是最糟糕的。
开始吧!
与套管一致
查询的不同部分可以有不同的大小写,但是要一致。看看这个:
SELECT firstName, count(*) from Users WHERE last_name = ‘smith’ Group By firstName
这个查询是绝对讨厌的😬。如果我是解析器,我肯定会抛出某种语法错误来修改这个查询。
让我们在这里标记一些不好的事情:
- 一些 SQL 关键字是大写的。有些是小写的。分组依据在标题中。关键字的最佳格式规则是对所有 SQL 关键字使用相同的大小写。小写和大写选项都是最常用的选项。
- 不容易区分小写关键字实际上是关键字还是列,因为大小写是混合的。除此之外,看书也很烦。
- SELECT 中的第一列在 camelCase 中,WHERE 子句中使用的列在 snake_case 中,表名在 PascalCase 中。如果您在表格中遇到这种不一致的情况,一定要敲响警钟,并与您的团队一起决定您应该坚持哪种大小写。
经过一些清理后,查询应该如下所示:
SELECT first_name, COUNT(*) FROM users WHERE last_name = ‘smith’ GROUP BY first_name
使用缩进
试着阅读下面的查询,快速浏览一下,区分每个部分:
SELECT g.id, COUNT(u.id) FROM users u JOIN groups g on u.group_id = g.id WHERE u.name = 'John' GROUP BY g.id ORDER BY COUNT(u.id) desc
现在,用下面的一个来尝试同样的练习:
SELECT g.id, COUNT(u.id)
FROM users u JOIN groups g on u.group_id = g.id
WHERE u.name = 'John'
GROUP BY g.id
ORDER BY COUNT(u.id) desc
你能看出区分每个部分有多容易吗?
这可能是这个查询的一个小变化,但是想象一下必须处理那些有子查询、多个连接甚至窗口函数的查询。这是不一样的,不是吗?
让我们尝试添加另一个级别的缩进,看看它如何变得更容易:
SELECT
g.id
, COUNT(u.id)
FROM users u
JOIN groups g on u.group_id = g.id
WHERE u.name = ‘John’
GROUP BY
g.id
ORDER BY
COUNT(u.id) desc
专业提示:我开始在 SELECT 子句中的每个字段前使用逗号。我确保从第二列开始的每一行都以逗号开头,而不是在每一行后面都有一个逗号。在我看来,它更容易阅读,而且你不会有在 FROM 子句前留下逗号的问题,这有时会给你带来难以理解的语法错误,这取决于你的 RDBMS。
对于不同级别的查询,使用 2 个空格还是 4 个空格可能会有一点偏好,但你不能说它看起来不会比一大行 SQL 更干净。或者更糟:同一缩进层次上的一大块 SQL。
相信我,你的同事会感激你的。😄
在 group by 和 order by 子句中使用数字
同样,这可能是一种偏好,你可以随意接受或不接受。但是在我的职业生涯中,我遇到了许多新手数据分析师,他们甚至不知道这个东西的存在。
而不是:
SELECT
first_name
, last_name
, COUNT(*)
FROM users
GROUP BY
first_name
, last_name
ORDER BY
COUNT(*) desc
您可以:
SELECT
first_name
, last_name
, COUNT(*)
FROM users
GROUP BY 1, 2
ORDER BY 3 desc
这带来了一系列简单的好处:
- 您节省了行:按大量字段分组不仅会在 SELECT 子句中添加更多的行,还会在 GROUP BY 和 ORDER BY 子句中添加更多的行,甚至可能会使查询中的行数翻倍。
- 可维护性:如果您想将列更改为 group by,只需在 select 子句中这样做,不需要记住在其他子句中也要这样做。
- 更快:如果你有把分组字段放在第一位的好习惯,你唯一需要做的就是按 1,2,3,…,n 分组,n 为分组列的数量。
- 兼容:如果你使用类似 dbt 的工具,你甚至可以使用 Jinja 来调用{{group_by(n)}},它会翻译成适当的 group by 子句。
使用常用表表达式
所谓的 cte 是用来简化复杂查询的工具。它们可以被定义为临时视图,因为它们只存在于整个查询的执行过程中。cte 使您能够创建将用于最终目的的子查询。
让我们看一个简单的例子:
WITH employee_by_title_count AS (
SELECT
t.name as job_title
, COUNT(e.id) as amount_of_employees
FROM employees e
JOIN job_titles t on e.job_title_id = t.id
GROUP BY 1
),
salaries_by_title AS (
SELECT
name as job_title
, salary
FROM job_titles
)
SELECT *
FROM employee_by_title_count e
JOIN salaries_by_title s ON s.job_title = e.job_title
这里你可以看到我们在底层查询中使用了employee_by_title和salaries_by_title来产生最终结果。这比在 SELECT 子句中执行子查询或直接在 FROM 子句中执行子查询更具可读性和可维护性。特别是,如果您打算使用多个 cte,那么创建简单的 cte 要比创建一大块包含不同级别查询的 FROM 子句容易得多。
不过,你最好小心点:确保你不会因为做了比应该做的更复杂的事情而显著降低性能。要检查查询性能,如果使用 PostgreSQL,可以使用 EXPLAIN ANALYZE。
使用别名,有描述性
每个专栏的恰当标题至关重要。这是人们在电子表格中看到的第一件事。" W 我的帽子列有?"想象一下,如果这个人有一个 csv,其中 3 列名为id,4 列名为count,其他列名为avg、min等等。他可能会发疯的!
让我们看看下面的查询:
SELECT
u.id
, u.name
, t.id
, t.name
, (SELECT COUNT(*) FROM job_titles where name = t.name)
FROM users u
JOIN job_title t on u.job_title_id = t.id
该查询的结果可能如下:
id, name, id, name, count
1, John Wick, 4, hitman, 5
你大概可以看出疾速追杀不是一个职位,所以第二列肯定是用户名。对于职业杀手来说也是如此,你可以肯定地说那是一个头衔。但是什么是count?😅谁也猜不到。

现在让我们看看这个:
SELECT
u.id as user_id
, u.name as user_name
, t.id as job_title_id
, t.name as job_title_name
, (SELECT COUNT(*) FROM job_titles where name = t.name) as count_users_with_job
FROM users u
JOIN job_title t on u.job_title_id = t.id
这个查询将产生可读性更好、更容易理解的列。收到这份报告的人一眼就能发现有价值的信息,并且会比收到前一份报告的人快乐得多。
结论
我的目的是通过这篇文章让你的生活更轻松。无论您是开发人员、数据分析师、数据科学家,还是您公司中的 SQL 人员,这都会派上用场,减少您工作中的许多麻烦。
记住:对于 SQL 格式来说,没有单一的最佳标准或布局,但是肯定会有一个你最喜欢的。现在的挑战是找到那个特定的,并确保你和它保持一致。与你的同事讨论他们喜欢什么样的格式规则,并与团队达成共识,以确保你们都同意在公司的所有查询中使用相同的规则。
我希望你觉得这很有用。下次见!😄
PyTorch 中的 5 个统计函数
PyTorch 函数对机器学习有用

PyTorch 官方标志
PyTorch 是一个 Python 包,它提供了两个高级特性:
- 具有强大 GPU 加速的张量计算(如 NumPy)
- 建立在基于磁带的自动签名系统上的深度神经网络
PyTorch 的设计是直观的,线性思维,易于使用。当你执行一行代码时,它就会被执行。它具有最小的框架开销。它很快——不管你运行的是小型还是大型神经网络。
在这篇博客中,我们将讨论 PyTorch 中我觉得有趣的 5 个统计函数:
- 火炬.伯努利()
- 火炬.泊松()
- torch.normal()
- torch.normal_()
- torch.norm()

导入库
我们创建一个自定义张量并传递给伯努利函数,它返回一个二进制数(0 或 1)。
如果我们创建一个全张量。抽中“1”的概率是 1。
矩阵里全是零。*probability of drawing "1" is 0*
这是 torch.bernoulli()函数的三种类型的示例。
伯努利分布是一种随机实验,只有两种结果(通常称为“成功”或“失败”)。当一个事件有两种结果时,最好使用它。

伯努利分布
输入张量包含 3 行 3 列 0 到 6 之间的速率参数,返回泊松分布的输出。
输入张量包含 5 行 4 列 0 到 7 之间的速率参数,返回泊松分布的输出
泊松分布常用于模拟事件在时间或空间间隔内发生的次数。
它返回从独立的正态分布中抽取的随机数的张量。
它返回从标准偏差为 1 的独立正态分布中抽取的随机数张量。
当 mean 为 0 且 std 为 1 时,它不起作用,因此您将在下一个函数中了解 tensor.normal_()的内容。
正态分布是一种概率函数,描述了变量的值是如何分布的。
它创建一个均值=0、标准差=1 的标准正态分布。
它创建一个 1 × 5 维的矩阵 Z(1 维张量),其中填充了来自正态分布的随机元素样本,参数为 mean = 4 和 std = 0.5。
它有助于创建标准的正态分布
它返回给定张量的向量范数,其中 dim =0。
它返回给定张量的向量范数,其中 dim =1。
它返回给定张量的向量范数,其中 dim =1,p=1。
矩阵范数间接用于任何需要矩阵函数和/或矩阵级数的应用中。
结论
以上是我觉得有趣的 5 个统计 PyTorch 函数,你可以在 PyTorch 文档中找到更多。
参考链接
提供关于张量的参考链接
torch.Tensor:https://pytorch.org/docs/stable/tensors.html的官方文件
使用 Python 从点云生成 3D 网格的 5 步指南
3D Python
生成 3D 网格的教程(。obj,。ply,。stl,。gltf)自动从三维点云使用 python。(加分)表面重建,创造几个层次的细节。
在本文中,我将向您展示我的 3D 表面重建过程,使用 python 从点云快速创建网格。您将能够导出,可视化和集成到您最喜爱的三维软件的结果,没有任何编码经验。此外,我将为您提供一种生成多层次细节(LoD)的简单方法,如果您想要创建实时应用程序(例如,使用 Unity 的虚拟现实),这将非常有用。

使用 Python 自动生成的几个网格。在本文结束时,您将能够从点云创建数据集
3D 网格是一种几何数据结构,通常由一组相连的三角形组成,这些三角形明确描述了一个表面🤔。它们被用于从地理空间重建到 VFX、电影和视频游戏的广泛应用中。当需要一个物理副本时,或者当我需要在游戏引擎中集成环境时,我经常创建它们,在这些情况下,点云支持是有限的。

Roman Robroek 为酷遗产项目从 3D 捕捉环境生成的网格示例。(左)3D 点云,(中)网格覆盖的顶点,(右)纹理网格。如果你想了解如何获得这样的结果,请查看地理数据学院令人惊叹的地层 3D 重建器。
它们很好地集成在大多数软件专业人员的工作中。最重要的是,如果你想探索 3D 打印的奇迹,你需要能够从你拥有的数据中生成一致的网格。本文旨在为您提供一个高效的工作流程,分为 5 个可定制的步骤,并在文章结尾提供了我的可远程执行的脚本。让我们开始吧!
步骤 1:设置环境
在上一篇文章中,我们看到了如何使用 Anaconda 轻松设置环境,以及如何使用 GUI Spyder 管理代码。我们将以这种方式继续,仅使用两个库。
教程简单地设置 python 环境,开始处理和可视化 3D 点云数据。
towardsdatascience.com](/discover-3d-point-cloud-processing-with-python-6112d9ee38e7)
为了从点云中自动获取 3D 网格,我们将在我们的环境中添加另一个库,Open3D。它是一个开源库,允许使用一组高效的数据结构和算法来处理 3D 数据。安装需要单击您的环境旁边的▶️图标。

打开终端并运行以下命令:
conda install -c open3d-admin open3d==0.8.0.0
🤓 注:open 3d 包兼容 python、3.5、3.6 版本。如果您有另一个环境,您可以创建一个新的环境(best ),或者如果您从上一篇文章开始,通过在终端中键入conda install python=3.5来更改您的终端中的 python 版本。
这将自动安装软件包及其依赖项,您可以在终端提示时输入y来允许这个过程。现在,您已经为项目做好了准备。
步骤 2:加载和准备数据
启动你的 python 脚本工具(Spyder GUI,Jupyter 或者 Google Colab),在这里我们将调用 2 个库:Numpy 和 Open3D。
import numpy as np
import open3d as o3d
然后,我们创建保存数据路径和点云数据的变量:
input_path="your_path_to_file/"
output_path="your_path_to_output_folder/"
dataname="sample.xyz"
point_cloud= np.loadtxt(input_path+dataname,skiprows=1)
🤓 注 : 至于前面的帖子,我们会使用一个采样的点云,你可以从这个库中自由下载。如果想在不安装任何东西的情况下提前可视化,可以查看 webGL 版本。
最后,我们将point_cloud变量类型从 Numpy 转换为 Open3D o3d.geometry.PointCloud类型,以便进一步处理:
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud[:,:3])
pcd.colors = o3d.utility.Vector3dVector(point_cloud[:,3:6]/255)
pcd.normals = o3d.utility.Vector3dVector(point_cloud[:,6:9])
🤓 注意 : 下面这个命令首先实例化 Open3d 点云对象,然后从原来的 NumPy 数组给它添加点、颜色、法线。
为了快速查看您加载的内容,您可以执行以下命令(在 Google Colab 中不起作用):
o3d.visualization.draw_geometries([pcd])
第三步:选择啮合策略
现在我们准备通过网格化pcd点云开始表面重建过程。我将给出我最喜欢的有效获得结果的方法,但是在我们开始之前,一些浓缩的细节对于理解底层的过程是必要的。我将把自己限制在两个啮合策略。
策略 1:球旋转算法[1]
球旋转算法(BPA)背后的思想是模拟使用虚拟球从点云中生成网格。我们首先假设给定的点云由从物体表面采样的点组成。点必须严格表示一个表面(无噪声),即重建的网格显式。

使用这个假设,想象在点云“表面”上滚动一个微小的球。这个小球取决于网格的比例,应该比点与点之间的平均间距稍大。当你把一个球丢到点的表面时,球会被抓住并停留在三个点上,这三个点将形成种子三角形。从那个位置,球沿着两点形成的三角形边缘滚动。然后球在一个新的位置:一个新的三角形由两个先前的顶点形成,一个新的三角形被添加到网格中。随着我们继续滚动和旋转球,新的三角形形成并添加到网格中。球继续滚动,直到网完全形成。

Brett Rapponotti,Michael Snowden 和 Allen Zeng 的插图。来源
球旋转算法背后的想法很简单,但是当然,这个过程有许多注意事项,如最初表达的这里的:
- 球半径是如何选择的?半径是根据输入点云的大小和比例根据经验获得的。理论上,球的直径应该略大于点与点之间的平均距离。
- 如果某些位置的点相隔太远,球掉了怎么办?当球沿着一条边旋转时,它可能会错过表面上的适当点,而是击中对象上的另一个点,甚至正好是它的三个旧点。在这种情况下,我们检查新三角形
Facet的法线与点的Vertex法线方向一致。如果不是,那么我们拒绝三角形并创建一个洞。 - 如果表面有折痕或凹陷,使得表面与自身之间的距离小于球的大小,该怎么办?在这种情况下,球只会滚过折痕,而忽略折痕内的点。但是,这不是理想的行为,因为重建的网格对对象不精确。
- 如果曲面被分隔成多个点区域,使得球无法在这些区域之间成功滚动,该怎么办?虚拟球在不同的位置多次掉落到表面上。这确保球捕获整个网格,即使这些点的间隔不一致。

5 视觉效果中的半径影响。您可以看到,最佳网格会自动平衡最佳几何体拟合和三角形数量。
策略 2:泊松重建[2]
泊松重建更具技术性/数学性。它的方法被称为隐式网格化方法,我将其描述为试图将数据“包裹”在一块光滑的布中。在不涉及太多细节的情况下,我们试图通过创建一个全新的点集来拟合原始点集的水密表面,该点集代表一个与法线关联的等值面。有几个参数会影响网格划分的结果:
- 哪个深度?树深度用于重建。网格越高越详细(默认值:8)。对于有噪声的数据,您可以在生成的网格中保留离群点,但算法不会检测到它们。所以低值(可能在 5 到 7 之间)提供了平滑效果,但是你会丢失细节。深度值越高,生成的网格的顶点数量就越多。

- 哪个宽度?这指定了树结构最细层次的目标宽度,称为八叉树🤯。不要担心,我将在另一篇文章中讨论这一点以及 3D 的最佳数据结构,因为它扩展了本文的范围。无论如何,如果指定了深度,这个参数将被忽略。
- 哪个尺度?它描述了用于重建的立方体直径与样本包围立方体直径之间的比率。非常抽象,默认参数通常很好用(1.1)。

比例参数对结果的影响。看看它是如何包围初始点云的。
- 哪个合适?linear _ fit 参数如果设置为真,则让重建器使用线性插值来估计等值顶点的位置。
步骤 4:处理数据
策略 1: BPA
我们首先根据从所有点之间的距离计算出的平均距离来计算必要的半径参数:
distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 3 * avg_dist
在一个命令行中,我们可以创建一个网格并将其存储在bpa_mesh变量中:
bpa_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd,o3d.utility.DoubleVector([radius, radius * 2]))
在导出网格之前,我们可以将结果缩减采样到可接受的三角形数量,例如 100k 个三角形:
dec_mesh = mesh.simplify_quadric_decimation(100000)
此外,如果您认为网格可能会出现一些奇怪的工件,您可以运行以下命令来确保其一致性:
dec_mesh.remove_degenerate_triangles()
dec_mesh.remove_duplicated_triangles()
dec_mesh.remove_duplicated_vertices()
dec_mesh.remove_non_manifold_edges()
策略 2:泊松重建
🤓 注 : 该策略从 Open3D 的 版本 0.9.0.0 开始可用,因此目前只能远程工作。你可以通过我提供的 google colab 代码执行 这里 。
要用泊松得到结果,非常简单。您只需调整传递给函数的参数,如上所述:
poisson_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=8, width=0, scale=1.1, linear_fit=False)[0]
🤓 注意 : 该函数输出一个由 o3d.geometry 对象后跟 Numpy 数组组成的列表。您只想选择 o3d.geometry 来调整结尾的[0]。
为了获得清晰的结果,通常需要添加一个裁剪步骤来清除下图中突出显示为黄色的不想要的伪像:

原始泊松重建(左)和裁剪网格(右)
为此,我们计算包含原始点云的初始边界框,并使用它从边界框外的网格中过滤所有表面:
bbox = pcd.get_axis_aligned_bounding_box()
p_mesh_crop = poisson_mesh.crop(bbox)
你现在有了一个或多个变量,每个变量都包含了网格几何体,干得好!在应用程序中获得它的最后一步是导出它!
步骤 5:导出并可视化
使用write_triangle_mesh函数可以直接导出数据。我们只需在创建的文件的名称中指定我们想要的扩展名。ply,。obj,。stl 或者。gltf 和要导出的网格。下面,我们将 BPA 和泊松重建导出为。ply 文件:
o3d.io.write_triangle_mesh(output_path+"bpa_mesh.ply", dec_mesh)
o3d.io.write_triangle_mesh(output_path+"p_mesh_c.ply", p_mesh_crop)
为了快速生成细节层次(LoD ),让我们编写第一个函数。这真的很简单。该函数将网格、LoD 列表(作为三角形的目标数量)、结果文件的文件格式和文件写入路径作为参数。该函数(在脚本中编写)如下所示:
def lod_mesh_export(mesh, lods, extension, path):
mesh_lods={}
for i in lods:
mesh_lod = mesh.simplify_quadric_decimation(i)
o3d.io.write_triangle_mesh(path+"lod_"+str(i)+extension, mesh_lod)
mesh_lods[i]=mesh_lod
print("generation of "+str(i)+" LoD successful")
return mesh_lods
💡 提示: 我将在另一篇文章中介绍这个函数的基本功能以及它的结构。此时,了解该函数将(1)以所需的文件格式将数据导出到您选择的指定位置,以及(2)如果需要在 python 中进行更多处理,可以将结果存储在变量中,这是很有用的。
这个函数有一些魔力,但是一旦执行,它看起来就像什么也没发生。不要担心,您的程序现在知道什么是lod_mesh_export,您可以在控制台中直接调用它,在那里我们只需根据需要的值更改参数:
my_lods = lod_mesh_export(bpa_mesh, [100000,50000,10000,1000,100], ".ply", output_path)
有趣的是,现在你不需要每次为不同的负载重写一堆代码。您只需向函数传递不同的参数:
my_lods2 = lod_mesh_export(bpa_mesh, [8000,800,300], ".ply", output_path)
如果您想在 python 中可视化一个特定的 LoD,比如有 100 个三角形的 LoD,您可以通过以下命令访问并可视化它:
o3d.visualization.draw_geometries([my_lods[100]])
为了在 python 之外进行可视化,你可以使用你选择的软件(例如开源的 Blender、MeshLab 和 CloudCompare)并在 GUI 中加载导出的文件。直接在 web 上通过 WebGL,您可以使用 Three.js 编辑器或 Flyvast 来简单地访问网格。
最后,你可以将它导入任何 3D 打印软件,并通过在线打印服务获得报价🤑。

约 20 cm 的模型金色印花示例。使用在线服务获得价格的大致概念,你可以计算出一个基本的树脂打印需要 400 欧元。这扩展了本教程的范围,将在另一篇文章中讨论
太棒了。在这个 5 步指南中,我们介绍了如何从点云设置自动 python 3D 网格创建器。这是一个非常好的工具,将证明在许多 3D 自动化项目中非常方便!然而,我们假设点云已经是无噪声的,并且法线方向良好。

一些显示的法线
如果不是这种情况,那么就需要一些额外的步骤,下面文章中已经讨论过的一些很好的见解将在另一篇文章中讨论
完整的代码可以在这里获得:谷歌 Colab 笔记本
结论
您刚刚学习了如何导入、网格化、导出和可视化由数百万个点组成的具有不同 LoD 的点云!干得好!但这条路并没有到此为止,未来的帖子将深入点云空间分析、文件格式、数据结构、可视化、动画和网格划分。我们将特别关注如何管理大点云数据,如下面的文章中所定义的。
被称为点云的离散空间数据集通常为决策应用奠定基础。但是他们能不能…
towardsdatascience.com](/the-future-of-3d-point-clouds-a-new-perspective-125b35b558b9)
我的贡献旨在浓缩可操作的信息,以便您可以从零开始为您的项目构建 3D 自动化系统。你可以从今天开始在地理数据学院参加一个编队
编队学习先进的点云处理和三维自动化。开发新的 python 地理数据技能和开源…
learngeodata.eu](https://learngeodata.eu/point-cloud-processor-formation/)
参考
1.贝尔纳迪尼,女;米特勒曼,j。拉什迈尔;席尔瓦角;表面重建的球旋转算法。可视化与计算机图形学汇刊 1999 , 5 ,349–359。
2.卡日丹,m;波利索,m;泊松表面重建。欧洲几何图形研讨会 2006 ,1–10。
Pandas 处理岩石物理测井的 5 个步骤(下)
我使用这些更高级的步骤来处理 python 中的测井数据
在之前的工作中,我们使用 pandas 实现了 10 个简单的步骤来处理 LAS 格式的岩石物理测井记录。在这个项目中,我们将更深入地使用更先进的方法来处理测井数据。
这 5 个步骤是:
1)函数定义
2)应用函数
3)λ函数
4)切割函数
5)可视化
为了避免我们之前已经在特定油井数据上做的额外工作,我们将使用该项目的输出。如果你以前做过一个项目,你可以将数据帧写入 csv 文件(使用 to_csv 命令)在这里使用。否则,您可以通过我的 github 账号访问并下载名为 1050383876v2.csv 的 csv 格式,您也可以从我的账号这里下载完整的 Jupiter 笔记本文件。
让我们首先在工作簿上添加所需的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
然后,将 csv 数据读入 df 变量:
df = pd.read_csv('1050383876v2.csv')
df.head()

数据集看起来很干净。我还去掉了上面有一些 NaN 值的部分,所以起始深度是 1000 米。
1。功能定义
函数是一组执行特定任务的语句。函数可以使更大的程序更具可读性。它还可以帮助我们防止重复。一个函数有一个特殊的结构:
1-关键字 def ,
2-函数名,
3-我们传递值给函数的参数,
4-冒号(😃,
5-主体中的更多语句,
6-可选的返回语句。
根据密度测井计算孔隙度
根据岩石物理测井计算孔隙度有几种方法。这里我们将使用密度法。密度工具测量井筒条件下的岩石中等体积密度( b )。了解充填岩石孔隙度的流体密度( f )和颗粒密度( ma )有助于我们计算岩石的孔隙面积百分比。等式是:

从 def 关键字开始,密度孔隙度( den )函数可以用以下自变量(参数)定义: rb , rf , rm。
def den(rb, rf, rm):
# rb = bulk density from well log readings
# rf = fluid density
# rm = matrix density or grain density of rocks
return (rm-rb)*100/(rm-rf)
简单地说,该函数将返回密度孔隙度,如代码的最后一行所示。这里我们更喜欢用百分比(乘以 100)来表示孔隙率。定义密度孔隙度函数后,我们可以将其应用于数据集。
2.应用功能
使用 aapply函数,可将预定义函数(此处为密度孔隙度)应用于列或行方向的数据帧的每个元素。如果我们将其保留为默认值,它将出现在列上。
df['DNPOR'] = df['RHOB'].apply(den, rf=1, rm=2.71 )
由于 den 函数取 3 个值( rb , rf , rm ),我们可以从数据集引入主值( rb =df['RHOB'] ),并使用 apply 函数手动定义 rf 和 rm 常量。这里我假设流体成分是密度为 1 的水,主要矿物是密度为 2.71 的方解石。密度孔隙度存储在一个名为 DNPOR 的新列中。
3.λ函数
Lambda 函数是一个简单的单行函数,没有 def 或 return 关键字。事实上,它们是隐含的。要使用这个函数,我们需要键入 lambda,后跟参数。然后,冒号出现在 return 参数之前。
根据密度和中子孔隙度计算总孔隙度
总孔隙度定义为密度和中子孔隙度的平均值。
Tot_por = lambda DN,CN: (DN+CN)/2
函数名为 Tot_por 。对于λ函数,DN 和 CN 是密度和中子参数,后跟一个冒号。函数将返回这两个输入的平均值。
df['TPOR'] = Tot_por(df['CNPOR'], df["DNPOR"])
df.head()
调用 Tot_por 函数并引入 DataFrame 的相应列作为输入将创建总孔隙度,该孔隙度将存储在数据集中名为 TPOR 的新列中。

4.切割功能
当我们需要将数据值分段并分类到特定的容器中时,我们可以使用 Cut 函数。这里,我们将使用该函数根据岩石物理性质 GR 定义简单的岩石相。
相分类
相分类在地球科学中是一个巨大的主题,各种度量标准都可以发挥作用,但在这里,我们非常简单地看待它。根据测井记录中的自然伽马读数,我们可以从泥质地层中识别清洁地层。
df['facies_gr'] = pd.cut(df['GR'], bins=[0,40,300], labels=['clean', 'shaly'] )
根据 0 到 40(清洁)和 40 到 300(泥质)之间的 GR 读数,向数据集添加一个新列。
5.形象化
通常,python 中使用 matplotlib 库进行绘图。在这项工作中,我更喜欢使用 seaborn 库,因为它很简单。我想用我们在前面部分定义的相的图例颜色来显示密度孔隙度与中子孔隙度的散点图。这只需一行代码即可实现,而在 matplotlib 中,这需要 for 循环。
sns.lmplot(x='DNPOR', y='DT', hue='facies_gr', data=df)

结论
在这项工作中,我尝试在 pandas 中使用更高级的步骤来处理岩石物理测井数据。函数是使用编程避免重复的一种便捷方式。python 的函数如 apply 和 cut 或者自定义函数(本工作中的den&Tot _ por)对处理测井数据都是有用的。
如果你有任何建议,我很乐意看到你的评论!
5 个步骤:通过 SSH 从 Windows 到 Linux 系统进行远程开发的设置和代码

来自 www.flaction.com的 Pixel Perfect 制作的图标
远程开发是 VS 代码中非常受欢迎的功能。他们的官方文档提供了以通用方式配置它的标准说明。但是当我从 Windows 系统连接到远程 Linux 服务器时,我总是在输入 错误时得到下面的 损坏的 MAC,并且很难在一个地方找到完整的解决方案。

错误:输入的 MAC 损坏
因此,本文将提供一个 VS 代码指南,专门用于通过基于密钥的 SSH 在 Windows 系统和 Linux 系统之间进行远程连接,SSH 还可以处理输入错误导致的 MAC 损坏。
为什么我们需要远程开发:
- 对于软件开发人员来说,他们通常在本地开发新功能,然后在远程服务器上测试。
- 对于数据科学家来说,他们需要额外的计算资源,如远程 GPU 节点,以支持大型数据处理。
- 对于 DevOps 工程师来说,他们的主要任务之一是在不同的服务器上部署不同的产品,这需要频繁的远程配置。
先决条件:
- 已安装的 VS 代码。
你可以从他们的网站下载,然后按照我之前的指导做必要的设置。该指南也适用于一般的开发工作区。
- 在本地 Windows 和远程 Linux 系统上都安装了 OpenSSH。
简而言之,这将允许您与ssh一起工作。您可以通过ssh -V在两个系统上查看。它将返回您系统上安装的 OpenSSH 的版本。否则,不会安装 OpenSSH。你可以从这里安装用于 Windows,从这里安装用于 Linux。
现在,我们开始吧~🚀
**Overview of Contents**
Step 1: Install the Remote-SSH Extension in VS Code
Step 2: Verify the SSH Connection in PowerShell
Step 3: Enable the Remote Connection in VS Code
Step 4: Generate SSH Key Pairs
Step 5: Copy the Public Key to the Remote Server
【以下设置基于 win 10 PowerShell】
第一步:在 VS 代码中安装 Remote-SSH 扩展
启动 VS 代码->点击左边栏扩展图标- >搜索框远程-SSH->安装:

然后您会看到一个小的远程连接图标显示在状态栏的左下方:

步骤 2:在 PowerShell 中验证 SSH 连接
点击左上方的终端或快捷方式`ctrl+shift+``在 VS Code - >中打开一个 PowerShell 终端,如果不是 PowerShell,从这里更改:

通过在 PowerShell 中执行ssh username@hostname来验证 SSH 连接。(不管您是否在 conda 环境中运行它)
如果您可以成功登录到远程服务器,就可以开始下一步了。
💢如果您在输入 时得到如下 损坏的 MAC 错误:

✅ 你可以尝试以下解决方案:
先跑ssh -Q mac。它将返回本地系统上所有可用 MAC 加密算法的列表:

然后,选择您喜欢的其中一个,并通过使用-m选项添加所选算法来再次连接到远程服务器:
ssh -m hmac-md5-96 username@hostname
您可能需要尝试几次,直到找到远程 Linux 服务器支持的算法。
现在,您应该能够登录到远程服务器,并为下一步做好准备。
步骤 3:在 VS 代码中启用远程连接
点击左下方的远程连接图标->选择 Remote-SSH:打开配置文件…

或者你可以直接从你的本地主目录~/.ssh/config打开 ssh 配置文件。
将您的远程服务器信息添加到配置文件中,格式如下:
Host [hostname]
HostName [hostname]
User [username]
MACs **[optional; if you have the MAC error in Step 2, add the available algorithm which you found to here]**
如果您有多个服务器要连接,只需保持格式并一个接一个地添加它们。
最后,您将得到如下配置文件:(我们将在下一步回到标识文件

这个例子维护三个不同的远程服务器
现在,您应该能够连接到远程服务器,而不会出现 MAC 错误。
点击左下方的远程连接图标->选择Remote-SSH:Connect to Host…->您将会看到在您的配置文件中维护的远程服务器列表- >点击您的目标服务器(您可能需要输入您的登录密码)



维护的主机列表
成功连接后,您将导航到一个新的 VS 代码窗口,远程主机名显示在左下角:

至此,您已经通过 VS 代码成功地设置了一个可工作的远程开发工作区。但是,还没有结束。
如果在此停止,每次发出远程连接时,都会要求您输入登录密码。你还需要通过 VS 代码为远程服务器上的每个操作输入密码,即使只是打开一个文件夹。这真的很烦人。另一方面,密码登录不够安全。对每个人来说都很容易使用和理解,但这种方便不知何故牺牲了安全级别。密码很容易被暴力攻击破解。
因此,与其在 VS 代码中输入密码,不如使用 SSH 公钥和私钥对来进行身份验证。
步骤 4:生成 SSH 密钥对
在 VS 代码 Powershell 终端中,执行命令:
ssh-keygen
在密钥生成过程中,它会提示:

这允许您定义存储密钥的位置。按 ENTER 键将其保留为默认值。

这允许您输入并再次确认密码以保护您的私钥(当您键入时,它不会显示您的密码)。此后,您需要在以后使用私钥时输入该密码。这是额外的保护。可以按回车键跳过。
创建完成后,您将看到一把钥匙的随机艺术图像。您的密钥对存储在默认的隐藏~/.ssh目录中:

要再次检查,您可以通过以下方式查看上述位置的密钥对:
cd ~/.ssh
ls
您将看到两个新文件id_rsa存储私钥,而id_rsa.pub存储公钥。运行cat [filename]检查密钥内容。
如果一切顺利。现在,您可以在 ssh 配置文件中添加私钥~/.ssh/id_rsa的路径作为步骤 2 ,名称为标识文件:

请记住,一个公钥可以使用多次,❗ 不要把你的私钥分享给任何人。
步骤 5:将公钥复制到远程服务器
通过 VS 代码或任何其他带有密码的终端登录到远程服务器。检查~/.ssh目录下是否有authorized_keys文件。如果没有,请通过以下命令创建一个:
cd ~/.ssh
touch authorized_keys
authorized_keys是 OpenSSH 定义的默认文件名,用于存储公钥。您可以在这个文件中维护多个公钥。确保每个键都在一行上,并且键的中间没有换行符。
然后在这个远程文件中维护您的公钥(本地~/.ssh/id_rsa.pub 文件中的内容):
vim authorized_keys - >按i切换到插入模式- >将你的公钥内容粘贴到这里- >按ESC + : + wq写入并退出文件- >到cat authorized_keys重新检查。
现在,您在 VS 代码中安全方便的远程开发工作区已经准备好了!
结论
回到你的 VS 代码。发出新的远程连接。现在,您应该能够在没有密码的情况下连接到远程服务器,并像在本地一样使用它。玩得开心!
构建基于人工智能的欺诈检测系统的 5 个步骤
似乎所有现代欺诈检测系统都是基于人工智能的,但它实际上是如何工作的?建立这样一个系统的具体步骤是什么?系统决策是如何控制的?

图片作者。
原来这篇文章已经被 贴在了 的 DataArt 博客上,这是一家我领导 AI/ML 能力的技术咨询公司。它非常受欢迎,所以我要确保更多的人可以访问它。
让我们将构建基于人工智能的欺诈检测系统的高级流程分为 5 个步骤。
步骤 0。数据准备
数据是机器学习的燃料;燃料越好,汽车能跑得越快。我将跳过描述如何聚集数据以及如何存储和传输数据的部分,直接跳到应该如何处理数据来实现 ML 的神奇。
重要的是从清理数据开始,以获得用于分析的一组特定特征。让我们以支付为例;相关功能将是买方细节,卖方细节,付款金额,交易发送的时间,银行细节,知识产权以及其他。事实上,可能有数百个参数。领域越复杂,需要的参数就越多。因此,我们对数据清理得越好,移除依赖或相关的特征,最终算法的性能就越好。否则,很难判断哪个特征导致了预测。通常情况下,数据准备和探索可能会比 ML 项目的其余部分花费更多的时间。

技术图片:红色方块是高度相关的特征,红色方块越少,模型的可解释性越好。图片作者。
第一步。监督学习,或者你能从你已经知道的东西中利用什么?
公司通常有某种类型的欺诈检测系统。它们可能是基于规则的,因为需要大量的规则而变得不堪重负,仍然难以过滤所有可疑案例,或者是基于人工智能的/混合的,由第三方供应商提供,在公司基础架构之外处理敏感数据。
如果您决定提升保护级别并在内部构建欺诈检测系统,是否有办法利用现有的欺诈知识?其实是有的。有监督的机器学习意味着一个人告诉机器什么是错的,什么是对的。使用来自现有系统的可信结果,您可以大大加快学习过程。
通常,有许多算法可以使用。主要目标是找到最适合特定数据集的方法,并调整其参数,以获得真阳性(真正的欺诈)、假阳性(未被标记为欺诈的欺诈)和假阴性(未被识别为欺诈的欺诈)的最佳平衡。有一个图表叫做混淆矩阵,数据科学家用它来优化算法。

技术图片:混淆矩阵——橙色还是非橙色?图片作者。
你在这里得到的数字越好,新系统替换过时系统的速度就越快,因为它从历史数据中学习得越好。
第二步。异常检测
但是,如果现有的算法遗漏了许多欺诈元素,那该怎么办呢?这就是我们在这里的原因——寻找可能是欺诈性的可疑记录。
为了做到这一点,我们需要将所有的项目、交易、支付或我们处理的任何东西进行分组。小而远的星团是可疑的元素。这意味着聚类算法将它们标记为非典型的。他们不一定是欺诈性的,但他们值得一看,更深入的研究。

技术图像:集群的 3D 表示。真实的维数可能是作者的数百个 d .图像。
稍后,主题专家可以查看这些集群并确认
- 所有记录看起来都不合法,所有出现在该群集中的新交易都应该被自动阻止
- 或者只有一部分记录是可疑的,我们应该调整聚类参数或者将所有这些可疑的记录发送给人类专家进行审查。
第三步。时序分析和动态限制
一般来说,可以在静态数据集上进行聚类,但是预期的行为会随着时间而改变。个人或企业收入可能会增长,从而增加支出模式。此外,支出可能具有季节性,例如,假日期间的支出较高。还必须适应这些行为模式,以确保系统运行良好。它应审查异常交易,同时动态调整预期范围,以适应交易随时间演变的性质。
预测低风险走廊是时间序列算法的工作,从简单的自回归模型开始,到更复杂的模型,如 FBProphet(由脸书开发),它将季节性因素计算在内。

技术图像:深蓝色线—实际平均值和预期平均值,蓝色范围—预期偏差,黑点—实际值。范围外的黑点是可疑的。图片作者。
第四步。综合
一旦我们准备好了数据,训练并测试了模型,我们如何将它与现有的基础设施集成呢?
关于技术,没有什么复杂的。ML 模型被包装成服务(即 REST)以拥有一个 API,这样系统的其余部分就可以与之交互。然后,它应该被测试和部署(即作为 Docker 容器),连接到数据源和决策支持 UI。
从风险管理和验证的角度来看,并行运行新的欺诈检测系统和旧的系统(如果有)以确保新系统的一致性可能是有意义的。此外,可以引入人工验证来降低现实生活中错误决策的风险,以及通过额外的监督训练来改进模型。
使用 Python 创建基本机器学习模型的 5 个步骤

由约翰内斯·普利尼奥在 风景画
机器学习
在本文中,我们将探索来自Kaggle.com的 Udemy 类数据,并尝试使用 Pandas 、 Matplotlib 、 Seaborn 和 Scikit-learn 来预测哪些类是成功的。
数据集可以在这里找到,代码可以在这个 GitHub repo 找到。
首先,我们将导入以下包并读入数据集:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltdf = pd.read_csv(r"C:\Users\Andrew\Documents\Python Scripts\data set\udemy_courses.csv")
在开始分析之前,我们将运行df.info()来查看我们的数据集。我们可以看到我们有 3678 门课程,幸运的是在列中没有丢失数据!
RangeIndex: 3678 entries, 0 to 3677
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 course_id 3678 non-null int64
1 course_title 3678 non-null object
2 url 3678 non-null object
3 is_paid 3678 non-null bool
4 price 3678 non-null int64
5 num_subscribers 3678 non-null int64
6 num_reviews 3678 non-null int64
7 num_lectures 3678 non-null int64
8 level 3678 non-null object
9 content_duration 3678 non-null float64
10 published_timestamp 3678 non-null object
11 subject 3678 non-null object
dtypes: bool(1), float64(1), int64(5), object(5)
memory usage: 319.8+ KB
我们可以看到“published_timestamp”是作为一个对象存储的,所以在继续之前,让我们将其转换为一个日期时间变量。
df["published_timestamp"] = pd.to_datetime(df["published_timestamp"])
以下是我们将共同采取的步骤:
- 分布分析:课程的常见科目、时长、价位有哪些?
- 组合特性:我们可以组合任何列来获得更多有趣的特性吗?
- 将特征与目标变量进行比较:我们能否对成功的课程有初步的了解?
- 建立模型:我们能预测哪些课程最成功吗?
- 改进和部署模型:为了构建一个更好的模型并让其他人更容易访问,接下来我们可以做些什么?
分布分析: 一种常见的开始方式是对数值数据使用df.hist(),然后在对分类数据应用value_counts()后绘制条形图。我们可以使用df.select_dtypes([‘type’])来分离数字和分类数据。
num_cols_df = df.select_dtypes(['int64','float64','datetime64[ns, UTC]'])
cat_cols_df = df.select_dtypes(['object'])num_cols_df.hist(figsize = (10,10),bins=100)

这些特征大部分是指数分布的,除了价格。
对于分类变量,我们使用以下格式绘制相对频率:
(cat_cols_df[column_name].value_counts()/cat_cols_df.shape[0]).plot(kind="bar")
将“column_name”替换为“level ”,得到了下面的图表:

水平相对频率
再用“主语”:

主题相对频率
我们可能还想看看子分布,比如一个主题中的级别。为此,我们通过在[‘subject’]前添加[cat_cols_df[‘subject’]==’Business Finance’]来选择我们想要的主题,并运行几乎相同的代码行:
(cat_cols_df[cat_cols_df['subject']=='Business Finance']['level'].value_counts()/cat_cols_df.shape[0]).plot(kind="bar")

“业务财务”中“级别”的相对频率
组合功能:
我通常从寻找我能创造的相对价值开始。在这种情况下,我们可以用“内容持续时间”除以“讲课次数”来计算以小时为单位的平均讲课时间。
num_cols_df["average_lecture_length"] = num_cols_df["content_duration"]/num_cols_df["num_lectures"]
绘制直方图告诉我们,大多数讲座大约 0.1 小时,或 6 分钟长。

平均授课时长(小时)
虽然我们可能会马上说订阅者的数量是一个成功的类,但这并没有考虑到一些类是免费的或非常便宜的。为了更准确地衡量成功,我们应该看看收入,或“价格”*“订户数量”
num_cols_df["revenue"] = num_cols_df["price"]*num_cols_df["num_subscribers"]
绘制直方图显示了强指数分布,采用num_cols_df[“revenue”].mean() 会给我们带来 25 万美元的收入。

收入(十万美元)
比较特征与目标变量:
为了与我们的目标变量“收入”进行比较,我们可以使用 Seaborn 库。这可以帮助我们确定在模型中包含什么特性(或者以后删除)。
temp_df = pd.concat([num_cols_df,cat_cols_df], axis = 1)
sns.pairplot(temp_df, x_vars = ['content_duration','num_lectures','num_reviews','average_lecture_length'],y_vars = ['num_subscribers','price','revenue'], hue = 'subject')

pairplot()中的“色调”参数允许我们在图表上覆盖分类数据。“评论数量”看起来与 y 变量有很强的相关性,而且“商业金融”科目在“平均演讲长度”上有较大的差异,但在任何 y 变量上没有太大的变化。“Web 开发”在“平均授课长度”方面更为严格,但在 y 变量方面有很大的变化。有可能我们的组合特征‘average _ lecture _ length’在模型中不是一个好的预测器。
与“价格”或“订户数量”相比,“收入”似乎显示出更清晰的相关性,因此我们将坚持把它作为我们的目标变量。同样从商业角度来看,收入应该更重要。
下面是相同的 pairplot,但是用hue = ‘level’ 代替。“所有级别”在所有地块上的分布比其他的大得多,这一点在以后的研究中可能会很有趣。

建立模型:
我们通过分别准备前面的数字列和分类列来开始我们的数据管道。如果我们有任何空值,我们可以通过应用以下 lambda 函数之一来删除或估算数据中的缺失值:
fill_mean = lambda col: col.fillna(col.mean())
fill_mode = lambda col: col.fillna(col.mode()[0])
fill_median = lambda col: col.fillna(col.median())
对于“cat_cols_df ”,我们使用pd.get_dummies()创建虚拟变量列。我们将删除“课程名称”和“课程网址”,因为它们目前不太可能有用。以下函数为 ' cat_cols' 中的每个特定列创建虚拟列。
cat_cols_df = cat_cols_df.iloc[:,2:]def create_dummy_df(df, cat_cols, dummy_na):
for col in cat_cols:
try:
# for each cat add dummy var, drop original column
df = pd.concat([df.drop(col, axis=1), pd.get_dummies(df[col], prefix=col, prefix_sep='_', drop_first=False, dummy_na=dummy_na)], axis=1)
except:
continue
return dfcat_cols_df = create_dummy_df(cat_cols_df, cat_cols_df.columns, dummy_na = False)
值得注意的是,大多数管道使用 Scikit-learn 的 OneHotEncoder,因为该方法可以处理未知的数据类型以及稀疏矩阵。假设您的训练数据有一个“颜色”列,其中只有“红色”和“绿色”作为值,但新数据有一个额外的值“蓝色”。get_dummies()将为“蓝色”创建一个新列,即使它不在已训练的模型中,这将导致错误。
在为我们的分类列创建虚拟变量后,我们使用 Scikit-learn 的train_test_split()方法将数据随机分为训练集和测试集(“random_state”保存了分割,因此任何人都可以复制结果)。
对于 X,我们创建“X_num_cols_df”并删除“course_id ”,因为它可能只是噪声。“收入”和“订户数量”也被删除,因为这些是我们试图预测的。
from sklearn.model_selection import train_test_splitX_num_cols_df = num_cols_df[['content_duration','num_lectures','num_reviews','price']]X = pd.concat([X_num_cols_df,cat_cols_df],axis = 1)
y = num_cols_df['revenue']#Split into train and test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .30, random_state=42)
我们使用 Scikit-learn 创建一个模型,我们希望将数据拟合到该模型中,在本例中,我们使用的是线性回归模型。
from sklearn.linear_model import LinearRegressionlm_model = LinearRegression(normalize=True) # Instantiate
lm_model.fit(X_train, y_train) #Fit
拟合模型后,我们基于 X_test 数据预测成功,并寻找其均方误差(MSE),这是一种常用的评分指标。
from sklearn.metrics import mean_squared_errory_test_preds = lm_model.predict(X_test)mse_score = mean_squared_error(y_test, y_test_preds)
length_y_test = len(y_test)print("The MSE for your model was {} on {} values.".format(mse_score, length_y_test))
这输出
The MSE for your model was 312248327184.6464 on 1104 values.
改进和部署模型:
现在我们的模型显然很糟糕,所以让我们试着了解一下为什么。通常情况下,您的第一个模型会非常遥远——没关系,许多实际工作来自于选择功能子集、交叉验证/集成方法或使用不同的模型!
然而,在此之前,尽可能地了解您的数据领域是非常重要的——数据中可能有未捕捉到的事件和趋势,这些事件和趋势可能会破坏您的模型。Udemy 经常会将所有课程的价格降到 10 美元,不管初始价格是多少。除非我们能够找到一个类别的平均销售价格,否则删除“价格”是值得的。我还建议深入研究第三步将特征与目标变量进行比较,因为更好地理解模式将有助于推动洞察力,而不仅仅是调整模型本身。
改进模型的另一种方法是对“course_title”列应用自然语言处理(NLP ),以查看某些关键字的存在是否有影响。
分享这种模式的最简单的方法是把你所有的代码放在一个笔记本和活页夹里。如果你想要一个更干净的用户界面,你可以创建一个 Plotly Dash 应用,并将其部署在 Heroku 上。
祝你好运,编码愉快!
开发独特数据科学项目创意的 5 个步骤

由 Julia Nikulski 制作的图形显示了开发独特的数据科学项目创意的必要步骤。由 Freepik 、 Smashicons 、eucalype、 Kiranshastry 、 Becris 和 monkik 从 Flaticon 制作的图标。
入门
帮助您识别值得一试的新颖独特的数据项目的指南
任何项目中最困难的部分显然是想出一个新颖但可执行的想法。你很容易陷入数据集兔子洞。你花几个小时浏览现有的数据集,试图提出新的有趣的想法。但这种方法有一个问题:当你只关注现有的数据集时——关注 Kaggle 、 Google Datasets 、fivethirtyeeight—你会把你的创造力限制在这个数据集设计用来解决的一小部分问题上。
有时,我喜欢探索一个我觉得有趣的数据集。Kaggle 预测任务的第一百万次复制可能有利于我的学习进度。但是作为数据科学家,我们努力创造新的独特的东西,并产生有用的见解。
那么你怎么能想出一个新的主意呢?我将创造力研究的见解与自己的经历结合起来。这导致了 5 个关键问题,包括项目想法的例子。这些问题指导你的想法产生过程,让你充分发挥你的创造力。这将产生新的独特的数据科学项目想法。

丹尼尔·麦金尼斯在 Unsplash 上的图片。
1.我为什么要开始一个项目?
当你考虑开始一个新的项目时,你会在头脑中有一个意图或目标。为什么一开始要做另一个数据科学项目?对你的目标进行广泛的分类可以帮助你集中精力寻找一个想法。所以想想你是否想创造
- 一个投资组合项目向潜在雇主展示,
- 一篇关于概念、模型或探索性数据分析的博客文章,
- 一个让你实践一项技能的项目——比如自然语言处理、数据可视化、数据角力,或者某个特定的机器学习算法,
- 或者你是否有完全不同的想法。

2.我的专长和兴趣领域是什么?
思考这个问题很重要,主要有三个原因。首先,记住数据科学的维恩图。领域专业知识是每个数据科学家都应该拥有的重要资产。只有你也理解了潜在的问题,你才能用数据解决问题。否则,你实现的算法、可视化和创造的预测与该领域的任何从业者都无关。而如果你的工作会无关紧要,那你当初为什么要去做呢?
其次,对你正在处理的想法和数据集感兴趣是很重要的。你不想强迫自己把空闲时间花在一个你不关心的项目上。如果你对某个领域感兴趣,你不需要成为这个领域的专家。但是你需要愿意花时间做额外的研究,并且理解数据之外的问题。
第三,研究人员发现,在创作过程中引入约束会带来更好的结果。这意味着专注于某个特定领域或某个领域的组合会比试图在搜索过程中不受任何限制地提出一个想法产生更好的结果。例如,我的兴趣和专长领域是可持续性、金融、流行文化和自然语言处理。专注于这些主题将允许我在确定灵感是否可以转化为可执行的新想法时利用我现有的知识。

3.怎么才能找到灵感?
要找到灵感,你能做的最重要的事情就是阅读。各种来源可以帮助你在构思过程中发现有趣的主题:
- 新闻、观点、博客文章:轶事证据——以故事的形式——是想出点子的好方法。《连线》杂志发表了这篇关于谷歌自动补全功能中的政治偏见的文章。你可以用这个来研究语言模型中的偏见。或者你可以调查是否有可能根据在谷歌中输入的搜索查询来预测一个人的位置。
- 科学文献:学术论文通常包含讨论与研究主题相关的公开研究问题的段落。这篇介绍语言模型 GPT-2 的文章提到,如果不进行微调,该模型在某些任务(如回答问题)上的表现并不比 random 好。为什么不写一些关于微调这个模型的复杂性的东西呢?
- 数据科学帖子:浏览介绍数据科学主题和项目的博客帖子可以产生新的想法。我看到了这个 NLP 探索办公室,立刻后悔没有首先想到这个。但是探索另一个电视节目怎么样?还是几部电影确定模式?你可以用 GPT 2 号为你最喜欢的电视节目写剧本。
除了阅读,在你的日常生活中寻找灵感。每当你想知道一些事情的时候,考虑一下你是否可以用数据来回答这个问题。例如,我最近偶然发现了电视节目 The Boys 的预告片,看到了很多对 IMDb 的积极评价。所以我问自己,流行的电视剧变得更加暴力有没有一个被证实的趋势?喜欢暴力节目的观众越来越多了吗?利用这些好奇的时刻,用数据探索这些问题。
你有什么选择来从上面的灵感中创造想法?神经科学家确定了与想法产生有关的三种不同的心理过程:
- 你可以把已有的想法组合起来,创造一个新的结果(组合创意 ) →各种项目分析 Airbnb 房源,其他的分析房市。结合这些思路来考察 Airbnb 是否提高了一个城市的房价。
- 你可以探索一个现有的想法,寻找要解决的新问题(探索性创造力 ) →以围绕受过大学教育和自学成才的数据科学家的现有辩论为例,调查谁更成功。
- 你可以拿一个现有的想法,改变它的一些东西,完全改变它的规则或意义(转换创造力 ) →这是创造力最罕见的形式,在既定的概念空间之外运作。很难把握和描述。一个例子是,不要预测某件事会发生,而是尝试预测某件不会发生的事。

4.在哪里可以找到相关数据?
一旦你有了一个总的主题,寻找数据来决定你如何在一个数据科学项目中实现这个想法。这是决定你的想法是否可行的关键。考虑现有数据库以及仍需收集且更难找到的数据:
- 现有数据集来源 : Kaggle ,谷歌数据集, FiveThirtyEight , BuzzFeed , AWS , UCI 机器学习知识库, data.world ,Data.gov等等,一个快速的谷歌搜索就会发现更多。
- 其他人用过的方法:在谷歌和谷歌学术上搜索你选择的话题,看看是否有人已经调查过类似的问题。他们用了哪些数据?我们的数据世界结合了你可能不知道的学术和非学术资源。
- 通过以下方式收集数据: Web 抓取、文本挖掘、API、事件跟踪、日志收集。
如果你找不到任何可以帮助你表达项目想法的数据,那就重新措辞。试着推导出一个可以用你所拥有的数据来回答的想法。同时问问自己为什么想要的数据得不到?你关注的领域中的问题是什么,如何解决?回答这些问题可能会引发一个数据科学项目。

图片由 Erol Ahmed 在 Unsplash 上拍摄。
5.我能执行我最后的想法吗?
你有一个绝妙的主意!但它可实施吗?回顾你的想法产生过程。想想你想要实现什么(问题 1),你是否对这个领域感兴趣或有专长(问题 2),以及你是否有执行这个想法所需的数据(问题 4)。现在你需要确定你是否有能力实施这个项目并实现你的目标。
要考虑的一个重要因素是你愿意在这个项目上花费的时间。你不会想在这个话题上做博士的。所以你的期末项目可能只是你想法的一部分,也可能是学习你将来实现想法所需的技能。在这个想法产生过程的最后,应该是一个研究问题,在你愿意为实现目标而花费的时间里,你可以并且想要回答这个问题。

图片由 Sharon McCutcheon 在 Unsplash 上拍摄。
最后的想法
- 管理你的期望 : 想出一个可执行的新颖想法需要几个小时以上的时间。这是一个持续的灵感过程,你应该把你想到的任何想法都写下来。在手机上打开便笺,记录你的想法。你也许能把你的几个想法结合成一个强有力的项目。
- 和某人谈论你的想法:和某人讨论你的项目想法会对你有帮助。也许一个相关的问题更有意思。也许他们可以给你指出额外的数据来源。也许你需要一个共鸣板来意识到你的想法是否有意义。
- 不要害怕重新开始:每一次经历都会教会你一些东西。每次你写一行代码,你都在练习和扩展你的技能。当你意识到你的想法没有让你更接近你的目标,或者这个想法是不可执行的,不要害怕离开它,继续前进。你花的时间没有浪费。重要的是要明白什么时候你的努力不会得到至少同样多的回报。
本指南为我带来了新的独特的数据科学项目想法,我希望你会发现它和我一样有用。让我知道你的过程是什么,你认为这些步骤中缺少什么。
你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。
[## 通过我的推荐链接加入 Medium-Julia Nikulski
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@julia.nikulski/membership)
有效仪表板设计的 5 个步骤
创建有影响力的仪表板的指南

卢克·切瑟在 Unsplash 上的照片
仪表板仍然是任何公司数据科学流程的重要组成部分。从数据分析师到最高级别的高管,仪表板仍然被用来传达关键信息和从数据中获得洞察力。
在设计仪表板时,可以考虑许多不同的方面。数据、数据的可用性、可视化数据的需求、可视化数据的方式、对感知和认知科学的考虑,等等。你会发现数百种仪表盘设计指南和规则手册。面对如此多的信息,被规则所束缚而无法提供有用的东西是很常见的。
本文旨在提供一个清单,当你被要求设计一个仪表板时,你可以考虑 5 点。即使您是新手或经验丰富的人,您也可以使用下面的指针来创建仪表板,以正确有效地传达信息。
所以,让我们开始吧!!
步骤 1:评估需求
请记住,仪表板的目标很重要。关于仪表板的讨论经常集中在仪表板的外观上。人们喜欢看到按照他们熟悉的方式设计的仪表板。这导致仪表板无法解决手头的问题。这里的关键是关注仪表板解决什么问题,而不是它是如何设计的。
另一件重要的事情是,仪表板与用户的能力相匹配。如果我们能了解用户的金属模型,我们就能更好地评估仪表板的需求。仪表板既不应该非常复杂,也不应该过于简单,而是应该与用户的能力相匹配。
在这一步要问的重要问题:
- 仪表板将回答的 5 个关键问题是什么?将采取什么行动来应对它们?
- 仪表盘的受众是什么?
- 仪表板上需要显示哪些信息项目,为什么它们很重要?
- 仪表板上的哪些项目回答了您的主要问题?
- 信息需要以什么样的详细程度(粒度)来表达?
- 哪些信息项之间的比较有助于回答关键问题?
- 仪表板需要多久更新一次?
第二步:制作原型
清楚了解仪表板和信息项的目标后,制作仪表板的原型。这有助于您了解您手头有哪些组件,并找出您可能缺少的东西。
原型可以是简单的手绘草图。不需要设计一个工作原型。
这里的目的是定义将出现在仪表板上的信息的不同部分,它们的重要性以及它们应该如何排列。
此外,征求对原型的反馈。你可能不会第一次就把设计做对。尝试在你的设计中引入新的视角。
第三步:选择图表
一张图胜过千言万语。所以选择正确的图片(图表)很重要!图表对于可视化模式、趋势和获得洞察力非常重要,否则仅通过查看原始数据很难获得这些信息。
- 随时间变化的趋势: 折线图、面积图、条形图
- 对比与排名: 条形图
- 相关性: 散点图,棒线组合图
- 分布: 箱线图,直方图
- 部分到整体: 堆积条形图
- 地理数据: 地图搭配其他海图
此外,你也可以查看data-to-viz.com获取图表类型的详细指南。
第四步:确保图表是有效的
除了选择正确的图表类型,我们还需要确保图表是有效的。
Tableau 有一份关于可视化分析最佳实践的白皮书,其中概述了下面一些让图表更容易理解的示例:https://www . tableau . com/sites/default/files/media/white paper _ visual-analysis-guideline _ 0 . pdf
不要让你的图表信息过多。相反,创建分区有助于更好地理解图表。

为图表选择正确的方向。

避免在一个图表中使用太多颜色。

组织图表,使其能够轻松回答问题。

第五步:收集反馈并重申
收集用户对图表的反馈,以便更好地评估它。
确保您的仪表板回答了您设计它来回答的关键问题。确保图表类型正确,图表易于理解。找出图表中是否有过滤或深入查看的要求。根据反馈改进设计。
制作仪表板是一门艺术,也是一门科学。因此,为了构建出色的仪表板,您需要投入精力和时间,进行协作和重申!
演职员表:苏米特·夏尔马
产品分析有目的沟通的 5 个步骤

(来源:坎瓦)
产品分析的目的是帮助你做出提高客户价值的决策和行动。就是这样。做出更好的产品。做出更好的服务。
在较小的组织中,信息的传播要简单得多。利益相关者越来越少,优先级也越来越模糊。对于较大的组织,导致决策的网络有更多的节点。更广泛的系统带来了不同的接受度和更高的误解几率。
然而,在这两种情况下,你的信息都需要有目的、有计划地分享。在这篇文章中,我们将重点关注:有目的、有计划地传达你的分析。
该框架分解如下:
- 设定你的目标
- 定义你的受众
- 精心制作你的信息
- 选择您的频道
- 调整你的时间
设定你的目标
你为什么分享这个?你希望你的观众做什么?
在我们进入内容之前,让我们从沟通的一个重要部分开始——目的。
最起码,我们希望避免类似“那又怎样?”“好的,很酷,”或者——在我的 Chik-Fil-A vs. Popeyes 推文下面的例子中——“为什么我会看到这个?”。

没人问我对辣鸡三明治辩论的看法。(来源:推特)
分享分析的三个原因
分享您的分析结果有三个主要原因。
首先是创造对某个话题的认知。作为产品经理,你总是在创造环境。您正在识别要解决的问题,突出无效的用户流,或者监控您的发布的采用。
抓住这些机会需要别人看到你所看到的。在这些场景中,您(希望)使用数据来创建对这些情况的意识。
第二是产生洞察力,培养理解力。当你深入一个话题时,你和你的利益相关者可能会对正在发生的事情和原因感兴趣。你可能已经预料到了那些重要的问题。(不要脸塞给我的帖子:高级分析从已证实的问题开始。)
在这种情况下,您希望与利益相关者分享您的发现。你可以更好地理解正在发生的事情。它也可能固执己见,并以某种方式框定形势。
最后,你可能想要为一项行动或一项决定辩护。当你到了一个需要努力或决策的关头,数据起着重要的引导作用。您可以使用模型来评估不同的战略选择。你也可以根据你所做的决定来预测未来。
直截了当地说,数据可以用来增加决策信心。
定义您的受众
你会和谁分享信息?
我们可以使用的背景等级和的参与等级来对观众进行分组。
背景水平是指个人对你的信息做出有意义的回应的准备程度。这可以是知识、责任或投资的形式。
参与程度是您要求个人采取的行动的直接性或影响力。这代表了一个人或一个团队对你的计划的成功有多重要。
三种受众类型
有了这两个属性,您就可以开始创建三个受众群体。

(来源:乔里兹·德·古兹曼)
直接团队成员是具有高背景和高参与度的个人。他们非常了解你的计划,并且对你的目标有着深刻的理解。他们通常是第一个知道发展和新见解的人。
合作者展示高背景-低参与或低背景-高参与。他们由那些意识到某种情况但对你的工作没有直接影响的人组成。或者,他们是你需要动员的个人,但不需要很多环境来执行。
观察者语境低,参与度低。这些人将是最后一批收到你的分析信息的人。与这些人分享的目的是让他们广泛了解你的计划。
选择受众时的考虑因素:
- 当你远离中心的时候,你对信息的控制就越少
- 低语境受众很有可能产生误解
- 如果混合分组,请调整您的消息以考虑低上下文
- 错开你的通信,以控制你的信息,减少噪音
- 像任何优先级排序一样,关注最小努力的最高回报
精心制作你的信息
你需要了解哪些要点?
下面是我在交流中使用的一个结构。
- 求问与推荐。因为大多数人都很忙,所以我会以行动或提问开始。你提供了一个镜头,观众应该通过它来观看你的其余内容。
- 关键要点。综合你的听众需要吸收的最突出的观点。在这里保持公正和诚实是至关重要的。我已经看到太多有偏见的观点了。
- 语境构建。你有机会让你的听众了解为什么这种沟通是必要的,以及他们需要知道什么才能负责任地、有效地行动。
- 方法论。透明度可以与听众建立信任,促进健康的讨论。如果你是数据的接收方,你应该要求方法清晰。
- 详细的调查结果。下意识的反应是列出见解和数据点。更有效的方法是用为什么它是必要的来支持你的结论——通过故事和暗示。
选择您的频道
你将如何向你的听众传达这一信息?
有几种方法可以分享你的发现并倡导行动。典型的例子是演示文稿、电子邮件、Slack 或自助仪表板。

丹尼尔·山特维克在 Unsplash 上的照片
以下是选择信息传播媒介时需要考虑的几个问题:
- 互动性。你需要多少互动来推动你建议的行动?当涉及到分析时,您可能需要一个允许讨论和阐述的论坛。电子邮件或聊天可能足以提供简短的更新。
- 受众规模。有些频道适合爆破给大批人看。其他的更有利于更亲密的交流。
- 最大化参与度。选择受众最有可能消费你的内容的渠道。
- 勾兑渠道。一封邮件可能解决不了问题。有时你需要发送一封预读邮件,然后安排一次简短的面对面讨论。你需要设计一个“决策之旅”,并带着你的听众一起来。
努力掌握你的时间
你应该什么时候分享你的发现?

托马斯·博尔曼斯在 Unsplash 上拍摄的照片
时机是迄今为止沟通你的分析最抽象的部分。没有硬性规定说你什么时候应该发送任何东西。但是,您可能需要考虑以下几点:
- 准备好了就分享。在这种情况下,准备好意味着你对自己的工作质量、对结果的解释以及隐含的行动/决定充满信心。
- 根据紧急情况的需要尽快分享。在某些情况下,发生的事件需要你尽快提高团队成员和合作者的意识。例如,使用率的急剧下降应该引起产品、工程、财务和客户支持部门的注意。
- 错开各种观众类型。正如我之前提到的,你可能希望优先与直接团队成员交流,然后是合作者。一旦决策和行动计划明确,您就可以与观察者分享。
- 错开在观众群内。直属团队可能由不同的部门组成。决策之旅可能有一条信息共享的最佳路线。根据联盟建设和决策链随意分享信息。
把所有的放在一起
如果这篇文章有什么值得借鉴的,那就是:与分析人员交流需要有目的性和深思熟虑。分享你的发现应该突出新的机会,创造更多的理解,或推动具体的行动。规划您的信息并根据特定受众进行定制,可以确保您将噪音保持在最低水平,同时最大限度地发挥您的预期效果。
我们在这里没有涉及的其他主题包括您的信息的语气以及适应您组织的数据文化。我经历过低成熟度的数据文化,其中强调问题被认为是不利的。
侧栏:一些文化甚至可能将数据视为与战略相对立的东西。上周,一位即将离任的产品副总裁在她的告别邮件中建议我们“平衡战略和数据。不是非此即彼。”对此我不禁感到失望。我从来不知道战略性和数据驱动是两个极端。
我跑题了。
看啊。您付出了艰辛的努力来获取数据,从中提取信息,并找出利用这些信息的方法。读完这篇文章后,你就有了一个框架来沟通和招募他人加入你的事业。让我们制造一些更好的产品。
注册我的战略和分析简讯。在此订阅!
查看我在产品分析上的其他帖子
数据流畅的责任是对现实负责。只有这样,你才能做出最好的决定。
towardsdatascience.com](/25-sapient-principles-for-better-data-literacy-5ff5d42480a5) [## 卓越的分析始于经过验证的问题
分析最容易被忽视的方面也是最关键的——知道哪些问题很重要。
medium.com](https://medium.com/swlh/superior-analytics-starts-with-proven-questions-83e623fa27bf) [## 产品分析数据治理的 31 个最佳实践
治理可能不是转型变革中最激动人心的部分。它让你的其他投资得到回报…
towardsdatascience.com](/31-best-practices-for-product-analytics-data-governance-d03f23b0e841)
作为反种族主义数据科学家需要采取的 5 个步骤
在一个种族主义的社会,仅仅是非种族主义者是不够的【数据科学家】。我们必须反对种族主义[数据科学家]——安吉拉·戴维斯

数据科学家是数据管家。我们收集数据、存储数据、转换数据、可视化数据,并最终影响数据的使用方式。在我们这个数据驱动的世界里,我们发现自己有责任用数据来讲述故事和影响变化。
但是有了这个责任,我们这些非黑人数据科学家仅仅不种族主义是不够的。在乔治·弗洛伊德、布里奥纳·泰勒、艾哈迈德·阿贝里和太多其他黑人死后,我们坐在电脑屏幕后面写代码、感到愤怒却不采取行动是不够的。我们承认美国继续存在的种族主义制度,但却不积极采取任何行动,这是不够的。
正如安吉拉·戴维斯所说,“在一个种族主义社会,仅仅是非种族主义者是不够的。我们必须反对种族主义。”非种族主义者和反种族主义者都认识到种族主义和白人至上是错误的。反种族主义者是那些采取行动对此做些事情的人。
作为非黑的数据科学家,我们必须是反种族主义的数据科学家。我们必须对我们的权力和特权负责。我们必须正视数据和算法被用来延续种族主义的方式,并在我们自己的工作中消除种族主义的决定和算法。我们必须认识到我们的领域缺乏多样性(只有约 3%的数据科学家认为是黑色的),并为改变这一点的途径做出贡献。成为反种族主义的数据科学家不是一次性的决定,也不是我们能够完全实现的目标,而是我们每天都要做出的承诺,无论是现在还是未来,都是为了建设一个更加公平公正的世界。
我们可以从以下 5 个步骤开始:
第一步:教育我们自己成为反种族主义者
要成为反种族主义的数据科学家,我们必须采取措施成为反种族主义的个体。反对种族主义对于白人和有色人种是不同的。正如国家非裔美国人历史和文化博物馆的工具包中所写的:“对于白人来说,反种族主义随着他们种族身份的发展而发展。他们必须承认并理解他们的特权,努力改变他们内在的种族主义,并在看到种族主义时打断它。对于有色人种来说,这意味着认识到种族和种族主义是如何被内化的,以及它是否被应用于其他有色人种。”Anneliese Singh 博士的《种族愈合手册》中的这段摘录是一个很好的起点,因为它讲述了个人在反种族主义的持续过程中可以承担的六项责任:阅读、反思、记忆、风险、拒绝和建立关系。
特别是那些已经开始承认特权并希望阅读和反思的白人读者——在让黑人、土著或有色人种(BIPOC)朋友负担阅读资源或对话的请求之前,先从目前在线提供的许多资源列表开始,如这里的和这里的和,并联系也在这次旅程中进行对话的白人朋友。
第二步:了解数据和算法如何被用来延续种族主义
作为数据科学家,我们使用数据来回答问题、解决问题,并且(希望)产生积极的影响。但历史一再表明,良好的意愿是不够的。数据和算法被用来延续种族主义和种族主义社会结构。我们必须让自己了解这些现实以及它们对黑人生活的不均衡影响。这份清单只是一个起点,绝非详尽无遗;在我们应对这些挑战的努力中,我们必须继续学习、促进和扩大关于这项工作的研究和报告。
新文章 : 医学算法中的种族偏见有利于白人患者,而不是病情严重的黑人患者;美国研究称许多面部识别系统存在偏见;机器偏见:全国各地都有用来预测未来罪犯的软件。而且对黑人有偏见;随着摄像机追踪底特律的居民,一场关于种族偏见的辩论随之而来。脸书的广告投放算法存在性别和种族歧视;拉姆齐县的社区成员如何阻止大数据计划将学生标记为处于危险中
讲座 : 大数据、技术、法律;算法公正:种族、偏见和大数据;合法化真正的安全(其中包括面部识别的讨论,以及警方如何监视被指控违反社交距离令的底特律居民)
书籍(考虑从一家 黑书店 ) :压迫的算法:搜索引擎如何强化种族主义(萨菲亚贵族);《人工智能:计算机如何误解世界》(梅雷迪思·布鲁萨德);自动化不平等:高科技工具如何描述、管理和惩罚穷人(弗吉尼亚·尤班克斯);技术错误:性别歧视的应用程序,有偏见的算法,以及其他有毒技术的威胁(萨拉·沃希特-博特彻);破坏数学的武器(凯茜·奥尼尔)
跟随的专家:Nasma Ahmed(数字司法实验室);阿尔瓦罗·贝多亚(乔治敦大学法学客座教授、隐私与技术中心创始主任);梅雷迪思·布鲁萨德(NYU 大学副教授);Joy Buolamwini(麻省理工学院媒体实验室,算法正义联盟创始人);马克斯·克莱蒙(Holyoke 市长阿莱克斯·摩尔斯的高级政治顾问);Teresa Hodge(R3 Technologies 联合创始人兼首席执行官);塔米卡·刘易斯(数据司法实验室研究员);Yeshimabeit Milner(黑人生活数据联合创始人兼执行董事);Tawana Petty(数字社会实验室非常驻研究员,底特律社区技术项目主任);rashida Richardson(AI Now 政策研究总监);Samuel Sinyangwe(零号战役联合创始人);Latanya Sweeney(哈佛大学政府和技术教授,数据隐私实验室主任)
组织追随 : 数据&社会;艾现;数字公民社会实验室;隐私与技术中心;黑人生活的数据;战役零;数字股权实验室;数据正义实验室;算法正义联盟
*虽然这篇文章特别关注对黑人个人的反种族主义支持,但也有与种族、性别、性和其他人口属性相关的长期数据驱动的歧视历史,我鼓励读者也了解更多
第三步:消除我们工作中的种族主义决策和算法
作为反种族主义的数据科学家,我们必须承诺每天在自己的工作中采取行动,消除种族主义决策和算法。没有一个清单可以做到这一点,但我发现自己经常向我参与的数据科学项目提出一系列问题。这些问题的一部分来自我参加的 2018 年讲座,题为“你拥有的数据和你提出的问题”,由 UPP up 的高级政策分析师 Logan Koepke 提出。
如果这些问题的答案揭示了潜在的种族主义,我们必须大声疾呼,挑战现状。
从你掌握的数据开始。查看数据,并经常联系主题专家,以便更好地理解:
- 数据是如何获得的?
- 数据是为谁获得的?
- 数据是由谁获得的?
- 是否获得了获取数据的许可?
- 如果人们知道这些数据正在被获取,他们会感到舒服吗?
- 如果个人知道这些数据是如何存储或共享的,他们会感到舒服吗?
- 数据是为了什么目的获得的?
- 这个数据怎么可能有偏差?
- 探索杂志数字防御剧本来考虑你如何更好地通知和包括更广泛的社区,包括黑人社区,进入关于获取和使用数据的对话
考虑你希望用你的数据回答的问题或解决的问题。提问:
- 将受此分析影响的社区是否参与了形成您希望回答的问题的过程?如果没有,为什么没有?
- 当前的目标是否使历史数据集的使用复杂化,并以不同于最初预期的方式使用它们?
- 预测的结果在多大程度上不同于数据中的观察结果?你问的问题是不是试图强加一个没有事实根据的现实?
- 预测这一行为是否也改变了未来的观察空间?行为会因为预测而发生怎样的变化?
当你建立一个模型时,像对手一样思考:
- 这个系统怎么玩?
- 它怎么会被用来伤害人,尤其是那些在 BIPOC 社区的人?
- 这种模式可能会带来什么意想不到的后果?
- 当模型从新数据中“学习”时,这些新数据会如何引入新的偏差?
当你传达模型的结果时:
- 模型是否经过沟通,使得提供数据的社区能够查看和理解结果?
- 您是否清楚地传达了测试模型以发现种族偏见的方式?
了解技术细节:
有越来越多的技术方法研究以一种考虑公平的方式解决算法中的竞争。简单地不将种族作为一个变量包括在算法中,并说你有“通过无知的公平”是不可接受的 : j 仅仅因为一个算法不包括种族作为一个预测因素并不意味着它是无偏见的。相反,数据科学家应该明确考虑算法对种族的敏感性。这篇文章介绍了算法公平性,包括人口统计均等、均等优势和预测率均等的概念,以及可用于在预处理、训练和后处理过程中减少差异的工具。这篇文章展示了如何使用 SHAP,一个可解释的人工智能工具来探索人口统计的均等性。麻省理工学院 D-Lab 的报告探索国际发展机器学习的公平性相当详细地探讨了如何将公平性集成到机器学习项目中。对于额外的学习,利用这个免费的在线教材和这些视频:谷歌机器学习速成班 ML 中的公平性; 2017 机器学习中的公平性教程; 21 个公平定义及其政治。
第四步:致力于增加数据科学领域的多样性
2020 年哈恩哈姆美国数据和分析报告发现,只有 3%的数据和分析专业人士被认为是黑人,在领导岗位上就更少了。这是不可接受的,特别是当我们(非黑人数据科学家)继续使用从黑人社区收集的数据并编写影响黑人社区的算法时。
为了推动我们工作的组织和整个数据科学界进行变革,我们必须致力于:
- 直面我们自己无意识的偏见,以及它们如何在工作场所表现出来,从而使我们的领域成为一个更具包容性的空间
- 盘点我们的内部公司实践,并做出改变,在我们组织的各个层面推进公平、多元化和包容性
- 审查和更新我们的招聘流程,使其不反映负责招聘的个人/团队的无意识偏见
- 要求在执行领导团队、董事会和专家小组中有代表
- 开发领导力途径,支持来自历史上代表性不足背景的新兴领导者
第五步:向致力于数据意识和增加数据科学多样性的黑人领导和社区驱动的组织捐款
众所周知,数据科学是一个利润丰厚的领域,平均年薪约为10 万美元。由于我们并非生来就了解数据科学,我们中的许多人很可能由于强大的教育经历而进入了这个领域。作为反种族主义的数据科学家,我们必须认识到,我们生活在一个种族主义的社会,教育机会分配不均。由于数据科学影响着每一个人,我们必须致力于使用我们的工作所获得的财政资源来支持教育体验,以增加数据科学劳动力的多样性(并使这一利润丰厚的领域更容易进入)以及每个人的数据意识。
支持黑人领导和社区推动的组织,为数据意识做出贡献
每月定期向黑人领导和社区驱动的组织捐款,以促进数据意识、数据收集和对警察暴力等及时问题的数据可视化。要考虑的组织包括:
支持为黑人学生服务的数据科学和技术项目
设立每月定期捐款,以支持为黑人学生服务的数据科学和技术项目。虽然志愿获得教学机会可能很诱人,但对于 BIPOC 学生来说,从 BIPOC 数据科学家那里学习是非常强大的。考虑财政支持计划,例如:
在你当地的社区大学设立奖学金
2016 年,谷歌完成了一项研究,强调了社区大学在创造一条增加计算机科学多样性的道路方面可以发挥的作用和面临的挑战。与大学相比,社区学院通常对启动奖学金的财政要求要低得多,而且这些奖学金可以发挥很大作用。联系当地社区大学的经济资助办公室,从今天开始。
在历史上的黑人学院或大学(HBCU)启动或贡献奖学金或数据科学项目
许多 HBCUs 拥有现有或新的数据科学计划,包括:
- Clark Atlanta 大学、Spelman 学院、莫尔豪斯学院和莫尔豪斯医学院的 AUCC 数据科学计划由 UnitedHealth 在 2019 年提供的 820 万美元捐款资助
- 位于 Prairie View A & M 的大军事数据情报卓越研究和教育中心
- 在 NC A & T 获得应用科学和技术博士学位,专注于数据科学和分析
- 科平州立大学人工智能及其应用实验室
- 鲍伊州立大学的虚拟现实实验室
请直接联系这些计划,了解更多信息。
作为非黑人数据科学家,我们的工作要求我们不仅要认识到种族主义,还要成为反种族主义的数据科学家并采取行动。
我们不能袖手旁观,因为我们作为数据管家所做的决定继续对黑人社区造成不可挽回的伤害。我致力于这篇文章中的步骤,同时知道只要种族主义继续存在,这项工作就不会结束。
我希望你能加入我。
我欢迎反馈和其他贡献。
感谢朋友、同事和家人对这篇文章的草稿提供了反馈,也感谢许多榜样在我的旅程中提供了指导。工作仍在继续。
数据告诉我们关于数据科学家的 5 个故事
数据科学家通过数据讲故事。但是数据可以讲述数据科学家的哪些故事呢?

照片由 Dariusz Sankowski 拍摄
这听起来像是结构化数据的报复,但实际上这只是由 Kaggle 平台进行的一项调查。2019 年 Kaggle 机器学习和数据科学调查的数据在这里可用,因此我们可以听听他们可以告诉我们的关于数据科学家的故事。
这些问题引导我们完成了本次分析:
- 他们的教育背景如何?
- 他们在日常工作中从事哪些活动?
- 他们使用哪些工具?
- 他们的工资呢?
以下是他们告诉我们的故事:
教育

作者图片
我知道,如果你刚刚开始成为数据科学家的旅程,第一个数字对你来说可能是个坏消息。我不想给你任何剧透,但如果你现在感到失望,去看看最后一节叫做学历 x 工资的内容,它可能会让你再次冷静下来。
大多数回答调查的数据科学家确实有硕士学位。尽管如此,他们通过受欢迎的平台参加在线课程仍然非常普遍,如 Coursera、Udemy、DataCamp、Udacity 和其他许多平台。

作者图片
这可能表明,无论你的正规教育背景如何,你都必须不断寻求知识,尤其是在这个几乎每天都给我们带来新闻的技术领域。
活动
听到数据科学,难免会想到人工智能和机器学习算法的炒作。但是,当谈到数据科学家日常生活时,那会是主要任务吗?

作者图片
他们中超过 60%的人实际上必须处理数据分析,而不仅仅是担心使用什么算法或找到改进模型的方法。实际上,调查向我们表明,无论你是数据科学家还是数据工程师,数据分析都会在你的活动中发挥很大作用。
此外,我们可以看到,几乎 35%参与调查的数据科学家从事与数据基础架构相关的活动。这显示了数据科学领域中不同角色之间的关系。
工具
如果我告诉你 Python 是数据科学家中最受欢迎的编程语言,你可能不会感到惊讶。但是如果我问你他们最常用的第二语言是什么呢?

作者图片
如果你的答案是 SQL,那你就答对了!SQL 或结构化查询语言是一种简单但功能强大的语言,它的命令可以分为四个主要功能:数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)和数据查询语言(DQL)。
它向我们展示了数据科学家的大部分工作是通过在数据库中执行查询、转换、操作和分析来理解数据。
但是语言只是我们可以在数据科学家的工具箱中找到的工具之一。使用最多的数据库和机器学习框架呢?


作者提供的图片
我们可以看到,在这些关系数据库中, MySQL 是最受欢迎的,尽管其他如 PostgreSQL 和微软 SQL Server 似乎也是数据科学家的宝贵工具。
如果说机器学习框架的话,Python 的流行导致 Scikit-Learn 成为使用最多的框架,其次是 Keras 、 XGBoost 和 TensorFlow 。
薪水

作者图片
你可以是数据或业务分析师、数据科学家、数据或数据库工程师。如果你住在美国,你很幸运。那是你更有可能获得更高薪水的地方。
对于数据科学家来说,我们有一个特别的好消息。

作者图片
在所有这些职业中,数据科学家似乎是年底账户金额较高的职业。
然而,这不仅仅是好消息。

作者图片
尽管我们有相当多的人不愿意宣布他们的性别(在这一点上,我们必须说,Kaggle 允许自我描述性别,以防他们与男女选项无关),但我们可以看到,在那些宣布自己是这两种性别之一的人中,可悲但并不奇怪的是,女性似乎比男性获得的报酬更低。
教育程度 x 工资
如果你从第一部分就来到这里,我在这里让你冷静下来:尽管博士和硕士学位显然与更好的报酬有关,但看起来不管你的正式教育背景如何,如果你致力于学习必要的工具和概念,房间里有足够的空间给你。

作者图片
我们可以看到,大多数不同背景的人之间的工资差异并不是很大,这意味着尽管这可能是一条充满挑战的道路,但你肯定可以通过数据科学找到自己的路。
结论
通过这篇文章,我们对如何更好地理解现实世界中的数据科学家有了一个大致的了解,这里我们有一个迄今为止我们所见的快速简历:
- 尽管似乎有很多专业人士拥有硕士学位,但每个真正致力于成为有能力的专业人士的人都有一席之地;
- 学习工具和概念的一个好方法是参加在线课程,有很多选择,从大学提供的课程到与该领域最大的公司合作准备的课程;
- 如果你不知道该学哪种语言,Python 是个不错的选择,但是不要忘了 SQL。仍然是关于工具,Scikit-Learn、Keras、TensorFlow 和 MySQL 等数据库似乎在数据科学家中非常受欢迎;
- 数据科学是一个创新领域,但一些旧规则坚持保留下来:在同样的角色下,女性仍然比男性挣得少。但是往好的方面想,成为一名数据科学家可能是一个有利可图的选择。
在 data 与我们分享了所有这些故事之后,您是否已经决定从哪里开始您的数据科学之旅?
如果你已经走上了这条路,你今天会开始学习哪种新工具?
多伦多大学机器学习学生的 5 点心得
从经验中学习

多伦多大学斯卡伯勒校区——肯·琼斯在 UTSC 拍摄的照片
众所周知,多伦多大学是加拿大排名最高的大学之一,但并不是所有的校园都被平等对待。斯卡伯勒校区,我称之为 UTSC,是一个较新的校区,位于 GTA 的东端,提供各种合作项目供新生选择。大约 4 年前,当我申请大学时,我决定以合作计算机和数学科学学生的身份进入多伦多大学斯卡伯勒校区,目标是进入计算机科学(CS)项目(本科学习第一年后必须申请)。
以下是我在整个旅程中学到的五件事,以及我如何开始我的数据科学职业生涯:
1.校园选择
大家总是声称多伦多大学的名声完全是建立在圣乔治(市中心)校区的基础上。这种说法并非完全错误,因为大多数大学的排名是基于研究生项目而不是本科项目,圣乔治(UTSG)大学提供最受欢迎的硕士项目。然而,任何人都不应该低估“后代”校园的教育水平,包括斯卡伯勒(UTSC)和米西索加(UTM)校园。普遍的说法是,UofT 的两个新校区比圣乔治校区更容易被录取。这是千真万确的,不一定是因为市中心的校园好得多,而是因为 UTSC 和 UTM 都比较新,没有一百多年的学术声誉来支撑它们。

按校区招生—由多伦多大学 2017
毫无疑问,圣乔治校区提供了最多的课程可供选择,拥有最多的学生,当然还有令人惊叹的排名很高的教授。然而,如果适合你的专业课程是在一个较小的校园里提供的,并且你不介意一个不那么拥挤和更紧凑的校园,UTSC 或 UTM 可能是一个很好的适合你的地方。如果你担心你将接受的教育质量,不要!UofT 的大多数教授都在不止一个校区任教。也就是说,如果你听说过这位了不起的统计学教授在 UTSG 大学教授这门令人难以置信的课程,你可能会发现他们在 UTSC 大学也教授同样的课程。作为一名未来的计算机科学学生,毫无疑问,我想体验当实习生的经历,并在学习期间获得实践经验。考虑到这一点,我选择 UTSC 而不是 UTSG 的决定性因素是,前者提供合作项目。
2.合作计划的价值
什么是合作社?Co-Op 是一个允许学生在仍然是全日制学生的同时在一个行业相关的领域工作的计划。这给了学生们在一个学期的学校教育和一个学期的工作之间交替的机会。
科技行业竞争非常激烈,因为我们都生活在这个强大的数字时代,越来越多的人加入科技行业,因为它不需要任何强制性的大专教育,并提供相当有竞争力的工资。

克里斯·利维拉尼在 Unsplash 上的照片
当你毕业时,你将与成百上千的新毕业的学生竞争同一个入门级的技术工作。想想看,任何一个候选人如何在这么多的申请者中脱颖而出。假设有一个职位空缺,剩下两个申请人,你和与你有相同学习成绩和技能的人。招聘经理会选谁?现在考虑一下你在大学期间是否有过与行业相关的实践经验。毫无疑问,招聘经理会聘用有经验的人,而不是没有经验的人。然后,你将与一个小得多的申请者群体竞争,而不是与所有本科技术学生竞争,这个群体由所有具有相关经验的本科技术学生组成。
如果你正在寻找计算机科学或数据科学方面的职业,我怎么强调现实世界中与行业相关的经验在你本科期间的重要性都不为过。当然,你可以在夏季学期自己寻找实习机会,获得同样多的宝贵经验。然而,如果你想要更多的指导来寻找你的工作经验和一般的工作申请咨询(包括求职信和简历,以及关于个人品牌的一般提示),Co-Op 将是你的一个好选择。此外,一些实习生职位只对合作学生开放,这进一步缩小了申请人的范围,从而增加了你获得该职位面试的机会。
3.认识你的优势——从计算机科学到统计学
如前所述,我最初开始攻读本科学位的目标是进入 UTSC 的合作计算机科学项目,专攻软件工程。我记得我想这么做并不是因为我擅长编码,实际上我以前没有编程经验,而是因为 CS 非常流行,可以保证一个好的未来。不要误解我,这个主题非常有用,为你打开了许多大门,但我只是注意到我并没有像我希望的那样喜欢它。第一年后,我意识到我更喜欢统计学课程,并且比计算机科学课程表现得更好。对我来说幸运的是,UofT 给一年级学生提供了一套基于整个计算机和数学科学系的必修课程,而不是针对你希望申请该系的确切项目的任何课程。然后,我可以毫无困难地切换到统计程序。
我不仅发现我在统计学课程中学到的理论在现实世界中非常适用,我还注意到我非常喜欢处理庞大而杂乱的数据集。然而,我知道我想继续发展我的编程技能……所以我发现 UTSC 大学提供了一个统计学项目,重点是机器学习和数据挖掘。就这样开始了我的数据科学之旅。对于那些刚刚接触数据科学主题的人来说,该领域结合了传统数据分析和方法(统计学)的技能以及编程技能(计算机科学),从而从数据中发现一些潜在信息并估计未知情况。
4.建筑经验
在我获得第一个数据科学家合作职位之前,我曾是一名数据分析师合作伙伴。到目前为止,我所受的教育(在我最初几个工作任期申请工作时)和经验主要包括与数据测试和清理方法相关的统计理论,这些理论可以很容易地应用于可操作的数据。这与数据分析师的角色密切相关,数据分析师更专注于获得有意义的见解,以直接解决问题。另一方面,数据科学是一个更广泛的领域,包括专注于构建数据建模的新流程,创建算法等更复杂的问题。机器学习是数据科学家最常用的技术之一。因此,除了当时没有多少数据科学领域的知识之外,我还寻找了分析实习机会。

数据科学和数据分析的主要区别—图片来自 SISENSE
作为一名数据分析师,我工作了三个学期,终于有了足够的行业经验,开始考虑数据科学合作机会。在学习了机器学习算法及其背后的基本理论(以及过去的合作经验)后,我成功获得了第一份数据科学实习。
虽然我走了很长的弯路才获得数据科学职位,但这让我拓宽了数据应用方面的知识。有很多方法可以让你接近这个职业,这只是我个人的大学之旅。我鼓励你选择最适合自己、最符合你工作风格的路线。
5.我需要高等教育吗?
我申请的实习越多,我就越注意到全职数据科学家职位要求申请者拥有相关领域的硕士或博士学位。随着我对这个领域了解的越来越多,这样的要求对我来说就越有意义。数据科学需要各种各样的数据技术,因此需要更先进的理论来完成这项工作。然而,我知道这些知识不是你只能通过更高层次的教育才能获得的知识!事实上,许多公司规定,在该领域全职工作几年也同样有价值。我知道,如果你希望在正式研究、机器学习算法开发、深度学习等领域做出贡献,许多人会建议你攻读研究生学位。不过,我需要提一下,我还没有亲身经历过这种经历。当我在多伦多大学完成统计学的本科学位时,在机器学习和数据挖掘方面,我仍然在考虑自己的硕士学位。
我的第一个 EDA 项目的 5 个技术要点
在过去的两周里,我一直在做我的第一个涉及电影行业的数据探索项目。以下是我学到的五个技巧。请注意,正如标题所暗示的,我是数据科学的初学者,因此欢迎任何评论。
念多个。使用 glob 的 csv 文件
我从各种电影网站获得数据,包括 IMDB、电影数据库和烂番茄。第一项任务是把它们读到我们的笔记本里。一种简单的方法是使用 glob,它创建一个特定扩展名的所有文件的列表。
# Create a list of all csv files using glob
csv_files = glob("./zippedData/*.csv.gz")
为什么有用:这样可以节省时间,因为我们不必单独读取每个文件。如果文件夹中添加了其他数据,这些数据将自动添加到列表中。
另外,以下是我每次使用 glob 时想到的:

Jabba glob——来源:starwars.com
熊猫的 read_html()函数
作为我项目的一部分,我想从网上抓取额外的数据,比如维基百科上的网飞原创电影表。我不假思索地使用了 BeautifulSoup ,这是一个 Python 库,通过导航和搜索解析树从 HTML 文件中提取数据。
然而熊猫有一个read_html()功能,可以帮我节省几个小时的工作。由于数据整齐地显示在一个表格中,用几行就可以得到一个近乎完美的数据框架。
后来,我还想要关于基于视频游戏的电影的数据,这次记得使用内置函数。
DF = pd.read_html('List of films based on video games - Wikipedia.html')
然后,由于我只对已发行的真人电影感兴趣,所以我限制在第一张表的前 38 行。
Videogamemovies = DF[0][:38]

为什么这个有用:省时又轻松!如果数据已经整齐地显示在表格中,这可能是从 web 上抓取数据的最佳方式。
一个热编码
在我们的数据集中,电影被分为三种类型。哪一个是主要类型并不明显,最好的方法是将每部电影归入其列出的每个类型。以下是我们的movies熊猫数据框架的相关栏目。

首先,使用map()以逗号分隔流派列中的值。然后,为每个具有零值的独特的单个流派创建额外的列。然后,我遍历流派列,将与电影流派匹配的列中的值更改为1。
# Create columns with genres
for genre in individualgenrelist:
movies[genre] = 0# Set value to 1 if genre applies
for index, genres in enumerate(movies['genres']):
for genre in genres:
movies.loc[index,genre] = 1
使用枚举不是很有效,但由于时间限制,我无法找到更好的方法。如果你做了,请让我知道!
下面是结果的样子,显示了列Action和Drama。

为什么这很有用:这让我们不仅可以简单地对比如说Action电影的数量求和,还可以创建比如说Action和Adventure电影的子数据帧。当我们考虑机器学习和预测分析时,以这种格式保存我们的数据将非常有用。

这里有一些熊猫!照片由 Ilona Froehlich 在 Unsplash 上拍摄
熊猫切()功能
Pandas cut()函数用于将一维数组元素分离到不同的容器中。当你有数字数据并希望转换成分类数据以便更好的可视化时,这是很有用的。在我的项目中,我正在调查一部电影的制作预算,并将数据分为“小预算”、“中预算”和“大预算”电影。过程很简单:创建 bin 和名称列表,然后让 Pandas.cut()完成这项工作,而不是进行迭代。
# Create bins and names lists
bins = [0, 100000000, 200000000, np.inf]
names = ['Low','Medium', 'High' ]# Use pd.cut() to create budgetrange column
movies['budget_range'] = pd.cut(movies['production_budget'], bins, labels=names)
为什么这很有用:创建分类箱将使数据可视化和研究特征变得更容易。使用pd.cut()效率高。
西伯恩的计数图
计数图使用条形显示每个分类箱中的观察值数量。它可以被视为分类数据的直方图。虽然这当然可以“手动”实现(例如,通过使用关键类别和值计数的字典进行迭代),但使用 Seaborn 的快速可视化功能要快得多。
# Plot number of movies released per decade
sns.catplot(x = 'decade', kind = 'count', data = movies)

为什么有用:直观显示分类数据分布的快速简单的方法。
这就是你要的,我将带着这五点去做我的下一个项目。
如果你有兴趣看我的电影项目,什么类型的电影票房最好,请查看我的 GitHub 资源库。
学者成为数据科学家需要知道的 5 件事。
从学术界到工业界的转变可能会很艰难。管理者和前学者需要认识到这两个世界的不同。

如果这就是你心目中的工作环境,那么你会学到很多教训。
这个是私人的。年轻时的我,在他离开学术界后的第一份工作中,被解雇了。是的,即使作为一名牛津大学的前博士后研究员,以及数学和统计学的大学讲师,我还是被送上了路!
他们不知道我是谁吗?
原来他们知道我是谁。我是一个已经做了一年的巨大的马尔可夫链蒙特卡罗分析的人,却没有产生任何价值。事实上,它正在使用最新的融合诊断和最先进的降维方法,这意味着一个甜蜜的脂肪什么都没有。因为他们也知道自己是谁——一家无法承载非生产性员工的初创小公司。
但是#我很聪明?显然不是。
当然,对我的年轻人的自尊心的打击是不愉快的,但是,哼哼,它最终被证明是一件好事。我们从错误中学到的比从成功中学到的多,对吗?这就是为什么所有有经验的数据科学家都知道这么多。现在我在管理岗位上,我不断看到其他学术界人士犯了和我一样的错误。因此,如果你要离开学术界进入数据科学领域,你应该知道以下 5 件事。
- 没有人(我的意思是没有人!)在乎你有多聪明。
我明白了。要获得博士学位,你必须是那些一生都在学业上表现优异的孩子中的一员。你会在学校名列前茅,去一所很棒的大学,在那里你会做得很好。当你快 30 岁的时候,几乎你的整个生活都会被一系列的人告诉你,你会做得很好,因为你很聪明。所以你一直试图证明你很聪明,所以更多的人告诉你你很聪明,如此循环往复。
直到现在。
看,整个学校到学术界的系统确实是一团糟,但那是以后的事了。在这里,你只需要知道,没有人在乎你有多聪明,他们只在乎你有多有用。
明白了吗? 有用不聪明!
如果你真的感到恶心,你可以马上停止阅读,因为所有其他的事情都会自然而然地发生。然而,如果你是那种认为自己很棒的人,那么你可能应该继续读下去。我觉得你听起来有点聪明…
2.有用和写论文不一样。
现在你可能会对自己说,“对,知道了,让我们有用吧。好的,我们在公司使用这种技术来做那件事,我读了这篇关于这种略有不同的技术的论文。所以如果我在公司的事情上使用这种不同的技术,那么我就是有用的。因为这是公司的事情。”然后你去告诉你的经理你要这么做,他们看着你,好像要掐死你一样。这让你感觉很糟糕。
这种行为方式似乎很熟悉,因为这是学者们接受的训练。从一个领域获得一项技术并应用到你自己的领域是获得出版物的一个简单方法。坦率地说,在学术界,它甚至不必比现有的技术更好。它必须是新颖的。
你的经理根本不关心小说。你刚刚告诉他们,你将花一段未知的时间来试验一种未经证实的技术,这种技术可能会也可能不会改进一个已经令人满意的解决方案。你想知道他们为什么不热情?
在这方面有一种变化,数据科学家在公司里搜寻,试图找到一个几乎足够容易解决的问题,但只需要令人愉快的深入思考。在某些情况下,数据科学家可能会做一些勉强可以的事情,但很少会有有用。这是因为做这件事的动机并不是真的有用。深刻的思考才是真正的动力。这又是一种在学术界得到奖励的行为。通过解决难题来显示你的聪明才是关键。你的经理不在乎。
3.找出如何变得有用是工作的一部分。
好吧,你已经打破了那些学术习惯,但你发现自己不知所措。如果这些人不希望你像他们训练的那样,那么他们到底想要什么?
首先,放松。你薪水的一部分是用来找出什么是有用的,什么是无用的。困难在于没有两个环境是相同的,所以无论我的建议是什么,你都必须自己想办法。然而,这里有三个原型供你思考。
首先是混乱的产品环境。在这种环境下,你会有很多产品人员跑来跑去,说“我们想尽快做这件事,但我们不知道这是否可能”。现在这可能听起来像是一个困难的地方,但是只要做一些有用的事情,它实际上是最容易的!找一个看起来正常的产品人员,和他们成为好朋友,做他们想做的事情。他们应该是自己产品的专家,了解产品的潜在市场,因此真正知道什么有用,什么没用。换句话说,你只是把工作中“如何变得有用”的部分外包给了别人。你现在要做的就是造出那个有用的东西。你很擅长这个,对吧?
其次是“提高数字”类型的环境。您通常会在拥有成熟数据科学团队的公司中发现这些问题。在这种情况下,你或你的团队将拥有一项服务,它接收数据,进行一些数学运算,并输出一些东西,通常是预测。会有一个数字来衡量这个东西的质量,你必须提高这个数字。
现在听起来“想出如何变得有用”已经完成了!提高数字,笨蛋!可惜,事情没这么简单。你必须在尽可能短的时间内找出最能提高数字的东西。对一个前学者来说,诱惑是退回到旧的行为方式,应用一些你读过的新技术。然后,经过几个月的努力,你意识到新方法几乎没有改变数字。这里要做的正确的事情是分析实际的失败案例,并认真和诚实地思考什么可以解决最多的失败案例。(我的预测是:改进数据总的来说会胜过更复杂的方法。)关键是,你必须认真思考什么能真正提高这个数字,这可能会涉及到愚蠢和无聊的工作。不要只想着一个漂亮闪亮的新东西,然后期待最好的结果。
最后,还有功能失调的环境。你会认识到这些,因为没有人真正知道他们为什么在那里,或者他们应该做什么。这有很多原因。也许公司里有人知道他们需要数据科学,但不知道为什么。也许有线索的人离开了,现在有一个悬而未决的团队没有家。偶尔会有一个研究团队在他们的研究与公司使命有任何关联的时候仍然存在。如果你遇到这种情况,你就有麻烦了。你能做的最好的事情就是通过接触你的直接团队之外的产品人员,试着把它变成第一种环境。然而,在某些情况下,你可能需要重新整理 linkedin 的个人资料。
4.依靠他人
你不应该试图一个人有用。在学术界,尤其是作为一名博士后,你是一个人的乐队,被期望成为数学家、作家、平面设计师、程序员、公共演说家……名单还在继续。此外,在一个非常严格的等级制度中,你与周围的人激烈竞争非常少的工作,这在 19 世纪晚期的普鲁士人看来可能是有意义的。这一切造就了一个奇怪而孤立的工作环境,在这个环境中,人们为了生存而发展出自负的自我。更糟糕的是,学术界有一种文化假设,认为聪明的人会留在学校读 A-level,最聪明的人会去读本科,最聪明的人会去读研究生,最聪明的人会留在学校做博士后,等等。
你需要放下这一切。首先,如果我回想一下我在本科/研究生过渡时期的经历,最聪明的人肯定不会继续攻读博士学位。这意味着他们就在工作场所,不需要你的任何# I very smart 废话。更积极的是,这也意味着他们可以帮助你做所有你知道自己不擅长的事情。事实上,工作生活的最大乐趣之一就是在一个有凝聚力、运转良好的团队中,每个人都扮演自己喜欢的角色。
所以,不要做那种无聊地对同事的工作说教的人。相反,把它当成一个机会,和其他与你想法稍有不同的伟人一起工作,向他们学习。
5.在工作场所,少量的偏执是健康的。
现在是 2020 年,尽管资本主义创造了许多奇迹,但它是一头无情的野兽。这种“有用”的东西依赖于对已知的当前成本和估计的未来收益的客观计算。你是一个已知的当前成本。一旦你的成本超过你估计的未来收益,你就有麻烦了。
因此,不幸的是,你需要担心一下公司未来会从你那里得到什么好处。当然,还没到你因恐惧而失眠和瘫痪的程度。但足以让你集中注意力。你不在学术界,那里的人要么有任期,很少被解雇,要么有定期合同,从来没有被解雇。
这是对事物现状的描述,而不是对事物应该如何的判断。我只想说,如果你认为(或者,更糟糕的是,你的经理告诉你)一切都很好,每个人都可以在下午 5 点打卡下班,那么你的团队就有麻烦了。这种麻烦涉及到拥有漂亮皮肤的工商管理硕士、整洁得令人生疑的发型,以及为大幅削减预算提供依据的电子表格。
原来如此。离开学术界进入职场时,我希望知道的 5 件事。如果你还能想到什么,或者有什么不同意见,请在评论中提出来!
脚注
哦,是的,今天的孩子们,事实证明深度神经网络并不是第一个出现的技术,它通过承诺逼近世界上的任何函数而产生了很多兴奋,但后来证明它不是万能的灵丹妙药。当然,我意识到我在这里放弃了我的年龄。
开始学习数据科学时,我希望知道的 5 件事
到目前为止,我在数据科学之旅中学到的见解

wayhomestudio 创作的咖啡照片—www.freepik.com
两年来,我一直在独自研究数据科学概念,通过这次旅程,我获得了许多见解,我想与正在起步的新数据科学家分享。
你可以随意从这篇文章中得到你想要的,但是我只是简单地分享我的观点给那些有点迷茫并且想要更多指导的人。话虽如此,以下是我希望在开始学习数据科学时就知道的 5 件事:
1)在成为一个好的数据科学家之前,先努力成为一个好的程序员和好的统计学家。
如果你读过我以前的文章,你可能已经听过我这么说——数据科学家实际上是一个利用编程来实现统计方法的现代统计学家。
理解这些基本原理会让你的生活轻松很多,从长远来看,实际上还会节省你的时间。几乎所有的机器学习概念和算法都是基于统计和概率的,除此之外,许多其他数据科学概念,如 A/B 测试,也是纯统计的。
最终,作为一名数据科学家,你有多优秀会受到你在编程和统计方面知识水平的限制。
查看我以前的文章《 如果我可以重新开始,我会如何学习数据科学》》,以获得这方面的更多指导。
TLDR:在学习其他任何东西之前,要有良好的编程和统计基础。从长远来看,这会节省你更多的时间。
2)少花点时间在在线训练营上,多花点时间在个人数据科学项目上。
我知道对你们中的一些人来说,这可能是一个有争议的声明,所以让我先说几件事:
- 这完全是基于我的轶事证据以及我对同龄人的观察。
- 显然有一些令人惊叹的在线课程/训练营没有包括在我的概括声明中,比如 deeplearning.ai 的课程。
- 我还想说,如果别无选择,你最好去参加训练营。
也就是说,在线训练营有几个问题。
- 就材料的深度而言,它们往往是非常肤浅的,不仅如此,它们还会给人一种对所学材料理解的错觉。
- 他们也倾向于而不是很好地保留信息。我想你会同意,你花在学习一门学科上的时间越多,你就越有可能记住信息。这些训练营的问题在于,尤其是那些标榜“在 5 周内成为专家”的训练营,它们没有给你足够的时间来真正沉浸在你所学的东西中。
- 最后,他们通常倾向于而不是足够有挑战性。很多训练营和课程只是让你跟着做,复制他们的代码,这并不需要你进行批判性和深入的思考。
为什么你应该从事个人数据科学项目。
个人数据科学项目是一个很好的学习方式,因为你将被迫独自批判性地思考问题和解决方案。
通过这个,你会学到比任何训练营都多的东西。您将学习如何提出正确的问题,如何在谷歌上搜索正确的问题,如何着手为您工作的数据科学项目,如何有条不紊,等等…
通过更多地投入到自己的项目中,你也会更有动力去学习更多的东西,投入更多的时间,创造一个积极的反馈循环。
TLDR:少花点时间参加数据科学训练营,多花点时间做个人数据科学项目。
需要一些想法来开始?请查看我的文章,“ 14 天隔离期间要做的 14 个数据科学项目 ”。
3)专注于精选的几个工具,并真正擅长它们。
有这么多数据科学包和工具,这很酷,因为您可以以适合自己的方式个性化您的数据科学工具包。
然而,想要学习尽可能多的包和工具很容易被冲昏头脑。不要犯这个错误。
精通一些工具比使用一些你几乎没花时间使用的工具涉猎皮毛要好得多。(在简历上列出技能和工具的清单不应该是最终目标!)
举个例子,有几个很棒的数据可视化软件包:Matplotlib、Seaborn、Plotly、Bokeh 等。没有必要花时间去掌握其中的每一个,这是在浪费你宝贵而有限的时间。
再比如,如果你想用熊猫操纵数据,那就好好用熊猫。如果你是那种比较傻的人,那就去吧。是的,理想情况下,你想擅长熊猫和熊猫,但我的观点是,坚持一个并掌握它,而不是不停地跳来跳去,这可能是一个好主意。
同样的事情发生在…
- Python vs R
- 张量流 vs Pytorch
- Postgresql vs MySQL
- 这份清单还在继续…
TLDR:建立你的数据科学工具包,并坚持下去!掌握 5 种工具比勉强知道如何使用 20 种工具要好。
4)了解各种机器学习算法只占数据科学的一小部分。
就个人而言,让我进入数据科学的是所有不同的机器学习模型,它们如何工作,以及它们在哪些应用中有用。我可能花了至少六个月的时间来学习和涉猎几个机器学习模型,只是意识到这只是数据科学家需要知道的一小部分。
数据建模只是整个机器学习生命周期的一部分。您还需要了解数据收集、数据准备、模型评估、模型部署和模型调整。事实上,我会说,大部分时间花在数据准备上,而不是数据建模(机器学习建模)。
除此之外,你还需要学习其他一些东西,比如版本控制(Git),从 API 中提取数据,理解云,等等。
TLDR:不要把所有的时间都花在试图掌握每一种机器学习算法上。它只占数据科学家需要了解的一小部分。
5)作为一名数据科学家,感到冒名顶替综合症是很常见的。
从我开始学习数据科学的第一天起,直到今天,我定期经历冒名顶替综合症。但是我知道这是完全正常的。
为什么数据科学家觉得冒名顶替综合征很普遍也没什么?
- “数据科学”是一个模糊的术语,因为它是一个跨学科领域,包括统计学、编程、数学、业务理解、数据工程等。最重要的是,数据科学家有很多同义词(数据分析师、数据工程师、研究科学家、应用科学家)。我的观点是,你永远不会成为数据科学涵盖的所有领域的专家,你也不应该觉得自己必须成为专家。
- 像编程和技术中的其他事物一样,数据科学也在不断发展。20 年前,熊猫还没有被创造出来。Tensorflow 年前才发布。总会有新技术出现,因此你必须学习新的东西。
- 这和我的第一点有点关系,但是因为你很可能不是所有事情的专家,这意味着总会有人在你花费较少时间的事情上做得更好。这也没关系。
TLDR:作为一名数据科学家,你总会有冒名顶替综合症的感觉,这没什么。
感谢阅读!
通过阅读这篇文章,我希望我能够给你一些见解和有用的建议,这将有助于消除你的一些误解,并使你的数据科学之旅比我顺利得多!
我收到了对我更有见解的数据科学文章的非常好的反馈,这就是我写这篇文章的原因。像往常一样,如果你不同意我说的任何话,请有所保留。但是如果你喜欢它,请让我知道你还想让我写些什么。
我一如既往地祝你们在数据科学之旅中一切顺利!
特伦斯·申
- 如果你喜欢这个, 在 Medium 上关注我 获取更多
- 关注我的Kaggle了解更多内容!
- 我们连线上LinkedIn
- 有兴趣合作?查看我的 [网站](http://Want to collaborate?) 。
- 查看 我的免费数据科学资源 每周都有新素材!
我从高效机器学习项目中学到的 5 件事

图片由 Skitterphoto 为 Pixabay 拍摄
大多数机器学习项目都失败了。你如何确保你的高影响力项目的成功?
我已经从事计算机视觉和机器学习项目大约十五年了——最近是在病理学和遥感应用方面。以下是我学到的一些东西。
1。数据很重要——而且可能很混乱
机器学习依赖于训练数据。在监督学习的情况下,数据和模型将在新示例上预测的相关标签集。
训练样本的数量是能够训练出好模型的关键因素。当可用于训练复杂模型的训练示例太少时,模型就会过度拟合,而不会推广到看不见的数据。但是在医学成像应用中,我们通常只能得到几百张图像。几千幅图像可能被认为是一个大数据集。这使得训练一个好的模型具有挑战性,并且可能需要专门的技术。
但是数量不是唯一的因素。我目前正在进行一个项目,通过卫星图像预测发电厂的排放。我们真实数据的质量真的很重要。我们需要确保每个发电厂的地理位置是正确的,并且该位置正确地映射到描述发电厂正在燃烧的燃料类型的数据库,以及提供排放读数的时间序列的不同数据库。如果这些映射中有任何一个不正确,那么垃圾输入就会转换成垃圾输出。
数据的数量和质量对于成功的机器学习解决方案都至关重要。而且,在许多情况下,两者都不容易实现。
2。这需要一个团队——不仅仅是建立一个机器学习模型
从上面的电厂示例中可以看出,需要大量的数据处理基础设施来形成一组用于训练模型的观察值。再加上一个完全不同的基础设施来获取每个发电厂的遥感图像。甚至在进入机器学习模型本身之前,这些都是必需的。从不同的来源收集数据,对其进行清理,标记异常以进行更详细的检查,并将其整理成整洁的表格。
我参与的大多数项目都雇佣了各自领域的跨学科专家。不仅仅是机器学习科学家或工程师,还有数据分析师和软件工程师。

我们的电厂项目包括多个遥感科学家和电厂专家。我从事的许多病理学项目都是与病理学家、遗传学家、流行病学家、生物统计学家以及许多其他人合作的,这取决于项目。
对于如此多样化的团队来说,沟通变得至关重要,但对于为机器学习构建可扩展且健壮的基础设施来说,沟通也是必要的。
3。该算法可以产生不同的效果——尤其是在产生影响时
第三点我终于开始做模特了!
你会读到很多文章声称简单的算法就足够了;最好把重点放在数据管道上。
对于许多应用来说,这可能是真的。比方说为了增加广告收入。一个简单的机器学习算法可能会让你达到目标,并增加 10%的销售额——或者更好,50%。太好了!
但是,如果你正在开发一个可以让自动驾驶汽车更安全、缓解气候变化或更好地治疗癌症的应用程序,该怎么办?花时间和金钱去完成一项任务,哪怕只是比以前可能完成的任务好一点点,这值得吗?我会这么说。
一个平庸的算法和一个优秀的算法之间的区别对某些人来说可能是生死攸关的。
我还参与了一些任务,在这些任务中,一种简单的算法无法区分两种类型的癌症——但一种新的算法(在这种情况下,是深度学习)可以以合理的准确度做到这一点。关键是更强大的特征提取方法。
对于高影响力的应用程序,数据管道和模型都应该值得努力。首先从简单的机器学习算法开始,并从那里前进。
一些应用需要更专业的算法来处理独特的复杂情况,如千兆像素图像、弱标签或图像中的异质性。
4。模型验证和推广至关重要
正确验证模型性能是理解模型对未知数据进行归纳的能力的关键。
对于病理学而言,这可能需要对在不同医院收集、由不同实验室处理或由不同扫描仪成像的样本进行检测。这些因素都会改变图像中组织的外观。在来自一个实验室的图像上训练的模型可能在来自该实验室的其他图像上表现良好,但是在来自不同实验室的图像上测试时表现不佳。
然而,影响性能的不仅仅是图像采集。对不同人群的患者进行培训和测试也会带来问题。也许训练人群倾向于在后期诊断出癌症。该模型可能没有见过太多的低级别肿瘤,因此在测试集上表现不佳。
泛化能力不仅仅适用于医学数据。对于上述发电厂排放项目,我们在选定的几个拥有真实排放数据的国家训练模型。然而,我们的模型有望推广到全球所有发电厂。我们需要小心地选择特征来训练我们的模型,我们还需要寻找方法来验证我们的预测。这可能采取按国家收集年度排放量估计的形式,即使我们无法验证我们各自的预测,也要进行核对。
在缺乏独立测试且可用数据相对较少的情况下,交叉验证是评估模型性能的良好起点。然而,一个单独的测试集将是必要的,以真正理解算法将如何执行其预期的用例。
5。考虑用例

图片来自希瑟时装公司授权的 Shutterstock
最后,在开发机器学习解决方案时,要考虑到它的最终用例,这一点很重要。虽然这适用于所有应用,但对于医疗用例尤为重要。
这一点也与验证有关。虽然最初的概念验证可能在简单的测试数据集上进行验证,但最终需要在真实环境中进行测试。这不应该仅仅是算法性能与人类专家性能的比较。
人工智能将如何使用?它是否能识别图像区域,以便病理学家或放射学家更详细地查看?它会检查医生的结果并通知可能的错误吗?或者它将执行不同的任务,例如筛查更复杂的视觉特征,并将结果提供给病理学家进行解释?
关于跨学科团队的第二点在这里也是相关的。该团队应该包括那些理解可能的用例并能确保在该环境中正确评估算法的人。
对于医疗应用,机器学习算法应该使我们能够做出更好的决策,最终改善患者护理和结果。
我是否错过了其他重要的课程?请在评论中分享你的见解。
关于作者
Heather D. Couture 是 Pixel Scientia Labs 的创始人,该实验室指导 R & D 团队利用人工智能更成功地对抗癌症和气候变化。
联系她,学习如何最大化你的图像和算法的影响。
我在 2020 年上半年每天发布一个数据学到的 5 件事
📊半年的数据分析工作,即
每日 Instagram 贴子 ft。数据即

来自@VeryData_365 的 Instagram 图库
2020 年,我的目标是每天在我的 Instagram 上发布一个很酷的数据可视化。我们的目标是从你所有惊人的数据中获得个人灵感,然后传递给其他人。我还想学习和理解所有不同的技术、图表和显示数据的方式。
六个月后,我浏览、分析并发布了超过 182 个不同的数据可视化。我学到了什么?
1)如果您正在寻找,数据可视化无处不在
因为我开始每天发布一个数据可视化,所以我开始寻找它们。你猜怎么着?它们在野外无处不在。找到他们非常容易。似乎每个应用程序、网站和公司都有一个“统计”页面。只要打开你的手机,这些页面有你熟悉的吗?

左上至右下:谷歌分析、iRobot Roomba、Medium、Instagram、苹果健康、苹果屏幕时间
数据正在成为我们日常生活的一部分。我们不断地看到图表并解释它们的含义。随着大数据的兴起,数据可视化制作和理解也必须同步增长。未可视化的数据仍然相对无用。我们看到这是极其真实的电晕病毒新闻。媒体一直在分享约翰·霍普金的仪表盘或者约翰·伯恩-默多克的乡村追踪。通过可视化显示,人类最容易消化数据。
我原以为每天很难找到值得分享的东西,但事实证明,决定分享什么更难!谷歌搜索、Instagram、FlowingData.com、Tableau Public、Twitter、Reddit、 Data Viz Society 等都让人们很容易找到美观、信息丰富的图表。
2)人们真的很喜欢地图
地图在数据可视化方面有双重功能。第一,他们以一种每个人都能理解的熟悉方式非常好地描绘了多维度。第二,他们允许观众将数据联系起来。它让用户通过说“哦,我住在这里…这是我妈妈住的地方…哦,伙计,看看约翰尼住的地方发生了什么。”它允许数据个性化。
例如,我目前正在我的任天堂 Switch 上玩动物穿越。这很有趣,但更重要的是,这是令人难以置信的治疗和放松。我通过谷歌趋势数据和繁荣制作了这张地图,以显示哪些州对这个游戏最感兴趣。结果呢?西海岸喜欢它!俄勒冈州?真的很喜欢!你所在的州喜欢动物穿越吗?
来自我的 Instagram 的动物穿越搜索地图
3)人们对动画数据感到惊讶,即
动画是有趣的,有意思的,有知识性的。数字时代,视频为王。将图表转化为视频证明了对于一个参与的观众。
以我制作的这张愚蠢的动画图表为例,它显示了网飞原版电影在发行后几天内的成功程度。这张小图在抖音获得了超过 17 万的点击率(个人记录)!事实证明,这也是我在 Instagram 上浏览、点赞和保存最多的帖子之一。声音开启以获得完整体验😉
网飞的原始比较(由 fluore 制作,数据来自 Google Trends)
4)人们喜欢黑暗模式
当黑暗和光明模式的争论在上激烈进行时,我是黑暗模式的超级粉丝。虎王动画是黑屏和大粉丝的最爱…但其他人呢?人们似乎更喜欢深色背景的图表,还是更干净的白色?
虽然我对此没有任何具体的分析,但我有自己的经验证据表明,黑暗模式至少在 Instagram 上更受欢迎。

来自我的 Instagram 的见解
这张截图显示了我在 Instagram 上最喜欢的帖子。我的前十名中有八名是黑暗模式。相关还是因果关系?我没有统计测试来证明这一点,但我相信。胜利的黑暗模式!
这很有趣,因为大多数数据可视化工具默认以白色背景开始。有没有证据表明从深色背景开始会让你的视觉更有趣?
请注意,本文中的第二点在这里有效;前十名中有五个是地图。
5)人们对极坐标图很感兴趣
数据专业人士通常不喜欢极坐标图,但公众似乎真的很喜欢它们。
《圣经》中这个惊人的情感分析图表让人们很感兴趣:

谷歌新闻实验室探索食物节奏的这些图也是如此。

羽衣甘蓝的节奏(好消息实验室
我认为一般人都认为圆很有美感。我还认为图表和图形通常主要被认为是矩形的。几何图形的改变很有趣,也很容易理解,同时保持了影响力
还有一半路程
虽然过去的 182.5 天很棒,但我对未来的 182.5 天感到兴奋。仍然有主题要探索,有工具要学习,有大量的数据要分享和启发。
请和我一起踏上这段旅程!给我发一些你自己的数据可视化。从他人的作品中获得灵感。让我们一起学习吧!

关于 Python 函数要知道的 5 件事
是时候编写结构良好的程序了

由 David Clode 在 Unsplash 上拍摄的照片
函数是重用程序代码的有效方法。使用函数的好处是节省空间,我们选择的名字使我们的程序易于阅读。函数可以在没有输入的情况下定义,并且不一定需要产生输出。
python 中有许多内置函数[但是我们可以创建自己的函数。](https://docs.python.org/3/library/functions.html)
在 python 中,函数是使用def关键字定义的。
>>> def myfunc():
print("Python functions are easy to learn.")>>> myfunc() #calling function
'Python functions are easy to learn.'
函数主要帮助你构建你的程序。最好将长程序分解成函数,每个函数都有自己的用途,使其结构透明,如下所示:
data = extract_data(source)
results = analyze(data)
present(results)
恰当地使用函数使程序更具可读性和可维护性。此外,在不关心程序其余部分的情况下,对一个函数进行修改更容易。
在本文中,我们将讨论五个主题,我认为这些主题对于了解函数非常重要。这些主题将帮助您更好地理解函数。
1.变量作用域
函数定义为变量创建新的局部范围。当一个新变量在函数体内赋值时,它只在函数内部定义。变量在函数外部不可见。所以我们在定义变量的时候可以选择任何名字,而不用关心函数之外的变量。
例如
>>> x = 10
>>> def myfunc():
x = 5
在上面的函数中,变量x在函数外赋给10,在函数内赋给5。现在,当我们在函数外打印 x 时:
>>> x
10
变量 x 在函数外不会改变,因为函数内定义的x的范围仅限于函数本身。
2.参数类型
自变量也称为参数,用于将信息传递给函数。有两种类型的论点:
- 关键字参数: 在函数调用中以标识符(
key1 = value1)开头的参数,或者在以**开头的字典中作为值传递的参数。
ratio(numerator=10, denominator=4)
ratio(**{'numerator':10,'denominator':4})
- 位置论点: 不是关键字论点的论点。该值被直接传递到一个函数中,该函数的位置表示函数中的一个变量。它也可以作为前面带
*的 iterable 的元素来传递。
ratio(10,4)
ratio(*(10,4))
3.作为参数的函数
有趣的是,我们也可以将函数作为参数传递。例如,我们可以将内置函数len()或用户定义的函数vowel_present()作为参数传递给另一个函数:
>>> sent = ['Python', 'functions', 'are', 'amazing']
>>> def execute_func(prop):
return [prop(word) for word in sent]
>>> execute_func(len)
[6, 9, 3, 7]
>>> def vowel_present(word):
... for x in word:
if x in 'aeiou':
return True
return False>>> execute_func(vowel_present)
[True, True, True, True]
4.参数类型检查
Python 函数不要求我们指定输入参数的类型。所以在执行函数之前,有必要检查输入变量的类型。
def is_vowel(char): #Returns True if char is vowel, False otherwise.
if char in 'aeiou':
return True
else:
return False>>> is_vowel(5)
False
例如,在上面的函数中,没有指定number的数据类型,但是我们希望变量的类型为长度为 1 的str。然而,如果我们传递一个整数变量,函数就会执行并返回False。
为了避免执行并引发错误,我们可以像这样使用assert函数。
def is_vowel(char):
assert(isinstance(char, str)) #raises error if not satisfied
assert(len(char)==1) #raises error if string not of length 1
if char in 'aeiou':
return True
else:
return False
如果assert语句失败,它会产生一个错误,函数会暂停执行。
5.记录功能
很好的做法是记录描述其用途的函数,并在函数定义的顶部使用 docstring 提供它,如下所示:
def is_vowel(char):
'''Takes a string input of length one and returns True if vowel, False otherwise''' assert(isinstance(char, str))
assert(len(char)==1)
if char in 'aeiou':
return True
else:
return False
运行help函数可以找到任何函数的 Docstrings。也可以使用属性__doc__来检索它。
>>> help(is_vowel)
Help on function is_vowel in module __main__:is_vowel(char)
Takes a string input of length one and returns True if vowel, False otherwise>>> is_vowel.__doc__
'Takes a string input of length one and returns True if vowel, False otherwise'
尝试运行help(sklearn)来获取 sklearn 库的 docstring。
在本文中,我们主要讨论了函数的应用以及它们如何帮助构建结构良好的程序。在下一篇文章中,我们将讨论 python 模块以及它们如何帮助高效编程。
PyCaret 中你做错的 5 件事
来自 PyCaret 的创造者

本·怀特在 Unsplash 上的照片
PyCaret
PyCaret 是一个用 Python 编写的开源、低代码的机器学习库,可以自动化机器学习工作流。它是一个端到端的机器学习和模型管理工具,可以加快机器学习实验周期,让你更有效率。
与其他开源机器学习库相比,PyCaret 是一个替代的低代码库,可以用来替换数百行代码。这使得实验快速有效。
官方:【https://www.pycaret.org】T4
文件:https://pycaret.readthedocs.io/en/latest/
https://www.github.com/pycaret/pycaret
👉compare_models 做的比你想的更多
当我们在 2020 年 4 月发布 py caret 1.0 版本时, compare_models 函数正在比较库中的所有模型,以返回平均的交叉验证性能指标。在此基础上,您可以使用 create_model 来训练性能最佳的模型,并获得可用于预测的训练模型输出。
这种行为后来在 2.0 版中有所改变。 compare_models 现在根据 n_select 参数返回最佳模型,该参数默认设置为 1,这意味着它将返回最佳模型(默认)。

比较模型(n_select = 1)
通过将默认的 n_select 参数更改为 3,您可以获得前 3 个模型的列表。例如:

比较模型(n_select = 3)
返回的对象是训练好的模型,你真的不需要再调用 create_model 来训练它们。如果愿意,您可以使用这些模型来生成诊断图,甚至将其用于预测。例如:

预测模型函数
👉你认为你仅限于 scikit-learn 模型
我们收到很多请求,要求将非 scikit-learn 模型包含在模型库中。很多人没有意识到,你并不仅限于默认的模式。 create_model 函数除了接受模型库中可用模型的 ID 外,还接受未训练的模型对象。只要你的对象与scikit-learnfit/predict API 兼容,它就能正常工作。例如,这里我们通过简单地导入未训练的 NGBClassifier,从 ngboost 库中训练并评估了 NGBClassifier :

使用外部模型创建模型
也可以通过 compare_models 的 include 参数中的未训练模型,就可以正常工作了。

将模型与未训练的对象进行比较
请注意,包含参数包括来自模型库的三个未训练模型的 ID,即逻辑回归、决策树和 K 个邻居以及来自 ngboost 库的一个未训练对象。另外,请注意,索引表示在 include 参数中输入的模型的位置。
👉你不知道 pull()函数
所有训练功能(创建模型、调整模型、集合模型等。)显示一个乐谱网格,但它不返回乐谱网格。因此,你不能在一个像 pandas.DataFrame 这样的对象中存储分数网格。但是,有一个名为 pull 的函数允许你这样做。例如:

带 create_model 的拉函数
当您使用 predict_model 函数时,这也适用于维持分数网格。

带预测模型的拉函数
现在,您可以像熊猫一样访问指标。DataFrame,你可以创造奇迹。例如,您可以创建一个循环来训练具有不同参数的模型,并使用以下简单代码创建一个比较表:

创建 _ 模型和拉功能
👉你认为 PyCaret 是一个黑盒,它不是。
另一个常见的困惑是,所有的预处理都是在后台进行的,用户无法访问。因此,你不能审计当你运行设置功能时发生了什么。这不是真的。
PyCaret get_config 和 set_config 中有两个函数允许您在后台访问和更改一切,从您的训练集到您的模型的随机状态。您可以通过简单地调用 help(get_config) 来查看 get_config 函数的文档,以查看您可以访问哪些变量:

帮助(获取配置)
您可以通过在 get_config 函数中调用该变量来访问它。例如,要访问 X_train 转换的数据集,您将编写以下代码:

get_config('X_train ')
您可以使用 set_config 功能来更改环境变量。有了目前为止你所知道的关于 pull、get_config、和 set_config 函数、你可以创建一些非常复杂的工作流。例如,您可以对维持集 重新采样 N 次 来评估平均性能指标,而不是依赖于一个维持集:
import numpy as npXtest = get_config('X_test')
ytest = get_config('y_test')AUC = []for i in np.random.randint(0,1000,size=10):
Xtest_sampled = Xtest.sample(n = 100, random_state = i)
ytest_sampled = ytest[Xtest_sampled.index]
set_config('X_test', Xtest_sampled)
set_config('y_test', ytest_sampled)
predict_model(dt);
AUC.append(pull()['AUC'][0])>>> print(AUC)**[Output]:** [0.8182, 0.7483, 0.7812, 0.7887, 0.7799, 0.7967, 0.7812, 0.7209, 0.7958, 0.7404]>>> print(np.array(AUC).mean())**[Output]: 0.77513**
👉你没有记录你的实验
如果你没有记录你的实验,你应该现在就开始记录。不管你是否想使用 MLFlow 后端服务器,你仍然应该记录你所有的实验。当你执行任何实验时,你会产生大量的元数据,而这些元数据是不可能被手动跟踪的。
当您使用 get_logs 函数时,PyCaret 的日志功能将生成一个漂亮、轻量级、易于理解的 excel 电子表格。例如:
**# loading dataset**
from pycaret.datasets import get_data
data = get_data('juice')**# initializing setup**
from pycaret.classification import *s = setup(data, target = 'Purchase', silent = True, log_experiment = True, experiment_name = 'juice1')**# compare baseline models**
best = compare_models()**# generate logs**
get_logs()

获取日志()
在这个非常短的实验中,我们已经生成了 3,000 多个元数据点(指标、超参数、运行时间等。).想象一下,您会如何手动跟踪这些数据点?也许,这实际上不可能。幸运的是,PyCaret 提供了一种简单的方法。只需在设置功能中将 log_experiment 设置为真。
使用 Python 中的轻量级工作流自动化库,您可以实现的目标是无限的。如果你觉得这有用,请不要忘记给我们 GitHub repo 上的⭐️。
想了解更多关于 PyCaret 的信息,请关注我们的 LinkedIn 和 Youtube。
要了解 PyCaret 2.2 中所有更新的更多信息,请参见发行说明或阅读此公告。
重要链接
想了解某个特定模块?
单击下面的链接查看文档和工作示例。
关于 PyCaret 你不知道的 5 件事

来自 PyCaret 的作者
PyCaret
PyCaret 是 Python 中的一个开源机器学习库,用于在低代码环境中训练和部署有监督和无监督的机器学习模型。它以易用和高效著称。
与其他开源机器学习库相比,PyCaret 是一个替代的低代码库,可以用来用几个单词替换数百行代码。
如果你以前没有使用过 PyCaret 或者想了解更多,这里的是一个很好的起点。
“在与许多日常使用 PyCaret 的数据科学家交谈后,我列出了 PyCaret 的 5 个鲜为人知但极其强大的功能。”Moez Ali
👉您可以在无监督实验中调整“n 参数”
在无监督的机器学习中,“n 参数”,即用于聚类实验的聚类数、异常检测中异常值的分数以及主题建模中的主题数,是非常重要的。
当实验的最终目标是使用无监督实验的结果预测结果(分类或回归)时,那么 pycaret.clustering 模块、py caret . anomaly 模块、和 pycaret.nlp 模块、中的 tune_model()函数就非常方便了。
为了理解这一点,让我们看一个使用" Kiva "数据集的例子。

这是一个微型银行贷款数据集,其中每行代表一个借款人及其相关信息。列“en”捕获每个借款人的贷款申请文本,列“status”表示借款人是否违约(默认= 1 或无默认= 0)。
您可以使用 pycaret.nlp 中的 tune_model 函数,根据监督实验的目标变量优化 num_topics 参数(即预测提高最终目标变量预测所需的最佳主题数)。您可以使用评估器参数(本例中为“xgboost ”)定义训练模型。这个函数返回一个训练好的主题模型和一个显示每次迭代的监督指标的视图。

👉您可以通过增加“n_iter”来改善超参数调整的结果
pycaret.classification 模块中的 tune_model 函数和 pycaret.regression 模块在预定义网格搜索上采用随机网格搜索进行超参数调整。这里默认的迭代次数设置为 10。
来自 tune_model 的结果不一定是使用 create_model 创建的基础模型的结果的改进。由于网格搜索是随机的,您可以增加 n_iter 参数来提高性能。请参见下面的示例:

👉您可以在 setup 函数中以编程方式定义数据类型
当您初始化设置功能、时,您将被要求通过用户输入确认数据类型。更常见的是,当您将脚本作为工作流的一部分运行或作为远程内核执行时(例如 Kaggle 笔记本),在这种情况下,需要以编程方式提供数据类型,而不是通过用户输入框。
参见下面使用“保险数据集的示例。

将 silent 参数设置为 True 以避免输入,category _ features参数将分类列的名称作为字符串, numeric_features 参数将数值列的名称作为字符串。
👉对于模型构建,您可以忽略某些列
在许多情况下,您可能不希望移除数据集中的某些要素,但希望忽略这些要素来训练机器学习模型。一个很好的例子就是聚类问题,您希望在聚类创建期间忽略某些特征,但是稍后您需要这些列来分析聚类标签。在这种情况下,您可以使用设置中的 ignore_features 参数来忽略这些特性。
在下面的示例中,我们将执行一个聚类实验,我们希望忽略‘国家名称’和‘指标名称’。

👉您可以在二进制分类中优化概率阈值%
在分类问题中,假阳性的成本和假阴性的成本几乎从不相同。因此,如果您正在优化一个业务问题的解决方案,其中类型 1 和类型 2 错误具有不同的影响,您可以优化概率阈值的分类器,以优化自定义损失函数,只需分别定义真阳性、真阴性、假阳性和假阴性的成本。默认情况下,所有分类器的阈值都是 0.5。
参见下面使用“信用数据集的示例。

然后,您可以将 0.2 作为 probability_threshold 参数传递给 predict_model 函数,以使用 0.2 作为正类分类的阈值。请参见下面的示例:
PyCaret 2.0.0 来了!
我们得到了数据科学界的大力支持和反馈。我们正在积极改进 PyCaret,并准备我们的下一个版本。 PyCaret 2.0.0 会更大更好。如果您想分享您的反馈并帮助我们进一步改进,您可以在网站上填写此表格或者在我们的 GitHub 或 LinkedIn 页面上发表评论。
关注我们的 LinkedIn 并订阅我们的 YouTube 频道,了解更多关于 PyCaret 的信息。
想了解某个特定模块?
从第一个版本 1.0.0 开始,PyCaret 有以下模块可供使用。点击下面的链接,查看 Python 中的文档和工作示例。
另请参见:
笔记本中的 PyCaret 入门教程:
你愿意投稿吗?
PyCaret 是一个开源项目。欢迎每个人都来投稿。如果您愿意投稿,请随时关注未决问题。dev-1.0.1 分支上的单元测试接受拉请求。
如果你喜欢 PyCaret,请给我们 GitHub 回购的⭐️。
中:https://medium.com/@moez_62905/
领英:https://www.linkedin.com/in/profile-moez/
推特:【https://twitter.com/moezpycaretorg1 T43
熊猫数据汇总的 5 个技巧
提高数据处理技能的实用技巧
在做数据分析的时候,能够熟练的聚合数据起到了很重要的作用。Pandas 提供了许多有用的方法,其中一些可能没有其他方法受欢迎。此外,即使对于众所周知的方法,我们也可以通过进一步调整它的参数或用其他方法补充它来增加它的效用。考虑到这些因素,如果你以前没有遇到过,这里有 5 个关于熊猫数据聚合的技巧:

作者图片
在这篇文章中,我将通过例子展示它们是如何有用的。我也希望这些技巧能帮助你写出清晰、简洁、易读的代码。
0.Python 设置🔧
我假设读者(👀是的,你!)拥有:
◼️访问并熟悉 Python,包括安装包、定义函数和其他基本任务
◼️使用 pandas 的工作知识,包括基本的数据操作。
如果你是 Python 新手,这个是一个入门的好地方。如果你以前没有用过熊猫,这个是一个很好的参考资料。
我在 Jupyter Notebook 中使用并测试了 Python 3.7.1 中的脚本。
1.数据📦
我们将使用 seaborn 的提示数据集来说明我的提示。
# Import packages
import pandas as pd
from seaborn import load_dataset# Import data
df = load_dataset('tips').rename(columns={'sex': 'gender'})
df

关于这个数据集(包括数据字典)的细节可以在这里找到(这个源实际上是针对 R 的,但是它看起来是指同一个底层数据集)。为了便于快速查阅,我在下面引用了他们的数据描述:
2.技巧🌟
📍技巧 1:对多变量计数/百分比使用 crosstab()
你可能已经熟悉这个系列函数:value_counts()。运行df['day'].value_counts()将给出日变量中唯一值的计数。如果我们在方法中指定normalize=True,它将给出百分比。这对于单个变量很有用,但有时我们需要查看多个变量的计数。例如,如果我们想通过日和时间获得计数,一种方法是使用groupby() + size() + unstack():
df.groupby(['time', 'day']).size().unstack()

另一种更灵活的方式是使用crosstab():
pd.crosstab(df['time'], df['day'])

使用crosstab()有一些好处。首先,很容易得到行和列的小计——我们只需加上margins=True:
pd.crosstab(df['time'], df['day'], margins=True)

是不是很牛逼?其次,通过调整normalize参数,我们可以很容易地得到百分比而不是计数:
pd.crosstab(df['time'], df['day'], margins=True, normalize=True)

在本例中,我们通过设置normalize=True获得了表格百分比。这相当于将其设置为normalize='all'。对于行百分比,我们使用normalize='index'和normalize='columns'表示列百分比。我们还可以进一步扩展列和行的变量集:
pd.crosstab([df['time'], df['gender']], [df['day'], df['smoker']],
margins=True)

发现crosstab()后,我现在用熊猫的时候也经常用。
📍技巧 2:使用 groupby()和 describe()进行分组汇总统计
你可能已经知道了groupby()和describe()。但是你们一起用过吗?通过结合使用这两种方法,我们可以通过分类列中的唯一值来检查数值变量的汇总统计信息,只需一行代码,如下所示:
df.groupby('day')['tip'].describe()

我们可以看到提示的汇总统计如何在天进行比较。
📍技巧 3:使用 agg()/aggregate()进行灵活的聚合
在本帖中,我们将使用 *agg()* , *aggregate()* 的别名。然而,两者可以互换使用。
您可能知道基本的聚合语法,如下所示:
df.groupby('day')[['tip']].mean()

以下是用agg()获得相同输出的一些替代方法:
df.groupby('day')[['tip']].agg('mean')
df.groupby('day').agg({'tip': 'mean'})
在这个简单的例子中,没有明显的优势说明为什么应该使用agg()而不是第一种选择。然而,当我们想要查看多个聚合函数的输出时,使用agg()给了我们更多的灵活性。例如,通过向agg()传递一个列表或一个字典,我们可以一次得到均值和标准差。
df.groupby('day')[['tip']].agg(['mean', 'std']) # list
df.groupby(['day']).agg({'tip': ['mean', 'std']}) # dictionary

如果我们必须重命名输出列,而不是这样做:
df.groupby('day')[['tip']].agg(['mean', 'std']).rename(columns={'mean': 'avg', 'std': 'sd'})
我们可以更简洁地做到这两点:
df.groupby(['day'])[['tip']].agg([('avg', 'mean'), ('sd', 'std')])
df.groupby(['day']).agg({'tip': [('avg', 'mean'), ('sd', 'std')]})

到目前为止,使用列表或字典都同样有效。但是,如果我们想要检查多个变量的同一组汇总统计信息,使用 list 会更简洁。
df.groupby('day')[['tip', 'size']].agg(['mean', 'std'])

另一方面,有时使用字典是可行的方法。使用 dictionary,我们可以为每个变量指定不同的集合函数:
df.groupby(['day']).agg({'tip': ['mean', 'std'],
'size': ['median']})

有许多聚合函数可供使用:
◼️频率/计数:size(),count()
◼️中央倾向:mean(),median()
◼️方差:std(),var()
◼️其他:min(),max(),️ sum(),prod(),quantile()等等。
除此之外,我们可以在agg()中使用任何 Series 或 DataFrame 方法。例如,要查看日前最高的两个提示,我们使用:
df.groupby('day')['tip'].nlargest(2)

我们可以看到一些最大的提示是在周六。💰
此外,我们也可以使用 lambda 函数:
df.groupby(['day']).agg({'tip': [('range', lambda x: x.max() - x.min()),
('IQR', lambda x: x.quantile(.75) - x.quantile(.25))]})

这扩展了我们可以做什么的可能性!😎
📍技巧 4:利用 pivot_table()
假设我们需要得到两个变量的平均值提示。一种常见的方法是使用groupby():
df.groupby(['time', 'day'])['tip'].mean().unstack()

但是更好的方法是使用pivot_table():
df.pivot_table('tip', 'time', 'day')
这里,我们没有指定参数,因为我们已经按照正确的顺序为方法提供了值。下面是相同代码的另一个版本,其中所有参数都被显式指定:
df.pivot_table(values='tip', index='time', columns='day')
这个版本可能可读性更强。我认为,如果我们省略第一个参数名称,使其稍微简洁一些,可读性不会受到影响:
df.pivot_table('tip', index='time', columns='day')
我们将保持这种形式向前发展。
默认情况下,pivot_table()给出平均值。然而,我们可以通过将它指定为aggfunc参数来轻松地更改为我们喜欢的函数,例如sum():
df.pivot_table('tip', index='time', columns='day', aggfunc='sum')

类似于crosstab(),用pivot_table()也很容易得到小计。
df.pivot_table('tip', index='time', columns='day', aggfunc='sum',
margins=True)

我们还可以将字典传递给aggfunc,为传递给values参数的每个变量定制聚合函数。另一个有用的参数是fill_value,在这里我们指定如果输出丢失,我们希望看到什么值。让我们看一个例子来说明这些观点:
df.pivot_table(['tip', 'size'], index=['time', 'smoker'],
columns='day', fill_value=0, margins=True,
aggfunc={'tip': 'sum', 'size': 'max'})

使用pivot_table(),您可以准确地知道哪些变量将出现在行和列中,并且不需要对数据进行整形。
📍技巧 5:使用 transform()向数据添加聚合统计信息
当我们希望将分组聚合度量值追加回未分组的数据时,这个技巧很有用。这里有一个例子来说明这一点:
df['avg_tip_by_gender'] = df.groupby('gender')['tip'].transform('mean')df.head()

在本例中,新创建的变量 avg_tip_by_gender 显示了按性别分类的平均 tip 。换句话说,来自下方的平均提示由性别添加回未分组数据。
df.groupby('gender')['tip'].agg(['mean', 'std'])

现在,让我们举一个稍微高级一点的例子:
df['n_sd_from_gender_avg_tip'] = df.groupby('gender')['tip'].transform(lambda x: (x-x.mean())/x.std())df.head()

这里,使用lambda函数,我们为变量提示做了 3 件事:
x.mean():按性别找均值。
x-x.mean():通过性别求距离平均值。
(x-x.mean())/x.std():以标准差为单位求距离。
让我们以第一条记录(index=0)为例,为了简单起见,将数字四舍五入到小数点后两位:x=1.01、x.mean()=2.83、x.std()= 1.16
然后,n _ SD _ from _ gender _ avg _ tip=(1.01-2.83)/1.16 =-1.57
这就是我们在 n_sd_from_gender_avg_tip 第一行找到的。对于此记录,小费金额比女性顾客的平均小费低约 1.57 个标准差。
Voila❕:这些是我目前关于熊猫的顶级数据汇总技巧!

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。
谢谢你看我的帖子。希望我的建议对你有用,✂️.如果你有兴趣了解更多关于熊猫的信息,这里有我其他帖子的链接:
◼️️ 在熊猫中编写 5 个常见的 SQL 查询
◼️️ 给熊猫用户的 5 个提示
◼️️ 如何在熊猫数据框架中转换变量
再见🏃💨
数据科学面试的 5 个技巧

图片由斯科特·格雷厄姆在 Unsplash 上拍摄
概观
多次经历过面试过程的双方,这是面试的 5 个技巧,应该对那些有兴趣面试数据科学职位的人有所帮助。讨论的问题来自 https://datascienceprep.com/的,涵盖了顶级科技公司的面试问题。
1.学习时,注重广度而不牺牲深度
数据科学面试可能会很难,因为根据你面试的职位类型,你可能会被问到的面试问题的类型可能会有很大的广度和深度。你可以把它想象成两个维度:公司和角色。让我们以脸书产品分析和网飞机器学习为例。脸书有许多产品,数据科学的重点通常是分析和实验,因此重点是主题的广度而不是深度。相比之下,网飞有一个产品,大多数功能都致力于优化该产品的特定方面(例如,推荐的机器学习角色),因此重点是深度。
因此,对于产品分析角色,您可能会收到从 SQL 到概率的各种问题,如下所示:
a)假设您有关于用户操作的表格。编写一个查询,按月获取活动用户保持率。
b)假设你掷出三个骰子,观察三次掷出的总和。假设三次掷骰不同,结果之和为 12 的概率是多少?
而在更技术性的角色(机器学习)和公司方面,你可能会得到更深入的技术问题,例如:
a)假设您使用参数为λ的指数分布为一组客户的生命周期建模,并且您有 n 个客户的生命周期历史(以月为单位)。λ的最大似然法是什么?
b)对于 k 个聚类和 n 个样本点,k-means 聚类中使用的损失函数是什么?使用 1)批量梯度下降,2)使用学习率ε对聚类 k 的聚类均值进行随机梯度下降来计算更新公式。
2.当你不记得特定的概念时承认
我们都有过这样的情况,某个概念看起来很熟悉,但在面试中却不容易找到。一个不好的做法是假装你理解这个概念。在这种情况下,最好的办法是承认你不记得了,让面试官引导你。虽然这看起来很明显,但它非常重要,因为面试过程中的很大一部分通常都是用来筛选假阳性的(想象一下,你有一个仅用简历预测面试结果的模型),即简历很棒,但候选人却不那么棒的情况。对你确切知道和不知道的事情保持诚实绝对是一个决定性因素,所以在面试时记住这一点很重要。
3.不要害怕技术细节
问技术问题是面试官评估 1)你是否理解你声称知道的东西,2)你是否能以清晰简洁的方式传达适当的信息的一种方式。通常情况下,这些问题是面试中的“成败”点(特别是如果你声称了解某些话题,但对他们希望你了解的问题却知之甚少,按照上述观点)。被评估的两个品质对数据科学家来说非常重要,因为这项工作围绕着深思熟虑和清晰的数据分析。因此,当你有各种技术方面的专业知识时,绝对不要害怕展示出来,并与你的面试官讨论。一个好的面试官可能不同意你的观点,但他会进行深思熟虑的反复思考,只要你清楚自己的假设和思维过程,这绝对不会对面试过程有害。
4.彻底讨论你的项目
除了技术问题之外,经常会有很多关于你在简历中列出的项目的讨论。有项目是很重要的,因为大部分数据科学都是关于探索的,并且表明你在感兴趣的领域有某些可展示的技能是一个很好的招聘信号。正因为如此,招聘经理通常希望清楚地了解你在每个项目中做了什么,以了解你在这个过程中运用或学到了什么技能,以及如何运用。这意味着如果你有许多小组项目,你应该准备好解释你对每个项目的重要贡献以及每个项目的实际收获。
5.了解产品和业务方面
这几乎普遍适用于数据科学中的所有角色,因为无论职能如何,数据科学都将始终致力于推动产品(以及业务)向前发展。通过了解你申请的公司,你可以很好地理解他们可能会问的产品问题类型以及数据科学在每个产品中的位置。例如,在脸书,涉及产品问题的流程通常围绕实际的核心产品(脸书、Instagram、WhatsApp 等)。)或者基于感兴趣的假设(AR/VR 空间中的新东西,区块链等)。)而不是一些题外话。此外,重点是快速实验(A/B 测试,监控许多指标,等等。)因此,您应该知道他们可能会问什么类型的产品问题,从衡量成功到评估 A/B 测试过程中的权衡。以我的经验来看,这个框架对大多数科技公司都很有用。
感谢阅读!
如果您有兴趣进一步探索与数据科学面试相关的问题的深度和广度,请查看发送给您练习问题的简讯。
启动您的数据职业生涯的 5 个技巧
促进您的数据科学/工程职业发展的免费资源汇编。

四年前,我是一名刚毕业的大学生,在一家由四个人组成的物联网创业公司开始了我的职业生涯。我的第一个任务是研究和提出一个基于人工智能的军事数字助理的解决方案。虽然我在大学里学的是工程学,并且在一个实验室工作协助机器学习研究,但是在没有经验丰富的内部数据科学家/工程师的情况下承担一个巨大的自然语言处理项目是一项艰巨的任务。不可避免的是,我不得不求助于在线资源来填补空白,并在组织外寻找导师来指导和个人成长。
快进到现在,我现在从事我们物联网平台的数据基础设施工作,并在公司培训 fullstack 工程师和产品经理有关数据科学的知识,以分析我们的海量物联网数据。这篇文章汇集了我在数据科学/工程领域发展的这些年来使用的所有资源和学到的技巧。无论你是一名希望进入数据行业的工程师,还是一名正在准备新工作的应届毕业生,我希望我的建议对你有用。
1)订阅数据简讯
在进入流行的 MOOCs 或在亚马逊上购买推荐书籍之前,我开始订阅各种数据科学和数据工程通讯。起初,我阅读每一篇文章并做笔记,但随着时间的推移,我学会了识别多份简讯中共享的重要链接,并专注于少数几篇。时事通讯有助于及时了解新工具、学术研究和大型互联网巨头(如谷歌、网飞、Spotify、Airbnb、优步等)分享的热门博客文章。
以下是我最喜欢的一些时事通讯:
- 特里斯坦·汉迪的数据科学综述:特里斯坦对他的数据科学文章精选列表发表了自己的评论。
- 数据科学周刊:数据科学、人工智能和 ML 相关文章和博客文章的精选列表。我还发现培训&资源部分是一个有用的在线教程集合。
- 黑客时事通讯:每周时事通讯,精选自黑客新闻的文章。它不是数据科学/工程专业的,但有一个专门的部分是关于相关的数据和代码的。
- 来自 VB 的 AI 周刊:来自 Venture Beat 的作家的想法,收集了与 AI 有关的文章。
2)设计您自己的数据课程
接下来,根据你的侧重点,你需要精心设计你的数据科学、数据工程师或数据分析师课程。这可能包括学习如何用 Python 或 R 编程,如果你从非编程角色转行的话。如果预算不是问题,参加训练营或参加 Udacity 和 Dataquest 的课程可能是获得行业专家在线指导的一个很好的选择。然而,如果你像我一样对价格敏感,你可以选择遵循开源指南来创建免费课程:
- 开源社会大学数据科学
- 吴恩达的 Python 语言 ML Coursera 课程
- Python 机器学习书籍 Github 资源
- Hackernoon 的免费数据工程资源
- 大卫·文丘里的免费数据科学硕士课程
- 创业数据科学
- Topbot 顶级 AI 研究总结
这里需要提醒的是,仅仅学习这些课程是不够的。我发现网上的大多数课程和教程要么侧重于基础知识(如数学、统计、理论),要么侧重于简单的例子。在大数据中尤其如此,因为教程倾向于使用较小的数据子集在本地运行,而不是在云上遍历完整的生产设置。
为了用现实场景补充理论,我建议加入 Kaggle 并使用谷歌的免费工具,如 Colab 来练习处理大型数据集。你也可以搜索 Udacity 学生的 Github repos,看看一个顶点项目会是什么样子。
3)免费与专家交流
任何职业指南都会告诉你人际关系网很重要。但是如何找到愿意指导或简单回答一些问题的行业专家呢?在疫情之前,一种选择是参加聚会,但这种机会主要局限于湾区、纽约或西雅图(至少在美国)等主要科技中心的居民。另一个选择是参加专注于数据科学、机器学习或数据工程的会议或研讨会。然而,这些活动的门票非常昂贵,如果没有公司赞助,个人参加是不切实际的。
作为一名居住在巴尔的摩的初创公司员工,我的解决方案是通过首先观看行业合作伙伴在技术会议上举办的会议的免费视频(例如 AWS re:Invent、Microsoft Ignite 或 Google Cloud Next),并在 LinkedIn 上与发言者联系,来建立在线网络。除了主题演讲和关于新云产品发布的会议之外,还有大量关于最佳实践和架构讨论的会议,来自行业合作伙伴(例如 Lyft、Capital One、Comcast)的产品经理或首席开发人员将与 AWS/Azure/GCP 的解决方案架构师一起介绍如何解决大规模的实际问题。我会在会议上做笔记,然后联系 LinkedIn 上的所有演讲者,询问他们的产品或演讲中提到的架构决策。令人惊讶的是,几乎所有的演讲者都愿意回应并继续与我交谈,尽管我当时只是一名刚毕业的大学生,在一家不知名的初创公司工作。
随着时间的推移,我以这种方式稳步扩大了我的网络,并获得了与所有主要云提供商的新产品和行业趋势保持同步的额外好处。考虑到新冠肺炎目前的情况以及向虚拟活动的持续转移,这可能成为建立联系而不是亲自参加会议以会见其他利益攸关方的新规范。
4)获得认证
虽然云认证绝不是对能力或数据知识的验证,但我仍然认为投资认证是有价值的。如果你的目标是成为一名数据工程师,这一点尤其正确,因为云知识对于运行生产工作负载是必不可少的。即使对于数据科学家来说,熟悉云产品也能让你真正专注于分析数据,而不是努力加载和清理大规模数据。
获得认证的另一个被低估的方面是网络的开放。LinkedIn 上有非常活跃的成员,特别是在技术咨询领域,他们发布云数据职位的新机会。一些招聘人员直接在 LinkedIn 群中发布,只面向认证持有者。仅仅有证书并不能带来一份新工作或新职位,但是有了这些证书,就更容易与他人或招聘人员展开对话。就我个人而言,在获得认证后,我获得了一些小型咨询项目。
5)解决现实问题
最后,和任何工程学科一样,你只会随着实践而提高。如果你已经是一名数据科学家或数据工程师,获得真实世界的经验应该不成问题。对于其他寻求转型的人,许多人会建议建立一个投资组合。但是你从哪里开始呢?使用经典的 Titanic 数据集进行生存分类或对 iris 数据集进行聚类可能会损害而不是帮助你的投资组合。
相反,尝试使用公共 Github 项目作为灵感。基于你通过技术会议和认证从 LinkedIn 积累的人脉,看看其他人在建立什么。请随意使用来自 Github 上的 Udacity 或 Coursera 项目的示例。然后混合来自谷歌研究、 Kaggle 或的真实数据集,搜索一个有趣的数据集,并开始构建真实问题的解决方案。
如果您对某个行业或特定公司感兴趣,请尝试搜索公共数据集并构建一个样本项目。例如,如果你对 fintech 感兴趣,可以尝试使用 Lending Club 的公共贷款数据来构建贷款审批算法。使用真实数据集的最大收获是,与学术环境中提供的数据集相比,这些数据集非常杂乱和嘈杂。
显然,有多种方式可以发展你的职业生涯,并打入数据行业。我绝不是数据专家,每天都在学习和成长。如果您有其他资源、提示或建议,请在下面留下评论,我会为其他希望推进其数据职业的人更新这篇文章。
从心理学过渡到数据科学的 5 个技巧
数据科学
以及如何做到这两点。

在这里检索到。
目前,进入数据科学和人工智能的惊人世界变得越来越困难。对于那些没有技术背景的人来说尤其如此。
在这篇文章中,我想讨论心理学家或那些具有社会导向背景的人找到数据科学家工作的可能性。
作为一名心理学家,你比那些纯技术背景的人有几个优势:
- 你接受过深入的沟通训练
- 你是各自领域的领域专家(例如,经济心理学或临床心理学)
- 你熟悉统计学,也许比你的技术同行更熟悉
- 你有处理小数据集的经验
然而,你可能有同样多的缺点:
- 您不熟悉计算机科学领域(例如,创建生产管道、单元测试、git 等。)
- 你不熟悉必要的数学技能(例如,微积分、线性代数等。)
- 您对数据科学相关算法(例如,机器学习、NLP、流程挖掘、信息检索等)几乎没有经验。)
在这篇文章中,我将解释你如何利用这些优势,以及如何弥补这些劣势。
因此,本文中的主要信息很简单:
发挥你的长处,改进你的短处。
注意:这里的许多技巧可以推广到其他背景。然而,他们首先是针对那些有社会背景的人。如果考虑另一个背景,我会改变一些提示。
1.学习一门编程语言
这可能有点太明显了,但是学习一门编程语言可能比你想象的更重要,尤其是从长远来看!
应该选择哪种编程语言?
这是一个备受争议的问题,取决于你想从事的行业。总的来说,Python 和 R 目前主要用于机器学习和统计应用。

如果你想找一份技术含量不高,但更具分析性的工作,我会强烈推荐 R。r 在公司中已经存在了很长时间,用于进行数据分析,仍然有公司还没有转换到 Python。这种语言擅长做快速和相对深入的统计分析。
此外,由于 R 最初是由统计学家使用的,很有可能你以前用过它,因为社会科学是典型的重统计的。

另一方面,如果你真的想专注于复杂的算法或生产流水线,那么我会推荐选择 Python 。Python 是想要将他们的人工智能模型投入生产的数据科学家的首选语言。它非常灵活,与 R 相比,有更广泛的使用范围。

虽然从技术上讲,SQL 不是一种编程语言,但在访问和分析数据时,SQL 是不可或缺的。它通常用于查询存储在关系数据库中的信息。特别是对于非技术背景的心理学家,你可以很快学会如何做基本的分析。
我应该知道如何编程到什么程度?
这取决于你想成为什么类型的数据科学家。如果你想帮助企业做出决策,那么我建议你了解 SQL 和 r 的基础知识。然而,如果你正在寻找一份将模型投入生产的算法繁重的工作,那么关键是你要接近软件工程师的知识和效率。
我还应该关注哪些技能?
不过,为了让你的生活更轻松,我还是建议你学习一些东西:

Git 是一个版本控制系统,帮助你跟踪代码的变化。我见过许多数据科学家创建他们的笔记本/文件的副本,并将它们称为 V2,以向他们的解决方案添加功能。这不仅效率低下,而且很难对应用程序进行适当的版本控制和跟踪不一致性。

创建数据驱动的解决方案时,使用合适的 IDE 。例如,使用 Pycharm 而不是 Jupyter 笔记本将帮助您编写更好的代码,因为有许多选项可以帮助您跟踪问题。
如果你想更进一步,你可以看看下面的:
- 单元测试
- 分析运行时间
- API 开发
- Docker 集成
2.得到经验
有许多方法可以让你获得这方面的经验。以下是我认为在转变过程中最大的好处。
实习
可以说,简历上有一次或多次实习经历是让你获得数据科学家工作的最重要因素。以我的经验来看,雇主在寻找那些见过商业领域混乱数据,而不是你在学术界看到的相对原始数据的员工。
实习也将帮助你理解数据科学领域的语言。人们在决策中大量使用试探法和偏见。因此,当你像数据科学家一样说话时,他们更倾向于认为你是数据科学家。
此外,利用你的统计技能为你造福。许多初创企业和较小的组织都希望他们的团队中有人能够分析他们的小型数据集,同时清楚地传达这些结果。
创建投资组合
作品集可以帮助你交流与潜在雇主相关的各种技能和项目。不仅如此,它还可以用来学习如何正确地向对该领域了解不多的人解释技术原理。一个重要技能要有!

我的投资组合作为你可以做的项目的例子:【https://maartengr.github.io/projects/或https://github.com/MaartenGr/projects
我建议你在你的投资组合里放两件东西中的一件:
- 一个专业内的几个项目(例如深度学习)
- 或者跨越广泛专业领域的几个项目来展示广泛的能力
3.利用你的背景为自己谋利
在我从心理学家转到数据科学家后,我希望我的技能得到认可。我努力学习必要的技能,称自己为数据科学家。雇主经常会说,在将数据科学/人工智能解决方案翻译给非技术利益相关者时,我的心理学背景会很有帮助。然而,我想自己解决这些问题!甚至有几次,我把心理学背景从简历中去掉,只被认为是一名数据科学家。

此处检索到。
事后看来,这显然不是正确的做法。真正有帮助的其实很简单:
专注于心理学知识主要被视为领域知识的领域,而不是很好地沟通技术问题的能力。
对我来说,这导致了一个数据科学家的职位,在那里我将专注于分析和预测人类行为。
注:如果你喜欢成为数据科学家和利益相关者之间的桥梁,那么你的社会背景加上基本的数据科学知识应该足以胜任这样的角色。
4.了解商务智能工具
当您考虑数据科学解决方案时,可能不会首先想到使用 BI 工具。实际上,学习这些工具比你可能意识到的更重要。

如果你在非研究环境中工作,那么你的解决方案很有可能会被非技术利益相关者使用。这些利益相关者通常已经利用 BI 工具来驱动他们的决策过程。
为了让这些风险承担者使用您的预测模型,最好将它们集成到现有的工作流程中。了解正在使用的 BI 工具将有助于将您的模型的输出集成到它们的工作流中。
上面列出了一些最流行的工具(即 Qlik、Tableau 和 PowerBI)。我建议至少制作一个包含所有工具的仪表板,以了解这些工具的基本工作原理。然后,选择您喜欢的方法,深入了解这些应用程序的数据架构。
5.自学
拥有面向社会的背景的缺点和优点是,雇主更倾向于认为你的技能最适合一个需要大量沟通的职位。为了让他们认可你的技能,一个学位,无论是硕士课程还是在线课程,都可能是有益的。
硕士学位
在完成面向社会的项目后,继续攻读数据科学硕士学位可能会非常困难。与那些有技术背景的人相比,你很可能缺乏必要的技术技能,比如编程、线性代数、微积分、数据结构等。

因此,寻找能帮助你在更短的时间内获得这些必要技能的项目是很重要的。一些项目在技术和社会课程之间有很好的平衡,适合有社会背景的人。
我建议看一看研究硕士项目或者数据科学硕士项目。前者通常在你的领域内,并允许你将它与高级分析技能相结合。尤其是你硕士论文重点是预测建模的话。后者将向您介绍常见的数据科学算法和方法,同时保持数据科学和商业课程之间的良好平衡。
虽然许多人建议从事计算机科学或数学密集型项目,但我觉得这对心理学家来说是一个太多不同的方向。
MOOC
对于许多人来说,由于经济困难或者他们已经全职工作,很难注册一个新的硕士项目。一个很好的解决方案是效仿 MOOC,即大规模开放在线课程。换句话说,你可以在网上学习简单的课程。
MOOCs 对于学习一门新专业如此完美的原因在于,只要你觉得合适,你就可以在业余时间学习这些课程。他们往往比正规的硕士学位还要便宜!

这些课程的问题是需要一些研究来确定哪些课程值得你花时间。有些被认为是很棒的课程,比如吴恩达在 Coursera 上开设的机器学习和深度学习课程。
我个人对平台的偏好是:
注意:Udemy 上的课程经常打折,可以为你节省数百欧元/美元!
对我来说,这种转变需要几年的努力。这是一段艰难的旅程,但是相信我,这绝对是值得的!
如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我。
MLflow 实验跟踪的 5 个技巧
将 MLflow 推向极限:可视化、组织、更改和纠正您的 mlflow 运行
这篇文章是关于 MLflow 的——一个开源 MLOps 工具。如果你从未听说过,这里有一个教程。
我关注的是ml flow Tracking——允许记录和查看您的每个模型/实验的参数、度量和工件(文件)的功能。
当您记录您试验的模型时,您可以在 MLflow UI(以及其他)中总结和分析您的运行。您可以了解它们中哪一个性能最好,排除故障,并选择部署的最佳候选。我每天都在使用这个工具,并且发现了许多让我的生活变得更加轻松的特性。尽情享受吧!

由 Sebastian Staines 在 Unsplash 上拍摄的照片
1.交互式工件— HTML、GeoJSON 和其他
工件查看器是一个很棒的特性,它被设计用来深入到您记录的模型中。您可以用任何格式保存文件,并且可以下载这些文件,但是只有部分文件可以在工件查看器窗口中预览或呈现。目前分别是(来源: FileUtils.js ):
正文:。txt,。日志,。py,。js,。yaml,。yml,。json,。csv,。tsv,。md,。rst,。jsonnet
图片:。jpg,。bmp,。jpeg,。png,。gif,。svg
互动:。html,。杰奥森
下面是保存其中一些文件的示例片段:
测试 MLflow 工件查看器的全部功能—代码
下面是这次运行的 UI 外观,在工件查看器窗口中呈现得非常好:

测试 MLflow 工件查看器的全部功能—演示
最重要的是,因为它可以在 HTML 中呈现 iframe,你实际上可以使用这个片段嵌入一个网站(比如一个仪表板)。如果你的仪表板通过 URI 参数化,这可以很好地利用。

嵌入在工件查看器中的维基百科页面(作为一个例子)。
限制:如果您的嵌入式网站需要外部环境或一些认证,它可能不会工作。你可以在本期中了解更多信息。
这个用例真的将工具推到了极限,看起来有点不靠谱,但这是可能的。我无法想象会有很多用户嵌入这样的网站。
2.用文件夹组织的工件
当您在运行中有许多工件时,您可能想要将它们组织在文件夹中。方法如下:
在文件夹中记录工件—代码
结果是:

在文件夹中记录工件—演示
3.使用 nested=True 按部分组织的运行
有时,您的跑步有许多部分,每个部分都有自己的一套参数和指标。您可以使用嵌套管路来分隔它们。
嵌套运行—代码
看看这个分离得很好的运行树:

嵌套运行—演示
限制:正如您在上面看到的,UI 只显示了第一级嵌套的树结构,但是,“父运行”属性对于任何嵌套运行都是正确的。我希望在 MLflow 的下一个版本中,UI 能够反映一个完整的嵌套树。
4.使用 pandas 以编程方式运行查询
因此,您运行了您的实验,进行了您的批量分析,MLflow 自动图很棒,但您可能想要更多。您可以将您的运行和实验以及所有参数、指标和工件导出到 pandas df 中!
mlflow.search_runs(experiment_ids=["your_exprmnt_id"])
这会给你一个漂亮的熊猫数据框,里面有你需要的所有信息!

作为熊猫 DF 获得所有跑步记录
5.纠正运行
假设您前段时间运行了您的实验,但是您在代码中发现了一个乏味的 bug。例如,你忘了用秒除以 3600 得到小时。以下是纠正的方法:
更正 MLflow 运行
完成后,您可以随时更正、添加或删除任何 MLflow 运行。从 UI 或者通过使用上面解释的 search_runs API 获得 run_id。
6.MLflow 不仅仅是为了 ML
(与其说是提示,不如说是观察)
我们所有的程序员都在做实验:调整输入参数以优化输出指标。
我发现ML flow Tracking&UI在许多非 ML 实验中非常有用,例如剖析算法或更通用的 AI。由于自动化绘图和总结,它的用途超出了机器学习。这主要归功于 API 的易用性和简单但实用的 UI。MLflow 的日志记录功能几乎是无限的,自动绘图简单但信息量大!
给熊猫用户的 5 个建议
数据处理人员使用的一个流行的 Python 库是 pandas ,这是一个简单灵活的数据操作和分析库。在熊猫中有无数令人敬畏的方法和函数,其中一些可能不太为人所知。考虑到这一点,我有 5 个技巧来告诉你这些不常用的(至少在我看来)方法和函数在你还不知道的情况下是如何有用的🐼:

作者图片
这些对你来说有什么有趣或不熟悉的吗?💭我希望答案是“是”或者至少是“可能”。在这篇文章中,我将逐一介绍它们,解释我的意思,并举例说明它们是如何有用的。
0.Python 设置🔧
我假设读者(👀是的,你!)拥有:
◼️访问并熟悉 Python 包括安装包、定义函数和其他基本任务
◼️使用 pandas 的工作知识包括基本的数据操作。
如果你还没有安装熊猫和海洋的话,确保你已经安装了它们。
如果你是 Python 的新手,这个是一个很好的入门地方。如果你以前没有用过熊猫,这个是一个很好的参考资料。
我在 Jupyter Notebook 中使用并测试了 Python 3.7.1 中的脚本。
1.数据📦
我们将使用 seaborn 的技巧数据集来举例说明我的技巧。看到我做了什么吗?🙊
# Import packages
import pandas as pd
import seaborn as sns# Import data
df = sns.load_dataset('tips')
print(f"{df.shape[0]} rows and {df.shape[1]} columns")
df.head()

关于这个数据集(包括数据字典)的细节可以在这里找到(这个源实际上是针对 R 的,但是它看起来是指同一个底层数据集)。为了便于快速查阅,我在下面引用了他们的数据描述:
一名服务员记录了他在一家餐馆工作几个月期间收到的每一笔小费的信息
2.技巧🌟
📍技巧 1:用查询()过滤
让我们从我最喜欢的提示开始吧!比方说,我们想过滤那些总账单超过 30 美元,小费超过 6 美元的人的数据。实现这一点的一种常见方法是使用:
df.loc[(df['tip']>6) & (df['total_bill']>=30)]

这就完成了工作,但是你不觉得有点太冗长吗:每个条件都需要引用数据帧,如果有多个条件,还需要一个括号。现在,让我向您展示我们如何用更优雅的代码通过 query() 实现同样的结果:
df.query("tip>6 & total_bill>=30")
你看这看起来有多干净、简单和易读?我们不再重复输入 df 或者过多使用括号和圆括号。击键次数越少,编写代码就越快,代码也不容易出错。关于 query() 的一些额外提示:
# reference global variable name with @
median_tip = df['tip'].median()
display(df.query("tip>[@median_tip](http://twitter.com/median_tip)").head())
# wrap column name containing . with backtick: `
df.rename(columns={'total_bill':'total.bill'}, inplace=True)
display(df.query("`total.bill`<20").head())
df.rename(columns={'total.bill':'total_bill'}, inplace=True)
# wrap string condition with single quotes (this is what I like)
display(df.query("day=='Sat'").head())
# could also do it the other way around (i.e. 'day=="Sat"')

📍技巧 2:用 display()显示多个数据帧
我已经在前面的代码中给出了这个,所以你可能会猜到这个是关于什么的。假设我们想在 Jupyter 笔记本的一个单元格中检查 df 的头部和尾部。如果我们运行下面的代码,它只会显示尾巴:
df.head()
df.tail()

我们可以用 display() 来解决这个问题:
display(df.head())
display(df.tail())

在最后一行中, display() 是多余的,但它是为了保持一致性。如果我们从最后一行中去掉 display() ,其工作方式是相同的:
display(df.head())
df.tail()
📍技巧#3a:当按多列排序时,使用布尔列表
关于分类,我有两个建议。第一个用于对多列进行排序。
您是否曾经不得不对不同方向的多列数据进行排序?这里有一个例子来说明我的意思:按总账单升序排列数据,按小费金额降序排列。
在我知道 tip #3a 之前,我会创建一个临时列来翻转总账单或小费的比例,以使所有相关列具有相同的方向,并在之后进行排序(在本例中,我翻转了小费):
df['rev_tip'] = -df['tip']
df.sort_values(by=['total_bill', 'rev_tip'], ascending=True).head()

这是一种解决方法,但不是解决任务的好方法。我们用del df['rev_tip']删除 rev_tip 吧。相反,我们可以传递一个布尔值列表来指示每个变量的排序顺序:
df.sort_values(by=[‘total_bill’, ‘tip’], ascending=[True, False]).head()

我们不仅不需要创建额外的列,最后的代码看起来也更干净,可读性更好。
也可以使用布尔的数字表示。也就是说,如果我们换成ascending =[1,0],它也会给我们同样的输出。
📍技巧#3b:使用 nsmallest()或 nlargest()
如果您曾经必须快速检查在特定列中具有最小或最大值的记录的数据提取,这第二个技巧将会派上用场。使用 nsmallest(),我们可以用最小的总账单检查出 5 条记录,如下所示:
df.nsmallest(5, 'total_bill')

这是以下内容的简称:
df.sort_values(by='total_bill').head()
类似地,这两条线的输出是相同的:
display(df.nlargest(5, 'total_bill'))
display(df.sort_values(by='total_bill', ascending=False).head())

📍秘诀 4。自定义描述()
任何熊猫用户都可能熟悉df.describe()。这显示了数字列的汇总统计信息。但是通过指定它的参数,我们可以得到更多。
首先,让我们检查一下列类型:
df.info()

在我们的数据框架中,我们有数字列和分类列。让我们通过添加include='all'来查看所有列的汇总统计信息:
df.describe(include='all')

这很酷,但有点乱。让我们使用以下脚本分别按列类型显示汇总统计信息:
display(df.describe(include=['category'])) # categorical types
display(df.describe(include=['number'])) # numerical types

你更喜欢这个吗?如果我们既有字符串又有分类列,并且希望在一个表中显示两者的汇总统计数据,我们可以使用:include=['category', 'object']或exclude=['number'].如果您想了解更多,请查看文档。
📍技巧 5:更新默认显示设置
最后一个技巧可能比其他技巧更广为人知。让我们看看一些有用的显示设置的例子。
首先,我们可以使用下面的代码检查当前默认的最大行数和列数限制:
print(f"{pd.options.display.max_columns} columns")
print(f"{pd.options.display.max_rows} rows")

当前熊猫版本:1.0.3
这意味着,如果我们试图显示一个超过 20 列的数据帧,我们只能看到前 10 列和后 10 列(总共显示 20 列),而其余的将被截断为三个点。同样的逻辑也适用于行。通常,我们可能想看到比这些最大值更多的东西。如果我们想改变这种行为,我们可以这样做:
pd.options.display.max_columns = None
pd.options.display.max_rows = None
在这里,我们要求熊猫无限制地显示每一行和每一列。这可能是也可能不是一个好主意,取决于您的数据框架有多大。我们也可以将这些选项设置为我们选择的数量:
pd.options.display.max_columns = 50
pd.options.display.max_rows = 100
其次,根据你正在处理的数值变量的规模,当你处理熊猫时,你有时可能会遇到非常大或非常小的数字的科学符号。如果您发现 1200 和 0.012 比 1.2e3 和 1.2e-2 更容易阅读,您可能会发现这行代码很方便:
pd.options.display.float_format = ‘{:.4f}’.format # 4 decimal places
这可以确保你看到的是实数,而不是科学符号。
如果你想了解更多关于其他定制选项的信息,请查看文档。
Voila❕:这些是我目前给熊猫用户的最佳建议!

Zoe Nicolaou 在 Unsplash 上的照片
您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。
谢谢你看我的帖子。希望我的建议对你有用,✂️.如果你有兴趣了解更多关于熊猫的知识,这里有我另一篇文章的链接:
◼️️ 如何在熊猫数据框架中转换变量
再见🏃💨
促进您的 Power BI 开发的 5 个技巧
这些简单的技巧可以帮助你在日常工作中使用 Power BI

凯文·Ku @ pexels . com 摄影
我最喜欢 Power BI 的一点是快速报告开发。只需点击几下鼠标,就可以看到结果并准备进行分析。当然,复杂性是后来才出现的,但第一视觉印象可以在几分钟内轻松实现。
我相信大多数人都有自己的技巧和诀窍来促进 Power BI 开发。然而,我想分享我的 5 个技巧,这是我在报告开发过程中经常用到的。
技巧#1 度量文件夹
创建衡量标准是每个 Power BI 报告的必备内容。当你的报告只有几项措施时,这就不是问题了。但是,当您需要操作数十甚至数百个度量时,事情会变得更加复杂。
为了防止这种情况,我总是使用以下技巧来更好地组织我的度量。默认情况下,该度量将位于您创建它的表中。
我使用示例 Contoso 数据库,并创建了一个简单的度量来计算 FactOnlineSales 表中的销售总额:
Sales Total = SUMX(FactOnlineSales,
FactOnlineSales[SalesQuantity]*FactOnlineSales[UnitPrice]
)

如您所见,measure 驻留在最初创建它的 FactOnlineSales 表中。为了改变这一点,我需要创建一个全新的表来保存我的度量。
在“主页”选项卡下,选择“输入数据”并创建一个名为“销售度量”的普通空表。

单击 Load,您将在模型中看到一个新表。之后,单击您的测量销售总额,并在主页表下,选择销售措施。

然后,只需简单地删除第 1 列,就可以了。这样,您可以对您的度量进行分离和分组。相信我,这会让你的生活轻松很多。
提示#2 禁用自动日期/时间
直到最新的 Power BI 桌面更新,有一件事让我非常恼火。当您打开“文件”选项卡下的“选项和设置”,然后在“选项和数据加载”下,有一个“时间智能”部分。默认情况下,复选框处于选中状态。

那是什么意思?
Power BI 自动为模型中的每个数据类型字段创建隐藏的日期表!

这“本身”并不坏,因为 Power BI 可以防止您在没有适当的日期维度的情况下遭受痛苦。但是,由于正确的日期维度是您在构建报告时需要的关键因素之一,因此请禁用此功能,因为它会增加您的数据模型大小。
很高兴看到 Power BI 团队最终默认禁用了这个。
提示#3 Shift + Enter
对你们中的许多人来说,这可能看起来简单而愚蠢,但是在编写我的度量时,我经常努力正确格式化 DAX 代码。我正在使用一个叫做 DAX Studio 的神奇工具进行我的 Power BI 开发,里面有一个叫做 DAX Formatter 的小东西。
但是,当您直接在 Power BI Desktop 中编写您的度量时,如果您按 Enter 键,而不是移动到新行,您将确认您的度量以进行评估。
解决方法是按 Shift+Enter,您的光标将移动到新的一行,使您的 DAX 代码按照它应该的格式格式化:)
提示#4 列分析器
当我将数据导入 Power BI Desktop 时,在进一步进行数据建模和可视化之前,我喜欢快速浏览一下我的数据。我想检查数据质量、分布,并可能在开发的早期阶段识别一些异常值。
因此,我经常在 Power Query editor 的 View 选项卡下打开列分析。

通过这种方式,我对我的数据有了一种感觉,这样我就可以在深入研究之前做出正确的决定。
技巧 5 扩展维度属性
在大多数情况下,数据模型中的维度包含了理解事实表中数字所需的所有属性。但是,在某些情况下,您可能希望扩展维度属性,以使最终用户能够更加灵活地进行分析。
想象以下情况:在 dimProduct 表中,我们有一大堆不同的属性,比如类别、子类别、颜色等。
但是,假设我想根据销售数据对我的产品进行分类。因此,销售额大于 X 值的产品将为“高”,中等销售额的产品将标记为“中”,销售额小于 Y 值的产品将属于“低”组。
由于我已经在前面的一个示例中创建了我的 Sales Total 度量,我将使用这个值来确定产品应该属于哪个组。
现在,我将使用计算列来存储每个产品的总销售额。就像这样简单:
Sales Amt Product = [Sales Total]
根据这个值,我将确定产品属于高、中还是低组。为了实现这一点,开关功能就派上了用场:
Product Sales Grouping = SWITCH(TRUE()
,DimProduct[Sales Amt Product] > 100000,"High"
,DimProduct[Sales Amt Product] > 20000,"Medium"
,DimProduct[Sales Amt Product] <=20000,"Low"
)
基本上,这里发生的事情是,已经对每一行进行了评估,并根据值进行了相应的分类。这样,我们根据产品的销售价值,为产品创造了一个全新的属性。现在,我们可以简单地使用这个属性进行过滤,就像任何其他常规属性一样:

我们还可以使用我们的新属性作为切片器:

结论
也许其中一些技巧看起来微不足道,也不那么高级,但我发现它们在使用 Power BI 的日常工作中非常有用。
你最喜欢的小贴士是什么?欢迎在评论中分享它们,并查看更多关于如何从你的数据中制作音乐的技巧。
订阅这里获取更多有见地的数据文章!
改善陈旧终端的 5 个技巧
升级的时间到了

由约书亚·罗森-哈里斯在 Unsplash 上拍摄的照片
你可能不知道,但你现在的终端更像一辆卡丁车,而你本可以拥有一辆法拉利。
我将向您展示一些很棒的工具,让您的命令行更上一层楼。
iTerm2
如果您在 Mac 上并使用默认终端。停下来。去安装 iTerm2 。
iTerm2 有许多出色的特性,包括:
- 易于分割窗格,以便在一个屏幕上显示多个终端
- 在您的终端内搜索
- 自动完成
- 轮廓
- 256 色所以看起来很漂亮
- 智能选择—只需一次点击,就可以轻松拷贝您最想要的文本
- 丰富的定制选项
一旦你下载了它,花些时间四处看看,了解所有的选项。开箱即用,虽然,这是一个巨大的升级,并有很大的默认值。
Zsh
Zsh 是 bash 的一个增强版本,它基本上为您提供了一系列额外的特性,使您在命令行导航时更加轻松。以下是一些例子:
- 自动光盘-你只需输入目录的名称,它改变目录,而不需要光盘。
- 带修正的路径扩展——如果你不记得路径名,但认为“re”在某个地方,只需键入“re ”,点击 tab,zsh 就会扩展所有的可能性。即使“re”位于路径名的中间。它还会自动更正拼写错误。
- 插件和主题——这使得添加更多的功能和美观变得容易。
首先,我会查看一下 zprezto 。它会自动为你设置许多不错的默认设置和功能,并提供易于使用的主题。这里有一个:

已经比你默认的终端好看多了。
要查看其他主题,请按照下列步骤操作:
- 要查看主题列表,请键入
prompt -l。 - 要预览主题,请键入
prompt -p name。 - 在 ~/中加载你喜欢的主题。然后打开一个新的 Zsh 终端窗口或标签。
此外,您可以在这里看到您可以打开的所有模块的列表。我会确保检查出 git 和编辑器模块。这将允许您在终端中集成 git,并打开各种编辑器,如 vim 或 emacs。我喜欢能够在终端中使用 vim 命令。
使过度曝光
经过日晒的将会添加经过广泛研究的漂亮的配色方案,给你很大的对比度,这使得你的命令行容易阅读并且看起来很棒。
这里的是安装 iTerm2 的链接。
源代码专业版
事实证明,在编程时,并非所有的字体都是一样的。事实上,许多字体是专为程序员设计的。我目前最喜欢的是带电源线的源码 Pro。
源代码 pro 是字体,而 powerline 提供了额外的状态线图形,iTerm 可以将其用于各种应用程序,如 vim 和 zsh。
这种字体是 Adobe 开源库的一部分,因此可以免费使用。从上面的链接下载并安装字体后,您可以在首选项中更改 iTerm2 字体。
语法高亮显示
谁不爱语法高亮?它使得所有的东西都更容易阅读,并且为 zsh 安装起来也很快。如果你没有自制软件,就去安装吧。
然后运行以下命令:
brew install zsh-syntax-highlighting
就是这样!现在你只需重启你的终端,享受语法高亮!
此时,每次打开航站楼,你都应该感觉自己是在驾驶一辆法拉利。您应该会看到一个漂亮的命令行,该命令行已经过定制,可以为您提供最佳的编码体验。你可能会发现很难不向你的朋友炫耀它。😊
这个故事也可以在这里找到。
加入我的 邮箱列表 保持联系。
准备黑客马拉松的 5 个技巧
参加黑客马拉松是你人生中必不可少的经历。你可以在那里找到很多乐趣,学习新东西,与不同领域的人建立关系网。我会推荐每个人都尝试一个。这里有 5 个技巧可以帮助你准备你的第一次黑客马拉松。
1。找队友
第一件必不可少的事情当然是寻找队友,一些黑客马拉松需要团队申请或者优先考虑团队。这可以节省组织者将参与者分组的时间,通常,预先形成的团队具有更高的工作效率和更好的协同作用。虽然可能会有例外情况,有时组织者希望自己安排团队,这样每个团队都可以有不同背景的专业知识,如果比赛前允许团队组建,你应该聪明点,先找到你的合作伙伴。要想组建一个加入黑客马拉松的完美团队,你应该找到不同领域的人,这样大家可以互相弥补不足,集中你的力量。还有另一篇文章告诉你你应该为你的团队找到什么样的人,以及为什么你需要他们。

2。集思广益
黑客马拉松组织者可能会在黑客日之前发布竞赛主题,他们提前发布问题陈述的原因是为了让参与者有更多的时间研究主题。有时候,这些话题真的是公司的挣扎,所以这就是为什么他们举办黑客马拉松来帮助他们寻找解决方案。因此,他们希望给参与者更多的时间来思考想法。早点开始准备想法,你也可以计划一些问题在黑客日问导师。

帕特里克·帕金斯在 Unsplash 上拍摄的照片
3。查找参考文献
网上有很多源代码和模板,如 PowerPoint 和 mockup,因为黑客马拉松的时间有限,拥有现成的模板或源代码可以节省你很多时间。通常,对于在线源代码,您需要花一些时间来研究它们,以调试或确保与您的编程语言版本没有兼容性问题。对于演示板和模型,有许多有用的网站提供免费资源。不同的线框和原型开发软件有画廊来展示其他创作者的作品。你可以找到许多类似 Instagram 或 Carousel 的简单应用程序设计的线框。这些都是非常好的资源,可以帮助你快速启动你的项目。会有另一篇文章介绍一些方便的网站供你寻找漂亮的模板。

丹尼尔·科尔派在 Unsplash 上拍摄的照片
4。公司背景研究
基于公司的背景,你可以在你的演讲中加入一些元素,比如配色方案,他们的使命,以及他们最近的项目。这些都是能引起评委注意的细节。除此之外,如果你的项目想法能够与公司的使命相一致,你的项目将更容易引起评审团的兴趣,因此有更高的机会赢得黑客马拉松。此外,你也可以搜索一下,看看这些公司为什么组织黑客马拉松。一些共同的目的,包括促进创业文化,培养创新的品牌形象,招募人才。如果这些公司在过去的黑客马拉松中对获胜团队采取了任何后续行动,你可以根据列出的奖励或谷歌来判断。根据目的,你可以猜测哪些想法更能引起评委的兴趣。如果公司想鼓励年轻人创办自己的公司,你可以做一些你更感兴趣的事情,因为这个项目想法可能最终会成为一个创业公司。

5。想想加入的目的
参加黑客马拉松有很多原因,他们可以结识新朋友,学习该领域的新技术,获得工作机会。在参加黑客马拉松之前,仔细想想你想要达到什么目标,以及为了达到目标你应该做些什么。例如,如果你想与领域专家交流,你可以稍微打扮一下,早点到达会场,抓住任何机会在舞台上或其他人面前展示自己。想获得工作机会怎么办?通常,黑客马拉松会有辅导环节。组织公司的高层将来到每个团队,听取他们的想法。准备好提出想法,这是给他们留下好印象的恰当时机。如果黑客马拉松的目标是学生,大多数都会为潜在参与者提供实习机会。

Denys Nevozhai 在 Unsplash 上的照片
希望这篇文章能帮助你更好地准备你的下一次黑客马拉松=)
如果你觉得我的文章有用,请在我的 linkedIn 页面上为我的技能背书,鼓励我写更多的文章。
可再现数据科学的 5 个工具

使用这些工具开发协作、可信和高效的数据科学项目
科学上对再现性的定义是“重复实验时获得一致结果的程度”。数据,尤其是保存在数据库中的数据,可能会发生变化。此外,数据科学在很大程度上基于随机抽样、概率和实验。因此,在这一领域,进行分析和构建模型,让同事或您在未来某个时间点重现结果和成果,是一项颇具挑战性的工作。
尽管获得数据可能具有挑战性,但有许多原因表明再现性对于良好的数据科学至关重要。
- 再现性支持协作。数据科学项目很少是孤立发生的。在大多数情况下,数据科学家与其他数据科学家和其他团队一起工作,将项目集成到业务流程中。为了有效地协作,其他人可以重复、继续和维护您的工作是很重要的。
- 再现性也支持效率。为了能够最有效地工作,你和你的同事必须在你的工作基础上继续努力。如果结果或过程不能准确地重复,那么在现有工作的基础上发展是非常困难的,相反,你会发现你不得不从头开始一个项目。
- 再现性建立信任。如前所述,数据科学是一门建立在概率和实验基础上的学科。在这个领域中,对结果的信任是非常重要的,这样才能发展对项目的认同,并与其他团队有效地合作。
在接下来的文章中,我将分享 5 个有助于数据科学重现性的工具。这些工具中的每一个都提供了解决围绕创建可再现数据科学项目的特定挑战的功能,包括:
- 记录项目中使用的工具、库和版本。
- 为数据科学项目创建独立、一致的环境。
- 开发一致的、易于阅读的文件结构。
- 为您的代码编写测试。
- 使用版本控制。
水印
Watermark 是一个 IPython magic extension,可以打印任何 IPython shell 或 Jupyter 笔记本会话中的软件版本、硬件以及日期和时间信息。
Watermark 提供了一种非常快速简单的方法来跟踪项目中涉及的工具、库、版本、作者和日期。这对于仅在笔记本上进行的临时或一次性工作,而不是较大的项目特别有用。这意味着,如果一位同事想要重复一项工作,他们对需要安装的工具和库有一个很好的想法,谁创建了这项工作,以及它是什么时候被放在一起的。
要安装 watermark,请在您的终端上运行以下命令。
pip install watermark
要在 Jupyter 笔记本或 IPython shell 中使用该扩展,请运行以下命令。
%load_ext watermark
您可以通过指定多个标志来选择要打印的信息。可用标志的完整列表在文档中列出。但是作为示例,下面的代码打印了当前日期、我正在使用的 python 和 IPython 的版本、我已经安装和导入的库的版本,以及关于我正在使用的硬件的信息。输出显示在代码下方。
%watermark -d -m -v -p numpy,matplotlib,sklearn,seaborn,pandas

Pipenv
在数据科学中,创建项目的环境,即安装的工具、库和版本,对复制相同的结果有很大的影响,并且在许多情况下能够在另一台计算机上运行代码。
虚拟环境是为单个项目提供封闭环境的工具。这些环境包含一个通常称为需求文件的文件,该文件列出了项目的依赖项(工具、库和版本)。当您创建一个虚拟环境时,您可以选择安装该文件中的所有依赖项,从而重现最初创建该项目的环境。
创建虚拟环境的工具有很多,但是如果你使用 python,那么 pipenv 是最好的工具之一。
要安装 pipenv,请运行以下命令。
$ brew install pipenv
使用特定版本的 python 创建新环境。创建一个新目录,然后从新目录运行以下命令。
mkdir pip-test
cd pip-test
pipenv --python 3.7
要激活环境运行pipenv-shell,您现在将进入一个名为“pip-test”的新环境。

如果我们检查目录的内容,我们会看到 pipenv 已经创建了一个名为Pipfile的新文件。这是需求文件的 pipenv 等价物。
ls

让我们检查一下这个文件的内容。如有必要,将“Sublime Text”替换为您首选的文本编辑器的名称。
open -a "Sublime Text" Pipfile
新文件包含以下内容。

我们目前没有在环境中安装任何软件包,但是如果我们安装了,我们会在这个文件中看到它们。让我们安装熊猫来测试这个。
pipenv install pandas
如果我们再次打开文件,我们可以看到 pandas 现在已经被添加到 Pipfile 中。

现在,让我们假设一位同事想在另一台计算机上处理您的项目。如果他们要从 Github 克隆你的回购协议,Pipfile 将包含在这个文件中。然后,他们可以通过运行以下命令,简单地重新创建您一直在使用的确切环境。
pipenv install --dev
pipenv shell
这将在您工作的目录中创建一个 pipenv 环境,并安装 pip 文件中的所有依赖项。
如果您想在 Jupyter 笔记本会话中使用这个环境,那么您需要运行这个代码。您可以将名称和显示名称更改为对您的环境有意义的名称。当您启动 Jupyter 笔记本会话时,这将显示为一个图标,可从启动程序屏幕中选择(显示在代码下方)。使用这个内核创建的任何新笔记本都将包含 pipenv 环境中的所有依赖项。
python -m ipykernel install --user --name myenv --display-name "Python (pipenv test)"

烹饪刀具
拥有一个定义明确、一致的数据科学项目结构可以让协作、共享和构建项目变得更加容易。Cookie-cutter-data-science 是一个工具,它用一行代码创建了一个标准的项目框架结构。
要安装,请运行以下命令。
pip install cookiecutter
要创建一个新项目,您只需运行。
cookiecutter https://github.com/drivendata/cookiecutter-data-science
该工具将提示您输入许多详细信息,其中许多是可选的。

现在已经创建了以下项目结构,这对于大多数数据科学项目来说已经足够了。

Pytest
Pytest 是一个对你的 python 代码进行单元测试的工具。单元测试是一个可重复的操作,您可以将它添加到代码中,检查各个代码单元是否按预期工作。单元测试是为您编写的代码添加信任的良好实践。
Pytest 可以安装并导入使用,如下所示。
pipenv install pytestimport pytest
一个简单的测试可能是检查您正在导入的数据是否已经更改。
import pandas as pd
from sklearn.datasets import load_bostonboston = load_boston()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
len(boston_df)assert len(boston_df) == 506
您可以向语句中添加一条有用的错误信息,以便更容易地调试代码。
assert len(boston_df) == 506, "Len(df) should be 506"
如果我们随后更改数据,将会显示错误消息。
import pandas as pd
from sklearn.datasets import load_wineboston = load_wine()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
len(boston_df)assert len(boston_df) == 506, "len(df) should be 506"

开源代码库
版本控制是开发可重复项目、共享工作和促进协作的重要工具。维护项目的远程和本地版本允许其他人访问和开发他们自己的本地版本,回滚和监控代码更改,并安全地合并更改和新功能。
Github 是版本控制最知名和最广泛使用的平台之一。Github 使用一个名为 Git 的应用程序对代码进行版本控制。项目文件存储在一个称为存储库的中央远程位置。每次你在你的机器上做了一个本地的修改,然后推送到 Github,你的远程版本就会被更新,提交的内容会被记录下来。如果您想在提交之前回滚到项目的前一个版本,该记录允许您这样做。
此外,由于项目文件存储在远程位置,任何其他人都可以下载回购协议并对项目进行更改。分支的概念,本质上意味着你制作一个完全独立的项目的临时副本,意味着你可以首先在那里进行修改,而不用担心破坏任何东西。
关于使用指南,我在这里为数据科学家写了一份 Github 指南。
与传统的软件开发不同,目前在数据科学项目中有最低限度的标准实践。然而,上面描述的工具对创建标准实践大有帮助,这反过来将导致更多可重复的数据科学项目。
感谢阅读!
5 个工具保护你的注意力不被工作中的数字干扰

贝基尔·登梅兹在 Unsplash 上拍摄的照片
控制你的思维,通过消除干扰来增强你的表现
我刚刚查看了时间。又浪费了半个小时,在 YouTube-Twitter-脸书三角的黑洞中度过。它开始是快速检查任何新消息,但后来我点击了我的新闻订阅中的一个视频,导致推荐和自动播放的兔子洞。
因为我在电脑前工作,这种事过去经常发生在我身上。分心总是在几个点击之外。我曾经去过肌肉记忆的脸书。Alt + Tab 打开浏览器,Ctrl + T 打开一个新的选项卡,只需在导航栏上放一个 f ,浏览器就知道我想要什么。无意识地做到这一点是如此容易。

斯蒂芬·科斯马在 Unsplash 上拍摄的照片
很快,我意识到这需要停止。这种感觉你大概很熟悉。
社交媒体和其他数字工具是双刃剑。
它们在某些场合是有用的,但在其他方面是为了让你尽可能长时间参与,即使你并不真的想参与。为了与他们保持健康的关系,必须建立最佳实践,并划定界限。否则,你的表现会受到影响。(最终,你的心理健康。)
在这篇文章中,我将帮助你保护你的两个最宝贵的资源:你的时间和注意力。
1.网站拦截器
处理分心是很累的。如果一个源头出现了,你不得不花费精力去避开它。
处理注意力分散的首要方法是消除它的来源。
最明显的方法是根本不使用浏览器。然而,这在实践中是不可能的。(有时生产率与每小时堆栈溢出页面数成正比。)
一个可行的选择是提前屏蔽掉所有让人分心的网站。为此我使用了LeechBlock(Firefox、 Chrome ),但是还有很多其他选项,比如 BlockSite 和stay focused。

脸书,被李奇布洛克挡住了。
如果你习惯了令人分心的网站被屏蔽,本能地打开它们的冲动也会消失。屏蔽是保护你注意力的绝对必备工具。
2.推荐/新闻订阅阻止程序
完全屏蔽网站可能并不适用于所有情况。你可能会在 YouTube 上听音乐,或者在 Twitter 上发帖。在这些情况下,有一些工具可以通过隐藏新闻提要和推荐来减少这些网站的干扰。
例如,DF YouTube 浏览器扩展( Firefox , Chrome )将使所有推荐从网站中消失,甚至从侧边栏中消失。

DF YouTube for Firefox。(是的,我知道,我关注了太多的游戏频道。)
通过这种方式,你必须对 YouTube 的使用有明确的认识。不再迷失在推荐的视频中。
对于脸书,你可以使用 News Feed Eradicator 扩展( Firefox , Chrome ),它用励志名言取代了无限滚动的 Feed。
如果你是 iOS 用户, FeedZen 可能对你有用,它会屏蔽所有的社交媒体信息。由于安全特性,它只有在你从内置的 Safari 浏览器访问网站时才有效,但如果你真的想消除干扰,你就不应该在手机上安装任何社交媒体应用程序。(除非你的工作涉及到他们。)
3.社交媒体管理工具
如果你意识到个人品牌,你会持续使用社交媒体与人交流并推广你的工作。(或者处理社交媒体是你的工作。)这会让人分心。在我看来,管理这些的最好工具是第三方应用程序,让你不用真正使用 Twitter、Instagram 或其他工具就可以整合账户和创建帖子。
这有几个应用。我使用 Buffer (它有一个免费的计划),但有几个替代方案,如 Sprout Social 或 Hootsuite ,它们提供类似的功能。

缓冲发布来处理社交媒体帐户。来源:缓冲
这样,你可以在不访问网站本身的情况下发表文章,避免被拖入无限滚动的提要中。
4.适应音乐聆听习惯
工作时听音乐的习惯当然取决于个人喜好,但是有一些最佳实践可以帮助你集中注意力。
关于这一点,最重要的是音乐的选择。为了避免花费过多的时间挑选完美的音乐来听,你应该
- 关闭推荐,
- 提前创建播放列表。
选择下一张专辑来听会导致长时间的浏览,这是浪费时间。
不仅如此,从切换曲目等干扰中恢复甚至需要几分钟。你不会想把这些加起来的。
我不会推荐任何关于特定音乐的东西,这完全取决于你。有些人只喜欢器乐,有些人不喜欢,这完全没问题。你听你想听的,只是不要把时间和精力花在决定听什么上。提前做好这项工作。
5.番茄工作法:管理工作和休息时间
焦点不能无限期地保持。深度工作会话的平均时间因人而异,但一段时间后,每个人都会失去注意力并降低绩效。这不仅适用于整个工作日,也适用于你一天中的单个工作时段。
如果你在一项任务上花了很长时间而没有休息,你会失去注意力。
弗朗切斯科·西里洛发明的番茄工作法给你一个框架来调节你的工作时间并集中你的注意力。( Pomodoro 在意大利语中代表番茄,名字来源于作者使用的番茄形状的厨房定时器。)

番茄定时器。来源:维基百科
这个方法尽可能简单。本质上,这就是工作流程。
- 决定一项工作任务。
- 将计时器设置为 25 分钟。只关注手头的任务。
- 定时器到时,设为 5 分钟,休息一下。
- 重复 2。-3.(如果你做了 4 次,你可以有更长的 15 分钟休息时间。)
这个技巧的主要优点是它让你意识到工作和休息。在会话过程中识别注意力分散变得很容易,这是防止注意力分散的第一步。
事实上,我现在正在使用这种方法。没有必要为此购买任何厨房定时器,像 TomatoTimer 这样简单的网络应用程序就可以完美地工作。

结论
你的注意力是你最宝贵的资源之一。无论你专注于什么,都会成长。另一方面,为了廉价的多巴胺刺激而放弃它,比如经常检查脸书,会阻碍你的进步。
学会管理注意力是成功的基本技能。如果你在电脑前工作,你尤其危险。分心总是在几个点击之外。要处理它,您必须消除其根源并建立最佳实践。
你没有时间浪费时间。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
在 Python 中使用 Selenium 进行数据搜集的 5 个技巧
在 Python 中使用 selenium 的最佳数据搜集实践

图片由 istock 通过 Ada Yokota 提供
用于网刮的硒
Selenium 是一个浏览器自动化库。Selenium 最常用于测试 web 应用程序,可以用于任何需要与浏览器自动交互的任务。这可以包括网络抓取。
下面的教程将是一个用户引导的使用 selenium 进行 web 抓取的最佳实践指南。我列出了我的 5 个顶级技巧,它们将帮助用户使用 Python 尽可能高效地抓取他们请求的任何数据,并使用尽可能少的代码。
目标:
从 BBC 新闻中提取冠状病毒全球头条。
先决条件
要学习本教程,您需要:
- 下载 selenium 驱动程序。chrome 驱动程序可用于与 chrome 交互,此处提供。
pip install selenium
5 个硒最佳实践技巧
技巧 1:将 webdriver 可执行文件放在 PATH 中
要开始我们的网页抓取任务,我们必须首先导航到下面的页面,https://www.bbc.co.uk/news。这一步只用三行代码就可以完成。首先我们从 selenium 导入 webdriver,创建 chrome webdriver 的一个实例,最后在名为 driver 的 webdriver 对象上调用 get 方法。
为了使代码简短易读,chromedriver 可执行文件可以放在用户选择的文件夹中。然后,可以将该目的地添加到环境变量下的 PATH 中。简单地使用 webdriver,webdriver 就准备好了。括号中没有传递给 Chrome 的参数。

技巧二。使用控制台查找任何 webelement
当我们导航到网页时,我们希望找到搜索框,点击它并开始键入“冠状病毒全球更新”。
要找到这个 webelement,我们只需右键单击 chrome 并选择 inspect。在我们检查时打开的页面的左上角,我们可以使用光标悬停并选择感兴趣的 web 元素。如图所示,搜索框有一个输入标签,id 值为‘orb-search-q’。

我们如何确保这是我们唯一感兴趣的搜索元素?
我们可以简单地选择控制台选项卡窗口,然后键入两个美元符号,后面跟着括号和引号。在引号内,我们写标记输入,后跟方括号。在那些方括号中,我们可以添加 id 及其值。
Format to find CSS selectors
$$('tag[attribute="attribute value"]')
如图所示,只返回一个元素的数组。我们可以确信我们现在有正确的搜索框可以点击,并开始输入我们的搜索查询。
控制台中引号的内容是一个有效的 CSS 选择器,我们可以在脚本中使用它来查找 webelement。
这就引出了下一个技巧。

技巧 3:强大的数据搜集一行程序:动作链和键
我们现在可以调用 webdriver 对象驱动程序上的find_element_by_css_selector方法。
我们希望我们的 webdriver 移动到这个 webelement,单击它,键入我们的搜索查询“全球冠状病毒更新”,然后按 enter 键。
这可以使用 selenium 的 ActionChains 和 Keys 类轻松完成。我们简单地将驱动程序传递给 ActionChains,方法链使用方法,move_to_element,click,send_keys来输入类型,key_down使用传递的Keys.ENTER来模拟输入。要运行这个命令,请在 ActionChain 的末尾添加perform方法。
运行 ActionChain 将我们带到这里:

技巧 4:捕获数据
所示的 webelement 返回图像、标题、副标题和一些附件信息,如出版日期。
我们如何从每个故事中捕捉到标题?
如果我们在控制台中键入如下所示的 webelement,它将返回 10 个 web 元素的列表。我们想从这些故事中提取标题。
为此,我们可以简单地迭代这 10 个故事。为此,我们调用传递了 web 元素的find_elements_by_css_selector。这个方法返回一个我们可以迭代的类似列表的对象。
我们可以将它赋给变量名 top_titles,并使用 for 循环遍历它们。在 for 循环中,我们可以使用 2 号提示找到与每个标题相关的元素,并通过调用 webelement 上的.text提取文本。
除了打印到终端控制台,我们还可以写入一个. txt 文件,这样无论何时运行脚本,我们都有一个标题的永久副本。

技巧 5:无头 webdriver
当我们运行脚本来提取标题时,会弹出一个浏览器窗口,如下面的视频所示。
虽然这看起来很有趣,但在很大程度上,这可能不是我们想要的。
要删除浏览器,从 selenium 模块导入 Options 类,创建该类的一个实例,并使用传递的字符串参数'— headless '调用该实例上的add_argument方法。最后,在 webdriver 中,在 options 参数下,添加指向 headless 浏览器的变量。
额外提示:在慢速连接的情况下,添加等待来查找元素
Webdriver 等待、等待和预期条件
为了确保网络抓取成功,我们可以在脚本中引入一个等待。这个特性在网页加载缓慢的情况下特别有用。为此,我们导入所示的三个类。
引入等待的好处在于,当它们被构造时,几乎可以写成一个句子。此外,只要我们愿意,他们就可以搜索 webelement。如果 web 元素发现得更早,脚本也会执行得更早。
这里,我们传递我们的驱动程序对象 WebDriverWait 类,告诉它最多等待 10 秒钟,直到找到元素。在until方法中,我们传递别名为 EC 的ExpectedConditons类,并在其上调用定位元素的方法。然后,我们向这个方法传递一个定位器元组,详细说明我们正在搜索什么元素(通过。CSS_SELECTOR)和 webelement。
等待将使您的脚本更健壮,更不容易出现超时异常。
这里显示了这些示例的脚本。
将自动化脚本转换成类
冠状病毒标题类
当我们确信 web 自动化工作正常时,我们现在可以将代码转换成一个类。为了让这个类的潜在用户简单明了,我决定把这个类叫做CoronaVirusHeadlines。
在init构造函数中,我在指向 Chrome webdriver 的对象中设置了一个驱动属性。
该代码与前面几节中展示的过程代码完全相同(除了我已经删除了 headless 选项)。唯一的例外是驱动程序已被设置为对象中的一个属性。驱动程序在 init 方法中被初始化,并在get_headlines方法中被用来检索标题。
为了获得标题,我简单地创建了这个类的一个实例,名为virus_data。然后我调用这个类上的get_headlines方法来检索. txt 文件中的标题。
在我的本地目录中,我现在可以检查名为“冠状病毒 _ 头条新闻. txt”的文件。
如下图,标题已经被刮成了一个. txt 文件。请记住,如果你自己运行代码,标题当然会有所不同,因为冠状病毒疫情不断演变,每天都有新的故事发布到 BBC。

摘要和扩展
这些是我使用硒来刮痧的一些最好的技巧。一些技巧,包括 actionchain 和 wait 技巧,可读性很强,也很容易被其他阅读你的代码的人理解。
该脚本很容易扩展。您也可以导航到第二页来检索接下来的 10 个标题。或者,您可能希望将标题通过电子邮件发送或转换成可执行文件,这样标题就可以与您和您感兴趣的同事/朋友共享,他们可能不一定使用 Python。这可以分别使用smtplib或PyInstaller 模块来实现。
感谢阅读。
不同类型的二叉树与彩色插图
一个有助于识别那些令人困惑的二叉树类型的指南

二叉树的类型||由 Anand K Parmar 设计
B 二进制树是一种树形数据结构,其中每个节点最多有 2 个子节点。二叉树有几种类型,它们的名字很难记住。
我写这篇文章是为了了解 5 种常用的二叉树类型。除了编写定义,我还为任何特定类型的有效和无效树结构添加了很酷的插图。
1。完全二叉树
全二叉树是每一个节点都有 0 或 2 个子节点的二叉树。

全二叉树的有效和无效结构||由 Anand K Parmar 设计
有趣的事实:对于全二叉树,下面的等式永远成立。
叶节点数=内部节点数+ 1
2.完全二叉树
完全二叉树除了最后一层,所有层都被节点完全填充,在最后一层,所有节点尽可能在左侧。

完全二叉树的有效和无效结构||由 Anand K Parmar 设计
有趣的事实:二叉堆是完全二叉树的一个重要用例。
3.完美二叉树
完美二叉树是所有内部节点都有 2 个子节点且所有叶节点都在同一深度或同一级别的二叉树。

完美二叉树的有效和无效结构||由 Anand K Parmar 设计
有趣的事实:一棵高度为 H 的完美二叉树的节点总数是 2^H — 1 。
4.平衡二叉树
平衡二叉树是每个节点的左右子树的高度最多相差 1 的二叉树。

平衡二叉树的有效和无效结构||由 Anand K Parmar 设计
有趣的事实: AVL 树和红黑树是众所周知的生成/维护平衡二叉查找树的数据结构。搜索、插入和删除操作花费 O(log n)时间。
5.退化(或病态)二叉树
退化二叉树是每个父节点只有一个子节点的二叉树。

退化二叉树的有效和无效结构||由 Anand K Parmar 设计
有趣的事实:退化二叉树的高度等于该树中节点的总数。
您的机会…
加入我的部落后,获得我的个人 Java 收藏清单作为免费的欢迎礼物。 马上获取!
关于作者
Anand K Parmar 是一名软件工程师,热爱设计和开发移动应用程序。他是一名作家,发表关于计算机科学、编程和个人理财的文章。在 LinkedIn 或 Twitter 上与他联系。下面是他的最新文章。
在 7 分钟内你需要知道的关于树遍历的一切(带动画)
towardsdatascience.com](/4-types-of-tree-traversal-algorithms-d56328450846) [## 每个初学者都应该知道数据结构和算法之间的区别
理解计算机科学基础的简单指南
medium.com](https://medium.com/swlh/differences-between-data-structures-and-algorithms-eed2c1872cfc)
5 种数据科学工作
意见
哪个适合你?

目录
- 介绍
- 数据科学建模师
- 机器学习—平台工程
- 机器学习—软件工程
- 数据工程师
- 分析师和见解
- 摘要
- 参考
介绍
虽然与其他角色相比,数据科学角色的正式头衔、数量和百分比有无数来源,但我想更多地关注角色本身的个人经历。数据科学工作描述是一回事,实际的日常角色是另一回事。几年来,在与其他人共事的过程中,我意识到有不同类型的数据科学角色,并且,我将讨论的任何角色有时都可以有相同的职位头衔,即数据科学家。根据公司的不同,你会看到这些更具体的角色被逐字突出显示。哪些角色适合你,哪些你已经从事过?您是否发现了数据科学职位之间的差异,或者您通常将所有职位都视为一个角色的一部分?此外,请记住,这篇文章是一篇观点文章,所以它是我在这个行业工作时收集的各种经验。当然,一些公司要求您了解所有这些职位的所有技能,但是随着您的团队在公司的发展,您可能会发现某些人会专注于他们的优势,以最终解决数据科学的大多数问题,因此成为以下某个角色的专家。
数据科学建模师

照片由 Hitesh Choudhary 在Unsplash【2】拍摄。
这个角色是最传统的数据科学焦点,这意味着这个角色需要业务陈述和问题、利益相关者讨论、数据清理以及最重要的建模。您可以将该角色视为软技能和数据科学建模技能的结合。这个职位通常不需要太多的软件工程(它仍然需要——只是相对于下面的一些其他角色来说不需要那么多。我这句话的意思是,你很可能会在你的 Jupyter 笔记本上创建不同的模型,测试和研究不同的交互——而不是太关注面向对象编程( OOP )。对于一些公司来说,这个角色可能只是在你的本地,而不是在你公司的生产环境中。您可以期待与不同类型的机器学习工程师合作,最终部署并自动化这一模型。
以下是你在这种特定类型的角色中可以期待的一些关键技能:
- 与利益攸关方的会议
- 制定业务问题陈述
- 数据科学将如何解决这个问题?
- 获取数据(自己或从数据工程师那里获取
- -此数据收集可能需要数周时间,从各种来源查找要素
- 清理和准备数据
- 开发和测试不同的算法
- 最终确定最佳算法,然后交付生产
- Jupyter Notebook ( 请记住,许多工作可以在这个不涉及生产的地方进行
机器学习—平台工程

该角色专注于最终选择用于生产的数据科学模型。另一种看待这个角色的方式是部署模型的人。无论是在 Google Cloud Composer 还是 Amazon SageMaker 中,这个人都将是这些工具细节的专家(和其他类似工具)。
关键工具和经验包括:
- 谷歌云作曲家
- 气流
- 码头工人
- 熟练的技艺
- 亚马逊 SageMaker
机器学习—软件工程

照片由 ThisisEngineering RAEng 在Unsplash【4】上拍摄。
这个角色主要负责模型和部署的编码。此人通常首先是软件工程师,然后在数据科学团队工作,通常会确认 GitHub pull 请求的代码、文件和整体结构是否正确或最有效。这个人也与部署这些模型的平台一起工作。该角色将与上述角色重叠。
这里有一些你可以从这个职位中获得的技能和经验:
- Python 编程
- r 编程
- 面向对象的编程风格
- 敏捷方法
- 版本控制
- 节省时间和内存—效率
数据工程师

该角色通常由在执行数据科学模型之前收集的数据组成。您可能需要引用和调用各种来源的 API 来创建或更新数据库表。您还将与主要数据科学家合作,以确定您需要接收哪些要素或列,并为导出做好准备。
以下是与该角色相关的一些要点:
- 结构化查询语言
- 数据库
- API 调用
- 数据仓库
- JSON
- 非结构化数据
分析师和见解

照片由 Myriam Jessier 在Unsplash【6】上拍摄。
这个角色非常类似于数据分析师。你可能会发现自己在研究企业的关键指标。您将通过数据库表中的 SQL 查询来访问这些数据。您还将关注演示以及与利益相关者(或非技术利益相关者)的合作。你也可以期望做一些 AB 测试和显著性测试。您将分析模型的输出,并确定是否有足够的影响来继续当前的模型流程,或者使用新的功能或指标来增强它,同时设置实验。该角色的目标是为公司节省资金和时间,并使业务更具竞争力。
以下是你在这个职位上会遇到的一些重要技能和要点:
- 结构化查询语言
- 呈现
- tableau/谷歌数据工作室/可视化工具
- 韵律学
- AB 测试
- 显著性检定
摘要
如您所见,这一职业领域有几种不同类型的数据科学职位或方面。你可以期望在这些职位上有重叠,但是这篇文章的主要观点是强调你可以朝着某些专业方向努力。这要看公司而更重要的是, 你 。你想和 GCP 一起工作还是主要和 SQL 一起工作?你最喜欢清理数据,还是迭代算法?当你努力争取一个特定的角色或转换角色时,你可能会问自己这些问题。
例如,有一些受欢迎的公司(,你可能听说过),那里的数据科学家职位几乎完全是数据分析师职位,所以你可能会感到惊讶。
仅仅因为一个公司或一个朋友在他们的公司表现出某些技能,并不意味着你也会。
以下是出于总结目的而概述的专业角色:
Data Science ModelerMachine Learning — Platform EngineeringMachine Learning — Software EngineeringData EngineerAnalyst and Insights
我希望你觉得这篇文章既有趣又有帮助。如果你在这些更专业的职位上有任何经验,请随时在下面评论。
同样,这些角色是我遇到和经历过的一些角色,因此这些角色不是一成不变的,您可能会遇到一些不同的东西,但了解和听到数据科学职业领域的不同经历是很有趣的,希望有所帮助。
参考
[2]照片由 Hitesh Choudhary 在 Unsplash 上拍摄,(2018)
[3]照片由克里斯蒂安·威迪格在 Unsplash 上拍摄,(2018)
[4]照片由this engineering RAEng在Unsplash(2020)上拍摄
[5]照片由托比亚斯·菲舍尔在Unsplash(2017)拍摄
[6]照片由 Myriam Jessier 在Unsplash(2020)上拍摄
你需要知道的 5 种机器学习算法
如果您是数据科学的新手,这里是一个很好的起点

马库斯·斯皮斯克在 Unsplash 上的照片
数据科学最著名和最重要的子领域之一是机器学习。术语机器学习最早是在 1959 年由 IBM 研究员 Arthur Samuel 使用的。从那以后,机器学习领域获得了其他领域的极大兴趣,尤其是在分类中的应用。
当你开始学习和掌握数据科学的不同方面时,也许你遇到的第一个子领域是机器学习。机器学习是用来描述一组计算机算法的名称,这些算法可以在运行时通过收集信息来学习和改进。
任何机器学习算法都是建立在一些数据之上的。最初,该算法使用一些“训练数据”来建立解决特定问题的直觉。一旦算法通过了学习阶段,它就可以使用它获得的知识来解决基于不同数据集的类似问题。
通常,我们将机器学习算法分为 4 类:
- 受监督的算法:在操作过程中需要开发者监督的算法。为了做到这一点,开发人员对训练数据进行标记,并为算法设置严格的规则和边界。
- 无监督算法:不涉及开发者直接控制的算法。在这种情况下,算法的预期结果是未知的,需要由算法来定义。
- 半监督算法:结合了监督和非监督算法的算法。比如不是所有的训练数据都会被标注,初始化算法的时候也不是所有的规则都会被提供。
- 强化算法:在这些类型的算法中,使用了一种称为探索/开发的技术。它的形式很简单;机器做出一个动作,观察结果,然后在执行下一个动作时考虑那些结果,以此类推。
这些类别中的每一个都是为一个目的而设计的;例如,监督学习旨在扩大训练数据的范围,并基于此对未来或新数据进行预测。另一方面,无监督算法用于组织和过滤数据以使其有意义。
在每一个类别下,都有各种特定的算法,用于执行特定的任务。本文将涵盖每个数据科学家必须知道的 5 种基本算法,以涵盖机器学习基础知识。
№1:回归
回归算法是监督算法,用于发现不同变量之间可能的关系,以了解自变量对因变量的影响程度。
你可以把回归分析想象成一个方程,比如我有方程y = 2x + z, y 是我的因变量, x,z 是自变量。回归分析发现 x 和 z 对 y 的值有多大影响。
同样的逻辑也适用于更高级更复杂的问题。为了适应各种问题,有许多类型的回归算法;也许前 5 名是:
- 线性回归:最简单的回归技术使用线性方法来描述因变量(预测值)和自变量(预测值)之间的关系。
- 逻辑回归:这种类型的回归用于二元因变量。这种类型的回归被广泛用于分析分类数据。
- 岭回归:当回归模型变得过于复杂时,岭回归会修正模型的系数大小。
- Lasso 回归: Lasso (最小绝对收缩选择算子)回归用于选择和正则化变量。
- 多项式回归:这种算法用于拟合非线性数据。利用它,最好的预测不是一条直线;这是一条试图拟合所有数据点的曲线。
№2:分类
机器学习中的分类是基于预先分类的训练数据集将项目分组到类别中的过程。分类被认为是一种监督学习算法。
这些算法使用训练数据的分类来计算新项目落入定义的类别之一的可能性。分类算法的一个众所周知的例子是将收到的电子邮件过滤成垃圾邮件或非垃圾邮件。
有不同类型的分类算法;前四名是:
- K-最近邻 : KNN 是一种算法,使用训练数据集在一些数据集中寻找 k 个最近的数据点。
- 决策树:你可以把它想象成一个流程图,一次把每个数据点分成两类,然后再分成两类,以此类推。
- 朴素贝叶斯:此算法使用条件概率规则计算项目属于特定类别的概率。
- 支持向量机(SVM): 在该算法中,根据数据的极性程度进行分类,可以超越 X/Y 预测。
№3: 组装
集成算法是由两个或更多其他机器学习算法的预测组合而成的监督算法,以产生更准确的结果。可以通过投票或平均结果来合并结果。在分类和回归平均过程中经常使用投票。
集成算法有 3 种基本类型:打包、提升和堆叠。
- Bagging: 在 Bagging 中,算法在不同的训练集上并行运行,大小都相同。然后使用相同的数据集测试所有算法,并使用投票来确定总体结果。
- 升压:在升压的情况下,算法按顺序运行。然后使用加权投票选择总体结果。
- 堆叠:从名字上看,堆叠有两层堆叠在一起,基础层是算法的组合,顶层是基于基础层结果的元算法。
第 4 类:聚类
聚类算法是一组用于对数据点进行分组的无监督算法。同一个聚类中的点比不同聚类中的点彼此更相似。
有 4 种聚类算法:
- 基于质心的聚类:这种聚类算法根据初始条件和离群值将数据组织成簇。k-means 是最有知识和使用最多的基于质心的聚类算法。
- 基于密度的聚类:在这种聚类类型中,算法将高密度区域连接成聚类,从而创建任意形状的分布。
- 基于分布的聚类:这种聚类算法假设数据由概率分布组成,然后将数据聚类成该分布的各种版本。
- 分层聚类:该算法创建了一个分层数据聚类树,通过在正确的级别切割该树,可以改变聚类的数量。
№5:关联
关联算法是无监督算法,用于发现某些项目在特定数据集中同时出现的概率。它主要用于购物篮分析。
最常用的关联算法是 Apriori。
Apriori 算法是事务数据库中常用的挖掘算法。Apriori 用于挖掘频繁项目集,并从这些项目集中产生一些关联规则。
例如,如果一个人买牛奶和面包,那么他们很可能也会买一些鸡蛋。这些见解建立在不同客户之前的购买基础上。然后,根据算法根据这些项目集合在一起的频率设置的特定置信度阈值,形成关联规则。
最后的想法
机器学习是数据科学中最著名、研究最深入的子领域之一。新的机器学习算法一直在开发中,以达到更好的准确性和更快的执行速度。
不管是哪种算法,通常都可以分为四类:有监督的、无监督的、半监督的和强化的算法。这些类别中的每一个都包含许多用于不同目的的算法。
在这篇文章中,我介绍了每个机器学习初学者都应该熟悉的 5 种监督/非监督算法。这些算法已经被充分研究和广泛使用,你只需要理解如何使用它,而不是如何实现它。
大多数著名的 Python 机器学习模块(如 Scikit Learn)都包含大多数(如果不是全部)这些算法的预定义版本。
所以,
我的建议是,了解技工,掌握用法,开始搭建。
有助于时间序列分析的 5 种绘图类型

以及如何使用 Python 快速创建它们
在开始任何与时间序列相关的项目时(不仅如此),首先要做的一件事就是可视化数据。我们这样做是为了检查我们正在处理的数据,并从中了解一些信息,例如:
- 数据中有什么规律吗?
- 有什么不寻常的观察结果(异常值)吗?
- 观测值序列的性质是否随时间变化(非平稳性)?
- 变量之间有什么关系吗?
这仅仅是开始。我们从回答这些问题中学到的数据特征应该被整合到我们想要遵循的建模方法中。否则,我们可能会有一个糟糕的模型,无法捕捉我们所拥有的数据的特殊特征。正如我们一次又一次学到的那样——垃圾进,垃圾出。
在本文中,我展示了几种在处理时间序列时非常有用的图表,并简要描述了我们如何解释这些结果。
安装
传统上,我们需要加载所有需要的 Python 库。我们在下面的代码片段中做到了这一点。
数据
在本文中,我们将看看著名的航空乘客数据集,你可能已经在其他文章或统计手册/课程中看过几次了。它非常受欢迎,因为其中的可观察模式非常简单。这也是为什么它将很好地服务于其目的,以说明不同类型的图用于时间序列分析。
数据集也包含在我们今天将使用的绘图库中— seaborn。我们通过运行下面几行来加载数据。此外,我们组合年和月列来创建一个report_date字段,它是一个datatime.date对象。

用于时间序列分析的图表示例
准备好数据后,我们将看看用于时间序列分析的不同类型的图。
时间图
时间图基本上是显示时间序列随时间演变的线形图。我们可以将其作为分析的起点,以获得对数据的一些基本了解,例如,趋势/季节性/异常值等。
最简单的方法是直接使用pd.DataFrame的plot方法。

在该图中,我们可以观察到多年来的增长趋势和明显的季节性,表现为假期导致的夏季峰值。
通过指定DataFrame 的索引,可以进一步简化代码,这样就不需要指定 x 轴了。提示:您也可以通过运行下面一行来更改plot方法的默认(matplotlib)后端:
pd.options.plotting.backend = "plotly"
通过这样做,你将生成与上图完全相同的图,然而,它将使用plotly使图具有交互性。当您想要检查特定的观察结果或想要放大某个时间段时,这绝对有帮助。
为了完整起见,您也可以很容易地使用seaborn来生成时间图:
过去,有一个专用的sns.tsplot功能,但是,它被弃用,取而代之的是lineplot。
季节性地块
季节图与时间图非常相似,只是数据是根据各个季节绘制的。选择季节的定义取决于分析师,在我们的特殊情况下,季节只是一个月。我们可以通过运行以下代码来生成季节性绘图。

我们可以看到,我们没有将所有 11 年绘制成一个长系列,而是每月绘制相同的数据。通过这样做,我们可以清楚地看到以下内容:
- 前面提到的夏季高峰的季节性模式,
- 趋势是,随着乘客数量的逐年增加。
此外,季节图对于识别模式变化的年份特别有用。
或者,我们可以使用statsmodels库中的一个方便的函数来创建一个month_plot。

这个剧情上传达的信息和上一个很像,只是分组不同。除了这些年的模式,我们还可以方便地看到每月的平均值。
最后,我们还可以得出一个非常相似的图,但这次是每季度一次。我们只需要先将数据重新采样到季度频率,然后使用quarter_plot功能。

极地季节图
这是季节图的一个变体,不同之处在于它使用极坐标。就我个人而言,我更喜欢传统的季节图,但是,我相信它对一些特定的情况也是有用的。

使用matplotlib + seaborn可以生成完全相同的图,但是,我试图遵循实用主义的方法。如果有可能用一个专门的和完善的库,如plotly(或plotly_express)更快地生成情节,那么我强烈支持这样的解决方案。作为额外的奖励,我们可以免费获得互动!
时间序列分解图
在实际展示剧情之前,我相信简单介绍一下时间序列分解是有意义的。总的来说,它为思考时间序列提供了一个有用的模型,有助于更好地理解数据。分解假设时间序列可以分解为以下部分的组合:
- 级别—系列的平均值,
- 趋势——系列中的上升/下降模式,
- 季节性——系列中重复的短期周期,
- 噪音——随机的、无法解释的变化。
其中所有时间序列都具有水平和噪声分量,而趋势和季节性是可选的。
剩下要补充的是,有两种主要类型的分解模型:
- 可加性—它假设上述成分相加在一起(线性模型)。随着时间的变化或多或少是恒定的。
- 乘法-它假设组件彼此相乘。因此,随时间的变化是非线性的并且不是恒定的,因此它们可以随时间增加/减少。指数增长就是一个例子。
有了这么多介绍,我们可以尝试一种自动分解方法。为此,我们使用statsmodels 库中的seasonal_decompose 函数。对于我们的例子,当查看时间图时,我们可以看到存在月度季节性(12 个周期,但可以自动确定,因为数据帧中有时间戳索引),并且随时间的变化不是恒定的(递增),因此我们将使用乘法模型。

在图中,我们在第一部分看到实际序列,然后是趋势分量、季节分量,最后是残差(误差项)。乘法模型中接近 1 的残差表明拟合良好。请记住,对于加法运算,它们应该接近 0。
和自动方法一样,我们应该做一个简单的健全检查,不要盲目相信结果。对于这个简单的例子,我们可以看到我们最初对时间序列的怀疑得到了证实。
自相关图
当测量时间序列和它的滞后值(来自以前的时间点)之间的相关性时,我们谈论的是自相关。我们可以使用两种类型的自相关图。
自相关函数 (ACF)显示序列与其滞后值之间的相关系数值。在寻找相关性时,ACF 考虑时间序列的所有组成部分(在分解部分提到)。这就是为什么它被称为完全自相关图。
相比之下,偏自相关函数 (PACF)着眼于残差(去除之前滞后解释的影响后的余数)和后续滞后值之间的相关性。这样,在我们找到下一个相关性之前,我们有效地去除了已经发现的变化。实际上,较高的偏相关表明残差中有一些信息可以被下一个滞后模型化。所以我们可以考虑在我们的模型中保留这种滞后。
我们使用下面的代码片段绘制 ACF 和 PACF。

在 ACF 图中,我们可以看到有显著的自相关性(高于 95%置信区间,对应于默认的 5%显著性水平)。在 PACF 图中也有一些重要的自相关。
通常,自相关图通常用于确定时间序列的平稳性或选择 ARIMA 类模型的超参数,但这些是另一篇文章的主题。
结论
在本文中,我展示了在处理时间序列时最有可能派上用场的 5 种类型的图。这个列表并不详尽,通常情况下,图的选择取决于我们正在解决的问题。例如,对于股票价格数据,我们可能希望可视化蜡烛图,而不是常规的时间图。
你可以在我的 GitHub 上找到本文使用的代码。一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。
2020 年初,我出版了一本关于使用 Python 解决金融领域实际任务的书。如果你有兴趣,我贴了一篇文章介绍这本书的内容。你可以在亚马逊或者 Packt 的网站上买到这本书。
参考
- Hyndman,R.J .,& Athanasopoulos,G. (2018) 预测:原则与实践,第二版,OTexts:澳大利亚墨尔本。OTexts.com/fpp2.
有抱负的数据科学家的 5 个典型思维错误
在过去的几年里,我和 500 多名有抱负的数据科学家一起工作过,我看到了他们容易犯的一些典型的思维错误。在这篇文章中,我想分享其中的五个。

路易斯·恩古吉在 Unsplash 上拍摄的照片
由于语法问题而卡住
要做数据科学,你迟早需要学习如何编码(主要是用 Python、、SQL、bash 和/或 R )。对于每个初学编码的人来说,最大的困难是语法。
我知道如果你从来没有编码过,它可能看起来很吓人。
但是你必须明白一件非常重要的事情:
电脑是一种强大的工具。它做自动化和繁重的计算,这是我们人类永远做不到的。但是电脑并不聪明。所以你必须非常细致地告诉它你想做什么。
在编程中,一个输入错误的字符、一个换行符或一个丢失的逗号都会引起问题。你漏了一个空格?你的剧本会崩溃的。事情就是这样!
但是如果你准确地输入了所有的内容,你的脚本就可以工作了。
因此,当你编码时,要特别强调确保避免任何打字错误。如果你跟随一个教程,确保你非常彻底地跟随它。如果你自己写代码,要知道语法!

SQL 查询中缺少 coma 错误!(图片作者)
害怕错误信息
这是数据科学和编码中另一个让初学者害怕的概念:错误消息!
如果你的脚本或者查询失败了,你会得到难看的错误信息返回到你的屏幕上,对吗?乍一看,它们真的没有任何意义。但是不要被他们吓倒!他们是来帮助你的!

(图片作者)
好吧,我承认它们又长又丑,而且你将看到的大部分文字甚至没有用。但是仔细阅读你的错误信息,你会发现它们确实很好地描述了你代码中的问题。
他们肯定会向你展示两件事:
- 问题在哪里。
在 Python 和 SQL 中,都有一个 ^ 字符来显示你写的脚本中的错误所在。(见图片。) - 问题是什么。
而且在大多数情况下你也得到了问题的一行摘要。(如“预期缩进块”、、【列不存在】、等)。)

(图片作者)
如果您知道在哪里以及您在寻找什么,调试将变得容易得多!
只学习令人兴奋的东西
嘿,我知道!
机器学习令人兴奋。深度学习令人兴奋。预测未来是令人兴奋的!
但是事情是这样的:
上面那些“令人兴奋”的事情,只是工作的 5%。或者更少,如果你是大三的话。
我们来玩个游戏吧!
猜猜数据科学家工作最耗时的部分是什么!
...
准备好了吗?
好吧,答案是…
…数据清洗!
在实践数据科学家中有一个笑话说:“80%的数据科学是数据清洗。20%的人抱怨数据清理。”
是的,这是一个笑话,但它给你的想法。
在真实的工作中,你不会全天候做机器学习和预测分析。因为为了能够运行适当的 ML 算法,您必须首先完成许多其他步骤:
- 数据收集
- 格式化您的数据
- 清理您的数据
- 数据探索
- 进行各种描述性分析
- 数据可视化
- 设置自动化
- 诸如此类…
学习数据科学应该是关于这些,主要是!而且你绝对不能只专注于机器学习,仅仅因为它很刺激。
现实一点,多了解一下上述的东西(尤其是如何用 Python 和 SQL 搞定)……现在专注于基础,以后可以玩 AI!当你得到第一个初级职位时,你会感谢自己的。
注:反正别信我那一套。这里还有 Vicki Boykis(另一位执业数据科学家)的一篇 优秀文章 !
谷歌搜索不够多(谷歌搜索太多)
我看到了有抱负的数据科学家的两个极端:
一个面对第一个问题就僵住的人。另一个在谷歌上搜索每个细节。
一个伟大的数据科学家可以自己解决问题。事实上,那是她最重要的技能之一!
但这并不意味着每次遇到问题都要重新发明轮子。在你大三的时候,很有可能其他人已经有了和你一样的问题。幸运的是,在数据科学中,几乎所有的东西都在互联网上有记录。因此,作为一名数据科学家,你必须具备的主动、积极的态度可以简单地表现为谷歌搜索你的问题。
99.9%的时候,你会找到解决办法!
如果没有,你仍然可以问其他人……有一些很棒的论坛,但是让我在这里只提到最受欢迎的一个: StackOverflow 。这是一个很棒的地方,有很多好人。您可以随时将您的数据科学(以及其他与编码相关的)问题放在那里——他们将在几小时内得到解答,如果不是在几分钟内的话!

Stackoverflow 问题在约 7 分钟内回答(图片由作者提供)
另一方面,你不能只依靠谷歌搜索。
我看到人们自豪地说:“我是一名数据科学家,我不学 Python 语法。我只是用谷歌搜索所有的东西……"这太愚蠢了。如果你想高效地完成你的工作,你必须学习基础知识。你不能谷歌一切,因为:
a)这会拖慢你的速度
b)你不会知道你能通过编码做什么。
所以试着在完全不搜索和搜索一切之间找到中庸之道吧!
过早放弃
我把最重要的留到了最后。
许多有抱负的数据科学家只是在他们的旅程中过早放弃了。
我知道:数据科学很难。如果很容易,每个人都会成为数据科学家——那么它就不再是 21 世纪最性感的工作了,对吗?;-)
反正数据科学很难!
每一部分都很辛苦。编码很难。统计很难。甚至连思考数据将如何支持您的业务都很困难。
无论你在网上读到什么:学习数据科学没有快速简单的方法。没有捷径可走。但是有坚持,有奉献,有努力工作的意愿。
是的,当然,许多开始学习数据科学的人会放弃。
但是这让你处于一个独特的位置!如果你是一个不放弃的人,如果你坚持下去,如果你接受你必须以艰难的方式学习数据科学-与大多数人不同,你实际上可以成为一名数据科学家!
结论
这是我认为有抱负的数据科学家容易犯的五个典型错误。我希望你能利用这里写的东西。总结我所说的一切,如果你才刚刚开始这段美丽的旅程,我想给你五个建议:
- 当你写代码的时候,一定要注意语法,并且要非常精确!
- 不要害怕错误信息!使用它们!
- 关注你需要的东西(Python、SQL、数据清理、数据可视化、自动化),而不是令人兴奋的东西(人工智能、机器学习等)。)
- 谷歌是你的朋友;但是要对自己的基础知识有信心。
- 不要太早放弃!把辛苦放进去!从长远来看,这是值得的。
Data36.comT3数据科学家孙铁麟·梅斯特
5 个以上独特的 Python 模块,用于创建脱颖而出的机器学习和数据科学项目
超过 5 个酷 Python 库模块的指南,用于创建出色的机器学习和数据科学项目

P ython 提供了广泛的库模块和框架,使其成为构建机器学习模型和从事数据科学项目最兼容的语言之一。
除了所使用的标准库之外,本文旨在为您的机器学习和数据科学项目提供一些很酷的模块。
最常用的 python 模块包括用于数值运算的 numpy、用于处理稀疏矩阵等科学运算的 scipy、用于以有组织的方式查看数据集的 pandas、用于可视化所构建模型的数据、分析和图表的 matplotlib 和 seaborn。
您还可以利用 python 中的 scikit-learn 模块,通过 sklearn 库中可用的各种算法选项来开发机器学习模型。此外,您可以利用 TensorFlow 和 Pytorch 等框架来构建深度学习模型。
您可以查看下面的文章,以获得对矩阵稀疏性和 scipy 模块的更好的直觉和理解。
[## 迷失在密林中:用简单的代码对机器学习中稀疏性的直觉!
为什么 ML 需要稀疏性?理解稀疏性的核心概念。
towardsdatascience.com](/lost-in-a-dense-forest-intuition-on-sparsity-in-machine-learning-with-simple-code-2b44ea7b07b0)
然而,今天在本文中,我们将讨论您可以在数据科学项目中充分利用的五个模块。你可能知道其中的一些甚至全部,但利用这些模块将使你的机器学习项目独特而突出,或者它们可以帮助你更好地理解手头的问题或任务。
让我们更详细地讨论、查看和理解这些库模块。

蒙朱尔·哈桑在 Unsplash 上拍摄的照片
1.交响乐
数学是机器学习的一个重要方面。虽然有些人可能绝对崇拜数学,但有些人可能不喜欢它。然而,掌握数学知识并理解概率、统计和微积分的概念是至关重要的。
积分学和微分学也被认为是理解像反向传播这样的机器学习概念的先决条件。幸运的是,python 还提供了一个免费的、轻量级的、基于 python 的库,名为 sympy 。这是一个符号数学的 python 库。您可以使用以下命令安装该库。
pip install sympy
在安装了这个库之后,您可以继续用几行代码执行数学演算操作,比如积分和微分。
你可以在这里查阅来自的官方文档,了解如何使用这个模块的更多细节。但是,如果你感到困惑,想让我对这个模块的教程文章做一个快速的指导,那么请随时告诉我。
2.美丽的声音和斗志
任何数据科学或机器学习项目的一个非常重要的方面是数据收集过程。数据挖掘这个术语也可以用来从互联网上收集有用的数据。您可以从网上下载预先可用的数据集,或者利用上面提到的两个模块来抓取 web 数据以提取必要的信息。
BeautifulSoup 是一个非常棒的 python 库,设计用于快速周转项目和处理互联网上的可用数据。这是一个有用的网页抓取和数据抓取库。BeautifulSoup 和 Scrapy 都是在线提取网络数据的绝佳选择。
根据 BeautifulSoup 的官方文档,这三个特性使其功能强大:
- Beautiful Soup 为导航、搜索和修改解析树提供了一些简单的方法和 Pythonic 式的习惯用法:一个用于解析文档和提取所需内容的工具包。编写应用程序不需要太多代码。
- Beautiful Soup 自动将传入文档转换为 Unicode,将传出文档转换为 UTF-8。你不必考虑编码,除非文档没有指定编码,而 Beautiful Soup 检测不到编码。然后,您只需指定原始编码。
- Beautiful Soup 位于 lxml 和 html5lib 等流行的 Python 解析器之上,允许您尝试不同的解析策略或以速度换取灵活性。
Scrapy 是另一个用于大规模 web 抓取的 Python 框架。它为您提供了高效地从网站中提取数据、按照您的意愿处理数据以及以您喜欢的结构和格式存储数据所需的所有工具。Scrapy 库可以通过使用下面提到的命令来快速建立,并且您可以使用它来提取数据的各种目的。
pip install Scrapy
既然您已经成功地收集了数据并完成了项目所需的数据挖掘,那么您现在可能想要清理剩余的字符串数据。这个过程只需要四个基本的正则表达式操作就可以完成。数据清理是下一个重要步骤。所以,如果你想了解更多关于这个过程的知识,可以看看下面的文章。
[## 4 个基本正则表达式操作符使自然语言处理变得更简单!
了解四种基本的常规操作,以清理几乎任何类型的可用数据。
towardsdatascience.com](/natural-language-processing-made-simpler-with-4-basic-regular-expression-operators-5002342cbac1)
3.熊猫简介

作者截图
一旦您准备好了所有的数据和数据集,就该可视化和查看您收集的数据了。探索性数据分析是任何机器学习和数据科学项目的一个重要方面。
探索性数据分析在数据科学和机器学习项目领域的作用是能够详细了解手头的数据。探索性数据分析提供了许多图表和种类来可视化和分析可用的数据。它提供了对如何进一步发展的简要理解和想法。
然而,开发每个单独的情节并开始处理步骤有时会是一个忙乱的过程。某些问题甚至可能需要几个小时。幸运的是,python 也提供了这个问题的解决方案。
Pandas profiling 是一个开源的 Python 模块,使用它我们只需几行代码就可以快速地进行探索性的数据分析。此外,如果这还不足以说服我们使用这个工具,它还可以生成 web 格式的交互式报告,可以呈现给任何人,即使他们不知道如何编程。安装过程可以通过简单的 pip 命令完成,如下所示:
pip install pandas-profiling
安装了这个库之后,您可以利用它在几分钟内为您的机器学习和数据科学项目执行探索性数据分析。既省时又大有裨益。但是,您不能在每个数据集上使用它,而且在较大的数据集上生成报告需要更长的时间。

我的第一个项目的作者过时的 GIF
4.Pygame 和 Tkinter
Pygame 和 Tkinter 模块是一些最好的模块,用于使您的机器学习和数据科学项目脱颖而出,并给它们一个整体上更具视觉吸引力的外观。
想象一下,你必须开发一个强化学习游戏或基于人工智能的深度学习算法,以提高游戏中模型的性能。如果您考虑上面 GIF 中的蛇的例子,或者类似于 flappy birds 游戏的东西,其中有几代鸟在一个过程中学习和进化,用 python 开发这些图形用户界面的最佳方式是使用 Pygame 模块。
在你的机器学习项目中使用 pygame 这样的模块还有很多应用。然而,另一种选择是通过使用类似 Tkinter 的 GUI 开发库来开发更有趣、更具交互性、更令人惊叹的图形用户界面。还有其他选择来开发独特的和令人敬畏的 GUI 界面。我对 Tkinter 更有经验,这也是我对大多数新手程序员的建议。
我强烈推荐读者阅读下面的文章,这篇文章用实际的项目实现思想解释了更多关于 Tkinter 和 Pygame 等模块的应用。我还介绍了一个理解 Pygame 基础知识的小指南以及 Tkinter 模块的简介。
[## 带有完整代码片段和有用链接的 5 个最佳 Python 项目创意!
为 Python 和机器学习创建一份令人敬畏的简历的 5 个最佳项目想法的代码片段和示例!
towardsdatascience.com](/5-best-python-project-ideas-with-full-code-snippets-and-useful-links-d9dc2846a0c5) 

作者提供的图片— 1。GTTS 语音合成| 2。OCR 流程
5.GTTS 和 OCR
谷歌文本到语音和光学字符识别是两个非常酷的模块,你可以利用它们来构建更独特的机器学习和数据科学项目。我做的人脸识别和情感&手势检测项目是利用这些模块和构建的模型的两个最佳方式。
文本到语音(TTS)是将单词转换成有声音频形式的过程。程序、工具或软件从用户处获取输入文本,并使用自然语言处理方法理解所使用语言的语言学,并对文本执行逻辑推理。该处理后的文本被传递到下一个块,在该块中对处理后的文本执行数字信号处理。使用许多算法和变换,这个处理过的文本最终被转换成语音格式。这整个过程包括语音合成。下面是一个简单的框图,以了解相同的。
光学字符识别是通过使用电子或机械设备将二维文本数据转换成机器编码的文本形式。你使用计算机视觉来阅读图像或文本文件。读取图像后,使用 python 的 pytesseract 模块读取图像或 PDF 中的文本数据,然后将它们转换为可以在 python 中显示的数据字符串。
这里有两个链接可以帮助你开始使用谷歌文本到语音和光学字符识别。查看下面提供的参考资料以了解 Google 文本到语音转换和光学字符识别模块,从而了解更多概念并以更详细的方式了解它们。
[## 如何使用 Python 开始使用 Google 文本到语音转换
从零开始的文本到语音转换简介
towardsdatascience.com](/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544) [## 使用 Python 开始光学字符识别
对光学字符识别从无到有的直观理解和简要介绍
towardsdatascience.com](/getting-started-with-optical-character-recognition-using-python-e4a9851ddfab) 
结论:
根据我的经验,这些库有助于让你的项目脱颖而出。在创建独特的、更具互动性和吸引力的机器学习、深度学习或数据科学项目时,可以考虑本文中建议的模块。
您不必为您的每个项目都使用本文中提到的模块。但值得考虑的是,它们是否对解决手头的问题有用,或者是否适合各自的任务。
强烈建议使用这些库模块来简化任务,使任务更加方便,同时提高项目的质量和整体吸引力。
如果你对建议的模块有任何疑问,请在下面的评论中告诉我。我会尽快回复你。
看看我的其他一些文章,你可能会喜欢读!
详细了解 python 中的匿名函数和高级函数及其实际应用…
towardsdatascience.com](/understanding-advanced-functions-in-python-with-codes-and-examples-2e68bbb04094) [## 深度学习真的需要 GPU 吗?
获得一个 GPU 是深度学习的必备条件吗?了解 GPU 及其优势,并探索…
towardsdatascience.com](/do-you-really-need-a-gpu-for-deep-learning-d37c05023226) [## 机器学习和数据科学项目的 10 步终极指南!
详细讨论构建您的机器学习和数据科学项目的最佳方法…
towardsdatascience.com](/10-step-ultimate-guide-for-machine-learning-and-data-science-projects-ed61ae9aa301)
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
使用 Python 中的 Pandas 进行探索性数据分析的 5 个有用技巧

测量缺失数据、要素选择、展平数据框和聚合的提示
当我们开始一项新的数据分析、数据挖掘、数据科学或机器学习工作时,通常会从 EDA(探索性数据分析)开始分析数据。这通常是因为
- 我们还不知道数据集(它看起来怎么样)
- 需要衡量数据质量
- 需要知道我们应该如何清理数据
- 需要一些关于数据的见解。有时,我们可能没有明确的目标来处理数据集。
如果你是 Python 用户,我打赌你会用熊猫来完成大部分工作。在本文中,我将分享一些有用的代码片段,这些代码片段是我在 EDA 阶段留给自己使用的。通过保存这些有用的代码片段,我节省了大量时间,因为我将通过这些“模板”运行我获得的每个新数据集,以便找到一些关于数据的有用见解。所以,我不需要每次都去想该怎么做。
1.计算数据缺失百分比

照片由 Alexas_Fotos 在 Pixabay 上拍摄
关于数据集,我们需要知道的最重要的事情之一是是否有一些缺失的数据。如果有,他们错过了多少。请看下面的函数。
该函数将常规数据框作为参数,并将返回包含两列的数据框:
- 列名(原始数据框)
- 缺失百分比
想法是这样的
df.isnull()将生成一个与原始数据框形状相同的数据框,但所有像元的值将为布尔类型,其中 True 表示像元值缺失。df.sum()将垂直求和数据帧,其中“真”将被视为 1,“假”将被视为 0。因此,我们将有一个 Pandas 系列,其中列名作为索引,缺失值的数量作为值。- 将缺失值除以数据帧的行数
df.shape[0]将得出缺失百分比。 - 为了更好地展示,将系列转换回熊猫数据框。
- 将结果四舍五入到两位小数。
- 重命名缺失百分比数据框的列。
- 分类并输出

上面的例子使用了著名的泰坦尼克号数据集,它可以来自这里:
从这里开始!预测泰坦尼克号上的生存并熟悉 ML 基础知识
www.kaggle.com](https://www.kaggle.com/c/titanic/data?select=train.csv)
2.获取每组中具有最大值的行

有时,我们可能希望获得数据框的每组中具有最大值的行。这里有一个函数可以帮忙。
它有 4 个参数,分别是数据框、需要分组的列名、值的列名以及是否有“tie for the first”。
让我们按如下方式查看数据框:
df = pd.DataFrame({'Category':['a','a','b','b','b','c'], 'Value':[3,2,5,8,8,6]})

可以看到,我们这里有 3 组“a”、“b”和“c”。对于组“b ”,有两行具有相同的值“8”并且都是最大值。在这种情况下,如果tie_for_first是False,只有值为“8”的第一行将被保留,而如果是True,这两行都将被保留,因为有一个“平局”。
步骤如下:
- 决定我们应该使用哪种排名方法。即“min”或“first”。请参考下面的官方文档,了解更多关于
rank()方法的信息。 - 使用给定的列对数据框进行分组,并根据值列对组进行排名。
- 仅用
rank == 1过滤数据帧。 - 删除临时使用的“rank”列,然后返回数据帧。
[## 熊猫。DataFrame.rank — pandas 1.1.2 文档
编辑描述
pandas.pydata.org](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rank.html)
以下是对前一个数据框运行的示例。

3.基于数据类型选择数据框列

当我们的数据框中有许多列时,选择列(要素)就成了一项棘手的任务。根据我的经验,这经常发生在我身上。例如,有一次我在为一个有数百台发电机的电网数据集做 EDA。我想做的是选择这些生成器数据并旋转表格。然而,也有许多其他列。在这种情况下,select_dtypes()功能帮助很大。
让我们再次使用第一节中已经使用过的 Titanic 数据集。我们可以使用df.info()来获得数据集的图片。注意Dtype栏。
df = pd.read_csv('train.csv')
df.info()

如截图所示,有 2 个浮点数列,5 个整数列和 5 个字符串列。当然,对于这样的数据集,我们不必使用select_detypes(),因为它们并不太多,但是仅仅作为一个例子使用也是很好的。
比方说,我们想要所有的字符串列(对象类型):
df.select_dtypes(include=['object'])

请注意,我们正在使用select_dtypes()函数的include参数。在某些情况下,我们可能希望使用exclude参数来删除某些类型的列,而保留所有其他类型的列。
df.select_dtypes(exclude=['object'])

在上面的例子中,我们选择了所有非字符串类型的列。
事实上,您可能已经注意到,include和exclude参数都采用了列表参数。是的,我们可以包含或排除多种类型的列。
df.select_dtypes(include=['int', 'float'])

在上面的例子中,我们已经选择了整数和浮点数类型的列,这对于只选择数据集的数字特征是非常方便的。
然而,事实上,有一种更简单的方法。
df.select_dtypes(include=['number'])

是的,这两种类型都是数字,所以我们可以说我们想要“数字”。如果您对支持的其他类型感兴趣,请查看官方文档。
[## 熊猫。data frame . select _ dtypes—pandas 1 . 1 . 2 文档
编辑描述
pandas.pydata.org](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.select_dtypes.html)
4.水平分解数据框中的数组

有时,我们拥有的数据集可能并不平坦。换句话说,可能有一些列具有列表/数组类型。通常,使用explode()函数很容易分解数据框中的列表或数组列。但是,有时我们不想将它们分解成多行。相反,我们希望将它们扩展到更多的列中。
让我们看看下面的例子。
df = pd.DataFrame({'cate':['a','b','c'],'values':[[10,20], [20,30], [30,40]]})

如果我们想要扩展“values”列的每个数组中的两个值,我们可以简单地如下操作。
df['values'].apply(pd.Series)

当然,大多数时候我们可能希望将其合并回原始数据框。这是给你的全部功能。
该函数有 3 个参数:数据框、要展开的列的名称以及展开的新列的列名列表(可选)。
这些步骤是:
- 使用目标列分割数据框,并通过 Pandas 系列扩展列表/数组。
- 将扩展列的新数据框与原始数据框连接起来。
- 删除已展开的原始列。
- 如果传入了新列名的列表,请重命名这些列。
如果我们对上面显示的样本数据框应用该函数,结果如下。

5.跨列聚合

聚合熊猫数据帧以获得某项数据的总和或平均值是很常见的。但是,有时我们可能希望跨列进行聚合。让我通过制作如下示例数据框来演示这个问题。
np.random.seed(0)
assessment = pd.DataFrame(
np.random.normal(loc=70, scale=10, size=5*4).reshape(5, -1),
columns=['Term 1 Math', 'Term 2 Math', 'Term 1 English', 'Term 2 English'],
index=['Alice', 'Bob', 'Chris', 'David', 'Emily']
).astype(int)

在这个数据框架中,我们有两个学期的学生考试成绩。假设我们想要平均每个学生每门学科的成绩。换句话说,我们想分别得到数学科目和英语科目的平均分。
我知道,用第一列加第二列再除以 2,然后对第三列和第四列做同样的事情,并不是太难。最后,重命名这些列。肯定有更简洁的方法可以做到这一点。参见下面的代码。
mapping = {
'Term 1 Math':'Math',
'Term 2 Math':'Math',
'Term 1 English':'English',
'Term 2 English':'English'
}
agg_results = assessment.groupby(mapping, axis=1)
agg_results.mean()
你知道groupby()方法也需要字典吗?字典将帮助函数将列分组到不同的类别中。然后,我们可以合计每个类别(数学和英语)的值。

摘要

由 Shutterbug75 在 Pixabay 上拍摄的照片
在这篇文章中,我分享了一些我在 EDA 活动中经常使用的技巧。我想说你可能不需要使用它们来实现大部分的功能或实现。然而,如果你以前从未这样使用过熊猫,我建议你理解它们。有时,它们可以在我们的数据分析工作中节省大量时间。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
将改进您的编程的 5 个 Visual Studio 代码提示!
让 VSCode 变得更好!

让我们把 VSCode 做得更好!来源:Nik Piepenbreier via Canva.com
当我一头扎进编程的世界时,Visual Studio 代码(VSCode)成了我最喜欢的完成工作的工具之一。从那以后,我学会了几种真正改善自己编程体验的方法。本文主要关注 Python,但也可能适用于其他语言。
Python 文档字符串生成器
第一个要覆盖的扩展是 Python Docstring 生成器!由 Nils Werner 开发的这个扩展使得生成文档字符串变得更加容易。一旦创建了一个类或函数,只需输入"""就会生成一个模板。该扩展会自动提取任何参数,并允许您在想要填充的所有字段中切换。
让我们看看这个是什么样子的:

自动添加格式化的文档字符串!资料来源:Nik Piepenbreier
更好的评论
接下来,我们将覆盖更好的评论,它允许你给你的评论添加标签,使它们更容易被识别。该扩展预装了五种默认的注释样式,涵盖了重要信息、问题、待办事项等等。您可以修改现有的,改变他们的颜色,或创建自己的!
在我的数据科学之旅中,它帮助我创建了不断增长的脚本。

为你的评论提供视觉提示!资料来源:Nik Piepenbreier
学习有用的键盘快捷键
提高我工作效率的真正动力是花一些时间记住一些重要的键盘快捷键!我会在这里列出一些我最喜欢的:
- CTRL/Command + Enter :直接在下方插入新的一行,不考虑当前行的位置
- ALT/Option +Shift + Up/Down :上下复制当前行
- ALT/Option + Up/Down :上下移动当前行
- ALT/Option + Shift + Right :点击两次选择当前括号内的所有内容(如果需要重新映射,该选项称为 smartSelect.grow
- CTRL/Command + / :注释掉当前行
- CTRL/Command+【or】:向内或向外缩进行
使用多光标减少编辑的痛苦
多光标可以让你在编辑文本时变得更强大。有几个用例可能会发生这种情况,VSCode 为这些情况提供了惊人的内置快捷方式:
- CTRL/Command+ALT/Option+Up/Down:在上方或下方插入另一个光标
- CTRL/Command + D :在下一次出现时插入另一个光标
- CTRL/Command + Shift + L :为所有事件添加多光标
- CTRL/Command + U :如果添加过多,撤消上一次光标操作
括号对着色程序 2
最后,最后一个扩展:括号对上色器 2 。这个扩展为您的括号添加了颜色,以便更好地识别匹配对。虽然 VSCode 很好地突出了您当前所在的 brack,但是这个扩展为您提供了文件中括号的完整概述。

给你的支架上色,让它们更容易被发现!资料来源:Nik Piepenbreier
感谢阅读!
非常感谢你阅读这篇文章!我希望您觉得它很有用,至少列表中的一些内容让您的编程体验更加顺畅。
如果你有其他建议让我尝试,请在评论中告诉我!
提升数据故事的 5 个可视化
用 Plotly 超越直方图和箱线图。

对我们数据科学家来说,讲故事是一项基本技能。为了传达我们的想法并具有说服力,我们需要有效的沟通。审美视觉化是一个很好的工具。在本帖中,我们将介绍 5 种经典之外的可视化技术,它们可以让你的数据故事更加美观和有效。我们将使用 python 中的 Plotly 图形库(在 R 中也可用),它以最小的努力提供了动画和交互式的图形。
Plotly 有什么好的
Plotly 图表是高度可集成的:它们可以与 jupyter 笔记本一起工作,它们可以嵌入到网站中,并与 Dash 完全集成——这是一个用于构建仪表板和分析应用程序的伟大工具。
入门指南
如果您没有安装 plotly,只需在终端中运行以下命令:
pip install plotly
现在你可以走了,让我们开始吧!
1.动画片
我们的工作经常涉及时态数据,在这些数据中我们研究这个或那个度量的演变。Plotly 动画是一个很好的工具,只需一行代码就可以观察数据如何随时间变化。

几乎任何情节都可以被动画化,只要你有一个时间变量来过滤。制作散点图动画的示例:
2.旭日图
旭日图是通过 语句来形象化你的 组的好方法。如果你想通过一个或多个分类变量来分解一个给定的数量,就去做一个旭日图。
比方说,我们想分解一天中每个性别和时间的平均小费金额。这是一个双 group by 语句,可以通过可视化而不是表格输出来有效地传递:

该图是交互式的,使您能够单击并探索每个类别本身。你所需要做的就是定义你的所有类别,声明它们之间的层次结构(参见代码中的父类参数)并分配相应的值,在我们的例子中,这将是我们的 组通过 语句的输出。
现在,让我们向我们的层次结构添加另一层:

为此,我们通过涉及三个分类变量的 语句添加另一个 组的值。
3.平行类别
探索分类变量之间关系的另一个好方法是这个流程图。您可以随时拖放、突出显示和浏览值,这非常适合演示。

4.平行坐标
平行坐标图是上述图的连续版本。这里,每个和弦代表一个单独的观察。这是发现异常值(从其余数据中分离出来的单个线程)、聚类、趋势和冗余变量(例如,如果两个变量对于每个观察值具有相似的值,它们将位于一条水平线上并表示冗余)的一个很好的工具。

5.仪表图和指示器

仪表图只是为了美观。它们是报告一些成功指标或 KPI 并将它们与您的目标联系起来的好方法。

指标在商业和咨询领域非常有用。他们用文字标记来补充你的视觉效果,抓住你的观众的注意力,并传达你的成长指标。
差不多就是这样!
希望这对你有用。呆在家里,保持安全,保持高效。

凯利·西克玛在 Unsplash 上的照片
——继续探索
2020 年(及以后)机器学习从业者创收的 5 种方式

米歇尔·汉德森在 Unsplash 上的照片
经验和建议
了解如何利用机器学习技能增加收入或创造新的收入来源
由于越来越多的专业人士被那些无法应对疫情冠状病毒带来的困难的公司解雇,新一代成为一个比以往任何时候都更加相关的话题。
即使没有疫情,“创收”曾经是(并且仍然是)学生、专业人士、企业家……基本上每个人的热门话题。

我在本文中特别关注的是经过验证的方法,作为一名机器学习从业者,您可以使用这些方法来产生主收入流或副收入流。
别担心,我不会用励志名言来烦你,也不会向你兜售六位数收入的梦想。
个人帐户和经验被证明更有影响力和相关性,所以在这篇文章中,你会发现我用目前为我提供收入流的方法来分享我的个人经验。
以下是我将要介绍的获取收入的方法:职业、媒介、咨询、电子邮件列表、YouTube 等。
1.中等📑

照片由 Grzegorz Walczak 在 Unsplash 上拍摄
先说一个显而易见的创收方法。
我在 Medium 上写的第一篇文章是在 2017 年。当时,我忘记了一个事实,即你可以通过媒体获得某种形式的收入。
快进到 2020 年。
现在,在媒体上写作为我提供了少量收入,以补充我职业生涯的收入。
你可能知道也可能不知道,我写的文章都是人工智能和机器学习相关的。我的一些文章是建议性的,比如这篇文章,但是大部分我写技术文章,这里有一个例子。
我在媒体上写作的最初原因是:
- 创造一种投资组合
- 通过教学强化我的学习
现在,我在媒体上写作的理由已经扩展到包括:
- 创建个人品牌
- 对个人进行机器学习和计算机视觉主题的教育
- 建筑侧收入
我们来谈谈数字。💲 💲 💲
我提到在媒介上写作不会在第一个月甚至第一年创造大量的收入,这可能很重要。
为了让你更清楚地了解情况,6 月份只有 5.7%的作家收入超过 100 美元。

六月中等收入作家工资
一些作家从 Medium 中赚取足够的收入,使其成为一份全职工作,你可以成为这些作家中的一员,或者至少成为收入超过 100 美元的一小部分人的一部分。
就我个人而言,到目前为止,2020 年我已经从我的媒体文章中赚了 3374.19 美元。在过去的七个月里,我每周至少写 2-3 篇文章。
我在 Medium 上投入的时间和精力可能会让你在其他职业或创收方式上多赚 3 倍。
在媒体上写作可以说是一项长期投资。更重要的是,你必须把金钱利益和其他激励结合起来,否则你可能很早就放弃了。
行动🔥🔥🔥
- 注册中等合作伙伴计划
- 就你在中了解的人工智能或人工智能相关主题撰写高质量的文章
- 向顶级媒体刊物投稿
- 重复步骤 2 和 3
2.职业💼

作为一名机器学习从业者,获得收入流的最佳且被证实的方法之一是找一份需要你特定技能的工作。
以下是机器学习从业者通常承担的常见工作角色列表:
- 数据科学家
- 机器学习工程师
- 自然语言处理工程师
- 计算机视觉工程师(→我)
- 机器学习研究员
我们来谈谈数字。💲 💲 💲
我的工作地点在英国,从 2020 年 4 月 3 日算起的 6 个月内,一名机器学习研究员 的平均 工资为57500 英镑。****
同期机器学习工程师 的平均 工资为68750。****
在美国, ML 工程师 的平均工资约为12.5 万美元。
根据 payscale 的调查结果,在印度,普通的 ML 工程师的工资是普通的₹691,892 人的工资。我最近还看到一篇足智多谋的媒体文章,其中包含了印度数据科学就业市场的统计信息。
行动🔥🔥🔥
对机器学习从业者的需求逐年增加,即使是最近的疫情公司仍然渴望雇佣熟练的数据科学家和机器学习工程师。
为了最大限度地利用 2020 年的这个机会,并在机器学习领域获得一份工作,我建议将你目前的技能与招聘信息中要求的技能相匹配。
去求职网站看看你最适合的职位。如果你缺乏一些技能,找出这些技能并制定一个策略来获得所需技能范围内的经验。
一些雇主不介意你缺乏一些想要的技能,只要你表现出渴望学习,并且拥有他们需要的核心技能和专业知识。
3.咨询公司👥

一些机器学习从业者拥有备受追捧的专业知识和技能。有一些个人、公司和组织正在寻求机器学习顾问或承包商,他们可以在以下活动中提供帮助:
- 定义公司的人工智能战略
- 在公司产品中实施人工智能战略
- 打造 AI/ML 团队
- 提供关于人工智能发展的建议
- …还有更多
承包商和顾问是作为独立的运营实体的个人,独立于他们目前受雇的公司。
顾问/承包商通常有自己的有限公司,并根据小时费率或日费率获得报酬。
咨询公司的主要告诫是工作的期限是固定的。一些机器学习工程师被雇来在一个组织内推动一项人工智能计划,为期六个月至一年。他们中的很多人都获得了丰厚的报酬。
其他咨询或基于合同的角色可能持续数天、周末甚至数小时。
就我个人而言,我在一些场合担任过顾问:
- 为独特问题提供深度学习和计算机视觉技术的指导
- 一本“尚未发行”的计算机视觉书籍的技术作者。
我们来谈谈数字。💲 💲 💲
我从咨询工作中获得的收入并不是一笔能改变生活的钱。然而,成为专家机器学习顾问或承包商的财务优势和潜力仍然很有吸引力。
ITJobsWatch 的数据显示,一个合同机器学习工程师的日工资中位数是 525,前 90%的人每天挣 700+。
对于一般的机器学习顾问/承包商来说,这相当于每年大约 126,000 英镑。
这是一笔相当可观的年收入。
行动🔥🔥🔥
成为一名顾问或承包商绝非易事。
你必须在你各自的领域里成为最优秀的,也许你必须比一般人有更好的人脉。
大多数机器学习顾问和承包商的技能和专业知识都在他们职业的前 5%之内。客户希望承包商和顾问通常至少有 8-10 年的经验。
就像我说的,不容易。
但是成为顾问/承包商的步骤相当简单。
你要采取的行动很简单:
- 成为顶级机器学习实践者
- 有多年相关专业经验
获得咨询客户的一种方法是利用你的网络,获得咨询/签约客户的另一种方法是注册平台,如 Fiverr 和 Upwork 。这些是自由职业者为公司或个人提供服务的市场。
到目前为止,我向你展示的作为机器学习实践者的创收方法是我自己尝试过的方法,目前正在利用这些方法谋生。
下面列出的方法被其他成功的收入者所采用。
我目前正在制定一个通过以下方法创收的策略。
4.建立电子邮件列表📪

我知道电子邮件列表已经有一段时间了,我订阅了一些个人电子邮件列表。
把你的电子邮件放在一个电子邮件列表中意味着你提供了一个你和你订阅的任何人之间频繁交流的通道。
订阅内容往往是经常发出的时事通讯。你可以每天或每月收到一份时事通讯。
虽然我知道电子邮件列表已经有一段时间了,但我并不总是意识到它们的货币化潜力。
在花了一些时间研究将电子邮件列表货币化的方法后,我总结了一些关键发现,并将其归纳如下:
- 销售产品:你可以向你的受众销售机器学习课程或技术设备。
- 附属链接:很多机器学习从业者在亚马逊等平台上购买书籍。亚马逊有一个很好的会员计划,很容易建立。实际上,你可以从推荐的图书销售中获得一部分。
- 出售广告空间:如果你建立了一个拥有 6000+个人的电子邮件列表,那么你就有可能拥有一个有价值的社交网络。你可以在你的简讯中利用广告空间赚钱。
- 对优质内容收费:以合理的价格提供独家内容一直是一种创收的方法。通过建立一个电子邮件列表,你有一个直接的受众来推广优质内容。优质内容有多种形式和大小;它可以是独家信息或深入的课程。
我们来谈谈数字。💲 💲 💲
我还没有将我的电子邮件列表货币化,所以我不能给你提供收入潜力的第一个账户细节。
电子邮件列表的成功取决于几个主观因素。
尽管如此,在互联网上还是有一些成功的故事,有些人每月收入达到四位数,有些甚至达到六位数。一些潜力和优势,创造一个高收入的电子邮件名单是基于利基和行业的目标。
我想在这里提供一些官方统计数据,但不幸的是,通过电子邮件列表获得收入的世界充满了个人销售营销和销售课程,并提供不一定可以核实的收入数字。
行动🔥🔥🔥
从邮件列表和时事通讯中获得收入的第一步是拥有人们愿意订阅的内容。
例如,在我的简讯中,我向订户提供了以下内容:
- 链接到我的媒体文章,其中包括文章朋友链接,这样非媒体成员可以在媒体付费墙后访问我的文章
- 提供人工智能和机器学习行业当前相关信息的其他文章的链接
- 我认为值得分享的有趣 AI/ML YouTube 内容的链接。
- 链接到新的机器学习研究论文等。
内容为王。
一旦你确定你有个人非常乐意订阅的内容,那么你就可以通过 MailChimp 、 ConvertKit 等服务建立你的电子邮件列表订阅表格。
5.油管(国外视频网站)📺

这是我将在本文中介绍的机器学习从业者的最后一种创收方法。
在 YouTube 上制作视频内容为成千上万的人提供了额外的收入来源,许多人将 YouTube 内容制作作为他们的全职工作。
以科技为基础的 YouYube 频道相当受欢迎,尤其是专注于教育和教程的频道。
我个人订阅的频道有两分钟纸、丹尼尔·伯克、森德克斯、深蜥蜴、 3Blue1Brown 、扬尼克·基尔彻、阿布舍克·塔库尔等。
我不知道上面列出的渠道有多赚钱。
不过,有一点我可以说的是,上面的频道所有者并不是以创收或某种形式的收入为唯一目的开始 YouTube 的。
在 YouTube 上创收类似于媒体,因为你必须创造高质量和稳定的内容来获得某种形式的收入。在大多数情况下,YouTube 频道暂时没有任何稳定的收入形式。
我们谈谈吧💲 💲 💲
YouTube 频道通过 YouTube 与频道所有者分享的那部分广告收入来创收。在视频获得货币化资格之前,频道必须满足严格的标准。
但是一旦他们这样做了,天空就是极限。
现在,为了提供一些任意的潜在收入数字,我使用了来自 Influencermarketingbub 的“YouTube 金钱计算器”来估计一些机器学习从业者渠道的总收入。
请注意,这些数字只是一个工具提供的估计,与 YouTube 平台没有直接联系。
让我们开始可以说是最受欢迎的专注于人工智能话题的 YouTube 频道之一。
Lex Fridman 的 YouTube 频道是一座金矿,他的大部分视频都是对人工智能或相关领域知名人士的采访。
根据计算器显示,他的频道每段视频的收入是 229 美元,总共赚了 106,677 美元。这些估计的收入数字令人印象深刻。

接下来的两个估计是 YouTubers Yannic Kilcher 和 Abhishek Thakur。这是两位机器学习的实践者,他们同样受到尊重。


Abhishek Thakur YouTube 频道预计收入
行动🔥🔥🔥
- 创建一个 YouTube 频道
- 上传高质量的基于机器学习的内容
- 重复第 2 步,直到网络成名。
你坚持到了最后
本文中介绍的大多数创收策略甚至需要花费大量的时间去注意最小的收入潜力。
你可能只需要挑选一两个来确保你给一个方法足够的能量来实现它的盈利潜力。
为了能够长期坚持任何一代人的收入,我强烈建议找到除了金钱收益之外的激励。在上述创收方法的前百分位数中,一些人多年来没有注意到任何实质性的收入。
说白了就是做好长期博弈的准备。
以下是机器学习从业者在 2020 年(及以后)创收的方式总结:
- 职业
- 中等
- 咨询/承包
- 电子邮件列表
- 油管(国外视频网站)
还有其他值得注意的创收方法,如:发布和销售视频课程,写作和自助出版书籍,甚至销售机器学习应用程序。
谈到创收,我可能收到的最好的建议是选择一种方法,然后开始 。
更多来自我
当我的文章发表时,你可以得到通知的一个方法是通过媒体跟踪我。
另一种方法是通过注册我的每周简讯,其中将包含文章和机器学习相关内容。
了解如何在机器学习领域取得成功
towardsdatascience.com](/how-to-navigate-a-career-in-machine-learning-according-to-andrew-ng-stanford-lectures-9e10f09047f0) [## AlexNet 给深度学习世界带来了什么
花一分钟来了解琐碎的技术和神经网络架构,革命性的如何深入…
towardsdatascience.com](/what-alexnet-brought-to-the-world-of-deep-learning-46c7974b46fc)
数据科学家可以帮助应对新冠肺炎的 5 种方式和应避免的 5 种行动
许多数据科学家正在思考如何帮助应对新型冠状病毒病毒及其引发的疾病“新冠肺炎”。本文是针对当前的灾难而写的,但旨在为希望帮助应对灾难的数据科学家提供一般性建议。
在来硅谷完成博士学位之前,我在西非为联合国从事冲突后发展工作,重点是在卫生和灾难应对背景下使机器学习适应低资源语言。我帮助应对了世界各地的许多灾难,包括最近在西非爆发的埃博拉病毒、10 年前爆发的 MERS 冠状病毒,以及作为一个全球流行病跟踪组织的首席技术官。
然而,我认为我通过帮助大型科技公司支持更多语言产生了最大的影响,而不是在实际的灾难响应中。如果你不会说像英语这样的特权语言,那么你更有可能成为灾难的受害者,并且获得的信息更少,无法对自己的恢复做出正确的决定。因此,确保更好的语言覆盖率至关重要。当我领导 AWS 的第一个自然语言处理(NLP)和机器翻译解决方案时,当我拥有两家最大的电话制造商作为 NLP 和语音识别数据的客户时,我利用我的影响力确保这些公司内更多样化的语言支持。虽然很难量化,但我认为这可能最终比我作为灾难响应者的所有时间都更能帮助灾难中的人们。
因此,如果你是一名数据科学家,在一家制造广泛使用的技术的公司工作,你能做的最好的事情可能是确保你的语言技术有更多样的语言支持。这将在未来的灾难中继续发挥作用。

像大多数组织一样,病原体以语言多样性聚集在一起。来源:“人工智能对社会有益”,Robert Munro,斯坦福讲座,从语言到信息,2015 年。
内容适度在灾难中也很重要。犯罪分子在金融诈骗中以灾民为猎物,特别是老年人,并以儿童为虐待对象。如果你的公司有内容审核系统来跟踪和报告潜在的金融诈骗和虐待未成年人,那么这是非常重要的工作。
如果你不认为你能在公司的语言多样性或跟踪诈骗/虐待方面有所帮助,但你仍然想为回应新型冠状病毒做出贡献,那么这里有 5 种方法可以帮助你:
1.帮助你周围的人解读信息
2.将专家提供的信息翻译成更多语言
3.准备可能与回答直接相关的数据
4.分析与响应不直接相关的数据
5.利用现有灾害应对数据集进行研究
不幸的是,在很多情况下,你可能会弊大于利。作为一名数据科学家,你 90%以上的想法在付诸实践时实际上都无法实现,而且你不应该期望在灾难响应中有更高的成功率,尤其是当你没有该领域的经验时。所以剩下的 5 种你可以帮助的方式是 5 件应该避免的事情:
6.不要分享你自己关于如何回应的结论
7.不要与不响应的组织合作
8.只要有需要,就不要开始任何你不能支持的工作
9.不要放大任何假媒体
10.不要泄露别人的个人信息
1.帮助你周围的人解读信息
作为一名数据科学家,你会定期客观地评估信息,即使你可能没有该领域的经验,你也可能对医疗保健中真正的科学报告有很好的感觉。你的很多家人和周围的人可能比你经验少。现在是时候教他们如何解释图表上的对数标度,以及为什么他们应该怀疑任何没有标度的图表。

目前在社交媒体上分享的误导性图片
这是一个很好的例子,说明了目前在社交媒体上分享的误导性信息。除了需要解释对数标度之外,在此示例图中还有一些需要注意的事项:
- 此图表的 y 轴显示了每个国家的病例总数。然而,垫底的两个国家,新加坡和香港,人口只有美国的 2%。这将使新加坡和香港的曲线更加平坦。
- 图表的 x 轴从每个国家的 100 个案例开始。对于较小的国家来说,这往往会在反应的后期出现,并且会偏向那些国家的较平坦曲线。
- “戴口罩/不戴口罩”的圆圈看起来像是后来由一个人添加的,他是自动驾驶汽车的专家,但之前没有冠状病毒医疗保健方面的专业知识。这可能不是每个看到这个图形的人都能看得出来的,即使添加圆圈的人可能试图使它在图形上与众不同。因此,这个图表可能会使人们相信它是由在医疗保健界很有名的“约翰·霍普金斯”认可的,而事实并非如此。
- “面具”和“无面具”之间的二元区别几乎肯定是错误的。不同国家的口罩使用水平不同,都在 0%到 100%之间,但不在任何一个极端。
- 你不能仅仅从这样的图表中推断出口罩和病例数之间的直接因果关系。也许病例较少的国家会同时引入许多保护措施,包括口罩。其他任何一种保护措施都可能造成这种差异,或者根本没有影响:这可能是一些其他因素,或者是伴随这些保护措施的社交距离方面的额外谨慎。
- 不同的国家将有不同的报告病例数的方法。例如,有些人只报告有症状的人,有些人只检测有症状的人。这并不总是可能的。
- 不同的国家会有或多或少对病毒敏感的人群,因此或多或少有可能接受检测。在这种情况下,年龄是一个重要因素。
- 美国的病例是日本、新加坡和香港的 100 多倍(注意对数刻度)。请人们评价这意味着什么。一些例题:你真的认为任何一种自制的解决方案都可以预防 99%以上的病例吗?怎么会有一个涉及数百万担心自己亲人的医护人员的阴谋?
作为一名数据科学家,打击像这样在互联网上传播的错误信息可能是你能做的最重要的事情。如果你亲近的人带着这样的信息来找你,向他们指出所有这些问题,然后问他们为什么一个不知道真相的人可能试图误导他们。像这样一个明显伪造的图形可能会导致某人对口罩产生不信任。这也是错误的。这不应该影响某人的决定,唯一的建议应该是:
只接受你信任的医疗服务提供者的建议
你可能还想谈谈为什么医疗保健组织不谈论这样的问题,这是因为他们没有看到数据告诉他们这在此刻是重要的。如果人们分享得太多,它可能会变成政治,迫使像疾病预防控制中心和世卫组织这样的组织做出政治驱动而不是健康驱动的反应。所以,你应该提醒人们不要分享这类信息,不管他们是否同意。
2.将专家提供的信息翻译成更多语言
除了英语,你还会说其他语言吗?尤其是一种不太广泛使用的语言?很有可能很多有价值的信息没有被翻译成这些语言,或者更糟糕的是,很多错误的信息在没有正确信息的情况下传播。
以机器翻译和语音识别模型可以使用的方式翻译和/或转录的任何相关数据都将是有用的。例如,两年前我领导了一个项目,用斯瓦希里语制作了 10 多个小时的与灾难和健康相关的红十字会信息录音,并配有转录和英语翻译。这些数据是开源的,现在每一个使用这些数据的机器翻译和语音识别服务对于与新冠肺炎有关的交流都更加准确。如果你能创建类似的数据集并将其开源,这将有助于新冠肺炎和未来用这些语言做出的任何反应。
如果你没有任何现有的数据集,那么我建议帮助像翻译无国界这样的组织。他们是帮助上述斯瓦希里语数据集的组织之一,并与应对灾害的组织密切合作。
如果你不是专业翻译,那么不要翻译关于预防或治疗新冠肺炎的建议。教学材料和医学术语是最难翻译对的。我在灾难中运行了最大的众包翻译应用,所以在这一点上请接受我的建议。
3.准备可能与回答直接相关的数据
流行病学家是数据科学家,像我们其他人一样,他们花大部分时间准备数据。如果您能够获取可能与响应直接相关的数据,并将其转换为更有用的格式,那么您就可以直接帮助响应。
这方面的一个例子可能是获取包含模糊或非标准位置名称的匿名运输路线数据集,并将这些位置转换为明确的地理位置。另一个例子是使过去关于冠状病毒的研究论文更容易搜索,这样病毒学家就可以尽可能高效地了解过去的研究。
流行病学家通常来自社会科学,因此与专注于机器学习的数据科学家相比,在对数据进行正确的统计分析时,他们会更加严格。
4.分析和共享与响应不直接相关的数据
如果你不是流行病学家、病毒学家或其他在应对灾难方面经验丰富的科学家,那么你不可能在短短几个月内熟悉整个领域。你能做的大多数干预最终会伤害人们,而不是帮助他们(见下文)。
然而,你可以分析数据,告诉我们关于疫情的一些重要信息,但是与应对措施本身没有直接关系。由于新冠肺炎,人们的行为在许多方面都发生了变化。大多数灾难响应专业人员将关注直接响应,而可能不会回头处理其他相关数据。
例如,当几年前西非爆发埃博拉疫情时,我为许多组织提供建议,因为除了更广泛的救灾经验之外,我还在塞拉利昂和利比里亚生活和工作过。我计算出的与疫情没有直接关系的一件事是,估计死于埃博拉以外原因的人数,因为他们避开了医疗诊所。我计算过,每有一个人死于埃博拉,就会有十个人死于可治疗的疾病:
medium.com](https://medium.com/@robert.munro/the-silent-victims-of-ebola-e1a8f83185a9)
这间接地帮助了回应,因为我们用它来减少这些国家误导性新闻的数量。太多的媒体决定在该地区开展宣传活动,除了减少埃博拉死亡人数之外,没有考虑其他任何事情。因此,我能够将这一分析提供给国际卫生组织,他们用它来帮助媒体尽可能地传递信息。
对新冠肺炎来说,你能找到并分析哪些关于人类行为的数据可能会间接有所帮助?例如,你能看到减少驾驶和车祸会释放出更多的病床吗?这可能是一个重要的数字,但是没有人在全国范围内研究过这个问题。同样,由于污染减少,死亡人数减少了多少?或者,既然我们可以实际测量减少污染的结果,那么全球碳足迹的净收益是什么?气候变化最终导致的死亡人数将超过新冠肺炎,这可能是我们获得全球人类行为变化准确数据的最佳机会之一。
数据科学家现在可以教给我们很多东西而不需要直接做出反应的风险,他们最终可能会对世界产生更大的影响。
5.利用现有灾害应对数据集进行研究
如果你真的想专注于灾难应对,那么有许多数据集与灾难应对相关,对这些过去数据集的任何洞察都将有助于我们今天为新冠肺炎和未来的其他灾难建立模型。
我帮助创建的一个 NLP 数据集包含 30,000 条来自事件的消息,包括 2010 年海地地震、2010 年智利地震、2010 年巴基斯坦洪水和 2012 年美国超级风暴桑迪。这些都是我帮助应对的灾难,这个数据集还包括跨越多年的新闻文章和数百起其他灾难:
[## 获取数据
一些数据被评估为非敏感数据,我们公开与世界分享。该数据由…发布
www.mission4636.org](https://www.mission4636.org/access-to-data/)
重要的是,这些数据中有一些是英语以外的语言。例如,Haitian Kreyol 数据被用作 2011 年机器翻译研讨会的共享任务。这个数据集也用于 AI4All、Udacity 和包括斯坦福大学在内的大学开设的课程。对灾难相关数据有经验的人越多,我们对未来的准备就越充分。
如果你从事计算机视觉领域的工作,那么我建议你研究能够支持医疗专业人员解读图像的系统。医疗保健公司将从计算机视觉系统中获得很少或没有价值,该系统只能检测一种类型的感染,并且只能提供预测,而不是帮助医疗保健专业人员进行诊断的界面。
避免只因为数据容易收集或者问题容易建模而在学术界流行的研究。其中包括 NLP 中的纯英文社交媒体分析和计算机视觉中医学图像中单一疾病的自动诊断。这类研究的结果并不能帮助我们决定在实际的灾难中什么方法能帮助我们。
6.不要分享你自己关于如何回应的结论
如果你不是医护人员或灾难应对专家,那么你不应该给出关于人们应该如何保护自己的医学意见。尽管我在灾难应对领域工作了十年,但我只是把人们引向更权威的来源。你不会在这篇文章或社交媒体上看到我给你如何保护或对待自己的建议。请也这样做。
此外,如果你引用专家个人或组织的话,最好是让人们去参考这些来源,而不是把它们复制到你的网站上。除非你准备好持续监控医疗专家的建议变化,并立即更新你的材料以反映最新的建议,否则你将在某些时候印刷错误信息,并对谁是权威来源造成混淆。
克制住参加讨论的冲动。你绝对不可能在短时间内学到足够有用的信息。例如,想想如果有人阅读了最近几年最受欢迎的机器学习研究论文,但没有其他经验,会发生什么。这会让他们准备好将有用的机器学习模型用于实际应用吗?绝对不行。这些论文没有任何关于让机器学习在现实世界中工作的内容,我们知道每篇论文都有 100 或 1000 个显示负面结果的实验。
对于直接应对灾难的任何科学来说也是如此,无论是关于流行病学、病毒学还是像口罩这样的设备。阅读 100 篇最相关的论文会让你做出有用的贡献。你会对那些发表在早期研究论文中的特殊问题产生偏见,并且只发表积极的结果。你可能会害死人。
7.不要与不响应的组织合作
大多数向数据科学家寻求帮助应对新冠肺炎的组织并没有直接帮助应对新冠肺炎。为了给援助行业一个非常高层次的介绍,这里有一个图表显示了许多援助组织如何在灾难响应中工作:

援助组织结构的高级概述。少数在国家或国际一级提供援助的大型组织被称为“业务组织”,但大多数组织在实际救灾工作中使用当地的“执行伙伴”。一些地方援助组织可能是完全独立或联合独立的,并帮助更大的组织。“非运营型组织”是最小的,但可能会让人误以为它们很大,而且在运营。
如果有人请你帮忙,你怎么知道他们是否真的在回应?最好的帮助组织是在当地运作的组织。你当地的医院或难民食品配送中心需要帮助吗?从他们开始。你可以与疾病预防控制中心和世卫组织这样的大组织合作,但这是开始试图引起大组织注意的最糟糕的时间,因为任何花在让你了解最新情况的时间都是他们没有对疫情做出反应的时间。在任何情况下,这些大型组织中的大多数都会将您引向当地的实施伙伴。
非运营组织通常规模较小,利用灾难作为筹资和宣传的机会。请注意,他们谈论的是与像世卫组织这样的大组织的“伙伴关系”,但没有一个地方说他们是“执行伙伴”。这通常是“实际上不是响应的一部分”的代码。如果他们联系你,很有可能你就是产品,他们告诉潜在的投资者“看,我们有来自 X 公司的志愿数据科学家,我们将用创新击败 COVID。”
根据经验,如果它不是一个你已经知道的全国性组织(如你所在国家的疾病预防控制中心或类似机构),并且它不是他们的基金、方案、专门机构和其他列表中的前 30 个联合国机构之一,那么寻找你知道在你所在地区运作的组织。
8.只要有需要,就不要开始任何你不能支持的工作
在灾难开始的时候,我从来没有在招募人员方面遇到过困难,但是我总是很难招募到能够在一段有意义的时间内提供帮助的人。如果您现在正在编写代码、构建模型或编写文档,您能确保在 3 个月或 6 个月内能够支持这些吗?
请记住,你自己可能会生病,或者不得不照顾别人。如果你或你护理的人更有可能患上更严重的新冠肺炎病,那么你应该而不是让自己处于应对危机的关键路径上,如果你还不是一名必要的工作人员。此外,你需要高度同理心,但冷静,成为一个有效的灾难应变者。如果你陷入对自己和你所爱的人的担忧,那么你可能来自一个充满个人激情的地方,并且很难做到客观的同情。在这种情况下,我不能相信任何人,所以我总是让这样的人在灾难中执行非关键任务。
9.不要放大任何假媒体
每次灾难中都会出现大量虚假的媒体报道。最具破坏性的是那些针对响应组织没有做正确的事情。甚至受欢迎的媒体机构也这样做:他们发现响应的一小部分,其中一个组织最近没有做任何工作,或者存在与其他组织不一致的政策。无论问题有多小,媒体机构都很容易将其描述为“潜在危及数百万人的生命”,并让争论双方的人发表评论。本质上,他们在不应该存在争议的时候制造争议。
最喜欢被引用的目标是在一个国家不掌权的政客,因为这些政客会指责执政党,以及在数据科学等领域的技术特立独行者,因为这是信心经常超过能力的地方。
记者知道这类文章非常不道德,他们避免署名。因此,寻找没有作者的新闻文章,或者是来自数据科学或反对派政党的特邀作者。
这种叙述最糟糕的部分是诸如“不要相信世卫组织”或“不要相信疾病控制中心”等信息。即使这个关于的争论是正确的,关于不信任这些组织的更广泛的故事将比解决这个问题造成更大的伤害。
10.不要泄露别人的个人信息
世界上大多数政府至少会有一些人试图实施剥夺公民自由的措施。具体到冠状病毒,我去年在 KDD 谈到了这一点,分享了我在 MERS 冠状病毒爆发期间管理的公司如何决定而不是帮助进行社交媒体分析,因为这对人们的隐私有影响:
从 1:13(https://www.youtube.com/watch?v=4ll77xuYszc&feature = youtu . be&t = 4380)开始,在 2019 年的 KDD,我谈到了沙特阿拉伯政府如何利用冠状病毒爆发( MERS-CoV )为借口,在社交媒体上识别异见人士。
许多罪犯也是如此。虽然在灾难期间犯罪率往往会下降,但因为人们都非常善良,所以有些人会在混乱中茁壮成长以剥削他人。
因此,与本文的第一点相关的是,照顾好你的家人。在灾害期间,老年人是诈骗的专门目标,通过泄露他们的个人身份来骗取钱财。儿童经常成为性侵犯者的目标,所以要特别小心任何数据来源,即使它看起来是公开的。例如,国家地理杂志在 2010 年海地地震后发布了海地儿童的电话号码。
总的来说,没有必要将任何数据公之于众,你甚至应该小心报道你是如何应对灾难的。如果对你的贡献的认可是重要的,那么我建议私下里或者在回应结束后得到它。
如果我什么也帮不上呢?
如果你现在无能为力,那么我建议你采取长期行动:
- 准备支持你周围的人。在大多数国家,死亡人数将在未来几周内迅速上升。如果你没有失去你认识的人,你的一个朋友几乎肯定会。陪在他们身边。他们不会得到通常从医护人员那里得到的情感支持,因为他们工作过度。你可以填补这个空白。
- 做好疲劳的准备。灾难疲劳(也被称为同情疲劳)是大多数人在因新冠肺炎而改变生活方式几周或几个月后会经历的精神和情绪疲惫。我不太担心美国死亡高峰时的人类行为,而是担心接下来 2-3 周人们会变得疲劳。我见过经验丰富的灾难应对专家在这一时期比任何时候都更容易崩溃。这时,你需要找到额外的储备,让自己和周围的人变得强大。
- 有助于未来的灾难应对研究。灾难总是在发生,大多数很少或根本没有媒体关注。在 ImageNet 建立的同时,我在斯坦福建立了第一个灾难响应数据集,可以肯定地说,我的数据集只有 ImageNet 的 1%,这令人失望。像任何其他技术或科学一样,我们需要几个月甚至几年的时间来改进我们的方法,所以当不也对灾难做出反应时,这是最好的。
感谢大家帮忙回复!
罗伯特·芒罗
2020 年 4 月
编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
Julia 优于 Python 的 5 个方面
为什么 Julia 比 Python 更适合 DS/ML

Julia 是一种多范例、主要为机器学习和统计编程而创建的函数式编程语言。Python 是另一种用于机器学习的多范例编程语言,尽管通常 Python 被认为是面向对象的。另一方面,Julia 更基于功能范式。虽然 Julia 肯定没有 Python 流行,但是使用 Julia 进行数据科学有一些巨大的好处,这使它在许多情况下是 Python 的更好选择。
№1:速度

不谈速度,很难谈朱莉娅。朱莉娅以速度非常快而自豪。Julia 不像 Python 是解释型的,它是一种编译型语言,主要是在自己的基础上编写的。然而,与 C 等其他编译语言不同,Julia 是在运行时编译的,而传统语言是在执行前编译的。Julia,尤其是写得好的,可以和 C 一样快,有时甚至比 C 更快。Just In Time (JIT)编译器的编译速度快得令人难以置信,尽管它的编译更像一种解释语言,而不是传统的低级编译语言,如 C 或 Fortran。
第二:多功能性
你可能已经注意到,我说过 Python 是多才多艺的,这是 Julia 的一个优势,这是真的——有很多事情 Python 可以做,而 Julia 却做不到。当然,这只是从本质上来说,因为我们现在谈论的多功能性是语言的多功能性。Julia 代码在 R、Latex、Python 和 c 中是通用的可执行代码。这意味着典型的数据科学项目有可能只需编写一次,就可以在包装器中从另一种语言编译成 Julia,或者只需发送字符串。
PyCall 和 RCall 也是相当大的交易。考虑到 Julia 的一个严重缺点实际上是包,在需要的时候调用 Python 和 R 真的很方便。PyCall 在 Julia 中得到了很好的实现,确实做得很好,非常有用。
№3:多重派遣

Julia 是一种类型非常独特的语言,有自己的特点和特性,但其中最酷的特性之一是 Julia 的多重调度。首先也是最重要的,茱莉亚的多次派遣速度很快。最重要的是,使用 Julia 的多态分派允许将函数定义作为结构的属性来应用。当然,这使得遗传在朱莉娅体内变得可行。
不仅如此,使用 Julia 的多重分派使函数具有可扩展性。这对于包扩展来说是一个很大的好处,因为无论何时显式导入一个方法,用户都可以更改它。显式导入您的方法并扩展它以将结构路由到新函数会很容易。
№4:专为 ML 打造
与 Python 不同,Julia 的设计初衷是用于统计学和机器学习。Python 是在 90 年代早期作为一种简单的面向对象语言创建的,尽管从那时起它已经发生了很大的变化。鉴于 Python 的历史,以及 Python 如此流行以来的广泛用途,使用一种专门为高级统计工作而设计的语言可能会带来很多好处。
我认为这比 Python 更有利于 Julia 的一个方面是线性代数。香草 Python 可以突突地完成线性代数,但是香草 Julia 可以飞快地完成线性代数。这当然是因为 Python 从来就不支持机器学习中的所有矩阵和方程。Python 一点也不差,尤其是对于 NumPy,但是就无软件包体验而言,Julia 更倾向于这类数学。Julia 的操作系统比 Python 的更接近 R,这是一个很大的好处。大多数线性代数更快更容易做。让我们展示一个点积等式,以进一步说明这一点:
Python -> y = np.dot(array1,array2)
R -> y <- array1 * array2
Julia -> y = array1 .* array2
№5:包管理器
我要第一个说,Julia 的 Pkg 包管理器比 Python 的 Pip 包管理器高出一个世界。Pkg 自带 REPL 和茱莉亚包,你可以从中构建、添加、删除和实例化包。由于 Pkg 与 Git 的结合,这尤其方便。更新很容易,添加包总是很容易,并且总的来说,任何时候使用 Pkg 超过 Python 的 Pip 都是一件愉快的事情。
结论
使用哪种语言并不重要,不管是 R、Julia、Python 还是 Scala。然而,需要注意的是,每种语言都有它的缺点,没有一种语言会是“完美的语言”如果你在编程方面是多才多艺的,从机器学习到图形用户界面再到 API,这一点尤其正确。也就是说,Julia 当然是我最喜欢的库之一,还有 Python。Python 有更好的包,通常如果项目足够小,我会转向 Python,但是对于有数百万观察值的数据集,甚至很难用 Python 读取这种数据。
总的来说,我期待朱莉娅的未来。Julia 写起来很有趣,将来可能会更适合数据科学。
Python 优于 Julia 的 5 个方面
为什么 Python 比 Julia 更适合 DS/ML

Python 是世界上最流行的高级编程语言。这是有充分理由的,因为许多代码库实际上是在 Python 内部编写的。另一方面,Python 是用 C. Julia 编写的解释型高级编程语言。在 Julia 出现之前,Python 近年来在数据科学家中更受欢迎。
Julia 是一种高级的、多范例的统计编程语言。与 Python 不同,Julia 主要是为统计计算(像 r)而创建的。Julia 是一种使用自己的编译器的编译语言,被称为“实时”编译器。尽管 Julia 是一种很好的机器学习语言,但相比之下 Python 仍然非常流行。
№1:人气
基于 Python 的项目的最大好处是 Python 是一种通用语言,尤其是在 2020 年的今天。许多语言被用来翻译 Python 代码,这些代码经常被用于许多不同的行业,包括但不限于:
- 开发运营
- 网络安全
- 数据科学家
- 软件工程师
- Web 开发人员
Python 受欢迎的另一个巨大好处是文档,因为如果有人在互联网上问过你的问题,通常会更容易找到答案。Julia 的一个大问题是缺乏信息,你经常会发现自己在阅读可怕的 Github-README 文档。不用说,过一段时间后会变得很老。
№2:简单

众所周知,Python 很容易,这是一个很大的优势。让我们面对现实吧,损失函数和相关系数被抛来抛去的复杂算法已经够复杂了,不用担心底层语法。例如,即使将相同的代码写入 Lisp,也要花费两倍以上的时间。这带来了快速教育、快速理解以及最重要的快速故障排除的好处。
№3:包装
与 Python 的大量用户相应的是 Python 的大量包。我真正喜欢使用 Python 的地方是能够使用两年前有人在 Github 上制作的 Python 包装器中未记录的端点。诸如此类的事情在 Julia 中并不存在,这使得获取数据更加困难。

包是语言中非常重要的一部分。如果没有合适的代码库来支持机器学习,你会遇到很多问题,你不得不从非常非常低的层次解决问题。这当然是乏味的,并且在进行的过程中消耗更多的时间。Python 的有趣之处在于能够随时从工具箱中取出任何工具——而不必为自己使用该工具编写程序。
№4: Linux
Python 和 Linux 携手并进已经不是什么秘密了。事实上,只要认识到 Python 最初是在 GPL 许可下发布的,并且直到今天仍然是开源的,这些信息就可以得到验证。这太棒了,因为这意味着我们所有的服务器、基于 Linux 的计算机、甚至苹果设备现在都预装了 Python,并且默认文件夹已经准备就绪。
这适用于定制和修复的另一种情况。不喜欢你的 Gnome 应用程序栏在不用的时候不会消失?好吧,把它编进去!任何你不喜欢的东西都可以用最简单的语言编程。
№5:多功能性
Julia 是一种非常通用的语言,但是也就是说,Python 是以完全不同的方式通用的。Python 是为面向对象和通用编程而创建的(尽管在这些范例中没有特别发现)。)这意味着,虽然 Python 已经证明了它在统计和机器学习方面的能力,但 Python 还能够运行 API、移动文件、提供 GUI、托管 web 服务器、控制微处理器,几乎任何你想做的事情,都是 Python 能够做到的。这当然让 Python 变得非常通用。
将 Python 的多功能性与 Julia 的多功能性进行比较,Julia 的有用性在较低层次上当然会恶化。这没什么大不了的,因为低级编程在未来不会有什么发展,再增加一门语言也是白费力气,但是特别的是,Julia 不会做 GUI(至少现在不会),并且有一个 arduino 包,但是很难注册总线输入。然而,部署 web 服务器、统计数据和低级文件系统工作(如编写文本文件)当然仍然是可行的。
最后
Julia 和 Python 都是我非常喜欢的伟大语言。当谈到两种语言在数据科学方面孰优孰劣时,这两种语言肯定会互相攻击。如果你想从 Julia 的角度阅读一篇类似的文章,这里是我对这篇文章的反驳,我描述了我认为 Julia 优于 Python 的 5 个方面。我迫不及待地想看到 Julia 之路的未来,以及 10 年后数据科学语言的发展方向。
在 PySpark 数据框架中添加新列的 5 种方法

图片由来自 Pixabay 的 nickgesell 提供
并且,它们都是有用的
每天都在生成太多的数据。
虽然有时我们可以使用类似于Rapids或 并行化 , Spark 这样的工具来管理我们的大数据,但如果您正在处理数 TB 的数据,这是一款非常棒的工具。
在我关于 Spark 的上一篇文章中,我解释了如何使用 PySpark RDDs 和 Dataframes。
虽然这篇文章解释了很多关于如何使用 rdd 和基本数据帧操作的内容,但是我错过了很多关于使用 PySpark 数据帧的内容。
只有当我需要更多的功能时,我才会仔细阅读,想出多种解决方案来做一件事情。
如何在 spark 中创建新栏目?
现在,这可能听起来微不足道,但相信我,它不是。由于您可能想对数据做这么多事情,我很确定您最终会在工作流中使用这些列创建过程中的大部分。有时利用 Pandas 的功能,有时使用基于 RDDs 的分区,有时利用成熟的 python 生态系统。
这篇文章的主题是“在 Pyspark 数据框架中创建新列的多种方法”
如果您安装了 PySpark,可以跳过下面的入门部分。
Spark 入门
我知道你们很多人不会在系统中安装 spark 来尝试和学习。但是安装 Spark 本身就很头疼。
既然我们想了解它是如何工作的,我建议你在社区版中使用 Spark on data brickshere。别担心,它是免费的,尽管资源更少,但对于我们现在的学习目的来说是有用的。

一旦您注册并登录,将出现以下屏幕。

你可以在这里开始一个新的笔记本。
选择 Python 笔记本,并为其命名。
一旦您启动一个新的笔记本并尝试执行任何命令,笔记本会询问您是否要启动一个新的集群。动手吧。
下一步将检查 sparkcontext 是否存在。要检查 sparkcontext 是否存在,您必须运行以下命令:
sc

这意味着我们可以在笔记本上运行 Spark。
数据
在这里,我将处理 movie lensml-100k . zip数据集。1000 个用户对 1700 部电影的 100,000 次评分。在这个压缩文件夹中,我们将专门处理的文件是分级文件。该文件名保存为“u.data”
如果您想要上传此数据或任何数据,您可以单击左侧的 data 选项卡,然后使用提供的 GUI 添加数据。

然后,我们可以使用以下命令加载数据:
ratings = spark.read.load("/FileStore/tables/u.data",format="csv", sep="\t", inferSchema="true", header="false")ratings = ratings.toDF(*['user_id', 'movie_id', 'rating', 'unix_timestamp'])
这是它的样子:
ratings.show()

好了,现在我们终于可以开始我们感兴趣的部分了。如何在 PySpark Dataframe 中创建新列?
1.使用 Spark 本地函数

安德鲁·詹姆斯在 Unsplash 上拍摄的照片
在 PySpark 数据帧中创建新列的最简单的方法是使用内置函数。这是创建新列的最有效的编程方式,所以每当我想做一些列操作时,这是我第一个去的地方。
我们可以使用.withcolumn和 PySpark SQL 函数来创建一个新列。本质上,您可以找到已经使用 Spark 函数实现的字符串函数、日期函数和数学函数。我们可以将 spark 函数导入为:
import pyspark.sql.functions as F
我们的第一个函数是F.col函数,它让我们可以访问列。因此,如果我们想将一列乘以 2,我们可以使用F.col作为:
ratings_with_scale10 = ratings.withColumn("ScaledRating", 2*F.col("rating"))ratings_with_scale10.show()

我们也可以使用数学函数,如F.exp函数:
ratings_with_exp = ratings.withColumn("expRating", 2*F.exp("rating"))ratings_with_exp.show()

这个模块还提供了很多其他的功能,对于大多数简单的用例来说已经足够了。你可以点击查看功能列表。
2.Spark UDFs

有时我们想对一列或多列做复杂的事情。这可以被认为是将 PySpark 数据帧映射到一列或多列的操作。虽然 Spark SQL 函数确实解决了许多列创建的用例,但每当我想使用更成熟的 Python 功能时,我都会使用 Spark UDF。
要使用 Spark UDF,我们需要使用F.udf函数将常规 python 函数转换成 Spark UDF。我们还需要指定函数的返回类型。在这个例子中,返回类型是StringType()
import pyspark.sql.functions as F
from pyspark.sql.types import *def somefunc(value):
if value < 3:
return 'low'
else:
return 'high'#convert to a UDF Function by passing in the function and return type of functionudfsomefunc = F.udf(somefunc, StringType())ratings_with_high_low = ratings.withColumn("high_low", udfsomefunc("rating"))ratings_with_high_low.show()

3.使用 rdd

瑞安·昆塔尔在 Unsplash 上拍摄的照片
有时,spark UDFs 和 SQL 函数对于特定的用例来说是不够的。您可能希望利用 spark RDDs 带来的更好的分区。或者您可能想在 Spark RDDs 中使用组函数。您可以使用这个,主要是当您需要访问 python 函数内 spark 数据框中的所有列时。
不管是哪种情况,我发现这种使用 RDD 创建新列的方式对于有使用 rdd 经验的人来说非常有用,rdd 是 Spark 生态系统中的基本构建块。
下面的过程利用了在Row和pythondict对象之间转换的功能。我们将一个行对象转换成一个字典。像我们习惯的那样使用字典,并将字典转换回 row。
import math
from pyspark.sql import Rowdef rowwise_function(row):
# convert row to dict:
row_dict = row.asDict()
# Add a new key in the dictionary with the new column name and value.
row_dict['Newcol'] = math.exp(row_dict['rating'])
# convert dict to row:
newrow = Row(**row_dict)
# return new row
return newrow# convert ratings dataframe to RDD
ratings_rdd = ratings.rdd
# apply our function to RDD
ratings_rdd_new = ratings_rdd.map(lambda row: rowwise_function(row))
# Convert RDD Back to DataFrame
ratings_new_df = sqlContext.createDataFrame(ratings_rdd_new)ratings_new_df.show()

4.熊猫 UDF

帕斯卡尔·贝纳登在 Unsplash 上的照片
Spark 版本 2.3.1 中引入了这一功能。这就允许你在 Spark 上使用 pandas 的功能。当我必须在 Spark 数据帧上运行 groupby 操作时,或者当我需要创建滚动特征并希望使用 Pandas 滚动函数/窗口函数时,我通常会使用它。
我们使用它的方式是通过使用F.pandas_udf装饰器。这里我们假设函数的输入是一个熊猫数据帧。我们需要从这个函数中依次返回一个熊猫数据帧。
这里唯一的复杂性是我们必须为输出数据帧提供一个模式。我们可以使用下面的格式。
# Declare the schema for the output of our function
outSchema = StructType([StructField('user_id',IntegerType(),True),StructField('movie_id',IntegerType(),True),StructField('rating',IntegerType(),True),StructField('unix_timestamp',IntegerType(),True),StructField('normalized_rating',DoubleType(),True)])# decorate our function with pandas_udf decorator
[@F](http://twitter.com/F).pandas_udf(outSchema, F.PandasUDFType.GROUPED_MAP)
def subtract_mean(pdf):
# pdf is a pandas.DataFrame
v = pdf.rating
v = v - v.mean()
pdf['normalized_rating'] =v
return pdfrating_groupwise_normalization = ratings.groupby("movie_id").apply(subtract_mean)rating_groupwise_normalization.show()

我们也可以利用这个来 在每个 spark 节点上训练多个单独的模型。 为此,我们复制我们的数据,并给每个副本一个键和一些训练参数,如 max_depth 等。然后,我们的函数获取 pandas 数据帧,运行所需的模型,并返回结果。该结构如下所示。
# 0\. Declare the schema for the output of our function
outSchema = StructType([StructField('replication_id',IntegerType(),True),StructField('RMSE',DoubleType(),True)])# decorate our function with pandas_udf decorator
[@F](http://twitter.com/F).pandas_udf(outSchema, F.PandasUDFType.GROUPED_MAP)
def run_model(pdf):
# 1\. Get hyperparam values
num_trees = pdf.num_trees.values[0]
depth = pdf.depth.values[0]
replication_id = pdf.replication_id.values[0]
# 2\. Train test split
Xtrain,Xcv,ytrain,ycv = train_test_split.....
# 3\. Create model using the pandas dataframe
clf = RandomForestRegressor(max_depth = depth, num_trees=num_trees,....)
clf.fit(Xtrain,ytrain)
# 4\. Evaluate the model
rmse = RMSE(clf.predict(Xcv,ycv)
# 5\. return results as pandas DF
res =pd.DataFrame({'replication_id':replication_id,'RMSE':rmse})
return res
results = replicated_data.groupby("replication_id").apply(run_model)
以上只是一个想法,而不是工作代码。尽管稍加修改就能工作。
5.使用 SQL
对于喜欢 SQL 的人来说,甚至有一种方法可以使用 SQL 创建列。为此,我们需要注册一个临时 SQL 表,然后使用带有附加列的简单选择查询。人们也可以用它来连接。
ratings.registerTempTable('ratings_table')
newDF = sqlContext.sql('select *, 2*rating as newCol from ratings_table')
newDF.show()

结论

这就是本专栏的结尾(双关语)
希望我已经很好地介绍了专栏创建过程,可以帮助您解决 Spark 问题。如果您需要了解更多 spark 基础知识,请查看:
不仅仅是介绍
towardsdatascience.com](/the-hitchhikers-guide-to-handle-big-data-using-spark-90b9be0fe89a)
你可以在 databricks 上的 GitHub 资源库 或 发布的笔记本 中找到这篇文章的所有代码。
还有,如果你想了解更多关于 Spark 和 Spark DataFrames 的知识,我想调出 Yandex 提供的大数据精要 大数据专业化 的一个精品课程。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter@ mlwhiz联系
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
将数据科学应用于房地产的 5 种方式
有哪些实实在在的好处,我们在哪里可以学到这些技巧?

数据科学是可能对房地产行业产生最大长期影响的技术。(照片由詹尼斯·格拉斯在 Unsplash 上拍摄)
房地产行业面临着巨大的压力,需要释放大数据的潜力,并将机器学习和基于证据的方法纳入其工作流程。在毕马威全球 PropTech 调查 2018 中,49%的参与者认为人工智能、大数据和数据分析是可能对房地产行业产生长期影响的技术。
因此,一些具有长期经营历史的房地产机构的高瞻远瞩的高管正在推动他们的公司释放他们几十年的交易、估值、资产管理、上市和其他数据记录的潜力。与此同时,随着成功的初创公司如 HouseCanary 和 Reonomy 加入老牌公司如 CoStar 和 Real Capital Analytics ,数据提供空间正在走向成熟(甚至可能过度拥挤,使得任何对房地产感兴趣的公司都有可能快速获得大量相关数据。
然而,正如 NAIOP 最近的一篇文章所指出的,房地产专业人士正面临着如何实际利用数据的挑战。毕马威全球 PropTech 调查 2019 证实,80%的公司仍然没有“大部分或全部”由数据引导决策。同一份报告还暗示了“技能差距”——只有 5%的房地产公司由具有数据分析知识的人领导转型工作。
那么,我们到底该如何将数据科学应用于房地产呢?有哪些实实在在的好处?此外,我们可以从哪里学习技能和技术,从而利用大数据在房地产领域的潜力?
[1]房地产价格指数

房地产价格指数是一种统计方法,可以分析数百万行嘈杂的交易数据,并获得对次级市场历史表现的详细了解。(图片由作者提供)
正如新闻文章和专家评论所报道的,数据科学在投资中的应用已经在金融领域激增,如今数据驱动的计算机模型占交易的 80%。然而,与公开上市的股票不同,每一笔报道的房地产交易都代表着一种独特资产的交换——没有哪两种房地产是完全相同的。即使是在同一栋建筑中的两个单位进行交易,它们也可能大相径庭,价格也可能大相径庭。
这给房地产带来了一个特殊的问题——我们如何利用大型数据集来了解各个子市场的表现?如果每个时期交易的房地产类型不同,对历史交易进行简单的平均可能会有偏差,并且在确定平均中包括或排除哪些房地产时存在主观性,以至于不同的研究人员最终可能会得出不同的历史表现。
数据科学方法提出了该问题的几种解决方案。享乐回归技术(在像新加坡这样的国家使用)的运作原则是,每项资产的个别特征可以单独定价,以控制资产之间的差异。
或者,分析可以仅限于比较不止一次出售的房产的价格变化。这就是所谓的重复销售法,即跟踪同一资产在一段时间内的价格变化。美国 Case-Shiller 指数就是这种技术的一个众所周知的例子。
从根本上说,这些方法允许用户超越人类的能力,处理比任何一个人都无法人工理解的更多数据,以产生准确的房地产市场表现信号。数百万行嘈杂的交易数据可以与关于地点、房产特征、人口统计等信息结合起来,产生精细的子市场指数。例如,指数可以精确定位特定邮政区的物业回报,如伦敦的 WC1 指数或 E1 指数,或特定物业类型,如两床公寓指数与三床公寓指数,同时考虑完整数据集中所有交易的影响。指数化有助于确定历史趋势,进而有助于当前定价和未来回报估计。
[2]自动估价模型

自动化估价模型通过利用大型数据集评估公平的当前交易价格,帮助我们了解当前的房地产市场。(图片由作者提供)
统计估值方法在全球范围内越来越受欢迎,例如美国的 Zillow Zestimate ,新加坡的 UrbanZoom ,以及芬兰的 SkenarioLabs 。任何自动估价模型的目标都是利用数据来产生对房产市场价值的估计——在这种情况下,自愿的买方和卖方可以公平交易,而无需强制。
采用了类似于指数化的方法,部署了潜在的更先进的数据科学技术,以利用在线学习和集成方法。但是,最后的输出是不一样的。目标不是指数,而是资产价值的点(或范围)估计。直接的好处是更精确地确定一项财产的公平市场价值,这种价值是瞬间产生的,而且成本很低。这些估价不仅对房产定价有用,而且对评估抵押贷款和支持这些资产的贷款组合也有用。
这项技术的一个有趣应用是在像 Opendoor 和proper这样的公司,它们自动对房屋进行投标,为业主的资产提供现成的流动性。
自动化估价模型通过帮助评估当前交易的公平交易价格,帮助我们了解当前的房地产市场。
[3]时间序列预测

时间序列方法有助于我们理解房地产市场的未来走向。(图片由作者提供)
时间序列方法有助于我们理解房地产市场的未来走向。更好的预测有明显的好处——更好的投资和开发交易,以及更高的财务回报。
如果我们只有一组数据,例如,一个单一市场的房地产价格指数,我们可以使用自回归综合移动平均(ARIMA)模型进行短期预测。这种类型的模型可以评估季节变化,并确定数据中的趋势和模式,以估计未来的表现。
更常见的是,我们会有一组数据,如几个不同(但相关)市场的房地产价格指数,宏观经济系列,如 GDP、失业、通胀等。、金融指标,如利率和抵押贷款利率、股市指数、外汇利率等。这些变量相互之间都有因果影响,在这种情况下,可以使用向量自回归(VAR)和向量误差修正模型(VECM)进行预测。通过这样做,我们在预测房地产价格的未来时,考虑了一系列因素的演变。
许多分析提供商,如 HouseCanary 和 Real Estate Foresight 使用数据科学方法来预测未来的房地产表现。在宏观经济数据领域, Capital Economics 和 Oxford Economics 等使用其中一些统计方法来预测 GDP、通胀、利率等的走势,所有这些都是房地产交易评估流程的关键输入。
【4】聚类分析

聚类分析识别可能表现更相似的属性组。(照片由 Patrick Schreiber 在 Unsplash 上拍摄)
不同地区的房地产表现可能会有很大差异。由于不同的宏观经济形势,不同的国家可能会有所不同。同一国家内的城市可能会因当地因素(如经济活动或供应)而有所不同。在一个城市中,一些社区或子行业(如豪华公寓与大众市场住宅)的表现也可能大相径庭。
聚类分析严格识别数据中的模式,有助于确定哪些属性组的表现可能更相似,哪些属性组的表现更可能不同。
聚类分析的另一个应用是确定房地产市场表现或多或少相似的时间段。许多房地产市场受到政府干预的严重影响。立法可能会有许多重大变化,导致定价和投资行为随时间而变化。聚类分析可以帮助识别定价性能可能更相似的时间段。
聚类分析有助于我们为每个群体(或时间段)建立有针对性的模型,从而提高准确性。它还可以用于指导业务战略——通过确定不同团队应该瞄准哪个细分市场,或者市场可能处于什么投资体制,领导者可以在数据的支持下做出更有利可图的决策。
【5】地理信息系统

GIS 有助于可视化、理解和分析空间和位置情报。(图片由作者提供)
位置是房地产分析中最重要的因素之一,GIS 工具如 Quantum GIS 或 ESRI 的 ArcGIS 帮助我们可视化、理解和分析位置情报。随着政府开放数据源的兴起,可以获得比以往任何时候都多的信息,从邻里的人口迁移到公共设施的位置,等等。
使用 GIS 可解决的任务的一个示例是加载给定年份内的所有房产交易,还加载所有火车站的位置,然后自动确定哪些房产在火车站的指定半径内,并统计测试这些房产的每平方英尺价格是否高于远离火车站的房产。
GIS 还可以用来计算通勤时间,或者找到符合特定标准的房产。地理信息系统支持选址,例如,根据人口特征、交通、甚至竞争对手的位置来寻找好的零售点。
行业影响

将数据科学应用到房地产中,可以带来广泛的商业机会。(照片由塞缪尔·佩雷拉在 Unsplash 上拍摄)
英国房地产投资信托基金的一句话总结得很好:“如果你不能高效地使用数据,那么你将错过你的业务/市场的大量价值。别人不会犯这个错误,你会越来越没有竞争力。最终,世界只会朝着一个方向发展。”(毕马威全球 PropTech 调查 2019 )
这场革命也发生在其他行业。在金融领域,Bridgewater 和 Renaissance Technologies 是系统投资的早期参与者,几十年来取得了巨大的成功。如今,数据驱动的公开市场量化投资已成为常态,而非例外。甚至体育也变得极其统计驱动,团队草案决策通常由复杂的分析和建模驱动。在某种程度上,房地产行业更加依赖数据驱动的决策是不可避免的。
对于房地产来说,有许多商业机会和趋势值得注意。
数据本身是有价值的这一假设是明确的,并且得到了像 Teranet 或 Compstak 这样的公司的成功支持。但是,即使是整理、清理和组织数据——公开的或不公开的——也是重要价值的来源,正如像 Cherre 和 Realyse 这样的公司的崛起所证明的那样。将原始数据转化为可用的分析是另一个价值来源,像 Walk Score 或 Local Logic 这样的公司就是这样做的。
自动估价的兴起给估价工作带来了机遇和挑战。在某些行业,基本估值可能开始转向更依赖统计模型,因为统计模型执行起来更便宜、更快。但与此同时,新的商业模式正在出现,如即时房地产买家。反过来,这可能会对那些依靠中介这些传统上不透明、流动性差的市场为生的人产生影响。
预测和分析为房地产投资带来了新的机遇。Skyline.ai 是使用数据驱动方法进行投资的一个领先但新生的例子,但仍有很大的发展空间。在金融领域,价值 3 万亿美元的对冲基金行业的⅓运用量化策略进行运作。与此同时,前 100 家房地产基金管理着超过 3 万亿美元的资产,但迄今为止,基本上还没有一家进行量化投资。
学习选项
现在可以参加教授房地产数据科学的在线课程。(作者视频)
那么,我们在哪里可以学习这些方法,并利用房地产大数据的潜力呢?
大多数选项都是针对一般的数据科学学习,没有特别关注房地产和上面列出的技术。但是,它们确实提供了一个很好的起点,从中可以继续构建,并尝试自学所需的其他方法。
在这一领域, General Assembly 在全球多个地点提供校园课程(以及在线选项),开展全日制和非全日制通才数据科学课程。Coursera 提供关于 GIS 以及数据科学的预录自学视频。大学也有正式的 1 到 2 年的 T4 项目。
另外, PropertyQuants 提供了一个快速的 11 周实时互动在线课程,专门讲述“将数据科学和机器学习应用于房地产”它包括一个 bootcamp 模块,帮助参与者开始了解编程和数据科学,随后是房地产数据科学和 GIS 模块,因此涵盖了上面列出的所有主要技术。
参与者还可以参与他们选择的顶点项目,使用课程中教授的方法进行真实世界的分析。课堂辅以一对一的会议和分级作业,以确保参与者完全理解课程材料。这可能是当今唯一一门专门关注数据科学在房地产中的应用的课程。
结论
房地产行业可能刚刚开始向更多使用数据和数据驱动的决策转变。各种创业公司和前瞻性机构现在开始释放巨大的机会。如上所述,有一系列具体的方法将数据科学应用于房地产,以帮助从数百万行数据转变为对过去、现在和未来房地产子市场表现的精细理解,并做出卓越的投资和业务决策。
然而,在这个行业中,很大一部分人可能经常缺乏所需的技能。现在有机会学习这些技术和方法——特别是针对房地产——投资时间进行升级可以使一系列参与者受益。房地产研究人员可以开始使用数据和机器学习来产生改变游戏规则的见解,并释放大数据集的价值。那些在 Proptech 行业的人(甚至是投资 Proptech 的人)可以更好地理解这些方法,并建立(或投资)颠覆性的活动。最后,学习这些方法的房地产投资者可以使用数据驱动的方法来寻找特殊的机会,战胜市场。
COVID 之后更有效地交流数据的 5 种方法

沃洛季米尔·赫里先科在 Unsplash 上的照片
远程时如何更有效
D 数据科学是一项协作性很强的工作——你不断地与来自各种不同角色和背景的同事互动。在一天之内,您可以与工程师、产品经理、其他数据科学家、运营人员、设计师等会面。面对如此多样化的团队成员,交流数据是一件很难做好的事情。现在协作是虚拟的,交流变得有点困难。
由于我们大多数人现在都在家工作,我们应该采取一些额外的措施来与他人交流数据。这篇文章介绍了一些快速实用的技巧,这些技巧在任何情况下都会对所有的队友和同事有所帮助。其中一些提示可能看起来很明显,所以如果你已经在做了,那就太好了——然而,阅读这篇文章的其他人很可能会发现这些提示真的很有帮助。
通过在你的日常工作流程中实施这些技巧,你能够在几个关键方面使每个人受益:
- 释放您的时间:如果您积极投入时间使数据更容易访问/理解,您就能够节省未来回答临时问题或在问题最终出现时撰写问题的时间。
- 了解你 3 个月前做了什么:有多少次你不得不翻出几个月前做的一份分析?我个人发现自己一周要做好几次。这些建议应该有助于与未来的自己沟通,因为你可以很容易地从过去寻找一些东西,了解你做了什么,你做了什么假设,这样你就可以做类似的分析,或者用当前的评论分享过去的结果。
- 授权给你的同事: 这是最重要的一条,因为这是你被团队聘为分析人员的原因。帮助您的团队成员以他们熟悉的方式访问数据(SQL 代码、Excel 中的汇总/采样数据、仪表板等)。),这使他们能够更多地接触数据,从而提高工作效率。内部数据是公司拥有的最有价值的东西之一,如果你能够帮助你的同事有效地使用这些数据,那将是一个巨大的胜利。
1.简单的仪表板非常有用
了解如何创建仪表板是数据科学家可能拥有的最重要的技能之一。如果数据科学家工作的两个主要方面是分析和交流数据,仪表板是两者结合的完美媒介。

由于现在一切都很遥远,拥有一个简单的仪表板应该可以回答你的队友可能会有的问题,并且应该可以显著减少随机收件箱,以便你可以专注于你的工作。
对于较小的项目和功能来说,创建一个仪表板在一开始看起来似乎有点大材小用。但是,如果您已经精通公司的仪表板工具,那么创建一个只有几个图形和表格的仪表板将会比您本来要编写的查询多花几分钟的时间。不仅如此,为更小的计划指定一个仪表板会给那些想利用自己的时间跟踪和查看数据的同事留下深刻印象。
一旦您创建了仪表板,它就可以很容易地与公司中的任何人共享,并且可以帮助团队在一组集中的指标和统计数据上保持一致。出于更自私的原因,从长远来看,您的仪表板将最终节省您的时间,因为它将有助于避免误解,并减少未来的入站数据请求。
2.慷慨地超链接

照片由 Fré Sonneveld 在 Unsplash 上拍摄
无论你是在 Google Sheets 中做分析,写一条松散的信息,写一封电子邮件,还是使用 markdown——有更多的链接几乎总是更好。好的分析应该做两件事:
- 引发更多问题
- 基于之前的分析/研究
在上述两种情况下,都有相关的东西可以联系起来。拥有可访问的链接更有可能让你的队友理解你的分析。话虽如此,我还是想做一个明确的区分:避免直接粘贴链接,因为这样不美观,会占用很多空间,有时还不可点击——使用超链接!
想象一下,如果维基百科有一堆直接粘贴在文章中的 url,那将是一种可怕的体验!此外,使用维基百科作为灵感,养成超链接的习惯。这些链接不会分散你对文章的注意力,还会激发你的好奇心,因为你可能会因为点击一个超级链接的兔子洞而迷失几个小时。

看看这些链接!
了解你用来分享数据和分析的所有不同平台的热键和语法,并经常链接。
- 大多数情况下:
ctrl/cmd + k会允许你创建一个超链接 - 降价:
[hyperlink text](url) - 懈怠:
ctrl/cmd + shift + u
3.总是分享相关的查询/代码
扩展上面的超链接主题,我们想让我们的分析尽可能容易理解。即使你认为没有人会看你的代码,链接它仍然是有用的,以防你回头看它。如果您的同事能够在他们自己的工作中利用您的代码/查询,那么他们会非常感谢这种姿态。
我与我的队友分享我的查询/代码的一些方式:
- 粘贴:最简单的方法是,将文档本身的代码粘贴到附录部分的底部。这对于较短的查询来说已经足够了。你也可以看看插件或工具,如代码块(用于谷歌文档)来帮助你。在 slack 和 markdown 中,可以使用``来创建代码块。
- 链接:使用剪贴板或粘贴工具,你可以粘贴你的代码并生成一个超链接来共享代码。例如,你有粘贴代码,但是很可能有内部工具可以做到这一点(更安全)。如果你在 Github 上有你的代码,这只是一个 Github 链接。

- 附件:将代码文件直接作为附件共享。一般来说,你希望避免这种情况,因为这确实需要另一方采取一些额外的步骤。
- 数据:如果你的队友不知道如何使用 SQL,或者如果查询需要很长时间才能运行,那么以 csv 格式导出数据集或样本可能会有所帮助,将它们发送过来,以便他们可以直接进入数据。
4.语境!
这更适合 Slack、微软团队或其他用于协作的消息平台。如果你在一个频道上分享一个快速更新,预计会有一些人不太参与其中。尤其是在较大的频道上,或者如果你的信息被分享到不同的频道/群组。
思考这些案例,你要养成添加一两个引导句的习惯,以设置的背景,为什么你要分享某个更新,为什么它很重要,以及自从上次更新以来它有什么变化。这个手势让分享你的作品变得更加容易。你想让你的团队更加知情而不是困惑。
5.四舍五入你的数字
这是一个更通用的提示,但是这是你能做的最省力的事情来减少误解,让对方明白你的意思。
这是一个非常简单的提示:你想让你的数据尽可能容易阅读。如果你的图表/表格有一堆很长的数字,你的队友会很难读懂。花几秒钟时间想想你应该用多少有效数字来表达这个观点。这看起来像是一个小调整,但它是帮助你的队友理解关键指标的最有效的方法之一,因为它将你的队友锁定在正确的关注点上。舍入对于小数字和非常大的数字都很重要。

小数字:右易于阅读。

大数:右易读。
结束想法
希望这些提示对你有所帮助,或者已经在你的日常工作中使用了。它们不应该花太多时间去实现,一旦你养成了这样做的习惯,你的队友会更加欣赏你。
Python 中控制属性的 5 种方法。Led 指南示例
在点上发生了什么。

图片由 Unsplash 通过 @joannakosinska 提供
介绍
可以通过控制属性值及其访问来保护数据完整性。当创建一个类时,我们可能希望确保所有将来的对象都具有正确数据类型的属性,和/或合理/适当的值。我们可能还希望确保一旦设置了属性,就不能更改或删除它们的值。为此,必须创建只读和删除证明属性。
接受姓名、年龄和服务年限作为参数的 Employee 类可能希望确保姓名是一个字符串,年龄和服务年限是整数,然后在创建的对象中将它们设置为属性。这个类可能还希望确保像名称这样的属性不能被修改或删除。
属性验证可以帮助确保有效的数据输入,即使在类的用户可能输入不太理想的用户信息的情况下,例如,小写的姓名。这篇教程文章将探索 5 种不同的方法来确保属性验证,即通过 magic/dunder 方法和 decorators。当在类中定义的方法中使用属性本身时,属性完整性非常重要。这就是为什么在对象中设置属性之前,应该检查它的值。
示例 1: dunder _setattr,delattr
Python 中的 magic 或 dunder _setattr 和 delattr 方法代表了程序员控制属性的一种方式。为了说明,让我们初始化一个名为 Employees 的类。这个类将接受 3 个参数,并将它们设置为对象中的属性。
为了展示我们如何对属性施加控制,让我们建立我们希望为 Employees 对象实现的行为。
- _name 属性值应该是大写的,不管用户是否选择以大写格式输入 name 属性。
- _name 属性应该只允许设置一次。一旦设置好,名称属性将变成只读的。
- _age 和 _service_length 属性应该是整数。如果它们不是 TypeError,将引发异常。
- 不能删除 _name 属性
dunder setattr
dunder setattr 方法将对象、键以及我们希望在对象中设置的值作为参数。我们首先检查具有属性' _name '的对象是否已经具有属性 name。如果是这样,我们将引发一个 AttributeError,因为我们不希望 name 属性被重置。在下面的 elif 语句中,如果对象没有 name 属性,我们将设置它,并使用 string title 方法将其大写。
在第一个 if 语句中,我们首先检查是否已经设置了属性' _name '。如果已经在 init 方法中设置了它,用户将无法重新设置它,然后它将成为一个只读属性。
setattr 方法的第一个 if 和 elif 块中的逻辑解决了上面的第 1 点和第 2 点。现在,让我们检查第 3 点的年龄和服务年限属性的数据类型。
对于' _age '和' _service_length '属性,我们使用内置的 Python isinstance 函数检查它们的类型是否为 int。如果它们是除 int 之外的任何类型,将引发 TypeError 异常。
最后,让我们解决第 4 点,并实现代码来防止名称属性的删除。为了便于讨论,让我们假设,名字一旦被设定,就不能被删除并永久存在。
因此,当我们试图从对象中删除 name 属性时,会引发一个 AttributeError 异常,通知用户不能删除该属性。在幕后,del 关键字调用 delattr 方法。由于我们在类中定义了它,所以它会调用我们的自定义版本 delattr。但是,我们仍然允许删除任何其他属性的行为。
注意,在所示的代码片段中,我们如下所示设置和删除属性,以避免递归错误。
下面通过 GitHub gist 显示了我们的 Employee 类的代码,可以通过这个链接获得。
为了测试我们已经实现的自定义行为,让我们创建一个 Employees 类的实例,并检查 name 属性是否可以设置、不能重置和不能删除。此外,我们可以检查年龄和服务年限属性的类型。
重置 name 属性失败,并通知用户程序终止的原因。

当我们遍历属性字典并打印它们的类型时,我们可以看到年龄和服务年限是 int 类型。

最后,当我们试图删除属性名时,会引发一个 AttributeError 异常,用字符串消息通知用户不能删除该属性。

我们现在已经成功地制定了我们想要的习俗行为。虽然这些例子是虚构的,但它们确实说明了我们如何使用 Python 中的 setattr 和 delattr 方法来控制属性。如果你想尝试所示的例子,完整的代码可以通过这个链接获得。
控制对象属性的替代方法
以下示例展示了在 Python 中控制属性的替代方法。附带说一句,我并不认为它们是控制属性的最佳方式,相反,替代方式意味着可以增加您在 Python 中使用的工具库。
下一节将介绍使用 decorators 管理属性的示例指南。
使用装饰者
示例 2:使用@staticmethod 装饰器
为了保持连续性,在前面的示例中将初始化相同的雇员类。这里,staticmethod decorator 可以用来检查对象中的属性值。具体来说,我们希望 age 和 service_length 属性值都是 int 类型。
为此,我们可以在我们的类中定义一个 data_type_check 方法,并用 staticmethod decorator 来修饰它。当在 init 构造函数中设置属性时,我们调用对象上的 data_type_check 方法,并传入 age 或 service_length 作为参数。如果年龄和服务年限是 int 类型,它们将被返回并设置为我们的对象中的属性。如果它们不是 int 类型,将引发类型错误异常。
使用 staticmethod 装饰器的一个好处是它的可重用性。例如,如果我们在 init 方法中添加了一个 annual bonus 参数,我们可以简单地再次调用 staticmethod decorator 并将 bonus 作为参数传递。
示例 3:使用自定义装饰器
另一种控制属性值的方法是通过一个自定义装饰器。为了与我们的主题保持一致,让我们创建同一个类,但是这次用一个名为 attr_check 的函数来修饰 init 构造函数方法。
当我们创建 Employee 类的实例时,init 方法将被自动调用。当 attr_check 函数修饰 init 方法时,将调用这个函数。attr_check 将 init 方法作为参数,并返回 inner。当我们用我们的对象 ref、age 和 service 调用 inner 时,我们可以对 age 和 service 执行类型检查。如果年龄和服务的类型是 int,我们将返回带有对象、名称、年龄和服务以及参数的原始 init 方法。
这个实现是用 Python 控制属性值的好方法,因为我们可以选择什么进入 inner 的主体。在这种情况下,我们没有对姓名执行任何类型检查,也没有对年龄执行任何范围限制,但是我们可以通过扩展内部函数中定义的代码来简单地添加这些检查。
示例 4:使用@property/setter/deleter 装饰器
Python 中控制属性值的另一种方法是使用属性装饰器及其相应的 setter 和 deleter 方法。
让我们再次创建我们的雇员类。当用户试图通过 object.attribute 语法访问 name 属性时,将用@property 修饰的 name 方法将被调用,名称将以大写形式返回。
这一次,如果用户想要更改 name 属性,让我们确保他们输入的任何字符串都是大写的。我们可以通过定义一个简单的 name 方法以及相应的 setter 和 deleter 方法来实现这一点。
我们定义了 name 方法,并用@name.setter 修饰它。当用户想要使用 object.attribute 语法设置一个新名称时,对象中设置的新名称现在将被大写。
注意,名称属性' _name '的基础名称不同于方法的名称,以避免递归错误。我们不能在 setter 方法的主体中包含 self.name = new_name.title()。
示例 init 构造函数中的条件检查
结束这篇关于属性控制的文章,实现属性完整性的最简单的方法实际上可能是在类本身的 init 构造函数中包含条件检查。这里,我们允许员工的年龄大于或等于 18 岁,小于或等于 100 岁。如果满足条件,我们可以将 init 方法中作为参数提供的年龄设置为对象中的属性值。当创建的实例不满足此条件时,将引发 AttributeError 异常,并通过一条有用的字符串消息通知用户所需的条件。
摘要
感谢您的阅读,我希望您喜欢控制属性访问及其值的不同方式。虽然我主要关注的是数据类型检查和范围允许,但是任何可以想象到的条件都可以施加在属性值上。电子邮件地址在设置前可能会使用 regex 进行验证,以符合数据完整性。
我在这里特意使用了一些基本的例子来帮助传达控制属性值和访问的多种方法是如何工作的。此外,描述符是 Python 中管理属性的另一种方式,我希望能写一篇关于如何使用它们的教程。如果你有任何问题,或者想要更多关于这个主题的文章,请通过 LinkedIn 告诉我。
让你的百万美元实验失败的 5 种方法
实验和因果推理
A/B 测试方式正确

在 Unsplash 上由 Keyur Nandaniya 拍摄的照片
产品发布前的实验已经成为大型科技公司的一个固有部分(例如,和 Airbnb )。俗话说,没有对你的客户进行 A/B 测试,就不能做出任何商业决策。
真的!
业务实验提供了丰富的客户行为信息,帮助我们更好地理解客户思维和行为之间的差距。
人们的想法和行为不同。通常,他们告诉你一件事,却做了相反的事情。
不做实验,就无法知道顾客对新产品的反应。这就像盲人测量大象的大小:我们没有得到完整的画面。
像任何研究方法一样,实验方法也有缺点和假设,但即使假设被违反,行业人士也经常使用它。如果这种情况发生(不幸的是),我们可能会面临最不可取的情况:用虚假证据做出决策。
虚假信息比没有证据更糟糕。
如果没有信息,我们不会做出决定,但是错误的信息会导致错误的决定。在今天的帖子中,我详细阐述了可能会毁掉你价值数百万美元的实验的五个常见错误,以及每种情况下的应对策略
我已经写了几篇关于商业实验的文章。来看看吧: 为什么实验自然实验其**,还有 做了 )。****
因果推理和实验
在这里,我会试着给你一个关于因果推断&实验的概述,以及为什么它很重要。在日常工作中,我们会问自己这样的问题:“新的用户界面增加了 DAU 吗?”“是什么因素导致了下一个百万注册?”
****因果推理是追溯根本原因并评估其对相关结果的影响的过程。
通过保持其他因素不变,同时每次只改变一个变量,实验可以帮助我们找到因果关系。如果不能随机赋值,数据科学家可以选择准实验(五招)和观察方法(如配对、倾向评分匹配)做因果推断。
简单来说,因果推断始于可比的实验组,止于差异化的结果。首先,如果实验组(治疗组和对照组)不相等,那么研究设计就是有缺陷的。
让我们深入研究主菜。
1.仔细选择你的度量标准
数据科学家需要建立一个度量标准来衡量我们实验的性能,一个糟糕的度量标准可能会扼杀实验。
例如,一家零售公司的季度销售数据滞后,但管理团队仍然希望通过大规模促销来实现既定目标。
数据团队提出了一个实验设计,表明 50%的折扣可以达到目的。你应该按计划推出促销活动吗?
大概,不是!
促销可能会增加短期指标,但会降低长期利润,因为客户会购买他们现在需要的所有东西,并且不会很快再次购买。
选择有效的指标和你的研究设计本身一样重要。最不希望看到的就是各个板块之间的自相残杀。
该怎么办?
- 与主要的商业利益相关者合作,提出主要和次要的利益衡量标准
- 了解选择的权衡
- 如有必要,在实验之前、之中和之后,回到指标上来
- 根据经验,实验讲述了一个关于短期指标的好故事,但是在长期性能方面有所欠缺
2。有问题的实验设计
如上所述,数据科学家需要检查实验组在关键协变量方面是否具有可比性(“同类比较”)。否则,结果可能不成立。
某些设计在业内广受欢迎,但不适用于因果推理。其中,一组前后对比设计和治疗组和非治疗组设计脱颖而出!
下面分别是这两种设计的两个例子。在推出新的用户界面后,我们看到一些指标(如 DAU)有所提高,所以更新版本是正确的选择。与对照组相比,治疗组带来了更多的收入,因此治疗有效。
这些设计不提供“苹果对苹果”的比较!治疗组可能与对照组根本不同,这使得任何直接的比较都成问题。这是因果推理中的一个典型问题,叫做选择偏差。
此外,没有办法排除其他解释的可能性。例如,除了 UI 更新之外,还有其他重大变化。
该怎么办?
- 与工程团队一起检查数据的可用性。
- 治疗组与对照组相似吗?如果没有,你采取了什么措施?

乔治·贝尔在 Unsplash 上的照片
3。过早结束你的实验
我们仔细选择了反映商业利益的指标,并有意使实验组具有可比性。令人惊喜的是,指标出现了正增长。我们现在可以结束实验了吗?
当有积极的发现时,这样做是很有诱惑力的。顺便说一句,这是一个常见的认知谬误——人类倾向于确认我们所期待的。
不过,我的建议是等一等,看看结果“ 是否回归均值。 “指标的正跳可能只是一个小故障,稍过一会儿就会消失。
做什么?
- 获得初步结果后继续运行
- 这里有一个窍门:在数据有限的情况下,我们可以通过分配和取消来创造更多的数据点。多次重复该过程
- 检查治疗组和对照组如何随时间变化
4。溢出效应和污染
这里,关键问题是:治疗组是否与对照组接触?如果是这样,结果可能会被溢出效应所污染。
假设,实验随机分配治疗给住在附近的个人用户。治疗组和对照组可能会互相交谈,而对照组会无意中接受治疗。
第四个错误和最后一个密切相关,后面可以看出来。
该怎么办?
- 与您的工程团队交流:您可以在什么级别上随机化您的处理(例如,用户级别、城市范围、URL)?
- 你的实验小组互相合作吗?如果是这样,改变随机分配的级别。
5.随机化不那么随机
对于 A/B 测试和任何其他采用随机化的实验设计,数据科学家应该问的首要问题是:这真的是随机分配吗?
这听起来很矛盾,但是一个随机的过程并不能保证一个随机的赋值!
有一些外部因素导致一些群体比其他群体更有可能参与治疗组。
与前一点相关,在个体 URL 的随机化过程可能是不可行的交叉污染 b/c。那么,我们将选择市级随机化。
仔细想想最低级的随机分配。
该怎么办?
- 这是一个具有挑战性的问题!它涉及到对实验平台的透彻理解,并能够区分细微的差别。
- 单位层面随机化?网址?市级?
- 你的工程团队更了解什么是可能的,什么是不可能的。
结论
这篇文章涵盖了实验失败的五种主要方式:度量、研究设计、时机、溢出和随机化。古语有云:细节是魔鬼!数据科学家应该在推出实验时检查这五个常见错误。
喜欢读这本书吗?
还有,看看我其他关于人工智能和机器学习的帖子。
新冠肺炎时代提高数据科学技能的 5 种方法

在 Unsplash 上由 niklas_hamann 拍摄的照片
*** 披露:下面的一些链接是附属链接,意思是,在没有额外费用的情况下,如果你点击,我会赚取佣金。请记住,我链接这些产品是因为它们的质量。我是一个独立的博客作者,评论是根据我自己的观点完成的。***
世界性的新冠肺炎疫情造成了一个前所未有的、紧张的、不确定的时代。这个世界被完全封锁了,我们都必须尽自己的一份力量,通过练习负责任的社交距离和尽可能待在室内来互相帮助。在目前的情况下,很容易感到不知所措,在新的日常工作中保持高效的感觉会非常困难。
就我个人而言,自从我在家工作以来,我一直在努力将我的“在家工作时间”和“个人时间”分开,这导致我的工作/生活平衡严重倾向于“工作”方面。当我想转换工作模式时,我最喜欢做的事情是在布鲁克林的街区散步,在公园里看书,或者去当地的咖啡店。因为那已经不可能了,我不得不延长工作时间,因为我一直觉得我做得不够。我的个人时间缺乏目标,这促使我重新评估我想如何度过它。隔离让我有时间思考我的职业道路,以及在这场危机结束后,我现在可以做些什么来更好地定位自己,以实现这些目标。
在这个不确定的时刻,有一件事我可以肯定地说:有这种感觉的不止我一个人。这种幽居病的压抑感正在影响着世界上的每一个人。这段时间我一直记得的一个建议是‘控制可控的。这个世界充满了太多我们无法控制的事情,所以重要的是不要不知所措,把注意力放在日常生活中你可以控制的事情上。你能控制的一件事就是每天提高和投资自己!
我为那些有空闲时间并希望推动自己学习新的数据科学技能或温习现有技能的人创建了这个博客。我希望这能让你分心或者鼓励你好好利用你的额外时间!

艾玛·马修斯数字内容制作在 Unsplash 拍摄的照片
1.通过在线课程学习新的数据科学技能
学习一项新技能最难的部分是知道如何以及从哪里开始。好消息是,有大量的在线课程材料和资源是面向自主学习者的(比如你!).有在线教程和讲座可以学习特定的数据科学工具或更广泛的概念。
以下是众多可用资源中的几个:
骏马—
- 优点:我喜欢 Coursera 的一点是,它提供了大量不同编程语言的免费课程。解释往往非常清晰简洁。也倾向于通过例子和练习来真正掌握概念。
- 缺点:反馈和问题评审可能会很慢/延迟,这会令人沮丧。
—
- 优点:这里有很多价格低廉(大约 10 美元)的课程可供选择,你可以按照自己的进度进行。
- 缺点:任何人都可以发布课程,所以请确保你选择的课程是由你正在寻找的领域的专家创建的。考之前一定要看班级的评分。
领英学习—
- 优点: Linkedin Learning 是一个易于使用的网站,你可以直接连接到你的 Linkedin 个人资料,这样你就可以跨平台分享你的技能和兴趣。
- 缺点:这些课程往往主要面向初学者,因此可能没有太多面向高级数据科学家的课程。还缺乏认证,这有点令人失望,因为 Linkedin Learning 是一个付费服务提供商(每月约 30 美元)。
data camp—
- 优点: DataCamp 创建的唯一目的是在线学习数据科学。这个平台在一个易于使用的网站上提供了各种各样的优质内容。定价也是透明的,并提供了多种方案选择。
- 缺点:大部分内容都是非常沉重的文字,这可能会令人沮丧,尤其是对初学者来说。一些评论指出,这些课程可能有点“手把手”,没有提供足够的练习问题。
无论如何,这些都不是唯一的资源!如果你预算紧张,YouTube 上还有大量免费的数据科学频道,这样你就可以开始学习了!
2.博客
如果你知道你很难理解某个主题或概念,可以在 Medium、Towards Data Science、Analytics Vidhya 等网站上寻找其他数据科学家的博客。你一定会找到一个或多个博客,在 10-15 分钟内清晰简明地解释令人困惑的概念。
如果你真的想挑战自己,我强烈建议你就自己不熟悉的概念写自己的数据科学博客。通过阅读写作过程,它将帮助你更完整地掌握主题方式,从而能够将它传授给其他人。我个人认为这是一个非常有用的方法,虽然很费时间,但却非常有价值,因为当你完成它时,你会有成就感,这也是你可以添加到你未来求职的文件夹中的东西。成为一名博客写手显示了你的创新精神,让招聘人员看到你是如何将复杂的概念传达给更广泛的受众的,这是一项非常有价值的技能!
3.数据科学书籍
在数据科学家教育旅程的各个不同阶段,他们都可以获得大量易于理解且信息量极大的阅读材料。

适合初学数据的科学家:
- 查尔斯·惠兰著 裸统计——这是一本快速有趣的读物,向你介绍统计学的重要性,并使用数学概念的真实例子。对于刚开始接触数据科学领域的人来说,这是一本非常棒的入门书籍!**
- Think Stats:Probability and Statistics for Programmers作者 Allen B. Downey-* 这是一本学习简单有用的 Python 技术来探索真实世界数据的好书。*
- 数据科学从零开始**作者 Joel Grus —这一篇对于完全的初学者来说非常棒。这本书甚至不需要 Python 背景!**
对于中级数据科学家:
- 用于数据分析的 Python作者 Wes McKinney——这是一本向你展示像 NumPy 或 pandas 这样的标准 Python 库的来龙去脉的书。
- Jake VanderPlas 撰写的 Python 数据科学手册——是一个全面的伟大指南,它介绍了使用的标准 Python 库,如 NumPy、pandas、Scikit-learn 和 Matplotlib。
针对高级数据科学家:
- 深度学习用 Python 作者 Francois Chollet——Francois Chollet 是 Keras 的创建者,Keras 是 Python 中使用最广泛、最流行的机器学习库之一。这本书是希望利用深度学习的数据科学家的必要读物。
- 深度学习 由伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔编写- 由该领域三位专家撰写的深度学习综合教材。
4.练习技能
得到一份数据科学家的工作最令人生畏的部分之一是通过技术面试。是时候投入一些时间来温习获得新工作所必需的技术编码技能了!每天只需投入半小时到一小时的练习,你就可以成倍地提高你的自信和编码技能。以下是练习所有不同编程语言的一些资源:
- hacker rank—是一个来自世界各地的程序员聚集在一起解决广泛的计算机科学领域(如算法、机器学习或人工智能)的问题,以及实践不同编程范式(如函数式编程)的地方。
- exercim . io——这个平台有 50 种不同的编码语言可供选择!您可以完成不同的编码挑战,并上传您的解决方案供导师审阅。这是学习新技术和新思想的好方法。
- top coder——是最早上线的竞争性编码平台之一。还有文章和论坛帮助你学习新技能!
- leet code——提供你可以直接解决的编码挑战。这个平台还有一个“模拟面试”部分,为你下一次工作面试做准备!
如果你正在准备技术面试,并且有更多的时间,Udacity 的 【数据科学面试准备】 等课程都是免费在线提供的。
5.开始一个副业
在我看来,没有比完成兼职项目更好的方法来提高您的数据科学知识或技能。我个人最喜欢的是Kaggle。Kaggle 是一个在线数据科学平台,为数据科学家、数据矿工和统计学家举办预测建模和分析比赛。公司和研究人员发布来自所有不同领域的数据集,人们争夺最佳的探索性数据分析和预测模型。Kaggle 是学习真实世界数据的绝佳资源。它还允许您查看其他数据科学家的笔记本以及他们如何处理数据!这对于那些没有该领域背景,但希望深入了解数据分析背后的思维过程的人来说非常有帮助。它也是一个社区,人们可以在这里提出建设性的批评或新的想法,以创建最佳的可能模式。

法比安·格罗斯在 Unsplash 上拍摄的照片
启动您自己的项目的其他数据资源有:
五三八
UCI 机器学习知识库
Data.gov
谷歌公共数据集
这些只是数据科学家可以公开获得的众多资源中的一小部分。只需选择一个数据集,然后开始行动!这是您建立数据科学技能和项目组合的绝佳机会,您可以在下次面试时谈论/展示这些技能和项目!通过参加数据科学竞赛或独立完成兼职项目,这表明您在个人生活中拥有不断学习和改进的主动性和动力。
谢谢你花时间阅读我的博文!
我祝你在不断提高自己的旅途中好运,我希望你在进入明天的时候知道你已经比前一天做得更好了!
本帖引用:
- https://www.coursera.org/
- https://www.udemy.com/
- https://www.linkedin.com/learning/me
- https://www.datacamp.com/
- https://www . Amazon . com/Naked-Statistics-Stripping-Dread-Data-ebook/DP/b 007 q 6 xlf 2
- https://www . Amazon . com/Think-Stats-Allen-B-Downey/DP/1449307116
- https://www . Amazon . com/Data-Science-Scratch-Principles-Python/DP/149190142 x
- https://www . Amazon . com/Python-Data-Analysis-Wrangling-IPython/DP/1449319793
- https://www.amazon.com/gp/product/1491912057/ref=as_li_tl?ie = UTF8&camp = 1789&creative = 9325&creative asin = 1491912057&link code = as2&tag = petacrunch-20&linkId = 3882 a 97 FD 104467 b 624 bad 3 e 5 ff 5431 b
- 【https://www.amazon.com/gp/product/1617294438/ref=as_li_tl? ie = UTF8&camp = 1789&creative = 9325&creative asin = 1617294438&link code = as2&tag = petacrunch-20&linkId = fa 7304 c 5324 df 649 a4ba 536 BD 74927 D2
- https://www . Amazon . com/Deep-Learning-Adaptive-computing-Machine/DP/0262035618
- https://www.hackerrank.com/dashboard
- https://exercism.io/
- https://www.topcoder.com/challenges/?pageIndex=1
- https://leetcode.com/
- https://www.kaggle.com/
- https://fivethirtyeight.com/
- http://archive.ics.uci.edu/ml/index.php
- https://www.data.gov/
- https://cloud.google.com/public-datasets
使用 JavaScript 查询关系数据库的 5 种方法

图片在 Shutterstock.com和 T2的许可下使用
如果您正在开发 web 应用程序,您几乎肯定会不断地与数据库进行交互。当需要选择方式互动时,选择会让人不知所措。
在本文中,我们将详细探讨使用 JavaScript 与数据库交互的 5 种不同方式,并讨论每种方式的优缺点。我们将从最底层的选择——SQL 命令——开始,然后进入更高层的抽象。
为 JavaScript 应用程序选择正确的数据库库会对代码的可维护性、可伸缩性和性能产生很大的影响,所以花一些时间来找出您的选择是值得的。
我们的示例应用程序
我们将使用一个托管在 Heroku 上的普通 Express 应用程序作为例子。本文的所有代码都在这个 GitHub 库中。随意克隆它并跟随它。
先决条件
要运行示例应用程序,您的机器上需要以下软件:
- 一个类似 unix 的终端环境(Mac OSX 和 Linux 都可以。如果你使用的是 Windows,你将需要用于 Linux 的 Windows 子系统。
- git (还有一个 github 账号)。
- npm (版本 6 或更高版本)。
- Heroku 命令行工具。
如果你还没有 Heroku 账户,你需要注册一个免费账户。如果你不想注册 Heroku,你也可以在本地 Postgres 实例上运行应用程序。如果您对此感到满意,应该很容易看到您需要做哪些更改,而不是部署到 Heroku。
一旦你安装了以上所有的东西,在终端中运行heroku login,你就可以开始了。
构建和部署 Hello World 应用程序
首先,我们将设置以下内容:
- 一个普通的 Express 应用程序,只提供一个“Hello,World”网页。
- 一个 Postgres 数据库。
- 两个表,分别代表“用户”和“评论”(一个用户有很多评论)。
- 一些样本数据(在这种情况下,通过mockaroo.com生成)。
我已经创建了一个示例应用程序,它将为您设置所有这些(假设您已经如上所述运行了heroku login)。要设置它,请从命令行执行以下命令:
git clone [https://github.com/digitalronin/query-database-javascript.git](https://github.com/digitalronin/query-database-javascript.git)
cd query-database-javascript make setup
这需要几分钟才能完成。在您等待的时候,您可以查看 makefile 来查看相关的命令,这些命令执行以下操作:
- 创建一个新的 Heroku 应用程序。
- 添加 Postgres 数据库实例。
- 将应用程序部署到 Heroku。
- 在 Heroku 上运行一个命令来设置数据库表并导入 CSV 示例数据。
- 在新的浏览器窗口中打开 Heroku 应用程序的 URL。
在此过程结束时,您应该会在网页上看到“Hello,World”。
使用 SQL 提取数据
好了,我们都准备好了!我们已经创建了一个包含两个表和一些示例数据的数据库。但是我们还没有做任何事情。下一步是让我们的 web 应用程序能够从数据库中检索数据。
无论何时与关系数据库交互,都是通过向数据库正在监听的网络套接字发送 SQL 命令来实现的。对于本文中我们将要研究的所有库来说都是如此——在最底层,它们都向数据库发送 SQL 命令,并检索返回的任何输出。
因此,我们要考虑的与数据库交互的第一种方式就是这样做——发送 SQL 命令。为此,我们将安装 pg JavaScript 库,它允许我们向 Postgres 数据库发送 SQL 并检索结果。
要安装 pg 库,请执行以下命令:
npm install pg
这将获取并安装这个库,并将它添加到 package.json 和 package-lock.json 文件中。让我们提交这些更改:
git add package.json package-lock.json git
commit -m "Install the pg library"
要与我们的数据库对话,我们需要一些详细信息:
- 运行 Postgres 的机器的主机名。
- Postgres 正在监听的网络端口。
- 我们的数据所在的数据库的名称。
- 有权访问数据的用户名和密码。
大多数数据库库会让我们建立一个连接,要么通过向库中提供一个对象,该对象包含所有这些细节的键和值,要么通过将它们组合成一个“数据库 URL”,这就是我们将要做的。
当您向 Heroku 应用程序添加数据库时,您会自动获得一个名为 DATABASE_URL 的环境变量,其中包含连接数据库所需的所有详细信息。您可以通过运行以下命令来查看 DATABASE_URL 的值:
heroku config
这将输出您的应用程序可以使用的所有环境变量。现在应该只有一个,所以您应该在输出中看到类似这样的内容:
数据库 _ 网址:postgres://clqcouauvejtvw:1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d668864
07a266c0f5b@ec2-52-73-247-67.compute-1.amazonaws.com:5432/dfb3aad8c026in
在我们的例子中,分解如下:
结构化查询语言
{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com", "port": 5432, "database": "dfb3aad8c026in","username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
您的 DATABASE_URL 值会有所不同,但结构是相同的。
现在我们已经安装了 pg 库,并且我们知道如何连接到我们的数据库,让我们执行我们的第一个与数据库交互的例子。我们将简单地获取用户列表,并将它们显示在我们的网页上。在 index.js 文件的顶部,我们需要 pg 库,并创建一个数据库连接对象。
Java Script 语言
const { Pool } = require('pg');const conn = new Pool({ connectionString: process.env.DATABASE_URL });
在express()块中,我们将修改 get 行来调用显示数据库中用户列表的方法:
.get('/', (req, res) => listUsers(req, res))
最后,我们将实现 listUsers 函数:
Java Script 语言
async function listUsers(req, res) {try {const db = await conn.connect()const result = await db.query('SELECT * FROM users');const results = { users: (result) ? result.rows : null};res.render('pages/index', results );db.release();} catch (err) {console.error(err);res.send("Error " + err);}}
这段代码一直等到与我们的数据库建立了连接,然后使用 query 函数发送一个 SQL 查询并检索结果。
现在,这一步可能由于许多不同的原因而失败,所以在代码中,我们进行测试以确保我们获得了一些数据,如果我们获得了一些数据,我们就将 result.rows 分配给 results 对象的关键用户。接下来,我们将结果传递给 render 函数,然后释放数据库连接。
在 views/pages/index.ejs 中,我们可以访问结果对象,因此我们可以像这样显示我们的用户数据:
超文本标记语言
<h1>Users</h1><ul><% users.map((user) => { %><li><%= user.id %> - <%= user.first_name %> <%= user.last_name %></li><% }); %></ul>
你可以在这里看到这些变化的代码。 first_name和last_name是我们数据库的 users 表中两列的名称。
让我们部署这些更改,这样我们就可以在 Heroku 应用程序中看到数据:
git add index.js views/pages/index.ejs
git commit -m "Display a list of users"
git push heroku master
这将需要一两分钟来部署。当该命令执行完毕后,重新加载您的浏览器,您应该会在网页上看到一个用户列表。
MySQL 示例
上面的例子是针对 Postgres 的,但是针对其他常见关系数据库的代码也是类似的。例如,如果您使用的是 MySQL :
- 使用
npm install mysql2而不是npm install pg(使用 mysql2,而不是 MySQL——MySQL 2 更快并且支持异步/等待) - 在 index.js 中,您需要 mysql,如下所示:
const mysql = require('mysql2/promise');
- listUsers 函数如下所示:
Java Script 语言
async function listUsers(req, res) {try {const conn = await mysql.createConnection(process.env.DATABASE_URL);const [rows, fields] = await conn.execute('SELECT * FROM users');const results = { 'users': rows };res.render('pages/index', results );await conn.end();} catch (err) {console.error(err);res.send("Error " + err);}}
视图/页面/索引. ejs 保持不变。
您可以在这里看到带有这些变化的示例项目。
现在,让我们研究几个构建在这个基础之上的库,它们添加了抽象层,让您能够以更“类似 JavaScript”的方式读取和操作数据库数据。
到目前为止,我们已经看到了如何将原始 SQL 发送到数据库;像这样的陈述:
SELECT * FROM users
如果我们想得到某个特定用户的评论,比如说 id 为 1 的用户,我们可以使用这样的代码:
SELECT * FROM comments WHERE user_id = 1
以这种方式与您的数据库进行交互没有任何问题,但是可能会感觉有点麻烦,并且需要您在心理上保持“换档”。您用一种方式考虑您的 JavaScript 代码,但是当您需要考虑数据库中的数据时,您必须开始用 SQL 来考虑。
我们要考虑的其余数据库库的目的是让您将数据库中的数据处理得更像应用程序中的 JavaScript 对象和代码。“在引擎盖下”都是 SQL,但是你不需要太在意这些,除非你想。
Knex —抽象出 SQL
我们要讨论的第一个库是 Knex 。文档页面将 Knex 描述为“查询构建器”,其目的是在原始 SQL 之上提供一个抽象层。
安装 Knex
Knex 需要 pg(或者 MySQL,如果您使用 MySQL 数据库的话)。我们已经安装了 pg,所以我们只需像这样添加 knex:
npm install knex
git add package.json package-lock.json
git commit -m "Install the knex library"
使用 Knex
knex 的 NPM 页面将其描述为“查询生成器”Knex 在一定程度上抽象了 SQL,但不是很远。我们仍然需要理解底层的 SQL,但是我们可以用更像 JavaScript 的语法来编写它,而不是将 SQL 字符串分割成小块。更重要的是,我们可以用一种对 JavaScript 程序员来说更舒服的方式使用组合来链接 knex 术语。
所以,当我们使用 pg 时,我们有这样的声明:
const result = await db.query('SELECT * FROM users');
当我们使用 knex 时,我们可以这样写:
const result = await db.select().from('users');
这可能看起来没有太大的区别,但是由于我们可以编写 knex 函数调用的方式,我们也可以这样做:
const result = await db.select().from('users').limit(5).offset(8);
这里,我们得到了 5 个用户记录,从匹配我们查询的所有可能用户记录的第 8 个位置开始。您可以在 knex 文档中看到全套可用选项。
让我们将 Express 应用程序改为使用 knex 来显示数据库中的一些记录。首先,在 index.js 中替换这两行:
Java Script 语言
const { Pool } = require('pg');
const conn = new Pool({ connectionString: process.env.DATABASE_URL });
…有了这个:
Java Script 语言
const db = require('knex')({
client: 'pg',
connection: process.env.DATABASE_URL
});
然后,将listUsers的实现改为:
Java Script 语言
async function listUsers(req, res) {
try {
const result = await db.select().from('users').limit(5).offset(5);
const results = { 'users': (result) ? result : null};res.render('pages/index', results );
} catch (err) {
console.error(err);res.send("Error " + err);
}
}
我们的 views/pages/index.ejs 文件可以保持和以前完全一样。
提交、推送和部署:
git add index.js
git commit -m "Use knex to display user data"
git push heroku master
当您刷新浏览器时,应该会在页面上看到用户记录 6 到 10。
你可以在这里看到修改后的代码。
对象关系映射
Knex 为我们提供了一种与数据库交互的方式,这更像 JavaScript,但是当我们需要操作数据时,仍然需要以数据库为中心进行思考。
接下来我们要讲的三个库都是建立在 knex 之上的(knex 是建立在 pg 或者 MySQL 之上的),是“对象关系映射”或者 ORM 库的例子。顾名思义,ORM 库的目的是在关系数据库中的数据和应用程序中的 JavaScript 对象之间进行转换。这意味着,当您编写 JavaScript 代码时,不用考虑 users 表中的记录,您可以考虑用户对象。
反对
我们要看的第一个库是 objection ,它构建在 knex 之上:
npm install objection
git add package.json package-lock.json
git commit -m "Install the objection library"
为了突出 ORM 库的一些效用,我们将修改我们的应用程序来显示用户和他们的评论。Objection 构建在 knex 之上,因此在我们的 index.js 文件中,我们必须保留 knex 块,并添加更多的代码(为了简单起见,我将所有内容都放在 index.js 文件中。在真实的应用程序中,您会将代码分成单独的文件):
const { Model } = require('objection');
Model.knex(db);
这给了我们一个模型类,我们可以继承它来定义两个类 User 和 Comment。我们将首先定义注释:
Java Script 语言
class Comment extends Model {static get tableName() {
return 'comments';
}
}
我们的类需要扩展Model,并且必须实现一个tableName函数来告诉 Objection 哪个数据库表包含底层记录。
User类是类似的,但是我们要给我们的类添加一些行为;一个fullName函数,我们可以在视图模板中使用它。我们还将告诉异议Users拥有Comments(即用户拥有零个或多个评论)。用 ORM 的话来说,这通常被描述为“有许多关系”——即一个用户有许多评论。下面是它的代码:
Java Script 语言
class User extends Model {static get tableName() {
return 'users';
}fullName() {
return `${this.first_name} ${this.last_name}`;
}static get relationMappings() {return {
comments: {
relation: Model.HasManyRelation,
modelClass: Comment,
join: {
from: 'users.id',
to: 'comments.user_id'
}
}
};
}
}
我们在我们的User类中定义了一个relationMappings对象,用一个注释键和一个值告诉异议这是Comment类上的一个HasManyRelation,其中 users 表的 id 列的值与 comments 表的 user_id 列的值相匹配。
现在我们已经定义了我们的类,让我们在代码中使用它们。下面是listUsers的新实现:
Java Script 语言
async function listUsers(req, res) {try {
const users = await User.query().limit(5);for (i in users) {
const user = users[i];
user.comments = await User.relatedQuery('comments').for(user.id);
}const results = { 'users': users };res.render('pages/index', results );
} catch (err) {
console.error(err);res.send("Error " + err);
}
}
在这里,我们获取 5 个用户,然后对于每个用户,我们获取他们的评论,并将其分配给用户对象的 comments 属性。在 views/pages/index.ejs 中,我们可以像这样显示我们的用户及其评论:
超文本标记语言
<h1>Users</h1>
<ul>
<% users.map((user) => { %>
<li><%= user.id %> - <%= user.fullName() %></li>
<ul>
<% user.comments.map((comment) => { %>
<li><%= comment.body %></li>
<% }); %>
</ul>
<% }); %>
</ul>
你可以在这里看到修改后的代码。像往常一样,提交并推送部署:
git add index.js views/pages/index.ejs
git commit -m "Show users and comments using Objection"
git push heroku master
现在,当您重新加载页面时,您应该会看到用户和评论。
“N+1 选择”问题
这段代码强调了人们在使用 ORM 库时遇到的一个常见问题,称为“N+1 选择”问题。
这是我们用来获取用户及其评论的代码块:
Java Script 语言
const users = await User.query().limit(5);for (i in users) {
const user = users[i];
user.comments = await User.relatedQuery('comments').for(user.id);
}
这是可行的,但是效率很低。首先,我们获取 5 个用户,然后对于这 5 个用户中的每一个,我们通过再次调用数据库来获取他们的评论。因此,我们为用户打了 1 个电话,然后又打了 5 个电话来获取评论。这是 5 次呼叫加上前 1 次,即 5+1 或 N+1,其中 N == 5。因此出现了“N+1 选择”问题。
除非数据库查询非常复杂,否则往返调用数据库所需的时间要比数据库计算和传输查询结果所需的时间长得多。因此,为了保持应用程序的速度,我们需要尽可能减少对数据库的调用。上面的代码与此完全相反。
对于这个微不足道的例子,您不会注意到任何差异,但是对于真实世界的应用程序,性能影响可能非常严重,并导致许多问题。
幸运的是,每个 ORM 库都有可以轻松避免这个问题的特性(前提是你知道它的存在)。以下是异议是如何做到的:在 index.js 中,将上面的代码块替换为:
const users = await User.query().limit(5).withGraphFetched('comments');
这一行代码与上面的代码块做的一样,但是以一种更加高效的数据库方式。Objection 将使用我们提供的关系信息来确定如何在单个查询中获取用户数据和评论数据,并将结果解包并缝合到我们在使用 for 循环之前构建的同一对象结构中。
你可以在这里看到修改后的代码。
书架
我们要看的下一个 ORM 库是书架。
ORM 库之间的许多差异取决于库针对什么用例进行了优化。在 Bookshelf 的例子中,它的设计显然是为了尽可能容易地呈现数据的分页列表,这在 web 应用程序中是一个非常常见的用例。
让我们在应用程序中将异议替换为书架:
npm uninstall objection
npm install bookshelf
git add package.jsonpackage-lock.json
git commit -m "Replace Objection with Bookshelf"
在 index.js 中,替换这些行:
Java Script 语言
const { Model } = require('objection');
Model.knex(db);
…有了这个:
Java Script 语言
const bookshelf = require('bookshelf')(db);
用这些替换我们的类定义:
Java Script 语言
const Comment = bookshelf.model('Comment', {
tableName: 'comments'
});const User = bookshelf.model('User', {
tableName: 'users',comments() {
// by default, bookshelf infers that the foreign key is 'user_id'
return this.hasMany('Comment');
}});
我们的listUsers函数现在看起来像这样:
Java Script 语言
async function listUsers(req, res) {
try {
const models = await new User()
.fetchPage({
pageSize: 5,
page: 1,
withRelated: ['comments']
});users = [];models.map(m => {
const user = m.attributes;
const comments = m.related('comments');user.comments = comments.map(c => c.attributes);
users.push(user);
});const results = { 'users': users };res.render('pages/index', results );
} catch (err) {
console.error(err);
res.send("Error " + err);
}
}
正如您所看到的,类的定义更简洁一些,但是 Bookshelf 需要一个更详细的定义来说明如何解包我们的数据以构建用户/评论结构。还要注意数据页面的概念是如何直接构建到库的 API 中的。
views/pages/index.ejs 中的代码几乎相同(我已经从 User 类中删除了 fullName 函数):
超文本标记语言
<h1>Users</h1>
<ul>
<% users.map((user) => { %>
<li><%= user.id %> - <%= user.first_name %> <%= user.last_name %></li>
<ul>
<% user.comments.map((comment) => { %>
<li><%= comment.body %></li>
<% }); %>
</ul>
<% }); %>
</ul>
你可以在这里看到这些变化的代码。当然,再次提交和部署。
git add index.js views/pages/index.ejs
git commit -m "Show users and comments using Bookshelf"
git push heroku master
序列
我们要看的最后一个库是 Sequelize 。
Sequelize 对数据的组织方式非常固执己见。如果你遵循它的惯例,你可以写更少的代码,让 Sequelize 为你做很多工作。特别是,Sequelize 有很多特性可以帮助您创建表格,默认情况下,它会按照自己的结构和命名约定来创建表格。
我们一直在使用的数据库的结构并不完全符合 Sequelize 的预期,所以我们需要添加一些额外的配置来允许 Sequelize 使用它。
安装序列
要删除 bookshelf 并安装 sequelize,请运行以下命令:
npm uninstall bookshelf
npm install sequelize
git add package.json package-lock.json
git commit -m "Replace Bookshelf with Sequelize"
使用序列
在 index.js 中,替换这些行:
Java Script 语言
const db = require('knex')({
client: 'pg',
connection: process.env.DATABASE_URL
});const bookshelf = require('bookshelf')(db)
…有了这些:
Java Script 语言
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.DATABASE_URL);
然后,用以下代码替换 User 和 Comment 的类定义:
Java Script 语言
const User = sequelize.define('User', {
first_name: { type: DataTypes.STRING },
last_name: { type: DataTypes.STRING },
email: { type: DataTypes.STRING }
},
{
tableName: 'users',
timestamps: false
}
);const Comment = sequelize.define('Comment', {
body: { type: DataTypes.STRING }
}, {
tableName: 'comments',
timestamps: false
}
);User.hasMany(Comment, { foreignKey: 'user_id' });
注意,我们向sequelize.define传递了两个对象。第一个对象定义了对象的属性,第二个对象包含一些元数据。
在这种情况下,我们告诉 Sequelize,支撑用户类的数据库表称为“users”(默认情况下,Sequelize 会推断该表称为“Users”),而timestamps: false告诉 Sequelize,我们的表没有名为 createdAt 和 updatedAt 的时间戳列。
Sequelize 使得编写为您创建表的代码变得非常容易,当您向数据库写入数据时,它会添加这些时间戳列并相应地设置它们的值。序列文档非常好,有更多关于这方面的内容。
我们传递给 hasMany 的是另一个我们必须告诉 Sequelize 我们没有遵循其惯例的地方。它期望(并将为我们创建)一个名为 UserId 的列,将评论链接到用户。
在我们的listUsers函数中,我们可以替换所有这些代码:
Java Script 语言
const models = await new User().fetchPage({
pageSize: 5,
page: 1,
withRelated: ['comments']
});users = [];models.map(m => {
const user = m.attributes;
const comments = m.related('comments');user.comments = comments.map(c => c.attributes);
users.push(user);
});
…只有这一行:
Java Script 语言
const users = await User.findAll({ include: Comment });
我们还必须在 views/pages/index.ejs 中做一个微小的更改。替换这一行:
<% user.comments.map((comment) => { %>
…与此(区别在于用户。Comments 而不是 user.comments):
<% user.Comments.map((comment) => { %>
你可以在这里看到修改后的代码。
git add index.js views/pages/index.ejs
git commit -m "Show users and comments using Sequelize"
git push heroku master
那么哪个选项是最好的呢?
现在,您有了从 JavaScript 应用程序查询关系数据库的 5 种方法。我们从通过 pg/mysql 库的原始 SQL 开始,然后看了 knex 查询构建器,然后转到三个 ORM 库;反对,书架和顺序。
那么,哪一个才是适合你应用的选择呢?
一如既往,视情况而定。使用 ORM 库,您可以做任何您使用查询构建器甚至原始 SQL 不能做的事情。因为一切都是在“幕后”使用 SQL 工作的。这并不奇怪。此外,即使您决定使用 ORM,大多数库仍然会向您提供将原始 SQL 发送到数据库的方法。所以你使用什么样的抽象层次取决于你试图解决的问题,以及你想关注什么样的代码。
如果您大量使用数据库的特性,可能使用复杂的视图或存储过程,您可能会发现使用 knex 或 raw SQL 更容易。但是,对于大多数 web 应用程序来说,ORM 库很可能会通过抽象出表结构并允许您将应用程序数据视为 JavaScript 对象来简化您的工作。
如果你已经决定使用 ORM,选择使用哪个 ORM 库并不总是一目了然的。JavaScript 库的前景是非常动态的。新的库经常被创建,旧的库就不再受欢迎了。做出选择时,请考虑以下几点:
- 浏览一下库的文档,看看是否清晰全面。然后,决定 API 的组合方式对您是否有意义。不同的库使用不同的方法,您可能会发现其中一种方法比其他方法更适合您的需求和偏好。如果您正在编写使用现有数据库的代码,或者在开发应用程序时创建数据库,这一点尤其正确。
- 看看图书馆周围的社区。这是很多人都在积极使用的东西吗?如果是这样,如果你需要的话,可能会有很多帮助和建议。一些库也有广泛的插件生态系统,可能是特定的插件让你的生活变得更容易。
- 一个相关的问题是图书馆的年龄。如果已经有一段时间了,更有可能是发现并修复了常见问题。如果这是一个相对较新的图书馆,你可能需要自己想出更多的东西(如果你喜欢玩新的闪亮的玩具和解谜,这可能是一件好事)。
- 性能更可能取决于您如何使用库,而不是库本身。但是,如果您绝对必须从应用程序中挤出最后几微秒的延迟,那么使用 SQL 或 knex 在更接近数据库的地方工作会快一点。请注意,这通常是一个很小的好处,代码可维护性的成本很可能高于基准性能的收益。
查询愉快!
学习计算机视觉的 5 种方法
本文列出了一些可以用来学习计算机视觉的方法,这是一个机器学习相关领域。

Alec Favale 在 Unsplash 上的照片
计算机视觉很酷。
别让任何人告诉你不是这样。
我这么说不仅仅是因为我目前是一名计算机视觉工程师,或者因为我获得了计算机视觉硕士学位(显然,我有偏见)。
想象一下你和一些朋友一起吃饭,你的一个朋友说:嘿在这里插入你的名字 ,你在你的工作岗位上做什么。
你回复
“面部识别、身体跟踪、物体探测……詹姆斯·邦德的东西……”。
你的朋友带着纯粹的惊讶和敬畏盯着你。
免责声明:上面的场景很可能不会发生。
但说真的,机器学习(ML)相关领域,如计算机视觉(CV)、数据科学和自然语言处理(NLP),在过去十年中变得相当流行和时尚。
这篇文章将向你展示学习计算机视觉的方法。所以你也可以加入酷俱乐部。
我将强调的方法是我个人用来获得 ML 和 CV 知识的方法。
- 获得硕士学位
- YouTube 视频
- 书籍
- 个人项目
- 网站
- 奖金
如果你熟悉列出的任何一种方法,可以直接跳到不熟悉的部分。
1.硕士学位
获得高级资格证书的价格每年都在上涨,但是在一个新兴领域获得高级学位证书的价值几乎是无价的。

照片由 Honey Yanibel Minaya Cruz 在 Unsplash 上拍摄
我在 2019 年完成了计算机视觉,机器学习和机器人学的硕士学位。如果没有我课程中的机器人部分,我也能完成。然而,事实证明,在三维空间中计算机器人手臂运动学所涉及的数学可以转移到增强现实环境中物体运动的计算。这与我有关,因为我现在在一家专门从事增强现实的公司工作。
我的硕士学位使我能够理解用于物体检测的流行计算机视觉技术背后的理论,如 YOLO 或 RCNNs 。
更重要的是,我发展了一种学术意识和思维方式,这在我目前作为计算机视觉工程师的角色中被证明是有用的。在我的研究中,我阅读了大量关于机器学习和计算机视觉的研究论文。我仍然需要阅读研究论文,理解并运用最先进的方法来解决日常工作中常见的简历问题。
通过硕士学位学习计算机视觉是有用的,原因如下:
- 专注和专注:花 2 -3 个小时写论文或复习考试提高了我的注意力,因为我只专注于一个特定的主题或目标(在截止日期前完成论文)
- 学术理解的发展:无论是在学习期间还是在与 ML 相关的职位上,你都不会停止阅读学术研究论文。
- 求职时脱颖而出:在就业市场上,没有多少人拥有理学硕士或博士学位,因此获得列出的学位之一可以让你在求职时占上风。
- 加深对计算机视觉的理解
- 在我学习期间,我和最聪明的人们在一起,并且和他们中的大多数人保持着联系。我们讨论工作机会、经历、面试技巧,或者分享与 ML 相关的笑话。

2.YouTube 视频
我意识到不是每个人都有时间或资金去攻读硕士学位,但是退而求其次,也可能是更便宜的选择是利用互联网。
YouTube 是一个很好的学习平台,我观看热门频道的 ML/CV 内容,以进一步加深我的理解,提高我的实践技能。
这里有几个 YouTube 频道的例子,可以帮助我学习计算机视觉。
3 蓝色 1 棕色
这个频道的内容是首屈一指的,我怎么赞美这个频道的创作者都不为过。
那些熟悉 3Blue1Brown 的人会同意我的说法,他成功地在 15-20 分钟的短视频中教授了大学讲师数小时的课程。
这个频道教会了我机器学习和神经网络的基础知识,并让数学变得简单。
在机器学习中,理解线性代数、微积分和偏微分等主题是必不可少的。研究神经网络时,理解神经网络的基本组件至关重要。
理解诸如反向传播、消失梯度和不同的神经网络结构等概念也很重要。
如果你想对神经网络中发生的过程有一个简单的解释,下面来自 3Blue1Brown 的播放列表是一个必须观看的节目。
斯坦福计算机视觉
在了解了 ML 和神经网络的基础知识之后,您可以深入斯坦福大学的一些学术会议,这些会议解释了一些常见的计算机视觉技术和算法。
这个播放列表为您提供了一步一步的技术学术知识,使图像分类,对象检测,强化学习,等等。
完成此播放列表将为您提供一些关于计算机视觉算法、技术和方法的一般知识,这些算法、技术和方法目前在自动驾驶汽车、面部识别应用等系统中使用。
请务必做笔记,并记住所介绍的关键术语和概念。
深蜥蜴
如果您对神经网络和一些机器学习算法背后的理论和数学有坚实的掌握,您可以继续进行一些实际项目,并使用公共机器学习库(PyTorch)和编程语言 Python 进行编码。
PyTorch 是一个机器学习框架,它为像你我这样的人提供了从我们的笔记本电脑上实现和启动机器学习解决方案和神经网络架构的工具。PyTorch 是大多数研究人员在实现机器学习解决方案时选择的框架。
Python 是一种现代编程语言,在各种与计算相关的学科中占有一席之地,如 web 开发、服务器开发、软件开发等。这种语言很流行,可以用来实现机器学习解决方案。
Deep Lizard 的视频播放列表会逐步带你了解神经网络实现的过程。你将学习到诸如神经网络训练的图形处理器的利用,数据结构(数组和张量);神经网络层;超参数等等。
有了你积累的所有知识,你也许可以开始一个 ML 项目,在这之后,有了获得入门级计算机视觉工作职位的基本知识。
3.书
文章的这一部分包含一些附属链接。
用 Scikit-Learn 动手机器学习,Keras&tensor flow

使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习
如果你应该购买一本书来为现实环境中的机器学习做准备,那么 Aurélien Géron 的《动手机器学习》是实用机器学习的圣杯。
大多数读者都会接触到这本书或它以前的版本。
这本书包括两部分。
第一部分介绍典型的机器学习概念和技术,如梯度下降,支持向量机,特征工程,等等。第一部分还介绍了 SciKit-Learn ,一个流行的机器学习库,以及一些常见的可视化和争论工具。
这本书的第二部分介绍了卷积和递归神经网络和各种神经架构等概念。书的第二部分介绍 TensorFlow 2 和 Keras。
TensorFlow 是一个流行的机器学习库,支持神经网络的实施,并提供了一套用于常见机器学习任务的工具,如可视化、部署和模型优化。
完成这本书将使你能够用行业标准的工具、框架和库解决常见的计算机视觉问题。
用 Python 进行深度学习

Fran ois Chollet 的《Python 深度学习》也是类似于前面提到的那本书的两部分。
第一部分介绍了机器学习领域的基础知识。它专注于解释人工智能、深度学习和机器学习这些术语的基本含义。
本书的第一部分旨在建立机器学习实践者经常遇到的常见概念和主题的简要理论知识。本书的第一部分介绍了 Keras 、 Jupyter 笔记本、 NumPy 等等。
第二部分通过提供实用的练习和项目,用公开可用的数据集来实现,重点关注实用的深度学习。还详细介绍了 CNN、rnn(GRU 和 LSTM)和 gan。
从这本书里可以学到很多实用的技能,我建议把所有代码和完成的项目放在一个在线的仓库里,比如 GitHub,开始建立一个在线的存在,或者一个作品集。
机器学习——一种概率视角

不适合胆小的人。
这里我就实话实说了;每次我拿起这本书,我都要吹掉上面的灰尘。这本书很重要,但不如前面提到的书实用。
《机器学习:概率视角》是一本应该放在每个严肃的机器学习从业者的武器库中的书。这本书概括了机器学习的数学和理论方面,形成了基础和先进的 ML 技术的基础。
尽管这本书的篇幅和内容可能令人望而生畏,但我还是用它来巩固一般话题的知识,然后在公共领域谈论或写作这些话题。
这本书将在这十年中发挥作用,下一个十年,你越早开始理解它的内容,你就会成为一名更好的机器学习实践者。
4.个人项目
学习机器学习或计算机视觉的一种方法是简单地做。这条规则适用于许多领域。
通过承担和完成个人计算机视觉/ML 项目,我学到了更多。
我亲身经历的承担个人项目的好处如下:
- 你熟悉了你在机器学习项目 中会遇到的 阶段。
- 为在线作品集创建项目,向人工智能社区和未来的雇主展示你的技能。
- 巩固你对用于学习的任何 MOOCs、书籍或课程中的概念和主题的理解。
我没有在线作品集,但我有一些项目,它们的代码库托管在 GitHub 上。
例如,我参与了一个项目,该项目涉及利用计算机视觉技术对四足动物进行运动分析。通过这个项目,我了解了姿势估计、迁移学习、对象检测(RCNN)、神经网络实现以及用 PyTorch 进行训练等等。

5.网站
机器学习和深度学习的流行库和框架(TensorFlow 和 PyTorch)提供了一些基本计算机视觉解决方案和常见任务实现的教程。
有关于人脸检测、姿势估计、图像分类、迁移学习等等的教程。
教程的目的不仅是向您介绍深度学习解决方案的实施,而且还可以提高您对数据预处理、神经网络实施、训练或机器学习项目管道中的其他领域,甚至模型部署的框架或库方法的熟悉程度。
[## 欢迎来到 PyTorch 教程— PyTorch 教程 1.4.0 文档
要了解如何使用 PyTorch,请从我们的入门教程开始。60 分钟的闪电战是最常见的开始…
pytorch.org](https://pytorch.org/tutorials/) [## 教程| TensorFlow 核心
完整的端到端示例,帮助 ML 初学者和专家了解如何使用 TensorFlow。尝试谷歌教程…
www.tensorflow.org](https://www.tensorflow.org/tutorials)
奖金(网站):中等
是的,信不信由你,Medium 教会了我很多关于计算机视觉的知识。媒体上有大量关于机器学习和计算机视觉的文章。媒体上丰富的信息足以让你阅读几天。
媒体上有机器学习相关的教程、讨论、采访和评论,来自聪明、好奇和令人兴奋的作者。
在媒体上,我关注两件事。消费和创造。
强烈的
如果我提到我在 2020 年已经在 Medium 上阅读了超过 50 篇机器学习相关的文章,我并没有夸大其词。实际上,把这个数字改成 100。我读过顶级作家和出版物的文章,比如《走向数据科学的》和《T2 成为人类的
创造
通过在 Medium 上阅读其他作者的内容,我学会了如何向可能从未听说过这个话题的人传达机器学习概念。
我已经在 Medium 内部发展了一个小规模的存在,迄今为止已经写了 30 多篇文章,都与人工智能/机器学习有关。
在公共平台上撰写关于 ML/CV 概念的文章鼓励你以促进和培养深度理解的方式深入研究主题。
在其他教导和告知中,你必须首先知道。
我恳请读者选择一个与 ML/CV 相关的话题,并在 Medium 上写一写。请随意给我加标签或者给我发一个你写的文章的链接。
结论
如果你喜欢这篇文章和里面的内容,那么给我一个关注,因为我每周都会写类似的文章。
从这里去哪里?
你可以读到我在攻读计算机视觉硕士学位时遇到的困难。
我从全职到人工智能硕士生过渡的探索。
towardsdatascience.com](/took-a-masters-in-machine-learning-and-i-was-very-unprepared-7aba95f044a8)
阅读我的一次失败的面试
拒绝是获得数据科学工作的整个过程的一部分。但它并不经常被提起。这是我的账户…
towardsdatascience.com](/rejected-from-my-first-data-science-interview-c9784dd65296)
或者看看我作为计算机视觉工程师的第一天是怎么过的。
剧透:我引起轰动
towardsdatascience.com](/my-first-day-as-a-computer-vision-engineer-8b59750c79a0)
Python 列表理解的 5 个错误用例
知道什么时候不使用列表理解

列表理解无疑是 Python 最强大的特性。它们是 pythonic 式的,功能强大,并提供可读性。
但是这很容易为滥用它们打开方便之门。或者说是各种形式的虐待。这样做,你的代码只能是非 pythonic 化的,很难被对等体破译。
在下一节中,我们将看看使用 Python 列表理解的几种不正确的方法及其替换。
当你只是改变状态,而不是列表
许多程序员在开始使用 Python 时,在并不真正需要的地方开始使用列表理解。
例如,在下面的例子中,使用列表理解并不是最好的主意,因为我们没有对列表做任何事情。
vehicles = [ car, bike, truck ]
[ v.setLights(true) for v in vehicles ]names = [ "A", "B", "C" ]
[ print(i) for n in names ]
在这种情况下,最好使用经典的 for 循环,因为它可以防止创建不必要的列表。列表理解并不意味着指定命令或设置元素的状态。
当你只是在转换价值观的时候
你可能想转换一个字符串的字符或者简单地添加一串数字。在这两种情况下,选择列表理解并不意味着它也是 pythonic 式的。
让我们考虑下面的例子:
total = 0
listOne = [1,2,3]
[total := total + x for x in listOne]
虽然 Python 3.8 的赋值操作符:=允许我们使用列表理解对列表元素求和,但是当 Python 提供了内置的sum()函数时,为什么要重新发明一个轮子呢?上面的列表理解可以通过一段非常短的代码来完成:
sum(listOne)
类似地,当你只是将一个字符串拆分成字符(或者转换它们)时,使用列表理解是多余的,而且完全没有必要:
str = "Fred"
chars = [x for x in str]#use this instead:
chars = list(str)
当理解与庞大的逻辑嵌套在一起时
列表理解无论有多好,当它们嵌套在一起时都会变成一种痛苦。当逻辑冗长时,可读性问题只会进一步恶化。
Python 列表的理解最好是留给简洁的逻辑,以符合 python 代码。这意味着,如果需要的话,可以放弃嵌套列表理解,而使用嵌套循环。
下面的例子仅仅展示了嵌套循环是如何变得更容易理解,并且有时是长嵌套理解的很好的替代品。
list = [[1,2,3],[-1,-5,6]]flatten = [item
for sublist in list
for item in sublist
if item > 0]#using loops
flatten1 = []for rows in list:
for sublist in rows:
if sublist > 0:
flatten1.append(sublist)
当你在内存中加载整个列表时,尽管你并不需要它
列表理解可以让你很容易地创建列表,但是它们会一直占用内存。这使得它们非常低效,尤其是在处理大型数据集时。
考虑下面的例子,您很容易遇到内存不足的错误。
sum([i * i for i in range(1000)])
建议使用生成器表达式,因为它一次生成一个值:
sum(i* i for i in range(1000))
将列表存储在内存中的另一个不好的例子是,当您只根据特定条件查找单个元素时。下面的列表理解单句效率很低。
first = [x for x in list
if x.get("id")=="12"]
我们不仅可以用生成器表达式来代替它,还可以设置next函数,以便在第一个元素匹配给定条件时返回:
first = next((x for x in list if x.get("id")=="12"), None)
使用itertools函数和生成器表达式是一种有效的退出方式,而不是使用不支持break或continue的列表理解。
当你过度使用列表理解时
同样,您会惊讶地发现陷入列表理解并将其用于解压缩元组是多么容易。
下面的例子只是恢复了另一个不正确的用例,我们将元组值拆分成嵌套列表:
myList **=** [('A', 1), ('B', 2), ('C', 3)]result = [[ i for i, j in myList ],
[ j for i, j in myList ]]
Python 已经为我们提供了一个特定的内置工具,可以让我们解压缩元组。只需使用解包操作符*来析构元组,并将其传递给zip函数来创建单独的列表。
result **=** list(zip(*****myList))# [['A', 'B', 'C'], [1, 2, 3]]
结论
Python 列表理解非常强大,但是它们很容易被过度使用,从而使代码变得非 python 化。
我希望以上不正确的方法能帮助你更好地判断什么时候不使用列表理解。
这一次到此为止。感谢阅读。
5 YouTubers 数据科学家和 ML 工程师应该订阅
1 号莱克斯·弗里德曼
你是一名数据科学家还是一名 ML 从业者,正在寻找有效利用空闲时间的方法?
或许你已经厌倦了在 YouTube 上看没完没了的猫咪视频——现在还有人这么做吗?
不要再看猫咪视频了!
相反,你应该订阅我在本文中介绍的与数据科学和机器学习相关的 YouTube 频道。
了解如何有效地导航您的数据科学职业生涯,或者更好的是,在等待培训损失收敛时,扩展您对人类思维和意识起源的直觉。

1。莱克斯·弗里德曼
莱克斯·弗里德曼的 Youtube 频道可以说是迄今为止机器学习从业者最有见地的频道。
该频道上的视频是 Lex Fridman 本人与非凡的个人之间的简单对话,这些个人是计算、机器学习、深度学习、人工智能等领域的先驱或顶级研究人员。
我向数据科学家和机器学习工程师推荐这个频道的主要原因是,Lex Fridman 已经与机器学习和深度学习领域的著名先驱进行了交流。
大多数深度学习实践者都熟悉我将要列出的一些深度学习先驱,如果不是全部的话。
- Ian Goodfellow (甘斯的创造者),
- 伊利亚·苏斯特克弗(Alex net 的共同发明人)
- Yann LeCun (深度学习先锋)
- Yoshua Bengio (深度学习先驱)
除了 Lex 频道的深度学习内容,我最喜欢的视频是与约沙·巴赫的精彩对话。这次谈话会让你惊叹于乔沙对围绕意识、人类思维和我们的宇宙的问题做出优雅回答的速度。
不要犹豫,找出为什么这个频道目前拥有约 4500 万的浏览量!
如果你已经是这个频道的订户,请在评论中链接你最喜欢的视频。
探索人工智能、深度学习、自动驾驶汽车等研究主题的视频。
www.youtube.com](https://www.youtube.com/c/lexfridman/featured)
2。肯吉
YouTube 上最有趣的数据科学人物之一,在数据科学领域有五年的经验。
大多数数据科学家可能已经对 Ken Jee 很熟悉了,也许你已经看过他的一个关于简历和投资组合的视频,或者你已经看过他的“从零开始的数据科学项目”视频系列。
我是肯·吉视频的订户,因为他采访了数据科学家和机器学习实践者。这些访谈记录了嘉宾在数据科学和相关领域的知识和经验。
我已经从这个频道的几位采访嘉宾那里获得了大量关于如何在人工智能领域内导航职业生涯的信息。
如果您是数据科学家,以下是您应该订阅该频道的一些原因:
- 信息丰富的视频采访数据科学家已申请 FAANG 公司。
- 对数据科学界知名人士、四次 Kaggle 特级大师 Abhishek Thakur 的深入采访。
- 大多数数据科学从业者都会涉及到的大量内容。Ken 有关于如何有效学习数据科学的视频,处理冒名顶替综合症以及你应该参与哪些项目才能被雇佣。
- 在你等待你的 ML 模型完成训练的时候,观看五分钟的短片。
数据科学和体育分析是我的爱好。我叫 Ken Jee,一直在数据科学领域工作…
www.youtube.com](https://www.youtube.com/channel/UCiT9RITQ9PW6BhXK0y2jaeg)
3。扬尼克·基尔彻
Yannic Kilcher 的频道是 YouTube 上为数不多的几个频道之一,在那里你可以获得关于涵盖最先进的机器学习技术的研究论文的精彩解释。
下面是几个视频,展示了 Yannic 在解释研究论文时所采用的直观而直接的方法。
并不是所有的机器学习从业者都有硕士或博士的经历,这使得阅读和理解研究论文所需的开发技能成为可能。
大量数据科学家和 ML 工程师都是自学的,不具备有效分析研究论文所需的学术知识。
这就是为什么 Yannic channel 是我最喜欢的 5 个 YouTube 频道之一,我会推荐数据科学家和 ML 从业者获得传统和现代机器学习模型和技术的深入技术信息。
我制作关于机器学习研究论文、编程以及人工智能社区和更广泛的问题的视频…
www.youtube.com](https://www.youtube.com/channel/UCZHmQk67mSJgfCCTn7xBfew)
4。乔丹·哈罗德
乔丹·哈罗德是麻省理工学院和哈佛大学的毕业生,他创作人工智能相关主题的视频内容。
在 Jordan 的频道上,你可以找到大量解释基于人工智能的技术直接应用于解决现实世界问题的视频。
乔丹频道上的大部分视频都很简洁,长度不到 10 分钟。然而,它们包含了如此多的相关和当前的信息,大多数机器学习实践者将从中受益。
Jordan 的视频从技术角度探索了具有高度兴趣价值的主题,例如人工智能如何用于预测新冠肺炎,或者人工智能解决方案中的种族偏见。
探索我们每天与人工智能、算法和其他新技术互动的方式,为…
www.youtube.com](https://www.youtube.com/c/JordanHarrod/featured)
5。3 蓝色 1 棕色
这个列表中的最后一个 YouTube 频道可能是非 ML 从业者都会遇到的。
这个频道的内容是首屈一指的,我怎么称赞这个频道的创造者格兰特·桑德森都不为过。
对于那些对该频道背后的面孔和个性感到好奇的人,那么看看莱克斯·弗里德曼对格兰特的两次采访吧:第一轮,第二轮。
那些熟悉 3Blue1Brown 的人会同意我的说法,他设法在 15-20 分钟的短视频中教授大学讲师需要花费数小时的主题。
这个频道教我机器学习和神经网络的基础知识,让数学变得简单。
在机器学习中,理解线性代数、微积分和偏微分等主题是必不可少的。研究神经网络时,理解神经网络的基本组件至关重要。
理解一般的反向传播、梯度下降和神经网络等概念也是必不可少的。
格兰特·桑德森的《3Blue1Brown》是数学和娱乐的结合,这取决于你的喜好。目标是…
www.youtube.com](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw)
结论
这些 YouTube 视频足够让你在 2020 年的最后几个月以及 2021 年的最初几个月里忙个不停。
本文中包含的 YouTube 频道目前正在频繁地发布新的视频内容。
你觉得还有其他数据科学/ML YouTube 应该上榜吗?然后我邀请你在评论区与其他读者分享。
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
旨在快速检测冠状病毒的研究进展的信息和收获。
towardsdatascience.com](/machine-learning-can-detect-covid-19-in-less-than-five-minutes-23bba57aeaa3) [## 我如何使用智能手表传感器来防止面部触摸
一个值得追求的想法?
towardsdatascience.com](/how-im-using-smartwatch-sensors-to-limit-covid-19-infection-51abe04f81f9)
25 个深度学习面试问题
深度学习的实践问题及解决方案

以下是 25 个关于深度学习的问题,可以帮助你测试你的知识,也是面试准备的一个很好的复习资源。
1。为什么有必要在神经网络中引入非线性?
解:否则我们会有一个线性函数的合成,也是一个线性函数,给出一个线性模型。线性模型的参数数量少得多,因此其建模的复杂性有限。
2。描述处理神经网络中消失梯度问题的两种方法。
解决方案:
- 使用 ReLU 激活代替乙状结肠。
- 使用 Xavier 初始化。
3。在图像分类任务中,使用 CNN(卷积神经网络)而不是 DNN(密集神经网络)有什么优势?
解决方案:虽然两种模型都可以捕捉邻近像素之间的关系,但 CNN 具有以下特性:
- 它是平移不变的——像素的确切位置与滤镜无关。
- 它不太可能过度拟合——CNN 的典型参数数量比 DNN 少得多。
- 让我们更好地理解模型——我们可以查看过滤器的权重,并可视化网络“学习”了什么。
- 层次性——通过用简单模式描述复杂模式来学习模式。
4。描述在图像分类任务中可视化 CNN 特征的两种方法。
解决方案:
- 输入遮挡-覆盖输入影像的一部分,查看哪一部分对分类的影响最大。例如,给定一个训练好的图像分类模型,给出下面的图像作为输入。例如,如果我们看到第三幅图像以 98%的概率被分类为狗,而第二幅图像只有 65%的准确度,这意味着第二幅图像中覆盖的部分更重要。

- 激活最大化——想法是创建一个人工输入图像,最大化目标响应(梯度上升)。
5。尝试以下学习率:0.1,0.2,…,0.5 是优化学习率的好策略吗?
解决方法:不可以,建议尝试对数标度,优化学习速率。
6。假设您有一个具有 3 层和 ReLU 激活的神经网络。如果我们用相同的值初始化所有的权重会发生什么?如果我们只有一层(即线性/逻辑回归)会怎样?)
解决方案:如果我们将所有权重初始化为相同,我们将无法破坏对称性;即,所有梯度将被相同地更新,并且网络将不能学习。然而,在 1 层场景中,成本函数是凸的(线性/sigmoid ),因此权重将总是收敛到最优点,而不管初始值如何(收敛可能较慢)。
7。解释 Adam 优化器背后的理念。
解决方案: Adam,或称自适应动量,结合了两种思想来提高收敛速度:按参数更新以加快收敛速度,动量有助于避免陷入鞍点。
8。比较批量、小批量和随机梯度下降。
解决方案:批量指的是通过获取整个数据来估计数据,小批量指的是通过采样几个数据点来估计数据,而 SGD 指的是在每个时期更新一个数据点的梯度。这里要权衡的是梯度计算的精度和我们可以在内存中保存的批量大小。此外,通过在每个时期添加随机噪声,采用小批量而不是整个批量具有正则化效果。
9。什么是数据增强?举例说明。
解决方案:数据扩充是通过对原始数据进行操作来增加输入数据的技术。例如在图像中,可以:旋转图像,反射(翻转)图像,添加高斯模糊。
10。GANs 背后的理念是什么?
解: GANs,或者说生成性对抗网络,由两个网络(D,G)组成,其中 D 是“鉴别者”网络,G 是“生成性”网络。我们的目标是创造数据——例如,与真实图像没有区别的图像。假设我们想创造一个猫的反面例子。网络 G 将生成图像。网络 D 将根据它们是否是猫来对图像进行分类。G 的成本函数将被构造成试图“愚弄”D——总是将其输出分类为 cat。
11。使用 Batchnorm 有什么好处?
解决方案: Batchnorm 加速训练过程。它也(作为包含一些噪声的副产品)有一个正则化的效果。
12。W 什么是多任务学习?应该在什么时候使用?
解决方案:当我们有少量数据用于某项任务时,多任务处理是有用的,我们将受益于在另一项任务的大数据集上训练模型。模型的参数以“硬”方式(即相同的参数)或“软”方式(即成本函数的正则化/惩罚)共享。
13。什么是端到端学习?举几个它的优点。
解决方案:端到端学习通常是一种获得原始数据并直接输出期望结果的模型,没有中间任务或特征工程。它有几个优点,其中之一是:不需要手工制作特征,并且它通常导致较低的偏差。
14。如果我们使用 ReLU 激活,然后使用 sigmoid 作为最终层,会发生什么情况?
解决方案:由于 ReLU 总是输出一个非负的结果,网络将不断地为所有输入预测一个类别!
15。如何解决爆炸渐变问题?
解决方案:爆炸梯度问题的一个简单解决方案是梯度裁剪——当梯度的绝对值大于 M 时,将梯度取为 M,其中 M 是某个大数。
16。使用批量梯度下降时是否需要对训练数据进行洗牌?
解决方案:否,因为梯度是在每个历元使用整个训练数据计算的,所以混洗没有区别。
17。使用迷你批量梯度下降时,为什么打乱数据很重要?
解决方案:否则,假设我们训练一个 NN 分类器,并且有两个类——A 和 B,并且一个类的所有样本出现在另一个类之前。不对数据进行洗牌会使权重收敛到错误的值。
18。描述迁移学习的一些超参数。
解决方案:保留多少层,增加多少层,冻结多少层。
19 。测试集上是否使用了辍学?
解决方案:没有!只在火车布景里。辍学是一种在培训过程中应用的正规化技术。
20 。解释为什么神经网络中的漏失会起到正则化的作用。
解决方案:关于辍学为什么会起作用,有几种(相关的)解释。这可以被视为模型平均的一种形式——在每一步,我们“关闭”模型的一部分,并对我们得到的模型进行平均。还增加了噪点,自然有规整的效果。这也导致权重更加稀疏,并且实质上阻止了网络中神经元的协同适应。
21。举例说明多对一 RNN 架构的适用情况。
解决方案:举几个例子:情感分析,语音性别识别。
22 。什么时候不能用 BiLSTM?解释必须做出的假设。
解决方案:在任何双向模型中,我们都假设在给定的“时间”内可以访问序列的下一个元素。文本数据(即情感分析、翻译等)就是这种情况。),但时间序列数据并非如此。
23 。对/错:将 L2 正则化添加到 RNN 有助于解决渐变消失问题。
解:假!添加 L2 正则化将使权重向零收缩,这实际上在某些情况下会使消失梯度变得更糟。
24 。假设训练误差/成本很高,并且验证成本/误差几乎等于它。这是什么意思?应该怎么做?
解决方案:这表示装配不足。可以添加更多的参数,增加模型的复杂性,或者降低正则化程度。
25 。描述 L2 正则化如何解释为一种权重衰减。
解:假设我们的代价函数是 C(w),我们加上一个惩罚 c|w|2。当使用梯度下降时,迭代将看起来像
w = w-grad(C)(w)-2cw =(1–2c)w-grad(C)(w)
在这个等式中,权重乘以一个< 1 的因子。
53 Python 面试问答
面向数据科学家和软件工程师的 Python 问题

不久前,我开始担任“数据科学家”的新角色,实际上是“Python 工程师”。
如果我提前温习 Python 的线程生命周期而不是推荐系统,我会准备得更充分。
本着这种精神,以下是我的 python 面试/工作准备问答。大多数数据科学家都写了很多代码,所以这对科学家和工程师都适用。
无论你是在面试候选人,准备申请工作,还是只是在温习 Python,我认为这个列表都是非常宝贵的。
问题无序。我们开始吧。
1.列表和元组有什么区别?
在我参加的每一次 python /数据科学面试中,我都会被问到这个问题。对答案了如指掌。
- 列表是可变的。它们可以在创建后进行修改。
- 元组是不可变的。元组一旦创建,就不能更改
- 列表是有顺序的。它们是有序的序列,通常属于同一类型的对象。Ie:按创建日期排序的所有用户名,
["Seth", "Ema", "Eli"] - 元组有结构。每个索引可能存在不同的数据类型。Ie:内存中的一个数据库记录,
(2, "Ema", "2020–04–16") # id, name, created_at
2.字符串插值是如何执行的?
在不导入Template类的情况下,有 3 种方法可以插入字符串。
name = 'Chris'# 1\. f strings
print(f'Hello {name}')# 2\. % operator
print('Hey %s %s' % (name, name))# 3\. format
print(
"My name is {}".format((name))
)
3.“是”和“==”有什么区别?
在我 python 职业生涯的早期,我认为这些都是一样的…你好,臭虫。因此,根据记录,is检查身份,==检查平等。
我们将浏览一个示例。创建一些列表,并将它们分配给名称。注意b与下面的a指向同一个对象。
a = [1,2,3]
b = a
c = [1,2,3]
检查等式并注意它们都是相等的。
print(a == b)
print(a == c)
#=> True
#=> True
但是他们有相同的身份吗?没有。
print(a is b)
print(a is c)
#=> True
#=> False
我们可以通过打印他们的对象 id 来验证这一点。
print(id(a))
print(id(b))
print(id(c))
#=> 4369567560
#=> 4369567560
#=> 4369567624
c的id与a和b不同。
4.什么是室内设计师?
我在每次面试中都会被问到的另一个问题。这本身就值得一贴,但是如果你能写下自己的例子,你就已经准备好了。
装饰器允许通过将现有函数传递给装饰器来为现有函数添加功能,装饰器执行现有函数和附加代码。
我们将编写一个装饰器,在调用另一个函数时记录日志。
编写装饰函数。这需要一个函数func作为参数。它还定义了一个函数log_function_called,这个函数调用func()并执行一些代码print(f'{func} called.')。然后它返回它定义的函数
def logging(func):
def log_function_called():
print(f'{func} called.')
func()
return log_function_called
让我们编写最终将添加装饰器的其他函数(但现在还没有)。
def my_name():
print('chris')def friends_name():
print('naruto')my_name()
friends_name()
#=> chris
#=> naruto
现在将装饰器添加到两者中。
[@logging](http://twitter.com/logging)
def my_name():
print('chris')[@logging](http://twitter.com/logging)
def friends_name():
print('naruto')my_name()
friends_name()
#=> <function my_name at 0x10fca5a60> called.
#=> chris
#=> <function friends_name at 0x10fca5f28> called.
#=> naruto
看看我们现在如何通过在上面添加@logging来轻松地将日志添加到我们编写的任何函数中。
5.解释范围函数
Range 生成一个整数列表,有 3 种方法可以使用它。
该函数有 1 到 3 个参数。注意,我将每种用法都包装在列表理解中,这样我们就可以看到生成的值。
**range(stop)** : 生成从 0 到“停止”整数的整数。
[i for i in range(10)]
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
**range(start, stop)** : 生成从“开始”到“停止”的整数。
[i for i in range(2,10)]
#=> [2, 3, 4, 5, 6, 7, 8, 9]
**range(start, stop, step)** : 以“步”为间隔,从“开始”到“停止”生成整数。
[i for i in range(2,10,2)]
#=> [2, 4, 6, 8]
感谢塞尔格·博瑞姆丘克建议了一种更 pythonic 化的方式来做这件事!
list(range(2,10,2))
#=> [2, 4, 6, 8]
6.定义一个名为 car 的类,它有两个属性,“颜色”和“速度”。然后创建一个实例,返回速度。
class Car :
def __init__(self, color, speed):
self.color = color
self.speed = speedcar = Car('red','100mph')
car.speed
#=> '100mph'
7.python 中的实例、静态和类方法有什么区别?
实例方法:接受self参数,并关联到类的一个特定实例。
静态方法:使用@staticmethod装饰器,与特定实例无关,并且是独立的(不要修改类或实例属性)
类方法:接受cls参数并可以修改类本身
我们将围绕一个虚构的CoffeeShop类来说明这种差异。
class CoffeeShop:
specialty = 'espresso'
def __init__(self, coffee_price):
self.coffee_price = coffee_price
# instance method
def make_coffee(self):
print(f'Making {self.specialty} for ${self.coffee_price}')
# static method
[@staticmethod](http://twitter.com/staticmethod)
def check_weather():
print('Its sunny') # class method
[@classmethod](http://twitter.com/classmethod)
def change_specialty(cls, specialty):
cls.specialty = specialty
print(f'Specialty changed to {specialty}')
CoffeeShop类有一个属性specialty,默认设置为'espresso'。CoffeeShop的每个实例都用属性coffee_price初始化。它也有 3 个方法,一个实例方法,一个静态方法和一个类方法。
让我们用5的coffee_price初始化咖啡店的一个实例。然后调用实例方法make_coffee。
coffee_shop = CoffeeShop('5')
coffee_shop.make_coffee()
#=> Making espresso for $5
现在调用静态方法。静态方法不能修改类或实例状态,所以它们通常用于实用函数,例如,将两个数相加。我们用我们的来查天气。Its sunny。太好了!
coffee_shop.check_weather()
#=> Its sunny
现在我们用类的方法修改咖啡店的特产然后make_coffee。
coffee_shop.change_specialty('drip coffee')
#=> Specialty changed to drip coffeecoffee_shop.make_coffee()
#=> Making drip coffee for $5
注意make_coffee以前是怎么做espresso的,现在是怎么做drip coffee的!
8.「func」和「func()」有什么区别?
这个问题的目的是看你是否明白 python 中所有的函数也是对象。
def func():
print('Im a function')
func
#=> function __main__.func>func()
#=> Im a function
func是代表函数的对象,该函数可被赋给一个变量或传递给另一个函数。func()用括号调用函数并返回它输出的内容。
9.解释地图功能的工作原理
map返回一个映射对象(一个迭代器),它可以对序列中的每个元素应用一个函数而返回的值进行迭代。如果需要,地图对象也可以转换为列表。
def add_three(x):
return x + 3li = [1,2,3][i for i in map(add_three, li)]
#=> [4, 5, 6]
上面,我给列表中的每个元素加了 3。
一位读者建议了一个更 pythonic 化的实现。感谢克里斯扬·伍斯特!
def add_three(x):
return x + 3li = [1,2,3]
list(map(add_three, li))
#=> [4, 5, 6]
此外,感谢迈克尔格雷姆肖特的更正!
10.解释 reduce 函数的工作原理
这可能会很棘手,直到你使用它几次。
reduce接受一个函数和一个序列,并对该序列进行迭代。在每次迭代中,当前元素和前一个元素的输出都被传递给函数。最后,返回一个值。
from functools import reducedef add_three(x,y):
return x + yli = [1,2,3,5]reduce(add_three, li)
#=> 11
返回11,它是1+2+3+5的和。
11.解释过滤函数的工作原理
Filter 确实如其名。它过滤序列中的元素。
每个元素被传递给一个函数,如果该函数返回True,则该函数以输出序列返回,如果该函数返回False,则该元素被丢弃。
def add_three(x):
if x % 2 == 0:
return True
else:
return Falseli = [1,2,3,4,5,6,7,8][i for i in filter(add_three, li)]
#=> [2, 4, 6, 8]
请注意所有不能被 2 整除的元素是如何被删除的。
12.python 是按引用调用还是按值调用?
如果你在谷歌上搜索这个问题并阅读了上面的几页,就要做好陷入语义陷阱的准备。
简而言之,所有的名字都是通过引用来调用的,但是一些内存位置保存对象,而另一些保存指向其他内存位置的指针。
name = 'object'
让我们看看这是如何处理字符串的。我们将实例化一个名称和对象,将其他名称指向它。然后删除名字。
x = 'some text'
y = x
x is y #=> Truedel x # this deletes the 'a' name but does nothing to the object in memoryz = y
y is z #=> True
我们看到的是,所有这些名字都指向内存中的同一个对象,它不受del x的影响。
这是另一个有趣的函数例子。
name = 'text'def add_chars(str1):
print( id(str1) ) #=> 4353702856
print( id(name) ) #=> 4353702856
# new name, same object
str2 = str1
# creates a new name (with same name as the first) AND object
str1 += 's'
print( id(str1) ) #=> 4387143328
# still the original object
print( id(str2) ) #=> 4353702856
add_chars(name)
print(name) #=>text
注意在函数内部的字符串中添加一个s是如何创建一个新名称和一个新对象的。即使新名称与现有名称具有相同的“名称”。
感谢迈克尔·p·雷利的指正!
13.如何反转一个列表?
请注意reverse()是如何在列表上被调用并对其进行变异的。它不会返回变异后的列表本身。
li = ['a','b','c']print(li)
li.reverse()
print(li)
#=> ['a', 'b', 'c']
#=> ['c', 'b', 'a']
14.字符串乘法是如何工作的?
我们来看看字符串‘cat’乘以 3 的结果。
'cat' * 3
#=> 'catcatcat'
该字符串自身连接了三次。
15.列表乘法是如何工作的?
让我们看看一个列表[1,2,3]乘以 2 的结果。
[1,2,3] * 2
#=> [1, 2, 3, 1, 2, 3]
输出包含重复两次的[1,2,3]的内容的列表。
16.一个班里的“自己”指的是什么?
Self 指的是类本身的实例。这就是我们如何给予方法访问和更新它们所属对象的能力。
下面,将 self 传递给__init__()使我们能够在初始化时设置实例的color。
class Shirt:
def __init__(self, color):
self.color = color
s = Shirt('yellow')
s.color
#=> 'yellow'
17.如何在 python 中连接列表?
将两个列表相加会将它们连接起来。请注意,数组的工作方式不同。
a = [1,2]
b = [3,4,5]a + b
#=> [1, 2, 3, 4, 5]
18.浅拷贝和深拷贝有什么区别?
我们将在一个可变对象(列表)的上下文中讨论这个问题。对于不可变的对象,浅和深并不相关。
我们将经历 3 个场景。
i)引用原始对象。这个新名字li2指向内存中li1指向的相同位置。所以我们对li1所做的任何改变也会发生在li2上。
li1 = [['a'],['b'],['c']]
li2 = li1li1.append(['d'])
print(li2)
#=> [['a'], ['b'], ['c'], ['d']]
ii)创建原始文件的浅拷贝。我们可以用list()构造函数,或者更 pythonic 化的mylist.copy()(感谢 Chrisjan Wust !).
浅表副本创建一个新对象,但用对原始对象的引用填充它。所以向原始集合添加一个新对象li3,不会传播到li4,但是修改li3中的一个对象会传播到li4。
li3 = [['a'],['b'],['c']]
li4 = list(li3)li3.append([4])
print(li4)
#=> [['a'], ['b'], ['c']]li3[0][0] = ['X']
print(li4)
#=> [[['X']], ['b'], ['c']]
iii)创建深层副本。这是通过copy.deepcopy()完成的。这两个对象现在完全独立,对其中一个对象的更改不会影响另一个对象。
import copyli5 = [['a'],['b'],['c']]
li6 = copy.deepcopy(li5)li5.append([4])
li5[0][0] = ['X']
print(li6)
#=> [['a'], ['b'], ['c']]
19.列表和数组有什么区别?
注意:Python 的标准库有一个数组对象,但这里我特指常用的 Numpy 数组。
- 列表存在于 python 的标准库中。数组由 Numpy 定义。
- 列表可以在每个索引处填充不同类型的数据。数组需要同质元素。
- 列表算术在列表中添加或删除元素。每个线性代数上的数组函数的算术。
- 阵列还使用更少的内存,并提供更多的功能。
我写了另一篇关于数组的综合文章。
20.如何连接两个数组?
记住,数组不是列表。数组来自 Numpy 和算术函数,如线性代数。
我们需要使用 Numpy 的 concatenate 函数来实现。
import numpy as npa = np.array([1,2,3])
b = np.array([4,5,6])np.concatenate((a,b))
#=> array([1, 2, 3, 4, 5, 6])
21.你喜欢 Python 的什么?
请注意,这是一个非常主观的问题,你需要根据角色的需求来修改你的回答。
Python 可读性很强,几乎所有事情都有 python 式的方法,这意味着这是一种清晰简洁的首选方法。
我将此与 Ruby 进行对比,在 Ruby 中,通常有许多方法来做某件事,但没有哪种方法更好的指导原则。
22.你最喜欢的 Python 库是什么?
亦主观,见问题 21。
当处理大量数据时,没有什么比 pandas 更有用了,它使处理和可视化数据变得轻而易举。
23.命名可变和不可变对象
不可变意味着状态在创建后不能修改。例如:int、float、bool、string 和 tuple。
可变意味着状态在创建后可以修改。例子有列表、字典和集合。
24.你如何将一个数字四舍五入到小数点后三位?
使用round(value, decimal_places)功能。
a = 5.12345
round(a,3)
#=> 5.123
25.你如何分割一个列表?
切片表示法有 3 个参数,list[start:stop:step],其中 step 是返回元素的间隔。
a = [0,1,2,3,4,5,6,7,8,9]print(a[:2])
#=> [0, 1]print(a[8:])
#=> [8, 9]print(a[2:8])
#=> [2, 3, 4, 5, 6, 7]print(a[2:8:2])
#=> [2, 4, 6]
26.什么是腌制?
Pickling 是 Python 中序列化和反序列化对象的常用方法。
在下面的例子中,我们序列化和反序列化一个字典列表。
import pickleobj = [
{'id':1, 'name':'Stuffy'},
{'id':2, 'name': 'Fluffy'}
]with open('file.p', 'wb') as f:
pickle.dump(obj, f)with open('file.p', 'rb') as f:
loaded_obj = pickle.load(f)print(loaded_obj)
#=> [{'id': 1, 'name': 'Stuffy'}, {'id': 2, 'name': 'Fluffy'}]
27.字典和 JSON 有什么区别?
Dict 是 python 数据类型,是一个索引但无序的键和值的集合。
JSON 只是一个遵循特定格式的字符串,用于传输数据。
28.你在 Python 中用过哪些 ORM?
ORMs(对象关系映射)将数据模型(通常在应用程序中)映射到数据库表,并简化数据库事务。
SQLAlchemy 通常用在 Flask 的上下文中,Django 有自己的 ORM。
29.any()和 all()是如何工作的?
Any 接受一个序列,如果序列中的任何元素为真,则返回真。
All 仅当序列中的所有元素都为真时返回真。
a = [False, False, False]
b = [True, False, False]
c = [True, True, True]print( any(a) )
print( any(b) )
print( any(c) )
#=> False
#=> True
#=> Trueprint( all(a) )
print( all(b) )
print( all(c) )
#=> False
#=> False
#=> True
30.字典或列表查找更快吗?
在列表中查找一个值需要 O(n)时间,因为需要遍历整个列表直到找到该值。
在字典中查找一个键需要 O(1)时间,因为它是一个散列表。
如果有很多值,这会造成很大的时间差,因此为了加快速度,通常建议使用字典。但是它们也有其他的限制,比如需要唯一的键。
31.模块和包的区别是什么?
模块是可以一起导入的文件(或文件集合)。
import sklearn
包是模块的目录。
from sklearn import cross_validation
所以包是模块,但不是所有的模块都是包。
32.Python 中如何对一个整数进行加减运算?
可以用+-和-=来增加和减少。
value = 5value += 1
print(value)
#=> 6value -= 1
value -= 1
print(value)
#=> 4
33.如何返回整数的二进制?
使用bin()功能。
bin(5)
#=> '0b101'
34.如何从列表中删除重复的元素?
这可以通过将列表转换成集合,然后再转换回列表来实现。
a = [1,1,1,2,3]
a = list(set(a))
print(a)
#=> [1, 2, 3]
注意,集合不一定保持列表的顺序。
35.如何检查列表中是否有值?
使用in。
'a' in ['a','b','c']
#=> True'a' in [1,2,3]
#=> False
36.追加和扩展有什么区别?
append将一个值添加到一个列表,而extend将另一个列表中的值添加到一个列表。
a = [1,2,3]
b = [1,2,3]a.append(6)
print(a)
#=> [1, 2, 3, 6]b.extend([4,5])
print(b)
#=> [1, 2, 3, 4, 5]
37.如何取整数的绝对值?
这可以通过abs()功能完成。
abs(2)
#=> 2abs(-2)
#=> 2
38.如何将两个列表合并成一个元组列表?
您可以使用zip函数将列表组合成一个元组列表。这并不局限于只使用两个列表。也可以用 3 个或更多。
a = ['a','b','c']
b = [1,2,3][(k,v) for k,v in zip(a,b)]
#=> [('a', 1), ('b', 2), ('c', 3)]
39.你如何按字母顺序按关键字给字典排序?
您不能“排序”字典,因为字典没有顺序,但是您可以返回一个排序的元组列表,其中包含字典中的键和值。
d = {'c':3, 'd':4, 'b':2, 'a':1}sorted(d.items())
#=> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
40.Python 中一个类如何继承另一个类?
在下面的例子中,Audi继承自Car。随着这种继承而来的是父类的实例方法。
class Car():
def drive(self):
print('vroom')class Audi(Car):
passaudi = Audi()
audi.drive()
41.如何从字符串中删除所有空格?
最简单的方法是用空格分割字符串,然后不用空格重新连接。
s = 'A string with white space'''.join(s.split())
#=> 'Astringwithwhitespace'
2 读者推荐了一种更 Python 化的方式来处理这个问题,这种方式遵循了Explicit is better than Implicit的 Python 精神。它也更快,因为 python 不创建新的列表对象。感谢евгенийкрамаров和 Chrisjan Wust !
s = 'A string with white space'
s.replace(' ', '')
#=> 'Astringwithwhitespace'
42.为什么在对序列进行迭代时要使用 enumerate()。
enumerate()迭代序列时允许跟踪索引。这比定义和递增一个表示索引的整数更有技巧。
li = ['a','b','c','d','e']for idx,val in enumerate(li):
print(idx, val)
#=> 0 a
#=> 1 b
#=> 2 c
#=> 3 d
#=> 4 e
43.传球、继续、突破有什么区别?
pass指无所事事。我们通常使用它,因为 Python 不允许在没有代码的情况下创建类、函数或 if 语句。
在下面的例子中,如果在i > 3中没有代码,将会抛出一个错误,所以我们使用pass。
a = [1,2,3,4,5]for i in a:
if i > 3:
pass
print(i)
#=> 1
#=> 2
#=> 3
#=> 4
#=> 5
continue继续执行下一个元素,并停止执行当前元素。所以对于i < 3处的值,永远不会达到print(i)。
for i in a:
if i < 3:
continue
print(i)
#=> 3
#=> 4
#=> 5
break中断循环,序列不再迭代。因此不打印从 3 开始的元素。
for i in a:
if i == 3:
break
print(i)
#=> 1
#=> 2
44.将下面的 for 循环转换成列表理解。
这个for循环。
a = [1,2,3,4,5]
a2 = []
for i in a:
a2.append(i + 1)print(a2)
#=> [2, 3, 4, 5, 6]
变成了。
a3 = [i+1 for i in a]print(a3)
#=> [2, 3, 4, 5, 6]
列表理解通常被认为是更 pythonic 化的,因为它仍然是可读的。
45.举一个三元运算符的例子。
三元运算符是一行 if/else 语句。
语法看起来像a if condition else b。
x = 5
y = 10'greater' if x > 6 else 'less'
#=> 'less''greater' if y > 6 else 'less'
#=> 'greater'
46.检查字符串是否只包含数字。
可以用isnumeric()。
'123a'.isnumeric()
#=> False'123'.isnumeric()
#=> True
47.检查字符串是否只包含字母。
可以用isalpha()。
'123a'.isalpha()
#=> False'a'.isalpha()
#=> True
48.检查字符串是否只包含数字和字母。
可以用isalnum()。
'123abc...'.isalnum()
#=> False'123abc'.isalnum()
#=> True
49.从字典中返回一个键列表。
这可以通过将字典传递给 python 的list()构造函数list()来完成。
d = {'id':7, 'name':'Shiba', 'color':'brown', 'speed':'very slow'}list(d)
#=> ['id', 'name', 'color', 'speed']
50.如何区分字符串的大小写?
您可以使用upper()和lower()字符串方法。
small_word = 'potatocake'
big_word = 'FISHCAKE'small_word.upper()
#=> 'POTATOCAKE'big_word.lower()
#=> 'fishcake'
51.remove,del,pop 有什么区别?
remove()删除第一个匹配值。
li = ['a','b','c','d']li.remove('b')
li
#=> ['a', 'c', 'd']
del按索引删除元素。
li = ['a','b','c','d']del li[0]
li
#=> ['b', 'c', 'd']
pop()通过索引移除元素并返回该元素。
li = ['a','b','c','d']li.pop(2)
#=> 'c'li
#=> ['a', 'b', 'd']
52.举一个字典理解的例子。
下面我们将创建一个字典,以字母表中的字母作为关键字,以字母表中的值作为索引。
# creating a list of letters
import string
list(string.ascii_lowercase)
alphabet = list(string.ascii_lowercase)# list comprehension
d = {val:idx for idx,val in enumerate(alphabet)} d
#=> {'a': 0,
#=> 'b': 1,
#=> 'c': 2,
#=> ...
#=> 'x': 23,
#=> 'y': 24,
#=> 'z': 25}
53.Python 中的异常处理是如何执行的?
Python 提供了 3 个词来处理异常,try、except和finally。
语法看起来像这样。
try:
# try to do this
except:
# if try block fails then do this
finally:
# always do this
在下面这个简单的例子中,try块失败了,因为我们不能将整数和字符串相加。except块设定val = 10,然后finally块打印complete。
try:
val = 1 + 'A'
except:
val = 10
finally:
print('complete')
print(val)
#=> complete
#=> 10
结论
你永远不知道面试中会出现什么问题,最好的准备方式是拥有丰富的代码编写经验。
也就是说,这个列表应该涵盖了数据科学家或初级/中级 python 开发人员角色在 python 方面被问到的几乎所有问题。
我希望这对你和我一样有帮助。
有没有我错过的很棒的问题?
5G+AI,设备上的智能(第一部分)
随着 5G 的推出,人工智能肯定会有超能力。
T2 也许你已经听说过这件事了?近几十年来最具颠覆性的两项技术。你可能会分别听说过它们。
让我们合并他们!5G +人工智能
嗯..这似乎不对。你确定吗?

照片由 Balázs Kétyi 在 Unsplash 上拍摄
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
如果你想了解更多,请访问oscargarciaramos.com
AI 增强 5G,在网络上,在设备上。
“5G 是第五代无线通信技术和标准”。把我们只能说话的第一部手机(1G)、第一条短信(2G)、第一个互联网连接(3G)以及最后的移动带宽(4G)抛在身后。
我们正在谈论更远的东西,其中最重要的进步将来自速度,5G 将允许我们导航到 10GBps,比今天快 10 倍。
5G 将意味着什么?更大规模的物联网生态系统的扩散,无线网络将满足数千亿互联设备的通信需求,而不会影响它们的速度、延迟和成本。
其他优点:
- 高达 10Gbps 的数据速率->比 4G 和 4.5G 网络高 10 到 100 倍。
- 低功耗物联网设备的电池续航时间达到 10 倍。
- 能耗降低 90%和 100%覆盖率。
- 1 毫秒延迟&每单位面积宽带快 1000 倍。
- 每单位面积最多可多连接 100 台设备(与 4G LTE 网络相比)。
这就是 边缘分析 概念出现的地方,或者广义地说,是一种“新的”数据分析模型,其中数据流处理发生在系统的非中心点,例如设备或传感器。
正如我们所见,5G 将导致我们周围的传感器激增,每个传感器都为分析数据和创建机器学习模型开辟了新的机会。
也就是说,我们可以用那些传感器作为 AI 输入。
不仅如此。我们不再谈论将大量数据从其来源移动到一个集中的存储库,在那里我们可以处理这些数据。
我们正在谈论让处理更接近源头,即设备本身,除了有助于扩展智能之外,还为提供隐私和可靠性等至关重要的好处。

新挑战,新机遇
更高效的无线连接、更长的电池续航时间,从而带来更好的用户体验。
想象一下,使用 5G 和 AI 来重新创建一个可以与客户实时交互的虚拟人,远程给他建议或只是作为一个伴侣。负责在危急情况下做出决策或需要立即响应的传感器。我们不是简单地谈论在数据源附近处理信息,而是通过高速共享和接收新数据来添加更多的上下文,利用它们之间的低延迟。
如今,当我们向我们的人工智能语音助手提出任何问题时,都需要几秒钟才能做出响应,因为它会去云端处理请求并获得响应。当我们问天气如何时,这种情况会发生,这并不重要。但是,如果您需要在几毫秒内做出响应,比如紧急情况,该怎么办呢?我们被卖了。我们最好耐心点。
5G 的低延迟、高容量和可用性还将允许人工智能处理分布在设备或传感器、边缘云和公共中央云之间,从而允许开发比今天创建的解决方案更加灵活的解决方案。
游戏或工业 4 等行业。x 也可以从这些复杂用例的功能中受益,这些复杂用例可以从这种分布式无线处理中受益。
一种新范式:无线传感器网络上的分布式学习
我们已经迈出了第一步:使用设备上的处理能力来节省能源,并在将数据传递到云中进行更全面的分析之前对其进行提炼。
下一步更进一步:我们不会满足于简单地在设备本身上进行推断,而是在那里训练模型,也就是 分布式学习。
理论如下:
- 中央云向每个设备发送一个模型。
- 每个设备在设备上收集和存储本地数据样本。
- 最后,每个设备执行或实施设备上的训练。
我们从大规模培训到“小规模可扩展分布式培训】。
设备上的培训使我们能够:
- 规模:将处理扩展到我们想要的任意多的设备,显著降低必要的计算能力。
- 定制:本地数据训练,其中模型适应每个设备的诡辩(例如它自己的智能手机)。
- 隐私:原始数据永远不会像现在这样离开你自己的设备进行处理。在保护隐私的同时获取价值。
那么下一步是什么?
如你所见,一个激动人心的世界向我们敞开了大门。
没有限制,人工智能不仅可以受益于设备外的数据,还可以受益于新的数据,如设备上的数据(日历、消息、应用程序等)。)以及传感器数据(环境光、麦克风、温度、眼睛跟踪、脉搏等等)。
让游戏开始吧!
如果你想继续阅读,去看看第二部分:
AIoT:要聪明,要有人脉。
欢迎发表评论或分享这篇文章。关注 me 未来帖子。
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
速度快 5 倍的 sci kit-在 5 行代码中学习参数调整
利用 Tune-sklearn 来增强和扩展 scikit-learn 的 GridSearchCV。

作者图片
每个人都知道 Scikit-Learn——它是数据科学家的主食,提供了几十种易于使用的机器学习算法。它还提供了两种现成的技术来解决超参数调优:网格搜索(GridSearchCV)和随机搜索(RandomizedSearchCV)。
这两种技术虽然有效,但都是寻找正确的超参数配置的强力方法,这是一个昂贵且耗时的过程!

作者图片
如果你想加快这个过程呢?
在这篇博文中,我们介绍 tune-sklearn 。 Tune-sklearn 是 Scikit-Learn 的模型选择模块的替代产品,采用尖端的超参数调整技术(贝叶斯优化、提前停止、分布式执行)——这些技术提供了比网格搜索和随机搜索显著的加速!
以下是 tune-sklearn 提供的内容:
- 与 Scikit-Learn API 的一致性: tune-sklearn 是 GridSearchCV 和 RandomizedSearchCV 的替代产品,因此您只需在标准 Scikit-Learn 脚本中更改不到 5 行就可以使用该 API。
- 现代超参数调优技术: tune-sklearn 允许您通过简单切换几个参数,轻松利用贝叶斯优化、HyperBand 和其他优化技术。
- 框架支持: tune-sklearn 主要用于调优 Scikit-Learn 模型,但它也支持许多其他具有 Scikit-Learn 包装器的框架并提供示例,如 Skorch (Pytorch)、KerasClassifiers (Keras)和 XGBoostClassifiers (XGBoost)。
- 纵向扩展: Tune-sklearn 利用 Ray Tune ,一个用于分布式超参数调整的库,在多个内核甚至多个机器上高效、透明地并行化交叉验证。

tune-sklearn 支持的框架示例。
Tune-sklearn 也是快。为了看到这一点,我们在标准超参数扫描上用本机 Scikit-Learn 对 tune-sklearn (启用了早期停止)进行了基准测试。在我们的基准测试中,我们可以看到普通笔记本电脑和 48 个 CPU 内核的大型工作站的显著性能差异。
对于更大的基准 48 核计算机,Scikit-Learn 花了 20 分钟来搜索超过 75 个超参数集的 40,000 大小的数据集。Tune-sklearn 只用了 3 分半钟——牺牲了最小的准确性。*
**
****
左图:在个人双核 i5 8GB RAM 笔记本电脑上,使用 6 种配置的参数网格。右图:在使用 75 种配置的参数网格的大型 48 核 250 GB RAM 计算机上。**
*注意:对于较小的数据集(10,000 或更少的数据点),在尝试适应早期停止时可能会牺牲准确性。我们预计这不会对用户产生影响,因为该库旨在加速大型数据集的大型训练任务。
简单的 60 秒演练
让我们来看看它是如何工作的。
运行pip install tune-sklearn ray[tune]或pip install tune-sklearn "ray[tune]"开始使用下面的示例代码。

超参数集 2 是一组没有希望的超参数,它们将被 tune 的早期停止机制检测到,并被早期停止以避免浪费训练时间和资源。
TuneGridSearchCV 示例
首先,只需修改我们的 import 语句,就可以获得 Tune 的网格搜索交叉验证接口:
从那里,我们将像在 Scikit-Learn 的界面中那样继续进行!让我们使用一个“虚拟”自定义分类数据集和一个SGDClassifier来对数据进行分类。
我们选择SGDClassifier是因为它有一个partial_fit API,这使它能够停止拟合某个超参数配置的数据。如果估计器不支持提前停止,我们将退回到并行网格搜索。
如您所见,这里的设置正是您为 Scikit-Learn 所做的!现在,让我们试着拟合一个模型。
请注意我们上面介绍的细微差别:
- 新的
early_stopping变量,以及 max_iters参数的说明
early_stopping决定何时提前停止——MedianStoppingRule 是一个很好的默认设置,但是请参见 Tune 关于调度器的文档这里有一个完整的列表可供选择。max_iters是给定超参数集可以运行的最大迭代次数;如果提前停止,它可能会运行较少的迭代。
试着将它与 GridSearchCV 的等价内容进行比较。
TuneSearchCV 贝叶斯优化示例
除了网格搜索接口, tune-sklearn 还提供了一个接口 TuneSearchCV,用于从超参数分布中采样。
此外,只需修改几行代码,就可以轻松地对 TuneSearchCV 中的分布进行贝叶斯优化。
运行pip install scikit-optimize来测试这个例子:
第 17、18 和 26 行是为了支持贝叶斯优化而修改的唯一几行代码
如你所见,将 tune-sklearn 集成到现有代码中非常简单。查看更多详细示例并开始使用 tune-sklearn 点击让我们知道您的想法!还可以看看 Ray 对 joblib 的替代,它允许用户在多个节点上并行训练,而不仅仅是一个节点,从而进一步加快训练速度。
文档和示例
- **文献 ***
- 示例:带 tune-sklearn 的 sko rch
- 示例:sci kit-Learn Pipelines with tune-sk Learn
- 示例: XGBoost 带 tune-sklearn
- 示例:带 tune-sklearn 的角膜分类器
- 示例:带 tune-sklearn 的 LightGBM】
*注:如链接文档所示,从 *ray.tune* 导入仅适用于夜间光线控制盘,并将很快在 pip 上提供
6 个惊人的 TensorFlow.js 项目启动了网络机器学习
进行手部跟踪、风格转换、背景移除等操作

杰瑞米·多洛在 Unsplash 上的照片
随着机器学习不断加速,越来越多的语言加入了这一行列。JavaScript 曾经一度是网络生态系统的领导者,现在也在慢慢加快机器学习的步伐。
在过去的一年中,已经发布了相当数量的专门用于机器学习的 JavaScript 库。这肯定会推动人工智能驱动的网络浏览器。此外,JavaScript for machine learning 通过利用 web 视图,具有在移动应用程序中快速轻松部署模型的优势。
在 TensorFlow 的核心,我们有一个 Web GL 加速的 TensorFlow.js 库,让您可以直接在浏览器中或使用 Node.js 来训练和运行模型。最棒的是,您不需要成为机器学习专家就可以部署基本模型,因为该库已经提供了一堆用于分类、分段等的预训练模型。
让我们看看几个基于 TensorFlow.js 构建的令人敬畏的库,以激发您的下一个机器学习项目。
1.人脸和情感识别
人脸检测一直是 Open-CV 中的经典用例之一,自然地,它也成为机器学习中的常见用例。
face-api.js 是一个基于 TensorFlow.js 实现的 JavaScript 人脸识别库,它可以让你检测和识别人脸和地标,同时还可以确定图像中的情绪和性别。
该库完全抽象了底层实现,为您提供了一个易于使用的高级 API。您所需要做的就是调用相关神经网络模型的方法,并选择调用现成的绘图函数在画布上覆盖特征点。

以下是使用地标和表情检测设置面部检测的基本代码:
const detection = await faceapi.detectAllFaces(image) .withFaceLandmarks() .withFaceExpressions();
2.图像风格转移
风格转移是当今最流行的深度学习任务。从照片编辑应用程序到自定义应用程序中的主题,它的可能性是无穷的。
在一个非常高的层次上,神经风格转移包括将风格从一幅图像传递到另一幅图像。一般来说,你可以使用名画或抽象艺术来为你的输入图像带来新的外观。
任意样式传输构建在 TensorFlow.js 之上,可以完全在浏览器中工作。
您可以将多种样式组合到一个图像中,还可以设定样式强度密度来控制最终输出中可见的纹理级别。

3.NSFW 分类器
nsfw.js 是另一个很酷的库,可以让你在浏览器中对图片或 gif 进行筛选和分类。如果你需要审查不适合孩子的内容,这很方便。
运行该模型将返回 5 个类,根据这些类的概率,您可以选择对输入图像应用模糊或像素化滤镜。
下面的代码展示了加载模型和运行推理是多么容易:
const model = await nsfwjs.load()
const predictions = await model.classify(img)

nsfw-filter 是上述库的一个很好的扩展,可以阻止 nsfw 图片在你的浏览器中显示。
4.人物分割
图像分割帮助我们突出和裁剪出图像中的某些特征。改变图像的背景是最简单的用例。
但是如果你需要做相反的事情呢?很高兴,有一个很酷的开源项目,可以让你从图像中去除人类。
这个 TensorFlow.js 项目在实时图像处理方面非常有效,当你在网络应用程序中使用视频通话功能时,它非常方便。

5.手跟踪
手部跟踪是另一个有趣的机器学习任务。通过实时跟踪手的位置,你可以构建基于手势的无接触浏览器,并对点击自拍进行动作捕捉。
从用手指书写和绘制涂鸦到不用鼠标或滑动就能滚动屏幕,手部跟踪的用例真的是无限的。
Handtrack.js 正是你在这种时候需要的库。除了提供边界框点,它还允许您在运行模型时设置自定义参数。

6.一个类似熊猫的图书馆
Panda 是一个强大的 Python 包,是机器学习中最受欢迎的库之一,用于执行数据操作、清理、可视化和许多其他任务。
尽管 JavaScript 在机器学习方面取得了长足的进步,但它总是缺乏一个像熊猫一样的库来完成预处理任务。但现在不是了。
Danfo.js 是一个基于 TensorFlow.js 构建的新的开源 JavaScript 库,它提供了易于使用的数据结构,可以轻松地将数组、JSON、对象、张量和不同索引的数据结构转换为 DataFrame 对象。
这将使处理数据集和执行任务,如合并或分割它们变得更加容易。

结论
TensorFlow.js 旨在让开发人员完全在其浏览器中训练和运行机器学习模型。对于 JavaScript 开发人员来说,这是进入机器学习世界的一个很好的方式。
最棒的是,与运行在苹果生态系统内的 CoreML 不同,TensorFlow.js 可以运行在 iOS、macOS、Linux、Android 以及任何支持浏览器的平台上。
我希望上面的库和项目能启发你开始构建令人惊叹的基于人工智能的 web 应用程序。
这一次到此为止。感谢阅读。
人工智能的 6 个最佳创业选择
意见
想用 AI 创业成功?

来源:Ian Stauffer 在 Unsplash 上拍摄的照片
人工智能是当今发展最快的领域。据财富报道,统计数据显示,人工智能专家的雇佣量在过去 4 年里增长了 74%。人工智能被认为是当代人最热门的工作。对熟练人工智能专家的需求正以前所未有的速度增长。对机器学习、深度学习、计算机视觉、统计学和自然语言处理等人工智能子领域专家的需求和空缺职位每天都在激增。
还有什么更好的时机来创业呢?你可能是一个拥有一些人工智能技能和知识的白手起家的企业家。感谢所有的大肆宣传,这是在人工智能领域建立自己的创业公司的最佳时机。然而,这需要一些事实核查和挖掘。
哪些领域实际上辜负了 AI 的所有加速炒作?为了回答这个问题,我们将不得不探索人工智能的各个领域以及伴随每个主题而来的各种想法。我将讨论各种可能的人工智能创业。然后,我会推荐一些建议,让你从这个特定的创业开始,并进一步详细解释。让我们开始分析 AI 的 6 个最佳创业选择,排名不分先后。
1.机器学习初创公司:
理念和方法— 解决复杂问题的优化算法、高质量推荐系统、高级垃圾邮件过滤、欺诈检测。

来源:丹尼尔·韦德罗在 unsplash 上拍摄的照片
机器学习初创公司提供了广泛的机会。有这么多方向可以选择。对于精通机器学习知识但缺乏深度学习视角或对深度学习不感兴趣的人来说,这也是一个很好的选择。有些人只是喜欢更复杂的数学和机器学习设计。他们真幸运!这是完美的启动选项。各种机器学习模型的设计、战略规划和部署可以根据他们选择的想法来执行,以在他们的商业风险中赚取现金和利润。
2.自然语言处理:
理念和方法— 面向商业和工业的独特创新聊天机器人,关注区域语言、文本到语音和语音到文本任务的机器翻译的序列到序列模型。

来源:Kourosh Qaffari 在 unsplash 上拍摄的照片
你喜欢文本、大量阅读、预处理和用基于文本的数据建立模型吗?答对了。这是规划和建立创业的最佳选择。自然语言处理作为创业选择的可能性是多种多样的。这些包括文本分类、有用数据的分离、高级聊天机器人的构建等等。如果你住在一个地区语言还没有在谷歌翻译中被确认为官方语言的地方,那也是一个很好的商业选择。此外,大多数谷歌翻译在某些语言上效果不佳。你可以即兴创作自己的数据集和想法,从而成功创业。如果你想建立聊天机器人,最好的方法是寻找你的目标受众、公司或企业。制作特定的聊天机器人是理想的,因为你可以极大地提高特定任务的性能。
3.计算机视觉:
思路和方法— 人脸识别、物体检测、人体活动识别、人体情绪和手势检测、图像分割、光学字符识别(OCR)。

来源:卡尔·海尔达尔在 unsplash 上拍摄的照片
我个人对计算机视觉项目和计算机视觉相关的初创公司非常感兴趣。这一领域提供了独特和多样的选择,以建立如此多的创新项目。计算机视觉项目旨在解释和可视化周围的图像和物体。一个卓有成效的计算机视觉商业风险可以产生很高的收入。计算机视觉可以跨许多平台使用。可以在智能手机、物联网设备等上执行人脸识别任务。对象检测任务可以用于图像检索、监视、自动车辆和机器检查。这里是我举的一个人类情感和手势识别的例子。通过选择你的目标受众和你想执行特定计算机视觉任务的公司来建立你的创业公司。
4.基于人工智能的医疗创业公司:
理念和方法— 先进的 x 射线扫描,恶意疾病的高级筛查和诊断,视网膜扫描,针对特定情况识别各种症状。

来源:照片由欧文·比尔德在 unsplash 上拍摄
人工智能正被广泛应用于医学研究和科学领域。由于预测的精确性和准确性,采用人工智能技术的医疗初创公司正获得极高的人气。开发高质量的模型,尤其是在医学和医学科学领域,是至关重要的。这是因为每个预测都可能危及个人的生命。这是对这些创业公司的需求每天都在上升的主要原因之一。如果你有兴趣在医疗行业帮助人们和创新设备,这是你最好的创业想法。
5.具有 AI 的物联网(基于物联网的 AI 创业公司):
理念和方法— 基于人工智能的机器人、使用嵌入式系统的安全性、自动驾驶人工智能汽车、嵌入式设备上的人脸识别和情感分析、家庭自动化设置。

来源:马文·迈耶在 unsplash 上拍摄的照片
这可能是人工智能最酷的创业想法。物联网和人工智能都是当今世界的热门词汇。将人工智能与物联网集成有大量选项可供选择。将人工智能与嵌入式系统结合起来执行各种杂务,如安全、监控、人脸识别和指纹识别等,是非常好的创业选择。机器人和人工智能是最受欢迎的领域之一。要阅读更多关于基于人工智能的机器人梦的内容,请点击这里查看这篇文章。总的来说,对于任何对物联网项目的现实生活和实时计算处理以及人工智能感兴趣的人来说,这是最佳选择。
6.虚拟助手:
思路和方法——语音识别与用户交互,对话式聊天机器人 AI,自然语言处理,计算机视觉知识。

来源:本斯·波罗斯在 unsplash 上拍摄的照片
虚拟助手需要特别提及他们自己。这是因为更精确和更健壮的虚拟助手构建起来相当复杂。然而,这些虚拟助理创业公司产生的收入可能非常高。掌握一些物联网、自然语言处理、计算机视觉和语音翻译方面的知识非常重要。现有的热门虚拟助手有亚马逊 Alexa,苹果的 Siri,谷歌助手,微软的 Cortana。市场需要更多的虚拟助手。人们喜欢这些虚拟助手提供的选择。然而,像 Alexa 这样的虚拟助手对某些人来说可能会稍微贵一些。这打开了一个惊人的创业想法出售。更便宜性能更好的虚拟助手和优化的算法可能是一个很大的卖点。在不久的将来,我会做一个关于如何制作你自己的虚拟助手的系列。

来源:照片由 V2osk 在 unsplash 上拍摄
最终想法:
一个人的性格不可能在安逸和平静中发展。只有经历考验和苦难,灵魂才能得到强化,抱负才能得到激发,成功才能实现。
海伦·凯勒
在我的经验中,这是 6 个最好的创业想法。如果你觉得我错过了什么,或者你觉得其他创业想法正在兴起,请随时告诉我。在一天结束的时候,自我满足和对你所感知的事物感到快乐是生活中最重要的事情。如果你选择了以下任何一个创业想法,我祝你好运!享受你的创业想法,不要害怕成功或失败。
真正的考验不是你是否会避免失败,因为你不会。而是你是否让它变得冷酷无情,或者让你羞愧而无所作为,或者你是否从中吸取教训;你是否选择坚持。巴拉克·奥巴马
确立你的创业想法和具体计划对你的创业成功和成为成功企业家至关重要。我希望所有人都喜欢阅读这篇文章,并能从中学习到一些东西。祝所有打算成为现代人工智能企业家的人好运!祝你有美好的一天,在另一篇文章中再见。
NBA 的 6 度分离:为什么中止它是不可避免的
用 Python 可视化 NBA 的旅游连接链(带数据和代码)

想象 NBA 中的关系网
截至 3 月 11 日,美国国家篮球协会已经暂停其赛季。这是 2020 年的另一个重大发展,它被各种与新冠肺炎相关的事件所主导,导致整个城市完全停滞。
(嗯,可能不是完全的停顿。人类的精神是一种神奇的东西——看看西西里的这个街区。)
(这是没有关系的;我只是想在这个糟糕的时期增加一些有趣的亮点。)
尽管西西里的好人尽可能多地利用手中的牌,但现实是艰难的。我们正在经历一个降低传染风险至关重要的时代,社会隔离和自我隔离等机制正在为此而部署。
虽然看到数百万人最喜爱的娱乐活动如 NBA 被推迟或推迟令人难过,但在这种环境下,这可能也是不可避免的。
事实是,除了暂停体育赛事之外,几乎没有其他理由,尤其是像 NBA 这样的网络。加倍如此,在这种情况下,作为一名球员已测试阳性的病毒。
NBA 赛季涉及大量的旅行——平均每个赛季每支球队将近 40,000 英里,并且一支球队不需要很长时间就可以最终与联盟中的所有其他球队联系起来。

NBA 球队每年走过的路程(摘自我之前写的文章
因此,我想用这篇文章来分析和直观地展示 NBA 是如何相互联系的,考虑到他们繁忙的旅行和比赛日程。
像往常一样,我将使用 Python 进行分析,使用进行可视化。我希望在这个充满挑战的时代,这是一个有用的、有益的和有趣的喘息。
准备
数据
我把代码和数据放在我的 GitLab repo 这里 ( sixdegs_leagues目录)。所以请随意使用它/改进它。
Packages
我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。
你需要pandas和plotly。用一个简单的pip install [PACKAGE_NAME]安装每一个(在你的虚拟环境中)。
入门指南
此分析的目标是确定每个团队在从某个特定日期开始与来源团队的“联系链”团队连接之前需要多长时间。
也就是说,通过一个曾经和另一个队比赛过的队来连接一个队。以此类推,直到他们到达源团队。本质上,我们将玩六度分离/凯文·贝肯,但与 NBA 球队,并可视化我们的结果。
加载数据
将日程数据csv加载到 Python / pandas 中
nba_sch_data = pd.read_csv(‘srcdata/2020_nba_schedule_fulldata.csv’, index_col=0)
该数据包含一个“est_time”列,该列以字符串格式包含美国东部时间的比赛日期(和开球时间)。这对于操作来说不太方便,所以让我们用pd.to_datetime函数创建一个新的包含这些数据的'datetime'列。
nba_sch_data = nba_sch_data.assign(datetime=pd.to_datetime(nba_sch_data.est_time))
加载我们的球队颜色字典,并列出球队名单,包括:
with open('srcdata/teamcolor_dict.pickle', 'rb') as f:
teamcolor_dict = pickle.load(f)
teamcolor_dict = {k.replace(' ', '_').upper(): v for k, v in teamcolor_dict.items()}
teams_list = nba_sch_data.home_team.unique()
选择“源”团队/日期
让我们选择一个开始日期,和一个源团队。我们可以随机进行;我们就挑 2020 年 3 月 10 日吧,也就是联赛停摆的前一天。
# Pick a random/particular "seed" team
seed_date = '2020-03-10' # YYYY-MM-DD
seed_tm = random.choice(teams_list)
在我的例子中,seed_tm结果是国王队(可能是他们在一段时间内赢得的唯一一次彩票)。
创建新的数据框架
首先,我们将创建一个新的 Pandas 数据框架,捕获每个团队的数据,这些数据与他们如何融入源团队的连接链有关。数据框架将包括:
- 团队名称(
team) - 他们是否在联系的团队链上有联系(
contacted) - 第一次连接到链上的日期(
date) - 将它们连接到链条上的团队(
con_from),以及 - 分离的度数(
deg_sep)。
teams_contacted_list = [{'team': tm, 'contacted': False, 'date': None, 'con_from': None, 'deg_sep': None} for tm in teams_list]
teams_contacted_df = pd.DataFrame(teams_contacted_list)
计算分离度
概括地说,我们的算法将:
- 从
seed_date开始或之后循环播放日程数据, - 评估一个游戏是否涉及链上的一个团队和接触链外的一个团队,
- 将“下链”团队记录更改为“上链”,以及
- 记录分离度。
为了开始编写代码,我们为源团队设置了第一行数据:
然后,当一个团队被添加到“联系链”中时,我们可以通过日程数据迭代来查找游戏。请看一下我的实现:
我正在做的是查看游戏中每个团队的状态,首先是是否存在不匹配——如果两个团队都在链上,或者不在链上,则不需要采取任何行动。
然后,我更新联系的状态,然后对于不在链上的团队,数据被更新。联系的日期是基于比赛的日期,而分离的程度是加到对方球队的。
检查结果:
(我相对快速地浏览了一遍,如果您有任何问题,请告诉我)。结果看起来相当合理。让我们开始观想吧!
可视化分离度
直方图
首先,我们将绘制一个直方图,以查看团队与我们的随机来源团队的分离程度:
fig = px.histogram(teams_contacted_df, x='deg_sep', template='plotly_white')
fig.update_layout(bargap=0.5)
fig.show()

分离度直方图
有趣的是,它们中的大多数(29 个中的 19 个)只有 3 度或更少的分离度!哇!。
分离天数
同样,我们可以看看团队接触的天数。
在这里,我创建了一个名为 days 的numpy数组,它是从链的起点开始的天数。
然后,我用 Plotly Express 调用一个横条图。应该比较直截了当。(Plotly.py 条形图文档如果不熟悉的话。)
days = (teams_contacted_df.date-min(teams_contacted_df.date)) / np.timedelta64(1, 'D')
teams_contacted_df = teams_contacted_df.assign(days=days)fig = px.bar(
teams_contacted_df, x='days', y='team',
orientation='h', template='plotly_white',
labels={'team': 'Team', 'days': 'Days until contacted.'}
)
fig.update_layout(bargap=0.2)
fig.show()

从 2020 年 3 月 10 日起,每支球队与(随机选择的)萨克拉门托国王队分开的天数
在这种情况下,一个团队离源团队最远只有 15 天,大约一半的联盟会在 9 天内联系。
我们可以在这个图中添加更多的细节——还记得我们是如何捕捉到将每个团队添加到链中的团队的吗?让我们添加数据。我们可以通过团队颜色来直观地做到这一点。在 Plotly Express 中,我们只需将列名('con_from')传递给参数'【T2 ')。
# Days of separation, grouped by source team
fig = px.bar(
teams_contacted_df, x='days', y='team',
orientation='h', template='plotly_white', color='con_from',
labels={'team': 'Team', 'days': 'Days until contacted', 'con_from': 'Contact source:'}
)
fig.update_layout(bargap=0.2)
fig.show()

与(随机选择的)国王分离的天数,按之前的链接分组
这就包含了更多的信息——尽管颜色是随意的,令人困惑。举例来说,我可能会认为湖人是被凯尔特人加入进来的(因为绿色)。让我们改变颜色。
有不同的方法可以做到这一点——例如,你可以在color_discrete_sequence参数下传递一个颜色列表给px.bar函数调用。
我在这里是通过循环遍历fig对象下的数据来实现的:
for i in range(len(fig['data'])):
fig['data'][i]['marker']['color'] = teamcolor_dict[fig['data'][i]['name']]
再次渲染图形:

与(随机选择的)国王分离的日子,有“真正的”球队颜色。
它并不完美——它确实存在一些球队颜色相似的问题,但我认为它工作得很好,把你的目光吸引到正确的地方。
很有趣,不是吗?可以预见的是,大部分传播是由原始团队(国王)完成的,但实际上只占很小的比例。大部分工作由其“子”节点完成——这就是网络传播的力量。
我们能把这个标在地图上吗?是的,我们去吧。
描绘未来
我们首先需要竞技场坐标——在我刚才完成的地方加载这个文件,并创建一个新的'teamupper'列,以使球队名称格式与我们的其他数据帧保持一致。
arena_df = pd.read_csv('srcdata/arena_data.csv', index_col=0)
arena_df = arena_df.assign(teamupper=arena_df.teamname.str.replace(' ', '_').str.upper())
竞技场位置
作为第一个练习,让我们简单地标出这些位置来检查:
# Load mapbox key
with open('../../tokens/mapbox_tkn.txt', 'r') as f:
mapbox_key = f.read().strip()
# Plot a simple map
fig = px.scatter_mapbox(arena_df, lat="lat", lon="lon", zoom=3, hover_name='teamname')
fig.update_layout(mapbox_style="light", mapbox_accesstoken=mapbox_key) # mapbox_style="open-street-map" to use without a token
fig.update_traces(marker=dict(size=10, color='orange'))
fig.show()
这段代码使用 Plotly Express 创建了一个新的“散点 _ 地图框”类型的绘图,在每个纬度和经度绘制每一行arena_df。我还在这里设置了一个标记的大小和颜色,这是可选的。
值得注意的是,因为这个调用使用了需要 Mapbox 标记的“light”样式。你可以用地图框得到一个免费的,这是我有的。或者,用mapbox_style=”open-street-map”代替,不用钥匙。它会工作得很好,虽然我不认为它看起来很好。(如果你感兴趣的话,这篇精彩的文档会有更详细的介绍。)

NBA 赛场位置
映射连接
我们有一个数据框架(teams_contacted_df),它记录了每个团队何时被添加到连接链中,以及由谁添加的。
扩展这些数据,我们将添加出发团队和目的团队的位置。这些数据并不表明团队的旅行,更多的是连接的路径。例如,如果洛杉矶湖人队被圣安东尼奥马刺队加入到链条中,但是比赛在洛杉矶,那么“起源”位置将仍然在圣安东尼奥。
然后,有了这些数据,我们就可以创建一个新的图——在这个图中,从一个团队到另一个团队的每一行都用一条线表示。
同样,有多种方法可以做到这一点。我选择这样做,为每个连接创建一个新的数据序列。(有一种观点认为,应该为每一天或每一个团队创建一个新的系列。我将演示我所做的,但请随意尝试您自己的变化!)
所以我在这里做的是使用经典的情节性(plotly.graph_objects),并且:
- 初始化一个新图形
- 添加第一个轨迹,这是所有的竞技场
- 对于
teams_contacted_df数据帧的每一行,添加一条连接“起点”团队竞技场和“终点”团队竞技场的新轨迹。 - 每个轨迹都有连接日期的名称,以及“起点”和“终点”团队名称(您可以在图例中看到)

在地图上代表每个团队的联系
你可能已经注意到了一些事情——首先,地图以非常低的缩放级别加载,我们没有显示任何国家边界,也没有标题。让我们解决所有这些问题:
这导致了这个图:

团队在地图上的联系,有更多格式
我认为它信息量很大,但是仍然缺少一些信息。我更愿意看着地图,立即知道是哪个竞技场(我是澳大利亚人,仍然会把休斯顿/达拉斯/圣安东尼奥弄混),也知道每个城市的分隔程度。
点睛之笔-地图上的文字
该图允许我们直接将文本和标记一起添加到地图中。让我们添加文本来显示团队名称,并在下一行显示该团队与我们的源的分离程度。
文本只需要作为列表传递;我们可以通过以下方式构建它:
txt_list = list()
for i in range(len(arena_df)):
teamupper = arena_df.iloc[i].teamupper
temp_row = teams_contacted_df[teams_contacted_df.team == teamupper]
temp_txt = (
temp_row.team.values[0].split('_')[-1]
+ '<BR>' + str(temp_row.deg_sep.values[0]) + ' degrees of sep.'
)
txt_list.append(temp_txt)
然后,每个团队的文本变成类似于:'【T0]'
基于D3.js,像<BR>这样的简单 HTML 标签将被呈现在页面上,这很简洁。
所以现在对竞技场的需求可以包括这个列表:
fig.add_trace(go.Scattergeo(
mode="markers+text",
lon=arena_df['lon'], lat=arena_df['lat'], marker=dict(size=8, color='slategray'),
hoverinfo='text', **text=txt_list**, name='Arenas'
))
还要注意的是,Scattergeo调用中的mode参数值已经更改为“markers+text”。这告诉 Plotly 也在屏幕上呈现文本数据。
最终结果如下所示:

地图上团队的联系,地图上有文字
就这样,我们可以将所有 30 个团队的位置,到“源”的“网络连接”路径,以及连接的详细信息绘制到交互式地图上!
由于源代码在我的 GitLab repo 中,请随意使用不同的日期和团队。当然,它不需要太多的修改就可以应用到不同的联赛,这将是很酷的。(MLB,NFL…EPL 怎么样?)
这是同样的模拟,从犹他爵士开始:

从 2020 年 3 月 10 日开始的与爵士的联系日,期待
和网络图。

从 3 月 10 日起,球队与犹他爵士队的联系
从上面的两个例子可以看出,连接所有三十个团队真的不需要很长时间,或者说不需要那么多跳。
反过来,暂停联盟肯定是显而易见的——在短短几天内,一半的联盟将被连接,并且在两周内,所有的球队都将与一个“来源”球队联系。
我将在 Plotly Dash 中创建一个仪表板,允许人们使用不同的输入日期和来源位置,但现在—自己使用数据,让我知道你还发现了什么。我很快就把这些放在一起了,所以我不知道你是否能循环所有可能的日期和团队组合——但我肯定这不会很难。
将这一数据与其他联赛进行比较也很有趣——无论是 MLB,球队打更多的比赛,NFL,不是所有球队都互相比赛,每周只打一场,还是欧洲冠军联赛,欧洲冠军联赛纵横交错。我也很想知道这些数据是什么样的。
不过,对我来说就这样了。正如我提到的,我可能会把它变成一个 Dash 仪表板,然后回来分享它。在那之前——保持安全,互相照顾。帮大家把曲线拉平!
如果你喜欢这个,比如说👋/关注推特,或点击此处获取更新。ICYMI:我还写了这篇关于用 Plotly Dash 构建 web 数据仪表板的文章。
[## 使用 Python 在几分钟内构建一个 web 数据仪表板
通过将您的数据可视化转换为基于 web 的仪表板,以指数方式提高功能和可访问性…
towardsdatascience.com](/build-a-web-data-dashboard-in-just-minutes-with-python-d722076aee2b)
这是关于视觉化隐藏的关系:
[## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析
使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…
towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50)
回头见!😃
用张量流 2 和张量流概率实现 VAE 的 6 种不同方式

自从在 2013 到本文中引入以来,变分自动编码器(VAE)作为一种生成模型,随着其在广泛领域的应用,已经席卷了贝叶斯深度学习的世界。Kingma 和 Welling 的原始论文被引用超过 1 万次;同时,乍一看,它的构造可能不容易理解,因此有许多很好的文章解释了该模型的直觉、架构和其他不同的组件。
然而,VAE 的实现通常是作为那些文章的补充,代码本身较少被谈论,尤其是在一些特定的深度学习库(TensorFlow,PyTorch 等)下被上下文化。)—这意味着代码只是放在代码块中,没有足够的注释说明一些参数是如何工作的,为什么选择这个函数而不是其他函数,等等。此外,由于这些流行库的灵活性,您可能会发现这些演示 VAE 实现看起来都各不相同。此外,一些版本可能会被错误地实现,即使是 TensorFlow 自己的教程中的(我将在后面处理这个帖子,主要在我的实现的版本 a. 下),但如果不与其他版本进行比较,这些错误可能不会被发现。最后,遵循一个有效的版本当然很好,但是我几乎没有看到一篇文章比较横向不同的实现方式。所有这些促使我写这篇文章。
我假设读者已经对 VAE 的工作原理有了一定程度的了解,并且想知道更多关于实现方面的东西。
我打算把这篇文章分成两个部分,这两个部分共同构成了标题:
- 使用 TF 2 和 TFP实现一般 VAE时需要特别注意的事项
- 如何用不同的方式实现 VAE ,使用 TF 2 和 TFP
在开始深入每一部分之前,我想用下面两段话来分享一下我学习这个模型的亲身经历:
在我开始实现它之前,我一直认为我在读了这篇论文之后对这个模型有了很好的理解。当阅读报纸时,通常有太多关于模型的细节,以至于人们很可能会忘记需要额外注意的部分。有时,论文用一个简短的句子描述的模型的一个组成部分可能需要我花几个小时才能完全掌握,并在实现过程中使其工作。在我看来,如果你想很好地理解一个模型是如何工作的,尽管尽可能彻底地阅读这篇文章肯定是好的,但最好还是自己去实现它。
当你开始实现模型时,我会说选择一个社区已经知道模型将如何表现的基准数据集,而不是试图提出你自己的数据集,特别是如果你是第一次实现模型。这一点尤其重要,因为你对结果会是什么样子有一个非常明确的目标——可以说是一个参考。因为仅仅使代码运行无误,并看到成本下降,还远远不能称之为实现工作;我们至少需要看看它是否以其他人已经在特定数据集上观察到的特定方式表现。
第 0 部分:阐明实现目标
根据上一节的讨论,我将介绍数据集,以及 VAE 模型要完成的特定任务。在这篇文章中,我使用了手写数字的 MNIST 数据集,以及形状为(28,28,1)的图像。我对它进行了预处理,将数据集归一化为介于 0 和 1 之间,并将值离散化为 0 或 1 ,使用 0.5 作为阈值。VAE 模型要在该数据集上完成的任务有:
(a)尽可能接近地重建输入数字图像
(b)使用来自先验分布的随机样本(而不是来自后验分布的样本,以数据为条件)作为解码器的输入,生成看起来逼真的新数字图像
任务 (a) 相对容易完成,然而任务 (b) 在我看来是指示实现是否工作的任务:它已经从训练数据中学习了不同数字的多模态,并且能够产生新的数字图像作为生成模型。
现在我们准备深入这篇文章的每一部分。
第一部分:实施 VAE 时的主要重点
两件事,都与每个实例的损失函数有关:
- 损失函数由两部分组成:反向 KL 散度(潜在变量 z 的先验和后验分布之间),以及期望的负对数似然(待重构数据上的解码器分布;也称为预期重建误差)。将这两部分相加,我们得到负的 ELBO,它将被最小化。对于每个部分的计算,我们需要额外注意我们需要在数据的每个维度上做什么操作(取和 vs .取均值)。
- 损失函数中 KL 散度的权重是一个我们根本不应该忽略的超参数:它调整了 z 的先验和后验分布之间的“距离”,对模型的性能起着决定性的作用。
这是损失函数:

这个损失函数的计算可以通过各种方式来完成,并且在实现过程中经常很容易出错,尤其是 w.r.t .第一个要点中提到的:对数据的每个维度的操作。我会在第二部分中详细阐述,每种实现方式都会单独介绍。
注意,它实际上应该是β-VAE 的损失函数,其中 ω 可以取除 1 以外的值。这个超参数是至关重要的,特别是对于任务 (b) 在第 0 部分中提到的时候:这个超参数的作用是决定我们想要惩罚 z 的先验分布和后验分布之间的差异的力度。很多时候,图像的重建看起来很完美,而从代码 z 采样得到的图像看起来很疯狂。如果 ω 设置得太小,我们基本上根本不正则化后验概率,因此训练后它可能与前验概率有很大不同——从某种意义上说,从前验概率采样的 z 经常会落入后验概率分布中密度非常低的区域。因此,解码器不知道如何处理这些样本 z ,因为它是根据后验分布(注意上面损失函数中负对数似然项的期望下标处的分布)对 z 进行训练的。以下是 ω=0.0001 时重构生成的数字:

重构位数 ω=1e-4

生成的数字 ω=1e-4
注意重构的数字可以清晰的分辨出来(也和它们的标签匹配),但是生成的数字基本都是深色的,无法识别。这是正则化不足的一个例子。
另一方面,如果 ω 太大,后验将被拉得太靠近先验,因此无论什么图像被输入到编码器,我们最终都会得到一个 z ,就好像它是从先验中随机采样的一样。以下是 ω=20 时重构生成的数字:

重构位数 ω=20

生成的数字 ω=20
请注意,所有数字看起来都一样,不管它是根据输入数字重建的,还是作为新数字生成的。这是过度正规化的一个例子。
第三,我们有当 ω 被设置为“恰到好处的量”时的场景——在某种意义上,后验与前验足够不同,可以对输入数字数据进行灵活的调节,因此重建看起来很棒;虽然两个分布的高密度区域有足够的重叠,因此来自先验的 z 样本对于作为其输入的解码器来说不会看起来太陌生。以下是 ω=3 时重构生成的数字:

重构位数 ω=3

生成的数字 ω=3
请注意,所有重建的和大多数生成的数字看起来都是可识别的,而一些生成的数字看起来不太真实。
总之,虽然自动编码器设置对潜在变量 z 设置了信息瓶颈,迫使其仅保留在降维后重建 x 所需的最基本信息,但是 ω 有助于将 z 放置在能够使解码器从头生成看起来像真实的 x、的新 x 的空间,同时保持重建的质量。
有点题外话:张量流 2 和张量流概率
你可能会注意到,虽然我把这两个库放在了我的标题中,但是到目前为止,这篇文章只讨论了 VAE 模型及其在 MNIST 数据集上的应用。我最初想在构建帖子时将 TF 2 和 TFP 作为第三个组件来写,但后来我决定将它们放在上下文中,即在中讨论它们,而在第一部分和第二部分中讨论实现细节。然而,如果我没有给出这些库的一点背景知识就直接进入代码,这可能显得太草率了。所以他们来了。
TF2
TensorFlow 2.0.0 于 2019 年—9 月下旬发布,所以距离最初发布还不到一年。目前最新版本是 2.3.0 ,7 月发布, 2020 。去年 11 月,我开始从事一个研究项目,这个项目让我选择了 TF 2 ,因此到目前为止,我已经使用了所有四个版本,每个版本都用了一段时间。当时,我充分意识到 PyTorch 已经在研究界获得了很多关注;我选择 TF 2 主要是因为它是构建项目代码库的库。**
我对 TF 2 的第一印象:开发深度学习模型确实比 TF 1 方便很多。急切执行是其将 TF 2 与 TF 1 区分开来的最显著特征之一,我不再需要在看不到任何中间结果的情况下构建整个计算图,这使得调试成为一场灾难,因为没有简单的方法来分解每个步骤并测试其输出。虽然急切执行可能会损害模型训练速度,但装饰器@tf.function在某种程度上有助于恢复图形模式下的效率。此外,它与 Keras 的集成带来了一些很好的好处——顺序和功能 API 在堆叠神经网络(NN)层时带来了不同程度的灵活性,就像 PyTorch、torch.nn.Sequential和torch.nn.functional下的对等物一样;同样作为一个高级 API,它的接口看起来似乎很简单(以至于它会在 VAE 实现过程中造成麻烦——查看我在第二部分中的实现版本 a. 下的讨论),好像我正在训练一个 scikit-learn 模型。
与此同时,由于它第一次发布才不到一年,它肯定不像我希望的那样稳定。我仍然记得我被一些简单的张量索引程序卡住了:我在多个版本中实现了相同的功能,这都导致了相同的错误消息;然而,这是一个如此简单的步骤,没有人会想到它会导致错误。原来,今年 1 月初发布后将 TF 版本更新为 2.1.0 后,模型在不修改任何代码的情况下工作。最近的一个例子是在展平张量后添加一个Dense层时,我得到了一个关于维度的错误信息,这也在将 TF 版本从 2.2.0 更新到 2.3.0 时消失了。
此外,它的用户和开发者社区并不像我预期的那样活跃。我在 Keras Github 问题页面下发布了多个问题,包括上面提到的那个——最后都是我回答了自己的问题并结束了这个问题。一些问题在几个月后获得了用户的评论,但 TensorFlow/Keras 团队没有解决任何问题。
最后,它的一些文档不够简单明了,也不够有条理。我花了很多时间试图弄清楚装饰器@tf.function实际上是如何工作的,最终我得出结论,最好的方法就是试图模仿工作示例,而不要太在意目前的基本原理。它的一些教程也显得草率甚至误导(通过给出不正确的实现)——我将在后面给出例子。
全股骨假体
TensorFlow Probability 是在 2018 上半年推出的,作为一个专门为概率建模开发的库。它在幕后实现了重新参数化的技巧,这使得训练概率模型的反向传播成为可能。您可以在 VAE 论文和提出了通过反向传播算法的贝叶斯的本文中找到重新参数化技巧的很好演示——前者的潜在变量 z 的隐藏节点和解码器的输出节点是概率性的,而后者的可学习参数(每个 NN 层的权重和偏差)是概率性的。**
有了 TFP,我们不再需要为 z 的后验分布显式定义均值和方差参数,也不需要计算 KL 散度,这大大简化了代码。事实上,它可能会使实现过于简单,以至于不了解 VAE 也能实现,因为它的主要组件需要很好地理解模型,基本上都是由 TFP 抽象的。因此,在使用 TFP 实现 VAE 时也很容易出错。
我建议你从显式实现重新参数化技巧和定义 KL 术语开始,如果这是你第一次实现 VAE,并且你想很好地了解模型是如何工作的——我将在第二部分的第一个版本中以这种实现方式开始。
第二部分:实施 VAE 的不同方式
在深入每个实现版本的细节之前,我想先在这里列出它们。这份清单绝非详尽无遗,而是代表了我打算提出的观点。
实施 VAE 的各种方式是由于我们对以下每个 3 模块有不同的选择:
- 编码器的输出层
- 解码器的输出层
- 损失函数(主要是计算预期重建误差的部分)
每个模块都有如下选项:
编码器的输出层
tfpl.IndependentNormaltfkl.Dense输出 z 的后验分布的(串联)均值和(原始)标准差
解码器的输出层
tfpl.IndependentBernoullitfpl.IndependentBernoulli.meantfkl.Conv2DTranspose输出逻辑
损失函数
negative_log_likelihood = lambda x, rv_x: -rv_x.log_prob(x)tf.nn.sigmoid_cross_entropy_with_logitstfk.losses.BinaryCrossentropytf.nn.sigmoid_cross_entropy_with_logits+tfkl.Layer.add_loss- PyTorch 式显式计算,通过
with tf.GradientTape() as tape+tf.nn.sigmoid_cross_entropy_with_logits+tfkl.Layer.add_loss - 通过
with tf.GradientTape() as tape+tf.nn.sigmoid_cross_entropy_with_logits按历元进行 PyTorch 式显式计算
侧注:
我们有以下模块缩写:
将 tensorflow 作为 tf 导入
将 tensorflow_probability 作为 tfp 导入
tfd = TFP . distributions
tfpl = TFP . layers
tfk = TF . keras
tfkl = TF . keras . layers
还要注意,编码器和解码器的神经网络架构不太重要——我使用与本 TF 教程相同的架构来实现所有版本。
有人可能会想,既然 KL 散度的计算可以用不同的方式来完成(解析解 vs. MC 近似),那么它也应该是一个模块;但由于实现这一术语的方式或多或少取决于解码器输出层的选择,并且将其作为第四个模块添加可能会使演示过于复杂,因此我选择在其中一个实现版本(版本 a. )下讨论它。
实现只是来自每个 3 模块的不同选项的组合:

不同的 VAE 实现及其模块选项
现在让我们深入了解实现的每个版本。
版本 a.
这个版本可能是最广泛采用的一个版本——据我所知,我的所有同事都是这样写的:编码器输出节点,这些节点代表潜在变量 z 的后验分布的均值和(在ℝ范围内的一些变换)标准差。然后,我们使用重新参数化技巧对 z 进行如下采样(来自 VAE 论文的等式 (10) ):

从 z 的后验取样的重新参数化技巧
其中 ϵ 从标准多元高斯分布中采样,后验分布 q 的均值和标准差从编码器中确定性地输出。获得的 z 然后被用作解码器的输入。由于预处理后我们的图像数据 x 是二进制的,很自然地假设一个多变量伯努利分布(其中所有像素彼此独立),其参数是解码器的输出——这是在 VAE 论文的附录 C.1 伯努利 MLP 作为解码器中描述的场景。因此,解码器分布的对数似然具有以下形式(VAE 论文的方程 (11) ):

以伯努利 MLP 为解码器的图像重建分布的对数似然
其中 y 是解码器输出的每个像素的伯努利参数, D 是每个实例的像素数。 z 这里代表来自编码器的单个样本;由于损失函数中的预期负对数似然项无法解析计算,我们使用如下 MC 近似(来自 VAE 论文的方程 (10) ):

z 的 L 个样本下对数似然的 MC 逼近
其中 z 项(与上面的重新参数化技巧等式中的上标形式完全相同)表示第 i 个数字图像实例的第 l 个 MC 样本。实际上,通常设置 L=1 就足够了,即只需要一个 MC 样本。
损失函数中的另一项,反向 KL 散度,也可以通过 MC 样本来近似。由于我们假设编码器分布 q 为多元高斯分布,我们可以直接将编码器输出的均值和方差代入其密度函数:

反向 KL 散度的 MC 近似
其中 f 代表多元高斯密度。同样,我们也可以在实践中设置 L=1 。
此外,如果我们让 q 是具有对角协方差矩阵的多元高斯,则 KL 散度项可以如 VAE 论文的附录 B 所示解析计算:**

负反向 KL 散度的解析解
其中 J 代表 z 的维数。
在这个版本的实现中,我放了计算小批量图像数据成本的代码(注意, loss 函数是在单个实例上计算的;成本函数是所有实例的平均损失)到函数vae_cost中,并通过函数train_step定义每个时期的优化步骤。下面是它们在 TF 2 中是如何实现的:**
这里需要解决几个问题:
- 预期重建误差的计算
由于伯努利分布的负对数似然性本质上是交叉熵损失的来源(如果你不能马上看到它,这篇文章给出了一个很好的评论),我们可以使用现有的函数——在这个实现版本中,我选择了tf.nn.sigmoid_cross_entropy_with_logits:这个函数将伯努利参数的二进制数据和逻辑作为参数,所以我没有对最后一个解码器层tfkl.Conv2DTranspose的输出应用 Sigmoid 激活。
注意,该函数保持其输入的原始维度:由于数字图像和解码器输出的每个实例都是形状为(28,28,1),tf.nn.sigmoid_cross_entropy_with_logit将输出形状为(batch_size, 28,28,1)的张量,每个元素是该特定像素的伯努利分布的负对数似然。由于我们假设每个数字图像实例具有独立的伯努利分布,因此每个实例的负对数似然性是所有像素的负对数似然性之和,因此是上面代码块中的函数tf.math.reduce_sum(…, axis=[1, 2, 3])。
如果您计划使用 Keras API,这就是需要采取额外预防措施的地方:Keras API 最大的好处之一是它大大简化了训练神经网络的代码,只有三行代码: (1) 通过定义网络的输入和输出来构建一个tfk.Model对象; (2) compile通过指定loss功能和optimizer得到模型; (3) 通过调用fit方法训练模型,其参数包括输入输出数据、小批量、历元数等。对于步骤 (2) ,自变量loss取一个正好有两个自变量的函数,并通过取该函数输出的所有 维度 的平均值来计算训练期间该批数据的成本,不管它是什么形状。因此,在我们的例子中,你可能很想根据你看过的所有 Keras 教程来编写loss=tf.nn.sigmoid_cross_entropy_with_logits,但这是不正确的,因为它对每个实例的所有像素的交叉熵损失取平均值,而不是将它们相加——由此产生的成本将不再拥有任何统计解释。但是不用担心,你仍然可以将tf.nn.sigmoid_cross_entropy_with_logits与 Keras API 结合起来——在c 版本下。*我会详细说明如何做。***
还记得在帖子的最开始,我提到了 TensorFlow 自己的教程之一有不正确的 VAE 实现吗?现在是时候仔细看看了:它犯的第一个错误是对预期重建误差的计算。它应用mse_loss_fn = tfk.losses.MeanSquaredError()作为损失函数:首先,对我来说,选择均方误差已经是有问题的——不仅它隐含地假设重建分布是具有实值数据的独立高斯分布,而我们预处理后的图像数据是二进制的,这使得独立伯努利分布的假设成为更自然的选择,而且 MSE 计算高斯分布的缩放和偏移的负对数似然,这意味着你将使用贝塔-VAE 损失而没有意识到它;(更)重要的是,tfk.losses.MeanSquaredError()没有明确定义自变量reduction也会计算所有维度的 MSE *的平均值。同样,我们需要取平均值的唯一维度是实例维度,对于每个实例,我们需要对所有像素取和。如果想要应用tfk.losses模块,在实施版本 d 下,我将演示如何使用tfk.losses.BinaryCrossentropy,这是一个更适合我们的情况的选择,用于计算预期的重建误差。*
- KL 散度的计算
出于与上面类似的原因,需要额外注意:我们需要对数据的每个维度进行操作,特别是取平均值或总和。
注意,对于 KL 散度的解析解,我们取所有 J 维度上的元素的 z 的后验分布的参数之和。然而,在同一个 TensorFlow 教程中,它的计算方式如下:
kl_loss = -0.5 * tf.reduce_mean(
z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1
)
这是他们在指南中犯的第二个错误,因为他们在所有维度上取平均值。
也可以使用一个 z 样本的 MC 近似来计算 KL 散度——在analytic_kl=False时检查代码。如果你想验证你的实现是否正确,你可以用下面的方法来近似 KL 散度,把 L 设为某个大整数,比如说 10,000:

其中每个 z 被采样通过

看看结果是否和你用解析解得到的结果相似。
最后,如果您不想手动计算 KL 散度,您可以使用 TensorFlow 概率库中的函数,该函数直接计算两个分布之间的 KL 散度:
prior_dist = tfd.MultivariateNormalDiag(loc=tf.zeros((batch_size, latent_dim)), scale_diag=tf.ones((batch_size, latent_dim)))
var_post_dist = tfd.MultivariateNormalDiag(loc=mu, scale_diag=sd)
kl_divergence = tfd.kl_divergence(distribution_a=var_post_dist, distribution_b=prior_dist)
既然我们刚刚提到了 TFP,现在是时候进入下一个版本的实现了,这就是关于这个库的。
版本 b.
通过将 TFP 与 TF2 的 Keras API 相结合,代码看起来比版本 a 中的代码简单得多这实际上是我最喜欢的版本,并且由于其简单性,将是我将来使用的版本。
在这个版本中,编码器和解码器的输出都是来自tensorflow_probability.distributions模块的对象,这些对象有许多你期望从概率分布中得到的方法:mean、mode、sample、prob、log_prob等。为了从编码器和解码器获得这样的输出,你只需要用一个tensorflow_probability.layers对象替换它们的输出层。
实现如下:
就是这样!代码重新格式化后的 62 行代码,包括注释。这种简化的主要原因之一是对 z 的采样,因为重新参数化技巧的所有步骤都通过编码器输出 TFP 层tfpl.IndependentNormal进行了抽象。此外,KL 散度计算是通过概率编码器输出层中的activity_regularizer参数完成的,其中我们指定先验分布为标准多元高斯分布,以及 KL 散度权重 ω ,以创建tfpl.KLDivergenceRegularizer对象。此外,可以通过简单地调用解码器输出的log_prob方法来计算预期的重建误差,该方法是一个tfp.distributions.Independent对象——这是它所能得到的最简洁的方法。
一个警告是,有人可能认为既然解码器的输入需要是一个张量,但是 z 是一个tfp.distributions.Independent对象(参见第 53 行),我们需要改为编写z = encoder(x_input).sample()来显式采样 z 。这样做不仅没有必要,而且不正确:
- 不必要,因为我们已经将
convert_to_tensor_fn设置为tfd.Distribution.sample(这实际上是默认值,但我明确地写了出来,以便您可以看到):该参数的作用是,每当该层的输出被视为tf.Tensor对象时,就像在我们的情况下,当我们需要来自该分布的样本时——outputs=decoder(z)在第 56 行,它将调用由convert_to_tensor_fn指定的方法,因此它已经在做outputs=decoder(z.sample())。 - 不正确,因为随着
.sample()被显式调用,应该由tfpl.KLDivergenceRegularizer计算的 KL 散度将不会作为成本的一部分被提取。可能是.sample()被调用后,我们在神经网络的计算图中不再有 z 作为tfp.distributions.Independent对象,也就是包含tfpl.KLDivergenceRegularizer作为其activity_regularizer的对象类型。因此,在实现 VAE 的这个版本中对编码器输出进行.sample()将会给我们一个仅包含预期重建误差的损失函数——经过训练的 VAE 将不再充当生成模型,而是仅重建其输入的模型。
这个版本的实现非常类似于 TensorFlow 的本教程,它比版本 a. 下显示的要好得多——既可以重建现有数字,也可以生成新数字。在这篇文章中,我只想说几件事:
- 他们应用
tfpl.MultivariateNormalTriL而不是tfpl.IndependentNormal作为编码器输出概率层,该概率层本质上训练下三角矩阵的非零元素,该下三角矩阵在概念上从正定矩阵的乔莱斯基分解导出。这样的正定矩阵本质上是 z 的后验分布的协方差矩阵,可以是任意正定矩阵,而不仅仅是 VAE 论文中假设的对角矩阵。这将给予我们更灵活的后验分布,但也包含更多的参数来训练,并且 KL 散度计算起来更复杂。 - 他们在
tfpl.KLDivergenceRegularizer中将 KL 散度weight设置为默认的 1.0 ,但是就像我在第一部分中讨论的那样,这个超参数对于 VAE 实现的成功至关重要,并且通常需要进行显式调整以优化模型性能。
最后,对于这个实现版本,我想展示应用 TFP 层作为解码器输出的一个好处:我们能够获得更灵活的预测。对于原始 VAE,解码器输出是确定的,因此在采样 z 之后,解码器输出被设置。但是,由于输出是一个分布,我们可以调用mean、mode或sample方法来输出一个tf.Tensor对象作为数字图像预测。以下是调用不同方法进行重建和生成时的结果:

用于数字图像重建的解码器分布的一个样本

数字图像重建中解码器分布的意义

数字图像重建的解码器分布模式

用于新数字图像生成的解码器分布的一个样本

用于新数字图像生成的解码器分布的平均值

用于新数字图像生成的来自解码器分布的模式
注意,对于重建和生成,平均值似乎比模式更模糊(或不如模式清晰),因为伯努利分布的平均值是在 0 和 1 之间的值,而模式是 0 (当参数小于 0.5 时)或 1 (否则);该样本比其他两个样本显示出更多的粒度,同时看起来也很清晰,因为每个像素都是随机样本(与模式不同,模式在训练后基本上知道所有像素作为一个整体将取什么值来形成一个数字),它也取 0 或 1 作为其值。这就是概率分布所能提供的灵活性。
以下两个版本的实现侧重于在应用 Keras API 简化代码的同时,如何定制损失函数以正确计算期望的重构误差;由于版本 a.** 中的讨论已经为这两个版本奠定了基础,所以我可以将重点放在演示代码上。**
c 版。
在版本 a.** 中,我们讨论了当compile对象tfk.Model会导致预期重建误差的不正确计算时,如何直接使用tf.nn.sigmoid_cross_entropy_with_logits作为loss参数;一个快速解决方案是基于tf.nn.sigmoid_cross_entropy_with_logits实现一个定制的损失函数,如下所示:**
其中我们对每个实例取所有像素维度上的交叉熵损失的总和。当编译模型时,我们写道
model.compile(loss=custom_sigmoid_cross_entropy_loss_with_logits, optimizer=tfk.optimizers.Adam(learning_rate))
注意,解码器与版本 a.** 中的解码器相同,它确定性地输出独立伯努利分布的参数的逻辑值。同时,我们使用tfpl.IndependentNormal作为编码器输出层,就像在版本 b. 中一样,因此 KL 散度计算由其参数activity_regularizer负责。**
类似地,我们有以下实现版本:
版本 d。
我们基于tfk.losses.BinaryCrossentropy建立另一个定制损失函数,如下所示:
注意,与使用确定性解码器输出层的版本 c.** 不同,该版本应用了概率层,就像版本 b. 中一样;但是,我们需要先取这个分布的平均值(上面代码块的第 2 行),因为tfk.losses.BinaryCrossentropy对象的一个参数是伯努利分布的参数,与其平均值相同。还要注意初始化tfk.losses.BinaryCrossentropy对象时的参数reduction,该参数被设置为tfk.losses.Reduction.NONE:这防止程序对与小批量数字图像张量形状相同的结果张量进行进一步操作,该张量的每个元素包含一个特定像素的交叉熵损失。然后,我们对实例级别的维度求和,就像我们在版本 c. 中的自定义损失函数中所做的那样**
值得指出的是,当compile模型必须接受两个参数时,我们为loss参数定义的任何函数都必须接受两个参数,一个是模型试图预测的数据,另一个是模型输出。因此,每当我们想要应用 Keras API,同时拥有更灵活的损失函数时,我们就会遇到问题。幸运的是,我们在编码器输出 TFP 层中有activity_regularizer参数,这有助于将 KL 偏差合并到成本计算中,这给了我们版本 b .;但是如果我们没有呢?剩下的两个版本介绍了一种实现更灵活的损失函数的方法,而不仅仅是针对 VAE 的特殊情况——这要归功于tfkl.Layer类的add_loss方法。
版本 e。
我将从直接演示这个版本的代码开始:
请注意,当compile为tfk.Model(行 70 )时,我使用了与版本 c.** 完全相同的loss功能。通过调用add_loss类方法(行 49 )将加权 KL 散度合并到成本的计算中。以下内容直接引自其文档😗*
这个方法可以用在子类层或模型的
call函数中,在这种情况下losses应该是一个张量或张量列表。
除了是“一个张量或一列张量”之外,对格式没有任何要求,我们可以建立一个更加灵活的损失函数。棘手的部分来自这段引文的前半部分,它指定了这个方法应该在哪里被调用:注意,在我的实现中,我在从tfk.Model类继承而来的VAE_MNIST类的call函数中调用了它。这与实现版本 b.** 不同,后者没有类继承。对于这个版本,我最初也是从编写没有类继承的VAE_MNIST类开始,在名为build_vae_keras_model的类函数中为tfk.Model对象调用compile方法,就像我在**版本 b 中所做的一样。tfk.Model对象model编译后,我直接调用model.add_loss(self.kl_weight * kl_divergence)——我的理由是,由于我们模型的输出层,类tfkl.Conv2DTranspose的对象,继承自tfkl.Layer,我们应该能够进行这样的操作。然而,训练结果是,如果我把 KL 权重调低到大约 0.01 ,我会得到“更亮”的生成图像;如果我开始增加 KL 的重量,我会得到几乎完全黑暗的图像。总的来说,生成的图像质量很差,而重建的图像看起来很好,但在不同的 KL 权重值下不会有任何变化。只有在我从tfk.Model类继承了VAE_MNIST,并将调用add_loss的类方法的名称改为call之后,模型才能正常运行。****
版本 f.
我将这个版本作为最后一个实践版本来实现,想象如果有一天我需要实现一些太复杂而无法使用 Keras API 的模型,这样的框架可能会派上用场。代码如下:
我想强调将调用add_loss方法的类方法命名为call的重要性:注意这个方法最初被命名为encode_and_decode(第 70 行)——如果我在重命名类方法之前为train_step方法添加@tf.function装饰器(第 94 行),我会得到
TypeError: An op outside of the function building code is being passed a “Graph” tensor. It is possible to have Graph tensors leak out of the function building context by including a tf.init_scope in your function building code.
在我相应地修改了类方法名之后,错误消失了。拥有@tf.function装饰器很重要,因为它显著提高了训练速度:在重命名之前,最后一个历元运行了 1041 秒(并且每个历元的时间流逝随着历元的增加而增加;第一个纪元“只”跑了 139 秒,这又是一个奇怪的现象);重命名后,每个历元的运行时间在 34.7 秒和 39.4 秒之间。
此外,在重命名之前,我需要为add_loss方法添加lambda参数(第 78 行),因为没有lambda:我会得到以下错误:
ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument lambda.
简而言之,当您计划应用add_loss方法来实现一个更灵活的损失函数时,一个好的实践是子类化tfk.Model类,并在名为call的类方法中调用add_loss方法。
结论
在这篇文章中,我介绍了实现在 MNIST 数据集上训练的 VAE 模型的不同方法,并从实践的角度对 VAE 进行了详细的评述。总的来说,我会推荐一个首次 VAE 实现者从版本 a.** 开始,然后尝试应用 Keras API 来简化代码,用自定义损失函数来计算期望的重建误差就像版本 c .****版本 d .;在对模型有了一个像样的了解后,最好采用b .版本,这是最简洁的版本,也是 IMHO 最优雅的版本。如果想为将来实现一个非常灵活的损失函数做准备,版本 e、T29 或版本 f、T31 可能是一个很好的起点。**
参考
[1] Diederik P. Kingma 和 Max Welling,自动编码变分贝叶斯 ( 2013 ),第 2 届国际学习表征会议论文集(ICLR)
[2] Charles Blundell,Julien Cornebise,Koray Kavukcuoglu 和金奎大·威斯特拉,神经网络中的权重不确定性 ( 2015 ),第 32 届国际机器学习大会(ICML)会议录
[3] 通过子类化 ( 2020 )制作新图层&模型,TensorFlow Guide
[4] 卷积变分自动编码器 ( 2020 ),TensorFlow 教程
[5] Ian Fischer,Alex Alemi,Joshua V. Dillon 和 TFP 团队,具有张量流概率层的变分自动编码器 ( 2019 ),介质上的张量流
6 个用于算法分析的数学函数
理解计算时间复杂度所需的基本函数

unspalsh.com上的 Aron 视觉效果图
设计和实现算法时需要考虑的最重要的因素之一是算法分析期间计算的时间复杂度。
时间复杂度对应于算法在所提供的输入上运行以生成所需输出所需的时间量。在本文中,我们将讨论算法分析中最常用的函数。此外,还提供了一些代码示例,以帮助读者理解这些功能如何与计算机执行的常见操作相关联,作为算法执行的一部分。
常值函数
这可能是最简单的函数,对于任何参数 n ,常量函数赋值 c 。

常数函数
当我们需要计算一个算法执行的基本操作的数量时,常量函数是很有用的。一些例子可以是整数加法或减法以及变量赋值或比较。
# Examples of basic operationsx = 10
name = 'Andrew'
is_verified = True
线性函数
另一个在我们的上下文中很重要的简单函数是线性函数,它非常类似于常数函数,但是线性函数不是给函数分配一个常数值,而是简单地分配给它自己的输入。

线性函数
当分析需要在所有 n 个元素上执行的操作时,线性函数非常有用。一个例子是读取未存储在计算机内存中的 n 个元素序列的过程(即,要读取所有元素,我们需要执行 n 操作)。
复杂度为 N 的操作示例:
my_list = [1, 2, 3, 4, 5]for i in my_list:
print(i == 2)
对数函数
对数函数是算法分析中最常用的函数之一。

对数函数
如何近似对数
为了计算任何整数的精确对数,我们需要应用微积分。然而,在算法分析的上下文中,我们不一定需要精确的值,因为一个好的近似值就足以满足我们的目的。为了做到这一点,我们通常使用上限,即大于或等于对数的最小整数。例如,log16 的 ceil 是 4,因为((((16/2)/2)/2)= 1。同样,log 18 的 ceil 是 5,因为((((((18/2)/2)/2)/2)= 0.5625≤1。
通常,在每次迭代中将问题分成两半的算法对应于时间复杂度的对数级。这样的例子可能是下面显示的流行的二分搜索法算法。
def binary_search(numbers, item):
first_index = 0
last_index = len(numbers)-1
while first_index <= last_index:
mid_index = (first_index + last_index)//2
if numbers[mid_index] == item:
return True
else:
if item < numbers[mid_index]:
last_index = mid_index - 1
else:
first_index = mid_index + 1
return False
注意:在计算机科学中,我们通常使用以 2 为基数的对数,这是因为计算机的本质是用来存储二进制的。这可能有点令人困惑,因为在数学中“默认”基数是 10,而大多数计算器都假定基数为 10。在算法分析中,当底数被省略时,我们通常用底数等于 2 来解析对数函数。
二次函数
另一个在复杂性分析中常见的函数是二次函数,它将输入 n 的平方指定给自己。

二次函数
在算法分析中,用二次函数来描述嵌套循环的复杂度,即执行 n 次的 n 次运算序列。下面提供了一个例子,在给定一个列表的情况下,该算法试图找到并报告重复项。请注意,这绝对不是解决此类问题的最佳方法(就时间复杂性而言)。
# Example with n^2 time complexityn = [1, 2, 3, 4, 5]for i in n:
for j in n:
if i != j and n[i] == n[j]:
print(f'{n[i]} is a duplicate')
立方函数
与二次函数类似的一个函数是三次函数,它给自己分配输入 n 的立方。

三次函数
三次函数在算法分析中非常罕见,通常表示算法的设计性能很差。
常数、线性、二次和三次函数属于形式为的多项式函数的更大家族

多项式函数
其中 α 是系数,而 d 对应于多项式的次数。显然,次数较少的多项式的时间复杂度代表比次数较多的多项式更有效的实现。
指数函数
指数函数是衡量算法时间复杂度的另一个有用的函数。

指数函数
该函数由基数 b 和指数 n 组成,后者被赋予输入值。与对数函数类似,我们假设指数函数的默认基数等于 2。
指数时间复杂度算法的一个非常常见的例子是下面给出的计算斐波那契数的递归函数(即调用自身的函数)
def fibonacci(n):
if n <= 1:
return n return fibonacci(n-1) + fibonacci(n-2)
为什么我们需要时间复杂性?
现在让我们说,对于同一个问题,已经实现了许多不同的算法,我们需要决定哪一个更好(至少在时间复杂度方面)。测量每种算法的时间复杂度可以帮助我们决定哪种算法是最有效的,从而在性能方面更好。
下表说明了输入大小和描述算法复杂性的函数对时间复杂性的影响。
+---------+-----+-------+---------+-------+-----------+------------+
| input n | n | log n | n log n | n^2 | n^3 | 2^n |
+---------+-----+-------+---------+-------+-----------+------------+
| 8 | 8 | 3 | 24 | 64 | 512 | 256 |
| 32 | 32 | 5 | 160 | 1024 | 32768 | 4294967296 |
| 128 | 128 | 7 | 896 | 16384 | 2097152 | 3.4*10^38 |
| 512 | 512 | 9 | 4608 | 262144| 134217728 | 1.34*10^154|
+---------+-----+-------+---------+-------+-----------+------------+
现在很清楚,算法的设计应该确保它尽可能高效地完成工作,否则,时间复杂度会迅速增加,从而使实现效率低下,并且在许多情况下不可用。
结论
在本文中,我们讨论了在计算算法的时间复杂度时最有用的基本函数。我们引入了许多多项式函数和 Log 函数,并研究了一些与上述每个函数相对应的代码示例。
选择增长率尽可能低的算法很重要。以线性或 n 次登录时间运行的算法被认为是非常高效的,而诸如二次或三次之类的更高多项式阶的算法通常表示具有高增长率的低效算法,即,当它们需要在大型数据集上运行时,它们可能成为噩梦。
要避免的 6 个隐藏的 SQL 错误

尤金·希斯蒂科夫在 Unsplash 上拍摄的照片
他们在雷达下飞行,给你带来麻烦
SQL 很棒。它是人类可读和高效的。这很容易掌握。
不幸的是,也很容易犯令人讨厌的 SQL 错误。那些不突出的,不会被你的编辑发现的,会让你头疼的。
在这篇文章中,我将强调一些隐藏的错误,当你浏览数据分析时要注意。
1.操作中的空值
SQL 有各种各样的常见和有用的运算符,用于算术(例如,+,-),比较(例如。>,
Use them, enjoy them, but don’t forget that they won’t do anything with null values. 对空值的操作将返回空值。
下面是几个例子:
a .添加列
假设我们有一个 2019 年销售额的列和一个 2020 年销售额的列。在 2019 年的一行中有一个空值。
当我们把它们加在一起时,我们得到一个空值:

作者图片
这是个坏消息。我们可能知道将空值视为 0,但是 SQL 不知道。
b .“不在”运算符
现在,假设我们有一个关于产品的调查结果表。我们只想排除非常差或非常好的评论。
当我们查询评级不在(“非常好”、“非常差”)时,我们得到以下结果:

作者图片
我们可能期望返回空值(毕竟,null 不在我们提供的列表中),但是 SQL 会将它们排除在结果集中。
解决方法: 每当我们执行操作时,我们都应该确保知道列中的任何空值。如果我们希望它们被视为不同的值,我们可以使用“coalesce”语句轻松实现:
coalesce(rating, ‘’)
2.聚合中的空值
这是与上一个问题相反的问题。当我们运行聚合函数时,SQL 忽略空值。在许多情况下,这是可取的。
但是如果空值真的是 0 呢?
例如,让我们计算 2020 年的平均销售额:

作者图片
在这种情况下,SQL 排除了空值,并计算出 410 / 4 = 102.5,而不是 410 / 5 = 82。
这很容易被忽略——102.5 听起来是一个真实的、完全合理的值。
修复: 同#1。让我们合并空值,如果它们真的表示 0。
3.错误的连接
连接是一个关键的 SQL 功能,它可以帮助我们组合两个表中的数据。
但是当我们使用错误的连接类型时,我们可能会丢失我们需要的数据。
例如,假设我们有一个地理表和一个销售表,我们希望将所有联系人的州和销售额列表发送给我们的营销团队。
左联接为我们提供所有联系人及其销售额,但内联接会删除所有没有任何销售额的联系人:

作者图片
如果我们在这种情况下使用内部连接,我们会丢失可能很重要的数据(也许市场营销想要锁定潜在客户!).
解决方法: 注意我们使用的连接类型。
要了解更多信息,请查看我关于连接数据的介绍文章:
左接合。内部联接。外部联接。啊?
towardsdatascience.com](/a-beginners-guide-to-joining-data-935c8e579fb7)
顺便说一下,如果我们真的执行左连接,我们应该确保将我们的销售列合并为 0,否则,我们可能会遇到上面的问题#1 或#2!
4.右表中的重复键
当我们连接数据集并且我们的右表在连接键中有重复项时,我们会得到比开始时更多的记录。
有时候这就是我们想要的。但是其他时候,我们可能会在右边的表中出现令人惊讶的重复数据——这可能是由于数据质量问题(真实世界的数据是混乱的,你没听说过吗?).
例如,假设我们想在一个“增强的”城市表中用更多的信息来丰富我们的联系人/地理表。
如果我们加入 on state,我们会得到重复的联系人:

作者图片
解决方法:确保我们知道我们的右连接键列是否不同。一种简单的检查方法是运行计数和非重复计数,并确保它们相同:
#these will be equal if there are no duplicates
select count(state), count(distinct state) from mytable;
5.运算符优先级问题(注意你的 and 和 or!)
当创建复杂的条件语句时,很容易犯操作符优先的错误。
最常见的例子:当我们编写 SQL 查询时,“And”在“Or”之前被处理。
假设我们有一个包含客户销售额和细分市场的表,我们希望返回细分市场 A 或 B 中销售额也必须大于 100 的客户。
如果我们在编写查询时不注意优先级,我们会得到:

作者图片
请注意,即使 client 1 记录的销售额低于 100,它也会被返回。这是因为查询首先解析“and”语句。
当我们在适当的位置添加括号时,我们得到了我们想要的:

作者图片
解决方法: 当我们使用多个操作符时,总是使用括号。它防止错误,使我们的代码更具可读性。
6.删除逗号
这可能会因我们使用的数据库管理系统而异。
对于 Postgres,我们在命名列时不需要包含“as”关键字。
这意味着,如果我们从查询中删除一个逗号,SQL 将使用列后面的列名重命名逗号前面的列:

作者图片
这是一个双重打击——我们不仅丢失了我们要寻找的一个列,而且我们的一个列也留下了不正确的名称。
修复: 在运行之前仔细检查我们的 select 语句,确保我们没有遗漏任何逗号。
结束语
在这篇文章中,我们介绍了运行 SQL 查询时需要注意的几个场景。当有疑问时,放慢速度,进行测试,并确保你没有成为这些常见错误的受害者总是有帮助的。
P.S. →如果你想了解更多关于 SQL、Python、数据科学的知识,订阅我的 免费邮件列表 。
学习高级 SQL 的 6 大资源
如何将您的 SQL 技能从初级提升到高级

图片由皮克斯拜的 Gerd Altmann 提供
注意,我不隶属于这些公司中的任何一家。这只是我分享我的知识和资源!😃
对于那些对 SQL 有所涉猎的人来说,您可能知道编写基本的查询非常容易,这也是它如此出色的原因!
选择 FROM WHERE GROUP BY ORDER BY。
但是 SQL 比这强大得多。不幸的是,大多数资源只涉及 SQL 的基础知识,很难提高您的 SQL 技能。
也就是说,我已经整合了一些 SQL 资源,您可以利用它们将您的 SQL 技能提升到一个新的水平。我从来没有结构化学习过 SQL——这是我自己学的。这些资源真的帮助我把我的技能提高到了一个新的水平。它们从最有帮助到最没有帮助进行排序,如果你以前从未见过这些资源,你应该会学到很多新的技巧。
我强烈建议您浏览这些资源,因为它们涵盖了许多基本的技能和技术,可以让您作为数据科学家的生活变得更加轻松。例如,如果你从来没有利用过窗口函数,现在是时候了!
也就是说,这里有六个资源可以用来提升你的 SQL!
1.扎卡里·托马斯的妙语
链接 此处 。
我先分享一个扎卡里·托马斯的妙语。这是一个了不起的资源,它提供了一些关于一些最基本的 SQL 概念的练习题。
您将从中了解到的一些内容包括:
- 自连接
- 窗口功能
- 交叉连接
2.Leetcode
链接 此处 。
Leetcode 是最好的资源之一,它帮助我学会了我从来不认为可能的技巧。这是我在找工作时充分利用的东西,也是我会经常回去查阅的资源。
Leetcode 很棒,因为他们有解决方案和一个讨论板,在那里你可以了解更有效的解决方案和技术。
通过 Leetcode,您将了解到以下内容:
- 自连接
- 嵌套的 WHERE 语句
- 创造性地使用 HAVING 语句
- 旋转表格
3.方式
链接 这里 。
模式提供了广泛的 SQL 指南,从初级 SQL 到中级 SQL 再到高级 SQL。这是一个伟大的资源,看看你不知道什么,并挑选你需要学习的东西。这也是一个很好的资源来温习生锈的技术。
另外,他们还有三个实用的 SQL 案例研究,您可以用它们来获得实际经验。查看 这里 。
您可以学习的一些内容包括:
- 字符串函数
- 子查询
- 窗口功能
- 性能调整
- 透视数据
4.SQL Server
链接 此处 。
如果您想真正了解技术,SQL server 有关于技术的深入资源,我个人从未见过!
您将学习的一些内容包括:
- 索引
- 存储过程
- 用户定义的函数
- 扳机
5.使用索引路加
链接 此处 。
说到索引,如果您想深入了解它的大量细节,这是一个必不可少的资源!我不打算撒谎,它很密集,可能令人望而生畏,但如果你需要参考任何子主题,它非常有用。
您将学习的一些内容包括:
- 什么是指数
- 聚类数据
- WHERE 语句(详细冗长)
6.黑客银行
链接 此处 。
与 Leetcode 类似,Hackerrank 提供了几十个练习题,你可以用它们来学习新技能。如果你想专注于难题,跳过任何简单的问题!
感谢阅读!
我希望这些资源对您的数据科学之旅有所帮助。具体来说,您应该能够极大地提高您的 SQL 技能,这在执行深度挖掘、创建您自己的视图、执行 ETL 等等时将非常重要。
特伦斯·申
- 每周查看 我的免费数据科学资源 的新资料!
- 如果你喜欢这个, 在 Medium 上关注我 获取更多
- 我们来连线上 LinkedIn
新时代商业智能的 6 个关键领域

图片来自 Pixabay (CC0)
早在 1958 年,IBM 的研究员 Han Peter Luhn 就提出了商业智能(BI)的概念,他使用了《韦氏词典》中的定义:理解呈现的事实之间的相互关系,从而指导行动实现预期目标。根据其定义,商业智能确实是一种愿景。它不应该由在某个给定时间设计的工具或技术来表示。换句话说,它应该被视为公司的战略愿景,用于将数据资产转化为业务洞察力,以做出数据驱动的决策。
从历史上看,有两个时代彻底改变并普及了商业智能的概念。第一次是在 20 世纪 80 年代,当时关系数据库被发明出来,并成为数据收集和数据存储的主流工具。数据库和 SQL 使企业能够更快地访问信息,以便根据当前事实和历史趋势做出业务决策。第二个时代是在数据仓库诞生的 20 世纪 90 年代。数据仓库从各种关系数据库系统收集数据,并进一步转换和聚合它们以供 BI 工具使用,这导致了大量信息的可访问性的飞跃。结果,数据仓库刺激了新技术,通过更好的可视化让业务用户更快地访问更多信息,使他们的生活更简单。
从数据中获得业务洞察力是一个迭代过程。记住一个给定的问题,从数据中获得的新发现很容易引出另一个问题。一个报告或仪表板可能会有许多结果,这取决于您从哪里开始以及找到了什么。业务用户通常需要一套不同粒度的报告,但最终仍然需要数据分析师的帮助来运行定制查询,这可能需要几天甚至几周才能得到答案。也就是说,一个理想的工具应该具有以下功能来完全满足商业智能的需求:
- 从最精细的级别到最高的聚合级别,访问每个级别的所有数据。
- 快速访问数据,响应时间只需几秒钟
- 无需编程即可进行任何分析和报告
- 用通用语言或视觉效果与其他决策者分享见解,这样既容易理解,又可操作。
没有一种工具可以同时在上述所有领域做得很好。许多公司不仅购买多种工具来相互补充,还构建自己的报告来填补这些工具无法填补的空白。此外,每个公司都非常需要业务和数据分析师来帮助分析调查、故障排除和手动生成 BI 工具无法完成的报告或仪表板。
大数据、云平台、机器学习和数据管理方面的最新进展将商业智能推向了第三个时代,对信息的访问更快、更容易,同时还有前所未有的可视化和机器智能选择。例如,NoSQL 数据库提供非结构化数据的快速访问;Tableau 等可视化工具允许业务用户在不编写代码或查询的情况下进行快速分析;云平台允许流技术和更快的数据管道发布数据,从以前的每周/每月到现在的几天/几小时/几分钟。最后,机器学习帮助用户从各个角度找到正确的信息,检测异常值,并预测未来。
在新的商业智能时代,企业如何充分利用新的机遇并取得成功?下面列出了六个关键领域,应该通过战略路线图仔细考虑,以确保最终的成功。
- 了解你的客户
识别你的客户,知道他们想要什么,对于你的商业智能之旅的成功至关重要。一般来说,有两种类型的用户:
商业用户
- 制定数据驱动型决策的高管和经理
- 需要详细报告以确保业务成功的业务分析师
- 寻找新商机的营销和产品经理
- 使用数据运行预测模型的数据科学家
操作用户
- 确保收入和利润报告准确的财务分析师
- 成功支持生产环境的 IT 运营人员
- 监控数据质量并捕捉数据异常的数据质量人员
这些用户的技能差别很大,从报表分析,到使用 Excel,到使用 BI 工具,以及编写 SQL 查询和程序。因此,它需要提供不同类型的数据输出和工具来满足不同用户的需求。在了解客户之后,公司可以制定正确的战略和策略来实施商业智能解决方案。不成功的 BI 计划通常源于忽视一组用户的需求或交付他们不想要的工具,这导致客户满意度低和数据利用率低于预期。
2。标准化数据管道
正如我在之前的文章数据处理和数据访问中的大数据架构中所述,由于不同的用户组可能会有不同的 BI 工具,因此标准的数据管道对于确保单一来源的真实性至关重要。它还通过防止不必要的数据重复来提高组织的效率和生产力。任何公司都不想面对的最后一件事是,从多个仪表板或报告中以不同的数字报告给定的度量,并且不知道哪个是正确的。
任何数据,无论是由应用程序还是从外部来源收集的,都需要在被商业智能应用程序使用之前进行清理、标准化和转换。根据数据源的不同,一个组织中可能有多个标准的数据管道,这些管道可能需要相互排斥,每个管道专注于自己的数据源和负责的数据区域。
3。为不同的用例设计数据访问层
在过去的二十年中,数据仓库已经成为将所有有用信息存放在一个地方供商业智能工具访问的首选方法。这种方法有几个明显的局限性:
- 单个数据仓库在处理和数据访问之间引入了冲突,这使得很难同时实施数据处理的服务级别协议(SLA)和 BI 报告的快速响应时间。
- 大多数数据仓库存储高度结构化和转换的数据,但不存储原始或非结构化的数据。
- 当需要进行更改时,关系数据库会导致僵化和高影响。
现代 BI 工具现在可以从多个结构化或非结构化的数据库或来源访问数据。它们中的许多还支持数据建模、数据转换、数据分析和数据采样,以便用户确定哪些数据是可用的,并在工具中准备数据,而无需编程或开发人员的帮助。换句话说,数据集中化功能已经逐渐从数据仓库转移到 BI 工具,为用户提供了从不同系统访问各种类型数据的能力和灵活性。
鉴于上述趋势,组织应该根据用例以及相应的数据检索模式,为其 BI 工具选择合适的数据库技术。NoSQL 数据库以及大数据平台的最新进展提供了许多不同的选择。要做出正确的技术选择和投资,需要进行仔细的测试和概念验证。
4。增强自助服务的能力
BI 用户总是同时过度依赖于提供信息的开发人员,并对他们之间的不断交流感到沮丧。今天的技术和工具可以让用户更加自主地滑动和切割数据,查看更细粒度或非结构化的数据,调查数据问题,以及自己创建报告和故事。
随着 BI 工具消耗越来越多的数据,业务用户将面临他们应该选择什么数据以及在哪里找到正确信息的问题。集中式数据管理,配备使用数据目录的强大元数据管理,将解决这一问题,并成为企业中成功的商业智能之旅的关键。好处是:
- 让商务智能用户能够自信地快速找到正确的数据
- 允许 BI 工具以一致的方式使用相同的变量、度量和显示名称
- 因此,提供语义层的单一事实,提高整个公司的效率和生产力
总之,现代商业智能通过提供用户自己查找数据的能力,赋予了用户更大的权力。这将最大限度地增加用户高效利用数据的机会。它还使 It 能够将资源集中在构建强大的数据管道和基础设施上,从而提供可扩展的解决方案来处理更多数据,如物联网和流数据。
5。借助高级分析实现现代化
BI 一直被称为报告过去和当前,而数据科学负责预测未来。这是一种过时的观点,受到以前的 BI 工具的限制,但不是商业智能最初的定义。任何有智能的东西都应该能够根据过去的事实预测未来。因此,越来越多的 BI 工具能够与用其他语言(如 R 或 Python)开发的预测模型集成,并提供数据科学功能来实现开箱即用的更多智能,例如:
- 内置于报告或仪表板中的机器学习功能,可自动检测异常值、趋势突破,并同时发送警报。
- NLP 能够讲述故事,并从一系列报告中自动得出结论,而不是让人类查看每个报告来得出结论。
这是一个新的但令人兴奋的领域,具有很高的商业智能潜力,它将把工具和服务带到决策智能的下一个级别。
6。监控持续改进的使用情况
商业智能服务于商业需求。当业务环境或要解决的问题发生变化时,特定的报告、数据板和数据资产可能会过时。应该有一个严格的流程来监控 BI 工具的使用及其输出。任何过时的都应该有组织地淘汰。这对于公司内部的整体有机增长以保持效率、成本效益和生产力是很重要的。因此,任何 BI 工具和产品都应该从一开始就建立跟踪机制。例如,它应该将用户的访问统计记录到最精细的级别,如访问了哪个报告、哪个表和哪些列。这些统计数据还为技术团队提供了数据访问模式的概念,以便他们能够提高数据访问性能。
结论
商业智能的概念出现在关系数据库发明之前。在过去的二十年里,商业智能技术所带来的效率和结果已经发生了两次革命,我们现在正处于第三次革命中。我们有时会听到商业智能正在消亡的说法,但这不是真的。这种说法将愿景与限制商业智能能力的工具混为一谈——任何企业和公司仍然比以往任何时候都更需要商业智能。随着第三个时代的到来,商业智能正随着许多新功能而再次现代化,包括具有用户友好功能的更多自助服务、数据科学和预测能力的数据建模。此外,可以开发更强大的数据管道来提供大量数据,这将有助于新的 BI 工具提高智能。企业应该充分了解其用户群体,选择正确的技术范围,构建一致的数据管道,实现数据管理,并增强整体基础设施,以享受成功的商业智能之旅。
6 个鲜为人知的熊猫绘图工具
使用这些绘图工具加快您的 EDA 进程

艾萨克·史密斯在 Unsplash 上拍摄的照片
Pandas 是数据分析和操作的首选 Python 库。它提供了许多加快数据分析过程的功能和方法。
说到数据可视化,pandas 并不是主要的选择,因为已经有了很好的可视化库,比如 matplotlib、seaborn 和 plotly。
话虽如此,我们不能忽视熊猫的绘图工具。它们有助于发现数据帧或序列中的关系,语法非常简单。只用一行代码就可以创建非常丰富的图表。
在本帖中,我们将介绍 pandas 的 6 种绘图工具,它们无疑为探索性数据分析过程增加了价值。
创建一个伟大的机器学习模型的第一步是探索和理解数据中的结构和关系。
这 6 个绘图工具将帮助您更好地理解数据:
- 散点图
- 密度图
- 安德鲁斯曲线
- 平行坐标
- 滞后图
- 自相关图
我将使用 kaggle 上可用的糖尿病数据集。让我们首先将数据集读入熊猫数据帧。
import pandas as pd
import numpy as npimport matplotlib.pyplot as plt
%matplotlib inlinedf = pd.read_csv("/content/diabetes.csv")
print(df.shape)
df.head()

该数据集包含 8 个数字特征和一个指示该人是否患有糖尿病的目标变量。
1。散布矩阵图
散点图通常用于探索两个变量(或特征)之间的相关性。使用笛卡尔坐标显示数据点的值。
散点图矩阵只用一行代码就能生成散点图网格。
from pandas.plotting import scatter_matrixsubset = df[['Glucose','BloodPressure','Insulin','Age']]scatter_matrix(subset, figsize=(10,10), diagonal='hist')

出于演示目的,我选择了具有 4 个功能的数据框架子集。对角线显示每个变量的直方图,但是我们可以通过将对角线参数设置为“ kde ”来改变它以显示 kde 图。
2。密度图
我们可以在序列或数据帧上使用 kde() 函数生成密度图。
subset = df[['Glucose','BloodPressure','BMI']]subset.plot.kde(figsize=(12,6), alpha=1)

我们能够用一行代码看到特性的分布。 Alpha 参数用于调整线条的暗度。
3。安德鲁斯曲线
安德鲁斯曲线以统计学家大卫·f·安德鲁斯命名,是一种用大量曲线绘制多元数据的工具。使用样本的属性(特征)作为傅立叶级数的系数来创建曲线。
我们通过对属于每一类的曲线进行不同的着色来得到不同类的聚类的概述。
from pandas.plotting import andrews_curvesplt.figure(figsize=(12,8))subset = df[['Glucose','BloodPressure','BMI', 'Outcome']]andrews_curves(subset, 'Outcome', colormap='Paired')

我们需要传递保存类信息的变量的数据帧和名称。 Colormap 参数是可选的。基于子集中的特征,两个类别之间似乎有明显的区别(有一些例外)。
4。平行坐标
平行坐标是绘制多元数据的另一种工具。我们先来创造剧情,再来说说它告诉我们什么。
from pandas.plotting import parallel_coordinatescols = ['Glucose','BloodPressure','BMI', 'Age']plt.figure(figsize=(12,8))parallel_coordinates(df,'Outcome',color=['Blue','Gray'],cols=cols)
我们首先从熊猫绘图工具中导入平行坐标。然后创建要使用的列的列表。然后创建 matplotlib 图形。最后一行创建平行坐标图。我们传递一个数据帧和类变量的名称。颜色参数是可选的,用于确定每个类别的颜色。最后,使用 cols 参数选择要在绘图中使用的列。如果未指定,则使用所有列。

每列用一条垂直线表示。水平线代表数据点(数据帧中的行)。我们大致了解了如何根据特性来划分类。“葡萄糖”变量似乎是区分这两个类别的良好预测指标。另一方面,不同类别的线在“血压”上重叠,这表明它在分离类别方面表现不佳。
5。滞后图
滞后图用于检查数据集或时间序列的随机性。如果一个结构显示在滞后图上,我们可以断定数据不是随机的。
from pandas.plotting import lag_plotplt.figure(figsize=(10,6))lag_plot(df)

我们的数据集中没有表明随机性的结构。
让我们看一个非随机数据的例子。我将在熊猫文档页面使用合成样本。
spacing = np.linspace(-99 * np.pi, 99 * np.pi, num=1000)data = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(spacing))plt.figure(figsize=(10,6))lag_plot(data)

我们可以清楚地看到滞后图上的结构,所以数据不是随机的。
6。自相关图
自相关图用于检查时间序列的随机性。它们是通过计算不同时间滞后的数据值的自相关而产生的。
滞后就是时差。如果所有时滞的自相关都非常接近于零,那么时间序列就是随机的。
如果我们观察到一个或多个显著的非零自相关,那么我们可以得出结论,时间序列不是随机的。
让我们先创建一个随机时间序列,看看自相关图。
noise = pd.Series(np.random.randn(250)*100)noise.plot(figsize=(12,6))

这个时间序列显然是随机的。该时间序列的自相关图:
from pandas.plotting import autocorrelation_plotplt.figure(figsize=(12,6))autocorrelation_plot(noise)

正如所料,所有的自相关值都非常接近于零。
我们来做一个非随机时间序列的例子。下图显示了一个非常简单的上升趋势。
upward = pd.Series(np.arange(100))upward.plot(figsize=(10,6))plt.grid()

该时间序列的自相关图:
plt.figure(figsize=(12,6))autocorrelation_plot(upward)

这种自相关清楚地表明一个非随机的时间序列,因为有许多明显的非零值。
直观地检查简单的上升和下降趋势的非随机性是非常容易的。然而,在现实生活的数据集中,我们很可能会看到高度复杂的时间序列。我们可能看不到这些系列的趋势或季节性。在这种情况下,自相关图对于时间序列分析非常有帮助。
熊猫又提供了两个绘图工具,分别是bootsap plot和 RadViz 。它们也可以用于探索性的数据分析过程。
感谢您的阅读。如果您有任何反馈,请告诉我。
熊猫的 6 个鲜为人知却令人敬畏的把戏

图片来源: Unsplash
我希望我能早点知道的技巧,以便从熊猫身上获得更多的价值
作为最流行的用于分析的 Python 库,Pandas 是一个提供各种数据操作和处理能力的大项目。毫不夸张地说,包括我在内的数据科学家在我们的日常工作中都会用到熊猫。
这个博客是我致力于分享熊猫十大鲜为人知但最受欢迎的特征的迷你系列的第一部分。希望您可以带着一些灵感离开,使您自己的代码更加健壮和高效。
这个迷你系列的数据集来自食物营养成分表,这是一个维基百科页面,包含 16 个按食物类型分类的基本食物及其营养成分的列表。在这个演示中,我们将使用乳制品表的一个子集,如下所示。

来源:维基百科
1。用 **read_html(match)**从 HTML 中抓取表格
说到 Python 中的 web 抓取,我的首选库曾经是BeautifulSoup,直到我发现了熊猫中的read_html()。没有解析 HTML 页面的麻烦,我们可以直接提取存储为 HTML 表的数据,
注意到参数。match = ‘Fortified milk’在码?它仅用于选择包含指定字符串或正则表达式的表,在我们的例子中,就是 dairy 表。match arg。当我们的 HTML 页面变大时将会非常方便。
然而,查看输出显示,我们意识到相当多的行和列被截断了!
2。自动加载定制的**options**
和熊猫一起工作一段时间,你可能知道它允许用户在它的选项系统中配置显示相关的选项。例如,设置pd.options.display.max_rows = 1000解决了上面的显示问题,这简直让我回到了第一次学习熊猫的时候!
然而,我的挫折越积越多,因为我不得不重写相同的配置。选项,每次我开始一个新的 IPython 会话。我不知道这些选项可以编译到 IPython 启动文件中,
然后我们只需设置PYTHONSTARTUP环境变量指向这个启动文件,所有方便的设置都会在 Python 启动时自动加载。这是启动文件执行后的打印输出,
****** * 更新 2022:加入我们的 YouTube 社区🎦** 【数据说话带吉】 😄**
3。从 **.iterrows()** 切换到 **.itertuples()**
正如我们刚刚看到的,由于“Food”列中的子类别,该数据包含缺失值,

来源:维基百科
直觉上,我们的下一步是通过删除带有 NA s 的行或者用所需的值填充它们来删除丢失的值。不管我们决定使用哪一个选项,我们首先需要连接“Food”列,因为它们都包含唯一的信息。众所周知,这可以通过用.iterrows()方法循环遍历行来实现。
然而,一个更好的循环熊猫的方法是.itertuples(),顾名思义,它返回一个元组而不是一个 pd。系列如.iterrows()所示。
我经常发现.itertuples()比.iterrows()运行得快,因为前者消除了调用.iterrows()方法的一些开销,例如检查数据类型。更多细节可以在这里[找到](http://Since this is beyond the scope of this blog, I will not discuss it here, however, more details regarding how to (create ODBC or JDBC connections) can be found here.)如果你有兴趣的话。
现在,让我们探索如何将我们的“食物”价值观与.itertuples()联系起来,
该语法中的技巧包括(1)初始化两个全局变量以存储当前的“Food”值和行索引,该行索引恰好是“row”元组中的第一个元素;(2)通过分配回新的串联“食物”值来修改原始的 dairy 表。
这里显示了我们预想的输出,

4。用 **.fillna(method)**输入缺失值
正如我们简要提到的,处理缺失值的另一种方法是用所需的值填充它们,在我们的例子中,这些值是下一个连续行中的值。现在fillna()函数派上了用场,
只用一行代码,我们丢失的值就被估算出来了,

这里我们指定参数。method = ‘bfill’:反向填充,反向传播第一个非空值。另一个选项是 'ffill' :向前填充,在时序数据中特别有用。关于该参数及其多值选项的更多详细信息,请点击链接。
事实上,当我第一次学习.fillna()时,我非常喜欢它,因为它允许我估算 NA s,而无需首先用 NA s 对行进行子集化。method这个功能很快成为我最喜欢的熊猫功能之一。
****5。用和**cumsum()**处理布尔值
随着 NA 被填充,现在我们采取不同的方法来连接“食物”值怎么样?第一步,让我们创建一些关键变量来指示哪些行将被合并,即,两个连续的行在除“食物”之外的变量上具有相同的值,
这里有两个技巧:(1)使用shift(1)选择前一行,然后与当前行进行比较;(2)调用cumsum()对于转换成整数向量的布尔值(即 1 =真,0 =假)如果两行不同时进行“计算”。
因为我们比较了数据集中的所有 3 列,所以从cumsum()创建了 3 个额外的关键变量(例如,Measure_)。一旦我们将它们与 dairy 表合并,我们将看到下面的输出,对于要合并的行,所有 3 个关键变量保持不变,

6。用 **.get_group()**自省 **GroupBy** 对象
有了关键变量,我们可以继续使用另一个有利的技巧连接“Food”值:.groupby() + .apply(),下面的代码返回与第 3 项相同的输出,
类似于 SQL 中的 GROUPBY 操作,Pandas 中的.groupby()将我们的数据分成由关键变量定义的组。但是它到底是如何工作的呢?为了自省对象.DataFrameGroupBy,我们可以利用较少使用的.groups和.get_group(),
从下面的部分打印输出中,我们可以看到,每个组都是由原始数据集拼接而成的微小数据帧,当我们调用apply()时,相同的操作(例如,在我们的例子中是 join)将迭代通过单个组,直到到达末尾。****

因此,显式可视化GroupBy对象非常有助于确保我们对正确的子数据集应用操作。
你有它!提高熊猫编程水平的 6 个不常用技巧,我希望这个主题对你有所帮助。在这个迷你系列的第二部分,我将分享我最喜欢的熊猫的另外四个特征,所以请密切关注🙂一如既往,所有代码都可以在我的 Github repo 这里找到,快乐学习!
想要更多数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的全部访问权限。
还订阅我新创建的 YouTube 频道 【数据与 Kat 会谈】
更多有趣的数据科学博客:
*** [## 每个数据科学家都应该知道的 6 个 SQL 技巧
提高分析效率的 SQL 技巧
towardsdatascience.com](/6-sql-tricks-every-data-scientist-should-know-f84be499aea5) [## SQL、R 和 Python 中的数据整形
从 Python vs. R 到 Python & R
towardsdatascience.com](/data-reshaping-in-sql-r-and-python-d44ca19e71b8)***
面向初学者的 6 个机器学习概念

机器学习新手?从这里开始…
机器学习是一种将传统数学与现代强大的计算处理相结合的技术,以学习数据集中固有的模式。在机器学习中,目标是产生一种算法,可以使用这些模式来执行一些指定的任务。
在监督机器学习的情况下,目标可能是开发一个模型,该模型可以识别一组输入属于哪个类别或类,或者预测连续值,例如房屋的价格。
在这篇文章中,我将介绍机器学习中的一些关键概念。如果你是机器学习的新手,这会让你很好地理解这个领域中使用的一些术语和技术。
1.特征
在机器学习中,我们上面谈到的输入被称为特征。特征是分配给数据点的一组属性。
下面的示例数据集是一个著名的数据集,通常用于被称为“波士顿房价”的机器学习实践问题。它由一组与房屋相关的特征(下图中以红色突出显示)组成,如年龄、平均房间数、财产税值以及相应的房价。
为了使机器学习模型成功执行其任务,至少需要在这些特征中的一些和房屋价格之间存在统计关系。

波士顿房价数据集-要素高亮显示为红色
2.特征选择和工程
开发机器学习模型的一个重要步骤是优化。我们开发的模型需要以最佳状态运行,确保这一点的一种方法是使用最佳功能来训练模型。
包含每个特性并不总是有用的。一些特征可能与我们试图预测的变量没有有意义的统计关系,而另一些特征可能彼此密切相关。这两种情况都会在训练阶段引入噪声,从而降低模型性能。特征选择是选择最佳特征以包括在训练阶段的过程。
类似地,原始形式的特征可能无法提供足够有意义的数据来训练性能模型。此外,有些功能根本不能以原始形式使用,基于日期/时间的功能就是一个很好的例子。机器学习模型不能使用日期或时间戳作为特征,我们需要首先从日期中导出有意义的特征,以便能够包含这些信息。我们可以使用整数形式的部分日期,如月、日或周数,或者计算两个日期之间的差异,以提供算法可以理解的模式。这就是所谓的特征工程。
3.标签
受监督的机器学习需要被称为标签数据的东西。这意味着数据中的每组要素都有相应的标签。这些标签可以是类别或类型,如猫或狗,或者是连续值,如波士顿房价数据集中的标签是价格的情况。
在开发机器学习模型时,这些特征通常被称为 X ,标签被称为 y 。

波士顿房价数据集-标注高亮显示为红色
4。培训
监督机器学习需要带标签的数据,因为算法使用这些示例特征值及其相应的标签来“学习”模式,如果成功,将使模型能够准确预测新的无标签数据上的标签。
在机器学习过程中,这个学习阶段被称为训练阶段。在这个阶段的最后,您有了一个模型,可以用来预测新的未标记数据的标签或值。训练阶段通常被称为拟合模型。
5.调谐
在这篇文章的前面,当我描述特性选择的时候,我曾经讨论过一个优化过程。该过程的另一部分称为调整,包括优化算法的参数,以找到特定数据集的最佳组合。
所有机器学习模型都包含具有各种选项的参数。例如,随机森林模型有许多可调参数。一个例子是确定森林中树木数量的 n_estimators。通常情况下,树的数量越多,结果越好,但是在某一点上(这取决于数据集),随着添加更多的树,改进会减少。为数据集找到最佳的树数是调整随机森林算法参数的一种方法。
每个算法都有许多可调参数,并且每个参数都有潜在的大量选项。幸运的是,有自动的方法找到这些参数的最佳组合,这就是所谓的超参数优化。
6.确认
一旦模型建立起来,我们需要确定它执行给定任务的能力。在我们的示例数据中,我们希望了解模型预测房屋价格的准确性。在机器学习中,建立最佳性能指标是很重要的,这将根据我们正在解决的问题而变化。
通常,当开始一个机器学习项目时,我们会首先将我们正在处理的数据集分成两部分。一个用于训练模型,另一个用于测试阶段。
机器学习中的测试通常被称为验证。我们使用该模型对保留的测试数据集进行预测,并测量所选的性能指标,以确定该模型执行给定任务的能力。
本文概述了讨论机器学习时使用的一些最常见的术语和概念。如果你刚刚开始学习,它应该有助于你理解机器学习教程中使用的一些术语。如果你想用 python 创建你的第一个模型,你可以阅读我的教程“如何创建你的第一个机器学习模型”这里。
感谢阅读!
我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!
处理日期和时间时你必须知道的 6 种方法
迄今为止最混乱的数据类型

日期和时间对于任何编程应用都是不可或缺的——它是运动的驱动力,也是我们在宇宙巨大时间线上所处位置的稳定指示器。计算机科学中的每个子领域——从数据科学和人工智能到设计网页——都需要理解处理日期。
因为它们太混乱了(简单的任务:尝试编写一个程序,在没有任何外部库的情况下找到 date n 之后 64 天的日期),并且非常复杂——日期的长度、闰年、嵌套在父对象中的子对象——当处理 datetime 对象时,您必须知道这 6 个函数和方法。
注意:本文讨论 Python 中的 datetime。
dateutil.parser.parse
将字符串转换成日期很常见——要访问一个datetime对象的属性,代表日期的字符串必须转换成日期。不幸的是,数据集或其他数据源几乎从来没有能够方便访问的datetime对象。将字符串转换为日期最好的库是dateutil,它可以自动推断日、月、年的位置,这需要用其他库来指定。
dateutil可以适应各种各样的日期,其中每一行的每一个命令自动推断物体的位置并产生相同的结果(datetime.datetime(2040, 7, 3, 0, 0)):
如果一个人能从字符串中分辨出日期,那么dateutil也能。使用这个库,您可以避免通过传统的日期时间转换方法执行的烦人的日期对象映射。当并非所有日期都以相同的格式出现时,这一点尤其有用,现实世界的数据通常就是这种情况。
datetime.datetime.now()
要访问当前时间,使用datetime.datetime.now()。这将返回一个 datetime 对象,返回您所在地区的时间,精确到微秒。
另一种方法是datetime.datetime.today(),它返回相同的信息,但是精度较低。这可能更适合于高流量的情况,在这种情况下,计算时间的微小改进可能证明是有价值的。
日期时间.时间增量
当您找到两个 datetime 对象之间的差异时,将返回 timedelta 对象。例如,要返回 1938 年 7 月 3 日到 2020 年 5 月 30 日之间的差值,将运行以下代码:
简单地在两个 datetime 对象之间使用减号操作符交互将创建一个 timedelta 对象,在本例中,该对象被保存到变量delta。
timedelta 对象有几个属性:
您甚至可以将 timedelta 对象添加到常规 datetime 对象中:
日历。Calendar.itermonthdates()
Calendar 是一个建立在 datetime 之上的库,它提供了方便的日历相关函数,有助于避免手动跟踪闰年和一个月中的天数。为了访问迭代函数,必须首先创建一个Calendar对象。
参数firstweekday设置为 0,表示星期一,但也可以设置为 6(星期日)或两者之间的任何一天。
考虑.itermonthdates(),它接受一个月和一年,并返回一个迭代器,该迭代器包含该月中的所有日期,包括完成一周所需的任何前后日期。
输出如下所示:
Calendar 还有许多其他函数来返回各种各样的迭代器,以及其他功能,如打印 HTML 或文本日历,这些可以在文档页面访问:
[## 日历-通用日历相关函数- Python 3.8.3 文档
源代码:Lib/calendar.py 这个模块允许你像 Unix cal 程序一样输出日历,并提供…
docs.python.org](https://docs.python.org/3/library/calendar.html)
箭头。Arrow.humanize()
Arrow 是一个 Python 库,它的humanize()属性非常突出。这种方法允许人们更无缝地与日期对象交互和解释日期对象。首先必须创建一个 Arrow 对象(可以容纳 datetime 对象并转换成Arrow对象)。
调用time.humanize()将产生一个字符串,其中包含一条人类可读的消息,描述time是从多久以前到现在。
可以想象,这个特性对 UI 设计开发人员特别有帮助,他们可以用它来显示像“Josh 两分钟前发送了这条消息”或“你一年前编辑了这个文档”这样的消息。Arrow 也可以处理未来的日期。
德罗林
为了纪念回到未来而命名,Delorean 主要是因为其方便的自然语言理解而被使用,这意味着通过日期操作人类导航的简易性。首先,创建一个 Delorean 对象,它可以容纳datetime对象:
如果您想获得下周、下周五、上周二的日期,或者任何数量的可理解的命令,只需调用适当的函数:
这可以为您和阅读您代码的人提供更容易、更直观的日期操作。
感谢阅读!
希望这些库和方法可以帮助您处理日期和时间!
6 个月的机器学习/计算机视觉工程师

Clem Onojeghuo 在 Unsplash 拍摄的照片
经验
在一个我几年前都没有涉足的领域呆上半年是什么感觉
介绍
我不敢相信已经六个月了,我已经写了一篇文章,详细描述了我在目前职位的第一天。
时间过得真快。
再次欢迎来到我作为计算机视觉工程师的在线日志。
在这篇文章中,你可以期待一个在创业公司工作的计算机视觉工程师的日常活动的许多细节。也期待回忆我犯过的一些错误和我庆祝过的成就。
对于你来说,这篇文章将介绍当你在一家初创公司中担任机器学习/计算机视觉角色时会有什么期望,以及当前机器学习从业者的典型角色和职责。
我认为这是一个足够好的介绍。
让我们直入主题,用 4000 字或更少的篇幅总结六个月的经历。
机器学习/计算机视觉/深度学习

Vladyslav Ociacia 的混血儿。(作者持有图像许可)
让我们从我的角色分解开始,同时附上工作角色描述。
在这一部分,我还将向您展示对计算机视觉工程师的确切期望。
机器学习简单来说就是开发能够从数据中学习和改进的系统。
计算机视觉是机器或系统通过调用一个或多个作用于所提供信息的算法来生成对视觉信息的理解的过程。这种理解被转化为决策、分类、模式观察等等。
深度学习是利用深度卷积神经网络来解决计算机视觉任务,如图像分类、姿态估计、语义分割等。
我的主要职责是研究和实施计算机视觉技术,如姿势估计、语义分割、手势识别和面部特征检测。所有列出的技术都在移动设备上实现。
技术
以下是我在过去六个月中使用深度学习解决方案实现的各种计算机视觉技术。
在某些情况下,我包括了我使用过的模型:
- 姿态估计:这是对图像或视频中呈现的人体内关键关节位置的估计。我通过利用研究设计的解决方案来实现姿态估计,例如堆叠沙漏、卷积姿态机器(CPM) 和 Posenet 。
- 手势识别:对一个人所采取的动作的分类可以称为活动或手势识别。我实现这一技术的过程是通过迁移学习利用 MobileNetV2 网络(在 imagenet 上训练),并使用定制的分类头对图像中的手势进行适当的分类。
- 手部检测/跟踪:这是一个简单的计算机视觉任务,主要关注图像或视频中手部的检测和定位。
- 语义分割:这可以被认为是在像素级别上进行的粒度分类,因为我们正在将图像中的每个像素分类为一个对象。实现这一点很有趣,它涉及到 TensorFlow 的 DeepLabV3 分段示例的逆向工程。
- 人脸检测/跟踪:这是一个可以跟踪和定位图像或视频中人脸位置的系统的实现。
工具
如果你是一个机器学习实践者,你可能知道下面提到的一些工具。对于那些刚刚进入人工智能领域的人来说,列出的工具被数据科学家、ML 研究人员和 ML 工程师等使用。
这些是我日常使用的工具。
- tensor flow:机器学习模型的实现、训练、部署的开源平台。
- Keras:一个开源库,用于实现运行在 CPU 和 GPU 上的神经网络架构。
- tensor flow Lite:开源框架,旨在智能手机等边缘设备上部署机器学习模型。
其他值得注意的工具:
Jupyter Lab,Anaconda,CoreML, 视觉框架 ,
小贴士:不要执着于工具、技术和流程。关注你快速学习和适应新环境的能力。
软件工程

凯文·Ku 在 Unsplash 上拍摄的照片
以前我认为软件工程是一种技能,但是随着我职业生涯的发展,我已经接受了软件工程更像是一种实践的事实。
软件工程不是一项你可以在三个月内获得的技能,而是一种你通过多年的软件应用开发经验而形成的方法。
所以,作为一名机器学习工程师,我每天都在实践软件工程。更具体地说,我将软件工程原则的各个方面融入到我的开发工作流程和过程中。
大多数现代机器学习工程师都精通 3+编程语言。这可能看起来很多,但是用集成的学习系统和 ML 技术构建现代应用程序需要各种平台和工具之间的协同作用——所有这些都利用不同的编程语言来编写可执行指令。
以下是我在过去六个月中使用的主要编程语言:
- Swift :用于 iOS 应用开发
- Python :用于 ML 模型的实现、训练和评估
- JavaScript :用于 ML 模型的实现,也写自定义脚本。
我也有 HTML,CSS,SQL,Kotlin,NodeJS,Flask 等实用知识。所有这些工具和语言都是在三年的通用软件工程中发展起来的。
提示:学习 OOP(面向对象编程)的基本原理。面向对象的知识在广泛使用的编程语言中是可应用和可转移的。
如果你理解 OOP,学习编程语言就是熟悉特定于语言的语法。
冠状病毒

engin akyurt 在 Unsplash 上拍摄的照片
没人能预测到 2020 年全球疫情会让世界各国陷入瘫痪。卫生纸在西方国家成为一种商品;肘式问候取代了握手,远程工作现在成为了大多数科技行业的新常态。
当疫情号抵达英国时,我担任目前的角色才一个月,然后我们就进入了封锁状态。
远程工作并没有改变初创公司的目标、团队动力和我完成工作的雄心。作为一名计算机视觉工程师,一个高度科技化的角色意味着我可以在任何有网络连接的地方工作。
有助于远程工作的事情:
- 买台灯 :这是我最近买的,很满意。我读了很多书,深夜的编码/写作会议变得越来越频繁。所以有一个好的人造光光源对阅读时的能见度和整体生产力非常有帮助。
- 缩放 :这可能是 2020 年最受关注的视频会议工具了。Zoom 创造了一个无缝的虚拟延伸,这是它的对手所没有的。我的一天以与同事的 zoom 会议开始,以与朋友的 zoom 会议结束。
- TeamViewer :当我不在家时,TeamViewer 让我可以从我的 GPU 机器上访问计算资源。
- 我遇到的任何问题都只是一个远离解决方案的松弛信息。
有人说远程工作将成为员工的永久选择。很明显,公司自己在办公空间上节省了大量资金,并且公司团队提供的生产力或结果也没有明显的缺乏。
提示:在你的家里有一个指定的工作区域。
此外,如果你需要改变环境,附近的合作空间或咖啡馆也是一个选择
五金器具
当我写我作为计算机视觉工程师的第一个月时,我包括了分配给我的一个具体任务,那就是购买一个 GPU 工作站。
经过艰苦的研究和与美国和英国的 GPU 供应商公司的一些来回,我终于购买了一个。
在过去的五个月里,我连续几天利用 GPU 计算资源来训练定制模型。由于工作站拥有 14 个 CPU 内核,我还执行了并发运行的脚本,没有出现任何问题。
提示:确保你购买了一个带有多个 GPU 插槽的 GPU 工作站,即使你可能只购买了一个真正的 GPU。在可预见的未来,你可能需要扩展你的 GPU 能力,所以最好做好准备。
我对 GPU 的历史以及它们是如何产生的有点兴趣。作为深度学习实践者,你我都知道,随着 AlexNet 的引入和深度卷积神经网络的出现,用 GPU 训练 CNN 变得流行起来。
我可能会写一篇关于 GPU 的历史和其他关于它们的使用和专长的很酷的事实的文章。
学习/研究

在与 ML 相关的职业生涯中学习永远不会结束。人工智能领域本身正在以一种速度前进,总是有新的发展需要了解( 目前是 GPT-3 的发布)或新的技术需要实现。
回想过去的六个月,我真的感觉自己又回到了大学时代。完成“朝九晚五”的工作后,我回到家里阅读研究论文、写论文和实现 ML 模型。
对于那些希望进入人工智能职业的人来说,你必须意识到有一个不言而喻的期望,在那里你应该被告知最新的人工智能发展。大多数人期望你比一般人更了解新的人工智能应用程序发布。
目前,我正在获取尽可能多的实践和理论知识,然后才能着手实施我的神经网络体系结构或修改 DCNNs 的子组件。
无论我要实施什么样的简历技巧,我都不是 100%了解。在我考虑任何形式的实现之前,通常会有一个广泛的研究阶段。对于我正在研究或实施的每项新技术,大约 70%的内容对我来说都是新的。
学习从未停止。
提示:不要害怕后退一步,以确保你正在建立一个坚实的学习基础。最近,与深入阅读最新的神经网络架构相反,我回到了深度学习早期发表的研究论文。
害怕

aaron Blanco Tejedor 在 Unsplash 上拍摄的照片
如果我告诉你在过去的六个月里我没有质疑过自己的能力,那我就是在撒谎。
这是我第一个与 ML 相关的角色,更可怕的是,我是公司第一个机器学习雇员。
你听说过冒名顶替综合症吗?
这是一种无能和不足的感觉,即使你做得很好。它是自我怀疑、缺乏自信和虚假的智力欺诈的混合物,从你的成功和成就中偷走。
在过去的六个月里,我发现自己问了以下问题:
我走得够快吗?我够好吗?我够聪明吗?我知道的足够多吗?够好吗?如果我失败了呢?如果我错了呢?
这是关于冒名顶替综合症的事情;它可以是一件消极或积极的事情,这完全取决于你采取的行动和你选择如何解决你的自我怀疑。
我用我的冒名顶替综合征的感觉来确保我在我的游戏中处于领先地位,我不会被它削弱,也不会被它削弱。
冒名顶替综合症比你想象的更普遍;即使是最伟大的人也深受其害。

阿尔伯特·爱因斯坦,图片来自biography.com
“我一生的工作被过分推崇,这让我很不自在。我觉得把自己想象成一个无意识的骗子是完整的。”——阿尔伯特·爱因斯坦
提示:你够了!
ML 社区

安妮·斯普拉特在 Unsplash 上拍摄的照片
我在工作之外所做的和我在工作中所做的一样重要。
在过去的六个月里,我意外地开始在 AI 社区内建立个人品牌。通过几个不同的在线平台,我每天可以接触到成百上千的人。
我认为你可以,也应该这样做。
下面是我用来在 ML 社区中建立存在的平台的总结。
中等

图片来自媒体设计
在我的学术研究和现在的职业生涯中,Medium 上与人工智能相关的内容一直是一个很好的信息来源。
我看过文章,简化复杂的神经网络架构的研究论文;和文章,就如何在人工智能行业内进行工作选择或薪资谈判提供了有用的建议。
2019 年夏天,我决定不仅要成为 Medium 上内容的消费者,还要成为创作者。我不知道该期待什么,但我心中有一个目标。
我的目标是将媒体作为一种工具来强化我通过学习和项目获得的知识和信息。对我来说,媒介是一种知识保留的形式。
现在,媒体对我来说是一个平台,使我能够每天接触到成千上万的人。我已经写了 70 多篇人工智能和人工智能相关的文章,我可以看到很多人受到了我的写作的启发,并且正在学习和学习一个可行的项目。
由于某种原因,我()被认为是人工智能、技术和教育领域的顶尖作家之一。事实上,这是一项荣誉,我希望尽可能长久地保持下去。
提示:在你的学习过程中融入媒体。就你目前正在学习的概念和想法写文章。这有助于知识的保留,还有提供在线作品集的额外好处。
商务化人际关系网

我不记得我第一次创建 LinkedIn 账户是什么时候,但我可以说的是,与其他任何年份相比,我在 2020 年使用 LinkedIn 的次数都要多。
相当多的人阅读我的作品,一些读者对我文章的内容有疑问。LinkedIn 是联系我的传统方式之一。
我非常乐意回答任何问题,并就我技术专长范围内的话题给出任何建议。迄今为止,我已经回答了大约 50 多个通过 LinkedIn 联系我的人提出的问题。我还抽出一些时间与个人进行视频电话会议。我收到的一些问题需要更详细的答案。
我被问到的大多数问题都围绕着学习机器学习的最佳方法,或者走哪条职业道路。虽然我不是专家,但我很乐意分享我通过学习、研究和经历获得的一点点经验。
如果你想给我发信息或者讨论与 ML 有关的事情,我可以在这里找到。
咨询公司
在过去的六个月里,我和一些寻求项目建议的人坐在一起,在一些情况下,我的时间和专业知识得到了回报。现在,我得到的报酬不会改变我的生活,我也不会很快成为一名全职顾问。但事实上,个人只看重我的专业技能,这对我来说仍然是疯狂的。
除了咨询工作之外,我最近还受邀成为一本计算机视觉书籍的技术作者,这本书将在未来发行。再说一次,这个机会似乎好得不像是真的,但是今天我在这里,这本书还没发行几章。
除了我的学习和职业生涯,我无法预测我可能会遇到什么机会。每个月都不一样。
油管(国外视频网站)

由 Gianandrea Villa 在 Unsplash 上拍摄的照片
我很欣赏 AI/ML YouTube 频道,那里的主持人教授机器学习相关主题,或者解释和实现研究论文中提出的技术。
当然,我是亚历克斯·弗里德曼的播客和 YouTube 频道的粉丝。
在 YouTube 上,我是一个消费者,我关注 ML 相关频道如两分钟论文、丹尼尔·伯克、森德克、深蜥蜴、 3Blue1Brown 、扬尼克·基尔彻、阿布舍克·塔库尔等。
我已经决定开始在 YouTube 平台上构建。很快,我将发布我认为对那些开始学习机器/深度学习的人有用的内容。
随意订阅我的频道这里 ( 不要脸塞)。
提示:不要害怕拓展你的触角。让世界知道你的存在。
我犯过的错误

来自iemoji.com的眼睛表情符号
在过去的六个月里,我犯了数不清的错误。
下面是几个“不太”尴尬的错误。
- 没有推进我的 git 回购,失去了两个星期的工作。
- 对我的工作没有耐心,这导致了很多错误和错误。
- 在我真正需要帮助的时候没有寻求帮助。
- 将水洒满了团队放有电子设备的桌子。
- 在周五投入生产。然后花了一个周末修复漏洞。
- 我在网上开会迟到了,尽管我在家工作(这个错误需要一定的技巧 lol* )。*
每个人都会犯错;错误不可避免。重要的是你从你犯的错误中学习,记住你的错误并不能定义你。
我确信在接下来的六个月里我会犯更多的错误。
年度愿景

简单来说,就是六个月。
作为六个月的总结,在今年剩下的时间里,我将与你分享我为自己设定的目标。
这些目标主要是让我在职业生涯、个人和学术发展上保持正轨。一些列出的目标是模糊的,我很可能会在以后完善它们。
- 在年底前阅读 10 篇研究论文
- 在线发布两个基于人工智能的应用
- 在边缘设备上实施更多计算机视觉技术
- 在 ML 社区中建立更强大的存在
- 建立稳固的个人品牌
- 获得人人都在谈论的张量流证书
提示 : 关注我了解更多 AI/ML 相关内容
我们仍然是人工智能中代表最少的种族之一,然而我们可能会因为它的利用和滥用而遭受最大的痛苦。
towardsdatascience.com](/are-there-black-people-in-ai-fb6928166d73) [## 根据吴恩达的观点,如何在机器学习的职业生涯中导航
了解如何在机器学习领域取得成功
towardsdatascience.com](/how-to-navigate-a-career-in-machine-learning-according-to-andrew-ng-stanford-lectures-9e10f09047f0)*
作为一名数据科学家,我在 6 个月里学到了什么
我从训练营开始,然后找到了我梦想中的机器学习工作。以下是一些关键要点。

arXiv | 播客 | GitHub 问题 | 算法&硬件 | 社会科学 | 商业成果 |图片由 Artem Beliaikin 在 Unsplash
自从六个月前我的头衔从顾问变成了数据科学家,我体验到了比我想象的更高的工作满意度。为了庆祝我在这个引人入胜的领域的第一个半年,这里是我一路上收集的六个教训。
#1 —阅读 arXiv 白皮书
您可能已经意识到,回顾 arXiv 是一个好主意。这是非凡想法和最先进进步的源泉。
不过,我在平台上遇到的大量可操作的建议让我感到惊喜。例如,我可能无法获得 16 个 TPU 和 7k 美元来从头开始训练 BERT,但是 Google Brain 团队推荐的超参数设置是开始微调的好地方(查看附录 A.3 )。
希望您最喜欢的新包能够在 arXiv 上有启发性的阅读,为它的文档增添色彩。例如,我学会了在 ktrain 上使用非常可读和非常有用的文章来部署 BERT,ktrain【】是一个位于 Keras 之上的库,为文本、图像和图形应用程序提供了一个简化的机器学习接口。
# 2——听播客,获得巨大的情境意识
播客不会提高你的编码技能,但会提高你对机器学习的最新发展、流行的包和工具、该领域未回答的问题、解决老问题的新方法、整个行业普遍存在的潜在心理不安全感等的理解。
我每天收听的播客让我感受到了数据科学领域日新月异的发展。
以下是我现在最喜欢的播客
通过这个有用的期刊、视频和讲座的集合,推进你对机器学习的理解。
towardsdatascience.com](/supercharge-data-science-5bb7376d8572)
最近我特别兴奋地了解到*的进展,跟踪了* 在 GPU和 云计算 ,并对人工神经网络和神经生物学的进展之间的 潜在共生 提出了质疑。
#3 —阅读 GitHub 问题
根据我在巨大的智慧金枪鱼投诉海洋中的经验,这里有三个潜在的胜利:
- 我经常从其他人使用和/或误用包的方式中获得灵感
- 了解在什么样的情况下一个包会破裂也是很有用的,这样可以培养你对自己工作中潜在故障点的意识
- 由于您正处于设置环境和进行模型选择的前期工作阶段,在将开源工具添加到您的管道之前,您最好考虑一下开发人员和社区的反应
#4 —理解算法与硬件的联系
最近半年做了很多 NLP,再来说说 BERT。
2018 年 10 月,伯特崭露头角,震撼世界。有点像超人一跃跃上高楼后(最初推出时疯狂认为超人不会飞!)
BERT 代表了机器学习处理文本处理任务能力的一个阶跃变化。它最先进的成果是基于在谷歌的 TPU 计算机芯片上运行的变压器架构的并行性。
第一次在 GPU 上训练的感觉。通过 GIPHY
理解 TPU 和基于 GPU 的机器学习的含义对于提升你作为数据科学家的能力非常重要。这也是加深你对机器学习软件和运行它的硬件的物理约束之间不可分割的联系的直觉的关键一步。
随着摩尔定律在 2010 年左右逐渐消失,将需要越来越多的创新方法来克服数据科学领域的限制,并继续朝着真正智能的系统前进。

来自 Nvidia 展示的图表显示了每年每平方毫米的晶体管数量。这凸显了 2010 年左右晶体管数量的停滞和基于 GPU 的计算的崛起。
我看好 ML 模型的兴起——计算硬件协同设计 ,对 稀疏性的依赖增加和修剪 ,甚至 “非专用硬件”机器学习 ,看起来要颠覆当前以 GPU 为中心的范式的统治地位。
#5 —从社会科学中学习
我们年轻的领域可以从 2010 年代中期发生的社会科学可复制性危机中学到很多东西(在某种程度上,这种危机仍在发生)

数据科学家的“p 值黑客”。xkcd 的兰德尔·门罗的漫画
2011 年,一项学术众包合作旨在复制 100 项已发表的实验和相关心理学研究。但它失败了——只有 36%的复制报告了有统计学意义的结果,相比之下,97%的原件报告了有统计学意义的结果。
心理学的再现性危机揭示了将“科学”与不可靠的方法联系在一起的危险和责任。
数据科学需要可测试、可复制的方法来解决问题。为了消除 p-hacking,数据科学家需要限制他们如何调查数据的预测特征,以及他们为评估指标而运行的测试的数量。
有许多工具可以帮助实验管理。我有处理 ML 流程—Ian Xiao的这篇优秀文章提到了另外六个领域,以及机器学习工作流的其他四个领域的建议。
我们还可以从近年来数据科学领域的大量失误和算法弊端中吸取许多教训:
例如,利益相关方只需看看加深现状的社会工程推荐引擎、歧视性信用算法和刑事司法系统。我已经写了一些关于这些社会弊病以及如何用有效的以人为中心的设计来避免它们。
好消息是,有许多聪明且积极的从业者正在努力应对这些挑战,并防止未来违背公众信任。查看谷歌的一对、哥伦比亚的 FairTest 和 IBM 的 explability 360。与社会科学家研究人员的合作可以产生丰硕的成果,比如这个关于审计歧视的算法的项目。
当然,我们还可以从社会科学中学到很多其他的东西,比如如何进行有效的演讲
研究社会科学以理解人类关于数据推断的直觉可能会失败是至关重要的。人类非常擅长在特定情况下从数据中得出结论。我们推理的方式是高度系统化和可预测的。
我们对人类心理这一方面的许多理解都在丹尼尔·卡内曼的优秀作品《T21 思考的快慢》中得到了体现。这本书应该是任何对决策科学感兴趣的人必读的。
卡尼曼研究中可能与你的工作直接相关的一个元素是他对锚定效应的处理,这种效应“发生在人们考虑未知量的特定值时。”
传达建模结果时(即代表准确度、精确度、召回率、f-1 等的数字)。),数据科学家需要特别注意管理预期。在“我们仍在解决这个问题,这些指标可能会改变”到“这是最终产品,这是关于我们期望我们的 ML 解决方案如何在野外执行”的尺度上提供一定程度的手动波动可能是有用的
如果你展示的是中间结果,Kahneman 建议为每个指标提供一个数值范围,而不是具体的数字。例如,“f-1 分数代表了本表中其他指标(精确度和召回率)的调和平均值,大约在 80–85%之间。这表明还有改进的余地。”这种“手动波动”的沟通策略降低了听众将锚定在你分享的特定价值上的风险,而不是获得关于结果的方向正确的信息。
#6 —将数据与业务成果联系起来
在你开始工作之前,确保你正在解决的问题值得去解决。
你的组织并没有付钱给你去建立一个 90%准确的模型,给他们写一份报告,在 Jupyter 笔记本上闲逛,或者甚至在 图形数据库 上启发你自己和其他人。
您的职责是将数据与业务成果联系起来。
我希望这些建议至少对你有所帮助——在评论中留言,让我知道你是如何使用它们的。当然,如果你喜欢这篇文章,请在 Medium 、 LinkedIn 和 Twitter 上关注我。
免责声明 :我正在为书籍推荐添加附属链接。通过这个链接在亚马逊上购买有助于支持我的数据科学写作——提前感谢。
为您的数据科学之旅撰写更多文章
图论是对图形的研究,图形是用来模拟对象之间成对关系的数学结构…
towardsdatascience.com](/an-intro-to-graph-theory-centrality-measurements-and-networkx-1c2e580adf37) [## 你从未听说过的最好的数据科学认证
数据策略最有价值培训实用指南。
towardsdatascience.com](/best-data-science-certification-4f221ac3dbe3) [## 像我五岁一样解释计算机科学
了解互联网,编程,机器学习和其他计算机科学的基础知识,通过清晰和…
medium.com](https://medium.com/coderbyte/eli5-computer-science-f8dfd7910311) [## 型号选择综合指南
选择正确算法的系统方法。
medium.com](https://medium.com/atlas-research/model-selection-d190fb8bbdda) [## 面向临床文本的命名实体识别
使用 pandas 将 2011 i2b2 数据集重新格式化为用于自然语言处理(NLP)的 CoNLL 格式
medium.com](https://medium.com/atlas-research/ner-for-clinical-text-7c73caddd180)*
Python 3.8 中针对 Python 新手的 6 项新特性
Python 初学者
请做好准备,因为 Python 2 不再受支持

照片由普里西拉·杜·普里兹在 Unsplash 上拍摄
语言会变。语言会适应。21 世纪 20 年代不再支持 Python 2。
鉴于数据科学的兴起,Python 是 2019 年最受欢迎的编程语言。然而,对于要学的东西太多,感到有点不知所措是正常的。语法不断变化。每次更新都会添加许多新形式的表达式。很难跟踪 Python 中的变化。有些特征我希望我能早点知道。
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4)
如果你也有同样的感觉,那么对你来说是个坏消息。Python 3.8 最近发布了。不要害怕。我总结了 Python 3.8 的 6 个新特性,每个 Python 初学者都应该学习。
1.赋值表达式—可读性
也被称为 walrus 操作符,它是一个新的操作符,语法:=允许你给变量 赋值,作为一个更大的表达式的一部分。这可以说是 Python 3.8 中讨论最多的新特性。这里来一个例子。
赋值表达式b := a**2将变量b赋值为a的平方,在本例中为 36,然后检查b的值是否大于 0。
赋值表达式有时可以让你的代码更加紧凑,并且可读性更好。注意不要滥用它,因为在某些情况下,它可能会使您的代码比必要的更难理解。
# **DON'T DO THIS!**
a = 5
d = [b := a+1, a := b-1, a := a*2]

这个操作符已经存在于其他(更老的)编程语言中,我希望许多转到 Python 的程序员会(ab)使用这个新特性。在它无处不在之前熟悉它。这是一只海象。
2.参数类型—鲁棒性
Python 函数中的参数可以接受两种类型的参数。
- 按位置传递的位置参数
- 关键字由关键字提供的参数
在下面的例子中,参数a和b的值可以由位置或关键字参数提供。灵活。
def my_func(a, b=1):
return a+bmy_func(5,2) # both positional arguments
my_func(a=5,b=2) # both keyword arguments
Python 的新版本提供了一种方法,通过使用语法/和*进行分隔,来指定只能接受位置参数或关键字参数的参数。
*后一种语法*在 Python 3.8 中并不新鲜
在下面的例子中,前两个参数a和b是仅位置的,中间两个c和d可以是位置的或关键字的,最后两个e和f是仅关键字的。

由 Austin Distel 在 Unsplash 上拍摄
你为什么决定牺牲灵活性?当参数名无用或任意时,应该排除关键字参数。如果函数中的参数名在将来****被更改,也可以避免破坏您的代码。它有助于更健壮的代码。
3.f-string 2.0 —调试
Python f-string 是游戏改变者。这是一个可读的优雅的字符串格式化语法,它在字符串中嵌入了表达式。这是通过语法f'{expr}'完成的,其中表达式被 f 字符串中的花括号括起来,引号前有一个f。
新的更新支持使用等号** =作为语法为f'{expr=}'的 f 字符串内表达式的格式说明符。输出字符串将包括变量名及其值,在=之间有一个等号,如下所示。**
出于文档或调试的目的,我们经常想要打印出变量值。这使得用最小的努力调试变得容易。
4.可逆字典—顺序
字典现在可以在中重复,使用[reversed()](https://docs.python.org/3/library/functions.html#reversed)反转插入顺序。
5.新模块—元数据
有一个新的importlib.metadata模块允许你从第三方包中读取元数据。您可以在您的脚本中提取包的版本号。
6.继续——终于
由于实现的问题,在finally子句中使用continue语句曾经是非法的。不再是了。

汉娜·雅各布森在 Unsplash 上拍摄的照片
外卖
注意,我没有提到一些高级特性,这些特性与普通程序员如何为小项目编写代码没有什么关系。包括多处理共享内存、新 Pickle 协议等。对感兴趣的人来说。
这就是 6 个新的 Python 特性,即使是 Python 初学者也能从中受益。在进入 Python 3.8 之前,请确保您熟悉一些基本的 Python 特性。你可以注册我的时事通讯来接收我的新文章的更新。如果您对 Python 感兴趣,以下文章可能会有用:
** [## 我希望我能早点知道的 5 个 Python 特性
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## 每个 Python 初学者都应该学习的 4 个 NumPy 技巧
编写可读代码的技巧
towardsdatascience.com](/4-numpy-tricks-every-python-beginner-should-learn-bdb41febc2f2)
今天就开始用 Python 3.8 编码吧!**
鲁棒目标检测的 6 个障碍
您的探测器有多耐用?
你的物体探测器能探测到下图中的人和马吗?

同样的图像旋转 90 度会怎么样?它能探测到人和马吗?

或者这些图像中的猫?



最左侧(照片由埃里克-扬·勒辛克在 Unsplash 上拍摄)、中间(照片由克里斯塔·曼古松在 Unsplash 上拍摄)、最右侧(照片由鲁德梅乌拉·费尔南德斯在 Unsplash 上拍摄)
我们在计算机视觉的进步方面已经走了很长的路。使用人工智能的物体检测算法在某些任务中已经超过了人类。但是,为什么如果图像旋转 90 度,检测一个人,如果一只猫躺在一个不常见的位置,或者如果只有一部分是可见的,检测一个物体仍然是一个挑战。
自 2012 年 AlexNet 以来,已经为对象检测和分类创建了很多模型,它们在准确性和效率方面越来越好。然而,大多数模型都是在理想的场景中训练和测试的。但是在现实中,使用这些模型的场景并不总是理想的:背景可能是杂乱的,对象可能是变形的,或者可能是被遮挡的。以下面的猫的图片为例。任何被训练来检测猫的物体检测器将会无故障地检测到左边图像中的猫。但对于右边的图像,大多数检测器可能无法检测到猫。


左(在 Unsplash 上由 Edgar Edgar 拍摄)、右(在 Unsplash 上由 Krista Mangulsone 拍摄)
对于人类来说被认为是琐碎的任务在计算机视觉中无疑是一个挑战。我们人类很容易识别一个人,无论是任何方位的图像还是不同姿势的猫,或者从任何角度看的杯子。
让我们来看看 6 个这样的障碍,以稳健地检测对象。
1.视点变化
一个物体从不同的角度看可能会完全不同。以一个简单的杯子为例(参见下图),第一个图像显示了一个装有黑咖啡的杯子的俯视图,与第二个图像(装有卡布奇诺的杯子的侧视图和俯视图)和第三个图像(杯子的侧视图)完全不同。



不同视角的杯子。左(在 Unsplash 上杰克·卡特拍照)、中(在 Unsplash 上 Pablo Merchán Montes 拍照)、右(在 Unsplash 上诺德伍德主题拍照)
这是对象检测的挑战之一,因为大多数检测器仅使用来自特定视点的图像进行训练。
2.变形
许多感兴趣的物体不是刚体,并且可以以极端的方式变形。举个例子,让我们看看下面瑜伽练习者不同姿势的图片。如果对象检测器被训练来检测具有仅包括坐着、站着或行走的人的训练的人,则它可能不能检测这些图像中的人,因为这些图像中的特征可能与它在训练期间学习到的关于人的特征不匹配。


左(照片由阿维·理查兹在 Unsplash 上拍摄)、右(照片由凯西·PHAM在 Unsplash 上拍摄)


3.闭塞
感兴趣的对象可以被遮挡。有时只能看到物体的一小部分,少到只有几个像素。

拿着杯子的女人(照片由亚里沙·安东在 Unsplash 上拍摄)
例如,在上面的图像中,物体(杯子)被拿着杯子的人挡住了。当我们只看到一个物体的一部分时,在大多数情况下,我们可以立即识别它是什么。然而,对象检测器并不执行相同的操作。
遮挡的另一个例子是一个人拿着移动电话的图像。在这些图像中检测手机是一项挑战:



人们拿着手机。左(照片由梅根·舍里克拍摄于 Unsplash ),中(照片由威廉·艾文拍摄于 Unsplash ),右(照片由普里西拉·杜·普里兹拍摄于 Unsplash )
4.照明条件
照明对像素级别的影响非常大。物体在不同的光照条件下呈现不同的颜色。例如,室外监控摄像机整天暴露在不同的光照条件下,包括明亮的日光、傍晚和夜间光线。在这些不同的照明下,行人的图像看起来是不同的。这影响了检测机稳健检测物体的能力。



不同光照条件下的小巷。左(由色谱仪在 Unsplash 上拍照)、中(由奥米德阿明在 Unsplash 上拍照)、右(由斯拉万 V 在 Unsplash 上拍照)
5.杂乱或纹理背景
感兴趣的物体可能融入背景中,使它们难以识别。例如,下图中的猫和狗用它们坐着/躺着的地毯伪装起来。在这些情况下,物体检测器将面临检测猫和狗的挑战。






6.类内变异
感兴趣的对象通常可以是相对宽泛的,例如房子。这些物体有许多不同的类型,每一种都有自己的外观。下面所有的图片都是不同类型的房子。



房子。左(由杰西·罗伯特在 Unsplash 上拍照)、中(由拉尔夫·凯登在 Unsplash 上拍照)、右(由大卫·维克斯列尔在 Unsplash 上拍照)



房子。左(由伊恩·基夫在 Unsplash 上拍照)、中(由皮克斯夸在 Unsplash 上拍照)、右(由斯蒂芬·贝彻在 Unsplash 上拍照)
一个好的检测器必须足够健壮,以检测所有这些变化的叉积,同时还保持对类间变化的灵敏度。
解决方法
为了创建鲁棒的对象检测器,确保对于不同的视点、照明条件和不同背景中的对象,训练数据有良好的变化。如果您无法找到所有变化的真实世界训练数据,请使用数据扩充技术来合成您需要的数据。
您使用了哪些技术来增强物体检测器的鲁棒性? 在下面留下你的想法作为评论。
希望在树莓派上实现实时人脸检测?看看这个帖子。
更多故事:
关于作者
Sabina Pokhrel 在 Xailient 工作,这是一家计算机视觉初创公司,已经建立了世界上最快的边缘优化物体探测器。
参考文献:
这是一个介绍性的讲座,旨在向人们介绍计算机视觉以外的图像…
compsci697l.github.io](https://compsci697l.github.io/notes/classification/) [## 了解图像识别及其用途
说到识别图像,我们人类可以清楚地识别和区分物体的不同特征…
www.einfochips.com](https://www.einfochips.com/blog/understanding-image-recognition-and-its-uses/)
Pahuja,a .,Majumder,a .,Chakraborty,a .,和 Venkatesh Babu,R. (2019 年)。通过注意力增强显著对象分割。 arXiv 预印本 arXiv:1905.11522 。
迈尔,w .,埃谢,m .,,施泰因巴赫,E. (2011 年 9 月)。镜面环境中变化光照下基于图像的目标检测。在 2011 年第 18 届 IEEE 国际图像处理会议(第 1389–1392 页)。IEEE。
蔡,杨,杜,丁,张,文,王,吴,杨,刘(2019)。无人机目标探测和计数的引导注意力网络。 arXiv 预印本 arXiv:1909.11307 。
萧,e .,,赫伯特,M. (2014)。任意视点下目标检测的遮挡推理。 IEEE 模式分析与机器智能汇刊, 36 (9),1803–1815。*
你应该知道的 6 个熊猫技巧来加速你的数据分析
一些最有用的熊猫把戏

阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片
在这篇文章中,你将学习一些最有用的熊猫技巧来加速你的数据分析。
- 按数据类型选择列
- 将字符串转换为数字
- 检测和处理缺失值
- 将连续数字特征转换为分类特征
- 从剪贴板创建数据帧
- 从多个文件构建数据框架
源代码请查看我的 Github repo 。
1.按数据类型选择列
以下是泰坦尼克号数据帧的数据类型
df.dtypesPassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
假设您需要选择数字列。
df.select_dtypes(**include='number'**).head()

这包括 int 和 float 列。您还可以使用此方法来
- 仅选择对象列
- 选择多种数据类型
- 排除某些数据类型
# select just object columns
df.select_dtypes(**include='object'**)# select multiple data types
df.select_dtypes(**include=['int', 'datetime', 'object']**)# exclude certain data types
df.select_dtypes(**exclude='int'**)
2.将字符串转换为数字
在 Pandas 中有两种方法将字符串转换成数字:
astype()法to_numeric()方法
让我们创建一个示例数据帧来看看区别。
df = pd.DataFrame({ 'product': ['A','B','C','D'],
'price': ['10','20','30','40'],
'sales': ['20','-','60','-']
})

价格 和 销售 列存储为字符串,因此产生对象列:
df.dtypesproduct object
**price object
sales object**
dtype: object
我们可以使用第一种方法astype()对 价格 列进行如下转换
# Use Python type
df['price'] = df['price']**.astype(int)**# alternatively, pass { col: dtype }
df = df.**astype({'price': 'int'})**
但是,如果我们试图在 sales 列中使用它,就会导致错误。为了解决这个问题,我们可以使用带有参数errors='coerce'的to_numeric()
df['sales'] = **pd.to_numeric(df['sales'], errors='coerce')**
现在,无效值-被转换为NaN,数据类型为 float 。

3.检测和处理缺失值
检测缺失值的一种方法是使用info()方法并查看列 非空计数 。
df.info()RangeIndex: **891 entries**, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
**5 Age 714 non-null** float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
**10 Cabin 204 non-null** object
**11 Embarked 889 non-null** object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
当数据集很大时,我们可以计算缺失值的数量。df.isnull().sum()返回每列缺失值的数量
df.**isnull().sum()**PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
df.isnull().sum().sum()返回缺失值的总数。
df.**isnull().sum().sum()**886
此外,我们还可以通过运行df.isna().mean()找出缺失值的百分比
ufo.isna().mean()PassengerId 0.000000
Survived 0.000000
Pclass 0.000000
Name 0.000000
Sex 0.000000
Age 0.198653
SibSp 0.000000
Parch 0.000000
Ticket 0.000000
Fare 0.000000
Cabin 0.771044
Embarked 0.002245
dtype: float64
删除丢失的值
如果存在任何 NaN 值,则删除行
df.dropna(**axis = 0**)
如果存在任何 NaN 值,则删除列
df.dropna(**axis = 1**)
删除缺少 10%以上值的列
df.dropna(**thresh=len(df)*0.9**, **axis=1**)
替换丢失的值
用标量替换所有 NaN 值
df.fillna(**value=10**)
用前一行中的值替换 NaN 值。
df.fillna(**axis=0**, **method='ffill'**)
用前一列中的值替换 NaN 值。
df.fillna(**axis=1**, **method='ffill'**)
同样,您也可以用下一行或下一列中的值替换 NaN 值。
# Replace with the values in the next row
df.fillna(**axis=0**, **method='bfill'**)# Replace with the values in the next column
df.fillna(**axis=1**, **method='bfill'**)
另一种常见的替换是用平均值替换 NaN 值。例如,用平均值替换列 Age 中的 NaN 值。
df[**'Age'**].fillna(value=**df['Age'].mean()**, inplace=True)
有关 Pandas 中缺失值的更多信息,请查看使用 Pandas 中缺失值的。
4.将连续数字特征转换为分类特征
在数据准备的步骤中,组合或转换现有要素以创建更有用的要素是很常见的。最流行的方法之一是从连续的数字特征创建分类特征。
让我们看看泰坦尼克号数据集中的 年龄 列
df['Age'].head(8)0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 NaN
6 54.0
7 2.0
Name: Age, dtype: float64
年龄 是一个连续的数字属性,但是如果要将其转换为分类属性,比如将年龄转换为年龄范围的组:≤12,青少年(≤18),成年(≤60),老年(> 60)怎么办
最好的方法是使用 Pandas cut()功能:
import sysdf['ageGroup']=pd.cut(
**df['Age'],**
**bins=[0, 13, 19, 61, sys.maxsize],**
**labels=['<12', 'Teen', 'Adult', 'Older']**
)

并且在 年龄组 栏上调用head()也应该显示该栏信息。
df['ageGroup'].head(8)0 Adult
1 Adult
2 Adult
3 Adult
4 Adult
5 NaN
6 Adult
7 <12
**Name: ageGroup, dtype: category**
**Categories (4, object): [<12 < Teen < Adult < Older]**
5.从剪贴板创建数据帧
Pandas read_clipboard()函数是一种非常方便的方法,可以尽快将数据转换成数据帧。
假设我们有以下数据,并希望根据这些数据创建一个数据框:
product price
0 A 10
1 B 20
2 C 30
4 D 40
我们只需要选择数据并将其复制到剪贴板。然后,我们可以使用函数将它读入数据帧。
df = **pd.read_clipboard()**
df

6.从多个文件构建数据框架
数据集可能分布在多个文件中,但您希望将数据集读入单个数据帧中。
一种方法是将每个文件读入其自己的数据帧,将它们组合在一起,然后删除原始的数据帧,但这将是内存低效的。
更好的解决方案是使用内置的glob模块(感谢数据学校熊猫诡计)。

在这种情况下,glob()在数据目录中查找以单词“ data_row_ ”开头的所有 CSV 文件。glob()以任意顺序返回文件名,这就是为什么我们使用sort()函数对列表进行排序。
对于行方式的数据
假设我们的数据集按行分布在两个文件中,data _ row _ 1 . CSV和data _ row _ 2 . CSV

从这两个文件创建一个数据帧。
files = sorted(glob('**data/data_row_*.csv**'))
pd.concat((pd.read_csv(file) for file in files), **ignore_index=True**)
sorted(glob('**data/data_row_*.csv'**))返回文件名。之后,我们使用read_csv()读取每个文件,并将结果传递给concat()函数,该函数将这些行连接成一个数据帧。此外,为了避免索引中的重复值,我们告诉concat()忽略索引(**ignore_index=True**),而使用默认的整数索引。

对于按列排列的数据
假设我们的数据集以列方式分布在两个文件中,data _ col _ 1 . CSV和data _ col _ 2 . CSV。

从这两个文件创建一个数据帧。
files = sorted(glob('data/data_col_*.csv'))
pd.concat((pd.read_csv(file) for file in files), **axis=1**)
这一次,我们告诉concat()函数沿着列轴连接。

好了
感谢阅读。
请在我的 Github 上查看笔记本的源代码。
如果你对机器学习的实用方面感兴趣,请继续关注。
构建数据科学职业生涯的 6 个播客
从建立你的品牌和面试技巧到基本的技术技能

安琪丽可·雷德梅克斯的照片来自重拍
网络上有很多免费资源可以帮助你成为更好的数据科学家。其中之一就是播客。播客是向在该领域有经验的专业人士、技术黑客学习或习惯数据科学术语的有用来源。大多数剧集都在 30-60 分钟之间,因此,是你日常工作或大学旅行的绝佳伴侣,无论是在健身时还是在两者之间。
你可以在媒体上找到一些关于数据科学、工程和商业的最好的播客。虽然我发现其中一些播客技术性很强,通常涵盖小众项目,但我喜欢听那些明确致力于数据科学职业发展和个人成长的演讲。
以下是我经常收听的 6 个播客,主要讲述如何在数据科学领域取得成功,以及如何在职业生涯中取得进步:
1.在数据科学领域建立职业生涯
在这个相当新的播客中(自 2020 年 9 月起),Jaqueline Nolis 和 Emily Robinson 将他们新出版的同名书籍带入生活。这不是印刷版的音频版本,而是对他们书中涵盖的主题的补充聊天,如开始职业生涯、获得第一份工作和在数据科学中成长。
他们是我名单上的第一个,因为 Jaqueline 和 Emily 是我下面列出的大多数节目的常客,证明了他们是数据科学职业发展中值得信赖的专家。此外,两人都有有趣的背景,他们有很多可以分享的东西,并以有趣的方式分享(我指的是介绍歌曲!!!).在第一期发布的剧集中,您将了解数据科学中的各种工作描述,根据雇主规模的不同而不同的职责,或者讨论博士与训练营选项。
在可用:Spotify、苹果播客、谷歌播客、Pocket casts,或者这里。
迄今为止最喜欢的一集:第二章——数据科学公司
2.数据科学的艺术家们
在《数据科学的艺术家》中,Harpreet Sahota 采访了专业人士和学者,探讨他们在数据科学领域的职业发展和工作经历。我非常喜欢这个播客,因为 Harpreet 将他的播客完全奉献给了个人成长。他听起来也很有趣,看起来总是 100%投入到节目中。
此外,他每周发布几集,使他成为我名单上最频繁的播客,有很多内容可供学习。在他的采访旁边,Harpreet 记录了所谓的每周“办公时间”,你可以注册并询问与数据科学相关的问题。我推荐听或者报名那些集听听别人的问题或者问自己的问题。
在上可用:Spotify、谷歌播客、苹果播客,或者这里。
到目前为止最喜欢的一集:和斯科特·h·杨一起成为一名超级赢家
3.超级数据科学
与上面介绍的相当新的播客相反,在过去的四年里,基里尔·叶列缅科每周都为 SuperDataScience 发布播客。由同名学习平台赞助,Kiril 与来自该领域的经验丰富的专业人士讨论数据相关的话题,从数据可视化到掌握工作面试,再到更好地远程工作。
我喜欢这个播客,因为 Kirill 也涉及个人成长话题,如生产力、冥想或骗子综合症。他找到了技术和自我发展谈话的正确结合。此外,每周五,基里尔都会发布一个“周五五分钟”集,要么简要解释 p 值等技术概念,要么分享职业发展的技巧和想法。对我来说,特别是那些小插曲是灵感的巨大来源。
在上可用:Spotify、Listen Notes、Soundcloud,或者这里。
到目前为止最喜欢的一集:SDS 399——为社区做贡献,SDS 303——对每个领域进行适当的假设检验
4.走向数据科学播客
走向数据科学播客是著名媒体出版物的官方播客系列。它专门分享关于数据科学的一般想法,还涵盖职业建议、自学故事和行业趋势。我喜欢这个播客系列,尽管它有时取决于谁是主持人。每当杰里米·哈里斯主持节目,我相信他是主要主持人,都值得收听!
在上可用:Spotify、谷歌播客、苹果播客,或此处。
迄今为止最喜欢的一集:爱德华·哈里斯——掌握数据科学求职
5.数据框架
由 Hugo Bowne-Anderson 主持的 DataFramed 播客是学习平台 Datacamp 的播客系列。像 TDS 播客一样,DataFramed 不仅仅致力于职业发展;然而,有几集讲述了个人发展和职业生涯。我觉得雨果喋喋不休,但值得一听,直到最后讨论最令人兴奋的事情。在这里,我学到了一些很棒的东西!
我无法确定的一件事是每集播放的片段。一个片段有时是为了广告,有时是为了简要解释一个重要的统计概念,如 AB 测试。这些片段往往超级有趣,但也完全断章取义。
在可用:Spotify、谷歌播客、苹果播客,或者这里。
迄今为止最喜欢的一集 : #55 获得你的第一份数据科学工作
尤其是对女士来说…
6.数据科学中的女性
在她的播客“数据科学中的女性”中,Margot Gerritsen 教授只采访了在许多不同行业和部门应用数据科学的女性。这些都是来自有影响力的个人的真正鼓舞人心的故事。在整个节目中,你将了解到数据可以影响的众多领域,并聆听女性在 STEM 相关工作中的个人经历。
在上可用:Spotify、谷歌播客、苹果播客、Stitcher,或者这里。
迄今为止最喜欢的一集:徐亚——用数据为全球劳动力的所有成员创造经济机会
快乐聆听!
如果你认为我的列表缺少一个在数据科学领域建立职业生涯的好播客,请留下评论!
机器学习爱好者提出的 6 个问题
我提供的答案
在我的人工智能学习之旅的开始,我希望我有一些导师可以指引我正确的方向。
我在学习机器学习的方法上需要指导,尤其是当我购买的第一本学习机器学习的书是一个相当强大的敌人的时候。
两年时间和大量的 model.fit()之后,我现在是一名专业的 ML/计算机视觉工程师。
开始人工智能之旅或只是寻求建议的个人可以通过 LinkedIn 联系我并提出问题。我知道尝试在人工智能的世界中导航有多难,所以我总是尽力回答通过 LinkedIn 或电子邮件发给我的所有问题。
这篇文章包含六个机器学习相关的问题,涵盖了机器学习的学术、职业和技术方面。
也许你想问一些问题。看看下面的问题,也许你会找到一些指导。
如果我提供的答案没有一个对你有用,那么向下滚动到结论部分,找出如何直接问我你的问题。

由 Unsplash 上的制作者 NESA 拍摄
说到这里,让我们开始吧。
学术问题

Joshua Hoehne 在 Unsplash 上拍摄的照片
问题#1 :
你会推荐数据科学硕士(大多数大学都提供)或某个专业领域的硕士吗?请从各自领域工作机会的角度给出建议。
回答:
如果你确信自己只对数据科学领域的就业机会感兴趣,我建议你获得数据科学硕士学位。
尽管当前的疫情和一些行业正在经历的困难,对数据科学家的需求似乎仍然很高。
与此同时,数据科学家的供应也在增加,这意味着更多的角色竞争。
处于行业顶端的杰出数据科学家能够非常迅速地找到角色。
然而,如果你知道自己的兴趣和热情所在,你可能会想在更专业的领域攻读硕士学位。
如果你对计算机视觉、自然语言处理或机器人等领域感兴趣,那么攻读更专业的理学硕士学位似乎是一个合理的选择。
由于它们更具技术性和专业性,当比较数据科学领域的职位时,工作职位的竞争可能不会那么激烈。
另一个关键点是,你从计算机视觉或 NLP 专业学位获得的一些技能可以转移到一般的数据科学职位上。因此,你可以拥有计算机视觉等技术领域的硕士学位,同时还拥有数据科学家的相关技能。
以我为例,即使我学习了机器学习和计算机视觉的硕士学位,我仍然拥有申请数据科学工作所必需的技能。
在我得到计算机视觉工程师的工作之前,我的前几次面试是为了数据科学的职位。
问题 2:
学习自主领域有哪些相关课程和见解?
回答:
我在自主领域的经验和知识非常有限。
尽管如此,我还是会提供一些我通过网上研究和直觉找到的有用信息。
自主领域将与自主车辆和机器人相一致。自动驾驶汽车的主要领域将是传感器和基于视觉的方法,自动驾驶汽车使用这些方法来获得对环境的感知和理解。
自动驾驶汽车研究的其他领域是导航系统和地图规划。
因此,以下是一些需要考虑进一步探索的领域:
- 自动驾驶汽车中的深度学习
- 自主车辆和机器人中的激光雷达传感器
- 机器人或车辆中的导航和路径规划。
作为起点,看一看这个课程,看看它是否符合你的学习要求。
自主机器人和车辆在人类的技术未来中占有一席之地。
看看挤满了自主机器人的亚马逊仓库。在未来 5-10 年内,一些运输系统将采用自动导航机器人。
特斯拉最近刚刚发布了他们全自动驾驶系统的测试版,甚至计划将其扩展到更多的城市。
我住在英国,我看到一些公司在繁忙的城市地区测试送货机器人。
职业问题

安妮·斯普拉特在 Unsplash 上的照片
问题 3:
你能告诉我申请深度学习/计算机视觉工程师的工作需要什么条件吗?
回答:
大多数 ML/CV 工程角色需要精通至少两种编程语言的人,而 Python 是业界最受欢迎的。
此外,使用云计算服务提供商的经验,如 GCP 、 AWS 、 Azure 也很受欢迎,但他们往往是一个可取的要求。
拥有使用 PyTorch、TensorFlow 或 Keras 等机器学习库的经验是大多数(如果不是全部)ML 工程师职位广告的标准要求。
以下是深度学习/计算机视觉角色的一般要求:
- 编程语言知识(Python,JavaScript,Java,C 等。).
- 软件工程经验。
- 了解深度学习架构,如 CNN、RNN 和 DNN。
- 使用 PyTorch、Keras 或 TensorFlow 等机器学习库的经验。
- 拥有 GCP 和 AWS 等云服务的经验。
- 经验建设应用程序,以解决常见的计算机视觉任务,如对象检测,姿态估计,人脸检测等。
技术问题

布莱克·康纳利在 Unsplash 上拍摄的照片
问题 4:
人工智能目前对视频的分析有多好,人工智能视频分析的未来是什么样的?
回答:
直接回答你的问题,深度学习技术一般可以很好地分析视频。
深度学习技术已经足够好,能够描述视频的内容和背景。
例如,人工智能非常擅长在连续的视频帧中跟踪多个个体,还可以对视频进行面部识别,而人类可能甚至无法做到这一点。
姿势估计的深度学习解决方案能够从视频数据中实时检测人体关节的位置。
人工智能视频分析的前景非常光明。在未来,我们可能会看到视频分析应用于大多数形式的现场娱乐,如足球比赛、流媒体音乐会等等。
对我来说,这似乎是合乎逻辑的一步。
描绘一个场景,目前,当我们看足球或任何运动时,我们听人类评论员。我相信在未来的十年或二十年内,我们会看到人工智能评论员的出现。
看看这个视频总结了分析真人打网球视频的研究工作,然后生成令人印象深刻的网球比赛游戏。
问题 5:
在计算机视觉和人工智能领域,线性代数和微积分有多重要?作为一名初学者,我应该在这些数学分支领域中涵盖哪些主题?
回答:
从学术角度来看,理解线性代数对于深入了解计算机视觉和深度学习中的特定主题至关重要。
在深度学习和卷积神经网络出现之前,许多计算机视觉技术利用了大量严重依赖数学的启发式直觉和算法。
一个简单的例子是使用数学函数将图像数据从一种状态转换到另一种状态的典型转换或增强算法。
如果我们转向计算机视觉中更高级的主题,如深度学习,那么理解微积分对于理解神经网络如何学习的一些基本概念是必不可少的。
反向传播和优化算法的主题是基于数学的。
从学术角度来看,理解与机器学习相关的所有数学领域将为你的研究提供优势。
问题 6:
你是否利用了许多预先训练好的模型/库,等等。?
回答
在专业环境中,你倾向于利用许多预先训练好的模型。
简单来说,你很少会从零开始开发算法或神经网络(除非你在 ML research 工作)。
在看实用的 AI 时,更强调软件工程和 ML 模型集成。
库方面, TensorFlow 在实际用例中使用,特别是配合 TFlite 库。TensorFlow Lite 专注于边缘设备上的 ML 配置。PyTorch 和 Keras 也是行业标准。
不太需要开发新的算法或技术来解决已经解决的问题。
一些标准的机器学习库已经有性能良好的 ML 和深度学习架构方法和类可用。
结论
作为一名学者或专业人士,试图掌握人工智能是相当具有挑战性的。
对我们来说幸运的是,一般的人工智能和数据科学社区在某种程度上是有帮助的,并且愿意帮助那些刚开始使用 CUDA 或者似乎无法修复 CUDA 内存不足错误的人!
如果本文包含的问题没有一个适用于你,或者你想问我更多与机器学习相关的问题,那么请在本文的评论部分随意提问。
我会尽我所能回应。或者其他读者可能有你想问的问题的答案。
正如我所说的,我们有一个反应灵敏、乐于助人的人工智能社区。
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
一个值得追求的想法?
towardsdatascience.com](/how-im-using-smartwatch-sensors-to-limit-covid-19-infection-51abe04f81f9) [## 专注于技术深度学习的文章
发现解释卷积神经网络,算法,计算机视觉的内部工作的文章…
towardsdatascience.com](/technical-deep-learning-focused-articles-7ad3b0fe3b5a)
加入人工智能创业公司之前,你需要问的 6 个问题
意见
评估人工智能工作真正由一家初创公司完成的程度

克拉克·斯坦利(来源:维基共享)
克拉克·斯坦利,也被称为“响尾蛇之王”,是 19 世纪末的一位著名企业家。斯坦利从牛仔变成了医生,他是第一个开始销售“蛇油”作为治疗多种疾病的灵丹妙药的商人。在芝加哥一次研讨会上的一次臭名昭著的演示中,斯坦利拿了一条活响尾蛇,把它切开,放入沸水中,撇去浮在表面的脂肪,以显示他的蛇油的真实性。公众欣然接受。他的蛇油大受欢迎。
但是有一些问题。大的。
1)史丹利的蛇油并没有做到它宣称的那样。它没有声称的治疗疾病的功效。
2)此外,与所有营销噱头一样,你看到的并不总是你得到的。在卖了 20 多年“斯坦利的蛇油”后,当局终于检查了他的神奇药水。他们在里面发现了矿物油、牛肉脂肪、辣椒和松节油!没有发现任何蛇油的迹象。
这场欺诈是斯坦利精心策划的,持续时间如此之长,以至于直到今天,“蛇油推销员”这个委婉的说法都是指欺诈性的推销和与事实相去甚远的说法。
那么为什么我在 AI 的背景下谈论蛇油推销员呢?
有人说过一句名言,“数据是新的石油”。确实如此。但你知道新的“蛇油”是什么吗?人工智能!
请允许我解释。今天,无论你看向哪里,都有人在做某事(或许多事!)用人工智能。AI 无处不在。到处都是。虽然在很多方面都是如此——我们确实在生活的很多很多方面使用人工智能——但问题在于这个术语的解释有多松散。就像闪光的不都是金子,计算机做的一切都不是人工智能。非常简单地说,人工智能指的是机器变得智能,以复制人类的行动和/或决策来实现既定目标。(更多详情还可以在这里 )阅读我关于解码 AI 的文章。
这种欺骗性的人工智能主导的营销对初创公司生态系统的影响是深远的。
全球各地的初创公司都在吹捧许多事情是由人工智能驱动的,但实际上几乎没有真正的人工智能。由于大多数人几乎不理解人工智能到底是什么,他们没有自己的过错,他们陷入了所有的噱头。2019 年进行的一项调查发现,在欧洲近 2900 家人工智能初创公司中,有 40%没有以任何实质性的形式使用人工智能。
人工智能和机器学习等术语已经成为全球风投的诱饵,这一事实无助于这项事业。投资者排队购买任何远称人工智能邻近的东西。事实上,上面引用的同一项调查得出结论,声称从事人工智能工作的初创公司比其他软件公司吸引的资金多 15%至 50%。因此,初创公司有一个几乎合理的理由试图不择手段地在人工智能生态系统中定位自己。
如果有一个利益相关者群体为初创公司快速松散地使用人工智能术语付出了沉重的代价,那就是潜在的员工。有成千上万的年轻专业人士,有些刚刚大学毕业,正在寻找在新兴的数据科学和人工智能领域工作的梦想。他们被打造下一个人工智能独角兽的承诺以及获得解决最前沿分析问题的机会所吸引。然而现实可能与此相去甚远,这将导致全面的失望和遗憾。员工感觉被欺骗了,公司不得不处理高员工流动率的问题,这需要知识转移,甚至重新启动开发工作(这总是一个昂贵的提议!).
因此,作为一家人工智能创业公司的潜在员工,你必须提出正确的问题,并评估该公司正在做或计划做的事情的深度。作为一家人工智能或人工智能初创公司的创始人,你最好提前告诉潜在的团队成员,数据科学团队应该做什么。
在过去 15 年多的时间里,我一直在数据科学、人工智能和机器学习领域工作,我遇到了许多幻想破灭的年轻人,他们以为自己注册了一份光荣的职业,但却发现他们的大部分时间都花在了清理或标记数据集上。以下是我一直建议他们在面试人工智能初创公司的工作时应该问的问题。这不仅有助于潜在员工更好地理解他/她正在从事的工作,也向创始人表明你理解其中的细微差别。
1.服务还是产品?
这是一个重要的区别。一个人在人工智能服务公司所做的工作将与在产品公司非常不同。虽然服务通常会提供更多的多样性,但是构建一个产品会更深入。
2.如果是服务,那么是什么样的服务?
在大多数情况下,服务工作类似于咨询,即向客户提供人工智能解决方案或模型,以解决特定的问题陈述。因此,重要的是要问清楚,初创公司为其客户处理的是什么样的问题陈述?问题陈述是否有很大的差异,或者它们是否有一个定义明确的集合?
此外,您希望参与服务交付的哪一部分—数据聚合/清理、模型构建、手动训练集创建等。?重要的是要意识到总会有繁重的工作要做,但是要对实际模型开发、技术研究等所花费的时间比例有所了解。总是有帮助的。
3.如果是产品,那么是什么样的产品?
绝大多数人工智能初创公司都会落入产品类别。但并不是所有的产品都一样。能够更多地了解初创公司正在构建的产品类型,可以提供对可能涉及的数据科学或机器学习工作的深入了解。下面是创业公司通常会涉及的产品类型的大致指南。

图 1:人工智能产品类型
一旦你理解了正在构建的人工智能产品的类型,深入挖掘,找出你将参与产品开发的哪个具体方面?理解中长期产品愿景也很有帮助——初创公司的创始人通常会(希望如此!)对他们如何设想他们的产品的发展有一个公平的想法。
4.正在使用的技术堆栈是什么?
这个问题很重要,原因有二。首先,它将帮助你对产品愿景有所了解。其次,如果你加入这家公司,它还会帮助你评估是否有你可能需要学习或温习的特定技能或语言。
5.他们通常会使用什么类型的数据来构建和测试模型?
这个问题之所以重要,是因为它有助于区分小麦和谷壳。深度致力于人工智能优先战略的初创公司将非常了解他们用于产品开发的数据。例如,一家公司希望开发一种产品,该产品使用计算机视觉技术,让机器通过分析 ct 扫描图像来预测癌症的发生,该公司需要访问大型图像库来训练和建立模型。
如果你得到了这个问题的可靠答案,你通常可以放心,这家初创公司的基础相对来说是比较牢固的。
6.创始团队的背景?
你可能不需要明确地问这个问题,相反,你可以自己做研究来找出答案。这个问题很重要,因为人工智能在很大程度上是一个技术领域。这也是一个动态的、快速发展的领域。拥有人工智能领域经验的创始人(或创始团队的一部分)对于确保更高的成功概率至关重要,因为他们非常了解挑战,能够指导团队,引导初创公司朝着正确的方向发展。
人工智能和数据科学领域无疑是当今最令人兴奋的领域之一。我们集体刚刚开始触及一切可能的表面——视野是无限的。人工智能的扩散将对世界产生的影响,预计将比工业革命更具戏剧性。
因此,任何足够早进入这个领域的人,随着这个领域的进一步发展,都会有巨大的机会。做出明智的选择,做出明智的选择。当全球各地存在无数真实而令人兴奋的创业机会时,不要陷入白日梦。
Seaborn (Python)中更漂亮和定制的情节的 6 个简单技巧
数据可视化
初学者指南,轻松个性化您的情节
在本帖中,我们将看看一些简单的方法来定制你的情节,使它们在美学上更令人愉悦。希望这些简单的小技巧能帮你得到更好看的剧情,节省你调整个别剧情的时间。

由 Kelli Tungay 在 Unsplash 上拍摄的照片
基线图📊
本帖中的脚本是在 Jupyter Notebook 的 Python 3.8.3 中测试的。
让我们使用 Seaborn 内置的企鹅数据集作为样本数据:
# Import packages
import matplotlib.pyplot as plt
import seaborn as sns# Import data
df = sns.load_dataset('penguins').rename(columns={'sex': 'gender'})
df

我们将使用默认图表设置构建一个标准散点图,并将其用作基线:
# Plot
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')

我们将会看到这个情节是如何随着每个提示而改变的。
技巧🌟
您将看到前两个提示是针对单个图的,而剩下的四个提示是针对所有图表的默认设置的。
📍技巧 1:分号
您注意到上一个图中图表正上方的文本输出了吗?抑制该文本输出的一个简单方法是在绘图结束时使用;。
# Plot
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender');

通过在代码末尾添加;,我们得到了更清晰的输出。
📍技巧 2: plt.figure()
调整大小通常有利于绘图。如果我们想调整大小,我们可以这样做:
# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender');

当我们调整大小时,图例移到了左上角。让我们将图例移到图表之外,这样它就不会意外覆盖数据点:
# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1));

如果你想知道如何知道对figsize()或bbox_to_anchor()使用什么数字组合,你需要反复试验哪个数字最适合这个图。
📍技巧 3: sns.set_style()
如果我们不喜欢默认样式,此功能有助于更改绘图的整体样式。这包括轴线颜色和背景的美感。让我们将样式更改为白色网格并查看绘图外观如何变化:
# Change default style
sns.set_style('whitegrid')# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1));

这里有更多的其他选项可以尝试:'darkgrid'、'dark'和'ticks'来找到你更喜欢的一个。
📍技巧 4: sns.set_context()
在前面的图中,标签尺寸看起来很小。使用sns.set_context(),如果我们不喜欢默认设置,我们可以更改上下文参数。我使用这个函数主要是为了控制图中标签的默认字体大小。通过更改默认值,我们可以节省时间,因为不必为各个图的不同元素(如轴标签、标题、图例)调整字体大小。我们把上下文换成'talk'再看剧情:
# Change default context
sns.set_context('talk')# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1));

它更容易辨认,不是吗?另一个可以尝试的选项是:'poster',这将进一步增加默认大小。
📍技巧 5: sns.set_palette()
如果你想将默认调色板定制成你喜欢的颜色组合,这个功能很方便。我们可以使用 Matplotlib 中的颜色图。这里是可供选择的 Matplotlib 颜色图列表。我们把调色盘换成'rainbow'再看剧情:
# Change default palette
sns.set_palette('rainbow')# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1));

如果你找不到你喜欢的 Matplotlib 颜色图,你可以手工选择颜色来创建你自己独特的调色板。🎨创建自己调色板的一种方法是将颜色名称列表传递给函数,如下例所示。这里是颜色名称列表。
# Change default palette
sns.set_palette(['green', 'purple', 'red'])# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1));

如果颜色名称不能很好地表达您的需求,您可以使用十六进制颜色构建自己的调色板,以获得更广泛的选项(超过 1600 万种颜色!).这里是我最喜欢的查找十六进制自定义调色板的资源。让我们看一个例子:
# Change default palette
sns.set_palette(['#62C370', '#FFD166', '#EF476F'])# Plot
plt.figure(figsize=(9, 5))
sns.scatterplot(data=df, x='body_mass_g', y='bill_length_mm',
alpha=0.7, hue='species', size='gender')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1));

📍技巧 6: sns.set()
根据前面的三个技巧,我希望你能找到你最喜欢的组合(在某些情况下,可以保持默认设置不变)。如果我们要更新图表的默认设置,最好是在导入可视化软件包之后进行。这意味着我们在脚本的开头会有这样一个片段:
# Import packages
import matplotlib.pyplot as plt
import seaborn as sns# Change defaults
sns.set_style('whitegrid')
sns.set_context('talk')
sns.set_palette('rainbow')
使用sns.set()可以更简洁地更新多个默认值。下面是相同代码的简洁版本:
# Import packages
import matplotlib.pyplot as plt
import seaborn as sns# Change defaults
sns.set(style='whitegrid', context='talk', palette='rainbow')
Voila❕:这是六条建议。以下是调整前后的曲线图对比:

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接 ,成为会员,您的一部分会费将直接用于支持我。
我希望你学会了一些简单的方法来调整你的情节,而不必花太多时间。我希望这篇文章已经给了你一些开始个性化你的情节的想法,并使它们在视觉上更令人愉悦。如果你感兴趣,这里有我的一些帖子的链接:
◼️python 中的探索性文本分析
◼️️ 给熊猫用户的 5 个提示
◼️️ 熊猫中数据聚合的 5 个提示
◼️️ 在熊猫中编写 5 个常用 SQL 查询
◼️️ 在熊猫中编写高级 SQL 查询
再见🏃💨
每个数据科学家都应该知道的 6 个 SQL 技巧
提高分析效率的 SQL 技巧的第 1 部分
数据科学家/分析师应该了解 SQL,事实上,所有从事数据和分析工作的专业人士都应该了解 SQL。在某种程度上,SQL 是一种被低估的数据科学技能,因为它被认为是从数据库中提取数据的必要而不酷的方式,以提供给 pandas 和{tidyverse} —争论数据的更好的方式。

然而,随着行业中每天收集和产生大量数据,只要数据驻留在符合 SQL 的数据库中,SQL 仍然是帮助您调查、过滤和聚合以彻底了解您的数据的最熟练的工具。通过对 SQL 进行切分,分析人员可以识别出值得进一步研究的模式,这常常会导致重新定义分析群体和变量,使之比初始范围小得多。
因此,分析的第一步不是将庞大的数据集转移到 Python 或 R 中,而是使用 SQL 从我们的数据中获得信息性的见解。
在现实世界的关系数据库中,SQL 不仅仅是 SELECT、JOIN、ORDER BY 语句。在这篇博客中,我将讨论 6 个技巧(和一个额外的技巧),让你的 SQL 分析工作更有效,并与 Python 和 r 等其他编程语言集成。
在本练习中,我们将使用 Oracle SQL 处理下面的玩具数据表,该数据表包含多种类型的数据元素,

玩具数据表(带有变量定义)
- COALESCE()记录空/缺失数据
当谈到重新编码丢失的值时,COALESCE()函数是我们的秘密武器,在这种情况下,它将 NULL 值重新编码为第二个参数中指定的任何值。对于我们的例子,我们可以将 NULL_VAR 重新编码为一个字符值‘MISSING’,
这段代码片段返回,

COALESCE()记录空值
然而,一个重要的注意事项是,在数据库中, 缺失值 可以用除 NULL 之外的各种方式编码。例如,它们可以是空字符串/空格(例如,我们表中的 EMPTY_STR_VAR),或者字符串“NA”(例如,我们表中的 NA_STR_VAR)。在这些情况下,COALESCE()不起作用,但是可以用 CASE WHEN 语句来处理它们,
何时对空或 NA 重新编码

以下情况下的输出
***更新 2022:你也可以在我的频道这里看这个博客的视频版,
2。计算运行总频率和累计频率
当我们对给定点的总和(而不是单个值)感兴趣时,运行总计对于潜在分析人群细分和异常值识别非常有用。
下面展示了如何计算变量 NUM_VAR 的累计和累计频率,

累积频率的输出
这是我们的输出(在左边)。
这里有两个技巧,(1)SUM overROWS UNBOUNDED previous将计算到该点的所有先前值的总和;(2)创建一个 JOIN_ID 来计算总和。
我们使用窗口函数进行计算,根据累积频率,不难发现最后一条记录是异常值。
3。查找没有自连接的极值记录
所以我们的任务是返回每个惟一 ID 的 NUM_VAR 值最大的行。直观的查询是首先使用 group by 找到每个 ID 的最大值,然后对 ID 和最大值进行自连接。然而一种更简洁的方式是,
具有最大值的记录
这个查询应该给出下面的输出,显示具有按 ID 分组的最大数量变量的行,

具有最大 NUM_VAR 值的记录输出
4。条件 WHERE 子句
大家都知道 SQL 中用于 subsetting 的 WHERE 子句。事实上,我发现自己更经常地使用条件 WHERE 子句。例如,对于玩具表,我们只想保持满足以下逻辑的行,
—如果 SEQ 变量 in (1,2,3) & diff(日期变量 2,日期变量 1)≥ 0
— elif SEQ 变量 in (4,5,6) & diff(日期变量 2,日期变量 1) ≥1
— else diff(DATE_VAR2,DATE_VAR1) ≥2
现在条件 WHERE 子句就派上用场了,
条件 where 子句

条件 where 子句的输出
前面提到的逻辑应该消除 ID = 19064 的序列 4,5,因为 date2 和 date1 之间的差= 0,这正是上面查询返回的结果。
5。Lag()和 Lead()处理连续行
Lag(查看前一行)和 Lead(查看下一行)可能是我日常工作中最常用的两个分析函数。简而言之,这两个函数允许用户一次查询多行,而无需自连接。更详细的解释可以在这里找到。
假设,我们想要计算两个连续行(按序列排序)之间的 NUM_VAR 差异,
LAG()函数返回前一行,如果没有(即每个 ID 的第一行),PREV_NUM 被编码为 0,以计算如下所示的 NUM_DIFF 之差,

滞后的输出( )
6。将 SQL 查询与 Python 和 R 集成
将 SQL 查询集成到 Python 和 R 中的先决条件是通过 ODBC 或 JDBC 建立数据库连接。由于这超出了本博客的范围,我将不在这里讨论它,然而,关于如何(创建 ODBC 或 JDBC 连接)的更多细节可以在这里找到。
现在,假设我们已经将 Python 和 R 连接到我们的数据库,那么在 Python 中使用 query 的最直接的方法就是将它复制并粘贴为一个字符串,然后调用 pandas.read_sql(),
my_query = "SELECT * FROM CURRENT_TABLE"
sql_data = pandas.read_sql(my_query, connection)
好吧,只要我们的查询是简短的,并且没有进一步的修改,这种方法工作得很好。但是,如果我们的查询有 1000 行,或者我们需要不断地更新它,该怎么办呢?对于这些场景,我们会希望阅读。sql 文件直接导入 Python 或者 R .下面演示如何用 Python 实现一个 getSQL 函数,R 中的思路也是一样的,
这里,第一个 arg sql_query 包含一个独立的。容易维护的 sql 文件,像这样,
“ID_LIST”是我们将要放入的值的占位符字符串,可以使用下面的代码调用 getSQL()。
额外提示,SQL 中的正则表达式
尽管我并不总是在 SQL 中使用正则表达式,但它有时对于文本提取来说很方便。例如,下面的代码展示了如何使用 REGEXP_INSTR()查找和提取数字的简单示例(更多细节请参见,
我希望这篇博客对你有所帮助,完整的代码和玩具数据集可以在我的 github 中找到。😀
想要更多数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的全部访问权限。
还订阅我新创建的 YouTube 频道 【数据与 Kat 对话】
此外,请阅读本迷你系列的第 2 部分,了解更多 SQL 分析技巧。
* [## 每个数据科学家都应该知道的额外 4 个 SQL 技巧
充分利用 SQL 加快您的分析工作
towardsdatascience.com](/extra-4-sql-tricks-every-data-scientist-should-know-d3ed7cd7bc6c)*
阻止你的项目脱轨的 6 个步骤
如何撰写能够按时交付的项目计划
rossrail 是欧洲最大的基础设施项目。这是一条 73 英里长的铁路线,直通伦敦市中心。它本应在 2018 年底完工并投入运行。现在预计它将于“2021 年末”开业。这一延迟预计将导致13.5 亿亿的收入损失。

横梁。项目规划的噩梦,失控的螺旋上升…
考虑到与项目超支相关的成本,你可能会认为管理者更擅长于编写他们实际上可以坚持的计划。然而,一次又一次,时间表被打破,预算被抹杀。Stephen J. Dubner(因《魔鬼经济学》而出名)探讨了这一现象,规划谬误——过度乐观和未能从经验中学习的有害混合,导致糟糕的规划,进而导致糟糕的项目结果。
“计划谬误是一种倾向,它低估了完成一个项目所需的时间,而知道类似的项目在过去通常需要更长的时间。因此,这是对一个特定案例的乐观预测与更普遍的知识的结合,而更普遍的知识会提出不同的看法……”——罗杰·布勒教授
即使我们中的大多数人不必担心在一个主要的欧洲城市下面挖掘一条巨大的隧道的复杂性,我们也远远不能避免日常生活中的规划谬误(这就是为什么你的新花园平台仍然没有建设,靠在你房子的一侧)。
准备失败,准备失败
我现在生活中有一个大项目。
我正在完成一门数据科学的课程,一旦毕业,我将搬到一个新的城市,并试图给自己找一份闪亮的新工作。坦白地说,我不能让这个项目对我产生任何负面影响,所以我需要一个无懈可击的项目计划。
尽管我们在这篇博客中关注的是一个相对较小的单人项目,但以下几点适用于规划几乎任何范围的任何项目;与一个 30 人的团队在你的公司推出一个新产品,与一个商业伙伴一起发展一个新公司,或者,事实上,自己在你的花园里建造一个新的平台。管理这些示例项目的主要区别在于实际的实现过程中。
现在,让我们深入我们的六步计划,更好地进行项目规划!
1.定义您的项目范围
这听起来是显而易见的,但是一个真正可靠的项目定义将会为你以后省去一大堆痛苦。为了确保项目定义良好,可以使用 SMART 原则。这通常是在设定目标时部署的(例如,为了职业发展),但它在项目管理中有很多适用性。
- 特异。 深入了解你的项目的产出实际上会是什么的具体细节。“我要搬到伦敦去找份工作”不具体。“我将在伦敦 2 区租一套公寓,并在一家科技公司获得一个数据科学职位”情况开始好转。在这一点上,知道你的项目将而不是实现什么也是值得的。这将有助于防止“范围蔓延”——原始计划中没有考虑到的不可预见的项目增加(因此将导致超支)。
- **可测。你知道你的项目实际上什么时候完成吗?有没有一个可测量的条件或标准能说明这一点?
- 可分配。我们应该能够将项目任务分配给实际上有能力完成它们的人(这对于更大的项目更有意义)。稍后我们将更详细地讨论责任分配。
- 现实主义。尽管有这样一句老话:如果你用心去做,就能做任何事情,但是“用心去做”在一个项目计划中是很难解释的,所以要确保这个项目实际上是可行的。
- 有时限。有没有可能给这个项目设定一个结束日期?如果没有,那么我们会让自己很难“按时”完成…
2.列出项目需要的一切
我指的是 一切 。
虽然“搬到一个新的城市”听起来像是一个独立的“行动”,但这并不是一项简单的任务。事实上,这相当令人生畏——你甚至从哪里开始呢?我之前写了一篇博客,谈到“MECE”问题树是分解复杂分析问题的一种方式。我会在这里采取类似的方法。
如何撰写假设和进行分析,让你的老板刮目相看
towardsdatascience.com](/the-key-question-for-all-data-scientists-so-what-25139fb352c6)
让我们举一个移动城市的例子,并依次将大的、可能势不可挡的行动分解成它们的组成部分。

这个过程只花了我五分钟,但我已经把“移动城市”分解成十个更小、更易管理的任务。我们总是可以进一步推进这个过程(例如,“打包物品”可以分解到房子的不同房间,我们可能希望在不同的日子处理这些物品)。事实上,在这一点上你越细化,你的最终计划就可能越精确。
无论哪种方式,这十个子任务都是需要填充您的项目计划的项目——而不是我们开始时的高级行动。值得注意的是,每个子任务也应该符合 S.M.A.R.T .框架。
3.分配责任
不管你的项目有多大,这一步都很重要。对于我们在上面定义的每项任务,确切地决定谁:
- 将会完成这项任务
- 对完成任务负有责任
这些可能不是同一个人!
当然,你应该确保每项任务都分配给既有能力又有时间完成任务的人。如果一个人被另一个经理拉去做别的事情,那么把任务分配给这个人是没有好处的。
即使你在计划一个人的项目,你也应该完成这一步。看看你列出的所有子任务(并分配给自己)。这对你来说是一个合理的工作量吗?你能自己完成所有的任务吗?注意——如果你需要学习一些东西(例如研究一个特定的 Python 库),那么这个“学习行为”需要成为你计划中的一个单独的项目!
4.对时机要非常诚实
这是成功的项目计划的关键。接受你在第二阶段定义的单个任务,并对每个任务独立完成的时间做一个诚实的评估。
不要把整个项目的最后期限 考虑在内。这将扭曲你对每项任务的判断,并导致你低估它们需要多长时间(这是计划谬误的关键因素之一)。
5.创建关键路径
我们的项目可能会包含必须依次完成的各种任务序列,一个接一个。以我们的“移动城市”为例,这样的顺序可以是:研究居住区域->联系这些区域的房地产经纪人->安排看房->参加看房->选择公寓->支付公寓定金,等等…
当然,我们可以构建另一个序列,在城市之间转移我们的财产。注意,调查搬家公司并不一定要求我事先安排好看房。
项目的 关键路径 是总工期最长的单个序列。下面的视频展示了关键路径计算的数学(比数学更有逻辑性和横向思维!)
本练习的主要收获是:
- 关键路径精确地定义了整个项目需要多长时间
- 不在关键路径中的任务具有一定的灵活性,但会有开始和结束日期的范围,这直接取决于它们对关键路径中其他任务的依赖性
如果关键路径表明你的项目要超支了,你该怎么办?也许给你三个月完成的项目看起来要花四个月…
- 重新检查项目的范围。你想做得太多了吗?
- 增加你花在项目上的活跃天数——你能在其中加入几个周末吗?
- 增加项目的人员配备(使用项目计划草案作为您需要它的证据!)
- 作为最后的手段,试着推迟整个项目的截止日期
你当然应该而不是做的是回去减少你在第四阶段设定的时间估计。请记住,我们在设定这些估计值时是诚实的。现在就改变它们,简单地把所有事情塞进一个任意的时间框架里,就相当于在你开始之前就屈服于计划谬误。
一般来说,你也应该试着为项目建立一个“缓冲区”(计划末尾的空白空间),以便在令人沮丧的可能情况下,出现问题或花费的时间比计划的长。
甘特图可能是可视化项目任务排序的最佳方式。微软 Excel 是一个非常适合手工制作的地方,尽管有软件解决方案可以自动生成它们(如果 Python 是你的障碍,那么 Plotly 有很好的甘特图功能)。

以甘特图表示的项目计划示例。注意紫色的关键路径、职责分配和项目结束时设置的缓冲期,以防万一…
6.实际使用你的计划
你已经花时间写了一个杀手级的项目计划。用吧!
当然,一个项目计划如何实施取决于项目的规模和参与的人数。这不是深入研究scrum 和 sprint的时间和地点,但是,有一些经验法则是适用于所有领域的。
- 根据计划定期检查。根据项目的规模,可以是每天、每周或每两周一次。确保每个人都充分了解他们应该做什么,并确保这些事情确实在做。
- 保持诚实。如果你落后于计划,试着理解原因,并解决它。不要把计划藏在抽屉里,忘记它曾经存在过。
- 如果需要,更新计划。如果你低估了某些任务需要的时间,或者其他事情出了大问题,那么你需要修改计划——这没什么不好意思的。理想情况下,你可以吃掉你在第 5 阶段建立的缓冲区。然而,如果这是不可能的,你可能需要以某种方式缩小项目范围。**
感谢一路阅读到博客结尾!当然,项目管理还有许多其他方面可以帮助您的项目取得成功,但我希望这已经给了您一个良好的开端。我很想听到对上述建议的任何评论,或者这篇文章涉及的任何概念。欢迎在下方随意留言,或者通过LinkedIn联系我。**
关于数据科学,雇主不想让你知道的 6 件事
办公时间
但是你绝对应该了解他们

介绍
由于我的轶事类文章得到了大量的支持,我又写了另一篇。
这一次,我想揭示作为一名数据科学家的黑暗面。这篇文章并不是要打击你,但是像任何其他工作一样,数据科学作为一个职业也有其失败之处。我认为重要的是,你要意识到这些事情,这样当你在生活中遇到它们时,它不会像卡车一样撞上你(就像我一样!).
根据你的个性和兴趣,你可能根本不会发现这些失败,这是一件好事!也就是说,这里有 6 件关于数据科学的事情是雇主不想让你知道的。
1.一个模糊的术语,像“数据科学”,意味着模糊的责任。
你对数据科学了解得越多,你就越会意识到数据科学有多广泛。事实上,它是如此广泛,以至于有专门针对不同类型的数据科学工作的文章(数据科学家、数据分析师、决策科学家、研究科学家、应用科学家、数据工程师、数据专家……你懂的)。
此外,由于它是一个多学科领域,术语“数据科学”涵盖了各种各样的技能,很可能超出了您一生所能完善的范围。
因此,在您的数据科学之旅中,请牢记这些事情…
- 保持开放的心态,尽量不要停留在数据科学迷人的部分。例如,如果您发现自己在查询表或处理数据架构,而不是处理机器学习模型,请不要气馁。任何与数据相关的技能都是需要了解的有价值的技能,将来很可能会派上用场!
- 和第一点类似,数据科学没有固定的路径。因此,抓住任何机会,从每个机会中尽可能多的学习。你获得的经验越多,你将来的选择就越多。
- 最后,最重要的是,不要对你想做的事情设定如此严格的期望,直到你有足够的经验和知识去做。乞丐不能挑肥拣瘦!
TLDR:在数据科学之旅中保持开放的心态。这不仅仅是建造模型。
2.您使用 SQL 的次数很可能比您想象的要多得多。
刚开始职业生涯的时候,我一直认为 SQL 是只有数据分析师才会用的技能。因为我一开始就有这种心态,所以我从来没有重视过我在 SQL 方面的知识。
这绝不是你思考 SQL 的方式!
如果你从事的是与数据相关的工作,不管是不是数据科学的工作,SQL 永远不会离开你。
作为一名数据科学家,如果你想建立机器学习模型,你将需要数据,这意味着你要么必须查询你的数据,要么如果数据尚不存在,你必须建立管道。非常重要的一点是,您要很好地了解 SQL,这样您的数据才是健壮的和可伸缩的。
TLDR: SQL 永远是你最好的朋友,所以一定要花时间精通它。
3.现实世界中的数据比你想象的还要混乱。
如果你曾经在 Kaggle 上处理过数据,那么现实世界是完全不同的。在 Kaggle 上,数据通常是干净的,每个表都有描述,每个列和特性名称都相当直观。
现实世界并非如此。你不仅不可能拥有我上面列出的任何东西,而且你可能没有可靠的数据来开始。
我写了 10 篇关于的文章,我不得不处理非常混乱的数据,但只是举几个例子:
- 处理不同拼写的类别,例如美国、美国、美国、美利坚合众国
- 在逻辑受损的地方处理数据。例如,如果有记录显示某个用户卸载了同一个应用程序两次,而没有在两次卸载之间重新安装它……哎呀。
- 处理不一致的数据。例如,一个表可能告诉我,我们的月收入是 50,000 美元,但另一个具有类似信息的表可能说我们的月收入是 50,105 美元。
TLDR:你的大部分时间将用于清理你的数据。你不太可能直接进入模特行业。
4.很大一部分时间花在理解手头的业务问题上。
不管你喜不喜欢,数据科学家在很大程度上是一名业务分析师。为什么?因为你需要对你工作的领域和手头的业务问题有一个全面的了解。没有这一点,您将会错过关键的关系、假设和变量,这些可能是 65%准确模型和 95%准确模型之间的差异。
例如,如果你是营销部门的数据科学家,你必须完全了解每种类型的营销渠道,它的用途,它在营销漏斗中的位置,它通常吸引什么类型的用户,以及使用什么指标来评估给定的渠道。
举个例子,商展一般比联盟营销贵很多( CAC 的更高)。然而,从商展中获得的客户的 LTV 也更高。如果你建立了一个只关注 CAC 的模型,你可能会给出不完整的信息,导致不再通过商展进行营销。
TLDR:在投入任何模型构建之前,应该花相当一部分时间来理解业务问题和你正在工作的领域。
5.你不需要知道所有的工具,但是你知道的越多越好。
在以前的一篇文章中,我说过最好专注于几个工具并真正擅长它们。我仍然坚持这一观点,但可悲的现实是,你的雇主很可能希望你不断进步,学习更多的工具。
你应该非常了解你的基本工具。这意味着 Python、SQL 和 Git,以及包括 Pandas、NumPy、scipy、scikit-learn 等几个 Python 库…
然而,如果你的雇主抛出新工具让你尽快学习,不要感到惊讶,比如 Airflow、Hadoop、Spark、TensorFlow、Kubernetes 等等。
此外,如果你在职业生涯中换了雇主,你可能需要学习一套新的工具,因为每个公司都有自己想要的技术,所以在选择新雇主时要小心。
TLDR:学习永无止境。如果你不喜欢这种说法,数据科学可能不适合你。
6.沟通技巧是你最好的朋友。
这本书更适合那些认为成为一名数据科学家意味着你可以整天躲在房间里构建模型的人。无论任何雇主告诉你什么,即使他们说你可以全天候在家工作或作为一个团队工作,你也需要与其他利益相关者合作和交流。
即使你是一个人的团队,你也必须与高层管理人员就你正在做的工作及其带来的切实业务影响进行沟通。您可能还需要与其他团队和业务分析师合作,来构建我们之前讨论过的领域知识。
TLDR:数据科学需要比你想象的更多的交流,这对成为一名成功的数据科学家很有帮助。
感谢阅读!
通过阅读这篇文章,我希望我能够给你一些(更多)见解和有用的建议,这将有助于消除你的一些误解,并使你的数据科学之旅比我的顺利得多!
我收到了对我更有见解的数据科学文章的非常好的反馈,这就是我写这篇文章的原因。像往常一样,如果你不同意我说的任何话,请有所保留。但是如果你喜欢它,请让我知道你还想让我写些什么。
我一如既往地祝你们在数据科学之旅中一切顺利!
不确定接下来要读什么?我为你挑选了另一篇文章:
到目前为止,我在数据科学之旅中学到的见解
towardsdatascience.com](/5-things-i-wish-i-knew-when-i-started-learning-data-science-24d6f9a2d1e0)
特伦斯·申
- 如果你喜欢这个, 跟我上 Medium 了解更多
- 报名我的邮箱列表 这里 !
- 我们连线上LinkedIn
- 有兴趣合作?查看我的 网站 。
我在脸书教 R 学到的 6 件事

格雷格·布拉在 Unsplash 上的照片
在工作场所有效使用 R 的技巧
B2018 年至 2019 年间,我在脸书工作,担任数据科学家——在此期间,我参与开发和教授一个面向 R 初学者的课程。这是一个为期两天的课程,大约一个月一次,大约有 15-20 名学生参加,目标是让他们能够在日常工作中使用 R。
这篇文章分享了我在教授这些课程中学到的一些东西,重点是对学生有效的东西。希望这六个建议对任何使用 R 的人都有用,尤其是那些刚刚开始旅行的人。
但是首先,我个人学习 R 的经历
我最初是在伯克利读统计学本科时学到 R 的。在大学里,我鄙视使用 R,并把它作为完成项目和习题集的一种手段,这样我就可以毕业了。
一旦我进入职场,开始从同事那里学习 R,我对这门语言的看法开始转变。我意识到在大学里如何教授 R 有一些关键的差距——主要是我们在课堂环境中学习 R,这不能很好地转化为工作环境。
大学毕业后,我开始完全接受 R——我在脸书和 Doordash 开发过 R 包,在脸书教过 R,也参加过几次 R 会议。由于我的背景不清楚,我想分享一些技巧和建议给那些在日常生活中使用 R 的人。
注意:我是 2015 年大学毕业的,所以课程可能会有所改进,所以我的个人经历可能与最近的大学毕业生不太相关。
1.r 不仅仅是数据科学家的专利,有一个使用这种语言的理由会让学习变得更容易
在教授 R 之前,我假设我们的大部分学生都是数据科学家,希望通过将 R 引入他们的 SQL/Excel 工作流来增加他们的影响力。然而,我真的对参加这些课程的人的多样性感到惊讶。我们有软件工程师、数据科学家、数据工程师、研究人员和财务/运营人员,仅举几例。

照片由普里西拉·杜·普里兹在 Unsplash 上拍摄
对于数据科学家来说,他们参加这门课的主要原因很清楚——他们经常与数据打交道,学习 R 将为他们提供一种更有效、更灵活的数据处理方式。此外,学习 R 会更自然,因为他们有很多机会练习语言,同时对他们的工作产生直接影响。
当试图了解为什么其他一些学生报名参加该课程时,有各种各样的原因,例如:
- 希望提高数据修改和可视化能力的工程师。
- 运营和财务部门正在寻找每天/每周重复更新 Excel 的替代方案。
- 已经熟悉 R,但想在脸书大学更新知识并学习如何有效使用它的人。
在上面的三个例子中,我们看到了非数据科学家可以从学习 R 中获得价值的方法。一般来说,如果您不是数据科学家/分析师,您希望成为这两类人中的一员:
- 你已经在做一些事情了,通过学习 R,你可以做得更好/更快
- 你想做一些事情,但是如果不知道 R (或者其他一些编程语言),那将会非常困难/不可能
关于这个话题的最后一点——有时 R 并不是工作的最佳工具。例如,如果您已经知道如何使用 SQL+Excel,那么您就已经拥有了聚合、分析和可视化数据的致命工具组合。在我自己使用 R 大约 7 年之后,我经常发现自己求助于 SQL + Excel,仅仅是因为它更快,更容易共享。所以,如果你花了很多时间学习 R,不要觉得你需要把它用在所有事情上,因为有时它实际上会比你使用你已经是专家的工具花费两倍的时间。
2.蒂德维斯是国王

资料来源:tidyverse.org
什么是****?tidy verse 是专为数据科学设计的 R 包的自以为是的集合。所有的包共享一个底层的设计哲学、语法和数据结构。
tidy verse 中最流行和最有用的两个包是:

资料来源:tidyverse.org
为了使这一部分简明扼要: Tidyverse 是在 R 中聚集和修改数据的最快和最直接的方法。不仅如此,它使学习 R 变得更加有趣和容易。我第一次在没有 Tidyverse 的情况下学习 R,这是一次悲惨的经历,其他以类似方式学习 R 的人分享了我的观点。Tidyverse 在 R 用户中变得如此普遍,以至于我不建议学习/教授没有它的 R。
如果你从未使用过 Tidyverse,它的设置非常简单,我强烈建议你开始使用它(网上有很多资源可以学习)
# This is all you need to install tidyverse:install.pacakges('tidyverse')
library(tidyverse)
注: 我在本文后面引用了一些软件包,如果你曾经需要安装一个新的软件包,你可以使用上面的函数来这样做。安装后,使用library()将其加载到 R 中
3.备忘单,备忘单,备忘单
这与前一个主题非常吻合,因为 Tidyverse 独特的语法和长长的函数列表让学习 tidy verse 的人望而生畏。幸运的是,RStudio 团队已经创建了一堆备忘单。对于我们的面授课程,我们会确保为所有学生打印备忘单,这样他们就不必不停地切换标签来搜索功能。如果你可以的话,我强烈推荐你打印和层压你自己的小抄供个人使用。即使已经使用这种语言超过 5 年,我仍然会参考我的小抄。
该网站包含 RStudio 团队发布的清单。这里的一些主题更高级,但我想说下面是两个入门的基本备忘单:

来源:https://rstudio.com/resources/cheatsheets/

来源:https://rstudio.com/resources/cheatsheets/
4.通过使用内部数据集进行学习
在上课的第一个小时内,我们让学生将内部数据库中的数据查询到 r 中。在脸书,这就像使用我们的内部软件包并编写以下代码一样简单:
df <- presto("SELECT * from example_table limit 10000")
我建议使用内部数据集学习有两个主要原因:
- 能够直接在简历中查询内部数据增强了你使用公司数据的能力。如果您不能将内部数据直接查询到 R 中,您必须采取某种变通办法,例如将数据导出到 csv 文件中,然后将其读入 R 中。这浪费了大量时间,因此我会尽可能早地熟悉如何将数据直接导入 R 中,即使这意味着额外的一两个小时的初始设置/获得正确的权限。
- ****公司的数据是其最有价值的资源之一。如果你在脸书工作,那么你应该利用你拥有世界上最丰富、最有趣的数据集这一事实。这同样适用于任何其他公司——优步的乘车数据,Airbnb 的预订数据,Medium 的商品数据。许多在线资源会让你使用通用数据集,所以我会尝试采取额外的步骤,在可能的情况下引入关键的公司数据集来帮助你学习。通过这样做,你已经有了将 R 放松到你的工作流程中的想法。
5.导入和导出数据的重要性
R 是分析数据的一个很好的工具,但是如果你不能把数据输入或输出 R,那就真的是一个很大的问题。前一节稍微提到了这一点,所以这一节更实用,回顾了一些将不同类型的数据输入/输出 r 的主要方法。
通过关注这些方法,你应该能够几乎 100%地导入/导出必要的东西。当然,还有一个备忘单,你可能会发现对这很有帮助:

来源:https://rstudio.com/resources/cheatsheets/
用于导入数据:
- Csv:
read_csv()(Tidyverse) - Excel:
read_excel()(Tidyverse) - Google Sheets: 与上面类似,但是对于私有工作表可能需要额外的步骤。你想用谷歌工作表的软件包。最坏的情况是,你将谷歌表单导出为 csv 格式,并使用
read_csv()读取 - ****内部数据库:使用 SQL 将数据直接导入 r。您需要咨询您的数据团队,看看是否有内部包来完成这项工作。在脸书,
presto("SELECT * FROM tbl")是你从表格中抓取数据所需要的全部。在较小的公司,将 R 连接到内部数据库可能需要一些额外的步骤,但是至少建立 ODBC 连接应该可以让你获取数据。
用于导出数据:
- 复制到剪贴板:
clipr包中的write_clip()将数据帧直接复制到您的剪贴板中。如果你的公司使用 Google Sheets,这是获取数据的最快方式,所以这是你可以学习的最有用的功能之一。本质上,它减少了从Export df to csv -> Open csv and copy contents -> Paste into Sheets到Copy df to clipboard -> Paste into Sheets的步骤 - 复制一个 plot/graph: 当你在 R 中做了一个 graph,最简单的分享出来的方法就是复制/粘贴。简单地放大一个图,使它进入自己的窗口,你可以右键单击并复制图像。
- ****直接从 R 截图:如果你想更非正式地分享出一张小桌子(即 Slack),给你的 R 主机截图大概是最好的选择。如果你想变得更有趣,你可以使用
knitr包中的kable()功能来清理你的桌子,以便更容易阅读。
# Format the iris table to be a little neateriris %>% head %>% kable

这就是结果
- 写入 CSV:
- ****写入内部数据库:这通常比从内部数据库读取要复杂得多,但是如果您认为您会经常这样做,那么肯定会与您的数据团队讨论。
6.保持简单,专注于基础
你可以用 R 做很多事情,一开始可能会有点不知所措。例如,仅在备忘单链接中,您就已经看到了 R 能够处理的如此多的主题/包,甚至这还只是皮毛。不要被这个暗示。
我们发现专注于基本面是学习 R 的最好方法:
- 如何导入数据
- 用
dplyr修改数据进行分析 - 使用
ggplot2创建可视化效果 - 导出结果以与您的队友共享
如果你能做好这些,那么你就有了用 r 做很多事情的坚实基础。
结束语
我想写这篇文章是因为我喜欢在脸书教授 R 课程,并且认为我作为一名教师的独特经历可以对那些没有机会接触这类课程或者正在寻找在自己的工作中更有效地使用 R 的建议的人有所帮助。
掌握 K-均值聚类需要知道的 6 件事
了解最流行的聚类方法之一

亚历山大·安德鲁斯在 Unsplash 上拍摄的照片
市场上有多少种类型的客户?NBA 有多少种类型的球员?常春藤盟校有多少种学生?
现实生活中有很多这样的问题——这些问题试图理解特定环境中的人(以及物体)的类型。通过了解我们对什么类型的人感兴趣,我们可以制定相应的策略来满足我们的特殊需求。
例如,我们假设市场研究发现市场上有两种类型的客户——一种对价格上涨更敏感,另一种对价格上涨不太敏感。通过研究你产品的顾客,你可以决定是否要提高产品价格来弥补增加的成本。假设你的大多数顾客对价格敏感,那么如果你决定提价,你应该更加小心潜在的销售下降。
这只是一个说明聚类分析实际应用的小例子。这是来自维基百科页面的聚类定义。
聚类分析或聚类是对一组对象进行分组的任务,使同一组中的对象(称为聚类)比其他组(聚类)中的对象彼此更加相似(在某种意义上)。
与上面给出的例子相关,为你的产品识别客户类型的过程是进行聚类分析。需要注意的是,聚类方法有很多种,最常用的一种叫做 K-means 聚类。在本文中,我将回顾 K-means 的一些关键方面,并希望您对这种流行的聚类方法有更好的理解。
在我们开始研究 K-means 之前,下图直观地向您展示了一个常见的 K-means 如何通过多次迭代来达到最终的聚类结果。

来自 K-means 维基百科(由 Chire 创作,授权: CC BY-SA 4.0 )
1.K-means 是基于原型的。
第一个问题是我们如何确定聚类,或者我们如何确定一个特定的样本应该被分配到哪个聚类。有几种可用的聚类方法,包括基于连接性的(即分层的)、基于网格的、基于分布的、基于密度的和基于原型的。其中 K-means 聚类属于基于原型的范畴。
为了概念化基于原型的聚类方法,您可以认为对于每个聚类,都有一个原型数据点,它表示特定聚类的典型成员应该是什么样子。应该注意的是,原型数据点是从属于该聚类的数据点估计的,并且不必是原始数据集的实际情况。
然而,一些算法要求原型数据点必须是实际的数据点,这被称为 K-medoid 聚类。在大多数涉及连续特征的应用中,K 均值指的是使用质心作为原型数据点。
2.聚类分配和迭代
使用如上所示的动画图像作为例子,假设我们已经为聚类选择了三个质心作为初始种子。我们如何确定应该将样本分配给哪个组?
要指定一个数据点,我们需要计算该数据点和我们刚才选择的每个质心之间的距离。距离被认为是数据点之间的相似性-数据点与质心之间越接近越相似。最常用的度量是平方欧几里德距离(sed),如上所示。如果考虑一个二维特征,它基本上是我们最熟悉的笛卡尔平面上两个数据点之间的距离。

截图来自维基百科
通过计算这些距离,我们能够将数据点分配给产生最小 SED 的聚类。一旦分配了每个数据点,我们就能够为我们的聚类获得更新的质心,并计算每个聚类中所有适用 SED 的误差平方和(SSE)。如果你熟悉机器学习的术语。您可以将类内 SSE 视为 K 均值聚类试图最小化的成本函数的输出,这使得 K 均值或多或少成为一个优化问题。
在下一次迭代中,我们将数据点分配给更新后的质心,并再次计算 SSE 以查看它是否减少。直到没有进一步的改进(上证指数已经变得足够小和稳定),我们可以得出结论,K 均值聚类已经完成。
3.您必须事先指定聚类的数量。
当我们运行 K-means 聚类分析时,我们必须指定聚类的数量,先验。这有时被认为是 K-means 方法的一个缺点,因为对于某些数据集,我们不知道有多少个聚类是合理的。毕竟,我们没有关于我们的数据点所属的聚类的基本事实,否则,如果我们有,它就变成了一个监督学习任务。
如果我们只处理 2 维或 3 维数据,我们可以将数据可视化,以获得一些关于聚类数量的假设。然而,对于更高的维度,以人类可理解的方式可视化数据是不太可能的。因此,您最好使用相关的背景内容专业知识,并对您的数据的大概聚类数进行有根据的猜测。以此为起点,看看您的集群效果如何。
但是突出的问题是 当我们有不同数量的聚类时,我们如何评估哪一个聚类性能比其他的好。
4.聚类评估和肘方法
我们已经在第 2 节中讨论了使用 SED 的数据点聚类分配和使用 SSE 的迭代优化。在迭代结束时,我们得到了一个 SSE 最少的模型(所有成员的特定集群分配)。
通过改变同一数据集的每次聚类分析的聚类数,我们可以得出每个模型的 SSE 值。有了这些数据,我们可以绘制一个线图,作为聚类数和 SSE 值的函数,后者通常被称为失真。下面显示了一个假设聚类模型的简单示例。

肘法(作者自创)
如图所示,当簇数为 3 时,有一个急转弯。这意味着除了这三种聚类方法之外,我们的聚类性能没有任何有意义的提高(没有多少降低)。因此,说 3 是一个很好的聚类数是有意义的。
请注意,除了肘方法,我们还可以使用侧影图来评估不同聚类数的模型之间的性能。如果你感兴趣,这里有一篇关于这个话题的极好的中型文章。
5.你需要标准化你的数据点。
当 K-means 聚类有多个特征时,这些特征的初始数据集可能有不同的尺度。例如,让我们说一个尺度是以米为单位测量的学生身高,另一个尺度是以千克为单位测量的体重。正如您所料,这些尺度的方差绝对值可能会非常不同。
对于身高,方差可能在小数值水平,然而,体重可以有大得多的方差。当我们的 K-means 聚类迭代优化模型时,它会尽最大努力更多地依赖于减少权重贡献的 SSE。看到问题了吗?通过或多或少地忽略来自高度尺度的贡献,优化将走捷径。
解决方案是,我们应该通过将单个尺度带到相同或相似的范围水平来标准化数据点。通常,我们可以运行 Z 分数归一化,并对每个要素使用标准化的 Z 分数。或者,您也可以运行最小-最大缩放。请注意,这两种方法的性能将取决于数据集,并且没有关于哪一种方法一定比另一种方法更好的固定规则。
6.初始化很重要
当我们运行 K-means 聚类分析时,我们从随机选取的质心开始。通过多次迭代,我们将能够得到一个 SSE 达到最小值的模型——这个最小值可能与随机选取的初始质心直接相关。如前所述,质心迭代更新,每次迭代都建立在前一次迭代的结果上。
因此,我们将得到的最终模型将与第一次迭代之前选取的质心相关。换句话说,质心的初始化直接影响我们得到的最终模型。
因此,在实践中,例如,在 scikit-learn 实现中,我们通常多次运行 K-means 聚类分析,并在这些模型中挑选最佳表现者。虽然我们可以随机选择初始质心,但更好的方法是使用所谓的 K-means++初始化方法。简而言之,K-mean++不是随机选择质心,而是一种使用概率分布来挑选初始质心的算法,这提高了 K-means 聚类的性能。
顺便提一下,在 scikit-learn K-means 实现中,默认的初始化方法是 K-means++方法,所以我们不需要担心初始质心的选择。
结论
总之,本文回顾了进行 K-means 聚类分析的一些关键方面。下面是一个典型的 K 均值聚类分析步骤的快速概述。
- 使用 K-means++初始化方法选取初始质心,其数量与指定的聚类数匹配(请注意,我们可以使用 elbow 方法来确定特定数据集的聚类数)
- 使用平方欧几里得距离(SED)将数据集的每个数据点分配到最近的质心
- 用每个簇中的所有成员更新质心
- 通过最小化组内误差平方和(SSE)重复前两步
- 在指定的迭代次数之后,或者模型没有更好的改进(例如,SSE 中的变化),我们得到了最终的模型
寻找新数据科学项目的 6 个技巧
当你陷入困境时的想法

由 Unsplash 上的absolute vision拍摄
如今很难找到新的项目创意,灵感也不总是在我们需要的时候出现。你可能会发现自己盯着天花板,等待一个新的想法出现在你的脑海里。然而,它可能永远不会到来。想法和灵感对每个人来说都不容易,对于数据科学家来说,问题也不例外。
当开始一个新项目时,大多数数据科学家都想尝试一些从未听说过的东西,甚至可能是革命性的东西。他们可能会想到这个疯狂的、开箱即用的项目,但一旦他们开始研究它,他们会发现以前有人做过,甚至可能比他们想象的还要好。
很多时候,似乎所有好的项目想法都被采纳了。也许你应该在此期间求助于 Kaggle 数据挑战?您可以利用这一实践来磨练您刚刚从在线课程中学到的新数据科学工具和技能。但通常这些挑战已经为你准备了很多东西,你可能想自己收集数据。所以你要回到起点。
寻找灵感
新思想不能被制造或强迫。也许通过一场激烈的头脑风暴,你会找到灵感,但通常灵感来自最不可能的地方,最不可能的时间。以下是一些帮助你的大脑思考新的数据科学项目想法的提示:

詹姆斯·庞德在 Unsplash 上拍摄的照片
提示 1:考虑小问题
不要把问题当成新项目。是的,一个新项目是你需要做的事情,但是不要让它成为你的主要焦点。相反,把你的注意力集中在你日常生活中遇到的一些问题上。你在浏览互联网时有哪些小的不便?也许可以写一个程序来解决这个问题。你希望你能自动化你每天做的一个简单的任务吗?写一个程序来实现这一点。
不要让你的注意力集中在改变整个世界上,而是集中在更小的事情上,让你自己的世界变得更好。

秘诀 2:不要限制自己
数据科学是一个广泛的学科,可以应用于多个不同的学科和行业。也许你是那种关注科技世界的人,因为这是你所知道的。这种关注的一个潜在问题是,现在你只能想到与技术相关的问题。这可能是一个问题,因为你现在过于狭隘地专注于一个主题。
将你的关注点转向更广泛的话题和行业。也许其他行业也需要你的帮助。有时候,他们需要的只是一个不在现场的人的新观点。当你扩展你的关注点时,你会变得对这些主题的其他观点更加开放。你可能会解决一个新的问题,这个问题是你以前过于专注时从未遇到过的。

约翰·施诺布里奇在 Unsplash 上的照片
技巧 3:询问他人
朋友、家人和熟人可能是一大资源。询问他们的想法,因为他们会有完全不同的观点。每个人都有自己独特的障碍,与你的不同。您可以用您的数据科学技能帮助他们克服这些障碍。
他们也可以帮助你头脑风暴出新的想法。人多力量大,独自做事并不是寻找灵感的最佳方式。

Artem Beliaikin 在 Unsplash 上拍摄的照片
秘诀 4:退后一步,继续你的一天
有时候你只需要退后一步,把项目搁置起来。做好你的一天,也许你会想到一个主意。假装你没有项目要做,也许你会想到一个项目的主意。去看一部新的电视节目或电影。也许你的新项目想法隐藏在一些随机的节目或互联网视频中。
也许拖延这个项目正是你需要做的。然而,你应该注意不要拖延太久。给自己一个足够长的休息时间,让你的大脑重新定位,然后也许一个新的想法就会出现。

克里斯蒂安·威迪格在 Unsplash 上拍摄的照片
技巧 5:搜索互联网
也许为一个项目寻找新想法的最简单的方法之一就是在网上浏览多个不同的论坛。谷歌是你的朋友。只需搜索“ ”数据科学项目创意 ”,多个结果和创意展现在你面前。
这种方法的唯一问题是,这些项目中的大多数可能不会引起你的兴趣。另一个问题是,他们也缺乏原创性,因为有许多其他数据科学家已经做了和正在做同样的项目。如果你采取这种方法,你将很难从人群中脱颖而出。

米格尔·安德拉德在 Unsplash 上的照片
技巧 6:增加普通项目的趣味
寻找那些简单或常见的数据科学项目,并使它们变得更复杂。采用项目中的提示,并在其中添加一些内容。收集原始数据,而不是通过抓取其他网站来使用提供的数据集。在提示中添加另一个问题,这可能会使您不得不改变整个项目方法。基本上是让事情变得更难,让自己与众不同。
即使你可能会使用一个其他人已经有过的项目想法,你也会通过改变一些东西来使它变得独一无二。在对最初的项目想法做了足够多的改变后,你甚至可能最终得到一个完全不同的项目。
开始您的项目
一旦你找到了你的项目想法,那么你就可以开始开发你的数据科学项目。为这个项目提出一个想法是一个困难的方面,但它不是这个过程的唯一部分。展望未来,你将不得不考虑你完成这个项目的方法。你将从哪里获得数据?需要如何处理?诸如此类的问题会在项目开发过程中出现。但这些问题是好的,这意味着你作为一名数据科学家,正在自己的发展中取得进步。
当您继续进行未来的数据科学项目时,我们希望您会发现这些提示对您探索数据科学项目想法很有用!
可解释主题模型的 6 个技巧
关于调整 LDA 主题模型以获得易于理解的输出的 Python 实践教程。
随着如此多的文本在数字平台上输出,自动理解关键主题趋势的能力可以揭示巨大的洞察力。例如,企业可以从了解客户围绕其品牌和产品的对话趋势中受益。提取关键主题的一种常用方法是潜在狄利克雷分配(LDA)。然而,输出通常很难解释为有用的见解。我们将探索提高可解释性的技术。
什么是潜在狄利克雷分配(LDA)?
潜在狄利克雷分配(LDA)是一种生成统计模型,有助于在不同数据部分的集合中提取相似性。在主题建模中,每个数据部分是一个 word 文档(例如产品页面上的单个评论),文档集合是一个语料库(例如产品页面上的所有用户评论)。重复出现的相似单词集合可能指示主题。
LDA 假设每个文档由固定数量的主题分布表示,每个主题是单词分布。
近似这些分布的算法的高级关键步骤:
- 用户选择 K,即当前主题的数量,调整到适合每个数据集。
- 浏览每份文件,并随机将每个单词分配到 K 个主题中的一个。由此,我们有了计算主题 p 的文档分布(主题 t |文档 d) 、文档 d 中分配给主题 t 的单词的比例的起点。我们还可以计算单词 p 的主题分布(单词 w |主题 t) 、单词 w 在分配给主题 t 的所有文档单词中的比例。由于随机性,这些将是较差的近似。
- 为了提高近似性,我们遍历每个文档。对于每个文档,浏览每个单词并重新分配一个新主题,其中我们根据上一轮的分布以概率 p(主题 t |文档 d)÷p(单词 w |主题 t) 选择主题 t。这本质上就是题目 t 生成单词 w 的概率。从这些新作业中重新计算 p(题目 t |文档 d)和 p(单词 w |题目 t)。
- 不断迭代,直到主题/单词分配达到稳定状态,不再有太大变化,(即收敛)。使用最终分配来估计每个文档的主题混合(该文档中分配给每个主题的单词的百分比)和与每个主题相关的单词(该单词分配给每个主题的总次数)。
数据准备
我们将探索在亚马逊 Office 产品评论上使用 LDA 优化可解释性的技术。为了准备评论数据,我们使用典型的文本清理步骤来清理评论文本:
- 删除非 ascii 字符,例如à∅
- 将单词转换为最基本的形式,如“running”和“ran”到“run ”,以便它们被识别为同一个单词
- 删除标点符号
- 删除非英语注释(如果有)
教程中的所有代码都可以在这里找到,这里清理的函数位于 clean_text.py,整个过程的主笔记本是 topic_model.ipynb 。
优化可解释性的步骤
提示 1:通过 n 元语法识别短语,过滤名词型结构
我们想要识别短语,以便主题模型能够识别它们。二元词是包含两个词的短语,例如“社交媒体”。同样,三元组是包含 3 个单词的短语,例如“Proctor and Gamble”。有很多方法可以检测 n-gram,这里解释这里。在本例中,我们将使用点态互信息(PMI)得分。这衡量了单词比独立出现时更有可能同时出现。该度量对罕见的单词组合敏感,因此它与出现频率过滤器一起使用,以确保短语相关性。下面的二元模型示例(三元模型代码包含在 Jupyter 笔记本中):
**# Example for detecting bigrams** bigram_measures = nltk.collocations.BigramAssocMeasures()finder =nltk.collocations.BigramCollocationFinder\
.from_documents([comment.split() for comment in\ clean_reviews.reviewText])**# Filter only those that occur at least 50 times** finder.apply_freq_filter(50)
bigram_scores = finder.score_ngrams(bigram_measures.pmi)
此外,我们过滤带有名词结构的二元或三元模型。这有助于 LDA 模型更好地聚类主题,因为名词是正在谈论的主题的更好指示符。我们使用 NLTK 包来标记词性并过滤这些结构。
***# Example filter for noun-type structures bigrams* def** bigram_filter(bigram):
tag = nltk.pos_tag(bigram)
**if** tag[0][1] not in ['JJ', 'NN'] and tag[1][1] not in ['NN']:
return False
**if** bigram[0] in stop_word_list or bigram[1] in stop_word_list:
return False
**if** 'n' in bigram or 't' in bigram:
return False
**if** 'PRON' in bigram:
return False
**return** True***# Can eyeball list and choose PMI threshold where n-grams stop making sense
# In this case, get top 500 bigrams/trigrams with highest PMI score*** filtered_bigram = bigram_pmi[bigram_pmi.apply(lambda bigram:\ bigram_filter(bigram['bigram'])\
and bigram.pmi > 5, axis = 1)][:500]bigrams = [' '.join(x) for x in filtered_bigram.bigram.values\
if len(x[0]) > 2 or len(x[1]) > 2]
最后,我们将这些短语连接成一个单词。
**def** replace_ngram(x):
**for** gram **in** bigrams:
x = x.replace(gram, '_'.join(gram.split()))
**for** gram **in** trigrams:
x = x.replace(gram, '_'.join(gram.split()))
**return** xreviews_w_ngrams = clean_reviews.copy()
reviews_w_ngrams.reviewText = reviews_w_ngrams.reviewText\
.map(lambda x: replace_ngram(x))
提示 2:过滤名词的剩余单词
在“商店很好”这个句子中,我们知道这个句子是在说“商店”。句子中的其他单词提供了关于主题(“商店”)本身的更多上下文和解释。因此,对名词进行过滤可以提取出对主题模型更具解释力的单词。另一种方法是过滤名词 和动词 。
**# Tokenize reviews + remove stop words + remove names + remove words with less than 2 characters**
reviews_w_ngrams = reviews_w_ngrams.reviewText.map(lambda x: [word for word in x.split()\
if word not in stop_word_list\
and word not in english_names\
and len(word) > 2])**# Filter for only nouns
def** noun_only(x):
pos_comment = nltk.pos_tag(x)
filtered =[word[0] for word in pos_comment if word[1] in ['NN']]
**return** filteredfinal_reviews = reviews_w_ngrams.map(noun_only)
提示#3:通过连贯性测量优化主题数量的选择
LDA 要求指定主题的数量。我们可以通过优化预测似然性、困惑度和一致性等指标来调整这一点。许多文献表明,最大化一个被命名为Cv【1】的一致性度量,会导致更好的人类可解释性。我们可以测试许多主题并评估 Cv 衡量标准:
coherence = []
for k in range(5,25):
print('Round: '+str(k))
Lda = gensim.models.ldamodel.LdaModel
ldamodel = Lda(doc_term_matrix, num_topics=k, \
id2word = dictionary, passes=40,\
iterations=200, chunksize = 10000, eval_every = None)
cm = gensim.models.coherencemodel.CoherenceModel(\
model=ldamodel, texts=final_reviews,\
dictionary=dictionary, coherence='c_v')
coherence.append((k,cm.get_coherence()))
绘制此显示:

在 15 个主题后,改善停止。Cv 最高的地方并不总是最好的,所以我们可以尝试多个来找到最好的结果。我们在这里尝试了 15 和 23,23 产生了更清晰的结果。添加主题有助于揭示更多的子主题。尽管如此,如果相同的单词开始出现在多个主题中,那么主题的数量就太多了。
提示#4:调整 LDA 超参数
Lda2 = gensim.models.ldamodel.LdaModel
ldamodel2 = Lda(doc_term_matrix, num_topics=23, id2word = dictionary, passes=40,iterations=200, chunksize = 10000, eval_every = None, random_state=0)
如果您的主题仍然没有意义,尝试增加遍数和迭代次数,同时将 chunksize 增加到您的内存可以处理的范围。
**chunksize**是每次训练要加载到内存中的文档数。**passes** 是通过整个语料库的训练迭代次数。**iterations**是每个文档达到收敛的最大迭代次数——限制这意味着一些文档可能无法及时收敛。如果训练语料有 200 个文档,**chunksize** 为 100,**passes**为 2,**iterations**为 10,算法经过这几轮:
第一轮:文件 0–99
第二轮:文件 100–199
第三轮:文件 0–99
第四轮:文件 100–199
每一轮将迭代每个文档的概率分布分配最多 10 次,如果已经达到收敛,则在 10 次之前移动到下一个文档。这基本上是前面解释的算法的关键步骤 2-4,重复**passes**的数量,而步骤 3 重复 10 **iterations**或更少。
在每个**chunksize**和每个**passes**之后,更新整个语料库的主题分布。增加**chunksize**到你的内存可以处理的程度将会提高速度,因为主题分布更新是昂贵的。然而,增加**chunksize**需要增加**passes**的数量,以确保足够的语料库主题分布更新,特别是在小语料库中。**iterations**还需要足够高,以确保大量文档在继续前进之前达到收敛。当主题仍然没有意义时,我们可以尝试增加这些参数,但是日志记录也可以帮助调试:
import logging
logging.basicConfig(filename='gensim.log',
format="%(asctime)s:%(levelname)s:%(message)s",
level=logging.INFO)
在日志中查找如下所示的行,它将重复您设置的**passes**的数量:
2020-07-21 06:44:16,300 - gensim.models.ldamodel - DEBUG - 100/35600 documents converged within 200 iterations
在**passes**结束时,大部分文档应该已经收敛了。如果没有,增加**passes**和**iterations**。
提示 5:使用 pyLDAvis 可视化主题关系

Python 中的 pyLDAvis 包给出了两条重要的信息。圆圈代表每个主题。圆圈之间的距离显示了主题的关联性。这些通过对每个主题的概率分布之间的距离进行降维(PCA/t-sne)映射到 2D 空间。这表明我们的模型是否开发了不同的主题。我们希望调整模型参数和主题数量,以最小化圆圈重叠。
主题距离也显示了主题的相关程度。专题 1、2、13 讨论电子产品(打印机、扫描仪、电话/传真)。象限 3 中的主题如 6、14、19 是关于办公文具(包装材料、便利贴、文件管理器)。此外,圆圈大小代表主题流行度。例如,主题 1 构成了文档中被谈论的主题的最大部分,构成了标记的 17.1%。
提示#6:调整相关性分数,以优先考虑更专属于某个主题的术语
代表给定主题的单词可以排名较高,因为它们在语料库中是全局频繁的。相关性分数有助于优先考虑更专门属于给定主题的术语,使主题更加明显。术语 w 与主题 k 的相关性被定义为:

其中,ϕ_kw 是单词 w 在主题 k 中的概率,ϕ_kw/p_kw 是术语在主题中的概率相对于其在整个语料库中的边际概率的提升(这有助于丢弃全局频繁出现的术语)。λ越低,第二项(ϕ_kw/p_kw)越重要,第二项越重要,主题排他性越重要。为此我们可以再次使用 pyLDAvis。例如,当将λ降低到 0.6 时,我们可以看到主题 13 对与电话主题更相关的术语进行了排序。

调整λ以获得最有意义的结果,并应用最佳λ值以获得输出:
all_topics = {}
lambd = 0.6 ***# Adjust this accordingly***
**for** i **in** range(1,22): ***#Adjust number of topics in final model***
topic = topic_data.topic_info[topic_data.topic_info\
.Category == 'Topic'+str(i)]
topic['relevance'] = topic['loglift']*(1-lambd)\
+topic['logprob']*lambd
all_topics['Topic '+str(i)] = topic.sort_values(by='relevance\
, ascending=False).Term[:10].values
决赛成绩

从这里,我们可以围绕这些主题关键词进一步分析情感(例如,搜索相关的形容词或评论星级)。在业务应用程序中,这提供了对客户认为重要的主题的洞察,以及他们对此的感受。这使得有针对性的产品开发和客户体验的改善成为可能。这个例子包含了各种各样的产品,但是每个产品的单独主题模型可能揭示了客户关心的方面。例如,这一分析已经开始揭示计算器(主题 21)的重要方面,如显示器、易按按钮、电池、重量。然后,销售者需要确保在他们的产品描述中突出这些特征,或者提高这些方面的竞争力。
来源:
[1]迈克尔·罗德尔、安德里亚斯都、亚历山大·欣内堡、 探索话题连贯的空间措施)
[2]卡森·西维尔,肯尼斯·e·雪莉,LDAvis: 一种可视化和解释主题的方法
DS/ML Gods 无需尝试即可提高精确度的 6 种方法
通过使用这些简单的技巧,轻松提高你的准确度!

(手 src =http://www.pngplay.com/image/18115
介绍
机器学习是一个复杂多样的话题,对于新的数据科学家来说,这肯定会令人望而生畏。通常很难让你的模型达到令人满意的 98%的精确度,初学者肯定会努力让他们的模型更精确。幸运的是,对于大多数数据科学家来说,您可以做大量的事情来潜在地缓解这样的问题,因此,有时找到高精度的方法更多地涉及到找出您的模型需要什么样的数据。
№1:特征缩放
使用连续模型时,提高精度的最简单、最有效的方法之一是缩放模型的要素。存在几种不同类型的特征缩放器,其中一些甚至可能对机器学习没有好处。这些标量中最重要的很可能是标准标量。标准缩放器、z 分数缩放器或正态缩放器使用正态分布来归一化数据。这提高了准确性,因为偏离正常影响的数字与正常情况相比减少了。这样做的好处是你不会丢失数据,但它对你的准确性仍然很有价值。还有另外两个可以用在机器学习中,均值归一化和单位长度缩放。然而,这些通常不会被很好地使用,在大多数情况下,你最好使用标准的定标器。
为了计算正态分布,我们将取一组数字中的每个数字,在除以标准偏差之前减去平均值。在代码中,它看起来有点像这样:
using Lathe.stats: mean, std
array = [5,10,15,20]
q = std(array)
mu = mean(array)
[i = (i-mu) / q for i in array]
我们会得到一些类似这样的数字:

假设这个数组的平均值是 13.5 是安全的,所以 13.5 实际上在我们的正态分布上等于 0。然而,这有点误导,因为如果我们的数据中有 13.5,它将移动分布中的零。
你可能遇到的另一个缩放器是均值规格化器。为了根据平均值对数据进行标准化,我们用平均值减去每个样本,然后用最小值减去最大值。在代码中,这看起来像这样:
avg = mean(array)
a = minimum(array)
b = maximum(array)
[i = (i-avg) / (b-a) for i in array]
请注意结果中的细微差异:

№2:移除异常值
另一个令人难以置信的简单且令人惊讶的提高模型准确性的方法是去除数据中的异常值。从数据中移除异常值有多种方法,其中一种很好的方法是使用 z 值。另一种方法是去掉数据中第三个四分位数以上的值。我们这样做的原因是,这些值当然会影响我们对数据的数学表示,如均值或标准差。这几乎肯定会导致模型(很可能根据平均值和标准偏差等值工作)根据您的杂散数据预测低或高。
从这类数据中移除异常值的最简单方法是用平均值替换任何有问题的值。首先,我们将获得第三个四分位数的数据。或者,你可以得到高于平均值的所有数据的平均值。
对于这个例子,我们将切换到 Python。在本文中,我将同时使用这两种语言,因为它们非常相似,同时使用这两种语言将使双方的开发人员更容易理解。考虑以下数据帧:

如果我们要为这些数据拟合一个模型,那么无论我们决定为我们的功能使用哪一列,都会有一些非常激进的异常值,这肯定会在将来给我们带来一些问题。为了删除它们,我们将从 scipy.stats 中获取 z_score,并使用条件掩码来过滤不符合条件的值,以从根本上抑制高于正态分布中心的值:
from scipy import stats
import numpy as np
z_scores = stats.zscore(df)abs_z_scores = np.abs(z_scores)
filtered_entries = (abs_z_scores < 2).all(axis=1)
new_df = df[filtered_entries]
现在如果我们显示 new_df,我们可以看到我们的异常值消失了!

№3:移除不良特征
通过修改数据来轻松提高精度的另一个好方法是移除不良要素。这太常见了—您有正确的模型,但没有正确的数据。尽管很多时候一些特性看起来很重要,但它们未必如此。经常有一些功能可能根本不会提高你的分数,事实上,它们甚至会使你的准确度更差。所以不好的功能肯定是要小心的!
但是你如何避免它们呢?
避免在模型中使用不良特征的最佳方法是使用统计测试来衡量该特征对目标的统计显著性。另一个很好的方法是获取特性的重要性,这在某些情况下可能有点困难,但是如果不是,这肯定比统计测试简单得多。
№4:一个热编码器->顺序编码器
使用分类变量进行机器学习的最广泛使用的预处理方法之一可能是 one hot 编码器。one hot coder 获取您的数据,并将其转换为给定列中所有类别的真或假二进制批处理。one hot encoder 非常有用,因为它能够将分类特征转化为数字数据,便于数学算法进行分析。
虽然一个热编码很好,但在很多情况下,顺序编码器会给你更好的准确性。顺序编码本质上涉及到将唯一的标签映射到整数值。另一个可能有用的编码器是标签编码器。
№5:特征工程
解决这类问题的一个更困难的方法是特征工程。特征工程允许您从可用的特征中创建新的特征,以获得更高的精度。虽然特性工程有时可能很难做到,但它肯定可以在很多时候创造出很高的准确性,如果特性很重要,从长远来看,它肯定是一项有益的投资。
№6:集成算法
我认为在这个领域有一点被稍微低估了,那就是样本提升和引导汇总的能力。这可能是数据科学家提高准确性的最常见方式之一。
Bootstrap aggregating 也称为 bagging,是一种集成元算法。使用 bootstrap aggregating 的一个好处是,它还减少了数据的方差,从而大大减少了像过度拟合这样的偏差问题。另一方面,Boosting 通常涉及使用许多模型来一起解决一个问题。它还可以减少方差,并有助于减少偏差和防止过度拟合。
结论
虽然数据科学肯定是一门很难的学科,随着你继续从事它,你将需要学习越来越多的东西,但你可以做一些相当简单和容易的事情来使你的模型更好,并创建更好的算法。这些不仅难以置信的简单,而且很多可以提高你 10%以上的准确率。不用说,使用这些方法当然是一个伟大的想法!
让您的数据科学项目脱颖而出的 6 种方法
提高您的数据科学项目并获得关注的简单步骤
全球新冠肺炎疫情让许多人有大量的时间来处理他们的数据科学项目组合。每个人都在申请工作,你如何确保你的工作脱颖而出?请继续阅读,寻找答案。
1.使用更多独特的数据

兰迪·法特在 Unsplash 上的照片
Iris,Galton,Titanic,Northwind Traders,Superstore,Go 数据仓库。当您在学校学习数据科学时,您无疑会遇到至少一个这样的数据集。这是有原因的,它们有助于演示诸如聚类、回归、逻辑回归、数据库结构、数据可视化或构建报告等概念。每个数据集都很干净,很小,但这并不是它们所有的共同点:每个人都使用过这些数据集。没有新的或令人兴奋的项目建立在训练数据集上。没有招聘人员会看着你的泰坦尼克号项目(Kaggle 上最受欢迎的数据集之一)说,我们的团队需要这个人。
没有新的或令人兴奋的项目建立在训练数据集上
我们生活在数据时代,这意味着不缺少可以轻松下载的数据集。从比 Kaggle 或你在其上学习机器学习的数据更令人兴奋的地方获取你的数据。拓展业务的好地方是 Data.gov。2013 年,奥巴马总统签署了一项行政命令,将开放和机器可读数据作为政府信息的新默认。这意味着有大量可搜索的信息可以从 Data.gov 下载。联邦学生贷款计划数据、联邦对各州的援助数据和意外药物相关死亡数据只是可供您使用的 200,000 多个数据集的一小部分。请务必查看文件中提供的元数据,以便理解您正在处理的内容。
想让事情变得更私人一点吗?用自己的数据!你做的任何事情都可以变成数据。许多健身房在“呆在家里”命令期间关闭,也许你在家工作。你正在做的所有练习都可以被追踪。看看你做了多少次,你在锻炼哪些肌肉群,以及哪天你在锻炼。使用你自己的数据的最大好处是你是主题专家。您可能最终会处理一些较小的数据集,但是您将对它是如何被捕获的有更深刻的理解,并且可以控制向它添加新的变量或维度。
这些听起来都不够先进吗?看看网页抓取。网络搜集是从互联网上收集非结构化数据的自动化过程。您将不得不用诸如 R 或 python 之类的语言编写代码来捕获数据。你必须自己研究你获得的价值,以及你抓取的网站是如何获得这些价值的。最终结果将更加独特,但也将产生更多的工作来了解数据和清理您收集的数据。
2.做一个数据清理项目

说到数据清理,真实世界的数据很恶心,使用它的时候一定要戴上口罩。玩笑归玩笑,当有人要求一个使用数据来预测客户流失的模型时,几乎从来没有一个干净的、现成的数据源来构建这个模型。大多数课程不会让您准备好处理组织可用的各种脏数据。这是一项关键技能,你需要在至少一个项目中展示出来。
说到数据清理,真实世界的数据很恶心
有许多任务可以与清理数据相关联。理解数据是一个很好的起点。政府和公共可用数据通常有一个数据字典,其中包含数据中每个维度、度量、观察和表的描述。这将帮助您了解收集了哪些数据、何时收集的以及由谁收集的。
理解你在看什么是数据验证的关键。一旦你知道什么是变量,你就可以使用数据字典、常识或主题专家来确定哪些值没有意义。例如,温度应该落在某个数值范围内。如果是温度数据,并且数据字典将测量单位指定为开尔文,则任何 0 或负值都是可疑的。如果这是来自百慕大的温度数据,气温升高是有道理的。在这里,任何太热或太冷的东西都是可疑的。对于像制造焊接温度这样的事情,你可能想找一位教授或工程系学生给你更多的指导。这一步的关键是找到看起来不对的值。
另一个需要研究的领域是如何处理缺失值。像数据验证一样,在处理缺失值时,上下文也很重要。如果您正在查看汽车的金融贷款数据,并且贷款信誉良好,并且收楼状态的值缺失,您不会担心该值缺失。如果你的项目涉及心理评估,而你错过了很多问题的答案,你可能会采取不同的行动,比如消除观察。有时缺失值在您的上下文中是有意义的。与数据验证一样,与您的主题专家和同行合作,了解如何处理丢失的值。
有时缺失值在您的上下文中是有意义的
3.使用版本控制

在做数据科学项目时,你可能会花很多时间与其他人一起工作,这只是使用版本控制的众多原因之一。如果您不熟悉版本控制,它将所有代码保存在一个地方,并允许多人同时使用它。每个人都可以添加他们的贡献,并审查他人的代码。如果有人离开公司,将最新的代码转移到其他人的机器上不会与 IT 部门发生冲突。所有代码都存在于一个集中的、有组织的存储库中。
所有代码都存在于一个集中的、有组织的存储库中
另一个困扰学生的问题是命名文件的版本。再也不会有 20 个版本的“project_02_final.py”与“project _ 12 _ final _ done _ finished . py”不同了。有了版本控制,每个版本都有注释,您可以与任何其他版本的代码进行逐行比较,以查看删除了什么和添加了什么。您甚至不必担心旧版本被删除,您总是可以回滚到旧版本的代码。
版本控制软件最好的一点是,一旦你开始使用,它就很容易使用。它可以是一个独立的程序,可以集成到您喜欢的集成开发环境(IDE)中,也可以通过命令行界面使用。许多系统都有额外的功能,允许您基于您的存储库创建一个网站,测试您的代码的构建,并通过将代码嵌入到其他地方来共享您的代码。这不仅是一种让你的项目有条理的方法,也可以用来开始展示你的项目。
4.构建您的表示层

亚历克斯·利特温在 Unsplash 上的照片
数据科学家这个术语仍然相对较新,高管不完全理解数据概念的情况并不少见。无论他们是否对数据科学和机器学习有深刻的理解,他们都需要一种方法来快速获得您的项目必须提供的最重要的信息。这是你的表示层。
大多数有抱负的数据科学家没有足够重视沟通技巧。解释如何在云中使用并行计算来训练和测试一个模型,然后使用自定义 API 部署给其他人使用,不会引起任何人的注意。管理层不会总是对你如何做这件事感兴趣,而是对你为什么做这件事感兴趣。这并不是说技术方面不重要,而是要记住你的观众。业务方面将希望了解您的模型对底线的影响,而 it 方面将更关心 IT 的实际实现。
大多数有抱负的数据科学家对沟通技巧关注不够
您的表示层可以采用许多不同的形式。再次强调,记住你的听众。有些人只想要电子表格和表格,而有些人想要图表和颜色。一些人希望通过电子邮件发送,另一些人希望在同一页上看到不同地区的所有数据。利用您可以使用的工具,针对不同的受众创建不同的表示层。
5.尝试各种技术

大学一毕业,我经历的最困难的事情之一就是看到我想去的公司有职位空缺,却没有任何相关的技术技能。许多公司都在努力解决入职和内部培训的问题。对他们来说,雇佣一个已经知道他们需要什么的人要容易得多。熟悉更广泛的技术将有助于你的搜索。许多组织甚至将多种技术结合在一起,以拼凑他们的数据管道和数据科学环境。
有一个老笑话说,数据科学 80%是准备数据,20%是建立模型。这是有道理的。我曾经和一些数据科学家一起工作过,他们在一个项目上花费了大量的时间让代码在服务器上而不是在他们的桌面上正确运行。我曾在一些小公司面试过,在这些公司里,数据科学家需要与数据工程师密切合作,构建数据结构来收集数据并支持他们的模型。使用多种语言和软件包来构建数据科学项目的不同部分有巨大的好处。
数据科学 80%是准备数据,20%是构建模型
外面有大量的资源,学习一门新技术或编程语言并不一定很难或很贵。当然,有专业指导的培训,费用可能超过 1500 美元,但也有几乎任何东西的免费视频,学生们只需拥有一个. edu 电子邮件地址,就可以免费享受许多昂贵软件包的许可和培训。在他们的网站上搜索,看看有什么。一旦你学会了一种软件或语言,学习另一种类似的软件或语言通常不会太难。如果你能使用强力 BI,Tableau 并不难用。
6.将所有内容整合到一个管道中

罗曼·彭丁在 Unsplash 上拍摄的照片
说到多种工具,为什么不一起使用它们呢?作为一名学生,很多时候你会得到简单格式的数据,例如. csv。这不是不可能得到的。csv 文件,但数据通常不会以这种方式存储。数据将来自多个来源,具有多个转换和存储层,并且会涉及许多不同的技术。你的项目的一个小管道表明你理解这些部分如何一起工作。
每个人都知道如何阅读. csv 文件
管道可以非常简单,只需将文件加载到数据库中,选择数据并将其导入分析工具,然后将结果发送到表示层。它不一定要漂亮或完全自动化,它只需要展示你对数据管道如何工作的理解。每个人都知道如何阅读. csv 文件,但不是每个人都可以将数据、分析和演示过程集成到一个连贯的项目中,以反映组织是如何做的。
摘要
这绝不是一个全面的列表,但会给你一些如何让你的数据科学项目引起注意的想法!请记住,数据科学项目是您技能的直接反映。通过将这些技能应用到反映真实世界数据科学复杂性的项目中,展示您擅长的东西。确保使用有趣的数据,清理数据,使用版本控制来保持有序,有效地传达您的信息,使用各种技术,并将一切结合在一起,以实现真正全面的数据科学项目。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
realdrewdata.medium.com](https://realdrewdata.medium.com/membership)
测试您对 Python 列表的了解的 60 个问题
通过掌握列表基础知识粉碎算法问题

我最近做了很多算法问题,发现我并没有像应该的那样理解列表
这是我为评估自己的知识而写的 60 个问题的汇编。
我希望你会发现它对我和写作一样有用。
问题 1–10:
1.检查列表是否包含元素
如果列表中有特定的元素,那么in操作符将返回 True。
li = [1,2,3,'a','b','c']'a' in li
#=> True
2.如何同时遍历 2+个列表
您可以使用zip()列表,然后遍历zip对象。zip对象是元组的迭代器。
下面我们同时迭代 3 个列表,并将值插入到一个字符串中。
name = ['Snowball', 'Chewy', 'Bubbles', 'Gruff']
animal = ['Cat', 'Dog', 'Fish', 'Goat']
age = [1, 2, 2, 6]z = zip(name, animal, age)
z #=> <zip at 0x111081e48>for name,animal,age in z:
print("%s the %s is %s" % (name, animal, age))
#=> Snowball the Cat is 1
#=> Chewy the Dog is 2
#=> Bubbles the Fish is 2
#=> Gruff the Goat is 6
3.什么时候你会使用列表而不是字典?
列表和字典通常有稍微不同的用例,但是有一些重叠。
我得出的算法问题的一般规则是,如果你可以两者都用,那就用字典,因为查找会更快。
列表
如果你需要存储一些东西的顺序,使用一个列表。
即:数据库记录的 id,按照它们将被显示的顺序排列。
ids = [23,1,7,9]
从 python 3.7 开始,列表和字典都是有序的,列表允许重复值,而字典不允许重复键。
字典
如果你想计算某事的发生次数,就用字典。比如家里宠物的数量。
pets = {'dogs':2,'cats':1,'fish':5}
每个键在字典中只能存在一次。注意,键也可以是其他不可变的数据结构,如元组。即:{('a',1):1, ('b',2):1}。
4.列表是可变的吗?
是的。请注意,在下面的代码中,与内存中相同标识符关联的值没有发生变化。
x = [1]
print(id(x),':',x) #=> 4501046920 : [1]x.append(5)
x.extend([6,7])
print(id(x),':',x) #=> 4501046920 : [1, 5, 6, 7]
5.一个列表需要同质吗?
不可以。不同类型的对象可以混合在一个列表中。
a = [1,'a',1.0,[]]
a #=> [1, 'a', 1.0, []]
6.追加和扩展有什么区别?
.append()在列表末尾添加一个对象。
a = [1,2,3]
a.append(4)
a #=> [1, 2, 3, 4]
这也意味着追加列表会将整个列表作为单个元素添加,而不是追加它的每个值。
a.append([5,6])
a #=> [1, 2, 3, 4, [5, 6]]
.extend()将第二个列表中的每个值作为自己的元素相加。所以用另一个列表扩展一个列表会合并它们的值。
b = [1,2,3]
b.extend([5,6])
b #=> [1, 2, 3, 5, 6]
7.python 列表是存储值还是指针?
Python 列表本身并不存储值。它们存储指向存储在内存中其他地方的值的指针。这使得列表是可变的。
这里我们初始化值1和2,然后创建一个包含值1和2的列表。
print( id(1) ) #=> 4438537632
print( id(2) ) #=> 4438537664a = [1,2,3]
print( id(a) ) #=> 4579953480print( id(a[0]) ) #=> 4438537632
print( id(a[1]) ) #=> 4438537664
注意链表是如何拥有自己的内存地址的。但是列表中的1和2与我们之前定义的1和2指向内存中相同的位置。
8.“del”是做什么的?
del从给定索引的列表中删除一个项目。
这里我们将删除索引 1 处的值。
a = ['w', 'x', 'y', 'z']
a #=> ['w', 'x', 'y', 'z']del a[1]a #=> ['w', 'y', 'z']
注意del没有返回被移除的元素。
9.“移除”和“弹出”有什么区别?
.remove()删除匹配对象的第一个实例。下面我们去掉第一个b。
a = ['a', 'a', 'b', 'b', 'c', 'c']
a.remove('b')
a #=> ['a', 'a', 'b', 'c', 'c']
.pop()根据索引删除对象。
pop和del的区别在于pop返回弹出的元素。这允许使用类似堆栈的列表。
a = ['a', 'a', 'b', 'b', 'c', 'c']
a.pop(4) #=> 'c'
a #=> ['a', 'a', 'b', 'b', 'c']
默认情况下,如果没有指定索引,pop会删除列表中的最后一个元素。
10.从列表中删除重复项
如果你不关心维护一个列表的顺序,那么转换成一个集合再转换回一个列表就可以实现这个目的。
li = [3, 2, 2, 1, 1, 1]
list(set(li)) #=> [1, 2, 3]

问题 11–20:
11.查找第一个匹配元素的索引
例如,您想在水果列表中找到第一个“苹果”。使用.index()方法。
fruit = ['pear', 'orange', 'apple', 'grapefruit', 'apple', 'pear']
fruit.index('apple') #=> 2
fruit.index('pear') #=> 0
12.从列表中删除所有元素
我们可以用.clear()从现有列表中清除元素,而不是创建一个新的空列表。
fruit = ['pear', 'orange', 'apple']print( fruit ) #=> ['pear', 'orange', 'apple']
print( id(fruit) ) #=> 4581174216fruit.clear()print( fruit ) #=> []
print( id(fruit) ) #=> 4581174216
或者用del。
fruit = ['pear', 'orange', 'apple']print( fruit ) #=> ['pear', 'orange', 'apple']
print( id(fruit) ) #=> 4581166792del fruit[:]print( fruit ) #=> []
print( id(fruit) ) #=> 4581166792
13.遍历列表中的值及其索引
将计数器添加到作为参数传递的列表中。
下面我们遍历列表,将值和索引传递给字符串插值。
grocery_list = ['flour','cheese','carrots']for idx,val in enumerate(grocery_list):
print("%s: %s" % (idx, val))
#=> 0: flour
#=> 1: cheese
#=> 2: carrots
14.如何连接两个列表
+操作符将连接两个列表。
one = ['a', 'b', 'c']
two = [1, 2, 3]one + two #=> ['a', 'b', 'c', 1, 2, 3]
15.如何用列表理解操作列表中的每个元素
下面我们返回一个新的列表,每个元素加 1。
li = [0,25,50,100][i+1 for i in li]
#=> [1, 26, 51, 101]
16.统计列表中特定对象的出现次数
count()方法返回一个特定对象出现的次数。下面我们返回字符串的次数,“fish”存在于一个名为pets的列表中。
pets = ['dog','cat','fish','fish','cat']
pets.count('fish')
#=> 2
17.如何浅层复制一个列表?
.copy()可以用来浅层复制一个列表。
下面我们创建一个round1的浅层副本,给它分配一个新名字round2,然后移除字符串sonny chiba。
round1 = ['chuck norris', 'bruce lee', 'sonny chiba']**round2 = round1.copy()**
round2.remove('sonny chiba')print(round1) #=> ['chuck norris', 'bruce lee', 'sonny chiba']
print(round2) #=> ['chuck norris', 'bruce lee']
18.为什么要创建一个列表的浅层副本?
基于前面的例子,如果我们不创建浅层拷贝,修改round2将会修改round1。
round1 = ['chuck norris', 'bruce lee', 'sonny chiba']**round2 = round1**
round2.remove('sonny chiba')print(round1) #=> ['chuck norris', 'bruce lee']
print(round2) #=> ['chuck norris', 'bruce lee']
没有浅拷贝,round1和round2只是内存中指向同一个链表的名字。这就是为什么看起来改变一个的值会改变另一个的值。
19.如何深度复制一个列表?
为此我们需要导入copy模块,然后调用copy.deepcopy()。
下面我们创建一个名为round2的列表的深层副本round1,更新round2中的值,然后打印两者。在这种情况下,round1不受影响。
round1 = [
['Arnold', 'Sylvester', 'Jean Claude'],
['Buttercup', 'Bubbles', 'Blossom']
]import copy
**round2 = copy.deepcopy(round1)**round2[0][0] = 'Jet Lee'print(round1)
#=> [['Arnold', 'Sylvester', 'Jean Claude'], ['Buttercup', 'Bubbles', 'Blossom']]print(round2)
#=> [['Jet Lee', 'Sylvester', 'Jean Claude'], ['Buttercup', 'Bubbles', 'Blossom']]
上面我们可以看到,改变round2中的嵌套数组并没有更新round1。
20.深抄和浅抄有什么区别?
在前一个例子的基础上,创建一个浅层副本,然后修改它,会影响原始列表..
round1 = [
['Arnold', 'Sylvester', 'Jean Claude'],
['Buttercup', 'Bubbles', 'Blossom']
]import copy
**round2 = round1.copy()**round2[0][0] = 'Jet Lee'print(round1)
#=> [['Jet Lee', 'Sylvester', 'Jean Claude'], ['Buttercup', 'Bubbles', 'Blossom']]print(round2)
#=> [['Jet Lee', 'Sylvester', 'Jean Claude'], ['Buttercup', 'Bubbles', 'Blossom']]
为什么会这样?
创建一个浅层副本确实会在内存中创建一个新的对象,但是它会填充上一个列表中已有对象的引用。
创建深层副本会创建原始对象的副本,并指向这些新版本。因此新列表完全不受旧列表更改的影响,反之亦然。

照片由瓦莱里娅·博尔特涅娃从派克斯拍摄
问题 21-30:
21.列表和元组的区别是什么?
元组在创建后无法更新。添加/移除/更新现有元组需要创建新元组。
列表创建后可以修改。
元组通常表示一个对象,如从数据库中加载的记录,其中元素具有不同的数据类型。
列表通常用于存储特定类型对象的有序序列(但不总是如此)。
两者都是序列,并且允许重复值。
22.返回列表的长度
len()可以返回一个列表的长度。
li = ['a', 'b', 'c', 'd', 'e']
len(li)
#=> 5
但是请注意,它对顶级对象进行计数,因此几个整数的嵌套列表将只被计为单个对象。下面,li的长度是 2,不是 5。
li = [[1,2],[3,4,5]]
len(li)
#=> 2
23.列表和集合的区别是什么?
列表是有序的,而集合不是。这就是为什么使用 set 在一个列表中寻找唯一值,像list( set([3, 3, 2, 1]) )失去了顺序。
列表通常用于跟踪顺序,而集合通常用于跟踪存在。
列表允许重复,但是根据定义,集合中的所有值都是唯一的。
24.如何检查一个元素是否不在列表中?
为此,我们使用了in操作符,但是在它前面加上了not。
li = [1,2,3,4]
5 not in li #=> True
4 not in li #=> False
25.用 map 函数将列表中的每个元素乘以 5
.map()允许迭代一个序列,并用另一个函数更新每个值。
返回一个地图对象,但是我已经用一个列表理解包装了它,所以我们可以看到更新的值。
def multiply_5(val):
return val * 5a = [10,20,30,40,50][val for val in map(multiply_5, a)]
#=> [50, 100, 150, 200, 250]
26.用 zip 函数将两个列表合并成一个元组列表
zip()将多个序列组合成一个元组迭代器,其中相同序列索引处的值组合在同一个元组中。
alphabet = ['a', 'b', 'c']
integers = [1, 2, 3]list(zip(alphabet, integers))
27.在现有列表中的特定索引处插入值
insert()方法接受一个要插入的对象和索引。
li = ['a','b','c','d','e']
li.insert(2, 'HERE')li #=> ['a', 'b', 'HERE', 'c', 'd', 'e']
请注意,先前位于指定索引处的元素被向右移动,而不是被覆盖。
28.用 reduce 函数从第一个元素中减去列表中的值
reduce()需要从functools导入。
给定一个函数,reduce遍历一个序列,并对每个元素调用该函数。当前一个元素调用函数时,前一个元素的输出作为参数传递。
from functools import reducedef subtract(a,b):
return a - bnumbers = [100,10,5,1,2,7,5]reduce(subtract, numbers) #=> 70
上面我们从 100 减去了 10,5,1,2,7 和 5。
29.用 filter 函数从列表中删除负值
给定一个函数,filter()将从序列中删除该函数不返回True的任何元素。
下面我们去掉小于零的元素。
def remove_negatives(x):
return True if x >= 0 else False
a = [-10, 27, 1000, -1, 0, -30][x for x in filter(remove_negatives, a)]
#=> [27, 1000, 0]
30.将列表转换成字典,其中列表元素是键
为此我们可以用字典理解。
li = ['The', 'quick', 'brown', 'fox', 'was', 'quick']
d = {k:1 for k in li}
d #=> {'The': 1, 'quick': 1, 'brown': 1, 'fox': 1, 'was': 1}

凯文·梅纳江摄于 Pexels
问题 31-40:
31.用 lambda 函数修改现有列表
让我们将之前编写的map函数转换成带有lambda的一行程序。
a = [10,20,30,40,50]list(map(lambda val:val*5, a))
#=> [50, 100, 150, 200, 250]
我可以把它作为一个 map 对象,直到我需要迭代它,但是我把它转换成一个列表来显示里面的元素。
32.移除列表中特定索引后的元素
使用 slice 语法,我们可以返回一个新的列表,其中只包含特定索引之前的元素。
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]li[:10]
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
33.移除列表中特定索引前的元素
slice 语法还可以返回一个新列表,其中包含指定索引之后的值。
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]li[15:]
#=> [16, 17, 18, 19, 10]
34.移除列表中两个索引之间的元素
或者在两个指数之间。
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]li[12:17]
#=> [13, 14, 15, 16, 17]
35.返回列表中两个索引之间的第二个元素
或者在特定间隔的索引之前/之后/之间。
这里,我们使用 slice 语法返回索引 10 和 16 之间的每第二个值。
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]li[10:16:2]
#=> [11, 13, 15]
36.按升序对整数列表进行排序
sort()方法将一个列表改变为升序。
li = [10,1,9,2,8,3,7,4,6,5]li.sort()
li #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
37.按降序对整数列表进行排序
通过添加参数reverse=True,也可以用sort()进行降序排序。
li = [10,1,9,2,8,3,7,4,6,5]li.sort(reverse=True)
li #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
38.用列表理解从列表中过滤出偶数值
您可以在列表理解中添加条件逻辑,以按照给定的模式过滤出值。
这里我们过滤掉能被 2 整除的值。
li = [1,2,3,4,5,6,7,8,9,10][i for i in li if i % 2 != 0]
#=> [1, 3, 5, 7, 9]
39.统计列表中每个值的出现次数
一种选择是遍历一个列表并将计数添加到一个字典中。但是最简单的选择是从collections导入Counter类,并将列表传递给它。
from collections import Counterli = ['blue', 'pink', 'green', 'green', 'yellow', 'pink', 'orange']Counter(li)
#=> Counter({'blue': 1, 'pink': 2, 'green': 2, 'yellow': 1, 'orange': 1})
40.获取列表中每个嵌套列表的第一个元素
列表理解非常适合迭代其他对象的列表,并从每个嵌套对象中获取一个元素。
li = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]][i[0] for i in li]
#=> [1, 4, 7, 10, 13]

来自 Pexels 的 Lisa Fotios 的照片
问题 41–50:
41.对于一个列表,插入、查找、删除的时间复杂度是多少?
插入的是 O(n) 。如果在开头插入一个元素,所有其他元素都必须右移。
通过索引查找是 O(1) 。但是 find by value 是 O(n ),因为需要迭代元素直到找到值。
删除是 O(n) 。如果一开始就删除了一个元素,那么所有其他元素都必须左移。
42.将列表中的元素组合成一个字符串。
这可以通过join()功能完成。
li = ['The','quick','brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
' '.join(li)
#=> 'The quick brown fox jumped over the lazy dog'
43.一个列表乘以一个整数会有什么影响?
将一个列表乘以一个整数称为多重串联,其效果与将一个列表串联 n 次相同。
下面我们将列表乘以 5。
['a','b'] * 5
#=> ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
这与相同。
['a','b'] + ['a','b'] + ['a','b'] + ['a','b'] + ['a','b']
#=> ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
44.如果列表中的任何值可以被 2 整除,则使用“any”函数返回 True
如果返回的列表中有任何值的计算结果为True,我们可以将any()与列表理解结合起来返回True。
在第一个列表下面,理解返回True,因为列表中有一个2,它可以被2整除。
li1 = [1,2,3]
li2 = [1,3]any(i % 2 == 0 for i in li1) #=> True
any(i % 2 == 0 for i in li2) #=> False
45.如果列表中的所有值都是负数,则使用“all”函数返回 True
与any()函数类似,all()也可以与列表理解一起使用,仅当返回列表中的所有值都是True时才返回True。
li1 = [2,3,4]
li2 = [2,4]all(i % 2 == 0 for i in li1) #=> False
all(i % 2 == 0 for i in li2) #=> True
46.你能对一个包含“无”的列表进行排序吗?
您不能对包含None的列表进行排序,因为比较运算符(由sort()使用)不能将整数与None进行比较。
li = [10,1,9,2,8,3,7,4,6,None]li.sort()
li #=> TypeError: '<' not supported between instances of 'NoneType' and 'int'
47.列表构造函数将从现有列表中创建什么样的副本?
list 构造函数创建一个传入列表的浅表副本。也就是说,这比使用.copy()要简单得多。
li1 = ['a','b']
li2 = list(li1)
li2.append('c')print(li1) #=> ['a', 'b']
print(li2) #=> ['a', 'b', 'c']
48.颠倒列表的顺序
可以用reverse()方法将一个列表改变成相反的顺序。
li = [1,2,3,4,5,6,7,8,9,10]
li.reverse()
li #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
请注意,这将改变对象,而不是返回一个新的对象。
49.反和反的区别是什么?
reverse()原地反转列表。reversed()以逆序返回列表的 iterable。
li = [1,2,3,4,5,6,7,8,9,10]
list(reversed(li))
#=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
50.sort 和 sorted 有什么区别?
sort()就地修改列表。sorted()返回一个逆序的新列表。
li = [10,1,9,2,8,3,7,4,6,5]
li.sort()
li #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]li = [10,1,9,2,8,3,7,4,6,5]
sorted(li) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

问题 51–60:
51.返回列表中的最小值
min()函数返回列表中的最小值。
li = [10,1,9,2,8,3,7,4,6,5]
min(li)
#=> 1
52.返回列表中的最大值
max()函数返回列表中的最大值。
li = [10,1,9,2,8,3,7,4,6,5]
max(li)
#=> 10
53.返回列表中数值的总和
sum()函数返回列表中所有值的总和。
li = [10,1,9,2,8,3,7,4,6,5]
sum(li)
#=> 55
54.将列表用作堆栈
你可以使用append()和pop()把一个列表当作一个堆栈。堆栈按照后进先出法运行。
stack = []stack.append('Jess')
stack.append('Todd')
stack.append('Yuan')print(stack) #=> ['Jess', 'Todd', 'Yuan']print(stack.pop()) #=> Yuanprint(stack) #=> ['Jess', 'Todd']
堆栈的一个好处是可以在 O(1)时间内添加和删除元素,因为列表不需要迭代。
55.找到两个列表的交集
我们可以通过使用带“与”符号的set()来做到这一点。
li1 = [1,2,3]
li2 = [2,3,4]set(li1) & set(li2)
#=> {2, 3}
56.找出一个集合和另一个集合的区别
我们不能减去列表,但我们可以减去集合。
li1 = [1,2,3]
li2 = [2,3,4]set(li1) - set(li2)
#=> {1}set(li2) - set(li1)
#=> {4}
57.用列表理解展平列表列表
与 Ruby 不同,Python3 没有显式的 flatten 函数。但是我们可以使用列表理解来简化列表列表。
li = [[1,2,3],[4,5,6]][i for x in li for i in x]
#=> [1, 2, 3, 4, 5, 6]
58.生成两个值之间所有整数的列表
我们可以创建一个介于两个值之间的范围,然后将其转换为一个列表。
list(range(5,10))
#=> [5, 6, 7, 8, 9]
59.将两个列表合并成一个字典
使用zip()和list()构造函数,我们可以将两个列表合并成一个字典,其中一个列表成为键,另一个列表成为值。
name = ['Snowball', 'Chewy', 'Bubbles', 'Gruff']
animal = ['Cat', 'Dog', 'Fish', 'Goat']dict(zip(name, animal))
#=> {'Snowball': 'Cat', 'Chewy': 'Dog', 'Bubbles': 'Fish', 'Gruff': 'Goat'}
60.使用 slice 语法反转列表的顺序
虽然我们可以用reverse()和reversed()反转一个列表,但也可以用 slice 语法来完成。
这将通过从头到尾遍历列表返回一个新列表。
li = ['a','b',3,4]
li[::-1]
#=> [4, 3, 'b', 'a']
结论
做完这些后,我觉得更有准备去解决算法问题,而不用去猜测具体的列表方法。
去除持续的谷歌搜索可以为更高层次的思考释放能量,比如让一个功能做它应该做的事情,以及降低功能的复杂性。
同样,我希望您发现这也很有用。
你可能对我之前发表的关于字符串问题的文章感兴趣,或者对我已经开始发表的关于算法问题的每周系列文章感兴趣。
68–95–99.7—在 Power BI 中使用的三适马经验法则。
采用微软 POWER BI 的数据科学
在无代码的 Power BI 中使用三西格马经验法则检测异常值和异常

即使在最小的数据项目中,最重要的步骤之一是检测数据结构中的异常值、离群值或异常。
在这个简短的指南中,我将向您展示不使用任何代码来检测这些值的最基本的方法。除了在 Power BI 中实现这一点的许多方法之外,这是最直接的和 UI 驱动的方法,并且仍然非常有用。
什么是异常值,如何识别?
定义异常值的常用方法是“标准偏差的 3 倍”规则,通常称为三西格马经验法则。
想要更多背景?在 维基百科 上找到。
假设我们的数据集中有一个值为的列,我们想要检测它是否包含异常值。Todo 因此我们查看| value — average |,以测量该值与平均值的差距。
如果这个绝对值是我们的标准偏差的 3 倍以上,那么我们可以认为这个值是异常值。
数据
这种方法最适用于符合标准正态分布的数据。
但是,即使对于非正态分布的变量,三西格马规则告诉我们,至少 88.8%的情况应该落在正确计算的三西格马区间内。
为了遵循这个指南,你可以选择你自己的数据集或者下载我的数据集,这个数据集按照标准的正态分布填充了 5000 个随机值。具体地说,它填充了从均值为 0、方差为 1 的单变量“正态”(高斯)分布中采样的随机浮点数。
[## sebastianzolg/使用 powerbi 过滤异常值
github.com](https://github.com/sebastianzolg/filtering-outliers-with-powerbi)
想知道如何用 python 创建这样的数据?请参见本指南末尾的奖金部分。
移除异常值
让我们从存储库中的 randoms.csv 文件中提取数据,并将其加载到 Power BI 中。
打开 Power BI,点击获取数据。

选择 Text/CSV ,点击连接,选择之前下载的 randoms.csv 文件。

检查数据,确保数据加载正确。点击转换数据将其提取到 Power BI 中。

我们希望有一个自定义列,使我们能够轻松地过滤离群值。为了识别异常值,我们首先需要计算所有数据的平均值和标准差。
为此,我们将初始查询复制两次。选择初始查询,右击并从上下文菜单中选择复制。第二次重复这个步骤,这样总共有 3 个查询。

现在,我们很快将我们重复的查询重命名为表示和标准差,这样就反映了我们的意图。右键点击两个查询,并点击上下文菜单中的重命名。

既然我们已经正确地命名了我们的查询,我们就可以继续在我们的 Randoms 列上对均值和标准差查询进行快速计算。
选择均值查询,点击随机数列的标题。现在选择控制功能区中的转换选项卡,并注意统计。打开统计的右键菜单,从列表中选择平均值。

这立即将查询转换成一个十进制数,表示我们的 Randoms 列的 Mean 值。

对标准差查询重复此步骤,但这次从统计的上下文菜单中选择标准差。

同样,这将把查询转换成表示我们的 Randoms 列的标准偏差的单个十进制值。

现在我们不用一行代码就可以快速计算出均值和标准差,我们现在可以计算出异常值。
我们希望用一个专用的列来过滤异常值。跳转到添加列功能区选项卡,点击自定义列。

这将立即打开幂查询公式编辑器,我们可以在其中计算这个新列的值。将该列命名为类似于is outer的名称。
现在,我们必须将我们对三西格马规则的了解转化为一个幂 BI 公式。这是最终的公式,易于阅读和理解。
Number.Abs([Randoms] — Mean) > (3 * #”Standard Deviation”)

我们来分解一下。首先,我们取列[Random]中的每个值,并减去总的Mean,这是我们查询平均值的结果。用函数Number.Abs()包围这个计算,该函数返回计算的绝对数。
现在我们验证结果是否大于标准偏差的三倍。我们通过> (3 * #"Standard Deviation")来实现,这里Standard Deviation是我们的标准差查询的结果。
就是这样!点击 OK ,您就可以过滤异常值并检测异常情况了。
回到编辑器,您可以看到新创建的列及其值是根据我们的公式计算出来的。让我们通过单击列标题旁边的向下箭头图标,将我们的外部列过滤到TRUE。

通过使用我的数据集,我们发现了 19 个异常值。正如你从数字中看到的,这些异常值确实代表了我们随机范围的外部边缘。

恭喜!您成功检测到数据集中的异常值。随意反转过滤器,使用非异常值的数据。这会给你统计上更好的结果。
就这样吧。
—塞巴斯蒂安
额外收获:用 python 创建随机数
使用下面的代码片段,你可以快速生成你自己的随机数,并随意使用。通过点击链接了解更多关于生成它的函数的信息。
你应该知道的 7 种高级 Python 字典技术
根据以下提示掌握 Python 字典

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
Python 字典是非常强大的数据结构——在这篇文章中,你将学习七种技术来帮助你掌握它们!
让我们开始吧。
1.合并两本词典
从 Python 3.5 开始,可以很容易地合并两个字典,使用**kwargs:
合并两本词典。资料来源:Nik Piepenbreier
从 Python 3.9 开始,您可以使用 union 操作符(|)来组合两个字典:
合并两本词典。资料来源:Nik Piepenbreier
2.检查字典中是否存在关键字
要查看字典中是否存在某个键,可以使用关键字中的。
例如,让我们看看字典中是否存在一些键:
检查字典成员。资料来源:Nik Piepenbreier
3.从词典中删除一项
要轻松删除词典,您可以使用 pop 功能。pop 函数返回被删除的键的值。
Pop 接受两个参数(要删除的键,如果找不到键,则为默认值)。
让我们尝试删除一些项目:
从词典中删除一项。资料来源:Nik Piepenbreier
最后一个 print 语句返回一个错误,因为键不存在并且没有提供默认值。
4.词典释义
Python 字典理解可以让您轻松地迭代键和值。
一个很容易解释的例子来说明这一点,就是构建一个字典,其中的键是一个数字,值是数字的平方:
掌握词典释义。资料来源:Nik Piepenbreier
在这篇深度文章中了解更多关于字典理解的知识!
5.从词典中删除空条目
让我们使用列表理解来从字典中删除所有的空条目。当一个项的值为 None 时,它被认为是空的。
从字典中删除空条目。资料来源:Nik Piepenbreier
6.使用 Get 而不是字典访问器
要访问 Python 字典项,可以使用方括号符号。这很有效——直到它失效。
如果字典中不存在某个键,就会抛出 AttributeError。
这可能会扰乱您的代码。
但是,使用 get 方法只会返回 None:
如何为字典使用 get?资料来源:Nik Piepenbreier
7.基于值过滤字典
假设你有一本关于人们身高的字典,你想过滤掉低于某一高度的人。
您可以通过 for 循环或者(更简单的)字典理解来实现这一点。
我们把 170cm 以下的都过滤掉吧。
根据字典的值过滤字典。资料来源:Nik Piepenbreier
结论
感谢阅读!在本教程中,您学习了 Python 字典的 7 种技术。
如果你对掌握 Python 列表感兴趣,可以看看我的另一个教程:
让全能榜单更加强大!
towardsdatascience.com](/advanced-python-list-techniques-c6195fa699a3)
数据科学的 7 个高级熊猫技巧
Pandas 是数据科学的首选图书馆。这些是我用来更快更简单地完成重复性数据科学任务的捷径。
1.使用 df.groupby()分析数据帧的样本。iter()
与使用 Excel 相比,在 Jupyter 笔记本中逐行或逐组浏览数据集通常很难。一个有用的技巧是使用生成器并使用 Ctrl + Enter 而不是 Shift + Enter ,以便迭代地查看同一单元格内的不同样本,而不会在您的笔记本中造成混乱。
首先用生成器创建一个单元。groupby()(或。iterrows())并添加。iter():
然后,使用键盘快捷键 Ctrl + Enter 任意多次运行下面的单元格来观察对您最重要的数据:
这里有一个分析泰坦尼克号数据集中拥有完全相同机票号码的乘客的例子。您无法单独隔离每组乘客,因此使用这种方法可以让您以一种非常简单的方式逐个分析各组乘客:

使用 df.groupby()在 Titanic 数据集中搜索具有相同“机票”号码的乘客。iter()和键盘快捷键 Ctrl + Enter。
2.用于数据探索和数据质量评估的熊猫概况分析
在数据科学中,我们倾向于从头开始编写数据探索代码。既然所有的数据集都不一样,那就说得通了。然而,有一个神奇的 pandas_profiling 包让这个推理变得毫无意义。该软件包实际上自动化了数据探索和数据质量评估步骤!看一看:


点击“警告”以评估您的数据质量。

熊猫图谱相关分析。人们可以选择 5-6 个相关度。
它就像一个魔咒!
显然,它不能解决所有的数据探索,例如,如果您的数据中有自由文本变量。但这应该是你开始分析任何数据集的方式。
3.多重链接
一旦您理解了可以使用链接方法组合多个操作,Pandas 就会变得非常有趣。链接基本上是在同一行代码中添加操作。
有了下面这行代码,我就
- 在我的数据集中添加新列(。合并)
- 算上女乘客的比例(。申请(女性 _ 比例))
- 对于超过 1 名乘客的团体(df。Ticket.value_counts()>1)
- 有相同的票号(。groupby('Ticket '))。
我不需要创建新的数据框架,新的变量,任何新的东西。链式方法允许你把你的想法“翻译”成实际的操作。
下面的例子也是链式方法的一个很好的例子:
4.用样式绘制系数/特征重要性
如果你在做机器学习,你知道用通俗易懂的语言解释清楚你的机器学习模型有多困难。这里有一种方法可以帮助你很好地了解模型中的系数或变量的重要性。

你可以将系数(或变量重要性)放入数据框架中,以便可视化它们。
我从多个来源收集了代码,得到了以下我一直在重复使用的可视化效果(避免重复发明轮子):
它给出了以下输出:

变量根据系数(或变量重要性)进行排序,彩色条让我们可以快速找到最重要的变量。这里,“Pclass”列具有最大的(负)系数,其绝对值是第二大系数的两倍:“apollowed _ Q”。
很漂亮吧?
5.sklearn _ 熊猫
如果你是一个熊猫倡导者,你会不止一次地意识到与熊猫 DataFrame 和 sklearn 合作并不总是最合适的。但是不要就此打住。一些积极的贡献者创造了 sklearn_pandas,这是两个软件包之间的桥梁。它用熊猫友好的数据帧映射器取代了 sklearn 的列变换器。这几天开始只用 sklearn_pandas,没有失望。我希望我以前知道这件事。
下面是使用。fit()方法:

6.tqdm
当处理大型数据集时,数据操作需要时间。使用 tqdm 来跟踪你的代码是否正在运行以及运行了多长时间,而不是在你的 Jupyter 笔记本前面无表情地等待,不知道发生了什么。对于运行速度太慢的脚本,这也是提前中止的好方法。
现在所有的熊猫数据框架都有了新的方法:
- 。进度 _ 应用,。进度 _ 应用地图
- 。用于列的 progress_map

它们与应用、应用地图和地图相同,不同之处在于它们会绘制进度条。多有用啊!

tqdm pandas 方法生成的进度条示例。
7.的。要粘贴到 Excel 中的 to_clipboard()
作为一名狂热的 Excel 用户,我开发了一些技巧来绘制性感的图表和漂亮的格式来展示数据的洞察力。尽管 pandas 有许多选项,但很难用最少的代码获得类似的输出水平。
有一件事我最终做了很多来应对,那就是将我的结果导出到 Excel。但不使用。to_excel 方法。相反,我使用平滑。to_clipboard(index=False)将数据复制到剪贴板。然后,我使用 Excel 中的 Ctrl + V 将数据粘贴到我当前的电子表格中。给你,你可以释放你体内的 Excel 野兽。
许多数据科学家容易忘记的一件事是,非数据科学家通常擅长 Excel。与他们共享 Excel 文件比共享笔记本或导出为 html 文件的笔记本更容易。
如果这对你有用,请在评论中告诉我!感谢阅读,如果你喜欢就鼓掌吧:)
7 个 AI 面试问题…由 AI 回答
使用问答模型 BERT-SQuAD 回答 AI 问题。

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片
如果你正在寻找一份数据科学的工作,你可能已经注意到这个领域竞争异常激烈。AI 现在甚至可以用任何语言生成代码。下面,我们将探讨 AI 如何从段落中提取信息来回答问题。
有一天,你可能会与人工智能竞争——如果 AutoML 还不是竞争对手的话。
伯特小队是什么?
BERT-SQuAD 是谷歌 BERT 和斯坦福问答数据集的交叉。
BERT 是一种先进的自然语言处理算法,可用于问题回答(我们将在这里深入探讨)、情感分析、垃圾邮件过滤、文档聚类等任务——都是语言!

理解伯特。跳舞图标由 Freepik 制作,灯泡图标由 Becris 在 Flaticon 上制作。作者图解。
“双向性”指的是许多单词根据上下文变化的事实——比如“让我们击中俱乐部”与“一个想法击中他”——所以它会考虑关键字两边的单词。
“编码”仅仅意味着给字符分配数字,或者把像“让我们去俱乐部”这样的输入转换成机器可操作的格式。
“表示”是通过在文本语料库中查看单词的许多编码而获得的对单词的总体理解。
“变形金刚”是你用来从嵌入到表现的东西——这是最复杂的部分。
如前所述,BERT 可以被训练完成基本上任何类型的语言任务,因此 SQuAD 参考了我们用来训练它完成特定语言任务的数据集:问答。
SQuAD 是一个阅读理解数据集,包含众包工作者在维基百科文章上提出的问题,每个问题的答案都是相应段落中的一段文字。
然后,BERT-SQuAD 允许我们通过从大量文本中找出答案来回答一般性问题。它不是从零开始编造答案,而是理解文本的上下文,足以找到答案的特定区域。
例如,这里有一个关于套索和岭回归的上下文段落:
“你可以引用 ISLR 的作者 Hastie,Tibshirani 的话,他断言,在存在几个具有中/大规模效应的变量的情况下,使用套索回归。在存在许多具有中小影响的变量的情况下,使用岭回归。
从概念上讲,我们可以说,套索回归(L1)既做变量选择又做参数收缩,而岭回归只做参数收缩,最后包括模型中的所有系数。在存在相关变量的情况下,岭回归可能是首选。此外,岭回归在最小二乘估计具有较高方差的情况下效果最好。因此,这取决于我们的模型目标。"
现在,我们可以问伯特班:
"什么时候岭回归优于套索回归?"
它会回答:
“存在相关变量时”
虽然我在这里显示了大约 100 个单词的上下文,但是您可以向 BERT-SQuAD 中输入更多的上下文,比如整个文档,并快速检索答案——如果您愿意,可以使用智能 Ctrl-F。
为了测试下面的 7 个问题,我使用了 Gradio ,这是一个让开发者用模型制作界面的库。在这种情况下,我使用了由 Google Colab 创建的 BERT-SQuAD 界面。

作者正在使用的 BERT-SQuAD Gradio 界面截图。
我使用这个 Kaggle 线程的上下文作为输入,为了简单起见修改了问题。
Q1:如果你不旋转 PCA 组件会发生什么?
PCA 的效果会减弱
Q2。你如何降低数据的维度来减少计算时间?
我们可以分离数字变量和分类变量,并移除相关变量
Q3:为什么朴素贝叶斯“幼稚”?
它假设数据集中的所有特征同等重要且独立
Q4:您应该使用哪种算法来解决低偏差和高方差问题?
装袋
问题 kNN 和 kmeans 聚类有什么不同?
kmeans 本质上是无监督的,而 kNN 本质上是有监督的
问题 6:岭回归何时优于套索回归?
存在相关变量时
Q7:什么是凸包?
代表两组数据点的外边界
附加阅读
要部署和服务像 BERT-SQuAD 这样的模型,请查看我关于 10 个简单选项的文章:
探索 Flask、云巨头、小众玩家、AutoML 和其他部署 AI 的方式。
towardsdatascience.com](/10-ways-to-deploy-and-serve-ai-models-to-make-predictions-336527ef00b2)
如果你想深入了解《变形金刚》,可以看看这本图文并茂的指南,因为伯特就是在那个架构之上构建的。
7 个云计算安全漏洞及其应对措施
不确定如何保护自己免受云计算安全漏洞的攻击?

公司正在迅速利用云来彻底改变他们的数字化转型。根据 Gartner 的数据,到 2020 年,全球云计算市场预计将增长 2664 亿美元,高于 2019 年的 2274 亿美元。
云计算有几个好处,包括潜在的更低成本(公共云中的更多功能有助于提高工作效率,而私有云中的功能更有限)和更快的上市时间。
然而,鉴于云提供的一系列优势,数据安全性是阻碍企业采用云解决方案的主要问题之一。为了证实这一点,一项调查发现,93%的公司对云计算安全风险有中度到极度的担忧。
云基础架构可能很复杂,我们都知道复杂性是安全性的大敌。虽然大多数云安全专家认为公司可以从内置于云中的安全解决方案中受益,但组织也可能会犯严重的错误,暴露关键数据和系统。
一些最常见的云安全风险包括通过不适当的访问控制进行未经授权的访问,以及滥用员工凭据。未经授权的访问和不安全的 API 并列第一,是云中最大的安全漏洞(根据 42%的受访者)。这些安全风险之后是 40%的云中的错误配置。
公司如何在保持数据安全性的同时获得云计算技术的优势?
公司可以采取几种预防措施,在早期阶段防止云安全漏洞。这包括从简单的云安全解决方案(如实施多因素身份认证)到更复杂的安全控制(以符合法规要求)。
7 大云计算安全漏洞及其缓解方法
在本文中,我们将全面了解 7 大云计算安全漏洞以及如何缓解它们。
1.错误配置的云存储
云存储是网络犯罪分子窃取数据的丰富来源。尽管风险很高,但组织仍会继续犯云存储配置错误的错误,这让许多公司付出了巨大的代价。
根据赛门铁克的一份报告,2018 年由于错误配置的云存储桶,近 7000 万条记录被盗或泄露。该报告还强调了各种工具的出现,这些工具允许攻击者检测目标的错误配置云存储。
云存储错误配置可能会迅速升级为组织及其客户的重大云安全漏洞。企业会遇到几种类型的云错误配置。一些类型的错误配置包括:
- AWS 安全组错误配置: AWS 安全组负责提供源、目的地、端口和协议访问级别的安全性。这些可以与 EC2 服务器实例和许多其他资源相关联。AWS 安全组中的错误配置会允许攻击者访问您的基于云的服务器并泄漏数据。
- 缺乏访问限制:没有足够的限制或安全措施来防止未经授权访问您的云基础架构会使您的企业面临风险。不安全的云存储桶可能会导致攻击者访问存储在云中的数据并下载机密数据,这可能会给您的组织带来灾难性的后果。AWS 最初默认打开 S3 存储桶,这导致了大量数据泄露。
- 如何防止错误配置的云存储
- 说到云计算,在设置云服务器时仔细检查云存储安全配置总是一个好主意。虽然这看起来很明显,但它很容易被其他活动忽略,例如将数据移入云中而不注意其安全性。
您还可以使用专门的工具来检查云存储安全配置。这些云安全工具可以帮助您按计划检查安全配置的状态,并及时发现漏洞。
控制谁可以创建和配置云资源。许多云计算问题来自于那些想迁移到云中却不知道如何保护数据的人。
2.不安全的 API
应用程序用户界面(API)旨在简化云计算流程。但是,如果不安全的话,API 可能会为攻击者打开通信线路,从而利用云资源。
Gartner 估计,到 2022 年,API 将成为攻击者用来攻击企业应用数据的更频繁的威胁载体。
最近的一项研究还显示,三分之二的企业将其 API 公开,以便外部开发人员和业务合作伙伴可以访问软件平台。
该研究还表明,一个组织通常平均处理 363 个 API,近 61%的公司报告其业务战略依赖于 API 集成。
随着对 API 依赖的增加,攻击者已经找到了利用不安全 API 进行恶意活动的常见方法,下面是两个例子:
- 认证不足:开发人员经常在没有适当认证控制的情况下创建 API。因此,这些 API 对互联网完全开放,任何人都可以使用它们来访问企业数据和系统。
- 授权不足:太多的开发者不认为攻击者会看到后端 API 调用,也没有适当的授权控制。如果不这样做,后端数据的危害是微不足道的。
如何防止不安全的 API
鼓励开发人员设计具有强认证、加密、活动监控和访问控制的 API。API 必须受到保护。
进行渗透测试,复制针对您的 API 端点的外部攻击,并获得安全的代码审查。最好确保您有一个安全的软件开发生命周期(SDLC ),以确保您不断开发安全的应用程序和 API。
此外,考虑对传输中的数据使用 SSL/TLS 加密。使用一次性密码、数字身份等模式实施多因素身份认证。确保强有力的认证控制。
3.知识产权的丢失或被盗
不可否认,知识产权(IP)是一个组织最有价值的资产之一,但它也容易受到安全威胁,尤其是当数据存储在网上时。
一项分析发现,上传到基于云的文件共享服务的文件中,几乎有 21%包含包括 IP 在内的敏感信息。当这些云服务遭到破坏时,攻击者可以访问存储在其中的敏感信息。
对于许多组织来说,知识产权就是他们拥有的数据,数据丢失意味着他们失去了知识产权。让我们来看看数据丢失的最常见原因:
- 数据变更:当数据以某种方式被变更,并且无法恢复到以前的状态时,可能会导致数据完整性完全丧失,并可能使其变得无用。
- 数据删除:攻击者可以从云服务中删除敏感数据,这显然会对组织的运营造成严重的数据安全威胁。
- 失去访问:攻击者可以持有信息进行勒索(勒索软件攻击)或使用强加密密钥加密数据,直到他们执行其恶意活动。
因此,在云环境中采取预防措施来保护您的知识产权和数据至关重要。
如何防止知识产权丢失或被盗
频繁备份是防止知识产权丢失或被盗的最有效方法之一。制定定期备份的时间表,并明确划分哪些数据适合备份,哪些不适合备份。考虑使用数据丢失防护(DLP)软件来检测和防止敏感数据的未经授权的移动。
防止数据丢失或被盗的另一个解决方案是加密您的数据并对您的备份进行地理多样化。离线备份也非常重要,尤其是在勒索软件的情况下。
4.合规违规和监管措施
企业必须有坚定的规则来确定谁可以访问哪些数据以及他们可以用这些数据做什么。
虽然云提供了易于访问的优势,但它也带来了安全风险,因为很难跟踪谁可以访问云中的信息。根据合规性或行业法规,组织了解有关其数据存储和访问控制的详细信息非常重要。
将您的应用程序迁移到公共云中当然不能保证法规遵从性,并且通常会使遵从性变得更加困难。服务提供商提供的“分担责任模式”意味着他们拥有云安全,您必须在云中维护您的数据安全。
诸如 CCPA 、 PCI-DSS 和 GDPR 之类的隐私要求都适用于云计算,如果你的公司管理大量敏感数据,如 PII(个人身份信息),迁移到云计算可能会使合规性更成问题。
如何防止合规违规和监管行为
云中合规性的第一步也是最重要的一步是彻底分析云服务协议,并向您的服务提供商要求云和数据安全策略。
值得注意的是,维护云安全的责任将取决于云服务级别,无论是基础设施即服务(IaaS)、平台即服务(PaaS)还是软件即服务(SaaS)。这将影响您的云提供商和组织的安全性和所有权责任。
确保您实现了一个访问管理模型,在该模型中,您可以看到部署了哪些系统及其云安全级别的记录。以下是一些快速提示:
- 了解所有用户、角色和访问权限。
- 拥有清晰的身份,能够跨所有地理位置跟踪所有资产,并控制数据的位置。
- 通过频繁自动扫描模板来保持强大的配置管理。
针对与云计算相关的违规实施事件响应计划。这样,在发生云数据泄露或漏洞暴露给攻击者的情况下,您可以快速识别和缓解安全漏洞。响应策略应在您组织的总体事件响应计划中得到充分记录和批准。
5.失去对最终用户操作的控制
当公司不知道他们的员工如何使用云计算服务时,他们可能会失去对其数据资产的控制,最终容易受到违规和内部安全威胁的攻击。
内部人员不必突破虚拟专用网络(VPN)、防火墙或其他安全防御来访问企业云中的内部数据。他们可以毫不费力地直接访问云基础架构中的敏感数据。
这可能会导致对组织有明显影响的知识产权和专有信息的丢失。
处理对最终用户行为的失控需要监视、监控、上报、事件后分析、补救、调查和事件响应,所有这些都应集成到公司的数据安全计划中。
如何防止失去对最终用户行为的控制
向您的员工提供培训,教他们如何处理安全漏洞,如网络钓鱼和恶意软件。向他们介绍云计算,以及如何保护他们在移动设备或笔记本电脑上携带的机密信息。告知他们与恶意活动相关的后果。
定期审计云基础设施中的服务器,以识别可能被利用的数据安全漏洞,并及时修复它们。
重点关注经批准的强化图像,定期对其进行安全风险和漏洞扫描。然后从这些映像部署新的服务器,并不断扫描正确的配置和检测漏洞。重点是“牛不是宠物”。如果服务器易受攻击或不合规,不要修复它,用批准的强化映像替换它。
确保特权中央服务器和访问安全系统仅限于最少数量的人员,并且这些员工接受过足够的培训,能够安全地处理他们在云服务器中的管理权限。
6.糟糕的访问管理
不当的访问管理可能是最常见的云计算安全风险。在涉及 web 应用程序的违规事件中,多年来,被盗或丢失的凭据一直是攻击者最广泛使用的工具。
访问管理确保个人只能执行他们需要执行的任务。验证个人有权访问的内容的过程称为授权。
除了困扰当今组织的标准访问管理问题(如管理分散的工作人员和用户密码疲劳)之外,组织还面临其他几个特定于云的挑战,包括:
- 无效的分配用户
- 多个管理员帐户
- 不适当的用户和服务供应和取消供应—例如,公司不撤销前员工的访问权限
- 绕过企业访问管理控制的用户
此外,在云基础架构中创建角色和管理访问权限对企业来说也是一项挑战。
如何防止糟糕的访问管理
为了应对云服务中糟糕的访问管理,企业需要为用户帐户开发一个数据治理框架。对于所有人类用户,帐户应该直接链接到中央目录服务,如 Active Directory,它负责从中央存储提供、监控和撤销访问权限。
此外,企业应该使用云原生或第三方工具定期从云服务环境中提取角色、权限、用户和组的列表。AWS 命令行界面和 PowerShell for Azure 可以收集这种类型的数据,然后安全团队可以对其进行排序、存储和分析。
组织还应确保在云环境中建立日志记录和事件监控机制,以检测异常活动或未经授权的更改。应该严格控制和管理访问密钥,以避免糟糕的数据处理或泄漏。
7.违反与客户或业务伙伴的合同
云计算中的合同有些棘手。它通常会限制谁有权访问数据、如何使用数据以及数据存储的位置和方式。当员工在未经授权的情况下将受限数据移动到云中时,可能会违反业务合同,并可能引发法律诉讼。
例如,如果你的云服务提供商在他们的条款和条件下保留与第三方共享所有上传到云的数据的权利,他们就违反了与你公司的保密协议。
这可能会导致您的客户、员工和其他利益相关者上传到云的数据泄露。
如何防止违反与客户或业务合作伙伴的合同
云服务合同应该包括审查、监控和审计报告的权利。这样,任何安全风险都可以在成为问题之前的早期阶段被识别出来。公司还应该确保他们不会被服务合同所束缚,并且转换供应商可以是一项顺利的工作。
这意味着服务合同应包括业务的服务终止权(例如,控制权变更、服务恶化、监管要求、安全性/保密性海滩等)。)
服务合同还应强调知识产权风险,因为云服务可能包括根据许可协议使用知识产权或其他软件权利。如果第三方声称云服务提供商侵权,那么该组织可能会卷入法律纠纷。
最后的想法
如果不考虑降低随之而来的风险,在云中运营的公司将承担一个可以预防的巨大风险。企业必须拥有强大的云安全策略,这些策略可以很好地集成到团队用来构建应用程序和部署在云基础架构中的 IT 流程中。
云计算的采用改变了公司和黑客的工作方式。它带来了各种机遇,也带来了一系列全新的云安全风险。企业需要不断应对云安全风险和挑战,同时采用正确的安全工具来帮助简化运营工作。
Cypress Data Defense 的云安全解决方案将最新的安全技术与您的云基础设施相集成。有了正确的技术、云安全专家和深谋远虑,公司可以利用云计算的优势。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。
面向有抱负的数据科学家的 7 个数据科学项目创意
2020 年 5 月数据科学项目的初学者友好列表

由于普遍的需求和许多请求,我决定为那些开始数据科学家之旅的人创建一个独特的数据科学项目列表。可视化项目、探索性数据分析项目和预测性建模混合在一起。我希望你喜欢这篇文章,并祝你好运!
印度的降雨量
项目类型:可视化
链接到数据集此处。

该数据集包含印度 36 个分区的月降雨量详情。以下是一些你可以自己尝试的可视化想法:
- 您可以创建条形图或饼图来比较各地区的降雨量
- 您可以创建一个折线图来比较一段时间内各地区的降雨量
- 您可以创建一个动画 choropleth 地图来显示随着时间的推移在哪里下雨!如果你想学习如何构建一个 choropleth 可视化,请查看我的教程 这里 。
全球自杀率
项目类型:探索性数据分析
链接到数据集此处。

这是一个整合的数据集,包含各国每年的自杀率、人类发展指数(HDI)数据、国内生产总值和人口统计数据。这个数据集的目的是看是否有任何与自杀率增加相关的指标。
探索数据,看看哪些国家和大陆的自杀率最高。你注意到了什么趋势?自杀率总体上是上升还是下降了?男女自杀人数的比例是多少?看看你能否找到任何与自杀率相关的变量。
夏季奥运会奖牌
项目类型:探索性数据分析
链接到数据集此处。

布莱恩·特纳在 Unsplash 上的照片
不那么可怕的是,这里有一个数据集,包含了从 1976 年蒙特利尔到 2008 年北京夏季奥运会的所有奖牌获得者。探索数据,看看哪些国家赢得了最多的奖牌。随着时间的推移,有没有表现更好的国家?随着时间的推移会变得更糟吗?
世界幸福报告
项目类型:探索性数据分析
链接到数据集此处。

由 KAL VISUALS 在 Unsplash 上拍摄的照片
幸福指数是一个国家平均“幸福度”的量化指标。这是基于六个因素:经济生产、社会支持、预期寿命、自由、没有腐败和慷慨。
这个数据集包含了 2015 年至 2019 年的 155 个国家及其相关的幸福得分和 6 个因素。我们每年在全球范围内变得更快乐还是更不快乐?哪个洲最幸福?最不开心?六个因素中哪一个对幸福感的影响最大?影响最小呢?
美国的污染
项目类型:可视化
链接到数据集此处。

图片由 Ella Ivanescu 在 Unsplash 上拍摄
该数据集包含美国从 2000 年到 2016 年每天的四种主要污染物(二氧化氮、二氧化硫、一氧化碳和臭氧)的信息。
以下是一些可视化的想法:
- 哪些州是最大的污染者?最少?
- 随着时间的推移,美国污染了多少?他们污染的是 10 多年前还是更少?
- 看看你是否可以创建一个 choropleth 地图来显示地理上的污染水平随着时间的推移!
麦当劳菜单的营养事实
项目类型:探索性数据分析
链接到数据集此处。

该数据集提供了美国麦当劳菜单上每个菜单项的营养分析,包括早餐、牛肉汉堡、鸡肉和鱼肉三明治、薯条、沙拉、苏打水、咖啡和茶、奶昔和甜点。
一般的麦当劳超值餐含有多少卡路里?点烤鸡而不是脆皮真的更健康吗?为了满足日常营养需求,你必须吃的最健康的食物组合是什么?
红酒质量
项目类型:预测建模
链接到数据集此处。

特里·维利迪斯在 Unsplash 上拍摄的照片
该数据集包含各种葡萄酒、其成分和葡萄酒质量的数据。这可能是一个回归或分类问题,取决于你如何设计它。看看你能否预测给定 11 个输入(固定酸度、挥发性酸度、柠檬酸、残糖、氯化物、游离二氧化硫、总二氧化硫、密度、pH、硫酸盐和酒精)的红酒质量。
更多项目灵感,请查看明明艾的博客!
感谢阅读!
如果你喜欢我的工作并想支持我,我会非常感谢你在我的社交媒体频道上关注我:
- 支持我的最好方式就是在媒体T2 上关注我。
- 在推特 这里关注我。
- 点击这里订阅我的新 YouTube 频道 。
- 在 LinkedIn 这里关注我。
- 在我的邮箱列表 这里报名。
- 查看我的网站terenceshin.comT21。
要记住的 7 条数据科学名言
# 2——如果你折磨数据的时间足够长,它会坦白。

阿迪·戈尔茨坦在 Unsplash 上的照片
人们喜欢阅读引语,因为引语是简洁的句子,表达智慧,来自经验,唤醒灵感。我喜欢引用,因为引用足够吸引人,能让我们记住并激发我们的思维到一个更好的地方。
数据科学领域有没有语录?是的,数据科学听起来可能很专业,但数据科学不仅仅是键入代码和创建模型。它在那里多得多;探索、交流、创新、诚实,这只是与数据科学相关的几件事。
作为一名数据科学家,我相当执着。我相信我看到的数字,我得到的统计结果,以及从数据中得到的信息。但是,我也是有意识的人,不是机器人;因此,我的思想是由我读到的名言中的建议形成的。我相信引用可以增强我们的力量,因此我想分享一些我作为数据科学家工作时一直记得的引用。
“受到喜爱的数据往往会保留下来。”库尔特·博拉克
当我们喜欢这些数据,并且它能通过一些选择标准时,你会认为这是一件好事吗?嗯,答案可能是否定的。为什么?因为这可能会导致生存偏差。如果我们从一组不完整的数据中得出一个结论,而这些数据又不符合我们的选择标准,那么这就是一个谬误。
在偏袒的情况下,我们总是试图确保我们的数据存活下来,无论是有意还是无意。我相信当我们热爱具体的数据时,我们会下意识地思考我们想要什么样的结论,这很可怕。即使我们是这个领域的专家,我们也需要对我们的数据保持中立;像我们什么都不知道一样思考,让数据来讲述故事。
当然,现实和理想主义是不同的。我总是试图尽可能做到“数据驱动”,但理想主义有时并不是最好的方法。当面对利益相关者或你的老板时,可能是这个利益相关者喜欢我们删除的数据,他们因此而批评我们。你可能会觉得很糟糕,因为你知道什么是对的,但这是现实;和某人一起工作意味着总有人在更高的位置上。请记住,你可能需要因为你的工作而撒谎,但尽量保持你的头脑没有偏见,你可以走了。
“如果你折磨数据的时间足够长,它就会招供。”罗纳德·科斯
哦,我多么喜欢科斯的这句话。虽然数据讲述了一个故事,但如果我们对它们进行足够的拷问,我们总能得到我们想要的任何结论。在这里,折磨可以指任何事情——删除数据、选择特定的方法、数据包含等。
这句话代表了我们作为数据科学家需要(或愿意)走多远才能得到我们想要的特定结论。对我们来说,在处理数据时多做一点并不总是一件坏事,但这取决于我们的意图。
你对你的数据做这么多是因为你脑子里已经有结论了吗?或者只是因为你想探索数据?
对第一个问题回答“是” 会导致偏差,如果有偏差要小心;这意味着你倾向于拒绝任何东西,除了你的偏见。对第二个问题回答是可能会更好,但是记住先解决你的业务问题。我知道有些人是数据狂人。
这句话贴近日常工作生活中发生的现实。利益相关者可能已经有了他们想要看到的趋势,我们作为数据科学家可能只需要折磨数据,直到他们承认,这样利益相关者就满意了。
"在不充分的数据基础上形成不成熟理论的诱惑是我们职业的祸根"。——夏洛克·福尔摩斯(出自《恐惧之谷》,阿瑟·柯南·道尔爵士)
没错,这是一句警探的名言,没错,这是亚瑟·柯南·道尔爵士笔下的一个虚构人物。然而,这听起来很符合我们的职业,因为我相信数据科学家是其他形式的侦探。
这句话不能更好地解释我们作为数据科学家需要相信什么;在我们有充分的数据之前不要下结论。尽管有些人可能会争论“足够”是如何难以定义的。在这种情况下,我们需要回到可以证明充分性的主题——统计数据(或者你的信念、利益相关者、经验等)。终究要看你的决定)。
在任何情况下,尝试围绕数据充分性构建您的数据科学组合和思维模式。你不想被指控给出错误的结论。特别是对于有抱负的数据科学家;通常情况下,你得到的数据是干净的、经过处理的、足够好的,可以进入下一步。在现实工作中,很少发生。这就是为什么有抱负的数据科学家几乎从来没有机会处理数据不足的问题。我的建议是试着自己收集数据用于练习。
“每个公司的未来都有大数据,每个公司最终都会从事数据业务。”托马斯·海斯·达文波特
我的教育背景是生物学家,过去的职业是研究员。现在,我是一名数据科学家。这似乎是一个剧烈的变化,但事实并非如此。我以前的经历和我现在所做的事情大同小异;只是域和环境不同。
嗯,我选择在数据科学领域,因为我看到未来将类似于上面的引用。迟早,一切都会在数据行业。是必然;我们已经生活在一个数据无处不在的时代,我们需要利用这个时代。最后,早起的鸟儿有虫吃;意味着你需要在更多竞争到来之前尽早离开。虽然早期的虫被鸟抓住了,所以在失败的情况下总有一张安全网。
“天才的数据科学家利用每个人都能看到的数据;有远见的数据科学家利用没人看到的数据。”— 文森特·格兰维尔
这句话代表了我作为一名数据科学家的愿望,我觉得每个人都应该有同样的愿望。虽然天才的数据科学家可以使用明显的数据来回答业务问题,但真正有远见的人看到的是不那么明显的模式;我告诉你,这是真正的天赋。你需要创造力和跳出框框的思维方式,才能抓住看不见的数据。
作为一名数据科学家,我仍然努力练习我的思维方式和技能,以成为有远见的数据科学家。我想说,如果有人真的想进入数据科学领域,试着成为有远见的数据科学家。它把你和其他人区分开来,即使是天才。
“数据不是信息,信息不是知识,知识不是理解,理解不是智慧。”— 克利夫·斯托尔
有些人不知道数据和其他相关术语之间的区别。这是因为不是每个人都想知道数据是什么,它与其他数据有何不同。对我来说,这句话是最好的提醒,让我的心态变得正确。
为什么知道这些差异很重要?这难道不是数据科学家工作中不必要的定义吗?。这与处理数据无关,但与我们的思维方式有关。毕竟,这两个术语之间有着根本的区别。
你可以试着把数据想象成一块石头;它就在那里,一点用也没有。为了从这块石头中得到什么,我们需要把它打磨成钻石。数据是一样的;当我们清理(或转换和探索)时,它就变成了信息。
正如我们所知,钻石很贵,但这是因为我们已经分析了岩石,并决定钻石是有价值的。就像信息一样,如果不经过任何分析过程,它只能作为信息存在,不会成为知识。
仅仅因为我们知道钻石的价格并不意味着我们了解钻石本身;为什么贵?为什么颜色很亮?等等。我们有知识,但我们需要问正确的问题才能完全理解。
最后,我们可能知道关于钻石的一切,但这并不意味着我们可以从中突然致富;我们需要把它卖给正确的人。我们可能理解一切,但只有将这种理解应用到正确的情况下,我们才能发挥所有数据的作用。
“如果我们有数据,让我们看看数据。如果我们只有意见,那就用我的吧。”詹姆斯·洛夫·巴克斯代尔
以上是一个简单的引语,每当我争论的时候,我都喜欢思考它。在论证中,我们来看看数据是否存在。我相信数据,而不是复杂的文字或美丽文字形式的想象。如果数据不能为争论推波助澜,最好还是听从我的意见,因为无论如何什么都无法被证明。最后,如果没有人知道任何事情,就听从任何你认为正确的建议。
结论
作为一名数据科学家,我试着记住以下几段话。是的,它没有那些编程和创建机器学习模型的人那么光荣,但数据科学家仍然是一个人,因此需要一个正确的心态来成为一名伟大的数据科学家。
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
7 种不同的方法来过滤熊猫数据帧
灵活性很重要。
Pandas 是一个非常强大和通用的 Python 数据分析库,它加速了数据分析和探索过程。熊猫的优势之一是它通常提供多种方式来完成一项任务。

在 Unsplash 上由 Waldemar Brandt 拍照
在数据分析过程中,我们几乎总是需要根据条件或通过选择数据帧的子集进行一些过滤。在这篇文章中,我们将通过 7 种不同的方法来过滤熊猫数据帧。
我将在加州住房数据集上做例子,这个数据集在 google colab 的 sample data 文件夹下。
import numpy as np
import pandas as pddf = pd.read_csv("/content/sample_data/california_housing_train.csv",
usecols =['total_rooms','total_bedrooms','population', 'median_income','median_house_value'])df.head()

最常用的方法是像选择列一样在方括号内指定条件。
#1df[df['population'] > 10][:5]

我们只得到人口数大于 1000 的行。
特定列中具有最大值的行可以用 nlargest 函数过滤。
#2df.nlargest(5, 'population')

将显示人口列中具有 5 个最大值的行。
类似地,我们可以选择具有最小值的行。
#3df.nsmallest(5, 'population')

根据列选择最大值或最小值的另一种方法是对行进行排序,然后进行切片。
#4df.sort_values(by='median_income', ascending=False)[:5]

dataframe 根据 median_income 列按降序排序,然后选择前 5 行。
熊猫查询功能是一种非常灵活的过滤方式。它允许将条件指定为字符串。
#5df.query('5000 < total_rooms < 5500')[:5]

在某些情况下,我们可能希望从数据帧中随机选择一个样本。它更像是一个选择而不是过滤,但绝对值得一提。 sample 函数返回指定大小的随机样本。
#6df.sample(n=5)

该示例包含 5 行。也可以指定一个分数。例如,以下代码将返回大小等于原始数据帧 1%的样本。
df.sample(frac=0.01)
我们还可以选择指定的指数范围。就像 sample 函数一样,这个方法更像是一个选择,而不是基于条件的筛选。但是,对于顺序数据(如时间序列),可以认为是一种过滤方式。
我们将使用的方法是 iloc ,它返回指定索引范围内的行或列。
#7df.iloc[50:55, :]

返回索引在(50:55)范围内的行。我们可以选择只选择一些列。
df.iloc[50:55, :3]

您可能已经注意到返回行的索引没有改变。它们仍然具有与原始数据帧中相同的索引。如果您想在过滤后创建一个新的数据帧,您可能想要重置索引,这可以通过 reset_index 函数来实现。
#without reset_indexdf_new = df.query('total_rooms > 5500')
df_new.head()

#with reset_indexdf_new = df.query('total_rooms > 5500').reset_index()
df_new.head()

我们已经介绍了过滤数据帧或选择其一部分的不同方法。尽管许多方法都可以完成相同的操作,但是由于语法或其他原因,您可能更喜欢其中一种方法。
拥有完成一项任务的灵活性和多种方式总是好的。而且,熊猫提供了大量的食物。
感谢您的阅读。如果您有任何反馈,请告诉我。
7 枚蟒蛇皮复活节彩蛋
在家自娱自乐的无数方式

在冠状病毒爆发期间,我们大多数人都在家工作。你们中的许多人可能已经厌倦了整天呆在家里。我能感受到你。
Python 可能只是你构建项目、模拟和自动化的一个工具,它可能真的很有趣。
感谢令人惊叹的 Python 社区,我们可以在这种开源语言中找到许多隐藏的功能和复活节彩蛋。以下是其中的 7 个。
1.最简单的“Hello World”
学习编程语言要做的第一件事就是在屏幕上打印出“Hello World”。用 Python 怎么做 Hello World?print('Hello World!')?
原来 Python 开发者藏了一个模块,只要导入这个模块就可以做 Hello World!试试这个:
>>> import __hello__
Hello World!
那行代码只包含 16 个字符,包括空格键!这可以说是最简单的 Hello World 程序之一。
请注意,您不能在 Python 程序中重新导入模块,因此您可以在一次运行中打印一次消息。但我想这可能意味着一些深刻的东西…
2.Python 的禅
这是人教版 20 中提出的。PEP 代表 Python 增强提案。
Python 是你最喜欢的语言吗?你喜欢 Python 的什么?是设计的问题吗?Python 设计的指导原则可以用 20 条格言来描述,您可以通过以下方式找到其中的 19 条:
>>> import this

安妮·斯普拉特在 Unsplash 上的照片
失踪的那个呢?我想你不可能知道世界上的一切。以下是前三句格言:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
你不得不感谢开发人员为制作这样一种优雅且人类可读的编程语言所付出的努力。
这也是迄今为止唯一一个在 Python 开发者指南中被称为“复活节彩蛋”的“官方”复活节彩蛋。
3.this.py
还记得 Python 之禅的前 3 行吗?
当你深入挖掘,找到模块文件this.py时,它是我见过的最漂亮、最显式、最简单的代码。
点击查看文件。干得好。
4.体验反重力
你可以用 Python 中的一行代码体验反重力!
import antigravity
真的!试试吧!请记住,你可能被困在外太空,花几个小时浏览 xkcd 网络漫画。

freestocks 在 Unsplash 上拍摄的照片
5.吊带
与许多其他编程语言不同,Python 在构造语句、函数和循环时并不真正使用花括号{}。但是他们将来可能会改变。
__future__模块包含不兼容的变更,这些变更将在可预见的将来强制执行。例如,在 Python 2.6 或 2.7 中从__future__导入print_function允许你创建一个带参数print()的函数,就像在 Python 3 中一样。
让我们从__future__开始看看牙套是如何工作的:
>>> from __future__ import braces
SyntaxError: not a chance
打得好。
6.混杂
无穷大和 NaN 的散列。
>>> hash(float('inf'))
314159
>>> hash(float('nan'))
0
不知怎么的,我在 Reddit 上找到了这个复活节彩蛋。

老实说,我期待着生命、宇宙和一切的答案。
7.巴里叔叔
关于运营商选择的争论已经持续了 四两 之久。让我们解决这个问题。
这是人教版 401 中提出的。你可能会感觉到将要发生什么。
一位知名的 Python 开发者 Barry Warsaw(又名 Barry 大叔)被‘选中’成为终身友好的语言大叔,简称 FLUFL。伟大的缩写。
他做了一些“修改”,用菱形算子<>替换不等式算子!=。
如果你同意 Barry 叔叔的观点,你可以导入这个有趣的库,<>语法将变得有效,而!=将导致语法错误。
>>> from __future__ import barry_as_FLUFL>>> 0 != 1
SyntaxError: with Barry as BDFL, use '<>' instead of '!='>>> 0 <> 1
True
>>> 1 <> 1
False
愚人节快乐!可怜的巴里……我向你保证上面的例子没有打字错误。

照片由 Agnes Horváth 在 Unsplash 上拍摄
这个列表还可以继续下去,但是我会在这里停下来,让您自己去探索它们。
感谢阅读!如果您想收到我的新文章的更新,您可以使用下面的滑块订阅我的时事通讯:
如果你还在读这篇文章,你可能对 Python 感兴趣。以下文章可能有用:
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 初学者应该避免的 4 个常见错误
我很艰难地学会了,但你不需要
towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628) [## 停止在 Python 中滥用*args 和**kwargs
他们会回来缠着你
medium.com](https://medium.com/better-programming/stop-abusing-args-and-kwargs-in-python-560ce6645e14)
注意安全。
改进数据科学工作流程的 7 种简单方法
作为一名数据科学家,我学到了一些技巧

赢得数据科学比赛并不容易,但我们肯定有办法改进我们实践数据科学的方式。在这篇博客中,我们将讨论 7 种可以快速改善数据科学工作流程的简单方法。这些是我离开大学后艰难地学到的技巧。希望这可以帮助您组织您的环境,更好地编码,并为您的数据科学项目找到更合适的堆栈!
1.组织您的项目目录
没有什么比拥有一个Untitled.ipynb到Untitled9999.ipynb的乱七八糟的文件夹,文件夹里到处散落的数据 csv,还有一堆.ipynb_checkpoints一样的缓存更糟糕的了。建立项目文件夹的第一步会让你的日常工作流程更加顺畅。一些有助于建立有序文件夹的常用工具有:
- Cookiecutter :帮助你建立标准文件夹目录的 Python 包。查看这里的一个受 cookiecutter 启发的插件,它可以直接从你的 Jupyter 开发环境中访问。
- 迷你巨蟒:巨蟒的一个准系统版本。如果您不需要 Anaconda 启动程序附带的 GUI 或其他应用程序,Miniconda 是一个不错的选择。
- requirements.txt 或 environment.yml:这有助于立即重新创建开发环境
- 。gitignore file:这有助于通过忽略不需要推送到 repo 的文件来保持 git 存储库的整洁。例如临时文件、笔记本检查点、venv 文件夹等。
关于这个话题的更多信息,请点击这里:
自定义 Jupyter 扩展,帮助组织您的项目文件夹
towardsdatascience.com](/cookiecutter-plugin-for-jupyter-easily-organise-your-data-science-environment-a56f83140f72)
2.清理您的 Python 环境
大多数 data science medium 博客帖子会告诉你,为你的项目创建一个虚拟环境,但很少告诉你保持环境整洁的重要性。通常,当您创建开发环境时,会安装一堆生产环境不需要的 IPython 相关包。要使您的工作流程更加顺畅,您可以:
- Multiple requirements.txt 或 enviornment.yml:对 dev 和 prod 进行单独的配置可能是有用的,但是当您添加新的包时,您需要更新这两者
- pipreqs :一个 Python 包,通过只保留您的代码通过运行
pipreqs /path/to/your/project/folder导入的包来清理您的 production requirements.txt。 - pipdeptree :一个 Python 包,通过运行
pipdeptree帮助您理解 Python 环境的依赖性。
关于这个话题的更多信息,请点击这里:
这个博客话题想法我煮了很久了。我做了大量的搜索,阅读和尝试,同时致力于…
medium.com](https://medium.com/python-pandemonium/better-python-dependency-and-package-management-b5d8ea29dff1)
3.更好地利用 Python 的标准库
不要重新发明轮子!很多时候,当您觉得有一些笨拙的代码需要编写时,您会重新创建 Python 提供的一些内置函数。
示例 1: collection.Counter用于统计出现次数
# instead of this
counter = dict()
for item in my_list:
counter[item] = counter.get(item, 0) + 1# do this
from collections import Counter
counter = Counter(my_list)
例 2: itertools.chain.from_iterable用于连接列表列表
# instead of this
joined_list = []
for sub_list in my_list_of_list:
joined_list.extend(sub_list)# do this
from itertools import chain
joined_list = list(chain.from_iterable(my_list_of_list))
例 3: collections.namedtuple作为一个不可变类的替换
# instead of this
class Color:
def __init__(self, r, g, b):
self.r, self.g, self.b = r, g, b# or this
RED, GREEN, BLUE = 0, 1, 2
c = (0, 255, 120) # lime green
red_value = c[RED]# do this
from collections import namedtuple
Color = namedtuple('Color', ['r', 'g', 'b'])
c = Color(0, g=255, b=120) # lime green
red_value = c.r
示例 4: bisect.insort用于维护排序列表
# just do this
from bisect import insort
my_sorted_list = []
for i in (1, 324, 52, 568, 24, 12, 8):
insort(my_sorted_list, i)
另一个常见的陷阱是使用过度的数据结构。例如,如果一旦定义了一个列表,你就不改变它的内容,那么一个元组会节省你很多内存;或者,如果您只使用列表的第一个或最后一个元素,那么请使用 deque。
关于此主题的更多信息:
[## Python 标准库- Python 3.9.0 文档
虽然 Python 语言参考描述了 Python 语言的确切语法和语义,但是这个库…
docs.python.org](https://docs.python.org/3/library/)
4.包装笔记本电脑时简化您的代码
我们自己都知道,就可读性、可伸缩性和可维护性而言,开发笔记本是世界上最糟糕的脚本之一。在将笔记本打包到 Python 包中时,通常有一些经验法则:
-
识别重复的代码片段,并将它们分组到一个函数中:例如,我不用每次都编写一个正则表达式来进行关键字匹配,而是使用下面的代码片段:
-
去掉多余的单元格、线和变量:对,我们说的是
df_temp = df.copy()、gc.collect()、temp = df.some_column.unique() -
将所有的函数和导入移到笔记本的开头:我在大学的时候,C 给我上了一堂很好的课,那就是预先定义你需要的所有东西,你永远不需要担心去哪里找它们
-
按执行顺序解开并排序单元格:你最不想要的就是记住你是什么时候从笔记本的最后一个单元格跳到第一个单元格的
5.尽可能继承现有的抽象类
当涉及到组织代码时,面向对象编程和函数式编程将永远是一场争论。但是底线是,使用任何一个都比什么都不用要好。说到数据科学,有许多以 OOP 方式组织的包,例如 sci-kit learn、nltk、spacy 等等。如果你设法将你的脚本打包成扩展抽象类的类,这将有助于更好地组织你的代码,并允许与你的数据科学管道更好地集成。
例如,根据我以前的 regex 表达式构造片段,我想构造一个标记器,只返回函数捕获的标记。通过继承 nltk 的TokenizerI,我的RegexpEntityTokenizer现在与 say nltk 的PunktSentenceTokenizer具有相同的结构。这意味着我现在可以将我的自定义标记器传递给 sklearn Pipeline来实现无缝工作流。
关于这个话题的更多信息,请点击这里:
[## 面向数据科学家的面向对象编程:构建您的 ML 估计器
通过构建自己的 Scikit-learn-like,在机器学习环境中实现一些核心的 OOP 原则…
towardsdatascience.com](/object-oriented-programming-for-data-scientists-build-your-ml-estimator-7da416751f64)
6.停止腌制一切
是的,我知道。腌制数据框等物品方便;你基本上可以将你的 python 脚本中的所有东西序列化到一个.pkl文件中。然而,pickle 的便利性伴随着几个薄弱环节:
- 不是为速度而设计的 : Pickle 是为任何对象而设计的,这使得它比其他更专业的序列化要慢
- 不安全:解包一个 pickle 文件可以执行一些已经隐藏在 pickle 文件中的任意代码。想象一下,如果你的前任为你准备了一些生日恶作剧。
- 不可移植:不同版本的 Python 之间并不是所有的 pickled 数据都兼容。
所以记住,pickle 不是保存数据和进度的唯一方法。以下是一些备选方案:
- cPickle :底线,看看 cPickle,这是用 C 实现的 Pickle,比 Pickle 快 1000 多倍。
- JSON : JSON 序列化你的数据比 pickle 快很多。最重要的是,JSON 使得在 Python 之外的文本编辑器中存储和编辑字典(或者配置模型的 kwargs)成为可能。
- NumPy :如果你正在序列化一个定义明确的结构,你可以把它放进
numpy.ndarray,NumPy 的np.save和np.memmap是一些更快的选择 - Joblib :对于一直在开发机器学习模型的人来说,这应该并不陌生。如果你的对象包含大的
np.ndarray,那么 joblib 可能适合你。它的界面与 pickle 基本相同,但更简单一些,所以你使用它应该没有问题。但是,请注意 joblib 与 pickle 有相同的安全问题。 - h5py :对于之前玩过 say tensorflow 或者 keras 的人来说并不陌生。HDF5 阵列可以存储大量压缩数字数据。的确,拥有一个包含压缩数据的层次数据结构意味着一点学习曲线,也意味着查询数据集有点困难;但另一方面,您将从中获得非常高效的数据 I/O。
7.考虑使用数据库
最后但同样重要的是,这将是一个巨大的飞跃,并有可能改变你的游戏计划。但是相信我,在自己经历了转换之后,是值得的。查看您是否经历过以下任何情况:
- 在你巨大的熊猫数据帧上不能再加速你的 python 脚本了
- 保存和加载数据集的时间越来越长
- 您的所有数据都位于同一位置,无论是原始数据、外部数据还是经过处理的数据
- 新数据不断出现,并保存为 CSV 格式
这些都是数据库将使你的生活变得容易得多的迹象。一旦有了数据库,SQL 会帮你做很多繁重的工作。很多时候,I/O 是我的 Python 脚本的瓶颈。通过将处理向数据靠近一步,读写速度得到了不同数量级的提高。最棒的是,无论你的需求是什么,你总能找到合适的数据库:MySQL、PostgreSQL、MongoDB、CouchDB 等。
关于这个话题的更多信息,请点击这里:
如何开始接触数据库世界?
towardsdatascience.com](/databases-101-introduction-to-databases-for-data-scientists-ee18c9f0785d)
出发前
这些是我的一些关于数据科学和 python 的中型博客,您可能想看看:
是时候停止过于依赖。iterrows()和。应用()
towardsdatascience.com](/efficient-implementation-of-conditional-logic-on-pandas-dataframes-4afa61eb7fce) [## 为数据科学建立必要的 Jupyter 扩展
自定义 Jupyter 扩展,帮助组织您的项目文件夹
towardsdatascience.com](/cookiecutter-plugin-for-jupyter-easily-organise-your-data-science-environment-a56f83140f72) [## Python 中高效的根搜索算法
在 Python 中实现高效的寻根和优化搜索算法
towardsdatascience.com](/mastering-root-searching-algorithms-in-python-7120c335a2a8)
好了
希望您已经发现这些提示对完善您的数据科学工作很有用。让我知道如果评论你如何找到这些技巧。
再见!
[## Louis Chan-FTI Consulting | LinkedIn 数据科学总监
雄心勃勃的,好奇的和有创造力的个人,对分支知识和知识之间的相互联系有强烈的信念
www.linkedin.com](https://www.linkedin.com/in/louis-chan-b55b9287/)
7 个必不可少的人工智能 YouTube 频道
如何跟上最新最酷的机器学习进展

Kon Karampelas 在 Unsplash 上拍摄的照片
几年来,机器学习一直是最热门的话题之一。每个人都在谈论它;各种规模的组织都在采用这些技术。
《哈佛商业评论》将数据科学家的角色描述为“21 世纪最性感的工作”。它们对商业决策至关重要,而且需求量很大。
机器学习研究的支出正在增长,从 2017 年的 15.8 亿美元增长到 2024 年的 208.3 亿美元。在学术领域,研究人员每天在 Arxiv 上发布大约 100 篇新的机器学习论文。
每 15 分钟一篇论文!


左:一堆研究,文章,高亮文章[ 来源 ] |右:Arxiv 上每天 100 篇新的机器学习论文[来源]
这张图表显示了机器学习的兴奋程度和进展。谁能跟上这一领域的发展呢?🤔
在这篇文章中,我将介绍分享我们兴奋的七个 YouTube 频道。这些频道旨在揭示机器学习领域最新、最酷的发展。
我们开始吧。
#1.两份会议记录文件


名单上的第一个,是我最喜欢的,由卡罗利·佐尔奈-菲尔撰写的两分钟论文。他的视频很有趣,很吸引人,看起来绝对是一种享受。他挑选并评论最令人兴奋的研究进展。DotA 游戏上的 OpenAI,检测 DeepFake,模拟物理,或者克隆你的声音。他在他的频道里拥有一切。
Károly 将描述他正在回顾的研究中有哪些精彩之处。即使是最先进和最新的人工智能研究,观看他的视频也不需要计算机科学博士学位。他的演示非常清晰,没有机器学习知识的人也能理解。
既然这是我最喜欢的频道,那就给你看其中一个视频, OpenAI 玩捉迷藏,破游戏 !🤖我相信你会喜欢的。
讲的是两个 AI 团队(隐藏者和寻求者)互相玩捉迷藏。当一方学会了新的策略,另一方就会适应反击。代理人一直玩到他们学会滥用游戏物理引擎的程度。太棒了。
YouTube: 两分钟论文
#2.莱克斯·弗里德曼


Lex Fridman 采访人工智能行业的超级明星。埃隆·马斯克、扬·勒昆、约舒阿·本吉奥、埃里克·施密特?是的,莱克斯已经采访过他们了。
这些采访可以让你对未来有所了解,因为他们会分享他们正在做的事情。利用人工智能找到癌症的治疗方法;Adobe 在做 AI;Neuralink 新的 iRobot 真空能力:YouTube 算法。你可以找到大量可供选择的主题。
莱克斯·弗里德曼是麻省理工学院的研究科学家。他进行深度学习和自动驾驶汽车讲座。如果你对参加麻省理工学院的深度学习讲座感兴趣,Lex 也会在他的频道上分享它们。
YouTube: 莱克斯弗里德曼
#3.亨利·艾实验室


亨利艾实验室。这个渠道丰富!自然语言处理,强化学习,生成对抗网络,弱监督学习。涵盖了所有最热门的话题。
亨利总结了谷歌和脸书等公司的研究实验室发表的新论文。如果你想跟上人工智能的最新发展,这绝对有用。他概述了最新的研究课题和现实世界的应用,你不必自己消化整篇论文。
YouTube: 亨利·艾实验室
#4.ArXiv 见解


研究论文可能有点枯燥&需要一段时间来阅读,对吗?史云光·斯廷布鲁格将为您提供帮助!他旨在简化和解释机器学习论文中的技术细节。
在撰写本文时,该频道只有 11 个视频。但是他的高质量和可靠的内容已经吸引了 4.5 万订户。他将复杂的主题,如生成对立网络,分解成一步一步的微小解释。
在观看他的视频时,我在想,“伙计,我多么希望我的讲师能像他一样解释概念。
YouTube:ArXiv 洞见
#5.扬尼克·基尔彻


Yannic Kilcher 重点讲解深度学习研究论文。他介绍了这篇论文,并描述了它背后的新颖性。他一丝不苟地给你读论文,他像讲故事一样讲。他涵盖了关于深度学习架构、自然语言处理和强化学习的主题。
细节的水平令人难以置信。扬尼克把一本厚厚的纸分成几部分,一段一段地揭示每个想法。他解释并在屏幕上涂鸦,引导你思考整个过程。当有论文没有涉及的概念时,他会参考其他资源来揭示论文之外的任何概念。
在视频的最后,感觉我已经对论文有了充分的理解,就好像我已经通读了至少三遍。我多么希望他能评论我正在阅读的论文。
YouTube: 扬尼克·基尔彻
#6.利奥·伊西克多根


利奥·伊西克多根
Leo Isikdogan 展示了将简明的研究课题转化为实际的、真实的应用。他涉及机器学习和计算机视觉的主题。他还创建了指导性的机器学习教程。
Leo 是英特尔的一名研究员,他在频道中介绍了自己的工作。我喜欢的一项研究是利用深度神经网络进行眼神交流矫正。在他的视频中,他解释说,在通话中保持目光接触需要看着摄像头,而不是屏幕。他的工作是纠正凝视,提高视频会议体验的质量。
我喜欢研究有现实世界的应用和影响。
这个频道对任何开始深度学习的人来说也很棒,有很多东西可以学习。查看他的频道中的播放列表、深度学习速成系列课程和tensor flow 编码实践课程。
YouTube: 利奥伊西多根
#7.卡格尔


最后同样重要的是, Kaggle ,你的数据科学之家。这是最大的数据科学社区。用户可以在 Kaggle 平台中找到数据集和代码。他们可以发布笔记本来共享代码、协作和相互学习。有现金奖的比赛;竞争是一种很好的学习方式,现金绝对是取得好成绩的巨大动力。
如果说 Kaggle 是你做和学的地方,那么 Kaggle YouTube 频道就是你看和学的地方。
有关于深度学习、构建仪表板和数据处理的“how-to”编码教程。他们有关于如何解决数据科学问题的现场编码会议。
关于最新 NLP 研究的更新,有一个播放列表, Kaggle 阅读小组。她阅读和讨论 NLP 的研究论文。她会向你解释每一个段落,图表,代码,数学方程式。如果你是一名新的研究人员或刚接触学术论文,观看这些视频,你将学会如何剖析论文。
YouTube:ka ggle
这就对了。我希望你会喜欢这些频道。如果你有渠道推荐,请在评论中告诉我(和其他读者)。
如果机器学习让你兴奋,那就跟着我上 Medium ( 顺口溜);因为我会写更多关于机器学习的应用。特别是在医疗保健中,对视网膜和脑机接口的影响。我也开发原型来展示机器学习。
阅读介质上的顺口溜。博士生|阿里巴巴|医疗保健中的机器学习| TDS 副主编|…
medium.com](https://medium.com/@jinglesnote)
我将引用罗伊·班尼特的话来结束我的演讲。
过上成功而充实的生活有五件重要的事情:永远不要停止梦想,永远不要停止相信,永远不要放弃,永远不要停止尝试,永远不要停止学习。
40%的吸尘器,40%的看门人,20%的算命师。
towardsdatascience.com](/data-scientist-the-dirtiest-job-of-the-21st-century-7f0c8215e845) 


用 Jupyter 笔记本写作的 7 个基本技巧
数据科学
第一篇数据科学文章指南

**Table of Contents**[**Introduction**](#792b)1\. [Help, shortcuts, and number lines](#7358)
2\. [Theme](#78aa) and [Font & font size](#4f95)
3\. [Markdown](#53a8)
4\. [Jupyter Notebook LaTeX](#36a1)
5\. [Jupyter Notebook LaTeX equation numbering & alignment](#ece0)
6\. [Two columns](#231d)
7\. [Page break](#28da)
8\. [Footnotes](#699a)
9\. [Writing tools](#b5ba)
10\. [How to print out from Jupyter Notebook without code blocks](#87e5)
11\. [Exporting to an MS Word file](#13be)[**Conclusion**](#e6f0)
介绍
Jupyter Notebook 是创建和共享包含代码、可视化和文本的文档的好工具。在本文中,我将介绍使用 Jupyter Notebook 撰写第一篇数据科学文章的有用技巧。
如果你想看 Jupyter 笔记本入门指南,请阅读这篇文章。
我们开始吧!
帮助、快捷键和数字行
快捷方式会加快你的写作速度。按下h切换键盘快捷键屏幕。你可以通过按⌘⇧f.看到所有的命令。我经常使用下面的快捷键,如果你能记住它们会很有用。

Mac 和 Windows 键盘符号。摄影:冈田新一

Mac Jupyter 笔记本快捷方式。摄影:冈田新一
行号
在你的笔记本上放上行号是个好主意。当你有一个错误,很容易找到线。除了上述快捷方式,您还可以使用视图>切换行号。

Jupyter 笔记本单元格中的行号。摄影:冈田新一
主题
为你的 Jupyter 笔记本设计一个漂亮的 Jupyter 主题就像一个舒适的枕头。你将花很多时间用 Jupyter 笔记本写作,让我们为你的口味找一个好的主题,并修改字体大小。
让我们安装 JupyterThemes 。打开您的终端并键入以下内容。对于 PIP 用户;
pip install jupyterthemes
pip install --upgrade jupyterthemes
对于康达用户;
conda install -c conda-forge jupyterthemes
有九个主题,chesterish,3 年级,ggruvboxd,gruvboxl,monokai,oceans16,onedork,solarizedd,solarizedl。

Jupyter 笔记本主题。摄影:冈田新一
如果你想使用 ocean16,请在 Jupyter 笔记本单元格中输入以下内容,然后按 shift+enter。
!jt -t oceans16
当你改变一个主题时,你需要刷新你的浏览器!
如果您想重置主题,请使用以下代码。
!jt -r
[## 如何在 Docker 上运行 Jupyter 笔记本
不再有 Python 环境和包更新
towardsdatascience.com](/how-to-run-jupyter-notebook-on-docker-7c9748ed209f) [## 手把手的 Jupyter 笔记本黑客
您应该使用的技巧、提示和快捷方式
towardsdatascience.com](/hands-on-jupyter-notebook-hacks-f59f313df12b)
字体和字体大小
方法一
下图显示了字体的位置。

Jupyter 笔记本字体名称及其选项名称。
下图显示了字体大小。

Jupyter 笔记本字体大小名称及其选项名称。
如果您想要更改文本单元格的字体和字体大小,您可以在单元格中键入以下内容,然后按 shift+enter。
!jt -t oceans16 -tf merriserif -tfs 14 -nf ptsans -nfs 14
不要忘记刷新浏览器以使更改生效。
你可以在这里找到所有的字体类型。
让我们试试不同的设置。
!jt -t grade3 -tf firacode -tfs 13 -mathfs 110 -fs 13 -N -T
方法二
如果你不想改变主题,但想改变字体大小和字体,那么你需要改变 Jupyter 笔记本的 CSS。在编辑器中打开.jupyter/custom/custom.css。如果没有编辑器,请安装 VS 代码。
并将以下内容粘贴到文件中。你可以把font-size:130%改成你喜欢的任何数字。
div#notebook p, div#notebook{
font-size: 130%;
line-height: 125%;
}.rendered_html pre, .rendered_html table{
font-size:130%;
line-height: 125%;
}.CodeMirror, .CodeMirror pre, .CodeMirror-dialog, .CodeMirror-dialog .CodeMirror-search-field, .terminal-app .terminal {
font-size: 130%;
line-height: 125%;
}
保存文件并重新加载页面以查看更改。
方法三(仅针对代码单元格)

这可能是最容易的代码单元字体。这不适用于减价单元格。
在 Nbextensions 中,您可以启用代码字体大小。
从设置到描述性统计
towardsdatascience.com](/beginners-guide-to-jupyter-notebook-8bb85b85085) [## 使用 Jupyter 笔记本进行版本控制
Jupytext 循序渐进指南
towardsdatascience.com](/version-control-with-jupyter-notebook-b9630bc5996e)
降价
Markdown 是一种具有纯文本格式语法的轻量级标记语言。(维基百科)
如何将单元格改为降价
将单元格更改为 markdown 的一种方法是从下拉列表中选择 Markdown。

单元格选项。摄影:冈田新一
另一种方法是使用m快捷键,选中一个单元格后。如果您正在单元格中键入m、y转换为代码和r转换为原始数据,您可能需要按 escape 键。
标题
使用#表示 H1,##表示 H2 等。
# Main title
## Sub title
### H3 title
#### H4 title
上面将打印出以下内容。

Jupyter 笔记本降价标题示例。摄影:冈田新一
目录
您可以使用*或-来创建一个嵌套的无序列表,并将数字用于有序列表。
- main 1
- sub 1
- sub 2
- main 2
- main 31\. Main list 1
2\. Main list 2
- Sub list 2-1
- Sub list 2-2
3\. Main list 3
以上产生了以下内容。

Jupyter 笔记本降价清单示例。摄影:冈田新一
链接
像[Link name](url)一样,降价链接在链接文本后立即使用括号。
[Google]([https://www.google.com](https://www.google.com))
上面的代码产生, Google 。
图像
Markdown image 语法类似于 Links 语法,但是您可以在它前面加上一个感叹号,如。
 "Logo Title Jupyter Notebook logo")
上述降价产生:

Jupyter 笔记本图像示例。
桌子
要添加表格,请使用三个或更多连字符创建每列的标题,并使用竖线(|)分隔每列。您可以选择在表格的任意一端添加管道。使用:---:将一列居中,:---向左对齐。
Id | Syntax | Description
--|:---------:|:-----------:
1|Header | Something very long long long here
2|Long long long paragraph | Text
渲染输出如下所示:

Jupyter 笔记本降价表示例。摄影:冈田新一
如果你想了解更多关于减价的信息,请阅读本页。
使用 Jupyter 笔记本和 JupyterLab 让您的工作流程更加高效
towardsdatascience.com](/stepping-into-intermediate-with-jupyter-f6647aeb1184) [## 如何创建一个有吸引力的泡泡图
从 Github repo 抓取数据的分步指南
towardsdatascience.com](/how-to-create-an-attractive-bubble-map-5cf452c244e9)
Jupyter 笔记本乳胶
LaTeX 在学术界被广泛用于多个领域的科学文献的交流和发布。
- 您需要用美元($)符号将它们括起来。
若要向左对齐,请使用一个美元(\()符号。`\)P(A)=\frac{n(A)}{n(U)}$`

Jupyter 笔记本乳胶示例左对齐。摄影:冈田新一
- 要居中对齐,请使用双美元($$)符号。
$$P(A)=\frac{n(A)}{n(U)}$$

Jupyter 笔记本乳胶例子,对齐中心。摄影:冈田新一
- 使用
\limits的\lim、\sum和\int为每个标志的顶部和底部添加限制。 - 使用反斜杠来转义 LaTeX 特殊单词,如数学符号、拉丁单词、文本等。
下表显示了基本的 LaTeX 命令。

Jupyter 笔记本乳胶例子。摄影:冈田新一
你能写出下列乳胶中平均值的方程式吗?

Jupyter 笔记本乳胶方程的例子。摄影:冈田新一
矩阵

Jupyter 笔记本乳胶矩阵的例子。摄影:冈田新一
**cases** 为分段函数
用左花括号渲染多行。
$$
\begin{align}
\text{Probability density function:}\\
\begin{cases}
\frac{1}{b-a}&\text{for $x\in[a,b]$}\\
0&\text{otherwise}\\
\end{cases}
\\
\text{Cumulative distribution function:}\\
\begin{cases}
0&\text{for $x<a$}\\
\frac{x-a}{b-a}&\text{for $x\in[a,b)$}\\
1&\text{for $x\ge b$}\\
\end{cases}
\end{align}
$$
上述代码产生以下内容。

Jupyter 笔记本乳胶分段函数的例子。摄影:冈田新一
Jupyter 笔记本乳胶方程式编号和对齐
方程式编号
对于方程编号,需要加上[jupyter_contib_nbextensions](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/install.html#install-the-python-package)。
PIP
如果你用pip安装了 Jupyter 笔记本,你可以用 Jupyter 笔记本的电池安装[jupyter_contib_nbextension](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/install.html#install-the-python-package)。
!pip install jupyter_contrib_nbextensions
然后需要安装 CSS。
!jupyter contrib nbextension install --user
或者从没有!的终端。
pip install jupyter_contrib_nbextensions
康达
如果您的安装是通过 Conda,那么从 Jupyter 笔记本手机或终端运行以下程序。
jupyter contrib nbextension install --user
刷新您的浏览器,您应该在主菜单中看到 Nbextensions 选项卡。

Jupyter 笔记本 nb 扩展标签。摄影:冈田新一
单击 Nbextensions 选项卡并搜索公式自动编号。单击该框以启用扩展。

Jupyter 笔记本方程自动编号。摄影:冈田新一
刷新浏览器并尝试以下方程以查看方程编号。请将以下内容添加到减价单元格中。它在 1 到 3 的末尾添加方程式编号。你需要从\begin{align} and end with \end{align}开始。
$$
\begin{align}
{x} = \sigma(y-x) \\
{y} = \rho x - y - xz \\
{x+y+z} = -\beta z + xy
\end{align}
$$

Jupyter 笔记本乳胶方程编号示例。摄影:冈田新一
换行和标记
刷新浏览器并尝试以下方程以查看方程编号。您可以使用\tag{}添加方程式编号。双反斜杠\\代表一个新行。你需要用\begin{align} and \end{align}把所有方程括起来。
$$
\begin{align}
{x} = \sigma(y-x) \tag{1-1}\\
{y} = \rho x - y - xz \tag{1-2}\\
{x+y+z} = -\beta z + xy \tag{1-3}
\end{align}
$$

Jupyter 笔记本乳胶方程编号示例使用对齐和制表符。摄影:冈田新一
等式对齐
右对齐
正常情况下,等式与上面的示例一样向右对齐。
等号对齐
通过添加&符号,等式将在该点对齐。例如,如果你想在等号处对齐等式,使用&=。
$$
\begin{align}
{x} & = \sigma(y-x) \tag{3-1}\\
{y} & = \rho x - y - xz \tag{3-2}\\
{x+y+z} & = -\beta z + xy \tag{3-3}
\end{align}
$$

Jupyter 笔记本乳胶方程对齐等号。摄影:冈田新一
左对齐
$$
\begin{align}
& {x} = \sigma(y-x) \tag{4-1}\\
& {y} = \rho x - y - xz \tag{4-2}\\
& {x+y+z} = -\beta z + xy \tag{4-3}
\end{align}
$$

Jupyter 笔记本乳胶方程左对齐。摄影:冈田新一
混合对齐
如果你想让文本靠左对齐,公式居中对齐,你可以使用下面的方法。
$
\text{Normal distribution} \\
$
$$
X \sim N(\mu,\sigma^2) \\
$$
$
\text{Probability density function} \\
$
$$
\frac{1}{\sigma \sqrt{2 \pi}}e^{-\frac{(x- \mu)^2}{2 \sigma^2}}
$$

Jupyter 笔记本 LeTeX 方程混合对齐。摄影:冈田新一
两列
如果你想创建两列布局,你可以试试这个方法。
请将以下内容复制并粘贴到其中一个单元格中。
<div class="row">
<div class="column">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas quis nunc pulvinar urna faucibus tincidunt ut vestibulum ligula. Sed placerat sollicitudin erat, quis dapibus nibh tempor non.
<br/>
Id | Syntax | Description
--|:---------:|:-----------:
1|Header | Something here
2|More here | Text
</div>
<div class="column">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas quis nunc pulvinar urna faucibus tincidunt ut vestibulum ligula. Sed placerat sollicitudin erat, quis dapibus nibh tempor non.
<br/>
$$
\begin{align}
{x} & = \sigma(y-x) \tag{3-1}\\
{y} & = \rho x - y - xz \tag{3-2}\\
{x+y+z} & = -\beta z + xy \tag{3-3}
\end{align}
$$
</div>
</div>
接下来,您需要向其中一个单元格添加 CSS 样式。(这包括“如何在没有代码块的情况下从 Jupyter 笔记本中打印”中的代码,您可以在本文的后面找到它。)
%%html
<style>
[@media](http://twitter.com/media) print {
* {
box-sizing: border-box;
} .row {
display: flex;
} /* Create two equal columns that sits next to each other */
.column {
flex: 50%;
padding: 10px;
}
div.input {
display: none;
padding: 0;
}
div.output_prompt {
display: none;
padding: 0;
}
div.text_cell_render {
padding: 1pt;
}
div#notebook p,
div#notebook,
div#notebook li,
p {
font-size: 10pt;
line-height: 115%;
margin: 0;
}
.rendered_html h1,
.rendered_html h1:first-child {
font-size: 10pt;
margin: 3pt 0;
}
.rendered_html h2,
.rendered_html h2:first-child {
font-size: 10pt;
margin: 3pt 0;
}
.rendered_html h3,
.rendered_html h3:first-child {
font-size: 10pt;
margin: 3pt 0;
}
div.output_subarea {
padding: 0;
}
div.input_prompt{
display: none;
padding: 0;
}}
这里我用的是 CSS flexbox 。Flexbox 是一种创建多列的现代方法。您需要执行单元格,并使用浏览器的打印来查看效果。

两列
分页

原始 NBConvert
创建一个原始的 NBConvert 单元格并添加以下代码。
<div style="page-break-after: always;"></div>
转到 Jupyter 笔记本,文件,打印预览。

打印预览
然后转到浏览器的文件、打印或 Cmd+p 来打印页面。
脚注
将以下内容添加到单元格中。
This is a example of footnote[<sup>1</sup>](#fn1). And this is another footnote[<sup>2</sup>](#fn2).
在另一个单元格中,添加以下内容。
<span id="fn1"> Your footnote 1 here.</span>
<span id="fn2"> Your footnote 2 here.</span>
通过点击上标,它将跳转到它的脚注。
书写工具
在发表你的文章之前,我总是需要检查语法和单词。
- 语法上
截至撰写本文时,Grammarly 还不能在浏览器上运行。所以你必须复制粘贴到的网络应用或者的桌面应用。
- 海明威编辑
检查完语法后,海明威应用程序是让你的文章变得大胆清晰的下一个工具。即使你的观众是成年人,海明威应用程序的可读性也要达到 6 级。

朱庇特笔记本写作工具,海明威编辑。
- 拼写检查器
您可以在 Nbextensions 中启用拼写检查器。

作者图片
如何在没有代码块的情况下从 Jupyter 笔记本中打印出来
一旦你完成了你的写作,如果你想把它导出为 PDF 文件,你可以把它打印成 PDF 格式。
有几种方法可以做到这一点。但是我想到了一个最简单灵活的方法。
您需要将下面的代码复制并粘贴到您的一个单元格中。然后转到文件,打印预览。代码块和输出块将被删除。为打印调整标题填充和边距。使用这种方法,您可以随意调整代码。
我发现原始的 NBConvert 块在打印视图中没有 div 或 class,所以很难控制这些块。我建议不要使用 Raw NBConvert 进行打印。
%%html
<style>
@media print {
div.input {
display: none;
padding: 0;
} div.output_prompt {
display: none;
padding: 0;
} div.text_cell_render {
padding: 1pt;
} div#notebook p,
div#notebook,
div#notebook li,
p {
font-size: 11pt;
line-height: 135%;
margin: 0;
} .rendered_html h1,
.rendered_html h1:first-child {
font-size: 16pt;
margin: 7pt 0;
} .rendered_html h2,
.rendered_html h2:first-child {
font-size: 14pt;
margin: 6pt 0;
} .rendered_html h3,
.rendered_html h3:first-child {
font-size: 13pt;
margin: 6pt 0;
} div.output_subarea {
padding: 0;
}
} @page {
size: A4;
}
</style>
进入浏览器打印,文件>打印,需要在页眉和页脚选择空白。

您需要在页眉和页脚中选择空白。摄影:冈田新一
现在,您可以打印出这个 HTML 页面或将其导出为 PDF 格式,而无需代码和页眉/页脚。

选择在预览中打开或另存为 PDF。摄影:冈田新一
导出到 MS Word 文件
是否要在 MS Word 中编辑 Jupyter 笔记本文件?这是你能做的。
首先,你需要安装 Pandoc 。下载 macOS 的最新安装程序,或者按照 Windows 的说明进行操作。通过pandoc --version检查是否安装正确。

接下来,您需要从您的终端安装 jupyter-docx-bundler 。
$ pip install jupyter-docx-bundler
$ jupyter bundlerextension enable --py jupyter_docx_bundler --sys-prefix
移除输入或代码单元格
转到视图>单元格工具栏>标签,并将nbconvert-remove-input添加到标签字段。这将删除单元格的输入代码。

如何查找单元格标记

隐藏代码单元格
您可以通过添加nbconvert-remove-cell来删除整个单元格。
在您的终端运行中:
jupyter nbconvert --execute --to=docx <source notebook>.ipynb --output <target document>.docx

运行 nbconvert 将 ipynb 转换为 docx 文件
结论
我希望这将节省您的时间,并为您的第一篇数据科学文章做好准备。如果你还有其他建议,请写在评论里。
通过 成为 会员,可以完全访问媒体上的每个故事。

参考
- https://markdown-guide . readthedocs . io/en/latest/basics . html # markdown-basics
- https://github . com/Adam-p/Markdown-here/wiki/Markdown-cheat sheet
- https://www.markdownguide.org/extended-syntax/
- https://qiita.com/koikoi_jam/items/29d9ef4e16a42038325c
- https://github . com/duno vank/jupyter-themes # monospace-fonts-code-cells
- https://www . over leaf . com/learn/latex/Integrals,_sums_and_limits
你好。你坚持到了最后。既然你来了,请帮我传播这篇文章。您也可以关注我,获取更多的 Jupyter、统计和技术文章。
Jupyter 技巧和提示的集合
medium.com](https://medium.com/series/jupyter-hacks-and-tips-1b1a3a10bc79)*
7 种你永远不会使用,但无论如何都应该知道的预测技巧
基准技术作为复杂预测的垫脚石

时间序列预测工具箱就像瑞士军刀,有许多选项可供选择。这些选项经常让数据科学家不知所措、迷惑不解,有时甚至彻底困惑。
据我所知,至少有 25 种不同的技术。但幸运的是,它们彼此之间并没有太大的不同。例如,ARIMA 技术(如 AR、MA、ARIMA、SARIMA、ARIMAX)看似不同,但实际上一种只是另一种的变体。
然而,今天我要写一些简单的技巧,这些技巧人们很少谈论,但对理解预测基础却非常有用。这些模型被称为“基准”或“基线”预测。
正如您将在下面看到的,这些技术很少在实践中应用,但它们有助于建立预测直觉,并在此基础上增加额外的复杂性。首先我将演示一些代码作为例子,然后在文章的后半部分讨论它们的相似之处和不同之处。
让我们首先实现三种技术:天真、均值和漂移模型。我在演示中使用的数据集是只有一个变量的航空乘客数据集。当然,我将使用 python!
导入库和数据
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("../gasprice.csv")
将数据分成训练集和测试集
train = df.iloc[0:556, ]
test = df.iloc[556:,]yhat = test.copy().drop('value', axis=1)
建模
# model building
yhat['naive'] = train.loc[len(train)-1, 'value'] #Naive
yhat['average'] = train['value'].mean() #Average
yhat['drift'] = train.loc[len(train)-1]['value'] + (train.loc[len(train)-1]['value']
- train.loc[0]['value'])/len(train)* np.linspace(0, len(yhat)-1, len(yhat)) # Drift# visualization
plt.figure(figsize=(12,4))
plt.plot(train['value'], label = "train")
plt.plot(test['value'], label = "test")
plt.plot(yhat['naive'], label = "naive")
plt.plot(yhat['average'], label = "mean")
plt.plot(yhat['drift'], label = "drift")
plt.legend()
plt.show()
评估
# model evaluation
eval = pd.concat([test, yhat], axis = 1)
eval['error_naive'] = eval['value'] - eval['naive']
mae_naive = np.mean(np.abs(eval['error_naive']))
rmse_naive = np.sqrt(np.mean(eval['error_naive']**2))
print('MAE_naive:', round(mae_naive))
print('RMSE_naive:', round(rmse_naive))eval = pd.concat([test, yhat], axis = 1)
eval['error_average'] = eval['value'] - eval['average']
mae_average = np.mean(np.abs(eval['error_average']))
rmse_average = np.sqrt(np.mean(eval['error_average']**2))
print('MAE_average:', round(mae_average))
print('RMSE_average:', round(rmse_average))eval = pd.concat([test, yhat], axis = 1)
eval['error_drift'] = eval['value'] - eval['drift']
mae_drift = np.mean(np.abs(eval['error_drift']))
rmse_drift = np.sqrt(np.mean(eval['error_drift']**2))
print('MAE_drift:', round(mae_drift))
print('RMSE_drift:', round(rmse_drift))
- MAE_naive: 16
- RMSE_naive: 20
- MAE_average: 25
- RMSE _ 平均:28
- MAE_drift: 17
- RMSE _ 漂移:21

现在,让我们进入一些细节,以了解基本知识。
- 天真的预测:
在简单预测中,未来值被假定为等于过去值。因此,某一特定产品在周三的销量将与周二的销量相似。
天真的预测很像一个 零假设 ,与另一个假设进行比较,明天的销售收入会因为这样那样的原因。
2。季节性天真:
顾名思义,季节性天真在其预测中考虑了季节性因素。所以在某种程度上,这是对幼稚方法的改进。在这种情况下,12 月的收入预测将等于前一年 12 月的收入。这样做是为了考虑到节日的影响。
同样,它仍然像 零假设 一样工作,但认为季节性是其相对于天真预测的关键改进。
3。平均模型
简单预测采用一个过去的值作为预测值。相比之下,均值模型采用所有过去的观察值,进行平均,并将该平均值用作预测值。
如果数据是随机分布的,没有清晰的模式和趋势(也称为白噪声),均值模型比朴素模型更适合作为基准。
4。漂移模型
漂移模型是简单预测的另一种变体,但有明显的改进。与 Naive 一样,它采用最后一次观察,然后根据过去值的变化调整观察。
预测值=过去观察值+/-过去观察值的平均变化
5。线性趋势
上述均值模型是一条不随时间变化的水平恒定线,因为它处理的是没有趋势的训练数据。但是,如果检测到趋势,线性模型比均值模型提供更好的预测值。
实际上使用线性趋势预测实际上是下面形式的最佳拟合线(即回归线):
y(t)=α+β* t
RSME 或 R2 值决定了拟合线的预测效果。

6。随机漫步
在这种情况下,预测值从其当前位置向前“行走”随机一步(类似于布朗运动)。就像一个蹒跚学步的孩子,下一步可以是任意方向,但不会离上一步太远。
Y(t+1)=Y(t) +噪声(t)
周三的股价可能会接近周二的收盘价,因此随机漫步可以提供合理的猜测。但是预测太多的时间步是不合适的,因为,嗯,每一步都是随机的。
7。几何随机漫步
在几何随机游走中,对下一个值的预测将等于上一个值加上一个常数变化(例如,收入的月增长百分比)。
ŷ(t)= y(t-1)+α
它也被称为“随机增长模型”。长期的股票价格遵循某种几何随机游走模型。
最后的想法
本文的目的是挖掘一些非典型的时间序列预测技术。即使它们没有在实践中使用,它们也是一个重要的垫脚石,为预测如何工作以及如何开发高级预测模型建立直觉。
关于一些高级预测技术的其他文章正在准备中,敬请关注。关于新闻和更新,你可以在推特上找到/关注我。
2020 年每个数据科学家都应该阅读的 7 本免费电子书
学习一项新技能不一定要很贵。2020 年你只需要时间和付出就能学会一项新技能。

T 这里有许多学习数据科学的在线资源。有些免费,有些付费。也有专门研究人工智能的昂贵的大学课程。你应该选择哪一个?
让我告诉你一个秘密。学习一项新技能不一定要很贵。2020 年学一门新技能,只需要时间和付出。
在这篇文章中,我整理了 7 本免费电子书,可以帮助你学习数据科学和机器学习。坚持学习!
我关于这个话题的其他文章:
[## 2020 年每个数据科学家都应该阅读的 7 本免费编程书籍
这些书将向你展示如何培养许多数据科学家缺乏的技能。都是免费的!
towardsdatascience.com](/7-free-programming-books-every-data-scientist-should-read-in-2020-608c00d7cf3c) [## 常春藤大学的 7 大免费人工智能课程
顶级人工智能课程精选列表。向该领域最优秀的人学习——有选择地使用你的时间、精力和…
towardsdatascience.com](/top-7-free-artificial-intelligence-courses-from-the-ivy-league-universities-7c951f787a55)
在 2020 年,你只需要时间和奉献来学习一项新技能
如果您想投资自己,请查看以下课程:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
1.深度学习
作者:伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔
深度学习本书最初于 2016 年发布,是第一批致力于深度学习领域的书籍之一。它是由当时处于发展前沿的杰出研究人员团队编写的,在深度神经网络领域仍然具有很高的影响力和认可度。
这是一部自下而上的、重理论的深度学习专著。这不是一本充满代码和相应评论的书,也不是神经网络的表面水平的手动概述。这是对该领域基于数学的深入解释。

安妮·斯普拉特在 Unsplash 上的照片
2.深入学习
作者:阿斯顿·张,扎克·c·利普顿,,亚历克斯·j·斯莫拉
深入学习是一本交互式深度学习书籍,包含代码、数学和讨论。它提供了 NumPy/MXNet、PyTorch 和 TensorFlow 实现。作者是亚马逊的员工,他们使用亚马逊的 MXNet 库来教授深度学习。这本书会定期更新,所以请务必阅读最新版本。
扎卡里·利普顿说得好:
《深入学习》(D2K)的独特之处在于,我们在“边做边学”的理念上走得很远,整本书本身都是由可运行的代码组成的。我们试图将教科书的最佳方面(清晰度和数学)与实践教程的最佳方面(实践技能、参考代码、实现技巧和直觉)结合起来。每一章都通过多种形式、交织的散文、数学和一个独立的实现来教授一个关键思想,可以很容易地抓住和修改它,为您的项目提供一个良好的开端。我们认为这种方法对于教授深度学习是必不可少的,因为深度学习中的许多核心知识都来自实验(而不是第一原则)。

3.机器学习向往
作者:吴恩达
这本书是由斯坦福大学教授、在线教育先驱吴恩达写的。他还联合创立了 Coursera 和 deeplearning.ai。
机器学习向往本书侧重于教授如何让 ML 算法工作(而不是教授 ML 算法)。它优先考虑人工智能项目最有前途的方向。
这本书是一个有用信息的宝石,将帮助您解决实际问题,如诊断 ML 系统中的错误,如何应用端到端学习,迁移学习和多任务学习等。

4.可解释的机器学习
副标题:让黑盒模型变得可解释的指南
作者:克里斯托夫·莫尔纳尔
这本书使用了“支付你想要的价格策略”,所以从技术上来说它不是免费的。
可解释机器学习专注于表格数据(也称为关系或结构化数据)的 ML 模型,较少关注计算机视觉和自然语言处理任务。
这本书推荐给机器学习从业者、数据科学家、统计学家和其他任何对让机器学习模型可解释感兴趣的人。它详细说明了如何为机器学习项目选择和应用最佳解释方法。

5.黑客的贝叶斯方法
作者:卡梅伦·戴维森
黑客的贝叶斯方法从技术上讲并不是一本机器学习书籍,因为它专注于数据科学的一个重要领域,称为贝叶斯推理。
《黑客的贝叶斯方法》旨在从计算/理解第一,数学第二的角度介绍贝叶斯推理。这是针对爱好者与较少的数学背景或一个谁是不感兴趣的数学,但简单的贝叶斯方法的实践,这篇文章应该是足够的和有趣的。
这本书也是学习 PyMC(Python 中的概率编程语言)的极好资源。

马库斯·斯皮斯克在 Unsplash 上拍摄的照片
6.Python 数据科学手册
作者:杰克·范德普拉斯
Python 数据科学手册面向初级数据科学家。它展示了如何使用最重要的工具,包括 IPython、NumPy、Pandas、Matplotlib、Scikit-Learn 和许多其他工具。这本书非常适合解决日常问题,例如清理、操作和转换数据,或者构建机器学习模型。

Viktor Forgacs 在 Unsplash 上拍摄的照片
7.统计学习简介
副标题:申请中作者:加雷斯·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼
统计学习介绍提供统计学习方法介绍。它面向非数学科学领域的高水平本科生、硕士生和博士生。这本书还包含一些 R labs,详细解释了如何在现实生活中实施各种方法,应该是数据科学家的宝贵资源。
在你走之前
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。

照片由Courtney hedge在 Unsplash 上拍摄
2020 年每个数据科学家都应该阅读的 7 本免费编程书籍
这些免费书籍将向你展示如何培养许多数据科学家缺乏的技能

两周前,我出版了 7 本免费电子书,每个数据科学家都应该在 2020 年阅读。我得到了惊人的回应!所以很自然的事情就是展开这个话题。
[## 2020 年每个数据科学家都应该阅读的 7 本免费电子书
学习一项新技能不一定要很贵。2020 年你只需要时间和付出就能学会一项新技能。
towardsdatascience.com](/7-free-ebooks-every-data-scientist-should-read-in-2020-32508ad704b7) [## 常春藤大学的 7 大免费人工智能课程
顶级人工智能课程精选列表。向该领域最优秀的人学习——有选择地使用你的时间、精力和…
towardsdatascience.com](/top-7-free-artificial-intelligence-courses-from-the-ivy-league-universities-7c951f787a55)
现实世界的数据科学不仅仅是拟合模型。数据科学家还需要了解最佳编码实践、Bash、Git 和基本 web 框架。本文中的书籍将帮助你发展这些技能。
很多读者评论说,“我没时间看”。
编程书不是你必须从头到尾看完的小说。我尝试阅读 10%的技术书籍——通常不是从一开始。我浏览了目录。这样我就了解了这本书的要点。
当我在现实世界中面临问题时,我知道去哪里找解决方案。
如果您想投资自己,请查看以下课程:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
现在,让我们从 2020 年每个数据科学家都应该阅读的 7 本免费编程书籍开始。
面向专业人士的 Python 注释
作者:堆栈溢出的人

这本 Python 书籍是我见过的最完整的 Python 指南之一。它是由栈溢出文档编译的,内容是由栈溢出的人编写的。
这本书广泛涵盖了你(很可能)会用到的 Python 的每个领域。我建议你不要从头到尾读一遍,而是把它作为你想进一步了解的某个主题的参考。
如果你不精通 Python,我推荐你深入阅读这本书。这本书有 816 页,提供的信息足以让你精通 Python。
您没有使用(但应该使用)的 20 个 Python 库
作者:Caleb Hattingh

Jukan Tateisi 在 Unsplash 上拍摄的照片
对于精通 Python 的程序员,我推荐阅读 Caleb Hattingh 的 20 个你不用的 Python 库。本书篇幅较短,涵盖了标准 Python 库、Python 系统工具、Web APIs 和一些通用库的基本库。
当您需要用 Python 编写多处理脚本或任何其他高级脚本时,这是一本很好的参考书籍。
面向对象设计的构建技巧
作者:史蒂文·f·洛特

乔治·帕甘三世在 Unsplash 上的照片
许多来自静态类型语言(如 Java 或 C)的程序员在很短的时间内就开始使用 Python 了。他们说“我输入的一切都能正常工作”或者“我一边说一边编码”。但是这种方法经常会导致无用的代码。Python 有它自己的怪癖。
另一边是来自数学背景的数据科学家,他们甚至没有听说过面向对象设计模式。
对于以上两组数据科学家,我建议做几个来自构建面向对象设计技能书的练习。它提供了一系列有趣的、相对复杂的面向对象设计练习。
作者就“为什么要读这本书?”
一些软件开发人员在尝试进行面向对象(OO)设计时发现自己停滞不前。作为程序员,他们已经理解了编程语言的语法,并拼凑了一些小例子。然而,要成为一名设计师往往很难迈出下一步。从语言功能的引导学习到自我指导的设计工作的过渡经常被忽视。程序员在没有适当技能或支持的情况下,不得不艰难地完成他们的第一个设计项目。
学习熊猫
作者:埃尔南·罗哈斯

Pandas 成为 Python 中数据科学的事实上的标准。学熊猫这本书是用 Jupyter 笔记本写的,并附有文字。
它从如何创建数据框架的基本课程开始,以创建 Excel 报表结束。它的目标是那些仍在熟悉熊猫的初级数据科学家。
要了解更多先进的熊猫技巧,我建议你查看我的熊猫系列进行数据分析:
从提示和技巧,如何不指南到与大数据分析相关的提示,熊猫文章的精选列表。
medium.com](https://medium.com/@romanorac/pandas-data-analysis-series-b8cec5b38b22)
会话 Git
作者:艾伦·霍恩

许多初级数据科学家不知道最佳编码实践,其中之一就是 Git。我已经在我的 5 个数据科学家应该学习的技能文章中写了这个话题。
有哪些数据科学家在网络课程或大学里学不到的?了解这 5 项技能的基础知识会让你…
towardsdatascience.com](/5-skills-data-scientists-should-learn-27d186820d17)
Conversational Git 是一本令人惊叹的书,以一种可理解的方式展示了 Git 中的基本操作。我建议你花一个下午的时间浏览这本书。花一些时间学习 Git 是一项很好的投资,因为它会带来更好的开发实践。
如果你只是需要一个 Git 速成班,查看一下 Git 指南,它以一种有趣的方式介绍了基本的 Git 操作。
给专业人士的 Bash 笔记
作者:堆栈溢出的人

与 Git 一样,如果您打算长期留在软件开发领域,学习 Bash 也是一项不错的时间投资。Git 和 Bash 会一直在这里!
Bash Notes for Professionals是一本关于 Bash 的综合书籍。它涵盖了您需要了解的关于 Bash 的所有内容。
阅读和学习 Bash 可能会很乏味,所以请将这本书作为参考。随着时间的推移,你会做得更好的。
对于不熟悉 Bash 的初级软件开发人员,我建议花些时间通读这本书并学习 Bash 基础知识。有一点是肯定的——你迟早会遇到巴什。
探索烧瓶
作者:罗伯特·皮卡德

让一个机器学习模型在 Jupyter 笔记本上进行预测是很酷的!你知道什么更酷吗?拥有一个模型在云中进行预测的 Web 应用程序!
Explore Flask 是一本关于用 Flask 开发 web 应用程序的最佳实践和模式的书。普通的烧瓶应用程序有很多部分。这本书试图展示如何用 Flask 做事情的“正确方法”。
您想了解如何使用 Flask 在云中部署机器学习模型吗?那你应该查一下我的课程:
一步一步的指导,将告诉你如何训练一个机器学习模型,建立一个网络应用程序,并部署到…
medium.com](https://medium.com/@romanorac/hands-on-data-science-course-e764853f516b)
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

照片由Courtney hedge在 Unsplash 上拍摄
下一次编码面试前要掌握的 7 个基本 SQL 概念
编程 | 面试 | 办公时间
通过解决取自真实编码面试的 SQL 习题来练习,最终得到你应得的工作。

照片由阿兹哈鲁尔·伊斯拉姆在 Unsplash 上拍摄
我的读者请注意
你们中的许多人联系我,要求我提供宝贵的资源来 练习更高级的 SQL 概念,以编写面试代码,包括真实的面试问题。 下面我分享 4 个我个人推荐的平台/课程:
- SQL 高级编码问题(StrataScratch)→目前为止我找到的准备 SQL 编码面试的最好平台!比 LeetCode 更好更便宜。
- 学习 SQL 进行大数据分析(纳米程度) → 优质课程进行更长期的承诺。
- SQL 汇总统计&窗口函数(DataCamp)
- SQL(Data camp)中操作数据的函数
>>>还不是中等成员?考虑与我的 推荐链接 签约,以获得 Medium 提供的一切服务,费用低至【5 美元一个月 !
停止低估 SQL 面试
当面试顶级科技公司的数据科学、数据工程或软件工程职位时,很可能技术环节会包括一个或多个现场代码会话,以测试你对 SQL 和你选择的编程语言的了解。
尽管练习用 Python 或 JAVA 来解决算法通常是很费力的,而且可能会占用你大量的时间(,因为几乎有无限多的问题存在!)、FAANG 面试中你要尽量不要低估 SQL 问题的难度。
在这篇文章中,我介绍并分享了 FAANG 中经常出现的一些基本算法的解决方案
towardsdatascience.com](/10-algorithms-to-solve-before-your-python-coding-interview-feb74fb9bc27)
科技公司的数据库中存储了大量数据,他们希望应聘者能够使用复杂的 SQL 查询以高效的方式提取和处理数据,然后再进行更高级的分析。由于对这些角色来说,良好的 SQL 知识几乎是理所当然的,所以面试官通常希望你能出色地解决这些挑战“”并且不太会提示你或忽略明显的错误。
举一个突出的例子,几年前,一名招聘人员联系我,希望在伦敦一家新兴的电子商务公司谋得一个职位,就在编码屏幕前,他打电话问我对解决定时 SQL 问题有多大信心。我告诉他,作为一名 BI 开发人员,我每天都使用 SQL 来编写复杂的查询,因此我对通过测试充满信心。我至今记得他的回答:
“SQL 编码面试可能会变得棘手。你不知道有多少有经验的候选人声称准备好了,然后在这个阶段失败了。”
就像预言一样,这正是发生在我身上的事情:我通过了 Python 编码筛选,却没有通过 SQL 测试。起初,我感到非常羞愧,我一直对自己说:“我是一名 BI 开发人员,却没有通过 SQL 面试……你能相信吗?”。
然而,不久之后,我意识到,在解决边缘案例的技术面试中,很多 SQL 问题并不罕见,这些问题在日常工作中并不常见,因此需要特别的准备。
为了帮助您在下一轮现场编码或带回家的定时 SQL 测试中评估自己的准备情况,在下一节课中,我将讨论一些面试练习问题 ( 和解决方案),涵盖以下 7 个基本概念:
- SQL 概念#1 : 使用子查询的高级过滤
- SQL 概念# 2:HAVING 子句的正确使用
- SQL 概念#3 : 聚合 With CASE WHEN 子句
- SQL 概念#4 : 排名函数的正确使用
- SQL 概念#5 : 正确使用 UNION vs UNION ALL
- SQL 概念#6 : 处理空值
- SQL 概念#7 : 计算累计总和
[## 排名上的 6 个 SQL 窗口函数编码问题——采访倒计时 P1
SQL 面试即将来临,您正在寻找一些具有挑战性的练习来测试您的准备情况?你是…
towardsdatascience.com](/6-sql-window-functions-coding-problems-on-ranking-interview-countdown-p1-9be0ccf66453)
SQL 概念# 1:高级过滤
编写一个 SQL 查询来报告购买了产品“A”、“B”但没有购买产品“C”的客户的 *customer_id* 和 *customer_name* ,因为我们想推荐他们购买该产品。返回结果表按 *customer_id* 排序。
CUSTOMERS table:
+-------------+---------------+
| customer_id | customer_name |
+-------------+---------------+
| 1 | Daniel |
| 2 | Diana |
| 3 | Elizabeth |
| 4 | Jhon |
+-------------+---------------+ORDERS TABLE table:
+----------+-------------+--------------+
| order_id | customer_id | product_name |
+----------+-------------+--------------+
| 10 | 1 | A |
| 20 | 1 | B |
| 30 | 1 | D |
| 40 | 1 | C |
| 50 | 2 | A |
| 60 | 3 | A |
| 70 | 3 | B |
| 80 | 3 | D |
| 90 | 4 | C |
+----------+-------------+--------------+Expected OUTPUT Structure:
|Customer_id | Customer_Name
解决方案:
注意这个查询有多紧凑:它通过利用WHERE()子句中的子查询只选择购买了产品 A 和 B 而没有购买 c 的客户,避免了使用多个 cte(节省了现场编码会话中的大量输入工作。在过滤时,请记住,如果子查询返回多个值,您可以使用IN()或NOT IN()运算符来检查成员资格。
SQL 概念# 2:HAVING 子句的正确使用
编写一个 SQL 查询,报告拥有最多员工的所有项目。
PROJECT table:
+-------------+-------------+
| project_id | employee_id |
+-------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
+-------------+-------------+EMPLOYEE table:
+-------------+--------+------------------+
| employee_id | name | experience_years |
+-------------+--------+------------------+
| 1 | Khaled | 3 |
| 2 | Ali | 2 |
| 3 | John | 1 |
| 4 | Doe | 2 |
+-------------+--------+------------------+Expected OUTPUT Structure:
|project_id|
解决方案:
问题基本上是要求返回涉及最多名员工的项目。为了实现这一目标:
- 首先创建一个子查询,以便在按
project_id分组时只检索最大数量的雇员(LIMIT 1), - 然后结合使用
HAVING()子句和COUNT(DISTINCT)函数来过滤主查询,以便只选择在子查询中找到的雇员数量最多的项目。
如您所见,当涉及某种聚合时,HAVING()应该用于过滤数据集(准备好解释 HAVING()和WHERE() 之间的区别,因为这是一个非常受欢迎的问题,特别是对于入口角色)。
SQL 概念# 3:聚合时的情况
编写一个 SQL 查询来重新格式化表格,这样每个月都有一个 *department_id* 列和一个 *revenue* 列。结果表应该有 13 列(1 列表示部门 id + 12 列表示月份)。
DEPARTMENT table:
+------+---------+-------+
| id | revenue | month |
+------+---------+-------+
| 1 | 8000 | Jan |
| 2 | 9000 | Jan |
| 3 | 10000 | Feb |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+Expected OUTPUT Structure:
|id | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... |
解决方案:
在某些情况下,面试官希望测试你处理数据的能力,例如,会要求你通过水平扩展来取消旋转表格。对于这个问题,我们的目标是去掉month维度,创建与月数一样多的事实列。这可以很容易地通过使用一个CASE WHEN()子句来识别特定的月份并生成新的聚合列来实现。
SQL 概念# 4:排名函数的使用
编写一个 SQL 查询,为每个客户返回第二早的 *order_id* ,每个日期他们至少下了两个订单。
Extract from ORDERS table
+------------+--------------+----------------------+------------ +
| order_id | customer_id | order_datetime | item_id |
+------------+--------------+----------------------+-------------+
| C-001 | 62456 | 2018-12-15 09:15:22 | A000 |
| C-005 | 21376 | 2019-01-14 09:28:35 | A001 |
| C-005 | 88956 | 2019-01-14 09:28:35 | A005 |
| C-006 | 42491 | 2019-01-14 03:53:08 | A008 |
+------------+--------------+----------------------+-------------+Expected Output Structure:
Customer_id | Order_date | Second_order_id
解决方案:
涉及使用排名函数(和一般窗口函数)的问题在 SQL 技术回合中极为常见。例如,在这种情况下,RANK() OVER()函数用于通过customer_id和order_date对分区中的每个订单进行排序。注意分区是如何使用order_date的,而等级是通过order_datetime以升序排列的。这样,第一个订单将得到order_rank = 1,第二个最早的订单将得到order_rank = 2。然后使用WHERE order_rank = 2子句只保留第二早的订单。上面的过滤器会自动排除客户下少于两个订单的日期,因此无需添加任何其他内容。
[## Python 中复制的 8 个流行的 SQL 窗口函数
关于如何利用业务分析中的 Pandas 高效复制最常用的 SQL 窗口的教程…
towardsdatascience.com](/8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7)
SQL 概念 5:UNION 与 UNION ALL 的使用
写一条 SQL,求出 2019–08–16 所有产品的价格,假设修改前所有产品价格都是 10。
# PRODUCTS table:
+------------+-----------+-------------+
| product_id | new_price | change_date |
+------------+-----------+-------------+
| 1 | 20 | 2019-08-14 |
| 2 | 50 | 2019-08-14 |
| 1 | 30 | 2019-08-15 |
| 1 | 35 | 2019-08-16 |
| 2 | 65 | 2019-08-17 |
| 3 | 20 | 2019-08-18 |
+------------+-----------+-------------+Expected Output Structure:
product_id | price
解决方案:
这个问题有点挑战性:它要求您识别每个product_id在2019–08–16的最近价格变化。如果某个产品的价格仅在该日期后发生变化,您应该假设2019–08–16的价格为 10。为此,您可以应用上述问题中介绍的两个概念:
- 首先,您可以使用
DENSE RANK()函数来查找每种产品在2019–08–16 的最新价格变化。DENSE_RANK()函数在分区中分配连续的等级,因此没有出现平局然后重复的风险。该数据集不包括在阈值日期后发生价格变化的产品。 - 然后,您可以创建第二个数据集,包括 2019 年 8 月 16 日之后发生最早价格变化的所有产品,并将它们的价格设置为 10。为了实现这一点,请注意带有
MIN()函数的HAVING()子句的使用。 - 最后一步是用
UNION ALL连接两个数据集,这样所有的product_id都会出现在解决方案中。
如果被问到,请记住UNION ALL比UNION更有效、更快,原因是第一个操作符不会检查重复值。
SQL 概念# 6:处理空值
编写一个 SQL 查询,查找在过去 7 天内每个类别订购了多少台。考虑总共七个日历日期,包括今天。还要考虑所有品类,甚至是零订单的品类。
Extract from ORDERS table:
+------------+----------------------+------------------------------+
| order_id | order_datetime | item_id | order_quantity |
+------------+----------------------+------------------------------+
| C-001 | 2018-12-15 09:15:22 | A000 | 5 |
| C-005 | 2019-01-14 09:28:35 | A001 | 1 |
| C-005 | 2019-01-14 09:28:35 | A005 | 1 |
| C-006 | 2019-01-14 03:53:08 | A008 | 3 |
+------------+--------------+---------------------+----------------+Extract from ITEMS table:
+-------------+---------------+
| item_id | item_category |
+-------------+---------------+
| A000 | Outdoors |
| A001 | Outdoors |
| A002 | Outdoors |
| A003 | Kitchen |
| A004 | Kitchen |
+-------------+---------------+Expected Output Structure:
Category | Units
解决方案:
这个问题需要找到每个类别的和每个类别的的总单位数,这意味着在这种情况下items表应该被用作前导表,并与orders保持连接,以保留所有的item_category值,甚至是那些与从未订购的项目相关联的值。一般来说,当你在真实的面试问题中读到单词 "each" 和 "every" 时,你可能需要对连接和一些空值采取一些行动,这些需要在过滤器中处理(OR o.item_id IS NULL)
SQL 概念# 7:计算累积和
编写一个 SQL 语句来获得一个雇员三个月的工资总额,但不包括最近一个月。结果应该按“Id”升序显示,然后按“Month”降序显示。
EMPLOYEE table:| Id | Month | Salary |
|----|-------|--------|
| 1 | 1 | 20 |
| 2 | 1 | 20 |
| 1 | 2 | 30 |
| 2 | 2 | 30 |
| 3 | 2 | 40 |
| 1 | 3 | 40 |
| 3 | 3 | 60 |
| 1 | 4 | 60 |
| 3 | 4 | 70 |
+---------------------+Expected Output Structure:
id | month | salary
在 SQL 技术访谈中,被要求计算累计总和是一个非常经典的问题,因此对于这个问题,我提供了两个潜在的解决方案。
解决方案 1:
在这种情况下,ROW_NUMBER()函数用于识别和排除支付给每个雇员的最后一笔工资。一旦排除了最后一笔工资,就会对前三行进行累计求和(SUM() OVER())。
解决方案 2:
在这个备选解决方案中,不是使用窗口函数来对月工资进行排序,而是通过编写一个查找并排除每个雇员最近一个月(MAX(month))工资支付(WHERE e1.id = e2.id)的子查询来过滤掉最后一笔工资。然后,与解决方案 1 完全一样地计算累积和。
结论
在这篇文章中,我提出了 7 个基本的 SQL 概念,您应该在下一次 FAANGs 技术面试之前掌握它们。我希望你在下一个 SQL 编码屏幕或定时测试中使用上面的问题进行练习。
涉及日期转换的解决方案使用 PostgreSQL 作为语法(以节省一点打字……),但可以很容易地转换成 MySQL。我的解决方案也只是每个问题的潜在解决方案之一,所以请在评论中分享你的解决方案。请注意,本文中出现的所有 SQL 问题都摘自leet code,其中混合了官方问题和订户在讨论区中直接报告的问题。
给我的读者一个提示:这篇文章包含了附属链接,如果你购买的话,我可以免费给你一点佣金。
Python 中的 7 个地理空间数据处理技巧
第 2 部分:如何使用 Geopandas 在 Python 中轻松有效地集成空间要素

Lucas Ludwig 在 Unsplash 上拍摄的照片
我喜欢使用 Geopandas,在过去的两个月里,我分享了一些使用 Geopandas 处理地理空间数据的最佳技巧和诀窍。本文是该系列的第二部分,在这里我将分享另外七个技巧和诀窍,让您在用 Python 处理地理空间数据时更加轻松。
Geopandas 技巧的第一部分涵盖了五个专业技巧,您可以通过下面的链接阅读这篇文章。
第 1 部分:如何使用 Geopandas 在 Python 中轻松有效地集成空间要素。
towardsdatascience.com](/5-geospatial-tips-and-tricks-in-python-eef86aec5110)
以下是我们在本文中包含的技巧列表。
提示 1-CSV 转地理数据框架
很多数据集都是 CSV 格式的,而且很多数据集都有坐标(纬度和经度)。将这些数据集转换为地理数据框架可以在 Geopandas 中实现大量地理空间处理功能。
要将 CSV 转换为地理数据框架,我们首先读取包含 Pandas 的 CSV 文件,如以下代码片段所示。然后,我们可以使用 Geopandas 中的 points_from_xy 函数将数据框转换为地理数据框。

使用 Geopandas 将数据框转换为地理数据框— 作者提供的图片
将数据框转换为地理坐标框架后,我们现在可以执行几何操作,包括绘制地理空间数据、计算距离等等。
技巧 2 —几何过滤器
有了 pandas,我们可以使用行或列来过滤数据。使用地理数据框架,除了熊猫过滤之外,您还可以通过其几何来过滤数据。以下示例显示了读取著名的出租车数据。该数据集是一个相对较大的文件,因此我们可以避免使用几何过滤器读取整个数据集,因为我们只读取曼哈顿边界内的点。

通过几何图形过滤数据—作者的图像
mask 参数采用一个几何图形,因此我们在这里提供一个行政区名称,Geopandas 将在读取数据集时排除所有其他行政区。
技巧 3 —溶解
通常,我们有不同的多边形来处理地理边界,包括其他邮政编码、社区、地区等..如何合并这些子单元而不丢失原始数据集中的统计数据?
对于非地理数据,我们只需要使用groupby函数。但是,对于空间数据,我们还需要聚合几何要素。在这种情况下,我们可以使用溶解。以下示例显示了将国家边界分解为洲

消失的边界——作者的图片
下面的可视化显示了使用上述代码将国家边界(左上)分解为洲边界(右下)。

溶解示例(国家边界到大陆)——作者图片
请注意,要使用聚合溶解,您需要有一个列。此外,您可以进行不同的统计计算。在本例中,我们展示了如何计算总和。
技巧 4——创建气泡图
当您拥有点数据集并希望按大小显示数量时,气泡图是 choropleth 图的绝佳替代方案。在 Geopandas 中创建气泡图并不难,但我相信如何创建一个气泡图并不明显。
要创建气泡图,只需将标记大小参数设置为任何数量列,如下面的代码片段所示。

使用 Geopandas 创建气泡图— 作者图片
此外,你需要照顾重叠的点圆;因此,我在这里将 alpha 设置为一个较低的值以保持透明。您可以看到输出可视化。

气泡图— 作者图片
技巧 5——找到最近的距离
距离和查找附近的内容是空间分析的重要组成部分。在这篇技巧中,我将向您展示如何有效地计算距离并找出最近的点。
让我们说:我们有城市。nearest_city 函数采用一个点(纬度和经度)和城市地理数据框,并返回距离所提供坐标最近的城市。

最近邻计算— 作者图片
你也可以拥有你的数据。它不一定是城市本身。但是对于任何点数据集,您现在都可以使用此函数计算最近的邻域。
提示# 6-至 Geojson/Geopackage
谁不喜欢 shapefiles!除了 shapefiles,我们还可以将地理处理后的数据导出为其他格式以在本地存储。在本例中,我展示了如何在本地将地理数据框存储为 GeoJSON 和 Geopackages。

将地理空间数据存储为 Geojson/Geopackage。— 作者图片
对于 GeoJSON,您需要将驱动程序指定为 GeoJSON。保存为地理包格式,我们需要设置图层名称和驱动程序为 GPKG。
技巧 7——阅读 PostGIS
成为超级用户并设置您的 PostGIS 数据库。通过 Geopandas,您可以使用 SQL 读取数据。该代码片段展示了一个使用 Geopandas 和 Sqlalchemy 从 PostgreSQL 数据库读取数据的示例。

连接到 PostgreSQL/PostGIS 数据库— 作者的图片
SQL 语法可以包装成字符串,Geopandas 将执行它。这种方法是通过空间数据库访问数据的好方法。您可以从本文开始安装和使用 PostgreSQL:
[## 使用 PostgreSQL/PostGIS 的空间数据科学
PostgreSQL 和 Python 空间数据入门实用指南。
towardsdatascience.com](/spatial-data-science-with-postgresql-postgis-2f941c8c367a)
结论
我希望您喜欢这一轮 Python 中的地理空间数据处理技巧。在本文中,我们看到了有效使用 Geopandas 进行地理空间数据分析的七个技巧。
其中一些技巧是直接的几何操作,对于处理地理空间数据至关重要:将数据框架转换为地理数据框架、几何过滤和融合。作为一名地理空间数据科学家,繁重的几何功能是救命的。
其他技巧涉及地理空间数据可视化、空间数据库连接、查找最近邻和地理空间矢量数据格式输出。
如果你喜欢我在推特上发布的这些提示和技巧,你可以在 @spatialML 找到它们
R 语言中探索性分析的 7 大功能
这些功能将把您的探索性分析提升到下一个层次

在 Unsplash 上由 Carlos Muza 拍摄的照片
数据挖掘框架的 EDA(探索性数据分析)阶段是从数据集中提取信息的主要活动之一。无论你的最终目标是什么:神经网络、统计分析或机器学习,一切都应该从对你正在处理的数据的良好理解和概述开始。
EDA 的一个主要特征是,它是一个有点开放的过程,依赖于工具箱和数据科学家的创造力。不幸的是,这既是福也是祸,因为做得不好的 EDA 可能会隐藏数据中的相关关系,甚至损害研究的有效性。
EDA 中通常执行的一些活动(这绝不是一个详尽的列表):
- 数值变量分析:平均值,最小值和最大值,数据分布。
- 类别变量分析:类别列表,每个类别中记录的频率。
- 异常值的诊断以及它们如何影响每个变量的数据分布。
- 预测变量之间的相关性分析。
- 预测变量与结果变量之间的关系。
谈到 EDA,没有什么神奇的公式,但在分析数据时,一定要记住一些软件包和函数,以保持分析中敏捷性和灵活性的完美平衡。
数据集
研究或实践数据科学的人都非常熟悉本文中使用的数据集。在这里可以找到和,它包含了 2008 年在葡萄牙推出的葡萄酒信息。它包含 1599 个观察值,葡萄牙红葡萄酒的 11 个心理化学属性和 1 个目标变量,数字离散质量指数从 0 到 10。

1599 obs 数据集的展望。x 12 变量(图片由作者提供)
软件包和功能
R 编程语言是数据爱好者中最广泛使用的编程语言之一。经过广泛的研究,我编制了一个列表,其中列出了对数据执行 ed a 时应该知道的一些最佳函数,重点是那些允许进行更直观分析的函数,以及表格和图形。
数据集概述
visdat 包有两个有趣的函数,可以快速、实用地查看数据集。 vis_dat 函数以一种非常容易理解的方式显示变量、观察值的数量以及每个变量的类型。
visdat::vis_dat(wine,sort_type = FALSE)

vis_dat 用于可视化变量的类型(图片由作者提供)
来自同一个包的 vis_miss 函数允许您查看每个变量缺失值的数量,从而给出数据集完整性的概述。

vis_miss 用于查看丢失的值(图片由作者提供)
注意:所讨论的数据集没有任何带有缺失值的变量,因此一些缺失值是为了更好地可视化而“人工”生成的。
可视化数字变量
名为 funModeling 的软件包提供了强大的功能来绘制关于数据集的有用信息,从关于变量的基本信息到更具体的信息,如每个变量提供的信息增益,以及预测变量和结果变量之间的关系。
要记住的函数之一是 plot_num 函数,它绘制每个数值变量的直方图。在其他包中有几个类似的函数,甚至有直接通过 ggplot2 完成相同任务的方法,但是 plot_num 函数大大简化了任务。

plot_num 用于绘制数值变量的分布(图片由作者提供)
这样,你就可以在一个图中得到所有的东西——当然,这取决于变量的数量——一个数字多样性的概述。
可视化分类变量
与数值变量一样,对数据集的分类变量有一个总体的了解是很重要的。包 inspectdf 的 inspect_cat 函数允许您一次绘制所有分类变量的摘要,显示每个变量中最常见的类别。

inspect_cat 用于查看分类变量中最常见的类别(图片由作者提供)
注意:本文中使用的数据集没有任何分类变量,因此该图像是说明性的,它取自此处的。
异常值识别和处理
dlookr 包是一个具有非常有趣的分析、数据处理和报告功能的包,它为 R 语言的 EDA 带来了一些最佳解决方案。这个软件包的一个亮点是关于数值变量中异常值的信息。
首先, diagnose_outlier 函数生成一个数据框,其中包含每个变量的信息:离群值计数、离群值 x 总观察值比率,以及包含和不包含离群值的平均值。
dlookr::diagnose_outlier(wine)

用于查看异常值信息的 diagnose_outlier(图片由作者提供)
同一个包还提供了 plot_outlier 函数,该函数显示了包含和不包含上述异常值的值分布中所有变量的图形。
dlookr::plot_outlier(wine)

plot_oulier 查看有无异常值时变量的外观(图片由作者提供)
从氯化物变量中可以看出,当应用统计模型时,几个高值肯定会影响结果,尤其是当一些模型假设数据呈正态分布时。
注:重要的是要记住,异常值不应该总是被删除,因为在这种情况下,它们可能表明葡萄酒的一个特定子类别,特别是由于这个变量中异常值的高度集中(值的 7%)。
相关可视化
有许多软件包都具有生成数据集中变量之间的相关图的功能,但很少像图表那样提供几个因素的完整可视化。 PerformanceAnalytics 包的关联功能。
chart.Correlation(wine[,2:7], histogram = TRUE, pch = 15)

图表。查看变量之间交互的相关性(图片由作者提供)
它呈现:
- 数据集中数值变量之间的数值相关性(皮尔逊系数),较大的源表示较大的相关性
- 每对变量之间的微型散点图
- 每个变量的直方图和密度图
注意:该函数只接受只有数字变量的数据框作为输入,因此如果数据集包含分类预测变量,则应事先执行此处理。这种处理的一个建议是使用 keep 方法(在 dplyr 包中提供):
wine %>%
keep(is.numeric)
这样,数据集中只保留数值变量。
自动报告
有些软件包还具有自动生成数据集 EDA 报告的功能。当前可用的报告选项在所呈现的分析的范围和维度方面有所不同,但都显示数据集变量的某种摘要、关于缺失值的信息、每个变量的直方图和条形图等。
我测试过的最好的函数可能是 DataExplorer 包的 create_report 函数。对于更标准的分析(已经相当全面了),它允许您只使用一行代码生成报告:
DataExplorer::create_report(wine)

DataExplorer 包中的 create_report 函数示例,用于创建完整的 EDA 报告(图片由作者提供)
幸运的是,这个函数远远不止于此,因为它可以定制报告的各个方面,从更改布局和主题到调整特定的参数或准确选择哪些图形应该包含在报告中。
注意:请务必记住,对于数据分析和可视化来说,没有一个解决方案可以涵盖所有基础,而且自动报告生成功能也不应该如此对待。
TLDR
- 您是否需要数据集的高级概述?visdat::vis_dat(概述)和 visdat::vis_miss(缺少值)。
- 你需要关于数字变量的信息吗?funModeling::plot_num。
- 那么分类变量呢?inspectdf::inspect_cat。
- 变量之间的相关性?performance analytics::chart . correlation。
- 一个自动化和可配置的报告怎么样?包 DataExplorer::create_report。
你呢?在探索性分析中,有没有一个不可错过的功能来自动化或帮助可视化您的数据?请在评论区告诉我!😁
来源和致谢
我们首先要感谢负责创建和维护这些令人难以置信的包的开发人员——这些包都可以在 R 的官方资源库中找到,也可以在我的研究中参考以下来源:
inspectdf 是什么,有什么用?我经常发现自己在整个过程中查看和检查数据帧…
alastairrushworth.github.io](https://alastairrushworth.github.io/Exploring-categorical-data-with-inspectdf/) [## 第 2 部分:使用 inspectdf 的 R 中的简单 EDA 少量缺失数据
我喜欢这个包,因为它有很多功能,而且非常简单易用。简而言之,它…
www.littlemissdata.com](https://www.littlemissdata.com/blog/inspectdf) [## 自动化探索性数据分析的 R 包前景
具有大量异构变量的大型但有噪声的数据集的可用性不断增加,导致…
www.groundai.com](https://www.groundai.com/project/the-landscape-of-r-packages-for-automated-exploratory-data-analysis/1)
高效程序员的 7 个习惯

卡尔·海尔达尔在 Unsplash 上拍摄的照片
大约 40%到 45%的我们程序员每天做的事情是我们自动完成的:刷牙,早上喝杯咖啡,坐在办公桌前打开邮件,以及许多其他事情。
这些习惯在我们的日常生活中为我们节省了大量的时间和精力,并且对我们日常任务的整体质量和成就非常重要。
脸书首席执行官马克·扎克伯格有每天穿同一件衣服上班的习惯,因为他注意到这有助于节省能量。“我真的很幸运,每天起床后,我都可以帮助十多亿人。如果我把精力花在生活中愚蠢或琐碎的事情上,我会觉得自己没有尽到自己的职责。”
微软创始人比尔·盖茨每天晚上都洗碗,因为这个习惯可以减轻压力,提高创造力,帮助大脑思考和创造性地解决问题。
斯蒂芬·科维写了一本名为《高效人士的 7 个习惯》的书,销量超过 2500 万册。这本书是关于发展一套核心的价值观和思想,帮助你用一种综合的和以原则为中心的方法解决个人和职业问题。是一本帮助了很多人改善生活的经典书籍,相信软件开发者也能从中受益。由于软件开发人员能够将想法转化为现实并解决现实生活中的问题,因此他们受到了广泛的欢迎。
下面的习惯可以进一步增强这种能力,并使之更加有效。
1)要主动

尼克·莫里森在 Unsplash 上的照片
每个人的生活中都会发生很多事情。有些事情你无法控制,也无能为力。
你可能生活在一个因为签证问题而不允许你出国利用一个非常有吸引力的工作机会的国家。你工作的公司可能会破产。你的经理很容易生气,所以你总是害怕表达你对团队重要问题的想法。你可能不被允许使用测试驱动开发,因为你的团队领导认为这花费了太多的时间,尽管你尽力让他们相信这是一个非常有效的长期策略。
如果你想成为一名高效的程序员,你就不应该关注那些超出你控制范围的事情。你应该采取积极的态度,而不是责怪社会,讨厌你的工作。在你能控制的事情上投入你的精力和努力。
你应该准时上班,这样你就不会因为错过了和其他团队成员的每日 scrum 会议而感到内疚。你应该学习新的概念和技术,而不是在没有任何任务分配的情况下,花无数的时间在无意识的浏览上。你需要看新书,看教程,参加开发者大会。你应该在空闲时间写博客和参与开源项目来帮助他人。
你需要追求不断的学习和进步。用亨利·大卫·梭罗的话来说,“我所知道的最令人鼓舞的事实莫过于人类通过有意识的努力提升自己生活的不容置疑的能力。”
你不应该让不受你控制的事情占据你的大部分注意力。你需要关注那些在你影响范围内的事情。你需要积极主动地养成新的好习惯。
2)从心中的目标开始

本杰明·戴维斯在 Unsplash 上拍摄的照片
有效的程序员通常对他们未来的自我有非常令人信服的目标。
盖茨和他的商业伙伴保罗·艾伦设定了让每个家庭都拥有一台电脑的目标。扎克伯格说他想利用脸书让世界更加开放。
想象一下,如果你在自己的葬礼上,你的家人、朋友和队友用充满感情的话语称赞你。你希望他们怎么评价你?你希望如何被人记住?你想留下什么贡献或遗产?
这些问题可以提醒你你的核心价值观,可以帮助你明白什么对你来说是真正有价值和重要的。
积极对待你的生活。规划你的人生。
想象你未来的自己和你想要在生活中拥有的东西。你不能击中你看不见的目标。对你来说,设定明确的目标是非常必要的,你要去哪里,你在生活中真正想要的是什么。令人信服的目标激发大规模的行动。
尝试逆向工程,设定你认为会让你朝着那个目标前进的目标和里程碑。
设定真正激励你朝着目标努力的年度目标——与你的价值观一致的目标。让它们可以衡量,并把它们分解成季度、月和周目标。每周回顾一下你目前所处的位置,以及你需要达到的目标。确定哪些是有效的,哪些需要改进。对自己诚实,无情地切断阻碍你的活动、常规或关系。坚持计划、执行和评审。
3)将最重要的事情放在第一位

我们生活在一个令人分心的时代,很难抵制我们定期收到的无数电子邮件或脸书和垃圾信息。它们可能代表了我们工作的一个重要部分,因为我们需要在开始实现之前理解需求。
然而,有时我们的注意力和精力会被不必要的干扰耗尽,这不仅会占用我们很多时间,还会增加我们的罪恶感和压力。我们可能会开始想为什么我们不能完成我们应该做的事情。
你可能有很多工作要做,随着时间的推移,新的工作可能会突然出现。当您正在开发一个需要实现的重要特性时,突然之间,生产中出现了一个严重的 bug。
因此,你在选择做什么和做什么权衡之间处于一场持续的战斗中。柯维说得很清楚,“我们大多数人花太多时间在紧急的事情上,而没有足够的时间在重要的事情上。”他进一步解释道,“关键不在于优先考虑你日程表上的事情,而在于安排好你的优先事项。”
显然,不是每个任务都有相同的重要性和紧迫性。柯维提到了我们应该遵循的最有效的顺序:
1)重要和紧急
2)重要且不紧急
3)不重要和不紧急
4)不重要且不紧急

艾玛·马修斯数字内容制作在 Unsplash 拍摄的照片
如果你想成为一名高效的程序员,你需要通过把重要的事情放在日程的首位来充分利用你的时间。你需要成为一名领导者,并根据上面的排序模式管理你的日程。
正如柯维所说,“最主要的是保持主要的东西是主要的东西。”
有很多书和文章提到了“时间管理”事实上,你无法管理时间。你只能管理你的优先事项。
分清主次似乎很困难,因为你可能害怕错过其他事情。然而,一旦你习惯了坚持不懈地做这件事,并看到它带来的好处和情感回报,它就会变得更容易和令人愉快。
4)认为双赢

无论你是否是项目中唯一的开发人员,你都不能让你的自负导致你只考虑自己。对于开发者来说,自我是最大的敌人。
有些开发人员倾向于认为 有赢有输 ,即别人必须输才能有人赢。如果你的同事在你的经理面前看起来很糟糕,你认为你会得到晋升或加薪。结果,你会把你的行为导向尽可能的炫耀,没有价值的邀功,或者贬低你的同事,所有这些都是为了表现你更优秀。
这不仅会给你一种表面的满足感(因为你一直在试图贬低你的同事),还可能会损害你的团队整体生产力,因为你和你的同事根本不愿意一起工作。
如果你想成为一个有效的开发者,你需要把自己和大多数人的做法区分开来。在任何情况下,你都应该努力为整个团队找到最好的选择。
你应该考虑最终会带来更好的长期解决方案的互利解决方案,而不是在这种情况下只有一个人能如愿以偿。
培养问自己这样问题的习惯:“他们有什么好处,我也能从中受益?我们如何才能在不破坏我们关系的情况下,各取所需?”
你可能有时会和同事发生误解和脾气暴躁,但这并不意味着你所拥有的和谐和关系会被破坏。你与人相处的能力是你生活中的一个重要方面。
尽可能避免争论,关注长期利益。当你开始时心里有了目标,即使你达到了最大的目标,你也不想孤独。
5)先寻求理解,再寻求被理解

安娜·范德·斯特尔在 Unsplash 上的照片
沟通是我们需要具备的最重要的技能之一。我们大部分时间都在交流。
我们上班前和家人沟通。我们旅行时在街上和邻居交流。我们与队友、客户和顾客交流的时间比我们写代码的时间多。
我们阅读技术书籍,学习如何使用 Docker 和开发图形应用编程接口(API),但几乎没有人向我们提到倾听和理解他人的重要性。如果我们想要健康的团队协作,那么我们需要理解我们的团队成员。
我们通常更多地看着我们的智能手机,而不是面对那些已经处理了很长时间的问题的同事。
如果我们想成为高效的程序员,互相激励,我们需要使用共情倾听,并真正理解我们的同事。这迫使其他人回应你的倾听,并愿意受你的影响。
提醒你自己,你没有能力独自完成伟大的项目,也没有能力打造自己的产品来影响数百万人。不要忽视你的队友。成为持续帮助他们的人,无论是工作任务还是软技能。当你试图向别人解释一个概念,或者帮助他们解决一个问题时,实际上你自己学得更好。教学有助于你的学习。
因此,这不仅会让你和他人感觉良好和重要,因为你的话和倾听对他人很重要,而且还会创造一种互相关心和帮助的氛围。同理心可能是软件开发人员的超能力。
6) 协同

安娜·萨莫伊洛娃在 Unsplash 上的照片
毫无疑问,大型项目是由许多团队成员开发的。
盖茨和艾伦一起创立了微软,艾伦甚至想出了微软这个名字。埃隆·马斯克(Elon Musk)与他的兄弟金巴尔(Kimbal)创建了他的第一家 IT 公司 Zip2,然后他以 3.07 亿美元的现金和 3400 万美元的证券将该公司出售给 AltaVista。Instagram 最初是由凯文·斯特罗姆和迈克·克里格创立的。
亚马逊大约有34.1 万名员工。微软拥有超过 12 万名员工。谷歌在对建立完美团队进行了大量的研究后发现,一些最有效率的团队拥有一个培养协作和拥抱心理安全的环境。
哈佛商学院教授 Amy Edmondson 将心理安全描述为“一种自信,认为团队不会因为某人说出来而使其尴尬、拒绝或惩罚他。”每个人都有贡献、合作和参与他们想要的任何事情的自由。
每当你发现自己成为与同事争论的一部分时,试着理解他们的核心兴趣。解决它们,使它们变得互惠互利和富有成效。
这样,通过利用每个成员的优势,你的团队会更有成效。团队合作大于各个部分的总和。
如果你想成为一名高效的程序员,试着帮助你的团队变得更加协同。这可以通过尊重每个队友的自由来实现,并帮助他们在表达不同观点时感到非常舒适,而不必担心尴尬。允许每个人在他们觉得有趣和值得贡献和关注的事情上做出贡献和合作。
7)磨快锯子

想象一下,你看到一个同事因为无法完成一项任务,在过去的两天里没有睡觉,陷入困境,压力很大。他们没有最后期限,但他们只是非常渴望完成工作,所以他们没有优先考虑睡眠。你建议他们休息一下,因为你同情他们。“我太忙于编程了,”他们可能会回答。
这可能有点夸张,但事实并非如此。更多的时候,我们被日复一日的生活事务所困扰,以至于我们很少退一步思考我们的生活。我们被困在“忙碌”中太多,以至于我们甚至没有试图找到任何时间来磨利锯子。
根据柯维的说法,磨利锯子意味着更新我们自己,在我们本性的所有四个方面。这些维度是生理、心理、社会/情感和精神。
我们需要健身和健康饮食来改善我们的身体状况。
我们必须掌握数据结构、算法和设计模式等基础知识;编写具有挑战性的任务;看别人的代码,新书,博客帖子;并为开源项目做贡献,以在精神上提高我们自己。Dain Miller 甚至建议读更多的书而不是写更多的代码。
我们需要乐于助人,对同事感同身受,培养协作精神,在社交和情感方面提升自己。
我们需要成长和贡献来更新我们的灵性。这些代表了我们需要满足的一些最稀有的需求。我们需要在个人和职业上成长。杰夫·考夫曼(在谷歌工作)和他的妻子将年收入的 50%捐赠给有效的慈善机构。我们不需要在谷歌工作来给予,给予不仅仅意味着经济上的。为开源项目做贡献或者通过写文章来教导他人也是给予的例子。
我们必须努力在所有这些方面保持平衡,否则可能会造成不平衡。我们可能会假装任何失衡都没有那么痛苦,但从长远来看,它可能是痛苦的。
柯维建议每天集中一个小时磨利锯子。我们必须提醒自己,磨利锯子是一场马拉松,而不是短跑。正如亚伯拉罕·林肯所说:“给我六个小时去砍树,我会用前四个小时去磨斧子。”
建立有效的习惯

许多真正擅长自己技术的开发人员分享了一些我们都可以借鉴的共同习惯。我相信成功会留下线索,当我们有一些可以效仿的、被证明有效的东西时,我们都会变得更好。
习惯是很强大的。
如果你想成为一名有效的程序员,首先你必须决定这样做。正如柯维所说,“我不是环境的产物。我是我的决定的产物。”卓越不是偶然的,而是精心计划、努力工作和全心投入的结果。正如亚里士多德所说,“我们就是我们反复做的事情。因此,优秀不是一种行为,而是一种习惯。”
开始实践这些习惯中的任何一个,自己看看效果如何。
跟我上 推特



浙公网安备 33010602011771号