递归神经网络
递归神经网络(RNN)是一个输入节点(隐藏层),用于激活 sigmoid。
RNN 实现这一点的方式是获取一个神经元的输出,并将其作为输入返回给另一个神经元,或者将当前时间步长的输入馈送给较早时间步长的输出。在这里,您将以前时间的输入一步一步地输入到当前时间的输入中,反之亦然。
这可以以多种方式使用,例如通过具有已知变化的学习门或 sigmoid 激活和许多其他类型的神经网络的组合。
RNNs 的一些应用包括预测能源需求、预测股票价格和预测人类行为。rnn 是根据基于时间和基于序列的数据建模的,但它们在各种其他应用中也是有用的。
递归神经网络是一种用于深度学习、机器学习和其他形式的人工智能(AI)的人工神经网络。它们有许多属性,这些属性使它们对于需要顺序处理数据的任务非常有用。
说得更专业一点,递归神经网络被设计成通过从序列的一个步骤到下一个步骤遍历隐藏状态,结合输入,并在输入之间来回路由来学习数据序列。RNN 是为有效处理顺序数据而设计的神经网络,但也适用于非顺序数据。
这些类型的数据包括可被视为一系列单词的文本文档或音频文件,其中您可以看到一系列声音频率和时间。输出图层的可用信息越多,读取和排序的速度就越快,其性能也就越好。
rnn 旨在识别具有序列特征的数据,并预测下一个可能的场景。它们被用于模拟人脑中神经元活动的模型中,如深度学习和机器学习。
这种类型的 RNN 有一种记忆力,使它能够记住过去发生过多次的重要事件(步骤)。rnn 是可以分解成一系列小块并作为序列处理的图像。通过使用学习的输入数据的时间相关性,我们能够将我们学习的序列与其他回归和分类任务区分开来。
处理顺序数据(文本、语音、视频等)。),我们可以将数据向量输入常规的神经网络。RNNs 可用于各种应用,例如语音识别、图像分类和图像识别。
在前馈神经网络中,决策基于当前输入,并且独立于先前输入(例如,文本、视频等)。).rnn 可以通过接受先前接收的输入并线性处理它来处理顺序数据。神经网络中的前馈使得信息能够从一个隐藏层流向下一个隐藏层,而不需要单独的处理层。基于这种学习序列,我们能够通过其对输入数据的时间依赖性将其与其他回归和分类任务区分开来。
本质上,RNN 是一个上下文循环,允许在上下文中处理数据——换句话说,它应该允许递归神经网络有意义地处理数据。神经网络的循环连接与特定上下文中的输入和输出数据形成受控循环。
由于理解上下文对于任何类型的信息的感知都是至关重要的,这使得递归神经网络能够基于放置在特定上下文中的模式来识别和生成数据。与其他类型的直接处理数据并且独立处理每个元素的神经网络不同,递归神经网络关注输入和输出数据的上下文。
由于它们的内部循环,rnn 具有动态组合经验的能力。像记忆细胞一样,这些网络能够有效地关联遥远时间的记忆输入,并随着时间的推移以高度可预测性动态捕获数据结构。已经证明,RNNs 能够比传统的神经网络(例如,以线性回归模型的形式)更快地处理序列数据。
LSTM(长短期记忆)引入了一个隐藏层网络,其中传统的人工神经元被计算单元取代。
与其他传统的 rnn 不同,LSTM 可以处理梯度和消失问题,特别是在处理长期时间序列数据时,每个存储单元(LSTM 单元)保留关于给定上下文(即输入和输出)的相同信息。
研究表明,与其他传统的 rnn 相比,神经 LSTM 网络在处理长期时间序列数据时表现更好。由于理解上下文对于任何种类的信息的感知都是至关重要的,这允许递归神经网络基于放置在特定上下文中的模式来识别和生成数据。
引用来源
- https://blog . use journal . com/stock-market-prediction-by-recurrent-neural-network-on-lstm-model-56de 700 BFF 68
- https://pathmind.com/wiki/lstm
- https://developer . NVIDIA . com/discover/recurrent-neural-network
- https://bmcbioinformatics . biomed central . com/articles/10.1186/s 12859-019-3131-8
- https://theapp solutions . com/blog/development/recurrent-neural-networks/
- https://www . mlq . ai/guide-to-recurrent-neural-networks-lst ms/
- https://blog . statsbot . co/time-series-prediction-using-recurrent-neural-networks-lst ms-807 fa 6 ca 7 f
- https://www . simpli learn . com/recurrent-neural-network-tutorial-article
- https://mc.ai/rnn-recurrent-neural-networks-lstm/
- https://victorzhou.com/blog/intro-to-rnns/
地震、疾病和股票市场之间的关系
疾控中心在 Unsplash 上的照片
股票市场、地震和疾病之间有什么联系?
由阿格尼·库马尔 — 12 分钟阅读
尽管医学进步带来了救命的护理,但患者仍然面临着被来自医院和在医院里游荡的疾病感染的风险。这种情况是由入院时不存在但后来发展的传染性病原体引起的,称为医疗保健相关感染(HAIs)。
从第一原理推导卷积
由迈克尔·布朗斯坦 — 9 分钟读完
在我的本科学习期间,我在以色列理工学院学习电子工程,我总是对卷积这样一个重要的概念突然出现感到震惊。这个看似武断的定义像眼里的一粒沙子一样扰乱了信号处理世界原本美好的画面。
照片由 Hitesh Choudhary 在 Unsplash 上拍摄
没有编码的逐步花卉分类
弗朗西斯科·帕尔马——7 分钟阅读
很少获得新技术和缺乏专家是远未解决的问题。然而,对于传统的专业类别、学术研究人员和主题专家,有大量的数据分析用例。
照片由 chuttersnap 在 Unsplash 上拍摄
数据科学的 5 个 Spark 最佳实践
由锡安巴达什 — 6 分钟阅读
虽然我们都在谈论大数据,但在你的职业生涯中,它通常需要一些时间,直到你遇到它。对我在 Wix.com 的人来说,这比我想象的要快,超过 1.6 亿的用户产生了大量数据——随之而来的是对扩展我们数据处理的需求。
背景图片由 Benjamin Davies 提供— Unsplash
多智能体强化学习和人工智能的未来
杰里米·哈里斯和雅各布·福斯特——50 分钟🎧
强化学习最近受到了很多关注,这在很大程度上要归功于 AlphaGo 和 AlphaZero 等系统,这些系统以引人注目的方式凸显了它的巨大潜力。虽然我们开发的 RL 系统已经完成了一些令人印象深刻的壮举,但它们是以一种相当幼稚的方式完成的。
自然语言处理中的困惑与熵的关系
艾萨克·奎萨达在 Unsplash 上的照片
使用信息论理解 NLP 度量
在评估语言模型时,困惑是一个常用的度量标准。例如,scikit-learn 实现的潜在狄利克雷分配(一种主题建模算法)包含了作为内置度量的困惑。
在这篇文章中,我将定义困惑,然后讨论熵,两者之间的关系,以及它如何在自然语言处理应用中自然出现。
语境
在许多自然语言任务中,一个非常普遍的情况是,你有一门语言 L 并且想要为这门语言建立一个模型 M 。“语言”可以是一种特定的体裁/语料库,如“英语维基百科”、“尼日利亚推特”或“莎士比亚”,或者(至少在概念上)只是一种通用的,如“法语”
具体来说,我们所说的语言是指生成文本的过程。为了清楚起见,我们将考虑这样一种情况,我们正在对句子建模,文本由以句尾“单词”结尾的序列单词组成但是你可以用“token”代替“word”,用“document”代替“sentence”来概括任何上下文。
什么是“过程”?出于我们的目的,我们可以把一个过程想象成概率分布的集合。给定由一个句子中的一系列先前单词组成的历史 h ,语言 L 是下一个单词是 w: 的概率
语言是概率分布的集合
例如,我愿意打赌,如果 L 是“英国人”:
- l(狗|敏捷的棕色狐狸跳过懒惰的棕色)≈ 1
- L(ipsum | Lorem) ≈ 1
- l(翅膀|水牛水牛水牛水牛水牛)≈ 0
类似地,给定一个完整的句子 s ,我们可以评估 L( s )这个句子出现的概率。如果我们包括一个特殊的句子开头“单词”wₒ,并让第 n 个“单词”是句尾“单词”,我们得到
语言 L 给出一个句子 s 的概率
然而,在产品中省略第一个术语是很常见的,或者有时使用更长的起始上下文。
获得(比如说)美式英语口语的完美复制品是非常容易的。只要在街上拦住任何一个以英语为母语的人。当然,我们通常对教计算机模型感兴趣(因此,机器学习)。因此,我们将让 M 成为我们在计算机上成功构建的任何语言模型。
这种设置具有语言 L 和模型 M 非常通用,在各种自然语言任务中发挥作用:语音到文本、自动更正、自动完成、机器翻译——不胜枚举。自动完成是最明显的例子:给定某人到目前为止键入的单词,通过选择最有可能完成的单词来猜测他们接下来可能键入什么。
困惑
给定一个语言模型 M,我们可以使用一个保持 dev(验证)集来计算一个句子的复杂度。句子上的困惑 s 定义为:
语言模型 M 的困惑
你会从第二行注意到,这是乘积分母中各项的几何平均值的倒数。由于每个单词的概率(取决于历史)都被计算过一次,我们可以将此解释为每个单词的度量。这意味着,在其他条件相同的情况下,困惑不受句子长度的影响。
一般来说,我们希望我们的概率高,这意味着困惑低。如果所有的概率都是 1,那么困惑度将是 1,模型将完美地预测文本。相反,对于较差的语言模型,困惑度会更高。
很难为困惑提供一个基准,因为像大多数自然语言任务一样,这个标准高度依赖于词汇量。给定一个语料库,较小的词汇量意味着其他单词将全部被替换为一个(词汇外)标记,从而立即提高在其上训练的任何语言模型的表面质量
以下是一些基准测试:
- **最先进的。**对于 WikiText-103 ,一个大约 28,000 篇高质量维基百科文章和大量(0.4% OOV 率)词汇的精选,一个语言模型的最先进的困惑度(截至本文撰写时)是 10.8 。
- 最坏的情况。在任何数据集上,基线模型只是以相等的概率随机猜测词汇表中的一个单词。在这种情况下,困惑只是词汇表的大小:WikiText-103 为 267,735 ,但是 WikiText-2 要小得多( 33,278 )。一般来说,30,000 对于一个语言模型的词汇量来说是相当合理的。
- 最好的情况。我在上面说过“最好的”可能的困惑是 1。但是如果那是真的,那么在一种语言中就只能有一个可能的句子,这是很无聊的。最近一篇探索文本生成的论文使用了 OpenAI 的GPT-2(WikiText-103 上有困惑的 22.1 大版本)。在他们选择的数据集上(WebText,GPT-2 就是在上面训练的),他们发现了 12.4 的困惑。但是,重要的是,他们发现,虽然他们的模型能够以低得多的复杂度生成文本(1.5!),生成的文本不是重复就是不连贯。离人类的困惑越近越好!
这最后一点非常重要。语言本身确定了一个困惑的下限。我们将在下面看到这一点。但是这指出了 NLP 中度量的一个普遍特征:一个容易评估的度量,比如困惑,不一定是模型真实性能的最佳预测者。困惑有利于开发(验证),但不一定有利于评估。评价的黄金标准仍然是人的评价。
熵
熵在物理学中是一个模糊的概念,但在信息论中却非常简单。假设你有一个过程(就像一门生成单词的语言)。在这个过程的每一步,发生的事情(事件)都有可能会发生。惊奇的量是–log(p),其中对数取任意你想要的底数(相当于换单位)。低概率事件具有高度的惊奇性。肯定会发生的事件( p =1)没有意外。不可能的事件( p =0)有无限的惊奇。
熵是由 i 索引的所有可能事件中意外事件的期望值;
概率分布的熵
所以,熵是当某件事发生时的平均惊奇程度。
根据克劳德·香农的信源编码定理,以 2 为基数的熵也是存储所发生信息的最佳位数。例如,如果我告诉你,一条 280 个字符的全长推文每个字符的熵为 1 位,这意味着,根据数学定律,无论 Twitter 做什么,他们的数据库中总要有 280 位(35 字节)的存储空间。(当然,在实践中,他们必须拥有更多)。
在我们的语言模型的上下文中,我们必须做一个调整。假设我们对长度为 n 的句子 s (事件序列)感兴趣,我们将每个单词(事件)的熵率定义为:
其中总和是所有句子的长度 n ,L(s)是句子的概率。最后一个技术点:我们要定义语言 L(或者语言模型 M)的熵,而不考虑句子长度 n 。所以最后我们定义了
语言(模型)熵的最终定义
香农-麦克米兰-布雷曼定理
在不痛不痒的假设下,熵会进一步简化。本质的观点是,如果我们取一个足够长的文本串,无论如何每个句子出现的概率都是成比例的。所以没有必要总结可能的句子。我们得到:
用香农-麦克米兰-布雷曼定理简化熵
这告诉我们,我们可以只取一个大的(n 是大的)文本,而不是试图从不同的文本中采样。
交叉熵
假设我们错误地认为我们的语言模型 M 是正确的。然后我们在没有意识到的情况下观察实际语言 L 生成的文本。交叉熵 H(L,M)就是我们测量的熵
我们的语言模型 M 的交叉熵
其中第二行再次应用了香农-麦克米兰-布雷曼定理。
至关重要的是,这告诉我们,我们可以通过测量随机句子样本(第一行)或足够大的文本块(第二行)的 log M(s)来估计交叉熵 H(L,M)。
交叉熵受语言真实熵的限制
交叉熵有一个很好的性质,即 H(L) ≤ H(L,M) 。在证明中省略极限和归一化 1/n:
在第三行,第一项只是交叉熵(记住极限和 1/n 项是隐式的)。第二项是 Kullback-Leibler 背离(或 KL 背离)。根据吉布斯不等式,KL 散度是非负的,并且只有当模型 L 和 M 相同时才为 0。KL-divergence 有点像距离度量(告诉你 L 和 M 有多不同)。⁴ ⃞
困惑与熵的关系
概括一下:
- 根据 Shannon-McMillan-Breiman 定理,在 L 生成的足够长( n 大)的开发/验证/测试数据集上评估 M 的熵近似于交叉熵 H(L,M)。我们只是通过取一个足够大的评估集来近似极限。
- 此外,这种交叉熵受到生成数据的语言的真实熵的限制
足够大数据集交叉熵的困惑定义和简化
现在剩下要做的就是展示两者之间的关系。假设我们以 e 为底取对数:
困惑与熵的关系
如果我们以 2 为底取对数,用 2 为底,以此类推。
所以,总结一下:
- 我们为生成数据的真实语言 l 建立一个语言模型 M。
- 我们评估 M(相对于 L)的困惑度,或者等价地,交叉熵。
- M 的困惑被实际语言 L 的困惑所限制(同样,交叉熵)。
困惑度量了我们模型中“随机性”的数量。如果困惑度是 3(每个单词),那么这意味着模型有 1/3 的机会猜出文本中的下一个单词。因此,它有时被称为平均分支因子。
结论
我想给你们留下一个有趣的记录。书面英语文本的真实熵是多少,这是一个悬而未决的问题(抛开其他格式,如“推特”或“口语”以及其他语言,如“俄语”。)
通过不等式 H(L) ≤ H(L,M),一种获得困惑度或熵的上界的方法是创建一个语言模型,我们在上面看到了一些困惑。
在这种情况下,我们通常对每个角色的熵*(同样每个角色的困惑)感兴趣。当使用以 2 为底的对数测量时,这就变成了每字符位数(BPC)。*
克劳德·香农(在计算机出现之前)估计,书面英语的熵在每个字符 0.6 到 1.3 比特之间。上面提到的 OpenAI 的 GPT-2 在(另一个)维基百科数据集上实现了每个字符 1 比特。
请记住,在书面英语中,每个单词大约有 5 个字符,这相当于大约 5 位,或 2⁵=32.的困惑请注意,这远远高于作为最新性能指标评测讨论的复杂性!怎么回事?记住不要在词汇或数据集之间比较困惑:单词长度可能不一样。
如果你想了解更多关于信息论的内容,请看我之前的文章了解逻辑回归系数。
参考
除了上面联系/提到的那些
[1]通常使用光束搜索进行估计。
[2]或任何给定上下文的一个可能的延续。因此,每个可能的起始单词只有一个可能的句子,或者,在论文的上下文中,给定前 40 个单词,一篇文章只有一个可能的结尾。这将违反格莱斯的准则,一套关于语言的通用规则。特别是,如果文章的其余部分是由开头决定的,为什么还要写呢?一般来说,自然语言避免低复杂度(熵)的话语,因为它们是不必要的。
[3]假设该过程是平稳的和遍历的。事实上,这些假设不适用于自然语言。如果这困扰着你,你可以把这个定理看作是一个非常合理的近似。
[4]它不是距离度量,因为它不是对称的 D(p||q)!= D(q||p)。然而,在统计流形上解释,其围绕 D(p||p)的二阶泰勒展开给出了费希尔信息度量,这是唯一的(根据陈佐夫定理,直到一个标量常数)适用于统计流形的黎曼度量。参见信息几何方法了解有限维情况下的更多参考。
显著性、功效、样本量和效应量的关系
显著的成果只是开始。
亚历山大·Cvetanovic 在 Unsplash 上的照片
祝贺你,你的实验取得了显著的成果!你可以确定(嗯,95%确定)自变量影响了因变量。我想你剩下要做的就是写下你的讨论,并把你的结果提交给学术期刊。对吗……?
获得显著的成果本身就是一个巨大的成就,但它并不能说明你的成果背后的全部故事。我想借此机会讨论统计意义、样本大小、统计功效和效应大小,所有这些都对我们如何解释我们的结果有巨大的影响。
显著性(p = 0.05)
首先,让我们讨论统计意义,因为它是推断统计学的基石。我们将在真实实验的背景下讨论显著性,因为它是最相关和最容易理解的。真实验是用来检验一个或多个变量之间因果关系的特定假设。具体来说,我们假设一个或多个变量(即自变量)产生另一个变量的变化(即因变量)。变化是我们推断的因果关系。 如果你想了解更多关于各种研究设计类型的信息,请访问我的文章( 链接 )。
例如,我们想测试一个假设,即权威的教学风格会使学生获得更高的考试分数。为了准确地测试这个假设,我们随机选择了两组学生,他们被随机安排到两个教室中的一个。一个教室是威权老师教的,一个是权威老师教的。整个学期,我们收集所有教室的考试成绩。在年底,我们将所有的分数进行平均,得出每个教室的总平均分数。让我们假设权威课堂的平均测试分数是 80%,权威课堂是 88%。看起来你的假设是正确的,与权威老师教的学生相比,权威老师教的学生在考试中平均得分高 8%。然而,如果我们把这个实验进行 100 次,每次都用不同的学生群体,你认为我们会得到相似的结果吗?教学风格对学生考试成绩的这种影响是偶然发生的还是潜在的(即不可测)变量?最后但同样重要的是,8%是否被认为“足够高”,与 80%有所不同?
**无效假设:**假设组间无显著差异的假设。在我们的教学风格示例中,零假设将预测基于教学风格的学生测试分数之间没有差异。
替代或研究假设:我们预测权威教学风格的原始假设将产生最高的学生平均考试分数。
现在我们已经做好了准备,让我们来定义什么是 p 值,以及它对您的结果有什么意义。
*p 值(也称为 Alpha)是我们的零假设为真的概率。*获得显著结果仅仅意味着通过您的统计测试获得的 p 值等于或小于您的 alpha,在大多数情况下是 0.05。
p 值 0.05 是许多研究领域中使用的常用标准。
显著的 p 值(即小于 0.05)表示零假设正确的可能性小于 5%。如果是这种情况,我们拒绝零假设,接受我们的替代假设,并确定学生测试分数彼此显著不同。注意,我们并没有说不同的教学风格导致了学生考试成绩的显著差异。p 值只告诉我们组与组之间是否不同,我们需要进行推断性的跳跃假设教学风格影响了组与组之间的不同。
观察显著 p 值的另一种方式是考虑这样的概率,如果我们运行这个实验 100 次,我们可以预期至少 5 次学生测试分数彼此非常相似。
如果我们将 alpha 设置为 0.01,我们需要得到的 p 值等于或小于 0.01(即。1%)才能认为我们的结果有意义。当然,这将强加一个更严格的标准,如果发现显著,我们将得出结论,零假设是正确的概率小于 1%。
统计能力
你的研究中的样本大小或参与者数量对你的结果是否有意义有着巨大的影响。各组之间的实际差异越大(即学生测试分数)样本越小,我们就需要找到显著的差异(即 p ≤ 0.05)。理论上,在足够大的样本量下,with 可以在大多数实验中发现显著差异。然而,极大的样本量需要昂贵的研究,并且极难获得。
I 型错误(α) 或假阳性,得出分组的概率显著不同,而实际上它们不是。我们愿意承认有 5%的可能性错误地拒绝了零假设。
第二类错误(*【β】*)或假阴性,是当事实上各组不同时,得出各组没有显著差异的概率。我们可以通过确保我们的统计测试具有适当的功效来降低犯第二类错误的概率。
功效定义为 1 —第二类错误的概率 ( β)。换句话说,它是当差异实际存在时检测到组间差异的概率(即正确拒绝零假设的概率)。因此,当我们增加统计检验的能力时,我们就增加了它检测显著的(即 p ≤ 0.05)组间差异。
人们普遍认为我们应该以 0.8 或更大的功率为目标。
那么我们将有 80%的机会找到统计上的显著差异。也就是说,我们仍然有 20%的机会无法检测出两组之间的实际显著差异。
效果大小
如果你记得我们的教学风格的例子,我们发现两组教师之间的显著差异。威权课堂测试平均得分 80%,权威课堂 88%。效应大小试图回答这样一个问题:“尽管这些差异在统计学上是显著的,但它们足够大到有意义吗?”。
效应大小提出了“最小重要差异”的概念,即在某一点上,显著差异(即 p≤ 0.05)非常小,在现实世界中没有任何益处。因此,效应大小试图确定权威型和独裁型教师之间学生考试成绩 8%的增长是否足够大,足以被认为是重要的。请记住,我们所说的小并不是指小的 p 值。
观察效应大小的另一种方法是定量测量静脉注射对静脉注射的影响程度。高效果大小表示非常重要的结果,因为对 IV 的操作会对 DV 产生很大的影响。
效应大小通常表示为 Cohen 的 d。Cohen 描述了小效应= 0.2,中等效应大小= 0.5,大效应大小= 0.8
较小的 p 值(0.05 及以下)并不表明有大的或重要的影响,高的 p 值(0.05 以上)也不意味着不重要和/或小的影响。给定足够大的样本量,即使非常小的效应量也能产生显著的 p 值(0.05 及以下)。换句话说,统计显著性探究了我们的结果是偶然的概率,而效应大小解释了我们结果的重要性。
将所有这些放在一起(功耗分析)
我们可以计算实验所需的最小样本量,以达到特定的统计功效和分析效果。这种分析应该在实际进行实验之前进行。
功率分析是在研究的设计阶段进行的一个关键步骤。通过这种方式,你将很好地了解每个实验组(包括对照组)所需的参与者数量,以发现显著差异*(如果有一个差异的话)*。
G*Power 是一个伟大的开源程序,用于根据您的功率和效果大小参数快速计算所需的样本大小。
G*Power 是一个计算统计功效分析的工具,适用于许多不同的 t 检验、f 检验、χ2 检验、z 检验和一些…
www.psychologie.hhu.de](https://www.psychologie.hhu.de/arbeitsgruppen/allgemeine-psychologie-und-arbeitspsychologie/gpower.html)
g *功率
- 选择适合您分析的**“测试系列”**
- 我们会选择 t 检验
2.选择您用于分析的**“统计测试”**
- 我们将使用平均值:两个独立平均值之间的差异(两组)
3.选择**“功率分析类型”**
- 我们将选择“先验”来确定您希望达到的功率和效果大小所需的样本。
4.选择尾部的数量
- 如果您只想确定一个方向上各组之间的显著差异,请使用一个尾部。通常,我们选择双尾检验。
- 我们将选择一个双尾检验
5.选择所需的效果尺寸或“效果尺寸 d”
- 我们将讨论一系列的效果尺寸
6.选择**“αerro prob”**或α或当各组之间存在实际差异时不拒绝零假设的概率。
- 我们将使用 0.05
7.选择您希望达到的功率。
- 我们将选择 0.8 或 80%的功率和 0.9 或 90%的功率
选择**“N2/N1 分配比例”**
- 如果您预计每组(治疗组和对照组)的参与者人数相同,则选择 1。如果一组中的人数是另一组的两倍,则选择 2。
阿尔法= 0.05
一般来说,大效应需要较小的样本量,因为它们对于分析来说是“显而易见”的。随着效应尺寸的减小,我们需要更大的样本尺寸,因为更小的效应尺寸更难找到。这对我们有利,因为效果越大,我们的结果就越重要,我们需要招募的参与者就越少。
最后但同样重要的是,这些是每个参与者组所需的样本量。例如,在一个具有 4 个组/水平的 IV 和一个 DV 的实验中,您希望找到一个具有 80%功效的大效应大小(0.8+),您将需要每组 52 个参与者或总共 208 个参与者的样本大小。
开启自动驾驶汽车的意想不到的最后一步:人类监督
偶尔出现的远程人类控制车辆的自动驾驶的中间阶段将具有难以置信的市场价值。
T 目前驾驶经济学最大的成本是驾驶员的时间**。这对个人和组织来说都是一种成本——司机只有有限的时间(在一辆车上),每次支付一个人导致拼车应用程序出现一些令人印象深刻的损失(来源和来源)。为了保持市场价值,在一些城市,优步的乘坐费用高达半价(优步费用工具和优步三藩市费用)。**
移动公司发出信号,取消司机是盈利的一条途径,但是对于许多汽车很少司机的中间阶段怎么办?
这篇文章向您展示了:
- 遥控汽车的技术既接近又直观。
- 自动驾驶汽车将很快出现在特定的环境中,以及经济上的影响。
我做了一些自动驾驶汽车的研究。
自动驾驶汽车简史
无线电控制的汽车于 1925 年首次展示,仅仅 5 年后,在迈尔斯·j·布鲁尔 1930 年的书《天堂与钢铁》中,科幻小说预言了完全的自主。
来自罗宾·r·墨菲的《科幻小说中的自动驾驶汽车》,2020 年。《天堂与钢铁》预言天堂岛上的每一个移动系统都是完全自主的——甚至没有方向盘。这延伸到汽车以外,这意味着起重机是自主的,建筑是无人操作的。全自动驾驶系统将触及的不仅仅是自动驾驶汽车。
自动驾驶汽车是我们关注的案例研究,因为这是我们花费大部分时间的事情(2018 年仅在美国就有超过 2.7 亿辆注册车辆)。自动驾驶汽车与工程交叉的故事始于 2004 年 DARPA 大挑战。穿过沙漠的 150 英里长的路线。
2004 年,0 辆汽车跑了 10 英里。
2005 年,一对夫妇完成了这门课程。下面的视频向你展示了当时的自动驾驶汽车与现在有多么不同。这是在挑战自治的极限。
现在,自动驾驶汽车是一个更加明确的研发领域。这不是一篇关于自动驾驶汽车在技术水平上处于什么位置的文章。政府甚至有网站来定义这一点。
汽车技术的持续发展旨在提供更大的安全优势和自动驾驶…
www.nhtsa.gov](https://www.nhtsa.gov/technology-innovation/automated-vehicles-safety)
这是一篇关注一个问题的补丁的文章。
问题—极限情况:无人驾驶汽车不擅长处理不可预见的环境,如建筑、倒下的树木、道路损坏等。
解决方案——远程控制:召唤一个人来计算如何绕过这个罕见的障碍物。
为什么会这样:有了足够多的传感器和计算机,我们可以让自动驾驶汽车变得非常安全。当他们对某事不确定时,他们走得很慢。当他们从未见过的东西,他们会停下来。
不过,一辆停下来的车并没有多大用处。这时,我们让人类监督者打电话进来,查看视频,并绕过挑战。每个人都希望他们的特斯拉是完全自动驾驶的,但我们需要一些方法来获得汽车没有看到或可能永远不会看到的 0.0001%英里的数据。
自主汽车的遥操作
将会有供优步司机使用的办公楼(或者他们会被外包给印度)。在这里,车手们将会收到迷你驾驶挑战。这些小挑战对电脑来说很难,但对人类来说却微不足道。比如:有一个人拿着慢行标志,这条路现在是单行道,或者:路上有一个垃圾桶*。操作员需要在障碍物周围指定 3 个航路点。*
在一个测试车队中,比方说一辆车有 10%的几率会卡在停车标志或未知的障碍物上。这意味着理想情况下,一个人可以覆盖 10 辆车,但安全起见,还是说 5 辆车吧。这是让优步烧钱的驱动成本的 1/5。
这个因素非常好。考虑一轮只有 1%未知车辆的测试版自动驾驶汽车。现在 1 个司机控制 50 辆车。这种扩展只会随着时间的推移而改进。它导致成本的大幅降低。**
这将是无人驾驶汽车的一次范式转变。我们拥有的技术已经非常接近这一点——*这只是取决于你能接受的中断程度。*让一个系统接管我会舒服得多,这个系统就是安全第一*,有支持人工监督。《连线》是我找到的唯一一份给予这款应用应有关注的出版物。这里是一些继续阅读。***
没有其他大公司公开其汽车偶尔对人类的依赖,但大多数公司都在悄悄地计划…
www.wired.com](https://www.wired.com/story/phantom-teleops/) [## 遥控自动驾驶汽车的战争升温
即使在中午,从旧金山到圣何塞的 50 英里路程也是一件痛苦的事情。像一个蹒跚学步的孩子,湾区…
www.wired.com](https://www.wired.com/story/designated-driver-teleoperations-self-driving-cars/)
谁会是第一批自动驾驶汽车?
这是对任何自动驾驶汽车文章的公开辩论。谁先做?我觉得答案是我们还没见过的人,但这要看你说的“解决自动驾驶”是什么意思了。
特斯拉:数据驱动的方法
通过获得足够的数据,埃隆·马斯克打赌端到端深度学习方法可以安全地控制特斯拉汽车。他还认为它会比任何竞争对手都早(我有点怀疑)。这是一种高度特定于应用的方法,具有增加汽车价值的巨大潜力。
目前还不清楚特斯拉计划如何处理这种情况。神经网络本质上是记忆数据,那么它们是如何记忆没见过的数据的呢?
Waymo:自主堆栈蓝图
许多传感器,过度设计的安全性,以及长远的眼光。Waymo 并不想与特斯拉竞争,它试图制定一个安全可靠的自动驾驶蓝图,不仅仅是自动驾驶(它正在获得一些资金支持来完成这项工作)。什么是“自治堆栈”?它是智能算法的集合:一个用于规划走哪条路,一个用于控制转向柱,一个用于控制电机功率等。Waymo 希望做到这一切,制造他们的汽车。
这是一个长期的方法。如果它适用于乘用车,那么它也适用于卡车、送货无人机、建筑管理等等。
小型自主创业公司:填补经济空白
其他创业公司将填补数据驱动的汽车特定方法和工程蓝图之间的空白。这里会有很多经济上可行的应用。
第一个在特定城市获得自动驾驶出租车的人:巨大。
第一个获得安全、自主送货无人机(用于亚马逊或食品):巨大。
第一个获得封闭路线自动驾驶汽车(想想机场班车):巨大。在有限区域内的自动驾驶汽车遇到的紧急情况要少得多,请来的人类专家可以轻松应对。 Optimus Ride 想把自动驾驶汽车带到小而高的交通区域。通过理解自主系统在最初几年将会有局限性——并在自主堆栈中为人类援助进行设计——他们可以更快地推出。
这种情况太多了。让人类修补角落的情况,更快地获得可行的产品。
伊萨卡是峡谷。承蒙作者好意。
灵感来自 Lex Friedman 和 Sertac Karaman 的精彩对话。看这里。***
研究科学家崩溃了
研究科学家面试问题
图片来自 Pixabay
What:研究科学家做什么?
研究科学家和数据科学家之间的界限并不明确,但一般来说,研究科学家负责使用复杂的机器学习、数学和深度学习理论在一个非常小众的领域建立和开发模型。
虽然数据科学家和相邻职位处理大量数据和指标,但研究科学家在特定的专业领域内封装了深刻的理解,与不同的团队跨职能合作,开发原型并验证假设。
研究科学家所需的技能和资格
对科研科学家的要求因公司而异:一些公司有更严格的标准,而另一些公司在经验年限、学位水平等方面更灵活。即使在公司内部,不同团队之间的工作资格也可能有所不同,所以一定要仔细检查你感兴趣的职位。
一般来说,您可以肯定会遇到以下情况:
- 强大的编程经验 : Python 或 C++无疑是许多顶级公司的必备工具,但一些公司也接受其他编程语言的类似资格。
- 相关领域的硕士、博士:看看顶级雇主,硕士学位通常是研究科学家的最低学位要求。相关领域一般包括机器人学、统计学、计算机科学等等。注:行业经验也可以补偿不同程度,即“具有 3 年行业经验的学士学位”。
- 深度学习和机器学习的经验:这在很大程度上因公司和领域而异,但许多职位要求你了解如何将机器学习概念应用于不同的解决方案。
- **所有数据:**你应该非常熟悉数据分析和可视化,以及如何将你的分析转化为可操作的见解。
对于一些公司和职位,还有一个额外的、相当独特的要求:
- 丰富的研究经验:第一作者的出版物和在顶级会议上发表的经验非常重要,也是你在不同项目中的参与和经验的重要指标。
拥有研究科学家 Roles的顶级公司
图片来自 Pixabay
为了说明不同公司的研究科学家角色的多样性,这里有一些科技和其他行业顶级公司的空缺职位的例子。请注意:这些公司中有几个研究科学家职位的例子是在招聘中高级人员,所以列出的要求可能没有反映出研究科学家整体所需的资格。
Lyft研究科学家访谈
Lyft 在世界各地有几个普通研究科学家职位的空缺。在这个职位中,你将与工程师和产品分析师一起在不同的团队中工作,分析数据并提供业务见解。
This 公司有相当严格的要求,寻找拥有硕士学位和至少四年行业经验的候选人,以及一系列额外的偏好。
此外,具有特定名称和部门的职位(如“研究科学家,自动驾驶”)与小型、高度专业化的团队合作开发某些产品和服务,通常属于行业突破性角色。这些工作有更高的要求:博士学位、深度学习知识、出版经验等。
对 Lyft 感兴趣?观看我们的 Lyft 模拟面试视频 ,查看我们的 Lyft 面试文章 !
Facebook研究科学家访谈
Lyft 除了专业职位之外,还有各种各样的一般研究科学家职位,相比之下,脸书将其所有的研究科学家组织成特定的部门。以下是一些目前开放的 world-wide:的例子
- 研究科学家(永久 Research)
- 研究科学家(AI)
- 研究科学家(Research)隐私组织
- 研究科学家(神经界面相互作用)
根据领域的不同,这些职位通常需要相关领域的博士学位,至少一年的实验室经验,第一作者出版物,以及涉及不同概念、技能和技术的丰富经验,这取决于职位。
Linkedin研究科学家访谈
Linkedin 的研究科学家角色相当于 Lyft 的一般研究科学家职责和脸书的招聘要求的结合。
Linkedin 的研究科学家工作主要包括数据处理和组织,具体团队有不同的津贴。候选人通常被期望拥有相关领域的硕士或博士学位,根据具体的职位有几年的行业经验。
其他资格主要取决于你申请的团队。例如,人工智能团队需要深入了解机器学习,以便在求职功能中开发算法。
研究科学家访谈流程
图片来自 Pixabay
和往常一样,科研人员职位的面试过程中有几个关键步骤。这里有一个你可以期待的大致框架,尽管它肯定会因公司而异。
初始电话 Screen
这次面试将由招聘人员或招聘经理进行。涵盖的一般话题将包括你过去的经历,你的简历,以及你参与过的与该职位相关的项目。这是你和公司之间的一次非常普通的“了解你”的谈话,所以放松点,给对方留下最好的印象。
技术 Interview
这(很有可能)是另一个电话面试,你将被期望展示专门与研究科学家职位相关的技术知识。共同的主题将最有可能围绕机器学习概念,分析案例研究和基本的统计概念。面试中问题的难度和广度取决于职位的侧重点。
注意:一些面试官可能会把最初的电话面试和技术面试结合起来,或者干脆直接跳过前者,所以确保你总是有所准备!
现场 Interview
现场面试是研究科学家面试过程的最后一部分。此时,你已经通过了基本筛选,并充分展示了你的技术知识,所以这次面试更多的是评估你在公司内的适合度,如果相关的话,在特定团队内的适合度。
您可能会遇到许多行为类型的问题,以及与团队当前项目相关的潜在的更多技术问题。在这里,技术面试将较少关注你的知识范围,而更多关注你对问题具体部分的方法和理由。
文化和适合的问题肯定会出现,所以在进入面试之前,最好研究公司价值观并真正了解更多关于团队目标的信息。
最后,现场面试的结构很大程度上取决于公司本身。更大、更成熟的公司,如脸书、亚马逊、谷歌等。现场部分可能会有多个面试者和轮次,这意味着你可能会在一天的大部分时间里面试不同的团队成员、其他研究科学家等等。
科研人员面试问题的类型
图片来自 Pixabay
X 概念是如何运作的?/X 的假设有哪些?/你会如何应用 X?
你明白了:这种类型的问题基本上要求教科书回忆不同的机器学习概念及其应用或条件。
不要过度复杂化!面试官在这里只是检查你是否知道和理解基本概念。特别是对于研究科学家来说,你肯定可以指望基本的机器学习概念至少出现一次。其他常见的话题从不同的统计应用到编程问题。
凯斯·study
这类问题可能会在技术筛选时提出,但几乎肯定会在现场面试中提出。
在这里,重点不在于具体的方法或内容(尽管您不希望完全胡说八道),而在于您的方法——您对不同特性的选择及其权衡。如果你能证明你的方法是正确的,并且积极地和面试官讨论问题,你应该会做得很好。
如果您想了解有关案例研究问题的一般框架的更多细节和提示,请查看我们的 数据科学案例研究访谈 文章。
产品/功能 Questions
这类问题需要对你申请的特定团队和公司进行更多的个人研究。这个问题的结构将沿着“当 Y 改变时,X 将如何改变?”,其中 X 和 Y 可能构成团队项目中的不同变量。
基本上,这个问题可以归结为你在准备过程中的承诺。面试官希望评估你是否知道公司的目标,你团队的焦点,以及你职位的总体目标。
编码问题
对于研究科学家的职位来说,编码问题经常出现。几乎所有科技公司的研究科学家都必须在实践中开发和模拟他们的想法和理论,然后交给工程师进行实际推广。
大多数研究科学家编写面试问题围绕着测试数学和算法概念。你可能会被要求模拟不同种类的随机变量(二项式,贝叶斯)或模拟(蒙特卡洛)。
好吧,希望这能为研究科学家的职位提供更多的关键见解,以及不同资格的细分,面试过程是什么样的,以及你可以期待什么样的问题。
感谢您的阅读,要了解更多内容,请务必查看采访查询,并加入数千名数据科学家和研究科学家的社区,为他们的下一次采访做准备。
感谢阅读
- 如果你有兴趣通过实践磨练你的数据科学技能,请查看 面试查询 !
- 查看我的 Youtube 频道 获取更多数据科学面试指南、商业 vlog 帖子和解决问题的技巧&。
- 如果你对数据科学感兴趣,可以看看这篇关于我工作过的科技公司的 数据科学薪水 的深度阅读。
原载于 2020 年 10 月 7 日 https://www.interviewquery.com**T21。
数据科学:学术严谨的需要
最近,我和几个人就获得数据科学或机器学习的高级学位的重要性进行了辩论。他们的论点是学位只是一张纸,我不同意。学位不仅仅是一纸文凭,社会信任体系也是建立在认证基础上的;这种信任根植于先前导致人们死亡的错误原因中。
他们反对正式学位的理由是,通过适当的培训,任何人都可以从事数据科学。因此,他们会倡导纳米学位和训练营,以替代硕士或博士等更严格的培训。他们认为,有一种更简单、更温和的方式可以成为数据科学家。
成为数据科学家没有更简单、更容易的方式
我不认为有更容易、更柔和的方式来培养出优秀的数据科学家或机器学习工程师。这两个领域都需要大量的工作和时间。虽然有些人可能会说,被训练的算法可以由许多人来完成,但我的问题还是回到安全上来。最终,你会像拥有高学历的人一样信任他们的工作吗?你会相信飞机不会坠毁,汽车或手机电池不会爆炸吗?
数据科学或数据表示做得不好的一个很好的例子是一个生死攸关的问题。【https://history.nasa.gov/rogersrep/v5p896.htm 号
虽然每个人都想认为这是任何人都可以实现的,但事实并非如此。这也是为什么工科前两年的淘汰率这么高的原因。根据的一项调查,学生申报工科第一年的淘汰率为 20%,四年和六年的毕业率分别为 35%和 54%。不仅工程更难完成,而且工程师通常需要更长的时间来完成。
工程学不是容易的课程,也不应该是。工程项目被 ABET 认可是有原因的。这和成为一名有执照的工程师需要去一所被认可的学校是一个道理。
你会在一座由读过大量土木工程知识并上过几堂桥梁建筑训练营课程的人设计的桥上开车吗?
工程学校被认可是有原因的,法学院、医学院、教学学校等等也是如此。他们证明你可以信任这个人,这个人可能在深度和广度上都比你知道的更多。如果没有经过认证的课程,人们可以做任何事情。那是人死的时候。
有人记得 Max 8 吗?
一个学位表明你已经通过了这个领域的人的测试,他们认为你应该能够胜任。这对于博士来说尤其有趣,因为在 3 到 5 年内,一个博士可能会在他们的领域内取得其他博士的资格。所以博士们稀释他们领域的可能性是巨大的。
这种现场质量稀释很容易在工业中发生。比方说,有人(没有工程或科学背景)获得了几个纳米学位,并在一些公司担任了多年的数据科学家,他们的工作不会影响安全。然后另一家公司决定聘请他们担任类似的角色,但现在他们的工作确实有可能影响人们的物质生活,比如说一辆自动驾驶汽车。一家公司给他们资质,下一家公司认定资质还可以,但没有和公众达成协议,认为这样的资质就够了。更糟糕的是,那个人可以在招聘过程中提供帮助,雇佣更多像他们一样的人,因为他们认为没有学位不应该成为任何人的障碍。现在他们的人才库被人才严重稀释,而这种人才可能是人们生存或死亡的原因。
我不是说纳米学位或新兵训练营没有他们的位置。它们当然有助于已经从事科学和工程的人掌握一些基本技能,以提高工作能力。然而,这些并不能代替实际的学位。
我知道这个领域很热门,但这并不意味着有一个简单的方法可以进入,也不应该有。工程学难是有原因的,数据科学和机器学习也是如此。如果你正在学习这两个领域中的任何一个,而不是高级学位,如果它看起来超级简单,我会小心的。这可能好得令人难以置信。我想活下去,我想对合格的人保持信任,因此,随着这个领域的成熟,我感到不仅有义务只雇用合格的人,而且有义务说出这个话题。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
旋转的医院大门:用线性回归预测病人流动率
如何使用简单线性回归模型估计住院时间
随着每年大约有 170 万人感染医疗保健相关感染(HCAIs ),卫生专业人员越来越关注如何最大限度地减少感染这些通常威胁生命且代价高昂的疾病的风险。最近的举措包括识别处于延长住院时间(LOS)高风险的患者,并创建个性化干预以减少他们在医院的时间和接触 HCAIs。
对于这个项目,我利用线性回归来预测患者入院时的住院时间,并确定导致延长住院时间的关键因素。
方法学
受 Daniel Cummings 关于使用机器学习来预测 LOS 的文章的启发,我利用了麻省理工学院的 MIMIC-III 开源数据库,其中包含来自波斯顿贝斯伊斯雷尔女执事医疗中心(BIDMC)的去身份信息。在数据库中,我合并了包含患者人口统计和诊断信息的表。
如下图 1a 所示,患者损失范围为 0-294 天。然而,我意识到,我的预测的准确性在不同的尺度上有不同的意义。例如,如果患者要住院 100 天,则预测的准确性不如患者仅住院 3 天重要。考虑到这一点,我决定把重点放在那些在医院最多呆 30 天的短期病人身上。图 1b 显示了 LOS 分布。
图 1a(左):原始数据集中损失分布。图 1b(右)住院 30 天或更短时间的患者的服务水平分布。由 Molly Liebeskind 创建的图像。
MIMIC 包括 2001 年至 2012 年的数据,通过多次访问跟踪患者。为了减少最近就诊后返回医院的患者的自相关误差,我在分析中仅利用了首次入院。
EDA 和特征工程
在只有分类特征的情况下,探索数据的最佳方式是查看每个单独特征与 LOS 的关系,以识别模式。以下是我探索中的几个亮点。
**年龄:**我的第一步是创建一个包含患者年龄的新列。作为去识别过程的一部分,与给定患者相关的所有日期被随机调整若干年。然而,单个患者的年数是一致的,这意味着出生日期(出生日期)和出生日期可以用来计算患者的年龄。如图 2 所示,老年患者比年轻患者住院时间更长。
图 2:患者年龄分布及其住院时间。由 Molly Liebeskind 创建的图像。
**入院类型:**在 BIDMC,患者入院类型分为四组。急诊表示患者需要立即介入治疗,以应对威胁生命的情况。紧急表示需要立即护理,以解决不被视为危及生命的身体或精神状况。选项用于接受预先计划医疗护理的患者,而新生儿表示入院事件与分娩相关。下图 3 显示,需要急诊和急救护理的患者通常在医院呆的时间更长。我推测,急诊病人通常在医院里呆的时间最长,因为他们需要加强医疗护理,但他们可能比急诊病人的护理优先级低。
图 3:入院类型和住院时间的关系。由 Molly Liebeskind 创建的图像。
**ICD9 代码:**我面临的最大挑战来自 6000 多个用于指示诊断的独特 ICD9 代码。数据集文档概述了解释 ICD9 代码的方法,包括查看一般诊断的前三个数字,然后利用后两个数字来识别具体情况。从那里,ICD9 代码能够被分成 18 个更广泛的类别,这些类别是我从维基百科上搜集来的。
模型
使用交叉验证的线性回归模型,我能够预测给定患者的住院时间,平均绝对误差为 3.75 天。在我为测试保留的 20%的数据中,图 4 显示了实际的患者损失和预测的损失。
图 4:绘制实际和预测的医院损失。由 Molly Liebeskind 创建的图像。
从这个模型中,我能够看到哪些因素对 LOS 有最大的影响,这对于医院识别高风险患者至关重要。下面的图 5 显示了对模型贡献最大的特性。可以直接比较这些系数,以了解模型预测中每个因素的相对权重。
图 5:特征对模型预测的重要性。由 Molly Liebeskind 创建的图像。
因为我只使用了病人入院时可用的数据,所以数据集仅限于大多数分类特征,这限制了可预测性。增强该模型的一种方法是纳入入院后不久获得的信息,包括生命体征和患者病史。此外,需要进一步分析,以确定哪些特征在较短和较长的时间尺度上影响最大。由此,在使用回归预测 LOS 之前,可以使用分类模型将患者分为非过夜、短期和长期住院候选人。
参考
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6245375/
https://www . health catalyst . com/success _ stories/reducing-length-住院时间
https://en.wikipedia.org/wiki/List_of_ICD-9_codes
正确的 C 可以让你在班上名列前茅。
现实世界中的 DS
关于协作、文化和社区,沉浸式数据科学教会了我什么
佩里·格罗内在 Unsplash 上的照片
在我的职业生涯中,我有过领导团队的经历——从小型战术代理团队,到精心组织复杂的国际跨职能团队,以实现全球品牌的年度目标。
我重视从每一次经历中学习,并在持续改进的过程中发扬这些经验,以利于组织和我自己。我还认为,挑战自己,在工作场所之外学习新技能,为我们的工作关系增加更多价值,这一点很重要。
最近,我有机会通过加入一个密集的数据科学沉浸式(DSI)来做到这一点,在那里,我每天都与来自不同背景、经历和年龄的一大群人打交道,所有人都将我们的集体优势和才能集中在解决摆在我们面前的挑战上。
作为一名学生,我发现自己可以独立工作,作为团队的一员,并且在整个课程中对某些实验室和项目提供见解和领导。
我没有预料到这一点,但我很幸运在这门课程中了解到的不仅仅是数据科学。它让我对当今工作场所中协作、文化和社区的重要性有了新的认识。
合作
我们在商业上的合作方式已经发展了几十年,我不仅仅是在谈论技术进步如何使我们今天能够做到这一点。我说的是合作精神的改变。
仔细想想,在短短几十年里,我们已经从高度竞争的“适者生存”管理结构中走了很长一段路,在这种结构中,个人或小型内部团体为了实现共同的目标而相互竞争。
德勤(Deloitte)的《人力资本趋势报告》(Human Capital Trends Report)最近指出,全球 94%的公司认为“敏捷性和协作”对其组织的成功至关重要,其中 32%的公司表示,他们正在改变其组织结构,以更加“基于团队”。
我们非常幸运,今天的环境包含了真正的合作精神,而不是激烈的内部竞争。今天,我们看到了一种方法,它同时利用每个人的优势,允许更多的思想交流和更好的产品或解决方案,以及一个比几十年前的工作场所环境更具生产力和效率的流程。该 DSI 提供了倾听、学习和领导的绝佳机会:
- 当我们作为团队的一员参加黑客马拉松挑战时,我们有一天的时间来创建和提出我们最好的模型,并尝试发布当天最高的准确度分数。在最初的对话中,我们每个人都提供了自己的优势,并分享了我们认为可以做出最大贡献的地方,之后,我们每个人都创建了自己的代码部分。然后我们把它贴了出来,发给我们的其他队友去改进和补充。我们的最终代码真实地反映了每个人的最佳贡献,当我们公布最高的准确性分数时,完全出乎我们的意料。
- 在另一个项目中,在不同的团队中,很明显我们很难将我们的方法与自然语言处理解决方案联系起来。在我们的第一次工作会议之后,我决定绘制一份流程图,列出我们所有的想法,以及我认为我们试图阐明的前进道路。在我们下一次见面之前,我把它放松给小组,以便在我们重新联系之前建立联系。让所有人步调一致至关重要。一旦有了清晰的架构,所有的想法都得到了认可,紧张感消失了,我们团队的活力变得更好了。
无论是在一场友好的课堂黑客马拉松比赛中,还是在实验室工作时在课堂外分享见解,甚至是在一个松弛的通道中通过踢代码来解决深夜问题,我们都积极地相互帮助。
我们都参加了,人人为我,我为人人。我们了解到,当团队成员之间存在信任、清晰的沟通以及想法能够激发、点燃和煽起更大概念的火焰时,就出现了真正的协作。
谷歌最近开展了一项名为“亚里士多德项目”的计划,在该计划中,他们分析了有效的团队,并确定了对他们的成功贡献最大的品质。信任是最重要的因素,被定义为心理安全:
在一个心理安全度高的团队里,队友觉得在队友身边冒险很安全。他们相信团队中没有人会因为承认错误、提出问题或提出新想法而为难或惩罚其他人。
由 You X Ventures 在 Unsplash 上拍摄的照片
文化
我的 DSI 经历不仅强化了协作精神,还让我深入了解了科技公司为其团队成功培育的协作文化。
在旧的“适者生存”结构中,讨论“下一步”意味着在提出问题之前就有了所有的答案。在当今快节奏的开发世界中,参与机会中的“下一步”—庆祝项目的进展,讨论项目的下一步,并在此过程中征求其他人的改进或创新想法。
当文化是协作的时候,公司就赢了。
当有一个为了公司的更大利益而在团队之间分享想法和资源的环境时,他们会赢,当他们出现内部竞争时,他们会输。
例如,我们的 DSI 最重要的元素之一是我们的个人顶点项目。课程进行到一半时,我们必须向导师和同事展示三个潜在的概念,以获得反馈,并讨论我们会考虑构建哪个概念。
你最初会认为在顶点时间每个人都会疯狂地互相竞争,但是我们没有。随着思想的公开交流,我们的团队从一开始就非常相互支持,当他们看到相关的东西时,会主动提供建议和文章链接。我相信我们才华横溢的导师创造了这样的环境,我知道这种环境是基于他们自己的工作经验。
我的顶点性质要求我训练自己使用一种在我的 DSI 课程中没有探索过的工具(由于我正在抓取的一个网站的结构,我意外地不得不自学如何使用 Selenium for Python,你可以在这里阅读更多关于它的内容)。经过两个星期的紧张训练和导师的指导,我找到了使用它的窍门。
大约在那个时候,我的一个同学意识到她也需要跳入 Selenium,并向我寻求指导。我很高兴能与她分享我所学到的一切,当我看到她最终的顶点项目和演示是多么令人难以置信时,我也同样激动。
我们不是唯一的,这种动力在我们的团队中循环。
这是做数据科学家的好处之一。我们利用数据来提供见解和解决问题,我们有机会使用令人难以置信的工具进行实验和工作,我们将人们聚集在一起,同时与优秀的同事合作。
克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
社区
在沉浸式数据科学环境中与同学一起工作是一回事,向在不同领域积极从事数据科学家工作的沉浸式数据科学校友学习是另一回事。
我们有机会花时间与五位极具才华的个人进行了小组讨论,他们加入该计划时有着不同的背景,现在已经成为数据科学家,发挥了他们的优势。
例如,一位小组成员非常擅长推动协作,并在他的组织中充当销售和数据分析师团队之间的粘合剂。另一位利用了她出色的法务会计背景、数据科学技能,以及她在一家著名的法务和诉讼咨询公司服务客户和管理团队的能力。
在所有情况下,他们帮助我们理解我们在课堂上所经历的就是他们每天所经历的。无论是在他们最初的求职过程中,还是在他们所扮演的角色中,合作文化都是一样的。
现在,除了在他们的日常生活中生活这种文化之外,他们现在回头积极地引导和欢迎我们进入他们的社区。
安妮·斯普拉特在 Unsplash 上的照片
结论
德勤(Deloitte)的《人力资本趋势报告》(Human Capital Trends Report)最近指出,全球 94%的公司认为“敏捷性和协作”对其组织的成功至关重要,其中 32%的公司表示,他们正在改变其组织结构,以更加“基于团队”。
毫无疑问,在我看来,任何人从像我们这样的数据科学沉浸式体验中走出来,都会在一个具有协作文化和团队结构的公司中表现出色。事实上,对于那些刚刚意识到自己也需要向这个方向转变的公司来说,它们也将是一笔巨大的财富。
协作文化存在于这个社区中,今天培育这种文化的公司,明天就会利用这种文化。
更多关于谷歌对来自项目 Aristotle 的高效团队的发现,点击这里。欲了解德勤最新人力资本趋势报告,请点击此处。
适合我的电动汽车:联合分析的用例
图片由来自 Pixabay 的 Francis Ray 拍摄
了解汽车制造商如何利用联合分析在市场竞争中胜出
2020 年可能是电动汽车成为主流的一年。事实上,在 2019 年的一项研究中,39%的司机表示,他们会考虑购买电动汽车作为下一辆车。作为一个新兴市场,了解什么问题对消费者来说是重要的是至关重要的,因为这可以帮助汽车制造商不仅在电动汽车市场建立立足点,还可以享有忠诚的客户群。联合分析是一种流行的营销工具,正是为此目的而设计的。
我认为分析加州租赁的电动汽车会很有趣,因为该州拥有美国最发达的电动汽车市场。以下是 2019 年底旧金山可供租赁的车辆(来源:【https://electrek.co/best-electric-vehicle-leases/】)。
旧金山出租的电动汽车型号
租赁详情包含在字段月成本、前期成本和期限中。其余字段涉及电动车辆的规格(例如范围、轿车或 SUV )。车辆的相对受欢迎程度可以在这里找到:https://inside EVS . com/news/343998/monthly-plug-in-EV-sales-score card/如果有令人眼花缭乱的选择,你应该购买哪一款电动汽车?
联合分析简介
联合分析为回答这个问题提供了一个原则性的方法。这种分析的一个基本概念是效用。效用试图量化消费者对一件商品的特定属性的重视程度。因此,效用反映了消费者的优先事项、价值观和偏好。效用越高,消费者从产品中获得的使用就越多,因此,如果消费者是理性的,他就会购买效用最大化的产品。
但是我们如何衡量一个人的效用呢?通常,一个群体的效用是通过要求他们对一组产品进行偏好排序或从一个小集合中选择一个产品来推断的。
来源:维基百科
通过仔细控制展示的产品组合的顺序,并通过分析回答者的选择,人们可以估计产品的各种属性对群体的隐含效用。
下面的所有分析都是在下面链接的 Github repo 中实现的。不幸的是,没有公开的电动汽车公用事业数据集可供我进行联合分析。因此,我选择模拟一组 560 个人的效用,他们分为三代:千禧一代、X 一代和婴儿潮一代。这三个细分市场是从略微不同的分布中模拟出来的,考虑到了细分市场之间在口味/偏好上的明显差异。这是三个人每月分期付款的模拟公用设施。
这三个人都有单调递减的效用(即他们是理性的,喜欢每月支付较少的钱)。人 B 对价格最敏感,因为她对月成本的效用得分范围最大。对于所有三个人,效用分数的总和将为零。这对于记录在任何属性上的效用分数都是正确的。
我们考察了同一用户对电动汽车范围的效用。
我们看到这三个人都更喜欢续航里程更长的电动汽车,其中 A 认为车辆续航里程最重要。注意,对于所有三个人来说,效用从最低 EV 范围到最高 EV 范围的增加小于他们效用分数从最可负担每月分期付款到最不可负担每月分期付款的绝对移动。因此,这三个人都优先考虑租赁的每月分期付款,而不是 EV 范围。
我们也可以测量分类变量的效用。一个流行的衡量标准是看人们从各种品牌中获得的效用。
A 和 B 强烈倾向于特斯拉而不是其他品牌。C 人不太看重电动汽车的品牌,但相对于特斯拉,他不太喜欢日产。
问题是,为什么一家公司要花这么多的麻烦和费用来进行一项研究,以得出一组用户的隐含效用分数。正如我们将看到的,它们提供了一种了解市场需求的强有力的方法,并能使一家公司在竞争中胜过其对手。
联合研究的回报
联合研究可以提供对市场状况的多种见解,使公司能够了解市场需要什么,以及它将如何对产品供应的变化做出反应。我们在下面列出了一些可以从联合研究中获得的见解。同样,关于如何实施分析的更多细节包含在下面链接的 Github repo 中。
1.预测电动汽车车型的市场份额
也许联合研究最明显的用例是,它使人们能够预测各种模型产品的相对市场份额。根据受访者的效用得分,我们预计他们会选择效用最高的电动汽车车型,因此,通过记录拥有效用最高的特定车型的受访者数量,我们可以预测该车型在更广泛市场中的受欢迎程度。下表显示了基于模拟公用事业数据的电动汽车租赁的相对受欢迎程度。
电动汽车租赁的预测受欢迎程度
同一品牌的所有型号都有相同的颜色条。我们看到,特斯拉是最受欢迎的品牌,约 60%的受访者选择了它。
上述计算假设客户将总是购买给他们带来最高效用的产品。更实际的是,考虑到第 k 个模型的效用,联合分析通常假设选择第 i 个模型的概率是:
将效用分数映射到购买概率
对一个产品效用高,对其他所有东西效用低的产品,会有很大概率被挑中。
2.对所选模型的吸引力
公司对客户的忠诚度非常感兴趣——他们的客户是喜欢他们的产品,并且相信市场上没有其他产品可以与之媲美,还是他们只是微弱地喜欢公司的产品而不是市场上的其他产品?后一种情况将表现为,例如,奥迪客户对奥迪 e-tron 的效用最高,但竞争车型(例如,特斯拉 Model X)对该客户的效用几乎一样高。
下面的热图显示了每种车型对客户的吸引力。对角线元素反映了与市场上的其他产品相比,客户对其选择的偏好程度。特斯拉,Model X 客户对他们的选择特别满意。非对角线值显示了其他电动汽车对各种电动汽车客户的相对吸引力。例如,如果交易变得更好(例如,更便宜的价格、附加产品),一些大众、e-tron 客户可能会被说服转向特斯拉、Model X。
热图中的每个非对角线单元格都有相应的散点图。散点图针对 EV 模型的一组预测客户,由所选单元的 y 坐标给出。单元格的 x 坐标将相应 EV 模型的效用与首选 EV 模型进行比较(在 y 坐标中)。这种比较是在散点图的 y 轴上进行的,散点图比较每辆车被购买的概率比率。客户根据他们所属的细分市场进行颜色编码(千禧一代是绿色,X 一代是金色,婴儿潮一代是灰色)。我们可以看到,千禧一代和 X 世代的客户更容易被说服转向 Model X。
3.顾客对品牌的忠诚度
我们可以收集所有预计会购买某个特定品牌的人,并绘制出他们购买属于该品牌的型号的概率。他们预测品牌的概率越高,对品牌的忠诚度越高。
我们看到,预计购买特斯拉电动汽车的人最有可能购买,而日产的预计客户最有可能购买日产电动汽车。
4.寻找公司最激烈的竞争对手
对于每个电动汽车品牌,我们可以关注预测购买其汽车的受访者,并通过绘制他们预测购买其他品牌的概率,我们可以看到他们认为自己预测的首选品牌与其他七个品牌相比有多有吸引力。
这里我们重点关注预测的日产客户。因此,日产的概率分布(根据定义)是最右边的。在日产之后最靠右的品牌分布是日产最大的威胁。我们看到,日产品牌最容易被特斯拉和起亚抢走客户,因为这些分布在日产分布之后最靠右。
5.模型设计对关键财务指标的影响
竞争市场中的公司通常在产品开发上投入大量资金,因为这使他们能够定期更新产品。联合分析使人们能够看到不同的租赁结构(或新的电动汽车模型)对公司财务状况的影响。假设特斯拉希望看到 Model 3 和 Model S 每月增加 100 美元的月供以及 Model X 每月增加 200 美元的月供对其财务状况的影响。
左上角的面板显示了对客户数量的影响。正如预期的那样,增加每月分期付款会导致特斯拉失去客户,而起亚受益最大。然而,右上图(月收入)显示,剩余客户支付的更高分期付款足以弥补这一不足。底部面板显示了对每个客户平均月收入以及 EBIT 的影响。
我们也可以选择检查当共同改变两个属性时,对这些相同的财务措施的影响;例如,每月分期付款和前期费用。
6.客户档案与模型产品的关系
最后,我们可以看到一组特定的产品将对公司客户的人口统计特征产生什么影响。通过了解他们的产品吸引哪些客户,公司可以更好地进行营销活动。
我们看到千禧一代对价格最敏感,25%的千禧一代特斯拉客户因每月分期付款增加 100 美元而流失。注意不同的行为:例如,失去的婴儿潮一代客户大多转向丰田,而没有失去的 X 一代客户转向丰田。
我们可以更清楚地了解在任何选择的价位上各个细分市场的情况。例如,在+100 美元/分点,对分段的影响如下:
结论
联合分析是理解市场需求和欲望的有力工具。它可以帮助公司更好地满足客户的需求,并在市场竞争中胜出。
链接
联合分析 Github:https://github.com/Melvin-Var/ConjointElectricVehicles
Youtube 演示:【https://youtu.be/JucZrr-W6CY
感谢您花时间阅读这篇文章!如果您喜欢这篇文章,您可能会喜欢我写的其他一些媒体文章:
- 了解如何在 AWS 上部署仪表板(如上面 Github repo 中的仪表板):如何使用 Docker 在 AWS 上部署仪表板应用
- 了解深度学习的优势和局限性:不,深度学习是不够的
查阅字典的正确方法
PYTHON 词典指南
小心点!你可能做错了
在用 Python 编程时,字典是现成可用的数据结构之一。
在我们开始之前,什么是字典?
Dictionary 是一个无序和无序的 Python 集合,它将惟一的键映射到一些值。在 Python 中,字典是用花括号{}
写的。键与键之间用冒号:
隔开,每个键-值对用逗号,
隔开。下面是用 Python 声明字典的方法。
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}
我们已经创建了字典,但是,如果我们不能再次检索数据,这对我们有什么好处呢?这是很多人做错的地方。我应该承认,不久前我也是其中之一。当我意识到优势后,我再也不会回头了。这就是为什么我有动力与你们分享它。
错误的方式
众所周知的,或者我应该说是传统的在字典中访问一个值的方法是通过引用它在方括号中的键名。
print(playersHeight["Lebron James"]) #print 2.06
print(playersHeight["Kevin Durant"]) #print 2.08
print(playersHeight["Luka Doncic"]) #print 2.01
print(playersHeight["James Harden"]) #print 1.96
一切都很好,对吗?没那么快!如果你输入一个字典里没有的篮球运动员的名字,你认为会发生什么?仔细看
playersHeight["Kyrie Irving"] #KeyError 'Kyrie Irving'
请注意,当您想要访问字典中不存在的键值时,将会导致 KeyError。这可能会很快升级为一个大问题,尤其是当你正在构建一个大项目的时候。不要烦恼!当然有一两种方法可以解决这个问题。
使用 If
if "Kyrie Irving" is in playersHeight:
print(playersHeight["Kyrie Irving"])
使用 Try-Except
try:
print("Kyrie Irving")
except KeyError as message:
print(message) #'Kyrie Irving'
这两个代码片段运行起来都没有问题。现在,看起来还可以,我们可以容忍写更多的行来处理可能的 KeyError。然而,当你写的代码是错误的时候,它会变得很烦人。
幸运的是,有更好的方法来做到这一点。不是一个,而是两个更好的方法!系好安全带,准备好!
正确的方式
使用 get()方法
使用 get 方法是处理字典时最好的选择之一。这个方法有两个参数,第一个是必需的,第二个是可选的。然而,为了发挥get()
方法的全部潜力,我建议您填充这两个参数。
- First:要检索其值的键的名称
- 第二:如果我们要搜索的键在
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}#If the key exists
print(playersHeight.get("Lebron James", 0)) #print 2.06
print(playersHeight.get("Kevin Durant", 0)) #print 2.08#If the key does not exist
print(playersHeight.get("Kyrie Irving", 0)) #print 0
print(playersHeight.get("Trae Young", 0)) #print 0
当键存在时,get()
方法的工作方式与引用方括号中的键的名称完全相同。但是,当键不存在时,使用get()
方法将打印我们输入的默认值作为第二个参数。
如果不指定第二个值,将返回一个None
值。
您还应该注意,使用get()
方法不会修改原始字典。我们将在本文后面进一步讨论它。
使用 setdefault()方法
什么?还有别的办法吗?是的,当然!
当您不仅想跳过 try-except 步骤,还想覆盖原来的字典时,您可以使用setdefault()
方法。
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}#If the key exists
print(playersHeight.setdefault("Lebron James", 0)) #print 2.06
print(playersHeight.setdefault("Kevin Durant", 0)) #print 2.08#If the key does not exist
print(playersHeight.setdefault("Kyrie Irving", 0)) #print 0
print(playersHeight.setdefault("Trae Young", 0)) #print 0
我说的改写是这个意思,当你再次看到原词典的时候,你会看到这个。
print(playersHeight)
"""
print
{"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96,
"Kyrie Irving": 0,
"Trae Young": 0}
除此之外,setdefault()
方法与get()
方法完全相似。
最后的想法
get()
和setdefault()
都是你们都必须熟悉的高级技术。实现它并不困难和简单。你现在唯一的障碍是打破那些旧习惯。
但是,我相信随着你使用它,你会立即体验到不同之处。过一段时间,你就不再犹豫改变,开始用get()
和setdefault()
的方法。
记住,当你不想覆盖原来的字典时,用get()
方法。
当你想对原来的字典进行修改时,setdefault()
会是你更好的选择。
问候,
弧度克里斯诺
用 Python 构建 API 的正确方法
关于 Flask 中的 API 开发,您需要了解的所有内容
我们如何建立一种从一个软件实例到另一个软件实例的通信方式?这听起来很简单,而且——说实话——确实如此。
我们只需要一个 API。
API(应用编程接口)是一个简单的接口,它定义了请求的类型(需求/问题等)。)能做的,怎么做的,怎么加工的。
Flask API 视频演练——涵盖了本文中的所有内容!
在我们的例子中,我们将构建一个 API,它允许我们向不同的端点发送一系列 GET/POST/PUT/PATCH/DELETE 请求(稍后将详细介绍),并返回或修改连接到我们的 API 的数据。
我们将使用 Flask 框架来创建我们的 API 和 Postman 来测试它。简而言之,我们将涵盖:
**> Setup**
- Our Toy Data
- Initialize a Flask API
- Endpoints
- Running a Local Server
**> Writing Our API**
- GET
- POST
- 401 Unauthorized
- PUT
- DELETE
- Users Class (summary)
**> That's It!**
设置
我们的 API 将包含两个端点,users
和locations
。前者将允许访问我们的注册用户的详细资料,而后者将包括咖啡馆的位置列表。
这里假设的用例是一个数百万的咖啡馆书签应用程序,用户打开应用程序,将他们最喜欢的咖啡馆加入书签——像谷歌地图,但没有用。
我们的玩具数据
为了简单起见,我们将这些数据存储在两个本地 CSV 文件中。实际上,您可能想看看 MongoDB 或 Google Firebase 之类的东西。
我们的 CSV 文件如下所示:
users.csv 中的用户数据。图片作者。
locations.csv 中的位置映射。图片作者。
你可以在这里下载users . CSV,在这里下载locations . CSV。
初始化烧瓶 API
现在,对于我们的 Python 脚本,我们需要导入模块并初始化我们的 API,如下所示:
from flask import Flask
from flask_restful import Resource, Api, reqparse
import pandas as pd
import astapp = Flask(__name__)
api = Api(app)
端点
正如我们已经提到的,我们的 API 将有两个端点,users
和locations
。
这样做的结果是——如果我们的 API 位于www.api.com
,那么与Users
类的通信将在www.api.com**/users**
提供,而Locations
将在[www.api.com**/locations**](http://www.api.com/locations.)
提供。
为了创建一个端点,我们定义了一个 Python 类(可以使用任何名称)并用api.add_resource
将它连接到我们想要的端点,就像这样:
- Flask 需要知道这个类是我们 API 的一个端点,所以我们用类定义传入
Resource
。 - 在类内部,我们包含了我们的 HTTP 方法(GET、POST、DELETE 等。).
- 最后,我们使用
api.add_resource
将我们的Users
类与/users
端点链接起来。
因为我们想要两个端点,所以我们复制逻辑:
运行本地服务器
最后,当我们写出我们的 API 时,我们需要测试它!
要做到这一点,我们需要托管我们的 API,我们可以通过在脚本末尾添加app.run
来本地完成,如下所示:
if __name__ == '__main__':
app.run() # run our Flask app
现在,当我们运行我们的脚本时,我们应该看到类似这样的内容:
本地主机服务器的初始化。图片作者。
一旦我们的服务器设置好了,我们就可以在使用 Postman 构建 API 时对其进行测试,如果您以前没有使用过它的话,因为它是 API 测试的事实标准。别担心——使用起来非常简单——从这里下载 Postman。
在继续之前,你可以在这里找到我们将要构建的的完整脚本。如果您不确定代码片段应该放在哪里,请查看那里!
编写 API 方法
在每个类中,我们保留了 HTTP 方法 GET、POST 和 DELETE。
为了创建一个 GET 方法,我们使用def get(self)
。POST 和 DELETE 遵循相同的模式。
得到
GET 方法是最简单的。我们返回所有存储在users.csv
中的数据,这些数据被包装在一个字典中,就像这样:
然后,我们可以运行脚本来初始化我们的 API,打开 Postman 并向我们的本地主机地址(通常是[http://127.0.0.1:5000](http://127.0.0.1:5000))
)发送 GET 请求——这是我们的 API 入口点。
如何向我们的 API 发送 GET 请求。图片作者。
要在 Postman 中向我们的 API 发送 GET 请求,我们:
- 从下拉列表中选择获取
- 键入我们的 API 实例+
/users
(端点*)的入口点* - 点击发送
- 检查我们的 API 返回的状态代码(我们应该看到
200 OK
) - *查看我们的 API 的响应,是 JSON *(像字典)格式的
users.csv
邮政
POST 方法允许我们向数据中添加记录。在这种情况下,我们将采用usedId
、name
和city
的参数。
这些参数作为 URL 参数传递给我们的 API 端点,如下所示:
*[http://127.0.0.1:5000/users**?userId=abc123&name=The**](http://127.0.0.1:5000/users?userId=abc123&name=The) **Rock&city=Los Angeles***
我们可以指定所需的参数,然后使用reqparse
解析提供的值,如下所示:
让我们分解一下解析器代码:
- 我们用
.RequestParser()
初始化我们的解析器。 - 用
.add_argument([arg_name], required)
添加我们的参数——注意required=True
意味着参数在请求中是必需的。或者,我们可以用required=False
添加可选参数。 - 使用
.parse_args()
将我们的参数及其值解析到一个 Python 字典中。
然后,我们可以访问传递给每个参数的值,就像我们通常在字典中访问键值对一样。
让我们将这些放在一起,为我们的 CSV 增加价值:
如果它开始看起来有点混乱,我们所做的就是:
- 从 URL 参数
args
创建一行新数据new_data
- 将其附加到预先存在的
data
- 保存新合并的数据
- 并且,返回
data
和一个200 OK
状态码。
我们通过向我们的/用户端点发送包含 userId 、 name 和 city 参数的 POST 请求来创建一个新用户。图片作者。
我们现在可以发送一个 POST 请求来创建一个新用户,很简单!
401 未经授权
我们的代码处理 POST 请求,允许我们向users.csv
写入新数据——但是如果那个用户已经存在了呢?
为此,我们需要添加一个检查。如果userId
已经存在,我们返回一个401 Unauthorized
代码给用户。
如果我们尝试用用户 id“ABC 123”再次发布,我们将返回以下 401 未授权状态代码和消息。图片作者。
回到 Postman,我们可以通过尝试添加同一个用户两次来测试我们的 API 是否正常工作——这一次,Rock 收到了一个401 Unauthorized
响应。
放
如果我们想给一个用户添加一个咖啡馆呢?我们不能使用 POST ,因为这会返回一个401 Unauthorized
代码——相反,我们使用 PUT 。
与 POST 类似,我们需要在提供的userId
不存在的情况下增加 if-else 逻辑。
除了对代码做了一些小的调整,我们的 PUT 方法与 POST 几乎相同。
这里我们使用 PUT 方法将 ID 为 0007 的咖啡馆添加到 Rock 的书签位置。图片作者。
回到 Postman,我们需要的输入参数已经改变。现在,我们只需要userId
和一个location
来添加到用户书签locations
中。
删除
我们也可以用 DELETE 方法删除记录。
这个方法非常简单,我们需要指定一个userId
来移除,并在不存在userId
的情况下添加一些 if-else 逻辑。
因此,如果Jill
认为我们的应用程序毫无用处,想要离开,我们会发送一个包含她的userId
的删除请求。
发送针对用户 id‘B2C’的删除请求,从我们的用户数据中删除 Jill 的记录。图片作者。
我们可以在 Postman 中测试这一点,不出所料,我们返回的数据没有 Jill 的记录。如果我们尝试删除一个不存在的用户会怎么样?
如果我们删除一个不存在的用户标识,我们将收到一个 404 未找到状态代码和一条解释用户标识不存在的消息。图片作者。
我们再次收到我们的404 Not Found
和一条简短的消息,说明没有找到userId
。
用户类别
这是组成Users
类的所有部分,通过我们的/users
端点访问。你可以在这里找到的完整脚本。
之后还需要把Locations
类拼起来。这个类应该允许我们获取、发布、修补(更新)和删除位置。
每个位置都有一个唯一的 ID——当用户将一个位置加入书签时,这个唯一的 ID 会被添加到他们的带有PUT /users
的locations
列表中。
这个的代码和我们在Users
类中写的没有太大的不同,所以我们不会重复。然而,你可以在Users
级旁边找到它。
就是这样!
就这么简单。用 Flask 和 Python 建立一个 API 非常简单。
我们现在有了一个易于使用的标准化方法来在不同的接口之间进行通信。
我们已经讨论了所有最常见的请求方法——GET、POST、PUT 和 DELETE——以及一些 HTTP 状态代码——200、401 和 404。
最后,我们已经学会了如何在本地托管我们的 API,并使用 Postman 测试它——允许我们快速诊断问题,并确保我们的 API 按预期运行。
总而言之,API 开发对于开发人员、数据科学家以及你能想象到的几乎任何其他技术倾向的角色来说都是一项至关重要的技能。
如果你想要更多,我在 YouTube 这里发布编程教程。或者,如果您有任何问题或改进的想法,请在 Twitter 或下面的评论中告诉我。
我希望你喜欢这篇文章,感谢你的阅读!
🤖《变形金刚》课程 NLP 的 70%折扣
想在 API 开发中采取下一步措施并与世界分享您的成果吗?点击此处了解谷歌云平台的 API 部署:
将您的 API 部署到 Google 云平台
towardsdatascience.com](/how-to-deploy-a-flask-api-8d54dd8d8b8a)*
将深度学习用于表格数据|实体嵌入的正确方法
从业者已经将自然语言处理(NLP)中使用的网络嵌入到表格数据中。
米卡·鲍梅斯特在 Unsplash 上的照片
最近,我参加了一个深度学习课程,在这个课程中,我被分配了一个利用深度学习技术的项目。当我在职业生涯的前 6 个月从事结构化数据工作时,我立即想到了对表格数据使用深度学习或神经网络。
在表格数据中使用深度学习并不是一个新想法。人们对这些数据使用全连接神经网络已经有很长时间了,但是它也有一些缺点;
- 神经网络需要大量数据
- 与更流行的机器学习算法(例如随机森林、梯度推进树)相比,模型性能的增益微不足道
- 缺乏可解释性
因此,对表格数据使用深度学习从未真正起步。这是真的,直到从业者将自然语言处理(NLP)中使用的嵌入网络的想法转移到表格数据。
这就是它的工作原理。
传统上,“性别”或“种族”等分类变量使用一键编码进行处理,变量中的每个实体都有一个唯一的列来跟踪实体的存在。
独热编码的例子
这种方法虽然将数据转换成适合机器学习算法的格式,但它假定实体之间是独立的,并产生稀疏矩阵。
另一方面,实体嵌入使用向量来表示每个实体,而不是二进制值。这有几个优点:
- 消除计算效率低的稀疏矩阵问题
- 生成显示每个实体之间关系的向量(获得额外的见解,而不是将它们视为独立的)
因此,我决定做一个使用表格的项目来演示实体嵌入的使用。我使用的数据集是来自 Kaggle 的 IEEE-CIS 欺诈检测数据,您可以在这里找到。
下面是一步一步的代码(包括我在 Colab 工作时的 Google Colab 特定代码)。
首先,要检查 colab 中分配给您的 GPU,您可以运行以下代码。
!nvidia-smi
在我的谷歌硬盘旁边,
from google.colab import drivedrive.mount('/content/drive')
从 Kaggle 下载数据集,为此您需要 Kaggle API 令牌。如果你需要任何帮助从 Kaggle 下载数据集,这个可能会有帮助。
!mkdir /root/.kaggle!echo '{"username":"USERNAME","key":"KEY"}' > /root/.kaggle/kaggle.json!chmod 600 /root/.kaggle/kaggle.json!kaggle competitions download -c ieee-fraud-detection# unzip all files!unzip train_transaction.csv.zip
!unzip test_transaction.csv.zip
然后,将 csv 文件读入熊猫数据帧
train = pd.read_csv("train_transaction.csv")
test = pd.read_csv("test_transaction.csv")
由于这是一个欺诈检测数据集,拥有不平衡的数据并不奇怪。
train["isFraud"].mean() # 0.03499000914417313
由于数据探索和特征工程不是这篇文章的目的,我将使用最小特征来预测欺诈标签。为了确保您可以复制我的代码,下面是我的处理步骤。
# generate time of daytrain["Time of Day"] = np.floor(train["TransactionDT"]/3600/183)
test["Time of Day"] = np.floor(test["TransactionDT"]/3600/183)# drop columnstrain.drop("TransactionDT",axis=1,inplace=True)
test.drop("TransactionDT",axis=1,inplace=True)# define continuous and categorical variablescont_vars = ["TransactionAmt"]
cat_vars = ["ProductCD","addr1","addr2","P_emaildomain","R_emaildomain","Time of Day"] + [col for col in train.columns if "card" in col]# set training and testing setx_train = train[cont_vars + cat_vars].copy()
y_train = train["isFraud"].copy()
x_test = train[cont_vars + cat_vars].copy()
y_test = train["isFraud"].copy()# process cont_vars
# scale valuesfrom sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train["TransactionAmt"] = scaler.fit_transform(x_train["TransactionAmt"].values.reshape(-1,1))
x_test["TransactionAmt"] = scaler.transform(x_test["TransactionAmt"].values.reshape(-1,1))# reduce cardinality of categorical variablesidx_list = x_train["card1"].value_counts()[x_train["card1"].value_counts()<=100].index.tolist()
x_train.loc[x_train["card1"].isin(idx_list),"card1"] = "Others"
x_test.loc[x_test["card1"].isin(idx_list),"card1"] = "Others"# fill missingx_train[cat_vars] = x_train[cat_vars].fillna("Missing")
x_test[cat_vars] = x_test[cat_vars].fillna("Missing")for cat, index in categories.items():test[cat] = pd.Categorical(test[cat],categories=categories[cat],ordered=True)
处理步骤完成后,现在我们可以将分类变量转换成整数。
# convert to numerical value for modellingdef categorify(df, cat_vars):categories = {}for cat in cat_vars:
df[cat] = df[cat].astype("category").cat.as_ordered()
categories[cat] = df[cat].cat.categoriesreturn categories def apply_test(test,categories):for cat, index in categories.items():
test[cat] = pd.Categorical(test[cat],categories=categories[cat],ordered=True)# convert to integers
categories = categorify(x_train,cat_vars)
apply_test(x_test,categories)for cat in cat_vars:
x_train[cat] = x_train[cat].cat.codes+1
x_test[cat] = x_test[cat].cat.codes+1
由于高度不平衡的数据集,我不得不使用一种称为合成少数过采样技术(SMOTE)的技术人工生成更多的欺诈数据。文档可以在这里找到。
from imblearn.over_sampling import SMOTEsm = SMOTE(random_state=0)x_sm, y_train = sm.fit_resample(x_train, y_train)
x_train = pd.DataFrame(x_sm,columns=x_train.columns)
最后,我们可以对数据进行建模。这个实体嵌入的实现采用了杰瑞米·霍华德的“程序员机器学习入门课程的思想和最佳实践。因此,杰里米通过他的研究和经验选择了许多技术细节,如嵌入大小和隐藏层。无论如何,如果你没有看过这个课程,我强烈建议你参加这个课程,听听杰里米的机器学习方法。它也是完全免费的。
# get embedding size for each categorical variabledef get_emb_sz(cat_col,categories_dict):
num_classes = len(categories_dict[cat_col])
return int(min(600,round(1.6*num_classes**0.56)))
现在来定义神经网络。网络的结构是连续变量与每个分类变量的嵌入层的简单连接。
# define the neural networksfrom tensorflow.keras.layers import Input, Embedding, Dense, Reshape, Concatenate, Dropout, BatchNormalizationfrom tensorflow.keras import Modeldef combined_network(cat_vars,categories_dict,cont_vars, layers):inputs = []
embeddings = []
emb_dict ={}# create embedding layer for each categorical variablesfor i in range(len(cat_vars)):
emb_dict[cat_vars[i]] = Input(shape=(1,))
emb_sz = get_emb_sz(cat_vars[i],categories_dict)
vocab = len(categories_dict[cat_vars[i]]) +1
embedding = Embedding(vocab,emb_sz,input_length=1)(emb_dict[cat_vars[i]])
embedding = Reshape(target_shape=(emb_sz,))(embedding)
inputs.append(emb_dict[cat_vars[i]])
embeddings.append(embedding)# concat continuous variables with embedded variablescont_input = Input(shape=(len(cont_vars),))
embedding = BatchNormalization()(cont_input)
inputs.append(cont_input)
embeddings.append(embedding)x = Concatenate()(embeddings)# add user-defined fully-connected layers separated with batchnorm and dropout layersfor i in range(len(layers)):if i ==0:
x = Dense(layers[i],activation="relu")(x)
else:
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(layers[i],activation="relu")(x)output = Dense(1,activation="sigmoid")(x)
model = Model(inputs,output)return model
现在初始化模型。
layers = [200,100]model = combined_network(cat_vars,categories,cont_vars, layers)opt = tf.keras.optimizers.Adam(0.0001)model.compile(optimizer=opt,loss='binary_crossentropy',metrics=["accuracy"])
处理神经网络的输入。
# process x_train input to fit modelinput_list = []for i in cat_vars:
input_list.append(x_train[i].values)
input_list.append(x_train[cont_vars].values)# modify x_test input to fit modeltest_list = []
for i in cat_vars:
test_list.append(x_test[i].values)
test_list.append(x_test[cont_vars].values)
训练模特~
model.fit(input_list,y_train,epochs=10)
做出预测
y_pred = model.predict(test_list)# choose a optimal threshold
y_pred = y_pred>0.1
最后,竞赛使用 ROC-AUC 对排行榜进行排名。因此,我们计算我们的 ROC-AUC,看看我们如何与他人相比。
roc = metrics.roc_auc_score(y_test,y_pred)
roc
0.8787572838641191
对于一个只使用部分功能的模型来说,这还不错。
这就是了。使用实体嵌入进行 Kaggle 表格数据竞赛。希望你喜欢它。
数据科学薪水的涨跌和再涨
意见
2015-2020 年数据科学薪资有怎样的变化,是什么原因造成的?
艾萨克·史密斯在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 薪资和增长
- 摘要
- 参考
介绍
根据 Glassdoor 的就业市场报告[2],在过去的五年里,美国数据科学的工资累计增长率在 12%之间波动。在这五年间,有几个月出现了大幅增加和减少。在本文中,我将概述这五年中特定月份和年份的关键指标,包括基本工资中位数、累计增长和同比增长。有些类似的职业,如软件工程,在同一时期也出现了稳步上升,所以注意数据科学工资的波动是很重要的。
我将推测为什么在每一个重要的时期,随着其相应的基本工资中位数的增加或减少。发生这些变化的原因有很多,观察数据科学工资(总计超过 10,000 美元)在月份和年份之间的差异很有意思。如果你想了解更多类似职位的工资信息,如数据分析师和软件工程师,你可以通过点击本文末尾的链接来参考相同的 Glassdoor 就业市场报告。
薪资和增长
我将在下面讨论数据科学薪资的涨跌和回升的关键指标。
升高
【2015 年 6 月
五年期的首次上涨是在 2015 年 6 月。本月的平均基本工资为95,798 美元,累计增长 6.2% 。这种增长可能有几个原因。虽然没有记录,但我可以推测是什么导致了累积工资增长的这种变化。
我认为,增长的峰值来自于公司意识到数据科学这一职业是多么强大和受欢迎。一旦公司雇佣越来越多的数据科学家,不仅对申请人来说,对雇主来说都变得更有竞争力。我在考虑,在这种情况下,2015 年,数据科学已经非常成熟,申请人在要求更高的工资时会更有信心,而公司在看到或听到这个职位在商业上取得的广泛成功后,会将更多预算分配给数据科学职业。
在某些情况下,您可能会争辩说,一名数据科学家可以通过 Python 等编程语言来执行通用流程自动化中两名分析师的功能,那么为什么不多付一个人一点钱,而不是从长远来看让两个人让您的企业付出更多成本呢?当然,所有的公司在某些方面都是不同的,他们各自的角色也是不同的,所以这可能是有益的,也可能是有害的。此外,数据分析师有时可能有相当不同的任务、流程和影响。
同样,这是第一次上升的指标:
*Rise of June 2015*median base salary: **$95,798**cumulative growth: **6.2%**
秋天
【2016 年 6 月
一旦公司雇佣了他们的第一个数据科学家,他们就会寻求雇佣更多的人。
也许这种趋势意味着他们已经有了一名高级数据科学家,下一个合理的选择是寻找一名初级数据科学家,可以用更低的工资收购。
2016 年 6 月的下降幅度相当大,基本工资中位数降至88,649 美元,累计增长 -1.7% ,同比增长 -7.5% 。是的,最后两个数据是阴性的。虽然我不确定工资大幅下降的原因,但我知道未来的日子会更好。作为一名数据科学家,我会创建一个数据集来隔离关键的重要特征,如下所示:
- 位置
- 人口统计学的
- 初级和高级角色的分布
- 数据科学和机器学习职位的拆分
- 薪资范围扩大
- 负面新闻
- 员工评估
- 预算削减
- 预算分配
- 报告工资时的错误
- 时事
- 通货膨胀
- 等等。
正如你所看到的,有几种不同的方式来剖析这种工资的下降。幸运的是,下跌没有持续很长时间,一个巨大的上涨将超过最初的上涨。以下是再次强调的指标:
*Fall of June 2016*median base salary: **$88,649**cumulative growth: **-1.7%**year-over-year growth: **-7.5%**
死而复生
【2020 年 6 月
过了几年才再次看到这种上升,最近一次发生在 2020 年 6 月。也许是在新冠肺炎,随着员工要求在家工作,或者被要求在家工作,技术角色变得更受关注。面向客户的角色可能会减少,因为许多新职位需要在家里通过视频会议平台单独完成。近 100,000 美元,本月数据科学家的基本工资中位数为99,674 美元,累计增长 10.5% ,同比增长 5.5% 。对于数据科学家来说,这种再次上升当然是个好消息。如果你还没有注意到,重要的是要注意到所有这些关键日期都在各自年份的 6 月份,也许这只是一个巧合,但知道为什么会出现这种趋势和模式会很有趣。
汇总信息在这里再次上升:
*Rise Again of June 2020*median base salary: **$99,674**cumulative growth: **10.5%**year-over-year growth: **5.5%**
摘要
作者 Google Data Studio 截图[3]。
为了便于查看,上图总结了关键日期及其各自的基本工资中位数、累计增长和同比增长指标。这个图表是在 Google Data Studio 中制作的,涵盖了本文中讨论的关键时间点。如果您想查看更多月份和年份的更详细的时间序列图,不仅包括数据科学统计数据,还包括其他技术位置统计数据,请访问下面参考资料部分中的 Glassdoor 链接。
至于数据科学薪酬的未来,随着疫情的出现,很难预测,曾经稳定的公司现在本身就不稳定。或许,随着越来越多的科技公司表现更好,数据科学的薪酬将会上升,或者随着越来越多的公司总体上出现下滑,薪酬将会下降。此外,数据科学职位可能很快会根据职位的具体要求提供或多或少的薪酬。例如,2025 年,数据科学家的基本工资中位数可能会降至 95,000 美元,而机器学习工程师的基本工资中位数可能会升至 105,000 美元。这种变化可能会导致公司需要更多地依赖模型的部署,减少面对面的互动。
在这篇文章中,我们讨论了数据科学工资的上涨、下跌和再次上涨。在过去的五年里,工资增长的这些变化有几个原因。请在下面随意评论为什么你认为这个工资中位数变化如此频繁。请记住,这种高度变化的趋势对于软件工程、系统工程和 web 开发人员等技术领域的类似职位来说是不一样的。
我希望你觉得我的文章有用而且有趣。谢谢你看我的文章!
参考
[1]照片由艾萨克·史密斯在Unsplash(2018)上拍摄
[2]格拉斯门公司,就业市场报告,(2008-2020 年)
[3] M.Przybyla,谷歌数据工作室截图,(2020)
OLAP 立方体的兴衰
列数据库成本结构的变化如何影响从过去预先构建 OLAP 立方体到直接在数据库中运行 OLAP 工作负载的转变。
照片由 克里斯蒂安·弗雷南 来自 Unsplash
更新:对复杂的分析前景感到困惑?查看我们的书: 《分析设置指南》 。
过去十年中,数据分析领域最大的转变之一是从构建“数据立方体”或“OLAP 立方体”转向直接在列数据库上运行 OLAP工作负载。*
(*OLAP 指的是在线分析处理,但我们一会儿会深入了解这意味着什么)。
OLAP 魔方的衰落是一个巨大的变化,尤其是如果你在过去三十年里一直从事数据分析工作。
这是一个巨大的变化,尤其是如果你在过去三十年里一直从事数据分析工作。在过去 50 年的商业智能中占主导地位的 OLAP 立方体正在消失,这可能对你来说很奇怪。您可能有理由怀疑这种向列数据库的转变。有哪些权衡?有哪些成本?这步棋真的有所有新厂商说的那么好吗?当然,在你的后脑勺有个声音在问:这是不是又一个会消失的时尚,就像之前的 NoSQL 运动一样?它会持续下去吗?
OLAP 魔方的衰落是一个巨大的变化,尤其是如果你在过去三十年里已经在数据分析领域建立了自己的职业生涯。
这篇文章试图成为一个关于 OLAP 立方体的历史和发展的详尽的资源,以及当前远离它的转变。我们将从术语的定义(OLAP 与 OLTP)开始,涵盖 OLAP 立方体的出现,然后探索列数据仓库作为 OLAP 工作负载的替代方法的出现。
这篇文章是为新手写的。如果你是一个更有经验的数据分析人员,请随意跳过前几节,以便在这篇文章的结尾找到有趣的部分。让我们开始吧。
OLAP 到底是什么?
在线分析处理(或 OLAP)是一个用来描述某一类数据库应用程序的时髦术语。这个术语是由数据库传奇人物 Edgar F. Codd 在 1993 年的一篇名为向用户分析师提供 OLAP:一项 IT 任务的论文中发明的。
Codd 创造这个术语并不是没有争议的。在他发表论文的一年前,Arbor Software 发布了一款名为 Essbase 的软件产品,而且——惊喜,惊喜!— Codd 的论文定义的属性恰好完全符合 Essbase 的特性集*。*
《计算机世界》杂志很快发现,为了更好地销售自己的产品,阿伯已经付钱给 Codd,让他“发明”OLAP 作为一种新的数据库应用。Codd 因为他的利益冲突而被点名,并被迫撤回他的论文…但似乎没有太大的影响:今天,Codd 仍然被认为是“关系数据库之父”,OLAP 从那以后一直作为一个类别存在。
那么 OLAP 的 T3 是什么样的 T2 呢你可能会问。解释这一点的最简单方法是描述两种类型的业务应用程序用法。假设你经营一家汽车经销商。您需要执行两种数据库支持的操作:
- ***你需要使用数据库作为某些业务流程的一部分。*例如,您的销售人员向客户销售最新的本田思域,您需要在业务应用程序中记录该交易。您这样做是出于操作原因:您需要一种跟踪交易的方法,您需要一种在汽车贷款或保险最终获得批准时联系客户的方法,并且您需要它来计算月底销售人员的销售奖金。
- 你使用数据库作为分析的一部分。你需要定期核对数据,以了解你的整体业务情况。在其 1993 年的论文中,Codd 称这种活动为“决策-支持”。这些问题包括“过去 3 个月伦敦售出了多少辆本田思域?”以及“谁是最高效的销售人员?”以及“轿车和 SUV 总体销量更好吗?”这些是你在月末或季度末问的问题,用来指导你近期的商业计划。
数据库使用的第一类被称为“在线事务处理”,或“OLTP”。数据库使用的第二类被称为“在线分析处理”,或“OLAP”。
或者,我喜欢这样想:
- OLTP:使用数据库来运行您的业务
- OLAP:利用数据库了解你的业务
为什么我们要区别对待这两类人?事实证明,这两种使用类型具有非常不同的数据访问模式。
使用 OLTP,您可以运行类似“记录一笔销售交易:2020 年 1 月 1 日伦敦分公司简·多伊的一辆本田思域”的操作。
有了 OLAP,你的查询会变得非常复杂:“给我过去 6 个月绿色本田 Civics 在英国的总销量”或“告诉我无名氏上个月卖了多少辆车”,以及“告诉我本田汽车这个季度与上个季度相比表现如何”?与前者的查询相比,后者的查询聚合了更多元素的数据。
在我们的汽车经销商的例子中,您可能能够在普通的关系数据库上运行 OLTP 和 OLAP 查询类型。但是如果你要处理大量的数据——例如,如果你要查询过去十年汽车销售的全球数据库——将你的数据从商业应用中分离出来进行分析就变得很重要了。否则会导致严重的性能问题。**
OLAP 的绩效挑战
为了让您对我们正在讨论的各种性能困难有一个直观的认识,请想一想当您在汽车经销商处分析汽车销售时必须提出的问题。
- 给我过去 6 个月绿色本田 Civics 在英国的总销量
- 告诉我无名氏上个月卖了多少辆车
- 与上一季度相比,本季度我们售出了多少辆本田汽车?
这些查询可以减少到一些维度*——我们想要过滤的属性。例如,您可能希望检索按以下方式聚合的数据:*
- 日期(包括月、年和日)
- 汽车模型
- 汽车制造商
- 售货员
- 汽车颜色
- 交易金额
如果您将这些信息存储在典型的关系数据库中,您将被迫编写类似这样的内容来检索三维汇总表:
***SELECT** **Model**, ALL, ALL, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**
**UNION**
**SELECT** **Model**, **Month**, ALL, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**, **Year**
**UNION**
**SELECT** **Model**, **Year**, Salesperson, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**, **Year**, Salesperson;*
一个三维卷需要 3 个这样的联合。这是可概括的:结果是 N 维上的聚合需要 N 个这样的联合。
你可能认为这已经很糟糕了,但这还不是最糟糕的例子。比方说,你想做一个交叉制表,或者 Excel power 用户所说的“数据透视表”。交叉制表的示例如下:
照片取自本文
交叉制表需要更复杂的联合和GROUP BY
子句的组合。例如,六维交叉制表需要 64 个不同的GROUP BY
操作符的 64 路联合来构建底层表示。在大多数关系数据库中,这会导致 64 次数据扫描、64 次排序或散列,以及非常长的等待时间。
商业智能从业者很早就意识到,对大型 OLAP 工作负载使用 SQL 数据库不是一个好主意。更糟糕的是,在过去,计算机并不是特别强大:例如,在 1995 年,1GB 的内存价格为 32,300 美元——对于我们今天认为理所当然的内存量来说,这是一个疯狂的价格!这意味着绝大多数业务用户不得不使用相对较小的内存来运行 BI 工作负载。因此,早期的 BI 实践者确定了一个通用的方法:从关系数据库中只获取你需要的数据,然后将它放入一个有效的内存数据结构中进行操作。
OLAP 魔方的崛起
进入 OLAP 立方体,也称为数据立方体。
OLAP 魔方源于计算机编程中的一个简单想法
OLAP 魔方源于编程中的一个简单想法:获取数据并将其放入所谓的“二维数组”中,也就是一个列表的列表。这里的自然进展是,您想要分析的维度越多,您使用的嵌套数组就越多:三维数组是列表的列表的列表,四维数组是列表的列表的列表,等等。因为嵌套数组存在于所有主要的编程语言中,所以将数据加载到这种数据结构中的想法对于早期 BI 系统的设计者来说是显而易见的。
但是,如果您想要对远远大于计算机可用内存的数据集进行分析,该怎么办呢?早期的 BI 系统决定做下一件合乎逻辑的事情:它们聚集然后缓存嵌套数组中的数据子集——偶尔将嵌套数组的部分持久存储到磁盘。今天,“OLAP 立方体”特指这些数据结构远远超过主机主内存大小的环境,例如数万亿字节的数据集和图像数据的时间序列。
OLAP 魔方的影响是深远的——并且改变了商业智能的实践直到今天。首先,几乎所有的分析都是在这样的立方体中进行的。这反过来意味着,每当需要新的报告或新的分析时,通常都必须创建新的多维数据集。
假设您想要运行一个按省份划分的汽车销售报告。如果您当前可用的多维数据集不包含省份信息,您必须要求数据工程师为您创建一个新的 OLAP 多维数据集,或者要求她修改现有的多维数据集以包含此类省份数据。
OLAP 立方体的使用也意味着数据团队必须管理复杂的管道来将数据从 SQL 数据库转换到这些立方体中。如果您正在处理大量的数据,这样的转换任务可能需要很长时间才能完成,因此一个常见的做法是在分析师开始工作之前运行所有的 ETL(提取-转换-加载)管道。这样,分析师就不需要等待他们的立方体加载最新的数据——他们可以让计算机在晚上处理数据,并在早上立即开始工作。当然,随着公司全球化,并在多个时区开设办事处,要求访问相同的分析系统,这种方法变得越来越有问题。(当你的夜晚是另一个办公室的早晨时,你如何在“夜晚”运行你的管道?)
以这种方式使用 OLAP 多维数据集还意味着 SQL 数据库和数据仓库必须以更容易创建多维数据集的方式进行组织。例如,如果你在过去的二十年里成为了一名数据分析师,那么你很有可能受过神秘艺术的训练,比如金博尔维度建模、T2、蒙氏实体关系建模、T4 数据仓库建模。这些花哨的名称只是组织数据仓库中的数据以满足企业分析需求的简单方法。
Kimball,Inmon 和他们的同事观察到,特定的访问模式发生在每个企业。他们还观察到,考虑到数据团队为报告创建新的多维数据集所花费的时间,草率的数据组织方法是一个糟糕的想法。最终,这些早期的实践者开发了可重复的方法,将业务报告需求转化为数据仓库设计——这种设计将使团队更容易以他们的 OLAP 立方体所需的格式提取他们所需的数据。
这些限制在过去四十年的大部分时间里塑造了数据团队的形式和功能。重要的是要理解,非常真实的技术限制导致了 OLAP 立方体的产生,而 OLAP 立方体的需求导致了我们今天认为理所当然的数据团队实践的出现。例如,我们:
- 维护复杂的 ETL 管道,以便对我们的数据建模。
- 雇佣一个庞大的数据工程师团队来维护这些复杂的管道。
- 根据 Kimball 或 Inmon 或 Data Vault 框架对数据进行建模,以便更容易地将数据提取和加载到多维数据集中。(即使我们已经脱离了多维数据集,我们仍然保持这些做法,以便将数据加载到分析和可视化工具中——不管它们是否建立在多维数据集之上。)
- 让大型数据工程师团队也维护第二组管道(从建模数据仓库到立方体)。
然而今天,导致创建数据立方体的许多约束已经有所松动。电脑更快。内存便宜。云起作用了。数据从业者开始意识到 OLAP 立方体自身也存在一些问题。
枯萎 OLAP 魔方
让我们暂时假设我们生活在一个内存廉价、计算能力唾手可得的世界。让我们假设在这个世界中,SQL 数据库足够强大,可以同时支持 OLTP 和 OLAP。这个世界会是什么样子?
当您可以简单地在现有的 SQL 数据库中编写查询时,为什么还要花费额外的步骤来构建和生成新的多维数据集呢?
首先,我们可能会停止使用 OLAP 立方体。这是显而易见的:当您可以简单地在现有的 SQL 数据库中编写查询时,为什么要费心去经历构建和生成新的多维数据集的额外步骤呢?如果您需要报告的数据可以盲目地从您的 OLTP 数据库复制到您的 OLAP 数据库,为什么还要费心维护一个复杂的管道呢?除了 SQL 之外,为什么还要费心培训您的分析师呢?
这听起来像是一件小事,但事实并非如此:我们已经从分析师那里听到了许多可怕的故事,他们不得不依赖数据工程师来构建多维数据集,并为每个新的报告需求建立管道。如果在这种情况下你是一名分析师,你会觉得无力在截止日期前完成任务。你的商业用户会阻止你;你会阻止你的数据工程师;您的数据工程师很可能正在努力应对数据基础架构的复杂性。这对谁都不好。最好完全避免复杂性。
第二,如果我们生活在另一个世界,那里计算成本低廉,内存充足……那么,我们将放弃严肃的数据建模工作。
这听起来很荒谬,除非你从基本原则的角度去思考。我们根据 Kimball 或 Inmon 等严格的框架对数据进行建模,因为我们必须定期为我们的分析构建 OLAP 立方体。从历史上看,这意味着一个严肃的模式设计时期。这也意味着,随着业务需求和数据源的变化,为了在我们的仓库中维护这种设计,我们需要做大量的繁忙工作。
但是如果您不再使用 OLAP 立方体进行分析,那么您就不再需要定期从数据仓库中提取数据。如果您不再需要定期从数据仓库中提取数据,那么就没有理由将您的数据仓库模式视为珍贵的东西。毕竟,如果您可以通过在您的数据仓库中创建新的“模型化”表或物化视图来“模型化”数据,那么当您需要它时,为什么还要做这些忙碌的工作呢?这种方法具有传统数据建模的所有功能优势,而没有设计和维护 Kimball 风格模式时的仪式或复杂性。
让我们讨论一个具体的例子:假设你认为你的模式是错误的。你是做什么的?在我们的另一个世界中,这个问题很容易解决:您可以简单地转储表格(或丢弃视图)并创建新的表格。由于您的报告工具直接连接到您的分析数据库,这导致了很少的中断:您不必重写一套复杂的管道或改变创建多维数据集的方式——因为您首先没有任何多维数据集要创建。**
一种新的范式出现了
好消息是这个平行宇宙不是平行宇宙。这就是我们今天生活的世界。
我们是怎么到这里的?据我所知,在过去的二十年里有三个突破——其中两个很容易理解。我们将首先处理这两个问题,然后详细探讨第三个问题。
第一个突破是摩尔定律的一个简单结果:计算和内存已经成为真正的商品,而且现在都便宜得离谱,并且很容易通过云获得。今天,任何持有有效信用卡的人都可以去 AWS 或谷歌云,几分钟内就有一个任意强大的服务器为他们运转起来。这一事实也适用于基于云的数据仓库——公司能够以几乎为零的固定成本存储和分析庞大的数据集。
第二个突破是,大多数现代的基于云的数据仓库都有所谓的大规模并行处理* (MPP)架构。MPP 数据库开发背后的核心观点实际上非常容易理解:如果您将查询分布在数百台甚至数千台机器上,您将不会受到单台计算机的计算能力和内存的限制,而是可以从根本上提高查询的性能。然后,这些机器将处理它们的查询部分,并将结果向上传递,以便聚合成最终结果。所有这些工作的结果是您获得了荒谬的性能改进:例如,Google 的 BigQuery 能够在没有索引的情况下对 3 . 14 亿行执行完整的正则表达式匹配,并在 10 秒内返回结果( source )。*
说“啊,MPP 数据库是一个东西”很容易,但是至少有 40 年的工作才使它成为今天的现实。例如,在 1985 年,数据库传奇人物迈克尔·斯通布雷克发表了一篇名为 无共享的案例 的论文——认为 MPP 数据仓库的最佳架构是处理器之间不共享任何东西的架构。几位研究者反驳了这一观点,用 无事生非 于 1996 年发表;我的观点不是说斯通布莱克是对的,他的批评者是错的;要指出的是,在开始时,即使是像“分布式数据仓库是否应该让它的计算机共享内存或存储?”是一个需要调查的公开问题。(如果你好奇的话:这个问题的答案是“基本上没有”)。
第三个突破是柱状数据仓库的发展和普及。这个概念上的突破实际上是三个中更重要的,它解释了为什么 OLAP 工作负载可以从多维数据集转移回数据库。如果我们想了解商业智能的未来,我们应该理解这是为什么。
典型的关系数据库以行的形式存储数据。例如,交易的单个行将包含字段date
、customer
、price
、product_sku
等等。但是,列式数据库将这些字段分别存储在不同的列中。如下图所示(摘自 Harizopoulos、Abadi 和 Boncz 的 2009 年演讲):
摘自 Harizopoulos、Abadi 和 Boncz 于 2009 年发表的演讲
虽然 OLAP 多维数据集要求您将感兴趣的维度的子集加载到多维数据集中,但是列数据库允许您以同样好的性能水平执行类似的 OLAP 类型的工作负载,而不需要提取和构建新的多维数据集。换句话说,这是一个非常适合 OLAP 工作负载的 SQL 数据库。
列数据库是如何实现如此高的性能的?事实证明,将数据存储在列中有三个主要好处:
- ***列型数据库具有更高的读取效率。*如果您正在运行一个类似“给我过去 5 年所有交易的平均价格”的查询,一个关系数据库将不得不加载前 5 年的所有行,即使它只是想聚集价格字段;列式数据库只需检查一列——价格列。这意味着列数据库只需筛选总数据集大小的一部分。
- 列数据库也比基于行的关系数据库压缩得更好。**事实证明,当你将相似的数据存储在一起时,你可以比存储完全不同的信息更好地压缩数据。(在信息论中,这就是所谓的“低熵”)。提醒一下,列数据库存储数据的列——意味着具有相同类型和相似值的值。与行数据相比,这要容易压缩得多,即使在读取值时会以一些计算(某些操作中的解压缩)为代价。但总的来说,这种压缩意味着当您运行聚合查询时,可以将更多的数据加载到内存中,从而导致更快的整体查询。
- 最后一个好处是,列数据库中的压缩和密集打包释放了空间,这些空间可用于对列中的数据进行排序和索引。换句话说,列数据库具有更高的排序和索引效率,这更多是因为强压缩带来了一些剩余空间。事实上,这也是互利的:研究列数据库的研究人员指出,排序的数据比未排序的数据压缩得更好,因为排序降低了熵。
所有这些属性的最终结果是,列数据库为您提供了类似 OLAP 立方体的性能,而没有显式设计(和构建)的痛苦!)立方体。这意味着您可以在您的数据仓库中执行您需要的一切,并跳过多维数据集维护带来的繁重工作。**
但是,如果有一个缺点,那就是列数据库中的更新性能非常糟糕(为了更新一个“行”,您必须访问每一列);因此,许多现代列数据库限制了您在存储数据后更新数据的能力。例如,BigQuery 根本不允许您更新数据——您只能将新数据写入仓库,而不能编辑旧数据。(更新:最初的 Dremel 论文解释说 BigQuery 有一个仅追加的结构;从 2016 年起不再如此)。
结论
所有这些发展的结果是什么?我之前在撰写《另一个世界》时所做的两个预测正在慢慢成为现实:较小的公司不太可能考虑面向数据立方体的工具或工作负载,严格的维度建模随着时间的推移已经变得不那么重要。更重要的是,亚马逊、Airbnb、优步和谷歌等精通技术的公司已经完全拒绝了数据立方体范式;这些事件和更多的事件告诉我,我们将看到这两种趋势在未来十年蔓延到企业中。
然而,我们才刚刚开始这种变化。未来可能就在眼前,但分布不均。这是意料之中的:MPP 列数据库只出现了十年左右(BigQuery 于 2010 年推出,Redshift 于 2012 年推出),我们只看到利用这种新范式的工具(如 Looker、dbt 和 Holistics)在前十年中期出现。一切都还为时过早——在大型企业抛弃他们遗留的、受立方体影响的系统并转向新系统之前,我们还有很长的路要走。
如果您是 BI 服务提供商,您可能会对这些趋势感兴趣,但让我们稍微关注一下这些趋势对您职业生涯的影响。如果你是一名数据专业人士,而 OLAP 立方体正在衰落,这对你意味着什么?
在我看来,你必须滑向冰球所在的地方:
- 主 SQL 大多数 MPP 列数据库已经将 SQL 作为事实上的查询标准。(更多关于这个这里)。
- 对那些深陷 OLAP 魔方工作流程的公司持怀疑态度。(在这里学习如何做这个)。
- 让自己熟悉列数据库时代的建模技术(Chartio 可能是我见过的第一家有这方面指南的公司;阅读此处的…但要明白这相对较新,最佳实践可能仍在变化。
- 尽可能使用 ELT(相对于 ETL);这是新范式的结果。
- 研究 Kimball、Inmon 和 data vault 方法,但着眼于在新范式中的应用。了解他们每种方法的局限性。
我开始这篇文章时,重点关注 OLAP 魔方,以此来理解商业智能历史上的一项核心技术。但事实证明,立方体的发明对我们在这个行业中看到的几乎所有东西都有影响。注意它的衰落:如果你没有从这件作品中学到什么,就让它这样吧:OLAP 魔方的兴衰对你的职业生涯比你最初想象的更重要。
跟进: 我们已经发布了一个跟进帖子,标题为: OLAP!= OLAP 魔方 。
来源
- https://en.wikipedia.org/wiki/Data_cube
- 金博尔、罗斯、 数据仓库工具包
- 大数据和 Hadoop 时代的维度建模和金博尔数据集市
- 数据立方体:概括分组依据、交叉表和小计的关系聚集运算符 (Gray,Bosworth,Lyaman,Pirahesh,1997)
- *Cuzzocrea A .(2010)*OLAP 数据立方体压缩技术:十年历史 。参加人:Kim T,Lee Y,Kang BH。,lzak d .(eds)未来一代信息技术。FGIT 2010。计算机科学讲义,第 6485 卷。施普林格、柏林、海德堡
- OLAP:过去现在未来?
- 一事无成 ,,,无事生非,,(诺曼、祖雷克、塔尼西)**
- 关于 big query:Thedremmel paperbig query 中计算与存储的分离big query 下的*一个内幕请看 BigQuery 白皮书。***
- 并行数据库系统:未来的高性能数据库处理 (德威特&格雷,1992)
- (Harizopoulos,Abadi and Boncz,2009)****
Airbnb 在西雅图的崛起:数据科学方法
图片来自 wikipedia.org
Airbnb 是世界上大多数主要城市中最常用的找住处的方法之一。它极大地改变了寻找短期甚至长期住宿的传统方式。
西雅图是美国的主要城市之一,因此也是 Airbnb 用户的热门地点之一。仅在 2016 年,西雅图就完成了近百万份预订。
在这篇文章中,我将对西雅图的 Airbnb 数据集进行深入分析。该分析仅通过 Python 3 执行,用于执行该分析的代码可以在 my Github 中找到。通过分析数据,我想回答四个不同的问题:
- Airbnb 在西雅图的这些年是如何增长的?
- 与超级主持人最相关的特征是什么?
- 主持人如何在不花钱的情况下增加自己成为超级主持人的几率?
- 一年中什么时候去西雅图最便宜?
描述性分析
本次分析使用了两个数据集:
- 列表-西雅图可用列表的详细描述,从 2008 年开始。该表包含 3818 个列表和 98 个特征,包括连续特征(如价格、纬度、经度等。),离散的(比如主机响应时间,床位数,卫生间数等。)和分类的(例如,如果主机是“超级主机”,邻居,这是主机验证,等等。).
- 日历—提供列表 ID、日期(如果列表在该特定日期被预订)以及预订价格的表格。该数据集包括近 100 万个不同的预订。
下表显示了经过一些小的预处理后的列表数据的快速描述。
从 2008 年开始在西雅图可用的列表的描述性分析。
数据显示最低价格为 22 美元,最高价格为 1000 美元。还有一个离谱的**5000 美金的保证金。**此外,我们看到,平均而言,主机响应率相当高(平均值为 95%)。审查分数等级通常也很高,但是,最低值是 40(满分为 100)。有趣的是,**有 0(零!!)卫生间。**当然,这可能是由于来自主机的错误条目。
有几种不同类型的财产,从船和阁楼到帐篷(!).以下是不同房产数量的大致情况,以及每种房产的平均价格。有趣的是,普通的树屋 比阁楼还要大。!).此外,绝大多数(约 90%)房源要么是房子,要么是公寓。
Airbnb 在西雅图暴涨
下面我制作了一张 GIF 图,展示了从 2008 年到 2015 年 Airbnb 房源数量的增长。很明显,大部分房源都在西雅图的中心区域。
现在用颜色区分各个街区,我们可以看到一些街区的房源非常密集,而另一些则很稀疏。这可能是由于几个不同的原因,例如它是否靠近市中心、生活成本、可居住的地方(例如工业区没有列表)。
与超级主持人最相关的特征是什么?
为了评估对成为超级主机的因子分解影响最大的特征,进行了两种类型的数据分析:使用 Tensorflow 库的深度神经网络和使用 scikit-learn 库的逻辑回归。长话短说,通过将数据应用于神经网络,我能够以大约 80%的准确度建模、验证和测试模型,而通过简单的逻辑回归,我能够达到大约 78%的准确度。
有许多因素会影响这种相对较低的准确性,但肯定的是,列表的小数据集(预处理后不到 3000 个列表)不允许更好的准确性。尽管如此,该模型确实给了我们一个对影响超级主机选择的主要特征的良好估计,这些特征可以在下表中看到。
从表中可以清楚地看出,最重要的特征是 1)评审分数评级;2)经核实的审查和 3)每月审查。所有这些都是基于用户的,意味着用户(列表的客人)、列表(即房屋、公寓、阁楼等)和主人之间的交互。这些都是相当明显的,但是,重要的是要了解他们的重量差异。例如,有经过验证的评论比经过验证的电话号码重要两倍。
此外,如果最近的审查是最近完成的,这也是一个加分。如果主持人住在西雅图,这也增加了超级主持人的价值。令人惊讶的是,如果主持人有严格的取消政策,这也被视为会导致成为超级主持人的事情。
现在问题来了:主持人如何在不花钱的情况下增加自己成为超级主持人的几率?
从前面描述的逻辑回归中,我可以得出一些关于增加成为超级主持人的概率而不需要额外花钱的结论:
- 尽可能快地回答客人的问题:结果显示主人回答客人的问题越快越好。
- 不要对潜在顾客的问题置之不理。
- 有严格的取消政策。
- 如果可能的话,试着列出你所在城市的房产。
- 进行尽可能多的验证,比如你的电话、电子邮件、身份等。经 Airbnb 核实。
- 尽你所能描述你的财产。
一年中什么时候去西雅图最便宜?
我使用之前描述的日历数据集来分析一年中去西雅图旅游最便宜的时间段。下图总结了数据,显示了每天的平均价格与一年中一周的函数关系。
从 1 月 1 日开始是第 0 周,很明显,冬天是一年中在 Airbnb 住宿花费最少的时候。但是,也很冷。😦
另一点是,周末全年都比较贵,与工作日的平均差价约为每天 7 美元。
结论
Airbnb 在西雅图的市场增长迅猛。这里显示的分析显示了西雅图上市的一些趋势。此外,它还描绘了一些技巧,以增加成为超级主持人的机会,而不花任何钱。我以一些一年中游览西雅图的最佳时间的评论结束了这篇文章。
我目前正在寻求更换运营商,试图进入数据科学市场。请随时查看我在 https://www.linkedin.com/in/henrique-neves-bez-50a64157/ T2 的 LinkedIn。
承认
我要感谢 Simone Centellegher,他在他的 Github 上提供了一种绘制条形图的美丽方式,我通常觉得这很枯燥。链接将于 2020 年 1 月 27 日开通。
无代码知识图的兴起
NoCode 知识图如何将数据科学的精华引入教育、金融、商业等领域
这个故事最初发表于inside bigdata。
知识图表是 21 世纪 20 年代最重要的技术之一。Gartner 预测图形处理和图形数据库的应用将在未来几年以每年 100%的速度增长。
在过去的二十年中,这项技术主要被工程师和本体学家采用,因此大多数知识图工具是为具有高级编程技能的用户设计的。
1900 年,40%的人口从事农业。
今天是 1%。编码是现代的“农业”,因为只有 0.5%的世界人口知道如何编码。
NoCode 给各行各业的人才带来平等的机会。
让我们想象一下,如果世界上大多数人能够利用尖端技术来解决最重要的问题,这会产生什么影响。
用无代码方法为顶尖人才赋能
工程和编程是重要的技能,但只有在正确的环境下,并且只有对愿意投入必要的时间和资源的人来说。这同样适用于其他许多技能,如商业、医学或艺术。专注于编码夸大了找到“正确”方法的重要性,而不是理解问题和解决方案的途径。
我们生活在一个竞争异常激烈的世界,那些能够快速采用顶级技术的人会走在时代的前面。无代码方法使拥有顶级技能的用户能够快速采用技术。
知识图表是一个很好的例子。通过一种无代码的方法,他们将数据科学世界的精华带到了医学、金融、商业、教育和艺术领域,使任何人都能够从孤立的数据源中生成并可视化独特的见解。
通过知识库开发的知识图应用的知识图
行动中的无代码知识图
如今,大多数组织通过电子邮件和存储在共享驱动器上的电子表格就关键业务流程进行协作,有时存储在云上,通常存储在员工的笔记本电脑上。不同的部门倾向于使用不同的技术。这通常会造成信息孤岛,使他们难以共享通用信息。客户、供应商、会计、运营、销售和营销以及产品数据通常跨一系列平台进行维护。
通过 Kgbase 为耐克、赫尔利和匡威开发供应链地图
有了无代码知识图,公司的所有部门都可以使用相同的“语言”来连接销售、营销和产品数据集之间的点。合作者可以贡献、可视化和查询他们的数据,消除信息孤岛并增强战略决策。
同样,知识图表被用作语义搜索引擎,激发新的想法,提高教育和研究的学习能力。无代码知识图使用户能够跨概念、关系和领域直观地探索数据,从可能被忽略的资源中学习。
2020 年 3 月 6 日,在纽约市美国自然历史博物馆,STEM Brown 学者的无代码知识图表天体物理学课程
最后,简单地将信息存储在数据仓库中会限制其有用性和价值。特别是,从多个电子表格中汇总数据并得出有意义的信息几乎是不可能的。
美国自然历史博物馆的银河数据集
使用无代码知识图连接数据源很容易,任何使用 csv 文件的人都可以导入他们的数据,定义实体之间的关系,并创建他们自己的知识图。
知识图谱成为主流
知识图表因其在高级搜索引擎和推荐系统开发中的战略作用而闻名,但它们在金融、商业、研究和教育方面也有无数有价值的应用。
随着知识图的发展势头越来越大,NoCode 方法使得这项技术成为主流。由于大多数数据集是孤立的,产生了信息过载的挑战,无代码知识图是在大型数据集上协作的游戏规则改变者,无需大量耗时的培训。
机器学习的数学路线图
除非另有说明,图片由作者提供
从头开始理解神经网络的内部运作
了解机器学习算法背后的数学是一种超能力。如果您曾经为现实生活中的问题构建过模型,您可能会体验到,如果您想要超越基线性能,熟悉细节会大有帮助。当你想突破艺术的极限时,尤其如此。
然而,这些知识大部分都隐藏在层层高等数学的背后。理解像随机梯度下降这样的方法似乎很困难,因为它是建立在多变量微积分和概率论之上的。
不过,有了适当的基础,大多数想法都可以被视为相当自然。如果你是一个初学者,不一定受过高等数学的正规教育,为自己创建一个课程是很难的。在这篇文章中,我的目标是提出一个路线图,带你从绝对零度到深入理解神经网络如何工作。
为了简单起见,我们的目标不是涵盖所有内容。相反,我们将专注于获得我们的方向。这样,如果需要的话,你将能够毫无困难地学习其他主题。
与其一口气读完,我建议你把这篇文章作为学习的参考点。深入介绍一个概念,然后检查路线图,继续前进。我坚信这是最好的学习方式:我给你指路,但你必须走下去。
基本面
大多数机器学习建立在三个支柱之上:线性代数、微积分和概率论。因为最后一个建立在前两个的基础上,所以我们应该从它们开始。微积分和线性代数可以独立学习,就像标准课程中通常的情况一样。
结石
微积分是研究函数的微分和积分的学问。本质上,神经网络是一个可微函数,所以微积分将是训练神经网络的基本工具,正如我们将看到的。
为了熟悉这些概念,你应该把事情简单化,第一次学习单个变量的函数。根据定义,函数的导数由下式定义
其中给定的 h 的比值是点 (x,f(x)) 和 (x+h,f(x+h)) 之间的直线斜率。
在极限情况下,这基本上是点 x 处切线的斜率。下图说明了这个概念。
可视化函数的导数
微分可以用来优化函数:导数在局部极大值或极小值处为零。(然而,在另一个方向上却不是这样;在 0 处见 f(x) = x 。)导数为零的点称为临界点。临界点是最小值还是最大值可以通过查看二阶导数来决定:
关于差异化有几个基本规则,但可能最重要的是所谓的链式规则:
这告诉我们如何计算复合函数的导数。
积分通常被称为微分的逆运算。这是真的,因为
这适用于任何可积函数 f(x) 。函数的积分也可以认为是曲线下的带符号面积。举个例子,
因为当函数为负时,那里的面积也有一个负号。
-π和π之间正弦曲线下的有符号面积
积分本身在理解期望值的概念中起作用。例如,像熵和 Kullback-Leibler 散度这样的量是用积分来定义的。
深造
线性代数
正如我提到的,神经网络本质上是使用微积分工具训练的函数。然而,它们是用类似矩阵乘法的线性代数概念来描述的。
线性代数是一个庞大的学科,有许多机器学习的基本方面,所以这将是一个重要的部分。
向量空间
为了更好地理解线性代数,我建议从向量空间开始。我们最好先讨论一个特例。你可以把平面上的每个点想象成一个元组
这些基本上是从零指向 (x₁,x₂) 的向量。您可以将这些向量相加,并与标量相乘:
这是向量空间的原型模型。一般来说,一组向量 V 是实数上的向量空间,如果你可以将向量加在一起并将向量与实数相乘,则以下性质成立:
不要慌!我知道这看起来很可怕(至少在我还是数学专业的大一学生时是这样),但事实并非如此。这些只是保证了向量可以像你期望的那样相加和缩放。当考虑向量空间时,如果你把它们想象成
赋范空间
如果你觉得你对向量空间有很好的理解,下一步应该是理解如何测量向量的大小。默认情况下,向量空间本身没有为此提供工具。在飞机上你会怎么做?你可能已经知道,在那里,我们有
这是一个规范的特例。一般来说,如果存在函数,向量空间 V 就是赋范的
叫做 norm
这可能有点吓人,但这是一个简单而重要的概念。有很多规范,但最重要的是 p-norm 家族
(用 p = 2 我们得到上面提到的特例)和上确界范数
有时,像对于 p = 2 ,范数来自所谓的内积,这是一个双线性函数
到这样的程度
有内积的向量空间叫做内积空间。一个例子是经典的欧几里得乘积
每一个内积都可以通过
当两个向量的内积为零时,我们说这两个向量彼此正交。(尽量在飞机上拿出一些具体的例子,更深入的理解概念。)
基和正交/标准正交基
虽然向量空间是无限的(在我们的例子中),但你可以找到一个有限的向量集,它可以用来表示空间中的所有向量。例如,在飞机上,我们有
在哪里
这是基和标准正交基的特例。
一般来说,基是向量的最小集合
使得它们的线性组合跨越向量空间:
任何向量空间都有一个基。(它可能不是一个有限集,但我们现在不应该关心这个。)毫无疑问,当谈到线性空间时,基大大简化了事情。
当一个基中的向量相互正交时,我们称之为正交基。如果一个正交基的每个基向量的范数是 1,我们说它是正交的。
线性变换
与向量空间相关的关键对象之一是线性变换。如果你以前见过神经网络,你会知道基本的构建模块之一是形式的层
其中 A 是矩阵*,b* 和 x 是向量, σ 是 sigmoid 函数。(或者任何激活功能,真的。)嗯,部分 Ax 是线性变换。一般来说,该功能
是向量空间 V 和 W 之间的线性变换
适用于所有的 x,y 中的 V ,以及所有的 a 实数。
举一个具体的例子,在平面上绕原点的旋转是线性变换。
毫无疑问,关于线性变换最重要的事实是,它们可以用矩阵来表示,这一点你会在接下来的学习中看到。
矩阵及其运算
如果线性变换是清楚的,你可以转向矩阵的研究。(线性代数课程往往从矩阵开始,但我会推荐这样做,原因稍后解释。)
矩阵最重要的运算是矩阵乘积。一般来说,如果 A 和 B 是由下式定义的矩阵
那么他们的产品可以通过
这似乎很难理解,但实际上很简单。请看下图,演示了如何计算乘积的第 2 行第 1 列中的元素。
矩阵乘法之所以这样定义,是因为矩阵表示向量空间之间的线性变换。矩阵乘法是线性变换的合成。
如果你想了解更多这方面的内容,这里有一篇很棒的文章《走向数据科学》,详细解释了一些事情。
线性代数是机器学习的基石之一。这比你想象的更直观
towardsdatascience.com](/why-is-linear-algebra-taught-so-badly-5c215710ca2c)
决定因素
在我看来,行列式无疑是线性代数中最难掌握的概念之一。根据你的学习资源,它通常由递归定义或者通过所有排列迭代的和来定义。如果没有丰富的数学经验,他们中没有一个是好对付的。
要理解这个概念,请观看下面的视频。相信我,这是魔法。
综上所述,矩阵的行列式描述了一个物体的体积在对应的线性变换下是如何缩放的。如果变换改变了方向,行列式的符号是负的。
你最终需要理解如何计算行列式,但我现在不担心这个。
特征值、特征向量和矩阵分解
标准的第一线性代数课程通常以特征值/特征向量和一些特殊的矩阵分解如奇异值分解结束。
假设我们有一个矩阵一个。数字 λ 是 A 的特征值,如果有一个向量 x (称为特征向量)使得
保持。换句话说,由 A 表示的线性变换是由 λ 对矢量 x 的缩放。这个概念在线性代数中起着重要的作用。(实际上在广泛使用线性代数的每个领域都是如此。)
至此,您已经准备好熟悉一些矩阵分解。如果你想一想,从计算的角度来看,什么类型的矩阵是最好的?对角矩阵!如果一个线性变换有一个对角矩阵,计算它在任意向量上的值是很简单的。
大多数特殊形式旨在将矩阵 A 分解成矩阵的乘积,其中最好至少有一个是对角矩阵。奇异值分解,简称 SVD,是最著名的一种分解,它指出存在特殊矩阵 U 、 V、和对角矩阵σ,使得
保持。( U 和 V 是所谓的酉矩阵,这里我不做定义,知道它是一个特殊的矩阵族就够了。)
SVD 也用于执行主成分分析,这是最简单也是最著名的降维方法之一。
深造
线性代数可以用许多方法来教。我在这里概述的道路是受谢尔登·埃克斯勒的教科书《线性代数做对了》的启发。对于在线讲座,我推荐麻省理工学院开放式课程中的线性代数课程,这是一个很好的资源。
如果一门课程可能太多,有很好的文章,例如,下面的。
它是如何工作的,在哪里使用,如何更快地学习它。
towardsdatascience.com](/mathematics-for-ai-linear-algebra-and-how-to-understand-it-better-63b430999069)
多元微积分
这是线性代数和微积分结合的部分,为训练神经网络的主要工具奠定了基础:梯度下降。从数学上讲,神经网络只是多个变量的函数。(虽然,变量的数量可以以百万计。)
类似于单变量微积分,这里的两个主要话题是微分和积分。假设我们有一个函数
将向量映射到实数。在二维中(即对于 n = 2 ),你可以把它的情节想象成一个曲面。(由于人类看不到高于三个维度的东西,所以很难想象具有两个以上实变量的函数。)
二元函数图。
多变量微分
在单变量中,导数是切线的斜率。你如何定义这里的切线?曲面上的一个点有几条切线,而不只是一条。但是有两条特殊的切线:一条平行于 x-z 平面,另一条平行于 y-z 平面。它们的斜率由偏导数决定,定义如下
也就是说,你对除了一个变量之外的所有变量求导。(形式定义对于≥ 3 个变量是相同的,只是符号更复杂。)
这些特殊方向的切线横跨切面。
切面。
梯度
还有另一个特殊的方向:梯度,它是由定义的向量
梯度永远指向涨幅最大的方向!因此,如果你在这个方向上迈出一小步,你的提升将是你可以选择的所有其他方向中最大的。这就是梯度下降的基本思想,这是一种最大化函数的算法。其步骤如下。
- 计算你目前所在的点 x₀ 的坡度。
- 向坡度方向迈一小步,到达点 x₁ 。(步长称为学习率。)
- 回到步骤 1。并且重复该过程直到收敛。
当然,这个基本算法有几个缺陷,这些年来对它进行了几次改进。现代基于梯度下降的优化器采用了许多技巧,如自适应步长、动量和其他方法,我们在这里不打算详述。
在实践中计算梯度是困难的。功能通常由其他功能的组合来描述,例如我们熟悉的线性层
其中 A 为矩阵, b 和 x 为向量, σ 为 sigmoid 函数。(当然,可以有其他激活,但是为了简单起见,我们将坚持这样做。)你会怎么计算这个梯度?在这一点上,甚至不清楚如何定义像这样的向量-向量函数的梯度,所以我们来讨论一下!一项功能
总是可以写成向量标量函数,比如
g 的梯度由矩阵定义,其第 k 行是第 k 个分量的梯度。也就是说,
这个矩阵叫做 g 的全导数。
在我们的例子中
事情变得有点复杂,因为它由两个功能组成:
和
通过应用单变量 sigmoid 分量来定义。函数 l 可以进一步分解为从 n 维向量空间映射到实数空间的 m 个函数:
在哪里
如果你计算总导数,你会看到
这就是多元函数的链式法则的全部一般性。没有它,就没有简单的方法来计算神经网络的梯度,神经网络最终是许多函数的组合。
高阶导数
类似于单变量的情况,梯度和导数在确定空间中的给定点是局部最小值还是最大值方面起作用。(或者都不是。)提供一个具体的例子,训练神经网络等价于最小化参数训练数据的损失函数。这完全是为了找到达到最小值的最佳参数配置 w :
在哪里
分别是神经网络和损失函数。
对于一般的可微向量标量函数,比如说 n 个变量,有 n 个二阶导数,形成海森矩阵
在多变量中,黑森行列式的作用是二阶导数。同样,它可以用来判断一个临界点(即所有导数都为零的地方)是最小值、最大值还是仅仅是一个鞍点。
继续教育
关于多变量微积分有很多很棒的在线课程。我有两个具体建议:
现在我们准备学习最后一门课程:概率论!
概率论
概率论是对概率的精确数学研究,是所有科学领域的基础。
抛开确切的定义,让我们思考一下概率代表什么。比方说,我掷一枚硬币,有 50%的机会(或 0.5%的可能性)是正面。重复实验 10 次后,我得到了多少个头?
如果你回答了 5,那你就错了。正面为 0.5 的概率并不能保证每一秒都是正面。相反,这意味着如果你重复实验 n 次其中 n 是一个非常大的数,人头数将非常接近 n/2 。
为了更好地理解概率,我推荐下面这篇我不久前写的文章,它提供了一个简洁但数学上正确的概念。
测度论导论
towardsdatascience.com](/the-mathematical-foundations-of-probability-beb8d8426651)
除了基础知识,还有一些高级的东西你需要了解,首先也是最重要的,期望值和熵。
预期值
假设你和你的朋友一起玩游戏。你掷一个经典的六面骰子,如果结果是 1 或 2,你就赢了 300 美元。否则,你会损失 200 英镑。如果你玩这个游戏的时间足够长,你每回合的平均收入是多少?你应该玩这个游戏吗?
嗯,你以 1/3 的概率赢了 100 块,以 2/3 的概率输了 200 块。也就是说,如果 X 是编码掷骰子结果的随机变量,那么
这是期望值,也就是长期来看,你每一轮得到的平均金额。既然这个是负的,那你就亏了,所以千万不要玩这个游戏。
一般来说,期望值由下式定义
对于离散随机变量和
对于实值连续随机变量。
在机器学习中,用于训练神经网络的损失函数是以某种方式的期望值*。*
大数定律
人们常常错误地将某些现象归结于大数定律。例如,正处于连败中的赌徒认为他们应该很快会赢,因为 T4 大数定律。这是完全错误的。让我们看看这到底是什么!
假如
是代表相同实验的独立重复的随机变量。(比如说,掷骰子或掷硬币。)
本质上,大数定律表明
这是长期结果的平均值,等于期望值。
一种解释是,如果一个随机事件重复了足够多的次数,个别结果可能并不重要。所以,如果你在一个赌场里玩一个期望值为负的游戏(他们都是这样),偶尔赢一次也没关系。大数法则暗示你会赔钱。
为了领先一点,LLN 将是随机梯度下降的关键。
信息论
让我们玩一个游戏。我想到了一个 1 到 1024 之间的数字,你要猜。你可以提问,但你的目标是用尽可能少的问题。你需要多少?
如果你聪明的话,你会用你的问题来表演二分搜索法。首先你可能会问:*数字是在 1 到 512 之间吗?*这样,你就把搜索空间缩小了一半。使用这个策略,你可以在
问题。
但是如果我在选号的时候没有用均匀分布呢?例如,我可以使用泊松分布。
泊松分布的概率质量函数。来源:维基百科
这里,您可能需要更少的问题,因为您知道分布倾向于集中在特定的点上。(这取决于参数。)
在极端情况下,当分布集中在一个数字上时,你需要个零题才能猜对。通常,问题的数量取决于分布所携带的信息。均匀分布包含的信息量最少,而奇异分布则是纯信息。
熵是对此进行量化的一种方式。它的定义是
对于离散随机变量和
对于连续的,实值的。(对数的底数通常是 2、 e ,或者 10,但这其实并不重要。)
如果你以前使用过分类模型,你可能会遇到交叉熵损失,定义如下
其中 P 是基本事实(集中于单个类别的分布),而 hatted 版本代表类别预测。这衡量了预测与事实相比有多少“信息”。当预测匹配时,交叉熵损失为零。
另一个常用的量是 Kullback-Leibler 散度,定义如下
其中 P 和 Q 是两个概率分布。这实质上是交叉熵减去熵,可以认为是量化了两种分布的不同程度。例如,当训练生成性对抗网络时,这是有用的。最小化 Kullback-Leibler 散度保证了两个分布是相似的。
继续教育
在这里,我给你推荐两本书:
- Christopher Bishop 的《模式识别与机器学习》,
- Trevor Hastie、Robert Tibshirani 和 Jerome Friedman 的《统计学习的要素》。
这是两本基础教材,它们教给你的远不止概率论。他们都超越了基础,但相应的章节提供了一个很好的介绍。
超越数学基础
至此,我们回顾了理解神经网络所必需的数学。现在,你已经准备好了有趣的部分:机器学习!
要真正理解神经网络是如何工作的,还得学习一些最优化和数理统计。这些主题建立在我们设定的基础之上。我不会详细介绍,因为这超出了本文的范围,但是我已经准备了一个学习路线图来指导您。
如果你想了解更多关于这些话题的内容,可以看看我下面的一些文章!
超越函数拟合的视角
towardsdatascience.com](/the-statistical-foundations-of-machine-learning-973c356a95f) [## 如何在 NumPy 中构建 DIY 深度学习框架
通过从头开始构建神经网络来理解神经网络的细节
towardsdatascience.com](/how-to-build-a-diy-deep-learning-framework-in-numpy-59b5b618f9b7) [## 深度学习的数学优化
关于如何最小化具有数百万个变量的函数的简要指南
towardsdatascience.com](/the-mathematics-of-optimization-for-deep-learning-11af2b1fda30)