Python 中的蒙特卡罗模拟:分析网页浏览
蒙特卡罗模拟使用随机抽样来生成概率分布,模拟感兴趣变量的潜在结果。
这种方法在金融等领域被广泛使用,以模拟各种风险情景。
然而,该方法在时间序列分析的其他方面也有重要的应用。在这个特定的例子中,让我们看看如何使用蒙特卡罗模拟来模拟网页浏览。
来源:维基媒体工具锻造
以上时间序列来源于 Wikimedia Toolforge ,是 2019 年 1 月—2020 年 7 月维基百科上“医疗保健”一词的网页浏览量时间序列。所有数据都是每日格式。
我们可以看到,时间序列显示了每天的显著波动性,并显示了数据中一些奇怪“峰值”的典型轮廓,或者是搜索该术语的频率特别高的日子。
试图对这样的时间序列进行直接预测通常是徒劳的。这是因为不可能从统计上预测搜索词何时会出现峰值,因为这会受到与过去数据无关的影响,例如,与健康相关的重大新闻事件会导致该词的搜索出现峰值。
然而,人们可能特别感兴趣的是创建一个模拟来分析网页统计的许多潜在场景,并估计在异常场景下该搜索词的页面浏览量多高或多低**。**
概率分布
当运行蒙特卡罗模拟时,注意正在使用的分布类型是很重要的。
鉴于页面浏览量不可能是负数,我们假设分布是正偏的。
这是数据的直方图:
来源:Jupyter 笔记本
我们可以看到,分布显示出正的偏斜,其中一些异常值使分布尾部向右偏斜。
>>> series = value;
>>> skewness = series.skew();
>>> print("Skewness:");
>>> print(round(skewness,2));Skewness:
0.17
该分布的偏斜计算为 0.17 。
QQ 图表明,除了异常值之外,大多数值的分布呈正态分布。
来源:Jupyter 笔记本
然而,更有可能的是,由于正偏斜,该数据表示对数正态分布-将数据转换为对数格式将导致分布的正态性。
>>> mu=np.mean(logvalue)
>>> sigma=np.std(logvalue)
>>> x = mu + sigma * np.random.lognormal(mu, sigma, 10000)
>>> num_bins = 50
这是对数数据的分布,更能代表正态分布。
来源:Jupyter 笔记本
此外,该分布的偏斜现在为 -0.41 。
>>> logvalue=pd.Series(logvalue)
>>> logseries = logvalue;
>>> skewness = logseries.skew();
>>> print("Skewness:");
>>> print(round(skewness,2));Skewness:
-0.41
这表示轻微负偏,但 QQ 图仍然表示正常。
来源:Jupyter 笔记本
蒙特 卡罗模拟
既然数据已经被适当地转换,蒙特卡罗模拟被生成来分析页面视图统计的潜在结果范围。根据所选择的分布,页面浏览量以对数格式表示。
首先,计算时间序列的平均值和波动性(用标准差衡量)。
>>> mu=np.mean(logvalue)
>>> sigma=np.std(logvalue)
>>> x = mu + sigma * np.random.lognormal(mu, sigma, 10000)
>>> num_bins = 50
然后,相关数组由 x 定义,其中 mu 和 sigma 相加,然后乘以 10,000 个随机数,这些随机数按照定义的平均值和标准偏差遵循对数正态分布。
array([5.21777304, 5.58552424, 5.39748092, ..., 5.27737933, 5.42742056, 5.52693816])
现在,让我们绘制直方图。
来源:Jupyter 笔记本
同样,这些值以对数格式表示。我们看到这个形状代表了正态分布。如上所述,蒙特卡罗模拟的思想不是预测网页浏览本身,而是提供对许多不同模拟的网页浏览的估计,以便识别 1)大多数网页浏览的范围和 2)分布中的极值范围。
结论
在本文中,您已经看到:
- 蒙特卡洛模拟的使用
- 偏斜在定义分布中的作用
- 如何实现模拟来识别获得极值的概率
非常感谢您的参与,您也可以在 michael-grogan.com的找到我更多的数据科学内容。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
蒙特卡罗树搜索:在实时游戏玩家中实现强化学习
第 1 部分—强化学习的基本概念
简介
增强学习是一种机器学习技术,我们可以设计一个代理,它可以通过与环境交互来获得经验,当它犯更多错误时,它会学习如何修改行为以避免惩罚并获得更多奖励。
你将要读到的将是一系列文章的一部分,我们正在经历一个普通游戏玩家在一个棋盘游戏上的实现的起起落落。如果你很急,你可以在这里找到纯 python 代码:
蒙特卡罗树搜索(MCTS)是一种在给定领域通过随机抽样寻找最优决策的方法
github.com](https://github.com/masouduut94/MCTS-agent-python)
还有一个更新的版本,使用 cython 来加速这里的模拟:
蒙特卡罗树搜索(MCTS)是一种在给定领域通过随机抽样寻找最优决策的方法
github.com](https://github.com/masouduut94/MCTS-agent-cythonized)
这是最终产品的演示。看看这个:
图 1:这张 gif 展示了最终软件的简单演示。如你所见,黑棋和白棋玩家在棋盘上互相竞争选择战略棋步。
因为在开始实现之前,我必须用理论概念来温暖你的视野,所以在这篇最开始的文章中,我想把你的注意力吸引到游戏环境(比如象棋)如何被建模为强化学习问题上。通过这种方式,我试图保持内容简单(少一些数学和公式)和更具体。该系列的整体重点是蒙特卡罗树搜索算法,以及如何在一个简单的棋盘游戏上实现它,即作为十六进制。
概要
- 问题描述
- 什么是强化学习
- q 学习
- 结论
问题描述
让我们假设你是一名棋手,把这块棋盘看作游戏的当前状态:
图 1:当前游戏状态。
在这个图像中,有一个属于象棋游戏的环境。游戏由各种情况(状态)组成,在这些情况下,我们必须决定在其他行动中选择最佳行动。我们选择的行动取决于状态,每个行动都会引起环境的变化,而这些变化可能会带来影响未来决策的后果。
例如,在图 1 的当前情况下, G5 中的黑棋兵不能在棋盘上采取任何行动(根据国际象棋规则)。
现在的问题是,在上图中(假设轮到黑棋),我们如何确定某个玩家选择了最好的 棋步(代表黑棋)?
图 2:图 1 中有 3 个突出显示的选项供黑人玩家选择
以下是一些黑人玩家选项:
- 移动 D8 中的黑车,取出 D2 中的白主教*。*
- 移动 G4 中的黑骑士,取出 E3 中的白皇后。
- 移动 H5 中的黑皇后并将其放置在 H1 、将死 并赢得游戏。
显然最后一步是最好的一步,因为赢得比赛是每个棋手的最终目标。在国际象棋中,除掉对手的棋子可能会增加获胜的机会,但这不是最终目的。即使你的棋子比棋盘上对手的多,你也可能不是赢家(例如,查看下图)。
图 2:游戏状态示例#2
在此图中,黑人玩家是赢家,尽管白人玩家的棋子数量超过了黑人玩家。
换句话说,有一个即时奖励(取出对手棋子)和长期奖励(赢得比赛)而后者是玩家更想要的。
让我们总结一下到目前为止我们所讨论的内容:
游戏是一个由状态组成的环境。在每个状态下,玩家可以选择特定的动作。每个动作都会引起状态转换。这种状态转换可能对玩家有利/不利。
最佳玩家(赢家)是拥有更好的计划 (策略)以最大化长期回报的人。
这听起来不像人类实现目标的方式吗?
拥有更好感知(更好规划)的人类往往牺牲自己的短期回报(比如吃快餐)来最大化长期回报(塑形)。强化学习专门致力于设计能够通过与环境互动来学习最大化长期回报的代理。
好的。现在我们已经对这个主题有了一些背景知识,让我们回顾一下强化学习的基础知识,并学习我们如何利用它来模拟一般的游戏。
什么是强化学习?
R.Sutton 等人[1]很好地描述了 RL:
强化学习是学习做什么——如何将情况映射到行动——以便最大化数字奖励信号。学习者没有被告知要采取哪些行动,而是必须通过尝试来发现哪些行动会产生最大的回报。
强化学习代理在环境中采取行动,观察状态并接受奖励。它根据累积的奖励开始计划。
RL 的关键要素包括:
- **代理人。**在这里,它是一个通过反复试验来学习如何玩游戏的程序
- **环境(州)。**代理执行动作的世界(这里是国际象棋游戏)。
- **行动。**代理进行的移动,将环境状态更改为新状态。
- **奖励。**对行动的评估,可以是积极的或消极的,也可以是延迟的。
正如[1]断言的RL 与其他技术的关键区别在于其试错性质和延迟回报。我发现【2】和【3】最能理解 RL 和其他技术的区别。
强化学习环境可以用马尔可夫决策过程(MDP) 来建模。
MDP 提供了一个数学框架,用于模拟在结果部分随机、部分受决策者控制的情况下的顺序决策(就像游戏一样,我们只能控制自己的行动,但无法控制对手的行动)。
在 MDP 环境中,代理人需要找到一个 最优策略 来最大化报酬。
我推荐你看这个视频,它总结了我到目前为止的所有解释,并且最好地解释了数学符号:
问—学习
现在我们需要找出一种方法来确定最优策略。
当人类想要找到游戏状态的最佳可能解决方案时,他的方法是什么?
他/她保持估计(的质量)他当前状态下的行动,同时(在他的想象中)思考对手对他/她的行动的最佳策略是什么。通过这种方式,她/他会选择最有可能获得回报的行动(当然,人类不可能想象所有的场景并记住所有的结果!).
为了将上述陈述与我们的项目相关联,我们需要设计一个代理,该代理能够通过试错法探索环境,并通过理解 其在状态中的动作质量来对其建模。但是这种试错可以发生在它的大脑中,而不是在它与之交互的环境中(就像人类如何在大脑中模拟游戏一样)。
我推荐 Udacity 团队提供的这个短视频,它澄清了由代理建模的环境和代理 与交互的环境的区别:
这就是 q 学习方法的用武之地。Q learning 是一种 RL 算法,它从当前状态(规划)开始,针对任何和所有连续状态,在最大化长期回报的上学习最优策略*。如果给无限的探索时间和部分随机策略 4 ,Q-learning 可以学习到最佳策略。查看这篇文章,了解上下文中的更多细节。***
结论
好的。我们了解到基于 RL 的智能体是一种通过选择状态中的动作来与环境交互的智能体。通过这样做,它改变了环境状态并转换到其他状态。这种转变可能伴随着作为其行为结果的奖励/惩罚(并且这种结果可能不是直接的)。代理的目标是找到最佳策略来选择最大化回报的行动。最后,我用一些问题来结束这篇文章,这些问题将在下一篇文章中回答。
1 —如果在其他步骤之间只有一个最佳步骤,如果由于时间有限,我们无法逐一处理所有连续的状态,我们如何找到它?
2 —如果我们在计算资源和时间方面受到限制,我们如何将寻找最佳方案转化为长期回报?
为了解决这些问题,我们将在下一篇文章的中挖掘蒙特卡洛树搜索概念及其解决方案。
参考
2—https://medium . com/ai % C2 % B3-理论-实践-商业/强化-学习-第二部分-介绍-马尔可夫-过程-d3586d4003e0
3—https://medium . com/ai % C2 % B3-理论-实践-商业/强化-学习-第三部分-马尔可夫-决策-过程-9f5066e073a2
4—http://www.leemon.com/papers/1995b.pdf
蒙特卡罗树搜索:在实时游戏玩家中实现强化学习|第 2 部分
第 2 部分—蒙特卡罗树搜索基本概念
安妮·尼加德在 Unsplash 拍摄的照片
在上一篇文章中,我们介绍了强化学习的基本概念,并以这两个关键问题结束了这篇文章:
1 —如果由于时间有限,我们无法逐一处理所有连续的状态,我们如何才能找到最佳方案?
2 —如果我们在计算资源和时间方面受到限制,我们如何将寻找最佳行动的任务映射到长期回报?
在本文中,为了回答这些问题,我们通过蒙特卡洛树搜索基础。因为在接下来的文章中,我们将在“HEX”棋盘游戏中实现这个算法,所以我尝试在这个棋盘游戏环境中通过例子来解释这个概念。
如果您对代码更感兴趣,请在此链接中找到它。由于使用了cython
,还有一个更优化的版本适用于 linux,你可以在这里找到它。
以下是概要:
1 —概述
2 —勘探与开采的权衡
经典棋盘游戏
4 —算法结构:选择和扩展
5 —算法结构:卷展栏
6 —算法结构:反向传播
7 —优点和缺点
概述
蒙特卡洛方法是 Stanislaw Ulam 在应用统计方法“蒙特卡洛方法”后首次提出的。概念很简单。利用随机性解决原则上可能是确定性的问题。例如,在数学中,当我们不能直接计算积分时,它用于估计积分。同样在这张图中,你可以看到我们如何基于蒙特卡罗模拟来计算圆周率。
图 1:借助蒙特卡罗模拟计算圆周率(来源)。
上图表明,在蒙特卡罗方法中,我们收集的样本越多,对目标值的估计就越准确。
- 但是蒙特卡罗方法是如何在一般游戏中派上用场的呢?
当我们无法处理所有状态时,我们使用蒙特卡罗方法基于模拟随机估计状态 的质量。每个模拟都是一个自我游戏**,从当前状态开始遍历游戏树,直到到达叶子状态(游戏结束)。**
所以这个算法对我们的问题来说是完美的。
-因为它对未来状态-动作空间进行采样,所以它可以通过保持低计算量来估计当前状态下的接近最优的动作(这解决了第一个问题)。
-此外,它根据长期回报(根据树叶的结果进行奖励)选择最佳行动的事实回答了第二个问题。
这个过程就像当一个人想要估计未来的行动,以在国际象棋比赛中提出最好的行动。他会根据自己的想法模拟各种游戏(从当前状态到未来最后可能的状态),并选择整体效果最好的游戏。
蒙特卡洛树搜索(MCTS) 将蒙特卡洛方法与树搜索结合起来,是一种通过在决策空间中随机取样并根据结果构建搜索树,在给定域中寻找最优决策的方法。
在解释算法结构之前,我们应该先讨论一下探索和开发的权衡。
勘探与开采的权衡
如前所述,在强化学习中,一个智能体总是通过重复使用在该问题中找到的最佳行动来实现最优策略(还记得上一篇文章中的象棋例子)。然而,有可能当前的最佳行动实际上并不是最佳的。因此,它将在学习阶段通过执行替代方案而不是感知的最优方案来继续定期评估替代方案。在 RL 术语中,这被称为勘探开发权衡。RL 中的所有算法(MCTS 也是)都试图平衡探索-开发的权衡。
我认为这个视频最好地解释了探索-开发的概念:
HEX:经典桌游
现在是时候了解一下 Hex 游戏了。它有简单的规则:
图 2:六角板。赢家是白玩家,因为它用链石连接了白双方。
- 黑白相间。
- 每回合一名玩家在任何未被占据的格子上放置一块与其颜色相同的石头。
- 获胜者是将他们的石头形成一串连接他们两个相对的棋盘边的玩家。
- Hex 永远不能以和局结束,可以在任何 n × n 棋盘上玩【1】。
现在让我们来看一下算法结构。
算法结构
1 —选择和扩展
在这一步中,agent 获取游戏的当前状态并在树中选择一个节点(每个节点代表选择一个动作所产生的状态)并遍历该树。每个状态中的每个移动都分配有两个参数,即总展开和每次展开的胜率(它们将在“展开”一节中介绍)。
在其他节点中选择最佳节点的策略非常重要。应用于树的置信上限(UCT)是选择最优节点的最简单而有效的策略。这一战略旨在平衡开采-勘探之间的权衡。这是 UCT 公式:
图 3: UCT 公式。第一项(w/n)表示开采,第二项计算勘探项(c * sqrt(log t / n))
在此公式中,i
表示子节点中的第 I 个节点。W
是每次推广的获胜次数,n
是所有推广的次数。公式的这一部分代表剥削。
C
为勘探系数,在[0,1]范围内为常数。此参数指示代理必须在多大程度上支持未探索的节点。
t
是父节点中转出的数量。第二个术语代表探索术语。
让我们看一个例子,以便理解提供的所有信息。请看下图:
图 4:选择阶段
考虑深度 2 中的动作 C3(黑色转弯)。总模拟次数(公式中的 n _i )为 2,成功的推广次数(公式中的 w_i )为 1。在公式中,t 将是深度为 1 的父节点的转出数(在这里表示在白色转弯中移动 B2 ),即 4。正如你所看到的,选择阶段在我们有一个未访问节点的深度停止。然后在扩展阶段,当我们在深度 4 中访问 B1 时,我们将它添加到树中。
2 —首次展示(也称为模拟、播出)
在这一步中,基于预定义的策略(比如完全随机选择),我们选择动作,直到到达一个终止状态。在终端状态下,当前玩家的游戏结果要么是 0 (如果输了游戏)要么是 1 (如果赢了游戏)。在十六进制游戏中,终端状态总是可达的,游戏的结果是输或赢(没有平局)。但是在像象棋这样的游戏中,由于象棋分支因子的可扩展性和搜索树的深度,我们可能会陷入无限循环。
图 5:展示了前面步骤(选择和扩展)之后的展示阶段
在上面的图像中,当那个黑人玩家在扩展步骤中选择了 B1 之后,在模拟步骤中,一个卷展栏被启动到游戏的终端状态。
在这里,我们选择随机行动来达到游戏的最终状态。如你所见,在终端状态下,白玩家通过用石头将左右连接起来赢得了游戏。现在是在反向传播部分使用这些信息的时候了。
3 —反向传播
在这一部分中,我们更新了在选择和扩展部分的树中遍历的节点中的统计数据(首次展示数量和每次总首次展示的成功数量)。
在反向传播过程中,我们需要更新节点的首次展示数量和成功/失败统计。我们唯一需要的是找出在 rollout 中赢得游戏的玩家(例如图 4 中的白人玩家)。
对于图 4,由于黑人玩家是赢家(他选择了终止状态中的动作),所有由黑人玩家动作导致的状态都被奖励 1,而由白人玩家动作导致的状态被给予 0 奖励(我们可以通过将它设置为-1 来选择惩罚)。
对于所有状态(通过步骤 1 选择的树节点),如图 6 所示,总展开数增加 1。
图 6:通过树搜索更新节点的赢(对于黑人玩家)、输(对于白人玩家)和转出总数。
这些步骤不断重复,直到一个预定义的条件结束循环(如时间限制)。
优缺点
优点:
1 — MCTS 是一种易于实现的算法。
2-蒙特卡罗树搜索是一种启发式算法。除了规则和结束条件之外,MCTS 可以在没有任何特定领域知识的情况下有效地操作,并可以通过随机播放来找到自己的移动并从中学习。
3-MCTS 可以保存在任何中间状态,并且该状态可以在将来任何需要的时候用于用例。
4-MCTS 支持基于搜索树运行环境的不对称扩展。
缺点:
1-随着树在几次迭代后变得快速增长,它可能需要大量的内存。
2-蒙特卡罗树搜索有一点可靠性问题。在某些情况下,可能会有一个单独的分支或路径,这可能会导致在实施回合制游戏时输给对手。这主要是由于大量的组合,并且每个节点可能没有被访问足够的次数来理解其结果或长期结果。
3-MCTS 算法需要大量的迭代才能有效地决定最有效的路径。所以,这里有一点速度问题。
games 可以随时返回建议的移动,因为关于模拟游戏的统计数据会不断更新。当算法开始时,推荐的移动不是很好,但是它们随着算法的运行而不断改进。
结论
现在,我们弄清楚了 MCTS 算法如何有效地利用随机性对所有可能的场景进行采样,并通过模拟得出最佳行动。MCTS 在每个时期所选择的行动的质量取决于它如何处理环境中的勘探和开发。
好了,到目前为止,我们已经讨论了必要的理论概念,我们可以进入下一个层次,用代码来弄脏我们的手。在下一篇文章中,首先,我们将描述整个框架和需要实现的模块,然后我们将实现 UCT 的基本 MCTS。之后,我们将通过向代码中添加更多功能来改进框架。
如果你对话题感兴趣,有问题,我随时恭候,乐意倾听。在 linkedin 和 StackoverFlow 找到我。
蒙特卡罗树搜索:在实时游戏玩家中实现强化学习|第 3 部分
第 3 部分—MCTS 算法的实现,该算法可以在有限的时间内处理实时游戏“HEX”中的决策。
介绍
在之前的文章中,我们学习了强化学习基础和蒙特卡罗树搜索基础。我们介绍了 MCTS 如何搜索所有的状态动作空间,并根据对搜索空间进行采样后收集的统计数据得出一个好的动作。
对于那些着急的人,这是该项目的完整代码:
蒙特卡罗树搜索(MCTS)是一种在给定领域通过随机抽样寻找最优决策的方法
github.com](https://github.com/masouduut94/MCTS-agent-python)
图 1:游戏的演示。作者在 Github 上的图片。
这张 gif 展示了最终产品的演示。正如您在 GUI 中点击生成按钮所看到的,MCTS 代理选择了最佳可能的移动。黑人和白人玩家之间的竞争欲望真的很有趣,因为对我们人类来说,游戏棋盘上的移动选择听起来很有战略意义。
我必须感谢肯尼·杨,他出色地实现了 mopyhex,这对我的项目帮助很大。这篇文章主要包括解释他的代码。在接下来的文章中,我们将进一步为这个项目添加一些贡献,以便在状态-动作空间中进行更健壮的搜索,并使用cython
工具优化 C 级速度的代码。
模块概述
在接触代码之前,为了给出项目的概述,让我描述一下每个模块的功能。基本上,初始框架需要实现 6 个类:
GameState
:这个模块简单的提供了树的每个节点中关于游戏状态的每一个基本信息。UnionFind
:该模块是帮助GameState
检查两侧是否连接的实用模块。换句话说,在这个模块的帮助下,我们可以在游戏的任何状态下检测出赢家,如果有的话。Node
:这个实现了指示每个游戏状态的树的每个节点。每个节点都有一个基于 UCT 算法的评估函数。UctMctsAgent
:这个处理蒙特卡罗树搜索算法的树结构。Gui
:这个模块使用Tkinter
模块实现了一个简单的图形用户界面,使游戏中的人机交互成为可能。MCTSMeta
和GameMeta
:这些模块只是存储一些常量。
我已经实现了一些算法,这些算法使用了快速动作评估的概念,并且在短期搜索中比 UCT 算法更强。让它变得更加强大。我将在后面讲述这些算法的概念。
游戏状态模块:
在每个游戏状态树中,搜索代理需要知道三件事才能从一个状态转换到另一个状态:
- 轮到哪个玩家了。
- 未被占用的棋盘单元格(可供选择的棋步)。
- 能够为黑人和白人玩家检测双方之间的连接。
后一种实现起来相当棘手。因为要检测连接,我们必须跟踪不相交的细胞群。因此,我们必须利用数据结构,即不相交集(也称为联合查找)。但是 HEX 游戏板单元从 6 个侧面连接到它的邻居的事实,使得它更难实现。看看下面的图片:
图 2:一个黑色单元从 6 个侧面连接到其相邻单元。作者图片
那么我们如何处理这个难题呢?
首先,我使用 NumPy 数组来保存游戏板的值。未被占用的像元值为 0,相应地,白色像元和黑色像元值为 1 和 2。此图以阵列形式展示了一个 8X8 游戏板:
图 3:阵列状单元上的游戏棋盘表示。作者图片
每个单元有 8 个相邻单元。您在这里看到的值是在每个单元格上的坐标,这些单元格在GameMeta
中被定义为邻域,以将相邻单元格限制为 6:
NEIGHBOR_PATTERNS = ((-1, 0),(0, -1),(-1, 1),(0, 1),(1, 0),(1, -1))
图 2 中单元的邻域现在可以表示如下:
图 4:新的邻居小区被限制为 6 个(适用于六边形小区)。作者图片
最终在我们的游戏 GUI 中,它变成了类似图 1 的六边形。
UnionFind 类:
现在是时候调整这个游戏的不相交集数据结构了。根据维基百科:
在计算机科学中,不相交集数据结构(也称为 union-find)是一种跟踪被划分成几个不相交(非重叠)子集的一组元素的数据结构。
图 5:白色和黑色不相交的集合。作者图片
上图显示了这些不相交的集合,它们是游戏环境的例子。如果你想知道更多关于不相交集合数据结构的概念,你可能想在这里检查这个链接。这是我想出的unionfind.py
的代码:
方法:
join
:如果输入板单元格不在同一个组中,则将其加入到单元格组中。find
:查找给定单元的代表元素(可能是一个集合)。connected
:检查两个元素是否在同一组。该功能用于检查电路板的两侧是否连接,这意味着它有助于我们检测获胜者。看看图 3。set_ignored_elements
:在不相交的集合中,必须忽略边缘。get_groups
:返回游戏状态下的各组单元格。
图 6:白边连接。这个连接将被 connected 方法检测到。作者图片
现在让我们定义游戏状态模块。这是GameState
类的代码:
这就是考虑属性的原因:
size
:表示板的尺寸(尺寸 X 尺寸)to_play
:表示该轮是黑棋还是白棋。board
:2d NumPy 数组,保存板单元值(无论每个单元是黑、白还是空)。White_played
和black_played
:游戏过程中每个玩家选择的移动次数。(这些值的用法将在本系列的下一集解释)。white_groups
和black_groups
:为了使用UnionFind
类,我们通过给模块分配这些变量来创建模块的实例。
让我们来描述一下这些功能:
play
:轮到的玩家拥有作为输入传递的单元格。get_num_played
:返回每个玩家出招次数的字典。get_white_groups
和 get_black_groups:返回每个玩家组。place_white
和place_black
:将石头放在棋盘上,然后如果石头是边的邻居,它们通过‘union find . join’函数连接。那么与该小区具有相同值的所有相邻小区也加入该组。turn
:这是一个简单返回turn
属性的方法。set_turn
:要改变转弯,我们使用此功能。winner
:这个属性检查两边之间是否有连接,如果有就返回胜者。否则不返回任何内容。neighbors
:返回所有邻居单元格。moves
:返回当前棋盘状态下所有可能走法的列表。
这是meta.py
中的GameMeta
:
节点模块:
现在我们已经实现了游戏状态,是时候定义蒙特卡罗树搜索代理了。首先,我们必须为树的节点定义一个好的结构。这是定义Node
模块的代码:
每个节点都具有以下属性:
move
:树中的每个节点表示棋盘中的单元格,我们将其定义为每个状态下的潜在动作。parent
:指向父节点。N
:这是在选择阶段该节点被访问的次数。Q
:这是从模拟中的失败次数中减去的成功次数。N_RAVE
和Q_RAVE
:这些项目属于 RAVE(快速动作评估)算法,将在即将到来的未来文章中解释。children
:由此节点产生的下一个状态。- 如果节点是一片叶子,那么结果将显示获胜者。否则没有。
方法
add_children:
它得到一个移动字典,并把它们存储在children
属性中。value
:该属性根据本节点的N
和Q
属性以及父属性N
计算 UCT 公式。UCT 公式中使用的explore
常数是 UCT 的探索项,在MCTSMeta.EXPLORATION
中有定义。
请注意,当某个节点没有N
时,我们必须将该节点的值设置为无穷大,因为必须首先选择该节点。并且下一次基于N
和Q
,代理可以将其与其兄弟进行比较。
让我们一步一步地编写MCTSAgent
代码。首先,让我们开始上课:
如果你熟悉树数据结构的概念,你就知道如果你有了树节点并且遍历到你想去的任何地方,树中的所有节点都是可达的。
所以我们定义root
为树根节点,rootstate
为树的根状态。然后,当我们遇到每一步棋时,我们在rootstate
中进行游戏,然后将状态转换为新的状态(交替玩家回合,检查黑组和白组是否有任何联系,…).
属性run_time
、node_count
和num_rollouts
仅用于跟踪一些统计数据。
选择和扩展阶段
现在我们定义选择和扩展阶段:
正如代码所暗示的,以及我之前提到的关于树遍历,我们首先复制游戏的root
和root_state
(第 6 行和第 7 行)。然后,直到我们没有遇到任何叶子(这意味着游戏没有结束或者代理仍然没有探索树),我们继续选择具有最大 UCT 值的节点(在第 13 行和第 14 行中计算),然后通过进行实际移动来转换状态(第 17 行)。如果我们到达某个N
等于0
的节点,我们选择它。在我们返回node
和state
之前,我们必须确定节点是否可扩展。所以在expand
方法中,首先我们确定游戏没有赢家,如果没有,我们给展开的节点添加子节点。因此节点及其状态随后被返回。
模拟阶段
对于模拟部分,我们得到了以下代码:
代理简单地获得游戏的状态,它继续玩随机移动,这是默认策略(在下一篇文章中,我将包括更多令人敬畏的策略),并转换state
,直到我们到达一个终端状态,在该状态中检测到游戏获胜者。
反向传播
这是该步骤的代码:
在这段代码中,我们有三个输入:
- node:是我们从
select_node
方法的输出中得到的节点。 - 转弯:这表示玩家进入了
select_node
方法的第二个输出状态。 - 结果:这是模拟阶段的输出,是模拟的赢家
我们在反向传播部分要做的是(如这里讨论的,看一下图 6)从node
开始,向后遍历选择的节点(第 23 行)并更新统计(第 21 行,第 22 行),直到我们到达根节点(第 20 行,因为树节点没有父节点)。
我们在输家玩家选择的节点和赢家玩家选择的节点之间交替,所以我们必须给赢家节点+1 奖励,给输家节点 0 奖励(第 24 行)。
另外,请注意,第 18 行表示,如果选择了该移动并到达node
状态的玩家获胜,我们必须给予他+1 奖励。如果不是这样,玩家将被罚以0
奖励。
现在我们必须定义一个循环,在这个循环中,我们应该完成选择、扩展、模拟和反向传播的整个过程,这里提供了:
在我实现这段代码的时候,python 3.4 是最新的版本。由于在第 7 行中,我使用了clock
函数,而在 python 3.8 中clock
函数在time
库中被弃用,所以我将from time import clock
修改为from time import time as clock
(很酷的把戏,对吧!?).
在这段代码中,time_budget
(顾名思义)是我们可以进行尽可能多的 MCTS 模拟的时间(第 11 行)。选择和扩展在第 12 行完成,变量turn
保持当前玩家回合,然后相应地在第 14 行和第 15 行完成卷展和反向传播。
在第 18 行,我们对树中的节点进行计数,并使用方法tree_size
将它们存储在变量node_count
中,我马上会添加这个方法。
这是整个MCTSAgent
类的代码:
正如您在代码中看到的,有一些实用函数。best_move
方法(第 140 行)返回基于N
值的最佳移动(模拟次数最多的节点。模拟越多,其探索的路径越好)。
move
方法用于在实际的游戏环境中走棋。这样,我们必须更新树root
和rootstate
。新的根将是当前根的子根,带有root.children
字典的move
键。新的rootstate
将是游戏中已经使用过的move
转换而来的state
。
因此,当我们在游戏环境中转换到一个新状态时,我们必须移除到其父状态的连接(第 165 行),我们还更改了rootstate
(第 167 行)。
请注意,我插入第 172 行和第 173 行的原因是,在游戏 GUI 中,可以选择不考虑回合的移动(就像黑人玩家连续选择 2 个单元格,而不让白人玩家在其回合中选择移动)。因此,为了在代码中实现这种灵活性,我们必须重置整个树(丢弃当前树)并重新开始 MCTS 过程。
方法set_gamestate
给了我们重置游戏状态的能力。所以我们可以改变棋盘的大小,重新开始。方法tree_size
在Queue
库的帮助下对树节点进行计数。
我们还需要在meta.py
中定义这个:
Gui 模块:
最后,我们为框架设计图形用户界面。Gui
类是在tkinter
模块的帮助下开发的。这个模块很容易理解,所以我只解释一些重要的部分。这是 500 行代码!
重要方法:
top_left_hexagon
:该方法在该函数中返回环境中左上角六边形单元格的坐标。hexagon
:这个用tkinter.Canvas.create_polygon
画一个六边形并返回。generate_row
:在这个方法中,根据它的颜色生成一行六边形:这个函数获取 gameboard 数组,绘制整个游戏板。generate_white_edge
和generate_black_edge
:这些函数生成板的边缘,在那里单元格都是黑色或白色的。- 这个功能可以让玩家与游戏互动。当在 GUI 中单击一个单元格时,它会用指向 MCTS 代理的
self.agent
播放。 set_size
:该方法检测 self.game_size 按钮的事件,用新的尺寸重置整个棋盘。它还会重置代理树。set_time
:通过此功能调整 MCTS 搜索的时间预算。Set_agent
:在我解释了 RAVE 算法之后,这个函数将在 UCT 和 RAVE 代理之间切换。click_to_bot_play
:这个设计是让代理玩家根据我们之前讨论的MCTSAgent.best_move
方法选择移动。
现在我们必须定义一个循环,在这个循环中,我们应该完成选择、扩展、模拟和反向传播的整个过程,这里提供了:
在我实现这段代码的时候,python 3.4 是最新的版本。由于在第 7 行中,我使用了clock
函数,而在 python 3.8 中clock
函数在time
库中被弃用,所以我将from time import clock
修改为from time import time as clock
(很酷的把戏,对吧!?).
在这段代码中,time_budget
(顾名思义)是我们可以尽可能多地进行 MCTS 模拟的时间(第 11 行)。选择和扩展在第 12 行完成,turn
变量保持当前玩家回合,然后相应地在第 14 行和第 15 行完成展示和反向传播。
在第 18 行,我们对树中的节点进行计数,并使用tree_size
方法将其保存在node_count
变量中,我马上会添加这个方法。
这是整个MCTSAgent
类的代码:
正如您在代码中看到的,有一些实用函数。best_move
方法(第 140 行)返回基于N
值的最佳移动(模拟次数最多的节点。模拟越多,其探索的路径越好)。
move
方法用于在实际游戏环境中进行移动。这样,我们必须更新树root
和rootstate
。新的根将是当前根的孩子,带有root.children
字典的move
键。新的rootstate
将会是游戏中已经使用过的move
转换后的state
。
因此,当我们在游戏环境中转换到一个新状态时,我们必须移除与其父状态的连接(第 165 行),我们还更改了rootstate
(第 167 行)。
请注意,我插入第 172 行和第 173 行的原因是,在游戏 GUI 中,可以选择不考虑回合的移动(就像黑人玩家连续选择 2 个单元格,而不让白人玩家在其回合中选择移动)。因此,为了在代码中实现这种灵活性,我们必须重置整个树(丢弃当前树)并重新开始 MCTS 过程。
方法set_gamestate
给了我们重置游戏状态的能力。所以我们可以改变棋盘的大小,重新开始。方法tree_size
在Queue
库的帮助下对树节点进行计数。
我们还需要在meta.py
中定义这个:
Gui 模块:
最后,我们为框架设计图形用户界面。Gui
类是在tkinter
模块的帮助下开发的。这个模块很容易理解,所以我只解释一些重要的部分。这是 500 行代码!
重要方法:
top_left_hexagon
:该方法在该函数中返回环境中左上角六边形单元格的坐标。hexagon
:这个用tkinter.Canvas.create_polygon
画一个六边形并返回。generate_row
:在该方法中,根据颜色生成一行六边形gameboard2hexagons
:该函数获取游戏板数组,绘制整个游戏板。generate_white_edge
和generate_black_edge
:这些函数生成板的边缘,其中的单元格全部为黑色或白色。click2play
:这个功能可以实现人与游戏的互动。当在游戏环境中选择一步棋时,它会用指向代理的self.agent
来玩。set_size
:该方法检测 self.game_size 按钮的事件,用新的尺寸重置整个棋盘。它还会重置代理树。set_time
:mcts 搜索的时间预算由该功能调整。Set_agent
:在我在下一篇文章中解释了 RAVE 算法之后,你会看到这个函数会在 UCT 和 RAVE 代理之间转换代理。click_to_bot_play
:这个设计是让代理玩家根据我们之前讨论的“MCTSAgent.best_move”方法选择移动。
现在是运行代码的时候了:
添加main.py
并将这段代码复制粘贴到那里:
结论
在本文中,我们用纯 python 实现了一个蒙特卡罗树搜索算法,包含了尽可能少的外部库。该项目的完整代码可以在这里找到。这个项目是一个简单的 UCT算法的实现。
虽然 UCT 算法是精确的,但是它需要大量的模拟来收敛到可用的最优解**。为了提高算法性能,有很多选项,如 RAVE,果断行动,最后一次良好的答复,和 PoolRAVE,…算法。这些算法将在接下来的文章中进一步解释。**
顺便说一下,如果你想找一个有经验的研究员加入你的团队,我完全可以。我在强化学习、计算机视觉和数据科学方面有一些经验。你可以在 LinkedIn 上找到我。
Swift 中的蒙特卡罗树搜索(MCTS)人工智能游戏
尼克·卡沃尼斯在 Unsplash 上的照片
再加上在 Jupyter 笔记本里设置 S4TF!
- Swift 不只是苹果的
- 玩游戏的人工智能很棒
- Swift 是不是只为苹果!
在这篇文章中,我将解释我如何在 Jupyter 笔记本中设置 Swift,然后我如何使用 Swift 创建一个有时间限制的蒙特卡罗树搜索算法代理,它可以在 17 秒内玩 2048。整齐!
《2048》之所以是一个测试人工智能代理的有趣游戏,是因为它不是确定性的:它是随机的。因此——不像其他一些用于测试人工智能的传统游戏,如 CartPole 和 noughts & crosses——这不是一个神经网络适合的问题。相反,我们可以使用随机算法,询问“哪一步造成的伤害最小?”一遍又一遍,并能快速浏览场景。
你说速度?是的——使用 Swift 可以让我们创建一个每秒能运行 55 步的代理,这是相当快的速度。
2048 年的游戏
由意大利网络开发商 Gabriele Cirulli 设计,2048 在 4x4 的棋盘上玩,初始化时你有两个随机的瓷砖,上面有“2”或“4”。通过向左、向右、向上或向下滑动,您可以将接触到的匹配值牌相加(例如,“2”和“2”变成“4”),以便通过将所有牌相加得到数字“2048”来获胜。每一回合,新的牌上都会生成“2”或“4 ”,这意味着在您到达目标之前,棋盘很容易填满并被阻挡!
2048 年很复杂,因为你玩得越多,每一步棋对最终棋盘状态的影响就越深远。我们不想让我们的人工智能太容易。
限时蒙特卡罗树搜索(T-B MCTS)
MCTS 是一种与人工智能一起使用的搜索技术,它是概率性的和启发式的,将经典的树搜索与强化学习的机器学习(ML)原则结合在一起。作为一种算法,它于 2006 年推出,并已被广泛应用于许多游戏实例中,包括国际象棋、扑克,甚至是战役。
它利用探索和定期评估,处理当前最佳行动实际上可能不是最佳行动的可能性(这是扩展树的宽度并使用随机化)。这通过利用方法来平衡,通过坚持具有最大估计值的路径来避免低效率(这是扩展树的深度)。
为什么有时间限制?当使用一个详细的算法时,定义一个做出决定的最大时间是很重要的。事实上,你分配给这个过程的时间(资源)越多越好,这是一个权衡。在这个例子中,我给每个决定分配了 0.015 秒。
要想全面详细地了解 MCTS,我推荐看看 GeeksforGeeks 上这篇 有用的文章。
首先,让我们把一切都准备好。
请注意:我将介绍我在课程中使用的设置,其中包括用于 TensorFlow 的 Swift(S4TF ),但它肯定不是创建 MCTS 代理的唯一可能设置。
设置
- 除非你使用 Linux 或 Mac,否则你需要一个 Linux 的 Windows 子系统(WSL)。我使用 Ubuntu 18.04(在微软商店免费获得)
- 为 TensorFlow 安装Swift
Swift Jupyter 内核的可选设置
这花费了我比预期更长的时间,但是如果你想以一种干净和可共享的格式展示你的 Swift 作品(就像使用 Jupyter 一样),这是值得的。)
我找到的最有价值的指南是在 Swift-Jupyter repo。有几个选项可供设置,包括 conda 和 Docker 选项,但我发现使用 Swift for TensorFlow toolchain 和 virtualenv 效果很好(最终)。
提示:我花了这么长时间试图在 LLDB Python3 支持下设计出 Swift 工具链。我最终在 Ubuntu 中使用了 curl:
$ curl -O [https://storage.googleapis.com/swift-tensorfl](https://storage.googleapis.com/swift-tensorfl)ow-artifacts/nightlies/latest/swift-tensorflow-DEVELOPMENT-ubuntu18.04.tar.gz
如果你不打算偏离标准,那么一旦你在 Ubuntu 中有了 Swift 工具链,你需要做的就是运行这个:
$ git clone https://github.com/google/swift-jupyter.git
cd swift-jupyter
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
python register.py --sys-prefix --swift-toolchain ~/swift-jupyter
最后,Jupyter 笔记本可以使用 Swift 内核发布。
漂亮!
玩游戏
使用 Swift(无论是在上述 Jupyter 笔记本中,还是在您偏好的其他环境中),您需要导入提供基础层功能的基础框架:
import Foundation
我们使用一个大的坏代码块来管理 2048 游戏,并确保它快速工作。这是一个位板实现:
太棒了。现在我们需要代理自动游戏,这意味着一个函数,它接受一个游戏状态,返回移动的方向,然后执行随机移动。它还应该返回棋盘的分数。
重要的是,这是我们定义算法做出决定所需要的最大时间量的地方(假设 maxTime = 0.015)。
它还创建了一个保存所选方向和相关分数的字典,返回平均分数最高的方向:
最后,我们有了一个可以工作的 2048 机器人,哇哦!现在我们需要初始化一个新的游戏实例,运行一个 while 循环,重复直到游戏结束。在这个循环中,它将决定最好的走法,玩它,并打印新的棋盘状态:
真快!
正如你所看到的,人工智能仅用了 17 秒就走了 961 步,速度接近每秒 56 步。这还不包括优化,所以你当然可以运行得更快更好!
你可以在我的 Github 这里 找到完整的笔记本和所有代码,并查看我之前为迈向数据科学所做的工作!
是时候主动出击而不是被动应对了
towardsdatascience.com](/chaos-in-the-calm-what-is-chaos-engineering-5311c27b2c7e) [## 我如何使用 Python 代码来提高我的韩语水平
“你好世界!”/ “안녕하세요 세계!”
towardsdatascience.com](/how-i-used-python-code-to-improve-my-korean-2f3ae09a9773)
这是基于 IBM 开发人员技能网络在cognitive class . AI上提供的令人敬畏的“使用 Swift 进行 TensorFlow (S4TF)的人工智能游戏”课程,我强烈建议您查看他们的学习路径。
月度现货价格预测——状态空间法的时间序列分析
SARIMAX 预测 Henry Hub 现货价格
递归特征消除& SARIMAX 状态空间建模方法
作者图片
https://sarit-maitra.medium.com/membership
S ARIMAX 应用于原始序列具有模型参数解释能力等优点。这里的目标是开发一个带有外部变量的季节性自回归综合移动平均(SARIMAX)模型,该模型试图考虑价格影响因素的所有影响,以预测 Henry Hub 的月度现货价格。天然气价格是一个随机变量,遵循具有随机趋势的随机过程。
在像股票市场这样的复杂系统中,预测趋势的能力比点预测更有用。我们可以更有信心和更可靠地预测趋势,而不是这些量的值或水平。
为什么是萨里麦克斯?
这里,我们的时间序列预测模型将使用过去的价格和其他变量,如气候、存储等。来预测天然气未来价值。我们的时间序列受许多外部因素的影响。SARIMAX 能够将季节性和非季节性因素纳入一个乘法模型。因此,当时间序列呈现季节性变化时,通常应用 SARIMAX 模型。
SARIMAX 模型是一个带有外部变量的 SARIMA 模型,称为 SARIMAX (p,D,q) (P,D,Q)S (X),其中 X 是外部变量的向量。
与价格、消费、储备、存储、生产、管道等相关的数据。和气候数据,包括路易斯安那州新奥尔良的冷却/加热度天数、极端最高/最低温度、平均温度和平均最高/最低温度。所有这些数据被组合在一个文件中作为输入数据文件。
我们可以看到,我们的时间序列有一个以上的时间相关变量。每个变量都依赖于它过去的值,并且还依赖于其他变量。我们将在这里使用这种依赖性来预测未来的值。
带有外生回归量的季节性自回归综合移动平均(SARIMAX):
SARIMAX 是一个完全成熟的模型,使用状态空间后端进行估计。SARIMAX 模型由五个迭代步骤组成-
- 模型识别,其中我们识别差分顺序(D)、季节差分顺序(D)、季节长度(S)、非季节自回归顺序§、季节自回归顺序§、非季节移动平均顺序(Q)和季节移动平均顺序(Q)。
- 参数估计,其中估计来自步骤 1 的已识别模型的参数。
- 模型的适合度是用 l-jung-Box Q 统计量来检验的。如果残差不是正态分布,我们需要进行第 4 步。否则,继续执行步骤 5。
- 纳入外部变量:使用线性回归将相关外部变量纳入 SARIMA 模型。
- 使用样本外验证诊断模型。经验证的模型用于预测未来值。
ACF 和 PACF 图:
plt.figure()
plt.subplot(211)
plot_acf(df['hh_sp'], ax=plt.gca())
plt.subplot(212)
plot_pacf(df['hh_sp'], ax=plt.gca())
plt.xlabel('Lag')
plt.tight_layout()
plt.show()
季节性分解:
df = data.copy()
df.set_index('Date', inplace=True)
print(df.info())
df = df.astype(float)res = sm.tsa.seasonal_decompose(df['hh_sp'],freq=12)
fig = res.plot()
fig.set_figheight(8)
fig.set_figwidth(15)
plt.show()
从趋势图中,我们没有观察到任何明显的趋势,这种趋势遵循某种程度上的随机运动(随机漂移)。
我们在这里可以看到,仅仅求差异无助于数据集的标准化。
df.isnull().sum()
def fill_missing(df):
for row in range(df.shape[0]):
for col in range(df.shape[1]):
if np.isnan(df[row,col]):
df[row,col]= df[row-1, col]
fill_missing(df.values)
np.isnan(df).sum()
fill_missing(df.values)
np.isnan(df).sum()
递归特征消除:
我们使用递归特征消除的特征排序和使用线性回归作为模型的最佳特征数量的交叉验证选择。
特征排序,使得 ranking_[i]对应于第 I 个特征的排序位置。选定的(即,估计最佳的)特征被分配等级 1。
y = df['hh_sp']
X = df.drop(['hh_sp'], axis=1)
names=pd.DataFrame(X.columns)lin_reg = LinearRegression()
mod = RFECV(lin_reg, step=1, cv=20)
mod_fit = mod.fit(X,y)
rankings=pd.DataFrame(mod_fit.ranking_, index=names) #Make it into data frame
rankings.rename(columns ={0: 'Rank'}, inplace=True)
rankings.transpose()
模型中选择了 14 个特征
让我们确定我们的目标;我们将预测未来 5 个月的现货价格。
目标变量:
df['target'] = df['hh_sp'].shift(-5)
df.dropna(inplace=True)
n = df.drop(['target'], axis=1) # storing in a dataframe for future use
dataset = df[['im_pr','ex_pr','prod_mp','prod_liq','prod_dng','imp_tot','imp_pip','ImpLiq', 'mean_max_txt', 'mean_min_txt', 'mean_txt', 'mean_max_lat', 'mean_min_lat','mean_lat', 'target' ]]
dataset.describe()
时间序列交叉验证和分割:
X = np.array(dataset.drop(['target'], 1))
y = np.array(dataset['target'])
tscv = TimeSeriesSplit(max_train_size=None, n_splits=5)
for train_samples, test_samples in tscv.split(X):
#print("TRAIN:", train_samples, "TEST:", test_samples)
X_train, X_test = X[train_samples], X[test_samples]
y_train, y_test = y[train_samples], y[test_samples]
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)feature_names = ['im_pr','ex_pr','prod_mp','prod_liq','prod_dng','imp_tot','imp_pip','ImpLiq','mean_max_tx', 'mean_min_txt', 'mean_txt', 'mean_max_lat', 'mean_min_lat','mean_lat' ]X_train = pd.DataFrame(data=X_train, columns=feature_names)
X_train.index = dataset[:186].index
y_train = pd.DataFrame(y_train, columns = ['target'])
y_train.index = X_train.index
X_test = pd.DataFrame(data=X_test, columns=feature_names)
X_test.index = dataset[186:].index
y_test = pd.DataFrame(y_test, columns = ['target'])
y_test.index = X_test.index
数据转换:
众所周知,股票价格一般遵循随机游走;第一阶段是为每个变量生成一组变化或差异,因为现货价格可以通过参考所选变量组中的意外变化而不是它们的水平来解释。变量的意外值可以定义为变量的实际值与其期望值之间的差值。从一个时期到下一个时期,变量的整个变化就是意外变化
稳定性检查:
与冲击效应是永久性的非平稳系统相比,平稳系统的优点是,冲击效应将逐渐减弱。
均值回复系列:
是否使用差分部分条件最大似然估计。如果为真,则在估计之前执行差分,这将丢弃前 sD+d 个初始行,但会产生更小的状态空间公式。有关使用此选项时解释结果的重要详细信息,请参见注释部分。如果为 False,则完整的 SARIMAX 模型以状态空间的形式出现,以便所有数据点都可以用于估计。默认值为 False。
确定顺序:
正如我们所知,SARIMAX 将 ARIMA 模型与在季节性水平上执行相同的自动回归、差异和移动平均建模的能力相结合。让我们用最大似然法估计参数。
# Fit auto_arima function
stepwise_fit = auto_arima(y_train_tran, X_train_tran, start_p = 1,
start_q = 1, max_p = 7, max_q = 7, m = 12,
start_P = 0, seasonal = True,d = None,
D = 1, trace = True,
error_action ='ignore',
suppress_warnings = True,
stepwise = True) # To print the summary
stepwise_fit.summary()
模型参数的 p 值表明,季节性和非季节性 AR 和 MA 值在 5%水平上不显著。
模型拟合:
在这里,外生变量是作为平行输入序列给出的,这些序列在与内生序列相同的时间步长上具有观测值。
# fit model
model = sm.tsa.statespace.SARIMAX(
endog = y_train_tran,
exog = X_train_tran, order = (0, 0, 0),
seasonal_order = (2, 1, 1, 12),
enforce_invertibility = False,
enforce_stationarity = False)
model_fit = model.fit(disp = False)
model_fit.summary()
这测试了所有斜率参数共同为零的零假设。附在检验统计量上的 p 值为 0 表明这个零假设应该被拒绝。这里,我们所有的参数都具有 p> 0.05,因此不能拒绝零假设。
使用指示残差不是白噪声的 Ljung-Box Q 统计量来诊断模型。H0 的 Box Ljung 检验的无效假设是,我们的模型不显示缺乏拟合。
诊断图:
诊断图帮助我们直观地确定我们的模型如何拟合数据,以及是否违反了 SARIMAX 模型的任何基本假设。
我们可以看到,潜在的误差分布是具有常数均值和标准差的参数假设的高斯分布。
# Fit a local level model
endog = ytest_tran
local_model = sm.tsa.UnobservedComponents(endog, 'local level')
# Fit the model via maximum likelihood
result = local_model.fit()
# result is an instance of the Unobserved Components Results class
print(result.summary())
# Show a plot of the estimated level and trend component series
fig = result.plot_components()
plt.tight_layout()
测试集数据转换:
X_test_tran = np.log(X_test).diff()
Xtest_tran = X_test_tran.copy()
Xtest_tran = Xtest_tran[~Xtest_tran.isin([np.nan, np.inf, -np.inf]).any(1)]
Xtest_tran.describe()
y_test_log = np.log(y_test['target']).dropna()
y_test_tran = y_test_log.diff().dropna()
ytest_tran = y_test_tran.copy()
#ytest_tran = ytest_tran[~ytest_tran.isin([np.nan, np.inf, -np.inf]).any(1)]
ytest_tran.describe()
模型评估和预测:
逆变换数据:
rebuilt = pred.cumsum().fillna(0)
print('\nCumsum:\n', rebuilt.tail())
rebuilt_further = rebuilt + y_test_log[-1:] # last value of test set
print('\nDe-difference:\n',rebuilt_further.tail())
original = np.exp(rebuilt_further)
print('\nOriginal form:\n',original.tail())
我们已经将目标变量转移到 5 个周期(月);因此,以上应该是未来 5 个月的预测。让我们做一些数据操作来获得未来的日期,如下所示。
可以注意到,按故障设置月频率显示未来所有日期是月末,而不是原始数据集的 15。嗯,这个也可以修复,以同步与原始数据。
可视化:
# Graph
fig, ax = plt.subplots(figsize=(10,5))
ax.set(title='Henry Hub Spot price', xlabel='Date', ylabel='USD / Mbtu')
# Plot data points
y_test.plot(ax=ax, label='Observed')
# Plot predictions
original.plot(ax=ax, style='r--', label='One-step-ahead forecast')
legend = ax.legend(loc='best')
此外,还可以得到预测价格上下水平之间的置信区间,并绘制置信区间图。
从一个简单的模型开始,并测试它是否足够好,这总是一个好主意。应用迭代建模方法,我们可以逐渐增加功能。比较连续模型的结果提供了一种内部验证的形式,因此我们可以捕捉概念、数学和软件错误。通过添加和删除特征,我们可以知道哪些特征对结果的影响最大,哪些特征可以忽略。
关键要点:
时间序列预测的重要假设是当前价格是需求和过去价格的函数。然而,这种关系不仅仅是直接的;需求还取决于气候条件、进出口价格等。通过递归特征消除方法找到一组 14 个变量。发现这些变量对于确定每月的天然气现货价格是重要的。SARIMAX 模型用于价格预测,它在解释异常数据方面有明显的优势。根据预测,我们可以看到 SARIMAX 预测可以平稳地遵循实际数据的模式。
利用贝叶斯定理解决 Monty Hall 问题
介绍
几天前,我决定更新我的概率论知识,所以拉里·瓦色尔曼的书《所有统计学》在这一点上派上了用场。在这本书的前几章中,引人注目的蒙蒂·霍尔问题引起了我的注意。事实上,我之前已经知道这个问题,甚至认为我理解解决方案,但随着时间的推移,不太多的知识片段消失了,蒙蒂霍尔问题的解决方案,不幸的是,没有逃脱这个厄运。幸运的是,上周末的空闲时间和我最近在 Medium 上写博客的热情相结合,我想把它作为我自己的哈利波特传奇的冥想盆,产生了这篇文章。
也就是说,我想用贝叶斯定理详细解释蒙蒂霍尔问题的解决方案。剧透:它更多的是为了理解贝叶斯定理,而不是用简单的术语掌握问题的解决方案。
“所有统计”中的问题陈述
奖品随机放在三扇门中的一扇门之间。你选一扇门。具体来说,你总是选择 1 号门。现在蒙蒂·霍尔选择另外两扇门中的一扇门,打开它,向你展示它是空的。然后他给你机会保留你的门或者换到另一扇没打开的门。应该留下还是换?直觉表明这无关紧要。正确答案是你应该换。证明一下。这将有助于详细说明样本空间和相关事件。这样写
ω₁是奖励所在,ω₂是蒙蒂打开的大门。
此外,我还添加了事件 ω₀ 来描述我们最初选择的门。
贝叶斯定理
让我们先简单地修改一下贝叶斯定理的概念,这是我用来解决问题的主要工具。
在事件 B 发生的情况下,事件 A 的概率等于两个事件的联合概率除以事件 B 的概率。
由于联合概率的对称计算,给定事件 B 的事件 A 的条件概率可以进一步展开:
最后,如果我们还有一个条件事件 C,那么它作为一个条件传播到所有构成概率:
解决办法
现在,我们到底要如何解决这个问题*“你应该留下还是离开?”*用概率来说?
首先,让我们注意到,如果天魔厅不会打开任何一扇门,这是直截了当的。在我们选择门 1 后,每扇门后的中奖概率是一样的:
- p(1 号门后的奖品|我们选择了 1 号门)=1/3
- p(门 2 后面的奖品|我们选了门 1)=1/3
- p(3 号门后的奖品|我们选择了 1 号门)=1/3
请注意,我使用条件概率来表明我们之前选择了门 1,尽管这一事实无论如何不会改变结果。尽管如此,我发现保留这个条件很重要,因为它有助于以后理解蒙蒂打开另一扇门时概率测度的赋值。
但我们知道蒙蒂·霍尔打开了另一扇门。
它改变了什么?显然,在条件概率中“|”符号的右边,应该有一些更早发生的事件。在我看来,在我们屈服于宇宙的力量之前有两个事件:1)我们选择了一扇门,2)蒙蒂·霍尔打开了另一扇门。“|”符号的左边应该是一个事件,让我们感兴趣。特别是,我们对奖品在我们选择的门后面的事件和奖品在另一扇门后面的事件非常感兴趣,那扇门是关着的。因此,在我的逻辑中,所有相关的条件概率应该是这样的:
- p(1 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 2 号门)=?
- p(2 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 2 号门) = 0
- p(3 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 2 号门)=?
- p(1 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 3 号门)=?
- p(2 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 3 号门)=?
- p(门后奖 3 |我们选了门 1,天魔堂开了门 3) = 0
然而,正如我提到的,根据问题陈述,一些概率是已知的,因为有一个约束,蒙蒂大厅只打开空的门。因此,我将概率 2 归零。和 6。,奖品是在同一扇门后,蒙蒂大厅打开。
而且对于我们来说,选择了 1 号门之后,2 号门和 3 号门没有太大的区别,那些天魔会开哪一个。最后,我们只想知道,在同样的情况下,当初选择的成功是否和另一扇门的选择一样。所以在我们选了 1 号门,蒙提·霍尔打开 2 号门后,奖品在 1 号门后的概率,和我们选了 1 号门,蒙提·霍尔打开 3 号门后,奖品在 1 号门后的概率完全一样。也就是概率 1。等于概率 4…同理,概率 3。等于概率 5…所以我假设蒙蒂·霍尔打开了 2 号门,那么我们只剩下两种可能性:
- p(1 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 2 号门)=?
- p(3 号门背后的奖品|我们选了 1 号门,蒙蒂厅开了 2 号门)=?
用数学术语来说,它会是这样的:
让我们依次讨论每一种可能性。
1.看到门 2 是空的后,奖品在我们的门(门 1)后面的概率
正如我前面提到的,我决定引入我们选择的门 1 的事件,尽管它随后作为一个条件传播到所有考虑的概率。然而,我认为这样我们可以更全面地了解以前的事件。
因此,根据贝叶斯定理,概率展开如下:
在哪里
- 蒙蒂·霍尔打开 2 号门的概率等于 1/2,因为我们选了 1 号门,而奖品也在 1 号门后面。这是因为对他来说,他是打开 2 号门还是 3 号门并不重要,因为我们已经挡住了 1 号门,奖品也在 1 号门后面。
- 假设我们选了 1 号门,蒙蒂·霍尔打开 2 号门的概率等于 1/2。这有点类似于前面的概率,但不知道奖金在哪里。我们封锁了 1 号门,因此他有 50%的几率打开 2 号门(或 3 号门)。
- 假设我们也选了门 1,奖品在门 1 后面的概率等于 1/3。这是合乎逻辑的,因为我们对门的选择不会影响门后(或任何门)奖品的外观。这是一个独立事件。
现在让我们来计算这个概率:
2.看到门 2 是空的后,奖品在门 3 后面的概率
该概率的公式如下所示:
在哪里
- 蒙蒂·霍尔打开 2 号门的概率,假设我们选了 1 号门,奖品在 3 号门后面,注意,等于 1!这是因为他没有别的选择:我们堵住了 1 号门,他不能用奖品开门。
- 假设我们选了 1 号门,蒙蒂·霍尔打开 2 号门的概率等于 1/2。这有点类似于前面的概率,但不知道奖金在哪里。不知道奖品在哪里至关重要——对他来说,2 号门和 3 号门没有区别。
- 假设我们选了 1 号门,奖品在 3 号门后面的概率等于 1/3。如前所述,我们选择 1 号门是独立事件,因为奖品在 3 号门后面。
让我们最后计算一下最终概率是多少:
结论
我们看到,确实更好地改变到门 3,因为在这种情况下,我们利用了蒙蒂霍尔的知识,实际上奖金在哪里。
其实我不了解你,但是即使解决了问题,还是显得有点神秘。对我来说,改变门的选择的机会看起来就像一个将你带到更好的平行宇宙的入口,在那里你有更高的获胜机会。
蒙蒂·霍尔的问题会让你发疯的
用数学、统计学和蒙特卡罗方法解决著名的脑筋急转弯
门由索菲·戴尔创作,山羊由彼得·诺伊曼创作,汽车由Jp·瓦列里在 Unsplash 上创作,并由我剪辑
蒙蒂霍尔问题是统计学中一个著名的概率难题。它是以电视游戏节目《让我们做笔交易》的主持人蒙蒂的名字命名的。脑筋急转弯松散地复制了游戏节目的概念,它是这样的:
有三扇门。你将不得不选择一扇门,你将赢得门后的一切。有一扇门有一辆车。剩下的每扇门都有一只山羊。首先,你被要求选择一扇门。接下来,蒙蒂知道每扇门后有什么,他打开了两扇门中的一扇门,展示了一只山羊。最后,你有机会要么“留”在你原来的选择,要么“切换”到剩下的门。赢车的最佳策略是什么?
我第一次遇到这个问题是在几年前的统计课上。这太难了,我花了一整天的时间来思考这个问题,并且仍然坚持使用两种策略中的1/2
。我的解释是:有3
门,1
门有车。如果主人打开有山羊的一扇门,剩下的两扇门中必须有一扇门有汽车。所以不管“换”还是“留”,概率应该是1/2
!
我错了。这个问题的棘手之处在于,蒙蒂知道这些门后面是什么,所以他的决定对结果有影响。花一分钟时间让自己想想这是不是真的。
1)直观回答
假设这三门是:1
、2
、3
、T17 既然probability = Event/Sample
空间我们只需要找到这些变量,代入方程。
这里的样本空间是我们选择车门和汽车实际位置的不同方式的总和。下表说明了 6 种可能性:
注意,这一桌,蒙蒂已经淘汰了带山羊的门。
如你所见,“停留”策略的获胜概率为1/3
,而“转换”策略的获胜概率为2/3
。
蒂姆·埃里克头脑爆炸
2)贝叶斯公式法
这是热爱贝叶斯的人的另一种做法!
让P(A|B)
表示事件A
的概率,假设事件B
已经发生
贝叶斯公式
如果我们知道如何将问题转化为事件,那么一切都变得简单明了。让:
- 第一选择是以车为门的事件。
- b 是蒙蒂消灭一个有山羊的门的事件。因此,我们正在寻找“留下来”的策略。
让我们写下我们知道的事情:
- 因为蒙蒂总是选择正确的门而不管任何给定的条件
P(A)=1/3
,有一个1/3
打开车门的几率,什么都不知道。
为了理解如何找到P(B)
,让我们看一下图表:
文氏图
只有2
种可能的策略,要么留下,要么换。于是,“切换”概率就是停留的补数,也就是1–1/3=2/3
。
如果蒙蒂不知道哪扇门有山羊。这相当于P(B|A)=1 and P(B|¬A)=1/2
。将它们插回到等式中,它返回P(B|A)=1/2
。这是我感到困惑的部分。
3)更简单的答案
用“留”的策略,一开始选择有车的门才能赢。既然有3
门,那么有车选门的概率就是1/3
。所以“切换”策略是2/3
。这为我们提供了一个对超过3
门天魔堂问题的一般观察。
4)如果呢?
如果 Monty Hall 决定在最大数量k
为n-2
的 n 个门中揭示 k 个门,会不会对策略有丝毫影响?
门乘苏菲·戴尔再乘上我
此例中的“切换”是指不保持原选择
例 A: k=n-2
此例与原问题类似。请注意,您不能切换到您选择的门。因此,“停留”胜率始终是1/n
,在这种情况下,转换胜率是(n-1)/n
案例 B: k<n-2
一开始选门带车的概率还是1/n
。从而“呆住”= 1/n
。
在“转换”策略中,你的最终选择不可能是你的首选。因此,你不会想选择第一个有车的门。不选的概率是(n-1)/n
。k-th
开关也是当你选择时,还有n-k
扇门,但你必须排除你的第一扇门。这样,最后一步中撬开被撬门的概率就是1/(n-k-1)
。我们共同拥有:
它表明“转换”策略总是优于“停留”策略。
5)模拟
让我们在 python 上运行它,看看我们公式是否有效。设n
是门的数量,而r
是蒙蒂想要显示的门的数量
蒙特 卡罗模拟
图表显示,随着迭代次数的增加,统计结果越来越接近我们的实际答案。
所以,你知道下次再玩类似这样的游戏应该怎么做。
关于代码的更多信息,请访问我的 GitHub 库。
蒙蒂·霍尔——实证检验
游戏结果—作者:阿列克萨·米哈伊洛维奇
我记得不久前的老蒙蒂霍尔挑战赛。我试着向我的一个朋友解释,我希望说服他接受这个想法。但这被证明是一项相当具有挑战性的任务…
天魔堂是一个概率游戏,第一次尝试很难完全掌握。这个问题如此简单,却又如此反直觉,以至于我不得不花几分钟来测试它。对于那些不知道这个游戏的人来说,Monty Hall 是一个古老的谜题是这样的:
假设你在参加一个游戏节目,你有三扇门可供选择:一扇门后是一辆汽车;另外两扇门后面是山羊。你选了一扇门,比如 1 号门,主人知道门后有什么,他打开了另一扇门,比如 2 号门,里面有一只山羊。然后他对你说,“你想选 3 号门吗?”改变你的选择对你有利吗?
这里的假设是,你并不想成为一名牧羊人(我并不反对这个光荣的职业),而是希望赢得一辆汽车。
第一次听到这个谜题时,我像大多数人一样回答:“没关系,应该是一样的”。我的推理如下——最初我们有三个门可以选择,但后来主持人展示了一只山羊,并从游戏中淘汰了一个门。我们现在有两扇门,其中一扇门后是一辆车。我认为现在赢得车的机会是 50-50,如果我选择转换或不转换都无所谓。这是不对的。最初赢车的几率是 33%。如果我们不切换(在主人打开藏着山羊的一扇门后),我们基本上忽略了新的信息,我们的获胜机会保持不变,即使游戏中只剩下两扇门。
如果我们同意开关门是一件有利可图的事情,那么现在的胜算有多高?我的第一个想法是——如果我不换车,我赢得车的机会保持在 33%,因此我应该换车,因为现在游戏中还有两扇门,赢得车的机会是 50%。但在现实中,切换将我们的获胜概率提高到惊人的 66%!
让我解释一下为什么——我们最初选择的门,比如 1 号门,有 33%的获胜概率。这意味着有 66%的可能性汽车在剩下的两扇门(2 号门和 3 号门)的后面。例如,如果主人打开 2 号门,发现门后有一只山羊,那么同一扇门藏着一辆汽车的概率现在为零。由于概率必须加到 1,汽车藏在 3 号门后面的概率现在从 33%跳到 66%!从 1 号门转换到 3 号门,我们获胜的机会加倍!
我希望这能澄清一些问题,但是我知道这种玩弄概率的行为可能看起来不太直观。因此,我决定做一个小模拟,根据经验计算汽车和山羊,并计算获胜的概率。我想直接测试 Monty Hall 问题,看看哪种策略(切换或不切换)更好。
显然,我没有打电话给我的山羊和汽车经销商进行这个实验,而是用了一些循环。您可以在这个资源库中找到带有模拟的 Jupyter 笔记本。
所以,我们开始吧!
策略 1——无切换
我玩了 100K 次这个游戏,我没有在任何游戏中开关门。事实上,总的获胜概率是 33%,这意味着我总共赢了大约 33K 次。我打印了前 60 场比赛的结果,我们可以很容易地看到山羊图像是如何主导结果模式的。
策略 1-无切换-模拟结果
策略二——切换
我又玩了 10 万次这个游戏,但是现在我在每场游戏中都换了门。模拟产生 66%的胜率!这意味着我赢了 66K 次左右的车!我们甚至可以在下面看到汽车图像是如何主导结果的。
策略 2-转换-模拟结果
我想这证明了。交换会让我们的胜算翻倍。我猜你已经准备说:“这确实非常有趣,但是我能在哪里应用它呢?”
事实证明,在现实生活中很难遇到纯粹的蒙蒂霍尔式的场景。从技术上讲,这需要发生:
- 我们正在几个不同的选择中做出选择,这些选择并不相同,但从外面看起来是一样的
- 在我们做出选择后,有人神奇地告诉我们,剩下的选择中有一个确实不好,而且肯定不是我们想要的
- 然后,我们应该放弃我们第一次做出的选择,也放弃不好的选择,并从剩余的选择中重新选择
我在努力思考这个问题,但是我真的想象不出任何完全尊重这些条件的情况。我确实在一些帖子中遇到过有人问同样的问题,比如这里的和这里的。如果你真的能想到一个纯粹的现实生活中的蒙蒂大厅的情况,我会很高兴听到它,如果是这样,请给我写一个评论!
我希望你喜欢这个快速阅读,不要忘记切换!
纪念性偏见:马德里为每一个女人树立了四个男人的雕像
自 1600 年以来,这座城市已经竖立了 298 座雕像,其中 49 座是献给女性的。其中,只有一小部分描绘了女性历史人物。
在马德里的主要公共广场太阳门广场,游客们会遇到西班牙首都最受关注的照片之一:熊和草莓树的雕像*。这幅关于一只熊在树上吃东西的坦率而受欢迎的描绘代表了这座城市的盾形纹章,也是对新来者的欢迎。*
马德里最著名的雕像“熊和草莓树”
尽管马德里在过去几十年里对基础设施进行了现代化改造,但这座城市仍然保留了其历史街区和街道的风貌。证明这一点的是散布在这个大都市的近 300 座雕像。描绘前国王的好战姿态,基督教符号,希腊和罗马的数字,这些雕像大多有一个共同点:他们的性别。
根据马德里市议会发布的一个数据库,虽然这些纪念碑中有 77 %代表男性历史人物,但只有 16 %多一点显示女性历史人物。这意味着这座城市为每一座女性雕像树立了四座男性雕像。然而,这一比例也包括圣母玛利亚、希腊女神和没有名字或姓氏的女性形象。其余的雕像描绘想法和概念(3 %),或动物(3 %)。
*数据来源:马德里市议会| Medium 不支持 Tableau 嵌入,如果要查图:https://tabsoft.co/39VXsfk
“这些数字很可怕,但它们只不过是我们生活的社会的反映,”艺术集体 Mujeres Mirando Mujeres (MMM)的负责人米拉·阿巴迪亚说。
“我们需要重写所有领域的历史,女性历史人物通过艺术的出现是重塑女性角色和她们的作品所代表的社会价值的另一种方式”,她解释道。
结合艺术和女权主义的"妇女看妇女"的工作始于 2015 年,面向专门从事艺术的博客作者和记者,以及策展人、艺术经理、画廊老板和博物馆馆长,就艺术领域的性别问题提出倡议。“我们意识到新技术给我们带来的机遇,于是 MMM 应运而生。我们不能也不可能对正在发生的所有运动视而不见”,Abadía 说。
Saint María de la Cabeza (1722 年),第一座竖立在马德里的女性雕像|摄影:Edurne Morillo
但是她不是唯一一个关注西班牙纪念碑偏见的人。历史学家玛丽亚·伊莎贝尔·加森(María Isabel Gascón)是一个女性历史学家团体的主席,她谴责巴塞罗纳的雕像中缺少女性的存在。她的组织致力于拯救被历史掩盖的西班牙重要女性的传记。
在马德里,如果我们看看通过雕像纪念的是什么样的人,这一点尤其重要。就女性而言,只有三分之一代表真实的历史人物,而其余的要么是宗教代表(28 %),要么是神话生物(12 %),要么是作为职业或抽象人物的女性角色(24 %)。
哥伦布广场附近的女性雕像。背景是 Jaume Plensa 的《Julia》|摄影:Edurne Morillo
就男性而言,7 %的雕像涉及宗教表现,而神话生物和概念分别占 2 %和 4 %。男性最常见的类别是国王(23 %)、作家(13 %)和军事人物(9 %)。其他受欢迎的类别有政治家、医生、画家、植物学家和科学家。
对阿巴迪亚来说,我们“有义务重写历史,给那些被遗忘的伟大女性发言权和一席之地,她们一直被排除在创造性天才模式之外”。她认为,有许多女性人物可以在西班牙的街头占据一席之地,比如费德里卡·蒙塞尼·马涅(Federica Montseny Ma),一位政治家,也是 20 世纪 30 年代西班牙第二共和国时期的一名部长。她是西班牙第一位担任部长职务的女性,也是西欧第一批担任部长职务的女性之一。
其他候选人可能是第一位正式学医的西班牙女性多洛丝·阿留申·里埃拉,或者是作家、艺术评论家、政治家、西班牙主要女权主义者玛格丽塔·内尔肯·曼斯伯格。“我们可以持续几个小时”,艺术专家和策展人争辩道。
年表也没有善待女性历史人物。在第一个男人的雕像竖立起来之后,女人们要等一百多年才能得到一个雕像。一座西班牙腓力三世的雕像于 1616 年竖立起来,但直到 1722 年才建成第一座女性雕像,献给圣玛丽亚·德拉·卡韦萨。
*数据来源:马德里市议会| Medium 不支持 Tableau 嵌入,如果要查图:https://tabsoft.co/2tHjmm3
“大多数艺术手册都把创作者排除在外,即使有宫廷肖像画家、雕塑家或宗教画家。十九世纪的资产阶级习俗将女性置于家庭中。当第一批欧洲博物馆建立时,这种歧视加深了”。
走在马德里的街道上意味着会遇到戈雅和委拉斯开兹的身影,或者像哈辛托·贝纳本特、文森特·阿莱克桑德雷和卡米洛·何塞·塞拉这样的诺贝尔文学奖得主。然而,游客不会发现任何关于最近去世的科学家玛格丽塔·萨拉斯或弗拉门戈舞蹈家卡门·阿马亚的参考资料。
马德里最著名的 10 座雕像的历史
“有必要回顾我们的过去,因为历史不是绝对的真理,它是流传下来的故事,尽管不一定是真实的”,阿巴迪亚总结道。“有许多被历史吞噬的被遗忘和沉默的女性”。
如果你想仔细看看所有的马德里雕像,这张地图显示了它们,按性别分类。
语气和情态与对话情感
言语特征与对话情感的空间性
在本文中,我们将看到动词功能范畴如何在客户对话文本中使用,以及这些范畴如何有助于语义,尤其是文本情感。
句子中的动词短语有时可以承载巨大的语义,有时即使看不到其余的上下文单词,也仅通过其自身暗示情感,因此作为重要特征有助于情感分析模型。例如,从以下客户评论中划掉所有未包含在任何 VP 中的词语:
The product isn't working properly.
I didn't like this product.
I'm not satisfied with the product quality at all.
为了赋予句子意义,许多语言喜欢用动词来表示不同的屈折变化,如时态和人称。此外,大多数时候,我们想表达我们对动词提出的动作是如何发生的感觉和看法:我们确定吗,我们亲眼看到这个动作了吗,我们认为这是可能的还是不可能的?
这更多的是一种语义能力,因此一个人通常需要多于动词的屈折,多于语法结构。动词的功能是一个宽泛的话题,但我会在统计部分之前解释一些基本概念。如果你有这个背景,你可以跳到下一节。
Tense
是通过动词屈折在语法上实现时间。英语有两种时态:past
和present
。Future
不是没有屈折标记的时态,而是一个time
。Future time
由will
或tomorrow
、8 o'clock
或next week/month
等副词构成。如你所见,tense
是一个语法概念,而time
是一个语义概念。
另一个概念是aspect
,这是一个语法范畴,反映了动词所给予的动作相对于时间的发生。英语有两个方面:
action complete: perfective has moved, had moved
action in progress: progressive is moving, was moving
人们可以把时态和体概括如下:
动词发生的时间:时态和体
正如我们在高中所学的,英语中的被动语态和主动语态。被动语态有进一步的语义子类,但在这篇文章中,我们将停留在高中水平的语法😉
Mood
是表示动词表达事实(指示语气)还是条件性(虚拟语气)的语法范畴。一些例子是:
Sun rises at 6 o'clock here. indicative
It is important the manager be informed of the changes subjunctive
语气是语法上的,与两个语义概念相关联:情态和illocution
。Illocution
一个句子可以被认为是sentence type
:
Go there! imperative
Do you want to go there? interrogative
God save the queen! optative
I will see it. declarative
Modality
是一个语义概念,与说话者对事件的可信性、强制性、合意性或现实性的看法和信念有关。英语中的情态可以通过情态动词(will/would
、can/could
、may/might
、shall/should
、must
)、情态副词(maybe
、 perhaps
、possibly
、probably
)、一些从句包括(wish, it’s time,possible, probable, chance, possibility
)、一些情态名词(decree
、demand
、necessity
、requirement
、request
、 ) 或一些情态形容词(advisable
、crucial
、 imperative
、likely
、probable
来实现
I would love you if things were different irrealis
You may go permission
I may come with you too possibility
I might come with you too possibility
I must go obligation
He must be earning good money necessity
I can ride a bike ability
I can come with you too possibility
It is possible that we might see big changes around us. possibility
It might be the truth doubt
I'm sure they'll come confidence
Lights are on, so he must be in the office evidentiality
从现在开始,我们将看到客户用来与对话代理交互的不同语言特征,以及这些用法如何导致不同的语义。
让我们从我们的 Chris 开始,我们的汽车语音助手,看看汽车对话人工智能中的一些典型用户话语。
克里斯数据集包括许多祈使句:
navigate
navigate home
start navigation
stop navi
play Britney Spears
play music
send a message
read my messages
有时话语只包含一个名词短语:
music
die navigation
new messages
粒子始终是任何语音助手对话数据集的一部分:
yes
no
please
yes please
当然,有些咒骂和侮辱也包括在内,有些是以讽刺的形式:
you suck
you are dumb
you are miserable
a**chloch
you are so intelligent (!)
Chris 是一名司机助理,所以说话简洁明了是很正常的。这不是因为粗鲁或粗鲁,只是因为一个人开车时需要说得简短。对比下面两句话,显然,如果你在开车,第一句更容易:
Hey Chris, drive me home
Hey Chris, shall we drive home together?
祈使句在 SLU 很常见,绝对没有粗鲁的意思,也与说话人的情绪无关。这里真的没什么有趣的,第一组话语有祈使语气,主动语态和无标记体的动词。没有情态动词,没有情态表达或过去式。在这种情况下,语音助手的情感最好从语音信号中计算出来。
克里斯既有礼貌又聪明
到目前为止,口语可能不是很令人兴奋,那么我们可以转向书面语,书面语允许更长的句子,因此有更多的动词形式😄我使用女性电子商务服装评论数据集来探索语言特征的使用。我将使用可爱的空间匹配器(绝对不仅仅因为我是一个贡献者😄)这一节。该数据集包括用户对电子商务网站购物的评论和评级。
在开始之前,让我们记住与动词相关的词性标记,因为我们将主要复习动词。英语动词有五种形式:基底(VB
、VBP
)、-s ( VBZ
)、-ing ( VBG
)、过去(VBD
)、过去分词(VBN
)。同样,未来时间没有标记。情态动词can
、could
、might
、may
、will
、would
承认标记MD
。
声音
先说Voice
,被动语态的匹配模式有is/was adverb* past-participle-verb
和have/has/had been adverb* past-participle-verb
。对应的Matcher
图案可以是:
{"TEXT": {"REGEX": "(is|was)"}}, {"POS": "ADV", "OP": "*"}, {"TAG": "VBN"}
and
{"LEMMA": "have"}, {"TEXT":"been"}, {"POS": "ADV", "OP": "*"}, {"TAG": "VBN"}
第一种模式是is/was
,后跟任意数量的副词,然后是过去分词动词。 POS
用于 UD POS 标签,而TAG
用于扩展 POS。第二种模式类似:have
、has
、had
用lemma : have
表示。
我将首先导入空间,加载英语模型,然后将这两条规则添加到Matcher
对象中:
import spacy
from spacy.matcher import Matchernlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
pass1 = [{"TEXT": {"REGEX": "(is|was)"}}, {"POS": "ADV", "OP": "*"}, {"TAG": "VBN"}pass2 = [{"LEMMA": "have"}, {"TEXT":"been"}, {"POS": "ADV", "OP": "*"}, {"TAG": "VBN"}]matcher.add("pass1", None, pass1)
matcher.add("pass2", None, pass2)
然后我对数据集运行Matcher
,这里有一些被动语态的例子,来自正面和负面评论:
one wash and this was ruined!washed them according to directions and they were ruined.this could not have been returned fasteri kept it anyway because the xs has been sold out, and got it taken in a bit.it is simply stunning and indeed appears to have been designed by an artist.would buy this again in several different colors if they were offeredif these were presented in other colors, i would buy those as well
评论中被动语态动词的数量如何与评论评级相关联?首先,我们来看看点评的评分分布:
查看评级分布。显然许多顾客都很满意
接下来,我们看到评论中被动语态动词计数的分布。许多评论根本不包括被动语态,有些评论只有一个被动动词,很少有评论有一个以上的被动结构。
被动语态动词的数量与评论评分相关吗?从下面来看,确实没有(只看热图就足够了,它指出了根本没有相关性)。
热图、jointplot 和 violin plot 用于评论评级和被动动词计数
毫不奇怪,看看语料库中的句子,被动语态可以是“由著名设计师设计的”或“它们被退回来了”。当提到衣服时,它是如何设计、裁剪和完成的,可以是正面的也可以是负面的;它被归还,毁坏,呈现可以是消极的也可以是积极的。
时态和体
让我们看看动词时态和体的时间如何与评论评分相关联。记住,过去时态和现在时态很容易计算(通过观察动词的词形变化),而将来时不是真正的时态,因为没有词形变化。我们将通过计算will
、going to
和时间副词来计算未来时间出现的次数。
这次我们可以用Matcher
句型再做一遍时态表:
时态和体,这次是用空间匹配模式
我还会数present perfect progressive tense
(“一直在做”)和past perfect progressive tense
(“一直在做”),它们会对现在时态和过去时态的完成体和进行体计数做出贡献。
以下是评论中使用的时态和体式的一些例子:
I love, love, love this jumpsuit. it's fun, flirty, and fabulous! every time i wear it, i get nothing but great compliments!fits nicely! i'm 5'4, 130lb and pregnant so i bough t medium to grow into.I have been waiting for this sweater coat to ship for weeks and i was so excited for it to arrive. this coat is not true to size and made me look short and squat.I have been searching for the perfect denim jacket and this it!I had been eyeing this coat for a few weeks after it appeared in the email, and i finally decided to purchase it to treat myself.
未来的时间呢?既然没有形态标记,我们可以从will
、going to
、plan to
、in 2/5/10 days
、next week/month/summer
、the day after tomorrow
…
对应的Matcher
图案可以是:
future_modal = [{"TEXT": "will", "TAG": "MD"}]future_adv = [{"TEXT": {"REGEX": "(plan(ning) to|(am|is|are) going to)"}}time_expr1 = [{"TEXT": {"REGEX": "((next|oncoming)(week|month|year|summer|winter|autumn|fall|)|the day after tomorrow)"}}]time_expr2 = [{"TEXT": "in"}, {"LIKE_NUM": True}, {"TEXT": {"REGEX":"(day|week|month|year)s"}}]
语料库中的例子有:
sadly will be returning, but i'm sure i will find something to exchange it for!I love this shirt because when i first saw it, i wasn't sure if it was a shirt or dress. since it is see-through if you wear it like a dress you will need a slip or wear it with leggings.Just ordered this in a small for me (5'6", 135, size 4) and medium for my mom (5'3", 130, size 8) and it is gorgeous - beautifully draped, all the weight/warmth i'll need for houston fall and winter, looks polished snapped or unsnapped. age-appropriate for both my mom (60's) and myself (30's). will look amazing with skinny jeans or leggings.This will be perfect for the mild fall weather in texasThere's no extra buttons to replace the old one with and i'm worried more of the coat is going to fall apart.This is going to be my go to all season.i plan to wear it out to dinner for my birthday and to a house party on new years day....i am planning to exchange this and hoping it doesn't happen againit is nice addition to my wardrobe and i am planning to wear it to the multiple occasionthis is one of those rare dresses that looks good on me now and will still look good on me in 6 months when i've got a huge belly.
根据下面的统计,顾客经常使用过去式。现在时也广泛使用,而未来时间在每次复习中使用一到两次。
以下是相应的直方图:
对应直方图
根据下面的热图,现在时和将来时的用法与评分并不真正相关;负面评价和正面评价都包括这两个时态动词。但是,过去式看起来有点负相关;更多地使用过去式意味着更差的评分。完美和进步方面看起来也不太好,它们也有点负相关。
时态和体的热图
下面的脊线图显示了一些信息,更好的评论倾向于使用 0 的过去式;不快乐的顾客倾向于更流畅地使用过去式。一个可能的解释是顾客抱怨很多:“包裹来晚了”、“腰围不合适”、“我拉不上拉链”、“我不喜欢它”;而快乐的顾客则展望未来😄当我们更快乐的时候,我们都会展望未来,不是吗?😉
语气和情态
正如我们所见,情态是一个语义概念,同一个情态可以给出不同的情态。让我们看一个例子中引入的不同语义could
:
i love that i could dress it up for a party, or down for work.
possibility
the straps are very pretty and it could easily be nightwear too.
possibilitythis is a light weight bra, could be a little more supportive. pretty color, with nice lines. irrealisI bought this and like other reviews, agree that the quality probably could be better, but i still love it enough to keep.
irrealis
got it on sale, but it still could've been cheaper.
irrealis
Bought a large, could barely pull up over my butt.
ability
could
与消极和积极情绪都相关。可能性情绪看起来是积极的,而非现实情绪看起来既积极又消极。
那么couldn't
呢?这完全是另外一个故事,下面的例子显示了couldn't
为消极和积极情绪提供了多少语义丰富性,尽管几乎所有的例子都只包括一种类型的情态:
so small in fact that i could not zip it up! abilityi was so excited to get his dress for my wedding shower and then i couldn't wear it :( abilityi really tried because the fabric is wonderful and the shirt is light and breezy for summer, i just couldn't make it work abilityi simply couldn't resist! i could not be more pleased and regret not having bought this item earlier, since i would have enjoyed wearing it during the holidays.i could not be happier with the purchase and the keyhole in the back is a beautiful detail.
emphasizing opinioni also thought that this was very heavy for a maxi dress and could not imagine wearing it in 80 degree weather. ability i think it's maybe a little too long (or short, i can't figure it out) but i couldn't pass up this skirt because the pattern is so pretty. ability i just wish it was more of a blue denim blue but nonetheless, i could not walk away from the store without this. ability
would
和wouldn't
可能感觉不同,但从统计上看,它们与could
和couldn't
相似:
模式和审查评级相关矩阵
不真实既发生在负面评价中,也发生在正面评价中。考虑:
maybe if i weren't as small chested this wouldn't be an issue for me. i definitely recommend this tee.the neckline wouldn't even stay up on my upper body, it was that loose.
那么毫不奇怪的是,would/wouldn’t/could/couldn’t
的出现并没有透露太多的评论情绪。
相应的Matcher
模式将是
[{"TEXT": {"REGEX": "(would|could|can|might|may)"}, "TAG": "MD"}]
MD
是情态动词标签,我们排除will
。
亲爱的读者们,本文到此结束。我们和 spaCy 玩得很开心,不是吗(像往常一样)?😃我们每天都要处理大量的数据,但有时我们会忘记阅读语料库中的内容。语言不仅仅是一堆凑在一起的单词;它有许多方面,包括统计和语言学。今天我们两个都喜欢。下次我们将继续语音助手的统计讨论。直到下一次,你总是可以在https://chris.com拜访克里斯。你也可以随时登陆 https://duygua.github.io 来看我。同时保持快乐、安全和和谐!
参考文献
帕尔默,F. (2001),语气和情态(第二版。,剑桥语言学教科书)。剑桥:剑桥大学出版社。doi:10.1017/CBO 978113916716717
更多微软数据科学面试问题和答案
微软面试中一些数据科学问题的另一个演练
几周前,我发表了一篇文章叫做**微软数据科学面试问答!它涵盖了我的朋友在微软一个数据科学家职位的面试中提供给我的十八个问题中的前九个。本周,我将尽我所能回答剩下的九个问题。开始了。**
面试问题
来自微软数据科学面试的面试问题
问:处理贝叶斯问题的简单概率问题
答:我的猜测是,他们可能会问一些关于贝叶斯定理的一般性问题,并要求在给定其他变量的值的情况下,找出一个变量的值。我将通过一个例子简单介绍一下什么是贝叶斯定理。
P(A|B) 是假设事件 B 发生时事件 A 发生的概率
P(B|A) 是假设事件 A 发生时事件 B 发生的概率
P(A) 是事件 A 发生的概率 P(B) 是事件 B 发生的概率
我将用一个例子来说明这一点:
- P(A)等于患者患有肝病的概率。过去有 10%的病人患有肝病。因此 P(A) = 0.1
- P(B)等于病人是酗酒者的概率。过去看过的病人中有 5%是酗酒者。因此 P(B) = 0.05
- 你也知道 7%被诊断为肝病的患者也是酗酒者。因此 P(B|A) = 0.07
- 利用贝叶斯定理,可以得出:
P(A | B)=(0.07 * 0.1)/0.05 = 0.14 因此,如果患者是一个酗酒者,他们有 14%的几率患有肝病。
如果贝叶斯定理仍然让你困惑,3Blue1Brown 以一种视觉和直观的方式做出了令人难以置信的解释——见这里。
问:在应用机器学习算法之前,数据争论和数据清洗的一些步骤是什么?
答:在数据争论和数据清理时,可以采取许多步骤。下面列出了一些最常见的步骤:
- ****数据剖析:几乎每个人都是从了解自己的数据集开始的。更具体地说,您可以使用。形状和对数值变量的描述。描述()。
- ****数据可视化:有时,用直方图、箱线图和散点图来可视化数据很有用,这样可以更好地理解变量之间的关系,也可以识别潜在的异常值。
- 语法错误:这包括确保没有空格,确保字母大小写一致,检查错别字。您可以使用。unique()或使用条形图。
- 标准化或规范化:根据您正在处理的数据集和您决定使用的机器学习方法,标准化或规范化您的数据可能会很有用,这样不同变量的不同尺度就不会对您的模型性能产生负面影响。
- 处理空值:有多种方法可以处理空值,包括完全删除具有空值的行,用均值/中值/众数替换空值,用新的类别(例如未知)替换空值,预测值,或者使用可以处理空值的机器学习模型。此处阅读更多。
- ****其他还有:去除无关数据,去除重复,类型转换。
问:如何处理不平衡的二元分类?
答:有许多方法可以处理不平衡的二进制分类(假设您想要识别少数类):
- 首先,您需要重新考虑您用来评估您的模型的指标。你的模型的准确性可能不是最好的衡量标准,因为我将用一个例子来解释为什么。假设 99 次银行取款不是欺诈,1 次取款是欺诈。如果你的模型只是简单地将每个实例归类为“非欺诈”,那么它的准确率将达到 99%!因此,您可能需要考虑使用精度和召回率等指标。****
- 另一个改善不平衡二进制分类的方法是通过增加小众类的误分类成本。通过增加这样的惩罚,该模型应该更准确地对少数民族进行分类。****
- 最后,你可以通过过采样少数类或者欠采样多数类来改善类的平衡。你可以在这里阅读更多关于它的信息。****
问:箱形图和直方图有什么区别?
箱线图与直方图
答:虽然箱线图和直方图是用于显示数据分布的可视化工具,但它们传达信息的方式不同。
直方图是显示数值变量值的频率的条形图,用于估计给定变量的概率分布。它允许您快速了解分布的形状、变化和潜在的异常值。
箱线图表达了数据分布的不同方面。虽然您无法通过箱线图看到分布的形状,但您可以收集其他信息,如四分位数、范围和异常值。当您想要同时比较多个图表时,箱线图尤其有用,因为它们比直方图占用更少的空间。
如何阅读箱线图
问:如何着手解决 L2 正则化回归问题?
A: 不幸的是,我对岭回归的了解还不足以知道 L2 回归问题是什么,但是如果你知道,请评论你的答案,我会在这里大声喊出来!
问:概率基础
答:为此,我打算在这里看一下八大概率法则以及四种不同的计数方法(详见 这里 )。
概率的八大法则
- 规则#1:对于任何事件 A,0≤P(A)≤1;换句话说,一个事件发生的概率范围可以从 0 到 1。
- 规则 2:所有可能结果的概率总和总是等于 1。
- 规则#3: P(非 A)= 1—P(A);这个规律解释了一个事件的概率和它的补事件之间的关系。补充事件是指包含 a 中没有的所有可能结果的事件
- 规则#4:如果 A 和 B 是不相交事件(互斥),那么 P(A 或 B)= P(A)+P(B);这被称为不相交事件的添加规则
- 规则#5: P(A 或 B) = P(A) + P(B) — P(A 和 B);这就是所谓的一般加法法则。
- 规则#6:如果 A 和 B 是两个独立事件,那么 P(A 和 B)= P(A) P(B);这叫做独立事件的乘法法则。*
- 规则#7:给定事件 A,事件 B 的条件概率为 P(B|A) = P(A 和 B) / P(A)
- 规则#8:对于任意两个事件 A 和 B, P(A 和 B)= P(A) P(B | A);这叫做一般乘法法则*
计数方法
阶乘公式:n!= n x(n-1)x(n-2)x…x 2 x 1 当项目数等于可用位置数时使用。例如:找出 5 个人可以坐在 5 个空座位上的总数。
= 5×4×3×2×1 = 120
基本计数原理(乘法) 当允许重复且填充空位的方式数不受先前填充的影响时,应使用此方法。有 3 种早餐、4 种午餐和 5 种甜点。组合总数= 5 x 4 x 3 = 60
排列:P(n,r)= n!/(n r)!
一个代码有 4 个特定顺序的数字,数字范围从 0 到 9。如果一个数字只能用一次,有多少种排列?
P(n,r) = 10!/(10–4)!=(10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x2 x 1)/(6x 5 x 4 x 3 x2 x 1)= 5040
组合公式:C(n,r)=(n!)/[(n r)!r!] 当不允许替换并且项目的排列顺序不重要时使用。要赢得彩票,你必须从 1 到 52 中以任意顺序选出 5 个正确的数字。有多少种可能的组合?
C(n,r) = 52!/ (52–5)!5!= 2598960
问:描述马尔可夫链?
答:Brilliant 提供了一个很棒的马尔可夫链定义(此处):
“马尔可夫链是一个数学系统,它根据某些概率规则经历从一种状态到另一种状态的转换。马尔可夫链的定义特征是,无论过程如何到达其当前状态,可能的未来状态都是固定的。换句话说,转换到任何特定状态的概率只取决于当前状态和经过的时间。”
马尔可夫链背后的实际数学需要线性代数和矩阵的知识,所以我会在下面留下一些链接,以防你想自己进一步探索这个主题。
问:描述不同的正则化方法,如 L1 和 L2 正则化?
答:L1 和 L2 正则化都是用于减少训练数据过拟合的方法。最小二乘法使残差平方和最小,这可能导致低偏差但高方差。
L2 正则化,也称为岭回归,最小化残差平方和加上λ乘以斜率平方。这个附加项被称为岭回归惩罚**。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。******
如果采用岭回归罚分并用斜率的绝对值替换它,则得到套索回归或 L1 正则化。****
L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。
StatQuest 有一个关于套索和山脊回归的惊人视频这里。
问:神经网络基础
答:神经网络是受人脑启发的多层模型。就像我们大脑中的神经元一样,上面的圆圈代表一个节点。蓝色圆圈代表输入层,黑色圆圈代表隐藏层,绿色圆圈代表输出层。隐藏层中的每个节点代表输入经过的功能,最终导致绿色圆圈中的输出。这些功能的正式术语称为s 形激活功能。****
如果你想要一步一步的创建神经网络的例子,请点击这里查看 Victor Zhou 的文章。
如果你是一名视觉/音频学习者,3Blue1Brown 在 YouTube 上有一个关于神经网络和深度学习的惊人系列这里。
感谢你的阅读!
如果你喜欢我的工作并想支持我,请在我的电子邮件列表这里注册,成为第一个听到新的独家内容的人!😃
更多相关文章
微软面试中一些数据科学问题的演练
towardsdatascience.com](/microsoft-data-science-interview-questions-and-answers-69ccac16bd9b) [## 谷歌的数据科学面试脑筋急转弯
作为谷歌数据科学面试的一部分,他们喜欢问一些他们称为“解决问题”的问题…
towardsdatascience.com](/googles-data-science-interview-brain-teasers-7f3c1dc4ea7f) [## 数据科学家的 5 个常见 SQL 面试问题
帮助您发展 SQL 技能,在任何面试中胜出
towardsdatascience.com](/5-common-sql-interview-problems-for-data-scientists-1bfa02d8bae6) [## 数据科学家的 40 个统计面试问题和答案
为你的面试复习统计知识的资源!
towardsdatascience.com](/40-statistics-interview-problems-and-answers-for-data-scientists-6971a02b7eee) [## 亚马逊的数据科学家面试实践问题
一些亚马逊面试问题的演练!
towardsdatascience.com](/amazon-data-scientist-interview-practice-problems-15b9b86e86c6)******
关于自动编码器异常检测的更多信息:用 Keras 测量序列异常
使用 Keras 框架设计一个简单的自动编码器,它可以学习字符串序列的模式并检测错误的模式。
由 Raphael Schaller 在 Unsplash 拍摄的照片
几个月前,我发布了一个的故事,展示了如何使用自动编码器(一种主要用于降维和图像压缩的神经网络的特定类型或架构)来有效地检测一大组序列中的异常或错误的字符串序列。给定一个遵循特定模式或格式的序列列表(例如,“AB121E”、“AB323”、“DN176”),我展示了我们如何设计一个网络来学习这些模式或格式,并能够检测序列格式不正确的情况。在这个故事中,我想展示一个更“高级”的用例,或者我们如何使用相同的方法来解决一个稍微复杂一些的问题。有时,我们想要回答的问题不是某个序列是否异常或异常,而是某个给定序列与其他序列相比如何异常或异常。例如,假设我们的数据流中每小时有一些异常序列是很正常的,但我们需要找到一种方法来评估某个小时与前一个小时相比有多正常或不正常。我们可以计算出我们每小时看到的异常的平均水平,但是我们如何处理这样的事情呢?
我不会深入研究自动编码器的理论以及它们是如何工作的(有相当多的好的和可访问的阅读材料——我在下面提到了一些),但简单地说,基本思想是自动编码器是一种网络形式,它学习其输入数据的 压缩表示,并试图重建它。通过学习如何从压缩表示中重建序列,一个训练有素的自动编码器可以说是学习了控制其格式的“主导规则”(我应该承认,虽然这个类比对一些人有帮助,但不是每个人都觉得学习压缩表示的想法像学习格式规则一样有吸引力)。因此,我们可以使用这样的自动编码器来估计某个序列的格式或模式如何不同于或偏离其他序列。
遵循“代码优先”的方法,我将立即深入研究代码,并按 3 个主要步骤进行:
- 准备深度学习的序列 —标记化、填充和迁移(这取决于手头的问题,但我不认为这个简单的问题需要使用嵌入——无论是学习到的还是预先学习到的)。
- 创建并训练一个自动编码器
- 预测得分
1.序列准备
1.1 标记化
因此,我们有一个相当大的数据集,大约 25 万个序列(这里描述的方法的成功很大程度上取决于有一个大样本)。序列通常如下所示:
顺序
正如你所看到的,大多数序列由 4 个部分(或更多)组成,并且似乎遵循某种模式或格式,尽管我们不知道它。
我们需要做的第一项任务是标记序列,并为序列中的每个成分(或单词)创建数字表示——即,将[‘AB ‘,’ C1 ‘,’ D5’]变成[1,7,6]。为了做到这一点,我使用了 Keras 的 Tokenizer 类,它负责标记化中的大多数低级步骤。
我定义了一个大小为 750 的词汇表——这意味着记号赋予器将只为数据集中最频繁出现的 750 个记号创建表示。
所有序列都存储在数据帧“序列”中,并通过序列[FEAT_FIELD]进行访问
在我们的数据集上安装了 tokenizer()之后,我们可以使用 tokenizer 的属性 word_index 来获取一个 dictionary 对象,该对象可用于检查分配给每个部分的数字表示。
我们通过在序列上调用标记化器的方法 texts_to_sequences() 来完成标记化阶段,以便获得一个数组,其中包含我们集合中所有序列的数字表示。
我们现在有了一组符号化的序列([1,3,31,22])或一组原始集合的数值表示([DF,36,FR,GX567])。
1.2 填充
我们需要采取的下一步是关注我们分析所基于的序列的长度。在最好的情况下,所有序列的长度都是相同的,但有时情况并非如此。这个问题很重要,因为它关系到我们的模型将使用的特性。因为所有的序列都需要相同的长度(您将在后面看到原因),所以短序列通常用零填充,以匹配长序列的长度。因此,如果我们决定我们的模型要学习的数字特征是 6,那么我们需要用零“填充”这个序列[1,3,31,22],并将其转换为这个序列[1,3,31,22,0,0]。
例如,在我们的例子中,绝大多数序列有 4 个组成部分,但有些没有。
我们序列的平均长度确实是 4,但我们看到有些“异常值”有更多。然而,因为大多数序列只有 4 个分量,并且因为不必要的填充可能会影响我们模型的性能,所以我们最好坚持 4 个分量,这样我们所要做的就是填充少于 4 个分量的序列。
我们使用这个一行程序来实现:
MAX_FEAT_LEN = 4
pad_seqs = pad_sequences(seqs, maxlen=MAX_FEAT_LEN, padding='post', truncating='post')
1.3 矢量化
我们最后也是最重要的一步是对每个序列进行矢量化。通过向量化我们的序列,我们像这样变换(或展平)序列:1,4,31,22
变成这样:
您在这里看到的是一个大小为 750(这是我们的词汇量)的向量,它由 746 个 0 和 4 个 1 组成,而每个 1 的位置或索引是其数值的 representד。换句话说,序列 1,4,31,22 将在向量 v 中表示为:
**v**[1] = 1
**v**[4] = 1
**v**[31] = 1
**v**[22] = 1
使用这种方法可以很容易地实现这一点:
弗朗索瓦·乔莱(DLP)
现在我们的序列可以学习了!
2.创建并训练自动编码器
我不会在这里过多地讨论细节,因为我相信如果你对 DL 和 Keras 有所了解,代码是非常简单明了的。然而,简而言之,自动编码器通常是通过连接一个编码层和一个解码层来创建的,前者将输入压缩或挤压到一个较低维度的层中,从而创建一种“瓶颈”,后者学习从输入数据的压缩表示中重建输入。
摘自https://www.jeremyjordan.me/autoencoders/
根据手头的问题,自动编码器显然可以以多种方式设计。我选择使用一个非常简单的例子(主要是由于数据的性质及其相对不复杂),这个例子可以使用 Keras 非常简单地实现,如下所示:
这通常不是必需的,但是如果你想密切跟踪和观察你的模型的性能并保存它(像我一样),那么这可能是有帮助的(否则你可以只调用 autoencoder compile()和 fit()方法。
假设模型表现足够好,我们现在可以加载它,并继续检查和评分我们的序列:
autoencoder = load_model('model_bin.h5')
3.预测和评分
现在我们到了有趣的部分。我们有一个自动编码器,它接收一个字符串序列作为输入(在它被标记化、填充和矢量化之后),并输出同一序列的重构。但是这个输出并不真正有趣——如果我们的自动编码器工作正常,它将简单地输出与我们给它的输入序列非常相似的东西。关于自动编码器的输出,有趣的是输出和输入序列彼此之间有多么不同。假设我们的自动编码器训练有素,那么如果输入序列格式良好,或者如果它遵循自动编码器从训练数据中学习到的相同模式,那么输出序列将是相同或相似的。相应地,如果输入序列不遵循自动编码器已经学习的模式,则输出序列将与输入序列不太相似。
因此,如果我们想要检查某个序列是否或在多大程度上遵循自动编码器从训练数据中学习到的模式,那么我们需要测量自动编码器的预测或其输出的序列所产生的差异(或误差)。但是我们怎么做呢?
让我提出一个可能的方法。在标记化、填充和矢量化之后,每个序列基本上都是一个零向量,在每个数字标记的索引位置都有“1”——因此在 6 个字符的词汇向量中,[1,3]将表示为[0,1,0,1,0,0]。如果我们的自动编码器将接收这个输入,并输出序列[0,1,0,0,1,0],它代表序列[1,4],那么我们有一个错误。我们想要实现的是找到一种方法来测量这或测量两个序列不同的程度。做到这一点的最有效的方法之一是简单地获得每个输出序列的均方误差,通过(1)减去输入和输出以计算误差;(2)平方结果(消除任何负值);(3)将误差的平均值作为输出序列有多“错误”的度量。
这段代码将使这一点更加清楚。
这里我们有 3 个输入序列和 3 个输出序列。第一个输出序列没有任何错误,而第二个输出序列有一个错误,第三个有两个错误。当我们看到减去它们的输出时,这一点就很清楚了:
Result of subtracting the vectors:
[[ 0 0 0 0 0]
[-1 0 0 0 0]
[ 0 0 -1 -1 0]]
当我们计算误差的平方并取每个序列的平均值时,我们就得到一个不完美的度量,或者说它偏离输入序列的程度。
Errors:
[0\. 0.2 0.4]
因此,为了在我们的用例中实现这一点,我们需要做的就是通过对输入序列调用 predict 来从自动编码器获取输出序列,然后对错误数求平方并取平均值。
现在,每个序列都有一个特定的分数,代表它与输入序列的差异程度,我们可以用它来衡量这个序列遵循我们的自动编码器所学习的模式的程度。然而,这个分数本身并没有太大的帮助,也没有告诉我们任何事情(事实上,不管手头的词汇量有多大,考虑这个数字本身就是一个错误)。我们可以利用这一点的一种方法是测量我们数据集的误差平均值 — np.quantile(mse,0.5) ,然后将高于该阈值的每个序列视为比其他序列更不正常;而测量误差高于第 75 百分位的序列为多多异常,依此类推。这将允许我们根据序列与自动编码器学习的模式的偏离程度对序列进行评分。
然而,反其道而行之会更准确、更有效——能够知道某个序列对应的百分位是多少,以便得到它的异常分数。这就是下面的方法所要做的:在准备好字符串之后,它使用 autoencoder 的 predict()方法,获得与输出序列相关联的误差项,并获得误差值的百分位数排名,这可以为我们提供它与学习模式的一致性的更准确的表示。
如下图所示,序列“9 ER 223 ABCDSED”的百分位等级为 73.8,这意味着考虑到自动编码器对其做出的预测错误数量,它是相对不正常的。这可能意味着它与自动编码器学习的其他序列遵循的模式有相当大的差异。
score, rank = get_sequence_anomaly_rank('9 ER 223 ABCDSED')print(f'Anomaly Score:{score}, Percentile Rank:{rank}')==> **Anomaly Score:[0.00346862], Percentile Rank:73.85446487442933**
现在测量某些序列以及序列组的异常程度是很简单的。为了评估某个组的异常程度,我们需要做的就是计算该组成员产生的误差的加权平均值。
我希望这有所帮助!
示例笔记本可以在这里找到
一些关于自动编码器的链接:
[## 自动编码器介绍。
自动编码器是一种无监督的学习技术,其中我们利用神经网络来完成表示的任务…
www.jeremyjordan.me](https://www.jeremyjordan.me/autoencoders/) [## 应用深度学习-第 3 部分:自动编码器
概观
towardsdatascience.com](/applied-deep-learning-part-3-autoencoders-1c083af4d798)
【https://blog.keras.io/building-autoencoders-in-keras.html
不仅仅是漂亮的图表
大数据可视化的重要性
很多时候,局外人认为数据分析师和科学家的工作只是处理数字。我们中那些真正实践过从数据中提取洞见的科学和艺术的人知道,这项工作至少与分析一样具有创造性。数据团队在组织中的角色基本上是用数据讲述故事。那么,为什么如此多的数据团队没有使用他们可用的最强大的通信工具呢?
即使是经验丰富的数据科学家也经常将数据可视化归入数据分析的探索阶段。他们没有在数据分析过程中最重要的阶段使用 dataviz:交流他们的结果。这些数据专家忘记的是,并不是每个人都像他们一样思考。虽然数字或表格对于有丰富理解经验的人来说很有意义,但大多数人更擅长解释数据的可视化表示。
在这篇文章中,我强调了数据可视化对于帮助数据科学家和数据消费者更好地理解数据集至关重要的几个具体例子。这些例子并不全面,但是它们可以帮助你思考和理解数据可视化的价值。最后,我引用了史蒂夫·乔布斯操纵数据的一个具体例子,警告欺骗性或其他不良数据可视化的危险。
模式识别
你是否曾经看着一张表格,却被它弄糊涂了,只是为了可视化数据,并意识到有一个清晰的模式?有效的数据可视化表示允许我们识别当数据用数字表示时不明显的模式。模式可以是任何东西,从认识到增长是指数的(例如,与线性或随机相反),到证明两个变量之间的相关性。
相对值
比较相对价值是人脑比数字更擅长直观理解图像的另一个领域。饼图和圆环图、条形图、直方图和树形图都有助于以易于理解的方式阐明事物的相对大小、价值或数量。
以这个视频为例,它试图给人一种印象,与我们宇宙中的其他物体相比,地球是多么的小。虽然创造者可以简单地列出这些物体的体积(地球是 1 万亿立方千米,而太阳是 1.409 x 1⁰ ⁸立方千米),但他们正确地评估了为了让人们对宇宙的大小有一个真正直观的感觉,直观地显示物体的体积会更好。
地理空间信息
地理空间信息是一种绝对需要可视化的数据。在这个领域,我们认为图形、非表格数据是理所当然的,但重要的是要记住,表格形式的地理空间数据基本上是无用的。
摘自我的分析“HRC 写的是哪里”
左边是一个表示地理空间数据的最基本(也是最有效)方法的例子:地图。具体来说,这是一个 choropleth 地图,这意味着陆地被划分为区域(在这种情况下是国家),然后根据统计数据(在这种情况下是希拉里·克林顿在她的国务院电子邮件中提到特定国家的次数)进行着色。想象一下这个数据以表格的形式出现是什么样子:一列是国家的名称,另一列是那个国家被提及的次数。这个表很长(超过 150 行),很难破译。可视化很快告诉我们哪些国家经常被提及(中国、俄罗斯、英国、伊朗和利比亚),哪些国家很少被提及(蒙古、撒哈拉以南非洲国家)。
能力越大,责任越大
不幸的是,使用数据可视化来欺骗而不是告知太容易了。对于数据分析师工具包中的其他工具也是如此,但是对于数据可视化来说,特别容易陷入欺骗的陷阱。
滥用可视化的一个著名例子;请注意 3D 饼图如何让 19.5%的苹果市场份额看起来比 21.2%的“其他”市场份额大
以史蒂夫·乔布斯在 2008 年 MacWorld 博览会上展示的 3D 饼图为例。一个不经意的观察者可能会认为苹果智能手机的市场份额大于“其他”类别的市场份额,因为绿色部分似乎大于紫色部分。然而,如果你比较切片上的数字,你可以看到“其他”类别实际上有 21.2%的市场份额,而苹果只有 19.5%的市场份额。这是否是史蒂夫·乔布斯的故意混淆视听尚有争议,但效果是显而易见的。
让 dataviz 再次变得伟大
正如我在的另一篇文章中所写的,我最近看到了很多糟糕的数据可视化。作为数据消费者,我们必须对媒体制作者提出更多要求,让他们知道他们不能逃避草率或误导性的数据可视化。相反,作为数据传播者(数据科学家、分析师、记者),我们必须努力使数据可视化,不仅在视觉上引人注目,而且信息丰富,不会误导。数据不仅仅是美丽的。它是一个强大的工具,可以帮助人们在从个人生活到治理的方方面面做出关键决策。让我们以最好的方式使用我们的工具。
死亡率作为流行病爆发的指标
我们可以从冠状病毒死亡率的不可靠估计中推断出什么?
马库斯·斯皮斯克在 Unsplash 上的照片
冠状病毒已经蔓延到世界上许多国家,并在许多地方引起恐慌。一个主要的讨论是关于估计死亡率。众所周知,死亡率的估计是非常不可靠的,原因有很多。举个例子,
死亡率估计值可能过低,因为:
- 重症患者可能会在检测前死亡
- 当地官员可能会隐瞒死亡人数
- 今天的死亡人数是由许多天前的病人造成的(关于这种“滞后”效应的更多细节在我的上一篇文章中讨论过)
- ……
死亡率估计值可能过高,因为:
- 症状较轻的患者可能不会感到不适而寻求医疗帮助
- 患者可能不符合当地政府的检测标准,因此无法得到确认
- 由于人为错误、取样错误、疾病的早期阶段等,受感染的患者可能具有阴性测试结果
- ……
对双方来说,这样的例子不胜枚举。并且有大量的文献根据这些影响来调整估计值。但是,我们能从这个不可靠的估计中了解到别的东西吗?
与其关注死亡率本身的值,我们不如用它来表示流行病的爆发状态。例如,我们可以使用死亡率和确诊病例数来跨越一个二维平面,并添加与新确诊病例成比例的气泡大小来指示最近的传播速度。这些可视化大致将平面分成四个区域:
如果我们假设所有国家的“真实”死亡率大致稳定(一个很大的“如果”,但仍然是一个有用的起点),那么我们可以为每个地区推导出以下公式:
- 区域#1:不确定。该地区确诊数低,死亡率低。没有足够的统计数据来做出可靠的判断。
- 区域#2:检测中。该地区确诊人数低,但死亡率高,这表明可能有许多未被发现的感染患者(因为症状严重的患者通常被较早发现)。
- **区域#3:有效检测。**该地区确诊人数高,但死亡率低。这表明已经发现了许多症状轻微的患者。所以检测被感染的病人可能是有效的。
- 区域#4:保健超负荷和/或检测不足。该地区确诊人数多,死亡率高。这表明卫生保健系统可能超负荷,和/或仍有许多病人未被发现。
这些区域的边界不是清晰的,而是逐渐的。对于死亡率,湖北省以外的中国死亡率 0.5%~2%是一个合理的基线。对于已确认的数量,大约 100~500 是开始淹没医疗系统的合理范围。
应用我们上面陈述的逻辑,我们可以使用约翰霍普金斯大学的数据,为一组国家/地区绘制 2020 年 2 月 26 日和一周后 2020 年 3 月 26 日两个不同日期的死亡率与确诊人数的关系图。每个泡沫的大小与新确认计数的 3 天移动平均值的对数成正比。因此,更大的气泡意味着最近确诊了更多病例,这表明(检测到的)病毒正在更快地传播。
从以上情节中,我们可以对各个国家的疫情做出如下判断:
法国
它在 2020 年 2 月 26 日处于检测中区域,尽管其小气泡大小表明当时没有多少新病例。
因此,正如预期的那样,一周后的 2020 年 3 月 2 日,其确诊病例在短短一周内从 18 例激增至 191 例,将死亡率降至更典型的 1.6%。
伊朗
它在 2020 年 2 月 26 日处于检测中区域,其相对较大的气泡尺寸表明该病毒正在快速传播。如果这种蔓延得不到控制,将来可能会淹没医疗资源。
上述说法可以在 2020 年 3 月 2 日的图中得到证实,在那里,伊朗已经进入检测不足和/或医疗保健超载区域,泡沫尺寸甚至更大。因此,我们可以说伊朗可能仍然有大量未被发现的病人,医疗保健系统可能开始超负荷运转。
美国
截至 2020 年 2 月 26 日,它位于非决定性区域。所以相对比较安静。
然而,在 2020 年 3 月 2 日,美国明显位于检测不足区域。这与一周前法国的情况类似,但有更多的已确认数据和更大的泡沫尺寸。这表明,一周前,美国可能比法国有更多未被发现的感染者。这是一个强烈的警告信号。因为如果我们预计美国的死亡率会下降到与法国相似的 0.5~2%的水平,我们会推断出成百上千甚至上千的感染者仍然没有被发现。
另一方面,我们必须意识到,截至 2020 年 3 月 2 日,美国六分之五的死亡病例集中在华盛顿州金县的生命护理中心疗养院。众所周知,老年人群的死亡率更高。然而,King 县只有 14 例确诊病例,因此县内死亡率为 35.7%,比任何年龄组的死亡率都高几倍。因此,仍然有理由相信美国处于未被检测到的地区,有数百名患者未被检测到,尽管疗养院的调整使其没有最初显示的那么严重。
韩国
它位于 2020 年 2 月 26 日和 2020 年 3 月 2 日的有效探测区域。它拥有世界上最高的确诊数量(除了中国),同时保持较低的死亡率。但是它巨大的气泡尺寸表明它的主要问题是遏制传播,而不是检测病毒。
意大利
在这两个日期,它的情况介于伊朗和韩国之间。
德国和西班牙
他们在 2020-02-26 处于非决定性区域,慢慢走向道德为零的有效探测区域。然而,他们相对较大的气泡尺寸表明他们主要关心的是如何遏制病毒。
日本
它一直处于有效检测区域和保健超负荷区域之间。所以他们的病毒检测可能不如德国和西班牙有效。关键是要看他们在不久的将来走向何方。
钻石公主
它在 2020 年 2 月 26 日处于有效探测区域。我们知道,飞船上的病毒检测确实非常严格。
在 2020 年 3 月 2 日,它仍然在有效探测区域,但是气泡尺寸减小了。这表明局势已经降温。此外,其死亡率稳定在 0.9%,非常符合 0.5~2%的基线。
最后的话
我们可以看到,这个图对于快速评估全球每个国家的相对情况非常有帮助。
此外,通过使用我的 GitHub 项目,制作这样一个信息丰富的情节很容易。像往常一样,Google Colab 上的一个功能齐全的 Python 笔记本包含在回购中,供读者把玩。
承认
我要感谢我的朋友 David Tian,他是一名机器学习工程师,对 Google Colab 的设置提供了慷慨的帮助,并对本文提出了宝贵的建议。看看他有趣的自驾* DeepPiCar *博客。
参考:
- Komo news,3/2/2020: 华盛顿州冠状病毒:6 人死亡,12 人感染
- 按年龄划分的新冠肺炎死亡率:https://www . worldometers . info/coronavirus/coronavirus-age-sex-demographics/
使用 Python 的马赛克艺术。
ASCII 艺术图片使用了 Nicola Fioravanti 在 Unsplash 上的照片
用表情符号和 ASCII 字符重建图像。
在我的上一篇文章中,我探索了一种有趣的表示图像的格式,称为床单视图,以开发傅立叶变换背后的一些直觉。
左边是原图,右边是床单图。图中使用了由 Unsplash 上的 Jakob Kac 拍摄的照片
这让我很好奇去探索图像的替代表现,这是当前的主题。在本文中,探索了两种使用 python 构建马赛克“艺术”的有趣方法。第一种方法使用表情符号(比如🏠,🔥,😎…)第二个使用 ASCII 字符。
马赛克传统上是用规则或不规则的小石块或瓷砖制成的图案或图像。马赛克风格的绘画被称为点彩,艺术家使用颜料滴来构建整个图像。文森特·凡高、乔治·修拉和保罗·西涅克是这一流派的几位著名艺术家。
(左)梵高的《星夜》。图片由 Eric Perlin 从 Pixabay 获得。(右)来自土耳其的马赛克艺术。Nick Kwan 在 Unsplash 上拍摄的照片
图像是由像素组成的数字马赛克。因此,像素可以用其他单位代替来表示同一幅图像。比如表情符号。更具体地说,表情符号的图像。
原始图片由 Ahmed Nishaath 在 Unsplash ( 最左边)上拍摄。带有 20x20 个表情符号的表情符号马赛克(中间)。有 100x100 个表情符号的表情符号马赛克(最右边)。
这里,我拿了一个 1500 个表情符号的目录。要用表情符号代替一个像素,必须建立一个公平的比较。因此,每个表情符号通过取组成该单独表情符号的所有像素的平均值而被简化为单个 RGB 元组。类似地,评估目录中所有表情符号的平均值。现在,我们希望转换为马赛克形式的图像被加载,每个像素被替换为具有最接近 RGB 值的表情符号(最近邻居)。结果会如上图所示!
自 60 年代以来,使用 ASCII 字符转换图像的类似想法就已经存在,其中使用可打印字符代替表情符号来编写显示图像的文本文件。这里是一个致力于 ASCII 艺术的网站
它曾经非常流行,因为文本处理起来要快得多。但是,技术已经赶上来了,ASCII 艺术今天对编程爱好者来说仍然只是一个遗迹。在 python 中,可以开发简洁的代码来产生以下结果。
原始图像(右),ASCII 图像(中),图像特写(左)
这里,图像在调整大小后首先被转换成灰度级。ASCII 字符串是按照每个字符大小的递增顺序构造的。它以实心字符如“#”开始,以较小的字符如“.”结束。图像可以用数量少得惊人的字符连贯地再现。每个像素的灰度级被转换成 256(上限)的比例。基于这个比率,每个像素被替换为我们的原始 ASCII 字符串中的一个字符。
我的 GitHub 上也有所有的程序。
有趣的是,超过 1500 个表情符号被用来对原始图像进行连贯的复制。然而,第二种方法使用不超过 24 个 ASCII 字符来提供有效的可视化。这并不完全是一个公平的比较,因为与颜色相关的信息在后来丢失了。
将视频转换成 ASCII 格式也很流行,这提供了一种有趣的视觉效果,就像 90 年代后期在矩阵电影中使用的那样。
像往常一样,联系我,继续讨论其他有趣的图像格式,或者向我提供一些关于内容的反馈。
大多数企业没有以正确的方式使用数据[研究]
没有使用数据的策略,数据就没有价值。GetApp 的研究分享了大多数企业都会犯的数据错误,以及应该怎么做。
资料来源:Teresa Meinen 为 GetApp 撰写
《哈佛商业评论》称数据科学为“21 世纪最性感的工作”LinkedIn 的联合创始人告诉 Knowledge@Wharton,数据科学的工作岗位在过去三年里增长了 15 到 20 倍。由于对数据科学家的需求超过了供应,许多公司将支付六位数的薪酬来吸引顶级人才。
但是闪光的并不都是金子:超过一半的数据科学家说他们计划在 2020 年寻找新的角色。
当被问及不满背后的原因时,44%的人认为是官僚主义,29%的人认为是缺乏领导的支持。这两个答案都超过了对缺乏正确的数据科学工具的抱怨,这赢得了 28%的投票。
这些结果令人难过,但并不令人惊讶。尽管对数据科学家有需求,但大多数企业仍然没有为帮助他们取得成功打下基础。
当今的企业如何使用大数据
去年,GetApp 调查了员工人数不超过 500 人的北美企业的近 500 名员工。我们想了解他们如何利用数据做出商业决策,以及他们在这样做时有多大的信心。我们还想了解拥有专门处理数据的工具和同事是否会增加业务决策的信心。
或许不出所料,结果因行业而异。从事会计工作的受访者最有可能使用 Excel 来收集和分析数据。但是他们也最难从数据中识别观点。这是有道理的,因为会计师也报告说没有足够的数据来发现这种见解;相反,许多人表示,他们要么数据太多,要么数据太少,无法做出有影响力的选择。
与此同时,在医疗保健行业工作的受访者对可用数据的利用率最高。但在接受调查的五个行业中,医疗保健行业在做出基于数据的决策时信心水平最低。他们提到需要某些类型的数据(如客户满意度得分)来改善结果。
其他结果更普遍。在调查的五个行业中,我们发现:
- 人们对其数据决策的自信程度与他们认为数据对其业务的重要性之间存在正相关关系。
- 雇用数据科学家让企业领导者更加自信,他们拥有正确的数据和洞察力来做出业务决策。
- 有全职员工分析数据的公司也更经常使用商业智能(BI)软件。
- 使用 BI 软件的公司认为他们做出的基于数据的决策更有影响力。
从这里去哪里
当我回顾这些结果时,有两件事让我印象深刻。首先,投资于收集和分析业务数据的工具和员工可以改善结果。对数据感觉最舒服的企业也是那些创造专门拥有数据的角色的企业。他们还投资软件和其他数据科学工具供员工使用。
也就是说,对企业来说,分散数据同样重要。这包括给予每个团队领导在他们的领域内使用数据的自主权。无论你管理的是销售团队还是医院,所有业务线的领导者都应该能够利用数据提升团队的业绩。
这就是成为公民数据科学家的意义所在:使用拖放模型等 BI 软件功能来解释数据与您的团队和更大企业的相关性。
与通常从别处高价招聘的数据科学家不同,公民数据科学家已经是你企业的一部分。因此,他们将对您的技术体系、战略和客户痛点的深入了解带到他们创建的每个数据可视化中。
公民数据科学家不仅仅是好的,他们也不打算取代训练有素的数据科学家。他们为您的业务带来独特的价值,并且作为数据科学家同样重要。
这一点值得重复,因为一名员工拥有所有基于数据的决策已经不够了,或者您的企业不再需要投资工具、培训和员工来将您的数据使用提升到一个新的水平。
如果你想在业务中做出更好的决策,你需要应用分析和某种形式的商业智能。如果这是你对 2020 年的承诺,你可以采取以下几个步骤:
1。写一份使命陈述
用一两个书面句子阐明数据如何促进您的业务发展。你越具体越好。光说“我们公司会给所有团队提供他们需要的工具和培训来做出基于数据的决策”是不够的。
相反,可以尝试这样的方法:
“我们的首席技术官将使所有团队领导能够访问[首选 BI/分析软件]中的数据。这将使每个人都能实现我们的共同业务目标,即在 2020 年将客户满意度得分提高 10%。”
不要给自己压力,让这份使命宣言保持不变。随着角色和业务需求的发展,您可以审查和更新它。
关键是让 it 始终专注于期望的业务成果。将数据分析连接回大图,将训练每个人更周到地使用它。
2。为您的数据战略制定路线图
要成功使用数据,您需要将正确类型和数量的数据与您可以用其解决的业务问题联系起来。因此,您应该将您的策略基于支持特定业务目标的数据管理和分析实践。
一旦你写好了你的数据使命陈述,开始构建一个路线图来跟踪你实现它的进程。这个路线图将展示你为实现你的使命宣言所要采取的行动,以及你执行这项工作的计划。它还可以让您将新的数据使用请求与您当前的计划进行比较。
您的数据路线图的主要目标是在业务范围内就以下方面达成共识:
- 如何使用数据。
- 确认您将使用数据实现哪些业务目标,以及实现每个目标所需的数据类型和工具。
- 为您的整个企业提供一个框架,以了解数据现在和未来的使用情况。
像你的使命陈述一样,这个路线图不是静态的:它将随着你的业务需求和数据使用而发展。关键是用它作为北极星,了解你的企业如何根据数据做出决策。如果你和你的同事知道数据的价值,你可以用它来找到更有效的见解。
3。建立数据指导委员会
通过建立数据使用指导委员会,团结组织中的所有领导者。整体业务、技术战略和特定业务线(销售、营销等)的领导者。)都应该在这个委员会有席位。它将设定数据使用的优先级,批准新 BI 工具和计划的资金,解决资源冲突,并寻找在业务中使用数据的新机会。
一个人(比如首席技术官,或者最好是首席数字/数据官)应该担任委员会主席。在这样做的时候,他们需要考虑该委员会相对于企业规模的规模。
一个更小的委员会将能够更快、更频繁地安排会议,同时更快地解决问题。但是,如果你将关键业务部门的领导排除在外,你将面临失去整个组织认同的风险。
为了缓解这种情况,承诺每个业务线都有一名领导在委员会中任职。这包括监督公司系统架构的人,以及负责为分析环境提供源系统的人。
计划每季度至少会面一次。你的目标不是为每个领导创造更多的工作,包括你自己。相反,你要向每个委员会成员展示数据对他们的工作有多么宝贵,以及这个委员会将如何改善他们的所有成果。
如今创建的数据量,再加上BI 和分析软件的增长,意味着旧的分析方法将不再适用。像 Excel 这样的工具,虽然强大而有用,并不是为了处理今天可用的大量数据而构建的。数据与所有业务线的相关性意味着它不再属于一个首席执行官的领域。
问题在于,成为“数据驱动型组织”的道路漫长而曲折。从投资错误的 BI 工具到不知道使用哪些数据点来解决每个问题,使用数据的风险似乎太高了。事实是,你负担不起而不是使用数据——做一些基础工作可以缓解很多痛点。
通过撰写使命陈述、创建路线图和建立跨职能共识,您自己的企业可以避免大多数陷阱,并利用数据保持增长。你甚至可以雇佣一个梦寐以求的数据科学家——防止他们离开。
Lauren Maffeo 在 GetApp 公司领导商业智能研究,该公司为软件购买者提供合适的工具和技术来发展他们的业务。作为一名分析师,Lauren 的兴趣领域包括语音和自然语言工具、数据挖掘技术、预测分析以及为数据科学构建商业案例。她在普林斯顿大学和哥伦比亚大学、Twitter 的旧金山总部和谷歌 DC 开发者大会等机构展示了她对人工智能偏见的研究。她还是计算机协会杰出演讲者项目的成员。
机器学习中最常见的损失函数
现实世界中的 DS
每个机器学习工程师都应该了解机器学习中这些常见的损失函数,以及何时使用它们。
在数学优化和决策理论中,损失函数或成本函数是将事件或一个或多个变量的值映射到实数上的函数,该实数直观地表示与该事件相关的一些“成本”。
——维基百科
作为一个核心元素,损失函数是一种评估机器学习算法的方法,它可以很好地模拟您的特征数据集。它被定义为衡量你的模型在预测预期结果方面有多好。
成本函数 和 损失函数 指同一上下文。成本函数是作为所有损失函数值的平均值计算的函数。然而,损失函数是针对每个样本输出与其实际值的比较来计算的。
损失函数与你已经建立的模型的预测直接相关。因此,如果您的损失函数值较小,您的模型将提供良好的结果。损失函数,或者更确切地说,用于评估模型性能的成本函数,需要最小化以提高其性能。
现在让我们深入研究损失函数。
广泛地说,损失函数可以根据我们在现实世界中遇到的问题类型分为两大类—分类和回归**。在分类中,任务是预测问题所处理的所有类别各自的概率。相反,在回归中,任务是预测关于学习算法的一组给定独立特征的连续值。**
**Assumptions:**
n/m — Number of training samples.
i — ith training sample in a dataset.
y(i) — Actual value for the ith training sample.
y_hat(i) — Predicted value for the ith training sample.
分类损失
1.二元交叉熵损失/对数损失
这是分类问题中最常用的损失函数。交叉熵损失随着预测概率收敛到实际标签而减少。它测量分类模型的性能,该模型的预测输出是介于 0 和 1 之间的概率值。
当类别数为 2 时,二元分类
当类别数大于 2 时,多类别分类
****
交叉熵损失公式是从正则似然函数中推导出来的,但是加入了对数。
2.铰链损耗
用于分类问题的第二常见损失函数和交叉熵损失函数的替代函数是铰链损失,主要用于支持向量机(SVM)模型评估。
****
铰链损失不仅惩罚错误的预测,也惩罚不自信的正确预测。它主要用于类别标签为-1 和 1 的 SVM 分类器。确保将恶性分类标签从 0 更改为-1。
照片由 Jen Theodore 在 Unsplash 上拍摄
回归损失
1.均方误差/二次损耗/ L2 损耗
MSE 损失函数被定义为实际值和预测值之间的平方差的平均值。它是最常用的回归损失函数。
****
对应的代价函数是这些平方误差的均值**。MSE 损失函数通过平方它们来惩罚产生大误差的模型,并且该属性使得 MSE 成本函数对异常值不太稳健。因此, 如果数据容易出现很多离群值,就不应该使用。**
2.平均绝对误差/ L1 损耗
MSE 损失函数被定义为实际值和预测值之间的绝对差值的平均值。这是第二个最常用的回归损失函数。它测量一组预测中误差的平均大小,不考虑它们的方向。
****
对应的代价函数是这些绝对误差(MAE)** 的均值。与 MSE 损失函数相比,MAE 损失函数对异常值更稳健。因此, 在数据容易出现很多离群值的情况下应该使用。**
3.Huber 损失/平滑平均绝对误差
Huber 损失函数被定义为当𝛿 ~ 0 时 MSE 和当𝛿 ~ ∞(大数)时 MAE 接近时 MSE 和 MAE 损失函数的组合。它是平均绝对误差,当误差很小时,它变成二次误差。使误差为二次型取决于误差有多小,这是由一个可以调节的超参数𝛿(δ)控制的。****
****
增量值的选择至关重要,因为它决定了您愿意将什么视为异常值。因此,取决于超参数值,与 MSE 损失函数相比,Huber 损失函数对异常值不太敏感。因此, 如果数据容易出现异常值,可以使用它,并且我们可能需要训练超参数 delta,这是一个迭代过程。
4.对数损失
对数余弦损失函数被定义为预测误差的双曲余弦的对数。这是回归任务中使用的另一个函数,比 MSE 损失平滑得多。它具有 Huber 损失的所有优点,并且它在任何地方都是两次可微的,不像 Huber 损失,因为像 XGBoost 这样的一些学习算法使用牛顿法来寻找最优值,因此需要二阶导数( Hessian )。
****
*log(cosh(x))*
约等于*(x ** 2) / 2*
为小*x*
,以*abs(x) - log(2)*
为大*x*
。这意味着“logcosh”的工作方式很大程度上类似于均方误差,但不会受到偶尔出现的严重错误预测的强烈影响。
— Tensorflow 文档
5。分位数损失
分位数是一个值,低于这个值,一个组中的一部分样本就会下降。机器学习模型通过最小化(或最大化)目标函数来工作。顾名思义,分位数回归损失函数用于预测分位数。对于一组预测,损失将是其平均值。
****
分位数损失函数在我们对预测区间而不仅仅是点预测感兴趣时非常有用。
感谢您的阅读!希望这篇帖子有用。我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以在这里或我的 LinkedIn 账户上给我发短信。
大多数数据科学职位描述应该不再要求博士学位
我刚刚搜索了“数据科学家”在第一页的 20 份工作中,有 6 份没有提到博士学位,3 份说有博士学位会很好,11 份把博士学位作为一项要求。我没有花几个小时去查看求职公告板,也没有让一个系统自动收集所有信息,但我仍然相信这是一种趋势。
为什么这是一种趋势?
数据科学,机器学习,人工智能,它们都是令人兴奋的新领域。我的理论是,招聘这些职位的人认为这些领域极其复杂,只有拥有博士学位的人才可能理解它们。根据我的经验,虽然数据科学是一个技术领域,但它并不一定比软件中的任何其他职位更具技术性(通常更少)。科技领域的其他职位通常由拥有学士学位的人来担任。以下是我认为停止将博士学位作为一项要求最符合大多数企业利益的主要原因。
1.他们是昂贵的候选人
拥有数据科学/人工智能/数学/统计学/计算机科学等博士学位的人是就业市场上最受欢迎的人之一。公司经常抱怨缺乏人才,正如我在第一段中的例子所表明的,无论如何,企业都对相同的候选人感兴趣。在如此高的需求下,你只能通过提供潜在 20 万美元以上的薪水来竞争。
2.你根本找不到候选人
这些人的供应有限。他们中的大多数人甚至对为财富 500 强公司工作不感兴趣,而是更愿意专门为大学或领先的科技公司(苹果、亚马逊、DeepMind、谷歌、IBM、特斯拉等)工作。不过,这些顶级科技公司也在招聘本科生。如果他们抓住了所有顶尖的本科生,想象一下获得博士学位有多难。你应该问问你自己,你是否认为普通的博士真的会花时间在。我倾向于认为他们没有。我希望人们要么联系他们找工作,要么申请上述公司并被接受。即使一个博士确实花了很多时间,我也会问你自己,你的公司对一个博士来说是否突出。这让我想到了第三点。
3.你的公司可能不太适合博士
正如我们所建立的博士学位有很多工作选择,都是高薪。如果你不提供本质上有趣和/或改变世界的工作,他们可能会很快厌倦。如果工作描述中有“根据需要在 Excel 中进行即席分析”这样的事情,那么这将是一项乏味的工作。一名新员工需要一段时间来适应并开始做出重大贡献,因此不得不替换一名因为不喜欢工作而辞职的数据科学家将是糟糕的。你把钱(和时间)浪费在了一个没有足够长时间产生价值的候选人身上。
4.博士可能不是你想要的
这确实是上述原因的反面。博士是做研究的人,大多数公司不做研究。通过研究,我的意思是创造新的模式。但是你可能会说“如果我们不做研究,我们如何保持竞争力?”大多数公司都没有成功实现基本的机器学习。我建议去找一个对将现有技术应用于您的数据感兴趣的人,为您的数据优化这些技术,找到将它们应用于您的业务的新方法,并让它在您的业务中可操作化。在我的文章“我的本科生团队如何赢得研究生和博士生的数据科学竞赛”中强调了进一步的证据
5.这对合格的候选人来说是一个危险信号
如果我看到你的公司要求一个博士来管理你的 Tableau 仪表盘(或其他平凡的东西),我会立即认为你的公司不知道它在数据科学方面做什么。如果你发出的信号是你的公司不知道自己在做什么,那么你不仅得不到博士学位,还会吓跑那些没有博士学位的合格人才。
你应该怎么做?
【http://thestocks.im/ 号
听着,我明白你想要一个合格的人,你很难判断谁符合标准,谁不符合标准。我的最佳建议是让你参考 Daniel tunke lang 2013 年关于如何采访数据科学家的演讲。尽管该视频已有近 7 年的历史,但在招聘数据科学家时,它仍然是一个很好的流程。
如果你仍然想在你的团队中获得博士学位,你需要一个不同的策略,然后在求职公告栏上发布申请。我认为你需要一种方法,既能直接与这些人交流,又能让他们相信你有他们感兴趣的工作。