基于 OpenCV 和 Python 的 YOLO 物体检测
Image Source: darknet github repo
如果你一直在关注物体探测领域的进步,你可能已经习惯了听到“YOLO”这个词。这已经成了一个流行词。
YOLO 到底是什么?
YOLO(你只看一次)是一种进行物体检测的方法。这是代码如何检测图像中的对象背后的算法/策略。
这个想法的官方实现可以通过 DarkNet (作者用 C 从头开始的神经网络实现)获得。它在 github 上可供人们使用。
早期的检测框架以不同的比例多次查看图像的不同部分,并重新利用图像分类技术来检测对象。这种方法既慢又低效。
YOLO 采取了完全不同的方法。它只查看整个图像一次,并通过网络一次,检测对象。因此得名。它非常快。这就是它如此受欢迎的原因。
还有其他流行的对象检测框架,如更快的 R-CNN 和 SSD 也广泛使用。
在这篇文章中,我们将看看如何在 OpenCV 中使用预先训练好的 YOLO 模型,并立即开始检测物体。
OpenCV dnn 模块
DNN(深度神经网络)模块最初是opencv_contrib
repo 的一部分。去年它已经被转移到opencv
repo 的主分支,使用户能够在 OpenCV 本身内部对预训练的深度学习模型进行推理。
(这里需要注意的一点是,dnn
模块不是用来培训的。只是为了对图像/视频进行推理。)
最初只支持 Caffe 和 Torch 型号。随着时间的推移,对 TensorFlow 等不同框架/库的支持正在增加。
最近增加了对 YOLO/暗网的支持。我们将使用 OpenCV dnn 模块和预训练的 YOLO 模型来检测常见对象。
我们开始吧…
说够了。让我们开始写代码。(显然是用 Python)
安装依赖项
要执行我们将要编写的代码,需要做以下事情。
- Python 3
- Numpy
- OpenCV Python 绑定
Python 3
如果你用的是 Ubuntu,很可能已经安装了 Python 3。在终端运行python3
检查是否安装。如果没有安装,请使用
sudo apt-get install python3
对于 macOS,请参考我之前关于 macOS 的深度学习设置的帖子。
如果你需要一个起点,我强烈推荐使用 Python virtualenvironment.
看看我之前的帖子。
Numpy
pip install numpy
这将安装numpy.
确保 pip 链接到 Python 3.x ( pip -V
将显示此信息)
如果需要,使用pip3
。如果尚未安装,使用sudo apt-get install python3-pip
获取pip3
。
OpenCV-Python
您需要从 github上的 master 分支的源代码中编译 OpenCV 来获得 Python 绑定。(推荐)
Adrian Rosebrock 在 PyImageSearch 上就此写了一篇很好的博文。(从主分支下载源代码,而不是从存档下载)
如果您被从源代码获取 OpenCV Python 绑定的指令弄得不知所措,您可以使用
pip install opencv-python
这不是由 OpenCV.org 官方维护的。这是一个社区维护的。感谢奥利-佩卡·海尼索的努力。
命令行参数
该脚本需要四个输入参数。
- 输入图像
- YOLO 配置文件
- 预先训练的 YOLO 举重
- 包含类名的文本文件
所有这些文件都可以在我整理的 github 知识库中找到。(readme 中提供了下载预训练重量的链接。)
您也可以通过键入以下内容在“终端”中下载预训练的重量
wget [https://pjreddie.com/media/files/yolov3.weights](https://pjreddie.com/media/files/yolov3.weights)
这个特定的模型是在微软的 COCO 数据集(上下文中的公共对象)上训练的。它能够检测 80 种常见物体。完整名单见此处。
输入图像可以是你的选择。样品输入可在 repo 中获得。
通过键入以下命令运行脚本
$ python yolo_opencv.py --image dog.jpg --config yolov3.cfg --weights yolov3.weights --classes yolov3.txt
准备输入
读取输入图像并获得其宽度和高度。
读取包含人类可读形式的类名的文本文件,并将类名提取到一个列表中。
为不同的类生成不同的颜色来绘制边界框。
net = cv2.dnn.readNet(args.weights, args.config)
上面一行读取权重和配置文件并创建网络。
blob = cv2.dnn.blobFromImage(image, scale, (Width,Height), (0,0,0), True, crop=False)net.setInput(blob)
上面的线准备输入图像运行通过深度神经网络。
输出图层和边界框
通常,在顺序 CNN 网络中,在末端将只有一个输出层。在我们使用的 YOLO v3 架构中,有多个输出层给出预测。get_output_layers()
函数给出了输出图层的名称。输出层不与任何下一层相连。
draw_bounding_box()
函数在给定的预测区域上绘制矩形,并在方框上写入类名。如果需要,我们也可以写置信值。
运行推理
outs = net.forward(get_output_layers(net))
上面的线是通过网络进行精确前馈的地方。关键时刻到了。如果我们不指定输出图层名称,默认情况下,它将仅从最终输出图层返回预测。任何中间输出层都将被忽略。
我们需要检查来自每个输出层的每个检测,以获得类 id、置信度和边界框角,更重要的是忽略弱检测(具有低置信度值的检测)。
非最大抑制
尽管我们忽略了弱检测,但仍会有许多重复的检测和重叠的边界框。非最大抑制会删除重叠程度高的长方体。
Source: PyImageSearch
最后,我们查看剩下的检测,并在它们周围绘制边界框,显示输出图像。
I do not own copyright for the images used in this post. All are from Google Images.
摘要
在这篇文章中,我们看了如何使用 OpenCV dnn 模块和预训练的 YOLO 模型来进行物体检测。我们只是触及了表面。物体检测有更多的功能。
我们还可以训练一个模型来检测我们自己感兴趣的对象,这些对象没有包含在预训练的模型中。我将在未来更多地报道对象检测,包括其他框架,如更快的 R-CNN 和 SSD。请务必订阅我的博客,以便在新帖子发布时得到通知。
目前就这些。感谢阅读。我希望这篇文章对开始物体检测有用。欢迎在评论中分享你的想法,或者你可以在 twitter 上联系我。
和平。
YOLO v3 有什么新功能?
你只看一次,或 YOLO,是一个更快的对象检测算法。虽然它不再是最准确的对象检测算法,但当您需要实时检测时,它是一个非常好的选择,不会损失太多的准确性。
几周前,YOLO 的第三个版本出来了,这篇文章旨在解释 YOLO v3 中引入的变化。这不会是一个解释 YOLO 到底是什么的帖子。我想你知道 YOLO v2 是如何工作的。如果不是这样,我推荐你去看看以下由 Joseph Redmon et all 撰写的论文,了解一下 YOLO 是如何运作的。
YOLO v3:更好,不是更快,更强
YOLO v2 论文的官方标题似乎是 YOLO 是一种基于牛奶的儿童健康饮料,而不是一种物体检测算法。它被命名为“YOLO9000:更好、更快、更强”。
对于当时的 YOLO 9000 是最快的,也是最准确的算法之一。然而,几年后,RetinaNet 等算法不再是最准确的,SSD 在准确性方面优于它。然而,它仍然是最快的。
但是在 YOLO v3 中,这种速度被用来换取准确性的提高。虽然早期版本在 Titan X 上运行速度为 45 FPS,但当前版本的速度约为 30 FPS。这与称为暗网的底层架构的复杂性增加有关。
暗网-53
YOLO v2 使用定制的深度架构 darknet-19,这是一个最初的 19 层网络,补充了 11 层用于对象检测。YOLO v2 采用 30 层架构,经常难以检测到小物体。这是由于图层对输入进行缩减采样时丢失了细粒度要素。为了补救这一点,YOLO v2 使用了一个身份映射,连接来自前一层的特征映射来捕获低级特征。
然而,YOLO v2 的架构仍然缺少一些最重要的元素,这些元素现在是大多数最先进的算法中的主要元素。没有残余块、没有跳过连接和没有上采样。YOLO v3 包含了所有这些。
首先,YOLO v3 使用了 Darknet 的一个变种,它最初在 Imagenet 上训练了 53 层网络。对于检测任务,在其上堆叠了另外 53 层,为我们提供了一个用于 YOLO v3 的 106 层全卷积底层架构。这就是 YOLO v3 比 YOLO v2 慢的原因。这是 YOLO 建筑现在的样子。
Ok, this diagram took a lot of time to make. I want a clap or ten for this!
三级检测
较新的架构拥有残余跳过连接和上采样。v3 最显著的特点是在三个不同的尺度上进行检测。 YOLO 是一个完全卷积网络,其最终输出是通过在特征图上应用 1 x 1 内核生成的。在 YOLO v3 中,通过在网络中的三个不同位置的三个不同大小的特征图上应用 1×1 检测核来完成检测。
检测核的形状是 **1 x 1 x (B x (5 + C))。**这里 B 是特征图上的一个单元可以预测的边界框的数量,“5”是 4 个边界框属性和一个对象置信度,C 是类的数量。在 COCO 上训练的 YOLO v3 中,B = 3,C = 80,所以内核大小是 1×1×255。由该内核产生的特征图具有与先前特征图相同的高度和宽度,并且具有如上所述的沿着深度的检测属性。
Image credits: https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/
在我们进一步讨论之前,我想指出网络的步距,或一个层被定义为它对输入进行下采样的比率。在下面的例子中,我假设我们有一个尺寸为 416 x 416 的输入图像。
YOLO v3 在三个尺度上进行预测,这三个尺度是通过将输入图像的维度分别下采样 32、16 和 8 而精确给出的。
第一次检测由第 82 层进行。对于前 81 层,网络对图像进行下采样,使得第 81 层的步距为 32。如果我们有一个 416 x 416 的图像,那么得到的特征图的大小将是 13 x 13。这里使用 1×1 检测内核进行一次检测,得到 13×13×255 的检测特征图。
然后,来自层 79 的特征图在被 2x 上采样到 26×26 的维度之前经历几个卷积层。该特征图然后与来自层 61 的特征图深度连接。然后,组合的特征图再次经过几个 1×1 卷积层,以融合来自先前层的特征(61)。然后,由第 94 层进行第二次检测,产生 26×26×255 的检测特征图。
再次遵循类似的过程,其中来自层 91 的特征图在与来自层 36 的特征图深度连接之前经历几个卷积层。像以前一样,几个 1×1 卷积层接着融合来自前一层的信息(36)。我们在第 106 层制作最终的 3,产生大小为 52×52×255 的特征地图。
更擅长探测更小的物体
不同层的检测有助于解决检测小物体的问题,这是 YOLO v2 经常遇到的问题。与先前层连接的上采样层有助于保留有助于检测小对象的细粒度特征。
13 x 13 层负责检测大型物体,而 52 x 52 层检测较小物体,26 x 26 层检测中等物体。下面是不同图层在同一对象中拾取的不同对象的对比分析。
锚箱的选择
YOLO v3 总共使用 9 个锚箱。每个刻度三个。如果你在自己的数据集上训练 YOLO,你应该使用 K-Means 聚类来生成 9 个锚。
然后,按维度降序排列锚点。为第一个音阶指定三个最大的锚,为第二个音阶指定接下来的三个,为第三个音阶指定最后三个。
每个图像更多的边界框
对于相同大小的输入图像,YOLO v3 比 YOLO v2 预测更多的边界框。例如,在其 416 x 416 的原始分辨率下,YOLO v2 预测 13 x 13 x 5 = 845 个盒子。在每个网格单元,使用 5 个锚来检测 5 个盒子。
另一方面,YOLO v3 以 3 种不同的比例预测盒子。对于 416×416 的相同图像,预测的框的数量是 10,647。这意味着 YOLO v3 预测的盒子数量是 YOLO v2 预测的 10 倍。你很容易想象为什么它比 YOLO v2 慢。在每个尺度上,每个网格可以使用 3 个锚点预测 3 个盒子。因为有三个秤,所以总共使用 9 个锚箱,每个秤使用 3 个。
损失函数的变化
早些时候,YOLO v2 的损失函数是这样的。
Image credits: https://pjreddie.com/media/files/papers/yolo_1.pdf
我知道这有点吓人,但请注意最后三项。其中,第一个惩罚负责预测对象的包围盒的对象性分数预测(这些的分数理想地应该是 1),第二个惩罚没有对象的包围盒(分数理想地应该是 0),最后一个惩罚预测对象的包围盒的类预测。
YOLO v2 中的最后三项是平方误差,而在 YOLO v3 中,它们被交叉熵误差项所取代。换句话说,YOLO v3 中的对象置信度和类预测现在通过逻辑回归来预测。
当我们训练检测器时,对于每个地面真值框,我们分配一个边界框,它的锚点与地面真值框有最大的重叠。
不要再对课程进行任何修改
YOLO v3 现在对图像中检测到的物体进行多标签分类。
在早期的 YOLO,作者们习惯于对类得分进行软最大化,并将得分最高的类作为包含在包围盒中的对象的类。这在 YOLO 版本 3 中已被修改。
Softmaxing 类基于这样的假设:类是互斥的,或者简单地说,如果一个对象属于一个类,那么它不能属于另一个类。这在 COCO 数据集上运行良好。
然而,当我们在数据集中有像 Person 和 Women 这样的类时,上面的假设就不成立了。这就是为什么《YOLO》的作者没有软化这些阶级的原因。相反,使用逻辑回归来预测每个类别分数,并且使用阈值来预测对象的多个标签。分数高于该阈值的类被分配到盒子。
标杆管理
在 **COCO mAP 50 基准测试中,YOLO v3 的性能与 RetinaNet 等其他先进检测器不相上下,但速度要快得多。**它也优于固态硬盘及其变体。这是报纸上的表演对比。
YOLO vs RetinaNet performance on COCO 50 Benchmark
但是,但是,但是,YOLO 在 COCO 基准测试中失利,IoU 值较高,用于拒绝检测。我不打算解释 COCO 基准是如何工作的,因为这超出了工作范围,但 COCO 50 基准中的 50 是预测的边界框与对象的地面真实框对齐程度的度量。这里的 50 相当于 0.5 IoU。如果预测和基本事实框之间的 IoU 小于 0.5,则该预测被分类为定位错误并被标记为假阳性。
在基准测试中,这个数字较高(比如 COCO 75),盒子需要更好地对齐,以免被评估标准拒绝。这是 YOLO 被 RetinaNet 超越的地方,因为它的边界框没有 RetinaNet 对齐。这里有一个更广泛的基准测试的详细表格。
RetinaNet outperforms YOLO at COCO 75 benchmark. Notice, how RetinaNet is still better at the AP benchmark for small objects (APs)
做一些实验
您可以使用 Github repo 中提供的代码在图像或视频上运行检测器。代码需要 PyTorch 0.3+,OpenCV 3,Python 3.5。设置 repo,您可以在它上面运行各种实验。
不同的尺度
这里看一下不同的检测层获得了什么。
python detect.py --scales 1 --images imgs/img3.jpg
Detection at scale 1, we see somewhat large objects are picked. But we don’t detect a few cars.
python detect.py --scales 2 --images imgs/img3.jpg
No detections at scale 2.
python detect.py --scales 3 --images imgs/img3.jpg
Detection at the largest scale (3). Look how only the small objects are picked up, which weren’t detected by scale 1.
不同的输入分辨率
python detect.py --reso 320 --images imgs/imgs4.jpg
Input resolution of the image: 320 x 320
python detect.py --reso 416 --images imgs/imgs4.jpg
Input resolution of the image: 416 x 416
python detect.py --reso 608 --images imgs/imgs4.jpg
Here, we detect one less chair than before
python detect.py --reso 960 --images imgs/imgs4.jpg
Here, the detector picks up a false detection, the “Person” at the right
在我们的例子中,较大的输入分辨率帮助不大,但是它们可能有助于检测带有小物体的图像。另一方面,较大的输入分辨率会增加推理时间。这是一个超参数,需要根据应用进行调整。
您可以通过访问 repo 来试验其他指标,如批量大小、对象置信度和 NMS 阈值。自述文件中已经提到了一切。
从头开始实施 YOLO v3
如果你想在 PyTorch 中自己实现一个 YOLO v3 探测器,这里有一系列我在 Paperspace 上写的教程。现在,如果你想尝试本教程,我希望你对 PyTorch 有基本的了解。如果你想从 PyTorch 的初级用户过渡到中级用户,这篇教程正合适。
进一步阅读
YOLO——你只能看一次,实时物体检测解释道
原始论文(CVPR 2016。OpenCV 人民选择奖)https://arxiv.org/pdf/1506.02640v5.pdf
约洛夫 2:【https://arxiv.org/pdf/1612.08242v1.pdf】T2
最大优势:
- 速度(每秒 45 帧,比实时速度快)
- 网络理解一般化的对象表示(这允许他们在真实世界图像上训练网络,并且对艺术品的预测仍然相当准确)。
- 更快的版本(架构更小)—每秒 155 帧,但精度较低。
- 开源:【https://pjreddie.com/darknet/yolo/
高层次想法:
与其他区域建议分类网络(快速 RCNN)相比,Yolo 架构更像 FCNN(完全卷积神经网络),它对各种区域建议执行检测,并最终对图像中的各种区域执行多次预测,并使图像(nxn)通过 FCNN 一次,输出 is (mxm)预测。这种架构在 mxm 网格中分割输入图像,并为每个网格生成 2 个边界框和这些边界框的类概率。请注意,边界框很可能比网格本身大。来自纸张:
我们将对象检测重新定义为一个单一的回归问题,直接从图像像素到边界框坐标和类别概率。
单个卷积网络同时预测多个边界框和这些框的类别概率。YOLO 在全图像上训练,直接优化检测性能。与传统的目标检测方法相比,这种统一的模型有几个优点。首先,YOLO 速度极快。因为我们把检测框架作为一个回归问题,所以我们不需要复杂的流水线。我们只是在测试时对新图像运行我们的神经网络来预测检测。我们的基础网络在 Titan X GPU 上以每秒 45 帧的速度运行,没有批处理,快速版本的运行速度超过 150 fps。这意味着我们可以实时处理流视频,延迟不到 25 毫秒。
第二,YOLO 在做预测时会对图像进行全局推理。与基于滑动窗口和区域提议的技术不同,YOLO 在训练和测试期间看到整个图像,因此它隐式地编码了关于类及其外观的上下文信息。快速 R-CNN 是一种顶级的检测方法,它会将图像中的背景斑块误认为物体,因为它看不到更大的背景。与快速的 R-CNN 相比,YOLO 产生的背景错误不到一半。
第三,YOLO 学习对象的概括表示。当在自然图像上训练和在艺术品上测试时,YOLO 远远超过 DPM 和 R-CNN 等顶级检测方法。由于 YOLO 是高度概括的,当应用于新的领域或意想不到的输入时,它不太可能崩溃。
我们的网络使用整个图像的特征来预测每个边界框。它还可以同时预测图像中所有类别的所有边界框。这意味着我们的网络对整个图像和图像中的所有对象进行全局推理。YOLO 设计支持端到端训练和实时速度,同时保持较高的平均精度。
我们的系统将输入图像划分为一个 S × S 网格。如果对象的中心落入网格单元,则该网格单元负责检测该对象。
每个网格单元预测 B 边界框和这些框的置信度得分。这些置信度得分反映了模型对盒子包含对象的置信度,以及它认为盒子预测的准确性。形式上,我们将置信度定义为 Pr(对象)IOU。如果该单元中不存在任何对象,置信度得分应该为零。否则,我们希望置信度得分等于预测框和实际情况之间的交集(IOU)
每个边界框由 5 个预测组成:x,y,w,h 和置信度。(x,y)坐标表示相对于网格单元边界的盒子中心。相对于整个图像预测宽度和高度。最后,置信度预测表示预测框和任何真实框之间的 IOU。每个网格单元还预测 C 条件类概率 Pr(Classi |Object)。这些概率取决于包含对象的网格单元。我们只预测每个网格单元的一组类别概率,而不考虑盒子 b 的数量。
在测试时,我们将条件类概率和单个盒子置信度预测相乘,
Pr(Classi|Object)∗Pr(Object)∗IOU = Pr(Classi)∗IOU
,它为我们提供了每个盒子的特定于类的置信度得分。这些分数编码了该类出现在框中的概率以及预测的框与对象的匹配程度
网络架构和培训:
改变损失函数以获得更好的结果是很有趣的。有两件事很突出:
- 在训练过程中,包含对象的盒子和不包含对象的盒子的置信度预测的不同权重。
- 预测包围盒宽度和高度的平方根,以不同地惩罚小对象和大对象中的误差。
我们的网络有 24 个卷积层,后面是 2 个全连接层。我们简单地使用 1 × 1 缩减层,然后是 3 × 3 卷积层,而不是 GoogLeNet 使用的初始模块
快速 YOLO 使用具有更少卷积层(9 层而不是 24 层)和更少过滤器的神经网络。除了网络的规模之外,YOLO 和 Fast YOLO 之间的所有培训和测试参数都是相同的。
我们优化了模型输出的平方和误差。我们使用平方和误差,因为它易于优化,但是它并不完全符合我们最大化平均精度的目标。它将定位误差与可能不理想的分类误差同等加权。此外,在每个图像中,许多网格单元不包含任何对象。这将这些单元的“置信度”分数推向零,通常会压倒包含对象的单元的梯度。这可能导致模型不稳定,导致培训在早期出现偏差。为了补救这一点,我们增加了边界框坐标预测的损失,并减少了不包含对象的框的置信度预测的损失。我们使用两个参数λcoord 和λnoobj 来实现这一点。我们设置λcoord = 5,λnoobj = .5。
平方和误差同样对大盒子和小盒子中的误差进行加权。我们的误差度量应该反映大盒子中的小偏差不如小盒子中的小偏差重要。为了部分解决这个问题,我们预测边界框宽度和高度的平方根,而不是直接预测宽度和高度。
YOLO 预测每个网格单元有多个边界框。在训练时,我们只希望一个边界框预测器负责每个对象。我们分配一个预测器来“负责”预测一个对象,基于哪个预测具有最高的当前 IOU 和地面真实值。这导致边界框预测器之间的专门化。每个预测器在预测物体的特定大小、长宽比或类别方面变得更好,从而提高了整体回忆能力。
YOLO 的局限性
由于每个格网单元只能预测两个框,并且只能有一个类,因此 YOLO 对边界框预测施加了很强的空间约束。这个空间约束限制了我们的模型可以预测的附近物体的数量。我们的模型处理成群出现的小物体,比如一群鸟。由于我们的模型学会了从数据中预测边界框,它很难推广到新的或不寻常的纵横比或配置的对象。我们的模型还使用相对粗糙的特征来预测边界框,因为我们的架构具有来自输入图像的多个下采样层。最后,当我们在近似检测性能的损失函数上训练时,我们的损失函数在小边界框和大边界框中对待错误是相同的。大盒子里的小错误通常是良性的,但小盒子里的小错误对 IOU 的影响要大得多。我们错误的主要来源是不正确的定位
YOLO9000
约洛夫 2:https://arxiv.org/pdf/1612.08242v1.pdf
与快速 R-CNN 相比,YOLO 的误差分析表明,YOLO 犯了大量的定位错误。此外,与基于区域提议的方法相比,YOLO 的召回率相对较低。因此,我们主要集中在提高召回和定位,同时保持分类的准确性。
通过在 YOLO 的所有卷积层上添加批量标准化,我们在 mAP 上获得了超过 2%的改进。批处理规范化也有助于正则化模型。通过批量标准化,我们可以在不过度拟合的情况下从模型中移除漏失。
对于 YOLOv2,我们首先在 ImageNet 上以全 448 × 448 分辨率对分类网络进行 10 个时期的微调。这使得网络有时间调整其滤波器,以便更好地处理更高分辨率的输入。然后,我们在检测时微调生成的网络。这个高分辨率的分类网络给我们增加了将近 4%的地图
带锚盒的卷积。YOLO 使用卷积特征提取器上的全连接层直接预测边界框的坐标。预测偏移量而不是坐标简化了问题,并使网络更容易学习。我们从 YOLO 中移除完全连接的层,并使用锚盒来预测边界盒。使用锚盒,我们得到了一个小的准确性下降。YOLO 只预测了每张图片 98 个盒子,但是我们的模型预测了超过 1000 个锚盒。在没有锚盒的情况下,我们的中间模型得到 69.5 的 mAP,召回率为 81%。使用锚盒,我们的模型得到 69.2 的 mAP,召回率为 88%。即使 mAP 降低,但召回率的提高意味着我们的模型有更大的改进空间。
精细的特征。这种改进的 YOLO 预测在 13 × 13 特征图上的探测。虽然这对于大型对象来说已经足够了,但是对于本地化较小的对象来说,更细粒度的特性可能会有所帮助。更快的 R-CNN 和 SSD 都在网络中的各种特征地图上运行他们的建议网络,以获得一系列分辨率。我们采取了一种不同的方法,简单地添加一个穿透层,以 26 × 26 的分辨率从早期的层中引入功能。通过将相邻要素堆叠到不同的通道而不是空间位置,直通层将高分辨率要素与低分辨率要素连接起来,类似于 ResNet 中的身份映射。这样就把 26 × 26 × 512 的特征图变成了 13 × 13 × 2048 的特征图,可以和原来的特征串接起来。我们的检测器运行在这个扩展的特征映射之上,因此它可以访问细粒度的特征。这带来了 1%的性能提升。
在训练期间,我们混合来自检测和分类数据集的图像。当我们的网络看到标记为检测的图像时,我们可以基于完整的 YOLOv2 损失函数进行反向传播。当它看到分类图像时,我们只从体系结构的分类特定部分反向传播损失。
等级分类。ImageNet 标签来自 WordNet,WordNet 是一个语言数据库,用于构建概念以及它们之间的关系[12]。在 WordNet 中,“诺福克梗”和“约克夏梗”都是“梗”的下位词,梗是“猎狗”的一种,梗是“狗”的一种,梗是“犬科动物”,等等。大多数分类方法假设标签是平面结构,但是对于组合数据集,结构正是我们所需要的。
官方网站:
https://pjreddie.com/publications/
CVPR 2016 的论文展示:
复习:YOLOv1 —你只看一次(物体检测)
在这个故事里,的 YOLOv1 由艾研究中心(FAIR)审查。**该网络只需查看图像一次即可检测多个物体。**因此,它被称为 YOLO ,你只看一次。
YOLOv1 without Region Proposals Generation Steps
通过只看一次图像,检测速度是实时的(45 fps) 。快 YOLOv1 达到 155 fps。这是另一种最先进的深度学习对象检测方法,在我写这个故事的时候已经发表在 2016 CVPR 上,被引用2000 多次。( Sik-Ho Tsang @中)
下面是作者提供的 YOLOv1 示例:
YOLO Watches Sports
如果感兴趣,他们还提供了其他 YOLOv1 示例:
涵盖哪些内容
- 统一检测
- 网络架构
- 损失函数
- 结果
1.统一检测
1.1 现有技术:R-CNN
像 R-CNN 这样的现有技术首先生成 2K 个区域提议(边界框候选),然后如下检测每个区域提议内的对象:
R-CNN (First, extract region proposals; Then detect object for each region proposals)
因为需要两步,所以它们非常慢。
1.2 YOLO
YOLO 建议有一个统一的网络来一次性完成所有任务。同样,端到端的培训网络也可以实现。
YOLO Unified Detection
输入图像被分成一个 S×S 网格(S=7) 。如果对象的中心落入网格单元,则该网格单元负责检测该对象。
每个网格单元预测 B 个边界框(B=2)和这些框的置信度得分。这些置信度得分反映了模型对盒子包含对象的置信度,即盒子中的任何对象 P(对象)。
每个边界框由 5 个预测组成:x、y、w、h 和置信度。
- (x,y)坐标表示相对于网格单元边界的盒子中心。
- 相对于整个图像预测宽度 w 和高度 h。
- 置信度表示预测框和任何基础真值框之间的联合交集(IOU)。
每个网格单元还预测条件类概率 P(Classi|Object)。(班级总数=20)
下图说明了网络的输出:
The output from YOLO
输出大小变成:7×7×(2×5+20)=1470
2.网络体系结构
YOLO model network architecture
**该模型由 24 个卷积层和 2 个全连接层组成。**交替的 1×1 卷积层减少了来自前面层的特征空间。(GoogLeNet 中使用了 1×1 conv 以减少参数数量。)
**快速 YOLO 更少的卷积层(9 层而不是 24 层)以及这些层中更少的滤波器。**网络管道总结如下:
Whole Network Pipeline
因此,我们可以看到,输入图像通过网络一次,然后可以检测对象。我们可以进行端到端学习。
3.损失函数
3.1 损失函数解释
Loss Function
如上图所示,损失函数中有 5 项。
- 第一项(x,y) :边界框 x 和 y 坐标被参数化为特定网格单元位置的偏移量,因此它们也被限制在 0 和 1 之间。并且只有在有目标的情况下才估计误差平方和(SSE)。
- 第二项(w,h) :边界框的宽度和高度由图像的宽度和高度归一化,使它们落在 0 和 1 之间。SSE 只有在有对象的情况下才被估计。因为大盒子中的小偏差不如小盒子中的小偏差重要。边界框宽度 w 和高度 h 的平方根,而不是宽度和高度直接解决这个问题。
- 第三项和第四项(置信度)(即预测框和任何地面真实框之间的 IOU):在每个图像中,许多网格单元不包含任何对象。这将这些单元的“置信度”分数推向零,通常会压倒包含对象的单元的梯度,并使模型不稳定。因此,不包含对象的盒子的置信度预测的损失减少,即 λnoobj =0.5。
- 第五项(类概率):有对象时类概率的 SSE。
- λcoord :由于第三和第四项中提到的相同原因,λcoord = 5,以增加边界框坐标预测的损失。
3.2 其他细节
除了最后一层,其他所有层都使用 leaky ReLU 作为激活函数。ImageNet对前 20 个卷积层进行预训练,使其在一周内达到 88%的前 5 名准确率。**然后,根据来自 PASCAL VOC 2007 和 2012 的训练和验证数据集,对网络进行大约 135 个时期的训练。**在对 2012 年进行测试时,我们还纳入了 VOC 2007 年的测试数据用于培训。使用的批次大小为 64。还使用了第一个完全连接的层的丢弃和数据增加。
在 PASCAL VOC 上,预测了每幅图像 98 个包围盒。
一些大的物体或者多个小区边界附近的物体可以同时被多个小区很好的定位。使用非最大抑制。
4.结果
4.1 VOC 2007
mAP and FPS Results (VOC 2007)
- YOLO : 63.4 mAP(均值平均预测)和 45 FPS。与 DPM、R-CNN、快速 R-CNN 和更快 R-CNN 相比,YOLO 可以在相似的 mAP 下获得实时性能。
- 快速 YOLO : 52.7%贴图,155 FPS。如此高的 FPS,与 100Hz DPM 相比,它也有非常高的 mAP。
- YOLO VGG-16 : YOLO 使用 VGG016 架构,由于没有 1×1 卷积来减少模型大小,所以速度很慢,即使有 66.4%的 mAP 也只有 21 FPS。
Error Analysis (VOC 2007)
物体定位:与快速 R-CNN 相比,YOLO 很难正确定位物体。
背景误差 : YOLO 背景误差较小。快速 R-CNN 有 13.6%的顶部检测是假阳性。
由于 YOLO 和快速 R-CNN 各有利弊,所以可以将它们结合起来以具有更高的准确性。
Model combination with Fast R-CNN (VOC 2007)
模型组合后,获得了 75.0%的 mAP,与其他组合相比具有相对较高的精度。
2012 年 4.2 VOC
Fast R-CNN + YOLO (VOC 2012)
快速 R-CNN + YOLO 具有 70.7%的 mAP,这是最高性能的检测方法之一。
4.3 普遍性
在 Picasso 数据集和 People-Art 数据集上也尝试了艺术品上的人物检测。毕加索的模特接受 VOC 2012 培训,而人物艺术的模特接受 VOC 2010 培训。
Generalization Results
- R-CNN 在 VOC 2007 上 AP 高。然而,R-CNN 在应用到艺术品上时,就大大地减少了。 R-CNN 使用 选择性搜索为自然图像调整的边界框提议。
- DPM 将其 AP 很好地应用于艺术品。先前的工作理论上认为 DPM 性能良好,因为它具有对象形状和布局的强空间模型。
- YOLO 在 VOC 2007 上有很好的表现,当应用于艺术品时,它的 AP 降解比其他方法少。艺术作品和自然图像在像素级别上非常不同,但它们在对象的大小和形状方面相似,因此 YOLO 仍然可以预测良好的边界框和检测。
下面显示了一些非常有趣的可视化结果:
Some detection results
以后再讲 YOLOv2 和 YOLOv3。
参考
- 【2016 CVPR】【yolov 1】
T5【你只看一次:统一的,实时的物体检测
我的评论
[ R-CNN ] [ 快速 R-CNN ] [ 更快 R-CNN][Google net]
使用暗流的 YOLOv2 对象检测
这个故事介绍了如何检测物体。如果您计划构建一个受益于对象检测的应用程序,这将很有帮助。幕后使用 YOLOv2 算法。不过我用的是开源实现,“ Darkflow ”,所以不需要担心细节。
简而言之,执行对象检测需要 4 个步骤。还有一些更多的细节,所以如果你真的想使用我的代码,请访问 我的 github 库 了解这个故事。这是这个故事的朱庇特笔记本。
安装暗流
其实你可以访问 Darkflow 的 github 资源库 并探索安装指南。在这里,我将让指令尽可能简单。
$ pip install Cython
$ git clone [https://github.com/thtrieu/darkflow.git](https://github.com/thtrieu/darkflow.git)
$ cd darkflow
$ python3 setup.py build_ext --inplace
$ pip install .
下载重量
有两种方式下载预训练的重量。首先,你可以从YOLO 项目官方网页 下载。第二,你可以在这里 下载 哪个 Darkflow 作者自己训练的版本。我决定使用第二种方法,因为我正在使用暗流实现。如果你愿意,你可以试试第一种方法。
Red circle indicates the weight file you need to download
建立模型
正如您在下面看到的,构建模型非常简单。首先,您需要定义选项对象。然后,您需要用选项实例化 TFNet 类对象。
选项是模型及其环境的规范。下面的截图是您可以指定的完整列表。我将为这个故事使用 【模型】【加载】【阈值】***【GPU】***选项。
Darkflow Model Options
型号选项要求您指定想要使用的型号。有预定义的模型,我这里用的是 yolo.cfg 。这个文件包含了模型架构的完整描述。
加载选项用于指定您想要使用的权重文件。由于我建议从 这里 下载 yolo.weights,我指定了。如果您有自己的预训练权重文件,这是您让模型知道的地方(就像在您训练自定义对象之后,您的系统将产生特定的权重文件)。
当您的系统上有 gpu 时,使用 gpu 选项。这将提高预测任务的速度。
阈值选项是保留被检测对象的置信概率值的底线。我把它设置为 0.1,它似乎相当低。然而,我选择这个值来试验模型可以检测到多少个对象,并且我可以在以后进行过滤。
模型完全加载后,您将得到如上所示的输出。
检测物体并在图片上绘制方框
上面的一行代码是你检测物体所需要做的一切。唯一指定的参数是以 numpy 数组样式表示的图像。如果你打印出结果,你会看到下面显示的对象列表。每个键在对象中的含义看起来非常直观。
我在下面定义了装箱函数,这样我也可以在图像和视频上重复使用。我使用 opencv-python 模块在图像上放置盒子和标签。
使用装箱功能,您可以显示如下结果图像。
或者你也可以像 follow 一样在视频上执行相同的任务。
*请根据您的操作系统在此处检查支持的视频输出格式,并将其设置在 cv2 上。VideoWriter_fourcc 函数。就我而言,我在 Windows 10 上测试过,所以我指定了*“DIVX”。
结果和评价
以下是我实验过的一些结果。
在各种图片上都好看。然而,我在第二张和第四张图片上看到了一些缺点。
对于第二张图片的情况,看起来 YOLO 人并不希望一只狗出现在图片中间。我想很多预先训练的照片都有狗在地上。
YOLO 实际上非常善于发现人。然而,对于第四张图片的情况,处于动态意外姿势的人看起来不容易被检测到。此外,当太多的对象重叠时,似乎很难检测到它们中的每一个。
我可以看到这个视频类似的问题。YOLO 可能受过有人驾驶汽车的训练。对于这个视频,即使是一只狗被关在车里,算法也预测出这只狗是一个人。此外,后座被预测为具有高置信度的人。
YOLOv2 使用 Darkflow 检测您自己的对象
上一个故事 前一个展示了关于dark flow其中 是 YOLOv2 对象检测模型的实现之一
这个故事介绍了在自定义数据集上进行对象检测的基本步骤。作为一个例子,我自己做了足球检测。简而言之,我将展示如何 1 .准备数据集,2 .训练模型和 3 .预测对象。
我在 Github上写过一篇 Jupyter 的笔记本跟这个故事有关。如果您想亲自尝试,请访问 此处 获取完整的数据集和训练程序。**
准备数据集
这一步要做的第一件事是搜索你感兴趣的媒体(图像或视频)文件。就我而言,我选择了足球,因为当我在这里时,2018 年俄罗斯世界杯正在进行。在 Youtube 上更容易找到精彩的视频剪辑,我可以制作很多截图(通过这个链接,你会找到一种从视频文件制作大量截图的方法)。如果你只是从网上收集图像文件,那也很好。只要记住所有来自互联网的你的图像文件或者截图必须属于一个相似的(或者相同的如果可能的话)发行版因为我们不打算构建通用 AI。
其次,是对采集到的图像数据集进行预处理的时候了。可以用图像和相关联的注释来训练 YOLO 模型。图像文件链接到注释文件,而注释文件包含多个注释信息。注释指示图像中对象的位置及其大小,如(x_top,y_top,x_bottom,y_bottom,width,height)。这些批注应该是自己手写的,可能需要很长时间。然而,幸运的是,有很好的工具来简化这项任务。我选择了 这个工具 (labelImg) 。
labelImg TOOL for bounding boxes
从上面的截图可以看出,你可以很容易地在你感兴趣的对象周围绑定框。我只有足球的边界框,但是多个对象也可以。只要记住应该显示 PascalVOC 文本,因为它表示 YOLO 的注释样式现在被选中,即使你使用这样的工具,这个过程也要花费很长时间。
如果你想要我的数据集…
****我已经上传并分享了我的预处理图像数据集和相关注释。你可以在这里 下载 。如果您想亲自试验训练/预测任务,您可能需要它;如果您想添加更多数据集以提高模型的性能,您也可能需要它。
预测对象
在这一步中, 在预测之前,训练好的模型应该准备进行推论。为了获得一个训练有素的模型,以下是你应该做的。
- 在 COCO 或 VOC 数据集上找到预训练模型
- 更改配置,使模型适合您自己的情况
- 建立模型
- 训练模型
首先是,在我的例子中,我使用了(yolov 2 的开源项目) 其预训练参数 。请访问我的 github 库,查看完整的使用说明。****
第二个,应该有一个指定型号配置的文件。如果没有,您应该在代码本身中更改它。对于暗流,有一个文件(*。cfg)。最后,你应该改变最后一层的一些值。例如,在我的例子中,我只想检测一个足球。于是,我把“类”的值改成了 1(VOC 和 COCO 数据集的类数分别是 20 和 80)。由于最后一层中单元(类)的数量,一些相关联的参数数量也应该被适当地改变。根据 darkflow 的文档,我需要将【卷积】层(倒数第二层)中的过滤器更改为 num * (classes + 5),即 30 。****
第三和第四步骤可能与各种实施方式不同。在 darkflow 中,下面的代码显示了如何构建模型。
它将打印出模型的架构,其中包含一些与预训练模型不同的相关更改。然后下面一行代码开始训练过程。
我确实运行了 100 个纪元,每个纪元有 23 个步骤。这样 2300 的总步骤就完成了。供你参考,**我用的是英伟达 GTX 1080Ti ,用了大约一个小时完成训练过程。****
每 250 步,darkflow 就会创建一个检查点文件。通过指定一个检查点文件,您可以从您离开的地方开始。此外,您可以使用检查点文件分发您的训练模型。下面的代码显示了如何加载它来预测流程。(-1 表示最新的检查点)
最后,您有了自己的模型来检测定制对象。如何用边界框显示图像或视频的详细描述在 前面的故事 中有解释。也请访问 github 库 获取更详细的解释。
图像和视频预测结果
我用网上的随机图片做了实验(上)。它就像我期待的那样工作。视频显示了视频文件(下图)上的预测结果。****
最后的想法
- 我发现在足球比赛的宽视角下,球的检测相当困难,因为这个物体非常小(比你的指尖还小)。
- 每个数据应该来自非常相似的分布。由于足球比赛的照片是从各种不同的角度拍摄的,有时很难预测。
- 从不同的情况下收集尽可能多的数据。
- 我发现数据集更好的包含了很多任意位置的物体。因为足球几乎出现在比赛的每个位置,所以看不见的位置很难预测。
- 最后,足球有时会出现在球员之间或被球员部分隐藏,这也使得算法难以预测。数据集应该反映这种特殊情况。
Yonohub:使用积木的自动驾驶汽车
在过去的几周里,我有机会尝试汽车行业最有前途的创新产品之一,我想与您分享我的经验和快速演示。
欢迎来到 Yonohub !
What is Yonohub?
“Yonohub 是一个基于网络的云系统,用于构建、共享和评估由许多构建模块组成的复杂自动驾驶汽车系统。Yonohub 有一个拖放工具来构建复杂的系统,一个市场来分享和赚钱,一个定制开发环境的构建器,等等。
Yonohub 提供了几个功能强大且易于使用的应用程序,在建造自动驾驶汽车的整个过程中支持开发人员和研究人员:使用 Jupyter Notebook 开发算法,使用 YonoArc 部署和测试算法,使用yono jobs安排夜间培训工作,在 YonoStore 上分享和销售算法。
Yonohub Apps
这还不是全部。如你所见,还有现在流行的 GitLab 和 Tensoboard, YonoDrive 作为 Yonohub 的数据管理器, YonoEBuilder。
有了 **YonoEBuilder,**你再也不用担心你的算法依赖性了。只需点击几下,就可以使用各种包管理器(APT、pip 或 Conda)构建您的环境,并与您的团队或客户共享。
YonoArc 是我最想尝试的应用之一。你可以用不同的数据集来模拟和测试不同的算法,你所需要做的就是拖放块。很酷,不是吗?
该应用程序附带一些免费的块:卡拉模拟器,Gazebo 模拟器,YOLO 对象检测,SSD 对象检测,KITTI 数据集,Berkeley DeepDrive 数据集,等等。
当然,您可以使用 YonoArc 的 Python 或 Octave 简单 API 创建自己的块,甚至可以导入用 C++或 Python 开发的现有 ROS 节点。如果你和我一样是 ROS 的粉丝,你会喜欢的!
让我和你们分享一个快速演示,在这个演示中,我使用了来自 T2 OSRF T3 的开源代码 T1。它使用 Gazebo 来模拟一辆普锐斯混合动力车,该车有 4 个摄像头,车顶上的 16 束激光雷达,8 个超声波传感器和 2 个平面激光雷达。所有这些传感器都可以使用 RViz 进行可视化,RViz 已经作为免费的 YonoArc 模块提供。这辆车的油门、刹车、转向和传动装置都可以用我创造的另一个模块轻松控制。
Gazebo world 文件是城市和高速公路立交的模型。您可以使用 Gazebo models repository 来包含汽车、人类、建筑等许多其他模型。
让我更详细地向您展示如何做到这一点。
创建凉亭模拟环境
任何街区都需要一个环境,所以我用 YonoEBuilderT5 到为凉亭街区创建一个环境:****
- 在 Yonohub 的主视图中点击图标,打开 YonoEBuilder。
- 单击创建新环境。所有的环境都预装了 ROS Melodic。
- 选中“Gazebo Simulator”复选框,确保您的环境中有它。
- 检查“NVIDIA 驱动程序和 CUDA ”,让 GPU 访问您的块。
Creating the Gazebo Environment Using YonoEbuilder
在 Packages 选项卡下,我们可以为我们的块安装任何需要的包。对于我们的演示,我们没有任何必需的包,所以我们将跳过这一步。
Creating the Gazebo Environment Using YonoEBuilder
现在一切准备就绪。让我们点击“构建”并让 YonoEBuilder 完成它的工作。让我们喝一杯咖啡,等到环境状态从“正在构建”变为“就绪”。
创建露台模拟块
让我们去 YonoArc 并打开这里的块管理器。
在块管理器页面中,让我们单击“创建项目”并填写必填字段。首先,不要忘记选择我们在上述步骤中创建的环境。然后,对于源代码,我们可以使用下面的 GitLab repo,它包含了 Gazebo 9 和 ROS Melodic 支持的汽车演示工作区的修改版本。现在,我们可以单击创建。
下一步是构建项目。在 Block Manager 页面中,单击新项目旁边的 Build。
构建完项目后,让我们切换到 Blocks 选项卡并选择我们的项目。在这里,我们可以配置数据块端口、资源要求、权限和属性。对于资源模型,我们选择“GK0.1 (CPU: 0.4 核,RAM: 6.1 GB)”因为这个模型提供了一个 Tesla K80 GPU。
汽车演示包包含一个 ROS 启动文件,这个启动文件负责启动 Gazebo,加载世界,生成模型,并启动所有需要的 ROS 节点。有关 ROS 启动文件以及如何使用它们的更多信息,请查看 ROS 文档。
下一步是定义所有数据块端口。我们可以通过在/Prius
主题上发布prius_msg/Control
类型的 ROS 消息来控制汽车。我们如何将它转换成 YonoArc 端口?
在高级信息→接口→输入端口下,我们定义一个输入端口,如下所示:
- 名字:控制→端口名:我们想怎么叫都行。
- 消息:prius_msgs/Control → ROS 消息类型
- ROS 名称:/Prius → ROS 主题名称
- Key: control →在这个块中没有使用,但是我们将在后面解释它。
输出端口的步骤相同。
Gazebo Block Inputs and Outputs
现在,凉亭块已准备好被保存和释放。在“项目”选项卡中,我们单击项目的“更多选项”图标,然后单击“发布”。
最终目标是让汽车自动驾驶,但为了收集训练数据,让我们从手动控制块开始。通过使用 YonoArc Python API ,我开发了一个模块,根据用户点击的按钮向 Gazebo 模块发送控制消息。
YonoArc 的 API 是事件驱动的。一个块由实现一个或多个事件处理程序的单个类表示。请务必注意,每个端口或属性都有一个唯一的键,您可以在用户界面上创建块时选择该键。这是为了让块知道在哪个端口上接收特定消息以及不同属性的值。
Example Block Using YonoArc Python API
让我们启动 Jupyter 来实现我们的块。
- 点击 Yonohub 主视图上的 Jupyter 笔记本图标。
- 选择 YonoCommons CPU 环境,因为我们的环境不需要任何特殊需求。
- 选择 C1 资源模型,因为我们只需要 Jupyter Notebook 来实施该模块。
- 单击启动。等到 Jupyter 笔记本开始。
现在让我们为新块创建一个文件夹,并编写代码:
- 单击右上角的新建→文件夹。将创建一个名为“无标题文件夹”的文件夹。
- 通过选择文件夹并单击重命名,将文件夹重命名为 VehicleControlBlock。
- 通过单击文件夹名称导航到该文件夹。
- 单击新建→ Python 3,为 Python 3 代码创建一个新的 ipynb 文件。文件将在新的选项卡中打开。
- 通过单击顶部的文件名,将该文件从无标题重命名为 car_demo_control。
- 将下面的源代码粘贴到笔记本的第一个单元格中。
Vehicle Control Block Source Code
在上面的代码中,我们使用了来自 YonoArc API 的两个事件处理程序。
- 这里我们初始化我们的消息字段
on_button_clicked(self):
这里我们处理不同的按钮动作。
首先,我们从prius_msgs
包中导入Control
消息。如前所述,Gazebo 块的输入端口使用相同的消息类型。
在prius_msgs
ROS 包中可以找到Control
消息的定义。
Header header
float64 throttle # Range 0 to 1, 1 is max
float64 brake # Range 0 to 1, 1 is max brake
float64 steer # Range -1 to +1, +1 is maximum left turn
uint8 NO_COMMAND=0
uint8 NEUTRAL=1
uint8 FORWARD=2
uint8 REVERSE=3
uint8 shift_gears
构建输出消息后,我们可以使用self.publish(port_key, message).
发布它
不要担心所有这些键,我们将在创建时在我们的块中定义它们。
让我们创建我们的块,但这次是作为自定义块。
- 在 YonoArc 中,单击左上角的 + 按钮,并将自定义块从 Others 工具箱拖到画布上。
- 单击自定义块上的设置图标。按如下方式设置块的属性:
**名称:**汽车车辆控制
**描述:**此区块控制露台区块的普锐斯车。
块类型: YonoArc API 块
**文件夹路径:**点击浏览,然后选择 VehicleControlBlock 文件夹,点击打开。
**文件路径:**点击浏览,选择 vehicle control block/car _ demo _ control . ipynb 文件,点击打开。在执行之前,YonoArc 会自动将该文件转换为. py 文件。
类名: CarDemoControl。这是表示块的类的名称。
输出端口:
具有以下属性的单个端口:
- 端口名称:控制
- 端口密钥:cmsg。该键用于发布控制消息
self.publish('cmsg’, controlmsg)
- 端口消息:prius_msgs/Control。
属性:
添加具有以下属性的第一个属性:
- 类型:按钮
- 名称:转发
- 关键:前进。
单击创建属性。该按钮将被添加到块描述的下方。让我们也不要忘记创建其他按钮反向,转向,停止分别与关键反向,转向,停止。最后,我们需要为转向值和油门增加两个数字属性。
- 类型:数量
- 名称:转向角
- 钥匙:steerval
- 默认 : 0,最小值 : -1,最大值 : 1
Git 消息存储库:
这里,我们需要找到该块使用的所有消息。正常情况下,3 个默认回购包含所有常见信息。但是如果我们使用自定义的 ROS 消息,我们应该在这里添加消息 repo。
执行模式:异步
环境:yono commons——CPU。
资源模型 : C0.1 x 3。
现在所有的积木都准备好了,让我们把所有的东西连接起来。我还拖了一些其他块像 YOLO,RViz,和视频观众。
YonoArc Pipeline
正如你在上面的视频中看到的,正在运行的管道简单而强大。它介绍了 Yonohub 最大的特性之一,即连接不同的块,完全从它们不同的编程语言、环境或资源需求中抽象出来。你也可以在任何管道中重用这些模块,与你的团队分享,在 YonoStore 上出售。
我对 Yonohub 的总体体验非常愉快。我无法想象将像 YOLO 这样强大的深度学习算法与 ROS & Gazebo 模拟结合起来会这么容易。这让我相信,它很快就会成为每个从事自动驾驶汽车工作的人的必要平台。我很高兴目睹这一切。
正如你已经看到的,Yonohub 是一个快速原型化你的研究工作/模型的好地方。所以我想邀请你们所有人在你们的下一个自动驾驶汽车项目中尝试一下 Yohohub。
“你处理不了真相!”
迁移学习发现难忘的电影台词
在我看来,自然语言处理(NLP)是机器学习中最令人兴奋的分支之一。在过去的一年中,NLP 取得了重大突破,以前很难(甚至不可能)解决的问题现在可以更好、更容易地解决。自然语言处理中最大的突破之一是迁移学习的使用。如果你看过我之前的博文,你就会知道我是迁移学习的忠实粉丝。简而言之,迁移学习是训练一个模型做一件事(通常在 ImageNet 这样的大型数据集上),并使用该模型的权重来解决另一种类型的问题。例如,在我以前的博客文章中,我使用了一个在 ImageNet 上预先训练的模型,将一个蓝色少女和小丑鱼图像的小数据集分类到它们适当的鱼类种类中。迁移学习非常有用,因为它允许使用小数据集来解决复杂的问题。虽然这种方法在计算机视觉中非常流行,但在 NLP 社区中很少使用。最近,一篇论文论证了迁移学习可以用来解决 NLP 问题;作者将这种方法称为文本分类通用语言模型微调(ULMFiT) 。我相信迁移学习的使用将会彻底改变这个领域,而且在某些方面已经发生了。
在这里,我将通过使用 ULMFiT 方法来演示迁移学习在 NLP 中的效用。我的博士学位专注于记忆(特别是从计算认知神经科学的角度来看),所以很恰当地,我决定创建一个分类器,它可以检测一段电影台词是否值得记忆。这篇帖子对应的代码在我的 GitHub 上公开。
数据集
对于数据集,我使用了康奈尔电影引用语料库。该数据集由令人难忘的电影语录组成,摘自 IMDb 令人难忘的语录。这包括来自大约 1000 部电影的难忘的引用和匹配的不难忘的引用。匹配的非记忆性引语来自同一演讲者,长度相似,并且在脚本中尽可能接近相应的记忆性引语。例如,来自我最喜欢的电影之一《搏击俱乐部》:
难忘:“每晚我死去,每晚我重生。复活”
不值得纪念的:“我想…当人们认为你快死了的时候,他们真的会听,相反…”
在数据集中,有 2197 个匹配的记忆-非记忆引语。
建模方法:语言模型
如上所述,我使用的是迁移学习法。我使用的语言模型是在维基百科的子集上预先训练的。该模型的架构和预训练重量可在这里获得。该模型由三层 AWD-LSTM 组成,本质上是一个在各个点都有漏失的 LSTM。预训练模型是一个语言模型,这意味着它被训练来预测句子中的下一个单词。尽管我们已经有了一个预训练的语言模型,但这个模型是在维基百科上训练的,这可能不同于电影引用文本语料库。因此,首先,我对电影引用数据集上的预训练模型进行了微调。实际上,我发现这一步并没有帮助提高一个引语是否值得记忆的分类器的准确性。这可能是因为电影引用数据集的词汇量非常小(1545 个单词)。
只是一些关于模特训练的小注意事项。首先,正如 ULMFiT 论文中推荐的,我使用了倾斜三角形学习率。从下图可以看出,在模型训练期间,学习率快速增加,然后在训练的其余时间逐渐降低。
第二,我用了逐步解冻。开始训练的时候,我只是训练嵌入层,然后逐渐开始解冻/训练其他层。我还使用了判别微调,其中我对不同的层使用了不同的学习速率。有些层,比如输出层,可能比其他层需要更多的训练,所以我们应该对这些层使用不同的学习率。
我训练模型,直到我达到大约 43%的验证集准确率。
建模方法:分类器模型
既然我们已经对语言模型进行了微调,现在我们可以针对我们的实际任务对其进行进一步的微调,即预测电影引用是否值得记忆。这包括简单地去掉最后一层,用一个有两个输出(可记忆的,不可记忆的)的层来代替它。经过一段时间的训练后,我们达到了大约 70%的验证集准确率。考虑到数据集很小,还不算太坏!
为了进一步提高模型的准确性,我重新运行了所有的训练,但是文档是反过来的;也有公开可用的带有反向语言模型的预训练权重。这最终没有帮助,但值得在您自己的数据集中检查。
结论
在这里,这种分析表明,控制报价的长度和时间介绍,有一些关于某些报价的内容,使他们难忘。下一步可能是试图理解为什么有些引语是值得记忆的,而有些却不是(即模型解释);实际上,这是这个数据集创建者的最初目标。也许这个分类器可以被作家和记者用来检查一个引语是否值得记忆。
用这么小的数据集,我们可以达到合理的准确度,这真的很令人惊讶。如果我们没有使用迁移学习,那么在如此小的数据集上很难达到这种精确度。看到迁移学习在 NLP 中的进一步应用,我真的很兴奋。训练这个模型还有很多其他的小细节。检查我的 GitHub 以查看实际代码,如果您有任何问题,请不要犹豫!
你不能谷歌所有的东西
以及其他我希望在开始我最新的数据科学项目之前就知道的事情
Photo by Chris Ried on Unsplash
几周前,我开始了一个新的数据科学项目,不出所料,h̶o̶r̶r̶i̶f̶i̶c̶绝对给了我启发。我之前对数据科学和机器学习项目做过一些尝试性的探索。但是我认为是时候做一些更大的事情了。但是我该从哪里开始呢?
你不能谷歌所有的东西
公平地说,我犯了一个错误,在大多数人会去的地方寻找灵感——谷歌的首页。事实证明,有太多的资源会让你迷失其中。有些提示有点乏味。这是我在 Quora 上找到的一个帖子:
I fell asleep when I saw “cricket”
听起来不太对劲。为什么我要查看仅仅“模仿”数据科学真实应用的数据?我想建立一个真正的投资组合,解决真正的问题,给企业和人们带来真正的改变。我想分析一些我感兴趣的东西。毫无疑问,这些建议的数据集非常棒。它们可能是对你的数据探索、机器学习或可视化技能的巨大考验。但最终这一切又有什么意义呢?
我想建立一个真正的投资组合,解决真正的问题,给企业和人们带来真正的改变。
相反,我求助的最有用的资源之一是上关于数据科学的作者。Michael Galarnyk 写了一篇关于建立数据科学投资组合的伟大文章,Jeremie Harris 为有抱负的数据科学家写了一份伟大的“不要做”清单。这部分对我来说是最好的:
当你有疑问时,这里有一些对你伤害大于帮助的项目:
*在泰坦尼克号数据集上的生存分类。
*在 MNIST 数据集上的手写数字分类。
*使用 iris 数据集进行花卉种类分类。
我对 Kaggle 和他们的比赛百感交集。我认为数据科学家应该拥有从各种难以想象的地方获取数据的能力。我真的不喜欢被“填鸭式”灌输数据的想法。也就是说…
收集自己的数据是痛苦的。真的。
所以我最终决定自己收集数据。该项目将是关于预测一部电影的 iTunes 价目表价格从其特点,如票房表现,评论家评级,演员阵容,情节等。预测电影成功的模型并不新鲜。但是有些问题没有被问及,也没有被回答。
- 一部电影上映后,在视频点播(VOD)平台上一部电影能标价多少钱?
- 我可以提前预测这个价格吗,这样我就可以决定我是否要支付它?
- 或者其他视频点播提供商会利用这些信息与 iTunes 进行价格竞争吗?
- 像网飞这样的视频点播提供商能利用这些信息来优化他们的定价策略吗?
比看板球数据好多了。
但是很少有数据集提供了电影和它们在 iTunes 或其他视频点播平台上的标价之间的联系。
最终,我转向开源电影数据库,如电影数据库和开放电影数据库,我将它们与 iTunes 数据结合起来分析数据。然而,这并非没有挑战。您可以在 Github 上查看我的脚本和探索性分析,但是请继续关注关于我的整个数据收集过程的博客帖子。
每个拥有有价值数据的人都使用 API
我不是互联网协议、服务器脚本或数据库架构和工程方面的专家。但是我不认为我说的有多离谱。
在我的数据收集过程中,我很大程度上依赖于使用 API,但是我也使用 web 抓取技术来收集数据。我发现自己使用 API 对网站/服务器进行的查询要少得多,这为我提供了一种进行结构化查询以获得我需要的所有数据的方法。没有多余的或吵闹的。
对于组织来说,理解为什么 API 层对他们有好处是很重要的:
- 您可以保护托管信息的服务器。
- 您将保护推动您业务发展的数据。
- 它帮助您的合作伙伴和协作者轻松、安全地获得他们需要的数据和信息。
- 您可以通过调整速率限制来管理您的服务器资源。
- 您可以最终控制数据进出服务器的方式。
将 API 比作酒保特别有用。与其开放你的数据“自助餐”式,人们会倾向于采取先抢后问的心态,不如让一个人来控制食物的消耗量。相当不错的东西。
感谢你阅读我的第一篇博文。随着项目的进展和想法浮出水面,我会发布更多的更新。
你不能编造这些东西…或者,你能吗?
[本文从多线程交叉发布,与 Joerg Fritz 合著]
2016 年 11 月 7 日,我们见证了篮球史上最伟大的时刻之一。金州勇士队的斯蒂芬·库里打破了一场比赛最多三分球的记录。但是,他做的不止这些。这是一种回归——库里一直在努力,就在一场比赛前,他和他的勇士队输给了湖人队。地位低下的湖人队——前一年在西部联盟中排名最后的球队。库里本人的三分球命中率为 10 投 0 中,以一个三分球结束了他连续 157 场比赛的 NBA 纪录。猜测随之而来。一些人开始质疑库里是否已经失去了他的风格。其他人认为,随着凯文·杜兰特(KD)的加入,球队的化学反应已经被打乱了。还有一些人认为这是防御;对手已经想出了如何防守库里曾经致命的一击。
但是在那个星期二的晚上,每个谣言都会被证明是假的。库里把他们一个个关了。每一发子弹都像雨点般落下,全世界都在敬畏地注视着。就好像每一个都是一个熟练的辩护律师的结案陈词。他精湛的投篮——有些从 26 英尺外——驳斥了任何“失球”的说法。他和 KD 流畅地编排他们的动作,让库里投篮得分。化学!有时库里有两个甚至三个防守者在他身上——这似乎让他变得更好,驳斥了他们已经找到如何防守他的理论。库里需要证明一些东西,他带来了一把大锤。当他投进当晚最后一个三分球时——这是一个打破记录的三分球——库里后退了几步,胜利地摇了摇头,然后指着人群,好像要结束他的案子。他回来了,比以前更好了。人群深信不疑,开始高呼“M-V-P,M-V-P”。这是一件美妙的事情——一连串的事件和情况汇集在一起,创造了体育史上最史诗般的时刻之一。你不能编造这种东西…
或者,可以吗?
对于我们所目睹的,有没有可能有另一种解释——一种远没有那么耸人听闻的解释?如果那天晚上我们真正看到的与复出或反驳批评者无关,相反,只不过是一个预期的,尽管很少的事件序列,会怎么样?如果那个戏剧性的故事完全是捏造的呢?在你嘘嘘哭泣黛比·唐纳之前,让我们看看数据能告诉我们什么。
如果我们看看我们可能预期会发生什么——不一定是在这个特定的夜晚,而是应该在“某个”夜晚发生什么——那么我们看到的就不那么令人惊讶了。库里本场比赛当时的历史 3 分命中率为 p =44.4%。这意味着连续 17 次的n= 13 次或更多次三分球命中 k =13 次的概率是:
这是一个小概率。但是,如果有足够的试验,我们应该期待它会发生。到那时为止,库里在职业生涯中已经尝试了 3661 次三分球。在这么多的试验中,我们预计他有 7 个序列是一样好或更好的,这仅仅是随机的(他有 6 个,其他序列只是跨越 2 或 3 场比赛)。像“证明怀疑者是错的”或“挨拳头”这样的叙述对于解释这些事件是不必要的。
库里在之前的比赛中 10 投 0 中的糟糕表现又是怎么回事呢?这难道不是衰退的证据,并促使他决心“东山再起”吗?不太可能。如果是 11 分之一,我们会讲一个不同的故事吗?让我们假设我们会接受任何一串低于他正常命中率的 17 次投篮,就像接下来的 17 次异常投篮一样。他 17 投 3 中(或更差)紧接着 17 投 13 中(或更好)的可能性有多大?事实证明,在他职业生涯的那个时候,这种结果有几乎 35%的可能性发生。
如果我们用图形来看数据,我们会看到一些看起来更像随机过程的东西。下面我们绘制了自 2014/15 赛季开始以来,库里在所有常规赛中的 3 分命中率,尝试和制造。这个图表使得构建一个清晰的解释叙述变得更加困难。你会发现这两个“异常”的游戏吗?它们是 x 轴上的游戏 514 和 515。他们不会突然出现在你面前,成为“体育史上的史诗时刻”。
库里的表演无疑是一个奇观。说这是“预料之中的事情”,只是因为他有着非凡的 3 分命中率,以及他多次尝试的事实。但是轰动效应——对复出的叙述、对谣言的驳斥等等——是为了配合数据而创造的。这不是因果关系。库里打破记录并不是因为谣言和猜测——那是我们对那晚所见的解读。我们认为这不在正常的统计变化范围内。我们不能接受。相反,我们无意识地编造了一个故事,赋予事件以意义。
这种捏造的倾向不仅限于体育娱乐。我们在经营业务的过程中也深受其害。这种情况经常发生——即使是在最注重经验的公司里。当指标与历史趋势不同时,人们会迅速给出解释,尽管完全没有任何数据来支持他们的说法。“这是天气”,总有人会在回应业务量的意外增长时这样建议。也许,“这是新的广告活动;挺引人注目的”。甚至,“这是宏观经济;由于刚刚发布的就业报告,人们感到乐观。这些都是看似合理的解释,但没有数据支持。事实上,我们经常被启发去创造这样的故事,正是因为我们缺乏任何其他东西来解释这种变化。我们似乎不能接受无法解释的事情,所以我们说服自己在数据中看到不存在的模式。
这种从事件——甚至是随机事件——中创造意义的倾向是与生俱来的。科学作家迈克尔·舍默称之为模式化。这是数百万年来选择压力的结果,因为我们的祖先进化出了我们今天的大脑。模式化是我们古代狩猎采集祖先的一个偏好特征。谢默解释说,那些对草丛中的沙沙声做出反应就好像它是一个危险的捕食者的人比那些更漫不经心的同伴更有可能存活下来——即使沙沙声只是风。这是因为错误判断捕食者的代价(即这只是风)并不多。然而,不回应的代价是毁灭性的——当它真的是掠食者时,却相信它是风。是生命的代价,是传递自己基因的能力!因此,当犯第一类错误的成本低于犯第二类错误的成本时,模式化特征将在人群中变得普遍[1]。在我们狩猎采集的时代,这肯定是为了生存,因此我们天生倾向于赋予事件意义。
这就是为什么当我们目睹的事件得不到解释时,我们会如此不安。这与纳西姆·尼古拉斯·塔勒布在他的书《黑天鹅》中描述的现象相同。塔勒布创造了“叙事谬误”这个术语,指的是我们在没有解释的情况下观察一系列事实的有限能力。“我们寻求解释,甚至到了我们会制造它们的地步”,他写道。无论是商业指标的突然上升,还是某人 17 个三分球中的 13 个,我们都要求一个解释!我们不能忍受让它无法解释或将其归因于随机变化。即使是已知的随机过程——比如扔硬币——我们也会编造故事来解释结果(例如,“连续三次都是正面朝上”)。见《赌徒的谬误》)。
模式化是我们与生俱来的,因为在我们狩猎采集的时代,它很好地服务了我们。然而,今天,它可能是完全危险的。虽然编造一个故事来解释我们的体育娱乐可能是无害的(除了充满激情的赌徒),但它在商业决策中可能是极其重要的。它会导致非理性、糟糕的决策和偏见。更糟糕的是,这给了我们理解的错觉。而且,故事是会传染的——它们在整个组织中传播得非常快,增加了基于错误信念做出决策的危险。我们甚至可以满怀信心地做到这一点,并与我们的同行保持一致。
我们必须保护自己。模式化是我们的大脑不知道什么对我们有益的众多特征之一。我们对暴食、贪婪、欲望等有着相似的偏好——每一个都是曾经让我们受益的遗迹,但现在我们必须发展策略来减轻它们。幸运的是,我们可以做一些事情来抵御自己编造潜在虚假故事的本能冲动。
- 首先,只要有可能,尽可能多地依靠设计良好的随机对照试验(RCT,又名 A|B 检验)进行测量、因果关系推断和决策。RCT 通过强制对抽样方差的有效估计进行数据评估,而不是通过我们有偏见的直觉,使我们免受犯第一类错误(当某事真的是假时,相信它是真的)的内在诱惑
- 接下来,花时间建模并了解你的业务。影响你业务的因素会随着时间的推移而变化。客户和库存的构成可能会变化,营销活动的有无可能会改变,甚至运营约束也可能会改变并影响您的业务指标。开发模型来捕捉每个因素引起的变化是一个很好的实践(我们以前写过这个)。见此处。虽然一个模型不会总是给你一个真实的因果关系,但它远比单独使用我们的直觉更严格。此外,它为分析变化提供了一个原则性的框架,这在许多方面都是有帮助的:它可以提供对对立因素的可见性,这些因素可能相互抵消,从而给出稳定的表象。它还可以提供关于自然变化程度的见解。当一些无法解释的现象发生时,它可以提供一个上限,说明有多少变化是由它引起的。
- 最后,当我们的直觉驱使我们看到不存在的模式时,我们必须发展一种纪律。如果我们发现自己在没有任何证据支持的情况下创造故事,特别是当我们因为没有数据支持而创造故事时,那么我们必须非常怀疑自己的动机。知道自己什么时候最容易受到这种伤害。越是不确定,越是绝望,我们就越有可能抓住似是而非的故事不放。
回到体育。11 月 7 日,除了斯蒂芬·库里进行随机变异的例行演示之外,还有什么别的吗?不太可能。库里本人在接受采访时,没有提到复出或需要证明什么。他只是说他“需要继续拍摄”。尽管如此,我们还是更喜欢故事。它提升了体验。这和我们去拉斯维加斯,吃不健康的快餐,玩显灵板,听从幸运饼干的建议,亲吻巧言石,偶尔纵情饮酒是一个道理。它们是满足原始欲望的愉快经历(至少在当下)。我们知道这对我们不好。但是,我们有权偶尔沉溺于自己的恶习。它让生活变得更加愉快。当然,在商业环境中,我们需要抑制自己的欲望。
附言
这篇博文有一个递归的特性,模式被引用来解释为什么我们有解释我们经历的事件的本能冲动。我们完全有可能不由自主地被模式化提供的解释所驱使。唉,我们不知道该相信谁了——当然不是我们自己!
参考资料和进一步阅读
- 舍莫,迈克尔。模式性:在无意义的噪音中寻找有意义的模式。《科学美国人》。新名词,2008 年 12 月 1 日。
- Tversky,a .和 Kahneman,d .对大数定律的信念。心理学通报,1971 年,第 76 卷,第 2 期。105–110.
- 维基百科上的赌徒谬误
- 维基百科上的热手谬论
- 《篮球中的辣手:关于随机序列的错误认知》,《认知心理学》17,295–314(1985)。
- 塔勒布纳西姆。极不可能事件的影响。伦敦:艾伦巷,2011 年。打印。
- 刘易斯,迈克尔。改变我们想法的友谊。纽约:诺顿出版社,2017 年。打印。
- 卡尼曼博士(2015 年)。思考,忽快忽慢。纽约:法勒,斯特劳斯和吉鲁。
- 纽约州哈拉里(2016 年)。智人:人类简史。安大略省多伦多市:信号,麦克莱兰和斯图尔特。
- 米勒、约书亚·本雅明和桑尤尔乔、亚当,惊讶于赌徒和热手的谬论?大数定律的一个真理(2016 . 11 . 15)。IGIER 工作文件№552。可在 SSRN 或土井买到
你不需要成为数学大师就可以开始机器学习
嗨,伙计们,机器学习领域的一个常见误解是,为了学习数据科学和机器学习,你必须成为数学大师,但数学是学习机器学习的先决条件吗?简单的回答是不!在这里,我会向你解释为什么
数学不是机器学习的首要前提
一个最被误导的想法是,你必须精通数学,知道线性代数,微积分,微分方程,数理统计,最优化,算法分析…,请不要以此为借口不学习机器学习。
这种想法通常来自学术界,因为他们是从零开始编写算法的人,他们肯定要经历数学,他们必须知道如何计算导数并从零开始编写梯度下降算法,但我想告诉你的是,即使你对数学不是很熟悉,你仍然可以在这个领域非常成功。
工具会帮你计算
有许多库使得应用机器学习算法来解决任务变得非常容易,以广泛使用的 Python 的 scikit-learn 库为例,只需一行代码,您就可以获得最常用的算法,随时可以使用。如果你刚刚开始机器学习,并且你真的想亲自动手,抽象算法实现的细节会非常有帮助,我的意思是,我们很多人大多数时候都是通过摆弄代码来学习更多的东西,然后让它工作。
首先把事情做完,然后问你是怎么做到的。
对于许多人来说,这听起来可能是一个愚蠢的想法,但我可以向你保证,这非常有效,你可以自己尝试一下,找到你感兴趣的问题,选择一种算法并使用你可以使用的工具来解决问题,看看你会得到什么结果。他们会问幕后发生了什么,算法到底在做什么?它是如何学习的?你会惊讶于你将学到的东西。
数学仍然扮演着重要的角色
不要误解我的意思,你可以在不了解数学的情况下学到很多东西,做一些令人惊讶的事情,但是如果你的目的是参与、跟随或者仅仅是跟上研究性学习,那么数学可能会帮助你理解算法、公式、学习是如何完成的以及做许多事情。
学习机器学习不需要数学,但它可以帮助你理解许多算法的概念和实现。
最后一件事!
如果你喜欢这些作品,请留下你的掌声👏推荐这篇文章,让其他人也能看到。
你的应用分析太乐观了
最新的应用程序更新显示参与度增加?那是错误的。
你为过去一个月完全接受的新功能感到自豪,并等待苹果批准更新,这样你就可以深入分析并为下一次迭代做准备。应用程序获得批准,许多用户下载了它,指标开始进来。40%的用户尝试了你的新功能,完成率达到了惊人的 80%。一个月后,只有 20%的用户尝试了该功能,完成率下降到 40%。你责怪那些尝试过该功能但没有再次使用的用户,所以你重新分析了整个月,以考虑早期用户。指针不动了。发生了什么事?
这是我在为 Anghami 发布的每个功能更新中都遇到的问题,Anghami 是中东领先的音乐流媒体服务,目前拥有超过 6000 万用户。对于每次更新,我们都确保设置了适当的分析事件。一旦发布,我会在 Amplitude 上对用户行为进行深入分析,这是一个很好的应用分析平台,可以很容易地快速获得可行的答案。在解决功能更新难题之前,正确设置分析事件非常重要。
设计适当的分析事件
一个新的特性通常有一定的事件流,在某些情况下可能会导致不同的事件流。为每一步发送一个事件是至关重要的,这样您就可以在以后使用漏斗或路径查找工具进行分析时识别出问题所在。
不要忘记发送一个额外的事件来表明该特性已经打开,这样漏斗就可以提供有用的信息。了解用户如何达到这个功能也很有帮助。用户通常有多种方式来访问您的功能,并且通常会测试多个文本副本,因此了解哪个来源最有效非常重要。
我们最近将跟踪范围扩大到了外部来源,如广告、社交媒体、电子邮件和推送通知。这样我们可以从一个地方分析整个生命周期。
事件通常与屏幕视图相关联,但是用户经常在不切换视图的情况下执行关键行为。例如,点击一个按钮进行应用内购买,会显示第三方警告,而不会切换视图。用户可以在这里取消支付,并保持在同一视图中。但是比较有多少用户选择购买和有多少用户实际购买是很重要的(当然,这应该是另一个事件)。这就是为什么在这里点击购买按钮本身应该是一个事件,即使用户最终没有购买。。
用户群之间的不公平比较
找出一个增强是好是坏包括比较段。在我的分析经验中,细分市场之间的不公平比较就像房间里穿着隐身衣的大象——很难意识到两个细分市场之间的比较是否公平。
回到本文最初的问题:为什么用户对新特性的参与在第一天和第一个月之间表现出非常不一致的结果?问题是,在新功能发布当天尝试新功能的用户会立即更新应用程序,这些用户不是你的典型用户。他们是高度参与的用户,每天打开你的应用程序,并有足够的好奇心来浏览应用程序。本质上,查看一天的范围会使你的结果偏向最活跃的用户。然而,在一个月的时间里,有许多新的或一次性的应用程序用户,因此与日常用户相比,高度参与的用户在每月用户中所占的比例要小得多。这就是为什么与一整月相比,在功能发布后的第一天,参与度指标会有很大变化。
绿线是以前的版本,蓝线是新版本,可以更容易地将歌曲添加到播放列表中。请注意绿线是如何减少的,因为它代表参与度较低的用户。时间会证明蓝线是否能够维持下去。
那意味着你需要等一个月吗?为了得到最准确的结果,是的。但是实际上你不会等一个月才开始下一个迭代,所以你需要找到一个同样投入的观众来比较。可能是一群用户在同一天更新了以前的版本,或者在我们的例子中,用户播放了同样多的歌曲。这样,更新版本的用户与之前版本的用户之间的比较将是公平的,因为你不会偏向更活跃的用户。
不公平的比较不仅仅发生在应用更新上。另一个例子是我们做的一个测试,当用户看到订阅屏幕 5 次后,我们发送一条短信要求他们订阅。为了分析发送短信的影响,我们必须与另一个没有接收到任何信息的部分进行比较,即控制部分。如果控制段是随机的,那么文本消息段当然会有更高的转化率,因为它专注于已经看过订阅屏幕 5 次的高度参与的用户。这是一个不公平的比较,可以通过与也看过订阅屏幕 5 次,但没有收到任何消息的用户进行比较来解决。
分析时不要只关注转化率。还有其他维度需要考虑,比如转换时间。此外,确保将漏斗设置为较短的持续时间,以便事件序列不会分散到几天内。也就是说,有时候你想把事件分散开来,看看某个限制是否影响了用户以后的购买决定。
我看到的结果有多有效?
一旦结果出现,一旦获胜部分显而易见,人们就会兴奋起来。但有一个小小的担心,来自应用程序的事件数据并不完全正确,或者你创建的复杂图表在某些地方是错误的。
有一个非常快速的方法来验证事件数据:将您正在验证的独特事件按平台进行细分,并检查这些数字是否与您的用户的平台分布成比例。切换到“活跃%”,这样振幅会自动计算平台的百分比——您应该在这里得到类似的百分比。然后比较用户发送事件的平均次数,确保两个平台不会相差太远。这些步骤至少足以指出某个地方是否存在数据收集问题。
iOS is doing something wrong here. But we fixed it and it’s converging again.
很难验证您的图形设置是否正确,但以下技巧应该可以做到:
**平台分布:**你比较的细分市场是在同一个平台分布吗?如果一个细分市场主要包括 iOS,而另一个主要包括 Android 和 Web,结果将会产生误导。甚至版本也很重要,所以一个只包含最新 iOS 版本的细分市场不能与另一个包含所有 iOS 用户的细分市场相比较。
**新用户与现有用户:**不要将新用户与现有用户进行比较,除非你真的在比较新用户与现有用户的行为。
**参与度更高的用户或技术用户:**确保一个细分市场不会偏向参与度更高的用户。对发烧友用户的细分(比如说,他们改变了均衡器设置)不能与普通观众相比。
**每个细分市场的规模:**确保每个细分市场的用户数量是合理的——一个拥有 5 万用户的细分市场与 200 个用户相比是不可行的。
**巨大进步:**您的细分市场对比是否显示出巨大进步?有可疑之处。你做的一个小的改变有 50%的改进是一个错误的信号。
**每周 vs 每日:**每周的窗口可以修正轻微的变化,但过多的每日波动不是一件好事,尤其是如果它是一个大的用户池。设置一个每日窗口,并验证所有日期的趋势是否相同。一致的趋势令人放心,但如果每天都有大量波动,那就有理由担心了。
数据看起来很奇怪
所以你验证了数据并意识到有猫腻。这些解决方案适用于大多数情况:
**外部因素:**营销团队是否发起了你不知道的活动?运营商是否向您的某个市场发送了群发短信?这些可能是图中出现无法解释的峰值的原因。这里一个很好的起点是按国家细分,因为大多数外部因素一次只影响一个国家。然后你可以问团队类似“1 月 11 日埃及发生了什么?”
The surge in liking songs on a particular day was due to a huge hit song being released
**数字仍然很低:**发布已经有几天了,数字太低,还不能下结论,但是你还是需要做点什么。切换到日视图,看看趋势是否一致。
**稍有错误的数据:**有一些小错误可以在事件发送后被纠正。如果一个应用程序发送了错误的事件名称,或者事件属性在平台之间不一致,那么振幅自定义事件可以通过重命名事件来轻松纠正这些问题。因此,即使没有应用程序更新,您仍然可以整体分析。
**真正错误的数据:**结果中有一些非常奇怪的东西,你甚至不能确定来源。此时,您可以让后端团队参与进来。他们通常有需要分析的数据,您可以直接从数据库中查询这些数据进行验证。但是,为了与您创建的图形进行正确的比较,backend 可以将这些事件转发给 Amplitude。一旦完成,找到罪魁祸首就变得容易多了。
长期思考
在像昂哈密这样快速发展的创业公司,我们不能等待很长时间才采取行动。好的一面是,我们不需要这么做,而且我们已经通过使用上面的技巧发布新功能时的分析,受益于大量可操作的见解。也就是说,两个月后再来检查并验证事情是否仍在正轨上是非常重要的。
当 2 个月过去了,仅仅看用户进入和完成特性漏斗的百分比是不够的。漏斗转换和流失有什么关系?也许这个新特性提供了很好的指标,但是引起了不必要的变动。客户流失既可能与产品特性有关,也可能与产品的传播方式有关。
Stickiness of a feature: users coming back the next day and using that feature again, measured over a month
试过这个功能的用户回来了吗?最初的漏斗可以显示非常好的指标,但大多数功能只有在引起粘性时才是成功的(多次使用该功能)。
A feature that’s dying off
撇开入职不谈,两个月后再来检查的一个最重要的原因是新鲜感的消退。引入一个功能,甚至改变一个组件,都会在那一刻增加用户的参与度,只是因为它对用户来说是新的。一项功能或变化只有在用户持续参与两个月后才是可持续的。但不要因此而放慢脚步,因为我提到的所有方法都可以帮助你,从设计分析事件到在发布时验证数据。
你那糟糕的机器学习算法没有按预期工作?
机器学习以及数据科学和大数据是一个热门词汇,任何与技术相关的人都在工作、大学或至少在互联网上读到过。不仅如此,机器学习在日常生活中如此普遍,以至于许多人在没有意识到的情况下使用它:电子邮件服务中的自动垃圾邮件分类、语音到文本转换、信用卡交易中的欺诈检测、基于偏好和以往购买行为的电子商务推荐。
在过去的几十年里,许多性感的算法,如人工神经网络,随机森林和支持向量机,已经被提出来承担像线性回归这样更无聊的技术留下的任务。任何机器学习领域之外的人,如果见过深度神经网络在图像识别方面的能力,可能会错误地认为它可以轻松解决简单得多的任务。甚至相当多的人可能已经实现了这些复杂算法中的一个,但结果令人失望。这是因为在统计学中没有免费的午餐:没有一种方法在所有可能的数据集上支配所有其他方法。为了理解为什么一个算法没有像预期的那样工作,我们必须考虑一些因素,这些因素将在监督学习的回归设置中讨论。
首先,任何机器学习问题都是从观察 p 个不同的特征 X 和一个定量的反应 y 开始的,期望它们之间有某种关系。这种关系可以写成非常一般的形式 y=f(X)+e,其中函数 f(X)指定系统信息,量 e 包含也与 y 相关的未考虑的特征或不可测量的变化。也就是说,f(X)是特征的某个固定但未知的函数,E 是独立于所述特征的随机误差项,期望值 E[e]=0。在这种情况下,人们必须求助于一组基于 n 次观测来估计 f(X)的方法。现在,由于误差项平均为零,因此可以使用 y*=f*(X)来预测 y,其中 f*(X)表示 f(X)的估计值。
通常,均方误差 MSE=E[(y-y*) ]用于评估算法在给定数据集上的适当性。一般而言,如果预测值为 y 提供了准确的预测,则 MSE 将会很小,如果其中一些预测与 y 有显著差异,则 MSE 将会很大。由于大多数算法专门估计参数以最小化训练集 MSE,因此将此测量报告为模型对未知数据的预期性能并不是一个好主意。这就是为什么需要测试集的原因,测试集通常是通过分离一些观察直接获得的,或者是通过实现交叉验证等技术间接获得的。
可以证明,检验 MSE 总是可以分解为 f*(X)的方差、f*(X)的偏差平方和误差项 E 的方差之和,用数学术语来说,MSE = E[(y-y *)]= Var[f(X)]+Bias[f(X)-f *(X)]+Var[E]。在接下来的章节中,我们将从两个角度来深入了解这一重要指标的分解。
可约与不可约误差
y作为 y 的预测值的准确性取决于两个分量:由 Var[f(X)]+Bias[f(X)-f(X)]给出的可约误差和由 Var[e]表示的不可约误差。出现可减少的误差是因为 y的精度可以通过实施更好的算法来估计 f(X)而提高。另一方面,即使有可能得到 f(X)的完美估计,y仍然是一个近似值,因为 y 也是 e 的函数,根据定义,它不能用 X 来建模。
偏差-方差权衡
学习算法通常可以基于它们的灵活性进行比较,即它们产生不同形状来估计 f(X)的能力。这种灵活性在某种程度上直接受模型中参数数量的影响,或者更正式地说,受其自由度的影响。结果表明,随着模型灵活性的增加,训练 MSE 单调下降。相比之下,当允许更大的灵活性时,测试 MSE 最初下降,但在某一点上稳定下来,然后开始增加,显示出典型的 U 形。因此,如果模型比需要的更灵活,预测可能会产生较小的训练 MSE,但会产生较大的测试 MSE,从而为称为过度拟合的现象提供了空间。
这个 U 形是任何算法的两个竞争性属性的结果,称为偏差和方差。当 f*(X)的形状实质上不同于 f(X)的形状时,偏差被引入到预测中,并且因此受到学习算法的选择的影响。同时,当训练观测值的数量与参数的数量相比较低时,会导致方差,使得对这些参数的估计会在来自相同生成过程的训练数据集之间显著变化。一般来说,不灵活的模型往往具有高偏差和低方差,反之亦然,从而导致所谓的偏差-方差权衡。
最终,永远记住:*垃圾进来,垃圾出去。*重要的是要熟悉手头问题的背景,包括相关特征,通过尝试假设不同形状的不同算法来选择最合适的技术(例如线性与非线性),并获得足够的观察数据来训练它们。
参考文献:
James,g .,Witten D .,Hastie T .和 Tibshirani,R. (2013 年)。统计学习入门。纽约:斯普林格。
“您的数据隐私已更新”——感谢您再次忽略它!
Photo by Joe Green on Unsplash
下雨了 GDPR 的电子邮件,为什么一个盲目的’我同意’是不行的
垃圾邮件发送者在过去的一周有一些严重的竞争。几乎每一个网站和任何实体,哪怕只有一点网上存在的影子,都在忙着向网络发送那种*“隐私更新”电子邮件。虽然我们的本能反应是点击屏幕上的任何地方来摆脱这个的麻烦*,但这可能不是现在最好的做法。
这篇文章不是关于 GDPR 的入门,有来自 NYT 和其他几个人的好文章。除了我们作为用户现在可以做的一些实际事情之外,这是对作为数据科学从业者的数据的深远影响的反映。
无条件适用
我们已经习惯了*【条款&条件*以至于在注册任何新服务时,我们几乎连眼皮都不眨一下。以至于,如果一个应用程序强迫我们在勾选“我同意”之前向下滚动,它在我们的感知用户体验中就会下降一个档次。我们想知道 Chrome 是否也能自动完成这项工作。
然而,当我们在几天内突然收到一系列关于同一主题的电子邮件时,这激起了一些好奇心。这变得很奇怪,当我们听到来自我们从来不知道存在的公司的消息时,尤其是当他们的电子邮件谈到他们将如何开始与我们成为朋友并开始友好地对待我们的数据时。
数据隐私不仅仅属于法律论坛的范畴。作为了解数据力量的数据科学从业者,作为为互联网的发展做出贡献的消费者,这种变化至少需要我们的一点点关注。
不信任和谨慎是安全之母。—本杰明·富兰克林
为什么在数据政策上如此大惊小怪?
实质上,GDPR 法规要求公司在收集数据时必须征得用户同意,并且只分享那些使其服务正常运行所必需的数据。这是一项简单的措施,旨在通过尊重网民访问、更新或删除其数据的请求,将权力还给他们。
看起来令人惊讶的是,这样一个明显简单的变化(以及一些经济处罚)引发了所有这些行动。可以理解的是,公司可能需要更新他们的一些条款以符合法律规定,即使他们可能会负责任地处理数据。我收到了一封比其他邮件得分高的邮件,其中宣称政策没有改变。
然而,如果仅仅因为这项规定,公司就不得不彻底改变他们的工作方式,向用户披露新的东西,那就有些不对劲了。不难猜测,这些公司可能一直出于可疑的原因践踏我们的个人数据。
例如, Twitter 现在向你显示与你分享数据的广告商名单。我找到了一份大约 200 个(不是随机的)广告商的名单,Twitter 已经与他们分享了我的数据,我可能还会出现在 1200 多个定制的受众名单中。这一切都是在的新设置中默认‘开启’,在上周出现在 Twitter 上的显然无害的*‘我同意’*按钮下。
关于其他许多大网站也有类似的记述。这正是为什么这需要一些关注。
如果你不付钱,你就是被卖的产品。安德鲁·刘易斯
数据科学和隐私——一颗滴答作响的定时炸弹
鉴于当今数据分析的巨大力量,消费者数据是一个完美的切入点——a)一天中的海量流数据,汇集了各种用户兴趣和 b)先进的算法,可以解开甚至用户都没有意识到的偏好。
正是这种金矿的发现,让许多公司竭尽全力追逐它们。还有那些黑暗势力已经开始开采这些金矿,并向出价最高的人出售见解。这种缺乏公司内部道德规范以及缺乏明确的数据法规的情况导致了严重的隐私泄露。
作为数据科学领域的从业者,我完全支持充分利用数据来简化生活,让机器为我们工作。但是,在控制松懈的情况下,涉及消费者数据的数据隐私是一个定时炸弹,只是等待爆炸。
剑桥分析这样的漏洞只是冰山一角。数据的力量远不止这些。考虑到如此巨大的风险,在这种情况下,以下三点可能会有所帮助:
- 公司负责任地使用数据展示高道德标准和自我控制
- 严格的法规和惩罚性的措施,至少在可能的范围内控制着黑暗势力
- 意识增强的用户要求正确的数据实践并质疑任何可疑的标准
在这些事情落实到位之前,我们所能做的就是希望不会发生重大违规事件,这可能会让用户深深陷入对数据和技术整体的不信任。
那么,我们能清除数据痕迹吗?
万一你想清理你的网页历史,抱歉,这真的没关系。这里有一个精彩的结尾片段,摘自雷·库兹韦尔的书《T2:奇点临近》(T3),书中有一段虚构的对话,对话的主角是生活在 2004 年的人类莫莉和来自 2048 年的未来机器人乔治。
意识到即将到来的奇点,人类试图在准备中完成一些奇怪的任务,同时也试图“修复”一些不方便的数字记忆。看看机器有趣的反应。
**乔治大约 2048(机器人)😗*哦,我可以帮你处理。
莫莉 2004: 那真的没有必要。我完全有能力自己做这件事。我可能还想删除一些文档——你知道,我对我认识的几台机器有点冒犯。
乔治 2048(机器人):哦,机器无论如何都会找到它们的——但是别担心,我们非常理解。
任何已经在互联网上的数据都被可疑地永远铭刻在以太中。试图抹去我们在网络上的数据痕迹的膝跳反应是徒劳的。此外,技术的好处大于它的风险,所以在这个节骨眼上变成一个不相信数字的人不是一个好主意。
但是,我们现在能做的是利用这些法规和一系列电子邮件来发现谁拥有我们的数据。通过利用现在已经开放的渠道,很容易删除所有未知或未使用的帐户。花几分钟在所使用的服务上,将数据共享限制在那些您可以从共享的社区见解中受益的渠道也是有意义的。
对数据科学充满热情?随时加我在LinkedIn或者Twitter。
在其他网站上包含此 LinkedIn 个人资料
www.linkedin.com](https://www.linkedin.com/in/ganes-kesari/)
你的医疗数据构成了数十亿美元的生意
Photo by National Cancer Institute on Unsplash
无论行业规模大小,网络攻击、勒索软件和恶意软件攻击都是最大的威胁。组织没有做好准备来保护数据免受网络攻击。这主要是由于缺乏财政资源和对所需措施的认识。尽管许多攻击都是针对金融和银行公司的,但医疗保健是黑客的另一个重点领域。随着黑客不断窃取数据,网络威胁已经不可避免。医疗行业是成熟的行业,黑客的目标主要是窃取患者的电子健康记录。
如果我们进一步诊断该行业的健康状况,那么医疗保健行业被黑客列为五大优先行业就不足为奇了。IBM 最近的一份报告也显示了类似的趋势。攻击 wannacry 影响了大约 30 万台计算机和 150 个美国国家,这是一个警钟。许多组织开始加强他们的安全协议来应对日益增长的威胁。然而,黑客们正在挑灯夜战,获取价值数百万的数据,并在黑暗的网络上出售。
当你知道这种数据有巨大的市场,并且在许多情况下,需要特定组织和医疗保健提供商的数据库时,你不会感到惊讶。以下是对数十亿美元产业运作的深入了解。
是什么让 EHR 有价值
电子健康记录是在电脑上而不是在纸上的数字记录。这些记录不仅包括患者的健康数据,如临床试验和测试结果,还包括其他价值数百万的机密信息。这些信息包括患者地址、信用卡号、社会保险号和其他被滥用的关键凭证。例如,信用卡号码被用来从病人的账户中吸走钱。同样,社会安全号码被用来欺骗保险公司要求虚假索赔。此外,患者数据以设定的价格出售给客户,从而黑客通过这种方式赚取收入。
隐藏的数据经济
当我们了解 EHR 数据的价值时,我们需要知道的下一件事是这些被窃取的数据是否有市场。患者通常不知道他们的个人数据,如他们被发现呈阳性的测试和他们接受的手术都在出售。这些被盗数据主要是通过黑暗网络提供的,这也产生了巨大的需求,从而转化为价值百万美元的业务。这种由被黑客攻击的数据创造的隐藏数据经济被进一步挖掘,并使用其他资源(如药房)交叉引用数据。然后,个人病历被赋予代码,而不是使用姓名。
一个这样的卖家在暗网上说有一个买家特别想买“保险公司的记录”。这些数据为买方净赚了 10,000 美元,因为这还包括获取数据所付出的努力。因此,数据不仅被出售,而且被公开宣传。卖家甚至吹嘘在网上泄露数据。
网络犯罪即服务
以前,网络犯罪仅限于技术黑客,但现在情况发生了很大变化。窃取数据不再需要熟练的技术,因为根据研究人员的说法,工具已经被开发出来,非技术型窃贼只需一点免费的技术支持就可以从组织中窃取 EHR 数据。网络犯罪即服务是一项不断增长的业务,并在持续创收。
能做些什么?
为了遏制黑暗网络市场,第一步也是最重要的一步是识别风险以及您的数据如何被泄露。通过使用加密和合规程序,确保抵御外部威胁的能力将大大降低。第三方风险是为避免数据泄露而必须考虑的另一个方面。
迫在眉睫的麻烦
患者对医疗保健提供者的信任度包括对其信息安全的信任度。尽管如此,信任还是被破坏了。但更大的问题是,作为患者,我们是否愿意将我们的数据用于科学研究和其他非法用途。允许使用病历的选择必须由病人决定。目前情况并非如此,剥削十分猖獗。为了遏制这些活动,政府和我们作为公民都需要采取严厉的措施。需要遵循严格的安全协议,并且必须进行尽职调查。
您更聪明的分析策略
最近,我有幸在纽约市的社交媒体战略峰会上做了一个 3 小时的分析策略讲座。
会议内容包括:
- 成功分析策略的要素
- 人工智能的发展对分析意味着什么
- 如何定义和传达分析框架
- 如何为一系列利益相关者设置分析仪表板
- 最佳分析团队所需的人员和技能
- 当今使用人工智能和 NLP 的品牌案例研究
- 提高营销活动评估的实用技巧
本文末尾有一个完整演示文稿和附带注释的链接。在这里,我提出了一些要点来突出我的想法。
分析能实现什么?
分析平台可以回答许多重要的问题,但通过分析策略,我们意味着对我们的数据来自哪里、为什么可靠、我们的测试方法是什么以及我们最终希望通过数据显示实现什么有一个清晰和有记录的视图。
分析策略也有不同程度的复杂性,从回顾性方法到前瞻性学科,如规范或自主分析:
PwC
2017 年企业的许多日常工作都属于描述性或诊断性分析的定义。我们习惯于访问分析平台,以了解我们在过去几天或几周内观察到的趋势。
然而,许多组织正在超越这一点,进入更复杂、更有利可图的分析领域。
华盛顿塔科马的一家动物园与国家气象局合作,以确定导致游客人数如此不可预测地上升和下降的因素。这给管理层带来了问题,他们总是会为公园配备员工以迎合大量观众,但如果游客数量低于预期,他们往往会在工资上超支。
凭直觉,我们可以假设,在温暖干燥的日子里,上座率较高,但在寒冷或潮湿的日子里,上座率较低。然而,通过将国家气象局的数据纳入 IBM 的人工智能驱动的沃森平台,动物园能够准确地确定哪些条件导致更多人参观。
这一知识随后被用于模拟未来的游客模式,使用历史游客人数和预测的天气统计数据。
Hopper 通过预测未来的价格模式并提醒旅行者购买飞往他们首选目的地的航班的最便宜时间,领先一步。
它通过每天观察数十亿的价格,并基于每条路线的历史数据,预测趋势将如何发展来做到这一点。然后,用户可以设置通知,提醒他们在价格下降时预订。
尽管 Hopper 不是唯一一家提供这种服务的公司,但它的预测准确率高达 95%。
数据通过沃尔玛的“数据咖啡馆”在云中管理,该咖啡馆由硅谷的沃尔玛实验室团队维护。这是一项复杂的、大规模的工作,要根据可靠的数据做出准确的预测,就需要与如此规模的企业所需的变量数量保持一致。
他们网站上和商店里的一切都被同时跟踪,所有来自销售点系统的数据都与在线转换同步。
这使得沃尔玛能够毫不费力地转移库存,并确保它总是在正确的地方以正确的数量提供正确的产品。
问正确的问题
一个好的分析策略始于对企业希望用数据来回答的问题的纯粹理解。这提供了一个框架,我们可以据此评估我们所掌握的数据的数量和质量,以提供令人满意的答复。
我们可以对这些问题进行分类,为我们发现增加更多的结构:
从这里,有一个清晰的过程。我们有一个更广泛的业务目标,并定义数字化如何实现这一目标。下一步是开始询问可能帮助我们更接近目标的问题,这将揭示我们需要测量的指标,以提供结论性的答案。
分析战略框架
PwC
付诸行动:
PwC
获得正确的测量值
基本指标的一个例子是客户终身价值。当我们审视像社交媒体这样的努力时,或者当我们开始定义归因模型时,这一点就显得尤为重要。如果我们知道我们的客户终身价值,并且我们对我们的归因模型有信心,我们可以将商业价值应用到我们的品牌和我们的受众之间的任何在线互动中。
这是衡量策略的重要组成部分,是我们在开始任何数字活动之前都应该定义的东西:
下面,我总结了会议的主要收获,但我也包括了幻灯片的链接。在该资料中,有关于谷歌分析设置、归因模型以及将分析融入公司文化的深入章节。
你更聪明的数据分析策略 Clark Boyd,2017 年 10 月
docs.google.com](https://docs.google.com/presentation/d/193iZ60lo7waACgkanElfQ1rYHmbyzDEsBgxTHphGMYA/edit?usp=sharing)
希望你觉得有用!
你太依赖数据了
让决策变得更糟,而不是更好
当你在经营一家企业时,你的工作可以归结为做出一系列重要决策:是否应该推出新产品?一个部门该不该解散?是否应该开展营销活动?每个决定都有风险和回报——你会赚很多钱还是花光它们?人们很容易相信在灾难的宇宙中只有一个正确的选择,而高管的工作就是找到那个选择。
每一本畅销的管理杂志都会告诉你,21 世纪闪闪发光的救世主是数据。充足的数据会让你不做出任何错误的选择。存储关于客户、产品和营销的数据。然后雇佣一些聪明的数据科学家,你很快就会从错误中解脱出来。谷歌“数据驱动的决策”,你会发现数百篇关于你如何没有收集足够的数据,监控足够的 KPI,或让足够多的数据科学家进行足够多的分析的管理文章。
科学债务是大卫·罗宾逊创造的一个术语,它敦促企业决定哪些分析是重要的,应该立即关注,哪些领域的研究可以推迟到以后。在这里,你的债务就是知识。这一概念允许公司预先讨论他们的数据科学优先事项。每个公司都应该积极考虑他们的科学债务。
在我与许多企业合作的这些年里,我确实看到一些公司陷入了没有充分利用数据的情况。然而,与我看到的相反问题的次数相比,这些事件就相形见绌了:过度依赖数据到了有害程度的公司。做出好的决策需要数据,这种想法是有害的。
更多的数据和分析有助于更好的决策,这种想法从根本上说是错误的。
想想最近的一个故事,关于可口可乐如何利用人工智能创造新的汽水口味。在完成公关后,很明显可口可乐利用他们的自由式风味机数据看到人们经常选择添加樱桃的雪碧。有了这些知识,可口可乐在商店里推出了樱桃雪碧作为自己的汽水系列。忽略“我们聚合了数据,Cherry Sprite 很受欢迎,所以我们推出了它”这一事实是有史以来声称某些东西是人工智能的最恶劣的例子,这也是数据如何伤害决策的一个很好的例子。
想想看,虽然樱桃雪碧是一种前所未有的新口味,但极其相似的口味樱桃 7UP 已经存在了三十年!“人工智能”结合来自数百万消费者的数据,创造了一种味道,这种味道可能是一位可口可乐高管走过杂货店过道时想出来的,“我们应该复制它。”与在数据基础设施上投资数百万不同,窃取创意是免费的。
如果一位可口可乐高管可以在过去三十年的任何时候制造出这种解渴剂,为什么樱桃雪碧直到涉及大数据后才上市?据我所见,当人们含蓄地知道一个想法是好的,但他们不能让其他人加入时,这些情况就会发生。多年来,可能有数百名可口可乐高管认为樱桃雪碧是一个好主意,但他们从来没有达到推出该产品所需的临界质量。只有当一个人得到自由式数据时,这个人才能让公司相信这种味道是好的。
This cold boy was quenching thirsts before AI was even trendy.
这并不是说数据对决策很重要,而是说如果你只用数据做决策,那么你的机会就会受到限制。如果可口可乐早十年推出樱桃雪碧,他们会多赚多少钱?有多少汽水口味是人们会喜欢的,但永远不会推出,因为它们不存在于自由式机器中?通过限制自己只做那些有足够数据的决策,你大大降低了公司可接受的解决方案集。通常,公司能够做出的最具创新性的改变是那些事先没有任何可能数据的改变。
但是真正的问题是:即使你有好的数据,你的分析也总是包括假设。如果这些假设是错误的,你的分析会给出一个糟糕的结果。这些糟糕的结果会导致组织做出比不使用数据更糟糕的事情。如果一家公司试图推出一种新产品,他们可能会分析类似的现有产品来预测投资回报。但是,假设哪些产品是相似的会极大地改变分析,而且没有办法知道哪些产品会有相似的表现。新产品的行为可能与任何现有产品都不一样,通过分析,你误导了公司对将要发生的事情的认识。作为数据科学家,我们应该希望平均来说我们的方向是正确的,但这是不可能知道的。数据不能取代人类的直觉,也不能消除风险。
当数据与其他因素一起用于决策时,有缺陷的分析就不是问题了。其他因素弥补了这一点,组织将做出强有力的决策。当数据对于决策是必要的时候,有缺陷的分析是一个大问题。高管们让糟糕的假设成为过去,因为这是他们推出想法的唯一途径。这就围绕着“我们用数据来支持我们所有的决策”这一听起来很积极的想法产生了非常消极的企业文化。
要点不是数据不好,你不应该想用它。相反,数据和分析应该与其他决策工具一起使用,如市场研究、以前的经验和概念验证试验。将分析视为只会做出更好决策的东西,你就冒着创造一种环境的风险,在这种环境中,你的可能性受到限制。不要把数据当作真理的唯一来源,否则你将会等上几十年去尝试另一种新的汽水口味。
如果你想要一大堆帮助你在数据科学领域发展职业生涯的方法,看看我和艾米丽·罗宾逊写的书: 在数据科学领域建立职业生涯 。我们将带您了解成为数据科学家所需的技能,找到您的第一份工作,然后晋升到高级职位。
青年选民疲劳——事实还是虚构
我相信你以前听过这样的话:新注册的、精力充沛的年轻选民参加了他们的第一次选举,然后当他们参加的选举没有按照他们希望的方式进行时,他们就退出了这个过程。
Turnout trend by age, for those who were registered to vote in North Carolina and voted in the 2016 general election.
从登记选民的投票率来看,这一理论似乎是正确的。在 2016 年的大选中,北卡罗来纳州登记投票的 18 岁年轻人中有 67.2%参加了投票。但是年轻人的投票率并不总是这么高。在登记投票的 23 岁年轻人中,2016 年只有 47.2%的人投票。自然,这就引出了一个重要的问题。
23 岁的人 客观上 投票率比 18 岁的人低吗?
投票率 真的在 18 岁后 下降吗?
这一探索的结果有着有趣的含义,考虑到如果投票率的下降真正反映了年轻人的行为,那么投票率整体上升的潜力是巨大的。如果我们能让这些年轻选民参与到他们的生活中,而不是在他们 20 多岁时退出,我们国家的选民可能会有很大的不同。大多数人都会同意,年轻人更多的政治参与只会有利于我们的民主。
因此,为了测试这种投票率下降是否合理,我计算了投票率占公民投票年龄人口的比例,并将这些投票率值与已经登记投票的投票率值进行了比较。
Turnout trends in North Carolina for the 2016 general election by age among registered voters and citizens.
在计算了登记选民的投票率和公民的投票率之后,这个发现是引人注目的。尽管公民投票率似乎略有下降,从 18 岁时的 45.8%下降到 24 岁时的 41.3%,但这一下降远不如登记选民中相对急剧的下降那么明显。公民投票率的总体趋势是随着年龄的增长而增加,而登记选民的投票率给了我们一个完全不同的想法。
考虑到 2016 年可能是数据中的异常(考虑到我们在那个选举周期经历了多少怪癖),我们来看看其他选举年。
通过观察 2014 年、2012 年和 2010 年的结果,我们可以得出结论,这种现象并不局限于任何特定的选举周期,也不局限于任何类型的选举。在登记选民中,18 岁以后投票率下降是普遍现象;而公民投票率通常会随着年龄的增长而增加。
虽然一些选举确实显示投票率略有下降,如 2012 年和 2016 年(有趣的是,两次都是总统选举),但登记选民的百分比下降总是大于公民的百分比下降,如下表所示。
我怀疑这种现象可以归因于选民登记记录中的**“朽木”,即已经改变地址但仍然存在于选民登记名册中的人的残余,这是因为《国家选民登记法》要求选举官员只有在一些联邦选举中未能投票后才能删除选民。我们看到的投票率下降可能是一个分子膨胀的症状,这是由于在登记投票率计算中,夸大了年轻人的登记人数。考虑到年轻人频繁流动的倾向,年轻人在记录上有夸大的注册数量是有道理的。**
如上所述,总统选举年的登记选民投票率下降幅度似乎更大。第一栏显示了从 18 岁到当年最低投票年龄的登记选民投票率下降的百分比。第二项显示了同一年龄范围内公民投票率的百分比变化。第三列是前两列的补充,可以解释为登记选民投票率的下降在多大程度上是“朽木”的结果。在两次总统选举中,登记选民的投票率再次出现了最大幅度的下降。
如果投票率的下降是由于选民登记名册中没有更新的地址的变化引起的,我们可能会怀疑“朽木”的水平因种族而异。种族会影响注册选民投票率下降的幅度吗?
上面的图表描述了不同种族和族裔的选民在 2016 年大选中的登记选民和公民投票率。乍一看,似乎每个登记的投票人数都有相似的下降。另一方面,公民投票率在不同种族和民族之间差异很大。
从左边的表格中,我们可以看到每个种族和民族群体的公民投票率都有所下降。但是,在每一种情况下,登记投票率的下降幅度都大于公民投票率的下降幅度,这继续表明登记投票率由于登记人数的膨胀而呈现出错误的趋势。第三栏再次显示了登记投票率和公民投票率之间的百分比误差。这一分析显示,美国土著选民受登记记录中“朽木”的影响最大,其次是黑人选民。
应开展进一步研究,将其他国家包括进来,并扩大观察的选举周期的数量。查看选民登记记录以确定这些被夸大的登记属于谁以及它们为什么会出现在系统中也是很有趣的。然而,我们必须谨慎行事,不要鼓励进一步努力将选民从名册中清除出去。
与此同时,我们需要改变年轻人参与选举进程的说法。我们的结果表明,年轻人并没有因为选举失败而疲惫不堪,他们首先还没有被动员起来。让我们停止通过散布虚假的投票模式来阻止年轻人投票。
方法:
数据
使用的数据来自北卡罗来纳州的 FTP 网站,可以在这里找到。我使用了一个包含全州选民历史的文件和四个用于不同选举的不同选民登记文件。幸运的是,北卡罗来纳州在每次重大选举之前都会上传选民登记文件的“快照”(2010 年除外),所以这是我在查看特定选举时经常使用的选民登记文件。为了计算市民估计,我使用了三个美国社区调查数据文件的组合,分别用于市民估计、年度人口估计和按年龄划分的人口统计。
算法
对于每次选举,我的代码基本上分为两个主要部分:查找登记选民投票率和公民投票率。两者都是从为适当的选举过滤投票历史文件开始的。
然后,我将投票历史文件和选民登记文件合并在一起,创建一个数据框,其中只包含在我感兴趣的选举中投票的人,还添加了选民登记文件中的有用信息,如年龄。接下来,为了计算登记的选民投票率,我计算选民登记文件中的人数,合并文件中的人数,并将结果保存到一个新的数据框中。注册投票率是这两个值的划分。
为了计算公民投票率,我首先找到每个年龄段的估计人数。现有数据是 7 月份发布的年度估计值。为了更好地估计 7 月估计和 11 月选举之间的人口增长,我添加了选举年估计和即将到来的选举之间的差异,并乘以选举年估计的 0.3。
然后,我需要用公民占人口的百分比来缩小这个人口估计。我有每个年龄组的公民人数的数据,我用它来计算每个年龄组中有公民身份的人的百分比。利用这些群体估计,我缩小了人口估计。
对于公民投票率,分子与登记投票率相同,因此我在这里简单地使用相同的数据并计算新的投票率数字。
为了按种族划分这些趋势,我简单地再次过滤了选民登记文件,以表明我正在分析哪个种族或民族代码。
按种族划分的公民投票率也必须被编辑。我使用之前的同一个文件来获得按年龄划分的人口估计值,这一次在我的计数中指定我想要哪个种族或民族的数据。和以前一样,我使用之前发现的年龄范围公民百分比来缩小公民估计的人口估计。在未来,我更倾向于使用每个种族或民族类别的公民百分比来缩小人口估计,而不是总人口的公民百分比。同样,如果我能找到一个包含按年龄而非年龄组划分的公民百分比的数据集,这将使我的公民投票率计算更加准确。
我所有的图表都是用 ggplot 创建的。我使用了一个自定义的主题,你可以看到下面的细节。
挑战
这个项目最大的挑战之一当然是分析大型数据文件。我不得不导入四个不同的选民登记文件,每个文件在 4g 到 16g 之间,另外一个 5gb 的文件包含该州的投票历史。这意味着我的电脑运行我的代码非常非常慢。如果我幸运的话,整个脚本运行需要 1.5 小时。然而,比我愿意承认的更多的是,由于我的计算机完全崩溃,我的编码会话结束了。谢天谢地,这个问题只需要耐心就能解决。
占据我更多时间的一个挑战恰好是选民登记文件的细节。北卡罗莱纳州在他们的登记文件中有一栏显示了选民的身份,可以标记为“活动”、“不活动”或“已删除”。当我开始这个项目时,我将“被移除”的选民包括在我的计算中,我很快意识到这使我的数据失去了意义。
2016 North Carolina registered voter turnout with “removed” voters included
这张图表看起来与我在本文中使用的登记选民投票率完全不同,因为它在分子和分母中包括了已经从选民登记名册中“删除”的人,使得两者都比它们应该的要大。然后,我试图通过编辑分母来计算登记的选民投票率,只包括登记文件中标记为“非活动”或“活动”的选民。
这一变化帮助我的曲线看起来更接近预期,除了公民投票率高于登记投票率,这违背了逻辑。这个问题是由于我没有从投票历史记录和注册记录中过滤掉“被删除”的投票人。由于地址的变化,许多被标记为“已删除”的人在选民登记文件中有多行,其中只有一行被标记为“活动”。如果我忽略了过滤掉被除名的选民,而那些有多次被除名历史的选民中有一个碰巧投票了,他们的其他历史就会被算作 2016 年的选票。显然,这夸大了分子中的人数,使百分比上升到看似合理的水平之上。
Youtube 浏览量预测
由机器学习支持的获得更多 YouTube 浏览量的综合指南
这个项目是由艾伦·王、阿拉文·斯里尼瓦桑、凯文·易和瑞安·奥法雷尔建造的。我们的脚本和模型可以在这里找到。
在这里输入你自己的缩略图和标题到我们的模型来预测你的视频的浏览量。
背景
在过去的 5 年里,YouTube 已经向 YouTube 内容创作者支付了超过 50 亿美元。流行的 YouTuber PewDiePie 在 2016 年仅从 YouTube 就赚了 500 万美元,这还不包括赞助、代言和 YouTube 以外的其他交易。随着越来越多的公司转向 YouTube 的影响者来吸引千禧一代的观众,让人们在 YouTube 上观看你的视频变得越来越有利可图。
我们的目标是创建一个模型,帮助有影响力的人预测他们下一个视频的浏览量。Youtube 上的内容涵盖了各种类型,如喜剧、体育、时尚、游戏和健身。由于问题的严重程度,我们将范围缩小到了与健身相关的视频。健身内容是 YouTube 的一大部分。人们正涌向免费的在线健身内容寻求建议,而不是雇佣昂贵的私人教练。
一个人在看 YouTube 推荐的相关视频时,首先会看到标题和缩略图。如果特定的标题和缩略图可以产生更多的潜在视图,YouTuber 可以使用这些信息来产生他们努力工作的视频内容的最大潜在视图。因此,我们的目标是创建一个使用非视频功能的模型来预测观看次数,健身影响者可以使用它来帮助扩大他们的渠道。
数据
我们找不到合适的数据集,所以我们自己拼凑了一个。我们使用了 YouTube 的 800 万数据集,其中包含 32 GB 的预先标记的数据,这些数据按各种类型分类(如体育、时尚、电影)。我们过滤了所有带有“健身和健身房”相关标签的数据,得到了 15,305 个视频。为了增加数据集的大小,我们收集了之前数据集中每个用户的视频。我们现在有 115,362 个视频要处理。我们为每个视频搜集了以下特征:
- 标题
- 极小的
- 描述
- 喜欢计数
- 不喜欢计数
- 视图计数
- 最喜欢的计数
- 评论计数
- 出版日期
- 频道的订户计数
- 频道发布的视频数量
- 整个频道的观看次数
- 频道发布的上一个视频的评论计数
- 频道发布的上一个视频的观看次数
- 频道发布的上一个视频的标题
- 频道的年龄
特征工程和提取
我们关注视频的标题和缩略图,因为这是用户浏览视频时会看到的主要特征。我们必须从缩略图和标题中提取有意义的特征,以便在我们的模型中考虑它们。
类似于我们在 BuzzFeed 等网站上看到的 clickbait 标题的效果,我们希望在 YouTube 视频上看到 clickbait 标题和缩略图的效果。具体来说,通过观察专注于健身的成功 YouTubers,我们注意到了一些共同的特征:
- 标题用过多的大写字母和感叹号激起了人们的热情
- 标题作出保证和承诺捷径
- 标题包括一个列表
- 该图像包括一个健康的男人或女人
我们尝试在标题和缩略图上训练神经网络(稍后会有更多介绍),但没有得到非常有希望的结果。
我们决定走一条不同的路——特别是使用预先训练好的网络作为特征提取器。我们发现了一个由雅虎开源的 NSFW 计分器和一个 clickbait 计分器。我们对以前的标题、当前的标题和缩略图进行了测试,并提供了代表这些信息的新功能,从而产生了新的可用功能。
数据探索
我们的主要目标是生成一个预测视图数量(或视图差异)的模型。首先,我们剔除一些异常值,即已经“病毒式传播”的视频,我们将其定义为浏览量超过 100 万的视频。
我们可以看到这是严重的倾斜,这是可以理解的——大多数普通的 YouTubers 用户可能不会有那么多的浏览量。此外,来自 YouTube-8M 数据集的视频似乎完全是随机采样的(即不偏向流行视频),因为它的目标是标记给定视频级别信息的类别。
当我们最终得到我们的预测器时,我们想要预测类似高斯曲线的东西。幸运的是,我们可以对 ViewCount 应用一个 log 转换来实现这一点。
我们可以尝试预测的另一个量是视图计数的差异。我们从剔除异常值开始,即观看次数增加或减少超过 5 倍的视频。
请注意,在我们的视频中,视图之间的差异通常在 0 左右波动,但实际上集中在-1 左右。计算方法如下:
因此,百分比差异约为-1 的条目是那些(当前视频的)查看次数约为 0 的条目。这很有意思——我们目前的大部分浏览量都是最近抓取的视频。可以这么说,这可能是因为视频发布的时间还不够长,无法获得“真实”的浏览量。因此,我们可能需要一个特性来表示它被上传和我们抓取之间的时间。
最后,让我们看看从标题和缩略图中提取的特征:
点击诱饵得分
我们使用预先训练好的网络来提取每个标题的点击诱饵分数。clickbait 得分从 0 到 1,得分越高,标题越“clickbait-y”。点击诱饵分数分布如下所示:
我们有兴趣看看 YouTubers 是否在他们的频道上使用了不同程度的“点击诱饵”标题。因此,我们计算了每个 YouTuber 视频的点击诱饵得分的差异,并绘制了分布图:
有趣的是,我们看到 clickbait 得分的差异几乎看起来像一条零均值高斯曲线。这意味着我们不希望 YouTubers 在标题中偏离默认的“点击诱饵”。
最后,我们比较了观看次数最少的 10%和最多的 10%的点击诱饵分数:
事实证明,“clickbait-y”标题并不局限于 YouTubers 上的顶级网站,使用它可能不是一种产生更多视图的简单方法。“点击诱饵性”对浏览量的总体影响还不清楚,但我们认为这一特征在我们的模型中不会提供太多的预测能力。
接下来,我们来看看 clickbait 分数和 ViewCount 之间的实际散点图:
从这个图中,我们注意到在视图计数和 clickbait 得分之间没有太多的相关性,这意味着 clickbait 可能不是病毒式传播的先决条件。
接下来,我们决定看看标题中的实际单词。
常用词和名词短语 为了验证我们对标题中使用的技巧背后的直觉,我们决定找出最常用的词和名词短语。过滤掉一些常用词,如“the”、“to”、“and”等。,一些非常常见的单词和三元组:
NSFW 得分
让我们看看从缩略图中提取的 NSFW 分数的分布:
nsfw 分数严重偏向 0,平均值为 0.107。当我们查看观看率最高的 10%的视频和观看率最低的 10%的视频的平均分数时,这变得很有趣。
前 10%的平均 nsfw 得分为 0.158,后 10%的平均 nsfw 得分为 0.069。这似乎提供了比点击诱饵分数更强的预测能力,并且证实了我们一直以来都知道的——性销售。
预言者
使用 GradientBoostedRegressor,我们绘制了特征重要性:
最终,看起来过去的表现决定了未来的成功。预测你的频道表现如何的最佳指标是你之前视频的浏览量。你的缩略图的暗示性和视频标题的“点击诱惑性”对观看者能获得的观看次数影响不大。最后,我们使用一个 XGBRegressor 来预测 log 转换后的视图计数。我们使用交叉验证来获得:
R = 0.750 0.007
RMSE = 0.970 0.021
从我们的预测到真实值图中,我们可以看到模型似乎很好地拟合了数据。此外,残差图表明误差偏差是由零均值高斯分布引起的。
最后,我们对输出进行指数运算,以获得视图的真实数量:
RMSE = 8727.0 100.9
这实质上意味着,如果 YouTuber 使用我们的预测器,他们可以预期实际结果在模型结果的 8800 个实际视图之内。对于一个拥有大约 1000 个浏览量的业余 YouTube 来说,这有点没用,但对于一个拥有大约 100,000 个浏览量的 YouTube 来说,这开始变得更加有用。然而,最终预测视图的数量本身就很困难,所以这些结果和我们预期的差不多。
可能需要更多调查的模型
最初当我们计划这个项目时,我们试图从标题和缩略图本身来预测视图的数量。不幸的是,我们很快发现,观看次数与频道信息本身有更大的关系——通常是观看次数、订户数等。本节将涵盖我们实验的各种其他模型,以评估标题和缩略图对视图的影响。
由于我们有两个独立的文本序列,我们需要找到一种方法将它们作为网络的输入。我们决定用一个明显的分隔符号将以前的和当前的标题结合起来。如果真的有不同的标题之间的差异,那么网络应该捡起来。
我们使用手套嵌入将每个标题转换成向量序列,然后对每个序列进行零填充,使其长度相同。
首先,我们尝试了一个在 NLP 任务中使用的相当标准的网络:
我们注意到网络训练得很快,但是尽管训练损失在迅速减少,但验证损失实际上开始增加。这是模型可能过度拟合的迹象。牢记这一点,我们建立了第二个网络:
不同的是,在这个新的网络中,我们在每层增加了更多的 LSTM 单元和另一个 LSTM 层。我们对每一个都进行了更多的规范化,以避免过度拟合。我们对此进行了大约 30 个时期的训练,并注意到训练损失会略有下降,但验证损失波动很大。最终,仅仅使用视频的标题,噪音似乎比信号更多。每个纪元都需要很长时间来训练,特别是有这么多 LSTM 单位,所以我们决定不走这条路线。
卷积神经网络:男女 这里的目标是验证缩略图中的人的性别是否与查看次数相关。我们用这个预训练的 CNN 提取了一个二元性别特征。然而,像大多数性别分类 CNN 一样,我们的网络在识别缩略图中的面孔时遇到了困难。我们的网络在没有人的情况下也很难处理缩略图。考虑到这种方法的问题以及从每个缩略图中提取人脸所需的时间,我们决定不使用这种方法作为特征提取器。
结论
我们对这个项目有很多不同的想法,但可能最初对我们的目标来说过于雄心勃勃。我们最初试图预测只有标题和缩略图的浏览数。我们希望神经网络能够在顶级 YouTubers 撰写标题和创建缩略图的方式中学习隐藏的功能,但很快发现这只是一厢情愿的想法。然而,相反,我们能够找到比原始标题和缩略图对预测器更有意义的特征,并最终能够创建一个对中等大小的 YouTube 频道有用的预测器。如果我们有更多的时间,我们可以尝试更多的事情,包括
- 扩展到不同的类型
- 对评论进行情感分析,以创建更强大的“用户简档”,该简档可用作一项功能
- 使用对评论的情感分析来创建一个强大的“接受”特征(类似于喜欢/不喜欢),然后可以预测该特征
- 使用创成式模型创建注释
- 在缩略图上训练 CNN——由于 NSFW 分数似乎比 clickbait 分数提供了更大的预测能力,因此应用于缩略图的 CNN 可能会比在标题上训练的 LSTMs 表现得更好
YROO:人工智能辅助购物的未来
以客户为中心是人工智能的承诺。这似乎是一直躲避商业的圣杯。营销解决方案和系统集成商正试图为下一个最佳行动建立技术框架,将实时消费者环境考虑在内。他们仍然有所欠缺。但是,如果真正了解客户的核心的唯一方法是从不同的角度、不同的数据集积累大量的数据,以便在正确的时间返回直观地符合消费者期望的结果,那会怎么样呢?这正是 YROO 打算做的事情。
我在多伦多市中心的一条安静的街道上见到了 YROO 的首席技术官兼创始人尼克·朱七。他的小办公室和一个 22 人的团队位于多伦多商业区的中心,但仍然被不同种族的餐馆包围着,而且离南边著名的圣劳伦斯市场只有一箭之遥。一个沉着冷静的年轻人向我打招呼。但是当我们开始交谈时,我感觉到在他讲述他的故事时,这种激情的暗流弥漫在我们的讨论中。
它开始的地方……
尼克·朱七是一名有着 17 年专业经验的资深软件工程师。他毕业于上海大学,获得经济学学士学位。他谈到了他的父亲,一位接受传统数学培训的经济学教授,以及他的祖父,一位在他很小的时候就向他介绍无线电元件和电路世界的电气工程师。尼克对计算机很感兴趣,记得在一年级时学过一种叫做 Logo 的语言。虽然尼克的学位是经济学,但他的兴趣来自于消费者行为和数据。
在创办 Yroo.com T4 公司之前,尼克在 dot.com 的繁荣时期培养了自己的编程技能,成为了一名软件工程师。后来,他完成了计算机科学硕士学位,开始作为一名独立的软件顾问工作。后来,他加入 ThoughtWorks,担任加拿大业务的首席顾问。在过去的 10 年里,他的热情和专长集中在分布式计算、语言设计、机器学习和数据挖掘上。
实时语境关联成功……
在 ThoughtWorks,Nick 为一个广告平台开发了广告跟踪软件,用于跟踪在线广告并实时分析来自网络的数十亿个信号。此外,他还为一家呼叫中心软件供应商开发了软件,使他们能够通过聚合社交数据、语音数据和账户信息、分析消费者情绪的语音语调并显示上下文相关性来优化呼叫处理,从而提高呼叫中心的客户参与度。这些项目利用大数据和机器学习(ML)来帮助企业预测客户行为,并优化旅程中的客户转化点。
输入 YROO:解决市场问题……
优化消费者体验很容易转化为在线零售领域正在发生的事情。据尼克所说,
“自电子商务在 90 年代末首次亮相以来,过去 20 年中真正发生了什么变化?选择增加了,物流、交货速度和客户服务都有了显著改善。但从信息的角度来看,消费者收到的东西并没有改变太多。虽然零售和企业巨头已经积累了关于他们的客户、产品和竞争对手的信息,但消费者却没有同样的信息优势。"
信息不平衡,消费者继续做所有的工作。他们也不知道如何做出更好的购买决定。如果一家零售商以六折促销一种产品,这意味着什么?是从建议零售价打折的吗?如果你昨天收到 60%的折扣,但今天是 40%呢?价格比前一天上涨了 20%。在尼克看来,像 MarketWatch 这样的研究公司已经注意到,建议零售价(SRP)过高,因此不可信。那么基线是什么呢?
随着时间的推移,企业零售对数据的访问使他们能够更好地在正确的时间向消费者销售正确的产品。他们的武器库收集了客户的人口统计信息、家庭构成、可支配收入、兴趣和在线搜索等。
一个想法……
通过进一步的探索,尼克和他的团队意识到零售商提供了大量的数据,但没有人系统地试图从中收集见解。许多数据非常混乱,需要多次迭代才能理解它们的价值。例如:在 Shopping.com,一位客户正在寻找一款特定的无线扬声器。这个扬声器也在另外两个网站上销售。不同网站的图片、标题、文字描述可能略有不同,但是通过一些视觉和信息比较,人们可以在几分钟内得出结论,这些产品是相同的。尼克猜测的…
如果一个人可以通过购物比较合理地得出结论,一种产品是相同的,那么这是一个可以应用于机器的“可学习的问题”。在机器学习中,这被定义为实体解析:将实体(对象或事物)链接在一起的能力。”
市场中的实体解析…
YROO 现在正在生产中运行其算法的第 3 版。花了 18 个月才走到这一步。Yroo 在美国上线,聚合了来自 5000 家商家和平台的信息,包括 F100 企业零售商。这个模型很聪明,它可以将产品聚集在一起,因此对于消费者来说,在一个地方实时获得所有信息是很有用的。瞬间,顾客可以决定从哪个零售商那里购买什么产品。
以消费者为中心的搜索引擎:提供客观排名的结果
Yroo 要解决的下一个算法是排名。由于消费者一次只能消化有限的信息,所以提供对消费者有用的信息非常重要。对于第一次消费的消费者,他们通常会首先获得赞助位置,以及可能为零售商提供最佳利润的产品。YROO 开始改变这种情况,目标是直观地返回符合消费者预期的结果。通过访问其他信号,包括畅销产品、各商家的销售排名,以及利用神经网络来提高排名,Yroo 能够优化买家行为。
YROO 确实有一些赞助广告,作为其货币化战略的一部分,但在大多数情况下,返回的结果是有机的。他们的承诺是确保赞助广告不会像亚马逊一样将相关结果推到折叠线以下。
虽然大量数据来自亚马逊,但尼克表示,现在可以广泛访问许多商家有助于消除亚马逊庞大数量中的偏见。最终,该算法将代表大众消费市场,而不是更专业、更小众的市场。
他们过得怎么样?与同一时期的平均移动流量相比,上一次黑色星期五活动在 YROO 上为最大的平台之一带来了两倍的移动转化率。这种认可也转化为 YROO 因其销售线索生成和转化表现而获得的佣金。
支持消费者的智能浏览器扩展现已上线
如果你碰巧在亚马逊上搜索那个特殊的演讲者,如果你的浏览器上弹出一个小通知,显示其他商店以不同的价格销售该产品,会怎么样?所以,不用再在谷歌上搜索或者跳到其他零售商那里比价了。当你寻找某个特定产品的时候,一切都来了。这将消除以前为确保找到最佳价格而花费的时间和精力。这种并排比较减少了消费者的搜索工作,并直接为您带来了强大的正确信息!
“你不必来我们的地盘。你不必改变购物的方式。YROO 会走到你面前,自动向你展示备选方案……我们制造这台机器是为了理解消费者能理解的网页。我们解读网页上的信息,理解它,并浏览整个网页,了解所有的比较特征。然后我们在恰当的时候把相关信息带给消费者。”
关于人工智能和广告的下一步的想法…
反思真正理解消费者的演变,尼克认为广告不会很快消失。通过个性化和大众媒体的品牌认知将会继续。然而,在线广告市场充斥着许多不道德的特征,从欺诈到点击诱饵、机器人和点击农场。它需要改革,否则可能会损失大量广告资金。程序化的兴起是一种众所周知的猎枪方法,进一步降低了行业的声誉。有了人工智能,这些数据将为消费者提供更少干扰、更个性化、更智能和更有价值的信息。
随着人工智能变得更加普遍,我们进一步进入深度神经网络,尼克表示,这将使深入研究可解释的人工智能变得更加困难。
“与随机森林(Random Forest)在其分支上应用逻辑一样,深度神经网络由直觉组成,可以识别作为重要特征的变量。然而,与随机森林不同的是,很难确定一个神经网络做出的特定决定以及它到达最终结果的路径…
人脑是复杂的。有时候,我们认为我们做的和我们说的和我们实际做的是完全不同的三件事。我们大脑的一边给出解释,而另一半实际上做出决定。很多时候,他们可能不会和解。"
人工智能的未来也试图编纂人类知识。正如尼克所指出的,挑战在于试图将“诀窍”编纂成文,即你无法解释但只是“知道如何做”的事情,例如骑自行车或走路。这是一个值得注意的时刻,一个数学方程可以真正地编纂直觉或行动,而不需要真正的逻辑。这是人类大脑与众不同的本质。
在与尼克的会面中,我现在意识到这个以客户为中心的圣杯活得很好。其神话般的假设在伊鲁实现了。尼克试图了解消费者需求和行为的实验给这位企业家带来了难以置信的成功,他对实现这一目标的专注和热情丝毫未减。
这篇文章起源于认知世界。
Zig-Zag //双流递归神经网络,具有交互式代码的双神经网络。[带 TF 的手动后撑]
GIF from this website
我从来没有双胞胎兄弟,但如果我有一个,这将是非常酷的。我们会有不同的想法,但彼此非常相似。这让我思考,这个概念是否也可以应用于神经网络?我想弄清楚。和往常一样,下面是我想为这篇文章实现的不同架构的列表。
案例 a:双流递归神经网络
案例 b:双流之字形递归神经网络
案例 c:双流混合递归神经网络
案例 d:非孪生(标准)神经网络
案例 e:孪生神经网络
请注意,这篇帖子只是为了娱乐,也是为了表达我的创意。因此不是面向结果的。
多流递归神经网络
Image from this paper
在写这篇文章时,我找到了几篇关于多流递归神经网络架构的论文。我想总的想法是,我们可以有两个(或三个)网络,而不是一个长短期记忆 (LSTM)或循环神经网络 (RNN)。下面是我在写这篇文章时发现的论文列表。
现在我想介绍一下我们将在本帖中使用的基础网络架构。
Case a: Dual RNN
红色方块,黑色方块 →流 1 RNN,流 2 RNN
粉色箭头 →隐藏状态,每个时间戳都被保留
绿色、粉色、黑色、蓝色箭头 →输入时间戳 0,1,2,3
蓝色矩形,箭头 →最终串接输出每个 RNN
黑色矩形 →卷积层(基于 所有卷积)
我真的希望三维图形有助于每个人的理解。(挺烂的 lol)。但主要思想是在卷积神经网络之前有某种多流 RNN,基本上就是这样。最后,我想提一下,对于不同的时间戳,我们要么向网络提供原始图像,要么提供增强图像。(我们将使用 CIFAR 10 数据集)
之字形递归神经网络
Case b: Dual Zig Zag RNN
白色、灰色箭头 →改变隐藏状态的方向
现在让我们引入一些不同的东西,就像上面看到的,而不是使用来自同一个流的前一个时间戳的隐藏状态。我们将改变所使用的隐藏状态的方向。(因此得名 zig zag。).与两个独立的 RNN 电视网相比,我希望每个电视网都能学会如何相互合作,以获得更好的性能。
最后,让我们看一下网络结构,其中我们结合了之字形结构以及直线前馈操作。
Case c: Dual Mix RNN
如上所述,这一次我们将结合 zig zag 结构以及原始的递归神经网络结构。(在从 2 时间戳到 3 时间戳的转换期间,我们将让网络使用它们自己的隐藏状态。)
结果:案例 a:双流递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
马上,我们可以注意到,这种类型的架构不适合图像分类任务。在训练结束时,我们只能达到 71%的训练图像准确率,而 64%的测试图像准确率。
结果:案例 b:双流之字形递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
我真的不知道对这个网络有什么期望,但它似乎与原来的网络没有明显的区别。以相似的(在测试图像上更差)准确度完成训练。
结果:案例 c:双流混合递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
最终类型的网络给出了相似的结果。然而,它能够胜过原来的网络以及 zig zag 网络。(按 0.003)。
孪生神经网络
Case d: Non Twin network
黑框 →卷积层
粉色箭头 →前馈运算
黄色框 →全局平均池和 Softmax
在看一下 Twin 网络之前,让我们先看看我们的基本网络。如上所述,我们的基本网络只是从全卷积网络的扩展,在末端增加了一个卷积层。(使总层数为 10。)现在让我们来看看 Twin Network 的架构。
Case e: Twin Network
黑盒 →孪生 1 的卷积层
红盒→ 孪生 2 的卷积层
粉色箭头 →前馈操作
→绿色箭头 →级联和前馈操作
弯曲箭头 →前馈操作
黄色框 →全局平均池和 Softmax
如上所述,与原始网络没有太大区别,但我们可以观察到的主要区别是,现在不是用一个 10 层网络来完成所有工作。我们有两个相互交织的较小的网络。
结果:案例 d:非孪生(标准)神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
很明显,网络正遭受过度拟合,我们可以通过测试集精度以及训练集精度来观察这一点。
如上所述,我们能够在测试集图像上实现 82%的准确率,但我们需要考虑到训练图像的准确率已经超过 95%的事实。(96%)
结果:案例 e:双神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
与标准的 10 层神经网络相比,这是一个明显的优势。然而,该模型仍然存在过度拟合的问题。有了更好的正则化技术,就有可能克服这个问题。
如上所述,我们能够在测试图像上实现相同的准确性,同时在训练图像上实现 89%的准确性。
互动代码
对于谷歌 Colab,你需要一个谷歌帐户来查看代码,而且你不能在谷歌 Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!同样为了透明,我在 github 上上传了所有的训练日志。
要访问案例的代码,请点击此处,要查看日志,请点击此处。
访问案例 b 的代码点击此处,查看日志点击此处。 要访问案例 c 的代码,单击此处,要查看日志,单击此处。
要访问案例 d 的代码,请单击她的 e,要查看日志,请单击此处。
要访问案例 e 的代码,请点击此处,要查看日志,请点击此处。
最后的话
我更喜欢不同网络相互协作的想法。在发这个帖子的时候,我反复地听“ 我的火焰——鲍比·考德威尔 ”。我只是想推荐给大家。
Video from RUMnWINE
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。
参考
- Matplotlib 样式库。(2018).tonysyu . github . io . 2018 年 6 月 11 日检索,来自https://tonysyu . github . io/raw _ content/matplotlib-style-gallery/gallery . html
- Matplotlib:有格调的美好剧情。(2016).Futurile.net。检索于 2018 年 6 月 11 日,来自http://www . futurile . net/2016/02/27/matplotlib-beautiful-plots-with-style/
- 我的爱人——鲍比·考德威尔。(2018).YouTube。检索于 2018 年 6 月 11 日,来自https://www.youtube.com/watch?v=3hK6IgvZ0CY
- NumPy . dtype—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 6 月 11 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . dtype . html
- 为什么 range(开始,e. (2018)。为什么 range(start,end)不包括 end?。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/4504662/why-does-rangestart-end-not-include-end
- 数组,I. (2018)。将元素插入 numpy 数组。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/21761256/insert-element-into-numpy-array
- NumPy . insert—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 6 月 11 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . insert . html
- [副本],第(2018)页。阻止 TensorFlow 访问 GPU?。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/44552585/prevent-tensor flow-from-access-the-GPU
- Gammulle,h .,Denman,s .,Sridharan,s .,& Fookes,C. (2017 年)。双流 LSTM:人体动作识别的深度融合框架。Arxiv.org。检索于 2018 年 6 月 11 日,来自 https://arxiv.org/abs/1704.01194
- 长短期记忆。(2018).En.wikipedia.org。检索于 2018 年 6 月 11 日,来自 https://en.wikipedia.org/wiki/Long_short-term_memory
- 递归神经网络。(2018).En.wikipedia.org。检索于 2018 年 6 月 11 日,来自https://en.wikipedia.org/wiki/Recurrent_neural_network
- [ ICLR 2015 ]追求简单:具有交互码的全卷积网。(2018).走向数据科学。检索于 2018 年 6 月 11 日,来自https://towardsdatascience . com/iclr-2015-努力简化-所有卷积网-交互式代码-手册-b4976e206760
- (2018).Isca-speech.org。检索于 2018 年 6 月 11 日,来自https://www . isca-speech . org/archive/inter seech _ 2015/papers/i15 _ 1413 . pdf
- m .布阿齐兹、m .莫奇德、r .杜福尔、利纳尔:s,g .,& De Mori,R. (2017 年)。用于多流分类的并行长短期记忆。Arxiv.org。检索于 2018 年 6 月 11 日,来自https://arxiv.org/abs/1702.03402
- CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 6 月 12 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
- dmlc/xgboost。(2018).GitHub。检索于 2018 年 6 月 12 日,来自https://github.com/dmlc/xgboost
僵尸和模型腐烂(带 ML 引擎+数据存储)
Don’t leave your models to rot into obscurity
所以你已经把你的机器学习模型部署到了云端,你的所有应用和服务都能够从中获取预测,太好了!你可以永远不去管那个模型去做它的事情…也许不会。大多数机器学习模型都在建模这个世界的一些东西,而这个世界是不断变化的。要么和它一起改变,要么被甩在后面!
什么是模型腐烂?
模型腐,数据腐,AI 腐,随便你怎么叫,都不好!假设我们已经建立了一个模型来预测僵尸是否友好。我们将它部署到云端,现在世界各地的应用程序都在使用它来帮助公众了解他们可以与哪些僵尸交朋友而不会被咬。令人惊讶的是,人们似乎对你的模型非常满意,但是几个月后,你开始收到人们发来的愤怒的电子邮件,他们说你的模型很糟糕!原来是丧尸种群变异了!现在你的模式是过时了,还是烂了!您需要更新您的模型,更好的是,添加一种方法来跟踪您的模型的腐烂状态,以便这种情况不会再次发生。
This is an example of a very sudden case of model rot!
改变的不仅仅是僵尸
当然,虚构的生物可以改变,但金融市场、居住环境、交通模式、天气模式、人们写微博的方式、猫的样子也可以改变!好吧,也许猫永远看起来像猫(虽然给它几百万年,也许不是)。关键是,取决于你的模型预测的东西会影响它们腐烂的速度。
同样重要的是要注意到,你预测的东西不需要为了你的模型腐烂而改变。也许您用来捕获输入数据的传感器发生了变化。当部署模型时,任何对模型性能产生负面影响的东西都会导致模型腐烂,要么移除导致性能降低的东西,要么更新模型(很可能是后一种选择)。
让我们与模型腐烂作斗争(用 ML 引擎+数据存储)
有一个僵尸爆发,但它并不像电影会让你相信的那样可怕。它们是相当缓慢移动的生物,它们中的许多只是在寻找人类朋友,但有些不是。为了帮助人们正确选择僵尸朋友,我们开发了一个模型,根据几个特征来预测僵尸是否友好:
我们使用 Scikit-Learn 构建了一个决策树分类器模型。查看 笔记本此处 查看做这件事的确切代码。
现在的计划是将我们的模型部署到 ML 引擎,它将在云上为我们托管我们的模型。( 在笔记本 中查看我们如何使用 gcloud 命令做到这一点)
首先,我们将把我们的模型放到云存储中:
gsutil cp model.joblib gs://your-storage-bucket/v1/model.joblib
然后创建一个新的 ML 引擎模型,你可以使用 Google Cloud 控制台 UI 或使用 gcloud 命令( ,你可以在这里看到在笔记本 )来完成:
ML Engine UI
然后,我们将决策树模型部署为版本 1:
Creating a new version of your model using the Cloud Console UI
为了让应用程序更容易从我们的模型中获取预测,我们将使用云函数创建一个公共端点。你可以在我和我的同事 Sara Robinson 写的这篇博客文章中读到更多关于如何做到这一点的内容。
here’s the current architecture of our system
好了,我们的模型已经部署好了,应用程序可以很容易地从中获取预测!现在,使用数据存储监视模型 rot!
数据存储?
想象一下,在云中有一个地方,可以快速存储数百万个 python 字典,然后查询它们(也很快)。那就是数据存储,一个在谷歌云平台上完全托管的 NoSQL 数据库。如果您以前有过使用数据库的经验,那么您可能习惯于仔细计划在表中存储什么样的数据结构,然后体验创建迁移脚本来更新数据库结构的痛苦。对于数据存储来说,不要胡说八道,要存储以下数据:
{
"name": "Alex"
"occupation": "Zombr trainer"
}
然后这样做(使用 python 客户端库):
# create new entity/row
new_person = datastore.Entity(key=client.key('person'))new_person['name'] = 'Alex'
new_person['occupation'] = 'Zombr trainer'# save to datastore
client.put(new_person)
哦,等等,你想开始储存人们的 githubs 和 twitters?去做吧:
# create new entity/row
new_person = datastore.Entity(key=client.key('person'))new_person['name'] = 'Zack'
new_person['occupation'] = 'Zombr CEO'
new_person['github'] = '[https://github.com/zackakil](https://github.com/zackakil)'
new_person['twitter'] = '[@zackakil](https://twitter.com/zackakil)'# save to datastore
client.put(new_person)
数据存储会说“谢谢”:
DataStore’s UI
使用数据存储收集模型反馈
我们将要收集的反馈数据如下所示:
{
"model": "v1",
"prediction input": [2.1, 1.4, 5.3, 8.0],
"prediction output": 1,
"was correct": False,
"time": "23-10-2018,14:45:23"
}
这些数据将告诉我们 ML 引擎上的哪个版本的模型用于生成预测(模型)、预测的输入数据是什么(预测输入)、模型做出的预测是什么(预测输出)、预测是否正确(来自用户的实际反馈)(是正确的),以及反馈提交的时间(时间)。
我们将再次使用云函数来创建另一个 web API 端点,这次是为了接收反馈数据并将其存储在数据存储中:
don’t forget to add “google-cloud-datastore” to the Cloud Function’s requirements.txt
现在,我们的系统架构如下所示:
the new architecture of our system
客户端应用程序只需要以一种直观的方式添加用户提交他们的反馈。在我们的例子中,它可以是一个简单的“拇指向上或拇指向下”的提示,在用户看到一个预测之后:
You may have come across feedback prompts like this before
创造性地收集反馈
很多时候,你可以推断出关于你的模型的反馈,而不是像我在 Zombr 界面**中所做的那样,明确地向用户请求反馈。**例如,如果我们看到用户在预测后立即停止使用应用程序,我们可以使用该数据来指示错误的预测😬。
回到现实中,狗收养机构可能有一个新主人的推荐系统。模型的成功采用率是它自己的性能反馈。如果代理商突然发现系统成功匹配的次数比平时少了很多,那么他们就可以用这个来表明模型已经损坏,可能需要更新。
反馈收集完毕,现在做什么?
现在我们可以分析反馈数据。对于任何数据分析工作,我默认使用 Jupyter 笔记本。
点击此处查看我如何从数据存储中获取数据并分析反馈的完整记录。
从数据存储中获取数据的要点是,首先安装数据存储 python 客户端库:
pip install google-cloud-datastore
然后,您可以导入它并连接到数据存储:
**from** google.cloud **import** datastore*# connect to DataStore*
**client = datastore.Client('your project id')***# query for all prediction-feedback items*
**query = client.query(kind='prediction-feedback')**
*# order by the time field*
**query.order = ['time']**
*# fetch the items
# (returns an iterator so we will empty it into a list)*
**data = list(query.fetch())**
该库自动将所有数据转换成 python 字典:
print(data[0]['was correct'])
print(data[0]['model'])
print(data[0]['time'])
print(data[0]['input data'])>>> True
>>> v1
>>> 2018-10-22 14:21:02.199917+00:00
>>> [-0.8300105114555543, 0.3990742221560673, 1.9084475908892906, 0.3804372006233603]
由于我们在反馈数据中保存了一个“was correct”布尔值,我们可以通过查看该字段的“**true”**比率,轻松计算出反馈模型的准确性:
number_of_items = len(data)
number_of_was_correct = len([d **for** d **in** data **if** d['was correct']])print(number_of_was_correct / number_of_items)>>> 0.84
0.84 并不算太糟糕,因为我们第一次训练我们的模型,其得分约为 0.9,但这是使用所有反馈数据一起计算的。如果我们在数据的滑动窗口上进行同样的精度计算并绘制出来会怎么样?(你可以在 分析笔记本 里看到这么做的代码)
对于最近的反馈,这是一个很大的性能下降。
我们应该进一步调查。让我们比较高精度和低精度时的输入数据(即僵尸特征数据)。好在我们在反馈中也收集了这些信息:
blue = correct prediction, red = incorrect prediction
blue = correct prediction, red = incorrect prediction
啊,数据看起来完全不一样。我猜僵尸种群已经变异了!我们需要尽快用新数据重新训练我们的模型。好在我们收集了反馈中的输入数据,我们可以将其用作新的训练数据(使我们不必手动收集新数据)。我们可以使用有关模型所做预测(“预测”字段)和用户反馈(“正确”字段)的信息来推断新训练数据的正确预测标签:
在反馈分析笔记本的底部查看这段代码是如何使用的。
有了这个新的数据集,我们可以训练一个新版本的模型。这是与训练初始模型相同的过程,但是使用不同的数据集(参见笔记本),然后将其作为模型的新版本上传到 ML 引擎。
一旦它在 ML 引擎上,您可以将其设置为僵尸模型的新默认版本,以便您的所有客户端将自动开始将其预测请求发送到新模型,或者您可以指示您的客户端在其预测请求中指定版本名称:
setting v2 as the default model
如果您将默认模型设置为 v2,那么所有对“僵尸”的预测请求都将转到 v2 版本:
PREDICTION REQUEST BODY:
{
"instances":[[2.0, 3.4, 5.1, 1.0]],
"model":"zombies"
}
或者你的客户可以说得更具体一些:
PREDICTION REQUEST BODY:
{
"instances":[[2.0, 3.4, 5.1, 1.0]],
"model":"zombies/versions/v2"
}
完成所有这些后,您可以坐下来,在收集到更多反馈后运行相同的分析:
seems like people find our v2 model helpful
希望这已经给了您一些关于如何监控您部署的模型模型腐烂的想法。使用的所有代码都可以在 github repo 中找到:
🧟资源反击腐烂你部署的机器学习模型。预测僵尸!…
github.com](https://github.com/ZackAkil/rotting-zombie-model)
如果您对监控模型腐烂有任何想法或问题,请联系我。