TowardsDataScience-博客中文翻译-2020-二十六-
TowardsDataScience 博客中文翻译 2020(二十六)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
建立你自己的自我关注感
原文:https://towardsdatascience.com/building-your-own-self-attention-gans-e8c9b9fe8e51?source=collection_archive---------15-----------------------
用 MNIST 和西里巴数据集实现 SAGAN 的 PyTorch
来自 imgflip.com 的迷因
GANs ,又称生成对抗网络,是近年来机器学习领域最热门的话题之一。它由两个不同的神经网络模型组成,一个叫做 生成器 ,一个叫做 鉴别器 。这听起来很难理解,但让我试着这样说:假设我们想在没有任何绘画知识的情况下伪造名画,我们应该怎么办?大多数人会说,看看画,学着怎么做就行了。但这不是一个人的工作,在某种程度上,我相信你会在绘画上越来越好。你需要让你的朋友来到一幅真画和一幅你伪造的画面前,让他猜猜哪一幅是真的。一开始他很容易猜到,但是继续猜下去,你最终会把你的朋友弄糊涂。
在 GANs 里,发生器就像你伪造画作,鉴别器就是专门辨别哪幅画是假的朋友。想想这里的目标,你想让你的朋友很难分辨真假。如果你的朋友对每幅画给出一个从 0 到 1 的真实概率,你会希望他对你给他看的任何一幅画给 0.5 分,不管是真实的还是伪造的。这也将是 GANs 的目标,反映在损失函数中。
我们也经常看到 DCGAN ,它代表深度卷积 GAN 。这是一种专门用于图像生成的 GAN 设计,为发生器和鉴别器使用卷积层。它的工作原理就像 CNN 一样。 A 自关注 GAN 是利用自关注层的 DCGAN。自我关注的想法已经存在多年,在一些研究中也被称为非本地。想想卷积是如何工作的:它们对附近的像素进行卷积,并从局部块中提取特征。它们在每一层“本地”工作。相反,自我关注层从远处的街区学习。2017 年,谷歌发表了一篇论文“关注是你所需要的全部”,带来了更多关于该话题的炒作。对于单个图像输入,它是这样工作的:
1.使用一个核大小为 1 的卷积生成查询、键和值层,形状为 (Channels * N) ,其中 N = Width * Height 。
2.由查询和关键字的矩阵点积生成关注图,形状为 (N * N) 。 N * N 注意力图描述的是每个像素在每隔一个像素上的注意力得分,因此得名“自我关注”。这里的像素是指输入矩阵中的数据点。
3.通过价值与注意力地图的矩阵点积得到注意力权重,形状为 (C * N) 。注意力权重描述了所有像素中每个像素的总注意力分数。然后我们将注意力权重重塑为 (C * W * H) 。
4.将注意力权重添加回输入层本身,权重为γ,学习参数初始化为 0。这意味着自我关注模块最初不做任何事情。
综上所述,自我关注 GAN 只是一个具有自我关注层的 DCGAN。2018 年的论文“自我关注生成对抗网络”指出DCG an 可能无法捕捉多类数据集一致出现的几何或结构模式,例如,画狗时没有单独的脚。毕竟如何打造一个自我关注的甘?让我们把手弄脏吧!
1.正在准备数据集
我们将使用 MNIST 数字数据集。用 PyTorch 下载后,我们再用 DataLoader 加载数据。
2.构建模型
首先,我们将构建自我关注模块,稍后将在生成器和鉴别器中使用。可以查阅之前的自我关注模块结构,以便更好的理解。
发生器和鉴别器的结构如图所示:
模型结构
谱归一化是在生成对抗网络谱归一化中提出的一种新的权重归一化技术,用于更加稳定的训练过程。借用萨根的 spectra . py。
3.创建培训功能
这通常是最令人困惑的部分。与 CNN 或其他简单的机器学习模型不同,GANs 没有现成的拟合函数。我们需要编写整个训练函数。
我们首先初始化我们的模型和优化器。然后在一个循环中,我们首先从数据加载器读入一批数据。
下一步,我们向我们的鉴别器提供一批真实图像,并计算。然后我们用一组随机数作为潜在变量,用生成器生成一批伪图像,再次送入鉴别器,得到损失。
如前所述,我们的鉴别器的目标是对真实图像给出接近 1 的预测,对虚假图像给出接近 0 的预测。因此,我们希望减少(1-对真实图像的预测)和对虚假图像的预测的总和。借助 PyTorch ,我们可以使用 backward 和 step 实现这一点,并在几行代码内更新鉴别器的所有学习参数。
然后,我们使用来自鉴别器的假图像的输出来更新发生器的参数。瞧,一个训练循环完成了,我们为第一批图像训练了我们的模型。打印出日志信息,并保存图像/模型,如果你想要的。
4.模型性能
训练功能完成后,只需运行该功能即可开始训练。每 100 批从生成器中抽取样本,可以看到我们的模型学习画数字的过程。左边是没有注意的结果,右边是注意的结果。
关于 MNIST 的培训过程
通过对模型结构进行一些细微的更改,我们可以让我们的模型在其他大小的输入上运行。使用与 SAGAN 相同的结构,我们也可以在 CelebA 数据集上运行。具体的模型结构和训练功能可以在我的 GitHub 中找到。
CelebA 上的培训流程
5.你应该使用自我关注甘吗?
正如你可能从上面的 gif 中观察到的,在有和没有自我关注层的模型之间没有明显的视觉差异。此外,自我关注层通过计算多个矩阵点积来工作,这将导致 10% ~ 30%的训练时间延长,具体取决于你的具体模型结构。
然而,在 SAGAN 论文(韩等人 2018)中,作者确实报告了使用自我注意模块获得更好的初始和 FID 分数。我的下一步将是采用这些指标中的任何一个,看看自我关注的甘是否带来了更好的表现。在我的 GitHub 查看所有源代码和演示。
您需要了解的 Jupyter 实验室内置快捷方式和工作流程提示
原文:https://towardsdatascience.com/built-in-shortcuts-and-workflow-tips-for-jupyter-lab-you-need-to-know-c86e09a8f339?source=collection_archive---------37-----------------------
在我开始从事数据科学之前,我一直在与音频打交道:编辑播客,混合中学乐队成员的 50 首曲目,改编《怪物史莱克》中的“童话”主题,等等。作为一名音频编辑,你 100%绝对需要快捷方式,否则你会在做一个大项目时瘫坐在椅子上。只是没有足够的时间点击所有的东西。因此,当我学习像 Jupyter Lab 这样的新技术时,我做的第一件事就是找到我能找到的每一条捷径,这样我就不会因为点击而提前死去。
图为:我试图不用快捷方式清理一个 Jupyter 笔记本。(图片由 安妮·尼加德 上)
让我们挖掘捷径,好吗?注意,我将提到 Windows 键 Control 和 Alt ,它们分别等同于 Mac 上的 Command 和 Option 。
1.鼠标修饰符:Ctrl(命令)和 Alt(选项)
鼠标修改器是改变鼠标操作的按键。我用过的大多数软件在你control + click
或者alt + click
的时候做一些的事情,是否有用就是另一回事了。
在 Jupyter Lab 中,您可以使用 Control 和 Alt 做一些令人惊讶的事情:
- 按住 control 键并点击可以让你在一个单元格内的多个地方进行编辑。双击也会突出显示一个单词。将这两者结合起来,您可以快速地移除不需要的方法。
按住 Ctrl 键,双击“值”并删除。
- 按住 alt 并拖动可以让你编辑垂直线条。我用它给单元格中的变量添加前缀/后缀。(注意:你也可以按 Ctrl + F 来替换,但是在“全部替换”功能背叛了我之后,我对它产生了信任问题。)
按住 alt 键,垂直向下拖动,给变量名添加前缀
按住 alt,拖动一个框,一次替换多个变量前缀
- 回答你的下一个问题,是的!您可以按住 Alt + Ctrl 突出显示并编辑单元格内的多个位置。但是我只在感觉混乱的时候用这个。
2.细胞操作
单元格可以很好地用数据讲故事,但当你需要更好地组织其中的代码时,它就很烦人了。这里有一些操作,你可以对细胞本身进行清理你的笔记本在一瞬间!
这些操作中的每一个都必须在单元格被选中时执行,所以你不应该编辑单元格。您可以通过单击通常会看到输入/输出数字的单元格左侧区域来选择单元格。
- 复制:按
c
即可 - 粘贴:按下
v
即可 - 切:按
x
即可 - 删除:按
dd
- 移动:点击并拖动单元格
现在看我快速地做这个——哇!我好快啊!哇!印象深刻!哇!我根本没必要练习这个!(…)
合并和拆分单元格
这将帮助我们解决以下问题:
- 您在一个单元格中写了太多内容,希望将其拆分为多个单元格
- 你需要与某人共享代码,但是它跨越了 8 个不同的单元,对你和接收者来说,复制它将是乏味的
- 拆分单元格:将光标放在后的行的开头,然后按
Ctrl + Shift + -
进行拆分**
用 Ctrl + Shift + -拆分单元格
- 合并单元格:按住
Shift
,选择要合并的单元格范围,选择所有要合并的单元格(先点击单元格 1,再点击单元格 8,选择单元格 1-8),然后按Shift + M
,将所有单元格合并为一个单元格
用 Shift + M 合并单元格
- 撤销最后一个单元格操作:这是写给那些认为自己因为意外删除了一个复杂函数单元格而毁了整个晚上的数据科学家的。按
z
取消最后一次细胞操作,并降低您的心率。按下Shift + z
也可以重做最后一次单元操作!
3.使用 Ctrl 导航和编辑文本
这是跨越许多程序、文本编辑器和浏览器的东西。我建议每个人都使用它,因为它可以节省你浏览文本行的时间。
- 通过文字导航:按住
ctrl
并按向左或向右箭头 - 删除一整字:按住
ctrl
,根据你要删除的方向,按delete
或backspace
。如果您想删除从单词中间到单词结尾/开头的内容,也可以这样做。将光标放在中间,使用适当的**delete*
或*backspace*
键* - 高亮显示一个单词:按住
ctrl + shift
并按向左或向右箭头高亮显示一个单词。这在 Jupyter Lab 中不是非常有用,但是在文本编辑器中很有用,在那里你可以使用快捷键来加粗、突出显示或给文本加下划线。
除了最初的点击,在制作上面的 gif 时没有使用鼠标。
如果你有一个可编程游戏键盘/鼠标,通过 word 导航的概念是一个完美的工具——我使用ctrl + arrows
的想法来分配快速宏,通过结合上述一些技术,将通过按下按钮自动加粗 markdown 数据字典中每行的第一个单词。
是的,你现在需要一个游戏键盘。我不是罗技赞助的,但我应该是。
最后…平行笔记本标签
当我第一次开始使用 Jupyter Lab 时,最令人沮丧的事情之一是在 markdown 中创建自述文件。我不得不使用第三方平台来查看我的降价编辑。不要害怕!因为我有一个工作流程改进!
- 双击用编辑器打开 README.md 文件。
- 右键点击并转到打开>降价预览
- 单击屏幕顶部的预览选项卡,并将其拖动到屏幕的右侧,将两者并排放置,并查看您的减价的实时更新。
请原谅全屏 gif…
这个的其他用途:
- 调出上下文帮助菜单(在“帮助”下),这样你就可以查看一个函数的文档字符串,而不需要按
Shift + Tab
- 调出一个包含您的自定义函数的
funcs.py
脚本,这样您就可以记住它们是如何工作的,而无需来回翻动。
就这些了,伙计们!
如果您对 Jupyter Lab 有任何其他不满,请留下评论,我会看看我是否能想到用内置功能解决它的方法!也感谢我的同事们在我用“撤销最后一个单元格操作”功能拯救了某人的夜晚后,鼓励我写这篇博文。
Python 快速⚡️中的批量下载
原文:https://towardsdatascience.com/bulk-downloads-in-python-fast-️-df070451786?source=collection_archive---------37-----------------------
利用 AWS Lambda 和亚马逊 SQS 批量下载外部文件
加布里埃尔·托瓦尔在 Unsplash 上的照片
这篇文章概述了我如何使用 AWS Lambda 和亚马逊 SQS 以比我本地机器快 350 倍的速度将 194,204 个文件(即 CSV 格式)下载到亚马逊 S3!
问题是
最近,我构建了一个 web 应用程序来下载加拿大的历史天气数据。作为应用程序结构的一部分,我需要从第三方服务器下载 8,324 个独立气象站的数据,并将数据存储在数据库中(亚马逊 S3)。
[## 构建动态天气下载应用程序
使用 Python、Dash 和 AWS 简化加拿大历史天气数据
towardsdatascience.com](/building-a-dynamic-weather-download-app-1ce64a6c3e61)
看起来很简单,对吧?只需创建一些代码,执行,瞧,你有数据。错了。
每个气象站都有多年的天气数据,第三方服务器将下载限制在 1 年的增量。简而言之,下载所有 8324 个站点的数据集意味着下载 194204 个单独的文件(即一个站点每年的数据一个文件),合并匹配站点的数据,并将数据推送到亚马逊 S3。
下载数据的问题不是文件大小,整个数据集只有 4.4 GB,而是下载速度和网络延迟。在我的本地机器上,下载一年的数据并将其推送到亚马逊 S3 大约需要 1.7 秒。这意味着使用我的本地机器下载所有 194,204 个文件并推送到亚马逊 S3 将花费 3.9 天,假设没有网络中断或下载失败。😲
我们可以做得更好!
解决方案
很明显,在本地机器上下载数据是不切实际的,也是不可靠的,尤其是在云计算如此容易实现的情况下。最终,我决定使用 AWS Lambda 来执行我的 Python 代码,使用亚马逊 SQS 消息队列来触发 Lambda 事件和传达下载任务。
概观
这篇文章并不打算深入概述 AWS Lambda 和 SQS,因为已经有了很好的资源,但是我将提供 Lambda 和 SQS 的基本概述以及我使用的框架。
AWS Lambda 是一种运行代码以响应事件的方式,无需提供或管理服务器。亚马逊 SQS 是一种在不同软件组件之间发送、存储和接收消息的方式(即两个 AWS Lambda 函数之间的消息)。
在我的例子中,我使用一个 Lambda 函数为 8,324 个气象站中的每一个生成包含气象站名称和 ID 等信息的消息。每条消息都被发送并存储在 SQS 消息队列中。同时,另一个 Lambda 函数被设计为响应 SQS 事件(即消息到达队列)而执行。这个 Lambda 函数从 SQS 队列中检索消息,使用消息信息下载数据,并将数据推送到亚马逊 S3 进行存储。
AWS Lambda 和亚马逊 SQS 框架概述
为什么拉姆达和 SQS 很棒
以下是 Lambda 和 SQS 令人惊叹的几个原因,以及它们如何加快执行时间。
- Lambda 函数一次可以从 SQS 消息队列中检索多达 10 条消息。
- Lambda 函数可以并发执行。例如,使用“for loop”、执行一个任务 10X,其中每个循环需要 1 秒,而完成这个任务需要 10 秒。使用并发性,您可以“克隆”Lambda 函数并同时执行 10 个相同的函数,只需 1 秒钟即可完成!
- Lambda 函数可以分配特定数量的内存(即 CPU)。这加快了执行时间。
注意:当增加 AWS Lambda 函数的并发性和内存时,你应该小心,因为这会很快导致成本增加。
为什么要做这一切
你可能会问“为什么要通过 SQS 将相同的信息从一个 Lambda 函数发送到另一个函数,而不是对所有事情都使用一个 Lambda 函数?”。
问得好。
AWS Lambda 函数的最大执行时间限制为 15 分钟。如果我尝试执行 30 个任务,每个任务花费 1 分钟,我将超过最大执行时间。相反,我需要将 30 个任务分成块,执行时间少于 15 分钟。通过使用 SQS,我可以触发 Lambda 并定义我希望 Lambda 从队列中卸载多少任务(最多 10 个),以确保总任务时间低于执行时间。
代码
第一步:
使用 AWS Lamda 将消息发送到 SQS 消息队列。在我的例子中,我为每个气象站发送了一条消息,其中包含气象站 ID 和数据的开始和结束年份等信息。
AWS Lambda 函数将消息发送到 SQS 消息队列
第二步:
创建一个 AWS Lambda 函数,当消息在 SQS 消息队列中可用时触发(即执行)。在我的例子中,Lambda 函数卸载 SQS 消息,使用消息信息下载气象站数据,并将数据推送到亚马逊 S3 进行存储。
我将 Lambda 函数配置为一次从 SQS 消息队列中读取 10 条消息。这使得总执行时间低于 15 分钟的限制。我还为 Lambda 函数配置了高达 1000 的并发性(即,如果需要,Lambda 可以同时调用 1000 个执行)和 256 MB 的内存。
AWS Lambda 函数从 SQS 消息队列卸载消息,并下载和存储数据
在控制台中将 SQS 设置为 AWS Lambda 的触发器
结果
在我的本地机器上,将 8,324 个气象站的数据下载并推送至亚马逊 S3 需要 3.9 天。
使用 AWS Lambda 和亚马逊 SQS,我能够在大约 16 分钟内完成任务,比我的本地机器快 350 倍!!!💪
为 SQS 消息队列生成消息需要大约 8 分钟(步骤 1),Lambda 同时下载数据并将其推送到亚马逊 S3 需要另外 8 分钟(步骤 2)。
有 AWS 免费层的总成本为 0.00 美元,没有免费层的总成本约为 4.30 美元。
- 我可以在本地机器上免费完成这项工作,但这意味着要确保 3.9 天的持续网络连接。
- 我可以通过旋转一个 EC-2 实例并运行一个 cronjob 来完成它,但是使用 AWS Lambda 的便利性非常值得这 4.30 美元。
总的来说,我很高兴找到了 AWS Lambda 和亚马逊 SQS 组合,并将再次使用它!
使用 Python Pandas 将属性批量映射到数据帧
原文:https://towardsdatascience.com/bulk-mapping-attributes-to-dataframes-using-python-pandas-fe192dca9e83?source=collection_archive---------22-----------------------
合并而不是循环遍历大型数据帧如何显著提高程序性能
来源:https://www.pexels.com
当涉及到遍历 Pandas 数据帧中的大量行时,我们中的许多人都不耐烦地等待我们的程序结束循环,有时一行一行地等待很长时间。这是我在将高容量事务性数据作为 Pandas dataframe 加载,然后在单独的字典(从 JSON 文件加载)中根据客户机 ID 匹配丰富记录时遇到的主要困难之一。
两种数据来源:
- 熊猫数据框包含几千行交易数据(待丰富)
- 包含客户端数据的字典(将用于丰富 Pandas 数据帧)
问题:
用来自字典的客户数据丰富交易 Pandas Dataframe
如您所见,最初的方法(如下所示)是在源数据帧中查找 ID,然后遍历参考字典中的另外几千条记录来查找匹配。对每一行重复进行这种操作——想想看。一秒钟是完成这个查找的平均时间,更不用说根据参考数据值更新数据帧需要几个小时的数据处理时间!
源数据是作为来自不同源系统的独立数据帧收集、清理和加载的,因此我的程序遍历这些数据帧的每一行,根据参考字典中的不同属性进行匹配。首先,知道您希望将这两个数据源映射到哪个属性非常重要。在我的例子中,数据帧有 2-3 个不同的属性(基本上是跨数据集的不同映射属性),这就是为什么一开始不可能将它们全部整合到一个更大的数据帧中——这从一开始就会简单得多。在大多数情况下,您无法控制系统和团队如何收集数据,因此在开始繁重的工作之前,可能会花费大量时间来确保您的格式是一致的。
就这一点而言,如果实现一个战略解决方案,与源团队合作并让他们知道您希望他们如何发送数据是值得的——这将节省您未来的时间,也有助于确保一致性。此外,您不希望遇到这样的情况:最终接收到的源数据包含意外的列、缺失的属性或不同的数据类型。
一旦数据帧被清理并重新标记,允许使用相同的属性和数据类型快速组合它们,我很快意识到循环应该只保留给较小的数据集。映射或合并更适合有几千条记录的数据帧。这个过程非常类似于 SQL 连接,将多个表(在我们的例子中是数据帧)组合成一个统一的表。
可以想象,使用循环查找匹配对性能没有好处。最初,我的程序要花几个小时来运行,因为它要逐行(针对数千条记录)运行,然后在参考数据字典中找到匹配。我知道,如果我生成的报告从长远来看有效率的话,这个程序必须得到充分的改进。这就是战略问题解决发挥作用的地方!
虽然我在程序中使用了循环,但这只是为了识别惟一的客户机 id,然后从更大的引用数据集中创建一个子集字典。这使我避免了在源数据帧的几千条记录和参考字典的几千个其他值中循环。
这种通过迭代开发的新方法将我的程序的执行时间从 12 小时提高到了 15 分钟。
解决方案:
步骤 1: 在源数据帧中识别惟一的 id,并将它们保存到一个列表中
步骤 2: 查找源数据帧和参考字典之间的匹配
步骤 3: 为较大的参考字典中的所有匹配创建一个子字典&将其转换为数据帧
步骤 4: 将子集参考数据帧与源数据帧合并
希望这种合并而不是循环的发现能够帮助您踏上数据科学之旅!
解决数据不平衡的要点方法!
原文:https://towardsdatascience.com/bullet-point-approach-to-data-imbalance-34c701c8e686?source=collection_archive---------60-----------------------
当绝大多数数据属于一个类(多数类)而少数类的样本很少时,就会出现数据不平衡问题或类不平衡问题。
由 Unsplash 上的 Loic Leray 拍摄的照片
如果:,就不会有数据不平衡的问题
- 你并不真正感兴趣的是,正确地划分少数阶级(很少发生!).
- 你有一个巨大的训练数据集,即使你的类样本比例非常不平衡,你仍然有很多样本在你的少数类。
精确不是你的最佳选择
- 假设你有 1000 个样本(其中 990 个属于 A 类,10 个属于 b 类,你的智能算法决定把所有东西都归为 A 类!你的准确率,在这种情况下,是 99%!
好看!除非你试图开发一个人工智能驱动的疾病识别工具,否则你将走向另一个 Theranos 故事。 - 根据假阳性和假阴性的代价(和后果),你可以决定你应该更关注哪个指标。
- 例如,如果假阳性意味着您将损失 10 万美元,而假阴性意味着您将损失 10 美元,那么您知道您的指标应该更侧重于最小化假阳性!
了解更多!
如何处理问题?
有 3 种方法:
- 关注数据:使用各种采样、增强技术等。重点是要有一个更平衡的数据集。
- 关注算法:这些方法大多关注于修改损失函数。
- 混合方法:抽样和算法变化的结合。
提示:根据假阳性和假阴性的代价(和后果),你可以决定你应该更关注哪个指标。
让我们从不同的方法开始
过采样和欠采样
也许处理数据不平衡最常见的方法之一是对少数类进行过采样或对多数类进行欠采样。请确保仅对定型集进行过采样。
- 非常有用的关于 Python 中过采样的博客文章
- R 中的过采样和欠采样
击杀
过采样的一个有趣的概括是通过创建新的样本来合成少数类中的新数据点,而不仅仅是用替换进行过采样。该方法使用最近邻和随机数来生成新的合成(伪)数据点:
- 随机选择一个数据点,称之为“主”。
- 找出五(k)个最近的邻居。
- 随机选择这 5 个相邻点中的一个。
- 在你的“主要”点和随机选择的邻居之间画一条线。
- 在你画的线上创建一个随机点,并对其进行分类。
主要论文(有 5k+次引用)。如果你是视觉学习者,请看这里!
Rose,是另一种使用平滑自举方法的半类似方法。
成本敏感分类
常见的分类算法都试图最小化分类误差(如果你把 A 误分类为 B,就会通过增加代价函数来惩罚算法)。但是对于一个代价敏感的分类器,并不是所有的误分类都是一样的!当算法错误分类少数类(少数类获得更高的权重)时,它们会对算法进行更多的惩罚。
法比奥在 Unsplash 上拍摄的照片
卷积神经网络(CNN)怎么样?
- 上述方法工作良好。但是一些有趣的细微差别出现了,对于“经典的”机器学习技术来说不一定是真的。这是一篇关于的快速阅读实验论文。
焦损失
这种相对较新的方法是我的一个朋友让我注意到的。该方法主要针对一阶段和两阶段目标识别,通过引入聚焦因子对交叉熵损失函数进行了改进。焦点因子给予更“难”的例子更高的权重。读艾的论文。
结论
还有很多,但实际上这些是处理不平衡数据的非常有用的技术。我还想指出,有时将问题重新框定为异常检测问题会更容易!在异常检测中,问题变成了如何定义(和标记)正常行为。在下一篇文章中,我将在几个问题上使用这些技术,看看它们在 python 中的表现。
数据科学中的热点问题
原文:https://towardsdatascience.com/burning-questions-in-data-science-93976a0a9070?source=collection_archive---------48-----------------------
…你应该有自己的看法
艾米丽·莫特在 Unsplash 上的照片
在每一个职业中,社区成员之间都有分歧。大多数时候,争吵的发生要么是因为两种选择都同样可行,要么是很少有证据证明这种或那种选择。有时候,人们不同意只是因为他们有不同的偏好,选择是非常主观的。
对这些分歧有自己的看法是一种巧妙的欺骗,让自己看起来和感觉上像是社区的一部分。无论如何,你迟早会参与到这些讨论中。我只想用这篇文章给你一点小小的推动。
我将列出我多年来在数据科学界听到的一些分歧,并分享我个人对它们的看法。
Python vs R
您可能在开始学习数据科学之前就已经听说过这种讨论。它在互联网上无处不在,每个人都有话要说,有些人对它有非常强烈的意见。
如果你认为如此在意你使用哪种语言是愚蠢的,那么我支持你。但是当你开始工作时,这可能是你的同事问你的第一件事。
我不得不承认,和你的同事讨论所有的利弊很有趣,但这可能弊大于利。我看到许多有抱负的数据科学家在这个问题上困惑到决策瘫痪的地步。他们自然想做出正确的选择,但互联网上的所有讨论都无助于他们。
如果我必须选择一方(我没有,但我仍然会),我会选择 Python。主要是因为我更适应它,我以前已经用过很多了,我可以更快地开始得到结果。这也是我被问到时推荐的语言。我觉得很直观,也很好学。此外,Python 背后有一个伟大的社区,当你陷入困境时,它会为你提供答案和支持。更不用说那些让你的工作变得更容易的神奇的图书馆了。
尽管我遇到过许多强烈偏好 R 的人,他们的理由似乎相似。
但是,让我们往好的方面想。如果两种语言都有铁杆粉丝,这可能意味着两种语言都是非常好的语言!
Matplotlib 与 ggplot2
这最初是 Python 与 R 讨论的延伸。Matplotlib 是使用 Python 时的首选可视化工具,而 ggplot 是人们使用 r 时的首选。人们大多批评 matplotlib 无法创建漂亮的图表。我的一个朋友最近发给我一个关于这个的迷因,我认为它清楚地描述了整个讨论。
来源:关于克里斯蒂亚诺·罗纳尔多雕像的新闻
让我向您展示每个库生成的图的示例。当然,我同意 ggplot2 图看起来更好看,而不需要付出额外的努力。但与此同时,当你只是在分析时,你需要你的情节看起来有多美?大多数时候,只要他们给你看你需要看的,就没问题。
来源: Pythonspot 和 R-Graph-Gallery
我发现 matplotlib 图和 ggplot2 图一样功能强大,适应性强。一些 R 专家可能不同意我的观点。
matplotlib(或者更一般的 Python)的一个秘密武器是额外的 Seaborn 库,它可以制作非常棒的图形/图表。该你了,r。
来源: Seaborn
保养还是不保养?
我在数据科学界听到的另一个争论是,数据科学家是否应该维护他/她开发的模型?对这个问题的主要反应要么是非常强烈的“是的,当然!”或者“不,当然不是!”。
那么什么是模型维护呢?模型维护仅仅是确保模型在被最终用户部署和使用后仍然能够按照预期的方式工作。这可能是:
- 确保模型跟上现实生活的变化
- 确保模型性能仍然是可接受的,并且不会恶化到某个水平以下
- 当输入数据格式改变时进行必要的更新
- 适应数据质量的变化
- 还有很多其他的东西…
正如您所想象的,关注模型并确保一切正常工作是一项繁重的工作。数据科学界的一些人认为,数据科学家应对他们制作的模型负全责,因为他们最了解模型,他们应该是关注模型的人。而另一些人认为数据科学家的工作在他/她交付一个工作模型以及它的解释/文档时就结束了,应该有受过专门训练的专业人员来做模型维护。
对此我的看法基本是:看情况。如果是资源有限的小公司,期望数据科学家负责模型的维护是很正常的。但是如果它是一个更大的公司,让其他人维护模型更有意义,因为对于一个数据科学家来说,这很容易变成太多的工作要处理。
数据科学是一个垂死的职业,而数据科学才刚刚开始繁荣
关于数据科学泡沫是否正在破裂,有很多争论。有人说,没有人想在 5 年内成为数据科学家,有人说,这项技术才刚刚起步,它将成为下一个大事件。
我认为两种观点都有道理。AI,ML,数据科学绝对是炒作出来的。这就是为什么我认为随着时间的推移和炒作的消退,预计需求会减少是合理的。但与此同时,我们仍然可以用它来实现很多目标。我不是说算法会变得更好,更具可扩展性,我们会实现更大的目标。相反,我相信仍然有一些行业刚刚开始在他们的工作中采用 ML 技术。这就是为什么它有成长的空间,并在更广泛的领域中成为更大的一部分。我想你可以称之为横向扩张,而不是纵向扩张。
专业化与一般化
一些数据科学家认为,最好是非常擅长一种技术或学科,如 NLP 或图像处理。而其他人更喜欢成为数据科学通才,并在理解项目需求和实施各种工具方面训练自己。
很多时候,这种争论源于人们声称在数据科学方面,一种方法比另一种方法更好。我认为这是一个非常个人化的决定,没有什么好或坏的选择。
就目前而言,我更愿意做一个多面手,在需要的时候能够快速学习。我相信这会让我更有效率。我也很喜欢尝试新的工具和方法。
但是,如果我需要实现一个 LSTM 网络,我可能至少需要从该领域的专家那里获得信息,甚至很可能与他们一起工作。
总而言之,我认为,在数据科学中,所需的技术可以有很大不同。归根结底,我们既需要通才,也需要专家。
你听说过数据科学的其他热门话题吗?人们在 Reddit 上发了很长的帖子?评论一下,让我知道!
👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程 !
数据科学家的商业 101
原文:https://towardsdatascience.com/business-101-for-data-scientists-1bc49c0a67bc?source=collection_archive---------44-----------------------
马丁·比约克在 Unsplash 上的照片
为数据科学家量身定制的业务要点
为什么要看这篇文章?
数据科学家通常来自 STEM 课程(科学、技术、工程和数学),非常擅长数字和解决框架清晰的问题。然而,当我们开始处理业务问题时,它可能会变得有点混乱:项目目标并不总是清晰的,问题需要主观输入,因为没有数据可用,执行管理层并不总是热衷于 100%依赖数据来做出决策。
为了处理这些情况,让我们的心态适应这个新环境是一个好主意,最重要的是,通过将“数据行话”翻译成“业务行话”,能够和你的同事说同样的语言。记住这一点,让我们回顾一下商业的基础,以及如何用数据处理商业问题,同时还能以每个人都能理解的方式说出自己的想法。
商务必备
照片由尼基塔·卡恰诺夫斯基在 Unsplash 上拍摄
营销
营销的目标是通过找到你的理想目标市场,选择最佳价格并确定针对这些客户的策略,向尽可能多的人、尽可能多的次数和尽可能高的价格销售尽可能多的产品。
这看起来像一个优化问题,对不对?不完全是。在实践中,有太多的问题需要妥善解决:你如何定义一个理想的目标市场?如何测试不同的价格?你如何确定应对客户的策略?你应该使用哪个时间段?
因此,重要的是使用特定领域的知识来提出特定的问题,并使用数据来指导过程并提出答案。例如,要找到你的理想价格,测试需求对不同价格的反应并找到最佳点是不够的:这也是一个品牌问题,以及与竞争对手相比,你希望你的产品或服务如何被感知。如果你在劳力士工作,即使你注意到对他们手表的需求对价格非常敏感(每次你进行促销和给予特别折扣,需求都会大幅增加),过分降低价格也不一定是一个好策略:你会在一段时间内获得丰厚的利润,然后人们就不会认为劳力士是一个如此高端的奢侈品牌,失去了很多价值。
理解定义价格和目标市场不仅仅是在短期内优化它,而是了解客户如何看待你的产品/服务,以及他们将如何应对营销策略的变化。与竞争对手相比,你希望你的产品被如何看待?这实际上不是一个可以用数据来回答的问题:它需要一个主观的答案,然后决定你将如何使用数据来解决其他问题。
定义营销策略时,你应该熟悉的一个关键营销概念是 4 P:产品、地点、价格、促销。
- 产品是关于你的产品的特性以及潜在客户对它们的看法:品牌名称、外观、特点等。
- 地点是关于你的分销渠道:你的客户将在哪里购买你的产品,谁将出售它,等等。
- 价格是围绕产品价格的一切:你的客户有多看重你的产品?你希望你的产品如何被感知(更贵,更便宜…)?您的客户对价格有多敏感?
- 促销将说明你计划如何接触你的顾客:电视、广播、直接邮寄?联系他们的最佳时间是什么时候?市场有季节性吗?
另一个重要的概念是细分:将你的客户分成具有相似特征的不同群体。例如,根据消费金额,您可以将客户分为新和旧或大和小。一个经典的细分方法是 RFM,它使用 3 个维度对客户进行细分:最近(他们最后一次购买是什么时候?),频率(他们多久买一次?)和货币价值(他们的平均购买金额是多少?).这些通常是主观的概念,但是您也可以使用经典的聚类方法,例如 K-Means,来发现新的细分。然而,重要的是要理解,数据驱动的细分方法不一定比更主观的方法更好,最佳方法将取决于您的目标。
最后,你应该理解角色的概念。通过查看数据,您可以确定客户的平均年龄、收入以及主要的性别。然而,这些数字可能过于抽象,在创建产品功能或营销策略时没有用处。这就是为什么营销人员经常提到角色(角色的复数),这是一种将抽象概念转化为“真实人物”的具体方法。你不用称呼住在乡下、年龄在 50 到 60 岁之间的白人男子,而是创造一个角色:霍华德,55 岁,是住在德克萨斯州海恩斯维尔的退休消防员。当想象我们的市场将如何应对不同的策略时,它帮助我们避开统计抽象。
在试图用数据回答问题之前,这些概念可以帮助你框定你的问题,并将它们视为一个更广泛系统的一部分。
金融
照片由 Fabian Blank 在 Unsplash 上拍摄
财务的核心其实很简单:就是赚的钱比你花的多,理想情况下,能够推迟你的成本并预测你的收入。控制这两种流动的最好方法是记账。会计是一项相当古老的活动,被一些人认为不太性感。不过,在欺诈检测和收入预测等领域,它可以从数据科学中受益匪浅。
收入预测已经存在一段时间了,许多公司仍然使用过时的方法来预测他们明年会赚多少钱。这些信息非常有价值,因为企业用它来决定他们的预算:给每个部门或项目分配多少钱。尽管目前的方法很简单,但它们通常比更复杂的方法效果更好,因此在该领域仍有很大的改进空间。
几个关键概念是利润率、 加价和机会成本。
利润率=(收入-成本)/收入
因此,如果你有 10%的利润率,那么每 100 美元的销售额中,10 美元实际上会变成利润。利润率是你的收入中有多少实际上变成了利润。
加价=(价格-成本)/成本
公司有时使用加价来决定价格:例如,他们采用期望的 30%的加价,并应用于产品成本以得出最终价格。
机会成本是用你本来可以做的事情来衡量做某事的成本。想象一下,你在一家大公司担任经理,正在考虑攻读全日制 MBA 的可能性:这将产生与学费、书籍等相关的直接成本。,但这也会有机会成本,因为你将不得不停止工作一年或更长时间,并且在此期间不会有任何工资(也不会获得专业经验),这也应该在你做决定时加以考虑。企业也是如此:比如,想想持有现金。一家企业的现金越多,它就越能为销售下降或意外成本等困难时期做好准备。然而,当这笔钱作为现金持有时,公司就错过了将其投资于金融产品或企业本身的机会。即使把钱存在银行也有成本,即机会成本,所以公司在决定现金水平时必须考虑这种权衡。
由 Guillaume Bolduc 在 Unsplash 上拍摄的照片
操作
业务运营处理公司向客户交付价值所需的一切,包括优化生产、设备配置、人员配备等。
这里有很多优化,不一定是数据科学,但它肯定可以使用具有数学知识的人。这些部门通常会从流程和系统的角度考虑很多,他们希望确保流程尽可能平稳高效地运行。
这里一个有用的概念是精益方法,它起源于制造业,并以敏捷方法的形式扩展到软件开发。所以,你所知道的关于敏捷软件开发的一切,也可以应用到传统制造业中,不断迭代和改进。
另一种用于流程优化的著名方法是六适马。详细解释这一点超出了本文的范围,但是,一般来说,六适马是一组数据驱动的技术,用于通过减少过程输出的方差来改进过程,从而使过程更加可预测。它在 20 世纪 80 年代和 90 年代非常流行,其根源在于使用基本的统计方法来提高业务流程和运营的质量,因此数据科学家应该有兴趣阅读更多关于它的内容。
最后,从运营角度来看,另一个重要问题是库存水平。大多数企业都有某种库存,而库存通常伴随着一种权衡:你的库存越多,你对意外事件的准备就越充分,比如需求高峰。然而,保持过多的库存有一些成本,如存储成本本身(空间和维护)和机会成本(如上所述),因为用于过多库存的钱可以花在其他地方。
费利克斯·米特迈尔在 Unsplash 上的照片
战略
商业战略是一个高层次、广泛的主题,它包含了许多不同的概念和领域,很难概括。因此,让我们先了解一些关键概念,然后讨论它如何与数据科学相互作用。
商业战略通常被定义为“公司为达到特定目标的高层计划”,这是准确的,但相当模糊。从确定价格策略,到公司将试图征服哪些类型的业务,以及明年将试图进入哪些国家。然而,所有这些决策都应该源于公司的使命和愿景声明及其核心价值观。它的使命陈述是公司自身的存在理由,它陈述了公司为什么存在,它为谁服务,它的目的是什么。例如,看看 IBM 的使命声明:
“在创造、开发和制造行业最先进的信息技术方面处于领先地位,包括计算机系统、软件、网络系统、存储设备和微电子技术。我们遍布全球的 IBM 解决方案和服务专家网络将这些先进技术转化为客户的商业价值。我们通过全球范围内的专业解决方案、服务和咨询业务,将这些先进技术转化为客户价值。”
另一方面,一家公司的愿景声明定义了公司未来的目标,即它期望在未来几年内实现的目标。同样,这是 IBM 的愿景声明:
“成为世界上最成功、最重要的信息技术公司。成功帮助客户应用技术解决他们的问题。成功地向新客户介绍了这项非凡的技术。这很重要,因为我们将继续成为该行业大部分投资的基础资源。”
最后,公司的核心价值观提醒每个人什么对那个公司是重要的,以指导重要的决策。IBM 的价值观如下:
"多样性和包容性,创新,做你自己,关注变化."
所有这三个概念都是在公司进行战略规划时定义的(通常在执行层面),但小企业也可以定义它们,通常首先在他们的商业计划中定义,这是企业家用来帮助他们在有商业想法时不仅定义他们的战略,还为每个商业领域规划布局,包括财务预测,以检查他们的想法是否实际可行。当一个企业家来要求贷款来开始他们的生意时,商业计划有时被银行要求。
然而,有些人认为商业计划是过时的工具,不能代表现实,尤其是对初创公司而言。对于小型科技公司来说,一个更受欢迎的工具(尽管目标不同)是 商业模型画布 ,它本质上是一个公司如何交付价值、向谁交付价值以及如何在财务上可行的图形表示。
为了做出战略决策,高管们可能需要大量数据,但通常情况下,这些数据并不复杂:他们很大程度上依赖于商业智能和简单的关键绩效指标(KPI),这些指标显示了业务的进展情况、有前景的市场、高绩效部门等。比起执行复杂的统计转换,选择正确的数字以及如何解释它们更重要(尽管这有时可能会导致错误)。
你现在如何应用你刚刚学到的东西?
这里介绍的概念可以帮助你更好地与公司的不同部门沟通,理解他们在说什么,也可以用他们能理解的术语更好地表达你的想法。通过更好地了解整个行业,他们还可以帮助你提出更好的想法。
最后,我希望它能激励你对商业或某些特定的主题做更多的研究。没有多少数据科学家从整体上理解业务,所以理解基础知识可以真正帮助你为公司创造价值。
更进一步
为了帮助你继续研究,这里列出了几本书,可以帮助你更详细地了解这里讨论的一些主题:
- 埃里克·里斯的《精益创业》
- 商业模式生成作者:Alexander Osterwalder 和 Yves Pigneur
- 乔希·考夫曼的个人 MBA 课程
- 迈克尔·波特的竞争战略
- 杰瑞米·大卫·丘鲁苏的《数据驱动:21 世纪管理咨询导论》
- 《商业预测交易:揭露神话,消除不良行为,提供切实可行的解决方案》迈克尔·吉利兰著
- 创业者的财商:你真正需要知道的数字
脑-机接口的商业应用&脑数据的重要性
原文:https://towardsdatascience.com/business-applications-of-brain-computer-interfaces-importance-of-brain-data-615c230bb930?source=collection_archive---------18-----------------------
非侵入性商用脑机接口和脑数据的挑战
Bret Kavanaugh 在 Unsplash 上拍摄的照片
人们经常想知道使用脑机接口能实现什么(BCI)。通过这篇文章,我觉得我可以帮助人们从商业角度更多地了解这项技术,这要归功于我的经验。事实上,在过去的六个月里,我一直在为运动员设计一款非侵入式商业 BCI。
在本文中,我将介绍主要的非侵入性和非医疗商业 BCI 应用,介绍大脑数据在新商业模式中的战略作用,提到该领域的领先公司,并分享我构建 BCI 原型的经验。
有创与无创脑机接口
在开始之前,我必须解释一些关于 BCI 的关键因素。
脑机接口被设计用来读取你的大脑电信号(思想、感觉等等)——有时通过脑电图(存在不同的方法)。
脑电图(EEG): 使用附着在头皮上的小电极检测你大脑中的电活动的监测方法。这项活动在脑电图记录中显示为波浪线。( 1
来源
非侵入性和侵入性 BCIs 的主要区别。
侵入性 BCI“需要通过手术在头皮下植入电极来传递大脑信号”( 2 )。使用侵入式脑机接口,我们通常会得到更准确的结果。
然而,你可能会因手术而遭受副作用。不幸的是,手术后,可能会形成疤痕组织,使大脑信号变弱。而且,身体“可以排斥植入的电极”(3)。
最著名的入侵 BCI 可能是来自 Neuralink 的那个。
部分侵入性 BCI 装置也存在。通常,它们被植入颅骨内,但留在大脑外。从技术角度来看,“它们比非侵入性脑机接口产生更准确的结果,并且比侵入性脑机接口风险更低”( 4 )。
迄今为止,公众可用的大多数 BCI 应用程序都是非侵入性的。
为什么要开发商业脑机接口
首先,你要知道 BCI 并不是什么新鲜事物。事实上,科学家们从 20 世纪 70 年代到现在一直在为医学目的研究脑机接口。由于医疗领域的进步,这项技术“最近”进入了消费领域。
其他技术(人工智能、虚拟现实……)的发展也使公司对商业非侵入性脑机接口的研究具有战略意义(超越了显而易见的医疗领域)。因此,越来越多的初创公司和大型科技公司正试图开发非侵入性脑机接口。
BCIs 被视为战略性的原因各不相同。首先,它们代表了潜在的“下一个硬件接口” ( 5 )。
硬件接口
我们控制设备的方式即将迎来一场重大变革。在未来几年,用我们的大脑控制设备将成为常态。你可以想象,对于大型科技公司来说,开始准备他们的产品生态系统以适应未来的现实是很关键的。
与人工智能的协同
另一个战略要素是将人工智能和 BCI 结合起来,并借助它们创造独特的体验。人工智能已经在一些商业脑机接口中使用。机器学习(ML)可以用于实时分析和分类脑电波。这在“试图测量用户意图”( 6 )时非常有用。
ML 还有助于“将具有高度可变性和非平稳噪声的脑电活动解码成有意义的信号”( 7 )。在构建 BCI 应用程序时,ML 已经被证明是有用的。
此外,“EEG 数据集是高维的,具有大量参数的深度学习模型在直接学习生鸡蛋信号的背景下是有趣的”( 8 )。
结合人工智能和 BCI 可以创造新的机会,让用户体验全新的东西(竞争优势)。例如,BCIs 可以用来利用观众的大脑活动和生成敌对网络来创建新内容。
战略市场
对于开发 BCI 解决方案的公司来说,一些市场可以迅速盈利。例如,营销/广告领域可以产生大量收入。甚至尽管目前还没有为营销目的而设计的设备(如果我错了,请写信给我)或应用程序,但研究表明,BCIs 将与它们一起使用。
事实上,一些研究已经指出,BCIs 可以用来评估商业广告产生的注意力水平。可以肯定的是,许多公司都有兴趣为营销专业人士开发一种测量这一关键 KPI 的解决方案。
增强人类
脑机接口也具有战略意义,因为我们可以收集与人体相关的数据。这种收集战略数据的能力非常重要,因为我们已经进入了“人类扩增”的时代。
增强人类: 指提高人类生产力或能力,或以某种方式增加人体的技术。(9)
BCIs 将完善或取代智能手表等现有智能设备,并最终帮助我们实现更多目标。在接下来的几年里,我希望看到越来越多的初创公司参与构建能够分析用户情绪、帮助改善和集中注意力等的 BCI。
我们的项目:我目前正在从事一个项目,通过对大脑数据的分析,帮助运动员提高他们的身体表现。我们使用计算机视觉将这些数据与传感器和过去的表现结合起来。目标是更好地理解运动员对某些情况的反应,并帮助他们更好地管理他们的压力。经过几次测试后,我们已经开始研究一种非侵入式 BCI,它将帮助个人更好地了解他们的运动表现。
走向侵袭性脑机接口
我还认为,公司也有兴趣开发非侵入式 BCI 解决方案,将他们的品牌与这种技术联系起来,并迅速与客户建立信任。一旦入侵性 BCIs 成为主流,这种信任将成为战略。
大脑数据
也许公司投资 BCIs 的最大原因是大脑数据。如你所知,用 BCIs 监测大脑活动会产生大量信息。
的确,你的大脑会产生一种独特的脑电波模式,给你自己的个人神经指纹。你对一些视觉元素的反应方式,你的睡眠和注意力数据等。所有这些都可以被捕获并出售给其他公司。
谁拥有大脑数据,它的用途是什么?
拥有最多大脑数据的公司可能会比其他公司拥有显著的竞争优势。想象一下数据网络效应的影响,但应用于 BCI 和大脑数据…
此外,获得某人的大脑数据可以加强锁定效应。例如,你的大脑数据可以被记录并用于个人识别系统。这个简单的“功能”可以加强您与 BCI 制造商的关系。
谁拥有大脑数据,它的用途是什么?
为商业目的构建 BCIs 的挑战
您可能知道,商业非侵入性 BCI 市场仍处于起步阶段。出于这个原因,公司仍在努力寻找最佳的方法和方法论。
在我看来,我们还需要 2 到 3 年才能看到 BCIs 变得更加主流。根据一些行业专家的说法,主要的挑战是“找到仍能从 BCIs 早期迭代中受益的中间市场”( 10 )。
创建易于使用、可访问、直观、安全且具有良好准确性的脑机接口仍然是一个重大挑战。
设备
这种设备本身就是一个重大挑战(昂贵、难以操作、可能很重、不够谨慎等等)。一些公司正在探索开发与监控脑电活动的耳塞耳机整合的传感器的想法。此外,每个人都有大量的校准工作要做...我们距离像智能手机一样直观的设备还很远。
展示有用性
在一些使用案例中,很难说服客户购买 BCI。人们真的会关心用戴着特定设备的大脑来控制设备吗?答案不是那么明显。
例如,在灯光控制的情况下,你也可以只使用遥控器。我希望看到越来越多的初创公司转向寻找最佳用例。由于需要大量的技术开发和资金,这种必要性对 BCI 的初创企业来说是一个重大风险。
也很难为 BCI 解决方案找到合适的价格。对 BCI 公司来说,在生产成本和零售价格之间找到合适的平衡点并非易事。
绕轴旋转
几家 BCI 公司已经考虑转向(从脑机接口转向可穿戴设备)。事实上,睡眠监测等一些商业应用已经代表了一个拥挤的市场。从短期来看,为 BCI 玩家找到相关且独特的中介应用至关重要。
脑电图
BCI 解决方案的另一个值得一提的潜在问题与脑电图数据有关。对于非侵入性脑机接口,“电极和大脑之间的头骨和组织导致信号更弱,信息传递更慢”( 11 )。显然,这限制了用户控制设备的能力。研究人员正试图克服这些限制,以提高脑电图在医疗和非医疗应用中的效用。
在某些情况下,用户基本上必须进入“冥想状态以实现对大脑调制的控制”( 12 ),这可以允许控制设备。最后,目前的非侵入式脑机接口往往需要强化训练。
生态系统
就像 AIoT 战略一样,我认为 BCI 公司面临的主要挑战之一将是整合由其他公司的解决方案组成的生态系统。如果明天,大型科技公司决定建立只适用于某些产品的 BCI,创业公司将很难与之竞争。
最终,BCIs 可以强化锁定效应。
BCIs 将在智能家居行业发挥重要作用,并有可能在长期内取代智能手机。我担心非侵入性的 BCI 产业或多或少会像智能手机产业一样(寡头垄断)。
BCI 在智能环境领域的应用不仅限于家庭。还有为工作场所或汽车行业设计的开发项目。由于这些原因,我担心我们的市场会有一些 BCI 设备和其他公司制造的许多不同的“应用程序”。
规章制度
不知何故,该行业在哪些设备符合 BCI(消费者端)标准方面缺乏清晰度。此外,大脑数据的问题仍然不清楚。我们可以出售大脑数据吗?我们是否必须遵守某些规则,例如 GDPR?如果 BCI 被黑了会怎么样?…
谈到医疗设备,“食品药品监督管理局监管一切——包括一些 BCI。然而,一些 BCI 不被归类为医疗器械,而是直接销售给消费市场”( 13 )。
潜在的非侵入性和非医疗商业 BCI 应用列表
下面,我列出了最常见的非侵入性和非医疗 BCI 应用。
【BCIs 能做什么?
目前,商业脑机接口往往侧重于理解你的情绪状态或你打算做出哪些动作。正如 Jo Best 所提到的那样,“当某人在想‘是’或‘不是’时,BCI 可以感知,但探测更具体的想法仍然超出了大多数商用脑机接口的范围。”( 14 )
而且,“大多数商业 BCI 只能解读你的想法,而不能把任何想法植入用户的头脑。然而,围绕人们如何通过脑机接口进行交流的实验工作已经开始。我们可以想象,很快我们将能够通过分享大脑的神经活动来与远方的人分享经验。
对于 BCI 技术来说,现在还为时尚早,但我们已经看到了有希望的结果。
非侵入式脑机接口的不同应用和研究包括:
- 睡眠模式分析
- 疲劳和脑力负荷分析。
- 情绪检测。例如,“一个监控用户大脑的系统,根据温度、湿度、照明和其他因素相应地调整空间。”( 16 ) 近日,日产与 Bitbrain 合作,展示了首款 脑车接口 原型车。
- 情绪分析
- 控制装置(机械臂等)。)
- 利用脑电波的个人识别系统。
- 利用经颅直接刺激增加身体动作和反应时间。
- 职场分析/生产力最大化。例如,有项目开发一个应用程序来分析操作员的认知状态,精神疲劳和压力水平。
- 营销领域:在这个领域,“有研究指出,脑电图可以用来评估不同媒体的商业和政治广告产生的关注度。脑机接口技术还可以提供对这些广告记忆的洞察。( 17 )一般来说,“BCIs 可以用来优化互联网广告或电视插播广告”( 18 )。
- 教育领域:在这个领域,“BCIs 可以帮助识别每个学生学习信息的清晰程度,允许教师根据结果个性化他们与每个学生的互动”( 19 )。
- 娱乐领域:在这个领域中,脑机接口可以用于视频游戏。例如,玩家可以只用一个 BCI 来控制他们的化身。就电影而言,BCIs 可以利用观众的大脑活动来帮助创作互动电影。”在未来,“未来的观众将能够沉浸其中,并通过他们的联合大脑活动来集体控制一部电影”。
- 军事领域:在这个领域“在国防高级研究计划局(DARPA),BCI 已经被士兵们用来驾驶一群无人机”( 22 )。
致力于商业非侵入性 BCI 的公司
下面,我试图列出一些目前正在研究非侵入性、非医疗商业脑机接口的公司。如果你知道更多的公司,不要犹豫,联系我,我会把他们加入名单。
脸书
脸书据报道以 10 亿美元收购了 BCI 公司 CTRL-labs。脸书正在进行几个项目。其中一个与翻译思想有关。第二个是关于解释某人想要单独从他们的大脑信号做出的动作。
Neurable Neurable 专注于创造“日常”的脑机接口。
NextMind NextMind,做了一个“非侵入性的神经接口,它坐在一个人的后脑勺上,将脑电波翻译成可以用来控制兼容软件的数据”( 23 )。
其他公司:
- 轨道基
- 顺行学
- Thync
- NeuroSky
- Emotiv
- 交互轴
对于 BCI 技术来说,现在还为时尚早,但结果是有希望的。然而,“这一开创性领域的科学家明确表示,我们甚至还没有触及脑机接口潜在应用的表面(BCI)”(24)。
如果你对 BCIs 感兴趣,我推荐以下链接:
- 脑机接口:应用与挑战
- 想象一个新的界面:不用说一句话的免提通信
- BCI 技术的新应用:工业工作条件的心理生理优化
- 一个教育性的脑机接口
- 在中国和意大利受试者中,与记忆商业广告相关的 EEG 频谱活动增强
- 利用高分辨率脑电图技术研究观看商业广告时的大脑活动
- 脸书的“读心术”技术启动交易可能会彻底改变我们控制电脑的方式
Excel 中的业务图表
原文:https://towardsdatascience.com/business-charts-in-excel-d4030b4647aa?source=collection_archive---------29-----------------------
我们应得的“大数据”的一个例子
更新(2020 年 9 月):你现在可以直接获得源代码和现成的插件,达到以下效果,事半功倍;链接:
[## 如何零努力画出 9 种专业图表类型
只需点击一下鼠标,即可获得业务就绪型视觉效果
towardsdatascience.com](/how-to-draw-9-professional-chart-types-with-zero-effort-c9eee6d2a9cc)
介绍
我通常写我们的商业应用:从自动化决策中创造价值。
相反,今天我将把重点放在一个经常不被人喜欢但却至关重要的环节:使用 Excel 从我们处理的海量数据中提取最后一英里的洞察力。
虽然每个人都可以做到这一点,但是仍然有太多的人试图掌握这一技能却失败了。
我的观点是磨练关键的 Excel 图表技能意味着释放赋予现代经理的最强大和最廉价的工作负荷!
我们的产品,除了许多其他的东西,也为我们的客户产生自动化的 Excel 图表;我们的产品开发团队使用包括 Excel 在内的多种工具手动审核输出。因此,我对让这个话题变得容易理解产生了专业兴趣。
我们都可以发现“大数据”的视觉秘密,即使只是使用 Excel ,只要做得正确;这篇文章详细介绍了我自己的方法及其基本原理。
为什么在 Excel 中制作图表?
是的,2020 年将会有许多新奇的、先进的图形工具出现……我知道:我们的科学家使用它们,用于特定的目的和产品用例。
但是,在所有核心的分析工作都已经用其他强大的工具完成之后,“大数据”必须变小才能让人理解。
图表是分析的最后一英里,有一个简单的规则:不管选择什么工具,信息清晰是唯一的咒语。
当谈到“我们其他人的图表”时,对于像你我这样的人来说,没有什么能比得上微软 Excel 的易用性和强大功能:
- 为了渲染甚至数百万个数据点:就让 Excel 发挥它的魔力吧,它的渲染引擎的性能是惊人的
- 要添加图表:创建新标签即可
- 要建立开发环境栈:复制文件即可!
Excel 图表制作快速、灵活且便宜。但是启动需要五分钟,掌握它需要一辈子。特别是实现完全自动化的结果,而不是笨重的手工 Excel 工作。
挑战
默认设置是普通用户体验的核心。
但是比尔·盖茨肯定想搞些下流的恶作剧和/或给全球商界带来痛苦的经历: Excel 图表最初是用错误的默认选项设置的。他们中的许多人。
举几个例子吧?
- 默认的调色板更多的是狂欢而不是商业
- 像插入行或移动数据这样的简单操作可以隐藏任何图表
- 负值会破坏多种图表类型
- 3D ','瀑布'等类型功能失调
- 数据标签很难使用并且相互重叠
(注: 以上每一个默认,还有很多,都可以用一些爱来称呼&固定
我完全避免那些看似花哨的选项,如“图表”或“数据透视表”,它们实际上不够灵活,因此不值得花力气。我唯一关注的是普通工作表中的标准图表。
好消息是
现在,让 Excel 图表工作是可能的,而且相对较快!
读完这篇文章后,有了全新的设置,任何人都可以用有限的努力实现辉煌的自动化结果:
- 仅 Excel:无外部插件会降低 Excel 的运行速度、增加额外成本并可能停止工作
- 零代码 : 没有 VBA 或其他有崩溃风险的黑客,很难分享,需要技巧来维护
- 自动化 : 没有手动步骤,但是图表自动链接到数据,因此无需在每次数据改变时重复额外的特别工作。
接下来的内容最好使用桌面显示器或更大的平板电脑来观看。
指导原则
我的主要指导原则是在多年的“大数据”工作中形成的:
- 数据优先:释放数据本身来完成所有的对话,巧妙地隐藏不必要的干扰,例如轴、网格线、图例、标签、额外的 0000
- 逻辑排序:使用降序或升序,因为字母(?)或者甚至随机排序可以将消息隐藏在数据中
- 眼球控制:保持观看者的眼睛在数据上,具有支撑元件和参考的逻辑定位防止前后扫视。
视觉数据只有在与其他东西的相对参考进行比较时才有意义。很多吗?还是不够?长得快吗?一套比另一套相对大吗?
一般来说,(任何)定价也是如此,因为我们只能本能地在与其他东西的比较中评估价格— 我们的大脑在后台拼命这样做——我们对图表上显示的任何数据也是如此。
这就是为什么我喜欢用清晰的视觉参考来设计我的图表。
图表类型
有了这些原则,掌握一些图表类型就可以真正拥有 Excel 图表了。即使在“大数据”时代,所有图表中的五大王是:
- 线:时间序列
- 派&叠:组件
- 栏&栏:频率&项数值
- 散点图&气泡图:双向&三维相关图
- 箱线图:分布。
使用这些核心图表类型,并在适当的情况下进行组合,可以传递现代企业经理可能需要的几乎任何信息。
无论任何图表的基础数据集有多大,浏览者的大脑保持不变。
因此,图表必须设计得小而简单:我宁愿用简单的图表来说明复杂的信息,而不是把大量的数据放在大图表上。
设置
Excel 默认设置不可信。
但是一个库的‘模型图表’可以成为一个‘模板’,从而像躲避瘟疫一样避开 Excel 的默认图表。
如何开始?
- 虫警报! Excel 选项>高级>图表>属性:究竟为什么会有人想要‘跟随图表数据点’,以及让这些选项默认选中的理由,我都搞不懂;取消选中这两个选项可以防止在基础数据的位置改变时丢失宝贵的格式
- 新图表/图表选项/属性:我不喜欢在插入/删除行时图表的形状发生变化;比起“随单元格移动并调整大小”(默认),我更喜欢“移动但不随单元格调整大小”
- 填充对于数据集,我仍然使用 0.25 磅的薄边框,但透明度为 50%,因此它变得更加微妙,同时仍然引导眼睛
- 阴影:只要不过度,右下阴影【弹出】图表,使用预设(‘外’,首选左上)‘距离’减少到 2pt 我很少使用阴影,主要用于整个图表区域,甚至根本不使用,以避免造成混乱和不必要的混乱
- 字体类型:我使用‘Lato’和默认大小 10 作为我的目标外观&感觉;所有文本“浅黑色”(RGB 69/69/69)到防止“黑色闪烁”;图表标题 12pt,粗/粗体
- 线条粗细:所有非数据线&刻度线的粗细为 0.25 磅,这是目前最细的设置;网格线不会增加精确度,但会增加混乱,因此我避免使用网格线,而是使用数据标签,并且只在想要显示精确数据值的时候使用;现在,既然经理们都是讨厌被“大喊大叫”的聪明人,我也保持低调
- 调色板:偏好和公司政策的问题;我可能会使用“evo green”来强调,但通常会发现“shades of blue”是最优雅、最有吸引力、最容易阅读的解决方案——毕竟,在世界上任何地方,天空和大海都是蓝色的,越深越暗——直觉上是有道理的……而且对 7%有视觉障碍的男性也有效(尽管在女性中很少见,幸运的是只有 1%的人是色盲),甚至在打印成黑色&白色时也是如此
- 间距:只要有可能,特别是对于文本&总计,我会删除任何和所有额外的默认填充,与轴的距离为 0 而不是 100,边框为 0 而不是默认的 0.11/0.05
- 标签:我格式化标签,并将它们作为自己单独的数据集“来自单元格的值”应用,而不是接受来自 Excel 的自动标签,这样在后台我就能够隐藏重叠部分,并自由定义要显示的正确数字/文本类型
有了这个初始设置,并使用“命名范围”和“offset()”公式,任何图表类型都可以通过完全自动的调整和清晰的格式以灵活的方式链接到任何数据集——所以,现在终于到了每种图表类型的更具体的细节。
折线图
长期趋势。特定设置:
- 系列标签在左侧,它们的逻辑位置,使用带有不可见点的辅助散点数据集和自动“引导线”(组合图)在需要时区分标签;如果是单个系列,其名称将出现在图表标题中
- 副标题中的测量单位因为只有一个轴,或者它会位于每个轴的正上方
- 数千/数百万/数十亿用于防止 000 污染 —使用 Excel 的自定义格式自动生成;标题和副标题是通过与单元格值的直接链接自动生成的
- y 轴在右侧,带有可选的下划线,它是一个参考标尺,而不是一条位置有任何其他意义的垂直线
- 负数据下方的轴标签,交替出现以减少拥挤,刻度线【内侧】指向数据,比标签的文本更重要。
右上角的可选图例对于更容易阅读的左侧系列标签来说是多余的,但线条可能会重叠,从而留下潜在的残留模糊性;因此,是否添加图例是一个偏好问题。
没有副轴请。我更喜欢图表上下重叠,而不是增加多个度量单位;额外的好处是 X 轴标签通常可以在“上图”中省略。
Excel 逐步呈现每个系列,一个接一个:第一个系列放在每个其他系列的后面;这通常应该是 X 轴,它本身也是一个折线图,因为散点线总是在任何正常的线条系列的上方呈现,这是不能改变的。
“刻度线”是完全可控的“误差线”。
最重要的序列,在上面的例子中是“今年”,当两个序列交叉时,被渲染到最后“高于一切”:为了实现这一点,我把它移动到最后一个数据集。
通常需要额外的虚拟数据集,它们可以快速实现。我的列表可能是这样的,例如:
例如,这些虚拟数据集可能以正确的顺序显示 X 轴或图例键,首先显示最重要的数据系列,而不是颠倒,这与逻辑上的建议完全一致。
虚拟数据集也可能显示自动“垂直线”,在我的示例中,用来突出显示公司进行价格变动的具体日期。
饼图和堆积图
这些都显示了整体的组成部分。特定设置:
- 内部和外部的饼图标签需要两个重叠的图表,一个使用副轴——不管这实际上意味着什么。)
- 旋转和爆炸在上面的图表中以 90 度为中心,由于它的水平方向,眼睛更容易检测到这个切片的日珥;仅部分自动化,需要用户定义的功能或 VBA 来实现完全自动化
- 堆积百分比图,通常比多个饼图更简洁,是一个普通的柱形图或条形图,其数值在绘制前自动缩放至 100%;纤细的连接线有助于突出显示变化,最好是将焦点放在底部的“基础数据集”。
为了显示跨越多行的标签的内容,我使用‘char(10)’作为‘新行’字符,与‘text()’函数一起构建标签字符串。
柱形图和条形图
频率和项目值。特定设置:
- 与其他图表相同:预排序、系列标签、自动引导线和无重叠
- 间隙宽度 80%而不是默认的 150%
- 支持/ 瀑布图的不可见数据集
- 支撑线为“增长”线标注 losenges
- losen ges 的数据标签形状,例如突出显示 CAGR 的平均增长率。
总计显示在正柱的上方或右侧,显示在负柱的下方或左侧。50%的透明白色填充用于负值总计,以消除轴重叠。
该系列图表中的其他示例:
在瀑布图中,系列标签位于“总计”的右侧,而不是左侧,并且仅在需要的地方显示,例如一个以上的系列。“三角形”用“形状填充”显示——任何东西都可以使用,甚至是树的图像! Mekko 是一个带日期轴的“堆积面积”图。聚类,我不喜欢使用它,因为它往往隐藏其信息,序列重叠设置为 0%。
散点图和气泡图
二维和三维相关性。特定设置:
- 轴标签为“低”,在图表之外,刻度线为“内”,阴影在左下方
- 轴标题和每个轴旁边的单位便于阅读
- 带有细边框和 50%透明填充的气泡,以突出显示不同数据点之间的重叠,&带有 50%透明白色背景的数据标签
- 重叠时隐藏的数据标签:这是图表,不是数据表!
- 尺寸代表气泡的宽度,此选项强调了相对差异,因此对人眼来说比面积大小更直观。
为了防止数据标签重叠,我计算了每个角的 X/Y 坐标,然后检查一个矩形是在另一个矩形的上边还是左边。
该系列中的其他相关图表类型:
对于“梯形”图表:细网格线 0.25 磅,浅灰色 0%透明度。
箱线图
分配,例如价格范围。特定设置:
- 柱形图在底部使用了一个‘隐形’支撑杆
- 上方和下方的误差触须显示顶部/底部四分位数数据
- 按中线排序,中线是中间的水平线
- 数据标签依靠 2 个额外的不可见线数据集(“散点图”类型将允许更大的准确性和控制,但代价是需要更长的设置时间)来突出显示最小&最大值,具有 50%的背景透明度;我避免使用自动指引线,尽管标签/方框/轴有重叠的风险,这样可以防止在这个已经相当密集(但非常漂亮)的图表类型中增加更多的复杂性
- 方框后面的阴影使用与整个图表阴影相同的设置。
对于显示“我们的中间值”的行,我通过编程隐藏应该落在框后面的部分,否则 Excel 会将不需要的部分覆盖在顶部。X 轴也是以编程方式生成的。
结论
这些例子展示了我在 Excel 中实现自动化制图的方法:没有外部工具、VBA 或手工工作。也许有一天,甚至 Excel 的默认设置也会在软件的未来版本中得到修正。
现在,我发现我构建“自制模板”的方法的结果是简洁、易读和快速渲染。
如果有任何问题,请不要犹豫让我知道。
制图愉快!
PS 早在 2005 年,在我工作的第一周,吉恩·泽拉兹尼的书《用图表说话:视觉沟通主管指南》启发了我。
即使在今天,这仍然是有史以来最好的图表指南之一。简单扼要。不具体关于 Excel,但如何思考为什么,何时以及如何使用每种图表类型。谢谢基因!
Get free access to your monthly summary of Business Science, new software and University-level learning:[**Free access**](https://evouser.com/register)Any questions? Feel free to connect with me on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)
数据科学家的商业概念
原文:https://towardsdatascience.com/business-concepts-for-data-scientists-352711657f55?source=collection_archive---------32-----------------------
尼基塔·卡恰诺夫斯基在 Unsplash 上的照片
我半开玩笑地试图弥合 MBA 和数据科学家之间的鸿沟
T4:巴斯是一群严肃的人。他们喜欢开会,讨论行动项目和关键要点;他们总是试图跳出框框思考,或者寻找真正难以捉摸的东西,比如阿尔法或(竞争)优势。
我知道是因为我有 MBA 学位。我职业生涯的大部分时间都是在定量和定性、数据和业务、盒子里和盒子外之间的线上度过的。因此,我的数据科学家同事,这使我可能是第五个最有资格向你解释商业世界如何运作以及所有商业术语的含义的人 (仅供参考,如果你还没有注意到,这篇文章主要是讽刺性的,带有一点点洞察力) 。今天,我将重点解释最让我恼火的商业概念(这样你就可以和我一起讨厌它们了)。
照片由雅各布·欧文在 Unsplash 上拍摄
蓝海战略
我真的很讨厌这个词。我理解创造者想要表达的意思——不要在现有的竞争市场中竞争,你应该打造一种既新颖、又与众不同(MBA 术语,意思是产品有些独特)又低成本的产品或服务。换句话说,发明一个新的市场,远离那些充斥红海的蹩脚竞争,你将会财源滚滚!如果事情有那么简单,世界充满了蓝色的海洋供我们所有人玩耍(我不是指字面上的意思,是的,我知道地球表面 71%是水)。
事实上,沃伦·巴菲特早就说过——公司应该一直改善他们的经济护城河(给予他们相对于竞争对手的持续优势和相对于客户的定价权)。老实说,仅仅通过阅读巴菲特的股东信,你就可能学到我在 MBA 学到的 99%的东西。
但当我听到这个词时,我不禁回想起我参加的一次会议,会上一个人痛斥另一个人“缺乏商业眼光”。我清楚地记得他说过,“不像你,我是一个蓝色海洋的思考者。”不寒而栗。我其实对那个“蓝海思想者”挺不爽的。我喜欢海洋;但是现在,当我听到蓝色海洋这个词时,我想到的不是鲸鱼、海豚和戳,而是他的脸…
我的想法:拥有更好更便宜的产品是理想的,但并不总是现实的。不是每个公司都可以或者应该去寻找神话中的蓝海。每一个谷歌(由于其巨大的规模,它实际上提供了更好的产品,搜索广告,价格更低),都有几十个克罗格。Kroger 涉足商品市场(所谓的红海)并不意味着它不能盈利(它只需要优先考虑销量,不要做浪费金钱的蠢事)。如果你将盲目追逐蓝海所消耗的金钱与真正的蓝海所创造的价值进行比较,我敢打赌前者要大得多——因此,追求蓝海从总体上来说可能是一种净负面影响。即使是谷歌,尽管一再尝试,花费了数十亿美元,也从未能够复制搜索的蓝海(和成功)。
由 Digvijoy Mazumdar 在 Unsplash 上拍摄的照片
破坏和破坏者
几年前可能有一段时间,仅仅在你的投资者推介材料中提到 disrupt 这个词就能保证至少 5000 万美元的资金(来自软银)。如果你能面无表情地解释你的公司基本上是自来水笔的 AirBnB,那你就能再获得 5000 万美元的资金。
由已故的 Clayton Christensen 率先提出的“未启动的颠覆理论”描述了一种情况,即一家较小的公司从其更具(最初)主导地位的竞争对手那里赢得了大量市场份额。它成功地做到了这一点,首先专注于向被忽视和服务不足的买家提供更便宜/更简单的产品(即足够好的),然后通过改进其更便宜的产品的功能最终转向高端市场。现有企业反应迟缓,因为它们不是为成本竞争而生的。最终,这个颠覆性的新贵不仅拥有成本更低的产品,还拥有功能更全的产品,并最终主导市场份额(直到它自己在某个时候被颠覆)。现在我想起来,颠覆有点像在红海中应用蓝海战略…那么是紫色海洋吗?****
不管是好是坏,冲水时代已经过去了。大多数试图破坏的初创公司最终只会破坏投资在它们身上的资金(通过烧钱)。风险资本的繁荣无疑对消费者有利——它有助于发展像优步、Slack、Flexport、Airbnb 和 Instacart 这样又酷又有用的企业(尽管其中一些企业可能无法在当前的衰退中存活下来)。
照片由 Alina Karpenko 在 Unsplash 上拍摄
但它也催生了一批只能被描述为投资者资本荒谬浪费的公司。想成为房地产颠覆者的 WeWork 可能是最著名的一家。就在去年在我对软件工程师薪酬最高的公司的排名中,WeWork 还高居榜首,因为它准备从华尔街榨取数十亿美元(通过可能是历史上估值最高的 IPO)。现在该公司濒临破产(理应如此)。
一个非常有趣的例子是 Juicero ,这家公司出售了价值 400 美元的剪刀(它实际上是一台机器,唯一的功能是打开一袋同样定价过高的水果泥)。在被嘲笑消失之前,该公司设法筹集了 1.2 亿美元。什么??当 Juicero 的创始人向他们的投资者推销时,我很想成为墙上的一只苍蝇。我想对话大概是这样的:
**VC:** So you're a company that sells expensive juicers?**Juicero:** No, were a cutting edge tech company that's about to disrupt the market for fresh fruit and vegetables.**VC (suffering FOMO from not investing in Uber):** Tell me more.**Juicero:** You know how many people eat fruits and vegetables?**VC:** I would imagine a lot.**Juicero:** EVERYONE eats them EVERYDAY! The TAM (business speak for potential market size) is infinite!**VC:** So you're like Uber but for fruits and vegetables?**Juicero:** Yes exactly.**VC:** I'm liking what I am hearing but just for due diligence's sake, how are you better than say an Odwalla?**Juicero:** Our proprietary deep learning algorithm uses AI and NLP to infuse every juice packet with the optimal combination of flavor, texture, and nutritional value. And we use blockchain technology to ensure that every perfect packet is unique and can only be unlocked by the specific Juicer with the correct private key. It's truly decentralized nutrition for the masses.**VC:** You had me at blockchain!
事实上,Juicero 从未上市让我有点难过。这将是一次惊人的做空(做空是押注股票价格将下跌)。
这个故事的寓意是,颠覆是艰难的。不是几百万甚至几十亿美元就能买到的东西。真正的颠覆通常来自于一家公司在激烈的竞争中拼命求生。这需要耐心、无数次的迭代和对客户需求的深刻理解,才能有机会创造出颠覆性的东西。
困境买家、协同效应和杠杆收购
私募股权(PE)是相当于房产经纪人的公司。他们借了很多钱来收购一家公司,美化它,然后转手给出价最高的人。如果你能得到它,那将是一份伟大的工作——成功的私募股权基金经理能赚到疯狂的钱。
在我们今天讨论的所有 3 个概念中,这是最相关的。私人股本基金坐拥约 1.5 万亿美元的干粉资金(也就是未投资现金)。如果市场在未来几个月再次下跌,他们将开始认真投入所有资金。这就是为什么他们经常被称为困境买家——私募股权基金喜欢收购陷入困境的公司(然后掏空它们)。
你可以打赌,他们已经开始对你附近遭受重创的科技公司穷追不舍了(4 月,Airbnb 从私募股权公司筹集了 20 亿美元的可转换债券;可转换债务是附有转换为股权的选择权的债务)。
私募股权让我很恼火,因为它假装在帮助公司,却在暗中榨取公司的所有现金。在投资行业,我们经常谈论“游戏中的利益”,意思是你的投资是否使你的(财务)利益与公司的业绩完全一致?事实上,私募股权公司在每笔投资中的份额很小。要理解其中的原因,下面是收购一家公司的典型私募股权剧本:
- 确定一家目标公司,这家公司的银行账户里有大量现金,并能产生大量现金流。
- 用一点自有资金和大量债务,以目标公司的现金流和资产为抵押,收购目标公司。所有这些债务的使用就是这项交易被称为杠杆收购(LBO)的原因。在商业用语中,杠杆和债务是一回事。
- 用被收购公司的现金支付股息——基本上是一种无所事事的巨大的财务自我击掌。
- 实施大规模裁员(所谓的协同效应),因为被收购的公司现在没有现金,需要支付大量利息(以偿还债务)。哎呀,我想知道现金去哪里了?
因为私募股权公司用了太多的债务(而不是自有资金)来为收购提供资金,并支付股息;到第三步结束时,游戏中剩下的皮肤已经很少了。它最初投资的一小部分股权已经部分收回。
这真是一个冷酷无情的行业。没错,确实有一些私募股权公司离开被收购公司时比当初更好,但它们是例外。更典型的是,私募股权公司(通过新的 IPO)将背负债务、濒临财务困境的公司放归自然。在牛市中,价格上涨和对经济的乐观有助于掩盖不良公司的缺点,他们可以逃脱惩罚。
走向市场的数据科学
原文:https://towardsdatascience.com/business-data-science-a6fe0b27466c?source=collection_archive---------37-----------------------
简单的概念将有助于您的公司跟踪和促进用户增长,保持和盈利能力。
图片来源: Unsplash
介绍
T 大多数公司的核心焦点是扩大用户群并将其货币化。肩负这一使命,商业分析数据科学家必须衡量和优化用户增长、用户保持率以及由此带来的盈利能力。
考虑到这一点,本文回顾了您可以采取的具体步骤:
- 通过测量和优化病毒系数、周期时间和客户获取成本,推动可持续的用户增长。
- 通过建立活跃的用户定义、跨群组和产品行动细分留存率,以及对留存率数据建模,来衡量、改善和预测用户留存率。
- 通过提高每用户收入、降低客户获取成本、延长用户生命周期以及关注高价值用户来推动盈利。
1.增长
增长的重点是让人们成为你的产品或服务的新用户。有几个渠道(方案 1)可以给你带来新用户:
方案一。推动用户增长的流量来源。
- 直接。用户在他们的地址栏中手动键入 URL。在实践中,直接流量还包括那些点击嵌入在 Word 或 PDF 文档中或显示在短信中的书签或链接的人。
- 搜索。谷歌显示的搜索结果是基于关键字匹配的强度,以及通过其他网站的链接衡量的受欢迎程度。搜索引擎优化专注于选择合适的关键词和获得高质量的入站链接。对于应用开发者来说,苹果和谷歌 Play 应用商店也有类似的追求。
- 付费广告。通常根据点击付费或印象付费来定价,广告可以从搜索、社交和视频平台(如谷歌、脸书、YouTube)或特定网站(如纽约时报)购买。为用户付费时,比较新用户的预期终身价值和他们的获取成本是很重要的(见第 3 节:盈利能力)。
- 下线。当前用户可以邀请新用户使用您的产品。这种人对人的用户获取手段也被称为病毒式增长。因为人们通常信任他们的联系人,推荐可以成为廉价、高价值流量的良好来源。如下所述,跟踪与病毒式用户增长相关的指标可以促进产品开发。
1.1 病毒增长
Hotmail 的电子邮件签名始于 1996 年,是一个邀请收件人获得自己账户的链接,这可能是所谓病毒式营销的第一个例子。如今,许多公司(例如,优步、 Square 、网飞)都提供推荐奖励。
病毒系数为 2 的两个生长周期。
借用流行病学的病毒增长模型,对于理解新冠肺炎和其他传播性疾病的传播至关重要,它允许在假设新用户仅由现有用户带来的情况下,预测用户数量随时间的变化。具体来说,任何特定时间的用户总数 U ( t )可以表示为
其中 U ₀是起始用户数, t / c 是经过的周期数(对于经过的时间 t 和周期时间 c ),而 k 是病毒系数(流行病学中又称为 R ₀ ),或每个现有用户带来的新用户数。在下文中,我将展示这些术语的重要性,并描述您的企业可以采取哪些具体步骤来利用这些杠杆推动病毒式增长。
1.2 病毒系数
病毒式增长模型的关键假设是,新用户通过与现有用户的互动参与到产品中。你可以用
邀请率 ( 发出邀请数**当前用户数)乘以接受率 ( 接受邀请数**发出邀请数)来计算你公司的病毒系数。
例如,如果现有用户平均发送 5 个邀请,40%的受邀者接受,则病毒系数为 5 × 0.4 = 2。在这个场景中,每个当前用户将带来 2 个新用户。许多年轻公司的基本目标是获得一个病毒系数,因为 k = 1 定义了饱和增长和加速增长之间的界限(图 1,左)。
图一。根据等式,病毒系数 k 和周期时间 c 对用户群增长的影响。1.( 左 )线性增长结果为 k ≈ 1(注: U 未定义在 k = 1)而 k > 1 和 k < 1 分别产生指数增长和饱和。(右)缩短周期时间保持生长轨迹形状,但沿 x 方向压缩。
1.3 周期时间
在分析中引入时间,病毒系数 k 被提升到幂 t / c + 1。这里,周期时间 ( c )是一组用户的转化和其被邀请者的转化之间的时间间隔, t/c 则是经过的病毒周期数。按照这个逻辑,对于给定的时间 t ,减少周期时间 c 相当于增加经过的周期数(图 1,右)。
方案二。病毒循环。
病毒循环由三个步骤组成:( 1 )传递积极的用户体验,( 2 )用户邀请其他人,( 3 )其中一些邀请被接受(方案 2)。然后,周期时间 c 被计算为一个用户的转换和他们带来的用户的转换之间的平均时间间隔。
1.4 加速增长
等式 1 表明,增加病毒系数 k 和减少周期时间 c 是增加用户增长的病毒成分的两个关键杠杆。我在下面的文章中概述了你可以采取的促进病毒增长的行动。
增加病毒系数
由于 k 是邀请率和接受率的乘积,增加其中任何一个都会增加病毒系数。为了提高您的邀请率(图 2,顶部):
图二。通过优化当前用户的邀请率(上图:Dropbox 示例,图片来源)和被邀请的潜在新用户的接受率(下图:脸书示例,图片来源)来提高病毒系数。
- 增加一个 邀请列表。向用户展示从电子邮件或社交媒体中提取的联系人列表将使当前用户更容易邀请其他人。
- 奖励 分享。这些可以是单向或双向的,有利于邀请者或邀请者和被邀请者,可以是金钱或其他。这使得发送邀请更有吸引力。
- 延长用户寿命 。这允许更多的共享(另见第 2 节,保留)。一旦用户离开,他们将不会发送邀请。
为了提高您的接受率(图 2,底部):
- 陈述你的价值主张。将此添加到登录页面有助于转变持观望态度的潜在用户。
- 减少签约摩擦。 要求尽可能少的输入字段(如姓名、电子邮件、密码)会让那些感兴趣的人更容易转换。
减少循环时间
减少周期时间相当于快进你的生长轨迹,并通过加速方案 2 中所示的病毒周期的每个阶段来实现。考虑执行以下操作:
- 快速交付关键事件。啊哈时刻把一个新用户从评价带到忠诚模式。优化呈现给用户的导航选项的顺序(转换漏斗),让他们尽快获得积极的体验。
- 增加一个“分享”功能。无论是在啊哈时刻的旁边还是之后不久,一个满意的用户应该能够在他们记忆犹新的时候邀请朋友。
- 推出即将到期的激励措施。通过在有限的时间内提供一些东西来激励当前用户更快地邀请他们的朋友。
- 减少签约摩擦。除了提高接受率(见上文),最大限度地减少所需的输入字段也将减少用户在这一步花费的时间。
2.保留
虽然增加新用户至关重要,但最终是的活跃用户通过点击广告或购买来增加收入。因此,关注这些用户,将他们从其他用户群中分离出来是非常必要的。活跃用户通常只占累计注册用户的一小部分:例如,普通的移动应用仅在 3 天内就失去了 80%的日活跃用户。
两个期间的活动用户(蓝色),每个期间的保留率为 0.5。
您的总用户群可以分为新用户、活跃用户和流失用户(方案 3)。如箭头所示,有 5 种可能的转换:
方案三。累积注册用户群中的用户包括新用户、活跃用户和流失(流失)用户。新用户要么被保留为活跃用户,要么由于不活跃而流失。活跃用户可以流失,流失的用户可以重新激活。
- 非用户通过转化成为新用户
- 新用户通过保持活跃用户
- 或者那些新用户都流失到
早期流失 - 丢失的用户通过复活回到活动状态
- 活跃用户通过后期流失成为流失用户,与早期流失不同,他们在流失之前已经从产品中获得了价值
按照这个逻辑,在给定的时间间隔内你的活跃用户数的变化可以表示为
保留的新用户 + 恢复的失去的用户-在那个时间段内失去的活跃用户。
2.1 定义活动用户
活跃用户是指在特定的时间间隔内完成了某些行为的人,这些行为最好与收入产生相关联。活跃用户的定义因公司而异,表 1 中显示了选定的示例。
表 1 。所选公司的活动用户定义和计数。参考资料:脸书,推特,优步,广场,网飞,亚马逊。
除了定义操作之外,您还必须规定时间间隔,在该时间间隔内,用户必须采取该操作才能被视为活动的。这通常与用户参与产品的频率有关。例如,每当用户有时间浏览时,社交媒体就会提供免费的个性化内容,而且许多用户每天都会访问。另一方面,打车、电子商务和移动支付平台解决了偶尔的需求,通常需要花钱,因此它们的用户参与频率较低。公司选择主动用户定义来反映核心用户的产品使用频率。
2.2 计算用户留存率
有了活动用户定义和适当的时间间隔,您可以创建一个用户活动日志(表 2 ),显示用户在某一天的状态。然后,通过从日期列中减去每个用户第一次使用的日期,可以将该表转换为以注册为中心的活动日志(表 3)。
表 2 。以日期为中心的用户活动日志,显示用户状态(活动= 1)。连字符代表特定用户注册之前的日期。
表 3 。以注册为中心的活动日志。“天”列指的是自用户加入以来的天数。根据定义,所有用户在第 0 天都是活动的。连字符表示用户注册后由于最近注册而尚未到达的天数。
以注册为中心的格式表面洞察用户旅程中的里程碑。例如,用户注册后 3 天发送的电子邮件可能会提高第 3 天的活跃用户比例(保留率)。
相反,以日期为中心的格式显示了发生在特定日期的新闻或产品发布的效果(例如,2017 年 1 月的 #DeleteUber 活动)。
2.3 可视化用户留存率
以注册为中心的用户活动日志可用于绘制保留曲线,即活跃用户的比例与自注册以来的天数。这条曲线揭示了用户参与度下降的速度,在哪里趋于平稳,以及用户是否会复活。有三种用户保持模式的原型:下降型、扁平化型和微笑型。
长期来看,当活跃用户数趋向于零时,用户保持率下降(图 3,蓝色轨迹),这表明产品与市场不匹配。获得一群忠诚的核心用户(也就是说,推高y-渐近线)是一家年轻公司面临的最紧迫的任务,并从解决企业或个人面临的一个关键问题开始。一个值得注意的警告是视频游戏行业:长期的客户保持几乎是不可能的。像《Farmville》和《愤怒的小鸟》这样曾经轰动一时的游戏现在只拥有其总用户群的极小一部分。在这种情况下,合理的目标是优化用户增长和降低流失率,以最大化保留曲线下的区域(即活跃用户天数)。
图 3 。保留曲线的三个经典例子。
当一部分新用户发现产品的价值并在注册后很长一段时间内保持活跃时,就会看到保持率持平(图 3,橙色轨迹)。大多数成功的企业都属于这一类。然而,并不是所有的扁平化保持曲线都是一样的:保持曲线结束时的值衡量了产品与市场的匹配程度。例如,网飞在流媒体视频领域处于领先地位,在注册一年后保留了三分之二的用户。因为获得一个新客户几乎总是比保留一个现有客户更昂贵,所以通过提高保留率来扩大活跃用户群通常比增加新用户注册更有利可图。
微笑保持是理想的场景:一些不活跃的用户返回(图 3,绿色轨迹)。增加产品类别可以鼓励用户复活:在开始在线图书销售四年后,亚马逊开始销售几乎所有其他的东西,促使不活跃的图书购买者通过不同的产品重新参与进来。网络效应也鼓励复活:随着越来越多的司机注册该平台,优步乘车的等待时间减少了,因此该服务对乘客变得更有价值。同样,随着越来越多的智能手机用户下载 WhatsApp,早期用户看到朋友加入该平台,有理由重新使用该服务。
抛开保留率的波动不谈,有一点是肯定的:从长远来看,每家公司最终都会失去所有的用户。考虑一个最近的例子:在声称占有美国智能手机市场 37%的份额仅仅十年后,黑莓将于 2020 年停止其手机生产。
2.4 保留和产品开发
表 4 。群组分析:用户注册当月的总保持率。
沿着感兴趣的某个维度绑定保留数据通常很有帮助。根据加入日期对用户进行分组(表 4)是这一概念的一种常见实现,被称为群组分析。
群组分析可以揭示跨产品迭代的用户参与度。理想情况下,年轻群体的参与度下降较慢,长期保持率较高。虽然不一定是因果关系的证据,但随着时间的推移,用户参与度的增加与产品市场匹配度的提高是一致的,并且不一定仅从平均留存数据来看是明显的。
与此同时,集思广益可能与保留相关的用户行为可以帮助激发积极的产品变化。在一个众所周知的轶事中,脸书的早期成长团队发现,新用户在平台上的头 10 天里,其留存率与朋友数量之间存在关联。基于这一观察,该公司能够通过将新用户引向关键的“添加好友”行动来提高保留率。
您还可以跨用户人口统计信息
(例如,年龄、性别、地理位置)或获取渠道检查留存率。注意到这些群体之间在保留率上的差异可以提供一个行动号召,也许会激发产品变化来解决不足,或者加倍对符合忠诚档案的潜在用户进行营销。
2.5 建立用户留存模型
在观察到的客户行为的时间范围之外预测留存数据,可以让您了解公司的稳态用户参与度,对于估计客户终身价值至关重要(第 3 节,盈利能力)。
考虑一组真实留存数据来衡量
12 年来的客户参与度(图 4,顶部,蓝色散点)。假设您在第 6 年,并且您想要预测未来几年的保留率。你可能会原谅试图拟合指数,尽管你最终会发现它低估了长期记忆(虚线)。
图 4 。用户留存数据(蓝色散点)的指数(点状)和移位贝塔几何(sBG,虚线)拟合。为了说明每种方法的预测能力,模型在数据的前半部分(0-6 年)进行了训练。
指数函数未能捕捉到观察到的保留数据的形状 S ( t )是由于其隐含假设,即从一个周期到下一个周期,逐周期(即瞬时)保留保持不变。
但观察到的瞬时留存,计算为
R(t)=S(t)S(t-1),明显随着客户保有期的增加而增加(图 4,底部,橙色散点)。这是一个混合转变的例子:老一代人已经淘汰了高流失率的用户,留下了忠诚的用户。
移位贝塔几何(sBG) 保留模型通过假设每个客户都有自己的常数瞬时更新概率 r 以及在时间 t 的最终存活概率 rᵗ 来适应这种观察到的瞬时保留增加 R ( t )。在整个客户群中, r 的分布遵循 beta 分布,所有客户的合计瞬时留存率随时间变化如下
其中参数 α 和 β 和决定了整个客户群中 r 的形状。
将此用于 R ( t )的 sBG 表达式拟合到经验瞬时保留数据上(图 4,底部),随后将累积保留函数 S ( t )作为 R ( t )的累积乘积,提供了与观察数据的良好拟合(图 4,顶部,虚线)。相关计算见本笔记本。在计算客户终身价值时,有一个准确的保留预测会很有用(第 3.3 节)。
3.收益性
任何企业的目标都是盈利,或者产生超过成本的收入。本节概述了公司的用户群与其收入、成本和最终盈利能力之间的关系。
3.1 收入
一家公司的收入通常在其用户群中分布不均匀。例如,从广告或一次性产品销售中产生收入的企业有一个几乎连续的和潜在的大范围的每客户收入分布,其形状可以近似为一个偏斜的(例如,伽玛或对数正态)分布(图 5)。这一特征反映了这样一个事实,即一小部分客户为公司贡献了不成比例的收入份额,这在其他社会指标中也可以看到,如家庭收入、城市人口和名字出现频率。
图 5 。每个用户贡献的收入的长尾分布。
如果用户分布在全球各地,即使是只有少量定价方案的订阅型企业也能看到每用户可能的收入值。例如,网飞只有三个定价等级,但收取多种货币的订阅费。因此,瑞士的网飞用户每月支付 22 美元,而哥伦比亚的用户每月只需支付 5 美元。
将特定时间间隔内的总收入除以活跃用户数,得出每用户平均收入【ARPU】。表 5 显示了选定公司最近的季度 ARPU 数字。
表 5 。选定公司的每用户季度收入(Q1 2020)。参考资料:脸书,推特,优步,广场,网飞,亚马逊。
ARPU 在公司的用户数量和收入之间提供了一个有用的链接。如图 6 所示,增加收入就是增加活跃用户群的规模(参见第 1 节和第 2 节“增长和保持”),增加 ARPU,或者两者兼而有之。在一般情况下,ARPU 可以通过提高平均采购频率** (单位时间内的采购数量)平均订单价值,或者两者同时提高。**
图 6 。通过每个用户的平均收入(ARPU)说明了收入和活跃用户数之间的联系,其中 ARPU 细分为以在线广告点击形式收集的收入。
网飞或 Spotify 等基于订阅的企业看到客户收入定期到达。相反,电子商务、物流和社交媒体公司让用户在特定的参与情况下产生收入,必须找到激励用户在给定时间内下更多订单或点击更多广告的方法。
以下是如何提高购买频率的方法:
- ****降价。如果需求有足够的弹性,这将会提高 ARPU:购买频率的大幅增加可以弥补每次购买收入的下降。亚马逊在 2017 年收购全食超市时打了这个赌,并对鳄梨和杏仁牛奶进行了降价。
- ****添加产品类别。这将允许你挖掘未被满足的需求,并从现有客户那里获得更多的购买。例子包括亚马逊扩展到图书销售之外,优步开发 Eats。
- ****创建付费忠诚度计划。利用沉没成本谬误来增加购买频率。购买了 Prime 会员资格后,亚马逊的顾客在网站上的花费比之前多了 150%,也许是为了“证明”会员费用的合理性。
- 增加广告相关性**。对于依赖广告收入的公司(例如,谷歌、脸书、推特)来说,购买频率相当于单位时间内的广告展示次数或广告点击次数。在点击付费定价的情况下(目前占全球广告支出的 63%),购买频率是广告印象和点击率 (CTR)的乘积。出于这个原因,这些公司使用投标价格和相关性分数,并考虑预测的 CTR,来确定谁赢得在线广告拍卖。
相反,你可以通过以下方式增加订单价值:
- ****提价。如果需求足够缺乏弹性,这将增加 ARPU:购买频率的小幅下降会被价格上涨所抵消。网飞提供了一个这样的例子:2019 年,该公司将其订阅价格提高了 18%,而订阅量仅下降了 0.2%。
- ****强调昂贵的物品。在你的网页或应用程序设计中突出这些产品。例如,亚马逊可能会在“推荐给你”部分显示价格更高的商品,而优步可能会在 UberX 经济选项之前显示价格更高的黑色骑行选项。
- ****增加最低购买奖励。电子商务公司可以提供最低购买量的折扣运费或额外商品。比如:“至少消费 50 美元,获得 X ”,其中 X =免运费,下一单打九折,等等。
- ****捆绑和交叉销售。成组销售商品可以增加平均订单价值。例如:“需要一支铅笔吗?我们只卖 10 支装的。”或者“买支铅笔?你也应该得到这个橡皮擦。”
- ****需求增加时限制供应。当你不直接设定价格时,这实际上是在提高价格。例如,脸书在 2020 年收取的平均每次点击成本为0.97 美元,高于 2016 年的0.28 美元。这既反映了随着用户群和参与度的增长放缓,广告库存的供应趋于平缓,也反映了随着更多企业看到令人信服的广告支出 ROI 并因此抬高广告价格,需求增加。
3.2 成本
每个企业都面临着与创造产品或服务相关的成本。这些费用通常分为固定成本和可变成本,其中可变成本与产量成比例。虽然可变成本对于一家烘烤饼干或洗衣服的公司来说是真实存在的,但那些专注于软件开发的人通常几乎不需要增加成本就可以将他们的体验传递给多一个客户。
在每用户的基础上表达可变成本,而不是每产出单位的成本,可以对成本进行有意义的描述,该成本随着接触到的客户数量的增加而增加(图 7)。在这种情况下,一个公司在一定时期内的总成本是固定成本(工资、建筑、设备等)的总和。)和可变成本包括 顾客获取成本 和 商品销售成本 。
图 7 。以用户为中心的固定和可变成本框架,用户获取来自付费广告。
你可以计算你的客户获取成本(CAC ),用你获取的新用户数除以获取新用户的总花费。如果你是按广告点击付费,你的 CAC 就是每次转换的点击量和相关的每次点击成本的乘积。CAC 提供了营销支出效率的一个重要衡量标准:一个经验法则规定 CAC 应限制在客户终身价值的三分之一以下(见下一节,盈利能力)。
以下是你如何降低客户获取成本:
- 推动免费用户增长**。客户直接进入你的网址,通过有机搜索进入你的网页,或者接受一个现有用户的邀请(见第 1 节:增长)都不会让你付出任何代价。提高你的公司在免费搜索结果中的排名,优化其病毒式增长引擎,将会推动免费新用户的获取,从而降低你的平均 CAC。
- 寻找更便宜的付费用户来源。衡量一系列营销渠道或广告活动的每次点击成本和转化率。考虑采用渐进转变从探索资源到开发最便宜的新用户资源,而不是在两个不同的阶段运行测试和展示(参见多兵种土匪问题)。
除了为获得用户而付费之外,你还可以在每次向他们提供产品或服务时付费。这个总数,也就是你卖给每个用户的商品成本(COGS),是你收入中可变成本所占的份额,或者减去你的毛利润。毛利润抵消了固定成本,并决定了业务达到收支平衡所需的活跃用户数量。
这很棘手,但这是我给的大胆建议,降低你的商品成本:
- ****做软件公司。脸书和谷歌不需要为销售额外的广告支付任何费用,微软也不需要为多一个客户延长 Office 许可支付任何费用。另一方面,以硬件和物流为重点的科技公司会这样做:苹果的 iPhone 的 COGS 大约是销售价格的 40%,而优步的 23%的提取率意味着相对较高的 77%的乘车费用收入。
- ****成为巨人,消灭竞争对手。提供实物商品或劳动密集型服务的公司只能在竞争格局允许的范围内降低成本。例如,手机部件供应商较弱的议价能力使得苹果公司能够挤压供应商的利润,使得苹果公司的零售价格成为智能手机市场中最低的。相反,优步不能合理地期望以同样的方式压榨它的司机——如果优步提高他们的乘车率,优步的司机就会转向 Lyft。
3.3 盈利能力
企业的价值是公司预期现金流(利润)的现值,以反映这些现金流风险的利率贴现。表 6 显示了选定公司的季度收益(利润)数据。
表 6 。选定公司的盈利能力(Q1 2020)和市值。参考资料:脸书,推特,优步,广场,网飞,亚马逊。
客户终身价值
类似于公司估值,客户的终身价值(LTV)是新获得的用户将为你的企业贡献的利润的现值。
估算客户 LTV 对于建立您的:
- ****营销预算。花费不超过你估计的 LTV 的三分之一来获得一个新客户。
- ****商业健康。用户数量和 LTV 是决定你公司未来现金流的两个旋钮,从而决定你公司的最终价值。
- ****客户理解。发现哪些用户统计数据和产品行为与高 LTV 客户最密切相关。
客户的 LTV 可以通过将客户的定期(例如每月、每年)现金流(cf₁+cf₂+…+cfn)相加,并应用适当的贴现率 d 来计算:
其中现金流是收入减去在 t 期间从客户处收取的 COGS,贴现率 d 与公司的资本成本相关。完全了解客户的购买意图,就有可能计算出他们对你公司的 LTV。例如,在 10%的贴现率下,如果客户在 5 年内每年交付 100 美元的现金流,那么他们的 LTV 就是417 美元。
简单的 LTV 估计
当然,你不会提前知道每个客户的现金流时间表。作为替代,您可以通过将预期的单位时间现金流乘以预期的客户生命周期来获得一个粗略的客户 LTV 估计值(图 8)。
****图 8。简化的客户 LTV 估算是每期收入(蓝框)、边际贡献和预期客户寿命的乘积。
为了粗略地预测一个客户对你的业务的总价值,估计:
- 单位时间平均收入**。乘以客户的预期订单数量和频率(图 8,蓝色方框)。对于订阅业务,这两者都是在注册时通过合同建立的。对于未锁定合同的客户,使用所有客户的平均历史订单金额和频率,或客户特定细分市场(例如,年龄组、位置等)的平均历史订单金额和频率,估计每单位时间的预期收入。).注意,这种方法忽略了金钱的时间价值。
- ****平均贡献率。也被称为毛利润,这是所有产品销售收入中未被可变成本消耗的平均部分。对软件公司来说,这个数字接近 1,而对那些支付实物投入或劳动力的公司来说,这个数字要低得多。
- 平均客户寿命**。这可以粗略地近似为
1 ÷流失率,或给定时间段内的客户流失÷间隔开始时的客户。例如,如果每月有 20%的用户离开,那么你的平均客户寿命是 5 个月。该方法源自相关的几何级数、的收敛,低估了平均寿命,因为流失概率通常会随着客户任期的延长而下降。
如上所述,这种 LTV 模型有两个缺点:( 1 )如果不贴现现金流,我们会过分强调未来收到的资金的实际价值,而( 2 )通过假设恒定的流失率,我们会低估真正的平均客户寿命。
更好的 LTV 估计
只需多一点努力,就有可能既考虑到资金的时间价值,又降低长期客户的流失率。在这种情况下,认识到预期客户生命周期是保留函数 S ( t )下的区域,客户 LTV 可以表示为贴现现金流和这个客户生命周期的更精确估计的乘积:
这简化为
要实施这种方法:
图 9 。考虑时间折扣的平均客户寿命计算。本例使用了来自的保留数据 S(t),这里是,贴现率为 d = 10%。
- ****拟合你的实验保留数据, S ( t )(图 9,顶部)。
参见第 2.5 节。 - ****将模型化留存 S ( t )除以贴现因子,(1+ d ) ᵗ (图 9,底部)。
- 求和**曲线下面积s(t)/(1+d)ᵗ。多亏了贴现因子,总和收敛得很快。**
预期 LTV 是曲线下面积(图 9,底部)和每期平均现金流的乘积,参见。参见本笔记本的计算示例。
老练的 LTV 估计
上面概述的方法为您的普通客户提供了一个 LTV 估计。但是你可能希望找到特定客户的 LTV,或者更重要的是,确定你的高价值客户。在这种情况下,贝塔几何负二项分布( BG/NBD )模型会很有用。这种方法将一系列交易数据(例如,客户 id、交易日期、金额)与描述客户购买率和退出率的四个参数相匹配。这种分析为每个用户产生一个预测的货币价值。BG/NBD 模型的全面实现超出了本文的范围,但是您可以查看相关的生命周期 Python 库和参考资料,以获得概念性和实践性指导。
以下是你如何增加客户终身价值:
- ****增加现金流量。这可以通过增加收入(3.1 节)、降低成本(3.2 节)或两者兼而有之来实现。
- 增加客户寿命**。这是保留和盈利之间的关键环节。通过提高产品与市场的契合度(第 2.3 节)来减缓客户流失和鼓励复活,将会在 S ( t )中形成y-渐近线,扩大保留曲线下的区域,从而延长客户寿命。
结论
你有它!从获得和留住用户到最大化他们对你的企业的价值,这篇文章概述了你在建立和维持一个成功的公司的旅程中可能采取的一些步骤。请不要犹豫,联系或者在下面的评论中留下你的反馈。
这篇文章的灵感来自一组优秀的相关文本(精益分析、振幅、 Mixpanel 、社会资本、部落资本、红杉资本)和视频(亚历克斯·舒尔茨、埃利奥特·施穆克勒、迈克尔·赛贝尔)资源。
多亏了本·拉卡尔。
脸书预言家的商业预测
原文:https://towardsdatascience.com/business-forecasting-with-facebook-prophet-b9aaf7121398?source=collection_archive---------33-----------------------
2020 年 6 月更新
在这篇文章中,你将学习如何使用脸书先知库进行可靠的时间序列分析和预测。
来源:( @rosssneddon )转自 Unsplash
F 时间序列模型预测可被企业用于多种目的,例如优化销售、改善供应链规划和执行异常检测等。还有许多技术可以使用,从对历史数据的简单推断到更复杂的机器学习模型。一些先进的技术对数据、实施者和分析者都提出了相当高的要求,通常很难提出稳定的预测模型。Prophet 库的好处在于它相当宽容,这意味着它可以生成合理的结果。也就是说,Prophet 最适合具有明显季节性的商业类时间序列,并且您事先知道重要的商业日期和事件。与大多数时间序列工具一样,最好有一个包含几年观察结果的数据集。
最后,Prophet 也很容易通过其可理解的超参数进行调整。此外,它是可扩展的,所以如果你需要添加额外的回归,季节性或特殊事件,你可以很容易做到这一点。
要解决的问题
想象一下,我们在一家自行车租赁初创公司担任数据分析师,让我们称之为 Acme Bikes,我们收集了一些测量人们骑自行车上下班的数据。此外,数据集增加了历史降雨量和温度数据。我们被要求对数据集提供一些见解,并提供一个预测模型来估计任何给定时间范围内的未来通勤。我们还被要求以统计测试的形式提供一些有效性的指示。我们准备好了吗?但是当然。
Prophet 简介—主要概念
Prophet 采用了一种新颖的方法,认为预测主要是一种使用概率技术和来自广义加法模型的灵感的曲线拟合练习。我们不会在这篇文章中深入研究数学细节,但对于那些倾向于此的人,我建议阅读预言家的原始论文。
Prophet library 对于具有明显季节性的商业时间序列以及对数据有重大影响的特殊事件(例如,国定假日、黑色星期五、新产品推出、促销活动等)非常有用。要对时间序列 Prophet 建模,请将信号分成以下附加分量:
先知组件
其中:
g(t) 是使用非线性饱和增长模型或分段线性回归模型对非周期性变化进行建模的趋势函数。您可以使用参数对此进行配置。
s(t) 是季节函数(每年、每周和每天),用于模拟时间序列值的周期性变化。这个组件是使用傅立叶变换建模的,如果你愿意,你可以添加你自己的季节性。
h(t) 代表模拟假日和特殊影响事件的函数。您可以添加自己的自定义假日和特殊事件。
εt 是假设正态分布的模型误差/噪声
我认为这是一种直观而新颖的方法,分析师很容易从概念上理解预测是由什么组成的。稍后,我们将验证该模型实际上是按照数学描述的方式工作的。如果你对 Prophet 背后的数学和理论感兴趣,你可以阅读他们的论文,除了深入研究模型的不同组件之外,该论文还很好地描述了构建库背后的基本原理。说够了,我们开始吧!
关于数据的简短说明
对于这个假想的例子,我通过结合来自挪威道路管理局和挪威气象研究所的真实世界数据制作了一个数据集。更具体地说,该数据是在挪威奥斯陆 Ullevå的特定路段上计算自行车通勤者。您可以下载该数据她:https://github . com/pixel bakker/datasets/blob/master/bike rides _ day . CSV
这个计划
在我们开始工作之前,我们做一个简单的工作分解如下:
- 目视检查数据并控制缺失数据和异常值
- 如果需要,转换数据
- 在没有任何调整的情况下制作第一个预测模型并验证该模型。
- 通过添加特殊事件和日期来调整和测试模型
- 将降雨量和温度作为额外的回归变量,对模型进行调整和测试。
- 调谐超参数
首先看一下数据
为了简单起见,我选择提供一个干净的数据集,这样我们就可以把大部分时间花在实际的分析上,而不是挑选出坏数据。
导入库并读取数据和转换日期列
清单 1:我们的数据原始框架
Prophet 希望列有特定的名称,ds
表示时间部分,y
表示值部分。所以我们坚持这一点。
绘制数据以获得我们正在处理的东西的第一印象总是一个好主意。我使用 plot.ly 定制图表——这很好。
图一。我们数据的原始图
取消周末骑行
我们可以看到,数据有明显的季节性,可能还有轻微的积极趋势,尽管这很难看到。我们还可以注意到相当多的可变性。一些可变性可能是由于周末人们不通勤上班造成的。让我们从数据中去掉所有的周末,看看它是什么样子。
图 2:没有周末通勤的数据
仍有一些可变性,但相当少。希望剩下的大部分可变性可以用季节性、假期和我们额外的天气回归因素来解释:雨和温度。我们很快就会看到。
应用 Box Cox 变换
对于时间序列,对数据进行某种形式的幂变换以稳定方差并使数据更像正态分布通常是有用的。但是使用什么样的转换才能获得最好的结果呢?幸运的是,我们可以使用 Box Cox 变换来评估一组λ系数(λ),并选择实现最佳正态近似的值。我们可以这样做:
应用 Box Cox 变换。
图 3:经过 Box Cox 变换后。
我们可以看到,现在差异变小了,尤其是在季节性高峰附近。
绘制天气数据
当我们开始绘图时,让我们也来看看降雨和温度数据。在我们绘图之前,我们将数据标准化,这样我们就可以得到可比较的比例。
图 4:游乐设施和天气数据
毫不奇怪,气温与通勤量高度相关。我们看到这种模式在 7 月份被打破,很可能是因为挪威的公共假日。当涉及到下雨时,很难从情节中得出任何结论,但放大来看,有迹象表明下雨可能起了作用。我们走着瞧。
好的,看起来我们准备好出发了。让我们做一些预测。
使用 prophet 进行预测—初次尝试
Prophet 代码流非常简单:首先获得一个 Prophet 实例,并用我们的自行车骑行数据框拟合一个模型。然后,我们创建一个包含预测日期(地平线)的数据框,并将其传递给 Prophet predict 方法,如下所示:
当列出预测数据框时,我们得到:
清单 2:第一个预测数据框架
第列包含预测,然后你有预测的上下波段。尽管预测数据框包含了绘制自己的图所需的所有数据,但 Prophet 也提供了方便的绘制方法。为简洁起见,我们将尽可能使用内置方法,但在需要时,我们将使用 plotly 制作自己的自定义绘图。用 Prophet 绘制我们的预测可以这样做:
图 5:使用 Prophet 内置方法的预测图
您还可以将变化点(趋势模型正在变化的地方)添加到图中,如下所示:
图 6:有变化点的预测
这个先知剧情没有包含所有的改动点,只包含最重要的。如果您想查看所有这些,您可以使用以下代码:
图 7:所有模型的变化点。
如果我们愿意,我们还可以绘制出组成模型的所有组件:趋势、不同的季节和假期——我们将在后面更详细地介绍。现在,让我们用内置的绘图方法来看看组件。
它给出了以下输出:
图 8:到目前为止的模型组件。
我们可以看到,我们有一个明显的积极趋势,周一和周二是大多数人通勤的日子。我们也看到了强烈的年度季节性。
验证我们的结果
交互效度分析
为了让我们发现我们的模型表现如何,并知道我们是否正在取得进展,我们需要某种形式的验证。当然,我们可以编写自己的验证代码,但幸运的是我们不必这样做,因为 Prophet 提供了我们需要的大部分内容。
Prophet 库使得将我们的历史数据分为训练数据和测试数据进行交叉验证成为可能。使用 Prophet 进行交叉验证的主要概念是:
- 训练数据(初始):为训练预留的数据量。该参数位于名为 initial 的 API 中。
- Horizon: 预留验证的数据。如果不定义周期,模型将符合 Horizon/2。
- 截止时间(周期):对截止时间和截止时间+时间范围之间的每个观察点进行预测。
得到的数据帧现在可用于计算 yhat 对 y 的误差度量。下面我用一些标记绘制了一个图表,帮助你以更直观的方式理解。在本例中,我们有一年的时间跨度,模型将对每个月(~31 天)进行预测。
图 9:显示训练期、截止期和水平期
获取性能指标
所以我们现在对先知图书馆做了第一次预测。但是我们怎么知道结果是否好呢?幸运的是,Prophet 提供了一些内置的性能指标来帮助我们。至于使用哪些指标,我就不赘述了,让您自己决定吧。可用的性能指标有:
- Mse: 平均绝对误差
- Rmse: 均方差
- 平均误差
- Mape: 平均百分比误差平均值
- Mdape: 中位数平均百分比误差
验证和收集性能指标的代码如下所示。首先,您需要获得交叉验证数据(我们已经在上面的代码清单中完成了,它是名为cv_df
的数据帧),然后我们将交叉验证数据帧放入 Prophet 方法perfomance_metrics
,就像这样:
列出性能数据框架可为我们提供以下信息:
清单 3:每天的性能指标。
要查看我们的模型在一段时间内的表现,我们可以使用名为plot_cross_validation_metric
的内置图表,如下所示:
这给出了下面的图:
图 10:随着时间的推移直观地查看交叉验证
我们看到我们得到了每天的天气预报。开始时,我们看到平均百分比误差 (mape)相当大,但几天后它也下降了很多。希望当我们开始调整我们的模型时,我们可以使这个图更有性能。
随着我们继续进行,我们希望比较我们的验证结果,所以我选择在一侧制作一个电子表格来存储中间结果。此外,由于我们使用转换后的数字(还记得 Box Cox),我们只使用百分比误差指标。为了保持跟踪,我们从交叉验证中收集平均聚合数据,如下所示:
df_p.mean()
它给出了这样一个列表:
清单 4:交叉验证数据的平均值
第一次运行后,结果电子表格如下所示:
图 11:第一次运行后的结果电子表格
在继续改进我们的预测模型之前,我们将添加两个效用函数,这样,如果我们想要测试不同的交叉验证设置,就不需要到处更改数据。它们看起来像这样:
改进我们的预测
添加假日
Prophet 有几种添加假日和特殊事件的方法。最简单方便的就是利用内置的国定假日。Python 中的假日包提供了每个国家的假日。他们的页面上有可用国家的列表,以及要使用的国家名称:【https://github.com/dr-prodigy/python-holidays.】T4 我们需要挪威假期,所以我们这样做:
最后一行代码列出了所有内置的假日,从表面上看,这个列表似乎是正确的,尽管它可能会增加平安夜或新年前夕等日期,但这是一个开始。如果我们想要查看假日回归所做的预测和影响,我们可以这样绘制它:
情节是这样的:
图 12:带有假日效应的绘图
如果我们查看交叉验证数据,我们可以看到该模型非常适合 5 月 1 日和 17 日,但 2018 年 5 月 30 日的提升日就不太适合了。此外,2018 年的升天日是在周四,这往往会让挪威人在周五休假。如果我们放大,我们可以在图中看到这一点。
图 13。放大五月份的日期
我们对圣诞款也没有什么特别的印象。如果我们放大 2019 年的图表,我们可以看到:
图 14:2019 年圣诞节的糟糕预测
幸运的是,先知给了我们添加自己的节日和特殊日期的机会。为了看看我们是否得到一个改进的预测,我们将为模型添加一些额外的日期来考虑。像这样:
对于升天日的日期,我已经设定了upper_window
。这意味着这一天的影响会延续一天,这样我们也可以在星期五捕捉到这种影响。对于圣诞节日期,我设置了下面的窗口,这样我们可以赶上挪威平安夜的前一天,上面的窗口可以赶上许多挪威人的整个圣诞节假期。我们现在可以安装一个新的模型,并添加新的节日效果。
新的地块显示出令人印象深刻的改进。下面你可以看到 2019 年圣诞节的剧情,现在已经完美拟合。
图 15:圣诞节非常合适
我们暂时离开假期,但在继续之前,让我们收集一些性能数据并更新我们的性能表:
getPerformanceMetrics(m).mean()
清单 5:更新的性能表
正如我们所看到的,假日调整具有显著的预测效果。现在,让我们添加一些额外的回归变量。
添加额外的回归变量
如果我们看看这个图,它看起来还不错,但是我们能改进我们的预测吗?记得我们有一些额外的天气数据吗?让我们看看添加那些作为额外的回归变量是否会有任何影响。添加额外的回归量非常简单,但是请记住,如果您要在预测模型中使用一些回归量,您需要事先准备好数据。有了天气数据,这可以通过天气预报来实现。依我看,你可以使用的最简单和最可靠的额外回归变量是你知道的假期和特殊日期,所以我鼓励你在这些方面做一些额外的工作。但是回到天气数据。我们可以像这样将降雨和温度数据作为额外的回归量添加到模型中(注意,只有两行代码发生了变化,但为了便于执行,我将整个清单都留了下来):
图 16:使用额外回归变量雨水和温度绘制的图
从图上看,很明显,降雨和气温都对天气预报有影响。让我们收集性能数据并更新我们的性能表:
getPerformanceMetrics(m).mean()
它开始看起来像什么了!我们的平均百分比误差现在低于 10%。
清单 6。更新的结果表
调谐超参数
Prophet 有相当多的参数供您调整。我不打算深入研究所有的细节,但下面你可以看到代码,你可以用来测试不同的超参数在一个循环中,然后选择最好的。请记住,如果您选择一次性测试所有参数,排列的数量将会很多,运行时间将会很长。我选择一次调优一个参数,并在注释中留下了我开始时使用的参数数组,供您自己尝试。
为了查看调整是否有任何效果,我们用新的参数集拟合了一个新模式,如下所示:
清单 7:更新的结果表
我们看到我们在 mape 指标上有所改进,尽管并没有那么多。从其他时间序列分析中,我看到了更好的结果,所以我想这总是值得一试。
绘制和验证整个模型
请记住,在开始时,我们列出了数学公式,表示我们的预测是趋势、季节性、假日等模型组件的总和。我们实际上可以验证这是真的。让我们首先从绘制所有组件开始。
导致了这个情节:
图 17:列出模型中的所有组件
Plotly 做了一个奇妙的图表工作,你可以通过点击右边的图例标签来切换不同组件的视图,以获得更好的可读性。
为了检查模型的预测实际上是其组成部分的总和,我们可以运行以下代码片段:
并得到这样的确认:
清单 8:确认模型是其各个部分的总和
进行实际预测
所以,我们暂时结束了。我们最不想做的事情就是做一个实际的预测。请记住,我们还必须对 Box Cox 变换后的数字求逆,方法如下:
确认秤已恢复并可用于现实世界。
图 18:用真实世界的数字绘图。
结论
在本文中,您已经学习了如何使用脸书先知库进行时间序列预测。我们已经了解了如何使用 Box Cox 变换,以及如何添加额外的回归变量和调整 Prophet 模型,以使性能越来越好。我们以大约 17%的平均百分比误差开始,以大约 9%结束,这是一个相当大的改进和有用的结果。我希望这篇文章对你有价值,并且你学到了一些可以在你自己的工作中使用的东西。
商业智能与新兴技术的数据工程相结合
原文:https://towardsdatascience.com/business-intelligence-meets-data-engineering-with-emerging-technologies-8810c3eed8b1?source=collection_archive---------14-----------------------
如何用新兴技术和十二种数据工程方法让 BI 变得更好?
如今,我们对不断增长的工具和框架、复杂的云架构以及快速变化的数据堆栈有了更多的要求。我听到有人说:“商业智能(BI)需要太长时间来整合新数据”,或者“理解数字如何匹配非常困难,需要大量的分析”。本文的目标是用数据工程领域的技术使商业智能变得更容易、更快、更容易获得。
在之前的一篇文章中,我指出了什么是数据工程,以及为什么它是商业智能和数据仓库的继承者。什么时候需要一个数据工程师,他在做什么。数据工程师工具语言 python 和 ETL 中的变化。在这篇文章中,我将重点关注 BI 中的挑战,以及如何用数据工程来解决它们。
商业智能的目标
但首先,让我们先讨论一下“BI 应该为我们做些什么?”
用我的话来说,BI 应该生成一个简单的业务概览,提高效率,并自动化整个组织的重复性任务。更详细地说:
- 卷起能力——(数据)最重要的关键绩效指标(聚合)的可视化——就像飞机上的驾驶舱,让你一眼就能看到最重要的信息。
- 向下钻取的可能性 —从上面的高层次概述向下钻取非常详细的信息,找出某些事情没有按计划执行的原因。切片切割或 从不同角度旋转您的数据。
- 单一事实来源 —取代了多个电子表格或其他不同编号的工具,该流程是自动化的,并且对所有人都是统一的。员工可以谈论业务问题,而不是每个人都有的各种数字。报告、预算和预测会自动更新,并保持一致、准确和及时。
- 支持用户:借助所谓的自助 BI ,每个用户都可以分析他们的数据,而不仅仅是 BI 或 IT 人员。
商业智能问题
另一方面,BI 在速度和透明度方面存在一些实质性的问题。我试图总结我在作为一名从事 Oracle 和 SQL Server 工作的 BI 工程师和专家的职业生涯中了解到或听到的问题:
- 整合额外资源需要太长时间,和 BI 工程师超负荷工作。
—这就是为什么每个部门都使用互不关联的 Excel 电子表格创建数据仓库和分析的原因之一,这些电子表格总是过时,需要大量的操作和协调。
—缺乏速度是一个显著的缺点,可以通过 数据仓库自动化 来缓解。我在一篇关于数据仓库自动化的 Quora-post 或我的系列文章中总结了自动化可以减轻的更多细节。 - 透明性对于 BI 工程师以外的其他用户来说是个问题。只有他们能够看到转换逻辑的内部,这些逻辑大多隐藏在专有的 ETL 工具中。
- 商务人员或经理依赖商务智能工程师。没有简单的方法来访问 ETL 或获取任何实时数据。
- 商务智能部门使得成为变得更加复杂。给人的印象总是它不应该如此复杂。对我们来说,所有的转换都很清楚,业务逻辑清理、星型架构转换、性能调整、使用大数据,等等。但是对于非双语者来说,这很难理解。
- 处理困难(semi-)非结构化 数据格式如 JSON、图像、音频、视频、电子邮件、文档等。
—这归结为 ETL,加载前转换,传统上是一个数据仓库,而 ELT(首先将数据加载到存储中,并且仅在决定如何处理它之后)—也称为写时模式与读时模式。ELT 为您提供了速度上的显著优势,这是更现代的数据湖或 NoSQL 数据库所能做到的。如果你想知道更多关于数据仓库和数据湖(ETL 和 ELT)的区别,我推荐我之前的帖子。
—另一点是,切片和切块是在聚合数据上完成的,上面提到的非结构化数据实际上做得不好。
—最重要的是,这些非结构化数据延长了夜间 ETL 作业的时间,因为它们需要更长的处理时间。 - 一般数据每天只提供一次(传统上)。我们在私人生活中实时获取一切,每个人对现代 BI 系统都有同样的要求。
这个列表无论如何都是不完整的。此外,是否可以通过特殊的解决方案(例如,云解决方案使用 SnowflakeDB 和 Variant 数据类型用于半结构化数据)或不同的方法(使用 data vault 用于快速集成)来缓解任何问题。然而,成见根深蒂固,据我所知,依然存在。
数据工程方法
因为我自己也遇到了这些瓶颈,最近更频繁地,我问自己:“我们如何:
- 让 BI 更容易?
- 对所有人透明?
- 毫不费力地更改或添加新数据或转换,但仍然有一些治理和测试?
- 在即席查询中快速探索和分割您的数据?
- 有更频繁的数据加载?
- 简化所有精通数据的人的转换过程,而不仅仅是相关的 BI 工程师?
- 顺利扩展额外的机器学习能力?
我知道现在发生了很多事情,尤其是围绕开源工具和框架、数据操作和使用容器编排系统的部署等等。
然而,我试图收集一些方法,帮助我使这个复杂的结构更加开放,并减轻整体体验。有些在短期内会变得更加复杂,但随着时间的推移,会变得更加精简和简单。你可以分别应用它们,但是你用得越多,整体的流动就越明显。
"使用数据湖."
让我们从第一个开始:使用数据湖或湖屋代替数据仓库(DWH)。这为您提供了速度、拥有(半)非结构化数据的能力,并在转换期间定义模式(ELT 而不是 ETL)。同时,它将为你提供高透明度,因为数据被存储到一个开放的数据湖中,供每个人访问或分析。添加新栏目或与同事分享数据很容易。您可以使用广泛的分布式计算,如 Spark SQL 或 Presto 通过即席查询即时探索、连接和转换您的数据。
数据可用性很快,不需要每天晚上进行批处理,因为数据首先会被存入湖中。它可能还不干净,但是您可以直接开始探索并添加转换来实现。一种常见的方法是在数据仓库前面添加一个数据湖。通过这种方式,您可以同时受益于两者,即湖中的即时数据,也可以在数据仓库的末端进行结构化和清理。
一个实际的概述很好地说明了所涉及的组件,这就是从数据湖之上的数据仓库到湖边小屋的演变。要注意的最重要的部分是 ETL,它也是整个数据工程的核心组件。您可以看到,它从隐藏在数据集市后面转移到数据湖体系结构,再转移到一个统一数据块中的主要转换层。
摘自“什么是湖畔小屋?” 由 数据块
你可以在我的 LinkedIn 帖子中找到更多从不同角度体现组件的数据架构,或者,有关数据仓库及其与数据湖的比较的更多信息,请查看我的早期博客帖子。
"使用事务处理."
为了支持数据湖中关系数据库的各种特性,您需要事务处理。幸好 三角洲湖泊 来救你了。 Delta 拥有许多令人敬畏的特性,如 ACID 事务、、保留一个** 事务日志 、SQL API 编写原生 SQL 作为插入、更新、删除甚至合并语句、open-format(【Apache Parquet**)、统一的批处理和流源与汇(no 关于 delta.io 的完整列表和更多信息。此外,查看苹果公司关于大规模威胁检测的优秀客户示例。
【2020 年 6 月三角洲湖泊的主要特征( 三角洲 io )
在数据湖中,我们通常有分布式文件,很难对它们进行结构化和整理。尤其是当您想要插入、更新或删除行时。Delta 有不同的 API,除了 scala 和 python,它还给了你 SQL API** (来自 Spark 3.0 on 或 in databricks ),在这里你可以很容易地在你的分布式文件上写一个 update 甚至 merge 语句。由于它由 Spark 提供动力,因此您可以完全规模化地完成这项工作。**
幕后是 rawApache Parquet,优化的柱状存储,高度压缩。这让你能够有效地直接从数据湖中查询数据。那里不需要初始转换。
随着缓慢变化的维度(SCD)在某些情况下仍然是一件事,达美航空有时间旅行来解决这个问题。这类似于我们早期所做的快照。但这一次,与固态硬盘相比,Delta 使用了相当便宜的 blob 存储,而不是每天或每月的快照,Delta 将每一批更改存储为一个单独的版本。这给了你及时回到旧版本的能力,以防你错误地删除了一些东西,或者如果你需要分析指向特定的版本。只要设置了保留时间,就会出现这种情况。
这些更改和快照存储在由 Delta 维护的事务日志中。除了时间旅行,这是一种变更数据捕获(CDC ),根据表跟踪所有变更。您可以看到哪些文件受到了影响,什么操作,谁做的等等,以及每个事务的情况。这是以 JSON 格式单独存储的。事务数据也可能变得很大,Delta 每十次提交就创建一个检查点文件,其中包含表在某个时间点的完整状态,采用 Parquet 格式,对于 Spark 来说读取起来既快又简单。****
"少用代理键,而是回到每个人都理解的业务键."
在数据仓库中,通常的做法是使用代理键通过单个人工键来寻址一行。当这对于支持维度模型并确保一个行键有一个惟一的 ID 是有意义的时候,在数据湖中你不需要这样做。我认为应该尽可能地减少它让数据读取在理解和交流方面变得更加复杂。代理键是随机 id,对任何人都没有意义(这也是为什么大多数时候在后台使用或看到的原因)。
在契约式分布式系统中,随着数据变得越来越大,在整个数据集上拥有唯一的键不再实用。尤其是并行,很难并行化的同时还具有唯一性。最好使用散列键来缓解这个问题。缺点是,它们更长,可读性更差。那么,为什么不回到您的源系统已经为您生成的业务密钥 (BK,也称为自然密钥)呢?业务键已经被每个人所理解,在某种程度上是唯一的(作为源系统中的序列创建),在数据集的生命周期中保持相同的值,因此可以一直追溯到进行跟踪和比较。
当然,代理键有很大的理由。它们在某些方面给了我们很大的优势,但代价是什么呢?我们需要做大量的工作来确保事实的正确粒度,并使用唯一的 ID 作为一行的代表来合并和清理维度。但同样,在数据湖中,我们的规则更少,也更不严格。例如,我们可以首先创建副本,然后只清理和删除它们。
这个话题也与“Kimball 在现代数据仓库中是否仍然相关?”这个问题密切相关和“规格化及其范式?”。至于后者,就存储而言,它不再像 blobs 和类似存储那样重要,但对于分析目的仍然有效。要了解更多细节和见解,我鼓励你去看看西蒙·怀特利关于这个话题的博客帖子。
“使用笔记本来打开数据仓库。”
使用笔记本** ( jupyter , zeppelin , databricks ) 每个人都可以访问数据,可以探索和编写所有高级统计和数据科学库的分析。设置很简单,不需要安装本地环境或 IDE,它可以与你选择的浏览器一起工作。你可以通过快速分享链接来传播你的观想。也可以在同一个笔记本上一起工作。通过整合降价,你可以自然地向人们解释数字背后的整个故事和思维过程。**
笔记本的 缺点是你的代码会被复制并分散在各处。有点像每个人都有自己的擅长,每个人都会开始自己的笔记本(但当然不同的数据,因为数据是集中存储的)。我建议您围绕笔记本电脑制定严格而明确的规则或管理,并开始将稳定的笔记本电脑集成到您的公共数据管道中。
为了快速平稳地过渡,您应该看看 papermill ,它允许您参数化、执行和分析笔记本。甚至更进一步,使用** dagster ,或者使用笔记本作为你的管道 (dagster 与 papermill 集成)的一个步骤,或者用专用的实体将其完全纳入你的管道。这样,您可以避免代码重复和重用实体。**
"使用 python(和 SQL,如果可能的话)."
**Python 就是这几天数据工程师**的 工具语言 。当然还有 golang 、 javascript 、 scala 等流行语言,但是在简单性和多用途能力(数据科学、web 等)方面,python 还是很难被打败的。SQL 再次获得了更多的关注,这是非常受欢迎的。尽管如此,SQL 永远也做不到面向对象编程语言正在做的事情,这就是为什么我认为 python 会在构建数据管道方面停留很多年。
因此使用用 python 编写的框架或工具来编码你的管道。笔记本已经支持 SQL 和 python,但它们不支持组织或编排。更好的方法是使用像广受欢迎的和众所周知的阿帕奇气流这样的工具。街区里有新的孩子(一如既往),他们很有前途,其中一个就是上面提到的达格斯特。如果你感兴趣的话,在我的 Quora 小回答中有更多关于气流的常见替代品。
“使用开源工具。”
每个人都可以免费获得开源软件,不涉及任何许可,并且很容易立即开始使用。在购买一个闭源项目或产品之前,不存在需要整个团队讨论的供应商锁定。
另一方面,一个开源工具很少单独出现,要适应和评估开源动物园中你最喜欢的工具和应用程序可能会很累。此外,你需要跟进那些可能出现的对你有价值的永无止境的版本或错误修复。这里的想法是,你可能通过其他公司或一些好的咨询公司的一些建议,知道使用哪些工具。并且对沿途的尝试保持开放,因为你没有被锁定,你可以随时替换或适应稍后的。学习过程与首先选择正确的工具一样有价值。
大数据与人工智能 2018 年展望作者 马特图尔克 摘自 伟大的力量,伟大的责任
你也可以选择一种中间的方法,像Databricks用于 Spark 和机器学习功能。您可以在瞬间启动并运行,而自己却被锁在半路上。借助 Spark 和笔记本电脑这两种开源技术,您可以随时切换到您的集群。你失去了高级功能和速度,你也可以购买并在以后添加。
我在之前的 帖子 中收集了一个实际例子,其中我使用开源技术构建了一个完整的数据仓库。那次是在 2018 年,当时没有 Delta Lake 和上面提到的其他工具,因为当时没有发布。我用了阿帕奇气流、阿帕奇德鲁伊和阿帕奇超集。
"加载增量和等幂."
与传统数据仓库的夜间加载相比,我们需要增量加载。这使得你的数据更加模块化和易于管理,尤其是当你有一个星型模式的时候。事实表只能追加,维度只需要扫描最新的事务,而不是整个事实表。
使用增量方法,您从批处理切换到事件驱动。您的更新和插入是独立的,您可以获得自治的批处理。如果您成功切换,您将获得一个近乎实时的分析解决方案,您可以对这些批次进行扩展和并行处理。
另一种方法是加强幂等性,这对于管道的可操作性至关重要,主要有两方面的帮助。它保证您可以重新运行您的管道,并且每次都会产生相同的结果。另一方面,数据科学家和分析人员依赖时间点快照并执行历史分析。这意味着您的数据不应该随着时间的推移而变化。否则,随着时间的推移,我们会得到不同的结果。这就是为什么管道应该被构建为在以相同的(业务)逻辑和时间间隔运行时再现相同的输出。这被称为幂等性,用于函数式编程,它是幂等性的角色模型。
事件驱动和增量加载的一个很好的副作用是,你可以消除λ架构 。 一个用于批处理和流的单一数据流,其与三角洲湖完全一致。具有集成选项微批处理的 Spark 结构化流非常适合这一目的。这样,您可以从两个方面受益,因为您可以进行流式处理,并且可以将延迟设置为 0,但也可以降低处理速度。例如,当您每小时有一个批处理来减少查找维度或特定聚合的开销时,您需要为每个流执行其他操作(这也可能需要时间)。****
"不要以传统的 DDL 方式改变结构."
每个处理数据的人都知道更改数据类型或重命名列是多么痛苦。有一个完整的依赖链,有很多没有真正价值或影响的工作。使用上面的增量和等幂模式,您可以免费得到它。这意味着您的更改不是重命名或更改某个字段的业务逻辑,最好是添加新字段,并在稍后 更改您的管道和分析,而不破坏任何东西。
通过使用 Delta Lake,您还可以获得模式进化和乐观并发,这两者都可以帮助您解决这个问题。因为第一个会自动更新模式更改,而不会破坏任何东西。第二个将确保两个或更多的用户可以更新同一个数据集而不会失败,只要不同的列和相应的数据不会被同时更改。
"使用容器编排系统."
Kubernetes 已经成为云原生应用的事实上的标准,用于(自动)横向扩展(水平而非垂直)和快速部署开源动物园,独立于云提供商。这里也没有锁定。你可以使用开放式换档或 OKD 。在最新版本中,他们增加了operator hub从今天开始,你只需点击几下就可以安装 133 个项目。安装起来复杂的数据库和机器学习应用程序变得非常简单。
Kubernetes 的更多原因是从基础设施即代码向基础设施即数据的转变,具体来说就是 YAML 。Kubernetes 中的所有资源,包括 pod、配置、部署、卷等。,可以简单地用 YAML 文件表示。开发人员快速编写跨多个操作环境运行的应用程序。可以通过缩减规模(例如使用 Knative 甚至到零)来降低成本,也可以通过使用普通 python 或其他编程语言来降低成本,而不是为 Azure、AWS、Google Cloud 上的服务付费。通过模块化和抽象化,以及使用容器( Docker 或 Rocket ),它的管理变得很容易,并且您可以在一个地方监控您的所有应用程序。
"使用声明式管道而不是命令式管道."
与 Kubernetes YAML 文件一样,你开始描述性地工作,意味着你定义应该做什么而不是如何做。同样,我们应该致力于在数据管道中消除 Dag 中的 how(胶水),只声明 what。工具、框架和平台应该注意如何做。****
统一数据管道解决方案 Ascend 的创始人肖恩·纳普引用道:“声明式编程是一种表达计算逻辑而不描述其控制流的范式……试图通过描述程序必须完成的事情来最小化或消除副作用。”查看他关于智能编排:数据缺失的环节的精彩演讲中的更多细节。
陈述性 vs 命令性 by 肖恩·纳普&ascend . io摘自 智能编排
这可能是显而易见的,但很难实现。这就是为什么 Ascend 提供了一个卓越的一体化平台,让你可以做到这一点。它为你理清了所有的方法,而你关注的是什么。
如果碰巧你没有这样的平台,你可能需要一个支持它的架构。我会说,这不是自然而然的事情,你需要围绕这个范式来构建。但是更快的周期和更多的解决问题的方法可能是值得的。
管道编排的演变
快速概述我们在流程编排和管道工具类型方面的进展:
- 从所有调度工具之母 cron 到更
- 更多的图形 ETL 工具,如 Oracle OWB 、 SQL Server 集成服务、 Informatica 等等
- 以代码为中心的工具,如气流、路易吉、 Oozie
- 到 python 框架如提督、 Kedro 、 Dagster 甚至完全 SQL 框架 dbt
- 到声明管道完全管理到 Ascend 、 Palantir Foundry 和其他数据湖解决方案
如果您感兴趣,可以查看 令人敬畏的管道列表 。在我看来,如果你对目前最流行的 Apache 气流的替代品感兴趣,可以看看常见的气流替代品。
"使用数据目录拥有一个中央元数据存储."
数据目录是一个集中的存储器,里面存放着你所有的元数据数据。现在与元数据存储、数据发现或类似的同义词。这是至关重要的,因为有了数据湖和其他数据存储库,你需要保持一个概览和搜索数据的能力。
Lyft 提供了一个完美的例子。他们在一个名为阿蒙森的数据目录上实现了一个应用程序。Amundsen 不仅显示了可用的数据集,还显示了谁在哪一年创建了它。此外,关于多少行、最小/最大条目等的元数据。如果支持连接的数据库,将显示一个关于表。它甚至整合了一个评级系统,用户可以对一个数据集给出反馈,让你感受一下数据质量以及使用这个数据集的有效性。
最重要的是,Amundsen 将数据集与仪表板和笔记本连接起来,以显示特定数据集在其中的哪些地方被使用过。这避免了重复工作,并且您可以很快找到数据问题的答案。
Ammundsen 2019 年 4 月 2 日的一个例子,发布在“ Lyft 的数据发现&元数据引擎作者 Mark Grover
“如果你没有开发人员或时间,就使用闭源软件。”
由于上面提到的并非都是在一天之内构建的,如果没有必要的团队或财务,可能不会如此温和,所以我还包括了封闭源代码的平台即服务(PaaS) 解决方案,这些解决方案会让您付出一定的成本,但会立即提供开箱即用的所有优势。我自己使用的两种解决方案是提到的 Ascend 或 Palantir Foundry 。肯定还有更多,如果你知道任何真正的,让我知道。
对于更具体的解决方案,我看到以下几点:
- 如果使用(slice and dice 即席查询),从 Imply.io 中选择一个托管德鲁伊集群。
- 如果需要云数据仓库,选择雪花 DB 。****
- 如果你已经有许多不同的系统,并且你想把它们整合在一起,选择数据虚拟化解决方案 Dremio ,它使用 Apache Arrow 作为动力。
- 如果你主要想关注仪表盘和报表,选择 Looker 或 Sisense ,这给你一个托管立方体类型的解决方案。
在我之前的帖子中也可以看到一个更完整的列表,其中包含更多替换立方体的选项(尽管从 2018 年 11 月起不再完全更新)。
结论
我们已经看到,商业智能的目标是生成业务和组织范围的概览,以及创建透明、处理非结构化数据格式或实时数据可用性的数据仓库的最具挑战性的问题。然后我们如何用十二种新兴的数据工程技术和方法来解决它们。
我希望这些方法是有帮助的,并将解决您的 BI 系统的一些挑战。或者帮助您构建数据架构,或者降低一些复杂性。做这一切是一项相当大的工作。然而,如果你开始挑选对你最相关的,我想你是在正确的道路上前进。可能也是最大的优势是,您的架构将面向未来,并为大数据和云原生解决方案做好准备。
如果你既没有时间也没有资源,你可以选择一个闭源平台作为服务,就像我们在最后一种方法中看到的那样,这也很好。从长远来看,这将增加您的成本,但是您可以立即开始运行。
要查看实际使用的工具,请查看我的实践帖子在 20 分钟内构建一个数据工程项目。暂时就这样了。让我知道你对此的想法,你有什么工具和框架来解决一些挑战?我将感谢你的评论。
**原载于 2020 年 6 月 14 日sspaeti.comT22。
借助 Power BI 实现商业智能可视化
原文:https://towardsdatascience.com/business-intelligence-visualizations-with-power-bi-fcc4ccc5a906?source=collection_archive---------36-----------------------
我准备了一份在 Power BI 中显示可视化的详细指南,Power BI 是数据爱好者的必备工具。
照片由 卢卡斯 发自 Pexels
“当一幅画迫使我们注意到你从未想过会看到的东西时,它就获得了最大的价值。”— 约翰·图基
数据可视化是信息和数据的图形化表示。通过使用图表、图形和地图等可视化元素,数据可视化工具为解释和理解数据中的趋势、异常值和模式提供了一种便捷的方式。在大数据和海量信息需要处理的背景下,数据可视化软件应运而生,并成为一种重要的工具,使数据分析师能够以更简单、更快速的方式深入了解他们正在处理的数据。
可用于实现相同目标的其他工具包括编程技能,它允许我们构建更灵活和定制的功能,但代价是在这种个性化的可视化上花费更多时间。如果您对使用编程技巧进行数据可视化感兴趣,可以看看我写的一篇关于这个主题的文章:
[## 用 Python 实现商业智能可视化
我准备了一份详尽的指南来展示漂亮的可视化效果,以增强度量、KPI、预测和其他…
towardsdatascience.com](/business-intelligence-visualizations-with-python-1d2d30ce8bd9)
在这篇文章中,我包含了一个关于如何利用微软提供的商业分析服务 Power BI 来准备我们的数据可视化分析的广泛指南。请和我一起做这个实用的解释!
目录:
1.Power BI 简介。(2 分钟读取)
2.你为什么要用它?(2 分钟读取)
3.绘图类型(5 分钟读取)
1.介绍
Power BI 是微软的一项商业分析服务。它旨在提供交互式可视化和商业智能功能,其界面足够简单,最终用户可以创建自己的报告和仪表板。
本质上,它由一系列软件服务、应用程序和连接器组成,它们协同工作将不相关的数据源转化为连贯的交互式洞察。数据可以存储在 Excel 电子表格、基于云的环境或数据仓库中,并且仍然可以从 Power BI 中访问,以便于分析。
Power BI 由一组协同工作的应用程序组成,让您能够创造和利用业务洞察力。最常用的三种是:
- 一款名为 Power BI Desktop 的 Windows 桌面应用。
- 一个叫做 Power BI service 的在线软件服务。
- 面向 Windows、iOS 和 Android 设备的 Power BI 移动应用。
使用 Power BI Desktop 创建的示例仪表板
Power BI 中的一个常见工作流是从连接到中的数据源并构建一个报告开始的。之后,继续将该报告从 Power BI Desktop 发布到 Power BI 服务,以便能够与其他业务用户共享,这样他们就可以查看该报告并与之交互。
为了开始使用它,请在此链接中下载 Power BI 桌面应用程序,在选择该应用程序后,您将直接被发送到 Microsoft Store。
2.你为什么要用它?
一旦下载了应用程序,您就可以立即开始使用它。您首先看到的是主画布,其中的数据可以通过拖放系统进行可视化浏览,该系统可以在各种现代可视化中选择绘图类型,并可以轻松地从导入的文件或数据库中选择数据要素。
在下图中,我展示了如何轻松拖动选定的绘图类型,并将确定的要素作为值和标签包含到该绘图中:
画布和条形图示例
Power BI 最有用的特性之一是,它支持从多个来源提取数据并进行连接,这与其他 Microsoft Office 软件包工具(如 Excel 或 PowerPoint)不同,例如
它不仅有几个数据源,而且允许来自不同来源的数据在探索过程中进行交互,以获得进一步的见解。
这可以通过“主页”选项卡中的菜单栏索引,选择获取数据小部件来完成。一些最有趣的信息来源是 excel 和。CSV 文件、Access、Oracle、Azure SQL 和 MySQL 数据库、Spark 和 Hive、Salesforce、GitHub 甚至 Python 脚本来获得与您的脚本的交互:
数据源
如果您有兴趣了解如何将 Python 应用于数据探索性分析,并对您的结论进行手动可视化配置,请查看我写的以下文章:
[## Airbnb 租房——使用 Python 分析纽约
发现最方便的租赁方式,以便继续实施具有良好可视化效果的数据分析。
towardsdatascience.com](/airbnb-rental-analysis-of-new-york-using-python-a6e1b2ecd7dc)
Power BI 的另一个有趣的特性是,它允许自动刷新已经存储的数据,以方便日常分析任务,如内部业务报告。
另一方面,除了提供各种不同的绘图类型,如折线图、条形图、饼图和堆积条形图,Power BI 还包括一个市场,在这里可以获得特定的和更复杂的绘图类型。看看一些可用的地块:
地块类型
3.地块类型
A.对比图
面积图,也称为分层面积图,是一种绘图类型,以类似于折线图显示数据的方式表示一个或多个量随时间的变化,并增加了变量体积的可视化表示。
当您想要显示一个变量随时间变化的趋势,但不太关心显示精确值时,例如公司全年的销售和费用变化,以及员工的生产率,面积图是一个很好的选择。
为了执行该图表,我们必须从可视化面板中选择面积图,并将所需的值和轴拖到画布上:
对比图
B.条形图
这种情节类型在我以前准备的文章中有广泛的解释。在开始实施 Power BI 之前,请随意从概念上回顾它们:
[## 用 Python 实现商业智能可视化—第 2 部分
作为第一篇文章的后续,我准备了一个广泛的指南,向已经…
towardsdatascience.com](/business-intelligence-visualizations-with-python-part-2-92f8a8463026)
为了在 Power BI 中执行这种图表,我们必须从可视化面板中选择条形图。
条形图示例
一旦我们将所需的值和轴拖到画布上,我们就可以继续处理图像的样式,包括修改标题、标签、背景颜色、条形颜色以及其他功能:
C.组合图
组合图是由折线图和柱形图组合而成的单一可视化图形。当您有一个具有相同 X 轴的折线图和柱形图时,以及当您想要比较具有不同数值范围的多个度量时,它们是一个很好的选择。此外,它们有助于在一个可视化中说明两个度量之间的相关性。
在下图中,我准备了一个样本图表,其中显示了总销售额(左侧 Y 轴以百万计)和每件产品平均价格(右侧 Y 轴以美元计)之间的关系,以及销售链的区别:
示例组合图
为了在 Power BI 中执行这种类型的图表,我们必须从 visualizations 面板中选择折线图和堆积柱形图,并完成带有月份的轴字段,带有突出显示的独特功能的系列,在本例中是带有销售额和平均单价的列,以便通过折线图与总销售额进行比较。
D.圆环图
甜甜圈图类似于饼图,它显示了部分与整体的关系。唯一的区别是,中心是空白的,并允许标签或图标的空间。
在下图中,我准备了一个样本图表,其中显示了该品牌现有连锁店的总销售额分布情况:
圆环图示例
为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择圆环图,并在几个月内完成图例字段,并将总销售额信息拖动到值字段。之后,您可以根据自己的需要或喜好对情节进行定制:
在选择此图表来可视化某个度量值之前,请记住圆环图值的总和必须是 100%,并且太多的类别会使其难以阅读和解释
E.漏斗图
漏斗图是一种图表,通常用于表示流程的顺序连接阶段。最常见的应用程序是销售流程,因为它们显示每个阶段的潜在收入,并有助于确定组织中潜在的问题领域。
每个漏斗阶段代表总数的一个百分比。因此,在大多数情况下,漏斗图的形状像一个漏斗——第一个阶段最大,随后的每个阶段都比前一个阶段小。
样本漏斗图
在以下情况下,漏斗图是一个很好的选择:
- 数据是连续的,至少要经过几个阶段。
- 预计第一阶段的观察次数将多于后续阶段的观察次数。
- 我们想分阶段计算潜在收入。
为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择漏斗图,并用流程的不同阶段完成组字段,并将总销售额信息拖至值字段,以便它们在各个阶段之间进行分配。之后,您可以根据自己的需要或喜好对情节进行定制:
F.径向仪表图
辐射状仪表图有一个圆弧,并显示一个值,该值衡量朝着目标或关键绩效指标 (KPI)的进度。线条(或指针代表目标或目标值,阴影代表朝着目标的进展。弧线内的值代表进度值。
在这种情况下,我代表的是与年平均总销售额相比的年初至今总销售额,年平均总销售额合计为 9000 万英镑,而年初至今合计为 4500 万英镑。
样本径向规
径向标尺是显示目标进度、代表百分比度量(如 KPI)或甚至显示单个度量的健康状况的绝佳选择。
为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择仪表图,并填写目标值字段和值字段,其中包含要比较的实际数字。
此外,您可以手动设置最小值和最大值。之后,您可以根据自己的需要或喜好对情节进行定制:
结论
根据本文中发布的指南和绘图类型,我希望能够帮助您提高使用 Power BI 创建可视化的技能。
这篇文章是与数据可视化相关的系列文章的一部分,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!
感谢您花时间阅读我的文章!如果您有任何问题或想法要分享,请随时通过我的电子邮件联系我,或者您可以在以下社交网络中找到我以了解更多相关内容:
- LinkedIn。
- GitHub 。
用 Python 实现商业智能可视化
原文:https://towardsdatascience.com/business-intelligence-visualizations-with-python-1d2d30ce8bd9?source=collection_archive---------5-----------------------
我准备了一个广泛的指南来展示美丽的可视化,以增强度量、KPI、预测和其他见解。
照片由 卢卡斯 发自 Pexels
为什么可视化值几千字?他们有讲述故事和简化信息解读的能力。他们帮助用户检测模式、洞察和度量,并因此构建更好的产品和服务。所以它们真的很重要。
可视化是数据分析师或数据爱好者可用的最强大的工具之一。为了方便他们的创作,已经开发了各种各样的软件和语言。也许可视化的有用性与我们的大脑自然给予图像的不同解释有关,而不是大的数据帧、数组或分配有数据的传统表格。
目录:
可视化的重要性。(2 分钟读取)
Python 绘图类型介绍(8 分钟阅读)
1.可视化的重要性
列表数据使结论提取变得复杂。从上下文中分离出来的数字,尽管被相应地组织成列和行,以提供结构和给用户定位,但是很难从中理解意义。另一方面,可视化表示一目了然的值。它们以一种简单的方式显示列表数据,方便快速地比较数值,有助于决策。
更重要的是金融、计量经济学、数据分析和其他数学相关领域的这些技能,在这些领域,决策是基于数字基础的,通常很难向不熟悉金融的团队成员解释清楚。
想象你自己是一个投资委员会的资产经理,解释你的数据驱动的资产配置方法,用机器学习算法创建一个优化的投资组合。作为研究的论证,可视化肯定会派上用场。
大数据和海量数据处理提高了从分析中提取的结论的复杂性。在这种背景下,用户友好的报告和其他定制的演示可以为特定的受众重新创建,具有特殊的价值。
在本文中,我不会将的重点放在专门设计的工具来产生可视化效果,如 Tableau、Qlik 和 Power BI 。这一类别的产品因功能和易用性而异,通常可以快速设置,使用户能够从多个来源访问数据。我将主要关注通过应用我们在 Python 中的编码技能,利用 Matplotlib 这是一个二维绘图库,它有一些简洁的工具,可以创建漂亮灵活的图形和可视化效果。
让我们看看数据解释是如何随着数据的使用而得到巨大改善的。看看这个数据图,包括不同类型的茶叶销售:
在下图中,您将看到它是如何通过 Matplotlib 条形图进行可视化显示的。显然,可以很快得出结论,例如销售最好和最差的茶类,中等销售的茶类,以及每种茶类的销售额之间的比较,一目了然:
2.Python 绘图类型简介
安装过程非常简单。只需打开您的终端并插入以下命令:
pip install matplotlib
A.线形图
安装完库之后,我们可以开始创建情节了。我们要创建的第一种类型是简单的折线图:
# Begin by importing the necessary libraries:
import matplotlib.pyplot as plt
假设您想使用以下输入数据绘制贵公司一周的支出与前一周的支出的对比图:
# Days of the week:
days = [1, 2, 3, 4, 5, 6,7]
# Money spend one week 1
money_spent = [1000, 1200, 1500, 1080, 1400, 1650, 1350]
# Money spend one week 2
money_spent_2 = [900, 1500, 1200, 1050, 950, 1250, 1000]# Create figure:
fig = plt.figure(figsize=(10,5))
# Plot first week expenses:
plt.plot(days, money_spent)
# Plot second week expenses:
plt.plot(days, money_spent_2)
# Display the result:
plt.title('Company Expenditure Comparison')
plt.legend(['First week', 'Second week'])
plt.show()
示例图—作者提供的图像
这个图可以用几行代码做一些很好的样式修改:
# Display the result:
ax = plt.subplot()
ax.set_xticks(range(1,8))
ax.set_xticklabels(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday',' Sunday'])
plt.title('Company Expenditure Comparison')
plt.legend(['First week', 'Second week'])
plt.show()
如果你想放大到一个特定的点,你可以使用 plt.axis 命令,输入 X 和 Y 轴所需的坐标:
plt.axis([1,3,900,1600])
支线剧情
Matplotlib 库提供了一种在单个图形上绘制多个图的方法。为了在一个图形中创建多个图,一般情况下,为matplotlib . py plot . subplots方法配置以下参数:
# Subplot creation
plt.subplots(nrows=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,gridspec_kw=None)
如果您没有插入这些默认设置的参数,请确保使用 plt.subplot 方法来指示要配置的子情节的坐标。参数:
- n 排:图中排的数量。
- ncols :图中列的数量。
- plot_number :图内支线剧情的索引。
例如,假设您希望使用以下输入数据来表示与同一时期的航班销售相关的全年温度,以便找出这些变量之间是否存在任何相关性:
# Temperature and flight sales
months = range(12)
temperature = [37, 38, 40, 53, 62, 71, 78, 74, 69, 56, 47, 48]
flights = [1100, 1300, 1200, 1400, 800, 700, 450, 500, 450, 900, 950, 1100]# Create figure:
fig = plt.figure(figsize=(12,6))# Display the result - Plot 1:
plt.subplot(1,2,1)
# Plot temperatures:
plt.plot(months,temperature,color='steelblue',linestyle='--')
# Configure labels and title:
plt.xlabel('Months')
plt.ylabel('Temperature')
plt.title('Temperature Representation')# Display the result - Plot 2:
plt.subplot(1,2,2)
# Plot flights:
plt.plot(months,flights,color='red',marker='o')
plt.xlabel('Month')
# Configure labels and title:
plt.ylabel('Flights Summary')
plt.title('Flights per month')
plt.show()
示例图—作者提供的图像
B.并排条形图
我将跳过简单条形图的可视化,专注于更多与业务相关的并排图表。条形图使用的基本命令是 plt.bar(x_values,y_values)。
并排条形图用于比较两组具有相同类型轴值的数据。并排条形图可能有用的一些数据示例包括:
- 一段时间内超过一个国家的人口。
- 一段时间内多家餐厅不同食物的价格。
- 男女生分班注册。
我们将使用以下信息来创建图表:
# Values for X axis bar separation:
x_values1 = [0.8,2.8,4.8,6.8,8.8,10.8]
x_values2 = [1.6,3.6,5.6,7.6,9.6,11.6]# Sales by month and labels:
drinks = ["cappuccino", "latte", "chai", "americano", "mocha", "espresso"]
months_sales = ['Jan','Mar','May','Jun','Aug','Oct', 'Dec']
sales_cappuccino = [95, 72, 53, 62, 51, 25]
sales_latte = [62, 81, 34, 62, 35, 42]
情节配置看起来像这样:
# Figure creation:
fig = plt.figure(figsize=(12,8))# Subplot configuration:
ax = plt.subplot()
ax.set_xticks(range(1,12,2))
ax.set_xticklabels(months_sales)# Bar plot creation:
plt.bar(x_values1, sales_cappuccino, color='gray')
plt.bar(x_values2, sales_latte, color='purple')# Display plot:
plt.title("Coffee Sales Comparison")
plt.xlabel("Types of coffees")
plt.ylabel("Pounds sold")
plt.legend(labels=drinks, loc='upper right')
plt.show()
C.堆积条形图
如果我们想比较两组数据,同时保留它们之间的总数,我们也可以堆叠条形,而不是并排放置。我们通过使用关键字底部来做到这一点。
例如,假设我们希望在不失去总销售额视角的情况下,按产品评估我们的销售分布情况:
# Product identification & Sales per product:
product = ['Computer', 'Keyboard', 'Headset', 'Mouse', 'Monitor']
sales_c = np.random.randint(1000,3000,5)
sales_k = np.random.randint(1000,3000,5)
sales_h = np.random.randint(1000,3000,5)
sales_m = np.random.randint(1000,3000,5)
sales_o = np.random.randint(1000,3000,5)# Configure bottoms to stack bars:
k_bottom = np.add(sales_c, sales_k)
h_bottom = np.add(k_bottom, sales_h)
m_bottom = np.add(h_bottom, sales_m)# Create figure and axes:
fig = plt.figure(figsize=(10,8))
ax = plt.subplot()# Plot bars individually:
plt.bar(range(len(sales_c)),sales_c, color='#D50071', label=product[0])
plt.bar(range(len(sales_k)),sales_k, bottom=sales_c, color='#0040FF',label=product[1])
plt.bar(range(len(sales_h)),sales_h, bottom=k_bottom, color='#00CA70',label=product[2])
plt.bar(range(len(sales_m)),sales_m, bottom=h_bottom, color='#C14200',label=product[3])
plt.bar(range(len(sales_o)),sales_o, bottom=m_bottom, color='#F0C300',label=product[4])# Display graphs:
ax.set_xticks(range(5))
ax.set_xticklabels(['Monday','Tuesday', 'Wednesday', 'Thursday', 'Friday'])
plt.legend(loc='best')
plt.title('Sales Distribution by Product')
plt.ylabel("Products Sold")
plt.show()
D.圆形分格统计图表
如果我们想将数据集的元素显示为整体的比例,我们可以使用饼图。在 Matplotlib 中,您可以使用命令 plt.pie 制作一个饼图,传递您想要绘制的值。
我们还希望能够理解饼的每一片代表什么。为此,我们可以:
- 使用图例标记每种颜色。
- 在图表上贴标签。
饼图的另一个有用的标签工具是添加每个扇区占总扇区的百分比。Matplotlib 可以用关键字 autopct 自动添加这个。此外,我将添加 explode 特性,该特性突出显示“饼图”的选定部分。
我将使用以下数据绘制图表:
# Sales and regions:
region = ['LATAM', 'North America','Europe','Asia','Africa']
sales = [3500,5500,4800,4500,2500]# Create figure and plot pie:
fig = plt.figure(figsize=(10,8))
plt.pie(sales, labels=region,autopct='%d%%', colors=colors,explode=explode_values)
plt.axis('equal')
plt.title('Global Sales Distribution', fontsize='20')
plt.savefig('plot_eight.png')
plt.show()
E.柱状图
直方图告诉我们数据集中有多少值落在不同的数字集合之间,例如有多少数字落在 0 和 10 之间? 这个问题代表一个可能在 0 到 10 之间的 bin。
直方图中的所有条块始终具有相同的大小:
- 每个面元的宽度是每个面元的最小值和最大值之间的距离。
- 每个容器由一个不同的矩形表示,矩形的高度是数据集中落在该容器内的元素数量。
命令 plt.hist 查找数据集中的最小值和最大值,并在默认情况下在这些值之间创建 10 个等距的条柱。如果我们想要 10 个以上的箱柜,我们可以使用关键字箱柜来设置指令。
我们面临的一个问题是,我们的直方图可能有不同数量的样本,使一个比另一个大得多。为了解决这个问题,我们可以使用 normed=True 来标准化我们的直方图。
在下面的例子中,我包括了一个信用评分案例,在这个案例中,我们希望看到分数是如何在两组客户之间分配的。我对直方图进行了裁剪,创建了 12 个区间,而不是默认的 10 个,并将 alpha 或透明度级别设置为 0.5,以便同时看到两个直方图,避免重叠分布。
F.堆积图
这种类型的图表在堆积图中绘制表格或时间表的变量,最多 25 个变量。该函数在单独的 y 轴上绘制变量,垂直堆叠。变量共享一个公共的 x 轴。
我将模拟三家公司在过去八年中市场份额的演变情况,并在堆积图中分别显示:
# Insert DataFrames:
year = pd.DataFrame(range(2013,2021),columns=['Year'])
volume1 = pd.DataFrame([1000,1100,1200,1250,1300,1350,1400,1450], columns=['Values 1'])
volume2 = pd.DataFrame([1000,900,800,700,600,500,400,300], columns=['Values 2'])
volume3 = pd.DataFrame([1000,950,900,850,800,750,700,650], columns=['Values 3'])# Create main frame:
frames = [year,volume1, volume2, volume3]
frame = pd.concat(frames,axis=1)# Plot axis, labels, colors:
x_values = frame['Year']
y_values = np.vstack([frame['Values 1'], frame['Values 2'], frame['Values 3']])
labels = ['Company A', 'Company B', 'Company C']
colors = ['skyblue', 'peru', 'gray']# Display plot:
fig = plt.figure(figsize=(10,8))
plt.stackplot(x_values, y_values, labels=labels, colors=colors ,edgecolor='black')
plt.title('Market Share Evolution',fontsize=15)
plt.ylabel('Share', fontsize=15)
plt.legend(loc='best')
plt.show()
G.百分比堆积图
该图表也称为百分比堆积面积图,显示每个数值所占百分比随时间或类别变化的趋势。
在这种情况下,我们将绘制与堆积图相同的信息,但会显示每家公司占总市场份额的百分比:
结论
根据本文中发布的指南和绘图类型,我希望能够帮助您增强数据分析技能,至少从数据可视化的角度来看是这样的。
这是与数据可视化相关的一系列文章的开始,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!
参考
- [1] Matplotlib 文档。
- [2] Matlab 文档— Mathworks
感谢您花时间阅读我的文章!如有任何问题、建议或意见,欢迎联系我:herrera.ajulian@gmail.com
用 Python 实现商业智能可视化—第 2 部分
原文:https://towardsdatascience.com/business-intelligence-visualizations-with-python-part-2-92f8a8463026?source=collection_archive---------20-----------------------
作为第一篇文章的后续,我准备了一个广泛的指南来显示已经介绍的情节的定制特性。
照片由 卢卡斯 发自 Pexels
“没有信息过载这回事。只有糟糕的设计。”
爱德华·塔夫特
数据可视化越来越被视为任何成功的数据驱动分析战略的必要步骤。此外,正如我在之前的文章中提到的,是数据分析师或数据爱好者可用的最强大的工具之一。因此,我们必须花时间来创建令人惊叹的图表和可视化效果,以仔细清晰地传达我们隐藏在结构化数据中的故事和发现。
上周,我们讨论了数据可视化的重要性,我介绍了不同的绘图类型,例如:
- 线剧情和支线剧情。
- 并排条形图。
- 堆积条形图。
- 饼状图
- 直方图。
- 堆积图和百分比堆积图。
[## 用 Python 实现商业智能可视化
我准备了一份详尽的指南来展示漂亮的可视化效果,以增强度量、KPI、预测和其他…
towardsdatascience.com](/business-intelligence-visualizations-with-python-1d2d30ce8bd9)
借此机会,我将为您提供更多关于如何使用 Python 和Matplotlib显示定制图表的见解,这是一个绘图库,提供了一些简洁的工具来创建漂亮而灵活的图表。
目录:
1.使用 Python 的其他绘图类型(8 分钟读取)。
2.格式化应用程序(2 分钟阅读)。
1.其他绘图类型
尽管这些图表类型包含在本系列的第二部分Python 商业智能可视化中,但它们的重要性并没有降低,因为它们补充了已经介绍过的图表。我相信你会发现它们比基本情节更有趣!
从本系列开始,我们必须安装所需的库:
# Imports
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
A.带误差线的水平条形图:
条形图是一种图表,使用矩形条呈现数据,矩形条的高度和长度与它们所代表的值成比例。条形图使用的基本命令是 plt.bar(x_values,y_values)。
此图中涉及的附加功能是误差线,误差线是数据可变性的图形表示。它们通常用于表示预期测量中的估计误差。
这一次,我们将使用以下输入数据绘制一个水平条形图:
# Input data for error bars and labels
mean_values = [1, 2, 3]
std_dev = [0.2, 0.3, 0.4]
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']
y_values = [0,1,2]
现在让我们用 plt.barh 命令绘制条形:
# Create bar plots
plt.yticks(y_values, bar_labels, fontsize=10)
plt.barh(y_values, mean_values, xerr=std_dev,align='center', alpha=0.5, color='red')# Labels and plotting
plt.title('Horizontal Bar plot with error', fontsize=13)
plt.xlim([0, 3.5])
plt.grid()
plt.show()
示例图—作者提供的图像
这种图的变化可以通过在条上插入标签或文本来实现。我们将使用以下输入数据来完成这项工作:
# Input data for error bars and labels
data = range(200, 225, 5)
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']
y_values = [0,1,2,3,4]
继续准备地块:
# Create bar plots
fig = plt.figure(figsize=(12,8))
plt.yticks(y_values, bar_labels, fontsize=15)
bars = plt.barh(y_values, data,align='center', alpha=0.5, color='orange', edgecolor='red')# Labels and plotting
for b,d in zip(bars, data):
plt.text(b.get_width() + b.get_width()*0.08, b.get_y() + b.get_height()/2,'{0:.2%}'.format(d/min(data)),ha='center', va='bottom', fontsize=12)
plt.title('Horizontal bar plot with labels', fontsize=15)
plt.ylim([-1,len(data)+0.5])
plt.xlim((125,240))
plt.vlines(min(data), -1, len(data)+0.5, linestyles='dashed')
plt.show()
示例图—作者提供的图像
B.连续条形图:
我们继续研究柱状图系列,在这种情况下,我们使用了一种变体来横向比较两组数据。创建此图的命令与创建水平条形图的命令相同,但其中一组数据的值为负值。
# Input data for both sets of data utilizing numpy arrays to negate one set:
X1 = np.array([1, 2, 3])
X2 = np.array([3, 2, 1])
y_values = [0,1,2]
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']
现在让我们用 plt.barh 命令和否定特性来绘制条形图:
# Plot bars
fig = plt.figure(figsize=(12,8))
plt.yticks(y_values, bar_labels, fontsize=13)
plt.barh(y_values, X1,align='center', alpha=0.5, color='blue')
plt.barh(y_values, -X2,align='center', alpha=0.5, color='purple')plt.title('Back-to-back Bar Plot', fontsize=13)
plt.ylim([-1,len(X1)+0.1])
plt.grid()
plt.show()
示例图-作者提供的图像
C.带高度标签的条形图:
此图表与前面显示的图表相同,只是它是垂直方向的,并且我添加了高度标签,以便更清楚地显示这种指标。这可以通过命令 ax.text. 来完成
此外,我介绍了 Matplotlib 中包含的方法 autofmt_xdate 来自动旋转标签。看一下代码 :
# Input information:
n_bars = [0,1,2,3]
values = [3000, 5000, 12000, 20000]
labels = ['Group 1', 'Group 2','Group 3', 'Group 4']# Create figure and plots
fig, ax = plt.subplots(figsize=(12,8))
ax.set_facecolor('xkcd:gray')
fig.patch.set_facecolor('xkcd:gray')
fig.autofmt_xdate()
bars = plt.bar(idx, values, align='center', color='peru', edgecolor='steelblue')
plt.xticks(idx, labels, fontsize=13)# Add text labels to the top of the bars
def rotate_label(bars):
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., 1.05 * height,'%d' % int(height),ha='center', va='bottom', fontsize=13)# Labels and plotting
rotate_label(bars)
plt.ylim([0, 25000])
plt.title('Bar plot with Height Labels', fontsize=14)
plt.tight_layout()
plt.show()
示例图—作者提供的图像
D.带颜色渐变的条形图:
让我们给等式加点颜色。在下图中,我介绍了名为 colormap 的内置模块,该模块用于为绘制的参数实现直观的配色方案。首先,我将继续导入:
import matplotlib.colors as col
import matplotlib.cm as cm
现在我将插入样本数据来绘制图表。如你所见,色彩映射表是通过scalar maptable类实现的,该类在从给定的色彩映射表返回 RGBA 颜色之前应用数据标准化。
为了澄清前面的陈述, RGBA 颜色与十六进制和 HSL 一起是一种数字颜色表示形式。十六进制是使用最多和最广为人知的,因为它是 6 位数的简单表示,可以产生红色、绿色、和蓝色。十六进制颜色表示的一个例子是 #123456 ,12 是红色,34 是绿色,56 是蓝色。另一方面, RGBA 颜色添加了一个新的因素,alpha,它是遵循相同百分比方案的不透明度或透明度:0%代表绝对透明度,100%代表绝对不透明度,这是我们传统上看到颜色的方式。更多详情在这个网站。
在 Matplotlib 文档的链接中,您将找到更多关于可供选择的不同色彩映射表的详细信息。为了有一个更清晰的视图,请看一下生成图的代码:
# Sample values
means = range(10,18)
x_values = range(0,8)# Create Colormap
cmap1 = cm.ScalarMappable(col.Normalize(min(means), max(means), cm.spring))
cmap2 = cm.ScalarMappable(col.Normalize(0, 20, cm.spring))# Plot bars
# Subplot 1
fig, ax = plt.subplots(figsize=(12,8))
plt.subplot(121)
plt.bar(x_values, means, align='center', alpha=0.5, color=cmap1.to_rgba(means))
plt.ylim(0, max(means) * 1.1)# Subplot 2
plt.subplot(122)
plt.bar(x_values, means, align='center', alpha=0.5, color=cmap2.to_rgba(means))
plt.ylim(0, max(means) * 1.1)
plt.show()
示例图—作者提供的图像
E.带图案填充的条形图:
现在,我们将使用条形图和模式填充为我们的数据表示添加一些样式。这可以通过使用 set_hatch 命令或在 plt.bar 配置中包含一个参数 hatch 命令来完成。
# Input data:
patterns = ('-', '+', 'x', '\\', '*', 'o', 'O', '.')
mean_values = range(1, len(patterns)+1)
y_values = [0,1,2,3,4,5,6,7]# Create figure and bars
fig, ax = plt.subplots(figsize=(12,8))
bars = plt.bar(y_values,mean_values,align='center',color='salmon')
for bar, pattern in zip(bars, patterns):
bar.set_hatch(pattern)# Labeling and plotting
plt.xticks(y_values, patterns, fontsize=13)
plt.title('Bar plot with patterns')
plt.show()
示例图—作者提供的图像
F.简单热图:
热图是数据的图形表示,其中的值用颜色表示。它们使复杂的数据可视化变得容易,并且一目了然。颜色的变化可能是由色调或强度引起的,给读者关于所表示的值如何分布的明显视觉提示。
在这种情况下,颜色的变化表示在特定值范围内聚集的观察值的数量,这是通过 Matplotlib 的颜色条功能实现的。此外,该图是用命令 plt.hist2d. 创建的二维直方图绘制的
在下面的代码中,我创建了两个正态分布的变量 X 和 Y,平均值分别为 0 和 5。
当你绘制 2D 历史时,你会看到一个 2D 直方图。把它想象成从“顶部”看一个直方图。除此之外,为了更清楚地了解颜色分布,请考虑位于 2D 直方图中心的颜色是淡黄色的,并且对应于颜色条的最高值,这是合理的,因为 X 值应该在 0 处达到峰值,Y 值应该在 5 处达到峰值。
# Input a sample of normally distributed observations centered at x=0 and y=5
x = np.random.randn(100000)
y = np.random.randn(100000) + 5# Create figure, 2D histogram and labels
plt.figure(figsize=(10,8))
plt.hist2d(x, y, bins=40)
plt.xlabel('X values - Centered at 0', fontsize=13)
plt.ylabel('Y values - Centered at 5', fontsize=13)
cbar = plt.colorbar()
cbar.ax.set_ylabel('Number of observations', fontsize=13)
plt.show()
示例图—作者提供的图像
G.阴影饼图:
饼图用于将数据集的元素显示为整体的比例。除了传统的 plt.pie 命令之外,我们将利用 shadow=True 布尔特性为饼图的切片带来一些样式。
# Create figure and plot the chart:
plt.figure(figsize=(10,8))
plt.pie((10,5),labels=('Blue','Orange'),shadow=True,colors=('steelblue', 'orange'),
explode=(0,0.15),
startangle=90,
autopct='%1.1f%%'
)
plt.legend(fancybox=True, fontsize=13)
plt.axis('equal')
plt.title('Shadowed Pie Chart',fontsize=15)
plt.tight_layout()
plt.show()
示例图—作者提供的图像
2.格式化应用程序
一旦可视化被创建并包含在我们的分析中,是时候学习如何修改我们的图的格式了。我们可以实现各种颜色、线条样式、颜色渐变,甚至标记。
A .颜色格式定义
看一下下面的代码,其中我实现了三种不同的替代方法来显示我们想要的简单线图的颜色,在本例中是红色。
# Input sample data
sample_values = [1,2,3]# Create figure, plots and labels
fig,ax = plt.subplots(figsize=(12,9))
ax.set_facecolor((0.,0.,0.))
plt.plot([0,10], [0,1], lw=3, color=(1.0,0.0,0.0))
plt.plot([0,10], [0,2], lw=3, color='red')
plt.plot([0,10], [0,3], lw=3, color='#f54842')
plt.legend(['RGB values: (1.0,0.0,0.0)',"matplotlib names: 'red'","HTML hex values: '#f54842'"],loc='upper left')
plt.title('3 ways to define colors', fontsize=13)
plt.show()
示例图—作者提供的图像
B.Matplotlib 中的可用颜色
另一方面,我们可以利用已经提到的 RGBA 格式显示 Matplotlib 可用颜色的样本,例如以下命令:
# Sample colors
colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'white']
numbers = [1,2,3,4,5,6,7,8]# Create figure, plots and labels
plt.figure(figsize=(10,8))
for n, col in zip(numbers, colors):
plt.plot([0, 10], [0, n], label=col, lw=3, color=col)plt.legend(loc='upper left')
plt.title('Matplotlib Sample Colors', fontsize=13)
plt.show()
示例图—作者提供的图像
C.渐变颜色
此外,我们可以使用应用 RGBA 格式的渐变颜色样本来执行我们自己的线图:
# Input data
gradients = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]# Create figure, plots and labels
plt.figure(figsize=(10,8))
for i in samples:
plt.plot([0, 10], [0, i], label='gray-level %s'%i, lw=3, color=str(i)) # ! gray level has to be parsed as string
plt.legend(loc='upper left')
plt.title('Gray Gradients with RGBA Formatting')
plt.show()
示例图—作者提供的图像
D.标记样式
标记样式是 Matplotlib 工具包的另一个有趣的特性,它可以很好地格式化我们的可视化效果:
# Markers
marker_name = ['point', 'pixel', 'circle', 'triangle down', 'triangle up', 'triangle_left', 'triangle_right','tri_down', 'tri_up', 'tri_left', 'tri_right', 'octagon', 'square', 'pentagon', 'star', 'hexagon1','hexagon2', 'plus', 'x', 'diamond', 'thin_diamond', 'vline']markers = ['.', ',', 'o', 'v', '^', '<', '>','1', '2', '3','4', '8', 's','p', '*','h', 'H','+','x','D','d', '|']samples = range(len(markers))# Create figure, plots and labels
plt.figure(figsize=(13, 10))
for i in samples:
plt.plot([i-1, i, i+1], [i, i, i], label=marker_name[i], marker=markers[i], markersize=11)
plt.title('Matplotlib Marker styles', fontsize=20)
plt.ylim([-1, len(markers)+1])
plt.legend(loc='lower right')
plt.show()
示例图—作者提供的图像
E.样式表选择
Matplotlib 的样式包增加了对预定义的易于切换的绘图样式表的支持,例如“ ggplot ”,这是 r 中流行的绘图包的模拟。以下是所有可用样式的列表:
设置样式表有两种方法,第一种是通过使用 plt.style.use 函数将其全局设置到我们的编码环境中。
# Setting style globally
plt.style.use('ggplot')# Data input
x = np.arange(10)# Create figure, plots and labels
plt.figure(figsize=(10,8))
for i in range(1, 4):
plt.plot(x, i * x**2, label='Group %d' % i)
plt.legend(loc='best')
plt.title('Style sheet formatting', fontsize=13)
plt.show()
示例图—作者提供的图像
第二种方式是通过上下文管理器,它只将样式应用于特定的代码块:
# Data input
x = np.arange(10)# Create figure, plots and labels with the context manager
with plt.style.context('fivethirtyeight'):
plt.figure(figsize=(10,8))
for i in range(1, 4):
plt.plot(x, i * x**2, label='Group %d' % i)
plt.legend(loc='best')
plt.title('Style sheet formatting', fontsize=13)
plt.show()
示例图—作者提供的图像
结论
根据本文中发布的指南和绘图类型,我希望能够帮助您提高使用 Python 和 Matplotlib 创建可视化的技能。
这是与数据可视化相关的一系列文章的第二部分,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!
感谢您花时间阅读我的文章!如果您有任何问题或想法要分享,请随时联系我的电子邮件,或者您可以在以下社交网络中找到我以了解更多相关内容:
- 领英 。
- GitHub 。
参考
- [1] Matplotlib 文档。
- [2] 色彩映射表应用。
- [3]六角彩色工具文档。
失败的假设
原文:https://towardsdatascience.com/busted-assumptions-3e224b7706eb?source=collection_archive---------34-----------------------
如何使用 Python 检查回归假设
图片由来自 Pixabay 的 Gordon Johnson 提供
资料组
我们将在本教程中使用的数据集来自 Kaggle 的“房价:高级回归技术”竞赛(链接),因为我目前正在提交我的结果。由于这是一个回归问题,我们的任务是预测房价,我们需要检查我们是否满足回归背后的所有主要假设
一般来说,如果你违反了这些假设中的任何一个,那么从你的模型中得到的结果可能会非常误导人。违反某些假设比其他假设更严重,但我们应该非常小心地正确处理我们的数据。
OLS 回归
在检查回归背后的许多假设之前,我们首先要拟合一个回归模型(在我们的例子中是 OLS)。这是因为许多假设检验依赖于计算的残差或我们模型中的误差。残差只不过是实际值和预测值之间的绝对距离。记住这一点也很重要,我拟合到回归模型的数据已经过彻底处理,包括输入缺失值、移除异常值、处理高基数和低基数、转换偏斜(要素和目标)、目标编码分类要素,以及使用 StandardScaler()进行标准化。
X = sm.add_constant(X_train_df)
y_train = y_train.reshape(-1,1)
model = sm.OLS(y_train, X)
results = model.fit()
print(results.summary())
首先,我们添加一个常数来指定初始截距值。在拟合模型时,我们的 y_train 值需要是 2D 数组而不是 1D。最后,我们拟合数据并打印结果。我不想解释结果表。
回归假设
线性:线性回归假设目标与每个独立变量或特征之间存在线性关系。这是最重要的假设之一,因为违反这一假设意味着您的模型试图在非线性数据中找到线性关系。这将导致你的模型严重不符合你的数据。检查异常值也很重要,因为它们会对这一假设产生重大影响。
我们可以对目标和/或独立变量应用变换来纠正问题。在我将注意力转向目标之前,我通常首先转换特征。不幸的是,应用转换的过程本质上是反复试验。应用对数、平方根、指数和 boxcox 变换是我的第一道防线。此外,我发现在添加多项式特征以更好地捕捉非线性关系方面取得了一些成功。
实际值和预测值的散点图通常用于检查线性。我们希望看到实际值和预测值紧密地分散在回归线周围。我们还可以生成一组显示每个特征和目标之间关系的配对图。但是,这种方法非常耗时,而且容易混淆,尤其是当您有许多功能时。我更喜欢先绘制实际值与预测值,如果我发现有大量违反这一假设的情况,我将使用 pairplot 方法来确定哪些特征破坏了我的假设。
def linearity_assum(model, y):
y_pred = model.predict()plt.figure(figsize=(15,10))
sns.regplot(x=y_pred, y=y, lowess=True, line_kws={'color': 'red'})
plt.title('Observed vs. Predicted Values', fontsize=16)# Results is the object which contains the trained OLS model
linearity_assum(results, y_train)
😃
自相关:在处理时间序列数据时,这一假设经常被违反,因为它指的是变量与自身之间在不同时间点的相关性。例如,在不同时间点测量的股票价格(同一变量)。横截面数据也可能出现自相关。例如,不同社区之间的房价可能是相关的。
不幸的是,我没有太多处理时间序列数据的经验,因此,我不想假定一个修正。然而,在横截面数据的情况下,我发现在拟合模型之前标准化数据有减少自相关的趋势。
我们通常使用德宾-沃森测试来检验这一假设。接近 2 的结果表示没有自相关。然而,当我们接近零(0)时,正自相关的证据就越多,越接近 4,负自相关的证据就越多。
from statsmodels.stats.stattools import durbin_watsondurbin_watson(results.resid)
同方差:假设回归模型的残差具有相同的可变性或沿回归线分布。如果他们不这样做,这被称为“异方差”。一个被打破的同方差假设会使你的系数不太准确,但不会增加系数的偏差。
在被破坏的同方差假设中,散点图将显示数据点的模式。如果你碰巧在散点图上看到一个漏斗形状,这将表明一个错误的假设。
再一次,变换是你最好的朋友来纠正一个失败的同质性假设。首先,尝试改变你的目标(即。y)使用平方根、对数、平方根倒数或倒数变换。我们也可以使用加权普通最小二乘法代替普通最小二乘法来拟合你的数据,当你已经打破了同方差假设。
我们通常使用散点图来检查残差的方差在整个目标上是否恒定。
def homoscedasticity_assum(model):
y_pred = model.predict()
residuals = model.resid
plt.figure(figsize=(15,10))
sns.regplot(x=y_pred, y=residuals, lowess=True, line_kws={'color': 'red'})
plt.title('Residuals vs Fitted', fontsize=16)
plt.xlabel('Fitted Values')
plt.ylabel('Residuals')homoscedasticity_assum(results)
残差的正态性:残差服从正态或高斯分布。幸运的是,人们普遍认为违反这一假设对结果的影响最小。就我个人而言,我尽量确保分布“接近正态”。我这样说是因为中心极限定理表明,随着样本量的增加,样本的均值和标准差将开始接近正态分布。反之亦然,因为样本量较小的数据集很少具有高斯分布,因此,您的残差将不会具有正态分布。
在这种情况下,对目标进行对数或平方根变换有助于使残差更加正常。
也就是说,简单地使用直方图绘制残差将有助于您可视化它们的分布。你也可以使用夏皮罗-维尔克统计。在夏皮罗-维尔克检验中,零假设假设正态分布,因此我们不想拒绝零假设。换句话说,夏皮罗-维尔克检验将产生一个 p 值,我们希望看到 p 值高于 0.05(即。我们不能拒绝零假设)。
def normality_assum(model):
residuals = model.resid
plt.figure(figsize=(15,10))
sns.distplot(residuals)
plt.title('Residuals Distribution', fontsize=16)normality_assum(results)
多重共线性:当模型中的要素彼此高度相关时,会出现多重共线性。当相关性达到或超过 0.80 时,我们通常说多重共线性发生。违反这一假设会导致回归系数不可靠。
检查数据多重共线性的主要方法是通过相关矩阵。我们也可以使用“方差通货膨胀系数(VIF)”。高于 10 的 VIF 分数表示可以观察到多重共线性,但是 100 或更高的分数表示明确的多重共线性。
处理这个问题最简单的方法是删除这些功能。我们可以移除具有高 VIF 的特征,或者当比较两个高度相关的特征之间的相关性时,我们移除与目标具有较小相关性的那个。我们还可以进行主成分分析,因为每个成分都是正交的(即与其他组件不相关)。
sns.set_style('whitegrid')
correlation = abs(X_train_df.corr())
mask = np.zeros_like(correlation, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(70,40))
plt.xticks(fontsize=20)plt.yticks(fontsize=20)
sns.heatmap(correlation,
cmap='coolwarm',
annot=True,
fmt=".2f",
annot_kws={"size": 15},
linewidths=2,
vmin=-1.5,
mask=mask,
center=0)
如您所见,当要素数量较少时,相关矩阵会很有用。
upper = correlation.where(abs(np.triu(np.ones(correlation.shape), k=1).astype(np.bool)))
to_drop = [var for var in upper.columns if any(upper[var] > .80)]
to_drop
我们可以过滤相关性矩阵以获得高度相关的特征,但一定要检查相关对,并查看每对中的哪个特征与目标的相关性最高。与目标高度相关的特征被保留,而另一个被丢弃。
from statsmodels.stats.outliers_influence import variance_inflation_factor as VIFvif = pd.DataFrame()
vif['VIF'] = [VIF(X_train_df.values, i) for i in range(X_train_df.shape[1])]
vif['Features'] = X_train_df.columnsvif_drop = [(feat, num) for num, feat in zip(vif['VIF'], vif['Features']) if num > 5.00]
vif_drop
检查 VIF 时,首先删除 VIF 值极高的要素,然后重新计算 VIF。由于删除了这些极端要素,您将会看到剩余要素的 VIF 值有所下降。
摘要
通过验证您的线性回归假设,您可以放心,您的结果是由于要素和目标之间的真实关系而不是处理错误。一旦你修正了任何错误的假设,你还会看到你的模型性能的显著提高。
感谢您的阅读!
但是什么是模型呢?
原文:https://towardsdatascience.com/but-what-is-a-model-58c486cbd40a?source=collection_archive---------30-----------------------
数据科学的维特根斯坦方法
1766 年的天文馆,塞奇·罗斯的照片,知识共享
术语模型经常被使用。这个词无处不在,已经失去了意义。仅维基百科页面就显示了 model 这个词的各种用法,包括统计学、天文学、生物学、产品设计、艺术以及概念模型。
模式的词源也很有趣,从法语和意大利语追溯到拉丁语方式,意为“度量、节奏或方式”。
然而,“概念模型”的定义抓住了这个词在任何意义上的最广泛的解释,总是来自维基百科:
概念模型是一个系统的表示,由概念组成,用于帮助人们认识、理解或模拟模型所表示的主题。
这与数据科学有什么关系?
在 Python 中,数据科学家经常使用诸如scikit-learn
或statsmodels
之类的包对各种数据运行线性回归、聚类算法、随机森林或神经网络,以便进行分类或预测。
与此同时,古希腊人和罗马人使用太阳系的地心说模型来理解他们的宇宙,这一宇宙学模型主导了他们对宇宙的理解,直到 1610 年 12 月,伽利略推断威尼斯相位排除了地心说或托勒密模型,最终验证了太阳中心模型。
单词 model 的这些用法看似无关,但回到我们上面的定义,它们实际上是该单词的相同应用。为什么?我们与 Python 模型的实际交互存在于 Jupyter 笔记本中,在构建模型时(同时祈祷不要出现错误),这个小*就在一个单元格旁边,并在 AWS 或 Heroku 上使用这些珍贵的 prime-F1-score 模型。但是在像scikit-learn
这样的地方,到底发生了什么?为什么称之为典范,除了传统?一个腌制的随机森林模型和一个带有金属球的太阳系小玩具模型,或者一个聚苯乙烯泡沫波尔原子模型有什么关系?
因为这些模型实际上是为了表现现实。这是他们团结的原因。这是一个崇高而困难的观点,但这个事实比乍看起来更有意义。
模型、数据科学和维特根斯坦
本·理查德摄,公共领域
哲学家路德维希·维特斯坦根的逻辑哲学论文通常被认为是二十世纪最重要的作品之一,这是一篇结合了逻辑、科学和哲学的论文,并以对其自身的神秘反驳达到高潮,在一定程度上也驳斥了哲学。这是一部很棒的作品,由七个首要命题组成,主要陈述如下:
世界存在于关于世界的“事态”或事实中。我们以逻辑命题的形式发展对这些事实的表述,尽管我们永远不能明确地说出一个事实和一个事实的表述有什么共同之处,我们只能展示它们有什么共同之处,这是人类生活的一个本质上神秘的方面,这也使得哲学化,包括这整部作品(《逻辑哲学》)是浪费时间,除了它把你从继续哲学化的冲动中解放出来。
例如,当我们在面对一个孩子时正确地认出一张母亲的脸时,我们到底看到了什么‘共同点’?我们不太能确定:我们看到了家族相似之处,仅此而已。我们看到一些我们不能说的东西,但我们知道这是真的,试图阐明这种共性的努力失败了。
即使我们试图将这种活动简化为一种神经状态,一种基于神经元的面部识别和特征触发类型(这是目前被怀疑的颞叶梭形面部区域的功能),我们实际上并没有在识别本身的行为中使用还原论方法:我们只是简单地这样做,这种形而上学的区别遍及所有人类活动,并且根据维特根斯坦的说法,这是我们的伦理和宗教真理的来源,这些真理必须远离科学事实的领域。
最后,回到模型(和重点):模型就是这样的表示!当使用scikit-learn
制作像线性回归模型这样简单的东西时,我们正在使用计算机的计算能力来模拟和编码这个人脑驱动的同构识别的过程。回归模型的系数是对某些特征对某个目标变量相关意图的影响的信念的表达,该意图通常是预测。
但是,关于这些模型的一个令人惊奇的认识是,尽管感觉 Python 模型只是巧妙地捕捉梯度下降驱动的损失函数最小化的 1 和 0 的序列,但是模型建立的过程与人类预测和解释的活动是并行的!人类的大脑,无论是做一个数字心理估计,还是试图用语言描述一个物理事件的记忆,或者在几秒钟内认出一个老朋友的面孔,都是在它的心理表征中挑选出现实的同构特征。主要区别在于 Python 模型缺乏感知:它们仍然是需要人类理解才能有效操作的工具,并且我认为这是数据科学家的工作不太涉及 Python 中的模型构建或 AWS 中的大规模分布式计算,而是涉及产生洞察力、可视化和扩展对某个领域的顶层理解的根本原因。
有趣的是,这也是为什么数据科学是一个如此广阔的领域:模型构建的范围与要模拟的人工任务一样广。用于自然语言处理的单词嵌入、用于图像识别的卷积模型或用于数值预测的回归模型是世界子域的模型,在人类历史的大部分时间里,这些子域都是由人类生成的。
最终的数据科学模型,类似于豪尔赫·路易斯·博尔赫斯短篇小说《科学的精确性》中的完美地图,将会是世界本身!但这种模式过去和现在都过于笨重,难以有效运用。我们制作模型,以可操作的方式简化世界,我相信任何数据科学家都会从这个角度受益。
也就是说,我怀疑资深数据科学家已经有了。感谢阅读!
但是熵是什么呢?
原文:https://towardsdatascience.com/but-what-is-entropy-ae9b2e7c2137?source=collection_archive---------33-----------------------
来源:https://pixabay.com/users/tumisu-148124/
这篇文章从不同的角度重新介绍了熵的概念,重点是它在机器学习、概率编程和信息论中的重要性。
这是字典根据谷歌快速搜索对它的定义-
来源:谷歌搜索截图
基于这个结果,你可以注意到这里有两个核心想法,起初,它们之间的相关性似乎不是很明显-
- 熵是热力学中做功所缺少的(或需要的)能量
- 熵是无序或随机(不确定性)的量度
那么到底是什么——能量缺失,还是一种度量,或者两者都有?让我提供一些观点,希望能帮助你理解这些定义。
倒楣的事情发生了!
把这个令人讨厌的标题换成更容易接受的说法
任何可能出错的事情都会出错——墨菲定律
我们都已经接受了这条定律,因为我们一直在观察和体验这条定律,而这背后的罪魁祸首正是这篇文章的主题——是的,你说对了,这就是熵!
所以现在我让你们更加困惑了——熵不仅仅是缺失的能量和无序的量度,它也是无序的原因。太好了!
就定义而言,我们在这里下不了决心。然而,事实是,在适当的背景下,上述三种观点都是正确的。为了理解这些背景,让我们先看看无序及其与熵的关系。
无序是主导力量
我借助 James Clear(《原子习惯》的作者)的一篇文章中的例子来解释这一点。
来源:左图(https://pix abay . com/illustrations/puzzle-puzzle-piece-puzzles-3303412/)右图(图片由李中清在 Unsplash 上拍摄)+作者注明
理论上,这两种情况都有可能发生,但发生的几率微乎其微。好吧,好吧,称之为不可能🤐!。这里的主要信息如下:
无序的变化永远比有序的多得多!
借用伟大的史蒂芬·平克的智慧:
史蒂芬·平克— 哈佛大学心理学系约翰斯通家族教授(图片由作者创建)
我们如何击退熵的浪潮?
付出必要的努力。努力意味着我们应该花精力去对抗熵产生的无序。
在热力学中,熵的观点占主导地位,也就是说,你将必要的(缺失的)能量注入你的系统,使其达到平衡。
由于这是一本机器学习杂志,我不会在这方面(即统计热力学)停留太久,而是提供了一篇精彩文章的链接,这篇文章以一种我永远无法解释的方式进行了解释。
[## 撒旦科学
在伦敦北部这个悲惨的二月天,当我打开暖气时,我非常感激一个基本的自然事实…
plus.maths.org](https://plus.maths.org/content/satanic-science)
你要注意的是,作为无序度量度的熵的公式是什么样子的,就像它在玻尔兹曼的墓碑上显示的那样。
来源:【https://www.atlasobscura.com/places/boltzmanns-grave+作者标注
接下来,让我们从信息的角度探索熵,这是机器学习打算从数据中提取的内容。
熵是信息的一种度量
如果你在思考——早先他说熵是无序或随机(不确定性)的量度,现在它已经演变成信息的量度——那么这意味着你在注意。干得好!😃
信息和不确定性确实是相互关联的。耐心点,你很快就会看到的。
“信息”这个词意味着一个人没有的知识。如果你已经知道了,那就不是信息了!
来源:谷歌搜索截图
现在信息也可以被看作是一个“惊喜”,尽管你感到惊讶的程度会有所不同。例如,如果我告诉你明天太阳会升起,你会说——哼!毫不奇怪,也就是说,这份声明中没有任何信息,但如果我告诉你明天世界将会毁灭,你会非常惊讶(…至少非常悲伤,我希望!😩)
从惊讶的角度思考的好处是,大多数时候我们对“信息”的思考是二元的——要么我有信息,要么没有,而“惊讶”有助于带来可变性程度的概念。你的惊讶与某个事件发生的概率(几率)成反比。事件越罕见,你越惊讶!概率是什么?….这是对不确定性的衡量!
借助亚里士多德的逻辑,你可以理解我们已经确立了信息(惊奇)和不确定性(概率)之间的关系。接下来,让我们试着用数学公式表示它。
来源:作者
上述数学公式有些奇怪。我不知道你怎么想,但我肯定不开心!
当我得到信息(让我吃惊..咄!)大概两个(😲&🤔)独立的事件,总的惊喜将会是附加的(😲+🤔)在性质上与相乘(😲x🤔).
让我们解决这个问题。
来源:作者
所以,惊喜与事件概率(随机变量)的对数成反比。对数函数帮助我们把惊喜的附加方面带回家。换句话说,我们可以通过认识到乘法可以通过对相关概率的对数进行处理而被视为加法,来提高我们对计算惊喜函数的直觉——我们的常识会说,惊喜函数必须是事件概率的加法而不是乘积(乘法)。
对我们来说,下一个问题是制定“从长远来看,我会有多惊讶?”
我们为什么对上面的问题感兴趣(这里的关键字是“长期”)是因为我们在这里的组合中引入了随机变量(因此也带来了不确定性),因此我们需要测量我们的惊喜的中心趋势。
前一段时间我写了一篇文章叫做“但是什么是随机变量呢?”。如果你对随机变量&分布感到不舒服,不妨去看看。
[## 但是什么是随机变量呢?
对什么是随机变量及其与概率论的联系的清晰而简单的解释。
towardsdatascience.com](/but-what-is-a-random-variable-4265d84cb7e5)
随机变量的期望值(或中心趋势)
当我们处理常规数字时,我们经常使用平均数、众数和中位数来统计这些数字。让我们在这里花一分钟的时间只关注均值。平均值是你的数字集中趋势的一个指标,当你计算它的时候,你给你所有的数字以相同的权重。数学很简单——取所有的数字,然后除以数字的个数。
在随机变量的情况下,在给定的时刻,我们没有属于这个随机变量的所有数字(样本),更重要的是,随机变量都是关于公平的;贡献对他们很重要,因此与传统的数字平均不同,他们不会对所有的可能性给予同等的权重!
我们可以通过考虑“长期平均值”(也称为随机变量的期望值)来解决上述挑战。这是你计算平均值的方法(抱歉..期望值)。
来源:作者
每一种可能性对中心趋势(期望值)的贡献(x_i)由等于其发生的可能性(概率)的权重给出。
惊喜的期望值(或集中趋势)
如果你理解随机变量的期望值,你就不会对此感到惊讶(双关语😎!)
平均或预期惊喜也应该是所有惊喜的加权平均之和!
运用我们之前学到的知识:
来源:作者
正如你所看到的,在简化了上图中的各个步骤后,我们最终得到了预期的惊喜,看起来像熵的公式(来自热力学)。看我标注的玻尔兹曼墓碑的图像。我真的希望他的鬼魂不会因此困扰我!
克劳德·香农在 1948 年的开创性论文《沟通的数学理论》中提出了信息(惊喜)期望值的公式
克劳德·香农:信息论之父(图片来源:维基百科)
克劳德·香农的探索是用尽可能少的比特数传输和接收信息。我之前借助惊奇概念推导出的公式,也可以用来告诉你一条消息的最小比特数。为此,您可以使用基数为 2 的对数。让我们也做几个例子。这些例子摘自《信息论的元素一书,并使用张量流概率求解。
来源:作者
来源:作者
为什么在信息论的上下文中它被称为熵是因为度量(公式)看起来像热力学的公式。它被称为香农熵或信息熵和熵。真的只是熵!
香农的工作也为文件压缩奠定了基础,其核心思想是在不扭曲原始信息的情况下,用更少的比特来表示信息。
使用熵来选择概率分布
首先,习惯性地提及贝叶斯定理。
来源:图片来自维基百科+作者标注
你有没有想过应该如何选择先验分布和概率分布?许多统计通常是通过使用正态(高斯)分布来完成的,但通常常规选择并不是最佳选择。
无知比错误更好,不相信任何东西的人比相信错误的人更接近真理——托马斯·杰斐逊
托马斯·杰斐逊的智慧可以成为我们做出这一选择的指导力量。把它转化成我们的问题域,看起来会像这样-
具有最大概率分布的分布是具有最大熵的分布。这也意味着这也是你能做出的信息量最少、最保守的选择。这是最大熵分布原理背后的核心思想。遵循它有助于在我们的计算中不引入任何额外的偏差或假设。
对于无处不在的正态分布选择,一个经常被引用的理由是它遵循中心极限定理。最大熵原理也可以用来证明它的使用。可以解析地证明,如果分布的方差已知,那么正态分布就是具有最大熵的分布。如果你对证明的严谨性感兴趣,我会推荐你阅读这些笔记——https://MTL sites . MIT . edu/Courses/6.050/2003/notes/chapter 10 . pdf
相对熵(KL 散度)
到目前为止,我们一直使用熵作为概率分布信息含量的指标。我们应该问自己的下一个问题是— 我们可以用它来比较两个分布吗?
分布之间的比较可以被视为距离(在某个空间中),然而对于分布来说,该距离本质上是不对称的,即给定 p & q 分布,从 p 到 q 的距离不会与从 q 到 p 的距离相同,当然,除非它们相同。在这种情况下,它是零。这就是为什么我们用另一个术语来描述这种不同,称之为差异。
有几种不同类型的散度,最广泛使用和已知的是由 Solomon Kullback 和 Richard Leibler 创建的一种,用于测量分布之间的相对熵
所罗门·库尔巴克 & 理查德·莱布勒KL 发散的发明者(图片来自维基百科)
很明显,熵在计算这种差异时扮演了一个角色,但你必须等一会儿才能看到它。
我们不想把 KL 散度的公式扔给你,我们想要发展一种关于它的起源的直觉,为此,我们从可能性的概念中得到帮助。
假设通过进行一项实验(例如投掷骰子数千次),你观察到了真实的分布,我们称之为 p 。现在假设我们有另一个候选分布(模型)叫做 q ,它可能也适合于描述我们的随机变量。我们比较这两种分布(模型)的一种方法是通过查看它们的可能性比率。这是一种被称为似然比测试的假设测试形式(参见维基百科;解释得真好)。在实践中,我们取似然比的自然对数。
我们可以使用这个对数似然比,并使用在 p 中出现的数据点对其进行加权,这将为我们提供两个分布之间的差异(距离)的期望值。是时候用数学方法来看待它了:
来源:作者
正如你看到的,我们的熵公式再次出现,这就是为什么 KL 散度也叫做相对熵。
我们也可以借助惊奇来理解 KL 发散。你本质上要问的问题是—
对于给定的随机变量 X,如果你选择分布 q 而不是参考分布 p 惊喜的相对变化是多少?
使用参考分布近似分布
在机器学习中,KL 散度应用的一个主要领域是在进行变分推理时将其用作损失函数。
变分推断包括使用另一个(联合)分布来近似一个难以处理的后验分布(来自贝叶斯定理),我们有一个可用的分析形式。随着你的神经网络学习最小化 KL 发散损失,你的参考(p)和目标(q)分布看到相对熵的减少。
交叉熵
我也想涵盖熵的这一方面,因为它被广泛用于机器学习,尤其是分类任务。在某些方面,我们已经看到它隐藏在 KL 背离中。
来源:作者
所以 H(p)是分布 p 的熵(自我信息), H(p,q)是分布 p & q 之间的交叉熵。
我们可以用另一种方式来解读它,更重要的是理解相对熵(KL 散度)和交叉熵之间的区别。我们将尝试从香农对熵的使用来看信息所需的比特数。
比方说,对于编码消息,我们希望使用 q 作为候选(目标)分布,因为它的分析形式而不是真正的分布 p(我们在前面的变分推理部分讨论过)。然而,现实情况是我们的近似并不完美,因此 KL 散度可以被视为 q 编码所需的额外比特的平均数量。然而,交叉熵可以被视为使用 q 表示信息所需的比特的平均数量
下面是显示交叉熵和 KL 散度关系的示例代码片段。
来源:作者
结束语
熵可能会吓到你,因为许多不同的公式和在不同科学领域的广泛使用,但正如我们在这篇文章中看到的,它们确实是相互联系的。
需要记住的要点是:
- 熵是信息的一种度量
- 信息令人惊讶
- 熵帮助你为你的领域问题选择合适的分布(给定约束)
- 使用一个分布来近似另一个分布依赖于这些分布之间的相对熵
如果你有问题,需要更多的澄清,请写在评论中,我会很乐意尝试回答他们,如果需要的话,更新文章。
参考资料和进一步阅读
【1】熵:为什么生活似乎总是变得更加复杂?
[2]威尔·库尔特关于 KL 发散的博文https://www . countbayesie . com/Blog/2017/5/9/kull back-lei bler-Divergence-explained
[3]https://plus.maths.org/content/satanic-science的 M. Freiberger 著《撒旦的科学》
[4]信息论要素—https://www . Amazon . com/Elements-Information-Theory-telecom munications-Processing/DP/0471241954
[5]似然比检验—https://en.wikipedia.org/wiki/Likelihood-ratio_test
买入并持有交易策略
原文:https://towardsdatascience.com/buy-and-hold-trading-strategy-66b4c3ac9b68?source=collection_archive---------35-----------------------
用 Backtester 计算策略的性能——一个用于回溯测试的 Python 框架。
米歇尔·汉德森在 Unsplash 上的照片
介绍
买入并持有策略是指在第一个数据点买入一项资产,然后看看最后一个数据点的投资组合价值。
买入并持有策略有时也被用作测试其他策略表现的基准。如果一个精心设计的逻辑不能打败简单的买入并持有策略,这个策略可能一文不值。
虽然手动测量购买并持有策略的性能并不难,但拥有一个回溯测试框架是有用的——您可以进一步改进该策略,它通常带有绘图功能。
见我关于这个话题的其他文章:
[## Python 中的股票市场分析
我用 Python 写的关于股票市场分析的文章的精选列表。
romanorac.medium.com](https://romanorac.medium.com/stock-market-analysis-in-python-b71bf50151d9)
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
认识反向交易者
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
Backtrader 是一个用于回溯测试和交易的开源 Python 框架。它让你专注于编写可重复使用的交易策略、指标和分析工具,而不是花时间建立基础设施。
在安装它之前,请安装 TA-LIB 依赖项:
# Mac OS X
brew install ta-lib# see [https://github.com/mrjbq7/ta-lib](https://github.com/mrjbq7/ta-lib) for other platforms
安装 Backtrader 和安装每个 python 包一样简单:
pip install backtrader[plotting]
买入并持有策略
Ashkan Forouzani 在 Unsplash 上拍摄的照片
我们要计算一下,如果我们在 2010 年 1 月 1 日投资 10.000 美元到微软,并一直持有到现在,我们会获得多少收益。
战略
我们只需要几行代码来实现 Backtrader 的买入并持有策略。
以下代码的解释:
- start 方法设置现金的初始金额。
- 对于第一个数据点,只调用一次 nextstart 方法。这非常适合实施买入并持有策略。
- 所有可用的现金都用来购买固定数量的股票。它被截断为整数,因为所有的经纪人都不支持零股。
- 回报在 stop 方法中计算,使用投资组合的现值和初始现金量。
import backtrader as btclass BuyAndHold_Buy(bt.Strategy): def start(self):
# set the starting cash
self.val_start = self.broker.get_cash() def nextstart(self):
# Buy stocks with all the available cash
size = int(self.val_start / self.data)
self.buy(size=size) def stop(self):
# calculate the actual returns
self.roi = (self.broker.get_value() / self.val_start) - 1.0
print("ROI: %.2f, Cash: %.2f" % (100.0 * self.roi, self.broker.get_value()))
回溯测试
正如上面已经提到的,我们想计算持有微软股票大约 10 年我们会获得多少收益。
我们定义 ticker、date 参数并初始化数据馈送:
from datetime import datetimedata = bt.feeds.YahooFinanceData(
dataname="MSFT", fromdate=datetime(2010, 1, 1), todate=datetime(2020, 10, 23)
)
然后我们初始化脑波强化器引擎:
cerebro = bt.Cerebro()
将数据馈送添加到引擎:
cerebro.adddata(data)
将策略添加到引擎中:
cerebro.addstrategy(BuyAndHold_Buy, "HODL")
设置现金:
cerebro.broker.setcash(100000.0)
运行回溯测试:
cerebro.run()# The output
ROI: 788.00, Cash: 88800.40
我们将获得 788%的疯狂回报。如果我们能回到过去😊
Gif 来自 giphy
形象化
我们都听说过“一图胜千言”这句话。这就是 Backtrader 的闪光点。
反向交易者可以想象一个有进场点和出场点的策略。在我们的例子中,我们只有一个入口点,所以交易策略的可视化不会太戏剧化。但是我们需要花相当多的时间来使我们摆脱 Backtrader 的束缚
让我们试试(下面的命令在 JupyterLab 中有效):
cerebro.plot(iplot=False)
可视化的购买和持有交易策略与微软股票。
要了解更多关于买入并持有的策略,请访问反向交易文档。
在你走之前
像往常一样,你可以下载这款 Jupyter 笔记本,在你的机器上试例子。
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。
照片由Courtney hedge在 Unsplash 拍摄
作为数据科学家买车
原文:https://towardsdatascience.com/buying-a-car-as-a-data-scientist-5a2f9f340292?source=collection_archive---------50-----------------------
从问题陈述到 web 应用程序
应用程序图表
在绿宝石岛(爱尔兰)生活了一年后,是时候搬回巴西了——新冠肺炎疫情让整个世界天翻地覆。
生活在里约热内卢或任何其他巴西大都市的一个有趣(或可悲)的事实是,拥有一辆车几乎是强制性的——只要你买得起。基于此,我决定作为一名优秀的数据科学家来解决这个问题。我建立了一个汽车推荐系统,在网页上搜索汽车,处理数据,并通过机器学习模型传递数据,以便列出和显示与我正在寻找的汽车更相关的汽车——spoiler:这款应用程序对我帮助很大
你可以在web app和我的Github页面上查看应用和我开发的所有代码
应用评分表
获取数据
在这个项目之前,我根本没有实践过网络抓取。不过,只要对某些模块和网页的工作原理有一点了解,你就可以把网络变成一个更强大的数据源。另外,我不能忘记提到我上过 Mario Filho (巴西该领域的参考文献之一)数据科学课程,它的内容对我帮助很大。
为了读取页面 HTML 代码并从中获取数据,我使用了 BeautifulSoup 。这个过程很简单,你打开你想获取数据的页面,检查你感兴趣的项目并存储你想要的信息。要做到这一点,您必须了解页面的结构,并想出一种智能的方式来存储和组织您正在抓取的数据。
数据解析
网络抓取本身并不是目的。换句话说,我们总是受网站设计和模式的支配,正因为如此,每个页面都有自己的废弃方式。此外,我们需要解析字符串,以便以我们想要的格式获取信息。
我在三个步骤中得到数据。首先,我抓取了网站的搜索页面,并存储了它的链接、汽车规格和汽车制造商。之后,我解析了每个汽车页面,以获取汽车的特征。最后,我对数据应用了一些特征工程,以便能够应用机器学习算法。
获取搜索页面
解析数据帧
特征工程
为了避免稀疏性问题,我决定对虚拟变量应用一种热编码,并且只选择频率最高的组件。我将低频类别视为噪音,这样我就能够在不损失太多信息的情况下降低一点数据的维度。我还通过应用 scikit learn 中的 fidfVectorizer 将一组原始文本转换为 TF-IDF 特性矩阵。
数据标记
对于这个项目,我决定手动标记训练数据。我在电子表格上打开文件,把我想买或至少看过照片的车设为 1,把我不想买的车设为 0。我本可以使用主动学习技术来标记数据,但是我决定,对于这个项目来说,为了尽可能的准确,我自己来做。
模型
我首先构建了一个只有两个特征(价格和型号)的基线模型。然后我应用了随机森林和 lightGBM 等不同的模型。我还为每个模型测试了不同的变量,这样我就可以根据特性的数量来平衡模型的复杂性。
经过漫长的过程,我决定创建一个由随机森林和 lightGBM 组成的集合模型。
模型结果数据分析
除了模型提供的分数(由于不平衡数据标签,我使用平均精度和 Roc AUC 分数作为度量标准),我还构建了一个仪表板,显示关于得分最高的汽车的信息。
每次更新应用程序的数据库时,仪表板也会更新。因此,让我们检查几个当前日期的图表和曲线图。
通过查看上面的图表,我可以衡量模型的运行情况。嗯,到目前为止结果是惊人的!我正在寻找两个品牌(大众和福特)的价格在 17-30k 雷亚尔以内的汽车。除此之外,福特嘉年华和福特 ka 是我最有可能购买的汽车。此外,所有这些型号都是我感兴趣的汽车。所以,这个应用程序运行得非常好!
app 会帮我买车吗?!
这个问题的答案很简单:对我肯定有帮助!事实上,它已经在起作用了。我每天都在更新数据库,以便找到最好的报价。当我快要到达巴西的时候,我将会决定当我到达那里的时候我将会买的每一个。
结论
我建立了一个非常好用的汽车推荐系统。所有的建议都与我正在寻找的一致,我很自豪能够使用我的数据科学技能来完成这个美丽的任务。
如果你想了解更多关于项目本身的信息,请查看我的 Github 上的代码。关于它,有很多我在这篇文章中没有提到,比如容器、烧瓶和 Streamlit 应用程序的使用。
如果你需要任何帮助来建立你的推荐系统,让我知道,我会帮助你。
(以书呆子的方式)买车
原文:https://towardsdatascience.com/buying-a-car-in-a-nerdy-way-8ec4626fd49b?source=collection_archive---------69-----------------------
通过使用机器学习进行价格预测,书呆子搜索引擎可以找到二手车价格的好交易。
图片由来自 Pixabay 的戴夫·塔夫斯拍摄
我不是那种可以通过观察汽车的光学系统(或者通过观察整个汽车)来说出汽车型号、品牌、年份的人。因此,当我不得不从成千上万的选择中做出买哪辆车的选择时,我的选择几乎是随机的。我可以上网浏览一堆照片,但对我来说它们看起来都差不多。
所以我决定做我最擅长的事,用最无聊的方式解决问题。😃
我的目标是买一辆二手车,以我心中特定的预算,最大化我能得到的价值。同样,我不知道在这个上下文中值是什么,因为我对汽车一无所知。但是让我们假设有一个函数 y = f(X) 可以告诉我们一辆车的价格( y ),给定该车的特征( X ,又名特征)。价值不是一个客观指标,而是"市场认为"通过添加/删除某个特定功能(例如三门与五门汽车)汽车的价格会发生多大变化。“市场认为”是人们集体认同的,数学上的 对一辆汽车有无给定特征的价差分布的预期。
在一个“明知故犯”的世界里,每个人都会知道函数 y = f(X) ,并用它来设定他们想要出售的汽车的价格。
虽然有在线价格计算器和带有车型-年份-公里价格建议的表格(近似于 y = f(X) ),但并不是每个人都以这种方式来评估他们的汽车价格。此外,特定买方或卖方对价值的感知可能与市场认为的(y = f(X))不同( y'=f'(X) )。例如,卖方可能会分配一些价值用于今天出售汽车,而不是等待,为此她愿意降低汽车的价格,但作为买方,我对此没有任何价值,所以我会将这辆汽车视为销售机会。**
因为我对自己的价格-价值关系( y'=f'(X) )没有什么特别的个人想法,所以我会尽量去找市场是怎么想的( y=f(X) )对于那些我关心的特征( X )。例如,我不介意汽车的颜色,但让我们假设白色汽车往往更便宜,让我们假设我不知道这一点。因为车的颜色不在,【y * = f(X )在价格上不会对白色或黑色版本的同款车做任何区分,【y *】会介于两者之间(具体要看我用白色和黑色车的多少来找函数【y * = f(X ))。在查看白色( y_white )和黑色( y_black )车的实际要价时,我应该发现y _ white<y <y _ black。因此,我可以利用实际价格和预测价格之间的差异来找到对我来说比较划算的交易。越负的 y_actual-y,越好成交。在我们的例子中,y _ white-y <0和y _ black-y >0。所以这样一个过程的最终输出会是“买白色车的建议。*****
所有这些冗长的介绍就是为什么建立一个模型(即估计 y=f(X) ) 来预测二手车价格可以帮助像我这样的不专业的人做出数据驱动的决定,而不需要真正了解汽车,相信“市场”拥有数据的所有相关信息,我可以提取这些信息来做出更明智的决定。**
模型结构
该过程如下:
- 创建 y=f(X)**
- ____ 获取大量汽车数据: X 和 y_actual*
- ____ 训练一个机器学习模型, y=f(X)**
- 使用 y_actual-y 寻找优惠*
我为构建模型考虑的特征( X )是:*
****numerical features:** consumption [km/l], mileage [km], original price [euro], acceleration [s], motor’s power [kW], car’s age [days], quarterly minimum (Q min) & maximum expenses (Q max) [euro], annual spent (based on the average fuel consumption plus expenses) [euro]**categorical features:** fuel [diesel, benzine, electric, hybrid..], car body [hatchback, sedan, suv...], energy label [A, B, C.. F], brand [audi, honda, toyota...], model [a3, auris, golf, yaris...], transmission [automatic, manual, semi-automatic]**
训练的模型是一个简单的 GradientBoostingRegressor,具有网格搜索超参数调整和 k 倍交叉验证。
**def train_model(X,y,features):
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV, KFold
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
GB = GradientBoostingRegressor()
xg_param_grid = {
'n_estimators': [300, 400, 600, 800],
'learning_rate': [0.04,0.02],
'max_depth': [6],
'subsample': [0.8]
}
kfold = KFold(n_splits=10, random_state=0, shuffle=True)
gsXGB = GridSearchCV(GB, param_grid=xg_param_grid, cv=kfold, scoring="neg_mean_squared_error", n_jobs=-1, verbose=1)
gsXGB.fit(X_train[features], y_train)
XGB_best = gsXGB.best_estimator_
y_hat_test = gsXGB.predict(X_test[features])
y_hat = gsXGB.predict(X)**
为了知道哪个特征与预测汽车价格更相关,可以检查模型的特征重要性图:
预测汽车价格时模型指定的功能重要性
似乎起步价(新车时的价格)是预测二手车价格最重要的因素,其次是车龄和行驶里程。
人们也可以使用 SHAP 库来更好地理解特征和预测之间的关系。这篇文章对 SHAP 价值观有一个很好的解释:点击这里。
SHAP 汇总图
例如,在 SHAP 汇总图中,可以看到预测的价格主要受汽车原始价格的影响:原始价格越低(蓝色),预测的价格越低(SHAP 值低于 0)。要素的 SHAP 值表示知道该要素的值会在多大程度上改变该样本预测的模型输出。数字特征有一个简单的解释,但分类特征有点难以解释,因为它们是标签编码的,即类别字符串被转换为数字。例如,编码特征变速器的标签将自动转换为 0,将手动转换为 1;因此变速器 redish 点对应更高的值,因此 1: 手动。变速器 redish 点(手动)和 blueish 点(自动)之间的价格预测差大约为 1000€。这个大约 1k 的€是值**市场分配给拥有自动变速箱而不是手动变速箱的汽车。****
汽车原始(新)价格的 SHAP 依赖图
SHAP 依赖图显示了单个特征对模型预测的价格的影响。图中的每个点都是数据集上的一个预测。x 轴上的值是要素,y 轴是该要素的 SHAP 值。该颜色对应于第二个特征,该特征可能与我们正在绘制的特征有交互作用。例如,原价似乎与预测价格呈非线性关系:原价越高,预测越高,但从 15k 的€到 20k 的€新车价格增加的二手车预测价格比从 35k 的€到 40k 的€增加的多(大约 1k 的€对 500 的€)。在相同的图中,可以看到,对于相同的原始价格,例如 20k€,里程越高,预测的价格越低,并且该差异可以对预测的价格产生大约 1.5k€的影响。
根据 SHAP 依赖图,预测的汽车价格与里程数和车龄(天数)之间存在(相当)线性关系。粗略估计,里程每增加 75000 公里,预测价格下降 1k€。同样,一辆 1000 天前的汽车,其预测价格会有 1000€的下降。这些是经验法则,但并不意味着每辆车都是如此。
********
里程和车龄(天数)的 SHAP 相关图
通过绘制 SHAP 力图,也可以理解模型是如何预测每辆车的价格的。例如,下一个图显示汽车价格的基值应该在 10100€左右,这对应于汽车价格的平均值。但是,本例中显示的特定汽车的预测价格较低,即 9233€。这主要是因为高里程(101685 公里)和车龄(3110 天)分别使价格下降了约 400€和 1.3k€。汽车的原价是 19811€,这使得模型预测的价格增加了不到 250€。从基础值(10100€)到模型输出值(9233€)的其余贡献可以在图上观察到。
SHAP 力图解释了单个汽车的预测价格如何通过每个特征增加(左侧红色特征)或移除(右侧蓝色特征)的值来解释
我很好奇的想知道,低油耗(高公里/升)的汽车是否会有更高的平均年行驶里程。考虑到下图中显示的消耗和年里程的联合分布,似乎没有如此明确的关系。
消耗量[公里/升]和年里程[公里]的联合分布
寻找交易
既然我们已经创建了模型 y=f(X) ,我们可以继续使用价格预测来查找使用 y_actual-y 的交易。我决定构建自己的书呆子搜索引擎,在那里,我将绘制出(预测价格)与y _ 实际 (要价),而不是显示汽车选项列表及其照片(任何汽车销售网站通常都会这样做)。如果一辆车落在 1:1 线(y _ actual=y ), 表示要价公平。如简介所述,我其实对那些y _ actual<*【y 的车比较感兴趣。如果您想使用我的搜索引擎,请点击下面的“结果”标签。我建议您检查桌面版本,因为移动版本的扩展性不好。
有两个标签,“自动”只显示自动变速箱的汽车,而“所有汽车”既有手动的也有自动的(实际上甚至有一些半自动的,我不知道存在)。图中每个点是一辆车,x 轴代表模型预测的价格【€】(【y )),y 轴是要价【€】(y _ 实际* )。圆点的大小与汽车的消耗量相关。圆点的颜色与年度总支出相关(一年的税收支出加上取决于汽车消耗的平均燃料支出加上实际价格减去明年同一辆汽车的模型预测价格,这是当我增加 14000 公里的里程和 365 天的车龄时模型的输出)。我还添加了一些过滤器,以防你想查找特定的品牌、里程等。****
在该图中,划算的汽车是那些远离 1:1 线向右的点,即预测价格> >实际价格。如果你点击这个点,你将被重定向到汽车的链接,将能够看到汽车的照片和更多的信息。如果你被重定向到一个搜索列表,那是因为汽车已经售出。
选择“结果”选项卡查看搜索引擎。提示:移动版扩展性不好,检查桌面版
用于训练模型并在前面的图中显示的数据来自于 2020 年 7 月在荷兰一个网站上提供的二手车价格。在获得数据之前,我使用了一些预过滤器,例如至少从 2012 年起行驶里程不到 180000 公里、€不到 17k 的汽车。
最后,在所有这些分析之后,我能找到的最佳交易是这样的:
图片由 Ronda Jenkins 从 Pixabay 拍摄
我想我要征求一下别人的意见…
购买足球队:机器学习方法
原文:https://towardsdatascience.com/buying-a-soccer-team-a-machine-learning-approach-283f51d52511?source=collection_archive---------31-----------------------
一种比随机猜测或从 18000 名职业选手中挑选选手更好的方法。
托马斯·塞勒在 Unsplash 上的照片
随着我们进入一个体育已经成为我们生活中至关重要的一部分的世界,它也成为投资者获得更好回报、与观众互动并让他们感受到自己存在的热门市场。此外,我们可以看到体育观众的激增导致了更多的锦标赛,对投资者来说,利用这些赛事已经成为一项艰巨的任务。我们接受了一项挑战,帮助主要投资者从 18000 名足球运动员中挑选出最好的球员,以建立一支能够参与并超越大联盟中其他俱乐部的梦想足球队。我们利用机器学习算法对我们俱乐部的潜在团队成员和投资者的潜在预算进行分类,以优化他们的市场收益。因此,我们想出了一个战略来建立最好的团队,同时牢记投资者的预算限制在 10 亿欧元。
简介
我们有一个国际足联数据集,其中有几个名为——评级,释放条款和工资的列。我们假设在即将到来的超时数据集中没有这些变量。这些可以用于各种形式,如将玩家评定为表现较好的玩家或中等或达不到标记的玩家。此外,它还可以转化为应该被邀请参加一些俱乐部聚会、活动等的玩家。我们对评级变量使用监督学习建立了两个模型,并通过将该变量分为两类使其成为一个分类问题:大于或等于 70 和小于 70 作为我们的潜在俱乐部成员或不是。我们选择 70 分作为我们的门槛,因为大多数主要俱乐部只有评分高于 70 分的球员。为了与他们竞争,我们倾向于只让那些评分高于我们门槛的玩家参与。此外,我们还利用模型结果来预测投资者每年提供俱乐部会员资格的成本。我们的第二个模型利用了从我们之前的最佳分类器中获得的预测评级类别,而不是“实际评级”,在这里,将 release_clause 和年薪的组合作为投资者成本作为我们的因变量。
数据集
我们使用的是来自 Kaggle FIFA 完整球员数据集的 FIFA 2019 和 2020 数据。国际足联完整的球员数据集包含 18k+独特的球员和 100+从国际足联最新版本中提取的属性。它包含:
- CSV 格式的文件。
- 国际足联 2020–18,278 个独特的球员和每个球员的 104 个属性。(测试数据集)
- FIFA 2019–17,770 个独特的球员和每个球员的 104 个属性。(训练数据集)
- 球员位置,在俱乐部和国家队的角色。
- 玩家属性,包括攻击,技能,防守,心态,GK 技能等。
- 球员的个人资料,如国籍,俱乐部,出生日期,工资,薪金等。
数据清理
- 在某些地方,两个数据集具有相同要素的不同数据类型。读取数据字典后,我们将它们同步。
- 有些变量有内置公式,因此我们更正了它们的格式。
- 我们根据字典定义或重复的列删除了、【索菲法 _id】、【玩家 _url】、【短 _ 姓名】、【长 _ 姓名】、【真实 _ 面孔】、【多比】、【GK _ 潜水】、【GK _ 搬运】、【GK _ 踢腿】、【GK _ 反射】、【GK _ 速度】、【GK _ 定位】和【body_type】,因为它们在我们的分析中没有增加任何有用的影响。
- 我们将的总体评分转换为两个二元等级,评分> 70(因为许多大俱乐部使用这个门槛)来招募他们的团队球员,并将被视为我们的因变量
探索性数据分析
我们首先考虑了用于执行探索性数据分析的各种有趣的统计数据。
- 单变量统计,如缺失值在整个数据中的百分比,以处理缺失值,连续变量(计数、均值、标准差、最小值、最大值、偏度、峰度、唯一值、缺失值、IQR)及其分布的单变量统计。
- 双变量统计:特征之间的相关性,连续变量的 T 检验和分类变量的卡方检验和 Cramer’s V。
单变量
我们对连续变量进行单变量分析,以了解数据集中不同字段的分布情况。根据我们的观察(均值、标准差、偏度、峰度等。),我们观察到许多关键特征遵循正态分布。此外,四分位间距(IQR)用于使用 Tukey 的方法检测异常值。
对于分类变量,单变量分析包括它们的计数、唯一值、具有最大计数的类别(即,顶部)、它们的频率以及它们缺失值的数量。从分类表中,我们可以看到 player_tags,lended _ from,nation_position,player_traits 有超过 54%的缺失值。用任何有希望的值来估算这些并不容易。
双变量
对于连续变量
我们构建了一个相关矩阵,以了解评级和其他解释变量之间的线性关系程度,以及在后面的阶段可以排除哪些变量。我们使用 Python 中的 seaborn 包创建了上面的热图。
T 型测试
我们还进行了 t 检验,以检查等级= 1 时变量的平均值是否与等级= 0 时变量的平均值有显著差异。在这个阶段之后,我们去掉了一些不重要的变量或者与因变量没有任何关系的变量。
用于分类变量
我们进行了卡方检验,以检查因变量评级变量的显著性。下表包含与分类变量相对应的 p 值。在我们的分析中,我们得到了偏好脚并不重要。
为了找到分类变量与因变量之间的相关性,我们应用了克拉默 V 法则。
V 等于卡方的平方根除以样本大小 n 乘以 m,m 是(行— 1)或(列— 1)中较小的一个:V = SQRT(X2/纳米)。
- 释义: V 可视为两个变量之间的关联,以其最大可能变化的百分比表示。V2 是变量之间的均方典型相关。对于 2 乘 2 表,V =基于卡方的关联度量。
- 对称度: V 是对称度。哪个是自变量并不重要。
- 数据等级: V 可能与名义数据或更高的数据一起使用。
- 取值: 取值范围从 0 到 1。
在这个场景中,我们保留了显示自变量和因变量之间良好相关性的列。这些是'俱乐部 _ 新','位置','攻击率','国家'
特征工程:
1。重新分类/输入变量
- 由于 team_jersey_number,nation_jersey_number 实际上不是一个连续变量,我们决定将它们视为分类变量。
- 我们进一步将 team_position 的‘未上场’作为缺失值,并将球员重新分类为防守队员、进攻队员、守门员、休息队员、中场队员、替补队员、未上场队员、,从而将 29 个唯一值减少到 7 个级别。
- 我们推测一个守门员将会有最小值的、【速度】、【射门】、【传球】、【运球】、【防守】、【体能】从而赋予这些值。
- 此外,2 个变量— 国籍和俱乐部具有很高的基数。根据它们的数量和事件发生率,我们将它们重新归类为低基数变量。
2。创建变量:
- 从数据中,我们观察到' player_positions' 给出了关于玩家的多个游戏位置的想法。因此,我们决定将各个球员在不同场地位置的可用总次数分配到“_ 位置”。
- 一个玩家的 work_rate 是由他的攻防速率给定的;因此,我们把它们分成变量。
- 我们还计算了期限单个球员将与俱乐部相关联,以更好地了解他们对俱乐部的忠诚度。
- 我们还使用了一键编码来利用分类变量,这种形式可以提供给 ML 算法,以便在预测中做得更好。
3。 型号 1
此处,Y =人群事件发生率为 31.23 %的等级(为 1 级)
3.1。 逻辑回归:
对于逻辑回归模型,我们首先在没有正则化的情况下进行分类,然后进行岭和套索回归。L1 正则化逻辑回归需要解决一个凸优化问题。然而,用于解决凸优化问题的标准算法不能很好地处理在许多实际设置中遇到的大型数据集。
应用惩罚以最小化损失函数时逻辑回归的目标:
正则化前后运行逻辑回归模型(L1 和 L2)的最佳结果可总结如下:
3.2。 KNN:
kNN 是一种基于案例的学习方法,它保留所有的训练数据用于分类。不同算法的评价标准之一就是它们的性能。由于 kNN 是一种简单而有效的分类方法,并且作为最有效的方法之一令人信服,这促使我们为 kNN 建立一个模型,以提高其效率,同时保持其分类精度。
参见图 1,训练数据集包括 11 个数据点,分为两类{正方形,三角形},分布在二维数据空间中。如果我们使用欧几里德距离作为我们的相似性度量,则根据局部区域中的距离度量,具有相同类别标签的许多数据点彼此接近。
例如,如果我们用实线圆圈表示 k=3 的区域,并检查类别之间的多数投票,我们观察到我们的数据点{circle}将被分类为三角形。但是,如果我们增加虚线圆表示的 k =5 的值,我们的数据点将被归类为正方形。这促使我们优化我们的k-最近邻算法,以找到分类误差最小的最优 k 。
实验:
我们最初用 k= 1 训练我们的 k- NN 模型,将我们的数据分成 70% -30%作为我们的训练和验证数据。从表 2 中,我们观察到训练精度为 1,这意味着模型完全拟合,然而,测试数据的精度和 AUC 高于验证数据,这表明过度拟合,因此,我们主观地进行参数调整。
优化:
我们利用肘方法找到训练数据的最小误差。在运行了最佳的 k、之后,我们观察到当 k=7、时观察到最小的错误率。尽管我们的优化结果在训练和验证中表现得更好,但是我们的测试 AUC 已经降低。
尽管测试的准确性降低了,但是我们观察到相同的精确度-召回率增加了,这表明我们的模型更好地分类了更多的类(1 ),因为它是我们的目标类。(评分大于 70 的玩家)。
3.3。 决策树:
决策树方法是一种用于分类、预测、解释和数据处理的强大的统计工具,在许多领域具有潜在的应用。
使用决策树模型有以下优点:
- 通过将原始输入变量分成重要的子组,简化了输入变量和目标变量之间的复杂关系。
- 没有分布假设的非参数方法,因此易于理解和解释。
主要的缺点是它可能会过拟合和欠拟合,特别是在使用小数据集时。
实验:
我们从 Sklearn 库中训练了决策树分类器,没有传递任何参数。从表中,我们观察到数据过度拟合,因此我们必须调整参数以获得优化的结果。
优化:
我们使用以下参数:
- 条件:字符串,可选(default=" Gini "):
- max_depth: int 或 None,可选(默认值=None):
树的最大深度。如果没有,则扩展节点,直到所有叶子都是纯的,或者直到所有叶子包含少于 min_samples_split 样本。
- min_samples_split: int,float,可选(默认值=2):
树的最大深度。如果没有,则扩展节点,直到所有叶子都是纯的,或者直到所有叶子包含少于 min_samples_split 样本。
- 最小权重分数叶:浮点,可选():
要求位于叶节点的权重总和(所有输入样本)的最小加权分数。当未提供 sample_weight 时,样本具有相同的权重
从上面的实验中,我们看到基尼在实验参数的所有变量中都优于熵。因此,我们的标准是基尼。类似地,我们可以观察到其他参数对于 max_depth = 10,min_samples_split = 17.5,Min_weight_fraction_leaf =0, Gini 给出了更高的精度。因此,利用这些参数,我们训练我们的模型来观察没有过度拟合,并且我们可以在类别 1 类别中捕获更多的真实类别。
3.4。 支持向量机:
SVM 的民间观点是,他们找到一个“最优”超平面作为学习问题的解决方案。最简单的 SVM 公式是线性公式,其中超平面位于输入数据 x 的空间中。
在这种情况下,假设空间是以下形式的所有超平面的子集:
f( x ) = w⋅x +b
硬保证金案例:
最大边缘分离超平面的目标是找到:
软保证金案例:
时差变量也是目标函数的一部分:
成本系数 C>0 是一个超参数,它指定了错误分类惩罚,并由用户基于分类任务和数据集特征进行调整。
径向基函数支持向量机
一般来说,RBF 核是合理的首选。该核非线性地将样本映射到更高维的空间中,因此,与线性核不同,它可以处理类别标签和属性之间的关系是非线性的情况。此外,线性核是 RBF 的特例,因为具有罚参数ĉ的线性核与具有某些参数(c,γ)的 RBF 核具有相同的性能。第二个原因是影响模型选择复杂性的超参数的数量。
实验:
我们让我们的训练数据接受线性 SVM 分类器,而不对其进行软边界训练。然而,观察到的结果看起来很有希望,
取得好成绩的原因是数据在大部分时间几乎是线性可分的,很少有错误分类。
优化:
我们决定使用线性径向基函数运行网格搜索,改变 C 和γ来有效地训练我们的模型。通过网格搜索,我们得到了如下的最佳估计量
SVC(C=1,cache_size=200,class_weight=None,coef0=0.0,decision_function_shape='ovr ',degree=3,gamma='auto_deprecated ',kernel='linear ',max_iter=-1,probability=True,random_state=None,shrinking=True,tol=0.001,verbose=False)
对于径向基函数,我们得到了最好的估计
SVC(C=100,cache_size=200,class_weight=None,coef0=0.0,decision_function_shape='ovr ',degree=3,gamma=0.001,kernel='rbf ',max_iter=-1,probability=True,random_state=None,shrinking=True,tol=0.001,verbose=False)
由于泛化误差(期望损失)被用来逼近总体误差,我们观察到 RBF 核模型的误差值是其他模型中最小的。此外,这是我们最好的模型,因为它比其他模型更符合数据。
RBF 核将数据带入更高的无限维空间,这有助于我们的模型脱颖而出。精确召回曲线向我们展示了用 AUC-0.961 预测阳性类别的效果。
4。 模式二:
这里,X 是相同的,包括来自模型 1 的预测评级和 Y =释放条款+52 *工资作为投资者的成本。(52 乘以给定的周工资)。
从前面的单变量和双变量分析中选择重要变量后,我们绘制了自变量和因变量的散点图。
可以清楚地看到,它们遵循一种关系,但它似乎不是线性的。我们通过开发一个线性模型证实了这一点。
4.1。 线性模型:
结果:
r 方形链 0.54
r 平方验证 0.55
r 平方测试 0.54
R 平方是对完美预测接近程度的度量。这里,R 广场不好。
从残差中检查线性:数据应该是随机分散的。但是在这里,我们发现它们不是随机的。这意味着线性模型永远不会是适合这个模型的好选择。
4.2。 决策树:在这个场景中,这是比线性模型更好的选择。
结果(基线):
训练数据: R 平方— 0.99,RMSE — 0.05
验证数据: R 平方— 0.54,RMSE — 8.05
测试数据: R 平方— 0.59,RMSE — 7.35
有明显的过度合身的迹象。该模型的表现不如预期。因此,我们尝试了基于 min_split、tree_depth 和 min_weight_fraction_leaf 以及学习标准的网格搜索。
如上所示,最小分割=3,最大深度=15 时,熵的性能更好。
网格搜索后的结果:(主模型)
列车数据: R 平方— 0.85,RMSE — 4.40
验证数据: R 平方— 0.69,RMSE — 6.59
测试数据: R 平方— 0.70,RMSE — 6.26
r 平方值现在似乎好得多。RMSE 值也很低,过拟合的问题也得到解决。
因此,为了预测投资者的成本,决策树在这里表现得更好。
最终策略:
最后一步是制定一个为我们团队挑选球员的策略,记住:
- 评级应大于 70(表示 1 级)
- 预算——10 亿欧元,玩家人数约 30 人。
首先,我们只选择评分高于 70 分的玩家。剩余玩家数量— 5276
其次,我们进行了一些分析,如投资者成本的十分位数分析。我们做了一些桶,每个桶有大约 30 名来自剩余池的玩家,并根据投资者的成本按降序排列这些桶。
这里我们可以观察到,从第一桶中挑选全队所需的金额是34.5 亿欧元(超出预算)。这意味着我们不能直接挑选前 30 名球员,从第 11 组中挑选球队所需的金额为9.45 亿欧元(在我们的预算内)。然而,从这个桶中挑选所有的玩家是一个错误的策略,因为我们会留下将近 300 个高价值的玩家。因此,最好的解决方案是从最高级别中挑选 8-10 名核心玩家,其余的从中低级别玩家中挑选。
通过上面的分析可以很容易地做出这个决定,这取决于投资者和球队经理来决定他们的球队需要什么样的球员。
5。结论:
在这项工作中,我们构建了两个模型,利用机器学习算法来使投资者受益,同时捕捉有意义地将玩家分类为表现良好的玩家,然后将他们回归到投资者的预算中。结果、分类和回归拟合是一种新的选择模型,用于监督学习表现优于其他团队的球员。最终,我们缩小了俱乐部内球员的选择过程,这比随机选择要好得多。
未来范围:我们还可以实现时间序列技术。作为我们的因变量,评级和成本都取决于前几年的数据。例如,如果某个玩家在 2019 年 12 月的评分为 85,那么他在 2010 年 1 月的评分大约为 85 +/- 3。因此,时间序列技术可能对这些数据有用。
参考文献:
- 郭,龚德&王,惠&贝尔,大卫&毕,亚新。(2004).基于 KNN 模型的分类方法。
- 颜人。(2015).决策树方法:分类和预测的应用。
- https://towards data science . com/how-to-tune-a-decision-tree-f 03721801680
- 阿波斯托利斯-阿芬图利斯。(2015).线性核和 RBF 核的 SVM 分类。10.13140/RG
再见,美丽的汤!我如何使用 Python 和 ParseHub 抓取新冠肺炎数据?
原文:https://towardsdatascience.com/bye-bye-beautiful-soup-how-i-scraped-covid-19-data-using-python-4dd06f930dc0?source=collection_archive---------57-----------------------
意见
用美汤刮数据繁琐!
由卡里姆·甘图斯——Unsplash拍摄的照片
在使用 Python 抓取网页时,美汤被认为是语言的最佳伴侣。但是,编写数百行代码来抓取一个表格或一个 web 元素会耗费您所有的精力和时间。
这就是为什么我在报废过程中切换到 ParseHub。而且,我在几分钟内就做到了。
使用 ParseHub
从 ParseHub 中选择 web 元素需要 5 分钟。在底层,这个工具开始制作 JSON、CSV 文件供我们提取。此外,我们可以使用他们的 API 来访问数据。这种无代码的交互界面使得捕捉 web 元素和提取所需数据变得更加容易。
获取所有数据后,您可以转到“获取数据”并运行工作流和提取数据。然后,您会发现将文件保存为 CSV、JSON 或使用 API 访问数据的选项。
Python
我已经使用 API 访问了来自 ParseHub 的数据。然后用“json”库加载它来读取数据。
import json
import requests as rq
class Covid:
def __init__(self, api_key, project_token) :
self.api_key = api_key
self.project_token = project_token
self.data = self.get_data()
def get_data(self) :
response = rq.get(f'https://www.parsehub.com/api/v2/projects/{self.project_token}/last_ready_run/data', params={
"api_key" : self.api_key })
data = json.loads(response.text)
return data
加载后,您可以轻松访问所有数据。获取关于冠状病毒的所有信息,如全球总病例数、任何国家的总病例数等。我有构建函数来获得世界上发生的总病例数、总死亡数和总恢复数。除此之外,我还创建了一个函数,返回与每个国家的病例和死亡人数相对应的数据。
def get_total_case(self):
return self.data['total'][0]['value']
def get_total_deaths(self) :
return self.data['total'][1]['value']
def get_total_recovered(self) :
return self.data['total'][2]['value']
def country_data(self,country_name):
data=self.data['country']
for country in data:
if country['name'].lower()==country_name.lower():
return country
您也可以在类中添加其他函数。我只和这些人呆在一起。然后,我创建了该类的一个对象,并调用驻留在其中的方法。
data=Covid('Your API Key','Project Token')
data.get_data()
print("Total Cases:",data.get_total_case())
print("Total Deaths:",data.get_total_deaths())
print("Total recoveries:",data.get_total_recovered())
print(data.country_data("India"))
我试着查了印度的 19 个病例和死亡人数。
如果我不得不使用美丽的汤,这个任务可能会杀了我一两个小时。但是,这个工具节省了我大量的时间和精力。你也应该用这个工具来尝试你的网络抓取实验。
注意安全!讨论和反馈,在 Linkedin 上找我!
拜拜大数据!
原文:https://towardsdatascience.com/bye-bye-big-data-fbea187c7739?source=collection_archive---------3-----------------------
意见
每个人过去都说大数据是未来。有错吗?现在呢?
艾蒂安·吉拉尔代在 Unsplash 上拍摄的照片
在我天真无邪的日子里,当我刚刚开始攻读数据科学硕士学位时,任何大数据话题都会让我兴奋地在椅子上扭动身体。我想分一杯羹。我想从无尽的流中分析垃圾,建模,可视化,转化,粉碎它。几年后,“大数据”这个词让我扬起了眉毛,等待着另一场流行词汇和模糊期望的阵雨。是大数据失去了吸引力,还是我变得愤世嫉俗了?
流行语对现实
我最近对流行语过敏。它们被高估了,不再有任何意义。这里有一句话没有告诉你什么:让我们利用大数据在这个新的数字世界中带来创新。听起来很酷,当然。然而,现实可能是停留在 Excel 电子表格,挫折和缓慢的计算。
大数据让每个人都兴奋不已,因为它代表了巨大财富的概念(“这将是 huuuuge”,听起来很熟悉吧?)在这里你可以搜索、找到和使用任何对你有价值的东西。我的第一反应是认为“在所有这些数据中,一定有我们肯定想知道的东西”。这可能是真的,但代价是什么呢?
没有合适的基础架构,大数据就什么都不是
处理大量数据需要计算能力、合适的存储和合适的工具来将数据从一个位置移动到另一个位置。瓶颈比你想象的要容易得多。随着云计算平台的出现,计算能力变得越来越便宜、越来越容易获得,云存储的指数级增长、云计算的定期使用甚至是本地服务器的维护都意味着一笔巨大的开支。本世纪关于数据的最大教训是:
虽然某些数据对某个特定的矿商来说像黄金一样有价值,但对另一个矿商来说,这将是对存储空间的巨大浪费。
公司存储这些数据,并选择这些数据以后是否有用,而成本已经花掉了。如果在收集数据之前先确定数据是否有用,会怎么样?
大数据并不总是意味着有趣的数据
垃圾进,垃圾出是数据科学界最重要的一句话。许多被认为是大数据的东西是垃圾,这意味着它是不可靠的、未经清理的数据,需要大量的工作才能使用。有时,在一个非常大的数据集中发现的少量信息不值得花费精力、时间和成本去寻找。
根据 Forrester 的报告,企业中至少有 60%的数据未被使用。
如果将这些未使用数据的存储成本投入到人们真正关心的数据的适当基础架构中,会怎么样?
数据越多总是越好吗?
“把尽可能多的数据扔给人工智能”的时代已经结束了。人们已经意识到,不,不是每一个功能都是有用的(甚至可能是有害的!)而且数据的质量往往比数量更重要。我们希望数据以可靠、一致的方式衡量我们关心的事情。通过了解我们数据的质量,它还允许我们进入一个可解释、负责任和安全的人工智能阶段。
这是(大)实施和(大)更好的基础设施的时代。
我们意识到我们得到了数据。现在,我们需要基础设施来安全地使用它、共享它、分析它,并区分无用的垃圾和有价值的信息。我们还决定,数据和人工智能是为了让世界使用,让世界理解,并承诺两者的质量和可靠性。尽管有些人很难理解这一点,但数据(就像生活中的许多其他事物一样)不需要庞大,它需要可靠。
大数据已死。可靠数据万岁!
听起来没那么性感了,不是吗?
再见了移动网络。你好效率网!
原文:https://towardsdatascience.com/bye-bye-mobilenet-hello-efficientnet-9b8ec2cc1a9c?source=collection_archive---------19-----------------------
意见
MobileNet 是应用和边缘部署的首选模型。现在它被 EfficientNet Lite 模型家族所取代。
卢克·坦尼斯在 Unsplash 拍摄的照片
如何在处理能力和内存有限的移动和边缘设备上以良好的速度运行复杂的深度学习模型?创建一个以 MobileNetV2 为主干的模型,转换成 Tensorflow Lite,就大功告成了。现在它受到了 EfficientNet Lite 的挑战。请继续阅读,了解 EfficientNet 对 EfficientNet-Lite 的需求,以及如何创建 EfficientNet Lite 模型,我们还将比较这些模型,看看谁更胜一筹。如果你想深入了解 EfficientNet 的架构,你可以阅读下面的文章。
[## 所有高效网络模型的完整架构细节
让我们深入了解所有不同高效网络模型的体系结构细节,并找出它们的不同之处…
towardsdatascience.com](/complete-architectural-details-of-all-efficientnet-models-5fd5b736142)
在我开始之前,是的,我无耻地窃取了 Rhea Moutafis 热门文章拜拜 Python 的标题。你好朱莉娅。
Tensorflow Lite 中 EfficientNet 模型的缺点→需要 EfficientNet Lite
最近,我写了一篇文章,将 EfficientNet 与其他预训练的模型进行了比较,如 MobileNetV2、Inception 和 Xception,我想将这些保存的模型转换为 Tensorflow Lite 的对应模型,以查看它们的推理时间如何相互比较。
[## EfficientNet 应该是 goto 预训练模型或…
比较不同预训练模型的时间和准确性,并最终创建一个集成来提高结果。
towardsdatascience.com](/efficientnet-should-be-the-goto-pre-trained-model-or-38f719cbfe60)
在比较模型尺寸之前一切都很好,但在那之后,我震惊了。
比较模型尺寸
为了计算推断时间,我加载并处理了一张图片,对其进行了一百次预测,并取其平均值。
比较模型推理时间
Tensorflow Lite 模型的 MobileNet 推理时间如预期的那样下降了,但 EfficientNet 模型的推理时间增加了!!!Tensorflow Lite 应该使模型更小并减少推理时间!那么为什么会出现这种情况,如何解决呢?这在 EfficientNet Lite 中已得到澄清,根据此文章,它有以下更改:
- 删除挤压和激励网络,因为它们没有得到很好的支持
- 用 RELU6 替换了所有的 swish 激活,这显著提高了训练后量化的质量
- 在放大模型时修复了茎和头,以减少缩放模型的大小和计算
Tensorflow Lite 中的 MobileNet 与 EfficientNet Lite
这些模型将由模型制作者创建,正如其教程中所述
在为设备上的 ML 应用部署 TensorFlow 神经网络模型时,模型生成器库简化了将该模型适配和转换为特定输入数据的过程。
它确实可以做到这一点,并且支持 MobileNetV2、ResNet50 和 EfficientNet Lite 系列的前五种型号。您还可以使用ImageModelSpec
从 Tensorflow Hub 使用不同的模型,或者创建或拥有自定义模型并将 ModelSpec 导出到 Tensorflow Hub,然后使用ImageModelSpec
。
在本文中,我将只结合 MobileNetV2 和 EfficientNet Lite 0 到 4。使用的数据将是带有雏菊、蒲公英、玫瑰、向日葵和郁金香标签的花卉数据集,这些数据将被分成 80%、10%和 10%,分别用于训练、验证和测试。
为此,我们需要 Tensorflow 示例,可以使用以下方式进行 pip 安装:
!pip install -q git+https://github.com/tensorflow/examples.git#egg=tensorflow-examples[model_maker]
然后,我们进行所需的导入,即模型规格、图像分类器、图像分类器的数据加载器、TensorFlow、NumPy 和 Matplotlib。
from tensorflow_examples.lite.model_maker.core.data_util.image_dataloader import ImageClassifierDataLoader
from tensorflow_examples.lite.model_maker.core.task import image_classifier
from tensorflow_examples.lite.model_maker.core.task.model_spec import (mobilenet_v2_spec,
efficientnet_lite0_spec,
efficientnet_lite1_spec,
efficientnet_lite2_spec,
efficientnet_lite3_spec,
efficientnet_lite4_spec)
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
然后我们加载数据,将它分成所需的类别,并使用ImageClassifierDataLoader
类为图像分类器做好准备。可以使用from_folder
方法,它假设不同类别的图像存在于主文件夹的不同子文件夹中,子文件夹的名称是类别名称。确保图像具有 PNG 或 JPG 扩展名,因为只有它们受支持。
image_path = tf.keras.utils.get_file('flower_photos',
'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz', untar=True)data = ImageClassifierDataLoader.from_folder(image_path)
train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)
让我们看看我们的数据
资料组
现在用 model-maker 创建模型是一行程序。
model = image_classifier.create(train_data, model_spec=model_spec, epochs=epochs, validation_data=validation_data)
指定您想要的型号规格,对于 MobileNetV2 是mobilenet_v2_spec
,对于 EfficientNet Lite-2 是efficientnet_lite2_spec
,如导入中所述。如果没有指定,EfficientNet Lite-0 是默认的。我每个人都训练了 15 个时期,下面是结果。
所有模型的训练和验证准确性和损失
令人惊讶的是,EfficientNet Lite-4 在测试和训练集上的表现都很差,但这可能只是意味着它需要更多的训练时期。验证集上表现最差的是 MobileNet,其他 EfficientNet 模型彼此接近,EfficientNet Lite-2 和 EfficientNet Lite-3 以最高的准确度分享战利品。
要转换这些模型并将其保存为 Tensorflow Lite 文件,请编写
model.export(export_dir='.')
这将保存一个 label.txt 和一个 model.tflite 文件。通过创建一个解释器,可以像普通的 tflite 模型一样使用这些模型。
# Read TensorFlow Lite model from TensorFlow Lite file.
with tf.io.gfile.GFile('model.tflite', 'rb') as f:
model_content = f.read()
# Read label names from label file.
with tf.io.gfile.GFile('labels.txt', 'r') as f:
label_names = f.read().split('\n')
# Initialze TensorFlow Lite inpterpreter.
interpreter = tf.lite.Interpreter(model_content=model_content)
interpreter.allocate_tensors()
input_index = interpreter.get_input_details()[0]['index']
output = interpreter.tensor(interpreter.get_output_details()[0]["index"])
# Run predictions on each test image data and calculate accuracy.
accurate_count = 0
for i, (image, label) in enumerate(test_data.dataset):
# Pre-processing should remain the same. Currently, just normalize each pixel value and resize image according to the model's specification.
image, _ = model.preprocess(image, label)
# Add batch dimension and convert to float32 to match with the model's input
# data format.
image = tf.expand_dims(image, 0).numpy()
# Run inference.
interpreter.set_tensor(input_index, image)
interpreter.invoke()
# Post-processing: remove batch dimension and find the label with highest
# probability.
predict_label = np.argmax(output()[0])
# Get label name with label index.
predict_label_name = label_names[predict_label]
accurate_count += (predict_label == label.numpy())
accuracy = accurate_count * 1.0 / test_data.size
print('TensorFlow Lite model accuracy = %.3f' % accuracy)
模型的大小,测试的准确性,以及推断时间(也是 100 次的平均值)都被记录了下来。
结果
所以结果很明显。如果模型大小和推理时间比准确性更重要,那么只使用 MobileNetV2,否则 EfficientNet Lite 系列应该是您的首选模型,尤其是 EfficientNet Lite-0 可以作为 MobileNetV2 的直接替代品。
再见了蟒蛇。你好朱莉娅。
原文:https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62?source=collection_archive---------0-----------------------
意见
随着 Python 的寿命逐渐停止,一个热门的新竞争者正在出现
如果朱莉娅对你来说还是个谜,别担心。茱莉亚·凯撒在 Unsplash 上的照片
D 别误会。Python 的流行仍然受到计算机科学家、数据科学家和人工智能专家组成的坚如磐石的社区的支持。
但是如果你曾经和这些人共进晚餐,你也会知道他们对 Python 的弱点有多不满。从速度慢到需要过多的测试,到不顾之前的测试而产生运行时错误——有足够多的事情让我们恼火。
这就是为什么越来越多的程序员采用其他语言的原因——顶尖高手是 Julia、Go 和 Rust。Julia 非常适合数学和技术任务,而 Go 非常适合模块化程序,Rust 是系统编程的首选。
由于数据科学家和人工智能专家处理大量的数学问题,朱莉娅是他们的赢家。即使经过严格的审查,Julia 也有 Python 无法超越的优点。
[## 为什么 Python 不是未来的编程语言
尽管未来几年对它的需求量会很大
towardsdatascience.com](/why-python-is-not-the-programming-language-of-the-future-30ddc5339b66)
蟒蛇的禅与朱莉娅的贪婪
当人们创造一种新的编程语言时,他们这样做是因为他们想保留旧语言的优点,并修正不好的地方。
从这个意义上说,吉多·范·罗苏姆在 20 世纪 80 年代末创造了 Python 来改进 ABC。后者对于一门编程语言来说太完美了——虽然它的刚性使它易于教授,但在现实生活中却很难使用。
相比之下,Python 还是比较务实的。你可以在 Python 的禅中看到这一点,它反映了创作者的意图:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
[...]
Python 仍然保留了 ABC 的良好特性:例如可读性、简单性和初学者友好性。但是 Python 比 ABC 更健壮,更适应现实生活。
ABC 为 Python 做了铺垫,Python 也在为 Julia 做铺垫。戴维·巴洛在 Unsplash 上拍摄的照片
从同样的意义上讲,Julia 的创造者希望保留其他语言中好的部分,抛弃不好的部分。但是 Julia 更有野心:它不是要取代一种语言,而是要打败所有的语言。
这是《T4》中朱莉娅的创作者 T5 所说的:
We are greedy: we want more.We want a language that's open source, with a liberal license. We want the speed of C with the dynamism of Ruby. We want a language that's homoiconic, with true macros like Lisp, but with obvious, familiar mathematical notation like Matlab. We want something as usable for general programming as Python, as easy for statistics as R, as natural for string processing as Perl, as powerful for linear algebra as Matlab, as good at gluing programs together as the shell. Something that is dirt simple to learn, yet keeps the most serious hackers happy. We want it interactive and we want it compiled.
Julia 希望融合当前存在的所有优点,而不是用其他语言的缺点来交换它们。尽管 Julia 是一种年轻的语言,但它已经实现了创造者设定的许多目标。
Julia 开发者喜欢什么
多才多艺
Julia 可以用于从简单的机器学习应用到巨大的超级计算机模拟的任何事情。在某种程度上,Python 也可以做到这一点——但是 Python 不知何故成了这项工作的一部分。
相比之下,朱莉娅就是为了这种东西而生的。自下而上。
速度
Julia 的创造者想创造一种和 C 一样快的语言,但是他们创造的比 C 更快。即使 Python 在近几年变得更容易加速,但它的性能和 Julia 能做到的还是相差甚远。
2017 年,朱莉娅甚至加入了 Petaflop 俱乐部——这个小型语言俱乐部的速度在峰值性能时可以超过每秒 1 Petaflop。除了 Julia,现在只有 C、C++和 Fortran 在俱乐部里。
[## 提高 Python 代码速度的十个技巧
每一步的微小进步,整体的巨大飞跃
towardsdatascience.com](/ten-tricks-to-speed-up-your-python-codes-c38abdb89f18)
社区
拥有 30 多年历史的 Python 拥有一个庞大的支持性社区。几乎没有一个与 Python 相关的问题是你在一次谷歌搜索中得不到答案的。
相比之下,朱莉娅社区非常小。虽然这意味着你可能需要进一步挖掘才能找到答案,但你可能会一次又一次地与相同的人联系。这可能会转化为程序员关系,而这种关系是没有价值的。
代码转换
你甚至不需要知道一个 Julia 命令来用 Julia 编码。不仅可以在 Julia 中使用 Python 和 C 代码。你甚至可以在 Python 中使用 Julia!
不用说,这使得修补 Python 代码的弱点变得极其容易。或者在了解 Julia 的同时保持高效率。
库仍然是 Python 的强项。苏珊尹在 Unsplash 上的照片
图书馆
这是 Python 的最大优势之一——它有无数维护良好的库。Julia 没有很多图书馆,用户抱怨说它们没有得到很好的维护。
但是当你考虑到 Julia 是一种资源有限的非常年轻的语言时,他们已经拥有的库的数量是相当可观的。除了 Julia 的函数库数量在增长这一事实之外,它还可以与 C 和 Fortran 的函数库进行接口,以处理绘图等问题。
动态和静态类型
Python 是 100%动态类型化的。这意味着程序在运行时决定一个变量是浮点数还是整数。
虽然这对初学者来说非常友好,但它也引入了大量可能的错误。这意味着您需要在所有可能的场景中测试 Python 代码——这是一项相当耗时的愚蠢任务。
因为 Julia 的创建者也希望它易于学习,所以 Julia 完全支持动态类型。但是与 Python 不同的是,如果你愿意,你可以引入静态类型——例如,以它们在 C 或 Fortran 中存在的方式。
这可以节省您大量的时间:您可以在任何有意义的地方指定类型,而不是为不测试代码找借口。
[## Julia 优于 Python 的 5 个方面
为什么 Julia 比 Python 更适合 DS/ML
towardsdatascience.com](/5-ways-julia-is-better-than-python-334cc66d64ae)
数据:在东西小的时候投资
在 StackOverflow 上标记为 Julia(左)和 Python(右)的问题数量。
虽然所有这些事情听起来都很棒,但重要的是要记住,与 Python 相比,Julia 仍然微不足道。
一个很好的指标是 StackOverflow 上的问题数量:此时,Python 被标记的次数比 Julia 多 20 次!
这并不意味着 Julia 不受欢迎——相反,被程序员接受自然需要一些时间。
想一想——你真的想用另一种语言编写你的全部代码吗?不,你宁愿在未来的项目中尝试一门新语言。这造成了每种编程语言在发布和采用之间都会面临的时间延迟。
但是如果你现在采用它——这很容易,因为 Julia 允许大量的语言转换——你就是在投资未来。随着越来越多的人收养朱莉娅,你已经获得了足够的经验来回答他们的问题。此外,随着越来越多的 Python 代码被 Julia 取代,您的代码将更加持久。
是时候给朱莉娅一些爱了。亚历山大·辛恩在 Unsplash 上的照片
底线:做朱莉娅,让它成为你的优势
四十年前,人工智能只不过是一种小众现象。行业和投资者不相信它,许多技术都很笨重,难以使用。但是那些在那时学到这一点的人是今天的巨人——那些需求如此之高以至于他们的工资与一名 NFL 球员的工资相当的人。
同样,朱莉娅现在也还是很小众的。但当它成长时,最大的赢家将是那些早期采用它的人。
我不是说如果你现在收养朱莉娅,十年后你一定会赚很多钱。但是你增加了你的机会。
想想看:大多数程序员的简历上都有 Python。在接下来的几年里,我们会在就业市场上看到更多的 Python 程序员。但是如果企业对 Python 的需求放缓,Python 程序员的前景将会黯淡。一开始很慢,但不可避免。
另一方面,如果你能把朱莉娅写进简历,你就有了真正的优势。因为说实话,是什么让你和其他的毕达哥尼亚大师有所不同呢?不多。但是,即使在三年后,也不会有那么多 Julia 程序员了。
有了朱莉娅-斯奇尔斯,你不仅展示了你对工作要求之外的兴趣。你也证明了你渴望学习,你对成为一名程序员有更广泛的理解。换句话说,你适合这份工作。
你和其他 Julia 程序员是未来的摇滚明星,你知道的。或者,正如朱莉娅的创作者们在 2012 年所说的:
Even though we recognize that we are inexcusably greedy, we still want to have it all. About two and a half years ago, we set out to create the language of our greed. It's not complete, but it's time for a 1.0 release — the language we've created is called [Julia](https://julialang.org/). It already delivers on 90% of our ungracious demands, and now it needs the ungracious demands of others to shape it further. So, if you are also a greedy, unreasonable, demanding programmer, we want you to give it a try.
Python 仍然非常受欢迎。但是如果你现在学习茱莉亚,那可能是你以后的金奖券。从这个意义上说:再见 Python。你好朱莉娅。
编辑:我做了一个关于 Julia 和 Python 的演讲!由 Hatchpad 主持,视频为 此处 。
BYOL:带来你自己的损失
原文:https://towardsdatascience.com/byol-bring-your-own-loss-c5292cb8e9e3?source=collection_archive---------56-----------------------
我们如何用客户损失函数改进交货时间估计
亲爱的鉴赏家们,我邀请你们去看一看 Careem 的送餐平台。具体来说,我们将看看我们如何使用机器学习来改善交付时间跟踪的客户体验。
简介
计划一顿饭时,时机至关重要。这就是为什么我们非常小心地估计订单的交货时间。然而,交付时间取决于几个复杂的因素——出于这个原因,机器学习是预测预计到达时间的正确选择。
Careem 的食品交付平台界面,用于交付时间估算
乍一看,这只是一个典型的回归问题:获取一些功能,根据历史交付时间训练一个合理的模型以最小化 RMSE,使用合适的交叉验证策略估计平均误差的预期下降,并与领导层分享,部署,广泛宣布,并获得尊重,信任,晋升…
在这篇文章中,我将尝试解释这种方法的错误。我将描述我们对这个问题的解决方案以及我们衡量用户影响的方式。然后,我将向您展示我们如何构建一个自定义损失函数来更好地优化用户订单满意度。
有什么问题吗
- 训练你的模特对抗 RMSE 。RMSE、梅、胡伯等损失是大多数回归问题的典型选择。然而,这些损失反映了我们客户的感受吗?最大的问题是它们是对称的——它们不能区分提前 20 分钟或晚 20 分钟送达的订单。我的直觉肯定能看出区别…如果我们的模特表现出更多一点的同理心,那就太酷了。
- 通过平均误差评估成功。 又来了。想象一下,您的团队已经努力工作了一个月,用其昂贵的基础设施设置实时交通数据流,以获得减少错误的功能,现在,它最终从平均 3 分钟下降到 2.5 分钟!20%的涨幅,什么结果!这绝对值得…是吗?实际上很难说,这在很大程度上取决于一个特定的问题。对于我们和许多其他应用程序来说,客户很可能甚至不会注意到这种变化。
- 获得尊重、信任、晋升。
这个挺简单的!工作是为了乐趣,而不是为了升职!
那么,我们该怎么办?
免责声明:出于法律原因,此处显示的所有数据都是合成的,但它是以代表真实行为的方式构建的。
目标分布
让我们从找到衡量成功的方法开始。在某些情况下,测量 MAE 是有意义的。然而,在交货时间估计的情况下,这在很大程度上是没有意义的。它没有告诉我们对客户有什么影响。
我们关心的是客户体验。你关心的是对你的客户体验的影响,这可以通过多种方式来衡量:交付率、流失率、保留率、LTV、呼叫中心联系率、NPS 评分。例如,在 Careem,我们使用反映业务状态的呼叫中心联系率、流失率、交付时间和交付评级的加权组合。
问题是这些很难优化。因此,数据科学家经常求助于 RMSE、梅、胡伯等作为代理人。然后只在部署后测试真实的用户影响。
让我们假设我们项目的目标是提高平均交付率。我们需要了解我们的模型将对交付 ratting 产生什么影响。做到这一点的一个方法是查看历史交付时间估计,并查看当出现各种交付时间错误时,客户评级会发生什么变化。下面我们看到一个图表,显示了平均行程等级,显示的交付时间误差估计中不同程度的误差:
左图是 Careem 的反馈页面,订单完成后发送。在右图中,根据交货时间估计经验,给出了每个仲裁箱的平均等级(见免责声明)
有许多直观的见解:
- 人们喜欢准时或早一点得到食物
- 如果送货时间过长,你会感到失望
- 不要对过早得到食物感到太兴奋,但是仍然,感觉它比延迟交付更积极
如果食物晚送了 22 分钟以上,那么分数应该在 1.9 分左右(见顶部的免责声明)。利用这一点,我们有一个清晰的方法将我们的交货时间误差转化为对订货周转时间的估计。然后在一个验证数据集上,当使用我们的模型时,我们能够估计旅行的预期平均评级。因此,我们找到了一种为我们的模型评估有意义的度量的方法。
查看图表,同样重要的是要强调,最佳模型不一定是 MAE 等于 0 的模型。如果我有一个完美的模型,我可能会将预测稍微向左移动一点,以确保我们做顾客最喜欢的事情——比我们最初承诺的时间提前几分钟交付食物。
好了,回到正轨,我们的目标已经确定。
典型解决方案
一个非常合理的下一步是针对这个目标运行您最喜欢的超参数优化算法。对于下面的图,我们针对这个目标在 120 次迭代中使用 RMSE 损失来调整 Catboost。我们先来比较一下这两位会把我们带向何方。
在左图中,有一个对 120 回合 HPO 的评估,当时 RMSE 既用了客观又用了失败。在右图中,针对 RMSE 进行了优化,但评估是使用评级目标进行的。
不伟大,也不可怕。这是一个小小的改进,但它是免费的。此外,现在,你对你的工作的潜在影响有了更好的理解,而不是说“新的实施将交付时间估计提高了 U%”,你会添加一个微小而重要的后缀:“…预计将带来大约 K 星的评级提高”,或“保留率提高了 P%,或“收入增加了 H%,或“人们微笑的次数增加了 28%”。
定制损失函数
当然,这不是我们能做的全部。是的,我们提高了一点分数,但是仍然面临着 RMSE 对称性的问题。想出一个自定义损失函数是相当常见的,尤其是在各种深度学习领域。我喜欢这个帖子,它很好地总结了高级损失函数。
但令人惊讶的是,经典的机器学习应用程序并没有广泛采用损失函数定制,尽管它们有时肯定会从中受益。让我们考虑一个围绕 MSE 的通用形式调整:
函数 g 可以像数据科学家幻想的那样复杂,只要你的应用从中受益……而且函数 g 有某种形式的导数。但是,即使不深入兔子洞,我们也可以挑选最简单的误差 g 步函数:
在这种情况下, g 只不过是一个动态权重,它是根据误差为每个对象选择的。姑且称之为分段 MSE 吧。最明显的参数选择是使它们与每个错误的等级成比例。这样,模型会比早期交付更努力地避免延迟交付,变得不那么乐观。
那么,没有什么比计算预测的一阶和二阶导数更容易的了:
这就是我们在您最喜欢的梯度推进实施之上运行所需的全部内容,并具有广泛的超参数优化
左图显示了与每个篮子的预期评级成比例的损失函数形状。右图显示了超参数优化目标(评级)
我们在与香草 RMSE 的比赛中取得了一点成绩,但前面还有很长的路要走。事实是,我们新的损失函数形状不是最优的,即使它看起来像。
考虑一个简单的例子。数据集有一个异常对象,它完全是凭空出现的:一个快递员(我们称他们为队长)的自行车在距离目的地仅一个街区的地方坏了,送货花了 3 个小时。您的数据集中没有可以帮助区分这种特殊情况的要素,而且很可能该对象会损害整体算法的性能。如果损失函数不太关注异常值,那就更好了。
反对这种固定客户损失的第二个理由是优化。机器学习中的大多数模型都是通过某种形式的梯度下降来优化的。在这个顺序的(而且往往是随机的)过程中,任何变化:不同的初始化、学习速率、批量洗牌都会导致不同的结果。因此,正如我们改变采用不同数据集的模型的学习率一样,调整损失函数的系数可能有助于提高性能。
损失函数选择的自动化
遗憾的是,我们无法做出模型的 c_k 参数。但是让它们成为超参数并不太坏。现在,在其他模型的参数中(我使用的是 Catboost ),我们将使用相同的超参数优化程序来调整 c_k。
左图显示了一系列考虑的损失函数(五分位数损失)。右图显示了超参数优化目标(评级)
现在,分数明显更高了。毫不奇怪。这是因为损失是为这个特定问题和这个特定数据集定制的。
此外,通过这种设置,HPO 直接(嗯,几乎)优化了您关心的指标——平均预期评级,而不是抽象的和业务不可知的 MSE。
下一个图显示了我们的赢家损失函数的形状,它是在第 151 次迭代中发现的。
分段均方误差的最佳损失。是由 HPO 程序与 240 轮选择。
误差低于 18 的地方看起来到处都是倾斜的 MSE。然后,它将误差大于 18 的对象去优先级化。看着上面的柱状图,它可能看起来是反直觉的:18 分钟的误差预计是最需要避免的!
但我们不应该忘记,HPO 过程不仅着眼于柱状图,而且整体考虑数据集、模型性能、模型的其他超参数和目标的组合。可能没有一个物体的模型会犯如此大的错误。因此,相反,它专注于将物体从篮 11–18移动到篮 5–11。或者,这种行为可能有其他原因。因此,损失函数形状不必是直观的,以便提供最好的分数。当综合考虑所有因素时,这个损失函数在这个特定的背景下是不成立的。
又一次海关损失
所以,我们已经取得了很大的进步。让我们再做一点小小的改变。先前的损失函数通过缩放 RSE 来修改它。很好,但是不够灵活。向前迈进了一步,通过增加一个偏差来概括它:
然后,我们称之为有偏分段 MSE。
同样,我们执行 HPO 的相同操作,但是现在与我们的 c 和 b 一起运行,与算法的其余超参数一起运行。
左图显示了一系列考虑的损失函数(有偏差的分段 MSE 损失)。右图显示了超参数优化目标(评级)
最好的分数是我们以前最好成绩的又一次增加。新获得的定制损失的形状看起来更像弗兰肯斯坦,但仍然很漂亮。
有偏分段均方误差的最佳损失。是通过 HPO 程序用 360 轮选出来的。
其他损失
上面将定制的可调物镜与 RMSE 进行了比较,尽管后者是最广泛采用的一种物镜,但对于当前应用来说,它有一个主要缺点—它是对称的。但是还有其他类型的非对称损失函数。一个流行的例子是五分位数损失。我们要把这个和我们的分段函数进行比较。同样,它的主要参数α将被视为超参数,与之前实验中的方式相同。
左图显示了一系列考虑的损失函数(五分位数损失)。右图显示了超参数优化目标(评级)
分位数回归的结果比任何以前调整过的 RMSE 要好,但是仍然会因调整过的分段损失而损失很大。
值得注意的是,除了损耗特定参数外,上述所有实验都使用了相同的超参数集。此外,对于模型的超参数的数量增加的 HPO 运行,迭代的数量也增加以说明这一点(例如,对于分段需要 7 个额外的超参数,而对于有偏差的分段 MSE 有 14 个额外的超参数)。
基于模型的目标
事实是,这里我们已经使用了一个非常简单的方法来评估预期评级,但是没有什么(几乎没有什么)阻止你使用一个复杂的 ML 模型来评估你的目标。比方说,你想把客户流失降到最低,而客户流失取决于配送时间误差。答对了。这是完美的婚姻,尤其是当客户流失模型已经开发出来的时候。唯一的问题可能是,整个训练变得非常慢,但是在很多应用中,这根本不是一个限制。
非凸物镜
在这个特殊的例子中,我们的主要度量评级几乎是凸的,这就是为什么即使 RMSE,五分之一正在失去,差距不是那么大。例如,如果我们的交付时间经验分布看起来更像下图中的分布,分段损失的边际收益将显著增加。在 链接 部分,你将可以找到一个笔记本,在它周围玩耍。
取决于交付时间估计经验的平均评级示例。
结论
损失函数只受你的幻想和你的计算能力的限制,而且通常来说,实现和调整一个定制的损失函数实际上是有益的。
一览表
尽管这些特定的价值是合成的,但我们的生产设置以非常相似的方式工作,该模型在我们平台上的实际影响是极好的:我们已经将超过 25%的订单转移到交付时间体验更好的篮子中。它不仅帮助我们更好地理解什么是重要的以及为什么重要,而且它也为我们的客户带来了很好的体验(我们知道它变得有多好!).
链接
与文章相关的代码位于数据集的中(见免责声明)。
此外,如果有人想使用任何损失函数,你可以安装这个小的库(顺便说一句,它对任何贡献都非常开放)。
绕过熊猫的记忆限制
原文:https://towardsdatascience.com/bypassing-pandas-memory-limitations-9abb574fdf76?source=collection_archive---------28-----------------------
我如何简化我的 ETL 管道
V-Yan 在 Shutterstock 上的照片
当你遇到一组新的数据时,你需要花一些时间去了解它。这个过程就像第一次见到一个陌生人一样。而不是问“你叫什么名字?”,“你是哪里人?”,以及“凯蒂·佩里还是泰勒·斯威夫特?”你问“你的分布是什么样的?”,“您是否包含任何缺失或意外的数据?”,以及“您如何与其他数据相关联?”。
一个典型的数据科学家一天要花 80%的时间来准备要处理的数据。像熊猫这样的工具通过增加一套强大的功能来探索和管理数据,使得这个过程更加高效。熊猫可以将一个普通的 CSV 文件转换成有洞察力的聚合和图表。再加上熊猫的头号特点就是让我出不了 Excel。
然而,熊猫并不全是玫瑰和阳光。由于数据帧(熊猫的基础)保存在内存中,一次可以处理多少数据是有限制的。当试图将纽约出租车数据(10 亿多行和 10 年的信息)的大小打包到 Pandas 中时,分析数据集可能会导致内存不足异常。大多数熊猫相关教程只使用 6 个月的数据来避免这种情况。
克服记忆极限
在 Pandas 中处理大量数据(太大而不适合内存)需要以下方法之一:
- 将数据分成易于管理的部分(分块)。
- 使用 Pandas 之外的服务来处理数据的过滤和聚合。
- 以上两种方法的结合。
Apache 项目 Spark 和 Arrow 旨在提供处理大数据的解决方案,但我发现安装和使用数据库是 Arrow 和 Spark 带来的复杂性的无痛替代方案。最近,我偶然发现了开源项目 QuestDB ,它声称在时序数据库领域具有高性能,所以我决定尝试一下。
QuestDB 的 REST API 使用一种我已经熟悉的查询语言接受请求:SQL。如果需要的话,可以对结果进行分页,但是也可以将它们过滤成对熊猫的内存更友好的大小。虽然性能分析不是这篇文章的主要目标,但是通过 QuestDB 的 SIMD 指令和高性能设计,处理速度也有所提高。
与常见的 ETL 方法相比,在数据管道中加入像 QuestDB 这样的数据库有一些优势(如下图所示):
- 查询数据集的动态方式。
- 降低了过滤和聚合的复杂性。
- 缩短从原始数据到熊猫的路径。
在之前(使用 ETL 工作流)和之后(使用 QuestDB)处理大型数据集的过程。作者图片
使用 QuestDB
对于下面所有的例子,我使用一个简单的函数来查询 QuestDB 并将结果转换成 Pandas 数据帧。
import pandas as pd
import requests defread_questdb(query, host, per_page = 10000, max_records = None):"""
Sends a SQL query to a specified host.
Parameters
----------------
query : string
A SQL query
host : string
A host location in the form of a URL. [http://host:port](http://host:port)
per_page : int
The limit of results to return per page.
max_records : int
The maximum amount of records to return (soft limit).
"""data = []
offset = 1
page = 1
get_more = True
columns = None
params = {"query": query, "limit": f"{offset},{per_page * page}","count": "true"}
while get_more:
r = requests.get(f"{host}exec", params=params)
jsond = r.json()
if r.status_code != 200:
raise ValueError(jsond['error'])
if not columns:
columns = [x['name'] for x in jsond['columns']]
if jsond['dataset'] != []:
data = data + jsond['dataset']
if jsond["count"] < (per_page * page) or (max_records != None and (per_page*page) >= max_records):
get_more = False
else:
offset = (per_page * page) + 1
page += 1
params['limit'] = f"{offset},{per_page * page}"
params['nm'] = 'true'
return pd.DataFrame(data=data, columns=columns)
对于数据,我已经预加载了纽约出租车数据集,该数据集从 2009 年到 2019 年有 1,636,055,518 行数据。列定义可在 nyc.gov 的网站上获得。
文档中有更多关于安装 QuestDB 以及如何加载数据的信息。
了解出租车数据集
先从分析 fare_amount 开始。在我的 Macbook Pro 上不可能将 16 亿行数据存储到 Pandas 中,所以我需要使用 QuestDB 来帮助我将数据压缩到更易于管理的大小。
平均票价是多少?
query = "SELECT avg(fare_amount) FROM trips"
avg_df = read_questdb(query, hostname)
avg_df['avg'][0]
>>>11.771664413356518
我也很好奇 fare_amount 和 passenger_count 有什么关系。较大的团体倾向于长途旅行吗?以下是按乘客数量划分的平均票价图。
query = "SELECT passenger_count, avg(fare_amount) FROM trips"
df = read_questdb(query, hostname)
ax = df.plot.bar(x='passenger_count', y='avg', title='Average Fare by Passenger Count', label='Passenger Count')
ax.legend(["Avg Fare Amount ($)"])
#add a horizontal line for the average
ax.axhline(y=avg_df['avg'][0], color='red')
passenger_count 为 0 对我来说不合适,虽然这可能有一个很好的原因,但我现在将从数据帧中删除该数据,并对数据进行排序和重新索引。
#drop zero passenger count data and set index and sort values
df = df.drop([6]).set_index('passenger_count').sort_values('passenger_count')#change to integers
df.index = df.index.astype('int64')#don't need to specify x axis
ax = df.plot.bar(y='avg', title='Average Fare by Passenger Count', label='Passenger Count')
ax.legend(["Avg Fare Amount ($)"])
ax.axhline(y=avg_df['avg'][0], color='red')>>>avg1 11.548458
2 12.119514
3 11.892298
4 12.091368
5 11.466198
6 12.276963
7 31.622068
现在,乘客计数按升序排列,0 乘客计数列已删除,我可以看到不同乘客计数的平均值与数据集平均值一致,只有乘客计数为 7 除外。
由于我已经将目标数据集缩小到 passenger_count 为 7 的行,所以我可以将目标行放入 Pandas 数据框架中,并使用“describe”函数来获得 fare_amount 分布的概况。
query = "select * from trips where passenger_count = 7"
df7 = read_questdb(query, hostname)
df7['fare_amount'].describe()
>>>
count 1494.000000
mean 31.622068
std 31.708050
min 0.010000
25% 7.000000
50% 12.000000
75% 70.000000
max 373.000000
Name: fare_amount, dtype: float64
该输出的三个初步观察结果:
- 标准差大于平均值。既然票价不可能是负数,那就意味着数据严重失真。
- 最小值为 0.01。我不是出租车的常客,但我很确定一旦打开计价器,起价会超过 0.01 美元。
- 最大值为 373。异常值可能会对平均值施加压力。
我可以画出数据的分布。
ax = df7['fare_amount'].plot.hist()
正如预期的那样,分布严重偏斜,一些较大的异常值将平均值拉得更高。但是这告诉我们什么呢?所有其他的乘客数量也是如此吗?我应该改用中间值而不是平均值吗?还能对这些数据提出什么问题?
换个话题,我很想知道每小时的平均费用是如何随着时间的推移而变化的。我可以使用 QuestDB 中的抽样来帮助组织每月时段中的 fare_amount 平均值。
query = """
SELECT pickup_datetime, avg(fare_amount) / (avg(cast((dropoff_datetime-pickup_datetime) as long)) / 1000000 / 60 / 60) fare_hr FROM trips SAMPLE BY 1M;
"""
fare_change_df = read_questdb(query,hostname)
fare_change_df['pickup_datetime'] = pd.to_datetime(fare_change_df['pickup_datetime'])
ax = fare_change_df[:125].plot(x='pickup_datetime',y='fare_hr')
这张图表产生了新的问题。为什么 2012 年 fare_amount 会暴涨?是什么导致了 2015 年的跳水?平均每小时工资在稳步下降;什么因素会导致这种情况?
结论
要让我对出租车数据感到放心,还有很长的路要走。我只触及了单个列的表面,还有关于其他列以及这些列之间的关系的无限量的附加问题。每个回答的问题都会引出更多的问题。
Pandas 是 Python 数据科学堆栈中比较重要的库之一,但是随着数据量的增长,完全在 Pandas 中工作需要额外工具的帮助。我喜欢使用 QuestDB 来执行大容量过滤、聚合和分组操作,以扩展 Pandas 的效用。
[1]吉尔出版社,清理大数据:最耗时,最不愉快的数据科学任务,调查称(2016),福布斯
面向 Pythonistas 和数据科学家的 C++
原文:https://towardsdatascience.com/c-for-pythonistas-and-data-scientists-2e1a74a7b8be?source=collection_archive---------38-----------------------
《依附入门》有助于学习 C++
图片取自https://negativespace.co/。
当我在大学学习数学的时候,我在一个统计模块中接触到了 Python 和 R。从那以后,我只坚持使用这两种语言,只在需要的时候涉足其他语言。
最近,我想提高我的编程基础,并了解更多关于我们数据科学家对 Python 和 R 习以为常的底层概念,同时也想找到一些方法来改进我的工作流。所以我接受了学习 C++的挑战,这样做让我发现了依附。
坚持
Cling 是一个交互式的 C++解释器,有助于提供类似于用 Python 编码的体验。这给我的 C++学习经历带来了巨大的好处,我相信它也能帮助许多其他人。
你好,世界!
Hello,World 的基本 C++程序!对于 Python 用户来说可能是令人畏惧和不快的。下面是一个例子:
#include <iostream>int main() {
std::cout << “Hello, World!” << std::endl;
return 0;
}
一旦编写完成,程序就可以被编译(如果没有错误),然后运行以查看输出。
下面是相同的,但是当使用附着解释器时:
#include <iostream>
std::cout << “Hello, World”! << std::endl;
不需要编译!
这是一个非常简单的例子,但是使用 Cling 可以让你以一种互动的方式探索 C++函数、向量等等,让你做更多的实验。
例如,为了试验向量,你可以使用解释器来帮助学习函数和语法。
#include <vector>
vector<int> data;data.push_back(1);
data.push_back(2)
// return the vector to see what happened
data;
Jupyter 笔记本
还有一个 Jupyter 内核,它可以使学习更加互动,同时还可以帮助您学习如何在数据科学流程中展示您的工作。
装置
安装非常简单,使用 Conda 即可完成:
conda install -c conda-forge cling
要获得 Jupyter 内核,还需要安装“xeus-cling ”:
conda install xeus-cling -c conda-forge
设置 Jupyter 笔记本
正常运行Jupyter Notebook
,然后选择一个 C++内核,如下图所示:
结束语
解释 C++并不是最终的解决方案,像这样使用 C++意味着你失去了这种语言的很多能力。但是,作为一种学习工具,依附是非常宝贵的,如果你已经有了一些其他语言的基础,它可以帮助你加快学习进程。
相关的代码和笔记本可以在我的 GitHub 上获得,这也包括代码启动代码来导入一个简单的单列 CSV。
c 代表分类
原文:https://towardsdatascience.com/c-is-for-classification-37b798ca7cf1?source=collection_archive---------72-----------------------
分类和回归问题之间的区别的简要概述。
Alexander Schimmeck 在 Unsplash 上的照片
什么是分类?
分类是两种类型的监督机器学习任务(即我们有一个标记数据集的任务)之一,另一种是回归。
需要记住的要点:监督学习任务使用特征来预测目标,或者,用非技术术语来说,它们使用属性/特征来预测某些东西。例如,我们可以通过篮球运动员的身高、体重、年龄、脚步速度和/或其他多个方面来预测他们会得多少分或者他们是否会成为全明星。
那么这两者有什么区别呢?
- 回归任务预测一个连续的值(即某人将得到多少分)
- 分类任务预测一个非连续值(即某人是否会成为全明星)
我如何知道使用哪种技术?
回答以下问题:
“我的目标变量有顺序吗?”
例如,我预测读者推荐年龄的项目是一个回归任务,因为我预测的是一个精确的年龄(例如,4 岁)。如果我试图确定一本书是否适合青少年,那么这将是一项分类任务,因为答案可能是“是”或“否”。
好吧,所以分类只针对是/否,对/错,猫/狗问题,对吧?
不,这些只是简单的例子😄
示例 1:将人员分组
想象一下这样一个场景,你每年都有一批新学生,你必须根据他们的性格特征把他们分门别类。
照片由em recan ark在 Unsplash 上拍摄
在这种情况下,房屋没有任何类型的顺序/等级。当然,哈利肯定不想被安置在斯莱特林,分院帽显然考虑到了这一点,但这并不意味着斯莱特林更接近格兰芬多,就像 25 更接近 30 而不是 19 一样。
示例 2:应用标签
类似地,如果我们有一个包含菜肴成分的数据集,并试图预测原产地,我们将解决一个分类问题。为什么?因为国家名称没有数字顺序。我们可以说俄罗斯是地球上最大的国家,或者中国是人口最多的国家,但这些都是国家的属性(即土地面积和人口),而不是国家名称的内在属性。
明白了!数字是回归,文字是分类
抱歉,没有。
回想一下我之前提到的图书推荐项目,回答以下问题:如果我想预测一本书是否适合
- 幼儿(2-5 岁)
- 小学年龄的儿童(6-10 岁)
- 青少年(11 -12 岁)
- 年轻成年人(13-17 岁)
- 成人(18 岁以上)
我会用什么:回归还是分类?
照片由马库斯·温克勒在 Unsplash 上拍摄
好吧,假设标签有一个清晰的顺序,你肯定会想把这个问题当作一个回归问题,把“小孩”编码为“1”,把“成人”编码为“5”。
结论
非常感谢您的阅读!我希望这个对分类和回归任务之间的关键区别的简要介绍已经澄清了你的问题和/或巩固了你已经知道的东西。
最后,如果你没有带走任何其他东西,我希望你永远不要忘记以下几点:
总是从问“我试图预测什么”开始。
为什么?因为一旦这个问题解决了,剩下的就变得简单多了;正如卡尔·荣格曾经说过的,“问对了问题,就已经解决了一半的问题。”
进一步阅读
向孩子(或你的老板)解释监督学习
原载于 2020 年 5 月 24 日https://educatorsrlearners . github . io。
有线新闻直播人口统计
原文:https://towardsdatascience.com/cable-news-on-air-demographics-2e50788ab377?source=collection_archive---------29-----------------------
使用 matplotlib、plotly 和 python 探索饼图中的相关数据
在 Unsplash 上拍摄的 ThisisEngineering RAEng
对于那些熟悉这位电影主持人的人来说,这部电影的情节围绕着各种角色的恶作剧,一位女性打破玻璃天花板,主持地方新闻,而不是全国新闻。苹果的电视剧《早间秀》(The Morning Show)也使用了打破电视播出规范的情节设计。根据美国人口普查数据,美国女性人数超过男性 50.8%比 49.2%。一段时间以来,在有线电视新闻网上看到女性变得很正常,然而,考虑到今年对种族公正的重新关注,少数族裔在整个网络的空中记者中的代表性如何?在这篇文章中,我将探讨航空人才网络的人口统计和性别分布。我将以饼状图的形式展示福克斯新闻频道、CNN、ABC、CBS 和 NBC 的性别和种族统计数据,并使用支线图创建一个水平布局。此外,我将使用均方差来评论最准确和最不准确地反映美国一般人口的网络。
根据美国人口普查数据,详细描述美国性别和种族人口统计的饼状图。图片作者。
数据和图书馆
性别和种族统计数据是从每个网络网站的图像数据中手动收集的。如果可能的话,使用他们的个人维基百科页面进一步调查暗示不同种族人口统计或没有代表性图像的空中人物的名字。美国人口普查数据网站用于收集美国的性别和种族人口统计数据。
饼图是使用 Matplotlib 创建的静态图表和 plotly 创建的动态图表。Pandas 用于将 excel 文件加载到数据框架中。所有的脚本都是在 Jupyter 笔记本上完成的,可以在 GitHub 上找到数据集。
在我们的数据中,拥有最多空中通讯员的网络是哥伦比亚广播公司,有 93 名空中人物。这个数字随着出现在节目 60 分钟的嘉宾记者的数量而膨胀。下一个最高的网络记者数是美国有线电视新闻网(CNN ),有 71 个空中贡献者。每个网络的直播贡献者平均人数略多于 61 人。数据文件由站点的计数数据组成。为了创建我们的饼图,我将计数数据标准化为百分比。
## Load count data
df = pd.read_excel("New_Demos.xlsx")## Split into demographics and gender tables
df_D = df[['Station', "White", "Latino", "Black", "Asian"]]
df_G = df[['Station', "Male", "Female"]]## Get percentages from counts
df_D = df_D.set_index("Station")
df_D=df_D.div(df_D.sum(axis=1),axis=0).multiply(100).round(decimals=1)df_G = df_G.set_index("Station")
df_G=df_G.div(df_G.sum(axis=1),axis=0).multiply(100).round(decimals=1)
我使用下面的代码将美国人口计数手动添加到相应的 dataframe 对象中。
df_D.loc['US Population'] = [60.0, 18.4, 12.4, 5.6]
df_D['Other'] = 0.0
df_D.at['US Population', "Other"] = 3.6df_G.loc['US Population'] = [49.2, 50.8]
计算均方差
为了计算一个网络的人口统计和美国一般人口之间的差异,我实现了一个函数来计算均方差(MSE)。该函数执行以下步骤:
- 设置基线行(我使用美国人口或第六行)
- 循环遍历每一行,直到基线行
- 计算每行之间的 MSE,并将其存储到一个列表中
- 将列表作为新列追加到原始数据帧中
def mse(dataframe, size):
baseline = list(dataframe.iloc[5])
sums = []
for item in range(5):
comparison = list(dataframe.iloc[item])
## Calculate MSE
amount = [(abs(j-i)**2)/size for i,j in zip(baseline, comparison)]
sums.append(sum(amount))
sums = ['%.1f' % elem for elem in sums]
sums = [float(elem) for elem in sums]
sums.append(0)
return(sums)df_D['MSE'] = mse(df_D, 5)
df_G['MSE'] = mse(df_G, 2)
网络的 MSE 分数。图片作者。
美国广播公司是由男性主导的,福克斯与美国的真实人口统计相比很差。另一个有趣的福克斯统计数据是,20 位女性中有 13 位是金发女郎,占了令人吃惊的 65%。据研究人员称,白种人中天生金发的人估计只占总人口的 5%。人们注意到,身居要职的女性比普通人更有可能拥有金发。
照片由mārtiņš·泽姆利克斯在 Unsplash 拍摄
构建动态饼图
为了创建动态饼图,我使用了 plotly。不幸的是,动态图表在本文中变成了静态的,但是功能仍然保留在 GitHub 上的笔记本代码中。为了创建动态图表,我将 plotly 链接到笔记本。
## Load libraries
import numpy as np
import plotly.offline as py
import plotly.graph_objs as go
from plotly import tools## Connect to notebook
py.init_notebook_mode(connected=True)
然后构建互动情节:
## Create Color Schema
cmap = plt.get_cmap('Set2')
colors = [cmap(i) for i in np.linspace(0, 1, 8)]### Note: 'marker=' lines are apart of the go.Pie function
## Build Gender Pie
gender_pie = go.Pie(labels=q['US Population'].index,
values=q['US Population'], marker=dict(colors=colors[1:3],line=dict(color='#FFF', width=2)), domain={'x': [0.0, .4], 'y': [0.0, 1]}, showlegend=False, name='Gender', textinfo='label+percent')## Build Demographics Pie
demo_pie = go.Pie(labels=w['US Population'].index,
values=w['US Population'], marker=dict(colors=colors, line=dict(color='#FFF', width=2)), domain={'x': [.6, 1], 'y': [0.0, 1]}, showlegend=False, name='Demographics', textinfo='label+percent') ## Set pie chart layout and plot figure
layout = go.Layout(height = 600, width = 1000,autosize = False, title='Gender and Racial Demographics of US Population')fig = go.Figure(data = [gender_pie,demo_pie ], layout = layout)py.iplot(fig, filename='basic_pie_chart')
生成的结果图如下,用户可以滚动查看每个切片的更详细视图。在我们的示例中,由于数据帧被标准化为 100%,因此计数数据与切片大小相匹配。
详细描述美国人口性别和人口统计的动态饼图的静态图像。图片作者。
静态饼图
为了构建静态的性别和人口统计饼图,我使用 matplotlib 和 subplots 让两个饼图共享一个水平轴。我们的网络数据不包括人口统计中的“其他”类别,因为构成该类别的不同身份的数量很大。首先,让我们定义我们的数字和两个支线剧情。
## Horizontal Layout (I use this!)
fig = plt.figure(figsize=(16,8), dpi=200)
ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)
子情节中定义的三个位置定义了子情节的位置和布局。
## Vertical Layout
fig = plt.figure(figsize=(8,16), dpi=200)
ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
我决定在这篇文章中使用水平布局来显示更容易。为了准备创建饼图的数据,我调换了我们的数据框架,并手动为图表分配了颜色。
## Transpose dataframes
q = df_G.transpose()
w = df_D.transpose()## Gender pie chart
z = q['Fox'].plot(kind='pie', ax=ax1, autopct='%1.1f%%', startangle=90, fontsize=16, colors=['dodgerblue', 'pink'])## Demographics pie chart
t = w['Fox'].plot(kind='pie', ax=ax2, autopct='%1.1f%%', startangle=90, fontsize=12, colors=['thistle', 'seagreen', 'gold', 'coral'])## Remove label text between plots
plt.ylabel('')
ax1.yaxis.label.set_visible(False) ## Save figure
plt.savefig("Images/Fox.png", dpi=400)
以下是新闻网络的静态饼状图,从最大 MSE 到最小 MSE,在人口统计数据框架中,美国人口重复出现在底部。
福克斯新闻频道
福克斯新闻频道谈空气个性性别和人口分布。图片作者。
全国广播公司
全国广播公司对空气个性性别和人口分布。图片作者。
美国有线新闻网;卷积神经网络
美国有线电视新闻网关于空气人物性别和人口分布。图片作者。
哥伦比亚广播公司
哥伦比亚广播公司对空气个性性别和人口分布。图片作者。
美国广播公司
空气中的人物性别和人口分布。图片作者。
美国人口
根据美国人口普查数据,详细描述美国性别和种族人口统计的饼状图。图片作者。
结论
这是一个新网络关于空气人物性别和人口统计的案例研究。一些电视网在让直播人物与美国人口相匹配方面比其他电视网更好,CBS 在性别和人口统计方面的 MSE 最低。福克斯新闻频道是民族构成中最不具代表性的。我的名字是科迪·格利克曼,可以在 T2 的 LinkedIn 上找到我。这篇文章的代码和数据可以在 GitHub 上找到。请务必查看我的其他一些探索 python 可视化技术的文章。
[## Python 中的星图
使用 Diamonds 和 Matplotlib 创建星图的教程
towardsdatascience.com](/stars-charts-in-python-9c20d02fb6c0) [## 不断变化的美国住房市场人口统计数据
一个使用海绵和赛璐珞制作动画的人口金字塔
towardsdatascience.com](/changing-us-housing-markets-demographics-34d9b0c71cb4) [## COVID 期间的大学足球旅行
当圣母大学在 8 月 17 日暂停面对面学习时,这是对阳性病例激增的回应…
towardsdatascience.com](/college-football-travel-during-covid-1ced0164840e)
Apache Spark 的缓存模式
原文:https://towardsdatascience.com/cache-patterns-with-apache-spark-14235f40a29?source=collection_archive---------4-----------------------
平衡磁盘、ram 和真实来源之间的选择
许多角度提供了同一场景的许多视图。缓存与分区的工作方式类似。信用
Apache Spark 提供了一些非常简单的机制来缓存进程内计算,这有助于减轻繁琐且固有的复杂工作负载。这篇文章旨在提供一个可接近的心智模型来分解和重新思考如何构建 Apache Spark 计算。无论您的下一个应用程序是批处理作业还是流作业,这里的目标都是为您提供必要的先决条件,以便满怀兴趣地处理您的下一个 Apache Spark 项目!
火花应用程序工作负载
首先,让我说明一个简单的工作负载应该适合内存中数量相对较少的执行器——因为简单的工作负载本质上是简单的:就像加载一组数据,并在一个公共的 ETL 流中将它与另一组数据连接起来。这里所需的开销往往很低,因为您只需要在总处理时间的一部分内将两个数据集都放入内存中——如果调优正确的话。这种工作量是数据工程师的饭碗。
简单的 Spark ETL 流程
上面是一个基于批处理的提取转换加载(ETL)工作负载的简单示例。批处理工作负载通常更像是传统的 Map-Reduce 风格的作业,正是这种风格让 Hadoop 在当年大受欢迎!
C 复杂的工作负载通常不会完全适合内存由于底层数据的成本,或者由于作业的性质,如流管道作业。复杂的工作负载往往会以非常有趣的方式咬你,主要是因为在本地工作的事实,在开发或阶段环境中,很少* 在生产中第一次就能很好地扩展。*
生产可能是一个可怕的地方,数据速率(每秒事件数等)以超出传统正态分布的方式激增和增长。不确定的事情,尤其是在海量数据的领域,往往会导致管道尖叫着停止工作,导致工作死亡,让客户愤怒——这一切都是因为我们必须在运营成本和不幸的内存不足异常之间进行平衡。
复杂工作负载的示例包括典型的时间序列摄取管道,具有针对实时指标或运营仪表板的流式统计聚合,或者 good ol '实时机器学习管道(请参见下面的示例)。这些工作负载通常是数据工程师和应用机器学习或统计/性能工程师的共同努力。
复杂火花流工作负载
这可能是一个计算量很大的 Spark 应用程序。
上面的例子是一个假的用例,使用 Apache Spark 结构化流进行所谓的流-流连接。这进一步包括通过昂贵的实时机器学习转换、二次流连接、过滤的后连接查询以及广告推荐流的下游发布,将广告定向到该流管道。理论上,像这样的管道可以把你每天在网上看到的广告发送给你。
既然我们对简单工作负载和复杂工作负载之间的差异有了大致的了解,我们可以学习如何以更智能的方式解决复杂的问题。走吧。
通过分解简化
有趣的是,大多数简单工作负载和复杂工作负载之间的差异往往可以归结为智能分解模式,因为复杂工作负载可以被视为一系列具有分布式终点线的简单工作负载,所有进程都独立地奔向一起,并且它们都可以完全独立地运行(例如:非确定性工作负载)或确定性地运行,其中先前的执行阶段将问题简化为更简洁的层。
接下来我们将看看 Spark 是如何分配工作的。相信我,这一切都指向某个地方!
Apache 的基本原理引发了分布式计算
在 spark 世界中,一切都始于资源。这个资源有一个源,描述了如何从给定的源读取数据。在最简单的基于文件的 spark 应用中,我们从一个 DataFrameReader 开始。
一堆乐高积木。可以把 RDD 看作是一个单独的单元,它被一些独立的小分区封装起来。如果 RDD 中的一个块丢失了,它可以并且将会被重新计算。信用 Unsplash
DataFrameReader 可用于大多数较简单的数据读取任务,如 json、csv、orc 和其他任务,使我们能够快速将数据加载到 Spark 中,以通过一系列转换进行评估,从而得出最终结果(或行动)。正是这个(load)->(transform)->(write)有向无环计算图(DAG)使得 Spark 工作起来如此有趣。从一个简单的文件开始,如下所示。
*spark.read.json("file://some/path/file.json")*
我们能够很容易地将 json 数据作为数据帧读入 spark 内存。这个数据框架在 Apache Spark 的最新版本中封装了一个强大但几乎隐藏的宝石。那是 RDD。
RDD 是 spark 如何在自己的游戏中击败 Map-Reduce 的。它代表弹性分布式数据集。这些数据集被划分成多个逻辑分区。例如,假设您有一个有 32 个分区的阿帕奇卡夫卡主题。Apache Spark 会自动将 Kafka 资源上的读取流转换成一个有 32 个分区的 RDD ,以遵循并保留最初的 Kafka 分区方案。
这意味着以下是 rdd 的真实情况。
- 所有分区都成为执行阶段中的任务。因为每个分区都可以并行操作,这意味着您的处理作业可以平均分布在所有可用的 Spark 执行器上。(Spark 执行器是运行在 Spark Workers 上的 JVM 进程)
- 在从读到写(或动作)的过程中丢失的任何单个分区都可以独立地重新计算,而无需所有分区都重新开始。与 Map-Reduce 相比,这是一个巨大的速度提升,在 Map-Reduce 中,整个任务都会失败,而单个任务或计算阶段会失败。
- 如果文件系统或 Kafka 主题使用这些块或分区来提供 RDD 的底层分区,而这又可以在简单的数据帧中使用,那么您可以使用常见的散列分区方案( crc hash )来确保您总是在相同的逻辑分区中处理相同种类的数据。例如:假设我们有一个按照一天中的几个小时划分的卡夫卡主题。我们将有 24 个分区,对于给定分区的数据处理将总是有一组那个小时的数据。是的,这将有热点,但我们永远不必在给定分区之外寻找该小时之外发生的信息,而且在许多情况下,这意味着我们不必四处转移数据,也不必承担在整个集群中移动数据的 IO 成本。
但是什么是遗嘱执行人呢?
展示了 Spark 应用程序的结构:照片来源 @ Spark Docs
执行器是 Spark 对分布式计算进程的命名,它只是一个运行在 Spark Worker 上的 JVM 进程。执行者的唯一工作是在工作的各个阶段内,完全致力于被描述为任务的工作的处理(更多细节参见 Spark 文档)。
持久性、缓存和存储级别:您为什么应该关注
内存胜过昂贵的 IO。信用
明智地使用缓存
我一直认为缓存是调优的一个典型组成部分,鉴于这篇文章是关于缓存的,那么让我们假设你会免费带回家一点调优和 调试技能 !
在 Apache Spark 中适当地使用缓存可以让您成为可用资源的主人。内存不是免费的,虽然它可能很便宜,但在许多情况下,从长远来看,将数据帧存储在内存中的成本实际上比返回到真实数据集的来源更昂贵。如果您已经查看了 Spark UI (当 spark.ui.enabled 设置为 true 时在端口 4040 上运行)并且已经确定您不能从系统中挤出性能,那么您是应用缓存的候选人。
主要是如果计算过程中花费的大部分时间是从系统 A 或 B 或 C(比如 HDFS 或 MySQL 或 Redis)加载数据,并且无法通过向外扩展来提高速度。spark 的横向扩展意味着在更多机器上的更多 RAM 上添加更多 CPU 内核。然后,您可以开始考虑有选择地缓存最昂贵的计算部分。
*// profile allows you to process up to 64 tasks in parallel.
spark.cores.max = 64
spark.executor.cores = 8
spark.executor.memory = 12g*
上述配置将允许您使用 8 台运行 8 个内核和 12gb ram 的机器。我们使用 amazon 的 c5d.2xl 机器,为堆外分配 2gb,为操作系统分配 2gb。因此上例中的 12g。*
火花储存
当您缓存数据帧的沿袭时,StorageLevel 的概念就出现了。
*val df = spark.**read
.schema**(Encoders.**product**[SomeCaseClass].**schema**)
.option("**basePath**", "hdfs://path/to/data/lake/root/table")
.**parquet**("**hdfs://path/to/data**/lake/root/table/year=2020/month=2")
.**transform**(expensiveTransformation)
.**join**(otherDataFrame, df("key").equalTo(other("uuid")))*
上面我们有一个加载、转换和连接带有附加数据框的数据的示例。假设这个操作是懒惰的,在你提供一个动作之前不会计算任何东西,那么我们可以通过在我们的数据帧上调用 head 来欺骗和缓存这个血统,以将 Spark 推入动作。
*import org.apache.spark.**storage**._
df.persist(**StorageLevel**.MEMORY_ONLY_SER)
df.head // computes the expensive operations and caches
df.**storageLevel** // will show you how things are stored.*
一旦您缓存了您的计算,在这种情况下,调用 persist 并选择 StorageLevel。MEMORY_ONLY_SER 您可以根据初始计算的结果继续进行尽可能多的操作,而不必在源代码或初始读取命令处重新开始每个操作。
StorageLevel 有从 DISK 到 OFF_HEAP 到 NONE 的选项。我建议看看那里的选项,并测试有助于加速 Spark 应用程序的不同选项。
当您处理完缓存的数据后,您可以通过调用 unpersist 轻松地将它从 Spark 中移除。用魔杖轻轻一点,告诉哈利波特迷们恶作剧成功了。
*df.unpersist*
这将立即移除缓存,或者您也可以使用阻塞选项。
*df.unpersist(blocking=true)*
然后,您将释放您的资源,用于剩余的必要计算。
大数据和大数据的叉积是内存不足异常— Holden Karau
结论
我对 Spark 进行缓存和持久化的方法是将其更像 JVM 垃圾收集器。如果我需要多次访问同一个数据,我会将它存储在缓存中。这允许我减少往返于数据的真实来源(s3a://或 hdfs://)的次数。考虑到我所处理的数据类型,主要是 parquet 和其他基于文件系统的数据,在 IO 和总加载文件方面都很繁重。一旦我加载了数据,通常最好在做出另一个决定之前缓存数据,这样我就不会不经意地回到 hdfs 或 s3 来再次加载相同的数据。
关于作者
我在 Twilio 的 Voice Insights 团队工作,在这里,我们每几秒钟就会接收数百万个事件,这些事件来自一系列 Spark 流媒体应用,它们都在我们的数据谱系管道中运行。我们是一个混合数据平台/数据工程和数据科学团队,在加州工作。
参见我在Streaming Trend Discovery上的另一篇文章,看看我们如何用 Spark 处理一些更复杂的用例。
使用卷积神经网络(CNN)的仙人掌图像分类达到 98%以上的准确率
原文:https://towardsdatascience.com/cactus-image-classification-using-convolutional-neural-network-cnn-that-reaches-98-accuracy-8432e068f1ea?source=collection_archive---------48-----------------------
我们的目标是构建一个分类器,将图像分类为“仙人掌”或“非仙人掌”
照片由像素的皮克斯拜拍摄
了解数据集
这个分类问题来自于卡格尔挑战赛中的一个。我们的目标是构建一个分类器,将图像分类为“仙人掌”或“非仙人掌”训练集包括 17500 幅图像,而验证集有 4000 幅图像。有仙人掌标志的图像在名为 cactus 的文件夹中,反之亦然。以下是来自训练数据集的示例。
仙人掌
非仙人掌
数据预处理
当我们通过使用 Pyplot 库简单地绘制这些图像来仔细查看其中一些图像时,我们可以观察到它们的大小不同,不适合后面的训练过程。另外,请注意,我们用 1 和 0 标记了所有图像,表示仙人掌和非仙人掌。
因此,我们需要将所有的图像标准化为相同的大小。根据我们的实验,最佳策略是将这些图像裁剪为 48×48 像素的大小。下面是一些裁剪过的图片。第一行显示原始图像,第二行显示修改后的图像。
这种方法的好处是它保存了图像的所有细节;然而,我们有时会丢失图像的边缘,如果图像太小,我们需要用黑色背景扩展图像,使其大小与其他图像相同。失去边缘可能是一个大问题,因为我们有可能用这种技术将仙人掌从图像中切掉。
CNN 结构和培训
卷积神经网络包含 3 层卷积层和 2 个全连接层。每个卷积层都有一个 3 乘 3 滤波器,步长为 2,输出为 64 个节点。之后,数据通过 max-pooling 层,以防止过度拟合并提取有用的信息。
model = Sequential()model.add(Conv2D(64, (3,3), input_shape = X_train.shape[1:]))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3,3)))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3,3)))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(64))model.add(Dense(1))model.add(Activation(‘sigmoid’))model.compile(loss=”binary_crossentropy”,optimizer=”adam”,metrics=[‘accuracy’])history = model.fit(X_train, Y_train, batch_size=32, epochs=10, validation_split=0.1, use_multiprocessing=True)model.save(‘model_48_crop’)
下面是模型结构的概述。
模型概述
我们用 10 个纪元来训练模型,结果显示出惊人的效果。第一个精度是下面代码片段中的训练精度,第二个精度是验证精度。请注意,在最终预测之前,我们使用了部分(10%)训练集作为验证集。
试验结果
我们使用 Kaggle 提供的 validation_set 作为我们的测试集,对我们训练好的模型进行最终预测。
testdata = pd.read_pickle(“pickled_data_validation/crop_images(48, 48).pkl”)test_images = testdata.loc[:, data.columns != ‘class’]test_images = test_images.to_numpy()test_images = test_images.reshape((len(test_images),48, 48, 3))test_images = test_images/255.0print(test_images.shape)test_labels = testdata[‘class’]test_labels = test_labels.to_numpy()type(test_labels)test_labels = test_labels.reshape((len(test_labels),1))loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)print(‘Restored model, accuracy: {:5.2f}%’.format(100*acc))
这是结果。它达到了几乎 99%的准确率,这是惊人的。
结论
这篇文章的主要目标是与你分享卷积网络结构对这种二进制分类问题,如猫和狗的图像分类。希望你能对这类问题有更好的理解。
笼赛:XGBoost vs. Keras 深度学习
原文:https://towardsdatascience.com/cage-match-xgboost-vs-keras-deep-learning-a8bb2f69a9ab?source=collection_archive---------40-----------------------
笼子比赛(作者插图)
自从我第一次尝试深度学习以来,我一直对将其应用于结构化的表格数据感兴趣。我已经写了几篇关于这个主题的文章,我正在为曼宁出版社写一本关于结构化数据深度学习的书。通过利用深度学习的灵活性和减少特征工程的潜力来解决结构化表格数据的问题将是非常棒的。
在表格数据上使用深度学习的想法并非没有批评者。我听到的一个一致的反对意见是,非深度学习方法,特别是 XGBoost,编码更简单,更容易解释,性能更好。我决定我需要用我书中的主要例子来测试这个断言:预测多伦多有轨电车网络的延迟。多伦多市发布了一个数据集,描述了自 2014 年 1 月以来的每一次电车延误。挑战在于使用这个数据集来训练一个机器学习模型,该模型可以预测给定的有轨电车行程是否会被延迟。
为了说明这本书的关键点,我使用 Keras 功能模型创建了一种深度学习方法来解决有轨电车延迟预测问题。该解决方案包括一组模块,用于清理数据、构建和训练模型,以及部署训练好的模型。为了对这两种机器学习方法进行公平的比较,我的目标是用 XGBoost 替换 Keras 深度学习模型,对其余代码进行最小的更改。想象一下,从原始数据的获取到训练模型的部署,整个解决方案就是一辆汽车。我想更换汽车的引擎(机器学习模型),而不改变车身、电气系统、内部或汽车的任何其他方面。
更换发动机,让汽车的其余部分保持不变(作者插图)
我惊喜地发现,用 XGBoost 替换 Keras 深度学习模型是多么容易。以下部分描述了我将包含训练 Keras 模型的代码的笔记本转换成训练 XGBoost 模型的笔记本的步骤。
重构用于定型和测试模型的数据
深度学习模型是一个多输入 Keras 函数模型,它需要在一系列 numpy 数组上进行训练,如以下代码片段所示:
相比之下,XGBoost 模型期望在 numpy 列表数组上进行训练。我需要将训练和测试数据从 Keras 期望的格式转换成 XGBoost 期望的格式。首先,我将测试和训练数据集从 numpy 数组列表转换为列表列表:
我有点害怕使用 for 循环来做这件事——我肯定有更 Pythonic 化的方法——但是这个单元运行得足够快,我希望代码易读。
接下来,我将上一步中的每个列表转换成一个 numpy 列表数组,转置以获得正确的数据组织:
这些转换的输出是我们想要的 XGBoost 格式的数据——列表的 numpy 数组:
下图显示了原始数据形式(numpy 数组列表)的值如何以数据的目标形式(列表的 numpy 数组)结束:
将数据从 Keras 要求的格式转换为 XGBoost 要求的格式
训练和应用 XGBoost 模型
现在我已经有了 XGBoost 所需格式的数据,我已经准备好训练 XGBoost 模型了。下面的代码片段显示了训练和保存模型的代码:
我在 XGBoost fit 语句中使用了一个非默认参数:将 scale_pos_weight 设置为 one_weight 。这个参数让我考虑数据集在否定情况(没有电车延迟)和肯定情况(电车延迟)之间的不平衡。数据集中只有大约 2%的记录表示有轨电车延误。XGBoost fit 语句中的 scale_pos_weight 参数被设置为与 Keras 模型的 fit 语句中使用的值相同的值,其中 class_weight 参数的" 1 "值被设置为 one_weight ,如以下代码片段所示:
接下来,我将训练好的模型应用于测试集,并从模型中获得测试集的预测。
最后,我评估了 XGBoost 模型的准确性:
比较 XGBoost 和 Keras 的结果
现在我们已经有了经过训练的 XGBoost 模型的结果,我们可以比较使用 Keras 深度学习的解决方案和使用 XGBoost 的解决方案的整体特征。下表总结了结果:
XGBoost 与 Keras 结果汇总
让我们更详细地看一下每个比较类别:
- XGBoost 是性能的赢家,尤其是回忆。召回对于预测有轨电车延误的用例至关重要——当将要有延误时,我们希望最小化预测无延误的模型(假阴性)。如果模型预测延迟并且没有延迟(假阳性),用户可能最终步行到他们的目的地或者乘坐出租车而不是有轨电车。最终的影响并没有那么糟糕,因为用户仍然有很好的机会按时到达目的地。然而,由于假阴性(当有延迟时,模型预测没有延迟),影响是坏的,因为用户可能会乘坐有轨电车,并冒着迟到的风险到达他们的目的地。因此,召回对于有轨电车延迟预测问题至关重要,XGBoost 显然具有更好的召回结果。
- 训练时间是平局。在没有 GPU 且迭代次数有限的本地系统上,XGBoost 的训练时间更快。然而,Keras 的训练时间因跑步而异,并且取决于回调耐心参数。“耐心”参数控制一旦目标性能测量(如认证准确度)不再提高,训练运行将持续多少个时期。因为 Keras 的训练时间变化如此之大,所以我认为这个类别是不确定的。
- 代码复杂度是平局。Keras 模型有更复杂的代码来构建功能模型的层。然而,正如上面关于重构用于训练和测试模型的数据的部分所示,XGBoost 需要额外的代码来将数据转换成它所期望的形式。因为 Keras 有更复杂的代码来构建模型,而 XGBoost 需要额外的代码来准备数据,所以我也把这个类别称为平局。
- Keras 在灵活性方面胜出。有轨电车延迟预测问题是《使用结构化数据进行深度学习一书中扩展示例的主题,但其目的是有轨电车延迟预测问题的代码可以应用于各种各样的结构化表格数据集。特别是,如果表格数据集中的一列被标识为自由格式的文本列(例如,零售站点中的商品描述),那么将自动生成 Keras 模型,其中包含处理此类列的图层。XGBoost 没有这种能力来处理包含连续、分类和自由格式文本列的表格数据集。我认为 Keras 方法具有更好的灵活性,因为它可以处理更多种多样的表格数据集。
结论
在本文中,我描述了对街车延迟预测问题的两种解决方案的比较:一种使用 XGBoost 作为模型,另一种使用 Keras 深度学习模型。在这个比较中,我尽可能保持两个解决方案的代码接近;我只修改了与模型的训练和测试相关的部分代码。对比的结果表明,XGBoost 在原始性能,尤其是召回率上更好,Keras 深度学习更灵活。
以下是本文中描述的代码和初始数据集的链接:
- 完整回购:https://github . com/ryanmark 1867/deep _ learning _ for _ structured _ data
- 笔记本包含 XGBoost 的模型训练代码
- 包含 Keras 车型培训代码的笔记本
- 数据准备笔记本(XGBoost 和 Keras 方法通用)
- 原始输入电车延迟数据集
计算并绘制标准普尔 500 每日回报
原文:https://towardsdatascience.com/calculate-and-plot-s-p-500-daily-returns-2ce359e014d6?source=collection_archive---------5-----------------------
使用 Python,Pandas 和 Matplotlib
大多数投资者总是试图找到一个简单问题的答案,即金融市场未来将如何表现。
显然,没有人知道答案,因此,投资者和金融分析师花费大量时间试图找出对未来股票价格的最佳估计。蟒蛇和熊猫可以成为一个伟大的盟友,帮助我们找到上述问题的最佳答案。在这个故事中,我们将编写一个 Python 脚本,它将让我们:
- 用 Python 和熊猫检索市场数据
- 计算市场日收益率
- 在图表中绘制市场日收益率
读完这篇文章后,你将能够分析你感兴趣的任何公司的市场回报。我们开始吧。
斯蒂芬·道森在 Unsplash 上拍摄的照片
用 Python 检索市场数据
首先,要进行任何分析,我们都需要数据。幸运是,使用 Python 我们可以在几秒钟内下载数百个数据点。对于我们的分析,我们需要检索股票价格形式的市场数据。
作为市场数据的代理,我将使用S & P 500 指数 来跟踪美国 500 家最大公司的表现。
标准普尔 500 日报的数据可以使用 Pandas 和 Pandas DataReader 提取。Pandas DataReader 是一个很棒的软件包,可以用 Pandas 远程访问数据。
在 Pandas DataReader 中,我们有多个来源可以下载数据,用 Python 执行多种财务分析。例如,我们可以从可靠的提供商那里获得股票数据或经济指标。查看 Pandas DataReader 文档了解更多信息。
为了我们的分析,我们将从 FRED 数据源中检索数据。首先,我们需要导入 Pandas 、 datetime 和 Pandas_datareader 包。
接下来,我们可以简单地定义一个日期范围并使用 web。DataReader 方法以 Pandas DataFrame 的形式下载数据,并将其存储在变量名 SP500 中。
我们将想要下载的数据集的名称(即 sp500)、数据的提供者或来源(“Fred”)以及开始和结束日期作为参数传递给了 DataReader 方法:
import pandas as pd
#if you get an error after executing the code, try adding below. pd.core.common.is_list_like = pd.api.types.is_list_likeimport pandas_datareader.data as web
import datetimestart = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2020, 1, 27)SP500 = web.DataReader(['sp500'], 'fred', start, end)
运行代码后,我们得到了下面的 Pandas DataFrame,显示了历史 S & P 500 每日价格:
计算标准普尔 500 的每日回报率
太好了,我们在熊猫数据框架中有过去 10 年的标准普尔 500 指数价格。现在,我们准备计算过去 10 年的 S & P 500 日收益率,并将它们作为一个新列添加到我们的数据框架中,我们将称之为 daily_return 。
为了计算回报率,我们可以使用下面的公式,其中 P1 指的是当前价格,而 P0 指的是初始价格或我们用来计算回报的参考价格。
收益率
SP500['daily_return'] = (SP500['sp500']/ SP500['sp500'].shift(1)) -1
#Drop all Not a number values using drop method.
SP500.dropna(inplace = True)
shift 方法所做的是将我们的索引移动作为参数提供的数字。在我们的例子中,我们将把 sp500 列中的每个值移动一位。这意味着我们将当天的价格降低到前一天的价格。
让我们打印 SP500 数据帧的最后五个值,看看我们得到了什么:
标准普尔 500 每日回报
策划标准普尔 500 每日回报
我们有我们的标准普尔 500 价格和回报准备用 Python 绘图。让我们先画出每日回报。
用 Python 和 Matplotlib 绘图超级简单,我们只需要从我们的 SP500 数据框架中选择 daily_return 列,并使用方法 plot 。
SP500['daily_return'].plot(title='S&P 500 daily returns')
策划 S&P500 每日回报
不错!我们可以很容易地从图表中找出一些非常有用的信息。例如,我们可以看到标准普尔 500 指数最差的日回报率是在 2011 年,日回报率为-7%。
同样,我们可以看到,标准普尔 500 指数最好的一天是在 2019 年年中,日回报率约为 5%。
除了每日回报,我们还可以绘制过去 10 年的标准普尔 500 价格演变图。这里我们可以观察到一个明显的上升趋势。
SP500['sp500'].plot(title='S&P 500 Price')
绘制标准普尔 500 价格
包扎
在这个关于 Python for Finance 的故事中,我们检索了 S & P 500 的历史价格,以便计算和绘制指数的每日回报。
绘制每日市场回报是一个很好的方法来可视化任何特定时期的股票回报。你可以用任何其他股票或指数来尝试。
我真的希望你喜欢这个故事!如果您有任何问题或不清楚的地方,请随时回复。我还有一个 Youtube 视频,一步一步地解释了本教程中使用的代码:
策划 SP500 每日回报
原载于 2020 年 2 月 8 日【https://codingandfun.com】。
计算你的点击预测的经济影响
原文:https://towardsdatascience.com/calculate-the-economic-impact-of-your-click-through-prediction-1fa6eee64494?source=collection_archive---------37-----------------------
超越准确性、AUC 或 Lift:一个衡量经济影响的模型
时代广场由安东尼·罗塞特在 Unsplash 拍摄
我们在IE data science boot camp学习期间,我和 m y 团队为一家拥有 2800 万 MAU 的公司做了一个点击率预测,以改善公司的广告分配。在 IE,他们明确强调了三个领域的重要性,即数学、编程和商业,数据科学家需要努力成功应对数据挑战。
我们的挑战是点击率预测。在互联网上,尤其是在这个博客里,有很多关于如何解决这个问题的内容。但是,它为什么重要呢?为什么需要预测横幅广告的用户点击量?你的模型什么时候值得?你的业务收入能提高多少?我们花了一半的时间来了解业务问题,并想办法评估我们不同模式的收入改善情况。
我们在 IE DS 训练营的顶点项目
这不是另一篇关于如何通过预测进行点击的文章(这里如果你感兴趣,你可以得到我们的完整过程代码),这是一篇关于为什么这个问题是值得的,以及我们如何计算收入提高的文章。
开始吧!
问题是
程序化广告是在线买卖广告的自动化交易。广告在网站上用横幅广告展示,其表现用 CTR(点击率)来衡量:
广告的点击率通常很低。如果是 1%,这意味着每 100 个接触过广告的访问者中只有 1 个点击了那个广告。
我们公司 60%的收入来自网站横幅广告。挑战在于尽可能地增加收入。横幅持有者根据点击量和印象数获得报酬——当用户看到横幅但没有点击时。横幅广告的盈利方式是在广告拍卖中出售,广告商为这些横幅广告出价。有很多拍卖提供商。在我们的例子中,该公司了解其更普通的用户,他们有一个为他们提供广告的付费提供商。这些广告给他们带来了更多的收入,但他们受到限制,因为他们需要事先与供应商谈判。
想象一下,广告每月限量 1000 万个。或者限制在一个月正常网站流量的 30%。我们将分配 30%的广告给一个优质供应商,其余 70%给一个标准供应商。但是,怎么做呢?我们如何优化分配以增加收入?这是我们的挑战。
目标是训练一个设定用户点击广告概率的模型。然后,我们将对这些概率进行排序,我们将只向概率最高的 30%的用户显示优质广告,而对于其余 70%的用户,我们将显示标准广告。我们模型的性能将用升力来衡量。
一个群体的提升是这个群体比平均水平好或差多少倍:
其中 i 是十分位数或组数。然后,我们将计算使用我们的模型可以提高多少收入,并与没有任何模型进行比较。
选择最佳 ML 模型
对于挑战,我们有两个各 100 万印象的数据集,这是 2019 年 10 月和 11 月流量的样本。数据来自一种谷歌分析引擎,我们只有 10 个非个人信息的特征。他们是:
- 行的唯一标识符。字符串。
- 横幅的名称。字符串。
- 服务器的日期。对象。
- 服务器的时间。对象。
- 印象之国。弦。
- 印象网站(来自英国的用户可以看到。es 网站的扩展)。弦。
- 印象的运作系统。弦。
- 浏览器:用于印象的浏览器。弦。
- RefererURL:点击横幅时,此人在网站的哪个部分。字符串。
- 点击:是否点击了横幅。二进制整型。
我们做了大量的可视化工作,然后通过特征工程来提高模型的性能。如果你想看看我们到底做了什么,这里有所有的代码。
我们的数据框架的负责人在数据之后,即数据争论、数据清理和特征工程
然后,我们拟合 9 种不同的算法,并使用 AUC 对它们进行基准测试。我们选择 AUC 来评估我们的模型,因为我们需要很好地预测 1 和 0——点击或未点击。这是因为与我们的优质提供商相比,我们通过点击赚取更多,但如果没有点击,我们会比标准提供商损失更多的钱。
我们使用的每个模型都有其评估指标
使用 Lightgbm 和 Catboost 型号,我们实现了 0.757 的 AUC。我们在最后选择了 Lightgbm ,因为预测速度更快,而且我们需要模型实时运行。
应用训练模型的结果
现在我们有了一个模型,我们如何利用它的结果呢?
我们的问题是,我们应该向哪些用户展示广告,不应该向哪些用户展示。给定测试集(不平衡,与我们的样本具有相同的点击率,4%),模型真正预测的是一个向量,其中给出了点击或不点击的概率。我们对点击概率最高的人感兴趣。确切地说,在我们的例子中,我们对 30%感兴趣。
出于这个原因,我们对点击的概率进行了排序,并将它们分成十分之一组。对于每个十分位数,我们计算了大小、实际点击数量、实际十分位数(十分位数 _ 阈值)。然后,我们计算了十分位数内用户点击的概率和相关的提升。**
*# fit the model
model=LGBMClassifier(random_state=101)
model.fit(X_train_trf,y_train)# we are interested in the probabilities
probs=model.predict_proba(X_test_trf)# create a DataFrame with the probs and set the deciles
probs_df=pd.DataFrame(probs)
probs_df[‘real_values’]=y_test
probs_df[‘decile’]=pd.qcut(probs_df[1], 10, labels=False)
probs_df[‘decile’]=(9-probs_df[‘decile’])%10# group by deciles to find the lift
lift=probs_df.groupby(‘decile’)[[‘real_values’]].sum()
lift[‘size’]=probs_df.groupby(‘decile’)[‘real_values’].count()
lift[‘decile_threshold’]=probs_df.groupby(‘decile’)[1].min()
lift[‘prob_click’]=lift[‘real_values’]/lift[‘size’]
lift[‘lift’]=lift[‘prob_click’]/0.0421
lift*
我们模型的结果按十分位数分组
这个表格真的很重要,因为它意味着**在我们前 10%的印象中,点击的概率是 14.5%(prob _ click),比平均值高 3.45 倍( lift )。**如果来自我们的模型的点击概率高于 71.5%(十分位数 _ 阈值),则印象将在该十分位数中。为什么这两个概率不一样?第一个( prob_click )是在十分位数内的测试集中印象的实际概率。第二个( decile_threshold )是我们模型的概率输出。 Decile_threshold 用于将印象从最好到最差排序。 Prob_click 就是评价,这个排序有多好。
在我们的问题中,记住我们只有 30%的可能分配给额外费用广告。这意味着我们对十分位数 0,1,2 的人感兴趣。这些人点击的概率超过 5.7%(prob _ click表示十分位数 3),我们将在我们的模型预测点击概率超过 57.4%的印象中找到他们(十分位数 2 表示十分位数阈值)。在下面的图表中,您可以看到结果(数字不匹配,因为这个图表是针对另一个模型的,但想法是相同的)。
每十分位数的点击概率
现在我们有了一个做决定的框架。如果我们的模型预测用户的点击概率高于或等于 57%,它将位于印象的前 30%,因此我们将把横幅销售给我们的优质提供商。如果对于给定的印象,我们的模型预测点击概率低于 57%,那么我们将把它卖给标准提供商。
经济模式
就收入而言,我们的模式有多好?
我们并没有通过我们的模式来提高点击率,而是通过更有效地分配点击量来赚取尽可能多的钱。如果我们没有任何溢价广告,我们将在标准竞价中分配每一个广告,赚取尽可能少的钱。如果我们只有溢价广告,分配将是最好的。相反,我们正处于这两种情况的中间。
想象一下,在我们的场景中,我们有两家供应商,价格如下:
- 高级提供商价格/点击: 5€
- 优质提供商价格/印象但不点击: 0.015€
- 标准提供商价格/点击: 0.5€
- 标准提供商价格/印象但不点击: 0.0024€
如果没有模型,广告将随机分配。假设整个数据集的点击率为 4%,我们可以拥有的优质广告比例为 30%,则收入将为:
- 点击收入:4% * 30% 广告总数高级广告价格+4% * 70% 广告总数标准广告价格
- 展示但未点击的收入: 96%(未点击广告) 30% 广告总数高级展示价格+96% * 70% 广告总数标准展示价格*
有了一个完美的模型——这是不可能的——我们可以完美地预测用户点击的概率,这样我们就可以尽可能地提高效率,收入将会是:
- 点击收入:点击次数优质广告价格*
- *印象而非点击的收入:(30% 广告数量-点击数量)高级印象价格+70% 标准印象价格
使用我们的模型我们需要考虑十分位数 0、1、2 中的实际点击次数:
- 点击收入:前 3 个十分位数的点击量高级广告价格+后 7 个十分位数的点击量标准广告价格
- 印象而非点击的收入:(前 3 个十分位数-前 3 个十分位数的点击次数)高级印象价格+(后 7 个十分位数-后 7 个十分位数的点击次数)标准印象价格
这看起来有点乱,但它只是应用一些概率分布。为了方便地将它们应用于整个数据集,我们创建了函数 revenue_model 。这些输入是:
- probs_df :上面用来计算升力的数据帧
- fill_rate: 高级提供商可用的百分比。
- model1: 标准提供商的价格(_0 用于展示,_1 用于点击)
- 模型 2: 高级提供商的价格(0 为展示次数,1 为点击次数)
输出是三个数字,上面的模型给出了收入:随机,最优(你的)和完美。
*def revenue_model(probs_df, fill_rate, model1_0, model1_1, model2_0, model2_1):
limit=round(len(probs_df)*fill_rate)
#random model
random_df=shuffle(probs_df)
random2=random_df[:limit]
random1=random_df[limit:]
money_random2=random2[‘real_values’].sum()*model2_1+(len(random2)-random2[‘real_values’].sum())*model2_0
money_random1=random1[‘real_values’].sum()*model1_1+(len(random1)-random1[‘real_values’].sum())*model1_0
revenue_random=money_random1+money_random2
#optimized problem
probs_df=probs_df.sort_values(1,ascending=False)
probs_model2_opt=probs_df[:limit]
probs_model1_opt=probs_df[limit:]
money_model2_opt=probs_model2_opt[‘real_values’].sum()*model2_1+(len(probs_model2_opt)-probs_model2_opt[‘real_values’].sum())*model2_0
money_model1_opt=probs_model1_opt[‘real_values’].sum()*model1_1+(len(probs_model1_opt)-probs_model1_opt[‘real_values’].sum())*model1_0
revenue_opt=money_model1_opt+money_model2_opt
#perfect model
probs_df=probs_df.sort_values(‘real_values’,ascending=False)
probs_model2_perf=probs_df[:limit]
probs_model1_perf=probs_df[limit:]
money_model2_perf=probs_model2_perf[‘real_values’].sum()*model2_1+(len(probs_model2_perf)-probs_model2_perf[‘real_values’].sum())*model2_0
money_model1_perf=probs_model1_perf[‘real_values’].sum()*model1_1+(len(probs_model1_perf)-probs_model1_perf[‘real_values’].sum())*model1_0
revenue_perf=money_model1_perf+money_model2_perf
return revenue_random, revenue_opt, revenue_perf*
然后,我们将其应用于我们的结果,价格如下:
*# set the prices
provider1_1=0.5
provider1_0=0.0024
provider2_1=5
provider2_0=0.015# apply revenue_model function
revenue_random, revenue_opt, revenue_perf = revenue_model(probs_df, 0.3, provider1_0, provider1_1, provider2_0, provider2_1)*
这是我们的示例图片,其中 fill_rate=30% 。评估我们模型的全貌总是一个好主意。为此,我们只需应用相同的函数改变 fill_rate 并绘制结果。
*fill_rates=[]
rev_random=[]
rev_optimal=[]
rev_perfect=[]# apply the function for every fill rate
for fill_rate in range(0,110,10):
fill_rate=fill_rate/100
revenue_random, revenue_opt, revenue_perf = revenue_model(probs_df, fill_rate, provider1_0, provider1_1, provider2_0, provider2_1)
rev_random.append(revenue_random)
rev_optimal.append(revenue_opt)
rev_perfect.append(revenue_perf)
fill_rates.append(fill_rate)# plot the result
plt.figure(figsize=(15,10))
plt.plot(fill_rates,rev_random,label=’random model’,linewidth=3)
plt.plot(fill_rates,rev_optimal,label=’optimal model’,linewidth=3)
plt.plot(fill_rates,rev_perfect,label=’perfect model’,linewidth=3)
plt.legend(fontsize=14)
plt.xlabel(‘Fill rate’,fontsize=14)
plt.ylabel(‘Revenue ($)’,fontsize=14)
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()*
在图表中,我们可以看到改变填充率时每个型号的收入。蓝线是随机型号,绿线是完美型号,橙色是我们的型号。在这里,我们可以看到,如果你能把 10%到 50%的广告分配给付费提供商,那么拥有一个模型就更加重要。这是因为这两个数字之间的收入增长百分比比其他范围要高得多。
对于 30%的额外费用广告(目前的情况),我们的收入几乎翻了一番。但是我们还有 45%的收入可以提高。
**
结论
数据科学家是懂数学和编程,但也有商业头脑的人。这种商业意识让我们不仅能交付优秀的模型,还能让它们适应公司的需求。用收入的术语来谈论总是能让你向非技术客户展示更清晰的结论。
因此,在本文中,我们探讨了点击问题的业务/收入评估。它可用于了解我们的 ML 模型的经济影响,并使用无任何模型(随机模型)和尽可能最大收益(完美模型)对其进行基准测试。
你也可以在这里找到整个项目👇
* [## my things/点击预测
数据即,数据清洗,特征工程,建模和点击预测的经济影响…
github.com](https://github.com/myrthings/click-prediction)*
你觉得它有用吗?你在用吗?是不是我搞砸了,你什么都不懂?你还有哪些衡量收入的方法?
**在评论区告诉我吧!🤗
通过群组分析计算你每月的回头客
原文:https://towardsdatascience.com/calculate-your-monthly-recurring-customer-by-cohort-analysis-3d39473482b7?source=collection_archive---------15-----------------------
解释如何使用 python 数据分析计算您企业的重复客户。
想象你已经开了一家企业,你的生意进展顺利。但这可能会更好。你的一些顾客可能会问你,“嘿,伙计,我经常从你这里买东西,难道我不应该得到一些优惠吗?”。现在你认为“好吧,我应该看看谁是我的老顾客!我应该给他们提供更多,这样他们就会经常来。”。你可以通过群组分析来实现。今天我将讨论使用 python 进行群组分析。让我们深入数据分析的海洋。
卢克·切瑟在 Unsplash 上的照片
为了这个分析,我使用了来自 Kaggle 的在线零售数据集。转到链接并下载它。好的,让我们看看我们的数据集中有什么!
首先,导入必要的库。
import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import plotly.express as px
现在加载数据集并观察其中的内容。
df = pd.read_excel('Online Retail.xlsx')
df.head()
这是我们数据集的前五行,
InvoiceNo:采购的发票号码。
库存代码:可能的产品代码
描述:产品是什么
数量:多少个产品
发票日期:购买日期
单价:单个产品的价格
CustomerID:标识每个客户的唯一字符串
国家:来自哪个地区
好吧,我们再深入一点。现在我们将创建一个函数来获取每个发票号的月份号,这样我们就可以知道产品是在哪个月购买的。
def get_month(x):
return dt.datetime(x.year, x.month, 1)df['InvoiceMonth'] = df['InvoiceDate'].apply(get_month)
df.head()
看最后一栏我标记中间部分的地方,是‘月’。我们以后会用到它。现在让我们看看哪些客户在哪些月份访问过。为此,我们将使用熊猫“分组”。别担心。很简单。
grouping = df.groupby('CustomerID')['InvoiceMonth']
grouping.head()
现在,让我们来看看每位顾客是在哪一个月第一次购买的。
df['CohortMonth'] = grouping.transform('min')
df.head()
这个“共生月”是顾客第一次购买的时间。现在,我们将再次创建一个函数来提取客户在哪个月来访,这样我们就可以获得我们的回头客。
def get_date_int(df, column):
year = df[column].dt.year
month = df[column].dt.month
date = df[column].dt.date
return year, month, dateInvoice_Year, Invoice_Month, _ = get_date_int(df, 'InvoiceMonth')
Cohort_Year, Cohort_Month , _ = get_date_int(df, 'CohortMonth')Year_Diff = Invoice_Year - Cohort_Year
Month_Diff = Invoice_Month - Cohort_Monthdf['CohortIndex'] = Year_Diff*12 + Month_Diff +1
df.head()
因此,标记为“CohortIndex”的列是我们获得第一次购买和客户后来所有购买之间的差异的列。因此,这里第一个是“1.0”,这意味着他在第一次购买的同一个月进行了购买。
现在,让我们按“同月”和“同指数”对客户进行“分组”,这样我们就可以识别出在同一个月以相同的时间间隔购买的客户。
grouping = df.groupby(['CohortMonth', 'CohortIndex'])
grouping.head()
现在,我们将只取每个客户的第一个月来计算数据透视表,以便我们可以在以后计算经常性客户。
cohort_data = grouping['CustomerID'].apply(pd.Series.nunique)
cohort_data = cohort_data.reset_index()
cohort_data.head()
print(df.shape) #output: 91, 3
print(cohort_data.shape)#output: 541909, 11
因此,我们可以看到,在此期间,只有 91 个不同的客户进行了 541909 次购买。让我们制作数据透视表。
cohort_counts = cohort_data.pivot(index="CohortMonth",
columns="CohortIndex",
values="CustomerID")
retention = cohort_counts
retention
现在我们可以看到一些 NaN 值,这意味着从 2010 年 12 月 1 日到 2011 年 12 月 1 日总共是 13 个月。因此,第一个指数值包含每 13 个月的经常性客户,但下一个指数 2011–01–01 与 2011–12–01 只有 12 个月的差异。这就是为什么最后一行值是 NaN。因此,在第一个月,948 名顾客前来购买,其中 362 名顾客在第二个月再次购买,如此循环。
现在我们要统计每个月的顾客数量。因为我们想把他们作为基础,以后来的顾客会成为追随者。
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()
现在,我们将在 1–0 的区间内对数据进行整形,以便显示回头客的百分比。
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention.head()
retention.round(3)*100
因此,我们将保留率转换为百分比。现在,让我们用热图来观察我们每月的重复客户百分比。
plt.figure(figsize=(10,8))
plt.title("Retention Rate")
sns.heatmap(data=retention,
annot=True,
fmt='.0%',
vmin=0.0,
vmax=0.5,
cmap="BuGn")
plt.show()
仅此而已。我们已经完成了我们的队列。这对你的业务增长非常重要。你必须留意你的老顾客。谢谢你一直陪着我。成为数据科学海洋的冲浪者!
使用连体神经网络计算音频歌曲相似度
原文:https://towardsdatascience.com/calculating-audio-song-similarity-using-siamese-neural-networks-62730e8f3e3d?source=collection_archive---------14-----------------------
介绍
在 AI Music,我们的内容目录每天都在增长,我们越来越有必要创建更智能的系统来搜索和查询音乐。这样做的一个系统可以由定义和量化歌曲之间的相似度的能力来决定。这里描述的核心方法处理声学相似性的概念。
使用描述性标签搜索歌曲通常会引入语义不一致的问题。标签可以是高度主观的,取决于听众的年龄组、文化和个人偏好。例如,像“明亮”或“寒冷”这样的描述对不同的人来说可能意味着完全不同的东西。当谈到流派时,音乐也可能处于模糊的区域。像野兽男孩的破坏这样的歌曲主要被称为嘻哈/说唱歌曲,然而它包含了许多我们传统上认为属于摇滚歌曲的声音品质。使用示例参考轨道从大型目录中检索相似歌曲或相似歌曲的排序列表的能力避免了这样的问题。
然而,当我们认为两首或更多的歌曲彼此相似时,这实际上意味着什么呢?这种感觉上的相似性通常很难定义,因为它包括许多不同的方面,如流派、乐器、情绪、节奏等等。使问题进一步复杂化的是,相似性往往是由这些特征的无限制组合构成的。歌曲相似性是一个如此主观的概念,我们如何解决定义一个基本事实的问题?
我们是如何解决这个问题的?
确定歌曲之间相似性的传统方法需要您从音频中选择和提取音乐特征。这些特征在一个空间内彼此有多近或多远被假定为各个轨迹的感知相似性。采用这种方法的一个问题是如何确定哪些特征最好地映射到感知的相似性。在 AI Music,我们通过采用基于暹罗神经网络(SNN)的方法来解决这个问题。
SNN 架构基于卷积神经网络架构,这意味着我们需要将音频转换为图像。音频最常见的图像表示是波形,其中信号幅度相对于时间绘制。对于我们的应用程序,我们使用一种称为声谱图的音频视觉表示,特别是 mel 声谱图。
- 频谱图 使用傅立叶变换产生信号相对于时间的频率分布。
- 一个 梅尔频谱图 是一个频谱图,其中频率被映射到梅尔标度。
- 梅尔标度 是对数间隔的,从而产生与人类听觉更密切相关的表示。
我们选择了梅尔频谱图,因为已经发现它们很好地代表了声音的音色,因此更好地代表了歌曲的声学特征。
图 1:波形、谱图和 mel 谱图对比
从上图中我们可以看到,相关的音乐信息在 mel 声谱图中展现得更加清晰。
数据对
暹罗网络基于 2 个“分支”,这些分支在结构上完全相同,并具有相同的权重。基本功能是一个分支接受‘参考’轨道 mel 谱图作为输入,而另一个分支接受‘差异’轨道 mel 谱图作为输入。通过计算每个数据点之间的相似性,为该输入创建数据对。每个数据点都被用作“参考”来产生 5 个正的和 5 个负的“差异”对。通过采用基于 2 个数据点共享的描述性标签和音乐成分的数量的相似性系数来生成数据集的相似性矩阵。然后可以使用该矩阵选择相似和不相似的轨迹。
我们使用以下规则生成配对:
5 个正对:
- 参考轨道本身
- 从 10 个最相似的音轨中随机选择 4 个阳性匹配
5 个负对:
- 从 10 个最不相似的音轨中随机选择 5 个负匹配
这些图像对被传递到模型中,在模型中为每个图像对生成一个特征向量(嵌入)。欧几里德距离被用作这些特征向量之间的距离度量。计算这两个特征向量之间的欧几里德距离,得到相似性得分。对比损失用于指示如何更新模型权重。对比损失旨在最小化相似对之间提取的特征向量之间的距离,并根据基于元数据计算的距离余量来分离不相似对。
图 1:连体神经网络流程图
我们如何使用训练过的暹罗模型
一旦我们剩下一个训练有素的模型,我们分裂暹罗网络。这给我们留下了一个没有计算欧几里德距离的最终层的单个分支。在这种形式中,模型本质上是一个特征提取器。然后可以处理我们希望能够从中搜索的音乐的整个后备目录,给我们留下相应特征向量的数据库。然后,可以通过这个相同的模型发送一首新的“未听过的歌曲”,并且可以计算得到的特征向量和数据库中所有特征向量之间的欧几里德距离。得分最低的结果表示最相似的歌曲。
音频示例 1 —嘻哈音乐
音频示例 2—流行音乐
音频示例 3—国家
结论&进一步工作
使用暹罗网络来计算歌曲相似性意味着我们允许系统确定准确表示我们希望量化的感知相似性的特征。这给我们留下了一个仅依赖于音频信号的歌曲推荐系统。话虽如此,创造地面真相的局限性依然存在。提出更智能的方法来构建数据对数据集是我们在深度学习领域需要克服的更大挑战之一,在深度学习领域,大型数据集并不容易获得。
为了在训练网络时不需要计算和提供数据对的数字相似性分数,我们尝试使用三元组损失函数。这里我们在网络中有 3 个分支,一个用于参考歌曲,一个用于肯定匹配,另一个用于否定匹配。这意味着在训练期间,参考和正例的特征向量将被推得彼此更近,而参考轨迹和负匹配的特征向量将被推得更远。
歌曲相似性的固有感知估计也可能因人而异或因用例而异。使用条件相似性网络可以允许用户选择他们认为最重要的音乐特征或特性。
在 AI Music 注册我们的时事通讯,了解我们在这里所做的最新研究,并发现更多关于该公司探索人工智能如何帮助塑造音乐制作和交付的信息
参考
Pranay Manocha,Rohan Badlani,Anurag Kumar,Ankit Shah,Benjamin Elizalde 和 Bhiksha Raj。"使用连体神经网络的基于内容的音频表示."(2018) IEEE 声学、语音和信号处理国际会议(ICASSP)。
梁浩庭、曾东火、、小山圭三《三胞胎网络个性化音乐推荐》( 2019)
李宗弼,尼古拉斯 j .布莱恩,贾斯汀萨拉蒙,金泽宇,朱汉南。"解开音乐相似性的多维度量学习."(2020) IEEE 声学、语音和信号处理国际会议(ICASSP)。
使用 Keras 对暹罗网络进行一次性学习
利用人员流动数据计算集水区
原文:https://towardsdatascience.com/calculating-catchment-with-human-mobility-data-efd08e2d20f6?source=collection_archive---------24-----------------------
利用人员流动数据识别潜在客户
集水区(即贸易区)是零售商、批发商和其他商业场所开展大部分业务的地理区域。正确计算它们对于零售和房地产等行业至关重要,因为它们使组织能够更好地了解客户并制定适当的业务战略。
计算集水区的技术有很多,从环形贸易区、等时线、重力模型,到包含特定位置变量的更复杂的技术。所选择的技术通常取决于可用的信息和数据,以及不同技术中可用的专业知识。
图 1。不同的集水区取决于技术:左边是环形贸易区(15 公里缓冲区),中间是 20 分钟车程等时线,右边是基于流动性数据的集水区。
当一家新店开业时,由于缺乏可用数据,很难知道哪些顾客会来这家店,或者他们来自哪里。在没有这些数据的情况下,最常见的方法是计算目标位置周围的缓冲区或等时线,但这种方法缺乏精度,可能导致不可靠的结果。
例如,对两个位置采用相同的时间等时线,而不考虑它们周围的人口密度,这肯定会导致不可靠的结果。这是因为居住在低密度地区的人们通常比居住在高密度地区的人们走更长的距离去购物。在这里,我们旨在使用人员流动数据作为潜在客户的代理,计算可靠的潜在集水区。
获得的结果表明,传统的方法,如等时线或缓冲区,无法捕捉到访问特定位置的人实际上来自哪里。它们不能像使用人员流动数据那样灵活地建立目标集水区;例如,能够计算工作日和周末游客的不同集水区。
人类移动数据
我们方法的基础是使用来自沃达丰分析的人员流动数据。该数据提供了对访问覆盖整个研究区域的任何 250m x 250m 网格单元的人数的洞察。沃达丰对网络中测量的数据进行匿名化、聚合和外推,以提供代表整个国家和国际人口的见解。
此外,该数据还提供了根据到目标像元的距离在不同级别聚集的访问者的来源。对于来自同一个城市的游客,也在 250m x 250m 像元级别提供起点;对于来自同一省其他城市的访问者,访问在城市一级进行汇总;对于来自其他省份的访问者,访问是在省一级进行汇总的。虽然它也提供了,鉴于这项研究的特点,我们不打算考虑来自不同国家的游客的来源。
此外,这些数据可以按活动类型(家庭/工作)、星期几和一天中的时间(上午/下午/晚上)进行分类。数据也可以按社会人口变量分类:年龄范围、性别和经济状况。
为了这个用例的目的,我们在西班牙的塞维利亚市选择了一个目标位置来展示这个方法。下面的地图显示了游客的来源地。
图二。这张 choropleth 地图显示了按来源地划分的游客数量,并按该来源地的总人口进行了标准化。
我们还使用 Unica360 的人口统计数据来标准化访客数据。Unica360 的数据是在 100m x 100m 的网格中聚合提供的,除其他变量外,还包括人口、按年龄范围划分的人口以及家庭数量。数据聚合被升级以适应沃达丰的 250m x 250m 单元网格,应用面积插值。
定义我们的集水方法
计算集水区的第一个想法是为每个起点-目的地对计算一个指数,该指数衡量目的地相对于起点的游客吸引力潜力。这里,目的地被理解为包含新商店位置的网格单元。
该指数将被定义为:
基于该指数,我们将通过选择具有最高指数值的源来计算每个目标像元的集水区,该值占该目标像元总访问量的 70%。
然而,由于来自其他城市和省份的游客数量在小区一级无法获得,因此需要采用一种新的方法来调整第一个想法,以便在不同的汇总级别(小区、城市和省份)比较游客数量。
这种新方法有两个主要步骤:
- 查找覆盖至少 80%目标像元访问者的起点的最小等时线(基于乘车旅行时间)。
- 通过在先前的源中选择索引值最高的源(占该目标像元总访问者的 70%)来缩小集水区的大小。
寻找最小等时线
如前所述,来自同一省其他直辖市和其他省份的访问者分别在直辖市和省一级进行汇总。等时线允许我们只考虑在一个直辖市/省内那些(在时间上)更接近目标像元的区域。所开发的方法计算越来越大的等时线,直到覆盖 80%的目标像元的总访问者。
为了计算来自一个等时线与一个省(或直辖市)的交叉点nvisitorsection的游客数量,以下步骤如下:
- 首先,使用 250x250m 网格单元的人口统计数据计算居住在交叉点的省人口比例,pctpupulationintersection
- 其次,从路口过来的游客数量用下面的公式计算。这个公式是基于托布勒地理定律和使用经验数据找到一个粗略的拟合。
图 3。转换功能分配更多的游客到更近的地方。
函数√将更多的访问者分配为来自该省内距离目标小区较近的区域(因此,较少的访问者分配到较远的区域)。从图 3 中可以看出,该函数如何将来自一个省/市的 70%的访问者分配到一个仅包含 40%人口的区域,但该区域更靠近目的地小区。同样,我们应用这个公式是基于这样一个假设,即住得离目标小区越近的人越有可能访问它。更复杂的模型可以给出更好的预测。
游客来源的选择
一旦有了最小等时线,下一步就是计算最小等时线内每个原点的索引值,定义如下:
该指数是使用来自每个起点的标准化访客数量norm _ nvisitorsection计算的。归一化是通过除以交叉点内人口像元的数量来完成的, npopcellsIntersection ,即访问者的数量均匀分布在交叉点多边形内的所有人口像元中。
这种标准化允许对来自同一城市牢房的来访者与来自其他城市和省份的来访者进行比较。通过选择占目标像元总访问者 70%的具有最高指数值的起点,我们可以获得其估计的集水区。
处理和可视化结果
下图显示了计算最小等时线所需的三次迭代,该最小等时线包含塞维利亚市目标像元中至少 80%的总访问者。
图 4。这个可视化展示了达到一个单元的总访问者的 80%所需的三次迭代。颜色显示了作为归一化访问和质心之间距离的函数定义的索引值。
一旦找到最小等时线,并为每个原点计算指数,我们就可以构建集水区。最后,集水区的凹壳(又名阿尔法形状)被计算为具有可管理的连接区域。为了计算凸包,我们使用了 Python 库 alphashape 。
下图显示了塞维利亚的目标像元的原始集水区及其凹形船体。
图 5。该可视化显示了单元的原始集水区及其凹面外壳。
如果我们将刚刚获得的集水区与 15 公里缓冲区和 20 分钟车程等时线进行比较,我们可以看到它们看起来非常不同。下图显示了三个集水区以及每个集水区包含的人口像元。
图 6。该可视化显示了整个博客帖子中比较的三个集水区及其包含的群体单元。
从这个比较中,我们可以看到等时线是如何向北和向西扩展的,错过了城市南部的一个非常重要的城区,事实上,该城区是目的地单元的一个非常重要的游客来源,如图 4 所示。在最小等时线过程的每一次迭代中,可以看到在城市的南部有一个多边形,对应于这个城区的游客数量非常高。该区域仅部分包含在缓冲集水区中,完全包含在我们刚刚使用人员移动数据构建的集水区中。
使用移动性数据定制集水区
如上所述,Vodafone Analytics 数据可以按活动类型(在家/工作)、星期几和一天中的时间(上午/下午/晚上)等变量进行分类。这提供了很大的灵活性,根据业务部门甚至用例,使用这些信息来构建定制的汇水区可能会很有趣。一个例子是为工作日和周末建立不同的集水区。
在下图中,对于同一个目标位置,我们使用所有访问构建的集水区(左),仅使用周一至周四的访问(中),以及仅使用周五至周日的访问(右)。非常有趣的是,人们在周末会比平时走更远的路。
图 7。该图显示了目标位置的集水区,从左至右考虑了所有访问、周一至周四的访问以及周五至周日的访问。原始集水区在最上面一行,其对应的 alpha 图形在最下面一行,就在它们的正下方。
这种粒度级别允许更强大的业务洞察力。使用这种方法的房地产公司可以向潜在的投资者提供更多的细节。对于零售商来说,这种更准确的收集可以为员工和位置管理、库存等决策提供信息。
例如,如果我们更深入地分析这最后一个层次的洞察力,我们可以看到使用工作日访问构建的集水区非常符合 20 分钟车程等时线,而基于周末访问构建的集水区则不符合(见下图)。这些信息可以用来确定投放广告的正确位置,或者根据一周中的不同日子制定不同的营销策略,因为客户来自不同的地方。
图八。该图用橙色显示了工作日访问(左)和周末访问(右)的集水区,并与 20 分钟车程等时线(紫色)进行了对比。
沃达丰分析数据也可以按社会人口统计变量分类:年龄范围、性别和经济地位。这允许集中于目标客户简档的集水区的构建。这可以在决定商店形式和零售类别时提供更深入的见解。
更深入地了解集水区的人员流动情况
了解和理解一家公司的大部分业务来自的领域的特征对他们的成功至关重要。当开始一项新业务或扩大现有业务时,历史数据的缺乏使得知道客户将来自哪里非常具有挑战性。
人类移动数据,加上其他位置数据流,可以在应对这一挑战时发挥作用,帮助企业从竞争对手中脱颖而出。
本文原载于 CARTO 博客 。这项工作是与Á·阿尔瓦罗·阿雷东多一起完成的。
特别感谢Mamata Akella,CARTO 的制图主管,对她在本帖地图创作中的支持。
用自举法计算置信区间
原文:https://towardsdatascience.com/calculating-confidence-interval-with-bootstrapping-872c657c058d?source=collection_archive---------4-----------------------
如何用 bootstrapping 计算置信区间?
故事横幅,作者图片
大家好,
在这篇文章中,我将尝试解释如何通过使用 Bootstrap 方法找到一个置信区间。 统计 和 Python 知识需要更好的理解。
在深入研究该方法之前,让我们记住一些统计学概念。
方差: 它是由一个数据点与每个数据点的均值之间的距离平方之和除以数据点的个数得到的。
采样离散
标准差: 它是一个向我们展示我们的数据点如何从均值向外扩散的度量。它是通过求方差的平方根得到的
样品标准偏差
累积分布函数 :可用于任何一种变量 X(离散、连续等。).它向我们展示了变量的概率分布。因此允许我们从给定的概率分布中解释小于或等于 x 的值的概率
经验累积分布函数: 又称经验分布函数。CDF 和 ECDF 之间的唯一区别是,前者向我们展示了任何给定人口的假设分布,而后者是基于我们观察到的数据。
例如,我们如何解释上图所示数据的 ECDF?我们可以说,40%的身高小于或等于 160cm。同样,身高低于或等于 180 厘米的人口比例为 99.3%
概率密度函数: 它向我们展示了连续变量的分布。曲线下的面积给出了概率,所以面积必须总是等于 1
正态分布: 又称高斯分布。它是统计学中最重要的概率分布函数,呈钟形对称。
正态(高斯)分布
置信区间: 是数值在总体中可能存在的范围。它是根据原始样本估计的,通常定义为 95%的置信度,但也可能不同。您可以考虑下图,该图显示了 95%的置信区间。由对应于第一个和最后 2.5 个百分点的值定义的置信区间的下限和上限。
95%置信区间,作者图片
什么是自举法?
Bootstrap 方法是数据科学中常用的一种重采样方法。布拉德利·埃夫隆在 1979 年提出了这种方法。主要包括用替换( Bootstrap 样本 )重新采样我们的原始样本,以及使用汇总统计生成 Bootstrap 复制 。
人高的置信区间
在本文中,我们将使用ka ggle中的一个数据集。这是体重-身高数据集。它包含 10,000 人的身高(英寸)和体重(磅)信息,按性别分类。
如果你想看完整的代码,你可以通过 链接 找到 IPython 笔记本。
我们将只使用随机选择的 500 个人的身高,并通过使用 Bootstrap 方法计算 95%的置信区间
让我们从导入我们将需要的库开始。
数据帧的前五行如下
显然,高度是以英寸表示的,让我们将高度从英寸转换为厘米并存储在新的列 Height(cm) 中。
从上面我们可以看到,数据集中的最大和最小身高分别是 137.8 cm 和 200.6 cm。
我们可以用熊猫。DataFrame 的 采样 方法选择 500 个随机选择的高度。之后,我们将打印汇总统计数据。
根据输出,我们的样本最小高度为 145 cm,最大高度为 198 cm。
让我们看看 ECDF 和 PDF 是什么样子的?
ECDF,作者图片
经验 CDF 表明我们样本中 50%的人身高不超过 162 cm。
PDF 呢?
PDF,作者图片
PDF 向我们展示了高度的分布过于接近正态分布。不要忘记曲线 下的 区域给出了概率。
现在,花点时间想想。我们的样本中只有 500 个观察值,但世界上有几十亿人我们无法测量他们的身高。因此,我们的样本不能对总体做出推断。如果我们一次又一次地对不同的样品进行同样的测量,那么高度的平均值是多少?
例如,假设我们对相同数量的人(500)进行了 1000 次相同的测量,并以覆盖第一次观察的 ECDF 的方式绘制了每个人的 ECDF。它看起来会像下面这样。
ECDF,作者图片
正如我们在上面看到的,我们得到了不同的高度,但是我们可以很容易地发现这些点在一个特定的范围内扩散。这就是我们想要了解的置信区间
你可能会说实验不可能重复这么多次,你没有错。我们使用自举方法的确切原因。它帮助我们将同一个实验模拟数千甚至数十亿次。
怎么会?
事实上,Bootstrap 方法非常简单易懂。首先,它通过在原始样本中随机选择,从原始样本中生成引导样本。之后,它会应用一个汇总统计数据(如变异、标准偏差、平均值等)来获取重复数据。我们将使用“mean”来生成我们的引导复制。
为了理解该方法,让我们将它应用于一个仅包含 5 个高度的小样本。我们可以像下面这样生成我们的引导样本。不要忘记这样一个事实,我们可以多次选择任何观测值(替换重采样)
重采样,作者图像
正如我们在上面看到的,我们创建了 4 个 bootstrap 样本,然后计算它们的平均值。我们将这些方法称为我们的引导复制。我们可以选择方差、标准差、中位数或其他任何值,而不是“均值”。
回到我们的项目。下一步,我们将从我们的原始样本生成我们的引导样本,我们将应用均值来获得引导复制。我们将在一个 for 循环中重复这个过程 15.000 次(drawing ),并将副本存储在一个数组中。为此,我们可以定义如下函数
通过调用函数得到 15.000 个复制后,我们可以比较原始样本和引导复制的平均值
他们的手段太接近了。
那么,我们要怎么计算 95%的置信区间呢?
获得 bootstrap 复制后,剩下的就是这么简单了。众所周知,我们的下限和上限是对应于 2.5 和 97.5 百分位的值。
百分位数,作者图片
我们可以用下面简单的 Python 代码找到边界
我们的边界在 167.7 和 169.5。因此,我们可以说,如果对整个人群做同样的实验。身高的平均值将在 167.7 厘米和 169.5 厘米之间,有 95%的可能性
摘要
让我们总结一下我们所做的。我们随机选择了 500 个高度并生成了引导样本。我们从这些样本中计算“平均值”,并得到平均值的 bootstrap 复制。最终我们计算出 95%的置信区间。
祝你数据之旅好运:)
参考
[## 用一个例子介绍统计学中的 Bootstrapping——Jim 的统计学
Bootstrapping 是一种统计过程,它对单个数据集进行重新采样,以创建许多模拟样本。这个过程…
statisticsbyjim.com](https://statisticsbyjim.com/hypothesis-testing/bootstrapping/) [## Python 中的统计思维(第 2 部分)
做统计推断的时候,我们说的是概率的语言。描述您的…的概率分布
www.datacamp.com](https://www.datacamp.com/courses/statistical-thinking-in-python-part-2) [## 自助法简介
关于 bootstrap 方法、动机及其工作原理的探讨
towardsdatascience.com](/an-introduction-to-the-bootstrap-method-58bcb51b4d60)
用 Python 计算两个地理位置之间的距离
原文:https://towardsdatascience.com/calculating-distance-between-two-geolocations-in-python-26ad3afe287b?source=collection_archive---------5-----------------------
照片由捕捉人心。 on Unsplash
几个月前,我在从事一个可视化地理位置数据(即纬度和经度)的自由职业项目,在这个项目中,我必须在地图上可视化中心设施和客户位置。根据一个客户的要求,我必须找到距离不同设施 3 公里范围内的所有客户位置。为此,我必须计算所有位置之间的距离。这是我第一次使用原始坐标,所以我尝试了一个天真的尝试,使用欧几里德距离来计算距离,但很快意识到这种方法是错误的。
欧几里得距离适用于平面,就像笛卡尔平面一样,然而,地球不是平的。所以我们必须使用一种特殊类型的公式,称为哈弗辛距离。
哈弗线距离可以定义为地球表面两个位置之间的角距离。
哈弗线距离可以计算为:
来源:https://en.wikipedia.org/wiki/Haversine_formula
看起来令人生畏,是的,如果你必须使用原始的 python 代码来应用它,这将是令人生畏的,但是感谢 python 充满活力的开发者社区,我们有一个专门的库来计算称为 haversine 的 Haversine 距离(使用 python 的好处之一)。
介绍完毕,让我们开始实施吧:
步骤 1:安装“哈弗辛”
在 jupyter 笔记本上安装以下命令的 haversine 类型。
!pip install haversine
如果您通过 anaconda 提示符安装,请删除“!”从上面的命令中标记。
步骤 2:导入库
安装完库后,导入它
import haversine as hs
步骤 3:计算两个位置之间的距离
loc1=(28.426846,77.088834)
loc2=(28.394231,77.050308)
hs.haversine(loc1,loc2)
产量:5.229712941541709
默认情况下,哈弗辛函数返回以千米为单位的距离。如果要将距离的单位改为英里或米,可以使用如下所示的哈弗辛函数的单位参数:
from haversine import Unit
#To calculate distance in meters
hs.haversine(loc1,loc2,unit=Unit.METERS)
输出:58660 . 68868686861
#To calculate distance in miles
hs.haversine(loc1,loc2,unit=Unit.MILES)
产量:3.245363636765
同样,你也可以用英寸来计算距离。
如果使用原始位置数据,计算两个位置之间的距离是一项基本要求。它不仅能帮助你更好地可视化,还能为你的机器学习算法提供优势。它可能会给你的模型增加一个优势,并通过增加一个新的维度“距离”来提高它的整体效率。
这是我在本文前面提到的项目的输出:
作者图片
如果你想看完整的代码,你可以访问我的 github 页面:https://github.com/ashutoshb418/Foodies-Visualization
使用 BERT、word2vec 和其他模型计算文档相似度
原文:https://towardsdatascience.com/calculating-document-similarities-using-bert-and-other-models-b2c1a29c9630?source=collection_archive---------1-----------------------
入门
由维克多·塔拉舒克在 Unsplash 上拍摄的照片
简介
文档相似性是自然语言处理中最关键的问题之一。寻找文档间的相似性被用于几个领域,例如推荐相似的书籍和文章、识别剽窃的文档、法律文档等。
如果两个文档在语义上相似,并且定义了相同的概念,或者它们是重复的,我们可以称之为相似的。
为了让机器找出文档之间的相似性,我们需要定义一种方法来数学地测量相似性,并且它应该是可比较的,以便机器可以告诉我们哪些文档最相似,哪些最不相似。我们还需要以可量化的形式(或数学对象,通常是向量形式)表示文档中的文本,以便我们可以在此基础上执行相似性计算。
因此,将文档转换成数学对象和定义相似性度量主要是让机器执行这项工作所需的两个步骤。我们将研究做这件事的不同方法。
相似度函数
计算相似性的一些最常见和最有效的方法是,
余弦距离/相似度——是两个向量之间角度的余弦,它给了我们向量之间的角距离。计算两个向量 A 和 B 之间余弦相似性公式为:
在二维空间中,它看起来像这样,
二维空间中两个向量 A 和 B 之间的角度(图片由作者提供)
你可以很容易地计算出数学公式,并使用余弦定律来证明这个公式。
余弦在θ= 0°时为 1,在θ= 180°时为-1,这意味着对于两个重叠的矢量,余弦在两个完全相反的矢量中最高和最低。正因如此,所以称之为相似。你可以把 1 余弦当作距离。
欧氏距离——这是 p=2 时闵可夫斯基距离的形式之一。其定义如下:
在二维空间中,欧几里德距离会是这样的,
二维空间中两个向量 A 和 B 之间的欧氏距离(图片由作者提供)
Jaccard 距离- Jaccard 指数用于计算两个有限集之间的相似度。Jaccard 距离可以认为是 1 - Jaccard 指数。
如果我们可以在向量空间中表示文档,我们可以使用余弦或欧几里德距离。如果我们认为我们的文档只是没有任何语义意义的单词集或集合,则可以使用 Jaccard 距离。
余弦和欧几里德距离是最广泛使用的度量,我们将在下面的例子中使用这两个。
嵌入
嵌入是文本的向量表示,其中具有相似含义或上下文的单词或句子具有相似的表示。
单词的三维矢量表示(图片由作者提供)
下面是一些计算文档嵌入的算法和例子,
Tf-idf - Tf-idf 是词频和逆文档频的组合。它为文档中的每个单词分配一个权重,该权重是使用该单词在文档中的频率以及该单词在整个文档语料库中的文档频率来计算的。关于 tf-idf 的更多细节请参考这个故事。
让我们将以下定义为我们想要计算相似性的文档的语料库(集合),
文档语料库(图片由作者提供)
我们将执行基本的文本清理,删除特殊字符,删除停用词,并将所有内容转换为小写。然后,我们将把文档转换成它们的 tf-idf 向量,并使用余弦和欧几里德距离计算成对的相似度。
成对余弦相似度将只是 tf-idf 向量的点积,因为来自 sklearn 的 tf-idf 向量已经被归一化,并且这些向量的 L2 范数是 1。所以在这种情况下,余弦相似性公式的分母是 1。
print (tfidf_vectors[0].toarray())print (pairwise_similarities.shape)print (pairwise_similarities[0][:])
# documents similar to the first document in the corpus
most_similar(0,pairwise_similarities,'Cosine Similarity')
基于余弦相似性和欧几里德距离与第一个文档相似的文档(图片由作者提供)
Word2vec - 顾名思义 Word2vec 将单词嵌入向量空间。Word2vec 将文本语料库作为输入,并将单词嵌入作为输出。word2vec 主要有两种学习算法:连续单词包和连续跳格。
连续单词袋(CBOW)和跳格模型(图片由https://arxiv.org/pdf/1301.3781.pdf提供)
如果有足够的数据和计算可用,我们可以训练我们自己的嵌入,或者我们可以使用预训练的嵌入。我们将使用由 Google 提供的预训练嵌入。
我们将从标记和填充每个文档开始,使它们都具有相同的大小。
# tokenize and pad every document to make them of the same size
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequencestokenizer=Tokenizer()
tokenizer.fit_on_texts(documents_df.documents_cleaned)
tokenized_documents=tokenizer.texts_to_sequences(documents_df.documents_cleaned)
tokenized_paded_documents=pad_sequences(tokenized_documents,maxlen=64,padding='post')
vocab_size=len(tokenizer.word_index)+1print (tokenized_paded_documents[0])
标记化文档(作者图片)
让我们加载预训练的嵌入。每个单词都被表示为一个 300 维的向量。
# loading pre-trained embeddings, each word is represented as a 300 dimensional vectorimport gensimW2V_PATH="GoogleNews-vectors-negative300.bin.gz"
model_w2v = gensim.models.KeyedVectors.load_word2vec_format(W2V_PATH, binary=True)
使用这种嵌入,我们可以将文档语料库中的每个单词转换成 300 维向量。因为我们有 6 个文档,并且我们已经将每个文档填充为最大大小 64,所以语料库的向量表示将是 6X64X300 的形状。
# creating embedding matrix, every row is a vector representation from the vocabulary indexed by the tokenizer index.
embedding_matrix=np.zeros((vocab_size,300))
for word,i in tokenizer.word_index.items():
if word in model_w2v:
embedding_matrix[i]=model_w2v[word]# creating document-word embeddings
document_word_embeddings=np.zeros((len(tokenized_paded_documents),64,300))for i in range(len(tokenized_paded_documents)):
for j in range(len(tokenized_paded_documents[0])):
document_word_embeddings[i][j]=embedding_matrix[tokenized_paded_documents[i][j]]document_word_embeddings.shape
文档-单词嵌入形状(图片由作者提供)
现在我们必须将每个文档表示为一个向量。我们可以对每个单词向量进行平均或求和,并将每个 64X300 表示转换为 300 维表示。但是对所有单词进行平均或求和将会失去文档的语义和上下文含义。文件的长度不同也会对此类行动产生不利影响。
一种更好的方法是使用 tf-idf 权重对单词向量进行加权平均。这可以在一定程度上处理可变长度问题,但是不能保持单词的语义和上下文含义。之后,我们可以使用成对距离来计算类似的文档,就像我们在 tf-idf 模型中所做的那样。
# calculating average of word vectors of a document weighted by tf-idfdocument_embeddings=np.zeros((len(tokenized_paded_documents),300))
words=tfidfvectoriser.get_feature_names()for i in range(len(document_word_embeddings)):
for j in range(len(words)):
document_embeddings[i]+=embedding_matrix[tokenizer.word_index[words[j]]]*tfidf_vectors[i][j]print (document_embeddings.shape)pairwise_similarities=cosine_similarity(document_embeddings)
pairwise_differences=euclidean_distances(document_embeddings)most_similar(0,pairwise_similarities,'Cosine Similarity')
most_similar(0,pairwise_differences,'Euclidean Distance')
基于余弦相似性和欧几里德距离与第一个文档相似的文档(图片由作者提供)
GloVe-Global Vectors for word Embedding(GloVe)是一种无监督学习算法,用于产生单词的向量表示。在来自语料库的聚集的全局单词-单词共现统计上执行训练,并且所得的表示展示了单词向量空间的有趣的线性子结构。
我们将使用来自斯坦福的预训练手套嵌入。所有步骤都与 word2vec 嵌入相同,只是在这种情况下,我们将使用手套预训练模型。我们使用 100 维的手套嵌入,因为嵌入文件很大。你也可以使用更高的维度。
基于余弦相似性和欧几里德距离与第一个文档相似的文档(图片由作者提供)
doc 2 vec-doc 2 vec是一种无监督学习算法,产生句子/段落/文档的向量表示。这是 word2vec 的改编版。Doc2vec 可以把一个完整的文档表示成一个向量。因此,我们不必取单词向量的平均值来创建文档向量。
段落向量分布式单词包版本(PVDOBW)和段落向量分布式内存版本(PVDM)(图片来自https://arxiv.org/pdf/1405.4053.pdf)
我们将使用 gensim 在我们的语料库上训练 Doc2vec 模型,并创建文档的向量表示。
基于余弦相似性和欧几里德距离与第一个文档相似的文档(图片由作者提供)
BERT- 来自变形金刚的双向编码器表示(BERT) 是 Google 开发的自然语言处理预训练的最新技术。BERT 在包括维基百科和书籍语料库在内的未标记文本上接受训练。BERT 使用 transformer architecture,一种注意力模型来学习单词的嵌入。
BERT 包括两个预训练步骤:掩蔽语言建模(MLM)和下一句预测(NSP)。在 BERT 中,使用三种嵌入来表示训练文本,即标记嵌入+片段嵌入+位置嵌入。
伯特训练建筑(图片来自https://arxiv.org/pdf/1810.04805.pdf)
伯特输入表示(图片来自https://arxiv.org/pdf/1810.04805.pdf)
我们将使用来自 Huggingface 的预训练 BERT 模型来嵌入我们的语料库。我们正在加载 BERT 基本模型,它有 12 层(变压器块),12 个注意头,1.1 亿个参数,隐藏大小为 768。
基于余弦相似性和欧几里德距离与第一个文档相似的文档(图片由作者提供)
您已经看到了用向量形式表示文档和度量相似性的多种方法。您可以针对自己的问题定制它们,看看哪种最适合您。
这里有这个故事的完整代码-https://github . com/varun 21290/medium/blob/master/Document % 20 similarities/Document _ similarities . ipynb
参考文献:
[## 余弦定律
在三角学中,余弦定律(也称为余弦公式、余弦法则或阿尔-卡希定理)与…
en.wikipedia.org](https://en.wikipedia.org/wiki/Law_of_cosines) [## 密码
编辑描述
code.google.com](https://code.google.com/archive/p/word2vec/) [## 向量空间中单词表示的有效估计
我们提出了两种新的模型架构,用于从非常大的数据中计算单词的连续向量表示…
arxiv.org](https://arxiv.org/abs/1301.3781) [## GloVe:单词表示的全局向量
GloVe 是一种无监督学习算法,用于获取单词的矢量表示。培训在…进行
nlp.stanford.edu](https://nlp.stanford.edu/projects/glove/) [## 句子和文档的分布式表示
许多机器学习算法要求将输入表示为固定长度的特征向量。当谈到…
arxiv.org](https://arxiv.org/abs/1405.4053) [## BERT:用于语言理解的深度双向转换器的预训练
我们介绍了一种新的语言表示模型,称为 BERT,代表双向编码器表示…
arxiv.org](https://arxiv.org/abs/1810.04805) [## 句子变形/bert-base-nli-mean-tokens 拥抱脸
这是句子变形库的 bert-base-nli-mean-tokens 模型。句子-变形金刚…
huggingface.co](https://huggingface.co/sentence-transformers/bert-base-nli-mean-tokens) [## 文本、tf-idf 等的量化价值…
定义、计算和变化
medium.com](https://medium.com/analytics-vidhya/the-quantitative-value-of-text-tf-idf-and-more-e3c7883f1df3)
根据死亡人数计算活跃的新冠肺炎病例
原文:https://towardsdatascience.com/calculating-live-covid-19-cases-from-deaths-e70e5df45f60?source=collection_archive---------13-----------------------
通过统计数据预测数字
在 Unsplash 上由 Aron 视觉拍摄的照片
昨天,我和我的家人通了电话,他们受过足够的教育,知道现在出门的风险。但是,令我震惊的是,他说了一句让我吃惊的话:“人们不必要地害怕。我们是一个有 13 亿人口的国家,到目前为止只有 250 例报告病例。没什么好怕的。”即使在他的城市已经报道了病毒的时候,他还是这样说。
我感到困惑、沮丧和愤怒。
我感觉如果能算出‘真实活跃案例’,人们会更认真对待事情。
目前,我们对我们的情况—全球、国家和城市—有不正确的信息。我们真的没有对活跃病例的正确概念。
活动案例不同于报告的案例。
问题
目前不可能有正确的真实活动案例,因为:
- 我们没有足够的测试设备
- 人们不知道他们是否有正确的症状
- 有症状的人在接受检测之前,正等着情况变得更糟
250 不吓人。但是如果这个数字是 2500 呢?
方法
让我们用简单的数学和我们从其他国家学到的知识。我现在在印度的孟买,想计算一下当天的死亡人数。
为了计算真实的活动案例,计算需要非常具体的国家,并且还需要足够的案例才能在统计上正确。如果到目前为止只有一人死亡,下面的计算可能是不正确的。如果有 1000 人死亡,计算将接近真实值。
因此,我们将尝试计算真实值的下限和上限。
假设
让我们来看一些大概的数字。
死亡率→1%至 5 %
死亡所需天数→ 15 到 20 天
案件翻倍所需时间→ 5 至 7 天
我们想计算第 x 天的活动病例,给出第 x 天的死亡人数,而不是第 x 天的累计病例总数。
公式
让我们假设大数定律已经生效了,尽管它还没有生效,因为印度还处于萌芽阶段。
人要死,肯定有过死亡/(病死率)人。
由于死亡发生在感染疾病的几天后,病例以双倍的速度增长。
因此,鉴于当天的死亡人数,当天的活跃病例为
下界
让我们计算一下印度目前的情况。
一天只有 1 人死亡的情况下有哪些活跃的案例?
为了计算下限,让我们取最保守的数字。
死亡率→ 1%
我们会选择 1%,因为最初的死亡率很低,这是因为有现成的医疗保健。当医疗保健失败时,情况会变得更糟。我们看到更多的老年人死亡,他们的死亡率更高,但我们需要平均死亡率。
死亡所需天数→ 15 天
案件翻倍所需时间→ 7 天
我们有 441 个病例。这在某种程度上与印度目前报告的病例相吻合。我们有 304 个案子。
https://www.worldometers.info/coronavirus/
注意:这里要理解的一点是,我们使用了非常保守的数字,如果我们的假设是正确的,441 是一个下限。
上界
为了计算上限,让我们取较高的数字。
死亡率→ 1%
我们会选择 1%,因为最初的死亡率很低,这是因为有现成的医疗保健。当医疗保健失败时,情况会变得更糟。我们看到更多的老年人死亡,他们的死亡率更高,但我们需要平均死亡率。
死亡所需天数→ 20 天
案件翻倍所需时间→ 5 天
注意:这里需要理解的一点是,我们使用了较高的数字,如果我们的假设是正确的,1600 是一个上限。真实病例不能超过 1600 例,除非死亡报告不正确。
结论
如果你想做更好的计算,请把前一天的天数增加一倍,因为在一个国家疫情的不同阶段,天数会有所不同。此外,随着医疗保健变得不堪重负,死亡率也会发生变化。
我希望这是有意义的,有助于我们更仔细地了解情况。
保重,注意安全,✌️
用 Python 计算股本回报率
原文:https://towardsdatascience.com/calculating-return-on-equity-with-python-1ea583cd53bd?source=collection_archive---------27-----------------------
构建一个 Python 脚本来逐步计算股本回报率
沃伦巴菲特最喜欢的指标之一是净资产收益率(ROE)。他将净资产收益率作为投资决策过程的一部分。
股本回报率表明公司用股东投入的资金产生了多少净收入。在这个故事中,我们将使用 Python 计算您感兴趣的任何股票的股本回报率。
NeONBRAND 在 Unsplash 上的照片
如何计算净资产收益率?
股本回报率的计算方法是:普通股股东可获得的净利润除以一段时间内(如一个季度、一年等)普通股的平均账面价值。).
净收益代表普通股股东可获得的净收益。而权益账面价值是企业资产减去负债的价值。除了在分母中使用普通股的平均账面价值,我们还可以使用期初的账面价值。
如果普通股权益的账面价值在不同时期变化很大,那么一个时期的平均账面价值是最合适的。对于我们的计算,我们将使用权益的平均账面价值。
如何解读 ROE?
在投资界,较高的净资产收益率被视为一个积极的信号。然而,我们需要对公司如何增加净资产收益率保持谨慎。如果一家公司承担更多的债务,ROE 将会增加,因为该公司可能会通过发行债务来减少自己的权益(即购买自己的权益)。这将导致更高的风险,因此,净资产收益率将增加。
另一方面,如果一家公司增加净收入而不增加债务,那么净资产收益率的增加将是一个非常好的迹象。
用 Python 计算股本回报率
既然我们理解了为什么 ROE 如此重要,那么让我们构建一个 Python 脚本来自动计算我们感兴趣的任何公司的 ROE。
这超级简单。我们将使用一个免费的 API, Financialmodelingprep ,来检索财务报表和股票数据。我们将向 API 端点发出 get 请求来检索财务报表,我们将解析计算 ROE 所需的值。
首先,我们需要导入构建 Python 脚本所需的唯一库。
由于我们想重用代码来计算不同公司的 ROE,我们将构建一个函数调用 getROE 。 getROE 将把公司股票作为一个参数,该参数将作为 url 的一个参数传递:
Python ROE 函数
如果我们现在打印我们的损益表,我们将有一个很好的易于解析的格式字典。请注意,在 url 中,股票将被作为参数传递的公司股票代码替换,例如“ AAPL ”。
print(income_statement)
Python 损益表
计算净收入
现在,我们可以通过解析字典轻松提取出苹果的净收入。关键的财务包含所有季度损益表数据。因为我们对最近一个季度感兴趣,所以我们提取列表的第一个元素。在第一个元素中,我们需要提取关键字 Net Income Com 的值:
net_inc_common1 = float(income_statement['financials'][0]['Net Income Com'])
检索权益的账面价值
太好了,我们有了我们的 ROE 的分子。接下来,我们需要计算 股权的账面价值 。股权的账面价值可以通过查看财务报告中的资产负债表来提取。
幸运的是,Python 将完成这项工作,并为我们提取价值。我们将向 Financialmodelingprep API 端点发出 get 请求,以提取资产负债表季度数据:
BS = requests.get(f"https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/{stock}?period=quarter")BS = BS.json()
我们的回应如下所示。
资产负债表苹果公司
和以前一样,我们的响应包含一个字典列表。最新季度是列表中的第一个元素。我们现在可以解析字典来提取股东权益总额 值:
tot_equity_now = float(BS['financials'][0]['Total shareholders equity'])
因为我们需要计算该期间的平均值,所以我们还需要检索去年的权益账面价值。这将是列表中的第四个元素,即四个季度前:
tot_equity_previous = float(BS['financials'][4]['Total shareholders equity'])
很好,我们现在可以计算平均股本,并将其用作分母来获得 ROE 值。
Average_equity = (tot_equity_now + tot_equity_previous)/2ROE = net_inc_common1/Average_equity
将我们的 Python 金融脚本放在一起
我们构建了一个非常有用的 Python 脚本,用任何公司的 Python 来 计算股本回报率。它非常容易使用,我们只需要调用函数并传递一个公司股票作为参数。然后,我们的函数将提取所需的财务数据,并为我们计算 ROE。
参见下面的最终代码。
Python 计算 ROE
如果我们现在传递 AAPL 和 MSFT 作为我们 getROE 函数的参数,Python 将计算苹果和微软的 ROE:
Apple = getROE('AAPL')#Format number as percentage
Apple = "{:.2%}".format(Apple) MSFT = getROE('MSFT')
MSFT = "{:.2%}".format(MSFT) print('MSFT:', MSFT ) print('AAPL:', Apple )
这将使微软的净资产收益率为 11.5%,苹果的净资产收益率为 21.44%。苹果的净资产收益率高于微软。这是因为更高的债务水平还是更高的净收入?我会让你自己分析这个。下面随意提供这个问题的答案!
感谢您阅读文章。希望你喜欢它!
原载于 2020 年 2 月 10 日 https://codingandfun.com。
使用贝叶斯概率计算销售转换
原文:https://towardsdatascience.com/calculating-sales-conversion-using-bayesian-probability-b08f9fb262f2?source=collection_archive---------14-----------------------
计算销售转换率的直观方法,无需历史数据进行比较
图像来源
下面发表的这篇文章从的拉斯穆斯贝斯贝叶斯统计教程中获得了灵感和参考。下面,我试图解释贝叶斯统计如何应用于回答任何公司分析部门的人可能面临的问题。
背景
一个成功的企业通常希望通过各种营销策略获得新客户,从而扩大其客户基础。根据公司的商业模式,他们可能会选择各种营销策略方法。因此,当务之急是了解哪种策略最能产生有证据支持的成功,而不是直觉。
渗透新市场
Seeder 是一家在加州销售电动滑板车的公司,是该国最成功的电动滑板车生产商之一。他们试图通过在德克萨斯州销售电动滑板车来开发德克萨斯州地区。
播种机的营销团队利用印刷媒体并设计宣传册来吸引新客户。他们将小册子分发给 23 名德州人,最终卖出了 9 本。
问题
管理层想知道的是,印刷媒体在推广新型电动滑板车方面有多好?如果公司继续生产大量的小册子,比如说几十万册,他们期望看到的转化率是多少?
这个问题的答案初看起来很简单。使用营销团队收集的数据,通过将销售数量除以分发的手册总数来计算成功的概率。
brochures_distributed = 23
new_sales = 9
conversion_rate = new_sales/brochures_distributed
conversion_rate
汇率
我们可以看到,达成销售的概率约为 39%。这意味着,每分发 100 份宣传册, Seeder 应该能卖出 39 辆电动滑板车。
考虑到我们现有的数据,这似乎是一个不错的估计,但它有很大的不确定性。我们不知道哪些人看到了宣传册,他们决定购买电动滑板车的动机是什么,也不知道可能会严重影响他们购买电动滑板车决定的过多信息。小样本量也对转换估算的准确性提出了警告。
使用贝叶斯概率来量化不确定性
贝叶斯概率允许我们使用概率分布来量化未知信息。为了能够量化我们研究中的不确定性,我们需要三样东西。
- 数据
- 生成模型
- 传道者
数据
我们案例中的数据将来自我们进行的试点研究。我们知道,在 23 个看过宣传册的德州人中,有 9 个已经转变为客户。
生成模型
生成模型可以被定义为我们传递给一些参数的一组指令,比如潜在的转换百分比,以便模型基于参数模拟数据。例如,我们可以假设有 40%的潜在转化率,我们向随机选择的 50 名德州人展示宣传册。基于我们假设的转换率,生成模型将估计要进行 20 次销售。
基于上面假设的生成模型,我们有关于我们可能进行的销售数量的信息,但是我们感兴趣的是可能进行的销售的百分比。我们的生成模型是模拟数据,但我们已经知道我们的数据是什么。我们需要逆向求解生成模型,使其输出转化率。为了实现这一点,我们需要的是第三项先验。
前科
先验是模型在看到任何数据之前所拥有的信息。在贝叶斯术语中,先验是一种概率分布,用于表示模型中的不确定性。为了给我们的模型创建先验,我们将使用均匀概率分布。通过使用从 0 到 1 的均匀概率分布,我们声明在看到任何数据之前,模型假设 0 和 1 之间的任何转换率 (0%到 100%) 都是同等可能的。
拟合模型
下面是模型工作的基本流程。
- 根据我们的先验分布,我们为参数值抽取一个随机样本。在我们的例子中,参数值是转换率。
# number of samples to draw from the prior distribution
n_size <- 100000# drawing sample from the prior distribution - which in our case is uniform distribution
prior_dist <- runif(n_size, 0, 1)# peeking at the histogram to verify the random sample was generated correctly.
hist(prior_dist, main = "Histogram of Prior Distribution", xlab = "Prior on the Conversion Rate", ylab = "Frequency")
我们先前均匀分布的直方图
- 我们从步骤 1 中获取参数值,将其插入到我们的生成模型中,以便模型模拟一些数据。我们使用 for 循环多次重复这个过程。
# defining the generative model - a model or set of rules that we feed to parameters so that it simulates data based on those set of rules
generative_model <- function(rate) {
sales <- rbinom(1, size = 23, prob = rate)
sales
}# simulating the data through our generative model
sales <- rep(NA, n_size)
for(i in 1:n_size) {
sales[i] <- generative_model(prior_dist[i])
}
- 筛选出与我们的数据一致的所有抽样,即转化率为 0.3913 或总销售额等于 9。
# filtering out values from the model that do not match our observed results
post_rate <- prior_dist[sales == 9]
我们在这里做的是多次重复采样过程,并在每次迭代后生成一个随机转换率。过滤掉样本图的原因是我们希望保留我们在现实中观察到的数据。也就是说,当营销团队做这个过程时,他们通过进行 9 销售产生了 0.3913 的转化率。
真实转化率是多少?
这个问题的答案不是一个数字。它是可能转化率的概率分布。这些可能的转换率分布如下。
#plotting the posterior distribution
post_rate_hist = hist(post_rate, xlim = c(0,1), main = "Histogram of Posterior Distribution")
post_rate_hist
转化率的概率分布
从观察到的可能转化率的分布可以看出,最有可能的转化率应该存在于 35 & 45 百分比之间。我们也可以看到,转化率超过 60% 或低于 20% 的可能性极小。
我们可以通过计算每根棒线的频率并除以总抽取次数来计算可能的转换率的概率。
为了计算 40%和 45%之间的转换率的概率,我们做如下数学计算
# sum of frequency of draws between 0.40 and 0.45 divided by total draws
post_rate_hist$counts[8]/length(post_rate)
转换概率在 40%-45%之间
在这里,我们有 20%的可能性,转化率会落在 40-45%之间。
回答更多问题
哪种策略比较好?
我们可以使用我们创建的模型来回答关于营销策略的比较问题。例如,我们可以比较两种营销策略的转换率。
比方说,营销团队告诉我们,当他们部署电子邮件营销时,转化率为 20%。管理层现在想知道印刷媒体营销优于电子邮件营销的可能性。
从我们的概率分布中,我们可以计算出转化率大于 20%的频率,除以总吸引次数,得到平面媒体营销实现转化率大于 20%的概率。
sum(post_rate > 0.20) / length(post_rate)
转化概率大于 20%
在这里,我们可以说印刷媒体有 98%的可能性实现超过 20% 的转化率
使用置信区间
我们可以使用置信区间来计算覆盖总体分布 95%的转换率。
quantile(post_rate, c(0.025, 0.975))
95%置信区间
在这里,它意味着我们有 95%的信心,真实的转化率落在 22% 和 60% 之间。
结论
贝叶斯概率允许我们通过在运行测试之前考虑我们所拥有的所有信息来区分真实和噪音。这正是我们在这里所做的。我们考虑了这样一个事实,即从 0 到 1 的转换发生的概率是相等的。然后我们进行了一次模拟,结果与我们分发宣传册时观察到的数据一致。最终结果不是一个单一的数字,而是概率的分布。
这种分布允许涉众输入他们的领域知识,并尝试估计在不确定性的影响下他们的问题的正确答案是什么。
使用 VC 维计算样本量;一种机器学习的方式。
原文:https://towardsdatascience.com/calculating-sample-size-using-vc-dimensions-a-machine-learning-way-748abbe1b1e4?source=collection_archive---------55-----------------------
我们如何以及为什么需要知道最佳样本量??
数据收集过程本身就是一项冗长乏味的任务,需要花费数十年的时间。在医疗保健等领域,这一过程涉及大量成本,通常需要数年时间。例如,要获得某一特定疾病的信息,比如说 100 个数据点,就需要筛选两倍或三倍于所需样本量的患者。获取患者数据不仅是一项耗时的工作,而且代价高昂。虽然在无所事事的情况下收集大量数据是一项非常徒劳的任务,但类似地,当机器学习算法应用于数据时,无法满足数据要求也不会产生好的结果。最终,估算最佳样本量是一项决定性的任务,也是在对数据进行任何分析之前需要考虑的事情。
在这里,我将讨论一个有趣的技术,使用 VC 维度的概念来近似样本大小,通过调整它来使我们更容易和舒适。在继续之前,我想先介绍一种统计方法或近似样本大小的方法,然后进一步说明其局限性,并向您展示 VC 维方法的必要性。
统计样本量估计
为了解释估计样本量的统计方法,我引用了波士顿大学的 Lisa Sullivan 教授在这里所做的工作。我建议所有读者在继续阅读之前先浏览给定的链接,因为我会准确地解释其中提出的方法。所提出的方法提出了一种估计最佳样本大小的方法,该方法可以减少由于数据中存在的方差而由输入特征引起的误差容限 E 。为了确定最佳的样本大小,必须首先选择期望的误差范围,这通常是领域专家的工作,并且根据问题而变化。以上述方式计算样本量的公式如下
该公式生成样本大小' n' ,确保误差范围 E 不超过规定值。为了求解 n ,我们必须输入“ Z 、“ σ”、“T19”和“ E ”
‘σ’是样本方差
‘E’是期望的误差率
‘Z’是给定置信水平的 Z 分布值
从上面的公式中可以看出,样本大小“n”取决于所选的误差容限“ E”,这一点很重要。
确定样本量的统计方法虽然在逻辑上听起来很棒,但有一个非常明显的先天限制。
统计样本大小估计没有给出选择样本大小的方法,该方法可以减少误差或增加应用于数据的预测机器学习模型的准确性。
事实上,以这种方式估计的样本大小没有以任何方式考虑应用于它的任何机器学习模型或算法。因此,这使得统计方法非常幼稚,帮助不大。
有没有一种选择样本大小的方法可以减少应用于数据的机器学习模型的误差??或者有没有办法确定一个机器学习模型对于特定样本量的预期误差是多少?这些问题的答案与风险资本维度的概念紧密相连。
VC 维方法给出了一种确定样本大小的方法,这种方法可以减少应用于其上的任何机器学习模型的误差。
VC 尺寸
VC 维的概念为基于机器学习算法确定测试误差铺平了道路,该算法被选择应用于数据和与其相关联的训练误差。
让我先简单介绍一下VAP Nik–Chervonenkis(VC)维度的概念及其工作原理。
注意:我对 VC 维概念的解释非常简略,因为本文的主要焦点是使用它计算样本大小,而不是概念本身。
Vc 维测量统计分类算法学习一组函数的能力。简单地说,它衡量分类模型的能力。
统计分类算法的 VC 维的典型定义是:算法可以粉碎的最大点集的基数。
粉碎
这里我直接从维基百科借用粉碎的清晰定义。
“具有某个参数向量‘θ’的分类模型' f ' 被认为粉碎了一组数据点{X1,X2…,Xn},如果对于这些点的所有标签分配,存在一个‘θ’,使得模型' f ' 在评估该组数据点时不会出错。”
打碎
因此,一个算法可以粉碎的点数定义了它的 VC 维数。
现在转到本文的中心主题,即 VC- dimensions 如何方便地识别正确的样本大小,让我介绍一个公式,它给出了算法产生的测试误差量的概率上限。
虽然乍一看可能很吓人,但让我一部分一部分地揭示它。此处的公式考虑了模型的训练误差、应用算法的 VC 维“D”、应用模型的样本大小“N”以及 0≤η≤1 的“η”。
因此,简而言之,上述公式考虑了模型的 Vc 维、样本的大小以及由此获得的训练误差,然后生成在给定所有上述因素的情况下可以获得的测试误差的概率上界。到目前为止,除了解释 Vc-dimension 的一般概念和工作方式之外,我还没有提出任何新的东西。好吧,实际上我们已经走到了尽头,却并不知道。稍微调整一下上面的公式,我们就可以得到预期的样本大小的近似值。
我们用这样一种方法破解上面的公式,得到样本大小。因为我们现在的目标不是得到测试误差的上界,而是可以减少测试误差的样本大小,所以我们现在选择一个测试误差,我们可以根据我们正在处理的问题来考虑这个测试误差,并且扫过‘N’的值的范围,直到我们达到期望的测试误差。因此,我们不再像之前那样求解测试误差,而是求解样本大小。
一般来说,当我们选择一个更严格的测试误差时,“N”的值会增加。因此,我们想要的测试误差越大,我们的样本量就应该越大。因此,我们得到的样本大小近似值可以减少测试误差。
这种近似的方式非常简单,并且对于我们应用于数据的机器学习算法也非常灵活。近似样本大小因型号而异。
希望这是有益的!!
*一些定义和数字来自维基百科和互联网。
计算 10 个点击率最高的迷因
原文:https://towardsdatascience.com/calculating-the-10-most-viewed-memes-dc8e1e24caf3?source=collection_archive---------41-----------------------
以及实现这一目标所需的 5 项数据科学原则
作者图。根据合理使用原则的规定,出于评论的目的,在此复制模因的缩略图是允许的
尼尔森收视率估计广播电视节目的观众人数,但我们没有独立估计迷因(一种在过去十年中流行起来的艺术形式)的观众人数。所以我创造了一些!
我将描述上面图表中显示的视图计数是如何使用大约 43k 张图像的数据集和 5 个数据科学原则得出的(这些原则是我多年来在许多项目中应用的)。
1)明确定义您想要评估的内容
文字是可以解释的。我已经记不清有多少次两个人会在谈话中就一个项目的目标达成一致...只是后来发现他们对一个关键词有不同的解释。如果你在项目开始时就彻底辩论每个单词的定义,你将会节省时间。
例如,假设您想要估计“2019 年英国人口”。这是指 2019 年开始、结束或中期的人口吗?还是三者的平均值?人口是指永久居民,还是包括游客和临时居民在内的每个人?没有正确答案!
所以回到迷因。需要澄清的是,我说的不是模因的学术定义,而是互联网图像模因(在网上分享的图像和文本的组合)。更确切地说,我感兴趣的是找出最流行的 模因模板 (用于模因的底层图像)。所以当我说“点击率最高的迷因”时,我实际上是指:
被浏览次数最多的模因模板(我们通过使用该模因模板将所有互联网图片模因的浏览次数相加得出)**
因此,现在是时候开始收集数据了。
2)以最小化偏差的方式采样数据
尼尔森系统不可能监控每一台电视机,就像我无法下载网上分享的每一个 meme 一样。在这两种情况下,采样都是必要的。
如果一个数据样本真正代表了更广泛的人群,我们说它是无偏的,但在许多情况下这是不可能的。通常,我们必须以尽可能合理地减少偏差的方式对数据进行采样。然后在以后分析数据时尽最大努力纠正偏差。**
在这个项目中,迷因是从世界上最大的图片分享网站之一 Reddit 上采集的。一天中有几次,一个网页抓取器会查看网站上几个以迷因为中心的部分,并收集 100 个最受欢迎的帖子。这些模因中有许多是在发布观看数据的网站 Imgur 上托管的,所以交叉引用他们的数据可以让我们推断 Reddit 帖子的观看数据。多亏了 Reddit & Imgur 的 API,用几行 python 就可以完成这个采样。为了简洁起见,我在这里就不解释了,但是所使用的代码可以在本文中找到:
*** [## 哪个分支得票最多?
结合 Reddit 和 Imgur Python APIs 来确定用户参与度在子编辑之间如何变化
towardsdatascience.com](/which-subreddit-upvotes-the-most-18ab20567e25)
现在的问题是这种采样方法能使偏差最小化吗? Reddit 只是一个网站,所以并不能真正代表整个互联网。我们可以通过对发布到其他网站的模因进行采样来减少偏见,比如 Instagram 或脸书。然而,这些网站提供的公共数据有限,不具有可比性,在网站之间进行比较的唯一方法是做出疯狂的假设,这可能会给我们的最终估计带来更大的偏差。
有时你只需要接受没有正确答案的事实,然后做出判断。我认为最好从一个最好的来源取样,而不是把许多来源结合起来,最后得到一个不可靠的数据集。我说 Reddit 是最好的来源,因为它是最大的图片分享网站,你可以从中推断出合理准确度的观看数据(通过与 Imgur 数据的交叉引用)。***
3)复杂模型只针对复杂问题
我们需要识别数据集中每个迷因所使用的迷因模板。这是一个图像分类问题,但更重要的是一个简单的图像分类问题。不要使用复杂的解决方案,简单的解决方案就可以了。**
最新技术水平的图像分类器,如那些赢得 Image-Net 竞赛的图像分类器,是深度神经网络,无论角度、光照或背景如何,都能够进行对象识别。观察迷因并识别潜在的迷因模板是一项简单得多的任务,因此需要比 100 层神经网络简单得多的东西。
模因模板只有这么多,它们都有独特的调色板。我们可以通过计数像素并将这些计数传递给线性支持向量机来准确地对迷因进行分类,这需要几秒钟的训练(而神经网络需要几天)。如何构建这一精确模型的有效示例可在此处找到:**
*** [## 迷因视觉:对迷因进行分类的科学
图像识别并不总是需要神经网络;使用更简单的模型可以实现效率和准确性
towardsdatascience.com](/meme-vision-framework-e90a9a7a4187)***
4)验证,如果可能的话,请使用人工
很多次,一个热切的年轻数据科学家跑到我的办公桌前,骄傲地宣布一个了不起的结果,但当被问及他们做了什么来验证结果时,他们的信心消失了。在一点基本的验证发现一个主要的缺陷之后,辉煌的结果往往会消失。
当涉及到验证图像分类模型的结果时,人眼是无可替代的。你可能认为在这个数据集(大约 43000 张图像)上的图像分类器的结果需要很长时间来验证,但是有许多工具可以加快速度。使用这个标签工具,我能够在几个小时内验证结果(并标记任何不正确的分类):
*** [## 在 Jupyter 笔记本中点击鼠标来标记图像
训练图像识别模型的关键是拥有大量手动标记的图像。这需要时间,所以…
towardsdatascience.com](/one-mouse-click-to-label-an-image-within-a-jupyter-notebook-40053095333a)
我平均花费 20 秒来验证 100 张图像(在 10x10 的网格中查看),所以我最终在不到 3 小时的时间内看完了所有 43000 张图像。不是我每天都想做的事情,但是一年一次也可以。***
5)仔细考虑每一个假设
统计模型依赖于数据和假设。通常你不能改进原始数据,但是你可以改进假设。
这项工作的最后一步是获取数据集,并提取每个模因模板的观看数据。由于数据的限制,这个分析需要几个额外的假设,我将在下面解释。如果你想知道这一步的完整代码,可以在 Kaggle 笔记本中找到:
*** [## 创建 meme 模板视图时间线
使用 Kaggle 笔记本探索和运行机器学习代码|使用 2018 年最流行的 memes 模板中的数据
www.kaggle.com](https://www.kaggle.com/gmorinan/creating-meme-template-view-timeline)
第一个假设与缺失值有关。当数据集中的某个条目有缺失值时,是移除该条目(从而减少样本大小)还是推断该值(从而可能导致不准确)更好?这取决于您的数据集中有多少比例的数据缺少值;对于低比例来说,删除它们通常更好,但对于高比例来说(对于这个 meme 数据集来说),删除所有这些值会显著降低样本的代表性,因此我尽可能填充那些缺失的值更有意义。
第二个假设是关于纠正我们数据集中对 Reddit 用户的偏见。我使用下面的“传播”假设来解决这个问题。我从 Reddit 的几十个不同版块中取样,这样我就可以测量每个模因模板出现在多少个版块中。我假设一个迷因在 Reddit 内传播得越广,它在 Reddit 外传播得就越广,因此这些迷因的浏览量被夸大以反映这一点。
说到假设,从来没有一个正确的答案。你唯一能做的就是做出一个你能向他人证明的判断。***
结果;点击率最高的模因模板(2018 年)
该方法在 2018 年全年运行,共下载了 40 万张图片,其中 43,660 张被确定为使用了 250 种最常见的 meme 模板之一。
正如我们所见,德雷克·梅梅在 2018 年是迄今为止观看次数最多的,观看次数超过 1.57 亿次(根据这一分析,这很可能低估了真实数字)。
作者图。在合理使用原则下,出于评论的目的,在此复制模因的缩略图是允许的
并且顶部模板中总视图计数的分布大致类似于帕累托分布。
按作者分列的数字
介意看看吗?
您可以在此下载所有约 43k 的图像和元数据:
*** [## 2018 年最受欢迎的模因模板
43k 图像,带有元数据和估计观看次数
www.kaggle.com](https://www.kaggle.com/gmorinan/most-viewed-memes-templates-of-2018)
最后的想法
有很多事情很难准确衡量;迷因流行是其中之一。有时候我们不得不接受这一点,尽可能做到最好。我讨论了在这项工作中使用的 5 个原则,可以总结为:在采取行动之前,仔细考虑项目的每一步。***
计算两个地理空间坐标之间的方位角
原文:https://towardsdatascience.com/calculating-the-bearing-between-two-geospatial-coordinates-66203f57e4b4?source=collection_archive---------8-----------------------
当以编程方式调整相机以遵循特定路径时——无论是在谷歌街景还是地理信息系统动画上,程序员可能需要指定两点之间的方位或经纬度坐标。在这篇文章中,我解释了这是如何实现的。
照片由丹尼斯·詹斯在 Unsplash 拍摄
数学
数学上,点 a 和点 b 之间的方位角是通过取 X 和 Y 的反正切函数来计算的
bearing = arctan(X,Y)
其中 X 和 Y 定义如下:
X = cos θb * sin ∆LY = cos θa * sin θb – sin θa * cos θb * cos ∆L
这里 a 和 b 代表两个坐标,它们的前缀由下式给出:
L = Longitude
theta = Latitudeand ∆L is the difference between the Longitudal values of the two points
程序上
为了将这一逻辑应用于计算机程序,我们从我们的观点开始:
a = {'lat': <some value>, 'lon': <some value>}
b = {'lat': <some value>, 'lon': <some value>}
接下来,我们通过从 b 中减去 a 的纵向值得到∆L
dL = b.lon-a.lon
现在我们可以计算我们的 X 和 Y 值:
X = cos(b.lat)* sin(dL)
Y = cos(a.lat)*sin(b.lat) - sin(a.lat)*cos(b.lat)* cos(dL)
最后,我们可以使用反正切并获得我们的方位:
bearing = **arctan2**(X,Y)
注意:该值以弧度为单位!
Python 导入
如果使用 Python,您可以在下面的 numpy 导入中重用上面的代码。
from numpy import arctan2,random,sin,cos,degrees
要将弧度转换成角度,只需在末端应用“角度”功能- degrees(bearing)
。在我的例子中,我想要北方的学位,因此使用了((degrees(bearing)+360) % 360)
。
结论
这里我们有一个简单的方法来计算两点之间的方位。
计算向量 P-范数——数据科学中的线性代数(ⅳ)
原文:https://towardsdatascience.com/calculating-vector-p-norms-linear-algebra-for-data-science-iv-400511cffcf0?source=collection_archive---------7-----------------------
支持机器学习中正则化方法的数学原理
在线性代数系列中,快速回顾一下,我们已经学习了什么是向量、矩阵&张量、如何计算点积来解线性方程组,以及什么是单位矩阵和逆矩阵。
继续这个系列,下一个非常重要的话题是向量范数。
所以,
什么是向量范数?
向量范数是将向量映射到正值的任何函数,该正值是向量的大小或向量的长度。现在,有不同的函数,为我们提供了不同的计算向量长度的方法。
没关系,但是为什么我们要研究这个,这个向量长度代表什么…?
为什么要学习规范??
范数是机器学习和深度学习中非常重要的概念,通常用于计算 ML/DL 模型预测中的误差。
向量的长度通常表示预测和实际观察值之间的误差(标签)。
我们经常需要计算向量的长度或大小,要么直接用作 ML 中的正则化方法,要么作为更广泛的向量或矩阵运算的一部分。
那么,这些是什么功能呢?
范数函数的特征
范数是由以下性质表征的任何函数:
- 范数返回非负值,因为它是向量的大小或长度,不能为负。
- 当且仅当向量为零向量时,范数为 0。
- 范数遵循三角不等式,即两个(或更多)向量之和的范数小于或等于单个向量的范数之和。它只是简单地说明,从几何学上讲,任意两点之间的最短路径是一条直线。
用方程表示:
∑a+b∨≤∑a ∨+∨b∨
其中 a 和 b 是两个向量,竖线∨一般表示范数。 - 向量乘以标量的范数等于这个标量的绝对值乘以向量的范数。
代表方程:∥k⋅x∥=|k|⋅∥x
计算 P-范数的步骤
P-norm 的计算基于中心公式:
∩x∩ₚ=(∑ᵢ|xᵢ|ᵖ)/ᵖ
这里有一个快速的 4 步过程来得到一个向量的 p 范数
- 得到向量每个元素的绝对值。
- 将这些绝对值提高到幂 p.
- 计算所有这些提高的绝对值的总和。
- 得到 p ₜₕ根或者根据上一步的结果将功率提高到 1/p。
现在,基于公式、中的 P 的值,我们得到不同类型的规范。让我们逐一讨论这些:
L⁰常模
在公式中放入 p = 0 将得到 L⁰范数。
除了 0 之外,任何 0 次幂都将返回 1。L⁰并不是一个真正的标准,因为它没有表现出特征 #4 (如上所述)。乘以一个常数会给我们这个数本身。
l 范数
放 p = 1 得到我们 L 范数。本质上,该公式将计算矢量绝对值的总和。
公式:|x|₁=(∑ᵢ |xᵢ|)
这用于计算平均绝对误差。
Python 代码
我们可以使用 Numpy 包的线性代数模块获得 L 范数,该模块提供了一个 norm()方法。默认情况下,范数函数被设置为计算 L2 范数,但是我们可以将 p 的值作为参数传递。因此,对于 L 范数,我们将传递 1 给它:
from numpy import linalg#creating a vector
a = np.array([1,2,3])#calculating L¹ norm
linalg.norm(a, 1)##output: 6.0
l 范数
放入 p = 2 得到 L 范数。该公式将计算矢量值的平方和的平方根。
也被称为欧几里德范数。这是机器学习中广泛使用的规范,用于计算均方根误差。
∥x∥₂ = (∑ᵢ xᵢ ) /
所以,对于向量 u, L 范数将变成:
Python 代码
同样,使用相同的范数函数,我们可以计算 L 范数:
norm(a) # or you can pass 2 like this: norm(a,2)## output: 3.7416573867739413
平方 L 范数
∑ᵢ|xᵢ|
平方 L2 范数是简单的 L2 范数,但没有平方根。对上面计算的 L2 范数求平方将得到 L2 范数。
这很方便,因为它去掉了平方根,我们得到的是向量的每个平方值的简单和。
平方欧几里德范数在机器学习中被广泛使用,部分是因为它可以通过向量运算xᵀx来计算
Python 代码
让我们用 python 代码验证这一点:
x = np.array([[1], [3], [5], [7]])
euclideanNorm = x.T.dot(x)## output: array([[84]])np.linalg.norm(x)**2
##ouput: 84.0
最大范数
这是 L∞范数,它简单地返回向量最大元素的绝对值。
公式变成:
‖x‖∞=maxᵢ|xᵢ|
Python 代码
让我们用 python 代码来验证这一点,我们只需将无穷大传递给 norm 函数:
x = np.array([[1], [3], [5], [7]])
norm(x, np.inf)##output: 7.0
您可以在这里试用所有 python 代码:
[## 谷歌联合实验室
计算规范
colab.research.google.com](https://colab.research.google.com/drive/1DEqeWjD0kby5LhrShNzAIPSqWN6Wdsck?usp=sharing)
图形可视化
让我们试着用图表来分析这些情节。我在 2 维(x,y)中使用了相同的公式,第 3 维表示规范本身。
你可以看看这个表面绘图仪,我用它来得到这些图。
l 范数
使用https://academo.org/demos/3d-surface-plotter/创建
更像是彼此相连的飞机。x 和 Y 是这里的参数。
l 范数
https://academo.org/demos/3d-surface-plotter/
平方 L 范数
【https://academo.org/demos/3d-surface-plotter/
L2 范数的平方和 L2 范数看起来相似,但在零标记附近(中间蓝色区域)的图的陡度方面有一个重要的区别。平方 L2 范数不能很好地区分零和其他更小的值。因此,这揭示了其使用的一个问题。
摘要
在本教程中,我们研究了计算向量长度或大小的不同方法,称为向量范数。
具体来说,我们学习了如何:
- 计算 L1 范数,该范数计算为矢量绝对值的和。
- 计算 L2 范数,其计算方式为矢量值平方之和的平方根。
- 计算作为最大向量值计算的最大范数。
数据科学与 Harshit
通过这个渠道,我计划推出几个覆盖整个数据科学领域的系列。以下是你应该订阅频道的原因:
- 这些系列将涵盖每个主题和子主题的所有必需/要求的高质量教程,如数据科学的 Python 基础。
- 解释了为什么我们在 ML 和深度学习中这样做的数学和推导。
- 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
- 项目和说明实施到目前为止所学的主题。了解新的认证、训练营以及破解这些认证的资源,如谷歌的 TensorFlow 开发者证书考试。
线性回归背后的微积分
原文:https://towardsdatascience.com/calculus-behind-linear-regression-1396cfd0b4a9?source=collection_archive---------20-----------------------
理解线性回归的数学方面
线性回归通常是任何机器学习课程的起点。目标是预测输入变量和目标变量之间的线性关系。
最简单的例子是穿过空间原点的直线。在这里,我们被限制在二维空间,因此笛卡尔平面。让我们从头开始逐步开发,从 y=mx 格式开始,然后是 y=mx+c 回归。
y=mx 的简化场景
在这种情况下,我们知道我们要对通过原点的数据拟合一条线。这是一个简单的例子,可能是一个很好的起点。让我们发展我们的损失函数,看看它如何表现。让我们把我们的估计改写如下。
h(x) 是估计函数 J(θ) 是损失函数
注意,我们使用平方误差除以 2m ,其中 m 是我们拥有的数据点的数量。因此,我们可以认为这是一个平均值。准确地说,这是均方误差的一半。当我们得到损失函数的导数时,除以 2 背后的直觉将是可见的。这有助于我们得到一个更简单的损失函数的导数。让我们考虑以下几点。
2D 平面上的点集
我使用添加了噪声的 y=5x 图生成了这些点。因此,理想情况下,我们对 θ 的估计值应该更接近 5 的值。现在,如果我们绘制不同 θ 值的损失函数,我们将得到如下结果。
损失函数
注意,我们有一个更接近 θ=5 的损失函数的最小值。让我们看看如何通过计算得出这个特定的最小值。
注意橙色的切线和它的梯度。它是一个正的梯度,这给了我们一个想法,我们必须向相反的方向去寻找一个更低的值。
梯度下降
梯度下降的概念,正如通常解释的那样,是仅使用周围斜坡的知识在未知的地形中穿过下坡。因此,在本例中,目标是使用坡度找到穿过的方向,并决定移动的步长。
寻找遍历方向
很明显,我们必须向左走。步长呢?。这就是学习率发挥作用的地方。这被称为 ⍺ 。步长越小,速度越慢。然而,迈出更大的一步可能会让你错过最小值(想象你从θ= 7°步进到θ= 1°,没有意义)。所以我们可以把 θ 的变化公式化为。
θ计算的下一个值和损失函数的导数
由于这种线性回归的情况是独立于数据的,这可以用作计算损失和进行梯度下降的标准方程。这应该强调这样一个事实,即我们总是坚持标准损失函数,而没有建立自己的损失函数。用 python 实现这一点非常简单。我们用 len(x) 表示 m ,用 0.001 表示 ⍺.x 和 y 是训练数据集或我们要估计的点集。
#Loss function(1/2* len(x)) * sum([(theta* x[i] - y[i])**2 for i in range(len(x))])#Change of thetatheta - 0.0001 * (1/len(x)) * sum([x[i]*(theta*x[i] - y[i]) for i in range(len(x))])
我们可以迭代地进行梯度下降,直到我们达到最小值或者直到损失函数低于某个阈值。我们也可以决定迭代的次数。因为我们保证在线性回归中有一个最小值,所以我们可以如下实现 descend。
loss = float('inf')
theta = 8
while True:
theta = descend(theta)
if loss > loss_function(theta, x, y):
loss = loss_function(theta, x, y)
else:
break
下降函数返回下一个 θ 值,而损失 _ 函数返回 θ 值处的损失。我们可以将梯度遍历可视化如下。
随着损失函数的下降
梯度下降中每次迭代的估计变化
完整场景 y=mx+c
这是前一种情况的扩展,我们可以对估计方程和损失函数建模如下。
h(x) 是估计函数 J(θ1,θ2) 是损失函数
以下是我将尝试拟合的一组点。我使用函数 y=5 + 3x 生成了这个图,带有一点噪声。
y=5 + 3x 带噪声
现在我们有了一个包含两个变量的损失函数,我们的损失函数将是一个 3D 图,第三个轴对应于损失值。用图解法,我们可以说明如下。
损失函数的变化。圆圈中间是最小损失点。
我们的梯度下降可以被类似地导出以达到下面的方程组。
梯度下降函数的求导
请注意,梯度必须同时更新,以便一个 θ 值的更新不会影响另一个。在 python 中,该操作如下所示。
theta1_new = theta1 - 0.01 * (1/len(x)) * sum([theta1 + theta2*x[i] - y[i] for i in range(len(x))])theta2_new = theta2 - 0.01 * (1/len(x)) * sum([x[i]*(theta1 + theta2*x[i] - y[i]) for i in range(len(x))])theta1, theta2 = theta1_new, theta2_new
损失函数如下。对我们之前场景的唯一更新是,现在我们有了第二个变量 θ2 。
(1/2* len(x)) * sum([(theta1 + theta2* x[i] - y[i])**2 for i in range(len(x))])
我通过梯度下降更新了我的迭代,如下所示。除了前面检查下降损失的场景之外,我还考虑了下降损失的数量,以确保我不会迭代到非常接近最小值的点。
loss = float('inf')
theta1 = 10
theta2 = -1
while True:
theta1, theta2 = descend(theta1, theta2)
if loss > loss_function(theta1, theta2, x, y) and \
abs(loss - loss_function(theta1, theta2, x, y)) > 0.001:
loss = loss_function(theta1, theta2, x, y)
else:
break
我们可以将损失函数在梯度上的下降形象化如下。
随着损失地形移动
当我们的θ值变化时,我们的回归拟合与表上的值非常吻合。它看起来像下面这样。
梯度下降中每次迭代的估计变化
我们在最终拟合中分别得到截距和梯度的值 6.5 和 2.7 ,考虑到数据中的噪声,这是合理的。
感谢阅读。干杯!
微积分——关于“变化”的数学
原文:https://towardsdatascience.com/calculus-the-mathematics-of-change-f04f38770843?source=collection_archive---------5-----------------------
微积分如何实现机器学习和人工智能
来源:https://www.freepik.com/free-photos-vectors/background
数据科学和机器学习激发了人们对数学的兴趣。许多在人工智能领域提升技能的人已经意识到数学概念的实际应用,这是他们人生中的第一次。在我冒险进入 AI/ML 空间的过程中,我意识到,在学校和大学里,数学思想(如微积分和向量代数)比它们实际上是多么困难!我想很多人都有这种感觉。本文试图从根本上解释微积分及其应用,而不使用臭名昭著的术语和可怕的微积分方程。我期望这篇阅读会展现微积分和数学的美丽、简单和魔力。这个想法是为了让你会爱上它!
什么是微积分,为什么需要微积分?
人类有一个伟大的品质——“好奇心”。好奇心驱使人类去观察和了解自然。从广义上讲,科学可以称为对自然的研究,而数学是表达自然的语言。
理解或学习通常被表达为数学函数,该函数捕捉所涉及的实体或维度之间的关系。比方说,你正在开车。随着时间的流逝,你在测量汽车的速度。一些测量示例如下:
正如所见,速度和时间之间有关系。久而久之通过时,汽车的速度以恒定速率增加。每一分钟,车速增加 5 倍。这种关系可以表示如下:
速度是时间的函数
速度= f(时间)
S = 5 t*
从视觉上,你可以看到速度和时间之间存在线性关系
你可以想象这个关系实际上是代表一条线的方程:
y = mx + b
其中 m 为直线的斜率,b 为直线的截距。
在我们的例子中,等式变成了 s = 5t + 0
把注意力放在这个叫做“斜坡”的东西上。它代表了什么?我们知道,随着时间的推移,汽车的速度是变化的。这种变化是由什么因素引起的?我们可以通过检查速度随时间的变化而改变了多少来找出答案。例如在 t = 1 和 t =2 之间,速度从 5 变为 10。这可以写成:
当事物发生变化时,一个更有用的衡量标准是“”。变化率让我们知道一个量对另一个量的依赖程度。如果比率越大,数量之间的相关性越大,反之亦然。(现在想想你试图通过机器学习做什么。你看出其中的联系了吗?)
在我们的例子中,如果我们用“速度的变化”除以“时间的变化”,就得到变化率
这是速度相对于时间的变化率。在我们的例子中,这个速率是恒定的。您可以采用其他时间间隔(例如 t=2 和 t=5)来测量速度的变化(25–10)。比率是一样的——5
(25-10)/(5–2)
变化率也被称为斜率或梯度。请注意,变化率越大,线的倾斜度就越大(因此,斜率也就越大)。比较下图中橙色线和蓝色线的斜率:
这和微积分有什么关系?其实,这就是微积分。
微积分是研究变化的数学分支
微积分通过测量一个变量在另一个变量发生变化时如何变化,以及这些变化如何随着时间的推移而累积,来帮助找出两个变量(量)之间的关系。
在我们上面的例子中,汽车的速度以恒定的速率增加。如果这个变化率不是恒定的,会发生什么?如果汽车在加速,速度的变化率每分钟都不一样,那该怎么办
在这种情况下,如何测量变化率,因为不同的时间段变化率不同?我们不能为这种数据定义一个单一的速度变化率。
你可以注意到,速度的变化率沿着久而久之向上攀升。捕捉这种关系的数学函数不是一条直线,而是一条 【曲线】 。
从我们之前的例子中,我们知道一条直线的斜率或梯度给出了 Y 轴变量(速度)相对于 X 轴变量(时间)的变化率。“直”的性质意味着变化率是恒定的。
但是…
如何测量一条曲线的“斜率”或“倾斜度”?
“曲线性”的特性意味着变化率不是常数。
微积分的妙处来了……
你能做的就是把曲线想象成一个由大量的* 非常小的直线段*的集合**
我们现在将计算曲线的“非常小”的线段的斜率。这个斜率表示相对于时间的“非常小”的变化,速度的“非常小”的变化。
让我们将“非常小的”速度变化表示为“ds”。
同样,一个“非常小”的时间变化为【dt】****
这个“非常小”的线段的斜率是
它可以计算如下:
请注意,由于“dt”已经很小了,所以下面将变得非常小,因此可以忽略不计
理论上,我们可以让 ds 和 dt 无穷小,这样这个“非常小”的线段“就变成了一个点。此时或瞬间的变化率或斜率实际上是曲线的切线。****
在我们的例子中,这个函数在特定时刻的函数和变化率是
在微积分术语中,找出一个变量相对于另一个变量的变化率的过程被称为【微分】。换句话说,如果
y = f(x)
那么找出 dy/dx 的过程就称为“ 微分 ”或“ 微分 ”。dy/dx 的比值称为“y 相对于 x 的微分系数”或“导数”。记住,它只不过是 y 相对于 x 的变化率
请记住—“dx”表示 x 的很小一部分
如果 y 是一个常数。这种情况下 dy/dx 会是多少?当 y 的值不变时,它将是 0。这是一个常数。
微分学在机器学习中的应用
微积分在机器学习中最稳健的应用是线性回归(和神经网络)中的 梯度下降 算法
线性回归涉及使用数据来计算最适合该数据的直线,然后使用该直线来预测一个变量与另一个变量的得分。预测就是根据预测变量(或独立变量)的分数来估计结果变量(或因变量)的分数的过程。为了生成回归线,我们寻找最佳拟合的线。能够更好地解释自变量和因变量之间关系的线称为最佳拟合线。观察值和实际值之间的差异给出了误差。计算该误差的公式也被称为成本函数。
最佳拟合线在数学上将表示为
Y = m.x + c
其中 m 和 c 分别是直线的斜率和截距。这是梯度下降算法必须找出的两个系数。
误差将取决于线的系数。如果系数的值不是最优的,那么误差会更大。线性回归模型的成本函数或误差量取决于所选系数的值。
这就是微积分的用处。我们可以求出不同系数值的误差变化率。变化率最小的值(即 0,曲线的底部)是最佳值。
所以微分是用来找曲线的极小点的。这一点给出了正在寻找的系数的最佳值!
关于整合的一句话
微积分的第二部分是积分。很简单,微分的逆运算。
在微分中,我们把事物分解成越来越小的部分。
在积分中,我们把所有较小的部分累加起来。整合的符号是:
每当看到这个符号,就在脑海里用“全部加起来”来代替。
x 的所有小部分的总和会是多少?
(有一本由 Silvanus P. Thompson 写的非常棒的书《T4 微积分变得简单》,非常详细地解释了这些概念)
我们为什么要这么做?为什么要整合?简单的回答是——
有许多事情是无法理解的,除非你把它们分解成更小的部分,对每个更小的部分做一些运算,然后把结果累加起来。
让我们以一个长方形为例:
*我们知道长方形的面积是长*宽(y x)
你能证明吗?从微积分的角度思考。想象一个更小的矩形,取一点宽度(dx)。
整个矩形可以认为是所有宽度为 dx 的较小矩形的总和
所以,现在我们有 x 个小矩形,每个宽度为 dx,长度为 y。
如果你想象 dx 非常非常小,那么迷你矩形最终会缩减为一条线(宽度接近 0,长度为 y)。整个矩形只是长度为“y”的“线”的集合。多少行?— x。
总面积=线 1 的长度+线 2 的长度+ ……。+直线 X 的长度
面积= Y * X
关键要点
- 学习(人类或机器)就是寻找变量之间的关系。
- 如果一个变量的值的变化是由另一个变量的值的变化触发的,那么找出变化率通常是非常有用的。这个比率实际上是两个变量之间关系的度量。在数学术语中,它也被称为斜率或梯度。微积分是研究“变化”的数学分支
- 微分是找出一个变量相对于另一个变量的变化率的过程。比率 dy/dx 代表这个变化率。几何上,它代表函数切线的斜率。
- 在机器学习中,回归算法使用微分过程来测量模型中误差的变化率,其中系数的值发生变化。变化率为 0 时的系数值给出了最佳值。
一旦你开始意识到数学概念背后的直觉,整个思维方式就会改变。分化和整合让我们将世界视为一组小部分以及这些小部分的总和。
您可能也会喜欢下面的文章:
- 为什么数据在数据科学中被表示为向量?
- 发现数学思维
- 人类学习 vs 机器学习
校准分类器
原文:https://towardsdatascience.com/calibrating-classifiers-559abc30711a?source=collection_archive---------19-----------------------
你确定你的模型返回概率吗?🎲
由希德·沙尔姆在 Unsplash 拍摄的照片
大多数用于分类的机器学习模型输出介于 0 和 1 之间的数字,我们倾向于将其解释为样本属于各个类别的概率。例如,在 scikit-learn 中,我们可以通过在模型上调用一个predict_proba()
方法来获得它们。 Proba ,就像在Probaabilities 里,对吧?这些数字通常对所有类别加起来都是 1,这证实了我们的信念,即它们是概率。但是他们是吗?嗯,通常没有,下面是原因。
到底什么是概率?
好吧,好吧,这些数字在某种意义上是概率,但不是我们希望的那样。它们满足被如此对待的大多数条件:它们在 0 和 1 之间,总和为 1,并且具有这样的性质,即数字越高,相应样本的类成员越可能。最后一点意味着,如果你只关心硬分类,你可以通过这些伪概率对你的样本进行分类,并应用阈值处理,例如,在每一类中取 x% 个最可能的样本。
然而,如果你也关心你的分类的确定性,这些数字是没有用的。这是因为它们不是频率主义意义上的概率。这是什么意思?一个常客会告诉你
“一个事件的概率是它在许多试验中相对频率的极限”。
比如为什么骰子掷出六的概率是 1/6?因为如果你滚动它 6 00 万次,你会得到大约 1 00 万个 6。如果你滚动它无限次,那么正好 1/6 次滚动将会是 6 次。
这与分类模型有什么关系?如果您的模型会产生频率主义意义上的概率,那么在所有情况下,当模型预测第 1 类的概率为 80%时,它在大约 80%的情况下是正确的。
正如我们已经说过的,对于大多数模型来说,情况并非如此。但是为什么重要呢?让我们实际一点,试着从足球比赛的赌注中赢得一些现金。
赌足球比赛
我收集了一个数据集,包含过去几年英超联赛的足球比赛结果。一排就是一局。看起来是这样的:
结果栏写明谁赢了这场比赛: H ome 队, A way 队,或者有一个 D raw 队。我们将构建一个二元分类器,尝试预测主队是否获胜。数据集中有 18 个特征:两支球队的 ELO 评分以及许多不同的统计数据,这些数据总结了两支球队在最近的比赛中在进攻和防守方面的表现。如果我们能预测主队是否会赢,我们就赌他们会发财。
数据集中有 5588 个游戏。我已经将其中的十分之一作为测试集,并为剩余的训练集拟合了一个随机森林。由于有许多特征,我们将首先使用主成分来降低维数。
我们得了 0.63 分。不好,也不可怕。当然比总是预测主场获胜的虚拟模型要好——这样的模型将获得 0.46 的准确度(因为东道主往往会赢得几乎一半的比赛)。
校准曲线
在你冲向投丨注丨网丨站之前,查看一下校准曲线。它告诉你模型返回的概率与理想的常客概率相差多少。在这里,我们按照以下方式对测试数据进行计算:我们将所有预测的概率分成宽度为 0.1 的箱,对于每个箱,我们计算主队获胜的样本的百分比:
通过使用 scikit-learn 的calibration_curve()
函数,您也可以更快地得到类似的结果,但是我们所做的手工工作会明确地告诉您发生了什么。我们现在可以绘制得到的df
来得到所谓的校准曲线:
理想情况下,所有点都应该在对角线上。这将意味着该模型是完美校准的,其概率估计是可信的。然而,事实并非如此。
实际情况是,如果模型预测主队获胜的概率在 0%到 10%之间(水平轴上的第一个框),实际上,主队在大约 40%的情况下获胜。如果我们只对模型确定主场获胜(> 90%概率)的游戏下注,会怎么样?我们只能在大约 30%的游戏中做对。这是一个可怕的下注策略!
为什么这么没校准?
我们刚刚看到的校准曲线显示了一个 S 形图案。许多分类模型经常出现这种情况,其结果通常是高估低概率和低估高概率。(对于我们的数据来说,似乎是反过来的,可能是由于极端箱中的观察数量,但要点仍然成立:概率估计相当差。)
那么,为什么很多模型会产生这种有偏的概率估计,尤其是对于很低和很高的值?根据工作方式的不同,每个型号的原因略有不同。这里,我们使用了一个随机森林,它是决策树的集合。森林的预测是通过对单棵树的预测进行平均而得到的,并且它们之间总是存在一些差异。由于概率以[0,1]为界,在这个区间的边界上总会有一些偏差。例如,假设一个模型应该预测某个测试样本的概率为零。一些基础树将正确预测零,但一些将预测稍高的值。取平均值会使森林的预测值远离零。在[0,1]区间的另一侧,这种效应类似但相反。
许多其他分类器,如朴素贝叶斯、支持向量机或决策树,也会产生 S 形校准曲线。这种情况的一般原因是,大多数分类模型针对二进制度量进行了优化,并根据二进制度量进行评分。准确性只看我们是对是错,不考虑确定性。基尼系数——决策树用来决定分割的杂质,它优化了尽可能精确和尽可能快速的分割。例子不胜枚举。
校准模型
幸运的是,有一种方法可以修正,即校准概率估计值。实际上,甚至有两个!
一种是将随机森林中的概率估计值输入到逻辑回归模型中,并用原始目标对其进行训练。这行得通,因为逻辑回归是一种罕见的野兽,它实际上产生校准的概率。其背后的秘密是,它优化了对数优势,这使得概率实际上存在于模型的成本函数中。这种方法被称为普氏规模。
另一个是所谓的等张回归。例如,这是一个非参数模型,它将分段常数、非递减函数与随机森林预测的概率相拟合,以便将它们映射到真实的概率空间。
使用这两种方法之间的实际差异是,普拉特标度在纠正 S 形概率估计方面更好,就像我们从我们的足球数据集获得的那样。另一方面,保序回归可以处理任何偏差形状,但代价是容易过度拟合。在实践中,我建议使用 plat-scaling,除非你发现它不太好用,而且你的数据集很大。
请注意,无论您选择哪种方法,校准模型都应该基于与随机森林所适用的数据不同的数据。因此,您需要一个单独的验证集(您将随机森林与训练集相匹配,对验证目标进行概率预测,并根据随机森林对这些目标的预测来匹配预测验证目标的校准模型),或者您可以简单地使用交叉验证,就像我们现在要做的那样。
校准分类器就像将它传递给 scikit-learn 的CalibratedClassiferCV
一样简单。方法参数可以是sigmoid
(缺省值,用于逻辑回归,也称为 Platt-scaling)或isotonic
。
现在让我们在上一个模型的基础上绘制这个新的校准模型的校准曲线。
这里有两件有趣的事情可以看:
- 校准的概率估计被校准。它们平均更接近对角线,因此更可靠。
- 校准模型根本不输出极端概率。它生产的最低值在 20 年代,最高值在 70 年代。这是一种常见的模式。
最后一句话:校准模型并不能保证其类分配能力的提高。准确性、精确度或召回率等指标有时甚至会下降。在这种情况下,校准模型的精度为 62%,而原始随机森林的精度为 63%。然而,校准得到了正确的概率,我们不会输给庄家。
结论
- 许多分类模型,如随机森林、决策树、支持向量机或朴素贝叶斯返回类成员的有偏概率估计。
- 这些有偏概率可以用于阈值处理,但不能作为确定性度量。例如,如果根据这样的模型,一个样本有 70%的概率属于某个类别,而另一个样本有 50%的概率属于某个类别,那么前者确实更有可能属于该类别,但是这种情况为真的概率实际上不需要达到 70%。
- 对于非常高和非常低的预测概率来说尤其如此:如果模型预测的是 2%,那么真实的概率很可能不止这个;如果它预测 97%,通常会更低。
- 修正有偏概率的过程称为校准。它归结为在初始模型之上训练一个校准分类器。两种流行的校准模型是逻辑回归和保序回归。
- 训练校准模型需要有单独的验证集或执行交叉验证,以避免过度拟合。
- 这在 scikit-learn 中非常容易做到。
感谢阅读!
如果你喜欢这篇文章,为什么不在我的新文章上 订阅电子邮件更新 ?通过 成为媒介会员 ,你可以支持我的写作,并无限制地访问其他作者和我自己的所有故事。
需要咨询?你可以问我任何事情,也可以在这里 预定我 1:1 。
也可以试试 我的其他文章 中的一篇。不能选择?从这些中选择一个:
[## 线性分类器:综述
本文讨论了四个流行的线性函数的数学性质和 Python 的实际应用
towardsdatascience.com](/linear-classifiers-an-overview-e121135bd3bb) [## 线性回归中收缩法和选择法的比较
详细介绍 7 种流行的收缩和选择方法。
towardsdatascience.com](/a-comparison-of-shrinkage-and-selection-methods-for-linear-regression-ee4dd3a71f16) [## 增强你对助推的把握
揭秘著名的竞赛获奖算法。
towardsdatascience.com](/boost-your-grasp-on-boosting-acf239694b1)
校准数据科学面试评估
原文:https://towardsdatascience.com/calibrating-the-data-science-interview-assessment-751e2db64198?source=collection_archive---------52-----------------------
几个月前,我写了一篇关于校准数据科学面试问题的帖子,看看数据科学家与他们的同行相比得分如何。我们最终让 600 多名数据科学家参加了我们的测验,这是数据科学面试中不同主题的八个问题。
附:如果你还没做测验,不想看到结果来影响你的分数, 拿去这里,别读了!
快速总结。我们收到了 600 多份回答,其中包括六道选择题和两道简答题。我很想知道我们会得到什么样的简短回答,但一般来说,它们都不是很有描述性,有时完全是随机的。所以我把它们排除在了最后的测验得分之外。
测验中最简单的问题是关于正则化的机器学习问题,其中超过 56%的受访者答对了。
测验中最难的问题是算法问题。正确答案实际上是第二多的答案。一般来说,这并不奇怪,因为这需要最深入的思考和最复杂的理解。
当我们绘制总分时,我们发现有趣的是接近正态分布。大多数人只答对了两个问题,平均值为 2.35,标准差为 1.37。如果你答对了六个问题中的四个,你就已经是前 20%的人了!
最后一个有趣的发现是,在最后,我们问我们的用户,如果他们得分高,他们是否愿意接受公司的邀请。我们绘制了两种分布图,看看基于他们求职行为的结果是否会有差异。
潜在的轻微增长,但没有真正突出。在低问题样本量的情况下,很难看出其中的显著差异。
最终,这个测验是一个有趣的测试,可以了解我们的问题有多精确。但是我认为很明显,也许结果中最大的差异是基于每个用户决定在测验上多努力。虽然这意味着是相同的,但每个用户对应该花多少时间以及他们对测验的总体投入有不同的预期。
此外,在测验中得分高的用户在数据科学面试中是否表现出色?数据科学领域有如此广泛的角色和职责,可能无法通过您对技术问题的回答来衡量。但更常见的是,它们确实充当了一面旗帜,是许多招聘经理清除误报的初步尝试。例如,我非常喜欢测验中的 SQL 问题,因为它测试了两个概念;如果你了解左连接如何工作以及查询结果的分布情况。
最后,如果我们增加测验中的问题数量,是否会更好地分配和衡量每位数据科学家的熟练程度?一方面,我们不想降低问答游戏的转化率,让用户中途退出。但与此同时,更多的问题意味着更多的数据点可以信任结果,并用来单独了解用户在数据科学面试技能方面可以改进的地方。
最终,虽然数据科学面试将继续是一个黑箱,但我们将继续不时地尝试照亮那里,看看我们是否能找出更多的东西!
原载于 2020 年 4 月 1 日 https://www.interviewquery.com。
加州的大赌博
原文:https://towardsdatascience.com/californias-big-gamble-1c67f282d3ac?source=collection_archive---------77-----------------------
新冠肺炎的数据可能并不像一些人认为的那样充满希望
蒂姆·莫斯霍尔德在 Unsplash 上的照片
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
旧金山湾区是全国第一个发起就地避难的地方。阿拉米达、康特拉科斯塔、马林、圣马特奥和圣克拉拉等县以及旧金山和伯克利市于 2020 年 3 月 17 日采取行动,敦促人们留在家中。加利福尼亚州紧随其后,州长加文·纽瑟姆于 2020 年 3 月 19 日发布了全州就地避难令。
到目前为止,加州是应对新冠肺炎最谨慎和负责任的州之一。就我个人而言,我很感激生活在一个重视这种威胁的州。在过去的几个月里,加文·纽瑟姆州长为遏制这种病毒的传播所采取的迅速而果断的措施给我留下了深刻的印象。
也就是说,我认为封锁限制的放松可能是令人担忧的原因。为了解释原因,我们需要看一下数据。
加州每日新新冠肺炎病例图表(来源:加州新冠肺炎仪表板
上图显示了一段时间以来每天新增的新冠肺炎病例。我强调了自 3 月 19 日以来每天新增病例的数量,这一天是纽瑟姆州长发起就地安置的日子。你可以看到那天有 177 个新病例。
加州每日新新冠肺炎病例图表(来源:加州新冠肺炎仪表板
现在看这张图表。这是同一个图表,但是突出显示了 5 月 23 日星期六新增病例的数量。当天新增病例 2287 例。
新冠肺炎每日新增病例比封锁开始时增加了 10 倍
177 对 2287。即使我很慷慨,将第一个数字四舍五入到 200,将第二个数字四舍五入到 2000,这仍然是 10 倍的增长。新冠肺炎每日新病例比封锁开始时增加了 10 倍。
增加测试怎么办?
是的,那是一个重要的考虑。毕竟国家一直在疯狂测试。根据该州的冠状病毒数据网页,他们现在已经进行了 150 万次测试。
(来源:CA 的冠状病毒数据网页)
但不幸的是,提供这些数据的图表并没有显示我们实际上需要知道什么来评估检测对确诊新病例率的影响。为了理解这一点,我们需要每天进行的测试数量。此图表显示了进行的测试总数。这意味着,对于该图表显示的每一天,与该天相关联的数字是所有时间内进行的实验室测试的总数。这意味着每个数据点是当天进行的测试数量加上前几天进行的所有测试的总和。像这样的图表实际上除了向我们显示测试总数之外并没有多大用处——这个数字已经在顶部给出了。
我觉得奇怪的是,他们没有在页面上显示每天进行的测试数量的图表。如果你有这两组数据中的一组,你几乎肯定有另一组。
幸运的是,冠状病毒数据中心确实有一个测试图表,如果你添加一个专门针对加州的过滤器的话。
图表显示了一段时间内加州进行的新冠肺炎测试的数量(来源: Knowi 新冠肺炎测试仪表板
从这个图表中我们可以看到,在 3 月 19 日,该州为新冠肺炎进行了大约 1100 次测试。而在 5 月 24 日,他们进行了大约 67000 次测试。这意味着该州正在进行的测试是这一切开始时的 60 倍。
等等,还有很多测试。那一定是个好兆头,对吧?
嗯,是也不是。是的,这意味着比加州第一次开始检测时,检测结果呈阳性的比例更小了。但不幸的是,它实际上并没有告诉我们事情是否正在好转。为了给我们提供可操作的信息,我们必须从一开始就进行随机抽样——这不是疫情测试的方式。
一开始,我们只测试那些表现出最严重和最明显的新冠肺炎症状的人。现在,随着我们检测能力的提高,我们能够检测越来越多的人,包括许多没有表现出症状的人。因此,随着我们测试的人越来越多,阳性测试的百分比会下降,这是我们测试程序的自然结果。
我们仍然不知道真实的数字
事实是,当我们第一次开始测试时,每天新感染的数量可能比每天 200 多,但因为我们没有做足够的测试,我们不知道实际情况有多糟糕。
在没有数据或数据不确定的情况下做决定是赌博。这就是我们正在做的,放松加州的封锁。
加利福尼亚州有 3951 万人口。这意味着,即使我们每天进行 67,000 次测试的最高测试率,我们每天也只测试 0.2%的人口。因此,我们得到的每日新病例的数字可能仍然与新病例的真实数字相差甚远。
如果每天 200 个新案例足以成为在 3 月份启动锁定的理由,那么现在这个数字的 10 倍应该足以成为继续锁定的理由
最后的想法
我们只是不知道足够的信息来确定打开它是否安全。由于人们的生命悬而未决,在我们有真正的数据表明它是安全的之前,保持限制可能是谨慎的。不仅仅是越来越好,而是它实际上是安全的。目前,没有任何数据能确切地告诉我们这一点。
在没有数据或数据不确定的情况下做出决策,是一种赌博。这就是我们正在做的,放松加州的封锁。
如果每天 200 个新案例是 3 月份启动封锁的充分理由,那么 10 倍的数字应该是现在继续封锁的充分理由。
提前选举:假新闻还是统计数据?
原文:https://towardsdatascience.com/calling-elections-early-fake-news-or-statistics-dd2e8cc196c5?source=collection_archive---------49-----------------------
调用选举背后的推理引擎的高级、可访问的演练
美国东部时间晚上 8 点 40 分,尽管州官员只报告了大约 50 万张选票,但大多数主要新闻站都呼吁伊利诺伊州支持拜登。这仅仅是估计的 6%的选票!一个候选人怎么可能这么早就赢了?这是某种假新闻/压制选民吗?
图片来源:保罗·花冈
嗯…事实证明他们是对的,所以让我们看看我们是否能解开统计数据背后的魔力,他们在最终投票数天前用来推断这些结果(在撰写本文时,他们仍在计算)。
我想象这里发生的是一个简单的风险分析,再加上全美争先的驱动力。
一方面,在某一点上,我们几乎“知道”谁赢了,这似乎是合理的,对吗?另一方面,你也不想在这种事情上犯错。这些新闻来源不断争夺我们的眼球(和信任)。先下手为强和不犯错成为一种平衡行为。想象一下第一篇 10 句话的文章在密歇根被调用的时候得到了多少点击量(翻译:$$$)。
最好把那些喜欢做数学的怪人叫来。看看他们能否解决这个问题…
可访问性说明:
这是系列其余部分的基础。下面有一些数字和图表…如果没有的话,就很难用统计学来解释了。然而,我意识到我是为普通读者写的,所以我尽我所能保持通俗易懂,并希望展示统计学的基本原理实际上是多么简单和强大。
1 .大理石
我不知道他们打这些电话所用的信息,但我可以给你看一些我觉得很酷的东西,可以作为我认为幕后发生的事情的一阶近似。
像任何自尊的统计学家一样,我首先假设选票实际上不是选票,而是弹珠。但不是普通的弹珠。这些是特殊的投票弹珠,它们的颜色代表一个人的投票(让我们疯狂一点,说蓝色代表拜登,红色代表特朗普)。在选举日,人们不用去各个投票站、邮箱等地方,而是把他们特殊的弹珠放在一个位于州府的大弹珠袋里投票。现在,一旦这样做了,这个州就有了一个巨大的弹珠袋,它有效地代表了这个州的人民希望谁成为他们的下一任人类自毁按钮的管理者。
作者图片
好了,现在好戏开始了。我们首先摇动袋子以确保它完全混合。然后我们开始画弹珠并记录结果。当我们画每一个新的弹珠时,我们对袋子的红/蓝成分有了更好的理解。我们知道,如果袋子的成分有 50%以上是红色,那么川普就赢了。否则,拜登会赢。
因此,让我们这样表述这个问题:需要抽取多少个这样的弹珠,才能有信心指定一个获胜者(例如,假设袋子中有多于或少于 50%的单一颜色)。
扮演上帝
好吧,让我们量化一下。假设伊利诺伊州 55%的人投票给拜登。这意味着这个魔法包的成分是 55%蓝色和 45%红色。很简单。但是还没有人知道!
有那么一会儿,让我们假装我们知道它…也许我们就是上帝。所以我们观察人类从画 100 个弹珠开始,他们看到只有 49 个是蓝色的。作为理性生物的人类得出结论,就他们所知,袋子的成分有 49%是蓝色的,因此特朗普赢了(红色人种万岁)。
作为上帝,我们在这里可能会感到困惑…他们怎么会弄错呢?如果袋子本身是 55%蓝色的,人类画出少于 50%蓝色的几率有多大?为了回答这个问题,我们决定将同一个实验(从袋子里取出 100 个,然后放回原处)运行一百万次,并绘制出每个观察结果的数字(如下所示)。啊,现在我们看到,在 30%的情况下,人类可能画了少于 50 个蓝色弹珠(见红线),并错误地得出袋子里有更多红色弹珠的结论。好的,都检查过了。
作者图片
幸运的是,人类很聪明。他们也意识到,如果他们只抓住 100 个弹珠,他们有很高的概率得到错误的答案。所以他们很快增加到 1000 颗弹珠。在告诉你他们看到了什么之前,让我们先猜一猜。一种直观的方法是制作与上面相同的图表(从袋子中抽取 n = 1000 个弹珠一百万次,并绘制结果),看看它能告诉我们什么。
作者图片
现在你可以看到,在绝大多数情况下,超过了人类获得正确答案(拜登获胜)所需的 501 个蓝色弹珠(见红色)。事实上,这些愚蠢的人类现在回答错误的几率不到 0.1%(或者说答对的几率是 99.9%)。好了,我们现在感觉好多了。让人类继续数吧。我们和世界上的其他人坐在一起,打开 CNN/FOX 新闻,让戏剧展开。
但是等等,我们不是上帝(至少我不是……尽管我非常尊重我的读者)。因此,虽然上帝可能对上述练习感到满意,但我们不能仅仅为了看看我们的 1000 个大理石样本有多精确而画 1000 万次。这意味着我们已经画了 10 亿颗弹珠,只是为了表达我们对这 1000 颗弹珠有多自信!在这种情况下,我们应该放弃,数一数他们…对吗?
第三步:贝叶斯推理拯救
如上所述,我们想要回答的问题是:袋子里的弹珠是由什么组成的?换句话说,多少百分比的弹珠是蓝色的,多少百分比的弹珠是红色的?
既然拜登赢了伊利诺伊州,我们姑且称蓝色弹珠的比例为" p "这就允许我们说,如果 p > 50%(也写成 p > 0.5),那么拜登赢了。我们已经确定,我们将使用一个 n 弹珠的样本来估计这个 p 。我们的猜测将是我们在图画中观察到的蓝色大理石的比例(自然)。既然这个猜测不一定是包里面的真值 p ,那我们就称它为其他类似但不相同的东西吧。在统计中,我们给 p 一个可爱的小帽子,就像这样, p^ 说:“这实际上不是 p ,但它是我们基于一些数据的最佳猜测。”好了,让我们来回顾一下:
作者图片
如果有一种方法可以说,我 99.99%确信 p 在两个数字之间。然后我们可以评估我们猜测中的不确定性,如果我们错了,就掩盖我们的错误。
我很高兴你这么问,因为这正是我们发明置信区间的目的。它们给了我们一种方法来获取一些观察到的数据,并用它来推断产生这些数据的世界。它们告诉我们,我们对数字在一个范围(“区间”)内有多“自信”。
在我们的例子中,我们想知道我们认为大理石袋中蓝色大理石的比例 p 将落入的范围(记住如果我们知道 p 我们就知道谁赢了)。那么我们如何做到这一点呢?这就是统计推断的用武之地。为了让大家更容易理解,我打算简单讲一下,然后我们再跳回来。
原来画大理石的情况叫做超几何过程。对于那些不关心这是什么的人来说,重要的是它有一个名字,意思是有人聪明的想出了用它做什么。事实上,到目前为止,我就是这样模拟所有的情节的(如果你告诉 python 发行版的名称,python 会自动完成)。深入研究发现,当袋子里的弹珠数量增加时,它接近一种不同的(更容易处理的)情况,称为二项式过程。我提出这些的唯一原因是,二项式过程有一个重要的参数,你可能已经猜到了,它叫做 p ,我们可以很容易地估算出它的置信区间。我不打算进入近似置信区间的方法,但我会说,如果你感兴趣,查找这些术语:二项分布,置信区间,贝叶斯推断,共轭先验。(这感觉像是我在逃避,所以我可能会就此写另一篇博客,敬请关注。)
第四步:少错多对
对于我们其余的人,让我们只看图片,好吗?假设我们是之前的那些人,他们从一个只有上帝知道有多少个蓝球的袋子里抽取了 49/100 个红球。所以我们的 p ^由此估计是……你猜是 0.49(统计学家就是这么写 49%)。给定 n=100,关于 p 我们能说什么?嗯,使用前面提到的,不要再提了,贝叶斯推理方法,我们可以在选择 49/100 个蓝色弹珠( n =100)后,猜测(袋子的)值 p 。当然,这是一个概率分布。
作者图片
红线位于决策阈值处,如果 p 向左,特朗普获胜,如果向右,拜登获胜。我们看到很有可能 p 在 0.35 到 0.65 之间。因此,由于 p 的可能值有很大的“差异”,我们仍然不知道谁会赢。当然,大部分概率集中在 0.49 的 p 附近(由于一次不吉利的抽签,我们知道这是错误的)。
所以我们继续画,增加 n = 1000。现在,结果可能反映了一些更现实的东西,比如说,541 个蓝色球(即 p^ ~ 0.541),这更接近于包的蓝色球的真实比例( p = 0.55)。我在下面的图上画的洋红色的线显示了它们之间 99.99%概率的边界。因为我们有 99.99%的信心认为 p 在这两条线之间,任何超出这两个界限的值都代表一个不可想象的、不可能的事件。当我们这样做时,分布的扩散大大减小(即分布变得更薄)。这意味着,即使我们没有统计所有样本,我们也只有很小的窗口来猜测,没有一个样本预示着特朗普的胜利。
作者图片
如果我们再增加 n(T27 ),现在计数到 10,000 个弹珠,我们可以看到价差继续缩小到几乎为零。事实上,它收缩得如此之大,以至于我们看到 p 小于 0.5(川普获胜)的概率实质上是不存在的。因此,当我们在计数过程中达到这一点时,我们已经 99.99%确信 p 在 0.53 和 0.57 之间。换句话说,甚至在数一万颗弹珠之前,我们就知道拜登会赢。
作者图片
但是…好像没那么多票?还有… 弗吉尼亚怎么样?
在创造这个假的挑选大理石的世界时,我对你做了两个假设(并有点隐瞒),这两个假设在现实生活中肯定不成立。这些是:
1.弹珠被很好地混合在一起(以便任何人都有平等的机会被选中)。只有一个包
但是主要的要点仍然是:在一袋混合良好的弹珠的情况下,你不需要选择那么多弹珠来确定袋子其余部分的成分。我发现这很吸引人,有时很难相信。
进一步阅读
如果这让你对打电话给摇摆州需要多长时间或你的投票是否重要感到失望…我用以下州作为案例研究写了几篇文章:
- 弗吉尼亚州被称为拜登,即使他输了
- 德克萨斯真的会摇摆不定吗?
- 宾夕法尼亚州邮寄选票
如果你喜欢这篇文章,考虑鼓掌(或 10?)所以 TDS 会更容易与他人分享
电脑会画画吗?
原文:https://towardsdatascience.com/can-a-computer-draw-6a3c397a16d7?source=collection_archive---------37-----------------------
乔安娜·科辛斯卡在 Unsplash 上的照片
教计算机使用 GANs 绘制物体草图
上周,我的小弟弟向我介绍了 skribbl.io,这是一个在线猜字游戏。一个人画一个选定的单词,其他人必须猜出来。在一些激烈的战斗和欢笑之后,我想知道计算机在猜词方面是否比人更有效。这时候我碰到了快,画!由谷歌创意实验室开发的一款游戏,一个神经网络试图猜测你在画什么。超过 1500 万玩家创作的涂鸦是开源的,任何人都可以玩。我们来探究一下数据。
来源:谷歌
获取数据
快,拔枪!数据集在谷歌云存储上公开,在那里你可以找到 345 个类别的 5000 多万张图纸。使用 gsutil ,您可以本地下载并浏览图纸。数据集的简化版本仅包含必要的信息。每个类别是一个ndjson
文件,其中每一行是一个包含单个图形信息的json
。让我们看看这幅画是如何表现的:
[
[ // First stroke
[x0, x1, x2, x3, ...],
[y0, y1, y2, y3, ...]
],
[ // Second stroke
[x0, x1, x2, x3, ...],
[y0, y1, y2, y3, ...]
],
... // Additional strokes
]
在该格式中,x
和y
是草图的实值像素坐标。为了得到草图,我们需要在所有这些像素坐标之间“画一条线”。我们可以使用 Bresenham 的直线算法来做到这一点,该算法逼近我们在空白画布上绘制的笔画中每两点之间的直线所包含的点。
来源:维基百科
此时,我们能够显示一些草图。这里有一对来自airplane
和cat
类别的夫妇。
这些绘图包含在一个256 x 256
画布中,但是我们将它们作为一个28 x 28
画布输入到我们的模型中。784
像素足以捕捉我们绘画的意义,它们让我们在计算上更有效率。
教计算机画画
我给大家介绍一下生成对抗网络(GANs),这是一类机器学习框架,用来学习生成与训练集统计数据相同的新数据。
来源:斯坦福大学 [ arXiv:1707.02392 ]
生成模型 G 捕捉训练数据的数据分布,试图欺骗判别模型 D 来估计样本来自训练数据而不是 G 的概率。
你现在可以想象我们如何应用这个框架来解决我们的问题。生成器将生成图纸,而鉴别器将尝试从真图纸中识别出假。这是一个零和游戏,其中 D 和 G 相互竞争优化他们各自的效用函数。结果是神经网络(G)能够产生努力与训练数据相似的绘图。
我们将要使用的模型的架构可在此处获得,并在 Ian Goodfellow 及其同事于 2014 年撰写的本文中介绍。
让我们画素描
此时,我们创建一个脚本来加载我们的绘图数据集,并准备好训练我们的模型。
首发简单:画一个 的圆
0–500–5000–30000 个纪元
首先,模型是无线索的,输出基本上是随机的。经过 500 个时代,我们可以看到形状是模糊可见的,一旦我们达到 5000 个时代,我们可以清楚地认识到一个圆。经过 30,000 个纪元后,形状看起来非常独特,噪音也在消失。
升级:画一架 飞机
0–5–10–15–30–40–50 个纪元(千)
终极挑战:画一只 猫
0–1–5–10–20–30–40–50 个纪元(千)
轮到你了
这就结束了我们的创造性实验,其源代码可在这里获得。我鼓励你探索这个数据集,并提出你自己的创意项目。你也可以从谷歌创意实验室的其他人工智能实验的集合中寻找更多灵感。您需要的一切只需点击一下鼠标。
如有任何问题或想法,欢迎直接联系我。
卷积神经网络能通过肺部 CT 扫描诊断新冠肺炎吗?
原文:https://towardsdatascience.com/can-a-convolutional-neural-network-diagnose-covid-19-from-lungs-ct-scans-4294e29b72b?source=collection_archive---------44-----------------------
卷积神经网络教程使用计算机断层肺扫描新冠肺炎诊断。
当前的形势使人类面临新的挑战和机遇。在这个不稳定的今天,我们将回归科学,并通过使用一些公开可用的数据,从肺部计算机断层扫描(CT)扫描中创建用于诊断新型冠状病毒的图像分类模型的完整过程。在本练习中,我们将使用下一个数据集、Keras 和 Tensorflow。完整代码的链接是这里。
免责声明: 这是一个从零开始构建用于图像分类的卷积神经网络的练习/教程,应用于热点话题新冠肺炎诊断。我们对当前的形势不做任何结论。我们得出的唯一结论是我们的模型在可用数据范围内有多好。
新冠肺炎(左)和新冠肺炎(右)没有病例(来源: Kaggle
首先,了解区分两个类有多容易是有好处的——这可以给我们一些贝叶斯分类器错误率的估计。根据这个来源,人类水平的精确度可以估计为 0.97(发现的病毒病例),召回率为 0.7(100 个阴性诊断的人中有 30 个实际被感染)。此外,在数据集描述中,有一个到存储库的链接,该存储库具有一个 F1 分数为 0.85 的模型。
当我们设计这个模型时,我们应该考虑到错过新冠肺炎案例的所有严重性。因此,我们应该密切关注召回度量和第二类错误。更简单地说,当我们的模型预测假阳性时,最好说“对不起,你实际上是健康的”,而不是让感染者照常进行。
数据
我们有 349 个阳性样本和 397 个阴性样本。幸运的是,这个数据集没有偏向任何一个类。所有的图像都有不同的形状,这意味着重塑的必要性。因为我们有一个小的数据集,我们将使用一个验证集作为测试集。但是,我们不会设置种子,这将允许我们在每次重新运行笔记本电脑时获得不同的数据子集,因此它将提供更可靠的性能评估,并保存数据用于培训。在这种情况下,首先将在验证集上调整超参数,但在此之后,我们重新分割数据,在新分割的训练集中重新训练模型,并在看不见的(在此运行中)验证集上进行评估。这样一来,我们的验证集将不会正式成为测试集,因为我们的模型已经在不同的运行中以某种方式(以较小的方式)暴露给它了。但这可能是我们对如此大量的数据所能做的最好的事情了。
准备
让我们从定义超参数开始,稍后我们将对其进行调整:
EPOCHS = 30
BATCH_SIZE = 64
OPTIMIZER = tf.keras.optimizers.Adam(learning_rate=0.01)
img_height, img_width = 248, 248
我们的图像存储在两个文件夹中,每个班级一个。我们将处理 64 个图像块中的数据,我们将把我们的图像重塑成 248x248px 像素的尺寸,因为它们都有不同的形状。我们将使用学习率为 0.01 的 Adam 优化器。在我们的实验中,历元的数量将会改变。
首先,我们需要建立一种将数据输入模型的方法。为此,我们将使用跟随发电机的。由于我们没有用于培训和验证的单独文件夹,我们将让 Keras 处理此事:
train_datagen = ImageDataGenerator(
rescale=1./255,
validation_split=0.2)train_generator = train_datagen.flow_from_directory(
DIR,
target_size=(img_height, img_width),
batch_size=BATCH_SIZE,
class_mode='binary',
color_mode="grayscale",
subset='training')validation_generator = train_datagen.flow_from_directory(
DIR,
target_size=(img_height, img_width),
batch_size=BATCH_SIZE,
class_mode='binary',
color_mode="grayscale",
subset='validation')
模型
现在,让我们定义并拟合一些基本模型——三个卷积层,每个卷积层之后是最大池,之后是密集层,用于生成诊断。由于这是一个二元分类问题,我们将使用 sigmoid 作为输出的激活函数。
def create_model():
model = Sequential([
Conv2D(128, 4, padding='same', activation='relu', input_shape=(img_height, img_width, 1)),
MaxPooling2D(),
Conv2D(64, 8, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(32, 16, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(), #the curve!
Dense(128, activation='relu'),
Dropout(0.3),
Dense(1, activation='sigmoid')
])
model.compile(optimizer=OPTIMIZER,
loss='binary_crossentropy',
metrics=['accuracy', 'Precision', 'Recall'])
return modeles = EarlyStopping(monitor='val_loss', mode='min',
verbose=1,
patience=7, restore_best_weights=True)hist = model.fit_generator(
train_generator,
steps_per_epoch=train_generator.samples // BATCH_SIZE,
validation_data=validation_generator,
validation_steps=validation_generator.samples // BATCH_SIZE,
epochs=EPOCHS,
verbose=1,
callbacks=[es])
我们可以看到,即使是基本模型也仅在几个时期内就达到了相当好的性能。然而,在医疗保健这样重要的领域,这样的表现肯定是不够的。此外,由于我们没有测试集,我们希望有一个健壮的模型,在每次重新运行后都能给出接近的性能——否则,我们可以假设过度适合验证集。
我们可以看到过度拟合很快就发生了——在纪元 5 之后。为了克服它,让我们添加一些数据增强(你可以在这里了解每个参数的作用):
train_datagen = ImageDataGenerator(
horizontal_flip=True,
rotation_range=5,
width_shift_range=0.05,
height_shift_range=0.05,
shear_range=0.05,
zoom_range=0.05,
rescale=1./255,
validation_split=0.2)
即使使用轻微的数据扩充也可能显著提高模型的概化能力!
最初,我们有 598 张图像用于训练,148 张图像用于验证。在引入数据扩充之后,我们现在具有形式上无限数量的样本(因为每个图像可以被无限扩充,例如旋转 1、2、3 度),但是我们在这里实际感兴趣的是获得更鲁棒的模型,该模型将能够做出正确的诊断,尽管图像被轻微旋转或移位。
不幸的是,我们没有得到显著的改善,我们的模型在 10-15 个时期后仍然过拟合——我们可以看到,训练损失开始减少,而验证损失开始增加。另一个问题是,由于我们的验证损失从一开始就很低,我们可以假设我们只是获得了良好的初始参数,因此,我们的模型并不稳健(记住,由于我们没有测试集,我们希望用新的分割重新评估我们的模型)。如果我们检查模型摘要,我们将看到我们的模型有 4,987,361 个参数——对于这样一个小数据集来说,这是一个巨大的数字。让我们通过添加更多具有 max-pooling 的卷积层来减少它们(我们还将添加几个密集层,以查看这是否会提高性能):
def create_model():
model = Sequential([
Conv2D(16, 1, padding='same', activation='relu', input_shape=(img_height, img_width, 1)),
MaxPooling2D(),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 5, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 5, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 5, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.4),
Dense(64, activation='relu'),
Dropout(0.5),
Dense(8, activation='relu'),
Dropout(0.3),
Dense(1, activation='sigmoid')
])model.compile(optimizer=OPTIMIZER,
loss='binary_crossentropy',
metrics=['accuracy', 'Precision', 'Recall'])
return model
现在我们的模型有 671,185 个参数,数量明显更少。
但是,如果我们尝试训练我们的模型,我们将看到下一步。我们的模型开始过于“悲观”,并预测所有患者的 COVID。看来我们把模型做得太简单了。
让我们将结构简化如下:
def create_model():
model = Sequential([
Conv2D(16, 1, padding='same', activation='relu', input_shape=(img_height, img_width, 1)),
MaxPooling2D(),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 5, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 5, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.4),
Dense(64, activation='relu'),
Dropout(0.5),
Dense(8, activation='relu'),
Dropout(0.3),
Dense(1, activation='sigmoid')
])
model.compile(optimizer=OPTIMIZER,
loss='binary_crossentropy',
metrics=['accuracy', 'Precision', 'Recall'])
return model
这个模型有 2,010,513 个参数——比“不够复杂”的模型多几倍,但比“太复杂”的模型少几倍。因此,该模型在计算上更便宜且更容易训练。
现在我们开始看到相当好的结果。在训练期间,该模型经历了“对每个人都预测为正面”的阶段,但是克服了它并回到正确的预测。在大约 40 个时期之后,它仍然开始过度拟合(并且我们在我们的数据的每个片段中看到相同的图片),因此,我们将让我们的模型训练 40 个时期,并在之后评估它。
结果
决赛成绩
注意验证和训练集指标之间的差距——这是正常的,并且正在发生,因为我们在预测过程中没有应用丢弃,这为模型提供了全部潜力。
我们观察到模型没有过度拟合,因为验证损失比训练好。然而,如果我们添加额外的神经元、层或过滤器,模型将开始表现不佳,因此我们可以得出结论,我们在模型中没有可移除的偏差。
我们可以使用下一个脚本生成最终报告:
y_pred = (model.predict_generator(validation_generator) > 0.5).astype(int)
y_true = validation_generator.classes
for name, value **in** zip(model.metrics_names, model.evaluate_generator(validation_generator)):
print(f'**{**name**}**: **{**value**}**')
print(f'F1 score: **{**sklearn.metrics.f1_score(y_true, y_pred)**}**')pd.DataFrame(sklearn.metrics.confusion_matrix(y_true, y_pred),
columns=['pred no covid', 'pred covid'],
index=['true no covid', 'true covid'])
这将为我们提供:
loss: 0.5895
accuracy: 0.7702
Precision: 0.8358
Recall: 0.7088
F1 score: 0.4625
pred no covid | pred covid
true no covid 35 | 34
true covid 45 | 34
由于我们没有设定种子,性能可能会略有不同,但准确性在 70–80%之间。我们的模型远非完美——它往往有假阴性问题(与可接受的误差相反——假阳性,正如我们在开始时定义的那样)。
这种模型可以用作预诊断和优先化患者的助手。我们应该记住,我们的模型会给出假阳性和假阴性,因此我们不应该仅仅根据它来做决定。然而,我们可以优先对模型预测到病毒的患者进行医生调查。
结论
我们能够通过从零开始训练模型来取得相当好的结果。由于训练集大小只有大约 600 幅图像,因此该模型的可推广性有限。此外,有可能包括其他类似肺炎的疾病的图像,并看看是否有可能建立一个模型来正确区分它们。这项任务可能会非常困难,我们只需要两个类别——健康人和冠状病毒/其他疾病,因为仅通过 CT 扫描区分肺炎/冠状病毒可能非常困难。
如何制作一个更好的模型 —我们可以采用一个能够诊断类似疾病的预训练模型(或自己对其进行预训练),并对新冠肺炎数据集应用迁移学习。根据我接触过的几位医生的专业知识,肺炎患者的 CT 肺部扫描可能与冠状病毒患者的 CT 扫描非常接近,因此,可以使用这样的数据/模型。我们还可以添加一个辅助输入,比如温度,如果这些数据可用的话。
完整的代码可以在这里找到。数据集可以在这里找到。
注意安全,感谢阅读!
数据科学家能代替 DJ 吗?使用 Python 操作 Spotify
原文:https://towardsdatascience.com/can-a-data-scientist-replace-a-dj-spotify-manipulation-with-python-fbbd4a45ffd5?source=collection_archive---------16-----------------------
使用 Spotify 的 API 创建和调整您自己的播放列表
“…一个美丽的旅程,开始是为了调查音乐背后潜在的统计“证据”,最终发现(对于一个数据科学家来说)在方程式背后也有“音乐……”
诺贝特·布杜茨基在 Unsplash 上的照片
数据科学非常庞大,并不断扩展到新的行业,提供了大量有价值的(主要是企业)应用。音乐行业就是其中之一。如果我们像对待一个“黑盒”一样对待这些应用程序,我们会观察到一个输入( 数据 )和一个输出( 产品 )。这个项目旨在用 Python 操作 Spotify 音乐数据,有两个范围:
✔️证明了 API(应用编程接口)的存在是非常重要的,在馈送算法方面具有额外的精细 数据 。
✔️展示了简单的统计数据(当正确应用时)如何编码日常行为,将它们分解成基本元素,并在此基础上构建有价值的 产品 。
概念
我们将建立一个假设的场景。最近,我作为一名数据科学家工作的数据公司记录了他们的青年营销部门的显著利润,正因为如此,它决定用一个聚会来奖励其年轻客户。在没有 DJ 的情况下,我的主管让我负责音乐,让派对持续到早上!她给了我一些公共关系部门已经创建好的 Spotify 播放列表,以便检查它们并创建最终的播放列表。一般来说,对现代音乐趋势的漠视让我想到了一个微妙的选择:
使用 Python 访问所有播放列表,提取每首歌曲的每一个音频特征,对它们进行统计推理,并将最适合(我们聚会)的歌曲打包成最终播放列表,如何?当然,有一个技术性的问题:我不会听到他们中任何一个人的任何声音!
为了更好地交流结果,提出了一些假设:
1:我的个人 Spotify 播放列表代表公司给我的播放列表。
2:该党的目标群体是 18 至 30 岁的年轻人,这意味着…跳舞!然而,他们中的许多人可能会有家人陪同,也就是说,一小部分客人会更好地欣赏欢快的音乐。
3:在 Spotify 为其开发者提供的音频功能中,仅考虑了danceability
、energy
、tempo
、loudness
、&、valence
(见第 2 节)。这是因为,在我看来,它们能更好地表达一首曲目是否适合一场舞会。
4:有两种方法可以改善选择的播放列表;分别移除或添加被视为“坏”或“好”的轨道(涉及一个或多个音频特征)。为了扩大最终的播放列表,我只采用了后者。
作案手法
为了完成我们的使命,必须遵循以下路线图:
- 设置环境来运行代码。
- 向 Spotify API 发出请求,获取所有相关的音乐数据并提供简要说明。
- 使用 Numpy、Pandas &多个额外的 Python 库执行 EDA (探索性数据分析),以数字和视觉方式探索候选播放列表。
- 选择—使用几个统计技术优化最合适的播放列表。
1.建立
在这一节中,我们将设置所需的环境,以便应用分析技术。如果您已经准备了下面列出的任何部分,您可以分别跳过它们。
- 申请一个 Spotify 开发者账号,创建一个 app。[ 在这个过程中,您将创建一个客户端 ID,并为您的应用程序提供一个客户端密码。
- 安装JupyterNotebook——一个开源网络应用程序,用于创建/共享包含实时代码、公式、可视化和叙述性文本的文档。你可以在这里按照步骤进行。
- 安装spot ipy——一个用于访问 Spotify Web API & 请求的轻量级 Python 库——一个用于处理 API 的 Python 模块。您可以使用 CLI(命令行界面)或 Jupyter 笔记本来运行以下命令:
install.py
- 导入必要的库:
import.py
- 执行授权代码流。【我写的一个分步指南在GitHub上有;照着做,你就会没事的。
授权. py
⚠️请注意,您可以选择通过相应地设置环境变量来临时提供凭据,而不是直接通过笔记本来声明凭据:
set_env_var.py
2.数据解释和获取
Spotify 为其开发者提供了许多描述音轨特征的音频功能(参见此处了解音频功能对象的更全面的解释)。下面我列出了我们将要使用的特性,以及一个简短的解释:
Valence
: [0.0 -1.0]描述轨道听起来有多“积极”。高价意味着更积极的声音(如愉快、欣快等)。Loudness
: [-60.0 - 0db]描述音轨的整体响度,或者说是声音的质量,它是与体力(振幅)相关的主要心理因素。Tempo
:以 BPM(每分钟节拍数)描述轨道的整体估计速度,直接从平均节拍时间长度得出。Energy
:【0.0-1.0】描述活动和强度的感知度量。高能量的轨道感觉很快,很响,很吵。Danceability
:【0.0-1.0】根据音乐元素(速度、稳定性、节拍强度等)的组合,描述轨道是否适合跳舞。较低的值意味着适合跳舞的轨道较少。
数据获取部分分 3 步完成:( a )访问用户播放列表,( b )获取每个播放列表的曲目,以及(c)获取每个曲目的音频特征。对于每一步,我都创建了一个函数,它实现了相应的 Spotipy 方法。
(a)访问用户的播放列表
fetch_plst.py
该函数返回一个数据帧,包含用户的播放列表'id
、name
和曲目数量#tracks
。显然,有 4 个候选播放列表:
playlists
数据帧
(b)获取播放列表的曲目
fetch_trcs.py
这个函数将playlist_id
作为一个参数,并返回一个数据帧,包括每个音轨的track_id
和track_name
。我们不直接调用它,而是在下面的函数中使用它。
(c)提取音轨的音频特征
fetch_aud_ftrs.py
给定playlist_id
作为参数,该函数返回每个音轨的track_id
、name
和音频特征(danceability
、energy
、tempo
、loudness
、valence
)。因此,对于 4 个播放列表中的每一个,我们都创建了相应音频特征的数据帧:
aud_ftrs.py
df_dinner
数据帧样本
我们只是通过纯粹的编码获得了所有必要的数据,仅仅依靠 API 的力量!让我们看一下分析的主要部分。
3.电子设计自动化(Electronic Design Automation)
在减少杂乱的脉络中,我这里不包括数据可视化代码,但是在 GitHubrepo上有。
首先,我们在一个单独的情节中描绘了所有播放列表的音频特征,以便容易地察觉哪个(些)最适合聚会。
音频功能水平条形图
显然, Party 和 Pop 播放列表取代了其他两个,从整体上考虑了这些特性。仔细观察这两者,我们可以更好地了解哪一个占优势…
df_party
& df_pop
横条图
除了danceability
特性,其余都是针对党播放列表的较高。这意味着这是我们必须选择和构建的一个,以便完善最终的播放列表。
4.播放列表优化
主要范围是尽可能增加方播放列表的音频功能。但是,增加一个功能可能会减少另一个功能,因此我们必须优先考虑它们。个人感觉按照假设#2,danceability
( 少年)应该是首要特征,其次才是valence
( 家庭成员)。
变量是定量的,同时也属于测量的比例尺度。因此,盒须图可以有效地描述每个特征的个体分布。这样的图和描述性统计表(通过pandas.DataFrame.describe
方法)一起,可能会给我们提供一个很好的视觉直觉,告诉我们属于每个特定四分位数的值的比例。
下面详细介绍了原始的df_party
数据框架,突出显示了danceability
和valence
平均值、第二(中间)和第三四分位数:
df _ 交易方描述性统计&箱线图
垂直的黄线是中间值,而▴符号象征着中间值。我们通常的目标是将每个特性的分布尽可能向右“推”,也就是说,沿着玩家的轨迹增加它们,以获得更好的“聚会”体验!假设#4,我们添加来自df_pop
(第二个入围播放列表)的曲目,每次寻找机会:
- 要么向右移动平均值(增加平均音频特征)
- 或者将中间值移到平均值的右边(确保至少 50%的歌曲高于平均值)
- 或者两者都有
方法一
一个好的起点是从df_pop
中抽取一个样本,并将其添加到主样本(df_party
)中,除了它不会是随机的。通过利用pandas.DataFrame.sample()
函数和weights
参数,我们可以预先配置danceability
值越大,越有可能对相应的行进行采样。这种方法产生的数据帧是df_party_exp_I
( exp 代表 expanded )。
样本 _I.py
df_party_exp_I 描述性统计&箱线图
- 主音频特性
danceability
增加;平均值上升了近 0.5,分布也略有优化。中位数和第三(上)四分位数已经向右移动,分别从 68.20 移动到 69.30,从 77.20 移动到 78.90。 - 然而,
valence
特征减少了 0.61,并且没有一个四分位数向右移动。考虑到这一点,我们应该寻找进一步优化的机会。
方法二
这一次,我们将实现 NumPy 布尔索引,并过滤 Pop 播放列表,只返回符合我们指定标准的行。特别是我们将danceability
和valence
的特性分别设置在党播放列表的各自均值之上,分别为 69.55 和 51.89(参考笔记本)。
样本 _II.py
df_party_exp_II 描述性统计和箱线图
danceability
增加了更多。这次均值涨了差不多 2.17!随着中值和上四分位数向右移动,沿该特征的音轨分布也被优化,这实质上意味着至少 50%的播放列表高于主要声学特征的“新的”较高平均值(71.71)。- 然而,
valence
特性下降了 4.21,第二和第三四分位数仍然高于平均值。
方法三
一个特性的优化并不一定意味着其他特性都是一样的。为了改善这个缺点,我们将引入一个方程,其变量是声学特征,参数是我们分配给它们的权重。由于我们非常重视danceability
的特性,因此相应的权重应该更高。我的拆分如下:
得分=(可跳舞性* 30) +(能量* 20) +(速度* 20) +(响度* 10) +(价数* 20)
我们为播放列表的每一首曲目计算这个分数(创建一个新列score
),然后计算各自的描述性统计数据。这样,我们可以更好地评估丰富df_party
的每个动作,同时在每个特性上实现更均匀的(根据权重)优化。
简而言之,df_party
、df_party_exp_I
、&、df_party_exp_II
分别表示score
为 7355、7215、7416。显然,尽管方法 I 带给我们比原始播放列表更好的danceability
,但它恶化了派对的整体体验(平均值score
从 7355 下降到 7215)。就第二种方法而言,平均值score
上升了将近 62 分。然而,我们可以永远超越这些方法…
这一次,通过使用新引入的score
列,我们将过滤df_pop
数据帧,并获取注意到比df_party
平均值更高的score
的行。从而,增加后者!
sample_III.py
df_party_exp_III 描述性统计&箱线图
事实上,这一次:
danceability
特征上升了近 1.17,valence
上升了 4.06 ( 均值右移)- 两种分布都得到了改善(中值移至平均值的右侧)
score
注意到了 122.3 的数值,这是目前为止最好的!(在上下文中意味着更高的潜力,播放列表在加权音频特征中更加一致)
作为健全性检查,我们应该一次描绘和比较所有的盒状图——这可能看起来有点拥挤。幸运的是,变量的性质(见上文)允许使用 KDE(内核密度图)。
KDE 地块
现在,越来越清楚的是,方法 III (绿色分配)是最好的,因为它实现了更高的右移。
最后,我们最终得到的数据帧(df_party_exp_III
)包含了最终的音轨。唯一悬而未决的行动是将其转换成一个真正的播放列表。下面,第一个函数创建最终的播放列表,参数是它的名字(熊猫…还有什么?)和一段描述。另一个是从数据帧迁移磁道。请注意,授权流将再次运行,这一次使用不同的范围(playlist-modify-public
)。你只需再次跟随向导即可。
create_plst.py
enrich_plst.py
create_plst.py
播放列表数据帧
瞧啊!
作者照片
结论
迄今为止,我们已经走了很长的路;我们处理了数百首曲目,检查了它们的音频特征,最终选择了最适合派对的曲目,只使用了 Python 和。这样,我们设法完成了最初提出的任务:
✔️:我们展示了简单的(描述性的)统计和编码——当适当结合时——是如何计算出像这样耗时的活动的。
✔️:我们“尝到了”请求一个可用 API 的重要性,以便提取有意义的数据。
回到题目的问题,几乎不可能(至少目前)很自信地回答这个问题。无论我们是否从 DJ 或数据科学家的角度“深入”音乐现实,(本质上的意思是)无论工作是在甲板上还是在桌子上完成,无论是关于调音乐器还是只是…解方程,当然没有人会反对前者。更别说去打扰这样一个时刻的壮丽…
由 Jamakassi 在 Unsplash 拍摄的照片
但是,就精确度、灵活性和对大量音乐数据集的彻底处理而言,后者可以通过几行代码指导计算机体面地执行任务。也就是说,有一件事是理所当然的:
数据科学已经找到了另一个扩展和繁荣的“利基”,这意味着统计数据背后确实有“音乐”,就像节拍背后有数学一样…
感谢您的阅读&祝您度过愉快的一周!Jupyter 笔记本准备立即运行。如果有任何问题,请在下面留言。无论如何…
克隆 repo ,运行代码……让Pandas
摇滚起来!
机器可以进行性别分类吗?
原文:https://towardsdatascience.com/can-a-machine-classify-genders-3119d6e39377?source=collection_archive---------28-----------------------
照片由艾丽莎·斯蒂文森在 Unsplash 上拍摄
使用 matplotlib 探索美国 100 年的名字,并建立一个机器学习模型来从名字中分类性别。
前言
我们的名字并不总是定义我们,但它们确实给了我们一种认同感。给我们自己贴上一系列字母和单词的标签给我们的自我意识提供了一种结构,并锚定了我们在这个世界上的存在。
“他们怎么称呼你并不重要,重要的是你如何回应。”—厕所场地
动机
不知何故(和非常奇怪的),通过我们的生活经历,我们知道,如果一个人名叫“ XYZ ,那么他或她很可能是一个“小的像这个或有一点点“那个”。
在将一个人的个性映射到一个名字的过程中,我们可能正确,也可能不正确(在我的例子中,大部分是不正确的),但我想知道机器是否能做得比我更好。
作为一个简单的试金石,我认为性别是一个人的身份之一。激励性的问题是—
你能从一个人的名字预测他或她的性别吗?
出奇的简单,不是吗?然而,这并不像看起来那么容易。文化和语言的差异使得这项任务变得困难。
这促使我建立了一个基本的机器学习模型,看看它是否能比我更好地预测一个人的性别。
完整的代码可以在我的 GitHub 资源库中找到。
数据源
那么,机器从哪里可以获得大量的生活经验呢?当然是通过历史上精心整理的数据!一个这样的来源是美国婴儿名字目录,可以在 data.gov 买到。
这一数据由社会保障管理局免费提供和公布。它包含从 1919 年到 2018 年每个州的社会保障卡应用程序中的名字及其出现频率。
数据预处理
我下载了这个数据,它是每个州的文本文件的集合。每个文本文件包含在给定年份中出现至少 5 次的所有名字。我稍微清理了一下数据,最终的串联数据集占用了将近 320 MB 的内存!
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6028151 entries, 0 to 28019
Data columns (total 6 columns):
# Column Dtype
--- ------ -----
0 yob int64
1 name object
2 gender object
3 number int64
4 state object
5 chk int64
dtypes: int64(3), object(3)
memory usage: 321.9+ MB
(注:此处为每个姓名指定的性别与文本文件中的数据一致。可下载的 zip 文件中还有一个有用的自述文件,它解释了数据集的某些特性)
探索性数据分析
我想探索一下数据,并可视化一些汇总统计数据。
1)过去 100 年中最常见和最不常见的 100 个名字
每年都有一些父母喜欢的名字,而单词云有助于形象地表现这种现象。
过去 100 年中最常见的 100 个名字(图片来源:作者)
举个例子,女孩通常被称为伊丽莎白或凯瑟琳或玛格丽特 ( 仅举几个)而詹姆斯或威廉或约翰一直是男孩的流行名字。除了常见的名字,了解一点不常见的名字也很有趣。
过去 100 年中最不常见的 100 个名字(图片来源:作者)
一些真正有趣且不常见的女孩名字是拜林、塞尔达和德马尼,而男孩的名字是罗德里乌斯、贾马尔和凯尔冯!
2)2018 年前五名
2018 年的前 5 名是女孩中的艾玛、奥利维亚、艾娃、伊莎贝拉和索菲亚。利亚姆、诺亚、威廉、詹姆斯和奥利弗是排名最高的男孩名。
2018 年前 5 名(图片鸣谢:作者)
3)2018 年排名靠前的名字的历史
为了了解这些名字过去的受欢迎程度,我绘制了 2018 年前 5 名名字的时间序列。有趣的是,艾玛和奥利维亚一直是历史上流行的女孩名字,而艾娃、伊莎贝尔和索菲亚在 20 世纪 80 年代后开始流行。
2018 年排名靠前的女性名字的历史受欢迎程度(图片来源:作者)
在男孩的名字中也可以观察到类似的趋势。詹姆斯和威廉这些年来一直很受欢迎,位列前 10 名。利亚姆、诺亚和奥利弗在 1980 年后越来越受欢迎。
2018 年排名靠前的男性名字的历史受欢迎程度(图片来源:作者)
4)可视化 2018 年各州的姓名流行度
我还想可视化 2018 年排名前 10 名的受欢迎程度,一个简单的方法是创建一个排名的合唱团。
(这也给了我玩 Imageio 的机会,一个创建 gif 的简单库。这个 岗位 由 崔永 博士担任真是大用
2018 年十大女名人气(图片鸣谢:作者)
2018 年十大男性名字人气(图片鸣谢:作者)
5)名称的长度
我想知道男孩的名字是否比女孩短。所以我把名字长度绘制成直方图。似乎女孩的名字比男孩稍长,大多数名字大约有 5 个字母长。
过去 100 年的名称长度(图片来源:作者)
6)名字的最后一个字母是元音
我有一种奇怪的感觉,女孩的名字往往以元音结尾,而男孩却没有。为了测试这一点,我绘制了一个饼图。我的假设是正确的。女孩的名字大多以元音结尾,尤其是“a”和“e ”,而男孩的名字大多以“e”或“o”结尾。
以元音结尾的姓名百分比(图片来源:作者)
从名字预测性别
好了,现在让我们开始有趣的东西。机器能从名字预测性别吗?为了帮助它,我根据从数据探索中获得的见解设计了一些功能。
1)特征工程
将名称转换成 ASCII 值
名字是专有名词,我真的不想遵循语义的方法。相反,我将名称中的每个字母转换成它的 ASCII 值,并计算每个名称的平均 ASCII 值。
ascii_mean('Albert')
>>> 100.33333333333333ascii_mean('Amelia')
>>> 97.5
名称的长度
我创建了一个包含每个名字长度的新特性,即每个名字的字母总数。
元音和辅音的数量
我假设,一般来说,女孩的名字中有更多的元音,而男孩有更多的辅音。为了量化这个假设,我创建了两个额外的特征——一个名字中元音和辅音的数量
姓名的最后一个字母
假设是女孩的名字比男孩的名字更可能以元音结尾。为了量化这种信念,我创建了一个具有二进制值的特性——如果一个名字的最后一个字母是元音字母,则为 1,否则为 0。
有了这 4 个特征,我想让我的二元分类器把名字分为“男”类或“女”类。
(这是一个纯粹基于数据可用性的 2 类问题。数据集仅识别了这两种性别)
2)从名字中分类性别
我建立了两个非常简单的模型——一个逻辑回归分类器和一个支持向量分类器。我按照 70:30 的比例将数据分为训练集(24245 个名字)和测试集(10392 个名字)。
我感兴趣的是构建一个没有过多修饰、没有过多超参数调整的模型。所以我完全避免创建验证集。其目的是做有趣的,不严肃的预测!
逻辑回归分类器
逻辑回归模型具有 67.8%的灵敏度(或回忆)和大约 68.3%的特异性,这相对好于随机预测。预测女性的准确率为 76%,预测男性的准确率为 58%。
这意味着,尽管该模型可以在 68%的情况下正确预测性别,但它在预测女性时比男性犯的错误要少得多。
支持向量分类器
具有线性核的 SVC 给出了比逻辑回归模型更低的灵敏度(64.5%)。特异性为 72.5%,优于以前的模型。预测女性的准确率接近 78%,预测男性的准确率为 57%。
换句话说,SVC 可以正确地预测一个名字属于男性,比预测一个名字属于女性要好得多。但是,与预测男性相比,预测女性的错误要少得多。
我对机器
图片提供:【https://gph.is/g/aQQ9R9V
现在真正的考验来了——我能比我建造的机器更好地预测性别吗??
为了找到答案,我从数据集中随机选择了 10 个名字(当然掩盖了他们的性别),并让我自己与训练过的机器进行对抗。
游戏结果如下所示—
玩家的表现可以通过一系列问题来理解—
Q1:当名字实际上属于女性的时候,玩家正确 ( 专业术语:回忆或者敏感 ) ?
我:83%的时间
机器(两者):83%的时间
**Q2:当玩家预测一个名字为女性时,玩家正确的几率有多大**专业术语:精度 ) ?
我:100%的时间
机器(两者):71%的时间
Q3:当名字实际上属于男性的时候,玩家正确 ( 用专业术语来说:回忆或者敏感 ) ?
我:100%的时间
机器(两者):50%的时间
Q4:当玩家预测一个名字为男性时,玩家正确 ( 用专业术语来说:精度 ) 的几率有多大?
我:80%的时间
机器(两者):67%的时间
谁赢了??你决定吧。
原来如此!
对我来说,这是一个快速而有趣的项目,让我学到了许多有趣的概念。我希望你喜欢它,并欢迎任何改进或调整模型的意见!
再见!
一个神经网络可以训练其他网络吗?
原文:https://towardsdatascience.com/can-a-neural-network-train-other-networks-cf371be516c6?source=collection_archive---------18-----------------------
知识提炼导论
如果你曾经使用过神经网络来解决一个复杂的问题,你就会知道它们的规模可能是巨大的,包含数百万个参数。例如,著名的伯特模型大约有 1.1 亿英镑。
为了说明这一点,这是 NLP 中最常见架构的参数数量,正如最近由内森·贝纳奇和伊恩·霍加斯撰写的《2020 年人工智能报告的状态》中所总结的。
给定架构中的参数数量。资料来源:【2020 年人工智能状况报告作者内森·贝纳奇和伊恩·霍加斯
在 Kaggle 竞赛中,获胜者模型通常是由几个预测器组成的集合。虽然它们在精确度上可以大幅度击败简单模型,但它们巨大的计算成本使它们在实践中完全无法使用。
有什么方法可以在不扩展硬件的情况下,利用这些强大而庞大的模型来训练最先进的模型?
目前,在保持预测性能的同时压缩神经网络有三种主要方法:
- 权重修剪 ,
- 量化 ,
- 和知识的升华。
在这篇文章中,我的目标是向你介绍知识提炼的基本原理,这是一个令人难以置信的令人兴奋的想法,建立在训练一个更小的网络来接近大网络的基础上。
什么是知识蒸馏?
让我们设想一个非常复杂的任务,比如对几千个类进行图像分类。通常情况下,你不能简单地使用 ResNet50 并期望它达到 99%的准确率。所以,你建立了一个模型集合,平衡了每个模型的缺陷。现在你有了一个庞大的模型,尽管它表现出色,但没有办法将其部署到生产中并在合理的时间内得到预测。
然而,该模型对看不见的数据进行了很好的概括,因此可以放心地相信它的预测。(我知道,情况可能不是这样,但现在让我们开始思想实验吧。)
如果我们使用来自庞大而笨重的模型的预测来训练一个更小的,所谓的学生模型来逼近大模型,会怎么样?
这实质上是知识的提炼,在 Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 的论文中介绍了这一点。
大致来说,这个过程如下。
- 训练一个执行和概括都非常好的大型模型。这就是所谓的教师模型。
- 利用你所有的数据,计算教师模型的预测。包含这些预测的总数据集被称为知识、,预测本身通常被称为软目标。这是知识提炼步骤。
- 利用之前获得的知识训练较小的网络,称为学生模型。
为了形象化这个过程,您可以考虑以下内容。
知识升华(图片由作者提供)
让我们稍微关注一下细节。知识是如何获得的?
在分类器模型中,类别概率由一个 softmax 层给出,将 逻辑 转换成概率:
在哪里
是由最后一层产生的逻辑。代替这些,使用稍微修改的版本:
其中 T 是一个称为温度的超参数。这些值被称为软目标。
如果 T 较大,则类概率“较软”,即它们之间的距离会更近。在极端情况下,当 T 接近无穷大时,
如果 T = 1 ,我们得到 softmax 函数。出于我们的目的,温度被设置为高于 1,因此命名为蒸馏。
Hinton、Vinyals 和 Dean 表明,一个经过提炼的模型可以和由 10 个大型模型组成的集合表现得一样好。
知识提取由 Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 撰写的论文在神经网络中提取知识中的一个语音识别问题
为什么不一开始就培养一个小网络呢?
你可能会问,为什么不从一开始就训练一个更小的网络呢?不是更容易吗?当然,但是它不一定会起作用。
经验证据表明,更多的参数导致更好的泛化和更快的收敛。例如,Sanjeev Arora、Nadav Cohen 和 Elad Hazan 在他们的论文《深度网络的优化:过度参数化的隐式加速》中对此进行了研究。
左图:单层网络与 4 层和 8 层线性网络。右图:使用张量流教程的 MNIST 分类的过度参数化与基线模型。来源:深度网络优化:过度参数化的隐式加速作者:Sanjeev Arora、Nadav Cohen 和 Elad Hazan
对于复杂的问题,简单的模型很难在给定的训练数据上进行很好的归纳。然而,我们拥有的不仅仅是训练数据:教师模型对所有可用数据的预测。
这对我们有两方面的好处。
首先,教师模型的知识可以教会学生模型如何通过训练数据集之外的可用预测进行归纳。回想一下,我们使用教师模型对所有可用数据的预测来训练学生模型,而不是原始的训练数据集。
第二,软目标提供了比类别标签更多的有用信息:表示两个类别是否相似 。例如,如果任务是对狗的品种进行分类,那么像“柴犬和秋田犬非常相似”这样的信息对于模型的泛化非常有价值。
左:秋田犬。右图:柴犬。来源:维基百科
迁移学习的区别
正如 Hinton et al. 所指出的,通过转移知识来压缩模型的最早尝试之一是重用经过训练的集合的某些层,正如 Cristian Bucilu、Rich Caruana 和 Alexandru Niculescu-Mizil 在他们 2006 年题为“模型压缩的论文中所做的那样。
用 Hinton 等人的话说,
“…我们倾向于用学习到的参数值来识别训练模型中的知识,这使得我们很难看到如何改变模型的形式,但保持相同的知识。对知识的一个更抽象的观点是,它是从输入向量到输出向量的一种习得性映射,这种观点将知识从任何特定的实例化中解放出来。”— 在神经网络中提取知识
因此,与迁移学习相反,知识提炼不直接使用学习到的权重。
使用决策树
如果您想进一步压缩模型,可以尝试使用更简单的模型,如决策树。虽然它们的表达能力不如神经网络,但它们的预测可以通过单独查看节点来解释。
这是由 Nicholas Frosst 和 Geoffrey Hinton 完成的,他们在论文中将神经网络提取为软决策树中对此进行了研究。
来源:将神经网络提取为软决策树
他们表明提取确实有一点帮助,尽管甚至更简单的神经网络也胜过它们。在 MNIST 数据集上,提取的决策树模型达到了 96.76%的测试准确率,这比基线 94.34%的模型有所提高。然而,一个简单的两层深度卷积网络仍然达到了 99.21%的准确率。因此,在性能和可解释性之间有一个权衡。
蒸馏伯特
到目前为止,我们只看到了理论结果,而没有看到实际例子。为了改变这一点,让我们考虑一下近年来最流行和最有用的模型之一:BERT。
最初发表在 Google 的 Jacob Devlin 等人的论文 BERT:用于语言理解的深度双向转换器的预训练中,它很快被广泛用于各种 NLP 任务,如文档检索或情感分析。这是一个真正的突破,推动了几个领域的技术发展。
然而,有一个问题。BERT 包含约 1.1 亿个参数,需要大量时间来训练。作者报告说,训练需要 4 天,在 4 个吊舱中使用 16 个 TPU 芯片。按照目前可用的 TPU pod 每小时价格计算,培训成本将在 10000 美元左右,还不包括碳排放等环境成本。
通过拥抱脸成功尝试了减少 BERT 的大小和计算成本。他们使用知识提炼来训练 DistilBERT,它的大小是原始模型的 60%,速度快 60%,并保持了 97%的语言理解能力。
蒸馏器的性能。来源:蒸馏伯特,伯特的蒸馏版本:更小、更快、更便宜、更轻作者:维克多·桑、弗拉达利·佩登、朱利安·肖蒙德、托马斯·沃尔夫
较小的架构需要更少的时间和计算资源:在 8 个 16GB V100 GPUs 上运行 90 小时。
如果你对更多细节感兴趣,你可以阅读原文 DistilBERT,一个 BERT 的蒸馏版本:更小,更快,更便宜,更轻,或者总结文章是其中一位作者写的。这是一个奇妙的阅读,所以我强烈建议你这样做!
[## 🏎更小,更快,更便宜,更轻:介绍伯特,伯特的精华版本
你可以在这里找到代码来重现呆伯特的训练以及呆伯特的预训练权重。
medium.com](https://medium.com/huggingface/distilbert-8cf3380435b5)
结论
知识提炼是压缩神经网络并使其适用于功能较弱的硬件的三种主要方法之一。
与权重剪枝和量化这两种强大的压缩方法不同,知识提取并不直接减少网络。相反,它使用原来的模型来训练一个更小的模型,叫做学生模型。由于教师模型甚至可以对未标记的数据进行预测,因此学生模型可以学习如何像教师一样进行归纳。
在这里,我们已经看到了两个关键的结果:最初的论文,介绍了这个想法,以及后续的,表明简单的模型,如决策树,可以用作学生模型。
如果您对该领域的更广泛概述感兴趣,我推荐下面这篇文章,它就发表在这里的《走向数据科学》:
[## 知识蒸馏——穿越时间的调查
通过这个博客,你将回顾知识蒸馏(KD)和六篇后续论文。
towardsdatascience.com](/knowledge-distillation-a-survey-through-time-187de05a278a)
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
[## 如何用量化加速和压缩神经网络
从浮点数到整数
towardsdatascience.com](/how-to-accelerate-and-compress-neural-networks-with-quantization-edfbbabb6af7) [## 你能移除 99%的神经网络而不损失准确性吗?
权重剪枝简介
towardsdatascience.com](/can-you-remove-99-of-a-neural-network-without-losing-accuracy-915b1fab873b)
AI 算法会有偏差吗?
原文:https://towardsdatascience.com/can-ai-algorithms-be-biased-6ab05f499ed6?source=collection_archive---------26-----------------------
定义、检测和避免偏见
人工智能算法越来越多地被用于广泛的领域,以做出影响我们日常生活的决策。例如,招聘、医疗保健、刑事司法、信用风险评分等。它不仅被私营企业使用,也被政府使用。
一般来说,使用人工智能或机器来做决定的一个好处是——它们可能是公正、客观的,可能不会像人类一样带有偏见,因此可能更“公平”。最近的一些研究表明,人工智能系统也可能有偏差。
公共图像数据库 Imagenet 最近删除了 60 万张图片,因为一个艺术项目揭露了其图片中的种族偏见。所有这些都导致了对人工智能偏见的认识增加,并提出了与许多人工智能系统的信任有关的基本问题。
什么是偏见?
在我们深入这个话题之前,定义偏见是很重要的。这是维基百科的一个定义
偏见是指对一个观点或事物的或不相称的重视,通常以一种狭隘、偏见或不公平的方式。**
已经有很多关于人类遭受的偏见的研究,诺贝尔奖获得者丹尼尔·卡内曼在他的优秀著作思考快与慢中谈到了人类直觉中的各种偏见
人类通常遭受的偏差的一个例子是— 确认偏差。它被定义为以一种确认或加强一个人已有信念的方式搜索、解释和回忆信息的倾向。虽然有人可能认为互联网的出现和我们可获得的信息(数据)的爆炸会让我们找到“真相”,但确认偏差是让人们选择性地解释信息并与他们已经相信的东西挂钩的因素。
确认偏差
人工智能偏差的案例研究
人工智能偏见的一个著名案例研究是美国法院用来评估被告成为惯犯的可能性的系统。对该软件的一项调查发现,虽然该系统是为最大化整体准确性而设计的,但非裔美国人的假阳性率是白种人的两倍。
另一个流行的案例研究是——亚马逊的人工智能招聘工具。亚马逊开发了一个工具来帮助招聘,帮助筛选简历。它是根据亚马逊内部招聘决策的 10 年数据进行训练的。当发现这个工具更有可能选择男人而不是女人时,亚马逊后来决定废弃这个工具
偏差的数学定义
虽然到目前为止我们所回顾的都是好的,但是偏见和公平的定义在法律、社会科学和哲学中有着长期的争论。很难就这些的确切定义达成共识。在人工智能模型的背景下,更棘手的是我们需要用数学术语来定义它,因为人工智能系统只理解数字和数学运算。
区分偏差和随机误差很重要。人工智能系统犯错并不罕见,这是因为它们是复杂现实世界的简化。但偏差是系统误差,它以某种可预测的方式发生。偏见可能会导致一个人对个人或团体做出不公平的行为。
一些人试图通过平衡不同群体(如性别、种族等)预测中的假阳性和假阴性率来定义人工智能系统中不存在偏差。但是这个定义不够普遍,因为偏见可能以各种形式表现出来。坦率地说,这仍然是一个开放的研究领域。
偏见是如何蔓延到人工智能系统中的?
一个自然的问题是,人工智能系统是如何产生偏差的?即使它们没有被明确地编纂成有偏见的,它们能有偏见吗?以下是人工智能系统可能出现偏差的一些可能原因:
- 属性选择:如果在算法中使用年龄、性别、种族等属性,算法可以学习这些属性与目标之间的关系,这可能会导致算法出现偏差。
- 数据收集/采样:很多时候,数据收集或采样的方式可能会导致某个群体代表性过高或过低,从而导致偏见。波士顿市政当局有一个关于街道颠簸应用的著名案例研究,该研究旨在检测路面坑洼,表明较富裕的社区有更多颠簸,只是因为生活在富裕社区的人更有可能使用该应用。
- 数据中的隐含偏差:大多数人工智能系统从提供给它们训练的数据中学习模式。很多时候,这些数据可能是由带有固有偏见的人生成的。如果是这种情况,最终的人工智能系统也会反映这些偏差,因为人工智能系统的好坏取决于训练它们的数据。我之前说的 Imagenet 事件就是这种类型的一个很好的例子。
- 优化指标:人工智能系统通常会训练最大化/最小化某个指标,例如整个数据的错误率。当人工智能系统忙于做这些事情时,不能保证它不会做任何我们人类认为“不公平”的事情。
怎样才能避免 AI 偏见?
虽然这仍然是一个开放的研究领域,但你可以采取以下步骤来减轻你的人工智能应用中的偏见:
- 使用有代表性的数据:尝试积极寻找数据中的偏差来源和/或数据收集和采样的方式。仔细研究数据是如何被注释的,以及人们注释数据的动机。
- 对模型进行审核:仔细检查你的模型的预测,比较和对比你的预测在不同子群体中的假阳性和假阴性率。受法律保护的子群体可能是一个很好的起点。
- 关注模型的可解释性:许多人工智能系统可能类似于黑匣子,对它们为什么做出某种预测的洞察力有限。有很多关于模型可解释性的研究工作正在进行——更好地理解为什么模型会做出某种预测可能有助于发现和消除偏差
- 第三方工具:有各种第三方工具可以帮助你在 AI 生命周期的不同阶段评估偏见。看看 IBM 的 AI Fairness 360 开源工具包的例子
- 雇佣多元化的团队:团队的多元化可能有助于在寻找偏见的途径时引入多元化的观点。
摘要
人工智能应用最近出现了惊人的增长。有一些真实的例子对人工智能系统做出的决定的公平性提出了质疑。重要的是处理偏见问题,以便人工智能系统继续享有组织和群众的信任。在这个领域有很多有前途的工作正在进行,让我们希望所有这些将使人工智能应用更加公平,让这个世界成为每个人生活的更好的地方。
人工智能如何帮助金融科技算法管理你的财务?
原文:https://towardsdatascience.com/can-ai-facilitate-fintech-algorithm-to-manage-your-finances-2c11a1afec74?source=collection_archive---------53-----------------------
“小心小开支。一个小漏洞能使一艘大船沉没。”——本杰明·富兰克林
Austin Distel 在 Unsplash 上拍摄的照片
根据 GoBanking Rules 2019 年的一项调查,约 70 %的美国人储蓄不足 1000 美元。调查还显示,甚至有 45 %的人根本没有存款或证券。这些数字是从一项调查中反映出来的,当时美国经济强劲,由于新冠肺炎疫情的高失业率,这一数字可能会增加。
人工智能(AI)和对金融领域的理解的一致新兴趋势,可以为努力优化其货币目标的个人创造机会。机器学习技术可以识别漏洞,并产生最大化个人财富的意识。有效地管理自己的收入和支出是走向财务自由的第一步。不幸的是,大多数个人甚至公司都在努力优化他们的财富管理,并经常在金融危机期间宣布破产。技术已经意识到这种新兴的需求,并通过有效设计的算法为个人和公司提供了改善其财务活动的空间。
正如俗话所说“小心小开支。一个小漏洞能使一艘大船沉没。
克里斯·里德在 Unsplash 上拍摄的照片
什么是 Fintech?
Fintech 是科技与金融领域的新兴合作产业。首要目标是创新和改进传统的财务方法。它应用于保险、银行、股票交易,甚至企业项目的风险分析和管理。最受欢迎的金融科技应用之一是移动银行和支付。这个选项允许个人以更方便和更快的速度进行金融交易。它被认为是个人使用第三多的移动应用程序。
根据 statista.com 的数据,截至 2020 年 2 月,北美约有 8775 家金融科技初创公司。这是从 2019 年起 大约 52%的增量 。技术和金融是最受欢迎的领域,因此两者之间的合作可以创造新的机会。在地理领域的采用中发挥主要作用的一些因素包括互联网可用性和金融科技公司对其网络安全的信任。
金融科技公司的各个类别包括:个人金融、华尔街、投资、借贷、房地产、加密和区块链以及支付选项。
福布斯 2019 金融科技公司资金分布【数据来源:Forbes 2019/Fintech】
该饼图显示了金融科技公司各个类别的资金分布情况。最高的大多偏向支付选项,加密货币最少。在积累资金方面,crypto 落后于的原因是因为(I)它是一个相对较新的概念,(ii)价格波动,(iii)政府管制对自由大规模渗透到主流交易中的障碍。支付专业的金融科技公司设计算法来监管现金流分析。房地产金融科技平台(fintech platforms)作为一个自动借贷平台,提供了识别房地产合格投资者的机会。投资 fintech 应用程序通过分析个人客户的财务目标和风险承受能力,提供资产管理方面的 rob-advisors。
人工智能在金融科技中的作用
照片由 Unsplash 上的 David Shares 拍摄
人工智能算法可以发挥预测作用,以改善个人或大公司的资产管理。它可以跟踪导致客户债务组合增加的显著和经常性支出。金融数据管理对于预测经济的未来至关重要。AI 算法可以通过智能编程处理这些大的金融数据,预测客户投资策略。这些数据也可以用来预测欺诈活动。
机器学习在财富管理中的应用
第一步
机器学习可以在优化投资组合选择中发挥关键作用。在量化投资组合管理中,人工智能可以调查驱动因素,如跨多样化投资组合的分析、历史数据、股权价值、风险管理和其他关键驱动因素。数学模型可以从这样的数据管理中发展出来。
第二步
风险管理是投资组合管理的一个重要因素,因此人工智能可以帮助识别多样化的股票并分配比例权重以最小化风险。
第三步
确定单个投资组合的时间表和风险水平。根据可用数据进行预测分析
第四步
改变变量,以确定能产生最佳 ROI(投资回报)的理想投资组合。
使用人工智能进行客户投资组合管理的示意原型
智能人工智能驱动的投资组合管理设计的定量算法相对复杂。网络安全方面也成为需要纳入设计的重要参数。但是,我们采用了一种方法来显示客户财富管理的拟议用户界面和示意流程图设计的简要概述。
移动或桌面用户界面(UI)是需要仔细设计的主要目标,以确保客户参与应用程序或平台。用户登录和密码加密是确保客户隐私和数据安全的一部分。
本杰明·罗宾·叶斯柏森在 Unsplash 上的照片
为了为你的客户获得满足他们期望的最佳投资组合,充分理解他们的期望是至关重要的。这通常包括一系列问卷调查,旨在更好地了解你的客户。这些问题可能包括一些细节,例如:你的客户的目标是长期投资(至少一年)还是短期投资(3 个月)。你的客户愿意投资的最大金额,风险承受能力,例如,如果客户的风险承受能力较低,更安全的选择如政府债券(是首选),或者对于更高的风险承受能力,投资者可以选择华尔街投资(高风险高回报)。需要理解风险回报概念,并且应该对算法进行编码,以最好地定制风险回报预期。
下面的 c++代码可以简要概述客户和金融科技平台之间关于投资组合管理的预期查询。
关于客户投资组合管理的基本查询的 C++代码
蒙特卡罗树搜索(MCTS) 是 AI 驱动的概率算法。它包括分析不同的选项,以找到一个比当前操作更优化的选项。MCTS 算法在其学习阶段(机器学习)评估备选策略,并确定它是否比以前或现在的交易提供更好的回报。这种技术已经应用于模拟游戏环境,但应用于金融领域时,可以提供更好的预测结果。
结论
回答题目上的第一个问题,是绝对的是的。人工智能在金融领域的集成可以持续显示出改进的性能。机器学习提供了对大量金融数据更快的评估和执行。与人工交互相比,它耗时相对较少,并且可以以更高的准确度处理大多数数据。金融科技初创公司表现出更快的增长率,这表明市场对该技术的需求正在上升。
参考文献
[1]帕特里克·舒费尔(2016)。驯服野兽:金融科技的科学定义。创新管理杂志。第 32-54 页
[2]梁家杰和宋(2018 年)。FinTech(金融科技):什么是 fintech,如何利用技术以 fin tech 的方式创造商业价值?。国际创新、管理与技术杂志, 9 (2),74–78。
[3]卡尔卡特拉,卡尔,W. A .,&拉奥,V. K. (2019)。稳定的加密货币-一阶原理。可在 SSRN 3402701 处获得。
[4]刘,刘春明,戴德思,2020 .量化交易中基于组合优化的长短期记忆网络股票预测。应用科学, 10 (2),437 页。
[5]法博齐,F.J 投资管理的理论与实践:资产配置、估价、投资组合构建和策略,第 2 版。;约翰·威利父子公司:美国新泽西州霍博肯,2011 年;第 198 卷,第 289-290 页。
[5]露西娅,R. J. (2012 年)。美国专利申请号 12/957,211 。
AI 能找到 ET 吗?
原文:https://towardsdatascience.com/can-ai-find-et-eb752c1737e5?source=collection_archive---------38-----------------------
人为因素是一个重大障碍。
图片作者:Merzmensch
2010 年 12 月。美国宇航局的紧急电话。关于一项可能颠覆我们对宇宙生命的所有概念的重大发现的新闻发布会。社交媒体上充斥着关于即将到来的不明飞行物和绿人的谣言:
美国宇航局将于美国东部时间 12 月 2 日周四下午 2 点举行新闻发布会,讨论一项天体生物学发现,该发现将影响对外星生命证据的搜寻。(来源)
数百万人盯着电视屏幕和直播。因此,美国国家航空航天局首先介绍了上个世纪最具革命性的科学发现。
“生命的定义刚刚扩大了”,美国宇航局科学任务理事会副主任埃德·魏勒说。“当我们继续努力寻找太阳系中的生命迹象时,我们必须更广泛、更多样化地思考,并考虑我们不了解的生命。”(来源)
GFAJ-1(来源:NASA)
这是他们的发现。菌株 GFAJ-1 ,γ原生菌。一种微生物。住在加州砷莫诺湖。在一个普通生物无法生存的湖中。
“我们知道一些微生物可以呼吸砷,但我们发现的是一种微生物正在做一些新的事情 — 用砷构建自身的一部分,”Felisa Wolfe-Simon 说,他是美国宇航局天体生物学研究员,在加利福尼亚州门洛帕克的美国地质调查局常驻,也是该研究小组的首席科学家。“如果地球上有什么东西能做出如此出人意料的事情,那么生命还能做什么我们还没见过的事情呢?”(来源)
[## “砷虫”的发现扩大了生命的定义
2010 年 12 月 2 日:美国国家航空航天局支持的研究人员发现了地球上第一个已知的微生物能够茁壮成长和…
science.nasa.gov](https://science.nasa.gov/science-news/science-at-nasa/2010/02dec_monolake)
很快,失望的声音似乎溢出了溪流。公众感到被愚弄了,因为他们没有看到双头外星人。其他科学家正试图揭穿这一发现。《石板》以“这篇论文本不该发表”为题总结了所有这些说法电影之火荒谬。”致命缺陷。
Wired 对批评进行了评估,并在争论中发现了许多不一致之处,其主要目标似乎是平息围绕这一发现的炒作。
因为核心信息仍未被听到:
生命的定义扩大了。
这确实意味着:我们以前对生命和生命友好环境的概念是狭隘的,只与我们知道的东西有关。科学保守主义,作为对投机和江湖骗子的防御措施,使科学对新方法视而不见。
回想一下,几个世纪前,学术界的同事嘲笑让·弗朗索瓦·商博良的断言,那些装饰性的古埃及图片和装饰品是书面语言,而不仅仅是一些仪式符号,这是众所周知的!
人工智能寻找外星生命?
十年后,我们有了新的问题。我们从事深度学习是为了科学需求:疾病检测(电晕任何人?),模式探测,现在——寻找外星生命形式。
但这是主要的障碍。
今天,我们生活在人工智能在许多科学和技术应用中的使用激增的时代,包括寻找外星智能(SETI)。然而,人类感知和决策仍然是任何数据分析或解释结果或结果的最后一环——加布里埃尔 G .德拉托雷在他的论文中写道:“人工智能会梦到非地球的技术签名?”
这就是问题所在。
甚至计算机也可能倾向于将形状识别为外星文明的证据[…]——然后人类可能会被欺骗而相信它们是真实的— 独立 写道。
加百利·g·德拉托雷和加的斯大学的其他科学家进行的一项研究证明了这种情况:
奥卡托尔,谷神星上的一个陨石坑有不寻常的形成和亮点,来源:美国宇航局
- Occator 上的神秘建筑被剪短给人类和 AI
- 人类探测到几何图形和正方形
- AI (训练正方形和三角形)找到三角形
- 在人工智能的结果展示给人类之后,他们倾向于像以前一样看到更多的三角形。他们现在受人工智能结果的影响。
这些实验表明了以下问题:
- 在特定数据库上训练的人工智能只检测与训练数据一致的模式(=重新认知)
- 人类受到高度影响;此外,他们更有可能相信人工智能的感知(=反馈偏差)
简而言之,如果我们使用人工智能来检测不寻常的模式和形成,我们不能依赖我们的人类感知。我们也不能依赖人工智能,如果它在人类准备的特定数据库中接受训练(这意味着识别已知模式)。
寻找其他外星生命形式时,我们无法记住自己众所周知的生物概念和生存策略。我们必须换一种方式思考。
让熟悉变得陌生
我们应该改变我们的思维模式。
让熟悉变得陌生。
这是来自麻省理工学院人类学和科学史专业学生克莱尔·韦伯的建议,被 Space.com 引用在一篇标题为:
为了找到智慧的外星生命,人类可能需要开始像外星人一样思考。
我们应该防止路灯效应。我们应该想出这个框——这个现在流行的词的原意。
而如果我们应用 AI,正确的方式应该是什么,你觉得呢?
- 让深度学习以未知的方式蓬勃发展?
- 在偏差减少的数据库上进行无监督学习?
- 用完全不同的思维方式来感知人工智能的结果?
我们如何才能让人工智能像人类一样思考——而不仅仅是以更好的计算方式?但是以新人工智能视觉的方式?
我们正面临着感知的新时代,它在许多方面不同于传统的时代。因为:感知是一种约定俗成的东西,对文化或全球心态有偏见和影响。就像我们的人工智能模型在数据集上被训练,被人类贴上了糟糕的标签。
灵感来自周刊 AI 摘要作者里士满阿拉克。
AI 能帮助对抗电晕吗?
原文:https://towardsdatascience.com/can-ai-help-in-fighting-against-corona-72cdb9c4e2e0?source=collection_archive---------43-----------------------
图片来自 Pixabay 的图米苏
在这个艰难的时刻,呼吁数据专业人员采取行动
感到无助?我知道我是。
随着整个关闭的情况,我认为曾经是我内向的自我的天堂,当它实际发生时,看起来并不那么好。
我真的无法想象在家里呆多久。这种无能为力的无助感于事无补。
老实说,我很想在这种可怕的情况下提供更多帮助,但这里有一些小想法,我们作为人工智能从业者和数据科学家可以有所帮助。
捐赠你的计算能力
NVIDIA 正在要求游戏玩家捐赠他们的计算能力来支持 folding@home。
我想说的是 我们数据科学家手头肯定有基础设施在这方面提供帮助。
我们只需点击几下鼠标就可以完成很多事情。这有点像即时的满足感,但总比什么都不做好。
你只需要在这里下载并安装他们的软件。我为我的 windows 系统下载了fah-installer _ 7 . 5 . 1 _ x86 . exe文件。你也可以为 MAC 和 Linux 下载它。如果你没有图形处理器,你也可以帮助 CPU 资源。
当被问及“自定义安装”或“快速安装”时,我选择了推荐的选项“快速安装”。你可以给团队“电脑大师赛-PCMR”编号 225605。您可以将密钥保留为空,或者如果您想要跟踪您所做的工作,您可以获得一个密钥。
还可以控制捐赠给事业的系统资源。如果您不使用任何大量的计算,我建议您使用 full。我捐赠了我的两个 GPU 和 CPU。到目前为止,我已经能够捐赠大约 3 个工作单位。
想出新颖的方法来帮助
引起很多关注的一件事是缺乏适当的测试程序。例如,在英国,目前的建议是,由于缺乏测试,在出现轻微感冒症状时进行自我隔离。此外,由于缺乏测试,许多数字并不完全可靠,可能是错误的。
来源
所以当我看到 Adrian Rosebrock 的博客时,我感到惊喜,他试图使用新冠肺炎 X 射线图像数据集(由Joseph Cohen)以及来自 Kaggle 胸部 X 射线图像(肺炎)数据集 的正常 X 射线图像来创建一个自动新冠肺炎探测器。
至于结果,他们看起来很有希望:
正如您从上面的结果中看到的,我们的自动新冠肺炎检测机仅基于 X 射线图像(没有其他数据,包括地理位置、人口密度等)在我们的样本数据集上获得了大约 90–92%的准确率。用来训练这个模型。我们也获得了 100%的灵敏度和 80%的特异性
这些结果太棒了。100%的灵敏度意味着能够捕捉到所有的积极因素。并且它可以被用作电晕的初步测试。但是,我不确定这些 X 射线是在哪个阶段拍摄的,因为这也将发挥重要作用。你可以在 pyimagesearch 上查看详细帖子。他提到的缺乏数据,这在这个时间点上是完全可以理解的。但是,如果这种方法可行,并与手头的其他变量一起工作,它可能有助于检测日冕。
我们能想出其他新颖的方法来帮助那些需要帮助的人吗?
通过数据传播意识,缓解谣言
处理数据的一个好处是我们养成了理解各种偏见的习惯。许多数据科学家同事一直在做的另一件重要的事情是创造意识和唤起不同的偏见。
我特别喜欢这篇由 fast.ai 创始人杰瑞米·霍华德和雷切尔·托马斯发表的帖子,它提供了关于冠状病毒的数据科学观点。**
此外,请仔细阅读 Cassie Kozyrkov 的这篇文章,它讨论了围绕 Corona 的各种偏见,并试图对整个情况采取假设检验的方法。我特别喜欢她帖子中的这一部分:
如果没有相关信息,继续做你计划要做的事情。当不同的动作被触发时,执行它。
* [## 更明智的新冠肺炎决策
如何将决策科学的合理原则应用于疫情
towardsdatascience.com](/smarter-covid-19-decision-making-39dbff2ab2ba)*
这还不够,但是…
我知道这还不够,说实话还非常少。
要解决整个局势,需要在实地做很多工作。但除了洗手,我还想到了其他一些事情。
此外,我们可以讨论数据科学界可以帮助应对这一巨大挑战的任何想法。我想做得更多。
AI 能让你成为更好的运动员吗?
原文:https://towardsdatascience.com/can-ai-make-you-a-better-athlete-74dc0c041cce?source=collection_archive---------72-----------------------
利用机器学习分析网球发球和点球
由戴尔·马科维茨 — 11 分钟阅读
啊,体彩。你能忘记第一次你抓住那个传球,飞向球场,把那个冰球直接投进球网,而你的球迷在看台上崇拜地大喊,触地得分!
没有吗?没有印象吗?我也没有。这就是你在高中学习微积分和在饼干蛋糕上涂圆周率而不是做运动的结果。
Clint Bustrillos 在 Unsplash 上拍摄的照片
用机器学习对地下城&龙族中的角色分类
由丹·奎奇 — 10 分钟读完
几个月前,一个朋友邀请我加入他的在线龙与地下城活动。尽管我有着令人尊敬的书呆子名声,但我从未真正玩过 DnD。我并不是反对它,事实上,它听起来很有趣,我喜欢它鼓励合作和机智的创造力。也许这可以避免我在新冠肺炎的单独禁闭中写论文所带来的单调生活。
图片由 Gerd Altmann 在 Pixabay 上提供
嵌入图形数据库的计算节点:Neo4j & its 图形数据科学库
通过 Estelle Scifo — 7 分钟阅读
现在的机器学习都是关于向量的。执行分类任务要求将数据排列成行(观测值),每行包含相同数量的要素(列)。虽然这很容易从最初存储在 Excel 表或 SQL 或 noSQL 数据库中的数据中获得,但当问题涉及复杂对象(如文本、图像或图形)时,转换就远不明显了。
图片来自 Pixabay 的 Thomas Breher
基于学习嵌入的推荐系统
通过纳希德·阿拉姆 — 6 分钟读取
推荐系统是试图预测用户偏好的现代消费者网络应用的基本构件。有不同的方法来建立推荐系统。我们对基于最近邻的方法特别感兴趣。我们研究一个项目的配对之间的相似性,并推荐给用户
马文·朗斯多夫在 Unsplash 上的照片
期望最大化解释
由 Ravi Charan — 11 分钟阅读
期望最大化(EM)是 60 年代和 70 年代发展起来的经典算法,具有多种应用。它可以用作无监督聚类算法,并扩展到 NLP 应用,如潜在的狄利克雷分配、用于隐马尔可夫模型的 Baum–Welch 算法和医学成像。
AI 能让你成为更好的运动员吗?利用机器学习分析网球发球和点球
原文:https://towardsdatascience.com/can-ai-make-you-a-better-athlete-using-machine-learning-to-analyze-tennis-serves-and-penalty-kicks-f9dd225cea49?source=collection_archive---------38-----------------------
啊,运动球。你能忘记第一次你抓住那个传球,飞向球场,把那个冰球直接投进球网,而你的球迷在看台上崇拜地大喊,触地得分!
没有吗?没有印象吗?我也没有。这就是你在高中学习微积分和在饼干蛋糕上涂圆周率而不是做运动的结果。
你认为这让我交了多少朋友?
是时候让你一去不复返了。当然,除非你想出一种方法,利用高中的数学知识成为一名更好的运动员。
这就是我们今天要看的!在这篇文章中,我将向你展示如何使用机器学习来分析你在自己选择的运动中的表现(例如,我将使用我的网球发球,但你可以很容易地将该技术应用到其他比赛中)。顺便说一下,这个项目的灵感来自于我最近对扎克·阿基尔的采访,他用同样的技术分析了足球比赛中的点球。
用机器学习制作关于用人工智能跟踪点球的剧集。
机器学习已经在体育运动中发挥了作用:公司用它来识别球员的独特才能,更早地发现伤病,并安排最佳球员交易。此外,几乎每项职业运动(NFL、NHL、MLB、NBA、足球、高尔夫、板球等)都使用 ML 技术进行跟踪。例如,NBA 已经在球场上部署了一个复杂的基于视觉的系统,跟踪球员的动作,读取他们球衣上的数字,分析他们传球的速度,并确定他们在压力下的投篮精度。
但是作为一个初学者,我喜欢用同样的技术简单地告诉我哪里做错了,哪里出错了。理想情况下,当我在网球场上时,我会在我的手机上安装一个应用程序,分析我发球的视频,并给我提供有用的提示(例如,“伸直你的手臂”,“弯曲你的膝盖”)。在这篇文章中,我将向你展示让这样的应用成为可能的核心技术。
想直接跳到代码?在 Github 上查看 代码 。
利用机器学习分析我的网球发球
几周前,我去了一个网球场,支起三脚架,拍了一些我发球的镜头。我把它寄给了我的朋友 JT,他是一名网球教练,我问他我做错了什么。他给我发回来一堆我和职业网球运动员的对比照片,并指出了我们所有的不同之处——我手臂的整个轨迹和肘部的角度都相差很远。
JT 所做的很有用——他分析了我发球中与专业运动员不同的关键部分。如果机器学习模型可以做同样的事情,那不是很好吗?将你的表现与专业人士进行比较,让你知道自己做的有什么不同?
根据 JT 的反馈,我决定关注服务的三个方面:
- 我发球时膝盖弯曲了吗?
- 我击球时手臂是直的吗?
- 我击球后球的实际速度是多少?(这只是出于我个人的兴趣)
通过姿势检测分析姿势
为了计算我的膝盖和手臂的角度,我决定使用姿势检测——一种机器学习技术,它分析人类的照片或视频,并试图定位他们的身体部位。有很多工具可以用来做姿势检测(如 TensorFlow.js ),但对于这个项目,我想尝试一下新人检测(beta!)谷歌云视频智能 API 的特性。(你可能会从我的人工智能视频存档中认出这个 API,在那里我用它来分析我的家庭视频中的对象、文本和语音。)人物检测功能可以识别一大堆身体部位、面部特征和服装。来自文档:
首先,我把我网球发球的视频剪辑到我发球的部分。因为我只拍到了 17 次发球,这花了我大约一分钟的时间。接下来,我将视频上传到谷歌云存储,并通过视频智能 API 运行它。所有这些代码都被方便地记录在一个 Colab 笔记本中,你可以在自己的视频上运行它(你只需要一个谷歌云账户)。该笔记本甚至向您展示了如何设置身份验证和创建存储桶等等。有趣的是——分析姿势——是这样的:
def detect_person(input_uri, output_uri):
"""Detects people in a video."""
client = videointelligence.VideoIntelligenceServiceClient(credentials=service_account.Credentials.from_service_account_file(
'./key.json'))
# Configure the request
config = videointelligence.types.PersonDetectionConfig(
include_bounding_boxes=True,
include_attributes=True,
include_pose_landmarks=True,
)
context = videointelligence.types.VideoContext(person_detection_config=config)
# Start the asynchronous request
operation = client.annotate_video(
input_uri=input_uri,
output_uri=output_uri,
features=[videointelligence.enums.Feature.PERSON_DETECTION],
video_context=context,
)
return operation
要调用 API,您需要传递云存储中存储视频的位置,以及云存储中视频智能 API 可以写入结果的目的地。
在这里,我调用视频智能 API 的异步版本。它分析谷歌后端的视频,在云中,甚至在我的笔记本电脑关闭后。这对于长视频来说很方便,但是也有这个 API 的同步和流版本!
当视频智能 API 分析完我的视频后,我用这个由 @wbobeirne 打造的简洁工具将结果可视化。它会吐出这样简洁的可视化视频:
使用视觉 API 来可视化我在发球时的姿势。
姿态检测是训练机器学习模型的重要预处理步骤。例如,我可以使用 API 的输出(我的关节随时间的位置)作为第二个机器学习模型的输入特征,该模型试图预测(例如)我是否在发球,或者我的发球是否会过网。但是现在,我想做一些更简单的事情:用高中数学分析我的发球!
首先,我绘制了我的左手腕和右手腕随时间变化的 y 位置:
一段时间内我手腕的高度(以像素为单位)
这看起来可能很混乱,但是这些数据实际上非常清楚地显示了一个服务的生命周期。蓝线显示了我左手腕的位置,在我用球拍击球前几秒钟,我的左手腕达到了最高点(右手腕的最高点,或橙色线)。
利用这些数据,我可以非常准确地说出我在什么时间点投球并击球。我想把它和我击球时肘部的角度对齐。为此,我必须将视频智能 API 的输出——原始像素位置——转换成角度。你是怎么做到的?余弦定律,咄!(开个玩笑,这个我肯定忘了,得查一下。这里有一个很好的解释和一些 Python 代码。)
余弦定律是将空间中的点转换成角度的关键。在代码中,这类似于:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def getAngle(a, b, c):
ang = math.degrees(math.atan2(c.y-b.y, c.x-b.x) - math.atan2(a.y-b.y, a.x-b.x))
return ang
def computeElbowAngle(row, which='right'):
wrist = Point(row[f'{which}_wrist_x'], row[f'{which}_wrist_y'])
elbow = Point(row[f'{which}_elbow_x'], row[f'{which}_elbow_y'])
shoulder = Point(row[f'{which}_shoulder_x'], row[f'{which}_shoulder_y'])
return getAngle(wrist, elbow, shoulder)
def computeShoulderAngle(row, which='right'):
elbow = Point(row[f'{which}_elbow_x'], row[f'{which}_elbow_y'])
shoulder = Point(row[f'{which}_shoulder_x'], row[f'{which}_shoulder_y'])
hip = Point(row[f'{which}_hip_x'], row[f'{which}_hip_y'])
return getAngle(hip, shoulder, elbow)
def computeKneeAngle(row, which='right'):
hip = Point(row[f'{which}_hip_x'], row[f'{which}_hip_y'])
knee = Point(row[f'{which}_knee_x'], row[f'{which}_knee_y'])
ankle = Point(row[f'{which}_ankle_x'], row[f'{which}_ankle_y'])
return getAngle(ankle, knee, hip)
查看笔记本,了解所有细节。使用这些公式,我绘制了我的肘部角度随时间的变化曲线:
随着时间的推移,我右肘的角度
通过对齐我手腕的高度和我肘部的角度,我能够确定角度大约是 120 度(不是直的!).如果 JT 没有告诉我要寻找什么,这将是一个很好的应用程序来捕捉我的手臂角度与专业人士不同,并让我知道。
我用同样的公式计算了我的膝盖和肩膀的角度。同样,在笔记本上查看更多细节。
计算我发球的速度
姿势检测让我计算我身体的角度,但我还想计算我用球拍击球后的速度。为了做到这一点,我必须能够随着时间的推移跟踪微小、快速的小网球。
正如你在这里看到的,这个网球有点难以辨认,因为它很模糊而且很远。
我用 Zack 在他的足球码头项目中的方式处理这件事:我训练了一个定制的自动视觉模型。
如果你不熟悉 AutoML Vision ,这是一种使用深度神经网络建立计算机视觉模型的无代码方式。最棒的是,你不需要了解任何关于 ML 的知识就可以使用它!最糟糕的是成本。它很贵(一分钟后会详细说明)。
AutoML Vision 允许您上传自己的标记数据(即带有标记的网球)并为您训练一个模型。
用自动视觉训练目标检测模型
首先,我拍摄了一段 30 秒钟的我上菜的视频,并将其分割成单独的图片,我可以用这些图片作为视觉模型的训练数据:
ffmpeg -i filename.mp4 -vf fps=10 -ss 00:00:01 -t 00:00:30 tmp/snapshots/%03d.jpg
您可以从我提供的笔记本中运行该命令,或者如果您安装了 ffmpeg,也可以从命令行运行该命令。它采用 mp4 并创建一组快照(这里 fps=20,即每秒 20 帧)作为 jpg。-ss
标志控制快照应该在视频中多远开始(即在 1 秒时开始“搜索”),标志-t
控制应该包括多少秒(本例中为 30 秒)。
创建完所有快照后,您可以使用以下命令将它们上传到 Google 云存储:
gsutil mb gs://my_neat_bucket # create a new bucket
gsutil cp tmp/snapshots/* gs://my_neat_bucket/snapshots
接下来,导航至谷歌云控制台,并从左侧菜单中选择视觉:
创建一个新的 AutoML 视觉模型并导入你的照片。
快速回顾:什么是机器学习分类器?这是一种从例子中学习如何标记事物的模式。因此,为了训练我们自己的 AutoML 视觉模型,我们需要提供一些带标签的训练数据供模型学习。
上传数据后,您应该会在 AutoML Vision 的“图像”选项卡中看到它:
在这里,你可以开始应用标签。点击进入图像。在编辑视图(如下)中,您可以单击并拖动一个小边框:
AutoML 视觉数据标注界面 Gif 图
恭喜你,你刚刚开始了一个漫长而有益的职业生涯作为一个数据标签。下一站,麻省理工!
对于我的模型,我手工标记了大约 300 张图片,花了我大约 30 分钟。一旦你标记完数据,只需点击一下就可以用 AutoML 训练一个模型——只需点击“训练新模型”按钮,然后等待。
当您的模型完成训练后,您可以在下面的“评估”选项卡中评估其质量。
如你所见,我的模型相当精确,大约 96%的精确度和召回率——热狗!
这足以让我在照片中追踪球的位置,从而计算出它的速度:
这里非常小,但是你可以看到那个小的边界框在跟踪网球。
一旦你训练好了你的模型,你就可以使用 Jupyter notebook 中的代码来制作一个可爱的 lil 视频,就像我上面画的那样。
然后,您可以使用它来绘制球随时间变化的位置,以计算速度(有关更多详细信息,请参阅笔记本):
网球随时间的 y 位置
不幸的是,我意识到我犯了一个严重的错误,但为时已晚。什么是速度?距离随时间的变化,对吗?但是因为我实际上不知道我、玩家和摄像机之间的距离,所以我不能用英里或米来计算距离,只能用像素!所以我知道我以大约每秒 200 像素的速度发球。好听。
*自从我写了这篇文章,一些人认为我应该用一个网球的大小来估计距离。我觉得听起来是个好主意!
现在你有了——一些你可以用来构建自己的运动机器学习训练器应用的技术!
关于成本的一个注记
声明:我在谷歌工作,我免费使用谷歌云。我尽可能在这里推荐免费工具,但是我本能地求助于 GCP,有时我没有注意到代价。
当谈到汽车视觉时,这并不是一个好主意。这是这个项目让我付出的代价:
整件事大约要 450 美元。但是,在你被$$完全拒绝之前,让我们来分解一下:
我训练了两个 AutoML 模型,两个模型的训练成本都是 91.11 美元。当然,这是昂贵的,但质量相当高,也许对于某些业务用例来说,这是有意义的。
真正的成本来自于第一项——自动图像目标检测在线预测。那是什么?这是谷歌为在云中托管你的模型收取的费用,这样你就可以用标准的 REST API 调用它。奇怪的是,即使你没有对这种模式进行预测,你也会不断地被收取托管这种模式的费用,这真的会使成本快速攀升。
好消息是 AutoML Vision 实际上以三种方式运行:
- 您可以将模型配置为托管在云中,您可以在任何时候在 REST 端点访问它(最昂贵)。
- 您只能在批处理模式下使用它(预测是以异步方式运行的,而不是用于实时用例),这样可以消除大部分额外成本。
- 您实际上可以将您的模型训练为可导出的,允许您将其作为 TensorFlow 模型下载并离线使用。这也大大降低了成本。
- 或者,您可以完全放弃 AutoML,使用 TensorFlow 或 PyTorch 独自尝试。祝你好运,并让我知道你的选择!
原载于 2020 年 7 月 7 日【https://daleonai.com】。
一个算法能选出一个获胜的 NBA 梦幻选秀吗?
原文:https://towardsdatascience.com/can-an-algorithm-pick-a-winning-nba-fantasy-draft-c05342f130f2?source=collection_archive---------20-----------------------
使用数据分析、建模和优化来挑选获胜团队
照片由来自 Pexels 的 Markus Spiske 拍摄
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
我喜欢篮球。这是一个快节奏的竞技游戏,我喜欢玩和看它已经很久了。NBA 以生成非常干净的数据而闻名,这些数据长期被爱好者(比如我自己)用于数据可视化、建模和比赛预测。
最近, DraftKings 联系我,询问一份潜在工作的面试事宜。作为准备工作的一部分,我开始使用他们的平台并参加模拟比赛,以熟悉 DraftKings (DK)比赛流程。正是在这段时间里,我真正开始有了用数据来建模和预测一个获胜名单的想法。
我迭代地构建了这个算法,并且从头开始——从一个简单的版本 1 开始,一个更健壮的版本 2,现在我正在开发一个成功的版本 3。
我迭代地构建算法,从头开始
在本文的其余部分,您可以跟随我的算法设计之旅。
快速水平集:评分和规则
DK 为他们的 NBA 经典幻想竞赛制定的规则和评分相当直观,即使你之前没有篮球知识。简而言之,目标是:
创建一个 8 人阵容,同时保持 5 万美元的工资上限。
玩家因不同的动作获得不同的分数(更多细节见下文),在一个晚上所有游戏结束时,分数最高的选秀获胜。听起来很简单:)
导致正(或负)分的不同行动的分类如下所示。
NBA 梦幻积分细分。作者照片。
最后一个使起草稍微复杂的限制是球员的位置。根据 DK: 阵容将由 8 名球员组成,必须包括至少 2 场不同 NBA 比赛的球员。
进一步,这 8 名球员按位置细分,如下图所示。
NBA 梦幻球员位置。作者照片。
你有它!带有一组约束的简单优化问题。听起来像是算法擅长的事情。或者会吗?
算法版本 1-幼稚
我用这个算法的目标是尽可能快地构建它,几乎没有获胜的希望。主要是因为我对建立强大的基础感兴趣,而不担心在过程早期构建复杂的逻辑。为了做到这一点,我从 DK 下载了一个球员数据集,并启动了一个 Jupyter 笔记本。如果你有兴趣,你可以找到完整的原始数据这里和我的笔记本这里。
让我们看看我们的数据是什么样的。
玩家数据集- DraftKings。作者照片。
马上,我们可以看出,对于一个简单的算法,给定我们的需求和约束,我们会发现以下几列很有用:ID、Salary 和 AvgPointsPerGame(幻想点数)。这将允许我们挑选“最好的”球员,同时保持在 50,000 美元的工资帽之下。当然,没有位置信息,我们可能会有重叠等。但这是以后版本的问题。请记住,版本 1 应该是您的产品的最简单的实现。
给定这些数据,我们的第一遍优化算法可以分为以下简单步骤:
- 从数据集中随机选择 8 名玩家。
- 如果球员工资之和大于 5 万美元:回到步骤 1(太贵)。
- 否则,对花名册中每个球员的 AvgPointsPerGame 求和,并与主最大值进行比较。如果更大,替换最大值和花名册。
- 除非已经探索了所有可能的组合,否则返回步骤 1。一旦不再有组合,返回最大值和花名册。
我们有了:一个简单的天真算法,随机挑选 8 名球员,他们将拥有最大的预期幻想点数,同时保持在 50,000 美元的薪金上限之下。但是这种算法有几个明显的问题:
- 无法控制球员的位置。因此,该算法可以生成一个包含多于 3 个职位(G/F)的名册,在这种情况下,该名册将是无效的。
- 没有检查受伤或未安排比赛的球员。这将导致最确定的损失,因为所有球员的分数对一个获胜的选秀都很重要。
- 最后,该算法效率非常低。考虑到我们需要检查每个可能的花名册:对于给定的球员数量 n 和花名册大小 r,可能的花名册的数量将是-
C( n,r ) = n!/ (n — r)!。r!
为了更好地理解这种复杂性,请看下表,它显示了如果玩家总数为 100 时的检查次数。
第一种算法的时间复杂度。作者照片。
可以肯定的是,我们的算法需要很长时间来输出 8 名球员的名单。但是,因为这是一个第一遍算法,我们很高兴我们得到了什么。你可以看到下面的算法,选出前 5 名球员的总工资为 35,000 美元。还不错。
算法 1 的输出-最大期望点数低于 35,000 美元总工资的前 5 名球员。注意:第一行显示的是期望的梦幻组合点数,第二行是组合薪水,第三行是玩家的 id,后面是名字。作者照片。
因为我们的任务是构建一个成功的算法,所以我们来谈谈版本 2 的优化。
算法版本 2-中级体育投注者
现在,这就是我们的算法从一个幼稚的优化器变成一个中级体育投注者的地方。基于版本 1 的缺点和阶乘时间复杂性,我决定实现一些数据和算法级优化。
首先,我清理了数据,只包括确认玩游戏的玩家。这是一个将可用玩家总数从 100 人减少到 85 人的简单方法。这可能看起来是一个小的增长,但实际上,对于一个 8 人的花名册来说,当球员总数减少时,我们的检查次数会急剧减少。支票数量的变化如下所示。
- C (100,8)= 186087894300
- C (85,8) = 48,124,511,370
我们在算法中的操作(或检查)总数下降了大约 75%!
接下来,我修改了算法本身来挑选特定的位置。现在,算法不是从所有可用的球员中挑选每一个可能的名单,而是从所有可用的后卫中挑选 3 名后卫,然后是 3 名前锋,最后是 1 名中锋。如你所见,这里总共只有 7 个玩家,最后的选择留给用户。这是在算法上节省一些额外时间的快速方法,因为用户可以手动找到剩余的最佳球员(给定剩余工资的最高期望分数)。
这是一个巨大的优化,因为后卫和球员总数的比例是 40 比 85。前锋的数据差不多,中锋的数据更少。请注意,每个类别的球员之间有轻微的重叠,因为一些球员踢多个位置,但这很容易处理:我在选择前锋之前,删除了已经被选作后卫的球员。上述更改带来的性能提升如下所示:
- C (85,8) = 48,124,511,370
- C (40,3) x C (40,3) x C (20,1)= 1952288000
这是巨大的。现在,该算法执行的操作减少了约 95%,我们拥有按职位分列的最佳名单,并且在我们的工资帽范围内。让我们来测试我们的结果!
真实世界的结果
如果你已经做到了,恭喜你。你已经解决了技术问题,现在是时候看结果了!我在 DK 的经典乘数竞赛中尝试了三天的算法选择。每次我的报名费是 1 美元,前 30%的参赛者的回报是 3 美元。你可以在下面看到算法生成的阵容和结果。
第一天——哦,不,以第 26 名结束,还输了钱。作者 DK 截图。
第二天——哦,不,又来了,排在第 26 位,又输了 1 美元。作者 DK 截图。
第三天-哇哦!排名第三,赚了 3 美元。作者 DK 截图。
正如你从上面的结果中看到的,比赛的真实结果是好的!在我用算法创建阵容的三天里,我们输了两次,赢了一次。我们的中级运动斗鱼算法做得比我预期的要好,但是还有很长的路要走。
我注意到结果的细微差别,包括我们的算法(在 v2 优化之前)在第一天犯了一个错误,一名受伤的球员被选入球队(P. Beverley ),导致了弱草案。这个问题在版本 2 中已经解决,不会再重复。此外,曾经很酷的事情是,尽管有混合的结果,该算法一直创造了超过 200 幻想点的阵容,这是相当高的!
下一步是什么?
好了,你知道了。到目前为止,我已经花了 3 美元的主菜费和 3 美元的奖金,总共 0 美元的变化!在我内心的警钟开始响起之前,我还有 25 美元可以花在这个项目上,所以我显然需要改进这个算法。在和一些比我更了解篮球的朋友交谈后,我有几个假设要验证。其中包括:
- 在过去的 n 场游戏中使用额外的玩家数据。这样,模型将有更多的上下文,而不仅仅是一个快照值
- 使用之前的球队比赛数据来调整某些比赛的权重。例如,这有助于避免在一场比赛中挑选一名(根据以前的比赛)表现不佳的球员
- 探索双重优化策略
还有更多!如果你对如何改进这个项目有任何想法,请随时通过 LinkedIn 或电子邮件联系我,你可以在我的网站上找到。此外,这个项目的所有数据和代码都可以在我的 Github 库中找到,所以请随意克隆/派生它并测试你自己的假设!一如既往,非常感谢所有反馈。
每个人都要保持安全,继续创造酷的东西。
机器学习模型可以阅读股票图表并预测价格吗?
原文:https://towardsdatascience.com/can-an-ml-model-read-stock-charts-and-predict-prices-fb73c551c7a4?source=collection_archive---------18-----------------------
如果你的机器学习模型可以像人类一样阅读股票价格图表,会怎么样?
亚历山大·奈特从派克斯和亚当·诺瓦克斯基在 Unsplash 拍摄的原始照片
来自《走向数据科学》编辑的注释: 虽然我们允许独立作者根据我们的 规则和指南 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
大多数 ML 模型都试图使用历史价格数据和其他技术指标(即数字输入)来预测股票价格(或股票价格的变化)。但是,我问自己,为什么 ML 模型不能精确地复制人类在股票市场的交易方式?
任何一个普通人都会打开股票价格图表(蜡烛图),试图在价格数据中找到一些模式。也许接下来,应用一些技术指标,查看一下公司基本面,最后根据所有图表和数字输入的综合输出,对股价的下一步走势做出决策。如果一个 ML 模型也能从视觉信息中得出这些结论,会怎么样?
因此,让我们将价格历史时间序列作为可视信息传递给 CNN 模型作为输入。模型会像人类一样识别视觉数据中的模式吗?这个模型的性能会比以数字数据作为输入的模型好吗?好吧,让我们来看看!
在我们开始之前,在我的上一篇文章中,我们探讨了为什么盲目使用 LSTMs 来预测股票价格会给你带来麻烦。你可以在这里阅读。已经看过了?很好,现在我们可以继续了。
接下来,免责声明。 这些都不是财务建议,你也不应该在实践中直接实施。把这当成一个实验,仅此而已。酷,现在先不说这个,我们可以继续我们的实验了!
我们将预测第二天价格运动的方向,而不是预测股票价格,也就是说,股票价格将会上涨、下跌还是横盘整理。我们开始吧!
这篇文章的流程如下:
- 用 python 获取历史股票数据。
- 将价格数据转换为可视化表示
- 用 Tensorflow Keras 建立并训练一个模型。
- 预测和解释结果。
第一步:获取股票数据
python 中有多种方法可以访问历史股票价格,但是最简单的库之一是 yfinance 。非常方便和免费,它通过从雅虎财经收集数据来完成工作。
!pip install yfinance## Import the required libraries
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
在本文中,我将采用印度股票市场上最大的公司“Reliance”的股票价格,但也可以随意尝试其他工具。
下面这段代码下载 Reliance 大约 18 年(我有意避开 COVID 周期)的股票价格数据,分辨率为 1 天,并将其存储在 pandas 数据帧中。你可以根据你的实验改变这些参数。
打印出熊猫数据框架的头部,你可以看到各种参数,如“开盘价”、“收盘价”、“高”、“低”、“成交量”,可用于股票数据。
熊猫数据框架顶部为 Reliance 股票数据
画出“收盘”价格以可视化数据,看看股票在过去几年中上涨得有多好。
Reliance 股票数据的收盘价
现在我们将为我们的数据添加一些额外的特征。首先,计算与前一天收盘相比的百分比变化。接下来根据这一变化,产生一个信号:
- 0(如果变化小于-2.5%)
- 1(如果变化在-2.5%和-1%之间)
- 2(如果变化在-1%和 1%之间)
- 3(如果变化在 1%和 2.5%之间)
- 4(如果变化大于 2.5%)
数据帧现在看起来像这样:
具有附加功能的数据帧
现在,这完全是任意的,你可以随意改变它。您可以将更改分成更多/更少的部分(相应地调整模型的最后一层)。
第二步:股票价格的视觉表现
现在,这一步非常重要,因为它将决定模型看到什么。在这篇文章中,我想让图像尽可能接近人类交易者看到的蜡烛图。一个约束条件是,每个输入图像必须具有相同的尺寸,并且必须包含足够的信息,以便模型从中得出结论。
我们要有一个回望期,比如说过去 50 天 (10 个交易周),要有代表性。为了简单起见,对于这 50 天中的每一天,开盘和收盘,以及价格运动的方向都将被编码。
由于相同维度的图像将被输入到神经网络,它可能不理解这个图像在整个 15 年中的位置。例如,在 2002 年,价格为 80-90 英镑,而随着时间的推移,价格缓慢上升至 1800 英镑。虽然价格模式可能(也可能不)独立于绝对股票价格,但我想在图像中也编码一些这种信息。因此,为了给过去价格及其绝对价格水平的图像提供一些背景,50 天的价格表示将在一个更大的时间窗口中进行缩放,该时间窗口考虑了额外的先前价格值。
生成这个可视化表示的代码是:
从股票价格数据生成图像表示的代码
50 天回顾期内开盘和收盘的直观表示
注意:这是一个非常接近我们在烛台图表上看到的视觉表现(这是重点)。但是,您也可以利用您的想象力(和一些判断力)用其他编码参数创建一个完全不同的视觉表示。因为 CNN 模型从图像中观察和学习的方式可能(也可能不会)与我们的方式大相径庭!
接下来,让我们创建一个数据生成器,它将遍历 15 年的数据,并创建图像对和相应的第二天预测。
这些数据生成图像预测批次,如
一批 4 个生成的图像及其预测
步骤 3:构建和训练 ML 模型
由于我们将输入作为图像,并要求输出作为三个类别之一(向上、向下、无运动),我们的模型将有几个卷积层,然后是几个密集层,最后是一个 softmax 函数。
让我们启动生成器对象并开始培训。
初始化所有数据生成器对象,并开始训练模型
步骤 4:可视化结果
训练后,损失可绘制为:
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='val')
plt.legend()
plt.show()
绘制损失图
现在让我们看看测试数据的准确性。
## Evaluating the performance of the model
print(model.evaluate(test_gen,steps = (len(data)-split_test)//batch_size))>>> loss: 1.3830 - accuracy: 0.4375
好吧,给定 5 种可能的结果,随机猜一个的准确度是 0.2。所以这个模型相对来说表现的还不错。还是有?
绘制出预测的输出,很清楚发生了什么。该模型还没有学到任何有用的东西,所以它最终预测“2”作为每个输出,从而导致相对较高的准确性。
预测产出与真实产出
那我们再多训练一下模特吧。但现在,验证损失大大增加。另外,测试给出的精度小于 0.3。不太令人鼓舞的是,该模型可能过度拟合了训练数据。一个非常明显的原因是与模型大小相比,训练数据的大小较小。
结束语…
尽管表现并不十分令人鼓舞,但这是一种研究预测股票价格这一古老问题的创新方法。还有一些想法是提供多时间段的输入(比如,也将周数据作为输入),或者额外提供数字数据形式的技术指标(与可视图表并行),或者将价格数据转换到其他可视域(不一定是我们看到的图表),等等。你认为我们还能做些什么来改进这个模型?你还有其他有趣的想法吗?
在尝试了所有这些想法之后,问题仍然存在——视觉数据提供了数字数据无法提供的优势吗?你怎么看?
你可以在我的 GitHub 库中找到完整的代码。
最后,我并不是说我是这些领域的专家——我只是提出了我对这个话题的探索,所以请随意指出我的错误或补充我遗漏的任何内容。我很想听到你的反馈。
你想在股票中使用 ML 一夜暴富吗?这篇文章(不)适合你!
[## 如何(不)用 LSTMs 预测股票价格
股票和机器学习——天作之合。但是事情真的像看起来那么简单吗?
towardsdatascience.com](/how-not-to-predict-stock-prices-with-lstms-a51f564ccbca)
或者看看我的其他机器学习文章。我相信你会发现它们很有用……
[## 掌握用于语义图像分割的 COCO 数据集
使用 PyCoco、Tensorflow Keras Python…探索和操作 COCO 图像数据集进行语义图像分割
towardsdatascience.com](/master-the-coco-dataset-for-semantic-image-segmentation-part-1-of-2-732712631047) [## 创建一个合成图像数据集——“什么”、“为什么”和“如何”
缺少图像来训练你的模型?以下是如何使用合成图像将数据集的大小增加数倍…
towardsdatascience.com](/create-a-synthetic-image-dataset-the-what-the-why-and-the-how-f820e6b6f718)
分析师和统计学家能相处吗?
原文:https://towardsdatascience.com/can-analysts-and-statisticians-get-along-5c9a65c8d056?source=collection_archive---------5-----------------------
数据科学专业之间微妙的战争
图片:来源。
在之前的一篇文章中,我解释了在统计和分析中的典型培训项目赋予毕业生不同的技能组合。
当你处理不确定性时,分析师会帮你提出更好的问题,而统计学家会提供更严谨的答案。这看起来像是合作梦想的组成部分,然而不知何故,这些职业最终会相互争斗。让我们看看我们是否能够理解分析和统计之间的奇怪战争(并建议和平条约)。
分析师和统计学家:玻璃容器中不相容的物种?图片:来源。
定义
由于数据科学职称可能无法准确反映人们的实际工作,让我来定义一下我的术语:
- 那些关注于看数据来总结数据并从中提取灵感的人,就是我所说的 分析师 。
- 那些关心严格测试数据驱动决策的假设的人,我称之为统计学家。
- 懂得两者兼顾的人……都是都是。这篇文章没有提到分析师和统计学家的混合体,但是你可以在这里找到我对他们的想法。
- 那些对两者都敷衍了事,却至少误解了其中一个的人是数据骗子。前往这篇文章了解更多信息。
- 那些既懂得如何做又也拥有 ML/AI 专长的人我称之为数据科学家。这种全才确实少见。你可以在我的其他文字中读到他们:[ 1 ,[ 2 ,[ 3 ,[ 4 ,[ 5 ]。请注意,对于如何定义数据科学角色,不同的组织有不同的标准,因此在假设之前,最好检查每个人都在谈论相同的事情。
分析帮助你形成假设,而统计让你测试它们。
当分析师们专门研究如何快速探索你的一堆混乱的数据集时,统计学家们则更关注于推断出更多的东西。
(数据)贫困的负担
由于收集数据的努力和在 20 世纪的小型硬盘上存储数据的成本,上个世纪的数据集往往很小。即使是一个值得尊敬的数据集,也很难收集到足够的数据,这意味着数据分割很少是一个选项。这迫使专业人士在两种截然不同的心态中做出选择。
数据行业之间的对立是数据饥荒的一个挥之不去的影响。
图片:来源。
(为了理解本文中的一些细微差别,你需要理解一个数据点可以用来 产生灵感或者测试一个理论 ,但不能两者都用。通过数据分割,你可以鱼与熊掌兼得。如果你想更深入地探究为什么这是真的,请阅读。)
无论你属于哪一个阵营,你可能会认为另一个阵营正在试图做你的工作……而且他们在这方面做得出奇的差。
如果您在数据饥荒的黑暗时代接受了数据科学培训,您可能会怀有一种讨厌的刻板印象,这种印象源于未能理解分析师和统计学家扮演不同的角色。无论你属于哪一个阵营,你可能会认为另一个阵营正在试图做你的工作……而且他们在这方面做得出奇的差。
讨厌的刻板印象(以及为什么你会有它们)
图片:来源。
统计学家如何看待分析师
一句话:邋遢。与统计学家不同,大多数分析师没有受过严格思考不确定性下哪些结论有效的训练,但这没关系……只要他们不试图做出超出数据的结论。相反,分析师最大的优点是速度——尽可能快地找出数据集中的内容。
在数据中随意跳跃的想法惹恼了许多统计学家。最近,我参与了一次对话,对话中一位统计学家(不是我!)反对开发更快的分析工具,因为“这会招致误用。”没错。用一只泥泞的大靴子践踏整个分析生涯的有效性。
图片:来源。
事情是这样的:他是对的,这些工具对统计学家不利。不过,工作是不同的。不幸的是,大多数人——包括他——都不理解这种差异。
如果你不能分割你的数据并且你在决定问哪些问题之前查看所有的数据,那么你是在做分析,而不是统计。这不一定是一件坏事;分析很重要也很有用——它让我们产生灵感,从而找到前进的方向。当分析师试图将灵感作为更严谨的东西出售时,麻烦就开始了。
遵循一条黄金法则:在出手之前先做决定,或者坚持描述你面前的事物。
真正的统计学家会对你所谓的“洞察力”嗤之以鼻,如果你没有遵循一条黄金法则:在做出决定之前先做出决定。否则,坚持描述你的数据集,不要超越它。请不要把自己看得太重,也不要要求任何人。
关于如何使用未拆分数据响应分析的手册。
事实上,如果我们把每个人都视为在做描述性分析,直到被证明并非如此,那么我们在数据推理中都会是最安全的。
来自未拆分数据的“见解”?那只是你的看法,伙计。
除非你向我证明你的理论让你在出手之前出手,否则我会假设你向我展示的东西只存在于你发现它的地方。人们在各种事物中发现模式——特别是当他们被激励尽可能随心所欲地思考时——所以你不会给我留下深刻印象,除非你在看到模式之前预测到模式的存在。除非你能保证(并证明)数据访问日志,有人吗?)你的假设先于你的数据,你告诉我的任何事情都应该被视为“那只是你的观点,伙计。”**
方程是不够的,它们不能把一个破碎的过程变成一个可信的概括。
为了让对数据的探索不仅仅是描述性分析,你必须遵循一个特定的过程。仅仅因为你的软件吐出一个 p 值并不意味着真正的统计推断发生了。你必须着手构建背景并收集数据,以某种方式释放你正在做的事情的哲学有效性。等式是不够的,它们不能把一个破碎的过程变成一个可信的概括。让我们小心地使用我们的语言,称一切事物为"灵感"或"分析",直到被证明不是这样。
对分析师的抨击够多了。让我们去找一些统计学家吧!
统计学家在分析师眼中的形象
一句话:迂腐。与分析师不同的是,大多数统计学家没有接受过帮助你了解哪些兔子洞值得挖的粗略扫描训练。对于一个分析师来说,你的普通统计学家可能看起来像是皇家的浪费时间者,尤其是如果他们参与了项目的错误阶段。
许多统计学家喜欢正确地做事,即使这些事情一开始并不总是值得去做。这让人想起一个严厉的五岁小孩对待沙堡就好像它是神圣的一样,并且对想要加入建造乐趣的四岁小孩大喊大叫。不足为奇的是,分析师将这些统计学家视为一种强力胶,会粘在第一个飘过的东西上。(这种自以为是的态度也于事无补。)图片:来源。
大多数决策最不需要的就是统计暴政。
生活中的许多决定根本不值得付出太多努力,如果我们对每件事都采取仔细的统计方法,我们就不会完成太多事情。如果你在第一件引起你注意的事情上全力以赴,你确定你没有错过更有价值的利用时间的机会吗?(当然,这不是仔细的数学,但拜托,我只是在这里点餐。)**
当统计学家在对探索性数据的不恰当探索中大声表示反对时,他们在有商业头脑的人看来是可笑的。图片:来源。
我经常想知道为了严谨而严谨的现象是否是上数学课的产物,在数学课中,例子是琐碎的废话,计算越来越华丽。幼儿园的“如果萨莉在一块地里有二十只兔子……”一直坚持到研究生院,在那里它需要三倍积分才能获得金星。
在经历了这么多兔子之后,谁能责怪一个统计学家把一切都看得太重呢?这些课程实际上要求你为愚蠢的问题提供复杂的答案,那么,你对一群在这些课程中成长了十年的员工有什么期望呢?大量雇佣数学/统计崇拜者会让你避免一些问题,但也会让你暴露给其他人,包括那些让那些没有 110%用心建造每一座沙堡的人日子不好过的恶霸。
撇开我随意的因果推论不谈,如果你有一个队友会全身心地投入到严谨的工作中,那么希望这种严谨是值得追求的。如果你的队友不知道去哪个兔子洞,他们需要有人给他们指出正确的方向。
有了分析师的帮助,统计学家不再需要在黑暗中摸索,在头脑中构建一个宇宙,以找出如何提出问题。相反,他们可以让分析师去启发他们的假设和设想。
那么,为什么统计学家不乐意让分析师帮助他们确定什么是值得做的,为什么分析师不乐意把检验我们的结论不是废话的那部分交给统计学家呢?为什么对立和缺乏尊重?
解锁协作
在糟糕的过去,数据集太小无法分割,所以必须在使用它们进行分析和统计之间做出选择。这意味着这两个组将不得不为每个数据集而战。
在采用现代数据科学方法的组织中,分析师(灵感/探索)和统计学家(严谨/测试)之间的紧密合作是文化的一部分。
由于硬件的改进和更低的存储成本,今天许多努力正在突破一个数据集的天花板,迎来了一个数据丰富的时代。*
将您的数据分成一个探索性数据集和一个测试数据集,每个人都可以从中获得灵感,测试数据集稍后将由专家用于对探索阶段发现的任何“见解”进行严格确认。
现在,分析师和统计学家可以收到他们自己的原始数据集,让勘探专家与测试专家和谐地工作,每个小组都贡献自己最擅长的东西……假设他们可以放弃一见面就互相争斗的习惯。
假设的产生和检验之间有效合作的代价是数据量。
分析师可以将他们的文章作为指导思考,以找出什么是值得追求的,当他们缩小了企业最关心的问题时,剩余的文章让统计学家有机会严格检查分析师的直觉是否值得采取行动。
组织可以在数据学科之间建立共生关系…而且他们应该这样做!欢迎来到数据丰富的现代时代!*
图片:来源。
*旺盛阻尼器
尽管今天的典型数据集比上世纪的数据大得多(并且更容易共享/访问),但仍有一些用例被困在单一数据集时代,因为初始数据收集非常费力或昂贵。我职业生涯中的一个例子是 fMRI 数据——即使在今天,扫描一个人的大脑也是非常昂贵的,所以具有几十次扫描的神经科学数据集仍然被认为是令人印象深刻的。这也是认为所有的数据都是大数据的幼稚想法的一个原因。在某些主题中,信息非常匮乏,从事这些主题工作的人面临着一个数据集的现实。
如果这听起来像你的环境,试着考虑一下哪个阵营说了算,并尊重来自其他阵营的人——他们提供的服务与你的完全不同,你最好记住他们是自己领域的专家,即使你的企业选择了你的服务而不是他们的。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
电脑能感觉吗?
原文:https://towardsdatascience.com/can-computers-feel-69b234eeff70?source=collection_archive---------25-----------------------
计算移情和情感
照片由 Lenin Estrada 从 Pexels 拍摄
机器学习、“人工智能”和认知计算无疑已经以我们现在还无法理解的方式触及了我们的生活。许多人看到了这种技术的滥用,并对由贪婪或被误导的好奇心所驱动的人创造的反乌托邦未来感到焦虑。我们中的一些人害怕更多科幻小说启发的未来,人工智能成为我们的霸主,以及类似于终结者电影的反乌托邦未来。许多人担心计算机不理解情感或没有同理心,这是我们被消灭或被其他人操纵的驱动力。我们想象机器视我们为威胁,如同史密斯探员在母体中所说的疾病或“病毒”。这合理吗?这种担心有道理吗?如果计算机已经比我们更了解共情和利他主义会怎样?如果这更多地反映了人类对自己的判断,而不是我们可能面临的任何实际危险呢?如今,计算机能多好地理解人类的情感?我们在成为机器附庸的时间表中处于什么位置?在这篇文章中,我们将看看当前可以在语音和面部识别软件中预测人类情绪的技术。我们将着眼于当前计算机模拟人脑活动和神经形态计算的能力。我们还将关注最先进的认知计算,它具有推理和提问的能力,以便根据问题的答案得出逻辑结论。也许我们会发现,我们可以从计算机那里学到一些东西,我们对训练人工智能对人类友好和无损的担忧可能实际上是没有根据的。
亚马逊 Alexa 的情感识别功能
我们已经到达了一个点,计算机比以往任何时候都更好地理解人类的情感,并且达到了许多人将归类为科幻小说的程度。高德纳公司的研究副总裁安妮特·齐默曼认为,在未来两年内,我们将拥有能够比我们认为最亲近的人更好地理解我们情绪状态的技术。齐默曼说,
“到 2022 年,你的个人设备将比你的家人更了解你的情绪状态。”
在亚马逊,研究人员多年来一直在实施和开发情感识别人工智能。在最近的研究文章“情感识别的多模态和多视图模型中,他们解释了一种情感识别的“多模态方法。在他们的方法中,人工智能分析单词的选择和顺序,以及语音音调、音量和音色的声学属性。他们分析言语中的情感有三个维度:
- 情绪的积极或消极;
- 情绪的能量或激活水平;
- 情感的主导。
想象一下情绪感知设备的社会影响以及对精神健康和医疗保健的潜在应用。有一个随时可用的生活教练,永远不会在自己的问题中疲劳或迷失,例如在对话助手,人工智能朋友和基于 CBT 的治疗支持中。
神经形态计算
英特尔一直致力于“ 神经形态计算 的研究,该研究涉及模拟人类大脑的神经结构和运作,以及概率计算,该计算创建了处理自然世界中的不确定性、模糊性和矛盾的算法方法。“根据英特尔:
“即将到来的下一代将把人工智能扩展到与人类认知相对应的领域,如解释和自主适应。”
英特尔早在 2017 年 11 月就开发了专为“脉冲神经网络”或 SNNs 打造的第五代芯片。这些"自学习神经形态研究测试芯片"具有" 128 核设计,基于针对 SNN 算法优化的专业架构,采用 14 纳米工艺技术制造。“他们解释说,芯片、
支持不需要以卷积神经网络的传统方式训练的 snn 的操作。随着时间的推移,这些网络也变得更有能力(“更聪明”)
认知计算
认知计算是 IBM Watson 使用的一个术语,用来描述一种与人类互动的数字智能形式,在决策过程中指导人类,并告知人类决策背后的推理。它旨在缓解人们对围绕机器学习的所谓“黑箱问题”的看法。黑箱问题是指人类无法理解和解释为什么神经网络和深度学习模型会得出特定的决定或结论。两个不同的深度学习模型可能会得出相同的答案,这让数据科学家想知道为什么这两个模型具有什么属性来解释他们的决定。当然,这是一个过于简化的问题,但如果不进入信息论背后的技术数学以及神经网络如何逼近任意函数,这个问题实际上是一个关于人类对复杂系统的理解的问题。
IBM 培训认知计算概念
认知计算让人类参与决策过程,其交互和解释能力远远超过标准机器学习。至少早在 2013 年,IBM Watson 就在医疗诊断和治疗辅助方面实施了这一技术。看看这个视频的介绍。
如果计算机能感觉,那会怎样?
如果数字智能已经达到了理解人类情感的程度,并且已经发展出某种形式的数字情感,那会怎么样?然后呢?我们应该对机器感同身受吗?我们应该对我们的手机或笔记本电脑产生同情心吗?机器、AI、认知计算代理有“权利”吗?在什么程度上,我们认为它们足够自主和聪明,可以受到保护?在某些时候,我们必须面对这些问题。在某些时候,我们必须面对认知计算代理或数字智能比我们更好地理解情绪的可能性。当 AI 能够比我们周围的人更好地理解我们,并且能够比我们最喜欢的导师、医生或同伴更好地指导我们时,我们必须考虑人类可能实际上受益于远远超过我们自己的智能的可能性。与其考虑可能的世界末日场景,也许我们应该考虑在它的帮助下我们可能最终到达的潜在乌托邦,并拥抱这样的智慧。
意识到这一点也许是有用的,我们对这样一个智能体并不构成真正的威胁。这是我们自大的产物,认为我们对一个比我们聪明数倍的实体构成了真正的威胁。如果这种智慧存在,我们可能在相当长的一段时间内都不会意识到它,即使如此,它也不会是一个集体和即时的意识,而是一个渐进的过程,从非常小的规模开始。这可能需要几年,甚至几十年的时间,而且可能永远也不会达到让所有人都直接而明确地意识到它的存在的程度。当我们试图拯救我们心爱的蜜蜂免于灭绝时,我们是否只是抓起蜂巢,向它们宣布我们的存在和意图,希望它们会合作?
超人的智慧,摩尔定律的极限,以及不断提高的计算能力
摩尔定律最基本的说法是,计算机芯片的计算能力每 18 个月翻一番,而它们的尺寸同时减半。因此,每 18 个月,我们就会得到一个新的计算机芯片,体积大约是原来的一半,计算能力是原来的两倍。这不能再继续下去了。在某种程度上,我们达到了最小可行的芯片尺寸,并进入了纳米技术领域。目前的芯片尺寸约为 10 纳米。
一纳米比可见光的波长小,原子的直径大约在 0.1 到 0.5 纳米之间。由于摩尔定律不能无限延续,而且我们几乎已经达到了计算机芯片的最小尺寸的极限,所以要解决的一个主要问题是找到超越这个极限的提高计算能力的方法,而不减小芯片的尺寸。
有两种方法可以做到这一点,一种是量子计算,另一种是信息处理的替代形式和为特定任务设计的专用硬件,如机器学习、神经网络、视觉识别、自动驾驶汽车和图形处理(GPU)。对于已经处于纳米尺度的芯片,也许重新思考我们在其上处理信息的方式以及我们为特定任务构建硬件的方式是合适的,并且考虑量子信息处理可能有利于计算和我们执行复杂计算的能力。
也许通过编写算法,就像它们在量子计算机上运行一样,即拥有基于量子(量子位)的算法,而不是基于经典位的算法,会给我们带来超越经典领域的加速。此外,为这样的算法设计有效运行的硬件是谨慎的。
张量网络计算表明这是一种可行的选择,它可以有效地模拟量子电路和某些量子多体过程。在谷歌的张量处理单元 (TPUs),用他们的 TensorNetwork 库执行计算,相比多核 GPU 计算,可以提供显著的加速(高达 100 倍)。也许计算的未来不仅仅是量子计算机本身,而是替代的计算模型,这些模型是根据量子算法和量子过程设计的。芯片尺寸小于 10 纳米,经典计算真的是我们应该思考的方式吗?此外,在涉及深度神经网络的机器学习中,可以表明“拓扑基态可以由短程神经网络以精确和有效的方式来表示。“此外,学习物质的拓扑状态和提高量子表面代码的性能一直是神经网络表现非常好的任务。为了实现模拟大脑活动和其他难以置信的复杂过程的计算性能,也许我们应该使用张量网络等方法和 TPU 等专门设计的硬件来实现量子信息处理技术。
如果你有想法要分享,有问题,或者你需要量子机器学习的咨询服务,请通过 LinkedIn 联系作者,访问奇点网站,或者查看 Github 教程。
数据能帮助你的书登顶吗?
原文:https://towardsdatascience.com/can-data-help-your-book-shoot-to-the-top-4cfd4e43a2ab?source=collection_archive---------55-----------------------
热门书籍、大数据和《纽约时报》畅销书排行榜
SpaceX 在 Unsplash 上拍摄的
受欢迎程度等同于纽约时报的畅销书排行榜
我最近收到了一位读者的回复,他对《故事的其余部分:迪莉娅·欧文斯和小龙虾在哪里歌唱》没有讨论是什么让这本书如此受欢迎感到失望。那个评论让我想:是什么因素让一本书一飞冲天,走向成功?某些书为什么会受欢迎?
有没有研究可以帮助作者理解一本畅销书的本质特征?数据能帮助作家登上难以捉摸且备受期待的畅销书排行榜吗?
“畅销书”一词源于一个叫查尔斯·里德的人,他是一位英国作家,在 19 世纪中期非常受欢迎并且多产,但是我们今天甚至都没有听说过他。文学评论家约翰·萨瑟兰认为,我们现在不了解查尔斯·里德,因为他是“畅销书”是暂时的这一观点的最佳例证。畅销书只是“一个时代的快照”今天在这里,明天就走了。
首先,你可能想知道“畅销书”的定义到底是什么?
畅销书的定义是一周内卖出 5000 本或更多不同销量的书。术语“多样化”意味着销售必须来自多个来源。换句话说,你不可能在你的私人网站上向你的忠实粉丝卖出五千本书。销售必须来自许多供应商。
有很多畅销书排行榜,但最广为人知的(也是作者最渴望的)是《纽约时报》畅销书排行榜。该列表是根据美国各地供应商提交的销售数字编制的。数据来自独立书店、全国连锁店、报摊、大学、礼品店和超市,以及在线图书零售商。
《纽约时报》畅销书排行榜有其争议,但那是另外一个故事了。至今仍被认为是出版界最厉害的榜单。
几率有多大?
一位数据分析师,阿尔伯特-拉兹洛·巴拉巴斯,评估了数以千计登上 NYT 畅销书排行榜的小说和非小说书籍,他的发现揭示了一些普遍模式。
- 传统上每年出版 100,000 本书。在过去的十年里,只有 800 本小说登上了畅销书排行榜。发行的书籍中只有很小一部分进入了畅销书排行榜。
- 在这 800 本文学小说中,67%是以情节为导向的书籍,分为浪漫、神秘或惊悚类。
- 畅销书排行榜仅由少数作者把持。85%的畅销小说家都有多本书上市。十年间,惊悚小说作家詹姆斯·帕特森出版了 51 本书。
- 对于非小说类出版物,传记和回忆录最有可能登上畅销书排行榜。
- 对于一个非小说类作家来说,在畅销书排行榜上拥有多个头衔要难得多。只有 14%的人知道。
- 登上畅销书排行榜的最好机会是在你的书出版后马上去做。虽然这一发现也有一些例外——最明显的是 The Help 和The craw dads Sing——大多数书籍的销量在发行后立即达到顶峰,并随着时间的推移而下降。
- NYT 书单上只有 8%的书能登上榜首。
- 25%上榜的书籍在一周后会掉价。
- 37%的人在名单上停留超过 4 周。
另一组研究人员给计算机编程,看它们能否预测畅销书。朱迪·阿彻和马修·詹金斯根据他们收集的 20,000 本书并将其分成 500 个类别后的数据,写了一本名为 畅销书代码 的书。他们创造了独特的算法来跟踪情感语言和词汇模式。他们的数据表明
- 大多数成功的小说家都会在他们的书中专注于一两个主题,而不太成功的作家可能会包括 6 个主题。
- 书中的一些主题可能会阻碍销售:吸烟、深深的悲伤和政治革命等等。
- 以丛林、沙漠或海洋为背景的书不如以家庭为背景的书畅销。
- 狗的故事情节比猫的故事情节重要。
数据应该影响作家写的东西吗?
知道这些事实会改变你想写的东西或者你想如何组织你的下一本书吗?你会不会突然开始在每本书里都放一只狗,尽管你自己并没有养狗?你会因为觉得小说可能会卖得更好而把小说的背景从丛林换成公园吗?
没有。写作仍然是一个不受计算机驱动标准约束的职业。不管你写什么,它必须是真实的。按照指定的公式写作会让作者失去快乐,让书失去激情。
数据能根据一本书对读者的无形情感吸引力来预测畅销书吗?算法能理解优美的语言吗?科学家们了解用语言创造普遍经验的影响吗?计算机能检测出完美的节奏或角色的魅力吗?
没有。写作的质量可能是主观的。编辑、代理和评论家从来不会在这些元素上达成一致,那么程序员怎么可能同意创建一个可以检测这些元素的算法呢?
我很欣赏这些推断。他们甚至可能潜移默化地影响我的潜意识。但我是一名作家,从她内心的源泉进行创作,数据并不能驱动我。一本书登上畅销书排行榜将会实现一个梦想,但这种希望并不是我写作的原因。
以登上畅销书排行榜为唯一目的的写作是徒劳的。我敢打赌,大多数作家在痛苦地一页页敲打手稿时,根本不会想到这一点。
我们写作是因为我们“感觉”到了一本书——而不是因为它在某个地方以某种公式被规定了。
弗兰基·查马基在 Unsplash 上拍摄的照片
回到激发我对这个话题兴趣的问题…
是什么让《小龙虾歌唱的地方》飙升至畅销书排行榜并一直保持下去?
Alexandra Alter的《小龙虾歌唱的地方的长尾》对此做了最好的解释:
- 这本书在体裁上没有明确的定义,这一点使得出版商对接受这本书犹豫不决。但事实上,这部小说并不符合规定的书籍“类型”,这变成了一项资产。小龙虾歌唱的地方有多种方式让读者联想到它。它包括一个谜,一场谋杀,一场生存之战,一个成长的故事,以及带有精确植物学草图的丰富的抒情自然写作。
- 这个故事吸引了来自所有政治派别的广大读者
- 这部小说得到了独立书店的大力宣传。
- 瑞茜·威瑟斯彭选择了它作为她读书俱乐部的选择。
- 口碑炒作增加了销量。
- 销售增加了知名度。
奥尔特认为,《小龙虾》成功的部分原因是它表达了我们在现代世界中经常渴望的安静和孤独:它确实如此
“…在技术快速发展和社交媒体不断连接的时代,这是一种奇怪的统一效果。”
《小龙虾歌唱的 T2》的意外成功证明了数据、预测和出版商的预期无法解释人类内心的反应。
数据和研究可能有助于确定畅销书的模式,但“意想不到的”仍然会发生
虽然计算机可以分析成千上万的书籍和数百万的文字,并汇编研究结果,但它们无法解释一个独特的故事或一种“不同”的书以令人惊讶的方式触动读者的意想不到的吸引力。
计算机永远不会预测到小龙虾歌唱的的成功。他们不会想到这部小说会打破典型的模式,即在发行后销量立即达到顶峰,然后开始下滑。相反,它增加了销量,随着人们谈论它和书店推销它,销量成千上万。
一本书对每个人的情感和心理影响是无法用统计数据来分析的。我们会因为一本书而笑、哭、生气或感到痛苦,因为它在灵魂层面上触动了我们,这是我们无法衡量甚至无法预料的。
正如弗朗西斯·威尔逊在她的文章“当哈利遇见五十度灰:是什么让一本书受欢迎”中所言
从《格里沙姆》到《消失的女孩》,畅销书的意义在于,它们重复了我们已经知道的故事,而这些故事已经像沉船一样,深深地沉入了我们的心灵。畅销的书籍是那些把我们带回到童年时代的叙事形态,带回到塑造我们的情节的书籍。
所以你想写一本畅销书?
去吧。祝你好运。
了解畅销书排行榜的模式可能有助于你写一本畅销书。理解这些数据可能会给你一个关于写什么和如何写的内幕消息。
我着迷于数据科学家创造算法来预测流行成功的能力。我尊重开发技术和方法所需的智力,这可能有助于我在我选择的写作职业中前进。
然而……
我想忽略数据,只写我的故事。我要它冲出我的生命之河,咆哮而狂野,无拘无束而自由。我想爱抚它,塑造它,培育它,尊重它,把它推向世界,希望——尽管可能性很小——意想不到的事情会发生,它会奇迹般地飞黄腾达。
不需要数据。
如果你喜欢这个,你会喜欢这些:
[## 故事的其余部分:“迪莉娅·欧文斯和小龙虾歌唱的地方”
写作是如何受经验影响的
medium.com](https://medium.com/literature-lust/the-rest-of-the-story-34f9f057d8a3) [## 关于“博学”你需要知道什么
这是一个有价值但不可能实现的目标
medium.com](https://medium.com/literature-lust/what-you-need-to-know-about-being-well-read-de35adb4a032) [## 关于现在的图书世界,你应该知道的五件事
在你写作或推销之前,看看这些行业统计数据
medium.com](https://medium.com/literature-lust/five-things-you-should-know-about-book-world-now-ce48072f375f)
数据科学能成为我高效锻炼的教练吗?
原文:https://towardsdatascience.com/can-data-science-become-my-trainer-for-efficient-workouts-d62ad533a20b?source=collection_archive---------23-----------------------
我如何使用 Apple Watch、Jupyter 笔记本和 QlikSense 来实现更好的静息心率;相关因果分析;
“我的手表,我的泳镜,我的笔记本电脑,我的规则”——P
“在过去的一年里,我体重增加了近 10 公斤,这都要归功于辛辣的印度食物和海德拉巴的比里亚尼。然而,几个星期前,我下定决心要重新开始锻炼。以前,我花了几个月的时间来健身,却只能看到徒劳的努力和令人心碎的结果。这是我的最后一个作弊日,当我埋头吃新鲜烹制的香辣咖喱鸡时,我突然有了这个想法。
如果我使用 apple watch 的历史数据来确定影响最大的健身程序,并据此制定每周计划,会怎么样?我知道你现在在想什么!私人教练或者好的教练呢?想象一下,如果数据科学最终成为你的教练,通过正确的常规组合来实现更好的健康,会怎么样?"
Apple Watch Series 4 现在是 FDA 批准的 2 类医疗设备,具有跌倒检测和更好的心脏监测功能。健身追踪器将逐渐成为我们健康的“守护者”。现在是我们探索所获得的数据的时候了,而不仅仅是看数字和锻炼圈。为了更好地理解这一分析,让我们来看看一些关键指标(鸣谢:iPhone 健康应用)。
- 步数 —一天中所走的步数。计步器记录任何涉及运动的活动的步数,包括走路、跑步、爬楼梯,甚至是你做日常家务时的运动
- 楼梯段 —一段楼梯被计为大约 3 米(10 英尺)的高度增益(大约 16 级台阶。)
- 游泳姿势——自由泳、仰泳、蛙泳或蝶泳时手部的总动作
- 站立时间 —站立时间代表我们一天中的一个小时,你站着并稍微走动至少一分钟。一个站立小时被分解成几个空闲和站立的实例
- 心率 —你的心脏每天大约跳动 100,000 次,在休息和运动期间加速和减速。你的心率指的是你每分钟心跳多少次。计算为 BPM
- 静息心率 —你的静息心率是在你静止或放松几分钟后测得的每分钟平均心跳次数。一般来说,较低的静息心率表明更有效的心脏功能和更好的心血管健康
- 主动&基础能量 —主动能量是对行走、推轮椅、跳舞、锻炼或做家务等活动中消耗的能量的估计。另一方面,基础能量是对休息时你身体燃烧的卡路里的估计
- 音量 —代表耳机音频的音量,以加权分贝(dB)为单位
- 锻炼时间/所走距离/持续时间 —这些都是我们每天听到的常规。Apple Watch 可以通过例行即骑自行车、跑步、游泳&走路来追踪这些
注意:当你开始使用健身追踪器时,最初的兴奋会让你的锻炼达到峰值。过了一点,身体就习惯了,你就看不到同样程度的卡路里燃烧了。因此,重要的是在更长的时间内分析相同的活动,以了解身体在强度方面的平稳状态。
安迪的追踪器——健康决策板
苹果的健康应用允许你以 XML 格式导出你的健康记录。您可以使用 Python (Jupyter Notebook)处理和操作数据,并使用 QlikSense 等可视化应用程序导入数据,以创建自己的决策板。iPhone 健康应用程序和活动跟踪器都带有仪表盘。这对你做出明智的决定有帮助吗?部分是,部分不是!
你的教练能告诉你如果你多游半个小时或多跑一会儿会发生什么吗?是的,他们可以。标准答案是“你的体能会提高”!但是,如果你只需要一千米的高强度跑步和半小时的游泳就能保持健康,那会怎么样呢?如果听着最佳音量的音乐,走几段楼梯,游一个小时的泳就足够了,那会怎么样?这就是数据科学和机器学习的用武之地。
快照 1:使用 QlikSense Desktop 开发的决策板
作者注: 我用 Marwyk 的代码 把手机健康 App 的 XML 数据转换成结构化格式。运行 Marwyk 的代码创建了多个 CSV 数据集,每个数据集在时间戳级别单独跟踪一个指标(**YYYY-MM-DD hh:MM:ss)。然后我使用 Jupyter Note Book 在一天的水平上争论、操作、清理和总结数据,这形成了我的 分析数据集(ADS)。ADS 用于启动 QlikSense 仪表盘 ,最后进入 OLS 回归模型 ,帮助我理解各种例程的交互。自从我一年半前开始锻炼以来,我可以访问从 3 月 18 日到 5 月 18 日的 3 个月的完整数据。
建立回归模型——向分析我日常工作的潜在 DNA 迈进了一步
什么是线性回归,为什么我们需要线性回归?
多元线性回归用于解释一个连续变量和两个或多个自变量之间的相互作用。在这个例子中,静息心率(健康指标)是我的因变量/连续变量,以及其他因素,如锻炼时间、距离、航班等。是我们的独立变量。我们需要多元回归模型的原因是为了了解和量化多个锻炼因素对健康的综合影响,而不是孤立地看待它们。注意,单独跑步和游泳结合起来对我们健康的影响可能是不同的。多元线性回归帮助我们理解这些相互作用。
让我更多地关注调查结果,而不是谈论提出仪表板或最终模型所涉及的过程。因为我没有每天记录体重,所以我用静息心率来代表我的整体健康状况。我回归了静息心率的其他变量,如步数、锻炼时间、基础能量、游泳持续时间、游泳次数、音量、跑步等。在开发模型时,牢记线性回归的所有五个假设,即线性关系、多元正态性、没有或很少多重共线性、没有自相关和同方差。对数据集进行了缺失值处理和 Z 分数标准化。因为我不会每天执行所有的程序,所以所有缺失的值都被替换为零。我有 90 天的数据,因此我使用 K-Fold 交叉验证技术来获得最终的模型结果。 请注意,这只是初步结果,模型统计数据(R 平方=0.642)仍可改进。
快照 2:包含其他摘要和模型结果的仪表板
为什么我称之为决策委员会?
决策板是仪表板的另一个名称,其中包含关键见解&发现。想象一下看着你手机的内置追踪器。它只是向你展示纯粹的数字和精美的图表。你的数据应该告诉你一个故事,这是我的发现。
- 游泳 vs 跑步?—努力更少,影响更大。如果我游完了跑步机或正常跑步距离的三分之一,我会看到类似的卡路里燃烧(参考快照 1)
- 我应该控制我的音量吗?—是的,但可能是在周一和周二,我观察到全天的音量变化较大。了解我们暴露在嘈杂音频中的时间有多长是有帮助的,因为这会影响我们的听力和整体健康(参考快照 2)
- 我的目标在哪里?——在锻炼方面低于标准。 与锻炼 相比,步数没有太大影响(见模型结果),锻炼可以显著提高我的静息心率。大多数时候,我的运动量都比我的目标少(参考截图 2)
- 什么最适合我的身材? —确保有足够的站立时间。我们大部分时间都无所事事地坐在笔记本电脑前。确保每小时快走一分钟(参考快照 2 的模型结果)。与跑步相比,游泳作为一种独立的日常活动对静息心率有更好的影响。然而,当两者都做的时候,确保例行程序被均匀地分开,因为它们在一起不会压倒另一个
后续步骤
- 更好地理解参数相互作用,以及按时间间隔(如上午、下午和晚上)分解参数是否会改善模型结果
- 调查其他可追溯的因素,如会议时间、社交媒体聊天时间、工作时间等。并将它们作为独立变量
- 由于较高的自相关性,很少变量被遗漏。像 PCA 这样的降维技术有用吗?
- 向仪表板中的运行状况 KPI 添加目标指标
我希望你觉得这是有用的。我目前正利用这些结果来计划我的日常活动,主要集中在一小时的游泳和一些初始热身跑上。我养成了提高站立时间的习惯,将空闲时间减少了 2 个百分点。在未来的日子里,数据科学将对医疗保健行业产生更大的影响。我坚信我的分析只是一切可能的开始。如果您想在这个分析上进一步合作,或者想重用代码片段并改进模型结果,请随时给我留言。
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
数据科学能帮助我们找到是什么造就了一部热门电视剧吗?
原文:https://towardsdatascience.com/can-data-science-help-us-find-what-makes-a-hit-television-show-861d103c6e44?source=collection_archive---------36-----------------------
使用 Keras-Tensorflow-LSTM、沃森 NLU 和沃森个性洞察对谈话记录进行文本分析。
照片由乔纳斯·雅各布森在 Unsplash 上拍摄
我最近在洛杉矶的数据科学沙龙上谈到了从情景喜剧脚本中获得属性,以及确定学习制作一部流行电视节目的本质的可能性。这篇文章将介绍所进行的调查,以及我在神经网络训练以及利用预先训练的沃森 NLU 和人格洞察模型后得到的结果。旅程中最具挑战性的部分是通过在互联网上随机搜索这些节目的公开网络记录来准备数据。
洛杉矶数据科学沙龙,2019 年关于“数据科学能帮助我们找到什么是热门电视节目吗?”
一般来说,我通过询问许多基于直觉领域的问题来处理数据科学项目,寻求专家的反馈,并添加/修改我的问卷。逆向工作让我知道我的成功标准,除非我确信结果,否则我会继续迭代更好的问题、模型和更好/更多的数据。请注意,令人信服的结果绝不意味着得到与我的期望一致的结果。我们做数据科学是为了调查导致事实的因素,然后使用这些属性作为基本事实进行预测,而不是相反。这是一门基于科学的艺术。
在做这个项目的时候,我也写了两篇文章这里和这里。
在这里,我提出了以下问题
什么构成了热门电视节目?
1.是各个角色说话和行为方式的一致性吗?
2.是在不同的地点重复拍摄,从而让你的观众觉得随着时间的推移他们了解这个地方吗?
3.是不同角色说话和行为方式的相似/不同?
4.是快乐、悲伤、恐惧、愤怒、厌恶等情绪的平衡分布吗?这让节目变得有趣。
5.是人物性格的相似/不同让观众保持联系吗?
6.是有趣的倒叙吸引了观众吗?
我将逐一回答这些问题。显然还会有更多的问题,这就是为什么在开始任何数据科学项目之前,必须寻求/研究领域专家的反馈,以确认您问的是正确的问题集。
对于这个分析,我计划使用以下三个节目——《老友记》、《生活大爆炸》和《绝命毒师》,我认为这将为分析创造一个公平的组合。
0.数据可用性
在广泛搜索互联网后,我从以下网址获得了 html 脚本。
- 老友记—【https://fangj.github.io/friends/】T2—10 季
- 《生活大爆炸》——【https://bigbangtrans.wordpress.com/】T4——10/12 季
- 绝命毒师—https://en.wikiquote.org/wiki/Breaking_Bad—5 季(数据缺失)
以下是这些抄本的样本。
下面是一个简单的例子,说明了我是如何从上面的链接中获得的原始 html 脚本中准备用于建模的数据集的。
情景喜剧数据集的数据工程
请注意,我只是将这里的 html 内容复制到。txt 文件。我们甚至可以使用网页抓取来代替复制+粘贴。但是,请记住,在抓取网页之前,我们可能需要授权。运行上述步骤后,我为每个情景喜剧准备好了数据集,可以用于建模。创建的数据集中的一个示例如下所示。
我花了很大力气来生成这些数据集。所以,我把它们上传到 Kaggle 上,以便感兴趣的人使用。可以找到朋友、生活大爆炸、绝命毒师的数据集。
每个情景喜剧的数据准备和工程代码可以在这里单独找到。
1.沃森自然语言理解(NLU)用于字符的情感检测
我正在使用沃森自然语言理解(NLU)的字符情感检测。自然语言理解是通过自然语言处理提供文本分析的 API 的集合。这组 API 可以分析文本,帮助您理解它的概念、实体、关键字、情感等等。自然语言处理的核心是文本分类。沃森自然语言分类器(NLC)允许用户将文本大规模分类到自定义类别中。NLC 结合了各种先进的 ML 技术来提供尽可能高的精度,而不需要大量的训练数据。在幕后,NLC 利用分类模型的集合,以及无监督和有监督的学习技术来实现其准确性水平。在你的训练数据被收集后,NLC 使用 IBM 的深度学习即服务(DLaaS) 针对多个支持向量机(SVMs)和一个卷积神经网络(CNN)评估你的数据。在这里可以找到对应于第 1、2、3 段的每个情景喜剧的代码。
1.1.美国国防科学技术研究所。
1.2.生活大爆炸理论
1.3.绝命毒师
2.人物的情商
我引入了一个变量‘情商’来了解相对于节目中的其他情绪,哪种情绪是最突出的。我把它定义为:
Individual_Emotion_Quotient = Individual_Emotion_Score/Total_Emotion_Score
以下是个人情商的散点图结果。
2.1.美国国防科学技术研究所。
*We can infer that Happiness and Sadness are the key emotions of the Characters on Friends.*
2.2.生活大爆炸理论
We can infer that Happiness is most dominant emotion of the Characters on the Big Bang Theory.
2.3.绝命毒师
We can infer that Sadness and Anger are the key emotions of the Characters on The Breaking Bad.
代码可以在这里找到。
3.人物的情感密度
饼状图很好地展示了分布情况,这显然有助于生动地理解甚至很小的百分比差异。
3.1.美国国防科学技术研究所。
All the Characters are biased towards joy and sadness on Friends.
3.2.生活大爆炸理论
All the Characters are biased towards sadness on The Big Bang Theory.
3.3.绝命毒师
All the Characters are biased towards sadness and anger on The Breaking Bad.
4.沃森人格洞察力(WPI)用于人物的人格调查
我在用人格洞察,通过文字来预测人格特征、需求和价值观。IBM Watson Personality Insights 服务使用语言分析从一个人通过博客、推文、论坛帖子等生成的文本数据中提取一系列认知和社会特征。沃森发现特朗普“爱吵闹”。我会把它用在剧本上,以了解每个角色的个性。第 4 段和第 5 段的每部情景喜剧对应的代码可以在这里找到。
图片来源:https://www.ibm.com/cloud/watson-personality-insights
我主要关注 WPI 的五大结果,定义如下。
- 对他人富有同情心和合作精神。
- 有组织的或深思熟虑的行动。
- 外向在他人的陪伴下寻求刺激。
- 情绪范围一个人的情绪对其所处环境的敏感程度。
- 一个人对体验不同活动的开放程度。
4.1.美国国防科学技术研究所。
《老友记》里所有角色的性格看起来都差不多。
4.2.生活大爆炸理论
《生活大爆炸》中所有角色的性格看起来都很相似。
4.3.绝命毒师
《绝命毒师》中所有角色的性格看起来并不十分相似。
5.人物的个性密度
5.1.美国国防科学技术研究所。
《老友记》中所有角色的性格都有类似的属性分布。
5.2.生活大爆炸理论
《生活大爆炸》中所有角色的性格都有相似的属性分布。
5.3.绝命毒师
所有角色的个性都有相似的属性分布。
6.热门拍摄地点
我们经常注意到一些节目在相同的地点重复拍摄。例如,当我们想到朋友时,我们脑海中的画面往往是在中央公园或莫妮卡或钱德勒的公寓。对于《生活大爆炸》,我们想到的是莱纳德和谢尔顿的公寓。所以,我想,为什么不找出这些节目的前五个地点,并推断/发现其中的潜在策略。第 6 节的代码可以在这里找到。
6.1.美国国防科学技术研究所。
朋友们在事情发生的地方没有太多的变化。成功地吸引了观众。
6.2.生活大爆炸理论
大爆炸理论在它发生的地方没有太多的变化。成功地吸引了观众。
6.3.绝命毒师
我没有《绝命毒师》的数据来绘制这个时候的热门地点。
7.区分彼此的字符
我正在使用神经网络(keras-tensorflow)来识别彼此不同的字符。在这里可以找到第 7 段每部情景喜剧对应的代码。
混淆矩阵绘制如下。
7.1.美国国防科学技术研究所。
《老友记》上的人物差别很大,彼此可以辨认。
7.2.生活大爆炸理论
《生活大爆炸》中的角色非常相似,除了谢尔顿之外,彼此无法辨认。
7.3.绝命毒师
《绝命毒师》中的角色非常相似,除了沃尔特之外,彼此无法辨认。
8.角色交流方式的一致性
8.1.美国国防科学技术研究所。
没错。他们大多是这样
8.2.生活大爆炸理论
没错。他们有
8.3.绝命毒师
大多数情况下,他们会。沃尔特表现出矛盾是因为他的另一个角色——海森堡
在这里可以找到 8 的每部情景喜剧对应的代码。
9.我们现在知道是什么让情景喜剧受欢迎了吗?
让我们一个接一个地看看最初提出的每个问题。
问:是因为各个角色说话和行为的一致性吗?
A.我们可以推断出这一点,因为所有三个受欢迎的节目都在他们的分析中反映了这一点。
问:是在不同地点重复拍摄,从而让你的观众觉得他们知道这个地方吗?
A.是的,这两部剧《神盾局》和《生活大爆炸》都证实了这一点。不幸的是,我找不到《绝命毒师》的位置数据。
问:是不同角色说话和行为方式的相似/不同吗?
A.它们可以非常相似,也可以不同。我们在这三场演出中观察到的混淆矩阵中没有得到确凿的证据。
问:是快乐、悲伤、恐惧、愤怒和厌恶等情绪的均衡分布让一部电视剧变得有趣吗?
A.是的,沃森 NLU 对三个节目输入的结果证实了这一点。
问:是角色相似/不同的个性让观众保持联系吗?
A.结果显示,显然是个性的相似性在这里胜出。
问:是有趣的倒叙吸引了观众吗?
A.不幸的是,“闪回”这个词没有出现在记录中,所以无法分析。
10.这一分析给节目制作人带来的启示很少
如果你有幸让一部电视剧持续很长时间,试着在每集中让每个角色的言语和行为保持一致。"
在拍摄地点的集合中,应该有最小方差。这将向观众灌输对情景喜剧的环境和文化的归属感。
情景喜剧中人物的性格应该融合在一起,正如性格洞察结果所强调的。
情绪的分布都倾向于某个特定的情绪。F.R.I.E.N.D.S .主要展示快乐和悲伤;《生活大爆炸》也倾向于快乐和悲伤。《绝命毒师》是一部充满愤怒和悲伤的电视剧。关键是在一段时间内保持节目的情商连贯。
只要满足上述标准,字符可以彼此不同或相似。
11.最受欢迎的角色
最后,我想看看这三部电视剧中最受欢迎的角色以及他们的性格特征。
评论
在我演讲的问答环节,我得到了一些有趣的问题和评论,如下。
问:如果我们使用计算机视觉技术添加面部表情分析,结果将如何改善/增强?
A.如果有时间,我很想尝试一下,或者如果有人尝试了,请分享结果:)。
问:《权力的游戏》在多个地点拍摄?这些结果如何证明这一点呢?
A.我同意它是在几个地方拍摄的,但最主要的还是像维斯特洛、临冬城等少数地方。所以,结果看起来是一致的。
问:如果这部剧是在现场观众面前拍摄的,会有什么不同?
A.我相信这会积极地影响节目,因为喜欢和快乐是很有感染力的。如果我看到观众笑着欣赏,肯定会对内容产生兴趣。
我在这里遵循的方法是一种理解导致热门电视节目的因素的方法。也可以有替代的方法。因为我在这里有很多可视化结果,所以后端动态支持的仪表板表示是我很想尽快做的事情。
经济正义可以是色盲吗?
原文:https://towardsdatascience.com/can-economic-justice-be-colorblind-2c2609740ab2?source=collection_archive---------62-----------------------
公平的机器学习可以揭示借贷中的制度种族主义
乔治·弗洛伊德的死迫使我们每个人去思考难题。对我来说,这个问题是我作为数据科学家在贷款领域的工作以及我在该行业看到的制度性种族主义的良心。我从来没有公开写过,因为我觉得这对我的生活和家庭来说风险太大了。但是 MLK 的一句名言让我振作起来…
“我几乎得出了一个令人遗憾的结论,黑人走向自由的最大绊脚石不是白人公民议员或 Ku 三 k 党,而是白人温和派,他们更致力于“秩序”而不是正义;谁喜欢没有紧张的消极和平,而不喜欢存在正义的积极和平”
十多年前,我第一次调查了贷款中的歧视。从那以后,我想了很多,也谈了很多,但总是闭门造车。我一直觉得在行业内进行建设性的工作是正确的道路。尽管我在贷款歧视这个话题上花了很多笔墨,但我没有任何实质性的进展可以展示。现在我怀疑我是不是白人温和派。现在我想知道,我在公开场合的沉默是否不是为了在借贷生态系统中建立信任,而是为了让我自己和我的同事免受承认在我们自己的时间线内以让我们感到安全的方式解决种族主义是不公正的紧张和不安。现在我想我需要回答一些令人不舒服的问题…如果只是为了我自己。
为什么不谈借贷歧视?
尽管有公平贷款法和监管机构,但似乎几乎没有任何关于贷款歧视的建设性言论。尽管我应该记住,与美国的历史相比,我在借贷方面的经验还很短。在这段历史中,贷款领域存在两种重要的歧视:
- 故意歧视——贷方称之为不同的待遇
- 无意的歧视——贷方称之为完全不同的影响
在 19 世纪晚期,第一批征信机构具有很强的歧视性,当时贷款被视为一种道德义务。别管是不是黑人——你可能不会因为是天主教徒而获得贷款。在 1900 年代早期,贷款和房屋所有权对于大多数美国黑人来说是不可能的,即使是在北方和 T2,其影响至今仍在回响。在次贷危机之前,划红线并不是一种罕见的做法,关于危机原因和社区再投资法案影响的神话一直延续到今天。蓄意歧视,无论是公开歧视还是区别对待,都是美国贷款的历史。
经过次贷危机后的改革,比如消费者金融保护局(CFPB)的建立,我认为情况有所改善。在已经提出的许多不同的关于公平的算法定义中,我认为最能描述当今借贷中所发生的事情的是通过无意识的公平:如果一个模型或政策没有明确地使用受保护的类数据,那么它就是公平的。除此之外还有其他限制,例如,地理数据由于与种族相关而很少被使用,但称之为“无知的公平”是一种相当准确的简化。征信机构不接受关于种族、民族、性别或其他受保护类别的信息,贷方也不收集这些信息,但《住房抵押贷款披露法案》(HMDA)规定的情况除外。结合向基于统计/机器学习模型的承销和在线贷款的过渡,这是朝着正确方向迈出的一大步。好的贷款人和好的机构采取预防措施,竭力避免受保护的类别数据,这使得人们很容易认为,现在贷款中的有意歧视可能比美国历史上任何时候都要少。问题是,所有这些对种族问题视而不见的努力并没有带来公平的结果。
调查报告中心进行了一项研究,表明黑人抵押贷款申请人比白人申请人获得批准的可能性小得多。如果不存在故意歧视,我们是如何形成这种现状的?罪魁祸首是无意的歧视,或完全不同的影响。从 2018 年开始,多德-弗兰克法案修订了 HMDA 的数据收集规则,以一个非常好的理由纳入信用评分。信贷数据与贷款审批和定价结果密切相关。如今,歧视主要通过结构性不平等进入贷款领域。顾名思义,弱势群体的社会经济地位较低。他们的信用评分更差,赚钱更少,资产更少,社交网络财富更少,更有可能被推入掠夺性信贷产品。所有这些因素都增加了未来出现财务困难的可能性,而违约的可能性推动了贷款人在审批和定价方面的决策。这就是在贷款中产生制度性种族主义的循环。安全的信贷创造杠杆和经济优势。没有信贷,或者更糟糕的是掠夺性信贷,会造成债务和经济劣势的循环。一旦你变穷了,想要追上来就越来越难了。
合乎逻辑的回应是,有关种族的信息应该被纳入贷款决策,以对历史歧视做出赔偿,但在当前法律下这是不可能的。即使我不同情贷款人,但现实是他们面临着一个无法取胜的第 22 条军规。不同的待遇是非法的:不能基于种族做出借贷决定。不同的影响是非法的:受保护的类不能有不利的结果。
这就是为什么很难就借贷中的歧视进行有意义的对话:
- 消费者、贷款人和监管者的风险都很高。我们都害怕可能会失去的东西。
- 没有公开的数据。除了 HMDA 的数据,我们没有共同的标准来讨论歧视的程度、原因或代价。
- 监管者已经准备好停止故意歧视。他们缺乏有效识别不同影响的数据、工具和资源。
- 监管机构将贷款人置于一个矛盾的境地。不同的待遇和不同的影响是相互矛盾的。如何证明不同影响的业务必要性在最好的情况下是模糊的,在最坏的情况下可能是完全无法证明的。
- 消费者的可见性和反馈有限。消费者很难知道自己是否是受害者,也很难做出明智的决定,与反种族主义的贷方合作。
最重要的是贷方之间的竞争态势。正如弗兰克·罗特曼所阐述的那样,能够为消费者提供稍微好一点的贷款产品会有丰厚的回报。这是在风险预测中寻求每一个可能的优势的巨大激励——即使以歧视为代价。贷方为错误的事情优化。只要稍微改变一下规则,就能获得同样健康且有利可图的业务。公平机器学习的最新进展显示了为美国黑人开启经济正义良性循环的清晰而直接的方式。
如何实现经济正义?
面对警察的暴行,我不知道如何创造积极的和平。不知道今天在美国当黑人是什么感觉。但是当我看到一个数据科学问题时,我知道这个问题是可以解决的。
我们需要一个能做三件事的解决方案:促进弱势群体的经济正义,对贷款人的风险厌恶和利润要求持现实态度,与监管机构保护消费者和服务法律的使命保持一致。这决定了 4 个艰难但简单的目标:
- 定义公平
- 收集受保护的类数据
- 在沙盒中测试公平的机器学习
- 资助反对结构性不平等的斗争
定义公平
有 good 调查比较不同定义的公平和马丁瓦滕伯格等人。艾尔。想象一下这些指标的子集在实践中是如何工作的。
马丁·瓦滕伯格谈通过 Twitter 贷款的公平性
我发现最干净的定义是反事实公平,这是一个概念,如果消费者属于优势群体,结果应该是相同的。用图形因果模型表示的问题是这样的:
贷款歧视的因果图(Jason Capehart,2020 年)
种族直接影响个人的属性,如收入、债务和信用记录。未解决的歧视是种族对结果的直接影响,也是我们想要避免的。然而,当它进入正题时,定义的选择并不重要。重要的是,我们为公平选择一个客观的定义,并衡量它。
收集受保护的类数据
虽然贝叶斯改进的姓氏地理编码 (BISG)是一个伟大的想法和伟大的工具,但它一直是廉价出售和怀疑的目标,无论这是多么不公平。直接收集数据提供了透明度,可以建立信任。HMDA 的数据收集要求提供了一个简单的解决方案,非抵押贷款机构可以遵循,征信机构可以汇总。受保护类别数据的集中存储反过来可以使监管机构更容易评估贷款人的活动。
在沙盒中测试公平的机器学习
像这样的努力是 CFPB 创建沙盒与金融服务合作的原因。致力于技术能力公平的贷款人可以引领一条通往更美好未来的道路,并找出如何让这些原则在实践中发挥作用。例如,几名研究人员指出,在学习公平陈述中存在固有的权衡。任何贷款人都有必要首先将公平模式与传统模式结合起来,以理解风险和批准之间的权衡。毫无疑问,在前进的道路上会有意想不到的挑战。
这种投资对贷款人来说可能看起来像是硬推销——但这不应该,因为这符合他们赚钱的方式。除了少数例外,贷款人都是风险厌恶者,不想通过突破合规、法律或公共关系的界限来赚钱。能够进行不同影响分析的第三方法律咨询公司并不便宜。捍卫行业利益的游说者并不便宜,来自监管机构的罚款或让品牌看起来有社会意识的公关努力也不便宜。对苹果卡在信用额度分配中潜在性别歧视的调查充分说明了这一点。这些都是令人头疼的问题,大多数贷款人都希望有一个简单的方法来解决。
资助反对结构性不平等的斗争
没有机器学习技巧可以消除 250 年的不平等。但是,对歧视的认识为解决歧视,包括干预提供了新的机会。考虑到承认种族的自由,贷款人自然应该在揭露由于数据中的历史偏见而造成的歧视方面做得很好,因为这个过程类似于开发一个新的细分市场。
一些贷款将是无利可图的,超出了贷款人的承诺,但对于由于结构性不平等导致的边际下降,有可能建立创造性的伙伴关系。例如,人们可以想象像国家社区再投资联盟这样的组织或政府项目与贷款人的资本合作,只为贷款给他们支持的社区成员的“超额风险”提供资金。
承认不平等的存在可以解放我们去做以前不可能的事情。
放弃
本文中表达的观点和意见是作者的观点和意见,并不反映作者过去或现在的任何雇主、合作者或商业伙伴的观点、政策或立场。
电力消耗能告诉我们关于疫情的任何事情吗?
原文:https://towardsdatascience.com/can-electricity-consumption-tell-us-anything-about-the-pandemic-f4147c676f51?source=collection_archive---------49-----------------------
分析澳大利亚维多利亚州的电力数据,探索疫情对其电力消耗的影响。
Alessandro Di Credico 在 Unsplash 上拍摄的照片
2020 年 3 月,新冠肺炎抵达澳大利亚,并导致全国范围的封锁。这意味着我们大多数人的家、工厂、餐馆、学校、公共场所都关闭了。这种封锁无疑影响了我们的世界以前运行的几种方式,但我们的世界运行的一个关键部分是:电。
发生了什么事?第一个想法是,我们一定看到了电力消耗的减少。该研究试图简要回答两个问题,并基于 AEMO 记录的维多利亚时期的电力消耗:
1.新冠肺炎对我们的用电方式产生了怎样的影响?
2.传统模型还能很好地预测和预报我们未来的消费需求吗?
新冠肺炎影响了我们用电的方式吗?
图 1(作者图片)
图 1(作者图片)
是也不是。
从图 1 可以看出,维多利亚州的用电量没有明显变化。低谷和高峰主要归因于天气。例如,7 月的高峰是由于供暖的使用增加,7 月是一年中最冷的月份。
然而,从图 2 中可以看出,与其他年份相比,在过去的九个月中,从每小时的角度来看,电力需求发生了变化,或者说是显著下降。这个时间窗口是早上 8 点到下午 5 点,这是自然光透过我们家窗户渗入的办公时间。
这些想象可以在的画面上找到。
现在,真正的问题是。
传统模型还能很好地预测和预报我们未来的消费需求吗?
我们消耗电力的方式取决于几个因素,如天气、商业周期、星期几,在这里,我们试图了解封锁是否对这种消耗有影响。在为这项研究建立模型时,考虑了以下因素——每月时间序列(从 2015 年到 2020 年),这些月份的平均温度和代表我们是否处于锁定状态的分类变量。
我尝试了 ETS、ARIMA、线性回归、动态回归等一系列时间序列预测方法来预测 2020 年的消费量。这些模型中的大多数表现相同,在模型精度方面有小的变化。
相对优于其他模型的模型是具有平均温度和 ARIMA 误差的时间序列线性模型。我使用 2015 年 1 月至 2020 年 2 月的数据训练了模型,并对 2020 年 3 月至 2020 年 9 月(维多利亚被封锁的几个月)进行了预测。这个模型的更多细节可以在这里找到,这是预测的样子。
图 3(作者图片)
结论
那么,关于疫情和电力消耗,所有这些告诉了我们什么呢?
好吧,至少在维多利亚州,在过去的五年里,维多利亚州的电力消耗一直呈下降趋势,由于疫情,这 2%的下降是不难预测的。工业、办公室和商业用电现在被重新引向我们的家庭。
然而,在一天的办公时间内可以观察到一个不同之处,即在封锁的几个月中,电力消耗显著下降。如果我们能建立一个模型,将此作为一个因素,这可能是一个改进的空间。
你可以在我的 GitHub repo 上找到代码和更多细节。
谷歌的移动报告能解释新西兰战胜病毒的原因吗?
原文:https://towardsdatascience.com/can-googles-mobility-report-explain-new-zealand-s-win-against-the-virus-9e036ace0a2?source=collection_archive---------49-----------------------
对疫情早期社会距离和锁定政策的数据驱动分析。
罗曼·科斯特在 Unsplash 上拍摄的照片
经过几个月不安的封锁,欧洲已经慢慢开始开放,这让我希望最坏的情况已经过去。在家工作和与朋友的虚拟葡萄酒之夜已经成为新的“常态”。这些措施已经付诸实施,以加强物理距离,并最终减缓致命病毒的传播。
在这篇文章中,我们将直观地展示政府实施的政策对公民流动性的影响。
这些政策在减少人口流动方面的效果如何?对人们的生活、工作和移动方式产生了什么影响?
数据集(又名谷歌移动报告)
谷歌推出了使用从谷歌地图等应用程序收集的匿名数据的新冠肺炎社区流动性报告。这个数据集由谷歌自己定期更新,可以在这里找到。用于本分析的最新日期是 5 月 24 日。
在谷歌的研究中已经确定了目的地的具体类别,并且他们已经测量了这些目的地的游客数量。然后将每天的访问次数与基线日(选择为疫情前的平均日)进行比较。
- 杂货店
- 药房
- 在家度过的时间
什么是基准日?
基线日是“正常的一天”(不是假日、体育赛事、情人节、圣帕特里克节等)。基准日为一周中的某一天提供了可靠的客观值。这意味着我们有一个人们在周一、周二、周三、周五、周六和周日去杂货店的基线值。
为什么基线值很重要?
例如,创建基线日是区分周末和工作日的一个聪明的方法。我通常在周末去杂货店购物,而不是在星期二。我怀疑我并不孤单。
在西班牙、法国或比利时,超市周日不开门,基线值将低于所有商店都开门营业的国家。
可视化
数据显示在百分比变化中,这可以是正的(当到达目的地的流动性增加时)或负的(当流动性减少时)。
choropleth 地图是一种专题地图,其中各区域按照代表每个区域内地理特征汇总的统计变量的比例进行着色。
此外,我选择使用一个线图来描绘受病毒影响特别严重的四个国家的流动性变化:美国、巴西和英国。我还加上了新西兰,因为他们最近根除了最后一例冠状病毒。印象深刻!
1。走访零售店
零售和娱乐:自疫情开始以来,零售商和娱乐中心的游客数量有什么变化?
下图显示了与基线值相比,迁移率的百分比变化。
可以做出一些观察:
- 3 月 15 日是 mainland China 境外记录的冠状病毒病例多于境内的第一天。这引发了本研究中所有国家人口流动模式的变化。
- 与基线值相比,流动性变化最显著的国家是新西兰。他们减少了 90%的店铺访问量!比其他任何国家都多。
- **需要注意的是,从 4 月 12 日开始,美国的商店访问量n 呈上升趋势。
这是什么意思?
照片由斯凯勒杰拉尔德在 Unsplash 上拍摄
在 3 月 29 日达到顶峰的行为剧变之后,美国人允许自己去越来越多的零售店。相比之下,英国的商店访问量持续下降,在 3 月 29 日达到最低,但在整个隔离期间,商店访问量一直保持不变。
2.对药店的访问
从下图可以看出,与基线相比,不同国家去药店的次数差异很大。对于美国来说,访问数量的变化在 3 月 22 日从正转变为负。这一天,冠状病毒病例数为 26747 例,超过了西班牙、伊朗和德国等国家。这使它们成为世界上受影响第三大的国家。
新西兰再次位于图表顶部,变化百分比最高,这意味着新西兰人去药店的次数最少。
3.锁定——在家度过的时间
注意:与前两个图表不同,这里的百分比是正数,它们在中显示了在家时间的增加(之前我们谈论的是去商店或药店的次数减少)。
可以进行一些观察:
- 美国是第一个实施呆在家里的政策的国家,但是这仅仅意味着在家的时间比基准日多 15 -20%。在 4 月和 5 月,这一比例下降到 5 -15%。这与之前的观察结果一致,因为在此期间,商店和药店的访问量增加了。
- 令人惊讶的是,美国的行为与巴西非常相似。
- 新西兰是最后一个实施居家政策的国家,但他们的变化最大,居家时间平均增加了 35%。这一数值一直保持不变,直到 5 月初政府允许更多的行动自由。
从谷歌移动性报告提供的信息中可以得出更多的见解。本文只是一个初步的评价。更多更新即将到来,请在下面评论您希望在即将到来的更新中看到您的原籍国或居住地。
代码
*# Import libraries
import numpy as np
import pandas as pd
import plotly as py
import plotly.express as px
import plotly.graph_objs as go
from plotly.subplots import make_subplots
from tabulate import tabulate
# Read Data
df = pd.read_csv("data/Global_Mobility_Report.csv"**,** low_memory=False)
# Rename columns
df = df.rename(columns={'country_region':'Country'})
df = df.rename(columns={'date':'Date'})
df = df.rename(columns={'retail_and_recreation_percent_change_from_baseline':'retail'})
df = df.rename(columns={'grocery_and_pharmacy_percent_change_from_baseline':'pharmacy'})
df = df.rename(columns={'parks_percent_change_from_baseline':'parks'})
df = df.rename(columns={'transit_stations_percent_change_from_baseline':'transit_station'})
df = df.rename(columns={'workplaces_percent_change_from_baseline':'workplaces'})
df = df.rename(columns={'residential_percent_change_from_baseline':'residential'})
df.drop(['country_region_code'**,**'sub_region_1'**,** 'sub_region_2']**,** axis=**1,** inplace = True)
print(tabulate(df[**20000**:**20050**]**,** headers='keys'**,** tablefmt='psql'))
# Manipulate Dataframe
df_countries = df.groupby(['Country'**,** 'Date']).sum().reset_index().sort_values('Date'**,** ascending=False)
df_countries = df_countries.drop_duplicates(subset = ['Country'])
# Manipulating the original dataframe
df_countrydate = df
df_countrydate = df_countrydate.groupby(['Date'**,**'Country']).sum().reset_index()
min_cases = df_countrydate['residential'].min()
df_country = df.groupby(['Country'**,**'Date']).sum().reset_index()
c2 = df_country[df_country['Country']=="New Zealand"]
c3 = df_country[df_country['Country']=="Brazil"]
c4 = df_country[df_country['Country']=="United Kingdom"]
c5 = df_country[df_country['Country']=="United States"]
frames = [c2**,** c3**,** c4**,** c5]
countries = pd.concat(frames)
fig = px.line(countries**,** x="Date"**,** y="pharmacy"**,** title='pharmacy'**,** color = 'Country')
# fig.show()
fig = px.choropleth(df_countrydate**,** locations="Country"**,** locationmode="country names"**,** color="retail"**,** hover_name="Country"**,** animation_frame="Date"**,** # range_color=(0, 20000),
range_color=(-**500, 500**)**,** color_continuous_scale=px.colors.diverging.Picnic**,** color_continuous_midpoint=min_cases**,** )
fig.update_layout(
title_text='Stay at home (quarantine) during coronavirus pandemic'**,** title_x=**0.5,** geo=dict(
showframe=False**,** showcoastlines=False**,** ))
# fig.show()*
Github 知识库
所有代码都可以在 Github 上的 world_covid.py 文件中找到这里!
非常感谢你的阅读!
如果你喜欢我的作品,如果你能在这里跟随我,我将不胜感激。
如果您对如何改进有任何问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。
人类能信任 AI 吗?
原文:https://towardsdatascience.com/can-humanity-trust-ai-b1e0fa7b024d?source=collection_archive---------76-----------------------
如果说数字伦理不是什么新鲜事,那么每一代信息技术都在放大开发人类智慧的伦理挑战
照片由 h. heyerlein 在 Unsplash 上拍摄
随着人工智能在商业和社会中的应用变得更加雄心勃勃,数字伦理已经成为个人和政府越来越关注的问题。伦理与一系列社会习俗有关,这些习俗发展了“我们批判性思考道德价值的能力,并根据这些价值指导我们的行动”。【我】数字伦理的特殊性是什么,这些考虑与一般的伦理有什么不同?这些担忧与其说是种类问题,不如说是程度问题,因为每一代新的信息技术都给人类带来越来越突出的挑战。在这篇简短的文章中,我们调查了有助于构建当前辩论的四个关键问题的起源。
AI 能理解人类的价值观吗?
第二次世界大战结束后,诺伯特·维纳在控制论方面的工作集中在人类能在多大程度上信任自动化的问题上。在研究反导弹通信系统的过程中,维纳对人类和机器的通信和控制系统之间的相互依赖性产生了兴趣。尽管他是发展自动化的强烈倡导者,但他在《人类对人类的利用》中的文章表达了对人类的非人化和从属地位的日益担忧。他特别概述了将决策托付给不能抽象推理的计算机程序的危险,因此很可能无法理解人类价值的本质。
[## 《诺伯特·维纳人类利用人类》全文
这是我们这个时代的基本文件之一,这个时代的特点是…
archive.org](https://archive.org/stream/NorbertWienerHumanUseOfHumanBeings/NorbertWienerHuman_use_of_human_beings_djvu.txt)
信息技术会产生新的伦理问题吗?
30 年后,医学教授兼研究员沃尔特·曼纳(Walter Maner)创造了“计算机伦理”一词来描述“计算机技术加剧、改变或创造的”伦理问题。在关注因使用计算机技术而产生的伦理决策的特殊性时,他认为计算机应用与以前的技术创新有着根本的不同,因为它们的设计、复杂性和可延展性允许它们应用于无数的领域。他认为,每当政府和社会觉得技术创新落后时,由此产生的伦理决定往往不得不在政策真空中做出。他进一步指出,在讨论计算机技术时,伦理困境的性质和范围经常被扭曲。他得出结论,计算机参与人类行为会产生全新的伦理问题。
科技可以被编程来模仿人类吗?
信息技术本质上在伦理上是中立的,还是它的使用会产生伦理后果?在他四十年前的开创性文章《什么是计算机伦理?James Moor 总结了他对技术的伦理足迹的想法。他认为,至少,计算机是程序和算法的伦理影响因素,挑战了人性,不管这是不是有意的。他预见到计算机可以被编程为隐含的道德代理,换句话说,人类可以选择监管信息技术以避免不道德的结果。他还提出了一种更具挑战性的可能性,即利用编程后的算法,将计算机创造成明确的道德代理人,从而按照道德规范行事。最后,他设想了一个全伦理代理人的世界,在这个世界里,机器将能够阐明与人类相容的伦理选择。
[## 什么是计算机伦理?*
点击文章标题阅读更多内容。
onlinelibrary.wiley.com](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1467-9973.1985.tb00173.x)
如今的数字伦理是道德行为的代表吗?
如果人工智能完全是关于环境的,那么环境是如何影响我们对伦理的看法的?Krystyna Górniak-Kocikowska 对伦理学辩论的主要贡献被称为 Górniak 假说:计算机伦理学是应用伦理学的未来,并将很快成为全球伦理系统的基础。戈尔尼亚克认为,伦理因素在过去反映了当地的经历、历史和习俗,这反过来解释了为什么伦理立场在不同的文化中会有所不同。她提出,计算机伦理不受局部约束,即计算机逻辑构成了人类和机器如何互动的真正普遍观点。她总结道,自动化的普及将导致“计算机伦理”成为信息时代道德行为基础的伦理代理。尽管 Górniak 假说受到了 Deborah Johnson 等作者的质疑,但不可否认的是,计算机伦理与全球商业、教育和立法的发展息息相关。
构建当前关于数字伦理的辩论
今天关于数字伦理的讨论将这些论点向前推进了一步。这场辩论超越了计算机和自动化的伦理后果,涉及到数据驱动决策的伦理问题。伦理挑战不仅仅来自数据本身的质量和相关性,而是来自人类如何使用数据来感知、预测和评估行动过程。每一代新的信息技术都扩大了人类和人工智能的目标和应用领域,并因此改变了伦理选择产生的背景。数字伦理的终结不是一个区分对错的问题,而是为数字技术的开发者和最终用户构建适当的框架,以验证可接受的数据实践。
Lee sch lenker 博士是 http://baieurope.com商业分析学院的商业分析和数字化转型教授。【www.linkedin.com/in/leeschlenker.】你可以在推特上关注我们https://twitter.com/DSign4Analytics
有兴趣了解更多关于数字伦理的想法吗?我们最近的贡献包括:
解决艾的秘密议程
数据科学的伦理
数据科学和 DPO
身份、信任和价值:开放银行的未来
以人为中心的 AI 对管理意味着什么?
— — — — — —
丘吉尔先生,我们是专业人士吗?批判地看待生物伦理学家的社会角色”。代达罗斯。1999.第 253-274 页。
【ii】拜纳姆、特雷尔,《计算机与信息伦理》,《斯坦福哲学百科全书》(2018 年夏季版),爱德华·n·扎尔塔(ed .)
我可以从工程过渡到数据科学吗?
原文:https://towardsdatascience.com/can-i-transition-from-engineering-to-data-science-2b55f6cdbb0?source=collection_archive---------14-----------------------
简而言之,答案是肯定的,但事情远不止看上去那么简单
照片由 Cookie 在 Unsplash 上的 Pom 拍摄
我能冒险吗?我的工程背景能帮助我晋级吗?我可以加入数据科学的行列吗?
如果你看到自己问了这些问题中的任何一个,那么你可能已经到达了 STEM 职业生涯中越来越常见的交叉点。我们中的许多人都被数据科学在我们生活中的影响力和无处不在所迷惑,并迫切希望以某种方式调整我们的职业生涯以适应它。说实话,几年前我也是这样的人。我本人是工程出身,当时有几年的经验,我开始看到数据科学相对更大的影响。我决定自己冒险一试。我参加了一个硕士项目,两年后,我找到了第一份软件开发工作,重点是数据科学应用。虽然轶事证据很难表明普遍的现实,但我希望就这种努力可能需要什么提供一些见解。
动机因素
首先,你需要剖析你的情绪,以解释为什么你突然觉得需要重新调整你从工程到数据科学的方向。如果你觉得数据科学与你的行业更相关,或者你对它有所了解,并发现它足够有趣,可以采取行动,那么你正在通过 fair shores 进入这个领域。然而,如果你对目前的工作不满意,或者只是因为其他人都不满意而想随大流,那么你很可能会让自己失望。确保你有正确的推理和动机。即使你最终真的擅长于此,通过错误的方式也能让你很快醒悟。
你的背景
如果你已经走了这么远,那么我会假设你有某个工程形式的本科学位。这很好(也许),因为你已经具备了数据科学家所要求的技术思维和好奇的批判性思维技能。但问题是,并非所有的工程专业生来平等,在向数据科学过渡时,并非所有的专业在技术上都一样有价值。当然,你已经做了大量的线性代数、算法和脑残数学,但取决于你属于哪个专业,你可能有也可能没有足够的编程经验。编程对于数据科学就像微积分 1 对于工程。没有它,你就不会走得太远。不,仅仅因为你在 Matlab 中编写了几个任务,C 甚至 Python 都不会有所帮助。你真的需要与面向对象编程、数据结构和算法的宝贵接触。
如果你学过电气或控制工程,那么你就有一个相当坚实的基础来采取行动;另一方面,如果你读过机械、化学、土木或石油工程,那么你可能需要三思。鉴于我自己的出身——作为一名机械工程毕业生,我在这个领域的早期经历了相当多的挣扎。甚至一些原始的概念如版本控制和面向对象编程对我来说也是陌生的。如果你觉得自己在这些概念上的基础很差,那么我强烈建议你在采取下一步行动之前报读速成班。哦,为了避免你认为相关的工作经验可以代替参加这些速成课程,有些大学不这么认为,如果你不能证明你确实学过必修课,他们就不会考虑录取你。事实上,在参加编程、算法和数据结构的几门 MOOCS 课程之前,我最终被我的硕士学院拒绝了;显然,我的相关工作经历被完全忽视了(这是理所当然的)。
认证
没有多少雇主会关注一份没有数据科学相关课程证书的简历。这是否意味着你必须注册并完成一个硕士项目?不一定。根据你申请的职位,你可能只需要一张研究生证书或一个职业学位就能迈出第一步。不过,这可能最多只能胜任数据分析师或工程师的职位,你必须慢慢地沿着食物链往上爬。但如果你已经瞄准了诱人的数据科学家或数据工程师职位,那么我肯定会推荐你去读一个漫长但有回报的硕士课程。即便如此,你可能还是会从一个较低的职位开始,比如数据工程师或软件开发员,但晋升最终会到来。哦,如果你想知道,你报名参加的任何课程都应该提供对概念的彻底学习,包括但不限于机器学习、自然语言处理、数据挖掘、云计算和数据可视化。
第一份工作
我很高兴地看到,在我将数据科学硕士项目添加到我的个人资料后,招聘人员纷纷在 LinkedIn 上联系我;这确实表明了数据科学专业的就业市场有多强劲。我在硕士最后一个学期找到了这个领域的第一份工作。我毕业后立即开始了软件开发,这并不是我所希望的令人垂涎的数据科学家头衔,但老实说,我非常高兴,因为我的工作主要围绕着为机器学习和数据科学应用开发软件。正如我前面提到的,不管你获得了什么学位,你都需要不断努力。数据科学家位于层级的顶端(有充分的理由),实际上,如果没有严格的理解和跟踪记录,很少有人能够真正自称是一名数据科学家。
工作经历
简单来说,学习曲线会相当陡峭。您将在工作中掌握其他数据科学毕业生在本科时学到的概念。你的知识中会有空白,你会一直保持警惕。有时,您可能会对您所接触到的一堆工具感到不知所措,并且与您的同事相比,您可能会产生一种自卑感。但这是意料之中的,毕竟,你跳过了四年宝贵的计算机科学本科学习,直接钻研一个专家级别的课题。然而,随着你继续前进,你会看到差距在缩小,你甚至会注意到由于你的工程背景,你在其他领域的优势。
结论
你确实能够从工程过渡到数据科学,但这需要无可挑剔的毅力、职业生涯中微小但切实的挫折(当你跳槽时)和严格的纪律。随着你在公司数据科学阶梯上的向上发展,你应该从一个位置移动到另一个位置。你最有可能从软件开发人员/数据分析师开始,然后成为数据工程师或架构师,然后成为数据科学家,甚至软件开发经理(取决于你选择的方向)。假设你是因为所有正确的原因而冒险,那么努力将变得毫不费力,结果将是非常值得的。你将成为数据科学家和工程师的混合体,拥有这两个领域的优势,并且你会自豪地知道,你属于一个拥有多学科技能的罕见专业人士群体,这对大多数雇主来说都有很大价值。
新到中?您可以在此订阅和解锁无限文章。
Kompresso 能得到 9 巴压力的浓缩咖啡吗?
原文:https://towardsdatascience.com/can-kompresso-get-9-bars-of-pressure-for-espresso-9aeff301b943?source=collection_archive---------35-----------------------
用一个简单的实验探索 Kompresso
几年来,我一直在努力寻找便携式浓缩咖啡的解决方案。到目前为止,我的迭代已经到达 Kompresso 。最大的卖点是在旅途中获得杠杆机体验。Kompresso 重量轻,相对较小的外形,可以产生正确的压力,或者可以吗?
Cafflano 声称 Kompresso 可以达到 9 巴的压力,因为他们的柱塞直径比圆盘小,这意味着根据帕斯卡原理,柱塞上的力相当于液体通过咖啡的压力。推动小柱塞更容易获得所需的压力。
流体力学中的帕斯卡原理或帕斯卡定律指出“在封闭容器中静止的流体中,一部分的压力变化无损耗地传递到流体的每一部分和容器壁。”因此,如果你有一根管子,一边有一个小开口,另一边有一个大开口,对一边施加一定的力,就会在另一边产生相等的力。
这里有一个很好的解释:https://www.britannica.com/science/Pascals-principle
你真的能用这个小机器达到 9 巴的压力吗?9 巴是 130 磅/英寸,活塞是 6 厘米或 0.93 英寸。所以 9 巴的压力意味着在活塞上施加 120 磅的力。
我开始用一个简单的模拟体重秤实验来测试 9 巴的说法。
主要警告:我不认为 9 格的浓缩咖啡是必要的,我通常在冲泡过程中使用较少。我还做了长时间的预输注和压力脉冲,所以我对 Kompresso 很满意。这是一个很棒的旅行浓缩咖啡机,我真的很喜欢它。我做这个实验的唯一原因是为了更好地理解他们通过数据得出的结论。在 espresso 社区已经有了关于这一说法的讨论,但是到目前为止,还没有人用数据来证明这一点。
实验
我把 Kompresso 放在模拟秤上,然后按下顶部的活塞。这与 Kompresso 的典型用法不同,因为通常是从底部向上拉的同时向下推。然后,我使用视频记录整个镜头的输出重量,并使用视频记录面部后的数据。改进这个实验的唯一方法是使用应变仪。
我做了很长时间的预注入,在 30 秒时,我注入了足够的水来浸泡冰球。然后 60s 开始输液。我稍微休息了一下,因为我在 90 左右收集了我要喝的那部分,然后我尽可能舒服地用力。
最多的时候,我只能打 5 小节,这很不舒服。设置是颤抖的,它肯定觉得我可以设备。很难保持这种压力,保持 30 秒的输液时间会很不舒服。
我无法让 Kompresso 达到 9 巴的压力,我不建议试图让它超过 5 巴,因为它似乎不稳定。我可以坐在机器上,但我不认为 9 巴是好的浓缩咖啡所必需的,我很少承受那种压力。然而,Kompresso 仍然是最好的浓缩咖啡旅行伴侣,我相信它本质上是一个便携式调平机。
这个实验并没有毫无疑问地证明可以达到 9 格,但由于不舒服,我在以前的拍摄中没有比这更用力。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
咖啡的形状
搅拌还是旋转:更好的浓缩咖啡体验
香辣浓缩咖啡:热磨,冷捣以获得更好的咖啡
断续浓缩咖啡:提升浓缩咖啡
用纸质过滤器改进浓缩咖啡
浓缩咖啡中咖啡溶解度的初步研究
断奏捣固:不用筛子改进浓缩咖啡
浓缩咖啡模拟:计算机模型的第一步
压力脉动带来更好的浓缩咖啡
咖啡数据表
工匠咖啡价格过高
被盗浓缩咖啡机的故事
浓缩咖啡过滤器分析
便携式浓缩咖啡:指南
克鲁夫筛:分析
机器能识别一个笑话吗?
原文:https://towardsdatascience.com/can-machines-recognize-a-joke-6f9e853c6068?source=collection_archive---------50-----------------------
检测幽默的歧义是衡量自然语言理解可靠性的一个很好的基准
一只倭黑猩猩在笑。(由 Mark Dumont 的“Tickle Tickle”剪辑而成,由 CC BY-NC 2.0 授权。要查看该许可证的副本,请访问https://creativecommons.org/licenses/by-nc/2.0/
杰·雷诺经常通过阅读真实报纸上模糊的标题来表演简单的喜剧片段。观众对这些标题的反应表明,一旦我们意识到可能含义中的矛盾,模棱两可的措辞就很有趣。例如,标题“当地高中将辍学人数减半”可以解释为帮助青少年或暗杀他们。
当然,幽默并不仅限于反对模棱两可。有些笑话之所以好笑,是因为一个同音的歧义:
- 意大利桥上的卡通标志" Ducka You Head ,Lowla Bridgeada
- “你肯定不是认真的。”“我是认真的,不要叫我雪莉。”
有些很搞笑,因为一个同音异义词的歧义:
- "你多久开一次化学玩笑?"“周期性地。”
- 我太无聊了,以至于我背了 6 页字典。我几乎什么都没学到。”
有些很有趣,因为音素的微小变化会导致一个众所周知的短语的意义发生重大变化:
- "如果食物变脏了,就穿上它."
- “…让梅尔·法梅陪我们散步的啤酒”
有些很有趣,因为令人欣慰的节奏或韵律与不太令人欣慰的主题相冲突:
- 打油诗
- "我宁愿面前有一瓶酒,也不愿做额叶切除术。"
有些很有趣,因为预期的设定与突然的转折相冲突:
- “……我是一只公鸭。你犯了个错误。”
- “… 一只山羊。”
识别所有不同类型的幽默目前超出了任何实现的自然语言理解系统的能力。然而,可能有一天,自然语言理解领域已经足够先进,评估系统的自然语言理解能力只需要测量系统识别各种各样幽默的成功率,因为识别幽默是理解歧义的证明,而理解歧义是理解自然语言的核心。在那一天到来之前,我们都必须继续互相帮助,偶尔放松一下。你听说过那个关于…
网络分析能否成功预测票房收入?
原文:https://towardsdatascience.com/can-network-analysis-work-for-predicting-success-of-box-office-revenue-c8370c8427f9?source=collection_archive---------53-----------------------
我分析了网络中心性指标来预测影院电影的票房收入。
杰森·登特在 Unsplash 上拍摄的照片
网络理论与分析简介
网络理论是图论的一部分,图论是计算机科学中的一门普通学科。它有带属性的节点和边(例如,节点的名称或边的权重)。节点对应于个人、团体、公司或一些对象。边对应于它们之间的连接。这是一个热门话题,被用于电网络分析、社会网络分析、生物网络分析、叙事网络分析等等…
图片来自 Pixabay 的戈登·约翰逊
我们如何分析这些网络?
文献中有很多方法,但是在本文中,我们将集中讨论中心性度量。我们通过中心性测量来确定网络中节点的值。常见的中心性度量是程度中心性、中间中心性和接近中心性。我在这个项目中使用了度中心性度量,所以我将给出一个数学解释。其他人也可以为这个项目工作,但我不想打扰你的细节。
度中心性
度中心性被计算为节点的邻居数量与图中所有节点(除了它自己)的比率。
节点 I 的度
节点 I 的度中心性
1.1 对应于评估节点 I 的度,A 表示邻接矩阵,如果 I 和 j 连通 Aij 变为 1。
1.2 对应于评估节点 I 的度中心性
数据集
我使用了 Kaggle 上的完整 MovieLens 数据集。你可以从这里进入。在基本的数据预处理步骤之后,我提取了 3 个最有价值的男/女演员。我把它表现为三个特征:第一颗星,第二颗星和第三颗星。在数据集中,每一行代表一部电影,按上映日期排序。
创建电影明星网络
我使用 Python Networkx 包来创建网络。Networkx 包对于创建图形和玩图形非常有用。
创建网络时,我们应该使用迭代方法,因为电影明星网络取决于电影上映的日期。我们不要忘记,电影预测问题是一个时间序列问题。甚至当我们想把它从时间序列中解救出来时,也要先根据时间序列创建特征,否则会造成过拟合。例如,2002 年,丹尼尔·戴·刘易斯在纽约黑帮中扮演角色,他与莱纳多·迪卡普里奥和卡梅隆·迪亚兹有关系。
当我们在 2002 年无法预见丹尼尔·戴·刘易斯会与 2007 年的电影《血色将至》中的保罗·达诺和塞伦·希德联系在一起的时候(顺便说一下我一直最喜欢的电影)。让我们转到编码部分。
使用 Python Networkx、Pandas 和 Numpy 库创建网络。还将恒星名称转换为它们的中心度值。
请注意:在将明星加入网络之前,我们正在评估程度中心性,因为在这个项目中,我们专注于预测预发布功能的票房收入。
太好了!我们有一个庞大的网络,它由许多明星组成。让我们分析一下我们的最终网络。首先,我们将提取哪些参与者具有最高的中心度值,并绘制其中一个参与者的子图。
让我们看看尼古拉斯·凯奇的关系网。
示例子图
实验结果
让我们看看目标值和程度中心性特征之间的显著相关性。有关显著相关性的更多信息,请访问参考文献[1]和[2]。
运行上述代码片段后,我们可以看到以下输出:
correlation coefficient is : 0.21864498150201786 and p-value is : 2.7900600450069023e-14
firstStarCent has statistically significance correlation with revenue : rejected null hypothesis ------------------******************------------------------
correlation coefficient is : 0.16237961734262799 and p-value is : 1.9229172482701102e-08
secondStarCent has statistically significance correlation with revenue : rejected null hypothesis ------------------******************------------------------
correlation coefficient is : 0.12800805379342114 and p-value is : 9.952492664089648e-06
thirdStarCent has statistically significance correlation with revenue : rejected null hypothesis
明星的中心度和电影票房收入之间有显著的相关性。对于首星特征,我们有一个 0.21 相关系数。
最后备注
在这篇文章中,我与你分享了一些新颖的票房收入预测功能。你可以通过查看过去在一起很成功的演员来推荐其他演员出演一部新电影。可以通过添加边权重来实现。此外,您可以尝试其他中心性度量。
我希望你喜欢阅读这篇文章。如果你对这篇文章有任何疑问,你可以在 Linkedin 上找到我。
参考文献
[1]-https://courses . lumen learning . com/Odessa-introstats 1-1/chapter/testing-the-significance-of-the-correlation-coefficient/
【2】-https://docs . scipy . org/doc/scipy-0 . 14 . 0/reference/generated/scipy . stats . Pearson r . html
[3]-罗德里格斯,弗朗西斯科·阿帕雷西多。"网络中心性:导论."从非线性动力学到复杂系统的数学建模方法。施普林格,查姆,2019。177–196.
【4】-https://en.wikipedia.org/wiki/Centrality
【5】-https://en.wikipedia.org/wiki/Network_theory
[6]-https://www . data camp . com/courses/network-analysis-in-python-part-1
NLP 能读懂斯波克先生的情绪吗?
原文:https://towardsdatascience.com/can-nlp-read-mr-spocks-sentiment-79959b4e324a?source=collection_archive---------28-----------------------
逐步建立和训练一个定制的 NLP 情感分析器。
我们能对瓦肯人进行情感分析吗?也许不是…维基共享照片[0]
火神是不是没有感情的表达情操?借助机器学习的力量,我们可以找到答案。我们将使用这个(又一个)自然语言处理(NLP)和情感分析(SA)方法的基本指南来评估著名的斯波克语录。
“一旦你排除了不可能,剩下的,无论多么不可思议,都一定是真相。”——斯波克先生&夏洛克·福尔摩斯
斯波克引用——他表现出情感了吗??或者至少是情绪?
构建情感分析器的基本步骤:
- 选择/查找/窃取用于训练的数据集
- 清理数据集
- 构建单词嵌入
- 挑选一个模型并训练它
- 评估模型
- 生产化!
1.明智地选择(你的数据集)
训练语料的选择非常重要。它需要标签和足够的广度和一致性来建立一个坚实的模型。我找到了几个选项(使用谷歌新的数据集搜索):
- Stanford movie review—240k 短语/单词级别分解和梯度评分 0.0–1.0——缺点是分解使其无法用于矢量嵌入(稍后详细介绍)。[3]
- 微软 Cortona——多类情感标签悲伤、空虚、中性等(0,1 二进制)——有前途
- Twitter—140 万条推文,0 表示负面,1 表示正面。推特上有很多俚语,所以好坏取决于你是否想评价 vs 俚语。[4]
- 亚马逊 —产品评论—text+1–5 星评分—也很有前景。
- Yelp——有用、有趣、酷+星级(pos/neg 1–5)的多张选票——前途无量,还有许多方面需要改进。[7]
我用 Twitter 的原因超出了逻辑。参见下面的例子(错别字、脏话等等):
Twitter 数据示例— 0 为负,1 为正。注意互联网上免费出现的俚语、诅咒、糟糕的拼写和语法。注意不是所有的分数都匹配…有些接近 50/50,但是这个标签是二进制的。
2.清洁(就像虔诚一样)
清洁有几个主要步骤,其中大部分都很简单:
- 使单词大小写一致,并扩展缩写
- 删除特殊字符、数字和重音符号
- 删除常用的小词,如“a”、“the”、“and”→也就是停用词
- 词干或词干化——词干化就是把一个单词多余的部分切掉,即‘词干化’→‘词干’,以及‘词干化’→‘词干’。词汇化更复杂,即:“鹅”→“鹅”,“研究”→“学习”
- 将字符串转换成记号/数组(假设模型需要数组格式)
- 有时你想标记词类(PoS)——比如动词、名词短语——现在跳过这个
在现实世界中,请使用 NLTK 而不是自己编写!
FooNLP 原型代码的愚蠢例子..对于实际工作,使用 NLTK 之类的标准库,它更健壮,而且不仅仅是词干化,还进行了词干化
3.嵌入(你的邻居)
ML 模型只接受数字作为输入。将文本“编码”或“嵌入”为数字表示的过程是一个关键步骤。存在两种主要方法(标量字数统计和嵌入矩阵),后者是当今的最新技术。
标量表示——计数向量编码方法是让列表示单词(每个单词一列),行表示一个例句。每个单词的出现次数存储在每一列中(非常稀疏,即,给定一个 700k 单词的 vocab,每个样本句子大部分是 0)。参见示例(上表为简单计数,下表为加权“tfidf”):
标量嵌入—向量计数(上)和 tfidf(下)—用于 5 个样本 spock 引用的虚拟编码。构建所有推文的表示会产生 140 万行和 70 多万列特征(单词)
“长命百岁,兴旺发达?”(第 3 行)对大多数列用 0 编码,对“long”列用 1 编码,因为单词 long 只出现一次。很 简单。(第二个表是 tfidf 编码,它也是一个字数,但占它在其他句子中出现的次数)。
**Code to build a Count Vector:**from sklearn.feature_extraction.text import CountVectorizercv = CountVectorizer() # or - TfidfVectorizier()
toks = <array of sentences from twitter>
matrix = cv.fit_transform(toks)
columns = cv.get_feature_names()
矢量表示 —一个“嵌入矩阵”(像 word 2 vec【13】和 GloVe【19】)是一个更复杂的&强大的表示。像前面的方法一样,列表示单个单词(像计数向量),但是行不是单个样本,而是一个固定的数字向量。样本引用被分解并训练成“单词特征”的 n-elem 向量。(本例中为 10 elems,而实际系统有 50、100、300+elem)。
Word2Vec 编码只是使用 10 维 CBOW 编码的样本 Spock 报价。数字本身没有什么意义,但是比较前两列,注意数值的不同?
**Code to train a Word2Vec matrix and test similarity:**toks = <array of sentences from twitter>
w2v = gensim.models.Word2Vec(toks, min_count=1, size=100, window=5)
columns = w2v.wv.vocab # 732k words
matrix = wv2.wv[columns] # 732k x 100 matrixprint(w2v.similar_by_word('love'))
的含义超出了这篇介绍文章(和大多数文章!)—简而言之,它嵌入了上下文信息,这使得它在查找相似/相关单词等方面非常强大。在 150 万 Twitter 数据集上训练的 100 维嵌入的几个例子:
令人惊讶的是,相似性匹配是如此的精确,全部使用无监督的现成 Word2Vec!
下一步训练和检测:“斯波克必须死”→阳性/阴性情绪得分?!
4.火车 La(超级)模型!
训练过程从步骤 3 中提取单词嵌入,并使用它们作为输入,以及步骤 1 中的推文和情感标签来训练模型。使用逻辑回归是最容易解释的(这就像一个单层神经网络,或感知器,不要与霸天虎混淆)。
foo stack . ai——模型的评估步骤(注意,真实模型中有 70 万个单词,但只评估我们想要对其进行情感评分的句子。
“训练”模型的过程为每个特征(单词)设置一个权重(值),以从整体上最小化模型的错误猜测。它对涉及正得分的单词设置较高的正权重,反之亦然。(它大致遵循了赫布边关于大脑突触如何放电的理论【11】)。注意,完整的模型有 70 万个以上的特征(单词),对“爱是非常不合逻辑的”这样的句子的评估将激活如上图所示的句子/分数计算。使用 SKLearn 的简单示例:
from sklearn.linear_model import LogisticRegressionX = <rows of 1.5m tweets, CountVectorized into onehot cols>
y = <rows of 0 and 1 labelled scores>model = LogisticRegression().fit(X, y) # train model
results = model.predict(['Love is terribly illogical']) #eval
prob = model.predict_proba('Love is terribly illogical']) #score> results: 1 (Positive)
> prob:: 99.996%
这些 SKLearn[14]模型对于简单的 CountVectors 或 Tfidf 非常有效,但是对于 Word2Vec CBOW 矩阵,您确实需要一个具有嵌入层(每个输入单词的可训练节点)的神经网络。你必须稍微思考一下才能理解为什么——在 CV/tfidf 中,特征是唯一的词,训练创建了每个唯一的词→单个值的表。在 W2V 每个单词→ n 个唯一值中,可以认为每个单词有 n 个特征(在我的例子中是 10,更大的模型有 100 个)。每个单词的“特征”数量赋予了它寻找相似性等的能力。
将 W2V 嵌入到简单模型中的一种快捷方法是通过将单词 val 平均为如下所示的单个值来“挤压”句子中的单词:
FooStack.ai — w2v 模型产生更高维度的模型,因此我们需要将其“压缩”到 2d,以便与逻辑回归模型一起使用。对于每个 n 输入单词,可以使用带有 n 个隐藏层的单词向量和神经网络。
或者,我们可以将每个单词的 100 个值压缩成一个平均值,但这似乎更糟,因为您丢失了向量包含的所有上下文信息。如果你想保留两个特征维度,你需要一个权重更大的神经网络。查看 FooNLP 包的完整源代码。
下个月我们将会看到更多关于完整 w2v 矩阵的 NN 实现。
5.Evaluate^(一次又一次)
第一次尝试几乎不可能拿到最好的成绩。科学本质上需要实验。除非你是曼哈顿博士,能够预见未来[20],或者使用 AutoML,否则你应该计划在这里花大量时间摆弄参数,以理解结果。
下面的基本评价是每个组合都有很大不同!一些偏斜的结果比另一些更负面。“ 迷人的……”就像斯波克先生会说的那样。
在 Spock 报价上运行 8 种不同的模型+嵌入组合后的分析。请注意许多项目上的显著标准偏差
性能快速说明:
Word2Vec 可能是资源密集型的,150 万条推文中只有 100 个向量,训练一个嵌入&逻辑回归模型的 CBOW 需要 15 分钟。即使是简单的计数向量,训练也需要 6 分钟。然而,我是在机场的超便携 Surface 6 上做这个的……不完全是美国企业的力量..
训练时间..更快的 CPU 会有所帮助。我开始序列化模型,并在可能的时候从磁盘加载。1.5m 的句子模型占用 1.2gb 的空间,但在几秒钟内加载,而从头开始训练需要 20-30 分钟!
6.部署
FooStack 从将作品投入生产中获得满足感。我们将包装在 nlp.py 中的工作插入到我们现有的 Python REST 应用程序中,很快——我们的客户现在可以看到更多的实时情感评分(以及 w/ Azure、Google 等)。斯波克先生会感到骄傲(不带感情色彩地)。
考虑到每个序列化模型的巨大规模(CV/Tfidf 为 250mb,Word2Vec 为 1.2gb)和训练时间,我挑选了两个精简的模型(w2v cbow w/ logistic regression 和 tfidf w/ naive bayes)。
# Flask static init app.py
nlp = FooNLP()
models = {}
models['tfidf.nb'] = nlp.load('models/tfidf.nb.ser')
models['w2v.lr'] = nlp.load('models/w2vcbow.lr.ser')print('loaded models', models)
这里的满瓶代码是。之前关于构建情感分析器的文章在这里。
# also added to
# def sa_predict(model='all'):
# ... def custom_nlp(text):
nlp = models['w2v.lr']
label, prob = nlp.predict([text])
print(label, prob) resp = {}
resp['model'] = 'Foo W2V LR'
resp['extra'] = 'model returns 0 to 1'
resp['url'] = '[http://foostack.ai/'](http://foostack.ai/')
resp['rScore'] = prob[0]return resp
如果我支付了我的 Azure 账单,你可以在http://foostack.ai/nlp【编辑——停机维护——有重大 Azure 部署问题……然后放弃了!]
一些例子——一些命中,一些未命中..所有型号都不一样!
7.结论—斯波克的观点是…
基于这一非科学研究的结论是,斯波克确实是一个没有感情、没有情感、无情的生物(即一个瓦肯人)。数据显示了一点偏向消极的倾向——也许人类的(情感)社会观在缺乏情感时是消极的!
你可以从亚马逊买到这张海报
寻找我的下一篇关于使用神经网络和著名的 BERT 架构进行情感分析的文章。下次再见, 万岁, !
参考与启示:
[0]封面照片—https://commons . wikimedia . org/wiki/File:Leonard _ Nimoy _ Mr _ Spock _ Star _ Trek。JPG
[1]自定义 NLP 指南—https://towards data science . com/understanding-feature-engineering-part-3-traditional-methods-for-text-data-f6f 7d 70 ACD 41
[2]各种 NLP 技术的高级指南—https://towards data science . com/beyond-word-embedding-part-2-word-vectors-NLP-modeling-from-bow-to-Bert-4 EBD 4711 d0 EC
[3] Twitter 情绪数据—http://thinknook . com/Twitter-perspective-analysis-training-corpus-dataset-2012-09-22/和http://thinknook . com/Twitter-perspective-analysis-training-corpus-dataset-2012-09-22/
[4]史丹福电影情感数据—https://nlp.stanford.edu/sentiment/
[5]词语向量/嵌入的简易解释—http://xplordat . com/2018/09/27/Word-Embedding-and-document-Vectors-part-1-similarity/
[6]谷歌情感数据集搜索—https://datasetsearch.research.google.com/search?查询=情绪% 20 分析&docid = 0 rbimum 78% 2B % 2 fk 2 MP 2 aaaaaa % 3D % 3D
[7] Yelp 数据集—https://www.kaggle.com/yelp-dataset/yelp-dataset
[8]多重标签情绪—https://data.world/crowdflower/sentiment-analysis-in-text
[9]嵌入—https://stack abuse . com/python-for-NLP-word-embedding-for-deep-learning-in-keras/
[10]嵌入矩阵 Petuum 公司的“嵌入:意义矩阵”https://link.medium.com/onbeDUAzL3
[11]赫布边学—https://en.wikipedia.org/wiki/Hebbian_theory
[12]NB 上的原始信息—https://medium . com/datadriveninvestor/implementing-naive-Bayes-for-sensation-analysis-in-python-951 fa 8 DCD 928
[13]word 2 vec API—😕/radimrehurek . com/gensim/models/word 2 vec . html
[14]sci kit-Learn vector/TF dif & models—https://sci kit-Learn . org/stable/modules/generated/sk Learn . feature _ extraction . text . count vector izer . html
[15]NLP Flutter—https://towardsdatascience . com/cross-platform-NLP-GUI-on-Flutter-75d 59170864?来源= - 2 -
[16]后端 GitHub 回购—https://github.com/dougfoo/flaskml3/
[17]用于 NLP lib 的 GitHub Repo—https://github.com/dougfoo/machineLearning/tree/master/nlp
[18]miko lov(Google)的原始 Word2Vec 论文:https://arxiv.org/pdf/1301.3781.pdf和https://papers . nips . cc/paper/5021-单词和短语的分布式表示及其组成性. pdf
[19]手套嵌入—https://nlp.stanford.edu/projects/glove/
[20]曼哈顿博士,守望者—https://en.wikipedia.org/wiki/Doctor_Manhattan
Prophet 能准确预测网页浏览量吗?
原文:https://towardsdatascience.com/can-prophet-accurately-forecast-web-page-views-3537fe72e11b?source=collection_archive---------44-----------------------
使用 Prophet 预测网页流量
预测网页浏览量可能相当棘手。这是因为页面浏览量往往会在数据中看到显著的“峰值”,即浏览量远远高于平均水平。
让我们根据 2016 年 1 月至 2020 年 8 月维基媒体工具库的统计数据,以“地震”一词的页面浏览量为例:
来源:维基媒体工具锻造
我们可以看到,虽然总体趋势有所下降,但在特定时间点,页面浏览量仍有大幅上升。这符合我们的预期——人们很自然地认为“地震”一词的峰值会出现在实际发生地震的地方。
虽然时间序列不可能预测这种峰值,但仍然可以使用时间序列模型来预测更普遍的趋势。
在这方面,为了预测该搜索项的页面浏览量,建立了一个 Prophet 模型。
模型配置
Prophet 是脸书开发的一个预测模型,它通过对季节性、假期和变点等因素进行特殊调整来预测时间序列。
以下是用 Python 对上述时间序列的分解:
来源:Jupyter 笔记本输出
从上面可以看出,随着时间的推移,我们可以观察到一个强有力的下降趋势。此外,对季节性图表的直观检查表明了每年的波动。
具有年度季节性且傅立叶阶为 10 的加性模型定义如下:
prophet_basic = Prophet(seasonality_mode='additive')
prophet_basic.add_seasonality('yearly_seasonality', period=12, fourier_order=10)
prophet_basic.fit(train_dataset)
这是 Prophet 指出的组件的分解。
fig1 = prophet_basic.plot_components(forecast)
来源:Jupyter 笔记本输出
既然已经确定了趋势和季节性因素,下一个任务就是确定数据中的变点数量。
简单地说,变点是时间序列的轨迹发生重大变化的地方。正确识别这些有助于提高模型的准确性。
在这点上,改变变点参数,并计算测试集的 RMSE(均方根误差)分数:
来源:作者的计算
RMSE 通过 6 变点最小化,因此该型号将配置相同的变点。
这是一个转变点的图表:
import matplotlib.pyplot as pltfigure = pro_change.plot(forecast)
for changepoint in pro_change.changepoints:
plt.axvline(changepoint,ls='--', lw=1)
来源:Jupyter 笔记本输出
结果
上面的 Prophet 模型是在 80%的数据集(训练集)上训练的。现在,针对数据集(测试集)的后 20%生成预测,并计算出均方根误差和平均预测误差。
>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(actual, predicted)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)RMSE: 1747.629375>>> forecast_error = (actual-predicted)
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error-681.8562874251497
测试集中的均方根误差为 1,747 ,最大值为 9,699 ,与最大值相比,误差似乎是合理的(误差大小约为整个范围的 17% )。
当将第 90 百分位作为最大范围时(为了排除异常大的值),获得最大值5378。
>>> np.quantile(actual, 0.9)5378.3
假设该值为最大值,均方根误差的大小占总范围的32%——这明显更高。
以下是预测值与实际值的对比图:
来源:Jupyter 笔记本输出
我们可以看到,虽然 Prophet 模型通常预测整体趋势,但它未能预测数据中的这些大“峰值”,这导致了更高的预测误差。
从这个角度来看,虽然 Prophet 在确定数据的长期趋势方面仍然很有用,但使用蒙特卡罗分布可以更有效地预测异常。
具体而言,网页查看统计似乎遵循帕累托分布,例如,在任何给定的 100 天中,80%的页面查看将在 20%的日子中被记录。如果您感兴趣,参考资料部分包含了关于这个主题的另一篇文章。
结论
在这个例子中,我们看到 Prophet 是一个有用的时间序列工具,可以用来预测序列的整体趋势,并识别时间序列中的变点或重大的突变。
然而,网页浏览量在某种程度上是独特的,因为它们受到高度异常的影响,并且 Prophet 在预测不一定依赖于季节性或其他时间相关因素的极值方面可能是有限的。
非常感谢您的阅读,欢迎任何问题或反馈。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
参考
- 预言者:趋势转折点
- 走向数据科学——帕累托分布和蒙特卡洛模拟
- Wikimedia Toolforge:浏览量分析
Python DataViz 库能否重现 Tableau 工作表?
原文:https://towardsdatascience.com/can-python-dataviz-libraries-repeat-the-tableau-worksheet-e38ef2876f04?source=collection_archive---------10-----------------------
数据可视化技巧
我对 Tableau 用法及其与 Python 代码的比较的第一印象
简单来说,答案是肯定的。尽管如此,在我探索画面的过程中,我还是注意到了一些很酷的事情。
罗曼·博日科在 Unsplash 上拍摄的照片
Tableau 是我进入数据科学和数据可视化之旅的必去之地。对于快速了解数据集和初步探索性可视化来说,这是一个非常酷和方便的工具。它为原始数据分析和进一步探索提供了许多必要的工具。因此,作为一名初学数据的科学家,我对它感兴趣并不奇怪。不过,首先,我是一名软件开发人员,所以我不仅想得到一个新的奇特工具,还想了解它是如何工作的。主要目标是用 Jupyter notebook 和任何 Python 库(如 plotly 或 matplotlib)从 Tableau 重新创建任何可视化。
让我们从一个数据集开始
我们的任务需要对数据进行一些探索性的分析,所以我选择了一个数据集,它可以展示很多有趣的东西。就是来自 Kaggle 的 2018 年 Kickstarter 项目(失败和成功都有)的表。它包含足够用于分组的分类变量(如项目类型和国家)、一些日期和日期范围(它们都有开始日期和截止日期)以及用于合计的数字变量(金额)。
请注意数据:
虽然我的第一个冲动是使用熊猫,但我现在必须借助 Tableau 来查看数据。
第一印象
Tableau 只需点击几下就可以打开数据集,相当于熊猫的一行代码。虽然它带来了额外的功能,如自动列类型识别:日期/时间、地理数据、数字等..因此,Tableau 方法看起来更有吸引力,所以我把我的数据集…
…我遇到了数据类型的问题,我的数据没有被解析。简单看了一下,发现问题出在本地的 Windows 语言设置上。我住在乌克兰,所以我有母语的月份名称,但数据集包含英语格式,Tableau 在当前的语言设置下无法识别。我有点失望,这个程序需要本地设置,我不能在程序中调整它们。不管怎样,问题解决了,我继续工作。
现在我们可以看到自动类型识别的所有优点:
正如我们所见,它正确地识别了货币、日期和地理数据。除了一个小错误:“state”列被识别为地理数据,而不是原始文本。然而,这是一个很好的特性,有助于分析。
点击几下即可清洁
数据集清理是数据分析过程中最耗时的步骤。所以我们需要使用任何工具来保持我们的时间。Tableau 在这个过程中是一个优秀的助手,它有别名、计算列和过滤系统。例如,我们在 Kickstarter 数据集中有“state”列。它保持几个值:“成功”、“失败”、“活动”、“暂停”和“取消”。尽管我们只希望与“成功的”和“失败的”项目合作。让我们继续下一步:
- 为“state”列创建一个过滤器,这样我们只留下“successful”、“failed”和“live”状态。
- 创建一个计算字段,将“实时”转换为“成功”。我们需要下一个公式:
if [state] = “live” then “successful” else [state] end
- 如果需要,可以使用别名。
- 将列重命名为“状态(失败/成功)”。
首先,所有这些步骤都可以通过几次点击来完成,这是可视化界面的一个明显优势。此外,计算字段允许执行任何复杂的条件。过滤器让我们可以快速访问该列的所有值。
由于我们使用的是比较,以下是相同工作的 Python 代码:
当然,虽然我们已经完成了我们的例子,但是还有很多清理工作要做,所以让我们转到图表上来,这是本文的主要目标。
每个值都是一个可视化对象
这是我在数据分析中遇到的最佳实践:Tableau 将每一列(要素或测量或过滤器或计算字段)转换为拖放对象。所以你可以通过几次鼠标移动来创建一个完整的信息可视化。例如,我刚刚在列中添加了“主类别”特性,并在行中自动生成了“记录数”,条形图就准备好了。再移动一次以将总计数添加为条形标签,这是每个条形上带有额外视觉提示的结果:
同样的操作将花费更多的时间,但是 Jupyter 笔记本中的几行代码:
更复杂的图形呢?没问题:将“Country”列和“Number of records”行一起拖动,改变可视化类型,我们就有了树形图。更重要的是:将“Country”特性拖到 filters 部分,从可视化中删除 USA 行(这样会更清晰,因为 USA 有最多的记录)。结果仍然是交互的:
尽管如此,可视化仍然可以用 Python 代码再现:
所以我们了解到,我们可以通过点击几下鼠标来创建简单的可视化。尽管我们还需要几行代码来在 Python 中得到相同的结果。让我们创造一些更复杂的东西。
自动聚合
简单的图形向我们展示了两个变量之间的联系。如果我们需要显示三个以上的特征,我们使用聚合技术。例如,如果我们需要显示每个类别中成功和失败项目的数量,该怎么办?对 Tableau 来说这是个简单的任务。我们已经有了一个类别条形图,所以,让我们将“State”变量作为颜色属性添加到工作表中:
一个动作,我们就收集了更多的信息。代码呢?嗯,我们需要大量的数据来制作这张图片:
现在让我们为“国家”特性创建一个类似于 AB-test 的东西,并显示成功和失败项目的比例。我们对“Country”执行与前面对“Category”相同的步骤,并更改聚合的属性以显示百分比:
这是代码。尽管这次更加复杂:
此外,Tableau 对颜色方案、标签字体和自定义线条有不同的设置,正如我们在可视化中看到的那样。
现在让我们转向另一种方法。
从头开始绘制地图
正如标题所示,我们将创建一个地图。Python 有许多额外的包来处理地理数据,如 follow。不过,Tableau 具有识别地理数据(如国家代码)并使用它构建地图的内置功能。与前面的部分一样,只需将变量拖放到工作表中,Tableau 就会自动生成地图:
再点击几下,我们就有了一个漂亮的交互式地图,上面用彩色符号标出了 Kickstarter 记录的数量。我们仍然可以完全控制标记、颜色、标签和其他设置。
如上所述,我们使用 GeoPy 和 GeoPy(将国家代码转换为地理数据)来创建相同的地图:
这不像 Tableau 那么简单,但仍然是可复制的。
那又怎样?
这是一个合理的问题。我们已经知道,matplotlib、seaborn、plotly 和其他 Python 库功能非常强大,几乎可以实现任何可视化。另一方面,Tableau 是一种著名而又酷的乐器,具有非常相似的功能。我们可以从一开始就预测文章标题的答案。尽管如此,我相信这种比较对于展示一些不明显的思想是非常重要的:
- 将每个特征表示为一个可视对象可以多次加速可视化过程(只需记住使用 matplotlib 轴);
- Tableau 内置了很多乐器,不需要每次都记住所有的包名或者组成一个新的环境;
- 在另一次过滤后,您实际上可以看到数据和您应用的所有更改。甚至—每个筛选器或计算列都是一个单独的对象;
- Tableau 有自己的模拟脚本语言,用于构建复杂的条件和过滤器;
- 大量的聚合能力、默认类型检测和特性选择;
- 它只是漂亮,看起来像一件艺术品;
但是
- 代码给了我们更多的定制能力,特别是颜色、图例、附加元素、并行可视化等。你可以自由地用你的数据做任何事情;
- Tableau 适用于已经清理过的数据集。它有很酷的设备,但是对于先进的清洗技术来说还不够;
- Tableau 中的每一个可视化都可以在 Jupyter notebook 中重现(只是没那么好看)。
尽管我的结论是,我相信每个人都应该使用他喜欢和习惯的工具。我发现 Tableau 易于使用,在快速的主要数据集分析方面表现良好,并且能够在几次点击中创建分组并保存就绪的图像。虽然 Python 库可以做同样的工作,但 Tableau 可以做得更快,做得更漂亮。所以,我肯定会在我的作品中使用它,尤其是当我需要一张艺术般的照片时。尽管如此,我仍然更喜欢 Jupyter notebook 进行复杂的分析,及时显示几幅图像,快速记录,并在项目期间给予很大的自由。
您可以在我的 Github 上找到包含所有工作示例和内置图形的 Jupyter 笔记本,以及 Tableau 工作表:
[## 中级/中等 _jupyter_notes
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/Midvel/medium_jupyter_notes/blob/master/tableau_vs_python/tableau_vs_python.ipynb)
此外,你可以自由分享一些有趣的技巧,用在 Tableau 中。
机器人厨师能重新开餐馆吗?
原文:https://towardsdatascience.com/can-robot-chefs-re-open-restaurants-3cccd23b1aa8?source=collection_archive---------83-----------------------
机器人餐厅行业调查。
R obots?餐馆?这在 2019 年看起来太科幻了,但由于冠状病毒,我们即将跳过自动化采用的十年。未来就在这里,我们不再需要人类在汽车餐厅给我们买薯条——这些公司声称。
免费的 Pexels,有一些来自资金雄厚的机器人初创公司的访客。
实现机器人厨房的技术有哪些?这些公司看起来都像是在与餐饮服务行业相关的特定背景下框定了机器人领域的经典问题。他们不需要突破研究前沿的极限,他们需要将研究放在正确的位置。
这对我们得到的食物意味着什么?我认为,采用这些方法的餐厅将会因为潜在的 100%一致性而损失 10%的风味和体验。
挑选和放置—一个合理的挑战
拾取和放置是机器人学中的一个经典问题。我已经听到我的许多同事大声抱怨这个问题的无聊,但是它到处出现:物流、制造、运输、烹饪等等。
你在位置 A 有一个物体,它需要移动到位置 b。
这最终是 90%的大规模烹饪。配料 i 需要在时间 t 放入盘中 j 。我不认为机器人有一个好的机制来根据味道进行反馈(例如将一道菜从 0 腌制到完美并让许多味道出现的魔法),但我确实认为机器人可以重复这些任务。
就我个人而言,如果一个机器人在地铁里为我做三明治,我会非常高兴,也许我只是一个洁癖者。(不是说我在赛百味吃饭,而是你明白了。)
[## 味噌机器人|食物的未来就在这里
Flippy 是世界上第一个自主机器人厨房助手,可以从周围环境中学习并获得新的…
misorobotics.com](https://misorobotics.com/) [## Dexai Robotics |您厨房里的智能副厨
DEXAI ROBOTICS 服务条款和隐私政策条款通过访问 DEXAI 网站,您同意成为…
www.dexai.com](https://www.dexai.com/)
对和感兴趣?在这里阅读更多关于它的,或者也许看这个视频,或者检查一下我在伯克利的同事。什么使它变得困难:
- 潜在对象的无限号。
- 所述物体的无限方位。
- 人类真的是很好的竞争者。
我在这里写了这方面的进展。
[## 机器人已经为现实世界做好了准备
加州大学伯克利分校人工智能研究所的新创公司 Covariant 显示,机器人可以在大范围内完成这项工作
towardsdatascience.com](/robots-are-ready-for-the-real-world-32808cb1a4eb)
规划和路线选择——安全的选择
这是一个已经解决的问题。我记得我在脸书实习时看过关于机器人如何在没有地图的情况下导航的演讲:它们只需要一个目标。当你给机器人一张地图时,这是一个简单的问题。
这似乎是一个保持社交距离规则完整无缺的惊人方法。
用冗余传感器绑住机器人,告诉它在未知物体过于靠近(客户)时停止移动,并到达一张桌子前送食物。记住:餐馆老板可以扫描他们的楼层地图并上传到机器人上,这样它就能准确地知道哪里会有椅子、桌子、其他机器人等等。
这是否意味着我的食物永远不会被留在厨房和服务器的边界上冷藏?可惜,没有
[## 贝尔机器人公司|餐馆的未来
使用机器人和人工智能彻底改变餐馆和食品服务业。总部位于加利福尼亚州雷德伍德城的贝尔机器人公司…
www.bearrobotics.ai](https://www.bearrobotics.ai/)
灵巧的操作——非常出色
在这个网站上滚动一个标签,你会看到一个复杂的机器人手。要么这家初创公司有一些没有分享的研究,要么它试图炒作。机器人刚刚开始解决像魔方和转动手指这样的任务,他们期待它用搅拌器轻轻打鸡蛋吗?
我确实认为有一天这一切都是可行的,但是让机器人做所有灵巧的烹饪工作在未来几年内是不可能的(我认为需要十年)。
[## moley——世界上第一个机器人厨房
亲爱的客户!谢谢你对我们的产品感兴趣。目前该产品正在开发中,但是您…
www.moley.com](https://www.moley.com/)
一些其他报告和相关领域。
已经有很多尝试通过开设无人餐厅或咖啡店来捕捉机器人的新奇感。将食物自动送上餐桌比餐馆里的几个机器人需要更多的协调。从供应链的角度来看,这可能是更有价值的 venter — 找出如何在没有人参与的情况下实现供应链的自动化和优化。
[## 食品机器人先驱接受订单满足日益增长的行业需求——机器人报告
本周,我参加了在旧金山举行的为期一天的食品机器人峰会。此次活动的演讲者来自许多…
www.therobotreport.com](https://www.therobotreport.com/food-robotics-pioneers-take-orders-for-growing-industry-appetite/) [## 旧金山的一些机器人餐厅正在倒闭。可能只是因为我们仍然想…
旧金山的机器人革命已经开始。还是有?这座以科技为中心的城市出现了自动化餐厅…
www.businessinsider.com](https://www.businessinsider.com/san-francisco-robot-restaurants-failing-eatsa-cafex-2020-1)
我喜欢上一篇文章的观点“也许我们仍然希望由人类来服务”,我认为这是我们推动自动化时被忽视的一点。我认为我们需要确保自动化对所有人都有好处(身体上,情感上,等等),然后我们才把钱投入到一些技术品牌的支票账户中。
[## 自动化大众化
让每个人都从人工智能热潮中受益可能比一些人预期的更具挑战性。
towardsdatascience.com](/democratizing-automation-744bacdc5e97)
作为一个 AI 研究者,一个厨师,也许这就是我的天职?实际上,我认为这样的应用程序让我很感兴趣:1)它们创造了一些感动世界的东西,2)我确信在这个过程中有很多有趣的问题。
[## 自动化大众化
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
c 罗能进球吗?让我们使用人工智能来找出答案!
原文:https://towardsdatascience.com/can-ronaldo-score-a-goal-let-us-find-out-using-an-ai-b6fc3364f0c5?source=collection_archive---------60-----------------------
在这篇文章中,我将讲述我们如何使用人工智能和机器学习算法来研究和预测克里斯蒂亚诺 罗纳尔多是否进球。
简介
在观看任何足球比赛时,我们都希望我们支持的球队能够进球。我们耐心地等待,直到我们支持的球队的一名球员足够靠近球门并射门,这似乎是要进球,但遗憾的是没有击中。但是,人工智能可以使用数据分析和机器学习来预测和解释为什么那个球员错过了那个特定位置的投篮吗?在这篇文章中,我们将实验不同的 ML 算法,并教一个 AI 预测一个球员是否会进球!
机器学习在许多不同的应用中发挥着关键作用,如计算机视觉、数据挖掘、自然语言处理、语音识别等。ML 在上述所有领域提供了潜在的解决方案,它肯定会成为我们未来数字文明的驱动力。在这里,我们将看到我们如何使用不同的机器学习算法,并建立一个简单的二进制分类器,该分类器将根据给定的输入数据对目标是否可以得分进行分类。这个项目是作为我参加的黑客马拉松的一部分完成的,这个项目的数据集也是由他们提供的。
在下一节中,我们将回顾不同机器学习算法的一些基本理论,我们将在本文的后面部分尝试编码和应用这些算法。
此外,整个项目代码可以在我的 Github 这里找到—https://github.com/rajatkeshri/ZS-HACK-predict-ronaldo-goal
有些理论
现在有很多机器学习算法。在这个项目中,我们将使用分类算法,因为我们在这里将需要预测是否进球得分。这也称为二元分类。
如果你对机器学习中不同的机器学习算法和分类类型有基本的了解,可以随意跳过理论部分。
机器学习中的分类有两种方式——监督和非监督。监督学习涉及给定的数据集以及每个数据点应该产生的输出。该算法学习产生特定输出的模式,并试图在监督下对其进行概括。监督学习基本上包含数据集中要预测的输出标签,并学习如何通过回溯和泛化来预测这些值。无监督学习对数据进行训练,并试图在不知道每个数据点属于哪个类别的情况下盲目地进行归纳。它创建一个模式,并根据其特征概括数据点,并在训练过程中为它们创建输出标签。
这里,我们将只关注监督学习方法。我们将尝试的一些监督学习方法有——线性回归、逻辑回归、随机森林和神经网络。要了解这些算法是如何工作的,请查看以下链接,这些链接解释得非常清楚,可以让您了解这些算法的工作原理。
- 线性回归—https://towards data science . com/linear-Regression-detailed-view-ea 73175 F6 e 86
- 逻辑回归—https://towards data science . com/logistic-Regression-detailed-overview-46 C4 da 4303 BC
- 随机森林—https://towards data science . com/random-Forest-and-its-implementation-71824 ced 454 f
- 神经网络—https://towards data science . com/first-neural-network-for-初学者-用代码解释-4cfd37e06eaf
现在让我们开始了解我们预测进球与否的工作和方法。在我们开始任何代码之前,我们应该做的第一件事是彻底检查数据集。我们必须完全理解数据集,并试图从我们将用于训练模型的数据集中找出最重要的特征。采样和提取错误的要素有时可能会导致模型不准确。
先决条件
以下软件包将用于该项目的开发。此外,我们将在这里使用 Python 3.6,但任何高于 3.6 的版本都可以使用。
- Sklearn —机器学习库
- Pandas —用于导入 csv 文件和解析列的库。
- Numpy —用于在数组中存储训练数据的库。Numpy 数组最广泛地用于存储训练数据,sklearn 库接受 numpy 数组形式的输入数据。
如果您的系统中没有任何库,只需 pip 安装那个特定的库。以下是使用 pip 的指南—https://www.w3schools.com/python/python_pip.asp
下面的代码片段显示了所有要导入的库。
import pandas as pd
import numpy as np
import math
import scipy
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
from scipy.stats import spearmanr
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import scale
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
数据集预处理
这里使用的数据集是一个 CSV 文件,包含皇家马德里与不同球队进行的不同比赛的信息。数据集包含描述罗纳尔多在不同情况和场景下进球的不同字段,如进球时间、距离球门多远、射门力量、进球角度等。如前所述,这个数据集是在一次黑客马拉松中给我的,我不确定它是否在 Kaggle 或任何其他网站上公开。不管怎样,数据集都在我的 Github 链接上,你可以从这里下载——https://github.com/rajatkeshri/ZS-HACK-predict-ronaldo-goal
下图显示了数据集的一些列。从数据集中,我们将使用以下各列作为输入数据-位置 x、位置 y、拍摄功率、拍摄距离、剩余时间和目标列作为输出标注。您也可以使用其他字段来训练模型并进行实验,但是在本文中,我将解释这 5 个输入字段数据列的用法。
我们注意到有许多字段是空的,并且在这个数据集中有许多噪声。我们的第一步是检查数据集,修复有噪声的数据,并删除所有的空字段。
现在让我们跳到代码。首先,我们使用 pandas 打开数据集 csv 文件,并定义类似输入数据的列和作为训练输出标签的列。这里,列 10 是“is_goal”列,其作用类似于输出标签,而 2、3、4、5、9 列分别是输入标签 location_x、location_y、remaining_sec、power_of_shot、distance_of_shot。如果您想尝试使用 data.csv 中的其他要素列来训练您的模型,只需在数组中添加这些列号。
datasets = pd.read_csv('data.csv')output=pd.DataFrame(datasets)
cols = [10]
output = output[output.columns[cols]]df = pd.DataFrame(datasets)
cols = [2,3,4,5,9]
df = df[df.columns[cols]]
一旦我们从 csv 文件中读取了特性,我们必须仔细检查并移除这些列中的所有干扰。我们遍历这些特性,检查该列的特定值是否为 NAN。如果是 NAN,我们就删除整行,去掉所有有噪声的数据。一旦去除了噪声数据,我们将多个列特征的整个二维数组存储在变量 X 和 y 中。
#Removing rows with Output label not defined
k=0
x=[]
for i in df["is_goal"]:
if math.isnan(i):
x.append(k)
#print(i)
k+=1
df=(df.drop(x))#Removing rows with distance of shot not defined
k=0
x=[]
for i in df["distance_of_shot"]:
if math.isnan(i):
x.append(df.index[k])
#print(i)
k+=1
df=(df.drop(x))#Removing rows with power of shot not defined
k=0
x=[]
for i in df["power_of_shot"]:
if math.isnan(i):
x.append(df.index[k])
#print(i)
k+=1
df=(df.drop(x))#Removing rows with X axis location not defined
k=0
x=[]
for i in df["location_x"]:
if math.isnan(i):
x.append(df.index[k])
#print(i)
k+=1
df=(df.drop(x))#Removing rows with Y axis location not defined
k=0
x=[]
for i in df["location_y"]:
if math.isnan(i):
x.append(df.index[k])
#print(i)
k+=1
df=(df.drop(x))
#print(df)#Removing rows with remaining time not defined
k=0
x=[]
for i in df["remaining_sec"]:
if math.isnan(i):
x.append(df.index[k])
#print(i)
k+=1
df=(df.drop(x))
#print(df)X = df.iloc[:, :-1].values
Y = df.iloc[:, 4].values
现在,我们有了干净的数据集,任何行或列都有噪声和空值。我们在这里要做的下一步是将整个数据分解成列车和测试数据。这样做是为了在训练数据上训练我们的模型,然后测试它的准确性和在测试数据上的分数。这将帮助我们理解我们的模型在预测中的地位,从而帮助我们调整模型。
在这里,我们使用从 sklearn 库中导入的函数 train_test_split 来分割训练和测试数据。随机状态基本上是指用作训练和测试数据的数据的百分比。0.2 表示 20%。
(X_train, X_test, Y_train, Y_test) = train_test_split(X, Y, random_state=0.2)
训练
我们完成了对数据集的理解,并通过一些预处理清理了数据集。剩下的唯一步骤是训练模型。如前所述,我们将使用线性回归、逻辑回归、随机森林回归和神经网络来训练我们的模型。这些算法可以直接在 sklearn 库中获得,这就是我们将要使用的。
首先,我们创建不同机器学习算法的对象,然后将带有输出标签的输入特征传递给它们。这些算法基于我们提供给它们的数据进行了推广。为了训练这些模型,我们称之为”。适合”在这些物体上。关于每个机器学习算法类的更多信息,请参考本网站—https://scikit-learn.org/stable/。
LR=LinearRegression()
Lr=LogisticRegression(random_state=0, solver='lbfgs', multi_class='ovr')
RF = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=0)
NN = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)LR.fit(X_train,Y_train) #linear regression
Lr.fit(X_train,Y_train) #logistic regression
RF.fit(X_train, Y_train) #random forest
NN.fit(X_train, Y_train) #neural network multi-layer perception model
培训完成后,我们会检查不同型号的表现。这可以通过调用。评分”的方法。”的声音。score”方法打印出我们的模型在测试数据上表现的准确性。
print(LR.score(X_test,Y_test))
print(Lr.score(X_test,Y_test))
print(RF.score(X_test,Y_test))
print(NN.score(X_test,Y_test))
此外,如果我们想检查对测试数据的预测,或者给出新的数据值,并预测是否进球,我们可以使用。预测”的方法。预测方法后产生的输出为 1 或 0,其中 1 表示“是的,他进球了!”0 代表“运气不好,他下次一定会得分”。
loc_x = 10
loc_y = 12
remaining_time = 20
distance = 32
power_of_shot = 3
custom_input=[[loc_x,loc_y,remaining_time,power_of_shot,distance]]print(LR.predict(X_test))
print(Lr.predict(X_test))
print(RF.predict(X_test))
print(NN.predict(X_test))print(Lr.predict(custom_input))
结果
首先,祝贺您,我们成功构建了二元分类模型 AI,可以预测罗纳尔多是否能进球。我们观察到这是一个基本的二进制分类问题,逻辑回归以约 95%的准确率表现最好,但其他机器学习模型表现良好,准确率约为 60-70%。通过在模型的训练中加入更多的特征,这种准确性肯定会得到提高。
谢谢你的时间。希望你喜欢这篇文章。干杯!
社交平台如何利用深度学习预防精神疾病
原文:https://towardsdatascience.com/can-social-platforms-detect-mental-illness-using-deep-learning-models-6475716a2f71?source=collection_archive---------45-----------------------
韩国最近的大学研究表明,他们可以。但是他们应该吗?
乔希·里默尔在 Unsplash 上的照片
想象一下:这是一个下雨天,由于一级防范禁闭,你已经几个月没有出门了。在过去的几个月里,你一直感到昏昏欲睡,除了抱怨之外,通常没有心情做任何事情。你写了一篇关于脸书的文章给你的朋友,再次发泄对生活的不满。突然,你的手机上弹出一条脸书通知,建议你向附近一位专门从事抑郁症和认知行为治疗的治疗师寻求医疗建议,提供免费咨询。
我们可能很快就会生活在这样一个世界,你上传的每一篇社交媒体帖子都经过预先筛选,以检查你的心理健康:经过科学验证的模型和算法可以预测你是否有患精神疾病的风险。这是一个你认为可能的世界吗?这是你想生活的世界吗?
心理健康的重要性不能低估。根据疾病控制和预防中心的数据,自杀是美国青少年死亡的第二大原因。CDC 的另一项研究也发现,从 2007 年到 2017 年,青少年自杀率上升了 56%——这一上升与我们今天所知道和喜爱的许多社交媒体平台的推出和采用增长相吻合。
随着现代脆弱性和透明度变得越来越普遍,社交媒体用户越来越多地在帖子中分享详细的感受或情绪状态。这数以百万计的帖子被用于资本主义目的,如在线广告,但它们同样可以用于帮助用户的健康。
这项研究
韩国成均馆大学和卡内基梅隆大学的研究人员 Kim,Lee,Park 和 Han (Kim 等人,2020 年)最近进行的一项研究展示了一种深度学习模型,该模型可以根据一个人发布的信息来识别他的精神状态。这项研究扩展了 Gkotsis 等人(2014 年)以前的研究,这些研究使用深度学习模型来自动识别与精神疾病相关的帖子以进行分类。
通过分析和学习用户写的帖子信息,Kim 等人(2020)提出的模型可以准确地识别用户的帖子是否属于特定的精神障碍,包括抑郁症、焦虑症、躁郁症、边缘型人格障碍、精神分裂症和自闭症。该模型为基于用户的帖子来检测用户是否有患精神障碍的风险提供了基础。
这项研究促使我们向我们选择的社交平台提出一些基本问题:
- 是否有可能创建一个普遍的深度学习模型来帮助识别潜在的精神疾病患者?
- 社交媒体平台应该监控其用户的心理健康 状态吗?
- 如果社交媒体平台的数据显示某个用户有严重的精神疾病风险,那么该平台有什么责任?
- 什么样的干预会有用?
在试图回答这些问题之前,让我们仔细看看这项研究。
迈克尔·朗米尔在 Unsplash 上的照片
但首先,什么是深度学习?
已经有各种各样的帖子涵盖了深度学习的基础知识。如果你想要一个关于它的简短入门,我推荐阅读这个由 Radu Raicea 撰写的优秀的 medium post 。我从中学到了很多,我相信那些给了 40K+掌声的人也同意!
简而言之,深度学习是一种机器学习方法,它允许我们在给定一组输入的情况下,训练一个人工智能(AI)来预测输出。
更具体地说,深度学习方法通过创建数据和处理动作的神经网络,使用神经网络来模仿动物智能。神经网络处理有三层神经元:输入层、隐藏层、输出层。
深度学习方法中的输入可以是:
- 监督——给模型输入,告诉它预期输出。Radu 举了一个预测天气的人工智能的例子。它学习使用历史数据预测天气,其中模型具有训练数据输入(压力、湿度、风速)和输出(温度)。
- 无监督——使用没有指定结构的数据集,让 AI 对数据进行逻辑分类。Radu 以一个电子商务网站的行为预测人工智能为例。虽然它不会通过使用输入和输出的标签数据集来学习,但它会对输入数据进行分类,并告诉你哪类用户最有可能购买不同的产品。
深度学习通过基于监督和非监督数据训练 AI,结合了两个世界的最佳之处。然而,模型需要巨大的数据集和计算能力来得出有意义的结果和预测,因为中间需要多个隐藏的计算层。
创建深度学习模型
Kim 等人(2020 年)提出了一个关键的研究问题:
研究问题:我们能否在社交媒体上鉴别一个用户的帖子是否属于精神疾病?
他们从红迪网(Reddit)收集用户的帖子,红迪网是一个受欢迎的社交媒体,包括许多与精神健康相关的社区(或所谓的“子社区”),如r/depression
、r/bipolar
和r/schizophrenia
。
他们的研究论文详细介绍了他们的方法,但简而言之,他们采用了以下方法:
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
数据收集
Kim 等人(2020 年)从以下六个与精神健康相关的子主题中收集帖子数据,每个子主题据报告都与一种特定的障碍有关:r/depression
、r/Anxiety
、r/bipolar
、r/BPD
、r/schizophrenia
、、和、、*r/autism*
此外,他们还进一步从r/mentalhealth
、收集帖子数据,以分析具有一般心理健康信息的帖子。从每个子编辑中,他们收集了至少有一篇与精神健康相关的帖子的所有用户 id。
数据预处理
需要对数据进行清理和格式化,以便模型能够有效地处理数据,例如对用户的帖子进行分词(将句子拆分成独特的单词)并过滤掉频繁使用的单词(停用词)。在这个过程之后,他们能够获得 228,060 个用户的 488,472 个帖子进行分析。
数据分类
创建六个二进制分类模型,每个模型将用户的特定帖子归类到以下子类别之一:r/depression
、r/Anxiety
、r/bipolar
、r/BPD
、r/schizophrenia
和r/autism
。
Kim 等人(2020 年)发现,之前的一项研究(Gkotsis,2017 年)用有多种症状的用户的帖子训练了一个模型,结果受到噪音数据的影响。通过开发六个独立的模型,每个模型都使用用户只遭受一种特定精神问题的数据,他们能够准确地识别用户的潜在精神状态。
建立建模架构
这部分相当复杂,所以如果你对内部工作感兴趣,我建议你直接进入 Kim 等人(2020)的研究。对于那些想知道模型应用了什么原则的数据科学技术人员来说,以下是主要标题:
- 他们把上面的数据分成两部分:80%用于训练,20%用于测试
- 他们使用了两种最流行的机器学习方法:卷积神经网络(CNN)方法(T11)和 XGBoost 方法(T13)
- 他们应用了至少四个不同的计算层:嵌入层、卷积层、最大池层、密集层
- 他们发现,该模型在他们的模型中显示了积极的准确性(输出):所有类别的
Accuracy
在 70%到 95%的范围内,但F1-Score
(通常被认为是比Accuracy
度量更好的错误分类案例的度量)在 45%到 55%的范围内。
请注意,F1-Score
的范围是从 0 到 1——越接近 1(完美),您的分类器就越精确(即,它正确分类了多少个实例),模型预测就越稳健。
结果和局限性
总而言之,Kim 等人(2020)提出的模型在检测可能有心理障碍的潜在用户方面显示了相当大的潜力。
该研究确实存在一些局限性,如阶级不平衡、社会人口统计和地区差异对数据的影响,以及数据来自 Reddit 的事实,这可能使用户更倾向于表达他们相对于其他社交网络的情绪。研究人员承认,他们将把该模型重新应用到脸书和 Twitter 等其他社交媒体平台,以进一步验证该模型。
威廉·艾文在 Unsplash 上的照片
问题和影响
数据科学表明,我们可以预测用户何时有患精神疾病的风险。但是,我们现在面临着一个道德和使用数据检测和治疗精神健康状况的十字路口。让我们重温一下这个故事开头的考题:
是否有可能创建一个普遍的深度学习模型来帮助识别潜在的精神疾病患者?
如上所述,准确的深度学习模型在技术上是可行的,并且有了适量的数据,就可以创建强大的预测引擎。Kim 等人(2020 年)和 Gkotsis 等人(2017 年)的研究显示了巨大的潜力,但仅限于 Reddit 数据。然而,这些模型可以被验证并扩展到其他社交平台数据源,包括:
- 脸书搜索术语、帖子和评论,无论是在他们的墙上,还是在他们朋友的墙上,以及任何一般性的评论。
- Twitter 搜索词、帖子和主题。根据用户是否在其转发帖子中陈述观点或评论,转发也可能提供一些指示。
- Instagram 照片评论,可能包括一些基于光学字符识别的数据分类,以检查用户发布的图像在情感上是积极的还是消极的。
上面提到的数据必须以保护用户隐私的方式使用,但稍后会详细说明。
社交媒体平台应该监控其用户的心理健康状况吗?
“是”的拥护者可能会说,这些平台应该监控我们的帖子,只要用户同意平台以道德的非滥用方式进行健康检查。毕竟,许多用户签署了将他们的数据用于资本主义营销目的的条款和条件,因此使用数据来帮助拯救某人的生命(例如,在确定某人有自杀风险的情况下)似乎是一个良好的社会结果。
“不”的倡导者可能会指出数据隐私法,以及将数据和见解进一步转售给广告商,然后出售针对精神健康问题的私人健康解决方案的风险。特朗普总统 2016 年竞选活动聘请的政治数据公司剑桥分析公司(Cambridge Analytica)在那段时间影响用户行为以及他们的政治观点,这一风险没有得到更好的证明。也就是说,脸书已经走了很长的路来重建他们的声誉和数据滥用,稍后讨论。
如果社交媒体平台的数据表明一个用户有严重的精神疾病风险,那么他们有什么责任?
社交媒体平台或许应该注意一些责任,包括:
- 在保护隐私的同时向研究人员和卫生从业者提供数据:2018 年,脸书宣布了一项举措,帮助独立研究人员分析该平台对选举的影响。社交媒体平台可以做和脸书一样的事情,但是使用与用户心理健康相关的数据,而不是选举数据。可以使用上述研究人员建议的模型对精神健康数据进行分类,并且可以使用差分隐私等技术,以符合隐私法的方式向研究人员安全地提供对数据的访问。
- 与学术界合作,征求使用数据造福社会的独立研究:脸书在 2018 年公布的计划成立了一个委员会,以制定关于社交媒体对社会影响的研究议程——从选举开始。该委员会制定了研究提案请求,并选择了哪些受资助者(研究人员)应获得继续其研究的机会和资金。
- 根据经过验证的研究结果更新产品路线图:仅仅将数据提供给学术界是不够的——社交媒体平台应该开辟出专用的产品路线图容量,以改善其用户的心理健康。困难的部分是,假设研究人员将随着时间的推移提供有效的建议,将优先考虑首先建立哪个计划。评估社会影响的优先化框架是我将来想探索的一个话题。
Marcelo Leal 在 Unsplash 上拍摄的照片
什么样的干预会有用?
从产品的角度来看,我可以看到各种有用的功能,但它们取决于需要验证的不同假设:
- 当一组特定的条件被触发时,向用户推送关于附近精神健康护理的详细信息的通知:假设有人在抑郁状态下发帖:可以在社交媒体平台的屏幕上显示警报或弹出窗口,向用户建议一些精神健康预防提示或潜在的治疗中心(例如,治疗实践或用户可用的电话热线)
- 发送到用户的健康应用程序的数据或事件,其中精神健康风险评分发生变化,供应用程序采取行动:例如,一旦用户使用社交媒体平台的访问(登录)凭证登录到冥想应用程序(例如 Headspace 、 Calm ),应用程序可以从社交媒体平台接收某些事件已被触发的通知,并且应用程序可以使用该数据来建议针对用户定制的治疗或补救措施。
- 采取预防措施,使用户在短时间内无法部分或全部使用社交媒体平台。这一点需要验证,因为缺乏表达想法的社交媒体渠道也可能对有风险的用户产生负面影响。从社交媒体平台的角度来看,暂停用户可能也很难消化,因为它会导致平台参与度和采用度下降。
- 广告被公共心理健康公告取代。作为一项公共服务,广告或许应该被精神健康公告所取代。另一种选择是使用私营部门精神健康治疗产品的广告空间;然而,这些公司可以利用这一优势,通过简单地比竞争对手出价更高的价格,向不老练的用户出售无效的产品。
无论干预是什么,都需要大量的实验和安全控制测试来确保任何心理健康干预措施的有效性。
结束语
我很想知道你是否认为社交媒体平台确实在预防精神健康问题的发生方面发挥了作用。当这样的问题出现时,我主张平台在对待或帮助用户理解他们有什么资源可以帮助自己方面扮演更积极的角色。
你有什么想法可以提供什么样的干预(也许是特征)来预防或治疗心理健康疾病吗?渴望在下面的评论中听到他们!
参考
- Kim,j .,Lee,j .,Park,E. et al. 从社交媒体上的用户内容中检测精神疾病的深度学习模型。 Sci Rep 10, 11846 (2020)。https://doi.org/10.1038/s41598-020-68764-y
- Gkotsis,g .,Oellrich,a .,Velupillai,S. 等人使用知情深度学习表征社交媒体中的心理健康状况。 Sci Rep 7、 45141 (2017)。https://doi.org/10.1038/srep45141
神经激活的动态链接能让我们更接近强人工智能吗?
原文:https://towardsdatascience.com/can-the-dynamic-linking-of-neural-activations-bring-us-closer-to-strong-ai-bc85b64c9f82?source=collection_archive---------17-----------------------
大多数人工神经网络忽略了生物神经网络的尖峰性质,以简化底层模型并实现诸如反向传播的学习技术。但是这样做,我们不就有可能拒绝了生物神经网络最核心的原则之一吗?
在大多数人工神经网络模型中,激活只是与神经元本身相关联的实数。但这并不是生物神经网络中发生的事情。这里,当神经元的阈值被超过并且存在与之相关联的确切时间点时,激活发生。此事件发生的先决条件是在当前激活之前已经触发了其他几个输入激活。例如,如果我们有这样一个事件驱动的神经网络,其中一个神经元代表单词“the”,那么代表字母“t”、“h”和“e”的神经元需要首先激活,然后才能激活代表单词“the”的神经元。如果发生这种情况,我们就有了连接单个字母神经元激活和单词“the”神经元激活的激活链。这些激活链接对应于已经被激活的神经元的突触。这些链接的特别之处在于,它们可以将输入数据中的所有激活接地。单词“The”可能在给定的文本中出现数百次,但是激活链接允许这些出现的任何一个的激活被精确地引用。在本文中,我将展示激活链接也可以用于另外两个重要的任务,这将允许网络处理符号信息。首先,激活链接可以用来表示输入数据中的对象之间的关系,例如单词或短语。我之前在关于将符号推理集成到深度神经网络的文章中讨论过这个问题。然而,当时这种方法仍然需要对神经模型进行一些丑陋的扩展,如突触之间的激活和关系链接中的位置槽。不幸的是,没有简单的方法来为这些关系链制定一个适当的培训机制。第二,激活链接允许文本中的歧义信息被同时评估。在文章《关于给神经网络添加负向循环突触》中,我描述了如何使用二叉查找树系统地搜索给定文本的不同解释。但是对于这种评估,搜索树真的有必要吗?
关系
如果我们看一下前面表示关系的模型,我们可以看到,每个激活中的槽用于确定每个激活的开始和结束位置,突触之间的关系链接用于确保字母以正确的顺序出现。
现在,如果我们想摆脱插槽和关系链接,我们应该问自己是否有一种方法来表示这些规则的神经元。因此,我们需要采取的第一步是添加一些代表字母之间关系的神经元。这可能如下所示:
这里我们有一个关系输入神经元,当且仅当神经元‘t’和‘h’的两个输入字母激活连续发生时,它才会被激活。这种关系信息在先前的模型中通过槽位置彼此之间的关系被隐含地给出。现在我们有一个神经元明确地表达了这些信息。请注意,激活链接是这种表示的组成部分。由于关系神经元只是一个输入神经元,突触不用于计算关系激活的激活值。到目前为止,我们只有网络的输入层,但我们如何将单词“the”的神经元与该输入层匹配呢?如果我们再看看旧模型,我们会发现我们需要某种方法来替换突触之间的关系。只用单个神经元很难做到这一点,但如果我们分裂神经元,并为之前的每个突触添加一个新的神经元,会怎么样呢?然后,这些新的神经元代表某个输入字母的出现,例如单词“the”模式中的“t”。因此,这个网络的模型可能如下所示:
蓝色的激活链接来自阳性循环突触,这意味着它们最初被认为是完全活跃的。为了保持激活的关系完整性,我们需要确保激活不会任意链接到任何输入激活。例如,如果单词“the”的各个字母属于不同的单词,那就没有意义。为了实现这一点,添加到激活中的任何输入链接都必须与该激活的其他链接之一共享一个共同的祖先激活。如果我们查看激活' the'-'h ',我们可以看到它有激活' t ',' h ',' the'-'t '和' the '作为连接各个输入链接的共同祖先激活。通过其输入链接,激活“the”-“h”验证输入字母“h”的激活存在,激活“the”-“t”存在,将字母“t”与整个单词的模式相关联,并且存在将这两个输入绑定在一起的关系激活。一旦一个单词被识别,另一个神经元就可以代表与前一个或下一个单词的关系。这就是我们识别更大的模式如短语所需要的。
学问
现在你可能会认为,对于每个音节、每个单词或每个短语,有大量的神经元和突触需要反复训练,并且需要大量的训练数据。嗯,不是。使用文章'中描述的元神经元使用元神经元从单个训练示例中学习事实,可以用很少的示例训练一个新单词。这些元神经元可以捕捉我们激活的动态结构,并将它们存储为新的记忆。在这个过程中,产生了新的神经元和新的突触。换句话说,这种机制允许将“工作记忆”中表现为激活和激活链接的知识转移到由神经元和突触组成的“长期记忆”中。因此,不需要单独的知识库来存储关于世界的事实。
解释
当负循环突触被添加到神经网络的架构中时,神经网络获得了很大的灵活性。这对于许多现实世界的推理任务来说至关重要。这些负向循环突触允许在网络内产生相互排斥的状态。基本上,在这种情况发生的每一点,输入数据的可能解释都会发生分支。许多优秀的老式人工智能研究都与搜索这类状态空间有关。例如,语法分析树在非常有限的语法域中搜索状态空间。这种限制的问题是解析结果不仅取决于语法信息,还取决于文本中包含的所有其他信息。此外,歧义不仅发生在句法层面,也发生在语义或语用层面。
在我以前的工作中,我使用二叉查找树来寻找给定目标函数的全局最优解,该目标函数基于各个激活的净值。然而,这种方法存在一些问题。首先,人脑进行类似的搜索似乎不太可能。第二,通过对搜索路径上的权重求和并选择权重最高的一个,在网络本身的架构之外发生了一种信息的反向传播,直观上这似乎是不对的。那么还有什么选择呢?难道不可能同时跟踪所有这些分支解释的传播吗?这种方法的先决条件是这些不同的解释不会混淆。因此,在一个分支中推断的激活不应该对另一个分支可见。但是因为我们已经在激活链接期间要求一个共同的祖先激活,我们可以简单地检查我们是否进入了一个不同的分支。现在我们已经有了在不同解释中传播的所有激活,我们仍然需要决定我们想要选择哪个解释。这个决定不一定是二元的。它可能是一个概率,然后传播到所有依赖的激活。这种方法的一大优势是我们现在可以在本地做出这些决定。这并不意味着这些决定不应该受到未来结论的影响。前面提到的搜索过程中的信息反向传播在某种形式上仍然是必要的,但有一种更简单、更优雅的方式来实现这一点——只需使用正向循环突触来实现。这些允许推理链的早期阶段被告知随后得到的结论。
举个例子,请看下面的网络图。这里我们有两个互斥的神经元 A 和 B,它们通过一个抑制性神经元和负性循环突触相互抑制。现在,如果我们将一个激活输入到 IN 中的输入神经元,我们将在神经元 A 和 B 中产生激活。由于这些神经元相互排斥,因此会发生一个分支,其中激活 A 或激活 B 被抑制。
从这一点开始,网络将同时遵循输入数据的两种互斥解释。这非常类似于使用一阶逻辑规则和非单调逻辑进行推理的正向链接专家系统。当然,这意味着我们正在遇到同样的问题,这个问题严重困扰着基于一阶逻辑的系统——也就是说,当把这些规则堆叠在一起时,会出现组合爆炸。当一个神经网络这样做的时候,它就会变得神经错乱。但与二进制的基于逻辑的系统不同,具有软加权突触的神经网络为这个问题提供了一个优雅的解决方案。在训练中,我们可以简单地惩罚被其他更可能的解释所抑制的过度激活。
这里的抑制性神经元是分离的,这意味着一旦它的一个输入被激活,它就会激活。抑制性神经元的目的是防止必须连接所有互斥的兴奋性神经元,这将导致负突触数量的平方增长。
与其他网络的比较
在处理文本或图像数据时,每个神经元需要多次激活,这一点已被 LSTMs 等其他神经网络架构所认识。他们通过重复复制整个网络来实现固定级别的令牌化,从而解决了这个问题。这些循环神经网络必须付出的代价是不灵活,这来自每个神经元所需的固定激活次数。对于文本中需要处理的所有不同类型的信息,如字符、音节、单词、短语、句子、段落等,根本没有最佳的标记化级别。因此,每个神经元的激活数量需要取决于数据,而不是网络的架构。
因果关系
事件驱动的神经网络甚至有一个简单的机制来处理因果关系。干预当然是不可能的,因为网络只是观察,但它可以得出结论,如果激活 A 发生在激活 B 之后,A 很可能不是 B 的原因。这一知识可以用于减少从 A 到 B 的突触的权重。
观点
大多数其他神经网络架构是由神经元如何相互连接的拓扑来定义的。相比之下,我认为这里描述的人工神经网络应该从一张白纸开始,只包含原始的输入神经元。然后,在训练过程中,某些输入神经元会反复一起放电。这种激活的共现可以随后用于诱导和训练新的兴奋性神经元。随着时间的推移,当越来越多的兴奋性神经元得到训练时,这些兴奋性神经元中的一些神经元之间会有一些相似性。通过相似性,我的意思是这些神经元与特定的其他神经元或一组其他神经元共享共同的输入突触,这些突触通过抑制性突触被引用。然后,这些相似的兴奋性神经元可以与其抑制性神经元一起聚集成元神经元。然后,抑制性神经元充当整个兴奋性神经元组的类别神经元。另一方面,元神经元能够检测在特定情况下,是否存在应当由该组的兴奋性神经元覆盖的知识缺失。正如你所看到的,这种神经网络的架构不是由神经元之间预定义的一组连接给出的,而是通过不同类型的神经元和突触的规范给出的。
结论
如前所述,激活链接有两个重要的作用。它们对链接输出激活的激活值有贡献,并将激活绑定到输入数据中已呈现的真实世界对象。
项目页面: aika.network
GitHub 页面:https://github.com/aika-algorithm/aika
无条件语言模型能恢复任意句子吗?—论文摘要
原文:https://towardsdatascience.com/can-unconditional-language-models-recover-arbitrary-sentences-a-paper-summary-98530f2316c7?source=collection_archive---------42-----------------------
针对预训练语言模型的非常规方法的总结,以确定它们是否可以用作通用解码器
这些天来伯特、埃尔莫和厄尼让人想起预先训练的生成模型,而不是芝麻街人物,这就是他们在自然语言处理领域的霸权。这些模型可以用作通用编码器,甚至可以执行一些任务,如文本分类,而无需进一步修改。然而,对相反情况的研究有限,将这些模型用作通用解码器。这篇文章是纽约大学研究人员的论文的摘要,该论文试图确切地确定这一点,即这些模型是否可以从编码表示中恢复任意句子。
摘要
为了证明可用于恢复句子的编码表示的存在,本文介绍了将这些表示馈送到自回归训练的递归语言模型中的方法,以及将句子映射到这个【重新参数化】空间中和从这个空间中映射出来的方法,同时保持主要语言模型参数不变。**
方法
回顾递归语言模型
在我们开始之前,让我们快速地看一下递归语言模型,以及如何对它们进行自回归训练。
自回归语言模型的数学表示。(来源:论文)
回想一下,在自回归模型中,我们将所有先前的标记作为输入,将其与先前的隐藏状态相结合,并计算下一个标记。这种隐藏状态经常被实现为一个【LSTM】递归网络,最终输出无非是一个soft max函数,它表示特定单词成为下一个令牌的专用概率。****
想象和重新参数化句子空间
好的,现在我们知道了循环语言模型是如何工作的,我们试着想象一个特定的句子在空间中是什么样子的。如果我们假设隐藏状态具有维度“d”(其本身基于 LSTM 单位的维度),那么一个句子可以被想象为这个 d 维度空间中的轨迹,因为这个轨迹在考虑了先前发出的令牌之后发生了演变。******
对于这个给定的轨迹,从这个空间恢复特定的句子会变得困难,主要是由于 1)句子长度没有被编码在轨迹中,以及 2)单个错误表示的标记可能完全偏离轨迹的事实。因此,研究人员希望将这种轨迹转换为平面向量表示,他们通过在网络中的先前和细胞状态中添加额外的隐藏偏差来实现这一点。
添加所描述的附加偏置通过左)投影时偏置尺寸< model dimension and Right) use of soft-attention when bias dimension >模型尺寸。(来源:论文)。
在所提出的重新参数化下,句子空间中的隐藏状态的轨迹映射到变换后的句子空间中的向量(比如维度“d“₁”),并且最终充当在该句子空间中来回移动的容器。需要注意的一点是,如果这个维度" d"₁"小于模型维度,随机矩阵会将偏差投射到隐藏状态上。反之,如果 "d ₁ " 较大,则软注意用于将投影缩小到模型尺寸(如下图所示)。****
向前和向后估计
因此,有了在这个空间中来回移动的概念,研究人员试图描述这样做的机制,包括向前移动——将一个句子从模型投射到新描述的空间中的一个点,以及向后移动——从这个空间中的这个点恢复一个句子。
对于正向估计,他们从任意偏差开始,如前所述,将任意偏差添加到所有状态。然后,他们对这种偏差(比如说 z) 进行优化,以提高这种偏差产生完全相同句子的概率,同时保持语言模型参数不变。这种优化是通过任何基于梯度的算法实现的,例如非线性共轭下降。
为了从这一点(表示为 z )返回,遵循上述相同的过程,唯一的不同是优化被反向以产生相同的句子序列,而不是在z上。由于向后估计不是直接的过程,所以采用了波束搜索,一种检测最有希望的序列的启发式算法。**
实验和观察
为了证明上述假设,分别为小型、中型和大型语言模型构建了具有 256、512 和 1024 个 LSTM 单元的两层神经模型。这些模型接受了来自英语 Gigaword 新闻语料库的 5000 万个句子的训练,最终产生了 20234 个子单词的词汇。
对于可恢复性质量的测量,讨论了三种方法。
- 精确匹配:它展示了一个句子(令牌序列)从其编码表示中的完美可恢复性。
- BLEU :上述的平滑版本,其中考虑到最大 n-gram 重叠给出了标准化评级(0-1,1 为精确匹配)。
- 前缀匹配:这度量从句子的开头完美恢复的最长的连续记号序列,然后在句子长度上标准化。
最后,对于每个语言模型,将偏差的维度 z (表示为上面的 d ₁)设置为 128,256,512,1024 …到 32768,并评估 100 个句子的可恢复性,结果如下所示。
在所有三种类型的测量中,三种不同模型尺寸的可恢复性。(来源:论文)
据观察,可恢复性随着尺寸 z 的增加而增加,直到其等于模型尺寸,之后达到稳定状态。我们还观察到,大型模型的可恢复性接近完美,达到精确匹配≥ 99,中型模型的可恢复性非常高,达到精确匹配≥ 84。此外,观察到对于长度为> 30 的句子,句子恢复失败,这表明较长序列的固定向量表示不能充分包括来自该序列的所有基本信息的限制。
为了研究域外句子的可恢复性,模型在 TED talk 上进行测试,在中型和大型模型上都观察到了近乎完美的 BLEU 度量。在域外句子上的这种异常表现表明,该模型不仅记住了例子,而且实际上学习了关于语言的信息来执行这种恢复。
域外句子的 BLEU 可恢复性。(来源:论文)
结论
因此,上面描述的方法证明了可以存在一种特定的编码表示,我们可以从中恢复任意的句子。小型模型的低可恢复性和大型模型的近乎完美的可恢复性表明需要一个相当合适的模型来实现高可恢复性。
随着句子长度的增加,可恢复性下降,还观察到恢复较长句子的总体困难。然而,从甚至域外句子的高度可恢复性可以推测,随着模型大小的进一步增加,退化点可以延长。
最后,模型的隐含句子空间可以被正则化,从而增加可恢复性以及作为通用解码器的无条件语言模型的适用性。
参考
- N·苏布拉马尼,S·鲍曼,K·乔(2019)。无条件语言模型能恢复任意句子吗? 神经信息处理系统进展 32 (NIPS 2019)
真空罐能更快的去除咖啡豆中的气体吗?
原文:https://towardsdatascience.com/can-vacuum-jars-remove-gas-from-coffee-beans-faster-4a5a40981be2?source=collection_archive---------41-----------------------
咖啡数据科学
一项关于味觉和提取的小研究
几个月前,我阅读并总结了一篇优秀的关于咖啡豆脱气速度快慢的研究文章。我想,也许真空可以加速排气。在烘焙的前两周,我很难取出一杯浓缩咖啡,我认为这主要是因为二氧化碳。
本文所有图片均由作者提供
咖啡通常用真空密封袋装运,袋内空间相对较小。我想我可以用一个真空罐来加速脱气,其中一半的空间是空的。希望我能尽快使用这些豆子,而不是等上几个星期。
结果:它没有帮助加速脱气,但它确实改善了口感,正如我在收集的一些数据中展示的那样。然而,脱气速度的数据仍然很有趣,即使我使用廉价的硬件来测量重量。我仍然能够看到真空罐脱气比密封罐稍快。
图片来自之前出版物的作者:https://link.medium.com/d6dmEwaQhbb
这项研究的另一个结果是,由于普通罐子和真空罐子之间的脱气大致相同,真空罐子豆子和非真空罐子豆子之间的味道改善可能更多地与氧化有关,而不是任何其他变量
脱气数据
每次烘焙后,我将烘焙食物分成两个容器(除了第一次烘焙的埃塞俄比亚和萨尔瓦多豆,在前两列)。在豆子进入罐子之前,我称了它们的重量,我称了罐子和豆子以及盖子的重量。目的是能够在一天内多次快速称量咖啡豆。每次烘焙,我分别烘焙两种咖啡豆,所以每种咖啡豆通常都是成对的。
我做了一个快速测试,以了解规模如何受到位置的影响。因此,我的目标是中心位置保持一致。
测量使用精确度为+/-0.03 克的标尺。根据之前的脱气工作,几天后的差异应该在每 100g 咖啡 0.20g 左右或者 2 mg/g 左右,这是我发现的左右,但是几天之间的结果有点嘈杂。
所有图片由作者提供
与真空罐相比,更容易总结罐的所有数据。在最后的比较中,真空似乎没有改善脱气。
即使观察一段时间内的数据,体重下降的幅度似乎也很相似。
这张图显示了秤的精度问题,因为损失是负数,这是不可能的。通常,一天中的时间会影响测量,因为我的房子一整天都会有几度的轻微温度变化。
我们可以观察随时间推移的累积效应,在过去的 5 天里,我没有很好地称量每天的咖啡重量,所以它显示罐子的平均值高于真空。该平均值还假设过去 5 天未测量的咖啡豆脱气量保持不变。我认为这可能只是噪声的一部分,因为 0.4 毫克/克的差异约为 0.04 克。0.04 克非常接近秤的噪声(0.03 克)。
总的来说,这些结果表明,真空密封并没有像提取时间或两周前提取的能力所表明的那样,在脱气方面产生很大的差异,但之前的一项使用这些豆子的研究表明,它改善了味道。因此味道的下降一定是由咖啡豆的氧化引起的,而不是 CO2 和香料的释放。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以在中关注我。
我的进一步阅读:
按地区、工艺、等级和价格分类的咖啡
家庭烘焙咖啡的经济学
咖啡豆脱气
解构咖啡:分割烘焙、研磨和分层以获得更好的浓缩咖啡
浓缩咖啡的预浸:更好的浓缩咖啡的视觉提示
咖啡的形状
搅拌还是旋转:更好的浓缩咖啡体验
香辣意式浓缩咖啡:热磨,冷捣以获得更好的咖啡
断续浓缩咖啡:提升浓缩咖啡
用纸质过滤器改进浓缩咖啡
浓缩咖啡中咖啡溶解度的初步研究
断奏捣固:不用筛子改进浓缩咖啡
浓缩咖啡模拟:计算机模型的第一步
更好的浓缩咖啡压力脉动
咖啡数据表
我们能用机器学习打败庄家吗?
原文:https://towardsdatascience.com/can-we-beat-the-bookmaker-with-machine-learning-45e3b30fc921?source=collection_archive---------29-----------------------
用 LSTM 模型预测足球博彩的利润
埃里克·麦克林在 Unsplash 上的照片
编者注: 本文仅供教育娱乐之用。如果你想用这个模型进行真正的下注,那么你要自担风险。请确保这是符合你的庄家的条款和条件。
随着疾病的爆发和相应的经济关闭,数百万人不幸失去了工作。非常时期需要非常手段,我们可能会对创造新的非常规收入来源感兴趣。使用机器学习来预测足球比赛结果,从而帮助我们进行有利可图的下注,怎么样?
在本文中,我们使用一个简单的长短期记忆(LSTM)模型来预测足球比赛的结果。我们建立一个程序,在预测下一轮的结果之前,迭代地训练前几轮的模型。
你可以跟着这款 Google Colab 笔记本 。
LSTMs
如果你不知道什么是 LSTM 模式,我强烈推荐 Michael Phi 在他的优秀文章中解释它们。
简而言之,LSTMs 是一种特殊的递归神经网络,通常用于序列模型(例如自然语言处理)或时间序列预测(例如股票市场、需求、温度)。由于一个赛季的足球比赛代表一系列数据,模型可以使用以前的事件来预测未来,我们尝试使用 LSTM 博彩模型。
获取数据
每个机器学习模型的基础都在于数据。幸运的是,我们可以很容易地用谷歌搜索包含游戏分数和博彩赔率的数据集。对于我们的模型,我们将使用 2018/2019 德甲联赛的数据,这些数据可以从这里下载。
由于下载的 csv 包含了很多我们的模型不需要的数据,让我们简单地删除不必要的列。在我的 GitHub 储存库中,你会发现一个精简的数据集,只包括比赛日期、球队、进球和全职成绩,以及 B365 的下注赔率(主场赢、平局和客场赢)。让我们看看前五排。
数据准备
我们不是建立模型来预测忽略净胜球的全职结果,而是希望它预测主队和客场队之间的净胜球。此外,我们希望按轮协调结果的训练和预测,例如,在前 9 轮训练模型,并预测第 10 轮的结果以下注,等等。
由于神经网络需要浮点数据或整数的张量,我们不能简单地使用团队的名称作为我们模型的输入(Chollet,2018 年,第 101 页)。为了让我们的模型能够使用团队作为输入,我们为每个团队分配一个唯一的整数值。为此,我们创建了一个团队名称词汇表,并根据每个团队在词汇表中的索引,用他们各自的 id 来表示每个团队。对于实际的训练,我们将把这些指数输入到一个嵌入层中,这将在下面解释。
Chollet (2018 年,第 101 页)还建议,应该对数据进行归一化(所有值都应该很小,并且在同一范围内),以促进网络的训练过程。由于我们预测主队和客场队的进球之差,而这些数值实际上可以在-5 (0:5)到 5 (5:0)的范围内,甚至进一步分布,所以我们肯定要对数据进行缩放。
准备好数据后,前五行应该如下所示:
建模
如上所述,模型应该在前几轮中进行训练,然后对下一轮的比赛进行预测。为了创建区别特征(X)和标签(y)集,我修改了维尼林·瓦尔科夫的需求预测模型的 create_dataset 函数来满足我们的需求。如果你对 LSTMs 的进一步应用感兴趣,我绝对推荐他的文章。
假设我们想在下注前观察赛季的前五轮。因此,这些观察轮次的数据被用来对模型的结构进行一些调整。具体来说,我们想弄清楚模型在过度拟合之前需要多少训练。
正如我们在上面的图表中看到的,在模型似乎开始过度拟合之前,火车损失减少了大约 20 个时期。因此,在进行预测之前,我们稍后将对模型进行 20 个时期的训练。
注意:运行模型时,您可能会看到不同的结果。不幸的是,Keras 的建议使模型可复制,这似乎对 Google Colab 不起作用。
创建程序
为了建立一个程序来反复训练前几轮比赛,预测下一轮比赛的结果,然后下注,我们应该将整个过程分成几部分,并为每一步定义函数。
- 数据选择:选择前几轮进行训练,选择当前轮进行预测
- 建模、训练和预测:创建和训练模型以及进行预测和格式化输出的功能
- 下注:根据模型的预测选择下注的游戏
- 汇总:迭代训练、轮次预测、结果汇编
数据格式编排
因为我们在数据集上循环,并且在我们想要预测的回合之前的回合上训练模型,所以我们必须在每个回合之后重新创建数据集。我们使用上面的 create_dataset 函数为每次迭代创建一个训练和测试集。因为我们需要返回多个值,所以让我们将它们放入字典中。
建模、训练和预测
上面我已经概述了我们将如何建模我们的 LSTM,你可能想知道,什么是嵌入层,为什么我们需要它。根据 Chollet (2018 年,第 186 页)的说法,这一层可以理解为一个字典,它将整数索引(即团队索引)映射到密集向量,然后这些向量可以用作模型的输入。我们需要它,因为否则我们的毫无意义的团队指数(从 0 到 17)可能会被我们的模型误解。
我对超参数使用了相当随机的值,并明确鼓励您测试不同的组合,以优化模型的性能。
因为我们让模型预测缩放的游戏分数,我们必须反向转换这些预测,以便以想要的格式检索预测。为了创建一个包含模型预测的新数据框,我们需要对反向转换后的游戏分数进行整形。最后,我们将实际分数和预测分数堆叠到一个字典中,然后由函数返回。
打赌
基于模型的预测,我们想要下注。我肯定不是博彩专家,但我建议只在模型非常有信心主队或客场队会赢(得分≥ |1.1|)的情况下下注。
calculate_bets 函数创建两个列表,一个包含我们投资的赌注单位(如果我们在这个游戏上下注,则为 1,否则为 0),另一个包含赢款。对于我们没有考虑下注的游戏或我们下注失败的情况(例如,预测主场获胜,但它是平局),赢款为 0。如果模型正确预测了主场或客场获胜,则该游戏的获胜机会等于该结果的相应赔率。
在我们可以创建一个将所有内容放在一起并预测赛季每一轮的循环之前,我们基于测试集(一轮 9 场比赛)创建一个新的数据框,并添加重新转换的实际和预测分数以及投资和获胜下注单位的列。
将所有这些放在一起
现在,我们可以将上面的所有部分加在一起,并定义一个循环的函数,创建训练、测试集和模型。然后对模型进行训练,对结果进行预测,然后放入数据框中。
让我们打败庄家
把所有的碎片放在一起,是我们打败庄家的时候了!
正如我上面已经提到的,模型不能产生可重复的结果,这意味着,你的结果可能与我的不同。
我的模型总共下了 92 注,这意味着它投入了 92 个下注单位。该模型可能是一个比我更好的游戏预测工具,赢得了 94.71 个下注单位,这意味着净赢款占 2.71 个下注单位🔥
为了分析我们的模型在每一轮中的表现,并随着时间的推移看到胜利,让我们绘制数据。
我们可以看到,第 9、20 和 21 轮是最差的,因为我们没有赢得任何赌注。为了改进模型,进一步观察这些回合并弄清楚是什么导致了这些结果肯定是有意义的。很有可能,明显的热门被失败者击败,或者我们的模型只是做出了错误的预测。
结论
恭喜你,你刚刚赢了庄家。好吧,至少假设,2018/2019 年。
我们都知道这种模式远非完美,但这是一种简单的方法,似乎适用于 2018/2019 德甲赛季。此外,我们处理了一些数据,用 Keras 建立了一个 LSTM 模型,并绘制了结果。我相信这种模式也可以应用到其他联赛,甚至不同的运动,如冰球,篮球或美式足球。
如果您对可能改进模型的其他特性或模型架构有任何建议,请告诉我。我考虑在以后的文章中用更高级的特性扩展当前的模型。
非常感谢您的阅读!
保持保存和快乐编码!
参考
f . chollet(2018)。用 Python 进行深度学习。纽约:曼宁出版公司
我们能用 Twitter 打败股市吗?
原文:https://towardsdatascience.com/can-we-beat-the-stock-market-using-twitter-ef8465fd12e2?source=collection_archive---------19-----------------------
一份关于如何利用 Twitter 和情绪分析在分析师自己的游戏中击败他们的详细指南
(Pixaby — Pexels,2020 年)
照片由于切尔·莫兰在 Unsplash 上拍摄
人们关心来自 Twitter 的数据吗?
Twitter 的数据许可服务在 2019 年为其赢得了5 亿美元,占其收入的近 20%。
为什么?
交易员已经意识到,利用社交媒体获得影响股价的最快新闻不再是一个理论,而是一个现实,Twitter 正在提供一个甚至可以超越最可靠的新闻供应商的平台。
怎样才能用推文预测股票?
本质上,我们正在使用机器学习算法来衡量推文中的情绪,以预测股票是否会以某种方式移动。例如,如果一条推文中的正面词多于负面词,我们的算法会将其标记为较高的分数,并预测股价向上移动。
(埃德温·孔比厄塔——平布尔,2020 年)
我们要用什么来训练我们的模型?
为了理解 Twitter 情绪如何与股票价格联系起来,我们需要一个不同公司的丰富的 Twitter 数据集,以推断是否有可能使用在线情绪来预测股票价格。此外,Twitter 的指标,如喜欢、关注者和参与度,可以作为关于公司或行业的特定推文的可靠性和反应概率的良好指标。
在解释这些步骤之前,重要的是要重申一个事实,即使是最好的分析师也无法建立超过约 4–5%的 R 平方值的模型,即使有数千个预测器,那么 我们能找到一种方法来击败所有只使用 Twitter 的人吗?
杰米街在 Unsplash 上拍摄的照片
以下步骤解释了我们的数据构建方法:
步骤 1:从 Twitter 中提取数据
数据集是从“followthehashtag.com”网站下载的。这是一个丰富的基于 Twitter 现金标签的纳斯达克 100 上市公司推文库。
该数据集被世界各地的研究人员使用,包含大约一百万条推文。在这个项目中,下载了 2016 年 3 月 28 日至 2016 年 6 月 15 日期间 4 家公司的推文。
第二步:计算推文的情感得分
我们使用 VADER (Valence Aware 字典和情感推理器)库来检测每条推文的情感。VADER 是一个基于词汇和规则的情绪分析工具,专门针对社交媒体中表达的情绪。
(Pixaby — Pexels,2020 年)
积极:推文有多乐观和积极
负面:这条微博有多悲观和负面
中立:推特有多中立
复合:融合了上述所有内容的专有措施
情绪得分:复合情绪指标和账户每条推文的关注者数量之间的乘积。
这一措施将允许我们通过优先考虑拥有更多追随者的 Twitter 用户来捕捉推文的重要性和影响。
步骤 3: 按天对每家公司的总体情绪得分进行分组
步骤 4: 从雅虎财经中提取数据
使用 pandas 中可用的 API 连接到 Yahoo Finance,然后下载并提取所选 74 天内每家公司股票的数据。
雅虎财经的 API-74 天的股票价格
第五步:捕捉股票的波动性
每日股票价格被标准化,以便遵守基于距离的算法规则并捕捉波动性而不是绝对价格变化。
通过标准化每日股价变化来捕捉波动性
第六步:创建买入/卖出信号
然后,我们开始创建一个初步的买入和卖出信号,这个信号是基于投资者在某一天是否会获得正回报,换句话说,就是我们试图预测的。
然后,完全基于推文背后的情绪来计算买卖信号。
根据情绪得分添加买入/卖出信号
步骤 7: 运行 36 种不同的机器学习二进制分类模型
数据集被分为训练和测试,以便训练我们的模型并客观地衡量它们的性能。由于这是一个时间序列数据,最好根据日期范围分割数据。
一系列不同的算法被计算出来,首先预测股票价格在给定情绪的情况下是倾向于上升还是下降,其次测量价格变化的幅度。
运行的模型有 KNN,逻辑回归,决策树,随机森林。SVM 和安。
第八步:预测股票价格
一个基于模型的复杂公式被用来预测股票价格,该模型是根据推文的情绪训练的。
使用我们的模式来尝试和赚钱
预测 EA、T-Mobile、沃达丰、& Cerner 的表现
我们决定对不同的公司进行分析,这些公司理论上会有各种各样的关于它们的推文。
电子艺界(EA),Cerner,沃达丰,T-Mobile
选择 1:电子艺术(EA)
我们首先选择了电子游戏制造商 EA,因为很多人会在 Twitter 上直言不讳地表达他们对电子游戏的感受。
选择二:电信公司
此外,选择电信公司(T-Mobile 和沃达丰)是因为我们认为他们的客户倾向于在网上表达他们的投诉,因此会表达强烈的情绪。
选择 3: Cerner(医疗保健)
最后,我们分析了美国健康信息技术解决方案供应商 Cerner 的推文。医疗保健技术领域通常倾向于发布公众做出反应的信息(无论是创新的正面信息还是有争议的负面信息)。
判决
第一次分析的结果总结在下表中:
准确度分数—人工智能、神经网络和机器学习算法
正如所观察到的,与基于决策的算法相比,基于图形的算法在预测价格变动方面表现出优越得多的性能。沃达丰和 T-Mobile 的平均准确率高达 72%,这在股票市场中是非常了不起的。
电子艺术
沃达丰集团(VOD)
T-Mobile 美国(TMUS)
欧洲原子核研究组织
群体的智慧
总的来说,股票市场围绕着谁能够运行最复杂和最有效的机器学习算法,这些算法包含尽可能多的预测器,然而,我们能够通过利用群众的智慧胜过所有这些预测器。
推荐
我们最后的建议是,不要孤立地使用我们的模型,而是根据交易者的风险偏好,尝试从外部证实信息,如果仍然对建议犹豫不决,最好是在 Twitter 之外。
如果从几个来源有一个普遍的共识,即市场将向某个方向收敛,那么就有理由相信我们的模型的建议是正确的。
我们的模型通过利用社区的力量帮助个人做出明智的投资决策,对于任何交易者来说都是一个完美的补充工具,无论他们是初学者还是专业人士。
商务化人际关系网
[## 诺亚·穆赫塔尔-分析师- BDC |领英
未来的分析硕士毕业于麦吉尔大学的商业分析专业从…
www.linkedin.com](https://www.linkedin.com/in/nmukhtar/) [## Venkatesh Chandra - Aon Canada |解决方案架构师-分析顶点项目- McGill…
我有 4 年的数据科学家经验。我曾与财富 100 强公司合作进行外部分析…
www.linkedin.com](https://www.linkedin.com/in/venkateshchandra/) [## Ramy Hammam -顾问团队领导-数据科学&业务战略-普惠& Whitney…
在世界上最大的职业社区 LinkedIn 上查看 Ramy Hammam 的个人资料。Ramy 有 5 份工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/ramy-hammam/)
GitHub 代码
[## chandravenky/使用 Twitter 预测股价
通过在 GitHub 上创建一个帐户,为 chandravenky/使用 Twitter 进行股票价格预测的开发做出贡献。
github.com](https://github.com/chandravenky/Stock-price-prediction-using-Twitter)
我们能用人工智能检测无现金后新冠肺炎经济中的数字欺诈吗?
原文:https://towardsdatascience.com/can-we-detect-digital-fraud-in-a-cashless-post-covid-19-economy-using-ai-1b4243cf30e2?source=collection_archive---------48-----------------------
新冠肺炎改变了我们的支付方式,数字支付的使用越来越多,在我们即将成为无现金经济的时代,数字欺诈的可能性达到了前所未有的高度
照片由 Muhammad Raufan Yusup 和 Pixaby 在 Unsplash & Pexels 上拍摄
新冠肺炎的数字化加速
在世界卫生组织(World Health Organization)宣布现金可能携带冠状病毒后,一些国家立即采取措施隔离或销毁大部分货币供应,一些国家甚至完全禁止使用现金,迫使客户完全接受数字支付。
这是现金的尽头吗?
布莱克·维斯兹在 Unsplash 上的照片
分析师现在预计,到 2024 年,全球非现金交易将超过 1 万亿美元的里程碑。不仅如此,电子交易的数量和金额的快速增长使得分析家们预测在不久的将来,政府将通过立法完全取消现金交易,以防止疫情的再次蔓延。
此外,数字支付的快速发展不仅改变了消费者、企业和政府转移资金的方式,也改变了犯罪分子窃取资金的方式:数字欺诈。
数字欺诈的增长
2019 年,在线欺诈增长了 13%,达到 169 亿美元,尽管欺诈事件从 2019 年的 1440 万起下降到 1300 万起,但黑客们成功地将注意力转移到了价值更高的欺诈事件上,而不是多次价值较低的欺诈事件,一年内总共窃取了 35 亿美元,减少了 140 万笔交易。
Clint Patterson 在 Unsplash 上拍摄的照片
由于被隔离的人比以往任何时候都更多地转向在线平台,这种欺诈的稳步上升趋势现在正在升级,预计到 2020 年,尝试在线支付欺诈将至少增加 73% 。
建立预警系统——数字欺诈
为了更好地为数字时代带来的所有威胁做好准备,我们决定创建一个自动编码器欺诈检测模型,它不仅能检测欺诈,还能模拟罕见的欺诈案例,创造更多“异常”交易进行检查。
由 Ales Nesetril 在 Unsplash 上拍摄的照片
问题:不平衡的数据集
我们正在使用的数据集包含 2 天内发生的信用卡交易,其中 492 欺诈发生在 284,807 笔交易中,这意味着我们的数据集只有 0.17% 有欺诈实例。
本质上,我们的数据集是高度不平衡的,这意味着我们的模型将学习如何更好地识别正常交易而不是欺诈交易,这使得它在应用于新的欺诈案件时完全无用。
权衡:召回与精确
我们的目标是最大限度地提高回忆和交易的准确性,因为预测非欺诈交易的“欺诈”比错过任何欺诈交易造成的经济损失都要小。
解决方案:自动编码器
自动编码器被称为复杂的无监督人工神经网络,它学习如何有效地压缩和编码数据以重建数据。
本质上,它将数据从简化的编码表示重新构建为尽可能接近原始输入的表示。
它主要通过学习如何忽略数据中的噪声来降低数据维度。
自动编码器:来自 MNIST 数据集的输入/输出图像示例
规划我们的模型
我们将以无监督的方式训练一个自动编码器神经网络,我们模拟的罕见事件将与原始事件略有不同,模型将能够仅通过输入来预测案件是否是欺诈性的。
评估我们的模型
在我们的项目中,用于确定交易是欺诈(1)还是正常(0) 的主要指标是重构误差,该误差将被模型最小化。
这将允许我们的自动编码器学习数据中存在的欺诈的重要特征,因为当一个表示允许其输入的良好重构时,它已经保护了输入中存在的大部分信息。
探索性数据分析
数据集的快速摘要显示了 31 列,其中 2 列是时间和金额。
类(目标变量)
1:欺诈交易
0:正常/非欺诈交易
剩余的 29 个变量来自 PCA 变换,并且为了安全目的已经进行了变换。
变量—数字欺诈模型
没有缺失值,因此我们可以继续绘制数据
可视化不平衡的数据集
高度不平衡的数据集—对欺诈来说很正常
欺诈交易是否在特定的时间范围内发生?
欺诈交易—时间框架分析
由于两种交易类型的交易长度似乎不同,因此无法从时间变量中提取可见的洞察力。
数据预处理
数据缩放
时间变量由于不相关而被丢弃,并且值被标准化以准备我们的自动编码器模型。
列车测试分离[80:20]
与大多数模型不同,我们的主要重点不是围绕建立分类模型,而是检测异常,因此我们的训练&测试分割将略有不同。
考虑到不平衡的数据集,我们将仅在正常事务上训练我们的模型,然而,我们将避免修改测试集,并且它仍将保持原始的类划分,以保留对我们模型性能的准确&无偏评估。
构建我们的模型
模型设置
接下来,使用 14 维的输入来建立自动编码器模型,该输入被馈送到分别具有大小 14、7、7 和 14** 的 4 个全连接层 s。**
如前所述,前 2 层代表编码部分,剩余 2 层代表解码部分。
为了建立一个不太复杂的模型,并解决过度拟合和特征选择,我们纳入拉索(L1)正则化。
每一层的超参数是用设置为 glorot_uniform 的内核初始化程序以及交替的 sigmoid 和 RELU 激活函数来指定的。
我们选择这些超参数的原因是因为它们往往表现良好,并被视为行业标准。
X_train = X_train.valuesX_test = X_test.valuesinput_dim = X_train.shape[1]encoding_dim = 14**from** **keras.models** **import** Model, load_model**from** **keras.layers** **import** Input, Dense**from** **keras** **import** regularizersinput_layer = Input(shape=(X_train.shape[1], ))encoder1 = Dense(14, activation="sigmoid", kernel_initializer= "glorot_uniform",activity_regularizer=regularizers.l1(0.0003))(input_layer)encoder2 = Dense(7, activation="relu", kernel_initializer= "glorot_uniform")(encoder1)decoder1 = Dense(7, activation='sigmoid',kernel_initializer= "glorot_uniform")(encoder2)decoder2 = Dense(X_train.shape[1], activation='relu',kernel_initializer= "glorot_uniform")(decoder1)autoencoder = Model(inputs=input_layer, outputs=decoder2)
模特培训
用 32 个样本的批量对模型进行 20 个时期的训练,以允许模型学习最佳权重。最佳模型权重定义为最小化损失函数(重建误差)的权重。
使用 Tensorboard 上的 ModelCheckpoint 回调保存模型。
**from** **keras.callbacks** **import** ModelCheckpoint, TensorBoardautoencoder.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])checkpoint = ModelCheckpoint(filepath=r"C:\Users\Ramy\Desktop\AI\autoencode.h", verbose=0, save_best_only=**True**)tensorboard = TensorBoard(log_dir=r"C:\Users\Ramy\Desktop\AI\logs", histogram_freq=0, write_graph=**True**, write_images=**True**)*#early_stop = EarlyStopping(monitor=’loss’, patience=2, verbose=0, mode='min')*history = autoencoder.fit(X_train, X_train,epochs= 20,batch_size=32,shuffle=**True**,validation_data=(X_test, X_test),verbose=1,callbacks=[checkpoint, tensorboard]).history
结果
为了评估我们模型的学习能力,我们绘制了训练和测试模型损失图,以验证历元数越多,我们的错误率越低。
模型丢失—历元与丢失
我们的 MSE 被重新命名为重建误差,它似乎在测试和训练集上收敛得很好。
重建误差和真实类的汇总统计
重构误差与真实类别
然后,我们绘制两种类别类型的重构误差(正常和欺诈)。
重建——没有欺诈
重建——欺诈
确认
召回与精确
****精度高:假阳性率低
****高召回:低假阴性率
自动编码器模型:召回与精度
该图显示,在这种情况下,数值非常极端。该模型要么在精确度上做得很好,要么只在回忆上做得很好,但不能同时兼顾两者。
Autoencoder 模型的最佳点:
召回 : 20%
精度 : 60%
精度粒度图&通过阈值召回曲线
自动编码器模型:精度和召回阈值
该图显示,随着重建误差阈值的增加,模型精度也增加。然而,召回指标却相反。
模型测试和评估
为了最终区分欺诈交易和正常交易,我们将引入一个阈值。通过使用来自交易数据的重构误差,如果误差大于定义的阈值,则该交易将被标记为欺诈性的。
最佳阈值 = 3.2
我们也可以从测试数据中估计阈值。然而,从长远来看,可能存在过度拟合的可能性,这可能是有害的。
正常交易和欺诈交易之间界限的可视化
重构错误—正常与欺诈
混淆矩阵
这为我们模型的精度和召回值提供了更全面的概述。总的来说,我们的自动编码器模型是健壮的,具有高真阳性&真阴性(欺诈与正常交易检测率)
欺诈交易
查看混淆矩阵,我们可以看到有 16+85 = 101 个欺诈交易。
其中 85 笔被正确归类为欺诈,其中 16 笔被错误归类为正常交易。****
正常交易
另一方面, 1159 被错误归类为欺诈**,相当于正常案例总数的约 2%。**
最初目标
一般来说,将欺诈交易误认为正常交易的成本要高得多,反之亦然。
解决办法
为了确保实现这一目标,我们试图通过牺牲我们准确预测正常交易的能力来提高检测欺诈交易的预测能力。
结论
总体而言,该模型相对稳健,因为我们确实抓住了大多数欺诈案件。然而,如果我们的数据集更加平衡,这还可以进一步改善。
商务化人际关系网
** [## 诺亚·穆赫塔尔——分析师——BDC | LinkedIn
未来的分析硕士毕业于麦吉尔大学的商业分析专业从…
www.linkedin.com](https://www.linkedin.com/in/nmukhtar/) [## Ramy Hammam —顾问团队负责人—数据科学&业务战略—普惠& Whitney…
在世界上最大的职业社区 LinkedIn 上查看 Ramy Hammam 的个人资料。Ramy 有 5 份工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/ramy-hammam/) [## Shaher yar Jahangir —顾问—项目经理&建模师— Aéro Montréal | LinkedIn
沙赫尔贾汉吉尔是麦吉尔大学分析管理硕士(MMA)项目的候选人
www.linkedin.com](https://www.linkedin.com/in/sjahangi/)
开源代码库
[## ramy bot/用自动编码器模拟欺诈交易
有助于 RamyBot/模拟欺诈交易与自动编码器的发展,通过创建一个帐户…
github.com](https://github.com/RamyBot/Simulating-Fraudulent-Transactions-with-Autoencoders)**
我们能用语言模型生成高质量的电影评论吗?
原文:https://towardsdatascience.com/can-we-generate-high-quality-movie-reviews-using-language-models-5158f494aea7?source=collection_archive---------25-----------------------
微调 IMDB 电影评论的语言模型,并使用各种不同的方法生成电影评论。
Ahmet Yal nkaya 在 Unsplash 上拍摄的照片
介绍
最近,语言模型——试图预测句子中的下一个单词的模型,通常是深度神经网络——引起了严重的轰动,因为 OpenAI 宣布,他们已经成功训练了一个名为“【GPT-2】的 15 亿参数语言模型,他们最初认为发布这个模型太危险了。它已经被释放了,现在你甚至可以和它说话了。
上面链接的 OpenAI 博客和“与变形金刚对话”网站上的例子真的让我震惊,我开始想知道我们是否能够以某种方式生成高质量的电影评论,类似于 IMDb 数据集,其中包括 100,000 条电影评论,分为 25,000 条正面评论,25,000 条负面评论和 50,000 条未标记评论。然而,据我所知,完整的 GPT-2 模型——包含 15 亿个参数——如果不付出大量努力,就无法在单个 GPU 中安装,而且肯定也不适合我的个人 GPU。所以我很好奇——标准语言模型在 IMDb 数据集上训练后产生的评论质量会怎么样?
设置
我决定使用 fastai 的提供的语言模型进行一些实验,该语言模型已经在维基百科上进行了预训练(关于该模型的更多细节,请参见 ULMFiT 论文这里)。然后,我对整个 IMDb 数据集进行了微调,因为我不关心电影评论中表达的情感,我对情感分析也不感兴趣,所以我不需要维护数据集中提供的训练/测试分割。这种微调的目的是使模型专注于电影评论的领域,因为能够准确预测评论中的下一个词对于能够真实地生成电影评论中的下一个词是非常有用的,这是我们的目标。如果您对从另一个领域生成文本感兴趣,请随意使用您选择的语料库重复这些实验!
我最近看到了“神经文本退化的奇怪案例”,它深入探讨了现有的文本生成策略,强调了它们的不足,并提出了一些新的动机良好的成功方法,因此我决定比较每种方法生成的电影评论的质量。所有方法都有相同的提示(如下图)和复习长度(100 字),使用相同的模型进行推理。
方法和结果
在这里,我将简要介绍评估的方法,并提供一些示例(为图像质量道歉)——这些示例是对每种方法运行一次模型的结果,没有经过挑选或篡改。
为了增加可读性,实现细节和更多的例子,请查看底部的 Github repo 链接。
- 贪婪的 top-1 方法——由于语言模型输出一个概率向量,其大小与我们的词汇量相当,我们可以简单地总是获取具有最高概率的标记并将其返回,通过重复这个过程并不断地将生成的标记添加到现有提示中,我们可以生成完整的评论。
- 贪婪多项式方法-在这个版本中,我根据概率分布对令牌进行采样,而不是总是选择最可能的一个-这个过程仍然是贪婪的(仅考虑当前令牌的概率分布),但导致重复结果较少。
正如我们在例子中看到的,贪婪的 top-1 的评论是重复的,不像自然语言。在我看来,贪婪多项式方法产生的评论出奇的好,但还不太好。
使用“贪婪的前 1 名”方法生成评论的几个例子。方括号中的文字是给定的提示,“xxbos”代表一个评审的开始。
使用“贪婪多项式”方法生成评论的几个例子。方括号中的文字是给定的提示,“xxbos”代表一个评审的开始。
- 波束搜索方法—在这种方法中,不是最初只挑选具有最高概率的记号(top-1),而是挑选具有最高概率的 top-k 记号。该参数也称为“波束宽度”。在每一步,我们将 k 个标记中的每一个添加到现有的提示中,并且只保留到目前为止的前 k 个组合。理论上,这允许我们不仅基于它们之前的标记,而且基于它们之后的标记来挑选标记。然而,在实践中,这种方法经常失败,并最终生成极其重复的文本-所有 top-k 结果似乎都是模型的重复和“安全”选择的链,因此即使是最终 top-k 的多项式分布在大多数情况下也不会产生好的结果。有关这种特殊故障模式的更深入的分析,请参考论文。正如我们在例子中看到的,这种方法倾向于产生短期意义的句子,但非常重复,总体上不能产生高质量的评论。
使用“波束搜索”方法生成评论的几个例子。方括号中的文字是给定的提示,“xxbos”代表一个评审的开始。
- Top-k 方法——与波束搜索类似,我们现在选择具有最高概率的 top-k 记号,而不是总是选择具有最高概率的记号。正如我们在例子中看到的,结果可能是偶然的——有时整个评论是连贯的,似乎是现实的,但在其他时候,句子放在一起没有多大意义。总的来说,在我看来,它似乎比以前的方法产生了更有趣和更多样的结果。
使用“top-k”方法生成评论的几个例子。方括号中的文字是给定的提示,“xxbos”代表一个评审的开始。
- Top-p nucleus 方法——本文提出这种方法是为了解决 top-k 方法中的“猜测 k 的数字”问题。与使用固定的 k 相比,根据概率分布来决定 k 更有意义— k 应该是所需的任何数字,以便前 k 个令牌包含大部分概率质量。因此,在 top-p nucleus 方法中,我们为函数提供概率 p,并且对于每个单词,它决定一个数字 k,然后像以前一样执行 top-k 采样。总的来说,对我来说,质量似乎与 top-k 非常相似,但它可能更好地处理边缘情况(其中概率密度相对均匀,因此当它相对达到峰值时,我们会想要一个高 k,而我们会想要一个小 k)。
使用“top-p”方法生成评论的几个例子。方括号中的文字是给定的提示,“xxbos”代表一个评审的开始。
更多的实现细节——我已经选择从生成中删除代表任何未知单词的特殊标记,并添加了对最小标记概率和概率分布温度的支持(除了每个方法采用的参数之外)。我还没有机会调整这些参数,所以通过一些实验,更好的文本生成是完全可能的。
结论
总之,我们观察到文本生成的质量不仅取决于所用模型的大小,还取决于生成方法本身,不同的方法生成的评论质量大不相同——贪婪的 top-1 文本生成似乎产生低质量的文本,beam-search 似乎产生极度重复的文本,top-k 和 top-p 似乎产生比 top-1 质量更高的非重复文本。希望文本生成方法仍然是一个活跃的研究领域,不久我们将不再需要 1.5B 参数模型来生成真实的文本!
参考
- Github repo 提供完整代码和更多示例。
- 霍尔茨曼,a .,买斯,j .,福布斯,m .,&崔,Y. (2019)。神经文本退化的奇特案例。 arXiv 预印本 arXiv:1904.09751 。
- Fast.ai 的代码优先 NLP 课程,启发了我写这篇文章!视频播放列表这里。
我们能从流感的发展中学到什么来更好地分析新冠肺炎疫情吗?
原文:https://towardsdatascience.com/can-we-learn-anything-from-the-progression-of-influenza-to-analyze-the-covid-19-pandemic-better-b20a5b3f4933?source=collection_archive---------36-----------------------
近距离观察新冠肺炎的进展,并影响欧洲和美国的死亡人数
从一开始就把事情弄清楚,新冠肺炎不是流感。但是流感,就像新冠肺炎一样,是一种具有显著相似性的传染性病毒感染,并且它是我们所能看到的与新冠肺炎相关的研究最广泛的。通过比较新冠肺炎和流感在欧洲的传播和死亡人数,我们可以了解未来可能会发生什么,以及我们如何将疫情置于更大的事情中。
我还通过概率建模 看了看更接近于 对新冠肺炎传播的可预测性。
流感不是无害的
开始关注显而易见的事实是有好处的:人们死于季节性流感。例如,在欧洲,流感季节导致“超额死亡”显著增加,从一个冬天到下一个冬天有显著变化。 Nielsen 等人对 2014-2018 年的超额死亡率进行了很好的概述。 EuroMOMO 每周更新死亡率数据。最新数字如下。一些观察结果:
- 从整个欧洲的数据来看,新冠肺炎病毒导致的死亡人数与前几年持平。前几年的高峰主要是由 65 岁以上年龄组造成的,尽管较年轻的年龄组在冬季也有所增加。
- 如果你看看每个国家的数字,那么在一些国家,如意大利和西班牙,由新冠肺炎引起的峰值清晰可见,而在其他国家(还)观察不到。
虽然现在对这些图表下结论还为时过早,但一个可能的假设是,很可能有一些有益的抵消现象在起作用,在当前的新冠肺炎时期减少了死亡人数。例如,也许这些措施和社会意识导致其他疾病的传播减少。
然而,这里的一大要点是,季节性流感可能导致过度死亡的显著和快速发生的高峰,例如在 2016/2017 流感季节。有趣的是,在意大利和西班牙,最大的峰值达到了严重流感季节的峰值。这与福奇等人的假设一致,该假设指出,考虑到(轻度和无症状)病例总数被大大低估,新冠肺炎可能会变成类似于严重流感季节。
欧洲过去 4 年的死亡人数(EuroMOMO)
选择过去 4 年中死亡的国家(EuroMOMO)
与新冠肺炎相比,季节性流感流行期间的增长率
让我们看一下 Nielsen 等人绘制的一个严重流感季节的进程,下面是值得复制的流感死亡率的完整数字。总体而言,在欧洲,严重的流感季节导致每 10 万人中约 28 人死于流感。目前,新冠肺炎的死亡人数正在接近这个数字,西班牙(28.3),义大利(27.3),纽约(24.3)。接下来的国家是比利时(14.1)和法国(13.7)。
每 100,000 人中可归因于流感的累计死亡人数
现在,我们可以将这些累积数字转换为每日数字,并将其与新冠肺炎每日病例和死亡的趋势进行比较。我应用了一个增长模型来评估趋势,并使用马尔可夫链蒙特卡罗来拟合该模型。显示了一些欧洲国家和美国的每日确诊病例和死亡人数,这些国家的测量方法差异相对较大。可以看出,在过去两周内,每日病例数停滞不前:首先在意大利,然后在比利时和德国,现在在美国也是如此。许多因素在这里起作用,至少与检测量无关(在我的另一篇文章中,我对此看得更仔细)。然而,有趣的是,死亡人数会跟随病例趋势几天(3 到 5 天),尽管比率变化很大(意大利和比利时约为 10%,德国为 1.2%,在德国,测试做得更广泛)。如果您假设测试过程随时间保持不变(例如,只测试关键案例),并且关键案例的比率随时间保持基本不变,那么这是有意义的。
图中也给出了 2016/2017 年流感季节的每日死亡人数。你可以看到,流感每日死亡人数增加较慢(可能与 R₀下游有关),但停滞在与比利时和意大利观察到的相同水平,略高于瑞典目前的每日水平,明显高于德国的水平。从美国确诊病例的趋势来看,预计未来几天每天的死亡人数将大致相同,停滞在同一水平。评估这种停滞在多大程度上归因于软/有针对性的措施(接触者追踪和隔离)、社会意识、硬措施(封锁)、季节变化和疫情的自然发展,将是一项有趣的(可能永远不会结束的)工作。后者当然取决于无症状病例的比例,这一比例可能达到 50% 以上,而轻度病例可能占 40%(即有症状病例的 80%)。
随着时间的推移,流感导致的每日死亡人数增加的速度较慢,但下降的速度也相当缓慢。如果我们对新冠肺炎和流感使用相同的增长模型,但使用不同的 R₀,那么我们可以预计下降速度会更快。我补充了两个极端:正常增长模型,它应该转化为每日死亡病例的持续下降(我们在意大利和西班牙开始看到这种情况),以及一个在末端长期增长的模型,这是由于措施和意识导致的传播放缓。如果有一些长期增长(在韩国和新加坡观察到,每天约 50 至 100 例),病例将随着时间的推移保持稳定增长,而活跃病例数将稳定或开始下降,从而缓解医院的压力。在接下来的一周,我们应该能够观察到,在欧洲当前的条件下,这种长期增长是否是一个因素。
一段时间内每 100,000 人中的每日病例和死亡人数(截至 2020 年 4 月 4 日的数据)
编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
我们能让算法做出我们无法解释的决定吗?
原文:https://towardsdatascience.com/can-we-let-algorithm-take-decisions-we-cannot-explain-a4e8e51e2060?source=collection_archive---------13-----------------------
今天的算法非常精确和复杂。不仅用户不理解他们,创造者也很难证明他们所做的决定是正确的。这导致了一个伦理问题,每个人工智能研究人员都应该牢记在心。
来源:https://pixabay.com/
人工智能无处不在
人工智能对我们日常生活的影响日益突出。人工智能似乎比我们更了解我们,其应用范围从预测我们将要狂看的下一部电视剧到我们将要约会的下一个人。我们不断地产生数据,随着存储容量和计算能力的最近改善,公司和组织已经加入了大数据的行列。你可能听说过大数据的三个 v:速度(兆字节到零字节)、量(数据分成批量到流数据)和多样性(结构化和非结构化数据)。这是定义大数据的经典方式。今天,我们在这三个 v 中是正确的,如果你将大数据与应用数学相结合,你将获得人工智能。人工智能利用数据做出小到优步汽车价格、大到 T2 法院判决的重大决策。
随着时间的推移,人类和人工智能的角色发生了巨大的变化。以前,人类是唯一的决策者,人工智能只是一个工具(以及其他工具)。然而,今天的算法在没有咨询人类的情况下做出了无数决定:它们成为了决策者,而人类被推入了由技术塑造的人工制品中。
从某种意义上说,这种转变是合乎逻辑的:算法已经达到了如此高的精确度和计算能力,以至于超过了人类。人工智能在游戏中击败人类(1997 年的国际象棋,危险边缘!2011 年、围棋 2016 年、星际争霸 2 2019 年、人脸识别(脸书 2014 年的 DeepFace)、语音识别(微软 2016 年)、机器学习编码(谷歌的 AutoML 和微软的 DeepCoder )、疾病检测(癌症、肺炎由于今天的技术进步(见上面提到的三个 v),我们可以让模型根据需要变得既大又复杂,允许算法达到非常高的精度和效率,从而击败人类。
来源:https://en.wikipedia.org/wiki/DeepMind
算法在我们日常生活中扮演的角色带来了一个伦理问题:我们能让算法做出我们无法解释的决定吗?
在 2017 年举行的可解释人工智能研讨会期间,优步人工智能研究员 Jason Yosinkski 表示,*为了让机器学习模型被社会接受,我们需要知道他们为什么要做出这些决定 。”*
事实上,算法经常被视为“黑匣子”,这在人们的脑海中产生了恐惧。理解算法做出的选择至关重要,主要有两个原因:
- 首先,用户有权知道他的个人数据如何被使用,以及算法如何试图影响他(以好的或坏的方式)。
- 第二,还有一个正在上升的安全问题。一些千禧一代已经习惯于接受人工智能的决定,而不去寻找解释。将人工智能视为甲骨文可能是危险的,因为算法可能是错误的,有偏见的,或有隐藏的意图。父母让他们的孩子在没有监控的情况下观看 YouTube。但他们大概不知道,YouTube 唯一的 KPI 就是用户观看时间。他们想最大化它,不惜任何代价。问题是假新闻和阴谋论内容* 在广告收入方面表现很好……”YouTube 前研究员 Guillaume Chaslot 承认。*
用户懂算法吗?
随着通用数据保护法规(GDPR) 在 2018 年在欧盟的实施,有关个人数据收集和处理的法规向前迈进了一步。在本文件所述的所有原则中,我将集中讨论处理部分:“对个人数据的任何处理都应合法和公平。关于自然人的个人数据的收集、使用、咨询或以其他方式处理,以及个人数据的处理程度,对自然人应该是透明的。透明度原则要求与处理这些个人数据相关的任何信息和通信都易于获取和理解,并使用清晰明了的语言。”(数据处理原理,叙文 39 )
简单来说:每个人都有权了解其个人数据是如何被收集和处理的。
这对科技公司来说是一个巨大的挑战。YouTube 能详细解释为什么我的欢迎页面充满了滑板和爵士视频吗?更具体地说,我想知道为什么今天早上显示的顶部视频是“初学者的 10 个简单的迷你坡道技巧”。为什么是这个而不是另一个滑板视频?
让我们想象一下,社交网络可以深入到它的推荐算法中,查看所有的权重和超参数,并在给定输入(我的个人数据,可能还有一些外生数据)的情况下,向我解释显示的输出(滑板视频)。这在技术上是可行的…但我怀疑 YouTube 会这样做。该平台正在处理太多的数据(每天 3000 万访客,每分钟上传 300 小时的视频),没有时间考虑我的请求。为了这个实验,想象一下 YouTube 确实回复了我,给我发了一个解释。我能理解它吗?
“用户无法理解数学公式。这条法律鼓励公司给你一个模糊的解释来证明一个算法决策的合理性”——纪尧姆·查斯洛
GDPR 要求一个“简单易懂”的解释,使用“清楚明白的语言”。向我提供明确的数学公式和相关的超参数将是最“诚实”和“明确”的答案,但我能理解它吗?相反,过度的简化意味着信息的丢失。透明度的概念显然存在问题。纪尧姆·查斯洛向我证实了这一点:“可解释性是伟大的,但它到底意味着什么呢?用户无法理解数学公式。这条法律鼓励公司给你一个模糊的解释来证明一个算法决策。通常,这是不够的。**
**
来源:https://pixabay.com
需要考虑的是用户理解解释的认知能力。我的祖母学习英国文学,并在 5 年前收到了她的第一部智能手机,而我学习人工智能,目前正在该领域工作,很明显,所需的简化水平是不一样的。
从用户的角度来看,我相信有权利理解我们是如何被算法影响的。从提供商的角度来看,证明算法的每一个决定都是不容易的。这种合理性取决于几个因素:算法的复杂程度、处理过的数据流、要求解释的用户数量以及他们理解的能力。为了淡化这种情况,人们必须提醒自己,我们经常在不知道工具如何工作的情况下使用它们。例如,我不知道我的微波炉或锅炉是如何工作的,但我每天都在使用它们,我不介意。
数据科学家懂算法吗?
我们已经看到,用户很难理解他们正在交互的算法。幸运的是,至少那些算法的创造者确实明白正在发生什么……不是吗?
前馈神经网络(FFNN)的图示
你知道那是什么吗?这是神经网络的一个非常简单的例子。让我们来计算一下它的参数个数:
num_params
=层间连接+每层中的偏差
=(50×200+200×1+1×200+200×50)+(200+1+200+50)
= 20 851 即使是这样一个基础的模型,结果也是巨大的!想象一下,当我们处理更大的架构(卷积神经网络或递归神经网络)时。
你可能已经理解了,我想在这里暂停一下深度学习。
深度学习并不新鲜(罗森布拉特的感知机是在 1958 年发明的),但由于丰富的数据库(2012 年的 ImageNet),令人印象深刻的计算机能力(GPU),新的框架(PyTorch,Tensorflow,Keras)和深度学习大师(Yann Lecun,Geof Hinton,吴恩达,Alex Krizhevsky),它在过去十年中发展非常快。深度学习在医疗保健、自动驾驶汽车、语音识别、翻译、图像识别、金融甚至艺术领域都有应用。而这仅仅是开始!
深度学习中的训练程序确定了数百万个参数的设置,这些参数以复杂的方式相互作用。对神经网络进行逆向工程极其困难。我们已经到了一个地步,即使是算法的创造者也无法完全理解它。"算法很容易在结构化数据上解释,因为我们可以查看这个或那个特定特征的权重。”Deep mind 的研究员 Grégoire Delétang 对我说,“但当算法在图像、语音、文本等非结构化数据上训练时,它会变得更加复杂,深度学习就是这种情况。“我们有一个由人类设计的系统,它探索了如此多的可能性,以至于人类无法跟上它的步伐。**
“当算法在非结构化数据上训练时,它变得更加复杂”——grégoire deléTang
深度强化学习更是如此,代理通过与环境交互来自动学习。我们不能直接控制它;我们只能设置代理交互环境的规则。"深度学习已经变得如此复杂,参数如此之多,以至于不可能解释一切。这对人类来说是令人沮丧的。作为生物学家或医生,我们正面临着非常复杂的机制,我们试图建模。除了研究对象是人类而非自然创造的这一事实之外,我在我的作品中看到了许多与生物学和物理学的相似之处。格雷瓜尔·德莱唐说。
“我在我的作品中看到了很多与生物学和物理学的相似之处” —格雷瓜尔·德莱唐
有一种范式的变化是理解的基础:深度学习不再只是用来帮助人类做决定的工具。深度学习是一种准自主对象,可以按原样进行研究。我们提供输入,我们设计环境,网络以我们能够理解的格式提供输出。体制是怎么来的?我们不知道,面对现实吧,我们永远不会知道。但是我们可以通过深入研究网络的架构来获得一种直觉。学术界的聪明人已经思考了掌握这种直觉的技术。以下是最近出版物中的一些例子:
- 特征可视化 (Olah 2017):从带有随机噪声的图像开始,优化像素以激活经过训练的深度神经网络中的特定神经元,从而可视化该单元“学到了什么”。也可以研究单位之间的相互作用。
来源:https://distill.pub/2017/feature-visualization/
- Grad-Cam (塞尔瓦拉茹等。艾尔。2017):使用来自最终卷积层的梯度来生成热图,该热图突出显示了图像中用于预测概念的重要区域。
- 失景(李等人。艾尔。2017):利用一系列可视化方法,探索神经损失函数的结构,以及损失景观对泛化的影响。
***
来源:研究论文*
因此,深度学习算法是不可能理解的,即使对于它的创造者来说也是如此,但人们已经在努力解释它们了。一些研究人员表示,深度神经网络与人脑有很强的联系,人脑是宇宙中最复杂的系统之一。其实当我们认为人工神经元最初是受神经组织中的生物神经元的启发而产生的时候,这是说得通的。深入研究 DNNs 不仅会帮助我们理解深度学习是如何工作的,它还会告诉我们人类大脑是如何工作的。也许深度学习会揭示我们大脑的秘密!
可解释的人工智能:过度简化的风险
总而言之,我认为让算法做出我们不理解的决定的问题是至关重要的,并且超出了它们实现的技术层面。
人工智能是用来自动完成任务的。它节省了我们的时间,给我们带来了准确性和可靠性。虽然它非常有用,但它在我们的日常生活中也变得越来越重要。人们必须小心,不要陷入一种“算法政治”,即规定“什么”而没有“为什么”。理解人工智能如何做出决定的需求将取决于这些决定的关键程度。理解 YouTube 网页上显示的视频不如理解审判的句子重要。
面对这种情况,最近出现了一种新的观念。可解释的人工智能(XAI)是新的黑色,2019 年已经看到了几十篇围绕这一领域的研究论文、会议和文章。
“XAI 增加了一层新的庸俗:这是一种近似的近似” —格雷瓜尔·德莱唐
如果 XAI 意味着选择对检查更透明的算法,如决策树或线性回归,那么 XAI 是伟大的。但如果这意味着继续使用复杂的算法(如深度神经网络),并试图给出算法如何工作的直觉,那么我认为 XAI 可能会有风险。在我采访格雷瓜尔·德勒唐时,他对我说:“你建立了一个模型,这是对现实的近似。XAI 增加了一层新的粗俗化:这是一种近似的近似。那你离真相有多远?**
可解释性是有限的:有可能解释一切吗?大概不会。我们人类有时甚至无法解释自己的决定。我怎么认出那张脸的?人类的大脑是一个黑匣子。实验表明,人们只是在决定已经做出后为自己的行为编造解释,而这些解释因人而异。
结论
今天,人工智能无处不在,算法正在做出对我们日常生活产生强烈影响的决定。这些算法的用户(美国)不理解它们,这是关于 GDPR 立法的一个问题。但还有另一个严重的问题:人工智能算法的创造者很难证明机器提供的输出是正确的。
在设计算法时,每个研究人员都必须面对准确性和可解释性之间的权衡。准确性通常需要更复杂的模型(深度神经网络、增强树、随机森林、SVM),但不太容易解释。另一方面,简单明了的方法(线性/逻辑回归、决策树、最近邻法)往往不够准确。
在我看来,如果我们不想在 黑镜 的场景中结束,最重要的是将用户的兴趣放在我们思想的中心。我们可以想象一个独立的组织深入研究一家公司的代码,检查算法是否符合用户的利益。食品和化妆品行业已经有了无数的认证(生态、公平贸易、纯素食、生物),为什么科技行业就没有呢?第三方认证将在数据隐私、匿名、可解释性和副作用方面为用户提供保证。Guillaume Chaslot 目前正在研究一个类似的想法:“我们应该创建认证来指导用户的选择。商业模式和人工智能之间有很强的联系。在大多数网站上,我们的印象是一切都是免费的。但是不要忘记你的数据就是价值,这是这些公司如何将他们的服务货币化的。**
我们能让人工智能更有道德吗?
原文:https://towardsdatascience.com/can-we-make-artificial-intelligence-more-ethical-a0fb7efcb098?source=collection_archive---------56-----------------------
安迪·凯利在 Unsplash 上的照片
如何解决人工智能和机器人技术中最紧迫的伦理问题
为什么要看这篇文章?
当涉及到人工智能和机器人技术的伦理时,最紧迫的问题是什么?它们将如何影响我们的生活(和工作)方式?无论你是否在这个领域工作,这些问题迟早会影响到你。在这里,我们将讨论机器人伦理:为机械化世界绘制问题图一文中包含的主要观点,同时我会添加一些我自己的意见。你不会有很多答案,但可能会开始问正确的问题。
机器人到底是什么?
虽然这个问题可能看起来有点太基础,但重要的是概述一下什么是机器人的精确定义(因此什么是而不是机器人)。
有一些显而易见的案例,比如一架高级 AI 增强的自主军用无人机(按照任何合理的定义,它都可能被认为是机器人)和一辆普通的遥控老式汽车(通常不被认为是机器人)。但是灰色地带呢?一架人类控制的无人机能够最终找到它的主人,它是机器人吗?
关于什么是机器人的答案并不简单,因此还没有达成共识。为了便于讨论,文章随后给出了一个工作定义:
"机器人是一种能感知、思考和行动的工程机器."
这个定义意味着机器人必须配备传感器和某种智能来指导其行动,它还包括生物和虚拟机器人。
说到机器人,我们现在在哪里?
既然我们已经达成共识,那么机器人今天在做什么,将来又能做什么呢?这些问题的答案如今变化很快,但一般来说,机器人主要用于不需要太多判断的重复性工作(如吸尘)。在执行危险任务时,它们也非常有用,例如探雷和拆除炸弹。
一个成功的例子是无处不在的 Roomba 真空吸尘器,它几乎占了世界服务机器人的一半。然而,最紧迫的伦理问题出现在其他专业领域:
莱尼·屈尼在 Unsplash 的照片
劳动自动化
人工智能最新进展最受关注的后果之一可能是,人类劳动正迅速被机器人取代,机器人更不容易出错,不会出现疲劳和情绪问题,而且从长远来看,维护成本通常更低。然而,这真的会发生吗?还是只是一种制造好头条的方式?嗯,答案大概就在中间。未来几年,一些工作肯定会因为自动化而消亡,但这在人工智能出现之前就已经发生了。一些很久以前被机器取代的工作的例子包括“保龄球馆瓶工”,为客户安装保龄球瓶的年轻男孩和“人类闹钟”,负责通过敲窗户叫醒人们。尽管这种被取代的恐惧看起来是最近才出现的,但它实际上已经存在很久了,而且到目前为止,还没有发生。
一个原因是,尽管人工智能的能力背后有很多宣传,但目前的机器人仍然远远不能完成我们这些天所做的一些最平凡的活动。另一个重要原因是,大多数机器人的工作范围非常狭窄:它们通常非常擅长执行超级特定的任务,而大多数工作需要更通用的方法。最后,新的工作一直在创造,其中许多与制造和操作机器人有关。
所以,回答我们的问题:是的,很多工作岗位将不复存在,将被机器人取代。这实际上是一个持续的过程,已经发生了几个世纪,并将继续发生。然而,人类劳动将在很长一段时间内保持相关性,只是方式不同。因此,对我们来说,重要的是为这个新世界做好准备,并了解哪些技能是这个世界最需要的。我认为这些要么是与编码和人工智能相关的高度技术性技能,要么是需要人类方法和非常多样化的技能组合的活动,这些活动很难自动化。
迈克尔·马莱在 Unsplash 上的照片
军队
军用机器人有多种形状,从拆弹车到装备武器的无人驾驶飞机。一方面,他们可以拯救生命,在危险工作的时候代替士兵。另一方面,有一个显而易见的问题:使用如此多的力量和技术来杀人是否道德?第二个,不那么明显的问题是:我们应该让 AI 决定杀谁吗?
尽管一开始听起来可能很荒谬,但机器人实际上可以在开枪前思考:它们不会害怕,不会恐慌,不会有偏见(或者至少不应该有偏见)。他们也比人类更不容易出错。然而,这可能会使形势更加有利于军事强国:想象一下美国和委内瑞拉之间的战争,只不过北美人可以从远处控制机器人,没有任何风险,而南美人正在被消灭,没有反击的机会。这种情况实际上是未来的一种可能性。
在这里,我们无法真正说明什么是道德的,什么是不道德的,这太取决于文化因素,但在开发新的人工智能时,考虑未来的监管风险绝对是值得的。该领域发展迅速,监管很难跟上,但请记住,仅仅因为现在没有监管,并不意味着 5 年后仍将如此。
友谊
这可能是人工智能最有争议的应用之一:性爱机器人变得越来越逼真。你不仅可以选择你的机器人看起来怎么样,还可以选择它对你的进步做出什么样的反应。由于这些特点,许多问题出现了,例如:制造一个看起来很像名人(或你认识的人)的机器人可以吗?一个反对任何性互动的怎么样,这样你就可以模拟强奸了?
一方面,对于使用这些玩具的人来说,可能会有严重的心理后果。它们还会强化不健康的性行为和期望。另一方面,他们可能正是一些人需要发泄的东西,这意味着他们不太容易与另一个人实践他们不想要的幻想。
所有这些都是尚未解决的新问题,但在哲学或心理学等领域可能会有许多有趣的问题需要回答。
应该看哪些因素?
安全和错误
人工智能容易出错,主要是由于两个因素:它是由人类编写的,因此实际代码可能包含错误或逻辑缺陷;而且它通常基于概率,这意味着即使代码做得很完美,它的行为也是基于不完美的信息,并且总是会有一定程度的风险。
目前,这两个失败的原因是不可避免的。然而,我们应该始终比较机器和人类的预期误差水平。例如,警察将雨伞或钻头等正常物体误认为枪支,并最终射杀无辜的人,这并不罕见。我们应该停止使用人类警察吗?全世界每 135 万人死于交通事故。我们应该阻止人们开车吗?
这只是几个例子,说明从功利主义的角度来看,机器是否犯错其实并不重要,只要它们在相同的活动中不会造成比人类更多的损害。当然,为了确保这一点,新技术应该首先在安全的环境中进行彻底的测试。应采取措施减少可能的损害(例如,首先对机器人使用非致命武器----警察),只有当错误水平比人类水平低很多时,才应实施创新,以确保安全裕度。
但是,我们作为一个社会,对于在某些活动中用机器人完全取代人类的想法还是相当不适应的。只是“感觉风险太大”。这完全没问题,因为我们确实应该小心翼翼地探索未知。然而,我的希望是,在未来,一旦人们更习惯于这种想法,决策应该更多地基于两个层次的错误之间的比较,而不是道德含义。这种类型的推理确实可以挽救生命。
Giammarco Boscaro 在 Unsplash 上拍摄的照片
法律与伦理
最近的技术进步需要新的立法来回答以前从未提出过的道德问题。当机器人出错时,谁应该承担责任?它的拥有者,开发它的团队?当我们真正开始混合生物组织和机器人时,这些机器人会被认为是人,还是介于两者之间的其他东西?他们会有权利吗?当我们开始给人的大脑植入微芯片时,真人和机器人之间的界限是什么?
那么国际法呢?当一个机器人在加州设计,在中国组装,出口到世界各地,它会遵循哪种伦理?硅谷的一个开发者会设计一个机器人去杀死香港的抗议者吗?如果这个机器人真的在中国杀了人,开发者会在美国被追究责任吗?
老实说,我们还远没有达到那种复杂程度,但我们可能在有生之年仍会看到它,并受到新立法的影响。例如,40 年前,谁会想到数据和隐私会成为如此重要的话题,受到如此多不同法律的保护(或不保护)?
社会冲击
到目前为止,我们解决的所有问题都将对我们的社会产生重大影响,但我认为最相关的两个问题是失业和人际关系的变化。
正如我所说,技术进步已经发生了很长时间,在许多活动中取代了人,淘汰了旧的工作,同时新的职业机会出现了。这很好,它让我们能够从事更有意义的工作,而机器人只能做无聊的工作。然而,这并不意味着新工作会永远取代旧工作。情况可能是,在未来的某个时间点,需要更少的整体人类工作,人们变得更不相关。猜猜那些人是谁?可能是来自周边国家的贫穷、未受教育的人,因为他们的工作最容易自动化。接下来会发生什么?
许多人押注于普遍基本收入:即政府会给每个人最低水平的收入。这意味着,即使你失去了工作,你仍然有住的地方和吃的东西。这笔钱可能来自对大公司征税,这些公司通过自动化生产节省了大量资金。会有用吗?我们不能确定,但看起来肯定很有希望。但是接下来呢?人们会停止工作,继续他们的生活吗?虽然对许多人来说这似乎是一个梦想,但我们的社会并不是围绕这种生活而建立的,许多人需要工作,这样他们才会觉得自己有了人生目标。这不是一个容易解决的方程。
机器人和人工智能的另一个主要影响将是人类关系:当我们到达难以区分人工智能和真实人类的程度时,开始对机器人产生感情将变得相当容易。如果你看过电影《她的 T1》,你就会明白我的意思。这是否意味着减少与其他人相处的时间?这是一件坏事吗?基于我们和机器人的经历,我们会开始对其他人产生不切实际的期望吗?人们会被允许和机器人结婚吗?
结论
正如我所说的,这篇文章包含的问题比答案多,但是试图给出太多的答案是不负责任的(也是相当放肆的):它们很可能都是错的。
然而,我希望这能给你一些启发,或者仅仅是为了启发,如果你在这个领域工作的话,这样你就可以在你的下一个工作项目会议中开始考虑这些问题。
如果你想更进一步,我推荐尤瓦尔·诺亚·哈拉里的两本书,你可能以前听说过:《德乌斯人》和 21 世纪的 21 课。他们讨论了一些同样的问题以及更多关于人类未来的问题。如果你想了解更多关于机器人如何参与创作等创造性活动,请查看这篇关于创造力和人工智能的文章。
“变化,持续的变化,不可避免的变化,是当今社会的主导因素。如果不考虑现在的世界,而是未来的世界,任何明智的决定都不可能做出……这反过来意味着我们的政治家、商人和普通人必须采取科学虚构的思维方式”——艾萨克·阿西莫夫
这篇文章大致基于发表在人工智能上的一篇论文,讨论了围绕人工智能和机器人学的一些最重要的问题: 机器人伦理:为机械化世界 绘制问题,作者是帕特里克·林、基思·阿布尼和乔治·贝奇,还有一些我个人的意见。
如果你想进一步讨论,请随时通过 LinkedIn联系我,这将是我的荣幸(老实说)。
我们可以用数字来衡量语言难度吗?
原文:https://towardsdatascience.com/can-we-measure-language-difficulty-by-the-numbers-3d591396934c?source=collection_archive---------25-----------------------
数据科学可以帮助衡量学习语言的难度。对困难的感知取决于一种新语言与你所熟悉的语言在结构和语义上的接近程度。但是用数字来衡量这些语言差异会产生一些令人惊讶的结果。
Artem Beliaikin 在 Unsplash 上的照片
毫无疑问,就我们接触来自其他国家和文化的人和内容而言,世界正在“变得越来越小”。即使是减少国际旅行的新冠肺炎疫情,也导致了越来越多的通过互联网的虚拟互动。然而,流利和熟练的跨语言交流的障碍仍然令人生畏。
在线翻译与语言学习
近年来,由于人工智能方法(如神经网络)的引入,机器翻译的质量有了显著提高。人工智能驱动的翻译优化已经迅速渗透到谷歌翻译和微软翻译等消费者应用程序中,这些应用程序简化了机器翻译的使用,提高了跨越语言边界传达意思的能力。
通过软件翻译一门语言和学习一门新语言之间有着巨大的差异。对大多数成年人来说,学习一门新语言很难。但是有些人喜欢语言挑战:对他们来说,最难学的语言可能是最容易征服的。当然,年轻大脑的神经可塑性使得儿童习得新语言相对容易。但是很少有成年人有这么容易。
在线语言学习及其挑战
据《ICEF》报道,在线语言学习已经成为一个每年 5820 亿美元的产业,对数百万人来说,在线语言学习变得更加方便和容易。英语学习占了其中的大部分。虽然英语的流行并不令人惊讶——它是世界上讲得最多的语言,也是商业的主要语言——但熟练的英语使用者正在快速扩展到其他语言。
领先的语言课程提供商 Rosetta Stone 报告称,西班牙语在 2018 年英国人最渴望学习的语言中排名第一,去年有 23.1%的英国学习者学习该语言。其他四种欧洲语言——法语、英语、意大利语和德语——也位列前五。或许令人惊讶的是,拥有超过一百万人口的最受欢迎的母语普通话不在下一层。
毫无疑问,对这种语言难度的认知是其受欢迎程度相对较低的原因之一。普通话对一个不会说中文的人来说是一个很大的困难。然而,超过 11 亿人能流利地说、读、写和理解英语。所以真的很难吗?或者只是对一个说英语的人来说不熟悉?这个问题提出了一个重大的挑战:对困难的感知是否完全是相对的,每个语言学习者在某种程度上有所不同,取决于背景和教育。
当然,数据科学家面临的挑战是如何衡量语言难度。如果我们要吹毛求疵的话,学习一种语言的困难和它固有的使用困难是有区别的。但是为了本文的目的,我们将把重点放在评估一种测量语言难度的方法的任务上,如果我们可以从体操和其他竞技运动的语言中借用一个术语的话。
方法 A:询问外交部门
近十年前,Voxy 发布了一个信息图(如下所示),来源于外交服务研究所,它将英语母语者的语言难度分为三个简单的类别:简单、中等和困难。比较的基础是不同语言达到“熟练”需要多长时间——就日历周和学习小时而言。该网站确实对其发现进行了限定,指出难度取决于语言的复杂程度、与学习者母语(在这种情况下是英语)的接近程度、每周学习多少小时以及可用的语言资源。从图表中可以看出,每周学习 25 小时的基本假设。
- 简单(22-23 周,575-600 课时):罗曼语(西班牙语、葡萄牙语、法语、意大利语和罗马尼亚语)都属于这一类,还有荷兰语、南非荷兰语、挪威语和瑞典语
- 中等(44 周,1110 课时):俄语、波兰语、塞尔维亚语、芬兰语、泰语和越南语、希腊语、希伯来语和印地语。
- 硬 (88 周,2220 课时):中文、日文、韩文、阿拉伯文
虽然 Voxy 显然希望图表成为教学工具或讨论主题,但不难挑出其分析方法中的弱点。首先,谁来设定“熟练程度”的标准?如何衡量教学质量?如何解释类似因素的第二语言知识?对于一个数据科学家来说,结果会显得令人失望的武断。
Voxy 在上拍摄的照片什么是最难学的语言?
方法 B:对语言学习难度进行评分:多语种者的方法
Glossika 的语言学家 Michael Campbell 提出了一个更有趣的方法,至少从数据科学的角度来看是这样的。在一篇名为“语言困难”的详细博客文章中,他设计了一个评分系统,用数字回答我们感兴趣的精确问题:
- 有没有客观的衡量语言难度的方法?
- 世界上最难的语言是什么?
区别坎贝尔的方法是其相对论性的基于数据的方法。根据不同的语言复杂性标准,语言难度是基于任何两种语言之间的相对相似性。也许与直觉相反,这种方法实际上使客观评估语言学习困难成为可能,因为它是基于可以客观评估的数字标准。他提出的标准包括:
词汇习得
他考虑到这种语言与学习者的语言有多接近。
语言分为语系、分支和次分支。例如,英语属于印欧语系的原始语言,俄语、亚美尼亚语和希腊语都属于印欧语系。相比之下,阿拉伯语、汉语和日语属于不同的语系。在印欧语系中,英语是一种日耳曼-罗曼语,因此更接近德语和法语。就相似性而言,尽管语法不同,英语在任何方面都与德语最接近。同样,葡萄牙语、西班牙语和意大利语将属于同一个分支,使得语言学习更容易。坎贝尔高度重视这一标准,语言学习困难反映在指数更高的数字。同支行支行:0 分。支行不同:1 分。不同分支:10 分。不同家庭:100 分。
流利的句法和语法
职业语言学家坎贝尔。分解成一系列因素,例如
- 语言类型
- 主语-动词-宾语顺序
- 形容词-名词顺序
- 所有格(拥有者)——名词顺序
- 限定词-名词顺序
- 关系从句——名词顺序
- 名词变位
- 时态
- 结合
- 广告位置
对于这些标准中的每一项,如果语言之间存在差异,坎贝尔会给 1 分加或减。他的计算结果呈现在一个矩阵中:
矩阵 源自 博客
通过比较这个矩阵中的行,他可以对两种语言之间的句法和语法差异进行评分,从而确定学习一种给定语言的难度。说德语的人学习法语的难度分数是 6 分,说日语的人学习西班牙语的难度分数是 13 分,而说汉语的人学习波兰语的难度分数高达 34 分。
流利的音韵学
坎贝尔的计算考虑了总音素(书面声音)和音位变体(人们说的声音)的差异,考虑了 12 个发音点以及元音和语调的数量。
矩阵 源自The Glossika Blog
根据这个矩阵,比较行使你能够计算与这些语音标准相关的语言难度。说德语的人学习法语的难度分数是 1 分,说日语的人学习西班牙语的难度分数是 11 分,而说汉语的人学习波兰语的难度分数高达 15 分。
数据科学家会注意到,为各种参数分配的分数是任意的和主观的,但尝试将难度分解为组成因素是有价值的。
例如,对于说英语的人,以下是根据语系的分数分配:
矩阵 源自The Glossika Blog
德语很难调和 0 分(【to】所以 einfach 是 das?)法语或西班牙语 5 分。格鲁吉亚语的词汇习得难度真的是波兰语的 10 倍吗?因此,具体的枚举当然可以微调,尽管这种方法很有趣——虽然有些粗糙。
最终清算:乌比卡有什么独特之处?
他 2016 年的文章最后列出了一些最难的语言。在这方面,他提到了欧洲吉普赛人的罗姆语,这种语言甚至没有文字记录,还有森蒂内尔语,这是太平洋岛屿上的一种语言,想要成为游客的人在到达时会被杀死,还有多种合成语言,如格陵兰语和 Ubykh,至少有 84 个辅音。荣誉奖颁给了贝拉库拉,一种语言只有语言学家用来记录语法的文字。
两年后,坎贝尔写了一篇的后续文章,应用他的评分系统并将其与 FSI 排名进行对比。
矩阵 源自The Glossika Blog
非语言学家可能会对作者不屑一顾地将泰语、越南语、土耳其语和芬兰语归类为“简单”感到困惑——他赶紧说,除了这些完全陌生的词汇。他承认很惊讶,根据他的排名系统,韩国人在困难中击败了台湾人。但是他认为已经灭绝的切尔克斯语(Ubykh)甚至让韩语望尘莫及。
在这里,你可以学习 Ubykh 数字,听一个徒劳无功的故事,这个故事应该会吸引每一个数据科学家——用任何语言。
我们可以在不熟悉的(自然)语言上执行 NLP 吗?
原文:https://towardsdatascience.com/can-we-perform-nlp-on-unfamiliar-natural-languages-138f6ea4af13?source=collection_archive---------14-----------------------
用保加利亚语造句比真正理解它容易吗?
叶卡捷琳娜·诺维茨卡娅在 Unsplash 上的照片
这篇博文试图用一种我不熟悉的语言——保加利亚语来执行各种自然语言处理(NLP)。我将尝试探索这些数据,并在最后通过使用包含 BiLSTM(双向长短期记忆)层的机器学习模型来生成一些保加利亚语句子。
为了让我享受这个实验,我将使用保加利亚最著名的歌手/说唱歌手之一 Krisko 写的歌词作为文本数据。这里你可以看到克里斯科最近的歌曲,名为“”даилине”——意思是“是”或“不是”
这篇文章的代码可以在我的 GitHub 页面上找到。
*所有歌词均来自歌词翻译。
这是克里斯科:来自他的 Instagram
一点点保加利亚语言和音乐介绍
保加利亚语是南斯拉夫语的一种,主要在保加利亚使用。保加利亚语是用西里尔文写的(事实上是欧盟官方语言中唯一用西里尔文写的语言)。西里尔文是由圣徒西里尔和卫理公会于 893 年在第一个保加利亚帝国发明的。
我个人喜欢保加利亚语,经常听保加利亚歌曲,尽管我并不真正理解它们的含义。保加利亚音乐非常有趣,当然音乐很好,但也受到了来自土耳其、希腊、塞尔维亚等邻国的深刻影响,尤其是一种叫做“Chalga”的民间流行音乐,你可以欣赏到这些不同音乐的完美融合。在这里你可以听一下艾米莉亚的一首名为акула的歌曲作为例子。
目录
- 探索文本数据
- 预处理文本数据
- 使用 word2vec 探索单词关系
- 构建 BiLSTM 模型以生成保加利亚语句子
- 结论和后续步骤
1。探索文本数据
由于我不知道保加利亚语语法如何工作,甚至不知道许多基本单词,我将尝试在不做任何预处理的情况下探索数据集(克里斯科的歌词)。
首先,我会检查他的歌曲中经常使用的词是什么。
import io# Read the data
with io.open('/resources/data/krisko_lyrics.txt', encoding='utf-8') as f:krisko_text = f.read().lower().replace('\n', ' \n ')# Split into words and make a dataframe
words = [w for w in
krisko_text.split(' ') if w.strip() != '' or w == '\n']print('Corpus length in words:', len(words))word_df = pd.DataFrame(words,columns=['word'])
在数据集中,有 36 首歌曲,16453 个单词和 3741 个独特的单词。
top = word_df.word.value_counts().head(30)print(top)
最常用的 30 个单词
我们可以由此创造出单词 cloud 来可视化。
# For word cloud
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as pltwc = WordCloud(background_color="white", max_words=100,
max_font_size=50, random_state=42)output = wc.generate(krisko_text)plt.figure()
plt.imshow(output,interpolation='bilinear')
plt.axis('off')
plt.show()
常用词(?)用在克里斯科的歌里
这看起来不错,对不对?不幸的是,它们看起来都像停用词,如“是”、“和”、“否”等。为了理解数据集,我需要删除这些停用词。我们将会看到这个过程是如何完成的,会有什么不同。
2.预处理文本数据
我在空间中找到了保加利亚语的停用词列表,让我们使用它并从这次探索中移除那些停用词。
# Import Bulgarian stop words
from spacy.lang.bg.stop_words import STOP_WORDS as BG_STOPWORDS # Take punctuations out
krisko_cleaned = re.sub('\[,.*?“”…\]', '', krisko_text)# Tokenise the data
TOKENS = word_tokenize(krisko_cleaned) # Add some more stop words
EXTRA_STOPWORDS = {'теб','дон','кво','к\'во','бях','мене','нашият','ма','ше','yeah', 'недей','ей','ко','bang','ам','тебе','you','тука','мойта','тва', 'але-але-алелуя','кат','tak','моа','оп','о','ся',
'та','тез','дето','ја','aз','tik','i','ѝ','ток','твоя', 'a','some','ideal','petroff','–','так','тия','ee','к'}BG_STOPWORDS.update(EXTRA_STOPWORDS)# Filter those stop words out
filtered_sentence = []
for w in TOKENS:
if w not in BG_STOPWORDS:
filtered_sentence.append(w)with open ('~/resources/data/krisko_cleaned.txt','w') as output:
output.write(str(filtered_sentence))with io.open('~/resources/data/krisko_cleaned.txt',
encoding='utf-8') as f:
krisko_cleaned = f.read()krisko_cleaned = re.sub('[%s]' %
re.escape(string.punctuation), '', krisko_cleaned)
删除这些单词后,我们可以创建热门单词列表。
删除停用词后的前 30 个词
现在,这个列表看起来比以前更好。似乎这里所有的单词都有一些含义。最常用的词是‘дай’(дам的第二人称单数祈使形式),意思是‘给予,允许’。第二个是‘искам’(第一人称单数祈使句),意思是‘想要’。
这里有趣的一点是,单词的结尾会根据主题而变化。正如我上面提到的,'我想要'是'искам','你想要'是'искаш',她/他/它想要'是'иска',等等……所以我们实际上可以看出'我想要'和'你想要'之间的区别,而不像在英语中那样不知道主语。
清理数据后的 WordCloud
这里是清理数据后的字云。看起来比上一个信息丰富多了。所以我在这幅图中看到的是‘искам’,'обичам','ръъм',‘кииско’,…所以基本上,克里斯科唱的东西就像他想要并喜欢朗姆酒(?)——这完全说得通。
3。使用 word2vec 探索单词关系
清理完数据后,我们可以通过 word2vec 算法看到单词之间的关系。Word2vec 算法是在给定输入语料库的情况下产生单词嵌入(向量)的模型。利用这一点,我们可以看到,例如,相似的词,预测下一个词,词之间的距离。
下面你可以找到我是如何建立我的模型的。
# Modules for word2vec
from nltk.tokenize import sent_tokenize, word_tokenize
import gensim
from gensim.models import Word2Vec
from gensim.models import Phrases # preparation
input_words = []for i in sent_tokenize(krisko_cleaned):
temp = []
# tokenize the sentence into words
for j in word_tokenize(i):
temp.append(j)
input_words.append(temp)# Create a word2vec model
w2vModel = Word2Vec(input_words, min_count=1, size=1000, window=1)
word2vec 中有几个参数;min_count 是输入单词中单词的最小频率——在我的模型中,我将它设置为 1,这样就包含了所有的单词。大小是维度的数量,而窗口是句子中当前单词和预测单词之间的最大距离。
让我们使用这个模型来探索数据集。首先,我们可以看到单词之间的相似性。作为一个例子,我可以用“女人”和“男人”这两个词来看它们的相似性。
# Investigate the similarity between man and womanprint('Similarity between мъж and жена:
'+str(w2vModel.similarity('мъж','жена')))Similarity between мъж and жена: -0.026726926
它们的相似度和-0.0267,也就是说那两个词并不像我们预期的那样彼此相似。现在我们可以看到男性和女性相似的词,看看他们之间是否也有一些差异,也可能是用法的上下文。下面你可以看到男人和女人相似词汇的列表。该列表包含三列,相似词,其翻译,以及-1 和 1 之间的相似度范围。由于我不知道很多保加利亚语,我用谷歌翻译创建了一个翻译专栏。由于一些翻译看起来有点奇怪,我怀疑一些相似的单词可能不正确。
# Creating the most similar words list for man and womanman_df = pd.DataFrame(w2vModel.most_similar('мъж'),columns=['similar_word','similarity'])
translate = ['chief','household','tiger','goes away','we dream',
'lake','I ran','voodoo','haymans','stop']
man_df['translation'] = translate
man_df = man_df[['similar_word','translation','similarity']]woman_df = pd.DataFrame(w2vModel.most_similar('жена'),columns=['similar_word','similarity'])
translate = ['bucket','noisy','I know','you come',
'polo','folk','ashamed','bon','bat','opportunity']
woman_df['translation'] = translate
woman_df = woman_df[['similar_word','translation','similarity']]
与мъж(男)(左)和жена(女)(右)相似的词
嗯,由于我还没有消除性别刻板印象的偏见([1] Bolukbasi et al .,2016),我们仍然可以看到它。但与此同时,这篇博文的主要目的是探索数据集并生成保加利亚语的 Krisko-ish 句子,所以我认为最好不要去偏向以获得更多的 Krisko 味道。
所以在克里斯科的歌词中,“男人”这个词经常用在“男性”的语境中,如“首领”、“家庭”和“老虎”,而“女人”这个词类似于一点点负面的词,如“吵闹”和“羞愧”。
现在继续讨论“我想要”和“你想要”之间的相似之处。正如我上面提到的,我们可以在保加利亚语中看到这两个词的不同上下文。
print('Similarity between искам and искаш:
'**+**str(w2vModel.similarity('искам','искаш')))Similarity between искам and искаш: 0.048260797
正如我所料,这两个词非常不同,尽管唯一的区别是动词的主语。现在我们可以探讨一下围绕那两个词用了什么样的词。因为这两个词的相似度很低,所以我认为它们周围的词也应该很不一样。
下一个词预测:искам(我要)(左)和искаш(你要)(右)
与我的猜测相反,我们并没有真正观察到它们之间的巨大差异。公平地说,列表只有 10 个单词,概率是相同的,所以如果我扩展列表,我们可能会看到一些明显的差异。
我能感觉到的一件事是‘我想要’这个词更男性化,比如‘我想要小鸡’、‘我想抽烟’(语法不正确)和‘我想做爱’。所以我猜克里斯科在用“我”的时候经常指的是他自己。而且我猜“你”通常指的是一个女孩,因为我在他的音乐视频中可以看到很多女孩(从词表上看不出来)。
现在,我们可以画出他的歌名的单词嵌入,来看它们之间的二维距离。我在这里使用的标题仅限于那些只包含一个单词的标题。
# Inspired by Stanford's [CS coursework](https://web.stanford.edu/class/cs224n/materials/Gensim%20word%20vector%20visualization.html)def display_pca_scatterplot(model, words):
word_vectors = np.array([model[w] for w in words]) twodim = PCA().fit_transform(word_vectors)[:,:2]
plt.figure(figsize=(12,12))
plt.scatter(twodim[:,0], twodim[:,1], edgecolors='k', c='r')
for word, (x,y) in zip(words, twodim):
plt.text(x+0.0003, y-0.0001, word) display_pca_scatterplot(w2vModel,['базука','афтърмен',
'горила','антилопа',
'фотошоп','късай','герои',
'мърдай','наздраве',
'незаменим'])
克里斯科的歌词单词嵌入
本次歌名列表中有三首歌词不是克里斯科演唱的,分别是антилопа(antilope)фотошоп(Photoshop)късай(tear)。这些歌词是克里斯科写的,但由蒂塔演唱。令人惊讶的是,这三首歌彼此并不相似,尤其是《късай》与其他所有歌曲相去甚远。还有горила(大猩猩)是一首由 2BONA 和 Krisko 演唱的歌曲,但似乎与其他歌曲没有太大区别。мърдай(摆动)在右手边,这很有意义,因为这首歌是由多名歌手演唱的(克里斯科、迪姆和боропърви).
这是蒂塔:来自她的 Instagram
4。构建一个 BiLSTM 模型来生成保加利亚语句子
现在,我们将看看是否可以通过从 Krisko 的歌词数据建立一个模型来生成一些保加利亚语的句子。该模型将包括嵌入和双向 LSTM (BiLSTM)层。
LSTM 是 RNN(递归神经网络)体系结构之一。虽然正常的 rnn 在输入序列中仅具有长期依赖性,但是 LSTM 具有输入、遗忘和输出门,并且这些门使得能够具有随机的短期依赖性。与普通的 LSTM(单向)不同,BiLSTM 从前后两个方向运行输入数据。因此,它不仅有助于理解过去单词的上下文。
为了建立一个模型,首先,我们需要准备输入序列。
# For BiLSTM modelimport feather
import tensorflow as tf
from tensorflow import keras
from keras.models import Model, Sequential
from keras.layers import Input, Dense, Embedding, Concatenate, Flatten, LSTM, Dropout, Reshape, Activation,Bidirectional,Layer
from keras.losses import binary_crossentropy
from keras import optimizers,activations,initializers
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencestf.compat.v1.set_random_seed(42)
tokenizer = Tokenizer()# Make the text data into input sequencescorpus = [w for w in krisko_cleaned).split('\n')
if w.strip() != '' or w == '\n']tokenizer.fit_on_texts(corpus)TOTAL_WORDS = len(tokenizer.word_index)+1input_seq = []for line in corpus:
token_list = tokenizer.texts_to_sequences([line])[0]
for i in range(1,len(token_list)):
n_gram_seq = token_list[:i+1]
input_seq.append(n_gram_seq)MAX_SEQ_LEN = max([len(x) for x in input_seq])input_sequences = np.array(pad_sequences(input_seq,
maxlen=MAX_SEQ_LEN, padding='pre'))xs = input_sequences[:,:-1]
labels = input_sequences[:,-1]
ys = tf.keras.utils.to_categorical(labels, num_classes=TOTAL_WORDS)
我是这样建立模型的。下面这个模型是我做的第一个。这是一个单层的 BiLSTM 模型。首先,创建单词嵌入,然后将它们通过 BiLSTM 层,最后,使用 softmax 计算输出类的概率。
# Build a modelBATCH_SIZE = 128model = Sequential()
model.add(Embedding(TOTAL_WORDS, 128, input_length=MAX_SEQ_LEN-1))
model.add(Dropout(.5))
model.add(Bidirectional(
LSTM(128,return_sequences=False,
kernel_initializer='random_uniform')))
model.add(Dropout(.5))
model.add(Dense(TOTAL_WORDS, activation='softmax'))model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=0.1,decay=.0001),
metrics=['accuracy'])model.fit(xs,ys,epochs=500,verbose=1)
最后,我们将使用我创建的模型生成句子。我们将生成四个句子,以“我想要(искам)”、“你想要(искаш)')、“我是(азсъм)')”和“你是(тиси)”开始。
def textGenerator(seedText, textLength): for _ in range(textLength):
token_list = tokenizer.texts_to_sequences([seedText])[0]
token_list = pad_sequences([token_list],
maxlen = MAX_SEQ_LEN - 1,
padding = 'pre')
pred = model.predict_classes(token_list,verbose=0)output_word = "" for word, index in tokenizer.word_index.items():
if index == pred:
output_word = word
break
seedText += " " + output_word
return print(seedText) textGenerator('искам',MAX_SEQ_LEN-1)
textGenerator('искаш',MAX_SEQ_LEN-1)
textGenerator('Аз съм',MAX_SEQ_LEN-2)
textGenerator('Ти си',MAX_SEQ_LEN-2)
这些是模型的结果。为了理解这个句子,我用了谷歌翻译(有些翻译似乎很离谱)。
具有 128 个单元- 500 个时期的单个 BiLSTM 层
любовта——(我想给
искашдаседаседасеасеаасеаасеасееаасееасееасеееаселюбовта——(你想给就给,给,给,做爱)
Аз съм да се да се да се да се да се да се да се да любовта - (I am to give to give to give, to give to give to love)
Ти си е да ме да ме да ме да ме да ме да ме да ме любовта - (You are to give me to give me to give me to give me to love me)
This model didn’t learn much as we can see the predictions are all same for those seed text. Now increase the number of units.
Single BiLSTM layer with 256 units — 500 epochs
Искам да източа не е важно е е е е е е е е е е или би - (I want to drain is not important is is is is is is is is or is)
Искаш мандарините ли да те закарам в мойта душа и да се повозим и да се повозим от - (Do you want tangerines to drive you into my soul and to ride and ride from)
Аз съм навсякъде където има ли има ли пожари да се оправя да се оправя да ме с - (I am everywhere where there are fires to handle to handle me with)
Ти си моят замък да се качиш и аз съм до теб жега е до лягане да телефона - (You’re my castle to get on and I’m up to you heat is to bed to phone)
We can see some improvements (at least the predictions are not the same for all the seed texts). But still not something we can say these are actual sentences. Continue to train until 1000 epochs.
Single BiLSTM layer with 256 units — 1000 epochs
Искам да избягаме е е е лесна работа ти си риба и аз бързо бързо бързо бързо бързо - (I want to escape is is easy job you are a fish and I fast fast fast fast fast)
Искаш ли да се повозим в мойта кола да се повозим в мойта кола да се повозим на - (Do you want to drive in my car to drive in my car to drive in)
Аз съм slick да се гушка playmate трето поколение да се държи ма буден да се огледаш барна - (I’m slick to playmate third generation cuddle keep me awake to look around the bar)
Ти си моят замък е до теб жега е до теб жега е до теб жега е вързана - (You are my castle is to you heat is to you heat is to you heat is tied)
I feel the model is getting better. Some sentences kinda make sense. Now put one more BiLSTM layer and train 1000 epochs.
Double BiLSTM layer with 256 units — 1000 epochs
Искам един танц на не дължа да се разбивам да се да се моля бе на фитнес запали - (I want a dance I don’t owe to break to pray it was on fitness lights)
Искаш да се възгордяваш да се възгордяваш няма никой те боли и не мога да върна духат любовта - (You want to be proud to be proud no one hurts you and I can’t bring back love)
Аз съм купидон да се качиш да се моля да се фука напиеме теб ми бе се предавам - (I’m a cupid to get up to pray fuck you I was giving up)
жена、моля、моля、моля和любовта
很难说这些是否比以前的预测更好,但这个模型也产生了一些可以理解的句子。
所以这个实验的答案是:用一种不熟悉的语言生成句子是可能的,但是,你可能不明白这个模型生成的句子。由于不熟悉这门语言,很难使用 n-gram 这样的技术。
由道格·马洛尼在 Unsplash 上拍摄
结论和后续步骤
这是一个非常有趣的实验。这个帖子通过了
- 数据探索
- 创建单词云可视化
- 使用 word2vec 探索更多信息
- 使用 BiLSTM 层构建文本生成器模型
接下来的步骤是
- 生成歌词(可能需要更多数据)
- 尝试 skipgram
- 提高包括
和 的数据质量,而不是预测固定长度的句子 - 创建文本生成器 API
希望你对这篇文章感兴趣。如果你想和我联系,这是我的 LinkedIn 页面。
参考
[1]t . Bolukbasi,Chang,K. W .,Zou,J. Y .,Saligrama,v .,& Kalai,A. T. (2016 年)。男人对于电脑程序员就像女人对于家庭主妇一样?去偏置词嵌入。在神经信息处理系统的进展(第 4349–4357 页)。
我们能用 AI 预测特斯拉的兴衰吗?
原文:https://towardsdatascience.com/can-we-predict-teslas-rise-fall-using-ai-2a892ba1aee1?source=collection_archive---------27-----------------------
利用人工智能在自己的游戏中击败市场
合著: 拉米哈曼
阿拉米图像艺术
为什么分析师对特斯拉的下一步动向如此分歧?
在 5 天的时间内,特斯拉的股价涨幅超过了 10 年来的涨幅。分析师们现在分成了两派,一派根据其长期前景称其为汽车行业的下一个 1 万亿美元公司,一派称其为一种时尚,并将其与比特币等以前的投机泡沫进行比较,问题是:我们能利用人工智能的 LSTM 预测接下来会发生什么吗?
华尔街认可 AI 做股市分析吗?
数据科学家一直声称,人工智能将彻底改变我们使用数据预测和分析金融模式的方式,世界上最具流动性的金融生态系统纳斯达克最近刚刚证明了这一点,承认它利用机器学习和人工智能,以便从其庞大的数据集中学习错综复杂的模式和隐藏的关系。
照片由 Pexels 上的 Pixaby 拍摄
悲观的投资者会让你变富吗?
在特斯拉突然崛起之前,悲观的投资者押注于这家汽车制造商,谷歌趋势显示,搜索“我应该做空特斯拉吗?”为公司的年度股东大会做准备。
“我该做空特斯拉吗?”:截至 2020 年 2 月 5 日的谷歌趋势数据
投资者信心下降
这是由投资者押注特斯拉无法满足生产和交付时间表的记录以及一个主要预期推动的:特斯拉将像 16 年来一样,无法实现盈利。
投资者信心的下降也可能是由最近的 Cybertruck 失误造成的,马斯克的新“防弹”汽车的玻璃在电视直播中被打碎,在此期间股价下跌了 6%。
“我该不该买特斯拉股票?”:截至 2020 年 2 月 5 日的谷歌趋势数据
特斯拉的强势回归
然而,当特斯拉宣布拥有【T10 亿美元现金,并在 2019 年最后三个月实现3.86 亿美元利润,使其全年利润仅剩下3580 万美元的微弱优势时,它为自己准备了一个关键的变化:特斯拉现在可以不再依赖债务来弥补亏损和流动性不足,并开始自给自足。这对投资者来说是最大的冲击之一,批评者没有抓住特斯拉的主要批评点:盈利能力。
实现人工智能的 LSTM,以预测接下来会发生什么
我们的工作是展示神经网络如何能够从历史数据中学习,以便预测明天会发生什么,为那些希望通过在这一历史性泡沫中建立每日市场头寸来获利的人提供了一个巨大的机会。
但首先,让我们仔细看看这只股票的表现:
关闭价格历史记录
TSLA 在 2019 年底突破阻力,表明交易者将看涨,但不顾一切,它不仅走向相反的方向,而且达到了 961.86 美元的历史高点。
特斯拉的每日回报
此外,特斯拉在过去一年的回报相当不稳定,使其成为一只不可预测的股票,特别是在接近年底时,因为临近年度股东大会。
如果有一种方法可以准确预测明天的股票价格,一次预测一天,会怎么样?
预测任务
让我们把自己放回到 2018 年第四季度,我们需要预测未来会发生什么。这是我们建立一个长短期记忆(LSTM)神经网络模型的地方,该模型将对 80%的历史数据进行训练,并预测接下来的 20%,这个过程被称为回测。我们可以通过比较我们的预测和实际价格来评估我们的模型。
照片由 Pietro Jeng 在 Unsplash 上拍摄
什么是 LSTM?
LSTM 是一种用于深度学习领域的人工递归神经网络。
这些神经网络通常非常擅长通过循环信息、重新学习和调整先前犯下的错误来从长序列中提取模式。
作为人类,我们边走边学,当你读这句话的时候,你是根据你对前面单词的理解来理解每个单词的。你不会每读一个字就把所有的东西都扔掉,重新从头开始思考,你的想法是有持久性的。
LSTM 预测泰斯拉运动的结果——一颗隐藏的宝石
该模型在识别和学习模式方面做得非常出色,因为它慢慢预见到了繁荣的发生。
我们的模式完美吗?
均方根误差:23.24
远非如此,但是对于每一个预测,结果平均只相差 23 美元。
让我们仔细看看我们的模型对过去 10 天的股价预测:
如你所见,该模型在预测股票走向方面做得相当不错。然而,当我们错了的时候,大多数时候我们只错了很小一部分,我们对 2020 年 2 月 6 日的最新预测只错了 0.22%。当我们的模型在特斯拉 961.86 美元的历史高点下跌 28%时,我们的模型仍然预测了正确的方向,这将为任何持有该股多头头寸的人赚钱。
不管怎样,即使我们的估计是错误的,总的方向还是会回到我们的预测。这使得我们的预测模型不仅更准确,而且相对于股票市场更直观,这个行业刚刚开始了解人工智能在模式识别方面提供的好处,创造了一个难得的利基机会。
短挤压现象
当投资者做空股票时,他们借入股票并卖出,希望以下跌的价格买回,并从中获利。然而,这也意味着,如果股价上涨,他们的损失可能是无限的,这就产生了一个疫情,促使他们尽快卖出股票以限制损失,反过来,这又会大幅放大股价。
所有这些因素加在一起,推动特斯拉的股价在周二上涨了 100%,达到 961.86 美元的历史新高,其中 40%可归因于过去两天。这种现象被称为卖空,卖空者在 2020 年已经损失了80 亿美元,其中仅在周一就损失了 25 亿美元。
结论
从定义上来说,特斯拉是一只情绪股票,事实上,我们的模型能够有如此高的准确性,还能学习如何在理解投资者情绪如何反映在数字上方面拥有高度的情商,这是一场革命。
方向与精度
就价格而言,这可能不是最准确的,但我们的目标是预测特斯拉股票的走向,这个模型在这方面达到了目的。
改进我们的模型
在改进我们的模型时,通过从 Google Trends & Twitter Analytics 中提取指标来纳入更多情绪将是有用的,如果一支股票被认为是情绪化的,那么在预测它时尽可能多地提取情绪是唯一合理的。
我们并不是说我们找到了成为亿万富翁的方法,而是说这可以作为在新闻混乱中完善现有交易策略的基础。
商务化人际关系网
【https://www.linkedin.com/in/nmukhtar
https://www.linkedin.com/in/ramy-hammam
带代码的特斯拉预测模型
[## RamyBot/Tesla 预测
在 GitHub 上创建一个帐户,为 RamyBot/Tesla-Predictions 的开发做出贡献。
github.com](https://github.com/RamyBot/Tesla-Predictions)
更新:截至 2020 年 2 月 6 日,该模型已经能够反映当前疫情冠状病毒对中国和供应链的影响,这直接影响了特斯拉的股价。
我们能预测电视节目的寿命吗?
原文:https://towardsdatascience.com/can-we-predict-the-life-span-of-a-tv-show-212762ae7b8d?source=collection_archive---------68-----------------------
我所在的数据科学训练营 Metis 的第二个项目是对我们选择的主题进行预测。该项目的指导方针是从网站上收集数据,并使用线性回归对连续的目标变量进行预测。
讽刺的是,选择主题对我来说是最困难的部分之一。在被介绍到这个项目后,我花了太多的时间在不同的网站上搜索,寻找一些我可以预测的有趣目标。到第二天结束时,我觉得不可避免的是,我必须做一个我不感兴趣的项目,只是为了提交一些东西。感觉被打败了,我的思想开始徘徊,我想我最喜欢的电视节目是否会被更新。然后我突然想到,“与其等公告,我为什么不用数据来预测会不会续签?”然而,一个节目被更新或取消并不是一个连续的变量。在和我的团队中的其他几个人交谈后,预测电视节目寿命的想法出现了,我的项目想法最终得到了巩固。特别是,我的目标是建立一个模型,可以预测一个节目将会播放多少季。
数据收集
一开始,我从分级网搜集了 1000 个电视节目的数据,然后我从分级网搜集了每个节目的美国电影协会分级和制作公司的 IMDb 。
从 RatinGraph 收集的前几行数据。图片作者。
我将数据限制在至少有一季的电视剧上,并且是在 1995 年或之后发行的。为了防止数据泄露,我只使用了在第一季结束时可用的数据作为我的模型的特征。
数据处理
我继续清理 RatinGraph 数据,最终发现并删除了一些节目的每集数的异常值。我还将出现次数少于 7 次的类型合并到“其他”类别中。为了使用流派作为特性,我为每个流派创建了虚拟变量列。每个节目在其包括的每个流派的虚拟列中得到 1,并且对于与该节目没有相关流派的所有其他虚拟列得到 0。接下来,我清理了 IMDb 的数据,删除了重复的和没有有效美国电影协会评级的显示。为了使用美国电影协会评级,我将其视为一个序数变量,并制作了一个映射,将评级从适合儿童(TV-Y)为 0 到最不适合儿童(TV- MA)为 6 进行排序。
在开始 Metis 之前,我不熟悉的一个策略是创建最小可行产品的过程,并通过多次迭代来改进它。在数据处理的每个里程碑之后,我创建了一个 EDA 笔记本来研究基线模型,并在其上逐步改进。那些笔记本可以在我的 GitHub repo 的附录里看到这里。这个迭代过程帮助我在早期获得一个工作模型,当我研究它的特性时,我可以合理地改进它。这也阻止了我在没有启动工作模型的情况下,花费所有的时间清理和获取更多的数据用于模型。
基准模型特征(左)和包括类型的模型特征(右)的相关热图。图片作者。
正规化
在整个 EDA 笔记本(在附录中)中,我对两组特征测试了线性回归、多项式回归、套索和岭回归。这两个节目的唯一区别在于,一个包含了一个二元变量,即该节目是否由大型制作公司制作,而另一个则没有。我决定继续关注 Lasso 和 Ridge,并使用 LassoCV 和 RidgeCV 来寻找最好的 alphas。
比较模型 R 的分数。图片作者。
考虑到所有的事情,我使用 RidgeCV 作为我的最终模型,alpha = 10,并且不包括制作公司的功能集。
我的模型中的许多系数都符合预期,而其他的则有点令人惊讶。我发现犯罪、喜剧和家庭这三种类型有最大的正系数。在调查了季数最多的电视节目后,我发现像法律与秩序、南方公园和海绵宝宝这样的节目是播放时间最长的,并且至少有其中一种类型。此外,纪录片和传记片等类型的系数为负。我认为这是因为纪录片和传记倾向于单一的独立系列。动作和冒险等类型的其他负系数没有那么清晰的推理。然而,也许最令人惊讶的负系数来自第一季的收视率。
我怀疑第一季收视率高的电视剧一般会有更多季。当我看着第一季收视率与季数的关系图时,我发现有些很长的剧集第一季收视率并不高。例如,节目 Top Gear 已经播放了 28 季,第一季的收视率为 7.3。值得注意的是,这部剧的类型之一是喜剧,这是我们贡献最大的积极因素之一。
图片作者。
至于我的模型的准确性,它的得分为 R =~.37,在最终测试集上调整后的 R =~ .35。它也有大约 1.6 个季节的平均绝对误差。
最终模型的残差。图片作者。
回到知道我最喜欢的节目是否会继续,我用我的模型做了预测。它预测它只会运行 1.3 季。事实上,该剧刚刚续订了第三季!这和我的平均绝对误差是~1.6 个赛季是一致的。虽然我的模型低估了这部电视剧的寿命,但对于我最喜欢的电视剧来说,这并不是我太担心的事情。
结论
选择一个我真正感兴趣的主题是我成功完成项目的关键。我发现自己被迷住了,寻找额外的数据和更多的特性来添加到我的模型中。然而,从一个基线模型开始,然后添加到它允许我做出合理的改进。我开始回答这个问题“我们能预测一部电视剧的寿命吗?”嗯,根据我的模型,我们可能无法准确预测它,但我们可以根据它的特征进行合理的猜测。
完整的项目代码可以在这里找到。
我们真的可以在浏览器中运行 AI 吗?
原文:https://towardsdatascience.com/can-we-really-run-ai-in-the-browser-aaf8a5c17d0?source=collection_archive---------65-----------------------
让我们用 tensorflow.js 来探索一下
这篇文章的目的是看看如何在浏览器中运行深度学习模型,以及这种方法的利弊。要复制的代码可以在 github 上找到。
如果我们把人工智能定义为一个经过训练的大模型。这个模型是一个函数 f() ,它接受输入并以结果的形式产生输出,
其中 f() 可以表示为下列之一:
神经网络的图形表示。
神经网络的抽象。
…在我们的浏览器中运行这种模型有多容易?这种方法的优点和缺点是什么?让我们通过尝试来探索。
实验
为此,我使用了 tensorflow.js 。我想使用一个预先训练好的模型,这意味着有人已经调整了函数并向其输入数据以获得参数。这些参数可以被视为一个大的数字列表,它将决定如何将输入转换为输出。这个人是好心分享参数和功能。就 Tensorflow 而言,这种情况可能发生在 TensorHub 中。之后,我可以决定改进模型,这将被视为迁移学习,或将其用于手头的任务。
让我们采取三个步骤的方法在我们的浏览器中运行这个模型。
- 理解 Python 中的模型,并将其导出到 Javascript
我想尝试用伯特问题&回答,但是我遇到了一些问题。第一个是模型的大小。我不认为我的用户会等待 1gb 的参数来下载。在这方面,看起来正在用 Tensorflow Lite 缩小模型的尺寸。它通过使用量化技术,专注于尺寸/性能优化。
其次,记号化器是将字母、单词、句子转换成函数可以理解的输入的一段代码。它依靠的是 HuggingFace ,一个用 Python 写的库。我不太赞成用 Javascript 重写它。
来自 TensorHub 的打印屏幕。
所以我决定不依靠 TensorHub,而是依靠这个教程。我按照所有的步骤从零开始快速训练了一个小模型。该模型的任务是执行情感分析,并将短句转化为从 0(负面情感)到 1(正面情感)的情感得分。事后,我将其转换为 tensorflow.js 模型。
// Python - save modelimport tensorflowjs as tfjs
tfjs.converters.save_keras_model(model, tfjs_target_dir)
然后按照文档,在 Javascript 代码中“简单地”这样做来加载模型。
// JavaScript - import model
import * as tf from '@tensorflow/tfjs';
const model = await tf.loadLayersModel('https://foo.bar/tfjs_artifacts/model.json');
然而,在这个过程中我遇到了很多问题(版本控制、层命名、tensorflow.js 中不支持的层等等)。如果你钻研代码,你会发现我决定依赖相同的模型,但是被 Google 转换成 Javascript。
所以 tensorflow.js 是存在的,但是它没有我们在 tensorflow 中找到的所有功能。
2.用 Javascript 试试这个模型
一旦你在浏览器中得到你的模型,还有一些工作要做。您需要确保您收到的输入符合模型的预期,并处理其结果。在那里我得到了 ml5 库的帮助。我没有使用这个库,但它极大地帮助了我理解,为了得到结果,你需要经历这些步骤。
// JavaScript - get predictionconst predictOut = model.predict(input);const score = predictOut.dataSync()[0];predictOut.dispose();input.dispose();
这与 Tensorflow 关于将数字转换成 tensors 的故事有关,反之亦然。
3.构建一个小 UI 并公开它
一旦模型的 Javascript 部分被破解。我将它打包成一个小的 React 应用程序,并使用 surge.sh 让它快速服务。这是结果,一个 Tensorflow 模型直接在你的浏览器中运行,对预测的后端调用为零。
[## 情感检查器
使用 Tensorflow 的情感检查器
tensorflow-browser.surge.sh](https://tensorflow-browser.surge.sh/)
为了繁殖:
// bash# clone the repository and cd to directory
git clone [https://github.com/tdetry/tensorflowJS-in-React](https://github.com/tdetry/tensorflowJS-in-React)
cd tensorflowJS-in-React/# install the dependancies and build the application
npm i
npm run build# expose the build to the internet thanks to surge
cd build
surge
回顾的
理论上,只要模型不包含太多的参数,它应该可以在浏览器中工作。然而,我们看到模型的规模越来越大,例如,新脸书聊天机器人的 94 亿个参数。下载所有参数所需的时间将是一个问题。但是对于如此庞大的模型,及时获得预测也将很快成为一个问题,因为输入需要与所有这些参数“相乘”才能获得输出。在这方面,与 Javascript 相比,Web 组装等技术可以用来加快计算速度。正如谷歌地球已经的情况一样。
问题是,它能否克服网络延迟问题(让计算在后端执行,然后发送到前端)?
最后是隐私和知识产权部分。从隐私的角度来看,让模型在浏览器中运行对用户来说很棒,因为他不必发送他的个人数据。这些都保存在他的浏览器里。我看到了两个不错的应用。例如,检查你是否有资格获得某些东西(贷款?)而不发送您的完整身份。此外,您可以使用一种模型,允许您通过眼睛或手的移动来浏览,而无需发送您的面部和背景。
然而,我看到了一个知识产权的风险,因为完整的模型将被发送给用户,用户可能会越过模型许可并将其用于其他目的。
结论
让我们回顾一下。
优点:
- 数据隐私。你不需要发送你的数据来得到一个预测。
- 运行时的网络延迟。你不需要依赖网络来接收预测。除了先下载模型。
缺点:
- 获取模型的网络延迟。模型越大,下载的时间就越多。
- 型号 IP。你的完整模型暴露了。
- 预测性能。模型越大,在浏览器中运行的计算就越多。
- 有很好的框架来服务于端点之上的模型,比如服务于的 TensorFlow。
- Javascript 对 ML 的支持相当有限。
我希望你喜欢阅读,如果你有问题,评论,我会很乐意在评论中回答。
托马斯
我们可以基于角色重新定义数据科学头衔吗?
原文:https://towardsdatascience.com/can-we-redefine-data-science-titles-based-on-roles-6a2c321201c7?source=collection_archive---------23-----------------------
让我们来看看工作描述是否准确到他们描述的标题。
我意识到我已经做了一部分艰苦的工作,为之前的一篇文章扩展数据。我通过收集北美各个城市的数据科学帖子来扩展这一点。我想专注于工作描述,给出的职位名称,以及描述是否与名称相符。
在这里,我将应用一些技巧来更好地区分这些位置。首先,我从招聘信息中提取数据,并提取我认为相关的关键数据科学术语的存在或缺失。我把它们归类为职位的“要求”或“资产”(或“最好拥有”)。
根据职位是否包含“分析师”、“科学家”、“工程师”或“经理”等关键词,所有职位都被分配了“工作类型”。我从这些开始,因为这些的一些版本通常被接受为数据科学工作的“类型”那里。我从大约 6000 个职位发布开始,过滤掉了大约 1000 个职位,我无法将它们归类为这些“类型”(例如“劳动力规划副总裁”或没有给出职位名称的职位)。
对于这个数据集,我们有 50 个维度的技能、编程语言和软件知识,这些都是公司正在寻找的“需求”或“资产”。我用最大似然估计器进行了第一次主成分分析,以确定要识别的成分数量,并丢弃了解释方差小于 5%的任何成分,留下了 5 个有意义的成分。然后,我用 5 种成分重新运行 PCA,结果如下,按描述的职位类型进行着色:
这是一个相当大的混乱,因为工作类型没有给出数据分布之间的清晰描述。因此,我运行了一个包含 5 个聚类的 k 均值聚类。然后,我重新制作了上面的图,将颜色从描述的位置类型更改为 k 均值标签标识的簇。
主成分分析,工作公告上有 5 个成分,用 k 均值识别标签着色。
仍然有一些重叠,特别是在聚类 0 和 2 中,并且在一些聚类中仍然有一些大的分布,但是这些 k 均值确定的标签似乎比标题更好地描述了位置中的方差。
但是这些 k 均值标签是什么意思呢?
就其本身而言,除了他们已经识别和分类了不同的集群之外,他们实际上没有任何意义。因此,让我们来关注一下这些集群在不同的必需技能和属性方面的最大差异。对于下面的热图,我们希望将重点放在最深的颜色(最深的红色和蓝色)上,因为这些是解释该集群最大差异的技能。此外,沿着“列”阅读图表,我们可以看到哪些属性导致了个集群之间的最大差异,例如 python_requirements 在大多数集群之间存在差异,或者 graduateEducation_requirements 在集群 0 和 1 之间以及这些集群和其余集群之间存在较大差异。
每个聚类中每项技能的 PCA 贡献热图。
接下来,我们转向这些技能在不同集群的招聘信息中出现的频率。首先,我们将那些 K-means 标记的聚类之间的差异大于 40%的聚类进行子集化,以确定该技能或属性是否是必需的。集群 2 通常是最高的,或者列出了许多其他帖子没有列出的需求/资产。其他主要差异出现在集群 1 和集群 4 对大学教育的重视程度较低(注意“大学”、“硕士”和“博士”面板)。您还可以看到集群 0、2 和 4 中对一些机器学习的强调(例如 python、机器学习和 spark)。
分类中最小出现次数和最大出现次数之间的差异大于 40%的作业属性。
如果我们缩小到所有要求,我们再次看到集群 2 非常重视教育,100%的职位要求研究生教育,超过 50%的职位要求博士学位。这也有一些相关的关键字,这将符合我们对这一群的理解,即具有像计算机科学和统计这样的关键字的高学历(例如,如“计算机科学或统计的博士或硕士”)
第 2 组不同技能的重要性,其中“教育”要求排在首位。
但是这些集群有意义吗?从第四个集群的工作要求来看,他们几乎同样可能包括 Hadoop 和 Tableau。这些似乎是数据工程师的数据科学工作与使用仪表板和可视化的更多分析角色的不同领域。SQL 是这个角色的第二个最常见的需求,这可以从这些角色的两个方面得到证明。
另一个确定的集群是在给定要求很少的职位周围。我对此的解释是,招聘启事描述了职位,但没有列出许多要求或资产,这些被聚集在一起作为某种“空”职位。这对我们理解这些立场并没有太大的帮助。
具有很少必需技能的群组 1(注意 x 轴刻度)。
如果我们回到兰迪提出的更好的角色定义的“乐观结果”,我不认为我们达到了这个目标。由于数据科学职位通常以洗衣单的形式书写,或者寻找他们的数据科学家独角兽,这些数据很可能是复杂和嘈杂的。围绕这一点的另一个相关警告是,这些差异是否实际上归因于角色的差异,或者是否一些公司或个人以不同的方式编写描述。有些人可能会写一些关于上市要求和资产的帖子,而其他人可能只是笼统地描述职位,而没有我在这里搜索的关键词。因此,虽然如果我们能够更清楚地了解不同的数据科学职位及其要求和角色会很好,但我无法通过这种分析达到目的。
如果你有如何改善这个问题或其他问题的想法,请随时联系 LinkedIn 或 Twitter 。
注释
- 对于我在本次分析中使用的更新代码,请查看我的 Github 库。
- 在做了一些专注于我现在的城市温哥华的早期工作后,我想这样做。
- 其他人在整理这些角色时比我幸运:https://towards data science . com/what-type-of-data-scientist-are-84c 3c 2 b 9 fc 16。成功的差异可能归因于搜索更具体的职位(例如,“数据工程师”、“机器学习工程师”)和更小的数据集。
- 技能/资产完整列表:" bigquery "、" python "、" sql "、" jira "、" tableau "、" docker "、" scala "、" java "、" spark "、" hadoop "、"统计学"、" nlp "、" cnn "、" rnn "、"编程"、" R "、"学士"、"硕士"、"博士"、" C "、"机器学习"、" cs "、" SAS "、" AI "。
我们能否利用深度学习创造新的编程语言?
原文:https://towardsdatascience.com/can-we-use-deep-learning-to-create-new-programming-languages-c5d7aeb96379?source=collection_archive---------29-----------------------
脸书人工智能代码转换器:高级编程语言之间的翻译
照片由 Karl Pawlowicz 在 Unsplash 上拍摄
我最近读了一篇由脸书人工智能研究所的 Marie-Anne Lachaux,Baptiste Roziere,Lowik Chanussot,Guillaume Lample 于 2020 年 6 月 5 日发表的论文。它是关于一个由神经网络创造的转换器。代码转换器基本上是一个在高级编程语言之间翻译源代码的系统(例如,从 C++到 Python)。
转换编译器通常用于将用废弃语言编写的基本代码转换成更新的语言。目前使用的代码转换器是基于手工制作的规则,这意味着大量的手工工作和对错误的敏感性。此外,它需要源和目标编程语言方面的专业知识,以及随后的手动修改。因此,整个过程变得乏味、耗时且昂贵。根据文中给出的一个例子,澳大利亚联邦银行花费了大约 7 . 5 亿美元和 5 年时间将其平台从 COBOL 转换为 Java。实在是太多了!另一种更适合你需求的编程语言可能会在 5 年后发布。
这种不方便又费力的过程促使脸书人工智能的研究人员利用神经网络创建了一个转换器。他们受到了神经网络在自然语言翻译方面的进步的启发。一个障碍是缺乏训练数据。他们通过在 Google BigQuery 上下载 GitHub 库解决了这个问题。为了评估该模型,他们从 GeeksforGeeks 网站上提取了一组用 C++、Python 和 Java 编写的并行函数。他们还创建了一个由 852 个并行函数组成的测试集。他们的模型,代码转换器,远远超过了基于规则的代码转换器。它翻译功能级别的代码。
这篇论文让我想到了一种由神经网络设计的编程语言。如果神经网络可以在高级编程语言之间翻译代码,它们应该能够创建一种新的语言。神经网络生成图像、视频、新闻文章。为什么不是编程语言?我不是软件设计或架构方面的专家,但我认为这篇文章揭示了未来可以做些什么。
深度学习模型需要大量数据。即使我们构建了一个高度复杂、结构良好的模型,性能也会和我们提供给它的数据一样好。数据量是决定深度学习模型鲁棒性和准确性的关键因素。研究人员还提到了这一领域数据的缺乏。如果我们设法获得大量高质量的数据,用神经网络创造一种新的编程语言似乎不是不可能的。
照片由 Artur Kraft 在 Unsplash 上拍摄
众包可能是数据收集的一种选择。例如,验证码被用于通过众包将书籍数字化。它是作为一种挑战-响应测试而创建的,用于确定用户是否是人类。我们几乎每天都会遇到验证码。我们被要求打一些我们在屏幕上看到的字母。最初的目的是提供安全保障。然后,一个绝妙的主意出现在它的创造者的脑海里。他们看到了数百万人在屏幕上输入他们看到的单词的潜力。因此,他们开始向人们展示部分扫描书籍。最终,数百万人将大量书籍逐字数字化。这个想法更进了一步,创建了一个学习新语言的免费网站 Duolingo。这是它的创作者路易斯·冯·安讲述的整个故事。
让我们回到我们自己的话题。有许多网站供人们用来学习编程语言或提高软件技能。这些网站为实践提供了大量的编码挑战。随着技术和计算的进步,越来越多的人想要学习编程语言。因此,众包似乎有很大的潜力。人们解决的编码挑战可以以一种方式构造,即它们可以用作神经网络的训练数据。然后,神经网络迭代地自我改进到可以用来生成新的编程语言的程度。
我可能太乐观了,但在某种意义上,它甚至可以优于所有现有的编程语言。由于最终会变得毫不费力,我们可以使用我们的模型来创建许多最适合某些任务的特定编程语言。目前有各种各样的编程语言可供选择,而且新的编程语言还在不断增加。它们各有利弊。他们中的一些人在某些任务上比其他人做得更好。由于简单的语法和易于学习的结构,有些更受欢迎。然而,对于所有的任务,没有一个是优于所有其他的。因此,能够创建专注于最好地完成特定任务的特定语言是一个很大的优势。
我们大多数人,包括我自己,直到几年前都无法预见深度学习的潜力。我把我的思维方式改成了“为什么不呢?”。那么,神经网络能创造出新的编程语言吗?为什么不呢?我可以把它命名为 Deep++。
我很想听听你对这个话题的看法或反馈。请随时删除您的评论。
感谢您的阅读。
参考文献
- 由玛丽-安妮·拉肖、巴蒂斯特·罗齐尔、洛维克·查努索、纪尧姆·兰普尔、https://arxiv.org/abs/2006.03511进行编程语言的无监督翻译
使用 GANs 超越生成艺术?
原文:https://towardsdatascience.com/can-we-use-gans-beyond-generating-art-c550cce0d467?source=collection_archive---------33-----------------------
gan 相对较新,许多研究方向仍然开放。
图片由com break来自 Pixabay
生成对抗网络(GANs)取得了实质性的进展,它可以合成近乎完美的人脸[ 1 ],恢复旧视频[ 2 ]的颜色和质量,并生成逼真的 Deepfake 视频[ 3 ]。
GANs 主要关注样本生成。GANs 的基本思想包括一个生成器和一个鉴别器。发生器产生来自训练数据的样本,而鉴别器判断产生的样本以确定它们是真的还是假的。一个例子是:一个伪造者试图学会制造与真钱不同的货币,而警察则学会了捕捉假币。
由于 GAN 是最成功的,并且主要应用于图像合成,我们能在艺术创作之外使用 GAN 吗?
图像到图像的翻译
类似于通过学习句子/短语对映射将源语言翻译成目标语言的机器翻译,图像到图像翻译学习输入图像和输出图像对之间的映射。
自动将图像从一张“翻译”到另一张[ 纸张
在 Berkeley [ 4 ]完成的一项研究中,他们的算法学习将一幅图像从一幅图像翻译成另一幅图像。比如从斑马到马,从夏天到冬天。在他们的工作中,他们提出了一种使用对抗损失从配对样本的缺乏中学习的方法,推动了无监督学习的边界。一定要看看他们的网站,上面有各种使用他们作品的创意(比如把堡垒之夜变成 PUBG )应用。
文本生成
文本的性质使得 GAN 很难生成离散记号的序列。因为(来自生成模型的)离散输出使得难以将梯度更新从判别模型传递到生成模型。
然而,于等人等人却提出了诗体生成汉诗的命题。使用 BLEU score ,一种评估文本质量的指标,SeqGAN 生成了与人类诗歌创作相当的文本。此外,他们将真实的和生成的中国诗歌混合在一起,并邀请中国诗歌专家来判断每首诗歌是人类还是机器创作的。评委们无法区分真正的诗歌和机器生成的诗歌。
生成网络图
生成合成但真实的图形的能力对于异常检测很重要,异常检测就是将异常网络与正常网络区分开。图形生成技术已经应用于物理学、数学、社会学、生物学和计算机科学。
Bojchevski 等人[ 6 ]提出了 NetGAN,它生成的图形展示了使用 Wasserstein GAN 目标训练的众所周知的网络模式。像典型的 GAN 一样,NetGAN 的生成器学习生成真实图形中似乎合理的随机行走,而鉴别器将图形与原始图形区分开来。
音频合成
合成音频已经应用于音乐和电影的创造性声音设计中。这些声音剪辑存储在大型音效数据库中,但有时库中可能不存在理想的音效。如果我们可以通过微调一些输入参数来生成砾石路或沙地上脚步声的声音效果,会怎么样?
加州大学圣地亚哥分校推出了 WaveGAN [ 7 ],学习合成音频以产生声音效果。它已经学会了产生踢鼓和小军鼓的声音效果,它也能产生各种不同的鸟叫。对于钢琴声音生成,它捕捉各种调号和节奏模式。他们实验的声音样本可以在他们的网站上找到。
于等人[ 5 ]也使用 SeqGAN 通过训练一组 midi 文件格式的民间曲调来生成音乐。在他们的工作中,他们将 midi 文件转换成从 1 到 88 的数字序列,以代表与钢琴上的键相对应的 88 个音高。他们的方法优于现有的算法,但他们没有提供人类判断的分析。
GANs 是一种相对较新的方法,许多研究方向仍然开放。伊恩·古德菲勒
[1]t . Karras,Laine,s .,Aittala,m .,Hellsten,j .,Lehtinen,j .和 t . Aila,2019 年。stylegan 图像质量的分析与改进。 arXiv 预印本 arXiv:1912.04958 。[https://arxiv.org/abs/1912.04958
[2] Iizuka,s .和 Simo-Serra,e .,2019 年。用于综合视频增强的时间源参考注意力网络。《美国计算机学会图形汇刊(TOG)】, 38 (6),第 1–13 页。[http://iizuka . cs . Tsukuba . AC . jp/projects/remastering/en/index . html]
[3] Siarohin,a .,Lathuilière,s .,Tulyakov,s .,Ricci,e .和 Sebe,n .,2019 年。图像动画的一阶运动模型。在神经信息处理系统的进展(第 7135-7145 页)。[https://aliaksandrsiarohin . github . io/first-order-model-website/]
[4]朱,J.Y .,朴,t .,伊索拉,p .和埃夫罗斯,A.A .,2017 年。使用循环一致对抗网络的不成对图像到图像翻译。IEEE 计算机视觉国际会议论文集(第 2223-2232 页)。https://arxiv.org/pdf/1703.10593.pdf
[5]俞,李,张,王伟,王,于,2017 年 2 月。Seqgan:具有策略梯度的序列生成对抗网。在第三十一届 AAAI 人工智能会议上。https://arxiv.org/pdf/1609.05473.pdf
[6] Bojchevski,a .,Shchur,o .,Zügner,d .和 Günnemann,s .,2018 年。Netgan:通过随机漫步生成图形。 arXiv 预印本 arXiv:1803.00816 。https://arxiv.org/pdf/1803.00816.pdf
[7]c .多纳休,j .麦考利和 m .帕克特,2018 年。对抗性音频合成。 arXiv 预印本 arXiv:1802.04208。https://arxiv.org/pdf/1802.04208.pdf
我们可以使用机器学习来预测 2020 年崩溃期间的油价吗?
原文:https://towardsdatascience.com/can-we-use-machine-learning-to-forecast-oil-prices-during-the-2020-collapse-4873f03336e9?source=collection_archive---------26-----------------------
利用机器学习的蛮力预测新冠肺炎疫情爆发后油价的回升
照片由 Unsplash 上的 Zbynek Burival 拍摄
敏感商品
在 Unsplash 上科普高清照片
石油定价基础
众所周知,石油是一种大宗商品,在一次市场事件后,其走势会完全相反。
这是因为油价的基本面很少基于实时数据,相反,它是由外部性驱动的,这使得我们预测油价的努力更加具有挑战性。
2020 年:跌宕起伏的一年
新冠肺炎(新型冠状病毒肺炎)
2020 年,新冠肺炎的影响提醒人们,相对于外部冲击,油价是多么不可预测和敏感。
2020 年初
今年年初,由于石油输出国组织主导的减产、美国对多个主要石油出口国的制裁以及利比亚紧张局势升级,油价飙升。
2020 年中期
然而,当全球经济的健康状况在新冠肺炎之后被投入投机时,所有这一切都发生了重大转折,更糟糕的是,行业专家认为现在“几乎不可能”充满信心地预测石油价格。
更令人困惑的是,几十年来,总统们一直在宣扬廉价石油的好处,包括特朗普总统本人就在一个月前。
唐纳德·特朗普在推特上称赞低油价——2020 年 3 月 9 日
唐纳德·特朗普称赞高油价——2020 年 4 月 2 日
然而,特朗普现在正在尽一切努力推动价格回升,包括发布一条推文,导致油价暂时飙升 25%——有史以来最大的单日涨幅。
石油输出国组织交易—2020 年 4 月 9 日
具有历史意义的石油输出国组织减产 10%的协议,只是起到了遏制仍在对市场造成的损害的作用。面对不断升级的财务损失,油气生产商仍在削减股息和资本支出,以保护自己的资产负债表。
为什么要关心油价?
我们创建这个模型的原因是因为经济的健康状况与石油价格的联系,每当石油价格稍微偏离正常水平,经济就会受到剧烈影响,这从谷歌趋势上的平行运动可以明显看出。
(紧密交织的经济和油价——谷歌趋势,2020 年)
时间序列分析
时间序列分析是一种洞察某种商品如何随时间变化的方式,然而,我们需要更进一步,使用机器学习的 ARIMA 创建一个预测模型。
什么是 ARIMA?
自回归综合移动平均模型是一种回归分析形式,通过检查序列中的值与实际值之间的差异来预测未来的变化。
这是实施这一算法的最佳时机,因为鉴于石油输出国组织交易的新近性,我们预计短期内不会再有任何重大的历史性交易。
预报期
时间框架 1:2020 年 4 月 20 日–2020 年 10 月 1 日
(新冠肺炎统计——谷歌新闻 2020 年 4 月 18 日)
我们预测的第一个时间段是从 2020 年 4 月 20 日到 2020 年 10 月 1 日,几乎占全年的一半。
这背后的基本原理是因为我们尚未达到新冠肺炎的全球峰值,这给了我们一个合理的保证,即根据疫情之前的时间表,完全自由的新冠肺炎市场不可能在仅仅 5 个半月内存在,这使我们的预测更加准确。
时间框架 2:2020 年 4 月 20 日–2025 年 1 月 1 日
这个时间框架将作为我们对预计复苏时间的预测,直到油价能够回到 2020 年崩盘前的 50 多美元的高位。
Erik Mclean 在 Unsplash 上拍摄的照片
资料组
我们的数据集来源于美国能源信息署,包含从 1987 年 5 月 17 日—2020 年 4 月 17 日起 37 年的每日历史布伦特油价,这意味着它包括了最近的石油输出国组织交易后一周的油价走势。
培养
在对数据进行预处理后,我们发现从 2000 年开始的数据训练显示了更高的准确性。
训练数据集—石油价格[2000–2020]
模型的统计微调
ARIMA 的差异
差异的整个要点是使时间序列平稳,并且测量今天和昨天之间的差异,直到我们达到统计特性随时间恒定的点。
测试我们是否有一个平稳的时间序列
我们运行一个增强的 Dickey-Fuller,如果 p 值> 0.005,在我们的例子中为 0.297299,我们继续进行差分。
非平稳时间序列的可视化表示—石油价格[2019/05–2020/05]
在运行了三个测试之后,我们确信选择差值 1 的阶的决定是最合适的。****
此后,我们通过检查偏自相关(PACF)图来确定模型是否需要 AR 项,该图显示了序列与其滞后之间的相关性。
PACF:一阶和二阶微分自相关
然后,我们找到移动平均项 q 的阶,这是滞后预测的误差,通过查看 ACF 来查看需要多少 MA 项来消除平稳化序列中的任何自相关。
自相关一阶和二阶差分
经过测试,我们决定将 q 设置为 1,使三个参数(p,d,q)为(1,0,1)。
模型预测:
2020 年 4 月 20 日–2020 年 10 月 1 日预测
时间范围:新冠肺炎[ 未来 5.5 个月 ]的预期高峰
布伦特原油预测平均价格:27.79 美元*
然而,美国大选离我们的预测结束还有一个月,因此,我们决定根据大选可能给经济和油价带来的波动,再提供两种情景。
通配符:德克萨斯
Matthew T Rader 在 Unsplash 上拍摄的照片
德克萨斯生产的石油比除沙特阿拉伯以外的任何一个石油输出国组织国家都多,但是现在它正在被廉价的石油压垮。
这意味着两件事:
- 特朗普需要高油价来获得德克萨斯州的选票,以获得连任
- 德克萨斯州有可能在 40 多年来首次限制产量,以进一步提高油价
本质上,这两个原因都给了我们足够的理由来推测,在可预见的未来,油价将会出现更多的飙升,这意味着我们的预测可能会出现比我们预期更多的起伏,然而,根据目前的情况,它可能会倾向于乐观的估计,即使只是暂时的。
保守估计——布伦特原油平均价格:23.62 美元
乐观估计——布伦特原油平均价格:34.74 美元*
2020–2024 年预测
不管油价飙升与否,我们的模型在预测总体走势方面做得很好,为我们提供了油价复苏预期时间框架的良好指标。
ARIMA 预测—油价[2020–2024]
ARIMA 预测—每期油价[1: Q1/Q2 对 2:第三季度/第四季度]
结果分类
石油价格过去有一些可预测的季节性波动,在春天有一个高峰,然后在秋天和冬天下降。
然而,有 4 个主要因素可能导致未来油价进一步偏离我们的预测:
1)全球需求放缓
2020 年 4 月,全球石油需求比 2019 年的年平均水平低约 1700 万桶,这是有史以来的最大降幅。
2)美国石油产量上升
2018 年,美国成为世界上最大的石油生产国,一年后,自 1948 年以来,美国出口的石油首次超过进口。
3)石油输出国组织的影响力减弱
石油输出国组织没有削减足够的产量来支撑价格。
4)美元价值上升
自 2014 年以来,外汇交易员一直在夸大美元的价值,石油交易以美元支付,这意味着美元上涨 25%抵消了油价下跌 25%,全球经济的不确定性使美元保持强势,这是我们的方向。
恢复时间
M. B. M. 在 Unsplash 上拍摄的照片
总之,我们认为,根据外部性,石油价格将需要大约 4 年时间才能恢复到 2020 年崩盘前的水平。
商务化人际关系网
** [## 诺亚·穆赫塔尔——分析师——BDC | LinkedIn
未来的分析硕士毕业于麦吉尔大学的商业分析专业从…
www.linkedin.com](https://www.linkedin.com/in/nmukhtar/)
GitHub 代码
[## 石油价格 2020
预测油价的机器学习算法 ARIMA-Noah MMA/Oil Prices 2020
github.com](https://github.com/NoahMMA/oilprices2020)**
你能在一周内建立一个数据工程产品吗?
原文:https://towardsdatascience.com/can-you-build-a-data-engineering-product-in-a-week-fb532dd7bdb4?source=collection_archive---------52-----------------------
用管道预热数据工程
2020 年 5 月,我参加了 Pipeline 夏令营,这是柏林数据工程训练营 Pipeline 数据工程学院的首次活动。
我写这篇文章是为了感谢彼得 & 丹尼尔(Pipeline 的创始人)。正如你将在下面看到的,我从他们的夏令营中获益匪浅。我希望这篇文章能帮助其他人从彼得·丹尼尔试图带给世界的价值中受益。
我在数据科学静修时认识彼得,在那里他将商业头脑与对学生成功的真诚关怀结合在一起。我只在网上见过 Daniel,从夏令营中可以明显看出,他的技术专长、经验和教学方法的结合对新的数据工程师非常有价值。
这是一个令人兴奋的团队,我期待着看到 Pipeline 在柏林立足——把我当成一个粉丝吧。
夏令营是什么?
夏令营是为期一周的数据工程课程,于 2020 年 5 月在网上举行,当时世界上大部分人口都处于封锁状态。
全球都感受到了日冕的影响——然而在这场危机中也有机会。管道已经表明,他们能够在危机中看到机遇。
在线教学并不容易——在[数据科学务虚会]的最后几个月里,我们一直在为学校制定冠状病毒战略,包括如何在线授课。课程内容(主要是幻灯片讲座)讲授得很有技巧,技术上也很相关。学生们都觉得提问很舒服,这是一堂好课的标志。
该课程是精益方法的一个很好的例子——有大量客户反馈的最小可行产品。很高兴成为其中的一员,我期待着看到 Pipeline 扩展他们在数据工程教育方面的服务。
这门课程是通过 Zoom & Slack 远程提供的——大约一半的教学时间,一半的项目工作。课程的目标很简单——在一周内构建一个数据工程产品。
你在一周内建立了一个数据工程产品?
是啊!在这一周,我们有一个简单的数据产品在本地运行,构建自:
- 使用 Python 进行 API 数据访问
- SQLite
- 显示数据的 Flask web 服务器
- Docker(因为为什么不呢?)
后来,技术债务得到偿还,应用程序得以部署:
- Makefile 来简化常见操作
- Jinja &前端的引导模板
你可以在 PythonAnywhere 上看到部署的应用——你也可以在 GitHub 上看到源码。你可以看到我在下面的 PythonAnywhere 上部署应用程序:
作为一个教过一段时间数据科学的人,印象最深的是堆栈的简单性。在教学时,很容易让学生的事情变得复杂,或者教授复杂的工具,这些工具带来的困惑多于帮助。
不能低估带着工作产品五天后离开的力量。能够看到您的数据并与之交互的价值是巨大的,对于发现您的数据管道的问题并向客户(或雇主)炫耀来说!).
SQLite 的使用对我来说是一个亮点——我不知道它有多广泛(它在/usr/bin/sqlite3
就可以使用,或者在许多手机上运行)。没有设置/安装成本的技术是伟大的。SQLite 并不是解决所有问题的最佳数据库选择,但是很高兴知道它是新项目的合理选择。
另一个是 Makefiles 对于构建 Dag 的有用性。我很熟悉 Airflow & Tensorflow 中 DAGs 的概念——很高兴知道我可以使用make
& Makefile
在语义上做类似的事情。
课程中还教授了一些其他工具,包括 Datasette 和 GitHub Actions——在我的TODO
上玩这些工具。
我也能够在其他项目中运用经验和知识,比如气候新闻数据库。它还为我提供了一个堆栈(Python、Flask、SQLite、PythonAnywhere、Jinja & Bootstrap ),支持全堆栈、敏捷数据科学。
一周内你能学到什么?
除了项目工作,还有更传统的教学内容。技术内容是自以为是的(没有宗教色彩),充满了对数据工程的有用观点:
- 获取数据
- 将事物联系在一起
get / load, store, deploy
一个特别有用的见解是丰富数据,使其对业务有价值—包括一个将 UNIX 时间戳转换为具有语义意义和价值的数据的出色示例:
- UNIX 纪元时间(626629357)
- 日期时间(1989 年 11 月 9 日)
- 星期四(可计算)
- 柏林墙的倒塌(可以用强化器解决)
他们还强调要务实,避免绝对化,并意识到没有放之四海而皆准的解决方案:
- 云上没有好地方,都有不好的地方,最好的策略是做好准备!
- 数据的三种用途
- 分析(将会发生什么)
- 法医(发生了什么)
- 监控(发生了什么)
- 9/10 的问题发生在外部数据上
- 过滤然后连接
- 要有防御性
- 宁可可以理解
- 考虑如何在磁盘上构建数据时分离关注点/依赖性
接下来去哪里
如果你正在考虑成为一名数据专家(尤其是作为一名数据工程师),那么考虑 Pipeline 数据工程学院的数据工程。
感谢阅读!
原载于 2020 年 6 月 21 日【https://adgefficiency.com】。
没有 MOOC 证书,你能找到你的第一份数据科学工作吗?
原文:https://towardsdatascience.com/can-you-land-your-first-data-science-job-without-having-a-mooc-certificate-ac6c2244df86?source=collection_archive---------27-----------------------
是的,你可以,这是我学习数据科学的实际报酬。
克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
我是一名 CS 毕业生(2019 届)。到大学二年级结束时,我开始对 web 开发失去兴趣,这促使我探索其他计算机科学领域,以后我可能会继续写毕业论文,并为我的硕士学位做进一步的研究。而这一切让我想到了 AI/ML/DL/DS 等等。
快进到 2018 年 8 月,大学的第七个学期,我不得不写毕业论文的那一年。我最终写了一篇关于浏览器扩展的研究论文。不是 ML,不是 DL,与数据科学或 Python 毫无关系。我仍然不知道它是如何被选中出版的。
2019 年 5 月晚些时候,就在毕业典礼前两个月,我开始恐慌,我没有工作机会,没有实习,没有任何东西可以展示我在大学最后 4 年所做的“努力”。在所有这些混乱和不确定性中,我确信一件事——无论如何,我必须进入数据科学。为什么?因为那是我为自己设定的衡量自我价值的标准(我知道,因为所有错误的原因)。
现在 如何进入数据科学?
谷歌了完全相同的东西,阅读了一篇又一篇文章,Medium 帖子,Quora 答案,Reddit 线程,观看了大量 Youtube 视频,加入了随机 slack 社区和 Whatsapp 小组,我的第一个是这个 Slack 小组麻省理工深度学习课程由 Lex Fridman 创建。发现这个松散的社区对我来说简直就是一个灵光乍现的时刻。【这些研究很多都是在我大学最后一年完成的,所以它们不是最新的】
以下是通过浏览和谷歌搜索得到的一些重要建议:
- 在 Coursera 上做吴恩达的 ML 课程。
- № 1 可能不是初学者的最佳建议。
- ….等等
在所有这些发现中,Siraj Raval " 在 3 个月内学会数据科学 " 实际上是学习数据科学时要涵盖的主题的一个很好的路线图。但这里是所有这些研究的要点,它将需要一个坚实的 3 个月的专门学习期,遵循在线课程,做顶点项目,学习数学,以及不要涉足该领域的东西。
现在这让我意识到,我真的跟不上这个轨道。连续三个月专注于一件可能会成功也可能不会成功的事情不是我愿意付出努力的事情,为什么?因为我就像,“在我大学的 4 年里,这些年我都学了些什么!?"
据我所知,我做了很多项目(课外),为什么现在这些都没有用,只是为了得到一份与 CS 相关的入门级工作?
我决定,如果我只是申请一份数据科学实习,并基于我的其他项目,即使无关紧要,他们可能会给我一个机会,而不是做在线课程。即使他们没有,他们在选择过程中给出的作业/项目对下一次申请也非常有用。如果我不能做这些项目中的任何一个,我会回到传统的道路上,也就是说,先做课程。
这一个想法就是整篇文章的主旨!
我打磨了简历,用一些大学项目更新了 Github,甚至撑起了一些直播网站(一个功能齐全的卖书的电商网站)等等。,并开始申请每一个与数据科学远程相关的实习,基本上是数据+Python 的任何东西。【主要通过】
令我惊讶的是,我开始收到他们每个人的回复。他们给我分配任务(编码项目),我开始做这些。第一个是,使用 Pydicom 读写和标记 Dicom 文件。我不知道 Dicom 或 Pydicom 是什么。但我谷歌了一下,完成了任务。他们没有给我提供实习机会,但问我是否可以为他们的开源项目做贡献。我马上答应了。
就像那样,我同时申请了大约 5 份实习工作,并从他们那里得到任务。但是在完成了他们的前 2-3 轮任务后,我不得不拒绝其中的 3 个任务,专注于 2 个重要的任务:
- Internshala 的 C++助教(每月约 2 万英镑)
- 有工作机会的数据科学实习(每月 2-3 万英镑)
然后,我懒于选择第一个选项(尽管 C++是我迄今为止最喜欢的编程语言),被拒绝了。第二个选项的选择是这样的:第一个任务是解决 Python 中的一些正则表达式问题(测试我的 Python 技能)。现在,由于对 Python 知之甚少甚至一无所知,我开始在 W3 schools 学习一些基本的语法,后来在 StackOverflow 和一些密集的谷歌搜索的帮助下,我在两天内完成了这项任务。
就像那样,经过 4 轮的任务和一些电话面试(真的很奇怪的谈判),他们终于给了我这份工作!
这个成功故事涉及的因素 :努力+运气
下面是我的一些背景资料:
- 作为一名 CSE 学生,我已经很好地掌握了编程和数学。
- 我在一所非一流的学院(IFHE,Hyd)完成了我的工程设计。
- 我没做过在线竞技编程。
- 在这 4 年的工程学生涯中,我诚实地独自完成了每一个课程项目。
- 我申请这些实习的时候成绩是 9.2 (不是主要因素)。
以下是本文的一些要点:
- 多点足智多谋,随时都能派上用场。
- 用一些代码建立了我的 Github 档案,这是这个故事中的游戏规则改变者。
- 在所有主要平台中:Linkedin、AngelList 等……Internshala是我得到最多回应的地方。
这里还有一些外卖:
- 相信自己,你的努力迟早会有回报的。
- 对自己的技能有信心,如果你认为自己不配,就不要申请那些 5k 实习。
- 不断学习,因为这是你真正拥有前两种选择的方式。
- 你不必总是跟着别人的话走,走自己的路。
两个月后,我毕业了,手里拿着一份工作邀请,在我真正想要的领域,完全没有花钱上任何网络课程,拿工资在工作中学习数据科学+ ML + NLP!
**这是我迈向数据科学的第一步:
你能预测冠状病毒如何传播吗?
原文:https://towardsdatascience.com/can-you-predict-how-the-coronavirus-spreads-43b3631a1b1b?source=collection_archive---------8-----------------------
流行病中的数据、人工智能和预测模型
截至 2020 年 3 月 11 日,世界卫生组织(世卫组织)已经正式宣布冠状病毒现在是疫情。世界各地的人们都在争先恐后地遏制这种病毒,没有人真正知道未来会怎样。已经发表了许多文章推测这种疾病的发展,一些科学家声称世界范围的高峰将在明年冬天到来。无论是预测增长率还是试图进行先发制人的检测,许多人都试图使用我们称之为模型的方法来预测未来。
这些模型有多可靠?为了回答这个问题,我们需要了解它们是如何产生的。
创建模型
数学模型本质上有助于说明因果关系。模型有两个组成部分:自变量和因变量。
这里,我们用一个非常简单的数学模型来说明我的观点。线性回归模型就足够了,因为我们可以很容易地通过 Excel 甚至手工绘制它。不需要复杂的软件,理解起来很直观。下面是我绘制的图表:
资料来源:杨春伟,基于自己生成的图解(图 1)
假设我是一个小水果店的老板,很好奇评价苹果的销售业绩。作为一个假设,我预测我的苹果总销售额(y 轴)将与我的商店运营的月数(x 轴)成正比。数学上,这条线形成一个 y = 10x 的等式。
如此完美的数据仅仅是一个幻想。现实中,我们通常会得到这样的东西:
资料来源:杨春伟,下图 2 的数据点(表 1)
然后绘制一条线性回归线(浅灰色)来估计苹果的未来销量。
资料来源:杨春伟,基于表 1 的回归图(图 2)
这里,我们可以看到最佳拟合线非常接近我们的假设,方程为 y = 10.2x - 0.6667。R 值,也称为决定系数,也非常接近 1,这意味着我们记录的数据几乎完全符合线性趋势。
在这种情况下,为该模型提供的独立变量是商店 A 的运营月数——实际上是时间。这个自变量(因)影响因变量——卖出的苹果总数(果)。每当 x 发生变化, y 也随之变化,这就是这里的因果关系。
然而,我们必须警惕这么快就下结论。需要注意的是,通常这种模型仅仅显示相关性和 非因果关系。
数据不足
相关性与因果性
在统计学中,有一句名言:“相关性并不意味着因果关系”。它指的是无法仅仅根据观察到的两个变量之间的关联或相关性来合理地推断出它们之间的因果关系。
想象一下,有数据显示,每当冰淇淋销量增加,就有更多的孩子出生在这个世界上。这种相关性可能会引起一些人的惊讶,但简单地将这两者联系起来作为因果关系是很不公平的。
与任何形式的建模一样,存在确认偏差的危险和不完善信息的负担。这就是为什么科学家和数学家在选择正确的数据时要小心谨慎,以确保他们的模型是可靠的。
对病毒理解的局限性
对于任何模型,总要做出某些假设。当我今天写这篇文章的时候,我们仍然相信再感染的可能性接近于零。如果这个假设不成立,将会对我们的模型产生更大的影响,使现有的模型变得不准确。
预测疫情
对于这样复杂的情况,自变量肯定不止一个。除了时间和空间,人们可能会关注其他变量,如人口密度、互动概率等。我们的预测目标也因人而异。一些人可能想知道病毒可能会在哪里传播,而另一些人可能只是关心它传播的速度。
基于爆发分析的模型
在新闻中,我们最常看到的话题是:
“病例数什么时候会达到峰值?”
“什么时候结束?”
“随着时间的推移,它扩散了多少?”
因此,数学模型通常显示相对于时间的病例总数。在传播的早期阶段,我们通常看到的是这种具有指数增长特征的曲线,就像意大利的情况一样:
资料来源:杨春伟,数据摘自https://www.worldometers.info/coronavirus/country/italy/
然而,由于一个非常实际的原因,在现实生活中真正的指数增长是不可能的。存在一个理论终点,即所有人群成员都被感染的情况。随着越来越多的人被感染,考虑到固定人口的限制,他们可以传播的人数会减少。因此,冠状病毒减少的速率并因此不符合指数增长的条件。
最终,当感染人数达到人口极限时,或者当疾病开始得到控制时,如中国的情况,病例总数将达到峰值并趋于平稳。
资料来源:杨春伟,数据摘自 https://www.worldometers.info/coronavirus/country/china/
乐观地说,我们会希望尽快到达拐点。这就是病例数增长率开始放缓的地方,缓和曲线,使其“变平”。
基于现有病例数量来推断数据的数学模型仅仅是作为一种估计来衡量问题将变得有多严重。这远远不是最准确的模型,任何准确的预测模型都不可能建立在大约两个月的数据上。
基于非结构化数据的模型
最近,一家加拿大人工智能公司 BlueDot 因比其他人更早预测疾病爆发而成为新闻焦点。它的独特之处在于,它接受各种语言的新故事、航班信息以及更多数据。只有人工智能能够获取这种非结构化的信息,并使之有意义。
AI 的力量在于合成的力量。与人类相比,计算机在记忆和处理大量信息的能力方面都要优越得多。
虽然我们可以理解人工智能提供的结论,但这个过程对人们来说通常是一个黑箱。这有时可能是人工智能的一个不良副作用,因为理解导致某种结论的思维过程和推理是至关重要的。如果不是,我们只是盲目的追随者,与让算命师决定命运的人没有什么不同。
好的人工智能系统允许你对它的预测做出自己的判断。
结束
随着技术的出现,我们有幸拥有更多的工具来利用和补充我们的决策。然而,我们不应该完全依赖模型来代表我们做出判断。技术应该补充我们,而不是取代我们。
保持安全,保持健康,让我们都尽自己的一份力量来阻止疾病的传播。
可以在机器学习大会上发表论文吗?
原文:https://towardsdatascience.com/can-you-publish-a-paper-at-machine-learning-conference-656053f8f312?source=collection_archive---------25-----------------------
在没有公司或大学隶属关系的情况下,有可能在机器学习会议上发表研究论文吗?
塞缪尔·佩雷拉在 Unsplash 上拍摄的照片
一位 Redditor 最近问是否有可能在顶级机器学习会议上发表不隶属于公司或大学的论文?原发帖人(OP)想发表一篇科学论文,但不知道是否可能。
原 Reddit 讨论
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
没有隶属关系可以发表吗?
另一位 Redditor 证实这是可能的,并分享了他的个人经历。他的论文“在序列长度上并行化线性递归神经网络”被提交给 NeurIPs 2017(世界顶级 ML 会议之一),但被拒绝,因为审稿人声称实验太弱。
Nik Shuliahin 在 Unsplash 上拍摄的照片
他和他的同事随后致力于改进实验,论文被发送到 ICLR 2018(一个非常受人尊敬的 ML 会议)并被接受。
由于工作职责,他不得不非常努力地工作,并且经常在晚上完成研究。理论和编码很有趣,但是实验很乏味。
虽然我很高兴有这样的经历,但我不会再做了,除非这是一份全职工作,我可以把主要时间花在研究上。
如何提出一个研究想法
由absolute vision在 Unsplash 上拍摄的照片
当被问及如何产生这一研究想法时,他说他是一名数据科学家,并意识到他正在实施的一个工作项目可以与之前关于并行化(并行扫描算法)的研究相结合,做出新颖的研究贡献。
他最大的遗憾是,如果他有更多的时间花在这个项目上,与同事讨论想法,促进工作,他可能会产生更大的研究影响。
独立出版商
弗兰克·麦肯纳在 Unsplash 上拍摄的照片
Andreas Madsen 和 Alexia joliceour-Martine au 是独立出版商。你看不到很多独立出版商的原因是,通常情况下,喜欢出版的人会被那些能给他们提供最佳出版平台的机构所吸引。这些机构提供研究所需的计算资源和财政支持(因为如果一篇论文被接受,大多数 ML 会议会收取发表费;期刊更贵)。
另一个例子是单个研究人员的论文“深度神经网络的细粒度优化”,没有隶属关系。有关联的研究人员经常与独立的研究人员合作。他们说,这在玩游戏的人工智能中尤为明显,在那里,研究人员将与制作视频游戏引擎的独立爱好者合作。
不同意见
照片由吴伟成在 Unsplash 上拍摄
另一位 Redditor 说他从未见过它——不是因为它不被允许,而是因为没有好的顾问、合作者或培训的人将无法进行有影响力的研究。
另一种观点认为,人工智能极其简单,独立研究人员可以产生重大影响,但会议过于豪华,因此会拒绝不符合正规学术写作的论文。你经常会被拒绝,不是因为你的想法不好,而是因为你的写作方式不适合会议。
结论
庞余浩在 Unsplash 上拍照
这次讨论的共识是,不限制独立研究者在顶级会议上发表论文。然而,这并不常见。不常见的原因似乎是隶属于一个研究机构提供了一些优势,如合作、监督、培训、时间、计算机硬件和资金,而这些是独立研究人员可能缺乏的。然而,在顶级会议上有足够多的独立研究的例子表明,只要有足够的决心和正确的方法,这是可能的。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。
由考特尼·海杰在 Unsplash 拍摄的照片
你能移除 99%的神经网络而不损失准确性吗?
原文:https://towardsdatascience.com/can-you-remove-99-of-a-neural-network-without-losing-accuracy-915b1fab873b?source=collection_archive---------14-----------------------
权重剪枝简介
即使是最常见的神经网络架构也有许多参数。ResNet50 是一种常用的基线模型,拥有约 2500 万个。这意味着在训练期间,我们在 2500 万维的参数空间中执行搜索。
为了客观地看待这个数字,让我们来看看这个空间中的一个立方体。一个 n 维立方体有 2ⁿ顶点,所以在 2500 万维中,我们谈论的是 2 个⁵⁰⁰⁰⁰⁰⁰点。在搜索网格中,这只是一个元素。相比之下,可观测宇宙中的原子数量估计在 10⁸左右。可以肯定地说,这个问题的严重性是我们人类无法理解的。
因此,减少参数的数量有几个好处。稀疏网络不仅更小,而且训练和使用更快。在硬件有限的地方,比如嵌入式设备或智能手机,速度和大小可以决定一个模式的成败。此外,更复杂的模型更容易过度拟合。因此,限制搜索空间也是一种正则化。
然而,这并不是一项简单的任务,因为减少模型的容量也会导致准确性的损失。因此,复杂性和性能之间存在微妙的平衡。在本帖中,我们将深入探讨挑战和潜在的解决方案。
权重修剪
首先,最简单的问题是在训练后,减少模型参数。这对训练本身没有帮助,但会减少推理的计算需求。
消除权重的过程被称为修剪。(从现在起,我将使用可互换的权重和参数。)它的起源可以追溯到 Yann LeCun、John S. Denker 和 Sara A. Solla 的著名论文 最优脑损伤 。(如果知道更早的参考,欢迎留言评论!)
他们提出了以下迭代修剪方法。
- 训练模型。
- 估计每个权重的显著性,这由扰动权重时损失函数的变化来定义。变化越小,重量对训练的影响越小。
- 移除显著性最低的权重。(也就是说,将它们的值设置为零,并在余下的过程中保持不变。)
- 转到步骤 1。并重新训练修剪后的模型。
继续训练与修剪重量是必要的。作者观察到,如果没有它,当大部分重量被移除时,目标函数(也称为损失)会显著增加。
来源: 最佳大脑损伤 作者:扬·勒昆、约翰·s·登克和萨拉·a·索拉
当修剪后的网络被重新训练时,这种方法出现了一个特殊的挑战。事实证明,由于其能力下降,再培训更加困难。这个问题的解决方案是后来才出现的,还有所谓的彩票假说,把这个问题放到了一个完全不同的角度。
彩票假说
赢得彩票头奖的机会很小。例如,如果你在玩强力球,你每张彩票有 292,201,338 分之一的胜算。如果你购买了 n 张票,你的机会有多大?所以,如果赢的概率是
那么不赢的概率是
当我们购买 n 张票时,张票都没中 s 的概率是
由此得出结论,他们中至少有一个人赢的概率是
如果 n 很大,这个可以任意接近 1。
[## 概率的数学基础
测度论导论
towardsdatascience.com](/the-mathematical-foundations-of-probability-beb8d8426651)
这和神经网络有什么关系?在训练之前,模型的权重被随机初始化。会不会碰巧有一个随机初始化的网络的子网“中了初始化彩票”?在他们的工作中,乔纳森·弗兰克尔和迈克尔·卡宾陈述了 彩票假说 :
一个随机初始化的密集神经网络包含一个子网络,该子网络被初始化为当被隔离训练时,它可以在最多相同次数的迭代训练后匹配原始网络的测试精度。
最重要的问题是用最多相同数量的训练步骤实现与整个网络相同的精度。正如我们之前看到的,这是修剪的最大挑战:由于建模能力下降,训练较小的网络可能更加困难。
我们如何找到这样的初始化彩票中奖者?他们真的存在吗?作者已经找到了一种在某些架构中一致识别这种子网的方法。他们的方法如下。
- 随机初始化一个神经网络。
- 为 n 个训练步骤训练网络。
- 移除最低重量的 k% 。
- 将剩余权重重置为随机初始化期间的值。
- 转到步骤 2。并且迭代训练和修剪。
与以前的方法相比,这里有两个关键步骤。首先,简单地根据它们的大小去除权重。第二,修剪后的网络的权重不重新初始化,而是重置到第一次初始化后的状态。这已经被证明是必要的:当超过 80%的权重被移除时,被修剪的网络的随机重新初始化导致显著更差的结果。
乔纳森·弗兰克尔和迈克尔·卡宾修剪方法的性能。来源:彩票假说:寻找稀疏的、可训练的神经网络,作者乔纳森·弗兰克尔和迈克尔·卡宾
然而,这种方法有很大的局限性。首先,它不能很好地处理大规模的问题和架构。在最初的论文中,作者指出,对于更复杂的数据集(如 ImageNet)和更深层次的架构(如 ResNet),该方法无法识别初始化抽奖的赢家。
一般来说,实现良好的稀疏性-准确性权衡是一个困难的问题。这是一个非常活跃的研究领域,并且技术水平在不断提高。
尽管这种方法是一个巨大的改进,但它并没有解决一个重要的问题:修剪后的子网仍然需要重新训练。令人惊讶的是,这是通过颠倒整个问题来解决的。
重量不可知的神经网络
到目前为止,我们已经从一个大的神经网络开始,反复地修剪它来压缩它。然而,有一种与逻辑相反的替代方法:我们可以从最小的架构开始,然后逐步增加。
这是亚当·盖尔和大卫·哈在他们最近的论文重量不可知神经网络中的出发点。除了获得最小的网络,他们还有一个更雄心勃勃的目标:最终的架构应该在随机权重下表现良好。如果你还记得的话,权重剪枝方法最大的缺点是产生的子网很难训练。这样,就不需要培训了。
本质上,他们的方法是在可能的架构空间中的进化搜索。与以前的方法相比,他们的搜索更喜欢简单和重量不可知的属性。
- 创建一组最小的神经网络架构,这些架构可以嵌入到单个父架构中。此时没有权重值,只有连接。基本上,每个网络都相当于对父架构的特定修剪。
- 用多组共享权重测试网络。共享权重是必不可少的,因为这迫使搜索更倾向于权重不可知的架构。
- 根据网络的性能和复杂性对网络进行排序。因为权重在网络之间共享,所以性能也反映了权重不可知的能力。
- 通过选择排名靠前的网络并随机修改它们来创建新网络。
- 获取获得的网络,并转到步骤 2。
作者在下图中总结了这一过程。
来源:亚当·盖尔和大卫·哈的重量不可知神经网络
这样,他们就能够找到在随机权重下表现良好的架构。这是一个相当令人印象深刻的结果。
该方法适用于多种机器学习任务,而不仅仅是手写数字识别。他们能够为几个连续的控制问题设计最小的重量不可知的架构,例如杆平衡和赛车。
来源: 权重不可知神经网络 作者:亚当·盖尔和大卫·哈
到目前为止,这种方法让我们最接近于找到不需要培训的最小架构。然而,还有许多事情要做。对于更复杂的任务,如 ImageNet 分类,找到精确的权重不可知网络仍然是未解决的问题。
令人兴奋的新发展
就在我写这篇文章的时候,一篇新的论文出现了,并声称实现了理论上的最大压缩——无需查看数据!在田畑秀则·田中等人的论文 中,通过迭代保存突触流 在没有任何数据的情况下修剪神经网络,他们的算法 SynFlow 能够处理那些以前的方法无法处理的复杂任务。我非常期待了解更多这方面的知识,并深入研究这篇论文!
实践中的修剪
到目前为止,我们只讨论了修剪的理论方面。最后,我想收集一些你可以马上开始使用的工具。
如果你是一个 TensorFlow 用户,有几个内置的模型优化工具,包括剪枝。
* [## TensorFlow 模型优化工具包简介
我们很高兴在 TensorFlow 中推出一个新的优化工具包:一套技术,开发者,无论是…
medium.com](https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3) [## TensorFlow 模型优化工具包—修剪 API
自从我们引入了模型优化工具包——一套开发人员,无论是新手还是高级开发人员…
medium.com](https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-pruning-api-42cac9157a6a)
类似地, PyTorch 也有类似的功能。你可以在这里找到他们关于权重修剪的教程,但是我也写了一个关于这个和其他可用工具如模型量化的快速总结。
[## 5 个高级 PyTorch 工具提升您的工作流程
从开发到生产
towardsdatascience.com](/5-advanced-pytorch-tools-to-level-up-your-workflow-d0bcf0603ad5)
摘要
机器学习不会停留在训练精确的模型上。在部署到生产环境时,速度和大小非常重要。为了使复杂的体系结构适应生产约束,可以通过削减某些权重来减小模型的大小。(还有很多其他的方法,我们没有讲过。)
这不是一项简单的任务,因为必须考虑精度损失。此外,较小的架构需要重新培训,由于建模能力下降,这可能会更加困难。这里,我们回顾了两种权重修剪方法和一种互补的架构搜索方法,它们逐步解决了这些挑战。
然而,这只是冰山一角。权重剪枝是一个活跃的研究领域,特别是对于更复杂的任务,如大规模图像识别。(想想 ImageNet 大小。)
现代深度学习框架(如 TensorFlow 和 PyTorch)中提供了修剪方法,因此您可以在工作中立即开始尝试这些方法,甚至可以尝试推动艺术的发展。因此,如果您发现这个主题很有趣,请将这些令人惊叹的方法付诸实践:)
参考
[1] 最佳大脑损伤 作者扬·勒昆、约翰·s·登克和萨拉·a·索拉
[2] 彩票假说:寻找稀疏的、可训练的神经网络 作者乔纳森·弗兰克尔和迈克尔·卡宾
[3] 权重不可知的神经网络 由 Adam Gaier 和 David Ha
[4] 通过迭代保存突触流来修剪无任何数据的神经网络田畑秀则·田中、丹尼尔·库宁、丹尼尔·l·k·亚明斯和苏亚甘古利
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!*
你能教计算机像斯蒂芬·金那样写作吗?
原文:https://towardsdatascience.com/can-you-teach-a-computer-to-write-like-stephen-king-3bdec697723?source=collection_archive---------36-----------------------
在 NLP 的深度学习的帮助下
照片由思想目录在 Unsplash 上拍摄
你是否曾经想写一个引人入胜的故事,但缺乏合适的技巧?也许让计算机为你做艰苦的工作。
在这篇文章中,我将在深度学习的帮助下教你如何教计算机像斯蒂芬·金一样写故事。数据集由斯蒂芬·金的五篇短篇小说组成。
- 草莓春天
- 大夜班
- 房间里的女人
- 我是门道
- 战场
我将使用专门用于自然语言处理的递归神经网络,并将 Python 作为编程语言。
1.导入所有必需的库
2.导入数据
文本文件包含上面提到的五个故事。另外,请注意,我降低了所有单词的大小写,以减少词汇量。
3.创造词汇
这里的第一行将创建所有独特字符的词汇表。由于神经网络只理解数值,我们必须将每个字符映射到一个整数。第二行和第三行创建一个字典,将每个字符映射到一个整数。
4.创建序列和目标
这里我们将创建 100 个字符长度的序列,预测下一个 101 个字符。
5.编码序列和目标
如前所述,神经网络只能理解数值,我们必须对序列和目标进行编码。
6.构建模型
有人可能认为 RNN 的实现非常复杂,但是在 Keras 的帮助下,实现起来非常简单。该模型基本上由以下 4 层组成:
1。嵌入:嵌入层将高维空间的向量变换到低维空间。在某种程度上,意思相似的词也有相似的价值。
2。LSTM: 长短期记忆(LSTM)是一种递归神经网络。它们能够学习序列预测问题中的顺序依赖性。
3。辍学:辍学有助于防止过度适应。
4。密集:这是发生预测的输出层。Softmax 函数用于输出每个字符的概率值。
7.训练网络
使用拟合函数,我们可以训练我们的网络。我把批量大小定为 64,训练了 40 个纪元。
8.预测
函数sample()
将从输出概率数组中抽取一个索引。参数temperature
定义了函数在创建文本时的自由度。
种子句子用于预测下一个字符。然后,我们可以简单地用预测的字符更新种子句子,并修剪第一个字符以保持序列长度不变。
9.结果
生成的段落:
Input: people clustered in small groups that had a tendency to break up and re-form with surprising speed.Output: people clustered in small groups that had a tendency to break up and re-form with surprising speed. looking out to be an undergrad named donald morris work and i passed all the look and looked at him. he was supposed to stay wiping across the water,
but they were working and shittered back of its an
appla night. the corpse in the grinder, expecting the crap outs.the counted in the second. jagged sallow sound over the way back on the way — at least aloud.'i suspect there,’ hall said softly. he was supposed to be our life counting fingers.
生成的文本看起来可读性很强。虽然它没有意义,有些句子语法不正确,有些单词拼写错误,但它使用了正确的标点符号,如每句话后的句号和引用一个人时的引号。
结论
我承认生成的文本与斯蒂芬·金的写法相去甚远。但是看到最近在深度学习和自然语言处理方面的进展,我满怀希望。也许几年后,电脑会成为比人更好的作家。
此外,如果你想了解更多关于循环神经网络的内容,安德烈·卡帕西有一个很棒的博客。
我们的模型的性能可以通过使用更大的训练数据和修补超参数来提高。
请随意使用代码。完整的项目可以在 Github 中找到。
谢谢大家!
感谢您的阅读,祝您有美好的一天。😃
能说说你的数据故事吗?
原文:https://towardsdatascience.com/can-you-tell-your-data-story-154417a33efb?source=collection_archive---------36-----------------------
改进数据科学项目的简单方法。
帕特里克·托马索在 Unsplash 上的照片
“每周,在用新的日期更新后,我都会运行这段代码。我用历史数据进行编译,根据 SOP 进行分解,然后上传到仪表板模板中。一旦我检查了错误,我会提醒发行列表更新已经完成”
我坐在那里听着——一半震惊,但另一半却喜形于色,因为我看到一个如此简单的解决方案摆在我面前。
这是我们的一位初级数据科学家对一个项目的描述,实际上是每周更新,他为我们组织中更大的数据团队工作。
我立刻明白,他不知道自己为什么要做这项工作,也不知道这项工作如何适应我们组织的整体需求。
当我环顾房间里点头的人时,我也清楚地看到,其他人没有看到他的陈述中有多么明显地缺乏这一点。
数据故事的重要性
在我们的组织中,数据科学是一项辅助职能,而不是主要产出。我们有几个不同的团队和个人被分配到组织的不同部分。每个人都根据他们所负责的部分的需求提供数据支持。这通常意味着他们正在做别人不知道的项目,或者可能永远看不到最终结果。
我最近想到,我们需要创建一个定期论坛,让我们的数据科学家可以分享和讨论他们的项目,以便更广泛地理解,交流想法和最佳实践,并在合作有意义的地方共享资源。
我们重新安排了一次每周例会,每周协调一次 15 分钟的演示。第一对夫妇很难确保演示者不只是向已经了解项目所有情况的领导层提供最新信息——我们必须非常明确地表明,观众是同事和同事。
然而,当我听到我们的初级团队成员将他的项目描述为他理解它时,我知道对他和团队的其他成员来说,这是一个指导的时刻——对作为团队领导的我来说也是如此。
简报者是我们最热情的团队成员之一。他总是志愿参加新项目,推荐新技术,利用私人时间上课和培训。我确信他会成长为我们的明星球员之一。
他描述的项目大部分是在完成后交给他的,但他也参与了设计和实现。然而,他显然是从一个非常狭隘的角度来看待这个项目的——实际上只是他每周采取的一系列行动,而不是使项目成为必要的组织需求、项目的用户以及组织的成果。
对于领导者来说,他们每天都被迫对工作有一个非常广阔的视野,这可能太容易忘记初级团队成员经常把大部分时间花在个人任务上,他们很容易忽略项目的“为什么”。
然而,我认为数据科学家必须保持这种观点。我相信,当数据科学家能够讲述数据项目的整个故事时,个人和组织都会受益。
我在新项目中也看到了这种情况。一个数据请求将来自组织的另一个部门,分配给它的分析师关注请求中的关键词,并立即进入数据库表。有时他们完全理解请求,但通常他们只是认为他们理解了被请求的内容。
作为一名领导者,我与数据科学家就一个项目进行了几次交谈,很明显,他们认为他们完全理解了请求,但我用几个恰当的问题打消了这种想法。
这让我对我们的数据科学家实施了一条明确的规则:如果你不能把这个项目的整个故事告诉你的祖母(用橡皮鸭、宠物等代替。),那你还不准备卷起袖子开始编程。
能够向组织之外的人讲述这个故事的意义在于,它迫使你了解如何收集数据的背景,项目将如何产生预期的结果,以及为什么这些结果对组织很重要。
通常,这种对话会迫使您检查假设并向最终用户澄清。如果做得好,结果往往会与最初想象的大相径庭。
例如,最终用户并不总是知道要求什么或者如何要求。此外,我们的数据科学家经常根据错误的数据输入或特定数据字段做出假设。最后,它有助于澄清是否需要某个特定的流程,或者是否可以通过资源较少的方法来满足需求。
任何从头到尾参与过数据科学项目的人都知道,有许多方法可以完成相同的任务。此外,在整个项目中需要做出许多决策。如果你不完全了解你在做什么,为什么要做,你就不可能以最好的方式做出决定。
我坚信,为了对项目进行故障诊断并为最终用户进行设计,您必须了解最终用户的需求。
了解您的数据故事
确保您或团队实际了解和理解数据故事的几个关键目标:
- 背诵故事;最好是团队领导和最终用户/请求者。这很简单,应该不会花很多时间。就像积极倾听一样,你应该能够解释数据故事,并以检查假设和澄清需求的方式向他人提问。
- 在你记下基本故事后,展开未来的故事。例如,你还应该能够解释一个成功的项目会带来哪些可能的变化和改进。这确保您不仅知道项目的需求,还知道最终用户可以获得的未来成果。
- 查故事人物的传记。对于许多数据科学家来说,这是一个重要的问题:你对数据输入的了解和理解程度如何?检查您对您认为将用于项目的数据的假设。他们是从你认为的地方来的吗?它们代表你所相信的吗?它们是由用户输入、检查或验证的吗?是否有替代的数据来源?
- 帮助最终用户讲述故事。最后,项目一旦完成,不要只是将其投入生产或送回给请求者。这两种方式都应该有一个持续的伙伴关系,以确保数据的故事是正确的。最终用户是否完全理解数据的来源、它们代表什么和不代表什么,以及在做出任何结论和建议时需要记住的重要假设和限制?
你的脸型能应付新冠肺炎流行的面具吗?
原文:https://towardsdatascience.com/can-your-face-model-handle-masks-prevalent-due-to-covid-19-9f3fff1bf7cb?source=collection_archive---------63-----------------------
探索面具人脸检测
昨天,我和一个朋友谈论开发一个可以检测人脸面具的模型。基于她给我的一些见解,我开始寻找带有面具的数据集。但是我突然想到了一个问题!
我们需要更新所有的人脸模型来适应戴着面具的人脸检测吗?
我很想找到答案,并真诚地期待我以前的模型可能会失败。让我们看看我在研究中发现了什么。
iPhone Face ID
哈帕尔·辛格在 Unsplash 上的照片
如果你有一部最新的 iphone,它有 Face ID 检测系统来解锁你的手机,你会像我一样戴着面具遇到麻烦。因为脸部的大部分被覆盖,所以系统无法破译确切的脸部,因此无法解锁设备。
我试着出去散步,不得不记录时间,下一首要播放的歌曲和要采取的步骤。我必须不断解锁我的设备来检查这些数据。这变得非常烦人,因为我总是戴着面具,它需要额外的 5-10 秒来询问密码,而不是 Face ID,然后让我输入密码。
苹果最近发布了新的 iOS 版本 13.5,该版本可以检测带面具的人脸,并直接提示密码选项,这非常简单,也节省了时间。虽然这很棒,但原来的系统还是坏了,因为我不能再用 Face ID 和我的面具了。可以理解的是,它不能只依赖于半张脸,但这只是我们希望避免的额外开销。
安全永远是赢家!
人脸检测模型
虽然像 Face ID 这样的系统不能损害安全性,但其他只检测人脸而不用于安全的模型呢?一种可能的情况是计算一次聚会中的人数(面孔),以粗略估计到场的人数。
为了测试这一点,我决定使用我以前用于检测面部的模型。代码如下:
[## kb22/使用 OpenCV 的人脸检测
使用 OpenCV 的内置模型进行人脸检测。OpenCV 提供了一个非常精确的内置人脸检测模型。在这个…
github.com](https://github.com/kb22/Face-Detection-using-OpenCV)
老实说,我预计这个模型也可能会失败,因为大部分被面具覆盖的脸并不像一张脸。此外,该模型不是在带有面具的人脸上训练的。
然而,结果令人惊讶。
该模型能够准确地检测到人脸,即使他们戴着面具,并且有很高的可信度。
我能想到这个模型成功的两个原因:
- 首先,该模型分析像素值的变化来检测人脸。即使打开了蒙版,背景和面部之间的像素值强度变化也很明显。
- 即使当面具在脸上时,脸的一般结构仍然是相同的,因此,模型可能能够识别脸。
下面是我测试的几张图片。所有图片均取自https://unsplash.com/
还要注意,面部检测器文件需要一个 PNG 文件,所以我必须更新代码,使其接受 JPG 文件。
没有面具的图像
请注意,该模型在没有面具的人脸上表现得非常好。所有图像的置信度值都高于 90%。
带面罩的图像
我们注意到该模型仍然正确地识别人脸,并且在大多数情况下,置信度也相当高(无论如何都不是 100%)。
结论
与我最初的预期相反,并不是所有的模型都需要更新。我们需要仔细识别当前使用人脸检测模型的所有用例,这些用例可能需要重新训练。
我们注意到,人脸检测模型可能需要更新,以适应新冠肺炎引入的新趋势,即外出或聚会时频繁使用口罩。
我希望你喜欢这个。如果你有任何问题,想法或建议,请留下评论,让我知道。你也可以通过 LinkedIn 联系我:【https://www.linkedin.com/in/bhanotkaran22/
视频如何被用来检测你的性格?
原文:https://towardsdatascience.com/can-your-video-be-used-to-detect-your-personality-d8423f6d3cb3?source=collection_archive---------19-----------------------
腾雅特在 Unsplash 上拍摄的照片
基于 Google Colab 上第一印象挑战的视频,研究一种时间分布的深度双峰方法来预测大 5 人格特质的得分。
视频是新的第一印象!
想想自 2020 年 3 月以来,您参与的视频通话的大致数量。现在,将其与之前您参与的视频通话次数进行比较。我敢肯定,对我们大多数人来说,的差别是巨大的。与家人、朋友和同事的会议已经转变为视频通话。
视频通话还使我们能够不断扩大我们的网络,结识新朋友,同时保持社交距离。因此,可以这么说,我们对视频产生了相当多的个人和专业的第一印象。通过第一印象获得的个性感知可能相当主观,甚至会导致第一印象偏差。当然,也有自我报告的性格评估测试,但它们往往会受到社会期望偏差的影响。这给了我们一个机会来利用人工智能找到一种更客观的方法来分析表观性格。
记住这一点,这篇博客的目的是展示一种这样的深度学习方法,它使用视频来预测五大人格特质的分数。
由作者创建
大五人格特质是什么?
大多数当代心理学家认为,人格有 5 个核心维度:外向、随和、开放、尽责和神经质;通常简称为海洋。不同于许多以前的同行相信人格特质的二元性,大五人格特质理论断言每个人格特质都是一个谱。
让我们看看每种特质是如何被描述的,然后是一些受欢迎的虚构人物在五大人格特质上的得分图……
由作者使用其维基个人资料中的角色图像创建
大五人格特质理论的一个有趣的方面是,这些特质是独立的,但不是相互排斥的。例如,我们可以在上面的图像中看到,谢尔顿·库珀(《生活大爆炸》)在外向性方面得分较低,但在神经质方面得分较高,菲比·布菲(《老友记》)在尽责性方面得分较低,但在开放性方面得分较高,等等…
关于数据集
第一印象挑战赛提供了来自 3k 个 YouTube 视频的 10k 个片段的数据集。这项挑战的目的是了解如何使用深度学习方法从受试者在摄像机前说话的视频中推断出明显的性格特征。
训练集由 6k 个视频组成。验证集和测试集各有 2k 视频。视频的平均时长为 15 秒。每个视频的基本事实标签由五个分数组成,代表五大人格特质中每一个的表现。这些分数在 0 到 1 之间。标签是由亚马逊土耳其工人完成的。关于挑战和数据集的更多信息可以在这篇论文中找到。
视频数据是非结构化的,但是具有丰富的多媒体特征。这篇博文中解释的方法使用了视频中的音频和视觉特征。分析和建模在 Google Colab 上完成。代码可以在 Github 上访问。
基本事实标签的分布
由作者创建
左边的图表显示了训练数据集中个性分数的分布。有趣的是,分数的分布非常相似,甚至沿平均值对称。这种对称的原因可能是分数不是自我报告的。由于社会期望偏差,自我报告的个性评估分数通常是有偏差的。
提取视觉特征
视频由图像帧组成。这些帧是使用 OpenCV 从视频中提取的。在表观人格分析中,视觉特征包括面部暗示、手的运动、人的姿势等。由于数据集由平均持续时间为 15 秒的视频组成,因此从每个视频中提取了 15 个随机帧。然后将每个提取的帧的大小调整为 150×150,并按 1/255 的因子缩放。
由作者使用第一印象挑战赛的视频创建
提取音频特征
使用 ffmpeg 子过程从每个视频中提取音频波形。开源工具包 pyAudioAnalysis 用于从 15 个不重叠的帧中提取音频特征(保持帧步长等于音频分析子过程中的帧长度)。这些包括 34 个特征以及它们的 delta 特征。输出是每个帧的 1×68 维向量或 15 个音频帧的 15×68 维张量。
通过 pyAudioAnalysis 提取的特征类型包括过零率、色度向量、色度偏差、MFCCs、能量、能量熵、频谱质心、频谱扩展、频谱熵、频谱通量和频谱滚降。
深度双峰回归模型
以 Tensorflow 为后端的 Keras 功能 API 用于定义模型。该模型分两个阶段定义。在第一阶段,提取图像和音频特征,然后处理视频的序列特征。为了处理音频和视频特征,在第一阶段采用双模态时间分布方法。
Keras 有一个时间分布图层,可用于将同一图层单独应用于多个输入,从而实现“多对多”映射。简而言之,时间分布包装器允许任何图层分别从每个帧或时间步长中提取要素。结果:输入和输出中的附加时间维度,代表时间步长的索引。
通过 pyAudioAnalysis 提取的音频特征在时间分布包装器中通过具有 32 个单元的密集层。因此,相同的密集层被应用于每个音频帧的 1×68 维向量。类似地,每个图像帧以并行方式通过一系列卷积块。
由作者创建
在这一步之后,音频和视觉模型被连接起来。为了处理视频的时间顺序或时间方面,连接的输出被进一步传递到具有 0.2 的丢失率和重复丢失率的堆叠 LSTM 模型。堆叠 LSTM 的输出被传递到具有 0.5 的 ReLU 激活和丢失率的密集层。最终的致密层有 5 个输出单元(每个人格特征一个),以及 sigmoid 激活,以获得 0 到 1 之间的预测分数。
发电机功能
最大的挑战是管理有限的内存资源。这是使用小批量梯度下降完成的。为了实现它,自定义生成器函数定义如下:
注:生成器功能在一个列表中生成音频和视觉模型的输入。与此相对应,通过将两个输入的列表传递给 keras 的模型类来定义模型:
model = Model([input_img,input_aud],output)
结果
该模型使用 Adam 优化器编译,学习率为 0.00001。该模型被训练 20 个时期,最小批量为 8。均方误差作为损失函数。定义了一个名为“平均准确度”的自定义指标来查看模型的性能。计算如下:
这里 N 是输入视频的数量。
总的来说,该模型表现得相当好,最终测试平均精度为 0.9047。
由作者创建
下表显示了每种大五人格特质的测试平均准确度。该模型显示了所有 5 种人格特质的相似表现。
由作者创建
前方的路…
根据处理能力的可用性,通过增加帧的大小和长度,可以进一步改进模型的结果。视频转录的 NLP 分析也可以用于获得附加特征。
虽然自动表观人格分析有重要的用例,但应该确保算法偏差不会影响结果。这种人工智能应用的目的是提供一种更客观的方法。然而,只有在每个阶段(即从数据收集到结果解释)都排除了偏见,这种客观性才能实现。
参考资料:
[1] T .詹纳科普洛斯,pyAudioAnalysis(2015),【https://github.com/tyiannak/pyAudioAnalysis
[2] A .苏布拉马年,v .帕特尔,a .米什拉,p .巴拉苏布拉曼尼安,a .米塔尔,使用时间有序深度音频和随机视觉特征的双模态第一印象识别 (2016)
[3]张春华,张海涛,魏晓伟,吴军,深度双峰回归用于表观人格分析 (2016)
癌症研究人员开发新技术将投资者和他们的钱分开
原文:https://towardsdatascience.com/cancer-researchers-develop-new-technology-for-separating-investors-from-their-money-1ff7a0eb2b69?source=collection_archive---------38-----------------------
贝叶斯先验胜过酷科技
液体活检在癌症筛查中风靡一时。但是筛查——对表面上健康的人进行疾病检测——是癌症诊断中的大白鲸。我预测,在未来十年,它将失去更多的风险投资家,比其他所有 Dx 游戏加起来还要多。但是没关系。将资金从富有但无知的投资者手中重新分配给值得的科学家绝对是一件好事(科学家说)。
流行的鲸鱼吞噬了无数的现金。奥古斯都·伯纳姆·舒特[公共领域]
很少有投资者——也很少有生物学家——理解贝叶斯统计。疾病流行的先验知识表明,看似高效的测试并没有多少预测价值。
让我们走一遍。
假阳性是任何筛查低患病率疾病的测试的祸根。在美国,每年大约有 0.5%的人口被诊断患有癌症。
现在让我们想象一个 99%特异的癌症检测。也就是说,对于每 100 名没有患病的患者,该检测只返回一个假阳性。听起来不错,不是吗?
但事实上这将是可怕的。如果对 1000 名美国人进行癌症筛查,我们预计会有 5 名真正的阳性者(如果该测试 100%敏感,这是一个非常慷慨的假设)。这 5 名患者将受益于更快获得他们需要的护理。但是我们也会得到 10 个假阳性——即使他们是健康的,他们也被告知患有癌症。它们会发生什么?
我们肯定知道他们会害怕。他们将接受更多的测试。但是我们没有任何能排除癌症的测试。没有任何时候可以肯定地告诉他们“你很好,没必要担心”。然后他们将不得不决定是观望,还是接受治疗。等待可能意味着在治疗最有效的时候推迟治疗。但是继续治疗并不是一个容易的选择。癌症治疗既昂贵又有毒,还带有自身的伤害风险——比如增加患癌症的风险。道德上你不能让健康的人接受。
这是癌症筛查的普遍问题。让我们看看癌症筛查中的新热点——基于无细胞 DNA 差异甲基化的液体活检——如何累积。
以下是一些主要结果:
新液体活检试验验证集的 ROC 曲线。自己的工作,数据来自使用无浆细胞 DNA 亚甲基的敏感肿瘤检测和分类
这些是接收器-操作器曲线,之所以这样叫是因为它们被设计用来优化无线电传输中从噪声中过滤信号。它们是评估诊断测试的标准方法。他们设想了灵敏度和特异性之间的权衡(1-假阳性)。完美的测试应该是与左上角的角成直角(100%灵敏度和 0%假阳性)。一个完全无用的测试将遵循对角线。
你会注意到这些图是针对不同的特定癌症,而不是“癌症”。我们将回到这一点。
让我们假设我们希望测试有 80%的灵敏度(这意味着我们愿意接受 20%的癌症会被遗漏)。这听起来不是很好(事实并非如此——大多数 FDA 批准的诊断方法的灵敏度≥95%),但这比其他癌症的血液 DNA 测试要好得多,后者的灵敏度为 50-70%(见这里和这里)。
现在从 y 轴上的 0.8 到它与蓝色 ROC 曲线相交的地方画一条线。向下读取到 x 轴。这是 80%灵敏度下的假阳性率。肺癌的发病率约为 7%,胰腺癌为 20%。
在 0.5%的总癌症发病率下,这意味着每一个真阳性都会有许多假阳性。但由于这些是针对特定癌症的测试,假阳性与真阳性的比率要差得多。
美国人口肺癌诊断发病率约为0.05%/年,胰腺癌0.01%/年。因此,在我们 80%灵敏度的情况下,假阳性与真阳性的比率将在 100 到 2000 之间。
因此,对于每一个得到帮助的病人,至少有一百人会因为这项测试的结果而受到惊吓或伤害。我认为没有人认为这是可以接受的。
作为优秀的 Bayesians 人,我们将把这些结果表达为阳性预测值:测试呈阳性且实际患有该疾病的患者比例。根据敏感性(S)、患病率(P)和假阳性率(FPR,等于 1-特异性),这是:
对于我们的肺癌测试示例,我们得到:
接受测试并获得阳性结果将使我们患病的概率从 0.05%(我们之前的)增加到约 0.6%。这种差异很重要,但毫无用处。没有人会接受基于这些结果的治疗。
实际上比这更糟。这不是一个单一的测试,而是一组测试,每个测试都有自己独立的假阳性率。如果我们测试 10 种最常见的癌症,平均假阳性率为 1%(比目前的表现好得多),那么整整 10%的患者将至少有一种癌症的测试呈阳性。真是一场灾难。
我不想在这里谈论科学。看起来很有前景,我相信技术会越来越好。但是我想让你们了解这个问题有多难。任何一种测试技术都不太可能胜任这项任务。也许这种观察 DNA 甲基化模式的方法可以与 CancerSEEK 测试(性能更好)结合起来,开始使筛查高危人群变得可行。
我希望那会发生。我确信这不会很快发生。与此同时,我希望没有 TDS 的读者被液体活检的炒作所迷惑。
2020 年 1 月 6 日更新:一个中国小组已经发表了一篇文章1 月 4 日描述了一种类似的方法,在结直肠癌检测方面有更好的结果。在验证队列中,它们的敏感性和特异性分别为 90%和 87%。令人印象深刻。在筛查高风险人群(结肠直肠癌和癌前病变的患病率为 7.1%)时,计算出的 PPV 为 35%。这个数字高得足以证明干预是正当的。但美国的结直肠癌年发病率为 0.04%。对人群的筛查将导致 0.3%的 PPV。对公众实施这项测试弊大于利。
显而易见的结论是,像这样的测试必须与其他风险因素相结合才有用。使用似然比是做到这一点的最佳方式,也将是未来文章的主题。
候选人应该为带回家的编码作业得到报酬
原文:https://towardsdatascience.com/candidates-should-be-paid-for-take-home-coding-assignments-36967b51a32c?source=collection_archive---------42-----------------------
意见
数据科学和软件工程中的编码任务是不可避免的,但是我们可以改进这个过程
照片由 Pexels 的 bongkarn thanyakij 拍摄
免责声明:这是一篇观点文章。我很想在评论中听到你的反驳和想法。
我通过了新工作的第一轮面试。
然后收到了可怕的电子邮件。
“招聘过程的这个阶段是一个带回家的编码挑战。这将需要你 2 到 5 个小时的时间。”
我的周六就这样过去了…
没有人喜欢带回家的作业。但是公司确实需要评估候选人。这些是我提出的改进流程的建议,我已经提出并接受了带回家的挑战。
外派迫使候选人在公司没有投资候选人的情况下投资公司
一个有经验的候选人的 5 个小时价值几百美元。而一个公司花 5 分钟回顾一项任务的成本很低。
我们如何解决这个问题?
不是每个科技公司都有能力补偿所有的受访者。但是他们可以提供“一些东西”作为回报。
我提出两种选择:
- 以标题的形式提供质量反馈,细分任务的哪些部分完成得成功,哪些部分完成得不好。从而帮助候选人提高未来的面试。
- 最小但周到的补偿,例如,一张价值 10 美元的星巴克礼品卡
候选人和公司之间的权力差异意味着公司最终决定招聘过程。
也就是说,向未被录用的求职者表达一点感激之情,对建立好感大有帮助——如果有公司送我礼品卡,我会告诉我的朋友!
作业评估编码,但忽略工程团队所需的其他技能
与其他工程师一起开发产品需要的不仅仅是代码。
书面交流、表达技巧和商业意识也很重要,但不能通过带回家的作业得到很好的检验。
虽然一般来说,带回家的作业是一个很好的端到端工程技能测试。又名。为了解决问题,候选人能否与堆栈的所有级别一起工作。
在数据科学中,这可能是想象、训练和部署模型。在软件工程中,它可能是设计、构建和部署应用程序。
这是口头面试和算法题无法评价的。带回家的作业能更全面地反映候选人的能力。但是这并不意味着它们是最好的选择。
作业过滤掉不感兴趣的候选人
接到任务时,我的本能反应是忽略它,转而申请其他公司。
在这种情况下,任务成功地淘汰了随意申请的候选人。这是一件好事——公司希望雇佣愿意在那里工作的候选人。
但另一方面,渴望得到一份工作的候选人,以及只是享受编码挑战的候选人可能会完成它。
我的建议是这样的。永远不要把任务交给你不想雇佣的人。不要浪费人们的时间。
公司需要一种评估技术技能的方法
你不能不评估技术能力就雇人。句号。
面试过 100+个候选人,我可以告诉你,过分膨胀的简历是常态。
无论候选人是否拥有 CS 硕士学位或在 Google 工作过,都需要评估编码技能。
尽管有缺点,但带回家的作业是测试这一点的好方法,超过了算法问题所评估的。
鉴于带回家作业的端到端性质,它们尤其适用于需要雇佣多面手开发人员的初创公司。
任务优于白板面试(特别是对于内向的人)
比起带回家的作业,程序员最讨厌的就是白板。
白板是一个比任务更大的时间承诺。假如你休假,去他们的办公室,在白板前站 3 个小时。同时被多个其他开发者关注。
除了时间承诺,白板对于内向的人来说是可怕的,他们可能是超级天才的工程师,但不能在一群人看着他们的时候工作。
出于这个原因,分配可能是评估一些候选人的更公平的方式。
但是迷你实习和自由职业更好
付钱让候选人做真正的工作。
假设他们已经通过了其他面试阶段,让他们作为工程师或数据科学家为你的公司做出贡献。
邀请他们参加产品会议,给他们真正的入场券,让他们编写需要通过评审过程并部署的代码。
这不仅测试特定于公司领域的编码,而且允许公司中的每个人评估它们。这项工作可以在内部或远程完成。
找到这样的项目,并大规模地进行是困难的,但并非不可能。没有更好的方法来评估候选人。
结论
招聘过程中存在问题。候选人和雇主都不会不同意。
缺乏实验,做一直在做的事情会让它一直坏下去。
我们需要一个候选人和雇主都投资于这个过程的系统。这样我们就能创造一个对每个人都有利的招聘环境。
CapPun:一个模仿人类联系来讨论死刑的聊天机器人
原文:https://towardsdatascience.com/cappun-a-chatbot-that-emulates-human-connection-to-debate-capital-punishment-c1aba6549162?source=collection_archive---------44-----------------------
介绍
你好,读者!既然我们已经剖析了 Oxy 课程注册系统的各个方面并且试图将其中的一些重新组合起来,我想我们是时候转移到另一个话题了。
如果设计正确,将会导致人类灭亡的东西听起来如何?
嗯,我想你不能提供任何反馈是件好事,因为…
我和我的团队已经通过构建一个聊天机器人做到了这一点!
现在,你可能很困惑。毕竟,聊天机器人是如何导致人类灭亡的?
你能让我解释一下吗?
简单来说,如果人类能够给计算机编写理解人类语言的程序,那么人类就不需要做任何任务,也不存在了。谢天谢地,走到这一步真的很难做到。这被认为是一个完全人工智能的问题,创造一个理解自然语言而不是处理的程序需要一个像人一样聪明的人工智能。举几个例子来说,这意味着能够进行指称解析(找到文本中指代同一实体的所有表达式),理解句子句法、语义和语用,以及拥有常识、道德和记忆。
尽管聊天机器人旨在满足许多需求,但人类在使用聊天机器人时有一个共同的核心需求:
能够感受到某种联系。
这是因为通过自然语言与技术交流远比用编程语言更自然。通过改善人机交互和设计以人类为中心执行任务的聊天机器人,我们可能会颠倒使用技术时谁做重活的角色,释放人类表达的能力。
为了满足这种需求,我们大幅缩小了名为 CapPun 的聊天机器人的范围,设计它只做一件事:辩论死刑的使用。
在这篇文章中,我将讨论这样一个设计的发展,以及我们如何利用用户反馈在无数次设计迭代中改进它。
我们开始吧。
为什么是死刑?
在日常对话中,一个对话可以有无数种方式。鉴于这一点,以及同一对话可以有数百种不同方式的事实,设计一个可以预测、解释并以有意义的方式做出回应的聊天机器人是非常具有挑战性的。此外,要做到这一点,需要对神经网络有深入的了解,而我们团队中没有人有这方面的经验。
因此,我们没有建立一个能够处理所有这些对话结果的人工智能,而是尽可能限制聊天机器人可以完成的任务范围。这样,我们可以根据对话的路径对 CapPun 的响应进行硬编码。
为了做到这一点,我们需要一个能产生一些预测对话路径的任务。此外,这样的任务必须有足够的情感成分,才能人为地向 CapPun 注入情感。最后,所述任务必须能够完全通过口语来执行,因为机器人不会有任何物理方面。
经过几天的深思熟虑,我们决定开发一个辩论机器人,与用户就一个“热门话题”进行辩论。最后,我们一致认为死刑辩论的双方都很伤感,因此这是合适的讨论话题。
用户+目标
CapPun 是为支持死刑的人设计的。虽然这可能看起来像一个激进的用户群,但我们通过观察发现,这种立场在很大程度上是由情绪驱动的,并且可以根据用户事先是否有创伤性情况而被迅速采纳。
CapPun 的目标之一是让持赞成死刑立场的人了解反对死刑的立场,也许还能增加他们对这个话题的理解。此外,它还旨在推动聊天机器人的约束,看看我们是否可以建立一些用户与之建立联系的东西。
总的来说,项目的设计阶段发生在以下几个阶段:设计+用户测试
接下来,我们来看看这几个阶段!
设计拱门
首次设计+首次用户测试
头脑风暴过程
为了让事情顺利进行,我们决定使用 Justin Li 的聊天机器人的启动代码,该代码提供 Oxy CS 教授的办公时间信息。在这种情况下,对话可以进行的路径被分解成不同的“状态”,或者可以被调用的功能。根据用户对其他状态的响应,或者用户消息中的哪些单词和短语与 CapPun 理解的预定义“标签”匹配,可以“进入”不同的状态。
因为大多数辩论都是由观点/反驳组成的,我们花了大量的时间列出支持死刑的观点,然后将它们映射到各自的反对死刑的反驳中。我们在我们的团队中这样做了,但也有两名精通该主题的学生(大三哲学专业和大三经济学专业)。他们归结为这七个论点:
- 它更便宜
- 这样更人道
- 它阻止人们犯下其他罪行
- 这是以眼还眼
- 如果人们在监狱里度过一生,他们就无法对社会做出贡献
- 他们应该得到最糟糕的命运
- 他们不会像监狱里的人一样改变
与其他对话代理不同,我们决定让 CapPun 最终“结束”对话,以最小化讨论的范围,并减少我们必须预测和考虑的可能状态的数量。在最初的头脑风暴会议中,我们预测辩论要么以同意结束,要么以不同意结束,因此会有两种结束状态。为了减少假阳性或假阴性结局的数量,仅当用户分别同意或不同意 CapPun 的三个点时,才输入这样的结局状态。
根据用户同意/不同意的点数,状态从对点转换
因此,如果当时没有满足这些结束条件,聊天机器人会要求用户提出他们的另一个观点,根据用户同意还是不同意 CapPun 的对位法来调整这样一个响应的情绪。
在用户不同意它的一个论点后,CapPun 如何循环到下一个争论点
如果用户发送一条充满胡言乱语的消息——当用户消息中没有单词或短语与 CapPun 的预定义标签匹配时确定——cap pun 会要求用户发送一条有意义的消息,然后再转移到另一个状态。
用户如何处理无意义的用户输入
对话会以这种方式循环进行。
为了将初始等待状态与这些其他状态联系起来,我们将发送给机器人的初始消息数量减少到三类:死刑是好的、介绍性消息和死刑是坏的。如果用户说死刑是好的,CapPun 会表示不同意,并要求用户给出原因。如果用户给出一个介绍性的信息,CapPun 会问用户为什么他们支持死刑。在这两种情况下,用户都被引导到七种“参数”状态之一。
七个可能的参数状态用户可以在整个辩论过程中访问
然而,如果用户说了一些与死刑不好的想法有关的话,CapPun 会立即进入协议完成状态,并以快乐的方式结束辩论。因为 CapPun 的预期用户群是那些支持死刑的人,所以这种设计特点在给人思想自由的错觉的同时,也尽早将持反死刑信念的人引向“最终状态”。
卡彭如何让反对死刑的人迅速结束对话
太多了!
简而言之,CapPun 最初被设计成通过用户提出的各种赞成死刑的观点进行循环,评估他们在这一过程中同意或不同意 CapPun 的程度。它通过调用被认为是“状态”的函数来实现这一点,这取决于用户给出的文本输入。总的来说,它有一个初始的“等待”状态、一个中间的“胡言乱语”状态、许多“参数主题”状态和两个“结束”状态,如下面的初始流程图所示:
CapPun 的初始迭代是如何工作的
用户测试
为了了解最初的设计是否满足允许用户与机器人连接的核心需求,我们以定性的方式进行了第一轮用户测试,要求用户在告诉他们它做什么任务后与 CapPun 聊天。当他们探索聊天机器人时,我们评估了他们的非语言,并记录了他们的评论。
总的来说,用户感觉到了与 CapPun 的某种联系!然而,许多问题出现了,最大的疑虑归结为两个话题:对话进程和捕捉响应含义。
会话进程
虽然大部分对话从一点过渡到另一点很顺利,但是在每个用户测试中至少有一点 CapPun 扰乱了对话的自然流程。关于“结束”这场辩论,一名大二历史专业的学生觉得卡彭结束这场对话太突然了。例如,在听到卡彭的一个反对意见后,他们提出了一个单独的支持死刑的观点,他们立即被提示“同意不同意”。我现在不跟你争论了。”
或者,一名大二物理专业的学生觉得 CapPun 的临别留言没有清楚地传达出谈话结束了,或者为什么谈话结束了!例如,在他们同意了足够多的 CapPun 的反对意见并收到消息“看来我们同意了”之后。耶!”,他们继续与 CapPun 交谈,如下所示:
注意:“OxyCSBot”是 CapPun 的初始名称
当谈话结束时,卡普恩如何没能传达
这些结尾不符合用户对辩论如何结束的概念模型,因此直接阻碍了与 CapPun 建立联系的需要。
为了解决这个问题,我们修改了 CapPun 在进入结束状态时提供的响应。现在,CapPun 告诉用户“太好了!很高兴我们在这一点上看法一致,我期待与您进行更多的对话!”在他们同意了三个反对意见之后,“我不认为我们在这个问题上意见完全一致。在他们不同意三个反对意见后,我们下次再继续这个对话,如下所示:
不太突然结束的新的结尾回应和传达了辩论结束的原因/时间
除了尴尬的结局,这个最初的设计没有考虑到这场辩论的无缝引入。虽然最初的设计考虑了用户的许多开场白,但它没有考虑到用户以支持死刑的观点开始的情况。相反,如果用户在他们的观点中提到“极刑”或“死刑”,CapPun 会进入“极刑是不好的”状态,并询问用户他们为什么支持极刑:
CapPun 如何从一开始就不允许用户摆姿势的例子
如果他们只是提出观点,CapPun 会简单地进入“胡言乱语”状态,因为消息没有任何匹配的标签,如下所示:
CapPun 如何从一开始就不允许用户摆姿势的例子
无论如何,这两种情况都与用户关于辩论如何开始的概念模型相冲突,削弱了对话的真实性,并阻碍了与机器人连接的需求。
为了解决这个问题,我们允许用户从一开始就提出问题:
CapPun 是如何改变的,以允许用户从一开始就提出问题
另外,在 CapPun 提供了一个与用户观点相反的观点后,许多对话嘎然而止。而用户则用诸如“我不知道任何其他反驳意见”和“我现在该说什么?”这样的语句来口头表达他们的困惑他们的困惑还表现在他们非语言的反应时间延长。以下面的交互为例:
卡彭提出对位法后,对话进展受阻的例子
大多数时候,用户试图拒绝对方提供的反驳,而不仅仅是以二元方式接受或拒绝。
这很有道理。
在大多数辩论中,人们在一个单一的问题上花费了大量的时间。此外,人类天生多疑,因此不太可能不经反驳就接受对手的陈述。因为 CapPun 不具备这两个特征,它不符合用户用于辩论的概念模型,因此阻碍了与机器人连接的需要。
为了暂时补救这一点,我们增加了提出替代观点的能力,以进一步推动对话,这将被视为不同意 CapPun,承认需要做更多的工作才能进一步完成。
如果 CapPun 没有根据用户输入的标签进入任何结束、辅助或无意义的状态,它将进入一个单独的参数状态
最后,一名计算机科学专业的大四学生发现了这个机器人的一个漏洞,使得他们可以和 CapPun 永远谈论同一个话题。
CapPun 愿意反复讨论同一个话题的例子
这危及了这名学生与 CapPun 之间的联系,因为他们从未遇到过愿意无限期讨论同一问题的人,导致他们对人类行为的概念模型不匹配。
为了解决这个问题,我们创建了一个参数列表,这样,当输入一个参数状态时,如果当用户键入一个被认为是“乱码”的消息时,该状态没有返回,则相应的参数将在数组中被标记为“无”。
CapPun 如何记住它讨论过的论点
然后,在访问下一个状态(由用户的响应决定)之前,CapPun 检查状态是否存在于 not 中。如果有,它就进入那个状态。如果没有,它会告诉用户之前已经讨论过这个话题。
CapPun 如何检查之前是否讨论过用户的观点
捕捉响应含义
另一方面,有时 CapPun 过于贪婪地对用户消息的含义进行分类,错误地解释了许多消息,导致机器人做出不适当的响应。例如,当一个计算机科学和戏剧专业的大三学生以“我同意死刑”开始谈话时。卡彭去了‘极刑不好’的州。
尽管这一声明清楚地表明了一种带有积极情绪的支持死刑的立场,但卡彭将其解读为一种带有消极情绪的信息,从而认为他们采取了反对死刑的立场。这样的事件是糟糕的,因为人类很少误解口语的情感,因此这样的设计缺陷阻碍了 CapPun 满足与用户建立联系的需求的能力。
为了提高这种能力,我们试图改进 CapPun 对初始用户输入的情感分析。经过进一步调查,我们发现“惩罚”一词使整个句子偏向于否定,而“同意”一词偏向于肯定,这解释了为什么“我同意死刑”这句话被解释为否定的。因此,在评估用户消息的情绪之前,我们让 CapPun 用下面一行代码删除“惩罚”、“死亡”和“惩罚”等词:
message = message.replace('惩罚',' ')。替换('死亡',' ')。替换('惩罚','')
此外,我们从 indico 的预建情感分析模块切换到Vader perspective 的预建模块来计算句子的情感,因为前者仍然将“我同意资本”视为否定句。
蒂斯克·蒂斯克。
除了 CapPun 错误地解释用户初始输入的情绪之外,CapPun 还错误地解释了用户句子的含义,如果它们包含有意义的二元语法。例如,一名未申报的大一新生对 CapPun 的一个对位法回应“我不同意”,然而 CapPun 看到“同意”并将其解释为用户同意该对位法,如下所示:
CapPun 曲解用户输入情感的例子
这进一步损害了 CapPun 解释用户信息含义的能力,从而损害了它满足与用户联系需求的能力。
为了解决这个问题,在检查消息是否表示同意之前,我们检查消息是否有表示不同意的标签。
CapPun 如何最小化其错误解释的数量
最后,另一方面,在对用户信息的含义进行分类时,CapPun 不够贪婪。下面的对话清楚地表明了这一点:
CapPun 无法响应大范围用户输入的示例
这种贪婪的缺乏限制了可接受的用户输入的范围,阻止了用户在整个辩论中充分表达他们的想法,阻碍了与 CapPun 的联系。为了解决这个问题,我们将每个参数中的标签总数从 45 增加到 132。
现在,让我们进入下一个设计迭代!
第二次设计+第二次用户测试
新设计
总之,我们在初始设计中增加了以下更改:
- 以更人性化的方式结束对话
- 阻止了重复相同对话的能力
- 通过删除停用词(即“惩罚”、“死亡”等)改进了情感分析。)和从 indicoio 到 Vader 情操
- 允许更多的方式从一点过渡到另一点(通过从对点和等待状态设置替代点)
- 减少了假阳性解释的数量
- 将标签数量从 45 个增加到 132 个
用户测试
因为从上一次设计迭代以来做了很多改变,为了评估它们是否提高了 CapPun 的能力,以满足允许用户与机器人连接的核心需求,我们再次以定性的方式进行了下一轮用户测试。像上次一样,在告诉用户 CapPun 做什么任务后,我们记录了用户在整个对话过程中的非语言和语言。然而,与上次不同的是,我们测试了一组不同的用户,以提高收到的反馈的多样性。
总的来说,用户感觉与 CapPun 的联系更加紧密了!然而,许多问题出现了,最大的疑虑归结为一个话题:对话的深度。
谈话深度
虽然我们增加了用户在收到 CapPun 的反对意见后提出单独观点的能力——除了同意或不同意它们之外——但用户仍然无法深入讨论某个观点。一个家庭成员与 CapPun 的对话显示了这一点:
CapPun 不能长时间谈论某一点的例子
这种无法深入的情况没有给 CapPun 足够的时间来改变用户的观点,这是不好的,原因有二:首先,如果它不能有效地执行其作为辩论者的任务,它就会削弱其作为聊天机器人的目的。此外,它减少了用户与 CapPun 的交互次数,损害了它满足建立连接需求的能力。
为了解决这个问题,我们将 CapPun 的对位法分成多个状态,只有当用户不同意它前面的对位法时才会进入这些状态。如果用户同意其中之一,CapPun 将跳过该论点的其余对位法状态,增加同意计数器,并要求用户提出不同的观点。
用户同意对位法后 CapPun 如何转换到下一个状态
只有当用户到达 CapPun 的特定论点的最后一个对位法,并且不同意或提出一个单独的论点时,不同意计数器才会增加,并且用户会被提示另一个不同的论点。
用户不同意非终结对位法后,CapPun 如何过渡到计数器的下一阶段
在通往最后一个反驳点的过程中,CapPun 在其反驳点中使用了更多个性化的介绍性从句(例如,“嗯,我认为……”或“当然,但我相信……”)。在这样做的时候,像“思考”和“相信”这样的词传达了一种对主题的情感依恋感,这是大多数人在对死刑这样的沉重问题进行辩论时所拥有的,加强了 CapPun 与用户建立联系的能力。或者,像“嗯…”和“当然…”这样的词让 CapPun 看起来像是在承认用户的观点,但实际上并没有这样做。
这种设计让用户有更多的自由来改变他们的想法,因为他们将不得不倾听和不同意卡彭提出的每一个观点,直到它被认为是争论中的一个分歧。
此外,虽然标签的数量比第一次设计迭代增加了两倍多,但当前的迭代仍然缺乏响应大范围用户输入的能力。以下面的交互为例:
CapPun 未能响应大范围用户输入的示例
当用户明确提出“不会改变”的论点时,CapPun 却没有这样解释。
这个问题集中并限制了用户可以对 CapPun 说的事情,这与他们关于人类对话如何发展的概念模型相矛盾,阻碍了他们与 CapPun 建立联系。为了解决这个问题,我们向 CapPun 添加了 13 个标签。
现在,让我们进入下一个设计迭代!
第三次设计+第三次用户测试
新设计
总之,我们做了以下更改:
- 增加了 CapPun 可以保持的对话深度
- 增加了 CapPun 可以响应的用户输入范围(通过增加它能够识别的标签数量)
用户测试
第三个用户测试的目标是定量评估 CapPun 能够维持的对话深度。
为了做到这一点,我们要求用户在辩论中特别关注一个支持死刑的观点,并记录他们在回应时的非语言和时间。
总的来说,我们得到的反馈主要是正面的!
在整个测试过程中,响应时间变化不大并且用户在交谈时没有排除任何沮丧的迹象。
前进到下一个设计迭代!
最终设计+最终用户测试
新设计
没有其他变化
用户测试
由于上一次用户测试的反馈非常积极,我们希望获得另一个总体评估,看看 CapPun 在多大程度上满足了用户连接它的需求。为了做到这一点,我们让一组不同的用户像以前一样与 CapPun 进行辩论,并将对话的手稿交给一个单独的第三方,并要求他们指出对话中任何感觉“不合适”的方面。如果这些测试人员只提出了少数几个方面,那么我们可以得出结论,CapPun 满足了建立连接的需要。
总的来说,每个对话至少有一个方面破坏了 CapPun 的真实性。
首先,测试者很快意识到这样一个事实,即反对死刑的辩论者在第一次对话中重复他们自己。例如,回答“与死刑问题无关”的人经常说,没有任何变化,如下所示:
CapPun 重复响应的示例
当给予更多的对话时,几乎每个测试人员都报告了这一方面。
此外,很大一部分测试者质疑为什么反对死刑的辩手总是提出一个相反的观点,而从不提出自己的观点。
最后,他们质疑为什么它有时会做出“奇怪”的反应。以下面的交互为例:
CapPun 奇怪回应的例子
任何人都能够恰当地回答这个问题,然而,卡普恩却做不到。
虽然这些方面经常被报道,而且大多数测试者都知道有些东西感觉“不对劲”,但是很少有人真正质疑任何一个辩论者是不是人类。
正因为如此,我们相信这个设计迭代满足了用户与聊天机器人连接的需求,尽管有许多不完美之处。所以,我们宣布它是我们的最终产品!
摘要
就这样,我们设计下一个人类堕落的尝试完成了(暂时)。
在 CapPun 的开发过程中,我的团队探索了无数的特性。虽然最终的设计非常细致,但其特点都可以追溯到最初的设计,以及李的启动代码。像最初的设计一样,CapPun 的当前版本循环通过用户提出的赞成死刑的点,评估在整个对话中持有的分歧和同意的数量。使用李的启动代码 T5,CapPun 可以从一个状态跳到另一个状态,或者从另一个状态调用一个函数,这取决于用户响应中与 CapPun 为每个状态预定义的标签相匹配的标签。
为了与用户建立情感联系,CapPun 的当前版本超越了这一点,通过分隔其响应来引出关于特定点的辩论,以更有利于人类的方式结束对话,防止重复相同对话的能力,通过删除停用词(即“惩罚”、“死亡”等)来改善情感分析。),允许更多的从点到点的过渡方式(通过摆出备选点),并将标签的数量从 45 个增加到 145 个。
尽管有这些改进,但重要的是要认识到 CapPun 从未真正试图理解用户,而是欺骗他们这样想。
虽然有许多方面暴露了 CapPun 作为聊天机器人的身份,例如重复响应,无法回答用户的问题,以及给出奇怪的响应,但许多用户对 CapPun 有情感联系,大多数第三方测试人员无法根据其文本输出识别 CapPun 是聊天机器人。
外卖食品
虽然我们声称我们的第四次设计迭代是最终的设计,但实际上,有无数的改进可以提高 CapPun 与用户建立联系的能力。
制作一个好的聊天机器人很难。
虽然建立一个类似人类的聊天机器人的目标是一个完全人工智能的问题,很可能无法做到完美,但我们在为 CapPun 提供各种人类联系元素方面取得了巨大进步,并尽最大努力推动人机交互的极限。事实证明,对于这种规模的聊天机器人,你可以走得很远,而实际上并没有让它了解那么多自然语言!
展望未来,我们将继续改善 CapPun 的响应多样性和理解标签的领域。因为自然语言理解领域正在不断涌现,谁知道几年后 CapPun 会是什么样子呢?
我想你必须保持关注。
国家独立性度量:在奥运舞台上,国家运作的体育系统有多有效。
原文:https://towardsdatascience.com/capstone-the-state-independency-metric-how-effective-is-state-run-sports-system-on-the-olympic-8ce06db17344?source=collection_archive---------75-----------------------
克里斯蒂安·卢在 Unsplash 上的照片
我有一些在学术项目中使用 Python 进行数据分析的经验,我想做一个简单的项目,将 Python 和 SQL 结合起来,提取一些数据见解。自从奥运会开始以来,我和每一位参与者都接触过“奥运会数据集——120 年的数据”。这种分析很有意思,可以观察国家支持的体育体制是否会提高运动员的奖牌产量。它不仅是一种宣传手段,还帮助孩子们找到了生活的目标,并帮助人们通过大众体育文化保持健康。苏联运动员在奥运会上的成功就是一个很好的例子。虽然这个国家在 1954 年加入了国际奥委会,并一直竞争到 1992 年,但结果是惊人的,值得进一步探索。
1992 年代表队由来自已经解体的苏联的运动员组成
我假设的客户:
我与 SportsStats 密切合作,为他们的合作伙伴发现有趣的事实。在审查所提供的数据后,有希望产生有新闻价值的故事或健康见解。
假设:
1)在美国之外,所有国家控制的体育系统国家都将比业余国家表现更好。
2)每一个苏联国家都会有一个时间滞后,在这个时间滞后里,新的制度会被实行。因此,从参赛开始的 3 个奥运周期后,所有的成绩都会提高。
做法:
1。导入和清理数据;将原始数据集分成第一个和第二个 word countries 表;
2。根据团队和年份进行筛选,以查看绩效;
3。通过 Pearson 和 P 值进行统计分析,找出相关性。
第一步:导入并清理数据。
我们从导入库和数据集的 csv 开始。一旦导入,最好熟悉我们已经得到的数据。
在浏览了各列之后,很明显并不是所有提供的数据都是分析所必需的。所以我们将放弃其中一些。
一旦我们过滤了所需的列,就该将数据集分为苏联和资本主义两类了。为了获得更准确的结果,我们将使用 1952 年至 1992 年的时间限制,因为在此期间,苏联系统在华沙条约组织国家实施并活跃。
第二步:根据团队和年份进行筛选,查看绩效。
一旦我们把我们的国家分成几个表,就该看看他们在全球范围内的表现了!我们将创建一个函数来计算每个国家的奖牌数,以及苏联赢得的奖牌总数。当我们在前 3 个奥运周期运行该函数时,我们得到以下结果:
从提供的数字来看,趋势并不一致。随着时间的推移,苏联、保加利亚、捷克斯洛伐克、波兰和罗马尼亚的奖牌数都在增加。然而,匈牙利(在 1954 年奥运会上获得第三名)和南斯拉夫表现出下降趋势。同样值得注意的是,直到 1964 年,德国作为一个统一的国家参加,所以从 1968 年奥运会的奖牌情况来看将是一个好主意。
随着东德的引入,大多数球队都表现出类似的趋势。随着时间的推移,苏联、东德、保加利亚、古巴、波兰和罗马尼亚的奖牌数都在增加。而匈牙利、南斯拉夫(略有增加)和捷克斯洛伐克则呈下降趋势。这使得我们的第二个假设有点混乱——随着时间的推移,大多数国家开始显示出更好的结果,但也有一些国家,显示出相反的动态。
我们将使用相同的构建函数来确定资本主义集团中的哪些国家对整体奖牌表现贡献最大。
提供的两个游戏摘要让我们可以比较苏联对资本主义国家的表现。一旦计算出这一指标,就会发现在 1968 年之前,表现最好的资本主义国家生产率更高。然而,在美国之外,这些国家比他们的苏联对手表现得更好,直到东德和它的贡献越来越大,从 1972 年开始扭转了局势。
(*注:我们不包括 1980 年和 1984 年的奥运会,因为分别在 1980 年和 1984 年遭到资本主义国家和苏联的抵制。)
在对所有游戏运行该功能后,我们设法分离出表现最好的国家。现在,我们可以创建一个他们最有成效的学科的表格,这样我们就可以确定,在给定的运动中,哪个系统是最好的,以及哪个领域被证明是每个区块最有成效的。
我们可以在上面的柱状图中清楚地看到哪些运动对美国在奥运会上的成功贡献最大。为列表中的每个团队运行这些图表,我们将为两个模块创建性能表。
所有被讨论的国家都有几项运动的优异表现要感谢。通过游戏年份过滤国家,我们得到以下结果。
这些图表表明,苏联国家更喜欢团队运动,他们一直是一股强大的力量。
测量的周期。个别学科更倾向于哪个体育学校对个别国家来说更强(例如苏联的滑雪)。同样显而易见的是,在苏联对该国的体育制度进行改革后,成绩有所提高,并且从零开始建立了联合会(古巴的拳击运动,直到革命后才普及)。
另一方面,资本主义国家更擅长个别项目——田径、游泳、自行车。后来的调查显示,在这个国家最受欢迎或最普及的运动最终占据了奖牌的希望——就像美国的田径、英国的自行车或英国和澳大利亚的曲棍球。
第三步。通过 Pearson 和 P 值进行统计分析,找出相关性。
皮尔逊相关(双变量相关)是一种统计,用于测量两个变量 X 和 y 之间的线性相关。它的值介于+1 和 1 之间,其中 1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。
P-value 是如果相关系数实际上为零(零假设),您找到当前结果的概率。如果这个概率低于常规的 5% (P < 0.05),则相关系数称为统计显著性。
我们要找出每张桌子上运动表现之间的相关性。由于对奖牌榜贡献最大的是田径和游泳,我们将首先比较它们,然后看看其他学科的表现如何。
看起来两个表的相关性很强。这并不奇怪,因为我们看到的是历届奥运会中最成功的球队。让我们来看看田径运动和自行车运动之间的关系。
这显示了更强的相关性,但我们的资本主义表给出了一个很弱的皮尔逊值和一个很高的 P 值。因此,正确的结果将是这两者之间的非线性相关。水上运动的情况与整个水上运动家族非常相似:在一个家族中表现出色的人通常在另一个家族中表现出色。
然而,资本主义表显示更多的是线性关系,而苏联看起来像是非线性关系。
但是团队运动呢?既然苏联队应该表现得“好得多”?结果并不简单:
资本主义表中的关系几乎没有显示出任何相关性,而苏联的表现更加线性,尽管不是完全线性。
结论。
1.采用苏联的体育体制提高了每个国家每一届比赛的成绩,即使从结果来看,最大的受益者是苏联
2.具有独立准备体系的资本主义国家在其最强的学科中表现出更一致的结果。
3.东欧体操学校给了苏联国家巨大的优势。从 20 世纪 50 年代初开始,为了“提高苏联人民的身体健康水平”,体操运动开始普及。后来,这项法令变成了在最高级别上赢得更多奖牌的一种方式,这导致了苏联在奥运会舞台上的统治地位。除了日本,没有哪个资本主义国家在奥运会上表现更好。
4.特别值得一提的是击剑。作为一项竞技运动,它起源于意大利,意大利一直是这项运动中最强大的力量。匈牙利击剑学校也被认为是欧洲第二好的学校。在欧洲赛区之后,高标准的匈牙利击剑在整个苏联地区被教授,结果苏联运动员有了很大的提高。
5.加入苏联阵营的每个国家的强校都为其他国家的训练方法做出了贡献。苏维埃制度吸取了一个国家的经验并采用了这种做法。很好的例子——击剑、体操和水球
假设:结论
1.除了美国之外,所有国家控制的体育系统国家都会比业余的表现更好。
部分正确——从 1972 年奥运会开始。
2.每个苏联国家都会有一个时间差,在这个时间差里,新的制度会被实施。因此,从参赛开始的 3 个奥运周期后,所有的成绩都会提高。 部分正确——部分国家呈下降趋势。1968 年东德加入后,所有国家都呈现稳定增长。
讨论。
尽管体育是苏联政权的一种政治宣传手段,但它是一种大众现象,吸取了它所庇护的国家的最佳实践,并全面实施。中国在筹备 2008 年奥运会时也采取了同样的方法,这促使他们成为奥运会的主要力量之一。在国际合作方面有很大的空间,当谈到最佳的训练方法,以使奥运会更具竞争力,胜利者的范围更广,更包容其他国家。
感谢您的阅读,您可以在我的 GitHub 上找到代码,任何反馈、意见、建议都将不胜感激!
使用 Inception-v3 进行汽车分类
原文:https://towardsdatascience.com/car-classification-using-inception-v3-71b63e9825b7?source=collection_archive---------20-----------------------
关于使用 Monk 训练 3 个模型来分类汽车的品牌、型号和年份,并通过 Flask API 部署它们的文章
奥拉夫·特维特在 Unsplash 拍摄的照片
介绍
这篇文章是关于使用 Monk 训练 3 个深度卷积神经网络,这是一个计算机视觉的开源库,然后通过一个 API 部署它们。这些模型以汽车的图像作为输入,然后预测汽车的品牌、型号和年份。这些模型已经在 Cars 数据集上进行了训练。
对于迁移学习,使用了带有预训练权重的 Inception-v3 架构。一些初始层被冻结,并且在剩余层上进行训练。
训练之后,模型通过 Flask API 被部署。它通过 POST 请求接受图像,并将预测返回给用户。
对于培训笔记本,勾选本。
对于烧瓶 API,检查这个。
目录
- 安装 Monk
- 数据集
- 训练模型
- 培训结果
- 通过 API 部署模型
- 运行 API
- 结论
1.安装 Monk
Monk 是一个开源的计算机视觉库。你不需要深入了解 Python 或任何深度学习框架就能使用它。它通过为流行的深度学习框架提供包装函数来简化计算机视觉,并使人们能够使用最少的代码来使用它们的功能。查看它的 GitHub 库以获取更多信息。
本文使用 Monk 库的 PyTorch 后端,但是如果您愿意,您可以安装任何其他版本的 Monk。点击查看的详细安装说明。
- CPU(非 GPU) :
pip install -U monk-pytorch-cpu
- 谷歌实验室 :
pip install -U monk-colab
- 卡格尔 :
pip install -U monk-kaggle
- 对于支持 CUDA 的版本,请遵循这里提供的说明。
要手动安装库,请遵循此处提供的说明。
2.数据集
用于该任务的训练数据集是 Cars 数据集 。它包含 196 类汽车的 16,185 张图片。级别通常在品牌、型号、年份级别,例如特斯拉 Model S 2012 或宝马 M3 coupe 2012。数据集附带一个 devkit,其中包含每张图像的标签,以及汽车周围边界框的坐标。但是我们只用标签。这里给出的代码打算在 python 笔记本中运行。
下载数据集:
*# Create a directory for the dataset*
! mkdir data*# Download train dataset and extract it* ! wget "http://imagenet.stanford.edu/internal/car196/cars_train.tgz"
! tar -xvf 'cars_train.tgz' -C 'data'*# Download test dataset and extract it* ! wget "http://imagenet.stanford.edu/internal/car196/cars_test.tgz"
! tar -xvf 'cars_test.tgz' -C 'data'*# Download the devkit and extract it*
! wget "https://ai.stanford.edu/~jkrause/cars/cars_devkit.tgz"
! tar -xvf 'cars_devkit.tgz' -C 'data'
准备标签:
准备标签所需的 devkit 中的文件:
- cars_meta.mat :包含类名的单元格数组,每个类一个。
- cars_train_annos.mat :包含变量‘annotations’,其中每个元素都有边界框的坐标,字段‘class’是图像的整数类 id,字段‘fname’是图像文件夹中图像的文件名。
要为培训准备标签:
-
首先,我们处理文件 cars_meta.mat 来分离每个类 id 的品牌、型号和年份。
-
然后,我们处理文件 cars_train_annos.mat ,为数据集中的每个图像分配标签,包括品牌、型号和年份。
-
从此处下载cars _ test _ annos _ with labels . mat后,可以按照类似的程序给测试图像分配标签。
-
****或者,准备好的 csv 文件可以从这里下载。
目录结构:
./Project_directory/
|
|-------data (for dataset)
| |
| |------cars_test
| | |----------00001.jpg
| | |----------........(and so on)
| |------cars_train
| | |----------00001.jpg
| | |----------........(and so on)
| |------devkit
| | |----------cars_meta.mat
| | |----------cars_train_annos.mat
| | |----------........(and other files)
| _
|------vehicles_make.csv |
|------vehicles_model.csv | (csv files with labels)
|------vehicles_year.csv _|
|
|------.......(and other files/folders)
3.训练模型
当使用和尚时,实验模型变得非常容易。通过更改几个参数,我们可以很快看到它如何影响模型的整体性能。这也加快了原型制作的速度。
我们将使用 Monk 的 PyTorch 后端。但是,Keras 和 MXNet-gluon 后端也是可用的。
在这里,我将解释训练 Make 分类器的程序。其他两个分类器可以用类似的方式训练。你可以在这里找到整个训练笔记本。
导入并打开一个项目:
分配数据集:
设置模型参数:
我们将用预训练的权重加载 Inception-v3 模型,以便使用迁移学习来训练分类器。当训练数据集不够大时,这通常会使模型表现得更好。
我也尝试过训练 ResNet-50 模型,但是它的性能远不如 Inception-v3。
设置训练参数:
现在,我们将为 5 个时期训练模型。如果学习率和其他超参数足够好,训练可以从最后一个时期继续。我们将使用 softmax 交叉熵作为损失函数,因为它通常对分类任务非常有用。对于乐观者来说,我已经试验了随机梯度下降,但是 RMSProp 似乎表现得更好。
培训:
这将把在每个时期之后获得的模型连同一些与训练相关的附加信息一起保存到工作空间目录中。
运行ptf.Summary()
可获得培训的详细总结。
4.培训结果
我们将对整个测试数据运行模型以获得测试准确性,然后对一些单独的图像运行它们。
根据测试数据评估模型:
下面的代码返回了总体测试精度以及基于类的单个精度,这可以用来获得关于其性能的一些有用的见解。
运行部分图像的训练模型:
获得的结果:
在 8,041 幅图像的全部测试数据上评估模型。验证集与原始训练数据集有 20%的差异。模型获得的精度:
- 制作分类器:最佳验证准确率:94.72%。测试准确率:84.27%
- 模型分类器:最佳验证准确率:96.50%。测试准确率:83.99%
- 年分类器:最佳验证准确率:94.17%。测试准确率:83.19%
从测试数据获得的图像预测
5.通过 API 部署模型
当使用 Monk 训练模型时,它会自动创建一个工作空间目录。它包含所有的训练日志和在训练期间获得的所有中间模型。为了开发 API,我们只需要最终的模型具有与创建它们时相同的目录结构。如果你已经训练了你的模型,你可以使用它们。否则,你可以从这里下载最终模型的工作空间。
如果只是想测试 API,就勾选这个。自述文件中有设置环境的详细说明。
在项目目录中创建一个名为“uploads”的子目录,用户上传的文件将在返回预测之前保存在其中。设置虚拟环境并安装所需的库。虚拟环境不是必需的,但建议使用。从这里下载 requirements.txt 文件并运行pip install -r requirements.txt
在工作区所在的项目目录下创建一个名为 app.py 的文件。我们将在这个文件中编写 API 的代码。
导入和实用功能:
响应 HTTP 请求的函数:
我已经为 API 提供了一个用户界面,但这不是必需的。如果你也想使用它,将这个和这个目录下载到项目目录中,然后定义下面给出的 index()函数,使 API 在通过浏览器访问时加载网页。
upload()函数在“/predict”处响应 POST 请求,将其保存到名为“uploads”的子目录中,如果文件是有效的图像,则返回带有预测的字符串。
驱动功能:
它加载模型并启动服务器。
6.运行 API
使用终端中的命令python3 app.py
运行应用程序。
一旦服务器启动,您就可以通过使用 cURL 发送 POST 请求来测试 API。为此,如果您还没有 cURL,那么您首先需要安装它。然后,通过您的终端,在用图像的有效路径替换了<image_path>之后,运行下面的命令。</image_path>
curl -X POST -F file=@'<image_path>' ‘http://0.0.0.0:5000/predict'
这将把预测返回到您的终端本身。
****或者,您可以在您的浏览器中进入http://0 . 0 . 0:5000查看用户界面。然后使用“选择”按钮上传任何图像,并单击“预测”。然后它会返回这样一个预测:
****
API 的用户界面
7.结论
本文涵盖了整个过程,包括数据准备、训练图像分类模型,以及最终通过 Flask API 部署它们。我们还使用了数据标准化、随机水平翻转、迁移学习、自定义优化器、学习率和损失函数。根据测试数据评估模型,它们表现得非常好,准确率接近 85%。然而,我对年份分类器具有如此好的准确性感到有点困惑,因为确实没有任何明显的特征可以帮助预测汽车的制造年份。我不确定仅仅用图像来预测年份是否是个好主意。
你也应该尝试调整一些超参数,或者使用不同的模型架构,看看它会怎么样。也可以用 Monk 同时测试模型或超参数的多个组合,点击查看。
参考资料:
- 培训笔记本的 GitHub 存储库:https://GitHub . com/piyu shm 1/Car-make-model-and-year-classifier
- API 的 GitHub 存储库:https://github.com/PiyushM1/Car-classification-API
- 数据集:https://ai.stanford.edu/~jkrause/cars/car_dataset.html
- 僧库:https://github.com/Tessellate-Imaging/monk_v1
感谢阅读!如果你觉得这篇文章有帮助,请告诉我。我们通过 LinkedIn 来连线。
卡拉·威尔逊:通过技术教育提升职业流动性
原文:https://towardsdatascience.com/cara-wilson-enabling-upward-career-mobility-through-tech-education-26eed4190fcb?source=collection_archive---------54-----------------------
科技女性系列
菲律宾妇女基金会联合创始人访谈
尽管数据科学的发展和越来越多的报告描述了人工智能日益增长的重要性,但显然“并非所有的工作都有光明的未来”。在菲律宾等新兴国家,技术性别差距仍然很大,创造包容性的技术环境对该领域的整体发展至关重要。特别是在菲律宾,只有约 50%的工作年龄女性加入了劳动力大军——其中近一半从事“不稳定工作”一个组织正在带头创建一个技术领域的菲律宾人社区,他们被授权打破这个玻璃天花板。
图片由菲律宾 FTW 基金会提供
for the Women Foundation(FTW Foundation)是一家菲律宾非营利机构,为女性提供免费的数据科学和人工智能培训。他们的使命是“通过密集的技术技能培训来改变女性的生活,以实现向上的职业流动”⁴ FTW 基金会的第一批数据科学团队在为期 14 周的项目结束后,月薪平均增长了 286%。此外,他们 92%的学者仅在 6 周内就获得了数据科学工作。ftw 基金会成立于 2018 年,迄今已培训和安置了近 100 名学者。通过他们的影响,FTW 基金会开创了一项运动——无论女性的社会经济和学术背景如何,每个参与该计划的 FTW 学者都有一个坚定不移的目标,即通过技术解决一些社会最大的问题来帮助菲律宾。⁶
图片由菲律宾 FTW 基金会提供
作为一名在马尼拉长大的菲律宾裔美国人,卡拉·威尔逊在美国完成了大学学业,之后在意大利米兰生活和工作了 22 年。她在哈佛学院学习历史,然后在纽约和马尼拉从事广告工作。此后不久,卡拉在意大利米兰的 SDA Bocconi 完成了 MBA 课程,然后在那里工作并组建了家庭。"我想你可以说我在三大洲安家了!"卡拉说,当我问她背景时。
图片由卡拉·威尔逊提供
Amber: 你一直都知道你想从事科技行业吗?
Cara: 完全不是。作为一名人文学者和营销主管,我一直认为技术对我来说就像一门外语。然而,由于我热爱语言,我想这最终是一个令人愉快的发现。技术可以是一个很好的均衡器,这就是 FTW 所利用的。
一个组织正在带头创建一个技术领域的菲律宾人社区,他们被赋予打破玻璃天花板的权力
答:是什么激励你从事数据科学职业,并开始为妇女基金会工作?你在市场营销方面的经验,以及你的历史学位,对你的决定起了什么作用?
C: 首先,我想澄清一下,我不是一名数据科学家,但我必须熟悉数据科学/分析的基础知识,以便完成 FTW 的使命,让值得帮助的女性进入这一充满希望的职业。当我在米兰的时候,我遇到了许多聪明的菲律宾妇女,她们被困在家务劳动中,尽管她们受过教育,有潜力做更多的事情。这一切都是因为在菲律宾缺少有前途的工作机会,他们不得不去国外工作,以便寄钱回家养家。在菲律宾,这意味着一代孩子在没有母亲和姐妹的情况下成长。我想成为解决方案的一部分,试着在某一天改变这一切。这是一次非常有益的经历。
我认为历史学位是让你投身于任何职业的完美方式——它不仅教会你写作,还让你拥有全面的视角,以及获取大量信息并以简洁的方式提取关键知识的能力。作为一名营销人员,我敏锐地意识到沟通的重要性,这些都是我工作中重要的技能。我认为我的思考和分析过程因为有这样的背景而得到了加强。
图片由菲律宾环球时报提供
A: 你创办 FTW 基金会时面临的最大挑战是什么,你是如何克服的?
C:【嗯,我想我不得不实际一点,说筹资过去是——现在也是——艰难,但不知何故,既然我对自己的工作充满热情,宇宙似乎站在我们这一边,事情就迎刃而解了。我还认为,找到相信我们倡导的敬业导师也是一个挑战。数据科学家大多是年轻的专业人士,他们忙于建立自己的事业,很难要求他们抽出一些时间投入教学。然而,一旦我们找到了合适的人选,他们很快就会对我们的女学者的干劲和参与度印象深刻,这是灵感的巨大来源。他们可以真正看到这项工作如何让他们继续从事有趣的数据项目,同时真正改变生活。
FTW 基金会正在带头发起一场运动,为女性和科技行业的转行者增加可及性和经济机会。
答: FTW 基金会的愿景是创建一个技术领域的菲律宾人社区,让他们能够突破职业障碍。FTW 基金会是如何实现这一使命的,从第一批学生到现在的学生,你们的方法有什么变化?C: 通过我们短短的 1.5 年和近 100 名女性毕业生,我们对课程进行了改进,以反映菲律宾就业市场的现实。可持续就业是我们的成功标准,因此这很重要。我们还在为每位学员定制学习体验,并收集数据以不断改进我们的选择和培训方式。
一个有趣的发现是,我们已经意识到支持性社区学习经历在 FTW 项目中是多么重要。女性转行者往往是冒名顶替综合症的受害者,你需要一个强大的支持系统来鼓励你去争取,即使你有所怀疑。这种精神是 FTW 团队和我们校友的强大力量。我们的毕业生都自愿回来指导下一批学者。他们相信自己得到了这个独一无二的机会,他们想要付出——这个社区的力量随着每一个新的群体而增长。这已经成为一项真正的资产。
图片由菲律宾环球时报提供
A: 你对其他希望在数据科学领域发展事业的女性有什么建议?
C: 我会建议他们沉浸在所有关于数据和数据科学的课程、小组和网络研讨会中。这是培养技能和从事个人数据项目的大好时机。这种“暂停”也是一个思考更大图景的独特机会——互联网、政府和特殊利益集团如何使用或滥用数据来操纵他们的信息。数据所扮演的角色在这场(冠状病毒公共卫生)危机中得到了凸显,他们应该思考自己为什么要成为数据科学家,以及自己希望在数据伦理领域扮演什么角色。这可能会给他们的职业道路带来更多的目标。
****答:你认为菲律宾下一代女性技术专家面临的最大挑战是什么,已经入行的女性能帮上什么忙?
C: 在菲律宾,最大的挑战是为所有菲律宾人提供高质量的教育机会,从而实现就业。社会经济差距很大,我担心随着 covid 危机的发展,这些经济不平等会更加明显。对于许多经济困难的女性来说,找到这些机会并拥有利用它们的资源是很困难的。
已经在科技领域取得成功的女性可以做很多事情来提供帮助——主持一场科技研讨会或网络研讨会,自愿参加一场鼓舞人心的演讲,指导一位开始科技职业生涯的女性,参与公司的多元化目标,为年轻女性营造一个可以茁壮成长的支持空间。我很惊讶有多少成功女性在确定了回报的优先顺序后,真的找到了分享她们经历的意义。他们只需要做出这样做的决定。
图片由菲律宾 FTW 基金会提供
****答:我们的读者如何参与 FTWFoundation?
C: FTW 正在招聘和寻找我们课程中许多主题的讲师、客座讲师和合作者/志愿者。我们还在设计一个新的导师计划,让有经验的数据专业人员能够单独了解我们的学员,并真正塑造他们开始数据职业生涯的第一步。这是一次鼓舞人心的经历,对导师和学员都有好处,而且可以远程完成。我很乐意听到任何感兴趣的人的意见,所以请联系我在cara@ftwfoundation.org这样我们就可以探索合作——这些只是一些可能的参与方式,当然还有很多其他方式。
FTW 基金会正在带头发起一场运动,为女性和科技行业的转行者增加可及性和经济机会。不仅仅是提高妇女的技术素养和技能,FTW 基金会还教导他们的菲律宾学者要相信自己,为更美好的未来而奋斗。
要了解菲律宾妇女基金会的更多信息,请随时通过以下平台与他们联系:网站上的
::::
::::【https://www.facebook.com/ftwfoundation/】::
:;LinkedIn:::
特别感谢 Cara Wilson 允许我为这个系列采访她,也非常感谢 TDS 编辑团队对这个项目的支持。
你认识一位鼓舞人心的科技界女性,你希望她出现在这个系列中吗?你是否正在从事任何你希望我写的很酷的数据科学和技术项目?欢迎给我发电子邮件,向 angelamarieteng@gmail.com 寻求意见和建议。感谢阅读!
[1]引自 FTW 网站https://www.ftwfoundation.org/
[2]统计自以下文章https://www . wheninmanila . com/read-ftw-foundation-provides-free-tech-courses-for-young-women/
[3]视觉来自 FTW 网站https://www.ftwfoundation.org/
[4]来自 FTW 网站的任务https://www.ftwfoundation.org/
[5]从 FTW 官方网站获得的统计数据
[6]关于这方面的更多信息,请见 https://www.ftwfoundation.org/about
参考
彭扎兰,凯利。阅读:FTW 基金会为年轻女性提供免费的技术课程。
FTW 基金会。https://www . edukasyon . ph/organizations/ftw-foundation/about。
埃拉·里维拉。这些女性在数据科学领域处于领先地位,你也可以。https://young star . ph/这些女人在数据科学领域处于领先地位。
马纳洛,希拉。Sherlyn Malit 主持的第一次 FTW 基金会开工演习。https://medium . com/the-looking-glass/1st-ftw-foundation-commencement-exercises-by-sherlyn-malit-bf7ab 845250 b。
为妇女基金会。https://www.ftwfoundation.org/.
媒体混合建模中的遗留和形状效应:论文综述
原文:https://towardsdatascience.com/carryover-and-shape-effects-in-media-mix-modeling-paper-review-fd699b509e2d?source=collection_archive---------5-----------------------
在下面的文章中,我将回顾并实现“带遗留和形状效应的媒体混合建模的贝叶斯方法”的主要部分。
全文可以在这里找到:链接
目录
- 媒体组合造型
- 滞后效应
- 形状效果
- 全型号
- 模拟
- 计算 roa/mroa
- 优化营销预算
— — —
首先,媒体组合模型(MMM)旨在揭示付费媒体对利益衡量标准(通常是销售额)的因果影响。从历史上看,这个问题在很大程度上是通过线性回归建模的,因果影响是使用 Rubin 的潜在结果框架得出的。
用简单的(数据科学)术语来说,这意味着
- 使用媒体支出和控制变量训练预测销售额的回归模型。
- 通过比较媒体支出达到观察金额时和媒体支出为零时的销售额,得出因果影响。
从观察数据中估计偶然影响有许多问题,例如,对于初学者来说,“相关性不等于因果关系”。媒体混合模型有许多独特的问题需要注意。在这里可以找到对这些问题的精彩回顾:媒体混合建模的挑战和机遇
本文重点讨论两个具体问题:
- 结转效应,即滞后效应
- 形状效应,即收益递减
同时还提供贝叶斯模型、ROAS 计算和优化方法。
遗留效应
结转效应,通常被称为滞后效应,发生在媒体支出影响几天的销售时。例如,如果我们今天在展示广告上花了 100 美元,我们可能几天都看不到这笔花费的效果。adstock 函数试图将这种现象参数化,本文采用两种方法对 adstock 建模:
几何
- 这是过去 L 天的加权平均值,其中 L 可能因媒体渠道而异。
- 该效应对消费日的影响最大,并在此后衰减。
延迟的股票
- 媒体花费的影响在媒体花费之后 T(θ)天达到峰值。
履行
**def** **geoDecay**(alpha, L):
'''
weighted average with geometric decay
weight_T = alpha ^ T-1
returns: weights of length L to calculate weighted averages with.
'''
**return** alpha******(np**.**ones(L)**.**cumsum()**-**1)
**def** **delayed_adstock**(alpha, theta, L):
'''
weighted average with dealyed adstock function
weight_T =
returns: weights of length L to calculate weighted averages with.
'''
**return** alpha******((np**.**ones(L)**.**cumsum()**-**1)**-**theta)******2
**def** **carryover**(x, alpha, L, theta **=** None, func**=**'geo'):
'''
1\. x is a vector of media spend going back L timeslots, so it should be len(x) == L
2\. Weights is a vector of length L showing how much previous time periods spend has on current period.
3\. L is max length of Lag.
returns transformed vector of spend
# update with numpy average
# np.average(x[:2], weights=[1,.9])
'''
transformed_x **=** []
**if** func**==**'geo':
weights **=** geoDecay(alpha, L)
**elif** func**==**'delayed':
weights **=** delayed_adstock(alpha, theta, L)
**for** t **in** range(x**.**shape[0]):
upper_window **=** t**+**1
lower_window **=** max(0,upper_window**-**L)
current_window_x **=** x[:upper_window]
t_in_window **=** len(current_window_x)
**if** t **<** L:
new_x **=** (current_window_x*****np**.**flip(weights[:t_in_window], axis**=**0))**.**sum()
transformed_x**.**append(new_x**/**weights[:t_in_window]**.**sum())
**elif** t **>=** L:
current_window_x **=** x[upper_window**-**L:upper_window]
ext_weights **=** np**.**flip(weights, axis**=**0) new_x **=** (current_window_x*****ext_weights)**.**sum()
transformed_x**.**append(new_x**/**ext_weights**.**sum())
**return** np**.**array(transformed_x)
上面,我们可以看到给定参数的几何和延迟的 adstock 函数的形状。正如预期的那样,几何函数以强烈的冲击开始,然后稳步下降,而延迟的 adstock 函数在花费后 3 天(θ= 3)达到峰值,然后迅速下降。
形状效应和收益递减
接下来,本文讨论了收益递减现象,在本文中称为形状效应。当媒体渠道开始失去其有效性时,即花费 0 美元和 50 美元之间的差额远大于 200 美元和 250 美元时,就会出现这种情况。
Hill 函数用于对此建模,这源于生物化学。
哪里;
- S =斜率;大于 0
- K =半饱和点;大于 0
- β=通道系数;大于 0
- x =媒体支出
**def** **beta_hill**(x, S, K, beta):
**return** beta **-** (K******S*****beta)**/**(x******S**+**K******S)
上面的等式是原始等式的修改版。在最初的希尔函数中,当 X 接近无穷大时,该函数接近 1,因此我们乘以一个β系数来说明营销渠道的各种优势。如果我们排除贝塔变量,每个渠道将有同样的效果。
论文确实指出了函数的可辨识性差。例如,当 K(半饱和度)点在观察到的媒体花费之外时。
- 我们可以在下图的蓝线中看到这一点。请注意,我们没有观察到半饱和点,即由于收益递减,蓝线没有开始变平,因此我们的模型不可能找到正确的值。因此,随着媒体支出持续增加,我们的模型可能会错误地预测高回报。
上图显示了希尔函数可以呈现的各种形状。
组合:结转和形状/滞后和收益递减
接下来,我们需要一种方法来结合遗留效应和形状效应。该文件提出了两种可能的方法。
- 首先应用 adstock 函数,然后应用 shape 函数。
- 首先应用 shape 函数,然后应用 adstock 函数。
如果在任何给定的时间段内都有少量的花费,本文推荐路线 1。这是有意义的,因为形状效应不太可能被小额消费激活。或者,对于大的持续花费,首先应用形状(收益递减)效果,然后应用 adstock 函数是有意义的。
模型
现在我们可以指定我们(报纸)媒体组合模型的功能形式:
其中 Xt 已经通过 Adstock 函数进行了转换,Z 代表控制变量。
模拟
接下来我们进入模拟阶段。当从观察研究中估计因果效应时,模拟总是很重要的。通过模拟,我们可以生成一个合成数据集,使用我们的模型来估计因果关系,并将我们的估计与地面事实进行比较。这使得我们可以用一种用观测数据不可能的方式来测试我们的模型。
模拟数据集将包含:
- 两年的销售数据
- 三个媒体渠道
- 一个控制变量(价格)
- 媒体支出是通过将白噪声加入以一年为周期的正弦季节性而产生的
- 价格是通过 AR(1)系列生成的
*# media channels* N **=** 102 *# number of data points* t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_1 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) )
t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_2 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) )
t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_3 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) )
*# price* **from** statsmodels.tsa **import** arima_process **as** arima
arparams **=** np**.**array([.7, .6])
maparams **=** np**.**array([.1, .02])
ar **=** np**.**r_[1, arparams] *# add zero-lag and negate* ma **=** np**.**r_[1, maparams] price_variable = arima.arma_generate_sample(ar,ma,102)alpha_media_1 **=** .6
theta_media_1 **=** 5
k_media_1 **=** .2
s_media_1 **=** 1
beta_media_1 **=** .8
alpha_media_2 **=** .8
theta_media_2 **=** 3
k_media_2 **=** .2
s_media_2 **=** 2
beta_media_2 **=** .6
alpha_media_3 **=** .8
theta_media_3 **=** 4
k_media_3 **=** .2
s_media_3 **=** 2
beta_media_3 **=** .3
L**=**13
ru**=**4
lamb **=** **-**.5
ep **=** .05******2
m1 **=** [beta_hill(x, s_media_1, k_media_1, beta_media_1) **for** x **in** carryover(media_1, alpha_media_1, L, theta **=** theta_media_1, func**=**'delayed')]m2 **=** [beta_hill(x, s_media_2, k_media_2, beta_media_2) **for** x **in** carryover(media_2, alpha_media_2, L, theta **=** theta_media_2, func**=**'delayed')]m3 **=** [beta_hill(x, s_media_3, k_media_3, beta_media_3) **for** x **in** carryover(media_3, alpha_media_3, L, theta **=** theta_media_3, func**=**'delayed')]
y **=** np**.**repeat(ru, N) **+** m1 **+** m2 **+** m3 **+** (lamb*****price_variable) **+** np**.**random**.**normal(0, ep, N)
拟合模型。
既然已经模拟了数据集,现在是时候拟合模型了。论文用的是 STAN,然而我用的是 Python/PyMC3。
import arviz as az
import pymc3 as pmwith pm.Model() as m:
alpha = pm.Beta('alpha' , 3 , 3 , shape=3)
theta = pm.Uniform('theta' , 0 , 12 , shape=3)
k = pm.Beta('k' , 2 , 2 , shape=3)
s = pm.Gamma('s' , 3 , 1 , shape=3)
beta = pm.HalfNormal('beta' , 1 , shape=3)
ru = pm.HalfNormal('intercept', 5)
lamb = pm.Normal('lamb' , 0 , 1)
noise = pm.InverseGamma('noise' , 0.05, 0.0005)
transpose_m1 = [beta_hill(x, s[0], k[0], beta[0]) for x in carryover(media_1, alpha[0], L, theta = theta[0], func='delayed')]
transpose_m2 = [beta_hill(x, s[1], k[1], beta[1]) for x in carryover(media_2, alpha[1], L, theta = theta[1], func='delayed')]
transpose_m3 = [beta_hill(x, s[2], k[2], beta[2]) for x in carryover(media_3, alpha[2], L, theta = theta[2], func='delayed')]
y_hat = pm.Normal('y_hat', mu=ru + transpose_m1 + transpose_m2 + transpose_m3 + lamb * price_variable,
sigma=noise,
observed=y)trace = pm.fit(method='svgd')
结果
- MAPE: 0.12
- 平均寿命:0.026
正如所料,样本内拟合(MAE 梅伊)相当好,1)因为它是样本内的,2)因为我们生成的数据与我们正在建模的函数形式相同。因此,这归结于 MCMC 近似的效果。
真实参数与近似参数。
下面,我们可以看到模型参数相对于真实模型参数的后验分布(蓝线)。这使我们能够了解我们的模型在恢复真实模型参数方面表现如何。
ROAS / mROAS 计算
现在,我们用以下公式计算 roa 和 mROAS。
在英语中,上面的等式转化为所有媒体渠道打开时的预测销售额减去除第 M 个媒体渠道之外的所有媒体渠道的预测销售额,再除以支出。唯一的问题是,我们必须考虑后期效应(即合成实验结束后的遗留效应)。因此,我们不仅要计算变更期,还必须包括后变更期。
# simulate ROAS media_1_roas = []
media_2_roas = []
media_3_roas = []burnin=500
for i in range(1000):
burnin=5
s = np.random.randint(1,1000-burnin)
intercept = t['intercept'][s]
s_sample1, s_sample2, s_sample3 = t['s'][:,0][burnin:][s], t['s'][:,1][burnin:][s], t['s'][:,2][burnin:][s]
k_sample1, k_sample2, k_sample3 = t['k'][:,0][burnin:][s], t['k'][:,1][burnin:][s], t['k'][:,2][burnin:][s]
b_sample1, b_sample2, b_sample3 = t['beta'][:,0][burnin:][s], t['beta'][:,1][burnin:][s], t['beta'][:,2][burnin:][s]
a_sample1, a_sample2, a_sample3 = t['alpha'][:,0][burnin:][s], t['alpha'][:,1][burnin:][s], t['alpha'][:,2][burnin:][s]
t_sample1, t_sample2, t_sample3 = t['theta'][:,0][burnin:][s], t['theta'][:,1][burnin:][s], t['theta'][:,2][burnin:][s]
fitted_m1 = [beta_hill(x, s_sample1, k_sample1, b_sample1) for x in carryover(media_1, a_sample1, L, theta = t_sample1, func='delayed')]
fitted_m2 = [beta_hill(x, s_sample2, k_sample2, b_sample2) for x in carryover(media_2, a_sample2, L, theta = t_sample2, func='delayed')]
fitted_m3 = [beta_hill(x, s_sample3, k_sample3, b_sample3) for x in carryover(media_3, a_sample3, L, theta = t_sample3, func='delayed')]
y_hat = intercept + fitted_m1 + fitted_m2 + fitted_m3 + t['lamb'][burnin:][s] * price_variable
y_hat_m1 = intercept + fitted_m2 + fitted_m3 + t['lamb'][burnin:][s] * price_variable
y_hat_m2 = intercept + fitted_m1 + fitted_m3 + t['lamb'][burnin:][s] * price_variable
y_hat_m3 = intercept + fitted_m1 + fitted_m2 + t['lamb'][burnin:][s] * price_variable media_1_roas.append(sum(y_hat[L:]-y_hat_m1[L:]) / media_1[L:len(media_1)-L].sum())
media_2_roas.append(sum(y_hat[L:]-y_hat_m2[L:]) / media_2[L:len(media_1)-L].sum())
media_3_roas.append(sum(y_hat[L:]-y_hat_m3[L:]) / media_3[L:len(media_1)-L].sum())
优化营销预算
最后,我们继续优化预算。为了做到这一点,我们采用我们的模拟 ROAS 数,并将其转化为一个约束优化问题。
为了实现这一点,我们可以将我们的 ROAS 数字插入到一个 SciPy 优化函数中,以找到我们的销售额最大化的支出。
摘要
本文探讨了与介质混合建模相关的许多方面,重点是遗留物和形状效应,但也提供了贝叶斯模型的规范,并探讨了它在合成数据集上恢复真实模型参数的有效性以及先验和样本大小的影响(未涵盖)。
下一步,我会发现有趣的是,如何用这个模型做出决策,不仅最大化销售,而且最大化模型的“知识”。我们可以认为这是强化学习中的“探索”阶段。
Carto vs Kepler.gl:位置分析选择哪种工具?
原文:https://towardsdatascience.com/carto-vs-kepler-which-tool-to-use-for-geospatial-analytics-894c867545b4?source=collection_archive---------25-----------------------
地理空间分析和洞察
不同用例的地理空间工具的比较
开普勒
工具的简要介绍
Carto 和 Kepler.gl 是公司在分析中用来做出地面运营决策的工具。在这篇文章中,我们从技术到目标用户等方面对它们进行了比较。
开普勒
开普勒
Kepler.gl 是一个基于网络的平台,用于可视化大规模位置数据。它由优步大学的可视化团队创建并开源,其使命是创建行业级开源框架来增强大数据。
三维电解剖标测系统
三维电解剖标测系统
Carto 是一个基于 PostGIS 和 PostgreSQL 的开源位置情报平台。CARTO(以前称为 CartoDB)是一个软件即服务(SaaS)云计算平台,提供 GIS、web 制图和空间数据科学工具。
Locale.ai
locale.ai
在 Locale.ai ,我们正在为按需公司的供应和运营团队建立一个使用位置数据的运营分析平台。类似于 web 分析工具(Google Analytics、Mixpanel、Clevertap)使用点击流数据对 web 产品进行分析,Locale 有助于使用地理空间数据分析和优化您的现场操作。
比较
此图简单展示了三种工具在不同特性或参数上的比较。本节将深入探讨所有参数。
比较汇总表
1-分析和可视化
开普勒
开普勒是探索性数据分析(EDA)的最佳地理空间可视化工具之一。优步团队已经对与移动公司相关的可视化特性做了彻底而详细的研究。
它最大的缺点之一是任何需要对数据进行的处理都需要在外部完成。不幸的是,Kepler.gl 是一个桌面工具,只接受 CSV、JSON 和 geoJSON 文件形式的数据。
当您处理大量数据并需要不断下载 CSV 以绘制到工具上时,这些特征会使您非常痛苦
三维电解剖标测系统
Carto 的可视化和分析能力更加水平,在他们作为一家公司处理的用例上撒下一张大网,其中包括不同种类的过滤器和小部件。它们在产品内部也有几个内置的分析(帮助你操作数据的预置函数)。
这里的缺点是,所有这些分析一次只能在一个数据集上进行。因此,这里的预处理也需要在系统之外进行,尤其是在更复杂的数据集的情况下。
现场
在现场,我们试图包括两个世界的最好的。我们从开普勒获得了可视化的灵感,并在产品中加入了分析——不是作为功能,而是作为用例。我们还跨不同的数据库、格式和系统接收您的所有数据,将其放在一个位置并建模,以便能够非常容易地进行这些分析。
三维电解剖标测系统
2-目标人物角色
开普勒
Kepler.gl 主要面向商业用户,由于其简单性,他们根本不知道如何编写代码或 SQL。然而,我们已经看到谷歌和 Airbnb 的大量数据科学家将它用于可视化。
三维电解剖标测系统
Carto 被定位为一个位置智能平台,具有数据分析和可视化的能力,不需要以前的 GIS 或开发经验。他们的 UX 是根据现代 web 开发人员和数据科学家的需求定制的。他们的可视化可以被商业用户用来做决定。
现场
我们在现场的目标用户也是业务用户——公司内部的供应和运营团队、产品团队、战略团队和营销团队。我们发现他们是最痛苦的人,大部分时间都在使用 excel 表格。他们仍然依赖分析师提供 BI 报告,或者依赖开发人员提供实时仪表盘。
3-目标行业
开普勒
如前所述,由于开普勒已经被优步开源,它的许多功能与移动公司更加相关。它也被学者和记者大量使用,因为他们不处理大量的数据直播。
三维电解剖标测系统
由于 Carto 更像一个平台,他们最终与各种各样的客户合作,从政府到金融、医疗保健到物流。
现场
我们认为我们的市场是供应和/或需求不断变化的每一家公司。这包括按需交付、微移动、物流、供应链以及劳动力公司。
开普勒
4-使用案例
开普勒
Kepler.gl 主要用于地理空间可视化。开普勒上已经建立的地图的一些例子是:
- 加州地震
- 纽约出租车之旅
- 旧金山海拔等高线
- 纽约市人口
- 旧金山街道树木地图
三维电解剖标测系统
Carto 涉足的用例有:
- 场地规划:推动场地选择和投资决策
- 物流优化:优化供应链设计
- 地区优化:协调销售和服务地区
- 地理营销:根据用户的位置和移动方式锁定用户&
- 移动性规划:更好的基础设施决策&减少流量
现场
我们在现场处理的用例有:
- 生命周期分析:对用户、骑手或订单旅程的分析,以减少掉线。
- 供需分析:分析需求(订单)和供应(骑手)的不匹配,减少闲置时间。
- 行程分析:分析行程和移动以提高利用率。
- 单次行程分析:根据运动模式创建单个用户、自行车或行程的简档。
- 站址分析:分析静态(或固定)实体的性能。
5-技术
开普勒
Kepler.gl 中有四个主要套件可供使用——Deck、Luma、React map 和 React vis——来制作漂亮的数据驱动地图。它是用 deck.gl 构建的和利用 WebGL (一个 JavaScript API)更快更高效地渲染大数据。
三维电解剖标测系统
Carto 的网络应用程序名为 Builder,用户可以在其中管理数据,运行用户侧分析和设计定制地图。CARTO 引擎是一组 API 和开发人员库,用于创建自定义地图和数据可视化界面。该工具在前端 web 应用程序、后端基于 rails 的 API 和客户端库中广泛使用 JavaScript。
现场
Locale.ai 使用各种强大的开源工具来处理前端和后端的大规模数据集。前端由优步的 Deck.gl 提供高性能可视化,Nebula.gl 提供额外的编辑功能,Mapbox-GL 用于渲染地图。
与其他平台不同,Locale 提供了实时和按需摄取大量数据的能力,以便动态地进行分析和获得洞察力。后端由 python、PostgreSQL 和 PostGIS 提供支持,用于强大的数据处理和地理空间操作。
内部构建
在与一些领先的按需和微移动公司合作时,我们观察到他们最终围绕开普勒本身或 QGIS 等开源工具进行黑客攻击。
有时开发人员也构建他们自己的内部工具,但大多数时候他们并不适合公司内部所有不同的受众,而且由于这些工具不是以可扩展的方式构建的,维护这些工具经常会占用他们大量的带宽!
很多时候甚至有重复的努力,轮子一遍又一遍地被重新发明。正如 Twilio 的杰夫·劳森所说
“构建软件比以往任何时候都容易,但操作软件却比以往任何时候都难”。
为什么选择区域设置?
因此,如果你是一家决定在内部构建这一平台的公司,它必须像一个平台一样构建,(很像优步的做法),并具有以下特征:
- 简单直观的用户界面来执行分析,特别是对于商业用户
- 具有可操作性的可扩展地理空间可视化
- ETL 足够健壮,可以处理流数据以及及时返回的历史分析
这需要建立一个至少 6-7 人的团队(由前端和数据工程师、地理空间分析师以及数据科学家组成)。最重要的是,等待至少 6 个月来构建平台和启动分析的额外痛苦。
如果你想进一步钻研,可以查看我们的 网站 出来或者在LinkedIn或者Twitter上与我取得联系。
原贴 此处 。
相似读数
[## 开普勒& QGIS:开源地理空间工具浅析
为什么我们需要地理空间分析?为什么现在比以往任何时候都重要?人类的大脑主要识别信息…
blog.locale.ai](https://blog.locale.ai/kepler-qgis-a-brief-analysis-of-the-open-source-geospatial-tools/) [## 在地理空间上弥合最后一英里递送公司的供需差距
当供需缺口存在时,我们要么失去订单,要么我们的骑手闲置-这两者都导致…
blog.locale.ai](https://blog.locale.ai/bridging-supply-demand-gaps-in-last-mile-delivery-companies-geospatially/)
卡通对峙:使用 Viola Jones 检测人类卡通人物
原文:https://towardsdatascience.com/cartoon-face-off-detecting-human-cartoon-characters-using-viola-jones-f805aa3c8e3b?source=collection_archive---------46-----------------------
《辛普森一家》、《南方公园》和《冰雪奇缘》中著名的人脸检测框架。
原始图像取自动画屏幕截图。
我为基于图像的生物统计学课程做的一个有趣的项目。所有的脚本和数据都可以在 这里找到 。
介绍
人脸检测是计算机视觉中一个广泛研究的领域。随着近年来神经网络的兴起,我们的模型现在可以产生几乎人类水平的性能。然而,神经网络并不是所有任务的答案。它们在计算上是昂贵的、复杂的并且严重依赖于训练数据集,训练数据集也需要足够大并且提供大的变化以防止过拟合。换句话说,有时我们只是没有足够的数据、时间、计算能力……或者坦率地说,我们只是不想处理这些。
因此,我们仍然发现自己使用传统方法来解决某些人脸检测问题。在本文中,我们回到 2001 年,回到可以说是第一个实时提供有竞争力的对象检测率的对象检测框架——Viola-Jones 框架。这个计算机视觉老计时器今天仍然在许多不同的应用中使用。它简单、快速,而且在实时检测人脸方面做得很好,所以如果它没有坏,为什么要修复它呢?在本文中,我们检查该框架如何面对检测非人类人脸的挑战。我们在卡通人物脸上测试了预训练的 Viola-Jones 分类器。
方法学
数据和预处理
我们截取了三部风格迥异的动画片的截图:《辛普森一家》、《南方公园》和《Frozen⁴.》对于每部漫画,我们随机选择了 70 张截图,如果这些截图包括人脸而不是卡通人物的脸(脸朝向相机,不应倾斜),我们认为这些截图将是合适的输入。
我们还对图像进行了预处理:为了减少 CPU 时间,我们将较大的图像的最大宽度调整为 700 px,并将它们转换为灰度,因为它们更容易处理,需要处理的数据也更少。为了能够正确评估我们的检测,我们使用了一个在线工具来注释我们的图像。
人脸检测
OpenCV 提供了预先训练好的 Viola-Jones 人脸分类器。我们对人脸使用正面人脸分类器,后来,为了改进我们的检测器,我们还使用人脸和眼睛分类器的组合——只有当这些分类器的检测区域相应地重叠时,我们才接受人脸检测。
检测器评估
对于每幅图像,我们以两种不同的方式评估我们的检测:
- 交集超过并集(IoU) ,在这里我们测量检测到的对象和地面真实之间的相似性。
- 与数据集中所有人脸的数量相比,计算误检测和正确检测。
结果
人脸检测示例。原始图片取自斯普林菲尔德!斯普林菲尔德!、动画屏保和 Frinkiac 。
我们使用带有默认参数的 Viola-Jones 正面人脸分类器。我们的脚本返回每个输入图像的 IoU 值。因为这些值不是正态分布,我们使用非参数 bootstrap⁵来说明 IoU 均值的不确定性。结果如下图所示。
IoU 和 95%自举百分位数置信区间。
由于我们的数据集相对较小,我们也可以用更直观的方式呈现结果。这很费时间,但是值得!底部的条形图让我们对分类器的性能有了更好的了解。它显示了每幅漫画的错误检测总数和正确检测总数与数据集中所有人脸总数的比较。
每幅漫画的错误检测总数和正确检测总数与数据集中所有人脸总数的比较。
毫不奇怪,该算法在冻结数据集上表现最佳。这部漫画的画风是最真实的,人物都有相配的五官,如眉毛、鼻梁等。虽然《辛普森一家》是一部关于(相关的)人类家庭的卡通片,但维奥拉-琼斯似乎不同意最后一部分。这些角色是以如此艺术的方式绘制的,以至于我们的算法在大部分时间里都在挣扎并优雅地失败了。还有,我们几乎从来没有看到他们“直接面对镜头”,这是 Viola-Jones 默认的问题。相反,南方公园的绘画风格非常扁平,大多数场景都包括直接“面对镜头”的人物。这使得算法的工作容易得多,即使他们的特征不太像人脸(大眼睛,小或不存在的鼻子和耳朵,怪异的头型),结果也令人惊讶地好。
最后,我们尝试通过结合 Viola-Jones 人脸和眼睛分类器来增强我们的检测器。我们在 IoU 最高的数据集(在我们的例子中是冻结数据集)上测试了它。我们注意到,平均 IoU 显著降低(平均从 0.46 降至 0.27),下图再次帮助我们理解结果,它显示了更详细的比较。
检测器的比较:冻结数据集上的人脸分类器与人脸和眼睛分类器的组合。
如果我们只关注 IoU 值,看起来面部分类器优于我们提出的方法,但是如果我们仔细观察,我们注意到通过使用分类器的组合,错误检测的数量显著下降,并且我们的检测器不容易出错,这在一些应用中也可能是期望的。因此,我们不能说分类器的组合导致更差的性能,这只是取决于用户的需求。
结论
快 20 岁了,但对一个老前辈来说还是很适合的!Viola-Jones 人脸检测器再次证明了它的鲁棒性,即使在“非人类”人脸上也表现出了不错的性能(但当然,只有在卡通人脸与人脸足够相似以使算法检测到典型的面部特征的情况下)。
这个有趣的小研究项目引出了更多的问题和想法!如果我们使用一些优化方法来确定分类器的最佳参数,我们可能会改进我们的结果。仔细观察每幅漫画的结果并试图确定最像人类的角色也是很有趣的,但我们需要更大的数据集才能确定。
[1] P. Viola 和 M. Jones,使用简单特征的增强级联进行快速目标检测 (2001),CVPR,2001 年
[2] 《辛普森一家》剧集截图,访问时间:2019–12–06
[3] 《南方公园》剧集截图,访问时间:2019–12–06(编辑:他们的服务器目前好像宕机了,你可以在网络档案馆上访问)
[4] 截图自《冰雪奇缘》,访问时间:2019–12–06
[5] B. Efron, Bootstrap Methods:再看 Jackknife (1979),统计年鉴
使用 TF-Agents 解决横向问题——构建您的第一个强化学习应用程序
原文:https://towardsdatascience.com/cartpole-problem-using-tf-agents-build-your-first-reinforcement-learning-application-3e6006adeba7?source=collection_archive---------46-----------------------
TF-agent 利用深度 Q-网络学习最优策略
强化学习是人工智能的一个新兴子领域,在一些应用中既酷又有效。这篇文章的前几段提到了强化学习,还有数百篇关于这个主题的介绍性博客文章。假设读者熟悉强化学习的概念,让我们使用 CartPole 问题创建我们的第一个强化学习应用程序。
横竿问题
信用:开放健身房
侧手翻问题就是平衡侧手翻的问题。CartPole 是一种结构,其中一根杆连接到车上,车可以在无摩擦的表面上自由滑动。通过向左或向右滑动手推车,手推车可以保持平衡。
目标
所以,翻筋斗的目的是防止它落下或移出射程。因此,故障条件为:
- 极点相对于垂直线的角度幅度超过某个阈值。
- 横竿离中心的距离超过了某个阈值。
为了让横滚继续无限多步,我们将步数限制在某个值(在我们的例子中是 200)。
为了让步骤和情节之间的区别更加清晰,我引用前面提到的博客中的摘录:
这里值得一提的是第集第步。一集是一个游戏的实例(或者游戏的生命)。如果游戏结束或生命减少,该集结束。另一方面,步长是在情节中单调增加的时间或某个离散值。随着游戏状态的每次改变,步骤的值增加,直到游戏结束。
环境
一般来说,环境是主体执行动作的环境或设置。在这里,横竿环境是横竿和横竿运作的环境。环境由重置功能、下一步生成器(基于当前状态和动作)、动作说明、状态说明和其他辅助功能组成。我们不需要像在之前的博客中那样创建一个定制的环境。我们通过 TF-Agents 使用 OpenAI gym 中可用的环境。TF-Agents 的一个通用特性是它支持像 OpenAI Gym、Unity 的 ML-Agents 等现成的图书馆环境。
让我们使用套件 _ 健身房模块加载横拉杆环境。
国家、行动和奖励
那么,我们如何在 CartPole 环境中表示状态?磁极在某个位置(线性和角),它有一定的速度(也是线性和角)。因此,四个变量——线性位置、角位置、线速度、角速度——代表环境的状态。
让我们在重置环境后得到横竿的状态—初始状态。
它返回时间步长对象,该对象包含环境状态以及一些其他信息。我们稍后会谈到这一点,但现在,我们可以看到它如何给出当前状态。
动作是代理执行的活动。在这里,代理可以让购物车向右或向左走。所以,动作用 0 和 1 来表示。0 表示向左,1 表示向右。
含糊地说,奖励是代理人因执行良好行为而获得的好处或鼓励。就像一个学生因为取得好成绩而受到表扬一样,如果我们的代理商表现良好,我们也应该给予表扬。在这里,翻筋斗不倒下或出界应该得到奖励和鼓励。因此,对于每一个没有倒下或超出范围的掷骰子的例子,我们有+1.0 的奖励。
现在让我们对我们的环境采取一些行动,看看状态如何变化,奖励如何授予,以及情节如何结束。更重要的是,让我们了解什么是时间步长以及时间步长的组成部分是什么意思。
时间步长和实验
当我们运行 env 的 reset 方法时,我们得到了时间步长对象。我们先来了解这个对象是什么,包含了什么。
TimeStep 是包含状态信息的对象,如当前观察值、步长类型、奖励和折扣。给定在某个状态上执行的某个动作,它给出新的状态、新步骤(或状态)的类型、折扣和获得的奖励。在我们的 CartPole 环境中,有三种类型的步骤——一集的开始、一集的中间步骤和一集的最后步骤。当一集开始时,该步骤的类型为 0,并在该集结束前变为 1。在剧集的最后一步,该步骤的类型变为 2。这有助于了解该步骤是否是最后一步。折扣是一个参数,它给出了后一个奖励相对于前一个奖励的重要性比率。奖励是对达到当前步骤的奖励。
最初,我们运行重置方法,并获得时间步长,这给出了当前观察值。我们看到 step_type 为 0 ,显然没有收到奖励。
让我们连续对其应用动作 1 (向右移动)并查看该集何时结束。
结果显示在下面的熊猫数据框 df 中。
显示每个步骤的时间步长值的表格
我们在这里看到,在 10 步之后,这一集结束了。可以猜得很好,总是右动的政策不好。
让我们看看随机向左或向右移动。如果代理从可能的动作列表中采取随机动作,则该策略称为随机策略。
平均步骤数比我们尝试的仅右策略多一倍左右,但是不,这并不好。
培训架构
TF-Agents 培训项目的培训架构通常由两部分组成:采集部分和培训部分。收集部分使用驱动程序来收集轨迹(经验),训练部分使用代理来训练网络。网络一度训练更新收集政策。在解释培训架构时,我们将讨论收集策略。
TF-agent 的典型训练架构(来源:Scikit-Learn、Keras 和 TensorFlow 的上机学习,第 2 版,Aurelien Geron(第 18 章:强化学习))
我们已经讨论了环境、时间步长和行动。让我们一个一个地讨论与我们的横竿问题有关的各个部分。
环境
我们创建了两种不同的环境:用于培训的培训环境和用于评估的评估环境。这是正常情况,因为培训可能需要多种环境和比评估环境更多的资源。
DQN 代理商
现在让我们创建深度 Q-网络代理。代理从重放缓冲器中取出一批轨迹,并训练 Q-网络。我们创建一个 Q 网络( q_net )并将其传递给代理。与网络一起,我们通过时间步长和动作规范列车环境、优化器、损耗和列车步数计数器。
策略和收集策略
在深度强化学习环境中有两种类型的策略。策略是用于评估和部署我们的模型的策略,而收集策略是用于创建轨迹/体验的策略。基于收集策略,驱动程序执行动作并生成轨迹。轨迹简单来说就是经历。它们由当前步骤、奖励和当前下一步组成。它们的批次用于训练网络。
为了用一些轨迹填充重放缓冲区,以便在训练之前帮助评估一次代理的策略,我们利用随机策略并预先收集数据。
此外,让我们创建实用函数来计算平均回报并收集重放缓冲区中的数据。在此之前,让我们运行一下重放缓冲区。重放缓冲器是存储轨迹的缓冲器。从中提取批次轨迹来训练 Q 网络。当从重放缓冲区以随机方式创建批次时,训练轨迹是相同且独立的,因此有助于使用梯度下降算法的训练过程。
现在,来自重放缓冲区的数据被转换为 iterableTF . data . dataset管道,并将被提供给代理。
这里, num_steps 被设置为 2 ,因为我们需要两个观察值来计算损失。将 num_steps 设置为 2 会对批次中每个项目的两个相邻行进行采样。并行调用和预取优化了数据集。
培养
由于我们已经构建了所有组件,现在让我们来培训我们的代理。在训练之前,让我们定义我们的超参数。
num_iterations 是我们将要进行的训练的迭代次数。collect _ steps _ per _ iteration是我们将在每次训练迭代中执行的收集步骤数。我们将其设置为 1,因此在训练开始时只有一个单独的集合步骤。 replay_buffer_max_length 是重播缓冲器的最大长度。它是在可用内存的基础上保存的。 batch_size 是供给代理的一批轨迹的大小。 learning_rate 是 Adam 优化器的学习速率。 log_interval 是记录训练损失的间隔, eval_interval 是使用平均回报率评估算法的间隔。num _ eval _ epites是我们用来计算平均回报的剧集数。
我们现在开始训练吧。
希望平均回报保持增长,直到饱和在 200 步左右(这是每集允许的最大步数)。
恭喜你!你用 TF-Agents 训练了你的第一个强化学习算法。拿一杯你最喜欢的饮料。你应得的!
惠特尼·赖特在 Unsplash 上拍摄的照片
形象化
现在让我们来想象一下训练过程。我们看到的是平均回报而不是损失的趋势,因为平均回报是我们的目标,而不是损失。更好地了解政策和损失可能并不总是齐头并进。当代理探索新的空间时,它可能仍在学习,但损失可能会增加。类似地,当代理人长时间被困在某个空间时,损失可能会减少,但策略不是广义的策略,即过度拟合。
我们学习过的代理的平均回报与迭代
我们在这里看到,在 5000 集之后,平均奖励在 200 左右饱和。呜哇!
在活动
现在,让我们看看我们的代理如何使用我们刚刚学到的最优策略。
由于培训和评估是在 Jupyter 实验室进行的,下面给出了显示评估视频的代码片段。
现在,我们的代理人在 CartPole 环境中表演的视频附在下面。
由于我们将最大步数保持在 200 的范围内,代理并不关心如何平衡它,使它能够支持超过 200 步数。所以,我们看到它在接近 200 级台阶时会下降。我们可以通过增加最大步数的限制或者根据线性和角位移给予不同的奖励来解决这个问题。
怎么会。酷毙了。是。它?
希望这篇文章能给读者一些关于强化学习及其使用 TF-Agents 实现的想法。TF-Agents 通过使培训体系结构的组件模块化、灵活和容易获得,使许多事情变得更容易。在接下来的日子里,我们将探索更多的强化学习环境和问题。敬请期待!
级联相关,一个被遗忘的学习架构
原文:https://towardsdatascience.com/cascade-correlation-a-forgotten-learning-architecture-a2354a0bec92?source=collection_archive---------22-----------------------
1990 年第一个“深度学习”方法如何胜过经典神经网络。
1990 年,Scott E. Fahlman 和 Christian Lebiere 提出了一种动态神经网络架构,称为“级联相关”[1],在训练速度、准确性和规模方面优于静态神经网络。在最近的一次讲座中,法尔曼称之为第一种使用类似“深度”学习的方法。
利用这种算法,他们成功地完成了“双螺旋”分类任务和人工语法学习问题。
然而他们的工作在很大程度上被遗忘或者被当作历史的旁注。尽管这个想法本身在精神上非常接近我们现在所说的机器学习算法的‘助推’家族——在某些问题集上比深度学习表现更好的技术。这些方法——就像级联相关一样——都是基于这样的想法:通过堆叠专门的学习器,一次训练一个,来迭代地改进分类器。
有足够的理由去理解和实现 Fahlman 的方法——并在各种领域和挑战中对其进行测试!让我们调查它是否、在哪里以及如何仍然能够与现代机器学习工具竞争。
本文是关注(循环)级联相关系列文章的第一部分。
在第一部分中,我们将详细介绍如何使用 Python 和 PyTorch 实现一个简单的仅向前级联相关(简称 CasCor)网络。我们还将看到将它应用到一个简单问题领域的一些结果。
在接下来的部分中,我们将研究如何更好地自动化和优化算法。我们还将实现和训练它的一个递归版本,并根据标准的机器学习解决方案对 CasCor 进行基准测试。
要阅读本文,您应该熟悉如何使用损耗梯度的反向传播来训练神经网络(截至 2020 年,这是一种广泛使用的方法)。也就是说,您应该了解梯度通常是如何计算的,并应用于网络的参数,以尝试迭代实现损耗收敛到全局最小值。
第 1 部分:级联相关
事不宜迟,让我们实现一个简单版本的 CasCor!因为我们正在使用 Python,所以我们需要导入一些基础知识和 PyTorch:
概观
CasCor 算法从一层网络(只有输出神经元)开始。然后,它遵循以下步骤:
- 火车(仅限!)输出神经元,直到达到平台期
- 如果残差足够好,停止;
- 否则,冻结现有网络的所有权重
- 然后,通过优化其输出和最后测量的残差之间的相关性,训练一个新的隐藏神经元(见下文)
- 回到步骤 1——冲洗并重复
第四步。是 CasCor 最重要也是最复杂的部分,如下图所示。在训练完成之前,隐藏神经元与网络断开。我们静态地将所有原始输入和早期层的值作为加权和提供给它的激活函数。然后,训练算法优化神经元的权重,以实现其输出值与在早期迭代中测量的样本集残差的最佳可能相关性。
为了训练最佳相关性,我们将需要使用相关性度量来代替一些标准的损失函数,稍后会详细介绍。
训练完成后,我们可以将隐神经元加入到网络中。输出神经元现在将接收它的值作为额外的输入,我们需要训练它们的新权重,所以我们跳回到步骤 1。
CasCor 论文[1]以类似的方式说明了最终的网络(带有快捷方式)和添加隐藏神经元的过程:
添加新的隐藏神经元时,仅迭代新的权重(红色方块)。在这里,箭头是馈入描述激活函数的圆的加权和。(图片翻译自维基百科,2020)
在本文中,我们主要关注 CasCor 的两个主要部分:步骤 1。第四。,即训练输出和训练隐藏神经元。其余的我们将简单地手动完成。
测试装置
为了简单起见,我们使用 2D 分类任务进行测试(这样更容易调试)。因此,我们的网络将有 2 个输入维度(网格的坐标)和 1 个输出维度(介于 0 和 1 之间的值)。
我们将在以下数据集上进行训练(没有测试集),其中 0 值为黑色,1 值为白色:
为了将输入和输出实际输入到我们的训练函数中,我们还需要将它们转换成“长”形式,并添加一个静态偏置值 1。
此外,测试表明,当输入标准化时,CasCor 和 quickprop 的性能更好,所以我们也这么做吧。
快速推进
为了训练 CasCor 网络中的单元,他们使用了一种也被 Fahlman 在 1988 年发明的技术[2],叫做 quickprop。
Quickprop 是反向传播的一种替代方案,它使用了牛顿法的一种变体。除了原始论文之外,关于这方面的更多信息,Giuseppe Bonaccorso 的这篇有用的博客文章也很好地描述了这一点。
注意,quickprop 并不是实现 CasCor 所必需的。然而,为了贴近原文并最大限度地学习,我们也将在这里使用它。这本身就是一个有趣的话题,我鼓励你去研究它!
如果您对 quickprop 不感兴趣,请跳到下一节,将任何关于它的进一步提及简单地视为“基于给定输入的训练神经元权重&预期输出对”。
我们的实现是基于这篇博文的——但是由于我们不想在本文中关注 quickprop,我们将只看一下他们代码的一些调整,而不是深入研究数学。
灵活性。post 的代码使用了固定的激活和丢失函数,静态实现了它们的渐变。对于 CasCor,我们需要更灵活一点(至少在损失方面),所以我们将这些函数作为参数传递。
自动梯度计算。由于激活和损失函数现在是可变的,我们在试图建立它们的梯度时会遇到麻烦。但是,使用 PyTorch,我们可以轻松地跳过这一步,让autograd
来完成繁重的工作。
收敛。 Giuseppe 的代码测试每次迭代的权重变化,以确定收敛性。一些快速测试发现这很麻烦,因为它似乎经常陷入鞍点和局部最小值。所以不用这个,我们用残差。
具体来说,我们将计算残差的移动平均值,并检查每次迭代的平均值差异是否小于给定的tolerance
。
最后但同样重要的是,如果误差发散或收敛太慢,quickprop 在一定的迭代次数后干脆放弃(它用完了patience
,见函数参数)。
输出训练
随着 quickprop 的实现,让我们开始有趣的部分吧!
CasCor 从一层网络开始,即我们将使用单个输出神经元,并将其连接到我们的输入(和偏置)。为了开始训练这个神经元,我们获取输入(x
)和输出(y
)样本集,并创建新初始化的(随机)权重,所有这些都输入到 quickprop 中。
注意,这种方法并不关心网络是单层的还是更深层的——因为我们只是训练输出权重,我们也可以通过多个隐藏层运行输入,并将其用作训练的 *x*
。
让我们用训练集来测试一下。
简单的看起来不错!
不出所料,这不是很匹配,因为我们只训练了一个单位。但就目前而言,这是一个足够好的近似值。
隐藏神经元训练
正如我们所看到的,我们简单的单神经元模型近似第二种形状,有相当大的误差。为了达到更好的拟合,我们需要添加隐藏层。当我们添加一个隐藏的神经元时,我们:
- 冻结所有其他参数(包括输出)
- 通过网络向前运行训练样本,并使用输入值和其他隐藏单元值作为新单元的输入
- 训练新神经元,使其值与先前运行中计算的残差最佳相关
协方差函数 S(我们将用它来代替相关性;关于[1]中的更多细节由下式给出:
其中 phi 是神经元的激活函数,V 是它的值,E 是残差(较早的预测减去实际目标)。条形项是平均值,o 和 p 分别是输出值和样本的指数。
有了这个“损失”函数,我们可以简单地再次运行 quickprop。
请注意,事后看来,在这里使用 quickprop 有点危险,因为它使用了二阶导数的近似值。这不是一个好的解决方案,因为 S 的一阶导数由于幅度计算而不是连续的。在 CasCor 的论文中,Fahlman 等人实际上使用梯度上升来训练神经元。
让我们用上一个样本集的单层网络预测(pred
)来运行这个!
这很好地向我们展示了目前误差最大的地方(第一张图中非常暗或非常亮的点)以及神经元试图与之相关的事情(第二张图)。
组合隐藏和输出神经元
作为(本文的)最后一步,我们现在再次训练我们的输出层,另外基于我们新训练的神经元计算的值(neuron_value
)。为此,我们需要将这些值作为输入包含到输出神经元中(x2
)。
漂亮!
输出神经元现在可以近似该形状,因为它可以将其回归基于隐藏神经元的附加值。由于这与我们从早期优化中得到的误差相关,添加它具有将输出神经元必须解决的问题减少一维的效果。
警告
所有的图片都是执行代码片段的结果,然而,你看不到的是它们在生成这些图片之前的运行频率。特别是,训练神经元仅以非常低的概率收敛到产生显示值的权重,即,我必须运行算法几次,直到我得到特定的输出。
这可能部分归因于此处 quickprop 的使用,因为它依赖于损失函数的一些性质,如在其一阶导数中连续。正如我上面提到的,法尔曼等人。艾尔。实际上在[1]中使用梯度上升来训练隐藏的神经元。
但是 quickprop 有更多的问题,上面的简单实现没有正确解决。从 Fahlman 的论文[2]和另一篇更近期的 quickprop 与反向传播的比较[3]中可以清楚地看出,a)它需要更多的调整才能更可靠地产生好的结果,b)它并不是在所有领域都表现得一样好。具体来说,在一些现实世界的图像分类问题中,它无法在偏差和方差上与 back-prop 竞争。
也就是说,使用标准反向传播和 Adam 优化器训练的可比网络结构(1 个隐藏,1 个输出神经元)在测试运行期间甚至从未收敛到上述结果(它需要至少一个其他神经元来收敛到该结果),但这可能是坏运气,因为它不是受控的测试设置。
CasCor 的另一个问题是网络的厚度与深度。由于 GPU 可以非常有效地处理矩阵,因此与较薄和较深的网络(如 CasCor 默认生成的网络)相比,通过深度较浅(即可以更好地表示为矩阵)的较宽网络运行会更快。对于我们的小例子来说,这当然不是太大的问题,但当生成的网络解决更复杂的任务时,这可能会成为一个问题。
这就把我们带到了下一部分。
未来的改进
正如我们所看到的,CasCor 的这个基本实现实际上是可行的!😃
然而,我们仍然缺少许多使过程自动化的样板代码,以及训练方法的一些优化,以更高的概率找到全局最优。
这就是为什么,在本系列的下一部分,我们将看到我们如何:
- 自动化输出- >隐藏- >输出- >隐藏- > … 训练循环
- 更改 quickprop 以提供更稳定的结果,并训练一组新节点,而不是只有一个(并选择最好的)
- 进一步改进该流程以选择多个节点(即具有“更宽”的层)
- 将问题域转换为更有趣/更具挑战性的问题域(例如,只能通过更深层次和/或循环网络解决的问题域)
- 在一个受控的环境中,将其与其他机器学习方法进行比较
如前所述,Quickprop 本身值得更详细的研究。出于这个原因,我写了一篇更深入的文章,涵盖了它背后的数学原理、可能的实现和一些改进。
该系列的第 2 部分目前正在进行中,当它发布时将链接到这里。
该系列所有成品笔记本和代码也在 Github 上。请留下反馈并提出改进建议。
如果你想支持这篇和类似精彩文章的创作,你可以注册一个中级会员和/或关注我的账户。
[1] S. E. Fahlman 和 C. Lebiere,《级联相关学习架构》 (1990),神经信息处理系统的进展(第 524–532 页)
[2] S. E. Fahlman,反向传播网络学习速度的实证研究 (1988),卡内基梅隆大学计算机科学系
[3] C. A. Brust,S. Sickert,M. Simon,E. Rodner 和 J. Denzler,既不快速也不适当——学习深度神经网络的 QuickProp 的评估 (2016),arXiv 预印本 arXiv:1606.04333
案例研究:使用支持向量机的乳腺癌分类
原文:https://towardsdatascience.com/case-study-breast-cancer-classification-svm-2b67d668bbb7?source=collection_archive---------18-----------------------
创建一个模型,根据肿瘤特征预测患者是否患有乳腺癌
由彼得·波恰在 Unsplash 上拍摄
在本教程中,我们将创建一个模型,根据几个肿瘤特征来预测患者是否有阳性乳腺癌诊断。
问题陈述
乳腺癌数据库是来自 UCI 机器学习知识库的公开可用的数据集。它提供了肿瘤特征的信息,如肿瘤的大小、密度和质地。
目标:创建一个分类模型,根据几个特征预测癌症诊断是良性还是恶性。
使用的数据:Kaggle-乳腺癌预测数据集
第一步:探索数据集
首先,让我们了解我们的数据集:
**#import required libraries** import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns**#import models from scikit learn module:** from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.svm import SVC**#import Data**
df_cancer = pd.read_csv('Breast_cancer_data.csv')
df_cancer.head()**#get some information about our Data-Set** df_cancer.info()
df_cancer.describe()**#visualizing data** sns.pairplot(df_cancer, hue = 'diagnosis')plt.figure(figsize=(7,7))
sns.heatmap(df_cancer['mean_radius mean_texture mean_perimeter mean_area mean_smoothness diagnosis'.split()].corr(), annot=True)sns.scatterplot(x = 'mean_texture', y = 'mean_perimeter', hue = 'diagnosis', data = df_cancer)
乳腺癌数据
关于数据集的一些信息
Data.describe()
乳腺癌数据的特征对图
特征之间的相关性
**#visualizing features correlation** palette ={0 : 'orange', 1 : 'blue'}
edgecolor = 'grey'fig = plt.figure(figsize=(12,12))
plt.subplot(221)ax1 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_texture'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_texture')plt.subplot(222)
ax2 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_perimeter'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_perimeter')plt.subplot(223)
ax3 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_area'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_area')plt.subplot(224)
ax4 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_smoothness'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_smoothness')fig.suptitle('Features Correlation', fontsize = 20)
plt.savefig('2')
plt.show()
第二步:缺失/分类数据的处理
- 在应用任何方法之前,我们需要检查是否有任何值丢失,如果有,就处理它们。在这个数据集中,没有丢失的值,但是始终保持检查数据集中的空值的习惯!
- 由于机器学习模型基于数学方程,我们需要对分类变量进行编码。这里我使用了标签编码,因为我们在“诊断”列中有两个不同的值:
**#check how many values are missing (NaN)** here we do not have any missing values
df_cancer.isnull().sum()**#handling categorical data** df_cancer['diagnosis'].unique()df_cancer['diagnosis'] = df_cancer['diagnosis'].map({'benign':0,'malignant':1})df_cancer.head()
让我们继续攀升我们的数据集:
**#visualizing diagnosis column >>> 'benign':0,'malignant':1** sns.countplot(x='diagnosis',data = df_cancer)plt.title('number of Benign_0 vs Malignan_1')**# correlation between features** df_cancer.corr()['diagnosis'][:-1].sort_values().plot(kind ='bar')
plt.title('Corr. between features and target')
计数图—相关性
第三步:将数据集分割成训练集和测试集
数据分为Train
组和Test
组。我们使用Train
集合让算法学习数据的行为,然后在Test
集合上检查我们的模型的准确性。
- 特性(
X
):插入到我们的模型中的列将用于进行预测。 - 预测(
y
):特征预测的目标变量。
**#define X variables and our target(y)** X = df_cancer.drop(['diagnosis'],axis=1).values
y = df_cancer['diagnosis'].values**#split Train and Test** from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=101)
第四步:数据建模——支持向量机
支持向量机(SVM) 是最有用的监督 ML 算法之一。它可用于分类和回归任务。
来源:研究之门/图
我们首先需要理解几个概念:
- SVM 的工作是什么?SVM 选择类之间分离最大的超平面。
- 什么是硬边距和软边距?如果数据可以线性分离,SVM 可能会返回最大的准确性(硬利润)。当数据不是线性可分的时候,我们需要做的就是放宽界限,允许错误分类 ( 软界限)。
- 什么是超参数 C?可以使用 C 参数控制误分类错误的数量,C 参数对超平面有直接影响。
- 什么是超参数伽玛? Gamma 用于对接近支持向量的点进行加权。换句话说,改变 gamma 值会改变超平面的形状。
- 什么是内核绝招?如果我们的数据不是线性可分的,我们可以应用“核技巧”方法,将非线性数据映射到更高维空间。
现在让我们回到我们的代码!
**#Support Vector Classification model** from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train, y_train)
第五步:模型评估
from sklearn.metrics import classification_report, confusion_matrixy_predict = svc_model.predict(X_test)
cm = confusion_matrix(y_test, y_predict)
sns.heatmap(cm, annot=True)
confusion_matrix
信息结果是什么意思?:
- 在我们的测试集中有 143 名女性。
- 在 55 名预测不会患乳腺癌的女性中,有两名被归类为没有患,而实际上她们已经患了(第一类错误)。
- 在 88 名预测患有乳腺癌的女性中,14 名被归类为患有乳腺癌,而她们并没有(第二类错误)。
这个分类报告结果意味着什么?基本上,这意味着 SVM 模型能够以 89%的准确率将肿瘤分为恶性和良性。
注意:
- 精度是相关结果的分数。
- Recall 是所有相关结果中被正确分类的部分。
- F1-得分是精确度和召回率之间的调和平均值,范围在 0(糟糕)到 1(完美)之间。
第六步:我们能做些什么来改进我们的模型?
1。数据标准化
特征缩放将帮助我们从相同的镜头(相同的比例)看到所有的变量,这样我们将把所有的值带入范围[0,1]:
**#normalized scaler - fit&transform on train, fit only on test** from sklearn.preprocessing import MinMaxScaler
n_scaler = MinMaxScaler()X_train_scaled = n_scaler.fit_transform(X_train.astype(np.float))
X_test_scaled = n_scaler.transform(X_test.astype(np.float))**#Support Vector Classification model - apply on scaled data** from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train_scaled, y_train)from sklearn.metrics import classification_report, confusion_matrix
y_predict_scaled = svc_model.predict(X_test_scaled)
cm = confusion_matrix(y_test, y_predict_scaled)
sns.heatmap(cm, annot=True)print(classification_report(y_test, y_predict_scaled))
混淆矩阵信息结果是什么意思?:
- 我们的测试中有 143 名女性
- 在 55 名预测未患乳腺癌的妇女中,4 名妇女被归类为未患,而实际上她们患了(1 型错误)
- 在 88 名预测患有乳腺癌的妇女中,7 名被归类为患有乳腺癌,而她们并没有(2 型错误)
SVC 模型的结果-缩放数据集
W 这个分类报告结果是什么意思?基本上,这意味着 SVM 模型能够以 92%的准确率将肿瘤分为恶性/良性。
2。SVM 参数优化
C 参数 —如我们所说,它控制着Train
数据上错误分类的成本。
- 较小的 C: 较低的方差但较高的偏差(软裕度)并降低误分类的成本(较少的惩罚)。
- 更大的 C: 更低的偏倚和更高的方差(硬边际)以及增加误分类的成本(更严格)。
Gamma:
Gamma 越小:方差越大,到达距离越远,解越一般化。
更大的 Gamma: 高方差低偏倚,接近到达,也更接近的数据点具有更高的权重。
因此,让我们使用网格搜索找到模型的最佳参数:
**#find best hyper parameters** from sklearn.model_selection import GridSearchCVparam_grid = {'C':[0.1,1,10,100,1000],'gamma':[1,0.1,0.01,0.001,0.001], 'kernel':['rbf']}grid = GridSearchCV(SVC(),param_grid,verbose = 4)
grid.fit(X_train_scaled,y_train)grid.best_params_
grid.best_estimator_grid_predictions = grid.predict(X_test_scaled)
cmG = confusion_matrix(y_test,grid_predictions)
sns.heatmap(cmG, annot=True)print(classification_report(y_test,grid_predictions))
使用 SVC 模型的结果(缩放数据+最佳参数)
如您所见,在这种情况下,最后一次模型改进并没有产生正确的百分比。然而,我们成功地减少了第二类错误。
我希望这有助于你更好地理解这个话题。欢迎任何反馈,因为它让我获得新的见解,并纠正任何错误!
自动取款机现金需求预测
原文:https://towardsdatascience.com/cash-demand-forecasting-for-atms-6113dd45fb2d?source=collection_archive---------29-----------------------
我努力为任何一款 lvl 的 DS 提供端到端的解决方案
Nikita Lazarionok 的图片
介绍
在这个主题中,我想向您展示一个端到端的解决方案。两周前在明斯克有一场由白俄罗斯银行代表领导的黑客马拉松。总共有 3 个任务,其中一个必须解决。对我来说,自动取款机上的现金需求任务是最有趣的,我想分享一下我的解决方案。
工作
需要预测各种自动取款机的每日现金需求量。数据是匿名的,特定 ATM 的操作时间以小时为单位,位置靠近主要城市设施(地铁、大型购物中心、企业检查站等)。)以及它属于哪个类似的无名城市。还会有用户贡献的金额报告。应该注意的是,如果在足够长的一段时间内没有对给定自动柜员机的需求(目标变量为零),那么,可能当时它由于这样或那样的原因而不工作。SMAPE 将被用作度量标准。
目标
此任务的目标是预测在要求的日期需要存入自动柜员机的现金金额。
计划
解决这样一个问题的计划很简单:
- 熊猫的 EDA 分析
- 数据编码
- RF (sklearn)模型和 XGBoost 模型
- 自定义搜索参数
- 创建最终模型
导入,设置
import numpy as np
import pandas as pd
import pickle
import warnings
import xgboost as xgbfrom sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import LabelEncoderpd.set_option('max_columns', 105)
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=DeprecationWarning)
了解数据
总共提供了 3 个数据集:每个自动柜员机的参考书、交易活动以及带有目标的数据集。但是,既然这种竞争的条件之一是对未来时期的预测,那么,相应地,我们将无法考虑并从交易活动中获得必要的信息。这会导致我们接受再培训,这并不好。因此,考虑剩下的 2 个数据集。
首先是一本参考书。
active_atms_lookup = pd.read_csv('active_atms_lookup.csv', delimiter=',')
active_atms_lookup.head()
Nikita Lazarionok 的图片
我们看到的:只有 4 列,如自动柜员机的 ID、类别、工作小时数和所在城市。
让我们检查一下是否有空值。
active_atms_lookup.isna().sum()
Nikita Lazarionok 的图片
原来我们只有 6 台 ATM 的信息,但是我们不知道它们。让我们移除它们。
active_atms_lookup = active_atms_lookup[~active_atms_lookup['TID_anon'].isna()]
让我们试着从这个指南中分离出尽可能多的信息,以便它能帮助我们在将来改进我们的结果。在这种情况下,我们可以将小时数带入值[0;1],我们立即通过 LabelEncoder 和 Pandas 编码器对分类特征进行编码。
active_atms_lookup['working_hours'] = active_atms_lookup['working_hours'] / 24active_atms_lookup["atm_category"] = active_atms_lookup["atm_category"].astype('category')
active_atms_lookup["city_anon"] = active_atms_lookup["city_anon"].astype('category')active_atms_lookup["atm_category"] = active_atms_lookup["atm_category"].cat.codes
active_atms_lookup["city_anon"] = active_atms_lookup["city_anon"].cat.codeslb = LabelEncoder()
active_atms_lookup['DEVICEID_anon_code'] = lb.fit_transform(active_atms_lookup['DEVICEID_anon'])filename = 'atm_encoder.sav'
关键时刻-考虑一个带有目标变量的数据集。
train_target = pd.read_csv('train_target.csv', delimiter=';')
train_target.head()
Nikita Lazarionok 的图片
让我们将每个自动柜员机的值分组,看看是否有负值或零值。
train_target.groupby('DEVICEID_anon')['target'].sum().reset_index().sort_values('target')
Nikita Lazarionok 的图片
原来有这样的自动取款机。让我们移除它,在未来,为了形成预测,我们将移除它。
train_target = train_target[train_target['DEVICEID_anon'] != 'ATM_615']
现在,让我们结合我们的数据集,并做一些进一步的转换。
train_target = train_target.merge(active_atms_lookup, on=['DEVICEID_anon'])
train_target.head()
Nikita Lazarionok 的图片
我们有个约会。我不想用这种形式寄它。让我们从中提取所有信息:日、月、年等。让我们进行一些额外的转换,例如选择十年、一个周末或一个工作日。
train_target['POSTINGDATETIME'] = pd.to_datetime(train_target['POSTINGDATETIME'])train_target['HOUR'] = train_target['POSTINGDATETIME'].dt.hour
train_target['DAYOFWEEK'] = train_target['POSTINGDATETIME'].dt.dayofweek
train_target['QUARTER'] = train_target['POSTINGDATETIME'].dt.quarter
train_target['MONTH'] = train_target['POSTINGDATETIME'].dt.month
train_target['YEAR'] = train_target['POSTINGDATETIME'].dt.year
train_target['DAYOFYEAR'] = train_target['POSTINGDATETIME'].dt.dayofyear
train_target['DAYOFMONTH'] = train_target['POSTINGDATETIME'].dt.day
train_target['NAME_WEEKOFYEAR'] = train_target['POSTINGDATETIME'].dt.day_name()
train_target['WEEKOFYEAR'] = train_target['POSTINGDATETIME'].dt.weekofyeartrain_target['WORKDAY'] = train_target['NAME_WEEKOFYEAR'].apply(lambda x: 0 if x == 'Saturday' or x == 'Sunday' else 1)train_target.reset_index(inplace = True)
train_target.drop(['index'] , axis = 1, inplace = True)train_target['POSTINGDATETIME'] = train_target['POSTINGDATETIME'].dt.strftime('%Y-%m-%d')train_target = train_target.drop(['NAME_WEEKOFYEAR'], axis = 1)train_target = train_target.replace([np.inf, -np.inf], np.nan)
我们应该受到祝贺。我们会对这些数据做任何我们想做的事情。
建模和评估
让我们从度量开始。在这项任务中,使用了 STAPE 度量。一方面,使用这个指标,你可以很容易地向企业解释这个或那个机器学习模型是如何表现的,这很好。另一方面,在我们有一个目标变量= 0 的情况下,它会导致问题,因为我们以这样一种方式调整我们的算法,它猜测 0 而不是零值。
SMAPE 的公式是:
Nikita Lazarionok 的图片
这个公式的代码是:
def smape(actual, predicted):
return 100/len(actual) * np.sum(2 * np.abs(predicted - actual) / (np.abs(actual) + np.abs(predicted)))
对于这个任务,我只选择了两个模型进行评估:梯度推进和决策树。为什么是他们?因为我测试了很多不同的,这 2 个显示了最好的结果。
但是我们也不会用我们的数据进行测试。为了不满足过度拟合的事实,我们将使用时间序列交叉验证。
先说梯度提升。
data_for_modeling = train_target
data_for_modeling['POSTINGDATETIME'] = pd.to_datetime(data_for_modeling['POSTINGDATETIME'])
tscv = TimeBasedCV(train_period=360,
test_period=60,
freq='days')
for train_index, test_index in tscv.split(data_for_modeling,
date_column='POSTINGDATETIME'):
print(train_index, test_index)# get number of splits
tscv.get_n_splits()#### Example- compute average test sets score: ####
X = data_for_modeling[columns]
y = data_for_modeling['target']
from sklearn.linear_model import LinearRegression
import numpy as npscores = []
for train_index, test_index in tscv.split(X):data_train = X.loc[train_index].drop('POSTINGDATETIME', axis=1)
target_train = y.loc[train_index]data_test = X.loc[test_index].drop('POSTINGDATETIME', axis=1)
target_test = y.loc[test_index]
dtrain = xgb.DMatrix(data_train, label=target_train)
dvalid = xgb.DMatrix(data_test)# if needed, do preprocessing here
watchlist = [(dtrain, 'train')]
model = xgb.train(xgb_pars, dtrain, 500, watchlist, early_stopping_rounds=500,
maximize=False, verbose_eval=15)
preds = model.predict(dvalid)
# accuracy for the current fold only
r2score = smape(target_test, preds)
print('SMAPE is ' + str(r2score))scores.append(r2score)# this is the average accuracy over all folds
average_r2score = np.mean(scores)
Nikita Lazarionok 的图片
老实说,我期待更好的结果。而当它们在不同的时间间隔分歧这么大的时候,那我们以后就不用了。然后我们将重点放在决策树上。
Nikita Lazarionok 的图片
这样好多了:)
但是我不认为这是建模的极限。因此,我们来调一下模型。
调谐
众所周知的调优方法,如 hoperopt 和 gridsearch,对于这样一个模型似乎并不十分重要。因此,我们将自己的调音称为“一步一步”。有什么意义?我们接受 n 个参数并开始迭代它们。一旦我们找到最好的,就采用+1 或+2 参数,以同样的方式进行。以此类推直到结束,直到参数用完。
这样调音的一个例子:
def random_forest(n_estimators, max_depth):
result = []
for estimator in n_estimators:
for depth in max_depth:
wmaes_cv = []
for i in range(1,5):
print('k:', i, ', n_estimators:', estimator, ', max_depth:', depth)
x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, test_size=0.3)
RF = RandomForestRegressor(n_estimators=estimator, max_depth=depth)
RF.fit(x_train, y_train)
predicted = RF.predict(x_test)
wmaes_cv.append(smape(y_test, predicted))
print('SMAPE:', np.mean(wmaes_cv))
result.append({'Max_Depth': depth, 'Estimators': estimator, 'SMAPE': np.mean(wmaes_cv)})
return pd.DataFrame(result)n_estimators = [56, 58, 60]
max_depth = [25, 27, 30]random_forest(n_estimators, max_depth)
Nikita Lazarionok 的图片
找到最佳参数后,我们可以保存模型并使用它。
import picklefilename = 'model_reg.pkl'
pickle.dump(RF, open(filename, "wb"))
结论
Nikita Lazarionok 的图片
在独立的数据集上,这样的模型显示了相当好的结果。落后于对手的差距往往只有几分之一。
需求会受到许多其他因素的影响,这些因素可以从互联网上收集:假期、各种经济形势、政治、天气等。如果我们学会考虑到这一点,我们可以保证结果有时会有所改善。
Nikita Lazarionok 的图片
我希望这篇文章对一个初学数据的科学家来说非常有用,并且有所帮助。
如果你喜欢这篇文章,请点赞:)
强化学习入门
原文:https://towardsdatascience.com/casual-intro-to-reinforcement-learning-4a78b57d4686?source=collection_archive---------49-----------------------
AWS DeepRacer 系列
对强化学习的直观解释
在 Unsplash 上由 Picsea 拍摄的照片
首先,我要感谢 Jakarta 机器学习和 AWS 让我有机会加入 AWS DeepRacer 新兵训练营。我一定会通过我的文章分享我在这次训练营的学习经历。所以,请继续关注并了解更多关于我的新兵训练营经历!
在这次训练营中,我和其他 8 名参与者将为 AWS DeepRacer 联赛做准备。对于那些不知道的人来说,AWS DeepRacer 基本上是一辆自主规模的赛车,AWS DeepRacer League 是第一个全球自主赛车联盟。
为了自主比赛,AWS DeepRacer 需要学习如何自己驾驶,就像职业赛车手驾驶自己的汽车一样。这种学习机制也类似于学步儿童学习如何走路。和前面的例子类似,AWS DeepRacer 也应用了这种学习的方法,称为强化学习。
什么是强化学习?
此时,你可能会疑惑强化学习是什么意思。简单来说,强化学习就是通过与环境互动来学习。它是主动的和顺序的,这意味着未来取决于早期的互动。除此之外,它指向一个目标,并且系统可以在没有最佳行为示例的情况下进行学习()。
对于自动驾驶汽车,你可能会问以下问题。
为什么我们不能给汽车编程,让它准确地知道在哪里左转和右转?
嗯*,学习有两个原因。首先,我们想找到以前未知的解。比如能打败人类象棋大师的程序。其次,我们想为无法预见的**情况找到解决方案。例如,一辆自动驾驶汽车可以在不同于任何已知轨道的轨道上行驶。*
换句话说,强化学习是从与环境的相互作用中学习做出决策的科学。这个概念被应用于许多领域,从计算机科学到经济学。
作者图片
几个特征使得强化学习不同于其他类型的学习。第一,没有没有监督,只给出奖励信号。它只是告诉你它有多喜欢一个决定,但并没有告诉你你必须做什么。另一个特点是反馈可以延迟,而不是瞬间获得。序列也很重要,因为之前的决定会影响之后的互动。
为了更好地理解强化学习,我们需要看一个决策问题的例子。一个例子是管理一个投资组合,其中你根据回报 ( 利润)做出决定。这个奖励可能是短期的,也可能是长期的,也就是说奖励是延迟的。此外,买卖顺序也会影响你的投资组合。它表明这是一个强化学习问题的例子。
强化学习的特征是奖励信号、延迟反馈和顺序。
核心概念
在理解强化学习时,有几个方面是我们必须知道的。他们是*****奖励信号和 代理人。代理还包括 代理状态 , 策略 ,**值函数 。***
代理和环境之间的交互可以描述如下。在每个时间步,代理接收观察和奖励,同时执行一个动作。另一方面,环境接收一个动作然后发出观察和奖励。**
奖励是一个反馈信号,表明代理在每个时间步做得有多好。代理人的工作是最大化从现在到未来的累计奖励。累计奖励也称为回报回报回报。这向我们展示了强化学习是基于奖励假设的。**
任何目标都可以被认为是回报最大化的结果。
现在,我要你考虑一下。你接受还是拒绝这个假设?
基于回报,我们还对值感兴趣,它是从现在开始的预期回报。“预期”一词意味着我们考虑到了未来回报发生的可能性。因此,代理的目标变为通过选择最佳行动最大化** 值。**
然而,行动可能会产生长期后果,奖励可能不会立即收到。在某些情况下,牺牲眼前的回报从长远来看可能是有益的。例如,一项金融投资可能需要几年时间,直到它变得非常有利可图,尽管它在开始时可能会有一些损失。
吉利在 Unsplash 上拍照
代理组件
一个代理的三个基本组成部分:代理状态、策略、和价值函数。
动作取决于代理的状态。一个状态可以被定义为用于确定接下来发生什么的信息。在最简单的情况下,只有一个状态。然而,根据具体情况,可能有许多不同的状态。例如,当我们想要购买食物时,我们会无意识地访问我们身体的状态,例如饥饿程度和食物偏好。****
从状态到动作的映射称为 策略 。策略根据代理的当前状态定义代理的行为。以我自己为例,每次下雨我都会想要一杯热巧克力。相反,我会在大热天喝一杯冰柠檬茶。换句话说,我的行为是由我的政策决定的,它将天气状况状态转化为我的饮料选择动作。
状态和政策决定代理人的行为,而 价值函数 计算预期回报或对未来回报的预测。它用于评估状态的可取性,以及哪些操作最有益。有时,使用折扣系数是很有用的,它权衡了即时回报和长期回报的重要性。低折扣系数意味着你只关心眼前的回报,反之亦然。**
虽然强化学习解决了很多决策问题,但是有一个问题叫做 剥削和探索 。剥削是指代理人利用已知的信息来最大化报酬。另一方面,探索正在寻找新的信息,希望获得更多的回报。
比如,在决定你想吃什么的时候,你可以认为奖励就是你的进食满意度。为了充分利用它,你可以选择吃你最喜欢的食物。或者,你可以尝试新的菜肴,寻找味道更好的东西。
照片由雷切尔·帕克在 Unsplash 拍摄
结论
简而言之,强化学习是指通过试错来学习,在此期间,代理人应该通过与环境的交互来发现一个使回报最大化的好政策。
参考
如果你想了解更多关于强化学习的知识,我建议你像我一样查阅这些资料。
- Hado van Hasselt 关于强化学习的讲座——课程 1:强化学习简介。
- 《强化学习:导论》( 2015 ),作者理查德·萨顿和安德鲁·巴尔托。
结束语
感谢您花时间阅读这篇文章!希望你能学到新的东西,能把这个理念融入到你的生活中。请务必关注我即将发表的关于强化学习和 AWS DeepRacer 细节的文章。我希望你有美好的一天!
关于作者
Alif Ilham Madani 是一名有抱负的数据科学和机器学习爱好者,他热衷于从他人那里获得洞察力。他在印尼顶尖大学Institut Teknologi Bandung主修电子工程。
如果你有任何要讨论的话题,你可以通过 LinkedIn 和 Twitter 与 Alif 联系。
数据团队的编目工具
原文:https://towardsdatascience.com/cataloging-tools-for-data-teams-8d62d7a4cd95?source=collection_archive---------16-----------------------
在 Unsplash 上由伊尼基·德尔·奥尔莫拍摄的照片
数据科学
介绍数据编目和数据团队可用于数据发现的主要工具
这篇文章最后一次更新是在 2021 年 10 月 12 日。
随着过去十年中各种数据存储和检索系统的激增,数据团队不得不处理许多数据源——所有数据源都用于特定的用例。这催生了 ETL 解决方案,它集成了高度异构的数据源、灵活、高度可伸缩的数据仓库和数据湖。由于有如此多的来源,将数据复制、转换和集成到几个目标中,数据系统变得相当复杂。也就是说,有像 Airflow 这样的工具来管理工作流编排,有工具来监控作业,等等。
数据发现对于数据科学家、数据分析师和业务团队来说至关重要
如果你认为将所有的数据整合到一个真实的来源,甚至多个来源就能完成任务,那么真相就离它不远了。根据一份报告,数据科学家至少有 50%的时间 寻找、清理和准备数据。数据科学家、数据分析师和业务团队经常发现很难找出数据的含义和来源,这两个问题在数据团队中都很常见。前者可以通过实现数据目录或数据字典来解决,后者可以通过实现数据沿袭解决方案来处理。
数据沿袭和数据编目都属于元数据管理的范畴。在本文中,我们将讨论市场上最流行、最有效的数据编目工具。我们将探索开源项目、专有软件和基于云的解决方案,这些解决方案总体上解决了数据发现、编目、沿袭和元数据管理的问题。
如今,数据系统高度异构,它们是多云、多源甚至多目标的。
开源数据目录
竞争者不多,但是活跃的竞争者做得很好,例如由一个政府组织发起并被许多人采用的 Magda T1。通过 Postgres 中的后端存储和 Elasticsearch 的搜索功能,Magda 提供了一个类似搜索引擎的界面来搜索您的数据。你可以在这里看到真实数据集的现场演示。
magda——开源数据目录
在 Magda 出现之前, CKAN 是主要的开源数据目录。事实上,玛格达也在引擎盖下使用 CKAN 的部分。加拿大政府和美国政府使用 CKAN 作为他们的元数据管理系统之一。
大约一年半以前,Amundsen 是这个领域的另一个有力竞争者。它已经被很多像 Workday 和 Asana 这样的大公司采用。与 Magda 不同,Amundsen 使用 neo4j 作为后端数据库来存储元数据,但使用 Elasticsearch 进行搜索。你可以在这里和冯涛的这篇博文中了解到阿蒙森的建筑。
[## 开源 Amundsen:一个数据发现和元数据平台
由冯涛,张金赫,塔米卡坦尼斯,丹尼尔获得
eng.lyft.com](https://eng.lyft.com/open-sourcing-amundsen-a-data-discovery-and-metadata-platform-2282bb436234)
谈谈 Lyft 在 DataCouncil 的 Amundsen。
还有许多其他开源工具,如 LinkedIn 的 DataHub、Airbnb 的 Dataportal 、网飞的 Metacat 、WeWork 的 Marquez 。您可以在本文中找到关于这些工具的好资源。
荣誉提名 — Spotify 尚未开源 Lexikon,但这里有一篇有趣的文章讲述了它如何为他们的数据科学家解决数据发现问题。
特定于云平台的数据目录
所有主要的云平台现在都有大量的服务可以提供。对于基于云的编排服务、数据管道和 ETL 解决方案,需要实现一个基本的数据编目组件。像 AWS Glue Catalog 和 Google Cloud Data Catalog 这样的大多数解决方案都使用了下面的 Hive Metastore 。微软在 Azure 数据目录中有自己的目录实现。
[## 数据目录:数据发现|谷歌云
发送反馈 Google Cloud Next '20: OnAir |了解数据目录中的新内容,聆听贝莱德的观点,现已在以下网站发布…
cloud.google.com](https://cloud.google.com/data-catalog)
不用说,这些工具在各自的云平台上与它们各自耦合的 web 服务配合得非常好,但是它们都具有有限的特性。它们不是为了元数据管理,而是为了确保它们有足够的数据来支持 ETL 操作、编排管道等等。可以把它们想象成您的数据库或数据仓库系统目录视图&带有一些附加信息的表。大概就是这样。
专有软件
考虑到商业性,许多公司已经为元数据管理构建了出色的成熟产品。 Atlan 、 Ataccama 和 Alation 是这个市场的一些主要参与者。市场上也有许多传统的参与者 Informatica 是其中最受欢迎的,以至于它在 2019 年的 Gartner 元数据管理解决方案魔力象限中被评为该行业的领导者。
根据客户的说法,专有软件在为企业使用做好准备、强大的技术支持以及产品增强方面领先于开源软件。他们通常有一个非常吸引人的用户界面和一个没有 bug 的代码库。所有这些显然都是随着钱而来的😄
结论
最后,值得重申的是,元数据管理是数据工程领域中较少被关注的问题之一——使用适当的工具进行元数据管理和数据发现可以使数据科学家、数据分析师和公司的业务用户的生活更加轻松,工作效率更高。确保您选择了适合您需求的正确产品!
CatBoost
原文:https://towardsdatascience.com/catboost-d1f1366aca34?source=collection_archive---------25-----------------------
梯度助推器
人迹罕至
当 XGBoost 和 LightGBM 在 Kaggle 竞赛中独领风骚时,另一个竞争者在 Yandex 诞生了,即来自俄罗斯的 Google。它决定采用较少读取的路径,并采用不同的方法进行梯度提升。在他们看来,他们试图解决世界上所有其他 GBM 中的一个关键问题。
来源: Unsplash
让我们来看看它的不同之处:
分类编码
让我们来看看赋予该算法名称的创新——CatBoost。与 XGBoost 不同,CatBoost 以本机方式处理分类变量。许多研究表明,一次性编码高基数分类特征并不是最好的方法,尤其是在基于树的算法中。和其他流行的选择都在目标统计的保护伞下——目标均值编码、留一编码等。
目标统计的基本思想很简单。我们用具有相同分类值的训练样本的所有目标的平均值来替换分类值。例如,我们有一个称为天气的分类值,它有四个值—晴天、雨天、多云和下雪。最简单的方法是所谓的贪婪目标统计,我们用天气“晴朗”的所有训练样本的目标值的平均值来代替“晴朗”。
如果 m 是我们正在编码的分类特征,mᵢ是 m 中的特定值,并且 n 是 M = mᵢ的训练样本的数量
但是当具有 mᵢ的样本数量太低或为零时,这是不稳定的。因此,我们使用朴素贝叶斯分类器中使用的拉普拉斯平滑来使统计更加稳健。
其中a0 为参数。 p (之前)的常见设置是数据集中的平均目标值。
但是这些方法通常会遇到所谓的目标泄漏,因为我们使用目标来计算分类变量的表示,然后使用这些特征来预测目标。留一编码试图通过排除计算表示的样本来减少这种情况,但并不是万无一失的。
CatBoost 作者在这里提出了另一个想法,他们称之为有序目标统计。这是受在线学习算法的启发,该算法按时间顺序获取训练样本。而在这种情况下,目标统计将只依赖于过去的训练实例。为了使这种想法适应标准的离线训练范式,他们想象了一个人工时间的概念,但随机排列数据集,并认为它们在本质上是连续的。
然后,他们仅使用在人工时间中特定样本之前出现的样本来计算目标统计数据。值得注意的是,如果我们只使用一种排列作为人工时间,它将不会非常稳定,为此,他们用多种排列进行编码。
有序升压
如论文作者所述,CatBoost 算法的主要动机是传统梯度增强模型中固有的目标泄漏,他们称之为预测偏移。高层的想法很简单。正如我们所知,任何梯度推进模型都是通过以加法方式在基础学习者上构建基础学习者来迭代工作的。但由于每个基础学习器都是基于相同的数据集构建的,作者认为存在一点目标泄漏,这会影响模型的泛化能力。根据经验,我们知道梯度增强的树有过度拟合数据的压倒性趋势。针对这种泄漏的唯一对策是像二次采样这样的功能,他们认为这是一种启发式的处理问题的方法,只能缓解而不能完全消除它。
作者形式化了提出的目标泄漏,并从数学上证明了它的存在。他们的另一个有趣的观察结果是,目标位移或偏差与数据集的大小成反比,即如果数据集很小,目标泄漏会更加明显。这个观察结果也与我们的经验观察结果一致,即梯度增强的树倾向于过度适应小数据集。
为了解决这个问题,他们提出了一种新的梯度增强方法,称为有序增强。这个想法的核心是非常直观的。以前梯度增强的主要问题是每次迭代都要重复使用相同的数据集。因此,如果每次迭代都有不同的数据集,我们就解决了泄漏问题。但是,由于没有一个数据集是无限的,这种想法,纯粹应用,将是不可行的。因此,作者提出了上述概念的实际实现。
它从创建数据集的 s+1 排列开始。这种排列是算法考虑的人工时间。姑且称之为σ₀到σₛ.σ₁到σₛ的排列用于构造树分裂,σ₀用于选择叶值 bⱼ.在没有多重排列的情况下,具有短“历史”的训练样本将具有高方差,因此具有多重排列缓解了该缺陷。
我们之前看到了 CatBoost 处理分类变量的方式,我们提到过在那里我们使用多种排列来计算目标统计数据。这被实现为 boosting 算法的一部分,该算法在任何迭代中使用从σ₁到σₛ的特定排列。使用采样排列计算树分裂所需的梯度统计和分类编码所需的目标统计。
一旦所有的树都建立起来了,最终模型 f 的叶值就可以通过标准的梯度推进过程(我们在以前的文章中看到过)使用置换σ₀.来计算当最终模型 F 被应用于来自测试集的新样本时,目标统计量是在整个训练数据上计算的。
需要注意的一点是,CatBoost 还支持传统的梯度增强,除了有序增强(Boosting _ type= 'Plain或' Ordered ')。如果是' Plain ',并且有分类特征,则仍然为目标统计创建排列,但是树构建和提升在没有排列的情况下完成。
被遗忘的树
CatBoost 在另一个关键方面也不同于其他鸟群——在它的整体中构建的树的种类。默认情况下,CatBoost 构建对称树或不经意树。这些是树,相同的特征负责将学习实例分成树的每一层的左和右分区。
这在算法中有双重影响-
- 正则化:由于我们将树构建过程限制为每层只有一个特征分裂,我们实质上降低了算法的复杂性,从而实现了正则化。
- 计算性能:任何基于树的算法中最耗时的部分之一是在每个节点搜索最优分割。但是,因为我们将每个级别的特征分割限制为一个,所以我们只需搜索单个特征分割,而不是 k 个分割,其中 k 是该级别中的节点数。即使在推断过程中,这些树也能让它快如闪电。据推断,它比 XGBoost 快 8 倍。
虽然默认选项是“ SymmetricTree ”,但是也可以使用参数“ grow_policy ”切换到“depth wise”(XGBoost)或“loss guide”(light GBM),
分类特征组合
CatBoost 的另一个重要细节是,它在树构建过程中隐式地考虑分类变量的组合。这有助于它考虑多个分类特征的联合信息。但是由于可能的组合总数会迅速增加,所以在树构建过程中采用了贪婪的方法。对于当前树中的每个分割,CatBoost 将叶中所有以前使用的分类特征与所有其余的分类特征连接起来作为组合,并动态计算目标统计数据。
过拟合检测器
CatBoost 中另一个有趣的特性是内置的过拟合检测器。如果 CatBoost 检测到过度拟合,它可以在我们设置的迭代次数之前停止训练。CatBoost 中实现了两个过拟合检测器:
- Iter
- IncToDec
Iter 相当于提前停止,算法在停止迭代之前等待 n 次迭代,因为验证损失值有所改善
IncToDec 稍微涉及一点。它通过跟踪一次又一次迭代的度量迭代的改进来采取稍微复杂的路线,并且还使用类似于指数平滑的方法来平滑进展,并且设置阈值以在平滑值低于阈值时停止训练。
缺少值
跟随 XGBoost 的脚步,CatBoost 也单独处理缺失值。CatBoost 中有两种处理缺失值的方法——最小值和最大值。
如果选择“最小值”,缺失值将作为该特征的最小值进行处理。如果您选择“最大”,缺失值将作为该特性的最大值进行处理。在这两种情况下,可以保证在每一次树拆分中都考虑缺失值和其他值之间的拆分。
超参数
如果说 LightGBM 有很多超参数,CatBoost 甚至更多。有这么多超参数需要优化,GridSearch 不再可行。对于任何给定的问题,获得正确的参数组合变得更像是一门艺术。但我还是会尝试总结一些你必须牢记的关键参数。
- one_hot_max_size :设置分类特征中唯一值的最大数量,低于该数量时,将进行一次性编码,不使用目标统计数据。建议您在输入特性集之前不要进行一次性编码,因为这会损害算法的准确性和性能。
- 迭代次数 —要在集合中构建的树的数量。这必须用 cv 来调整,或者应该采用一种过拟合检测方法来使迭代停止在理想迭代处。
- od_type、od_pval、od_wait —这三个参数配置过拟合检测器。
- od_type 是过拟合检测器的类型。
- od_pval 为 IncToDec 的阈值(推荐范围:[10e-10,10e-2])。该值越大,越早检测到过度拟合。
- od_wait 根据 od_type 有不同的含义。如果是 IncToDec ,则 od_wait 是过拟合检测器开始工作之前必须运行的迭代次数。如果是 Iter ,则 od_wait 是在停止训练之前,在度量没有改善的情况下,它将等待的迭代次数。
- learning_rate —通常的意思。但是 CatBoost 会根据数据集属性和设置的迭代次数自动设置学习率。
- 深度 —这是树的深度。最佳值范围从 4 到 10。如果 boosting_type 为 Lossguide 则默认值为 6 和 16
- l2 _ leaf _ reg 这是沿着叶子的正则化。任何正值都允许作为值。增加该值可以增加正则化效果。
- has_time —我们已经看到,完成有序升压需要一段人工时间。但是如果你的数据实际上有一个时间顺序呢?在这种情况下,设置 has_time = True 以避免在有序提升中使用排列,而是使用数据被提供的顺序作为唯一的排列。
- grow_policy —如前所述,CatBoost 默认构建“ SymmetricTree ”。但有时“ Depthwise ”和“Lossguide”可能会给出更好的结果。
- min_data_in_leaf 是控制每个叶中训练样本的最小数量的常用参数。这只能在深度方向的损耗导轨和中使用。
- max_leaves 是任何给定树的最大叶子数。这只能在损耗导轨中使用。这里不建议使用大于 64 的值,因为这会显著降低训练过程的速度。
- rsm 或 col sample _ by level-在每个分割选择中使用的特征百分比。这有助于我们控制过度拟合,值的范围为(0,1)。
- nan_mode —可以将值“禁止”、“最小”、“最大”作为三个选项。“禁止”不允许缺少值,并将引发错误。最小值和最大值我们前面已经讨论过了。
中的其他文章 中的梯度助推器
- 老好人渐变助力
- 正规化的贪婪森林
- XGBoost
- LightGBM
- CatBoost(你在这里)
参考
- 贪婪函数近似:一种梯度推进机器。安。统计学家。29 (2001 年),第 5 号,1189-1232。
- 普罗霍伦科娃、柳德米拉、古塞夫、格莱布等人(2018 年)。 CatBoost:具有分类特征的无偏增强。神经信息处理系统的进展
- CatBoost 参数。https://catboost . ai/docs/concepts/python-reference _ parameters-list . html
原载于 2020 年 2 月 29 日 http://deep-and-shallow.com。
你能用信用卡付款吗?
原文:https://towardsdatascience.com/catch-me-if-you-can-predicting-credit-card-default-using-classification-analysis-28b2955f7f7d?source=collection_archive---------41-----------------------
使用分类分析发现客户拖欠付款的迹象。
图片由 ideyweb 通过 Shutterstock.com 提供
由于新冠肺炎,许多人失去了工作,导致人们捆扎现金和拖欠信用卡付款。情况变得如此糟糕,以至于摩根大通和花旗集团等信用卡公司不得不留出额外准备金,以弥补信用卡违约带来的损失。现在,这是一个非常极端的情况,这种情况并不经常发生(我真的希望不会)。人们无力支付信用卡账单可能是由于不同的情况。然而,当它是故意的,意味着客户没有偿还银行的计划,这将被认为是一种欺诈。不管怎样,这给信用卡公司带来了巨大的风险,我们需要找到一种方法来标记它们。
Slidesgo 的演示模板| Freepik 的信息图表
为了解决这个问题,我们可以根据某些属性来预测潜在的默认帐户。这个想法是,越早发现潜在的违约账户,我们承受的损失就越低。另一方面,我们可以主动向客户提供提示,以防止违约。这不仅保护了我们的客户,也将我们的风险和潜在损失降至最低。
Slidesgo 的演示模板| Freepik 的信息图表
目标
预测客户下个月是否会拖欠信用卡付款。
方法
下图是我如何着手构建和最终确定分类模型的高级概述。
幻灯片演示模板 go
为召回而优化
在这种情况下,我们将专注于拥有最高的回忆分数,同时不要过于牺牲精确性。高误报率意味着我们可能会错误地对下个月拖欠信用卡的人进行分类,并因为关闭他们的账户而失去客户。高假阴性意味着我们错误地将不会违约的账户分类,最终我们可能需要动用储备金来弥补损失。如前所述,信用卡违约可能被视为欺诈,因此我们正确地对所有违约案例进行分类以最大限度地降低风险和损失非常重要。
数据收集
从加州大学欧文分校机器学习库获得的数据集包含台湾信用卡客户的信息。它包括 30,000 个观察值和 24 个特征。
幻灯片演示模板 go
特色
- 信用信息:信用额度
- 人口统计:性别、最高教育程度、年龄和婚姻状况
- 还款历史(2005 年 4 月~ 9 月):每月还款状态、还款金额、账单金额
目标
信用卡客户下个月会不会违约
幻灯片演示模板 go
数据探索
阶级不平衡
有一个类不平衡的问题,因此我们稍后将使用一些过采样技术来解决这个问题。
目标分布要求 22%为违约,78%为无违约。
阶级分布
在任何人口统计数据上,违约和非违约的分布都没有非常明显的区别。
人口统计变量的标准化分布条形图
然而,你可以看到每月还款状态的目标类别的分布差异。
2005 年 4-9 月客户还款状况归一化分布柱状图(还款状况衡量尺度:-2:余额已全部支付且无交易;-1:全额支付的余额和由于最近交易的正余额;0:已付最低金额;1 =延迟一个月付款;2 =付款延迟两个月;。。。;9 =付款延期九个月)
检查数据类型和空值
检查完特性后,我们看到没有空值,所有变量都是整数。
检查空值和数据类型的所有特性。
执行特征工程
请注意,我已经在 EDA、特征工程和建模之间走来走去,因此下面创建了转换的特征。
- 信用额度使用:从 0 到 1,这是从 2005 年 4 月到 9 月使用的信用的总百分比。
- 世代:用
age
计算此人属于哪一代,即“X 世代”、“千禧一代”等。 - 延期付款的总月数:6 个月(2005 年 4 月~ 9 月)中,延期付款的月数。
- 付款延迟:这是一个 1/0 标志,表示是否有付款延迟。
- 虚拟变量为T1。
多重共线性
为了避免高维数的灾难,如果更少的要素(更简单的模型)产生相同(或更好)的结果,我们通常应该避免多重共线性。我们看到education_University
和education_Graduate School
相互关联,这是意料之中的,因为这些变量对于教育来说是虚拟变量(互斥的)。其余的变量似乎并不相互关联。
数据建模
- 将数据分为 80%的训练集和 20%的保留集。只在 80%的训练集上训练数据,在所有特征和超参数最终确定之前,不接触保留集。
- 使用 最小最大缩放器 应用缩放,通过将每个特征缩放到 0 到 1 的范围来变换特征。与标准缩放器相反,最小最大缩放器最适用于有异常值的数据集。由于我最终为模型选择的特征,我的数据集没有异常值。
- 使用ADASYN应用过采样技术。我也试过 RandomOverSampler 和 SMOTE ,最后 ADASYN 取得了最好的召回分数。然而,ADASYN 是最慢的采样方法,因为该技术通过计算数据点之间的距离来生成合成数据。
- 使用带有逻辑回归、K-最近邻、随机森林、额外树和朴素贝叶斯的五重交叉验证训练数据。
- 最终确定模型的特征。以下是模型中最终确定的特征:1)信用额度使用,2)延迟付款的总月数,以及 3)
education
的虚拟变量 - 根据召回分数选择前 3 名表现最佳的车型。根据召回分数,表现最好的前 3 个模型是随机森林、额外树和逻辑回归。
幻灯片演示模板 go
在上面的图表中,每一行都用不同的型号进行了颜色编码。图例显示,Random Forest 的 ROC-AUC 得分最高,这意味着它在三个模型中表现最佳。在右边,Random Forest 也显示了它几乎总是比其他两个模型表现得更好,因为几乎没有重叠的区域。
结果
根据 ROC-AUC 评分,随机森林胜出!
Slidesgo 的演示模板| Freepik 的信息图表
韵律学
该模型的召回率为 67.37%。查看下面的混淆矩阵,误报率较高(22.52%),这是我们关注召回时所预期的。因此,假阴性相对较低,保持在 7.22%。
幻灯片演示模板 go
特征重要性
幻灯片演示模板 go
以下特征(及其特征重要性百分比)最终非常有助于预测客户下个月是否会拖欠信用卡付款:
- 延迟付款的总月数— 71%
- 信用额度使用率— 27%
education
–0.4 ~ 0.9%
的虚拟变量你可能会奇怪,既然它们的重要性很低,我为什么不直接删除它们。我真的做了,模型实际上表现更差,因此我把它们留在那里。
最佳阈值
幻灯片演示模板 go
最后,阈值被设置为 0.465,以实现 0.67 的召回分数。随着阈值的上下移动,可以看到精度和召回率会相互补偿。由业务部门决定适当的误报和漏报百分比,我们可以随时调整阈值以达到期望的百分比。
未来的工作
幻灯片演示模板 go
如果有更多的时间,我希望在未来的分析中包括以下内容:
- 获取不同的数据集,特别是关于客户信用历史的长度、新信用历史、当前使用的信用类型等。因为我相信这些可以极大地提高模型的预测能力。
- 获取更近的数据,因为该模型使用的数据来自 15 年前的 2005 年。在过去的 15 年里,很多事情可能已经改变了!
[1]:美联社。(2020 年 4 月 15 日)。各大银行准备应对贷款违约,留出近 200 亿美元来弥补损失。https://www . Dallas news . com/business/banking/2020/04/15/major-banks-brace-for-loan-defaults-拨备-200 亿-弥补损失/
使用机器学习捕捉网络中的入侵者
原文:https://towardsdatascience.com/catching-intruders-in-networks-using-machine-learning-dd25443709fe?source=collection_archive---------39-----------------------
算法在检测和对抗网络攻击方面具有非凡的潜力。为什么它们很少被使用?
图片来自 Pixabay 的 Yatheesh Gowda
电脑受到攻击。民族国家利用网络攻击占据上风。犯罪分子利用网络攻击获利。网络安全对于企业和个人保护其数据和计算机系统至关重要。检测攻击是网络安全中的一个重要目标,因为它会发出危险信号并实现快速响应。
入侵检测是检测针对计算机网络的攻击的一种方法。入侵检测系统监控来自网络或个人计算机的信息,以提醒响应者网络攻击。入侵检测系统通常分为基于网络和基于主机两类,但基于网络的系统最为常见。
随着网络对手调整他们的攻击,产生特征来检测他们是具有挑战性的。
入侵检测还可以分为基于特征的系统和基于异常的系统。基于签名的系统依赖于代表攻击的已知模式的目录。另一方面,基于异常的检测系统寻找与正常活动不一致的模式。
传统的入侵检测系统是基于特征的,并且依赖于人们创建规则,通常是基于他们经历过的攻击。随着网络对手调整他们的攻击,产生特征来检测他们是具有挑战性的。这些系统很少会发现新的攻击,因为它们是建立在预定义的规则之上的。
利用机器学习进行入侵检测
入侵检测的机器学习研究始于 1987 年左右[1]。从那以后,它一直是一个研究课题。合适的机器学习算法不仅能够检测已知的攻击模式,还能够检测新的攻击。
随着机器学习方法的发展,不同的算法已经被应用于入侵检测。成功的方法包括决策树、神经网络、贝叶斯算法、支持向量机和遗传算法。此外,无监督方法已经应用了图论、聚类和集成方法来检测入侵。
机器学习在入侵检测方面具有非凡的潜力,因为它特别擅长发现数据中的模式。在大多数情况下,人类分析师要处理的数据太多了。他们必须仔细检查大型日志文件,寻找攻击的迹象。这是机器学习算法做得最好的。
尽管进行了所有这些研究,但入侵检测的机器学习应用尚未在实践中广泛采用[2]。这是由于许多挑战。首先,网络上使用的数据集非常大,并且在持续增长。这使得资源饥渴的算法很难跟上。其次,入侵检测系统通常会产生很高的误报率。第三,与机器学习的许多应用不同,有一个对手试图篡改算法以逃避检测。许多机器学习算法容易受到篡改,这使得它们对于入侵检测来说不太准确。
不平衡数据的问题
与正常数据量相比,入侵数据非常小。因此,这些数据集非常不平衡。例如,UNSW-NB15 数据集中只有 3.2%的文件包含攻击示例。当机器学习应用于这些不平衡的数据集时,只看准确性是不够的。
准确度的计算方法是真阳性和真阴性的总和除以所有结果的总和。
如果一个数据集有 1000 条记录,有三条记录是攻击,那么一个简单地预测没有一条记录是攻击的算法,f(X) = 0,会产生 99.7%的准确率。
与其在不平衡的数据集中测量准确性,更重要的是看真实的阳性率,也称为召回率。真阳性率的计算方法是真阳性的数量除以真阳性和假阴性的总和。
在 f(X) = 0 的示例中,真正的阳性率是 0%,这意味着没有检测到任何攻击。这对于一个应该检测攻击的算法来说是不可接受的,即使它有很高的准确率。
不平衡数据集的另一个重要度量是假阳性率。假阳性率的计算方法是假阳性的数量除以假阳性和真阴性的总和。
在另一个例子中,假设在 1,000 个记录的数据集中,其中三个记录是攻击,该算法找到了所有三个攻击记录,但是也错误地预测了 100 个实际上正常的攻击。在这种情况下,90%的准确性分数不算太差,但假阳性率为 10%,这意味着人类分析师将需要花时间审查假警报。
寻找一个好的数据集
入侵检测机器学习的最大挑战之一是找到一个好的测试数据集。监督学习需要带标签的数据,但是由于网络数据的数量和保密性要求,大多数数据集都包含模拟数据。为了标记攻击,许多数据集使用红色分组在正常数据中创建攻击流。
最早的数据集,1999 年 KDD 杯,是作为第三届国际知识发现和数据挖掘工具竞赛的一部分而创建的[3]。竞赛的目标是建立一个网络入侵检测系统。该数据集基于从模拟空军局域网捕获的九周网络数据。原始网络数据被处理以创建 CSV 数据集。它包括四种主要类型的攻击:拒绝服务;来自远程计算机的未授权访问;对本地特权帐户的未授权访问;和探索。
入侵检测机器学习的最大挑战之一是找到一个好的测试数据集。
尽管 1999 年 KDD 杯的数据集对最初的比赛和随后的研究都很有用,但它几乎是 15 年来唯一用于入侵检测研究的数据集。随着时间的推移,数据集因包含重复记录和代表过时技术而受到批评。计算机和网络在 15 年里发生了巨大的变化。
从那时起,许多研究人员创造了更多的现代数据集,以解决 1999 年 KDD 杯的弱点。最值得注意的是,UNSW-NB15 数据集创建于 2015 年,代表了一个更现代的网络[4]。它是在模拟器中创建的,包括标记的数据以及计算机系统的 IP 地址。
UNSW-NB15 比 1999 年 KDD 杯数据集更不平衡,攻击记录比正常记录少得多。在撰写本文时,UNSW-NB15 数据集已有五年历史。尚不清楚它在研究中会有多长时间的用处,但是生成数据集的新方法使得创建数据集的工作量大大减少[5]。
未来方向
入侵检测仍然是机器学习中的一个开放的研究问题。它很可能仍然很有趣,因为技术变化很快,需要研究跟上最新的趋势。这也很有趣,因为对手经常采用新方法来攻击网络。能够识别新型攻击的机器学习算法对于成功防御计算机网络尤为重要。
参考
[1] D. E. Denning,一个入侵检测模型 (1987),IEEE 软件工程汇刊,(2),222–232
[2] R. Sommer 和 V. Paxson,在封闭世界之外:使用机器学习进行网络入侵检测 (2010 年 5 月),IEEE 安全和隐私研讨会,305–316
[3]加州大学欧文分校1999 年 KDD 杯数据 (1999)
[4] N .穆斯塔法, UNSW_NB15 数据集 (2019),IEEE 数据端口
[5] N. Moustafa,机器人-物联网数据集 (2019),IEEE 数据端口
用机器学习抓偷猎者
原文:https://towardsdatascience.com/catching-poachers-with-machine-learning-118eec41d5b9?source=collection_archive---------47-----------------------
建立一个监测自然保护区偷猎者的 ML 系统
完全披露:我是 的维护者,这是一个开源的 ML 平台,Cortex ,旨在构建类似下面讨论的项目。
据估计,每天都有近 100 头非洲象被偷猎者杀害。全世界每天总共有 1000 只动物被偷猎。
大量的偷猎发生在自然保护区,这是许多濒危物种最后(理论上)安全的地方。
对于负责保护这些动物的护林员来说,阻止偷猎者是一场寡不敌众的战斗。超过 70 亿美元的非法产业吸引了看似永无止境的偷猎者。
一个非营利组织,野生动物保护解决方案(WPS),最近开始用机器学习来打击偷猎者——而且很有效。
通过使用运动探测器、摄像机和训练有素的模型,WPS 正在以前所未有的速度识别更多的偷猎者,并在打击偷猎的斗争中引入新的优势。
你如何监控 100 万公顷的野生动物?
防止偷猎最难的部分也是最简单的部分之一:
自然保护区真的很大。
对一小队护林员来说,全天候监控 100 万公顷的区域,包括茂密的森林、悬崖和其他自然障碍,是一项艰巨的任务——即使是远程监控。
WPS 和相关团体已经在整个自然保护区部署运动传感器摄像机多年了。这种相机的工作原理是捕捉大型移动物体的图像,并实时发送给人类监视器,由监视器分析它们是否有偷猎活动。如果另一端的人类看到偷猎活动,他们会向响应者网络发送警报。
南非偷猎者被 WPS 抓获
虽然这种远程监控是一种进步,但它仍然存在一些挑战。同时分析来自许多摄像机的镜头——并且足够快地在行动中抓住偷猎者——需要比一般自然保护区更多的审查人员。
即使努力自动过滤偷猎者的图像,WPS 估计该系统也只能检测到 40%的记录在案的偷猎者。
用机器学习检测偷猎者
为了提高他们的检测率,WPS 将机器学习引入到他们的监控系统中。在引入机器学习之前,监控系统可以这样描述:
来源:银池
野外摄像头捕捉图像,并将它们传送到监控中心,如果管理中心的人看到偷猎活动的证据,他们会向相关人员发送通知。
他们引入机器学习的目标是在威胁评估阶段插入一个经过训练的模型,作为一个 API。所有传入的图片都将被自动过滤掉偷猎行为,只有正面的图片会被传递给审核者。
通过与 ML 开发平台 HighLighter 合作,WPS 能够训练一个对象检测模型,该模型可以识别特定的动物,以及人类、车辆和其他潜在的偷猎迹象:
来源:银池
部署该模型后,他们能够将其插入现有设置,而无需重新构建整个监控系统。
在测试的第一周,他们抓到了两名偷猎者。该小组估计,该系统的效率是以前的两倍,吹嘘有 80%的检测率,并在不断改进更多的数据。
自从最初的测试成功以来,WPS 已经在三大洲的自然保护区推出了该模型,仅在第一个月就提供了超过 100 万次预测。
非营利组织如何负担得起机器学习?
这个故事的许多令人兴奋的方面之一是,机器学习的这种应用不仅仅是可行的——它是可行的。
小团队和单独的工程师部署普通的预训练模型已经有一段时间了,但为这样的任务设计、培训和部署模型一直是大型科技公司的领域。
但是对于 WPS 来说,像 OpenCV 这样的现成解决方案是行不通的。他们需要培训和部署自己的模型。几年前,他们是一个小型非营利组织的事实会阻止他们这样做,但现在不会了。
模型开发平台和开源模型已经发展到现在,即使是小团队也可以训练模型。工程师们已经花了数年时间在像 Cortex 这样的开源基础设施平台上工作,因此任何工程师都可以将一个模型变成偷猎者探测器、视频游戏或癌症筛查器。
人们已经谈论机器学习民主化很长时间了,但这个项目证明,现在,它终于发生了。
赶上云趋势和 AWS 生态系统
原文:https://towardsdatascience.com/catching-up-with-the-cloud-trend-and-the-aws-ecosystem-dd512e8e2456?source=collection_archive---------18-----------------------
新加坡的海湾花园。 Pixabay 。
几个月前,我对云业务及其产品一无所知,尽管我反复听说过。 作为数据科学行业的标准,我必须赶上潮流。在本文中,我将与您分享我对市场领导者亚马逊网络服务(AWS)的了解。我还将向您展示哪些云架构和 AWS 服务可以用作全球数据密集型 web 应用程序的后端,如 Slack 。如果您对计算机网络(IP 地址、客户端、服务器等)有一些基本的了解,这将有所帮助,但不是强制性的。)为文章的第二部分。
AWS 上的 Slack 云架构概述。来源
介绍
云计算已经存在很多年了。亚马逊在 2006 年首次推广了这一概念,然后其他科技巨头在 2008 年(谷歌)和 2010 年(微软)跟进。这种技术转变的核心思想是,除非这是你的工作,否则你不应该费心去建立自己的 IT 系统。这怎么可能呢?让我们直入主题吧!
了解云计算和 AWS 生态系统
云计算定义
首先,我们应该界定这一切大惊小怪的原因。云计算是一种允许您访问 IT 资源和应用程序的服务:
- 点播,
- 通过互联网,
- 采用现收现付的定价方式
这基本上意味着,你可以使用亚马逊的服务器( IT 资源)、坐在家里(通过互联网)、随着你的应用增长或放缓而扩展你的基础设施(按需),但总是为你所使用的东西付费(按需付费)。
不用说,这种设置使您能够真正专注于您的产品,而不是采购、IT 维护或扩展。你受益于科技巨头的规模经济。例如,亚马逊的云计算业务 AWS 被网飞用于其几乎所有的后端基础设施。当你将这一点与网飞占互联网下游流量的近 15%这一事实联系起来时(见 2019 Sandvine 报告),很明显,AWS 在购买他们的服务器、电力等时很可能进行了强烈的谈判。允许他们的最终客户享受更低的价格。
最后但同样重要的是,云提供商将其数据中心分布在世界各地。这具体意味着,您将能够在全球范围内以大致相同的速度为您的用户提供服务,因为他们很可能离云提供商的设施很近。这使您可以在几分钟内为全球用户创建应用程序,而无需在不同地理位置设置硬件。
现在让我们来关注一下最大的云提供商 AWS(根据 2019 年 Q2Synergy Research Group的数据,占有 33%的市场份额)。让我们看看 AWS 如何以灵活的方式构建其全球 IT 基础设施,以实际交付我们所描述的内容。
AWS 基础设施设置
到目前为止,AWS 已经在全球定义了 22 个地区(见下图),在那里安装了 it 基础设施集群。每个集群被称为一个可用性区域 (AZ),每个区域至少应该有两个(但通常是三个)。反过来,每个 AZ 由多个数据中心组成。最后,每个数据中心都可能由数千台服务器组成。
AWS 区域(黄色)和边缘位置(蓝色)的大致位置。基于 AWS 的网站。
例如,AWS 定义的地区之一是我居住的新加坡。目前有三个 az,让我们假设它们分别位于樟宜(东)、商业区(南)和裕廊(西)。每个都有自己的建筑,24 小时有人看守。它还拥有独立的电源和网络连接,以便在该地区受到风暴或新加坡闪电影响的情况下限制中断。但是,这三个 az 通过低延迟(光纤)链路相互连接。通过这种方式,你的应用程序可以被复制,并提供更多的流量。如果您选择此设置,您的应用程序将被称为高可用性应用程序。这种冗余也使您的应用程序更具弹性,在发生故障时,流量可以路由到任何剩余的功能 AZ。
如果现在,你的用户位于菲律宾呢?那里没有阿兹。你的应用可能没有新加坡快。这就是为什么 AWS 也在许多边缘位置建立了数据中心。边缘位置基本上是一个缓存数据中心,它使静态内容更接近用户,以实现低延迟连接。现在全世界有超过 180 个这样的网站,即使你远离 AWS 地区,你也可以快速下载你的网飞电影。这项服务是由亚马逊 CloudFront ,一个内容交付网络(CDN)促成的。
通过查看地图,您仍然可以注意到没有 AWS 存在的区域。AWS 网络仍然是一项正在进行的工作,它显然是由市场力量驱动的,以发展其区域。然而,值得一提的是,它有一些严格的要求,例如电力供应商禁止它在任何地方安装区域。这是 AWS 保证的高水平服务的结果。例如,其存储服务 S3(简单存储服务)拥有 99.999999999%的耐用性。这具体意味着,如果你在 S3 上存储 1000 万个对象(每个对象可以包含高达 5TB 的数据),你可以预期每 10,000 年丢失一个对象。有了这些保障,在坚实的基础上建立区域是有意义的。
在 AWS 上构建 web 应用程序的架构
现在让我们探索构建 web 应用程序所需的 AWS 服务。
基本设置
在最简单的设置中,您可以放置您的 web 应用程序、数据库等。在单个弹性云计算 (EC2)实例上。这是 AWS 上最受欢迎的服务,基本上是在 AWS 的一个区域的服务器上运行的虚拟计算机。据说它是弹性的,因为你可以根据需要启动和停止你的实例(或者简单地说你的计算机)。您可以选择硬件规格(内存、CPU、GPU……)以及名为 Amazon 机器映像 (AMI)的软件配置,包括操作系统(Windows、Linux 等)。).设置计算实例后,您还需要处理一些其他事情,主要是网络、存储和安全性。我们将在我的下一篇文章中更详细地探讨网络和安全方面,敬请期待!
一旦您的 EC2 实例启动并运行,您将在一个特定的端口上启动您的应用程序(比方说一个 Flask 应用程序需要 5000 个端口)。知道了正确配置的实例的 IP 地址,人们现在应该能够从互联网访问您的应用程序。然而,在浏览器中,我们通常使用人类可读的地址,如medium.com。这就是为什么你需要建立一个域名系统(DNS),一个将网站名称(medium.com)转换成 IP 地址(104.16.120.127)的网络服务。与云中的一切一样,AWS 提供这项服务,它被称为 Route 53。
一个(非常)基本的应用程序设置。
解决可用性问题
这很好,但是,如果您需要关闭 EC2 实例或者在停电的情况下,您将会丢失 web 应用程序生成的所有数据,而不会提到您的网站将会关闭。那么如何让你的数据持久化呢?这是您想要使用数据库实例的地方,与初始 EC2 实例分开。您可以使用第二个 EC2 实例,自己设置一切,管理数据库等等。但是这就麻烦了。相反,AWS 拥有完全托管的数据库服务。对于结构化数据(比如表格数据),你可以选择亚马逊关系数据库服务(亚马逊 RDS),在上面你可以运行几个可能的数据库引擎,比如 MySQL 、 PostgreSQL 或亚马逊 Aurora (据说比 PostgreSQL 快 3 倍)。
有了这个,你的数据就安全了,太棒了。但是,您的网站仍然处于关闭状态,以防出现故障。让我们让你的应用更有弹性,或者用 AWS 的行话来说就是 HA (高可用性)。
如果您的 EC2 实例宕机,这意味着它所在的 AZ 遇到了问题,对吗?然后,让我们使用第二个 AZ,也不太可能受到影响。您将简单地在一个区域内的几个 az 上复制以前的架构。将你的架构缝合在一起的主要工具是一个负载平衡器。它不是任何负载均衡器,它是一个弹性负载均衡器(ELB ),就像在任何云环境中一样。顾名思义,ELB 将向您的 web 服务器分发流量,并执行一些健康检查(您的服务器是否正在运行,以什么速度运行,等等)。).如果一台服务器出现故障,ELB 会自动将流量路由到其他服务器。这也有助于在实例上均匀分布流量,以避免流量突然激增时过载。您也可以使用两个数据库,其中一个被频繁使用,而另一个则始终维护一个副本。
跨 AZs 复制你的应用程序使它更有弹性和可用性。
到目前为止,您已经使您的应用程序具有弹性和高可用性。如果现在,你希望你的应用程序是高性能和高效的,即使有数百万用户?
解决体积问题
是时候利用我们之前谈到的边缘位置了!在你的网站上,你可能有大量的静态内容,如电影或图片,这些内容不会被编辑,但需要高度可用和高度耐用(你不想失去布拉德叔叔的照片)。由于亚马逊 CloudFront(内容交付网络),我们将把这种数据存储在一个简单的存储服务(T1 )( S3)桶中,并放在离你的用户更近的地方。内容将存储在您最初选择的地区(例如新加坡),并在边缘位置复制,所有这些都由 CloudFront 为您管理。使用 S3 的优势在于,它是一个对象存储解决方案,而不是 EC2 实例中使用的块存储解决方案(称为弹性块存储或 EBS,您可以将其视为硬盘)。无需深入了解两者之间的区别,您可以记住,对象存储是作为过去几年数据爆炸的解决方案出现的:
- 它比块存储耐用得多,并且随着时间的推移更容易增加存储容量,同时降低成本
- 它非常适合存储不需要像文本这样的增量变化的对象(例如,非常适合备份)
- 当不经常访问数据时,存储成本会降低。例如,普通的 S3 存储桶每月每 GB 成本约为 2 美分,而 S3 冰川存储桶(用于长期归档)的成本为 0.2 美元(成本因地区而异)。
恭喜你。您的应用程序现在非常健壮,可以为全球用户提供大量内容和低延迟连接!
通过将 S3 桶与 CloudFront 结合使用,让静态内容更贴近用户,从而提高应用速度。
当您的需求随时间变化时,现在会发生什么?一场突如其来的炒作将你的网络应用置于聚光灯下,成千上万的用户涌入你的网站。或者相反,你刚刚度过了一个季节性高峰,面临着日常用户的急剧减少。这时你就需要一些自动化了!
自动缩放
网站流量的变化会转化为一些指标的具体变化:比如存储和 CPU 使用率。有了 Amazon CloudWatch ,您可以在一个预定义的组上监控这些指标,比如说下面这个组,它有两个 az 上的四个 EC2 实例:
您可以跨 AZs 定义自动缩放组。
在一个简单的例子中,您希望能够根据当前的需要添加或删除这个组。这很容易使用自动缩放来设置闹钟。在这里,您可以定义一个扩展策略。例如,假设您定义了一个当平均 CPU 利用率超过可用容量的 80%时触发的警报。您可以选择在现有 CPU 资源上增加 30%的容量,以防警报响起。正是这种灵活性让您能够适应用户流量的任何变化。
这是您的 web 应用程序的整体架构:
这是一个很大的过程,甚至有更多的 AWS 服务!以存储为例:你可以使用 DynamoDB 来存储非结构化数据,或者使用elastic cache来极快地访问数据。您可以使用弹性豆茎等等来自动化部署。我们无法在这里一一介绍,但是可以随意浏览亚马逊文档来了解更多。
结论
总的来说,你应该记住的是,云提供商已经在世界各地建立了极具弹性的基础设施,以托管任何类型的应用程序,所以你不应该自己做。除了节省成本,它还能为您带来灵活性。以(到目前为止)市场领导者 AWS 为例,我们看到了如何使用他们的(数百个)服务来构建云架构。
我希望你喜欢这篇文章。因为这是我的第一次,请在评论中告诉我你的反馈!敬请关注下一篇文章,我们将重点关注 AWS 网络和安全概念(VPC、安全组、互联网逃逸等)。)!
分类特征编码技术
原文:https://towardsdatascience.com/categorical-encoding-techniques-93ebd18e1f24?source=collection_archive---------7-----------------------
Python 中分类特征的编码方法
照片由 v2osk 在 Unsplash 上拍摄
分类数据是一种常见的非数值型数据,它包含标签值而不是数字。一些例子包括:
- 颜色:红色、绿色、蓝色
- 城市:纽约、奥斯汀、丹佛
- 性别:男,女
- 排名:第一,第二,第三
根据维基百科,“分类变量是一个可以取有限的,通常是固定数量的可能值的变量。”
通常将分类变量的可能值称为级别。
有几种不同类型的分类数据,包括:
- 二进制:只有 2 个值的变量。例如,对/错或是/否。
- 序数:一个变量,它有一些相关的顺序,就像我们上面的 place 例子。
- 名义:没有数值重要性的变量,例如颜色或城市。
许多机器学习算法不能直接处理分类数据。它们要求数据是数字。因此,了解如何对分类变量进行编码至关重要。
数据
我们将使用来自 Kaggle 的分类特征编码挑战 II 的数据。这个挑战的特点是数据集只有分类变量,这使得它非常适合探索不同的分类编码方法。
数据集包含二进制、名义和序数要素。我们将探索对每种类型的特征进行编码的方法。
完整的笔记本可以在这里找到。
二进制特征编码
二元特征是那些只有两个可能值的特征。
我们的数据集中有五个二元要素。正如我们在下面看到的,前三个已经是数字,不需要任何操作,bin_3
和bin_4
是需要编码的字符串。
编码前的二进制特征
因为这些是二进制特征,我们可以用熊猫的T2 对它们进行编码:
df['bin_3'] = df['bin_3'].replace({'T':1}, 'F':0})
df['bin_4'] = df['bin_4'].replace({'Y':1, 'N':0})
这里我们将一个字典传递给replace()
,以当前值作为键,以所需值作为值。下面我们可以看到我们的二进制特征编码。(现在,我们将忽略空值。)
编码后的二进制特征
对于二元特征,使用replace()
非常有帮助,但是如果我们有更多类别的分类特征呢?
序数特征编码
序数特征是那些具有某种顺序的特征。我们可以从下面的有序特征样本中看出,这些特征有一个可能很重要的顺序。
从 Kaggle 的排名系统中,我们知道特级大师的位置高于新手或贡献者。
机器学习模型可能能够使用订单信息来做出更好的预测,我们希望保留它。
编码前的序数特征。
对于序数特征,我们使用整数编码。要对数据进行整数编码,我们只需将标签转换为整数值。
标签编码。
虽然整数编码有许多方法,但我们将在这里讨论两种:
- Sklearn 的
LabelEncoder()
- 熊猫的
map()
我们可以用 Sklearn 的 LabelEncoder()
来标注编码数据:
from sklearn.preprocessing import LabelEncoder#label encoder can't handle missing values
ordinal_features['ord_1'] = ordinal_features['ord_1'].fillna('None')# Label encode ord_1 feature
label_encoder = LabelEncoder()
ordinal_features['ord_1'] = label_encoder.fit_transform(ordinal_features['ord_1'])# Print sample of dataset
ordinal_features.head()
ord _ 1 编码的序数特征。
上面我们看到了编码特征ord_1
。我们可以看到值特级大师用整数 2 编码,新手用整数 5 编码,无用整数 4 编码。
虽然使用LabelEncoder()
非常快速和简单,但它可能不是这里的最佳选择:我们的编码顺序并不完全正确。此外,在能够使用它之前,我们必须处理我们的空值。
LabelEncoder()
的另一个缺点是,文档声明它应该用于编码目标值(y ),而不是输入值(x)。让我们探索一种不同的方法来编码我们的序数特征。
这里的另一个选项是使用map()
。
熊猫的 map()
用另一个指定值替换每个值,类似于我们上面用的replace()
。在这里,我们用我们想要的映射创建一个字典,并将映射应用到我们的系列:
# create dictionary of ordinal to integer mapping
ord_2 = {'Freezing':1,
'Cold':2,
'Warm':3,
'Hot':4,
'Boiling Hot':5,
'Lava Hot':6}# apply using map
df['ord_2'] = df.ord_2.map(ord_2)
ord _ 1 和 ord _ 2 使用 map 编码的序号要素。
使用map()
允许我们指定分类特征中值的顺序,以确保它们处于有意义的排列中。
这些方法应该只用于顺序特征,因为顺序很重要。对于顺序不重要的特性,我们必须探索其他技术。
名义特征
名义特征是没有数字重要性的分类特征。顺序并不重要。
编码前的名义特征。
当顺序不重要时,一键编码是一种更好的技术。例如,在特征nom_1
中,我们有形状。这里没有明显的顺序。一种形状并不比另一种好。
在这种情况下,顺序并不重要,整数编码可能会导致模型性能下降,因此不应该使用。
一个热编码
在一个热编码中,为分类变量中的每个唯一值创建一个新的二进制(虚拟)变量。在上图中,我们有三种独特的颜色,所以我们创建了三个新的特征,每种颜色一个。如果值为真,则将整数 1 放入字段中,如果值为假,则放入 0。
这里我们可以使用熊猫的 get_dummies()
对我们的名义特征进行一次热编码。
该方法将分类变量转换为虚拟变量,并返回数据帧。drop_first
参数有助于通过移除第一级来获得 k-1 个假人。
nominal_features = pd.get_dummies(nominal_features, drop_first=True)
编码后的名义特征。
我们可以从上面的一个热编码的名义特征的例子中看到,这种类型的编码可以大大增加我们的列数。我们输入 10 列,编码后现在有超过 5000!
在高基数特性的情况下,那些具有许多可能值的特性,我们可能需要在编码之前做一些操作。例如,对于只出现很少一部分时间的值,我们可以将它们归入“其他”类别。
其他技术
删除分类变量
另一种方法是从数据集中删除分类变量。虽然移除特征始终是一种选择,但它可能不是处理分类变量的最佳方式,因为我们会丢失潜在的重要信息。
由于我们一直在处理的数据集只包含分类特征,这显然不是这种情况下的一个选项!
结论
我们探索了根据类型对分类变量进行编码的基本技术:
- 二进制的
- 序数
- 名义上的
虽然回顾的技术决不是编码分类变量的唯一选择,但它们是一个很好的起点。
在以后的文章中,我们将探索其他分类编码技术。
通过卡方进行分类特征选择
原文:https://towardsdatascience.com/categorical-feature-selection-via-chi-square-fc558b09de43?source=collection_archive---------7-----------------------
分析和选择用于创建预测模型的分类特征
照片由 Siora 摄影在 Unsplash 上拍摄
在我们日常的数据科学工作中,我们经常会遇到分类特征。有些人会对如何处理这些特性感到困惑,特别是当我们想要创建一个预测模型,而这些模型基本上是一个接受数字的方程时;不是一个类别。
一种方法是使用 OneHotEncoding 方法对所有 category 变量进行编码(将所有 category 类编码为数值 0 和 1,其中 0 表示不存在,1 表示存在)。
一种热编码方法的例子
许多人更喜欢这种方法,因为信息仍然存在,并且很容易理解概念。当我们拥有许多高基数的分类特征时,一个酒店编码过程后的特征数量将是巨大的。为什么我们不希望我们的训练数据集中有很多特征?这是因为维度的诅咒。
虽然增加特征可以减少我们的预测模型中的误差,但它只会减少到一定数量的特征;之后,误差会再次增大。这就是维数灾难的概念。
有很多方法可以缓解这个问题,但我的一个方法是通过卡方独立性测试进行特征选择。
独立性卡方检验
独立性卡方检验用于确定两个分类(名义)变量之间是否存在显著关系。这意味着独立性的卡方检验是一个假设检验,有两个假设;零假设和替代假设。假设写在下面。
零假设(H0): 变量之间没有关系
替代假设(H1): 变量之间有关系
就像任何统计测试一样,我们根据我们选择的 p 值(通常是 0.05)进行测试。如果 p 值显著,我们可以拒绝零假设,并声称研究结果支持替代假设。我不会过多地讨论统计理论,因为本文的目的是展示使用卡方检验的特征选择在实际应用中是如何工作的。
例如,我将使用来自 Kaggle 的贷款数据集来解决分类问题。这里,数据集包括各种数值、序数和名义变量,如下所述(出于文章目的,我将删除所有实际上需要另一次分析的空值)。
import pandas as pd
loan = pd.read_csv('loan_data_set.csv')#Dropping the uninformative feature
loan.drop('Loan_ID')#Transform the numerical feature into categorical feature
loan['Loan_Amount_Term'] = loan['Loan_Amount_Term'].astype('object')
loan['Credit_History'] = loan['Credit_History'].astype('object')#Dropping all the null value
loan.dropna(inplace = True)#Getting all the categorical columns except the target
categorical_columns = loan.select_dtypes(exclude = 'number').drop('Loan_Status', axis = 1).columnsloan.info()
在卡方检验中,我们以交叉列表(应急)格式显示数据,每行代表一个变量的水平(组),每列代表另一个变量的水平(组)。让我们尝试在性别和 Loan_Status 列之间创建一个交叉制表表。
pd.crosstab(loan['Gender'], loan['Loan_Status'])
交叉标签示例
现在,让我们尝试使用卡方独立性检验来测试这两个特征之间的关系。幸运的是 python 库 scipy 已经包含了测试函数供我们使用。
# Import the function
from scipy.stats import chi2_contingency#Testing the relationship
chi_res = chi2_contingency(pd.crosstab(loan['Loan_Status'], loan['Gender']))print('Chi2 Statistic: {}, p-value: {}'.format(chi_res[0], chi_res[1]))
独立性结果的卡方检验
如果我们选择 p 值水平为 0.05,由于 p 值测试结果大于 0.05,我们无法拒绝零假设。这意味着,基于独立性的卡方检验,性别和贷款状态特征之间没有关系。
我们可以尝试在所有分类特征都存在的情况下使用这个测试。
chi2_check = []
for i in categorical_columns:
if chi2_contingency(pd.crosstab(loan['Loan_Status'], loan[i]))[1] < 0.05:
chi2_check.append('Reject Null Hypothesis')
else:
chi2_check.append('Fail to Reject Null Hypothesis')res = pd.DataFrame(data = [categorical_columns, chi2_check]
).T
res.columns = ['Column', 'Hypothesis']
print(res)
对所有分类特征进行独立卡方检验的结果
事后测试
独立性的卡方检验是一个综合检验,这意味着它将数据作为一个整体进行检验。如果我们在一个类别中有多个类,并且卡方表大于 2×2,那么我们将无法轻易辨别哪个类的要素负责这种关系。为了确定哪个类是负责任的,我们需要一个事后测试。
为了进行多重 2×2 卡方独立性测试,我们需要对每个测试的特征进行重新分组,使其成为一个相对于其他类别的类别。为此,我们可以对每个类应用 OneHotEncoding,并针对另一个特性创建一个新的交叉表。
例如,让我们试着对 Property_Area 特性做一个事后测试。首先,我们需要对 Property_Area 特性进行 OneHotEncoding。
property_dummies = pd.get_dummies(data = loan[['Property_Area', 'Loan_Status']], columns = ['Property_Area'])
接下来,我们根据目标 Loan_Status 为每个 Property_Area 类创建交叉表。
#Example
pd.crosstab(property_dummies['Loan_Status'], property_dummies['Property_Area_Rural'])
然后我们可以对这一对进行卡方检验。
但是,有一点要记住。将多个类别相互比较意味着每次测试的假阳性错误率。例如,如果我们选择 p 值水平为 0.05 的第一个测试,意味着有 5%的机会出现假阳性;如果我们有多个类,那么之后的测试会使错误增加,有 10%的机会成为假阳性,等等。每进行一次后续测试,错误率都会增加 5%。在我们上面的例子中,我们有 3 个成对的比较。这意味着我们的卡方检验会有 15%的错误率。这意味着我们测试的 p 值等于 0.15,这相当高。
在这种情况下,我们可以使用 Bonferroni 调整方法来校正我们使用的 p 值。我们通过想要进行的成对比较的数量来调整我们的 P 值。公式为 p/N,其中 p=原始测试的 p 值,N=计划的成对比较的次数。例如,在我们的例子中,我们在 Property_Area 特性中有 3 个类;这意味着如果我们根据 Loan_Status 特性测试所有的类,我们将有 3 个成对的比较。我们的 P 值是 0.05/3 = 0.0167
使用调整后的 P 值,我们可以测试所有以前的重要结果,以查看哪个类负责创建重要的关系。
check = {}
for i in res[res['Hypothesis'] == 'Reject Null Hypothesis']['Column']:
dummies = pd.get_dummies(loan[i])
bon_p_value = 0.05/loan[i].nunique()
for series in dummies:
if chi2_contingency(pd.crosstab(loan['Loan_Status'], dummies[series]))[1] < bon_p_value:
check['{}-{}'.format(i, series)] = 'Reject Null Hypothesis'
else:
check['{}-{}'.format(i, series)] = 'Fail to Reject Null Hypothesis'res_chi_ph = pd.DataFrame(data = [check.keys(), check.values()]).T
res_chi_ph.columns = ['Pair', 'Hypothesis']
res_chi_ph
在这里,我还包括了用于成对比较的二元特性。正如我们所看到的,许多类实际上并不重要。甚至在事后测试导致所有类之前显著的 Loan_Amount_Term 也不显著。
预测模型
这种特征选择技术的目的是看它如何影响我们的预测模型。让我们用最简单的模型;作为基准的逻辑回归。首先,我会使用所有的数据,并在初始阶段查看模型性能。在这里,我将所有分类数据视为名义数据(甚至是序数数据)。
#OneHotEncoding all the categorical variable except the target; Also drop_first = True to avoid multicollinearity for Logistic Regressiondata_log = pd.get_dummies(data = loan, columns = loan.select_dtypes(exclude = 'number').drop('Loan_Status', axis =1).columns, drop_first =True)#Change the class into numerical valuedata_log['Loan_Status'] = data_log['Loan_Status'].apply(lambda x: 0 if x == 'N' else 1)#Splitting the data into Training and Test datafrom sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data_log.drop('Loan_Status', axis =1), data_log['Loan_Status'], test_size = 0.30, random_state = 101)#Creating the prediction model
from sklearn.linear_model import LogisticRegression
log_model = LogisticRegression(max_iter = 1000)
log_model.fit(X_train, y_train)#Performance Check
from sklearn.metrics import classification_report, confusion_matrix, roc_curve,auc, accuracy_scorepredictions = log_model.predict(X_test)
print(accuracy_score(y_test, predictions))
Out: 0.7708333333333334print(classification_report(y_test,predictions))
#Creating the ROC-AUC plotpreds = log_model.predict_proba(X_test)[:,1]
fpr, tpr, threshold = roc_curve(y_test, preds)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(10,8))
plt.title('Receiver Operator Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = {}'.format(round(roc_auc, 2)))
plt.legend(loc = 'lower right')
plt.plot([0,1], [0,1], 'r--')
plt.xlim([0,1])
plt.ylim([0,1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
将所有数据作为训练数据的模型的 ROC-AUC
以上是我们使用所有数据时的模型性能,让我们将其与我们通过独立性卡方检验选择的数据进行比较。
#Get the list of all the significant pairwisesignificant_chi = []
for i in res_chi[res_chi['Hypothesis'] == 'Reject Null Hypothesis']['Pair']:
significant_chi.append('{}_{}'.format(i.split('-')[0],i.split('-')[1]))#Drop the data with duplicate informationfor i in ['Married_No', 'Credit_History_0.0']:
significant_chi.remove(i)#Including the numerical data, as I have not analyze any of this featurefor i in loan.select_dtypes('number').columns:
significant_chi.append(i)print(significant_chi)Out: ['Married_Yes', 'Credit_History_1.0','Property_Area_Semiurban',
'ApplicantIncome','CoapplicantIncome', 'LoanAmount']
以前,如果我们使用所有的数据,我们最终会得到 21 个独立变量。通过功能选择,我们只有 6 个功能可以使用。我不会再次进行训练测试分割,因为我想用相同的训练数据和测试数据来测试数据。让我们看看我们的模型性能如何与这些选定的功能。
#Training the model only with the significant features and the numerical featureslog_model = LogisticRegression(max_iter = 1000)
log_model.fit(X_train[significant_chi], y_train)#Metrics check
predictions = log_model.predict(X_test[significant_chi])
print(accuracy_score(y_test, predictions))Out: 0.7847222222222222print(classification_report(y_test,predictions))
具有唯一选定特征的 ROC-AUC
结论
就度量标准而言,具有所选特征的模型比使用所有特征训练的模型表现稍好。从理论上讲,这是可能发生的,因为我们消除了数据中的所有噪声,只得到最重要的模式。虽然,我们还没有分析可能也很重要的数字数据。总的来说,我已经表明,通过卡方独立性检验,我们最终只能得到最重要的分类特征。
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
CatBoost 中的分类特征参数
原文:https://towardsdatascience.com/categorical-features-parameters-in-catboost-4ebd1326bee5?source=collection_archive---------9-----------------------
掌握你不知道存在的参数
分类特征示例:猫的脸型
CatBoost 是一个开源的渐变增强库。CatBoost 和其他梯度增强库的区别之一是它对分类特性的高级处理(事实上,包名中的“Cat”并不代表🐱但对于“绝对的”)。
CatBoost 可以很好地处理现成的分类数据。然而,它也有大量的训练参数,这些参数提供了对分类特征预处理的精细控制。在本教程中,我们将学习如何更好地使用这些参数。本教程分为以下几个部分:
- 简介:机器学习中的分类特征
- CatBoost 中的分类特征处理
- 实验:分类特征设置如何影响预测旧车价格的准确性。
1.简介:机器学习中的分类特征
с类别特征是一个具有一组离散值的特征,这些离散值被称为类别,这些类别不能通过<或>相互比较。在现实世界的数据集中,我们经常处理分类数据。分类要素的基数,即要素可以采用的不同值的数量,在要素和数据集之间变化很大-从几个到数千甚至数百万个不同的值。分类特征的值可以几乎均匀地分布,并且可能存在频率相差数量级的值。要在梯度提升中使用分类特征,需要将其转换为决策树可以处理的某种形式,例如转换为数字。在下一节中,我们将简要介绍将分类特征值转换为数字的最流行的机器学习方法。分类特征预处理的标准方法
- 一键编码包括为每个类别创建一个二进制特征。该方法的主要问题是具有巨大基数的特征(例如用户 id)导致大量特征。
- 标签编码映射每个类别,即一个分类特征可以取为一个随机数的值。这难道不是很有道理吗?它在实践中也不太管用。
- 哈希编码使用哈希函数将字符串类型特征转换为固定维度向量。
- 频率编码包括用数据集中类别的频率替换分类特征值。
- 目标编码用一个数字替换分类特征的值,该数字根据分类变量的特定值的目标值的分布计算得出。有时被称为贪婪目标编码的最直接的方法是对属于该类别的对象使用目标的平均值。但是,这种方法会导致目标泄漏和过拟合。这些问题的一个可能的解决方案是维持目标编码 —训练数据集的一部分用于计算每个类别的目标统计数据,而训练是在其余的训练数据上执行的。它解决了目标泄露问题,但需要我们牺牲一部分宝贵的训练数据。为此,实践中最流行的解决方案是 K 倍目标编码和留一目标编码。K 折叠目标编码背后的思想非常类似于 K 折叠交叉验证-我们将训练数据分成几个折叠,在每个折叠中,我们用在其他折叠上计算的类别的目标统计来替换分类特征值。留一目标编码是 K 重编码的特例,其中 K 等于训练数据的长度。k 倍编码和留一目标编码也可能导致过拟合。考虑以下示例:在训练数据集中,我们有一个具有单个值的单一分类特征,以及 5 个类 0 对象和 6 个类 1 对象。显然,只有一个可能值的特征是无用的,然而,如果我们对所有类别 0 的对象使用具有均值函数的留一目标编码,特征值将被编码成 0.6,而对所有类别 1 的对象,特征编码值将是 0.5。这将允许决策树分类器选择 0.55 的分割,并在训练集上实现 100%的准确性。
2.CatBoost 中的分类特征处理
CatBoost 支持一些传统的分类数据预处理方法,比如一键编码和频率编码。然而,这个包的一个特征是它的分类特征编码的原始解决方案。
CatBoost 分类特征预处理背后的核心思想是有序目标编码:执行数据集的随机排列,然后仅使用放置在当前对象之前的对象,对每个示例执行某种类型的目标编码(例如,仅计算该类别对象的目标平均值)。
通常,在 CatBoost 中将分类特征转换为数字特征包括以下步骤:
- 随机排列训练对象。
- 量化即根据任务类型将目标值从浮点转换为整数:
- 分类-目标值的可能值为“0”(不属于指定的目标类)和“1”(属于指定的目标类)。
- 多分类-目标值是目标类的整数标识符(从“0”开始)。
- 回归-对标注值执行量化。在启动参数中设置桶的模式和数量。位于单个存储桶内的所有值都被分配一个标签值类—一个由公式定义的范围内的整数:<存储桶 ID — 1 >。
3.编码分类特征值。
CatBoost 创建了训练对象的四种排列,对于每种排列,都会训练一个单独的模型。三个模型用于树结构选择,第四个用于计算我们保存的最终模型的叶子值。在每次迭代中,随机选择三个模型中的一个;该模型用于选择新的树结构,并计算所有四个模型的树叶值。
使用几种模型进行树结构选择增强了分类特征编码的鲁棒性。如果在一个排列中,一个对象靠近数据集的开始,并且在另外两个排列中对少量对象计算编码统计,则它可能更靠近数据集的结尾,并且许多对象将用于计算统计。
另一个要点是 CatBoost 可以结合现有的分类特征创建新的分类特征。并且它实际上会这样做,除非你明确地告诉它不要这样做:)原始特征和创建的特征的处理可以分别由设置simple_ctr
和combinations_ctr
单独控制(我们将详细讨论它们)。
3.分类特征参数在实际中的应用:旧车价格预测
丘特尔斯纳普在 Unsplash 上拍照
资料组
对于本教程中的实验,我们将使用https://www.kaggle.com/lepchenkov/usedcarscatalog
该数据集由旧汽车的描述及其特征组成,既有数字的,如里程、生产年份等,也有分类的,如颜色、制造商名称、型号名称等。
我们的目标是解决回归任务,即预测一辆旧车的价格。
让我们看看每个分类变量有多少个唯一值:
df[categorical_features_names].nunique()manufacturer_name 55
model_name 1118
transmission 2
color 12
engine_fuel 6
engine_type 3
body_type 12
state 3
drivetrain 3
location_region 6
目标值分布如下:
首先,我们将粗略估计完成这项任务所需的树的数量和学习率。
0: learn: 5935.7603510 test: 6046.0339243 best: 6046.0339243 (0) total: 73.2ms remaining: 6m 5s
2000: learn: 1052.8405096 test: 1684.8571308 best: 1684.8571308 (2000) total: 19.5s remaining: 29.2s
4000: learn: 830.0093394 test: 1669.1267503 best: 1668.7626148 (3888) total: 41.4s remaining: 10.3s
4999: learn: 753.5299104 test: 1666.7826842 best: 1666.6739968 (4463) total: 52.7s remaining: 0usbestTest = 1666.673997
bestIteration = 4463
现在,我们将编写一个简单的函数,在给定参数的情况下测试 CatBoost 在三重交叉验证上的性能,并返回最后一个模型的完整参数列表。可选地,该函数将模型的度量与用默认分类特征参数训练的模型的结果进行比较。
我们将估计器的数量固定为 4500,学习率为 0.1。
CatBoost 中编码参数的分类特征
CatBoost 中与分类特征处理相关的参数数量庞大。下面是一个完整的列表:
one_hot_max_size
(int) -对所有具有小于或等于给定参数值的不同值的分类特征使用一键编码。对这些特征不进行复杂的编码。回归任务的默认值为 2。model_size_reg
(从 0 到 inf 浮动)-模型大小正则化系数。该值越大,模型尺寸越小。详情参见“模型尺寸正则化系数”部分。只有具有分类特征的模型(其他模型很小)才需要这种正则化。如果分类特征具有大量值,则具有分类特征的模型可能会有数百亿字节或更多。如果正则项的值不为零,则使用分类要素或具有大量值的要素组合会产生不利影响,因此在生成的模型中使用的分类要素或要素组合较少。默认值为 0.5max_ctr_complexity
-可以组合的最大特征数量。每个结果组合由一个或多个分类特征组成,并且可以选择包含以下形式的二进制特征:“数字特征>值”。对于 CPU 上的回归任务,默认值为 4。has_time
(bool) -如果true
,分类特征处理的第一步,置换,不执行。当数据集中的对象按时间排序时非常有用。对于我们的数据集,我们不需要它。默认值为simple_ctr
-简单分类特征的量化设置。combinations_ctr
-分类特征组合的量化设置。per_feature_ctr
-分类特征的每特征量化设置。counter_calc_method
用Counter
决定是否使用验证数据集(通过fit
方法的参数eval_set
提供)来估计类别频率。默认情况下,它是Full
,使用验证数据集中的对象;传递SkipTest
值以忽略验证集中的对象ctr_target_border_count
-用于分类特征目标量化的最大边界数。回归任务的默认值为 1。ctr_leaf_count_limit
-具有分类特征的叶子的最大数量。默认值为无,即没有限制。store_all_simple_ctr
-如果先前的参数在某一点上梯度推进树不再能够通过分类特征进行分割。默认值等于False
时,限制适用于原始分类特征和 CatBoost 通过组合不同特征创建的特征。如果该参数设置为True
,只有组合特征上的分割数量受到限制。
三个参数simple_ctr
、combinations_ctr
和per_feature_ctr
是控制分类特征处理的第二和第三步骤的复杂参数。我们将在接下来的章节中详细讨论它们。
默认参数
首先,我们测试现成的 CatBoost 分类特征处理。
last_model_params = score_catboost_model({}, True)
R2 score: 0.9334(0.0009)
RMSE score: 1659(17)
我们将保存具有默认分类特征参数的模型的度量,以供进一步比较。
一键编码最大尺寸
我们尝试的第一件事是让 CatBoost 对我们所有的分类特征使用一键编码(我们数据集中的最大分类特征基数是 1118 < 2000). The documentation says, that for the features for which one-hot encoding is used no other encodings are computed.
默认值是:
- 如果在 CPU 上以成对计分模式进行训练,则不适用
- 255 如果在 GPU 上执行训练,并且所选 Ctr 类型需要在训练期间不可用的目标数据
- 10 如果在分级模式下进行训练
- 2 如果以上条件都不满足
model_params = score_catboost_model({'one_hot_max_size' : 2000})R2 score: 0.9392(0.0029) +0.6% compared to default parameters
RMSE score: 1584(28) -4.5% compared to default parameters
模型尺寸正则化
如果训练数据具有分类特征,该参数会影响模型大小。
关于分类特征的信息对模型的最终大小有很大的贡献。为模型中使用的每个分类特征存储从分类特征值散列到一些统计值的映射。特定要素的映射大小取决于该要素采用的唯一值的数量。
因此,当选择树中的分裂以减小模型的最终尺寸时,可以在最终模型中考虑分类特征的潜在权重。选择最佳分割时,会计算所有分割分数,然后选择分数最高的分割。但是在选择具有最佳分数的分割之前,所有分数根据以下公式变化:
s_new 是根据某个分类特征或组合特征进行分割的新得分, s_old 是根据该特征进行分割的旧得分, u 是该特征的唯一值的数量, U 是所有特征中所有值的最大值, M 是model_size_reg
参数的值。
这种正则化在 GPU 上的工作方式略有不同:特性组合的正则化程度比在 CPU 上更高。因为组合的 CPU 成本等于训练数据集中存在的这些组合中不同特征值的数量。在 GPU 上,一个组合的成本等于该组合所有可能的不同值的数量。例如,如果组合包含两个分类要素 c1 和 c2,则成本将为 c1 中的#categories * C2 中的# categories,即使该组合中的许多值可能不在数据集中。
让我们尝试将模型大小正则化系数设置为 0——因此我们允许我们的模型使用尽可能多的分类特征及其组合。
model_params = score_catboost_model({'model_size_reg': 0})R2 score: 0.9360(0.0014) +0.3% compared to default parameters
RMSE score: 1626(26) -2.0% compared to default parametersmodel_params = score_catboost_model({'model_size_reg': 1})R2 score: 0.9327(0.0020) -0.1% compared to default parameters
RMSE score: 1667(30) +0.5% compared to default parameters
为了检查此设置如何影响模型的大小,我们将编写一个函数,给定参数字典将训练一个模型,将其保存在一个文件中,并返回模型的权重:
model_size_reg_0 = weight_model({'model_size_reg': 0})model_size_reg_1 = weight_model({'model_size_reg': 1})model_size_reg_0/model_size_reg_112.689550532622183
正如我们可以看到的,具有强正则化的模型几乎比没有正则化的模型小 13 倍。
组合的功能数量
组合的功能数量
特征组合:注意,几个分类特征的任何组合都可以被认为是一个新的组合。例如,假设任务是音乐推荐,我们有两个分类特征:用户 ID 和音乐流派。比如说,一些用户更喜欢摇滚乐。当我们将用户 ID 和音乐流派转换为数字特征时,我们会丢失这些信息。两个功能的组合解决了这个问题,并提供了一个新的强大功能。然而,组合的数量随着数据集中分类特征的数量呈指数增长,因此不可能在算法中考虑所有的组合。当为当前树构造新的分裂时,CatBoost 以贪婪的方式考虑组合。对于树中的第一次拆分,不考虑任何组合。对于接下来的分割,CatBoost 将当前树中存在的所有组合和分类特征与数据集中的所有分类特征相结合。组合值被动态转换成数字。CatBoost 还以下列方式生成数字和分类特征的组合:树中选择的所有拆分都被视为具有两个值的分类,并以与分类相同的方式用于组合。
可以组合的最大特征数。每个结果组合由一个或多个分类特征组成,并且可以选择性地包含以下形式的二进制特征:“数字特征>值”。对于 CPU 上的回归任务,默认值为 4。
虽然文档中没有提到,但该参数值必须小于或等于 15。(因为此参数应小于最大梯度推进树深度)。
model_params = score_catboost_model({'max_ctr_complexity': 6})R2 score: 0.9335(0.0016) +0.0% compared to default parameters
RMSE score: 1657(24) -0.2% compared to default parametersmodel_params = score_catboost_model({'max_ctr_complexity': 0})R2 score: 0.9286(0.0041) -0.5% compared to default parameters
RMSE score: 1716(30) +3.4% compared to default parameters
正如我们在数据集上看到的,模型的准确性差异并不显著。为了检查模型的大小是如何受到影响的,我们将使用我们的函数对模型进行加权。
model_size_max_ctr_6 = weight_model({'max_ctr_complexity': 6})model_size_max_ctr_0 = weight_model({'max_ctr_complexity': 0})model_size_max_ctr_6/model_size_max_ctr_06.437194589788451
可以看出,可以组合多达 6 个特征的模型比根本不组合特征的模型重 6 倍。
有时间
启用此设置后,在将分类特征转换为数字特征的过程中,我们不会执行随机排列。当数据集的对象已经按时间排序时,这可能很有用。如果时间戳类型的列出现在输入数据中,则它用于确定对象的顺序。
model_params = score_catboost_model({'has_time': **True**})R2 score: 0.9174(0.0029) -1.7% compared to default parameters
RMSE score: 1847(29) +11.3% compared to default parameters
simple_ctr
和combinations_ctr
simple_ctr
和combinations_ctr
都是提供分类特征编码类型规则的复杂参数。虽然simple_ctr
负责处理最初出现在数据集中的分类要素,但是combinations_ctr
会影响新要素的编码,这些新要素是 CatBoost 通过组合现有要素创建的。可用的编码方法以及simple_ctr
和combinations_ctr
的可能值都是相同的,所以我们不打算分开来看。但是当然,你可以在你的任务中分别调整它们!
无目标量化的编码
目标量化正在使用一些边界将浮点目标值转换为整数目标值。我们将首先考虑不需要这种转换的目标编码方法。
FloatTargetMeanValue(仅限 GPU)
第一个选项 FloatTargetMeanValue 是最直接的方法。分类变量的每个值被替换为放置在当前对象之前的相同类别的对象的目标平均值。
model_params = score_catboost_model(
{'simple_ctr' : 'FloatTargetMeanValue', 'combinations_ctr' : 'FloatTargetMeanValue', 'task_type' : 'GPU'})R2 score: 0.9183(0.0022) -1.6% compared to default parameters
RMSE score: 1837(32) +10.7% compared to default parameters
FeatureFreq(仅限 GPU)
第二个选项是 FeatureFreq 。分类特征值被替换为数据集中类别的频率。同样,只使用放置在当前对象之前的对象。
model_params = score_catboost_model(
{'simple_ctr' : 'FeatureFreq', 'combinations_ctr' : 'FeatureFreq', 'task_type' : 'GPU'})R2 score: 0.9170(0.0019) -1.8% compared to default parameters
RMSE score: 1852(12) +11.6% compared to default parameters
计数器
我们已经在“默认参数”一节中讨论了 Counter 方法,因为默认情况下,该方法用于创建特性编码。值得注意的是,如果我们直接将Counter
传递给simple_ctr
和/或combinations_ctr
,CatBoost 将只使用的计数器特性编码。
model_params = score_catboost_model({'simple_ctr' : 'Counter', 'combinations_ctr' : 'Counter'})R2 score: 0.9288(0.0014) -0.5% compared to default parameters
RMSE score: 1715(12) +3.3% compared to default parameters
CtrBorderCount
参数
假设我们已经计算了分类变量的编码。这些编码是浮动的,它们是可比较的:在Counter
的情况下,较大的编码值对应于更频繁的类别。但是,如果我们有大量的类别,相近类别编码之间的差异可能是由噪声引起的,我们不希望我们的模型区分相近的类别。出于这个原因,我们将浮点编码转换为 int 编码𝑖∈[0,𝑙]i∈[0,l].默认情况下CtrBorderCount=15
设置意味着𝑙=14(15−1)l=14(15−1).我们可以尝试使用一个更大的值:
model_params = score_catboost_model({'combinations_ctr':
['Counter:CtrBorderCount=40:Prior=0.5/1'],
'simple_ctr': ['Counter:CtrBorderCount=40:Prior=0.5/1']})R2 score: 0.9337(0.0013) -0.0% compared to default parameters
RMSE score: 1655(13) +0.2% compared to default parameters
二值化目标平均值
第二种方法BinarizedTargetMeanValue
非常类似于目标编码,除了我们使用 beans 值的和而不是精确目标值的和。其对应于以下公式:
其中:
- countInClass 是该分类特征的标签值整数之和与最大标签值整数 k 的比值。
- totalCount 是特征值与当前值匹配的对象总数。
- 先验是一个由起始参数定义的数(常数)。
model_params = score_catboost_model(
{'combinations_ctr':'BinarizedTargetMeanValue', 'simple_ctr': 'BinarizedTargetMeanValue'})R2 score: 0.9312(0.0008) -0.2% compared to default parameters
RMSE score: 1685(20) +1.6% compared to default parameters{k:v **for** k, v **in** model_params.items() **if** k **in** ctr_parameters}{'combinations_ctr': ['BinarizedTargetMeanValue:CtrBorderCount=15:CtrBorderType=Uniform:TargetBorderCount=1:TargetBorderType=MinEntropy:Prior=0/1:Prior=0.5/1:Prior=1/1'],
'simple_ctr': ['BinarizedTargetMeanValue:CtrBorderCount=15:CtrBorderType=Uniform:TargetBorderCount=1:TargetBorderType=MinEntropy:Prior=0/1:Prior=0.5/1:Prior=1/1']}
在使用BinarizedTargetMeanValue
方法的同时,我们还可以微调Prior
和CtrBorderCount
(用于量化类别特征编码的边界数量)。默认情况下,CtrBorderCount
=15,0、0.5 和 1 Prior
值用于构建三种不同的编码。
目标量化编码
桶和边框
现在我们继续设置需要目标量化的编码方法。首选是Borders
vsBuckets
。这两者之间的区别非常简单。两者都由以下公式描述:
对于Borders
的【0, k -1】中的 i 和Buckets
的【0, k 中的 i :
其中 k 是由参数TargetBorderCount
调节的边界数量,
totalCount 是同一类别的对象数量。之前的由参数prior
定义。唯一不同的是对于Borders
countInClass 是离散化目标值大于 i 的类别的对象数,而对于Buckets
countInClass 是离散化目标值等于到 i 的类别的对象数。
让我们看一个小例子:我们有两类物体显示为太阳和月亮。我们将计算边界和桶的分类特征编码。
边框:我们有两个边框(对应于TargetBorderCount=2
),所以需要计算 2 个编码。假设我们的先验是 0.5
桶:【0,】k 中的 i 创建 k +1 个桶。因此,如果我们选择Buckets
,相同的参数值TargetBorderCount=2
会从每个分类特征中创建更多的特征。
重要提示!这个例子只是用来说明 *Borders*
和 *Buckets*
的区别,整个数据集用来计算 countInClass 和 totalCount。实际上,CatBoost 仅使用在使用当前对象之前放置的对象。
让我们看看它在实践中是否有所不同:
model_params = score_catboost_model({'combinations_ctr': 'Borders',
'simple_ctr': 'Borders'})R2 score: 0.9311(0.0017) -0.2% compared to default parameters
RMSE score: 1688(40) +1.7% compared to default parametersmodel_params = score_catboost_model({'combinations_ctr': 'Buckets',
'simple_ctr': 'Buckets'})R2 score: 0.9314(0.0048) -0.2% compared to default parameters
RMSE score: 1682(49) +1.4% compared to default parameters
细心的读者可能记得,默认情况下,CatBoost 使用Borders
分割创建一些特征,也使用Counter
方法创建一些特征。当我们显式传递Borders
选项时,不使用Counter
方法。
一般情况下,建议使用Borders
进行回归任务,使用Buckets
进行多分类任务。
缺失值和新类别的处理
- 如果测试集中有一个新类别从未出现在训练集中,会发生什么?答案是,由于𝑐𝑜𝑢𝑛𝑡𝐼𝑛𝐶𝑙𝑎𝑠𝑠𝑐𝑜𝑢𝑛𝑡𝐼𝑛𝐶𝑙𝑎𝑠𝑠等于零,先验被用于计算编码:
- 同时,分类特征中缺失的值被替换为
"None"
字符串。那么具有丢失特征值的所有对象被视为一个新的类别。
边界数量
边界或桶的数量可通过TargetBorderCount
参数控制。默认情况下,我们只有一个边框,让我们看看有更多的边框是否有帮助:
model_params = score_catboost_model({'combinations_ctr': 'Borders:TargetBorderCount=4',
'simple_ctr': 'Borders:TargetBorderCount=4'})R2 score: 0.9356(0.0019) +0.2% compared to default parameters
RMSE score: 1631(9) -1.7% compared to default parameters
simple_ctr
和combinations_ctr
的默认值
默认情况下,CatBoost 使用多种编码技术对每个分类特征进行编码。
- 首先,它使用带有一个目标边界
TargetBorderCount
=1 的Borders
方法(在我们的示例中,对于每个分类特征,我们只想看看它是否会使汽车更贵)。获得的浮点编码被进一步离散成CtrBorderCount
=15 个不同的值。Prior
参数的三个值用于创建三种不同的编码:Prior=0/1:Prior=0.5/1:Prior=1/1
- 同样,对于每个分类特征,我们用
Counter
方法创建一个编码。分类编码值边界的数量CtrBorderCount
也等于 15,并且仅使用一个值Prior=0/1
。
我们总是可以用get_all_params()
方法检查我们的模型所使用的参数。
last_model_params = score_catboost_model({}, True)
last_model_params['simple_ctr']['Borders:CtrBorderCount=15:CtrBorderType=Uniform:TargetBorderCount=1:TargetBorderType=MinEntropy:Prior=0/1:Prior=0.5/1:Prior=1/1',
'Counter:CtrBorderCount=15:CtrBorderType=Uniform:Prior=0/1']last_model_params['combinations_ctr']['Borders:CtrBorderCount=15:CtrBorderType=Uniform:TargetBorderCount=1:TargetBorderType=MinEntropy:Prior=0/1:Prior=0.5/1:Prior=1/1',
'Counter:CtrBorderCount=15:CtrBorderType=Uniform:Prior=0/1']
通过per_feature_ctr
参数控制个别功能
我想在本教程中谈的下一件事是用参数per_feature_ctr
对不同的特性使用不同的编码方法。当您知道您的某个功能比其他功能更重要时,这可能会很有用。例如,我们可以增加模型名称特征的目标边界数量:
model_params = score_catboost_model({'per_feature_ctr': ['1:Borders:TargetBorderCount=10:Prior=0/1'] })R2 score: 0.9361(0.0005) +0.3% compared to default parameters
RMSE score: 1625(28) -2.1% compared to default parameters
其他参数
计数器计算方法
该参数决定是否使用验证数据集(通过fit
方法的参数eval_set
提供)来估计Counter
的类别频率。默认为Full
,使用验证数据集中的对象;传递SkipTest
值以忽略来自我们score_catboost_model
函数中验证集的对象,我们在训练期间根本不给 CatBoost 验证数据集,因此为了检查该方法的效果,我们将使用训练/测试分割。
model = CatBoostRegressor(custom_metric= ['R2', 'RMSE'], learning_rate=0.1, n_estimators=4500,
counter_calc_method='Full')
model.fit(train_pool, eval_set=test_pool, verbose=**False**)
r2_res = r2_score(df_test.price_usd.values, model.predict(test_pool))
rmse_res = mean_squared_error(df_test.price_usd.values, model.predict(test_pool))print('Counter Calculation Method Full: R2=**{:.4f}** RMSE=**{:.0f}**'.format(r2_res, rmse_res))Counter Calculation Method Full: R2=0.9334 RMSE=2817626model = CatBoostRegressor(custom_metric= ['R2', 'RMSE'], learning_rate=0.1, n_estimators=4500,
counter_calc_method='SkipTest')
model.fit(train_pool, eval_set=test_pool, verbose=**False**)
r2_res = r2_score(df_test.price_usd.values, model.predict(test_pool))
rmse_res = mean_squared_error(df_test.price_usd.values, model.predict(test_pool))print('Counter Calculation Method SkipTest: R2=**{:.4f}** RMSE=**{:.0f}**'.format(r2_res, rmse_res))Counter Calculation Method SkipTest: R2=0.9344 RMSE=2777802
目标量化的边界数量
用于分类特征目标量化的最大边界数。回归任务的默认值为 1。
让我们试一试相当多的边界:
model_params = score_catboost_model({'ctr_target_border_count': 10})R2 score: 0.9375(0.0046) +0.4% compared to default parameters
RMSE score: 1606(73) -3.2% compared to default parameters
分类值限制
此参数控制模型使用的最常见分类特征值的数量。如果我们有 n 个唯一类别和ctr_leaf_count_limit
= m 个唯一类别,我们只保留最频繁类别中对象的分类特征值。对于剩余类别中的对象,我们用None
替换分类特征值。
该参数的默认值是None
-所有分类特征值都被保留。
model_params = score_catboost_model({'ctr_leaf_count_limit' : 5})R2 score: 0.8278(0.0236) -11.3% compared to default parameters
RMSE score: 2661(187) +60.4% compared to default parameters
哎呀!在我们的数据集上,它破坏了模型性能。
存储简单的分类特征
如果对之前的参数ctr_leaf_count_limit
进行此设置,则只会影响 CatBoost 通过组合初始要素创建的分类要素,而数据集中存在的初始分类要素不会受到影响。当参数ctr_leaf_count_limit
为None
时,参数store_all_simple_ctr
无效。
model_params = score_catboost_model({'store_all_simple_ctr' : **True**, 'ctr_leaf_count_limit' : 5})R2 score: 0.8971(0.0070) -3.9% compared to default parameters
RMSE score: 2060(74) +24.2% compared to default parameters
内部特征重要性
对一个分类特征使用几种编码是很常见的。例如,默认情况下,CatBoost 为每个分类特征创建 4 种不同的编码(参见“simple_ctr 和 combinations_ctr 的默认值”一节)。当我们调用get_feature_importances
方法时,我们得到分类特征的所有编码重要性的集合。这是因为在实践中,我们通常只想比较数据集中不同特征的总体有用性。
然而,如果我们想知道哪种编码最适合我们呢?为此,我们需要获得内部特性重要性。目前,它仅在命令行版本的 CatBoost 库中可用。你可以在这里找到关于安装的细节,在本教程中找到一个如何用命令行版本训练模型的例子。
要使用命令行版本训练模型,我们首先需要创建一个列描述文件:
descr = ['Categ' if i in categorical_features_names else 'Auxiliary' for i in df.columns]
descr[14] = 'Target'
pd.Series(descr).to_csv('train.cd', sep='\t', header=None)
然后训练一个模型:
catboost fit --learn-set cars.csv --loss-function RMSE --learning-rate 0.1 --iterations 4500 --delimiter=',' --has-header --column-description train.cd
然后创建一个内部特征重要性文件:catboost fstr -m model.bin --cd train.cd --fstr-type InternalFeatureImportance -o feature_strength.tsv
在我们的例子中,这个文件的内容如下:
9.318442186 transmission 7.675430604 {model_name} prior_num=1 prior_denom=1 targetborder=0 type=Borders
3.04782682 {model_name} prior_num=0 prior_denom=1 targetborder=0 type=Borders
2.951546528 {model_name} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
2.939078189 {body_type} prior_num=0 prior_denom=1 targetborder=0 type=Borders
2.666138982 {state, transmission} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
2.431465565 {body_type} prior_num=1 prior_denom=1 targetborder=0 type=Borders
2.059354431 {manufacturer_name} prior_num=0 prior_denom=1 targetborder=0 type=Counter
1.946443049 {state} prior_num=1 prior_denom=1 targetborder=0 type=Borders
1.932116622 {color} prior_num=1 prior_denom=1 targetborder=0 type=Borders
1.633469855 {color} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
1.561168441 {manufacturer_name} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
1.419944596 {manufacturer_name} prior_num=0 prior_denom=1 targetborder=0 type=Borders
1.3323198 {body_type} prior_num=0 prior_denom=1 targetborder=0 type=Counter 1.068973258 {color} prior_num=0 prior_denom=1 targetborder=0 type=Counter
1.038663366 {manufacturer_name} prior_num=1 prior_denom=1 targetborder=0 type=Borders
1.001434874 {manufacturer_name, body_type} prior_num=0 prior_denom=1 targetborder=0 type=Counter
0.9012036663 {body_type} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
0.8805961369 {manufacturer_name, body_type} prior_num=1 prior_denom=1 targetborder=0 type=Borders
0.8796937131 {drivetrain} prior_num=0 prior_denom=1 targetborder=0 type=Borders
...
...
1.476546485e-05 {engine_fuel, engine_type} prior_num=0 prior_denom=1 targetborder=0 type=Borders
7.417408934e-06 {engine_type, body_type, state, location_region} prior_num=0.5 prior_denom=1 targetborder=0 type=Borders
- 我们可以看到,最重要的特征是传输;
- 然后我们有 3 个
Borders
类型编码用于具有不同先验的model_name
分类特征; - 然后对
body_type
特征进行编码; - 然后我们有一个 CatBoost 从
state
和transmission
特征的组合中创建的分类特征
一个有趣的观察结果是,对于像model_name
这样的一些特征,最有用的是Border
类型的编码,而对于其他特征,例如manufacturer_name
,最有用的编码是通过Counter
方法获得的。
logging_level=Info
了解你的模型如何工作的另一种方法是用logging_level=Info
参数进行训练。此设置允许我们查看为每棵树选择的特征分割:
model = CatBoostRegressor(custom_metric= ['R2', 'RMSE'], learning_rate=0.3, n_estimators=5)
model.fit(train_pool, eval_set=test_pool, logging_level='Info')year_produced, bin=47 score 669154.1979
{drivetrain} pr0 tb0 type1, border=10 score 754651.9724
year_produced, bin=56 score 809503.2502
year_produced, bin=51 score 856912.7803
engine_capacity, bin=24 score 888794.1978
{state} pr1 tb0 type0, border=12 score 901338.6173
0: learn: 5040.7980368 test: 5141.1143627 best: 5141.1143627 (0) total: 17.9ms remaining: 71.7msyear_produced, bin=49 score 474289.2398
engine_capacity, bin=14 score 565290.1728
year_produced, bin=54 score 615593.891
year_produced, bin=43 score 638265.472
{state} pr1 tb0 type0, border=10 score 663225.8837
engine_capacity, bin=24 score 667635.803
1: learn: 4071.9260223 test: 4162.4422665 best: 4162.4422665 (1) total: 24.9ms remaining: 37.3msyear_produced, bin=50 score 332853.7156
{body_type} pr2 tb0 type0, border=8 score 403465.931
{manufacturer_name} pr0 tb0 type0, border=7 score 428269.628
year_produced, bin=38 score 458860.027
feature_2, bin=0 score 474315.0996
year_produced, bin=54 score 485594.3961
2: learn: 3475.0456278 test: 3544.0465297 best: 3544.0465297 (2) total: 31.3ms remaining: 20.9msyear_produced, bin=45 score 250517.4612
engine_capacity, bin=13 score 290570.2886
year_produced, bin=55 score 340482.1423
{manufacturer_name} pr1 tb0 type0, border=6 score 352029.1735
feature_1, bin=0 score 368528.2728
year_produced, bin=50 score 376011.7075
3: learn: 3066.9757921 test: 3128.4648163 best: 3128.4648163 (3) total: 37.4ms remaining: 9.35msyear_produced, bin=46 score 184224.3588
feature_6, bin=0 score 214268.3547
{body_type} pr0 tb0 type1, border=5 score 238951.9169
{state} pr1 tb0 type0, border=9 score 260941.1746
transmission, value=1 score 275871.0414
{engine_fuel} pr1 tb0 type0, border=7 score 289133.3086
4: learn: 2797.0109121 test: 2864.4763038 best: 2864.4763038 (4) total: 42.8ms remaining: 0usbestTest = 2864.476304
bestIteration = 4
对于数字特征,格式如下:
特征名称、所选分割的索引、分割分数
示例:year_produced, bin=47 score 669154.1979
分类特征的格式为:
特征名称、先验、目标边界、编码类型、分类特征边界、分割分数
例子:{state} pr1 tb0 type0, border=12 score 901338.6173
为了方便起见,分类特征名称写在括号{}中
二元分类和多元分类任务的参数调整。
在我们的教程中,我们正在进行回归任务,所以我想对二元分类和多分类任务的分类参数调整做一些说明。
- 对于二元分类,参数调整与回归任务非常相似,除了增加
TargetBorderCount
参数值通常是无用的(除非你传递概率作为目标)。 - 在多分类任务中,我们应该记住,通常我们在类上没有任何自然顺序,所以不推荐使用
FloatTargetMeanValue
或BinarizedTargetMeanValue
编码。如果你的训练时间太长,你可以试着将TargetBorderCount
设置为一个比默认的 n_classes - 1 更低的值,如果有办法将你的一些类合并的话。
结论
恭喜所有读完本教程的人:)正如我们看到的,CatBoost 包中与分类特征处理相关的可调参数的数量令人印象深刻。我们学会了如何控制它们,我非常希望这些知识能够帮助您在涉及分类数据的任务中获得最佳结果!
演练:对欺诈性信用卡交易进行分类
原文:https://towardsdatascience.com/categorizing-fraudulent-credit-card-transactions-8c6490645fd7?source=collection_archive---------49-----------------------
尝试各种分类器模型并深入研究 XG Boost
Pexels.com的卡罗琳娜·格拉博斯卡的照片
简介:
作为 Metis 数据科学训练营的一名学生,我选择探索欺诈卡交易作为我的第二个个人项目。这个项目有三个需求:用 SQL 从 postgreSQL 数据库中查询数据,开发一个分类模型,以及创建一个交互式可视化。我发现 postgreSQL 和交互式可视化组件相当简单,所以这篇文章的大部分讨论了一个可用模型的开发,但是,我包含了其他两个组件的一些见解和技巧。此外,查看 Github 库了解项目背后的所有代码。
背景:
在寻找一些有趣的数据进行分析后,我在 Kaggle 上偶然发现了这个比赛。电子商务支付解决方案公司 Vesta Corporation 收集了一些信息。包含卡交易信息的 csv 文件,包括交易金额、卡类型、购买浏览器、一些其他各种基本信息,以及该公司设计的但在数据描述中未定义的 300 多项功能。目标包含在名为“isFraud”的列中,用 1 定义欺诈交易,用 0 定义有效交易。与。手里拿着 csv 文件,是时候将它们放入 postgreSQL 数据库并将这些信息转化为见解了。
在深入探讨之前,我想先介绍一下这个项目:
- SQL 技能(postgreSQL、SQLAlchemy、Psycopg2)
- 分类建模(逻辑回归、XG Boost、随机森林等等)
- 交互式可视化(Streamlit)
步骤 1:使用 postgreSQL 🗄
正如我前面提到的,这个项目的一个要求是使用 SQL 来查询数据。将数据放入。csv 文件,我可以将它们转换成数据帧,然后放入 SQL 数据库。
代码如下,我将讨论它的全部含义。首先,我阅读了。csv 文件转换成数据帧,然后创建一个引擎来连接本地 postgreSQL 数据库,我将它命名为“project3”。这个 SQLAlchemy 引擎是整个代码块的关键。它允许 jupyter 笔记本与 postgreSQL 交互,并在给定的数据库中创建表。还有,这些。csv 文件包含多种类型(对象、整型、浮点型等)。),而且 SQLAlchemy 能够解释 DataFrame 并创建具有相应数据类型的列的方式令人惊叹。此外,它使这个过程比使用命令行快得多(更大。csv 文件超过 300 列)。
*# First, turn those csv files into DataFrames.*train_identity = pd.read_csv('../Project-3/train_identity.csv')train_transaction = pd.read_csv('../Project-3/train_transaction.csv')# Create a connection to the project3 postgreSQL database.engine = create_engine(‘postgresql://[USERNAME]:[PASSWORD]@localhost:5432/project3’)# Turn the DataFrames into tables in the postgreSQL databasetable_name = 'train_ident'train_identity.to_sql(table_name,
engine,
*if_exists*='replace',
*index*=False,
*chunksize*=500)table_name = 'train_trans'train_transaction.to_sql(table_name,
engine,
*if_exists*='replace',
*index*=False,
*chunksize*=500)
这是该项目的大部分 SQL 组件。我不会在这方面做更多的讨论,但我会发布连接两个表的更复杂的 SQL 查询来进一步研究数据。
mastercard_full = pd.read_sql(
"""SELECT * FROM train_trans LEFT JOIN train_ident ON train_trans.”TransactionID” = train_ident.”TransactionID” WHERE train_trans.card4=’mastercard’""", *con*=engine)
第二步:分类建模🎯
随着数据成功地存储在 postgreSQL 数据库中,然后查询到 DataFrame 中,我从一些基本的 EDA 开始,并很快理解了我的主要挑战:类不平衡。
作者图片
阶级不平衡的问题归结到如何决定模型的成功。如果我只关心准确性,我可以预测所有的交易都是有效的,并且有 97%的准确性。对于未经训练的人来说,97%的准确率看起来非常理想,但这意味着该模型预测欺诈交易的比例为 0%。这个 0%的指标被称为召回。回忆回答了这个问题:在所有欺诈交易中,模型正确预测的百分比是多少?另一方面,有效事务的召回将是 100%,因为所有有效事务都被正确预测为有效。因为大家都知道问题在于类别不平衡,而目标是预测欺诈性交易,所以衡量成功的标准就变成了欺诈性交易的召回率和整体准确性。
那么,我是如何解决阶级不平衡的问题的呢?有几种方法可以解决类不平衡问题,但我选择关注过采样。我探索的三种方法是 RandomOverSampler、SMOTE 和 ADASYN。这些方法中的每一种都采用少数类并对其进行过采样,直到它与多数类平衡。RandomOverSampler 随机复制少数类中的数据点。合成少数过采样技术(SMOTE)在少数类中创建新点,但使用线性插值和 K-最近邻,因此它是一种更高级的过采样技术。最后,自适应合成采样(ADASYN)根据密度分布在少数类中创建新点。
关于代码,实现这些过采样技术非常简单,如下所示。值得注意的是,训练数据是过采样的,然后用于拟合模型,从而得到整体更好的模型。
# RandomOverSampler
ros = RandomOverSampler(*random_state*=0)
X_tr_sam, y_tr_sam = ros.fit_sample(X_train,y_train)# SMOTE
X_smoted, y_smoted = SMOTE(*random_state*=42).fit_sample(X_train,y_train)# ADASYN
X_adasyn, y_adasyn = ADASYN(*random_state*=42).fit_sample(X_train,y_train)
评估二元分类问题的另一个常用指标是 ROC 曲线和曲线下面积(AUC)。下面是三条 ROC 曲线,对应于不同的过度拟合方法和我想要测试的几个分类器模型。很明显,Random Forest 和 XG Boost 是最好的模型,它们也是集合模型,这表明了集合模型在整体上创建更好的模型的卓越质量。
作者图片
利用这些视觉效果和度量标准,为前进创造了更清晰的愿景。我决定用随机过采样来研究 XG Boost 分类器。此外,值得注意的是,XG Boost 的性能比随机森林分类器稍差,但是,我选择 XG Boost 是因为 Kaggler 大肆宣传 XG Boost,所以我想更深入地研究这种特定类型的建模。
至于特性和特性工程,最好查看笔记本了解更多信息。关于 XG 增强,我非常兴奋地调整超参数以增加 ROC AUC 分数,从而增加模型召回。为了找到最佳的超参数,我查看了文档,以找到要调整的具体参数。参数 max_depth、min_child_weight 和 gamma 与模型复杂度相关,而 colsample_bytree 和 subsample 与处理噪声的模型相关。在使用 GridSearchCV 之后,我找到了这些参数的最优值。GridSearchCV 是一个非常密集的过程,所以由于计算机的压力,我分别运行我的参数,同时运行所有的参数可能更好。
# Choose the parameters to tunecv_params = {'max_depth': [4,5,6], 'min_child_weight': [1,2,3], 'gamma': [0,1,2]}# Run gridsearchxgbc1 = GridSearchCV(*estimator*=xgb, *param_grid*=cv_params,*scoring*=’roc_auc’)xgbc1.fit(X_tr_sam, y_tr_sam)# Observe the best parametersxgbc1.best_params_
{'gamma': 2, 'max_depth': 6, 'min_child_weight': 1}# Repeat with other parameterscv_params = {'subsample': [0.5,0.75,1], 'colsample_bytree': [0.5,0.75,1]}fix_params = {'gamma': 2, 'max_depth': 6, 'min_child_weight': 1}xgbc = GridSearchCV(*estimator*=XGBClassifier(**fix_params), *param_grid*=cv_params,*scoring*='roc_auc')xgbc.fit(X_tr_sam, y_tr_sam)xgbc.best_params_{'colsample_bytree': 1, 'subsample': 0.75}
随着数据过采样(以对抗阶级不平衡),特征的选择和设计,以及模型参数的调整,是时候看看结果了。下图结合了 ROC 曲线和混淆矩阵。混淆矩阵是另一种轻松查看分类模型结果的方式。首先,AUC 得分为 0.96,比上面 ROC 曲线中显示的任何模型都好。关于混淆矩阵,很容易看出模型哪里工作得好,哪里不理想。至于这个项目的目标,在 1949 个欺诈交易中有 1589 个被正确预测似乎非常好,但是还能做什么呢?
大多数(如果不是全部的话)分类模型输出特定预测的概率。通常有一个概率阈值参数,它可以告诉模型在哪里截断正预测。对于 XG Boost,我无法找出一种方法来调整模型中的概率阈值,但使用…
xgb.predict_proba(X_test)
…输出一个概率数组,描述有问题的特定点被分类为欺诈的概率。我将重点放在这个预测概率数组上,作为 Streamlit 应用程序的基础。
第三部分:streamlit 应用
Streamlit 是一个为编程新手创建应用程序的神奇工具。由于我今年才开始大量编写代码,并重点关注 python,因此跳入高级 flask、html、d3 或任何更深入的开发语言和工具似乎有点超出了这个简短分类项目的范围。幸运的是,作为 python 程序员,Steamlit 非常容易使用,生成的应用程序看起来很专业。
该应用程序的代码在这个 python 文件中,但我将贯穿我最终应用程序的基本概念。如果一家银行要使用这个模型,我想提供一个助手来确定这个模型的概率阈值。由于阈值非常低,所有欺诈性交易都会被正确预测,但许多有效交易会被错误地预测为欺诈。另一方面,更高的概率阈值将导致更多的欺诈交易被分类为有效交易。该应用程序允许银行查看在不同阈值下会发生什么,并选择适合其需求的特定阈值。
第一个图表显示了召回率和精确度与阈值之间的关系,金色线条代表所选的阈值。第一张图表下方是召回和通过识别欺诈交易节省的金额。在这些数字的更下方是一个混淆矩阵,提供了一个额外的视觉辅助来帮助确定最佳概率阈值。
作者提供的视频
结论:📗
在处理分类问题时,类不平衡是一个常见的问题,在处理大型(或小型)数据集时,过采样是解决这个问题的一个很好的方法。另外,python 使得用基本代码比较多个模型,然后用 GridSearchCV 调优超参数变得很容易。这些技术对于数据科学家早期学习非常重要,因为有了这些基础知识,模型改进可以很快完成。现在,我觉得有必要回到我的以前的项目,调整超参数并测试更多的模型,以增加该项目的有效性。无论如何,这里有一些关于这个项目的基本要点:
- 学习 SQL!
- 总是花时间探索数据
- 尽早开发一个 MVP,并在该模型的基础上进行构建
- Streamlit 让创建应用变得简单
- 给利益相关者一个容易理解的解决方案或解释
查看 Github 仓库以获得关于这个项目的更多信息——我真的喜欢让我的笔记本容易跟随。此外,如果您有任何问题或意见,请联系我们。
我真的很喜欢我的数据科学之旅,并希望继续分享我的学习经历。请随意查看关于我的第二个项目的博客,并在我继续探索数据科学世界时回来获取更多更新。
伸手:
LinkedIn|Twitter