细胞自动机和深度学习
智能系统
细胞自动机(CA)是基于网格的计算系统,它模拟复杂性的增长。简而言之,细胞自动机是单向和混乱的进化模式。进化的规则是非常基本和简单的,然而,进化产生了高度复杂的结构和行为。CA 被认为是物理混沌系统中复杂性增长的模型,也是对称性如何从简单的定律中产生的模型。我喜欢将 CA 与统计力学进行比较:对于气体来说,温度的概念在分子/原子水平上是不存在的。温度不是单个分子的属性。然而,当你把数百万/数十亿个分子放进一个盒子里时,分子之间的动力学和运动学会产生温度。我们称温度为系综的“突发”属性。CA 的行为方式相似——它们遵循非常简单的局部规则,CA 的集合产生“涌现”的对称性和复杂的行为。
在这篇博客中,我们将关注 2d CA 最著名的例子,即“生活游戏”(GOL)。这是康威在 20 世纪 70 年代发现的。一个细胞的进化依赖于它的邻居。细胞有两种状态——死亡(黑色)或存活(白色)。自动机遵循这些简单的规则,
- 一个邻居都死了的牢房因为孤独而死。
- 一个有 3 个以上邻居的牢房死于饥饿
- 由于复制,具有 3 个或更多活邻居的死细胞变得有活力
- 具有 2 或 3 个活邻居的细胞保持相同的状态— 停滞。
我们在下图中代表了所有这些状态,
GOL 规则(n =邻居)
我们让 CA 的 2d 网格随时间演化,并获得有趣的结构。初始起点通常是随机的。某些固定的起点产生了特定的结构。人们试图对可能出现的结构进行动物学分类。让我们看一些随机初始状态的进化例子,
GOL 进化
有时(基于初始条件)会出现如下非常有趣的结构,
一个有趣的模式出现了:滑翔机枪
维基百科上关于 CA 的文章包含了许多这些复杂结构的例子。注意上图有一个与之相关的对称性,而规则是局部的,没有对称性。这是“突现”对称的一个例子。
说够了。深度学习和这有什么关系?
实施
规则是局部的(它们只看邻居)这一事实意味着 CA 与卷积运算非常相似。受此链接的启发提出了以下架构作为 CA 模型,
我们从一个 50x50 的图像(这是我们的世界网格)开始,执行翻转填充,使其成为 52x52。翻转填充意味着我们识别左右和上下边缘,以使整个网格连续。52×52 的图像被送入 100 个 3×3 的过滤器。该过滤器的数量随着您想要建模的 CA 的种类而变化。至少可以用 5 个滤波器来模拟 GOL。最后,我们实施 1x1 卷积,为下一个时间步获得 50x50 的图像。**我们想要强调的是,这个网络类似于 CA 的单时间步进化。**仅用一层卷积,不可能模拟任意长时间步长的演化。为了建模,CA 需要不断重用网络来生成 n 步进化。现在,让我们看看 TensorFlow 中的实现,
TF 2 中的两个简单实现
我们训练 CA 在随机产生的初始状态上进行一步进化。训练和评估模型的完整代码在这里给出。
现在让我们看看 CA 在现实世界中的各种应用。
应用
- 纠错。
CA 可以从很少的例子中快速学习。CA 可以在图像上被训练,以作为自校正网格来去除杂质。图像误差校正的一些例子是,
-
单向函数:
CA 的传播不是双射函数,因此给定一个时间步长的状态,实际上不可能找到初始配置。可能的先前状态的数量呈指数增长。我尝试了深度和广度 conv 网来映射一个反向函数,但找不到初始配置。这表明寻找逆是一项重要的任务,也许根本不可能。 -
ARC(抽象推理挑战赛)
Keras 的创造者弗朗索瓦·乔莱(Franç ois Chollet)最近出了一篇论文,关于如何衡量智力。他提出了大量的任务,包括不同种类的抽象解决技术。每个任务只有很少的(通常 2-3 个)训练样本和一个测试样本。目标是实际学习解决任务所需的逻辑,而不是学习某种转换。由于可用的训练样本非常少,基于神经网络的方法容易过度拟合。SOTA 方法使用决策树,并且有大约 50/400 的成功率(非常糟糕)。让我们看一些任务的例子,
寻找反射光线
将红色贴在蓝色上
正如你所看到的,任务是非常不同的,需要全局物理,拓扑等知识。设计一个可以概括所有可能情况的单一神经网络几乎是一项不可能的任务。基于 CA 的方法是针对以下任务的建议解决方案。我的一些初步实验给出了 20/400 的成功率。如果你想让我用 CA 来解决 ARC 任务,请在下面的评论中告诉我。
参考文献
- 代码: Github
- 生命的游戏:https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
- CA as Conv 网:https://arxiv.org/abs/1809.02942
- 智力测量:https://arxiv.org/abs/1911.01547
药物开发中的细胞图像分类:逐步指南
荧光显微镜:可视化细胞及其组成部分。图片由作者使用 rxrx 库制作
你有没有想过,在没有任何深度学习知识的情况下,你是否可以对图像进行分类?如今,已经有了很棒的免费库,比如 Python 中的 Keras 和 fastai ,或者已经成功抽象出深度学习的 Intelec AI 软件,任何人都可以开始他们的深度学习之旅,即使你只有一年的编码经验。
这篇文章将向你展示我如何参加一个复杂的关于细胞图像分类的竞赛,只使用了熊猫和智能。
概述和背景
药物和医疗方法通常需要很多年才能开发出来,因此价格昂贵,公众无法获得。递归制药公司。相信人工智能有能力减少生产新药的时间和成本。
用人工智能帮助制药公司的一个具体方法是能够对接受特定遗传扰动的不同细胞图像进行分类(称为 siRNAs )。如果你能在给定图像的情况下,以很高的准确度猜出药物,这意味着药物以某种方式与细胞相互作用。
这正是我们 kaggle 挑战的问题:递归细胞图像分类。给定一些图像,我们应该能够预测哪个 siRNA 应用于它。
理解数据:荧光显微镜
左图:6 个通道上的荧光显微镜。右图:变形图像。图片由作者提供。
荧光显微镜的原理是使用不同的蛋白质,这些蛋白质只在特定的光谱颜色范围内发出荧光,并且倾向于附着在细胞的某些特定部分。
上面左边部分的图像代表了从同一台相机在同一地点通过六个不同的光谱颜色范围拍摄的照片。由于荧光显微镜的原理,这是可能的。每个频率都表示为黑白图像。第一个目标是能够将它们表示成一个单一的 RGB 图像,如右边部分所示。
挑战简介
细胞信号:从细胞图像的实验噪音中分离生物信号
www.kaggle.com](https://www.kaggle.com/c/recursion-cellular-image-classification/overview)
Kaggle 发布了一个艰难的分类挑战:一个超过 750,000 张图像(代表几乎 50 GB)到超过 1100 个可能类别的分类任务。图像数据集以如下方式排列:有 51 个批次。每批有四个平板,每个平板有 308 个填充的孔。每口井在两个地点进行监控,并在六个频率上拍照。太多了!我们将在下一节看到如何减少数据集的大小,保留最相关的组件。你可以在这里下载的资料。
这种排列产生以下树形数据结构:
我们的数据是如何排列的?作者图片
理解数据:它看起来像什么?
如前所述,每个地点都是在六个频率上拍摄的(在上图中用 w1,…,w6 表示)。如果只有 3 个频率就好了,就像我们在处理 RGB(红绿蓝)图像一样,因为大多数最先进的神经网络将 RGB 图像(即正好有三个通道的图像)作为输入。有很多方法可以将一些数据从高维降低到低维。我们将探索其中的两个。
首先,我们将使用一个小而方便的库来处理由 rxrx.ai 创建的特定数据。这个库将帮助我们以更有意义的方式可视化我们的数据。您应该在您希望运行所有脚本来准备数据的同一个文件夹中克隆他们的 git repo。从终端,您可以执行:
git 克隆https://github.com/recursionpharma/rxrx1-utils
然后,打开 jupyter 笔记本或 python 脚本,尝试以下操作:
这里有一个笔记本,上面有所有的代码。
为了确保您正确理解数据的树结构,请尝试更改 load_site_as_rgb 函数的参数,并查看是否有 rgb 单元格图像出现!
预期产出。作者图片
准备数据
因为我们想使用 Intelec ai 软件,我们需要坚持一些关于数据结构和标签文件的格式。我们将在后面讨论如何安装它。现在,我们已经创建了标签文件!
如果你想自己尝试,你没有义务尝试以下两种方法!一个就够了!
现在我们终于可以给我们的两个函数下一些定义了!
从左到右,作者使用 PCA 和 Colormap 技术生成的两幅图像如下所示。
主成分分析
主成分分析(PCA) 是对一些数据进行降维的常用技术。需要一个额外的库:scikit-learn。相应的代码如下:
尽管 PCA 通常在将数据嵌入到较低维度的流形中时显示出优异的结果,但这可能再次不适用于该问题,因为 PCA 通常在发现特征(此处为通道)之间的线性相关性时是好的,而对于那些细胞图像可能不是这样。
彩色地图
我们可以使用的最后一个想法是将每个通道的色图应用于 RGB 值。例如,可以想象第一通道将输出图像着色为红色值,第二通道着色为绿色值,第三通道着色为蓝色值,最后三个通道着色为某种组合,如洋红色等。但是要知道一个好的色彩映射表策略,我们应该对数据有深刻的理解,这不是我个人的情况。好在 rxrx 库有这个漂亮的方法叫 load_site_as_rgb!记得吗?它所做的是,我们需要指定它一个细胞图像,它应用一个自定义的色彩映射表来输出一个 3 通道的图像,正如我们所希望的那样!
有人会注意到我撒了一点谎,我们实际上使用了 convert_tensor_to_rgb 方法,因为另一个调用了他们的在线 API,比我们自己在本地打开图像要慢得多。
你可能会喜欢尝试自己的想法。为了保持代码对其他方法的模块化,我建议使用最后一种方法,它将允许我们根据需要选择任何函数:
现在我们需要主循环:遍历所有数据并将图像转换成 RGB 图像,如上所述。
关于上述代码的一些说明:
- 第一行是如果你想尝试一个特定的建议方法(或者尝试你自己的想法),你可能会改变的内容。)
- 你会注意到,在第 9 行,我们将站点固定为“1 ”,并且从未使用过第二个站点。原因是我们希望使用更轻的数据集,这只是一个演示,我们并不是要赢得 kaggle 竞赛(但如果你有动力,你可以使用这两个网站!)
- 由于并非所有组合都定义了完整的数据,可能会有一些图像在站点 1 中不存在,因此我们使用 try-except 块来避免程序崩溃。
就是这样,伙计们!我保证,我们完成了旅途中最艰难的一步!现在我们有了格式良好的数据,让我们使用 intelec ai !
如果你愿意,你可以在这里查看完整的笔记本。
智能安装
点击这里可以安装 Intelec ai。
[## 支持 GPU 的自动化机器学习平台免费下载
编辑描述
www.intelec.ai](https://www.intelec.ai/install)
你需要码头工人。如果你在安装上有问题,我邀请你去看看他们的网站。
世界领先的服务,用于与您的团队和 Docker 社区查找和共享容器图像。对于…
www.docker.com](https://www.docker.com/)
运行它的第一个模型
我们终于到了!是的,我知道你也不耐烦在没有任何代码的情况下训练你的深度学习模型,别担心,我会告诉你怎么做。
上传您的数据
首先,您需要上传您选择的数据,然后可以是 PCA 或 colormap 或您选择的任何其他版本。
- 压缩你的文件夹。
- 进入英特尔页面的“文件浏览器”标签。
- 上传吧。
- 右键点击它解压。
选择您的型号
Intelec 的免费版本已经提供了一些有趣的神经网络。转到“培训”选项卡。分类任务有一个简单和一个较重的模型。我的建议是直接接受更重的挑战,因为这个挑战是一项复杂的任务。无论您选择简单型号还是较重型号,步骤都是完全相同的:
- 为您的分类器命名,例如深色细胞分类器
- 选择名为“train”的文件夹,其中应包含另一个名为“images”的文件夹和您的“labels.csv”文件
- 您可以选择添加一个测试或验证文件夹,我个人并没有为这个特定的任务这样做。否则,Intelec 将把培训的一部分作为默认验证,这完全没问题。
- 您还可以设置收缩因子:分辨率越高,分辨率越小,即模型训练越快,但精度越低。我的建议是从一个高值开始,然后慢慢降低它,看看在一个模型上花更多时间是否值得。也许从 4 开始,因为图像分辨率已经很低了(512x512x3)。在我的结果中,我实际上使用了 1 的收缩因子,因为我为这个任务租了一个服务器,但是你肯定不需要这样做。
这就对了。你可以保存这个模型。应该会打开另一个页面,建议您开始训练程序。这可能需要一段时间,所以请确保您的 GPU 设置正确。如果你需要建议,你可以阅读这个有趣的话题。
模型准备部署。作者图片
如果您看到红色粗体的“部署”按钮,这意味着您成功地训练了您的分类器,祝贺您!当然,你可能很想知道你的训练有多好。向下滚动一点,你应该会看到类似下图的东西。如果您有兴趣,可点击“培训总结”按钮了解更多详情。
培训和验证损失。作者图片
为了获得有意义的度量,总是在验证数据集上测量您的损失是非常重要的,以确保您没有过度拟合。您可能已经自己指定了一个测试或验证集,但是如果您没有,不要担心 intelec 会为您做的。
太棒了,你的模特真的学到了一些东西!我们可以看到损失减少了多少!
如果您想更进一步,您可以部署模型来预测一个或几个测试图像。你也可以给它一个任务来预测整个文件夹,如果你想参加 kaggle 比赛,这真的很有用,因为几乎要做 20,000 次预测。一个很好的视频解释了如何做所有这些事情。如果你很好奇,看看吧!
结论
多好的旅程啊!我们学到了很多关于医疗行业和制药公司如何着手开发新产品的知识,更重要的是,深度学习如何能够拯救我们。事实上,我们没有看到我们的神经网络架构的实现细节,但这就是 intelec AI 软件的目的:让每个人都可以进行深度学习。我们只需要对 pandas 库有一些了解,对 python 有一点经验,然后我们就能够解决一个困难的问题,比如超过一千个类的分类任务。
使用 fastai v2 和多标签文本分类器审查有毒评论
让互联网成为一个安全的空间,一次一个字
近来,互联网已经成为一种基本的必需品,我们世界中的许多物理事物正处于数字化的边缘。世界上已经有很大一部分人使用互联网进行日常事务、娱乐、学术研究等。保持互联网成为一个安全的空间,让每个人都能来这里互动,这是一个重大的责任,因为有各种各样的人在互联网上张贴东西,而没有意识到其后果。
这篇文章介绍了一个文本分类器的制作过程,它接受一段文本(短语、句子、任意长度的段落),并判断该文本是否属于一系列不同类型的恶意文章。本帖涵盖的主题有
您可以单击上述任何一个要点,导航到相应的部分。
免责声明:此处使用的数据集包含一些可能被视为亵渎、粗俗或冒犯的文本。
乔恩·泰森在 Unsplash 拍摄的照片
介绍
自然语言处理是一个研究理解计算机和人类语言之间交互的领域。由于许多东西正在走向在线或数字化,而且这些服务已经普及到全世界,这些数据产生的规模是巨大的。在这个时代,地球上的每个人都在发表他们的观点、想法、事实、文章、诗歌等等。在网上,监控和调节这些文本是一项不人道的任务(即使我们认为人类是一个社区,而不是一个个体)。
多亏了高容量 GPU 和 TPU 的出现,以及人工智能在文本应用方面的最新进展,我们已经提出了许多解决这个问题的技术。递归神经网络是解决这些问题的关键要素。fastai 是一个深度学习库,建立在 PyTorch 的基础上,由杰瑞米·霍华德和西尔万·古格开发,使得为这些任务构建应用程序非常用户友好和简单。
让我们开始学习如何使用 fastai 进行文本分类。
从 Kaggle 获取数据
我们将用于演示多标签文本分类过程的数据来自 Kaggle 上的有毒评论分类挑战。
我们的模型将负责检测不同类型的毒性,如威胁、淫秽、侮辱和基于身份的仇恨。该数据集包括来自维基百科谈话页面编辑的评论。事不宜迟,让我们开始下载这个数据集。
您可以手动从 Kaggle 下载数据集,也可以使用上面的命令使用 kaggle 提供的 API。
要使用 API,您必须创建一个 Kaggle 帐户并生成 API 密匙,该密匙允许您使用 shell 命令从 kaggle 下载数据集,并从工作笔记本或 shell 提交预测。一旦你创建了一个 Kaggle 帐户并创建了 API 密匙,你将得到一个 json 文件,其中包含你的用户名和密匙。根据您的唯一凭证,这些需要在上面的代码中输入。
由 MRINALI GUPTA 撰写的这篇文章很好地解释了如何开始使用 Kaggle API 下载数据集。
数据探索
让我们阅读训练集和测试集,并掌握其中包含的数据。
图片由 Vinayak 提供
数据帧中有几个字段。
- id :与曾经的注释文本相关联的标识符。由于这是从维基百科的对话页面上获取的,它可能是某个发表评论的人的身份,或者是他们发布的文本的 HTML DOM id。
- comment_text :用户发布的评论的文本。
- **有毒、严重 _ 有毒、淫秽、威胁、侮辱、身份 _ 仇恨:**这些列表示 comment_text 中同名元素的存在。如果它们不存在,就用 0 表示,否则就用 1 表示。
这些元素在某种意义上是独立的,它们并不相互排斥,例如,一个评论可以是*有毒的和侮辱性的,*或者如果一个评论是有毒的,它就不一定是淫秽的,等等。
图片由 Vinayak 提供
总的来说,有不良文字的评论要少得多;考虑到我们有超过 10 万条评论,有不到几万个令人反感的类别(除了有毒的那几个)。知道这一点很好,但如果这类文本更少就更好了。
此外,文本被人类标注了这些标签。这个注释的任务是一个巨大的任务,伴随着这些注释,会有很多人为的解释和偏见。这是需要记住的事情,我们将在结束时讨论这个问题。
多标签文本分类方法
文本或句子是单个单元的序列——单词、子单词或字符(取决于你说的语言)。任何机器学习算法都无法处理除数字之外的任何东西。所以,我们首先要用数字来表示数据。
在任何与文本相关的问题中,首先我们创建一个词汇库,这个词汇库基本上是我们要考虑的全部词汇;任何其他单词都将被加上一个名为 unknown 的特殊标签,并放入该桶中。这个过程叫做 标记化。
接下来,我们将每个单词映射到一个数字标记,并创建一个单词字典来存储这个映射。所以现在每一篇散文/评论/文字都转换成一串数字。这个过程叫做 数值化。
最肯定的是,评论的长度不会一样长,因为人们并不局限于用固定的字数来评论。但是,当创建批量文本以提供给我们的网络时,我们需要它们都具有相同的长度。因此,我们用一个特殊的符号来填充句子,或者如果句子太长而不能压缩到固定长度,我们就截断句子。这个过程叫做 填充。
在做上述所有事情的同时,还有一些其他的操作,比如将所有的文本小写,将标点符号作为单独的符号处理,理解大写而不管小写等等。这就是 fastai 的优秀员工让所有这些事情变得超级简单的地方。
- xxpad :对于填充,这是使用的标准令牌。
- xxunk :当遇到一个 oov(词汇外)单词时,这个令牌用来替换那个单词。
- xxbos :在每个句子的开头,这是一个标记,表示一个序列的开始/起点。
- xxmaj :如果一个单词是大写的或者标题是大小写的,这个符号会被加前缀以获取信息。
- xxrep :如果一个单词重复,那么在标记化的表示中,我们将让这个单词后面跟着 xxrep 标记,后面跟着重复的次数。
有更多的语义信息用更多的这种标记来处理,但所有这些都确保捕捉到关于文本及其背后含义的宝贵信息。
一旦预处理完成,我们就可以建立一个 LSTM 模型来将文本分类到各自的标签中。单词被表示为 n 维向量,俗称编码/嵌入。PyTorch 中有一个用于嵌入的构造,它有助于在给定单词的数字标记的情况下查找单词的矢量表示,然后是其他 RNN 层和全连接层,以构建一个架构,该架构可以将序列作为输入,并返回一组概率作为输出。这些向量嵌入可以被随机初始化,或者从通常可用的 GLoVE 或 Word2Vec 嵌入中借用,这些嵌入已经在大的文本语料库上被训练,使得它们在一般意义上对特定语言中的上下文具有良好的语义单词理解。
然而,如果我们在构建分类器之前执行它,有一个技巧可以改善结果。这就是我们接下来要看的。
fastai v2 中的语言模型
fastai 提出了在构建任何分类器或应用程序之前微调语言模型的这种经过试验和测试的方法。
简而言之,他们说的是,如果你有一组在大型语料库中训练过的单词嵌入,他们对从语料库中学到的单词有一个非常通用的理解。然而,当我们谈论仇恨言论和令人讨厌的评论以及有毒的东西的分类时,有一种与这些句子相关的特定的负面氛围,并且语义上下文还没有出现在我们的嵌入中。此外,许多特定于我们的应用程序的单词/术语(可能是医学或法律或有毒语言)可能不会经常在我们从中获得单词嵌入的庞大语料库中遇到。在我们的分类器将要使用的嵌入中,这些应该被包含并很好地表示出来。
因此,在建立分类器之前,我们将微调一个已经在维基百科文本语料库上训练过的语言模型。我们将把训练和测试数据集的注释绑定在一起,并将它们提供给语言模型。这是因为我们不是在做分类,而是在给定当前序列的情况下简单地猜测序列的下一个单词;这叫做自我监督任务。通过这种方式学习嵌入,我们将能够构建一个更好的分类器,因为它知道特定于我们语料库的概念。
让我们看看如何在 fastai v2 中实例化和微调语言模型。
图片由 Vinayak 提供
我们附加训练和测试数据,并丢弃标签,因为在这个自我监督的学习任务中我们不需要它们。接下来,我们必须创建一个数据加载器来标记这些文本,在将它输入语言模型之前进行所有的数值化、填充和预处理。
1
这在 fastai 中非常简单,您只需将所有参数包装在一个工厂方法中,并用它实例化 TextDataLoaders 类。否则,这至少需要一百行代码加上适当的注释和其他东西,但多亏了 fastai,它又短又甜。我们可以看看一批中的几个条目。
图片由 Vinayak 提供
正如我们所看到的,输出只是将给定的序列偏移一个字,这与我们想要的一致,即给定一个序列,预测序列的下一个字。一旦我们有了这个数据加载器,我们就可以创建一个语言模型学习器,它可以根据我们的语料库而不是以前的文本语料库来调整编码。
图片由 Vinayak 提供
有了语言模型学习器之后,我们可以让学习器适应几个时期,并使用 save_encoder 方法保存编码。我们可以看到,在给定当前单词序列的情况下,语言模型平均可以以 38%的准确率预测下一个单词会是什么,这对这个数据集来说是相当不错的。
一旦我们做好了准备,现在我们可以进入下一步,创建一个分类器来识别 comment_text 的不同标签的概率。
fastai v2 中的分类模型
在我们开始创建分类模型之前,我们需要进行一些预处理,以便构建一个合适的数据加载器。在写这篇文章的时候,文本的数据块 API 有一个问题,它避免了正确地推断所有的因变量,因此我们不得不求助于这个方法。
基本上,我们将不得不在我们的数据帧中创建另一列,该列使用固定的分隔符来指示单个标签的存在或不存在。所以,如果一个评论是淫秽和有毒的,我们的新栏目会显示淫秽;分隔符为“;”时有毒。同样,对于没有任何不良文本的行,为了给出一个标签,我们现在称它们为 sober(没有任何标签,fastai 不会创建 dataloader)。
图片由 Vinayak 提供
因此,我们可以看到添加了包含“;”的列标签带分隔符的标签字段,所有的标签都在这里表示,而不是以一次性编码的格式提供。
现在,我们使用 datablocks API 创建数据加载器,分别为 x 使用“comment_text”字段,为 y 使用“Labels”字段。如果我们在 get_y 字段中作为一个列表提到了 6 列的名称,那么它总是只选取两个字段;由于数据加载器的这种不正确的推断,我们必须创建一个单独的标签列来获取因变量,即 y 的值。接下来,一旦我们有了数据加载器,我们就可以使用 LSTM 架构构建一个分类器模型。一旦实例化了语言模型,我们还需要将它的编码/嵌入加载到分类器中。
图片由 Vinayak 提供
然后我们可以开始训练分类器。最初,除了最终的 FC 层,我们将保持网络的大部分处于冻结状态。这意味着反向传播权重更新将仅发生在倒数第二层。我们将逐渐解冻之前的层,直到最终我们解冻整个网络。我们这样做是因为如果我们从一个未冻结的网络开始,模型将很难快速收敛到最优解。
可以看出,在训练结束时,准确率已经达到了相当稳固的 98%。由于训练和有效损失都在减少,我们可以理想地训练更多的纪元并继续下去,但出于时间的考虑,我们将认为这是一个足够好的分数,并从推论开始。
做出推论
现在我们有了一个训练好的模型,并且我们已经将它存储为 pkl,我们可以使用它对以前看不到的数据(即测试数据)进行预测。
我们将首先加载我们刚刚在 GPU 上创建和训练的模型。(由于我们有几十万条评论文本,CPU 推断会耗费大量时间)。接下来,我们将对 test_df 进行标记化,然后通过用于训练和验证数据的相同转换来传递它,以创建用于推断的测试注释的数据加载器。
接下来,我们将使用 get_preds 方法进行推理,并记住将 reorder 方法传递给 False,否则会发生文本的随机重排,这将导致最终预测的顺序不正确。
最后,我们将以 sample_submissions.csv 样式格式化这些预测。因此,在预测之后,我们得到一组 7 个值,每个类一个,并且不需要“清醒”类的概率,因为它是我们作为占位符引入的。我们把它去掉,把所有的 id 按正确的顺序排列。这是最终提交的样子。
图片由 Vinayak 提供
最后,我们可以使用 kaggle API 本身提交这些预测。无需手动转到 kaggle 并提交 csv 文件。这可以简单地通过这个 shell 命令来完成。
# Submit the predictions to kaggle!kaggle competitions submit -c jigsaw-toxic-comment-classification-challenge -f submissions_toxic.csv -m "First submission for toxic comments classification"
您可以根据自己的方便更改提交文件的名称和消息。我得到的最终提交分数如下所示
图片由 Vinayak 提供
排行榜上的最高分大约是 0.9885,所以我们的分数在这样少的代码行和很少甚至没有预处理的情况下还是不错的。我们可以删除停用词,清理 html 标签,处理标点符号,甚至调整语言模型,或者使用 GloVE 或 Word2Vec 嵌入,并采用像 Transformer 这样的复杂模型,而不是简单的 LSTM。许多人以不同的方式处理这个问题,并使用其中的一些技巧来获得如此高的分数。然而,通过使用已经实现的 fastai 库,我们可以在第一次尝试中获得足够好的分数。
最后,值得一提的是,这个由人类标注的数据集可能被贴错了标签,或者人与人之间可能存在主观差异,这也是公平的,因为这是一项非常手工和单调的工作。我们可以通过建立一个模型来帮助这一过程,然后用它来注释,并让人类监督注释,以使过程更简单,或者将这项工作众包给多个志愿者,以在少量时间内获得大量标记数据。无论如何,NLP 在解决现实世界中的许多语言问题方面已经变得非常有用,希望在阅读完这篇文章后,你有信心用 fastai 开始你的文本世界之旅!
参考
使用 NetworkX 的普查地理
公共数据
使用 Python 中的图表表示人口普查地图的教程
概观
本教程的目标是创建一个表示纽约州各县之间地理关系的图形数据结构。具体来说,我们希望确定两个县何时相邻。
在我们开始写代码之前,让我们想一想我们想要如何构建这些关于节点和边的关系。
- 节点— 每个节点将代表纽约州的一个县。它们将通过它们的 FIPS(联邦信息处理标准)编号来识别。此外,每个节点将存储该县的自然语言名称以及公共交通的使用率。
- 边— 如果两个节点在地图上地理上相邻,它们将共享一条边
设置
要完成本教程,您需要以下内容
- 一个县邻接文件。
- 类似下面截图的人口普查数据框架。如果您对如何下载或格式化有任何疑问,请参考此处的。
在本教程中,我们将使用纽约州所有县的数据框架
节点
首先,我们需要导入一些包并实例化我们的 graph 对象。我们还假设我们的人口普查数据框架将被称为 df。
import pandas as pd
import networkx as nxdf=dfG = nx.Graph()
NetworkX 可以在每个节点以字典的形式存储数据。因此,为了存储我们的县名和公交使用数据,我们需要创建一个适当形式的节点列表。这将是一个 2 元组的列表,其中第一个元素是节点的名称,第二个元素是数据的字典。因此,单个元素将如下所示:
('36081',
{'percent_public_transpo': 52.27, 'county_name': 'Queens County'})
要创建这个列表,让我们创建一个函数,该函数接收一个县的数据帧,并遍历该数据帧以返回所需的列表
def process_counties(df):
final_list = []
for index, row in df.iterrows():
node = (str(index),
{'percent_public_transpo': row['percent_public_transpo'],
'county_name': row['county_name']})
final_list.append(node)
return final_list
现在将这些节点添加到我们的图表中。
county_FIPS = process_counties(df)
G.add_nodes_from(county_FIPS)
优势
要添加邻接边,我们需要读入在设置部分链接的 CSV 邻接文件
adj_df = pd.read_csv('county_adjacency2010.csv')
邻接文件将会像这样读入。
这是全国每个县的名单。我们需要把范围缩小到纽约州的县,否则我们会把邻近州的县也包括进来。要做到这一点,从原始 df 中制作一个 FIPS 列表,然后根据它进行过滤。
county_FIPS_list = list(df.index)
adj_df = adj_df[adj_df['fipscounty'].isin(county_FIPS_list)]
adj_df = adj_df[adj_df['fipsneighbor'].isin(county_FIPS_list)]
然后删除除 FIPS 代码之外的所有列
adj_df = adj_df[['fipscounty', 'fipsneighbor']]
我们将定义一个函数,将数据帧转换为元组列表,同时删除任何镜像或自连接的边。
def create_tuples(df):
all_tuples = list(df.itertuples(index=False, name=None))
final_tuples = [] for tuple in all_tuples:
if (tuple[1],tuple[0]) not in final_tuples:
if tuple[1] != tuple[0]:
final_tuples.append((str(tuple[0]),str(tuple[1]))) return final_tuples
最后,将邻接数据帧传递给它,并将结果添加到我们的图中。
fips_tuples = create_tuples(adj_df)
G.add_edges_from(fips_tuples)
肉眼观察
为了检查结果,我们将定义一个快速函数来绘制图形。
import matplotlib.pyplot as pltdef draw_graph(G):
plt.close()
nx.draw(G, with_labels=True, font_weight='bold')
plt.show()
return
最后,我们将把最终的 graph 对象传递给它来查看结果。这将是一个国家的抽象,可能看起来一点也不像纽约。
draw_graph(G)
NYS 邻接图的两种可能表示
就是这样。感谢您的阅读!
中心极限定理
对你永远记不住的概念的简要解释
由 Unsplash 上的 chuttersnap 拍摄
在概率和统计中,特别是在假设检验中,你会经常听到一种叫做中心极限定理的东西。中心极限定理(CLT)或多或少地表明,如果我们重复地抽取独立的随机样本,随着样本量的增加,样本均值的分布接近正态分布。无论群体或原始变量的分布形状如何,都会发生这种情况。提醒一下, 样本 是 总体*正态分布 用钟形曲线表示(如下图)。我们也可以使用 CLT 来估计样本值大大偏离总体均值的概率。正如我们在下面的图表中看到的,样本均值偏离总体均值超过三个标准差的概率极低。*
m . w . Toews——自己的作品,基于(概念上)杰瑞米·坎普的数字,2005 年 2 月 9 日,CC BY 2.5,https://commons.wikimedia.org/w/index.php?curid=1903871
中心极限定理对于从样本统计中估计总体参数非常有用,因为您通常无法从您的实验所代表的整个总体中获得数据。通常,数字 30 被用作 CLT 成立的最小样本量的标志。中央极限理论的一个流行例子是掷骰子的实验。掷出六面骰子时,掷出 1、2、3、4、5 或 6 的概率总是⅙.这个图看起来几乎是平的。然而,如果我们掷骰子两次,取平均结果,并重复 500 次,随着分布变得更正常,图形将开始变得更像钟形。随着我们在平均之前继续增加我们执行的滚动次数(n ),由于中心极限定理,该图将进一步表示正态分布。
By Cmglee —自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=18918612
参考资料:
在概率论中,中心极限定理(CLT)确定,在某些情况下,当独立随机…
en.wikipedia.org](https://en.wikipedia.org/wiki/Central_limit_theorem) [## 中心极限定理:定义和例子在简单的步骤-统计如何
什么是中心极限定理?中心极限定理的例子:一步一步用视频剪辑中心极限定理…
www.statisticshowto.com](https://www.statisticshowto.com/probability-and-statistics/normal-distributions/central-limit-theorem-definition-examples/)*
中心极限定理:现实生活中的应用
中心极限定理(CLT)是统计学中最流行的定理之一,在现实世界的问题中非常有用。在这篇文章中,我们将看到为什么中心极限定理是如此有用,以及如何应用它。
在许多使用统计的情况下,最终目标是识别人口的特征。
中心极限定理是一个近似值,当你研究的群体如此之大,需要很长时间来收集每个个体的数据时,你可以使用它。
人口
群体是你正在研究的一组个体。尽管他们被称为个体,但构成群体的元素不一定是人。
如果你是一家连锁杂货店的区域经理,你正努力提高效率,每周为每个商店的苏打水部分重新进货,这样你就能卖出尽可能多的苏打水,并避免最终出现大量未售出的存货,在那个特定的商店中售出的所有**箱苏打水代表了总人数。
如果你是一个家禽饲养者,想订购鸡饲料,你需要知道你的母鸡通常吃多少磅谷物。所以在这里,鸡就是你的种群。
研究人口是困难的
根据您正在解决的问题,收集整个群体的数据将会非常困难。
如果像可口可乐这样的公司想知道他们的美国消费者是否会喜欢他们正在开发的新产品,他们不可能派一大批研究人员去和美国的每一个人交谈。嗯,他们也许可以,但是那会非常昂贵,而且需要很长时间来收集所有的数据😀
这就是为什么公司要对代表产品受众的几组人进行用户研究,这样他们就可以收集数据并确定是否值得继续进行产品开发。所有这些,都没有和所有人谈过。
因此,从统计学的角度来说,你将从你的人口中收集个样本*,通过结合样本中的信息,你可以得出关于你的人口的结论。*
从总体中抽取两个样本。
好的样品必须是:
- 人口的代表,
- 大到足以从中得出结论,在统计学中样本量大于或等于 30。
- 随机挑选的,所以你不会偏向人群中的某些特征。
代表性样品
一个有代表性的样本必须显示出人口的所有不同特征。
如果您想知道谁更有可能赢得超级碗,并决定对美国人口进行民意调查,即从美国人口中抽取样本,您需要确保与以下人群进行交谈:
- 所有不同的州都认为谁会赢,
- 不同的年龄组和不同的性别,
在你的研究中,只包括那些对运动或运动本身感兴趣的人,否则,他们不会是对你的研究感兴趣的人群的一部分。
萨尔茨的箱子
你是一家杂货连锁店的区域经理,负责该地区的 350 家商店,下一个项目是优化萨尔茨矿泉水的每周补货。
您想知道每个商店每周订购多少箱苏打水,这样您就可以最大限度地减少商店货架上的闲置库存。
你知道必须有一个更好的方法来得到一个合理的答案,而不需要访问你所在地区的每一家商店并获得他们每周的销售数字。
既然你上过几堂统计学课,中心极限定理就会浮现在脑海里。你知道,应用于现实世界的问题,中心极限定理可以帮助你平衡收集所有数据所需的时间和成本,从而得出关于总体的结论。
你还记得样本均值中心极限定理的定义[1]:
当我们从具有均值μ和标准差σ的总体中收集足够大的 n 个独立观测值的样本时,样本均值的抽样分布将接近正态分布,均值= μ,标准差= σ/ √n
中心极限定理的可视化。从总体中抽取样本,获取它们的平均值,并创建样本均值分布。
中心极限定理告诉你,我们不必访问该地区的每一家商店,获得他们一周的苏打水销售数字,就可以知道下一个订单要放多少箱。你可以做的是从你的商店(总体)的每周销售中收集许多样本,计算它们的平均值(销售的苏打水的平均数量)并建立样本平均值的分布。这种分布也称为抽样分布。
如果这些样本满足中心极限定理的标准,您可以假设样本均值的分布可以近似为正态分布。所以现在你可以使用正态分布提供的所有统计工具。
从这一点开始,由于您知道了手头的分布,您可以计算概率和置信区间,并执行统计测试。
中心极限定理的总体抽样准则
但是在使用中心极限定理和使用正态分布近似之前,您的样本必须满足一组特定的标准,这些标准扩展了好样本的特征。
您的样品应该是:
- 随机选取,这样你就不会偏向于群体中的某些特征,并且保证样本中的每个观察值都独立于所有其他观察值。这也有助于确保样本中的每个观察都是独立的。
- 人口的代表。
- 大到足以得出结论的,在统计学上指样本量大于或等于 30。
- 包括不到 10%的人口,如果你抽样没有替换的话。由于总体中的观察值并不都是相互独立的,如果您收集的样本太大,您可能最终会收集到相互不独立的观察值。即使这些观察是随机选取的。
你不需要知道人口分布——中心极限定理的超级威力
如果你想使用任何一种推断统计方法,即了解你的数据的概率分布特征,你需要知道你的数据遵循的分布。否则,你可能会在工作中使用错误的工具。
所以想到的一个问题是我需要知道我的人口分布才能使用中心极限定理吗?**
简短的回答是否😁
中心极限定理真正强大的地方在于,你不需要事先知道你的人口分布。你所需要做的就是收集足够多的符合标准的样本,你就可以确定样本均值的分布将遵循正态分布。
你每周需要补充多少箱苏打水?
为了回答这个问题,让我们生成一个随机数据集来代表总体,其中每个数据点都是你所监管区域的每个商店每周售出的苏打水的总数。
随机生成的萨尔茨啤酒销售数据集中的片段。
*import pandas as pd
import random
import globdef create_dataset(dataset_size):
*""" Creating the population dataset """* dataset = []
while dataset_size > 0:
dataset.append(random.randrange(3, 100))
dataset_size -= 1 return dataset# Initializing the random number generator
random.seed(1234)# Reading the output directory in case we've already generated the population dataset
dataset_file_list = glob.glob("output/sales_dataset.csv")sales_data = None# Creating the population dataset and saving it to avoid always recreating the dataset
if len(dataset_file_list) == 0:
sales_data = pd.DataFrame(data=create_dataset(4200))
sales_data.columns = ['sales']
sales_data.to_csv("output/sales_dataset.csv", index=False)
else:
sales_data = pd.read_csv('output/sales_dataset.csv')*
然后你可以取不同数量的样本,所有样本的大小都相同,然后绘制销售数据,看看看起来怎么样。
样本数据本身的分布不一定具有正态分布的形状。还有,中心极限定理不需要你知道人口的分布。
从总体中抽取不同数量样本的分布,每个样本有 30 个数据点。
在这个例子中,每个图表都有不同数量的样本,所有样本的大小都是 30,没有一个分布看起来像经典的钟形曲线*。差远了。*
当你取另一组样本时,这不会有太大变化,这次每个样本有 100 个数据点。
从总体中抽取不同数量样本的分布,每个样本有 100 个数据点。
*import numpy as np
import matplotlib.pyplot as pltdef picking_n_samples(population, number_samples, sample_size):
*""" Sampling without replacement with fixed size
Returning the array of sample and array with their respective mean
"""* results = []
sample_mean = []
while number_samples > 0:
new_sample = random.sample(population, sample_size)
results += new_sample
sample_mean += [np.mean(new_sample)]
number_samples -= 1 return [results, sample_mean]def generate_sample_sets(dataset, number_samples, sample_size):
*""" Generate multiple sets samples with fixed size
Returns all sample sets and their corresponding set of means
"""* samples_array = []
sample_means_array = [] for sample_count in number_samples:
new_sample, sample_mean = picking_n_samples(dataset, sample_count, sample_size)
samples_array.append(new_sample)
sample_means_array.append(sample_mean) return [samples_array, sample_means_array] def plot_samples(sample_array, number_samples, default_size, plot_color='#6689F2', title='', x_axis_title='', filename='plot'): fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 7), constrained_layout=True)
fig.suptitle(title, fontsize=16) ax1.hist(sample_array[0], color=plot_color)
ax1.set_title("Taking " + str(number_samples[0]) + " samples of size=" + str(default_size), fontsize=10)
ax1.set_xlabel(x_axis_title) ax3.hist(sample_array[2], color=plot_color)
ax3.set_title("Taking " + str(number_samples[2]) + " samples of size=" + str(default_size), fontsize=10)
ax3.set_xlabel(x_axis_title) ax2.hist(sample_array[1], color=plot_color)
ax2.set_title("Taking " + str(number_samples[1]) + " samples of size=" + str(default_size), fontsize=10)
ax2.set_xlabel(x_axis_title) ax4.hist(sample_array[3], color=plot_color)
ax4.set_title("Taking " + str(number_samples[3]) + " samples of size=" + str(default_size), fontsize=10)
ax4.set_xlabel(x_axis_title)
fig.savefig("output/" + filename) ######################### Example 1####################### Setting the defaults for this example
example1_number_of_samples_array = [5, 50, 100, 1000, 10000]
example1_default_sample_size = 30# Picking multiple samples of size 30
example_1_samples, example_1_means = generate_sample_sets(list(sales_data['sales'].values), example1_number_of_samples_array, example1_default_sample_size)# Plot the different sets of samples
plot_title = 'Distribution of sales from different samples of size ' + str(example1_default_sample_size)plot_samples(example_1_samples, example1_number_of_samples_array, example1_default_sample_size, title=plot_title, filename="example_1_samples_distribution")########################## Example 2######################## Setting the defaults for this example
example_2_number_of_samples_array = [5, 50, 100, 1000, 10000]
example_2_default_sample_size = 100example_2_samples, example_2_means = generate_sample_sets(list(sales_data['sales'].values), example_2_number_of_samples_array, example_2_default_sample_size)# Plot the different sets of samples
plot_title = 'Distribution of sales from different samples of size ' + str(example_2_default_sample_size)plot_samples(example_2_samples, example_2_number_of_samples_array, example_2_default_sample_size, title=plot_title, filename="example_2_samples_distribution", plot_color="#96D2D9")*
因为关键是取样并计算平均值!
看一下前面例子中样本均值的分布就清楚了。随着样本数量的增加,你就越接近正态分布的形状。
从总体中抽取不同样本的抽样分布,每个样本有 30 个数据点(左)和 100 个数据点(右)。
较高数量的样本还会降低采样分布的可变性。
如果你观察有 5 个和 50 个样本的分布,你会注意到后者有一个较小的标准差。
如果您收集的样本越大,获得极值的机会就越少,因此您的值会更加集中在一起。因此,标准偏差或与平均值的距离会更小。
从公式的角度来看,回顾中心极限定理的定义,采样分布的标准偏差(也称为标准误差)等于σ/ √n。因此,随着样本量的增加,分母也会增加,从而使总体标准值变小。
**
具有(顶部)5 个大小为 30 的样本和(底部)50 个大小为 30 的样本的抽样分布的汇总统计。
*example_1_sampling_distribution_5_samples = pd.Series(example_1_means[0])print("Example 1: Summary statistics for sampling distribution with " + str(len(example_1_sampling_distribution_5_samples)) + " samples taken (size= " + str(example1_default_sample_size) + ")")
print(example_1_sampling_distribution_5_samples.describe()) example_1_sampling_distribution_5_samples = pd.Series(example_1_means[1])print("Example 1: Summary statistics for sampling distribution with " + str(len(example_1_sampling_distribution_5_samples)) + " samples taken (size= " + str(example1_default_sample_size) + ")")
print(example_1_sampling_distribution_5_samples.describe())*
如果您从随机生成的销售数据集中抽取 10,000 个大小为 100 的样本,您将得到一个类似于正态分布的钟形曲线特征的采样分布。
*def plot_sample_means(sample_means_array, plot_color='#A9CBD9', title='', filename='plot'):
fig, ax = plt.subplots(figsize=(12, 7))
fig.suptitle(title, fontsize=16)
ax.hist(sample_means_array, color=plot_color)
# removing to and right border
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False) # adding major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) ax.set_xlabel("Average number of seltzer cases sold")
fig.savefig("output/" + filename)plot_title = 'Sampling distribution from taking 10,000 samples of size 30 ' + str(example1_default_sample_size)plot_sample_means(example_1_means[4], title=plot_title, filename="example_1_sampling_dist_10ksamples")*
回到原文,如果你想知道每周需要重新备货多少箱苏打水,看看这个最后抽样分布的汇总统计,一万个样本的那个。
抽样分布的平均值是 51,所以你需要每周每家商店平均 51 箱的。**
具有 10,000 个大小为 100 的样本的抽样分布的汇总统计数据。
**example_2_sampling_distribution = pd.Series(example_2_means[4])print("Summary statistics for sampling distribution with " + str(example_2_number_of_samples_array[4]) + " samples taken (size= "+ str(example_2_default_sample_size) + ")")print(example_2_sampling_distribution.describe())**
这是您所在地区所有商店的平均值。如果您想要每个商店的更精确的数字,您必须为每个商店做这个过程。每家商店都成为总体,你只从那家商店中抽取样本。
你离人口平均数有多近?
既然您生成了销售数据集,您可以做另一个有趣的检查。看看抽样分布的均值离真实总体均值有多远。
人口平均 51!
人口统计摘要。
**# Population summary statisticsprint("Summary statistics for the population (sales dataset)")
print(sales_data['sales'].describe())**
结论
我们刚刚体验了中心极限定理的威力!
使用随机生成的集合,并且不知道原始分布的任何细节(您只在最后检查😀)你:
- 取了越来越多的样本,发现样本的分布越来越接近正态分布。
- 证实抽样分布的平均值非常接近总体分布,误差很小。
- 用中心极限定理解决现实生活中的问题。
希望你喜欢这篇文章,感谢阅读!
参考
[1] 开放简介统计—第四版(2019)
中心极限定理(CLT):数据科学
使用推断统计学学习中心极限定理(CLT)及其在数据科学中的应用。
图片由皮克斯拜的 Gerd Altmann 提供
正如我们在上一篇文章中看到的, 推断统计在数据科学中起着举足轻重的作用。中心极限定理(CLT)是现实世界中数据科学家最常用的技术,是推断统计学的一部分。
要了解 CLT,首先,我们需要了解以下话题:
- 样品
- 抽样分布
1。样本
从整个员工/人群列表中选择一些员工/人群称为样本**。**
假设我们有一家公司,里面有 30,000 名员工。我们想知道所有员工每天的通勤时间。去找每个员工并记录他们的通勤时间将是非常繁琐和耗时的。
让我们看看是否有另一种方法来完成任务。在公司说;我们对 100 名随机雇员进行了调查。调查结束后,我们计算出员工的平均通勤时间为 36.6 分钟。仅仅考虑 100 名随机的雇员,这足以说明所有雇员的通勤时间是 36.6 分钟吗?
不,我们不能这么说。总体平均值大约为36.6+误差**,即如果误差为 3 分钟,那么员工的总体平均值将介于“36.6–3”到“ 36.6+3 ”之间。现在,我们如何找出错误?**
要回答这个问题,首先,我们必须了解采样术语。
- 项目总数/人口,人口规模** = N**
- 总体均值,总体均值(μ)=(σ X)/N*
- 总体方差,总体方差(σ)=σ(Xi—μ)/N
- 项目数/总体,样本量= n
- 样本员工的均值,样本均值(x)=(σ* x)/n****
- 样本方差,样本方差(S)=σ(Xi—x)/n-1
让我们看看如何从给定的样本量中找到样本均值和样本方差,
我们需要从下面的样本数据中找出一个地区的人的平均身高。
样本量(n) = 5
样本均值(x)=(121.92+133.21+141.34+126.23+175.74)/5 = 139.69
样本方差(S)= sqrt[{(121.92–139.69)+(133.21–139.69)+(141
这就是我们如何在样本数据的帮助下计算样本均值和方差。
2.抽样分布
抽样分布是从总体列表中抽取的许多样本中获得的分布概率。
意思是,我们公司有 30000 名员工。首先,我们随机选择 50 名员工,计算他们的平均值,假设为 x 1。之后,我们将从整个列表中随机抽取另外 50 名员工,计算平均值,即 x ^ 2。假设我们继续这个过程,并计算平均值直到 x 100。
有趣的是,我们得到的是样本均值的分布。
如果我们把所有样本的均值分布绘制成一个图形,它就代表了二项分布。
抽样分布有一些有趣的性质,最终有助于发现总体均值的误差。
抽样分布的平均值用 μₓ表示。
μₓ =(所有样本平均值之和)/(样本总数)
****样本分布均值有两个重要属性:
- 抽样分布均值 (μₓ ) =总体均值 (μ)
- 抽样分布的标准差(标准差 ) = σ/√n ,其中σ为总体的标准差,n 为样本量
中心极限定理
中心极限定理(CLT)指出,对于任何数据,只要有大量的样本。以下属性成立:
- 抽样分布均值 (μₓ ) =总体均值 (μ)
- 抽样分布的标准差(标准差 ) = σ/√n ≈S/√n
- 对于 n > 30 ,抽样分布变为正态分布。
让我们通过 Jupyter Notebook 验证一下 Python 中 CLT 的性质。
对于下面的 Python 代码,我们将使用人口和随机值的数据集,我们可以在这里找到。
首先,将必要的库导入 Jupyter 笔记本。
我们导入了我们在后续代码中使用的所有必需的包。因为我们将随机对信息进行采样,所以我们设置了一个随机种子np.random.seed(42)
,以便分析是可重复的。
现在,让我们阅读我们正在处理的数据集,
数据集看起来像这样,
人口数据集
让我们从数据集中提取“Weight”列,并查看该列的分布。
这个重量柱和它的分布图看起来像这样,
正如我们所看到的,图表接近于一个正态分布图**。**
我们也通过代码找出权重列的均值和标准差。
均值= 220.67326732673268
Std。戴夫。= 26.643110470317723
这些值是重量列的精确平均值和标准偏差值。
现在,让我们开始采样数据。
首先,我们将从数据中抽取 30 个成员的样本。其原因是,在对观测值进行重复抽样后,我们需要确定抽样分布是否符合正态分布。
上述样本的平均值= 222.1,大于实际平均值 220.67。让我们重新运行代码,
df.Weight.sample(samp_size).mean()
上述样本的平均值= 220.5,几乎等于原始平均值。如果我们重新运行代码,我们将得到平均值= 221.6
每次我们取样时,平均值是不同的。样本均值本身存在可变性。让我们向前看,看看样本均值是否服从分布。
我们不是一次取一个样本平均值,而是取大约 1000 个这样的样本平均值,并将其赋给一个变量。
我们已经将 sample_means 转换为 Series 对象,因为 list 对象没有为我们提供均值和标准差函数。
样本总数= 1000
现在,我们有 1000 个样本,这是我们的平均值。让我们使用 seaborn 绘制分布图。
分布图看起来像这样,
正如我们所观察到的,上面的分布看起来近似正态分布。
这里我们需要检查的另一件事是样本的平均值和标准差。
样本平均值= 220.6945,这几乎与原始平均值 220.67 相似,样本标准偏差= 4.64426363765
让我们看看样本的标准差和实际数据的标准差之间的关系。
当我们用原始数据的标准差除以其大小时,
df.Weight.std()/np.sqrt(samp_size)
我们得到上面代码的值= 4.86
,该值接近于sample_means.std()
。
所以,从上面的代码中,我们可以推断:
- 抽样分布的均值 (μₓ ) = 总体均值 (μ)
- 抽样分布的标准差(标准差 ) = σ/√n
到目前为止,我们已经看到“重量”栏的原始数据是正态分布的形式。让我们看看,即使原始数据不是正态分布,样本分布是否也是正态分布。
我们将采用另一个包含一些随机值的数据集,并将这些值绘制成分布图。
数据集和图表看起来像这样,
正如我们所看到的,值列不像正态分布图。它看起来有点像指数分布。
让我们从这个分布中挑选样本,计算它们的平均值,并绘制出抽样分布图。
现在,样本的分布图看起来像这样,
令人惊讶的是,我们从 Values 列获得的 sample_means 的分布,虽然远非正态分布,但在很大程度上仍然是正态分布。
让我们将sample_means
平均值与其父平均值进行比较。
sample_means.mean()
# The Output will be
130.39213999999996df1.Value.mean()
#The Output is
130.4181654676259
正如我们所看到的,sample_means
的平均值和原始数据集的平均值都是相似的。
类似地,样本平均值的标准偏差是sample_means.std()
= 13。38860 . 68868888861
那个值应该非常接近于df1.Value.std()/np.sqrt(samp_size)
= 14。36860 . 68686868661
让我们将每个数据集的分布图与其对应的采样分布进行比较。
作者图片
正如我们所见,无论原始数据集的分布如何,采样分布都类似于正态分布曲线。
现在只有一件事需要考虑,那就是样本量。我们将观察到,随着样本量的增加,抽样分布将更加接近正态分布。
样本量对抽样分布的影响
让我们创建不同大小的样本,并绘制相应的分布图。
现在,样本量为 3,10,30,50,100,200 的分布图看起来像这样,
不同样本量的分布
正如我们所观察到的,样本量为 3 & 10 的分布图不像正态分布。然而,从样本大小 30 来看,随着样本大小的增加,样本分布类似于正态分布。
作为一个经验法则,我们可以说 30 或更大的样本量对于得出抽样分布接近正态的结论是理想的,并且可以从中得出进一步的推论。
通过这段 Python 代码,我们可以得出结论,CLT 的以下三个性质成立。
- 抽样分布均值 (μₓ ) =总体均值 (μ)
- 抽样分布的标准差(标准差 ) = σ/√n
- 对于 n > 30 ,抽样分布变为正态分布。
使用 CLT 估计平均值
30000 名员工的平均通勤时间 (μ) = 36.6 ( 样本均值 ) +一定的误差幅度。我们可以利用 CLT(中心极限定理)找到这个误差范围。现在我们知道了 CLT 是什么,让我们看看如何找到误差范围。****
假设我们有 100 名员工的平均通勤时间是 X =36.6 分钟,样本的标准差是 S=10 分钟。利用 CLT,我们可以推断,
- 抽样分布 Mean(μₓ ) =总体平均值(μ)
- 抽样分布标准偏差= σ/√n ≈S/√n = 10/√100 = 1
- 由于抽样分布是正态分布
P(μ-2<36.6<μ+2)= 95.4%,我们通过正态分布曲线的 1–2–3 法则得到这个值。
P(μ-2<36.6<μ+2)= P(36.6–2<μ<36.6+2)= 95.4%
你可以在我的上一篇文章“T2 推断统计”中找到标准分布曲线、Z 表及其属性
现在,我们可以说,总体均值(μ)有 95.4%的概率位于(36.6–2,36.6+2)之间。换句话说,我们有 95.4%的把握估计均值的误差≤ 2。
因此,与索赔相关的概率被称为置信水平**(这里是 95.4%)。
样本均值的最大误差称为误差幅度(此处为 2 分钟)。
值的最终区间称为置信区间{这里是:(34.6,38.6)}**
我们可以用以下方式概括这个概念。
假设我们有一个样本大小为 n、平均值为 X、标准偏差为 s 的样本。现在,μ的 y%置信区间(即对应于 y%置信水平的置信区间)将由以下范围给出:
置信区间= (X — (Z S/√n ) ,X + (Z S/√n))**
其中 Z*是与 y%置信水平相关联的 Z 分数。
下面给出了一些常用的 Z*值:
Z值*
这就是我们如何在样本的帮助下计算误差幅度和估计总体均值的方法。
结论
正如我们所看到的,对于只有少量代表性的样本**,找到均值和标准差是有益的。由于时间和资金的限制,我们可能不得不这样做。利用 CLT 性质,我们可以找到总体均值(μ)、标准误差(σ/√n),以及最重要的置信区间(y%)。CLT 有利在民调结果与置信区间、保险、银行业等新闻上报道。这就是关于 CLT 及其属性以及它如何在数据科学中有用的全部内容。**
感谢您阅读和快乐编码!!!
在这里查看我以前关于 Python 的文章
- 推断统计:数据分析
- 探索性数据分析(EDA): Python
- 使用 Python 对熊猫数据帧进行索引
- Seaborn: Python
- 熊猫:蟒蛇
- Matplotlib:Python
- NumPy: Python
- 数据可视化及其重要性:Python
- Python 中的时间复杂度及其重要性
参考
- ****中心极限定理讲解:https://statisticsbyjim.com/basics/central-limit-theorem/
- ****中心极限定理:https://en.wikipedia.org/wiki/Central_limit_theorem
- ****中心极限定理(CLT):https://www . investopedia . com/terms/c/Central _ Limit _ theory . ASP
- ****什么是中心极限定理?:https://www . statistics show to . com/probability-and-statistics/normal-distributions/central-limit-theory-definition-examples/
中心极限定理——举例说明
用实现清楚地解释
路易斯·佩尔迪戈在 Unsplash 上拍摄的照片
中心极限定理(CLT)是统计学领域中一个基本且广泛应用的定理。在我们详细讨论 CLT 之前,让我们先定义一些术语,以便更容易理解 CLT 背后的思想。
基本概念
- 群体是一个群体中的所有元素。例如,美国的大学生是指包括美国所有大学生的人口。欧洲的 25 岁人群包括了所有符合描述的人。
对人口进行分析并不总是可行或可能的,因为我们无法收集人口的所有数据。因此,我们使用样本。
- 样本是总体的子集。例如,美国 1000 名大学生是“美国大学生”人口的一个子集。
- 概率分布:显示事件或实验结果概率的函数。考虑掷骰子的例子。有 6 种可能的结果(1,2,3,4,5,6)。如果骰子是无偏的,观察到顶面每个数字的概率是相等的,所以概率分布是离散的均匀分布。
- 正态(高斯)分布:一种看起来像钟的概率分布;
描述正态分布的两个术语是均值和标准差。Mean 是被观察到的概率最高的平均值。标准偏差是对数值分布程度的测量。随着标准差的增加,正态分布曲线变宽。
中心极限定理
正态分布用于表示分布未知的随机变量。因此,它被广泛应用于包括自然科学和社会科学在内的许多领域。证明为什么它可以用来表示未知分布的随机变量的理由是中心极限定理(CLT) 。
根据 CLT ,当我们从一个分布中抽取更多样本时,样本平均值将趋向于一个正态分布而不管总体分布如何。
考虑一个案例,我们需要学习一个国家所有 20 岁人的身高分布。收集这些数据几乎是不可能的,当然也是不切实际的。所以,我们在全国范围内抽取 20 岁人群的样本,计算样本中人群的平均身高。根据 CLT,当我们从总体中抽取更多样本时,抽样分布将接近正态分布。
为什么正态分布如此重要?正态分布用平均值和标准偏差来描述,它们很容易计算。如果我们知道正态分布的均值和标准差,我们就可以计算出关于它的几乎所有东西。
证明 CLT 的例子
让我们看几个例子,证明 CLT 是正确的。我们将使用 python 库来创建群体、样本和绘图。和往常一样,我们从导入相关库开始:
import numpy as np
import pandas as pd #Data visualization
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid')%matplotlib inline
我们首先定义一个从分布中创建随机样本的函数。我们可以使用熊猫的样本功能,它将选择随机元素而不替换。
def random_samples(population, sample_qty, sample_size):
sample_means = []
for i in range(sample_qty):
sample = population.sample(n=sample_size)
sample_mean = np.array(sample).mean()
sample_means.append(sample_mean)
return sample_means
我们只需要输入一个总体,我们需要多少个样本(sample_qty),以及每个样本包含多少个观察值(sample_size)。然后,该函数将选择样本并计算它们的平均值。返回的列表将包括样本均值。
让我们首先定义一个实际上具有正态分布的总体。我们使用 np.random.randn 函数创建一个大小为 10000 且呈正态分布的数组。
norm = list(np.random.randn(10000))
plt.figure(figsize=(8,5))
plt.title("Normal Distribution", fontsize=18)
sns.distplot(norm, hist=False)
现在我们从总体中抽取 30 个样本,每个样本包含 30 个值。请注意,我们需要将人口转换为熊猫系列,因为样本函数不接受 numpy 数组。
population = pd.Series(norm)
samples_from_normal = random_samples(population, 30, 30)
plt.figure(figsize=(7,4))
plt.title("Distribution of Sample Means - Normal Distribution", fontsize=15)
sns.distplot(samples_from_normal, hist=False)
正态分布的抽样分布
抽样分布(样本平均值的分布)看起来非常接近正态分布。随着我们抽取越来越多的大样本,样本分布将看起来更“正常”。
让我们对随机分布为的人群应用同样的程序。我们首先创建一个包含 1000 个随机数的数组:
random = np.random.random(1000)
plt.figure(figsize=(7,4))
plt.title("A Random Distribution", fontsize=15)
sns.distplot(random, hist=False)
让我们看一下 30 个样本,每个样本有 30 个值时的采样分布情况:
population = pd.Series(random)
samples_from_normal = random_samples(population, 30, 30)
plt.figure(figsize=(7,4))
plt.title("Distribution of Sample Means (30 samples)", fontsize=15)
sns.distplot(samples_from_normal, hist=False)
随机分布的抽样分布(30 个样本)
它越来越接近正态分布。我们现在尝试使用 50 个样本,并将样本大小增加到 50:
随机分布的抽样分布(50 个样本)
看起来肯定更“正常”。我添加了文本代码,所以你可以复制粘贴,并尝试不同的样本数量和大小。
我们也可以试试指数分布,看看 CLT 是否适用:
exp = np.random.exponential(0.01, 5000)
plt.figure(figsize=(7,4))
plt.title("Exponential Distribution", fontsize=15)
sns.distplot(exp, hist=False)
如果我们随机抽取 50 个大小为 50 的样本,样本均值的分布如下所示:
population = pd.Series(exp)
samples_from_normal = random_samples(population, 50, 50)
plt.figure(figsize=(7,4))
plt.title("Distribution of Sample Means (50 samples)", fontsize=15)
sns.distplot(samples_from_normal, hist=False)
指数分布的抽样分布(50 个样本)
它看起来更像正态分布,而不是指数分布。对于 100 个样本,正态性更加突出:
指数分布的抽样分布(100 个样本)
正如我们在示例中看到的,不管总体分布如何,当我们获取更多样本时,样本均值的分布越接近正态分布。这正是中心极限定理所陈述的。
感谢您的阅读。如果您有任何反馈,请告诉我。
用 Python 代码解释的中心极限定理
马文·朗斯多夫在 Unsplash 上的照片
一个解释中心极限定理的模拟:即使一个样本不是正态分布,如果你抽取多个样本,取它们的每个平均值,这些平均值将代表一个正态分布。
条条大路通罗马!等等不要。条条大路通涩谷!等等不要。所有样本平均值都是总体平均值。
中心极限定理表明,如果你随机抽取一个客户样本,比如说 1000 个客户,这个样本本身可能不是正态分布的。但是如果你现在重复这个实验 100 次,那么这 100 个样本(1000 个客户)的 100 个平均值将构成一个正态分布。
这一行对我们很重要:“这个样本本身可能不是正态分布的”。为什么?因为生活中的大多数事物都不是正态分布的;不是等级,不是财富,不是食物,当然也不是我们的顾客在我们店里付了多少钱。但是生活中的一切都有泊松分布;更好的是,生活中的一切都可以用狄利克雷分布来解释,但为了简单起见,让我们坚持用泊松分布(泊松分布实际上是狄利克雷分布的简化情况)。
但实际上在一个电商店里,我们的客户大部分都是非购买客户。因此,分布实际上看起来像一个指数,因为泊松可以从指数得到,让我们做一些指数分布来反映我们的客户的购买。
让我们试一个例子
假设我们的客户群的平均订单价值为 170 美元,那么我们将用这个平均值创建指数分布。我们将尝试通过查看一些样本平均值来获得该值。
仅抽取四个样本
在这里,我抽取了 1000 名客户的样本。然后重复 4 次。我得到了以下四个分布(要得到与此类似的图形,请在末尾使用代码 repeat _ sample _ draws _ exponential(4,1000,170,True)):
从 1000 名顾客中随机抽取 4 个样本。每个样本都有一个平均值为 170 美元的指数分布。
下面是绘制的 4 个平均值(要获得类似的图形,请在结尾处使用代码 repeat _ sample _ draws _ exponential(4,1000,170,True)):
绘制的四个样本的平均值。
上述 4 个样本均值的平均值为 165.48 美元
上述 4 个样本均值的标准差为 5.36 美元
因此,如果您在这里停止实验,在四个样本中,您将报告您的客户群的平均订单价值为 166 美元,其中 68% ( 1 标准差包含 68% )的客户购买了 161 美元到 171 美元之间的商品(从 166+/-$5 美元)。这将是一个错误的结论,因为我们所有的这些模拟都是基于最初的假设,即人口平均值是 170 美元!
抽取 100 个样本,但保持每个样本的大小与上述 1000 个客户相同
如果我们重复这个实验 100 次会发生什么?即抽取 1000 个客户的 100 个样本?
在末尾使用代码:
repeat _ sample _ draws _ index(100,1000,170,True)
我们将得到 100 个类似这样的指数分布(要得到类似的图形,请在末尾使用代码 repeat _ sample _ draws _ exponential(100,1000,170,True)):
从 1000 名顾客中随机抽取 100 个样本。每个样本都有一个平均值为 170 美元的指数分布。
100 个平均值的分布现在看起来像正态分布(要获得类似的图形,请在结尾处使用代码 repeat _ sample _ draws _ exponential(100,1000,170,True)):
绘制的 100 个样本的平均值。
上述 100 个样本均值的平均值为 169.55 美元
上述 100 个样本均值的标准差为 5.18 美元
因此,现在您会得出结论,您的客户群的平均支出为 170 美元(耶!这实际上是我们的第一个假设!)我们 68%的客户购买价格在 165 美元到 175 美元之间。
关于标准差的旁注
注意标准偏差没有变化:当我们抽取 4 个样本时是 5 美元,当我们抽取 100 个样本时是 5 美元。您可以对 10000 个样本运行下面的代码,并看到标准偏差不会从$5 改变。这是为什么呢?
这就把我们带到了经常被忽视的中心极限定理的第二部分:样本均值的标准差等于总体的标准差除以样本大小的平方根。
我们的人口是平均 170 美元的指数分布。指数有一个特殊的性质,即它的标准差等于它的平均值,所以总体平均值的标准差是 170 美元。因此,在这种情况下,我们预计样本均值的标准差为 170/sqrt(1000) = 5.4
这就是我们得到的结果,样本的标准差——意味着大约是 5 美元。无论我们重复抽样多少次,标准偏差都不会改变,因为它只取决于样本量(它也取决于总体平均值,但对于给定的总体来说,它保持不变)。
结论
这就是中心极限定理。抽取的样本越多,就越能准确预测总体均值。我们不可能测试/调查我们所有的客户(或我们所有的人群),所以我们能做的下一个最好的事情是抽取几个较小数量的样本,并得到这些平均值的平均值。这里的关键是尽可能多地抽取样本。当我们这样做时,我们有:
而样本均值分布的标准差会随着你增加你的样本量而改变(样本量不是样本数;在我们的示例中,样本大小为 1000,样本数量为 100):
在以后的帖子里,我会描述为什么这是 A/B 测试中的一个重要概念。
代码重现了这一点:
**import** numpy **as** np
**import** matplotlib.pyplot **as** plt
**def** repeat_sample_draws_exponential(n, samp_size, mu, show_all=**False**):
means = []
samples = []
**for** ii **in** range(0, n):
samples.append(np.random.exponential(mu, samp_size))
means.append(np.mean(samples[ii]))
**if** show_all:
pltdim = np.math.ceil(np.math.sqrt(n))
fig, axs = plt.subplots(pltdim, pltdim, figsize=(8, 8), gridspec_kw={**'hspace'**: 0.2}, sharex=**True**, sharey=**True**)
fig.suptitle(**'Individual Samples\' Order Value Distribution'**)
fig.text(0.5, 0.04, **'Order Values ($)'**, ha=**'center'**)
fig.text(0.04, 0.5, **'Number of Customers'**, ha=**'center'**, rotation=**'vertical'**)
axs = axs.flatten()
**for** ii **in** range(0, n):
plt.sca(axs[ii])
plt.gca().hist(samples[ii], bins=int(50), histtype=**'step'**,
label=**'$mean = {0:.2f}$'**.format(np.mean(samples[ii])), range=[0, 2 * mu])
**if** n < 10:
plt.gca().set_title(**'Sample #{0} : average={1:.2f}'**.format(ii, np.mean(samples[ii])))
**for** item **in** ([axs[ii].title, axs[ii].xaxis.label, axs[ii].yaxis.label] +
axs[ii].get_xticklabels() + axs[ii].get_yticklabels()):
item.set_fontsize(8)
plt.savefig(**'expdist_{0}_mu_{1}_sample_{2}_sampsize'**.format(mu, n, samp_size))
plt.clf()
plt.hist(means, bins=int(10), histtype=**'step'**)
plt.title(**'Overall Average of {} Samples\' Average Order Value'**.format(n))
plt.xlabel(**'Average of Individual Sample\'s Order Value ($)'**)
plt.savefig(**'average_of_expdist_{0}_mu_{1}_sample_{2}_sampsize'**.format(mu, n, samp_size))
print(**'mean of the samples is {0:.2f}'**.format(np.mean(means)))
print(**'standard deviation of the samples is {0:.2f}'**.format(np.std(means)))
repeat_sample_draws_exponential(100, 1000, 170, **True**)
中心极限定理的应用
数据科学
以及实际应用中的例子
图片来源:凯西·邓恩和《生物》剧组 Vimeo
统计学是一个数据科学家的必备知识。中心极限定理是它的基石。
当我看到任何理论概念在实践中时,我学得更好。我相信有更多像我一样的人,所以我今天将用一个具体而又朗朗上口的例子来解释中心极限定理——希望让它永久留在你的脑海中,供你使用。
你还记得当今世界的平均寿命是多少吗?(提示:如果没有,请在此处查看)
是 73。
这是一个总结了全世界,确切地说是 186 个国家预期寿命数据的数字。如果我们把这个数字放到完整的上下文中,它会告诉我们更多。
上下文是由统计术语组成的,所以我们先来了解一下:
**群体:**包含来自您的实验空间的元素、个体或度量的所有数据的集合。我们的实验空间是世界,人口是所有国家的预期寿命数据——人口规模用 N 表示。
**样本:**是从总体中随机选择的一个子集,样本量用 n 表示。
分布: It 描述了数据/总体/样本范围以及数据在该范围内是如何分布的。截至 2018 年,全球预期寿命分布如下:
**平均值:**您的总体或样本的所有数据的平均值。在本例中,总体平均值为 73,用(Mu)表示总体,用 x̄ (x 条)表示样本。
**标准差:**不是所有国家的平均寿命都是 73。它们分布在我们上面看到的范围内。标准差是对人口分布的一种度量,用 σ (适马)表示。
**正态分布—钟形曲线—高斯分布:**当你的总体围绕平均值以σ标准差完美对称分布时,你得到如下钟形曲线:
我们只触及了在解释中心极限定理中使用的必要统计术语的表面,现在让我们来看看这个定理的实际应用!
截至 2018 年全球平均预期寿命是怎样的分布?它是正态分布还是其他分布?
嗯,这不是一个完美的正态分布,因为它似乎被拉向左侧,被称为左偏分布。
现在让我们从人群中抽取一些样本。换句话说,让我们从总体中抽取 1000 个大小为 150 的子集,并绘制每个样本均值的分布图(x̄).这个过程叫做抽样分配:
这是一个完美的正态分布!实际上,来自任何总体的任何抽样分布都显示正态分布,因为中心极限定理指出:
不管总体分布的初始形状如何,抽样分布将接近正态分布。随着样本量的增加,抽样分布将变得更窄且更正态。
这个视频用兔子和龙的翅膀以意想不到的有趣方式解释了这个定理🙂
视频致谢:生物演员&凯西·邓恩在 Vimeo 上解释了中心极限定理
回到我们对中心极限定理的解释,它允许我们用下面的公式计算抽样分布的标准偏差——称为标准误差:
标准误差公式,其中 σ是标准偏差,n 是样本量。 图像来源
让我们看看这个计算是否也适用于我们创建的人口和抽样分布:
果然不出所料!这个公式的直观解释是;随着样本量的增加,抽样分布将更准确地表示总体参数(平均值和标准偏差)。
奖金定理:你知道抽样分布的中心在哪里吗?你认为抽样分布和总体均值都是 73 是巧合吗?
当然不是!这用统计学中的另一个基本定理来解释:**大数定律。**随着从总体中抽取的样本越多,样本量越大,抽样分布的均值将越接近总体均值。
中心极限定理的实际应用
在任何机器学习问题中,给定的数据集代表来自总体的样本。使用这个样本,我们试图捕捉数据中的主要模式。然后,在进行预测时,我们尝试将样本中的模式推广到总体。中心极限定理有助于我们对样本和总体参数进行推断,并使用它们构建更好的机器学习模型。
此外,该定理可以通过观察抽样分布来告诉我们一个样本是否可能属于一个总体。这个定理的力量也在于此。
当我为这篇博文键入第一个单词时,我打算写统计意义和假设检验,但我意识到中心极限定理是解释它们的核心。所以,我将把它们留给下一篇文章。关注我的媒体账号了解他们😉
感谢阅读!如果你想更仔细地看看这个定理的“作用”,你可以看看这个 Deepnote 笔记本。我这个吸引人的例子来源于 Gapminder 的公开数据,可以在这里找到。
如果你喜欢这篇文章,你可以在这里查看我的其他文章:
对于评论或建设性的反馈,您可以通过回复、 Twitter 或 Linkedin 联系我!
来源:
中心极限定理是统计学和机器学习中经常被引用但被误解的支柱。这是…
machinelearningmastery.com](https://machinelearningmastery.com/a-gentle-introduction-to-the-central-limit-theorem-for-machine-learning/)
中心极限定理:证明&通过数学实际工作
…不要再做另一个“手动波浪状”的 CLT 解释…让我们实际算一算
迭戈·PH 在 Unsplash 上的照片
背景和动机
对于任何从事数据科学、统计学或机器学习研究的人来说,说*“知道中心极限定理(CLT)很重要”*是一种保守的说法。特别是从数理统计的角度来看,在大多数情况下,CLT 使得恢复参数估计的有效推理覆盖成为一个易处理和可解决的问题。
媒体平台上有几篇关于 CLT 的文章。然而,我注意到没有一篇文章(就我所知)深入研究这个定理的数学,甚至也没有恰当地说明 CLT 成立的假设。在我看来,这是一个巨大的伤害。这些都是上述领域每个从业者都应该知道的数学基础。
不仅理解 CLT 的数学基础很重要,而且理解 CLT 不成立的条件也很重要。例如,如果我们有一系列 n . I . I . d .柯西分布 RVs,它们的均值中心和标准偏差比例样本均值不会收敛到标准正态分布,CLT 不适用;如果我们对 CLT 的理解是“摇摆不定的”,那就很难理解上面的柯西例子。我希望这篇文章中的信息可以为感兴趣的人弥补知识上的差距。
本文分为三个部分:
- CLT -数学定义*(特别是林德伯格-列维·CLT)*,我们为什么要关心?
- 证明 CLT 的数学准备
- 林德伯格的证明CLT
注意,中心极限定理其实不是一个定理;相反,它是一组相关的定理。这些定理依赖于不同的假设和约束。在本文中,我们将具体介绍林德伯格-莱维·CLT。这是 CLT 最常见的版本,也是大多数人在口语中提到 CLT 时实际引用的特定定理。
所以让我们开始吧!
1.CLT -数学定义,我们为什么要关心? :
让我们用文字(以明确的方式)来描述林德伯格-莱维·CLT:
作者图片
好极了。但是我们如何用数学方法来写呢?:
作者图片
作者图片
因此,(林德伯格–莱维)CLT 告诉我们,在上面指定的假设下,Y*在分布上收敛于标准正态分布 N(0,1)。
那么…有什么大不了的?我为什么要关心这个??
注意我们是如何为 CLT 搭建舞台的。我从没具体说过这 n 辆 RV 来自什么发行版。只是这 n 个 RVs 是独立的,并且是从具有定义的期望值和方差*(一阶和二阶矩)*的分布中抽取的。然而,即使有这种模糊的信息,我们可以说一些关于均值中心和标准差比例抽样估计的极限分布的建设性的东西。
CLT 是重要的和有影响力的,因为它(在许多情况下)可以使统计推断更容易处理。如果我们能以正确的形式参数化我们的抽样估计量,我们就能了解它的极限分布,即使我们不知道组成样本的 RVs 具体来自什么分布。从这些信息中,我们可以更容易地进行推理分析(即假设检验、p 值、置信区间等),而不必知道各个 RVs 本身的具体分布。
2.证明 CLT 的数学准备;
为了证明 CLT,我们可以利用一些数学事实和定理:
2A:变量变化:
作者图片
上面我们可以看到 Y和 S是数学上等价的抽样估计量。为了证明 CLT,我们将使用 S*。这种选择仅仅是数学上的便利。用 S证明 CLT 比直接用 Y更容易
2B:标准正常 RV 的力矩生成函数(MGF):
下面我们导出标准正态随机变量 Z~N(0,1)的矩母函数(MGF)。我们将在第 3 节看到为什么这很重要。
作者图片
2C。矩母函数的性质(MGF):
在第三节中,我们将代数操作 mgf。以下属性将会很有用:
作者图片
3.林德伯格的证明CLT:
我们现在准备证明 CLT。
但是我们的证明策略是什么呢?仔细查看上面的 2C 部分*(MGFs 的属性)*。最后陈述的性质(本质上)告诉我们,如果 RV A 的 MGF 逐点收敛于 RV B 的 MGF,那么一定是 RV A 在分布上收敛于 RV B
我们证明 CLT 的方法是证明我们的抽样估计量 S的 MGF 逐点收敛于标准正态 RV Z 的 MGF。在此过程中,我们证明了 S以分布收敛于 Z,即 CLT,并结束了我们的证明。
所以让我们开始吧:
作者图片
作者图片
作者图片
作者图片
作者图片
作者图片
这就是我们的证据!恭喜,你通过了数学考试:)
总结和最后的想法
我认为理解上面的推导对于任何数据科学、统计学或机器学习从业者来说都是一项有价值的工作。理解以上内容不仅能让你对 CLT 有所了解,更重要的是能让你理解 CLT 不支持的情况。
在本文的开头,我提到了 CLT 不适用于 n . I . I . d .柯西分布式房车。柯西分布是一种没有定义均值或方差的连续概率分布。因此,给定林德伯格-莱维*【CLT】*(一阶和二阶矩未定义)所需的条件,CLT 在这里不成立。如果你(读者)能想到 CLT 不成立的其他常见例子,请在评论区发表你的想法。
希望以上有见地。正如我在以前的一些文章中提到的,我认为没有足够的人花时间去做这些类型的练习。对我来说,这种基于理论的洞察力让我在实践中更容易使用方法。我个人的目标是鼓励该领域的其他人采取类似的方法。我打算在未来写一些基础作品,所以请随时在 LinkedIn 上与我联系,并在 Medium 上 关注我的更新!
简化的中心极限定理
感谢高斯所做的一切
推理统计学背景中的一个重要定理,没有它,推理统计学就没有意义。它有助于假设检验、回归分析和其他分析技术。
是的,我说的是**“中心极限定理”**
它表明,无论总体分布如何,随着从总体中导出(替换)的样本的样本大小(n)增加,样本均值或和的分布接近正态分布。
从数值上看,从任何具有均值和标准差σ的总体分布中抽取的随机样本的均值将具有近似正态分布,均值等于σ /√n,标准差为σ/√n。
举例理解(+视觉):
假设在行星“X”上有一群男性,我们想估计他们的平均身高,我们该怎么做呢?
1.用全部人口数据计算平均值?
2.用中心极限定理用样本估计?
选择 1 是不切实际的,因为没有人拥有这样的马格努斯活动所需的时间和精力。选择 2 是,让我们看看它是如何工作的:
假设下面的分布有身高(男性)——行星 x 上的全部男性人口的数据,为什么是正常的?因为任何在偶然/随机原因下可测/可数的东西,总会遵循正态分布曲线。即使它受到可指定原因的影响(不是正态分布曲线),中心极限定理仍然成立。现在,我们举这个例子来理解这个定理的要点。测量所有男性的身高是不切实际的,我们将尝试用样本来推断总体平均值。
(图片由作者提供)
现在我们有 5 个自称的估计专家来估计不同抽样选择的平均值:
(图片由作者提供)
让我们看看谁得到的估计最准确(每个人可以得到 10 个样本):
专家 1 —练习
(图片由作者提供)
这里估算主的评论显示了对估算专家和他选择的样本量(n=2)的负面情绪。10 个估计平均值的分布也远离正态分布。现在轮到下一位专家了:
专家 2 —练习
(图片由作者提供)
这里估算主的评论显示了对估算专家和她选择的样本量(n=10)的一些积极的看法。我想我现在能够将中心极限定理的一些相关概念放入您的脑海中了——随着样本大小的增加,总体均值的估计值越来越接近实际总体均值,离散度/扩散度减小,形状复制正态分布(*样本估计均值)。据此,03 位剩余的估计专家中,哪一位将具有高置信度的总体均值的最佳估计(估计均值的低传播/分散)—
没错,就是最后一个家伙(爱因斯坦的二重身)。引入 CLT 的数值定义与同一盖伊的估计:
样本估计值的标准差均值 = σ/√n = 10/√200 = 10/14.1 = 0.7
其中σ是总体分布的标准偏差,n 是总体中派生样本的样本大小
(图片由作者提供)
*估计均值分布具有近似等于实际总体均值的均值(也称为估计均值的均值),具有非常低的散布/离差,这描绘了估计的良好置信度。
这种样本估计平均值的扩散/分散也被称为“标准误差”。
因此,一个至关重要的观点是,样本量越大,样本估计均值的分布越低,这导致估计的可信度越高。
现在对于不同的取样范围,标准误差的计算是不同的:
1.从无限总体中取样(上面已经讨论过)
2.从有限总体中抽样
3.总人口抽样
标准误差的一般公式(不考虑人口规模):
当总体标准差已知时,上述公式是适用的。当 N 接近无穷大时,我们得到上面讨论的公式(σ/√n)。当 n = N 时,标准误差为零。
现在我们已经到了这个博客的结尾,我希望通过看到一个非常规和简单的视觉练习,你已经理解了中心极限定理应用背后的基本思想。
主要的收获是“我们在推断统计学范围内所做的一切(使用总体样本进行估计),中心极限定理总是在背景中出现”。
请关注更多即将发布的博客。
谢谢!!!
用 Python 模拟中心极限定理
中心极限定理的 Python 仿真实验验证
统计领域最重要的概念之一是什么,但它经常让有抱负的数据科学家感到困惑?没错,就是中心极限定理。
让我们深入研究数据科学中最重要的定理!
收集全部人口的数据是非常不可能的。相反,我们可以从总体中收集数据的子集,并使用该样本的统计数据来推断总体。
什么是大数定律?
大数定律 ( LLN )是一种理论,该理论指出,随着样本均值的大小增加,样本分布的均值将接近总体分布的均值。因此,大数定律可以直观地理解为收集更多的数据会产生更具代表性的样本。
什么是中心极限定理?
中心极限定理(CLT) 是一种理论,声称从重新抽样计算出的样本均值的分布将趋于正态,随着样本规模的增大,而不考虑总体分布的形状。
( 来源 )
这两种理论的区别在于,大数定律描述的是单个样本均值,而中心极限定理描述的是样本均值的分布。
样本分布中的数据必须遵循什么规则?
- 分布中的数据应该是随机选择的。
- 样本应该相互独立。
- 样本量应该足够大。如果总体分布很正态,30 的样本量就足够了。
为什么样本量至少要有 30 人?
有大量的书籍引用了这个值,例如,霍格和坦尼斯的概率和统计推断(7e) 说:
也就是说,当 N“足够大”时,X 约为 N(μ,σ2/n),Y 约为 N(nμ,nσ2),其中μ和σ2 分别是样本来源的基础分布的均值和方差。一般来说,如果 n 大于 25 或 30 ,这些近似值就不错了。
自然界中许多变量的分布非常接近正态曲线。查看 t 表,您会发现具有 30 个自由度的 t 的值接近 z 的值。其中一个原因是 t 分布(如正态分布)是对称和单峰的。因此,我们可以得出结论,样本量为 30 的均值样本的分布也将是正态分布。
t 表(来源)
如果总体的分布不是正态的,你可能需要尝试比 30 大得多的样本量。人口数据离对称和单峰越远,你就需要越多的数据进入 CLT。
因此,分布越接近正态分布,调用 CLT 所需的样本就越少。实际上,我从不依赖于 n = 30,并建议你尝试不同的抽样规模。
从这两个定理得出什么结论?
- 均值的抽样分布将是正态或接近正态的。
- 抽样分布的均值将等于总体的均值分布。数学上,
3.抽样分布的标准误差与原始总体的标准偏差直接相关。数学上,
4.如果我们增加从总体中抽取的样本,样本均值的标准差就会减小。
CLT 的统计意义是什么?
我们有一些分布,其中的数据不是正态分布,但我们不使用这个分布,而是使用样本均值的分布。这让我们可以作弊,说我们可以在统计推断中无处不在地使用正态分布,尽管潜在的分布不是正态的。
- 假设检验中使用的中心极限定理。
- 样本平均值可用于创建一个称为的数值范围,即置信区间。这些方法假设总体是正态分布的。
- CLT 在一个类似**的算法中使用了随机梯度下降。**算法表现如何?我们从我们的训练集中抽取一批样本,并计算各批损失的平均值或总和。感谢 CLT,现在我们知道了损失估计的最终分布将是高斯分布。
让我们通过用 Python 模拟来提供中心极限定理的经验证据吧!
我们将使用一个 Kaggle 数据集和 Python 统计库,如 Numpy、、 Matplotlib 和 Pandas 。
- 首先,我们导入所需的库,然后使用
.read_csv()
读取数据集,并将其作为DataFrame
对象存储在变量df
中。 - 我们使用了
.head(10)
属性来浏览前 10 行数据。 - 我们用
.info()
显示了所有列及其数据类型: .shape
属性需要看到它的维度。结果是一个包含行数和列数的元组。- Pandas
**describe()**
用于查看一些基本的统计细节,如百分位数、平均值、标准差等。一个数据帧。
为了说明抽样的中心极限定理,我们将采用“CoffeeCupsPerDay”列。我们来画一个程序员喝咖啡的杯数直方图。
正如我们看到的,程序员每天喝的咖啡杯数据的分布是正偏态的,数据分布的平均值= 2.89。但是我们想要分析近似正态分布的数据。
理论上,随着每个样本大小的增加,样本均值越接近高斯分布。让我们抽取足够的不同大小的样本,并计算它们的样本均值。我们将从 300 个样本中抽取 10、40、60 和 80 个样本。计算算术平均值,并绘制 300 次样本的平均值。
所以,我们通过采取不同的样本量并逐步增加来进行试验。然后我们将不同样本量的样本均值分布可视化,比较它们的分布形态和均值。现在,我们知道随着样本量的增加,我们会得到一个非常好的钟形曲线。
从样本大小为 80 的分布形状可以看出,该分布是高斯分布。抽样分布的均值等于总体的均值分布,等于 2.89。
数学上,
我们可以观察到,随着样本大小 N →无穷大,均值的标准差趋于零。这意味着数据集的尺寸越大标准误差越小**。**
因此,我们可以认为采样分布是正态的,所以我们可以使用这些分布进行进一步的分析。
感谢您的阅读!我希望这篇文章让你对中心极限定理有了基本的了解。如果您有任何问题,欢迎在 GmailNataliia Rastoropova上评论或给我写信。
准备你的文章发表。(下载我们的 PDF 版本)
towardsdatascience.com](/post-for-writers-2-ebd32d1fac21) [## 数据科学统计学:中心极限定理介绍
什么是统计学中最重要和最核心的概念之一,使我们能够进行预测建模,但它…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2019/05/statistics-101-introduction-central-limit-theorem/) [## 机器学习的统计方法
机器学习的统计方法探索如何用 Python 将数据转化为知识我们为什么需要…
机器学习桅杆](https://machinelearningmastery.com/statistics_for_machine_learning/)
确定性大师:概率模型第 1 部分:理解模型
概率如何在日常生活中帮助我们?
Gabriel Manlake 在 Unsplash 上拍摄的照片
哔哔声:07:30…哔哔声:07:45…哔哔声:08:00…
ZZZzzz……!!!09:25?!只是推迟了几分钟!现在我又要迟到了…
有些事情我们无法知道。事实上,由于生活的不可预测性,我们只知道一些事情。不幸的是,不确定性是天生的,我们对此无能为力。
但是即使我们不能预测未来,我们仍然可以推测,如果我们有办法测量一个事件所有可能的结果和它们发生的可能性,那么我们就可以为那个特定的事件做更好的准备。这些主题将是第一部分的主题。
所以现在重要的问题是,我今天要不要睡午觉?
好吧,原来我问自己这个问题已经有一段时间了,所以我花了一些时间记下了我每天醒来的时间:
我过去 150 天的起床时间表
在这个表中我们可以看到我在某个时间醒来的次数,除了 07:00 (指 07:30 之前的*)和 09:00 (在 08:30 之后的)如果这个发生我就要迟到。我们可以看到,在 150 天里,我已经迟到了 3 天!*
但是,明天我迟到的可能性有多大?
如果我们的目标是预测未来,我们就需要用我们能与之共事的方式来表达现实,用一种量化的方式。随机事件(其结果不确定)的数学化被称为概率模型。
概率模型要求:
为了能够正确地模拟一种情况,我们将需要描述可能的结果(-)按时*,所有的可能性组成所谓的样本空间,并指定一个概率法则。一个概率定律(或概率函数 ) 定义了在所有可能的结果中,某个结果出现的可能性有多大。*
这是通过将一个概率关联到每一个可能的事件(在这种情况下是迟到或准时*)来实现的。概率在这种情况下可以解释为分配给某个事件的数值,它描述了我们的信念,我们认为这个事件能够发生的可能性有多大,但是要小心!我们称之为信仰并不意味着它是主观的。*****
通常这种信念是基于以前的知识,由于这一事实,我们也可以将一个事件的概率定义为其 长期相对频率(当它非常大时,预期获得该事件的次数与实验次数成比例)。****
虽然这种解释在理论上是正确的,但这个定义的问题是,在某些情况下,如选举,它没有太大的意义。在这种情况下,我们不能假设候选人将永远参加竞选,因此我们不能说它的长期相对频率是多少。
样本空间
创建我们自己的模型的第一步是定义一个**样本空间,**明天早上我去办公室时会有什么不同的可能结果?嗯,我可以迟到或者准时或者准时所以我们可以定义一个包含那些可能结果的集合,这就是所谓的样本空间,通常用大写希腊字母 omega: 表示****
样本空间属性
在这种情况下,样本空间是微不足道的,但有时它可能很难定义。想想扔硬币两次,我们可以猜测我们可以有三个输出,两个头,头和尾或者两个尾。这是正确的,但如果我们谈论概率,我们必须跳出框框,一步一步地思考,考虑到每个小细节和我们实验的性质,在这种情况下,投掷硬币两次将有四种可能的结果:
样本空间必须始终为:
- 互斥的:只有一种结果会发生
- ****统称穷举:它必须覆盖所有的概率空间
- 正确粒化:不能包含无关信息
让我们看一些例子:
在这种情况下,如果我们假设 H 表示“至少有一个头”,而 T 表示“至少有一个尾巴”,那么我们的样本空间就不正确,我们可能有一些 HT 或 TH 并且它不满足第一个必须条件,这个样本空间就不是互斥的。
这个新的样本空间不会崩溃,但这还不够。有了它我们可以得到HHHT和 TH ,但是我们没有覆盖的情况。该样本空间并非*全部。*******
现在想象一下,*表示“雨天”, S 表示“晴天”,利用这个样本空间,我们确实涵盖了实验的所有可能结果,而且没有任何冲突,但是我们添加的信息是不相关和不必要的(除非我们想知道天气是否会改变硬币的行为)。这个样本空间没有正确地粒化。*****
概率定律
正如我们之前已经提到的,我们可以使用我们的数据创建一个**概率定律。**在这种情况下,我们将从事件发生的次数除以我们做实验的次数(定义样本空间的所有元素的所有数据)来推断,假设我未来的行为(在这种情况下)不会有太大的不同。****
我们知道迟到的概率是我迟到的次数除以总次数:
现在我们明白了!假设我的行为不会有太大的改变,我会迟到大约 2%的时间,50 天中的 1 天。我真的不知道我的老板是否真的会欣赏这一点…
连续空间中的概率定律
我们不会总是有相同的概率定律,在延迟/准时的情况下,该公式工作良好,我们可以推断一些未来的行为,但在其他情况下可能不是这样。
毛罗·吉利在 Unsplash 上拍摄的照片
想象一下,你和一些朋友在酒吧里扔飞镖。你的飞镖第一次击中中心的概率是多少?我们没有以前的数据来预测你是否会错过,即使我们有,我们也只能预测你是否能击中中心(或其他定义的区域)(因为我们会记下它是在的还是在的。****
相反,更准确的假设是你击中任何定义的地方 B (假设中心)的概率等于它的面积除以目标面积,在这种情况下将是样本空间。**
如果没有以前的代数知识,这种情况可能有点难以理解,但不要担心,因为这只是一个例子,说明定义概率定律不仅仅是我们的长期预期。**
这个问题的样本空间将由在从目标中心的半径内的目标的任何点来定义。我们可以将飞镖击中定义空间 B 的概率表示为其面积( A )除以样本空间的面积:
总结:
在第一部分中,我们已经看到了一些例子,比如什么是概率模型,它们是如何工作的,以及它们是由什么定义的。我们还看到了帮助我们以数学方式处理实验中事件发生的可能性的工具,概率,以及适当的样本空间的属性。
在下一部分,我们将讨论概率论建立的基础,即**概率公理。**我们还将与维恩图一起深入集合论以更好地理解这个不确定的世界。**
可证明的对抗攻击的鲁棒性;有什么意义?
活动讲座
尼克·弗罗斯特| TMLS2019
关于演讲者
尼克·弗罗斯特是杰弗里·辛顿实验室谷歌大脑的研究工程师。他在多伦多大学获得了计算机和认知科学的学士学位。他专注于胶囊网络,对立的例子和理解表示空间。
可证明的对抗攻击的鲁棒性;有什么意义?
数据科学家直观地解释了链式规则
只需 5 分钟就能掌握链式法则的直觉,为你未来的求职面试做准备!
简介
今天我们将讨论链式法则,我希望我对这个概念的直观解释能对你有所帮助!注意,本文假设你已经熟悉了导数的基本概念,只是想更深入地理解链式法则本身。
快速衍生工具概述
也就是说,让我们先快速回顾一下导数。
想象一下,我们从一群人那里收集了这些测量数据。在 x 轴上,我们测量了他们作为数据科学家的工作量,在 y 轴上,我们测量了他们的工资。
我们现在可以用这条绿色抛物线来拟合数据。
数据点的抛物线
抛物线的方程式是
salary = (years as Data Scientist)**2
这个方程的导数告诉我们沿曲线任一点切线的斜率。然而,切线的斜率告诉我们salary
相对于作为数据科学家的years
变化有多快。我们可以用幂法则计算出salary
对years
的导数!
具体数据点的切线
幂法则告诉我们将years
乘以 2 的幂,然后将years
乘以 2–1 的幂,得到下面的等式。
dSalary/dyears = 2 * years
嗯,这是一个快速回顾的衍生物:)
链式法则解释
现在让我们用一个超级简单的例子来深入研究链式法则!想象一下,我们收集了三个人的体重和身高测量值,然后对数据进行拟合。
这 3 个数据点的最佳拟合线
如果有人告诉我们他们有这么重,我们可以用绿线来预测他们有这么高。
根据体重确定身高
现在想象一下,我们收集了身高和鞋码的测量数据,并对这些数据进行了拟合。
这 3 个数据点的最佳拟合线
如果有人告诉我们他们有这么高,我们可以用橙色线来预测这是他们的鞋码!
现在,如果有人告诉我们他们有这么重,那么我们可以预测他们的身高,我们可以用预测的身高来预测鞋码,如果我们改变体重值,我们就会看到鞋码的变化!
根据重量确定鞋号
现在让我们来关注这条代表体重和身高关系的绿线。假设体重每增加一个单位,身高就会增加两个单位。
换句话说,直线的斜率是 2 除以 1,等于 2。由于斜率为 2,导数为
dHeight/dWeight = 2
因为绿线的斜率和它的导数 2 相同,所以高度的等式是
height = dHeight / DWeight * weight
注意,高度方程没有截距,因为绿线穿过原点。
现在让我们把注意力放在代表身高和鞋码关系的绿线上。
在这种情况下,假设身高每增加一个单位,鞋码就增加四分之一。按照与上述相同的逻辑,绿线的等式为
Shoe size = dSize / dHeight * height
在哪里
dSize /dHeight = 1/4
再次注意,因为绿线穿过原点,所以鞋码的等式没有截距。
因为体重可以预测身高,身高可以预测鞋码,所以我们可以把身高方程代入鞋码方程。如果我们想准确地确定鞋号如何随着体重的变化而变化,我们可以对鞋号相对于体重求导。
鞋码相对于体重的方程的导数就是这两个导数的乘积!换句话说,因为身高把体重和鞋号联系起来,所以鞋号对体重的导数是
Shoe size = dSize / dHeight * dHeigt/dWeight * weight
这种关系是链式法则的精髓。输入数字给我们一半,这意味着重量每增加一个单位,鞋码就增加一半!
结论
你可以看到链式法则里面没有什么复杂的东西,我们只是在计算一个参数如何改变其他参数!我希望这个链式法则的快速直观解释对你和你未来的职业生涯有所帮助!别忘了看看关于数学和机器学习主题的推荐书籍。
推荐书籍
数据科学家实用统计:使用 R 和 Python 的 50 多个基本概念
带 Scikit-Learn 的链式多输出回归解决方案
内部 AI
按顺序运行回归模型,以利用目标之间的相关性来预测多个因变量
作者插图——链式多输出回归
在典型的回归或分类场景中,我们有一组自变量和一个或多个因变量。有时,不可能一起预测所有因变量的值。由于目标之间的相关性,我们需要考虑序列中其他因变量的预测值来预测下一个目标值。屏住呼吸,通过本文讨论的详细解释和例子就变得清晰了。所有变量也称为特征,因变量称为目标。
为了在这种情况下使用机器学习进行预测,我们可以将序列回归模型与 Scikit-Learn 中的回归链放在一起
基于独立特征和目标变量序列中的第一因变量来训练第一模型。在训练第一个模型时,不考虑其他因变量值。
作者举例说明—基于独立特征训练数据和第一从属训练数据实际值训练第一模型
第二模型根据训练数据集中的独立特征值、第一和第二因变量值进行拟合和训练。该模型用于随后用测试数据集预测第二目标值。
作者的说明-基于独立特征训练数据、第一和第二相关训练数据实际值来训练第二模型
最后,为了预测第三因变量,基于独立特征值和所有因变量值训练最后的模型。最后一个模型将用于预测变量序列中最后一个因变量(目标)的值。
作者举例说明-根据独立特征训练数据和所有三个相关训练数据实际值训练最后一个模型
所有三个经过训练的模型将与不同的输入数据一起使用,以预测序列中的因变量值。
将独立特征测试值作为输入的第一训练模型用于根据从属特征的指定顺序来预测第一从属变量。
作者插图-测试第一个训练模型的数据集独立特征值输入
第一因变量的预测值和独立特征测试值被训练的第二模型用作输入,以预测下一因变量。
作者的说明-测试数据集独立特征值和第一目标预测值是第二训练模型的输入
前两个因变量预测值与测试独立特征值一起用作第三训练模型的输入,用于预测最后一个因变量。
作者的说明-测试数据集独立特征值和两个目标预测值是第三个训练模型的输入
步骤 1: 在 Scikit-Learn 包中, RegressorChain 在 multioutput 模块中实现。我们将使用 make_regression、math 和 NumPy 来创建测试数据。
**from sklearn.linear_model import LinearRegression
from sklearn.multioutput import RegressorChain
import math
import numpy as np
from sklearn.datasets import make_regression**
**第二步:**生成 20000 条记录的样本测试数据,包含 10 个独立特征和 1 个相关特征。
**X, y,coef = make_regression(n_samples=20000, n_features=10, random_state=0, noise=4.0,coef=True, bias=200)**
步骤 3: 创建相关的第二个和第三个因变量 y2 和 y3,所有三个因变量在下面的代码中被转换成一个 2000 x 3 的数组。
**y2=(y*math.sin(45))+(math.pi/3)
y3=y*y
y= np.vstack((y,y2,y3)).T**
第四步:根据回归链中的“顺序”参数考虑连续的因变量,用于训练不同的模型。在我们的示例中,基于独立特征训练值和第二因变量值来训练第一模型。然后,独立特征值、第二和第三从属值被用作训练第二模型的输入。最后,利用独立特征测试值和所有三个因变量测试数据集值,训练第三个模型。
**reg = LinearRegression()****ChainRegression= RegressorChain(reg, order=[1,2,0])
ChainRegression.fit(X,y)****print(ChainRegression.score(X, y))**
已训练模型的准确度分数
如前所述,以独立特征测试值作为输入的第一模型预测第二相关值。那么独立特征测试值和第二从属预测值将被用作预测第三从属值的输入。最后,独立特征测试值连同第二和第三预测值被用作预测第一相关值的输入。
这样,如果我们有一个以上的目标(因变量)值,并且目标特征(因变量)以一定的顺序相关,我们就可以实现序列回归。
"Full Code"**from sklearn.linear_model import LinearRegression
from sklearn.multioutput import RegressorChain
import math
import numpy as np
from sklearn.datasets import make_regression****X, y,coef = make_regression(n_samples=20000, n_features=10, random_state=0, noise=4.0,coef=True, bias=200)****y2=(y*math.sin(45))+(math.pi/3)
y3=y*y
y= np.vstack((y,y2,y3)).T** **reg = LinearRegression()
ChainRegression= RegressorChain(reg, order=[1,2,0])
ChainRegression.fit(X,y)****print(ChainRegression.score(X, y))**
用 Hadoop/ Java 链接多个 MapReduce 作业
来源:https://mapr.com/blog/how-to-launching-mapreduce-jobs/
大约一年前,当我的工作需要一点 Hadoop 时,我简要地了解了 MapReduce。那时我还没有接触过 MapReduce,更不用说用 Java 了。因此,当一项任务要求我在一个脚本下实现多个 MapReduce 作业时,在 Stack Overflow 和 Youtube 上搜索简直是一团糟。
那么,为什么不写点什么呢?是的,我是。
概要:MapReduce
MapReduce 是一个计算抽象,可以很好地与 Hadoop 分布式文件系统(HDFS)一起工作。它包括“映射”步骤和“减少”步骤。Map 执行过滤并分类到另一组数据中,而 Reduce 执行汇总操作。在这两个步骤中,单个元素被分解成键和值对的元组。
MapReduce 因能够在后台的多个计算节点上轻松扩展数据处理而广受欢迎。因此,它可以很好地与
非常大的数据集。
多个 MapReduce 作业
为了说明如何在一个脚本中链接多个 MapReduce 作业,我将使用大约 760 万行的NYC Taxi&Limousine Commission数据集来计算位置度数差异的分布。的。我使用的 tsv 文件具有以下结构:
假设我们想使用 MapReduce 获得以下两列的输出:
其中“diff”是位置 ID 的出度减去其入度。位置的出度是该位置用于拾取的次数,入度是该位置用于放下的次数。那么,“计数”就是特定“差异”的频率。
因此,实现这一点的一种方法是拥有两个 MapReduce 作业。一个是计算每个位置的“diff ”,另一个是将第一个作业的输出转换为“count ”,就像我们上面想要的那样。
映射-减少作业#1
映射程序#1
Job #1 的 Map 过程简单地循环并中断。tsv 为每行输入 4 个不同的值:PickUpLocation ID、DropOffLocation ID、PassengerCount 和 TotalFare。但是,这里只有 PickUpLocation ID 和 DropOffLocation ID 与我们的任务相关。然后,对于每个元素,该类还创建一个为 1 的 inDegree 变量和一个为-1 的 outDegree 变量。
然后,它将每个(PickUpLocation,inDegree)和(DropOffLocation,outDegree)写入一个键值元组,该元组将由 Reduce 过程进一步处理,该过程采用如下形式,其中第一列是位置 ID,第二列指示它是从每个位置 ID 拾取还是放下。
简化程序#1
然后,Reduce 过程所做的只是按位置 ID 进行分组,并通过对第二列求和来实现“diff”。然后,它将(Location ID,diff)作为键值元组写入。
输出采用以下形式:
MAP-REDUCE 作业#2
然后,作业#1 的输出作为作业#2 的输入传入。
映射程序#2
为了按“diff”分组以获得最终输出,Job 2 的 Map 过程需要将输入键值对(Location ID,diff)交换到(diff,Location ID)中,因为 Reduce 过程按键分组。
实际上,这次 Map 过程的输出如下所示:
最后,将它传递给第二个 Reduce 过程来完成任务:
简化程序#2
这里发生的事情是,Reduce 过程简单地遍历输入,并且对于唯一的“diff”的每一次出现,它的计数增加 1。在循环结束时,它将(diff,count)作为键值对写入最终输出文件:
连锁作业#1 &作业#2
我发现的具有挑战性的步骤是连接上述两个 MapReduce 作业,这样作业#2 可以将作业#1 的输出作为输入,而不需要作业#1 实际写出一个文件。
链接步骤
我不得不在网上寻找和尝试多种建议,直到我找到最容易理解的组合。
基本上,关键是为这两个作业创建两个不同的配置,即“conf”和“conf2 ”,它们也获得两个不同的实例。
*Configuration* conf = **new** Configuration();
*Job* job1 = Job.getInstance(conf, "degree");*Configuration* conf2 = **new** Configuration();
*Job* job2 = Job.getInstance(conf2, "frequency");
然后,作业#2 只能在作业#1 完成时执行
job1.waitForCompletion(true);
但是请注意,系统并没有在这里终止。然后,作业#1 的输出与作业#2 的输入相同:
FileOutputFormat.setOutputPath(job1, **new** Path(args[1]));FileInputFormat.addInputPath(job2, **new** Path(args[1]));
仅此而已。使用这种技术,您不仅仅局限于两个 MapReduce 作业,还可以增加到三个、五个甚至十个来适应您的任务。
我希望这篇简短的笔记可以帮助那些正在努力寻找一个关于链接 MapReduce 作业的全面且易于理解的指南的人。
在 BigQuery 中链接多个 SQL 查询
在 BigQuery 中依次执行多个查询
Bigquery 是一个非常棒的工具!它可以让你使用类似 SQL 的语法进行非常强大的分析工作。
但是它缺少对 SQL 查询的链接。我们不能在一个 SQL 完成后立即运行另一个。在许多实际应用中,一个查询的输出依赖于另一个查询的执行。我们希望运行多个查询来获得结果。
这里有一个场景,假设您正在使用 BigQuery ML 进行 RFM 分析。首先,您必须计算所有用户的 RFM 值,然后将 k-means 聚类应用于第一个查询的结果,然后合并第一个查询和第二个查询的输出,以生成最终的数据表。
在上面的场景中,每个下一个查询都依赖于前一个查询的输出,并且每个查询的输出也需要存储在数据中以供其他用途。
在本指南中,我将展示如何在 BigQuery 中一个接一个地执行尽可能多的 SQL 查询,创建一个链接效果来获得想要的结果。
方法
我将演示链接查询的两种方法
- **第一种使用云发布/订阅和云函数:**这是一种更复杂的方法,因为它确保在执行下一个查询之前完成当前查询的执行。这种方法也需要一点编程经验,所以最好联系公司里有技术背景的人。
- **第二种使用 BigQuery 自己的调度器:**然而,查询调度器不能确保一个查询的执行在下一个查询被触发之前完成,所以我们必须使用查询执行时间来破解它。稍后将详细介绍。
如果你想弄脏自己的手,那么 这里有一个极好的课程 可以开始。
注意:我们将继续上面讨论的 RFM 的例子,让你了解这个过程。但是这同样适用于任何需要触发多个 SQL 查询的场景。
方法 1
方法 1 使用云功能和发布/订阅的组合来链接整个流程。该过程由查询调度器开始,该查询调度器在执行第一个查询之后向发布/订阅主题发送消息,该消息触发负责触发第二个查询的云功能,并且一旦完成,就向另一个发布/订阅主题发送消息,以启动另一个云功能。这个过程一直持续到云函数执行最后一个查询。
让我们通过 RFM 分析用例来理解这个过程。
假设我们有三个需要依次运行的查询来执行 RFM 分析。
首先是 ,这样计算出的 RFM 值,我们就称之为 *RFM Values*
。 第二个 ,这就产生了模型,我们就称之为 *RFM Model*
。 第三个 ,即将模型输出与用户 RFM 值合并,我们称之为 *RFM Final*
。
下面是数据管道的样子:
通过 Muffaddal 在 BigQuery 数据管道中链接查询
注意 : 我假设已经为所有三个查询创建了表。
1-我们首先创建一个发布/订阅主题,因为在创建*RFM Values*
查询调度器时会用到它。我将它命名为RFM_Model_Topic
,因为它将触发负责执行我们的模型查询的云函数(即*RFM Model*
)。
RFM _ 模型_Topic
发布/订阅主题,作者 Muffaddal
复制创建 *RFM Values*
schedular 时需要的主题名称。
2-接下来,转到 BigQuery,在查询编辑器中粘贴为我们的用户计算 RFM 值的*RFM Values*
查询,然后单击“Schedule query”按钮创建一个新的查询调度器。
通过 Muffaddal 创建计划查询
3-在调度程序创建菜单中输入所需的值,以创建调度程序
查询日程创建菜单,按 Muffaddal
这个调度程序将在指定的时间执行,计算用户的最近次数、频率和货币值,并将其存储在上述 BigQuery 表中。一旦调度完成执行查询,它将向我们的RFM_Model_Topic
发送一条消息,这将触发一个云函数来触发我们的模型查询。接下来让我们创建一个云函数。
4-进入RFM_Model_Topic
发布/订阅主题,点击屏幕顶部的“触发云功能”按钮。
由 Muffaddal 从发布/订阅主题创建云函数
5-进入如下所示的设置,并将云功能命名为RFM_Model_Function
云功能设置,由 Muffaddal
6-并将下面的代码粘贴到index.js
文件中
由 Muffaddal 触发 RFM 模型查询的云函数
一旦查询被执行,云函数向名为RFM_Final
的新发布/订阅主题发送发布消息,这触发了负责将 RFM 值和模型结果组合在一个数据集中的最后查询的云函数。
7-因此,接下来,在发布/订阅中创建RFM_Model
主题和一个云函数,就像我们在上一步中做的那样。将下面的代码复制粘贴到云函数中,这样它就可以运行最后一个查询。
触发 RFM 最终查询的云函数
就是这样!
我们可以使用任意多的发布/订阅和云函数来链接任意多的 SQL 查询。
方法 2
现在第一种方法是健壮的,但是需要一点编程背景,并且说这不是你的强项。您可以使用方法 2 来链接 BigQuery 查询。
BigQuery 的查询调度器可以用来一个接一个地运行查询。
想法是我们像方法 1 一样开始这个过程,即使用调度程序触发第一个查询,并估计它的完成时间。假设第一个查询需要 5 分钟来完成。我们要做的是在第一个查询开始时间后 10 分钟触发第二个查询。这样,我们可以确保第二个查询在第一个查询完全执行后被触发。
让我们通过例子来理解这一点
使用查询调度器的链式查询,由 Muffaddal
假设我们将第一次查询安排在凌晨 12:30。需要 10 分钟才能完成。因此我们知道在凌晨 12:40 第一个查询应该完成。我们将第二个查询调度器设置为在 12:50 am 执行(为了以防万一,在两个调度器之间保持 10 分钟的间隔)。我们将在凌晨 1:10 触发第三次查询,依此类推。
方法 2 也可以与方法 1 结合使用。这意味着我们使用云函数来触发查询调度程序。这样做还有一个额外的好处,那就是您不必遇到云函数的执行时间限制,并且您的查询可以执行所需的时间。
PS:由 西蒙汤姆森 建议用云功能触发按需查询调度器。
注意:由于查询调度器不能与 BigQuery ML 一起工作,因此,方法 2 不能用于我们的 RFM 分析案例,但是它应该让您了解如何使用调度器来链接查询。
其他方法
如果你能处理更复杂的管道塞巴斯蒂安·莫兰提出了另外两种方法供你使用。
总结
一个接一个地执行查询有助于获得非常好的结果,特别是当一个查询的结果依赖于另一个查询的输出,并且所有的查询结果都需要表格格式时。开箱即用的 BigQuery 不支持这一功能,但使用 GCP 的组件,我们可以简化流程以获得结果。
在本文中,我们通过两种方法做到了这一点。首先使用 cloud pub/sub 和 cloud 函数,另一个使用 BigQuery 自己的查询调度器。
通过这篇文章,我希望我能够向您传达这个过程的想法,以便您能够根据您的特定业务案例来选择和定制它。
阅读关于 BigQuery 的更多信息:
使用 BigQuery ML 中的 RFM 分析和 Data Studio 中的可视化进行用户细分。
towardsdatascience.com](/rfm-analysis-using-bigquery-ml-bfaa51b83086) [## 向 BigQuery 发送标准的 Google Analytics 点击量数据
如何发送标准的谷歌分析点击量数据到 BigQuery?
towardsdatascience.com](/send-google-analytics-hit-level-data-to-bigquery-5093e2db481b) [## 自动将数据导入 Google Analytics。
建立一个数据管道,使用 Google Cloud Platfrom 将数据导入 google analytics。
towardsdatascience.com](/automate-data-import-to-google-analytics-471de2c3fc76)