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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

网店顾客的细分

原文:https://towardsdatascience.com/segmentation-of-online-shop-customers-8c304a2d84b4?source=collection_archive---------38-----------------------

使用 Web 分析数据和 k-Means 聚类

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

作者识别相似客户/图像的集群

在这篇文章中,我将描述我们如何根据网上商店的网络分析数据对客户进行细分。基于该结果,可以实现现场个性化,并且可以针对细分市场中的用户开始有针对性的活动。

在这个过程中,我们将首先更详细地探索数据(“探索性数据分析”),然后对数据进行适当的预处理,计算分割,最后可视化聚类。对于计算,我们将使用 Google Colab

数据

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

www.kaggle.com

数据来自 Kaggle 数据平台,包含一家大型多品类网店一个月(2019 年 10 月)的网络追踪数据。文件中的每一行代表一个事件。有不同类型的事件,如页面视图、购物车操作和购买。

该记录包含以下信息:

  • 事件时间/事件是何时触发的?(世界协调时)
  • 事件类型/视图,购物车,购买
  • 产品标识/产品标识
  • 类别标识/类别标识
  • 类别代码/类别名称
  • 品牌/品牌名称
  • 价格/价格
  • 用户标识/客户标识
  • 用户会话/会话 ID

数据以 CSV 文件的形式从客户数据库平台导出,用于分析。

让我们导入数据:

先看数据

2019 年 10 月有超过 4200 万条记录可用。

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

数据集的前 10 条记录

这些数据来自超过 300 万的访问者。购买了超过 166,000 种不同的产品。

客户旅程示例

为了显示一个客户访问的示例,我们查看了针对某个 Session_id 存在的所有条目,并尝试解释它们:

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

客户旅程示例

  • 用户已经查看了几部 iPhones
  • 一次点击购买的 iPhone(无购物车事件)
  • 考虑品牌领域的 2 种未知产品
  • 查看一些苹果耳机并购买一个
  • 后来他去了一家更贵的,但决定不买了。

客户历史示例

为了查看特定用户在该月的所有操作,我们使用他的用户 ID 过滤所有记录。

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

客户历史示例

探索性数据分析

每天在 web 分析中记录了多少事件?

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

2019 年 10 月记录的事件数量/作者图片

事件类型的数量

数据中发生了哪些事件,发生的频率如何?

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

事件类型/作者图片

大多数数据包括 96%的页面浏览量,其余的数据包括购物车和购买行为。

来访者的特征

我们为每个访问者计算最重要的特征,并把它们放在一个表中。

  • 浏览量
  • 参观
  • 购买的产品数量
  • 购物车中的产品数量
  • 总支出
  • 每次就诊的支出
  • 每次访问的页面浏览量
  • 每次访问的购物车操作

我们从行动中过滤购买

在下一步中,我们从数据中过滤购买,以便能够更精确地分析它们。我们将结果保存在一个单独的表中。

购买的关键数字

一个买家购买多少产品?
每位买家的平均购买价值是多少?

平均而言,每位买家的购买量略高于 2 次
每位买家的平均购买价值为 773.85

品牌知名度

从哪些品牌购买产品?
让我们来看看排名前 10 的品牌的柱状图。

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

作者的流行品牌/图片

为了进一步分析,我们将购买分为最常见的品牌组(前 5 名)。而剩下的变成了一群“其他人”。

我们计算每个买家在 6 个品牌类别中的购买份额,并将它们存储在买家表中。

产品类别

有哪些产品类别?

产品类别以分层代码的形式存在。我们提取第一个级别,并将其保存为一个单独的特征。

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

作者购买的每个顶级类别/图片

有 13 个主要类别。我们将购买价格在每个主要类别中所占的份额作为附加功能添加到买家表中。

将购买特征添加到所有访问者的特征中

我们现在将购买特征添加到所有访问者的表中,从而获得一个包含所有访问者和特征的表。

因此,我们有 3,022,290 个用户的数据,其中每个用户都存储了 27 个特征。

用户数量的限制

为了将集群的计算和可视化保持在一定的范围内,我们将把自己限制在下面的前 50,000 个用户。

转换为矩阵格式以进行聚类计算

在开始计算聚类之前,我们必须将数据转换成适当的格式,作为二维数组。

数据的缩放

为了确保所有特征都以统一的尺寸标度表示,通过移动平均值并除以标准偏差来缩放矩阵。

计算不同聚类数的客户群

“k-Means 方法”用于计算线段。这是一种用于聚类分析的方法,其中一组对象必须形成 k 个组,这些组必须预先给定。

[## 理解机器学习中的 K-均值聚类

K-means 聚类是最简单和最流行的无监督机器学习算法之一。

towardsdatascience.com](/understanding-k-means-clustering-in-machine-learning-6a6e67336aa1)

因为我们正在处理非常大量的数据,所以我们使用该过程的“小批量”变体,该变体在每次迭代中仅使用部分数据来计算新的聚类中心。

如何设置最佳聚类数(“k 值”)?

我们计算不同 k 值的聚类,然后搜索最佳值。计算的轮廓分数是聚类质量的度量。该值越接近 1,分类的质量越好。我们用它来确定集群的数量。

