TowardsDataScience 博客中文翻译 2020(五百七十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

无服务器是 Kubernetes 的末日吗?

原文:https://towardsdatascience.com/kubernetes-serverless-differences-84699f370609?source=collection_archive---------2-----------------------

对两种技术进行比较,以结束孰优孰劣的争论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总部,我又做了一次。我用了这个醒目的标题,是为了一定要引起你的注意,对此表示抱歉。我需要你们的注意来介绍这个大主题,以供思考。你认为 Kubernetes 是 DevOps 世界上最后一个最好的广告技术吗?今天,技术比以往任何时候都更短暂,你必须为变化做好准备。我喜欢 Kubernetes,我很高兴再次谈论它。这是在 DevOps 场景中最热门的流行语。阅读这篇文章你会找到这个大问题的答案:

这是基础设施管理的最终解决方案,还是我们需要把赌注压在无服务器上,让我们的心远离运营团队?记住, NoOps 来了。

我认为技术上的变化是正常的。我们的祖先乘马车旅行,我们乘飞机。这是进步的一部分。

在过去的几年中,有一场小革命,将越来越多的应用程序从虚拟机带到了容器中,这主要归功于使用 Kubernetes 进行部署的机会。

当这场革命发生时,有一个小而有力的流行词。是“无服务器”。大多数人认为它是邪恶的,其他人喜欢白马王子,可以将开发商从噩梦中拯救出来。好吧,让我们来看看有哪些问题和机会——安静,没有威胁即将出现!

Kubernetes 和 serverless 有什么区别?

无服务器是一种云模型,在这种模型中,您希望摆脱服务器和基础架构。目标是避免固定成本,减少上市时间和团队(运营和开发)之间的摩擦。具体来说,想象有一个层可以接收你的代码并负责执行。无服务器差不多就是这样。

你提供代码,供应商提供所有其他的。

最常见的无服务器实现具有带 SDK 的无状态容器,允许您的代码集成到系统中,并根据资源的使用情况向您开具发票。在大多数情况下,我们可以将我们的功能上传到云中(“FaaS”,功能即服务),该功能由 HTTP 调用激活。主要的云提供商提供类似的云体验:

当然,服务器并没有灭绝。你看不到它们,因为它们被供应商隐藏了,供应商使用它们来提供服务。服务器仍然存在,但你看不到任何内存、CPU 或磁盘空间。你只需要专注于代码。你可以把精力放在真正需要的地方。

还有什么是 **Kubernetes?**将 Kubernetes 视为一个框架,从简单的 docker 映像开始运行分布式系统。它可以满足您的扩展需求、部署和负载平衡。所有这些东西都可以很容易地用普通的 YAML 文件描述和重用,通过设计创建一个可复制的环境。

Kubernetes 是你手上的基础设施。

只需更改一些配置文件,您就可以完全控制容器实例(服务和容器)、网络和部署。Kubernetes 可以满足您的扩展需求、故障转移、部署模式等等。对于 Kubernetes 的新手,我在 Kubernetes 上写了一篇很好的介绍文章。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自"到底什么是 Kubernetes "

Kubernetes 和 serverless 一样,只需要系统管理员很少的努力就可以实现复杂的架构。这种技术将人力密集型的传统部署转变为智能和快速的部署。嘿伙计们,诺普斯来了!

Kubernetes 有哪些优点?

使用 Kubernetes 的最大优势是,您可以像处理常规服务器场一样处理您的集群,但没有物理管理的成本。从逻辑上讲,您可以在服务器和集群组件之间重新创建并行性。您可以像实例化虚拟机一样实例化 pod 和服务。你有网络,存储等等。这意味着通过对集群的低级别访问,可以更深入地控制所有单个组件。

因此,我列出了使用 Kubernetes 而不是无服务器平台的优势:

  • 与过去的兼容性很好。如果你在使用容器,那么迁移是很容易的,如果不是,那么只是容器化你的应用组件的成本。
  • 对发生的事情有很大的控制力
  • 更少的供应商锁定。Kubernetes 就是 Kubernetes,Docker 容器就是 Docker 容器。在纸面上,您只需点击一下鼠标就可以移动基础架构
  • 微调每个组件的能力
  • 也可以在本地运行(对于开发人员,或者极端情况,或者如果你只是疯了)
  • 成本预测。您为群集的资源付费,这比无服务器方法更容易预测。

无服务器的优点是什么?

Kubernetes 在减少系统管理员工作量方面向前迈出了一大步,但并没有减少到零。基本上,无服务器方法避免了任何 sysadmin 组件,因为您唯一需要关心的是源代码。就像挑一套乐高积木,把它们拼在一起。每块砖都是独立工作的。你只需要让他们正常交流。就这样。FaaS 的解决方案似乎太难实施,因为它们需要思维方式的转变。在这种情况下,您可能会采用一些更软的无服务器解决方案,直接托管您的应用程序,无需更改。这种解决方案的一个很好的例子是 Heroku,它从服务器和传统 DevOps 中抽象出来,提供了一种 NoOps 无服务器体验,可以促进您的应用程序开发,减少所有托管摩擦(您还有一个免费层)。

无服务器是 Kubernetes 的末日吗?

如今,甚至无服务器似乎也是新事物,AWS Lambda 的首次发布是在 2014 年。那一年,Docker 正在迈出第一步(第一次正式发布是在 2013 年,我不确定在发布时它何时准备好用于生产场景)。Kubernetes 出生于 2014 年。因此,我们可以说,无服务器的出现与集装箱时代差不多。从这个角度来看,**无服务器并没有紧随 Kubernetes 之后,我们也不能认为无服务器是容器的替代品。**它们只是在 web 应用程序中实现托管部分的两种不同方法。也许在某些情况下,你可能更喜欢这个或那个。当一个和另一个。正确的答案是“视情况而定”,就像许多类似的问题一样。咨询师和优秀咨询师的区别在于,知道很多互补的解决方案,并根据场景找到最佳方案。

带什么回家

我们已经讨论了这两种解决方案的优点,然后我们可以说,仅仅通过了解技术,您就可以找到适合您的场景的最佳解决方案。使用像谷歌云或其他大型云服务,你将准备好实施任何解决方案。只是时间来试验他提供的工具,并了解利弊。

觉得这篇文章有用?在 Medium 上关注我(丹尼尔·方塔尼),看看我在下面 DevOps 上最受欢迎的文章!不要忘记👏这篇文章分享一下吧!

进军深度学习:从零开始的字符识别

原文:https://towardsdatascience.com/kuzushiji-recognition-part-1-character-recognition-6ebfcdfab2b0?source=collection_archive---------67-----------------------

使用自定义 CNN 分析汉字。

注意:对于本系列中的所有文章,我都遵循 fast.ai 关于实用深度学习的课程,并听从杰瑞米·霍华德的建议:做项目并写下它们。

这是一篇关于我参加 Kuzujishi 识别卡格竞赛的经历的文章。虽然目标是最终向竞赛提交参赛作品,但我使用了竞赛中的数据从头开始构建了一个字符识别网络。该数据集看起来像是常规 MNIST 数据集的一个不错的大胆扭曲 twist(修改后的国家标准与技术研究所)是一个包含超过 60,000 个用于识别任务的手写字符的数据库。

在这里,我讨论项目的第一部分:创建一个 Kuzushiji 字符识别模型。我跳过了数据的设置,因为这需要特定于数据最初是如何呈现的工作。尽管如此,在我的 GitHub repo 中仍然可以找到代码,链接在文章的末尾。

酷族世纪人物

当我开始这个项目时,我首先想知道的是“我需要识别多少个字符?”提供了每个字符及其 Unicode 表示的 csv,所以我加载了它并查看了一下:

unicodes = pd.read_csv(unicode_csv_path)
unicodes.shape(4781, 2)

有 4781 个字符!进一步检查发现,这些字符中有许多是与汉字字符集无关的符号。在创建数据集时过滤掉这些符号后,我剩下了 4213 个子文件夹。每个文件夹包含一个在数据集中至少出现过一次的字符样本。

在开始之前,让我们看一下我必须处理的一些图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从数据集中提取带有 unicode 标签的 Kuzushiji 字符(图片由作者提供)

这就是我保存图像的方式,但这里有一个原始图像的例子,没有改变:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单个 Kuzushiji 字符(图片由作者提供)

唯一的区别是前后图像之间的灰度变换。

加载数据

加载数据是一个挑战,但不是以我预期的方式。下面是使用data_block api 创建 databunch 的完整实现:

db = ImageList.from_folder('./char_images') \
            .filter_by_func(filter_too_many) \
            .use_partial_data(0.3) \
            .split_by_rand_pct(0.3) \
            .label_from_folder() \
            .transform([[binarize()], [binarize()]], size=(32,32)) \
            .databunch(bs=16)

我将一次剖析这一行。

首先,我从char_images文件夹中创建了一个ImageList。接下来,我使用一个定制函数filter_by_func(filter_too_many)过滤数据,这个函数有一个简短的实现:

def filter_too_many(filename):
    num = filename.parts[-1].split('_')[-1].split('.')[0]
    return int(num) < 500

来回答“你为什么这么做?”我们需要看一下现有的数据。这是每个角色数量分布的直方图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我绘制这个图时,问题变得很明显。大约有 100 个字符,样本超过 1000 个。其他的 3212 个字符要少得多。事实上,很多只有 1 或 2 个样本。我很清楚这是一个非常不平衡的数据集。

为了客观地看待这个问题,这里有一个链接,链接到一个 40,000 单词的数据集中的英语字符的分布。这里有一个链接,链接到中文中的汉字频率。在英语中,E 和 Z 的比例是 171 比 1。中文字符集的链接显示至少有 9000 个字符。Kuzushiji 有一半的字符计数。综上所述,Kuzushiji 并不特殊,在处理字符样本时,这种分布是可以预期的。

不平衡数据

不平衡数据是数据科学生态系统中一个研究得很好的问题。高质量、平衡的数据对于训练和验证模型至关重要。

在处理不平衡数据集时,您需要实施过采样和欠采样策略。您对少数数据进行过采样,以满足多数数据的数量。欠采样不太常见,因为这等同于丢弃数据。为了简化我的问题,我创建了 500 个少数民族字符的副本,对它们进行了过采样。然后,对于较大的标签,我也将这些字符类欠采样到 500。那是filter_too_many函数的责任。它会根据文件名过滤掉 500 份以上的副本。

关于我所采用的方法,有一个小小的警告:对于有一两个样本的角色,我每个都创建了 500 个副本,没有任何改动。在这之后,我把这些数据当作完美的。正如我从这篇关于主题的文章中了解到的,这并不理想。这些拷贝同时出现在训练和验证数据中。这可能提高了模型的准确性,因为该角色的训练集和验证集中的图像是相同的。像数据扩充这样的技术可以大大降低这种危险,因为每个角色都以某种微妙的方式变得不同。

处理大型数据集

与其他数据集相比,我的实际上并没有那么大。然而,在我自己的机器上,用 NVIDIA GeForce GTX 1080,训练有点烦人。因此,对于我的最后一次迭代,我只使用了 30%的数据,通过use_partial_data(0.3)实现。为了达到这个阶段,我经历了我的 databunch 和 model 的各种版本,我将在本文的后面讨论。就目前而言,知道我试图训练模型并等待看到结果的耐心正在变得稀薄就足够了,所以我坚持 30%。现在我可以离开模型训练一夜,第二天早上在我的桌面上看到结果。

转换

接下来的两行很简单——我将数据分成 70%的训练数据和 30%的验证数据,并根据每个文件所在的文件夹对它们进行标记。下一条线transform([[binarize()],[binarize()]], size=(32,32))是我花了一些时间的地方。我想了解 fastai 的转换 api 是如何工作的,看看我是否可以为自己的数据集创建一个。

Kaggle 竞赛网站指出,一些页面的另一面显示出模糊的字符轮廓。该模型只需要识别最前面的字符,而不是下面字符的模糊标记。我决定,对于每个字符,必须有一个像素阈值来区分背景和字符。事实证明,这个想法效果很好,去除了模糊的背景轮廓,使人物轮廓清晰。有时会有伪像,但这取决于角色图像的原始质量。下面是一个之前和之后的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之前的示例图像,二值化。注意右上角和右下角的工件

当我为此编写代码时,有一些我没有预料到的复杂性。查看该函数的代码,并再次与调用它的代码行进行比较:

我首先创建了一个转换函数_binarize。它的实现包括使用 opencv 函数将张量转换成 numpy 数组,然后重新创建 torch 张量。在充分测试了这个函数之后,我用它实例化了一个TfmPixel。最后,我在一个列表中传递被调用的值,并重复这个过程两次。看来TfmPixelTransform类有一个已定义的 call 函数。这也允许类作为一个函数,这就是为什么binarize()是有效的。除此之外,fastai 期望,对于定制转换,一个转换列表应用于训练集,一个转换列表应用于验证集。这就是为什么在代码中,我把binarize()放在两个列表中。这是 fastai api 中少数几个对我来说不太直观的部分之一。

批量大小和标准化

最后,我通过传递批量大小为 16 的数据并对数据进行规范化,完成了 databunch 的创建。就像我上面说的,这些也是我用来提高训练速度的变量,我会在后面提到。

创建 CNN

对我来说,将我在之前的文章中所做的应用迁移学习来解决这个问题是相当容易的,但是我没有。我从头开始构建我的模型有两个原因。首先,我可以学习如何正确地写出模型中的层次和交互。第二,理解模型的变化如何影响最终结果的变化。这是我最终模型的样子:

卷积、ReLU、BatchNorm

这三层包含了我在网络中使用的大部分魔法。但是我的模型并不像上面的代码那样。相反,我从小处着手,只有一两层,然后一步一步往上爬。其实我是先完全用 PyTorch 写的小网络,然后用 fastai 重写的。这迫使我钻研简单事情的源代码,例如“卷积滤波器的默认步长是多少”或“fastai 的conv_layer如何将所有这些层合并为一个层,它传递了哪些默认值?”

我编写了函数_conv2d_layer,让我可以快速决定要从多少个通道开始,而不用担心中间层的通道数。在每一步 2 回旋之后,我的网络在频道上加倍。我在查看 ResNet18 后做出了这个决定,因为我不想偏离那些经过良好测试的架构。这同样适用于我使用的频道数量。但是,即使在我写这篇文章的时候,我也反复地改变这个模型,因为新的想法不断涌现。在最终模型中,该架构在通过自适应池层之前在 512 个通道处截止。这是最终的架构,通过输出的镜头完全展开:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在他的 fast.ai 课程中,Jeremy 讨论了使用卷积的具体顺序,然后是校正线性单元(简称 ReLU),最后是批量归一化层。ReLU 选择并清除负激活。在数学上,只是max(0,x)其中 x 是激活。批量标准化有很多工作要做,我不认为我可以用数学来解释,但根据 Jeremy 的说法,它的要点可以归结为定义类似于y=ax+b的东西,其中批量标准化添加了ab项,以将均值和方差转移到我们想要的位置。顺序问题,直观地说,ReLU 之后的批量范数层意味着试图移动均值和方差的工作不会浪费,因为激活不会被 ReLU 归零。

非常重要的是要注意,如果你正在阅读 fastai v1 文档,它说自定义conv_layer “返回 nn 的序列。Conv2D,BatchNorm 和一个 ReLU” 。这意味着批处理规范化在 ReLU 之前完成。但是,源代码讲述了一个不同的故事,一个 ReLU before batch norm。我发现这一点是因为我很困扰,因为医生暗示的序列与我的直觉告诉我的不同。直觉和一点“信任但核实”大有帮助。

头部

在将卷积层定制为我认为最有效的层之后,剩下的简单任务就是将这些激活映射到 1-hot 向量的 4212 个输出,我的网络将使用这些输出来预测结果。这被称为网络的“头”。例如,当使用预先训练的模型时,通常希望将模型的头部换成一组更特定于任务的层。网络卷积层的权重仍然存在,但最终层需要一点训练。

我保持我的最终层简单明了,应用一个池层,然后是批量标准化,下降,和完全连接的线性层。上面的代码使用了PoolFlattenbn_drop_lin,都是 fastai 函数。

PoolFlatten先创建一个AdaptiveAvgPool2d 图层。然后,它加上一个 flatten 来创建大小为 512 的秩 1 张量。请记住,在此之前,该架构演示了卷积如何在增加通道数量的同时减少输入的宽度和高度。激活范围从 128x16x16 到 256x8x8 到 512x4x4。然后汇集发生,创建大小为 512 的秩一张量。我仍在学习自适应平均池的细节,包括何时使用它与最大池或两者都用。无论如何,在 CNN 的结尾,建议使用某种池来将激活转换为最后一层的正确输出形状。

bn_drop_lin是另一个 fastai treat,通过源代码比文字更好地解释。我要补充的唯一一点是,dropout 层减少了过度拟合,我知道我的模型可能会因为数据集中只有一个样本的字符而受到影响。

虽然您看不到它,但最终的 softmax 层也存在于网络中。Fastai 足够聪明,知道模型最终想要一个 softmax 层来创建一个合适的概率分布。它知道这是由于输出的性质,一个热码编码向量,和损失函数,交叉熵,用于分类任务。

训练 CNN

这是一个非常耗时的过程。我将回顾我所做的一切实验,但不幸的是,这是我记忆中的日志,而不是记事本或日志。下一次我准备这样做的时候,我需要把它写在一个单独的地方,这样我就可以查看我尝试过的所有变量。

优化 GPU 的使用

最初,我的训练需要两个小时或更长时间,使用 NVIDIA GeForce GTX 1080,我知道我会留下一些东西。果然,在查看gpustat -cp -i时,我只看到了 3–10%的 GPU 使用率。最初,我使用 128 或 256 的批处理大小,因为我没有用完内存。在阅读了大量论坛帖子后,我意识到,在这一点上,也许我的内存不是瓶颈,但通过我的binarize转换器的图像才是。许多作者建议使用优化的图像库,但是我认为这对于我的简单任务来说太难了。相反,我首先从我的数据中提取了一小部分。然后,我大幅减少了批量。最后,我不断地热然一个fit_one_cycle,不在乎最后的结果。我只是运行它,观察速度,内存使用,GPU 使用,然后停止它,重复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPU 处于最大使用率(是的,我已经将我的桌面命名为 smallrig)

对于 64x64 的图像,我开始看到批量大小为 4 的 GPU 得到了很好的利用。对于 32x32 的图像,一批 16 个似乎就可以了,而且速度快得多。

起初,我认为在将它们映射到一个 4212 独热编码张量之前,我需要更多的最终激活,所以我将最终通道大小强制增加到 1024。但是没有足够的通道起始数量,图像太小,以至于模型开始在 1×1 像素上进行步长 1 卷积。那没有任何意义。我必须提高我的通道的初始数量,以便输入激活不会减少到 1x1,直到最后的步幅 2 卷积。但是另一个问题突然出现了。训练后,错误率在 3%左右,训练损失为 0.02,验证损失为 0.15。策划损失并不愉快;验证损失并没有以任何稳定的方式减少,即使训练损失在减少。显然,我是过度拟合,即使与辍学层。因此,我退出了通道,并让激活设置为 512x4x4 张量,然后通过头部获得字符概率。这个模型经过训练后表现良好。

因此,我坚持使用 32x32 的图像,模型的批量大小为 16,512 个最终通道,以及最终的 512x4x4 激活张量,然后通过头部输入以获得字符概率。这个模型经过训练后表现良好。

实际训练

这里没有太多描述,只是一点点代码和图片。首先,我试图找到最佳的学习速度:

learn.lr_find()
learn.recorder.plot(skip_end=20)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个很棒的图表。最初,我感到气馁,因为我的初始图形看起来非常平坦,在非常大的峰值之前,只有一个小的波谷。然而,正如我从论坛上了解到的,我需要切掉图的尾端。如果没有这一点,损失爆炸使 y 轴气球,这反过来使图表的其余部分变得无足轻重。用skip_end=20参数重试效果非常好。事实上,我忍不住创造了这个迷因:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我也可以这样初始化权重。或者当一个难懂的概念最终实现时。不要让我开始。

然后,我拟合了一段时间的模型

learn.fit_one_cycle(7, slice(1e-3), callbacks=[SaveModelCallback(learn,every='epoch', name='30pct32sz16bsN_model')])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看到 0.017 的错误率,我非常激动。看一下损失图表:

learn.recorder.plot_losses()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练和验证的最终损失分别为 0.003 和 0.084。请记住,与验证相比,培训的损失较低是预期的,也是健康的,只要差异不是很大,并且两者仍呈下降趋势。当我查看纪元表时,我惊讶地发现错误率、验证损失和训练损失都在下降,因此可能有更多纪元的空间。不过在这一点上,我对结果很满意。

我也试着看看最高亏损,但是,每当我跑的时候

interp = ClassificationInterpretation.from_learner(learn)

我以这个结尾:

RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 3870777456 bytes. Error code 12 (Cannot allocate memory)

果然,我的 RAM 看起来总是这样,post 尝试:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内存不足(内存接近 100%)

我还没有调查我需要做什么才能得到这份工作。也许我需要删除对象,停止运行不和谐,等等。任何能找回额外记忆的东西。或者只做简单的事情,买更多的内存。

热图和挂钩

杰里米在他的一堂课中做了一件很酷的事情,他看了看最终卷积的热图,并将其叠加在一只猫的图像上,他的模型预测这只猫是一只缅因猫。我决定也尝试一下,因为这是对 fastai 提供的回调功能的一个非常温和的介绍。这篇文章变得相当长,所以我将省去代码(在我的 GitHub 上总是可以找到)并提供一张图片来代替。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它负责识别的字符的最终卷积的热图

热图很好地勾勒出了角色的细节。它错过了人物的右上部分,但仅此而已。请记住,此热图是由最终卷积生成的。因此,它只是通过对 512x4x4 张量的 512 个通道进行平均而产生的 4x4 图像。然后对该图像进行插值以适合 32×32 的图像。

结束:吸取的教训

创建 CNN 实际上是这个字符识别练习中最简单的部分。PyTorch 和 fastai 的 API 都非常容易使用。在我想了解更多的情况下,我通常只需要查看 fastai 源代码。我喜欢用 PyTorch 写代码,然后用 fastai 重写,同时理解我写的所有东西。当然,对于像PoolFlatten这样的一些层,我需要回去确保我理解了更好的细节,但是我仍然对它是什么以及为什么它适合有一个直观的理解。

实验是艰苦的工作。我应该遵守纪律,跟踪每一个变化的变量,了解它对网络性能的影响。我希望在决定采用最大化速度的方法之前,我已经在自述文件中写下了我尝试的每种组合。这还没有开始考虑网络的变化,以了解模型的错误率是如何受到影响的,因为我需要几个时期才能看到这一点。唯一有帮助的是能够快速旋转笔记本,测试一两个功能,并将其复制到我的主笔记本上进行应用。

这很有趣,也很有收获。MNIST 变得无聊。Kuzushiji 的角色是我所期待的——有点挑战性。我花了大约三周时间浏览视频、阅读文档、查看数据等。在我的上一篇文章中,我提到了数据准备和培训之间的 80/20 分割。由于培训的时间,这个项目是 40/60 分裂。操纵模型的参数,看看什么可行,什么不可行,这占用了我大部分时间。

和往常一样,我的代码可以在我的 github repo 中找到。如果你真的看了代码,我恳求你,请浏览一下自述文件,这样你就不会被我的几个笔记本完全弄糊涂了。

谢谢你坚持到最后!欢迎评论和提问。

L1 和 L2 正则化-解释

原文:https://towardsdatascience.com/l1-and-l2-regularization-explained-874c3b03f668?source=collection_archive---------13-----------------------

如何控制模型的复杂性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯·莱佩尔特在 Unsplash 上的照片

过拟合是数据科学领域中的一个重要问题,需要小心处理,以便建立一个健壮和准确的模型。当模型试图很好地拟合训练数据,以至于不能推广到新的观察结果时,就会出现过度拟合。过度拟合模型捕捉训练数据中的细节和噪声,而不是总体趋势。因此,即使是特征的微小变化也会极大地改变模型的结果。过度拟合模型似乎在训练数据上表现突出,但在新的、以前看不到的观察上表现不佳。

过拟合的主要原因是模型复杂。因此,我们可以通过控制复杂性来防止模型过度拟合,这正是正则化所做的。正则化通过惩罚模型中较高的项来控制模型的复杂性。如果增加一个正则项,该模型试图最小化损失和模型的复杂性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这篇文章中,我将介绍两种常用的正则化技术,分别是 L1L2 正则化。导致模型复杂的两个主要原因是:

  • 特征总数(由 L1 正则化处理),或
  • 特征的权重(由 L2 正则化处理)

L1 正规化

它也被称为针对稀疏性的正则化。顾名思义,它用于处理主要由零组成的稀疏向量。稀疏向量通常导致非常高维的特征向量空间。因此,模型变得很难处理。

L1 正则化通过在每次迭代中从权重中减去一个小的量来强制无信息特征的权重为零,从而最终使权重为零。

L1 正则化惩罚|权重|。

L2 正规化

为了简单起见,它也被称为正则化。如果我们把模型的复杂度作为权重的函数,那么特征的复杂度与它的权重的绝对值成正比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

L2 正则化迫使权重趋向于零,但并不使它们完全为零。L2 正则化就像在每次迭代中去除一小部分权重的力。因此,权重永远不会等于零。

L2 正则化惩罚(权重)

有一个额外的参数来调整 L2 正则项,称为**正则化率(λ)。**正则化率是一个标量并乘以 L2 正则化项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**注意:**为λ选择一个最佳值很重要。如果 lambda 太高,模型就会变得太简单,而且往往会不符合要求。另一方面,如果λ太低,调节的效果变得可以忽略不计,模型可能会过拟合。如果 lambda 设置为零,那么正则化将被完全移除(过度拟合的高风险!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注: 岭回归使用 L2 正则化,而套索回归使用 L1 正则化。弹性网回归结合了 L1 和 L2 正则化。

结论

过度拟合是机器学习模型的一个关键问题,需要小心处理。我们建立机器学习模型来预测未知。我们希望模型能够学习训练数据中的趋势,并在评估新的观察结果时应用这些知识。因此,模型需要很好地概括底层结构,而不是过于关注训练点的细节。正则化有助于模型实现这个目标。

感谢您的阅读。如果您有任何反馈,请告诉我。

洛杉矶交通数据分析🚗

原文:https://towardsdatascience.com/la-traffic-data-analysis-part-1-53f24e21067d?source=collection_archive---------33-----------------------

使用公开来源数据分析洛杉矶的碰撞模式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Jsig9 来自 Pixabay

交通是一个几乎每个人都熟悉的问题。作为一名在洛杉矶生活了 7 年的居民,我经历过太多的交通堵塞,似乎不管一天中的什么时候或者一周中的哪一天。这就是为什么当我偶然发现由洛杉矶市维护的交通碰撞数据集时,我如此感兴趣。这个数据很酷,原因有几个。虽然它不直接测量流量,但它测量的是一个密切相关的代理。不难假设,更多的流量与更多的冲突相关,而更多的冲突直接导致更多的流量。

我希望像这样的数据集可以用来为每个人创造更安全、更高效的社区。本着这种精神,这个数据集(以及其他一些数据集)由洛杉矶市积极维护,并对公众免费开放。

浏览数据后,我决定尝试回答 3 个主要问题:

  • 交通碰撞模式如何随一天中的时间、一周中的日期和一年中的时间而变化?
  • 碰撞在地理上是如何分布的?有可能识别高风险区域或交叉路口吗?
  • 有可能预测给定时间范围内的碰撞次数吗?

在进入上面的问题之前,让我们了解更多关于数据集的知识。

📈数据

数据从 2010 年 1 月开始,每周更新。在我的特殊情况下,我使用 2010 年 1 月至 2019 年 7 月的数据,结果是大约 50 万行。每行对应一次碰撞。这些数据是从原始的纸质交通报告中转录出来的,因此很有可能存在错误。以下是一些关键字段的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 LA 碰撞数据集中选择的字段

这些字段的可用性激发了上面列出的关键问题。

与任何数据集一样,这个数据集在开始任何分析之前都需要清理。有几列只有一个值,反映了该数据中的所有行都对应于流量冲突的事实。

还有多个字段具有冲突的近似街道名称(上面未显示)。这些文本字段需要清理,特别是删除多余的空格。同样,在上面的图片中,我们可以看到包含在一个字符串中的纬度/经度坐标。我将这些坐标提取在单独的列中以备后用。

下一步是检查空值或缺失值。约 16%的碰撞(78K)没有相关的受害者年龄。还有少量(400 个)碰撞没有有效的纬度/经度坐标,将从第 2 部分的绘图部分中排除。

💡数据探索

清洗之后,但在进入主要问题之前,我想做一些一般性的数据探索。这种分析通常是有用的。即使心中没有一个具体的目标,我也经常能找到有用的趋势或见解。我将从绘制数据中的几个变量开始。顺便说一下,所有这些工作都是用 R 语言完成的,代码链接在文章的底部!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按受害者年龄划分的碰撞次数。注意 99 岁时的峰值!

我想到了以下几点:

  • 几乎没有 15 岁以下的受害者。
  • 大多数受害者都是 20 多岁。每个年龄段的碰撞受害者数量一般在 30 岁以后会减少。
  • 峰值最多为 5 的倍数(25、30、35 等)。这表明一些年龄是估计的,官方身份(如驾驶执照)并不总是在碰撞报告中使用。
  • 99 岁似乎是一个包罗万象的水桶。实际上,99 岁以上的受害者不太可能有上面显示的那么多。

这一情节也引发了疑问:

  • 如何处理与多个受害者的碰撞?
  • 99 岁的高峰是怎么回事?

我就这些问题给数据所有者发了电子邮件,但不幸的是没有收到回复。如果我得到回应,我会添加更新。

接下来,我们按性别来看碰撞。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按性别划分的碰撞次数。“X”代表未知性别。

  • 这幅图告诉我们,如果发生了碰撞,受害者更可能是男性而不是女性。

如果我有按性别划分的司机总数,考虑到人均碰撞量,这项工作会更有趣。这将是这一数据反复出现的缺点,也将是我对这一分析的主要延伸之一。

接下来我要做的是查看数据中最低和最高的碰撞天数。我只包括两端最高和最低的 0.5%,所以我可以手动查看结果。以下是最低碰撞天数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

碰撞次数最少的日子。“每日计数”是相应一天的碰撞次数。

  • 大多数低碰撞日都在节假日前后。直觉上,这是有道理的,因为在(某些)假期开车的人可能会少一些。
  • 大多数低碰撞日发生在 2014 年初之前。我们将在这篇文章的后面看到,每月的碰撞在 2014 年后开始上升。

这里是最高的碰撞日:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

碰撞次数最多的日子。“每日计数”是相应一天的碰撞次数。

  • 大多数高碰撞日是 2015 年后的星期五。
  • 我们将在这篇文章的后面看到,星期五通常是一周中碰撞次数最多的一天。

这些结果引出了一些超出本分析范围的问题和想法。

  • 为什么只有一些节假日与低碰撞日相关联?例如,MLK 日作为低碰撞日出现了两次,但独立日从来没有。
  • 为什么像阵亡将士纪念日或劳动节这样的节日不会显示为低冲突日或高冲突日?
  • 夏令时在任何一年都不会出现任何异常值。这让我很惊讶。
  • 观察高碰撞日的天气情况会很有趣吗?

记住这些描述性的分析,我准备好解决我在这篇文章开始时提出的关键问题。第一个是关于分析碰撞随时间的变化。

🕒按时间碰撞

在这一节中,我分析了碰撞模式如何随着一天中的时间、一周中的日期和一年中的时间而变化。

首先,我绘制了 2018 年的每日碰撞。绘制从 2010 年开始的所有数据太混乱了,所以本节的许多部分我只关注 2018 年。除了碰撞日期,数据还有一个报告日期字段。这是事故实际报告给警方的日期。在大多数情况下,报告日期是碰撞日期的同一天或后一天。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 每日碰撞和碰撞报告。你能看出不同之处吗?

  • 日常碰撞和报告的碰撞有明显的差异。看看四月中旬报告的碰撞高峰…在实际碰撞中没有类似的情况!
  • 这些差异使我认为,关于冲突何时被报告或处理,可能存在管理动态。
  • 数据中的异常值没有明显的模式。

让我们看一个类似的按月汇总的图。在这个层次上,我可以包括从 2010 年到 2019 年的整个时间框架。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每月冲突和报告的冲突

  • 在月线级别,这两个量似乎比日线级别更紧密地相互跟踪。
  • 2010 - 2014 年每月的碰撞次数大致恒定,2014 - 2017 年上升,2017 - 2019 年大致恒定。请记住,本次分析使用的数据截止到 2019 年 7 月。

那么,为什么上图中每月的碰撞会上升呢?2014 - 2017 年在洛杉矶生活和开车的人数上升了吗?会不会和拼车服务的兴起有关?从这些数据中还不清楚,但这些可能是一个单独帖子的起点。

接下来,我分析一天中碰撞的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一天中不同时间的碰撞

碰撞是:

  • 从凌晨 4 点到 8 点急剧增加
  • 从上午 8 点减少到上午 9 点 30 分
  • 通常从上午 9:30 到下午 6:00
  • 从晚上 8 点到凌晨 4 点急剧下降
  • 在他们每天的最小值[最大值]凌晨 4 点[~下午 5 点]

这些结果可能反映了道路上的车辆数量。凭直觉,许多碰撞发生在晚上高峰时间。正如我之前提到的,获得每小时道路上车辆总数的测量值将允许我计算人均碰撞数。报告冲突时没有可用的每小时时间戳,所以我不能按小时绘制该字段。

下一步是通过一周中的某一天来检查碰撞。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

冲突和按星期报告的冲突

碰撞是:

  • 周日至周五增加,周四至周五急剧增加
  • 周日[周五]达到每周最低[最高]

工作周的结束是周五大量碰撞的明显假设。到目前为止我还没想出其他的!

对于报告的冲突:

  • 周日[周五]的碰撞仍然最少[最多]
  • 然而,每个工作日报告的冲突基本上是恒定的

最后,我按月绘制结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按月报告的碰撞和碰撞。在此分辨率下,这些字段是相似的。

碰撞是:

  • 通常从 4 月到 8 月保持不变
  • 一般 9 月至 2 月较低,尤其是 9 月至 12 月
  • 三月最高

因此,在较冷的月份,碰撞往往会减少。对此一个可能的解释是,在寒冷的月份里,到洛杉矶旅游的游客较少。关于 3 月份的高碰撞次数,我最初的假设是夏令时。然而,没有一个最高的碰撞日是在这一天。或许这个结果源于春假游客?

这就结束了我对碰撞时间模式的分析。以下是我对以上结果的总结。

  • 碰撞和报告的碰撞在每日水平上变化很大,但在每月水平上没有变化。
  • 2010 - 2014 年每月的碰撞次数大致恒定,2014 - 2017 年上升,2017-2019 年年中(本次分析的结束日期)大致恒定。
  • 碰撞次数在大约凌晨 4 点[~下午 5 点]最低[最高]。
  • 周日[周五]碰撞次数最低[最高]。
  • 9 月至 12 月(3 月)的碰撞次数最少[最多]。
  • 获取特定时间道路上车辆总数的信息将有助于对上述结果进行有趣且有用的人均计算。

接下来是看地理碰撞。

🌎地理上的冲突

除了纬度/经度坐标,该数据还有多个描述碰撞发生地点的字段。我将从查看这些字段开始。首先,我将通过area绘制碰撞的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由“区域”列计数的冲突

一些区域显然比其他区域有更多的碰撞。但是没有额外的信息,如大小或每area的交通密度,这个图表不能提供太多信息。

该数据还包括名为locationcross_street的字段。location是发生碰撞的主要街道,而cross_street是最近的十字路口。我将看看这些字段的 10 个最常见的值及其组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

碰撞最多的“位置”

10 条最常见的location是洛杉矶最长、交通最繁忙的道路。这 10 条街道占总碰撞数的 10%。总共有>25Klocation,所以尾巴很长。现在,我来看看cross_street字段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

碰撞最多的“cross_street”

5%的冲突没有关联的cross_street。否则,这个列表与前面的列表有很多重叠。显而易见,下一步是通过结合这两个字段来查看最常见的碰撞交点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

碰撞最多的交叉口

最常见的碰撞交叉路口(location / cross_street组合)包含许多与之前列表中相同的街道。然而,也有例外:第 2 行(坦帕大道和诺德霍夫街)的组件既不出现在最常见的location中,也不出现在cross_street中。即使是最容易发生碰撞的交叉路口也只占全部碰撞的一小部分。

现在是时候利用数据中的地理坐标,开始绘制碰撞图了。提醒一下,有少量碰撞没有有效的纬度/经度数据,因此不包括在本节中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

整个洛杉矶的 2018 碰撞。每个点都是唯一的纬度/经度坐标。

  • 点的空间分布显示了 LA 有趣的形状。
  • 蓝色[红色]点表示纬度/经度坐标,2018 年的碰撞数较低[较高]。
  • 即使在这张缩小的地图上,在山谷(地图的北部)和城市的中部和东部也可以看到高碰撞坐标。

这张地图相当混乱。为了更好地观看,我将放大一个窗口,显示洛杉矶市中心的大部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

洛杉矶选定区域的 2018 年碰撞

  • 许多中高碰撞坐标清晰可见。许多这些高碰撞点往往发生在同一条街道的不同十字路口。

之前的地图显示了整体碰撞。如果我加上一天中的时间,这个数据看起来怎么样?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 年洛杉矶选定地区最常见日间部分的碰撞

  • 该图仅包括 5+次碰撞的坐标。每一个坐标都被分配到发生大部分碰撞的那一天。日部分之间带连线的坐标被删除。
  • 大多数碰撞发生在Early Morning时没有坐标。鉴于我通过时间分析在碰撞中的发现,这是有意义的。
  • 许多坐标的大部分碰撞发生在AfternoonEvening。该结果也与“按时间划分的碰撞”部分的结果相匹配。
  • 有趣的是,有一组坐标中Late Night碰撞是常见的。

让我们看一个类似的按工作日/周末划分的地图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 年洛杉矶选定地区最常见周部分的碰撞

  • 该图仅包括 3+碰撞的坐标。每个坐标都被分配到发生大多数碰撞的星期几。周部分之间带连线的坐标被移除。
  • Weekday桶里显然有更多的日子和碰撞。
  • 这张地图标明了周末撞车事故多发的地区。将星期五的部分或全部包含在Weekend桶中也可能很有趣。

为了结束这一节,我按一年中的时间绘制碰撞图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

洛杉矶选定地区最常见季节的 2018 年碰撞

  • 该图仅包括 3+碰撞的坐标。每个坐标被分配给大多数碰撞发生的季节。季节间有联系的坐标被删除。
  • 看起来更多的碰撞发生在夏季(3-8 月)。这将与“按时间划分的碰撞”部分中的结果一致。
  • 考虑到洛杉矶没有像秋天或冬天这样明显的季节,可能有其他方式来划分这样一个地块的一年。

这些是我对“地理碰撞”部分的结论:

  • 使用locationcross_street字段,除了绘图之外,还可以确定洛杉矶最容易发生事故的坐标。
  • 最常见的碰撞日部件是AfternoonEvening
  • 工作日发生的碰撞比周末多得多。按周部分绘制碰撞图显示了周末碰撞更常见的区域。
  • 夏季发生的碰撞比冬季多。

🔮预测碰撞

最后一节讨论如何预测碰撞。我特别试着预测每月和area会发生的碰撞次数。

我先来看一个单个area的碰撞时间序列的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

区域 2(壁垒)的每月碰撞

  • area 2 的趋势通常与整体每月冲突的趋势相匹配(这是在按时间分析的冲突中)。

让我们将这个时间序列分解成趋势、季节性和剩余部分。作为题外话,我将在这篇文章中关注分析结果,而不会深究我所使用的时间序列方法的理论。然而,如果你想了解更多,网上有很多资源可以利用!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“区域”2 的趋势、季节性和剩余部分(壁垒)

  • 记住季节性曲线的形状。接下来,我将把它与每月碰撞总数的分解进行比较。
  • 趋势看起来与我们在上图中看到的相似。

让我们比较一下area 2 分解和整体每月碰撞分解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总体数据的趋势、季节性和剩余部分

  • area 2 相比,整体数据的季节性曲线看起来非常不同!这表明不同的区域可以有不同的动态。

接下来,我将查看area 2 的自相关函数(ACF)和部分自相关函数(PACF)。ACF 分析碰撞的滞后值与当前值的相关程度。PACF 显示了每个滞后解释了多少以前无法解释的差异。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ACF 和 PACF 负责“区域”2(壁垒)

  • 这些图表明area 2 碰撞值与其滞后相关。然而,在前两个滞后值之后,额外的滞后并不能解释太多无法解释的差异。
  • 因此,任何预测area 2 碰撞的模型应该包括至少 2 个滞后项。

我尝试了几种不同的模型来预测碰撞:

  • 3 个月和 6 个月移动平均线模型(MA)
  • 自回归综合移动平均线(ARIMA)
  • 先知图书馆

MA 模型平均过去的值来生成预测,是最简单的时间序列模型。ARIMA 模型可以使用过去的值、差异和以前的误差。Prophet 是一个附加预测模型,其中非线性趋势与年度和月度季节性相适应。

先知比和马的模型更新。你可以在这里找到更多信息:

[## 先知

Prophet 是一个用 R 和 Python 实现的预测程序。它速度很快,并提供完全自动化的预测…

facebook.github.io](https://facebook.github.io/prophet/)

我根据最后 12 个月(2018 年 8 月至 2019 年 7 月)的数据,使用以下指标评估每个模型:

  • 平均绝对百分比误差(MAPE):预测值和实际值之间的平均绝对百分比差
  • 偏差:预测值和实际值之间的平均百分比差异

MAPE 让我知道我的预测离实际碰撞值有多远,而偏差告诉我是否系统地高估或低估了数据。

我为每个area自动调整 ARIMA 模型。所以每一个都可以有不同的 p、d 和 q。我还测试了多个 Prophet 模型规格(并在下面显示了最佳结果)。以下是所有区域的平均模型 MAPE 和偏差结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据中所有区域的多个平均模型结果

  • 总的来说,我觉得这些成绩都不错!
  • 3 个月和 6 个月 MA 模型的表现非常相似。
  • ARIMA 模型与马模型有相似的 MAPE,但偏差更大。
  • 到目前为止,Prophet 模型的结果最差(即使在调优之后)。
  • 令我惊讶的是,MA 型号(最简单的型号)的性能最好!

让我们只看一下area 2 的模型预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“区域”2(壁垒)的模型预测与实际碰撞

  • 在前 5 个月,Prophet 模型的预测值高于其他模型。
  • 所有模型都错过了 2019 年 1 月的下降和 2019 年 4 月-2019 年 7 月的上升/下降模式。
  • 6 个月 MA 模型预测变化不大。
  • 马模型和 ARIMA 模型似乎做出了保守的预测,没有捕捉到数据的波动性。

接下来,我将查看每个型号每月的平均 MAPE。该图包括所有区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个型号的平均月 MAPE(所有地区)

  • 对于验证数据的前半部分,MA 和 ARIMA 模型的 MAPE 一起移动。

也值得看看每个模型每月的平均偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个模型的平均月偏差(所有地区)

  • 对马模式和 ARIMA 模式的偏好一起移动。
  • Prophet 模型对整个验证集有正偏差(过度预测)。

现在,我将根据area查看每个模型的平均 MAPE 和偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个“区域”每款车型的平均 MAPE

  • MAPE 的平均表现因地区而异。例如,12 区[3]的模型性能相对较好[差]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个模型每个“区域”的平均偏差

  • 平均偏差也因area而大幅变化。
  • 令人惊讶的是,大多数模型对大多数区域都有正偏差(这表明预测过度)!

接下来,我将看看每个模型的最差area/月预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • area 14 出现两次。2019 年 1 月和 2 月都出现。
  • 有趣的是,看到了所有模型都在挣扎的情况(2019 年 1 月area 2)与一个模型特别挣扎的情况(2018 年 9 月area 14)。

基于最坏的预测,我将放大到area 14。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“区域”14(太平洋)的模型预测与实际碰撞

  • area 14 的趋势与上述area 2 完全不同。
  • 2019 年 7 月除了 Prophet 以外的所有车型都错过了秒杀。

以下是我对碰撞预测部分的结论:

  • 总体月度表现还不错(MAPE < 10%,多数情况下有偏差)。
  • 然而,MA 模型具有最好的性能,这表明长期滞后数据、差分和以前的误差不会提高误差率。这令人惊讶,但表明每月的碰撞次数在一定范围内是随机的。
  • 趋势似乎因area而异。这在理论上应该由 ARIMA 和预言家方法来解决,它们符合area的独立模型。
  • 为了改进这些模型,我想深入挖掘一两个领域,并试图理解趋势。获得关于一辆area的具体交通模式的数据肯定也会有所帮助。额外的数据源(如天气)也很有希望被探索。

🏁结论

我对洛杉矶碰撞数据的分析到此结束!如果你有解决这些问题的其他方法,请随时联系我们。

您可以在下面的 GitHub 资源库中找到我使用的所有代码:

[## 杰-班萨尔/洛杉矶-碰撞分析

这份报告包含围绕洛杉矶碰撞数据分析的材料。以下是对…的描述

github.com](https://github.com/jai-bansal/los-angeles-collision-analysis)

如果你喜欢这篇文章,看看我下面的其他作品吧!

[## 如何有效使用随机种子

这篇文章是关于机器过程中通常不会引起太多注意的一个方面:随机种子。

towardsdatascience.com](/how-to-use-random-seeds-effectively-54a4cd855a79) [## 为您的组织开发技术培训的 7 个技巧

将你的下一个培训课程想法变成现实的技巧

medium.com](https://medium.com/@jai_bansal/7-tips-for-developing-technical-trainings-for-your-organization-928cf7744d44)

感谢阅读!

Python 中的标签编码器和 OneHot 编码器

原文:https://towardsdatascience.com/label-encoder-and-onehot-encoder-in-python-83d32288b592?source=collection_archive---------17-----------------------

通过示例了解标签编码器、OneHot 编码器和 Pandas 虚拟变量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

杰西卡在 Unsplash 上的

M 机器学习算法理解数字而不是文本。因此,所有“文本”列都必须转换为“数字”列,以便算法能够理解。

这是将标签或分类或 文本 值转换成数字或 数值 值的故事。简单来说,

编码是将单词转换成数字的过程

在 Python 中, OneHot 编码勒贝尔编码是将分类列编码成数值列的两种方法。而这些都是最常用的 Python 库的一部分: Scikit-Learn

但是等等,你不会想在笔记本里导入 Scikit-Learn 吧??

没问题,⚡️熊猫会来帮你的。

让我们深入这个将分类变量转换成数字变量的故事,以便 ML 算法理解它。

分类数据

任何数据集都包含多个包含数值和分类值的列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图像:分类列的数据类型

分类变量代表可以分组的数据类型。它有有限且通常固定数量的可能值,称为 类别 。性别、社会阶层、血型、国家代码等变量都是分类数据的例子。

但是,如果该数据被编码成数值,那么只有它可以在机器学习算法中被处理。

让我们考虑下面的例子,以简单的方式理解编码。

import pandas as pdcountries = ["Germany","India","UK","Egypt","Iran"]
continents = ["Europe","Asia","Europe","Africa","Asia"]
code = ["G","I","U","E","N"]
d={"country": countries, "continent":continents, "code":code}
df = pd.DataFrame(d)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片:示例数据框架

将“代码”列的数据类型从对象转换为类别

df['code'] = df.code.astype('category')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像:所有列的数据类型

通过这个例子让我们了解编码过程。

Python 中的标签编码

标签编码是一种简单直接的方法。这会将分类列中的每个值转换为数值。分类列中的每个值称为标签。

标签编码:根据字母顺序为每个标签分配一个唯一的整数

让我用上面的例子向您展示标签编码在 python 中是如何工作的,

from sklearn.preprocessing import LabelEncoderle = LabelEncoder()
df["labeled_continent"] = le.fit_transform(df["continent"])
df

**continent**中的标签将被转换成数字,并存储在新列 **labeled_continent**

输出将是,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片:Python 中的标签编码

用更简单的话来说,标签按字母顺序排列,从 0 开始给每个标签分配一个唯一的索引*。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片:了解 Python 中的标签编码

一切正常吗??干得好,⁉️

这里涉及到标签编码的问题。它使用序列中的数字来引入标签之间的比较。在上面的例子中,列**continent**中的标签没有顺序或等级。但是标签编码后,这些标签是按字母顺序排列的。由于这些数字,机器学习模型可以将这种排序解释为Europe > Asia > Africa

为了解决标签编码的排序问题,OneHot 编码应运而生。

Python 中的 OneHot 编码

在 OneHot 编码中,为列中的每个标签创建一个二进制列。这里,每个标签都被转换为一个新列或新要素,并被赋予 1(热)或 0(冷)值。

让我先给你看一个例子来理解上面的陈述,

from sklearn.preprocessing import OneHotEncoderohe = OneHotEncoder()
df3 = pd.DataFrame(ohe.fit_transform(df[["continent"]]).toarray())
df_new=pd.concat([df,df3],axis=1)
df_new

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片:Python 中的 OneHot 编码

在这个场景中,最后三列是 OneHot 编码的结果。非洲、亚洲和欧洲的标签分别被编码为 0、1、2。OneHot 编码将这些标签转换成列。因此,查看最后 3 列,我们有3 labels → 3 columns

OneHot 编码:在一行中只有一个标签是热的

在特定的行中,只有一个标签的值为 1,所有其他标签的值为 0。在将这样的编码数据集输入到机器学习模型之前,可以进行更多的转换,如 OneHot Encoding 文档中所述。

快速浏览这篇文章,了解合并两个数据帧的更多选项

[## 加入表格

了解 Python pandas 中的 merge()和 concat()

towardsdatascience.com](/join-the-tables-ab7fd4fac26b)

Python 中的 pandas.get_dummies()

OneHot 编码可以以更简单的方式实现,无需导入 Scikit-Learn。

⚡️赞成!!熊猫是你的朋友。这个简单的函数pandas.get_dummies()会将指定列中的所有标签快速转换成单独的二进制列

df2=pd.get_dummies(df[["continent"]])
df_new=pd.concat([df,df2],axis=1)
df_new

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者:熊猫虚拟变量

上述数据帧的最后 3 列与 OneHot 编码中观察到的相同。

pandas.get_dummies()为列**continent**中的每个标签生成虚拟变量。因此,非洲大陆、亚洲大陆、欧洲大陆分别是非洲、亚洲和欧洲标签的虚拟二元变量

通过我的故事,

我向您介绍了将分类变量转换为数值变量的方法。每种方法都有自己的优点和局限性,因此理解所有的方法很重要。根据您想要实现的数据集和机器学习模型,您可以在 Python 中选择上述三种标签编码方法中的任意一种。

这里有一些资源可以帮助你解决这个问题:

  1. Python 中的标签编码
  2. Python 中的 OneHot 编码
  3. 使用熊猫获取虚拟变量

喜欢我讲故事的方式吗??

这里有一个有趣的fun&learn活动供你创建自己的数据集。看一看。

[## 网页抓取—制作您自己的数据集

从网页中提取数据并将其存储到 excel 中—只需 4 个简单的步骤

towardsdatascience.com](/web-scraping-make-your-own-dataset-cc973a9f0ee5)

感谢您的宝贵时间!

我总是乐于接受建议和新的机会。请随时添加您的反馈,并通过 LinkedIn 与我联系。

标签传播去神秘化

原文:https://towardsdatascience.com/label-propagation-demystified-cd5390f27472?source=collection_archive---------4-----------------------

基于图的标签传播的简单介绍

社交媒体网络已经遍布全球,并且与日俱增。考虑一个社交媒体网络,你知道一些人的兴趣,你想预测其他人的兴趣,这样我们就可以有针对性地开展营销活动。为此,我们可以使用基于图的半监督机器学习技术,称为标签传播。在本文中,我将通过一些例子和样本代码来解释标签传播过程。

什么是标签传播?

标签传播算法(LPA) 是一种迭代算法,其中我们通过在数据集内传播标签来将标签分配给未标记的点。该算法由小金朱邹斌·格拉马尼【1】于 2002 年首次提出。LPA 属于直推学习**,因为我们想要预测已经给我们的未标记数据点的标签。**

假设我们有一个如下所示的人的网络,有两个标签类别“对板球感兴趣”和“对板球不感兴趣”。那么问题来了,我们能预测剩下的人是否对板球感兴趣吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 PixabayGordon Johnson 的原始图片。

对于 LPA 在这种情况下的工作,我们必须做一个假设;连接两个节点的边带有相似性的概念。即,如果两个人联系在一起,这意味着这两个人很可能有相同的兴趣。我们可以做出这样的假设,因为人们倾向于和其他有相似兴趣的人联系。

在图中随机行走

考虑图 1 中给出的示例图,其中我们有 2 个标签类(红色和绿色)和 4 个彩色节点(每个类 2 个)。我们想预测节点 4 的标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。样本图表 1

我们可以在图中随机行走,从节点 4 开始,直到我们遇到任何标记的节点。当我们碰到一个有标签的节点时,我们停止行走。因此,这些被标记的节点被称为吸收态**。让我们考虑从节点 4 开始的所有可能的路径。在所有可能的遍历中,下面的遍历将以绿色节点结束。**

  1. 4 → 9 → 15 → 16
  2. 4 → 9 → 13 → 14
  3. 4 → 9 → 13 → 15 → 16
  4. 4 → 9 → 15 → 13 → 14

下面的遍历将以红色节点结束。

  1. 4 → 7 → 8
  2. 4 → 7 → 6 → 5 → 1
  3. 4 → 5 → 1
  4. 4 → 5 → 6 → 7 → 8
  5. 4 → 2 → 1

基于从节点 4 开始的所有可能的随机行走,我们可以看到大多数行走都以红色节点结束。所以,我们可以把节点 4 涂成红色。这是 LPA 背后的基本直觉。

数学公式

Xₗ为被标记节点的集合,Yₗ为被标记数据的独热标签(如果不了解独热编码,可以参考这个链接)。假设有{1,…,C}类标签。Xᵤ是未标注的顶点。我们不知道Yᵤ,因此Yᵤ将包含零。

我们可以将随机游走表示如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。随机漫步

在矩阵形式中,该方程将如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图三。矩阵形式的随机游动

如果我们可以计算概率转移矩阵 T ,我们就可以计算所有未标记节点的标记概率。

如何计算概率转移矩阵?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。样本图表 2

考虑如图 4 所示的具有吸收态的样本图。对于每个节点,我们都要计算跳到其他节点的概率。当我们到达吸收状态时,行走结束,因为我们陷入吸收状态(在图中表示为自循环)。这是一个无向图,所以我们可以向任何方向移动。

假设从一个节点转移到其邻居的概率是相等的,我们可以将 T 写成如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图五。图 4 中样本图 2 的矩阵 T

从节点 1 到节点 1 的概率是 1,因为节点 1 处于吸收状态。从节点 1,我们无法到达任何其他节点。因此,从节点 1 到达其他节点的概率将是 0。同样的方法也适用于节点 2。

从节点 4,您可以转到节点 1、3 和 5。因此,从节点 4 移动到节点 1、3 和 5 是同样可能的,每个节点的概率为 0.33。类似地,从节点 5,我们可以移动到节点 4 和 6,每个节点的概率为 0.5。

注意,我们可以使用图的度矩阵(D)和邻接矩阵(A ),使用下面的等式来计算 T。

T = D⁻¹A

现在请注意,我们可以拆分矩阵 T,如图 6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图六。t 可以分成 4 块

  • Tₗₗ —从标记节点到标记节点的概率
  • Tₗᵤ —从标记节点到未标记节点的概率
  • Tᵤₗ —从未标记节点到标记节点的概率
  • Tᵤᵤ —从未标记节点到未标记节点的概率

注: Tₗₗ将是一个单位矩阵,而 Tₗᵤ将是一个零矩阵,因为我们不能从被标记的节点移出,因为它们是吸收态。

如果我们将矩阵 T 乘以 t 倍,然后将 t 送至无穷大(∞),会发生什么?你可以在 MATLAB 中输入这个矩阵,得到 T ⁰⁰.你会得到这样的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7。t 在 MATLAB 上自乘 100 次

当你将 T 提高到更大的幂时,概率将停止变化(达到饱和)并导致稳定的转移概率。您现在可以看到,只有前两列包含非零值,其余列都为零。

我们可以用数学方法描述如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7。T 乘以自身无限倍的公式

获得最终答案

最后,带标签的矩阵看起来像这样,我们可以得到带标签节点的标签向量和不带标签节点的标签向量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8。有标号和无标号节点的一键标号公式

现在让我们考虑图 4 中的示例图 2,我们希望预测未标记节点的标签。使用我们的 MATLAB 结果,我们可以得到如下标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图九。获取未标记节点的标签

对于每个未标记的节点,我们分配具有最大概率的类别标签。但是,你可以看到节点 5 有相等的概率是红色和绿色。因此,我们的最终标记图将如图 10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10。样本图的最终标记 2

示例代码

带有 LPA 简单实现的示例代码

你也可以阅读我以前的文章用 Python-igraph 可视化图形数据来学习如何用 Python 表示图形数据。

** [## 用 Python-igraph 可视化图形数据

使用 CiteSeer 数据集介绍 python-igraph 模块

towardsdatascience.com](/visualising-graph-data-with-python-igraph-b3cc81a495cf)

最后的想法

LPA 使用已标记节点的标签作为基础,并试图预测未标记节点的标签。然而,如果初始标记是错误的,这会影响标记传播过程,并且错误的标记可能被传播。为了克服这个问题,标签扩散被引入,其中我们在学习无标签节点的标签的同时也学习有标签节点的标签。这也应用了一些标签修正。你可以从周等人的文章学习本地和全球一致性中了解更多关于标签传播的信息。

希望你觉得这个解释有用。我很想听听你的想法。感谢您的阅读。

干杯!

参考

[1]朱小金和邹斌·格拉马尼。利用标签传播从有标签和无标签数据中学习。宾夕法尼亚州匹兹堡市卡内基梅隆大学计算机科学学院,技术报告。CMU CALD 2002 年 2 月 107 日。

[2]网络分析。第十七讲(第一部分)。列昂尼德·茹科夫(https://youtu.be/hmashUPJwSQ)教授的图的标号传播。**

主动学习导论

原文:https://towardsdatascience.com/label-smarter-not-more-4f5bbc3fbcf5?source=collection_archive---------63-----------------------

标签更聪明而不是更多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

像素运行 4 个 FFWPU

介绍

想象一下你的学生时代为考试而学习。你是随机阅读笔记的某一部分,还是在书的后面随机做题?不要!好吧,至少我希望你没有像对待早餐一样严格对待你的学业。你可能做的是找出哪些话题对你来说很难掌握,并在这些话题上努力工作。只对你认为你理解的想法做一些小的更新。那么我们为什么要区别对待我们的机器学生呢?

我们需要更多的数据!这是我作为一名数据科学家经常听到的响亮号召,而且大多数时候都是如此。这通常是因为一些问题没有足够的数据来获得好的结果。一个经理问你需要多少数据。你多说。他们雇佣一些实习生或者众包一些贴标机,花上几千美元,你就能获得更多的性能。增加一个步骤,让您的模型告诉您它想要了解更多的内容,这可以大大提高您的性能,而只需要很少的数据和成本。我说的是做一些,为流行词做好准备,主动学习。

在本文中,我们将运行一些与主动学习和数据选择相关的基础实验。我们将在 IMDB 情感数据集的一个小子集上训练一个随机森林。然后,我们将通过随机采样,以及通过采样模型想要了解的数据点来增加训练集。我们将比较我们在数据增长方面的性能提升,并展示智能标记如何节省时间、金钱和提高性能。该项目的代码在这里的要点中,也包括在本文的底部。让我们开始吧。

TLDR

如果您的问题需要更多数据,请尝试在分类器的帮助下进行标注。为此,要么选择置信度最低的例子,要么选择最高和第二高概率最接近的例子。这在大多数情况下有效,但不是万灵药。我见过随机抽样和这些主动学习方法做得一样好。

数据

对于这个问题,我们将查看 IMDB 情感数据集,并尝试预测一部电影评论的情感。我们将为这个数据集获取整个测试集,以及一小部分训练数据。我们将基于不同的采样策略逐渐增加训练集的大小,并观察我们的性能提升。

在训练集中有大约 34,881 个示例,而在测试集中只有 15,119 个。我们首先将数据加载到熊猫数据框中。

df = pd.read_csv("IMDB_Dataset.csv")
df["split"] = np.random.choice(["train", "test"], df.shape[0], [.7, .3])
x_train = df[df["split"] == "train"]
y_train = x_train["sentiment"]
x_test = df[df["split"] == "test"]
y_test = x_test["sentiment"]

基本模型

对于本教程,我们将看一个简单的随机森林。你可以将这些技术应用到你能想到的任何模型上。这个模型只需要告诉你它对任何给定的预测有多大的信心。因为我们正在处理文本数据,所以我们的基本模型将使用原始文本中的 TF-IDF 特性。我知道,我知道,我们应该在这里使用深度变压器模型,但这是一个关于主动学习的教程,而不是关于 SOTA 的,所以请原谅我。如果你想知道如何使用像伯特检查我的其他教程在这里

我们将我们的 RandomForest 模型定义为仅使用 unigram 特性的 SciKit-Learn 管道:

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizerclf = RandomForestClassifier(n_estimators=100, random_state=0)
model = Pipeline(
            [
                ("tfidf", TfidfVectorizer(ngram_range=(1,1))),
                ("classifier", clf),
            ]
        )

现在我们可以称之为**。fit()** 在一个文本输入列表上,管道将处理剩下的部分。让我们使用 5 个例子的初始训练集,看看我们在测试集上做得如何。

# Get five random examples for training.
rand_train_df = x_train.sample(5)
model.fit(rand_train_df["review"], rand_train_df["sentiment"])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试集上 5 个示例随机森林的初始性能。

从这里,我们可以看到数据集是相当平衡的,因为预测所有的正数给了我们几乎 0.5 的精度。这个模型是相当蹩脚的,因为它只预测积极的。让我们看看我们是否可以使用主动学习来比随机采样新点更快地获得更好的性能。

选择好的数据点进行标注

所以我们现在有了一个分类器。最多是 meh,我们需要更多的数据。让我们使用分类器对我们的其他训练数据进行预测,并查看模型对哪些点最没有信心。对于大多数 Sci-Kit 学习评估者来说,这是非常容易。我们可以使用。 predict_proba() 函数获取每个类的概率。要手动完成这项工作,您还可以查看树的单个预测,并计算每个类的投票数。不过 predict_proba 就方便多了:)。

preds = model.predict_proba(x_test["review"])

这将给我们一个概率的 numpy 数组,其中每一列是一个类,每一行是一个例子。大概是这样的:

[[.1, .9],
 [.5, .5],
 [.2, .8]...

不确定抽样

挑选好的点进行标记的最简单的“智能”策略是使用模型最没有信心的点。在上面的例子中,这是第二点,因为任何类别的最大概率都是最小的。

def uncertainty_sampling(df, preds, n):
    """samples points for which we are least confident"""
    df["preds"] = np.max(preds, axis=1)
    return df.sort_values("preds").head(n).drop("preds", axis=1)

这里我们有一个函数,它接受训练示例的数据帧、相关的预测概率以及我们想要采样的点数。然后,它获取每行中的最大值,将数据点从最小到最大排序,并获取具有最小最大概率的n个示例。

如果我们将不确定性采样应用于上面的三个示例概率,我们会说我们应该首先标记[.5,. 5],因为最大概率小于所有其他最大概率。(. 8 和. 9)哪个直观上讲得通!

边际抽样

不确定性采样很好,但在多类设置中,它不能很好地捕捉不确定性。如果你有以下预测会怎样?

[[.01, .45, .46],
 [.28, .28, .44],
 [0.2, 0.0, .80]...

该模型似乎最不确定的数据点是第一个,因为它仅预测了 0.01 的类别 3!但是不确定性采样会说,示例 2 是标记的最佳点,因为 0.44 是最小的最大概率。他们都是很好的候选人,但第一个直觉上更有意义。边际抽样迎合了这种直觉;最好标记的点是那些预测之间具有最小差值的点。我们可以使用以下函数来执行边缘采样:

def margin_sampling(df, preds, n):
    """Samples points with greatest difference between most and second most probably classes"""
    # Sort the predictions in increasing order
    sorted_preds = np.sort(preds, axis=1)

    # Subtract the second highest prediction from the highest 
    # We need to check if the classifier has more than one class
    if sorted_preds.shape[1] == 1:
        return df.sample(n)
    else:
        df["margin"] = sorted_preds[:, -1] - sorted_preds[:, -2]
        return df.sort_values("margin").head(n).drop("margin", axis=1)

在这段代码中,我们对预测的概率进行排序。然后我们检查数组是否有多个维度。如果它只有一个概率,那么它只看到了一个类,而没有关于其他类存在的信息。在这种情况下,我们只需要随机抽样。否则,我们通过从最高概率中减去第二高的概率并对结果进行排序来找到余量。

实验

我进行了一个简单的实验,从五个随机采样点开始,然后应用每个采样策略再获得五个点。我重复这样做 100 次,直到我采样了大约 500 个点。我在每个时间点绘制测试集上的 f1 分数,并查看我们的性能如何随着每个采样策略而提高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以看到,对于这个问题,边际抽样和不确定抽样都比随机抽样做得好。在二进制分类的情况下,它们是相同的。当我开始写这篇文章时,我没有想到这一点😅。我创建了一个叫做combined的额外抽样策略,它做了一点边际抽样、一点不确定性抽样和一点随机抽样。对于我的许多项目,我喜欢这种结合的方法,因为有时随机抽样确实有帮助。如果我们总是根据边际或不确定性进行采样,我们就不能从我们的数据集中均匀地采样,并且可能会错过一些重要的信息。有趣的是,我发现抽样中的一点随机通常会有回报。虽然不相信我,因为我还没有运行任何好的实验来证明这一点😅。

结论

主动学习可以通过选择向模型添加最多信息的新点,帮助您用更少的数据获得更好的性能。这种策略在大多数时候都很有效,但并不保证会做得更好。当您考虑标注一些附加数据时,这是一个很好的工具。

密码

用 Jupyter 笔记本电脑标记图像的有效方法

原文:https://towardsdatascience.com/label-your-images-easily-using-this-jupyter-notebook-code-4102037b7821?source=collection_archive---------17-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由马库斯·斯皮斯克Unsplash 拍摄

你可能会遇到这样的情况,你需要为你的图片添加标签。或者你已经做了。一种标记方法是手动查看每张图像,并将其标签写在文件中,这是一个痛苦的过程。

在这篇博文中,我将分享你如何让这个过程变得简单快捷。仅仅通过在 Jupyter 笔记本上写几行代码。先看演示吧。

演示

我的Image目录里有一些的图片。我想给猫贴上0的标签,给狗贴上1的标签。我只需要通过传递图像目录来调用一个函数。我可以用互动的方式给我的图片贴标签,比如 following。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标记图像

一旦您标记了所有图像,一个标记csv 文件被创建并保存在您的计算机中,该文件包含所有图像名称和相应的标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是create_labels()函数的实现,它完成了上面显示的所有工作。

我将继续创造和发布更多这样的工具,让日常的 ML 任务变得简单。以下是该项目的 Git-Hub 链接。

[## 希瓦维尔玛/Easy-ML

让 ML 任务变得简单而轻松的工具。为 shivaverma/Easy-ML 开发贡献一份力量

github.com](https://github.com/shivaverma/Easy-ML)

用熊猫标注数据

原文:https://towardsdatascience.com/labeling-data-with-pandas-9e573ce59c42?source=collection_archive---------9-----------------------

熊猫数据标签简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

数据标注是将信息标签分配给数据子集的过程。有许多标记数据集的例子。包含癌性和健康肺的 x 射线图像以及它们各自的标签的数据是标记数据的一个例子。另一个例子是消费者信用数据,它指定消费者是否拖欠贷款。在获得标记的数据集后,机器学习模型可以在标记的数据上训练,并用于预测新的未标记的例子。拥有良好的标记数据对于构建高性能机器学习模型至关重要。在本帖中,我们将讨论使用 python 熊猫库生成有意义标签的过程。

我们开始吧!

我们将考虑标记数字数据的任务。出于我们的目的,我们将使用红酒质量数据集,它可以在这里找到。

首先,让我们将数据读入熊猫数据框:

import pandas as pd
df_wine = pd.read_csv("winequality-red.csv")

接下来,让我们使用。“head()”方法。

print(df_wine.head())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该数据对应于质量分数在 0 到 10 之间的葡萄酒。让我们看看数据中的值:

print("Quality values: ", set(df_wine['quality']))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我们对另一个分类问题感兴趣,而不是对葡萄酒质量进行分类。让我们考虑一下对一种酒的酒精含量是否在 10%以上进行分类的问题。让我们来看看酒精百分比的最小值和最大值:

print("Max Alcohol %: ", df_wine['alcohol'].max())
print("Min Alcohol %: ", df_wine['alcohol'].min())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们也画出分布图:

import matplotlib.pyplot as plt
plt.title("Distribution in Alcohol %")
df_wine['alcohol'].hist()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果酒精百分比高于或等于 10%,我们将用“1”标记数据,否则用“0”标记数据:

import numpy as np
df_wine['alcohol_class'] = np.where(df_wine['alcohol']>=10.0, '1', '0')

我们现在可以用二进制标签来可视化分布:

from collections import Counter
plt.title("Distribution in Alcohol Class Labels")
plt.bar(dict(Counter(df_wine['alcohol_class'])).keys(), dict(Counter(df_wine['alcohol_class'])).values())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该数据被适当地标记用于训练二元分类模型。现在让我们考虑二进制分类以外的问题。如果我们看一下“固定酸度”的最小值和最大值,我们会发现这些值的范围比酒精%的范围更宽:

print("Max fixed acidity %: ", df_wine['fixed acidity'].max())
print("Min fixed acidity %: ", df_wine['fixed acidity'].min())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用熊猫的。loc[]'方法将三元标签分配给数据,这将把数据分成三组。标签“0”将被分配给值(4–7),“1”将被分配给值(7–9),“2”将被分配给值(9–16):

df_wine.loc[(df_wine['fixed acidity']>4.0) & (df_wine['fixed acidity']<=7.0), 'acidity_class'] = 0
df_wine.loc[(df_wine['fixed acidity']>7.0) & (df_wine['fixed acidity']<=9.0), 'acidity_class'] = 1
df_wine.loc[(df_wine['fixed acidity']>9.0) & (df_wine['fixed acidity']<=16.0), 'acidity_class'] = 2

我们现在可以直观地看到三元标签中的分布:

plt.title("Distribution in Alcohol Class Labels")
plt.bar(dict(Counter(df_wine['acidity_class'])).keys(), dict(Counter(df_wine['acidity_class'])).values())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据现在被适当地标记,用于训练三元分类模型。这可以很容易地扩展到四进制、五进制等。我就讲到这里,但是我鼓励你自己动手处理数据和编写代码。

结论

总之,在这篇文章中,我们讨论了如何使用熊猫来标注数据。首先,我们考虑了为葡萄酒数据分配二进制标签的任务,该标签指示葡萄酒的酒精含量是否高于 10%。然后,我们看了看指定三元标签,表明葡萄酒中固定酸度的水平。我希望你觉得这篇文章有用/有趣。这篇文章的代码可以在 GitHub 上找到。感谢您的阅读!

用 Python 标记时间序列数据

原文:https://towardsdatascience.com/labelling-time-series-data-in-python-af62325e8f60?source=collection_archive---------28-----------------------

用于监督机器学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:Freepik

最近,我在进行一个研究项目,我必须标记 112,000 行时间序列数据,这样我就可以在监督机器学习中使用它。我需要数据中的行在事件发生时显示“1 ”,在事件没有发生时显示“0”。但是标签的信息被嵌入了 3 个小时的录音。

本质上我必须去…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者创建的图像

本文解释了我为此创建的过程和代码。

简而言之,步骤如下:

  1. 将您的数据加载到脚本 ( 时间序列数据 & 事件标记)
  2. 将事件的起止时间分解为一列秒/十分之一秒
  3. 将列表转换成一列 1 和 0
  4. 将 1 和 0 列写入数据文件的“标签”列

您需要的所有代码都在本文中。您在脚本开始时输入了三个变量。之后,你只需点击运行,带标签的数据文件就会神奇地出现在你的目录中,随时可以用于 SVM、逻辑回归或你正在使用的任何机器学习算法。

注意:假设您已经以适合您的数据类型的方式预处理了您的时间序列数据,并且它与事件标记数据时间同步。

步骤 0:数据准备

开始之前,检查您的数据是否为脚本正确格式化。该脚本使用 2 个文件;您的时间序列数据和您的事件标记。每一个都有一个假设:

  1. 时间序列数据: 时间序列数据是事件发生时你所做的测量(例如,在 20 分钟的说话时间内所做的神经读数测量)。假设:您的时间列是 csv 文件的第一列(col[0])。
  2. **事件标记数据:**事件标记是显示事件发生和未发生的持续时间。(例如,如果您正在使用神经数据来测量一个人说话时大脑活动的变化,则事件将在这个人说话时发生)。假设:你的事件标记是这样的开始和结束时间形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如,这可以是显示该人每次开始说话和何时停止说话的几个事件。(图片由作者创作)。

注意:如果您的事件数据已经在您的首选采样率的一列中,您只需执行步骤 1、3 和 4。

提示:如果你用音频记录了你的活动,并把它们保存在. mp3 或。wav 文件,我建议使用 Audacity 软件。它可爱又免费,允许你在音频记录上标记事件,并且导出事件标记,就像上面显示的那样。

1。将您的数据载入脚本

现在,您可以加载(1)您的时间序列数据 , (2)您的事件标记数据,( 3)您的时间序列数据的采样率(即您是否以十秒、秒等为单位进行记录)。下面的代码块是唯一需要编辑的代码部分。

import pandas as pd
import numpy as np*# YOUR DATA FILE & NAME* data_file_name = 'data_time_series.csv' data = pd.read_csv(data_file_name, encoding='utf-8', skiprows=0)

*# YOUR EVENT MARKINGS FILE* events = pd.read_csv("event_durations.csv", encoding='utf-8', skiprows=1)

*# YOUR SAMPLE RATE (ie seconds, deciseconds)* sample_rate = 0.1  *#Deci-seconds*

从这一点开始,剩下的代码就可以运行了——不需要进一步的编辑。完成后,带标签的文件将出现在您的工作目录中。

2。将开始-结束时间分成一列秒/十分之一秒

该函数仅从您的事件标记数据帧中提取持续时间,并将其转换为一列秒/十分之一秒(取决于您在步骤 1 中输入的采样率)。

**def addRange (events):**
    global events_split events_split = pd.DataFrame()
    events = np.array(events)
    row = 0
    for _row in events:
        x = round(events[row,0],1) *# Start time* y = round(events[row,1],1) *# End time* events_split = events_split.append(pd.DataFrame([x]))
        while x < y:
            x = round((x + sample_rate),1)
            events_split = events_split.append(pd.DataFrame([x]))
        row = row + 1
    return events_splitaddRange(events)

接下来,我们将使用该函数的输出来创建一列标签。

3。将该列表转换为一列 1 和 0

对于这个函数,我们需要首先创建一个包含您的时间序列数据的“time”列的 iterable 变量:

data_time_col = pd.DataFrame([data.iloc[:,0]])
data_time_col = data_time_col.T

然后,下面的函数使用这个变量,以及新分解的事件标记数据,创建一列 1 和 0,与您的时间序列数据上的行完全匹配。

**def createLabels(data_time_col):**
    global labels_01_df
    labels_01_df = pd.DataFrame() for i in data_time_col.values:
        if i in events_split.values:
            labels_01_df = labels_01_df.append([1], ignore_index=True)
        else:
            labels_01_df = labels_01_df.append([0], ignore_index=True)
    return labels_01_df

createLabels(data_time_col)

4。将 1 和 0 列写入数据文件的“标签”列

最后,我们需要将您的 0 和 1 列表插入到您的时间序列数据帧中,并将其导出到 csv。(新列将插入到索引[0]中,并推动其他列)。带有标签的新文件将出现在您的目录中,与原始文件同名,但末尾带有“标签”。

data.insert(loc=0, column="labels", value=labels_01_df)
data.to_csv(data_file_name + " - LABELLED.csv", index=False)

瞧,你的文件已经准备好了,可以用于 scikit-learn 或你选择的 ML 库:)

完整的脚本可以在我的 GitHub 页面上找到。

希望那有用!如果你有任何问题,请直接在 LinkedIn 上给我发消息。也可以邮箱 订阅我的帖子 这里

最后,如果你想进一步支持 Medium 上的作者,你可以在这里注册成为会员。

劳动生产率和其他冒险

原文:https://towardsdatascience.com/labor-productivity-and-other-adventures-67212d1d199b?source=collection_archive---------37-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伯明翰博物馆信托基金会在 Unsplash 上拍摄的照片

劳动生产率被认为是衡量一个国家福祉的最重要指标之一。不过,我们对它了解的并不多,让我们试着弄清楚它是如何计算的,世界上的事情是如何与它*(数据来源:* 总经济数据库 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稍后我们会找到答案。

劳动生产率客观地反映了一个经济体的健康程度,它基于两个指标:该国的人均 GDP 和就业人口比例。同样的公式可以用另一种方式来写:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*注:本文使用国内生产总值数据(购买力平价)。数据来源总体经济数据库

我们来修正一下什么是 GDP 和人均 GDP。GDP 是国内生产总值,代表一个国家生产的所有最终商品和服务的总市场价值。人均 GDP 表示一个人平均生产多少国内生产总值(GDP /人口)。这两项指标每年都进行测量,并以同一种货币——美元——进行比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图表显示,高 GDP 并不意味着人均 GDP 也会高。例如,中国的国内生产总值排名第一,生产的商品和服务数量世界第一。但无论是人均 GDP 还是劳动生产率都没有进入前 10 名,它们分别排在第 61 位和第 78 位,与哥伦比亚和巴西处于同一水平(顺便提一下,这两个国家也是 GDP 排名前 10 的国家):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么会出现这种不匹配?首先,中国是人口最多的国家。当按每 14 亿人分配 250 亿 GDP 时,该值比大多数国家低几倍。其次,人们在那里工作很多-2019 年就业人口的比例为 55.6%,高于平均水平 10-12%。第三,中国有廉价或低技术含量的产品。

该国劳动生产率高的 3 个原因:

  1. 最终产品成本低,但生产量大+就业率低。这些条件适用于生产廉价石油的阿拉伯国家,并且不需要花费大量的精力和时间。
  2. 高人均国内生产总值+高或平均百分比的就业人口。这是美国和大多数西欧国家的典型模式——所有劳动适龄人口都工作并生产高价值产品。卡塔尔出人意料地成为这个群体的一员。它的高劳动生产率不是像其他产油国那样由低比例的就业人口保证的,而是由更高的成品成本和大量的生产保证的。
  3. 高人均 GDP 低就业率。这种情况很少见,但这是未来的趋势——有一小部分就业人口生产昂贵的产品。

俄罗斯

我们已经考察了主要经济指标中的领先者。现在我们会在这些评级中发现俄罗斯。就国内生产总值而言,俄罗斯领先于许多国家——新闻和经济书籍告诉我们这一点。事实上,在 2019 年,俄罗斯在世界 GDP 排名(PPP)中排名第 6。但并没有成为劳动生产率的领先者。

我们再来测试一下你的直觉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在一个仪表板上收集了所有最重要的宏观经济指标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仪表板显示什么?自 20 世纪 60 年代初以来,俄罗斯的劳动生产率(RSFSR)主要是积极的。苏联解体后,俄罗斯和独联体国家的生产率指数大幅下降,直到 2005 年才恢复到 1989 年的水平。劳动生产率的积极动态被 2008 年的危机所拖累,但在 2010 年开始再次增长,并在 2019 年达到最大值(人均 5.99 万美元)。

俄罗斯的劳动生产率随着 GDP 的变化而变化。当图线与柱顶不重合时,第二个因素(就业人数)会产生影响:图下方的柱顶表示就业人数百分比下降,图上方的柱顶表示工作人口百分比上升。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

俄罗斯和世界

俄罗斯的劳动生产率从未在世界上处于领先地位。在苏联时期,它上升到了收视率的最高位置。历年最好成绩是 1968 年的第 32 名,最差成绩是 1997 年和 1998 年的第 61 名。之后俄罗斯一直没有升到评级 48 线以上。2019 年,俄罗斯排名世界第 55 位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在世界平均指数和 GDP 领先的前 25 个国家的平均水平的背景下,观察俄罗斯劳动生产率的动态也很有趣。俄罗斯从未在后一项指标上表现出色。

现在是一些积极的时刻。自 1982 年以来,俄罗斯的劳动生产率超过了世界平均水平。苏联解体后,直到 2006 年,它再次低于平均指标,但在 2007 年赶上了平均指标,不再低于平均指标,并趋于赶上 GDP 领先国家。即使是 2008 年的危机也没有打破这一积极趋势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们来总结一下

劳动生产率是衡量一个国家福祉的一个重要而有趣的指标。观察它的动态就像观察 GDP 的动态一样令人着迷。

评分第一是一个相对的概念。你总是可以选择一个让图表看起来更积极的尺度。在我们的分析课程中,您可以学习如何避免数据操纵,并使数据清晰可见。欢迎给我写信,我们会讨论你所有的问题。

LaBSE:由 Google AI 嵌入语言不可知的 BERT 句子

原文:https://towardsdatascience.com/labse-language-agnostic-bert-sentence-embedding-by-google-ai-531f677d775f?source=collection_archive---------16-----------------------

谷歌人工智能如何将多语言句子嵌入的限制推向 109 种语言

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过谷歌人工智能博客的多语言嵌入空间

多语言嵌入模型是将多种语言的文本映射到共享向量空间(或嵌入空间)的模型。这意味着,在这个嵌入空间中,相关或相似的词将位于彼此更近的,而不相关的词将位于彼此更远的(参见上图)。

在这篇文章中,我们将讨论冯等人最近在 T18 提出的LaBSE:Language-AgnosticBERTSentenceEmbed ing。艾尔。这是句子嵌入的最新技术。

现有方法

现有的方法大多涉及在大量并行数据上训练模型。型号如 激光: L 语言-AgnosticSEtenceRpresentationsm-USE: M 多语言 U 通用 S entence E 编码器它们在多种语言中表现得相当好。然而,它们的表现不如专用的双语建模方法,如翻译排名(我们即将讨论)。此外,由于有限的训练数据(尤其是低资源语言)和有限的模型容量,这些模型不再支持更多的语言

NLP 的最新进展表明,在掩蔽语言建模(MLM)或类似的预训练目标上训练语言模型,然后在下游任务上对其进行微调。像 XLM 这样的模型是对 MLM 目标的扩展,但是是在跨语言环境下。这些对下游任务很有效,但是由于缺少句子级目标而产生了糟糕的句子级嵌入

相反,与其他下游任务类似,从 MLMs 产生的句子嵌入必须通过微调来学习。

LaBSE 论文

语言无关的 BERT 句子嵌入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

双向双编码器,带附加余量 Softmax 和通过 LaBSE 纸共享的参数

所提出的架构是基于一个双向双编码器 (郭等。艾尔。 )与加性边距 Softmax ( )杨等人 ) 与改进。在接下来的几个小节中,我们将深入解读该模型:

翻译排名任务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过谷歌人工智能博客的翻译排名任务

先事后人,郭等人。艾尔。使用翻译排序任务,本质上按照与源的兼容性对所有目标句子进行排序。这通常不是“所有”的句子,而是一些“ K - 1 ”的句子。目标是最大化源句子与其真实翻译之间的兼容性最小化与其他 ( 负采样)。

双向双编码器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

双编码器架构经郭等人。艾尔。

双编码器架构本质上使用并行编码器对两个序列进行编码,然后使用点积获得两种编码之间的兼容性得分郭等人的模特。艾尔。基本上是在一个平行语料库上训练的,用于上一节讨论的翻译分级任务。

就“双向”而言;它基本上在两个“方向”上获取兼容性得分,即从源到目标以及从目标到源。例如,如果从源 x 到目标 y 的兼容性由***【y _ I)表示,则分数【ɸ(y_i,x_i)** 也被考虑在内,并且各个损失被求和。*

损耗= L+L′

最大附加利润(AMS)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嵌入空间有无加性余量 Softmax 经杨等

在向量空间中,分类边界可能非常窄,因此很难分离向量。AMS 建议在原 softmax loss 中引入一个参数 m 来增加向量之间的可分性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AMS via LaBSE 论文

请注意参数 m 是如何从正样本中减去的,而不是负责分类边界的负样本。

如果你有兴趣更好地了解 AMS,你可以参考这个博客。

交叉加速器负采样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 LaBSE 纸进行交叉加速器负采样

翻译分级任务建议对“”K-1*”和源句子的潜在不兼容翻译的其他句子使用负采样。这通常是通过从该批的其他人那里获取句子来完成的。这种批内负采样如上图所示()。然而,LaBSE 利用 BERT 作为其编码器网络。对于像这样的大型网络,批量大到足以为训练提供足够的负样本是不可行的。因此,提出的方法利用分布式训练方法在不同的加速器(GPU)之间共享批处理,并在最后广播它们。这里,所有的共享批次都被认为是负样本,只有本地批次中的句子被认为是正样本。如上图所示()。*

预训练和参数共享

最后,如前所述,建议的架构使用 BERT 编码器,并在掩蔽语言模型(MLM)上进行预训练,如 Devlin 等人所述。艾尔。和翻译语言模型(TLM)目标如在 XLM(康诺和兰普尔)。此外,这些是使用 3 阶段渐进堆叠算法训练的,即首先针对 L / 4 层,然后针对 L / 2 层,最后针对 L 层,训练L/2层。

更多关于 BERT 前期训练的内容,你可以参考我的博客

把所有的放在一起

LaBSE,

  1. 将所有现有方法(即预训练和微调策略)与双向双编码器翻译排序模型相结合。
  2. 是一个庞大的模型,支持 109 种语言。

结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过谷歌人工智能博客Tatoeba 数据集上的平均准确率(%)

LaBSE 在所有语言上的平均准确率达到 83.7%,明显优于其竞争对手。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过谷歌人工智能博客进行零拍设置

LaBSE 还能够在没有训练数据的语言上产生不错的结果(零命中率)。

有趣的事实:该模型使用 500k 的词汇量来支持 109 种语言,并为甚至零命中率的情况提供跨语言支持。

结论

我们讨论了语言不可知的 BERT 句子嵌入模型,以及如何结合预训练方法来获得最先进的句子嵌入。

该模型在 TFHub 这里开源。

参考

*LaBSE 论文:【https://arxiv.org/abs/2007.01852 *

带 AMS 的双编码器:https://www.ijcai.org/Proceedings/2019/746

双编码器和翻译排名任务:https://www.aclweb.org/anthology/W18-6317/

https://arxiv.org/abs/1901.07291XLM 纸

* [## 伯特:语言理解变形金刚的前期训练

了解基于变压器的自监督架构

medium.com](https://medium.com/swlh/bert-pre-training-of-transformers-for-language-understanding-5214fba4a9af) [## 附加边际软最大损失(AM-Softmax)

了解 L-Softmax、A-Softmax 和 AM-Softmax

towardsdatascience.com](/additive-margin-softmax-loss-am-softmax-912e11ce1c6b)*

女士品茶:贝叶斯方法

原文:https://towardsdatascience.com/lady-tasting-tea-a-bayesian-approach-1b0b94ca1530?source=collection_archive---------38-----------------------

假设检验的贝叶斯方法和频率方法的介绍和比较

一位女士声称,她可以通过品尝来发现一杯奶茶是先加茶还是先加牛奶。我们如何评价她的主张?通过解决这个被称为女士品茶问题的问题,罗纳德·费雪先生首次引入了假设检验p 值的概念。

在本文中,我重温了 Fisher 的解决方案(即频率主义方法),使用贝叶斯方法解决女士品茶的问题,并比较他们的结果。

问题的正式陈述

给一杯奶茶,我们假设这位女士会以概率 p 猜出正确答案(即先加茶还是先加奶)。如果她随机猜测,我们预计 p 等于 0.5——也就是所谓的机会水平。如果她有某种神奇的技能,那么我们期望找到大于 0.5 的概率。

因此,要决定她是否说谎,我们应该测试是否 p=0.5 (称为零假设,通常用 H₀M₀p > 0.5 (称为替代假设,用 H₁M₁ 表示)。为此,我们请她品尝了 N 杯奶茶,并告诉我们她的猜测。我们用 n 表示她猜对的次数。

现在的问题是:我们如何利用这些信息(即 nN )来决定她是否说谎?

常客方法

检验零假设的 frequentist 方法基于 p 值的计算。对于这位女士品茶的例子,p 值是假设这位女士在她的能力上撒了谎,在 N 个杯子中有超过或等于 n 个正确猜测的概率。如果这种概率非常小,那么很难相信她能做出这么多正确的选择仅仅是因为纯粹的偶然。因此,对于 p 值非常小的情况,我们将拒绝零假设。

因此,p 值有多小将是接受女士主张的标准(即替代假设, M₁ )。拒绝零假设有一些传统的阈值。下表提供了总结。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 1。接受替代假设的阈值

现在的问题是:我们应该如何计算 p 值?

精确 p 值

对于一个任意的 p ,在 N 次猜测中有 m 次正确猜测的概率是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定零假设,我们有 p=0.5 ,因此,我们可以计算 p 值为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

近似 p 值

随着 N 增加,根据中心极限定理 ⁴.,具有 m 个正确猜测的分布收敛到具有均值 Np 和方差 Np(1-p) — 的高斯分布然后,p 值可以近似为 by⁵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中第二项是值为 n 的高斯分布的累积密度函数(cdf),平均值为 N/2 ,方差为 N/4

贝叶斯方法

从贝叶斯的角度来看,无效假设和替代假设可以分别看作是两个不同的模型 M₀M₁ ,它们都是生成数据的候选对象。那么,贝叶斯假设检验就相当于贝叶斯模型选择:哪个模型更好地解释数据?

贝叶斯模型选择的思想是在给定观察数据的情况下计算每个模型的后验概率,例如在我们的设置中的 P(M₀|n) 。奇后验比定义为两个后验概率的比值,如下所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中右边第一项称为奇数先验比,第二项称为 【贝叶斯因子】 ⁶ **。**如果两个模型之间没有先验偏好(即,当我们在模型上有一致的先验时),奇数后验比等于贝叶斯因子。

贝叶斯因子是贝叶斯假设检验和 selection⁷.模型中的核心概念贝叶斯因子的高值告诉我们,在给定观察值的情况下,替代模型比零模型更有可能。因此,贝叶斯因子有多大将是接受这位女士的说法的标准(即替代假设, M₁ )。类似于 p 值的情况,有一些传统的阈值用于拒绝零假设,总结在表 1 中。

现在的问题是:我们应该如何计算贝叶斯因子?

什么是 M₀和 M₁?

对于女士品茶的问题,每个模型都可以通过单次正确猜测的概率的先验分布来表征。零模型的特征是直接的,没有任何模糊: p 等于 0.5——先验是 0.5 处的δ分布。因此,条件概率 P(n|M₀) 可以使用上一节提到的公式轻松计算。

然而,替代车型 M₁ 的特性并不简单。我们知道先验分布必须使其整个质量在 p > 0.5 上,但是我们需要精确地指定先验的形式——这对于 P(n|M₁) 的计算是必要的。那么,什么是好的先验选择呢?

先验选择的精确贝叶斯因子

一个非常简单但直观的先验选择是在*【0.5,1】*的区间上均匀分布。使用此先验,对数贝叶斯因子可以计算为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们用数值计算积分。

使用 BIC 的贝叶斯因子的先验独立近似

可以证明 that⁸,如果先验分布在参数 p 的最大似然(ML)估计的邻域内非零,那么随着 N 的增加,对数条件概率 log(*p(n|m₁)*可以通过(常数 times⁹) 贝叶斯信息准则 (BIC)来估计。令人惊讶但真实的是,随着 N 的增加,先验的影响消失了。因此,对于较大的 N ,贝叶斯因子可以近似为(无论何时 n > N/2 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

nN/2 时,我们有 logBF( n )≈-log(N)/2,但它可能不再是一个精确的近似值,因为 p 的 ML 估计超出了先验的支持——小于 0.5

对比:我们什么时候相信这位女士?

对于 Nn 的不同选择,我们计算了精确和近似的 p 值和贝叶斯因子。然后,对于每个显著性水平,根据表 1,我们计算正确猜测的临界比率(即 n/N ) ,超过该比率我们拒绝零假设。图 1 示出了“临界”、“中等”、“强”和“非常强”4 种不同水平的界限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。对于每个 N,显示了表 1 中提到的不同显著性水平的拒绝零假设的比率决策阈值。绿线对应于贝叶斯方法,紫线对应于频率主义方法。虚线是近似版本,实线是精确版本。

这里有一些有趣的信息:

  1. 贝叶斯和频率主义方法有非常相似的拒绝零假设的标准,而贝叶斯方法更保守一些。
  2. 随着 N 的增加,近似值变得更好,同时即使对于 N 的小值,它们也相当精确。
  3. N 小于大约 8 或 9 时,我们无法做出任何陈述,我们需要至少 17 到 19 个样本才能做出非常有力的陈述。
  4. 正如所料,随着 N 的增加,我们能够检测到相对于 p=0.5 的更小偏差。

与 frequentist 方法相反,用于假设检验的 Bayesian 方法也可以做出关于接受零假设的声明。逻辑是一样的,我们只需要看负的对数贝叶斯因子。可以找到一组相似的正确猜测的临界比率,在该比率以下,我们将接受零假设(女士说谎)。边界如图 2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。对于每个 N,对于表 1 中提到的不同显著性水平,显示了接受零假设的比率决定阈值。虚线是近似版本,实线是精确版本。

结果可以概括为三点:

  1. 近似版本和精确版本不再那么接近,原因是 p 的最大似然估计小于 0.5。
  2. 即使样本少于 5 个,我们也可以接受零假设。
  3. 少于 20 个样本不可能做出任何强有力的陈述,少于(至少!)60 个样本!

结论

我们从贝叶斯和频率论的角度研究了假设检验,以女性品茶为例。三个一般性结论是:

  1. 这些方法的决策界限非常相似。
  2. 正态分布和 BIC 的近似值相当准确,只要它们的假设得到满足。
  3. 贝叶斯假设检验在拒绝零假设方面稍微保守一些,但是它使得陈述也接受零假设是可行的。

承认

我非常感谢 Navid Ardeshir 、Kian Kalhor、Mohammad Tinati 和 Parnian Kassraie 在过去几年中就相关主题进行了许多有益且有趣的讨论。

代码:

分析的代码(用 Julia 语言编写)可以在这里找到。

脚注:

请参阅 A. C. Davison 的《统计模型》第七章或 l .乏色曼的《所有统计学》第十章,从频率主义者的角度进一步研究假设检验。

值得一提的是,frequentist 的假设检验方法的目的只是拒绝零假设,它不能对接受零假设做出任何声明。

该表由 B. Efron 和 T. Hastie 的“计算机时代统计推断”和 L. Held 和 M. Ott 的“关于 p 值和 Bayes 因子”的信息组合而成。

m 可以看作是概率为 1 的 N 伯努利随机变量求和的输出。因此,对于大的 N ,其分布收敛于高斯分布。

⁵:这相当于在这些 N 试验中使用单样本 t 检验。

⁶好奇的读者可以思考一下奈曼-皮尔逊引理中贝叶斯因子和似然比之间的关系。

⁷看到 A. Neath 和 J. Cavanaugh 的惊人文章“贝叶斯信息标准:背景、推导和应用”和 B. Efron 和 T. Hastie 的“计算机时代统计推断”的第 13 章,以获得进一步的研究。

⁸对贝叶斯模型选择的介绍见 B. Efron 和 T. Hastie 的“计算机时代统计推断”第 13 章,t 检验和回归检验的贝叶斯替代方法见 Rouder 等人(2009)Rouder 等人(2012)

⁹常数取决于 BIC 的定义。如果我们取“计算机时代统计推断”中提到的定义,常数为 1,但如果我们取维基百科中的定义,我们需要常数为 -0.5

附录!

几周前我发现了这首歌。这是非常可爱和有趣的,而深深的黑暗和悲伤。我真的很喜欢它,所以我决定利用它的封面显示两位女士喝茶(咖啡?)并将其链接放在本文末尾!

莱拉:Ekho 集体的想法

原文:https://towardsdatascience.com/laila-ekho-collectives-thoughts-c83a95b554a0?source=collection_archive---------66-----------------------

Ekho 集体:超越系列的歌剧

我们如何创造我们的视听沉浸式体验,让游客与人工智能互动

在我之前关于我们项目的博文中,我研究了我们在 T2 的 Ekho 集体在新冠肺炎期间如何改变建造我们的沉浸式装置 Laila 的过程。现在我们的项目已经接近尾声,2020 年 8 月在赫尔辛基的门票已经开始发售。在这里,我收集了我们集体成员对建设莱拉过程的想法。

莱拉的机器人(人工智能代理)蜂拥在游客周围。解释如下!

尤纳斯·尼斯宁

Joonas Nissinen 是我们的创意技术专家,拥有计算机图形和人工智能背景。他认为莱拉是一个数字世界,它平衡了人类可以理解的戏剧弧线和程序生成技术:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尤纳斯·尼斯宁,我们的创意技术专家

当创造一个歌剧体验时,我们需要有一个传统的情节和叙事。通过在莱拉使用人工智能,我们给了技术自己的机构。引入代理意味着不能保证直截了当的叙述。目前,我们正致力于平衡一个混乱的系统,它有自己的意愿以某种特定的方式运行,并编排该系统的部分以适应我们的叙述。这很难。

我们在 Laila 中以 boids 的形式使用人工智能,boids 是一种计算代理,可以根据一组简单的规则做出决定。Boids(又名鸟形生物)是仿生的。它们表现出群集行为,这在自然界中以鱼群、蚁群,当然还有鸟类群集的形式存在。在莱拉,机器人实际上构成了一个超个体:它们是一种群体智能,表现出涌现的特性。根据简单规则局部互动的代理人的协同作用导致一个更高层次的整体,其行为比每个单独的代理人复杂得多。通过这一点,莱拉变成了一个复杂的系统:没有人能够预测将要发生的一切。

为了解决设计机器人的问题,我创造了一个系统,允许我们在一个尺度上切换机器人的动机:它们对分离的敏感程度,它们排列的容易程度,以及它们运动的凝聚力。此外,boids 的环境由使用各种伪随机噪声函数生成的不断变化的矢量场组成。磁场的作用有点像河流中的水流——朝某个方向流动比较容易,朝另一个方向流动就比较困难。这些向量场也可以用来增强戏剧性,例如通过鼓励 boids 在体验中的某一点以螺旋方式移动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

莱拉内部

因此,我们的机器人遵循各种各样的行为模型,并对他们世界的几种力量(例如重力)做出反应。然后,我们通过激光雷达跟踪莱拉的游客,将他们引入机器人的世界。有了追踪,访问者就有了自己的代理和影响范围。机器人被指定以特定的方式对“自己的”访客做出反应。游客们还介绍了世界矢量场的变化,创造了其电流流动的变化。

当我们的机器人穿越莱拉的时间线并对这种影响的聚合做出反应时,蝴蝶效应就产生了。这意味着最初由 boids 的相互作用产生的系统中的小变化可能会累积成以后更大的变化。这给莱拉带来了不可预测性和神秘感。

奥利·基尔皮

奥利·基尔皮是我们的动作设计师和视觉艺术家,图中他正在评估莱拉的投影的清晰程度。他分享了他在建造 Laila 期间学到的东西,以及他对该项目目前阶段的感受:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奥利·基尔皮,动作设计师和视觉艺术家

在这个项目的这一点上,接近完成时,我们正在努力平衡体验的确定性和它自己产生的程度。我们想给游客自由和故事中的角色。我们也想向游客讲述我们自己的故事。我们正在寻找这两件事之间的平衡——用户将如何互动,以及他们能在多大程度上影响他们的体验。

我以前做过虚拟现实和美术,但是设计一个 360 度的穹顶带来了全新的挑战。在 VR 中,像素更多,精度更高。然而,在 360°我们有一个人的全视野作为我们的舞台——而不是大多数 VR 护目镜提供的有限的隧道视野。在虚拟现实中,用户的视角随着他们一起移动,因为他们独自在体验中。在这里,我为我们所有的参观者同时建立了视觉效果,因为空间和视角是共享的。

关于这个项目一个有趣的事情是,由于这是一个新的设计领域,没有现有的规则。我意识到,在 360°的背景下,平面页面上存在的传统构图规则并不适用。这种环境更加自然,就像在大自然中行走一样——它不是一个环境的快照,或通过某个镜头看到的环境,而是一个环境本身。

Saara-henrikka m kinen

我们的体验和视觉设计师saara-henrikka mkinen 讲述了她在用户测试中对 Laila 的了解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

saara-henrikka m kinen,体验和视觉设计师

由于我们精心制作了 Laila 来对它的访客做出反应,所以看看我们的访客给作品带来了多少层次的重塑是很有趣的。每个人都有自己的个性、记忆和先入之见,这些都会影响他们对作品的解读。这些事情也会影响他们如何互动——既与作品互动,也与各自的访客群体成员互动。例如,我们的一个测试访问者评论说“我没有动,因为其他人也没有动”。另一个人评论道,“我是那种想解散团队的人——我想独立行动。”显然,一些人将莱拉视为一个游戏场:他们开始控制甚至主导这一体验。话又说回来,有些来访者不想被注意,宁愿消失在作品内部。

因为他们包含不同类型的人,每个群体都有独特的经历——在精神和具体层面上。例如,如果两个朋友加入不同的小组,然后讨论 Laila,他们可能不会认可对方谈论的所有内容。由于群体动力影响视觉和声音的产生,其他群体的访问者可能没有体验过特定的部分。

通过 Laila,我们希望为人们一起提供对作品的见解的可能性。他们通过观察彼此来了解莱拉是如何互动的。从这个意义上说,莱拉既是一次个人的旅程,也是一次共同的旅程。

明娅·阿克塞尔松(这篇博客的作者)

我是一名体验设计师和机器人研究员。下面是我对《莱拉》中含义的一些看法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Minja Axelsson(作者),体验设计师和机器人研究员

莱拉是我们未来的幻想——反乌托邦、乌托邦和现实主义。我们的游客体验所有这些可能性,并参与它们的创造。我希望通过这一点,参观者可以获得一些作品的所有权。即使参观者决定将莱拉作为一个被动的接受者来体验,他们的存在仍然会影响作品的展开。这与现实世界有相似之处:被动也是一种会带来后果的选择。我是一个有点激进的人,所以我通过这个镜头来解释这个作品:我们做出的选择很重要。

在莱拉,没有人能自己选择将会发生什么。这是一个复杂的系统,通过人工智能和访客的互动建立起来。Laila 背后的想法受到了混沌理论和蝴蝶效应的启发:一个系统初始状态的小变化如何能够在后来的状态中产生大的影响(即几周前一只遥远的蝴蝶扇动翅膀影响了龙卷风的路径),以及一个看似随机的系统如何具有潜在的模式和相互联系。Laila 有很多参数,理论上有无限多的事情可以发生,在一定的框架内。当参观者进入作品时,一个特定的现实被创造出来,机会打开又关闭。这与哥本哈根的解释有关——当某种现实被衡量时,它就被创造出来,而其他的选择就从潜在的存在中消失了。

虽然莱拉是一个传统意义上的故事情节,但我认为这种哲学仍然存在于作品中。人们在进入莱拉之前贡献了一段自己的录音,通过这段录音,他们积极参与了莱拉世界的建设。我希望这能给人们一种感觉,他们的声音是重要的,他们正在把自己融入一个复杂的整体。我很高兴听到参观者说他们把这项工作当成了冥想。我认为这证明了它给了他们停下来思考的空间。我很想知道它对我们的人性、技术、它们之间的关系以及我们将共同建设什么样的未来引发了什么样的思考。

埃西·霍塔里

我们的人工智能交互设计师 Essi Huotari 讨论了讲故事在为 Laila 设计人工智能交互中的作用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Essi Huotari,人工智能交互设计师

我认为 Laila 有三个基本要素:故事、人工智能和访客互动。我最大的设计挑战是平衡我们对莱拉故事的控制和赋予人工智能和游客影响这个故事的权力。在拥有和失去控制之间交替是我们工作的动力。

我认为定义讲故事的是时间的意义:一个时间线,即使是一个抽象的时间线,构建一个故事,并赋予它意图。某些事情发生在其他事情之后。由于莱拉有一个故事情节,我们有时需要从访客和人工智能那里掌握控制权,以推动故事向前发展。这将 Laila 与许多其他交互式装置区分开来,这些装置的功能更像是一个游戏场,有一套始终有效的给定规则。找到合适的地方进行干预是真正的挑战。我认为讲故事和给访问者完全的控制权是一个光谱的两端。莱拉在故事情节中沿着这个光谱移动。

我认为设计过程中最有趣的部分是为实验创造空间,并利用快乐的意外。设计一个拥有自己代理的人工智能代理的体验是很有趣的。我不得不在 Laila 中寻找参数、目标和物理定律的正确组合,而不是选择预先确定的动作,从而产生我们正在寻找的人工智能行为。作为一名设计师,我习惯于决定成品的具体外观和感觉。在这里,我必须放弃一些控制权。作为回报,我们发现了令人愉快的人工智能行为和互动,这是我们事先无法想象的。

伊娜·泰琼拉蒂

我们的编舞 Iina Taijonlahti 对游客如何在 Laila 中移动很感兴趣,并谈到了它在作品中的意义:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编舞伊娜·泰琼拉蒂

从本质上说,社交舞蹈是由莱拉内部的游客创造的。莱拉和外面的世界有着同样的习俗。即使在杂货店里,人们也在不知不觉中创造舞蹈动作。人们移动的方式取决于大量的参数:你是否认识某人,你来自哪种文化,你带着什么设备移动。另一件有趣的事情是,根据参观者的视角,他们可以作为观众的一员,或者是作品中的表演者。这很有趣:我是被观察,还是我是观察者?在某种程度上,参观者进入 Laila 的窗帘就像一个舞台的入口。

我认为莱拉所在的空间技术非常先进。莱拉的球体是非传统的,令人身临其境,这是一直 360 度看东西的结果。游客们评论说他们失去了时间和地点感。

关于 Laila 的一件有趣的事情是,我们给了非人类的 actants 代理权。这是通过莱拉的人工智能代理——它的群体智能——来完成的。这样,莱拉就与后人文主义的概念相关联,因为它关注的是非人类的视角。我一直在思考的问题是:我们如何才能放弃理性主义和人文主义的理想,在那里人类的智慧是至关重要的?我们如何给其他感官空间,以及体验和分配力量的新方式?

海基·海斯卡宁

我们的媒体技术工程师 Heikki Heiskanen 回顾了他创作《莱拉》的经历:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Heikki Heiskanen,媒体技术工程师

与这么多来自不同领域的有才华的人一起工作——比如软件开发、视觉艺术、声音设计和歌剧——令人着迷。由于莱拉是一种新型的艺术概念,它需要不同领域的知识。随着我们将新的信息和知识整合到 Laila 中,它的概念也在不断发展。在这种工作过程中,来自多种观点的观点汇集在一起,并被整合成一个连贯的整体,这种工作过程包括其自身独特的挑战和成功。

随着我们准备向游客开放莱拉,我希望它将被视为沉浸式互动技术讲故事能力的一个例子。声景令人惊叹,视觉效果极具想象力——我会把莱拉描述为一次神奇的经历。

Python 中的 Lambda 表达式

原文:https://towardsdatascience.com/lambda-expressions-in-python-9ad476c75438?source=collection_archive---------26-----------------------

如何用 Python 编写 lambda(或匿名)函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克在 Unsplash 上的照片

介绍

假设我们正在编码,需要编写一个简单的函数。然而,我们只会使用这个函数一次,因此似乎没有必要为这个任务创建一个带有 def 关键字的完整函数。这就是 lambda 表达式的用武之地。

什么是 lambda 表达式?

λ表达式用于创建匿名函数,或者没有名字的函数。当我们需要创建一个只需要使用一次的函数(一次性函数)并且可以用一行代码编写时,它们非常有用。Lambda 函数可以有任意数量的参数,但只能有一个表达式。它们通常具有产生函数对象的这种格式:

lambda 参数:表达式

使用 def 关键字创建函数

假设我们想写一个函数,它接受一个数作为输入,并返回这个数的平方。我们可以通过使用 def 关键字来做到这一点:

我们使用 def 关键字来定义这个函数。我们将这个函数命名为平方。这个函数有一个参数, num ,它使用**运算符返回这个数的平方。

带有一个参数的 Lambda 表达式

现在让我们把这个函数写成一个 lambda 表达式:

就是这样!我们首先从 lambda 关键字开始,然后是参数 num ,一个冒号,以及您希望该函数返回的内容,即 num**2。

注意,这个函数是匿名的,或者没有名字。所以我们不能在以后调用这个函数。另外,我们没有写退货。冒号后的所有内容都是将被返回的表达式的一部分。

如果我们想将 lambda 函数赋给一个变量,以便以后可以调用它,我们可以通过使用赋值运算符来实现:

然后,我们可以调用这个函数,就像调用用 def 关键字定义的函数一样。例如:

square(3) # will return 9 as the output

[## 解决 Python 编码问题的最佳方式

了解如何有效解决 Python 编码问题!

towardsdatascience.com](/best-way-to-solve-python-coding-questions-376539450dd2)

具有多个参数的 Lambda 表达式

让我们做一个 lambda 函数,它有两个参数,而不是只有一个。首先,我们将使用 def 关键字创建一个返回两个数之和的函数,然后我们将把它写成一个 lambda 表达式:

正如我们所见,如果我们希望我们的函数在一个 lambda 表达式中有多个参数,我们只需用逗号分隔这些参数。

就像使用 def 关键字创建的表达式一样,lambda 表达式不需要任何参数。例如,如果我们想要一个 lambda 表达式,它不接受任何参数,并且总是返回 True,我们可以这样写:

Lambda 表达式中的条件语句

我们也可以在 lambda 表达式中包含 if else 语句。我们只需要确保它们都在一行上。例如,让我们创建一个函数,它接受两个数字并返回其中较大的一个:

我们的 lambda 表达式接受两个数字, num1num2 ,如果 num1 大于 num2 ,则返回 num2 。显然,这个函数不考虑数字是否相等,因为在这种情况下,它将只返回 num2 ,然而,我们只是说明如何在 lambda 表达式中使用条件语句。

[## 在 Python 中压缩和解压缩 Iterables

如何在 Python 中压缩和解压缩可迭代对象

towardsdatascience.com](/zip-function-in-python-da91c248385d)

那其他如果呢?

从技术上讲,我们不能在 lambda 表达式中使用 elif 语句。但是,我们可以将 if else 语句嵌套在 else 语句中,以获得与 elif 语句相同的结果。例如,如果我们还想检查 num1 是否大于 num2 ,如果 num2 大于 num1 ,或者(意味着它们是否相等),我们可以使用下面的 lambda 表达式:

所以如果我们的 lambda 表达式发现num 1>num 2,就会返回 num1 。如果这个条件为假,它将继续执行 else 语句。在这个 else 语句中(在括号内),它首先检查num 1<num 2是否为真。如果条件为真,它将返回 num2 。如果条件为假,它将返回 else 语句之后的内容,在本例中是字符串“它们相等”。

最后一个音符

Lambda 表达式在接受另一个函数作为参数的函数中非常有用。例如,在 map、filter 和 reduce 函数中,我们可以传入一个 lambda 表达式作为函数。

映射、过滤和减少功能的详细概述:

[## 在 Python 中使用地图和过滤器

如何使用 python 中内置的地图和过滤功能

towardsdatascience.com](/using-map-and-filter-in-python-ffdfa8b97520) [## 在 Python 中使用 Reduce

如何使用 python 中的 reduce 函数

towardsdatascience.com](/using-reduce-in-python-a9c2f0dede54)

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 报名,我就赚一小笔佣金。

[## 通过我的推荐链接加入媒体——卢艾·马塔尔卡

阅读卢艾·马塔尔卡的每一个故事(以及媒体上成千上万的其他作家)。您的会员费直接支持…

lmatalka90.medium.com](https://lmatalka90.medium.com/membership)

结论

在本教程中,我们学习了什么是 lambda 表达式,如何用零参数、单参数和多参数来编写它们。我们还学习了如何在 lambda 表达式中使用 if else 语句。

Lambda 函数示例和错误处理

原文:https://towardsdatascience.com/lambda-functions-with-example-and-error-handling-d9d3ec0b30d4?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lambda 函数和错误处理。照片由 Pexels克里斯蒂娜·莫里洛拍摄

给 PYTHON 开发者的提示

用肮脏的方式编写即时函数。不建议在所有情况下都这样做,但是这样很方便

先决条件

在经历这些之前,你需要熟悉在 Python 中定义自己的函数;否则,你会迷失在中间。下面的文章将会给你更多关于如何定义你自己的函数的信息。

[## 编写自己的函数

数据科学家需要具有特定功能的函数

towardsdatascience.com](/writing-your-own-functions-40d381bd679) [## 变量范围和 LEGB 规则

变量的作用域指的是你可以看到或访问变量的地方

towardsdatascience.com](/scope-of-variable-and-legb-rule-4d44d4576df5) [## 函数参数:默认值、关键字和任意值

定义一个接受可变数量参数的函数

towardsdatascience.com](/function-arguments-default-keyword-and-arbitrary-9588b5eaaef3) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lambda 函数语法。图片由作者

有一种更灵活的方式来动态编写函数,这种方式被称为 lambda 函数。这是因为我们使用了关键字lambda。例如,我们编写一个名为raise_number_to_power的函数作为 lambda 函数。在关键字 lambda 之后,我们指定参数的名称,即xy。然后,我们使用一个冒号,后面是定义我们希望函数返回什么的表达式。

Lambda 函数允许你以肮脏的方式编写即时函数,所以我不建议你一直使用它们,但是在某些情况下它们会非常有用。例如,map 函数有两个参数。一个函数和一个序列,比如一个列表,以及这个函数对序列中所有元素的作用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

映射函数中的λ。图片作者作者

我们甚至可以不命名 lambda 函数来映射,在这种情况下,我们称它们为匿名函数。例如,我们在一个 lambda 函数上使用一个 map,它对一个列表中的所有元素进行平方运算,你将把结果存储在一个square变量中。在打印square变量的同时,揭示了它是一个 map 对象。为了查看它包含的内容,我们使用函数列表将其转换为列表并打印结果。正如所料,这是一个包含原始列表中元素的方块的列表。

错误处理

当你误用一个函数时,它会抛出一个错误。例如,检查从数字或字符串返回浮点的函数 float。当您向函数 float 传递一个整数值时,会返回相应的 float。类似地,如果你给它一个字符串8.7,它将返回浮点值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不正确地使用函数将返回错误。图片作者作者

但是,如果您向它传递字符串hello,Python 将抛出一个错误,告诉您它无法将字符串转换为 float。在这种情况下,它抛出了一个ValueError,并且有许多类型的错误。当我们编写函数时,我们可能希望发现特定的问题并编写特定的错误消息。让我们来看看计算数字平方根的用户定义函数。它像预期的那样处理整数。如果我们给它传递一个字符串,比如hello,会有什么结果?它会抛出一个错误,对应于函数定义中的一行代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将字符串转换为浮点错误。图片作者作者

这个错误说它是一些TypeError,但是这个消息可能对我们函数的用户不是特别有帮助,所以我们应该尝试为我们编写的函数提供有用的错误消息。

捕捉此类异常的主要方法是 try-except 子句,在该子句中,Python 尝试在尝试之后运行代码,如果可以,一切正常。如果由于异常而无法工作,它将运行异常代码。现在让我们重写我们的square_root函数,但是这一次捕捉任何引发的异常。在这个例子中,我们试图执行x0.5次方。使用 except,在出现异常的情况下,我们打印x must be an int or float。我们看到,结果函数对于整型和浮点型都工作得很好,并且打印出了我们想要的字符串。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用消息捕获 TypeError。图片作者作者

我们也可能只希望捕获TypeError并让其他错误通过,在这种情况下,我们将使用 except TypeError。可以检测到许多不同类型的异常,您可以查看在线提供的 Python 文档。您将希望通过使用关键字raise来引发一个错误,而不是简单地打印一个错误消息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用条件提高 ValueError。图片作者作者

例如,square_root函数在应用于负数时做了一些我们可能不想要的事情。它返回一个我们可能不想要的复数。假设我们不希望我们的函数适用于负数。使用 if 子句,我们可以在用户向函数传递一个负数的情况下引发一个ValueError。如果我们给我们的新函数一个负数,看它返回规定的ValueError

**Other Interesting Articles**#1 [Function Arguments: Default, Keyword, and Arbitrary](/function-arguments-default-keyword-and-arbitrary-9588b5eaaef3)#2 [Scope of Variable and LEGB Rule](/scope-of-variable-and-legb-rule-4d44d4576df5)#3 [Writing Your Own Functions](/writing-your-own-functions-40d381bd679)#4 [Python: Procedural or Object-Oriented Programming?](/python-procedural-or-object-oriented-programming-42c66a008676)#5 [Data Science with Python: How to Use NumPy Library](/data-science-with-python-how-to-use-numpy-library-5885aa83be6b)#6 [Do you have the Software Engineer and Data Scientist skills?](/do-you-have-the-software-engineer-and-data-scientist-skills-probably-not-7e8fb069e067)

关于作者

魏江是一名研究员,负责收集、组织和分析意见和数据,以解决问题、探索问题和预测趋势。

他几乎在机器学习和深度学习的每个领域工作。他正在一系列领域进行实验和研究,包括卷积神经网络、自然语言处理和递归神经网络。

连接上 LinkedIn

获得你的第一份数据科学工作

原文:https://towardsdatascience.com/land-your-first-data-science-job-a91166619dff?source=collection_archive---------30-----------------------

关于如何在毕业后立即成为数据科学家的 10 个实用技巧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 StartupStockPhotos 来自 Pixabay

你辛辛苦苦学了几个月统计学和编程的*【来龙去脉】*,把所有基本的机器学习算法都背下来了。你也许可以解释神经网络如何工作,什么是反向传播,以及模型中的权重如何更新。

你最好的朋友忘记了你的存在,因为你已经有一段时间没有看到他了,因为你正忙着试图将你最新的随机森林模型改进到小数点后的另一个分数(经过几天的反复试验,你终于成功了)。

但后者并不重要…

如果你想,你可以在几个小时内完成所有这些。所以你终于有信心成为数据科学大师了!或者至少认为自己是一个体面的早期内行。

干得好!但是现在呢?

现在你需要让其他人相信你确实是一名数据科学家,这可能比学习技能本身更难。

因此,我将与你分享一些帮助我寻找数据科学工作的技巧,所以如果你感兴趣,请耐心等待…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 PixabayRibastank

  1. 确定你想要什么类型的工作。

有数以千计的数据科学家职位可供选择,但它们可能并不都适合你想要做的工作。你知道你在数据科学方面最强的部分是什么,你对什么感兴趣。你可能对传统的机器学习感兴趣,或者喜欢深度学习,并且已经完成了几个专注于神经网络的项目。

你是一个更喜欢动手的人,喜欢实现算法,对创建生产就绪代码感觉良好吗?

或者你宁愿阅读最新的研究并尝试实现最新的神经网络架构?

你想去大公司还是中型公司工作?或者你更愿意为创业公司工作?

公司文化对你来说重要吗?

你愿意搬迁吗?如果愿意,距离有多远?或者你可能只接受远程位置。

这些都是有效的选择,但我建议,对于第一个数据科学职位,你应该找一个不仅仅是公司中唯一的数据科学家的职位。

在你开始申请任何工作之前,你需要有这些答案,因为这会节省你的时间和精力。

2。申请尽可能多的相关职位。

一旦你想好了你想要的工作类型,你就可以开始申请这些职位了。重要的是,你要坚持你为自己的工作列出的规则,并把它应用到唯一相关的职位上。

我要再重复一遍:

这一点极其重要,只适用于相关职位。

数据科学家角色的职责差异很大,根据角色定义的不同,您最终可能会完成完全不同的任务。你想确定你会成为你所了解的并让你保持兴趣的人。

此外,在你不熟悉或根本不感兴趣的领域找到工作也很难。即使你在面试过程中取得了成功,在接下来的几个月或一年里,你也将被迫这样做,可能会感到痛苦。

你的完美工作还在外面。

3。创建一个电子表格来跟踪应用程序。

你不需要准备任何花哨的东西。谷歌电子表格就够了。你需要记录公司名称、你申请的职位、招聘广告的链接、申请日期、你是否得到回复,以及你是否描述了回复的内容,如被拒、电话面试邀请等。

这足以让你有条理,你会知道你申请了多少份工作,在什么时间跨度内,这基本上会帮助你在这个过程中保持理智。

有时你可能会觉得你已经申请了数百份工作,而当你看着电子表格时,你会发现实际上是很多,但没有你想象的那么多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自像素来自像素

4。看看小一点的求职板和公司网站。

因此,有一些显而易见的我们都知道的通用求职平台,比如 Monster,实际上还有 Craigslist,它们都是很好的起点。一定要将申请发送到广告中的职位,但是公司通过这些网站收到的申请数量会很高,可能很难脱颖而出。

试着找一些与数据科学相关的,或者你想工作的特定领域的小职位。数据科学家找工作的好地方是

我个人已经远程工作好几年了,并且一直在面试上面页面上发布的工作。

此外,对于远程员工来说,寻找数据科学工作的好地方是:

5。查看公司网站寻找数据科学工作。

除了招聘信息,我还鼓励你搜索当地公司的网站,看看他们是否在招聘数据科学家。公司的政策可能是先在网站上做广告,然后转向更广泛的招聘广告。

正如你所想象的,公司网站上的申请人应该更少,所以你获得面试的机会会更高。

同样,你不仅可以查看当地公司,还可以找到其他方法来识别可能寻找数据科学家的企业。

好方法是查看你的朋友数据科学家毕业生工作的公司。有可能他们现在正在招聘,你甚至会被公司里的人推荐。

6。参加聚会和数据科学活动,并积极参与其中。

求职的另一个重要方面是参加当地的数据科学会议和其他数据科学相关活动。参加这些活动的都是对这个领域感兴趣的人或者是在这个领域工作的人。尝试与他们联系可以让你获得他们工作的公司的推荐,并最终获得一份工作。

积极参加这类活动很重要。

听一个小时关于优化梯度提升算法的讲座,然后看一个人回答公众的问题,你不会从中受益。

只有当你是活动的积极参与者时,你才会受益。也就是向正在演示、交谈并与其他参与者互动的人提问。你永远不知道你旁边的人什么时候会成为另一个工作领导。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 uh_yeah_20101995 发自 Pixabay

7。清理 GitHub 账号,上传好项目。

对于任何一个数据科学家的角色来说,发送一个到你的 GitHub 个人资料的链接和你的简历和求职信几乎是一个要求。虽然更有经验的数据科学家可以用一个几乎空无一物的 GitHub 档案逃脱,但对于该领域的新手来说却很难。最后,你试图证明你可以成为一名数据科学家,这是一个很好的机会。

因此清理你的 github 账号,添加你引以为豪的优秀项目。

后者也意味着去除所有不相关的、不展示你技能的垃圾。在顶部展示你最好的项目,这样招聘人员打开你的 GitHub 档案时就会看到这些项目。

我推荐一些可视化效果很好的项目。我们是人,我们更喜欢吸引人的视觉效果而不是代码。

此外,一些招聘人员可能不太懂技术,可能不了解代码的细节,所以用漂亮的视觉效果吸引他们的眼球通常会奏效。

[## Jupyter 笔记本自动完成

数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…

towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c)

8。有一个投资组合的网站。

这并不是任何求职申请的必备条件,但在试图让别人相信我们擅长某事时,这可能是一个不错的加分项。有如此多的在线编辑器允许你创建网站,所以你可以选择任何免费和受欢迎的网站或者使用 GitHub 页面。网上有很多教程教你怎么做。

确保你的网站有吸引力,并描述五个你引以为豪的项目。再一次,漂亮的视觉效果是加分项。

你希望你的网站引人注目,并显示你是你所做的专业人士。

在你的描述中不要使用技术术语,要像对待商业或产品专家一样对待访问者。你需要说服他们为什么你做的项目对世界有价值。如果他们对技术实现感兴趣,他们可以看看你的 GitHub 页面,所以一定要把你的项目链接到那里。

同样,有些人没有自己的网站(包括我),他们被雇佣了。然而,这些人依赖于他们以前的经验,所以他们不必努力工作来证明他们能胜任这份工作。

然而,作为这个领域的新人,你需要努力在各个层面给人留下深刻印象。你给人的印象越好,你获得面试的机会就越多。因此,花几个小时创建网站真的是值得的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 StartupStockPhotos 来自 Pixabay

9。记住三个你参与过的项目,并能围绕它们讲述故事。

所以这是面试准备的建议,这意味着你已经给某人留下了足够深刻的印象,以至于他会给你打电话,甚至亲自面试。您现在需要用您的数据科学知识给他们留下更深刻的印象。

我建议你修改你做过的三个项目,修改代码,记住项目的设定,以及所有关于它的小细节。

你是独自工作还是在团队中工作?

你一直在使用什么工具?

你用了什么算法?

结果如何?

你用什么标准来评估结果?

你有什么挑战吗?

如果你要重做这个项目,你会有什么不同的做法?

你需要能够回答所有这些问题以及其中三个项目的类似问题。为什么我说三个?一个不够?

你想要准备三个项目,这样当面试官问你关于体验的时候,你可以拿出其中的任何一个。可能会问你几个问题,所以你要准备好各种场景,不要看起来像你只是在一个大项目上工作。

即使问题不完全是上面提到的那个,通常准备上面的答案和重读项目代码会让你为面试官的问题做好准备。

此外,请注意,面试官的一些问题不是问项目本身,而是你应该用项目参考来回答。例如像*‘你知道什么分类算法?’*使用项目参考比只提供算法列表更好。

您可以通过实际找到包含数据科学面试问题的网站来练习,并尝试使用您选择的三个项目参考来回答这些问题。这应该让你为面试官可能会有的大量经验和技术问题做好准备。

10。了解公司和将要面试你的人。

为面试做好准备至关重要。你不知道公司的每一个细节,但是知道公司的概况总是一个好主意。

访问他们的页面,看看他们提供什么?

他们的潜在客户是谁?

他们的商业策略是什么?

他们的数据科学团队是什么?

公司价值观是什么?

这些信息通常可以在 LinkedIn、Glassdoor 或该公司的网站上找到。了解公司的一些细节是你的优势,会让你和面试官的对话更加流畅。

在面试之前了解一下面试官自己也是一个好主意。平时查查他们的 LinkedIn 应该就够了。你也可以看看他们是否有博客或者有什么有趣的在线信息。

了解这一点不会让你通过面试,但会让谈话变得更愉快,并可能帮助你不那么紧张。和你了解一点背景的人交谈比和完全陌生的人交谈更容易。至少这是对我的帮助!

总结

这些是我的十个建议,应该有助于获得你的第一份数据科学工作。显然,在面试和求职准备中,你还可以做更多的事情,但我相信,遵循这简单的十个步骤将会大大增加你获得工作的机会。

我希望这些信息对你有所帮助,祝你好运!

最初发布于 aboutdatablog . com:2020 年 4 月 2 日登陆你的第一份数据科学工作

PS:我正在 Medium 和aboutdatablog.com上写文章,深入浅出地解释基本的数据科学概念。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入

下面还有一些你可能喜欢的帖子

* [## 当你开始与图书馆合作时,7 个实用的熊猫提示

解释一些乍一看不那么明显的东西…

towardsdatascience.com](/7-practical-pandas-tips-when-you-start-working-with-the-library-e4a9205eb443) [## 对熊猫中的数据框进行排序

如何快速有效地排序数据帧

towardsdatascience.com](/sorting-data-frames-in-pandas-a5a3af6f346a)*

登录代码:将登录页面应用到 Jupyter 笔记本中

原文:https://towardsdatascience.com/landing-code-applying-landing-page-into-jupyter-notebook-4cdef561881f?source=collection_archive---------43-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图一。**登陆代码亮点(图片作者, UnsplashIRA 设计多像素)

数据可视化

引入交互式 Python 编程的新概念

编译 Python 代码有很多选择。可以在终端、IPython、Spyder、Jupyter 笔记本等运行。如果你想要一个交互式编译器,也许你会选择 Jupyter 笔记本。但是,IPython(交互式 Python 的简称)是一个不错的选择。

有两种类型的 IPython 可以选择,IPython Shell 和 IPython Notebook。要打开 IPython Shell,只需在终端中写 ipython ,输入ipython notebook即可打开 IPython Notebook。那么,IPython 笔记本和 Jupyter 笔记本有什么区别呢?我没有把握回答它。但是,如果你通过终端启动 IPython 笔记本,会被建议输入 jupyter 笔记本 ,而不是 ipython 笔记本 ,如图 2 所示。我觉得 IPython 笔记本在和 Jupyter 笔记本迁移融合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图二。**终端中的 IPython 笔记本(图片由作者提供)

新的替代方案是 Jupyter 实验室,但我不熟悉它。我用 Jupyter 笔记本更方便。也许,我将来会写一个关于它的故事。

主要目标

在这个故事中,我将与你分享一个用 Python 进行交互式编码的新概念。我给大家介绍 登陆代码 ,一个将网站框架中的登陆页面应用到 Jupyter 笔记本中。您可以在图 1 中看到我制作的登录代码的突出部分。

Yups,我将分享如何在你的 Jupyter 笔记本(以下简称 Jupyter)中建立一个登陆代码。它将给你一个交互式 Python 编码的新体验,并以一种新的方式呈现你的代码,感受一种新的氛围。

在我们建立一个登陆代码之前,我想告诉你建立它的概念。着陆代码建立在 Jupyter 单元中,采用 Markdown 类型。我已经在 Jupyter 中解释了一些细胞类型;你可以在下面的链接中查看。

[## 如何将 Jupyter 笔记本自定义为黑暗模式

一个关于自定义 Jupyter 笔记本主题和轻松调整 Maptlotlib 参数的故事

medium.com](https://medium.com/@rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38)

问题和解决方案

我们将在构建登陆代码时面临一些问题。当然,我会给你另外的解决方法。首先,我们不能在 Jupyter 单元格中运行 CSS,只能运行 HTML (Markdown)。我认为这是一个大问题。但是没关系。我们将用简单的图形设计技巧来介绍它。因为我们不能使用 CSS,所以我们不能建立一个像登陆页面响应登陆代码。同样,我们将使用一个奇特的 HTML 和图形设计范例来解决它,比如使用渐变、阴影效果、空白、统一概念等。

准备元素

我们将建立一个登陆代码和一些在登陆代码页提供的参考页面。登录代码由页眉、主图像、正文和页脚组成,而引用页面由页眉、主图像和一些代码单元格类型组成。要实现它,我们需要一些元素。图 3 显示了我们构建登陆代码所需的标题和主要图像元素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 3。**登陆代码中的页眉(红框)和主图片(灰框)元素(图片由作者和 IRA 设计)。

我使用 HTML(包括超链接)创建标题文本(徽标、主页、数据科学、机器学习、编程)元素,并使用 Inkscape(像 Adobe Illustrator 这样的矢量图形软件)在主页中创建圆形蓝色按钮。主图像元素中的文本由 HTML 生成,图像从 IRADesigns 下载。感谢 IRADesigns,它提供了许多免费的插图。

主体元素由 6 篇文章及其标题、图片和副标题构成,如图 4 所示。每篇文章 6 张图片,从 Unsplash 下载,关键字“数据”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 4。**登陆代码中的主体元素(图片由作者和 Unsplash 带关键字“数据”)组成。

我使用简单的 HTML 为我的登录代码创建了一个简单的页脚,如图 5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 5。**登陆代码和页脚元素中主体的某个部分(图片由作者和 Unsplash 带关键字“数据”)。

我创建了三个页面,数据科学页面,机器学习页面,以及参考页面的编程页面。它们的标题和主要图像元素如图 6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 6。**登陆码中每个引用页面的页眉和主图(图片作者和多像素)。

每个引用页面的标题和主图像都由登录代码页中的相同概念构成。我从多像素下载图片。感谢多像素。在 Header 和 Main Image 之后,被引用的页面后面是代码单元,如图 7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 7。**数据科学页面中的编码单元类型(图片由作者和多像素提供)。

程序

构建登陆代码的第一步是定制你的 Jupyter,使用 CSS 格式,而不是 jupyterthemes 库。您需要在 Jupyter CSS 文件中添加一些代码,命名为 custom.css 。可以在目录~/中获得。如果你找不到目录。朱庇特,也许它被你的背景隐藏了。可以通过按 Ctrl + H 查看隐藏的文件和目录,前缀来解决。(圆点)。如果您没有找到目录 custom 和文件 custom.css,您可以创建它们。custom.css 中包含的代码如图 8 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 8。**用 CSS 定制 Jupyter(图片由作者提供)。

如图 8 所示,custom.css 文件包含 Jupyter 页面的任何手动 css。我们只是在这里写附加的或者更新样式。在这一步的开始,我们将在 Jupyter 中隐藏 ln 容器,如图 9 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图九。在 Jupyter 中隐藏 ln 容器(图片由作者提供)

通过在 custom.css 中添加以下代码,可以隐藏 ln 容器并保存。

div.prompt,
div.tooltiptext pre {
    display:none
}

因此,更新后的 custom.css 如图 10 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 10。**custom . CSS 中的附加样式(图片由作者提供)

保存后,请刷新您的 Jupyter 页面。你会得到 ln 容器现在是隐藏的,如图 9 的左面板所示。

下一步是使单元格容器适合显示器的宽度。您可以通过在 custom.css 中添加以下代码来实现

.container {
    width: 100% !important;
}

要使 Jupyter 中的 Notebook-container、Notebook_app 和 Body Header 变成白色(与背景相同),可以添加以下代码

#notebook-container {
    padding: 0px;
    background-color: white;
}.notebook_app {
    background-color: white;
}body #header{
    background-color:white;
}

添加这些代码后,您将获得 Jupyter 的新显示,如图 11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 11。**用 CSS 定制 Jupyter(图片由作者提供)。

接下来,通过添加以下代码来删除单元格之间的边框

#notebook {
 padding-top:0px !important; 
 padding-bottom:0px !important;
}.container { 
 width:100% !important;
}.end_space { 
 min-height:0px !important;
}

应用它之后,您将获得如图 12 所示的新外观。请将其与图 10 和图 11 进行比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 12。**用 CSS 定制 Jupyter(图片由作者提供)。

修改 custom.css 的下一步是使图形结果与显示居中对齐。您可以看到图 12 中生成的图形是左对齐的。您可以通过添加以下代码来更改它

.output_png {
        display: table-cell;
        text-align: center;
        vertical-align: middle;
}

保存 custom.css 并刷新 Jupyter 页面后,您将得到结果,如图 13 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图十三。**用 CSS 定制 Jupyter(图片由作者提供)。

接下来,您可以通过按 View(在左上角面板)隐藏切换标题和切换工具栏。然后按切换标题和切换工具栏。完成后,您将看到 Jupyter,如图 14 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 14。**隐藏 Jupyter 中的切换标题和切换工具栏(图片由作者提供)。

下面是 custom.css 中的完整样式

在接下来的步骤中,我们将更多地讨论 HTML 框架。在登录代码页中,我在一个 div 标签中设置了页眉、主图像、主体和页脚。要创建 div,可以使用下面的代码

<div>
    Content of Your Div
</div>

所有的元素背景都是在 Inkscape 中设计的。图 15 显示了登录代码的主板。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 15。**登陆代码设计(图片由作者和 IRADesign 提供)

你明白了吗?Yups,图 15 中没有显示的每个元素,都是用 HTML 创建的。例如,我通过组合按钮和超链接标签来创建标题文本。您可以使用这段代码来创建它

如果你只想使用一个超链接标签,这是没问题的。标签***&emsp;*** 用于插入制表符。我们为什么需要它?答案是我们不能在 Jupyter 单元格中使用 CSS。只有 HTML 😄 .您需要通过按单元格- >单元格类型- > Markdown 来复制具有 Markdown 类型的 Jupyter 单元格代码。结果如图 16 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 16。**登陆代码中的标题元素(图片由作者提供)

我在后添加了一些中断标签
以使其更加清晰。如果您看到更多细节,在图 16 中看不到文本 Home。你看不到它,因为文本 Home 的颜色是白色的。您需要使用此代码在单元格中插入主板设计(图 15)。

您可以看到我在第 13 行插入了许多 break 标记。原因和前面一样,我们不能在 Jupyter 单元格中使用 CSS。尤普斯,着陆代码的概念是一个棘手的问题。如果您运行它,您将得到如图 17 所示的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 17。**登陆代码中的头元素(图片由作者提供)

之后,您需要用这段代码创建欢迎文本。

结果如图 18 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 18。**登陆代码中的标题和主要图片元素(图片由作者和 IRADesign 提供)

接下来,如何创建主体(图 4)?我使用一个表格标签来创建它。我创建了两个表。对于每个表,它由 1 行和 3 列组成。您可以使用这段代码来创建它。

您可以将代码添加到前面的代码中,在 break 标记之后和 div 的结束标记之前。结果如图 19 所示。我会在下一段给你提供完整的版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 19。**登陆代码中的主体元素(图片由作者和 IRADesign 提供)

您可以用相同的代码创建下一个表。之后,您需要使用这段代码创建一个简单的页脚

<span style="color: white"> Copyright &#169; 2020\. Allrights reserved. </span>

以下是创建登录页面的完整代码

运行之后,您将得到如图 20 所示的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 20。**登录代码页面 1(图片由作者、IRADesign 和 Unsplash 提供)

接下来你需要创建引用的页面,分别命名为 data_science.ipynb、machine_learning.ipynb、programming.ipnyb,这里我只和你分享一页的代码。它在这里

所有的材料,包括网页设计,图片,和。ipynb 文件上传在我的 GitHub 里。您可以通过此链接访问

[## rizman18/landing_code

该代码创建登陆代码,一个应用程序的登陆页面到您的 Jupyter 笔记本 GitHub 是超过 50…

github.com](https://github.com/rizman18/landing_code)

你可以在 YouTube 上观看集锦预览

结论

登陆代码是交互式编程(Python 或 R)中的新概念。这是我们建设未来准备的一部分,因为技术总是在发展。它不够有效,因为我们不能在 Jupyter 单元格中运行 CSS。在这个故事中,使用 Jupyter Notebook 进行更多的交互式编程是一个小小的努力。

有兴趣看我其他的故事吗?你可以点击访问我的简介。如果你对创建登陆代码感兴趣但没有时间,你可以通过 Fiverr 联系我。

如果你喜欢这篇文章,这里有一些你可能喜欢的其他文章:

[## 使用 Matplotlib 实现 Python 数据可视化—第 1 部分

完成了从基础到高级的 Python 绘图的 Matplotlib 教程,包含 90 多个示例

towardsdatascience.com](/visualizations-with-matplotlib-part-1-c9651008b6b8) [## 使用 Matplotlib 可视化数据的 5 个强大技巧

如何使用 LaTeX 字体,创建缩放效果,发件箱图例,连续错误,以及调整框填充边距

towardsdatascience.com](/5-powerful-tricks-to-visualize-your-data-with-matplotlib-16bc33747e05) [## 用于科学绘图的 Matplotlib 样式

为您的科学数据可视化定制 Matplotlib

towardsdatascience.com](/matplotlib-styles-for-scientific-plotting-d023f74515b4) [## 在 Matplotlib 中创建色彩映射表

从颜色列表中创建和定制自己的色彩映射表的指南

towardsdatascience.com](/creating-colormaps-in-matplotlib-4d4de78a04b8) [## 在 Matplotlib 中自定义多个子情节

使用 subplot、add_subplot 和 GridSpec 在 Matplotlib 中创建复杂 subplot 的指南

towardsdatascience.com](/customizing-multiple-subplots-in-matplotlib-a3e1c2e099bc)

仅此而已。感谢您阅读这个故事。喜欢就评论分享。我还建议您关注我的帐户,以便在我发布新故事时收到通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值