[## 在 KMeans 算法中选择最佳聚类数(轮廓得分)

KMeans 是一种无监督的机器学习技术,主要用于将相似的实例组合在一起。万一…

medium.com](https://medium.com/@jyotiyadav99111/selecting-optimal-number-of-clusters-in-kmeans-algorithm-silhouette-score-c0d9ebb11308) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者对不同 k 值/图像的轮廓评分

现在我们用确定的最佳聚类数来计算聚类。

并考虑分配给每个细分市场的客户数量。

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

作者提供的集群大小/图像

集群的可视化

为了获得集群的印象,我们用“tSNE”方法创建了一个可视化。t 分布随机近邻嵌入(tSNE)是一种降维技术,特别适合于高维数据集的可视化。

[## 用 Python 例子介绍 t-SNE

介绍

以 Python 为例 Introductiontowardsdatascience.com 的 t-SNE](/an-introduction-to-t-sne-with-python-example-5a3a293108d1) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者用 tSNE / Image 实现的集群可视化

现在让我们用更少的集群来计算可视化。对于该过程来说,将各个区域分成不同的片段要困难得多。

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

tSNE 有 5 个集群/作者提供的图像

细分市场的特征

为了能够解释细分市场,我们创建了图形表示,例如,以“雷达图”的形式一次性显示每个细分市场的类别特征。这有助于解释各段的含义。

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

作者在群集/图像中的类别

例如,在“儿童”和“运动”领域具有高购买份额的细分市场,以及在“电子产品”领域具有高购买份额的其他细分市场。

基于 U-网的 OCT 图像分割

原文:https://towardsdatascience.com/segmentation-of-optical-coherence-tomography-images-with-diabetic-macular-edema-the-gluon-82093cfd8e24?source=collection_archive---------39-----------------------

内部 AI

使用基于 Apache Mxnet 和 Gluon 框架的光学相干断层扫描报告诊断糖尿病性黄斑水肿的深度学习方法

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

克劳迪亚·拉米雷斯Unsplash 上拍照

糖尿病性黄斑水肿

糖尿病性黄斑水肿是由称为糖尿病性视网膜病变的 II 型糖尿病引起的恶化。糖尿病性视网膜病变是最常见的糖尿病性眼病之一,通常会导致失明。粗略估计,770 万美国人被诊断患有这种糖尿病,其中大约 75 万人患有糖尿病性黄斑水肿。

光学相干断层扫描(OCT)

OCT 是对 DME 的诊断测试。这项测试使用一种特殊的光源和一台相机来获得视网膜的全面内细胞层。它可以感知视网膜的厚度,并有助于确定视网膜的肿胀程度。

u 型网

在 2015 年 5 月 18 日,Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 发表了一篇关于用于生物医学图像分割的卷积神经网络(CNN)的论文。传统上,细胞神经网络用于图像分类和目标检测。这种方法并不适合,因为期望的输出是定位的输出,其中类标签被分配给每个像素。因为与图像分类问题或物体检测问题相比,生物医学任务没有大量的正样本。Ciresan 等人试图训练一个网络,使用滑动窗口设置,通过使用感兴趣区域或像素周围的小块作为输入特征来预测每个像素的类别标签。这种方法虽然新颖,但却相当稳定,并且由于补丁重叠而导致大量冗余。此外,在小块尺寸和定位精度之间有一个折衷。斑块大小越大,背景越高,但这会导致最大池层数增加,从而减少空间信息,导致定位精度降低。如果小块尺寸减小了,那么上下文也就减小了。这导致了 U 型网络的产生,这是一种伪全连接网络

主要建议是提供一个连续层的正常卷积网络。最大池层被上采样层取代,从而提高了像素密度,最终提高了分辨率。来自卷积路径的这些较高分辨率特征与上采样输出连接。添加连续的卷积层作为扩展路径,这导致特征通道的数量增加,以使网络能够将空间信息传递到高分辨率层。该模型不包含任何完全连接的层,并使用每个特征提取器的最重要部分(卷积)。整体结构呈 U 形,因此得名 U 形网。在较大图像的情况下,通过翻转输入图像和对输入图像执行不同的增强来产生缺失的上下文,这不会改变图像的含义,但是有助于提取每个输入图像的更多特征。

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

来源:“U-Net:生物医学图像分割的卷积网络”

参考上面的图像,论文的作者使用了具有 ReLu 激活功能的连续 Conv3D 层。最低分辨率为 32×32 像素。卷积层的每个连续块被最大化汇集并相互堆叠。为了形成 U-Net 的基础,为了数据一致性,创建了由 3 个卷积层组成的平台块,其具有相同数量的输入和输出通道。后来通过转置卷积层对它们进行了上采样。反过来,这些层与相应的深度卷积块连接在一起。连接的输出被传递到 U-Net 的上升分支或扩展块。在每一个深度级别,空间信息通过连接不断传递。

你可以在https://arxiv.org/abs/1505.04597查看原文,了解更多细节。

资料组

我使用了 OCT 图像的分割:光学相干断层扫描(OCT)和糖尿病性黄斑水肿(DME)数据集,该数据集由 Paul Mooney 在 kaggle 上提供。你可以在 https://www.kaggle.com/paultimothymooney/chiu-2015亲自看看

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

截图来自“kaggle.com”

数据集由以下文件组成

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

来自我的文件浏览器的屏幕截图

完整的源代码

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

马库斯·斯皮斯克Unsplash 上拍摄

您可以在我的 GitHub 资源库中找到我的实现的完整源代码。

[## sid 0312/oct image 分段

从头开始建立使用 Apache MxNet 和胶子图像分割光学相干断层扫描图像与…

github.com](https://github.com/sid0312/OCTImageSegmentation)

使用 MxNet 的 UNet】

我使用 Apache MxNet 框架和 Gluon API 从头开始构建了一个 U-Net,它类似于 Tensorflow 框架的 Keras

我的存储库中的 model.py 如下所示

现在让我们逐行查看我们的 model.py 文件

  • 导入我们的依赖关系

  • 为 U-Net 创建类

U-Net 被实现为一个混合胶子块。

class network(gluon.nn.HybridBlock):
  • 创建卷积零件功能

这作为单个收缩块,可以在卷积路径中多次使用。它由 3 个 Conv2D 层组成,每个层的内核大小为 3,ReLu 激活函数和 BatchNorm 层用于规范化输入,最后是一个 max pooling 层。它是混合顺序块,因为信息需要顺序传递。

  • 创建去卷积零件功能

这就像是 U 型网络的一个单独的组成部分。它也可以在 U-Net 架构中多次使用。它由 Conv2D 层组成,每个层的内核大小为 3,ReLu 激活函数和 BatchNorm 层用于规范化输入,Conv2DTranspose 层用于扩展输入大小(换句话说就是增加特征图的大小)

  • 创建坪块功能

这一层充当了 U-Net 的瓶颈。它是为数据一致性而创建的,具有相同数量的输入和输出通道。

  • 创建输出层功能

该层充当 U-Net 的输出分段图。它紧接在广阔的道路之后发生。请注意,这几乎类似于卷积部分函数,但它包含一个用于鲁棒特征提取的额外参数。

  • 创建连接功能

这是 model.py 文件中最重要的函数之一。它将从卷积路径获得的较高分辨率特征与最初来自平台块的上采样输出层连接起来。它还填充这些层以给出适当形状的合成层。我花了很长时间来编写这个函数,由于形状不一致,它有很多错误。

然而,这个函数现在工作得非常好。我们使用了边缘填充,以便用输入数组的边缘值填充特征图。简要地看一下 mxnet 在 http://beta.mxnet.io/r/api/mx.nd.pad.html 的官方文档会对理解下面的代码有很大的帮助。也试着在 http://beta.mxnet.io/r/api/mx.nd.concat.html 的查阅 mxnet.nd.concat 文档

  • 创建 init 函数来分配层

我们已经为每个层创建了函数,但是要真正创建层,我们需要在 init 方法中创建层。请注意,**kwargs 对于混合顺序块参数很重要。

  • 创建 hybrid_forward 方法

我们已经分配了层,但是我们需要顺序地堆叠它们,传递输入 ndarray 并获得输出 ndarray。

  • 为网络类创建对象
net = network(input_channels=1,output_channels=2)

我们已经完成了整个模型。py. 是时候可视化我们的模型了

print(net)

输出:

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

我的谷歌实验室笔记本截图

让我们使用 Xavier 初始化初始化网络的权重,并在获得上下文(无论代码是在 gpu 还是 cpu 上运行)后,使用形状的样本数组(5,1,284,284)检查模型摘要

输出:

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

来自我的 google colab 笔记本的截图

足够的可视化。现在让我们使用 prepare_data.py 来准备我们的数据

create_pipeline 方法有助于创建输入管道,即使用。数据集的 mat 文件。

load_dataset 方法将输入管道分为两部分,即训练和验证

现在我们已经有了我们的训练特征、训练标签、验证特征和验证,是时候训练我们的模型了!!

我们的批量大小为 6,运行 100 个时期的训练。

这里使用的损失函数是 mxnet . gluon . loss . softmaxcrossentropyloss()。可以在https://mxnet . incubator . Apache . org/API/python/docs/API/gluon/loss/index . html了解更多亏损情况

使用的优化器是一个胶子教练对象。使用的优化算法是随机梯度下降,学习率为 0.0004。你可以在https://mxnet . incubator . Apache . org/API/python/docs/API/gluon/trainer . html了解更多关于 gluon 训练师的信息

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

我训练的一些日志

我获得了 88 %的验证准确率,这是相当不错的。

在训练我们的模型之后,我们获得我们的模型参数,我们把它保存在一个文件中,比如说,net.params

我们可以使用 model.params 文件加载我们的模型以进行进一步的预测

让我们使用 results.py 文件绘制一些结果

为了理解这个文件需要一些 matplotlib.pyplot 的知识,你可以在https://matplotlib.org/users/pyplot_tutorial.html获得这些数据可视化的知识

结果

以下是我在使用训练好的模型后获得的一些结果

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

在我的谷歌协作笔记本上绘制训练示例和结果

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

我们的验证示例的性能

结论

U-Nets 给出了比滑动窗口分割模型更好的结果。他们也处理最少的数据。

进一步改进

请注意,我在这个数据集上使用了 Conv2D 操作。Conv3D 在 4 维数据集上会工作得更好,这通常是光学相干断层扫描图像的情况,因为会保留 3 维空间信息。

作者注

准确性不是一个合适的参数(灵敏度和特异性才是),用来判断为医疗目的而制作的模型的稳健性,但本笔记本旨在使用 Apache MXNet 框架解释 UNet 架构,而不是目前的评估指标。请继续关注仓库,了解关于指标的进一步更新

快乐的计算机视觉和快乐的深度学习。非常感谢你的时间。真的激励我去开发更多,写更多。

细分简介

原文:https://towardsdatascience.com/segmentation-u-net-mask-r-cnn-and-medical-applications-9a84bddf313e?source=collection_archive---------39-----------------------

U-Net、Mask R-CNN 和医疗应用

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

分割在医学成像(定位肿瘤、测量组织体积、研究解剖学、计划手术等)中有许多应用。)、自动驾驶汽车(定位行人、其他车辆、刹车灯等。)、卫星图像解译(建筑物、道路、森林、农作物)等等。

这篇文章将介绍分段任务。在第一部分中,我们将讨论语义分割和实例分割的区别。接下来,我们将深入研究用于语义分割的 U-Net 架构,并概述用于实例分割的 Mask R-CNN 架构。最后一节包括许多示例医学图像分割应用和视频分割应用。

分割任务

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

图片来源:林等 2015 微软 COCO:语境中的常见对象

上图说明了四种常见的图像任务:

  • (a)分类,其中模型输出图像中类别的名称(在这种情况下,人、羊和狗);
  • (b)目标定位,通常称为“目标检测”,其中模型输出图像中每个目标的边界框坐标;
  • ©语义分割,其中模型为图像中的每个像素分配对象类别标签。在本例中,绵羊像素是蓝色的,狗像素是红色的,人像素是蓝绿色的,背景像素是绿色的。请注意,虽然图像中有多只绵羊,但它们都有相同的标签。
  • (d)实例分割,其中模型给图像中的每个像素分配一个“单个对象”标签。在这个例子中,每只羊的像素被分别标记。我们没有一个通用的“sheep”像素类,而是为五只绵羊创建了五个类:sheep1、sheep2、sheep3、sheep4 和 sheep5。

这是语义分割和实例分割之间差异的另一个说明,显示了在语义分割中所有“椅子”像素如何具有相同的标签,而在实例分割中,模型已经识别了特定的椅子:

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

图片来源: StackExchange

以下是对藻类图像的语义分割和实例分割的应用:

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

图片来源: Ruiz-Santaquiteria 等 2020 微观藻类检测中的语义与实例分割。

下图显示了实例分段的模型预测:

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

图片来源:陈等 MaskLab:用语义和方向特征细化对象检测的实例分割。

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

图片来源:皮涅罗等 2015 学习分割对象候选人。

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

图片来源: matterport/Mask_RCNN

U-Net:用于生物医学图像分割的卷积网络

U-Net 论文(可从这里获得: Ronneberger et al. 2015 )介绍了一种语义分割模型架构,这种架构已经变得非常受欢迎,被引用超过 10,000 次(在这个知识库中列出了五十篇不同的后续论文)。它最初是在生物医学图像的背景下提出的,但后来也被应用于自然图像。

U-Net 的基本思想是执行以下任务:

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

细胞/掩模图像来源: Ronneberger 等人 2015

给定输入图像,在这种情况下,是细胞的灰度显微图像,U-Net 模型产生 1 和 0 的二进制掩码,其中 1 表示细胞,0 表示背景(包括细胞之间的边界)。请注意,这是一个语义分割任务,因为所有细胞都接收相同的“细胞”标签(即,我们没有不同的标签来区分不同的单个细胞,就像我们例如分割一样。)

该示意图显示了训练 U-Net 模型的设置:

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

在模型被完全训练之前,对于给定的输入图像,它将产生有问题的二进制分割掩模,例如上图所示的“预测的二进制分割掩模”,其中一些单元丢失或具有不正确的边界。U-Net loss 函数将预测掩码与真实掩码进行比较,以实现参数更新,这将允许模型在下一个训练示例上执行更好的分割。

这是 U-Net 架构:

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

图一。Ronneberger 等人的 2015 年

从这个图中可以看出,“U-Net”这个名字是显而易见的,因为架构图显示了一个 U 形。U-Net 的基本思想是首先通过传统的卷积神经网络获得图像的低维表示,然后对该低维表示进行上采样,以产生最终的输出分割图。

使用右下角提供的架构图很有帮助,它解释了每种箭头类型对应的操作:

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

U-Net 由“收缩路径”和“扩张路径”组成:

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

由图 1 修改而来。2015 年

“收缩路径”是产生低维表示的传统 CNN。“扩展路径”对表示进行上采样,以产生最终的输出分割图。灰色箭头表示复制操作,其中来自“收缩路径”的高分辨率特征地图被复制并连接到“扩展路径”中的特征地图,以使网络更容易学习高分辨率分割。

U-Net 没有任何完全连接的层,这意味着 U-Net 是一个完全卷积的网络。

生成预测分割图:1×1 卷积和像素级 Softmax

在 U-Net 的最后一层,应用 1×1 卷积将每个 64 通道特征向量映射到期望数量的类别,在本文中被认为是两个类别(细胞/背景)。如果你想使用 U-Net 对几个类别进行语义分割,例如 6 个类别(狗、猫、鸟、龟、牛、背景),那么 64 通道特征向量可以映射到 6 个类别(6 个通道)。

这是图 1 的特写,显示了“扩展路径”的最后一部分,其中通过[conv 3×3,ReLU]操作产生 64 通道特征向量,并最终使用代表 1×1 卷积的蓝绿色箭头映射到 2 通道特征向量(细胞与背景):

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

修改自 Ronneberger 等人 2015 的图 1

将逐像素的 softmax 应用于最终的[2 通道,388 高度,388 宽度]表示,以获得最终的输出,即预测的分割图。

像素级 softmax 函数为:

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

关于 softmax 函数的更多细节,见这篇文章

基于像素的 softmax 可以概念化如下。将输出地图想象成 388 x 388 的图像。该图像中的每个像素由 K 个值表示,K 个通道各有一个值,其中 K 是感兴趣类别的数量。对于每个像素,我们在 K 个通道上取一个 softmax,这样一个通道将“突出”为最高值;这个最高通道确定分配给该像素的类别。

U-Net 加权交叉熵损失

使用交叉熵损失来训练 U-Net:

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

这是一个典型的交叉熵损失,增加了权重 w (x) ,它提供了一个权重来告诉模型一些像素比其他像素更重要。

权重图 w 是使用传统的计算机视觉技术基于每个基础事实分割预先计算的。具体地,形态学图像处理被应用于基本事实分割,以识别分隔细胞的细边界,然后创建权重图,使得分隔细胞的这些细边界被赋予高权重。将这个权重图合并到交叉熵损失中意味着,如果 U-Net 遗漏了细胞之间的这些细边界,或者如果它将它们画在错误的位置,它将受到严重的惩罚。在损失中使用权重图的总体目标是“迫使网络学习接触细胞之间的小分离边界[……]”

U-Net 数据增强

构建数据集来训练分段模型是非常耗时的,因为需要手工绘制正确的基本事实分段。因此,最终数据集的大小可能很小。在 U-Net 论文中,作者采用数据扩充来增加训练数据的有效大小。他们对训练样本应用随机移位、旋转、灰度值变化和随机弹性变形。弹性变形在医学图像中特别有用,因为(通俗地说)生物样本通常是“粘糊糊的”,这意味着弹性变形的输出仍然是“真实的”

下面是一些应用于大脑图像的数据增强的例子,来自 Quantib 博客:

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

图片来源: Quantib 博客

总的来说,在发表时,U-Net 模型在细胞语义分割任务上取得了最先进的结果,并且随后被用于各种各样的自然图像和医学图像分割应用。

屏蔽 R-CNN 进行实例分割

实例分段呢?回想一下,在实例分割中,我们不仅仅想要识别细胞与背景像素,我们还想要分离单个细胞。可以执行实例分割任务的一个模型是 Mask R-CNN 。Mask R-CNN 是流行的更快 R-CNN 对象检测模型的扩展。

掩模 R-CNN 的全部细节需要一整篇文章。这是对 Mask R-CNN 背后的思想的一个快速总结,为如何实现实例分割提供了一个思路。

在掩模 R-CNN 的第一部分中,选择感兴趣区域(ROI)。RoI 是输入图像的一部分,其中包含一个概率较高的对象。为每个输入图像识别多个 ROI。

在 Mask R-CNN 的第二部分,如下图所示,每个 RoI 用于获得三个模型输出:

  • 该 RoI 的最终预测类别(对象的类别,例如“人”)
  • 从这个 RoI 获得的最终预测边界框(边界框角的坐标,它提供基本的对象定位)
  • 最终预测的分割(例如,提供非常详细的对象定位的人的轮廓)

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

图片修改自何等 2018 口罩 R-CNN

如果 RoI 与真实边界框有足够的重叠,则被认为是“正的”。掩模 R-CNN 包括掩模损失,其量化预测的分割掩模与基本事实分割掩模的匹配程度。仅针对正 RoI 定义掩模损失,换句话说,仅当相关 RoI 与图像中的真实对象足够重叠时,才定义掩模损失。

在被训练之后,掩模 R-CNN 可以为单个输入图像同时产生类别、边界框和分割掩模注释:

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

图片来源:何等 2018 口罩 R-CNN

掩模 R-CNN 也可以用于关键点检测。在下面的示例中,关键点显示为由线连接的点:

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

图片来源:何等 2018 口罩 R-CNN

创建数据集以训练实例分割模型

有趣的是,要考虑创建适合训练实例分割模型的数据集需要多少工作。一个流行的实例分割数据集是 MS COCO,它包括 328,000 个实例分割的图像。可可小姐的创作分三个阶段:

  1. 类别标记:为每张图片标记每个对象类别的一个实例。每个图像 8 个工人。91 个可能的类别。20,000 工时。
  2. 实例定位:用“x”标记每个对象的每个实例,每张图片 8 个工人。10,000 工时。
  3. 实例分割:对每个实例进行分割,即手动跟踪所有对象实例的轮廓。每幅图像由 1 名训练有素的工人分割,并由 3-5 名其他工人检查。55,000 个工时。

总计 85,000 个工时,相当于一个人每周工作 7 天,每天工作 12 小时,工作时间超过 19 年!

如果您有兴趣进一步探索实例分段,可以从这里下载 COCO 数据集。

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

图片来源:林等 2015 微软 COCO:语境中的常见对象。

医学图像分割

下面是医学成像中一些很酷的分割应用的例子。

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

分割细胞核(深紫色。)来源: matterport/Mask_RCNN在显微图像中分割细胞核

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

核磁共振成像扫描中的脑肿瘤分割。来源:陈等 2019 3D 扩张多纤维网络用于 MRI 实时脑肿瘤分割。

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

在 CTs 中分割肝脏和肿瘤。来源:姜等 2019 AHCNet:注意机制和混合连接在 CT 卷肝脏肿瘤分割中的应用

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

分割肺的不同叶(右上叶、右中叶、右下叶、左上叶、舌部、左下叶)。来源:王等 2019 利用协同引导的深度神经网络自动分割肺叶。

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

分割白内障手术器械。来源:倪等. RAUNet:用于白内障手术器械语义分割的剩余注意 U-Net。

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

腹腔镜手术图像的多器官分割。来源: Haouchine 等人 2016 使用来自点云的结构对术中腹腔镜图像进行分割和标记。

视频分割示例

还可以将分割算法应用到视频中!这里有两个简单的例子:

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

GIF 来源: matterport/Mask_RCNN 。要观看完整的 30 分钟视频,请参见凯罗尔·马杰克的Mask RCNN-COCO-instance segmentation。

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

分割手术机器人。来源: matterport/Mask_RCNN

总结

  • 在语义分割中,每个像素被分配给一个对象类别;
  • 在实例分割中,每个像素被分配给一个单独的对象;
  • U-Net 架构可以用于语义分割;
  • 掩模 R-CNN 架构可以用于实例分割。

关于特色图片

专题图片来自面膜 R-CNN 论文:何等 2018 面膜 R-CNN

最初发表于 2020 年 1 月 21 日http://glassboxmedicine.comT22。

使用无监督学习技术的分割——聚类

原文:https://towardsdatascience.com/segmentation-using-unsupervised-learning-technique-clustering-bb4089c6392e?source=collection_archive---------28-----------------------

基于案例研究的使用分类技术确定高价值细分市场的实践指南

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

梅尔·普尔在 Unsplash 上的照片

“注意—细分练习在医疗保健和以客户为中心的行业中非常常见。细分分析有助于企业将精力和投资集中在高价值、忠诚或未开发的客户上。这对推动增长和收入非常重要。为了帮助您更全面地了解行业中通常是如何进行细分的,作者编写了一个问题陈述和一个虚拟数据来模拟这些分析的实时进行方式。

以下是我们将要讲述的五件事

  • 问题陈述
  • 方法
  • 聚类技术
  • 眼前的步骤
  • 让您的结果具有商业意义

问题陈述

Andias Pharmaceutical 是一家总部位于美国的零售药店,在美国拥有约 3500 家门店。20%的商店每周 7 天、每天 24 小时营业,然而,其余的商店在正常营业时间营业。Andias Pharmaceuticals 在 2019 年第四季度的平均销售额增长了 3%,但客户群几乎保持不变。为了获得更多的病人,它正计划扩大业务,底特律(密歇根州的一个城市)是重点关注的地区。作为该计划的一部分,位于国会街西段的 Guardian 大楼附近的一家社区药房将于 2020 年 5 月开业。这家药店将是底特律第一家此类药店,将全天候运营。它将拥有训练有素的专业人员和药剂师,他们将帮助患者了解他们的保险细节,补充后续措施,药物摄入,甚至记录药丸可能产生的任何副作用。

为了让更多人了解该计划,运营总监 Sheldon Mall 先生希望联系药房内外的医生(也称为内科医生/处方医生)。由于财务部门没有为此计划分配更高的预算,他们计划将活动分为两部分。销售代表(Rep)瞄准高机会医生,直接邮寄给低机会医生。您需要确定 3 到 4 组这样的医生,以便开展活动。

进场

为什么我们需要分类技术?

问题陈述表明,该活动将使用两种不同的媒体展开:

销售代表瞄准 —药店的销售代表将亲自前往与处方医生交谈。由于锁定销售代表的成本远高于数字或直接邮件营销活动,我们需要确定能够带来更多业务的高价值处方商

如何定义高值处方

  • 现有业务良好的处方医生
  • 具有高市场机会的处方者
  • 有经验的处方医生(多年实践)
  • 附属(执业)于多家医院的处方医师
  • 处方量较高的处方者
  • 患者人数较多的处方医生
  • 具有已知专业的处方医生,如肿瘤学家、心脏病专家、家庭医生等。

直邮 —包含商店及其服务信息的小册子将直接邮寄到处方者的地址。

  • 我们可以看到,问题陈述要求我们根据医生/开处方者的执业特征来创建他们的组。活动的类型和活动的内容可以基于组所显示的特征来定制

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

处方者特质对信息传递的影响

聚类技术

什么是聚类?

基于某些标准(也称为变量)对相似的数据实体进行分组的技术。

  • 例如,我们可以根据标准/变量(如收入、患者数量、总处方量、经验年限等)对处方者进行分组

无监督学习 的一种形式——因为算法没有关于不同数据实体如何分组的预定义规则。

  • 例如,数据集没有处方者组的预定义标签。该算法需要研究数据并将每个个体处方者分配到一个组中

所以,这是一种 数据调查 的方法——一种研究数据中重要模式或结构的方法。

  • 例如,算法将研究所用变量的模式,并对数据进行分组。现有收入在 100 美元至 150 美元之间且有 200 至 300 名患者的处方者可以被分组为一个组

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

使用一维数据的聚类示例

  • 我们取一个一维轴,代表一个英超赛季的进球数。这条线上显示的每个点代表一名足球运动员的总进球数
  • 使用传统的统计数据,我们可以知道一个职业联赛赛季的平均进球数是 23 个,但是,如果我们必须根据进球数揭示数据中的一些模式,如球员之间的关系,我们会看到有两到三个更广泛的球员群体
  • K 均值聚类可以发现这样的组或模式,而不需要我们事先告诉它

什么是 K-Means 聚类?

K-Means 算法是一种将数据集划分为多个聚类(比如 K)的方法,这样每个聚类都是不同的,即一个聚类不会与另一个聚类重叠,并且每个数据点只属于一个特定的聚类。它试图以这样一种方式构建聚类,使得一个聚类内的所有点(聚类内点)非常相似,但是来自不同聚类的点(聚类间点)是不同的。

它将数据点分配给一个聚类,使得数据点和聚类质心(属于该聚类的所有数据点的算术平均值)之间的平方距离之和最小。聚类中的差异越小,同一聚类中的数据点就越相似。

优势

  • 当使用的数据集包含连续变量时效果最佳,例如,在问题陈述中,我们需要考虑收入、处方、经验年限、患者人数等指标,这些指标可能包含特定范围内的任何可能值。收入范围从 0 到 1000 美元不等,因此被称为持续收入
  • 当观察的数量很大时,K 均值比其他聚类技术工作得更快,例如,在底特律开业的开处方者的数量是 5000。K-Means 在这种情况下会工作得更快
  • 当聚类变量彼此不同或分离良好时,给出更有利的结果,例如,如果处方者实际上彼此非常不同,那么 K-Means 将产生良好的结果

缺点

  • 无法处理分类变量,即颜色、类型、品牌名称、专业等变量。
  • 如果数据高度重叠,则很难确定 k 个聚类。对于所有数据变量的特征都非常相似的情况,K-Means 通常不能产生不相交的聚类,例如,如果处方者实际上彼此没有很大的不同,那么 K-Means 将产生很差的结果
  • 欧几里德距离可以不平等地加权潜在因素,即在使用 K-Means 形成聚类时,不可能对单个或一组变量进行加权。例如,企业希望包括所有可能的变量,但在聚类过程中更重视收入和患者数量。这在 K-Means 中是不可能的

K-意味着如何工作?

  • 从数据集中随机选择 k 形心,使得每个数据点只能分配给一个形心。通常,大多数算法选择 K 个没有任何缺失值的随机点作为它们的初始质心,然而,对于一些统计包,使用替换=部分或全部的概念来确定初始质心
  • 选择质心后,计算每个数据点和所选质心之间的欧几里德距离。注意,聚类遵循最小平方估计的概念,即对于属于聚类的点,质心和数据点之间的欧几里德距离应该最小
  • 对于数据集中的每个观测值,将计算它们跨这些聚类质心的距离,然后将观测值分配给欧氏距离最短的那个聚类
  • 将观察值分配给一个聚类后,会重新计算质心。聚类质心是分配给每个聚类的观察值的平均值。这个过程持续到满足局部收敛为止,即在当前迭代中形成的聚类类似于在先前迭代中形成的聚类

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

聚类—聚类工作方式的图形表示

直接步骤

数据准备

第一步: **离群点处理:**任何与数据集中其余数据点有很大不同的数据点都被认为是离群点。例如,在开处方者数据集中,大多数收入指标介于 100 美元到 300 美元之间,但是,我们也观察到 1200 美元的值。在这种情况下,1200 美元是一个异常值。然而,一般来说,可以使用下面的方法来识别异常值,这种方法通常被称为 winsorization。

  • 任何超出平均值正负 2/3 标准偏差的值都被视为异常值(两个标准偏差为 5 和 95 个百分点值,而三个标准偏差为 0.3 和 99.7 个百分点值)
  • 或 Q1 之外的任何值-1.5 * IQR 和 Q3+1.5*IQR,其中 Q1 和 Q3 是第一和第三四分位数,IQR 是四分位数之间的范围,被视为异常值
  • 移除异常值取决于业务需求和业务意识,但是建议在执行聚类练习之前移除任何异常值或限制它们
  • 查看数据集时,您可以看到收入数字的巨大差异。总会有开处方者的收入远远高于其他群体。他们是现实中的异类吗?答案是否定的。但是将它们保留在数据集中会使聚类结果产生偏差,因此我们在分析中删除了这些数据

第二步: 缺失值处理。任何缺失的值都应在聚类之前删除或处理。缺失值通常用数据集的中心趋势替换,即所考虑变量的平均值、中值或众数。通常使用像 K-最近邻这样的增强技术来代替集中趋势来处理这些缺失值。

  • 例如,在我们的问题陈述中,当我们处理收入时,我们可以用人口的平均收入替换所有缺失的收入数字,但是在替换多年经验时,我们可以使用人口的模式来替换这些数字。从商业角度看,像底特律这样的地区可能有更多经验丰富的处方医生,因此最好看看人口模式

第三步: **检查聚类变量是否高度相关。**如果变量高度相关,那么可以去掉其中一个变量。这是因为相关变量往往会否定非相关变量的影响和重要性。

第四步: 在运行 K 均值模型之前,标准化所有分析/聚类变量。由于 K-Means 使用欧几里得距离将值分配给它们的聚类,因此在将所有变量用于建模练习之前,确保它们属于相似的范围是很重要的。

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

为什么扩展/标准化在集群中很重要

在上面的示例中,我们看到聚类变量具有不同的标度,因此,与多年的经验相比,收入、患者总数和处方数等更大的变量对距离计算的影响更大。通常,最小-最大缩放、z 分数标准化和对数缩放是行业中使用的一些流行的标准化技术。

[## 对于数据科学的工作,你的编码技能够好吗?

5 编码嗅探如果你在数据科学行业工作,你必须知道

towardsdatascience.com](/are-your-coding-skills-good-enough-for-a-data-science-job-49af101457aa)

代码片段

#--------------------------------Project: Identifying Physician Groups for Community Pharmacy Campaign-------------------
 #--------------------------------Author: Angel Das--------------------------------
 #--------------------------------Create Date: Mar 2, 2020--------------------------------
 #--------------------------------Last Modified: Mar 2, 2020--------------------------------
 #--------------------------------Description: Extract and transform prescriber level information and create clusters using K-Means algorithm--------------------------------#--------------------------------Note: Dummy Data is used for this analysis, not a lot of data is required to complete the analysis#-------------------------------Getting Required Libraries in R--------------------------------------
 install.packages('gdata') #------contains function to read Excel files
 install.packages("corrplot")#------drawing a correlogram
 install.packages("purrr")
 install.packages("factoextra")
 install.packages("dplyr")library(gdata)
 library(corrplot)
 library(purrr)
 library(factoextra)
 library(dplyr)
 #------------------------------Storing Folder address from where inputs will be extracted and outputs will be stored-------------------
 #folder_address="C:/Users/91905/Desktop/Clustering"#--------------------------------Extracting Prescriber Information---------------------------------------
 #--------------------------------QC: 99 observations and 12 variables are read for the analysisprescriber_data=read.csv("C:/Users/91905/Desktop/Clustering/Physician_Data.csv",header=TRUE)#--------------------------------Variable Definition---------------------------------------------------------
 #--1\. HCP: Unique Identifier to of a prescriber
 #--2\. Scripts: Total prescriptions that came to Andias Pharmaceutical in the last 3 months
 #--3\. Market_Scripts: Total prescriptions written in the last 3 months
 #--4\. Revenue: Total Revenue of Andias Pharmaceutical in the last 3 months
 #--5\. Market_Revenue: Revenue generated in the market in the last 3 months
 #--6\. scripts_Share: Scripts/Market_Scripts (share of business)
 #--7\. Revenue_Share: Revenue/Market_Revenue
 #--8\. Pat_count: Patients visiting a prescriber in the last 3 months
 #--9\. Affiliation: Number of Hospitals where an HCP Practices
 #--2\. Experience: Number of Years since the Prescriber has started practicing
 #--2\. Specialty: Specialty of the Prescriber#------------------------------Exploratory Data Analysis in R-------------------------------------------
 #------------------------------Analyzing variables to understand missing observation, mean, median, percentiles etc.prescriber_data_upd<-subset(prescriber_data, select=-c(HCP,Specialty))
 variable_summary=summary(prescriber_data_upd)#------------------------------Display Variable Summary--------------------------------------------------
 variable_summary#--------------------------------Findings: Variables Scripts, Market_Revenue, scripts_share, Affiliation, Experience & Conference_Attended have missing values"
 Once the data summary is obtained, it is important to perform an outlier treatment before missing values are treated.
 As discussed we often replace missing values using Mean, hence mean calculated directly without an outlier treatment will skew the figures.
 "#--------------------------------Box plots to check Outliers-------------------------------------------boxplot(prescriber_data_upd$Scripts, prescriber_data_upd$Market_Scripts, prescriber_data_upd$Revenue, prescriber_data_upd$Market_Revenue,
         main = "Multiple boxplots for comparision",
         at = c(1,2,4,5),
         names = c("Scripts", "Market Scripts", "Revenue", "Market_Revenue"),
         las = 2,
         col = c("orange","red"),
         border = "brown",
         horizontal = TRUE,
         notch = FALSE
 )#--------------------------------Missing Value Treatment------------------------------------------------
 "
 1\. There are two ways to treat missing values. Omit all records which have at least one missing value using na.omit()
 2\. Replace observations with missing value using population mean, median and mode. This is preferable for any business problem
 as you don't want to lose out an entity just because one field or two fields are missing. Comes in handy especially where the number of observation
 is less."#--------------------------------Removing records with missing value---------------------------
 #--------------------------------QC: 80 observations
 prescriber_data_mst<-na.omit(prescriber_data_upd)#---------------------------------Correlation Check. Pearson Correlation coefficient--------------------correlation_data<-round(cor(prescriber_data_mst,method="pearson"),2)#--------------------------------Use corrplot() to create a correlogram--------corrplot(correlation_data, type = "upper", order = "hclust", 
          tl.col = "black", tl.srt = 45)
 wss <- function(k) {
   kmeans(prescriber_data_scale, k, nstart = 10)$tot.withinss
 }# Compute and plot wss for k = 1 to k = 15
 k.values <- 1:10# extract wss for 2-15 clusters
 wss_values <- map_dbl(k.values, wss)"
 Revenue, Scripts Share, and Pat Counts are highly correlated. This is because higher the scripts, higher the revenue and patient count"#---------------------------------Retaining non-correlated variables: Scripts, Market Revenue, Revenue Share, Affiliation, conference attended and experience---------------------------wss_valuesprescriber_data_req<-subset(prescriber_data_mst, select=c(Scripts,Market_Revenue,Affiliation,Conference_Attended,Revenue_Share,Experience))#--------------------------------Standardizing Variables: Make sure to remove any categorical variable during scaling-----------------------------------
 prescriber_data_scale<-scale(prescriber_data_req)#--------------------------------Clustering: Elbow Plot
 set.seed(123)# function to compute total within-cluster sum of squareplot(k.values, wss_values,
      type="b", pch = 19, frame = FALSE, 
      xlab="Number of clusters K",
      ylab="Total within-clusters sum of squares")

决定 K-均值中的 K

在运行 K 均值算法时,决定聚类的数量是很重要的。由于 K-Means 聚类是一种无监督学习形式,因此事先并不知道最适合数据集的聚类数。你可以按照下面的步骤得出 k 的最佳值。

步骤 1 :对于 i=1 到 n(其中 n 表示所需的最大集群数),运行以下步骤:

  • 步骤 1.1 :设置 K=i,使用任意聚类函数进行聚类(基本上会创建 K 个聚类)。对于 i=1,将创建一个集群,对于 i=2,将创建两个集群,依此类推
  • 步骤 1.2 :找出创建的 K 个聚类的 SSE(误差平方和)。 SSE 是一个点到聚类质心的距离的平方之和
  • 步骤 1.3 :重复步骤 1.1 & 1.2,直到 i=n,即循环遍历所需的最大聚类数

第二步:使用折线图绘制上证综指穿过 k 线

**第三步:**用折线图绘制上证综指在 k 线上的变化。这将有助于随着集群数量的增加,可视化 SSE 的变化

**第四步:**计算每个聚类值的输出,如总内数、中间数、方差分析、大小以及中间数与内数之比

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

弯头绘图图

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

集群 EDA

cluster_results=kmeans(prescriber_data_scale,8, nstart=13)
 #cluster_resultsfviz_cluster(cluster_results, data = prescriber_data_scale)cluster_numbers<-as.data.frame(cluster_results$cluster)
 names(cluster_numbers)[1] <- "cluster"final_result=cbind(prescriber_data_req,cluster_numbers)write.csv(final_result,"C:/Users/91905/Desktop/Clustering/Results.csv")final_result %>%
   group_by(cluster) %>%
   summarise_all("mean")

让您的结果具有商业意义

一旦结果出来,对你的结果进行商业意义上的分析是很重要的。以下是我遵循的一些最佳实践:

  • 计算每个聚类组的描述性统计数据,即参与聚类的所有变量的平均值、中值、最小值和最大值
  • 描述性统计将帮助我们理解和识别每个聚类的特征。在上面的例子中,具有较低收入和较高市场脚本的聚类表示具有机会或潜力的处方者群体,即他们具有良好的市场存在,但是为 Andias 药房编写的脚本很少
  • 为每个集群指定业务名称,而不是集群编号。利益相关者更容易理解每个集群的含义,而不仅仅是查看图表
  • 记住,任何业务都需要理解不同的集群意味着什么。这给了他们对细分的信心,以及某个特定的计划是否合适

最后,如果时间允许,进行一个快速的前后分析,以检查这些分类的描述性统计数据是否随时间而变化。

[## Hive 简介

Hive & SQL 编码初学者指南

towardsdatascience.com](/introduction-to-hive-859ba31a5769)

关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;可以和我在 上联系 推特

使用 K 均值、RFM 和交易记录对客户进行细分

原文:https://towardsdatascience.com/segmenting-customers-using-k-means-and-transaction-records-76f4055d856a?source=collection_archive---------21-----------------------

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

rupixen.comUnsplash 上拍照

在本文中,我将向您介绍我是如何应用 K-means 和 RFM 分割来根据在线礼品店客户的交易记录对他们进行聚类的。

介绍

上大学的时候,我开了一个简单的卖宠物用品的网店。当时,我只收集了足够的客户信息来进行销售,并把我的产品卖给他们。简单来说,我只有他们的交易记录和地址。

当时,我认为我没有足够的信息来进行任何有用的细分。但是,我最近偶然发现了一种叫做 RFM ( R 频率 F 频率 M 一元值)的直观分割方法,它可以很容易地应用于基本的客户交易记录。

关于 RFM 分割

以下是 RFM的每个字母的含义:

  • R ecency:客户上次向您购买产品已经有多长时间了(例如,几天,几个月)?
  • F 频率:客户在一段固定时间内(如过去 3 个月、去年)从你这里购买了多少次
  • M 一元值:客户在一段固定时间内(应该是为 F 频率设置的同一时间段)在您的商店消费了多少钱。

我们可以对客户进行分组,并根据 RFM 分数提出商业建议。例如,您可以提供促销活动来重新吸引最近没有在您的商店购物的顾客。你可以进一步优先考虑你的促销策略,把重点放在那些经常购买并且至少花费平均货币价值的顾客身上。

使用 K-Means 代替传统的方法

传统的 RFM 方法要求你手动对客户的 RFM 特征从 1 到 5 进行排名。定义等级的两种方法是创建相等间隔的组(例如,范围/5),或者基于百分位数对它们进行分类(那些达到第 20 百分位数的将形成等级)。

既然我们是数据科学家,为什么不使用无监督的学习模型来完成这项工作呢?事实上,我们的模型可能比传统方法表现得更好,因为它根据客户的 RFM 值而不是他们的排名对客户进行分组。

数据

数据集来自 UCL 的机器学习知识库。该文件包含一家英国在线礼品店在 2009 年至 2010 年以及 2010 年至 2011 年期间的 100 万条客户交易记录。excel 文件中有两张表(每年一张),每张表都有相同的 8 个特征:

  • 客户 ID
  • 国家/地区(我没有真正关注这一点,因为大多数客户也来自英国)
  • 发票代码
  • 发票日期
  • 股票代码
  • 股票描述
  • 单价
  • 单位数量

数据清理

由于两个数据集包含相同的要素,我将其中一个附加到另一个上。接下来,我删除了具有以下内容的行:

  • 缺少客户 ID
  • 缺少库存描述
  • 不符合预期格式的异常股票代码,例如以字母开头且少于 5 位数的股票代码。这些往往来自手动输入(股票代码“M”)、邮费(股票代码“DOT”)和取消订单(股票代码以“C”开头)。然而,我保留了以字母结尾的库存代码,因为这些代码倾向于表示产品差异(例如,图案、颜色)。

在为每个客户创建了 RFM 特征之后(参见特征工程),我还移除了偏离平均值超过 4 个标准差的极端异常值。移除极端异常值非常重要,因为它们会扭曲使用基于距离的测量的无监督学习模型。

特色工程

为了得出客户的最近购买时间,我计算了组合数据集中最近一次购买和客户最后一次购买之间的时间差(以天为单位)。分数越低表示购买时间越近,这对商店越有利。

我通过聚合创建了与每个客户的购买频率(在 2 年内)和总支出(货币价值)相对应的特征:

  • 频率:统计每个客户的唯一发票代码的数量
  • 货币价值:所有购买物品的价格总和

我还创建了其他特性,我认为这些特性是有用的集群描述符:

  • 每张发票的总支出
  • 订单之间的时间(天数)

使用轮廓分数选择无监督学习模型

剪影分数可用于评估地面真相未知的无监督学习模型的质量。轮廓分数测量观察值与其自己的聚类相比与其他聚类的相似程度。

值越接近 1 表示聚类分离越好,而值越接近 0 表示聚类重叠。避免负值。

我对数据应用了 3 个无监督学习模型,并选择了 K-Means,因为它具有最佳的轮廓分数,而不管聚类的数量。

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

基于聚类数的无监督学习模型的轮廓分数

选择 K-均值聚类的数目

为了选择簇的数量(n_clusters),我考虑了每个簇的轮廓分数。最佳情况下,每个聚类的系数值应高于平均轮廓得分(在图中,每个聚类的峰值应超过红色虚线)。我还考虑了每个集群的 RFM 值。

我改变了 K 均值聚类的数量,并检查了模型的 RFM 值和轮廓分数。我决定使用 n_clusters =5,而不是更低的值,尽管剪影得分更低,因为只有当 n_clusters = 5 时,具有良好 RFM 值的重要客户群才会出现。出现在 n_clusters = 5 之外的聚类不太重要,因为它们具有较差的 RFM 分数。

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

描述 n 个聚类的轮廓分数的表,以及每个聚类的系数值是否高于每个模型内的平均轮廓分数

可视化和描述集群

选择了一个无监督的学习模型和适当数量的聚类后,我使用 3D 绘图可视化了这些聚类。

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

使用 RFM 分割和 K-均值得出的描述客户细分的 3D 图

聚类 4 和聚类 2 具有更好的 RFM 分数,代表商店的核心顾客。其他 3 个群体似乎是购买频率较低的因果型客户。

核心客户

根据该数据集,18%的客户是核心客户,他们在过去两年中贡献了 62%的收入。他们花钱多,采购频繁,每一两个月一次,还在和店家接洽。由于在线商店产品的典型价格往往较低,集群的平均支出表明他们正在大量采购,因此他们可能是批发商和转售商店商品的较小商店。

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

描述核心客户主要特征的表格。非百分比数字代表平均值。

散客

至于临时顾客,我想强调一下第 0 类顾客(我称之为礼品猎人),因为他们对商店来说是最重要的。他们贡献了大约四分之一的收入,这比其他休闲集群多得多。他们倾向于每个季度从商店购买一次少量商品,这表明他们是为特殊场合购买的个人。

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

描述临时客户主要特征的表格。非百分比数字代表平均值。

可以采取的促销策略

鉴于集群的特点,我提出以下针对关键群体的推广策略:

  • 批发商:考虑到他们的数量很少,让他们直接参与进来建立商誉和忠诚度可能是有意义的。最好用定制的解决方案锁定它们。
  • 小商店:探索可以在后续购买中使用的返现折扣。这也将降低他们的成本,鼓励他们花更多的钱。
  • 寻找礼物者:在特殊场合前吸引他们,给他们免费礼物,最低消费高于他们目前 347 英镑的平均消费,鼓励他们多花钱。

结束掉…

我认为 RFM 细分与无监督学习模型非常匹配,因为它们消除了营销人员手动细分客户记录的需要。我希望我已经阐明了如何从最基本的客户信息中创造有意义的客户群。更多细节,你可以看看我的笔记本。它包含了我研究的其他模型的代码和细节。

感谢阅读!

从多个维度对客户进行细分(或者为葡萄酒爱好者使用 Python)

原文:https://towardsdatascience.com/segmenting-your-customers-on-many-dimensions-or-python-for-wine-lovers-8e7768bf86d6?source=collection_archive---------26-----------------------

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

使用 K-意味着对两个或三个以上的属性进行聚类。

我最近读了一本关于数据分析的书,名为 Data Smart ,作者是 MailChimp 的产品负责人约翰·福尔曼。这本书是一本优秀的商业分析入门书,带你了解各种机器学习用例,包括样本数据集和如何在 Excel 中设置和解决每个案例的详细说明。

有一个案例特别引起了我的注意。它描述了一个虚构的葡萄酒批发企业,该企业希望通过根据购买行为将客户(餐馆和酒店老板)分成不同的群体来优化销售。这是各种各样的企业面临的一个非常普遍的问题,从沃尔玛和塔吉特百货这样的大型零售商到你友好的社区酒类商店。在我看来,这是一个用聚类算法实践我的新 Python 技能的好机会。

提供的数据集包括两个文件,一个列出了一年中提供的大约 36 种产品折扣,另一个列出了客户及其购买细节。目标是找出未来哪种类型的折扣最吸引哪些客户。这是一个典型的客户细分或聚类问题。

每个折扣优惠都有六个属性——月份、葡萄酒品种、最小数量、折扣百分比、原产国和过去的峰值(T/F)。这里列出了 32 种不同的优惠,每种都有不同的属性组合。客户列表包括大约 100 个客户的 324 笔交易。因此,这个挑战涉及的维度比你通常在聚类的机器学习教程中看到的要多得多。

福尔曼先生做了一项出色的工作,带领读者在 Excel 中使用几种类型的成分距离计算方法(欧几里德距离、曼哈顿距离和余弦距离)完成 K 均值聚类过程。这对于小数据集很有效,但是当你进入数十万或数百万行时,Excel 就不管用了。在这本书的最后,福尔曼先生用他最喜欢的大数据语言 R 重新创建了每个分析,但不是用 Python。因此,我尝试为这个集群用例创建一个 Python 教程。我已经上传了完整的 Python 笔记本到我的 Github 库这里

第一步是使用 pd.read_csv 命令将两个数据文件上传到 Pandas dataframes 中。这是两个数据框架。

优惠:

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

客户/交易:

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

第 2 步是创建一个数据透视表矩阵,它可以被输入到 Python 中的 Scikit Learn 库中提供的 K-means 聚类算法中。该矩阵将显示垂直列为索引的客户,顶部显示报价数字,每笔交易显示为“1”值,所有空值都转换为“0”。下面是代码和对结果矩阵的快速查看。

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

为了开始聚类过程,我们需要选择我们想要开始的聚类的数量,即使我们还不知道最佳数量是多少。最常见的方法是创建一个“Scree 图”,该图显示随着聚类数量的增加,类内误差平方和(WCSSE)即“失真”逐渐减少。你希望看到的是图表上 WCSSE 下降趋于平稳的一点。这就是所谓的“肘点”。下面是代码和最终的 Scree 图。

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

显然,这个图并没有显示出我们想要看到的真正清晰的“拐点”。我认为这表明这些数据比我们希望的要混乱一些。但这在现实世界中并不罕见。每次给定一个数据集都能快速生成清晰简明的见解是相当不寻常的。尽管如此,如果我们愿意花一些时间研究不同的参数,我们仍然可以做出一些有趣的观察。

在上面的碎石图中,看起来有两个点,在这两个点上,线的斜率减小,分别在 3 个簇和 8 个簇处。让我们尝试另一种过滤技术来帮助确定 K-means 算法的聚类数,剪影分数

轮廓分数将每个聚类中的数据点之间的平均距离与相邻聚类中的数据点之间的平均距离进行比较。它是一个介于-1 和 1 之间的值。越接近 1 越好。

我已经计算了下面每一组的轮廓分数。

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

看起来最高的平均分是四类和八类。因此,让我们尝试八个集群,看看会发生什么。

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

既然我们已经提供了与每个集群的事务计数一致的详细信息,我们就可以按照从大到小的顺序对每个集群进行排序,并观察详细信息中的模式。

在第一个聚类“0”中,我们观察到所有这些买家都是黑皮诺爱好者。

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

在第二组“1”中,我们观察到这些人是亲法分子。他们喜欢法国制造的任何东西。

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

通过聚类“2”,我们找到了所有的起泡酒爱好者。

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

通过聚类“3”,我们找到了更多的起泡酒爱好者。有了这种重叠,也许我们应该合并集群 2 和集群 3?

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

在聚类“4”中,我们观察到不同品种的混合,但大多数购买量较低。因此,这些人可能是我们推销剩余交易的对象。

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

在聚类“5”中,我们看到一些噪音,但是我们可以观察到这些人似乎既喜欢起泡酒又喜欢红酒。

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

在聚类“6”中,除了霞多丽,这些人似乎也喜欢红酒和起泡酒。也许我们应该合并第五组和第六组?

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

最后,对于聚类“7”,我们观察到更多红酒和起泡酒买家的组合,加上一些“吵闹的”灰皮诺买家。

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

在这八个集群中,我们发现了一些重叠和其他有些嘈杂的结果。那么,如果我们尝试另一个 K-means 算法运行,这次只有四个集群,会发生什么呢?

这一次我们得到了更清晰的结果:

一群香槟和红酒爱好者,大多是亲法人士。

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

闪闪发光的泡泡风扇。

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

低销量买家。

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

以及我们永远忠诚的黑皮诺爱好者!

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

那么我们今天在这里学到了什么?即使是包含许多不同维度的有点嘈杂的数据集,我们也可以使用 K-means 聚类将我们的客户分为不同的组,从而揭示有趣的购买模式,这将为我们提供一些关于未来特殊折扣优惠的想法,以优化我们的销售结果。

具体来说,我们发现了香槟迷、红酒迷、黑皮诺爱好者和低销量买家这几个截然不同的群体来推销我们的剩菜。您可能还会发现,只有一两个属性真正有所不同。在这种情况下,它是葡萄酒品种类别,在较小的程度上,是购买的最小数量。

在这个特殊的用例中,虚构的买家是餐馆和酒类商店的老板,或者“B2B”买家。如果我们面对的是个人零售客户呢?如果我们还可以获得客户的外部数据,让我们有更多的属性进行排序,比如平均收入、生活方式偏好、社会关系或工作类型,这不是很有趣吗?这难道不允许我们将营销计划提升到一个全新的水平吗?

现在有成千上万的数字经济企业在收集这类关于我们的数据。脸书、谷歌和亚马逊是这一群体中最知名的。虽然这听起来有点像“老大哥”,但实际上这和你友好的邻居杂货商几代人以来一直坚持的“了解你最好的顾客”的习惯是一样的。

但是现在随着云计算资源和像 Python 这样容易学习的计算语言的出现,这种聪明的商业思维可以扩大到数百万的数量!欢迎来到大数据的美丽新世界!

如果您有意见或想法要与我分享,请通过 LinkedIn 联系我

选择行时使用。通信线路(LinesofCommunication)

原文:https://towardsdatascience.com/selecting-rows-with-loc-276d217c4ea5?source=collection_archive---------33-----------------------

数据科学/ Python 代码片段

从熊猫数据框架中选择数据子集的初学者指南。

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

丘特尔斯纳普Unsplash 上拍照

作为数据科学家,我们大部分时间都在用熊猫处理数据。在本帖中,我们将关注。根据一些预定义的条件来选择行。

我们打开 Jupyter 笔记本,我们来扯皮吧!

数据

我们将使用来自圣安东尼奥市开放数据网站的 311 服务呼叫数据集来说明不同之处。锁定技术有效。

家政

在我们开始之前,让我们先做一点家务。

这里没什么特别的。我们只是导入强制的 Pandas 库并设置显示选项,这样当我们检查数据帧时,列和行就不会被 Jupyter 截断。我们将它设置为显示单个单元格中的每个输出,而不仅仅是最后一个。

在上面的代码中,我们定义了一个函数,它将向我们显示缺失值或空值的数量及其百分比。

获取数据

让我们将数据加载到数据帧中。

快速浏览一下df.head(),我们将看到前五行数据:

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

df.info()将让我们看到列的数据类型。

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

然后,show_missing(df)向我们显示数据中是否有丢失的值。

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

选择列是否为空的行。

让我们选择'Dept'列有空值的行,并过滤排除了空值的数据帧。

首先,我们对“Dept”列进行了值计数。方法.value_counts()返回一个熊猫系列,列出指定列的所有值及其频率。默认情况下,该方法忽略 NaN 值,并且不会列出它。但是,如果您包含参数dropna=False,它将在结果中包含任何 NaN 值。

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

接下来,行df_null = df.loc[df['Dept'].isnull()]告诉计算机选择df中列'Dept'为空的行。产生的数据帧被分配给df_null,它的所有行将作为“Dept”列中的值。

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

类似地,行df_notnull = df.loc[df['Dept'].notnull()]告诉计算机选择df中列'Dept'不为空的行。产生的数据帧被分配给df_notnull,并且它的所有行在‘Dept’列中没有任何 NaN 值。

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

这两种技术的一般语法如下:

df_new = df_old.loc[df_old['Column Name'].isnull()]
df_new = df_old.loc[df_old['Column Name'].notnull()]

选择列为特定值的行。

'Late (Yes/No)'专栏看起来很有趣。让我们来看看吧!

同样,我们对'Late (Yes/No)'列进行了快速的数值计算。然后,我们过滤掉那些晚于df_late = df.loc[df['Late (Yes/No)'] == 'YES']的案例。类似地,我们反其道而行之,将'YES'改为'NO',并将其分配给不同的数据帧df_notlate

除了在列和我们想要比较的值之间增加了一个==符号之外,语法和前面的例子没有太大的不同。它基本上是针对每一行,询问特定列(左侧)上的值是否与我们指定的值(右侧)相匹配。如果匹配为真,则在结果中包含该行。如果匹配是假的,它忽略它。

以下是df_late的结果数据帧:

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

这是给df_notlate的:

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

这种技术的一般语法是:

df_new = df_old.loc[df_old['Column Name'] == 'some_value' ]

选择列不是特定值的行。

我们已经学习了如何基于“是”和“否”来选择行,但是如果值不是二进制的呢?例如,让我们看看“类别”列:

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

192,197 行或记录没有分配类别,但是我们得到的不是 NaN、empty 或 null 值,而是类别本身。如果我们想过滤掉这些呢?回车:!=操作符。

像往常一样,我们对'Category'列进行了常规值计数,以查看我们正在处理的内容。然后,我们创建了df_categorized数据帧,以包含df数据帧中任何在'Category'列中没有'No Category'值的记录。

下面是对df_categorized数据帧的'Category'列进行数值计算的结果:

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

如上面的截图所示,值计数保留了除“无类别”之外的所有内容。

这种技术的一般语法是:

df_new = df_old.loc[df_old['Column Name'] != 'some_value' ]

基于多个条件选择行。

让我们考虑下面的列,'Late (Yes/No)''CaseStatus':

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

如果我们想知道现在哪些打开的案例已经通过了 SLA(服务级别协议),该怎么办?我们需要使用多个条件来过滤新数据框架中的案例或行。输入&符。

语法与前面的相似,除了在括号中引入了&操作符。在df_late_open = df.loc[(df[‘Late (Yes/No)’] == ‘YES’) & (df[‘CaseStatus’] == ‘Open’)]这条线上,有两个条件:

  1. (df[‘Late (Yes/No)’] == ‘YES’)
  2. (df[‘CaseStatus’] == ‘Open’)

我们希望这两个都为真来匹配一行,所以我们在它们之间包含了操作符&。简单地说,&位操作符就是 AND 的意思。其他按位运算符包括表示 or 的管道符号|和表示 NOT 的波浪号~。我鼓励您尝试使用这些按位运算符,以便更好地了解它们能做什么。只要记住将每个条件用括号括起来,这样就不会混淆 Python。

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

这种技术的一般语法是:

df_new = df_old.loc[(df_old['Column Name 1'] == 'some_value_1') & (df['Column Name 2'] == 'some_value_2')]

选择列值属于某个值列表的行。

让我们看看'Council District'列的值计数:

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

如果我们想把重点放在第 2 区、第 3 区、第 4 区和第 5 区,因为它们位于圣安东尼奥南部,并且以城市服务质量差而闻名,会怎么样?(顺便说一句,这完全是我瞎编的!)在这种情况下,我们可以像这样使用.isin()方法:

记得在.isin()方法中像['choice1', 'choice2', 'choice3']一样传递你的选择,否则会导致错误。对于我们例子中的整数,没有必要包含引号,因为引号只适用于字符串值。

这是我们新数据框架df_south的结果:

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

这种技术的一般语法是:

df_new = df_old.loc[df_old[Column Name'].isin(['choice1', 'choice2', 'choice3'])]

结论

就是这样!在本文中,我们将 311 服务调用数据加载到一个数据帧中,并使用.loc方法创建了数据子集。

感谢阅读!我希望你喜欢今天的帖子。数据争论,至少对我来说,是一项有趣的练习,因为这是我第一次了解数据的阶段,它给了我一个机会来磨练我在面对真正混乱的数据时解决问题的技能。快乐的争吵的人们!

敬请期待!

你可以通过推特或 T2【LinkedIn】联系我。

[1]圣安东尼奥市公开数据。(2020 年 5 月 31 日)。 311 服务电话。https://data.sanantonio.gov/dataset/service-calls

选择效应——它是什么,为什么重要

原文:https://towardsdatascience.com/selection-effect-what-it-is-and-why-it-is-important-33e9a6b05d55?source=collection_archive---------15-----------------------

营销分析师应该注意选择效应。如果不加以检查,选择效应偏差会导致误报和错误的投资。

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

来源:Pixabay 开放许可

选择效应是对任何营销分析有效性的普遍威胁。因此,分析师应该敏锐地意识到这一现象,以确保他们不会夸大营销影响。

这篇文章简要讨论了选择效应,以及我在营销分析的日常工作中是如何努力克服这种偏见的。

这绝不是一个权威的指南——你可以在这里找到关于选择效应的学术文章和这里

从介绍开始

选择效应是当一种方法、应答样本或分析偏向于目标人群的特定子集时引入的偏差。这意味着它不能反映作为一个整体的实际目标人群。

让我们来看几个简单的例子。

**例一。**您对 SEM 活动进行分析。您的分析着眼于您通过链接点击购买付费搜索广告的投资回报率(ROI)。然而,该分析并没有考虑那些无论如何都会购买你的产品的“点击链接者”。在这个例子中,没有考虑选择效应意味着你的分析给了你的 SEM 广告不适当的信任,投资回报率被夸大了。

**例二。**你测试了保健食品的整体品牌认知度,并决定通过在健身房和健康商店的面对面访谈来收集数据。在本例中,数据是有偏差的,因为您的方法针对的是经常去健康相关场所的人群,因此他们很可能倾向于健康食品。这可能会夸大你的保健食品的整体品牌知名度。

通过一个非常小的跳跃,例 1 显示了当选择效应被忽略时,任何归因算法都很容易过分相信 SEM 广告。

例子 2 强调了没有仔细询问可能的偏见的实验的危险。

使用这两个例子,很容易想象忽略选择效应会如何迅速导致容易出错的结果,从而导致糟糕的投资建议和大量浪费的营销投资的恶性循环。当然,没有人希望这样。

最小化选择效应的方法

选择效应是营销分析中一直存在的挑战。这部分是由于工作的性质,部分是由于组织偏好精选分析技术、快速跟踪实验和积极的结果。

以下是我在自己的实践中尝试最小化选择效应的几种方法:

  • 随机对照试验(RCT)—RCT 是我实验和衡量增量营销活动的黄金标准。良好的实验是最小化选择效应的核心,在目标人群中进行随机对照试验是获得代表性结果的最佳方式之一。由于一些媒体策略的复杂性和无法控制印象,RCT 在营销中并不总是可行的。也就是说,我总是从 RCT 作为最佳实践开始。
  • 在多个实验中验证学习成果——只要实验设计合理,在多个实验中验证学习成果是建立对特定证据的信心和最小化意外选择效应的一个很好的方法。
  • 在开始之前记录测量设计、目标和分析类型——提前定义测量设计和分析技术有助于最大限度地减少分析类型或细分带来的选择影响。选择效应可能在分析过程的不同阶段悄悄出现,因此在整个过程中保持勤奋非常重要。
  • 标准化模板、记录的受众定义和正式报告流程 —除了提前定义测量设计,标准化模板和报告流程还有助于在整个分析过程中最大限度地减少偏差。这是通过确保有一致的方法、格式和受众定义来限制分析师在细分受众或显示结果以突出目标人群子集的某个结果时选择效应偏差的能力。
  • 媒体组合的随机可变性 —随机可变性是指在给定的时间框架内,通过媒体渠道发布的印象数量中引入显著可变性的做法。这是针对由于复杂的媒体组合而无法选择随机对照试验的情况,因此需要对营销影响进行建模。在媒体投放中实施随机和高度可变性是一种实验性杠杆,用于操纵自变量(例如,印象)并试图评估对因变量(例如,购买)的任何影响。这种不自然的随机化是减少选择效应的一种方式,它通过在活动中插入随机控制的元素(来自 RCT 剧本),即使整个实验是不可控的。
  • 同行评审是检查某些证据有效性的另一种方式。我们经常会陷入自己的工作中,以至于需要外界的意见才能注意到任何未受抑制的选择效应。测量计划和分析结果的同行评审有助于限制任何无意的选择效应。

偏见就像死亡和税收

归根结底,偏见始终存在,选择效应也不例外。事实上,人类创造的任何事物都有这样或那样的偏见。我们能做的最好的事情就是意识到不同的偏见,并采取措施尽可能地限制这些偏见。

选择效应与我们这些营销分析人员尤其相关。因此,它应该是我们要追踪和最小化的偏见列表中的首要问题。在我看来,在分析工作流程的所有阶段限制选择效应的可能性的最佳方式是通过 RCT、标准化流程和经验证的学习的结合。

硒在起作用

原文:https://towardsdatascience.com/selenium-in-action-2fd56ad91be6?source=collection_archive---------25-----------------------

自动化示例

Python 中的网络抓取和自动化

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

卡尔·海尔达尔在 Unsplash 上拍摄的照片

1.硒简介

你们中的许多人可能以前在 Python 中玩过 web 抓取。有几个 Python 包可以根据网页(HTML)元素提取网站信息;一些例子是 BeautifulSoupScrapyurllib 2。这些包通常依赖 XPATH 或 CSS 等 web 元素来提取数据。它们各有利弊,但它们可以毫无问题地处理来自许多网站的抓取。

然而,越来越多的网站采用 JavaScript 和其他方法来增加抓取的难度,甚至完全阻止抓取。例如, NYPD 开放数据门户的“下载”按钮直到用户点击“导出”按钮后才会显示。因此,使用 XPATH 或 CSS 的常规抓取方法将无法正常工作,因为直到用户单击按钮时才会找到 web 元素。在你开始拔头发之前,硒来拯救你了!

传统上,Selenium 被设计用于 web 应用程序的自动化测试。这个包的本质是自动化浏览器行为,它可以在很多语言中使用,比如 Java、Python、Ruby 等。因为 Selenium 模仿用户行为,所以一个明显的缺点是速度。然而,由于像人一样自由地行动,Selenium 是一个强大的 web 抓取工具,与传统的 web 抓取包相比,它的限制最少。让我们深入研究一下,看看它是如何工作的。

2.设置 Selenium Webdriver

为了部署 Selenium,您需要根据您的操作系统为您的浏览器设置 Webdriver。这里我将以 Chrome 为例。

  • 第一步:找到你的 Chrome 版本。你可以在“关于谷歌浏览器”找到你的浏览器版本

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

关于谷歌浏览器

  • 第二步:根据你的 Chrome 版本下载 网络驱动
  • Windows 用户的第 3 步:你需要下载基于你的系统(32 位或 64 位)的 Chrome Webdriver,然后将chromedriver.exe放在你的路径中。
  • Mac 用户第三步:下载 Mac 版 Chrome 驱动后,导航到这个目录/usr/local/。然后检查bin文件夹是否存在。如果不存在,创建一个bin文件夹,将驱动程序放在/usr/local/bin中。运行cd ~/bin && chmod +x chromedriver使其可执行。

3.一个例子:USAC 开放数据——电子汇率数据

以下是练习中需要的包。让我们导入它们吧!

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
import requests
from urllib.parse import urljoin
import pandas as pd
import time

现在你已经设置好了 Chrome Webdriver 环境,让我们将 Selenium 投入使用吧!在本文中,我将使用 USAC E-Rate 数据门户作为一个例子。假设用户想要下载所有与 E-rate 相关的数据集,让我们在这个数据门户上设计用户路径,然后我们将尝试用 Selenium 复制用户操作。

步骤 1:收集所有与 E-Rate 相关的数据集 URL

我们将前往 USAC 开放数据搜索 E-rate 数据集。我们发现结果页面只有 2 页,因此我们可以编写以下代码来抓取所有与 E-Rate 数据相关的 URL,供 Selenium 稍后使用。

result_links = []
# Get all e-rate URLs from USAC data page
for i in range(2): # 2 is the total number of pages
 url = ‘[https://opendata.usac.org/browse?category=E-rate&limitTo=datasets&page='](https://opendata.usac.org/browse?category=E-rate&limitTo=datasets&page=') + str(i + 1)
 req = requests.get(url)
 soup = BeautifulSoup(req.content)
 erate_links = lambda tag: (getattr(tag, ‘name’, None) == ‘a’ and
 ‘href’ in tag.attrs and
 ‘e-rate’ in tag.get_text().lower())
 results = soup.find_all(erate_links)
 links = [urljoin(url, tag[‘href’]) for tag in results]
 links = [link for link in links if link.startswith(‘[https://opendata.usac.org/E-rate’](https://opendata.usac.org/E-rate'))]
 result_links.extend(links)print(‘In total, there are ‘ + str(len(result_links)) + ‘ links retrieved.’)

执行时,会弹出一条消息:“总共检索到 15 个链接。”

步骤 2:下载 E-Rate 数据集,用数据字典 pdf 抓取相关元数据

现在我们已经有了想要下载的数据集的所有链接,下一步将是下载它们。如果我们是用户,操作链将是:我们将点击链接,然后点击“导出”按钮,最后选择 CSV 选项进行下载。

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

导出按钮

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

CSV 按钮

一些额外的元数据也将有助于数据集文档。在数据集页面上,我们希望获得一些关键项目,包括简介、更新日期、联系人、电子邮件、更新频率和更新 url。这些元数据可以在“关于这个数据集”一节中找到。

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

元数据部分

这里有一个简单的例子,展示了如何使用 Selenium 来自动化重复性工作和构建数据收集。请注意,睡眠时间是任意的。这里的目标是像人类一样行动,所以确保你的行动链有意义,并分配一个适当的睡眠时间。

# set up driver
driver = webdriver.Chrome()# set up dataframe for metadata
metadata = pd.DataFrame(columns = ['Intro', 'Update Date', 'Contact', 'Email', 'Update Freq', 'URL'])for i in range(len(result_links)):
    # extract metadata by XPATH
    data_dict = {}
    driver.get(result_links[i])
    intro = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/div/div[1]/table/tbody/tr[1]/td[2]/span").text
    update_date = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/dl/div[1]/div/div[1]/div/dd").text
    contact = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/dl/div[3]/div/div[2]/dd").text
    email = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/div/div[1]/table/tbody/tr[4]/td[2]/span/a").text
    update_freq = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/div/div[1]/table/tbody/tr[6]/td[2]/span").text

    # update data_dict with new metadata
    data_dict.update({'Intro': intro, 'Update Date': update_date,
                     'Contact': contact, 'Email': email, 
                     'Update Freq': update_freq, 'URL': result_links[i]})
    # update dataframe
    metadata = metadata.append(data_dict, ignore_index = True)

    time.sleep(5)
    action = ActionChains(driver)

    # Click Show More
    showmore = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[2]/div[1]/section/div[2]/div/div[5]/a[1]")
    action.move_to_element(showmore).perform()
    showmore.click()
    time.sleep(5)

    # Download glossary PDFs
    glossary = driver.find_element_by_xpath("//a[contains([@href](http://twitter.com/href), '.pdf')]")
    glossary[0].click()
    time.sleep(5)

    # Click Export
    action = ActionChains(driver)
    exportmenu = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="app"]/div/div[1]/div/div/div[1]/div/div[2]/div/div[2]/button")
    action.move_to_element(exportmenu).perform()
    exportmenu.click()

    # Click to download CSV file
    downloadmenu = driver.find_element_by_xpath("//*[[@id](http://twitter.com/id)="export-flannel"]/section/ul/li[1]/a")
    action.move_to_element(downloadmenu).perform()
    downloadmenu.click()

如前所述,Selenium 比大多数 web 抓取包都要慢。另一个明显的缺点是,如果网站的所有者改变了设计,所有的 XPATHs 都需要更新。但除此之外,它是一个非常强大的工具,我鼓励你去尝试和探索更多。

我的下一篇文章将是一篇教程,介绍如何使用 Airflow 来调度 Selenium 作业,使其更加强大。敬请期待:)

参考:

  1. 下载 chromedriver 二进制文件并添加到您的自动化功能测试路径中
  2. 硒与蟒蛇

1 |自我关注的基础

原文:https://towardsdatascience.com/self-attention-5b95ea164f61?source=collection_archive---------23-----------------------

变形金刚,一次一个概念

TL;DR-Transformers 是机器学习(ML)中令人兴奋的(相对而言)新的部分,但是在你能够理解它们之前,有很多概念需要被分解。这是我写的关于他们的专栏的第一篇文章。在这里,我们重点关注基本的自我关注机制是如何工作的,这是 Transformer 模型的第一层。本质上,对于每个输入向量,自我关注产生一个向量,该向量是其邻域中向量的加权和。权重由单词之间的关系或连通性决定。这个专栏是针对那些对变形金刚下发生的事情感到好奇的 ML 新手和爱好者的。

内容:

  1. 简介
  2. 自我关注——数学
  3. 参考文献

1.介绍

变压器是一种 ML 架构,已经成功地用于各种 NLP 任务,尤其是序列到序列(seq2seq)任务,如机器翻译和文本生成。在 seq2seq 任务中,目标是获取一组输入(例如英语单词)并产生一组期望的输出(德语中的相同单词)。自 2017 年成立以来,他们已经为 seq2seq 篡夺了当时的主导架构( LSTMs ),并且几乎无处不在地出现在任何关于 NLP 突破的新闻中(例如 OpenAI 的 GPT-2 甚至出现在主流媒体上!).

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

图 1.1 —机器翻译(欧洲→ DE)⁴

本专栏旨在非常温和、渐进地介绍 Transformer 架构背后的数学、代码和概念。没有比注意力机制更好的起点了,因为:

最基本的变形金刚完全依靠注意力机制。

2.自我关注——数学

我们希望 ML 系统能够学习单词之间的重要关系,就像人类理解句子中单词的方式一样。在图 2.1 中,你和我都知道“The”指的是“animal ”,因此应该和那个词有很强的联系。正如图表的颜色编码所示,这个系统知道“动物”、“十字路口”、“街道”和“the”之间有某种联系,因为它们都与句子的主题“动物”的相关。这是通过自我关注实现的。⁴

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

图 2.1—“The”关注哪些词?⁴

在最基本的层面上,自我关注是一个过程,其中一个向量序列 x编码成另一个向量序列 z (图 2.2)。每一个原始向量都只是一个数字块*,其中代表一个单词。其对应的 z 向量既表示原始单词*又表示其与其周围其他单词的关系。****

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

图 2.2:输入向量序列 x 变成另一个同样长的向量序列 z

向量代表了空间中的某种东西,比如海洋中的水粒子流或者地球周围任何一点的重力效应。你能不能把词想成词的总空间里的向量。每个词向量的方向意味着某事。向量之间的异同对应于单词本身之间的异同(我在这里之前已经写过这个主题)。**

让我们先来看看前三个向量,特别是向量 x2 ,我们的“猫”向量,是如何变成 z2 的。所有这些步骤将对输入向量的每个重复**

首先,我们将聚光灯下的向量 x2 与一个序列中的所有向量相乘,包括其自身。我们将做每个向量和转置*(对角翻转版本)x2 的乘积(图 2.3)。这与做点积是一样的,你可以把两个向量的点积看作是对它们相似程度的度量。***

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

图 2.3:转置乘法(上标“T”=“转置”)

两个向量的点积与它们之间角度的余弦成正比(图 2.4),因此它们的方向排列越紧密,点积就越大。如果它们指向完全相同的方向,那么角度 a 就是 0⁰,0⁰的余弦等于 1。如果它们指向相反的方向(因此 A = 180⁰),那么余弦就是-1。

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

图 2.4-两个向量的点积

作为题外话,注意我们用来得到向量间乘积的运算是一个我们可以选择的超参数。点积只是我们拥有的最简单的选项,在 中使用的那个选项就是你所需要的全部注意力【AIAYN】*。*****

如果你想在这个问题上有一个额外的直观视角, Bloem 的帖子讨论了自我关注如何类似于推荐系统确定电影或用户相似性的方式。

因此,我们一次将一个单词放在聚光灯下,并从其邻近单词中确定其输出。这里我们只看单词之前和之后,但我们可以选择在未来扩大窗口。

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

图 2.5-每个第 j 个向量的原始权重

****如果聚光灯下的单词是“猫”,我们要复习的单词顺序是“the”,“cat”,“sat”。我们在问**单词“*cat”*应该分别对“ *the”、“cat”*和“sat”给予多大的关注(类似于我们在图 2.1 中看到的)。

将我们的聚光灯单词向量的转置和它周围的单词序列相乘,将得到一组 3 个原始权重(图 2.5) 。每个权重与这两个词在意思上的联系程度成正比。然后,我们需要将它们规范化,以便它们更容易使用。我们将使用 softmax 公式来完成这项工作(图 2.6)。这将数字序列转换到 0,1 范围内,其中每个输出与输入数字指数成比例。这使得我们的权重更容易使用和解释。****

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

图 2.6:通过 softmax 函数归一化原始重量

现在我们取归一化的权重(每个向量一个,在 j 序列中),将它们分别与 x 输入向量相乘,对乘积求和,然后就成功了!我们有一个输出 z 向量,(图 2.5)!当然,这只是 x2 ("cat ")的输出向量——这一操作将对 x 中的每个输入向量重复,直到我们得到如图 2.2 所示的输出序列。****

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

图 2.7:得到新的向量序列的最后操作, z

到目前为止,这种解释可能引发了一些问题:

  • 我们计算的权重不是高度依赖于我们如何确定原始输入向量吗?
  • 为什么我们要依赖向量的相似度?如果我们想在两个‘相异’的单词之间找到联系,比如“猫坐在马特上”的宾语和主语,该怎么办?

在下一篇文章中,我们将回答这些问题。我们将为每个不同的用途转换每个向量,从而更精确地定义单词之间的关系,这样我们可以得到更像图 2.8 的输出。**

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

图 2.8—橙色栏粉色栏中的“cross”关注的是哪个词?

我希望你喜欢这篇文章,我感谢任何数量的掌声。欢迎在评论中留下任何反馈(积极的或建设性的),我会尽可能快地把它写下来。

对我的理解帮助最大,我非常感谢的人是 Peter Bloem(如果你像我一样喜欢数学优先的机器学习方法,他的帖子是一个很好的开始)和 Jay Alammar(如果你想从自上而下的角度开始,我推荐他的文章)。

3.参考

  1. 插图变压器。(2018)https://jalammar.github.io/illustrated-transformer/【2020 年 6 月 27 日访问】**
  2. 从无到有的变形金刚。(2019)http://www.peterbloem.nl/blog/transformers。[2020 年 6 月 27 日获取]
  3. Vaswani A .等人,2017 年 12 月。你所需要的只是关注。第 31 届神经信息处理系统会议(NIPS 2017),美国加州长滩。https://papers . nips . cc/paper/7181-attention-is-all-you-need . pdf【2020 年 6 月 27 日访问】。 arXiv:1706.03762
  4. 瓦斯瓦尼 a .等人 2018 年 3 月 arXiv:1803.07416互动笔记本:【2020 年 6 月 29 日访问】

自平衡二分搜索法树 101

原文:https://towardsdatascience.com/self-balancing-binary-search-trees-101-fc4f51199e1d?source=collection_archive---------4-----------------------

自平衡二分搜索法树简介

数据结构是一种在计算机中组织和存储数据的专门方法,通过这种方法,我们可以更有效地对存储的数据执行操作。在现有的众多数据结构中,二分搜索法树在高效操作中扮演着重要角色。由于我的上一篇文章每个程序员都必须知道的 8 种常见数据结构收到了很多兴趣和友好的回复,所以我将在本文中简要解释一下自平衡二分搜索法树(BST)。

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

什么是二分搜索法树?

如果你读过我之前关于数据结构的文章,你就会知道二叉查找树(BST) 是一棵二叉树,其中的数据以层次结构组织。

二叉查找树展示了一个独特的属性,称为二叉搜索树属性

x 是二叉查找树中的一个节点。

  • 如果 y 是 x 的子树中的一个节点,那么 y.key ≤ x.key
  • 如果 y 是 x 的子树中的一个节点,那么 y.key ≥ x.key

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

图一。二分搜索法树基本术语的可视化。

什么是自平衡二分搜索法树?

自平衡二叉查找树(BST)是一种自动尝试始终保持其高度尽可能小的二叉查找树(即使在执行插入或删除等操作后)。

如果你翻阅过 Big-O 算法复杂度备忘单,可以看到 BST 运算的平均时间复杂度为θ(h),其中 h 为树的高度。因此,在执行大量操作时,高度越小越好。因此,引入了自动平衡 BST,它可以自动将高度保持在最小值。然而,您可能认为每次执行操作时都必须进行自平衡是低效的,但这可以通过确保稍后在 BST 上执行大量快速操作来补偿。

高度为 h 的二叉树最多可以有2⁰+2¹+···+2ʰ = 2⁽ʰ⁺¹⁾−1个节点。

n≤2⁽ʰ⁺⁾1

h ≥ ⌈log₂(n+1) - 1⌉ ≥ ⌊log₂(n)⌋

因此,对于自平衡 BSTs,最小高度必须始终是向下舍入的 对数 ₂( n) 。此外,如果每个节点的左右子节点的高度相差 -10+1 ,则称二叉树是平衡的。该值被称为平衡系数

平衡因子=左子树的高度-右子树的高度

自平衡二分搜索法树是如何平衡的?

说到自平衡,BST 在执行插入和删除操作后执行旋转。下面给出了两种类型的旋转操作,可以在不违反二叉搜索树属性的情况下执行这两种操作来平衡 BST。

1.向左旋转

当我们绕节点 x 向左旋转时,节点 y 成为子树的新根。节点 x 成为节点 y 的左子节点,子树 b 成为节点 x 的右子节点。

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

图二。在节点 x 上向左旋转

2.向右旋转

当我们围绕节点 y 向右旋转时,节点 x 成为子树的新根。节点 y 成为节点 x 的右子节点,子树 b 成为节点 y 的左子节点。

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

图三。在节点 y 上向右旋转

请注意,一旦您完成了旋转,前一个和最后一个树中节点的有序遍历是相同的,并且二叉搜索树属性保持不变。

自平衡二分搜索法树的类型

下面给出了几种自平衡 BST。

  1. AVL 树
  2. 红黑色的树
  3. 张开树木
  4. Treaps

自平衡二分搜索法树的应用

自平衡 BST 用于构建和维护有序列表,如优先级队列。它们也用于关联数组,其中键-值对根据仅基于键的排序插入。

计算几何中的许多算法利用自平衡 BST 来有效地解决问题,例如线段相交问题。此外,可以扩展自平衡 BST 来执行新的操作,这些操作可用于优化数据库查询或其他列表处理算法。

AVL 树作为自平衡 BST 的一个例子

阿德尔森-维尔斯基和兰迪斯 ( AVL )树是平衡的二叉树。AVL 树中的所有节点存储它们自己的平衡因子。

在 AVL 树中,每个节点的平衡因子是-1、0 或+1。

换句话说,对于 AVL 树中的所有节点,左侧子树的高度和右侧子树的高度之差不能超过 1。

AVL 树示例

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

图 4。AVL 树示例

在图 4 中,节点上方红色的值是它们对应的平衡因子。您可以看到,在图 4 所示的 AVL 树的所有节点中都满足了平衡因子条件。

AVL 树的旋转

在 AVL 树中执行插入或删除后,我们必须检查所有节点是否满足平衡因子条件。如果树不平衡,那么我们必须做旋转来使它平衡。

对 AVL 树进行的旋转可以分为四种主要类型,分为两类。他们是,

  1. 单转左(LL)转右(RR)转
  2. 双旋转左右(LR)旋转左右(RL)旋转

下面给出的图表将解释每种旋转类型。

1.单次向左旋转(LL 旋转)

在这种类型的旋转中,我们将所有节点向左移动一个位置。

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

图五。LL 旋转

2.单次右旋转(右旋转)

在这种类型的旋转中,我们将所有节点向右移动一个位置。

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

图六。RR 旋转

3.左右旋转(左右旋转)

顾名思义,这种类型的旋转包括左旋和右旋。

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

图 7。左右旋转

4.左右旋转(左旋转)

这种类型的旋转包括右旋转和左旋转。

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

图 8。RL 旋转

向 AVL 树中插入元素

考虑图 4 中给出的 AVL 树。我们想给这个树添加一个新的节点 105。图 9 显示了插入新节点和重新平衡树的步骤。

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

图九。插入和平衡

添加节点 105 后,树中将总共有 12 个节点。如果我们计算出平衡树的可能高度,

h ≥ ⌈log₂(n+1) — 1⌉

h ≥ ⌈log₂(12+1) — 1⌉

h ≥ ⌊log₂(12)⌋ = ⌊3.58496250072⌋ = 3

但是,插入后生成的树的高度为 4。此外,节点 102 的平衡因子是-2。从这些事实可以看出,插入后得到的树是不平衡的。因此,我们必须通过旋转来平衡它。可以看到,应该旋转以节点 102 为根的子树,并且应该使用 RL 旋转。执行这个旋转后,我们得到一个高度为 3 的平衡树。

最后的想法

我希望这篇文章作为自平衡二分搜索法树的简单介绍对你有用,在这里我们以 AVL 树为例进行了讨论。我很想听听你的想法。😇

非常感谢你的阅读。😊请继续关注接下来的文章,我将在其中解释更多关于自平衡 BST 的内容。

干杯!😃

参考

[1] CS241 —讲义:自平衡二叉查找树

[2] 自我平衡的二叉查找树——维基百科

[3] 数据结构教程— AVL 树|示例|平衡因子

Jupyter 笔记本中的独立报告

原文:https://towardsdatascience.com/self-contained-reports-from-jupyter-notebooks-219a3887979d?source=collection_archive---------48-----------------------

使它们具有交互性和可隐藏的代码单元

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

介绍

你刚刚写了一个非常棒的 Jupyter 笔记本,你想把它发给你的同事。要求他们安装 Jupyter 是不可行的,要求他们提供一台服务器来托管你的页面也是不可行的。你是做什么的?

我将向您展示如何将您的笔记本导出为独立的 html 报告,任何人都可以在浏览器中打开该报告。我将从如何导出 html 报告的最简单的例子开始,然后我将展示如何隐藏输入单元格,最后我将展示如何切换显示/隐藏代码单元格。

可以在这里找到原始资料。

Hello world 示例

让我们从最简单的例子开始——我们有一个“hello world”笔记本,我们希望将它导出为一个自包含的 html 报告。我们可以通过跑步做到这一点

如果查看build目录并在浏览器中打开生成的html文件,我们会看到

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

这是一个自包含的文件,您可以将它作为电子邮件附件发送给任何人,他们将能够在他们的浏览器中打开它!

斐波那契示例

现在假设我们有一个笔记本,它计算前 100 个斐波纳契数并绘制它们。如果我们的最终目标是向非技术同事发送报告,我们可能希望从报告中排除任何代码单元,只保留输出和降价。

我们可以用--no-input标签:如果我们跑

然后我们得到一个独立的报告,有一个交互式的情节,没有代码单元,任何人都可以在他们的浏览器中打开它!

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

斐波那契示例—切换显示/隐藏代码单元格

在前面的例子中,所有的代码单元格在报表中都是隐藏的。但是,如果我们仍然希望让我们的最终用户能够有选择地显示或隐藏它们,那该怎么办呢?这需要一点技巧。

  • 步骤 2:编辑该单元格的元数据,使其包含标签remove-input。您可以通过单击左侧窗格中的属性检查器来编辑单元格的元数据:

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

  • 第三步:如果有任何其他单元格的输入(或输出)你想保持总是隐藏,添加remove-input (resp。remove-output)到它们的元数据;
  • 步骤 4:从终端运行

最后,您将得到一个切换按钮,通过它您可以有选择地显示或隐藏您的代码单元格!

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

结论

我已经向您展示了如何从 Jupyter 笔记本中导出包含隐藏代码单元格的自包含交互式报告。如果您需要与他人共享 Jupyter 笔记本,而不必要求他们安装任何额外的工具,这是一个很好的解决方案。原始资料可以在这里找到

【https://marcogorelli.github.io/】原载于*。*

自动驾驶汽车:我们离完全自主还有多远?

原文:https://towardsdatascience.com/self-driving-cars-how-close-are-we-from-full-autonomy-ccf31cea771?source=collection_archive---------30-----------------------

意见

我们现在是在 2020 年。我的机器人出租车在哪里?让我们看看技术的当前状态,做一个有根据的猜测

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

迪伦·卡勒伊在 Unsplash 上拍摄的照片。

毫无疑问,全自动驾驶技术(或第五级自动驾驶)将是我们未来的一部分。问题是——它什么时候到达?下一个十年?未来五年?明年?明天吗?让我们看看目前的技术水平,做一个预测。

**剧透:**大概不会晚于 2025 年。

哪个公司会先到达那里?

如果有谁能在 2025 年前解决完全自动驾驶( level 5 autonomy ),那就是特斯拉。你可能听说过 Waymo 机器人出租车,但这些出租车在非常有限的区域内运营,需要高分辨率的地图和路线准备(四级自主)。这是一个很好的尝试,但目前的方法不可扩展。

特斯拉将率先解决完全自动驾驶的主要原因是:

  • **数据:**他们拥有最大的真实世界数据集,驾驶里程数十亿。
  • **高效硬件:**一组智能传感器和一个内部设计的深度学习芯片。
  • **高级软件:**神经网络驱动 Teslas 是一个非常复杂的多任务问题。

在接下来的部分中,我将对这三个主题中的每一个进行阐述,然后我将构建我的预测时间表——让我们开始吧。

数据

有超过 100 万辆汽车在收集数据,特斯拉在竞争中遥遥领先。此外,随着产量的增加,特斯拉车队的规模将在未来几年急剧增加。请看这张图表,它显示了自动驾驶的预计行驶里程。

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

估计特斯拉自动驾驶里程。莱克斯·弗里德曼拍摄的图片。

在深度学习应用中,拥有大量数据是游戏规则的改变者。特别是对于自驾这种复杂的问题,需要在多任务问题中分析多个传感器的数据。

通常,在现实世界中,可能场景的分布有一个非常长的尾巴——这意味着汽车可能面临的罕见情况的数量几乎是无限的。**拥有一个收集数据的大型车队,可以对逐步改善所需的边缘案例进行采样。**目标是随着时间的推移使模型越来越健壮。

为了收集真实数据,需要一组传感器。这让我想到了下一个话题——硬件。

硬件

用于完全自动驾驶的一组硬件通常由几个摄像头、激光雷达传感器、雷达传感器和超声波传感器组成。

  • 摄像头用于采集车辆周围的图像;
  • 激光雷达发送快速激光脉冲,这些脉冲在物体上反射,允许以高分辨率制作周围的三维地图;
  • 雷达类似于激光雷达,但它工作在无线电波长上,允许在雾和灰尘条件下以较低的图像分辨率换取更好的性能;
  • 超声波传感器用于近距离,非常精确地检测近距离物体的距离。

这个领域的大多数人都非常依赖激光雷达,通过一些摄像头和超声波传感器进行增强。然而,特斯拉正在以不同的方式解决这个问题——不使用任何激光雷达。这让特斯拉的问题更加棘手! 他们为什么采用这种方法?

我们确信基于视觉的方法可以可靠地驾驶汽车——我们每天开车时都会使用两个摄像头传感器(也称为眼睛)。另一个重要的考虑因素是激光雷达传感器价格昂贵。随着时间的推移,价格可能会降低,但在此之前,汽车会明显变得更加昂贵。同样,如果我们可以用眼睛开车,那么人工智能可以通过让更多的眼睛无时无刻不在工作而不受干扰,来学习做得更好。雷达传感器非常重要,主要是为了即使在有雾和灰尘的情况下也能增强前视能力。再次检查前方物体的距离也很重要。这种传感器与激光雷达相比也更便宜。

下面的视频清楚地解释了特斯拉为传感器套件采取的方法,以及为什么用埃隆·马斯克的话说:“任何依赖激光雷达(完全自动驾驶)的人都注定要失败”。我发现关于使用雷达自动标记数据以利用相机进行深度估计的讨论特别有趣。他们还提到深度估计可以使用自我监督在没有标签的情况下实现——这是一种非常有前途的技术,在几个深度学习应用中正在获得动力。

Elon Musk 在相机上对比自动驾驶和自动驾驶汽车的激光雷达。

总的来说,我们看到特斯拉正在通过不依赖激光雷达和直接研究基于视觉的方法来解决一个更困难的问题。这是一个正确的方法,因为它是可扩展的,并导致更低成本的汽车,最终将能够提供机器人出租车的最低价格,并加速向电动汽车的过渡。

关于硬件的另一个重要方面是,特斯拉开发了一种深度学习芯片(硬件 3.0 ),它有能力以节能的方式实现完全自动驾驶。现在只需将软件安装到位,并通过无线更新进行部署。

聊到软件,我们转到下一个话题,看看特斯拉 autopilot 背后的神经网络。

驱动特斯拉汽车的神经网络

在过去的几年里,自动驾驶软件逐渐得到了改进。一些令人兴奋的消息是,特斯拉一直在对神经网络结构进行重大更新,使其能够与 4D 数据一起工作,而不是 2D 图像的组合。因此,随着特斯拉人工智能团队进一步探索他们计划在 2020 年底部署的系统的潜力,未来几个月的进展速度可能会更快。

我强烈推荐下面的视频,是特斯拉人工智能总监 Andrej Karpathy 关于全自动驾驶人工智能状态的演讲。我现在将描述一些主要的亮点。

安德烈·卡帕西——全自动驾驶的人工智能。

新的神经网络接收来自所有传感器的输入,并结合神经网络特征空间中的数据(下图中的融合层),创建周围环境的实时三维表示。这种表示然后被提供给一个鸟瞰网络( BEV Net ),从该网络中需要预测一组广泛的任务。

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

特斯拉自动驾驶神经网络。图片来自 Andrej Karpathy 在 ScaledML 2020 会议上的演示,可在 YouTube 上查看。(点按 YouTube 链接以转到确切的视频位置)

演示中涉及的另一个非常有趣的主题是他们如何处理边缘情况。下图展示了一个很好的例子——停车标志。有人会认为神经网络很容易捕捉和学习停车标志。但是如果它们被部分遮挡了呢?或者,如果他们有一个修饰语,如下面的例子所示,停车处下面的标牌上写着“右转除外”。无人驾驶汽车有望在所有这些场景中发挥作用。

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

真实世界长尾分布场景的例子。图片来自 Andrej Karpathy 在 ScaledML 2020 会议上的演示,可在 YouTube 上查看。(点按 YouTube 链接以转到确切的视频位置)

训练巨大的神经网络以在类似上述例子的边缘情况下表现良好的过程包括**以“影子模式”运行一个小型网络,从特斯拉车队中检索类似的样本。**获得的样本随后用于改进训练数据集。那么大的神经网络可以被重新训练以达到更好的精度。对于停车标志的情况,标签“停车标志”需要有修饰语来覆盖边缘情况。

对于这样一个复杂的多任务问题的验证也是本演示中涉及的一个非常重要的主题。

在最近 CPRV 2020 会议的主题演讲中,卡帕西做了一个类似的介绍,并增加了一些有趣的例子。从一个边缘案例的好例子开始。我想除了这些是从特斯拉车队采集的真实图像之外,没有其他评论需要了。

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

真实世界长尾分布场景的极端例子。图片来自 Andrej Karpathy 在 CPRV 2020 大会上的演讲,可在 YouTube 上获得。(点按 YouTube 链接以转到确切的视频位置)

另一个疯狂的例子是下图。你能应付这样的迂回吗?关于这个例子,Karpathy 提出了一个有趣的观点,他们不需要处理每一个可能的情况。如果无法处理的案例是已知的,一个可能的选择是遵循不同的轨迹来避免特定的情况。作为人类,我肯定会避开下图中的环岛。

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

极端困难的情况。Andrej Karpathy 在 CPRV 2020 大会上的演讲图片可在 YouTube 上获得。(点按 YouTube 链接以转到确切的视频位置)

**我相信上面的图片也暗示了他们正在努力解决环形路和十字路口的问题。**这是继红绿灯和停车标志之后的合理步骤,也是实现功能完整的自动驾驶的重要一步。

我的预测时间线

在今年 4 月 12 日的一条推文中,Elon Musk 提到了关于 robotaxi 发布的时间表,“今年功能看起来仍然不错。监管部门的批准是一个巨大的未知数。然而,埃隆对这些时间表过于乐观。然而,进展是稳步的,我们越来越接近了。

现在,让我最后写下我的时间表,它基于我能找到的关于自动驾驶当前状态的所有公开信息,并试图做出乐观但现实的预测:

  • **2020 年末或更有把握的 2021 年:**特斯拉自动驾驶将功能齐全。它将能够在大多数情况下导航,但远非完美。在城市环境中,将一直需要人工监管,人工干预将很常见。
  • 2021/2022: 随着越来越多的数据被收集并用于改进系统,改进将非常稳定。人为干预将会减少,而无人干预的出行将会逐渐变得更加频繁。
  • 2023: 自动驾驶仪将能够在大多数情况下完美导航。人类干预将是零星的。大多数旅行不需要任何干预。今年有可能在选定的地方开始 robotaxi 实验——4 级自治。
  • 2024: 软件将达到一种状态,在无人监管的情况下,可以安全行驶。边缘情况可能仍然存在,但可以通过人类语音命令反馈或通过规划旅程来解决,以避免特定的问题情况。特斯拉将开始一项重要任务,向监管机构展示这项技术在没有人类监管的情况下可以安全地用作 robotaxis 第 5 级自治。
  • 2025/2026: 特斯拉将逐渐获得监管机构的批准,在越来越多的地区运营。批准可能首先在美国进行(在一些州可能最早在 2024 年),并逐渐扩展到其他地区。对于欧洲,我预计批准时间会比美国晚一年。

总而言之,到 2025 年(在欧洲和其他地区可能是 2026 年),我希望能够在应用程序中安排我的 robotaxi 之旅,去我选择的任何目的地。我期待着那一天!

结束语

这只是我对全自动驾驶未来的设想。没有人知道未来会怎样。等式中有许多不确定因素。我的预测只是我认为最有可能的情况。请在评论中告诉我你的想法。

更多关于我的事

[## 我的 3 年历程:从零 Python 到深度学习竞赛高手

自从 2017 年开始学习 Python 以来,我一直遵循的道路是成为一名独自参加 Kaggle 比赛的大师…

towardsdatascience.com](/my-3-year-journey-from-zero-python-to-deep-learning-competition-master-6605c188eec7)

感谢阅读!祝您愉快!

无人驾驶汽车——管理项目

原文:https://towardsdatascience.com/self-driving-cars-managing-a-project-57372db4e739?source=collection_archive---------27-----------------------

本文已在https://www.thinkautonomous.ai/blog/?更新 p =自动驾驶汽车管理项目

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

米勒·桑德斯Unsplash 上的照片

制造自动驾驶汽车是一项紧张的活动。很多时候,不是一个公司一个人做的事情。特别是,我注意到在项目开发过程中我们经常交流的 3 个不同的概要文件。

虽然我从未有过“项目经理”的头衔,但我与 3 名项目经理密切合作,维护并发展了与两家外部供应商的关系,并在 Perception 管理着一个由 7 名实习生组成的团队。它让我对项目管理有了很好的理解,我可以自己做这项工作。

如果你正在考虑成为一名自动驾驶汽车项目经理,也许你不知道该期待什么。
自动驾驶汽车项目经理日常做什么?

鉴于现在有很多项目管理技术(敏捷、Scrum 等等),我将只讨论任务而不是使用的方法或工具**。**
还有,由于我在创业环境中工作过,我就从这个角度讲讲我的故事。

📩在我们开始之前,我邀请您订阅我的私人邮件列表,并接收像这样的每日信息!

🚀你也可以在我的入门课程中开始学习自动驾驶汽车。

项目经理有很多事情要做。在这里,我将确定该角色涉及的每项任务和联系人。

开发者

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

照片由 Fabian GrohsUnsplash 上拍摄

在自动驾驶汽车中,我们很少创造一种可以开到任何地方的车辆。
总有一个明确的目标,比如“高速公路驾驶”或“市中心送餐”。
这一目标对车辆的开发有影响。

所需的算法将取决于车辆的任务。
如果一辆汽车在城市里行驶,它将需要一个交通灯检测系统。在高速公路上不是这样。

项目经理的第一个角色就是意识到这种差异。
当我们创建一个约会 app,想在一个新城市部署,其实并没有那么大的区别。

在无人驾驶汽车中,扩展更加困难,因为它涉及许多新的应用。
澳大利亚的自动驾驶汽车必须开发袋鼠检测模型。
加拿大的自动驾驶汽车必须检测和分割雪域。

项目经理必须确定所有这些必要的任务,并与开发人员沟通,以确保及时开发和测试所有东西。
它涉及了解自动驾驶汽车的完整架构,并为每项任务制定详细的时间表。

在自动驾驶汽车里,时间表是最难定义的!如果你需要试车跑道,你可以从下个月开始租两天。如果算法比计划晚了 7 天,其他一切都有风险。如果机器人化没有及时完成,本地化就无法测试,甚至无法开发。

有些模块包括在试车跑道上。
这是本地化的情况,因为开发人员必须准确地知道 GPS 周围的情况,有哪些地标……
为此,开发人员需要在测试轨道上,并记录场景。

规划每一项任务意味着你可以预见问题。如果汽车在测试中出现电池问题,必须在 2-3 天内修复。否则,开发人员将会浪费时间。

需要了解技术挑战,如果经理了解,他会更好。
但是,我见过对算法一点头绪都没有,而信任工程师的项目经理。根据我的经验,这对项目没有太大影响。我不会建议经理不知道激光雷达是如何工作的,或者为什么我们不能将汽车更新到新的 Ubuntu 版本。

我会告诉你相反的情况。非常接近技术挑战,因为你与开发人员交流的方式可能会帮助他们重新思考情况,并帮助你更好地估计时间。

当人们埋头苦干时,最好有一个能帮上忙的人。

  • 每天与每个开发人员进行 15-30 分钟的交谈,将有助于更快地解决这些挑战,并让您更接近现实。

更精细的项目管理方法被发明出来了,我建议你看看这个

在更大的范围内,项目经理还与各种服务提供商、客户和潜在客户合作。

供应商

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

照片由i̇rfan·西姆萨尔Unsplash 上拍摄

**让我们以一家初创公司为例,它的任务是开发一种自主航天飞机。**如果创业公司不处理开发的一个方面,比如机器人化,它将需要外包。

项目经理的角色是确定提供商,协商价格,并确保硬件架构符合算法。如果你是一名计算机视觉工程师,你可能知道相机的位置对 3D 渲染很重要。如果相机有某种镜头,它会改变距离感。

一切都很重要。
从买来的传感器类型,到每个传感器的位置。
冷却系统…除了加热计算机和图形处理器…
掌握自动驾驶汽车自动化过程的每个方面是一项需要经验的艰巨任务。

您可能需要处理的提供商有:

  • 机器人化和汽车制造商🚘
  • 传感器提供商📷
  • 算法提供商💻

购买传感器时,你必须确保工程师知道如何使用它。
让我们来看看这样一个现实:一家初创公司无法为每项任务雇佣 50 名工程师。如果你的公司已经雇佣了工程师,发展会受到他们的技能和愿望的影响。

购买算法的时候,一定要和团队紧密合作。
如果你的创业公司没有计算机视觉工程师,而你需要一个车道线感知系统,这是一个新项目。

创业公司可以为开发者付费,也可以为解决方案付费。

总之,车道线检测系统取决于它将行驶的环境类型,就像几乎所有其他东西一样。这意味着车队也需要使用赛道来测试他们的软件
这是一个你不能使用车辆完成任何其他任务的时间段

正如我所说,制定时间表是一项非常困难的任务,它需要对技术挑战有非常好的理解,以及对问题有很好的预见能力。

客户

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

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

经理接触的最后一类人是客户。

客户给公司钱以换取服务或产品。

如果经理负责与客户的关系,他必须非常清楚正在发生的一切。

对很多人来说,与客户的关系是最难处理的。

客户可以改变很多想法。
他们可能会突然想要一个前一天不需要的功能。
他们可能需要加快截止日期,以配合您不知道的特定媒体活动。经理必须足够灵活,这样一天的轮班不会毁掉一切。

通常,最后期限是由客户设定的。如果期限太短,整个项目可能很难计划。

有时,客户可能需要你做你不理解的事情。客户对经理的信任至关重要。
如果客户觉得和其他人在一起不安全,他可能会要求经理每天都在现场…
这通常是不必要的,而且会危及项目。

即使不需要,也是客户的条件。
如果经理接受了,那就成了新的问题需要处理。

经理必须:

  • 让客户满意
  • 但是要确保它不会影响项目本身

可能需要一些额外的任务,比如谈判,但在初创公司,通常是直接与首席执行官谈判。

项目管理是一项基本任务。许多公司认为他们不需要项目经理,因为开发人员可以应付。这在自动驾驶汽车创业公司里简直是不可能的。这些工作都非常不同。

项目经理的最后接触是和他的主管。我们不要深究细节。

经理必须能够跟上最后期限和进度。客户、提供商和开发者是我们能找到的三个主要的人。

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

(来源)

杰里米·科恩。

💌订阅私人邮件列表每天学习自主机器人!

🚎如果你想了解更多关于自动驾驶汽车的知识,你可以参加我的课程自动驾驶汽车:学习将改变我们生活的尖端技术的指南

基于深度强化学习的自我改进聊天机器人

原文:https://towardsdatascience.com/self-improving-chatbots-based-on-reinforcement-learning-75cca62debce?source=collection_archive---------14-----------------------

自我改进聊天机器人的强化学习(RL)模型,专门针对 FAQ 类型的聊天机器人。

埃琳娜·里恰尔代利,德布马尔亚·比斯瓦斯

摘要。 我们提出了一个自我改进聊天机器人的强化学习(RL)模型,专门针对 FAQ 类型的聊天机器人。该模型的目的不是从头构建一个对话系统,而是利用用户对话中的数据来提高聊天机器人的性能。我们的方法的核心是一个评分模型,该模型被训练为基于用户反馈对聊天机器人话语响应元组进行评分。由该模型预测的分数被用作对 RL 代理的奖励。策略学习离线进行,这要感谢一个用户模拟器,它从 FAQ 数据库中输入话语。使用具有ε贪婪探索的深度 Q 网络(DQN)代理来实施策略学习,该代理被定制为有效地包括范围外问题的回退答案。从一个企业聊天机器人中提取的一个小案例展示了我们方法的潜力。它表明,在 20-30 个训练周期内,绩效从最初的 50%提高到 75%。

发表的版本的论文可在以下获得,刊登在 2019 年蒙特利尔第四届强化学习与决策多学科会议论文集(RLDM)(论文 ) ( 代码)

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

图 1: RL 模型架构(图片由作者提供)

1 导言

企业环境中的大多数对话代理都是特定领域的,由一个自然语言理解(NLU)单元组成,该单元被训练成以受监督的方式识别用户的目标。然而,为生产系统收集一个好的训练集是一个耗时且繁琐的过程。由于意图重叠和混淆,涵盖广泛意图的聊天机器人经常面临糟糕的性能。此外,考虑到来自实际使用或测试阶段的用户反馈,很难自主地重新训练聊天机器人。自我改进的聊天机器人很难实现,主要是因为很难选择和优先考虑聊天机器人性能评估的指标。理想情况下,人们希望对话代理能够从用户的经验中学习并自主改进。

在这项工作中,我们提出了一种自我改进聊天机器人的强化学习方法,特别针对 FAQ 类型的聊天机器人。这种聊天机器人的核心是一个意图识别 NLU,它通过问题变体的硬编码示例进行训练。当没有符合 30%以上置信度的意图时,聊天机器人会返回一个后备答案。对于所有其他情况,NLU 引擎会随响应一起返回相应的可信度。

几篇研究论文[2,3,7,8]显示了 RL 方法在开发对话系统中的有效性。这种方法的关键是选择一个好的奖励模式。一个典型的奖励模型是对每个对话回合实施一个惩罚项。然而,这种奖励只适用于任务完成聊天机器人,其中代理的目的是在最短的时间内满足用户的请求,但它不适合 FAQ 类型的聊天机器人,其中聊天机器人被期望在一个回合中提供一个好的答案。用户的反馈也可以用作在线强化学习中的奖励模型。然而,在实时对话中应用 RL 可能具有挑战性,并且在 RL 失败的情况下可能会产生巨大的成本。

对于已部署的系统,更好的方法是离线执行 RL 训练,然后一旦达到令人满意的性能水平就更新 NLU 策略。

2 强化学习模型

RL 模型架构如图 1 所示。该模型的各种组件是:NLU 单元,用于在预热阶段最初训练 RL 代理;用户模拟器,其从用户体验数据库中随机提取用户话语;分数模型根据具有反馈的用户对话和基于深度 Q 网络(DQN)网络的 RL 代理进行训练。

2.1 对话系统

我们在一个 FAQ 类型的聊天机器人上应用了强化学习方法。

在聊天机器人的核心,有一个意图识别 NLU,它是用问题变化的硬编码示例训练的。意图被定义为用户的意图,其通过话语来表达。对于这项工作,我们选择了来自 Rasa 的开源 NLU,使用 TensorFlow 管道。然而,RL 方法独立于所选的 NLU,对于生产中的系统,它可以很容易地扩展到 NLU 引擎,如 IBM Watson 或 Amazon LEX。

2.2 真实用户对话

在我们的工作中,我们使用了在开发实际内部聊天机器人过程中获得的用户反馈。

聊天机器人的工作范围是回答员工有关办公大楼设施、人力资源政策和福利等问题。

所有参与测试阶段的 10 名用户都被告知,他们的反馈将用于改善聊天机器人的性能。测试人员在每轮对话后提供一个(二元)反馈,从而对话语-回应元组进行评级。因此,历史数据包含以下格式的四个部分:(话语、响应、NLU 置信度和反馈)。通过移除无效对话(即缺乏反馈或反馈无效的对话),我们最终得到 550 个用户对话,触发了大约 120 个意图。尽管我们已经在所有对话中测试了评分模型,但 RL 模型仅应用于 155 个对话的子样本,触发了前 5 个意向。在这个子集上,用户的满意度是 50%。

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

表 1:来自数据库的对话示例,以及由模型和用户提供的分数

2.3 奖励功能:分数模型

评估聊天机器人的性能是计算语言学中长期存在的问题。从机器翻译(例如[6])借用的自动度量在短句(例如[4])上表现不佳,例如聊天机器人话语-响应元组。另一方面,人类对聊天机器人的评级是目前评估聊天机器人成功与否的事实上的标准,尽管这些评级往往很难收集,而且成本高昂。

为了评估聊天机器人响应的正确性,我们提出了一种新的方法,该方法利用在聊天机器人的开发和测试阶段收集的用户对话日志。每个用户都被要求在每次聊天机器人回合时提供一个二元反馈(正面/负面)。

为了在离线强化学习中使用用户反馈,我们开发了一个分数模型,能够为看不见的话语响应元组的二元反馈建模。在受监督的方式中,分数模型学习如何将话语和响应的向量表示投影到线性变换的空间中,使得相似的向量表示给出高分。至于句子的向量表示,我们通过通用句子编码器[1]计算句子嵌入,该编码器可通过 TensorFlow Hub 获得。为了训练模型,利用 L2 规则对(模型预测和人类反馈之间的)平方误差损失进行优化。为了评估该模型,预测的分数然后被转换成二进制结果并与目标(用户反馈)进行比较。对于那些既具有正反馈又具有接近 1 的 NLU 置信水平的已识别意图的话语对,我们执行数据扩充,给话语和后退意图的组合分配低分。

[4]提出了一种类似的聊天机器人评估方法。作者通过使用一组经过标记的对话对分数进行建模,这些对话还包括通过众包收集的模型和人类生成的响应。

我们的方法与上述作者的不同之处在于,它只需要一组带标签的话语响应元组,这些元组在聊天机器人开发和用户测试阶段相对容易收集。

2.4 与 DQN 的政策学习

为了学习策略,RL 代理使用 DQN 架构的 Q 学习算法[5]。在 DQN,训练一个神经网络来逼近状态-动作函数 Q(s_t,a_t,θ) ,它代表在状态 s_t 提供的动作 a_t 的质量,而 θ 是可训练的参数。至于 DQN 网络,我们采用了[3]提出的方法,使用一个全连接的网络,由一个经验重放池缓冲区提供,它包含话语和响应的一键表示以及相应的奖励。在这种情况下,一次性表示是可能的,因为我们对于话语(由日志中真实用户的问题数量给出)和响应(等于在我们的测试用例中使用的意图数量,5)有有限的可能值。在热身阶段,DQN 在 NLU 上进行训练,使用 NLU 置信度作为奖励。每当状态-动作对具有高于阈值的置信度时,通过将零权重分配给给定状态和所有其他可用动作,DQN 训练集被扩充。因此,在 RL 训练开始时,代理的表现类似于 NLU 单元。

在 RL 训练期间,我们使用ε-贪婪探索,其中根据概率ε探索随机动作。我们使用随时间变化的ε,这有助于在训练开始时进行探索,在最后一个历元期间 e_t0 = 0.2ε_t = 0.05 。为了在选择随机动作时加速学习,我们还强制更高的概率来获得“没有检测到意图”,因为几个问题实际上不在聊天机器人的范围内,但是它们被 NLU 错误地匹配到错误的意图。在一个时期内,我们模拟一批大小为 n 集的对话(在我们的实验中范围为 10 到 30 集),并用元组 (s_t,a_t,r_t) 填充体验重放缓冲区。缓冲区的大小是固定的,当代理性能提高到指定的阈值以上时,它会第一次被刷新。在状态-动作元组获得大于 50%的奖励的那些情节中,我们通过对当前状态的任何其他动作的分配分配零奖励来执行数据扩充。

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

图 2:分数模型的性能。左侧面板:交叉验证的测试集准确度,对于具有不同意向数量的不同子样本,具有 95%的置信区间。水平红线表示整个样本的性能。右侧面板:不同子样本的 ROC 曲线。

3 模型评估

3.1 评分模型评估

为了评估模型,我们选择对话的子集,触发前 N 个意图,N 在 5 到 50 之间。图 2 总结了评分模型的结果,显示了测试集的交叉验证(5 倍 CV)准确性和作为意向数量函数的 ROC 曲线。

对于整个对话样本,我们获得了 75%的交叉验证准确率和 0.84 的 AUC。

然而,通过仅选择那些触发前 5 个意向的对话,从而包括每个意向的更多示例,我们获得了 86%的准确率和 0.94 的 AUC。对于 RL 模型评估,我们重点关注 5 个意向子集;这确保了我们有最可靠的回报。

3.2 强化学习模型评估

RL 训练的学习曲线如图 3 所示。在左侧面板中,我们将 RL 训练和奖励模型与直接奖励(以交互方式)进行的测试进行了比较,显示得分模型给出了与奖励已知的参考案例相似的表现。平均分的大幅波动是由于有限的批量 (n 集= 10) 和相对较大的ε。我们还显示了从完整样本中提取的 20 个对话的测试集的成功率,其中为所有话语手动提供了“黄金响应”。

在仅仅 30 个时期内,代理成功率从最初的 50%增加到 75%,显示了这种方法的潜力。

在右边的面板中,我们显示了使用 n 集= 30 的结果,显示了类似的性能,但具有更平滑的学习曲线。

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

图 3:学习曲线显示了基于 20 个对话的标记测试集的 DQN 代理的每个训练时期的平均分数(连续黑线)和成功率(紫色阴影区域)。左侧面板:具有互动奖励(黑线)和奖励模型(蓝色虚线)的 direct RL 的学习曲线,每个时期使用 10 集。右侧面板:模型奖励的学习曲线,每个时期使用 30 集。

4 个结论

在这项工作中,我们根据用户测试阶段的反馈,展示了强化学习方法在提高 FAQ 类型聊天机器人性能方面的潜力。为了实现这一点,我们开发了一个分数模型,它能够预测用户对话语响应元组的满意度,并实现了一个 DQN 强化模型,使用分数模型预测作为奖励。我们已经在一个小型但真实的测试案例上评估了该模型,展示了有希望的结果。更多时代的进一步培训和包括更多数据,以及对模型超参数的广泛测试正在进行中。我们的方法的价值在于提供了一种实用的工具,以基于用户反馈的自动化方式来改进大规模聊天机器人(具有大量不同的意图)。

最后,我们注意到,虽然本文中提出的强化学习模型适用于 FAQ 类型的聊天机器人,但它可以通过合并更复杂的分数模型来概括包括对话的顺序性质。

参考

[1]丹尼尔·瑟尔等人。艾尔。通用句子编码器。CoRR,abs/1803.11175,2018。

[2]李继伟、威尔·门罗、艾伦·里特、米歇尔·格里、高剑锋和丹·茹拉夫斯基。对话生成的深度强化学习。arXiv 预印本 arXiv:1606.01541,2016。

[3]、Yun-Nung Chen、高剑锋和 Asli Celikyilmaz。端到端任务完成神经对话系统。2017 年第八届国际自然语言处理联合会议。

[4]瑞恩·洛威等人。艾尔。走向自动图灵测试:学习评估对话反应。《计算语言学协会第 55 届年会论文集》(第 1 卷:长篇论文),第 1116-1126 页。计算语言学协会,2017。

[5] Volodymyr Mnih 等。艾尔。通过深度强化学习实现人类水平的控制。《自然》, 2015 年第 2 期,第 518:529 页。

[6]基肖尔·帕皮尼尼、萨利姆·鲁科斯、托德沃德和威-朱婧。Bleu:一种自动评估机器翻译的方法。计算语言学协会第 40 届年会论文集,ACL '02,311-318 页,2002。

[7]彭,,高剑锋,,黄锦辉.Deep dyna-q:任务完成对话策略学习的集成规划。《计算语言学协会第 56 届年会论文集》(第 1 卷:长篇论文),第 2182-2192 页。计算语言学协会,2018。

[8]尤利安·弗拉德·塞尔班等。艾尔。一个深度强化学习聊天机器人。更正,abs/1709.02349,2017。

冠状病毒正在创造新一代的游戏玩家

原文:https://towardsdatascience.com/self-isolation-is-creating-a-new-generation-of-gamers-367075ab8346?source=collection_archive---------36-----------------------

在堡垒之夜战斗车上不需要社交距离

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

照片:格伦·卡斯滕斯-彼得斯

C ovid-19 并没有提供多少好消息,特别是在过去的几周里,因为“自我隔离”和“社会距离”成为拉平曲线的不可协商的问题。这些都是艰难的步骤。人类是群居动物——被迫与我们周围的人断开联系打击了我们情感和心理的健康。

在这个大规模隔离的黑暗时刻,社会很快就转向了一个出口,既提供逃避现实的机会,又提供了一个在线聚会和社交的结构。以下是一些令人震惊的统计数据,显示了自闭者对网络游戏的狂热:

  • 在完全封锁的意大利,电信官员报告互联网使用增长了 70%—特别将增长归功于“在线游戏,如堡垒之夜”。
  • 在部分封锁的美国,数据报告显示在高峰时段玩在线游戏的人数激增了 75%(还没有数据显示这些游戏玩家中有多少人应该在家工作)。
  • 一周前,超过 2000 万人同时登录 Steam,打破了历史记录。从那以后,这个数字基本上每天都在增加——就在今天,Steam 创下了 2250 万的新纪录
  • 一款全新的游戏《使命召唤:战争地带》在发布的前两周就有3000 万玩家——这个数字对于一款新游戏来说基本上是前所未有的,即使是在免费游戏中。

当然,这是真的,自我隔离的无聊的人在休闲选择上有点缺乏。社交距离意味着你不能去看一部新电影,不能和你的社交篮球队一起打篮球,也不能和朋友去酒吧。由于我们平时做的很多娱乐活动都不在餐桌上,游戏是我们真正能做的为数不多的活动之一。

然而,有一个很好的理由来解释为什么电子游戏的发展速度比 Wasgij 拼图还要快…

逃离新冠肺炎世界的完美方式

网络游戏的两个方面使得它们几乎是为疫情充斥的世界中自我孤立的个人的困境量身定制的。首先,游戏让玩家有机会逃离现实,进入一个沉浸式的虚拟现实,远离压力和喧嚣。第二,网络游戏是一种基本的社交媒体,给玩家一个不需要离开休息室的社区。

我们先来看看逃避现实的强大功能。与书籍或拼图游戏相比,游戏为玩家提供了更深的沉浸感,这得益于独特的幻想世界、夸张的画面和令人上瘾的反馈循环。沉迷于电子游戏是非常容易的。当然,这并不总是一件好事,但它确实为那些寻求逃离日常生活中新冠肺炎无所不在的势力的玩家提供了一种受欢迎的解脱。

任何阅读这篇文章的人都会知道冠状病毒的讨论有多普遍,从媒体到日常谈话,无所不包。这种疫情带来的持续的精神紧张和焦虑是一个非常现实的问题,特别是对于那些有亲人直接受到病毒影响的人(无论是感染了病毒,还是在经济冲突中失去了工作)。游戏为这种压力提供了一个没有新冠肺炎的出口。举个例子,引用一个游戏玩家的话, [NPR 和](/“It’s kind of escapism,” she says. “Right now things are really scary and I just can’t wait to go onto an island and be in debt to a raccoon, and not have coronavirus. I can make my island whatever I want it to be. I can have all my villagers and they’re all nice. It’s just very idealistic.”)谈到了在疫情玩动物穿越和口袋妖怪:

这是一种逃避现实的方式。现在事情真的很可怕,我等不及要去一个岛上,欠一只浣熊的债,而且不要有冠状病毒。我可以把我的岛变成我想要的样子。我可以拥有我所有的村民,他们都很好。只是很理想化。

另一方面,其他处于封闭状态的人拼命寻求的是一种新的社会生活结构——随着我们所有的典型社区因社交距离的需要而被连根拔起,我们现在需要技术来给我们人类所需的联系和社区感。这方面的一个例子是聊天应用“家庭聚会”的爆发,这是一种促进朋友之间轻松交流的有效方式。

网络游戏为自我隔离的朋友提供了一个重要的方式,让他们继续一起参加有意义的活动。像 Apex Legends 这样受欢迎的游戏完全是围绕着小的玩家群体——小队——一起工作和交流以取得成功。游戏还为朋友和社区提供了类似于锦标赛赛季的结构。游戏既提供了与朋友共度时光的有趣方式,也提供了一致的社交基础设施。当大多数其他社会活动被新冠肺炎完全打乱时,这可不是一件小事。

正如一位自我封闭的游戏玩家在《边缘》中所说,社交互动的结构甚至可能是在线游戏最重要的特征:

当你一整天独自在家工作,穿着你的慢跑裤(希望是洗过的),玩游戏有时更多的是和其他人一起玩,而不是游戏本身。

通过这种方式,在线游戏为冠状病毒的隔离和破坏性特征提供了一个真正的对抗手段。谢天谢地,因为我们还远远没有摆脱自我孤立。

封锁的时代才刚刚开始

在我的家乡新西兰,总理今天宣布全国将在 48 小时内进入一级防范禁闭状态,并持续四周。这个决定做出后,肯定有一定程度的震惊,但大多数新西兰人同意总理——我们宁愿承受短期的痛苦,也不愿像意大利一样,病毒肆虐,死亡人数不断增加。

“锁定”在实践中意味着什么?对我和其他所有不在基本服务部门工作的新西兰人来说,我们将整整一个月呆在家里。与我交谈过的大多数人都计划充分利用在家的额外时间,而不是哀叹通过 Zoom 进行的一个月的工作会议。这当然是一个朋友的可行方法,他今天被发现带着一个全新的 PlayStation 和三个闪亮的新游戏离开商场,让他忙个不停。

促使新西兰决定进入一级防范状态的强大公共卫生逻辑同样适用于其他所有抗击新冠肺炎的国家。困难的事实是,意大利锁定得太晚了,现在正在为早期预警信号管理不善付出代价。

关于如何使曲线变平,科学是如此清晰,以至于连 T2 都在关注。接下来,许多其他国家也在考虑如何最大限度地自我隔离,即使这涉及到将整个国家封锁起来。印度已经封锁了超过 1 亿人以阻止病毒的传播,更多人将会跟进。法国西班牙丹麦马来西亚都在最近几天实施了封锁。

在这种危险的发展速度下,预测世界上大多数国家可能会实施自我隔离以阻止病毒传播已经不再令人愤慨。这种做法的实际效果是让数十亿人像我在新西兰一样呆在家里。就像我的朋友和他的新 PlayStation 一样,许多新近被孤立的人将把游戏作为一种发泄方式。

出于一系列原因,我们应该庆祝新一代游戏玩家的诞生。玩网络游戏提供了一种逃离疫情的方式和一个现成的网络社区。随着群居动物受到孤立的严重打击,我们可能会做得更糟。

如果你对这类关于游戏的社会影响的思考感兴趣,你可能会喜欢我的新出版物。我会定期写技术如何改变社会,比如我最近的一篇关于冠状病毒如何让大规模监控成为我们的新常态的文章。

自组织地图简介

原文:https://towardsdatascience.com/self-organizing-maps-for-dimension-reduction-data-visualization-and-clustering-ff966edd311c?source=collection_archive---------6-----------------------

用于降维、数据可视化和聚类的自组织映射

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

安德鲁·斯图特斯曼在 Unsplash 上的照片

S 自组织映射(SOM) 是一种常见的无监督神经网络模型。SOM 已被广泛用于聚类、降维和特征检测。SOM 是由 Kohonen 教授首先提出的。正因如此,SOM 也叫科霍宁地图。它有许多实际应用,包括机器状态监控、故障识别、卫星遥感过程和机器人控制[1]。此外,SOM 通过利用拓扑相似性属性将高维数据投影到低维空间来用于数据可视化。在模型开发过程中,SOM 利用竞争学习技术,而传统的神经网络通过梯度下降算法的反向传播来应用误差减少过程。在这篇文章中,我分享了我对 SOM 的理解,它是如何学习的,方法,以及 SOM 的局限性。

SOM 如何学习?

SOM 的架构非常类似于神经网络架构,但它比人工神经网络(ANN)简单得多。SOM one 包含两层:输入层和输出层(特征地图)。SOM 通过初始化权重向量来开始特征映射。SOM 中的权重与 ANN 中的权重具有完全不同的内涵。在神经网络建模中:将激活函数应用于权重和输入值的线性组合,以产生架构中每个神经元的输出。另一方面,SOM 不应用激活功能。并采用权重作为架构中神经元的特征。权重通常是随机生成的。使用权重向量作为神经元特征的动机是将给定数据的每一行(观察值)推入一个虚拟空间,其中每一行充当一个点。这是高级官员会议的核心。一次,每个数据保存一个输入空间的虚点,然后搜索最近的点(数据)。

假设我们有一个只有四个观察值(行)的三维数据集(特征-x1、x2 和 x3)。我们希望对数据集应用 SOM 方法以达到降维的目的,即我们希望将数据从给定的三维空间转换到二维空间。SOM 中有几个参数,例如神经元的数量。我们选择两个神经元,因为我们想将数据转换到二维空间。这意味着,SOM 包含两层:输入层(3 个神经元/节点)和输出层(2 个神经元/节点)。这里,我们介绍 SOM 的几个步骤:

1.初始化随机权重向量 —在该步骤中,随机权重向量被初始化。对于像人工神经网络这样的迭代方法来说,良好的初始近似是一个众所周知的挑战。虽然权重的随机初始化是一种常见的做法,但利用数据的第一主成分空间的主成分初始化由于结果的可重复性而获得了极大的欢迎[3]。神经元的权重向量维数/大小应该是输入空间的大小。在这个例子中:神经元 W1 和 W2 分别与权重向量(1,2,3)和(6,5,4)相关联。

2.随机选择一个输入— 假设随机选择的输入是最后一行(1,1,1)

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

winner 神经元的计算过程

3.使用欧几里德距离计算赢家神经元 —在这一步,计算随机选择的输入和每个神经元之间的欧几里德距离。下表显示了两个神经元的计算。距离最短的神经元是获胜神经元。这里,W1 是获胜神经元。获胜的神经元被称为最佳匹配单元(BMU)。除了欧几里德距离,我们还可以使用其他距离度量来计算身体质量指数。在此步骤中,计算 BMU 的邻域,其中基于指数衰减函数考虑邻域大小[2]。随着时间的推移,BMU 周围的邻域变小。以下等式显示了指数衰减函数,其中 t 是当前时间步长,sigma0 是初始时间的半径,是依赖的时间常数,以及该方法的选定迭代次数。

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

用于查找邻居大小的指数衰减函数

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

BMU 附近半径的缩小

4。 更新神经元权重— 在此步骤中,调整 BMU 和邻域的权重,以调查与输入向量最相似的神经元,并预期更靠近 BMU 的邻域会有显著变化。离 BMU 越远的邻居了解得越少(权重变化不明显)。以下等式显示了更新神经元的计算:

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

更新神经元权重的公式

其中 t 是当前时间步长,L 是学习率,也是一个指数衰减函数,与上一个函数类似:

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

学习率的方程式

n 是影响率(另一个指数衰减函数),其决定邻域的半径(大小),并且随着迭代的增加,大小逐渐缩小,并且最终邻域在迭代(训练)结束时缩小到大小为零[2]。下面的等式是影响率的表达式:

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

影响率方程

这里,距离是每对神经元(W_i 和 W_j)之间的晶格距离。

5。 重复 2–4 直到训练结束— 重复步骤 1–4 直到神经元的位置稳定。

虽然 SOM 是一种广泛使用的易于解释的无监督技术,它允许在低维网格内可视化观察之间的相似性,但它有一些限制:

  1. SOM 需要足够的数据量来生成有意义的聚类,因为不足的或无关的数据可能会给聚类增加额外的随机性。
  2. SOM 遇到分类数据聚类的困难[5]。SOM 通常在将数据转换为指示变量(如二元变量)后应用于分类变量。分类特征之间的相似性属性可能由于转换而丢失有价值的信息,因此,经过训练的 SOM 可能无法呈现数据的正确拓扑属性。

相关文章-

机器学习管道中的挑战

阅读默罕默德·马苏姆博士(以及媒体上成千上万的其他作家)的每一个故事。

你的会员费将直接支持和激励穆罕默德·马苏姆和你所阅读的成千上万的其他作家。你还可以在媒体上看到所有的故事—https://masum-math8065.medium.com/membership

快乐阅读!

参考:

[1]https://users . ics . Aalto . fi/jhollmen/di PPA/node 28 . html #应用程序

https://www.saedsayad.com/clustering_som.htm

[3] A .钱皮,y .莱切维利耶,《大型多层次数据集的聚类:一种基于科霍宁自组织图的方法》,载于 D.A .齐格德、j .科莫洛夫斯基、j .兹特科(编辑。),PKDD 2000 年,施普林格·LNCS(LNAI),第 1910 卷,第 353-358 页,2000 年。

[4]https://www . cs . HMC . edu/~ kpang/nn/som . html #:~:text = The % 20 main % 20 draw back % 20 of % 20 The,be % 20 totally % 20 accurate % 20 or % 20 informationary

[5]https://www . comp . NUS . edu . SG/~ rudys/Arnie/tnn-som-categoricaldata . pdf

用于机器学习的自定进度学习

原文:https://towardsdatascience.com/self-paced-learning-for-machine-learning-f1c489316c61?source=collection_archive---------14-----------------------

提高神经网络收敛的聪明方法(并发现异常…)

你通过无情地向你的神经网络灌输数据来折磨它!通常,当用随机梯度下降(SGD)训练机器学习模型时,训练数据集会被打乱。通过这种方式,我们可以确保模型以无特定顺序看到不同的数据点,并且可以均衡地学习任务,而不会陷入局部最优。然而,早在 2009 年,Bengio 等人就证明了某种排序是有益的。他们将他们的方法称为课程学习,并表明如果机器学习模型的训练数据按照特定的顺序,它会达到更高的准确性。更准确地说,开头的例子比较容易,结尾的例子比较难。在他们的实验中,他们使用了一个已经训练好的模型,并让这个模型决定什么样的数据点容易或难。然后,一个新的模型在正确排序的数据集上进行训练,并收敛到比随机排序或相反课程训练的模型更高的精度。

在我目前的项目中,我遇到了一种叫做的自定进度学习 (SPL)的技术。这不是一个新的想法,相应的论文发表于大约 10 年前。无论如何,这种技术非常有趣而且仍然重要,因为它有助于随机梯度下降(SGD)更快地收敛,甚至更高的精度。它会跳过某些被认为太难的数据点。它基于课程学习,但在训练时对数据进行分类。不需要额外的预训练模型来决定排序。因此得名自学

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

苏珊·d·威廉姆斯在 Unsplash 上的照片

SPL 背后的直觉

自定进度学习这个术语起源于人类使用的一种学习技术。它允许你定义自己的速度,以适应你的学习模式。SPL 可以被看作是在学习或训练一项特殊技能,例如数学。当我们开始学习数学时,我们从数数开始,然后是加法、减法等等。我们直到某个年龄才听说矩阵乘法或者导数。同样,机器学习的 SPL 从非常简单的例子开始,一旦学会,就从已经学会的“基础”中受益,继续学习更难的例子。我把 SPL 想象成随着时间的推移缩小任务范围的一种方式。考虑一个二维空间中的简单分类任务和一个需要在正确点分割两个点云的模型。较容易的样本远离相交区域。较硬的样品靠近相交区域。模型的初始状态是这个空间某处的一条线。如果我们只从简单的数据点开始,模型会得到告诉它向某个方向前进的梯度。如果我们只从硬点开始,我们的模型会知道它是错误的,会得到一个方向,但可能会远离另一边。将点缩小到正确的区域有助于模型避免超调并更平滑地收敛,正如我在下面创建的动画中看到的那样。

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

简单数据集上的自定进度学习

该算法

诀窍很简单。它使用一个阈值,我们称之为λ。它的存在是为了与训练集中数据点的损失值进行比较。通常,λ从一个接近 0 的数开始非常低。对于每个时期,λ被乘以一个大于 1 的固定因子。被训练的模型必须计算其训练点的损失值以执行 SGD。通常,这些损失值随着进一步的训练迭代而变得更小,因为模型在训练任务方面变得更好,并且犯的错误更少。阈值λ现在确定数据点是被认为容易还是困难。每当一个数据点的损失低于λ时,它就是一个容易的数据点。如果是上面的,那就算辛苦了。在训练期间,反向传播步骤仅在容易的数据点上执行,而困难的数据点被跳过。因此,该模型在训练过程中每当其进展足够大时就增加训练实例的难度。当然,在开始时,模型可能认为没有数据点是容易的,根本不会训练。因此,SPL 的作者引入了一个热身阶段,在这个阶段不允许跳跃,只使用训练集的一小部分。

数学

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

损失函数最小化

SPL 的论文介绍了一种两步学习法。这里,损失函数被训练两次,保持一些变量对于每一步是固定的。给定模型权重“w”和变量“v”,损失函数需要最小化。在损失函数中,我们看到几项。第一项“r(w)”是一个常用的正则项,有助于模型避免过度拟合。这也是其他与 SPL 无关的损失函数的一部分。第二项是我们模型的数据点损失“f(x,y,w)”乘以变量“v”的总和。这个变量“v”稍后将决定当前数据点“(x,y)”是否足够容易进行训练。第三项是所有“v”的总和乘以阈值“lambda ”,我们在前面的章节中已经提到过。变量“v”是整数,只能取值“0”或“1”。在第一学习步骤中,变量“w”是固定的,只有变量“v”根据优化而改变。如果你仔细观察损失函数,我们会发现“λ”确实起到了阈值的作用。如果“f(x,y,w)”小于λ,并且“v”是 1,我们将从正则项中减去一些。因此,在“v=0”的情况下,我们不会减去任何东西,这比减去一些东西要大。如果“f(x,y,w)”大于λ,并且“v=1”,“f(x,y,w)-λ”将为正,我们将添加一些东西。因此,在“v=0”的情况下,我们不会添加任何东西,这比添加一些东西要小。总之,每当“f(x,y,w)”小于“λ”时,第一步通过将“v”设置为“1”来优化“L”,否则设置为“0”。第二步固定之前计算的“v”并优化“w”。如果“v”是“1”,则执行通常的模型更新,例如反向传播。如果“v”是“0”,则“f(x,y,w)”的梯度也将是 0,并且不执行更新(除了正则化项,但是为了更好地理解,现在可以忽略它)。在开始时,将阈值设置为非常低的数字将不会产生任何结果,因为所有的“v”都将是“0 ”,因为没有数据点丢失会低于阈值。因此,SPL 的作者建议在没有 SPL 的情况下进行一定次数的迭代,然后从 SPL 开始。

PyTorch 实现

在下面的代码示例中,我展示了如何在虚拟数据集上用 PyTorch 实现 SPL。特别是,我们将为我在这篇博文开头展示的动画进行训练。首先,我们将定义一个非常简单的模型,接受 2 个特征并输出两个数字,这两个数字定义了每个类别的概率。输出告诉我们模型认为它看到的是什么类。为了将输出转换成概率,我们使用了 softmax 函数。不过,在代码中,我使用了 log_softmax 函数。这是由于我稍后使用的损失函数。最后,模型以同样的方式训练。

**import** torch
**import** torch.nn **as** nn

**class** Model(nn.Module):
    **def** __init__(self, input_size, output_size):
        super(Model, self).__init__()
        self.input_layer = nn.Linear(input_size, output_size)

    **def** forward(self, x):
        x = self.input_layer(x)
        **return** torch.log_softmax(x, dim=1)

损失函数代码可以在下一节看到。这里我们计算每个点的损耗,也就是 NLL 损耗。如果损失小于阈值,我们将损失乘以 1,否则乘以 0。因此,零乘损失对训练没有任何影响。

**import** torch
**from** torch **import** Tensor
**import** torch.nn **as** nn

**class** SPLLoss(nn.NLLLoss):
    **def** __init__(self, *args, n_samples=0, **kwargs):
        super(SPLLoss, self).__init__(*args, **kwargs)
        self.threshold = 0.1
        self.growing_factor = 1.3
        self.v = torch.zeros(n_samples).int()

    **def** forward(self, input: Tensor, target: Tensor, index: Tensor) -> Tensor:
        super_loss = nn.functional.nll_loss(input, target, reduction=**"none"**)
        v = self.spl_loss(super_loss)
        self.v[index] = v
        **return** (super_loss * v).mean()

    **def** increase_threshold(self):
        self.threshold *= self.growing_factor

    **def** spl_loss(self, super_loss):
        v = super_loss < self.threshold
        **return** v.int()

最终,训练函数看起来和往常一样。我们加载一个数据加载器,初始化模型和优化器,并开始多次遍历数据集。为了简单起见,我省略了动画的绘图功能。

**import** torch.optim **as** optim

**from** model **import** Model
**from** dataset **import** get_dataloader
**from** loss **import** SPLLoss

**def** train():
    model = Model(2, 2, 2, 0)
    dataloader = get_dataloader()
    criterion = SPLLoss(n_samples=len(dataloader.dataset))
    optimizer = optim.Adam(model.parameters())

    **for** epoch **in** range(10):
        **for** index, data, target **in** dataloader:
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target, index)
            loss.backward()
            optimizer.step()
        criterion.increase_threshold()
    **return** model

整个项目可以在我的 GitHub 库中找到。你可以随意摆弄它。此外,绘图功能可以在那里找到。

异常检测

由于 SPL 方法是以某种方式根据基于损失的硬度对数据点进行排序,所以我有了用它进行异常检测的想法。异常是指与数据集中的任何其他数据点都不相似的数据点,距离很远,可能是错误输入或系统错误的结果。如果数据集中出现异常,其损失应该高于正常点的损失,因为机器学习模型不能概括错误,如果它们很少出现。SPL 的方法最终应该会越过异常点。这样,通过观察数据点的“激活”顺序,我们可以很容易地将它们归类为异常,即认为它们很容易。

对于这个实验,我使用了前面提到的代码,并且没有运行固定数量的时期。相反,只要有超过阈值的 5 个数据点,我就运行训练,因此被认为是困难的。一旦我有 5 个或更少,我就停止训练,把它们标为红点。正如你在下面的动画中看到的,算法在蓝云的左下部分发现了异常。我添加了这个异常,从橙色质心取最远的点,并将其类改为“橙色”。

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

最后用红点表示异常

当然,这个例子并不难,但它说明了异常检测面临的问题。如果维度多于 2 或 3,任务会变得更加复杂,并且会出现明显的异常,就像我们的例子中发现的那样不容易。

结论

为什么不是每个人都用 SPL?找到阈值的正确起始因子值和增长因子值需要一些时间,因为这不是通用的,会因模型、损失函数和数据集而异。对于我在这篇文章中使用的例子,我不得不多次尝试,最终找到正确的配置。假设你有一个非常大的数据集和一个非常大的模型。在你开始实际训练之前,多次检查整个进度基本上是不可行的。然而,还有多种适合不同培训设置的其他课程学习技巧。尽管有这些观点,目前的想法是一个非常直观的想法,很容易掌握,工作起来也很有趣。它基本上只是你需要优化的另一组超参数;-)

资源

链接

报纸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值