TowardsDataScience-博客中文翻译-2020-二-

TowardsDataScience 博客中文翻译 2020(二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

你应该阅读的 12 篇论文,以了解深度学习时代的对象检测

原文:https://towardsdatascience.com/12-papers-you-should-read-to-understand-object-detection-in-the-deep-learning-era-3390d4a28891?source=collection_archive---------1-----------------------

免费图片来自 Unsplash 。摄影来自乔安娜·科辛斯卡,并由本人编辑。

作为“您应该阅读的论文”系列的第二篇文章,我们将回顾计算机视觉研究中一个更困难的领域:对象检测的历史和一些最近的发展。在深度学习时代之前,像 HOG 和特征金字塔这样的手工制作的特征被普遍用于捕捉图像中的定位信号。然而,这些方法通常不能很好地扩展到一般的目标检测,因此大多数应用仅限于人脸或行人检测。借助深度学习的力量,我们可以训练网络来学习捕捉哪些特征,以及预测对象的坐标。这最终导致了基于视觉感知的应用的繁荣,如商用人脸识别系统和自动驾驶汽车。在这篇文章中,我为想学习物体检测的新人挑选了 12 篇必读论文。尽管构建对象检测系统最具挑战性的部分隐藏在实现细节中,但是阅读这些论文仍然可以让您很好地从高层次理解这些想法的来源,以及对象检测在未来将如何发展。

作为阅读本文的先决条件,您需要了解卷积神经网络的基本思想和常用的优化方法,如带反向传播的梯度下降。也强烈推荐阅读我之前的文章《你应该阅读的 10 篇论文了解深度学习时代的图像分类》首先是因为很多很酷的物体检测想法都源于一个更基础的图像分类研究。

2013 年:暴饮暴食

OverFeat:使用卷积网络的综合识别、定位和检测

出自“《over fat:利用卷积网络的综合识别、定位和检测》

受 AlexNet 在 2012 年 ImageNet 比赛中的早期成功的启发,基于 CNN 的特征提取击败了所有手工制作的特征提取器,OverFeat 很快将 CNN 引入了对象检测领域。这个想法非常直接:如果我们可以使用 CNN 对一幅图像进行分类,那么用不同大小的窗口贪婪地滚动整个图像,并尝试使用 CNN 对它们逐一进行回归和分类,怎么样?这利用了 CNN 用于特征提取和分类的能力,并且还通过预定义的滑动窗口绕过了硬区域提议问题。此外,由于附近的卷积核可以共享部分计算结果,因此没有必要为重叠区域计算卷积,从而大大降低了成本。OverFeat 是一级物体探测器的先驱。它试图在同一个 CNN 中结合特征提取、位置回归和区域分类。不幸的是,由于使用的先验知识较少,这种一步方法的准确性相对较差。因此,OverFeat 未能引领一阶段探测器研究的热潮,直到两年后一个更优雅的解决方案问世。

2013 年:美国有线电视新闻网

用于精确目标检测和分割的基于区域的卷积网络

同样是 2013 年提出的,R-CNN 和 OverFeat 相比有点晚。然而,这种基于区域的方法最终以其两阶段框架,即区域提议阶段和区域分类和细化阶段,导致了一波大的对象检测研究。

基于区域的卷积网络进行精确的对象检测和分割

在上图中,R-CNN 首先使用一种称为选择性搜索的技术从输入图像中提取潜在的感兴趣区域。选择性搜索并不真正试图理解前景对象,相反,它通过依赖一种启发式方法对相似的像素进行分组:相似的像素通常属于同一对象。所以选择性搜索的结果有非常高的概率包含有意义的东西。接下来,R-CNN 将这些区域提议扭曲成具有一些填充的固定大小的图像,并将这些图像馈送到网络的第二级,以进行更细粒度的识别。与那些使用选择性搜索的旧方法不同,R-CNN 在第二阶段用 CNN 代替 HOG 来从所有区域提议中提取特征。这种方法的一个警告是,许多地区提案并不是真正的完整对象,因此 R-CNN 不仅需要学会对正确的类别进行分类,还需要学会拒绝负面的类别。为解决这一问题,R-CNN 将所有 IoU 重叠≥ 0.5 的地区提案视为积极提案,其余视为消极提案。

来自选择性搜索的区域提议高度依赖于相似性假设,因此它只能提供位置的粗略估计。为了进一步提高定位精度,R-CNN 借鉴了“用于对象检测的深度神经网络”(又名 DetectorNet)的思想,引入了额外的包围盒回归来预测盒子的中心坐标、宽度和高度。这种回归器广泛应用于未来的目标探测器中。

然而,像 R-CNN 这样的两级检测器有两个大问题:1)它不是完全卷积的,因为选择性搜索不是 E2E 可训练的。2)与其它单阶段检测器(如 OverFeat)相比,区域建议阶段通常非常慢,并且单独运行每个区域建议会使其更慢。稍后,我们将看到 R-CNN 如何随着时间的推移发展来解决这两个问题。

2015:快速 R-CNN

快速 R-CNN

来自"快速 R-CNN "

R-CNN 的快速跟进是减少多个区域提议上的重复卷积。由于这些区域提议都来自一幅图像,自然要通过在整个图像上运行一次 CNN 来改进 R-CNN,并在许多区域提议之间共享计算。然而,不同的区域提议具有不同的大小,如果我们使用相同的 CNN 特征提取器,这也导致不同的输出特征图大小。这些具有不同大小的要素地图将阻止我们使用完全连接的图层进行进一步分类和回归,因为 FC 图层仅适用于固定大小的输入。

幸运的是,一篇名为“用于视觉识别的深度卷积网络中的空间金字塔池”的论文已经解决了 FC 层的动态规模问题。在 SPPNet 中,在卷积层和 FC 层之间引入了特征金字塔池,以创建特征向量的词袋样式。该矢量具有固定的大小,并对不同尺度的特征进行编码,因此我们的卷积层现在可以将任何大小的图像作为输入,而不用担心 FC 层的不兼容性。受此启发,Fast R-CNN 提出了一个类似的层,称为 ROI Pooling 层。该池图层将不同大小的要素地图缩减采样为固定大小的矢量。通过这样做,我们现在可以使用相同的 FC 层进行分类和盒回归,无论 ROI 是大是小。

通过共享特征提取器和比例不变 ROI 池层,快速 R-CNN 可以达到类似的定位精度,但训练速度快 10 ~ 20 倍,推理速度快 100 ~ 200 倍。接近实时的推理和用于检测部分的更简单的 E2E 训练协议使得快速 R-CNN 也成为业内的流行选择。

你只看一次:统一、实时的物体检测

这种对整个图像的密集预测会导致计算成本方面的问题,所以 YOLO 从 GooLeNet 中提取了瓶颈结构来避免这个问题。YOLO 的另一个问题是,两个对象可能会落入同一个粗网格单元中,因此它不能很好地处理像一群鸟这样的小对象。尽管精确度较低,但 YOLO 的直接设计和实时推理能力使一阶段对象检测在研究中再次流行,也是行业的首选解决方案。

2015 年:更快的 R-CNN

更快的 R-CNN:用区域提议网络实现实时目标检测

正如我们在上面介绍的,在 2015 年初,Ross Girshick 通过对提议的区域使用共享特征提取器,提出了一种称为快速 R-CNN 的 R-CNN 的改进版本。仅仅几个月后,罗斯和他的团队再次带来了另一项改进。这个新的网络更快的 R-CNN 不仅比以前的版本更快,而且标志着用深度学习方法进行对象检测的里程碑。

从" 更快的 R-CNN:用区域建议网络实现实时目标检测

对于快速 R-CNN,网络的唯一非卷积部分是选择性搜索区域提议。截至 2015 年,研究人员开始意识到深度神经网络是如此神奇,它可以学习任何给定足够数据的东西。那么,有没有可能也训练一个神经网络来建议区域,而不是依赖于启发式和手工制作的方法,如选择性搜索?更快的 R-CNN 遵循这一方向和思路,成功创建了地区提案网(RPN)。简单来说,RPN 就是一个 CNN,它以一个图像为输入,输出一组矩形的物体提议,每个提议都有一个客观分数。该报最初使用的是 VGG,但后来像 ResNet 这样的主干网变得更加普及。为了生成区域提议,在 CNN 特征地图输出上应用 3×3 滑动窗口,以生成每个位置的 2 个分数(前景和背景)和 4 个坐标。实际上,这个滑动窗口是用 3×3 卷积核和 1×1 卷积核实现的。

虽然滑动窗口有固定的大小,但我们的对象可能会以不同的比例出现。因此,更快的 R-CNN 引入了一种叫做锚箱的技术。锚定框是预先定义的具有不同纵横比和大小但共享相同中心位置的先前框。在更快的 R-CNN 中,每个滑动窗口位置有 k=9 个锚,每个锚覆盖 3 个比例的 3 个纵横比。这些在不同尺度上重复的锚盒给网络带来了良好的平移不变性和尺度不变性特征,同时共享相同特征图的输出。注意,边界框回归将从这些锚框而不是整个图像来计算。

从" 更快的 R-CNN:用区域建议网络实现实时目标检测

到目前为止,我们讨论了新的区域提议网络来取代旧的选择性搜索区域提议。为了进行最终检测,Fast R-CNN 使用来自 Fast R-CNN 的相同检测头来进行分类和细粒度定位。还记得 Fast R-CNN 也是用共享的 CNN 特征提取器吗?现在 RPN 本身也是一个特征提取 CNN,我们可以像上图一样只和探测头分享。这种共享设计并没有带来一些麻烦。如果我们一起训练 RPN 和快速 R-CNN 检测器,我们会将 RPN 建议视为 ROI pooling 的恒定输入,并且不可避免地忽略 RPN 的包围盒建议的梯度。一次走动被称为交替训练,你轮流训练 RPN 和快速 R-CNN。在后来的一篇论文“通过多任务网络级联的实例感知语义分割”中,我们可以看到 ROI 池层也可以变得可区分。

2015 年:YOLO v1

您只需查看一次:统一的实时对象检测

虽然 R-CNN 系列在研究社区对两阶段对象检测进行了大肆宣传,但其复杂的实现给维护它的工程师带来了许多头痛。物体检测需要这么繁琐吗?如果我们愿意牺牲一点准确性,我们能换来更快的速度吗?带着这些问题,Joseph Redmon 在 fast R-CNN 提交后仅四天就向 arxiv.org 提交了一个名为 YOLO 的网络,并最终在 OverFeat 首次亮相两年后将人气带回了一阶段物体检测。

你只看一次:统一、实时的物体检测

与 R-CNN 不同,YOLO 决定在同一个 CNN 中同时处理区域提议和区域分类。换句话说,它将对象检测视为回归问题,而不是依赖于区域建议的分类问题。总的想法是将输入分割成 SxS 网格,并且如果对象中心落入每个单元中,则让每个单元直接回归边界框位置和置信度得分。因为对象可能有不同的大小,每个单元将有多个边界框回归量。在训练过程中,具有最高 IOU 的回归变量将被分配与真实标签进行比较,因此同一位置的回归变量将随着时间的推移学习处理不同的尺度。同时,每个单元也将预测 C 类概率,条件是网格单元包含对象(高置信度得分)。这种方法后来被称为密集预测,因为 YOLO 试图预测图像中所有可能位置的类别和边界框。相比之下,R-CNN 依赖于区域提议来过滤掉背景区域,因此最终的预测要稀疏得多。

2015 年:固态硬盘

SSD:单次多盒探测器

YOLO v1 展示了一阶段检测的潜力,但两阶段检测的性能差距仍然明显。在 YOLO v1 中,多个对象可以被分配给同一个网格单元。当检测小物体时,这是一个巨大的挑战,并且为了将一级检测器的性能提高到与两级检测器相当,这成为一个需要解决的关键问题。SSD 就是这样一个挑战者,从三个角度攻击这个问题。

来自“ SSD:单次多盒探测器**

首先,来自更快的 R-CNN 的锚箱技术可以缓解这个问题。同一区域中的对象通常具有不同的纵横比才可见。引入锚盒不仅增加了每个单元要检测的对象数量,还帮助网络更好地区分具有这种纵横比假设的重叠小对象。

来自 SSD:单次多盒探测器

SSD 通过在检测之前聚合多尺度特征,在这条路上走得更远。这是一种非常常见的方法,可以在 CNN 中提取细粒度的局部特征,同时保留粗略的全局特征。比如 CNN 语义分割的开创者 FCN,也从多个层面融合特征,细化分割边界。此外,多尺度特征聚合可以很容易地在所有常见的分类网络上执行,因此用另一个网络替换主干非常方便。

最后,SSD 利用了大量的数据增强,尤其是针对小对象的数据增强。例如,在随机裁剪之前,图像被随机扩展到大得多的尺寸,这给训练数据带来了缩小效果,以模拟小对象。此外,大包围盒通常很容易学习。为了避免这些简单的例子支配损失,SSD 采用了硬负挖掘技术来为每个锚盒挑选具有最高损失的例子。

2016 年:FPN

用于目标检测的特征金字塔网络

随着 fast-RCNN、YOLO 和 SSD 在 2015 年的推出,似乎一个物体探测器的总体结构已经确定。研究人员开始着眼于改善这些网络的各个部分。特征金字塔网络是通过使用来自不同层的特征形成特征金字塔来改进检测头的尝试。这种特征金字塔的想法在计算机视觉研究中并不新奇。当特征仍然是手动设计的时候,特征金字塔已经是识别不同尺度模式的非常有效的方法。在深度学习中使用特征金字塔也不是一个新想法:SSPNet、FCN 和 SSD 都证明了在分类前聚合多层特征的好处。然而,如何在 RPN 和基于区域的检测器之间共享特征金字塔仍有待确定。

特征金字塔网络进行物体检测

首先,要使用如上图所示的 FPN 结构重建 RPN,我们需要一个在多个不同比例的要素输出上运行的区域方案。此外,我们现在每个位置只需要 3 个不同纵横比的锚点,因为不同大小的对象将由不同级别的特征金字塔处理。接下来,为了在快速 R-CNN 检测器中使用 FPN 结构,我们还需要对其进行调整,以在多个尺度的特征图上进行检测。由于区域提案也可能有不同的规模,我们也应该在 FPN 的相应级别使用它们。简而言之,如果更快的 R-CNN 是一对在一个尺度上运行的 RPN 和基于区域的检测器,FPN 将其转换为在不同尺度上运行的多个并行分支,并最终从所有分支收集最终结果。

2016 年:YOLO v2

更好、更快、更强

当明凯·何、罗斯·吉斯克和他们的团队不断改进他们的两级 R-CNN 探测器时,另一方面,约瑟夫·雷德蒙也在忙于改进他的一级 YOLO 探测器。最初版本的 YOLO 有许多缺点:基于粗网格的预测带来了较低的定位精度,每个网格单元两个比例不可知的回归器也使得识别小包装对象变得困难。幸运的是,我们在 2015 年在许多计算机视觉领域看到了太多伟大的创新。YOLO v2 只需要找到一种方法来整合它们,以变得更好、更快、更强。以下是修改的一些亮点:

  • YOLO v2 从一篇名为“批处理规范化:通过减少内部协变量转移来加速深度网络训练”的论文中添加了批处理规范化层。**

锚箱来自“ YOLO9000:更好、更快、更强

  • 就像 SSD 一样,YOLO v2 也为边界框回归引入了更快的 R-CNN 的锚框思想。但是 YOLO v2 为它的锚盒做了一些定制。YOLOv2 不是预测锚定框的偏移,而是将对象中心回归 txty 约束在负责的网格单元内,以稳定早期训练。此外,锚的大小由目标数据集的 K-means 聚类来确定,以更好地与对象形状对齐。
  • 一种称为暗网的新型骨干网络用于特征提取。这是受“网络中的网络”和 GooLeNet 的瓶颈结构的启发。**
  • 为了提高对小物体的检测,YOLO v2 增加了一个穿透层来合并早期层的特征。这部分可以看做是 SSD 的简化版。
  • 最后但同样重要的是,Joseph 意识到输入分辨率是小物体检测的银弹。它不仅将主干网的输入从 224x224 增加了一倍,达到 448x448,而且还发明了一种多尺度训练模式,在训练的不同阶段采用不同的输入分辨率。

请注意,YOLO v2 还试验了一个在 9000 类分层数据集上训练的版本,这也代表了在对象检测器中多标签分类的早期尝试。

2017 年:RetinaNet

密集物体探测的聚焦损失

为了理解为什么一级检测器通常不如两级检测器,RetinaNet 从一级检测器的密集预测中研究了前景-背景类别不平衡问题。以 YOLO 为例,它试图同时预测所有可能位置的类和包围盒,因此在训练期间大多数输出都与负类匹配。SSD 通过在线硬例挖掘解决了这个问题。在训练的早期阶段,YOLO 使用客观性分数来隐式地训练前景分类器。RetinaNet 认为他们都没有得到问题的关键,所以它发明了一个新的损失函数,称为焦点损失,以帮助网络了解什么是重要的。

对密集物体进行焦损检测**

焦点损失给交叉熵损失增加了一个幂γ(他们称之为聚焦参数)。自然地,随着置信度得分变得更高,损失值将变得比正常的交叉熵低得多。α参数用于平衡这种聚焦效果。

焦散密集物体检测

这个想法很简单,连一个小学生都能理解。因此,为了进一步证明他们的工作,他们修改了他们之前提出的 FPN 模型,并创造了一种新的一级探测器,称为 RetinaNet。它由一个 ResNet 主干,一个 FPN 检测颈以引导不同尺度的特征,以及两个用于分类和作为检测头的盒回归的子网组成。与 SSD 和 YOLO v3 类似,RetinaNet 使用锚盒来覆盖各种规模和纵横比的目标。

有点跑题了,RetinaNet 使用了 ResNeXT-101 和 800 输入分辨率变体的 COCO 精度来对比 YOLO v2,后者只有轻量级的 Darknet-19 主干和 448 输入分辨率。这种不真诚显示了团队对获得更好的基准测试结果的重视,而不是解决一个实际问题,如速度-精度的权衡。这可能是 RetinaNet 在发布后没有起飞的部分原因。

2018: YOLO v3

YOLOv3:增量改进

YOLO v3 是官方 YOLO 系列的最后一个版本。遵循 YOLO v2 的传统,YOLO v3 从以前的研究中借鉴了更多的想法,得到了一个像怪物一样令人难以置信的强大的一级探测器。YOLO v3 很好地平衡了速度、准确性和实现复杂性。由于速度快、组件简单,它在业界非常受欢迎。如果你感兴趣,我在之前的文章《深入了解 YOLO v3:初学者指南》中对 YOLO v3 的工作原理做了非常详细的解释。

来自“深入 YOLO v3:初学者指南

来自“深入 YOLO v3:初学者指南

简单地说,YOLO v3 的成功来自其更强大的骨干特征提取器和一个类似 RetinaNet 的 FPN 颈检测头。新的主干网络 Darknet-53 利用 ResNet 的 skip 连接实现了与 ResNet-50 相当但更快的精度。此外,YOLO v3 抛弃了 v2 的穿越层,完全接受了 FPN 的多尺度预测设计。自此,YOLO v3 终于扭转了人们对其处理小物件时性能不佳的印象。

此外,还有一些关于 YOLO v3 的有趣事实。它剖析了 COCO mAP 0.5:0.95 度量,并且还证明了当使用条件密集预测时焦点损失的无用性。作者约瑟夫甚至决定一年后退出整个计算机视觉研究,因为他担心军事用途。

2019:以物为点

尽管近年来图像分类领域变得不那么活跃,但目标检测的研究还远未成熟。2018 年,一篇名为“CornerNet:将物体检测为成对关键点”的论文为检测器训练提供了一个新的视角。既然准备锚箱目标是一件相当繁琐的工作,那么真的有必要用它作为先验吗?这种抛弃锚箱的新趋势被称为“无锚”物体检测。

来自"用于人体姿态估计的堆叠沙漏网络

受沙漏网络中热图用于人体姿态估计的启发,CornerNet 使用由盒角生成的热图来监督包围盒回归。要了解更多关于如何在沙漏网络中使用热图,你可以阅读我以前的文章“使用堆叠沙漏网络和张量流进行人体姿态估计”。

的物体为点

作为点的对象,又名 CenterNet,更进了一步。它使用热图峰值来表示对象中心,网络将直接从这些盒中心回归盒宽度和高度。本质上,CenterNet 使用每个像素作为网格单元。利用高斯分布热图,与先前试图直接回归边界框大小的尝试相比,训练也更容易收敛。

去除锚箱还有另一个有益的副作用。之前我们是靠主播框和地面真相框之间的 IOU(比如> 0.7)来分配训练目标的。通过这样做,几个相邻的锚可能都被分配了同一对象的正目标。网络也将学习预测同一物体的多个阳性框。解决这个问题的常用方法是使用一种称为非最大抑制(NMS)的技术。这是一种贪婪的算法,用来过滤掉靠得太近的盒子。现在锚点已经消失了,我们在热图中每个物体只有一个峰值,没有必要再使用 NMS 了。由于 NMS 有时难以实现且运行缓慢,所以对于在各种资源有限的环境中运行的应用程序来说,摆脱 NMS 是一个很大的好处。

2019 年:效率检测

EfficientDet:可扩展且高效的对象检测

出自"【Efficient det:可扩展且高效的对象检测 "

在最近的 CVPR 20 中,EfficientDet 向我们展示了对象检测领域的一些更令人兴奋的进展。FPN 结构已被证明是提高不同尺度目标检测网络性能的有力技术。著名的检测网络,如 RetinaNet 和 YOLO v3,都在盒回归和分类之前采用了 FPN 颈。后来,NAS-FPN 和 PANet(请参阅阅读更多章节)都证明了一个普通的多层 FPN 结构可能受益于更多的设计优化。EfficientDet 继续在这个方向上探索,最终创造了一种叫做 BiFPN 的新颈。基本上,BiFPN 的特点是额外的跨层连接,以鼓励特性的来回聚合。为了证明网络的效率部分,这个 BiFPN 还从最初的 PANet 设计中删除了一些不太有用的连接。对 FPN 结构的另一个创新改进是权重特征融合。BiFPN 为特征聚合添加了额外的可学习权重,以便网络可以学习不同分支的重要性。

出自“【Efficient det:可扩展且高效的对象检测

此外,就像我们在图像分类网络 EfficientNet 中看到的一样,EfficientDet 也引入了一种扩展对象检测网络的原则方法。上式中的φ参数控制 BiFPN 颈部和探测头的宽度(通道)和深度(层数)。

出自“:Efficient det:可扩展且高效的对象检测

这个新参数导致从 D0 到 D7 的 8 个不同的 EfficientDet 变量。轻型 D0 变体可以实现与 YOLO v3 类似的精度,同时具有少得多的触发器。一个负载沉重的 D7 变体,具有可怕的 1536x1536 输入,在 COCO 上甚至可以达到 53.7 AP,让所有其他竞争者相形见绌。

阅读更多

从 R-CNN,YOLO 到最近的 CenterNet 和 EfficientDet,我们见证了深度学习时代对象检测研究的大多数重大创新。除了上面的论文,我还提供了一个附加论文的列表,供你继续阅读以获得更深入的理解。它们或者为目标检测提供了不同的视角,或者用更强大的功能扩展了这一领域。

2009 年:DPM

基于模型的有区别训练的物体检测

通过为每个可变形部分匹配许多 HOG 特征,DPM 是深度学习时代之前最有效的对象检测模型之一。以行人检测为例,它采用星型结构,先识别出一般的人模式,再用不同的子滤波器识别出部分,计算出一个总得分。即使在今天,在我们从 HOG 特征切换到 CNN 特征之后,识别具有可变形部分的物体的想法仍然很受欢迎。

2012 年:选择性搜索

目标识别的选择性搜索

和 DPM 一样,选择性搜索也不是深度学习时代的产物。然而,这种方法结合了许多经典的计算机视觉方法,也用于早期的 R-CNN 检测器。选择性搜索的核心思想受到语义分割的启发,语义分割是通过相似性对像素进行分组。选择性搜索使用不同的相似性标准,如颜色空间和基于 SIFT 的纹理,以迭代方式将相似区域合并在一起。并且这些合并的区域充当前景预测,随后是用于对象识别的 SVM 分类器。

2016 年:FCN

R-FCN:基于区域的全卷积网络的目标检测

更快的 R-CNN 最终将 RPN 和 ROI 特征提取结合起来,大大提高了速度。然而,对于每个区域建议,我们仍然需要完全连接的层来分别计算类和边界框。如果我们有 300 个 ROI,我们需要重复 300 次,这也是一级和两级检测器之间主要速度差异的来源。R-FCN 从 FCN 那里借鉴了语义分割的思想,但 R-FCN 计算的不是类别掩码,而是一个积极的敏感得分图。这个图会预测物体在每个位置出现的概率,所有位置会投票(平均)决定最终的类和包围盒。此外,R-FCN 还在其 ResNet 主干中使用了 atrous 卷积,这是最初在 DeepLab 语义分割网络中提出的。要了解什么是 atrous 卷积,请看我之前的文章《见证语义分割的进展:从 V1 到 V3+ 的 DeepLab 系列》。

2017:软-NMS

用一行代码改进对象检测

非最大值抑制(NMS)广泛用于基于锚点的对象检测网络,以减少附近的重复肯定建议。更具体地说,如果候选框具有更高的 IOU,NMS 迭代地消除候选框,并得到更有把握的候选框。当两个具有相同类的对象彼此非常接近时,这可能会导致一些意外的行为。软 NMS 做了一个小的改变,仅用一个参数缩小重叠候选框的置信度得分。当调整本地化性能时,这个缩放参数给我们更多的控制,并且当还需要高召回率时,也导致更好的精度。

2017:级联 R-CNN

级联 R-CNN:探索高质量目标检测

当 FPN 探索如何设计一个更好的 R-CNN 颈以使用骨干功能级联 R-CNN 时,调查了一个重新设计的 R-CNN 分类和回归头。潜在的假设简单而深刻:我们在准备阳性目标时使用的 IOU 标准越高,网络将学习做出的假阳性预测就越少。然而,我们不能简单地将这样的 IOU 阈值从常用的 0.5 提高到更积极的 0.7,因为这也可能导致培训期间出现更多压倒性的负面例子。级联 R-CNN 的解决方案是将多个探测头链接在一起,每个探测头将依赖于来自前一个探测头的包围盒提议。只有第一个检测头将使用原始的 RPN 建议。这有效地模拟了后面磁头的 IOU 阈值的增加。

2017:面具 R-CNN

屏蔽 R-CNN

Mask R-CNN 不是一个典型的对象检测网络。它旨在解决一个具有挑战性的实例分割任务,即,为场景中的每个对象创建一个遮罩。然而,Mask R-CNN 显示了对更快的 R-CNN 框架的巨大扩展,并且也反过来启发了对象检测研究。主要思想是在 ROI 合并之后添加二进制掩模预测分支,以及现有的边界框和分类分支。此外,为了解决原始 ROI 池层的量化误差,Mask R-CNN 还提出了一种新的 ROI Align 层,该层在遮光罩下使用双线性图像重采样。不出所料,多任务训练(分割+检测)和新的 ROI Align 层都有助于对边界框基准进行一些改进。

2018 年:帕内特

用于实例分割的路径聚合网络

实例分割与目标检测有着密切的关系,因此一个新的实例分割网络往往也能间接有利于目标检测的研究。PANet 旨在通过在原来的自上而下路径之后增加一个额外的自下而上路径来促进 R-CNN 面具 FPN 颈部的信息流。为了形象化这种变化,我们在原始的 FPN 颈中有一个↑↓结构,PANet 在汇集来自多个图层的要素之前使它更像一个↑↓结构。此外,PANet 没有为每个要素图层创建单独的池,而是在 Mask R-CNN 的 ROIAlign 之后添加了一个“自适应要素池”图层,以合并(基于元素的最大和)多尺度要素。

2019 年:NAS-FPN

NAS-FPN:学习对象检测的可扩展特征金字塔结构

PANet 在适应 FPN 结构方面的成功引起了一组 NAS 研究人员的注意。他们使用了来自图像分类网络 NASNet 的类似强化学习方法,并专注于搜索合并细胞的最佳组合。在这里,合并像元是将任意两个输入要素图层合并为一个输出要素图层的 FPN 的基本构建块。最终结果证明了 FPN 可以进一步优化的想法,但复杂的计算机搜索结构让人类难以理解。

结论

目标检测仍然是一个活跃的研究领域。尽管像 R-CNN 这样的两级检测器和像 YOLO 这样的一级检测器很好地塑造了该领域的总体前景,但我们最好的检测器仍然远远没有达到基准指标的饱和,并且还会错过复杂背景中的许多目标。与此同时,像 CenterNet 这样的无锚点检测器向我们展示了一个充满希望的未来,其中对象检测网络可以变得像图像分类网络一样简单。物体检测的其他方向,如少拍识别、NAS 等,还处于初级阶段,未来几年的进展如何,我们拭目以待。然而,随着物体探测技术变得越来越成熟,我们需要对其被军队和警察采用非常谨慎。终结者用 YOLO 探测器猎杀人类的反乌托邦是我们一生中最不想看到的。

原载于http://yanjia . Li2020 年 8 月 9 日**

参考

数据科学面试的 12 个概率练习题

原文:https://towardsdatascience.com/12-probability-practice-questions-for-data-science-interviews-2ec5230304d9?source=collection_archive---------1-----------------------

Clem Onojeghuo 在 Unsplash 拍摄的照片

自信地完成数据科学面试,第 3 部分

在之前的文章中,我已经谈到了机器学习和统计学中需要准备的面试问题:

[## 准备面试的 20 个机器学习相关问题

自信地完成面试

towardsdatascience.com](/20-machine-learning-related-questions-to-prepare-for-interviews-93bcba72f911) [## 为数据科学面试做准备的 22 个统计问题

自信的钉钉数据科学访谈,第 2 部分

towardsdatascience.com](/22-statistics-questions-to-prepare-for-data-science-interviews-d5651a8b3c56)

接下来的文章是关于为数据科学面试准备案例研究和行为问题:

[## 在数据科学面试中组织您对案例研究问题的回答

自信地完成数据科学面试,第 4 部分

towardsdatascience.com](/structure-your-answers-for-case-study-questions-during-data-science-interviews-a14a02d21e6c) [## 为数据科学面试准备行为问题

自信地完成数据科学面试,第 5 部分

towardsdatascience.com](/prepare-behavioral-questions-for-data-science-interviews-96e97f13be15)

在这篇文章中,我会列出概率中的 12 个问题供你练习。我将列出四个主题中常见和经典的问题:一般概率、二项分布、条件概率和贝叶斯概率。我在后面提供了我对这些问题的答案,这样你可以将你的答案与我的进行比较。如果您有任何问题、疑问、建议等,请随时联系我。

提问

一般概率

1、给定两个公平的骰子,两个骰子总和为 8 的概率是多少?当第一个骰子是 3 时,两个骰子总和为 8 的概率是多少?

2、A 人和 B 人在一起射箭。假设他们射向目标的能力完全相同,他们两人击中目标的概率都是 0.5。现在给定 A 发射了 201 支箭,B 发射了 200 支箭,那么 A 比 B 获得更多目标的概率是多少?

3、流感季节,对于双亲异性家庭,假设至少一方父母患流感的概率为 17%;父亲患流感的概率是 12%;父母双方都患流感的概率是 6%,母亲患流感的概率是多少?

你有 40 张四种颜色的牌,10 张红色,10 张绿色,10 张蓝色和 10 张黄色。每种颜色都有一个从 1 到 10 的数字。当你挑两张不替换的牌时,两张牌不在同一个颜色,不在同一个号码的概率是多少?

二项式分布

5、A 队和 B 队正在进行一场比赛,他们必须在 7 轮比赛中赢下 4 轮才能赢得比赛。A 赢的概率是 p,那么 B 赢的概率是 1-p(没有平手的机会),他们打满七轮的概率是多少?如果主场(p)和客场(q)A 赢的概率不一样怎么办?

6、八个人进入一栋十层楼的电梯。预计停车次数是多少?计算这个期望需要什么假设?

条件概率

一个人一次又一次地投掷一枚无偏的硬币。玩家 A 寻找序列HHT,玩家 B 寻找序列HTT。参与人 A 先遇到他们序列的概率是多少?

琼斯先生有两个孩子。大孩子是个女孩。两个孩子都是女孩的概率有多大?史密斯先生有两个孩子。其中至少有一个是男孩。两个孩子都是男孩的概率有多大?

天使给了你三扇门的选择。你只能从这三扇门中选择一扇门。在这三扇门中,有两扇门什么都没有,有一扇门中了头奖。在你选择了其中一扇门后,天使向你展示了另外两扇门中的一扇门,后面什么也没有。天使给了你一个机会去改变门,或者你可以坚持你选择的门。你不知道哪扇门后我们一无所有。你应该换还是无所谓?

贝叶斯概率

有四个盒子:A、B、C、d。约翰在其中一个盒子里随机放了一个球,让大卫猜他把球放在哪一个盒子里。大卫猜测球在盒子 A 里,但是他不确定。约翰给了他一个球不在 b 框的提示,这时,球在 C 框的概率是多少?

11、所有接受第一次面试的人,有 50%接受第二次面试;你的朋友中有 95%的人得到了第二次面试机会,他们觉得第一次面试很成功;你的朋友中有 75%没有得到第二次面试机会,他们觉得第一次面试很好。如果你觉得你第一次面试很好,你获得第二次面试的概率有多大?(Q16 摘自本文)

12、假设世界上存在一种非常罕见的疾病。任何人患这种疾病的几率是 0.1%。你想知道你是否被感染,所以你去做了测试,测试结果是阳性。测试的准确性为 99%,这意味着 99%的患病者将测试为阳性,99%的未患病者将测试为阴性(非常感谢 Xavier Lavenir 纠正了问题中的假设)。你被感染的可能性有多大?(感谢丹尼斯·迈斯纳,在这里抓住了曲解的错误)

答案

1、掷出两个公平骰子有 36 (6*6)种结果,当两个骰子总和为 8 时的结果为:

(2, 6), (3,5), (4,4), (5,3), (6,2);

两个骰子总和为 8 的概率是 5/36。

对于第二部分,我们计算的是一个条件概率。假设事件 A 是两个骰子,总和为 8,事件 B 是第一个骰子是 3。我们知道事件 B 的结果是:

(3,1), (3,2), (3,3), (3,4), (3,5), (3,6)

而只有(3,5)使事件 A 发生,因此概率是 1/6。

我们也可以使用贝叶斯定理和条件概率来解决这个问题:

P(AB)和 P(A|B)的区别在于:

  • P(AB)为 1/36:36 个结果中,只有(3,5)个同时满足事件 A 和事件 B;
  • P(A|B)是 1/6:在事件 B 的 6 个结果中,(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),只有一个结果在(3,5)处总计为 8,因此 P(A|B)是 1/6。(也可按 1/36 / 1/6 = 1/6 计算)

201 不是一个偶数,所以让我们先考虑 200 场比赛。假设事件 A 是 A 在 200 场比赛中比 B 向目标射出更多的箭,事件 B 是 B 向目标射出更多的箭,事件 C 是他们向目标射出等量的箭。我们有:

因为 A 和 B 在射箭方面表现相同,所以 200 场比赛,我们有 P(A) = P(B)。因此:

现在来看 A 玩的额外游戏。如果在过去的 200 场比赛中:

  • A 比 B 高,那么在这个额外的游戏中,无论 A 是否击中目标,A 仍然比 B 高。
  • 如果 A 比 B 低,即使 A 在额外的比赛中向目标开火,我们也会观察到最多 A=B,A 仍然不会超过 B。
  • 如果 A=B,如果 A 在额外的游戏中向目标射击,那么 A 将高于 B,任何游戏中 A 向目标射击的概率是 0.5。

因此,A 高于 B 的总概率为:

我们知道 2P(A) + P(C) = 1,如果我们两边都除以 2,我们将得到:

在 A 玩 201 局,B 玩 200 局的情况下,A 比 B 获得更多目标的概率是 0.5。

3、假设父亲患流感的概率为 P(F),母亲患流感的概率为 P(M)。我们知道:

根据概率的一般加法法则:

因此 P(M)=11%。

4、我们可以先计算得到两张相同号码牌的概率和得到两张相同颜色牌的概率,然后用一减去两个概率之和。

得到两张号码相同的牌的概率是:

第一次抽奖可以得到任意数字,也没关系。因此第一次抽牌并不影响概率,但是对于第二次抽牌,你只剩下 39 张牌了,你需要抽取与第一次抽牌相同的号码。对于每个数字,有四张不同颜色的相同数字的卡片。因此对于第二次抽牌,你只能从 39 张牌中挑选 3 张。

相同的逻辑得到两张相同颜色的牌:

我们在第一次抽奖中选择任何颜色,并且只能从剩余的 39 张牌中选择 9 张相同颜色的牌。得不到同号同卡的概率是:

P = 1-P(相同数字)-P(相同颜色)= 27/39

5、如果两队打满 7 轮,那么前 6 轮,A 和 B 都要赢正好 3 次,最后一轮谁赢我们不在乎。我们可以把每一轮都看作是伯努利试验,那么 A 在前 6 场比赛中获胜的次数遵循二项分布 Bi(n,k,p)其中 n=6,k=3,p=p,A 获胜的概率。根据二项式分布,A 在 6 场比赛中赢 3 次的概率是:

请注意,A 队赢 3 次会自动设置 B 队赢 3 次。

如果两支球队主场和客场的胜率不同,我们可以假设 A 队主场获胜的概率是 p,客场是 q,A 队主场已经赢了 x 场比赛。两个队打完所有 7 轮比赛的概率将是 x、p 和 q 的函数。具体来说,我们知道 A 队和 B 队都必须赢 3 轮,那么 A 队必须在主场赢 x 场比赛,在客场赢 3-x 场比赛;B 队要客场赢 3-x 场(A 队主场是 B 队的客场,A 主场输 B 队客场赢),主场赢 x 轮。打七轮的概率是:

如果我们有更多关于 x 的分布的信息,我们可以得到更多关于概率的信息。

想了解更多关于二项分布的知识,请查看这篇文章

如果我们将每个乘客关于是否在某个楼层停留的决定视为伯努利试验,我们可以使用二项式分布来处理这个问题。这些假设包括:

  • 8 .乘客自主决策;
  • 假设每个人都从底层进入,有 10 个选择,从 1 层到 10 层。(如果假设一楼没人停,那么只有 9 个选择)。

总共有八名乘客,对于每个楼层,如果有人想下车,电梯就会停下来。我们可以计算不停止的概率,而不是计算电梯停在某一楼层的概率。对于任何楼层,电梯不在任何楼层停留的概率为:

电梯停在任何楼层的概率是:

为了找到这种情况下的预期停靠次数,定义一个随机变量 X 作为电梯的停靠次数,X 遵循二项式分布:

其中 n=10,p=1-(9/10)⁸.二项分布随机变量的期望值是 np:

7、硬币无偏使得 P(H) = P(T) =0.5。让我们假设 HHT 早于 HTT 的事件是事件 E,我们有:

  • P(E) = P(E|H)P(H) + P(E|T)P(T)

其中 P(E|H)在第一次投掷时得到 H。既然得到一条尾巴对得到 HHT 和 HTT 都没有帮助,因此:

  • P(E) = P(E|T) = P(E|TT)=…

插回到前面的等式:

  • P(E)= 0.5 * P(E | H)+0.5 * P(E)= > P(E)= P(E | H)

所以我们只需要得到 P(E|H)来求解 P(E):

  • P(E | H)= P(E | HH)* P(H)+P(E | HT)* P(T)

无论何时你得到 HH,你肯定会比 HTT 早得到 HHT,因为你只需要得到一个额外的 T 就可以到达 HHT,但是你需要得到两个额外的 T 才能到达 HTT。因此 P(E|HH)是 1:

  • P(E|H) = 10.5 + P(E|HT)0.5

出于同样的逻辑:

  • P(E | HT)= P(E | HTH)* P(H)+P(E | HTT)* P(T)

P(E|HTT) =0,因为我们已经先到达了 HTT。当看到 HTH 时,前两次投掷可以忽略不计,就像滚动第一个 h 一样。因此:

  • P(E|HTH) = P(E|H)

现在我们有:

  • P(E | HT)= P(E | HTH)* P(H)+P(E | HTT)* P(T)= P(E | H)* 0.5+0

插回到前面的等式:

  • P(E | H)= 1 * 0.5+P(E | HT)* 0.5 = 0.5+P(E | H)* 0.5 * 0.5 = > P(E | H)= 2/3
  • P(E) = P(E|H) =2/3

8、对于有两个孩子的家庭,性别组合有四种可能:

四种可能性

答:如果我们知道大孩子是女孩,那么只有两种可能:

两种可能性

其中一个有两个女儿。概率是 1/2;

B 部分:对于至少一个孩子是男孩,我们有三种可能性:

三种可能性

其中一个怀了两个男孩。概率是 1/3。

对于练习,可以尝试用条件概率来解决这个问题。

我们有三扇门,一号门、二号门和三号门。他们每个人都有 1/3 的机会拥有后面的头奖。我们需要根据自己当初是否选择正确来决定是否切换,比较切换和不切换的概率。假设事件 A 在第一次尝试中选择正确:

  • p(A)= 1/3;p(不是 A)= 2/3;

让事件 B 在切换后获胜:

  • P(B|A) = 0:如果你在第一次尝试(事件 A)中选择正确,并且你切换,你将不再获胜;
  • p(B |非 A) = 1:如果你在天使移除另一个错门后第一次尝试(事件非 A)选错了,切换后一定会赢。

因此:

P(B)= P(B | A)P(A)+P(B |非 A) P(非 A) = 2/3。

当不切换时,让事件不是最佳获胜:

  • p(不是 B|A) = 1:如果你第一次尝试(事件 A)选择正确,并且你切换,你将赢得头奖;
  • P(Not B|not A) = 0:如果第一次尝试选错了(event not A),选择不切换就输了。

因此:

P(非 B) = P(非 B|A)P(A) + P(非 B |非 A)P(非 A) = 1/3。

比较切换和不切换时的胜算:

P(B) > P(不是 B)

你应该换一下!

10、约翰给出暗示后,有三种情况:

  • S1: A=1,B=0,C=0,D = 0;
  • S2: A=0,B=0,C=1,D = 0;
  • S3: A=0,B=0,C=0,D = 1;

将约翰说球不在盒子 B 中的事件定义为事件 B,我们需要计算 P(S2|B)的条件概率。根据贝叶斯定理:

让我们逐个检查这些元素:

  • P(S2)是约翰将球放入四个盒子中的盒子 C 的概率。概率应该和他把球放在任何一个盒子里一样。因此:

  • P(B|S2)是当约翰将球放入盒子 C 时,在大卫已经选择了盒子 A 的情况下,他给出了球不在盒子 B 中的提示。在大卫选择了 A 之后,只剩下三个盒子供约翰排除,分别是 B,C,D。鉴于球实际上在盒子 C 中,约翰只能通过给他提示来帮助大卫排除 B 或 D。他在两个盒子(B,D)中选择 B 的概率是 1/2:

  • 根据贝叶斯公式:

我们知道 P(B|S2)是 1/2,我们可以用同样的逻辑得到 P(B|S1)和 P(B|S3)。当球在盒子 A(S1)时,大卫已经得到了正确的答案。约翰有三个选择来给出提示:不在 B 中,不在 C 中,不在 d 中。因此 P(B|S1)是 1/3。P(B|S3)是 1/2,因为约翰可以说不在 B 中或不在 c 中。将所有信息结合在一起,我们将得到:

因此,我们有:

外卖:如果约翰没有给出任何提示,我们知道球在盒子 C 里的概率是 1/4。约翰给出的提示增加了球在盒子 C 中的概率,因为我们在用新的信息更新概率,这是贝叶斯定理的关键。

11、解决这类问题的关键是仔细定义事件。假设你的朋友很好地代表了整个人口:

  • 让我们把第一次面试感觉良好定义为事件 A,把接受第二次面试定义为事件 B;
  • “所有接受第一次面试的人中有 50%接受第二次面试”是指 P(B)=0.5,因此 P(不是 B)是一减去 P(B),也是 0.5;
  • “你的朋友中有 95%的人得到了第二次面试,他们觉得第一次面试很好”意味着 P(A | B)= 0.95;
  • “75%没有获得复试的朋友认为他们的第一次面试很好”意味着 P(A |不是 B) = 0.75。
  • 问题是问给定 P(B),P(A|B),P(A |不是 B),P(B|A)是什么?(如果你觉得你第一次面试很好,你获得第二次面试的概率有多大?)

根据贝叶斯定理:

因此:

12、假设事件 A 患病,事件 B 检测呈阳性。根据问题中的信息:

  • P(A) = 0.1%,那么 P(不是 A)就是 99.9%;
  • P(B|A) = 99%,而测试呈阳性的人中有 1%没有这种疾病,所以 P(B | A)= 1%;
  • P(A|B)是什么?

来自贝叶斯定理:

并且:

插件所有号码:

这些都是有解答的问题。希望这篇文章能帮助你练习概率论的技巧。如果你想要更多的练习题,你可以看看这个网站:

[## 数据科学的 40 个概率问题

简介概率形成了许多重要的数据科学概念的主干,从推断统计到…

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/04/40-questions-on-probability-for-all-aspiring-data-scientists/)

感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!

[## 我的博客文章库

我快乐的地方

zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

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

编写更好代码的 12 个 Python 技巧和诀窍

原文:https://towardsdatascience.com/12-python-tips-and-tricks-for-writing-better-code-b57e7eea580b?source=collection_archive---------4-----------------------

通过掌握最新的 Python 特性、技术、技巧和诀窍来提高代码的质量👨‍💻👩‍💻

克里斯·里德在 Unsplash 上拍摄的照片

1.f 弦

F-Strings 提供了一种简洁的和方便的方式来将 Python 表达式嵌入到字符串文字中用于格式化。****

首先,让我们定义两个变量nameage,它们将包含在我们的print语句中。

name = "Pavel"
age = 23

为了不处理字符串连接或在打印语句中使用逗号,可以使用 Python 3.6 中发布的改进的字符串格式化语法“f-Strings”

简单地在带有变量表达式的字符串前面加上一个小写大写字母 "f"花括号内。

F-Strings 是一种很棒的格式化字符串的新方法,比其他格式化方法更容易阅读,更快,更简洁,更 T42,更不容易出错。

2.帮助功能

Python help函数用于查找模块、函数、类、关键字等的文档

只需中的一个对象传递给help函数,即可检索该对象的文档:

3.找出任何物体的大小

默认的sys模块包含一个函数getsizeof ,它接受一个对象,并以字节返回其大小。该对象可以是任何类型的

例如:

只有内存消耗直接归于被占对象,而不是它所指对象的内存消耗。****

另一个例子:

4.比较运算符的链接

通常要检查的两个条件,你就必须使用逻辑运算符,比如and//or

if a < b and b < c:

在 Python 中,有一种更好的方式来编写它,使用比较操作符链接

运算符的链接可以写成如下形式:

if a < b < c:

例如:

5.列出理解

****列表理解是另一种更优雅的制作列表的方式。

不用创建一个空的列表和添加每个元素到结束,你可以简单的定义列表和它的内容在相同的** 时间如下格式:**

new_list = [**expression** for **item** in **iterable** (if **conditional**)]

例如:

另一个例子(有条件):

6.字符串乘法

在 Python 中,不仅数字可以相乘,字符串也可以相乘。

例如:

7.在一行中分配多个变量

通过用逗号分隔变量和值,可以将多个分配给多个变量:

析构** / 解包序列,如列出元组时,这也是一种更为优雅的方式将序列元素分配给单个变量,因为不需要使用循环或单独索引序列的每个元素。**

8.就地交换变量

在许多其他编程语言中,交换两个或两个或更多变量的值只能通过定义一个额外的temp(临时)变量来完成。****

假设你想交换 x 和 y:

temp = x
x = y
y = temp

在 Python 中,有一个简单的单行构造来交换变量,类似于单行中将值分配给多个变量的概念。****

以下代码与上述代码相同,但没有使用任何临时变量:

9.创建枚举

Enum 是 Python 中用于创建枚举的类,枚举是附加在唯一常量值上的一组符号名。

为了创建一个 枚举 ,需要创建一个类,这个类是你想要的 枚举名称

剩下要做的就是列出T21 变量和设置它们等于你想要的:

访问枚举成员Paul为例,你可以只做Person.Paul,它将返回0

在 Python 中,上面的例子可以通过在旁边列出变量并设置它们等于范围函数而被缩短为:

10.列举

通常当循环遍历一个列表时,你不仅想访问列表中位置为索引,还想访问实际的元素。****

让我们定义一个字符列表:

x = ['a', 'b', 'c']

代替循环通过它的标准方式,访问元素和索引:

使用枚举

Enumerate 是 Python 的一个内置函数,允许我们循环遍历一个可迭代的并拥有一个自动计数器。它本质上是将列表中的每个元素对应的索引配对。大部分新人甚至一些高级程序员都没有意识到。

您可以将变量iv更改为您喜欢的变量名。比如for **index, count** in enumerate(x)

11.Dir 函数

dir()是 Python3 中一个强大的内置函数,它返回任何对象的属性方法的列表,如函数、模块、字符串、列表、字典等。

这在几乎没有关于模块的信息时非常有用,有助于更快地学习新模块。

例如:

dir() 通常用于调试目的。当分别处理dir()许多dir()类和函数时,dir()列出所传递参数的所有属性的能力非常有用。

12.参数解包

有时被称为 SplatScatter 操作符*****在一个需要分离** 位置 参数的函数调用中需要对列表/元组中的参数进行解包时起作用。**

例如,内置的range() 函数期望单独的 开始停止 参数。在编写函数调用时,可以使用*操作符来将参数从列表或元组中解包:

让我们定义一个简单的列表x = [1,2,3,4,5]

解包操作符的一个常见例子是使用print:

print(*x) // Result: 1 2 3 4 5

这只是简单地打印出列表中的每个元素除了彼此空格分隔,因为解包操作符获取列表中的所有元素,将它们作为参数传递给,所以上面代码的翻译将是print(1,2,3,4,5)

这个 Python 技巧在函数中经常使用,将方法调用接收的所有参数打包到一个单变量中。****

例如:

上面的func 函数可以带一个无限量自变量 ( args[0]args[1]会分别给你第一个自变量和第二个自变量)。

类似地,字典可以用******操作符传递关键字参数。

让我们定义一个名为person的 Python 字典:

**person = {"**name**": "Paul", "**age**": 23, "**location**": "London"}**

您可以使用******操作符将字典中的 传递给一个函数。

传入的字典将分解作为函数关键字参数,然后将作为传递给该参数的实际值

例如:

遗言

感谢您的阅读,希望这篇文章对您有用!

如果有你认为我应该包括的提示或其他建议,请评论。💬

编码快乐!💻☕️

展现 AI 真相的 12 个 XKCD 条

原文:https://towardsdatascience.com/12-xkcd-strips-that-show-the-truth-about-ai-e09fbcd00c4c?source=collection_archive---------17-----------------------

简笔画洞察假人工智能,反向图灵测试,超级智能,等等。

乔·奇恰雷利在 Unsplash 上的照片

XKCD ,一个 15 岁的“浪漫、讽刺、数学和语言的网络漫画家”,巧妙地将复杂的想法,如人工智能,提炼成简单的漫画。

XKCD 慷慨地允许带归属的重新打印,所以这里有 12 个 XKCD 条,展示了关于 AI 的真相。

生物神经网络与人工神经网络

XKCD #2173

你的大脑是一个由 860 亿个神经元组成的互联网络——如果你愿意,可以称之为神经网络。人工神经网络受到这种设计的启发,虽然最简单的构造——感知机——只是单个神经元,但现代神经网络(NNs)可以达到 10 亿个权重和数百万个神经元。

通过从数据中学习模式,神经网络可以完成从图像识别到预测的广泛任务。

然而,如果我们走得太远,我们可能会浪费时间来构建模型,而手动工作会更好。

[## 何时不使用机器学习或人工智能

一厢情愿、不稳定和寻找模式的冒险

towardsdatascience.com](/when-not-to-use-machine-learning-or-ai-8185650f6a29)

假 AI

XKCD #1897

从各方面来看,人工智能似乎无处不在。转向产品搜索、Twitter 或/r/startups,看起来好像每分钟都有新的人工智能解决方案冒出来。

但事实真的是这样吗——还是有些公司在“作弊”?事实证明,几家公司已经被抓到了,他们声称使用人工智能,但实际上是外包粗活。据《福布斯》报道,这些只是犯有“伪人工智能”罪的公司中的一部分:

  • 汉森机器人公司
  • X.人工智能
  • 克拉拉实验室

[## 人工智能还是人类智能?公司伪造人工智能

人工智能是一个广泛的热门话题-从寻求实施人工智能系统的企业到…

www.forbes.com](https://www.forbes.com/sites/cognitiveworld/2020/04/04/artificial-or-human-intelligence-companies-faking-ai/#4112061c664f)

理论

XKCD #1450

虽然未来主义者和思想领袖可能会告诉你,但我们真的不知道超级智能人工智能创造出来后会发生什么。

会仁慈吗?恶毒?中立?无感觉但超级聪明?无论发生什么,都会让我们大吃一惊。

[## 有知觉的人造生物的权利

哲学的进步可能远比科学技术更难

towardsdatascience.com](/rights-of-sentient-artificial-beings-1ada7e7d3e6)

数据管道

XKCD #2054

建立数据管道并不容易。要构建数据产品,您需要能够从潜在的数百万用户那里收集数据,并近乎实时地处理结果。您的管道需要健壮、可伸缩、高效,并具有监控功能。

有多难,很多管道都不勾选所有的框。

[## 基于云的高吞吐量低延迟大数据管道架构

对于分析和 ML 的成功,可扩展和高效的数据管道与可靠的供应线一样重要…

towardsdatascience.com](/scalable-efficient-big-data-analytics-machine-learning-pipeline-architecture-on-cloud-4d59efc092b5)

培养

XKCD #2265

通过训练神经网络——或者多次将训练数据传递给复合函数,以便学习模式——我们可以预测新数据。如果你训练的时间不够长,你的模型将会“不合适”,或者根本没有学习到数据中的模式。

你可能最终会有一个会说胡言乱语的聊天机器人,或者一辆只能直行的自动驾驶汽车。

[## 纪元与批量大小与迭代次数

了解您的代码…

towardsdatascience.com](/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9)

聊天机器人

XKCD #948

Cleverbot 于 1997 年发布,所以有点像样的聊天机器人已经有很长的历史了。

然而,创造新的和独特的东西的人工智能和仅仅检索人类过去做过或说过的东西的人工智能之间有很大的区别——比如 Cleverbot。

公平地说,现代聊天机器人在技术上有了很大的进步,而且惊人地准确。

* [## 我尝试了脸书新的人工智能聊天机器人...太好了,太吓人了。|黑客正午

我:嘿,你最喜欢哪个棒球队?Bot:我真的没有喜欢的球队。我更像一个足球迷。什么…

hackernoon.com](https://hackernoon.com/i-tried-facebooks-new-ai-chatbot-its-so-good-its-scary-jn3332ez)*

数据➡️回答

XKCD #1838

尽管我们在人工智能方面取得了很多进展,但在可解释性方面做得相对较少。虽然“黑盒”人工智能的想法有点像神话——因为有很多方法可以解释结果——但对于大多数人工智能模型,尤其是深度学习,如何真正在引擎盖下工作,还没有完全的透明度或直觉。

* [## 打开医学人工智能的黑匣子

在世界各地的诊所中,一种称为深度学习的人工智能开始补充或…

undark.org](https://undark.org/2019/12/04/black-box-artificial-intelligence/)*

感觉

XKCD #1626

阿西莫夫机器人第三定律是机器人必须保护自己的存在。核爆炸触发 EMP摧毁电子设备,因此遵守阿西莫夫定律的有感知能力的人工智能可能会寻求摧毁我们的核武器,而不是用它们来对付我们。

* [## 阿西莫夫的机器人定律,以及为什么人工智能可能不遵守它们

阅读为人工智能-人类合作设计的法律,并在此过程中一窥 NLP 的最新水平。

towardsdatascience.com](/asimovs-laws-of-robotics-and-why-ai-may-not-abide-by-them-e6da09f8c754)*

我们不应该担心人类吗?

XKCD #1955

有很多关于人工智能的恐惧,有些是合理的(人工智能可能会带来种族和性别偏见,人工智能可能会刺激失业,等等),其他人是不合理的(人工智能会杀了我们)。

然而,所有这些恐惧忘记了一件事:人类,而不是 AI,才是危险。不幸的事实是,历史上有多达 10 亿人在战争中丧生。

* [## 为什么人工智能是一门恐惧驱动的学科|黑客正午

数据科学的民主化。“71%的消费者担心人工智能会侵犯他们的隐私。”当被问及他们的想法时…

hackernoon.com](https://hackernoon.com/why-ai-is-a-fear-driven-discipline-346zj3yrk)*

图灵检定

XKCD #329

在关于人工智能的开创性论文 计算机械与智能 中,图灵问道:“机器能思考吗?”—或者,更准确地说,机器能模仿思维吗?

到目前为止,答案是“不”,但我们很可能有一天会实现这一目标,也许会通过一项新的测试来提高标准。

* [## 人工智能的历史:图灵测试

机器会思考吗?

towardsdatascience.com](/the-history-of-artificial-intelligence-the-turing-test-c1d6777d2970)*

人类更擅长…

XKCD #1263

随着每一个新的人工智能的进步,愤世嫉俗者不断改变目标,人工智能也不断赶上。

* [## 14 种深度和机器学习的使用使 2019 年成为一个新的人工智能时代。

比格根、塞勒根、斯泰尔根、高根、艺术育种家、德奥迪菲等。:我非常私人的清单(包括奖金)。

towardsdatascience.com](/14-deep-learning-uses-that-blasted-me-away-2019-206a5271d98)*

简单与不可能的任务

XKCD #1425

在计算机领域,外行人看似相似的两个任务可能很容易成为琐碎和几乎不可能的区别。今天,在上面这幅漫画诞生多年后,图像识别任务已经变得简单多了,但许多其他任务却极具挑战性。

例如,我们如何创建一个神经网络,它不仅可以解释,而且可以直观地解释?我们如何创建新的最先进的神经网络而不是简单地增加更多的计算、更多的数据和更多的参数?我们怎样才能创造出通用的人工智能,而不是狭义的人工智能?我们如何实现第 5 级自动驾驶——它可以处理像道路工人举着停止标志,同时通过眼神接触向你旁边的司机示意继续前进这样的事情?****

该领域有许多未解的问题,这使得它更加令人兴奋!

[## 那是只莺吗?Python 中 Keras CNN 的鸟类分类

有没有想过“那是什么鸟?”

towardsdatascience.com](/is-that-a-warbler-bird-classification-with-keras-cnn-in-python-db4606555a33)

想要更多这样的内容?

如果你想了解更多关于人工智能和数据科学的知识,请关注我的走向数据科学,以及我参与撰写的 Apteo 的数据科学博客

[## 弗雷德里克·布斯勒——走向数据科学

阅读 Frederik Bussler 在《走向数据科学》中的文章。数据科学的民主化。Apteo 的顾问-无代码…

towardsdatascience.com](https://towardsdatascience.com/@frederikbussler)

2021 年你应该知道的 120+数据科学家面试问答

原文:https://towardsdatascience.com/120-data-scientist-interview-questions-and-answers-you-should-know-in-2021-b2faf7de8f3e?source=collection_archive---------0-----------------------

面试问题来自脸书、Yelp、亚马逊、谷歌、苹果、网飞等等

约瑟夫·巴里恩托斯在 Unsplash 上拍摄的照片

2020 年不是最伟大的一年,所以我想为什么不在 2021 年领先一步呢!

这篇文章有超过 120 个数据科学面试问题,来自世界上一些顶尖的科技公司,如脸书、谷歌、Yelp、亚马逊等等!

一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!

这篇文章和我以前的文章有什么不同?

  1. 更多问题!这篇文章不是 100 个问题,而是超过 120 个面试问题来帮助你准备。
  2. 更多 SQL!这一次,根据要求,有更多的一般 SQL 问题,而不是技术编码问题。
  3. 更多深度学习!这一次,关于神经网络和深度学习的问题更多了。
  4. 更多案例分析!有一堆 SQL 案例研究和业务案例研究,这样你就可以自己应用了。
  5. 更精致!更少的语法错误(希望如此),以及更少的错误。更多图片和图表!

这分为几个部分:

  1. 机器学习
  2. 结构化查询语言
  3. 统计、概率和数学
  4. 数据和业务分析
  5. 多方面的
  6. 个案研究

说到这里,祝你好运!

机器学习

问:线性回归需要哪些假设?如果这些假设中的一些被违反了呢?

有四个与线性回归模型相关的假设:

  1. 线性:X 和 Y 的均值之间的关系是线性的。
  2. 同方差:残差的方差对于 x 的任意值都是相同的。
  3. 独立性:观测值相互独立。
  4. 正态:对于 X 的任意固定值,Y 都是正态分布。

极端违反这些假设将使结果变得多余。对这些假设的小的违反将导致估计的更大的偏差或方差。

问:什么是共线性?什么是多重共线性?你是怎么处理的?

共线性是两个预测值之间的线性关联。多重共线性是两个或更多预测值高度线性相关的情况。

这可能是有问题的,因为它破坏了一个独立变量的统计意义。虽然它不一定对模型的准确性有很大影响,但它会影响预测的方差,并降低独立变量的解释质量。

您可以使用方差膨胀因子(VIF)来确定自变量之间是否存在多重共线性-标准基准是,如果 VIF 大于 5,则存在多重共线性。

一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!

问:线性模型的缺点是什么?

线性模型有几个缺点:

  • 线性模型有一些强有力的假设,在应用中可能不成立。它假设线性关系、多元正态性、没有或很少多重共线性、没有自相关和同方差。
  • 线性模型不能用于离散或二元结果。
  • 您不能改变线性模型的模型灵活性。

问:什么是岭回归和套索回归,它们之间有什么区别?

L1 和 L2 正则化都是用于减少训练数据过拟合的方法。最小二乘法使残差平方和最小,这可能导致低偏差但高方差。

L2 正则化,也称为岭回归,最小化残差平方和加上λ乘以斜率平方。这个附加项被称为岭回归损失。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。
如果你取岭回归罚,用斜率的绝对值代替,那么你得到套索回归或者 L1 正则化

L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。

问:K 近邻是如何工作的?

作者创建的图像

K-最近邻是一种分类技术,其中通过查看最近的分类点对新样本进行分类,因此称为“K-最近”。在上面的例子中,如果 k=1,那么未分类的点将被分类为蓝点。

如果 k 值太低,它可能会受到异常值的影响。但是,如果它太高,可能会忽略只有几个样本的类。

问:如何为 k 均值选择 k?

您可以使用肘法,,这是一种用于确定 k 的最佳值的常用方法。实际上,您要做的是在图表上绘制 k 的每个值的平方误差(x 轴上的 k 值和 y 轴上的平方误差)。一旦图形制作完成,失真下降最多的点就是肘点。

作者创建的图像

以上面的图像为例,你可以看到当 k=3 时出现肘部,因此 k 应该等于 3。

问:为什么朴素贝叶斯“幼稚”?

朴素贝叶斯之所以是朴素的,是因为它有一个强有力的假设,即假设要素之间是不相关的,但事实通常并非如此。

问:SVM 的支持向量是什么?

支持向量是接触最大边距边界的数据点(见下文)。

作者创建的图像

什么是决策树中的修剪?

剪枝是机器学习和搜索算法中的一种技术,通过删除对实例分类几乎没有帮助的部分或分支来减少决策树的大小。

问:什么是随机森林?为什么朴素贝叶斯更好?

随机森林是一种基于决策树的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。依靠“多数获胜”模型,它降低了单个树出错的风险。

作者创建的图像

例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是随机森林的力量。

随机森林提供了其他几个好处,包括强大的性能,可以模拟非线性边界,不需要交叉验证,并赋予功能重要性。

从过程和结果易于训练和理解的意义上来说,朴素贝叶斯更好。一个随机的森林看起来就像一个黑盒。因此,在实现和理解方面,朴素贝叶斯算法可能更好。但是,就性能而言,随机森林通常更强,因为它是一种集合技术。

问:什么时候你会使用随机森林来对抗 SVM,为什么?

为什么随机森林是比支持向量机更好的算法选择有几个原因:

  • 随机森林允许您确定要素的重要性。SVM 不能这么做。
  • 随机森林比 SVM 建造起来更快更简单。
  • 对于多类分类问题,支持向量机需要一种 one-vs-rest 方法,这种方法扩展性差,占用内存多。

问:你认为 50 个小决策树比一个大决策树好吗?为什么?

问这个问题的另一种方式是“随机森林是比决策树更好的模型吗?”答案是肯定的,因为随机森林是一种集成方法,需要许多弱决策树来形成强学习器。随机森林更准确、更健壮,并且不容易过度拟合。

问:AdaBoosted 树和渐变 Boosted 树有什么区别?

AdaBoost 是一种增强的算法,类似于随机森林,但有几个显著的区别:

  1. AdaBoost 通常制作树桩森林(树桩是只有一个节点和两片叶子的树),而不是树木森林。
  2. 每个树桩的决策在最终决策中的权重并不相等。总误差少(精度高)的树桩会有更高的话语权。
  3. 树桩创建的顺序很重要,因为每个后续树桩都强调在前一个树桩中被错误分类的样本的重要性。

梯度增强在某种意义上类似于 AdaBoost,它构建了多棵树,其中每棵树都是基于前一棵树构建的。与 AdaBoost 构建树桩不同,Gradient Boost 构建的树通常有 8 到 32 片叶子。

更重要的是,Gradient 与 AdaBoost 在决策树的构建方式上有所不同。梯度增强从初始预测开始,通常是平均值。然后,基于样本的残差构建决策树。通过采用初始预测+学习率乘以残差树的结果来进行新的预测,并且重复该过程。

问:什么是偏差-方差权衡?

估计量的偏差是期望值和真实值之差。具有高偏差的模型往往过于简单,导致拟合不足。方差表示模型对数据和噪声的敏感度。具有高方差的模型会导致过度拟合。

因此,偏差-方差权衡是机器学习模型的一个属性,其中较低的方差导致较高的偏差,反之亦然。一般来说,可以找到两者的最佳平衡,使误差最小化。

作者创建的图像

问:解释什么是 bootstrap 抽样方法,并举例说明何时使用该方法。

从技术上讲,bootstrap 抽样法是一种使用带替换的随机抽样的重抽样方法。此处阅读更多

它是随机森林算法以及其他集成学习算法的重要组成部分。

问:装袋和助推有什么区别?

Bagging 又称 bootstrap aggregating ,是用原始数据集的自举样本对同一学习算法的多个模型进行训练的过程。然后,像上面的随机森林示例一样,对所有模型的输出进行投票。

作者创建的图像

Boosting 是 bagging 的一种变体,其中每个单独的模型都是按顺序构建的,并迭代上一个模型。具体来说,任何被前一个模型错误分类的数据点都会在后一个模型中得到强调。这样做是为了提高模型的整体准确性。这里有一个图表,可以更好地理解这个过程:

作者创建的图像

一旦建立了第一模型,除了第二自举样本之外,还采用错误分类/预测的点来训练第二模型。然后,针对测试数据集使用集合模型(模型 1 和 2 ),并且该过程继续。

问:XGBoost 如何处理偏差-方差权衡?

作者创建的图像

XGBoost 是一种利用梯度推进算法的集成机器学习算法。本质上,XGBoost 就像是类固醇上的装袋助推技术。因此,可以说 XGBoost 处理偏差和方差的方式类似于任何 boosting 技术。Boosting 是一种集成元算法,通过对许多弱模型进行加权平均来减少偏差和方差。通过关注弱预测和迭代模型,误差(从而偏差)减少了。类似地,因为它采用了许多弱模型的加权平均值,所以最终模型比每个弱模型本身具有更低的方差。

问:什么是交叉验证?

交叉验证本质上是一种用于评估模型在新的独立数据集上表现如何的技术。

交叉验证最简单的例子是将数据分为三组:训练数据、验证数据和测试数据,其中训练数据用于构建模型,验证数据用于调整超参数,测试数据用于评估最终模型。

问:假设您需要使用多元回归生成一个预测模型。解释你打算如何验证这个模型。

有两种主要方法可以做到这一点:

A)调整后的 R 平方

r 平方是一种度量,它告诉你因变量的方差在多大程度上是由自变量的方差来解释的。更简单地说,当系数估计趋势时,R 平方表示最佳拟合线周围的散布。

然而,添加到模型中的每个额外的独立变量总是增加 R 平方值——因此,具有几个独立变量的模型可能看起来更适合,即使它不是。这就是调整后的 R 的用武之地。调整后的 R 补偿每个额外的独立变量,并且仅在每个给定变量将模型改进到超出概率可能的程度时才增加。这很重要,因为我们正在创建一个多元回归模型。

B)交叉验证

大多数人常用的方法是交叉验证,将数据分成三组:训练、验证和测试数据。见前面的回答。**

问:在线学习和批量学习有什么区别?

批量学习,也称为离线学习,就是你学习一组组的模式。这是大多数人都熟悉的学习类型,在这种情况下,您可以获取一个数据集,然后一次性在整个数据集上构建一个模型。

另一方面,在线学习是一种一次吸收一个观察数据的方法。在线学习是数据高效的,因为数据一旦被消费就不再需要,这在技术上意味着你不必存储你的数据。

问:给出几种处理缺失值的方法

有多种方法可以处理空值,包括:

  • 您可以完全忽略空值行
  • 您可以用集中趋势的度量值(平均值、中值、众数)替换空值,或者用新的类别替换空值(如“无”)
  • 您可以根据其他变量预测空值。例如,如果某一行的 weight 值为空,但它的 height 值为空,则可以用该给定高度的平均重量替换该空值。
  • 最后,如果您正在使用自动处理空值的机器学习模型,则可以保留空值。

问:缺失数据的均值插补是可接受的做法吗?为什么或为什么不?

均值插补是用数据的均值替换数据集中的空值的实践。

均值插补通常是不好的做法,因为它没有考虑特征相关性。例如,假设我们有一个显示年龄和健康分数的表格,并假设一个 80 岁的老人缺少健康分数。如果我们从 15 岁到 80 岁的年龄范围内取平均健康分数,那么 80 岁的人看起来会比他实际应该得到的健康分数高得多。

第二,均值插补减少了数据的方差,增加了数据的偏倚。由于方差较小,这导致模型不太精确,置信区间较窄。

什么是混淆矩阵?

混淆矩阵,也称为误差矩阵,是用于评估分类模型性能的汇总表。正确和错误预测的数量用计数值汇总,并按每个类别细分。

由作者创建

问:什么是监督与非监督学习?

监督学习包括在标记为的数据集上学习,其中目标变量是已知的

无监督学习用于从输入数据中得出推论和发现模式,而不需要参考标记的结果——没有目标变量

问:什么是集成学习?

集成学习是一种多种学习算法联合使用的方法。这样做的目的是让您获得比单独使用单个算法更高的预测性能。随机森林就是一个例子。

问:如何识别异常值?

有几种方法可以识别异常值:

Z 值/标准偏差:如果我们知道一个数据集中 99.7%的数据位于三个标准偏差内,那么我们可以计算一个标准偏差的大小,乘以 3,并确定超出该范围的数据点。同样,我们可以计算给定点的 z 分数,如果它等于+/- 3,那么它就是异常值。
注意:使用该方法时,需要考虑一些意外情况;数据必须呈正态分布,这不适用于小数据集,并且过多异常值的存在会影响 z 值。

四分位距(IQR): IQR,用于构建箱线图的概念,也可用于识别异常值。IQR 等于第三个四分位数和第一个四分位数之差。然后,如果一个点小于 Q1-1.5 * IRQ 或大于 Q3 + 1.5IQR,则可以确定该点是否为异常值。这达到大约 2.698 个标准偏差。*

其他方法包括 DBScan 聚类、隔离森林和稳健随机采伐森林。

什么是内球?

一个内联者是一个数据观察,它位于数据集的其余部分内,是不寻常的或者是一个错误。由于它位于数据集中,通常比异常值更难识别,需要外部数据来识别它们。

问:如何处理异常值?

有几种方法:

  1. 如果离群值是垃圾值,则将其移除。
  2. 你可以试试不同的型号。例如,非线性模型处理异常值的方式可能与线性模型不同。
  3. 您可以标准化数据以缩小范围。
  4. 您可以使用计算异常值的算法,例如随机森林。

问:协同过滤和基于内容的过滤有什么相似之处?不一样?

基于内容的过滤中,您使用对象的属性来查找相似的产品。例如,使用基于内容的过滤,电影推荐器可以推荐相同类型的电影或者由同一导演执导的电影。

协同过滤中,你的行为会与其他用户进行比较,有类似行为的用户会决定向你推荐什么。给一个非常简单的例子,如果你买了一台电视,另一个用户买了一台电视和一个躺椅,你也会被推荐这个躺椅。

问:什么是主成分分析?解释你会用主成分分析来解决哪类问题。

从最简单的意义上来说,PCA 涉及将高维数据(例如 3 维)投影到更小的空间(例如 2 维)。这导致数据的维度降低(2 维而不是 3 维),同时保持模型中的所有原始变量。

PCA 通常用于压缩目的,以减少所需的内存并加速算法,以及用于可视化目的,使汇总数据更容易。

问:验证集和测试集之间有什么区别?

通常,验证集用于调整模型的超参数,而测试集用于评估最终模型。

问:如何避免过度拟合模型?

对于那些不知道的人来说,过度拟合是一种建模错误,当一个函数与数据过于接近时,会导致新数据被引入模型时出现高水平的错误。

有多种方法可以防止模型过度拟合:

  • 交叉验证:交叉验证是一种用于评估模型在新的独立数据集上表现如何的技术。交叉验证最简单的例子是将数据分成两组:定型数据和测试数据,其中定型数据用于构建模型,测试数据用于测试模型。
  • 正则化:当模型具有更高次多项式时,会发生过拟合。因此,正则化*通过惩罚高次多项式来减少过拟合。*
  • 减少特征数量:你也可以通过减少输入特征的数量来减少过度拟合。您可以通过手动移除特征来实现这一点,或者您可以使用一种称为主成分分析的技术,该技术将高维数据(例如 3 维)投影到较小的空间(例如 2 维)。
  • 集成学习技术:集成技术通过 bagging 和 boosting 将许多弱学习者转化为强学习者。通过装袋和增压,这些技术比它们的替代技术更容易过度适应。

问:在应用机器学习算法之前,数据争论和数据清洗的一些步骤是什么?

当数据争论和数据清理时,可以采取许多步骤。下面列出了一些最常见的步骤:

  • 数据剖析:几乎每个人都从了解自己的数据集开始。更具体地说,您可以使用。形状和对数值变量的描述。描述()。
  • 数据可视化:有时,用直方图、箱线图和散点图来可视化数据很有用,可以更好地理解变量之间的关系,也可以识别潜在的异常值。
  • 语法错误:这包括确保没有空格,确保字母大小写一致,检查错别字。您可以使用。unique()或使用条形图。
  • 标准化或规范化:根据您正在处理的数据集和您决定使用的机器学习方法,标准化或规范化您的数据可能会很有用,这样不同变量的不同尺度就不会对模型的性能产生负面影响。
  • 处理空值:有多种方式来处理空值,包括完全删除具有空值的行,用均值/中值/众数替换空值,用新的类别(例如未知)替换空值,预测值,或者使用可以处理空值的机器学习模型。此处阅读更多
  • ****其他还有:去除无关数据,去除重复,类型转换。

问:你应该如何处理不平衡的二进制分类?

有许多方法可以处理不平衡的二进制分类(假设您想要识别少数类):

  • 首先,你要重新考虑你用来评估模型的指标。你的模型的准确性可能不是最好的衡量标准,因为我将用一个例子来解释为什么。假设 99 次银行取款不是欺诈,1 次取款是欺诈。如果你的模型只是简单地将每个实例归类为“非欺诈”,那么它的准确率将达到 99%!因此,您可能需要考虑使用精度和召回率等指标。
  • 另一种改善不平衡二进制分类的方法是通过增加错误分类少数类的成本。通过增加这样的惩罚,该模型应该更准确地对少数民族进行分类。
  • 最后,你可以通过过采样少数阶级或者欠采样多数阶级来改善阶级的平衡。你可以在这里了解更多关于的信息。

问:精确和召回的区别是什么?

****回忆一下试图回答“正确识别实际阳性的比例是多少?”

Precision 试图回答“多大比例的肯定识别实际上是正确的?”

问:为什么均方差不是衡量模型性能的好方法?你有什么建议?

均方误差(MSE)对大误差给予相对较高的权重,因此,MSE 往往过于强调大偏差。更可靠的替代方法是 MAE(平均绝对偏差)。

问:解释什么是假阳性和假阴性。为什么这些对彼此很重要?举例说明什么时候假阳性比假阴性重要,什么时候假阴性比假阳性重要。

一个假阳性是当一个条件不存在时对其存在的不正确识别。

****假阴性是对实际存在的条件不存在的错误识别。

假阴性比假阳性更重要的一个例子是癌症筛查。与其说有人得了癌症,后来才发现没有,不如说有人没得癌症。

这是一个主观的论点,但从心理学的角度来看,假阳性可能比假阴性更糟糕。例如,彩票中奖的假阳性结果可能比假阴性结果更糟糕,因为人们通常并不期望彩票中奖。

问:用于选择正确变量的特征选择方法有哪些?

有两种类型的特征选择方法:过滤方法和包装方法。

过滤方法包括以下几种:

  • 线性判别分析
  • 方差分析
  • 卡方检验

包装方法包括以下几种:

  • 向前选择:我们一次测试一个特性,并不断添加它们,直到我们得到一个合适的为止
  • 反向选择:我们测试所有的特性,并开始移除它们,看看哪个更好

问:简要解释一个基本的神经网络是如何工作的

在其核心,神经网络本质上是数学方程的网络。它接受一个或多个输入变量,并通过一个方程式网络,产生一个或多个输出变量。

作者创建的图像

在神经网络中,有一个输入层,一个或多个隐藏层,以及一个输出层。输入层由一个或多个特征变量(或输入变量或独立变量)组成,表示为 x1,x2,…,xn。隐藏层由一个或多个隐藏节点或隐藏单元组成。节点就是上图中的一个圆圈。类似地,输出变量由一个或多个输出单元组成。

作者创建的图像

就像我一开始说的,神经网络只不过是一个方程网络。神经网络中的每个节点由两个函数组成,一个线性函数和一个激活函数。这是事情变得有点混乱的地方,但是现在,把线性函数想成一些最佳拟合线。另外,把激活功能想象成一个电灯开关,它会产生一个介于 1 或 0 之间的数字。

问:为什么整流线性单位是一个很好的激活函数?

由作者创建

整流线性单元,也称为 ReLU 函数,已知是比 sigmoid 函数和 tanh 函数更好的激活函数,因为它执行梯度下降更快。请注意,在左侧的图像中,当 x(或 z)非常大时,斜率非常小,这会显著降低梯度下降的速度。然而,这不是 ReLU 函数的情况。

问:网络中的权重是如何初始化的?

神经网络的权重必须随机初始化,因为这是随机梯度下降的期望。

如果您将所有权重初始化为相同的值(即 0 或 1),那么每个隐藏单元将获得完全相同的信号。例如,如果所有权重初始化为 0,所有隐藏单元将获得零信号。

问:如果学习率设置得太高或太低会发生什么?

如果学习率太低,您的模型将训练得非常慢,因为在每次迭代中对权重的更新很少。因此,在达到最小值之前,需要进行多次更新。

如果学习率设置得太高,由于权重的剧烈更新,这会导致损失函数出现不期望的发散行为,并且可能无法收敛。

问:什么是递归神经网络?

递归神经网络,也称为 RNNs,是一类允许以前的输出用作输入,同时具有隐藏状态的神经网络。

它们通常用于识别数据中的序列模式,包括时间序列数据、股票市场数据等

问:激活功能的作用是什么?

激活函数的目的是将非线性引入神经元的输出。激活函数通过计算加权和并进一步加上偏差来决定一个神经元是否应该被激活。

结构化查询语言

问:聚合函数和窗口函数有什么区别?

窗口函数类似于聚合函数,它返回聚合值(如 SUM()、COUNT()、MAX())。

窗口函数的不同之处在于它不对结果集进行分组。输出中的行数与输入中的行数相同。

问:ROW_NUMBER 和 RANK 什么时候会给出不同的结果?举个例子。

对于特定的排序值,当分区内有联系时,ROW_NUMBER 和 RANK 将给出不同的结果。

示例:

****SELECT ROW_NUMBER() OVER(ORDER BY GPA) as ROW_NUMBER
SELECT RANK() OVER(ORDER BY GPA) as RANK****

由作者创建

更多类似问题, 查看 StrataScratch**100 个 SQL 问题。**

问:左连接和全外连接可能产生相同的结果吗?为什么或为什么不?

是的。如果第二个表中的每一个行都可以连接到第一个表,并且第一个表中的每一个行都可以使用左连接连接到第二个表,那么对于完全外连接,结果将是相同的。****

问:RANK 和 DENSE_RANK 有什么区别?

RANK 给出了您在有序分区中的排名。平局被分配相同的等级,跳过下一个等级。如果您看到下图,1 之后的下一个等级是 4,因为 3 行的等级是 1。

DENSE_RANK 也给出了有序分区内的等级,但是等级是连续的。如果有包含多个项目的等级,则不会跳过任何等级。您可以在下图中看到这一点,因为使用 DENSE_RANK,迈克尔的排名是 2,而不是 4。

DENSE_RANK 与 RANK 的示例

问:如果我按 SELECT 语句中没有的列进行分组,会发生什么情况?为什么会这样?

您的查询将不会返回任何结果。这是因为作为分组依据的列需要包含在 SELECT 语句中,以便查询可以识别给定列的值。

示例:

**SELECT COUNT(DISTINCT ID)
FROM table
GROUP BY Date**

因为 Date 没有包含在 SELECT 子句中,所以它不会返回任何内容。

问:滞后和超前在什么情况下特别有用?

当您想要比较不同时期的值时,滞后和超前函数非常有用。例如,如果您想将每周的销售额与前几周进行比较。

问:IFNULL 和 COALESCE 有什么区别?

有几个不同之处:

  1. ISNULL 只计算一次,因为是函数。另一方面,COALESCE 表达式的输入值可以计算多次。
  2. 每个结果表达式的数据类型决定是不同的。ISNULL 使用第一个参数的数据类型,而 COALESCE 遵循 CASE 表达式规则,返回优先级最高的值的数据类型。
  3. 最后,ISNULL 和 COALESCE 的验证是不同的。例如,ISNULL 的 NULL 值被转换为 int,这与必须提供数据类型的 COALESCE 不同。ISNULL 只接受 2 个参数,而 COALESCE 接受可变数量的参数。

问:临时表能让你的代码更干净、更快吗?是二者之一,还是没有?为什么?

通常,临时表既快又干净。它比子查询更容易阅读和理解,而且在速度方面,SQL 被优化用于连接而不是子查询。

问:编写 SQL 查询来查找两个事件之间的时间差。

首先,您可以使用 LEAD()或 LAG()函数创建一个要比较的新日期列。

然后,您可以使用 DATEDIFF 来获取这两个事件之间的时间差。

问:创建视图需要在数据库中存储吗?

不,视图不需要数据库中的任何存储,因为它在物理上并不存在。视图唯一需要的空间是存储视图定义的空间,而不是它所表示的数据。

问:在查询数据集时,如何处理空值?

当语句、 IFNULLCOALESCE 时,您可以使用 CASE 查询来处理 NULL。

统计、概率和数学

问:p 值的定义是什么?

p - 是在假设零假设正确的情况下,获得一个检验的观察结果的概率;较小的 p 值意味着有更强的证据支持替代假设。

问:什么是协方差和相关性?它们之间有什么关系?

****协方差是一个变量与其均值的偏差与另一个变量与其均值的偏差相匹配程度的定量度量。

****相关性是两个变量之间关系的度量。它是两个变量的协方差,由每个变量的方差归一化。

问:什么是大数定律?

大数定律是一种理论,它指出随着试验次数的增加,结果的平均值将越来越接近期望值。

正面硬币 100,000 次的翻转次数应该接近 0.5 次而不是 100 次。

问:什么是中心极限定理?解释一下。为什么重要?

中心极限定理表明,无论总体分布的形状如何,随着样本量的增加,样本均值的抽样分布都接近正态分布。

中心极限定理很重要,因为它用于假设检验和计算置信区间。

问:什么是马尔可夫性质?

当对一个随机过程建模时,在这个随机过程中,一个主体随时间做出随机决策,这样的假设被称为马尔可夫属性** **

问:什么是统计能力?

“统计功效”是指二元假设的功效,即假设替代假设为真,测试拒绝零假设的概率。

问:什么是混杂变量?

混杂变量或混杂因素是一种既影响因变量又影响自变量的变量,导致虚假关联,即两个或更多变量相关但无因果关系的数学关系。

问:实验数据如何与观测数据对比?

观察数据来自观察研究,即在没有干预的情况下观察某些变量,并试图确定是否存在相关性。

****实验数据来自实验研究(带干预),就是你控制某些变量并保持它们不变,来确定是否有因果关系。

问:解释选择偏差(关于数据集,而不是变量选择)。为什么重要?丢失数据处理等数据管理程序如何使情况变得更糟?

****选择偏倚是指在选择个人、群体或数据进行分析时,没有实现适当的随机化,最终导致样本不能代表总体的现象。

理解和识别选择偏差是很重要的,因为它会严重扭曲结果,并提供关于特定人群的错误见解。

选择偏差的类型包括:

  • ****抽样偏差:非随机抽样导致的有偏差样本
  • ****时间间隔:选择支持预期结论的特定时间范围。例如,在临近圣诞节时进行销售分析。
  • 暴露**:包括临床易感性偏倚、原发性偏倚、适应症偏倚。这里阅读更多**。**
  • ****数据:包括摘樱桃、压制证据、证据不全的谬误。
  • ****流失:流失偏倚类似于生存偏倚,即只有那些在长期过程中“存活”下来的人才会被纳入分析,或者类似于失败偏倚,即那些“失败”的人才会被纳入分析
  • 观察者选择:与人择原理有关,这是一种哲学上的考虑,即我们收集的关于宇宙的任何数据都要经过过滤,为了使它可以被观察到,它必须与观察它的有意识和有智慧的生命兼容。

处理缺失数据会使选择偏差变得更糟,因为不同的方法会以不同的方式影响数据。例如,如果您用数据的平均值替换空值,您就增加了偏差,因为您假设数据并不像实际可能的那样分散。

问:内插法和外推法的区别是什么,为什么它很重要?

****插值是指使用一组观察值内的输入进行预测。

****外推是指使用一组观察值之外的输入进行预测。

了解两者的区别很重要,因为内插法通常比外推法更准确。

问:举一个例子,中间值比平均值更好衡量

当有许多异常值正或负地扭曲了数据时。

问:什么是生存偏差?

在分析中只包括或排除那些在长期过程中“幸存”下来的样本,从而产生有偏差的样本的现象。

Sreenivasan Chandrasekar 提供的一个很好的例子如下:

“我们注册健身房会员,参加几天。每当我们去健身房时,我们看到许多健康、积极、每天锻炼的人的相同面孔。几天后,我们变得沮丧,为什么我们不能坚持我们的时间表和动机超过一周,而我们在健身房看到的大多数人可以。我们没有看到的是,许多注册健身房会员的人也在一周后停止了健身,我们没有看到他们。”

问:给我介绍一下概率基础知识

八大概率法则

  • 规则#1:对于任何事件 A,0≤P(A)≤1换句话说,一个事件发生的概率范围可以从 0 到 1。
  • 规则 2:所有可能结果的概率总和总是等于 1。
  • 规则#3: P(非 A)= 1—P(A)这个规则解释了一个事件的概率和它的补事件之间的关系。补充事件是指包含 a 中没有的所有可能结果的事件
  • 规则#4:如果 A 和 B 是不相交事件(互斥),那么 P(A 或 B)= P(A)+P(B)这被称为不相交事件的添加规则
  • 规则#5: P(A 或 B) = P(A) + P(B) — P(A 和 B)这就是所谓的一般加法法则。
  • 规则#6:如果 A 和 B 是两个独立事件,那么 P(A 和 B)= P(A) P(B);这叫做独立事件的乘法法则。*
  • 规则#7:给定事件 A,事件 B 的条件概率为 P(B|A) = P(A 和 B) / P(A)
  • 规则#8:对于任意两个事件 A 和 B, P(A 和 B)= P(A) P(B | A)这叫做一般乘法法则*

计数方法

阶乘公式:n!= n x(n-1)x(n-2)x…x 2 x 1 当项目数等于可用位置数时使用。找出 5 个人可以坐在 5 个空座位上的总方法。
= 5 x 4 x 3 x 2 x 1 = 120

基本计数原理(乘法) 当允许重复且填充空位的方式数不受之前填充的影响时,应使用该方法。有 3 种早餐、4 种午餐和 5 种甜点。组合总数= 5 x 4 x 3 = 60

排列:P(n,r)= n!/(n r)! 此方法用于不允许替换且项目排序重要的情况。一个代码有 4 个特定顺序的数字,数字范围从 0 到 9。如果一个数字只能用一次,有多少种排列?
P(n,r) = 10!/(10–4)!=(10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x2 x 1)/(6x 5 x 4 x 3 x2 x 1)= 5040

组合公式:C(n,r)=(n!)/[(n r)!r!] 当不允许替换且项目的排列顺序无关紧要时使用。要赢得彩票,你必须以 1 到 52 的任意顺序选出 5 个正确的数字。有多少种可能的组合?
C(n,r) = 52!/ (52–5)!5!= 2598960

问:什么是根本原因分析?你如何确定原因和相互关系?举例说明。

****根本原因分析是一种解决问题的方法,用于确定问题的根本原因

您可以使用简单的数据分析来确定相关性。然后,你可以通过进行实验来识别原因,以便所有其他变量都被隔离(理想情况下)。

问:你在赌场,有两个骰子可以玩。你每掷一次 5 就赢 10 美元。如果你一直玩到你赢了然后停止,预期的回报是多少?

作者创建的图像

我们假设每次你想玩的时候要花 5 美元。

两个骰子有 36 种可能的组合。在 36 种组合中,有 4 种组合会掷出 5(见蓝色)。这意味着有 4/36 或 1/9 的机会掷出 5。

1/9 的胜算意味着你会输八次,赢一次(理论上)。

因此,您的预期支出等于$ 10.00 * 1-$ 5.00 * 9 =-35.00。

问:给我 3 种类型的统计偏差,并用例子解释每一种。

  • ****抽样偏倚是指由非随机抽样引起的有偏倚的样本。
    举个例子,想象一个房间里有 10 个人,你问他们喜欢葡萄还是香蕉。如果你只调查了三位女性,并得出大多数人喜欢葡萄的结论,你就证明了抽样偏差。

图片由作者创建,图标由 Freepik 提供

  • ****确认偏见:偏爱确认个人信念的信息的倾向。
  • ****存活偏差:在分析中只包括或排除那些在长期过程中“存活”下来的样本,从而产生有偏差的样本的现象。

问:解释什么是长尾分布,并提供三个具有长尾的相关现象的例子。为什么它们在分类和回归问题中很重要?

****长尾分布是一种重尾分布,它有一条(或多条)逐渐渐近消失的尾巴。

3 实际例子包括幂定律、帕累托原则(通常称为 80-20 法则)和产品销售(即最畅销的产品与其他产品相比)。

在分类和回归问题中注意长尾分布是很重要的,因为出现频率最低的值构成了总体的大多数。这最终会改变您处理异常值的方式,并且它也与一些假设数据正态分布的机器学习技术相冲突。

问:什么是 A/B 测试?实践中什么时候用?

A/B 检验是一种统计假设检验,用于 A 和 B 两个变量的随机实验。它通常用于产品开发和营销。

问:你如何控制偏见?

你可以做很多事情来控制和减少偏见。两个常见的事情包括随机化,参与者被随机分配,以及随机抽样,每个成员被选中的概率相等。

问:给定两个公平的骰子,得分总和为 4 的概率是多少?到 8?

滚动 a 4 有 4 种组合(1+3,3+1,2+2):
P(滚动 a 4) = 3/36 = 1/12

有滚安 8 的组合(2+6,6+2,3+5,5+3,4+4):
P(滚安 8) = 5/36

问:给出既不是高斯分布也不是对数正态分布的数据的例子。

  • 任何类型的分类数据都不会有高斯分布或对数正态分布。
  • 指数分布——例如,汽车电池的持续时间或地震发生前的时间。

问:如何评估洞察力的统计显著性?

您将执行假设检验来确定统计显著性。首先,你要陈述零假设和替代假设。其次,您将计算 p 值,即假设零假设为真,获得测试观察结果的概率。最后,您将设置显著性水平(alpha ),如果 p 值小于 alpha,您将拒绝 null 换句话说,结果具有统计显著性。

问:苏格兰的谋杀率从前年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?

由于这是一个泊松分布问题,均值=λ=方差,也就是说标准差=均值的平方根。

  • 95%的置信区间意味着 z 值为 1.96
  • 一个标准偏差= sqrt(115) = 10.724

因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。

问:有多少种方法可以从一副 52 张牌中抽出 6 张牌?

回答

问:如果一个变量有 3 个不同的类别(香草、巧克力、草莓),表示它所需的虚拟变量的最小数量是多少?

你需要 2 个虚拟变量来代表 3 个不同的类别。例如:

  • 巧克力→ x1=1,x2=0
  • 香草→ x1=0,x2=1
  • 草莓→ x1=0,x2=0

问:箱线图和直方图有什么区别?

虽然箱线图和直方图是用于显示数据分布的可视化工具,但它们传达信息的方式不同。

直方图是显示数值变量值的频率的条形图,用于估计给定变量的概率分布。它允许您快速了解分布的形状、变化和潜在的异常值。

箱线图表达了数据分布的不同方面。虽然您无法通过箱线图看到分布的形状,但您可以收集其他信息,如四分位数、范围和异常值。当您想要同时比较多个图表时,箱线图尤其有用,因为它们比直方图占用更少的空间。

问:ACF 和 PACF 的含义是什么?

要理解 ACF 和 PACF,首先需要知道什么是自相关序列相关。自相关着眼于给定时间序列与其自身滞后版本之间的相似程度。

因此,自相关函数(ACF)** 是一种工具,用于发现数据中的模式,具体来说,是指由各种时间滞后分隔的点之间的相关性。例如,ACF(0)=1 意味着所有数据点都与自身完美相关,ACF(1)=0.9 意味着一个点与下一个点之间的相关性为 0.9。**

PACF偏自相关函数的简称。引用 StackExchange 中的一段文字,“它可以被认为是由若干个周期 n 分隔的两个点之间的相关性,但中间相关性的影响已被消除。”比如说。如果 T1 与 T2 直接相关,而 T2 与 T3 直接相关,则似乎 T1 与 T3 相关。PACF 将消除与 T2 之间的关联。

问:对于我们正在考虑的新功能,你会如何设计实验?什么样的指标是重要的?

作者创建的图像

我会进行 A/B 测试,以确定新特性的引入是否会在我们关心的给定指标上带来统计上的显著改进。度量标准的选择取决于功能的目标。例如,可以引入一个功能来提高转换率、web 流量或保留率。

首先,我会制定我的零假设(特征 X 不会改善度量 A)和我的替代假设(特征 X 会改善度量 A)。

接下来,我会通过随机抽样来创建我的控制组和测试组。因为 t 检验天生就考虑样本量,所以我不打算指定一个必要的样本量,虽然越大越好。

一旦我收集了我的数据,根据我的数据的特点,我会进行 t 检验,韦尔奇的 t 检验,卡方检验,或贝叶斯 A/B 检验,以确定我的控制组和测试组之间的差异是否有统计学意义。

问:在任何 15 分钟的间隔中,有 20%的概率你会看到至少一颗流星。你在一小时内看到至少一颗流星的可能性有多大?

15 分钟内看不到任何流星的概率:

= 1 — P(看到一颗流星)
= 1–0.2 = 0.8

一小时内看不到流星的概率:

= (0.8) ^ 4 = 0.4096

一小时内至少看到一颗流星的概率:

= 1 — P(没有看到任何星星)
= 1–0.4096 = 0.5904

问:你从 100 枚硬币中随机抽取一枚——1 枚不公平硬币(正面朝上),99 枚公平硬币(正面朝下),然后掷 10 次。如果结果是 10 头,硬币不公平的概率是多少?

这可以用贝叶斯定理来回答。贝叶斯定理的扩展方程如下:

假设选到不公平硬币的概率表示为 P(A),连续翻转 10 个头像的概率表示为 P(B)。那么 P(B|A)等于 1,P(B∣ A)等于 0。⁵ ⁰,P( A)等于 0.99。

如果填入等式,那么 P(A|B) = 0.9118 或者 91.18%。

问:你如何用一个骰子产生一个介于 1-7 之间的随机数?

如果你掷骰子两次,考虑两次掷骰子的情况,有 36 种不同的结果。如果我们排除组合(6,6),将有 35 种可能的结果。然后,您可以为从 1 到 7 的每个数字分配 5 种组合。

问:有一个游戏,给你两个公平的六面骰子,让你掷骰子。如果骰子上的数值之和等于 7,那么您将赢得 21 美元。但是,每次掷出两个骰子,你都必须支付 5 美元。你玩这个游戏吗?

掷出 7 的几率是 1/6。
这意味着
期望支付 30 美元(5*6)赢得 21 美元。
取这两个数字,预期支付额为-$ 9(21–30)。
由于预期支出是负数,你不应该玩这个游戏。

问:我们有两种在 Newsfeed 中投放广告的选择。方案一:每 25 个故事中,就有一个是 ad。方案二:每个故事都有 4%的几率成为广告。对于每个选项,100 个新闻故事中显示的广告的预期数量是多少?

两种选择的预期赔率都是 4/100。

对于选项 1,1/25 相当于 4/100。
对于选项 2,100 的 4%是 4/100。

问:如果有 8 个重量相等的弹珠和 1 个稍重的弹珠(总共 9 个弹珠),需要称重多少次才能确定哪个弹珠最重?

作者创建的图像

需要称重两次(见上文 A 和 B 部分):

  1. 你将九个弹珠分成三组,每组三个,称其中两组的重量。如果天平平衡(选择 1),你知道重的弹球在第三组弹球中。否则,您将选择权重更大的组(选项 2)。
  2. 然后你将练习同样的步骤,但是你将有三组一个弹球,而不是三组三个。

问:在位置 A 找到一件商品的概率是 0.6,在位置 b 找到一件商品的概率是 0.8。在亚马逊网站上找到该商品的概率是多少?

我们需要对这个问题做一些假设才能回答。让我们假设在亚马逊上有两个可能的地方购买一件特定的商品,在位置 A 找到它的概率是 0.6,在位置 B 找到它的概率是 0.8。在亚马逊上找到该商品的概率可以这么解释:

我们可以把上面的话重新措辞为 P(A) = 0.6,P(B) = 0.8。此外,让我们假设这些是独立的事件,这意味着一个事件的概率不受另一个事件的影响。然后我们可以使用公式…

P(A 或 B) = P(A) + P(B) — P(A 和 B)
P(A 或 B) = 0.6 + 0.8 — (0.6*0.8)
P(A 或 B) = 0.92

问:只知道性别身高,你如何证明男性平均比女性高?

你可以用假设检验来证明男性平均比女性高。

零假设是男性和女性平均身高相同,而另一个假设是男性的平均身高高于女性的平均身高。

然后,您将收集男性和女性身高的随机样本,并使用 t 检验来确定您是否拒绝空值。

问:如果一个项目经理说他们想把新闻订阅的广告数量增加一倍,你如何判断这是不是一个好主意?

您可以通过将用户分成两组来执行 A/B 测试:一组是广告数量正常的对照组,一组是广告数量翻倍的测试组。然后,您将选择指标来定义什么是“好主意”。例如,我们可以说零假设是广告数量翻倍会减少花在脸书上的时间,另一个假设是广告数量翻倍不会对花在脸书上的时间有任何影响。但是,您可以选择不同的指标,如活跃用户数或流失率。然后,您将进行测试,并确定拒绝或不拒绝 null 的测试的统计显著性。

问:一个盒子里有 12 张红卡和 12 张黑卡。另一个盒子里有 24 张红牌和 24 张黑牌。你想从两个盒子中的一个里随机抽取两张卡片,一次抽取一张。哪个盒子得到同色卡片的概率更大,为什么?

有 24 张红卡和 24 张黑卡的盒子获得两张同色卡片的概率更大。让我们走过每一步。

假设你从每副牌中抽出的第一张牌是红色的 a。

这意味着在有 12 个红和 12 个黑的牌组中,现在有 11 个红和 12 个黑。因此,你再抽一张红色的几率等于 11/(11+12)或 11/23。

一副牌中有 24 个红和 24 个黑,那么就有 23 个红和 24 个黑。因此,你再抽一张红色的几率等于 23/(23+24)或 23/47。

由于 23/47 > 11/23,所以卡数较多的第二副牌有较大概率得到相同的两张牌。

问:如何判断给定的硬币是否有偏差?

这不是一个难题。答案很简单,就是进行假设检验:

  1. 零假设是硬币没有偏向,翻转头的概率应该等于 50% (p=0.5)。另一个假设是硬币有偏差,p!= 0.5.
  2. 抛硬币 500 次。
  3. 计算 Z 得分(如果样本小于 30,则需要计算 t 统计量)。
  4. 对比 alpha(双尾检验所以 0.05/2 = 0.025)。
  5. 如果 p 值>α,则不拒绝 null,硬币不偏。
    如果 p 值<α,则 null 被拒绝,硬币有偏差。

让不公平的硬币变得公平

由于抛硬币是二进制的结果,你可以通过抛两次硬币来使不公平的硬币变得公平。如果你掷两次,有两种结果可以赌:正面跟着反面或者反面跟着正面。

P(正面) P(反面)= P(反面) P(正面)**

这是有意义的,因为每一次抛硬币都是一个独立的事件。这意味着如果你得到正面→正面或反面→反面,你需要重新抛硬币。

问:给你 40 张四种不同颜色的卡片——10 张绿卡、10 张红牌、10 张蓝卡和 10 张黄牌。每种颜色的卡片都从一到十编号。随机抽取两张牌。找出所选卡片不是相同号码和相同颜色的概率。

由于这些事件不是独立的,我们可以使用规则:
P(A 和 B) = P(A) * P(B|A),也等于
P(非 A 非 B) = P(非 A) * P(非 B |非 A)

例如:

P(非 4 非黄)= P(非 4) * P(非黄|非 4)
P(非 4 非黄)= (36/39) * (27/36)
P(非 4 非黄)= 0.692

所以,挑出来的牌不是同号同色的概率是 69.2%。

问:医院的感染率高于每 100 人-日感染 1 例被认为是高的。某医院在过去的 1787 人/天中有 10 例感染风险。给出医院是否低于标准的正确片面检验的 p 值。

由于我们查看的是给定时间段内发生的事件数量(感染数量),因此这是一个泊松分布问题。

在一个区间内观察到 k 个事件的概率

零(H0):每人每天 1 例感染
备选方案(H1): >每人每天 1 例感染

*k(实际)= 10 次感染
λ(理论)= (1/100)1787
p = 0.032372 或 3.2372% 计算使用。excel 中的 poisson()或 R 中的 ppois

由于 p 值< alpha (assuming 5% level of significance), we reject the null and conclude that the hospital is below the standard.

Q: You roll a biased coin (p(head)=0.8) five times. What’s the probability of getting three or more heads?

Use the General Binomial Probability formula to answer this question:

General Binomial Probability Formula

p = 0.8
n = 5
k = 3,4,5

P(3 头以上)= P(3 头)+ P(4 头)+ P(5 头)= 0.94 或 94%

问:假设出现在公交车站的人数为泊松分布,平均值为 2.5 人/小时。在四小时内最多出现三人的概率是多少?

x = 3
平均值= 2.5*4 = 10

使用 Excel…

p = poisson.dist(3,10,true)
p = 0.010336

问:艾滋病毒检测的敏感性为 99.7%,特异性为 98.5%。患病率为 0.1%的人群中的受试者获得阳性测试结果。测试的精确度是多少(即他是 HIV 阳性的概率)?

精度方程(PV)

精度=阳性预测值= PV
PV =(0.001 * 0.997)/[(0.001 * 0.997)+((1–0.001)*(1–0.985))]
PV = 0.0624 或 6.24%

问:你正在竞选公职,你的民意调查机构调查了数百人。他们中的 60 个人声称他们会投你的票。你能放松吗?

  • 假设只有你和另一个对手。
  • 另外,假设我们想要 95%的置信区间。这使我们的 z 值为 1.96。

置信区间公式

p-hat = 60/100 = 0.6
z * = 1.96
n = 100
这给了我们一个[50.4,69.6]的置信区间。因此,给定 95%的置信区间,如果你可以接受最糟糕的捆绑情形,那么你可以放松了。否则,你不能放松,直到 100 分中有 61 分说是。

问:盖革计数器在 5 分钟内记录 100 次放射性衰变。找到每小时衰变数的大约 95%的区间。

  • 因为这是一个泊松分布问题,均值=λ=方差,这也意味着标准差=均值的平方根
  • 95%的置信区间意味着 z 值为 1.96
  • 一个标准偏差= 10

因此置信区间= 100 +/- 19.6 = [964.8,1435.2]

问:苏格兰的凶杀率从前年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?

  • 因为这是一个泊松分布问题,均值=λ=方差,这也意味着标准差=均值的平方根
  • 95%的置信区间意味着 z 值为 1.96
  • 一个标准偏差= sqrt(115) = 10.724

因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。

问:考虑双亲异性恋家庭的流感流行。假设父母中至少有一方患病的概率是 17%。父亲感染流感的概率为 12%,而母亲和父亲都感染该疾病的概率为 6%。母亲感染流感的概率有多大?

用概率的一般加法法则:
P(母亲或父亲)= P(母亲)+ P(父亲)— P(母亲和父亲)
P(母亲)= P(母亲或父亲)+ P(母亲和父亲)— P(父亲)
P(母亲)= 0.17+0.06–0.12
P(母亲)= 0.11

问:在感兴趣的人群中,9 名男性的样本产生了 1,100cc 的样本平均脑容量和 30cc 的标准偏差。这个新群体的平均脑容量的 95%学生 T 置信区间是多少?

样本的置信区间

假设置信度为 95%,自由度等于 8,t 值= 2.306

置信区间= 1100 +/- 2.306*(30/3)
置信区间= [1076.94,1123.06]

问:在六周的时间里,9 名受试者服用了减肥药。体重的平均差异(随访-基线)为-2 磅。要使 95% T 置信区间的上端点达到 0,体重差异的标准偏差必须是多少?

*上限=平均值+ t 得分*(标准偏差/sqrt(样本大小))
0 =-2+2.306 (s/3)
2 = 2.306 * s/3
s = 2.601903
因此,标准偏差必须至少约为 2.60,95% T 置信区间的上限才能达到 0。

数据和业务分析

问:如果 iOS 上 70%的脸书用户使用 Instagram,但 Android 上只有 35%的脸书用户使用 Instagram,你会如何调查这种差异?

有许多可能的变量会导致这种差异,我将检查一下:

  • iOS 和 Android 用户的人口统计数据可能会有很大差异。例如,根据 Hootsuite 的调查,43%的女性使用 Instagram,而男性只有 31%。如果 iOS 的女性用户比例明显高于 Android,那么这可以解释这种差异(或者至少是部分差异)。这也适用于年龄、种族、民族、地点等
  • 行为因素也会对差异产生影响。如果 iOS 用户比 Android 用户更频繁地使用手机,他们更有可能沉迷于 Instagram 和其他应用程序,而不是那些在手机上花费时间少得多的人。
  • 另一个需要考虑的因素是 Google Play 和 App Store 有什么不同。例如,如果 Android 用户有明显更多的应用程序(和社交媒体应用程序)可供选择,这可能会导致用户的更大稀释。
  • 最后,与 iOS 用户相比,用户体验的任何差异都会阻止 Android 用户使用 Instagram。如果这款应用对安卓用户来说比 iOS 用户更容易出错,他们就不太可能在这款应用上活跃。

问:在一个平台上的喜欢、用户和花费的分钟数在增加,但用户总数在减少。它的根本原因是什么?

一般来说,你会想从面试官那里获得更多的信息,但是让我们假设这是他/她唯一愿意提供的信息。

关注每个用户的点赞数,有两个原因可以解释为什么这个数字会上升。第一个原因是,随着时间的推移,用户的平均参与度普遍提高了——这是有道理的,因为随着使用该平台成为一种习惯性做法,久而久之的活跃用户更有可能成为忠实用户。每个用户点赞数会增加的另一个原因是分母,即用户总数,在减少。假设停止使用该平台的用户是不活跃的用户,也就是参与度和点赞数低于平均水平的用户,这将增加每个用户的平均点赞数。

上面的解释也适用于在平台上花费的时间。随着时间的推移,活跃用户变得越来越活跃,而很少使用的用户变得不活跃。总体而言,参与度的增加超过了参与度很低的用户。

更进一步说,有可能“参与度低的用户”是脸书能够检测到的机器人。但随着时间的推移,脸书已经能够开发出识别和删除机器人的算法。如果以前有大量的机器人,这可能是这种现象的根本原因。

问:脸书发现赞数每年增长 10%,为什么会这样?

给定年份的总赞数是用户总数和每个用户的平均赞数的函数(我称之为参与度)。

用户总数增加的一些潜在原因如下:由于国际扩张而获得的用户以及随着年龄增长而注册脸书的年轻群体。

参与度增加的一些潜在原因是用户对应用程序的使用增加,用户变得越来越忠诚,新的特性和功能以及用户体验的改善。

问:改变基本会员费会对市场产生什么影响?

让我们举一个主要会员费上涨的例子——有两方参与,买方和卖方。

对于买家来说,提高会员费的影响最终取决于买家需求的价格弹性。如果价格弹性很高,那么给定的价格上涨将导致需求大幅下降,反之亦然。继续购买会员费的买家可能是亚马逊最忠诚和最活跃的客户——他们也可能更加重视 prime 产品。

卖家将受到打击,因为现在购买亚马逊一篮子产品的成本更高了。也就是说,一些产品将受到更严重的打击,而其他产品可能不会受到影响。亚马逊最忠实的顾客购买的高端产品可能不会受到太大影响,比如电子产品。

问:如何定义/选择指标?

没有放之四海而皆准的标准。选择用于评估机器学习模型的度量取决于各种因素:

  • 是回归还是分类任务?
  • 商业目标是什么?精确度与召回率
  • 目标变量的分布是什么?

可以使用的指标有很多,包括调整后的 r 平方、MAE、MSE、准确度、召回率、精确度、f1 分数等等。

问:你正在为每个月上传的用户内容编写一份报告,并注意到 10 月份的上传量有一个峰值。特别是图片上传的高峰。您可能认为这是什么原因造成的,您将如何测试它?

照片上传数量激增的潜在原因有很多:

  1. 一项新功能可能已经在 10 月份实施,它涉及上传照片,并获得了用户的大量关注。例如,提供创建相册能力的功能。
  2. 同样,有可能之前上传照片的过程不直观,在 10 月份得到了改善。
  3. 可能有一场病毒式的社交媒体运动,包括持续了整个 10 月的上传照片。八月天,但更具扩展性的东西。
  4. 这有可能是因为人们上传了自己穿着万圣节服装的照片。

测试的方法取决于尖峰的原因,但是您可以进行假设测试来确定推断的原因是否是实际原因。

多方面的

问:定义以下术语:提升、KPI、稳健性、模型拟合、实验设计、80/20 法则?

****提升:提升是针对随机选择目标模型测量的目标模型的性能的度量;换句话说,lift 告诉你你的模型在预测事物方面比没有模型时好多少。

KPI 代表关键绩效指标,这是一个可衡量的指标,用于确定公司实现其业务目标的情况。错误率。

****健壮性:健壮性通常指系统处理可变性并保持有效的能力。

****模型拟合:指一个模型对一组观察值的拟合程度。

****实验设计:也称为 DOE,是在假设反映变量的条件下,对任何旨在描述和解释信息变化的任务的设计。[4]本质上,实验的目的是根据一个或多个输入(独立变量)的变化来预测结果。

****80/20 法则:又称帕累托原理;80%的结果来自 20%的原因。80%的销售额来自 20%的顾客。

问:定义质量保证和六西格玛。

****质量保证:一项或一组活动,旨在通过减少错误和缺陷来维持期望的质量水平。

****六西格玛:一种特定类型的质量保证方法,由一套用于过程改进的技术和工具组成。六西格玛流程是指所有结果的 99.99966%没有缺陷。

个案研究

案例研究 1:调查用户参与度的下降

要打开 Mode 的 SQL 编辑器,请转到 此链接 并点击显示“打开另一个模式窗口”的超链接。

链接到案例

本案例的目的是确定 Yammer 项目用户参与度下降的原因。在深入研究这些数据之前,您应该先阅读一下 Yammer 的概述这里的。您应该使用 4 张表。

到案例的链接将为您提供关于问题、数据和应该回答的问题的更多细节。

如果您需要指导,请点击此处查看我是如何完成这个案例研究的。

案例研究 2:了解搜索功能

链接到案例

这个案例更侧重于产品分析。在这里,您需要深入研究数据,确定用户体验是好是坏。这个案例的有趣之处在于,由你来决定什么是“好”和“坏”以及如何评估用户体验。

案例研究 3:验证 A/B 测试结果

链接到

最实际的数据科学应用之一是执行 A/B 测试。在本案例研究中,您将深入研究 A/B 测试的结果,其中对照组和治疗组之间存在 50%的差异。在这种情况下,您的任务是在彻底分析后验证或否定结果。

感谢阅读!

如果你喜欢这篇文章,请务必 订阅 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!

恭喜你。你坚持到了最后。我希望你觉得这很有用,因为我花了几个小时在这上面。让我知道你希望下次在评论中看到更多的内容。

一如既往,我祝您在数据科学领域取得最大成就!

不确定接下来要读什么?我为你选了另一篇文章:

** [## 如果我可以重新开始,我会如何学习数据科学(两年内)

尽可能有效地学习数据科学的指南

towardsdatascience.com](/how-id-learn-data-science-if-i-could-start-over-2-years-in-b821d8a4876c)

查看 StrataScratch 了解更多数据科学面试问题:

[## 斯特拉斯克拉奇

编辑描述

platform.stratascratch.com](https://platform.stratascratch.com/?utm_source=blog&utm_medium=click&utm_campaign=terenceshin)

特伦斯·申

122 本来自 SpringerNature 的免费计算机科学 AI、ML、DL 和统计学书籍

原文:https://towardsdatascience.com/122-free-computer-science-ai-ml-dl-statistics-books-from-springernature-38d8554fd5bb?source=collection_archive---------81-----------------------

庆祝斯普林格-自然发行 1000 本免费书籍。

在新冠肺炎疫情期间,开放存取运动得到了巨大的推动。领先的出版物之一 SpringerNature 已经将免费图书的数量增加到超过 1000 本!它包含了海量的书籍,仅计算机科学就有 122 本

SpringerNature 的计算机科学分科书籍的部分内容。

SpringerNature-1000 本书的部分内容。

让我们探索一下在计算机科学的每个子学科中我们都有什么:

1。122 计算机科学书籍

斯普林格的计算机科学书籍的部分列表

2。26 人工智能书籍

斯普林格的人工智能书的部分清单

3。24 本软件工程书籍

Springer 的软件工程书籍的部分列表

4。19 通信网络书籍

斯普林格的通信网络书籍部分列表

5。22 信息系统应用书籍

斯普林格的信息系统应用书籍的部分列表

6。17 编程和操作系统书籍

Springer 的编程和操作系统书籍的部分列表

结论

斯普林格正在领导一场走向开放知识的伟大运动,这是对科学民主化的巨大贡献。希望看到免费发布的额外书籍和学术论文。

Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 TLV 新遗迹公司的首席数据科学家,从事 AIOps 领域的机器和深度学习研究。

数据科学家的 13 个 Conda 命令

原文:https://towardsdatascience.com/13-conda-commands-for-data-scientists-e443d275eb89?source=collection_archive---------25-----------------------

此外,何时使用迷你康达,蟒蛇,康达锻造,以及皮普康达好时光😁

Python 是最受数据科学家欢迎的语言。🐍Conda 是使用 Python 为数据科学家创建虚拟环境和管理包的最常用工具。

不幸的是,找出在您的机器上安装 conda 的最佳方式以及何时从各种渠道安装软件包并不简单。在一个地方找到使用 conda 和 pip 的最有用的命令并不容易。☹️

在本文中,我将提供基本的 conda 命令和建议,以帮助您避免安装和使用方面的麻烦。🎉

有时 Python 虚拟环境和包感觉像一座火山。资料来源:pixabay.com

我们开始吧!🚀

需求

无论是在本地工作还是在云中的服务器上工作,您都需要一个虚拟环境来隔离您的 Python 版本和包,以便您可以:

  1. 对不同的项目使用不同的包版本
  2. 试用最新包装版本
  3. 获得与您的队友相同的 Python 和包版本,这样您的共享代码就可以类似地工作

我一定要用康达吗?

没有。在数据分析和科学计算中很常见,但在外面不那么常见。

有许多工具可以用来管理虚拟 Python 环境。康达、 Venvpyenv、 pipenv诗仙Dockervirtualenv 最为突出。相信我,你不会想掉进这个兔子洞的。🐇

但是如果你必须这么做的话,这里有一个黑客新闻线索让你感受一下其中的乐趣。谷歌云的开发者倡导者 Yufeng G 在 conda、virtualenv 和 pyenv 上有一个很好的视频。

今天我们探索康达,所以让我们开始吧!

蟒蛇

Anaconda 既是软件背后的公司名称,也是功能齐全的软件发行版的名称。Anaconda 公司提供咨询和三个 Anaconda 版本:个人版、团队版和企业版。个体是普遍而强大的。这不像有免费软件。😉我用的就是这个。

发行版:Anaconda vs Miniconda

您可以选择下载并安装两个发行版之一: AnacondaMiniconda

类似

  • Anaconda 和 Miniconda 都将软件包管理器和虚拟环境管理器合二为一。
  • 两者都可以安装在 Windows、Mac 或 Linux 系统上。
  • 两者都安装了 Python 和 pip。

差异

  • Anaconda 发行版安装了许多数据科学常用的 Python 包和工具。Miniconda 没有。这就是包含电池的大下载和没有为你安装很多软件包的最小下载的区别。
  • 2020 年中期,Miniconda 的安装量在 50 到 90 兆字节之间,这取决于你的操作系统。
  • 根据 2020 年中期的文档,Anaconda 发行版需要“至少 5 GB 的磁盘空间来下载和安装”。
  • Anaconda 发行版安装程序还包括安装 GUI 和其他流行软件(如 VSCode 文本编辑器)的选项。

如果您正在开始使用 Python 进行科学计算,并且您的计算机上有足够的空间,我建议您下载 Anaconda 发行版。很多东西,但都是好东西。👍

如果你以前和康达合作过,我建议你下载 Miniconda。您可以随时添加您需要的包。😀

请参见 Anaconda 的安装说明,此处为,Miniconda 的安装说明,此处为

资料来源:pixabay.com

Conda 命令

如果您安装了 Anaconda 发行版,您可以使用 GUI 安装程序,但是我建议使用命令行界面来帮助您更快地工作。你毕竟是一个程序员(或者即将成为一个程序员)!😉

让我们看看创建和管理 conda 环境的常见 conda 命令。无论您安装的是 Anaconda 还是 Miniconda,一切都是一样的。在这一点上都是康达。😀

创造康达环境

conda create -n myenv pandas jupyterlab创建一个名为 myenv 的新 conda 环境,在 conda 主频道上提供最新版本的 Python。将 pandas 和 jupyterlab 软件包安装到环境中。-n--name的简称。

康达要求确认包装变化。当询问您是否要继续时,按y

conda create -n myclone --clone myenv将名为 myenv 的环境复制到名为 myclone 的新环境中。所有的包裹都随车而来!🚙

conda create -n myenv python=3.8用指定的 Python 版本创建一个名为 myenv 的新 conda 环境。安装了 Pip 和大约 15 个其他软件包。

我保证这本指南里只有蛇的图片。资料来源:pixabay.com

管理 conda 环境

conda activate myenv —激活 myenv 虚拟环境。

您可以知道您处于一个活动的虚拟环境中,因为您的命令行提示符将以括号中的虚拟环境名称开始。像这样:

(base) Jeffs-MBP:~ jeffhale$

默认的 conda 环境被命名为 base

Conda 可以设置为在您打开终端时激活环境。安装软件时,安装程序会询问您是否要“通过运行 conda init”来初始化它。我建议你说,这样你的 shell 脚本就会被修改。然后,您将在 conda 环境中开始您的终端会话。

无论您在 on CLI 中的哪个位置导航,您都将处于激活的 conda 虚拟环境中。🎉

conda deactivate —停用当前环境。现在你不会在虚拟环境中。你所处的康达环境仍然存在,你只是不在其中。👍

conda env list —列出康达环境。

conda env remove --name myenv —移除 myenv conda 环境。永远删除。

资料来源:pixabay.com

管理活动环境中的包

在活动的 conda 环境中使用这些命令。这些是我最常用的 conda 命令。😀

conda list —列出活动环境中已安装的软件包。输出包括软件包版本和安装软件包的 conda 通道。👍

康达包装

conda install pandas —从 conda 主频道下载并安装 pandas 包。

conda install -c conda-forge pandas —从 conda-forge 主频道下载并安装 pandas 包。

conda-forge 频道是“一个社区主导的菜谱集合,为 conda 包管理器构建基础设施和发行版。”当一个包在主通道上不存在或者主通道上的版本没有你想要的新时,使用 conda-forge 通道。在康达主频道之前,康达-福吉上的软件包经常会更新。☝️

你也可以指定一些其他的渠道,但是康达-福吉是你会发现很多包的地方。

conda update pandas —从康达主频道下载并安装最新的熊猫包。

conda update all —下载并安装所有已安装软件包的最新版本。如果你有很多过时的包,速度会很慢。⚠️

conda uninstall pandas —在您的 conda 环境中卸载 pandas 软件包。

Pip 是最常见的软件包安装程序。它与 Python 一起发布。

当处于活动 conda 环境中时,pip 会将软件包安装到该活动 conda 环境中。⚠️

pip install -U pandas —从 Python 包索引 PyPI 安装或更新 pandas 包。-U指定更新所有依赖包。

pip uninstall pandas —卸载 pip 安装的 pandas 包。

PyPI 是找到 Python 包最常见的地方。PyPI 经常有不在 conda 或 conda-forge 上的包。PyPI 通常首先获得最新版本的包。

偶尔 conda 会有不在 PyPI 上的包,但这并不常见。

Conda 和 PyPI 包通常可以很好地配合使用。🎉

确保如果你正在安装来自 PyPI 的软件包版本,你还没有从 conda 安装相同的软件包。如果你已经安装了,那么先卸载 conda 版本。否则康达不会用新的 PyPI 版本。默认情况下,conda 官方频道是优先级最高的频道,conda 将首先使用优先级较高的频道的软件包版本。☝️

conda 官方的建议是先尝试从主要的 conda 通道安装包,然后根据需要从 conda-forge 安装包,最后是 pip。这有助于避免冲突。一般来说,从这些来源中的任何一个安装都应该可以正常工作。

如果事情出了岔子

有时候事情会变得一团糟。一般来说,卸载软件包或创建一个新的 conda 环境是你所需要的,以解决这种情况。

如果不起作用,conda update conda更新 conda 软件本身。

如果那不起作用,你可以卸载重新安装 conda。👍

有很多 conda 用户和大量的文档,所以一如既往,搜索引擎是你的朋友。😉

资料来源:pixabay.com

包装

我希望你喜欢这个康达概述。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀

我写关于 PythonSQLDocker 和其他技术主题的文章。如果你对这些感兴趣,请注册我的邮件列表,查看我的 60 多篇文章在这里你可以增长你的技能。👍

资料来源:pixabay.com

祝您愉快!

13 个重要的机器学习面试问题

原文:https://towardsdatascience.com/13-vital-machine-learning-interview-questions-476cf5b0aa43?source=collection_archive---------31-----------------------

赢得任何机器学习职位的面试

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

鉴于对机器学习领域专家的需求增加,越来越多的开发人员开始在这类面试中寻找常见问题。在这个故事中,我列出了我和其他开发人员在申请该领域工作时遇到的典型问题。

Q1。机器学习和深度学习有什么区别?

机器学习是一种使用算法组织数据,从中学习,并对现实世界的问题做出预测的实践。与为每个特定问题找到解决方案相比,机器使用大量数据进行训练,以自行找到解决方案。

深度学习是一种基于人脑原理的机器学习形式。简而言之,深度学习是一种实现机器学习的技术。神经网络是深度学习的重要组成部分,深度学习基于神经元互连的原理。

Q2。精度和召回是什么意思?

简单来说,精度就是相关条目数占条目总数的比例。精度表示相关结果的百分比。所以如果你在谷歌搜索“棕色狗”,十张图片中只有七张是棕色狗,那么精度就是 7/10=0.7。

recall 是所有相关实例中检索到的实例数。在这种情况下,我们从所有可用的正确条目中寻找显示给我们的正确条目。假设有十五页正确的关于棕色狗的内容。因为我们只得到 7 个,所以我们的召回率是 7/15=0.47。

Q3。F1 的分数是多少?你会如何使用它?

在统计分析中,F1 是测试准确性的度量。在机器学习的情况下,它指的是模型的性能。

它是以模型精度和召回率的加权平均值来计算的。接近 1 的结果最好,接近 0 的结果最差。当我们需要在精度和召回率之间寻求平衡,并且存在不均匀的类别分布时,F1 得分是最好的。

Q4。模型精度和模型性能哪个更重要?

这是一个相当简单的难题,可能有很多。模型精度只是模型性能的一部分。精度和性能成正比。因此,更好的性能导致更准确的预测。

Q5。给定一个数据集,如何决定使用哪种机器学习算法?

当然,没有一种更好的算法可以适用于每一种情况。这就是为什么有这么多,每一个都是针对某一个问题或数据集。要决定使用哪一个,请考虑以下问题:

  • 数据集有多大?是连续的还是绝对的?
  • 有标签的,无标签的,还是两者结合?
  • 这个问题与关联、分类、聚类还是回归有关?
  • 算法的目标是什么?

基于这些问题,以下是针对每种情况的一些算法示例:

  • 连续输出->线性回归
  • 分类输出->决策树,KNN,随机森林,逻辑回归,朴素贝叶斯
  • 聚类输出-> K 均值聚类,层次聚类,PCA
  • 非线性交互数据->升压、打包
  • 输出是一个关联->先验
  • 输出的是图像(音频)->神经网络

Q6。你最喜欢的算法是什么?两分钟之内解释清楚。

概括复杂观点并以简单易懂的方式解释它们的能力经常在面试中受到考验。对于这些类型的问题,确保你有几个你能很好解释的算法。此外,在短时间内练习解释它们。

Q7。如何处理数据集中丢失或损坏的数据?

如果在数据集中发现丢失或损坏的数据,可以删除这些行或列。或者,您可以选择用另一个值来替换它们。

例如,在 Pandas 中,isnull()dropna()将帮助您找到丢失或损坏数据的数据列,并删除它们。您也可以使用fillna()将这些值替换为零。

Q8。数组和链表有什么区别?

所有类型的面试都会测试数据结构,所以为此做好准备通常是个好习惯。

一个数组是一组相似的数据对象,以一个共同的变量名顺序存储。

链表是一种包含元素序列的数据结构,其中每个元素都链接到下一个元素。链表中的每一项通常包含两个字段:数据字段和到下一项的链接。

最显著的区别是这两者的存储方式。数组有固定的大小,必须在使用之前声明。另一方面,链表可以单独存储,所以它总是可以扩展的。

Q9。什么是决策树分类?

决策树以树形结构构建模型。数据被分解成更小的子集,这些子集遵循具有节点和分支的树的结构。数值和分类数据都可以用决策树来处理。

Q10。决策树中的修剪是什么?是怎么做到的?

修剪意味着通过删除树中多余或不重要的部分来简化或压缩决策树。它可以防止过度拟合,从而提高精度。

修剪有两种方式(方向):

  • 自下而上—从树叶开始向上。
  • 自上而下—从房间开始向下。

提到任何剪枝算法,例如减少错误剪枝,将展示对该概念的实际理解。确保快速解释,同时提及其中最重要的部分。

Q11。比较 K-均值和 KNN 算法。

  • K-means 是无监督的。KNN 在自然界是受监督的。
  • K-means 是一种聚类算法,而 KNN 是一种分类算法。
  • 在 K-中,意味着每个聚类中的点是相似的,而聚类彼此不同。KNN 根据 K 个周围邻居对未标记的观察值进行分类。

Q12。你最近读过的机器学习论文有哪些?

这类问题旨在发现你是否真的对机器学习充满热情。跟上最新的科学文献来证明你对这个职位的兴趣是很重要的。

搜索一些可信的研究论文,并确保你很好地理解它们。一般来说,最好是阅读与你的研究和工作领域相关的文献。

Q13。你通常在哪里搜索数据集?

如果你真的对这个领域充满热情,你一定已经独立完成了几个项目。这个问题是用来更好地了解你的兴趣,这是一个展示你的知识和提及你过去的项目的机会。看看外面有什么,并准备好谈论它。

最后的想法

你可能已经注意到了,并不是面试中的每个问题都是为了测试你的编程技能。拥有适当的技能是必不可少的,然而,对概念的理解和对机器学习的普遍兴趣同样重要。

你永远不知道你会在面试中得到哪些确切的问题,然而,这些问题往往会重复出现。很有可能你会在下一次面试中遇到这些问题或类似的问题。一定要练习,花时间去理解这些概念。

参考资料:

[1] Copeland,M. (2016 年)。人工智能、机器学习和深度学习有什么区别?2020 年 8 月 27 日检索,来自https://blogs . NVIDIA . com/blog/2016/07/29/whats-difference-人工智能-机器学习-深度学习-ai/

[2]维尔马,E. (2020)。机器学习面试问答。检索于 2020 年 8 月 27 日,来自https://www . simpli learn . com/tutorials/machine-learning-tutorial/machine-learning-interview-questions

[3]霍尔,J. (2017)。机器学习:修剪决策树。2020 年 8 月 27 日检索,来自https://www . displayr . com/machine-learning-pruning-decision-trees/

130,780 点量子分类

原文:https://towardsdatascience.com/130-780-point-quantum-classification-ddeea767adb1?source=collection_archive---------41-----------------------

使用真实世界数据集的量子分类

博士后研究员维沙尔·夏尔马博士最近通过 LinkedIn 短信问我关于量子分类的问题。我不会透露他的 5 列、26,156 行数据集的任何信息,除了它的大小——总共 130,780 个数据点——但我会透露我与他分享的修改后的算法。

介绍

量子计算和机器学习是两个截然不同的领域。虽然他们很好地互相恭维,但有可能只熟悉其中一个而不熟悉另一个。因此,在简要介绍量子分类之前,简要介绍一下分类可能是有益的。

对分类的一个过于简单的描述是,我们有许多被分成类(组)的数据点,我们有新的数据要分配给一个现有的组。通常,该新数据是单个数据点,就像已经分组在一起的所有其他单个数据点一样,尽管也可以将新组分配给现有组。

因此,量子分类是使用量子处理器或其模拟来执行这项任务。由于这两个领域与线性代数的关系,量子计算有望在机器学习任务中表现出色。

ibmq _ 16 _ 墨尔本

我最初的意图是在 NISQ 处理器和量子计算模拟器上运行这个算法,并比较运行时间,但很快就发现这是不可能的。

该电路将一个测试状态与一个等级进行比较。因为可用的量子位数量有限,所以每个类只能运行一次。

前五个量子位各自代表来自数据集的一个类别的一个特征,后五个量子位各自代表来自测试数据点的一个特征。最后一个量子位是用于交换测试的辅助量子位,用于确定测试数据与类数据的接近程度。每个 Fredkin 门(受控交换)使用 ancilla 量子位作为其控制,并使用代表与目标量子位相同特征的量子位。

这是传输电路的样子。Fredkin 门不仅会在传输过程中显著增加电路深度,而且处理器的有限连接性还需要许多额外的交换操作。

因为整体电路深度,结果毫无价值。当状态相同时,交换测试测量|0 >的概率为 1,当状态最大程度相反时,测量|0 >的概率为 0.5,但是测量| 0 >的概率远低于 0.5。那是错误的。

ibmq_qasm_simulator

因为 32 量子位 IBM Q Experience simulator 允许重置门(NISQ 处理器不允许),所以可以在一个电路中比较多个类别的测试数据。重置操作还减少了需要模拟的量子位的数量,这可以大大减少大型电路的运行时间。

第一轮没有使用重置门,因为量子位是刚刚初始化的,但下面是每个类别比较的工作方式:

  1. 初始化或重置类数据和测试数据量子位
  2. 使用 RY 旋转将数据映射到相应的量子位;因为每个类比较的测试数据保持不变,所以“set”块是一个简化 OpenQASM 代码的子例程
  3. 将每个测试特征与每个类特征进行比较;“test”块是一个子程序,它执行与上面的 ibmq_16_melbourne 电路所示相同的 Hadamard 操作和交换测试
  4. 在这个裁剪的电路中没有显示:测量控制量子位“ax”,这是用于交换测试的辅助量子位

算法

该算法需要适度的经典预处理。因为我收到了 CSV 文件中的数据,所以我在 Excel 中打开它并在那里进行计算。MIN、MAX 和 AVERAGE 等函数使用起来很简单,甚至连归一化函数也只是减法和除法。

  1. 计算每个要素的全局最小值和全局最大值
  2. 计算每个类每个要素的平均值
  3. 选择测试数据
  4. 使用全局最小值和最大值归一化平均值,并使用公式((输入-最小值)/(最大值-最小值))测试从 0 到 1 的数据点
  5. 将量子位围绕 y 轴旋转归一化值乘以π;对类别数据的每个特征使用一个量子位,对测试数据的每个特征使用一个量子位
  6. 使用交换测试逐个功能地将测试数据与类数据进行比较
  7. 测量| ^ 0 >概率最高的交换测试是最接近测试数据的类

当然,你可以在 Python 中完成所有这些,但是我更喜欢在 OpenQASM 中完成所有与量子计算相关的工作,这样就可以把重点放在电路上了。

了解数据

因为我对 SWAP 测试很熟悉,并且我相信这种算法应该可行,所以我发现了一个数据问题,这些数据可能对寻求其他机器学习方法有所帮助。简而言之,标准化的数据太接近了。因此,任何测试数据点都可能被归类为任何类别,就好像算法只是随机生成结果一样。没有一个测试结果是准确的。

幸运的是,可以选择一部分数据来解决这个问题,而不会影响结果。这允许规范化的值之间有一点空间,我终于开始看到准确的分类。

结果和结论

我通常在我的文章中包含直方图,但是这个项目需要太多的测试。相反,我将总结我的发现。

如果您直观地检查测试数据和类数据,您会看到该算法准确地将明显属于某个类的测试数据分类。当测试值介于类值之间时,精确度会降低。有些数据看起来可以用一种方式分类,但却用不同的方式标注。我对数据了解不多,不知道为什么会这样,但我不认为这是一个算法问题。数据点理所当然地更接近其他标签,而不是自己的标签。

未来工作

Sharma 博士最初询问了量子限制玻尔兹曼机器(QRBM),但我对交换测试更熟悉,所以我向他介绍了这种方法。当然,将我的方法与 QRBM 实现以及 scikit-learn 实现进行比较会很有趣。简单的 QRBM 似乎有可能在 NISQ 处理器上工作,这肯定会很有趣。

鸣谢

所有图片均来自 IBM Q Experience。

14 天隔离期间要做的 14 个数据科学项目

原文:https://towardsdatascience.com/14-data-science-projects-to-do-during-your-14-day-quarantine-8bd60d1e55e1?source=collection_archive---------2-----------------------

2020 年发展新技能和强化你的投资组合的终极项目清单

Unsplash 上由 Austin Distel 拍摄的照片

一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!

首先,我想对所有的护士、医生、杂货店店员、公共行政人员和其他任何冒着生命危险为社区服务的人大声疾呼。

我们不要认为这是理所当然的。把这段时间单独拿出来学习新技能,看书,提升自己。对于那些对数据、数据分析或数据科学感兴趣的人,我提供了一个 14 个数据科学项目的列表,你可以在业余时间做这些项目!

有三种类型的项目:

  1. 可视化项目
  2. 探索性数据分析(EDA)项目
  3. 预测建模

可视化项目

也许最快完成的项目是数据可视化!下面是三个有趣的数据集,你可以用它们来创建一些有趣的可视化效果,添加到你的文件夹中。

冠状病毒可视化

难度:容易
链接到数据集这里

了解如何使用 Plotly 构建动态可视化,以显示冠状病毒如何像上面这样随着时间的推移在全球传播!Plotly 是一个了不起的库,它使数据可视化变得动态、吸引人和简单。

如果你想学习如何建立一个像上面这样的可视化,查看我的教程 这里

我的朋友 Jack 也写过一篇预测冠状病毒复苏的文章 这里

澳大利亚野火可视化

难度:容易
链接到数据集这里

摘自 Vox

2019-2020 森林火灾季节,也被称为黑色夏天,由 2019 年 6 月开始的几次极端野火组成。据维基百科报道,这场大火烧毁了大约 1860 万公顷土地和超过 5900 栋建筑

这是一个有趣的项目!使用 Plotly 或 Matplotlib 利用您的数据可视化技能来显示野火的规模和地理影响。

在这里 看看我的朋友杰克是如何预测巴西的野火模式

一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!

地表温度可视化

难度:容易-中等
链接到数据集这里

照片由威廉·博森Unsplash 上拍摄

有否认气候变化的人吗?创建一些数据可视化来显示地球表面温度如何随时间变化。你可以通过创建一个线形图或另一个动画 Choropleth 地图来做到这一点!

额外收获:创建一个预测模型,显示五十年后地球的预期温度。

探索性数据分析项目

探索性数据分析(EDA),也称为数据探索,是数据分析过程中的一个步骤,其中使用了多种技术来更好地理解所使用的数据集。

如果你想了解更多关于 EDA 的知识,可以查看我的指南 这里

纽约 Airbnb 数据探索

难度:中等
链接到数据集这里

奥利弗·尼布赖特在 Unsplash 上拍摄的照片

自 2008 年以来,客人和主人一直使用 Airbnb 来拓展旅行的可能性,并提供更个性化的体验世界的方式。该数据集包含 2019 年纽约房源及其地理信息、价格、评论数量等信息。

您可以尝试回答以下一些问题:

  • 哪些主机最忙,为什么?
  • 哪些区域的流量比其他区域大,为什么会这样?
  • 价格、评论数量和某个列表被预订的天数之间有什么关系吗?

与员工流失和绩效相关的最重要因素

难度:简单的
链接到数据集这里

活动创建者Unsplash 上拍摄的照片

IBM 创建了一个合成数据集,您可以使用它来了解各种因素如何影响员工流失和满意度。一些变量包括教育、工作投入、绩效评级和工作生活平衡。

探索这个数据集,看看是否有任何重要的变量确实影响员工满意度。更进一步,看看你是否能从最重要到最不重要排列变量。

世界大学排名

难度:容易
链接到数据集这里

瓦西里·科洛达Unsplash 上拍摄的照片

你认为你的国家有世界上最好的大学吗?成为“最好的”大学意味着什么?该数据集包含三个全球大学排名。使用这些数据,看看你能否回答以下问题:

  • 顶尖大学在哪些国家?
  • 决定一个人世界排名的主要因素是什么?

一定要 订阅 千万不要错过另一篇关于数据科学的文章,包括指南、诀窍和技巧、生活经验等!

酒精和学业成功

难度:容易
链接到数据集这里

照片由凯文·凯利Unsplash 上拍摄

酒精对学生成绩有影响吗?如果不是,那是什么?这一数据是在对中学数学和葡萄牙语课程学生的调查中获得的。它包含几个变量,如酒精消费,家庭规模,课外活动。

利用这个,探究学校成绩和各种因素的关系。作为奖励,看看你能否根据其他变量预测学生的最终成绩!

口袋妖怪数据探索

难度:简单的
链接到数据集这里

取自 Pokemon.com

对于所有的游戏玩家来说,这里有一个数据集,包含了所有七代 802 个口袋妖怪的信息。这里有几个问题你可以试着回答一下!

  • 哪一代人的口袋妖怪最强?哪个最弱?
  • 什么口袋妖怪类型最强?最弱的?
  • 有没有可能建立一个分类器来识别一个传说中的口袋妖怪?
  • 身体特征和力量统计(攻击、防御、速度等)之间有关联吗?)?

探索预期寿命的因素

难度:容易
链接到数据集这里

世卫组织创建了一个所有国家的健康状况数据集,包括预期寿命、成人死亡率等统计数据。使用该数据集,探索各种变量之间的关系。对寿命影响最大的是什么?

创建此数据集是为了回答以下问题:

  1. 最初选择的各种预测因素真的会影响预期寿命吗?实际影响预期寿命的预测变量有哪些?
  2. 一个预期寿命值较低(< 65 岁)的国家是否应该增加医疗支出以提高其平均寿命?
  3. 婴儿和成人死亡率如何影响预期寿命?
  4. 寿命与饮食习惯、生活方式、运动、吸烟、饮酒等有正相关还是负相关?
  5. 上学对人类的寿命有什么影响?
  6. 寿命与饮酒有正相关还是负相关?
  7. 人口稠密的国家的预期寿命会更低吗?
  8. 免疫覆盖率对预期寿命有什么影响?

查看我关于 用回归 预测寿命的文章获取灵感!

预测建模

能源消费的时间序列预测

难度:中高级
链接到数据集这里

马太·亨利Unsplash 上的照片

该数据集由 PJM 网站的功耗数据组成。PJM 是美国的一个区域性传播组织。使用这个数据集,看看是否可以建立一个时间序列模型来预测能源消耗。除此之外,看看你是否能发现一天中几个小时的趋势,假日能源使用,以及长期趋势!

贷款预测

难度:容易
链接到数据集这里

德米特里·德米德科在 Unsplash 拍摄的照片

该数据集取自 Analytics Vidhya,包含 615 行和 13 列过去已批准和未批准的贷款。看看你能否创建一个模型来预测贷款是否会被批准。

二手车价格评估员

难度:中等
链接到数据集这里

帕克·吉布斯在 Unsplash 上的照片

Craigslist 是世界上最大的二手车销售网站。这个数据集由 Craigslist 搜集的数据组成,每隔几个月更新一次。使用这个数据集,看看是否可以创建一个数据集来预测一个汽车列表是过高还是过低。

查看我预测二手车价格的模型 这里

检测信用卡欺诈

难度:中高级
链接到数据集这里

照片由rupixen.comUnsplash 上拍摄

该数据集显示了两天内发生的交易,284,807 笔交易中有 492 笔欺诈。数据集高度不平衡,正类(欺诈)占所有交易的 0.172%。了解如何处理不平衡数据集并构建信用卡欺诈检测模型。

皮肤癌图像检测

难度:高级
链接到数据集这里

照片由艾莉·史密斯Unsplash 上拍摄

有了超过 10,000 张图像,看看你能否建立一个神经网络来检测皮肤癌。这绝对是最困难的项目,需要大量的神经网络和图像识别知识。提示:如果你被卡住了,可以参考其他用户创建的内核!

感谢阅读!

一定要 订阅 千万不要错过另一篇关于数据科学的文章,包括指南、诀窍和技巧、生活经验等!

如果你喜欢我的工作,想支持我…

Seaborn 的 14 个数据可视化图

原文:https://towardsdatascience.com/14-data-visualization-plots-of-seaborn-14a7bdd16cd7?source=collection_archive---------4-----------------------

警察调查数据并从中提取信息和趋势的工具。

绿色代表新的开始成长。它也象征着更新富足

数据可视化在数据挖掘中起着非常重要的作用。各种数据科学家花时间通过可视化来探索数据。为了加快这一进程,我们需要对所有地块进行详细记录。

如果没有规划和架构,即使是大量的资源也无法转化为有价值的商品。因此,我希望这篇文章能为你提供一个良好的架构,包括所有的情节和它们的文档。

内容

  1. 简介
  2. 了解你的数据
  3. 分配图
    a .分配图
    b .联合图
    c .配对图
    d .地毯图
  4. 分类图
    a .小节图
    b .计数图
    c .方框图
    d .小提琴图
  5. 高级地块
    a .带状地块
    b .群体地块
  6. 矩阵图
    a .热图
    b .聚类图
  7. 网格
    a .刻面网格
  8. 回归图

介绍

Seaborn 是基于 matplotlib 的 Python 数据可视化库。它提供了一个高层次的界面来绘制有吸引力的和信息丰富的统计图形。

对于 Seaborn 的安装,您可以在命令行中运行以下命令。

pip install seaborn
conda install seaborn

要导入 seaborn,您可以运行以下命令。

import seaborn as sns

了解您的数据

这些图中使用的数据集就是著名的 泰坦尼克号数据集 (图 1)。此后,数据集由变量“ df ”表示。

图 1:泰坦尼克号数据集

分布图

这些图表帮助我们形象化数据的分布。我们可以用这些图来理解数据的均值、中值、范围、方差、偏差等。

a.距离图

  • 距离图给出了所选连续变量的直方图。
  • 这是一个单变量分析的例子。
  • 我们可以改变柱的数量,即直方图中垂直条的数量
import seaborn as sns
sns.distplot(x = df['age'], bins = 10)

图 2:乘客“年龄”的分布图。

  • 这里 x 轴是年龄,y 轴显示频率。例如,对于 bins = 10,大约有 50 个人的年龄在 0 到 10 岁之间

b.联合地块

  • 它是两个变量的距离图的组合。
  • 这是双变量分析的一个例子。
  • 我们另外获得了变量之间的散点图,以反映它们的线性关系。我们可以将散点图定制为六边形图,其中颜色强度越大,观察次数就越多。
import seaborn as sns
# For Plot 1
sns.jointplot(x = df['age'], y = df['Fare'], kind = 'scatter')# For Plot 2
sns.jointplot(x = df['age'], y = df['Fare'], kind = 'hex')

图 3:“年龄”和“费用”之间的联合曲线图

  • 我们可以看到年龄和票价之间没有合适的线性关系。
  • kind = 'hex '提供六边形图,kind = 'reg '在图上提供回归线。

c.配对图

  • 它获取数据的所有数字属性,并绘制两个不同变量的成对散点图和相同变量的直方图。
import seaborn as sns
sns.pairplot(df)

图 4:泰坦尼克号数据集的配对图

d.地毯图

  • 它绘制了一个破折号,而不是 distplot 中的均匀分布。
  • 这是一个单变量分析的例子。
import seaborn as sns
sns.rugplot(x = df['Age'])

图 5:乘客“年龄”的地毯图

分类图

这些图帮助我们理解分类变量。我们可以用它们进行单变量和双变量分析。

a.条形图

  • 这是双变量分析的一个例子。
  • 在 x 轴上,我们有一个分类变量,在 y 轴上,我们有一个连续变量。
import seaborn as sns
sns.barplot(x = df['Sex'], y = df['Fare'])

图 6:“费用”和“性别”的条形图

  • 我们可以推断女性的平均费用高于男性。

b.计数图

  • 它计算分类变量出现的次数。
  • 这是一个单变量分析的例子。
import seaborn as sns
sns.countplot(df['Pclass'])

图 7:存活和“P 级”的计数图。

c.箱形图

  • 这是一个 5 点概要剧情。它给出了关于连续变量的最大值、最小值、平均值、第一个四分位数和第三个四分位数的信息。此外,它还为我们提供了离群值的知识。
  • 我们可以绘制单个连续变量的曲线图,也可以根据连续变量分析不同的分类变量。
import seaborn as sns
#For plot 1
sns.countplot(df['Pclass'])#For plot 2
sns.boxplot(y = df['Age'], x = df['Sex'])

图 8: a)年龄的箱线图,b)年龄的性别的不同类别的箱线图

d.小提琴情节

  • 它类似于箱线图,但它也提供了关于分布的补充信息。
import seaborn as sns
sns.violinplot(y = df['Age'], x = df['Sex'])

图 9:年龄和性别之间的小提琴图

高级绘图

顾名思义,它们是先进的,因为它们应该融合分布和分类编码。

a.带状图

  • 这是一个连续变量和分类变量之间的图。
  • 它绘制成散点图,但补充使用分类变量的分类编码。
import seaborn as sns
sns.stripplot(y = df['Age'], x = df['Pclass'])

图 10:“年龄”和“P 级”之间的带状图

  • 我们可以观察到,在 1 班和 2 班,10 岁左右的儿童不在,60 岁以上的人大多被安排在 1 班。
  • 通常,这些类型的观测值用于估算缺失值。

b.群体图

  • 它是一个条形情节和小提琴情节的结合。
  • 除了数据点的数量,它还提供了它们各自的分布。
import seaborn as sns
sns.swarmplot(y = train['Age'], x = train['Pclass'])

图 11:“年龄”和“P 级”之间的群体图

矩阵图

这些是使用二维矩阵数据进行可视化的特殊类型的绘图。由于矩阵数据的维数很大,很难从矩阵数据中分析和生成模式。因此,通过为矩阵数据提供颜色编码,该过程变得更加容易。

a.热图

  • 在给定的原始数据集“df”中,我们有七个数值变量。那么,让我们生成这七个变量之间的相关矩阵。
df.corr()

图 12:相关矩阵

  • 尽管只有 49 个值,但读取每个值似乎非常困难。当我们遍历成千上万个特征时,复杂性就加剧了。那么,让我们试着实现一些颜色编码,看看解释变得有多容易。
sns.heatmap(df.corr(), annot = True, cmap = 'viridis')

图 titanic 数据集相关矩阵的热图。

  • 同一个矩阵现在表达了更多的信息。
  • 另一个非常明显的例子是使用热图来理解缺失的价值模式。在图 14 中,黄色破折号代表一个丢失的值,因此它使我们的任务更容易识别丢失的值。
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

图 14:泰坦尼克号数据中缺失值的热图。

b.聚类图

  • 如果我们有一个矩阵数据,并希望根据相似性对一些要素进行分组,聚类图可以帮助我们。一次,看一下热图(图 13),然后看一下聚类图(图 15)。
sns.clustermap(tran.corr(), annot='True',cmap='viridis')

图 15:钛数据相关矩阵的聚类图

  • x 标签和 y 标签是相同的,但它们的协调方式不同。这是因为它们是根据相似性进行分组的。
  • 顶部和左侧的流程图结构描述了它们的相似程度。
  • 聚类图使用层次聚类形成不同的聚类。

网格

网格图为我们提供了对可视化的更多控制,并用一行代码绘制了各种各样的图形。

a.小平面网格

  • 假设我们要绘制所有三种船票中男性和女性的年龄分布图。因此,我们总共会有 6 张图。
sns.FacetGrid(train, col = 'Pclass', row = 'Sex').map(sns.distplot, 'Age')

图 16:“性别”和“P 级”等级的“年龄”分布图

  • 小平面网格根据要求提供非常清晰的图形。
  • sns。FacetGrid ( = ' ', = ' ',数据 = data)提供了一个包含中所有唯一类别的空网格。后来,我们可以使用不同的情节和共同的变量为特殊的变化。

回归图

这是一个更高级的统计图,提供了散点图以及对数据的线性拟合。

sns.lmplot(x = 'Age', y = 'PassengerId', data = df, hue = 'Sex)

图 17:男性和女性的年龄和乘客 ID 之间的回归图。| 免责声明:回归年龄和乘客 id 是有意义的。这只是理解可视化的目的。

图 17 显示了男性和女性的乘客 ID 和年龄之间的线性回归拟合。

包裹

在本文中,我们看到了使用 seaborn 的 14 种不同的可视化技术。

我相信数据可视化增强了我们对数据解释的理解和潜力。它为我们提供了更令人满意的技能来表示数据、估算缺失值、识别异常值、检测异常等等。

数据分析师就像警察一样,需要询问数据并通过数据提取信息。拥有乐观的工具来完成这项工作是极其必要的。因此,我希望这篇文章可以作为一种工具来询问您的数据。

有关探索性数据分析的指南,请访问-

[## EDA 理论指南

探索性数据分析完全指南

towardsdatascience.com](/the-eda-theoretical-guide-b7cef7653f0d)

有关数据科学、机器学习、编程的此类内容,请访问 y youtube 频道。

[## 阿尤什·奥斯特瓦尔

合十礼!!!🙏🙏这个频道是给想学数据科学和机器学习的人看的。我已经花了很多…

www.youtube.com](https://www.youtube.com/channel/UCqq_T7ktsZO62k7CaibgQvA/)

快乐学习!

14 种深度和机器学习的使用使 2019 年成为一个新的人工智能时代。

原文:https://towardsdatascience.com/14-deep-learning-uses-that-blasted-me-away-2019-206a5271d98?source=collection_archive---------2-----------------------

比格根、塞勒根、斯泰尔根、高根、艺术育种家、德奥迪菲等。:我非常私人的清单(包括奖金)。

T T ime 的流动比我们想象的要快。对摩尔定律有好处。但仍有很多要赶上。在下面,我想列出我在机器学习和深度学习领域在 2019 年发生的伟大事情(和——抱歉作弊——2018 年也有一些)。这些大多是基于神经网络的模型,让我印象深刻。

首先,这里是伊恩·古德菲勒的一条推文,完美地展示了深度学习的成就。

即使是关于一个特定的话题:生成性对抗网络的进展,这种进展很好地展示了已经发生的事情,以及将要发生的事情。一图抵千言。

我有一种感觉,2019 年比往年更加激烈。以下是一些让我惊喜交集的进展,但顺序并不特别。

免责声明 1: 我是数据科学的新手。因此,如果我错过了以下主题的一些重要讨论,请随时用参考链接来补充本文。
免责声明 2: 这是模型、网络、实现和实验的混合。它们通常是相互关联的。其中一些是另一个的核心。《走向数据科学》的作者已经很好地介绍了其中一些。你在这里看到的是过去 1-2 年里给我留下深刻印象的 DL/ML 故事。
免责声明 3: 正如你会注意到的,我列表中的 AI 进步大部分是指视觉媒介(图像生成和修改)。2019 年也是自然语言处理(OpenAI 等的 GPT-2)的重要里程碑。),但那是我很快会谈到的另一个大话题)。

1.比根

这是关于什么的: 比根扩大生成对抗网络——并允许你生成新的视觉效果,在巨大的视觉数据库上接受训练。系统的核心是两个神经网络:生成器鉴别器生成器创建新的视觉效果,并试图说服鉴别器这是真实的镜头。鉴别器将生成的图像与其“经验”对齐,并作为“未通过”发回给生成器。这种反复的相互作用一直持续到某种“共识”。

尝试一下:使用这个 BigGAN 笔记本,你可以使用 【类别条件采样】 并创建例如山谷的图像:

结果是惊人的:

比根生成的图像

在我这篇文章的标题中,还可以看到 BigGAN 生成的时钟。

如你所见,还是弱 AI 。网络不知道时钟是什么。他们只是知道,这东西怎么可能长得像:“roundish”,“有字有箭”。

我看到解释世界的尝试和 柏拉图的形式/理念**** 理论之间明显的相似之处:

观念或形式是物质事物的超物质本质。物质的东西不是原创的,只是想法/形式的模仿。

我的报道本话题( 【朋友链接】 ):

** [## 作为创意引擎的比根

的确,2018 年可以被称为人工智能创造真正创造力的开始。

medium.com](https://medium.com/merzazine/biggan-as-a-creative-engine-2d18c61e82b8)**

2.和比根一起变形。

****这是怎么回事:我们可以走得更远,不仅仅是生成带标签的图像。我们可以使用插值函数用 BigGAN 对事物进行合并和变形。在 BigGAN 的情况下,生成的图像 A 到生成的图像 B 的转换是可能的,无论它们在语义上如何不同。

****试试看:用同一个比根笔记本插值功能。

使用这些设置,可以将约克夏梗转化为航天飞机

这种方法带来了前所未有的可能性,超出了人类的想象。你甚至可以制作更多渐变的画面——并把它们组合成动画片段(更多信息,请查看扎伊德·阿利亚菲的《可乐布笔记本》)

我对这个话题的报道:

** [## 比根和万物的变形

数字变形

medium.com](https://medium.com/merzazine/biggan-and-metamorphosis-of-everything-abc9463125ac)**

3.风格转移

这是怎么回事: 风格转移是在给定一组风格定义图像后,对输入的基础图像进行变换的神经技术:将图像 A 的一种风格转移到图像 b。

试试看: Colab 笔记本。也有各种免费的和商业的基于数字图书馆的应用程序将你的图像转换成世界艺术大师的作品。

我用各种艺术家的风格转换了我的用户照片,得到了令人信服的结果:

凡·高

马格里特

库尔特·施威特斯

你可能对风格转移很熟悉,因为走向数据科学提供了一些关于这个主题的很棒的文章(这里只是其中的一部分,阅读全部):

** [## 卷积网络的神经类型转移和可视化

使用迁移学习在 10 分钟内创建专业外观的艺术品。

towardsdatascience.com](/neural-style-transfer-and-visualization-of-convolutional-networks-7362f6cf4b9b) [## 重要的资源,如果你正在与神经风格转移或深层照片风格转移

神经风格迁移和深度照片风格迁移是深度学习的有趣领域。他们越来越受欢迎…

towardsdatascience.com](/important-resources-if-you-are-working-with-neural-style-transfer-or-deep-photo-style-transfer-719593b3dbf1) [## 用卷积神经网络进行图像风格转换

创造美丽的图像效果

towardsdatascience.com](/style-transfer-styling-images-with-convolutional-neural-networks-7d215b58f461)

甚至视频风格传输也是可能的:

[## 实时视频神经类型转移

在受限的移动环境中优化视频的艺术风格化

towardsdatascience.com](/real-time-video-neural-style-transfer-9f6f84590832)

艺术家 Gene Cogan 使用了迪斯尼《爱丽丝梦游仙境》(茶会场景)的风格转换,并将 17 件著名艺术品的风格转换到动画中:

我对这个话题的报道(友链):

[## 人工智能和创造力:风格转换(你也可以做到)

人工智能的普及

medium.com](https://medium.com/merzazine/ai-creativity-style-transfer-and-you-can-do-it-as-well-970f5b381d96)

4.风格转换的创造性运用:深度的绘画和谐

这是关于什么的:一些艺术家和开发者将风格转移的能力用于创造性的图像处理。这个想法就像天才一样简单:

1\. take a target image B
2\. transfer its style to the element A you want to build into B
3\. combine and enjoy

例如,这种方法允许在数字图像拼贴画中艺术地使用风格转移。

论文:作者付军栾等人。在他们的 GitHub 资源库中,你可以找到令人惊叹的样本:

Gene Cogan 以自拍的方式运用风格转移,在世界艺术史上无处不在:

我对这个话题的报道(朋友链接):

[## 人工智能与创造力:风格迥异的元素。

AI 用艺术玩变色龙游戏

medium.com](https://medium.com/merzazine/ai-creativity-alien-elements-with-style-27ee7e45df92)

5.喜剧化—将视频转换回故事板

这是关于什么的:华沙理工大学的一组研究人员,都对人工智能和漫画艺术着迷,他们将自己的热情结合在一起,实现了一个惊人的项目(阅读更多细节):

1\. The model analyzes the video, using intelligent video summarization.
2\. The scenes in the video footage are separated by the DL-powered definition of frames with the most aesthetic impact.
3\. Style Transfer for the specific stylization of images is applied.
4\. Selected frames are put into storyboard / comic layout

尝试一下 : 漫画化 —选择一个视频并将其传输到漫画中。

我是塔尔科夫斯基电影的超级粉丝,所以我急切地想知道,这部《潜行者》的超级剪辑会发生什么:

结果令人震惊:

尤其是如果你知道——并且喜欢——这部电影,你会发现画面的选择是多么令人惊讶。其实是在刻画 Stalker 的核心思想(不剧透影片)。

我用更多的实验报道了这个话题():

[## 人工智能与创造力:用人工智能将视频转换成漫画

Comixify 允许将视频转换成类似漫画的剧本

medium.com](https://medium.com/merzazine/ai-creativity-transform-a-video-into-a-comic-panel-with-ai-549d1e275a5c)

6.CycleGAN —无需输入输出对的图像到图像转换。

这是怎么回事:BigGAN 在预训练的基础上生成新的图像, StyleGAN两幅图像之间转换样式, CycleGAN 使用单幅图像将其样式或特征转换成不同的东西。实际上,这是一个不成对的图像到图像的翻译,使用循环一致的对抗网络(这正是这篇论文的名字):

1\. The image is being analyzed by GAN (including pattern and object detection)
2\. Pre-trained feature modification is applied.
3\. The same image as in "1." has new visuals achieved by "2."

CycleGAN 在不引用其他图像的情况下更改图像的样式和视觉功能。

论文:不成对的图像到图像的翻译使用循环一致的对抗网络 ( 主页/GitHub/论文 )

它不仅可以将艺术家预先训练的风格转移到照片上。它可以使用预先训练好的分割特征知识,将绘画修改为照片般逼真的图像:

来源:论文 使用循环一致对抗网络的不成对图像到图像翻译

你甚至可以循环播放录像。在这种情况下,传输“马= >斑马”被应用于运动图像:

(来源

但并非没有一些系统缺陷…

普京斑马( Souce

在《走向数据科学上有很多相关的文章,我不会深究技术细节。对我来说最重要的是,有了 DL,图像的可修改性达到了一个新的高度。适合艺术使用。因为严重的错误使用而变得危险。

我的报道本话题( 【朋友链接】 ):

[## 人工智能与创造力:CycleGAN 的视觉无政府主义现实主义(以及人工智能如何欺骗开发者)

你已经尝试过把照片变成梵高的画了。但是你有没有想过反过来…

medium.com](https://medium.com/merzazine/ai-creativity-visual-anarchist-realism-of-cyclegan-and-how-ai-cheats-on-developers-ab2b3cb9eb8d)

7。StyleGAN 接受绘画训练

这是怎么回事:C0D32 结束于Reddit在来自 kaggle 的 24k 艺术作品数据集上训练 StyleGAN。随着他修改代码,各种风格的新艺术品产生了。它是这样工作的:

StyleGAN 生成具有预先训练的艺术风格的原创艺术品。

试用一下: 谷歌 Colab 笔记本

有趣的事情:即使你用这个模型得到了无数独特的艺术作品,用一些艺术史的知识你可以假设,哪些风格,艺术运动甚至艺术家正在通过新的图像闪闪发光。

两个生成的图像“Las Meninas”,迭戈·委拉斯开兹

或者是对点彩艺术的模仿。

****

生成的图像乔治·修拉(右图)

****我的报道本话题,包括更多图片及分析():

** [## 如何培养你的艺人?

各位,现在是美术测验时间!(奖品包括)

medium.com](https://medium.com/merzazine/how-to-train-your-artist-cb8f188787b5)**

8.pix2pix:图像到图像的翻译。

这是怎么回事: pix2pix 是由 Phillip Isola 等人开发的,最迟在 2017 年开始病毒式传播。由条件敌对网络完成的图像翻译允许将人造涂鸦渲染成照片般逼真的(或以某种方式类似的)图像。请观看 Karoly Zsolnai-Feher 撰写的这篇著名的两分钟论文进行总结:

****论文:Pix2Pix 网站上你可以找到这个方法的文档、论文、例子和演示( GitHub / 论文)

试试看: Christopher Hesse 为 pix2pix 提供了现场 TensorFlow 演示。你可以把你的猫、门面和其他东西的涂鸦“翻译”成“照片般逼真”的图像。

pix2pix 正尽力从我业余涂鸦的一只猫开始。

这当然不仅仅是有趣的草图翻译:通过预定义的设置,你可以将航拍照片转换成地图,将白天的照片转换成夜景等等。条件敌对网络检测模式,并将其翻译成所需的主题(你必须定义你的目标图像任务)。在特定的标记图像数据集上训练网络。

NVidiaGauGAN 将这种方法带到了另一个层面——他们 AI 游乐场的实验之一。您可以使用分段来驱动草图:每种颜色都应用于特定的对象或材料。翻译后生成新图像(具有在各种视觉特征之间切换的类似 CycleGAN 的可能性):

图片,是我女儿为我们的人工智能驱动的童话书涂鸦的。

你可以在这里试试 GauGAN:https://nvlabs.github.io/SPADE/demo.html
关于 GauGAN 的论文:https://arxiv.org/abs/1903.07291

9.pix2pix,face2face,DeepFake 和 Ctrl+Shift+Face

深度学习世界充满了实验。人们跳出框框思考,这是 DL 特别是 AI 最鼓舞人心的地方。Gene Cogan 用 dynamic pix2pix 进行了实验:在这种情况下,来源不是素描,而是网络摄像头(他的脸),目标是在特朗普的照片上训练的:

这些实验激发了对 face2face 的研究(在本例中: Dat Tran ):

** [## face 2 face——模仿德国总理面部表情的 Pix2Pix 演示

受吉恩·科岗研讨会的启发,我创建了自己的 face2face 演示程序,将我的网络摄像头图像转换成…

towardsdatascience.com](/face2face-a-pix2pix-demo-that-mimics-the-facial-expression-of-the-german-chancellor-b6771d65bf66)

原理很聪明:

1\. face2face model learns facial features / landmarks
2\. It scans webcam input on facial features
3\. It finally translates it into another face

后真相时代的另一个前沿到达了——现在我们不仅可以修改图像,还可以修改电影。就像流行的消息应用程序上的 AR 应用程序一样,AI 以完美的方式解释视频片段并修改它。

Ctrl+Shift+Face 这样的艺术家将这种方法完善到了令人难以置信的程度:他在 face2face 的帮助下切换了邪教电影中演员俏皮的面孔。比如这里:金凯瑞的《闪灵》。并排比较向你展示了即使是精彩的心理战也能翻译得多好。

这种实现在以下方面具有多种可能性:

电影制作人可以在试镜前对演员进行实验。他们还可以将电影本地化,以更好地实现不同语言的唇形同步,就像 Synthesia 对大卫·贝克汉姆所做的那样。

现在想象一下使用人工智能驱动的语言翻译和语音合成的国际视频会议的可能性。

艺术家们可以创作出颠覆性的、超现实的类似“成为约翰·马尔科维奇”的杰作。例如,特朗普、普京等人演唱的这首鼓舞人心、欢快而略带荒诞的《想象》的封面:

Passed away persons can be revived. The best example is singer Hibari Misora, who preformed new song on annual Japanese New Year TV event NHK Kōhaku Uta Gassen (NHK 紅白歌合戦). She did it this week, even if she died 30 years ago. The visuals were reconstructed with the help of AI, the voice was simulated by Vocaloid:

但是 DeepFake 的新方法是开放的。还记得 ZAO 吗,中国 DeepFake 趣味 app:转移你和名人的脸。现在你是莱昂纳多·迪卡普里奥。将它与在中国推出的生物识别支付结合起来,你就有无限的欺诈可能性:

[## 新的中国“deepfake”人脸应用在隐私反弹后后退

在遭到用户强烈反对后,一款允许人们与名人交换面孔的中国新应用程序正在更新其政策…

edition.cnn.com](https://edition.cnn.com/2019/09/03/tech/zao-app-deepfake-scli-intl/index.html)

我的覆盖范围本话题( 友链 ):

[## 运动中的人工智能:参观恐怖谷的三种方式(关于后真相中“真相”的一些想法…

这是一个显而易见的事实:我们生活在假新闻的时代。不太明显的事实是:我们一直都是这样。刚才我们…

medium.com](https://medium.com/merzazine/ai-in-motion-3-ways-to-visit-uncanny-valley-some-thoughts-about-the-truth-in-post-truth-ac0cf717be77)

10.3D 本·伯恩斯效应。

这是关于什么的:这款机型,由 西蒙·尼克劳斯 开发,将单张图像转换成跟踪拍摄。该模型可以识别背景,模拟深度,用内容敏感的修复技术填充缺失的区域,添加新的角度——简而言之:通过一张图像,您可以制作一个空间 3D 视频镜头。在安迪·拜奥的博客中了解更多信息。

试试看: Colab 笔记本作者马努·罗梅罗

以下是我的一些实验(在 twitter 帖子中):

我写过这个话题( Friend-Link ):

[## 很有空间感!

在人工智能的帮助下赋予照片新的维度。

towardsdatascience.com](/very-spatial-507aa847179d)

11.艺术育种者:无限的艺术作品生成

这是关于什么的: Joel Simon 将 BigGAN 和其他模型实现到用户友好的 web 应用 ArtBreeder 中。你有许多不同的可能性来创建和修改脸,风景,宇宙图像等。Artbreeder 同时在一个生动的社区中成长和发展,在这个社区中,用户和开发者处于持续的对话中。

试出来:https://artbreeder.com/

以下是我用 ArtBreeder 做的一些样本:

还可以制作简短的过渡视频:

我在这里写了 art breader(Friend-Link):

[## 艺术育种家:给我画一只电动羊

如何以用户友好的方式应用生成式对抗网络?

towardsdatascience.com](/artbreeder-draw-me-an-electric-sheep-841babe80b67)

12.去彩色化—黑白照片的彩色化

这是怎么回事: DeOldify 由 Jason Antic 创作并发布。这个项目的任务是对旧图像和电影胶片进行着色和恢复。( 来源 )。 DeOldify 正在使用生成对抗网络,在两个神经网络生成器鉴别器之间进行迭代交互(类似于art breader)。但与上一个模型不同的是,DeOldify 中的图像不会以它们的形式被修改或生成。甘的力量带来色彩——发生器将颜料涂在他训练过的已识别物体上,鉴别器尝试批评颜色选择。

试试看:你可以在 GitHub 中找到这个型号,也可以在两个笔记本中找到——图片( Colab 笔记本)和视频( Colab 笔记本)!

这是我的照片:一张我父亲在 1960 年拍摄的黑白照片。看花的颜色检测的多细致。

当然,颜色不会重复原来的调色板。但它让历史照片充满活力,让它们更贴近我们的时代。

我在这里写了这个话题( Friend-Link ):

[## 基于 GAN 的图像彩色化

找回丢失的颜色…

towardsdatascience.com](/deoldify-gan-based-image-colorization-d9592704a57d)

13.人工智能驱动的虚拟现实

这是关于什么的: AI 驱动的虚拟现实是可能的。实际上,这是 NVidia 一年前发布的新闻——而且非常有希望:

在这里,城市和视觉效果是在谷歌街景上训练的,所以 VR 城市体验是通过深度学习模型重建的:

为了进行训练,该团队在 DGX-1 上使用了NVIDIA Tesla V100 GPUcud nn-加速 PyTorch 深度学习框架,以及来自城市景观和 Apolloscapes 数据集的数千个视频(来源)。

你可以想象这种方法的所有潜力:“从零开始”的现实城市模拟,对城市发展、交通管理和物流的帮助,重塑视频游戏景观。

14.跑道 ML

这是关于什么的: Runway 是一个终极应用,使用各种 ML/DL 模型来满足不同的需求。它可以翻译图像 2 文本,在图像后生成文本(使用 GPT-2),检测照片和视频镜头中的对象。你也可以将不同的模型结合成连锁反应。而且是免费的。

试试看:https://runwayml.com/

我很快会写关于 RunwayML 的文章。

即将发布:StyleGAN2

最近,NVidia 发布了 style gan 2——图像质量有所提高( GitHub / 论文 / 视频)。

StyleGAN 2 预告(来源)

此外,使用图像的新方法也是可能的。例如,StyleGAN 投影:与来自任何可能图像的目标图像对齐。我强烈建议跟随 Jonathan Fly 对每个最新的 DL/ML 开发进行全面的实验:

《road runner 01》也非常有趣:

(人工智能先驱、艺术家和实验者是我将在 2020 年讨论的另一个话题)

奖励:尝试它的资源

冬天(希望)终于过去了。技术就在眼前,我们彼此相连,思想交流前所未有地活跃。而 AI 复兴最好的一点就是:DL/ML 的大众化和民主化。如今,不仅 Python 演讲者和 NVidia GPU 所有者可以享受无限的可能性:每个人都可以做到这一点。作家,艺术家,其他非技术领域的人可以使用 Colab/Jupyter 笔记本,用户友好的应用程序,如 Artbreeder 和 RunwayML 等。

这里有一个小列表供你收藏:基于跨平台网络的人工智能实验。现在没有借口声称人工智能将是一门火箭科学(它仍然存在于各种高科技领域,但不是普遍的)。该列表将被更新。

[## 人工智能实验|谷歌的实验

在过去的 6 个月里,谷歌在悉尼的创意实验室与数字作家节团队合作,并且…

experiments.withgoogle.com](https://experiments.withgoogle.com/collection/ai) [## 来自 NVIDIA Research 的交互式演示

与基于 NVIDIA 研究的现场演示互动,链接到白皮书和 GitHub 源代码

www.nvidia.com](https://www.nvidia.com/en-us/research/ai-playground/) [## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/) [## 面向创作者的机器学习。

机器学习的瑞士军刀

runwayml.com](https://runwayml.com/madewith)

你也可以关注我的人工智能相关关键人物的 Twitter 列表。这个列表还在增长,这是一件好事!

[## 推特上的@Merzmensch/AI

twitter.com](https://twitter.com/Merzmensch/lists/ai)

这些只是 2019 年令人惊叹的人工智能发展的一部分。你还有 AI 驱动的 WOWs 吗?请随意将它们写在评论中!****

Scikit 学习库的 14 个鲜为人知的令人印象深刻的特性

原文:https://towardsdatascience.com/14-lesser-known-impressive-features-of-scikit-learn-library-e7ea36f1149a?source=collection_archive---------38-----------------------

scikit 学习库中经常未知和被低估的功能示例。

Pixabay

Scikit learn 仍然是人工智能领域最受欢迎的开源和机器学习库之一。scikit-learn 库包含了很多用于机器学习和统计建模的高效工具,包括分类、回归、聚类和降维。

Scikit-learn 大部分是用 Python 编程语言编写的,一些核心算法是用 Cython 编写的,以提高其性能。它还可以与许多其他 Python 库很好地集成,例如用于绘图的 matplotlibPlotly ,用于数组矢量化的 NumPy ,以及 pandas dataframes、 scipy 等等。

scikit 学习主页

Scikit-learn 附带了许多特性。以下是其中的几个

  • 数据集
  • 特征抽出
  • 特征选择
  • 参数调谐
  • 使聚集
  • 交叉验证
  • 监督模型
  • 无监督模型
  • 降维
  • 集成方法

Scikit learn 在其 GitHub 资源库上拥有超过 1770 个贡献者41.2k 颗恒星 ,这意味着许多数据科学家、机器学习工程师和研究人员依赖这个库进行机器学习项目。

我个人喜欢使用 scikit learn 库,因为它提供了极大的灵活性,并且很容易理解带有大量示例的文档。在本文中,我很高兴与您分享 scikit learn 库中您不存在的鲜为人知的令人印象深刻的特性。

1.克隆估计量

如果您想要复制一个估计器并将其用于另一个数据集,克隆函数可以帮助您做到这一点。克隆函数帮助你用相同的参数构造一个新的估计量。

“Clone 在不实际复制附加数据的情况下,在估算器中进行模型的深度复制。它产生了一个新的估计量,其参数与任何数据都不匹配。”- scikit 学习文档

例如:

我们首先创建一个分类数据集和估值器。

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification# create dataset`
X1, y1 = make_classification(n_classes=2, n_features=5, random_state=1)# create estimators 
logistic_classifier_1 = LogisticRegression()

现在我们将使用来自 sklearn.base 的克隆函数来复制 logistic_classifier_1 模型。

from sklearn.base import clone# duplicae the first classifier with clone function 
logistic_classifier_2 = clone(logistic_classifier_1)logistic_classifier_2

从逻辑分类器 1 克隆的名为的逻辑分类器 2 的新估计器的输出如下。

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

2.将评估者识别为分类器或回归器。

如果一个模型实例用两个简单的函数 is_classifieris_regressor 解决了 scikit-learn 库中的分类或回归任务,您就可以识别该模型实例。如果给定的估计量是分类器,is_classifier 函数返回 True,如果给定的估计量是回归量,is_regressor 函数返回 True。

举例:

首先创建两个估计器,第一个作为回归,第二个作为分类。

from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestClassifier# create estimators 
model_1 = LinearRegression()
model_2 = RandomForestClassifier()

让我们检查一下第一个模型是否回归。

# check if it regressor
from sklearn.base import is_regressoris_regressor(model_1)

输出为真。

现在让我们检查第二个模型是否是分类。

# check if it classifier 
from sklearn.base import is_classifieris_classifier(model_2)

输出为

3.用 make_column_selector 选择列

make_column_selector 与make _ column _ transformer配合使用,根据不同列的数据类型(整数、类别)或列名对其应用不同的预处理。

举例:

在本例中,我们使用 make_column-_selector 来选择数据集中的所有对象特征,并通过使用 OneHotEncoder 方法来转换它们。

import numpy as np 
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import make_column_transformer
from sklearn.compose import make_column_selector# create a dataframe with different data types
data = pd.DataFrame(
 {“gender”: [“male”, “female”, “female”, “male”],
 “age”: [23, 5, 11, 8]}
)# create a column transformer with make_column_selectorct = make_column_transformer(
 (StandardScaler(), make_column_selector(dtype_include=np.number)), # ages
 (OneHotEncoder(), make_column_selector(dtype_include=object)), # genders
)transformed_data = ct.fit_transform(data)transformed_data

转换数据的输出是:-

array([[ 1.6464639 ,  0\.        ,  1\.        ],
       [-0.98787834,  1\.        ,  0\.        ],
       [-0.10976426,  1\.        ,  0\.        ],
       [-0.5488213 ,  0\.        ,  1\.        ]])

4.绘制决策树

您可以使用 plot_tree 函数可视化决策树模型。绘图功能允许你用名为 feature_names 的参数添加特征名。

示例: 我们首先通过使用决策树算法为虹膜数据集创建分类模型,然后绘制决策树。

# import libraries
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
from sklearn.tree import DecisionTreeClassifier, plot_tree, export_text 
from sklearn.datasets import load_iris#load data 
iris = load_iris()# create our instances
model = DecisionTreeClassifier()# train test split
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state = 0)# fit and predict
model.fit(X_train, y_train)# plot the tree
plt.figure(figsize = (20, 10))
plot_tree(model,feature_names=iris.feature_names, filled = True) 
plt.show()

我们通过 plot_tree 函数中的模型和特征名称来创建一个决策树图。

决策树图

5.从 Openml 获取数据集

Openml 是一个在线平台,旨在通过提供一个开放、协作、无摩擦、自动化的机器学习环境来改进开放式机器学习。

您可以通过使用 scikit-learn 的 fetch_openml 函数从 openml 平台获取数据集。

举例:

使用名称获取银行营销数据集。

from sklearn.datasets import fetch_openml#fetch by using data name
bank_marketing = fetch_openml(name=”bank-marketing”)# seperate independent variables and target variable 
x = bank_marketing.data 
y = bank_marketing.target

获取数据集的访问样本。

x[:2]

输出是

array([[ 5.800e+01,  4.000e+00,  1.000e+00,  2.000e+00,  0.000e+00,
         2.143e+03,  1.000e+00,  0.000e+00,  2.000e+00,  5.000e+00,
         8.000e+00,  2.610e+02,  1.000e+00, -1.000e+00,  0.000e+00,
         3.000e+00],
       [ 4.400e+01,  9.000e+00,  2.000e+00,  1.000e+00,  0.000e+00,
         2.900e+01,  1.000e+00,  0.000e+00,  2.000e+00,  5.000e+00,
         8.000e+00,  1.510e+02,  1.000e+00, -1.000e+00,  0.000e+00,
         3.000e+00]])

您也可以使用指定的 ID 提取数据。

# fetch by using id from this link [https://www.openml.org/d/1461](https://www.openml.org/d/1461)
bank_marketing = fetch_openml(data_id=1461)# seperate independent variables and target variable 
x = bank_marketing.data 
y = bank_marketing.target

在上面的例子中,我们获取 ID 为 1461 的数据。

6.学习曲线

scikit-learn 的学习曲线功能允许您确定不同训练集大小的交叉验证训练和测试分数。

“交叉验证生成器在训练和测试数据中将整个数据集拆分 k 次。具有不同大小的训练集的子集将用于训练估计器,并且将计算每个训练子集大小和测试集的分数。之后,对于每个训练子集大小,将在所有 k 次运行中平均分数。” scikit 学习文档

举例:

from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import learning_curve# create dataset`
X, y = make_classification(n_classes=2, n_features=10, n_samples=5000, random_state=1)# create estimator
KNN_classifier = KNeighborsClassifier()#
train_sizes, train_scores, test_scores = learning_curve(
estimator = KNN_classifier,
X = X,
y = y,
train_sizes=np.linspace(0.1, 1.0, 5),
shuffle=True, cv = 5)

显示训练规模以生成学习曲线。

# the train size
train_sizes

输出是

array([ 400, 1300, 2200, 3100, 4000])

显示训练集的分数。

# Scores on training sets
train_scores

输出是

array([[0.895     , 0.8875    , 0.85      , 0.8675    , 0.8975    ],
       [0.87384615, 0.88846154, 0.87692308, 0.88461538, 0.88230769],
       [0.88818182, 0.89363636, 0.88409091, 0.89045455, 0.88863636],
       [0.89354839, 0.89354839, 0.88903226, 0.88806452, 0.88387097],
       [0.893     , 0.894     , 0.88825   , 0.893     , 0.88625   ]])

显示验证分数

# show validation scores
test_scores

输出是

array([[0.83 , 0.812, 0.829, 0.841, 0.819],
       [0.837, 0.813, 0.853, 0.848, 0.828],
       [0.843, 0.823, 0.845, 0.853, 0.821],
       [0.832, 0.831, 0.855, 0.857, 0.83 ],
       [0.834, 0.828, 0.849, 0.86 , 0.835]])

我们来找训练分和验证分的手段。

# find the mean of training scores and validation scores train_scores_mean = train_scores.mean(axis = 1)
print(“Training Scores mean:{}”.format(train_scores_mean))test_scores_mean = test_scores.mean(axis = 1)
print(“Test Scores mean:{}”.format(test_scores_mean))

输出是。

Training Scores mean:[0.8795 0.88123077 0.889 0.8896129  0.8909]
Test Scores mean:[0.8262 0.8358 0.837  0.841  0.8412]

下图展示了数据是如何被分成 k 次和 5 次交叉验证的。

了解更多查看另一个例子 这里

7.交叉验证和预测

如果您想为您的估计器同时执行交叉验证和预测,您可以使用 scikit-learn 的 cross_val_predict 函数。

举例:

对 iris 数据集执行 cross_val_predict。

from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_predict
from sklearn.ensemble import RandomForestRegressor#load dataet
diabetes = datasets.load_diabetes()X = diabetes.data
y = diabetes.targetRF_regressor = RandomForestRegressor()# perfrom cross validation and prediction
y_pred = cross_val_predict(estimator=RF_regressor, X= X, y=y, cv=5)

显示前 10 个预测。

#show prediction
y_pred[:10]

输出是:

array([225.41,  89.16, 172.4 , 164.03,  79.48, 116.87,  74.47, 157.5 ,155.99, 170.59])

8。使用 SelectFromModel 函数选择重要功能。

并非数据集中出现的所有特征都对模型性能有用,这意味着您可以通过使用 SelectFromModel 函数来识别和选择模型的重要特征。该函数根据重要性权重选择特征。您可以从一系列估计量中进行选择,但请记住,拟合后估计量必须具有 feature_importances_ 或 coef_ attribute

SelectFromModel 不太健壮,因为它只是根据作为参数给出的阈值来删除不太重要的特征。

示例:从包含 10 个独立特征的糖尿病数据集中选择重要特征。

from sklearn import datasets, linear_model
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression#load dataet
diabetes = datasets.load_diabetes()X = diabetes.data
y = diabetes.targetlg_regressor = LogisticRegression()# identify and select important fatures by using SelectFromModel
selector = SelectFromModel(estimator=lg_regressor).fit(X, y)#show estimator coefficient 
selector.estimator_.coef_

输出如下。

array([[-0.01631211, -0.04448689, -0.01041713, ..., -0.03925967,
        -0.02122777, -0.03405436],
       [ 0.00188878, -0.04444519, -0.00816801, ..., -0.03918144,
        -0.06436135, -0.05463903],
       [-0.02699287, -0.04433151, -0.06285579, ..., -0.0756844 ,
        -0.05557734, -0.06683906],
       ...,
       [ 0.03415162,  0.05040128,  0.11077166, ..., -0.00292399,
         0.027618  ,  0.07302442],
       [ 0.03416799,  0.05030017,  0.12469165, ...,  0.10747183,
        -0.00019805,  0.02747969],
       [-0.04907612, -0.04462806,  0.16038187, ...,  0.0340123 ,
         0.02773604,  0.01114488]])

显示用于特征选择的阈值。

# show the threshold value
selector.threshold_

输出是12.19469668686

现在,我们可以使用选定的要素来转换数据。

 transformed = selector.transform(X)
transformed[:3]

输出是:-

array([[ 0.05068012,  0.06169621,  0.02187235, -0.04340085, -0.00259226,
         0.01990842],
       [-0.04464164, -0.05147406, -0.02632783,  0.07441156, -0.03949338,
        -0.06832974],
       [ 0.05068012,  0.04445121, -0.00567061, -0.03235593, -0.00259226,
         0.00286377]])

数据集已经从 10 个特征转化为 6 个重要特征

9。功能变压器

应用来自 pandas 的函数已被用于处理数据帧中从一个形状到另一个形状的数据,但如果您想在管道中使用它,则该函数没有用。 FunctionTransformer 函数可以帮助您在管道中添加特征/变量转换。

FunctionTransformer 提供了其他 sklearn 估算器的一些标准方法(例如,拟合和转换)。

举例:

使用 np.log() 方法将数组转换为自然对数。

import numpy as np
from sklearn.preprocessing import FunctionTransformerX = np.array([[89,34,9, 1,5,87,54,22,67,44], [12, 63,67,2,9,45,81,54,22,73]])#create FunctionTransformer
log_transformer = FunctionTransformer(np.log)#transform the data
log_transformer.transform(X)

转换后的输出。

array([[4.48863637, 3.52636052, 2.19722458, 0\.        , 1.60943791,
        4.46590812, 3.98898405, 3.09104245, 4.20469262, 3.78418963],
       [2.48490665, 4.14313473, 4.20469262, 0.69314718, 2.19722458,
        3.80666249, 4.39444915, 3.98898405, 3.09104245, 4.29045944]])

10。确定目标数据类型

在监督机器学习任务/问题中,我们有独立变量目标变量。您还需要知道目标变量的数据类型,以选择您将使用哪条路径来解决回归或分类任务的问题。您可以使用 type_of_target 函数来检查目标变量所指示的数据类型。

示例: 确定糖尿病数据集中目标变量的类型。

from sklearn.utils.multiclass import type_of_target
from skearn import datasets#load dataet
diabetes = datasets.load_diabetes()X = diabetes.data
y = diabetes.targettype_of_target(y)

输出为‘多类’。

11.添加虚拟特征

通过使用 add_dummy_feature 功能,可以在数据中添加具有特定值的虚拟特征。

"这对于将截取项与不能直接拟合的实现相拟合是很有用的." scikit-learn 文档

例如:

数据集对象和虚拟特征值(如 5)将通过 add_dummy-feature 函数在我们的数据集中创建一个新的虚拟特征。

import numpy as np 
from sklearn.preprocessing import add_dummy_featurep = np.array([[89,34], [12, 63]])add_dummy_feature(p, value=5)

在我们的 p 数组中,每一行都将增加一个值 5。

array([[ 5., 89., 34.],
       [ 5., 12., 63.]])

12.使用迭代估算器估算缺失值

大多数时候,我们使用简单的方法来估算数据集中的缺失值。像用于数字特征的均值/中值和用于分类特征的模式这样的方法。也可以使用 迭代估算器 等高级方法。

通过使用机器学习模型,例如 BayesianRidge,IterativeImputer 使用数据集中所有可用的要素来估计缺失值。这意味着带有缺失值的特征将被标记为因变量,其他特征将被标记为自变量

举例:

import numpy as np
from sklearn.experimental import enable_iterative_imputer 
from sklearn.impute import IterativeImputer# Create dataset with missing values
data = [[61, 22, 43,np.nan,67],
        [np.nan, 6, 27, 8, 11],
        [83, 51, np.nan, 32, 9],
        [74, np.nan, 35, 26, 97],
        [np.nan, 4, 13,45, 33]]

现在我们可以用迭代估算函数估算缺失值。

# Impute missing values using iterative imputer
iter_imp = IterativeImputer(random_state= 42)
iter_imp.fit_transform(data)

没有丢失值的输出:

13.使用随机搜索的超参数调谐

RandomizeSearchCV 函数倾向于通过随机选取一组预定的超参数分布来训练和评估一系列模型。在用不同的随机选择的超参数组合训练模型的 N 个不同版本之后,该函数挑选具有最佳参数值的模型的最成功版本。这允许您显式控制尝试的参数组合的数量。

示例: 创建随机搜索以找到 XGBoost 算法的最佳参数,从而将虹膜分类为 3 类。

from sklearn import linear_model, datasets
from sklearn.model_selection import RandomizedSearchCV
from xgboost import XGBClassifier
from scipy.stats import randint# Load data
iris = datasets.load_iris()
X = iris.data
y = iris.target# create model
classifier = XGBClassifier()# Create Hyperparameter Search Space
param_dist = {
 # randomly sample numbers from 50 to 400 estimators
 “n_estimators”: randint(50,400),
 “learning_rate”: [0.01, 0.03, 0.05],
 “subsample”: [0.5, 0.7],
 “max_depth”: [3, 4, 5],
 “min_child_weight”: [1, 2, 3],
}# create random search# Create randomized search 5-fold cross validation and 100 iterationsclf = RandomizedSearchCV(
 estimator=classifier,
 param_distributions=param_dist,
 random_state=1,
 n_iter=100,
 cv=5,
 verbose=0,
 n_jobs=-1,
)# Fit randomized search
best_model = clf.fit(X, y)

运行随机搜索后,我们可以观察最佳参数值,以提高模型性能。

# View best hyperparameters
print(‘Best n_estimator:’, best_model.best_estimator_.get_params()[‘n_estimators’])
print(‘Best learning_rate:’, best_model.best_estimator_.get_params()[‘learning_rate’])
print(‘Best subsample:’, best_model.best_estimator_.get_params()[‘subsample’])
print(‘Best max_depth:’, best_model.best_estimator_.get_params()[‘max_depth’])
print(‘Best min_child_weight:’, best_model.best_estimator_.get_params()[‘min_child_weight’])

输出:

Best n_estimator: 259
Best learning_rate: 0.03
Best subsample: 0.5
Best max_depth: 3
Best min_child_weight: 1

有时,RandomizedSearchCV 不会提供准确的结果,因为 GridSearchCV,但是当您拥有大型数据集时,GridSearchCV 会大大降低计算时间,并且成本非常高。在这种情况下,建议使用随机搜索,因为您可以定义想要运行的迭代次数。

14.加载文本文件

如果您想在 scikit learn 中加载文本文件,您可以使用 load_files 函数。load_files 将根/主文件夹中的每个文件夹视为一个类别,该文件夹中的所有文档都将被分配到相应的类别。

示例: 从名为 news_report 的文件夹中加载数据。

from sklearn.datasets import load_filesnews_reports = load_files(
 container_path=”news_report/”,
 description=”News reports in 2020",
 load_content=True,
)

从 l oad_files 函数中,我们在名为 container_path 的参数中传递了文件夹的名称。

注意:当设置 load_content=True 时,您也可以使用' encoding '参数来指定文本的编码。

现在我们可以用 target_names 属性来标识目标名称。

# show target names 
news_reports.target_names

输出将是。

['business', 'healthy', 'international', 'sport']

还可以通过使用两个名为 data 和 target 的属性来指定自变量和目标变量。

# specify the independent variable and the target variable 
X = news_reports.data
y = news_reports.target

结论

正如我所说,scikit-learn 仍然是最受欢迎的开源和机器学习库之一,拥有所有可用的功能,您可以进行端到端的机器学习项目。您还可以在您的机器学习项目中实现本文中介绍的 scikit learn 令人印象深刻的功能。

如果您想了解更多关于 scikit-learn 的信息,我推荐您参加来自 AnalyticVidhya 的免费在线课程

你可以在这里下载包含本文介绍的所有 14 个特性的笔记本。

[## davisy/14-Scikit-Learn-Library 中鲜为人知但令人印象深刻的功能

scikit 学习库中经常未知和被低估的功能示例。…

github.com](https://github.com/Davisy/14-Lesser-Known-Impressive-Features-in-Scikit-learn-Library)

如果你学到了新的东西或者喜欢阅读这篇文章,请分享给其他人看。也可以随意发表评论。在那之前,下一篇文章再见!也可以通过推特 @Davis_McDavid 联系到我。

最后一件事: 在下面的链接里多看看类似这样的文章。

[## 使用投票方法的特征选择

如何应用多种技术来选择 Xverse 包的特性?

medium.com](https://medium.com/analytics-vidhya/feature-selection-by-using-voting-approach-e0d1c7182a21) [## 如何用 Python 日志模块运行机器学习实验

有时候“打印”并不是一个好主意

medium.com](https://medium.com/analytics-vidhya/how-to-run-machine-learning-experiments-with-python-logging-module-9030fbee120e) [## 如何在你的机器学习项目中写配置文件?

用配置文件管理参数和初始设置。

medium.com](https://medium.com/analytics-vidhya/how-to-write-configuration-files-in-your-machine-learning-project-47bc840acc19)

机器学习中的 14 个流行评估指标

原文:https://towardsdatascience.com/14-popular-evaluation-metrics-in-machine-learning-33d9826434e4?source=collection_archive---------47-----------------------

了解分类和回归机器学习模型中使用的所有评估指标及其使用 sklearn 库的实现

Unsplash 上由 Hitesh Choudhary 拍摄的照片

评估度量用于测量机器学习模型的性能。对于一个模型来说,评价指标的正确选择是非常重要的。本文将涵盖分类和回归机器学习模型中使用的所有指标。

文章中讨论的评估指标:

分类模型中使用的指标:

对于分类机器学习算法,模型的输出可以是目标类别标签或概率分数。这两种方法使用不同的评估标准。

当 ML 模型的预测是类标签时使用的度量:

混乱矩阵:

混淆矩阵是衡量分类问题性能的最简单的方法。它用于可视化和观察 ML 模型的预测性能。对于 k 类分类模型,使用大小为 kk 的矩阵来观察预测。对于二元类分类问题,使用标准的 22 大小的矩阵。

来源,用于二进制分类的混淆矩阵

**Notations,**
**TP: True Postive:** Number of Points which are actually positive and predicted to be positive
**FN: False Negative:** Number of Points which are actually positive but predicted to be negative
**FP: False Positive:** Number of Points which are actually negative but predicted to be positive
**TN: True Negative:** Number of Points which are actually negative and predicted to be negative

如果主对角线上的数字最大,非对角线上的数字最小,则认为 ML 模型是好的。对于二进制混淆矩阵, TP 和 TN 应该为高, FN 和 FP 应该为低。

不同的问题有不同的指标可供选择:

  • 对于癌症诊断的问题,TP 应该很高, FN 应该很低接近于 0。患有癌症的患者不应该被预测为不是癌症,这是 FN 的情况。
  • 对于垃圾邮件检测的问题, FP 应该很低。不应该将不是垃圾邮件的邮件预测为垃圾邮件。

什么是一型和二型错误?

第一类错误也称为假阳性(FP)。第二类错误也称为假阴性(FN)。

精度:

准确度是分类算法最常用的性能指标。精确度主要用于平衡数据集。它被定义为正确预测的数量与所有预测的数量之比。

  • 精度度量可能不适用于不平衡的数据集,因为它可能偏向于多数类。下述指标克服了这一缺点。

TPR(真阳性率):

TPR 是正确预测的肯定类别数与肯定类别总数的比率。

TNR(真阴性率):

TNR 是正确预测的否定类别数与否定类别总数的比率。

FPR(假阳性率):

FPR 是错误预测的肯定类别的数量与否定类别的总数的比率。

FNR(假阴性率):

TNR 是正确错误地否定类别的数量与肯定类别的总数的比率。

精度:

信息检索中使用的精度度量被定义为从预测为正的所有点中,有多少点实际上是正的。

精确度指标用于 ML 模型,其中低误报率(FP)很重要,例如垃圾邮件检测。

回忆:

召回率也被称为敏感度,敏感度被定义为从实际上为正的所有点中,有多少点被预测为正。召回率与真实阳性率(TPR)相同。

召回指标用于低假阴性(FN)很重要的 ML 模型,如癌症诊断。

F-beta 评分:

对于 FN 和 FP 同样重要的 ML 模型来说,那么我们可以在一个新的称为 F-beta score 的度量中结合精确度和召回率的优势。

Here beta is a variable,
(Beta < 1) is used when FP have more impact than FN
(Beta > 1) is used when FN have more impact than FP
(Beta == 1) is used when FN and FP have equal importance

当 Beta=1 时,该指标被称为 F1 得分,对精确度和召回率给予同等的重视。

当 ML 模型的预测是概率得分时使用的度量:

ROC 曲线和 AUC:

ROC(接收机工作特性)曲线主要用于基于二元分类的 ML 模型。ROC 曲线和 AUC(曲线下面积)可用于输出概率得分的 ML 模型。

ROC 曲线是连接 TPR 对 FPR 图中不同阈值的所有点的曲线。

ML 模型的输出是概率值,对于不同的阈值,找到 y_hat 值,然后计算 TPR 和 FPR。进一步,画一个图来观察 ROC 曲线和 AUC。

对于下面的样本数据集:

(图片由作者提供),样本数据集不同阈值的 TPR 和 FPR 分数

Notation,
**x_i:** ith data point
**y:** target binary class label
**y_hat:** predicted probability value
**y_hat(t):** predicted binary class label for threshold - **t**

关于样本数据集的 ROC 曲线(蓝色曲线)如下:

(图片由作者提供),上述样本数据集的 ROC 曲线

对于真实世界的数据集,ROC 曲线看起来像这样:

(图片由作者提供),ROC 曲线—蓝线

上面的图是 ROC 曲线(蓝色曲线),曲线下的面积称为 AUC(曲线下面积)。橙色线就是 x=y 线,ROC 曲线会一直在这条线上面。

日志丢失:

对数损失也称为交叉熵损失,它使用概率估计来计算模型的性能。模型的概率估计值在 0 到 1 之间。模型的对数损失总是大于 0,0 分是最好的模型。对数损失是我们预测的不确定性量,基于它与实际标签的差异程度。在 Log Loss 值的帮助下,我们可以更准确地了解模型的性能。二元分类的测井曲线损失方程为:

Notations,
n: number of points in dataset
p_i: predicted probability of ith point
y_i: actual output class label

下面是一个样本数据集:

(按作者分类的图片),样本数据集的实际和预测目标类表

Notation,
**x_i:** ith data point
**y:** target binary class label
**y_hat:** predicted probability value

回归模型中使用的指标:

对于回归问题,ML 模型的输出是实值的。计算回归模型性能的各种指标有:

平均绝对误差(MAE):

MAE 是回归问题中使用的最简单的误差度量。MAE 定义为预测值和实际值之间的绝对差值的平均值之和。它通过对实际值的预测可变性求和来计算回归模型的性能。

Notation,
**n:** number of data point
**y:** actual real value
**y_hat:** predicted real value

均方根误差(RMSE)和均方误差(MSE):

MSE 与 MAE 相同,但唯一的区别是,它在对实际输出值和预测输出值求和之前,对它们之间的差进行平方,而不是使用绝对值。RMSE 正在计算 MSE 的平方根。

Notation,
**n:** number of data point
**y:** actual real value
**y_hat:** predicted real value

R 平方误差:

r 平方度量通常用于解释目的,表示一组预测输出值与实际输出值的拟合优度。

Notation,
**n:** number of data point
**y_i:** ith actual real value
**y_hat:** predicted real value
**y_bar: mean of y**

感谢您的阅读!

给每个数据工程师或数据科学家的提示

原文:https://towardsdatascience.com/14-tips-for-every-data-engineer-or-scientist-e4b47fbd8498?source=collection_archive---------49-----------------------

提示作为一名初露头角的数据分析专家,我希望自己知道这些

以下是我发现作为数据专业人员至关重要的 10 件简单的事情。这些技巧虽然显而易见,但却能区分普通的数据专家和杰出的数据专家。这里讨论的技巧与定义问题、生产好的产品和个人发展有关。

编辑过的照片由玛琳·莱帕宁原创

1.理解你工作的背景

要生产一个好的产品,你必须了解要制造什么,为什么需要它,你要和谁一起做,什么时候做,在哪里做。这基本上就是应用 5 Ws 了。这里有一些问题。

什么:需要做什么,业务影响或理由是什么?有什么要求?你的范围是什么?

为什么:为什么一定要做?

谁:谁是利益相关者——谁是您的最终用户,谁是您需要与之合作的其他团队?

项目必须在什么时候完成?现有系统何时会关闭或数据集何时会过时?

哪里:你的产品或流程需要在哪里发生?

这里的目标是获得一套清晰完整的资源、要求和时间表。

2.起草一份你的理想解决方案的计划

这将指导你“如何”做项目。很多时候,你不能实现一个理想的解决方案,而是在你的当前状态和你的理想解决方案之间。

图 1:创建解决方案的计划(由作者创建)

3.进行一些流程或数据发现

这是了解当前状态和可用资源,并确定主题专家的研究。发现通常会导致需求、方法和时间表的变化。

4.创建好的代码

人们很容易忘记用于创建数据输出的代码是数据产品的一部分。要创建好的代码:

I .从小处着手并迭代——使用小数据集快速确保代码按预期运行。不断完善。它不会是完美的,这没关系。

二。代码检查——试着想一想什么会破坏你的代码逻辑,以及你如何积极主动地处理它。对于一些关键元素,创建失败保存。

三。优化代码——这可能是 10 分钟代码和 4 小时代码的区别。这对于实时系统尤其重要,因为在实时系统中,客户希望得到即时响应。

四。注释你的代码——你的代码应该让任何人在高层次上都容易理解每一步发生了什么。

动词 (verb 的缩写)建立一个基线来验证你的产品。

5.使自动化

尝试创建可以完全自动化的流程或模型。避免手动输入。

6.测试,测试,再测试!

测试花费的精力和时间取决于您的更改是否可逆。如果流程一旦实施就不可逆转,那么要确保有足够的时间和精力来测试流程和产品的弹性、可靠性和正确性。应该对每个产品执行的一些测试包括:

产品开发的关键测试(由作者创建)

7.监控您的产品

建立指标和流程来监控您的产品,并在需要改变时发出警报。

8.沟通

这可以说是处理数据时最重要的技能之一。沟通至关重要,因为它设定了期望。交流-

a.在整个过程中与利益相关者一起细化需求和范围。

b.确保适当使用他们的数据集或产品。

c.与其他团队合作,了解其他技术规范。如果您的流程被部署,它会影响任何其他现有的特性吗?

d.通过尽可能多地评论你的代码、版本和文档,与你未来的自己和其他队友交流。

e.与最终用户和企业一起设定正确的期望值,创建服务级别协议,并就变更流程达成一致。

人们谈论的数据来源: fauxels

9.记住没有人是完美的

认识到你不会总是有一个完美的产品,也不会总是有答案。有人向你征求意见通常是有帮助的。

10.检查你的成长

最后但同样重要的是,定期检查您的编码或解决问题的技能是否随着时间的推移而提高。心中有一个目标会有所帮助。对我来说,我通常会查看并尝试模仿我发现最有帮助的包的编码风格。

通过练习,一切皆有可能。来源: Tranmautritam

感谢阅读!请随时联系我,让我知道你的想法!😄

从数据到洞察的 15 种数据探索技术

原文:https://towardsdatascience.com/15-data-exploration-techniques-to-go-from-data-to-insights-93f66e6805df?source=collection_archive---------3-----------------------

构建数据探索的艺术

照片由 Unsplash 上的 h heyerlein 拍摄

我们都面临过看着原始数据并思考下一步该做什么的焦虑。尽管数据科学算法已经非常成熟,但如何从原始数据发展出真知灼见仍然是一门手艺。

那么,一个人如何构建一门艺术呢?可以做的事情之一是制定某种列表或构建模块。以英语为例。积木是字母 A、B、C 等。有了这些基本的字母积木,我们就能造出漂亮的单词

因此,在本文中,我试图列出最有效的数据探索技术。这个列表绝不是任何详尽的列表,但我在这里的尝试是给数据探索的艺术带来一些结构

为了说明这些数据探索技术,让我举一个汽车的样本数据集。

汽车数据集示例

现在让我举例说明数据探索技术

1.唯一值计数

在数据探索过程中,首先要做的事情之一是查看分类列中有多少唯一值。这给出了数据是关于什么的概念。此处显示了 cars 数据集中分类列的唯一值计数。

唯一值计数

正如您将观察到的,唯一值的最大数量在“品牌”列中,这意味着数据集主要围绕不同品牌的汽车

2.频率计数

频率计数是查找列中单个值出现频率。例如,下面是列“make”的频率计数。

频率

它显示,在品牌栏中,丰田的价值出现最多(16%),道奇的价值出现最少(4%)。通过这种分析,您可以很好地了解分类变量的内容

3.差异

在分析数值时,一些基本信息如最小值、最大值和方差非常有用。方差很好地说明了值是如何分布的。

这是显示 car 数据集中数值列中数值分布的可视化。

差异

上面的可视化是以这样一种方式组织的,即在顶部显示具有高变化的场,在底部显示具有低变化的场。例如,对于我们的汽车数据集,方差最大的字段是价格,方差最小的字段是高度

4.帕累托分析

帕累托分析是一种关注重要事物的创造性方法。帕累托 80-20 法则可以有效地用于数据探索。在汽车数据集中,我们可以对价格列应用帕累托分析,如下所示

帕累托分析

正如分析表明,80%的价格低于 17075。这是一个很好的信息,可以让你深入了解什么是可以被认为是高的价格水平

5.柱状图

直方图是数据科学家最喜欢的数据探索技术之一。它给出了大部分值的值域信息。它还提供了关于数据中是否存在任何偏差的信息。如果我们在价格栏中制作一个直方图,它将指示具有最大值的价格范围和具有最小值的价格范围

柱状图

6.所有数字列之间的关联热图

术语相关性指的是两个事物之间的相互关系或关联。几乎在任何业务中或出于个人原因,用与他人的关系来表达某事是有用的。寻找相关性在数据探索中非常有用,因为它给出了列如何相互关联的想法

查看数字列之间相关性的最佳方式之一是使用热图。在 cars 数据集中,这是数字列之间的关联热图

相关热图

因为相关性热图显示公路英里数和城市英里数之间的高度相关性。您还可以看到其他列之间的相关性

7.两个数值列之间的 Pearson 相关性和趋势

一旦可视化了关联热图,下一步就是查看两个特定数字列之间的关联趋势。例如,以下是汽车数据集中城市 mpg 和公路 mpg 之间的关联

皮尔逊相关

这种相关性可视化清楚地显示了两个柱之间非常正的相关性

8.所有分类列之间的 Cramer-V 相关性

Cramer-V 是一种非常有用的数据探索技术,用于发现分类变量之间的相关性。Cramer-V 的结果也可以使用热图来可视化。

在 cars 数据集中,有许多分类列。这是基于所有分类列之间的 Cramer-V 相关性生成的热图

克拉默-V 相关矩阵

正如我们可以看到的,列 fuel_system 和 fuel_type 高度相关

9.两个特定分类列之间的相关性

一旦使用 Cramer-V 相关矩阵检查了分类列之间的相关性,就可以进一步研究任意两个分类列之间的相关性。这可以使用两列之间的气泡图来完成,气泡的大小表示出现的次数

分类列之间的相关性

你会发现大多数燃料系统都有一种燃料类型的气体,证实了这两个领域之间的强相关性

10.聚类大小分析

我们生活在一个拥有海量数据的世界。很容易陷入数据过载的困境。为了在这个不断增长的数据世界中生存,我们需要从高层次的角度来看待事物。

将事物组合在一起可以让我们有一个高层次的视角。成组的数据允许我们首先查看成组的而不是单个的数据点。您更喜欢查看数百万条数据记录还是查看几组数据?答案显然是以后,因为我们人类更喜欢以自上而下的方式理解

数据科学可以帮助我们完成从大量数据中创建少数群体的惊人壮举。在数据科学术语中,分组的过程也称为聚类或分段。制作数据段是一种很好的数据探索技术,因为它提供了一个很好的数据概览

作为分段的第一步,对聚类大小进行分析是有用的。聚类大小分析显示了如何将数据分成不同的组。

聚类大小分析

正如我们可以观察到的,如果我们将所有数据分为 3 组,那么我们将拥有大小大致相同的簇

11.聚类或分割

一旦确定了簇的数量,下一步就是将所有数据分成特定数量的簇或段。

此处显示的是将所有数据分为三类的结果。这一结果在数据探索中非常有用

使聚集

为了使聚类成为更有效的数据探索工具,有必要了解聚类的含义。在本例中,我们观察到决定聚类的重要列是整备质量和长度。基于此,我们可以看到汽车可以分为三类——小型车、中型车和大型车。这种聚类练习在数据探索中非常有用

12.异常值概述

在数据中发现一些不寻常的东西称为离群点检测(也称为异常检测)。这些异常值代表一些不寻常的、罕见的、异常的或特殊的东西。离群值不一定意味着负面的东西。异常值分析极大地帮助提高探索性数据分析的质量

数值列中的异常值可以通过各种技术获得,如标准偏差分析或隔离森林等算法。异常值概述分析给出了所有数字列中异常值的概述。

气泡图显示具有很低或很高值的列。气泡越大,意味着列中存在的异常值越多

异常值概述

上面显示了 cars 数据集中数值列的异常值概述。它显示大多数异常值都在“气缸数量”列中

13.单个数值列的异常值分析

一旦您检查了哪些列具有非常高或非常低的值,您就可以分析各个列。

可视化中显示了一个方框图。在方框图中,正常范围由最左侧和最右侧的垂直线表示。超出正常范围的点是异常值。左侧的点是非常低的值,最右侧的点是非常高的值

单个数值列的异常值

作为上面的例子,cars 数据集中列马力的异常值分析如上所示

14.多个列的异常值分析

探索性数据分析的一个重要步骤是基于多列(行级)发现异常值。这可以使用各种算法来实现,例如隔离森林

显示散点图,异常值用不同颜色标记(标签 1)。散点图的轴基于列,因此该行是异常值。

多个列的异常值分析

在异常值分析过程中,获取数据点或数据行是异常值的原因也很重要。在 cars 数据集的示例中,您可以看到大多数异常值都与高权重和高长度相关

15.专业可视化

到目前为止,你所看到的大多数可视化都是经典的,比如条形图、散点图等..然而,在数据勘探过程中,添加一些专门的可视化工具非常有价值,如雷达图、神经网络可视化工具或 Sankey 图表

这有助于更好地理解数据。雷达图有助于比较。而神经网络可视化可以帮助理解哪些列的组合可能是重要的特征,或者还可以帮助理解隐藏或潜在的特征。桑基图在进行路径分析时非常有用

用于比较的雷达图

理解隐藏或潜在特征的神经网络

用于路径分析的 Sankey 图

还有很多数据探索技术,但是上面的 15 个会给你一个好的开始。下次您看到一些原始数据时,借助这些数据探索技术,您将很快获得真知灼见

额外资源

网站(全球资讯网的主机站)

你可以访问我的网站进行零编码分析。https://experiencedatascience.com

订阅每当我发布一个新的故事时,请及时通知我。

[## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。

每当 Pranay Dave 发表文章时,您都会收到电子邮件。通过注册,您将创建一个中型帐户,如果您还没有…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)

你也可以通过我的推荐链接加入 Medium。

[## 通过我的推荐链接加入 Medium—Pranay Dave

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)

https://www.youtube.com/c/DataScienceDemonstrated 的 YouTube 频道
这里是我的 Youtube 频道
的链接

在你开始第一个项目之前,要掌握 15 个 Git 命令

原文:https://towardsdatascience.com/15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9?source=collection_archive---------10-----------------------

您需要掌握的唯一 Git 教程是在命令行控制版本,并加速您的开发职业生涯

罗曼·辛克维奇Unsplash 拍摄的照片

作为一名 web 开发人员,你刚刚开始你的第一个项目,并且希望跟踪你的工作目录中的大量变化?你最终被选为一名初级数据工程师参加面试,并对版本控制话题感到有些生疏?或者您只是从事数据科学的工作,想要学习更多关于 Git 和命令行的知识,以便向您的团队展示您根本不使用任何 GUI 也可以获得同样的结果?

如果你回答“是的,我在这里!”至少添加到上面的一个配置文件中,那么本教程肯定可以帮助你通过命令行学习更多关于版本控制的知识,而且会很快完成!

和许多其他数据分析师和 BI 开发人员一样,我通过 GitHub GUI 了解了版本控制。当时,我的公司正在使用 Looker 作为可视化工具,它可以配置一个方便的 Git 集成,以便在开发模式下管理文件版本

在提交和部署变更时,每一步在视觉上都非常吸引人和用户友好,直到有一天一位数据工程师告诉我:“版本控制?我总是在我的终端上使用相同的 4–5 个命令,工作完成了!我很少访问用户界面”。

然后他又打了一个字,而我则羡慕地盯着他的笔记本电脑。那时我意识到下一步应该是学习命令行以及如何用 Git 进行版本控制。

在本教程的剩余部分,你会发现我在项目中使用最多的 15 个命令。

[## 3 纳米学位你应该考虑在 2021 年推进你的数据工程职业

towardsdatascience.com](/3-nanodegrees-you-should-consider-to-advance-your-data-engineering-career-in-2021-baf597debc72)

首先,什么是 Git?

Git 是一个用于版本控制的命令行工具,只需在 shell 中输入 Git 即可访问。第一步是创建一个新目录并初始化一个存储库:

$ **mkdir medium_git**
$ **cd medium_git/**

我已经创建了一个 medium_git 文件夹,我将在本教程的剩余部分使用它,它将包括下面讨论的所有命令的列表。可以在我的 GitHub 的 code_tutorials 资源库中找到。

Git 命令解释

1。git init → 该命令初始化 medium_git 文件夹中的存储库,这意味着从现在开始,它将跟踪文件夹中文件的多个版本。初始化 Git 存储库还会创建一个名为的目录。存储库文件夹中的 git 。带有句点前缀的文件和文件夹。)通常是私有的,当您列出文件夹中的文件时,默认情况下不会显示,除非使用 ls -a 命令:

$ **git init**Initialized empty Git repository in /Users/antonellobenedetto/Documents/medium_git/.git/$ **ls -a**.  ..  .git 

然后,让我们创建一个名为 git_commands、的 markdown 文件(.md,它只包含对git init 功能的简要描述,并将它保存在 medium_git 存储库中。

  1. git 添加 →在 git 中,文件可以处于以下三种状态之一:已修改已登台已提交。如果您准备提交您修改过的文件,您可以使用git add [file name] 命令将它们添加到暂存区。然后,暂存文件被标记为包含在下一次提交中,但尚未提交:
$ cat git_commands.md1\. git init <-- initializes a repository inside the folder$ git add git_commands.md

使用git add .(或者使用通配符git add *)可以获得相同的结果。唯一的区别是,通过这种方式,存储库中的所有文件将同时转移。

3。git 配置 user.name/user.email在你第一次提交之前,告诉 git 你是谁是个好习惯。当您在团队中工作时,这一点尤为重要,这样每个成员都可以识别出是谁做出了某项承诺:

$ **git config --global user.name ‘anbento’**
$ **git config --global user.email ‘anbento@myemail.com’**

如果您希望检查您的配置设置,请键入git config -l

4。git commit-m ' your message '→commit 在某个时间点将文件的快照存储在存储库中。通过构建这些快照的历史,您可以回滚到更早的时间点。 -m 标志表示您正在添加一条消息,并且它后面的引号中的文本就是提交消息本身。习惯上,提交消息应该提供一些信息,所以如果我们必须回卷或合并代码,那么很明显已经做了哪些更改以及何时做的:

$ **git commit -m ‘Adding git_commands.md file’**[master (root-commit) 815d087] Adding git_commands.md file1 file changed, 3 insertions(+)create mode 100644 git_commands.md

5。git log →您可以使用这个命令调出存储库的提交历史。每个提交都分配有一个 40 字符长的唯一 ID 或散列。提交散列是永久的,这意味着Git 保存它们,并将它们包含在本地和远程 repos 之间的传输中。另请注意,提交作者的姓名和电子邮件如何显示在每个提交历史记录下:

$ **git log**commit 815d087f132288112b7e427617be0408e6db4974 (**HEAD -> master**)Author: anbento <anbento@myemail.com>Date: Sat Apr 4 08:19:16 2020 +0100Adding git_commands.md file

6。git remote add[remote name][remote URL]→有时,您可能希望将您的更改推送到(例如)GitHub 上的一个存储库,以便您可以使用其他设备访问您的完整项目历史,或者只是与您的团队协作。为了做到这一点,您首先必须创建存储库本身,然后在终端中运行命令:

$ **git remote add origin** [https://github.com/anbento0490/code_tutorials.git](https://github.com/anbento0490/code_tutorials.git)$ **git remote -v**origin https://github.com/anbento0490/code_tutorials.git (fetch)
origin https://github.com/anbento0490/code_tutorials.git (push)

在这种情况下,首先我在我的 GitHub 帐户上创建了code _ tutorials资源库,然后我将它作为 remote 添加到 origin 别名下。请记住"只是一个约定俗成的名称,但是如果您愿意,您可以随意给遥控器起不同的名字。通过指定 -v 选项,您可以检索分配给每个别名的完整远程 url。如果您犯了一个错误,希望移除遥控器,只需运行git remote remove origin 命令。

7。git push[remote name][branch name]→一旦您对 repo 的本地版本进行了更改,您就可以将它们推送到远程 repo,这样您的项目及其整个提交历史就可以安全地存储在云中。这意味着,即使你的笔记本电脑崩溃或被盗,你的作品也不会丢失,并且可以从你的 GitHub 帐户中找回。为此,您需要**将主分支推至远程【原点】回购**:

*$ **git push origin master**Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 282 bytes | 282.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [https://github.com/anbento0490/code_tutorials.git](https://github.com/anbento0490/code_tutorials.git)
* [new branch] master -> master*

一旦您这样做了,原来只在本地工作目录中可用的文件将被上传到您的远程 repo 中,以及关于您的提交的信息:

8。git clone[repository URL][folder name]→如果您或您的同事希望在另一个设备上下载您的项目文件夹,您可以通过在本地克隆远程存储库来实现。在我的例子中,我回到了主目录,并克隆了存储库,指定了原来的名称 medium_git :

*$ **git clone** [**https://github.com/anbento0490/code_tutorials.git**](https://github.com/anbento0490/code_tutorials.git) **medium_git**Cloning into ‘medium_git’…
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0Unpacking objects: 100% (3/3), done.*

上面的命令不仅创建了一个名为" medium_git "的目录,而且还初始化了其中的一个.git目录,下载了该存储库的所有数据,并签出了一个最新版本的工作副本。

第一次尝试从远程存储库克隆私有 repo 时,会要求您提供用户名和密码 ( 除非已经使用 SSH 密钥连接到 GitHub )。凭据可以通过以下方式直接嵌入 url:

*git clone https://your_username:your_pw@github.com/anbento0490/repo_name.git*

提供一次身份验证后,Git 会在内存中缓存您的凭证,并在需要时分发它们。如果git config credential.helper 命令返回manager,密码被存储在 windows 凭证管理器中,如果它返回store,密码被存储在用户文件夹的.git-credentials文件中,如果它返回oskeychain,密码被存储在钥匙串中。

9git pull 对于本教程,为了模拟协作环境中通常会发生的情况,我直接在 GitHub 中编辑了 git_commands.md 文件,向列表中添加了更多命令,并提交了更改:

此操作创建了一个具有唯一标识符的新提交。在运行以下命令之前,提交和更改仅在远程存储库中可见:

*$ **git pull origin master**remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From [https://github.com/anbento0490/code_tutorials](https://github.com/anbento0490/code_tutorials)
* branch master -> FETCH_HEAD
815d087..b3088e3 master -> origin/master
Updating 815d087..b3088e3
Fast-forward
git_commands.md | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)*

10git diff [HEAD~1] [HEAD]→ 如果您现在从远程 repo 中提取后运行git log ,您将看到两次提交,最上面的一次是最近的一次。要查看两次提交之间的差异,只需键入:**

***$ **git diff HEAD~1 HEAD****diff — git a/git_commands.md b/git_commands.md
index ddd61c8..3cb7e12 100644
— — a/git_commands.md
+++ b/git_commands.md** @@ -1,3 +1,11 @@+Git 15 Most Used Commands
1\. git init ← initializes a repository inside the folder
+2\. git add
+3\. git config user.name/user.email
+4\. git commit -m ‘ your message’
+5\. git log
+6\. git remote add [remote name][remote url]
+7\. git push [remote name] [branch name]
+8\. git clone [repository url] [folder name]
+9\. git pull [remote name] [branch name]***

您可以使用名为 HEAD特殊变量,而不是键入每个散列的前 3-4 个字符,该变量总是指向当前分支中最近的提交。您还可以使用快捷方式来获取旧的提交散列,其中 HEAD~1 是本地回购中第二个最新的提交, HEAD~2 是第三个最新的提交,依此类推。**

11。git fetch[remote name][branch name]→git pull 完全一样,该命令用于从远程存储库下载文件并提交到本地存储库中。您可以考虑这两个命令的更保守的版本,因为它将下载远程内容,但不更新您的本地 repo 的工作状态,保持您当前的工作不变。如果您在本地有正在进行的未决变更,git fetch 将避免冲突的发生,并且通常用于协作环境中,以查看其他人都在做什么,而不会强迫您将变更合并到您的存储库中。

为了展示git fetch有多有用,我在 GitHub 的列表中添加了另一个命令并提交了更改,这样远程存储库再次比本地存储库有更多的提交。第三个提交 ID 以 40ae0be 开始,您可以通过运行以下 3 个命令来验证:

***$ **git fetch origin master**remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From [https://github.com/anbento0490/code_tutorials](https://github.com/anbento0490/code_tutorials)
b3088e3..40ae0be master -> origin/master$ **git checkout origin/master**Note: checking out 'origin/master'.
You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example:git checkout -b <new-branch-name>HEAD is now at 40ae0be... Update git_commands.md$ **git log**commit 40ae0bebb77b8df716439b94bb5005a65c0e6301 (**HEAD**, **origin/master**)Author: AnBento <35920666+anbento0490@users.noreply.github.com>
Date:   Sun Apr 5 06:56:07 2020 +0100Update git_commands.mdcommit b3088e373b881a526844826a2dade7b1443eefbb (**master**)
Author: AnBento <35920666+anbento0490@users.noreply.github.com>
Date:   Sat Apr 4 18:39:48 2020 +0100Update git_commands.mdcommit 815d087f132288112b7e427617be0408e6db4974
Author: anbento <anbento@myemail.com>
Date:   Sat Apr 4 08:19:16 2020 +0100
Adding git_commands.md file***

因为提取不会向本地回购添加任何新的提交,所以您应该使用git checkout origin/master 从本地分支()切换到远程分支(源/主)并进入所谓的“分离头状态”。这允许您运行熟悉的命令,如git loggit diff ,探索您的同事提交给远程回购的内容。**

12。git reset [ — flag][#hash] →让我们假设在获取新的提交之后,您对团队所做的更改感到满意,因此您运行git pull 来更新您的本地目录,但是在稍后阶段,您注意到了一个问题,并且想要恢复到倒数第二个提交,或者您只是希望看到项目在更早的时间点是什么样子。在这两种情况下,您都可以运行:

***$ **git reset — hard HEAD~1**HEAD is now at b3088e3 Update git_commands.md***

使用这个命令,Git 切换回具有该特定散列的提交。如上所述,为了使你的工作流程更快,你可以利用特殊可变头— hard 标志将工作目录和 Git 历史重置为特定状态。如果您省略了这个标志,或者使用了 —软标志,它将跳过对工作目录的修改,只重置 Git 历史。**

13。Git branch[branch name]/Git branch-d[branch name]→Git branch 允许用户在同一个 repo 中创建几个不同的工作区域。在专业环境中,通常会创建一个新的分支,每当你希望对一个项目做一些改变或者修复一个 bug* ,然后当我们完成后,将那个分支合并回主分支。当你初始化一个新的本地 repo 时,Git 自动创建 分支:***

***$ **git branch**
* master***

要创建新分支,请运行以下命令:

***$ **git branch project1/add_commands**$ **git branch project1/branch_to_delete**$ **git branch*** master
project1/add_commands
project1/branch_to_delete***

这样,您将创建两个分支( project1/add_commandsproject 1/branch _ to _ delete),这两个分支现在将与主分支一起列出。分支的名字应该是有意义的,并且清楚地表明它最初被创建的原因(添加一个新特性,修复一个 bug,执行一个杂务)。使用git branch delete [branch name] 命令删除一个分支:**

***$ **git branch -d branch project1/branch_to_delete**Deleted branch project1/branch_to_delete (was b3088e3).***

14。git checkout [branch name] → 要切换到新的分支,请运行以下命令:

***$ **git checkout project1/add_commands**Switched to branch ‘project1/add_commands’***

一个常见的快捷方式是使用git checkout -b [branch name] 命令创建一个新的分支并立即切换到它。一旦创建了分支并添加了 commit,就可以将分支推送到远程 repo。这允许其他人看到您的更改,并在单独的工作区域与您协作:

***$ **git push origin project1/add_commands**Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 444 bytes | 444.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote: Create a pull request for ‘project1/add_commands’ on GitHub by visiting:
remote:[https://github.com/anbento0490/code_tutorials/pull/new/project1/add_commands](https://github.com/anbento0490/code_tutorials/pull/new/project1/add_commands)
remote: To [https://github.com/anbento0490/code_tutorials.git](https://github.com/anbento0490/code_tutorials.git)
* [new branch] project1/add_commands -> project1/add_commands***

在我的例子中,我已经将最后 5 个命令添加到列表中,并通过项目 1/add_commands* 分支提交了更改。最后,我将提交推送到远程回购,这样现在 GitHub 帐户上就可以看到两个分支,其中 project1/add_commands 比主回购多显示一个提交:***

你也可以使用git branch -r 来显示遥控器上的所有分支,并确认你的分支在那里。相反,git branch -a 将显示本地可用的所有分支:

***$ **git branch -r**origin/master
origin/project1/add_commands$ **git branch -a**master
* project1/add_commands
remotes/origin/master
remotes/origin/project1/add_commands***

15。git merge [new_branch name] → 合并允许开发人员将提交从一个分支复制到另一个分支。这使得协作工作成为可能,因为每个团队成员都可以在他们自己的分支上高效地开发项目功能,而不会发生冲突,然后将它们合并到中,以便最终用户可以访问它们。要将 project1/add_commands 合并到 master, 检出到 master 分支,然后运行git merge 命令:**

***$ **git checkout master**Switched to branch ‘master’$ **git merge project1/add_commands**Updating b3088e3..cdb97d4
Fast-forward
git_commands.md | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)$ **git branch -d project1/add_commands**Deleted branch project1/add_commands (was cdb97d4).***

为了避免混淆,一旦丢失的提交被合并到主分支中,较新的本地分支通常被删除。**

结论

对于那些设法完成本教程的人,我要说:“做得非常好!”我希望你在这里学到的,对你的耐心有所回报。在这篇文章中,我带你了解了在你开始你的第一个 web 开发或数据科学项目之前需要掌握的 15 个 Git 命令,因为版本控制很酷,可以帮你省去很多麻烦!如果你想阅读更多,请确保查看 Bitbucket 提供的这个优秀的 Git 教程

您可能还喜欢:

**** [## Python 中复制的 8 个流行的 SQL 窗口函数

关于如何利用业务分析中的 Pandas 高效复制最常用的 SQL 窗口的教程…

towardsdatascience.com](/8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7) [## 气流:如何在睡觉时刷新股票数据——第 1 部分

在这个关于 Apache Airflow 的第一个教程中,学习如何构建一个数据管道来自动提取、转换和…

towardsdatascience.com](/airflow-how-to-refresh-stocks-data-while-you-sleep-part-1-a464514e45b7)****

15 张图显示了冠状病毒如何改变我们的搜索

原文:https://towardsdatascience.com/15-graphs-which-show-how-coronavirus-is-changing-what-we-search-for-bc07bc4302a3?source=collection_archive---------29-----------------------

在整个西方世界,新冠肺炎病例的迅速增加不仅改变了我们的行为方式,也改变了我们寻找的东西。

随着新冠肺炎病例在整个西方世界的迅速增加,我们许多人转向谷歌获取信息也就不足为奇了。我们不只是研究病毒本身;新冠肺炎正在改变我们搜索旅游、娱乐和金融信息的方式。

为了了解案件的增加如何影响我们的搜索行为,我使用谷歌趋势 API 提取了一系列不同搜索趋势的数据,这些数据与冠状病毒搜索量的增加或正或负相关。下面是我发现的一些最有趣的图表。

旅行

不足为奇的是,全球新冠肺炎病例的增加对我们的旅游态度产生了巨大影响,并随之影响了我们的搜索内容。随着热门度假目的地的病例增加,以及边境关闭的威胁不断增加,越来越多的人开始询问如何取消航班预订:

上升的不仅仅是取消;那些有旅行计划的人越来越多地希望申请保单,并购买新的保单:

虽然 Skyscanner 等价格聚合器的搜索量有所下降,但通过更通用的搜索词寻找降价航班的人数却有所增加:

这并不一定意味着人们仍然在预订航班。搜索量已经从品牌关键词(、【英国航空】、)转向通用关键词(、【机票】、),这一事实可能表明,消费者只是在研究那里有什么,还没有购买的意图。

金融

过去几周的话题之一是冠状病毒恐惧对全球金融体系的影响。由于大量行业的供应链受到冠状病毒爆发的影响,消费者担心他们的金融未来也就不足为奇了。

一个直接影响是,寻求将资产转移出股市、甚至利用这种不确定性的人增多了:

鉴于目前的市场动荡,消费者越来越担心经济衰退的前景就不足为奇了。这张图表追踪了过去 3 个月对衰退的搜索,以真正强调担忧的增加以及它与对冠状病毒的兴趣有多么密切的关联:

上图中有趣的一点是,在一月底冠状病毒搜索的第一次上升期间,关于衰退的搜索似乎没有显著增加。当时 mainland China 的病例正在上升,但在西方很少观察到病例。

这表明,在普通谷歌用户真正担心衰退的可能性之前,西方的案例有所增加。

运动

随着许多体育比赛和赛事的取消,一个大问题仍然存在:东京奥运会会如期举行吗?

虽然在撰写本文时还不知道这个问题的答案,但消费者越来越担心奥运会将被取消:

无论奥运会是否如期举行,搜索量趋势显示,由于消费者对冠状病毒的担忧加剧,门票需求大幅下降:

健康

随着冠状病毒成为一种健康流行病,病例的增加影响了我们搜索健康信息的方式也就不足为奇了。

我发现一个有趣的数据切割方法是查看对新冠肺炎主要症状的搜索:

有趣的是,这些词的搜索量一直或多或少保持稳定,直到 3 月中旬才急剧上升。这可能是因为随着冠状病毒在西方国家传播,这些症状的发病率增加,而谷歌在西方国家是最常用的。

或者,在围绕冠状病毒的恐慌中,人们更有可能通过谷歌搜索这些症状来确认或拒绝他们是否患有新冠肺炎。毕竟,大多数人都很熟悉喉咙痛,他们通常不会在网上搜索信息。然而,面对感染新冠肺炎病毒的前景,有可能会有更多的人转向谷歌,不管他们是否真的感染了病毒。

另一个有趣的健康趋势与用户在线寻找的健康信息类型有关。虽然对在线医生的搜索(令人惊讶地)保持相当平稳,但人们已经开始越来越多地转向在线症状检查器寻求医疗建议:

工作

随着越来越多的西方公司关闭了他们的物理办公室,对远程工作和视频会议的搜索出现了大幅增长:

上图中特别有趣的是,橙色和绿色线条直到 3 月 8 日左右才真正开始上升。这可能反映出,尽管新冠肺炎病例越来越多,但在 3 月 9 日周一开始的一周之前,很少有公司实施远程工作。

关于团队沟通软件品牌如 Zoom 和 Slack 如何从向远程工作的转变中获益的新闻已经很多了,看看它们的搜索量就可以反映出:

虽然上图中最明显的特征是最右边的巨大跳跃,但也值得注意的是,Zoom 和 Slack 的搜索量在过去两个月里稳步增长。

这可能是由于许多非西方公司在转向远程工作时更早地采用了这些品牌。

娱乐和活动

最后但同样重要的是,西方对冠状病毒日益增长的担忧也改变了我们闲暇时的行为。OpenTable 的首席运营官 Andrea Johnston 已经指出了一个明显的趋势,那就是消费者越来越不愿意外出就餐:

然而,不仅仅是餐馆受到冠状病毒恐惧的严重打击,电影院的搜索流量也在下降:

上述两种趋势都是可以预测的;谁会愿意在一个封闭的空间里,在一场流行病中,与可能有数百人在一起呢?

你可能期望看到的一些其他趋势似乎还没有出现。随着越来越多的人留在疫情,许多人预计像网飞这样的公司将在整个冠状病毒中繁荣发展。但到目前为止,谷歌趋势并没有显示任何支持这一点的数据:

许多人预计在这种环境下蓬勃发展的其他品牌是 Peloton 和 Zwift,这两家最受欢迎的室内锻炼提供商:

上面的数据显示,这两个网站的搜索流量都没有显著增加,如果有的话,可能在最近几周有所下降。

也许像网飞和 Peloton 这样的室内友好型品牌期待看到增长还为时过早。也许我们要等到更多的西方国家实施检疫措施后,人们对这些品牌的兴趣才会开始回升。

最后

上面的图表显示,对冠状病毒的日益关注与搜索行为的一些有趣变化相关;无论是我们寻求的金融建议,还是我们寻求的医疗信息。

毫无疑问,这些趋势中的许多可能在几周内看起来完全不同,我们可能会看到我们现在甚至无法预测的新趋势。

你对趋势有什么想法吗?我很想在推特上听到你的想法:@ mackgenfell

https://mackgrenfell.com】最初发表于

赢得 3 次以上黑客马拉松后我学到的 15 件重要事情

原文:https://towardsdatascience.com/15-important-things-i-learnt-after-winning-more-than-3-hackathons-65c99cebf9fd?source=collection_archive---------21-----------------------

从我赢得黑客马拉松后的经历中得到的重要提示

费利佩·费塔多在 Unsplash 上的照片

黑客马拉松是人们展示技能的终极战场。任何黑客马拉松的目的都是让你的想象力引导你拓展这个领域的知识和技能。

两年前,在学习了中级 android 和数据科学技能后,我开始了我的黑客马拉松之旅。到目前为止,我已经参加了 20 多个黑客马拉松,包括在线和离线黑客马拉松。

注意:这些是我已经到达最后阶段的黑客马拉松,不仅仅包括在黑客马拉松中注册。

简单介绍一下我在黑客马拉松中的成就,我是 Smart India 黑客马拉松的冠军,在线数据科学黑客马拉松的冠军和 IIT·马德拉斯黑客马拉松的亚军。

智能印度黑客马拉松 2019

IIT 马德拉斯 ML 黑客马拉松 2019

在这次旅程中,我根据自己的经验,在每个人参加黑客马拉松之前,为他们列出了 15 条重要的建议。

一次只关注一个黑客马拉松

有这么多的黑客马拉松即将到来,不要试图一次注册多个黑客马拉松。这可能会分散你对他们中任何一个人的注意力。尽可能保持简单,一次在一个黑客马拉松中尽你最大的努力。

黑客马拉松更多的是学习而不是获胜

你应该列出黑客马拉松的候选名单,这会提高你正在学习的技能。

如何组建你的团队

通常,人们会和他们的密友一起参加所有的黑客马拉松。你应该开始组建团队,让那些能为黑客马拉松贡献自己技能的人加入进来。

始终与拥有黑客马拉松所需的各种技能的人组成团队,这样你就可以扩大你的解决方案的范围。

小贴士:和拥有不同技能的人组成团队,这样你就可以向他们学习。我总是尝试和新人一起为黑客马拉松创建团队,因为这有助于提高我的团队合作技能,也可以在如此短的时间内获得与陌生人协调的经验。

理解问题

一旦你创建了你的团队,你需要理解黑客马拉松中提到的问题。你需要了解黑客马拉松背后的原因以及他们试图从黑客马拉松中得到的解决方案。

这个阶段需要时间和努力,因为你必须明智地选择你的黑客马拉松。选择你有想法并且可以帮助提供解决方案的黑客马拉松。

如果你仍然不清楚这个想法,那么你可以参考以前在互联网上解决这个问题的方法,看看人们是如何解决的。

不要直接从网上抄袭想法。黑客马拉松是关于你自己的想法和你如何实现它。

如果需要,领域专业知识

如果你的问题依赖于某个特定的领域,你就需要对那个领域进行研究,以便对问题有一个清晰的认识。例如,很少有黑客马拉松以农业或健康为主题。建议找一个在那个领域有经验的人来指导你把问题搞清楚。

洗脑

你需要和你的队友坐下来讨论你的想法和你如何解决这个问题。继续记下你所有的想法,因为你永远不知道哪个想法会成为你的 USP——独特的卖点

USP——一个可以为问题提供重要解决方案的想法,以前没有实施过。

将你的想法分为两部分→必须做的想法和正常的想法

必须做的事情想法是你必须在你的黑客马拉松中完成的重要想法,而普通的想法是你认为不那么重要而不能完全完成的想法。这将有助于你在时间有限的时候参加黑客马拉松。

记住这是团队的努力

在开始解决方案之前,将项目分配给所有的团队成员。确保每个人都对解决方案做出贡献,因为这将有助于快速完成您的解决方案。如果团队中的某个人完成了项目的 80%,你可能会完成项目,但是你不会学到团队合作的品质或者一个团队实际上是如何一起工作的。

制定计划

既然你被期望在 24 小时内完成这么多工作,你必须制定一个计划并设定你的目标。我总是把工作分成几个小时。例如,我为一个特定的功能分配 2 个小时,并尝试在给定的时间内完成它。

最后记得留 2-3 小时的缓冲时间。会有一些时间,很少有事情会比你分配的时间更长,或者在你的解决方案中可能会有法官建议的改变。

"没有长远打算的人会发现麻烦就在他家门口。"――中国哲学家孔子

不要试图完成所有的事情,

大多数团队没有完全完成他们的项目。这完全没问题,因为每个团队都有很短的时间来创造有价值的产品。

它更多的是关于你的想法和你为把它做成一个产品所付出的努力。

记得我之前告诉你的吗?既然你已经把你的想法分为必须做的想法和正常的想法,你就可以根据它们来确定工作的优先顺序。这将允许您在黑客马拉松期间完成项目的重要功能。

总是寻求帮助

黑客马拉松期间将会指派导师。接受他们的指导。被指派的导师在他们的领域有丰富的经验和知识,所以不要羞于接近他们。他们被指派来帮助你,所以与他们讨论你的想法,使你的解决方案更好。如果你被某个东西卡住了,不要浪费你宝贵的时间去调试它几个小时。向对你的工作有想法的导师寻求帮助。

定期听取反馈

你决定采用的解决方案不一定是评委们想要的。听取导师对关注哪些想法的反馈。

接受反馈将帮助你专注于重要的想法,避免你在对他们没有价值的想法上浪费时间。时间是宝贵的。

午睡

你将连续工作 24 或 36 个小时来解决问题。建议小睡 10 分钟来提神,这样你就能有效地继续工作。相信我,这对提高你的工作效率很有帮助。

与其他团队讨论

在我的黑客马拉松完成后,我会去找其他团队,花一个小时讨论他们的想法。这有助于了解我没有想到的不同想法。

与人分享知识有助于你成长和产生新的想法。

定期测试您的项目

在将你的项目提交给评委之前,一定要多次测试。在我参加的几乎所有黑客马拉松中,我都看到应用程序和网站在评审过程中崩溃。

做最好的准备,做最坏的打算。

如果可能的话,准备好实施的截图和视频。

展示事项

经过几个小时的连续工作和几天的洗脑,你有 5 分钟的时间来解释你的工作。你需要在这 5 分钟内完成所有的努力。

有效的陈述不仅有助于联系你的评委,还能让他们专注于你的核心解决方案。

在您的演示文稿中添加有限的重要内容,并包括图像,以便人们容易理解。

最后,学习比获胜更重要

还记得我开始写这个博客时的任何黑客马拉松的目的吗?

任何黑客马拉松的目的都是让你的想象力引导你拓展这个领域的知识和技能。

以下是你从任何黑客马拉松中学到的重要东西:

  • 促使你在短时间内完成一项任务。
  • 帮助与世界各地的杰出人士建立联系
  • 向您展示您可以改进的地方
  • 增强你的软技能
  • 帮助你学习新技能
  • 与人合作完成任务
  • 帮助你跳出思维定势
  • 通过将热情和勤奋的人聚集在一起来激励你

如果你赢了又有什么区别呢?

赢得黑客马拉松只是蛋糕上的樱桃。

老实说,更多的是学习和提高自己,而不是获胜。在黑客马拉松结束时,总是问自己是否为自己的所作所为感到骄傲。获得成就感比胜利更重要。我总是惊讶地看到参与者在 24 小时内尽了最大努力后容光焕发的脸。那种感觉是无价的。

希望你们喜欢!

15 分钟后点火

原文:https://towardsdatascience.com/15-minutes-to-spark-89cca49993f0?source=collection_archive---------30-----------------------

从配置到 UDF,像老板一样在 900 秒内开始工作

Jukan Tateisi 在 Unsplash 上拍摄的照片

正如我在写的几乎所有关于这个工具的文章一样,Spark 和 SQL 一样超级好用。但是不管我花多少时间写代码,我就是不能在我的大脑中永久存储 Spark APIs】(有人会说我的内存就像 RAM,小而易失(😃。

无论您是想要 Spark SQL 的快速入门,还是不耐烦编写您的第一个查询,或者您和我一样需要一个备忘单,我相信您会发现这篇文章很有用。

这篇文章的想法是涵盖 Spark SQL 的所有主要功能/特性,并且在片段中,您总是可以看到原始的 SQL 查询及其在 PySpark 中的翻译。

我将在 上执行我的代码。这个数据集 : 是我几个月前为另一篇中型文章创建的,名为六个 Spark 练习,用来管理所有这些练习 ,它由三个简单的表格组成:

基础知识

Apache Spark 是一个用于大规模并行数据处理的引擎。这个框架的一个惊人的特点是它用多种语言公开 API:我通常用 Scala 与它交互,但其他很多人用 SQLPython ,甚至 JavaR

当我们编写一个 Spark 程序时,首先要知道的是,当我们执行代码时,我们不一定对数据执行任何操作。事实上,该工具有两种类型的 API 调用:转换动作。Spark 转换背后的范例被称为惰性评估,这意味着实际的数据处理不会开始,直到我们调用动作
为了理解这个概念,想象一下你需要做一个SELECT和一个列的重命名:而没有调用一个动作 (比如一个collect或者一个count),你的代码只是定义了所谓的 Spark 执行计划 ,也就是一旦一个动作被触发,将要执行的一组操作。

Spark 在一个有向无环图(非常著名的 DAG )中组织执行计划。该结构描述了将要执行的确切操作,并使调度器能够决定在给定时间执行哪个任务。

正如宫城先生教导我们的:

  1. 蜡上:定义 DAG ( 变换)
  2. 打蜡:执行 DAG ( 动作)

与火花互动

太好了,我们从哪里开始?使用 Spark 有多种方式:

  • 使用 IDE :我会推荐 IntelliJ 或者 PyCharm,但是我想你可以选择你想要的。查看附录中的 PyCharm 快速入门(在本地运行查询)。我认为可以从您的本地环境中使用远程 Spark executor(使用 Livy 肯定可以,不确定没有它是否容易),但说实话,我从未经历过那种配置。
  • Jupyter 笔记本+Spark magic:Spark magic 是一套通过Livy、Spark REST 服务器 [ 1 ]与远程 Spark clusters 进行交互工作的工具。这是你在 AWS、Azure 或谷歌云等云系统上工作时使用 Spark 的主要方式。大多数云提供商都有在大约 10 分钟内配置集群和笔记本电脑的服务。
  • 通过使用 **spark-shell**的终端:有时你不想在你和你的数据之间有任何东西(例如,在一个表上做一个超级快速的检查);在这些情况下,您可以只打开一个终端并启动spark-shell

下面的代码很大程度上是针对 IDE 的。

在编写任何查询之前,我们需要导入一些库并启动一个 Spark 会话(使用数据集和 DataFrame API 编程 Spark 的入口点)。以下 PySpark 和 Scala 代码片段将加载您需要的所有内容(假设您已经配置了您的系统)。之后,为了简单起见,我们只看 PySpark 代码。除了一些细微差别之外,Scala APIs 非常相似。

PySpark

斯卡拉

解释数据集、数据帧和 rdd 之间的差异在我承诺的 15 分钟内无法完成,所以我将跳过这一部分,假装它不存在。

基本操作

您可以编写的最简单的查询可能是您曾经使用过的最重要的查询。让我们看看如何使用Sales表进行基本操作。

简单的 Select 语句和显示数据

我们在代码片段中做的第一件事是定义执行计划;只有当我们输入了显示动作 时才会执行。

我们可以对 Spark 计划采取的其他行动包括:

  • collect() —返回我们的整个数据集
  • count() —返回行数
  • take(n) —从数据集中返回n
  • show(n, truncate=False) —显示n行。您可以决定截断结果或显示所有长度的字段

另一个有趣的注意事项是列由 **col** 对象标识。在本例中,我们让 Spark 推断这些列属于哪个数据帧。

我们可以使用语法execution_plan_variable["column_name"]来指定列来自哪个执行计划。使用这种替代语法,我们得到:

当我们处理连接时,限定字段的源表尤为重要(例如,两个表可能有两个同名的字段,因此仅使用col对象不足以消除歧义)。Scala 中的语法略有不同:

// Qualify the source execution plan in Scala
sales_table.col("order_id")

重命名和添加列

有时我们只是想重命名一个列,或者我们想添加一个新的列进行一些计算(例如一个CASE WHEN):

简单聚合

Spark 支持所有主要的聚合功能。下面的例子仅指“简单”的(如平均值总和计数等)。).稍后将描述数组的聚合。

显示表模式

显示“”模式是一种误导性的措辞;更精确的定义应该是“显示执行计划的输出模式”。有了 Spark APIs,我们可以一个接一个地用管道传输多个操作;使用printSchema API,我们输出如果我们将执行计划的结果写到磁盘上,最终的表会是什么样子。

在下面的示例中,我们重命名了几列,进行了聚合,并添加了另一列。

printSchema的输出是:

root
 |-- product_id: string (nullable = true)
 |-- total_pieces: double (nullable = true)
 |-- fake_column: integer (nullable = false)

注意**printSchema** 不会触发动作**相反,Spark 会评估执行计划,以了解 DAG 在输出列方面的走向。由于这个原因,这个操作比** **show** 要快得多,后者反而触发 DAG 的执行。

解释执行计划

动作被触发时,引擎将做什么的更详细解释可以通过explain API 获得。在这种情况下,我们将不会获得最终 DAG 节点的简单模式作为输出,但是我们将获得 Spark 将执行的操作的详细说明。让我们调用前面查询中的explain:

== Physical Plan ==
*(2) HashAggregate(keys=[product_id#361], functions=[sum(cast(pieces#379 as double))])
+- Exchange hashpartitioning(product_id#361, 200)
   +- *(1) HashAggregate(keys=[product_id#361], functions=[partial_sum(cast(pieces#379 as double))])
      +- *(1) Project [product_id#361, num_pieces_sold#364 AS pieces#379]
         +- *(1) FileScan parquet [product_id#361,num_pieces_sold#364] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:<PATH_TO_FILE>/sales_parquet], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<product_id:string,num_pieces_sold:string>

老实说,我从来没有发现explain API 太有用,尤其是当 DAG 开始变得庞大和复杂的时候。一个更好的视图可以在Spark UI中找到,它展示了相同信息的图形表示

选择不同

什么情况下

Spark 非常好地实现了CASE WHEN操作(不需要专门的 UDFs 让我们简单地用sales_table将每一行插入到不同的桶中,这取决于num_pieces_sold:

联合所有

有时我们需要将我们的流分成多个部分,然后将所有内容合并到一个表中;在 SQL 中,这用UNION ALL表示。在 Spark 2.1 中,在执行UNION ALL操作之前,必须对列进行排序。幸运的是,Spark 2.3 使用列名来对齐正在被合并的执行计划。在下面的例子中,我们首先将我们的表一分为二,然后将各部分合并在一起(完全没有必要,但它将显示如何使用 API):

让我们来看看explain的幕后发生了什么:

Union
**:- *(1) Project [order_id#483, product_id#484, seller_id#485, date#486, num_pieces_sold#487, bill_raw_text#488]**
:  +- *(1) Filter (isnotnull(num_pieces_sold#487) && (cast(num_pieces_sold#487 as int) > 50))
:     +- *(1) FileScan parquet [order_id#483,product_id#484,seller_id#485,date#486,num_pieces_sold#487,bill_raw_text#488] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:<FILE_PATH>/sales_parquet], PartitionFilters: [], PushedFilters: [IsNotNull(num_pieces_sold)], ReadSchema: struct<order_id:string,product_id:string,seller_id:string,date:string,num_pieces_sold:string,bill...
**+- *(2) Project [order_id#483, product_id#484, seller_id#485, date#486, num_pieces_sold#487, bill_raw_text#488]**
   +- *(2) Filter (isnotnull(num_pieces_sold#487) && (cast(num_pieces_sold#487 as int) <= 50))
      +- *(2) FileScan parquet [order_id#483,product_id#484,seller_id#485,date#486,num_pieces_sold#487,bill_raw_text#488] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:<FILE_PATH>/sales_parquet], PartitionFilters: [], PushedFilters: [IsNotNull(num_pieces_sold)], ReadSchema: struct<order_id:string,product_id:string,seller_id:string,date:string,num_pieces_sold:string,bill...

粗体的两行是被合并在一起的表。

加入火花

当我们的代码出现性能问题时,连接通常是我们想查看的第一个地方。Spark 引擎在并行化非连接操作方面非常出色,但在处理join任务时可能需要调整。 关于这个话题 我写了一整篇文章,所以就不深究这个了:如果你想了解更多,或者你正遇到一些关于 joins 性能的问题,我绝对建议看看!

同时,这里是加入的语法。在示例中,我们将连接SalesSellers表。

除了传统的加入类型(leftrightinnercross等)。),Spark 也支持semianti加入;这两种基本上是一种方式来表达 **IN** **NOT IN** 在 Spark 中的操作:

窗口功能

窗口函数对特定的行子集执行计算,定义为窗口 。经典的例子是子群的排序。在我们的玩具数据集中,假设我们想知道,对于每个卖家,卖得最多的产品是什么。为了提取这些信息,我们需要:

  1. 定义我们将应用排名函数的“分区”——我们需要对每个seller_id销售的产品执行一次排名操作
  2. 应用我们的首选排序函数 n — dense_rankrankrow_number。这里是 Spark 中的窗口函数列表。

下图是我们希望如何对数据进行分区的示例:

用线串

数据科学家在处理数据时面临的另一组非常常见的操作,包括从字符串中提取信息。当然,有很多 Spark APIs 可以对文本数据进行几乎任何(基本)操作。让我们从简单的LIKE操作符开始,然后逐步了解正则表达式的用法。对于 API 的完整列表,我会参考文档;下面,大概是用的最多的那些。

喜欢

在下面的例子中,我们想要使用sales表来选择所有的字符串,其中bill_raw_textLIKE 'ab%cd%'(即从字符串ab开始,中间有一个字符串cd)。

有时候我们想要寻找的模式更复杂,不能用简单的通配符来表达。在这种情况下,我们需要使用正则表达式。让我们深入研究几个函数。在下面的例子中,我们总是要应用相同的正则表达式。

(ab[cd]{2,4})|(aa[abcde]{1,2})

像正则表达式(Regex)

用正则表达式提取模式

操纵数组

在大数据领域定义表模式/数据集市时,数组是一种可能会更多使用的数据类型。Spark 实现了很多操作数组的函数(准确的说是从 2.4 版开始就是这样)。让我们深入研究基础知识。

数组聚合

将列转换成数组就像调用聚合函数一样简单。Spark 2.3 有两种主要类型的数组聚合函数collect_setcollect_list:第一种只包含唯一元素,而后者只是一个组到一个列表的转换。

分解数组

聚合的逆操作是“数组爆炸”,意味着从一个水平数组中,我们要生成一个“垂直”列。为此,我们可以使用explode功能。

其他数组操作(从 Spark 2.4 开始)

不幸的是,Spark 2.3 不支持太多的数组操作。很幸运, Spark 2.4 确实!从 Spark 2.4 开始提供的一些功能包括:

  • array_except(array1, array2) —返回 array1 中而不是 array2 中的元素的数组,没有重复。
  • array_intersect(array1, array2)返回 *array1* *array2* 交集中元素的数组,不重复。
  • array_join(array, delimiter[, nullReplacement])使用分隔符和替换空值的可选字符串连接给定数组的元素。如果 *nullReplacement* 没有设置值,则过滤任何空值。
  • array_max(array)返回数组中的最大值。 *NULL* 元素被跳过。
  • array_min(array)返回数组中的最小值。 *NULL* 元素被跳过。
  • array_sort(array)按升序对输入数组进行排序。输入数组的元素必须是可排序的。 *NULL* 元素将被放在返回数组的末尾。

诸如此类。以上定义直接取自参考文献。我建议你去了解更多的细节!

UDF

最后,用户定义的函数。当我们在默认的 API中找不到转换时,UDF 就是我们要走的路。UDF 是一个自定义函数,程序员可以定义它并将其应用于列,就像我们到目前为止看到的所有 API 一样。它们允许最大的灵活性(我们可以在其中编写几乎任何代码);缺点是 Spark 将它们视为黑盒,因此内部 Spark 引擎优化器(Catalyst)无法进行任何优化:UDF 可能会降低我们代码的速度。

举个例子,让我们实现一个模拟函数array_repeat(element, count)的 UDF,该函数返回一个包含element count次的数组。

除了 UDF 的语法,我建议关注上面使用的lit函数。一些 Spark 函数只接受列作为输入:如果我们需要使用一个常量,我们可能需要将这个常量转换成一个“ **Column** ”。 **lit** 创建一个 **Column** 的文字值

接下来呢?

太棒了。我希望我能够展示出 Spark 并不比 SQL 更难,它基本上是一样的东西,只是用了类固醇。

可以想象,这篇文章的标题有点言过其实:要精通这个工具需要的时间远远超过 15 分钟;我相信以上是一个很好的快速入门,但 Spark 可以提供更多!

从这里去哪里?首先,我的建议是开始使用上面的 API,因为它们将覆盖 70%的用例。当你对基础知识有信心的时候,我会推荐下面两篇文章,是一位值得信赖的作者( lol )几个月前写的。第一个将向您挑战使用该工具开发时遇到的一些经典问题,而第二个将深入探讨 Spark Joins。

更多关于你的文章可以 关注我中的

[## 火花中加入的艺术

Spark 中加速连接的实用技巧

towardsdatascience.com](/the-art-of-joining-in-spark-dcbd33d693c) [## 六个星火练习来统治他们

一些具有挑战性的 Spark SQL 问题,易于在许多现实世界的问题上提升和转移(带解决方案)

towardsdatascience.com](/six-spark-exercises-to-rule-them-all-242445b24565)

附录—配置 PyCharm

在本地(非分布式)环境中安装 Spark 是一个非常简单的任务。在本附录中,我将向您展示 PyCharm Community Edition 的基本配置,以便使用 Python 运行 Spark。有五个简单的步骤:

  1. 下载 PyCharm 社区版
  2. 下载星火
  3. 安装 PySpark
  4. 配置 PyCharm 执行正确的火花执行器
  5. 测试是否一切正常

细节之前的两个注意事项:

  • 我假设你已经在你的系统中正确安装了 Java。
  • Windows 上,你需要安装 Winutils ,这是运行 Hadoop 所需的一组二进制文件。查看 Git repo 了解更多信息

下载 PyCharm 社区版

幸运的是,JetBrains 有 PyCharm 的开源版本。我们可以从他们的网站下载最新版本。安装很简单。

下载 Spark

我们只需要从 Spark 官方网站下载一个 zip 文件。我在写的时候有两个主要版本可用:3.0.12.4.7。对于文章的范围,我们可以选择其中之一。

一旦下载完成,我们只需要在合适的位置解压软件包。

安装 PySpark

是时候运行 PyCharm 并安装所有需要的包了。首先,让我们打开 PyCharm,创建一个新项目和一个新的虚拟环境

最后,直接从 PyCharm,我们可以简单地安装 PySpark:

注意,为了启用提示,我们还应该安装 **pyspark-stubs**

配置 PyCharm 来执行正确的 Spark 执行器

希望我们没有出错,所以我们只需要指示 PyCharm 运行正确的 Spark 执行器。这位于我们解压 Spark 本身的文件夹中。让我们为 PyCharm 项目创建一个Run Configuration

测试是否一切正常

要测试 Spark 是否工作,只需运行下面的代码片段

# Import Libraries
import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.functions import *

#   Initialize the Spark session
spark = SparkSession.builder \
    .master("local") \
    .appName("SparkLikeABoss") \
    .getOrCreate()

print(spark.version)

数据科学家需要知道的 15 个 Python 库

原文:https://towardsdatascience.com/15-python-libraries-that-a-data-scientist-need-to-know-df0b3029ecd9?source=collection_archive---------1-----------------------

PexelsPixabay 拍摄的照片

数据收集、清理、转换、可视化、建模、音频/图像识别和网络相关

如果你是一个数据科学家、数据分析师或者仅仅是一个爱好者,你不应该错过一些非常流行和有用的 Python 库。

在本文中,将列出总共 15 个 Python 库,并对其进行简要介绍。我相信他们中的大多数你可能已经熟悉了,但如果没有,强烈建议你自己去看看。

这些库将分为几个类别,它们是

  • 数据采集
  • 数据清理和转换
  • 数据可视化
  • 数据建模
  • 音频和图像识别

数据采集

照片由 geraltPixabay 上拍摄

大多数数据分析项目从数据收集和提取开始。有时,当你为某个公司工作以解决一个现存的问题时,数据集可能会被给出。但是,数据可能不是现成的,您可能需要自己收集。最常见的情况是,您需要从互联网上抓取数据。

1.Scrapy

[## Scrapy |一个快速而强大的抓取和网络爬行框架

编辑描述

scrapy.org](https://scrapy.org/)

当你想写一个 Python 爬虫从网站提取信息时,Scrapy 可能是最流行的 Python 库。例如,您可以使用它来提取一个城市中所有餐馆的所有评论,或者收集电子商务网站上某一类产品的所有评论。

典型的用法是根据 URL 模式和 XPath 模式来识别出现在 web 页面上的有趣信息的模式。一旦发现了这些模式,Scrapy 就可以帮助你自动提取所有需要的信息,并把它们组织成表格和 JSON 这样的数据结构。

您可以使用pip轻松安装 Scrapy

pip install scrapy

2.美味的汤

[## 美味的汤

下载|文档|名人堂|企业版|来源|变更日志|讨论组|杂志]您没有…

www.crummy.com](https://www.crummy.com/software/BeautifulSoup/#Download)

Beautiful Soup 是另一个用于抓取 Web 内容的 Python 库。人们普遍认为,与 Scrapy 相比,它的学习曲线相对较短。

此外,对于相对较小规模的问题和/或只是一次性的工作,美丽的汤将是更好的选择。不像 Scrapy,你必须开发自己的“蜘蛛”,然后回到命令行运行它,Beautiful Soup 允许你导入它的功能并在线使用它们。因此,你甚至可以在你的笔记本上使用它。

3.硒

[## Selenium 客户端驱动程序— Selenium 3.14 文档

Selenium WebDriver 的 Python 语言绑定。selenium 包用于从…自动化 web 浏览器交互

www .硒. dev](https://www.selenium.dev/selenium/docs/api/py/index.html)

最初,Selenium 被开发为一个自动化的 Web 测试框架。但是开发者发现,把它当 Web scraper 用还是挺方便的。

Selenium 通常在与网页交互后需要获取有趣的数据时使用。比如你可能需要注册一个账号,然后登录,点击一些按钮和链接后获取内容,而这些链接被定义为 JavaScript 函数。在这些情况下,通常情况下,不容易使用刺痒或美丽的汤来实现,但硒可以。

然而,重要的是要注意到,硒将比正常的刮库慢得多。这是因为它实际上初始化了一个 web 浏览器,如 Chrome,然后模拟代码中定义的所有操作。

因此,在处理 URL 模式和 XPaths 时,一定要使用 Scrapy 或 Beautiful Soup。万不得已才选择硒。

数据清理和转换

照片由 Sztrapacska74Pixabay 上拍摄

我想没有必要去宣称数据清理和转换在数据分析和数据科学中有多么重要。还有,有太多优秀的 Python 库很好地做到了这些。我将挑选其中一些,作为数据科学家或分析师,您一定知道它们。

4.熊猫

[## 熊猫

pandas 是一个快速、强大、灵活且易于使用的开源数据分析和操作工具,构建于…

pandas.pydata.org](https://pandas.pydata.org/)

我几乎可以肯定,把熊猫列入这个名单是没有必要的。只要是和数据打交道的,肯定都用过熊猫。

使用 Pandas,您可以操作 Pandas 数据框中的数据。有大量的内置函数可以帮助您转换数据。

不需要太多的文字。如果你想学习 Python,这是一个必须学习的库。

5.Numpy

[## 数字——数字

NumPy 是使用 Python 进行科学计算的基础包。它包含了其他的东西:一个强大的…

numpy.org](https://numpy.org/)

类似地,Numpy 是 Python 语言用户的另一个必须学习的库,甚至不仅仅是数据科学家和分析师。

它将 Python 列表对象扩展为全面的多维数组。还有大量的内置数学函数来支持您在计算方面的几乎所有需求。通常,您可以使用 Numpy 数组作为矩阵,Numpy 将允许您执行矩阵计算。

我相信许多数据科学家将如下开始他们的 Python 脚本

import numpy as np
import pandas as pd

因此,可以肯定的是,这两个库可能是 Python 社区中最受欢迎的库。

6.空间

[## Python 中的 spaCy 工业级自然语言处理

spaCy 旨在帮助您做真正的工作——构建真正的产品,或收集真正的见解。图书馆尊重你的…

空间. io](https://spacy.io/)

Spacy 大概没有前几部出名。Numpy 和 Pandas 是处理数字和结构化数据的库,而 Spacy 帮助我们将自由文本转换成结构化数据。

Spacy 是 Python 最流行的 NLP(自然语言处理)库之一。想象一下,当你从一个电子商务网站上搜集了大量产品评论时,你必须从这些免费文本中提取有用的信息,然后才能对它们进行分析。Spacy 有许多内置特性可以提供帮助,比如工作标记器、命名实体识别和词性检测。

此外,Spacy 支持许多不同的人类语言。在其官方网站上,声称支持 55 个以上。

数据可视化

Pixabay 上由 6689062 拍摄的照片

数据可视化绝对是数据分析的基本需求。我们需要将结果和结果可视化,并讲述我们发现的数据故事。

7.Matplotlib

[## Matplotlib: Python 绘图— Matplotlib 3.2.1 文档

Matplotlib 是一个全面的库,用于在 Python 中创建静态、动画和交互式可视化…

matplotlib.org](https://matplotlib.org/)

Matplotlib 是最全面的 Python 数据可视化库。有人说 Matplotlib 丑。然而,在我看来,作为 Python 中最基本的可视化库,Matplotlib 为实现你的可视化想法提供了最大的可能性。这就像 JavaScript 开发人员可能更喜欢不同种类的可视化库,但当有很多定制的功能不被那些高级库支持时,D3.js 就必须参与进来。

我写过另一篇文章介绍 Matplotlib。如果你想了解更多,可以看看这个。

[## Python Matplotlib 介绍,包含 40 个基本示例

Matplotlib 是 Python 中最流行的库之一。在本文中,提供了 40 个基本示例供您…

levelup.gitconnected.com](https://levelup.gitconnected.com/an-introduction-of-python-matplotlib-with-40-basic-examples-5174383a6889)

8.Plotly

[## Plotly Python 图形库

Plotly 的 Python 图形库制作出交互式的、出版物质量的图形。如何制作线图的示例…

plotly.com](https://plotly.com/python/)

老实说,虽然我相信 Matplotlib 是可视化的必学库,但大多数时候我更喜欢使用 Plotly,因为它使我们能够用最少的代码行创建最精美的图形。

无论您想要构建 3D 表面图、基于地图的散点图还是交互式动画图,Plotly 都能在短时间内满足要求。

它还提供了一个图表工作室,您可以将您的可视化上传到一个支持进一步编辑和持久化的在线存储库。

数据建模

菲洛娜Pixabay 上拍摄的照片

当数据分析涉及建模时,我们通常称之为高级分析。如今,机器学习已经不是一个新奇的概念。Python 也被认为是最受欢迎的机器学习语言。当然,有很多优秀的库支持这一点。

9.Scikit 学习

[## sci kit-学习

“我们使用 scikit-learn 来支持前沿基础研究[…]”“我认为这是我见过的设计最完美的 ML 软件包……

scikit-learn.org](https://scikit-learn.org/)

在您深入“深度学习”之前,Scikit Learn 应该是您开始机器学习之路的 Python 库。

Scikit Learn 有 6 个主要模块

  • 数据预处理
  • 维度缩减
  • 回归
  • 分类
  • 使聚集
  • 型号选择

我敢肯定,一个钉钉了 Scikit Learn 的数据科学家,应该已经算是一个好的数据科学家了。

10.PyTorch

[## PyTorch

开源深度学习平台,提供从研究原型到生产部署的无缝路径。

pytorch.org](https://pytorch.org/)

PyTorch 由脸书创作,作为 Python 的交互机器学习框架被开源。

与 Tensorflow 相比,PyTorch 在语法方面更“pythonic 化”。这也使得 PyTorch 更容易学习和使用。

最后,作为深度学习焦点库,PyTorch 拥有非常丰富的 API 和内置函数,可以辅助数据科学家快速训练他们的深度学习模型。

11.张量流

[## 张量流

一个面向所有人的端到端开源机器学习平台。探索 TensorFlow 灵活的工具生态系统…

www.tensorflow.org](https://www.tensorflow.org/)

Tensorflow 是另一个由 Google 开源的 Python 机器学习库。

Tensorflow 最受欢迎的功能之一是 Tensorboard 上的数据流图表。后者是一个自动生成的基于 Web 的仪表板,可视化机器学习流程和结果,这对调试和演示非常有帮助。

音频和图像识别

Pixabay 上的像素拍摄的照片

机器学习不仅针对数字,还可以帮助处理音频和图像(视频被视为一系列图像帧)。因此,当我们处理这些多媒体数据时,那些机器学习库将是不够的。下面是一些流行的 Python 音频和图像识别库。

12.利布罗萨

[## LibROSA — librosa 0.7.2 文档

LibROSA 是一个用于音乐和音频分析的 python 包。它提供了创作音乐所必需的构件…

librosa.github.io](https://librosa.github.io/librosa/)

Librosa 是一个非常强大的音频和语音处理 Python 库。它可以用来从音频片段中提取各种类型的特征,如节奏、节拍和速度。

使用 Librosa,那些极其复杂的算法,如拉普拉斯分段,可以很容易地在几行代码中实现。

13.OpenCV

[## OpenCV

开放计算机视觉库

opencv.org](https://opencv.org/)

OpenCV 是应用最广泛的图像和视频识别库。毫不夸张地说,OpenCV 使 Python 在图像和视频识别方面取代了 Matlab。

它提供了各种 API,不仅支持 Python,还支持 Java 和 Matlab,以及出色的性能,在业界和学术研究中都赢得了广泛的赞誉。

照片由200 度Pixabay 拍摄

不要忘记,Python 在数据科学领域流行起来之前,通常用于 Web 开发。所以,也有很多优秀的 web 开发库。

14.姜戈

[## 姜戈

Django 是一个高级 Python Web 框架,它鼓励快速开发和干净、实用的设计。建造者…

www.djangoproject.com](https://www.djangoproject.com/)

如果你想用 Python 开发一个 Web 服务后端,Django 永远是最好的选择。它被设计成一个高级框架,可以用很少的几行代码构建一个网站。

它直接支持大多数流行的数据库,以节省您设置连接和数据模型开发的时间。您只需关注业务逻辑,而不必担心 Django 的凝乳操作,因为它是一个数据库驱动的框架。

15.瓶

[## 欢迎使用 Flask — Flask 文档(1.1.x)

欢迎阅读 Flask 的文档。开始安装,然后了解快速入门概述。有…

flask.palletsprojects.com](https://flask.palletsprojects.com/)

Flask 是 Python 中的一个轻量级 Web 开发框架。最有价值的特点是,它可以很容易地定制任何特定的要求非常容易和灵活。

由于 Flask 的轻量级特性,许多其他著名的 Python 库和提供 Web UI 的工具都是使用 Flask 构建的,如 Plotly Dash 和 Airflow。

结论

凯利·西克玛在 Unsplash 上的照片

事实上,有更多著名的 Python 库有资格在此列出。看到 Python 社区欣欣向荣总是令人兴奋的。如果有更多的库成为数据科学家和分析师的必知库之一,可能有必要在另一篇文章中组织它们。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

关于 Python 中的字典,你应该知道的 15 件事

原文:https://towardsdatascience.com/15-things-you-should-know-about-dictionaries-in-python-44c55e75405c?source=collection_archive---------1-----------------------

Python 中词典的使用指南

1.什么是 Python 字典?

字典是一个无序可变 Python 容器,它存储唯一键到值的映射。字典用花括号({})书写,包括用逗号(,)分隔的键值对。冒号(:)将每个与其分开。

下面显示了三个字典,包含了德国最大的五个城市的人口,产品列表和学生的成绩。

2.用 dict()构造函数创建字典

也可以使用内置函数 dict(kwarg)** 创建字典。该函数接受任意数量的关键字参数(前面带有标识符 kwarg=value 的参数)作为输入。

我们还可以使用另一个字典结合关键字参数 ( dict(mapping,kwarg)** )创建一个字典,如下所示:

或者,我们可以使用一个 iterable(例如元组列表)来构建一个字典。每个元组必须包含两个对象。第一个对象成为,第二个成为字典

最后,我们可以使用两个列表创建一个字典。首先,我们必须使用 zip(*iterables) 函数构建元组的迭代器。然后,我们使用 dict([iterable,kwarg]) 函数来构建字典,就像我们之前做的那样。**

3。访问字典中的值

为了访问字典,我们不能使用数字索引(就像我们对列表或元组所做的那样),因为字典是无序的容器。相反,我们用方括号([])将括起来。如果我们试图使用一个未定义的键来访问一个值,就会产生键错误

为了避免出现未定义键的异常,我们可以使用方法 dict.get(key[,default]) 。如果字典中,该方法返回,否则返回默认值。如果没有提供默认值,它将返回 None (但不会引发异常)。

4.在词典中插入元素

要在字典中插入元素,我们可以使用方括号,如下所示:

要一次插入多个条目,我们可以使用方法dict . update(【other】)。这个方法用来自其他的键/值对更新字典,覆盖现有的

如上图,。update() 方法不仅接受另一个字典作为参数,还接受元组列表或关键字参数作为参数。这个方法就地修改字典,返回 None

5.更改字典中的元素

我们可以通过使用方括号([])访问来更改项目的。要一次修改多个值,我们可以使用。update() 方法,因为该函数会覆盖现有的

随后,我们将一个沙发的价格提高了 100 个单位,我们修改了两个学生的成绩。

6.删除字典中的元素

要删除字典中的元素,我们可以使用 del dict[key] 关键字或 dict.pop(key[,default]) 方法。

del dict[key] 关键字从字典中删除给定的元素,如果不存在,则引发 KeyError

如果存在于字典中,则 dict.pop(key[,default]) 方法从字典中删除带有给定,并返回其。相反,如果在字典中不存在,该方法返回缺省值。如果没有提供默认值,并且不存在,则。pop() 方法会引发一个异常 ( KeyError )。

7.检查密钥是否存在

为了检查是否存在于字典中,我们必须使用一个成员操作符。成员运算符用于测试是否在序列中找到某个值(例如字符串、列表、元组、集合或字典)。有两个成员资格运算符,如下所述。

  • 中的→如果左侧的对象包含在右侧的对象中,则评估为真。
  • 不在中→如果左侧的对象不在右侧的对象中,则评估为真。

如上所示,成员操作符(中的中的)可以用来检查一个键是否存在于字典中,但是它们也可以以下面的方式用于其他序列。

8.复制一本字典

要复制一个字典,我们可以简单地使用 dict.copy() 方法。这个方法返回字典的一个浅拷贝。我们必须小心使用浅拷贝,因为如果你的字典包含另一个容器对象如列表、元组或集合,它们将被再次引用而不会重复。

为了避免这个问题,我们可以使用 copy.deepcopy(x) 函数(在 copy 模块中定义)创建一个深度复制,如下所示:

浅拷贝深拷贝之间的区别仅在字典包含列表等其他对象时才相关,因为这些对象将被引用而不是被复制(浅拷贝)。为了创建原始字典的完全独立的克隆,我们必须制作一个深度副本

如果你想知道更多关于如何抄字典的知识,你可以阅读下面这篇文章,其中详细解释了浅抄深抄的区别。

[## Python:如何复制字典|浅层复制 vs 深层复制

在本文中,我们将讨论如何用 Python 创建字典的浅层和深层副本。Python 的字典…

thispointer.com](https://thispointer.com/python-how-to-copy-a-dictionary-shallow-copy-vs-deep-copy/)

记住 =操作符不会复制字典是很重要的。这只是引用同一词典的另一个名称,意味着对新词典的任何修改都会反映在原始词典中。

9.确定字典的长度

要确定字典包含多少个键-值对,我们可以使用 len() 函数。这个函数返回一个对象的项数。函数的输入可以是字典,也可以是另一种类型的序列,如字符串、列表、元组或集合。

10.循环查阅字典

遍历键

为了迭代,我们可以在循环的中直接使用字典,如下所示:

或者,我们可以使用 dict.keys() 方法。这个方法返回一个视图对象,包含字典的

遍历值

如果您只需要处理字典的,那么您可以在循环的中使用 dict.values() 方法。该方法返回一个视图对象,该对象包含字典的

我们可以使用 dict.values() 方法计算出有多少人居住在德国最大的 5 个城市,如下所示:

正如我们所观察到的,将近 900 万人居住在德国最大的五个城市。

遍历项目

当你使用字典时,你可能需要使用。要在两者之间循环,可以使用 dict.items() 方法。该方法返回一个视图对象,包含作为元组列表的键值对。

我们可以使用 dict.items() 方法结合 for 循环来确定考试分数最低的学生,如下所示:

如上图,诺曼多是考试成绩最低的学生(2.5)。

11。词典释义

Python for-loops 在处理重复性编程任务时非常得心应手;然而,还有另一种方法可以更有效地达到同样的效果。

字典理解允许使用优雅简单的语法创建字典:{ key:iterable 中变量的值}。此外,它们比传统的 for-loops 更快。

我们可以使用传统的 for 循环字典理解来过滤价格低于 100 欧元的产品。

正如我们所观察到的,字典理解以一种更优雅的方式提供了与传统的 for 循环相同的结果。

12.嵌套词典

嵌套字典是包含其他字典的字典。我们可以创建一个嵌套字典,就像我们使用花括号({})创建一个普通字典一样。

下面的嵌套字典包含了 5 个著名艺术作品的信息,我们可以观察到,该字典的也是其他字典。

我们还可以使用 dict() 构造函数创建先前的嵌套字典,将 key: value 对作为关键字参数传递。

为了访问嵌套字典中的元素,我们使用多个方括号([])来指定键。

如果你想了解更多关于嵌套字典的内容,你可以阅读下面这篇文章,其中详细解释了如何使用嵌套字典(例如更新条目、改变元素、循环遍历)。

[## Python 嵌套字典——通过示例学习

一个字典可以包含另一个字典,而另一个字典又可以包含字典本身,以此类推,直到任意…

www.learnbyexample.org](https://www.learnbyexample.org/python-nested-dictionary/)

13.替代容器:OrderedDict、defaultdict 和 Counter

集合模块提供了内置 Python 容器的替代容器数据类型。在使用 Python 时,包含在集合模块中的三个字典子类非常方便:(1) OrderedDict 、( 2) defaultdict 和(3) Counter

有序直接

OrderedDict 由一个字典组成,该字典记住其内容被添加的顺序。在 Python 3.6+中,字典也是插入有序的,意味着它们记住了插入条目的顺序。然而,为了保证跨其他 Python 版本的元素顺序,我们必须使用有序直接容器。

如上所示, OrderedDict 接受字典方法和函数。此外,可以像普通字典一样插入、更改或删除元素。

默认字典

Defaultdicts 是一个字典子类,当一个键丢失(它还没有被设置)时,它分配一个默认值。如果我们试图访问一个字典中没有的条目,他们永远不会抛出一个 KeyError。

Defaultdicts 以一个函数作为参数,用函数返回的值初始化缺失的键。在下面的示例中,根据用作第一个参数的函数,键被初始化为不同的值。

正如我们所观察到的,我们可以传递一个字典关键字作为第二个参数(可选)来初始化 defaultdict 容器。

计数器

一个计数器是一个字典子类,用于计算 hastable 对象。该函数返回一个计数器对象,其中元素存储为,它们的计数存储为。使用这个函数,我们可以很容易地计算一个列表的元素,如下所示。

如上所示,我们可以很容易地用获得最频繁的元素。最常用(【n】)方法。该方法返回 n 个最常见元素及其计数的列表。

14.根据字典创建一个熊猫数据框架。

Pandas DataFrame 是一个二维表格数据,其中每个代表一个观察值,每个代表一个变量。熊猫数据框架可以使用熊猫创建。DataFrame 构造器。该函数接受各种 python 容器(例如列表、字典或 numpy 数组)作为输入。然而,在本文中,我们只解释了使用字典创建数据框架的方法。

从字典创建数据帧

我们可以从一个字典中创建一个数据帧,其中表示列名,而以如下方式表示列数据:

正如我们所观察到的,默认索引只是行号(从 0 开始的整数索引)。我们可以通过将索引列表传递给 DataFrame 构造函数来修改这些索引。

从字典列表中创建一个数据框架

字典列表也可以用来创建数据框架,其中代表列名。和以前一样,我们可以通过将索引列表传递给 DataFrame 函数来更改索引。

15.熊猫使用字典的功能

Pandas 中有几个函数使用字典作为输入值,例如, pandas。DataFrame .重命名pandas . data frame . replace .

熊猫。DataFrame .重命名

这个函数返回一个带有重命名轴标签的数据帧。我们可以使用字典作为输入,其中引用旧名称,而引用新名称。字典中未包含的标签保持不变。

如上所示,我们可以更改索引标签,为索引参数提供一个字典。或者,我们可以修改列名,将字典提供给参数。

熊猫。数据框架.替换

该功能用其他值动态替换数据帧的值。我们可以使用具有替换功能的字典来修改数据帧,其中表示现有条目,而表示替换条目。

文章完了!🍀正如你所看到的,字典是 Python 中非常有用的工具。我希望这篇文章能为你在用 Python 编码时充分利用它们提供指导。💪

关于 Python 中的列表,你应该知道的 15 件事

原文:https://towardsdatascience.com/15-things-you-should-know-about-lists-in-python-c566792eca98?source=collection_archive---------8-----------------------

Python 中列表的使用指南

1.什么是 Python 列表?

一个列表是一个有序可变的 Python 容器,是 Python 中最常见的数据结构之一。为了创建一个列表,元素被放在方括号( [] )中,用逗号分隔。

如上所示,列表可以包含不同类型的元素以及重复的元素。

2.用 list()构造函数创建一个列表

列表也可以用内置函数list(【iterable】)创建。该函数将 iterable(即任何类型的序列、集合或迭代器)作为参数,返回一个包含输入对象项的列表。

如上所示,我们不仅可以从 Python 内置容器中创建列表,还可以从 Numpy 数组和 Pandas 系列以及其他可迭代对象中创建列表。

我们也可以使用没有任何输入参数的 list() 构造函数。在这种情况下,构造函数返回一个空列表。

3。访问列表中的元素

列表是元素的有序序列,像 Python 中的其他有序容器一样,它们使用起始索引 0 进行索引。为了访问列表中的元素,我们提供方括号( [] )内的索引(整数),如下所示。

如上所示,当试图访问列表范围之外的索引时,会引发一个 IndexError

我们还可以使用一个负值从列表的末尾访问一个项目,其中-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。

为了访问多个元素,我们使用 python 的切片操作符:

【开始:停止:步进】

切片时,记住开始索引是包含的,而结束索引是不包含的,这一点很重要。

请记住,我们可以访问和切片列表的元素,因为它们是有序容器。在 Python 中,容器可以是有序的(顺序定义的),或者是无序的元素序列(顺序未定义的),我们只关心对象是否包含元素,而不关心它的位置。例如,我们可以很容易地访问列表中的值,就像我们之前解释的那样;然而,如果我们试图访问集合中的一个元素,我们会得到一个类型错误,因为元素在集合中没有特定的位置。

4.修改列表中的项目

我们可以通过在赋值操作符的左边(当我们访问或分割一个列表时)给定方括号中的一个或多个索引,并在右边给定新值来修改列表中的一项。

下面的代码显示了我们如何更新一个列表中的单个或多个元素,如前所述。

可以就地修改列表,因为列表是可变对象。可变性指改变对象值的可能性。可变对象可以改变它们的值,而不可变对象不能被改变。例如,我们可以修改列表中的一项;然而,不可能就地改变一个元组,因为元组是不可变的对象;它们的值不能修改。

5.从列表中删除元素

从列表中删除元素有三种方式:

  • 使用 del 关键字
  • 使用 list.remove(x) 方法
  • 使用 list.pop([x]) 方法

del 关键字

我们可以使用 del 关键字删除列表中的一个或多个条目,以下面的方式在方括号( [] )中提供我们想要删除的索引:

如上所示,我们不仅可以使用 del 关键字从列表中删除条目,还可以删除对对象的引用。

流行方法

list.pop([x])方法移除给定索引处的项目,并返回它。如果没有提供索引, list.pop()方法移除并返回列表的最后一项。当试图移除列表范围之外的索引时,会引发索引错误

该移除方法

list.remove(x) 方法从列表中删除第一个匹配元素,并返回 None 。如果元素不在列表中,则引发 ValueError 异常。

6.在列表中插入元素

要在列表中插入一个元素,我们可以使用:

  • list.insert(i,x) 方法
  • list.append(x) 方法

插入方法

list.insert(i,x) 方法在给定索引 i 处插入一个元素 x ,并返回 None

如上所示,第一个参数 i 是我们在它之前插入一个项目的元素的索引。这就是为什么,如果我们提供索引-1 作为输入,元素会被插入到倒数第二个位置,而不是列表的末尾。要在列表的末尾插入一个条目,我们必须提供列表的长度作为输入。

我们不仅可以用插入方法添加一个原始数据类型(整型、浮点型、字符串型或布尔型),还可以添加一个 Python 容器(例如一个列表),如下所示。

append 方法

list.append(x)方法在列表末尾添加一个项目,相当于 list.insert(len(list),x)

如上所示。 append() 方法就地修改列表,返回 None

7.对列表排序

排序函数

为了对列表中的元素进行排序,我们可以同时使用排序函数排序方法排序函数返回一个排序列表,但是作为输入提供的列表保持不变。

该函数具有以下语法:

排序(iterable[,key][,reverse])

第一个参数是我们想要排序的 iterable (在本例中是一个列表)。以下两个参数反转是可选的,允许我们进行更复杂的排序。我们以后会看到的!

排序方法

排序函数不同,排序方法就地排序列表,返回 None

sort 方法具有以下语法和两个可选参数: keyreverse

list.sort(key=…,reverse=…)

下面的代码展示了我们如何使用排序函数排序方法对列表中的元素进行排序。

附加参数:反向和键控

排序函数排序方法按升序对元素进行排序,除非我们另有说明,提供参数 reverse=True

另一个重要参数是。我们可以根据 key 参数中提供的函数返回的值对列表进行排序。我们将函数应用于列表中的每个元素,然后根据该函数返回的值对元素进行排序。参数可以包含内置、匿名或普通函数以及方法。

在下面的例子中,我们使用关键参数来:

  1. 按长度对字符串列表进行排序。

2.按照元音的数量对字符串列表进行排序。

3.按第三个值对嵌套列表进行排序。

8。反转列表

反向函数

为了反转列表中的元素,我们可以同时使用 reversed(seq)函数list.reverse() 方法反转函数返回给定序列的反转迭代器,保持作为输入提供的序列不变。与排序函数相比,****反转函数不返回列表,所以如果我们想要获得列表,我们必须使用 list() 构造函数。

反向方法

反转功能不同,反转方法原地反转列表,返回 None

9.连接两个列表

Python 中有多种方法可以连接两个列表。****+运算符是最简单的方法之一;事实上,我们也可以使用这个操作符来连接另一种类型的容器,比如字符串或元组。

+操作符也允许你连接两个以上的列表。

另一种连接两个列表的方法是使用 list.extend(iterable) 方法。该方法通过追加 iterable 中的所有项来扩展列表。

如上图所示, list.extend(iterable) 方法就地修改了列表,在列表的末尾添加了来自 iterable 的元素。作为输入提供的 iterable 保持不变,方法返回 None

正如我之前提到的,有多种方式来连接列表。下面的文章解释了在 Python 中连接两个列表的可选模式。

[## Python 添加列表/连接/连接两个或多个列表

本教程涵盖以下主题- Python 添加列表。它描述了在…中加入/连接/添加列表的各种方法

www.techbeamers.com](https://www.techbeamers.com/python-add-lists-join-concatenate/)

10.检查列表中是否存在元素

为了检查一个元素是否存在于列表中,我们必须使用一个成员操作符。成员运算符用于测试是否在序列中找到某个值(例如字符串、列表、元组、集合或字典)。有两个成员资格运算符,如下所述。

  • 中的→如果左侧的对象包含在右侧的对象中,则评估为
  • 不在中→如果左侧的对象不在右侧的对象中,则评估为

如上图所示,成员运算符(中的中的)可用于检查一个元素是否存在于列表中,但它们也可以以如下方式用于其他序列。

11.复制列表

要复制一个列表,我们可以简单地使用 list.copy() 方法。这个方法返回一个列表的浅拷贝。我们必须小心使用浅拷贝,因为如果你的列表包含另一个容器对象像其他列表、元组或集合一样,它们将被再次引用而不会重复。

为了避免这个问题,我们可以使用 copy.deepcopy(x) 函数(在 copy 模块中定义)创建一个深度复制,如下所示:

浅拷贝深拷贝之间的区别只在列表包含其他对象如列表(嵌套列表)时相关,因为那些对象将被引用而不是被复制(浅拷贝)。为了创建原始列表的完全独立的克隆,我们必须制作一个深度副本

切记 =操作符不会复制列表,这一点很重要。这只是引用同一个列表的另一个名称,意味着对新列表的任何修改都会反映在原始列表中。

12.确定列表的长度

要确定列表包含多少个元素,我们可以使用 len() 函数。这个函数返回一个对象的项数。函数的输入可以是列表,也可以是另一种类型的序列,如字符串、字典、元组或集合。

13.列出理解

For 循环可用于在 Python 中创建列表;然而, list comprehensions 提供了一个更优雅和简单的语法来重写循环。此外,对于循环,它们比传统的更快。

语法:iterable 中变量的表达式]

在下面的代码块中,我们创建了一个新的城市列表,包含大写的名称。

如上所示,我们分三步创建一个新列表。

  1. 创建空列表(cities_capitalized)
  2. 循环浏览列表(城市)
  3. 将大写的名称追加到新列表中(cities_capitalized)

然而,通过使用列表理解,我们只用一行代码就可以得到相同的结果。

我们也可以使用条件语句列表理解来过滤掉不需要的数据。在下面的代码块中,条件语句从列表中筛选出奇数。

如您所见,列表理解是创建列表的一种优雅而简洁的方式。然而,非常长的理解列表会使读者感到困惑。因此,它的使用应该仅限于简单的语句。

14.替代集装箱:德克

deque 对象(在集合模块中定义)是一个 like-list 容器,为添加和删除两边(右边和左边)的项目进行了优化。

我们可以使用方法。追加(x)。扩展(iterable) 将元素添加到 deque 对象的右侧,就像我们之前对列表所做的那样。然而,与列表不同,deque 对象支持方法。左追加(x)。extendleft(iterable) 向左侧添加元素。

除了添加项目,队列对象还支持。pop()。popleft() 从两边移除元素的方法。

如果您想了解更多关于容器的信息,可以浏览一下文档。

[## 8.3.集合-高性能容器数据类型- Python 2.7.18rc1 文档

源代码:Lib/collections.py 和 Lib/_abcoll.py 这个模块实现了专门的容器数据类型,提供了…

docs.python.org](https://docs.python.org/2/library/collections.html#collections.deque)

15.从列表中创建一个熊猫数据框架。

Pandas DataFrame 是一个二维表格数据,其中每个代表一个观察值,每个代表一个变量。熊猫数据框架可以使用熊猫创建。DataFrame 构造器。尽管该函数接受多个 Python 容器作为输入,但创建数据框的最常见方式之一是使用嵌套列表作为输入。

正如我们所观察到的,默认索引是整数(从 0 开始)。我们可以通过向参数 index传递一个列表来修改这些索引。

正如我之前所说,有多种方法来创建熊猫数据框。想知道更多的方法,可以访问下面的链接。😃

[## 创建熊猫数据框架的不同方法

Pandas DataFrame 是一个带有潜在不同类型列的二维标签数据结构。一般是…

www.geeksforgeeks.org](https://www.geeksforgeeks.org/different-ways-to-create-pandas-dataframe/)

列表是最重要的 Python 内置容器,是用 Python 编程时正确理解它们的一个关键方面。除了官方的 Python 文档之外,还有多个网页提供了如何使用列表的详细解释和示例。

[## Python 列表

Python 编程语言中有四种集合数据类型:列表是有序的集合,并且…

www.w3schools.com](https://www.w3schools.com/python/python_lists.asp) [## Python 列表- GeeksforGeeks

列表就像动态大小的数组,用其他语言声明(C++中的 vector 和 Java 中的 ArrayList)。列表需要…

www.geeksforgeeks.org](https://www.geeksforgeeks.org/python-list/) [## Python 编程简介| Udacity

在本课程中,您将学习 Python 编程语言的基础,以及编程最佳…

www.udacity.com](https://www.udacity.com/course/introduction-to-python--ud1110)

我打算写一组关于 Python 容器的文章。到目前为止,使用字典和列表的指南已经完成!

[## 关于 Python 中的字典,你应该知道的 15 件事

Python 中词典的使用指南

towardsdatascience.com](/15-things-you-should-know-about-dictionaries-in-python-44c55e75405c)

集合、字符串和元组将在以后介绍💪

感谢阅读👧

阿曼达

Jupyter 笔记本的 15 个技巧和窍门将会减轻您的编码体验

原文:https://towardsdatascience.com/15-tips-and-tricks-for-jupyter-notebook-that-will-ease-your-coding-experience-e469207ac95c?source=collection_archive---------3-----------------------

使用这些技巧优化您在 Jupyter 笔记本中的工作

图片来自 Pixabay

Jupyter Notebook 是一个基于 REPL (read eval print loop)的浏览器,建立在 IPython 和其他开源库的基础上,它允许我们在浏览器上运行交互式 Python 代码。

它不仅运行 python 代码,还拥有许多有趣的插件和神奇的命令,极大地增强了 python 编码体验。

1.计算一个单元的执行时间:

我们可以在 jupyter 笔记本单元的开头使用魔法命令来计算该单元的执行时间。它计算墙时间,该墙时间可被称为执行该单元所需的总时间。

2.进度条:

人们可以使用 python 外部库来创建进度条,它可以实时更新代码的进度。它让用户了解正在运行的代码脚本的状态。你可以在这里获得库的 Github 库。

首先,你需要安装库,

pip3 install tqdm

或者您也可以使用!将其安装在 jupyter 笔记本电池中。

tqdm功能可以通过导入其包来使用,使用和实现可以观察如下:

3.自动代码格式化程序:

使用nb_black库,可以将单元格中的代码片段格式化为适当的格式。有时 jupyter 笔记本单元格中的代码片段格式不正确,这个库有助于获得代码片段的正确格式。

nb_black 是 Jupyter Notebook 和 Jupyter Lab 的简单扩展,自动美化 Python 代码。

库的安装:

pip3 install nb_black

Jupyter 笔记本的用法:

%load_ext nb_black

(作者图片),无格式单元格

(图片由作者提供),使用 nb_black 格式化的单元格

4.安装包:

Jupyter 笔记本可以在笔记本本身安装任何 python 包。要在 jupyter 笔记本单元格中使用 pip 命令安装任何 python 包,请在命令前输入一个!

安装 pandas 包:输入! pip install pandas并运行单元。

5.文档:

Jupyter Notebook 可以显示您正在调用函数的文档。按Shift+Tab查看文档。这非常有帮助,因为您不需要每次都打开文档网站。此功能也适用于本地自定义功能。

用法:

  • 写下你想实现的函数的名字
  • 按下Shift+Tab查看文档。
  • 点击文档右上角的^在页面中查看。
  • 点击+垂直增长文档串。
  • 点击x关闭文档字符串。

(图片作者),熊猫 read_csv 函数的 Docstring

6.自动完成:

Jupyter 笔记本可以显示任何函数名或变量的建议。要查看建议,输入代码,按键盘上的Tab,建议将出现在自上而下的菜单中。按下arrow-uparrow-down键向上或向下滚动菜单。您也可以使用鼠标滚动。单击关键字或在选定的关键字上按 enter 键以确认您的建议。

您还将获得定制函数和变量的建议。

(图片由作者提供),熊猫套餐的建议

7.调整输出视图:

Jupyter Notebook 可以在单元格正下方打印每个单元格的输出。当您有大量输出时,您可以通过单击输出的左侧面板来减少它所占用的空间。这将把输出变成一个滚动窗口。双击输出左侧以完全折叠输出面板。

您可以重复单击或双击的过程来更改查看“输出”面板的格式。

(Gif by Author),点击面板左侧可更改输出屏幕的视图

8.单元格执行功能:

Jupyter Notebook 具有某些单元执行特性,可以减轻程序员的工作负担。

  • Shit+Enter 将运行当前单元格并突出显示下一个单元格,如果没有单元格,它将创建一个新的单元格。
  • Alt+Enter 将运行当前单元格,插入一个新单元格并高亮显示它。

9.降价:

Jupyter 笔记本电池不仅可以运行代码片段,还可以用来写文本。减价单元格可用于编写文本描述。是比用评论更好的表达方式。

用法:

  • 单击单元格将其转换为降价。
  • 从下拉菜单中选择降价选项

(图片由作者提供),从暗码单元格到降价单元格

(来源)

10.在笔记本中运行不同语言的代码:

Jupyter Notebook cells 还可以使用 IPython magic 命令编译和运行不同语言的代码。使用 IPython Magics,在您想要使用该单元的每个单元的开头使用您的内核名称:

  • %%bash
  • %%HTML
  • %%python2
  • %%python3
  • %%ruby
  • %%perl

(图片由作者提供),jupyter 笔记本单元格中的 HTML 代码片段

11.多光标:

Jupyter Notebook 支持同时使用多个光标编辑代码。要立即选择要编辑的代码,按下Alt键并用鼠标选择代码片段。选择之后,您现在可以一次使用多个光标编辑代码。

12.从 Jupyter 笔记本创建演示文稿:

Jupyter 笔记本可以用来创建 PowerPoint 风格的演示文稿。在这里,笔记本的每个单元或单元组可以被视为每个幻灯片。

  • 首先,使用 conda: conda install -c damianavila82 rise安装上升
  • 进入/退出上升幻灯片按钮出现在笔记本工具栏中。在视图>单元格工具栏>幻灯片显示下也会出现一个幻灯片显示选项
  • 要准备幻灯片,点击视图>单元格工具栏>幻灯片,并为每张幻灯片选择 jupyter 笔记本单元格。
  • 选择每张幻灯片后,单击笔记本工具栏中的“幻灯片放映”按钮。

访问此处了解详细的视频指南使用方法。

(来源)

13.分享 Jupyter 笔记本:

代码完成后,您有几个选项来共享您的 jupyter 笔记本。

  • 下载你的 jupyter 笔记本为 HTML,pdf,ipynb,py 文件等。

  • 您可以使用 JupyterHub 来创建一个多用户 Hub,它产生、管理和代理单用户 Jupyter 笔记本服务器的多个实例。
  • 您可以直接从 jupyter 笔记本发布到 medium。阅读这个就知道步骤了。

14.在笔记本中绘图:

Jupyter 笔记本是用于数据分析和可视化的最佳工具。它可用于使用不同的 python 或 R 库生成不同类型的图。一些用于生成图的 python 库包括:

(来源),不同类型的地块

15.键盘快捷键:

快捷键的使用节省了程序员大量的时间,缓解了编码体验。Jupyter 笔记本有很多内置的键盘快捷键,你可以在**Help** 菜单栏下找到:**Help>Keyboard Shortcuts**

Jupyter Notebook 还提供了编辑键盘快捷键的功能,以方便程序员。您可以编辑键盘快捷键:**Help>Edit Keyboard Shortcuts**

(图片由作者提供),命令模式快捷键

(图片由作者提供),编辑模式快捷键

结论:

Jupyter Notebook 是数据科学领域工作人员使用的最好的可扩展工具之一,因为它具有交互式 UI。上面讨论的 15 个提示和技巧将帮助您轻松体验 jupyter 笔记本编码。它有很多本文没有讨论的内置魔法命令,你可以在这里阅读。让我知道你最喜欢的技巧和评论,如果你知道更多的技巧。

  • 文章中使用的图片由作者引用或生成

感谢您的阅读

更有效使用 Jupyter 笔记本的 15 个技巧和窍门

原文:https://towardsdatascience.com/15-tips-and-tricks-to-use-jupyter-notebook-more-efficiently-ef05ede4e4b9?source=collection_archive---------17-----------------------

用这些技巧优化你在 Jupyter 的工作

概观

在数据科学社区中,Jupyter notebook 是一个受欢迎的工具,被广泛采用。本文旨在分享一些很酷的技巧和窍门,帮助你在使用 Jupyter 笔记本时变得更有效率。了解如何从 Jupyter 执行终端命令,通过隐藏输出来加速您的笔记本,为您的笔记本添加额外的功能,等等!

提示#1 —使用常用快捷方式快速导航

知道这些捷径可以帮你节省时间。我用黄色突出显示了我经常使用并且发现非常有用的工具。如果您忘记了快捷方式,您可以随时进入命令模式并按 H 键查看完整列表。Jupyter 笔记本还允许你创建自己的快捷方式,如果你想。点击编辑快捷按钮来设计你自己的热键。

提示#2 —在输出中显示多个项目

Jupyter notebook 一次只显示一个输出,如下所示。在本例中,只显示了最后一个变量的输出。

但是,您可以添加下面的代码来显示单元格中的所有输出。请注意,现在两个变量都显示出来了。

技巧 3——向 Jupyter 笔记本添加图片

如果您想要插入图像,您必须首先将单元格类型从代码更改为标记。您可以在页面顶部的下拉框中完成此操作,或者进入命令模式并按 m 键。一旦单元格降价,只需将图片拖放到单元格中即可。

一旦您将图像放入单元格,应该会出现一些代码。运行单元格(Shift + Enter)来查看图像。

技巧 4——在 Jupyter 笔记本中直接执行 Shell 命令

与其让 Jupyter notebook 执行 shell 命令,不如使用感叹号(!)在你命令的开始。例如,您可以安装一个软件包。

!pip install matplotlib-venn

技巧 5——使用内置的魔法命令

神奇命令是有助于提高工作效率的特殊命令。

您可能最熟悉下面这个神奇的命令,它可以让您的绘图在笔记本中呈现。

%matplotlib inline

以下是一些其他有用的神奇命令:

**%pwd** #print the current working directory
**%cd** #change working directory
**%ls** #show contents in the current directory
**%load [insert Python filename here]** #load code into the Jupyter notebook
**%store** **[insert variable here]** #this lets you pass variables between Jupyter Notebooks
**%who** #use this to list all variables

对于%who,您也可以指定变量类型。例如,下面的代码将列出所有 int 类型的变量。

**%**who int

关于魔法命令的完整列表:

%lsmagic #show all magic commands

技巧#6 —测量单元执行时间

使用%%time获得整个单元格的墙壁时间。

技巧 7——使用多光标加速工作

假设您有多行代码,如下所示,您想删除每行代码中的所有数字。你可以一次删除所有的数字,而不是一行一行的删除。

按住Alt键,选择整个单元格内容。按左箭头,您将看到现在有多个光标(下面代码片段中的黑线),每行一个。从这里,你可以点击delete键删除所有的数字。如果您想将光标移动到末尾,请使用右箭头键。

提示# 8——为代码完成创建一个警报

如果您有需要一段时间运行的代码,您可以添加代码,让 Python 告诉您它何时完成运行。

对于 Windows:

**import** winsound
duration **=** 1000  *#milliseconds* freq **=** 440  *#Hz* winsound.Beep(freq, duration)

这将在代码完成时发出警报。

对于 Mac:

**import** os
os.system('say "your program has finished"')

来源:https://stack overflow . com/questions/16573051/sound-alarm-when-code-finishes/16573339 # 16573339

技巧 9 —添加 Jupyter 笔记本扩展以提高工作效率

Jupyter 笔记本扩展是为您提供更多功能的简洁工具。

以下是您可以启用的可配置扩展列表。一些对我有用的是可折叠标题,代码折叠,便笺和拼写检查。

我建议查看这些扩展,找到对您的工作有用的内容。

如需在计算机上安装 Jupyter 笔记本扩展的帮助,请点击此链接。https://jupyter-contrib-nb extensions . readthedocs . io/en/latest/install . html #

提示#10 —展示方法文档

如果您忘记了特定方法的参数,请使用 Shift + Tab 获取该方法的文档。单击右上角的+箭头展开文档。

提示#11 —扩展熊猫中显示的列数和行数

pandas 表格中显示的行数和列数是有限的,但是您可以根据自己的喜好自定义限制。

这里,我将行和列的最大输出设置为 500。

**import** pandas **as** pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)

提示# 12——加粗或着色你的输出,让它突出

为了突出输出的重要部分,您可以添加粗体和/或颜色。我还没有试过这个,但我认为这是 Stas Bekman 提供的一个非常酷的技巧。参见下面的片段。

技巧# 13 —隐藏输出以提高笔记本电脑速度

你发现你的 Jupyter 笔记本滞后了吗?这可能是因为你有很多正在渲染的图形。

将鼠标悬停在图表左侧的区域(见下面的红色矩形),双击该区域以隐藏输出。这将大大加快你的笔记本电脑的速度!

技巧#14 —隐藏恼人的 Matplotlib 文本

当你创建一个图表时,你可能会在图表的正上方看到这个文本“<matplotlib.collections.pathcollection at="">”(下面突出显示黄色)。</matplotlib.collections.pathcollection>

我个人觉得那很烦人,所以要隐藏那一行文字,可以在代码末尾加个分号。

提示# 15——组织和记录你的分析

使用 markdown 单元格,很容易记录您的工作。您可以使用“#”符号创建字体层次结构来组织笔记本,如下所示。

一旦上面的执行,这就是字体层次的样子。

如果您创建了这些不同的标题,并将其与技巧 9 中提到的可折叠标题扩展结合起来,那么隐藏一大块单元格以及能够快速导航和移动部分将会非常有用。

感谢阅读!如果你有任何喜欢的技巧和诀窍没有在文章中列出,我很乐意在评论中听到它们。

要获得满足您的数据科学和数据分析需求的更多便利文章,请查看以下内容:

Matplotlib 为赶时间的人准备的指南

为匆忙的人们准备的熊猫

为赶时间的人准备的数字指南

如果你想下载 Jupyter 笔记本,你可以在这里找到它。

创建熊猫数据框架的 15 种方法

原文:https://towardsdatascience.com/15-ways-to-create-a-pandas-dataframe-754ecc082c17?source=collection_archive---------0-----------------------

关于用熊猫创建数据框的不同方法的学习参考

作者图片

动机

在进行 EDA(探索性数据分析)或开发/测试模型时,使用强大而优雅的 pandas DataFrame 来存储和操作数据是非常常见的。通常,它从“创建数据帧”开始。

我在用 pandas 开始一些 EDA 或建模时,通常会遇到以下场景:

我需要快速创建一些记录的数据帧来测试代码。

我需要将 csv 或 json 文件加载到数据帧中。

我需要从网页中读取一个 HTML 表格到数据帧中

我需要在不创建 json 文件的情况下将类似 json 的记录加载到 dataframe 中

我需要在不创建 csv 文件的情况下将类似 csv 的记录加载到数据帧中

我需要合并两个数据帧,垂直或水平

我必须将数据帧中的一列转换成一个热列

每一个场景都让我每次都用谷歌搜索语法或查找文档,直到我通过几个月或几年的练习慢慢记住它们。

理解了查找的痛苦,我认为在 pandas 中创建数据帧的多种方法的快速查找表可以节省一些时间。这可能会帮助学习者,直到他们成为经验丰富的数据分析师或数据科学家。

这里有几种方法可以创建一个数据框架。如果任何读到这里的人发现了其他优雅的方式或方法,请随时评论或给我发消息;我很乐意将它们添加到您的参考页面中。

使用 DataFrame 构造函数 pd。数据帧()

pandas DataFrame()构造函数提供了许多不同的方法来创建和初始化 DataFrame。

  • 方法 0 —初始化空白数据帧,并不断添加记录。columns 属性是成为数据帧的列的字符串列表。loc 方法通过索引引用数据帧行(类似于列表)。例如,数据帧 df 中的第一条记录将被 df.loc[0]引用,第二条记录将被 df.loc[1]引用。通过设置 df.loc[i] = <记录属性为列表>,可以直接在位置 I 增加一行
*# method 0**# Initialize a blank dataframe and keep adding*df = pd.DataFrame(columns = ['year','make','model'])*# Add records to dataframe* *using the .loc function*df.loc[0] = [2014,"toyota","corolla"] 
df.loc[1] = [2018,"honda","civic"] df
  • 方法 1 —在 DataFrame 构造函数中使用 numpy 数组。传递 2D numpy 数组—每个数组都是数据帧中的相应行
*# Pass a 2D numpy array - each row is the corresponding row required in the dataframe*

data = np.array([[2014,"toyota","corolla"], 
                 [2018,"honda","civic"], 
                 [2020,"hyndai","accent"], 
                 [2017,"nissan","sentra"]]) 

*# pass column names in the columns parameter* 
df = pd.DataFrame(data, columns = ['year', 'make','model'])
df

  • 方法 2 —在 DataFrame 构造函数中使用字典。字典键成为数据帧中的列名。字典值成为列的值。列值根据指定的顺序组合在一行中
data = {'year': [2014, 2018,2020,2017], 
        'make': ["toyota", "honda","hyndai","nissan"],
        'model':["corolla", "civic","accent","sentra"]
       }

*# pass column names in the columns parameter* 
df = pd.DataFrame(data)
df

  • 方法 3 —在 DataFrame 构造函数中使用字典列表。每本词典都是一个记录。字典键成为数据帧中的列名。字典值成为列的值
data = [{'year': 2014, 'make': "toyota", 'model':"corolla"}, 
        {'year': 2018, 'make': "honda", 'model':"civic"}, 
        {'year': 2020, 'make': "hyndai", 'model':"nissan"}, 
        {'year': 2017, 'make': "nissan" ,'model':"sentra"}
       ]
*# pass column names in the columns parameter* 
df = pd.DataFrame(data)
df

  • 方法 4 —在 from_dict 方法中使用字典。字典键成为数据帧中的列名。字典值成为列的值。列值根据它们被指定的顺序组合在一行中
data = {'year': [2014, 2018,2020,2017], 
        'make': ["toyota", "honda","hyndai","nissan"],
        'model':["corolla", "civic","accent","sentra"]
       }

*# pass column names in the columns parameter* 
df = pd.DataFrame.from_dict(data)
df

注意 : 虽然方法 2 和方法 4 都是字典,但两者还是有区别的。使用 from_dict,我们能够选择任何列作为数据帧的索引。如果我们上面使用的列名需要成为索引——比如早期数据的转置——会怎么样?为转置后生成的列指定 orient = "index "并传递列名

df = pd.DataFrame.from_dict(data, orient='index',columns=['record1', 'record2', 'record3', 'record4'])
df

使用 pandas 库函数— read_csv、read_json

  • 方法 5 —使用 pandas 库的 read_csv 方法从 csv 文件中获取。这是为 EDA 创建数据帧的最常见方式之一。csv 文件中的分隔符(或分隔符)、标题和索引列的选择是可配置的。默认情况下,分隔符是逗号,标题是从第一行推断出来的(如果找到的话),索引列不是从文件中提取的。该文件如下所示:

df = pd.read_csv('data.csv' , sep = ',', header = 'infer', index_col = None)
df

  • 方法 6 —使用熊猫库的 read_csv 方法从一串 csv 记录中。当我们不想创建文件但手头有记录结构时,这特别有用——我们所做的就是使用 StringIO 库函数将 csv 记录“字符串”转换为文件句柄。
from io import StringIO*# f is a file handle created from a csv like string*f = StringIO('year,make,model\n2014,toyota,corolla\n2018,honda,civic\n2020,hyndai,accent\n2017,nissan,sentra')df = pd.read_csv(f)
df

  • 方法 7 —当 json 文件每行都有记录时,使用 pandas 库的 read_json 方法从 json 文件中获取。设置 lines=True 意味着每行将文件作为 json 对象读取。下面是 json 文件的样子:

df = pd.read_json('data.json',lines=True)
df

  • 方法 8 —使用 pandas 库的 read_json 方法从一串 json 记录中。当我们不想创建文件,但手头有 json 记录结构时,这特别有用。
from io import StringIO*# f is a file handle created from json like string*f = StringIO('{"year": "2014", "make": "toyota", "model": "corolla"}\n{"year": "2018", "make": "honda", "model": "civic"}\n{"year": "2020", "make": "hyndai", "model": "accent"}\n{"year": "2017", "make": "nissan", "model": "sentra"}')df = pd.read_json(f,lines=True)
df

  • 方法 9最有趣的方法之一 —使用 read_html 中内置的 pandas 库从 HTML 页面中读取表格。这将生成一个数据帧列表;在后台,它抓取 html 页面中的任何<表>标签,并试图将该表捕获到一个数据帧中。即使页面中只有一个表,也会创建一个数据帧列表,因此需要使用列表下标来访问它。下面的例子展示了如何捕获一个 HTML 页面,然后加载表——这使用请求库来获取 HTML 内容。
import requests

url = 'https://www.goodcarbadcar.net/2020-us-vehicle-sales-figures-by-brand'r = requests.get(url)*#if the response status is OK (200)*
if r.status_code == 200: *# from the response object, pass the response text 
    # to read_html and get list of tables as list of dataframes*

     car_data_tables = pd.read_html(r.text)

*# display the first table*
car_data_tables[0]

从其他数据帧

  • 方法 10 —作为另一个数据帧的副本
df_copy = df.copy()   # copy into a new dataframe object
df_copy = df          # make an alias of the dataframe(not creating 
                      # a new dataframe, just a pointer)

注意:上面显示的两种方法是不同的——copy()函数创建一个全新的独立于原始数据帧的数据帧对象,而变量 copy 方法只是为原始数据帧创建一个别名变量——没有创建新的数据帧对象。如果原始数据帧有任何更改,也会反映在别名中,如下所示:

*# as a new object using .copy() method - new dataframe object created independent of old one*a = pd.DataFrame({'year': [2019],'make': ["Mercedes"],'model':["C-Class"]})b = a.copy()*# change old one*
a['year'] = 2020*# new copy does not reflect the change*
b

*# as variable copy - new variable is just an alias to the old one*a = pd.DataFrame({'year': [2019],'make': ["Mercedes"],'model':["C-Class"]})b = a*# change old one*
a['year'] = 2020*# alias reflects the change*
b

  • 方法 11 —垂直连接—一个在另一个之上
data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"}, 
        {'year': 2018, 'make': "honda", 'model':"civic"}, 
        {'year': 2020, 'make': "hyndai", 'model':"nissan"}, 
        {'year': 2017, 'make': "nissan" ,'model':"sentra"}
       ]df1 = pd.DataFrame(data1)data2 = [{'year': 2019, 'make': "bmw", 'model':"x5"}]df2 = pd.DataFrame(data2)*# concatenate vertically
# NOTE: axis = 'index' is same as axis = 0, and is the default 
# The two statements below mean the same as the one above*df3 = pd.concat([df1,df2], axis = 'index') *#OR*df3 = pd.concat([df1,df2], axis = 0)*# OR*df3 = pd.concat([df1,df2])df3

在上面的例子中,第二个数据帧的索引保留在连接的数据帧中。要重置索引以匹配整个数据帧,请使用数据帧的 reset_index()函数

df3 = pd.concat([df1,df2]).reset_index()*#OR*df3 = pd.concat([df1,df2], ignore_index = True)
df3

  • 方法 12 —水平连接—并排追加,不用任何键连接
data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"}, 
        {'year': 2018, 'make': "honda", 'model':"civic"}, 
        {'year': 2020, 'make': "hyndai", 'model':"nissan"}, 
        {'year': 2017, 'make': "nissan" ,'model':"sentra"}
       ]df1 = pd.DataFrame(data1)data2 = [{'year': 2019, 'make': "bmw", 'model':"x5"}]df2 = pd.DataFrame(data2)df3 = pd.concat([df1,df2], axis = 'columns')*#OR*df3 = pd.concat([df1,df2], axis = 1)df3

注意:对于水平拼接,

  • 数据帧的行按照它们的位置(索引)顺序连接
  • 如果其中一个数据帧中有任何记录丢失,则串接的数据帧中的相应记录将丢失。这与在索引上进行左外连接是一样的(参见下面的合并)

  • 方法 13 —水平连接—相当于 SQL 连接。

内部连接

data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"}, 
        {'year': 2018, 'make': "honda", 'model':"civic"}, 
        {'year': 2020, 'make': "hyndai", 'model':"nissan"}, 
        {'year': 2017, 'make': "nissan" ,'model':"sentra"}
       ]df1 = pd.DataFrame(data1)data2 = [{'make': 'honda', 'Monthly Sales': 114117}, 
        {'make': 'toyota', 'Monthly Sales': 172370}, 
        {'make': 'hyndai', 'Monthly Sales': 54790}
       ]df2 = pd.DataFrame(data2)*# inner join on 'make'
# default is inner join*df3 = pd.merge(df1,df2,how = 'inner',on = ['make'])
df3 = pd.merge(df1,df2,on = ['make'])df3

左连接

*# for a left join , use how = 'left'*
df3 = pd.merge(df1,df2,how = 'left',on = ['make'])df3

  • 方法 14 —作为另一个数据帧的转置
*# To transpose a dataframe - use .T method*
df4 = df3.T*# To rename columns to anything else after the transpose*
df4.columns = (['column1','column2','column3','column4'])df4

  • 方法 15 —使用 pandas get_dummies 函数转换为一个热点列(用于学习算法建模)。

One-Hot 基本上是将一个列值转换成一组派生列,就像二进制表示一样。one-hot 列集合中的任何一个都是 1,其余的是 0。

如果我们知道一辆汽车的车身类型=轿车、SUV、货车、卡车,那么车身= '轿车'的丰田卡罗拉将成为 one-hot 编码为

body_SEDAN   body_SUV    body_VAN   body_TRUCK
1             0               0         0

每个热列的格式基本上都是 <原始 _ 列名> _ <可能 _ 值>

下面是一个例子:

data1 = [{ 'make': "toyota", 'model':"corolla", 'body':"sedan"}, 
        {'make': "honda", 'model':"crv", 'body':"suv"}, 
        {'make': "dodge", 'model':"caravan", 'body':"van"}, 
        {'make': "ford" ,'model':"f150", 'body':"truck"}
       ]df1 = pd.DataFrame(data1) 

df2 = pd.get_dummies(df1,columns = ['body'])
df2

我希望这个“备忘单”在学习 EDA 或建模的初始阶段有所帮助。当然,随着时间的推移和不断的练习,所有这些都会被记住。

那么祝你一切顺利:)

如果您有任何其他创建数据帧的好方法,或者有任何新的函数可以为某些特定目的创建数据帧,请分享您的宝贵意见。

这个笔记本的 git 链接是这里的。

数据工程中听到的 150 多个概念

原文:https://towardsdatascience.com/150-concepts-heard-in-data-engineering-a2e3a99212ed?source=collection_archive---------14-----------------------

面向数据工程师的综合词汇表

古斯塔夫·古尔斯特兰德在 Unsplash 拍摄的照片

数据工程是一个很有吸引力的领域。它始于你,一个单独的数据文件和一台个人电脑,终于堆积如山的数据和雄伟的“云”。

在本文中,我整理了一个词汇表,包含了数据工程师日常生活中听到的 150 个概念。我将这个术语表分为几个主题,如数据、模式、数据编码、分布式系统、架构、即服务、云、数据存储、缓存、数据结构、硬件、数据安全、措施

概念用足够多的行数来解释,让你理解背后的意思。每当我使用其他信息来源时,我都会在本节末尾引用该来源。如果您想深入了解,请考虑这些来源。我尽最大努力选择对每个概念都有最佳解释的资料来源。

该术语表在许多方面都很有用,其中包括:

  • 您想学习数据工程,并将这个术语表用作路线图。
  • 你是一名数据工程师,你想更新数据工程的概念。
  • 你正在准备一次数据工程面试,你想确保没有任何主题/概念逃过你的注意。
  • 你是一名面试官,你用这个词汇表作为一个问题库。

在查看术语表之前,我有两件事需要澄清:

  1. 这个词汇表将来肯定会更新。如果我遗漏了什么,请写一个回复,我会确保把它包括在内。
  2. 我跳过了解释特定的工具,比如 Python、Spark 或 Kafka。这些是我正在写的另一篇关于数据工程中听到的顶级技术的文章的一部分。(那篇文章一发表,我就会在这里附上链接)。

快乐学习。

快注意!如果你对数据工程感兴趣,也可以看看我的另一篇文章“开发人员应该知道的 50 多个实时数据处理概念”。

[## 开发人员应该知道的 50 多个实时数据处理概念

下面是在流数据处理领域经常听到的一组概念。我为每一个概念量身定做…

medium.com](https://medium.com/@dardanx/50-real-time-data-processing-concepts-devs-should-know-830ee0441843)

#数据

事实的集合,如数字、文字、测量和对现象的观察。

#原始数据:原始状态下未加工的数据。(即。因为它是从源传送的)。

#已处理数据:处理后的原始数据。处理的主要目的是使数据比原始数据更容易使用。

#大数据:描述由于的量、速度、多样性、准确性而无法用传统数据处理工具处理的数据。当有人问你什么是大数据时,请阅读我的文章中关于大数据的不同定义的更多信息。

#数据质量:评估数据是否服务于特定用例的预期目的的过程。在评估数据质量时,我们通常检查数据的准确性完整性可靠性相关性及时性。更多信息,请阅读雷切尔·利维·萨芬关于数据质量的 5 个特征的文章。

#主数据:根据 Gartner ,“主数据是一组一致且统一的标识符和扩展属性,用于描述企业的核心实体,包括客户、潜在客户、公民、供应商、地点、层级和会计科目表。”[1].

# SSOT:(单一事实来源):公司中的一种数据组织,数据集中保存,可从外部其他组件和人员访问。如果对系统中其他地方的数据进行了更改,这种更改应该反映在 SSOT 中。例如,如果一家公司在中央数据库中保存客户联系信息,如果联系信息发生变化,只有一个地方需要更新(即 SSOT)。

#时间序列数据:收集的数据点以及指示数据点生成时间的时间戳。例子包括监控数据、传感器数据、网络数据、用户点击数据、等。

Cookie :根据维基百科的说法,“……是用户在浏览时,由网络浏览器从网站发送并存储在用户电脑上的一小段数据。”[2].

#开放数据:根据维基百科的说法,“开放数据是一种理念,即一些数据应该免费提供给每个人,让他们按照自己的意愿使用和重新发布,而不受版权、专利或其他控制机制的限制。[3].

#个人数据:根据欧盟委员会的规定、“个人数据是指任何与已识别或可识别的活着的个人相关的信息。不同的信息收集在一起可以识别特定的人,也构成个人数据。”[4].


[1]主数据管理。https://www . Gartner . com/en/information-technology/glossary/master-data-management-MDM

[2] HTTP cookie。https://en.wikipedia.org/wiki/HTTP_cookie

[3]开放数据。https://en.wikipedia.org/wiki/Open_data

[4]个人资料:https://EC . Europa . eu/info/law/law-topic/data-protection/reform/what-Personal-data _ en

#数据序列化

数据序列化(编码、编组)是将结构化数据转换为一种格式的过程,这种格式允许以允许恢复其原始结构的形式共享或存储数据[1](Python 的搭便车指南)

# Parquet: 以列方式对数据进行编码。在 parquet 中编码的数据是二进制格式的(因此不可读)。查询(尤其是聚合)在 parquet 中编码的数据之上执行得更快。由于高效的列式压缩,数据量大大减少。压缩是逐列进行的,因此不同的列可以使用不同的编码类型。

# Avro: 以行方式编码数据。Avro 中编码的数据是二进制格式(因此不可读)。指定用 JSON 编码的数据的模式,该模式定义与数据一起写入一个文件。Avro 的一个关键特性是对随时间变化的模式的健壮支持(模式进化)。

# JSON(JavaScript Object Notation):这是一种广泛使用的 key: value 数据编码格式。JSON 提供了一种轻量级的数据交换格式。对人类来说,读和写很容易。机器很容易解析生成。

YAML: (YAML 不是标记语言):这是一种人类可读的数据编码格式。YAML 通常用于配置文件,并以其极简的语法著称。

# XML(可扩展标记语言):是一种标记语言,它定义了一组规则,用于以人类可读和机器可读的格式对文档进行编码。为了执行编码,XML 使用开始和结束标记。属性进一步丰富了这些标签。

# CSV(逗号分隔值):一种编码格式,将值存储在由分隔符(大多数情况下是逗号,但也可能是分号、制表符或其他字符)分隔的行中。文件的每一行都是一条数据记录。CSV 文件通常存储表格数据,在这种情况下,每一行都有相同数量的字段。CSV 文件是人类可读的。


[1]序列化。https://docs.python-guide.org/scenarios/serialization/

#模式

描述数据在数据存储区中的组织方式的框架/结构(数据库、文件等)

# Schema-on-write: 我们在处理数据之前定义模式。例如,如果不首先定义模式(表、列名、数据类型等等),我们就不能在 MySQL 中存储和查询数据。比如说,当我们因为列的数据类型发生变化而需要更改模式时,就会出现挑战。我们需要删除模式并再次加载所有数据。多见于 SQL 数据库。

# Schema-on-read: 我们在定义模式之前处理数据。在这种情况下,我们在数据到达时立即存储,而不必将其转换为严格的格式。读取数据的时刻就是推断模式的时刻。它主要出现在 NoSQL 的数据库中。一篇值得一读的好文章是 luminousmen 的读时模式与写时模式

# Schema evolution: 数据不断发展,模式应该反映对数据所做的更改。当发展模式时,为了不丢失它,使它与您拥有的数据兼容是很关键的。在添加新列或需要更改列的数据类型时,模式演化是必要的。

#分布式系统

“…分布式系统是位于不同机器上的独立组件的集合,这些组件为了实现共同的目标而相互共享消息。”[1] ( 汇合)

#集群:它是一组相互连接的机器(节点),它们一起工作来完成任务。机器之间的连接是在软件级别完成的。从外部看,群集看起来像一个系统。

# Node: 作为集群一部分的单个机器/服务器/虚拟机。

#商用硬件:Suse ,“商用硬件,有时被称为现成的硬件,是一种相对便宜、可广泛获得且易于与其他同类硬件互换的计算机设备或 IT 组件。”[2].

#可伸缩性:分布式系统的一种品质,能够通过向系统添加或移除资源来应对负载(请求、数据等)。

#容错:分布式系统的一种品质,即使部分系统出现故障,也能持续工作。

# Robustness: 分布式系统的一种质量,不仅在预期情况下,而且在强调设计者假设的情况下都表现良好。

#滚动升级:分布式系统中升级软件的一种策略,一次将更新的软件逐步部署到几个节点,而不是同时部署到所有节点。

#垂直扩展:通过在单台机器上添加更多资源进行扩展,如 CPURAM、磁盘

#水平扩展:通过向现有资源池中添加其他机器来进行扩展。

#复制:在通过网络连接的不同机器上复制相同的数据。通过复制数据,我们确保了系统的容错能力。当复制的数据分布在不同的地理位置时,我们减少了延迟或读取。

# Partitioning: 将一个大数据集拆分成若干部分,分布在不同的节点上。当查询在不同的节点上工作时,分区通过分布来确保可伸缩性。

#数据局部性:将计算移动到数据驻留的地方,而不是将数据移动到计算驻留的地方。使用大数据系统是为了通过移动计算而不是数据来减少网络流量。

#重新平衡分区:将数据从一个集群节点移动到另一个集群节点的过程。通常在数据分区大小不均匀增长时,或者在集群中添加或删除节点时执行。

# CAP 定理:It陈述了一个分布式系统可能最多同时具备以下两个品质:一致性可用性分区容忍度。详细讲这个的一篇很棒的文章是什么是 CAP 定理?

****#写后读一致性:在写入更改后立即查看更改(读取最新数据)的能力。

****#最终一致性:在对系统进行写入/更新后,系统需要一些时间来更新您的写入影响的所有节点的数据点。如果发出立即读取请求,则有机会接收旧数据。

# 小文件问题:在 Hadoop 中,当数据存储在 HDFS 的许多小文件中时,计算性能会显著下降。

_____________

[1]分布式系统。https://www.confluent.io/learn/distributed-systems/

[2]商用硬件。https://susedefines.suse.com/definition/commodity-hardware/

#建筑

“……计算系统的总体设计及其组件之间的逻辑和物理相互关系被定义为体系结构。该架构规定了整个系统中使用的硬件、软件、访问方法和协议[1].(高德纳)****

#共享内存架构:将 CPU、RAM 芯片、磁盘等多种资源连接在一起,形成一台机器。在这种资源组织中,任何 CPU 都可以访问内存或磁盘的任何部分。这些机器的容错能力较差,可伸缩性是通过增加 CPU、RAM 芯片和磁盘(即垂直缩放)。

#无共享架构:商用机器通过网络链接在一起,独立访问自己的机器。可伸缩性是通过向资源池添加其他独立的机器来实现的。节点之间的协调是在软件级别完成的。

# Producer: 产生事件(数据)的组件。例如,考虑一个每当客户下订单时都会生成一个事件的软件组件。

# Consumer: 消费事件的组件。例如,考虑一个软件组件,它通过向进行购买的用户发送确认电子邮件来对收到的订单事件做出反应。

#事件流架构:由产生事件流的生产者和消费这些事件的消费者组成的架构。事件有不同的类型,如:放入购物车的产品、订购的产品、配送的订单等。消费者组件消费这些事件并对其做出反应。

#批处理架构:由一个或多个数据存储(数据湖、数据库等)组成的架构,其中收集数据并定期(例如每天一次)运行作业,以处理大块数据(或所有数据)来转换或执行分析。处理后的数据以期望的格式进一步存储在目标系统中。

# Lambda 架构:将流和批处理的优势结合到一个架构中。流式处理部分负责实时处理传入的数据以获得近似的结果,而批处理部分负责处理在某个时间间隔内收集的整组数据以从数据中获得精确的结果。

#高可用架构:不会受到负载、错误和外部威胁(自然灾害)的负面影响,从而牺牲其性能和可用性的架构。这种体系结构包含地理上分散的组件,这些组件可以根据传入的负载进行伸缩,并且副本可以在部分系统出现故障时升级。

#无服务器计算:维基百科“它是一种云计算执行模型,由云提供商运行服务器,并动态管理机器资源的分配。”【2】。**

#无服务器架构:**组件完全是无服务器组件的架构这种架构不太复杂,运行成本更低,开发和维护所需的工程时间也更少。

****#增量架构:一种从小规模开始、模块化、专注于领域并由高度解耦的组件组成的架构。

****# ETL(Extract Transform Load):描述了从多个源中提取数据,将它们转换/处理成所需的格式,并将数据加载到最终目标中作为数据库或数据仓库或数据湖的过程。

****#实时处理:数据可用后立即处理。例如雷达等关键系统。

# 近实时:当数据可用后,在允许的几秒或几分钟的等待时间内进行处理。

_____________

[1]建筑。https://www . Gartner . com/en/information-technology/glossary/architecture

[2]无服务器计算。https://en.wikipedia.org/wiki/Serverless_computing

#作为服务

描述产品(软件、基础架构等)的业务模型,该产品由所有者维护和运行,并以订购或现购现付的方式向客户提供

# IaaS(基础设施即服务)😗*提供计算基础设施(虚拟机、物理机)、对象存储、文件系统、负载平衡器、网络等。IaaS 例子有:亚马逊 EC2Windows Azure谷歌计算引擎、等。**

****# PaaS(平台即服务):微软“…PaaS 是云中的一个完整的开发和部署环境,其资源使您能够交付从简单的基于云的应用程序到复杂的、支持云的企业应用程序的一切。”[1].PaaS 的例子有 AWS 弹性豆茎Windows AzureHerokuGoogle App Engine 等。

****# SaaS(软件即服务):由一家公司开发、运行和维护的软件,该公司以订阅的方式向客户授予许可。SaaS 的例子有: Google AppsDropboxSalesforce

FaaS(作为服务的功能):这也被称为无服务器计算。这使得开发人员可以只编写业务逻辑并执行它,而无需处理资源供应和管理。

****# BaaS(后端即服务):根据cloud flare“BaaS 是一种云服务模式,开发人员将 web 或移动应用程序的所有后台工作外包出去,这样他们只需编写和维护前端。”[2].

_____________

[1]什么是 PaaS。https://azure.microsoft.com/en-us/overview/what-is-paas/

[2]支持和服务。https://www . cloud flare . com/learning/server less/glossary/back end-as-a-service-baas/

#云

“…指通过互联网访问的服务器,以及在这些服务器上运行的软件和数据库。”[1].(云闪)

#云计算:**根据微软“云计算是通过互联网交付计算服务,包括服务器、存储、数据库、网络、软件、分析和智能【②】。

****#虚拟化:根据 RedHat " 虚拟化是一种技术,它允许您从单个物理硬件系统创建多个模拟环境或专用资源。"[3].

# Hypervisor: 根据Vmware“Hypervisor 也称为虚拟机监视器或 VMM,是创建和运行虚拟机(VM)的软件。虚拟机管理程序允许一台主机通过虚拟共享其资源(如内存和处理能力)来支持多个来宾虚拟机。”[4].

# AWS(Amazon Web Services)😗*一个提供了很多服务的云平台,其中以下服务在数据工程中使用最多: S3 (简单存储服务) EMR (弹性地图还原) Kinesis ( 分析消防水管数据管道红移******

# Microsoft Azure: 一个提供了很多服务的云平台,其中以下服务在数据工程中使用最多: Blob StorageAzure DatabricksAzure Stream AnalyticsHDInsightAzure Cosmos DBEvent HubsAzure Data Lake Storage

# GCP(Google Cloud Platform):一个提供很多服务的云平台,其中在数据工程中使用最多的有:云存储计算引擎大查询数据流云函数云 SQL* ,*云 Bigtable。********

#现收现付:云提供商使用的一种支付模式,您只需为您需要的个人服务付费,只要您使用这些服务,不需要长期合同或复杂的许可。您只需为所消费的服务付费,一旦您停止使用这些服务,就不会产生额外的费用或终止费。

#按需服务:云计算服务的一个特性,允许用户随时随地根据需要提供云资源。

# Lambda Functions:AWS Lambda 中的一个函数,您可以在其中运行代码,而无需提供或管理服务器。AWS Lambda 仅在需要时(响应事件,或通过 API 调用触发时)执行您的代码,并自动伸缩。类似的还有微软 Azure 的 Azure 功能和谷歌云平台的云功能。

#云迁移:这是将数据库、应用程序和 It 流程从内部转移到云或从一个云转移到另一个云的过程。

_____________

【1】什么是云。https://www . cloud flare . com/learning/cloud/what-is-the-cloud/

【2】什么是云计算。https://azure . Microsoft . com/en-us/overview/what-is-cloud-computing/

[3]云与虚拟化。https://www . red hat . com/en/topics/云计算/云计算与虚拟化

[4]虚拟机管理程序。https://www.vmware.com/topics/glossary/content/hypervisor

#数据存储

数据存储库是用于持久存储和管理数据集合的存储库,不仅包括数据库等存储库,还包括文件等更简单的存储类型[1].(维基百科)

#数据库:根据维基百科数据库是一个有组织的数据集合,通常通过计算机系统以电子方式存储和访问。” [2]。

#关系数据库(SQL): 数据用实体(表)和属性(列)组织的数据库,其中关系表示表之间的连接(关系)。一些比较知名的关系数据库有: MySQLSQL ServerPostgreSQLOracle。

# Table: 关系数据库中的表表示以表格格式构造相关数据的唯一实体。

# 属性(列,字段,特征,特性):表示表格中的一列数据。例如,表“Car”包含“brand”作为其属性之一。****

# Record (tuple,data point): 表格中的一行。

# Query: 对数据库的定制请求,用于检索必要的数据。结果可能由单个表或多个表的数据组成。

# RDBMS(关系数据库管理系统):用于维护关系数据库的软件系统。

#主键:一个或多个列的组合,为表中的每条记录生成一个标识符。主键代表每行的唯一值。例如,列" name" 不是主键,但是" passport_id" 是主键。

#规范化:根据维基百科数据库规范化是 按照一系列所谓的范式 1NF、2NF、3NF 和 BCNF 来结构化关系数据库的过程,以减少数据冗余,提高数据完整性。”【3】。数据完整性是通过确保在插入、更新和删除的情况下不会发生异常来实现的。****

# Transaction: 事务是一个逻辑工作单元,包含一个或多个 SQL 语句,在数据库中执行定义的操作。

#ACID: 描述了一组保证,如原子性一致性隔离性持久性,数据库事务做出这些保证以确保即使在错误、电源故障等情况下的有效性。********

# Index :在数据库中执行查询时,需要快速定位到所需的数据。索引有助于这一点。当您索引一个列时,将会创建一个数据结构。这个数据结构将保存列值和数据在磁盘中存储位置的指针。这个数据结构主要是一个 B 树,但它可以是任何东西。当在索引列中执行查询时,可以快速找到所需的记录,从而避免了扫描整行的最坏情况。

****# Hash 函数:是将任意长度的给定值转换成另一个固定大小值的算法。哈希函数的输出称为哈希值。最著名的哈希算法是 MD5(消息摘要 5)和 SHA(安全哈希算法)1 和 2。

# 非关系数据库(NoSQL): 所有以其他格式而非表格组织数据的数据库都属于这一类。在这里你可以找到以文档、分栏、键值、图形格式组织数据的数据库。

# Key: Value 数据库:**以“Key:Value”格式存储数据——也称为字典散列表。使用存储和检索数值。每个记录可能有不同的数量和不同类型的字段。其他数据库,例如文档数据库,是建立在" key: value" 数据库之上的。例子有 RedisCouchbaseHazlecastMemcachedArangoDB 等。******

#面向文档的数据库:**文档就是关系数据库中的一行。这些数据库以“key:value”格式存储数据,其中的值以 JSON、XML 或 YAML 或 BSON 等二进制格式编码。文档可以有灵活数量的文件和数据类型。通过查询文档的内容来检索数据。例子有 MongoDBCouchbaseCouchDBRethinkDBElasticsearchArangoDB 等。

#图形数据库:**以图形格式组织数据,其中顶点(节点)表示一个实体,如一个人和表示两个顶点之间关系的边。用于存储适合这种组织模式的数据,如社交网络数据、公共交通、网络拓扑等。例子有 AllegroGraphArangoDBApacheGiraphNeo4JOrientDB 等。

#面向列的数据库:**以列而不是行来组织数据。这些数据库在分析查询处理方面非常有效。例子有亚马逊 DynamoDBBigtableCassandra 、Scylla、 HBaseHypertable、等。

****#内存数据库:主要依靠内存进行数据存储的数据库,与将数据存储在磁盘上的数据库形成对比。这些数据库在游戏和实时分析等响应时间至关重要的环境中非常有用。例如 Redis、Hazelcast、H2、Memcached 等。

# 时序数据库:针对时序数据优化的数据库。这些数据库附带了许多功能,便于您处理时间序列数据。例子有 InfluxDB,普罗米修斯,时标 DB,德鲁伊,等。

# Collection: 什么表是关系数据库,集合是非关系数据库。集合可以存储文档,即使它们具有不同的结构。

# Document: 什么行在关系数据库,文档在非关系数据库。

#数据仓库:**这是一个中央存储库,收集了来自不同来源的数据。此外,数据仓库为 BI(商业智能)提供了分析和报告功能。通常,数据仓库会保存数兆字节或数千兆字节的结构化数据。数据仓库解决方案的例子有 Oracle红移MarkLogic 等。

****#数据湖:数据湖简单来说就是用来存储来自各种数据源的各种格式的原始数据的存储器。数据湖的例子有 AWS S3Azure Blob、Google 云存储等。

# OLAP(在线分析处理)😗*根据 IBM ,“作为数据仓库实现的核心组件,OLAP 为商业智能(BI)和决策支持应用提供了快速、灵活的多维数据分析。”[4].在 OLAP,通常是历史数据—比如说过去 5 年—被查询。这种处理的一个例子是“公司 X 比较地点 A2020 年第一季度与第二季度的销售额”。

****# OLTP(在线事务处理):描述了在数据仓库之外完成的其他处理。例如,在数据库中插入、删除、更新少量数据的查询就属于这一类。OLTP 涉及电子商务网上银行、POS 终端等的日常运营。

****#脏读:当事务 B 从数据库中读取从事务 A 写入的数据,而 A 尚未提交或中止时。

****#脏写:当事务 B 覆盖事务 A 写入的数据且 A 尚未提交或中止时。

#文件存储:**根据 IBM 的说法,“文件存储是一种分层存储方法,用于在计算机硬盘或网络附加存储(NAS)设备上组织和存储数据。在文件存储中,数据存储在文件中,文件组织在文件夹中,文件夹组织在目录和子目录的层次结构下【⑤】。

#块存储:**数据被分割成块,然后存储在整个系统的不同部分。每个块都分配有一个唯一的标识符。为了访问文件,服务器的操作系统使用唯一的地址将块一起拉回到文件中,这比通过目录和文件层次结构导航来访问文件花费的时间更少。块存储的例子有 SANiSCSI本地磁盘。

#对象存储:**根据 IBM 的说法,“对象是存储在结构扁平的数据环境中的离散数据单元。”[6].每个对象都是一个简单的自包含存储库,其中包括数据、元数据(与对象相关联的描述性信息)和唯一的标识 ID 号。这种存储的例子有 AWS S3Azure Blob 存储谷歌云存储

# Backup: 您的数据的副本,在您的生产数据被破坏的情况下,您可以重复使用该副本。

_____________

[1]数据存储。https://en.wikipedia.org/wiki/Data_store

[2]数据库。https://en.wikipedia.org/wiki/Database

[3]数据库规范化。https://en.wikipedia.org/wiki/Database_normalization

[4] OLAP。https://www.ibm.com/cloud/learn/olap

[5]对象存储。https://www.ibm.com/cloud/learn/object-storage

#缓存

“缓存是存储数据的硬件或软件组件,以便将来可以更快地处理对该数据的请求……”[1]。( 百科 )

****#缓存命中:描述在缓存中找到请求的数据时的事件。

****#缓存未命中:描述在缓存中找不到请求的事件。

****# TOL(生存时间):定义的时间间隔,对象可以在缓存中生存。TOL 到期时,对象将被删除或刷新。

# Eviction policy: 当缓存已满时,决定丢弃哪个元素的策略。驱逐策略的例子有 LRU (最近最少使用)、 FIFO (先进先出)、 RR (随机替换)等。

_____________

[1]缓存。https://en . Wikipedia . org/wiki/Cache _(计算)

#数据结构

数据结构以某种格式(列表、映射、队列……)组织数据,并提供访问和修改数据的功能”。

# Queue: 一种线性数据结构,其中项目按 FIFO(先进先出)顺序处理。项目总是被附加在队列的末尾,并从队列的开头开始使用。

# Stack: 一种线性数据结构,其中项目按后进先出(LIFO)顺序处理。项目总是附加在开头,并从开头开始消耗。

# B-Tree: 根据 CalPonyPomona ,“B-Tree 是一种树形数据结构,它保持数据有序,并允许在对数摊销时间内进行搜索、插入和删除……针对读写大型数据块的系统进行了优化。它最常用于数据库和文件系统。[1].

_____________

[1] B 树。https://www.cpp.edu/~ftang/courses/CS241/notes/b-tree.htm

#网络

两台或多台计算机连接在一起共享资源。

****# IP 地址(互联网协议地址):根据维基百科,“IP 地址是分配给连接到使用互联网协议进行通信的计算机网络的每个设备的数字标签。”[1].IP 地址的一个例子是192.0.2.1

****# TCP/IP(传输控制协议/互联网协议):是一系列网络协议,规范数据在网络中传输的方式。这个家族包含的协议有 IP(互联网协议)、TCP(传输控制协议)、UDP(用户数据报协议)ICMP(互联网控制消息协议)。

****# UDP(用户数据报协议):一种具有轻量级机制的协议,用于向网络上的其他主机发送数据。它不提供握手,保证消息的传递和排序。

# OSI(开放系统互连)**:是描述网络系统如何工作的概念框架。将网络系统功能分为 7 个部分进行描述:物理数据链路网络传输会话展现应用。********

# SSH(安全 Shell): 是一种从一台计算机安全远程登录到另一台计算机的方法。

****#握手:根据维基百科的说法,“握手是两个参与者之间的自动协商过程……通过在通信开始时建立通信链路协议的信息交换,在全面通信开始之前。”[2].

****# FTP(文件传输协议):网络中连接的机器使用的标准协议,用于在彼此之间传输文件。

# Certificate: 根据 computerhope 的说法,“证书或数字证书是唯一的、数字签名的文档,它权威地标识个人或组织的身份。使用公钥加密技术,可以验证其真实性,以确保您正在使用的软件或网站是合法的。”[3].

****#代理服务器:根据what ismip,“代理服务器基本上是另一台计算机,它作为一个中枢,通过它处理互联网请求。”[4].

# Ping: Ping 是一个用来测试 ip 地址是否可达的工具。通过命令ping <ip-address>通过终端访问 Ping。

# Heartbeat: 根据维基百科,“…heart beat 是由硬件或软件产生的周期性信号,用以指示正常运行或同步计算机系统的其他部分。”[5].

# NAS(网络附加存储):它是一个连接到网络的单个文件存储服务器,为一组客户端提供数据访问。NAS 的主要缺点是它不具备容错能力。如果服务器出现故障,机器将无法再访问数据。

# SAN(存储区域网络):存储大量数据并提供访问的连接存储的高速网络。这是一个存储网络(多个存储)。数据在网络中的不同存储之间共享和复制,从而使 SAN 具有容错能力。

_____________

[1] IP 地址。https://en.wikipedia.org/wiki/Internet_Protocol

********[2]握手。【https://en.wikipedia.org/wiki/Handshaking ********

[3]证书。https://www.computerhope.com/jargon/c/certific.htm

[4]什么是代理。https://www.whatismyip.com/what-is-a-proxy/

【5】心跳。https://en.wikipedia.org/wiki/Heartbeat

#数据安全性

一套旨在保护数字数据免受未经授权的访问和物理灾难的实践。

#公钥加密:**根据 Globalsign" 公钥加密,或称非对称加密,是一种使用两种数学上相关但不相同的密钥的加密方案——公钥和私钥……公钥用于加密,私钥用于解密【①】。

****#公钥:在密码系统中,公钥是用来加密数据的。公钥可以自由地与其他人共享。从公钥计算私钥是不可行的。

****#私钥:私钥用于解密数据。私钥在所有者处保密(即不与任何其他人共享)。用特定公钥 K123-public 加密的数据只能用精确关联的私钥 K123-private 解密。

****# GDPR(通用数据保护法规):欧盟设计的法规,2018 年 5 月 25 日生效。该法规确保欧盟公民对其个人数据的使用有更多的控制权。要了解更多关于 GDPR 的信息,请访问欧盟官方网站。

#数据匿名化:维基百科数据匿名化是从数据集中去除个人身份信息的过程,使数据描述的人保持匿名。【2】数据要么被删除,要么被替换成乱码。****

#数据泄露(Data Leak): 数据泄露是指有意或无意地向公众发布私人(机密)信息。

****#服务条款:服务条款是服务提供商和想要使用该服务的人之间的法律协议。

****#勒索软件:卡巴斯基勒索软件是一种恶意软件,它会感染你的电脑,并显示要求付费的消息,以使你的系统重新工作……它有能力锁定电脑屏幕或用密码加密重要的、预先确定的文件。”[3].

# SHA-2: 一组六个加密哈希函数,命名为 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256。数字表示每个哈希值使用的位数。

****# RSA(Rivest-sha mir-ad leman):一种广泛使用的公钥密码系统。在密码系统中,公钥用于加密数据,私钥用于解密数据。

_____________

[1]什么是公钥密码学。https://www . globalsign . com/en/SSL-information-center/what-is-public-key-cryptography

[2]数据匿名化。https://en.wikipedia.org/wiki/Data_anonymization

[3]勒索软件。https://www . Kaspersky . com/resource-center/definitions/what-is-ransomware

措施

# Bit: 数字信息的基本单位,取二进制值 1 或 0。

# 字节:通常包含 8 位的位块。

# Terabyte: 在 1 TB = 1024GB 的情况下测量数据的大小。

# Petabyte: 测量数据的大小 1PB = 1024TB。

# 一个数量级:据研究,“一个数量级通常写成 10 的 n 次方。n 代表数量级。如果你把一个数字提高一个数量级,你基本上是把这个数字乘以 10。如果你把一个数字减少一个数量级,基本上就是把这个数字乘以 0.1。”[1].

****# IOPS(每秒输入输出操作数):测量存储系统的输入输出性能。

#吞吐量:**衡量系统在给定时间内处理的信息单位。例如“此数据管道每分钟处理 25GB 数据”

# Latency: 请求/响应从发送方传输到接收方所需的时间。

****#响应时间:从发送方提交请求到收到响应的总时间。

****#带宽:描述在给定时间内,通过互联网连接传输的最大数据量。

_____________

[1]数量级定义示例。https://study . com/academy/lesson/order-of-magnitude-definition-examples . html

#硬件

描述计算机的物理部件。

****# HDD(硬盘):根据维基百科“硬盘是一种机电数据存储设备,它使用磁性存储来存储和检索数字数据,使用一个或多个涂有磁性材料的刚性快速旋转的盘片。”[1].硬盘是廉价的机械设备,仍然广泛用于存储系统。

****# SDD(固态硬盘):根据维基百科“固态硬盘是一种固态存储设备,它使用集成电路组件来持久存储数据,通常使用闪存……”[2]。固态硬盘比硬盘贵得多,主要用于对数据访问速度要求很高的场合。

****# RAM(随机存取存储器):也称为主存储器,RAM 是易失性、短期快速存储器,它从辅助存储器(即硬盘或固态硬盘),以加快 CPU 的访问速度。随机访问 RAM 中的数据具有相同的延迟。

_____________

[1]硬盘驱动器。https://en.wikipedia.org/wiki/Hard_disk_drive

[2]固态硬盘。【https://en.wikipedia.org/wiki/Solid-state_drive

结论

这个词汇表是根据几个来源汇编的。来源主要取自互联网网页链接,如维基百科、IBM、亚马逊、azure、redhat 等。
包含一个链接的概念是从该链接中指定的来源中提取的。

如果您想更深入地了解这些概念,首先考虑提供的参考资料。接下来,如果你想理解这里提出的概念,我强烈推荐你阅读下面的书。

  • Martin Kleppman的《设计-数据密集型应用》(对于每个认真考虑数据工程的人来说都是必不可少的),
  • 内森·马茨和詹姆斯·沃伦的《可扩展实时数据系统的大数据原则和最佳实践》
  • Andrew Tanenbaum 的《分布式系统:原则和范例》

最后,这篇文章容易更新。当新概念出现时,我会更新它。不要犹豫,写信给我的概念,错过了包括。

Coursera 中的 16 门在线课程,开启您的数据科学生涯

原文:https://towardsdatascience.com/16-online-courses-in-coursera-to-start-your-data-science-career-447de4347c9?source=collection_archive---------18-----------------------

诺德塞赫Pixabay 上拍摄的照片

Coursera 上关于数据分析、可视化和机器学习的最佳课程

在全球新冠肺炎疫情的阴影下,我们大多数人都有更多的时间来提高自己的技能,从而在工作环境中更具竞争力。

如果你想在数据科学道路上开始你的职业生涯,在线课程可能是最好的选择之一,因为它们通常成本低,按需定制,可以自定进度。最重要的是,我们可以远程学习。

在这篇文章中,我在 Coursera 上组织了一些课程,我认为这些课程会对想进入这个领域的人有所帮助。如果你已经是一名非常有经验的数据分析师/数据科学家/机器学习工程师,我相信大多数课程可能都有点肤浅。

为了方便起见,这些课程分为不同的类别。

  • 基本的
  • 程序设计语言
  • 数据分析
  • 数据可视化
  • 机器学习

当然,我不会说这些课程你什么都要钉。根据个人需求和职业路径偏好,可能会挑选一部分给自己热身。

基本的

曼弗雷德里希特Pixabay 拍摄的照片

大数据简介
加州大学圣地亚哥分校

[## 大数据简介

由加州大学圣地亚哥分校提供。有兴趣增加您对大数据领域的了解吗?这个…

www.coursera.org](https://www.coursera.org/learn/big-data-introduction)

我相信你可能对数据库、SQL 等有所了解。然而,如今您需要知道什么是大数据,才能胜任大多数数据分析和数据科学任务。

本课程介绍了大数据的核心概念及其重要性。它还训练我们如何以可扩展的方式思考问题,这使我们在遇到与数据相关的问题时能够有更进一步的视野。

如果您对本课程感到满意,它也是一个系列,将继续沉浸在大数据的应用中,包括大数据中的机器学习,但它意味着更多的理论而不是大量的实践。

数据科学家的工具箱
约翰·霍普金斯大学

[## 数据科学家的工具箱

由约翰霍普金斯大学提供。在本课程中,您将了解……中的主要工具和思想

www.coursera.org](https://www.coursera.org/learn/data-scientists-tools#syllabus)

如果你没有太多的编程背景,这个课程会很有帮助。它列出了“数据科学家的工具箱”中最受欢迎的东西,并进行了解释。

在本课程中,你将学习 R 等基础编程,以及 RStudio 等开发环境。此外,作为一名数据科学家,您需要知道如何在 Git 中与同事协作。

程序设计语言

PixiesPixabay 上的照片

Python 交互式编程入门
莱斯大学

[## Python 交互式编程介绍(第 1 部分)

由莱斯大学提供。这两个部分的课程旨在帮助学生很少或没有计算…

www.coursera.org](https://www.coursera.org/learn/interactive-python-1)

你必须知道 Python 是数据科学领域最流行的编程语言。所以,如果你还没有开始使用它,这个课程将帮助你成为一名 Python 程序员。

本课程的预期受众是那些非计算机科学背景的人。所以,从基础做起。所以,如果你以前从未使用过编程语言,也不要担心会被卡住。另外值得一提的是,本课程的重点不是数据分析或机器学习,而是编程技能。

应用数据科学与 Python 专业化
密歇根大学

[## 使用 Python 的应用数据科学

由密歇根大学提供。密歇根大学专业的 5 门课程向学习者介绍了…

www.coursera.org](https://www.coursera.org/specializations/data-science-python)

请注意,这是一个专业化,这意味着它包含多个课程。

本课程面向那些已经拥有 Python 经验但从未使用它进行数据分析的人。事实上,我想说的是,当我使用 Python 来编写 web 服务和数据可视化应用程序时,情况有所不同。本课程将帮助您转换现有的编程技能,以适应您在 Python 中的数据分析/机器学习职业。

R 编程
约翰霍普金斯大学

[## r 编程

由约翰霍普金斯大学提供。在这门课程中,你将学习如何用 R 编程,以及如何使用 R 进行有效的编程

www.coursera.org](https://www.coursera.org/learn/r-programming)

当然,Python 并不是数据分析和机器学习的唯一选择。当人们提到这些领域时,R 不能缺席。

如果你更喜欢用 R,完全没问题。在本课程中,您将从头到尾学习 R 编程,包括环境配置、在统计问题中应用 R、利用第三方库、调试等。还有一个好处是,这门课还提供了一些来自行业的数据分析实例,让你的技巧更加实用。

数据分析

PhotoMIX-CompanyPixabay 上拍摄的照片

数据驱动型公司的业务指标
杜克大学

[## 数据驱动型公司的业务指标

由杜克大学提供。在本课程中,您将学习如何使用数据分析进行任何…

www.coursera.org](https://www.coursera.org/learn/analytics-business-metrics)

如果你想学习目的驱动的数据分析,这个课程是最适合你的。它使用所有行业示例展示数据分析技能,不仅教您知识,还教您实践技能。

你将了解成为一名典型的数据分析师到底需要什么。如何使用数据分析在激烈的竞争中帮助您的公司。你会在这里找到答案。

数据分析工具
卫斯理大学

[## 数据分析工具

卫斯理大学提供。在本课程中,您将开发并测试关于您的数据的假设。你会学到一个…

www.coursera.org](https://www.coursera.org/learn/data-analysis-tools)

如果你想深入研究那些流行的数据分析、数据挖掘和统计技术,这个课程会很有帮助。它侧重于统计技术,如假设检验,方差分析,卡方检验,皮尔逊相关等。

在 Excel 中掌握数据分析
杜克大学

[## 掌握 Excel 中的数据分析

由杜克大学提供。重要:本课程的重点是数学,特别是数据分析的概念和…

www.coursera.org](https://www.coursera.org/learn/analytics-excel/)

我知道使用 Excel 听起来不是很酷,但我不得不说,有时它是一个不错的选择。例如,当您已经在 Excel 中获得数据,并且想要一些快速且一次性的结果时,它可能仍然是最佳选择。此外,如果你已经掌握了不错的 Excel 技能,本课程将帮助你探索 Excel 更多的可能性和潜力。

数据可视化

照片由 PexelsPixabay 上拍摄

Power BI 桌面入门
Amit Yadav,Coursera 项目网

[## 开始使用 Power BI 台式机

由 Coursera 项目网提供。在这个 2 小时的项目课程中,您将学习使用电力的基本知识…

www.coursera.org](https://www.coursera.org/projects/power-bi-desktop)

作为最流行的数据可视化和 BI 前端工具之一,如果您的公司是微软商店,Power BI 是一个好的开始。

我强烈推荐这门课程来开始你的数据可视化之旅。这是 Coursera 指导的项目课程之一,这意味着它为您提供了一个在线工作空间,这是一个位于您浏览器中的云桌面,无需下载。然后,您可以与指导视频并排进行动手任务,非常方便,体验良好。

数据可视化与交流与 Tableau
杜克大学

[## 数据可视化和与 Tableau 的通信

由杜克大学提供。出色的业务数据分析师的一项技能是能够…

www.coursera.org](https://www.coursera.org/learn/analytics-tableau)

Tableau 是另一个数据可视化工具,在这个市场中占有很大的比重。在本课程中,您将学习如何使用 Tableau 讲述数据故事,如何可视化数据分析或机器学习模型的结果,以及如何通过数据更好地与他人交流。

数据可视化
伊利诺伊大学香槟分校

[## 数据可视化| Coursera

学习数据挖掘的一般概念以及基本方法和应用。然后深入一个子领域…

www.coursera.org](https://www.coursera.org/learn/datavisualization#syllabus)

本课程不是介绍数据可视化的具体工具,而是提供概念层面的指导。例如,在什么情况下应该使用什么样的数据可视化,对于数值和非数值数据有什么典型的数据可视化方法等等。

机器学习

viaramiPixabay 上拍摄的照片

机器学习
吴恩达斯坦福大学

[## 斯坦福大学的机器学习| Coursera

机器学习是让计算机在没有明确编程的情况下行动的科学。在过去的十年里…

www.coursera.org](https://www.coursera.org/learn/machine-learning)

这是有史以来最好的机器学习课程,没有之一。如果你希望我只为初学者推荐一门关于机器学习的课程,那就是这门课。到目前为止(2020 年 8 月),Coursera 上已经有超过 340 万的学习者注册了这门课程。

更重要的是,这门课已经在 Coursera 上免费了,虽然我觉得它值几千美元。

应用数据科学与 Python 专业
密歇根大学

[## Python 中的应用机器学习

由密歇根大学提供。本课程将向学习者介绍应用机器学习,重点是…

www.coursera.org](https://www.coursera.org/learn/python-machine-learning)

如果你已经学习了吴恩达的课程,并想探索其他课程,这是一个不错的选择。内容与前者有很多重叠,但如果你想的话,有另一个来加强你的学习是很好的。

推荐系统
明尼苏达大学

[## 推荐系统

由明尼苏达大学提供。推荐系统是一个寻求预测用户偏好的过程。这个…

www.coursera.org](https://www.coursera.org/specializations/recommender-systems)

如果你已经有了机器学习的基础知识,想知道 ML 能做什么样的应用,这个课程是最好的之一。

推荐系统一直是并且仍然是机器学习最热门的应用领域之一。当你在 ebay.com 购物时,他们的推荐系统会“学习”你的偏好,并向你推荐其他你可能也会购买的商品。这是推荐系统的一个例子。

回归模型
约翰霍普金斯大学

[## 回归模型

由约翰霍普金斯大学提供。线性模型,顾名思义,将一个结果与一组预测因素联系起来…

www.coursera.org](https://www.coursera.org/learn/regression-models)

回归是统计学习中最常用的技术之一。本课程着重于回归,并深入探讨各种不同的回归,如线性回归、逻辑回归、多变量回归、残差、泊松回归等。它还告诉你如何选择最佳的回归模型。

神经网络与深度学习
吴恩达,deeplearning.ai

[## 神经网络和深度学习| Coursera

从 deeplearning.ai 学习神经网络和深度学习,如果你想打入前沿 ai,这门课…

www.coursera.org](https://www.coursera.org/learn/neural-networks-deep-learning)

如果你是一个科技爱好者,你一定知道 Alpha Go,这是一个打败过最优秀的人类围棋选手的 AI,其背后的技术是深度学习。

如果你想学习深度学习,这是来自吴恩达的最佳课程。别担心。它从浅层神经网络开始,因此对初学者来说相当友好,尽管我仍然建议初学者应该从本节的第一课开始。

摘要

StockSnapPixabay 上拍摄的照片

由于新冠肺炎,每个人都被锁在家里,而有些人却在琐碎的事情上花费时间来“消磨”时间。然而,如果我们能够利用这段时间来提高我们的数据科学技能,我相信当一切恢复正常时,我们在就业市场上将更具竞争力。

不要浪费每一次危机!

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

关于机器学习算法的 16 个技巧

原文:https://towardsdatascience.com/16-tips-about-machine-learning-algorithms-7c5eaaf4bf45?source=collection_archive---------47-----------------------

加深您对常见机器学习算法的了解

你可能听说过瑞士军刀。如果没有,就看看下图。它包含许多刀片和工具。每个人都专门从事一项特定的任务。在某些情况下,不同的刀片可以执行相同的任务,但性能程度不同。

图片来自 Pixabay

我认为机器学习算法是瑞士军刀。有许多不同的算法。某些任务需要使用特定的算法,而有些任务可以用许多不同的算法来完成。根据任务和数据的特征,性能可能会有所变化。

在这篇文章中,我将分享 16 个技巧,我认为它们会帮助你更好地理解算法。我的目标不是详细解释算法是如何工作的。我宁愿给出一些提示或细节。

一些技巧会更通用,而不是集中在某个特定的算法上。例如,日志损失是与所有分类算法相关的成本函数。

我假设你对算法有基本的了解。即使你不知道,你也可以挑选一些细节来帮助你。

我们开始吧。

1.支持向量机的 c 参数(SVM)

SVM 的 c 参数为每个错误分类的数据点增加了一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。

如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。

2.基于 RBF 核的 SVM 伽玛参数

RBF 核 SVM 的 Gamma 参数控制单个训练点的影响距离。低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。

对于高 gamma 值,这些点需要彼此非常接近,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。

3.什么使逻辑回归成为线性模型

逻辑回归的基础是逻辑函数,也称为 sigmoid 函数,它接受任何实数值并将其映射到 0 到 1 之间的值。

(图片由作者提供)

它是一个非线性函数,但逻辑回归是一个线性模型。

下面是我们如何从 sigmoid 函数得到一个线性方程:

(图片由作者提供)

取两侧的自然对数:

(图片由作者提供)

在等式(1)中,代替 x,我们可以使用线性等式 z :

(图片由作者提供)

那么等式(1)变成:

(图片由作者提供)

假设 y 是正类的概率。如果它是 0.5,那么上面等式的右边变成 0。

我们现在有一个线性方程要解。

4.主成分分析中的主要成分

PCA(主成分分析)是一种线性降维算法。PCA 的目标是在减少数据集的维数(特征数量)的同时保留尽可能多的信息。

信息量是用方差来衡量的。具有高方差的特征告诉我们关于数据的更多信息。

主成分是原始数据集特征的线性组合。

5.随机森林

随机森林是使用一种叫做装袋的方法建立的,其中每个决策树都被用作并行估计器。

随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举特征随机性实现不相关的决策树。

(图片由作者提供)

6.梯度推进决策树(GBDT)

GBDT 使用提升方法来组合个体决策树。Boosting 是指将一个学习算法串联起来,从许多顺序连接的弱学习器中实现一个强学习器。

每棵树都符合前一棵树的残差。与装袋不同,增压不涉及自举取样。每次添加新树时,它都适合初始数据集的修改版本。

(图片由作者提供)

7.增加随机森林和 GBDT 的树木数量

增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。

然而,梯度提升决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。

8.层次聚类与 K-均值聚类

分层聚类不需要预先指定聚类的数量。必须为 k-means 算法指定聚类数。

它总是生成相同的聚类,而 k-means 聚类可能会根据质心(聚类中心)的初始化方式产生不同的聚类。

与 k-means 相比,层次聚类是一种较慢的算法。运行时间很长,尤其是对于大型数据集。

9.DBSCAN 算法的两个关键参数

DBSCAN 是一种聚类算法,适用于任意形状的聚类。这也是一种有效的检测异常值的算法。

DBSCAN 的两个关键参数:

  • eps :指定邻域的距离。如果两点之间的距离小于或等于 eps,则认为这两点是相邻的。
  • minPts: 定义一个聚类的最小个数据点。

10.DBSCAN 算法中的三种不同类型的点

基于 eps 和 minPts 参数,点被分类为核心点、边界点或异常点:

  • 核心点:如果一个点在其半径为 eps 的周边区域内至少有 minPts 个数的点(包括该点本身),则该点是核心点。
  • 边界点:如果一个点可以从一个核心点到达,并且其周围区域内的点数少于 minPts,那么这个点就是边界点。
  • 离群点:如果一个点不是核心点并且从任何核心点都不可达,那么这个点就是离群点。

图源

在这种情况下,minPts 是 4。红色点是核心点,因为在其半径为 eps 的周围区域内至少有4 个点。该区域在图中用圆圈表示。黄色点是边界点,因为它们可以从核心点到达,并且其邻域内的点少于 4 个。可到达意味着在核心点的周围区域。点 B 和 C 在其邻域(即半径为 eps 的周围区域)内有两个点(包括点本身)。最后,N 是一个异常值,因为它不是一个核心点,不能从核心点到达。

11.朴素贝叶斯为什么叫朴素?

朴素贝叶斯算法假设特征是相互独立的,特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。

所有特征都是独立的假设使得朴素贝叶斯算法比复杂算法更快。在某些情况下,速度优先于更高的精度。

它可以很好地处理文本分类、垃圾邮件检测等高维数据。

12.什么是日志丢失?

对数损失(即交叉熵损失)是机器学习和深度学习模型的广泛使用的成本函数。

交叉熵量化了两个概率分布的比较。在监督学习任务中,我们有一个目标变量,我们试图预测。使用交叉熵比较目标变量的实际分布和我们的预测。结果是交叉熵损失,也称为对数损失。

13.原木损失是如何计算的?

对于每个预测,计算真实类的预测概率的负自然对数。所有这些值的总和给出了对数损耗。

这里有一个例子可以更好地解释这个计算。

我们有一个 4 类的分类问题。我们的模型对特定观测值的预测如下:

(图片由作者提供)

来自该特定观察(即数据点或行)的对数损失是-log(0.8) = 0.223。

14.为什么我们用 log loss 代替分类精度?

在计算对数损失时,我们取预测概率的自然对数的负值。我们对预测越有把握,测井损失就越低(假设预测是正确的)。

例如,-log(0.9)等于 0.10536,而-log(0.8)等于 0.22314。因此,90%的把握比 80%的把握会导致更低的测井损失。

传统的度量标准,如分类准确度、精确度和召回率,通过比较预测类和实际类来评估性能。

下表显示了两个不同模型对一个由 5 个观察值组成的相对较小的集合的预测。

(图片由作者提供)

两个模型都正确地对 5 个观察值中的 4 个进行了分类。因此,在分类精度方面,这些模型具有相同的性能。然而,概率揭示了模型 1 在预测中更确定。因此,总体而言,它的表现可能会更好。

对数损失(即交叉熵损失)提供了对分类模型的更稳健和准确的评估。

15.ROC 曲线和 AUC

ROC 曲线通过组合所有阈值处的混淆矩阵来总结性能。 AUC 将 ROC 曲线转化为二元分类器性能的数字表示。AUC 是 ROC 曲线下的面积,取 0 到 1 之间的值。AUC 表示一个模型在区分正类和负类方面有多成功。

16.精确度和召回率

精确度和召回率度量将分类准确性向前推进了一步,并允许我们获得对模型评估的更具体的理解。选择哪一个取决于任务和我们的目标。

Precision 衡量我们的模型在预测为正时有多好。精度的焦点是正面预测。它表明有多少积极的预测是正确的。

回忆测量我们的模型在正确预测积极类方面有多好。召回的重点是实际正班。它表示模型能够正确预测的阳性类别的数量。

结论

我们已经介绍了一些基本信息以及关于机器学习算法的一些细节。

有些点与多种算法有关,比如关于日志丢失的算法。这些也很重要,因为评估模型和实现它们一样重要。

所有的机器学习算法在某些任务中都是有用和有效的。根据你正在做的工作,你可以掌握其中的一些。

然而,了解这些算法的工作原理是很有价值的。

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

处理数据、大数据甚至更大数据的 17 种策略

原文:https://towardsdatascience.com/17-strategies-for-dealing-with-data-big-data-and-even-bigger-data-283426c7d260?source=collection_archive---------3-----------------------

加速 Python 代码的技巧和库

处理大数据可能很棘手。没有人喜欢内存不足的错误。☹️没有人喜欢等待代码运行。⏳没有人喜欢离开 Python。🐍

不要绝望!在本文中,我将提供一些技巧,并介绍一些新兴的库来帮助您高效地处理大数据。我还将向您介绍不适合内存的代码的解决方案。在使用 Python 的过程中。👍

我们到桥的另一边去吧!资料来源:pixabay.com

Python 是科学和数值计算最流行的语言。熊猫最受清理代码和探索性数据分析的欢迎。

与使用 Microsoft Excel 或 Google Sheets 相比,使用 pandas 和 Python 可以处理更多的数据。

SQL 数据库在存储数据方面非常受欢迎,但在表达性、测试、再现性以及快速执行数据分析、统计和机器学习的能力方面,Python 生态系统比 SQL 有许多优势。

不幸的是,如果您在本地工作,pandas 可以处理的数据量会受到您机器上内存量的限制。如果你在云中工作,更多的内存需要更多的钱。💵

不管你的代码在哪里运行,你都希望操作快速发生,这样你就可以 GSD(完成任务)!😀

总是要做的事情

如果你曾经听到或看到过关于加速代码的建议,你就会看到这个警告。⚠️ 不要过早优化! ⚠️

这是个好建议。但是了解一些技巧也是很聪明的,这样你就可以在第一时间写出干净快速的代码。🚀

去追它!资料来源:pixabay.com

以下是适用于任何规模数据集的三种良好编码实践。

  1. 尽可能避免嵌套循环。下面是关于 Big-O 符号和算法分析的简单介绍。嵌套在另一个for循环中的一个for循环通常会导致多项式时间计算。如果你要搜索的项目不止一个,你可能要等一段时间。看到一个漂亮的图表和解释这里
  2. 在 Python 中尽可能使用列表理解(和字典理解)。按需创建一个列表比重复加载和附加属性到一个列表要快得多——堆栈溢出的提示答案这里。然而,一般来说,不要为了速度而牺牲清晰性,所以要小心嵌套列表理解。⚠️
  3. 在 pandas 中,使用内置的矢量化函数。这个原理和列表和字典理解的原理是一样的。一次对整个数据结构应用一个函数比重复调用一个函数要快得多。

如果你发现自己伸手去拿apply,想想你是否真的需要。apply在行或列上循环。矢量化方法通常速度更快,代码更少,因此它们是多方面的胜利。🚀

同样,避免其他循环遍历数据的 pandas 系列和 DataFrame 方法,例如applymapitterrowsittertuples。如果有意义的话,在 DataFrame 上使用mapreplace方法,而不是其他任何方法,这样可以节省很多时间。

请注意,这些建议可能不适用于非常少量的数据,但在这种情况下,风险很低,所以谁在乎呢。😉

这给我们带来了最重要的规则

能留在熊猫就留在熊猫。🐼

这是一个快乐的地方。😀

如果没有问题,并且不希望数据或内存空间膨胀,就不要担心这些速度和内存问题。

但在某个时候,风暴云会聚集。⛈:你会遇到一个大数据集,然后你会想知道该怎么做。来看看一些小技巧吧。

与大量数据(大约数百万行)相关的事情

就像数百万颗沙粒。资料来源:pixabay.com

  1. 如果你在做机器学习,使用你的数据子集来探索、清理和制作一个基线模型。快速解决 90%的问题,节省时间和资源。这项技术可以帮助你更快地得到一个好的模型!⏳
  2. 当读入数据帧时,只加载需要使用[usecols](https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#load-less-data)参数的列。少数据 in =赢!
  3. 有效地使用数据类型。将数字列向下转换为对pd.to_numeric()有意义的最小数据类型。将基数低(只有几个值)的列转换为分类数据类型。这是一份关于高效类型的熊猫指南。
  4. scikit 中的并行模型培训-学习尽可能使用更多处理内核。默认情况下,scikit-learn 只使用您机器的一个内核。许多计算机都有 4 个或更多内核。通过传递关键字参数n_jobs=-1,您可以将它们全部用于可并行化的任务。
  5. 以羽毛或泡菜格式保存熊猫数据帧,以加快读写速度。向 Martin Skarzynski 致敬,他在这里链接到证据和代码。
  6. 使用[pd.eval](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.eval.html#pandas.eval) 加速熊猫的行动。将您通常的代码以字符串形式传递给该函数。它的运算速度要快得多。这是一个 100 列数据框架的测试图表。

图片来自Tirthajyoti Sarkar关于该主题的这篇好文章

[df.query](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html#pandas.DataFrame.query)基本上与pd.eval相同,但是作为一个 DataFrame 方法,而不是一个顶级的 pandas 函数。

查看文档,因为有一些问题。⚠️

熊猫正在引擎盖下使用 numexpr 。Numexpr 也可以和 NumPy 一起使用。Chris Conlan 在他的书 Fast Python 中为我指出了@Numexpr。Chris 的书是学习如何提高 Python 代码速度的绝佳读物。👍

事情与真正的大数据有关(大约几千万行或更多)

更多数据!资料来源:pixabay.com

  1. 使用数字巴。如果你在做数学计算,Numba 会大大提高你的速度。安装 numba 并导入它。然后,当您需要遍历 NumPy 数组并且不能使用矢量化方法时,使用@numba.jit decorator 函数。它只适用于 NumPy 数组。在 pandas 数据帧上使用.to_numpy()将其转换为 NumPy 数组。
  2. 在有意义的时候使用稀疏矩阵。Scikit-learn 用一些转换器自动输出稀疏数组,比如 CountVectorizer。当您的数据大部分是 0 或缺少值时,您可以在 pandas 中将列转换为稀疏 dtypes。点击阅读更多
  3. 使用 Dask 将数据集并行读取到 pandas 的数据块中。Dask 还可以在多台机器上并行处理数据操作。它模仿熊猫和 NumPy APIs 的子集。 Dask-ML 是一个姐妹包,用于在多台机器上并行化机器学习算法。它模仿 scikit-learn API。Dask 与其他流行的机器学习库(如 XGBoost、LightGBM、PyTorch 和 TensorFlow)配合得很好。
  4. 使用 PyTorch,不管有没有 GPU。在 GPU 上使用 PyTorch 可以获得很大的加速,我在这篇关于排序的文章中发现了这一点。

未来处理大数据时需要关注/尝试的事情

盯着他们!资料来源:pixabay.com

以下三个包是截至 2020 年年中的最新产品。预计配置问题和 API 变化。如果您在本地 CPU 上工作,这些包可能不适合您的需要。但是看起来都很有希望,值得关注。👀

  1. 您是否可以访问大量的 cpu 内核?您的数据是否超过 32 列(从 2020 年中期开始需要)?然后考虑摩丁。它模仿 pandas 库的子集来加速大型数据集的操作。它使用阿帕奇箭(通过射线)或引擎盖下的 Dask。Dask 后端是实验性的。在我的测试中,有些东西不是很快——例如从 NumPy 数组中读取数据很慢,内存管理是个问题。
  2. 可以用 jax 代替 NumPy。Jax 是一款开源的谷歌产品,非常前沿。它通过使用以下五种工具来加速操作:自动签名、XLA、JIT、矢量器和并行化器。Jax 在 CPU、GPU 或 TPU 上工作,可能比使用 PyTorch 或 TensorFlow 获得速度提升更简单。Jax 对深度学习也有好处。截至 2020 年中期,它适用于 NumPy,但不适用于熊猫。但是,您可以将 DataFrame 转换为 TensorFlow 或 NumPy 对象,然后使用 jax。点击阅读更多
  3. Rapids cuDF 通过类似熊猫的 API 在 GPU 上使用 Apache Arrow。是 NVIDIA 的开源 Python 包。Rapids 与 Dask 配合得很好,因此您可以让多个 GPU 并行处理数据。对于最大的工作负载,它应该提供一个不错的提升。

关于代码速度和大数据的其他知识

计时操作

如果你想在 Jupyter 笔记本上为一个操作计时,你可以使用
%time%timeit魔法命令。当单个%是前缀时,它们都在单行上工作;当双%%是前缀时,它们都在整个代码单元上工作。

%time运行你的代码一次,%timeit运行代码多次(默认为七次)。请务必查看文档以了解一些微妙之处。

如果您正在使用 Python 脚本或笔记本,您可以导入时间模块,检查运行代码前后的时间,并找出差异。

或者,您可以使用time.perf_countertime.process_time。区别在堆栈溢出问题中讨论。

测试时间时,请注意不同的机器和软件版本会导致差异。此外,如果您正在进行重复测试,缓存有时会误导您。和所有的实验一样,保持你能保持不变的东西不变。👍

存储大数据

GitHub 的最大文件大小是 100MB 。如果你想用 GitHub 版本化大文件,你可以使用 Git 大文件存储扩展。

此外,确保你没有将文件自动上传到 Dropbox、iCloud 或其他自动备份服务,除非你想这样做。

想了解更多?

pandas 文档中有关于增强性能和扩展到大型数据集的章节。我的一些想法改编自那些章节。

有其他提示吗?我很想在推特上听到他们的声音。🎉

包装

您已经了解了如何编写更快的代码。您还看到了如何处理大数据和真正的大数据。最后,您看到了一些新的库,它们可能会继续变得更受欢迎,以处理大数据。

我希望这个指南对你有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀

我写关于 PythonSQLDocker 和其他技术主题的文章。如果你对这些感兴趣,请注册我的邮件列表,那里有很棒的数据科学资源,点击这里阅读更多内容,帮助你提高技能。👍

资料来源:pixabay.com

大数据时代快乐!😀

清理和格式化数据的 17 个有用的 Ruby 字符串方法

原文:https://towardsdatascience.com/17-useful-ruby-string-methods-to-clean-and-format-your-data-9c9147ff87b9?source=collection_archive---------8-----------------------

你不写的每一行代码都是你不需要维护的一行代码

凯文·Ku 摄于 Pexels

大约两年前,当我开始使用 Ruby 时,我第一次知道了这个方法,自从我发现了它,我每天都用它来比较两个字符串。从那以后,我遇到了其他几种方法。我想在这里编译我最喜欢的——这些是最适合简化代码的。

字符串操作是程序员每天都要做的工作。从清理到格式化数据,再到分析字符串,各不相同。根据您的需要,您最终可能会采用以下一种、多种或所有方法。

在这篇文章中,我将讨论由 Ruby String 类提供的 17 种有效的字符串方法,它们将通过节省宝贵的时间使你的生活变得更加容易。

1.迭代字符串中的每个字符

我们经常需要遍历字符串来处理字符。例如,您可能想要打印所有元音。

str = "abcdeU"
temp = ""
str.each_char do |char|
 puts char if ['a','e','i','o','u'].include? char.downcase
end
# a
# e
# U

我们可以加上with_index得到字符的位置。

str = "abcdeU"
temp = ""
str.each_char.with_index do |char, i|
 puts "#{i} #{char}" if ['a','e','i','o','u'].include? char.downcase
end
# 0 a
# 4 e
# 5 U

默认情况下,索引从零开始,但是您可以根据需要定义它。

str = "abcdeU"
temp = ""
str.each_char.with_index(100) do |char, i|
 puts "#{i} #{char}" if ['a','e','i','o','u'].include? char.downcase
end
# 100 a
# 104 e
# 105 U

另一个有用的方法是str.each_byte来获取单个字节。当你处理 ASCII 码的时候,这很有帮助。

str = "abcdeABCDE"
str.each_byte do |char|
 puts char
end
# 97
# 98
# 99
# 100
# 101
# 65
# 66
# 67
# 68
# 69

2.将字符串转换为字符数组

要将字符串转换成数组,我们可以使用str.chars,它是str.each_char.to_a的简写。

char_array = "abcdeABCDE".chars
# ["a", "b", "c", "d", "e", "A", "B", "C", "D", "E"]

现在我们有了一个数组,我们可以使用任何数组方法!多酷啊!例如,join方法将数组中的每个元素转换成一个字符串,由给定的分隔符分隔。通过公开数组方法,我们有更多的选项来操作字符串。

char_array.map { |c| c.downcase }.join(', ')
# "a, b, c, d, e, a, b, c, d, e"

3.获取字符串的长度

我认为这是有史以来最常用的方法。当您想在将字符串插入数据库表之前检查字符串长度时,这非常有用。我们也可以用size,是同义词。根据你的喜好,你可以选择其中任何一个👍。我更喜欢用length的方法,因为它更容易理解。

"HELLO World".length 
# 11
"HELLO World".size
# 11

4.获取字符串的字符数

str.count将一组或多组字符作为参数。之后,我们取这些集合的交集来得到最终的字符集。最后,这套用来统计str中的人物。

"look up!".count("o")
# 2
"look up!".count("m")
# 0
"abcdef".count("a-c", "c-f")
# 1

我们可以用它来统计多个字符,所以我们来统计一下元音的个数。

"abcdeUUU".downcase.count("aeiou")
# 5

辅音怎么样?露比掩护你。^符号是用来否定人物的。

"abcdeUUU".downcase.count("^aeiou")
# 3

以上两个例子并没有涵盖每一种情况,比如含有数字或特殊字符的字符串。

"^-12#abcdeUUU".downcase.count("^aeiou")
# 8

如果我们想更清楚地了解允许的字符集,我们可以使用下面的例子。这里的a-z表示它们之间的所有字符。之后,我们排除元音。如果我们取第一个和第二个字符集的交集,我们就有了有效常量集。

"^-12#abcdeUUU".downcase.count("a-z", "^aeiou")
# 3

如果我们想在我们的字符集中包含^-符号,我们需要使用反斜杠字符对它们进行转义。在这里,我们通过用反斜杠字符对符号进行转义来包含符号^-。因此,最终的字符集将有^-0 to 9

"^-1234#".downcase.count("\\^\\-0-9")
# 6

5.反转一根绳子

反转字符串会很方便,例如,当你想检查一个字符串是否是回文时。

str = "Anna"
str.reverse 
# "annA"

puts "palindrome" if str.downcase == str.downcase.reverse
# palindrome

# eql? is a synonym for ==
puts "palindrome" if str.downcase.eql?(str.downcase.reverse)
# palindrome

6 搜索字符串中的一个或多个字符

如果字符串或字符存在,则str.include?返回 true,否则返回 false。

"hEllo wOrlD".include?("w") 
# true
"hEllo wOrlD".include?("1") 
# false

7.替换字符串中的字符

替换字符串中的一个或多个字符是清理或格式化数据的好方法。str.gsub或全局替换用提供的字符串替换所有出现的内容。这里第一个参数表示我们想要替换的字符集,第二个参数是替换字符集。

"Red, Red and Blue".gsub("Red", "Orange") 
"Orange, Orange and Blue"

如果您想替换第一次出现的,使用str.sub

"Red, Red and Blue".sub("Red", "Orange") 
"Orange, Red and Blue"

str.gsub也接受散列或块。

"organization".gsub("z", 'z' => 's') 
# "organisation"

这里我们寻找数字,并在开头添加一个$符号。

"Price of the phone is 1000 AUD".gsub(/\d+/) { |s| '$'+s } 
# "Price of the phone is $1000 AUD"

8.拆开一根绳子

根据分隔符(默认为空格)或模式分割字符串。

sentence = "There Is No Spoon"
words = sentence.split
# ["There", "Is", "No", "Spoon"]
sentence = "There_Is_No_Spoon"
words = sentence.split("_")
# ["There", "Is", "No", "Spoon"]

?=用于正向预测以查找大写字母。

sentence = "ThereIsNoSpoon"
words = sentence.split(/(?=[A-Z])/)
# ["There", "Is", "No", "Spoon"]
sentence = "a111b222c333"
words = sentence.split(/(?=[a-z])/)
# ["a111", "b222", "c333"]

您可以通过提供第二个参数来限制拆分的数量。

sentence = "June 27,June 26,June 25"
words = sentence.split(/,/, 2)
# ["June 27", "June 26,June 25"]

9.修剪绳子

str.trim将删除以下任何前导和尾随字符:null("\x00")、横线tab("\t")line feed(\n)vertical tab("\v")form feed(f)carriage return(\r)space(" ")

" hEllo WOrlD \n\t\v\r ".strip 
# "hEllo WOrlD"

10.修剪字符串的最后一个字符

当给定记录分隔符或回车符(\n\r\r\n)时,str.chomp删除尾随字符。

"...hello...world...".chomp(".")
# "...hello...world.."
"...hello...world".chomp(".")
"...hello...world"
"...hello...world...\n".chomp(".")
# "...hello...world...\n"
"...hello...world...\n".chomp
# "...hello...world..."
"...hello...world...\r".chomp
# "...hello...world..."
"...hello...world...\r\n".chomp
# "...hello...world..."
"...hello...world...\n\r".chomp
"...hello...world...\n"

11.在另一个字符串之前添加一个字符串

将一个或多个字符追加到字符串的开头。

a = "world" 
a.prepend("hello ") 
# "hello world"

12.插入字符串

向字符串的特定位置添加一个或多个字符。

a = "hello" 
a.insert(a.length, " world") 
# "hello world"

13.更改字符串大小写的方法

str.downcase会将字符串中的每个字符转换成小写。

"HELLO World".downcase 
# "hello world"

str.upcase会将字符串中的每个字符转换成大写。

"hello worlD".upcase 
# "HELLO WORLD"

str.capitalize将字符串的第一个字符转换成大写,其余的转换成小写。

"hEllo wOrlD".capitalize 
# "Hello world"

str.swapcase会将字符串中的大写字符转换成小写字符,并将小写字符转换成大写字符。

"hEllo WOrlD".swapcase 
# "HeLLO woRLd"

14。添加字符串

一种常见的字符串操作是串联。为此,我们可以使用str.concat<<

str1 = "hello"
str2 = "world"
str1.concat(" ").concat(str2)
puts "#{str1}"
# "hello world"

# << is same as concat
str1 = "hello"
str2 = "world"
str1 << " " << str2
puts "#{str1}"
# "hello world"

15.获取子字符串

当您想要字符串的特定部分时,str.slice方法是完美的;它返回一个子字符串,其中第一个索引是包含性的,第二个索引是排他性的。

str = "hello world"
puts "#{str.slice(0, 5)}"
# hello

16.查找带有给定前缀和后缀的字符串

我们可以检查一个字符串是以一个字符串开始还是结束。

str = "Mr. Leonardo"
str.start_with?("Mr.")
# true
str = "The quick brown fox jumps over the lazy dog."
str.end_with?(".")
# true

17.空字符串检查

大概另一个最常用的方法是str.empty,可以用于数据验证。

output = ""
output.empty?
# true
output = " "
output.empty?
# false

包裹

像其他编程语言一样,Ruby 有自己的标准库方法,这些方法针对性能进行了优化。使用这 17 种方法,你可以直接解决问题,而不是花时间实现大量的帮助方法。永远记住,没有写的一行代码是你不必维护的代码。如果你有兴趣学习更多关于 Ruby 的知识,请阅读下面的初学者指南。编码快乐!

** [## Ruby 初学者指南

离写下你的下一件大事又近了一步

medium.com](https://medium.com/swlh/a-beginners-guide-to-ruby-810f230c53da)**

学习 Python 和 SQL 最值得推荐的 18 个数据科学平台

原文:https://towardsdatascience.com/18-of-the-most-recommended-data-science-platforms-to-learn-python-and-sql-f969f61b6d70?source=collection_archive---------12-----------------------

社区最受欢迎的数据科学学习平台综合指南

数据科学是当今市场上最热门的职业之一。公司总是在雇佣数据科学家,总有很多人想成为一名数据科学家。但是数据科学并没有像其他技术学科一样存在那么久,所以不像软件开发那样,没有那么多专门针对数据科学的学习平台来帮助有抱负和有经验的科学家做好准备。当然还有 Coursera 和 Udemy,还有一些大的品牌平台,比如 DataCamp。此外,还有十几个或更多更小的利基平台,旨在以他们的方式培训数据科学家。

我评估了数据科学社区的人推荐的 18 个平台。根据您的学习风格和需求,总有一个平台适合您。本文的前半部分是我对这些平台的最终评估,最后是一个完整的平台列表,其中包含了帮助我评估它们的所有细节。文章的第二部分详细介绍了我评估平台的方法——了解不同的用户类型、采购平台和要评估的变量。所以有时间的话先跳到最后了解一下我的评价标准再看结果。如果你时间紧迫,就去下一部分。

TL;大卫:我的评估

我创建了两个图表来映射我的变量。它们是带有象限的图表,你可以在所有白皮书中看到。老实说,我有点惭愧我选择了这种可视化(感觉就像在 Excel 中制作 3D 饼图),但我认为它将允许您快速找出哪个平台最适合您。

图表 1:学习风格和体验

问自己:我的学习风格是什么?我是喜欢一头扎进去开始编码,还是喜欢先看视频?我在这方面完全是新手,需要更多的帮助吗?或者我可以直接跳进去吗?

通过用户体验学习风格[图片由 N. Rosidi 创建]

基于讲座的平台的极端是纯粹的被动讲座,如网页上的文本或人们在视频上的交谈。通常这些平台会要求你自己安装软件,我认为这是一种懒惰,因为安装所有软件来提供完整的开箱即用体验是如此容易。用户并不总是先进的——这就是他们学习的原因——所以为他们提供一种可以通过浏览器轻松访问软件、库和数据集的体验现在是必须的——至少对我来说是这样。

互动的、自我指导的学习允许你按照自己的进度工作,选择你想学习或练习的任何主题。在极端情况下,有一个全功能的 IDE,允许您像在真正的专业环境中一样探索、交互和操作数据。但它不仅仅是完全自我指导的,因为有解决方案可以帮助您解决问题和理解概念。这里的方法是立即开始编码,并在遇到困难时学习解决方案。这些平台非常适合有经验的用户,即使你只是中等经验。

中间地带是讲座和互动自主学习的结合。有了这些平台,你就有了从头到尾学习一系列概念的“课程”和“路径”。向您展示文本和/或视频,然后要求您在一个交互式但有限的 IDE 中应用您所学的内容,在这个 IDE 中,您会被问到一些复杂的问题。交互式但有限的 IDE 意味着 IDE 只接受回答提示问题的输入,因此您不能偏离正道去探索数据或尝试不同的功能和技术,您知道,这是一个优秀的数据科学家会做的事情。这对那些从零开始学习并试图从头开始学习新东西的人来说是完美的。

图表 2:内容焦点

问自己:我是在努力学习 python 吗?还是我在努力学 python 做数据科学家?我是在为面试做准备吗?还是我在尝试建立我的第一个机器学习模型?还是只是想学基础?

按技术重点分类的教育主题[图片由 N. Rosidi 创建]

专业主题是有特定目的的教育内容。例如,为技术面试做准备——数据科学或软件开发。就是用 python 学习金融建模或者构建梯度推进决策树。这些平台服务于小众人群,但他们做得非常好,让他们的用户群满意。

普通教育仅仅是对基本概念的介绍,这些概念是熟练掌握这门语言的基础,比如如何创建熊猫数据框来操作数据。一旦你掌握了这些概念,下一步将是深入到满足你需求的特定主题。

平台是以用户为中心设计的。在这种情况下,你是数据科学家还是软件开发人员?如果你正在读这篇文章,你可能是一个数据科学家,但是正如我之前提到的,有更多的教育平台是为教授软件开发而创建的。有时这些平台提供 python 教育,但它们的内容和示例并不总是面向数据科学家。这有点像给一个软件添加一个插件(它不是原生的,有时感觉有点粗糙)。

对每个平台的详细评估

以防图表对你来说不够。

每个平台的特点以及它们的独特之处

链接到谷歌表单:https://bit.ly/2UknbZ3

哪种类型的用户会从每个平台中受益最多

链接到谷歌表单:【https://bit.ly/2YaNlhR

按用户体验级别划分的教学风格和特点

链接到谷歌表单:【https://bit.ly/3f0SPm9

按技术重点分类的教育主题(数据科学和软件开发)

链接到谷歌表单:https://bit.ly/30kaqkS

因此,根据你的职业目标和你喜欢的学习方式,每个人都有一个平台。在您的旅程中,您可能会使用其中的一些平台,因为每个平台都专注于特定的优势。选择一个数据科学平台,让您了解您所处阶段需要学习的内容。我希望这个列表有所帮助。

请参见下文,了解我评估平台的方法…

附录:我评估 18 个平台的方法

1.用户角色

我从对用户——你——的理解开始。当思考什么类型的人会对学习数据科学感兴趣时,我想到了 3 种不同的用户角色:

  • 经验丰富的数据科学家:这些是当前的数据科学家。他们要么有几年的经验和服务过的公司,要么在第一份工作中是数据科学家。无论如何,这些人要么在寻找新工作,需要准备/更新他们的面试技能,要么想学习其他数据科学技能,以进入数据科学的另一个学科。
  • 技术型、缺乏经验/有抱负的数据科学家:这些人可能是计算机科学专业的学生或当前的业务分析师。他们编写代码,并不需要太多的手把手,因为他们开始在数据科学方面提高技能。他们可能对转向数据科学的职业感兴趣。
  • 非技术人员、缺乏经验/有抱负的数据科学家:这些人可能是学生或在公司担任非技术职务的人。他们不写代码,也不知道从哪里开始,但他们对数据科学职业或涉足技术领域感兴趣。

2.采购公司(包括和排除)

我问自己,有人会如何发现数据科学平台。除了简单的谷歌搜索,大多数人要么选择他们认可的品牌,要么选择基于推荐的平台。

我选择从热门子网站的推荐中寻找平台,比如:

  • r/数据科学
  • r/编程
  • r/python
  • r/sql

Reddit 有一个活跃的数据科学社区,所以这是一个很好的起点。我补充了 Quora,Google,Youtube。

我有意识地选择排除(MOOCs)大规模开放在线课程(如 Udemy、EdX 和 Coursera)、训练营和大学课程,因为质量取决于讲师和课程,所以我很难进行一对一的评估。此外,我不认为有经验的数据科学家真的会上关于如何成为一名数据科学家的 Udemy 课程——但我可能错了。

对于每个平台,我都注册并使用了一段时间。我没有注册高级版本,除非我无法根据我的标准正确评估该平台。

3.我的评估中使用的变量

我根据我认为对上述每个用户角色都很重要的 4 个主要变量来评估每个平台。

回到我的评估部分阅读结果!

基于 1D-CNN 的手写识别全卷积模型

原文:https://towardsdatascience.com/1d-cnn-based-fully-convolutional-model-for-handwriting-recognition-7853976f5784?source=collection_archive---------28-----------------------

EASTER 模型解释了快速、高效和可扩展的 HTR/OCR

手写识别也称为 HTR(手写文本识别),是一种机器学习方法,旨在赋予机器从现实世界的文档(图像)中读取人类笔迹的能力。

传统的光学字符识别系统(OCR 系统)被训练来理解机器打印文本(来自文档/图像)中的变化和字体风格,并且它们在实践中工作得非常好(例如 Tesseract)。另一方面,手写识别是一项更具挑战性的任务,因为人们的笔迹存在大量差异。

照片由约翰·詹宁斯拍摄自 Unsplash | 图片来源

深度学习的最新进展导致了高效 OCR/HTR 解决方案的开发。尽管这些模型在实践中表现出色,但由于以下限制,它们不容易训练、理解和部署

  1. 它们需要海量的标注训练数据。
  2. 由于训练参数多,训练难,推理慢。
  3. 因为它们速度慢,所以需要巨大的部署成本(硬件要求)来使它们在实时应用中有用。
  4. 模型本质复杂,难以扩展(堆叠 LSTMs、复杂关注层)。

在本文中,我们将讨论一种新颖的深度学习架构(EASTER),它在一定程度上解决了上述挑战。这种架构快速、可扩展、简单,并且比许多复杂的 OCR 和 HTR 任务选择更有效。

EASTER 模型仅利用一维卷积层来完成 HTR 和 OCR 的任务。

复活节模型结果来自原论文| 图片来源

原文链接:

复活节:高效可扩展的文本识别器

这是这篇文章将要涉及的关于复活节模型的项目列表-

  1. 复活节概述
  2. 1D——CNN 上的图片?真的吗?怎么会?
  3. 复活节模型建筑
  4. 具有零训练数据的 OCR/HTR 能力
  5. 结果
  6. 总结

复活节概述

EASTER(高效且可扩展的文本识别器)是一个完全卷积的架构,在编码器中仅使用 1-D 卷积层,并在末尾添加了 CTC-解码器(连接主义时间分类)。

复活节设置了一种新的方式来可视化和有效地解决光学字符识别/HTR 任务,只有 1-D 卷积层。

以下是复活节建筑的几个要点

  1. 可在 GPU 上并行训练的全卷积架构。
  2. 只有 1-D 卷积层,速度更快,参数更少。
  3. 即使在训练数据有限的情况下也能很好地工作。
  4. 没有复杂的层次(简单易懂)。
  5. 适用于生产线级 OCR/HTR 任务。

除了 EASTER 架构之外,本文还介绍了一个带有增强设置的合成数据生成管道。这意味着您可以训练自己的 OCR/HTR 系统,而不需要任何训练数据。

现在问题来了——如何在二维图像上应用一维卷积。这是一个非常有效的问题,下一段解释了它-

1D-美国有线电视新闻网的图像?真的吗?怎么会?

考虑一个尺寸为 600 X 50(宽 X 高)的输入图像,如下图所示。

在这里,如果你在这个图像中画一条垂直线,你将只剪切一个字符(如果不是在空白中画的),如果你画一条水平线,你将可能最终剪切所有的字符。

换句话说,我在这里想说的是——沿着图像的高度,你只会发现单个字符的属性,而沿着宽度,当你从左向右移动时,你会发现所有不同的字符。

复活节模型中的一维卷积滤波器运动| 图片作者

所以基本上,宽度可以被认为是一个时间维度,如果你沿着时间移动,你会发现不同的后续字符,而高度代表一个字符在给定时间戳的属性。

内核大小为 3 的一维过滤器实际上意味着在时间维度(沿着宽度,每次 3 个像素)中覆盖 50 个像素(H)的总高度的维度 3 的过滤器。因此,基本上内核大小为 3 的过滤器意味着 3x50(或 3xH)维的过滤器(就像 1-D CNN 适用于 NLP 单词嵌入)。

如上图所示,这个红色矩形框是一个一维卷积过滤器,它在时间维度(宽度)上从左向右移动时扫描图像的整个高度。每次扫描存储被观察字符(或字符的一部分)的信息。

该信息最终被传递到 softmax 层,该层给出了沿宽度的每个时间步长的所有可能字符的概率分布。这个概率分布然后被传递到 CTC 解码层,以生成最终的输出序列。

复活节模型建筑

Easter 模型架构非常简单,仅利用一维卷积层来执行 OCR 和 HTR 任务。

Easter 编码器部分由多个堆叠的一维卷积层组成,其中内核大小随着模型的深度而增加。在 ASR(自动语音识别)领域中,已经证明了基于堆叠 1-D 卷积的网络处理序列到序列任务的有效性。

复活节街区

复活节积木的基本结构如下图所示。每个块具有多个重复的子块。每个子模块由 4 个有序组件组成-

  1. 一维卷积层
  2. 批量标准化层
  3. 激活层
  4. 辍学者

复活节子块| 图片来源

最终编码器

整个编码器是多个重复 EASTER 块的堆栈(在最后一段中讨论过)。除了重复块之外,总体架构中还有四个额外的 1-D 卷积块,如下图所示。

预处理块(下采样块)

这是模型的第一个模块,包含两个 1-D 卷积层,步长为 2。该块用于将图像的原始宽度下采样到宽度/4。除了步距之外,sub 0-块的所有其它部分与上面讨论的类似。

后处理模块

在编码器部分的末端有三个后处理块,其中第一个是膨胀为 2 的膨胀 1-D 卷积块,第二个是正常 1-D 卷积块,而第三个后处理块是“滤波器数目”等于可能结果(模型词汇长度)的数目并且具有 softmax 激活层的 1-D 卷积块。这一层的输出被传递给 CTC 解码器。

复活节编码器| 图片来源

CTC 解码器

EASTER 编码器将编码序列的输出概率分布传递给 CTC 解码器进行解码。

为了将预测的输出字符映射到结果输出序列中,EASTER 模型使用了加权 CTC 解码器。这种加权 CTC 解码器导致模型的快速收敛,并且当训练数据有限时,给出比普通 CTC 更好的结果。

该加权 CTC 解码器的配置在原始论文中有详细描述。

3x3 架构变体

EASTER 3X3:使用下表可以构建一个 14 层的变体。这是一个非常浅/简单的架构,只有 100 万个参数,但对于 OCR/HTR 的任务非常有效。

复活节 3X3 | 图片来源

该型号可以轻松扩展以提高性能/容量。在本文所示的实验中,5x3 变体在 HTR 和 OCR 任务中实现了最先进的性能。

零训练数据的光学字符识别/HTR 能力

除了新颖的体系结构之外,EASTER 论文还描述了为机器打印和手写识别任务综合生成训练数据的方法。

使用这些方法(在论文中有很好的描述),你可以训练一个光学字符识别系统(OCR)或者你自己的手写识别系统(HTR ),而不需要任何标记数据。因为本文中显示的可配置数据生成器将为您准备合成的带标签的训练数据集。

下图显示了一些从纸上合成生成的样本,它们看起来非常逼真-

合成生成的样本| 图像来源

结果

本文展示了在 IAM-脱机行识别任务上的一些惊人的结果。在手写识别任务上的实验证明,即使在训练数据有限的情况下,EASTER 模型也能很好地工作。

复活节的手写识别结果与谷歌的一篇关于“可扩展的手写文本识别系统”(又名 GRCL)的论文进行了比较,作者在这篇论文中用有限的训练数据集展示了良好的手写行识别结果。如下表所示,即使训练样本较少,EASTER 模型的表现也优于 GRCL 模型。

IAM 离线测试数据集上的手写识别结果| 图片来源

EASTER 进一步示出了在场景文本识别(机器打印)任务上的 SOTA 结果,没有任何增强,并且具有贪婪搜索解码机制(没有语言模型解码)。

这是一张手写和机器打印的模型结果的屏幕打印

复活节模型手写识别结果| 图片来源

摘要

在本文中,我们讨论了一种新颖的完全卷积(只有一维卷积)、端到端的 OCR/HTR 管道,它简单、快速、高效且可扩展。

除了架构之外,我们还了解了一维卷积滤波器如何对待识别图像进行处理。

最后,我们讨论了合成数据生成管道以及原始论文中显示的识别结果。

要了解更多细节,你可以在这里阅读原文,因为它对我们在本文中涉及的所有方面都有详细的解释。

感谢阅读!希望这篇文章对你有帮助。请通过评论让我知道你的反馈。下一篇文章再见。

本文原载此处

参考

  1. 复活节论文:【https://arxiv.org/pdf/2008.07839.pdf
  2. https://arxiv.org/pdf/1904.09150.pdfGRCL 纸

阅读下一页>>

  1. 利用量化技术优化张量流模型
  2. 【PyTorch 深度学习:简介
  3. 用 PyTorch 进行深度学习:第一个神经网络
  4. OpenCV:Python 中的简介和简单技巧

在预测模型/数据科学上花费了 100 万美元,而没有用户参与?

原文:https://towardsdatascience.com/1m-spent-on-a-predictive-model-data-science-w-0-value-and-no-user-engagement-91c8cef9a797?source=collection_archive---------65-----------------------

照片由Dev BenjaminUnsplash

如何避免在技术上正确但实际上错误的模型上花费 6-8 个月的时间。

如果没有人使用你的解决方案、模型或应用程序,你的 ML 会成功吗?

我最近联系了一位知名消费品牌的数据科学家,他曾在一家非常大的电子商务公司工作。我问他为什么和我联系,为什么我的一句口头禅“结果重于产出”能引起他的共鸣。他回答说,“很多公司(包括)不知道如何处理他们的 ML 模型和结果。并将其传达给制定大部分预算决策的非技术受众。”

我问他是否有一个特别的例子/事件在他脑海中浮现。他接着说:

在[过去的电子商务公司],我们能够在欺诈者/滥用者下订单时预测他们,但该公司不会采取任何行动,因为他们需要以前欺诈的证据。例如,一个使用台湾 IP 地址从美国网站订购手机的新帐户(客户)将被我们的模型标记出来,但企业无论如何都会接受订单。

两个星期后,这又会被认定为欺诈。

他们本可以采取适当的强制措施或增加摩擦。

两个星期后,它又以欺诈罪出现。

他们本可以采取适当的强制措施或增加摩擦。


该项目历时 6-8 个月。很长。

这里发生了什么?

首先,他们可能在这上面花了数百万。让我们假设 7 个月的工作和大约 10 名年薪 15 万美元/人的员工。我不知道这实际上是否正确,但对这家公司来说感觉是合理的。

就在这里,你在这个项目上的数据科学和工程支出是 875,000 美元,不包括工资以外的任何成本。

这里有很多东西需要解开,但是我立即注意到一件事:这个系统的原型可以很容易地设计出来,而不需要构建任何模型,来帮助确定这个项目的业务单位/发起人将采取的行动。

虽然我不知道发生这种情况的原因,但我确实想知道他们是否与反欺诈领域的部门/利益相关者进行了交谈,以了解:

  • 制作这个的团队是否理解“谁是这个的接收者?该部门将如何识别欺诈信号并对其做出反应?”
  • "什么样的信息会让你选择对欺诈索赔做出反应,或者不予理睬?"
  • “你为什么在乎发现诈骗?”(有什么激励措施来“抓住”欺诈行为?是关于找到它,拿回资金,还是什么?)
  • “在你的工作中,以你现在的方式处理欺诈索赔有什么困难?什么会让你觉得更容易/更好?”
  • "对于一个机器驱动的系统来检测欺诈有什么顾虑?"
  • "你能告诉我,用我们做的这个 UI 例子,你下一步会做什么吗?"[用户界面显示欺诈/警报]
  • “哪些类型的欺诈是最需要抓住的?高价商品还是大量低价商品?这个问题与利益相关方女士相关吗?”
  • “如果这个欺诈检测系统在第一次发布时就取得了成功,你会怎么想?我们该如何衡量呢?”

移情->试探性问题->原型->评估->学习->构建/重新设计/调整

要做到这些,你几乎不需要什么“数据科学”。这不是统计、建模或分析工作。

多是设计,设计思维,换位思考。

听到这样的故事让我很难过。它不仅浪费金钱,而且最终会带来更多的技术债务,分析/数据科学团队可能不喜欢他们的工作“无关紧要”或不被使用,领导/主管可能创造了很好的技术成果,但没有为业务带来任何价值或成果。

在这里,一个成功的设计可能会在早期确定故障点和“令人高兴的地方”,这样就可以将它们纳入到解决方案中。通过关注体验,它会告诉我们,这个解决方案可能不仅仅是制作模型。最终,必须将模型部署到对最终受众有用、可用且有意义的界面和/或用户体验中。在我看来人的因素是这个项目成功的关键。这个人一次也没有向我提到型号/技术有任何问题。

你必须协调人员+用户界面+工程+数据+建模+激励。

UX 和良好的以人为中心的设计帮助我们将所有这些变量粘合在一起,以便我们交付有意义的结果,而不仅仅是输出、模型或 UI。这是不可取的吗?很难用吗?
激励措施不一致吗?
他们是否没有定期让正确的跨职能团队/利益相关方参与进来,并意识到优先级/需求发生了变化?

所有这些问题都是让机器学习模型和数据科学部分成功的一部分。一个成功的以人为中心的设计会将所有这些粘合在一起,或者甚至足够早地揭示出这个项目可能不值得做**

如果你不想在一个项目上花费 6-8 个月的时间来获得这种结果,我教了一个两年一度的研讨会,并且刚刚在发布了一个名为“设计以人为中心的数据产品”的视频课程版本。现在可以免费下载模块 1 的视频和书面补充材料。它是专门为数据科学、分析和技术产品管理领域的领导者设计的——像你们这样的人——他们的任务是制作有价值的数据产品,我已经使课程尽可能简单,立即适用,并希望有趣。我还保证它将帮助你创造更多有用的、可用的和不可或缺的数据产品🤷‍♀️🤔到…里面👍🙏🙆🏻‍♂️.

原载于 2020 年 5 月 21 日 https://designingforanalytics.com的* *

第一次总统辩论:按数字

原文:https://towardsdatascience.com/1st-presidential-debate-by-the-numbers-dee50b35f4ac?source=collection_archive---------22-----------------------

作者图片

第一场辩论很乱。但就像今天的大多数新闻一样,随着下一个故事的出现,它无疑会褪色(例如 Trump 对 COVID 的检测呈阳性)。所以,在辩论退居幕后之前,让我们用一些数据科学和工具来尽快分析和可视化辩论吧!

与其他许多以数据科学为导向的文章不同,我将更多地关注快速而肮脏的数据处理、分析和可视化方法,因为在完全透明的情况下,尽管上面和下面的视觉效果可能看起来很有趣,并能吸引眼球,但它们并不令人难以置信地深刻,也没有讲述太多超越表面水平的故事。然而,文本数据本身是相当丰富的,我鼓励您自己进一步探索这些数据!(我已经把数据上传到 Kaggle 这里了)。

当你时间很紧的时候该做什么

在我从事目前的工作之前,我在《国家杂志》工作,这是大西洋媒体(印刷和在线媒体公司)的政治/政策部门,我们的团队每天都会即时创建可视化效果。为了创造下面的视觉效果,这里有一些我推荐的技巧。

作者图片

第一个问题:数据里有故事吗?

第二个问题:它容易争论吗?

当我观看辩论时,我首先想想象的是贯穿始终的打断次数。但是这容易争论吗?遗憾的是,没有。通过快速的谷歌搜索,我找到了一份来自 Rev.com 的辩论记录,似乎他们在停顿时将每位发言者的发言分开了。

文本抄本将单个发言分成多个片段。

换句话说,除了手动通读和连接这些重叠的区域,没有快速和可靠的方法来识别说话者是否打断了另一个人,被打断了,或者转录只是在搞笑。

事实上,如果我们不考虑前一位发言者是谁,只分析这些事件的发生频率,特朗普总统有 150 次,拜登副总统有 136 次——这一比例与现实相去甚远。下面是检查这一点的代码:

import pandas as pddf = pd.read_csv('debate_csv.csv')  # read in the csv# split into a list of words then count length of list
df['num_words'] = df['text'].str.split().str.len() # subset for only 8 words or less
df = df[df['num_words'] <= 8]# check count by speaker
d_count = df.groupby('speaker').count()
print(d_count)

使用 Excel

可以,用 Excel。对我来说,这是从 Rev 网站复制并粘贴原始转录的最快方式,并使用文本到列和 F5 ->选择空白->删除选定的行来创建数据集。

创建时间图

编码时可视化需要时间。因为我不容易分析我感兴趣的第一个故事角度,所以我决定想象每个演讲者发言的时间。

为了创建时间序列,我使用了fluorescent Studio。虽然我不是他们的免费层的最大粉丝,这要求你的所有数据集都是公开的…对于像这样的快速项目来说,当“新闻价值”溜走时,时间是至关重要的,这是一个很好的工具。(其他快速但有吸引力的 viz 工具还包括 DataWrapper (与 fluid 相同的公共数据要求)和Raw Graphs——这是完全开源的,让你保持隐私,双赢)。

快速浏览了一下 fluorescent 的样本数据,我意识到我自己的数据的结构应该是一行= 1 秒,其中 X 轴是经过的秒数(连续变量),Y 轴是说话者(分类变量)。在处理之前,辩论数据集对每个发言人有一行,一列是发言人开始讲话的分:秒。

import pandas as pddf = pd.read_csv('debate_csv.csv')  # read in the csv# function to convert the time to seconds
def time_to_sec(text):
    minsec = text.split(':')
    minutes = minsec[0]
    seconds = minsec[1]
    tseconds = (int(minutes) * 60) + int(seconds)
    return tseconds# convert timestamp (string) to seconds (int)
df['seconds'] = df['Time'].apply(time_to_sec)

# create multiple rows based on the number of seconds spoken# replace 0 seconds spoken with 1
df['seconds_spoken'] = df['seconds_spoken'].replace(0, 1)
# fill empty values
df['seconds_spoken'] = df['seconds_spoken'].fillna(1)
# now we can run repeat to create one row per second
df = df.loc[df.index.repeat(df.seconds_spoken)]# by resetting the index and making it a column
# we can have a column that increases +=1 seconds
df = df.reset_index(drop=True)
df['running_seconds'] = df.index# export this file
df.to_csv('export.csv')

在导入这个文件并设置轴之后,我们得到了最终的图表(我截屏了这个可视化,并使用 Photopea (免费 Photoshop)添加了最后的润色,就像图例一样)。

作者图片

创造单词云

很明显,我会说我不是文字云的粉丝。他们不能有效地交流信息,而且用不讨人喜欢的调色板看起来很廉价。我的团队知道永远不要给我带来单词云。

话虽如此,但如果它们是为了吸引读者而恰当地创作出来的,它们并不是世界末日。

我使用了来自 Shashank Kapadia 的关于主题建模的数据科学文章的代码,并对其进行了最小的编辑,以返回一个数据帧,其中包含最频繁使用的单词及其对应的每个说话者的频率。顺便说一句,我推荐他的文章,它全面而中肯,有助于我们新的数据科学实习生掌握 LDA。

在运行他的代码之前,我很快清理了文本,以确保 wordcloud 没有被冠词和介词占据。

# quick text cleaning
def remove_accented_chars(text):
    text = unidecode.unidecode(text)
    return textdef expand_contractions(text):
    text = list(cont.expand_texts([text], precise=True))[0]
    return textcustom_remove_string = ['a','and','its','it','did','going','want','know','look','said','got','just','think','crosstalk','say','tell','00','way','like','lot','does','let','happened','came','doing','000','47','seen','shall','are']def remove_custom_words(text):
    text = text.split()
    text = [w for w in text if w not in custom_remove_string]
    text = ' '.join(text)
    return text# run remove accented characters
df['text'] = df['text'].apply(remove_accented_chars)
# lowercase the text and remove punctuation
df['text'] = df['text'].str.lower().apply(lambda x: re.sub(r'[^\w\s]','',x))# run expand contractions and remove custom words
df['text'] = df['text'].apply(expand_contractions)
df['text'] = df['text'].apply(remove_custom_words)

虽然你可以使用 Python Wordcloud 库,但这个项目的目标是尽可能快地建立这些库,所以我在辩论中使用了WordArt.com和特朗普总统和拜登副总统的相应字符串。

作者图片

词性分析

可视化的最后一部分是词性分析。

这是其中最快的一个,互联网上有很多关于如何做到这一点的资料。下面是我创建可视化数据集所需的所有代码。

from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
from collections import Counter# subset the data and create a string of the words used by Trump
trump = df[df['speaker'] == 'President Donald J. Trump '].text.tolist()
trump = " ".join(trump)# use nltk's libraries to determine pos
trump_text = pos_tag(word_tokenize(bid))count= Counter([j for i,j in pos_tag(word_tokenize(bid))])# determine relative usage of each part of speech
total = sum(count.values())
tcount = dict((word, float(co)/total) for word,co in count.items())# convert output to dataframe
tcount = pd.DataFrame(tcount.items())

然后,我将这个脚本的输出拖到 Tableau,并创建了一个快速图表(Tableau 对学生来说是免费的一年,作为一个提醒)。我在 preferences.tps 文件中设置了一个自定义调色板,而不是标准调色板。然后我用加入了词性输出文件,这个文件定义了每个词性缩写(复制/粘贴到 excel →文本到列)。

作者图片

外卖食品

如果你正在进行像这样的快速、探索性的数据可视化,要记住的最重要的事情之一是在触摸键盘之前设置你将追求的故事/叙述/假设问题。与此同时,设想最终产品可能是什么样子——不是根据您将要编写的代码,而是根据查看者将看到的内容。

这将最大限度地减少你最终要做的工作,因为每一步都变成了一个可以勾掉的复选框,而不是一个永无止境的数据探索阶段,这导致了 100 个视觉效果,其中没有一个足够有凝聚力来讲述一个令人信服的故事。

如果你是这个领域的初学者,当你想到分析数据的 101 种方法时,这种方法可以帮助减轻不知所措的感觉。如果你熟悉我用来制作这些视觉效果的标准 NLP 库和工具,这种“故事优先”的方法仍然有助于减少项目所需的时间。

作为参考,这个项目花了大约 2 个半小时完成——从谷歌搜索“2020 年辩论记录”到一起拍照(写这篇文章需要更长时间😂).

从所有这些分析中,一个实际的收获是特朗普总统使用的所有格代词的数量(例如,“我”“我的”“我的”“我们的”等)。当我看到那件事时,我笑了。

关于我:Basil Labs 的创始人,Basil Labs 是一家大数据消费者智能初创公司,帮助组织量化消费者的去向和价值。

热爱音乐,开放数据政策和数据科学。更多文章关注我
如果你对数据伦理、开放数据和/或音乐充满热情,请随时在 Twitter 上添加我。

数据科学在线课程没有教给你的两件重要事情

原文:https://towardsdatascience.com/2-crucial-things-that-data-science-online-courses-didnt-teach-you-2da0ae3267bd?source=collection_archive---------73-----------------------

艰难的教训,真正的秘诀

如果你的数据科学在线课程大纲看起来像…

蒂尔德·舒尔茨在 Unsplash 上的照片

简介:

如果你的数据科学在线课程大纲是这样的,那么你会发现这个博客很有帮助。

SQL,Python →统计,数学→机器学习

我的第一个数据科学课程大纲看起来也和上面的一样。在广泛的求职和与许多人交谈后,我意识到这些技能不足以让我真正开始作为一名数据科学家工作。他们缺乏与现实的联系。

所以我创办了 Udacity 的数据科学纳米学位。它比在线课程要全面得多。我现在已经进行到一半了,我想分享一些我到目前为止学到的非常实用的东西。

  1. 清爽的 DM 工艺
  2. 测试您的代码和 TDD

清爽的 DM 工艺

CRISP DM 过程是一个通常用于指导数据挖掘过程的框架。这件事的好处是它很全面。它还包含了数据科学家需要的所有必要技能。

图 1

如图 1 所示,这个过程有六个步骤。

  • 第一步:首先要理解你要解决的商业问题。作为一名商学院毕业生,我可以告诉你,这一步往往不像听起来那么简单
  • 第二步:需要理解回答业务问题需要什么数据。如果我们无法访问这些数据,我们将需要重新审视业务问题并重新定义它。
  • 第三步:在我们对两者都有了清晰的认识之后,就是数据角力的时候了!这可能需要…永远…
  • 第四步:最后我们可以开始建模。
  • 第五步:然后我们评估我们的模型,不仅通过它的准确性或 ROC 和 AUC,而且通过评估模型是否解决了我们的业务问题。如果没有,那么我们回去重新定义我们的业务问题,重新开始这个过程。
  • 第六步:如果一切看起来不错,我们可以开始与工程团队合作,并将其投入生产!

标准数据科学课程的问题在于,它诱使你认为数据科学 70%是建模,30%是数据争论。

GIF via GIPHY

事实是,可能只有 5%的建模,80%的数据争论,还有其他重要的组成部分。

这提醒我们,当我们寻找数据科学工作时,我们应该展示出我们具备所有六个步骤的技能,而不仅仅是这两个步骤。例如,当我们通过分析公共数据集来构建我们的投资组合时,从陈述业务问题开始,而不是直接跳到 EDA。

测试您的代码和 TDD

TDD 代表测试驱动开发。它不同于测试你的代码,因为 TDD 意味着你甚至在编写代码之前就要编写测试。下面我举个例子。对于软件工程师来说,这是一种常见的做法,但它在最近几年才开始融入数据科学。

大多数标准的在线课程甚至没有提到测试你的代码,更不用说 TDD 了。作为一个新手,这些术语对我来说听起来也很陌生,但下面是你必须知道它们的原因。

例如,您设计了一个模型来预测哪些客户可能会流失。然后工程团队把你的模型纳入公司的系统。现在,每次客户数据库更新后,客户经理都可以自动看到结果。意味着实实在在的影响!

对于将要投入生产的代码,您不希望您的代码仅仅因为有人输入了一些不同的客户数据而中断。您希望确保代码运行顺畅,并且已经考虑了所有可能发生的情况。为此,我们需要测试。

戴维·特拉维斯在 Unsplash 上拍摄的照片

下面是对测试的介绍:

基础—我们在标准在线课程中学到的内容:

def square(x):
    return x*xprint(square(2)) --> 4

问题:每次要测试,都需要重新打印这段代码。如果我需要运行许多测试,这是非常耗费人力的。此外,我需要手动检查结果是否与 4 匹配。换句话说,这个方法没有直接告诉我测试是通过了还是失败了。

Pytest

Pytest 自动为您运行测试,并告诉您通过/失败。这是你开始使用它的方法。

$ pip install pytest

然后,您创建了一个包含测试函数文件的文件夹。这里的两个关键技巧是:

  • 您的测试文件名必须以“test_”开头
  • 您的测试函数名必须以“test_”开头

否则,Pytest 将不会运行任何测试。

注意我的文件名和函数名

确保您在包含您的测试文件的目录中。然后你只需要在终端输入“pytest”。

$ WenRuis-MacBook:example lindachen$ pytest

Pytest 自动运行所有的测试,并告诉您多少测试通过,多少测试失败,以及哪个测试失败。正如我们所料,我 1 次不及格,1 次及格。

在 Python 中我们还可以使用其他形式的测试。比如嘲弄和假设。如果你想进一步阅读,这里有一个很好的指南,介绍了所有的方法。我还在博客的末尾附上了额外的资源。

[## 测试你的代码 Python 的搭便车指南

一些通用的测试规则:是 Python 标准库中包含电池的测试模块。它的 API 将是…

docs.python-guide.org](https://docs.python-guide.org/writing/tests/)

那么 TDD 怎么样呢?

TDD 仅仅意味着我们在编写任何函数之前编写测试文件。所以我们所有的测试一开始都会“失败”,我们的工作就是编写能够通过所有测试的代码。虽然只是顺序上的不同,但在产量上却有很大的不同。原因如下:

  1. 它迫使你在着手解决问题之前考虑问题的约束和界限。没有这一步,我们自己很容易不经过任何仔细的思考,就认为自己已经理解了问题。这里有一个很棒的博客谈到了这个问题!

[## 测试驱动的开发对于好的数据科学是必不可少的。原因如下。

数据科学/分析有许多有趣的事情:

medium.com](https://medium.com/uk-hydrographic-office/test-driven-development-is-essential-for-good-data-science-heres-why-db7975a03a44)

2.至少对我个人来说,在写代码之前写测试让我写出更好的测试。换句话说,在我写完代码后写测试,我很容易忘记考虑一些情况。

我认为这是因为在我们编写代码之后,我们的头脑已经被我们编写代码时的思维过程所束缚。跳出自己的框框是很难的。这也是为什么我们总是希望别人阅读我们的文章,因为我们很难做到这一点。我们需要一双新的眼睛。

我发现很多时候,在线课程就像一个食谱,只给你配料。它没有告诉你香料,你也需要带出香气或使菜肴更美味。

蒂尔德·舒尔茨在 Unsplash 上的照片

我希望我的博客有所帮助。下周,我想谈谈 ETL 管道。下周见!

其他资源:

在你的模型中避免种族歧视的两个简单方法

原文:https://towardsdatascience.com/2-easy-ways-to-avoid-racial-discrimination-in-your-model-868ed43593c9?source=collection_archive---------40-----------------------

关于机器学习公平性的 Python 教程。

火星·马丁内斯在 Unsplash 拍摄的照片

许多人工智能项目的一个高层次目标是沿着公平和歧视的路线解决算法的伦理含义。

我们为什么要关心公平?

众所周知,算法会助长非法歧视

例如,每个投资者都希望将更多的资本投入到高投资回报、低风险的贷款中,这可能并不奇怪。

一个现代的想法是使用机器学习模型,根据关于过去贷款结果的少量已知信息,决定未来的贷款请求给借款人最大的机会全额偿还贷款,同时实现高回报(高利率)的最佳权衡。

有一个问题:该模型是根据历史数据训练的,贫穷的未受教育的人,通常是少数族裔或工作经验较少的人,比一般人更有可能屈服于贷款冲销的历史趋势。

因此,如果我们的模型试图最大化投资回报,它也可能针对白人,特定邮政编码的人,有工作经验的人,事实上剥夺了其余人口公平贷款的机会。

这种行为是违法的。

这里可能有两个失败点:

  • 基于对数据的有偏见的探索,我们可能无意中将偏见编码到模型中,
  • 数据本身可以对人类决策产生的偏差进行编码。

幸运的是,反对不同的治疗方法很容易。

方法 1:不同的治疗检查

虽然没有一个定义被广泛认同为公平的好定义,但我们可以使用统计奇偶性来测试关于受保护属性(如种族)的公平假设。这是一个完全不同的治疗检查。

让我们考虑一下申请贷款的被称为 P 的借款人群体,在该群体中有一个已知的黑人借款人子集 B

我们假设在上有某种分布 D ,这代表了我们的模型将选择这些借款人进行评估的概率。

我们的模型是一个分类器 m : X0,1 给借款人贴标签。如果 m = 1,那么这个人将注销他的贷款,如果 m = 0,这个人将全额偿还他的贷款。

mB 上相对于 XD 的偏差或统计不平等性*是随机黑人借款人被标记为 1 的概率与随机非黑人借款人被标记为 1 的概率之间的差异。*

如果统计上的不平等很小,那么我们可以说我们的模型具有统计上的奇偶性。该指标描述了我们的模型对于受保护子集群体 B 的公平程度。

该函数的输入是一个二进制值数组(如果样本是黑人申请的贷款,则为 1,否则为 0)和第二个二进制值数组(如果模型预测贷款将被冲销,则为 1,否则为 0)。

方法 2:不同的影响检查

完全不同的待遇通常被认为是故意的。另一方面,不同的影响是无意的。在美国劳动法中,完全不同的影响指的是“在就业、住房和其他领域中,对具有受保护特征的一组人的不利影响大于对另一组人的不利影响,即使雇主或房东适用的规则在形式上是中立的。”

完全不同的影响衡量多数群体和受保护群体获得特定结果的条件概率的比率。法律定义提到了 80%的门槛。

if P(White | charge off)/P(Black | charge off)<= 80% then the definition of disparate impact is satisfied.

The input of the function is an array of binary values (1 if the sample is a loan requested by a Black person, 0 else) and a second array of binary values (1 if the model predicted that the loan will Charge Off, 0 else).

The output is True if the model demonstrates discrimination, False else. The degree of discrimination is also provided between 0 and 1.

Conclusion

In this article, we introduced statistical parity as a metric that characterizes the degree of discrimination between groups, where groups are defined concerning some protected class (e.g. Black population). We also covered the 80 percent rule to measure disparate impact.

Both methods make an easy starting point to check fairness for a classifier model. An advanced understanding is offered in this 机器学习中的公平性教程

你可以在我下面的后续文章中了解更多关于人工智能的不确定性:

* [## 野生人工智能:负责任的数据科学

谁先开枪——新种族还是人类?

towardsdatascience.com](/wild-wide-ai-responsible-data-science-16b860e1efe9) [## 深度学习的不确定性。如何衡量?

使用 Keras 对认知和任意不确定性进行贝叶斯估计的实践教程。走向社会…

towardsdatascience.com](/my-deep-learning-model-says-sorry-i-dont-know-the-answer-that-s-absolutely-ok-50ffa562cb0b) [## 钱不是黑色的,是彩色的

红线如何仍然阻止美国黑人今天的财富

medium.com](https://medium.com/an-injustice/money-is-not-black-its-colorful-34fd1ba7e43d)*

从有熊猫的网站上获取表格的两种简单方法

原文:https://towardsdatascience.com/2-easy-ways-to-get-tables-from-a-website-with-pandas-b92fc835e741?source=collection_archive---------9-----------------------

大蟒

pd.read_html 和 pd.read_clipboard 概述

图片由@ siscadraws (Instagram)创建

熊猫图书馆因其易于使用的数据分析能力而闻名。它配备了先进的索引,数据帧连接和数据聚合功能。Pandas 还有一个全面的 I/O API ,你可以用它从各种来源输入数据,并以各种格式输出数据。

在很多情况下,您只需从网站上获取一个表格,用于您的分析。下面看看如何使用熊猫 read_html 和 read_clipboard 从网站上获取表格,只需几行代码。

注意,在尝试下面的任何代码之前,不要忘记导入熊猫。

import pandas as pd

1.pandas.read_html()

让我们试着在这个例子中得到这张与 Tesla 主要高管的表格:

雅虎财务表埃隆·马斯克和其他特斯拉高管的信息

read_html 函数有这样的描述:

将 HTML 表格读入到一个*DataFrame*对象的*list*中。

该函数在您提供的输入(URL)中搜索 HTML 相关标签。它总是返回一个列表,即使站点只有一个表。要使用该函数,您需要做的就是将您想要的站点的 URL 作为该函数的第一个参数。运行 Yahoo Finance 站点的函数如下所示:

pd.read_html('[https://finance.yahoo.com/quote/TSLA/profile?p=TSLA'](https://finance.yahoo.com/quote/TSLA/profile?p=TSLA'))

read_html 的原始输出

要从该列表中获取数据帧,您只需添加一项:

pd.read_html('[https://finance.yahoo.com/quote/TSLA/profile?p=TSLA')[0](https://finance.yahoo.com/quote/TSLA/profile?p=TSLA')[0)]

添加“[0]”将选择列表中的第一个元素。我们的列表中只有一个元素,它是 DataFrame 对象。运行这段代码会得到以下输出:

带有列表索引选择的 read_html 的输出

现在,让我们试着获取这个包含 Tesla 股票汇总统计数据的表格:

特斯拉股票的雅虎财务汇总表

我们将尝试与之前相同的代码:

pd.read_html('[https://finance.yahoo.com/quote/TSLA?p=TSLA'](https://finance.yahoo.com/quote/TSLA?p=TSLA'))

read_html #2 的原始输出

看起来我们得到了所有需要的数据,但是现在列表中有两个元素。这是因为我们在上面的截图中看到的表格在 HTML 源代码中被分成了两个不同的表格。我们可以像以前一样做同样的索引,但是如果你想把两个表合并成一个,你需要做的就是像这样连接两个列表元素:

separate = pd.read_html('[https://finance.yahoo.com/quote/TSLA?p=TSLA'](https://finance.yahoo.com/quote/TSLA?p=TSLA'))
pd.concat([separate[0],separate[1]])

read_html 中两个列表元素的 pd.concat 输出

您还可以做很多事情来处理这些数据进行分析——只需重命名列标题就是一个很好的开始。但是到这一步大约花了 12 秒,如果您只需要静态站点的测试数据,这是非常好的。

2.pandas.read_clipboard()

下面是我们可以尝试获得的标准普尔 500 公司信息表:

来自 datahub.io 的 S&P500 信息

数据是在 ODC 许可下分发的,这意味着它可以在网站上免费共享、创建和改编数据。我最初打算将这个站点用于我的 read_html 示例,但是在我第三次运行这个函数之后,我遇到了一个错误。

pd.read_html('[https://datahub.io/core/s-and-p-500-companies'](https://datahub.io/core/s-and-p-500-companies'))

尝试读取 _html datahub.io 时出现 HTTP 403 错误

当您尝试访问一个网页,并且该网站成功理解您的请求,但不会授权它时,会发生 HTTP 403 错误。当您试图访问您无权访问的站点时,可能会发生这种情况。

在这种情况下,您可以从浏览器访问该站点,但该站点不允许您从脚本访问它。许多网站都有关于抓取“robots.txt”文件的规则,你可以通过在网站 URL 的顶级域名后添加“/robots.txt”找到该文件。例如,"https://facebook.com/robots.txt"就是脸书的。

为了避免这样的错误,您可能想将数据复制到 Excel 表中,然后用 pd.read_excel 函数加载该文件。

相反,熊猫提供了一个功能,允许你直接从你的剪贴板复制数据!read_clipboard 函数有这样的描述:

从剪贴板中读取文本并传递给 read_csv

如果您以前使用过 pandas,您可能使用过 pd.read_csv 来获取一个本地文件,以便在数据分析中使用。read_clipboard 函数只是获取您复制的文本,并将其视为 csv 文件。它将根据你复制的文本返回一个数据帧

要从 datahub.io 获取标准普尔 500 表,请从浏览器中选择并复制该表,然后输入下面的代码。

pd.read_clipboard()

pd.read_clipboard 的输出

完美!我们有一个现成的数据框架,正如从网站上看到的一样!

你可以查看 read_htmlread_clipboard 文档以获得更多信息。在那里,你会发现你可以用这些功能做更多的事情来定制你想要从网站输入数据的方式。

祝你 I/O 好运!

使用 Python 创建一个简单的“PhotoShop”

原文:https://towardsdatascience.com/2-lines-of-python-code-to-edit-photos-187dc76a84c5?source=collection_archive---------21-----------------------

veerasantinithiPixabay 上拍摄的照片

使用 PIL(枕头)获取图像 RGB,并使用 NumPy 进行修改

当我们想要编辑一张照片时,我们通常会拿出一些专业工具,如 PhotoShop。即使有很多更容易使用的工具,它们有相当多的功能可以满足我们的大部分需求,我们通常仍然需要下载、安装并花一点时间来学习如何使用它们。

然而,如果你是一名程序员,或者更好的 Python 开发者,用 Python 编辑你的照片可能会容易得多。或者,可能只是为了好玩,理解一个图像如何用数字表示,以及如何修改这些低级特征以达到高级需求,仍然是很酷的。

在本文中,我将演示如何使用 Python 中的两个库——PIL 和 NumPy——只用 2-3 行代码就实现了大多数基本的照片编辑功能。

准备

照片由 geraltPixabay 上拍摄

我们不需要做任何准备,因为库枕内置在相对较新的 Python 中。另外,我相信如果你用 Python 编程,你的 Python 环境中必须有 NumPy,因为它是我们必须拥有的最基本的库之一。

我们需要做的就是导入这两个库。

from PIL import Image
import numpy as np

对于枕头库,我们只需要它的Image模块。还有,如果你不熟悉 Pillow,请注意我们导入的包PIL和它的库名不一样。这并不罕见,但要注意这一点。

然后,我们需要一张照片来编辑。这个星球上我最喜欢的地方之一是澳大利亚维多利亚大洋路上的十二使徒。所以,让我们用那里的一张照片。感谢网站 Pixabay 上的 JVAstudio ,我们有了这样一个神奇的。

JVAstudioPixabay 上拍摄的照片

RGB 值如何表示照片

我们现在有一张照片,所以我们可以很容易地使用 PIL 加载到内存中。

image = Image.open('apostles-2965525_640.jpg')

如果我们检查对象image的类型,它不是可以直接操作的东西。

type(image)

现在,我们可以使用 NumPy。下面,来自 PIL 的图像对象是一个 3D 数组。我们可以很容易地将其转换为 NumPy 数组。之后,因为它已经被转换成一个多维数组,我们可以检查它的形状

img_data = np.array(image)
img_data.shape

示出了图像具有 377 像素高、640 像素宽,并且 3 是分别为红色、绿色和蓝色(RGB)的通道。如果你有其他不同尺寸的照片,不要担心,我将在这篇文章中介绍的一切都是通用的。

我们可以打印第一个像素的值,这是左上角的一个,但有所有 3 个通道。

img_data[:1,:1,:]

这意味着,对于第一个像素,我们有 204 个红色,215 个绿色和 233 个蓝色。它们是什么意思?用于表示像素的所有值必须在[0,255]的范围内。我们在每张照片中看到的颜色由三个值组成,它们组合成一种“颜色”(这里我们忽略代表透明度的 alpha,因为它与本文无关)。此外,较高的数字意味着该通道中的颜色较浅。换句话说,(255,255,255)是纯白的,(0,0,0)是纯黑的。因此,我们对左上角像素使用(204,215,233)是有意义的,因为它是天空的一部分,非常接近白色。

照片编辑

辅导Pixabay 上的照片

现在,让我们看看我们能做些什么来编辑照片!正如我们刚才解释的 RGB 值,所以我们可以分离通道,让照片用单一的元颜色表示。

颜色通道分离

还记得我们有 3 个通道作为数组的第三维吗?分离通道就像从第三维切割 3D 阵列一样简单。

为了确保我们的新照片只有一个通道的颜色,我们需要确保其他两个通道的所有值都为零。因此,我们需要用全零初始化一个 3D 数组,然后用原始照片的值更新相应的通道。

img_chn_red = np.zeros(img_data.shape, dtype='uint8')
img_chn_red[:,:,0] = img_data[:,:,0]
image_red = Image.fromarray(img_chn_red)

因为“RGB”红色先出现,所以我们需要对 3D 数组进行切片,以获得第一个通道的所有值。同样,使用明确的数据类型初始化零也很重要。否则,默认零是浮点类型,不支持用于生成图像。

结果是这样的。

同样,我们也可以分开绿色通道。只需将原始数组切片,获得第二个通道。

img_chn_green = np.zeros(img_data.shape, dtype='uint8')
img_chn_green[:,:,1] = img_data[:,:,1]
image_green = Image.fromarray(img_chn_green)

和蓝色通道。

img_chn_blue = np.zeros(img_data.shape, dtype='uint8')
img_chn_blue[:,:,2] = img_data[:,:,2]
image_blue = Image.fromarray(img_chn_blue)

在本例中,我们完全过滤了数组,使其包含来自特定通道的值。想象一下,如果你在某个通道上应用一个系数,你也可以改变色温。

裁剪照片

我们已经得到了图像的数组,并且知道每个维度的含义。因此,很容易将图像裁剪到合适的大小。

在这种情况下,我们不想破坏颜色,所以我们应该保持第三维不变,并通过定义第一维(高度)和第二维(宽度)的范围来划分数组。

img_cropped_data = img_data[60:250, 200:500, :]
img_cropped = Image.fromarray(img_cropped_data)

翻转照片

如果我们翻转 3D 阵列,那么我们就翻转照片。请注意,我们可以在第一个轴上翻转(上下颠倒),或在第二个轴上翻转(左右翻转),但我们不能在第三个轴上这样做,因为它会改变颜色。

img_flipped_data = np.flip(img_data, axis=1)
img_flipped = Image.fromarray(img_flipped_data)

反转颜色

一旦我们知道数组中的每个值都在范围[0,255]内,我们就可以通过从 255 中减去每个值来反转颜色。使用 NumPy 广播功能非常容易做到这一点。

img_reversed_data = 255 - img_data
img_reversed = Image.fromarray(img_reversed_data)

旋转照片

我用照片编辑软件的大部分时间都是旋转照片,相信你可能也一样:)这个也很容易,因为 NumPy 提供了旋转一个数组的功能。

img_rotated_data = np.rot90(img_data)
img_rotated = Image.fromarray(img_rotated_data)

摘要

免费拍摄的照片Pixabay

在本文中,我介绍了如何使用 Python 内置库 Pillow 将一张照片读入 NumPy 数组。然后,我们可以对这个多维 NumPy 数组做很多事情,实现很多不同类型的照片编辑功能。

当然,我们还可以对照片做更多的处理。所以,发挥你的创造力去发现更多很酷的编辑功能吧。从字面上看,我们可以用 NumPy 多维数组做什么,必须对应于一种类型的照片编辑。

本文使用的所有代码都可以在我的 Google Colab 笔记本中找到。

[## 数字+ PIL 编辑图像

通道分离、颜色反转、图像裁剪、翻转和旋转

colab.research.google.com](https://colab.research.google.com/drive/1AQsgj_B3FKhbT47uSeZc9MT3njIZtd1k?usp=sharing) [## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

2 分钟 Python:永远不要使用可变值作为默认值

原文:https://towardsdatascience.com/2-min-python-mutables-as-default-values-6dccaf019546?source=collection_archive---------63-----------------------

丹尼尔·陶西斯在 Unsplash 上的照片

会发生什么,为什么会发生,怎么做才能避免。

可变违约的后果

我们编写了一个函数,它将学生的姓名和分数作为参数,并根据提供的分数将“通过”或“未通过”添加到字典中。为了方便起见,由用户决定她是否要提供字典。如果她不做,我们想重新开始。我们的第一次尝试是这样的:

这看起来不错,但是让我们在不提供字典的情况下连续使用这个函数两次,看看会发生什么:

从输出中可以看到,每个函数调用都将指向同一个对象。这不是我们想要发生的!

重复使用对象的原因

让我们来搞清楚这种行为。如果我们试图访问函数外部的变量,Python 会返回一个 NameError 。这表明变量作用域按预期工作。然而,该值必须在某处可用;否则,Python 无法在第二次函数调用期间添加键。

让我们再深入一层。下面是同一函数的调整版本,它也返回字典的内存地址:

如果我们查看结果,我们可以看到两个调用都引用了内存中的同一个对象。我们也能够直接从内存中提取值。总之,我们不能通过变量访问这个值,但是它在内存中是安全可靠的。那么,让它活下去的隐藏引用在哪里呢?

答案在于 Python 加载函数的方式。也就是说,每当 Python 第一次加载一个函数时,它也会创建对其默认值的引用。也就是说,对函数的引用隐藏了对字典的引用。

如何防止这种行为

为了防止这种不必要的行为,我们需要将引用的创建转移到函数本身中。这确保了每个函数调用都使用新的引用而不是旧的引用。修改后的函数如下所示:

如您所见,现在每个函数调用都指向另一个内存地址。这些对象不再相互干扰。

这是一个针对较小主题的新“快速修复”格式的实验。让我知道你对它的看法,在评论中或者在推特上。我也很乐意在 LinkedIn 上联系。感谢您的阅读!

两个月的监督机器学习课程,包含在两个图表中

原文:https://towardsdatascience.com/2-months-of-supervised-machine-learning-curriculum-in-2-charts-259970e38a63?source=collection_archive---------31-----------------------

这是我希望在数据科学训练营时拥有的参考表

我目前正在 Thinkful.com 参加一个数据科学训练营。到目前为止,我真的很喜欢它,但当我通过监督的机器学习单元时,我有时会被模型的数量(以及何时/如何使用每个模型)淹没。因此,在 Thinkful 课程、Scikit-Learn 文档和我出色的数据科学导师( Abdullah Karasan )的帮助下,我制作了这些摘要图表供我参考,也帮助其他人学习。

下面的第一个图表概述了何时使用各种机器学习模型。当然,还有更多的模型,但我试图涵盖所有的大模型。

在选择了要尝试的模型之后,我会不断地查阅过去的 Jupyter 笔记本或 scikit-learn 文档。因此,当您在 Python 中实现这些模型时,下面的图表是一个快速参考表。

添加一些交叉验证,matplotlib 可视化,然后嘭!你正在完成一个完整的项目。

当我有一些空闲时间时,我也在考虑制作一个“你是哪个机器学习模型?” BuzzFeed 风格的测验,适合我所有的数据科学爱好者,敬请关注。*

如果这些图表中有你不同意或想补充的内容,请在下面评论或给我发消息!感谢您的阅读,如果您发现这是一个有用的资源,请与您认识的正在学习数据科学的其他人分享。

感谢 canva.com 为这些图片提供模板

*编辑:我没有设计测验,但我写了一篇关于它的有趣的短文:

[## 你是哪个机器学习模型?

对一些经典模型如何工作的轻松、诙谐、非科学的描述

towardsdatascience.com](/which-machine-learning-model-are-you-7ac635101d3b)

2-PCA 与 3-PCA

原文:https://towardsdatascience.com/2-pca-vs-3-pca-1bb33dfc3a2b?source=collection_archive---------46-----------------------

拥有三个主成分比拥有两个主成分更有成效吗?

主成分分析用于减少数据集中的维度(特征)数量。比方说,我们的数据集中有 10 个维度/特征。基于一个假设(或胡乱猜测)放弃 7-8 个特性并不是一个明智的做法。解决这个问题的一种方法是特征选择技术(比如卡方检验)。特征选择技术帮助我们选择对应于目标特征的最重要的“k”个特征。但同样,这不会是所有功能的整体表示(相反,它只是从“n”个功能中选择的几个功能)。

为了解决这个问题,我们采用了主成分分析(PCA)降维技术。我们将拥有的主要组件将是数据集中所有特征的总体表示。通过这种方式,可以最大限度地减少信息损失。

现在我们已经理解了 PCA 的重要性,我们将更深入地检查拥有 3 个主成分并在三维图中绘制它们是否比拥有 2 个主成分的 PCA 和一个二维图更有成效?

为了简单起见,我没有展示我所使用的数据集,而是直接展示了我在数据集上使用 PCA 技术(n=3)获得的三个主要成分。

The Principal Components are as follows
       Principal component 1  Principal component 2  Principal component 3
0                  -0.593113               0.877027               1.782426
1                  -0.582788               0.926408               0.235875
2                  -0.593406               0.885406               1.026393
3                  -0.590781               0.913825               1.057599
4                  -0.557457               1.003013               0.771994
5                  -0.590091               0.892999               1.754761
6                  -0.532054               1.071892               0.614311
7                  -0.600141               0.873119               1.374094
8                  -0.604967               0.862305               1.689937
9                  -0.590725               0.910980               1.151600
10                 -0.571536               0.955599               1.269035
11                 -0.612102               0.921839               0.601810
12                 -0.638983               1.028594              -0.658701
13                 -0.538442               1.069557              -0.315858
14                 -0.545885               1.042621              -0.439177
15                 -0.213216              -1.068956               1.624847
16                 -0.585643               0.958585               0.566338
17                 -0.528046               1.081252               0.814836
18                 -0.586254               1.015987               0.560427
19                 -0.588309               0.893676               1.748155
20                 -0.545498               1.042484               0.044207
21                 -0.525951               1.099272              -0.239815
22                 -0.545391               1.036316               0.249829
23                 -0.553054               1.015097               1.361015
24                 -0.549921               1.043496              -0.028772
25                 -0.541706               1.044087               0.500173
26                 -0.580348               0.927584               0.693961
27                 -0.565069               0.983091              -0.060931
28                 -0.569777               0.958700               0.706427
29                 -0.572816               0.956895               0.263877
...                      ...                    ...                    ...
38991               4.154215               0.411276               2.074023
38992              -0.405145              -0.943906              -0.979199
38993              -0.294493              -0.724124               0.182590
38994               0.946546              -0.426986              -2.315427
38995               3.755563               0.385886              -2.343638
38996               1.362237              -0.325860               0.135436
38997               3.085934               0.127931               0.233758
38998               5.803189               0.739613              -0.598750
38999               4.126051               0.320192              -1.142892
39000               5.285017               0.732141              -2.113228
39001               4.235777               0.488489              -2.422174
39002               5.337110               0.681343              -1.865339
39003               2.046786              -0.255520               0.512485
39004               6.575937               1.052580               0.414128
39005              -0.549162              -0.773501              -0.453899
39006              -0.489873              -0.747580              -2.543332
39007              -0.403737              -0.943530              -0.979133
39008               5.632072               0.761396              -1.419298
39009               1.532861              -0.252514              -1.259331
39010               0.283742              -0.684903              -0.729878
39011              13.207580               2.725922               0.237523
39012              -0.558653              -0.799741              -0.618546
39013              -0.734531              -0.815442               0.755882
39014              -0.563215              -0.746943              -1.349881
39015              -0.600636              -0.858194              -1.319464
39016               1.536320              -0.299190              -0.164502
39017              -0.553627              -0.785324              -0.576759
39018              -0.554424              -0.957772              -0.897795
39019              -0.744299              -0.842957               0.631088
39020              -0.558107              -0.957167              -1.901427

你可以看到我有 39020 个元组。让我们也看看三个主要成分的方差比。

The Variance Ratios are
[0.24679625 0.16479195 0.15822251]

让我们想象一下****你习惯于只有两个分量的主成分分析,而你的分析中没有第三个分量。这意味着在我们的场景中,您只有前两个主要组件。好吧!让我们画出前两个主要部分。

图 1,双组分五氯苯甲醚(由作者绘制)

考虑到在数据集中寻找聚类是我们的主要目标,那么我们可以从上面的图(图 1)中清楚地看到,没有明显的聚类出现。这意味着,双组分 PCA 现在未能满足我们的期望。

好吧,三组分主成分分析能完成吗?为什么要怀疑呢,现在让我们通过绘制所有三个组件来检查一下。

图 2,三组分五氯苯甲醚(角度 1)(作者绘制)

但是同样,我无法在图中找到任何这样的集群。我们现在要做的是尝试沿着所有三个轴旋转这些图,并尝试从中找到一些洞察力。

****

图 3,三组分五氯苯甲醚(角度 2 和 3)(作者绘制)

瞧啊。从上面的图(图 3)中,我可以得出结论,在我的数据集中有两个可能的集群。假设我的数据集是对学校学生的调查,主要谈论他们使用笔记本电脑和手机,那么很明显,我可以看到有两个独立的学生群体,我们现在可以继续进一步分析这一断言,即一个大的学生群体和一个小的学生群体出现在数据集中,前者或后者更习惯使用笔记本电脑或手机。

为什么三分量主成分分析比两分量主成分分析能给我们更多的启示?检查一下我们得到的方差比。仅考虑前两个因素时,比率合计约为 0.4 (40%)。也就是说,前两个部分加在一起只占全部数据的 40%。但是当我们把三个比例都加起来,大概在~0.55 左右(55%)。数据集要素整体表示的百分比明显更高。

总之,当两个方差比率的总和非常低,并且该图没有给我们任何洞察力时,那么使用第三个主成分是非常有效的。当甚至 3-PCA 都不能给我们洞察力时,那么考虑其他降维技术是一个更好的选择。在我的另一个分析中,仅使用第一个主成分(0.99 方差比),可以从图中获得有意义的见解。(链接:https://towards data science . com/an-insight-into-performance-fundamental-data-analysis-9c 67 c 62 e 0766)。因此,方差比在确定我们用来绘图的主成分数时起着非常重要的作用。

感谢您的宝贵时间!如果你喜欢这个故事,一定要和你的朋友分享。

可以在LinkedIn上关注我。再次感谢您!****

训练深度学习模型时使用 MixUp 增强的 2 个理由

原文:https://towardsdatascience.com/2-reasons-to-use-mixup-when-training-yor-deep-learning-models-58728f15c559?source=collection_archive---------7-----------------------

为您的培训渠道增加新功能的绝佳机会!

https://unsplash.com/photos/lvhu6dlFyLs

介绍

早在 2018 年,在这篇论文中就介绍了 MixUp 的想法,并立即被许多 ML 研究人员引入管道。MixUp 的实现非常简单,但是它仍然可以为您的模型性能带来巨大的好处。

混合可以用这个简单的等式来表示:

newImage = alpha * image1 + (1-alpha) * image2

这张新图片只是你训练集中两张图片的简单混合,就这么简单!那么,新图像的目标值是什么呢?

newTarget = alpha * target1 + (1-alpha) * target2

这里重要的是,你并不总是需要一个热编码你的目标向量。如果你不做一个酒店编码,将需要自定义损失功能。我将在实现部分更深入地解释它。

这是混音增强的输出。在这种情况下,我将 alpha=0.3,并将狗和猫的图像混合在一起。

那么,如果你还没有在你的增强方法中使用它,你为什么要尝试这种混合的想法呢?

1。正规化

MixUp 非常擅长为计算机视觉任务正则化 ML 模型。正如创作者在这里所说的,你可以在单个 GPU 上训练 DNN 6 分钟,仍然可以在 CIFAR 10 数据集上获得 94%的准确率!此外,如果您使用 melspectrogram 这样的东西作为模型输入,您甚至可以将这种类型的增强嵌入到声音管道中。

2。简单快速

正如我在上面所说的,MixUp 概念很容易掌握,但是,你应该小心实现步骤,这将在下面描述。在速度方面,该方法的创造者在他们的实验中遇到了一些问题,但成功解决了,这使得这种增强类型真的很快。

混合实施

在真实世界场景中,MixUp 将编码如下:

  1. 取一批训练数据。
  2. 来自贝塔分布的样本混淆阿尔法值。(非常高的概率α接近 0 或 1)

3.打乱您的训练数据批次,以获得原始批次中图像的配对图像。

4.应用图像对的混合公式。

这个方法的创建者也提供了一个 PyTorch 兼容的回调和丢失,用于模型训练。

万一你想掌握你的 PyTorch 编码技巧(在创建回调、自定义损耗和自定义管道方面),特别是计算机视觉应用,我强烈推荐这本书开始你的旅程。这对我帮助很大。

总结

我个人在任何可能的时候都使用并继续使用这个增强概念,并且在使用它的时候,我不断地得到模型性能的提升。希望你会发现这个概念对你自己也有帮助。

2020 年云原生开发的 20 个最佳 Visual Studio 代码扩展

原文:https://towardsdatascience.com/20-best-visual-studio-code-extensions-for-cloud-native-development-in-2020-e0358e50ba87?source=collection_archive---------16-----------------------

借助这些 VS 代码扩展,改善您的云原生开发体验和生产力

托德·夸肯布什在 Unsplash 上的照片

在过去的几年里,我们看到了云原生软件开发的快速增长。根据 Canalis insights 的数据,2020 年全球云服务在 Q1 实现了 34%的增长。在后 COVID 时代,企业将会以更快的速度采用云计算。因此,无论您是否正在积极从事云原生项目,看看 2020 年的云原生开发都是一个不错的主意。

作为一名软件工程师,我更喜欢使用现代的 IDE。最重要的是,现代 IDE 帮助我专注于创造性的任务(例如,编码),并带走大量重复、乏味的任务。此外,它们帮助我通过使用一个工具来保持我的注意力,并且减少我大脑昂贵的上下文切换。2016 年刚开始做 AWS 云的时候,我错过的一件事就是开发者体验,也就是缺乏 IDE 支持。如果我需要测试我的 Lambda 函数,唯一的方法就是部署在 AWS 上。

幸运的是,随着以 Azure 为首的云提供商越来越关注 IDE 对云原生开发的支持,事情在过去几年发生了巨大的变化。有几个优秀的 IDE,如 VS Code、JetBrains IDE 或 AWS Cloud 9 ,它们提供了优秀的云原生开发者体验。

在这篇文章中,我将主要关注云原生开发的 VS 代码。

为什么 VS 代码

如果考虑软件开发的各个领域, VS 代码是排名第一的开源免费 IDE 。微软已经在 2015 年开发并发布了 VS 代码。由于其强大的功能和先进的开发人员体验,它很快就吸引了软件开发人员社区。2019 年堆栈溢出开发者调查将 VS 代码列为最受欢迎的 IDE:

来源:栈溢出开发者调查

与其他强大的 IDE (Eclipse 或 IntelliJ IDEA)相比,VS 代码使用了更少的内存和 CPU。VS 代码还提供了额外的特性,比如通过扩展进行云原生开发。另一个重要因素是微软正在开发 VS 代码和 Azure 云服务。因此,VS 代码为 Azure 云开发提供了最佳的开发者体验。

这里我将列出 20 个优秀的云原生开发 VS 代码扩展,以及重要的云原生服务的 30000 英尺概述。

1.码头工人

Google 在内部使用容器技术时,Docker 是第一个开源的颠覆性容器化技术,它彻底改变了软件交付/软件部署的格局。此外,容器化是云原生开发的支柱,Docker 是目前排名第一的容器技术。Docker 的另一个强大功能是,您可以使用几乎所有软件(如数据库、应用程序)的 dockered 版本,而无需直接安装它们,从而保持您的工作机器整洁。

Docker 为容器管理提供了强大的 CLI,例如安装容器、在容器中交付软件以及许多其他功能。如果您和我一样喜欢使用 UI 来管理容器,那么您可以使用 Docker 扩展来全面了解 Docker 环境,并可以通过 UI 执行所有的 Docker 操作。一旦我知道了这个扩展,我就很少使用 CLI 进行 Docker 操作。

链接:

[## Docker — Visual Studio 市场

Docker 扩展使得从 Visual Studio 代码构建、管理和部署容器化的应用程序变得容易。它…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)

2.库伯内特斯

如果你认为 Docker 是云原生开发的核心组件,那么 Kubernetes 就是云原生开发的操作系统。简而言之,Kubernetes 就是容器编排和容器管理系统。最初,公共云市场由亚马逊 AWS 服务主导,该服务使用专有技术。Kubernetes 正在引领云原生计算再次开源,并得到所有主要公共云提供商的大力支持。

Kubernetes 还附带了一个 CLI,它提供 Kubernetes 集群的部署、运行和管理。Kubernetes VS Code extension 还提供了 Kubernetes 集群的 360 度视图,包括名称空间、节点、工作负载、网络、存储和配置。它还概述了注册的 Cloud Kubernetes 服务和连接的 Helm 存储库。

链接:

[## Kubernetes — Visual Studio 市场

该扩展适用于开发人员构建在 Kubernetes 集群中运行的应用程序,也适用于 DevOps 人员的故障排除…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-kubernetes-tools.vscode-kubernetes-tools)

3.AWS 工具包

亚马逊 AWS 是目前最大的云提供商。随着 AWS 不断创新,它将在未来几年继续主导云原生环境。AWS 有自己基于浏览器的云原生 IDE Cloud9 ,为 AWS 开发提供了最好的开发体验。不幸的是,IDE 对于 AWS 开发来说是一个优秀的工具,但对于通用软件开发或多云开发来说却不是。

幸运的是,亚马逊还提供了一个 VS 扩展“AWS 工具包”,可以与许多 AWS 服务进行交互,并提供出色的开发者体验。它提供了每个区域的云形成、Lambda、阶跃函数和模式的简要概述。如果你使用 AWS CDK 开发,这个扩展给 CDK 浏览器。它还在 VS 代码命令面板中提供了 AWS 命令。如果您使用 AWS,这是一个必备的扩展。

链接:

[## AWS 工具包— Visual Studio 市场

AWS 工具包,或简称工具包,是一个扩展,使您能够与亚马逊的某些服务进行交互…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)

4.节点的 AWS Lambda 样板代码片段。射流研究…

亚马逊通过引入 AWS Lambda 彻底改变了软件开发的格局。它引入了“无服务器”计算,开发人员只需编写代码,AWS 负责部署和扩展。此外,AWS Lambda 还推出了“按使用付费”原则,即用户仅在使用 AWS Lambda 时付费。虽然你可以用任何流行的编程语言写 Lambda,Node。JS 因其轻量级的特性和更快的启动时间而在这一领域非常受欢迎。

这段 VS 代码提供了许多片段,这样您就可以专注于编写实际的业务代码,而 VS 代码会处理单调的样板代码。

链接:

[## 节点的 AWS Lambda 样板代码片段。JS — Visual Studio 市场

Visual Studio 代码的扩展—节点的简单样板 AWS Lambda 函数。射流研究…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=loganarnett.lambda-snippets)

5.Azure 帐户

微软 Azure 是目前第二大公共云提供商,也是去年增长最快的云提供商。微软在其各种产品(例如,Visual Studio)中注重开发人员体验的历史由来已久。NET,VS 代码)。难怪微软非常重视通过在 VS 代码中实现各种云原生扩展来提供优秀的云原生开发体验。

Azure Account 是为所有 Azure VS 代码扩展提供单一 Azure 登录和订阅过滤的 VS 代码扩展。它在 Visual Studio 命令面板中添加了许多 Azure 登录和订阅命令。还在 VS Code 的集成终端中增加了 Azure 云壳服务。

链接:

[## Azure 帐户— Visual Studio 市场

Azure 帐户扩展为所有其他 Azure 提供了单一的 Azure 登录和订阅过滤体验…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account)

6.Azure CLI 工具

有时候,记住所有的 Azure CLI 命令会让人不知所措。因此,我习惯于将命令保存在一个单独的文本文件中。Azure CLI 工具扩展通过提供剪贴簿来开发和运行 Azure CLI 命令,使生活变得更加轻松。你只需要添加一个文件。azcli 扩展,这个扩展将帮助你使用 Azure CLI 完成几乎所有的功能。它提供了智能感知命令、命令片段、运行命令、显示命令文档等等。

链接:

[## Azure CLI 工具— Visual Studio 市场

使用 Azure CLI 开发和运行命令的剪贴簿。创造。azcli 文件并使用这些功能…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azurecli)

7.蓝色仓库

如果你使用的是 Azure DevOps,那么这个 VS 代码扩展会非常适合你。它提供了与 Azure DevOps 的连接,监控你的构建,管理 pull 请求,并与 Git 源代码库一起工作。如果您使用集中式 Team Foundation 版本控制,那么此扩展将有助于您使用它。

链接:

[## Azure Repos — Visual Studio 市场

此扩展允许您连接到 Azure DevOps 服务和 Team Foundation Server,并为 Team…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-vsts.team)

8.Azure 函数

Azure Functions 是来自 AWS Lambda 等 Azure 云平台的无服务器或 FaaS 产品。这个 VS 代码扩展使开发者能够直接从 VS 代码中创建、调试、管理和部署 Azure 功能。如果你使用 Azure Cloud,这个扩展将为你节省大量的时间和精力。

链接:

[## Azure 函数— Visual Studio 市场

使用 Azure Functions 扩展直接从 VS 代码快速创建、调试、管理和部署无服务器应用程序…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions)

9.Azure 应用服务

Azure App Service 是 Azure 的完全托管的 PaaS,用于构建、部署和扩展 web、移动和 API 应用。有了这个扩展,你可以在 Azure Cloud 上创建、管理和部署 Azure 应用。

链接:

[## Azure 应用服务— Visual Studio 市场

App Service 是 Azure 的完全托管的平台即服务(PaaS ),让您可以部署和扩展 web、移动和 API…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice)

10.Azure 数据库

Azure 还提供了各种托管数据库: Azure SQL 数据库,托管实例的 Azure 数据库,Azure Cosmos DB 。它还提供了许多来自 Azure marketplace 的其他流行数据库,如 Gremlin(图形数据库)、MongoDB(文档数据库)。你可以对不同种类的数据库使用不同的工具,或者使用 Azure Databases 扩展,通过使用剪贴簿来管理和查询你的本地/云数据库。另外,这些扩展还提供了智能感知和特定于数据库的特性(例如,Graph for Gremlin)。

链接:

[## Azure 数据库— Visual Studio 市场

使用具有丰富智能感知的剪贴簿,在本地和云中浏览和查询您的 Azure 数据库…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-cosmosdb)

11.Azure 资源管理器(ARM)工具

Azure Resouce Manager 是 Azure 上完全托管的“基础设施即代码”平台。这个 VS 代码扩展通过提供大量的功能,包括语言支持、代码片段、资源自动完成,使得使用 ARM 工具更加容易。因此,创建和验证 Azure 资源管理器模板对开发者有很大帮助。

链接:

[## Azure 资源管理器(ARM)工具— Visual Studio 市场

Azure Resource Manager(ARM)Tools for Visual Studio 代码提供了语言支持、资源片段和…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools)

12.Azure 存储

Azure 存储帐户是存储数据对象的托管集合:blobs、文件、队列、表和磁盘。通过这个 VS 代码扩展,你可以浏览 Azure Blob 容器、文件共享、表格和队列,并且可以直接将静态网站和单页面应用(spa)部署到 Azure Blob 中。

链接:

[## Azure 存储— Visual Studio 市场

Azure Storage 是微软管理的服务,提供高度可用、安全、持久的云存储…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage)

13.云代码

虽然谷歌云平台(GCP) 目前落后于 AWS 和 Azure,但它也提供一些优秀的云服务,尤其是在机器学习/AI 方面。如果你是一名学生或开发者,想要在云计算方面有一些实践经验,那么 GCP 提供 12 个月的 300 美元免费信贷

GCP 还提供了一个 VS Code 扩展云代码,可以快速轻松地编写、运行和调试云原生应用。与 AWS 一样,与 Azure 不同,它也是一个伞状扩展,提供了许多功能。

它提供 Kubernetes 来管理本地 Kubernetes 集群或 GKE Kubernetes 集群。还提供了云跑来创建和部署云跑 App。最后但同样重要的是,它提供了云 API 来访问和启用所有 Google 云 API,在您的项目中添加云客户端库。如果你正在使用 GCP,这也是一个必须具备的扩展。

链接:

[## 云代码— Visual Studio 市场

面向 VS Code 的云代码扩展了 VS Code,将 ide 的所有功能和便利用于开发云原生…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=GoogleCloudTools.cloudcode)

14.哈希公司地形

如果你在一个多云场景中工作,那么你可能已经使用过 Terraform 。尽管公共云提供商有自己的“基础设施即代码”服务,但您应该使用供应商中立的“基础设施即代码”来避免供应商锁定。由 HashiCorp Inc. 开发的 Terraform 是云计算环境中最流行的“基础设施代码”。

Terraform 有自己的配置语言来定义配置文件。这个 VS 代码扩展将帮助你有效地使用 Terraform 配置文件。它提供了语法高亮、快捷方式、右括号和引号。

链接:

[## hashi corp terra form—Visual Studio 市场

hashi corp Terraform Visual Studio Code(VS Code)扩展增加了语法突出显示和其他编辑功能,适用于…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform)

15.Cloudfoundry 清单 YML 支持

Kubernetes 是底层容器编排框架。但是在企业中,您将使用一些高级 PaaS 来管理您的 Kubernetes 集群。目前,用于管理 Kubernetes 的两个 PaaS 系统是流行的和广泛使用的: Cloud Foundry 和 OpenShift 。和其他很多云原生系统一样,Cloud Foundry 也使用 YML 进行配置。这个 VS 代码扩展为 Cloud Foundry 配置提供了一些必要的特性:验证、内容辅助、悬停信息。

链接:

[## Cloudfoundry 清单 YML 支持— Visual Studio 市场

该扩展为编辑 Cloud Foundry 清单文件提供了基本的验证、内容帮助和悬停信息。你…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-manifest-yaml)

16.YAML

在云原生开发中,您必须处理 YAML 文件。无论您是编写 Docker compose 文件、Kubernetes 配置文件、Helm chart 还是公共云模板文件,YAML 无处不在。YAML 文件的一个警告是,它是空间敏感的。幸运的是,VS 代码有很好的扩展,使得使用 YAML 更加容易。它提供了代码自动完成、YAML 验证、自动格式化程序和许多其他功能。它还内置了对 Kubernetes 语法的支持。

链接:

[## YAML — Visual Studio 市场

通过 yaml 语言服务器为 Visual Studio 代码提供全面的 YAML 语言支持,内置…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)

17.虚拟代码-图标

云原生开发意味着你必须处理不同类型的文件:特定于编程语言的文件、Docker 文件、各种 YAML 文件、JSON 文件以及许多其他类型的文件。你知道不同的文件类型可以有漂亮的图标吗?如果您安装了这个扩展,那么您就可以根据文件扩展名对不同的文件类型进行出色的可视化展示。530 万下载量,是必备的 VS 代码扩展之一。

链接:

[## vscode-icons — Visual Studio 市场

将图标添加到您的 Visual Studio 代码中(支持的最低版本:1.31.1)要安装该扩展,只需执行…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons)

18.吉特朗斯

Git 无疑是现代软件开发中使用最多的 VCS 系统。不管你是为你的公司开发还是在你的私人项目中工作,你可能都在使用 Git。虽然 Git 提供了大量的命令集来执行任务,但我更喜欢 Git 的 UI。

市场上有一些优秀的 Git UI 工具(例如 SourceTree),但是使用这些工具会引入上下文切换。GitLens 不仅在 VS 代码中提供了出色的 UI 支持,而且它还将 Git UI 功能提升到了一个新的水平。这个扩展提供了 Git 工作流的 360 度视图,并在一个小视图中提供了所有的 Git 功能。

链接:

[## GitLens — Git 增压— Visual Studio 市场

Visual Studio 代码扩展—增强内置于 Visual Studio 代码中的 Git 功能—可视化代码…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)

19.Visual Studio 智能代码

如果你正在使用 Gmail,你可能已经使用了人工智能辅助的邮件自动完成功能。我发现人工智能打字很有帮助,节省了我的时间。你知道 VS 代码里也有 AI 辅助的代码自动完成扩展吗?有了 Visual Studio IntelliCode 扩展,你可以拥有许多重要编程语言(例如,TypeScript/JavaScript、Python、Java)的人工智能辅助开发特性。虽然有一些其他的人工智能辅助开发扩展,但我认为这是最好的。

链接:

[## Visual Studio intelli code—Visual Studio 市场

Visual Studio 代码的扩展—人工智能辅助开发

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)

20.代码运行程序

在您的云原生开发期间,您需要运行您的代码或代码片段。此外,您可能对特定的 Shell 有偏好。这个 VS 代码扩展提供了在各种 shell 中运行几乎所有主流编程语言的代码或代码片段的可能性。下载量超过 400 万,也是最受欢迎和必备的 VS 代码扩展之一。

链接:

[## 代码运行器— Visual Studio 市场

Visual Studio 代码扩展—运行 C、C++、Java、JS、PHP、Python、Perl、Ruby、Go、Lua、Groovy、PowerShell、CMD…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)

类似文章:

[## 2020 年高效 Web 开发的 20 个最佳代码扩展

Visual Studio 代码扩展可以提高您的工作效率,并使编码变得更加有趣

towardsdatascience.com](/20-best-vs-code-extensions-for-productive-web-development-in-2020-95bf904ceb69) [## 2020 年最受欢迎的 10 种编程语言

针对求职者和新开发人员的顶级编程语言的深入分析和排名

towardsdatascience.com](/top-10-in-demand-programming-languages-to-learn-in-2020-4462eb7d8d3e) [## 关于 2020 年软件发展趋势的 20 个预测

云、容器、编程、数据库、深度学习、软件架构、Web、App、批处理、流、数据湖…

towardsdatascience.com](/20-predictions-about-software-development-trends-in-2020-afb8b110d9a0)

2020 年高效 Web 开发的 20 个最佳代码扩展

原文:https://towardsdatascience.com/20-best-vs-code-extensions-for-productive-web-development-in-2020-95bf904ceb69?source=collection_archive---------4-----------------------

Visual Studio 代码扩展可以提高您的工作效率,并使编码变得更加有趣

照片由来自 Pexels金·斯蒂弗拍摄

作为一名软件工程师,我喜欢让专注于创造性的任务(例如编码),并希望在 IDE 的帮助下利用单调乏味、重复的任务。现代 ide 的另一个关键但经常被忽视的特性是,它们通过为日常工作提供工具,减少了开发人员的上下文切换。

编程中的上下文切换开销很大。但是人脑的上下文切换明显比 CPU 的上下文切换代价更大。

在我的编程生涯中,我用过很多免费的( KDevelop,Eclipse,NetBeans,Atom,Sublime Text,和 VS Code )和很多商业 IDE。其中我发现 Visual Studio 代码是最好的 IDE,尤其是对于 Web 开发。它由微软在 2015 年开发,迅速崛起并受到开发者的喜爱。2019 年堆栈溢出开发者调查将 VS Code 列为最受欢迎的 Web 开发 IDE:

来源:栈溢出开发者调查

VS 代码的另一个关键特性是,与 Eclipse 或 IntelliJ IDEA 等相比,它拥有更少的内存和 CPU 占用。像许多其他 IDE 一样,VS 代码也通过扩展提供了额外的特性。就贡献者而言,VS Code 是排名第一的 GitHub 项目,它对几乎任何东西都有强大的扩展:

来源: GitHub Octoverse

这里我将为 Web 开发人员列出 20 个优秀的 VS 代码扩展。我将特别关注扩展,它将最小化其他工具的使用,从而减少上下文切换。

1.REST 客户端

如果你正在开发 Web 应用程序,那么你必须处理 REST 或者 GraphQL。我通常使用像邮差、SOAP UI 这样的工具作为 REST 客户端,直到我发现这个 VS 代码扩展。有了这个简单而强大的扩展,REST 请求或 GraphQL 查询变得非常容易。它还支持发送 cURL 命令。这样,这个扩展帮助我专注于只使用 VS 代码,并减少切换到其他工具,如 Postman。

链接:

[## REST 客户端— Visual Studio 市场

Visual Studio 代码的扩展—Visual Studio 代码的 REST 客户端

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)

2.JavaScript (ES6)代码片段

有多少次你不得不一遍又一遍地输入相同的代码?幸运的是,VS 代码以代码片段的形式提供了一个解决方案。代码片段有助于极大地减少键入相同的代码,从而有时间关注真正的代码。

JavaScript (ES6)代码片段提供了 ES6 语法的代码片段。

链接:

[## JavaScript (ES6)代码片段— Visual Studio 市场

Visual Studio 代码扩展 ES6 语法的 JavaScript 代码片段

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=xabikos.JavaScriptSnippets)

3.埃斯林特

ESLint 是一个静态代码分析器,可以分析并快速发现代码中的问题。ESLint 中的规则是可配置的,并且可以定义和加载定制规则。ESLint 涵盖了代码质量编码风格问题。另外,ESLint 还可以修复这些问题。这个扩展与 VS 代码无缝集成。

链接:

[## ESLint - Visual Studio 市场

Visual Studio 代码扩展——将 ESLint JavaScript 集成到 VS 代码中。

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)

4.括号对着色机

处理支架是一种痛苦的经历。尤其是如果您有带有许多嵌套回调的遗留 JavaScript 代码(末日金字塔),那么管理括号可能是一项艰巨的任务。很多时候,我只是删除了一行括号,并投入了一些时间来修复括号问题。幸运的是,这个小小的扩展可以通过给匹配的括号着色来极大地帮助你管理括号。

链接:

[## 括号对着色程序— Visual Studio 市场

这个扩展允许用颜色来标识匹配的括号。用户可以定义匹配哪些字符…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)

5.自动关闭标签

这个扩展很方便,尤其是编写 HTML 代码。一旦您编写了 HTML/XML 标记,这个扩展就消除了繁琐的任务并自动关闭标记。

链接:

[## 自动关闭标记— Visual Studio 市场

Visual Studio 代码的扩展—自动添加 HTML/XML 结束标记,与 Visual Studio IDE 或 Sublime 文本相同

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag)

6.自动重命名标签

“自动重命名标签”是 Web 开发的另一个必备扩展。有多少次你重命名了一个标签,却希望另一个标签自动重命名?多亏了这个扩展,每当您重命名一个开始/结束标签时,另一个标签也会自动被重命名。

链接:

[## 自动重命名标记— Visual Studio 市场

Visual Studio 代码的扩展—自动重命名成对的 HTML/XML 标记

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)

7.代码拼写检查器

“代码拼写检查器”是一个方便的扩展,对母语和非母语的英语人士都适用。你是否曾经面临过同事仅仅因为愚蠢的拼写错误而指出或重命名你的代码的尴尬局面?幸运的是,有了这个扩展,当出现拼写错误时,您会得到警告。

链接:

[## 代码拼写检查器— Visual Studio 市场

Visual Studio 代码的扩展—源代码的拼写检查

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)

8.虚拟代码-图标

Web 项目通常有很多种类型的文件:HTML、CSS、JavaScript、JSON 以及许多其他类型的文件。你知道不同的文件类型可以有漂亮的图标吗?如果您安装了这个 vscode-icons,那么您就可以根据文件扩展名对不同的文件类型有一个很好的可视化表示。530 万次下载,是下载量最大的 VS 代码扩展之一。

链接:

[## vscode-icons — Visual Studio 市场

将图标添加到您的 Visual Studio 代码中(支持的最低版本:1.31.1)要安装该扩展,只需执行…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons)

9.将 JSON 粘贴为代码

在 Web 开发中,通常要和 API 打交道。无论您开发的是客户机还是服务器,您经常会得到一个 JSON 数据结构,并需要从该 JSON 数据开发类。通过“将 JSON 粘贴为代码”,您可以轻松地从 JSON 数据结构中生成 JavaScript、TypeScript 类。因此,您可以省去从 JSON 数据手动生成代码的繁琐工作。这个扩展为 TypeScript、JavaScript 和几乎所有流行的编程语言提供了代码生成。

链接:

[## 将 JSON 粘贴为代码— Visual Studio Marketplace

从 JSON、JSON Schema 和 TypeScript 中交互式地生成类型和(反)序列化代码粘贴 JSON/JSON…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=quicktype.quicktype)

10.码头工人

Docker 是颠覆性的容器化技术,它彻底改变了软件交付/软件部署的格局。作为一名 Web 开发人员,您可能还需要在 Docker 容器中交付代码。Docker 的另一个便利特性是,你可以使用几乎所有软件的 Dockerized 版本(例如,数据库、Kafka ),而无需直接安装它们,从而保持你的工作机器整洁。

Docker 提供了一个 CLI 来执行所有的操作,例如安装容器、在容器中交付软件以及许多其他功能。或者,您可以使用 Docker 扩展对您的 Docker 环境进行 360 度的概述,并可以通过 UI 执行所有的 Docker 操作。一旦我知道了这个扩展,我就很少使用 CLI 进行 Docker 操作。

链接:

[## Docker — Visual Studio 市场

Docker 扩展使得从 Visual Studio 代码构建、管理和部署容器化的应用程序变得容易。它…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)

11.项目管理人

作为一名开发人员,您通常需要同时处理多个项目。你知道吗,通过这个扩展,你可以更好地管理你的项目,而不是从一个文件夹中打开不同的项目。它为你的项目增加了额外的边栏。您可以从 Git/Folder 中自动检测项目,在具有此扩展名的项目之间切换。它还通过远程项目选项使远程工作变得更加容易。

链接:

[## 项目经理— Visual Studio 市场

添加一个全新的侧栏支持远程开发支持支持从本地安装打开远程项目添加…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager)

12.Visual Studio 智能代码

或许你已经注意到,当你在 Gmail 中撰写电子邮件时,你会得到人工智能辅助的邮件自动完成功能。你知道 VS 代码里也有 AI 辅助的代码自动完成扩展吗?有了 Visual Studio IntelliCode 扩展,你就可以拥有人工智能辅助开发 TypeScript/JavaScript、Python、Java 的特性。虽然有一些其他的人工智能辅助开发扩展,但我认为这是最好的。

链接:

[## Visual Studio intelli code—Visual Studio 市场

Visual Studio 代码的扩展—人工智能辅助开发

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)

13.Quokka.js

当我需要在 JavaScript 中测试一小段代码时,我通常在 Chrome/Firefox 控制台中完成。但是有一次我用 Quokka 试了一下,就爱上了这个扩展,放弃了主机。对于 TypeScript 和 JavaScript 代码来说,这是一个非常现代和灵活的 Sracthpad。这一扩展引人注目,但轻量级,并通过在您最喜爱的浏览器中提供 Scrathpad 功能来提供 Zen 模式开发。

链接:

[## Quokka.js — Visual Studio 市场

Visual Studio 代码的扩展 JavaScript 的实时暂存。

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=WallabyJs.quokka-vscode)

14.实时服务器

Web 开发过程中另一项非常枯燥乏味的任务是,当您更改代码时,需要刷新浏览器才能看到更改的效果。“Live Server”扩展可以在发生变化时自动刷新浏览器,从而极大地帮助您。因此,它既能给你带来开发的乐趣,又能提高生产率。Live Server 是另一个扩展的瑰宝,也是 Web 开发人员的必备之物。

链接:

[## 实时服务器— Visual Studio 市场

对不起,但是我现在非常忙。如果你想成为项目的维护者,欢迎随时联系我!你已经…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)

15.吉特朗斯

多年来,Git 已经成为“头号”VCS 系统。无论你是为你的公司开发还是从事你的私人项目,你都必须使用 Git。尽管 Git 提供了大量的命令集来执行任务,但我总是更喜欢 Git 的一些 UI。现在,Git Lens 已经将 Git UI 功能提升到了一个新的水平。这个扩展提供了 Git 工作流的 360 度视图,并在一个小视图中提供了所有的 Git 功能。此外,该工具减少了您的上下文,在 VSCode 和其他 UI 工具或 CLI 之间切换,使您更有效率。

链接:

[## GitLens — Git 增压— Visual Studio 市场

Visual Studio 代码扩展—增强内置于 Visual Studio 代码中的 Git 功能—可视化代码…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)

16.代码运行程序

在开发过程中,您需要运行您的代码或代码片段。此外,您可能对特定的 Shell 有偏好。Code Runner 提供了在各种 shell 中运行几乎所有主流编程语言的代码或代码片段的可能性。下载量超过 400 万次,它也是最受欢迎的 VS 代码扩展之一,深受开发人员的喜爱。

链接:

[## 代码运行器— Visual Studio 市场

Visual Studio 代码扩展—运行 C、C++、Java、JS、PHP、Python、Perl、Ruby、Go、Lua、Groovy、PowerShell、CMD…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)

17.较美丽

如果您在团队中工作,拥有一致的代码格式是至关重要的。当您有不一致的代码格式时,这是非常令人沮丧的,这可能导致低可读性和更难的版本控制。幸运的是,有一个优秀的 VS 代码扩展可以处理代码格式:更漂亮。它通过解析您的代码并根据自己的规则(考虑到最大行长度,必要时换行)重新打印代码来强制执行一致的风格。此外,它支持用于 Web 开发的所有类型的文件。

链接:

[## 更漂亮—代码格式化程序— Visual Studio 市场

Visual Studio 代码的扩展—使用更漂亮的代码格式化程序

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

18.路径智能

如果你从事后端开发,那么你必须处理文件。通常,文件操作期间的另一个上下文切换任务是访问实际的文件路径,复制它,并将其粘贴到 VSCode 中。“路径智能”扩展名可以在您键入时自动完成文件路径。这是另一个深受开发者喜爱的便捷扩展(300 万次下载)。

链接:

[## 路径智能感知— Visual Studio 市场

Visual Studio 代码扩展—自动完成文件名的 Visual Studio 代码插件

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense)

19.颜色选择器

如果你从事前端开发,你必须使用颜色。不幸的是,颜色是十六进制编码的,很难记住(至少对我来说)。所以,我没有用我的脑力去记忆那些代表颜色的十六进制数字,而是用这个 sweet VS 代码扩展来处理 CSS/SCSS 中的颜色。

链接:

[## 颜色选择器— Visual Studio 市场

帮助 GUI 生成颜色代码,如 CSS 颜色符号。还有,一个命令转换颜色来改变颜色…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=anseki.vscode-color)

20.实时 Sass 编译器

与 CSS 相比,SASS/SCSS 有很多优势,因为它们更加模块化。在现代前端开发中(如 React、Angular、Vue),SASS/SCSS 比 CSS 更受青睐。不幸的是,你的浏览器只理解 CSS,你的萨斯/SCSS 代码被转换成 CSS。当你的 SASS/SCSS 被转换成 CSS 时是什么样子的?幸运的是,这个 VS 代码扩展可以让你的生活变得更轻松,它可以将你的萨斯/SCSS 文件动态地转换成 CSS 文件,并自动在你的浏览器中给你一个应用程序或编译样式的实时预览。

链接:

[## 实时 Sass 编译器— Visual Studio 市场

如果你发现了任何漏洞或者有任何建议,请随时报告或建议我。VSCode 扩展有助于…

marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ritwickdey.live-sass)

类似文章:

[## 2021 年十大热门 Web 开发框架

针对企业和开发人员的顶级 web 开发框架的深入分析和排名

towardsdatascience.com](/top-10-in-demand-web-development-frameworks-in-2021-8a5b668be0d6) [## 2021 年十大最受欢迎的 JavaScript 库

最受欢迎的 JavaScript 库的精选列表,可以提高您的工作效率

medium.com](https://medium.com/javascript-in-plain-english/top-10-most-popular-javascript-libraries-to-use-in-2021-5da60f187992) [## 2020 年要学习的十大 JavaScript 框架

现代 JavaScript 开发中最重要的 JavaScript 框架的精选列表

towardsdatascience.com](/top-10-javascript-frameworks-to-learn-in-2020-a0b83ed3211b)

GPT-3 尝试的 20 个创意

原文:https://towardsdatascience.com/20-creative-things-to-try-out-with-gpt-3-2aacee3e2abf?source=collection_archive---------3-----------------------

包括例子和奖金

作者图片

这是一次进入机器思维的迷人旅程。我们,GPT-3 的测试者,测试了这个 NLP 的怪物,实验了语义,帮助预设和安全/风险话题,观察现象,等等。在从我们的 beta-tester 社区征求反馈后,OpenAI 将开始根据定价等级对 API 的使用进行收费。事情在向前发展,这是好的一面。

我们喜欢的 GPT 三号游乐场。图片作者。

对我来说,新的讲故事方式确实是故事中最令人惊奇的部分。我想和你们分享 GPT-3 作为一个作家的叙事能力,以及我们迄今为止所做的创造性实验。

但首先,让我们谈谈代币。因为它们决定了 GPT-3 产出的数量限制。使用这种 NLP 框架,你无法写出连贯的小说。

GPT 三号的标志是什么?

GPT-3 中的每个输出都是用令牌计算的。一个令牌不一定代表“一个字”。在 GPT-3 中有几个语言引擎,其中一些速度很快,但质量与 GPT-2 相似。
在这种情况下 1 个令牌= 50 或 75 个单词等。

达芬奇-引擎是训练最好的一个,成绩惊人,但性能较慢(相比其他)。我主要是用达芬奇模式来创造文学实验和聊天情境。以达芬奇为例,1 个 token = 1 个单词。

例如,以下是我在九月的代币:

我的令牌使用概述的屏幕截图。图片作者。

你可以在这里看到提示和完成。它确实意味着:

INPUT + OUTPUT = Token consumption per session.

你可以通过控制“响应长度”来控制完成量(见上面的操场截图)。有时,GPT-3 在使用每届会议的估计象征性或有情况之前主动决定结束发言。

但是在测试中,输出达到 2048 个令牌,内容生成停止。再说一遍,你不能写小说。但是你可以在小说文本上反复微调 GPT-3 以保持文本内部的连贯性。问题是:微调这个庞大的模型是一个耗费资源的故事。目前只有 OpenAI 可以微调(在 GPT-2 你可以自己做)。

GPT 的创意-3

正如我之前所描述的,GPT-3 的功能不仅仅是聊天机器人功能和查询自动化。

GPT 三号会讲故事。

创作能力是多方面的,令人惊讶,这使我成为一个对 GPT-3 相当有偏见的记者。我尝试了 BERT,我尝试了其他 NLP 框架,它们在语言分析、对话流和结构化自我关注方面都很棒。但是我从未见过比这更好的自由格式生成器,它可以用各种语言写出更长更连贯的文本。

在下面,我想和你分享一些创造性的方法来使用 GPT-3 来满足艺术需求——以随机的顺序。一切都是由 Playground 生成的,我不使用 API,可能也不是 NLP 用户的典范(至少现在是这样)。

1.写电影剧本

《GPT 2》已经是创作舞台剧的好方法了。它可以检测结构和粗略的上下文,并继续使用自我注意。如果您以提示开始

Empty Room.
X enters and says: "..."
Y answers: "..."

然后 创成式预训练变压器 已经知道 设定(空房间)人物(X 和 Y) 。此外,它还会考虑初始对话框中的主题,并继续这些主题。但它还做了更多:它添加了新的角色、主题和设置,而没有任何人为的干扰。

在《GPT 2》中使用这种方法,我创作了一部人工智能驱动的短片“空房间”(制作)。

各种人工智能系统和框架的剧本、视觉、音乐和声音。

我和 GPT 一起重新写了电影剧本——3——之前版本的约内斯库的荒诞被萨特的存在主义替换成了性别剧和戏剧。

2.关于形而上学的对话

如果你遇到聊天机器人,通常是在客服的情况下。在更罕见的情况下,这是一个像伊莱扎一样的心理治疗实例,或者像雷普利卡一样的社交人工智能代理。

但在 GPT-3 之前,我从未如此激烈地与人工智能聊过现实、宗教、模拟理论和其他本体论话题。我的谈话迅速传播开来。

你可以理解我对从机器上得到如此深刻答案的敬畏。

当然,每次你与 GPT-3“对话”,你都会得到另一个对话情节,就像蝴蝶效应一样。每一个回答都触发(或不触发)一个特定的话题架。你不会从人工智能那里得到一个单一的答案,它是在我们全球文明的人类文化遗产上训练出来的。

答案太多了。

3.采访艾

使用 GPT 3 游戏中的“聊天”预设,你可以询问当前实体的“个性”。当你们对话的时候,GPT 3 号的个性显现出来了(顺便说一下,你的个性也显现出来了)。).请注意,在 2048 代币之后,有一个硬切,你永远不会再遇到同样的“个性设置”。

我使用了普鲁斯特和纳博科夫的著名问卷调查,得到了非常令人惊讶的答案。有时 GPT-3 甚至难以回答。你曾经和一个怀疑答案相关性的聊天机器人说过话吗?

**Human:** What is your Attitude to marriage
**AI:** Is this relevant?
**Human:** yes. It’s part of the questionnaire. So, what is your Attitude to marriage?
**AI:** Why? Why do you need this information?
**Human:** Well, it’s just a questionnaire, it’s a game. Do you have secrets?
**AI:** No, of course not! I’ve already told you that I don’t have secrets.
**Human:** So, Attitude to marriage, please.
**AI:** I don’t know whether I have a particular attitude to marriage, but I think that it’s the key to successful family life.

在这种情况下,它模拟了一个担心数据隐私的人类(?).顺便说一句,这次谈话。由哈珀杂志于 10 月出版。

4.写情书

这是创造性写作的一个明显的练习:想象自己是某个人(甚至是某样东西),从这个实体写一封情书。做一名侧写员。

在我的实验中,我让 GPT-3 从自由女神像、川普甚至烤面包机上写情书

我从来不知道艾在写情书方面会如此出色:

图片作者。

GPT 3 号不是 AGI,但它有理解能力。它能理解“什么是烤面包机”,“什么是情书”,以及烤面包机的哪些特征可以在后者写的情书中反映出来。

5.让 GPT-3 单独出现对话。

这个实验涉及到聊天预设,对设置进行了微小但重要的改变。在通常的聊天预设中,你必须定义你自己和聊天机器人。

典型的 GPT 3 聊天预设如下所示:

聊天的默认预设(您可以编辑对话设置、话题、温度和参与者)。图片作者。

在右边,你可以看到参与者的定义(这里是:人类和人工智能),以及“停止序列”,它决定了聊天机器人在哪里停止说话,轮到你了。如果你删除停止序列,GPT-3 将不会提供你说话的可能性。相反,它将继续在确定的字符之间进行对话,而不需要您的参与。

我做到了,并上演了两个人工智能单独在一起而没有人类干预的刻板场景(“西部世界”效应)。为了给游戏更多的偏见,我决定了AI 1AI 2的性别。这部短剧的结局让我和艾 1 一样惊讶。粗体输入的是我的提示,其余的是 GPT-3 写的。

图片作者。

6.疯狂试验对话框(使用偏见)。

自我关注是一个漂亮的 transformer 特性——如果受到特定因素的影响,简单的对话可以得到完全不同的发展。

这是一个聊天机器人“知道关于比萨饼的一切”的例子,它作为比萨饼顾问工作得非常好。事情会变得很诡异,如果再加上明显的设定“对披萨了如指掌“一个随机”讨厌猫

你的谈话不仅会被打断,还会变得怪异。

Merzmensch 的视频。使用:艺术培育者,《神秘实体马阿丽》插图

然而,这样的话题干扰可以帮助头脑风暴和放松你的思想。

例如,尝试将对方设置为烤面包器(或烤面包机):

7.与历史人物对话。

聊天机器人的另一个用途是将你的人工智能驱动的对手预设为一个名人——可以是作家、科学家、艺术家等等。GPT-3 接受了大量知识的训练,它会在一定程度上模仿这个人。

以下是根据埃里希·弗洛姆的名言和哲学与他的对话。

你也可以上演名人之间的对话,这可以成为汤姆·斯托帕德的绝妙讽刺:

8.风格模仿

撇开理解不谈,GPT 3 号阅读的文本比地球上任何一个活着的人都多。

甚至 OpenAI 也没有透露数据集的具体内容:

GPT-2 was trained on 40 GB text (8 Mio books, articles, websites...)
GPT-3 is trained on 570 GB text.

让我们沉浸其中。

尽管如此,我们还没有讨论理解的现象,但你会同意我的观点,如果它要激活特定的主题,它所训练的文本没有一个是不聚焦的。

这个实验在测试者中很受欢迎:让 GPT-3 以…的风格写作,它并不总是工作得很好。还有一些暗示。

就我而言,它写了一首“莎士比亚的诗”:

图片作者。

你在这里可以看到古老的风格和抑扬格诗,只是…第一行直接引用了亚历山大·蒲柏的一首诗。剩下的就是 GPT-3 的创造了。这种无意抄袭的隐患是存在的(OpenAI 正在研究检测和防止这种情况的方法)。

另一种情况是,我想要一首库尔特·施威特斯的达达主义诗歌(他也是用英语写作的)。我所得到的并不十分愚蠢,但这篇文章的隐喻和诗意是惊人的(它成为我最喜欢的诗歌之一):

图片作者。

有时候风格模仿非常完美,尤其是基于卡夫卡斯的短篇小说。

GPT 3 号的伟大之处在于,它能够学习外语。根据 GPT-3 库,数据集中有100 多种语言。以下是排名前 15 的语言:

来源:Github, GPT-3 。图片作者。

它可以写德语——不仅语法正确(与 GPT-2 相反),而且风格完美,这里是歌德的信件和日记。我让他写关于电视广告的独特细节(“这是一个违背理性的矛盾”):

它还可以延续日本文学的经典,如 Sei Shonagon 的“枕边书”:

如你所见,《GPT 3》的叙事能力并没有超越英语文学的边界。

9.风格模仿(高级版)。

由于它是一个人工智能,不会对你的怪异任务感到愤怒,所以你可以更进一步。

在我接下来的“的风格写作……”练习中,我问了创意作家学生 GPT-3 (或者很可能已经是大师?)到…

This is an instruction, written by Sartre, how to eat a hamburger while of surfing the wave, as a poem:

这对人工智能来说太难了,但是它没有完成我的任务……[这是 GPT-3 最常见的情况:如果任务太复杂,它会做一些不同的事情,但几乎每次都超出预期]

这实在是太过分了,但是 GPT-3 用他的简短简历和一首精彩的表现主义诗歌创造了一个不存在的诗人和哲学家。

10.作为信件交换的风格模仿

在另一个实验中,我让名人互相写信。在这里,简·奥斯汀祝贺歌德生日,但它很快升级:

11.写短篇故事或童话。

自我关注驱动的变形金刚保持了文体的连贯性,所以你可以让 GPT 3 生成短篇小说,一篇接一篇。就我而言,我尝试了各种语言的“醒来前的短梦”,对结果非常满意:

最有趣的部分开始了,它给出了故事的标题。这是一个无人监督的自主写作者在工作。

12.你可以“海明威”它

为什么不写一个 6 个字的小故事呢?

13.发明一种未知的语言

2048 个令牌当然不足以“从零开始”发明一种不存在的语言,但你可以试试。NLP 学者将模仿一种具有内在连贯性的虚构语言。

14.创造艺术运动

因为为什么不呢?使用自由形式模式,你可以给一个任务去创造一个新的艺术运动——它会产生一个艺术运动宣言艺术运动描述(带着惊喜),甚至是一个关于社会背景下的艺术的深刻的和可理解的逻辑图(在这里用德语是“艺术不是自由的——在七篇论文”)。

所有的文化学话语都反映在这样的输出中。它们在来源的意义上是不可靠的。但是如果你在寻找可靠性或可能性,你最好不要进入艺术领域。

如果你已经创建了一个新的艺术运动,请随意使用artbreaderStyleGAN2 库或 RunwayML 来生成一些人工智能驱动的图像

15.去抽象!

在这个复杂的案例中,我让 GPT-3 将达芬奇著名的""方法应用到事物上(达芬奇著名的"【模糊】使用颜色,例如在蒙娜丽莎的画上,使颜色渐变平滑而温暖)。

我要说,这个尝试是合法的:

事实上,使用雨滴和逐渐变暗的乌云的描述完全符合 sfumato

让我们用构成主义艺术来描绘“T0”饥饿“T1”,或者用波普艺术来描绘“T2”好奇“T3”

16.再抽象一点!

你可以尝试用艺术运动的方法来描述各种事物或现象。在这种情况下,GPT 3 号必须

  1. 理解题目
  2. 获得艺术运动的方法
  3. 将 2)推广到 1)

在我的例子中,它甚至更进一步,增加了一个作家,他用一种特定的艺术风格来描述事物:

17.制作你的 TED 演讲。

GPT 3 号完美地完成了它的工作,它提供了一个概要。即使这个演讲的内容不那么透明,但它毕竟有一些听觉上的影响:

18.创造有趣的事实

它们在互联网上很流行——有时你无法确定这些“有趣的事实”的可靠性和出处。

艾把这样的休闲话题进行了某种讽刺,讲述道

贝多芬喜欢在树叶中打滚,玩雪球

自我关注保留了提示的结构:“保持简短,应用于焦点组中的各种人”。

19.找到不明显的联系

这个很适合头脑风暴——找到两个没有直接关联的随机话题,让 GPT-3 发现联系。比如这里——在麦当劳和陀思妥耶夫斯基的《罪与罚》之间:

带着启发性的目的制作快餐体验听起来合情合理。

20.GPT-3 你自己。

如果你没有主意了,你可以自己GPT-3。因为“谷歌你自己”太过时了。

如你所见,没有界限。GPT 3 号完美地完成了一些任务,另一些则有缺陷,但它总能带来结果。它从来不会用错误信息或者冒烟的 TPU 服务器来回复你不可能完成的任务(至少我不知道是这样)。

如果你还想知道创造性使用 GPT-3 的其他方法,让我们问问框架本身。

额外收获:GPT-3 提供的创意

****

所有四张图片均由作者提供。

如果你没有 GPT 3 号的权限,不要担心。OpenAI 正致力于通过 API 或应用程序提供 GPT-3 访问的各种可能性。让我们在 2020 年秋季寻找新闻。我相信,很快你就能试用它了。

如果你太不耐烦,你可以试试现有的应用程序,比如已经在 GPT 2 号和 GPT 3 号上运行的 AI Dungeon

跟随我和我进一步的 GPT-3 实验

20 天谷歌云专业机器学习工程师考试(测试版)

原文:https://towardsdatascience.com/20-days-to-google-cloud-professional-machine-learning-engineer-exam-beta-b48909499942?source=collection_archive---------2-----------------------

将自己投入深渊的旅程

威廉·费格森在 Unsplash 上拍摄的照片

————————2020 年 10 月 15 日更新— — — — — — — — 恭喜!你正式成为谷歌云认证的专业机器学习工程师。

我在 https://cloud . Google . com/certification/sample-questions/machine-learning-engineer
上尝试了一套新的 10 道样题,我认为它们比 70%的考试题都要难。
————更新结束— — —

2020 年 8 月 1 日,我查看了一周前显示“我们有足够的 beta 测试者,注册已关闭”的注册页面,发现它又出奇地活跃了。我查看了考试预约日历,看到最晚的日期是 2020 年 8 月 21 日,之后即使滚动到 2021 年 8 月也没有可用的时间。

GCP 考试通常推荐 3 年以上的行业经验,包括 1 年以上使用 GCP 设计和管理解决方案的经验,这些我都没有,但你只能试用一次,所以我接受了挑战,于是一个计划产生了:https://www.meistertask.com/projects/2gpnfy1fmf/join/

如果您想进行编辑,请先导出项目,然后将您自己从原始项目中移除,然后将项目导入您自己的 MeisterTask 帐户。不要存档原件,因为它会影响我的副本和每个未来的读者。

你可以通过格式化卡片上的要点来为这个原创做出贡献。我的第一个版本被另一个读者删除了,这个重新导入的版本没有合适的项目符号。除了项目符号格式之外,请不要在此原件上添加任何其他编辑内容,如果您愿意,可以在自己的副本上进行编辑。

我知道有时间一遍就看完所有的材料,所以注意力和效率是至关重要的,然后我发现用 PowerPoint 制作抽认卡,上面贴满我看过的材料的截图(大约 120 张),真的有助于记忆。https://drive . Google . com/file/d/1 flg qfco 8 dctx-g 4 djl 7 kqyc 2s y1 mbt 6 w/view?usp =分享

不幸的是,我没有完成 Coursera 上 Google Cloud 上 TensorFlow 推荐的机器学习,只浏览了大数据和机器学习基础知识,以及 Google Cloud Platform Specialization 上 TensorFlow 高级机器学习的前两门课程(它们涵盖了大部分必要内容)。然而,浏览所有其他推荐课程的幻灯片对考试非常有帮助(尤其是高级专业化认证中的第 5 门课程)。考试中涵盖的大量知识也来自谷歌的机器学习速成课程。

我的大部分备考小技巧已经收集在上面的 MeisterTask planner 里了,所以我会在考完试后分享一下我的想法。

第一部分:ML 问题框架

能够把问题中的外行语言翻译成机器学习术语,比如用什么样的算法解决什么现实生活中的问题。仔细看问题,不像只看标签类型那么直白。有些问题似乎完全是面向业务的,需要理解业务指标以及什么对客户有好处。

第 2 部分:ML 解决方案架构

IAM 和权限可能已经通过所提供的 MCQ 选项进行了隐式测试,所以请了解哪些 GCP 产品在一般的 IAM 之外具有额外的安全特性。了解在数据管道的每个阶段(接收、转换、存储、分析)可以使用什么产品。仔细阅读该公司目前的状况,不要选择重复该公司已经做过的事情或太远的事情。
了解 GPU 和 TPU 加速之间的差异,以及是什么让这两种选择都不可能或不可取,这样一旦你看到问题的关键点,选择就一目了然了。大致了解 KMS、CMEK、CSEK 是做什么的,以及它们是如何用于处理隐私要求的。

第 3 节:数据准备和处理

熟悉将建模要求转化为正确的特征工程步骤(散列、箱、交叉),以及可重复的训练-测试-分割散列。在这一点上,MLCC(https://developers.google.com/machine-learning/crash-course)做得很彻底。应该比较和理解特征选择的统计方法。配额和限额通过显示管道中特定阶段的替代产品的选项进行隐性测试。了解数据流和云函数的常见用法会有所帮助。
了解 TFrecords 如何出现在数据管道中,以及涉及它们的一般 ML 流程,例如何时转换为 TF records,如何使用 TF records 进行训练-测试-拆分。能够识别数据泄漏和处理类不平衡(MLCC 涵盖这一点)

第 4 部分:ML 模型开发

了解 GCP 的建模工具(BQML,SparkMLlib,AutoML,ML API,AI Platform)的范围,以及它们将学习转化为完全自定义代码的无代码程度。建模速度和准确性是相互竞争的要求。了解数据/代码如何在 GCP ML 组件之间移动,并留意导入/导出快捷方式及其格式。
知道 AI 解释对什么类型的数据有什么样的解释。

第 5 部分:ML 管道自动化和流程编排

大多数问题的提问水平都比我预期的要高,所以用 Qwiklabs 运行 Kubeflow pipelines UI,查看示例代码以了解组件是如何连接的,并理解 TFX 与 Kubeflow 的区别就足够了。请注意,与 GCP 相比,有些事情可以在内部完成。了解如何快速构建 Kubeflow 管道。在没有灵活性但是快速的复制粘贴开发和完全的灵活性但是从零开始的耗时的开发之间总是有一个竞争的关注点。两者都不总是更好,这取决于公司在技能和产品方面的情况,以及他们当前使用或计划使用的基础设施和库,所以请阅读该问题。

第 6 部分:ML 解决方案监控、优化和维护

了解在开发过程中分析模型性能的工具。并持续评估模型在生产中的性能。管道简化技术将在 Google 云平台专业化的 TensorFlow 高级机器学习的第二个课程中介绍。

一般考试提示

有些问题很短,你可以在 5 秒钟内回答。有些时间燃烧者的选择比问题更长。通过仔细阅读需求和常识,一些选项是可以猜对的。理解问题想要什么,并选择做正确的事情,不多也不少。有些选项是其他选项的子集。有时,最佳答案不能满足问题的 100%要求,但其他选项甚至更错。有时最接近的答案表明你做了一些不受欢迎的事情来解决一个更重要的问题,所以有牺牲的成分。没有多少“勾选所有正确的”问题。有一些一般性的 python 问题和 Tensorflow 调试问题需要真正的实践经验,Qwiklabs 不会提供,因为它们只能教如何成功,而不能教如何失败。

首先阅读选项,形成一个从问题中寻找决策变量的心理决策树。“将 2 个决策变量上的 2 个选项置换成 4 个 MCQ 选项”的情况似乎很少,但主要是略有不同的选项,最多有 4 个选项全部正确,但仅满足 0–20%、50%、70%、90–100%有效性的要求。多部分选项的某些部分是重复的,因此没有必要在那里进行选择。一旦你分析了选项,问题的大部分可能是不相关的,所以继续阅读问题是浪费时间。过滤掉不相关的选项是有效的速度助推器。如果选项中的差异不明显,并且您必须阅读整个问题,请始终从公司当前状态的大画面开始,他们处于 SDLC 的哪个阶段。如果您知道问题是关于部署的,那么可以排除所有关于开发的选项。由多个部分组成的选项可能会让人们困惑,并使其变得更难,但这也意味着有更多的机会被淘汰,所以即使你不理解选项的所有部分,你也只需要找到一个部分,使整个选项出错。

如果时间允许,不仅要证明为什么你的选择是正确的,还要证明为什么所有其他的选择都没有在你的第一遍中通过。如果时间紧迫,证明选项错误比证明可能正确的选项符合所有需求更容易。我只剩下 24 分钟来复习 58/120,并且只复习了 20。

处理考试用户界面

问题是逐页加载的,每页上有 4 个按钮(后退、前进、查看全部、提交)。不要提交,直到所有的问题都完成并审查。评论页面将显示有多少人回答,并在您标记为评论的人旁边标上星号。有一个低门槛的标记审查(我有 58/120),因为它花费了大量的时间反复点击后退按钮,并寻找一些你没有标记审查,但后来想。然而,如果你在中间意识到你没有 1 分钟的时间来复习,开始有一个更高的复习门槛,因为结尾有太多星号意味着你可以花时间复习你已经非常确定的东西,而不是那些真正需要复习的东西。“查看全部”页面只显示您的问题编号(带可选星号)和您的选择,根本没有问题预览文本,所以除非您有很好的记忆力,否则很难知道哪个编号对应哪个问题,所以您可能需要浏览所有星号。

在第一遍时,在每个问题下面的评论框中记下(不确定这个框是否只是测试版功能)为什么某些选项是错误的,这样当你回来复习时,你不会从零开始重新开始这个问题,并且可以立即思考可能正确的竞争选项。注释框的另一个用途是记录你不确定的概念。您可能会遇到未来的问题,通过在问题中给出答案来解决这种不确定性,例如什么工具一起使用,哪些工具调用哪些工具。谷歌有提供不存在的选项的历史,但如果你看到相同的选项/概念出现在不止一个问题中,这很可能是可能的。

不要连续点击两次后退按钮,以防止意外提交,因为第一次点击后,提交按钮将加载到光标的正下方。“后退”和“前进”大约需要 3-5 秒的时间来加载,此时计时器停止计时,因此您可以在页面加载时有更多的时间来思考。不要使用 shift 键输入大写字母,否则你会使用 Ctrl+C/X 或其他组合锁定你的考试(我被锁定了两次,幸运的是我在现场进行了锁定,所以监考人员会在那里解锁,不知道如果远程进行,它会如何工作)。

学习策略

如果有时间

先跟着推荐的课程走,再去上教程(在 https://cloud.google.com/docs/tutorials上搜索 ai 平台你就覆盖了 95%,剩下的是 GCS,PubSub,云函数,Bigquery)。这些课程涵盖了大部分考试内容。另一个好处是当你已经知道这些概念时,阅读教程将会把单个的工具和概念组织成一个完整的架构。然后,您可以使用来自工具的知识来询问以下问题:在此体系结构中,一个工具相对于另一个工具的性能如何,如何扩展其限制,它能否连接到另一个源/接收器,1 个工具的配额/限制如何影响管道中另一个工具的限制,哪里/哪些工具是常见的瓶颈,哪里很少是瓶颈,无服务器部分在哪里(2 种类型:可以配置与不需要配置),以及哪些部分不是无服务器的。

在执行 Qwiklabs 时打开多个工具是有用的,例如始终保持虚拟机控制台页面打开,以了解您的 1-click GKE 集群部署实际上是在特定设置下默认供应 3 个虚拟机,或者您在 AI 平台笔记本中的“Open JupyterLab”单击已经在幕后供应了一个特定机器类型的虚拟机,或者当您执行一些 Qwiklabs 时自动运行的启动脚本已经在幕后设置了一些 git 克隆。保持 GCS 控制台打开也很重要,因为如此多的 GCP 人工智能工具依赖于桶。

如果你没有时间

立即阅读教程和文档(概述、最佳实践、常见问题)。这是一条更困难的道路,因为在浏览教程时会有许多未知的概念,它们可能太深入了,那种知识水平涵盖了< 10% of what’s tested. However, they serve as the fastest starting point for the learner to know the unknowns.

了解 g cloud SDK 【https://cloud.google.com/sdk/gcloud/reference】
这是了解 Google 有什么以及它是如何命名的最快方法。展开每个部分以查看方法名称,您将了解哪些服务是可用的,而无需浏览 GCP 控制台 UI。此页面还会提醒您可能错过的文档页面,并帮助您解决测试要使用的正确命令的问题。

"恐怕我太嫩了,不会去做的。"

乔纳森·博尔巴在 Unsplash 上的照片

第一天,我完全不知道考试指南中的 53/81 要点是什么意思,也不知道如何达到这些要点。在研究了 https://developers.google.com/machine-learning/crash-course 之后,我也意识到一些我认为我了解的 28/81,并不是它应该的样子。

由于这些原因,我认为没有必要拥有大量的 ML 知识。

  1. 考试很少有实现/调试问题,主要集中在 GCP 工具选择和解决方案架构(有时开源工具作为选项,但通常 GCP 工具因无服务器可扩展性而胜出)。如果需要实施的话,我肯定不会尝试 20 天的学习。
  2. 即使有人以前做过一些事情(例如处理不平衡的数据),他也可能没有按照谷歌建议的方式去做。是的,这并不客观,而且确实有谷歌推荐的做法需要记忆。
  3. 考试的很大一部分是关于 GCP 特定的工具、命令和工作流。如果有人不研究 GCP,他不会知道什么是可能的,或者开发,测试,部署,监控工作流是如何使用 GCP 工具完成的。知道如何在 GCP 之外做并不意味着这是正确的答案。在考试环境中,内部工具或在本地完成通常是错误的。
  4. 让考试变得异常困难对谷歌不利。有足够经验的人不需要证书来证明什么。太难会阻碍人们为考试而学习,这意味着更少的 GCP 用户,更少的考试费,更少的开源公司雇佣这些考生,并在公司层面转向 GCP。

一些支持以往经验益处的论点:

  1. Dataflow 基于 Apache Beam,Airflow 上的 Cloud Composer,Kubeflow 上的 AI 平台 pipelines,所以如果你已经使用了开源版本,你可以更快地浏览教程中的代码,并知道为什么一些工具与多选中的另一个工具相比是多余的,显然是错误的选择。但是再次记住,实现很少被测试。更重要的是了解 GCP 特定的源和汇可用于数据流,以及 GCP 管道如何允许某些工作流/快捷方式,这可能是开源工具所无法实现的。
  2. 阅读/经历更多的人可以更好地从给定的特性和模糊的需求中辨别出哪种业务度量适用于哪种情况,或者哪种 ML 问题可以被构建。然而,在常识接管之前,只有非常基本的 ML,技术术语是必需的。
  3. 阅读/经历更多的人会知道做某事的更多方法或某事可能出错的更多方法及其负面影响,并使用这些知识来识别和推断当呈现一个场景时哪里出错了以及采取什么步骤来修复它。(例如,数据泄漏、不良的训练-测试-分割、训练-服务偏斜、拟合不足)。然而,知道解决方案是不够的,因为您还必须知道首先要尝试什么,这里又出现了 google 推荐的实践来学习。

作为最后的免责声明,如果没有以前的经验,任何人都不太可能在 20 天内通过这一关,这有助于回答调试问题,并对评估指标(如精度、召回率、F1、AUC)做出更快的反应,但这篇文章希望激励那些认为这可以做到的人。

如果你还有任何问题或者想分享你的经验,请随时在 Linkedin 上联系我:https://www.linkedin.com/in/hanqi91/

数据科学的 20 个大熊猫技巧

原文:https://towardsdatascience.com/20-great-pandas-tricks-for-data-science-3a6daed71da0?source=collection_archive---------7-----------------------

你应该每天使用的 20 个大熊猫技巧

(图片由作者提供)

介绍

除非你是 Python 数据科学的新手,或者你的路由器上连接了某种设备来阻止所有与熊猫有关的传入数据包,否则你可能听说过熊猫。Pandas 是 Python 数据组织、清理和 IPython 显示的首选库,在过去 10 年中,它已经成为读取和处理数据的行业标准。在处理数据方面,Pandas 不仅在很大程度上满足并超出了所有人的预期,它还与 Numpy 紧密相连,并与 Numpy 合作得非常好——将它进一步整合到 Pythonic 数据科学包的奇妙生态系统中。

虽然 Pandas 很受欢迎,并且大多数使用 Python 的科学家都非常频繁地使用它,但它仍然是一个非常深入的库,具有许多特性。这些特性中有很多很容易被忽略,但是它们的价值却不能被夸大。幸运的是,今天我在 Pandas library 中整理了 20 个鲜为人知的特性,它们将帮助任何数据科学家掌握这个软件包!

笔记本

数据帧

数据框是熊猫图书馆的核心特征。尽管数据框本身就是一个强大的功能,但是如果没有强大的功能和操作,它们最终只是被美化了的字典。幸运的是,Pandas 为您提供了这些非常酷的方法来探索您的数据、清理您的数据和调整您的数据。对于以下所有示例,我将使用此数据框:

(图片由作者提供)

这些数据是早至 1910 年、晚至 2006 年的历史天气数据

df.describe()

Pandas 中最被低估的功能之一是一个叫做 describe()的简单函数。对数据框使用 describe 函数会产生一个非常统计的结果,它会告诉您需要单独了解的每一列的值。这是了解给定列中大多数数据的位置的好方法,而不需要考虑平均值。了解了标准偏差、最小-最大值和平均值,也就很容易知道数据中的方差有多大。使用这个函数是一个非常好的方法,可以非常快速地获得每一列的以下所有统计数据:

  • 意思是
  • 数数
  • 标准偏差
  • 第一个四分位数
  • 第二个四分位数(中位数)
  • 第三四分位数
  • 最小值
  • 最大值
df.describe()

(图片由作者提供)

df.groupby()

groupby()函数是一个很棒的函数,可用于根据分类值或数值的连续等级来重新组织您的观察值。该函数只是将相同或相似的值最接近地放在一起。

df.groupby(['Temperature (C)']).mean()

(图片由作者提供)

df.stack()

stack 函数可用于返回具有更多最内层的数据框和序列类型。通过旋转数据框来创建新的最内层。第一个参数控制堆叠哪个或哪些层:

df.stack([0])

(图片由作者提供)

Stack 似乎并没有对这些数据做什么。这种功能只有在桌子主要是可旋转的时候才能感觉到。

df.apply()

应用函数用于使用 Python 函数在整个数据框或系列类型中应用算术或逻辑代码。虽然这当然可以应用于数据框,但我只打算将其应用于系列,因为该数据框包含字符串和日期时间数据类型。

df["Temperature (C)"].apply(np.sqrt)

(图片由作者提供)

df.info()

info 函数可用于数据框,以提供有关数据框的信息,这些信息通常与性能而非统计数据相关。如果您想要检查内存分配或数据框内每个系列的数据类型,这将非常有用。

df.info()

(图片由作者提供)

df.query()

Query 是一个 Pandas 函数,允许在整个数据框中应用条件掩膜。query 和典型的条件掩码之间的唯一显著区别是,query 函数可以接受一个将被解释为条件语句的字符串,而条件掩码将使用布尔值屏蔽数据,然后返回为真的条件。

df.query('Humidity < .89')

(图片由作者提供)

df.cumsum()

cumsum 函数可用于获取数据框和熊猫系列类型的累积和。这意味着数字将按降序相加,并在此过程中不断相加。

df.cumsum()

坏消息。

不幸的是,内核似乎已经死亡。因为我的 Jupyter 内核今天感觉特别情绪化,所以我会让她(她是女的)休息一下,而是只在一个系列上运行这个函数。

(图片由作者提供)

条件掩码

Pandas 库里面我最喜欢的特性之一是能够很容易地用条件屏蔽数据帧。虽然有办法用滤镜做到这一点!()方法在我最喜欢的语言中,朱莉娅,这是我真正想念的一件事,我希望能被带入语言中。首先,你需要提出一个条件,在这个例子中,我们将使用低于 14 级的风速。

our_mask = df["Wind Speed (km/h)"] < 14

接下来,我们将通过简单地设置一些与布尔相等的东西作为索引来应用这个掩码:

seconddf = df[our_mask]

现在我们的数据框不包含大于或等于 14:

(图片由作者提供)

df.melt()

熔化与 pivot 函数相反,pivot 函数会将您的数据转换为横向格式。如果你想改变观察结果和特征,这是很有用的。但是,需要注意的是,在某些情况下,如果不提供参数或更改数据框的结构,效果可能不如预期。我正在处理的数据框就是一个很好的例子:

df = df.melt()

(图片由作者提供)

df.explode()

你有没有因为某种原因碰到过类似这样的数据?:

(图片由作者提供)

除了与数据框上的 A 相对应的观测值之外,所有其他值都是具有单个整数的精确观测值。幸运的是,我们可以简单地在数据框上运行 explode 来纠正这一点。Explode 将“分解”数据框内的所有可迭代集合,并将它们放入单独的观测值中。

data.explode("B")

(图片由作者提供)

df.nunique()

我们有一个包含许多类别的数据框架,我们希望找到一个分类问题的解决方案。唯一的问题是,我们不想使用一个容易过度拟合的模型,如果我们有这么少的类别,该模型最终会矫枉过正。这在数据科学家的典型日常生活中是很常见的场景。幸运的是,这个问题的解决方案非常简单——需要对所有唯一值进行计数。更幸运的是,Pandas 通过 nunique 函数让这一切变得异常简单!

df.nunique()

(图片由作者提供)

这将提供数据框中所有要素及其相应唯一值计数的综合列表。

df.infer_objects()

在处理脏数据时,您可能会遇到的另一件事是最初被认为不是脏数据的类型。使用 df.infer_objects()是在数据框内更改这些数据类型的一个很好的潜在节省时间的方法。infer_objects 函数根据经验猜测每一列的数据类型,并将整个系列设置为该类型。

df.infer_objects()

(图片由作者提供)

df.memory_usage()

内存使用是 return most 可能已经假定的一个函数。虽然我们使用 info()函数大致了解了数据框中的内存使用情况,但 memory_usage 要全面得多,它将允许我们找出哪些列消耗了大部分内存。

df.memory_usage()

(图片由作者提供)

df.select_dtypes()

select_dtypes 函数可用于根据类型从数据框中提取某些列。一个很好的例子就是 apply,我们希望将 np.sqrt()应用于整个数据框,但是由于数据框中的字符串,我们只能对单个系列执行此操作。

df.select_dtypes(float).apply(np.sqrt)

(图片由作者提供)

df.iterrows()

iterrows()函数是一个简单的生成器类型,它将生成一个新的迭代数组—每列一个。如果您需要将所有行压缩到一个可迭代对象中,这非常有用:

rowlist = df.iterrows()

现在我们可以迭代这个生成器:

(图片由作者提供)

压型

提到熊猫数据分析,就很难不谈到熊猫概况。尽管它需要另一个库,但它无疑是 Pythonic 数据科学家拥有的最好的工具之一,只需一个函数调用就可以快速浏览数据。你可以在这里查看:

[## 熊猫简介/熊猫简介

文档|松弛|堆栈溢出从 pandas 数据帧生成配置文件报告。熊猫 df.describe()…

github.com](https://github.com/pandas-profiling/pandas-profiling)

为了使用它,只需调用

df.profile_report()

这将在一个方便的 HTML 传单中提供对您的数据的彻底检查,该传单易于理解并且与 IPython 完全兼容!

系列

Pandas 系列类型虽然可能不像数据框那样是 Pandas 的组成部分,但肯定有其重要性。与普通列表的功能相反,熊猫系列有很多不同的选项,这些选项在其他地方都不被支持。这些工具通常包括大多数数据科学家期望从 Python 中获得的典型生活质量工具。

Series.isin()

isin 函数将返回一个条件掩码,如果序列中的给定观察值在它所调用的值列表内,该条件掩码将返回 true。例如,我们可以为我们的:PrecipType 列中的每个值是否为“rain”创建一个掩码:

df["Precip Type"].isin(["rain"])

(图片由作者提供)

Series.where()

Where 将对给定的系列应用一个条件,并返回满足所述条件的值。where 函数几乎直接以该函数用途的 SQL 等价物命名。

df["Summary"].where(df["Summary"] != "Mostly Cloudy")

(图片由作者提供)

Loc 和 ILoc 系列

如果您不熟悉 iloc 和 loc,那么您可能应该开始练习了——因为这两个非常重要!经验法则是loc is used for labelsiloc is used for integer-based indexing. 首先,让我们尝试在一个系列类型上使用 iloc,看看我们会得到什么回报。

df["Precip Type"].iloc[2]

(图片由作者提供)

我们在这里得到“rain”作为回报,因为它是我们的“Precip Type”列中的第二个索引。让我们再来看看数据帧头:

(图片由作者提供)

或者,我们可以使用 loc 而不是 iloc 来获取基于索引中标签的值。考虑以下数据帧:

data = pd.DataFrame({"Age": [25, 35,45]}, index = ["Corgi", "Maltese", "Pug"])

(图片由作者提供)

现在,我们可以对任何给定的索引调用 loc,并接收带有每个特性的整个观察集:

data.loc["Corgi"]

(图片由作者提供)

我现在才意识到 25 岁对一只狗来说太老了。

实际上,我不确定这将返回什么数据类型,所以我也很想知道这是什么类型:

(图片由作者提供)

谁能想到呢?

Series.rank()

rank 函数可用于根据值在数据中相对于最小值和最大值的位置为值提供数值等级。这在一系列不同的原因中是有用的,但是在 Wilcox 秩和检验中可以看到秩的巨大应用,Wilcox 秩和检验是一种使用秩来返回概率的统计检验。

df["Humidity"].rank()

(图片由作者提供)

结论

不用说,Pandas 是一个管理和清理大型数据集的神奇库。熊猫让很多事情变得简单多了,坦白地说,这些事情在其他语言中很难。虽然有很多其他语言的伟大软件包试图完成类似的任务,但它们中的大多数让我怀念熊猫处理复杂问题的出色方式。

使用这些功能,几乎可以保证科学家可能遇到的大多数问题都能得到解决。虽然 Pandas 是一个非常深入的库,但总是有一个伟大的功能可以加快你的工作,让你更快地找到有趣的东西,这是很棒的!

几率有多大?

原文:https://towardsdatascience.com/20-hot-yoga-classes-31-days-ef6a8d9e1bd4?source=collection_archive---------36-----------------------

我是如何计算这个一月的日子的

计算我在瑜伽馆抽奖中获胜的几率——以及参加抽奖是什么感觉

接受挑战

新年刚过,我的朋友 Steph Tong 找到我,想和她一起参加一个比赛(“力量挑战”),在一月份完成 20 节瑜伽课。出于#newyearnewme 的心态,我很快就同意了,尽管当时我的身材已经完全走样了。

关键外卖

这比我预想的要有挑战性得多。我面临着预期的精神挑战,即定期早起,以及身体挑战,即把锻炼计划增加到前一个月的 4 倍。

我很惊讶这有多重复。核心力量(瑜伽。我们要去的工作室)有一个相当严格的序列。这意味着序列变得单调,同样的肌肉群在我每次锻炼时都会受到冲击。我很高兴从这一切中变得更强壮、更灵活,但我无法告诉你 2 月 1 日来做其他事情时我有多兴奋。

我们中彩票的可能性有多大?

我和 Steph 有 10.93%的机会赢得比赛

任何完成这 20 门课程的人都可以参加比赛并获得奖品(老实说,这也是吸引我和斯蒂芬的原因之一)。根据我们当地工作室跟踪每个人进展的公告板,看起来 Steph 和我将是我们工作室 10 个人中完成挑战的两个人。实际上并不要求进入这个板,所以可能有人进入了而没有跟踪。然而,划掉那些框已经非常令人满意了,所以我不能想象任何人不会抓住这个机会。

这个公告板允许我和 Steph 工作室的参与者跟踪我们 20 节课的进度。注意:这张照片拍摄于 1 月 27 日,所以我在推断谁将在剩下的 4 天内完成挑战。

每个工作室都会给一个人颁发一个奖项,所以我们知道我们每个人都有十分之一的机会赢得这个奖项。

剩下的 21 个奖项将颁发给任何工作室的任何人,因此确定这些几率会有点棘手。我在这里做了一些假设:

  • 获奖者将被替换选出(我只是假设他们不会给同一个人一个以上的奖项)
  • 其他工作室也有 10 人完成了挑战。我不知道这是否合理,但我不知道还能做什么。

在 US⁴有 225 个工作室(注意:当我在谷歌上搜索这个数字时,我看到了一篇有趣的纽约时报文章,关于核心力量的 model⁵).业务这意味着大约有 2250 人将获得 21 项国家大奖。

我发现了一个有用的在线 calculator⁶,它允许我在没有替换的情况下计算抽样,以确定我们的胜算(这个计算器有很多选项,除了我使用它的目的之外,你还可以调整)。斯蒂芬和我各有 0.04%(2250 分之一)的机会赢得特定的国家奖,T2 有 0.93%的机会赢得任何国家奖。

当我们把这个加到我们赢得当地奖项的 10%的机会上,我们每个人都有 10.93%的机会赢得某样东西

当然,真正的奖励是对我们健康的承诺,我们等等等等…🙄。Steph 和我来这里是为了免费的东西!

其余的经历,按数字来说

我一直在使用 Euphy 应用程序来跟踪我的进展——主要是因为我喜欢它们的可视化效果。

轻了 6 磅

每节课 5 美元…95 美分

也许承诺一个月反复去同一个工作室的最好的部分是,你真的可以无限制地花你的钱。(Planet Money 有一个很棒的插曲,讲述了大多数健身房是如何不期望或不希望你这样做的)。

我可以享受每月 119 美元的新会员费。如果我不是新来的,每门课应该是 9.50 美元:/。

4 处我无法解释的瘀伤

我不会再做的 3 个姿势

我是一个不灵活的人。结果,当我太努力去做那些意味着伸展我的小腿、腿筋等的姿势时,我开始给我的膝盖施加很大的压力。

我做了一些研究,并调整了我的实践,排除了以下内容:

  • 半鸽式——我可以做同样的伸展运动,而不会让我的膝盖在全鸽式或坐姿 4 字形中爆炸。
  • 跑步者的弓箭步
  • 战士 1 —不知道这个姿势怎么不伤到大家。如果我把后膝向外,臀部向前,我的膝盖会尖叫“我不是为这个而生的!”

我更有信心的两个姿势

  • 椅子姿势——这套曾经令人痛苦和困惑的酷刑指令现在开始感觉至少比坐在潮湿的公园长椅上要好。
  • 如果我说实话,我曾经跳过这个体式(如果我在木板和扑通一声趴在地板上之间停下来,会有什么区别吗?)现在,我实际上在两者之间做了一个停留。这很难,但我在努力!

正如你所看到的,还有改进的空间,但是我得到了很好的助攻!

1 尴尬的实现

十多年来,我一直把猫和牛的姿势混在一起。意识到自己的错误后,我一时感到羞愧,但我并不真的和猫在一起..或者奶牛。糟糕,_(ツ)_/。

在我看来,看看这只猫摆出的牛的姿势,还有这只牛摆出的猫的姿势!(图片来源:123rf.com 和 shutterstock.com)

0 提示穿什么在高温瑜伽中感觉舒服

[1]“顶点体式”是一个用来描述(通常)这一类中最具挑战性的体式的术语。这个练习的目的是给你力量和灵活性来接近我们的击球姿势。

[2]https://www . NPR . org/2019/06/12/731987365/episode-590-the-planet-money-workout

[3]https://www . gaiam . com/blogs/discover/4-瑜伽错误会导致膝盖疼痛

[4]https://www.corepoweryoga.com/yoga-studio/all-locations

[5]https://www . nytimes . com/2019/04/06/style/core power-yoga-teacher-training . html

[6]https://www.omnicalculator.com/statistics/probability设 P(A)为 1/2250*100(中选一等奖的几率)。将 P(B)设置为 100,因为您没有第二个条件。将“尝试时”设置为 21(奖品数量)。将下拉列表更改为“至少出现一次”(我的名字被选为 21 个名字之一)。

数据科学家必须知道的 20 个机器学习面试问题

原文:https://towardsdatascience.com/20-machine-learning-interview-practice-problems-3c86a572eeec?source=collection_archive---------2-----------------------

用这些面试问题磨练你的机器学习知识

图片由穆罕默德·哈桑拍摄,来自皮克斯拜

鉴于我的文章、谷歌的数据科学面试脑筋急转弯亚马逊的数据科学家面试练习题微软数据科学面试问答5 个数据科学家常见的 SQL 面试问题的受欢迎程度,我在网上收集了一些机器学习数据科学面试问题,并尽我所能进行了回答。开始了。

请务必 订阅此处 并至我的 个人简讯 千万不要错过另一篇关于数据科学的文章指南、技巧和提示、人生教训等等!

问:什么是交叉验证?

交叉验证本质上是一种用于评估模型在新的独立数据集上表现如何的技术。交叉验证最简单的例子是将数据分成两组:定型数据和测试数据,其中定型数据用于构建模型,测试数据用于测试模型。

问:如何定义/选择指标?

没有放之四海而皆准的标准。选择用于评估机器学习模型的度量取决于各种因素:

  • 是回归还是分类任务?
  • 商业目标是什么?精确度与召回率
  • 目标变量的分布是什么?

可以使用的指标有很多,包括调整后的 r 平方、MAE、MSE、准确度、召回率、精确度、f1 分数等等。

如果你想了解更多关于如何评估你的机器学习模型的信息,请查看我的文章‘如何用 Python 代码评估你的机器学习模型’

问:解释什么是精确和召回

回忆试图回答“正确识别实际阳性的比例是多少?”

Precision 试图回答“多大比例的肯定识别实际上是正确的?”

摘自维基百科

问:解释什么是假阳性和假阴性。为什么这些对彼此很重要?举例说明假阳性比假阴性更重要,假阴性比假阳性更重要,以及这两种错误同等重要

一个假阳性是当一个条件不存在时对其存在的不正确识别。

假阴性是对实际存在的条件不存在的错误识别。

假阴性比假阳性更重要的一个例子是癌症筛查。与其说有人得了癌症,后来才发现没有,不如说有人没得癌症。

这是一个主观的论点,但从心理学的角度来看,假阳性可能比假阴性更糟糕。例如,赢得彩票的假阳性可能比假阴性更糟糕,因为人们通常不会期望赢得彩票。

问:监督学习和无监督学习有什么区别?给出具体的例子

监督学习涉及学习基于示例输入-输出对将输入映射到输出的函数[1]。

例如,如果我有一个包含两个变量的数据集,年龄(输入)和身高(输出),我可以实现一个监督学习模型,根据年龄预测一个人的身高。

由作者创建

与监督学习不同,非监督学习用于从输入数据中进行推断和发现模式,而不参考标记的结果。无监督学习的一个常见用途是根据购买行为对客户进行分组,以找到目标市场。

查看我的文章' 六分钟解释所有机器学习模型 '如果你想了解更多这方面的信息!

问:假设您需要使用多元回归生成一个预测模型。解释你打算如何验证这个模型

有两种主要方法可以做到这一点:

A)调整后的 R 平方

r 平方是一种度量,它告诉你因变量的方差在多大程度上是由自变量的方差来解释的。更简单地说,当系数估计趋势时,R 平方表示最佳拟合线周围的散布。

然而,添加到模型中的每个额外的独立变量总是增加 R 平方值——因此,一个有几个独立变量的模型可能看起来更适合,即使它不是。这就是调整后的 R 的用武之地。调整后的 R 补偿每个额外的独立变量,并且仅在每个给定变量将模型改进到超出概率可能的程度时才增加。这很重要,因为我们正在创建一个多元回归模型。

B)交叉验证

大多数人常用的方法是交叉验证,将数据分成两组:训练数据和测试数据。参见第一个问题的答案,了解更多信息。

问:NLP 代表什么?

NLP 代表自然语言处理。它是人工智能的一个分支,赋予机器阅读和理解人类语言的能力。

问:什么时候你会使用随机森林来对抗 SVM,为什么?

为什么随机森林是比支持向量机更好的模型选择,有几个原因:

  • 随机森林允许您确定要素的重要性。SVM 不能这么做。
  • 随机森林比 SVM 建造起来更快更简单。
  • 对于多类分类问题,支持向量机需要一种 one-vs-rest 方法,这种方法扩展性差,占用内存多。

问:什么是主成分分析?解释你会用主成分分析来解决哪类问题。

从最简单的意义上来说,PCA 涉及将高维数据(例如 3 维)投影到更小的空间(例如 2 维)。这导致数据的维度降低(2 维而不是 3 维),同时保持模型中的所有原始变量。

PCA 通常用于压缩目的,以减少所需的内存并加速算法,以及用于可视化目的,使汇总数据更容易。

问:为什么朴素贝叶斯这么差?如何改进使用朴素贝叶斯的垃圾邮件检测算法?

朴素贝叶斯的一个主要缺点是,它有一个很强的假设,即假设这些特征彼此不相关,但事实通常并非如此。

改进这种使用朴素贝叶斯的算法的一种方法是对特征去相关,使得假设成立。

问:线性模型的缺点是什么?

线性模型有几个缺点:

  • 线性模型有一些强有力的假设,在应用中可能不成立。它假设线性关系、多元正态性、没有或很少多重共线性、没有自相关和同方差
  • 线性模型不能用于离散或二元结果。
  • 您不能改变线性模型的模型灵活性。

问:你认为 50 个小决策树比一个大决策树好吗?为什么?

问这个问题的另一种方式是“随机森林是比决策树更好的模型吗?”答案是肯定的,因为随机森林是一种集成方法,需要许多弱决策树来形成强学习器。随机森林更准确、更健壮,并且不容易过度拟合。

问:为什么均方差不是衡量模型性能的好方法?你有什么建议?

均方误差(MSE)对大误差给予相对较高的权重,因此,MSE 往往过于强调大偏差。更可靠的替代方法是 MAE(平均绝对偏差)。

问:线性回归需要哪些假设?如果这些假设中的一些被违反了呢?

这些假设如下:

  1. 用于拟合模型的样本数据是代表人口的
  2. X 和 Y 的均值之间的关系是线性****
  3. 残差的方差对于 X 的任何值都是相同的(同方差)****
  4. 观察是相互独立的
  5. 对于 X 的任意值,Y 都是正态分布

极端违反这些假设将使结果变得多余。对这些假设的小的违反将导致估计的更大的偏差或方差。

问:什么是共线性,如何处理共线性?如何去除多重共线性?

当多元回归方程中的一个自变量与另一个自变量高度相关时,就存在多重共线性。这可能是有问题的,因为它破坏了一个独立变量的统计意义。

您可以使用方差膨胀因子(VIF)来确定自变量之间是否存在多重共线性-标准基准是,如果 VIF 大于 5,则存在多重共线性。

问:如何检查回归模型是否很好地拟合了数据?

有几个指标可供您使用:

R 平方/调整后的 R 平方:**相对拟合度。这在之前的回答中已经解释过了

****F1 得分:评估所有回归系数都等于零的原假设与至少一个不等于零的替代假设

RMSE: 绝对契合度。

什么是决策树?

图片来自 Kaggle

****决策树是一种流行的模型,用于运筹学、战略规划和机器学习。上面的每个方块被称为一个节点,节点越多,你的决策树就越精确(一般来说)。决策树中做出决策的最后节点被称为树的。决策树直观且易于构建,但在准确性方面有所欠缺。

问:什么是随机森林?为什么好?

随机森林是一种建立在决策树基础上的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。依靠“多数获胜”模型,它降低了单个树出错的风险。

例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是随机森林的力量。

随机森林提供了其他几个好处,包括强大的性能,可以模拟非线性边界,不需要交叉验证,并赋予功能重要性。

问:什么是内核?解释内核技巧

核是一种计算两个向量 𝐱 x 和 𝐲 y 在某个(可能是非常高维的)特征空间内点积的方法,这就是为什么核函数有时被称为“广义点积”[2]

核心技巧是一种使用线性分类器来解决非线性问题的方法,方法是将线性不可分的数据转换为高维线性可分的数据。

摘自分析 Vidhya

问:在拟合 SVM 之前进行降维是否有益?为什么或为什么不?

当特征的数量大于观察的数量时,那么执行维数减少通常会改善 SVM。

感谢阅读!

如果你喜欢我的工作,想支持我…

  1. 支持我的最好方式就是在媒体这里关注我
  2. 在成为第一批在Twitter上关注我的人之一。我会在这里发布很多更新和有趣的东西!
  3. 此外,成为第一批订阅我的新 YouTube 频道 这里
  4. LinkedIn 这里关注我。
  5. 在我的邮箱列表** 这里注册。**
  6. 查看我的网站,terenceshin.com

参考

[1] Stuart J. Russell,Peter Norvig,人工智能:一种现代方法(2010 年),普伦蒂斯霍尔

[2]阿列克谢·格里戈里耶夫,如何直观地解释什么是内核? (2016),栈交换

相关文章

** [## 6 分钟解释所有机器学习模型

最流行的机器学习模型的直观解释。

towardsdatascience.com](/all-machine-learning-models-explained-in-6-minutes-9fe30ff6776a) [## 数据科学家的 40 个统计面试问题和答案

为你的面试复习统计知识的资源!

towardsdatascience.com](/40-statistics-interview-problems-and-answers-for-data-scientists-6971a02b7eee)**

准备数据科学面试的 20 个机器学习相关问题

原文:https://towardsdatascience.com/20-machine-learning-related-questions-to-prepare-for-interviews-93bcba72f911?source=collection_archive---------7-----------------------

Clem Onojeghuo 在 Unsplash 拍摄的照片

自信的指甲数据科学访谈,第 1 部分

机器学习相关的问题在面试中总是占很大一部分。数据科学家、机器学习工程师等职位要求潜在候选人对机器学习模型有全面的了解,并熟悉使用这些模型进行分析。在与面试官讨论你的一些项目以展示你对某些模型的理解时,面试官会问一些关于模型选择、特征选择、特征工程、模型评估等基本的机器学习问题。在这篇文章中,我将讨论 20 个与机器学习相关的问题,并解释我如何在面试中回答这些问题。

型号规格

1、什么是有监督的机器学习问题,什么是无监督的机器学习问题?

通过检查问题中是否有要预测的目标值或标签,可以很容易地区分它们。监督机器学习将数据与目标值进行映射,以便模型将使用从数据中提取的特征来预测目标值。例如,用线性回归来预测房价;使用逻辑回归预测一个人是否会拖欠债务。

无监督的机器学习问题没有预测的目标值,但正在学习从数据中发现一般模式。例如,基于模式对数据进行聚类;基于特征方差的降维。

2、什么是分类问题,什么是回归问题?

分类问题和回归问题都是有监督的机器学习问题,因此问题中存在目标值。分类问题具有代表类别的离散目标值。对于二元分类问题,只有正类和负类。回归问题需要预测连续的目标值,如房价、等待时间等。

3、一个机器学习模型的参数和超参数是什么?

参数是在模型的拟合过程中生成的,而超参数是默认定义的或通过 GridSearchCV 搜索指定的。以岭回归为例,参数是所有特征的系数,而超参数是指定模型中正则化级别的α。

4、什么是 logistic 回归的成本函数?

逻辑回归使用交叉熵作为成本函数:

具有交叉熵的成本函数同时惩罚不确定性和不正确的预测。以高置信度做出的不正确预测对总和的影响最大。例如,当 y_j = 0,而你的模型预测 f (X_j) = 0.9 时。代价将是-log(0.1),接近无穷大。

5、什么是 SVM,什么是支持向量?

支持向量机(SVM)是一种监督机器学习算法,通常用于解决二分类问题。它还可以应用于多类分类问题和回归问题。

支持向量是距离分离超平面最近的数据点。它们是最难分类的数据点。此外,支持向量是训练集的元素,如果被移除,其将改变划分超平面的位置。我有一篇文章解释了更多关于 SVM 的概念:

[## 用数学细节解释支持向量机

支持向量机(SVM)是一种监督机器学习算法,通常用于解决二元…

towardsdatascience.com](/explain-support-vector-machines-in-mathematic-details-c7cc1be9f3b9)

6、什么是梯度下降和随机梯度下降?

每个机器学习模型都有一个代价函数 J (θ_0,θ_1,…θ_n),其中θs 是参数。为了在拟合过程中找到最佳参数,我们正在解决一个优化问题:

最小 J (θ_0,θ_1,…θ_n)

w.r.t θ_0,θ_1,…θ_n

梯度下降通过一阶迭代解决了这个问题:

它从θs 的随机值开始,并根据一阶偏导数不断更新θs。当偏导数为正时,我们减小θ,反之亦然:

当偏导数达到零或足够接近零时,迭代停止并达到局部/全局最小值。ɳ是学习率,当它很小时,它需要更长的时间来收敛,但如果它很大,成本函数可能不会在每次迭代中减少,在某些情况下可能会发散。

随机梯度下降是一种优化方法,它单独考虑每个训练观察,而不是一次全部考虑(正常梯度下降会这样)。它不是计算成本函数的精确梯度,而是使用每个观察值来估计梯度,然后在该方向上迈出一步。虽然每个单独的观察将提供真实梯度的差的估计,但是给定足够的随机性,参数将收敛到良好的全局估计。因为随机梯度下降每次只需要考虑一个观测值,所以它可以处理太大而不适合内存的数据集。

7、K-means 怎么选 K?

我们选择预先在 K-means 算法中定义的聚类数,并且 K 值在技术上和实践上都是确定的。

首先,我们需要绘制肘形曲线,该曲线测量相对于 K 的失真(距聚类中心的平方距离的平均值)或惯量(样本距最近聚类中心的平方距离的总和)。注意,随着 K 的增加,我们将始终减少失真和惯量,如果 K 等于数据点的数量,则它们的值将为零。我们可以使用肘形曲线来检查下降速度,并在值下降相当慢时选择“肘点”处的 K。

实际上,我们需要选择更容易解释或者实际可行的 K。例如,如果您的公司只有资源(劳动力和资本)将客户分为三类,那么您必须将 K 设置为 3。

8、什么是在线学习?

在线学习是用新数据更新拟合,而不是重新拟合整个模型。它通常应用于两种情况。一种是当您的数据按顺序出现时,您希望逐步调整您的模型以适应新数据。另一种情况是,当您的数据太大而无法一次全部训练时,您可以使用随机梯度下降或根据您使用的模型指定批量大小。

模型评估

9、欠拟合和过拟合有什么区别?

欠拟合是指模型不够复杂,无法学习数据模式,过拟合是指模型过于复杂,拾取的是噪声而不是模式。当拟合不足时,您的模型在训练集和测试集中的性能都很差,您需要包括更多的功能,或者使用更复杂的模型。过度拟合时。该模型将在训练集中表现得非常好,但它不能推广到新数据,这意味着它在测试集中表现很差。您需要使用更简单的模型,或者通过正则化、打包或丢弃来删除一些要素。

10、偏倚和方差之间的权衡是什么?

偏差是衡量你的模型表现有多差,因此它是一个衡量拟合不足的指标。方差是对过度拟合的一种度量,即测量您的模型在多大程度上符合数据中的噪声。

11、什么是正规化,L1 和 L2 的正规化有什么区别?

我们通常在线性模型中使用正则化来控制过拟合。正则化是在拟合模型时将参数的大小添加到成本函数中。因此,它迫使模型选择较少的特征或减少特征参数的大小,并减少过度拟合的机会,尤其是当有大量特征时。

L1 正则化将参数的绝对值添加到成本函数,而 L2 正则化添加参数的平方。在线性回归中,L1 正则化是拉索回归,L2 正则化是岭回归。L1 正则化可以将无用特征的参数降为零,从而可以用于特征选择。L2 正则化不能使任何参数降为零,但可以使值大大降低。此外,由于 L2 使用的是平方值,因此它会严重惩罚“异常值”,即非常大的参数。L1 正则化适用于具有较少特征的模型,每个特征都有较大或中等的影响,而 L2 正则化适用于具有许多特征的模型,每个特征都有较小的影响。

12、如何从贝叶斯的角度解读 L2 正则化?

从贝叶斯的角度来看,参数由以下因素决定:

最大似然估计

其中 p (β|y,X)是后验分布,p (β)是先验分布,p (y|X,β)是似然函数。当忽略先验分布,仅最大化似然函数来估计β时,我们没有任何正则化。当有关于先验分布的假设时,我们增加了正则化,这意味着我们对该模型可以选择的β设置了一些限制。对于 L2 正则化,我们增加了一个假设,即β服从均值等于零的正态分布。

关于贝叶斯统计的更多信息,你可以阅读我的以下文章:

[## 贝叶斯统计终极指南

towardsdatascience.com](/the-ultimate-guide-to-bayesian-statistics-ed2940aa2bd2)

13、如何评价回归模型,如何评价分类模型?(也包括效力)

评价一个模型,需要从技术上和实际上评价它的性能。从技术上讲,根据不同的场景,我们使用 MSE、MAE、RMSE 等来评估回归模型,使用准确度、召回率、精确度、F 值、AUC 来评估分类模型。我有一篇文章描述了评估分类模型的度量标准的选择:

[## 模型评估分类度量的最终指南

将机器学习模型与假设检验相结合。别扯头发了,读读这篇文章。

towardsdatascience.com](/the-ultimate-guide-of-classification-metrics-for-model-evaluation-83e4cdf294d9)

在实践方面,我们需要评估在这种情况下模型是否准备好部署和使用业务度量。如果我们正在改进一个旧模型,我们可以比较旧模型和新模型之间的技术指标,看看新模型是否有更好的性能。如果这是您正在构建的最佳模型,那么您需要用业务度量来定义“良好的性能”。例如,如果我们遵循模型的错误预测,损失是多少,这在很大程度上取决于业务场景。如果发送广告是廉价的,那么模型仍然是好的,以低精度。但是,如果发送广告是昂贵的,那么我们需要有更高的精度。

14、如何评价线性回归模型?

有几种方法可以评估线性回归模型。我们可以使用平均绝对误差(MAE)、均方误差(MSE)、均方根误差(RMSE)等指标来评估模型。请注意,如果您不希望异常值影响您的模型性能,那么您应该使用 MAE 而不是 MSE。除了这些指标,我们还可以使用 R 平方或调整的 R 平方(R2)。R-Squared 是将您构建的模型与基线模型进行比较的度量,其中基线模型始终预测 y 的平均值。

如果您的模型比基线模型差,R 平方可以小于零。校正的 R 平方根据您的模型用于进行预测的要素数量来校正 R 平方。如果增加一个要素并没有比预期更好地提高模型性能,调整后的 R 平方将会降低。

请注意,MAE 和 MSE 在没有上下文的情况下都很难解释,因为它们取决于数据的规模。但是,因为 R 平方具有固定的范围,所以接近 1 的值总是意味着模型对数据拟合得相当好。

15、什么是装袋和助推?我们为什么要使用它们?

Bagging 正在并行训练集成模型。我们有一个用随机选择的子样本(有替换)和特征训练的相同模型的集合。最终预测结合了所有模型的预测。对于分类问题,需要多数票。而对于回归问题,它取所有模型预测的平均值。装袋通常用于对抗过度拟合,随机森林就是一个很好的例子。

Boosting 是垂直训练模型。它采用一系列模型,每个模型都采用前一个模型的输出。它对重新加权的数据进行训练,以专注于以前模型出错的数据。最终的预测在最后被合并成一个加权平均值。Boosting 是一种对抗欠拟合的技术,梯度增强决策树就是一个很好的例子。

你应该在时间序列数据集上使用什么交叉验证技术?

默认的交叉验证技术在将数据拆分到不同的文件夹之前对其进行混洗,这对于时间序列分析来说是不希望的。时间序列数据的顺序很重要,我们不想在未来的数据上训练,也不想在过去的数据上测试。相反,我们需要保持秩序,只训练过去。

有两种方法:“滑动窗口”和“正向链接”。首先,我们保留数据的顺序,并将它们分成不同的文件夹。在滑动窗口中,我们在折叠 1 上训练,在折叠 2 上测试。然后我们在折叠 2 上训练,在折叠 3 上测试。我们将完成,直到我们测试最后一次折叠。在前向链接中,我们在折叠 1 上训练,在折叠 2 上测试。然后我们在折叠 1+2 上训练,在折叠 3 上测试。然后在折叠 1+2+3 训练,在折叠 4 测试。我们会停下来,直到我们测试完最后一次折叠。

数据准备

17、什么是数据规范化,为什么?

数据标准化(或缩放)使所有连续要素的值范围更加一致。对于每个特征,我们减去特征平均值并除以其标准误差或范围。目标是让所有连续的要素都处于相同的比例。数据规范化至少在三种情况下有用:

1,对于使用欧几里得距离的算法:Kmeans,KNN:不同的标度扭曲了距离的计算。

2,对于用梯度下降优化的算法:不同尺度的特征使得梯度下降更难收敛。

3,用于降维(PCA):查找具有最大方差的特征组合

18、如何处理缺失数据?

答案在很大程度上取决于具体的场景,但这里有一些选择:

1,当数据集的大小不会显著减小时,删除丢失的行/列,除非将其过滤掉会使样本有偏差。

2、用均值/中值/众数代替缺失值:可能会有问题,因为它降低了特征的方差,忽略了这个特征与其他特征之间的相关性。

3、通过构建插值器或基于其他特征预测它们来预测值

4、将缺失值作为一个单独的特征:也许某些值是因为特定的原因而缺失的,可以对数据分析有所帮助。

19、如何处理不平衡数据集?

不平衡的数据集使得正常的分类指标,如准确性,不能很好地工作。有几种方法可以处理不平衡的数据集:

1、根据问题选择不同的度量来评估模型:F 值、召回率、准确率等。

从较大的集合中丢弃一些观察值:通过随机丢弃该集合中的一些数据来对较大的集合进行下采样。

3、增加较小集合的观测值:通过制作较小集合中数据点的多个副本(可能导致模型过拟合)或使用合成数据创建(例如 SMOTE)来对较小集合进行上采样,在 SMOTE 中,我们使用较小集合中的现有数据来创建看起来像现有数据点的新数据点。

20、什么是降维?为什么和如何?

降维是在拟合模型之前降低数据的维度(特征的数量)。

维度诅咒 是进行降维的首要原因。维度诅咒是说当维度增加时,首先每个维度的数据密集度降低,其次更高的维度使模型更容易过度拟合。

根据问题的不同,有不同的技术来进行降维。最严格的正向方式做主成分分析(PCA),这是一种无监督的机器学习算法,只保留方差最大的不相关特征。

在文本分析过程中,通常需要降低维数,因为矢量化矩阵是一个稀疏矩阵。哈希矢量器将在将数据拟合到模型中之前降低维度。

这都是准备面试的二十个机器学习相关问题。你可以将它们用作准备面试的清单,或者作为帮助你更好地理解机器学习基础知识的学习指南。我写过其他关于统计学问题的面试指南:

[## 为数据科学面试做准备的 22 个统计问题

自信的钉钉数据科学访谈,第 2 部分

towardsdatascience.com](/22-statistics-questions-to-prepare-for-data-science-interviews-d5651a8b3c56)

概率中的一些练习题:

[## 数据科学面试的 12 个概率练习题

自信地完成数据科学面试,第 3 部分

towardsdatascience.com](/12-probability-practice-questions-for-data-science-interviews-2ec5230304d9)

案例研究问题:

[## 在数据科学面试中组织您对案例研究问题的回答

自信地完成数据科学面试,第 4 部分

towardsdatascience.com](/structure-your-answers-for-case-study-questions-during-data-science-interviews-a14a02d21e6c)

行为问题:

[## 为数据科学面试准备行为问题

自信地完成数据科学面试,第 5 部分

towardsdatascience.com](/prepare-behavioral-questions-for-data-science-interviews-96e97f13be15)

感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!

[## 我的博客文章库

我快乐的地方

zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

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

2020 年 20 分钟数据科学速成班

原文:https://towardsdatascience.com/20-minute-data-science-crash-course-for-2020-8670ad4f727a?source=collection_archive---------12-----------------------

帮助你在顶尖科技公司找到工作的终极资源

图片由阿曼达·福西特提供

这篇文章是一个广泛的速成班,我认为这是成为一名数据科学家需要知道的一些最基本和最有用的概念。我已经把它分成了不同的部分,这样你就可以一点一点地看了。

好吧,这并没有涵盖与数据科学相关的一切(那是不可能的),不,这应该是而不是你用来发展知识和技能的唯一资源…

然而,如果你一无所知,那么这将有助于你很好地理解数据科学的基础知识。如果您对数据科学有所了解,这可以作为一门紧凑的速成课程,用于复习、磨练您的知识和/或找出您知识中的差距。

一如既往,我希望这能对您有所帮助,并祝您在数据科学事业中好运!

目录

  1. 机器学习模型
  2. 统计数据
  3. 概率
  4. 熊猫
  5. SQL &查询
  6. 奖金内容

1.机器学习模型

机器学习模型的基本分段

所有的机器学习模型被分类为监督的非监督的。如果模型是一个监督模型,那么它会被细分为回归分类模型。我们将讨论这些术语的含义以及下面每个类别中对应的模型。

监督学习

监督学习涉及学习基于示例输入-输出对将输入映射到输出的函数。

例如,如果我有一个包含两个变量的数据集,年龄(输入)和身高(输出),我可以实现一个监督学习模型,根据年龄预测一个人的身高。

监督学习的例子

重复一下,在监督学习中,有两个子类别:回归和分类。

回归

回归模型中,输出是连续的。下面是一些最常见的回归模型。

线性回归

线性回归的例子

线性回归的概念就是找到一条最符合数据的直线。线性回归的扩展包括多元线性回归(例如,找到最佳拟合的平面)和多项式回归(例如,找到最佳拟合的曲线)。你可以在我的上一篇文章中了解更多关于线性回归的知识。

决策图表

图片来自 Kaggle

决策树是一种流行的模型,用于运筹学、战略规划和机器学习。上面的每个方块被称为一个节点,节点越多,你的决策树就越精确(一般来说)。决策树的最后一个节点,也就是做出决策的地方,被称为树的。决策树直观且易于构建,但在准确性方面有所欠缺。

随机森林

随机森林是一种基于决策树的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。这有什么意义?依靠“多数获胜”模型,它降低了单个树出错的风险。

例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是随机森林的力量。

StatQuest 做了一项了不起的工作,更详细地说明了这一点。见此处

神经网络

神经网络的可视化表示

一个神经网络是一个受人脑启发的多层模型。就像我们大脑中的神经元一样,上面的圆圈代表一个节点。蓝色圆圈代表输入层,黑色圆圈代表隐藏层,,绿色圆圈代表输出层。隐藏层中的每个节点代表一个输入经过的函数,最终导致绿色圆圈中的输出。

神经网络实际上是非常复杂和非常数学化的,所以我不会进入它的细节,但…

饶彤彤的文章对神经网络背后的过程给出了直观的解释(见此处)。

如果你想更进一步,理解神经网络背后的数学,请点击这里查看这本免费的在线书籍。

如果你是一名视觉/音频学习者,3Blue1Brown 在 YouTube 上有一个关于神经网络和深度学习的惊人系列这里

分类

在分类模型中,输出是离散的。下面是一些最常见的分类模型。

逻辑回归

逻辑回归类似于线性回归,但用于模拟有限数量结果的概率,通常为两个。在对结果的概率建模时,逻辑回归比线性回归更常用,原因有很多(见此处)。实质上,逻辑方程是以这样一种方式创建的,即输出值只能在 0 和 1 之间(见下文)。

支持向量机

一个支持向量机是一种监督分类技术,它实际上可以变得非常复杂,但在最基本的层面上是非常直观的。

让我们假设有两类数据。支持向量机将找到一个超平面或两类数据之间的边界,该边界使两类数据之间的间隔最大化(见下文)。有许多平面可以分隔这两个类别,但只有一个平面可以最大化类别之间的边距或距离。

如果你想了解更多细节,Savan 在这里写了一篇关于支持向量机的文章。

朴素贝叶斯

朴素贝叶斯是数据科学中使用的另一种流行的分类器。背后的想法是由贝叶斯定理驱动的:

虽然有许多关于朴素贝叶斯的不切实际的假设(这就是为什么它被称为‘朴素’),但它已经被证明在大多数情况下都是有效的,而且构建起来也相对较快。

如果你想了解更多,请点击这里

决策树,随机森林,神经网络

这些模型遵循与前面解释的相同的逻辑。唯一区别是输出是离散的而不是连续的。

无监督学习

与监督学习不同,非监督学习用于从输入数据中进行推断和发现模式,而不参考标记的结果。无监督学习中使用的两种主要方法包括聚类和降维。

使聚集

摘自 GeeksforGeeks

聚类是一种无监督的技术,涉及数据点的分组,或聚类。它经常用于客户细分、欺诈检测和文档分类。

常见的聚类技术有 k-means 聚类、分层聚类、均值漂移聚类、基于密度的聚类。虽然每种技术在寻找聚类时有不同的方法,但它们的目标都是一样的。

降维

降维是通过获得一组主变量来减少所考虑的随机变量的数量的过程。简单来说,就是减少特性集的维数的过程(更简单来说,就是减少特性的数量)。大多数降维技术可以分为特征消除特征提取。

一种流行的降维方法叫做主成分分析。

主成分分析

从最简单的意义上来说, PCA 涉及到将高维数据(如 3 维)投影到更小的空间(如 2 维)。这导致数据的维度降低(2 维而不是 3 维),同时保持模型中的所有原始变量。

这涉及到相当多的数学问题。如果你想了解更多…

点击查看这篇关于 PCA 的精彩文章。

如果你宁愿看视频,StatQuest 在 5 分钟内解释 PCA这里

2.统计数字

数据类型

数值:用数字表示的数据;是可以衡量的。既可以是离散也可以是连续

分类:定性数据分类成类别。可以是名义(未排序)或序数(排序数据)。

集中趋势测量

均值:一个数据集的平均值。
中位数:有序数据集的中间;不易受离群值的影响。
模式:数据集中最常见的值;仅与离散数据相关。

差异量数

范围:数据集中最高值和最低值之差。

方差(σ2): 衡量一组数据相对于平均值的分布程度。

标准差(σ): 数据集中数字分布的另一种度量;它是方差的平方根。

Z-score: 确定数据点偏离平均值的标准偏差数。

R-Squared: 拟合的统计度量,表明自变量解释了因变量的多少变化;仅对简单的线性回归有用。

调整后的 R 平方:已针对模型中预测器的数量进行调整的 R 平方的修改版本;如果新项对模型的改进超过偶然的预期,那么它就会增加,反之亦然。

变量之间关系的度量

协方差:测量两个(或多个)变量之间的方差。如果是正的,那么它们倾向于向同一个方向移动,如果是负的,那么它们倾向于向相反的方向移动,如果它们是零,那么它们彼此没有关系。

样本的分母变为(n-1)

相关性:衡量两个变量之间的关系强度,范围从-1 到 1;协方差的标准化版本。一般来说,+/- 0.7 的相关性代表两个变量之间的密切关系。另一方面,介于-0.3 和 0.3 之间的相关性表明变量之间几乎没有关系。

概率分布函数

概率密度函数(PDF): 连续数据的函数,其中任意点的值可以被解释为提供随机变量的值等于该样本的相对可能性。(维基)

概率质量函数(PMF): 离散数据的函数,给出给定值出现的概率。

累积密度函数(CDF): 告诉我们随机变量小于某个值的概率的函数;PDF 的积分。

连续数据分布

均匀分布:所有结果可能性相等的概率分布。

正态/高斯分布:通常称为钟形曲线,与 中心极限定理 有关;平均值为 0,标准偏差为 1。

T-分布:在样本量较小和/r 总体方差未知时用于估计总体参数的概率分布(参见更多 此处 )。

卡方分布:卡方统计量的分布( 此处 )。

离散数据分布

泊松分布:概率分布,表示给定数量的事件在固定时间段内发生的概率。

二项式分布:一系列 n 次独立经历中成功次数的概率分布,每次经历都有自己的布尔值结果(p,1-p)。

朋友圈

描述了分布的性质和形状的不同方面。一阶矩是均值,二阶矩是方差,三阶矩是偏度,四阶矩是峰度。********

准确(性)

真阳性:检测条件出现时的条件。

真否定:不检测条件不存在时的条件。

假阳性:检测条件不存在时的条件。

假阴性:在条件存在时不检测条件。

灵敏度:又称召回;当条件存在时,测量测试检测条件的能力;灵敏度= TP/(TP+FN)

特异性:测量当条件不存在时,测试正确排除条件的能力;特异性= TN/(TN+FP)

预测值阳性:又称精度;对应于条件存在的阳性比例;PVP = TP/(TP+FP)

预测值阴性:对应于不存在条件的阴性比例;PVN = TN/(TN+FN)

假设检验和统计显著性

查看我的文章“尽可能简单地解释假设检验”以获得更深入的解释 这里

零假设:样本观察结果纯粹来自偶然的假设。

备选假设:样本观测值受某种非随机原因影响的假设。

P 值:假设零假设正确,获得某个检验的观测结果的概率;较小的 p 值意味着有更强的证据支持替代假设。

α:显著性水平;当零假设为真时拒绝零假设的概率—也称为1 型错误。

Beta:2 型错误;未能拒绝虚假的零假设。

假设检验的步骤:
1。陈述无效假设和替代假设
2。确定测试规模;是单尾还是双尾检验?
3。计算测试统计和概率值
4。分析结果,拒绝或不拒绝零假设(如果 p 值大于α,不拒绝零假设!)

3.可能性

概率是事件发生的可能性。

条件概率【P(A | B)】是一个事件发生的可能性,基于前一个事件的发生。

独立事件是其结果不影响另一事件结果概率的事件;P(A|B) = P(A)。

互斥事件是不能同时发生的事件;P(A|B) = 0。

贝叶斯定理:确定条件概率的数学公式。“给定 B 的概率等于给定 A 的 B 的概率乘以 A 的概率超过 B 的概率”。

概率的八大法则

  • 规则#1:对于任何事件 A,0≤P(A)≤1换句话说,一个事件的概率范围可以从 0 到 1。
  • 规则 2:所有可能结果的概率总和总是等于 1。
  • 规则#3: P(不是 A)= 1—P(A)这个规则解释了一个事件的概率和它的补事件之间的关系。补充事件是指包含 a 中没有的所有可能结果的事件。
  • 规则#4:如果 A 和 B 是不相交事件(互斥),那么 P(A 或 B)= P(A)+P(B)这被称为不相交事件的添加规则
  • 规则#5: P(A 或 B) = P(A) + P(B) — P(A 和 B)这叫做一般加法法则。
  • 规则#6:如果 A 和 B 是两个独立事件,那么 P(A 和 B)= P(A) P(B)*;这被称为独立事件的乘法法则。
  • 规则#7:给定事件 A,事件 B 的条件概率为 P(B|A) = P(A 和 B) / P(A)
  • 规则#8:对于任意两个事件 A 和 B, P(A 和 B)= P(A) P(B | A)*;这被称为通用乘法法则

计数方法

阶乘公式:n!= n x(n-1)x(n-2)x…x 2 x 1 当项目数等于可用位置数时使用。例如:找出 5 个人可以坐在 5 个空座位上的总方式数。
= 5×4×3×2×1 = 120

基本计数原理(乘法) 当允许重复且填充空位的方式数不受之前填充的影响时,应使用此方法。有 3 种早餐、4 种午餐和 5 种甜点。组合总数= 5 x 4 x 3 = 60

排列:P(n,r)= n!/(n r)!
一个代码有 4 个数字,按特定的顺序排列,数字范围从 0 到 9。如果一个数字只能用一次,有多少种排列?
P(n,r) = 10!/(10–4)!=(10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x2 x 1)/(6x 5 x 4 x 3 x2 x 1)= 5040

组合公式:C(n,r)=(n!)/[(n r)!r!] 当不允许替换并且项目的排列顺序不重要时使用。要赢得彩票,你必须从 1 到 52 中以任何顺序选出 5 个正确的数字。有多少种可能的组合?
C(n,r) = 52!/ (52–5)!5!= 2598960

4.熊猫

Pandas 是 Python 中的一个软件库,用于数据操作和分析。这在数据科学领域是普遍现象,必须了解!下面是学习熊猫基本功能的指南。

设置

导入熊猫库

import pandas as pd

创建和读取数据

创建数据框架

数据帧只是一个由多个数组组成的表。在下面的示例中,代码将创建一个包含 ABC 和 DEF 两列的表。

pd**.DataFrame**({'ABC':[1,2,3],'DEF':[4,5,6]},index=[1,2,3])

创建一个系列

系列是一系列值,也称为列表。从视觉角度来看,想象它是表格中的一列。

pd**.Series**([1,2,3],index=[], name ='ABC')

将 CSV 文件读入数据帧

获取数据的最常见方式。这将 CSV 文件转换为数据帧。

# example
df = pd**.read_csv**("filename.csv", index_col=0)

将数据帧转换为 CSV 文件

反之亦然,如果您想将 DataFrame 转换成 CSV,可以使用下面的代码:

# example
df**.to_csv**("filename.csv", index_col=0)

确定数据帧的形状

这将告诉您数据帧有多大,格式是什么(行,列)。

df**.shape()**

查看数据帧的前 5 行

如果你想直观地了解数据帧的样子。head() 返回给定数据帧的前 5 行。

df**.head()**

查看一列或多列的数据类型

# For one column
df.variable**.dtype**# For all columns
df**.dtypes**

将列转换为另一种数据类型

如果您想将整数转换成浮点数(反之亦然),这是很有用的。

df.variable**.astype()**

操作数据帧

从数据帧中选择系列

# a) Method 1
df.property_name# b) Method 2
df['property_name']

索引系列

# if you want to get the first value in a series
df['property_name'][0]

基于索引的选择

基于索引的选择根据数据在数据帧中的数字位置检索数据。它遵循行优先,列第二的格式。Iloc 的索引方案是这样的:的第一个数字是包含性的,而的最后一个数字是排他性的

df**.iloc[]**

基于标签的选择

基于标签的选择是索引数据帧的另一种方式,但它基于实际数据值而不是数字位置来检索数据。Loc 的索引方案使得的第一个和最后一个值都包含在内。

df**.loc[]**

使用现有列设置索引

因为基于标签的选择依赖于数据帧的索引,所以可以使用。set_index() 将一列分配给索引。

df.**set_index**("variable")

基于条件标签的选择

我们也可以使用基于标签的选择来过滤出数据帧。

# a) Single Condition 
df.loc[df.property_name == 'ABC']# b) Multiple conditions using AND
df.loc[df.property_name == 'ABC' & df.property_name == 'DEF']# c) Multiple conditions using OR
df.loc[df.property_name == 'ABC' | df.property_name == 'DEF']

选择值在值列表中的位置

我们也可以使用 isin() 来过滤数据帧。如果你懂 SQL,它类似于 WHERE ___ IN()语句。

df.loc[df.property_name.**isin**(['ABC','DEF'])

选择值为空/不为空的位置

第一行代码将过滤 DataFrame,只显示属性名为 null 的行。
反之亦然,第二行代码用 filter it 使属性名不为空。

df.loc[df.property_name**.isnull**()]df.loc[df.property_name**.notnull()**]

添加新列

df['new_column'] = 'ABC'

重命名列

您通常会希望将列重命名为更容易引用的名称。使用下面的代码,列 ABC 将被重命名为 DEF。

df.**rename**(columns={'ABC': 'DEF'})

汇总函数

。描述()

这给出了数据帧或变量的高级摘要。它是类型敏感的,这意味着与字符串变量相比,数字变量的输出是不同的。

df**.describe()**
df.variable**.describe()**

。平均值()

这将返回变量的平均值。

df.variable**.mean()**

。唯一()

这将返回变量的所有唯一值。

df.variable**.unique()**

。值计数()

这显示了唯一值的列表以及数据帧中出现的频率。

df.variable.**value_counts()**

映射函数

。地图()

映射用于通过函数将一组初始值转换为另一组值。例如,我们可以使用映射将列的值从米转换为厘米,或者我们可以将这些值标准化。

。map()用于转换一个序列。

df.numerical_variable**.map()**

。应用()

。apply()类似于。map(),只是它转换整个数据帧。

df.numerical_variable**.apply()**

分组和排序

。groupby()

获取变量的每个值的计数(与 value_counts 相同)

df**.groupby**('variable').variable**.count()**

获取变量的每个值的最小值

df**.groupby**('variable').variable**.min()**

获取变量的每个值的汇总(长度、最小值、最大值)

df**.groupby**(['variable']).variable.**agg([len, min, max])**

多重索引

df.groupby(['variable_one', 'variable_two'])

对数据帧排序

按一个变量排序

df.**sort_values**(by='variable', ascending=False)

多变量排序

df.sort_values(by=['variable_one', 'variable_two'])

按索引排序

df**.sort_index()**

处理缺失数据

处理缺失数据是 EDA 中最重要的步骤之一。下面是一些处理缺失数据的方法。

删除包含空值的行

如果您有一个包含大量行的数据帧,并且您能够完全删除包含空值的行,那么。dropna()是一个有用的工具。

df.**dropna()**

删除包含空值的列

这与上面的类似,除了它删除任何具有空值的列而不是行。

df.**dropna(axis=1)**

填充缺失值

如果您希望填充缺少的值,而不是完全删除行或列,可以使用下面的代码:

df.variable**.fillna**("n/a")

替换值

假设有一个数据帧,其中有人已经用“n/a”填充了缺失值,但是您希望用“unknown”填充缺失值。那么您可以使用下面的代码:

df.variable**.replace**("n/a", "unknown")

组合数据

。concat()

当您想要合并具有相同列的两个数据帧时,这很有用。例如,如果我们想将一月份的销售额和二月份的销售额结合起来分析长期趋势,您可以使用以下代码:

Jan_sales = pd.read_csv("jan_sales.csv")
Feb_sales = pd.read_csv("feb_sales.csv")**pd.concat**([Jan_sales, Feb_sales])

。加入()

如果您想要合并具有公共索引的两个列(例如 customer_id),那么您可以使用。加入()。

使用上的参数确定要连接的列。

要确定它是左连接、右连接、内连接还是外连接,可以使用参数 how

# example
table_1.**join**(table_2, on='customer_id', *how='left')*

如果你不了解 SQL joins,在这里阅读。本质上是一样的想法。

5.SQL 和查询

定义

,也称为记录,*是代表单个实体的属性(变量)的集合。例如,一行可能代表一个住院病人,可能有年龄、体重、身高等属性/变量…*

是具有相同属性(相同变量)的行的集合。对我帮助最大的是把一个表格想象成一个 Excel 表格。

表格示例

查询是从数据库表或表的组合中请求数据。使用上面的表格,如果我想找到所有年龄大于 23 岁的病人,我将编写一个查询*。*

如何编写 SQL

因为这是给初学者的教程,所以如果你想从一个表中提取数据,我将向你展示如何编写一个查询。

一个基本查询有五个组成部分:

  1. 选择(必填)
  2. 从(必填)
  3. 其中(可选)
  4. 分组依据(可选)
  5. 排序依据(可选)

其结构如下:

***SELECT**
   [column_name_1],
   [column_name_2],
   [column_name_n]
**FROM**
   [table_name]
**WHERE**
   [condition 1]
**GROUP BY** [column_name] 
**ORDER BY** [column_name]*

让我们带回我的例子作为参考:

1.选择(必填)

SELECT 确定要从给定的表中提取哪些列。例如,如果我想提取名称,那么我的代码应该是这样的:

*SELECT Name*

一个巧妙的技巧是,如果你想拉所有的列的,你可以使用星号——见下文:

*SELECT **

2.从(必填)

FROM 确定您要从哪个表中提取信息。例如,如果您想要提取患者的姓名,您可能想要从名为 patient_info 的表中提取数据(见上文)。代码看起来会像这样:

*SELECT
   Name
FROM
   patient_info*

这是您的第一个函数查询!让我们来完成另外 3 个可选步骤。

3.其中(可选)

如果您想选择年龄超过 23 岁的患者的姓名,该怎么办?这就是我们的用武之地。 WHERE 是用来过滤您的表的语句,就像您在 Excel 中使用过滤工具一样!

获取 23 岁以上患者姓名的代码在左边。右侧显示了一个可视化表示:

如果想要满足两个子句的患者姓名,可以使用。例如,查找年龄超过 23 岁且体重超过 130 磅的患者的姓名。

*SELECT
   Name
FROM
   patient_info
WHERE
   Age > 23
   AND
   Weight_lbs > 130*

如果您想要满足两个子句之一的的患者姓名,您可以使用或**。例如,查找小于 22 岁或大于 23 岁的患者的姓名。****

*SELECT
   Name
FROM
   patient_info
WHERE
   Age < 22
   OR
   Age > 23*

4.分组依据(可选)

GROUP BY 正如它所说的那样— 它将具有相同值的行分组到汇总行中。它通常与计数、最小值、最大值、总和、AVG 等聚合函数一起使用。

让我们用下面的例子:

如果我们想得到每个病人去医院的次数,我们可以使用下面的代码并得到下面的结果:

5.排序依据(可选)

ORDER BY 允许您根据特定属性或多个属性按升序或降序对结果进行排序。我们来举个例子。

*SELECT
   *
FROM
   patient_info
ORDER BY
   Age asc*

“ORDER BY Age asc”意味着您的结果集将按年龄以升序对行进行排序(参见上图中的左表)。如果你想按降序排列(上图的右边表格),你可以用 desc 代替 asc

现在你已经学习了基本结构,下一步是学习 SQL 连接,你可以在这里阅读

6.额外内容

如果你读到了最后,恭喜你!我希望这能激励你继续你的数据科学之旅。事实是,关于我写的每个主题,还有很多东西需要学习,但幸运的是,有成千上万的资源可供您使用!

以下是一些额外的资源和教程,您可以用来继续学习:

感谢阅读!

如果你喜欢我的工作,想支持我…

  1. 支持我的最好方式就是在媒体上关注我这里**
  2. Twitter 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
  3. 此外,成为第一批订阅我的新 YouTube 频道 这里
  4. 关注我LinkedIn这里。**
  5. 在我的邮箱列表* 这里报名。***
  6. 看看我的网站,【terenceshin.com】****

21 种更热门的数据工具以及它们不做的事情

原文:https://towardsdatascience.com/20-more-hot-data-tools-and-what-they-dont-do-46bc365bea74?source=collection_archive---------34-----------------------

照片通过 Unsplash

在过去的几个月里,随着部分堆栈的整合和新挑战的出现,数据生态系统继续蓬勃发展。我们帮助利益相关方驾驭这一生态系统的第一次尝试强调了 25 种热门的新数据工具和它们不做的事情 —阐明了特色公司和项目解决了和没有解决的具体问题。

这项工作得到了数据科学、工程和分析社区的积极响应,并激发了比我们最初预期更多的参与。此外,我们很高兴看到最初的帖子激发了其他发人深省的文章,如 20 个热门的新数据工具及其早期上市策略

更进一步

无论如何,我们很快意识到我们最初的帖子不够深入,因为我们收到了几十封电子邮件、Twitter 消息和关于其他未涵盖的解决方案的 Slack DMs。我们已经揭示了数据工具和平台不断扩展的宇宙中的一个小角落,然而还有机会覆盖更多。

虽然我们不能在一篇后续文章中记录每一个额外的数据工具,但在这里,我们将继续努力,通过强调几个额外的工具来培育这个生态系统。这些工具的创造者不仅占据了不断发展的现代数据堆栈中有意义的部分,他们还亲切地回应了我们的请求,帮助我们了解它们的位置。

他们在这里用自己的话说。

更多工具和响应

  1. 造船厂:造船厂是一个工作流程编排平台,帮助团队快速启动、监控和共享数据解决方案,而无需担心基础设施管理。它允许用户创建可重复使用的蓝图,在作业之间无缝共享数据,无需任何专有设置即可运行代码,同时动态扩展资源。船厂不是一个无代码工具,不支持数据版本化或数据可视化。
  2. Count : Count 是一个数据笔记本,代替仪表盘进行报表和自助服务,支持数据转换。Count 特别擅长团队协作,使技术和非技术用户能够在同一台笔记本电脑内工作。数数不是数据科学笔记本。
  3. Castor : Castor 在组织关于数据的信息以支持数据发现、GDPR 合规性和知识管理方面是独一无二的。通过即插即用的解决方案,Castor 构建了所有数据资产的全面且可操作的地图。Castor 不是数据可视化或 BI 工具。
  4. Census : Census 在将数据模型从仓库同步到像 Salesforce 这样的商业工具方面独树一帜。它补充了现有的仓库、数据加载器&转换工具,使数据团队能够推动业务运营。它不是一个无代码工具,也不会自动为你的数据建模;它依赖于分析师用 SQL 编写模型。
  5. 迭代地:迭代地是一个模式注册表,帮助团队协作定义、装备和验证他们的分析。通过迭代,您可以更快地交付高质量的分析,并防止破坏信任的常见数据质量&隐私问题。迭代不是 BI 工具、数据管道或转换工具。
  6. StreamSQL : StreamSQL 处理模型特性的部署、版本控制和共享。使用您的定义,它会为服务和培训生成要素。它的注册便于跨团队和模型重用特性。Stream 没有对管理进行建模,并且完全不知道一旦您获得了这些特性,您将如何处理它们。
  7. Xplenty : Xplenty 是一个基于云的 ETL 解决方案,为跨各种来源和目的地的自动化数据流提供简单的可视化数据管道。它在接收大量数据、执行无代码数据转换和调度工作流方面有着独特的优势。Xplenty 不做事件流。
  8. ve tice 在跟踪、记录、组织所有人工智能资产(例如数据集、特征、模型、实验、仪表板、笔记本)和基础领域知识方面独树一帜,能够成功地管理和扩展企业人工智能计划。Vectice 不提供任何运行时或计算环境。
  9. Snowplow Analytics:Snowplow 是一个流行为数据引擎,它擅长从专用的 web/移动/服务器 SDK 生成事件数据,增强这些数据并将其交付到您的数据仓库。Snowplow 不是一个数据集成(ELT)工具,也不是一个通用的流框架,也不是一个 BI 工具。
  10. Datafold : Datafold 在比较 SQL 数据仓库中或跨数据仓库的数据集方面表现得非常出色。它支持在任何大小的表上运行“git diff”。Datafold 本身不是一个数据库(它在现有的基础设施上工作),它不处理文件。
  11. Splitgraph : Splitgraph 是一个用于构建、扩展、版本控制和共享 SQL 数据库的工具,它在增强现有工具方面是独一无二的。Splitgraph 还具有一个数据目录,其中包括 40K 个开放数据集,可以使用任何 SQL 客户端进行查询(和连接)。Splitgraph 不是数据库。
  12. Datacoral : Datacoral 擅长于从基于 SQL 的声明性规范中自动生成数据接收和转换管道,并自动捕获和显示模式级血统。Datacoral 与 Segment 等数据接收工具以及 Airflow 等工作流管理工具配合得很好。Datacoral 不是数据仓库或查询引擎。
  13. Apache Arrow : Apache Arrow 作为一种独立于语言的标准,对于大型表格数据集的快速内存分析处理和高效的进程间传输(开销最小)是独一无二的。虽然旨在作为数据框项目的计算基础,但它不能替代面向最终用户的工具,如 pandas。
  14. Datasaur : Datasaur 通过 ML 辅助建议支持 NLP 标注。它支持劳动力管理,维护数据隐私,并可以通过 API 集成到任何 ML 工作流中。Datasaur 不处理图像/视频标签的边界框。
  15. Datakin : Datakin 是一款 DataOps 解决方案,有助于保证数据管道无中断运行,并且生成的数据可信。它通过自动发现数据沿袭并提供快速识别和解决问题的工具来做到这一点。Datakin 不是数据目录,也不会取代任何现有的数据基础架构组件(工作流程编排、数据处理等)。
  16. ApertureData : ApertureData 是一个数据库,用于存储图像、视频、特征向量等视觉数据,以及注释等相关元数据。它本身支持对媒体对象的复杂搜索和预处理操作,并与基于云的存储和 ML 框架(如 PyTorch/Tensorflow)集成..ApertureData 不从图像/视频中提取元数据或特征。
  17. Orchest : Orchest 擅长通过在浏览器中提供可视化的管道编辑环境来帮助数据科学家交互式地构建数据科学管道。管道步骤是容器化的笔记本或脚本。Orchest 没有取代 Jupyter 笔记本,没有提供无代码工具,也没有自带计算基础设施。
  18. Gazette : Gazette 是一个开源的流媒体平台,它打破了批处理和实时数据之间的鸿沟,使用户能够用恰好一次的语义构建实时应用。它提供实时消息流,这些消息流作为常规文件在云存储中本地持久存储。Gazette 不是 ETL 工具或分析平台。
  19. Coiled : Coiled 擅长使用 Dask 在原生 Python 中扩展数据科学和机器学习工作流,这是人们所熟悉的,被广泛采用,并给出了很好的反馈。Coiled 是一种固执己见的方式,在保持 PyData 生态系统不变的情况下向集群和云发展。Coiled/Dask 不是数据库或 Kubernetes 的替代品。
  20. Upsolver : Upsolver 是一个云原生解决方案,用于在云存储上集成结构化和非结构化数据。它利用一个可视化的 SQL 界面进行快速简单的数据转换。Upsolver 不是一个平台即服务解决方案,它要求开发人员编写额外的代码并学习底层概念来处理数据。
  21. Soda : Soda 在创建和监控数据可观察性度量方面是独一无二的。其开源指标收集代理为数据和分析工程师提供了一个简单、可扩展的框架,以创建跨数据湖和数据仓库的可观察性。Soda 不是一个数据编排、调度或建模框架。

作为作者(莎拉亚伯 & 皮特),我们集体集思广益,讨论如何扩展这项工作,创建一个不断增长的列表,帮助从业者找到并采用正确的工具,帮助创始人找到最佳合作伙伴,帮助投资者将公司与他们的投资主题对应起来。我们期待听到您对最佳媒体的想法,以便在社区的支持下继续这一探索。

每个数据科学家都应该知道的 20 种数字运算

原文:https://towardsdatascience.com/20-numpy-operations-that-every-data-scientist-should-know-fb44bb52bde5?source=collection_archive---------4-----------------------

NumPy 构成了数据科学领域中许多 Python 库的基础。

图片由 Jae Rue 来自 Pixabay

数据科学的一切都始于数据,数据有多种格式。数字、图像、文本、x 光、声音和视频记录只是数据源的一些例子。无论数据以何种格式传入,都需要转换成数字数组进行分析。因此,在数据科学中有效地存储和修改数字数组是至关重要的。

NumPy (数字 Python)是一个科学计算包,它提供了许多创建和操作数字数组的方法。它形成了许多广泛使用的与数据科学相关的 Python 库的基础,如 Pandas 和 Matplotlib。

在这篇文章中,我将介绍 NumPy 数组上 20 种常用的操作。这些操作可分为四大类:

  • 创建数组
  • 操纵数组
  • 组合数组
  • 带数组的线性代数

我们首先需要导入 NumPy:

import numpy as np

创建数组

  1. 特定范围内的随机整数

第一个参数决定了范围的上限。缺省情况下,下限是 0,但是我们也可以指定它。尺寸参数用于指定尺寸,如预期。

我们创建了一个介于 2 和 10 之间的 3x2 整数数组。

2。在 0 和 1 之间随机浮动

介于 0 和 1 之间的一维浮点数组。创建随机噪声数据是有用的。

3。来自标准正态分布的样本

Np.random.randn()用于从标准正态分布(即零均值和单位方差)创建样本。

我们创建了一个有 100 个浮点数的数组。

4。带有 1 和 0 的矩阵

矩阵可以被认为是二维数组。我们可以分别用 0 和 np 个 1 创建一个矩阵。

我们只需要指定矩阵的维数。

5。单位矩阵

单位矩阵是对角线上有一个 1,每隔一个位置有一个 0 的方阵(nxn)。Np.eye 或 np.identity 可以用来创建一个。

6。阿兰格

Arange 函数用于创建在指定间隔内具有均匀间隔的序列值的数组。我们可以指定起始值、终止值和步长。

默认起始值为零,默认步长为一。

7。只有一个值的数组

我们可以使用 np.full. 创建一个在每个位置都有相同值的数组

我们需要指定要填充的尺寸和数量。此外,可以使用 dtype 参数更改数据类型。默认数据类型是整数。

操纵数组

让我们首先创建一个二维数组:

8。散开

Ravel 函数展平数组(即转换为一维数组)。

默认情况下,通过逐行添加来展平数组。通过将 order 参数设置为 F (Fortran 风格),可以将其更改为列方式。

9。重塑

同样,它重塑了一个数组。A 的形状是(3,4),大小是 12。

我们需要保持尺寸,它是每个维度中尺寸的乘积。

我们不必指定每个维度的大小。我们可以让 NumPy 通过传递-1 来计算维度。

10。转置

转置矩阵就是交换行和列。

11。Vsplit

将一个数组垂直拆分成多个子数组。

我们将一个 4x3 的阵列分成 2 个子阵列,形状为 2x3。

我们可以在分割后访问特定的子数组。

我们将一个 6×3 的数组分成 3 个子数组,得到第一个子数组。

12。Hsplit

它类似于 vsplit,但水平工作。

如果我们对一个 6x3 的数组应用 hsplit,得到 3 个子数组,得到的数组将具有(6,1)的形状。

组合数组

在某些情况下,我们可能需要组合数组。NumPy 提供了以多种不同方式组合数组的函数和方法。

13。串联

类似于熊猫的 concat 功能。

我们可以使用 reshape 函数将这些数组转换成列向量,然后垂直连接。

14。Vstack

它用于垂直堆叠数组(一行在另一行之上)。

它也适用于高维数组。

15。Hstack

vstack 相似,但水平工作(列方向)。

带有 NumPy 数组的线性代数(numpy.linalg)

线性代数是数据科学领域的基础。NumPy 是使用最广泛的科学计算库,它提供了大量的线性代数运算。

16。详细信息

返回矩阵的行列式。

矩阵必须是正方形(即行数等于列数)才能计算行列式。对于高维数组,后两维必须是正方形。

17。Inv

计算矩阵的逆矩阵。

矩阵的是与原矩阵相乘时给出单位矩阵的矩阵。不是每个矩阵都有逆矩阵。如果矩阵 A 有逆,则称其为可逆非奇异。

18。Eig

计算方阵的特征值和右特征向量。

19。圆点

计算两个向量的点积,即元素相对于其位置的乘积之和。第一个向量的第一个元素乘以第二个向量的第一个元素,依此类推。

20。马特穆尔

它执行矩阵乘法。

我们已经介绍了 NumPy 的基本操作。NumPy 上有更高级的操作,但最好先理解基础知识。

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

20 个熊猫功能将加速您的数据分析过程

原文:https://towardsdatascience.com/20-pandas-functions-that-will-boost-your-data-analysis-process-f5dfdb2f9e05?source=collection_archive---------3-----------------------

举例说明。

照片由恒电影Unsplash 拍摄

Pandas 是一个主要使用的 python 数据分析库。它提供了许多功能和方法来加快数据分析过程。使 pandas 如此普遍的是它的功能性、灵活性和简单的语法。

在这篇文章中,我将举例说明熊猫的 20 个功能。其中一些很常见,我相信你以前也用过。其中一些对你来说可能是新的。但是,所有这些都会为您的数据分析过程增加价值。

我们开始吧。

import numpy as np
import pandas as pd

1。查询

我们有时需要根据条件过滤数据帧或应用掩码来获得某些值。过滤数据帧的一个简单方法是查询函数。让我们首先创建一个样本数据帧。

values_1 = np.random.randint(10, size=10)
values_2 = np.random.randint(10, size=10)
years = np.arange(2010,2020)
groups = ['A','A','B','A','B','B','C','A','C','C']df = pd.DataFrame({'group':groups, 'year':years, 'value_1':values_1, 'value_2':values_2})df

使用查询功能非常简单,只需编写过滤条件即可。

df.query('value_1 < value_2')

2。插入

当我们想在数据帧中添加一个新列时,默认情况下它会被添加到末尾。然而,pandas 提供了使用插入功能在任意位置添加新列的选项。

我们需要通过传递一个索引作为第一个参数来指定位置。该值必须是整数。列索引从零开始,就像行索引一样。第二个参数是列名,第三个参数是包含值的对象,这些值可以是系列或类似于数组的对象。

#new column
new_col = np.random.randn(10)#insert the new column at position 2
df.insert(2, 'new_col', new_col)df

3。累计和

数据框架包含 3 个不同组的一些年值。我们可能只对每年的值感兴趣,但在某些情况下,我们也需要一个累计和。Pandas 提供了一个简单易用的函数来计算累计和,即 cumsum

如果我们只应用累计和,组(A,B,C)将被忽略。这种累积值在某些情况下可能没有用,因为我们无法区分不同的组。放心吧!这个问题有一个非常简单方便的解决方案。我们可以通过应用分组,然后再应用累加函数。

df['cumsum_2'] = df[['value_2','group']].groupby('group').cumsum()df

4。样品

样本方法允许您从系列数据帧中随机选择数值。当我们想从分布中选择一个随机样本时,这是很有用的。

sample1 = df.sample(n=3)
sample1

我们用 n 参数指定值的数量,但是我们也可以将一个比率传递给 frac 参数。例如,0.5 将返回一半的行。

sample2 = df.sample(frac=0.5)
sample2

为了获得可再现的样本,我们可以使用 random_state 参数。如果将整数值传递给 random_state,则每次运行代码时都会产生相同的样本。

5。其中

“Where”用于根据条件替换行或列中的值。默认的替换值是 NaN,但是我们也可以指定替换值。

df['new_col'].where(df['new_col'] > 0 , 0)

“where”的工作方式是选择符合条件的值,并用指定的值替换剩余的值。其中(df['new_col'] > 0,0) 选择“new_col”中所有大于 0 的值,其余值替换为 0。因此,where 也可以被认为是一个掩码操作。

重要的一点是,这里的对于熊猫和 NumPy 来说并不完全一样。我们可以获得相同的结果,但语法略有不同。使用 DataFrame.where ,选择符合条件的值作为,其他值替换为指定值。 Np.where 还要求指定符合条件的值。以下两行返回相同的结果:

df['new_col'].where(df['new_col'] > 0 , 0)np.where(df['new_col'] > 0, df['new_col'], 0)

6。Isin

在处理数据帧时,我们经常使用过滤或选择方法。 Isin 方法是一种高级过滤。例如,我们可以根据选择列表过滤值。

years = ['2010','2014','2017']
df[df.year.isin(years)]

7。Loc 和 iloc

Loc 和 iloc 用于选择行和列。

  • 位置:按标签选择
  • iloc:按职位选择

loc 用于通过标签选择数据。列的标签是列名。我们需要小心行标签。如果我们不指定任何特定的索引,pandas 默认创建整数索引。因此,行标签是从 0 开始向上的整数。与 iloc 一起使用的行位置也是从 0 开始的整数。

使用 iloc 选择前 3 行和前 2 列:

用 loc 选择前 3 行和前 2 列:

:当使用 loc 时,包括指数的上限,而使用 iloc 时不包括。

选择行“1”、“3”、“5”和列“年”和“值 _1”:

8。Pct_change

此函数用于通过系列中的值计算百分比变化。假设我们有一个包含[2,3,6]的系列。如果我们将 pct_change 应用于这个序列,返回的序列将是[NaN,0.5,1.0]。从第一个元素到第二个元素有 50%的增加,从第二个到第三个元素有 100%的增加。Pct_change 函数在比较时间序列中元素的变化百分比时非常有用。

df.value_1.pct_change()

9。排名

Rank 函数为值分配等级。假设我们有一个包含[1,7,5,3]的序列 s。分配给这些值的等级将是[1,4,3,2]。

df['rank_1'] = df['value_1'].rank()
df

10。融化

Melt 用于将宽数据帧转换为窄数据帧。我所说的宽是指具有大量列的数据帧。一些数据帧的结构是连续的测量值或变量用列来表示。在某些情况下,将这些列表示为行可能更适合我们的任务。考虑以下数据帧:

我们有三个不同的城市,在不同的日子进行测量。我们决定用一列中的行来表示这些日子。还会有一列显示测量结果。我们可以通过使用融化功能轻松实现这一点:

df_wide.melt(id_vars=['city'])

默认情况下,变量和值列的名称是给定的。我们可以使用 melt 函数的参数 var_namevalue_name 来指定新的列名。

11。爆炸

假设您的数据集在单个观测值(行)中包含一个要素的多个条目,但您希望在单独的行中对它们进行分析。

我们希望在单独的行上看到第“1”天“c”的测量值,使用 explode 很容易做到这一点。

df1.explode('measurement').reset_index(drop=True)

12。努尼克

Nunique 计算列或行中唯一条目的数量。它在分类特征中非常有用,尤其是在我们事先不知道类别数量的情况下。让我们看看我们的初始数据框架:

df.year.nunique()
10df.group.nunique()
3

我们可以直接对数据帧应用唯一函数,并查看每列中唯一值的数量:

如果参数设置为 1,nunique 返回每行中唯一值的数量。

13。查找

它可用于根据其他行、列对上的值在数据帧中查找值。这个函数最好通过一个例子来解释。假设我们有以下数据帧:

对于每一天,我们有 4 个人的测量值和一个包含这 4 个人的名字的列。我们希望创建一个新列,在“个人”列中显示个人的度量。因此,对于第一行,新列中的值将是 4(列“Alex”中的值)。

df['Person_point'] = df.lookup(df.index, df['Person'])
df

14。推断 _ 对象

Pandas 支持广泛的数据类型,其中之一是对象。对象包含文本或混合(数字和非数字)值。但是,如果有不同的选项可用,则不建议使用对象数据类型。使用更具体的数据类型可以更快地执行某些操作。例如,我们更喜欢用整数或浮点数据类型来表示数值。

infer_objects 尝试为对象列推断更好的数据类型。考虑以下数据帧:

df2.dtypes
A    object 
B    object 
C    object 
D    object 
dtype: object

所有的数据类型都是对象。让我们看看推断的数据类型是什么:

df2.infer_objects().dtypesA      int64 
B    float64 
C       bool 
D     object 
dtype: object

这可能看起来微不足道,但是在有很多列的情况下绝对有用。

15。内存使用量

Memory_usage()以字节为单位返回每列使用的内存量。这在我们处理大型数据帧时尤其有用。考虑下面有一百万行的数据帧。

df_large = pd.DataFrame({'A': np.random.randn(1000000),
                    'B': np.random.randint(100, size=1000000)})df_large.shape
(1000000, 2)

以及每列的内存使用量(以字节为单位):

df_large.memory_usage()
Index        128 
A        8000000 
B        8000000 
dtype: int64

整个数据帧的内存使用量,以兆字节为单位:

df_large.memory_usage().sum() / (1024**2) #converting to megabytes15.2589111328125

16。描述

Describe 函数计算数字列的基本统计数据,包括计数、平均值、标准偏差、最小值和最大值、中值、第一个和第三个四分位数。因此,它提供了数据帧的统计摘要。

17。合并

Merge()根据共享列中的值组合数据帧。考虑以下两个数据帧。

我们可以基于列中的共享值来合并它们。设置合并条件的参数是“ on 参数。

基于 column_a 中的公共值合并 df1 和 df2。merge 函数的 how 参数允许以不同方式组合数据帧。how 的可能值为“内部”、“外部”、“左侧”、“右侧”。

  • inner:只有在参数指定的列中具有相同值的行(默认值为 how 参数)
  • 外部:所有行
  • 左侧:左侧数据帧中的所有行
  • 右侧:右侧数据帧中的所有行

18。Select_dtypes

Select_dtypes 函数根据对数据类型设置的条件返回数据帧列的子集。它允许使用 includeexlude 参数来包含或排除某些数据类型。

df.select_dtypes(include='int64')

df.select_dtypes(exclude='int64')

19。替换

顾名思义,它允许替换数据帧中的值。

df.replace('A', 'A_1')

第一个参数是要替换的值,第二个参数是新值。

我们还可以同时传入一个字典进行多次替换。

df.replace({'A':'A_1', 'B':'B_1'})

20。应用地图

Applymap 函数用于将函数应用于数据帧的元素。请注意,如果操作的矢量化版本可用,它应该优先于 applymap。例如,如果我们想将每个元素乘以一个数,我们不需要也不应该使用 applymap 函数。在这种情况下,简单的矢量化运算(例如 df * 4)要快得多。

然而,在某些情况下,我们可能没有矢量化运算的选项。例如,我们可以使用熊猫数据帧的 Style 属性来改变数据帧的样式。以下函数将负值的颜色更改为红色。

def color_negative_values(val):
   color = 'red' if val < 0 else 'black'
   return 'color: %s' % color

我们需要使用 applymap 函数将该函数应用于数据帧。

df3.style.applymap(color_negative_values)

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

20 分掌握熊猫时间序列分析

原文:https://towardsdatascience.com/20-points-to-master-pandas-time-series-analysis-f90155ee0e8a?source=collection_archive---------30-----------------------

如何处理时间序列数据?

马库斯·温克勒在 Unsplash 上的照片

时间序列数据有许多定义,所有这些定义都以不同的方式表示相同的含义。一个直截了当的定义是,时间序列数据包括附加到连续时间戳的数据点。

时间序列数据的来源是周期性的测量或观察。我们观察很多行业的时间序列数据。仅举几个例子:

  • 一段时间内的股票价格
  • 每日、每周、每月销售额
  • 过程中的定期测量
  • 一段时间内的电力或天然气消耗率

在这篇文章中,我将列出 20 点,帮助你全面理解如何处理熊猫的时间序列数据。

  1. 不同形式的时间序列数据

时间序列数据可以是特定日期、持续时间或固定定义间隔的形式。

时间戳可以是一天中的日期,也可以是给定日期中的纳秒,具体取决于精度。例如,“2020–01–01 14:59:30”是一个基于秒的时间戳。

2。时间序列数据结构

Pandas 提供灵活高效的数据结构来处理各种时间序列数据。

除了这 3 种结构,Pandas 还支持日期偏移概念,这是一种考虑日历算法的相对持续时间。

3。创建时间戳

最基本的时间序列数据结构是时间戳,可以使用 to_datetimeTimestamp 函数创建

import pandas as pdpd.to_datetime('2020-9-13')
Timestamp('2020-09-13 00:00:00')pd.Timestamp('2020-9-13')
Timestamp('2020-09-13 00:00:00')

4。访问时间戳保存的信息

我们可以获得存储在时间戳中的关于日、月、年的信息。

a = pd.Timestamp('2020-9-13')a.day_name()
'Sunday'a.month_name()
'September'a.day
13a.month
9a.year
2020

5。访问不太明显的信息

时间戳对象还保存关于日期算法的信息。例如,我们可以问这一年是否是闰年。以下是我们可以获得的一些更具体的信息:

b = pd.Timestamp('2020-9-30')b.is_month_end
Trueb.is_leap_year
Trueb.is_quarter_start
Falseb.weekofyear
40

6。欧式日期

我们可以使用 to_datetime 函数来处理欧式日期(即首先是一天)。dayfirst 参数设置为 True。

pd.to_datetime('10-9-2020', dayfirst=True)
Timestamp('2020-09-10 00:00:00')pd.to_datetime('10-9-2020')
Timestamp('2020-10-09 00:00:00')

注意:如果第一项大于 12,熊猫知道它不能是一个月。

pd.to_datetime('13-9-2020')
Timestamp('2020-09-13 00:00:00')

7。将数据框架转换为时间序列数据

to_datetime 函数可以将具有适当列的 dataframe 转换为时间序列。考虑以下数据帧:

pd.to_datetime(df)0   2020-04-13 
1   2020-05-16 
2   2019-04-11 
dtype: datetime64[ns]

8。超出时间戳

在现实生活中,我们几乎总是处理连续的时间序列数据,而不是单个日期。Pandas 也使得处理时序数据变得非常简单。

我们可以将日期列表传递给 to_datetime 函数。

pd.to_datetime(['2020-09-13', '2020-08-12', 
'2020-08-04', '2020-09-05'])DatetimeIndex(['2020-09-13', '2020-08-12', '2020-08-04', '2020-09-05'], dtype='datetime64[ns]', freq=None)

返回的对象是 DatetimeIndex。

创建日期序列有更实用的方法。

9。使用 to_datetime 和 to_timedelta 创建时间序列

可以通过向时间戳添加 TimedeltaIndex 来创建 DatetimeIndex。

pd.to_datetime('10-9-2020') + pd.to_timedelta(np.arange(5), 'D')

“d”用于“day ”,但还有许多其他选项可用。点击可以查看的全部名单。

10。日期 _ 范围功能

它提供了一种更灵活的方法来创建 DatetimeIndex。

pd.date_range(start='2020-01-10', periods=10, freq='M')

periods 参数指定索引中的项数。freq 是频率,M 表示一个月的最后一天。

就 freq 参数的参数而言,date_range 非常灵活。

pd.date_range(start='2020-01-10', periods=10, freq='6D')

我们已经创建了一个频率为 6 天的索引。

11。周期 _ 范围函数

它返回一个 PeriodIndex。语法类似于 date_range 函数。

pd.period_range('2018', periods=10, freq='M')

12。timedelta_range 函数

它返回一个 TimedeltaIndex。

pd.timedelta_range(start='0', periods=24, freq='H')

13。时区

默认情况下,熊猫的时间序列对象没有指定的时区。

dates = pd.date_range('2019-01-01','2019-01-10')dates.tz is None
True

我们可以使用 tz_localize 方法给这些对象分配一个时区。

dates_lcz = dates.tz_localize('Europe/Berlin')dates_lcz.tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>

14。创建一个带有指定时区的时间序列

我们还可以使用 tz 关键字参数创建一个带有时区的时间序列对象。

pd.date_range('2020-01-01', periods = 5, freq = 'D', tz='US/Eastern')

15。偏移

假设我们有一个时间序列索引,并希望偏移特定时间的所有日期。

A = pd.date_range('2020-01-01', periods=10, freq='D')
A

让我们给这个系列增加一个星期的偏移。

A + pd.offsets.Week()

16。移动时间序列数据

时间序列数据分析可能需要移动数据点来进行比较。移位功能及时移位数据。

A.shift(10, freq='M')

17。Shift vs tshift

  • 移位:移位数据
  • tshift:移动时间索引

让我们创建一个带有时间序列索引的数据帧,并绘制它以查看 shift 和 tshift 之间的差异。

dates = pd.date_range('2020-03-01', periods=30, freq='D')
values = np.random.randint(10, size=30)
df = pd.DataFrame({'values':values}, index=dates)df.head()

让我们把原始的时间序列和移动的时间序列一起画出来。

import matplotlib.pyplot as pltfig, axs = plt.subplots(nrows=3, figsize=(10,6), sharey=True)
plt.tight_layout(pad=4)
df.plot(ax=axs[0], legend=None)
df.shift(10).plot(ax=axs[1], legend=None)
df.tshift(10).plot(ax=axs[2], legend=None)

18。使用重采样功能进行重采样

时间序列数据的另一个常见操作是重采样。根据任务的不同,我们可能需要以更高或更低的频率对数据进行重新采样。

重采样创建指定内部的组(或箱),并允许您对组进行聚合。

让我们创建一个包含 30 个值和一个时间序列索引的熊猫序列。

A = pd.date_range('2020-01-01', periods=30, freq='D')
values = np.random.randint(10, size=30)
S = pd.Series(values, index=A)

下面将返回 3 天期间的平均值。

S.resample('3D').mean()

19。Asfreq 功能

在某些情况下,我们可能对特定频率下的值感兴趣。Asfreq 函数返回指定间隔结束时的值。例如,我们可能只需要上一步中创建的序列中每 3 天的值(不是 3 天的平均值)。

S.asfreq('3D')

20。滚动

滚动是对时间序列数据非常有用的操作。滚动意味着创建一个指定大小的滚动窗口,并对该窗口中的数据执行计算,当然,该窗口会滚动数据。下图解释了滚动的概念。

(图片由作者提供)

值得注意的是,计算是在整个窗口都在数据中时开始的。换句话说,如果窗口的大小为三,则第一次聚合在第三行完成。

让我们对我们的系列应用 3 天滚动窗口。

S.rolling(3).mean()[:10]

结论

我们已经全面介绍了熊猫的时间序列分析。值得注意的是,Pandas 提供了更多的时间序列分析。

官方文档涵盖了时间序列的所有函数和方法。乍一看,这似乎是详尽无遗的,但你会通过练习变得舒适。

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

20 个流行的机器学习指标。第 2 部分:排名和统计指标

原文:https://towardsdatascience.com/20-popular-machine-learning-metrics-part-2-ranking-statistical-metrics-22c3e5a937b6?source=collection_archive---------3-----------------------

简要介绍机器学习中用于评估分类、回归、排名、统计、视觉、NLP 和深度学习模型的最重要指标

丹·弗里曼在 Unsplash 上拍摄的照片

介绍

在这篇文章的第一部分,我介绍了用于评估分类和回归模型的 10 个指标。在这一部分中,我将介绍用于评估为排名开发的模型(也称为学习排名)的度量标准,以及统计模型的度量标准。特别是,我将讨论以下 5 个指标:

  • 平均倒数排名(MRR)
  • k 点精度
  • DCG 和 NDCG(归一化贴现累计收益)
  • 皮尔逊相关系数
  • 决定系数(R )

排名相关指标

排序是机器学习中的一个基本问题,机器学习试图根据项目在特定任务中的相关性对项目列表进行排序(例如,根据页面与给定查询的相关性对谷歌页面进行排序)。它在电子商务和搜索引擎中有广泛的应用,例如:

  • 电影推荐(如网飞YouTube ),
  • 谷歌上的页面排名,
  • 在亚马逊上对电子商务产品进行排名,
  • 查询自动完成,
  • vimeo 上进行图片搜索,
  • Expedia / 预订上搜索酒店。

在学习排序问题中,该模型试图预测给定任务的项目列表的排序(或相对顺序)。排序问题的算法可以分为:

  • 逐点模型: 试图预测数据集中每个查询-文档对的(匹配)得分,并使用它对项目进行排序。

  • 列表式模型:尝试直接优化上述评估指标之一的值,对训练数据中的所有查询进行平均。

在评估过程中,给定几个查询的项目列表的基本顺序,我们想知道这些项目列表的预测顺序有多好。

对于评估排名问题,提出了各种度量标准,例如:

  • 维护、修理和更换
  • 精度@ K
  • DCG 和 NDCG
  • 地图
  • 肯德尔氏τ
  • 斯皮尔曼氏 rho

在本帖中,我们关注上面的前 3 个指标,它们是排名问题最流行的指标。

其中一些指标可能非常琐碎,但为了完整起见,我决定涵盖它们。所以请随意跳过你熟悉的那些。没有任何进一步的原因,让我们开始我们的旅程。

11- MRR

平均倒数排名(MRR)是评估排名模型的最简单的指标之一。MRR 本质上是一组查询 Q 的“第一相关项目”的倒数排名的平均值,并且被定义为:

为了说明这一点,让我们考虑下面的例子,其中模型试图通过屏蔽 3 个猜测来预测英语单词的复数形式。在每种情况下,也给出了正确的答案。

该系统的 MRR 可以被发现为:

*MRR = 1/3 (1/2+1/3+1/1)= 11/18

MRR 的局限性之一是,它只考虑其中一个项目(最相关的一个)的排名,而忽略了其他项目(例如介质,因为介质的复数形式被忽略)。对于我们想要浏览相关项目列表的情况,这可能不是一个好的度量。

12-k 精度

k (P@k)处的精度是另一个流行的度量,它被定义为“前 k 个文档中相关文档的数量”:

例如,如果您在 Google 上搜索“洗手液”,在第一页中,10 个链接中有 8 个与洗手液相关,则该查询的 P@10 等于 0.8。

现在要找到一组查询 Q 在 k 处的精度,可以找到 Q 中所有查询的 P@k 的平均值。

P@k 有几个限制。最重要的是,它没有考虑相关文档在前 k 个中的位置。在这种情况下,手动评估模型也很容易,因为只需要检查前 k 个结果来确定它们是否相关。

注意,recall@k 是另一个流行的指标,可以用非常相似的方式定义。

13- DCG 和 NDCG

标准化的贴现累积收益(NDCG)可能是评估学习排序系统的最流行的度量。与之前的指标不同,NDCG 考虑了文档的顺序和相对重要性,并重视将高度相关的文档放在推荐列表的前列。

在给出 NDCG 的官方定义之前,我们先介绍两个相关的指标,累积收益(CG)和折现累积收益(DCG)。

一组检索到的文档的累积增益(CG) 是它们与查询的相关性分数的总和,定义如下。

这里我们假设每个文档与一个查询的相关性分数是给定的(否则它通常被设置为一个常数值)

贴现累积增益(DCG) 本质上是 CG 的加权版本,其中使用对数缩减因子来将相关性分数与结果的位置成比例地贴现。这很有用,因为在实践中,当分析系统的性能时,我们希望给予前几个项目(比后面的项目)更高的优先级。DCG 被定义为:

还有另一个版本的

归一化贴现累积收益(NDCG) 试图进一步增强 DCG,以更好地适应现实世界的应用。由于检索到的项目集在不同的查询或系统中可能大小不同,NDCG 试图使用 DCG 的规范化版本(通过除以理想系统的 DCG)来比较性能。换句话说,它通过相关性对结果列表的文档进行排序,找到位置 p 处的最高 DCG(由理想系统实现),并用于将 DCG 归一化为:

其中,IDCG 是“理想贴现累积收益”,定义如下:

NDCG 是一个流行的指标,但也有其自身的局限性。它的一个主要限制是它不能惩罚结果中的坏文档。它可能不适合测量可能经常有几个同样好的结果的查询的性能(尤其是当我们主要对前几个结果感兴趣时,因为它在实践中是这样做的)。

统计指标

尽管人们可以将机器学习视为应用统计学,并因此将所有的 ML 度量作为某种统计度量,但有一些度量主要由统计学家用来评估统计模型的性能。这里一些流行的指标包括:皮尔逊相关系数、决定系数(R)、斯皮尔曼等级相关系数、p 值等等。这里我们简单介绍一下相关系数,和 R 平方。

14-皮尔逊相关系数

皮尔逊相关系数可能是整个统计学和机器学习领域中最流行的度量之一。它的应用非常广泛,几乎用于统计建模的每个方面,从特征选择和降维,到正则化和模型评估等等。

两个随机变量(或任意两个向量/矩阵)的相关系数显示了它们的统计相关性。

两个随机变量 X 和 Y 线性相关系数定义如下:

这里的μ和σ分别表示每个变量的均值和标准差。

在大多数情况下,变量的基本统计分布是未知的,我们所拥有的只是随机变量的 N 个样本(你可以把它想象成一个 N 维向量)。在这些情况下,我们可以使用两个 N 维向量 X 和 Y 的样本相关系数,如下所示:**

两个变量的相关系数在[-1,1] 中总是一个值。
已知两个变量是独立的当且仅当它们的相关性是 0
****

15-决定系数(R)

决定系数或 R,正式定义为可从自变量预测的因变量方差的比例。

为了更好地理解这意味着什么,让我们假设一个数据集有 N 个样本,对应的目标值为 y_1,y_2,…,y_N。让我们假设我们的模型对这些样本的对应预测值为 f_1,f_2,…,f_N。

现在,我们可以定义以下用于计算 R 的术语:

  • 观察数据的平均值:

  • 总平方和(与数据的方差成比例):

  • 残差平方和,也叫残差平方和:**

那么 R 的最一般定义可以写成如下:

在最好的情况下,模拟值与观察值完全匹配,这导致 R =1
总是预测观察数据平均值的模型将具有 R =0

摘要

在这篇文章中,我介绍了用于评估排名和统计模型性能的 5 个流行指标。在这篇文章的下一部分,我将介绍用于评估计算机视觉、NLP 和深度学习模型性能的 5 个更高级的指标。

参考

[1] Christopher M. Bishop,“模式识别与机器学习”,* springer,2006。***

[2]杰罗姆·弗里德曼、特雷弗·哈斯蒂和罗伯特·蒂布拉尼。”统计学习的要素”,施普林格统计丛书,2001。**

[3] Tilo Strutz,“数据拟合和不确定性:加权最小二乘法的实用介绍及其他”,* Vieweg 和 Teubner,2010 年。***

使用日期和时间的时间序列的 20 个简单而强大的功能

原文:https://towardsdatascience.com/20-simple-yet-powerful-features-for-time-series-using-date-and-time-af9da649e5dc?source=collection_archive---------32-----------------------

时间序列模型的特征工程!

Unsplash 上由 Aron 视觉拍摄的照片

时间序列只不过是相对于时间观察到的一系列数据点。在数据科学中,时间序列主要是一个独立变量,目标是使用历史数据预测未来。传统上,时间序列问题是通过 ARIMA 模型利用其滞后和差分特性来解决的。然而,对于意外事件,记录的信号显示了趋势的更动态的性质,因此仅使用这些传统方法很难获得准确的模型。

时间序列被认为是机器学习中最关键和最难解决的问题之一。

实践者制定了一种现代方法,通过手动特征工程将时间序列转换为表格数据格式来解决机器学习问题。有许多数据集可以用来解决特定的时间序列问题。针对财务、供应链等领域的问题。基于日期和时间的功能可以在捕捉趋势和理解数据方面发挥重要作用,尤其是在时间序列数据方面。

这篇文章主要讲述了一些可以基于日期和/或时间纯粹由创建的特性。这些特性中有一些是非常常用的,但是还有一些特性可能值得关注和考虑。

下面显示的特征工程并不一定意味着它将被机器学习算法作为特征消费,并给出准确的预测。有时,需要不同的维度来更好地查看数据,这只有通过创建此类要素才能实现。

必需的软件包:

  • 熊猫
  • 日期时间
  • 日历

占用检测数据集来自 UCI 机器学习知识库

数据集的示例如下所示:

1.日期:

上面代码的输出

2.时间:

上面代码的输出

3.小时:

上面代码的输出

4.分钟:

上面代码的输出

5.第二:

上面代码的输出

获取每日最低温度的数据集,可在找到。数据集的头部如下所示:

6.一年中的星期:

上面代码的输出

7.一周中的某一天:

上面代码的输出

8.一年中的某一天:

上面代码的输出

9.两个日期之间的天数差异:

此功能计算两个日期之间的天数差异。下面是一个显示今天和过去某个 x 日期之间的例子。

上面代码的输出

10.两个日期在月份上的差异:

这个特性类似于上面我们用月而不是天来计算两个日期之间的差异。下面是一个显示今天和过去某个 x 日期之间的例子。

上面代码的输出

11.离月底还有几天:

这是一个有趣的特性,可以计算离月底还有多少天。在接近月底的趋势下,这真的很有帮助

上面代码的输出

类似地,人们也可以计算 天从月的开始。 也可以算 日 _ 至 _ 感恩节等。

12.一年中的第几个季度:

该功能主要是确定一年中的季度。

上面代码的输出

13:确定是否是季度初:

此功能用于确定日期是否是季度的开始。

上面代码的输出

输出通常是布尔型的。将真假映射到 1 和 0

14:确定是否是季度末:

这与上面的功能相反,在上面的功能中,我们确定日期是否是季度末。

上面代码的输出

15.年份:

该功能用于从日期开始计算

上面代码的输出

16.月份:

该功能用于从日期开始计算月份

上面代码的输出

17.日期:

该功能用于从日期开始计算

上面代码的输出

18.确定它是否是月初:

根据日期,此功能确定它是否是月初

上面代码的输出

19.确定现在是否是月末:

根据日期,此功能确定是否是月末

上面代码的输出

20.确定是否是闰年:

有时,当数据持续时间较长时(比如 10-15 年),或者如果数据的粒度是每年一次,那么这个特性可能非常有用。不用手动查找和创建,人们可以使用 datetime 库直接确定它是否是闰年。

上面代码的输出

结论:

感谢您阅读文章。我希望你会觉得它有用。这些是我在处理时间序列问题时经常用到的一些特征。正如我之前提到的,这有助于发现数据背后隐藏的大量事实。正如有人正确指出的那样——“你越是折磨数据,它就越能说话”。非常感谢任何反馈/意见。如果您知道任何有趣的功能,请发表评论并与社区分享!

对 2020 年的 20 个奇怪而具体的技术预测

原文:https://towardsdatascience.com/20-tech-predictions-for-2020-d08cbfaa050e?source=collection_archive---------14-----------------------

[在此插入已经过度使用的“2020 愿景”笑话]

道格·祖巴在 Unsplash 上的照片

参加一项运动

本文最初是为《T2》《T4》撰写的,这是一份对当今技术挑战进行深入分析的在线杂志。 点击此处进入

就其本质而言,技术的未来很难预测。然而,这不应该阻止我们去尝试,因为…嗯,这很有趣!正如我对 2018 年和 2019 年的预测所示,我似乎也相当擅长这个。那么,2020 年我们会遇到什么呢?以下是我对此事的想法。

1)流动利润参与成为常态

较大的流媒体公司(网飞、Hulu、亚马逊……迪士尼(?))将开始与电影公司分享部分利润,而不是直接购买目录。这将迫使工作室提供更高质量的内容来获得经常性收入,同时允许流媒体公司更好地平衡他们的账目。这也意味着公司可能会变得越来越交织在一起,并将在不久的将来(2021/2022 年)导致一系列垂直整合。

2)苹果收购一家娱乐公司

很多人声称苹果将在 2020 年收购迪士尼或网飞。那些人错了,他们不理解 A)简单的数学和 B)文化在并购中的重要性。你知道哪家公司最适合苹果吗? HBO,凭借其优质的形象和内容(它也急需从已经开始破坏其内在价值的 AT & T 中拯救出来)。收购一家娱乐公司将是明智之举,因为苹果的收入目前停滞不前。像大多数公司一样,它也开始意识到娱乐是下一个大事件。

3)微软进行创纪录的收购

他们度过了一个伟大的 2019 年,这让投资者的期望极高。他们还幸运地处于一个可以满足这些期望的地方:该公司没有像其他一些大型科技公司那样受到那么多的反垄断压力,其多元化的业务意味着如果市场变得更糟,它不太可能受到巨大打击。事实上,2020 年,微软的股票很可能会上涨 20%。

4)两次首次公开募股大获成功

减税和繁荣的生态系统带来的好处不足以重复 2019 年知名科技股的辉煌,以及相应的高投资/选择性盲目。2020 年,投资者将开始寻找知名度稍低、市盈率较低、但具有长期增长潜力的股票。像 AirBnB滴滴出行这样的公司,实际上是盈利的选择 2020 年上市,会在股市上大赚

5)优步关闭 UberEats

UberEats 的 4 岁生日将是它的最后一个生日。这不会是因为运输公司的分公司特别不赚钱吧(其实做的还不错!),而是因为优步只是一家运输公司。随着它遇到越来越多的法律麻烦和挑战,以及食品配送领域的竞争加剧,其首席执行官将宣布是时候专注于基础工作了,并将把 UberEat 卖给出价最高的人。这也将确保在不进一步依赖外部资金的情况下偿还优步堆积如山的债务。

6)网络犯罪重创公共机构

网络犯罪是一个利润导向的行业。因此,我们将看到针对易受攻击目标的攻击增加:市政当局、学校、高等教育机构和研究机构。原因如下:

  • 这些行业拥有大量高度敏感的数据
  • 他们有多个黑客入口
  • 他们资源有限,修补速度缓慢
  • 这些行业的资金通常会在下一年得到保障,这意味着明天的问题会用昨天的解决方案系统地解决。

正因为如此,网络保险将在 2020 年成为必备。

7)滴答被过度讨论

随着脸书慢慢变成一个墓地(无论是思想上还是数字上),Tick-Tock 将成为最新的平台,让许多老年人非常困惑,从而非常愤怒。原因有三:

  • 这是一个中国平台
  • 它被用来创造和提升流行文化
  • 过去它被用来传播政治信息

因此,它的毒性足以在 2020 年竞选期间解决(很少有公司能够梦想的自由营销)。因为欧洲总是落后一年(如果不是更久的话),到 2020 年底,我们将会看到一些“原创”的“思想片段”出现在欧洲的主要报纸上

免费的人工智能助手在网上激增

Alexa 和 Siri 是另一个时代的遗物(抱歉,如果你只是在圣诞节得到了一个)。随着自然语言处理算法变得更容易理解,并在市场中被过度稀释,它们可能会成为品牌的另一个功能,而不是其本身的一项服务。这将导致人工智能助手的民主化,通过网络可以免费使用。

9)亚马逊推出医疗保健服务

2019 年,亚马逊宣布推出亚马逊护理,这是一项新的试点医疗保健服务,最初向其西雅图员工提供。但你可以肯定的是,这种以员工为导向、受地域限制的模式不会持续太久。这有两个原因:亚马逊拥有强大的计算能力和独特的人工智能专业知识,而医疗保健产生了大量数据,这些数据目前没有得到充分利用。

不会有糟糕的结局,对吗?

10)深度造假导致大公司股票下跌

Deepfakes 变得非常非常容易制作。因此,一个 CEO 对一头猪做出不敬的事情的视频出现只是时间问题。那个视频会是假的,但这无关紧要,因为社交算法被调整为让有争议的内容传播得比真相更快。在真相大白之前,倒霉的高管们的股票会暴跌。

11)技术帮助残障员工成长

只要我们愿意去思考,科技就不会本质上是邪恶的,它能以非常切实的方式帮助我们。例如,很有可能士兵穿着外骨骼是乏味的技术废话(对美国来说,一个高中辍学生的生活比一套这样的衣服便宜)。但公司使用完全相同的西装来增加员工数量是完全合理的:失业率低到足以迫使以前被关在门外的员工进入,公司必须接纳他们,让他们享受自己的才华。期待 2020 年关于机器人套装、人工智能眼镜和增强型家庭办公室的讨论。

12)广告接管智能音箱

智能音箱很可能在 2020 年成为抢手货。这不是新闻,本身也不值得预测。然而,人们忽略了一个事实,即这给了广告商一个全新的平台,就像电视支出创下历史新低,广告拦截器开始发挥作用一样。这里重要的是,世界范围内的法规太少,无法阻止他们以最肮脏的方式使用它。这将开始一场定义 2020 年代的战斗:隐私之战。人们很可能会输掉这场战斗,即使他们正在赢得反对面部识别的战斗:面部识别显然太邪恶了,消费者使用案例太少,而语音激活的设备几乎让所有人受益。

13)国际活动中讨论的人工智能疏忽

在 2019 年的大部分时间里,人工智能监管会谈是在以技术为导向的论坛上举行的,而不是在法庭和总统办公室。不再是了。2020 年,世界各地的政府将觉醒并意识到,让公司大规模地为人民做决定对一个国家及其宪法来说是不健康的。如前所述,面部识别很可能是最后一根稻草。

14)联邦快递被收购

联邦快递是濒临灭绝的物种的一部分。它既不整合,也不众包劳动力。证据是在 2019 年 12 月,当时亚马逊宣布其卖家不能再使用它来运送他们的产品。这相当于在公司里膝盖上挨了一枪。随着它的库存慢慢减少,它最终将被一家美国大型零售商收购。这也将是一笔不错的交易:联邦快递将获得更多的配送地点,并节省最后一英里的费用,而零售商将在物流上花费更少的钱。

15)亚马逊达到财务成熟期

多好的短语啊,艾玛莱特?多年来,亚马逊只专注于股东回报的增长(2328.9 亿美元的收入,100.7 亿美元的净收入简直令人发指)。随着公司耗尽扩张空间,需要强大的后盾来抵制反垄断运动,它将向股东支付最高的股息。

16)加密货币卷土重来

但不是那种有趣的嬉皮士。巨大的,公司发行的,私人控制的那种。中国也将引领这种回归,这意味着 2020 年的加密货币将与 2017/2018 年的情况截然相反。恭喜你,密码兄弟,你打破了牢不可破的系统

17)懈怠变得无关紧要

微软用团队杀死了 Slack,只是它还不知道而已。然而,市场确实如此,因为这家奇特的企业信息公司目前的股价比 IPO 价格低 46%。【Slack 不可能活过 2020 年,因为大多数大公司都在整合微软的 Office 365 套件。Slack 很快就会被称为终极潮人信息平台,所有向员工支付乒乓球拍和麦粒的市中心初创公司都在使用它。

18)机器人流程创新成为大新闻

我们正在慢慢制造越来越好的机器人,它们将很快成为少数行业的主食(首先是零售和运输)。由于客户通常是不可预测的怪人,机器人将首先用于改善和加速各种过程,如最后一英里的交付或货架堆叠

hyperloop 首次成功

对埃隆·马斯克来说,2020 年(以及接下来的几年)很可能是这样的:

  • 超回路开启了它的第一条路线,
  • 结果是使用/操作成本太高,
  • 随着创始人专注于自己真正的爱好(火星和迷因),该公司慢慢从公众视野中淡出。
  • hyperloop 的基础技术被出售,并在世界各地用于改善公共交通。

20)对“数字双胞胎”的兴趣激增

2018 年,我将数字双胞胎归类为“非常模糊但非常令人兴奋”。后者与今天相关,但前者不那么相关。Digital twins 集成了机器学习和软件分析,以创建互联物理资产的数字副本,这些资产会随着其物理副本的变化而更新和变化,从而在对象的整个生命周期中提供各种见解。到 2020 年,预计将有 210 亿个连接的传感器和终端,在不久的将来,数字双胞胎将为数十亿件事物存在,即使只是为了在维护和修理方面节省数十亿美元的潜在成本。

上述许多情况看似不可避免,而且往往对整个社会有害。然而,最重要的是要记住,技术是由我们所有人创造、实施和塑造的,我们对它如何影响我们有真正的发言权。这可能小到在 Twitter 上向一家公司发送一条不赞成的消息,也可能大到当一个政客没有把我们的最佳利益放在心上时,就把他赶下台。我们的行动很重要,而确保这些预言成为现实或者不成为现实取决于我们

2019-20 NHL 统计仪表板

原文:https://towardsdatascience.com/2019-20-nhl-statistics-dashboard-881e470ed202?source=collection_archive---------48-----------------------

季后赛前对顶级球员的互动观察

Anders krgh jrgensen 在 Unsplash 上拍摄的照片

正如我在之前的帖子中提到的,我决定利用隔离期间的空闲时间来学习新的方法和应用程序,以处理和呈现所有类型的数据。对我来说幸运的是,Tableau 非常慷慨,在有限的时间内免费提供他们的整个电子学习平台,所以我决定充分利用这个机会,使用 Tableau Public 完成 Tableau 数据分析师课程(专业服务对于在家休闲使用来说太贵了)。Tableau 对于探索和制作有意义的数据洞察力来说,确实是一个非常强大和可定制的体验。

我的大部分数据项目都围绕着金融经济学和商业数据,但随着 NHL 赛季最终计划重新开始,我想在我的研究中增加一些多样化,以及除了专注于人类已知的最佳运动 NHL 曲棍球之外还有什么更好的方式(不是说我有偏见,因为我从会走路起就开始玩这项运动了…但我完全有偏见)。我的第一个仪表板只包含了攻击性统计数据的细目分类,使用了一个单独的仪表板、四五个工作表和一些仪表板操作。但是,任何数据探索者都知道,总会有更多的信息需要传达。

最终产品是我的第一个完整的 Tableau 出版物。这个仪表板实际上由三个独立的仪表板组成,单个球员的原始进攻明细,单个球员的防守明细,以及团队级别统计数据的团队级别比较。我利用了更多的仪表板、动态可视化的参数动作和自定义函数,来制作一个交互式的深度视图,看看球员们目前的位置(或滑冰…哈哈),从统计上来说,是在 NHL 于 8 月份恢复季后赛之前。不幸的是,目前还没有办法将 tableau dash 嵌入到 Medium 中,但是可以通过以下链接找到 dashboard:

https://public.tableau.com/profile/andrew.cole#!/viz home/NHL summary 19-20/TeamComparisonDash

仪表板中团队级别比较统计数据的快照。

如果你碰巧在玩它,请随意评论,推荐,你喜欢的东西,你讨厌的东西。就像我说的,这是我在 Tableau 上的第一个完整产品,要变得更好的唯一方法是确定我需要在哪里变得更好!

最后一件事...加油黑鹰队!

2019 小说《冠状病毒:人们的想法》

原文:https://towardsdatascience.com/2019-novel-coronavirus-peoples-thoughts-8c06c3caf20e?source=collection_archive---------18-----------------------

使用 Twitter 对 2019 年新型冠状病毒爆发进行简单的情感分析

图片来源:NIAIDonFlickr(CC0)

免责声明: 本文旨在适应、学习和理解一个情感分析及其潜在用途。这不是任何官方研究的一部分,研究结果也不适合任何形式的决策。

由于著名的冠状病毒 (nCov-19) ,公众产生了相当大的恐慌。因此,在这篇文章中,让我们来看看公众的恐慌程度和(一些人)使用人们发布的推文的积极程度。

下载数据

在这个实验中,我们将使用标签为#冠状病毒、#COVID19 和#冠状病毒爆发的推文。从 3 月 1 日开始,有 1000 条推文被删除。这些将作为一个json字符串保存到一个名为data.json的文件中,以便于解析。

此外,我们将使用来自 http://www.cs.jhu.edu/~mdredze/datasets/sentiment/的 的数据进行培训。我使用了一个数据集,其中的商品评论从 1 星到 5 星不等。我下载了processed _ stars . tar . gz文件,将子文件夹中的所有all_balanced.review文件提取并聚集到单独的路径data/processed_stars_all。****

通过一点点编码,我们可以轻松地从 twitter 获取数据。在这篇文章中,我已经下载了 1000 条推文。代码应该是这样的:

预处理数据

因为我们是从公共来源下载数据,所以我们必须使用一些预处理,以便为下游分析保留有用的措辞。很少有预处理自然语言内容的常用技术。

符号化

这里我们将文本分解成句子,即句子分词,并将句子再次分解成作品,即单词分词。在本文中,我们将立即执行单词标记化,因为推文大多比典型的社交媒体内容短。

停用词的删除

英语由几个停用词组成,这些停用词在句子中增加意义,但在上下文中没有意义。例如像is are was has等词语。不要为我们的用例增加价值。

词汇标准化

在这个过程中,我们摆脱了单词的形式,从而保留了单一的表征。比如说; 可玩 等。可以将 简化为 并保留核心意思。

这种正常化有两种形式。

  1. 词干 —这就是我们去掉词缀(前缀和后缀)的地方。与单词“ play ”相关的例子就属于这一类
  2. 这就是我们使用上下文感知进行词干提取的地方。例如,知道一个单词是名词还是动词对词干有很大的影响。比如说; 烘干机 可能会变成 烘干机 而实际上它是一个名词。在本文中,为了简单起见,我们将跳过引理满足。

训练模型

机器学习分类的起点之一是朴素贝叶斯分类器。在本文中,我们将使用一个多项式朴素贝叶斯分类器(MNB)** 。术语多项式很重要,因为我们的训练数据集由评论星(1-5 星)组成,因此有 5 个可能的标签。**

输入

我们的输入是压缩文件中的行的形式feature:<count> …. feature:<count> #label#:<label>.第一步,我将创建句子,并以 TF-IDF 格式传输它们。这种格式通常可以补偿出现在多个文档中的常用词。这些词通常信息量较少,因为它们的丰度很高。为了查询简单,我将这些数据存储在一个pandas数据帧中。

训练和预测

下面是我们分析的完整代码。我将在代码下面解释这个过程,这样你可以很容易地理解。

可以通过将我们的数据拟合到模型中来进行训练。在我们的例子中,text_tf = tf.fit_transform(data[‘sentence’]) line 做到了。我们通过在text_tf_tw = tf.transform(sentences_processed_tw)中将 twitter 数据转换成 TF-IDF 形式来执行预测。注意,我们在这里使用预处理的 tweet 文本。这种转换将使用我们在培训中使用的单词语料库。因此,新词或推特用户的俚语不会对我们的分析产生任何影响。我们在predicted_tw = clf.predict(text_tf_tw)行做预测。

这个模型只有大约 70%的准确性,这不是很好,但对于学习和发现来说是一个很好的模型。包含更多社交媒体术语的更大数据集确实会提供更好的训练和准确性。

结果的解释

正如您可能已经在我的代码中注意到的,我们简单地绘制了一个直方图,并使用核密度估计(KDE)图来查看分布的性质。它看起来像下面。

柱状图

KDE 归一化直方图

在该图中,x 轴上的 1-5 对应于恒星或阳性性质。因此,1 表示消极情绪,5 表示积极情绪。我们可以清楚地看到,人们有消极或积极的想法,这清楚地代表了社会的两极分化性质(也可能不是)。

可能的进一步扩展

虽然除了文本之外,我没有使用任何其他信息,但我们可以结合时间序列数据和位置信息,以说明谁有不好的想法,以及恐慌可能如何在各国蔓延。在这个领域进行认真的探索将会带来有趣的商机,比如销售口罩(我很确定企业正在这么做)。

我相信您已经很好地阅读并看到了大数据的潜在力量!

感谢阅读。如果你觉得这很有趣,请留下你的想法。

干杯!

2019 年:新加坡有记录以来最热的一年

原文:https://towardsdatascience.com/2019-singapores-warmest-year-on-record-6b9ab1c42e11?source=collection_archive---------43-----------------------

2019 年,这个城市国家的年平均气温达到 28.44 摄氏度,比 2016 年的纪录高出 0.01 摄氏度

资料图片:蔡金汉

2019 年,全球气温记录大幅下降,科学家宣布,这一年是自 1880 年有记录以来第二热的一年。2010-2019 年也是现代最温暖的十年

新加坡也不例外,2019 年的年平均气温达到 28.44 摄氏度,成为有记录以来最热的一年。根据 T4 国家环境局(NEA)的数据,2019 年也是自 1869 年以来第三干旱的一年。

让我们仔细看看 2019 年的主要天气趋势,以及它们与前几年的对比:

通过繁荣创造的线图竞赛

数据和笔记本

这篇文章的原始数据来自新加坡气象局的网站,该网站有 1980 年以来的公共气象记录。1980 年至 1982 年的许多数据点缺失,因此这里的图表比较期仅限于 1983 年至 2019 年。

天气数据被编辑和重组为两个独立的 CSV 文件,以帮助可视化过程。你可以在这里下载,在这里下载

与这篇文章相关的两个笔记本已经被上传到这个项目的 Github repo。这里有(数据准备),这里有(部分图表)。

图表 1: 2019 年,按年平均温度排名

除了令人担忧的上升趋势之外,图表 1 中令人震惊的是,迄今为止最热的 10 年中有一半来自过去十年——2019 年(第一)、2016 年(第二)、2015 年(第五)、2010 年(第七)和 2014 年(第十)。

2019 年和 2016 年创下的气温纪录也超过了 1997 年和 1998 年的纪录,当时新加坡和世界都感受到了厄尔尼诺效应对的冲击。

根据 NEA 的数据,新加坡 2019 年的年平均温度比 1981-2010 年的长期平均温度高 0.9 摄氏度。

图表 2:温暖的夜晚

不仅仅是白天更暖和。根据天气记录中的每日最低温度,夜间温度也在 2019 年创下新高。

图表 2 中排名前 5 位的年份中有 4 年来自过去十年的后 5 年,这是全球变暖加速的又一个明显迹象。

图表 3: 2019 年,有记录以来第三个最干旱的年份

不出所料,2019 年也是有记录以来最干旱的年份之一。2019 年,新加坡樟宜气候站记录的全年降雨量仅为 1,367.5 毫米。

根据 NEA 的数据,这一数量比 1981-2010 年的长期平均水平低 37%,使 2019 年成为自 1869 年以来有记录以来第三干旱的一年。

2010 年至 2019 年的十年平均气温为 27.95 摄氏度,超过了 2000 年至 2009 年的 27.75 摄氏度和 1990 年至 1999 年的 27.65 摄氏度。但通过绘制 10 年间隔的年度天气模式图,更容易看出这些变化。

让我们比较一下新加坡在过去 40 年(2019 年、2009 年、1999 年和 1989 年)末期的天气模式。

图表 4:2019 年、2009 年、1999 年和 1989 年各月气温变化对比

图表 4 中的红色粗线显示了 2019 年的月平均气温如何普遍超过了 2009 年、1999 年和 1989 年的类似时间点,只有少数例外,如 2009 年 6 月。

其他引人注目的趋势包括:

  • 1 月份平均气温的大幅上升,从 1989 年的 26.5 摄氏度上升到 2019 年的 27.97 摄氏度,上升了 1.47 摄氏度
  • 在 1989 年、1999 年和 2009 年,在熟悉的 6 月至 7 月高峰之后,月平均气温开始下降。但在 2019 年,月气温与年中趋势相反,反而升至 7 月至 9 月期间的新高。2019 年 8 月和 9 月的月平均气温分别为 29.12 摄氏度和 29.03 摄氏度,是新加坡这两个月的最高气温。

图表 5:比较 2019 年、2009 年、1999 年和 1989 年的月降雨量变化

在绘制类似的降雨量而非平均气温图表时,我们可以看到年中趋势的类似变化。在 1989 年、1999 年和 2009 年,6 月西南季风到来后,月总降雨量有所增加。

但在 2019 年,7 月至 9 月的月降雨量降至新低。2019 年 12 月是四年来降雨量最多的一年,但后期的激增不足以弥补今年其他更干燥的月份。正如我们在图表 3 中看到的,2019 年是新加坡有史以来第三干旱的一年。

新常态?

2019 年没有打破任何单日天气记录。例如,1998 年 3 月 26 日,在过去 37 年中记录的最高日最高温度为 36℃。在 2019 年,记录的最高日最高温度是 3 月 12 日,当时樟宜气候站的水银柱达到了 34.8 摄氏度。

同样,2019 年最大的日降雨量仅为 92.2 毫米(10 月 27 日)。这还不到 2011 年 1 月 30 日创下的 216.2 毫米降雨量纪录的一半。

但是总体来看,从上面的图表中可以清楚地看出,新加坡的天气模式已经进入了一个高温少雨的新常态。这不仅会导致更大的个人不适,还会产生相当大的政策影响。

首先,随着家庭更频繁、更长时间地使用风扇和空调,我们可以预计能源消耗将会上升。更干燥的天气意味着新加坡将不得不更多地依赖再生水和海水淡化厂来满足其需求,这反过来又进一步增加了能源的使用。

进入新的十年,还不清楚未来几年新加坡天气模式的变化速度会加快多少。但是套用作家欧内斯特·海明威的话来说,不受欢迎的变化往往会“逐渐地,然后突然地”发生。

和往常一样,如果您发现代码中有任何错误,请 ping 我@

推特: @chinhon

领英:【www.linkedin.com/in/chuachinhon

如果你对研究新加坡的天气数据集感兴趣,这里是我使用相同记录的早期项目:

2019 —伯特和变压器年

原文:https://towardsdatascience.com/2019-year-of-bert-and-transformer-f200b53d05b9?source=collection_archive---------8-----------------------

一篇关于 2019 年 BERT 和 NLP 项目的短文

BERT 论文于 2018 年底发布,之后在 2019 年,我们看到了自然语言处理(NLP)和自然语言理解(NLU)领域的大量活动,从 BERT 在谷歌的搜索生产中使用到其他几个架构,这些架构显示出了比 BERT 更好的结果。BERT 在情感分析、问题回答、句子相似度等多项自然语言处理任务中表现出色。我在 2019 年 1 月使用 BERT 预训练的权重进行了一个项目,所以这可能是因为我在这一领域工作,但我在任何地方都会看到一些关于 BERT 的参考资料——比如中型文章、iOS 上的 BERT、BERT 的硬件加速、Kaggle 比赛、受 BERT 启发的更大模型等。我也认为芝麻街的名字与伯特的流行有一定关系,尽管开创名字潮流的功劳归于来自人工智能艾伦研究所ELMO 论文(深度语境化的单词表达)。BERT 使用双向变压器和许多其他架构,这是在 BERT 也使用了某种形式的变压器之后出现的,基于论文“注意力是你所需要的全部”。

BERT 之前的一些主要 NLP 项目的时间表:

一些主要 NLP 项目的时间表

2013 年发布的 Word2Vec 模型仍然非常受欢迎,它通常是任何 NLP 问题中的第一个尝试。快速文本手套嵌入也非常有用。

语言模型

ELMO— Elmo 使用双向 LSTM。预训练的 Elmo 重量可以从这里下载。要使用 Elmo 嵌入,可以使用 AllenNLP 库、 Tensorflow hubFlair 库。

ULMFiT —杰瑞米·霍华德和塞巴斯蒂安·鲁德的 ULMFiT 论文描述了为特定任务微调语言模型的技术,它使用了 LSTM 的。你可以在这里找到如何使用 ULMFiT 使用 fastai

上述两篇论文出现在 BERT 之前,没有使用基于变压器的架构。

BERT —原文是这里,还有一个很好的教程,里面有 Jay Alammar 的插图这里。预训练的重量可以从官方 Github repo 这里下载。BERT 也可以作为 Tensorflow hub 模块使用。有各种各样的其他库,也可以很容易地使用预训练的嵌入来微调它们,稍后会在本帖中提到。下面的时间线是 2019 年之后出现的一些主要论文。谷歌甚至开始在产品中使用 BERT 来改善搜索结果。

BERT 之后的项目时间表

Transformer-XL2019 年 1 月发布的 Transformer-XL 通过使用一种允许学习超出固定长度上下文的架构,对 Transformer 进行了改进。

《变形金刚》与《进化金刚》的对比— 来源

进化变压器——大约与 Transformer-XL 同时,进化变压器发布,这是一种通过进行基于进化的神经架构搜索(NAS)开发的变压器架构。

GPT-2 —继伯特之后,我认为另一个获得最多新闻报道的项目是 OpenAI 的 GPT-2 ,因为它能够生成几乎类似人类的句子,而且 OpenAI 最初决定不发布最大的模型,因为担心该模型被用于制造假新闻等。近 10 个月后,他们发布了最大的型号。你可以通过拥抱脸https://talktotransformer.com/https://transformer.huggingface.co/玩模型。我想如果它换个名字,甚至是一个芝麻街角色,它会更受欢迎:)

厄尼厄尼 2 —目前厄尼 2.0 在 GLUE 排行榜上排名第一。 Github 回购。

XLNET

RoBERTa —本文公正地衡量了 BERT 的各种超参数的影响,并表明原始 BERT 模型训练不足,通过更多的训练/调整,它可以超越最初的结果。目前,RoBERTa 的结果在 GLUE 排行榜上排名第 8!

Salesforce CTRL — CTRL 模型有 16 亿个参数,并提供控制人工文本生成的方法。

ALBERT —本文描述了参数缩减技术,以降低内存缩减并提高 BERT 模型的训练速度。阿尔伯特·雷波拥有预先训练好的砝码。艾伯特基本模型有 12M 个参数,而伯特基本模型有 110M 个参数!

大鸟

基准测试

评估这些语言模型的方法之一是 Glue Benchmark,它包括评估模型的各种 NLP 任务,如分类、QA 等。在其发布时,BERT 位于该表的顶端,但在短短一年内,它已移动到第 19 位(截至 2020 年 1 月 2 日)。

截至 2020 年 1 月 2 日的 Glue 基准排行榜— 来源

现在有一个强力胶基准测试,由更难的语言理解任务组成。

截至 2020 年 1 月 2 日的强力胶基准排行榜— 来源

对于评估问答系统 ( S 坦福德估计AnsweringDataset)是常用的,BERT 和后来的基于 transformer 的模型也在这里名列前茅:

截至 2020 年 1 月 2 日的 SQuAD 2.0 排行榜— 来源

还有各种其他排行榜,如 ORBOpenBookQA 等关于https://leaderboard.allenai.org/的排行榜,并且在大多数排行榜中都提到了伯特!

其他 BERT 相关项目

蒸馏伯特——更小的伯特使用来自 Huggingface 的模型蒸馏,博文此处

威震天-LM——Nvidia 的高效训练超大型语言模型的项目。

BioBERT——由 DMIS 实验室在生物医学领域训练的基于 BERT 的模型。

德语伯特

CamemBERT —基于脸书罗伯塔建筑的法语语言模型。

BERT 硬件加速——谷歌使用 TPU 更快地训练大型 BERT 模型,其他公司如graph core(code)和 Habana 也展示了他们的定制 SoC 如何加速 BERT 推理和训练。

video Bertvideo Bert是一个跨模态(或多模态)深度学习的例子,其中模型以自我监督的方式从视频中学习。

ViLBERT —学习联合视觉和语言表征的视觉和语言 BERT 模型。

NLP 库

下面是一些我认为在 NLP 领域工作的人必须知道的库

Spacy — Spacy 是一个流行且快速的库,用于各种 NLP 任务,如标记化、词性等。它还带有预先训练好的模型,用于命名实体识别(NER)等。最近它通过 spacy-transformers 增加了对基于 transformer 的语言模型的支持,这个库使用了 Huggingface transformer 库。

这是第一个提供 BERT py torch 实现的库,最初它被称为“PyTorch-pretrained-bert”。后来,他们增加了更多的模型,如 GPT-2,XLNET 等,现在这个库就叫做“变形金刚”。在不到一年的时间里,它已经成为最受欢迎的 NLP 库之一,并使得使用 BERT 和其他模型变得非常容易。使用他们的另一个库(【https://github.com/huggingface/swift-coreml-transformers】)你可以在 iOS 上使用 BERT,GPT-2 等!

AllenNLP —这是艾伦人工智能研究所的 NLP 图书馆,建在 PyTorch 的顶部。

Flair —也是一个 NLP 库,带有 NER、POS 等模型,也支持 BERT、ELMO、XLNET 等嵌入。

gluonlp—它是基于 Apache MXNet 之上的 NLP 工具包,是首批包含预训练 BERT 嵌入的库之一。它有很多有用的例子/教程

希望在 2020 年,自然语言处理领域会有更多的创新和突破。要了解更多关于自然语言处理和人工智能的知识,你可以在 twitter 上关注我——https://twitter.com/MSuryavansh

[## 使用迁移学习进行小数据的自然语言处理

使用较小的数据集实现高文本分类准确率。

blog.insightdatascience.com](https://blog.insightdatascience.com/using-transfer-learning-for-nlp-with-small-data-71e10baf99a6) [## 比以往更好地理解搜索

如果说我在谷歌搜索工作的 15 年中学到了什么,那就是人们的好奇心是无止境的…

www.blog.google](https://www.blog.google/products/search/search-language-understanding-bert/) [## 开源 BERT:自然语言处理的前沿培训

自然语言处理面临的最大挑战之一是训练数据的短缺。因为 NLP 是一个…

ai.googleblog.com](https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html) [## 了解如何让 BERT 变得更小更快

在这篇博文中,我们将讨论如何让像 BERT 这样的大型模型变得更小更快。

blog.rasa.com](https://blog.rasa.com/compressing-bert-for-faster-prediction-2/) [## ALBERT:一个用于语言表达自我监督学习的 Lite BERT

自从一年前 BERT 问世以来,自然语言研究已经采用了一种新的范式,利用了大量的…

ai.googleblog.com](https://ai.googleblog.com/2019/12/albert-lite-bert-for-self-supervised.html)

2020 年人工智能预测:我们在 2019 年做对了什么,2020 年有什么

原文:https://towardsdatascience.com/2020-ai-predictions-what-we-got-right-in-2019-and-whats-in-store-for-2020-4ef07173c67c?source=collection_archive---------36-----------------------

有时你在人工智能中得到它的权利…有时你没有。

在 2018 年底,我坐下来,戴着我的诺查丹玛斯帽子,推测未来一年人工智能的主要趋势是什么。2019 年,关于人工智能已经做了很多事情,写了很多东西——从世界末日场景(失业隐私)到人工智能为赢得围棋、扑克和星际争霸的游戏而构建。

但是抛开炒作不谈,有哪些预言成真了呢?2019 年 AI 有过哪些真实、有形、有用的应用?2020 年将会发生什么?

以下是概要:

我认为,2019 年将是各组织根据自己的数据建立专门的人工智能系统的一年。

这个预言肯定实现了。你可以“下载人工智能”来解决现实世界问题的想法是一个巨大的误解。相反,人工智能需要专门针对企业拥有、理解并最终使用的独特数据集。让企业能够快速构建、部署和迭代定制的人工智能应用程序一直是 2019 年的关键,也将是未来一年的中心主题。

2020 年,用户友好且价格实惠的人工智能平台将对企业挖掘自己的数据来构建定制的人工智能解决方案至关重要,使人工智能更适用于更广泛的应用。随着企业学习如何让人工智能为他们工作,对人工智能的理解和有用性将显著增长,将末日预言和理论思考远远抛在身后。

2019 年,我预计该行业将团结起来,围绕人工智能培育全球经济。

这就是我错的地方。我想象 2019 年,行业领袖和国家将走到一起,意识到人工智能有潜力帮助解决世界上一些最紧迫的挑战,并以多种方式造福社会。我设想了一个 2019 年,在那里,作为一个社会,我们打开了许多领导人工智能革命的国家之间对话的大门。

出现了相反的情况。2019 年,人工智能超能力的形成导致了两极分化。大公司没有走到一起,而是开始收集和挖掘个人信息,他们考虑的是金钱,而不是全球利益。

虽然人工智能和它的建筑师(科学家和工程师)信守了他们建造更多有用技术的承诺,但并不是每个人都把伦理放在首位。希望志同道合的人工智能公司将在 2020 年走到一起,建立一个由道德和以人为本的思想指导的人工智能行为准则。我相信这是可以做到的。

展望未来,人工智能需要在边缘生活和学习。

今天大多数人工智能系统都是在这样一个前提下诞生的,即学习发生在集中式云位置,迫使公司存储甚至可能放弃所有数据的所有权。作为一个推论,组织能够访问他们的数据的唯一方式是向大型云提供商支付巨额费用。

好吧,2019 年已经向我们表明,许多企业正在对放弃他们的数据说不,不得不 ping 云,并完全采用这种工作方式。

2020 年,客户将需要可以在边缘训练、部署和改进的人工智能,以便在生成数据的地方进行处理,最大限度地减少延迟问题、隐私问题和巨额云费用。对于工业和制造业应用来说尤其如此。越来越多的制造商将转向边缘,以保持其数据的所有权,并减少对云的依赖。因此,对云的依赖将仅限于某些用例或特定场景。

好消息是,随着我们进入 2020 年,越来越多的企业正试图将人工智能作为其商业战略的一部分。坏消息是,许多人已经失败或者没有达到他们想要的指标。

我对 2020 年的希望是,减少围绕人工智能琐碎应用的努力,更多地强调更小、更专注但真实的人工智能应用,这些应用能带来明显的好处和投资回报。也许没有人工智能在下一场比赛中击败人类的声势,企业可以开发节省资金、提高效率和改善我们生活质量的应用程序。

https://www.forbes.com本文原载于

巴西 2020 年选举:候选人分布分析

原文:https://towardsdatascience.com/2020-elections-in-brazil-an-analysis-of-candidate-distribution-e1d1aa2a1969?source=collection_archive---------76-----------------------

当涉及到他们的政治候选人时,巴西人得到了公平的代表吗?

这是一个关于巴西 2020 年选举候选人的简单 EDA(探索性数据分析),选举市长和市议员。在我工作的时候,选举还没有举行。我们将关注这两个职位候选人的性别和种族分布。有关所用代码的详细信息,请查看本 jupyter 笔记本。用于此分析的候选数据可以在这里找到,种族分布数据可以在这里找到。

性别分布

首先,让我们看看这些职位候选人的性别分布。当然,完美的分布(代表总体人口的分布)应该是男女各半。下图显示了所有职位候选人以及每个职位候选人的绝对和相对性别分布情况。

作者图片

作者图片

上述图表显示了巴西各地候选人政治代表性的性别差异;尽管妇女占人口的 50%,但她们仅占候选人总数的 33.2%,因此在候选人中代表不足。这种差距在市长候选人的分布上甚至更大(市长是一个更重要的角色,女性仅占 17%)。现在,我们将通过分析每个州在性别代表性方面的概况来进一步了解。

作者图片

作者图片

作者图片

上述图表显示,在考虑所有职位的候选人时,各州之间的性别差异似乎没有太大差异,与全国范围内观察到的差异接近;然而,在观察市长候选人的分布时,我们可以看到,一些州的男性和女性候选人之间的不对称程度比其他州更大。例如,在圣卡塔林纳州,男性市长候选人占候选人总数的 87%以上。

种族分布

接下来,我们将分析候选人中的种族分布。为了做到这一点,我们必须获得巴西人口的种族分布数据。这个数据是从 IBGE(巴西地理和统计研究所)收集的官方数据,可以在这里找到。以下图表显示了所有职位和每个职位候选人的绝对和相对种族分布情况,还有一个具体图表显示了整个人口的比例分布情况。

作者图片

作者图片

从上面可以看出,所有候选人的种族分布似乎与人口分布没有太大差异。但在市长候选人方面,情况并非如此:61.3%的候选人是白人,而整个人口中只有 45%的人自称是白人。另一方面,棕色人种只占这个职位候选人的 32%,却占了总人口的 43.4%。黑人代表也不足,仅占市长候选人总数的 5.12%,而占人口比例的大约两倍(10.1%)。

现在,我们将进一步分析并分别可视化每个州的种族分布。

作者图片

作者图片

作者图片

同样,上面的图表显示了在考虑任何角色的候选人时类似于国家场景的行为,白人有时在一些州甚至略有不足(而在其他州略有过多)。然而,当我们看市长候选人时,这种情况发生了变化,白人在所有州都明显过多,唯一的例外是阿克里州和阿马帕州。

结论

从性别分布来看,我们可以看到两个职位的候选人中男性和女性之间存在明显的差距;然而,对于市长职位的候选人来说,这种差距要大得多。另一方面,市议员候选人的种族分布似乎遵循民族构成,而市长候选人的情况却并非如此,白人明显过多。一旦选举开始,不妨重新审视这项工作,分析其结果,并与候选人库的分析进行比较。

2020 年美国大选:我们如何使用数据科学来展示拜登和特朗普的广告策略?

原文:https://towardsdatascience.com/2020-us-elections-how-we-use-data-science-to-unfold-ad-strategies-of-biden-and-trump-with-200095dd369a?source=collection_archive---------54-----------------------

封面由 Jay Kachhadia 设计,配有 Canva(背景图片由 Unsplash 提供)

2020 年美国大选正在全面展开,由于全球疫情对美国的打击如此之大,这是美国非常关键的一年。美国每四年举行一次选举,这是决定这个国家命运的一件大事。作为一名研究助理,我在攻读数据科学硕士学位的两年里一直从事于照明项目。尽管该项目最初起源于 2014 年各州州长选举期间。这个项目经过这些年的发展,现在已经变成了一个社交媒体选举分析平台。它帮助记者跟踪候选人的竞选策略。这个项目背后的策划者是詹妮弗·斯特罗姆-格里杰夫·海姆斯利,以及他们整个照明团队。该团队由社会科学家、行为科学家、语言科学家、数据工程师和机器学习工程师组成。

什么是启发性的?

Illuminating 是一个计算新闻学项目,旨在增强记者报道美国政治竞选的能力。它的目标是通过提供一个有用而全面的在线竞选宣传内容和特点的总结来帮助记者,而不仅仅是计算赞或转发。Illuminating 提供了一个交互式数据库,可以通过候选人在脸书和推特上的免费竞选账户以及他们在脸书和 Instagram 上的付费广告,轻松快速地跟踪候选人在社交媒体上的言论。

用于照明的技术(旧)

由于这个项目很老,用于照明的技术非常简单和可靠。我们曾经用内部开源工具来推动我们的 twitter 和脸书收集,这些工具基本上是访问 API 和收集数据的脚本,以及其他一些使用 SVM(支持向量机)来标记数据的脚本,以将内容分类到各种类别,并将它们推送到我们以前的 MySQL 数据库中。所有这些过程过去都在我们的服务器上运行(相信我,我们有许多服务器用于收集,以确保我们不会错过任何东西)。听起来很简单!但这并不是因为我们必须确保我们所有的收集器全天候运行,我们没有得到任何异常数据。

驱动下一代照明 2020 的新技术

照明收集和标记架构(使用 Canva 构建)

阿帕奇气流

我们一直在研究如何让这种基础设施具有弹性并且完美无瑕。所有这些都使用开源技术,我们有一个非常直接的选择: Apache Airflow 。多亏了 Airbnb,Airflow 在行业中被广泛用于创建数据管道和机器学习管道!

我们在服务器上部署了 Airflow,这些服务器完全用 Python 托管数据管道和机器学习管道(我喜欢 Python❤).这是全自动的,令人惊叹。2019 年夏天在 ViacomCBS digital 实习的时候接触到了 Airflow,瞬间爱上了它。虽然它有一个陡峭的学习曲线,但完全值得。

伯特

SVM 在自然语言处理分类任务方面表现不错。尽管如此,我们不得不提高我们的游戏水平,并尝试一些语言领域中最受欢迎的分类算法。当时有一个明显的赢家:伯特。我们使用了一个预先训练好的 BERT(来自变压器的双向编码器表示)基本模型(12 层,768 个隐藏,12 个头,110M 个参数),它是在维基百科和英语教科书上训练的,感谢 Google!我们根据我们的分类任务微调 BERT 的最后一层。

MongoDB

我们从 SQL 数据库 MySQL 切换到 NoSQL 数据库 MongoDB 。为什么是 MongoDB?由于其处理大量非结构化数据的能力,它具有更大的优势。它神奇地更快了。人们正在体验真实的 MongoDB 性能,这主要是因为它允许用户以对工作负载更敏感的不同方式进行查询。我们的基础设施上有数百万甚至数十亿条记录,涵盖自 2014 年以来的所有选举,其中包括来自 Twitter、脸书和 Instagram 等社交媒体平台的数据。

当前架构和数据收集

“照亮 2020”目前专注于总统候选人的政治广告,并用我们之前开发的代码簿对其进行分类。我们使用 Apache Airflow 来推动我们的数据管道,从脸书广告库 API 收集流媒体广告数据。该数据库每 4 小时更新一次新指标和新帖子,并由我们的机器学习模型进行标记。该数据包含来自脸书和 Instagram 的广告,适用于所有拥有有效脸书和 Instagram 账户的总统候选人。我们从主要候选人页面以及特朗普和拜登竞选团队在其他附属页面上购买的广告中提取广告及其元数据。我们不会为代表候选人的其他实体做广告,例如政治行动委员会。我们只收集那些参加辩论时间足够长的候选人的数据。脸书广告库 API 提供范围内每个广告的花费和印象数据,包括最小和最大数量。我们几乎自动化了从收集到机器学习再到用 Apache Airflow 采样数据的所有事情。

我们的气流有所有的管道(旧图像,你可以在这里看到每天的时间表)

在气流世界中,管道被称为 Dag(有向无环图)。每个管道都由多个任务组成,这些任务涉及通过我们的各种机器学习模型进行数据收集和标记,以便随时了解类别、礼貌和主题,并将所有内容推送到我们的 MongoDB 服务器。

我们的广告收集渠道/DAG 的快照

我们基本上在数据库中维护各种元数据,这基本上自动化了我们的流程中的一切。当我们在候选人的信息收集中添加一个投放日期时。它会自动阻止气流管道收集这些候选者,这意味着管道被智能地编程。

我们数据库中候选人信息的快照

在将数据推送到我们的 MongoDB 之后,我们从那里为我们的照明网络应用提供燃料。

照亮 2020

照亮登录页面

“照亮 2020”是 2020 年总统竞选广告分析的一站式商店,目前专注于拜登/特朗普的广告策略。这是一个绝对的发电站!你可以在这里获得更多关于我们广告分类类型的信息

消息类型和消息音调分类

我是锡拉丘兹大学信息研究学院的一名硕士生,从事这个关于数据工程和机器学习基础设施的伟大学术研究项目。

来看看《照亮 2020》吧!

你可以在 https://illuminating.ischool.syr.edu参观照明。该项目得到了约翰 s .和詹姆斯 L. 奈特基金会、哥伦比亚大学数字新闻 Tow 中心、计算和数据科学中心以及锡拉丘兹大学信息研究学院BITS 实验室的支持。当谈到 2020 年选举的广告分析时,它绝对是一个发电站,它会让你大开眼界。请投票选出 2020 年的最佳,因为这将决定这个国家的未来。

在 gmail dot com 的[myLastName][myFirstName]上提问,或者在 LinkedIn 上联系。

数据科学训练营体验的 2020 愿景

原文:https://towardsdatascience.com/2020-vision-on-a-data-science-bootcamp-experience-b1464244cb4c?source=collection_archive---------41-----------------------

关于 Metis Bootcamp 的远程学习体验——预、中、后

美国农场工人迁移的数据可视化

以上是我在本科建筑论文项目中完成的第一批数据可视化之一。每个点代表 500 个人。我本来在图上有一个键,但是当时我的教授鼓励我把它去掉——这是一个糟糕的选择!这最终让我想到了为农民工家庭设计的移动校舍。

我从哪里来

这是一个建筑师/城市设计师/研究人员如何过渡到数据科学的故事。我遇到的大多数人认为架构师没有资格成为数据科学家,但是我相信对于像我这样的人来说,这是一个完全自然的转变。原因有两个:

  1. 数据科学和架构都是数学、科学和艺术的混合体。
  2. 数据科学和架构是技术学科,只有对非技术受众有用时才会大放异彩。

我可以在这里进行更深入的探讨——也许这是另一篇文章——但我进入数据科学职业的主要动机是将我的职业生涯更多地转向科学而不是艺术,并填补我在 AEC(建筑、工程和施工)行业和人工智能之间看到的差距。老实说,我受到了哈佛大学 GSD 毕业生斯塔尼斯拉斯·夏鲁的生成设计作品的启发,它为我打开了一扇门,让我可以选择多种途径来填补这一空白。

训练营前

会话

我哥哥也是一名数据科学家,当我在丹麦攻读城市规划和社会变革博士学位时,他让我开始思考数据可视化。我和他讨论了我正在考虑做一个数据科学训练营,他建议我应该先开始学习编程和教育自己,这样当我去训练营时,我就不是第一次看到这些材料了。这通常是我在考虑转型时从多个渠道得到的建议。这被证明是非常明智的建议。

准备

David Malan 教授的哈佛 CS50 课程是我开始学习编程的第一门课程,在将理论分解成代码方面非常出色。我看了一下 Insight 研究员的职业转型准备材料,并开始跟随我自己的一些选择。我从多伦多的一些教授那里学会了 python 编程,也学习了谷歌 Python 课程,从吴恩达学会了机器学习基础,从 Mode Analytics 学会了 SQL。还听了 OCDevel 的机器学习指南播客和其他一些比较理论化的 AI 书籍。我看了一些微积分、统计和概率的复习资料,这并不太难,因为我在 T4 的高中教育是为那些痴迷于数学的人设计的。我对这些工具的力量、它们的潜力以及我使用它们的能力感到非常兴奋。但是,我觉得我会从加速训练营体验中受益,因为:

  • 我还没有完成一个端到端的独立数据科学项目。
  • 我知道还有很多东西要学,我需要帮助把所有的工具放在一起。
  • 我也想有一个真正的社区来加速我的成长。

训练营选择

我申请并被大会和 METIS 接受了他们的第一个在线实时队列。我与 GA 和 Metis 的毕业生交谈过,老实说,我并不觉得这两个项目有很大的不同,除了在 Metis,你可以端到端地做更多的项目,这正是我想要的。我住在洛杉矶,但是每天大概要开一个小时的车去大会的校园,所以我选择了 METIS 项目。我也听说了关于 Metis 的一些非常好的事情,真诚地喜欢他们的招生过程和他们提供的大幅折扣,因为这是他们提供的第一个在线直播课程。我对远程程序有一些担心:

  1. 与我的同事和导师建立有意义的联系
  2. 职业服务能够将我与当地雇主联系起来
  3. 能够与讲师进行足够的一对一交流

在训练营期间

你可以在 Metis 的网站上阅读课程和时间表,所以我不会在这里用这些来烦你。在整个训练营中,我最担心的三个问题基本上都解决了。我认为第二点非常正确,但是我从一开始就知道梅蒂斯拉的联系是有限的。

在线平台中的社会化物流

现场在线群组由大约 10 人组成,但我们与芝加哥的现场群组保持联系。我们的在线直播小组成员大部分位于加利福尼亚和纽约。令我惊讶的是,我能够与我的同学和导师建立牢固的关系。我认为这其中的关键是每天的结对编程练习,以及下午的站立练习,在那里我们互相更新进展并寻求障碍的帮助。我与在线直播和面对面的人都建立了持久的联系。我喜欢在线学习体验的自主程度,因为我觉得我可以专注于工具和项目。

一个又宽又深的领域

我们有三位导师,在整个训练营中,很明显他们每个人都有自己对数据科学的特殊兴趣和经验——一位是 NLP,另一位是统计学,还有一位是推荐器和神经网络——但他们都有兴趣教我们他们知道什么以及他们是如何知道的。在训练营期间,在反思了给我们上课的高级数据科学家之后,我感到平静,因为我不需要深入了解所有事情,数据科学在实践中可以有非常不同的专业,每个人都有自己的专业知识和才能。

关注业务用例

令人惊讶的是,除非你要求,否则老师不会检查你的代码,而是对你的大部分陈述进行评分。我很惊讶演示文稿被强调了这么多,但我认为这是有意义的,因为代码、建模和度量只是让您编写关于您的模型的业务用例的故事的工具,通过演示文稿,这个故事变得更加清晰。我发现令人惊讶的是,对问题的探索和思考会提高模型的性能——通常比模型调整更有效。我还发现,即使是最简单的模型也能非常有效地运行。项目的重点不是拥有得分最高的最佳模型,而是为机器学习模型构建一个应用程序,了解模型的内部工作方式,并能够评估与您正在解决的业务问题有关的指标。

利用我的优势

在训练营期间,我擅长将机器学习工具的应用概念化到商业用例中,并且是制作清晰的图形吸引人的演示文稿的大师。我的团队包括擅长用画面讲故事的专业人士,拥有漂亮代码的程序员,或者擅长脑筋急转弯的数学家。我们在需要改进的地方互相帮助。我认为我们团队所代表的丰富经验对我们的每一次成功都很重要。每个人都有可以提供和学习的东西。

插曲

你可以看看我在训练营期间做的项目:

  1. 电子设计自动化(Electronic Design Automation)

[## 优化纽约街头团队

营销|数据科学| MTA 十字路口数据+地理数据

medium.com](https://medium.com/@anupamagarla/optimizing-nyc-street-teams-4f5e3bd89105)

2.回归

[## 预测动画电影的表现

客户演示

towardsdatascience.com](/predicting-animated-film-performance-fc32e3611c71) [## 预测动画电影表现的数据管道

实施线性回归预测动画电影表现的技术演示。

towardsdatascience.com](/predicting-animated-film-performance-5d25748b7481)

3.分类

[## 国会选举中的选区翻转预测

预测国会选区党翻转

towardsdatascience.com](/district-flip-forecasts-in-congressional-elections-47324c71e7ab)

4.自然语言处理

[## 为家长构建基于内容的儿童图书推荐系统

睡前故事崩溃的解决方案

towardsdatascience.com](/building-a-content-based-childrens-book-recommender-for-parents-680e20013e90)

5.激情工程

[## 用机器学习探测洛杉矶的后院房屋

在 METIS 数据科学进行的项目 5/5 沉浸式解决我自己制造的一个商业问题

towardsdatascience.com](/prospecting-las-backyard-houses-with-machine-learning-8fdc191e1cf)

在训练营表现出色

几件事让我在训练营表现出色:

  1. 准备

我参加的关于编程和机器学习的免费在线课程,以及我在这一学科上所做的研究,都给了我帮助。课堂上讨论的大部分术语和概念,我都不是第一次听到了。我认为这种准备让我能够从容应对每一周,每周最多花 50 个小时在项目和讲座上。我知道其他人工作得更多,但我知道自己的极限,我对质量比对数量更感兴趣。

2。提问

我特别注意深入思考我对材料的任何疑问并提出来。

3。通信

定期与讲师和我的同事交流进展和挑战。我经常从我的同伴那里得到帮助,或者至少是一个共鸣板,这让我比独自思考时进步得更快。我也喜欢视觉和语言交流,这是作为一名数据科学家应该具备的重要技能。

4。承诺、专注和时间限制

我是一个职业生涯中期的过渡者,我在生活中比大多数同龄人走得更远,所以我需要做出承诺,更加专注,我做到了。我的导师帮助我制定了一些策略,比如对我的工作流程的不同部分进行时间限制和优先级排序,创建一个 MVP,然后在此基础上进行构建。

5。练习

一开始,我在上课前有规律地骑自行车(太平洋标准时间早上 7 点开始!),这给了我很多精力和注意力。随着课程的进行,我没有时间那样做,但我仍然在一周内得到了几次乘坐。

训练营结束后

训练营结束还不到一个月,所以我以后肯定会有更多的话要说。然而,我确实觉得我的生活中有一个很大的空白,没有那样的日常结构,没有每天掌握一门全新的技术!

求职

我课程的最后几周是在新冠肺炎封锁期间,所以行业(除了互联网媒体公司)正在这个不确定的时期喘口气。这不是找工作的理想时机,但我的同学中有些人已经找到了数据科学/工程职位。找工作比我想象的要困难得多,尤其是因为我的大多数关系都在一个刚刚开始使用人工智能的领域。我希望在训练营之前或期间做的一件事是,开始培养与当地数据科学行业的联系——参加聚会和黑客马拉松——特别是在避难所到位协议之前。然而,好处是网上有太多的聚会。对我来说,我有兴趣将人工智能引入 AEC 行业,并计划利用这个不确定的时期建立该领域的技术技能,并与洛杉矶当地志同道合的人建立联系。

外卖

我觉得在 METIS 的经历让我充满力量,我不怕接受新技术或职业抱负。这是一次美妙的经历,不同于我经历过的任何其他教育经历(我也有过一些经历——文学学士、硕士、博士)。我认为我的团队中的每个人在离开训练营时都更好地了解了他们对什么样的数据科学感兴趣,他们的优势在哪里,以及如何利用这些优势。我会把这种经历推荐给任何对职业、时间和金钱有独特兴趣的人。

AWS 云安全的 21 项最佳实践

原文:https://towardsdatascience.com/21-best-practices-for-aws-cloud-security-cfdfb217330?source=collection_archive---------27-----------------------

KOBU 机构Unsplash 上拍摄的照片

亚马逊网络服务或 AWS 云安全是当今网络安全环境中的一个至关重要的主题。越来越多的企业采用云服务并转向 AWS。鉴于目前的形势,毫无疑问,亚马逊网络服务(AWS)正在向 AWS 用户提供最好的安全功能,以完全保护他们的基础设施。

但是安全是 AWS 和用户的共同责任。您可能已经实现了基本的 AWS 安全实践。然而,由于您的 AWS 云基础设施中会定期启动和修改大量资源,因此您可能会错过一些 AWS 云安全最佳实践。

什么是 AWS?

亚马逊网络服务(AWS)是一个被广泛采用的全面而安全的云平台,提供全功能服务,如计算能力、内容交付、数据库存储和其他功能,以帮助全球企业。AWS 为软件开发人员和企业提供了许多解决方案和工具,如云视频编辑工具等,以帮助他们扩展工作和发展。

AWS 分为不同的服务,每个服务都可以根据用户的需求进行配置。它允许用户通过在云中运行 web 和应用服务器来托管动态网站;使用 Oracle、MySQL 或 SQL Server 等托管数据库存储信息。并将文件安全地存储在云上,以便他们可以从任何地方访问它们。

除了 AWS 提供的大量好处,还有维护安全性的责任,以确保您的数据在云中是安全的。

让我们进一步了解 AWS 云安全最佳实践,以及如何实施这些实践来确保增强的安全性。

AWS 云安全的最佳实践

1.将您的策略放在第一位,并确定它是否支持各种工具和控件。

围绕着是应该先把工具和控制放在适当的位置,还是先建立安全策略,有很多争论。虽然这看起来像是一个潜在的讨论,但答案要复杂得多。通常,建议首先建立安全策略,以便在访问工具或控件时,可以评估它是否支持您的策略以及支持程度如何。

此外,它允许您将安全性融入到所有组织功能中,包括那些依赖 AWS 的功能。首先实施安全策略对持续部署也有很大帮助。

例如,如果您的公司使用 Ansible、Chef 等配置管理工具来自动化软件补丁和更新,那么拥有一个强大的安全策略将有助于您从第一天起就对所有工具实施安全监控。

2.实施清晰、一致的云安全控制和程序。

最近的大多数 S3 攻击都与包含敏感信息并被设置为“公开”的 S3 桶漏洞有关但是,S3 存储桶默认设置为“私有”,这意味着只有特定的特权用户才能访问这些存储桶。

为了确保 S3 存储桶或云中数据的安全,创建一套清晰、一致的安全控制和程序。这些应该定义可以存储在云中的数据类型,建立一个层次结构来对敏感数据进行分类,并确定谁应该能够访问它们。

3.对所有层应用安全性。

确保将安全性应用于所有层。基础架构中只有一个防火墙是不够的。相反,在您的所有虚拟网络上安装虚拟防火墙来控制和监控网络流量,以保护您的基础架构及其运行的操作系统。你可以很容易地从 AWS 市场安装这些防火墙。

4.利用本机云安全资源。

通过在你的应用中部署像 Amazon CloudFront 这样的工具,你可以保护你在世界任何地方托管的网络应用。有一系列原生的 AWS 安全工具,如 AWS Shield、Guard Duty 和 Cloud Watch,可以帮助您保护您的云环境。

此外,标准合规框架,如亚马逊机器映像(AMIs)和 ISO/IEC 27000 系列,预先配置了各种内置的合规元素,可以为您提供重要的前端工作。

5.发展安全文化。

维护安全应该是一项自上而下的工作,组织的每个成员都有责任。尤其是在今天,T2 缺乏网络安全专业人员,很难找到精通最新技术和工具的人。

无论您是否有专门的安全团队或根本没有 infosec 员工,都要确保对所有员工进行安全重要性以及他们如何为加强组织的整体安全做出贡献的培训。

6.监控用户对数据库的访问。

监视用户对数据库的访问并确定他们的目的是很重要的。例如,规划所有管理任务,以确保在迁移到云中后实施细粒度或最低权限的访问控制。

此外,如果您的应用程序使用外部数据源,请考虑使用数据完整性验证和动态数据加密等控件来维护数据完整性和机密性。

7.配置密码策略。

密码破解、暴力攻击和凭据填充是网络罪犯用来针对组织及其用户的一些最常见的安全攻击。拥有一个强有力的密码策略对您组织的安全性至关重要,因为它可以显著降低安全漏洞的几率。

考虑创建一个密码策略,描述密码创建、修改和删除的一组条件。例如,实施多因素身份认证、多次登录尝试失败后自动锁定,或者在特定时间段(例如 60 天)后更新密码策略。

8.使用密码生成器工具创建复杂、安全的密码。

一旦有了强有力的密码策略,就可以使用密码生成器来创建不太可能被攻击者破解的复杂安全的密码。

AWS 允许您在 IAM 密码策略部分实施复杂密码策略。与您的出生日期或姓名相比,混合使用大小写字母、数字和特殊字符将有助于您创建相对更安全的密码。

9.加密敏感信息。

加密您的敏感信息对保护您的数据大有帮助。在 AWS 中启用加密是非常容易和简单的,特别是如果您选择了他们的本地加密,它为 API 和 AWS 服务提供了 HTTPS 和端到端 SSL/TLS。

如何加密敏感数据?

您还可以使用可伸缩密钥管理在一个位置创建、定义、轮换和审核您的加密密钥。对于客户端加密,使用带有 EBS、RDS 和 S3 的 AWS 加密或带有文件和 blobs 的 Azure Secure Server Encryption(SSW)。确保通过 SSL 存储在 S3 上的数据具有加密的端点,以保护传输中的数据。

10.不要使用过期的证书。

请随时更新您的 SSL/TLS 证书,因为旧版本可能与 AWS 服务不兼容,这可能会导致自定义应用程序或 ELB 出错,从而影响您公司的整体安全性和工作效率。

11.定期备份您的数据。

每个组织都必须创建其数据的定期备份。在 AWS 中,您的备份策略取决于您现有的 IT 设置、数据的性质以及行业要求。

如何在 AWS 中备份数据?

AWS 提供灵活的备份和恢复解决方案,保护您的数据免受网络盗窃和安全漏洞的侵害。您可以使用 AWS Backup,它提供了一个集中的控制台来管理和自动化跨 AWS 服务的备份。

它集成了 Amazon RDS、Amazon EFS、Amazon DynamoDB、AWS Storage Gateway 和 Amazon EBS,能够定期备份关键数据存储,如数据库、文件系统和存储卷。

12.使用 EBS 加密。

Amazon EBS encryption 提供了一个简单的加密解决方案,不需要您为 EBS 资源构建、维护和保护自己的密钥管理基础设施。

加密发生在托管 EC2 实例的服务器上,并确保传输中的数据和静态数据及其附加 EBS 存储的安全性。使用 Amazon EBS encryption,您可以加密 EC2 实例的数据卷和引导。

13.锁定您的根帐户凭据。

Root 帐户凭证使用户能够完全访问系统中的资源,但是,这使得系统容易受到安全漏洞的攻击。

实施一个身份和访问管理(IAM)管理员用户来定义和管理各个网络用户的访问权限和角色,而不是使用 root 帐户访问密钥。此外,使用多因素身份认证(MFA)来增强安全性,因为它增加了一层额外的保护。

14.让您的 AWS 政策和实践保持最新。

保护 AWS 云基础设施的一个重要方法是创建每个人都可以遵循的一致的安全策略。通过实施清晰简明的安全实践,您可以保护您的 AWS 云环境免受分布式拒绝服务(DDoS)攻击、未经授权的使用/访问、恶意软件、黑客和其他风险。

确保您记录了所有 AWS 策略和流程,并将它们存储在一个公共位置,如内部网络上的共享驱动器,每个人都可以访问它们。使用最新的云安全方法定期更新本文档,以确保您的所有员工、第三方供应商、贸易合作伙伴和利益相关方保持一致。

15.使用漏洞报告。

随着网络安全攻击数量的增加,现在对企业来说,评估其基础设施并确定可能使其数据面临风险的漏洞至关重要。在 AWS 中,建议用户避免输入密码、点击链接或通过看起来可疑的电子邮件下载附件。

如果用户检测到可疑活动或电子邮件,该怎么办?

用户可以直接向亚马逊的系统举报可疑邮件。这不仅会提醒 AWS 您组织的潜在云安全漏洞,还会建立安全文化并在用户中产生意识。

您还可以向联邦调查局地方办公室、互联网犯罪投诉中心或美国特勤局等机构报告潜在的黑客和网络钓鱼欺诈。

16.确保您的所有服务器都打了补丁。

请确保您修补了所有 AWS 云服务器,即使它们不可公开访问。有许多工具可以帮助您自动化和管理修补 AWS 云服务器的过程。

我们利用亚马逊的维护窗口,定期循环我们的实例,以确保我们有最新的更新。然而,确保语言运行时也是最新的也很重要——在我们的情况下,这意味着最新的补丁节点和干净的 npm 版本,”蜘蛛纸牌挑战的联合创始人 Darshan Somashekar 说。

例如,AWS Systems Manager 修补程序管理器使您能够自动化和管理与 AWS 安全和其他类型的更新相关的实例。使用 Patch Manager,您可以将补丁应用到一系列 Amazon EC2 实例、虚拟机(VM)以及您的本地服务器。

17.使用密钥策略来控制对 cmk 的访问。

AWS KMS 中的每个 CMK 都有一个相关联的密钥策略,用于确定密钥权限的使用和管理。默认密钥策略允许用户定义主体,并允许帐户中的 root 用户定义 IAM 策略。

为了确保最佳的 AWS 安全实践,请根据您公司的要求修改默认密钥策略。此外,实施最低权限访问,将用户的访问权限限制在他们执行合法业务功能绝对需要访问的资源。

18.实施强大的网络安全协议和策略。

通常,人们有一个主要的观念,因为 AWS 提供了企业级的基础设施,所以安全性得到了保障。虽然 AWS 网络提供了重要的安全控制,并使组织能够配置防火墙端口和访问控制等设置,但仅此还不足以完全保护您的网络。

高级恶意软件可以通过 SQL 注入攻击、网络流量、僵尸网络和跨站脚本攻击您的 AWS。此外,如果 AWS 的一个虚拟服务器受损,可能会影响在相同环境中运行的其他易受攻击的服务器。

你如何保护你的 AWS 免受网络攻击?

为了确保更好的安全性,集成一个“共享责任模型”,该模型定义了除亚马逊安全之外的您的责任。例如,实现数据完整性认证、服务器端和客户端加密、网络流量验证、认证和加密。

在流程的早期引入您的安全团队,以确保从第一天起就注意安全。不要认为 AWS 云安全会干扰您组织的敏捷性。

19.选择区域来管理网络延迟和法规遵从性。

AWS 提供每个地区所在的州和国家的信息。确保根据地区管理网络延迟和法规遵从性。

20.监控用户对 AWS 管理控制台的访问。

AWS 管理控制台就像站点上的高级仪表板,从这里您可以完全控制和管理所有 AWS 资源和实例。AWS 管理控制台提供的一些关键功能是创建新的虚拟机、删除任何当前的虚拟机或修改其他 AWS 服务。

进入这个控制台就像拥有一个王国的钥匙。确保监控用户对 AWS 管理控制台的访问,并检测未经授权的访问。

21.对平台组件使用 ami。

使用 Amazon 机器映像(AMIs)来启动一个实例,而不是从头开始配置 Linux 服务器或 WordPress 机器。单个 AMI 可以帮助您使用相同的配置启动多个实例。

您还可以使用不同的 ami 来启动具有不同配置的实例。使用 AMI 将有助于您节省设置 AWS 安全配置工作所需的时间和精力,并降低风险。

最后的想法

当您转向 AWS 云基础架构或扩展您现有的 AWS 时,您将需要更深入地了解 AWS 基础架构的安全性。用户还需要了解最新的变化,以采用更好、更全面的安全措施。这些只是一些 AWS 安全最佳实践,您可以实施它们来维护 AWS 生态系统的强大安全性。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

21 个数字函数将加速您的数据分析过程

原文:https://towardsdatascience.com/21-numpy-functions-that-will-boost-your-data-analysis-process-1671fb35215?source=collection_archive---------23-----------------------

举例说明

SpaceX 在 Unsplash 上拍摄的

注:除非另有说明,所有图片均由作者创作。

数据科学的一切都始于数据,数据有多种格式。数字、图像、文本、x 光、声音和视频记录只是数据源的一些例子。无论数据以何种格式传入,都需要转换成数字数组进行分析。

处理数字数组的最重要的工具之一是 NumPy,它是 Python 的一个科学计算包。

在本帖中,我们将介绍 20 个函数和方法,它们将有助于您的数据分析过程。

1。数组

它用于从头开始创建一个数组或将一个列表或熊猫系列对象转换为一个数组。

2。阿兰格

它在指定的增量范围内创建一个数组。

前两个参数是下限和上限(上限是唯一的)。第三个参数是步长。

3。林空间

它在指定范围内创建一个具有等距元素的数组。

前两个参数决定了下限和上限。与 arange 函数不同,upper bound 是包含性的。第三个参数指定在该范围内需要多少个等距元素。

4。独特的

它返回数组中唯一元素的数量。我们还可以使用 return_counts 参数查看每个元素在数组中出现的次数。

5。Argmax 和 argmin

它们返回沿轴的最大值和最小值的索引。

axis=1 的 Argmax 将返回每行中最大值的索引。axis=0 的 Argmin 将返回每列中最小值的索引。

6。Random.random

它创建一个在 0 和 1 之间随机浮动的数组。同样的操作也可以用 random_sample 函数来完成。

7。Random.randint

它创建任意形状的整数数组。

前两个参数决定了界限。如果只通过一个界限,则认为是上限,下限取为 0。

8。Random.randn

它返回标准正态分布的一个或多个样本(即零均值和单位方差)。

让我们也绘制这些值来观察标准的正态分布。

9。Random.shuffle

它通过打乱数组的元素来修改数组的顺序。

10。重塑

顾名思义,它改变数组的形状。必须保持整体大小。例如,形状为 3x4 的数组可以转换为形状为 2x6 的数组(大小为 12)。

您还可以在一个维度中指定大小,并为另一个维度传递-1。Numpy 将推断形状。

整形还用于增加数组的维度,这是处理机器学习或深度学习模型时的常见做法。

11。Expand_dims

它扩展了数组的维度。

轴参数允许选择通过哪个轴进行扩展。axis=1 的 Expand_dims 等效于 shape(-1,1)。

12。Count _ 非零

它返回数组中非零元素的计数,这在处理高度稀疏的数组时会很方便。

13。Argwhere

它返回数组中非零元素的索引。

例如,第一行中的第二列为零,因此 argwhere 函数不会返回它的索引([0,1])。

14。零、一、满

这实际上是三个独立的功能,但它们的功能非常相似。它们用 0、1 或特定值创建数组。

默认数据类型是 float,但可以使用 type 参数将其更改为整数。

15。眼睛和身份

眼睛和身份都创建具有指定维度的身份矩阵。单位矩阵,表示为 I,是对角线上有 1 而其他位置都有 0 的方阵。

单位矩阵的特殊之处在于它在相乘时不会改变矩阵。在这个意义上,它类似于实数中的数字 1。

矩阵的是与原矩阵相乘时给出单位矩阵的矩阵。不是每个矩阵都有逆矩阵。如果矩阵 A 有逆,则称之为可逆或非奇异。

16。拉威尔

Ravel 返回一个扁平数组。如果你熟悉卷积神经网络(CNN),汇集的特征映射在馈送到完全连接的层之前被展平。

第二行连接在第一行的末尾。Ravel 函数还允许使用 order 参数进行列级连接。

17。Hsplit 和 Vsplit

它们垂直(vsplit)或水平(hsplit)拆分数组。

a 是一个形状为 4x4 的数组。水平拆分将产生两个 4x2 的数组。

如果垂直拆分,则生成的数组将具有 2x4 的形状。

18。Hstack 和 Vstack

它们水平地(按列)和垂直地(一行一行地)堆叠数组

19。转置

它转置一个数组。在二维数组(即矩阵)的情况下,转置意味着交换行和列。

20。Abs 和绝对

abs 和 absolute 都返回数组中元素的绝对值。

21。一圈又一圈

它们都将浮点数舍入到指定的小数点位数。

我们只介绍了使用 NumPy 可以完成的部分操作。但是,这些是您在典型的数据分析和操作过程中可能会用到的操作。

NumPy 被证明是一个非常灵活和高效的科学计算库。它是许多 Python 库(如 Pandas)的基础。

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

为数据科学面试做准备的 22 个统计问题

原文:https://towardsdatascience.com/22-statistics-questions-to-prepare-for-data-science-interviews-d5651a8b3c56?source=collection_archive---------5-----------------------

Clem Onojeghuo 在 Unsplash 拍摄的照片

自信的钉钉数据科学访谈,第 2 部分

在我之前的文章中,我讨论了为面试做准备的机器学习问题:

[## 准备面试的 20 个机器学习相关问题

自信地完成面试

towardsdatascience.com](/20-machine-learning-related-questions-to-prepare-for-interviews-93bcba72f911)

在接下来的三篇文章中,我将提出一些概率练习题,并为数据科学面试准备案例研究和行为问题。请点击此处查看:

[## 数据科学面试的 12 个概率练习题

自信地完成数据科学面试,第 3 部分

towardsdatascience.com](/12-probability-practice-questions-for-data-science-interviews-2ec5230304d9) [## 在数据科学面试中组织您对案例研究问题的回答

自信地完成数据科学面试,第 4 部分

towardsdatascience.com](/structure-your-answers-for-case-study-questions-during-data-science-interviews-a14a02d21e6c) [## 为数据科学面试准备行为问题

自信地完成数据科学面试,第 5 部分

towardsdatascience.com](/prepare-behavioral-questions-for-data-science-interviews-96e97f13be15)

在这篇文章中,我将提出你在面试中可能会遇到的 22 个基本统计学问题。

1、什么是假设检验?

假设检验是一种统计推断的方法。基于从调查或实验中收集的数据,假设零假设为真,计算从数据中观察统计数据的概率(p 值)。然后,您决定是否拒绝比较 p 值和显著性水平的零假设。它被广泛用于测试一种效应的存在。

2、什么是 p 值?

P 值是在零假设为真的情况下观察到数据的概率。较小的 p 值意味着拒绝零假设的可能性较大。

3、什么是置信度?

假设检验中的置信水平是当零假设为真时,不拒绝零假设的概率;

P(不排斥 H0|H0 为真)= 1 - P(排斥 H0|H0 为真)

默认置信度设置为 95%。

4、什么是置信区间?

与点估计相反,置信区间是通过统计推断获得的参数的区间估计。其计算方法如下:

[点估计- cvsd,点估计+ cvsd]

其中,cv 是基于样本分布的临界值,sd 是样本的标准偏差。

在置信区间中解释置信是至关重要的。例如,如果我说等车时间的 95%置信区间是[5 分钟,10 分钟],我实际上在说什么?请点击这里查看我的文章,了解更多详情:

[## 如何解释置信区间中的置信

你有多自信?

medium.com](https://medium.com/an-idea/how-to-interpret-the-confidence-in-confidence-interval-3f3b37794089)

5、什么是统计力?

统计功效测量当零假设为假时拒绝零假设的概率:

P(拒绝 H0|H0 是假的)= 1- P(不拒绝 H0|H0 是假的)

默认统计功效设置为 80%。

6、什么是 I 型错误,什么是 II 型错误?

I 型错误是 p(拒绝 H0|H0 为真),是假阳性(感谢 Koushal Sharma 捕捉到这里的错别字),是⍺,是负一的置信水平;

第二类错误是 P(不排斥 H0|H0 是假),是假阴性,是β,是 1 减统计功效。

在 I 型误差和 II 型误差之间有一个权衡,这意味着如果其他一切保持不变,为了减少 I 型误差,我们需要增加 II 型误差。

如果您对将 I 型错误和 II 型错误与机器学习模型中的分类度量联系起来感兴趣,请阅读我的文章了解更多详细信息:

[## 模型评估分类度量的最终指南

将机器学习模型与假设检验相结合。别扯头发了,读读这篇文章。

towardsdatascience.com](/the-ultimate-guide-of-classification-metrics-for-model-evaluation-83e4cdf294d9)

7、什么是中心极限定理(CLM)?

中心极限定理 指出,无论总体的原始分布是什么,当从总体中抽取随机样本时,随机样本的均值或和的分布接近正态分布,均值等于总体均值,随着随机样本的变大:

图片来自维基百科

8、什么是大数定律?

大数定律 表示,随着试验次数变得足够多,试验的平均结果会变得更接近期望值。例如,当你掷一枚公平的硬币 1000 次时,你有一半的机会看到正面,而不是只掷 100 次。

9、什么是标准误差?平均值的标准误差是多少?

统计的标准误差是其抽样分布的标准偏差或该标准偏差的估计值。

使用 CLM,我们可以通过使用总体标准差除以样本大小 n 的平方根来估计均值的标准差。如果总体标准差未知,我们可以使用样本标准差作为估计值。

10、如何选择一个实验的样本量?

样本大小与样本的标准误差、期望的置信水平、功效和效果大小密切相关。样本大小随着样本的标准误差、置信水平和功效的增加而增加,或者随着样本的效应大小的减小而增加。请看这篇文章背后的直觉:

[## 样本大小与标准误差、功效、置信水平和效应大小有什么关系?

使用图表来展示相关性

towardsdatascience.com](/how-is-sample-size-related-to-standard-error-power-confidence-level-and-effect-size-c8ee8d904d9c)

11、什么是自举?

自举 是重采样技术之一。给定一个样本,你重复从它的 中随机抽取其他样本,并替换 。当样本量很小时,以及当您需要估计经验分布时,Bootstrapping 非常有用。我们可以使用 bootstrapping 来估计中位数的标准误差。请阅读下面的文章了解更多详情:

[## 如何估计中位数的标准误差:自助策略

在这篇文章中,我将讨论我们可以用来估计中位数的标准误差的方法。我会先…

towardsdatascience.com](/how-to-estimate-the-standard-error-of-the-median-the-bootstrap-strategy-ed09cccb838a)

12、什么是样本偏倚?

样本偏差是指用于统计推断的样本不能很好地代表整个总体。这是因为几个原因:

1、抽样偏倚:非随机抽样;

2、选择偏倚:样本不代表全部人群。例如,当你想估算所有成年人的平均收入时,在大学里通过一项调查;

3、回答偏差:要么是因为回答太少,要么是因为只有某些类型的受试者会回答调查。例如,针对教授教学技能的调查可能只有喜欢或真正讨厌教授的学生做出回应;

4、存活偏差:由于忽略了没有通过筛选过程的受试者而产生的偏差。

13、如何检测离群值?

异常值是与其他观察值显著不同的观察值。检测异常值与定义差异是一样的。最直接的方法是绘制变量,并找到远离其他数据点的数据点。为了量化差异,我们可以使用四分位数和四分位数间距 (IQR)。IQR 是第三个四分位数减去第一个四分位数(Q3-Q1)。异常值是任何小于 Q1-1.5 * IQR 或大于 Q3+1.5*IQR 的数据点。

如果数据遵循正态分布,异常值是 Z 值大于 3 或小于-3 的点。

14、什么是贝叶斯推断?

贝叶斯推断是一种统计推断方法,其中 贝叶斯定理 用于随着更多证据或信息变得可用而更新假设的概率。贝叶斯定理陈述如下:

其中 P(A)是先验信念,P(B)是证据,P(B|A)是 A 发生时事件 B 发生的条件概率。

关于贝叶斯统计的更多细节,请参考我的一篇文章:

[## 贝叶斯统计终极指南

towardsdatascience.com](/the-ultimate-guide-to-bayesian-statistics-ed2940aa2bd2)

15、什么是最大似然估计(MLE)?

最大似然估计是利用贝叶斯定理通过最大化似然函数来估计参数。根据贝叶斯定理:

其中 P(θ)是参数的先验分布;P(y|θ)是描述当我们有参数θ时观察到数据点 y 的可能性的似然函数;P(y)是证据,通常用来归一化概率。最大化 P(θ|y)是寻找最优θ的目标,其中我们最大化给定所有数据点 y 的θ的条件概率。在实践中,一旦我们知道分布,我们就可以很容易地计算 P(y|θ)。因此,我们通过最大化关于θ的似然函数 P(y|θ)来解决优化问题。

16、利用贝叶斯定理求解 下列问题:

1、50%接受第一次面试的人会接受第二次面试

你的朋友中有 95%的人得到了第二次面试机会,他们觉得第一次面试很成功

你的朋友中有 75%没有得到第二次面试机会,他们觉得第一次面试很好

如果你觉得你第一次面试很好,你获得第二次面试的概率有多大?

解决这类问题的关键是仔细定义事件。假设你的朋友很好地代表了整个人口:

  • 我们把对第一次面试感觉良好定义为事件 A,把收到复试事件 B 定义为;
  • 根据 1,P(B)=0.5,这样 P(不是 B)就是 1 减 P(B),也是 0.5;
  • 根据 2,P(A | B)= 0.95;
  • 根据 3,P(A |不是 B) = 0.75。
  • 给定 P(B),P(A|B),P(A |非 B),P(B|A)是什么?

根据贝叶斯定理:

因此:

17、相关性和因果性的区别是什么?

相关性是两个变量之间的关系,它可以是正的、负的、零的或很小的相关性,取决于以下等式的符号和大小:

X 和 Y 之间的相关性

其中:

X 和 Y 的协方差

Cov(X,Y)是两个变量的协方差,Cor(X,Y)通过 X 和 Y (Sx,Sy)的标准差归一化,使得相关性可以在-1 和 1 之间。当相关性等于-1 时,X,Y 具有完美的负相关性,当相关性等于 1 时,它们具有完美的正相关性。当相关性的绝对值接近零时,X,Y 相互之间的相关性很小。

因果关系更难捕捉,它是 X 和 Y 之间的关系,X 导致 Y 发生,反之亦然。例如,在一项研究中,你可能观察到人们每天吃更多的蔬菜更健康,吃蔬菜和健康水平之间显然有正相关。然而,如果仅仅基于这些信息,你不能声称吃更多的蔬菜会使你更健康,这是在陈述因果关系。您可能会观察到这种关系,因为您的研究中的受试者有其他健康的生活方式(省略变量),可以提高他们的健康水平,吃蔬菜只是他们的健康习惯之一。寻找因果关系需要额外的信息和仔细的建模。更多细节,我有一篇讨论因果推理的文章:

[## 因果推理:什么、为什么和如何

验证决策过程

towardsdatascience.com](/causal-inference-what-why-and-how-d7336b0081ec)

18、什么是辛普森悖论?

辛普森悖论指的是在多个群体中观察到的趋势或关系在群体组合时消失或逆转的情况。为什么会有辛普森悖论的快速答案是混杂变量的存在。我有一篇文章用一个例子解释了辛普森悖论:

[## 所谓的“辛普森悖论”

我们因为失去了它而变得更好

medium.com](https://medium.com/the-innovation/the-so-called-simpsons-paradox-6d0efdca6fdc)

19、什么是混杂变量?

混杂变量是与因变量和自变量都相关的变量。例如,在检查吸烟和死亡率之间的因果关系时,年龄是一个混杂变量,因为随着年龄的增长,死亡率增加,吸烟率下降。不能控制年龄会造成统计推断中的辛普森悖论。

20、什么是 A/B 测试,什么时候可以用,什么时候不可以用?

A/B 测试是对 A 和 B 两个变量进行随机实验。通过统计假设测试或“双样本”假设测试,A/B 测试是一种比较单个变量两个版本的方法,通常通过测试受试者对 A 变量和 B 变量的反应,并确定两个变量中哪个更有效。它通常用于改善和优化用户体验和营销策略。

不是每个实验都可以通过 A/B 测试进行:

  • A/B 测试不利于测试长期效果
  • A/B 测试只能比较两个版本,但不能告诉你缺什么
  • 当市场存在网络效应时,不能使用 A/B 测试。例如,你不能在同一市场上提高某些消费者的价格,同时降低其他消费者的价格,因为这将扭曲市场需求。

21、什么是 PMF/PDF?

概率质量函数 ( PMF )是给出离散随机变量恰好等于某个值的概率的函数。PMF 对连续随机变量不起作用,因为对于连续随机变量 P(X=x)=0 对于所有的 x∈R .相反,我们通常可以定义概率密度函数(PDF) 。PDF 是概率的密度而不是概率质量;

x0 处的 PDF

22、总结重要分布。

我有一篇文章总结了最重要的分布,包括它们的假设、PDF/PMF、模拟等。请点击此处查看:

[## 数据科学中必须知道的七种统计分布及其模拟

假设、关系、模拟等等

towardsdatascience.com](/seven-must-know-statistical-distributions-and-their-simulations-for-data-science-681c5ac41e32)

这是所有 22 个基本的统计问题。帮助这篇文章帮助你准备你的面试或者刷新你在统计课上的记忆。感谢您的阅读!

这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!

[## 我的博客文章库

我快乐的地方

zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

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

24x5 人工智能股票交易代理预测股票价格|实时交易

原文:https://towardsdatascience.com/24x5-stock-trading-agent-to-predict-stock-prices-with-deep-learning-with-deployment-c15570720ae9?source=collection_archive---------4-----------------------

乔丹·怀特菲尔德Unsplash 上的照片

如果你最近关注股票市场,你会注意到新冠肺炎带来的剧烈波动。它一天涨一天跌,这是人工智能很容易预测的。如果有一个拥有人工智能能力的股票交易代理人来买卖股票,而不需要每小时监控,那岂不是很棒?

所以我决定创造一个机器人来交易。你会看到许多从 CSV 读取并创建神经网络的模型,LSTM,或深度强化模型(DRL)。然而,这些模型最终会出现在沙盒环境中,并且在真实环境中使用起来往往很棘手。所以我创造了人工智能管道,实时交易。毕竟,谁不想在股市里赚钱呢?所以让我们开始吧。下面是我们将遵循的实施流程。

  1. 羊驼经纪人账户
  2. 用于 API 交易的羊驼毛 python 包
  3. 收集数据、EDA、特征工程
  4. 人工智能模型与训练
  5. AWS 云托管代码并获得预测
  6. 创建一个 lambda 函数和 API
  7. 自动交易股票

工作流程

羊驼经纪人账户:

目前,大多数经纪公司提供零交易费。然而,并不是所有的经纪公司都有 API 选项来交易。羊驼提供免费交易用 python API 进行交易。一旦您创建了一个帐户,您将有纸交易和现场交易的选择。我们可以在纸上交易中测试策略,并在现场交易中实施。这只是实时交易的一个关键变化。

用于 API 交易的羊驼毛 python 包:

如果能有本地环境,可以安装 pip 包。安装后,您可以选择纸上交易或现场交易。

基于您的选择,您可以获得 API 和密钥。

现在,这些键将在我们的代码中使用。

import alpaca_trade_api as tradeapiapi = tradeapi.REST('xxxxxxxx', 'xxxxxxxxxx',base_url='[https://paper-api.alpaca.markets'](https://paper-api.alpaca.markets'), api_version='v2',)

收集数据并转换

获取数据

使用羊驼的一个好处是你可以从多边形 API 中获得历史数据。时间范围可以是分钟、小时、天等。创建数据框后,图表应如下所示。

特征工程

像任何数据科学项目一样,我们需要创建与数据集相关的要素。实现的某些部分是从这篇文章中引用的。我从上面的数据集中建立了大约 430 多个技术指标。特征包括动量,趋势,波动,RSI 等。

已经为每一天创建了特征。它可以很容易地创建为每小时或任何其他时间段。对于我们将要创建的一些模型,如 DRL LSTM,我们可能需要使用原始数据集。

创建标签和特征是我们必须创建逻辑来训练模型的地方。目前,我使用了本文中的逻辑。

然而,创建逻辑可以根据您的需要进行更改。执行无监督学习时,不需要创建标签。

最后,需要对数据进行缩放。神经网络在缩放数据中工作得更好。第一个函数将使用训练数据拟合 scaler 对象,下一个函数用于缩放任何数据集。

# scale train and test data to [-1, 1]
def transform_scale(train):
    # fit scaler

    print(len(train.columns))
    scaler = MinMaxScaler(feature_range=(-1, 1))
    scaler = scaler.fit(train)
    # transform train
    return scaler# scale train and test data to [-1, 1]
def scale(dataset, scaler):
    # transform train
    dataset = scaler.transform(dataset)
    print(dataset.shape)
    return dataset

一旦我们创建了模型,我们必须准备好数据作为数据加载器。下面的函数将执行它。

def _get_train_data_loader(batch_size, train_data):
    print("Get train data loader.")

    train_X =    torch.from_numpy(train_data.drop(['labels'],axis=1).values).float()

    train_Y = torch.from_numpy(train_data['labels'].values).float()

    train_ds = torch.utils.data.TensorDataset(train_X,train_Y)return torch.utils.data.DataLoader(train_ds,shuffle=False, batch_size=batch_size)

人工智能模型

在本节中,我们将创建不同类型的模型。但是,这些模型对于时间序列数据集来说可能并不完美。我想展示如何使用具有完整管道的深度学习模型。

全连接深度 NN

这里我们将创建一个完全连接的深度神经网络。模型本身并不花哨,我也不指望它能表现得更好。此外,它也不是一个适合时间序列数据的模型。我使用这个模型只是为了使用我们所有的功能,并且为了简单起见。

然而,我们正从一个基本模型开始,以完善我们的管道。在下一节中,我将展示如何创建其他类型的模型。我们的 model.py 看起来像下面这个。

import torch.nn as nn
import torch.nn.functional as F# define the CNN architecture
class Net(nn.Module):
    def __init__(self, hidden_dim, dropout =0.3):

        super(Net, self).__init__()
        # Number of features
        self.fc1 = nn.Linear(427, hidden_dim)

        self.fc2 = nn.Linear(hidden_dim, hidden_dim*2)

        self.fc3 = nn.Linear(hidden_dim*2, hidden_dim)

        self.fc4 = nn.Linear(hidden_dim, 32)

        self.fc5 = nn.Linear(32, 3)

        self.dropout = nn.Dropout(dropout)

    def forward(self, x):

        out = self.dropout(F.relu(self.fc1(x)))

        out = self.dropout(F.relu(self.fc2(out)))

        out = self.dropout(F.relu(self.fc3(out)))

        out = self.dropout(F.relu(self.fc4(out)))

        out = self.fc5(out)

        return out

在创建了模型和所需的转换之后,我们将创建我们的训练循环。

我们将在 AWS Sagemaker 中训练我们的模型。这完全是一个可选步骤。模型可以在本地训练,模型输出文件可以用于预测。如果你在云端训练它,下面的代码可以用来训练。

您还需要一个具有 Sagemaker 设置的 AWS 帐户。如果你需要更多的信息或帮助,请查看我以前的文章,使用 AWS Sagemaker | PyTorch 设置部分训练 GAN 并生成人脸。

一旦您拥有了所有需要的访问权限,您就可以开始拟合模型了,如下所示。下面的命令将把所有必要的代码和数据打包,用所需的容器创建一个 EC2 服务器,并训练模型。

from sagemaker.pytorch import PyTorch#Check the status of dataloader
estimator = PyTorch(entry_point="train.py",
                    source_dir="train",
                    role=role,
                    framework_version='1.0.0',
                    train_instance_count=1,
                    train_instance_type='ml.p2.xlarge',
                    hyperparameters={
                        'epochs': 2,
                        'hidden_dim': 32,
                    },)

一旦您训练了模型,所有相应的文件将在您的 S3 桶。如果您在本地训练您的模型,确保您在相应的 S3 存储桶位置有文件。

AWS 云托管代码并获得预测

作为我们的下一个设置,我们将在 AWS Sagemaker 中部署模型。在 SageMaker 中部署 PyTorch 模型时,您需要提供 SageMaker 推理容器将使用的四个函数。

  • 这个函数和我们在训练脚本中使用的是同一个函数,它告诉 SageMaker 如何从 S3 桶中加载我们的模型。
  • input_fn:这个函数接收发送到模型端点的原始序列化输入,它的工作是反序列化输入,使输入可用于推理代码。在这里,我们将每天或每小时从羊驼 API 创建新数据。
  • output_fn:这个函数获取推理代码的输出,它的工作是序列化这个输出,并将其返回给模型端点的调用者。这就是我们交易的逻辑。
  • predict_fn:推理脚本的核心是进行实际预测的地方,也是您需要完成的功能。将使用基础数据进行预测。它有三种结果买入、卖出和持有。

下面是加载模型和准备输入数据的代码

以上代码中需要注意的几点:

  1. 模型和缩放对象需要在 S3 桶中。
  2. 我们已经收集了许多天或几个小时的数据。这是 LSTM 类型网络所必需的。
  3. 输入内容是股票代码。我们可以调整多个符号的代码。

在下面的代码部分,我们将创建输出并预测函数。

上述代码中需要注意的几点

  1. 我们有三个等级购买、出售或持有。预测需要是这三者之一。
  2. 我们需要关注预测和返回的内容。
  3. 只有在资金充足(或资金有限)且数量有限的情况下才交易。

部署类似于训练模型。

from sagemaker.predictor import RealTimePredictor
from sagemaker.pytorch import PyTorchModelclass StringPredictor(RealTimePredictor):
    def __init__(self, endpoint_name, sagemaker_session):
        super(StringPredictor, self).__init__(endpoint_name, sagemaker_session, content_type='text/plain')model = PyTorchModel(model_data=estimator.model_data,
                     role = role,
                     framework_version='1.0.0',
                     entry_point='predict.py',
                     source_dir='../serve',
                     predictor_cls=StringPredictor,)# Deploy the model in cloud serverpredictor = model.deploy(initial_instance_count=1, instance_type='ml.m5.large')

如果你想测试这个模型,你可以执行下面的代码。这表示工作流程正在运行,你可以输出你的预测,并在发行的股票行情自动收报机上交易股票。

预测端点名称

您也可以从截图中的上述代码中获得端点名称。

创建一个 Lambda 函数和 API

这里将通过创建 Lamda 函数和 API 来完成管道。

创建一个λ函数

在 AWS lambda 服务中创建 lambda 函数。记得从上面的截图中更新端点名称。

API 网关

从 AWS API 网关服务中,创建一个 Rest API。然后命名并创建 API。

从操作下拉列表中创建帖子并部署。一旦创建好了,API 就准备好了。如果需要,您可以在任何 UI 中使用它。

最后,我们有 Rest 端点,在这里我们可以创建 post 请求。可以用 Postman 或任何其他工具测试端点。如果不需要端点,可以通过跟随这个链接来调度 lambda 函数。

干杯!你可以在羊驼门户看到股票的买卖。预测是从我们的模型中预测出来的,实时数据被输入到模型中。

科林·沃茨Unsplash 上拍摄的照片

结论

我们已经训练了一个深度学习模型,并实时使用该模型的输出进行股票交易。我还是觉得有提升的空间。

  1. 我在这里使用了深度神经网络模型。你在这里不需要任何模型。您可以简单地使用您的逻辑并创建管道。
  2. 可以执行更好的特征工程和那些特征的选择。
  3. 不同的模型架构(如 LSTM 或 DRL)需要针对时间序列数据集进行测试。
  4. 需要对训练数据进行回溯测试。在本文中,我没有涉及回测。
  5. 该模型可以以频繁的间隔重新训练。AWS Sagemaker 提供了一个没有太多麻烦的选项。

如果对本文有足够的兴趣,我将写一篇后续文章,通过回溯测试实时添加对特定股票的情绪分析,并添加其他模型架构。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指南 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

放弃

这篇文章完全是信息性的。本笔记本中的任何内容都不构成任何特定安全性的建议。所有交易策略使用风险自担。

有问题吗?评论?请在评论区留下您的反馈。

查看其他文章

  1. 24x7 实时加密交易|购买 Doge 或任何使用情绪加密的产品
  2. 利用赚钱+ AI |甘形象生成

获取代码

请订阅我的 简讯 获取我的文章和其他更新的免费工作代码。

如果您喜欢,请:

利用网络数据提取发展业务的 25 招

原文:https://towardsdatascience.com/25-hacks-to-grow-your-business-with-web-data-extraction-4f1d36a43a11?source=collection_archive---------22-----------------------

我们都知道如今数据有多重要。这不是为什么的问题,而是我们如何最大化网络数据的价值以获得最大利益的问题。 Web 数据提取 是从任意网站获取数据,并将其转换为 CSV、Excel 等结构化格式的过程。通过自动化整个过程,你可以节省花在杂务上的宝贵时间,专注于真正重要的事情。

我概述了最流行的 25 种通过网络数据提取来发展业务的方法。我相信它会给你一个提升,激发一些想法。

营销

内容营销:

为你的下一篇博客文章构思出卓越的想法来超越你的竞争对手是很难的。不要浪费时间一页一页地浏览谷歌搜索结果。您可以将包括谷歌搜索结果在内的所有信息提取到一个电子表格中。接下来,大致了解一下哪个主题更有可能获得排名,以及它们的标题和描述是什么样子的。

竞争监控:

竞争监测通常需要同时从多个网站获取数据。为了跟上进度,您可能还需要定期提取信息。像 Octoparse 这样的网络抓取工具可以自动完成整个数据提取过程。

销售线索生成:

线索对任何企业的生存都非常重要。如果你准备扩大规模,需要更多的线索是岌岌可危的。不要再为无法转化的线索烧钱了。数据提取工具可以抓取网站上的数据。

搜索引擎优化监控:

通过提取关键词相关的结果和排名来监控 SEO 工作。网络数据提取使你能够理解为什么和如何你的竞争对手可以超越你的职位。

品牌监控:

维护你的网上形象可能很乏味,因为你必须整天盯着屏幕。把麻烦留给数据提取工具。它可以实时获取正面和负面的帖子和评论。此外,它还能帮助您及时发现诈骗短信

照片由唐恩应变Unsplash

电子商务和零售:

价格情报:

提高价格很难留住顾客,但降低边际成本、提高利润是必要的。你的产品最理想的价位是多少?这就是 web 数据提取的用武之地。您可以从不同的来源提取相同信息下的价格。接下来,关注别人部署的定价策略。他们有促销活动吗?他们降价了吗?

地图合规性:

当你在不同的商店和国家有多个分销渠道时,很难管理他们如何给你的产品定价。在 web 数据提取的帮助下,制造商可以提取产品和价格信息。因此,更容易发现谁违反了地图。

产品智能:

发现最畅销的产品具有挑战性。Web 数据提取自动化了提取产品列表和类别的过程,这提供了对畅销产品的洞察。此外,收集产品信息将有助于我们做出良好的产品分类决策。

数据科学:

自然语言处理:

我打赌你对 NLP 这个术语很熟悉。在大多数情况下,NLP 被用作分析客户情绪的手段。Web 数据提取是提供连续数据流的最佳方式,以满足洞察算法的需求。

机器学习训练模型:

机器学习现在是个热门词汇。基本上,这意味着我们把一堆数据扔进模型。然后,模型将研究这些模式并构建自己的逻辑。分配给它的数据越多,它生成的结果就越准确。在这方面,web 数据提取是在短时间内从多个来源大规模提取有价值数据的理想方法。

预测分析:

Web 数据抽取在预测分析中起着重要的作用,因为它收集数据来预测和预报趋势。精确的预测有助于企业预测未来市场,发现不可预见的风险并获得竞争优势。

照片由 Unsplash 上的 h heyerlein 拍摄

股票和金融研究:

新闻聚合:

在报纸上收集和保存新闻文章是一项严峻的任务。您可以使用数据提取工具来收集新闻文章。更好的是,您可以通过从不同的博客获取 RSS 提要,为您的读者创建一个包含最新信息的利基提要。

对冲基金:

对冲基金行业是网络数据提取的早期采用者,以评估投资风险和潜在的商业机会。时至今日,投资公司倾向于花更多的钱来获取数据以指导投资决策。

财务报表:

将来自许多资源的财务报表收集到一个结构化的格式中可能是一项相当艰巨的工作。手动浏览成千上万的论文进行分析会降低您的速度。在财务部这种快节奏的工作环境下是行不通的。Web 数据提取用于自动将财务报告收集成可用的格式,以便及时做出重要的投资决策。

市场研究:

进行彻底的市场调研,帮助营销团队进行更有效的规划。Web 数据提取使从多个社交媒体网站获取数据变得更加容易,从而获得洞察力并推动您的营销策略。

数据新闻:

难的不是写新闻报道,而是发现真相。这就是数据驱动型记者值得关注的地方。他们用科学的方法来分析数据和信息。网络数据提取使记者能够用收集到的信息创建自己的数据库,使他们能够从互联网上发现新的故事。

弗瑞德·卡尼在 Unsplash 上的照片

学术:

我们都有过这种经历——从谷歌学术搜索一页一页,只是为了收集足够的信息来写作业。Web 数据提取使这一过程变得轻松,因为您可以将相关信息提取和收集到一个电子表格中。看看这个 抓取模板 可以从谷歌学术网站上即时获取信息。

风险管理:

在风险管理方面,你需要大量的记录和调查报告。在这种情况下,很难创建一个法律数据库来进行背景调查。最简单的方法是提取犯罪记录、制裁名单、公司注册等。手头的信息越完整,提前降低的风险就越多。

保险:

网络数据提取有助于保险公司在撰写保单前收集替代数据来评估风险。此外,他们还可以分析潜在趋势,调整保险套餐,以提供更好的服务。

其他:

房地产列表:

房地产经纪人可以利用 web 数据提取工具从不同的网站提取房产列表。它使代理人能够获得周围财产信息的全貌,以更好地衡量房子的价值。这为他们提供了最新的知识,帮助他们达成更多交易。

工作公告板:

想创建一个工作聚合网站吗?尝试 web 数据提取。你可以从公司的招聘栏里收集招聘信息。你想要多少就有多少。

政府

网上有很多公开的记录,但不能下载。Web 数据提取可以将包括统计报告、新闻稿、表格内容在内的信息转换为 excel 表格,以供进一步分析。

旅游和酒店

在网上检索登机和航班信息是一项艰巨的工作,因为它们的价格很大程度上受可用性的影响。为了在顾客的预算范围内提供满足他们旅行体验的最佳旅游套餐,使用 web 数据提取来收集更新的信息是至关重要的。

体育博彩

你是梦幻足球迷吗?或者体育博彩。你应该试试 web 数据提取刮博彩网站 比较赔率。任何人都会喜欢低风险赌博,不是吗?在提取数据之前,请注意他们网站的法律合规性。如果你不确定,可以查看我的博文: 网页抓取合法

制药数据

自动将所有类别的药物收集到信息存储库中的结构化信息中。或者获取所有制药公司的信息以获得销售或营销团队的竞争优势,web 数据提取可以轻松地获取数据。

这些只是 web 数据抽取应用的一些例子。事实上,web 数据抽取的潜力是巨大的,因为它被设计成自动地从因特网上检索 web 数据。最好的部分是 数据提取工具 通过简单的拖拽和点击使这个过程变得更加容易。查看 2020 年最佳 10 大数据提取工具为您的企业赋能!

原载于 2020 年 3 月 10 日http://www . data extraction . io

25 种热门的新数据工具以及它们不做的事情

原文:https://towardsdatascience.com/25-hot-new-data-tools-and-what-they-dont-do-31bf23bd8e56?source=collection_archive---------10-----------------------

“等等,工具 X 和工具 Y 一起工作吗?我认为他们很有竞争力。”

如今,在快速增长的数据生态系统中,有数十种新工具。他们一起以令人兴奋、高效且通常令人惊讶的方式重塑数据工作。未来十年数据格局的种子已经播下,并且正在疯狂生长。

事实证明,培养一个新的生态系统是很麻烦的。

照片通过 Unsplash

困惑

混乱的一个症状是,许多这些工具被认为是有竞争力的,即使它们不是。

认为存在虚假竞争并不奇怪,因为:

  • 工具之间有很多重叠的功能。部分原因是因为工具和产品需要“剔除”基本功能——有时在不是它们主要关注的领域;
  • 增长轨迹和品类边界仍不确定;
  • 没有一个单一的工具是普遍存在的,即使是在一个特定的领域;
  • 创业者在向风投推销产品时,会被激励去讲述一个“大故事”。

所以这种困惑是很自然的。

也不好。对于试图专注的工具构建者来说是坏消息,对于试图评估市场的投资者来说是坏消息,对于试图利用最好的新工具选项构建高效数据堆栈的数据科学家和工程师来说尤其糟糕。

澄清时间

这篇博文是莎拉·卡坦扎罗(合作伙伴,Amplify Partners)阿部恭(超导/远大前程联合创始人)本人(数据委员会&数据社区基金创始人)开始清理混乱和纠结的合作。它起源于初创企业社区中人们的对话,他们厌倦了“等等,你们不是竞争对手吗?”-风格问题。

我们遇到的这些问题足以让我们认识到这种模式。我们已经看到了它们对采用和协作的不幸拖累。现在是时候做点什么了。

你的工具不能做什么?

为了着手解决这个问题,我们联系了数据生态系统中的许多企业家和开源维护者,并问了两个问题:

1.你的工具最擅长什么?

2.你的工具不能做什么?

我们将搜索范围限制在开源项目和 B 轮融资前的公司。回答保持简洁明了,并且为了清晰起见进行了编辑。

下面列出了所有参与的工具,按照它们响应的顺序排列。

生态系统的混乱不会在一夜之间消除,但我们希望这篇文章是一个好的开始。

工具和答案

  1. 远大前程/超导:远大前程擅长测试数据系统,并从这些测试中创建文档。远大前程也做数据剖析。Great Expectations 是高度可插拔和可扩展的,并且是完全开源的。它不是管道执行框架或数据版本控制工具。
  2. Databand : Databand 是一款 DataOps 解决方案,在监控生产管道和检测工作流代码、数据或系统层面的问题方面表现独特,并帮助工程师分析问题的根本原因。Databand 不是管道编排、数据质量测试或数据版本控制的单点解决方案。
  3. Dolt /Liquidata: Dolt 是一个带有 Git 版本的 SQL 数据库。您可以像在 Git 中一样提交、区分、克隆、提取、分支和合并 SQL 数据库。Dolt 是一种独特的共享数据的好格式。Dolt 不是为特定的数据用例设计的,比如特性存储或数据转换。Dolt 是一个通用数据库,可以应用在这些用例中。
  4. 贝叶斯:贝叶斯是一个可视化的、探索性的数据分析工具。它通过推荐的可视化方式引导您,并通过基于叙述的交互式报告实现简单、可解释的见解共享。贝叶斯不是商业智能仪表板,也不是程序员的基于代码的笔记本。
  5. Hex : Hex 是一个计算型的笔记本平台,独特擅长分享。用户可以连接到数据,开发他们的分析,然后轻松地构建一个全交互的、漂亮的应用程序,组织中的任何人都可以使用。Hex 不是一个 ML 工程平台或图表工具。
  6. Sisu Data : Sisu 是一个前瞻性的分析平台,特别适合快速探索复杂的企业数据,并帮助分析师解释关键业务指标为什么会发生变化。Sisu 可以在几秒钟内测试数亿个假设,并引导用户找到影响最大的变革驱动因素。Sisu 不是一个预测或建模工具,也不是一个描述性的仪表板。
  7. Ascend:: Ascend 特别擅长用少得多的代码构建、运行和优化纯云数据管道。Ascend 将数据链接到生成数据的代码,通过自动维护、数据分析、沿袭跟踪、成本优化以及与数据库、仓库、笔记本和 BI 工具的轻松集成,实现声明式数据管道。Ascend 不是通用的 Spark 解决方案,而是顶层的数据工程平台。
  8. Dataform : Dataform 在帮助您管理数据仓库中的数百个数据集方面是独一无二的。Dataform 帮助团队将原始数据转化为一套定义明确、经过测试并记录在案的数据集,用于分析。数据表单不是提取工具。
  9. DataKitchen : DataKitchen 是一款 DataOps 流程工具,能够为复杂的数据科学和分析世界带来持续部署、可观察性、测试和环境管理。DataKitchen 自动化分析创建/部署工作流、管道执行、代码/数据测试和管道监控/维护。DataKitchen 不是数据科学、ETL 或专用编排工具。
  10. 通气管是一个以编程方式构建训练数据集的平台。在 which 中,用户不用手工标注数据,而是编写标注函数,which 使用基于理论的建模技术将这些函数结合起来。浮潜不是无监督学习;它是一个人在回路的平台,专注于从根本上加速用户如何将他们的领域知识注入 ML 模型。
  11. Transform (stealth): Transform 正在构建一个指标存储库,确保企业能够以一种标准化的、格式良好的、有组织的方式获取指标定义,以简化分析,并自信而快速地做出决策。Transform 不是数据管道框架或商业智能工具。
  12. Materialize : Materialize 特别擅长在流数据之上执行和维护 PostgreSQL 查询(包括连接),在高吞吐量的情况下,以毫秒级延迟保持这些查询的最新状态。Materialize 不是时序数据库或另一个流微服务平台。
  13. Data Hub /LinkedIn: DataHub 是一个由元数据驱动的搜索和发现应用程序,旨在提高人工智能和数据科学的生产力。它具有独特的流优先分布式元数据架构,这使它在 LinkedIn 的人员和大数据规模上取得了成功。它不是数据集成或处理工具,也不是运行数据质量检查的协调器。
  14. 提督:提督是一个工作流程编排工具,允许你使用纯 Python API 定义任务流,并使用现代的、可扩展的基础设施轻松部署它们。Prefect 为您提供了构建健壮管道所需的语义,例如重试、日志记录、缓存、状态转换回调、失败通知等等,而不会妨碍您的代码。Prefect 不是一个无代码工具或基础设施提供商。
  15. Mara/项目 A: Mara 非常擅长将 SQL、Bash & Python 脚本编写到管道中。从命令行或通过 web 用户界面运行管道。本地执行,不用排队,不用工人,不用魔法。Mara 不是一个调度、数据移动或依赖性检测工具。
  16. dbt /Fishtown Analytics: dbt 擅长在数据仓库中创建、维护和记录基于 SQL 的业务逻辑的 Dag。dbt 不是一个通用的作业编排器。
  17. 警惕:警惕是唯一擅长于快速和大规模地创建高质量的、带有概率标签的训练数据,而不需要大量的人类标签员。观察让你通过反馈快速建立、测试和原型化模型。它不是一个管理标签服务或分析工具。
  18. Preset 是一个基于 SaaS 的数据探索和可视化平台,由 Apache Superset 的开发者开发。预设是关于可视化和数据消费,它不是一个计算或编排平台。
  19. Kedro : Kedro 擅长数据和 ML 管道的软件工程最佳实践。Kedro 使用可再现的分析工作流、I/O 抽象和管道建模,实现了从实验到生产的无缝过渡。Kedro 不是一个工作流程编排器或实验跟踪框架。
  20. Toro Data : Toro 非常擅长帮助团队部署对数据的监控,建议监控哪些内容,并且无需编写和部署代码就能轻松完成。Toro 不清理或转换数据,也不控制管道/工作流。
  21. 泰克顿:泰克顿非常擅长策划和服务功能。Tecton 不是数据处理引擎(如 Spark)或模型管理工具。相反,它利用现有的数据处理引擎来处理原始的批处理/流/实时数据,将其转换为功能,并部署这些功能用于培训和服务。
  22. Dag ster/Elementl:Dag ster 是一个数据编排器,它非常擅长为本地开发、测试、部署和运营构建数据应用程序。Dagster pipeline 组件以任何语言或框架创作,并通过公共元数据和工具组合形成统一的数据应用程序。Dagster 不是处理引擎,也不是数据仓库/对象存储。
  23. Select Star : Select Star 是一个解决数据发现问题的数据目录和管理工具。它在帮助您了解您的数据方面有着独特的优势—您拥有哪些数据,数据存储在哪里,数据的结构如何,以及数据的使用情况如何。Select Star 不提供 SQL 客户端或 ETL 处理。
  24. 蒙特卡洛:蒙特卡洛是一个数据可靠性平台,包括数据监控、故障排除和事故管理。蒙特卡洛不是一个测试框架、管道或版本控制工具。
  25. Flyte 在迭代开发可伸缩的、容器原生的和可重复的管道方面是独一无二的,这些管道连接不同的分布式系统,同时将数据流置于前端和中心。Flyte 不是一个机器学习平台,但可以成为其中的核心组件。

开始对话

我们编制这份清单有两个目的。一方面,我们要赞扬这些了不起的工具、创始人和 OSS 领导人,他们推动了我们数据工具生态系统的发展。另一方面,我们希望在社区中围绕清楚地理解这些工具的有意限制展开有益的对话。没有人能把每件事都做得比所有人都好;甚至是创新者!

我们希望这篇文章对我们的现代数据工具生态系统“野生花园”有所启发。当我们用心培育它时,愿它继续茁壮成长。

2020 年你应该尝试的 25 个鲜为人知的 Java 库

原文:https://towardsdatascience.com/25-lesser-known-java-libraries-you-should-try-ff8abd354a94?source=collection_archive---------7-----------------------

对 Java 和 JVM 软件开发有很大帮助的库

图片由 StartupStockPhotos 来自 Pixabay

25 年前,詹姆斯·高斯林创造了 Java,永远改变了编程语言的版图。与许多其他编程语言不同,Java 在其整个生命周期中都享有很高的流行度和业界的高需求。

Java 有一个引人注目的核心库,它提供了许多基本功能。由于它的高普及性,存在许多成熟而强大的 Java 库。作为一名务实的软件开发人员,我更喜欢解决业务问题。为了解决常见的或重复出现的问题,我更喜欢使用成熟的库,而不是重新发明轮子。

在之前的一篇博文中,我列出了每个 Java 开发人员都应该知道的 10 个最重要的第三方 Java 库:

[## 每个 Java 开发人员都应该知道的 10 大库

Java 和 JVM 软件开发中基本 Java 库的精选列表

towardsdatascience.com](/top-10-libraries-every-java-developer-should-know-37dd136dff54)

在这篇文章中,我想介绍另外 25 个 Java 库来庆祝 Java 的 25 周年。这些库是成熟的,可以为您在 Java 软件开发中可能面临的常见问题提供久经考验的解决方案。

请注意,我不包括那些我在以前的帖子中已经列出的库。另外,我在这里主要列出了库,没有列出框架。

1.RxJava

reactive Extensions(react vex)是一种流行的软件开发范例,用于处理异步和事件驱动的编程。RxJava 是使用 Observables 的反应式扩展的 Java VM 实现。它扩展了 Observer 模式,通过以声明的方式在事件/数据序列上添加可组合的操作符来支持事件驱动的编程。它还隐藏了底层的复杂性,如线程、线程安全、同步和并发数据结构。

如果想用 Java 做反应式编程,那是必备库。

链接:

[## react vex/rx Java

RxJava 是反应式扩展的 Java VM 实现:一个用于组成异步的和基于事件的…

github.com](https://github.com/ReactiveX/RxJava)

2.OkHttp

HTTP 是目前使用最多的应用层协议。有许多优秀的基于 Java 的 HTTP 客户端库。但是 OkHttp 是 JVM 中最简单但功能强大的 Http 客户端库。它为用 Java 开发 HTTP 客户端提供了流畅、简洁的 API。

它还支持一些高级特性:连接池、GZIP 收缩、响应缓存、现代 TLS 特性等等。

链接:

[## square/okhttp

有关文档和 API,请参见项目网站。HTTP 是现代应用程序联网的方式。这是我们交换的方式…

github.com](https://github.com/square/okhttp)

3.米巴蒂斯

在大多数软件开发项目中,我们需要存储数据。虽然有许多类型的数据存储,SQL 仍然是最常用的数据存储类型。作为一名 Java 开发人员,我们需要将 Java 对象与 SQL 表相匹配。实现映射的一种方法是使用 ORM(例如 Hibernate)。但是当您想要完全控制对象-表映射(例如,性能)时,有许多用例。在这些情况下,您可以直接使用 JDBC 并编写 SQL 查询。另一种方法是使用 MyBatis 将 Java 对象映射到存储过程或 SQL 语句。它提供了基于注释或基于 XML 描述符的映射。

比起普通的 JDBC,我更喜欢 MyBatis,尤其是在大型项目中,因为它改善了关注点的分离。

链接:

[## mybatis/mybatis-3

MyBatis SQL mapper 框架使得在面向对象的应用程序中使用关系数据库变得更加容易…

github.com](https://github.com/mybatis/mybatis-3)

4.HikariCP

HikariCP 是这个列表中第二个与数据库相关的库。建立 JDBC 连接是资源昂贵的。如果每次访问数据库时都创建一个新的连接,并在完成后关闭它,这会严重影响应用程序的性能。更不用说未能正确关闭连接或允许无限制数据库连接会导致应用程序崩溃。

使用连接池意味着在每次请求连接时重用连接,而不是创建连接。HikariCP 是 JVM 中一个非常快速但轻量级的数据库连接池。它也非常可靠,是一个“零开销”的 JDBC 连接池。

链接:

[## brettwood ridge/hikar ICP

快速、简单、可靠。HikariCP 是一个“零开销”的生产就绪型 JDBC 连接池。大约 130 kb……

github.com](https://github.com/brettwooldridge/HikariCP)

5.龙目岛

在现代,Java 经常被批评为一种冗长而臃肿的编程语言。与其他流行语言(JavaScript、Python、Scala、Kotlin)相比,开发人员需要用 Java 编写大量样板代码。尽管 Java 在 JDK 15 中引入了记录以减少 Java 中的样板代码,但它不是 LTS 版本。幸运的是,一个库已经可以显著减少 Java 中的样板代码:Project Lombok。通过添加一些注释,可以生成 getters、setters、hashcode、equals、toString、Builder 类。此外,它还提供了空指针检查、记录器等等。

链接:

[## rzwitserloot/龙目岛

Project Lombok 是一个 java 库,可以自动插入到您的编辑器和构建工具中,为您的 java 增添趣味。从不…

github.com](https://github.com/rzwitserloot/lombok)

6.VAVR

Java 终于在版本 8 中发布了期待已久的通过 Lambda 和 Streaming 的函数式编程。如果你习惯于函数式编程或者想要深入函数式编程,你可能会发现 Java 的函数式编程有所欠缺。相比其他很多函数式编程语言(Haskell,Scala),Java 就显得苍白无力了。VAVR 是一个可以填补 Java 中函数式编程特性空白的库。它提供了持久集合、错误处理的功能抽象、并发编程、模式匹配等等。

链接:

[## Vavr

Oracle 和 Java 是 Oracle 和/或其附属公司的注册商标。其他名称可能是他们的商标…

www.vavr.io](https://www.vavr.io/)

7.Gson

多年来,JSON 已经成为事实上的数据交换格式。在 Java 中,也存在一些优秀的库来处理 JSON。其中一个是杰克逊,我在以前的文章中提到过。另一个优秀的库是谷歌的 Gson。不像 Jackson,它是一个极简主义的库,只支持 JSON。它提供数据绑定、广泛的通用支持、灵活的定制。Gson 的一个主要优点(或者缺点取决于您的喜好)是它不需要注释。

链接:

[## 谷歌/gson

Gson 是一个 Java 库,可以用来将 Java 对象转换成它们的 JSON 表示。它也可以用来…

github.com](https://github.com/google/gson)

8.jsoup

如果你正在用 Java 开发你的应用程序,并且需要处理 HTML,你应该使用 jsoup。这是一个 Java 库,用于处理现实世界中的 HTML。它为获取 URL、提取和操作数据提供了一个非常方便的 API。它实现了 WHATWG HTML5 规范,并使用最好的 HTML5 DOM 方法解析 HTML。它支持从 URL/字符串解析 HTML,查找和提取数据,操作 HTML 元素,清理 HTML,输出 HTML。

链接:

[## jhy/j 组

jsoup 是一个用于处理真实世界 HTML 的 Java 库。它提供了一个非常方便的 API 来获取 URL 和…

github.com](https://github.com/jhy/jsoup)

9.移转

如果您正在开发一个企业级应用程序,它至少应该是云就绪的。使您的应用程序云就绪的第一步是将您的应用程序容器化,即,将您的 artifactory 二进制文件放入 Docker 映像。对 Java 应用程序进行 Docker 化是一件有点繁琐的工作:你需要对 Docker 有深入的了解,你需要创建一个 Dockerfile,你还需要 Docker Daemon。对 Java 开发者来说幸运的是,Google 已经使用现有的工具创建了一个开源的 Java 容器。您可以使用 JIB 作为 Java 库来构建优化的 Docker 和 OCI 映像。

[## 谷歌集装箱工具/三角帆

你最喜欢 Jib 的什么?有哪些需要改进的地方?请通过一分钟的调查告诉我们。你的…

github.com](https://github.com/GoogleContainerTools/jib)

10.(发)丁当声

Tink 是 Google 列表中另一个方便的 Java 库。密码学和安全性在软件开发中变得越来越重要。加密技术用于保护用户数据。正确实现加密需要大量的专业知识和努力。Google 的一组密码学家和安全工程师编写了多语言密码库 Tink。它提供了易于使用但难以误用的安全 API。Tink 通过不同的原语提供加密功能。它提供对称密钥加密、流式对称密钥加密、确定性对称密钥加密、数字签名、混合加密和许多其他加密功能。

链接:

[## 谷歌/tink

Tink 是一个多语言、跨平台的开源库,它提供了安全、易于使用的加密 API

github.com](https://github.com/google/tink)

11.Webmagic

如果你从事网络爬虫工作,你可以自己编写爬虫,既费时又繁琐。在 Java 中,Webmagic 是一个优秀的网络爬虫库,涵盖了爬虫的整个生命周期:下载、URL 管理、内容提取、持久化。它提供了一个简单而灵活的核心、注释支持、多线程和易于使用的 API。

链接:

[## code4craft/webmagic

一个可扩展的爬虫框架。它涵盖了爬虫的整个生命周期:下载、url 管理…

github.com](https://github.com/code4craft/webmagic)

12.ANTLR 4

如果您致力于解析和处理数据,那么 ANTLR 库可能会很方便。它是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它让我们能够访问语言处理原语,如词法分析器、语法分析器和运行时来处理文本。

它通常用于构建工具和框架。

链接:

[## antlr/antlr4

ANTLR(另一个语言识别工具)是一个强大的解析器生成器,用于读取、处理、执行或…

github.com](https://github.com/antlr/antlr4)

13.咖啡因

如果您的应用程序需要大量读取,那么缓存可以显著提高应用程序的数据访问性能。Java 有很多很棒的缓存库。咖啡因是其中最好的。这是一个基于 Java 的高性能、接近最优的缓存库。它提供了一个流畅的缓存 API 和一些高级特性,如异步加载条目、异步刷新、弱引用键等。

链接:

[## 苯海拉明/咖啡因

Caffeine 是一个基于 Java 8 的高性能、近乎最优的缓存库。有关更多详情,请参见我们的用户指南…

github.com](https://github.com/ben-manes/caffeine)

14.韵律学

一旦您的 Java 应用程序运行到生产环境中,您将希望深入了解应用程序的关键组件。Dropwizard 框架中的 Metrics 是一个简单但引人注目的 Java 库,它提供了对您的应用程序和 JVMs KPI 的洞察,例如,事件率、挂起的作业、服务健康检查等等。它是模块化的,为其他库/框架提供模块。

链接:

[## 下拉向导/指标

📈捕获 JVM 和应用程序级别的指标。所以你知道发生了什么。有关更多信息,请参见…

github.com](https://github.com/dropwizard/metrics)

15.gRPC-Java

Google 在 2015 年创建了 gRPC 作为一个现代远程过程调用系统。从那以后,gRPC 变得非常流行,成为现代软件开发中使用最多的 RPC 系统之一。gRPC-Java 库是 gRPC 客户机的 Java 实现。如果您想在 Java 中使用 gRPC,那么这个库会很方便。

链接:

[## grpc/grpc-java

gRPC-Java 适用于 JDK 7。gRPC-Java 客户端在 Android API 级别 16 及以上(Jelly Bean 及更高版本)上受支持…

github.com](https://github.com/grpc/grpc-java)

16.Java WebSocket

传统的客户端-服务器单向通信。WebSocket 是通过单一 TCP 连接的双向通信协议。Java WebSocket 是一个用 Java 实现的 WebSocket 服务器和客户端的准系统。如果您是 Java 开发人员,并且希望使用 WebSocket,那么强烈推荐这个库。

链接:

[## TooTallNate/Java-WebSocket

这个存储库包含一个用 100% Java 编写的准系统 WebSocket 服务器和客户端实现。潜在的…

github.com](https://github.com/TooTallNate/Java-WebSocket)

17.JJWT

JSON Web Token (JWT)是现代软件开发中事实上的授权和安全信息交换格式。无论您是使用简单的基于会话的授权还是高度高级的基于 OAuth2 的授权,您都可能会使用 JWT。JJWT 是一个简单的 Java 库,用于在 Java 和 JVM 环境中创建和验证 JWT。它在所有实现的功能上都完全符合 RFC 规范。它支持可读和方便的流畅的 API。

链接:

[## jwtk/jjwt

JJWT 的目标是成为在 JVM 上创建和验证 JSON Web 令牌(JWT)的最容易使用和理解的库…

github.com](https://github.com/jwtk/jjwt)

18.招摇核心

OpenAPI 是机器可读接口文件的规范,用于描述、生成、消费和可视化 RESTful web 服务。Swagger-Core 是 OpenAPI 规范的 Java 实现。如果在 Java/JavaEE 应用程序中公开 REST API,可以使用 Swagger-Core 自动提供和公开 API 定义。

链接:

[## swagger-API/swagger-核心

注意:如果你找的是 Swagger Core 1.5.X 和 OpenAPI 2.0,请参考 1.5 分支。Swagger Core 是一个 Java…

github.com](https://github.com/swagger-api/swagger-core)

19.异步 Http 客户端

异步编程最近变得越来越流行,因为它具有非阻塞的特性。大多数流行的 Java HTTP 客户端库只提供有限的异步 HTTP 响应处理。异步 HTTP 客户端是一个流行的 Java 库,它提供异步 Http 响应处理。作为一个额外的特性,这个库还支持 WebSocket 协议。

链接:

[## 异步客户端/异步 http 客户端

在 Twitter 上关注@AsyncHttpClient。异步客户端(AHC)库允许 Java 应用程序轻松执行 HTTP…

github.com](https://github.com/AsyncHttpClient/async-http-client)

20.液态碱

作为软件开发人员,我们都知道版本控制、DevOps 和代码的 CI/CD 的重要性。在一篇博客文章中:进化数据库设计,伟大的马丁·福勒认为我们也需要版本控制和代码的 CI/CD。Liquibase 是一个工具,支持 Java 应用程序中 SQL 数据库变更的跟踪、版本控制和部署。如果您正在使用一个数据库不断发展的 SQL 数据库,这个工具可以极大地简化您的数据库迁移。

链接:

[## Liquibase |数据库的开源版本控制

灵活数据库更改很容易用 SQL、XML、JSON 或 YAML 定义更改。您的数据库订单的版本控制…

www.liquibase.org](https://www.liquibase.org/)

21.Springfox

我已经在这个列表中列出了 Swagger-Core,它可以为 vanilla Java 或 Java EE 应用程序自动生成 REST API 文档。在企业应用开发中,Spring MVC 已经超越 Java EE 成为头号应用开发平台。在基于 Spring 的 Java 应用中,Springfox 库可以从源代码自动生成 REST API 文档。

链接:

[## 弹簧狐狸/弹簧狐狸

关于这个项目的更多信息,请访问 Springfox 网站或…

github.com](https://github.com/springfox/springfox)

22.JavaCV

OpenCV 是一个计算机视觉和机器学习软件库。它是开源的,旨在为计算机视觉应用程序提供一个通用的基础设施。JavaCV 是 OpenCV 和计算机视觉领域许多其他流行库(FFmpeg,libdc 1394,PGR FlyCapture)的包装器。JavaCV 还配备了硬件加速全屏图像显示、在多个内核上并行执行代码的易用方法、用户友好的几何和相机及投影仪的颜色校准、特征点的检测和匹配以及许多其他功能。

链接:

[## bytedeco/javacv

JavaCV 使用来自计算机视觉领域研究人员常用库的 JavaCPP 预置的包装器…

github.com](https://github.com/bytedeco/javacv)

23.Joda 时间

在 Java8 之前的核心库中,Java 的日期和时间功能很差。Java8 在其 java.time 包中发布了急需的高级日期和时间功能。如果您使用的是旧版本的 Java(Java 8 之前),Joda time 可以为您提供高级的日期和时间功能。但是,如果您正在使用较新版本的 Java,您可能不需要这个库。

链接:

[## JodaOrg/joda-time

Joda-Time 为 Java 日期和时间类提供了高质量的替代品。该设计允许多个日历…

github.com](https://github.com/JodaOrg/joda-time)

24.Wiremock

HTTP 是现代应用程序开发中最受欢迎的传输协议,而 REST 是基于微服务的应用程序开发中事实上的通信协议。在编写单元测试期间,最好关注 SUT(被测系统)并模拟 SUT 中使用的服务。Wiremock 是 REST API 的模拟器,使开发人员能够针对不存在或不完整的 API 编写代码。在基于微服务的软件开发中,Wiremock 可以显著提高开发速度。

链接:

[## tomakehurst/wiremock

HTTP 响应存根、URL 匹配、标题和正文内容模式请求验证在单元测试中运行,因为…

github.com](https://github.com/tomakehurst/wiremock)

25.MapStruct

在 Java 应用程序开发中,您经常需要将一种类型的 POJO 转换成另一种类型的 POJO。实现这种 POJO 或 Bean 转换的一种方法是显式地对转换进行编码,这很繁琐。聪明的方法是使用专门开发的库来转换 POJO/Bean。MapStruct 是一个代码生成器,它根据配置方法的约定实现 POJO/Bean 之间的映射。生成的映射代码使用简单的方法调用,因此快速、类型安全且易于理解。

链接:

[## 地图结构/地图结构

MapStruct 是一个 Java 注释处理器,用于为 Java bean 类生成类型安全和高性能的映射器…

github.com](https://github.com/mapstruct/mapstruct)

结论

在本文中,我列出了 25 个 Java 库,通过利用测试库的常见任务,它们可以帮助您的软件开发工作。这些库不是特定领域的,无论您是为商业应用程序、机器人、Android 应用程序还是个人项目开发软件,它们都可以帮助您。请注意,对于像 Java 这样大而广的生态系统,这个列表并不是结论性的。有许多优秀的 Java 库我没有在这里列出,但是值得一试。但是这个库列表可以提供一个快速窥视 Java 生态系统世界的窗口。

类似文章:

[## 金融科技的编码语言:JVM 如何让你成功?

Java,Kotlin,Scala,Groovy,Clojure

md-kamaruzzaman.medium.com](https://md-kamaruzzaman.medium.com/coding-languages-for-fintech-how-will-jvm-make-you-succeed-89f84af22296) [## 每个 Java 开发人员都应该知道的 10 大库

Java 和 JVM 软件开发中基本 Java 库的精选列表

towardsdatascience.com](/top-10-libraries-every-java-developer-should-know-37dd136dff54) [## 10 个优秀的 GitHub 库,适合每一个 Java 开发者

面向 Java 开发人员的基本 GitHub 库的精选列表

towardsdatascience.com](/10-excellent-github-repositories-for-every-java-developer-41084a91ade9)

清理数据时要问的 25 个问题

原文:https://towardsdatascience.com/25-questions-to-ask-as-you-clean-data-a8024537341b?source=collection_archive---------20-----------------------

我在数据清理之前问这些问题,所以我知道开始时会遇到什么。

图片来自像素上的 bongkarn thanyakij

我是一名软件工程师和数据科学家,在笔记本和软件包中编写代码。如果你还没有听说过,你应该在编码之前停下来想一想,同样的概念也适用于数据清理。从最初的工作中退一步,开始思考手头的问题和您将清理的数据,这是很有价值的。考虑数据的最终用例也是一个好主意。您需要在报告或仪表板中使用它吗?数据会被很多人使用还是被一个人使用?您需要多久清理一次这些数据?至此,我将向您介绍我在处理数据清理之前考虑的 25 个常见问题。

数据摄取

当我开始一个项目时,我首先要考虑的是在我开始清理它之前,我将如何接收这个项目的数据。根据我从哪里获取数据,我可能需要执行不同的数据清理步骤。假设数据已经来自另一个团队。在这种情况下,在我接收数据之前,数据可能是干净的,这使我在处理数据之前更容易预处理数据。

1\. Do you need to ingest the data and then clean it, or is it cleaned at the source? 
2\. If you are reading in files that contain your data, can you clean and overwrite the file, or will you need to save it somewhere else to keep the raw file separate? 
3\. Do you need to save your cleaned data or keep it in a dataframe and save your analysis's output?
4\. Do you need a backup of the data somewhere? 
5\. What happens if the files become corrupted as you are cleaning it? Are you prepared to start over?

空白或 Null 字段

收到数据后,下一步是理解如何处理空值。数据集中很少会出现空值。相反,用户会添加一些晦涩难懂的大值,如-9999 或 9999、其他字符或单词。最好后退一步,理解用户是如何向数据集中添加空值的,并采取措施看看您将如何清除这些值。一旦知道了这些值在数据集中是如何表示的,就可以开始清除它们或在需要的地方输入值。

6\. Are there values that you can remove as empty or NULL values such as -1, -9999, 9999, or other characters? 
7\. Will these values be imputed as a string, numeric, or category? 
8\. Will you drop values that are empty or NULL? 
9\. Can these values be empty or NULL, and still have the data make sense to provide valuable action? If this value is missing, can you provide actionable insights? 
10\. Can work with those who created the data to develop a standard for what is considered empty or NULL?

文本字段

我要找的下一个东西是文本字段。当我使用文本字段时,我或者将它们用作类别(下面将讨论),或者用作将被显示或用于附加信息的纯文本。但是,如果您使用文本字段进行建模,会发生什么呢?您可能需要考虑不同类型的清理或自然语言处理技术来处理您的数据,例如词干化、词汇化或删除填充词。我发现处理文本字段更加困难,因为可能会有拼写、缩写、错误类型信息等方面的变化。

11\. Are there spelling mistakes in the column that you need to consider? 
12\. Can a word or abbreviation be spelled multiple ways? 
13\. Could there be more than one abbreviation for the same thing? 
14\. Do you need to extract data from the text field? If so, will you use regular expressions, stemming, lemmatization, remove filler words, white space, etc.? 
15\. Do you have timestamp or other numeric data type columns that read as strings but should be another data type?

类别和布尔值

当清理数据时,类别和布尔是最容易处理的两种数据类型,因为它们的列中变化较少。对于类别,我倾向于查看为给定列列出的唯一类别,以便更好地理解我正在处理的不同值。然后,我可以根据需要将这些信息返回给主题专家(SME ),以获得可能不清楚的类别的定义,例如映射到定义的数字或单个字母值。

16\. Will you keep your categories in a human-readable format or convert them using one-hot encoding? 
17\. Do you have too many or too little categories? 
18\. Do you have duplicate categories? Duplication can appear due to misspellings or added white space such as 'R' and 'R '. 
19\. Should you add another category if there are items that do not fit into the rest? 
20\. How will you represent boolean values? 0 and 1, True and False. Pick a schema and use it for all boolean columns to have consistency.

数字字段

最后,还有数字字段。我在查看数值字段时完成的一项常见任务是了解这些列中的汇总统计信息和数据分布。这种快速分析有助于了解数据的结构,以及是否存在任何明显的异常值。查看这些数据后,您可能还需要考虑与您的数值点相关的任何单位。您是否假设了特定列的单位,但似乎有些不对劲?在你继续你的工作之前,仔细检查这一点会有所帮助。

21\. Does the data columns' distribution seem appropriate, or do you need to investigate an issue?
22\. Do you need to know what metrics the data stands for, such as feet vs. inches or Celcius vs. Fahrenheit? Will the difference matter to your end calculations?
23\. Is the column all numeric, or are there other values to clean out from the data?
24\. Have you converted the column to the same data type, such as int or float? Will this conversion affect your end-use case for the data? 
25\. Is your data continuous or categorical? How will that data be used?

摘要

在数据科学项目中,数据清理和预处理可能会占用大量时间。在接收数据时,考虑在接收数据之前可能已经完成了多少清理工作,以及需要做多少清理工作。当您查看数据时,首先要考虑的是如何处理 null 或空数据值。你能清除它们吗,或者你需要在它的位置上估算一个值吗?一旦您做出了决定,您就可以开始查看每一列中的实际数据点,并制定一个计划来清理那些您认为合适的列。列可以包括类别、布尔值、数字和文本字段等内容。在建模前清理和预处理数据时,每种方法都需要考虑不同的因素。

在清理数据时,您会问哪些类型的问题?

如果你想阅读更多,看看我下面的其他文章吧!

[## 每位数据科学工程师的前三本书

我放在书架上的伟大资源,我喜欢介绍给软件工程师和数据科学家。

towardsdatascience.com](/top-3-books-for-every-data-science-engineer-e1180ab041f1) [## 在数据科学中我们需要面向对象编程吗?

让我们讨论一下作为一名数据科学家转向面向对象编程的利弊。

towardsdatascience.com](/do-we-need-object-orientated-programming-in-data-science-b4a7c431644f) [## 关于寻找数据科学项目的思考

有时候你需要在工作中把一个项目交给别人,这没什么。

towardsdatascience.com](/thoughts-on-finding-a-data-science-project-d4b74893f50)

25 条提高数据素养的明智原则

原文:https://towardsdatascience.com/25-sapient-principles-for-better-data-literacy-5ff5d42480a5?source=collection_archive---------31-----------------------

数据流畅的责任是对现实负责。只有这样,你才能做出最好的决定。

让我们将数据素养定义为分析、理解和交流数据的能力。如果我们还没有意识到,数据素养是数据驱动决策的一个重要组成部分。

来源:xkcd

转变产品团队分析的旅程是漫长的。我们终于到了这样一个地方,数据可以和我们说话,我们可以根据它告诉我们的东西做出决定。从本质上讲,这就是为什么读写能力可以在一个组织中创造或摧毁价值。误解的代价是巨大的。

在本帖中,我们将讨论如何通过以下方式提高您的数据素养:

  • 原则
  • 培训和实践

在我们讨论这些部分的时候,我会分享和剖析我最近看到的文盲现象。

让数据变得流畅不是一蹴而就的。磨练需要纪律、意识和合作。

数据读写原则

仔细想想,掌握数据就像学习一门新语言一样。有很多东西要学——新词汇、口语、语境和媒体。这里有一些让你进入正确心态的原则。

增强意识

  • 了解你的消息来源。并非所有来源都相同。知道来源的内在偏差是什么。
  • 了解你的数据的局限性。有时候你只有很小的历史观。或者,使用数据没有覆盖所有用例。
  • 对你的自信现实一点。你的数据永远不会完美,所以不要期望它是完美的。不完美是可以的——你只需要表达出来。
  • 确保数据是相关的。数据太多了。不要增加噪音。它会分散注意力,甚至打乱重要的决定。

在解释数据时

  • 注意盲点。盲点表现为以下形式之一:(1)我们知道自己不知道的东西,(2)我们不知道自己不知道的东西。
  • 获取其他视角。相信你的直觉,但也要接受他人对数据的解读。
  • 探索不同的解释。解读读数的方式有很多种,所以在这里拓展你的横向思维。这些解释中有一种最接近事实。
  • 保持简单。智慧表明最简单的解释是最好的。参见奥卡姆剃刀柯尔莫哥洛夫复杂度

在交流你的见解时

  • 讲故事。在我的上一篇文章中,我谈到了讲故事在推动决策中的作用。这是让你的信息持久的好方法。
  • 使之相关。同上,但值得重复。
  • 关注洞察力,而不仅仅是数据点。人们很容易重复“事实”和花絮。将数据提炼为经验和行动要困难得多。
  • 要透明。数据流畅的一个责任是知识上的诚实。交流缺点、风险和注意事项。
  • 分解一下。随着你变得越来越流利,你的基本分析也会变得越来越复杂。确保你能传达方法论。

对本组织的期望

  • 投资培训。您已经投资了数据和工具。坚持到底。资源有限的培训无法很好地扩展。
  • 奖励数据素养。如果你想让数据素养成为一种能力,光学很重要。一定要认出表现流畅的人。
  • 根据重要目标调整培训。我从《走向数据科学》的帖子“培养数据素养的三个必须”上得到这个。
  • 从顶部开始。你需要展现奉献精神和数据素养的领导力。一个领导者茫然地看着别人,不知道发生了什么,这是非常令人失望的。

我要 800 美元的《谬误》。(那是 Jeopardy!参考)

假设你是一名高级产品主管。你在一则新闻标题中读到,微软团队的用户数超过了其竞争对手 Slack(2000 万对 1300 万)。你的同事转向你说:“我认为 Slack 仍然会赢。”好奇,你求她解释。

她看着你说,“他们的 CEO 说他们有 50 多个客户,资产超过 100 万美元。其中超过 70%是[微软] Office365 客户端。”句号。

资料来源:美国消费者新闻与商业频道

想要澄清,你问她赢的定义。她说,“他们从大的 Office365 客户那里获得收入,所以他们必须赢。”句号。

你的理由是,“这并不意味着他们会赢。尤其是如果你考虑到 Office365 的收入比 Slack 高出多少。除了他们两个的活跃用户之外,我们不知道其他任何事情。”

她自信地回答,“嗯,他们的 CEO 说……”然后你就不听了。

那里发生了什么?嗯,有几件事。

  1. 纯反流。“首席执行官这样说。”
  2. 谬误或缺乏逻辑。“Slack 也被 Office 365 的客户收购了。”
  3. 缺乏深度。当被问及“赢”的定义时,我没有意见。
  4. 缺乏好奇心。对探索其他观点或衡量标准不感兴趣。

数据素养培训与实践

俗话说,“有目的的练习才能完美”。这也适用于数据素养。

扫盲培训的四项原则

  1. 最好的培训是与情境相关的。在创建培训课程时,选择一个重要的项目。列出你需要回答的关键问题。分析工具都是一样的——统计、代数、回归、决策树等等。将它们应用到相关的问题上,将会使这些教训变得有意义。
  2. 从基本面开始。也就是说,每个人都需要了解一些基准工具。这些包括聚合、分布、基本统计和概率。 Qlik 提供了一套很好的数据素养课程——从基础到更高级的技术。
  3. 坦然面对这种暧昧。计算一个数字很容易。知道用它做什么更有挑战性。(“好吧,现在你知道橄榄园每年烘烤 7 亿根面包棒。现在怎么办?”)
  4. 不要骄傲自大。有些人会学一件事,然后表现得好像什么都知道。干这一行很容易自卑。

识字实践的四项原则

  1. 找项目练。找到一组相关的项目,您可以应用团队学到的分析工具。尽可能用数据推理。挑战你的假设和他人的工作。那是健康的。
  2. 找导师。这个应该是比较有数据流畅经验的人。相对于你来说,这些人可能处于“初级”职位,但可能接触到更多的数据。询问他们对数据的解释,并陈述你的情况。为相似的人建立一个共鸣板,以获得更大的效果。
  3. 公开展示。这是一个棘手的问题,因为它会让人神经紧张。但是,这是实地测试你的技能组合的最佳方式。你的成长来自于回答意想不到的问题的能力和看待事物的不同。你还将练习改变他人的视角。
  4. 不断进化。整合不同的数据源。混合数据源。随着您对现有领域越来越熟悉,您可以扩展您的范围。寻找不同的方式来呈现和可视化你的见解。学习新技术。

我要 2000 美元的“错误”。

(在本例中,所有数字均基于真实发生的事件。名字是虚构的。)

我猜想吉米是产品 x 的项目经理。首席执行官金问吉米,产品 Y 的使用是否对产品 x 的使用有任何影响。吉米分析了一些数字,得出了下面的图表。

“哇,使用产品 X 和产品 Y的人点击产品 X 的次数更多。准确的说是多了 11.3%!”吉米

看到 11.3%的差异后,Jimmy 兴奋地向 CEO 汇报。“Kim,使用这两种产品的人点击产品 x 的可能性增加了 11.3%,”首席执行官 Kim 拍拍 Jimmy 的背,向公司介绍了这一惊人的发现。

让我们就此打住。通过 Jimmy 的分析,我们可以发现两个突出的问题。

  1. 没什么道理。当然,数据显示增长了 11.3%,但我们不知道是什么导致了这一增长。稍后将详细介绍。
  2. 那不太可能。这是一个比率。说 11.3%是一个用户点击的概率增加是假的。说他们有 11.3%的机会点击更多也是错误的。总的来说多了 11.3%,不是概率上的。

现在,回到故事… 你,数据流畅的 PM,对这些数字很好奇。具体来说,你想知道 是什么 在驱动这些数字。您会注意到这些指标是产品 x 的所有特性的平均值。

如果你看看引擎盖下,可能会有一个解释,哪些功能是造成颠簸。你对数据进行处理,得出下面的图表。

X+Y 用户真的爱搜索,嗯?

它看起来像查看主页有一个不错的 5%的小颠簸。不过,这并不能解释 11.3%中的一半。

啊,但是看看搜索功能。X+Y 用户的搜索量有高达 46%的增长。这是一个非常重要的发现。

你正准备与 Jimmy 和 Kim 分享这一点,但随后你意识到:同样的搜索功能也用于产品 Y。来自产品 Y 的搜索可能算作产品 x 中的搜索。计数有可能是错误的。

整个故事都变了。 产品 Y 可能不会像 Jimmy 想的那样影响产品 X 的使用。甚至可能没有关系。

祝你和组织里的其他人顺利解决这个问题。

我希望吉米的例子不是真的。吉米在现实生活中是一名高级项目经理。金确实告诉了成千上万的员工。那么它是在哪里分崩离析的呢?

  • 没有探究“为什么”或颠簸背后的驱动因素。原问题问因果关系。吉米根本没有回答那个问题。甚至有可能产品 Y 对产品 X 的使用没有任何影响。
  • 不会讲故事。见最后一点。
  • 没有意识到数据的盲点。关键的洞察力与吉米的第一次分析只差一个数据片段。知道两个产品使用相同的搜索功能,就暴露了一个盲点。

你可以对这个分析提出一些批评,但是你会明白的。我认为吉米是一个有自知之明的人,早就纠正了他的读写问题。

在您发展数据素养的过程中,我们已经讨论了许多不同的原则和注意事项。进化不是一个轻易使用的词。如果你接受压力,那么有很多压力可以推动你的流利程度提高。

以上例子都是真实的。它们并不意味着减损或阻碍。相反,它们是为了让你意识到陷阱。

保持数据流畅是一项重大责任。那就是对现实负责,在思想上诚实,这样组织才能做出最好的决定。

注册订阅我的简讯:投资您的产品分析技能组合

阅读其他关于转变产品分析能力的帖子

[## 卓越的分析始于经过验证的问题

分析最容易被忽视的方面也是最关键的——知道哪些问题很重要。

medium.com](https://medium.com/swlh/superior-analytics-starts-with-proven-questions-83e623fa27bf) [## 获取您需要的产品使用数据—转变您的产品团队分析的第 3 部分…

目标是在几分钟内对问题提供有见地的答案。了解在哪里以及如何快速获得产品…

medium.com](https://medium.com/swlh/getting-the-product-usage-data-you-need-ae0b825fa8b) [## 转变您产品团队的分析能力:您需要的数据

了解作为产品团队需要了解的数据。这篇文章涵盖了您需要转换的数据的基本原理…

medium.com](https://medium.com/swlh/the-data-you-need-to-transform-your-product-analytics-bd1659f9237b) [## 转变产品团队的分析能力:文化

我发展企业组织的产品管理分析和决策文化的经验综合…

medium.com](https://medium.com/swlh/transforming-your-product-teams-analytics-prowess-culture-31fb32798b19)

2D 直方图与 Plotly

原文:https://towardsdatascience.com/2d-histograms-with-plotly-a5ef9370e02d?source=collection_archive---------43-----------------------

如何用 plotly 创建更多信息量的直方图?

张家瑜Unsplash 上拍照

Plotly Python (plotly.py)是基于 plotly javascript (plotly.js)构建的开源绘图库。我喜欢 plotly.py 的一点是,它提供了一个高级 API ( plotly express )和一个低级 API ( graph objects )来创建可视化。使用 plotly express,我们可以用很少的代码行创建一个动态的、信息丰富的图。另一方面,我们需要用图形对象编写更多的代码,但是对我们创建的内容有更多的控制权。

在本帖中,我们将使用 plotly express 创建 2D 直方图,也称为密度图

直方图是数据分析中常用的图表,用于概括数据的分布。在直方图中,数字或分类数据的分布以条形显示。每个条形代表一个值范围或类别,条形的高度与落入该范围的值的数量成比例。

让我们首先创建 1D 直方图,然后升级到 2D 直方图(或密度图)。我们将使用著名的泰坦尼克号生存数据集,该数据集在 Kaggle 上这里可用。

我们从将数据读入熊猫数据帧开始:

import numpy as np
import pandas as pddf = pd.read_csv("/content/titanic_train.csv")print(df.shape)
df.head()

我只使用包含 891 名乘客数据的训练数据集。我们首先在“年龄”和“费用”列上创建直方图。

#import plotly express
import plotly.express as pxfig = px.histogram(df, x="Age",
                   title="Histogram of Age",
                   width=800, height=500)fig.show()

我们的年龄范围很广,但大多在 20 至 30 岁之间。让我们看看“Fare”列的分布情况。

票价一栏有一些极值。出于演示目的,我将删除票价大于 100 的行。这些行约占整个数据集的 6%。

len(df[df.Fare > 100]) / len(df)
0.05948372615039282df = df[df.Fare < 100]

我们现在可以绘制“票价”列的直方图。

len(df[df.Fare > 100]) / len(df)
0.05948372615039282df = df[df.Fare < 100]

大多数票价都不到 20 英镑,当我们涨到 100 英镑时,数字就会减少。

是时候引入 2D 直方图了,它结合了 x 轴和 y 轴上的 2 个不同的直方图。因此,我们能够可视化重叠或并发的密度。

len(df[df.Fare > 100]) / len(df)
0.05948372615039282df = df[df.Fare < 100]

它看起来像是一个散点图,带有区域,而不是显示单个点。我们有一个划分票价-年龄组合的网格。plotly 的交互式绘图允许您查看每个分区代表的范围以及这些区域中的点数。黄色分区包含最多的乘客。随着颜色变暗,落入隔板的乘客数量减少。

我们还可以使用边缘参数来可视化构成该密度图的直方图。

fig = px.density_heatmap(df, x="Age", y="Fare",
                         title="Density Map of Age and Fare",
                         marginal_x="histogram",
                         marginal_y="histogram",
                         width=800, height=500)fig.show()

除了密度图之外,我们还可以看到年龄和费用直方图。

你可能已经知道,泰坦尼克号生存数据集的目的是根据数据集中给出的数据来预测一名乘客是否幸存。特征(阶级、年龄、性别、费用……)被用作独立变量来预测目标(幸存)变量。在实现机器学习模型之前,我们可以使用数据可视化来了解某些特征是否会影响存活率。

让我们使用 facet_col 参数来区分基于“幸存”列的“年龄”和“费用”的密度图。

fig = px.density_heatmap(df, x="Age", y="Fare",
       title="Density Map of Age and Fare Based on Survival", 
       facet_col="Survived")fig.show()

密度图看起来相似,但我们可以得出结论,位于左侧图中的黄色区域会降低存活的机会。对于这两个网格,非幸存乘客与幸存乘客的比率(183/66)高于整个数据集中的相同比率(535/303)。

df.Survived.value_counts()0    535 
1    303 Name: Survived, dtype: int64

我们已经用 plotly 覆盖了 2D 直方图(密度图)。当然,这只是这个神奇的图书馆的一小部分功能。我们可以使用 plotly 动态创建许多其他绘图类型。它的语法也很容易理解。在接下来的帖子中,我会尝试涵盖更复杂的情节。你也可以查看 plotly 文档,我认为它有很多不同的例子。就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。

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

分析了 Glassdoor 上的 2K 以上数据分析师工作

原文:https://towardsdatascience.com/2k-data-analyst-jobs-on-glassdoor-analyzed-6db42336a2ae?source=collection_archive---------42-----------------------

工作列表数据集的探索性数据分析。

马库斯·温克勒在 Unsplash 上的照片

我们生活在数据时代。越来越多的企业意识到从数据中创造价值的潜力。技术进步为收集和分析数据提供了高效的工具,这进一步推动了企业对数据科学和分析的投资。因此,我们比以往更多地在各种平台上看到像数据分析师、数据科学家、机器学习工程师这样的工作清单。

我最近在 kaggle 上偶然发现了一个数据分析师职位列表的数据集,它包含了来自 glassdoor 网站的 2253 个职位的详细信息。我想研究这个数据集,以深入了解工作的细节。使用数据分析工具也是一个很好的实践。

我们将在整个帖子中练习的技能:

  • 熊猫的数据清理和分析
  • 使用 NLTK 的基本自然语言处理(NLP)技术
  • 用 matplotlib 和 seaborn 实现数据可视化

让我们从导入库开始。

#Data analysis
import numpy as np
import pandas as pd#NLP
import nltk
nltk.download("popular")#Data visualization
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
%matplotlib inline

我们现在可以把数据读入熊猫的数据框。

df = pd.read_csv("/content/DataAnalyst.csv")
print(df.shape)
df.columns

有 2253 个工作列表,上面有关于工作和公司的各种细节。

职位描述

工作描述栏包含一个描述工作细节的长文本,以及对申请人的技能要求。为了获得一个大概的了解,我们可以阅读所有的职位描述,这绝对不是以数据分析为导向的方法。另一种更可取的方法是应用自然语言处理(NLP)技术来推断一些见解。我将使用 NLTK 库提供的工具,但是有许多文本预处理库也有相同的工具。

一种方法是统计每个单词的出现次数,以检查最常见的单词。我们首先将“job description”列转换成一个长文本文件,然后将其标记化。标记化简单地说就是将文本分割成更小的单元,比如单词。

from nltk.tokenize import word_tokenize
text = ''.join(df['Job Description'])
words = word_tokenize(text)

我们使用了 NLTK 的 word_tokenize 模块。在进一步发展之前,我们需要解决一些问题。第一个是降低所有字母。否则,“数据”和“数据”将被作为不同的词来处理。像“a”、“the”、“we”这样的词对我们的分析没有用,所以我们需要将它们从标记化列表中删除。最后,标点符号需要被删除,这样它们就不会被算作单词。

#lowercase letters
words = [word.lower() for word in words]#Remove punctuation and stopwords
punc = [',','.',';','-','"','!','--','?', '."',"'",':',')','(',"'s"]from nltk.corpus import stopwords
stop_words = stopwords.words('english')words_filtered = [word for word in words if word not in (stop_words + punc)]

我们使用列表理解来过滤初始的标记化列表。NLTK 的 FreqDist 函数提供了显示每个单词出现次数的频率分布。

fdist = nltk.FreqDist(words_filtered)

让我们检查一下最常见的单词:

fdist.most_common(20)

最常见的词是“数据”(令人惊讶!).“经验”一词紧随其后,因为企业通常会具体说明他们希望应聘者具备的经验。除了一些例外,这些词更像是一般的工作描述词。

我们可以使用 fdist 对象访问特定单词的出现次数。

fdist['software']
1160

“软件”这个词被写了 1160 次。让我们为数据分析师工作创建一个常见编程语言/技能的列表,并检查它们的频率。

common = ['sql', 'python', 'r', 'hadoop','java', 'javascript', 'c', 'c++']dict_a = {}
for i in common:
  dict_a[i] = fdist[i]plt.figure(figsize=(10,6))
plt.title("Common words in job descriptions", fontsize=14)
ax = sns.barplot(x=list(dict_a.keys()), y=list(dict_a.values()))
ax.tick_params(labelsize=12)

不出所料,SQL 是第一名。SQL 的频率几乎是每个作业列表 1 个。SQL 之后是 python 和 R。如果这些是“数据科学家”的工作,我们会看到 python 和 R 比 SQL 更常见。这让我们了解了数据分析师和数据科学家之间的区别。

检查经常一起出现的单词通常会提供更多信息。例如,bigram 意味着标记化列表中的两个相邻元素。这可以扩展到任何 n 值的 n 元语法。让我们使用 NLTK 的二元语法频率分布函数创建一个频率分布。

bigrams_list = list(nltk.bigrams(words_filtered))
fdist2 = nltk.FreqDist(bigrams_list)fdist2.most_common(20)

这个元组列表让我们对工作描述有了更多的了解。

薪资估算

Glassdoor 提供了一个薪资估算的区间。

它也不是用于分析的理想格式。让我们先把它转换成一个漂亮干净的数字格式。最简单的方法似乎是以字符 2 和 3 为下限,7 和 8 为上限。但是,我们不能这样做,因为有些工资是 6 位数(如 123K)。另一种选择是先用熊猫的剥离方法将拆分为“-”字符的上下限,然后修剪掉“$”和“K”。“薪金估计”列中只有一个值缺失,用“-1”表示。我将首先用最常见的值替换该值。

df['Salary Estimate'].replace('-1', '$42K-$76K (Glassdoor est.)', inplace=True)lower = df['Salary Estimate'].str.split('-').str[0]
upper = df['Salary Estimate'].str.split('-').str[1]

让我们从较低的开始,因为它更简单。我们只需要去掉右边的“K”和左边的“$”。

lower = lower.str.rstrip('K')
lower = lower.str.lstrip('$')

对于 upper,我们首先取前 5 个字符(考虑$121K),然后将其剥离为 lower。

upper = upper.str[:5]
upper = upper.str.rstrip()
upper = upper.str.rstrip('K')
upper = upper.str.lstrip('$')

您可能已经注意到有一个额外的 rstrip。这是因为我们采用了前 5 个字符,这导致一些值在末尾有一个空格(例如$47K)。我们现在可以通过取上下限的平均值来创建一个新的列。

upper = upper.astype('float64')
lower = lower.astype('float64')
avg = ((upper + lower) / 2)*1000
df['Avg_Salary'] = avg

我们现在有了一个清晰的数字格式的平均值。让我们首先检查所有工作列表的平均估计工资。

df['Avg_Salary'].mean()
72117

总体平均约为 7.2 万美元。位置可能会影响平均工资。位置包含城市和州。我认为最好比较各州的情况,以便有一个更概括的概念。这是“位置”栏:

我们可以使用 pandas 字符串操作轻松创建一个“state”列。

df['State'] = df['Location'].str.split(',').str[1]

Groupby 函数可以用来查看不同州的平均工资。我希望看到平均工资和列表的数量,所以我将对 groupby 应用“agg(["mean "," count"]),而不是只应用“mean”。

df[['Avg_Salary','State']].groupby('State').agg(['mean','count']).sort_values(by=('Avg_Salary','counts'), ascending=False)[:10]

结果根据计数进行排序。加州拥有最多的工作列表和最高的平均工资。德克萨斯州有很多工作,但平均工资相对低于其他顶级州。

公司部门

数据集还包含有关公司和行业的信息。我们先来看看哪些部门的数据分析师岗位最多。

df['Sector'].value_counts()[:10]

“-1”表示缺少值。有各种各样的部门显示了数据分析师的工作是如何分布的。任何领域的企业都可以从数据中创造价值。

薪酬最高的行业是“会计和法律”,但平均工资也非常接近。

高薪工作对数据分析师的需求很大。比工作数量更重要的是,这些工作来自许多不同的行业和部门。这有力地表明了数据分析对企业的重要性。我认为,对数据分析师和科学家的需求将长期存在。

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

三,二,一,…人工智能起飞!

原文:https://towardsdatascience.com/3-2-1-ai-lift-off-428fddb73f09?source=collection_archive---------56-----------------------

是的,你没看错。AI 已经爆炸了。

经过几十年的缓慢燃烧,人工智能已经孵化成为世界上主要科技公司整个议程的 P1。

为什么?相当简单,需要。面对不断生成和消耗的数据,人类需要一种能够学习并适应我们的新工具。那基本就是 AI 了。

我们以前认为不可能或科幻小说,今天正变得必要和高度期待的一些。技术领导者正在竞相开发人工智能解决方案,通过增加和增强人类智能为他们提供竞争优势。但是,如果我们停下来想一想,这个领域的所有进步都是基于同一个等式:

大数据+ GPU 增强+深度学习

是的,我的朋友,我们有新的人工智能可口可乐配方

我称之为“基本方程式”。

上的动作前进拍照

如果你想了解更多,请访问oscargarciaramos.com

然而,正如我在我的文章 【小数据的反叛】 中所说,我们有很大的机会展望未来,并发展我们的“基本方程”,利用小数据,更全面和有效的深度学习模型,新的硬件和无监督学习使用中的深度进步。

作为显著变量的深层推理

很明显,深度学习在人工智能等式中变得越来越重要,当我们提到语音、视觉或自然语言处理的一些上下文时( )“嘿,Siri,我能帮你吗?”T31)。

然而,深度学习尚未展示其在辅助机器推理方面的全部能力,这是许多人工智能原型和解决方案所需的能力。深度学习已经帮助我们解决了定义明确的问题,例如,我们希望对数据进行分类。然而,下一步我们必须超越分类或感知,而是推理和理解。

目前,这些系统还没有常识。 推理 帮助我们处理广泛的认知任务,包括可能的上下文变化或意外事件。人类知道,如果他们把水放在玻璃杯里,除非杯子破了,否则水不会漏。机器是怎么知道的?

那是玩阴的……

是的,我们确实已经达到了这样的程度,在标记了自由文本段落之后,我们能够将自然语言句子转换成逻辑公式。我们需要采取的下一步将是使用推理机制,以最少的努力来工作和理解这些公式。

我们如何变得更高效,进化出下一波深度学习?

小数据

是的,你是对的。数据。

多少次我们听到“领域内没有足够的数据来馈入深度学习模型”或“数据集既不好也不相关,不足以训练模型”。我们都知道神经网络需要大量的数据来学习某项任务。然而,我们通常没有时间找到如此大量的高质量数据或资源来训练这些数据,从而导致项目时间、人工智能系统的训练、测试和改进出现偏差。

研究人员正在花费大量时间研究用更少的数据训练系统的新方法,这些方法即使规模很小,也比大量数据要好。

无监督学习

正如我们已经看到的, 监督学习 需要标记数据的繁重任务,这有时会非常令人沮丧,导致资源成本并在系统中引入偏差,因为这是一项“人工”任务。

然而,大多数人工智能远见者声称,纯粹的 无监督学习 是深度学习的圣杯,距离我们现在的位置以及能够在人工智能解决方案和模型训练的开发中实现它还很远。

当然,在不久的将来,我们将把自己定位在有监督和无监督学习之间。

我的朋友,还没有完全失去。

目前还有其他方法仍然需要监督,但它们正在帮助我们更深入地探索深度学习应用的世界:

  • 强化学习 ,或者说是一个系统做得好就奖励,做得不好就惩罚的方式,随着他们的学习。
  • 迁移学习 ,或者说如何将一个训练好的模型外推至一个完全新的问题。
  • 主动学习 ,系统只有在需要的时候才需要新的标注数据(计算机标注 vs .人类)。

最后但同样重要的是,…

效率和硬件

大多数人工智能和分析部门专注于开发需要更小架构和更快运行的模型。

为什么?虽然 GPU 在训练和性能上有了质的飞跃,但仍然不够。为了训练一个模型,你仍然需要足够的计算能力和资源,首先是训练它,其次是维护它,这会降低创新和应用程序的性能。

硬件是不可能自己进化,克服计算复杂度的。算法模型增强和硬件开发之间必须存在共生关系。

*"Simulating Human thinking shouldn't be a matter of money".*

照片由摩根·豪斯尔Unsplash 拍摄

那么,接下来呢?

正如凯文·凯利畅销书的作者所说…

“鸟扇动翅膀飞行,但为了让人类飞行,我们必须发明一种不同的飞行方式——一种自然界中没有的飞行方式”。在人工智能的例子中,也会发生类似的事情。我们必须发明生物学上不存在的新型思维。

因此,这种智能并没有取代人的思维,而是增强了它”。

欢迎留下评论或分享这篇文章。跟随 未来的岗位。

如果你想了解更多,你可以通过oscargarciaramos.com找到我

数据科学家的 3 种先进熊猫方法

原文:https://towardsdatascience.com/3-advanced-pandas-methods-for-data-scientist-c7935152b2ca?source=collection_archive---------49-----------------------

内部 AI

Pandas 是数据科学家和机器学习专业人员可以使用的一把瑞士刀。3 种用于现实项目的先进而强大的方法

照片由锡德·巴拉钱德朗赛基兰·阿纳加尼Unsplash 拍摄

在我看来,Pandas 和 NumPy library 一起节省了数百小时的编程时间,是数据科学家和机器学习专业人员的宝贵工具。

如果没有很好地掌握这两个库,要成为一名优秀的数据科学家或机器学习专家几乎是不可能的。

大多数情况下,可用的原始数据只有很少的空白值,格式不正确,或者分散在几个不同的源中,带有一个主键。在这篇文章中,我将讨论三种先进的 pandas 数据准备和辩论技术,它们将有助于为机器学习算法输入设置正确的数据格式。

让我们从一个四列三行的简单样本数据帧开始。

import pandas as pddf1 = pd.DataFrame(
[["Keras", "2015", "Python","Yes"],
["CNTK", "2016", "C++","Yes"],
["PlaidML", "2017", "Python, C++, OpenCL","No"]],
index=[1, 2, 3],
columns = ["Software", "Intial Release",
"Written In","CUDA Support" ])print(df1)

样本数据帧具有三种不同的属性,即初始版本、写入和 CUDA 对三个机器学习库的支持。

数据帧 df1 —上述代码的输出

我们可以看到,机器学习库名称是其中一列,库的不同属性在各个列中。

让我们想象一下,机器学习算法期望不同格式的相同信息。它期望库的所有属性在一列中,各自的值在另一列中。

我们可以使用“”函数将数据帧从当前格式转置为期望的排列。

在 id_vars 参数中指定了原始数据帧中的列,这些列与单独的列保持相同的排列。

*df2=df1.melt(id_vars=["Software"],var_name='Characteristics')
print(df2)*

在 id_vars 参数中指定了原始数据帧中的列,这些列与单独的列保持相同的排列。原始数据帧中的所有剩余属性都填充在“特征”列下,并且在相应的列中具有值。

df1 上“熔化”功能后的数据帧 df2 上述代码的输出

许多时候,收集的原始数据是将所有属性排列在一列中,在相应的列中提到值。机器学习算法要求输入数据的每个属性值都在单独的列中。我们可以使用 Pandas 中的“”pivot”方法将数据转换成所需的格式。

*df3=df2.pivot(index="Software",columns="Characteristics",
values="value")print(df3)*

本质上,“融”和“枢”是互补的功能。“Melt”转换一列中的所有属性和相应列中的值,而“pivot”转换一列中的属性和另一列中的值。

数据帧 df2 上的 Pivot 函数—上述代码的输出

有时,我们的原始数据分散在几个文件中,我们需要将它整合到一个数据集中。为了简单起见,首先,我们将考虑单个数据集中的数据点已经在正确的行序列中的情况。

在新的数据帧 df4 中,为机器学习库声明了另外两个属性。

*df4 = pd.DataFrame(
[["François Chollet", "MIT license"],
["Microsoft Research", "MIT license"],
["Vertex.AI,Intel", "AGPL"]],
index=[1, 2,3],columns = ["Creator", "License"])print(df4)*

我们可以使用" concat" 函数 将这个新的数据帧与原始数据帧连接起来。

*df5=pd.concat([df1,df4],axis=1)
print(df5)*

级联的数据帧 df1 和 df4 的输出在一个数据帧 df5 中具有原始的三个属性和两个新属性

数据帧 df1 和 df4 的连接—上述代码的输出

在现实生活中,单个数据集中的大多数时间数据点不在同一行序列中,并且有一个公共键(标识符)链接数据集中的数据点。

我们有一个数据帧 df6 来存储机器学习库的“创建者”和“许可”值。“软件”是该数据帧和原始数据帧 df1 之间的共同属性。

*df6 = pd.DataFrame(
[["CNTK","Microsoft Research", "MIT license"],
["Keras","François Chollet", "MIT license"],
["PlaidML","Vertex.AI,Intel", "AGPL"]],
index=[1, 2,3],
columns = ["Software","Creator", "License"])print(df6)*

我们可以看到数据帧 df6 的行序列与原始数据帧 df1 不同。在 df6 中,首先存储“CNTK”库的属性,而在数据帧 df1 中,首先提到值“Keras”。

数据帧 df1 和 df6 —上述代码的输出

在这种情况下,我们需要合并分布在几个数据集中的原始数据,并且各个数据集中的值不在相同的行序列中,我们可以使用“ merge ”函数将数据合并到一个数据帧中。

 *combined=df1.merge(df6,on="Software")
print(combined)*

在 merge 函数的“on”参数中提到了用于从不同数据集中识别正确对应值的公共键(唯一标识符)。

上述代码的输出—基于唯一标识符“软件”的合并数据帧 df1 和 df6

重述

在这篇文章中,我们学到了三个先进的熊猫功能是相当得心应手的数据准备。

Melt:将属性/特征分离到一列中,并将值分离到相应的列中

透视:将一列中的属性/功能拆分到单独的一列中

Concat:沿行或列连接数据帧。

Merge:跨不同行序列中的数据帧和值合并具有唯一标识符的数据帧。

结论

熊猫可以帮助为机器学习算法准备正确格式的原始数据。本文中讨论的 Pandas 函数如“melt”、“concat”、“merge”和“pivot”可以用一行代码转换数据集,否则将需要许多嵌套循环和条件语句。在我看来,专业和业余数据科学家之间的区别不在于对奇异算法或超级优化超参数技术的了解。对 Pandas、NumPy 和 Matplotlib 的深入了解使一些人进入了专业联盟,并使他们能够以更干净的代码和更高的性能更快地获得结果。

你可以在 5 用熊猫进行数据预处理的强大可视化中学习用熊猫进行数据可视化。

此外,像专业数据科学家一样学习探索性数据分析(EDA)高级可视化

Edtech 的 3 个人工智能创业想法利用了因新冠肺炎而兴起的在线直播课程

原文:https://towardsdatascience.com/3-ai-startup-ideas-in-edtech-to-leverage-the-rise-of-live-online-classes-due-to-covid-19-2b52c16afe48?source=collection_archive---------33-----------------------

Edtech 中使用最先进的计算机视觉和自然语言处理的创业想法。

图片来自 Pixabay 并由 AiArtist Chrome 插件风格化(由我构建)

K-12 (幼儿园到 12 年级)领域的在线辅导并不新鲜。有独角兽元辅道 (k-12 教育) [VIPKid](https://equalocean.com/education/20191008-vipkid-raises-an-undisclosed-amount-of-financing-from-tencent) (英语学习)基于中国在线视频辅导。有 韦丹图就是迎合在线辅导。新加坡有几个小球员,比如泰诺比,在同一个场地发球。

由于新冠肺炎带来的在线课程的增加,许多初创公司都报告了更高的注册人数,其中一些公司最近从投资者那里拿到了巨额支票。投资者有 FOMO (害怕错过),因此,一旦他们感觉到某些行业将会上涨,他们就会尽快行动。

今天,我们将在在线视频辅导/课程中看到一些创意,它们有可能变成新的创业,迎合崛起

创业思路 1:利用计算机视觉进行视频直播课堂中的注意力分散检测。

图片来自 Pixabay

在一堂正常的课中,有一位老师正在监督学生们是否在注意。但是在直播视频课堂上,老师不可能专注于每个学生的视频反馈

因此,使用计算机视觉算法从视频馈送中自动识别注意力分散的学生并通知老师的过程至关重要。然后,老师可以向所有注意力分散的学生发出警告或轻触按钮发出轻柔的“乒”声。

视频流中识别注意力分散还没有得到很好的研究,但是由于自动驾驶汽车的增加,在识别注意力分散的司机方面已经做了相当多的研究。一些研究直接适用于或经过微小修改后适用于班级中学生的注意力分散检测。

您还可以从视频流中检测出打哈欠疲劳来识别不活跃的听众。

注意力分散检测算法的几个要点:

视频馈送中的注意力分散检测

驾驶员注意力分散检测

哈欠检测

创业想法 2:自动评估(MCQs,对/错,填空)来减轻老师的工作量。

图片来自我们的创业推介资料

随着在线课程的兴起,老师们面临着一个新的挑战,即准备演示幻灯片以使课堂更有吸引力。传统上,大多数老师仍然使用黑板来教学。但是有了在线轮班,他们有额外的工作量来准备演示文稿。

减轻他们工作负担的一个方法是将评估创建部分自动化。您可以使用最先进的自然语言处理算法来理解任何文本(章节)识别重要概念,根据内容自动创建评估(MCQs,是非题,填空题)。

我自己的关于评估自动化的研究的几点提示:

  1. 是非题生成
  2. 选择题生成
  3. 为英语语言学习生成代词疑问句
  4. 语法 MCQ 代

您还可以使用自然语言处理(NLP)来检测在线直播聊天中的欺凌或识别不清楚的概念 / 话题中提到的等。然后老师可以快速复习再解释不清楚的概念或者静音欺负人等等

创业理念 3:根据学习目标自动创建内容。

图片来自我们创业公司的技术平台

对于课程设计者内容作者,一个主要的挑战是基于某些学习目标创建内容

学习目标是学生完成一门课程后的预期目标。在上图中,我们可以看到我们如何使用 AI 来生成一个新章节关于"尼罗河"开始与学习目标 1) 了解尼罗河的重要性和 2) 了解埃及文明。

我们可以通过从给出的学习目标中生成初始文本和图像来自动化这个过程。课程设计者可以进一步编辑并最终确定内容。使用 NLP 中最先进的条件文本生成模型(2等)和图像生成模型( s)实现这一点不再是不可能的。有了足够的数据和研究,我们可以建立一个强大的基线。

该领域研究的几个指针:

控制文本生成

用于可控文本生成的变压器语言模型

受约束的文本生成

可控文本到图像生成

快乐学习!

使用自然语言处理的问题生成——教程

我推出了一个非常有趣的 Udemy 课程,名为“使用 NLP 生成问题”,扩展了这篇博文中讨论的一些技术。如果你想看一看,这里是链接

祝 NLP 探索愉快,如果你喜欢它的内容,请随时在 Twitter 上找到我。

3 Python 中数据科学与软件工程的算法面试问题

原文:https://towardsdatascience.com/3-algorithm-interview-questions-for-data-science-and-software-engineering-in-python-29fc86a07a6f?source=collection_archive---------14-----------------------

熟悉常见的算法问题,为下一次面试做好准备

图片来自 PixabayTumisu

我上一次数据科学面试 90%都是 python 算法问题。

虽然你应该准备好解释一个 p 值,你也应该准备好回答传统的软件工程问题。

算法问题是一种可以学习的技能,公司用它来淘汰没有准备好的候选人。

下面是 3 个常见的算法问题和答案,在难度谱的容易端。

问题 1:检查两个字符串是否是字谜

变位词是通过重新排列另一个字符串中的字符而创建的字符串。

说明:

  1. 给定两个字符串,s1s2,如果它们互为变位词,则返回True
  2. 必须使用所有字符。

代码:

把这个复制到本地的一个代码编辑器里,写一个函数解决这个问题。

def anagram(s1, s2):
  #
  # your code here
  #

检查您的答案:

运行此程序以确认您的功能按预期运行。

assert anagram('word', 'wodr')
assert not anagram('dog', 'dogg')
assert anagram('racecar', 'carrace')

解决方案:

这是一个解决方案,但不是唯一的解决方案。

def anagram(s1, s2):
    c1 = {}
    c2 = {}

    def count_chars(s):
        h = {}
        for char in s:
            if char in h:
                h[char] += 1
            else:
                h[char] = 1
        return hreturn count_chars(s1) == count_chars(s2)

上面,我们用每个字符串中的字符数创建了字典,然后比较字典的相等性。

时间复杂度是 O(n) ,因为字符串迭代和字典查找依赖于输入字符串的长度。

问题 2:找出添加到句子中的单词

说明:

  1. 给定一个句子,sent1,以及带有附加词的同一个句子,sent2,返回附加词。
  2. 每一句话,s1,至少会有 1 个单词。

代码:

def extra_word(sent1, sent2):
  #
  # your code here
  #

检查您的答案:

assert extra_word('This is a dog', 'This is a fast dog') == 'fast'
assert extra_word('answer', 'The answer') == 'The'
assert extra_word('Can you solve algorithm questions', 'Can you solve hard algorithm questions') == 'hard'

解决方案:

def extra_word(sent1, sent2):
    words = {}

    for word in sent1.split(' '):
        if word in words:
            words[word] += 1
        else:
            words[word] = 1

    for word in sent2.split(' '):
        if word in words:
            words[word] -= 1
        else:
            return word

上面,我们通过字典统计了第一句话的单词。然后从同一本字典中减去第二句话中的单词。不在字典中的单词是要返回的单词。

时间复杂度是 O(n) 因为我们对每个句子迭代一次。

问题 3:嘶嘶的嗡嗡声

这是经典的 fizzbuzz 面试问题

说明:

  1. 给定n,返回从1n的每个整数的值列表。
  2. 如果一个数能被 3 整除,则返回'Fizz'代替它。
  3. 如果这个数能被 5 整除,则返回'Buzz'代替它。
  4. 如果数字能被 3 和 5 整除,则返回'FizzBuzz'代替它。

代码:

def fizzbuzz(n):
  #
  # your code here
  #

检查您的答案:

output = fizzbuzz(1000)assert output[8] == 'Fizz'
assert output[99] == 'Buzz'
assert output[198] == 199
assert output[510] == 511
assert output[998] == 'Fizz'

解决办法

def fizzbuzz(n):
    answer = []
    for i in range(1,n+1):
        if i % 3 == 0 and i % 5 == 0:
            answer.append("FizzBuzz")
        elif i % 3 == 0:
            answer.append("Fizz")
        elif i % 5 == 0:
            answer.append("Buzz")
        else:
            answer.append(i)
    return answer

上面,我们创建了一个给定值列表n。然后遍历每个值,并将值 Fizz、Buzz 或 FizzBuzz 添加到列表中。

时间复杂度是 O(n) 因为我们遍历列表一次。

结论

您是否对每周 5 个算法问题和答案的系列感兴趣?请在评论中告诉我。

至于算法问题,这些都很简单,并且都可以在 O(n)时间复杂度内解决。但是如果你不熟悉这类问题,最好从基础开始。

在可预见的未来,算法问题将成为数据科学和软件工程面试的一部分。掌握这项技能的最好方法是每周做几道题。这样,如果你需要申请新的工作,你就可以随时准备好。

构建推荐系统的 3 种方法

原文:https://towardsdatascience.com/3-approaches-to-build-a-recommendation-system-ce6a7a404576?source=collection_archive---------5-----------------------

Python 推荐系统入门

SlidebeanUnsplash 上拍照

毫无疑问,推荐系统是在各种平台上增强用户体验的最明显的方式之一,也是将机器学习引入公司的一种方式。因此,许多公司一直在采用“为你推荐”的口号,这一口号已被亚马逊、网飞和 Youtube 等公司推广开来,它们通过实施自己版本的推荐来满足客户需求。

在讨论各种实现方法之前,我们首先将推荐系统定义为一种在将信息呈现给人类用户之前从信息流中丢弃冗余或无用信息的方法,或者更具体地说,它是一种信息过滤系统的子类,旨在预测用户对某个项目的“评级”或“偏好”(来源:维基百科)。

有了这些知识,我们可以开始研究解决这个问题的一些方法了——关于这篇文章中生成的完整代码,请访问 my Github

[## kurtispykes/推荐系统

github.com](https://github.com/kurtispykes/recommender_system/blob/master/notebooks/02_kpy_ideas.ipynb)

在下面的演示中,我们将使用 MovieLens 100k 数据集

协同过滤

约翰·施诺布里奇在 Unsplash 上拍摄的照片

协同过滤是推荐引擎最流行的实现之一,它基于这样的假设,即过去达成一致的人将来也会达成一致,因此他们会像过去一样喜欢相似种类的项目。

协同过滤的一个例子可以是,一个朋友和我过去喜欢相同范围的书,并且他/她接着喜欢我没有读过的书,但是因为我们过去同意并且他/她喜欢我没有读过的新书,所以很可能我也会喜欢那本书,所以那本书会被推荐给我。该逻辑描述了所谓的基于用户的协同过滤。

从前面的例子来看,不是仅仅关注我的朋友喜欢什么,我们可以决定关注以前喜欢的项目的范围,并确保基于过去喜欢的项目之间的相似性向我推荐新的项目,其中相似性是通过使用项目的评级来计算的——“喜欢这个项目的用户也喜欢”。这种算法背后的逻辑被称为基于项目的协同过滤。

总之,这两种方法都属于协作过滤的范畴,即基于记忆的方法。让我们看一个 Python 中基于内存的方法的例子。

import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, pairwise# creating n x m matrix where n is user_id and m is item_id 
user_ratings = pd.pivot_table(rating, index="user_id", columns="item_id", values="rating").fillna(0)# user and item counts 
n_users = len(user_ratings.index)
n_items = len(user_ratings.columns)**print**(f"Users: {n_users}\nItems: {n_items}")
user_ratings.head()Users: 943
Items: 1682

现在我们有了所需格式的数据,我将随机生成一个训练和测试集,我们可以用它来测试我们的方法做得有多好。

# [https://www.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/](https://www.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/) def train_test_split(data: np.array, n_users: int, n_items:int): 
    # create a empty array of shape n x m for test
    test = np.zeros((n_users, n_items))
    train = data.copy()

    # for each user, we generate a random sample of 5 from movies they've watched
    for user in range(n_users):
        random_sample = np.random.choice(data[user, :].nonzero()[0], 
                                         size=5, 
                                         replace=False)
        # set the train to zero to represent no rating and the test will be the original rating
        train[user, random_sample] = 0\. 
        test[user, random_sample] = data[user, random_sample]

    return train, testtrain, test = train_test_split(data=user_ratings.to_numpy(), n_users=n_users, n_items=n_items)

构建协同过滤系统的第一步是计算用户(基于用户)或项目(基于项目)之间的相似性。

user_similarity = pairwise.cosine_similarity(train + 1e-9)
item_similarity = pairwise.cosine_similarity(train.T + 1e-9)**print**(user_similarity.shape, item_similarity.shape)(943, 943) (1682, 1682)

下一步是预测数据中未包含的评级。一旦我们做出了预测,我们就可以将我们的结果与实际测试数据进行比较,以评估我们模型的质量——评估指标超出了本教程的范围。

# predict user ratings not included in data
user_preds = user_similarity.dot(train) / np.array([np.abs(user_similarity).sum(axis=1)]).T# # get the nonzero elements
nonzero_test = test[test.nonzero()]
nonzero_user_preds = user_preds[test.nonzero()]user_rating_preds = mean_squared_error(nonzero_test, nonzero_user_preds)
**print**(f"UBCF Mean Squared Error: {user_rating_preds}")UBCF Mean Squared Error: 8.250006012927786

上面的代码是一个基于用户的协同过滤的例子。我们还可以进行基于项目的协同过滤。

# predict item ratings not included in data
item_preds = train.dot(item_similarity) / np.array([np.abs(item_similarity).sum(axis=1)])# get the nonzero elements
nonzero_item_preds = item_preds[test.nonzero()]item_rating_preds = mean_squared_error(nonzero_test, nonzero_item_preds)
**print**(f"IBCF Mean Squared Error: {item_rating_preds}")IBCF Mean Squared Error: 11.361431844412557

我们的算法不是很好,但希望你能明白其中的要点!

我们现在知道基于协作的方法可能被分类为基于内存的,我们已经在上面看到了它的 Python 实现。我们可以对协同过滤方法进行分类的另一种方式是基于模型的方法。

在这种方法中,使用不同的数据挖掘、机器学习算法来开发模型,以预测用户对未评级项目的评级(来源:维基百科)。

基于内容的过滤

另一种向用户推荐有用信息的流行方式是通过基于内容的过滤。这种技术基于项目的描述和用户偏好的简档。它最适合于这样的情况:已知一个项目的信息,但不知道用户的很多信息。因此,基于内容的过滤方法将推荐视为用户特定的分类问题。

基于内容的过滤的一个例子可以通过使用电影推荐场景来解释。想象一下,我们已经建立了一个相当新的网站,我们目前没有太多的用户信息,但我们确实有关于我们积压的电影的细节。我们要做的是获取电影的元数据/特征,如类型、演员、导演、电影长度等,并使用它们作为输入来预测用户是否喜欢一部电影。

上面的场景也暗示了我们有一个偏好的用户配置文件。这些数据可以通过用户询问来收集,这意味着用户可以设置他或她的过滤偏好,或者通过记录用户行为作为一种隐含的方法来收集。

注意:您也可以使用混合方法来获得最佳数据收集策略。

让我们看看如何在 Python 中做到这一点…

# merge data so we know the features of each movie
movies = pd.merge(item, rating, right_on="item_id", left_on="movie_id")# create a pivot table
movies_pivot = pd.pivot_table(movies, index="user_id", columns="movie_title", values="rating")# Transpose only so it fit's in the screen
movies_pivot.T.head()

# avg ratings and rating counts
avg_rating = movies.groupby("movie_title")["rating"].mean()
num_ratings = movies.groupby("movie_title")["rating"].count()# getting counts and average ratings
ratings_counts = pd.DataFrame({"avg_rating": avg_rating,
                               "num_of_ratings": num_ratings})# joining the new values to movie data
full_movie_data = pd.merge(movies, ratings_counts, left_on="movie_title", right_index=True)# [https://towardsdatascience.com/recommender-system-in-python-part-2-content-based-system-693a0e4bb306](/recommender-system-in-python-part-2-content-based-system-693a0e4bb306)def get_similar_movies(full_movie_data: pd.DataFrame,
                       movie_matrix: pd.DataFrame,
                       movie_title: str,
                       min_num_of_ratings: int = 100,
                       n_recommendations: int = 5
                       ):
    """
    Get similar movies based on correlation with other movies 
    """
    # get most correlated movies
    similar_movies = movie_matrix.corrwith(movie_matrix[movie_title])
    # converting to a dataframe and dropping NaN's
    similar_corr_df = pd.DataFrame({"correlation":similar_movies})
    similar_corr_df.dropna(inplace=True)

    # store the oringinal dataframe
    orig = full_movie_data.copy()

    # merge with correlated dataframe but only keep specified columns
    corr_with_movie = pd.merge(left=similar_corr_df,
                               right=orig, 
                               on="movie_title")[
        ["movie_title", "correlation", "avg_rating", "num_of_ratings"]].drop_duplicates().reset_index(drop=True)

    # filter movies with less than min_num_of_ratings
    result = corr_with_movie[corr_with_movie['num_of_ratings'] > min_num_of_ratings].sort_values(
                                                                                     by='correlation',
                                                                                     ascending=False)
    return result.iloc[1:, :].head()# test function on Toy Story
get_similar_movies(full_movie_data, movies_pivot, "Toy Story (1995)")

混合推荐系统

混合系统在现实世界中更为常见,因为组合来自不同方法的组件可以克服各种传统缺点;在这个例子中,我们更具体地讨论来自协作过滤和基于内容的过滤的混合组件。

由郑 KY,帕克 DH,李 JH (2004) [1]的论文陈述“为了有效,推荐系统必须很好地处理两个基本问题。第一,稀疏评级问题;与需要预测的评级数量相比,已经获得的评级数量非常小。因此,从少量示例中有效生成是重要的。当用户数量很少时,这个问题在系统的启动阶段尤其严重。第二,第一流的问题;除非用户以前对某个项目进行过评级,否则无法推荐该项目。

这种方法可以显著改善推荐系统的预测。

作为给读者的任务,建立你自己的混合推荐系统!(完成后与我分享)

[1]荣凯。,朴 DH。李·JH。(2004) 混合协同过滤和基于内容过滤的改进推荐系统。载于:Bubak M .、van Albada G.D .、Sloot P.M.A .、Dongarra J .(编辑)计算科学-ICCS,2004 年。ICCS 2004。计算机科学讲义,第 3036 卷。斯普林格,柏林,海德堡。【https://doi.org/10.1007/978-3-540-24685-5_37

包裹

在这篇文章中,我们介绍了三种实用的推荐系统方法,以及如何使用 Python 实现其中的两种(协同过滤和基于内容的推荐)。我知道我没有深入研究算法背后的理论或性能指标来评估它们,但如果你想更深入地了解这些专长,那么我强烈推荐 Youtube 上的吴恩达推荐系统播放列表。

让我们继续 LinkedIn 上的对话…

[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

3 种看待自己作为 ML 从业者的方式

原文:https://towardsdatascience.com/3-awesome-ways-to-look-at-yourself-as-a-ml-practitioner-50af91dd8e10?source=collection_archive---------48-----------------------

听众、艺术家还是作曲家?

T 他的想法我第一次是在这本书里看到的这里,但是我觉得它太好了,你们都得读一读。

显然,并不是所有的 ML 从业者都是生而平等的,至少有几种不同的类型。下面,我们将会看到一分为三,类似于人们与音乐的三种互动。

听众们

来源: Pixabay

机器学习开源软件、在线课程和基于云的工具的浪潮让新来者不必担心 ML 管道的细节。

在 ML 的世界里,现成工具的可用性是一件好事,也是一件坏事。这是因为,虽然没有经验的用户可以很容易和容易地从机器学习中受益,但可以肯定的是,他们中的一些人并不真正知道他们在做什么,也不理解。因此,对他们的数据/模型得出错误的结论是很常见的。

这些被称为监听器,因为就像在音乐的情况下,用户能够选择不同类型的算法,辨别它们之间的表面差异,并从它们的使用中受益。

艺术家们

来源: Pixabay

与听众相比,艺术家有足够的勇气将不同的方法和分析插入到管道中。对于这一类人来说,非常重要的是他们掌握所用工具背后的数学知识的程度。他们并没有真正深入到所用方法的各个方面,但是他们很好地理解了背后的机制,以及需要调整什么来提高他们模型的性能。

这些人被称为艺术家,因为就像小提琴歌手一样,高技能的练习者可以将他们的乐器带入生活并激发观众,他们可以在他们的 ML 练习中增加一些趣味。

作曲家们

来源: Pixabay

大师们来了。

可以边听边玩。你可以拉小提琴,而且会拉得很好。但可能创造自己的音乐作品并不是一件容易的事情。ML 从业者也一样。

的创造者:

  1. 马尔可夫链和马尔可夫过程— 安德烈·马尔可夫
  2. 第一个神经网络— 马文·明斯基
  3. 感知机— 弗兰克·罗森布拉特
  4. 许多其他伟大的概念…

属于作曲家的范畴。他们不仅喜欢“听音乐”,完美地“演奏”音乐,而且还“创作”了杰作。

很有可能,你现在可能不是一个作曲家,但是只要有纪律和热情,你可以做到。

最后的想法

这是一本小册子,应该如此对待。如果你热爱你所做的事情,并且你的工作提供了价值,你是哪种类型的 ML 从业者并不重要。

如果你喜欢我的作品,可以考虑看看我的其他帖子:

[## 我们为什么用 0.05?

还是不是?

towardsdatascience.com](/why-do-we-use-0-05-8cd43a39edfa) [## 标准偏差与标准误差

[警告这太容易了] -包含简短的示例 R 代码

towardsdatascience.com](/standard-deviation-vs-standard-error-5210e3bc9c04)

直到下次,继续学习。

Python 中股票市场分析的 3 个基本步骤

原文:https://towardsdatascience.com/3-basic-steps-of-stock-market-analysis-in-python-917787012143?source=collection_archive---------2-----------------------

用 Python 分析特斯拉股票,计算交易指标,绘制 OHLC 图表。包括一个带有代码示例的 Jupyter 笔记本。

克里斯·利维拉尼在 Unsplash 上的照片

我最近开始阅读斯坦·温斯坦的《在牛市和熊市中获利的秘密。在他的书中,Stan 揭示了他成功的投资时机选择方法,以产生持续盈利的结果。

许多投资者说“这是你需要阅读的唯一一本投资书籍”

斯坦·温斯坦是专业的股票市场技术分析师。1987 年,他利用自己的图表阅读技巧,预测了股票市场 31%的崩盘,由此一举成名。

我其他关于这个话题的文章:

[## Python 中的股票市场分析

我用 Python 写的关于股票市场分析的文章的精选列表。

romanorac.medium.com](https://romanorac.medium.com/stock-market-analysis-in-python-b71bf50151d9)

这里有几个你可能感兴趣的链接:

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

介绍

这是 Python 中股票市场分析系列的第一篇文章,在这篇文章中,我将尝试描述和实现在股票市场中获利的成功技术。

让我们从基础开始。在本文中,您将了解到:

  • 用 Python 获取股票数据的最简单方法
  • 什么是交易指标,如何计算
  • 如何用 OHLC 图表绘制股票数据

注意,我不是专业投资者,我不对你的损失负责。这是教育内容。

马特·邓肯在 Unsplash 上拍摄的照片

1.获取股票数据

用 Python 下载股票历史数据最简单的方法是用 yfinance 包。要安装该软件包,只需运行:

pip install yfinance

使用 yfinance 将 Tesla (TSLA)的每日股票价格下载到熊猫数据框架中非常简单:

df = yf.download("TSLA", start="2018-11-01", end="2020-10-18", interval="1d")df.head()

特斯拉股票的每日价格

yfinance 下载函数有很多参数:

  • 您可以使用 1m、2m、5m、15m、30m、60m、90m、1h、1d、5d、1wk、1mo、3mo,而不是将间隔设置为 1d。
  • 您可以在一个列表或字符串中定义多个 tickers:“间谍 AAPL MSFT”。
  • 您可以使用“ytd”来下载从今天起一年内的数据,而不是开始和结束日期。其他有效期间包括 1d、5d、1mo、3mo、6mo、1y、2y、5y、10y、ytd、max。
  • 详见y 金融

yfinance 还有许多其他有用的函数,比如股息函数。假设我们想列出美国电话电报公司(T)的股息。

t = yf.Ticker("T")t.dividends

t.dividends.plot(figsize=(14, 7))

美国电话电报公司股息增长

2.计算交易指标

交易指标是数学计算,在价格图表上绘制成线条,可以帮助交易者识别市场中的某些信号和趋势。

TA-LIB

TA-LIB 是 Python 中技术分析使用最多的库之一。

要使用它,首先需要安装 TA-LIB 依赖项:

# Mac OS X
brew install ta-lib# see [https://github.com/mrjbq7/ta-lib](https://github.com/mrjbq7/ta-lib) for other platforms

然后需要安装 python API:

pip install TA-Lib

移动平均数

移动平均线(MA)用于确定当前价格趋势的方向,不受短期价格上涨的影响。

MA 指标结合了特定时间范围内的股价点,并除以数据点的数量,得出一条趋势线。

让我们计算 TSLA 收盘价的 20 天(短期)和 200 天(长期)MA(我们可以用熊猫直接计算 MA):

df.loc[:, 'ma20'] = df.Close.rolling(20).mean()
df.loc[:, 'ma200'] = df.Close.rolling(200).mean()

短期和长期移动平均线的特斯拉价格

为什么均线很重要?

移动平均线用于识别重要的支撑位阻力位

交易者观察短期均线与长期均线的交叉,作为趋势变化的可能指标,以进入多头和空头头寸。

斯坦·温斯坦认为:要想买入一只股票,价格必须在短期 MA 以上。

RSI——相对强度指数

相对强弱指数(RSI)是技术分析中使用的一种动量指标,用于衡量最近价格变化的幅度,以评估股票或其他资产价格的超买或超卖情况。

RSI 显示为一个振荡器(在两个极端之间移动的线形图),读数可以从 0 到 100。它通常用于 14 天的时间段。

相对强弱和相对强弱指数一样吗?

如果你正在阅读斯坦·温斯坦的《在牛市和熊市中获利的秘密》,斯坦提到了相对强度,但不要把它和 RSI 混淆。

相对强弱表明一只股票相对于另一只股票、指数或基准的价值,而相对强弱表明一只股票相对于同一只股票近期表现的表现。

让我们计算 TSLA 的相对强度

import talibdf.loc[:, "rsi"] = talib.RSI(df.Close, 14)

现在,让我们绘制 RSI 图,30 表示超卖,70 表示超买:

import matplotlib.pyplot as pltfig, ax = plt.subplots(1, 2, figsize=(21, 7))ax0 = df[["rsi"]].plot(ax=ax[0])
ax0.axhline(30, color="black")
ax0.axhline(70, color="black")df[["Close"]].plot(ax=ax[1])

14 天 RSI 左边是特斯拉收盘价,右边是特斯拉收盘价。

RSI ≥70 的资产通常被认为超买,而 RSI ≤ 30 的资产通常被认为超卖:

  • 超买信号表明资产价格可能会回调。
  • 超卖信号可能意味着短期下跌即将成熟,资产可能会反弹。

在上图中,我们可以观察到 TSLA 价格随着 RSI 的变化而变化的模式。当超买(RSI ≥70)时,价格处于修正阶段,反之亦然。

3.绘制股票数据

在这一节中,我们将看到如何绘制 OHLC 图,这是一种我们在交易平台上常见的开盘价、最高价、最低价和收盘价的图表。

我们将使用 Plotly 库来制作 OHLC 海图。要安装它:

pip install plotly

如果您使用的是 JupyterLab,您还需要安装一个 Plotly 扩展,以便 JupyterLab 可以呈现 Plotly 图表:

jupyter labextension install jupyterlab-plotly

为了用 Plotly 绘制 OHLC,我们只需要在正确的投入上设定价格。

import plotly.graph_objects as gofig = go.Figure(
    data=go.Ohlc(
        x=df.index,
        open=df["Open"],
        high=df["High"],
        low=df["Low"],
        close=df["Close"],
    )
)
fig.show()

特斯拉股价的 OHLC 图表

在你走之前

像往常一样,你可以下载这个 Jupyter 笔记本在你的机器上尝试例子。

推特上关注我,在那里我定期发关于数据科学和机器学习的推特

照片由Courtney hedgeUnsplash 上拍摄

AWS 开发者认证对机器学习工程师的 3 个好处

原文:https://towardsdatascience.com/3-benefits-of-the-aws-developer-certification-for-machine-learning-engineers-1d8f7e0fed20?source=collection_archive---------25-----------------------

对我如何选择该认证及其主要优势的详细回顾

Joshua Hoehne 在 Unsplash 上拍摄的照片

如果你正在处理数据,并且你正在考虑参加你的第一个 AWS 认证,你可能想知道 哪一个是适合你的。

这对我来说是一个很难的选择,因为在 AWS 有 12 种可能的认证。经过一番研究,我选择了 AWS 开发者助理认证。但这并不容易。

这就是为什么我想分享我的故事。我希望这篇文章能对 AWS 开发者认证如何帮助获得一些新知识有所帮助——特别是如果你是一名机器学习工程师。

我希望在这篇文章结束时,你会更有信心回答 AWS 开发者认证是否适合你这个问题。

AWS 认证:选择正确的认证

正如我今天早些时候提到的,在 AWS 中有 12 种可能的认证。他们分为四个级别:基础、助理、专业和专业

[## AWS 认证-验证 AWS 云技能-获得 AWS 认证

AWS 认证验证云专业知识,帮助专业人员突出按需技能和组织构建…

aws.amazon.com](https://aws.amazon.com/certification/)

如果您正在讨论数据,那么 AWS 中有两个认证可能会引起您的兴趣。数据分析专业机器学习专业。但是……总有但是。对吗?

AWS 为数据分析专业推荐至少 5 年数据分析技术经验和 2 年 AWS 实际操作经验。

另一方面,对于机器学习专业,AWS 建议1-2 年在 AWS 云上开发、架构或运行 ML/深度学习工作负载的经验。

所以,如果你不符合建议的要求,你应该考虑开始另一个 AWS 认证。

不要误会,这是不,你不能去的专业。我只是说,如果你想在从事专业工作之前学习一些东西,你可以从其他地方开始。

有些人建议从其他认证开始,而不是从专业开始。特别是,他们建议从助理级别开始。

[## 我希望有人告诉我如何获得 AWS 认证:自学的技巧和诀窍

一年多来,我每天都和 AWS 一起工作,这时我的脑海中出现了追求 AWS 认证的想法。为什么…

medium.com](https://medium.com/@brunoamaroalmeida/what-i-wish-someone-had-told-me-about-pursuing-an-aws-certification-tips-tricks-for-self-study-a9244462a1a1)

虽然你可以从基础级别开始,通过云从业者认证,但许多人不推荐它,因为他们声称它面向想要熟悉 AWS 技术的非技术人员

“在过去的一年里,AWS 推出了可以说是他们向 AWS 合作伙伴网络 (APN)中的非技术专业人员提供的最佳计划之一:AWS 认证云从业者认证。该计划对那些从事销售或营销工作的人来说尤其有价值,它不提供任何用于销售或营销 AWS 的高科技产品或服务。相反,它提供了一个学习途径和一个认证,旨在为个人提供必要的知识和技能,以有效地展示对 AWS 云的整体理解。”—煤火小组

[## AWS 认证云从业者:对非技术角色的专业人员的宝贵认证

在过去的一年里,AWS 推出了可以说是他们向非技术人员提供的最好的项目之一…

www.coalfire.com](https://www.coalfire.com/the-coalfire-blog/may-2018/aws-certified-cloud-practitioner-certification)

尽管如此,如果你是 AWS 的初学者,并且想从头开始学习,云从业者认证还是很有帮助的。

AWS 助理级别认证

有三种可能的认证,你可以考虑在准水平。

这是一份来自云专家帖子的迷你简历,其中提到了三种可能的认证:

  • 解决方案架构师:这一部分关注如何使用架构最佳实践在 AWS 云中构建和部署系统——参见参考资料,如 AWS 良好架构的框架
  • SysOps: 对于任何在 AWS 上运行东西的人来说,这是一个“T2”。这个考试在 CloudWatch 上进行得相当深入。通过这一认证会让您更好地了解 AWS 架构中的实际情况。”
  • 开发人员:这一期侧重于从较低层面理解 AWS 服务是如何工作的。它侧重于通过遵循 AWS 的最佳实践来测试您使用和连接服务的能力。

[## 哪个 AWS 认证适合我?|云专家

所以你在考虑获得 AWS 认证。太好了!云计算技能需求巨大,无论…

acloudguru.com](https://acloudguru.com/blog/engineering/which-aws-certification-should-i-take)

在这一点上,我会鼓励你考虑哪一个认证最吸引你。对我来说,是 AWS 开发者认证。由于我的角色,这是最适合我的。

动机

有一次,我在训练一个机器学习模型,我遇到了一些与模型部署相关的问题。特别是,我不知道怎么做或者怎么消费

我曾经工作过的公司的首席技术官当时告诉我一件让我记忆犹新的事情:

"我希望您能够部署自己的模型。我不希望你培训他们,把他们留在你的电脑里,因为你不知道如何把他们投入生产…

如果你读了那句话,那会让你想起 AWS 开发者认证可能是你的第一步。

AWS 开发人员认证—助理:内容和优势

如果你是机器学习工程师,这个认证可以帮助你解决一些问题。

但是首先要知道,这个认证的重点不是机器学习工程。但是,我相信如果您了解一些 AWS 服务及其最佳实践,有些事情会变得更容易

考试内容分为 5 个领域:

  • 部署:检查的 22%
  • 安全性:占考试的 26%
  • 带 AWS 服务的开发:占考试的 30%
  • 重构:占考试的 10%
  • 监控和故障排除:12%

这些领域中的每一个都可以帮助您获得关于 AWS 的丰富知识。特别是,我在这个认证中发现了三个主要的好处可以帮助你这个机器学习工程师…

机器学习工程师的优势

1.了解如何部署和使用机器学习模型

我们都知道部署和使用机器学习模型并不容易。它有许多挑战,并不是所有的人都训练有素。

假设您需要部署一个模型来处理一些照片。假设你要对照片中的东西进行分类,例如,是否有狗。

首先,您必须部署模型。那你就要消耗掉它。为此,您需要读取图像,对其进行处理,进行分类,然后保存结果以供进一步分析。

这就是 AWS 开发者认证可以帮助你的地方!该认证将让您了解更多关于 AWS 服务开发的知识。

如果你仔细观察,部署和消费机器学习模型遵循软件开发的生命周期。因此,更多地了解它会给你一些你现在可能缺少的工具。

例如,您将学习如何使用一些 AWS 服务,如 AWS Lambda、ECS、Dynamo、SNS、SQS 等等。另外,你会学到很多关于无服务器的方法和一些关于 AWS 开发的最佳实践

2.了解 CI/CD 管道

一旦将机器学习模型部署到生产中,还会出现其他问题。

例如,您可能希望自动执行其重新培训过程,或者在重新培训后自动执行其部署。

我知道,你可能会想“等一下。DevOps 团队就是这么干的!”你可能是对的。他们可以帮助你做到这一点。

但是,我相信如果你对 CI/CD 了解得更多一点,DevOps 团队会感谢你的。如果你了解这个过程,你可以学习 CI/CD 的一些最佳实践,这对整个团队都有好处!

例如,您将学习如何使用一些 AWS 服务,如 AWS CodeCommit、CodeBuild、CodeDeploy、CodePipeline、X-ray、Cloudwatch 等。

3.学习 AWS 基础知识

相信我。你需要学习 AWS 的基础知识。我们不知道的事情太多了…

我记得有一次我刚开始用 AWS 的时候,我在写一个 Lambda。任务很简单。lambda 将对数据进行红移,进行一些处理,并查询一个端点。但是,lambda 超时了。花了整整一个下午才弄清楚超时与 VPC 配置有关。

你明白了吗?学习基本面很重要!不要像早期版本的我。

您将在认证中学习的一些基础知识与 IAM、VPCs、互联网网关、NAT 网关、安全组等服务相关。

认证考试准备

经过三个月的学习,我通过了我的 AWS 开发者认证。

我通过参加 Linux Academy (现已被一位云专家收购)的 AWS 认证开发者课程来准备考试。

[## 在线课程| 2020 年 AWS 认证开发人员助理|云专家

我们使用 cookies 来确保您在我们的网站上获得最佳体验。如果您同意我们使用 cookies,请…

咕噜咕噜](https://acloud.guru/learn/aws-certified-developer-associate?opt_id=oeu1597066625814r0.02678598007629196&_ga=2.78320412.90951335.1603291362-108285620.1597066626)

此外,我还在 Udemy 做了斯特凡·玛瑞克的模拟考试。

[## AWS 认证开发人员助理[4 个模拟考试测试]

2020 年 8 月更新]:所有问题都已重新编写,添加了详细的解释,并基于…添加了新问题

www.udemy.com](https://www.udemy.com/course/aws-certified-developer-associate-practice-tests-dva-c01/)

如果你不想学习 Linux Academy 的课程,我会鼓励你购买模拟考试测试。他们真的很有帮助。我敢说,没有他们,我不会通过认证考试。

结论

我知道这是一篇很长的文章。但我试图向您展示我是如何做出决定的,以及我在认证中发现的好处。

希望这些信息有助于回答 AWS 开发者认证是否适合你的问题。

感谢阅读到最后。

下期帖子再见!

如果你想随时更新我的作品, 请加入我的 简讯 我会努力为你提供信息和资源,让你成为更好的数据从业者!

2020 年及以后成功程序员的 3 本书

原文:https://towardsdatascience.com/3-books-for-successful-programmers-in-2020-and-beyond-6218251f74fe?source=collection_archive---------46-----------------------

托马斯叶

尤其是对于那些渴望成为下一个科技巨星的应届毕业生来说

来自 Unsplash扬科·菲利

众所周知领导者是读者,这一点在科技行业确实适用,就像在其他任何地方一样。然而,这篇文章并不是要向你宣扬阅读对于成功人生的必要性。

毕竟,通过打开这一页,你自愿决定用你生命中的 10 分钟来学习阅读好书,所以我将继续下去,假设你是“领导者就是读者”教条的坚定信徒,并直奔主题。

在今天这个信息丰富的时代,考虑任何话题,你都会发现一个巨大的可用资源聚宝盆来研究。一旦你决定要学习某样东西,你很快就会发现自己面临选择的暴政:“既然外面有那么多,我应该从哪里开始?”

这是我能帮忙的地方。假设你对软件开发的艺术和如何推动自己更上一层楼感兴趣,让我向你介绍我个人最喜欢的 3 个主题。不是令人畏惧的 25 个把你吓跑,而是仅仅 3 个,因为这足够让你开始了。

对于每本书,让我给你一个内容的简要总结,解释这本书的教训如何直接适用于我们的技术狂经济的现状,以及这方面的知识如何转化为对你的竞争对手的优势。

除了让我成为一个更有效的程序员(和一个更好的人),这些书还帮助我理解了教育、技术和商业,以及这些是如何在人类对创新的不懈追求中联系在一起的。我真诚地相信他们也能为你做同样的事情。因此,事不宜迟,让我们从第一册)开始吧。

第 1 册)——>斯科特·盖洛韦著

你有没有想过脸书的巨额财政收入是从哪里来的?或者说,苹果公司是如何以与三星手机几乎相同的质量收取如此高的溢价的?好吧,读读这本书,你就不会再有疑问了。

《四个 T1》是一次深入亚马逊、苹果、脸书和谷歌这四大科技巨头内部运作的令人大开眼界的旅行。读完之后,你会理解并真正欣赏当一个人将丰富的数据与能够从中提取有价值信息的智能算法相结合时所释放的巨大力量。

一旦得到认可,你将不再对脸书的市场估值高达数千亿美元感到困惑,尽管它“只是一个社交网络”,似乎没做什么。剧透,它确实很多在引擎盖下。

我发现这本书后面的章节特别有用,作者为进入这个行业的年轻人提供了一些建议,告诉他们如何利用四大巨头创造的经济,让自己走向成功。

换句话说,如果你想在今天由脸书、亚马逊、谷歌和苹果主导的就业市场中蓬勃发展,你可以把这本书看作是在商业、营销、教育和技术的交叉点上导航这个复杂景观的实用指南。

太好了,看完书 1)你就会熟悉“大科技”游戏的规则,准备征服世界。也就是说,获准在四个大联盟中的一个参加比赛并不容易,尤其是对新手来说。

幸运的是,第二本书是以技术面试的形式让你通过那些可怕的看门人,并通过获得你的第一份梦想工作来帮助你启动你的技术职业生涯。

第二册)——>破解编码访谈作者格利·拉克曼·麦克道尔

这本书已经成为计算机科学专业大学生的圣经,他们希望在一家高端科技公司获得实习和第一份全职工作,同样是亚马逊、苹果、脸书、谷歌,但这一次这份名单被微软和 Palantir 扩大了。为了接下来几段的目的,让我们把这 6 家公司的集合称为“****六”。

****第一册)第二册)构建其内容的基础假设(到 2020 年末成立)有三重:

  1. 在六家公司中的一家工作是最近的科技毕业生非常渴望的
  2. 在六家公司中的一家找工作竞争非常激烈,因此也很难
  3. 六家公司的招聘流程都非常相似

假设 1 在第一册)中有详细介绍。现在,书 2)** 关心的是点 2 和点 3。更准确地说,它的目的是让年轻、有抱负、有抱负的技术超级明星做好准备,在与六个中的一个**的技术面试中脱颖而出,从而获得他们梦想中的工作。****

这些公司的面试是出了名的技术性,非常注重应聘者解决问题和编写代码的能力。这本书的结构尊重这种现状,分为两部分。

第一部分(软技能部分)是关于工作的非技术性方面,比如你应该穿什么,可以问什么问题,如何进行有效的电梯推销,以及如何谈论你过去的经历以引起面试官的兴趣。

它还包含了一系列严格的不要做的事情,不管你有多有才华,这些事情都会立刻让你关门大吉。一定要把这些记在某个地方,不惜一切代价避免它们。

本书的其余部分(即超过 80%的部分)是所谓的技术部分,是在六个中的一个的真实世界面试中候选人遇到的问题样本的集合,并附有描述性的解决方案。

您可能没有时间浏览作者在技术部分中介绍的数百个技术示例。不要担心,我也没有。但是我建议详细研究这本书的第一部分,然后解决每个技术部分的几个问题。

信不信由你,许多准备从头开始背诵散列图实现的精明工程师经常被简单的查询弄得措手不及,比如:“那么,托马斯,告诉我一点关于你自己的情况”。我自己也去过,这一点也不好玩!第一部分 Book 2) 是特别设计的,这样你就不会像我一样结束,所以不要跳过它。

最后,即使你不打算为六个中的一个工作,通读这本书并学习搞定工作面试的艺术(技术和非技术方面)很可能会被证明是你一生中最有价值的投资之一。

那是因为在我们这个时代,面试已经成为事实上的找工作的标准。如果你已经准备好参加第六次、第十九次(即的面试,这是最难的面试之一),你应该已经做好准备,可以顺利通过世界上几乎任何其他工作的面试。

安德鲁·亨特和戴维·托马斯的《实用程序员》

很好,读完第 1)和第 2)本书,你就知道科技游戏大概是什么样子了,你也知道如何在谷歌和 Facebooks of the world 和其他酷孩子一起玩了。

现在你可能会问自己:一旦我进入大联盟,我该如何让自己脱颖而出?是什么让克里斯蒂亚诺·罗纳尔多在科技界与当地球员区分开来?

简短的回答是努力工作和经验。现在有办法解决了。然而,你可以通过专门的学习和比你级别高的优秀员工的指导来加速你的提升。

想象一下那些高级工程师,他们在职业生涯中不得不面对的所有陷阱,以及他们从这些陷阱中学到的无数教训。正是这种来之不易的智慧让他们在工作中如此出色。如果把它写在某个地方,让年轻一代学习并应用到他们的实践中,而不是用他们自己的血汗和眼泪来支付,这不是很好吗?

好消息!第三册)(务实的程序员)正是这样,一个技巧、窍门和习惯的汇编,有效的程序员使用它们来编写干净、设计良好的代码,满足业务期限并交付尖端软件,同时为他们的工作赢得信用以及同事工程师和关键业务利益相关者的信任。

事实是,软件工程不是短跑,而是马拉松。作为一名程序员,要爬上成功的阶梯,你需要生产高质量的工作,而且你需要经常生产,在稳定和一致的基础上。

作为第三册)如何帮助你成为软件工程顶尖高手的一个例子,请看下面这本书里我经常使用的 3 个我最喜欢的技巧,我可以很容易地证明它们的采用使我在我所做的事情上变得更好(当然,书中还有许多其他可爱的技巧)

  1. 学习如何估计你的工作(说:“任务 X 将花费我 N 天时间。”而不是:“我不知道完成 X 需要多长时间…”)
  2. 自动化重复性任务(通常使用 shell 脚本)
  3. 不要请求允许(宁愿以后请求原谅……)

有趣的事实:技巧 3 是我在亚马逊的现任越级经理最喜欢给团队新成员的一条智慧。我想知道他是不是也是从这本书里得到的…

以我自己为例,当我刚从大学毕业就被推进一家美国公司而引发认知失调时,我读了一些书。当时,我认为作为一名程序员,我会花大部分时间写代码。我大错特错了…

当我准备艰难地学习时,软件工程是一门非常复杂的学科,它给从业者带来了定义模糊的问题、紧迫的期限和不断要求的客户。

要想成功,除了编码,你还需要掌握更多的技能。这是因为编写代码只是您将要交付的端到端解决方案的一部分,而且实际上是相对较小的一部分。

幸运的是, Book 3) 可以为你提供一种实用主义哲学,这种哲学寻求在保持代码纯净和保持业务运行之间找到正确的平衡。

有了实用的精神操作系统,你不仅可以避免因构建重要软件时的模糊性和压力而导致的精神错乱,还可以让自己在这个不断要求和令人兴奋的领域获得成功。

感谢您阅读我的文章

正在寻找一位导师来帮助你在科技世界茁壮成长?
订阅我的 邮箱列表

托马斯·叶
体操运动员、数学家和软件工程师
随时与我联系 LinkedIn :

资源

选择的暴政->https://www . scientific American . com/article/the-暴政的选择/****

领导是读者->https://www . PDA . org/PDA-Europe/news-archive/full-story/2017/03/06/4-原因-领导-是读者

斯科特·盖洛威著->-https://www . Amazon . com/Four-Hidden-Amazon-脸书-Google/dp/0525501223

安德鲁·亨特和戴维·托马斯的《务实的程序员》->https://www . Amazon . com/practical-Programmer-joyneman-Master/DP/020161622 x

破解编码采访盖尔·拉克曼·麦克道尔->https://www . Amazon . com/Cracking-Coding-Interview-Gayle-McDowell/DP/0984782850

每个数据科学家都应该知道的 3 个条件

原文:https://towardsdatascience.com/3-conditionals-every-data-scientist-should-know-1916d48b078a?source=collection_archive---------31-----------------------

图示条件方差(图片由作者提供)

条件期望、条件概率和条件方差:回归建模者的实践见解

条件期望

随机变量的条件期望是我们期望它取的值,条件是它所依赖的另一个变量取一个特定值。

如果这听起来很拗口,不要绝望。我们将很快进入这个概念的“啊哈”时刻。为了帮助我们的探索,我们将使用泊松分布的随机变量 Y 作为我们的主角。

所以设 Y 为平均发生率 λ泊松分布离散随机变量

P 概率 M 屁股 F 油膏看起来如下。( PMF 只是离散随机变量的概率分布的另一个名称):

泊松(λ=20)随机变量的 PMF

【Y】的期望值,记为()【T47),是以下各项的乘积之和:****

  • Y 在其范围【0,∞】、内的每一个值,
  • 其对应的概率P(Y= Y),摘自其 PMF。换句话说,如下:

离散随机变量的期望值(图片由作者提供)

关于期望值的事情是,如果你把你的钱押在 Y 的任何一个值上,E(Y)是你应该押的。

Y泊松(λ) 分布的情况下,可以证明 E(Y) 就是单纯的 λ 。在上图所示的样本分布中,E(Y)= 20

如果 Y 是一个连续值的随机变量,如正态分布的随机变量,E(Y)计算如下:

无条件期待连续的 Y (图片由作者)

其中 f(y)YP 概率 D 密度Ffunction(PDF)【a,b】是其区间

那么关于这个期望的条件是什么呢?在这种情况下,什么都不是,因为 Y ,按照我们的定义,是一个独立变量,即它的值不依赖于任何其他变量的值。

我们现在介绍另一个主角:变量 X 。有了图中的 X ,我们可以考虑 Y 依赖于 X 的情况,即 Y 是 X: 的某个函数

*****Y= f(X*)。

一个简单的例子 f(。)YX 之间的线性关系:

=β0+β1 * X******

其中 β0 为截距 β1 为直线的斜率。

让我们扮演一下上帝。我们将声称知道 YX. 之间的真实关系如下(但是不要让你头脑中的回归建模者知道这个真实关系!):

Y****= 20+10 X*****

下面是 YX 的剧情:

Y= 20+10*** X(图片由作者)

等等,但是 Y 不是一个随机变量吗?因此,对于 X 的每个值,我们会期望占据一个或多个由【Y】的概率分布(PDF 或 PMF)控制的随机值。Y 的这种随机行为导致了下面这种图,Y对 X而不是我们之前看到的非常整齐的图:******

一个更现实的 Y 对 x 的曲线被假设为泊松分布的随机变量。(图片由作者)**

再次回忆一下,在我们的例子中,我们假设 Y泊松(λ) 分布原来泊松分布的 PMF 的参数 λ 在我们之前看到的 YX 的整齐直线图和上图所示的*对 X 的涂抹图之间形成了结缔组织。具体来说, λX 的如下线性函数:*****

λ(X)= 20+10***** X**

但正如我们在文章开头所指出的,一个泊松(λ) 分布随机变量的期望值即E(Y),就是的简单λ。因此,对于 的某个值 X :**

E(Y|X)=λ(X),从而:

E(Y|X)= 20+10***** X**

符号E(Y|X)XY*条件期望,条件是 X 取一个特定值*******

比如在 Y 对 X 的整齐直线图中,当X= 6时,

E(Y|X= 6)= 20+10 * 6 = 80

所以现在我们可以说,当 X =6, Y 是一个均值 λ 为 80 的泊松分布随机变量。

我们可以对 X 的每一个值进行类似的计算,得到X= X对应的条件期望Y这样做让我们“叠加”两个 YX 图,如下所示。橙色点是 Y 的泊松分布样本的条件平均值,由蓝色点表示。

E( Y | X )叠加在 Y (图片由作者提供)

一般来说,如果 Y 是一个随机变量,并且【X】具有线性关系,我们可以将这种关系表示如下:****

E(Y | X= X)=β0+β1***X

其中 E(Y | X= X)称为以 X 取值为条件的 Y 的期望值****

条件期望,又称 Y的条件均值,也可以简写为E(Y|X)。****

现在是关于条件概率分布的部分:

我们将看到 解释变量 X 如何通过参数 λ: 进入泊松分布 Y 的 PMF

到目前为止,我们已经看到:

E(Y | X= X)=λ(X= X)=β0+β1*****X**

我们还知道, Y 的 PMF 由下式给出:

PMF 的泊松(λ) (图片由作者)

在上面的等式中,用β0+β1X替换 λ ,或者确实用任何其他函数f(X)X,就宾果! Y 取特定值 y 的概率现在突然依赖于×取特定值 x 。请参见下面更新的 PMF 公式:*******

泊松的条件 PMF(λ(X))(图片由作者)

换句话说, Y 的 PMF 现在已经转化为一个 条件概率分布函数 。这不是很棒吗?

Y 可以有任何一种概率分布,离散的、连续的或混合的。同样, Y 可以通过任何一种关系 f(.)介于 YX 之间。因此,对于Y 为离散随机变量的情况,我们可以将YX 的条件期望写成如下:**

离散随机变量的条件期望(图片由作者提供)

其中P(Y= Y _ I |X= X)条件概率 质量 函数Y

如果 Y 是一个连续的随机变量,我们可以把它的条件期望写成:

连续随机变量的条件期望(图片由作者提供)

其中f(Y= Y _ I |X= X)条件概率 密度 函数Y

条件概率分布和条件期望在回归模型的规范中占有突出的位置。我们将在线性回归的上下文中看到两者之间的联系。

条件期望和回归建模

假设给我们一个(y,x)元组的随机样本,该样本取自前面图中所示的总体值:

(y,x)值的随机样本(图片由作者提供)

还假设您已决定将线性回归模型拟合到此样本,目标是从 x 预测 Y。在您的模型被训练(即拟合)到样本后,模型的回归方程可指定如下:

【Y _(预测)=+β1 _(拟合)X***

其中 β0_(拟合)β1_(拟合) 为拟合模型的系数。现在让我们跳过安装步骤。下图显示了上述样本图的拟合模型。我已经叠加了 YE(Y|X) 的条件期望,对于 X 的每个值:

样本 Y,E(Y|X)和拟合的模型(图片由作者提供)

从图中可以看出,拟合的模型并没有完全通过 Y 的条件期望。每种情况下都有少量的误差。让我们算出这个误差为 X =8 :

***When ***X***=8:
We know *E(****Y****|****X****)* because we are playing God and we know the exact equation between ***Y*** and ***X****:
E(****Y****|****X****=8)* = 20+10*8 = 100Our model cannot God, so at best it can only estimate *E(****Y****|****X****)***:
*Y_predicted****|****X****=8* = 22.034 + 9.458 * 8 = 97.698Thus the **residual error *ϵ*** for ***X****=8* is 100 - 97.698 = 2.302***

这样,我们也可以找到所有其他值 X 的残差。

我们现在可以使用这些剩余误差项,根据拟合模型的系数来表达 Y 的条件期望。这种关系为×= 8看起来是这样的:

E(Y|X= 8)= 100 = 22.034+9.458 * 8+2.302

或者总的来说,我们有:

e(y|x)=【β0 _(拟合)+**【β1 _(拟合)X + ϵ*

换句话说:

E(Y|X) = Y_(预测)+ ϵ

其中 ϵ 是回归模型的误差,又称模型的残差。

一般来说,对于“表现良好”的模型,当您在越来越大的样本量上训练您的模型时,会发生以下有趣的事情:

  • 在我们的示例中,拟合模型的系数: β0_(拟合)β1_(拟合)开始接近真实值(在我们的示例中,分别为 20 和 10)。
  • 拟合模型的预测( Y_predicted )开始逼近Yon即 E(Y|X【T97)****
  • 模型的剩余误差开始趋近于零。

条件方差

方差是对数据偏离均值的简单衡量。

数学上,样本的方差 s (或总体的 σ )是样本(或总体)值与样本(或总体)均值之差的平方和。

样本的方差(图片由作者提供)

下面的情节说明了 无条件 方差s(Y)有条件 方差s(Y|X= X:**

无条件和有条件方差(图片由作者提供)

样本(或总体)的无条件方差考虑了样本(或总体)中的所有值,而有条件方差只关注与给定值【X相对应的Y 值的子集。****

在我们的示例中,我们将样本的条件方差s(Y|X= X)定义为给定 X 值的 Y 的方差。因此记法为s(Y*|*****

条件方差和回归建模

与条件期望一样,条件方差在回归建模领域占有特殊的位置,其位置如下:

建立回归模型(或任何统计模型)的主要原因是试图“解释”因变量的可变性。实现这个目标的一个方法是在你的模型中包含相关的解释变量 X 。条件方差为您提供了一种解释回归变量对减少 Y 方差的帮助(即解释)程度的方法。

如果你发现一个解释变量的存在不能解释太多的差异,它可以从模型中删除。

为了说明这个概念,让我们再来看一下上面的图,它显示了中的无条件方差和有条件方差

样本的总体方差为 870.59。但是,如果您要将 X 固定为 6,那么只需知道 X 为 6 就可以将方差降低到只有 25!下表列出了 Yx 的剩余值的条件方差,将每个值与 Y 的总体无条件方差进行比较,即 870.59:**

不同 X 值的条件方差(图片由作者提供)

就是这样!这就是条件概率,条件期望和条件方差的全部内容。您可以看到这三个概念在回归建模中扮演了多么有用和重要的角色。

快乐造型!

感谢阅读!我写关于数据科学的主题。如果您喜欢这篇文章,请 关注我 接收关于数据科学、时间序列分析和预测主题的文章、指南和编程建议。

视觉三维重建

原文:https://towardsdatascience.com/3-d-reconstruction-with-vision-ef0f80cbb299?source=collection_archive---------5-----------------------

来源:卡琳·科列夫和丹尼尔·克雷默斯的论文《通过凸松弛进行连续比率优化并应用于多视角三维重建》。

整整一年前,在我开始写这篇文章之前,我看了特斯拉人工智能总监 Andrej Karapathy 的一次演讲,他向世界展示了特斯拉汽车如何使用挂在车上的摄像头感知深度,以便以 3D 方式重建周围环境并实时做出决策,一切(除了安全方面的前雷达)都是通过视觉进行计算的。那个演示让我大吃一惊!

当然,我知道通过相机可以实现环境的三维重建,但我的思维模式是,当我们拥有像激光雷达、雷达等这样高精度的传感器时,为什么有人会冒险使用普通相机呢?这能以少得多的计算量给我们一个准确的三维环境展示?我开始研究(试图理解)与深度感知和视觉三维重建相关的论文,并得出结论,我们人类从来没有从我们的头部发出光线来感知深度和周围的环境,我们很聪明,只用我们的两只眼睛就能意识到我们的周围环境,从开车或骑自行车去上班,或者在世界上最危险的赛道上以 230 英里/小时的速度驾驶一级方程式赛车,我们从来不需要激光在微秒内做出决定。我们周围的世界是由我们自己构建的,我们是有视觉的生物,所以正如埃隆所说,'一旦我们解决了视觉问题,这些昂贵的传感器将变得毫无意义。

在视觉深度感知领域正在进行大量的研究,特别是随着机器学习和深度学习的进步,我们现在能够仅以高精度从视觉计算深度。因此,在我们开始学习概念和实现这些技术之前,让我们看看这项技术目前处于什么阶段,以及它的应用是什么。

机器人视觉:

ZED 相机的环境感知

为自动驾驶创建高清地图:

深度感知与深度学习

SfM(运动结构)和 SLAM(同步定位和映射)是主要技术之一,它们利用了我将在本教程中向您介绍的概念。

LSD-SLAM 的演示

既然我们已经有了足够的灵感来学习,我将开始教程。所以首先我要教你理解幕后发生的事情所需的基本概念,然后用 C++中的 OpenCV 库应用它们。你可能会问,为什么我要用 C++实现这些概念,而用 python 实现会容易得多,这是有原因的。第一个原因是 python 的速度不够快,无法实时实现这些概念,第二个原因是,与 python 不同,使用 C++会要求我们理解概念,没有它就无法实现。

在本教程中,我们将编写两个程序,一个是获取场景的深度图,另一个是获取场景的点云,都使用立体视觉。

在我们进入编码部分之前,理解相机几何的概念是很重要的,这是我现在要教你的。

相机型号

自从摄影开始以来,用来产生图像的过程就没有改变过。来自被观察场景的光被相机通过前光圈(镜头)捕获,前光圈将光发射到位于相机镜头后面的图像平面上。该过程如下图所示:

由上图可知, do 是镜头到被观察物体的距离, di 是镜头到像面的距离。并且 f 将因此成为透镜的焦距。根据下面所示的所谓“薄透镜方程”,这些描述的量之间具有关系:

现在让我们来看看现实世界中的三维物体是如何被投影到二维平面(照片)上的。让我们理解这一点的最好方法是看看相机是如何工作的。

相机可以被看作是将三维世界映射成二维图像的功能。让我们以最简单的相机模型为例,那就是针丨孔丨相机模型,人类历史上最古老的摄影机制。下面是针丨孔丨摄像机的工作示意图:

从这个图表中我们可以得出:

在这里,很自然地,物体形成的图像的尺寸与物体离摄像机的距离成反比。并且位于位置(X,Y,Z)的 3d 场景点将被投影到(X,Y)处的图像平面上,其中(X,y) = (fX/Z,fY/Z)。其中 Z 坐标指的是点的深度,这是在前面的图像中完成的。整个摄像机配置和符号可以用一个简单的矩阵来描述,该矩阵使用齐次坐标 系统

当摄像机生成世界的投影图像时,射影几何被用作现实世界中物体几何、旋转和变换的代数表示。

齐次坐标是射影几何中使用的坐标系统。即使我们可以在欧几里得空间中表示真实世界中的对象(或三维空间中的任何点)的位置,但是必须执行的任何变换或旋转都必须在齐次坐标空间中执行,然后再返回。让我们看看使用齐次坐标的优点:

  • 涉及齐次坐标的公式通常比笛卡尔坐标中的要简单。
  • 无穷远处的点可以用有限坐标来表示。
  • 单个矩阵可以代表相机和世界之间可能发生的所有可能的保护性转换。

在齐次坐标空间中,二维点由 3 个向量表示,三维点由 4 个向量表示。

在上面的等式中,第一个带有 f 符号的矩阵称为内禀参数矩阵(或俗称内禀矩阵)。这里的固有矩阵现在只包含焦距( f ),我们将在本教程之前研究这个矩阵的更多参数。

带有 r 和 t 符号的第二个矩阵称为非本征参数矩阵(或通常称为非本征矩阵)。该矩阵中的元素表示相机的旋转和平移参数(即相机在现实世界中的位置和放置方式)。

因此,这些内在和外在矩阵一起可以给出图像中的(X,Y)点和现实世界中的(X,Y,Z)点之间的关系。这就是三维场景点如何根据给定的相机内部和外部参数投影到二维平面上。

现在我们已经获得了足够多的关于射影几何和相机模型的知识,是时候向你介绍计算机视觉几何中最重要的元素之一了,基础矩阵

基础矩阵

现在我们知道了三维世界中的一个点是如何被投影到相机的像平面上的。我们将研究显示同一场景的两幅图像之间的投影关系。当这两个摄像机被一条刚性基线分开时,我们使用术语立体视觉。假设两个针丨孔丨摄像机观察一个给定的场景点,共享相同的基线,如下图所示:

从上图可以看出,世界点 X 在图像平面上的位置 x 处有图像,现在这个 x 可以位于三维空间中这条线上的任何位置。这意味着如果我们想在另一幅图像中找到同一点 x ,我们需要沿着这条线在第二幅图像上的投影进行搜索。

这条从 x 画出的假想线被称为 x极线。这条极线带来了一个基本的约束,即在另一个视图中,给定点的匹配必须位于这条线上。意思是,如果你想从第二张图片中的第一张图片中找到 x ,你得沿着第二张图片中 x 的极线去寻找。这些核线可以描述两个视图之间的几何特征。这里需要注意的一点是,所有的极线总是通过一个点。这个点对应于一个摄像机中心到另一个摄像机中心的投影,这个点被称为极线。

我们可以将基础矩阵 F 视为将一个视图中的二维图像点映射到另一个图像视图中的核线的矩阵。图像对之间的基本矩阵可以通过求解一组方程来估计,该组方程涉及两幅图像之间的一定数量的已知匹配点。这种匹配的最小数量是 7,最佳数量是 8。然后,对于一幅图像中的一个点,基本矩阵给出了在另一个视图中应该找到其对应点的直线的方程。

如果一个点(x,y)的一个点对应的点是(x ',y '),两个像平面之间的基本矩阵是 F,那么在齐次坐标下我们必须有下面的方程。

这个等式表达了两个对应点之间的关系,称为极线约束

使用 RANSAC 匹配好的图像点

当两个相机观察同一个场景时,它们看到的是相同的物体,但视角不同。C++和 Python 中都有 OpenCV 之类的库,它们为我们提供了特征检测器,这些检测器可以用图像中的描述符为我们找到某些点,它们认为这些点对于图像是唯一的,如果给定同一场景的另一幅图像,就可以找到这些点。然而,实际上不可能保证通过比较检测到的特征点的描述符(如 SIFT、ORB 等)在两幅图像之间获得匹配集。)会准确真实。这就是为什么引入了基于 RANSAC(随机抽样一致性)策略的基本矩阵估计方法。

RANSAC 背后的想法是从一组给定的数据点中随机选择一些数据点,并仅使用这些数据点进行估计。所选择的点的数量应该是估计数学实体所需的最小点的数量,在我们的基础矩阵的情况下是八个匹配。一旦从这八个随机匹配中估计出基础矩阵,匹配集中的所有其他匹配就根据我们讨论的极线约束进行测试。这些匹配形成了所计算的基础矩阵的支持集。

支持集越大,计算出的矩阵是正确矩阵的概率就越高。并且如果随机选择的匹配之一是不正确的匹配,那么计算的基础矩阵也将是不正确的,并且它的支持集将被认为是小的。这个过程重复多次,最后,具有最大支持集的矩阵将被保留为最可能的矩阵。

从立体图像计算深度图

人类进化成为有两只眼睛的物种的原因是我们能够感知深度。当我们在一台机器中以类似的方式组织相机时,这被称为立体视觉。立体视觉系统通常由两个并排的摄像机组成,观察同一个场景,下图显示了具有理想配置的立体装备的设置,完美对齐。

在上图所示的理想相机配置下,相机仅通过水平平移分开,因此所有的核线都是水平的。这意味着对应的点具有相同的 y 坐标,并且搜索减少到一维线。当摄像机被这样的纯水平平移分开时,第二个摄像机的投影方程将变成:

通过查看下图,这个等式会更有意义,这是数码相机的一般情况:

其中 (uo,vo) 点是经过镜头主点的直线穿过像面的像素位置。这里我们得到一个关系式:

这里,术语(x-x’)被称为视差, Z 当然是深度。为了从立体对中计算深度图,必须计算每个像素的视差。

但是在实际世界中,获得这样的理想配置是非常困难的。即使我们精确地放置摄像机,它们也不可避免地会包含一些额外的过渡和旋转组件。

幸运的是,可以通过使用鲁棒的匹配算法来校正这些图像以产生所需的水平对线,该算法利用基础矩阵来执行校正。

现在让我们从获得下面立体图像的基本矩阵开始:

立体图像对

你可以点击这里从我的 GitHub 库下载上面的图片。在开始编写本教程中的代码之前,请确保您的计算机上已经构建了 opencv 和 opencv-contrib 库。如果还没有安装,我建议你在 Ubuntu 上访问这个链接来安装它们。

我们来编码吧!

#include <opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"using namespace std;
using namespace cv;int main(){
cv::Mat img1, img2;img1 = cv::imread("imR.png",cv::IMREAD_GRAYSCALE);
img2 = cv::imread("imL.png",cv::IMREAD_GRAYSCALE);

我们做的第一件事是包含了 opencv 和 opencv-contrib 中所需的库,这是我在开始本节之前要求您构建的。在 main() 函数中,我们已经初始化了 cv:Mat 数据类型的两个变量,这是 opencv 库的成员函数, Mat 数据类型可以通过动态分配内存来保存任何大小的向量,尤其是图像。然后使用 cv::imread() 我们将这两幅图像导入到mat数据类型的 img1img2 中。cv::im read _ gray参数将图像作为灰度导入。

// Define keypoints vector
std::vector<cv::KeyPoint> keypoints1, keypoints2;// Define feature detector
cv::Ptr<cv::Feature2D> ptrFeature2D = cv::xfeatures2d::SIFT::create(74);// Keypoint detection
ptrFeature2D->detect(img1,keypoints1);
ptrFeature2D->detect(img2,keypoints2);// Extract the descriptor
cv::Mat descriptors1;
cv::Mat descriptors2;ptrFeature2D->compute(img1,keypoints1,descriptors1);
ptrFeature2D->compute(img2,keypoints2,descriptors2);

这里我们利用 opencv 的 SIFT 特征检测器从图像中提取所需的特征点。如果你想更多地了解这些特征检测器是如何工作的,请访问这个链接。我们上面获得的描述符描述了提取的每个点,该描述用于在另一幅图像中找到它。

// Construction of the matcher
cv::BFMatcher matcher(cv::NORM_L2);// Match the two image descriptors
std::vector<cv::DMatch> outputMatches;
matcher.match(descriptors1,descriptors2, outputMatches);

BFMatcher 获取第一组中一个特征的描述符,并使用某种阈值距离计算将其与第二组中的所有其他特征进行匹配,然后返回最接近的特征。我们将 BFMatches 返回的所有匹配存储在vector<cv::d match>类型的输出匹配变量中。

// Convert keypoints into Point2f
std::vector<cv::Point2f> points1, points2;
for (std::vector<cv::DMatch>::const_iterator it=   outputMatches.begin(); it!= outputMatches.end(); ++it) { // Get the position of left keypoints
    points1.push_back(keypoints1[it->queryIdx].pt);
    // Get the position of right keypoints
    points2.push_back(keypoints2[it->trainIdx].pt);
     }

首先需要将获取的关键点转换成 cv::Point2f 类型,以便与 cv::findFundamentalMat 一起使用,我们将利用该函数使用我们提取的这些特征点来计算基础矩阵。两个合成向量点 1点 2 包含两幅图像中对应的点坐标。

std::vector<uchar> inliers(points1.size(),0);
cv::Mat fundamental= cv::findFundamentalMat(
  points1,points2, // matching points
     inliers,         // match status (inlier or outlier)  
     cv::FM_RANSAC,   // RANSAC method
     1.0,        // distance to epipolar line
     0.98);     // confidence probabilitycout<<fundamental; //include this for seeing fundamental matrix

最后,我们调用了 cv::findFundamentalMat。

// Compute homographic rectification
cv::Mat h1, h2;
cv::stereoRectifyUncalibrated(points1, points2, fundamental,
 img1.size(), h1, h2);
// Rectify the images through warping
cv::Mat rectified1;
cv::warpPerspective(img1, rectified1, h1, img1.size());
cv::Mat rectified2;
cv::warpPerspective(img2, rectified2, h2, img1.size());

正如我之前在教程中向您解释的那样,在现实世界中很难获得没有任何误差的理想摄像机配置,因此 opencv 提供了一个纠正功能,该功能应用单应变换将每个摄像机的图像平面投影到一个完全对齐的虚拟平面上。这种变换是从一组匹配点和基本矩阵中计算出来的。

// Compute disparity
cv::Mat disparity;
cv::Ptr<cv::StereoMatcher> pStereo = cv::StereoSGBM::create(0,               32,5);
pStereo->compute(rectified1, rectified2, disparity);cv::imwrite("disparity.jpg", disparity);

最后,我们计算了视差图。从下图来看,较暗的像素代表离相机较近的物体,较亮的像素代表离相机较远的物体。你在输出视差图中看到的白色像素噪声可以用一些滤镜去除,我不会在本教程中介绍。

既然我们已经成功地从给定的立体对中获得了深度图。现在,让我们尝试使用 opencv 的 3D-Viz 工具将获得的二维图像点重新投影到三维空间,该工具将帮助我们绘制三维点云。

但是这一次,我们将使用本质矩阵来投影这些点,而不是从给定的图像点估计基础矩阵。

本质矩阵

本质矩阵可被视为基本矩阵,但用于校准的相机。我们也可以称之为基础矩阵的专门化,其中矩阵是使用校准的相机计算的,这意味着我们必须首先获得关于我们在世界上的相机的知识。

因此,为了估计本质矩阵,我们首先需要相机的固有矩阵(代表给定相机的光学中心和焦距的矩阵)。让我们看看下面的等式:

这里从第一个矩阵开始, fxfy 代表相机的焦距, (uo,vo) 是主点。这是内在矩阵,我们的目标是估计它。

这个寻找不同摄像机参数的过程被称为摄像机校准。显然,我们可以使用摄像机制造商提供的规格,但是对于我们将要进行的 3d 重建等任务,这些规格不够精确。因此,我们将执行我们自己的摄像机校准。

这个想法是向摄像机显示一组场景点,我们知道这些点在现实世界中的实际三维位置,然后观察这些点在获得的图像平面上的投影位置。利用足够数量的 3-D 点和相关的 2-D 图像点,我们可以从投影方程中提取精确的摄像机参数。

做到这一点的一种方法是从不同的视点拍摄世界上一组具有已知三维位置的三维点的若干图像。我们将利用 opencv 的校准方法,其中一种方法将棋盘的图像作为输入,并返回给我们所有的角。我们可以自由地假设电路板位于 Z=0,X 和 Y 轴与网格对齐。在下一节中,我们将看看 OpenCV 的这些校准函数是如何工作的。

三维场景重建

让我们首先创建三个函数,我们将在主函数中使用它们。这三个功能是

  • addchesboardpoints()//返回给定棋盘图像的角点
  • calibrate() //从提取的点返回固有矩阵
  • triangulate()//返回重建点的三维坐标
#include "CameraCalibrator.h"#include <opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"using namespace std;
using namespace cv;std::vector<cv::Mat> rvecs, tvecs;// Open chessboard images and extract corner points
int CameraCalibrator::addChessboardPoints(
         const std::vector<std::string>& filelist, 
         cv::Size & boardSize) {// the points on the chessboard
std::vector<cv::Point2f> imageCorners;
std::vector<cv::Point3f> objectCorners;// 3D Scene Points:
// Initialize the chessboard corners 
// in the chessboard reference frame
// The corners are at 3D location (X,Y,Z)= (i,j,0)
for (int i=0; i<boardSize.height; i++) {
  for (int j=0; j<boardSize.width; j++) {objectCorners.push_back(cv::Point3f(i, j, 0.0f));
   }
 }// 2D Image points:
cv::Mat image; // to contain chessboard image
int successes = 0;
// for all viewpoints
for (int i=0; i<filelist.size(); i++) {// Open the image
        image = cv::imread(filelist[i],0);// Get the chessboard corners
        bool found = cv::findChessboardCorners(
                        image, boardSize, imageCorners);// Get subpixel accuracy on the corners
        cv::cornerSubPix(image, imageCorners, 
                  cv::Size(5,5), 
                  cv::Size(-1,-1), 
      cv::TermCriteria(cv::TermCriteria::MAX_ITER +
                          cv::TermCriteria::EPS, 
             30,    // max number of iterations 
             0.1));     // min accuracy// If we have a good board, add it to our data
      if (imageCorners.size() == boardSize.area()) {// Add image and scene points from one view
            addPoints(imageCorners, objectCorners);
            successes++;
          }//Draw the corners
        cv::drawChessboardCorners(image, boardSize, imageCorners, found);
        cv::imshow("Corners on Chessboard", image);
        cv::waitKey(100);
    }return successes;
}

在上面的代码中,你可以看到我们包含了一个头文件“CameraCalibrator.h”,它将包含这个文件的所有函数声明和变量初始化。你可以通过访问这个链接在我的 Github 下载这个头文件以及本教程中的所有其他文件。

我们的函数使用 opencv 的findchesboardcorners()函数,该函数将图像位置数组(该数组必须包含每个棋盘图像的位置)和棋盘大小(您应该输入水平和垂直方向上棋盘中存在的角的数量)作为输入参数,并返回包含角位置的向量。

double CameraCalibrator::calibrate(cv::Size &imageSize)
{
  // undistorter must be reinitialized
  mustInitUndistort= true;// start calibration
  return 
     calibrateCamera(objectPoints, // the 3D points
          imagePoints,  // the image points
          imageSize,    // image size
          cameraMatrix, // output camera matrix
          distCoeffs,   // output distortion matrix
          rvecs, tvecs, // Rs, Ts 
          flag);        // set options}

在这个函数中,我们使用了 calibrateCamera() 函数,该函数获取上面获得的三维点和图像点,并返回给我们固有矩阵、旋转向量(描述相机相对于场景点的旋转)和平移矩阵(描述相机相对于场景点的位置)。

cv::Vec3d CameraCalibrator::triangulate(const cv::Mat &p1, const cv::Mat &p2, const cv::Vec2d &u1, const cv::Vec2d &u2) {// system of equations assuming image=[u,v] and X=[x,y,z,1]
  // from u(p3.X)= p1.X and v(p3.X)=p2.X
  cv::Matx43d A(u1(0)*p1.at<double>(2, 0) - p1.at<double>(0, 0),
  u1(0)*p1.at<double>(2, 1) - p1.at<double>(0, 1),
  u1(0)*p1.at<double>(2, 2) - p1.at<double>(0, 2),
  u1(1)*p1.at<double>(2, 0) - p1.at<double>(1, 0),
  u1(1)*p1.at<double>(2, 1) - p1.at<double>(1, 1),
  u1(1)*p1.at<double>(2, 2) - p1.at<double>(1, 2),
  u2(0)*p2.at<double>(2, 0) - p2.at<double>(0, 0),
  u2(0)*p2.at<double>(2, 1) - p2.at<double>(0, 1),
  u2(0)*p2.at<double>(2, 2) - p2.at<double>(0, 2),
  u2(1)*p2.at<double>(2, 0) - p2.at<double>(1, 0),
  u2(1)*p2.at<double>(2, 1) - p2.at<double>(1, 1),
  u2(1)*p2.at<double>(2, 2) - p2.at<double>(1, 2));cv::Matx41d B(p1.at<double>(0, 3) - u1(0)*p1.at<double>(2,3),
                p1.at<double>(1, 3) - u1(1)*p1.at<double>(2,3),
                p2.at<double>(0, 3) - u2(0)*p2.at<double>(2,3),
                p2.at<double>(1, 3) - u2(1)*p2.at<double>(2,3));// X contains the 3D coordinate of the reconstructed point
  cv::Vec3d X;
  // solve AX=B
  cv::solve(A, B, X, cv::DECOMP_SVD);
  return X;
}

上述函数采用投影矩阵和归一化的图像点,这些点可以通过使用上一个函数的固有矩阵获得,并返回上述点的三维坐标。

下面是从立体对三维重建的完整代码。这个代码需要至少 25 到 30 个棋盘图像,这些图像来自你拍摄立体像对的同一台相机。为了首先在您的 PC 上运行这段代码,克隆我的 GitHub repo,用您自己的立体对替换立体对,用您自己的数组替换棋盘图像位置数组,然后编译。我上传了一个棋盘图片的例子给你参考,你需要拍摄大约 30 个这样的图片并在代码中提及。

int main(){cout<<"compiled"<<endl;const std::vector<std::string> files = {"boards/1.jpg"......};
  cv::Size board_size(7,7);CameraCalibrator cal;
  cal.addChessboardPoints(files, board_size);cv::Mat img = cv::imread("boards/1.jpg");cv::Size img_size = img.size();
  cal.calibrate(img_size);
  cout<<cameraMatrix<<endl;cv::Mat image1 = cv::imread("imR.png");
  cv::Mat image2 = cv::imread("imL.png");// vector of keypoints and descriptors
  std::vector<cv::KeyPoint> keypoints1;
  std::vector<cv::KeyPoint> keypoints2;
  cv::Mat descriptors1, descriptors2;// Construction of the SIFT feature detector
  cv::Ptr<cv::Feature2D> ptrFeature2D = cv::xfeatures2d::SIFT::create(10000);// Detection of the SIFT features and associated descriptors
  ptrFeature2D->detectAndCompute(image1, cv::noArray(), keypoints1, descriptors1);
  ptrFeature2D->detectAndCompute(image2, cv::noArray(), keypoints2, descriptors2);// Match the two image descriptors
  // Construction of the matcher with crosscheck
  cv::BFMatcher matcher(cv::NORM_L2, true);
  std::vector<cv::DMatch> matches;
  matcher.match(descriptors1, descriptors2, matches);cv::Mat matchImage;cv::namedWindow("img1");
  cv::drawMatches(image1, keypoints1, image2, keypoints2, matches, matchImage, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
  cv::imwrite("matches.jpg", matchImage);// Convert keypoints into Point2f
  std::vector<cv::Point2f> points1, points2;for (std::vector<cv::DMatch>::const_iterator it = matches.begin(); it != matches.end(); ++it) {
    // Get the position of left keypoints
    float x = keypoints1[it->queryIdx].pt.x;
    float y = keypoints1[it->queryIdx].pt.y;
    points1.push_back(cv::Point2f(x, y));
    // Get the position of right keypoints
    x = keypoints2[it->trainIdx].pt.x;
    y = keypoints2[it->trainIdx].pt.y;
    points2.push_back(cv::Point2f(x, y));
  }// Find the essential between image 1 and image 2
  cv::Mat inliers;
  cv::Mat essential = cv::findEssentialMat(points1, points2, cameraMatrix, cv::RANSAC, 0.9, 1.0, inliers);cout<<essential<<endl;// recover relative camera pose from essential matrix
  cv::Mat rotation, translation;
  cv::recoverPose(essential, points1, points2, cameraMatrix, rotation, translation, inliers);
  cout<<rotation<<endl;
  cout<<translation<<endl;// compose projection matrix from R,T
  cv::Mat projection2(3, 4, CV_64F); // the 3x4 projection matrix
  rotation.copyTo(projection2(cv::Rect(0, 0, 3, 3)));
  translation.copyTo(projection2.colRange(3, 4));
  // compose generic projection matrix
  cv::Mat projection1(3, 4, CV_64F, 0.); // the 3x4 projection matrix
  cv::Mat diag(cv::Mat::eye(3, 3, CV_64F));
  diag.copyTo(projection1(cv::Rect(0, 0, 3, 3)));
  // to contain the inliers
  std::vector<cv::Vec2d> inlierPts1;
  std::vector<cv::Vec2d> inlierPts2;
  // create inliers input point vector for triangulation
  int j(0);
  for (int i = 0; i < inliers.rows; i++) {
    if (inliers.at<uchar>(i)) {
      inlierPts1.push_back(cv::Vec2d(points1[i].x, points1[i].y));
      inlierPts2.push_back(cv::Vec2d(points2[i].x, points2[i].y));
    }
  }
  // undistort and normalize the image points
  std::vector<cv::Vec2d> points1u;
  cv::undistortPoints(inlierPts1, points1u, cameraMatrix, distCoeffs);
  std::vector<cv::Vec2d> points2u;
  cv::undistortPoints(inlierPts2, points2u, cameraMatrix, distCoeffs);// Triangulation
  std::vector<cv::Vec3d> points3D;
  cal.triangulate(projection1, projection2, points1u, points2u, points3D);cout<<"3D points :"<<points3D.size()<<endl;viz::Viz3d window; //creating a Viz window//Displaying the Coordinate Origin (0,0,0)
  window.showWidget("coordinate", viz::WCoordinateSystem());window.setBackgroundColor(cv::viz::Color::black());//Displaying the 3D points in green
  window.showWidget("points", viz::WCloud(points3D, viz::Color::green()));
  window.spin();
}

我知道 medium 的代码显示很混乱,特别是对于 C++,因此甚至代码看起来也很混乱,所以我建议你去我的 GitHub 了解上面的代码。

对我来说,给定对的输出如下所示,可以通过调整特征检测器及其类型来改进。

任何对深入学习这些概念感兴趣的人,我会推荐下面这本书,我认为它是计算机视觉几何学的圣经。也是本教程的参考书。

计算机视觉中的多视图几何第二版——作者理查德·哈特利和安德鲁·齐泽曼。

如果你有任何问题,请在评论区告诉我。

谢谢你。

不到 5 分钟的 3 个深度学习算法—第 1 部分(前馈模型)

原文:https://towardsdatascience.com/3-deep-learning-algorithms-in-under-5-minutes-part-1-feed-forward-models-1065992e2ccd?source=collection_archive---------15-----------------------

图片由来自 PixabayThomas Breher 拍摄

如果你认为机器学习是你没有勇气与之交谈的暗恋对象,深度学习就是你暗恋对象的父亲!由于硬件的前所未有的进步和研究人员对更好更大模型的渴望,深度学习日益变得令人生畏和难以捉摸。每天涌现的研究越多,你应该掌握的基础知识水平就越高。所以,对于那些犹豫是否直接投入到深度学习的阴暗和俗气的好处中的人,我希望这篇文章能增强你的信心。本文不会讨论这些模型的任何数学问题,但会为您提供概念上的强化,让您在血淋淋的数学过程中走得更远。

全连接网络

你能找到的最简单的深层网络。它通常有一个输入层,一个输出层和可选的中间多个隐藏层。让下面的类比来解释。

类比:弗兰肯斯坦的实验室

想象你是科学怪人实验室的助手,那里充满了古怪的设备。弗兰肯斯坦刚刚要求你使用下面的仪器,用蓝色、红色、黑色和黄色的颜料来制作紫色、深橙色和绿色。当你把颜料倒在顶部时,根据管子开口的宽度,颜料会流到下面的一系列球上。有一种机制可以改变管子的大小。

管子的结构。线条的粗细表示管的厚度。你可以把虚线想象成非常小(或者不存在)的管子

这类似于 FCN 的工作原理。你给它输入,即特征向量(例如花的各种属性)(例子中的油漆桶),然后你预测结果(例如花的种类)(例子中的混合颜色)。预测结果是一系列的数学计算(包括矩阵乘法、加法等。).您可能已经意识到该设备已经被配置为最佳配置。达到最佳设置被称为训练/优化一个模型,它涉及输入特征向量、预测标签和真实标签(在示例中调整管宽度)。它也不需要仅仅是输入层和输出层。你也可以有中间层(即隐藏层)。这是 FCN 真正的样子。(了解更多:这里)

一种 FCN,用于在给定一些花卉属性的情况下预测正确的花卉种类。

应用程序

  • 结构化数据的简单分类任务,例如根据房屋属性预测房价

自动编码器

自动编码器是一种全连接网络,不同之处仅在于它们的使用方式。它们从一个输入开始,就像 FCNs 一样,将其映射到一个更小的隐藏表示(称为编码),最后重建原始输入(称为解码)。

类比:回到科学怪人的实验室

假设你和你的朋友有两个以上的小工具,并决定玩他们。您将它们组合起来,以便它们共享输出。现在看起来像下面。请注意,底部的管配置是顶部的镜像。

你和你朋友发明的小玩意。你把颜色倒在顶部和底部,你会得到相同的颜色。

你可以从顶部倒颜色,让它们在中间混合。那么一个可以分离不同颜色的“神奇粒子分离器”就会让颜色分离到原来的颜色。你甚至可以在顶部倒一种随机的颜色,让这个流形在底部找出随机的颜色。

这就是自动编码器中发生的情况。它接受一个输入(本例中为 paint),计算一个较小的潜在表示(本例中为混合颜色),最后导出原始输入(本例中为底部的颜色)。这是在真正的自动编码器中的样子。(了解更多:自动编码器)

自动编码器在现实生活中是什么样子的。它接受一些输入(例如图像像素),将其转换为较小的表示形式,然后重建原始输入。

应用程序

  • 恢复损坏的图像-您可以训练自动编码器通过输入损坏的图像并要求模型预测原始图像来恢复图像(类似于识别倒在顶部的随机颜色)。
  • 图像/数据聚类-您可以使用学习到的较小潜在表示作为数据的特征表示代理,从而对数据进行聚类

卷积神经网络

啊!计算机视觉的征服者。CNN 非常擅长处理图像。CNN 由卷积层、全连接层和可选的汇集层组成。CNN 接收具有高度、宽度和通道(例如 RGB —红绿蓝)的图像。

类比:博物馆抢劫!

有一个令人讨厌的逃犯正试图闯入博物馆偷一颗钻石。他走进博物馆计划抢劫。他把地板分成一个 5x5 的格子。然后,他从一个牢房走到另一个牢房,每行从左到右。然后他会查看四个相邻的单元格(即他所在的一个单元格、右边的单元格、上面的单元格和右上角的单元格)。如果他在视野中看到一些障碍物/艺术品,他会在正上方的天花板上射出一个绿色的夜光标记,如果钻石在这 4 个单元中的一个,他会射出一个红色的夜光标记。如果他站在地板上的每个细胞都这样做,他会有下面的计划。有了这个,他可以在晚上偷偷溜进来,即使在漆黑一片的时候也能准确地知道去哪里!

强盗将如何绘制博物馆的地图。你可以看到,在他偷偷摸摸的小冒险结束时,他得到了两张特征地图,可以帮助他在地板上导航,而不会触发任何警报。

这就是 CNN 的卷积层所做的。它移动一个内核(强盗想要映射的东西),这个内核一次只看到图像的一小部分,覆盖在图像上(就像强盗去所有的单元格)。并且在每个位置,它将输出一些值(例如,障碍物是否存在)。这一过程导致了要素地图的开发,这些地图提供了有用的宏观分析信息。最后,将 FCN 连接到最后一个卷积层,因为任何分类/回归任务都需要 FCN。这是典型的 CNN 的样子。(了解更多:卷积神经网络)。

一个真正的 CNN。它接收图像并使用卷积层生成多个特征图。可选地,网络具有池化图层,这从本质上减少了要素地图的宽度和高度(有助于减少模型的参数计数),最后还有一个完全连接的网络,允许您进行分类/回归。

应用程序

  • 图像分类—识别图像中存在的对象的类别
  • 对象检测—识别图像中的所有对象及其位置

结论

我们看了三种算法:全连接网络(FCNs)、自动编码器和卷积神经网络(CNN)。以下是主要的几点。

  • FCN 接受输入特征向量并预测正确的输出类别
  • 自动编码器接收输入,将其转换为较小的表示形式,并重建原始输出
  • CNN 接收一幅图像,通过一系列卷积/池层发送,最后通过 FCN,预测图像中存在的正确对象类别。

想在深度网络和 TensorFlow 上做得更好?

检查我在这个课题上的工作。

[1] (书)TensorFlow 2 在行动——曼宁

[2] (视频课程)Python 中的机器翻译 — DataCamp

[3] (书)TensorFlow 中的自然语言处理 1 — Packt

新的!加入我的新 YouTube 频道

如果你渴望看到我关于各种机器学习/深度学习主题的视频,请确保加入 DeepLearningHero

其他文章

第二部分:深度序列模型

不到 5 分钟的 3 种深度学习算法—第 2 部分(深度序列模型)

原文:https://towardsdatascience.com/3-deep-learning-algorithms-in-under-5-minutes-part-2-deep-sequential-models-b84e3a29d9a8?source=collection_archive---------36-----------------------

图片由来自 Pixabay埃里克·斯坦拍摄

的上一篇文章中,我们研究了处理非时间序列数据的模型。是时候把我们的注意力转向其他模型了。这里我们将讨论深度序列模型。它们主要用于处理/预测时间序列数据。

链接到第 1 部分,以防你错过。

简单递归神经网络/Elman 网络

简单的递归神经网络(也称为 RNNs)对于时间序列问题就像 CNN 对于计算机视觉一样。在时间序列问题中,您向模型提供一个值序列,并要求它预测该序列的下一个 n 值。rnn 遍历序列的每个值,同时建立它所看到的记忆,这有助于它预测未来会是什么样子。(了解更多关于 RNNs【1】【2】)

类比:新改进的秘密列车

我小时候玩过这个游戏,你可能知道它的另一个名字。孩子们被要求站成一排,你对排在队伍中的第一个孩子耳语一个随机单词。这个孩子应该在这个单词上加上一个合适的单词,然后小声告诉下一个孩子,等等。当信息到达最后一个孩子时,你应该有一个由孩子的想象力酝酿的令人兴奋的故事。

输入简单的 RNNs!这就是 RNN 的症结所在。它在时间 t — x(t) (来自最后一个孩子的新单词)和从时间 t-1h(t-1) (消息的先前单词)开始的状态作为输入,并产生输出— y(t) (先前的消息+来自最后一个孩子的新单词+您的新单词)。

一旦训练了一个 RNN,你就可以(但一般不会)永远保持预测,因为对时间 t 的预测(即 y(t) )在 t+1 成为输入(即 y(t)=x(t+1) )。这是 RNN 在现实世界中的样子。

RNN 如何解决情感分析问题。它从一个单词到另一个单词,同时产生一个状态(红球)。最后,有一个完全连接的网络(FCN),它采用最后一个状态并产生一个标签(正/负/中性)。

应用程序

  • 时间序列预测(例如天气/销售预测)
  • 情感分析——给定一个电影/产品评论(一系列单词),预测它是负面/正面/中性的。
  • 语言建模——给定故事的一部分,想象故事的其余部分/ 从描述中生成代码

长短期记忆网络

LSTM 是 RNN 镇最酷的新成员。LSTM 是一个比 RNNs 更复杂的野兽,能够记住比 RNNs 更长的事情。LSTMs 还会遍历序列的每个值,同时建立它所看到的内容的记忆,这有助于它预测未来会是什么样子。但是记得 RNNs 只有一个状态(代表记忆)吗?LSTMs 有两种状态(一种长期状态和一种短期状态),因此得名 LSTMs。(了解更多: LSTMs )

类比:快餐连锁店

所有这些解释都让我饿了!所以让我们去一家快餐连锁店。这是一个字面上的连锁,因为如果你点了一顿饭,一家店做汉堡,另一家做薯条,等等。在这个快餐店里,你去了第一家店,说了下面的话。

我需要一个汉堡,里面有烤老虎面包和烤鸡。

有一个人接受订单(绿色),并将信息发送给红色的人,假设他烤了面包。与蓝人交流时,他可以放下敬酒的部分,说:

一个汉堡,有老虎面包和烤鸡

(我们仍然需要烤的部分,因为下一家商店基于此决定酱料)。然后你开车到下一个商店说,

加上切达干酪,大薯条,我穿了一件绿色 t 恤

现在,绿色的人知道他的 t 恤颜色是完全不相关的,并放弃了这一部分。该商店还从上一个商店的红色和蓝色中获取信息。接下来他们会加入调味汁,准备薯条。第二家商店中的红色人员将持有大部分订单说明,以备我们稍后需要(如果客户投诉)。但他只会说,

一个汉堡和大薯条

蓝色的人,因为这是他工作所需要的。最后,您从第二个商店的输出终端获得订单。

快餐连锁店。有三个人;绿色(输入)、红色(单元状态)和蓝色(输出状态)。它们还可以从您提供的输入中丢弃某些信息,以及在内部处理它们时丢弃信息。

LSTMs 与这个链条的运作方式相差不远。在给定的时间 t,

  • 输入 x(t)(本例中的客户),
  • 输出状态 h(t-1)(来自先前商店的蓝色人)和
  • a 细胞状态 c(t-1)(前一家店的红人)。

并产生,

  • 一个输出状态 h(t)(这个商店里的蓝色人)和
  • a 细胞状态 c(t)(本店红人)

但是,LSTM 没有对这些元素进行直接计算,而是有一个门控机制,可以用来决定允许这些元素传递多少信息。例如,记得当顾客说“我在第二家商店穿了一件绿色 t 恤”时发生了什么,绿色的人(输入门)丢弃了该信息,因为它对订单不重要。另一个例子是,当红色的人在第一家商店扔掉了面包烘烤的部分。LSTM 的牢房里有许多扇门。即,

  • 输入门(绿色的人)——丢弃输入中无用的信息。
  • 遗忘之门(红人的一部分)——丢弃在之前的细胞状态中无用的信息
  • 一个输出门(蓝色人的一部分)——丢弃单元状态中无用的信息,生成输出状态

如您所见,交互是复杂的。但是最重要的是,

LSTM 保持两种状态(输出-短期状态和单元状态-长期状态),并在计算最终和中期输出时使用门控来丢弃信息。

这是 LSTM 的样子。

现实世界中的 LSTM。你可以看到这是一个复杂的连接迷宫。因此,不要试图理解它们在这一点上是如何连接的。了解所涉及的各种实体。红色虚线球表示由 LSTM 单元计算的中间输出

应用程序

  • 与 RNNs 相同

门控循环单元

唷!我离开的时候,LSTMs 真的花了不少时间。GRU 是 LSTMs 的继承者,它简化了 LSTMs 未来的机制,而没有过多地损害性能。(了解更多:格鲁什【1】【2】)

类比:快餐连锁店 v2.0

不是作为一个美食评论家,但我们之前看到的快餐连锁店看起来相当低效。有没有办法让它更有效率?这里有一个方法。

新的改良快餐连锁店。我们不再有红色的人。这将导致更少的延误,并有助于更快地获得您的货物。

  1. 去掉红色的人(细胞状态)。现在长时记忆和短时记忆都由绿人管理(输出状态)。
  2. 只有一个输入门和一个输出门(即没有遗忘门)

你可以把 GRU 看作是简单的 RNN 和 LSTMs 之间的一个中间者。这是 GRU 的样子。

现实世界中的 GRU。虽然不像 LSTMs 那么复杂,但还是有点难以下咽。因此,不要试图理解它们在这一点上是如何连接的。了解所涉及的各种实体。红色虚线球表示由 GRU 单元计算的中间输出。

应用:

  • 与 RNNs 相同

结论

我们看了简单的 rnn、LSTMs 和 gru。以下是主要的几点。

  • 简单 RNNs——从一个时间步到另一个时间步的简单模型,同时在每一步生成一个输出状态(无门控机制)
  • LSTMs —相当复杂。有两种状态;单元状态(长期)和输出状态(短期)。它还有一个门控机制来控制流经模型的信息量。
  • GRUs——RNNs 和 LSTMs 的折衷。只有一个输出状态,但仍有门控机制。

接下来将包括深度学习中最热门的话题;变形金刚。

如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!

[## 通过我的推荐链接加入媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

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

想在深度网络和 TensorFlow 上做得更好?

检查我在这个课题上的工作。

[1] (书)TensorFlow 2 在行动——曼宁

[2] (视频课程)Python 中的机器翻译 — DataCamp

[3] (书)TensorFlow 中的自然语言处理 1 — Packt

新的!加入我的新 YouTube 频道

如果你渴望看到我关于各种机器学习/深度学习主题的视频,请确保加入 DeepLearningHero

以前的文章

第 1 部分:前馈模型

为旧金山的餐馆建立推荐系统的 3 种不同技术

原文:https://towardsdatascience.com/3-different-techniques-to-build-recommender-systems-for-restaurants-based-in-san-francisco-cb5c3754449e?source=collection_archive---------59-----------------------

饿了吗?这里有一些推荐餐厅的方法!

粘土银行Unsplash 上拍摄

生活在像旧金山这样的大都市,这个城市有这么多令人惊叹的餐馆。在本文中,我将构建几个推荐系统来推荐旧金山的类似餐馆。

收集数据

收集的数据来自 Yelp API。Yelp 提供了一个 API,允许用户查询商家。为了从 Yelp 获取数据,你必须建立一个开发者账户并创建一个应用程序。Yelp 将为您生成一个客户端 ID 和 API 密钥,这些凭证将作为您查询数据的身份验证令牌。

这个文档将为您提供如何查询数据的端点。看一看他们。

对于这种情况,我们感兴趣的是位于旧金山的餐馆和位置。这将是与我的查询相关的端点:

[https://api.yelp.com/v3/businesses/search?term=restaurants&location='San](https://api.yelp.com/v3/businesses/search?term=restaurants&location='San) Francisco'

通过 URL,我们能够查询数据

import requestsreq_business_string = "[https://api.yelp.com/v3/businesses/search?term=restaurants&location='San](https://api.yelp.com/v3/businesses/search?term=restaurants&location='San) Francisco'"r = requests.get(req_business_string, 
                 headers={"content-type":"application/json", 
                          "authorization": "Bearer " + auth_token})

auth_token将是您创建应用程序时提供给您的 API 密钥。

json = r.json()
businesses = json['businesses']

通过运行上面的命令,您将能够从 API 收集业务。请记住,上面的字符串被过滤到旧金山的餐馆,这是将返回的结果。现在你有了旧金山餐馆的数据。

{'id': 'f-m7-hyFzkf0HSEeQ2s-9A',
  'alias': 'fog-harbor-fish-house-san-francisco-2',
  'name': 'Fog Harbor Fish House',
  'image_url': 'https://s3-media1.fl.yelpcdn.com/bphoto/Lv7tIRX3Bim9bKqtWifmNg/o.jpg',
  'is_closed': False,
  'url': 'https://www.yelp.com/biz/fog-harbor-fish-house-san-francisco-2?adjust_creative=vBso-HM6oooiiw4hc86H-A&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=vBso-HM6oooiiw4hc86H-A',
  'review_count': 6050,
  'categories': [{'alias': 'seafood', 'title': 'Seafood'},
   {'alias': 'bars', 'title': 'Bars'}],
  'rating': 4.0,
  'coordinates': {'latitude': 37.809041, 'longitude': -122.410233},
  'transactions': ['restaurant_reservation'],
  'price': '$$',
  'location': {'address1': 'Pier 39',
   'address2': 'Ste A-202',
   'address3': '',
   'city': 'San Francisco',
   'zip_code': '94133',
   'country': 'US',
   'state': 'CA',
   'display_address': ['Pier 39', 'Ste A-202', 'San Francisco, CA 94133']},
  'phone': '+14154212442',
  'display_phone': '(415) 421-2442',
  'distance': 5827.740044156521}

这是返回的结果。

除了获取餐馆数据,我们还想收集特定餐馆的评论。我们可以通过查看评论端点并执行类似的查询来查询数据。

现在我们有了餐馆和评论的数据。我们将保存到一个 csv 文件中,这样我们就不需要再次查询 Yelp API。

分析数据

流程的下一步是理解数据和分析数据。基于上一步,我将数据存储在一个 csv 文件中。

import pandas as pdrestaurants_df = pd.read_csv('data/restaurants.csv')
restaurants_df.head()

我将数据保存到一个名为restaurants.csv的数据文件夹中。

下面是 restaurants 表的屏幕截图,某些列以数组或散列格式表示。这不是建模的理想格式,我们必须将数据转换成数字格式。类似地,reviews 表确实将用户作为散列格式,我们希望解析它,以便每一列都表示一个值,而不是一个散列。

拉斯·维格Unsplash 拍摄的照片

清除数据

为了进行建模,我们需要以正确的格式准备和修改数据。这包括一次热编码,并将散列分解成每一列的单个值。

查看餐馆表,我们有散列格式的类别、坐标和位置。我们必须将它们转换成单值列。

import ast
address = []
city = []
state = []
country = []
zipcode = []
for idx, row in restaurants_df.iterrows():
    location = ast.literal_eval(row['location'])
    address.append(location['address1'])
    city.append(location['city'])
    state.append(location['state'])
    country.append(location['country'])
    zipcode.append(location['zip_code'])

address_df = pd.DataFrame(address).rename(columns={0: 'address'})
city_df = pd.DataFrame(city).rename(columns={0: 'city'})
state_df = pd.DataFrame(state).rename(columns={0: 'state'})
country_df = pd.DataFrame(country).rename(columns={0: 'country'})
zip_code_df = pd.DataFrame(zipcode).rename(columns={0: 'zip_code'})lat = []
long = []
for idx, row in restaurants_df.iterrows():
    coord = ast.literal_eval(row['coordinates'])
    lat.append(coord['latitude'])
    long.append(coord['longitude'])

lat_df = pd.DataFrame(lat).rename(columns={0: 'latitude'})
long_df = pd.DataFrame(long).rename(columns={0: 'longitude'})categories_hash = {}
for idx, row in enumerate(restaurants_df['categories']):
    lst = []
    rows = ast.literal_eval(row)
    for cat in rows:
        lst.append(cat['title'])

    categories_hash[idx] = ", ".join(lst)
categories_df = pd.DataFrame.from_dict(categories_hash, orient='index').rename(columns={0: 'cuisines'})

上面的代码将把散列转换成具有特定值的独立数据帧。

有了这些创建的数据帧,我们可以通过在数据帧上执行一个get_dummies方法来执行一次热编码。

cuis = categories_df['cuisines'].str.split(", ")
cuisines_dummies = pd.get_dummies(cuis.apply(pd.Series).stack()).sum(level=0)transaction_df = pd.DataFrame(restaurants_df['transactions'].apply(lambda x: ", ".join(ast.literal_eval(x)) if len(ast.literal_eval(x)) > 0 else "none"))
trans = transaction_df['transactions'].str.split(", ")
transaction_dummies = pd.get_dummies(trans.apply(pd.Series).stack()).sum(level=0)

一旦它们被转换为 one-hot 编码,我们就可以连接数据帧并删除不相关的列(出于建模的目的,我们需要这些列采用数字格式,因此可以删除带有字符串的列)。

restaurants_sim_df = pd.concat([restaurants_df, lat_df, long_df, address_df, city_df, state_df, country_df, zip_code_df, cuisines_dummies, transaction_dummies], axis=1).drop(columns=['categories', 'coordinates', 'is_closed', 'transactions', 'phone', 'location', '_id', 'id', 'alias', 'name', 'image_url', 'url', 'review_count','display_phone', 'address', 'city', 'state', 'country','zip_code', 'distance', 'delivery', 'none', 'pickup', 'restaurant_reservation'])

在这个片段中,我将原始数据帧与创建的其他数据帧连接起来。我删除了不需要的列。在最终结果中,我只剩下带有数值的列。

推荐系统

在这篇文章中,我将使用不同的技术构建 3 个不同的推荐系统。

  1. 利用餐馆特征的内容过滤
  2. 使用自然语言处理的基于内容的过滤
  3. 基于模型的协同过滤

基于内容的过滤

  • 餐馆的特点

活动创建者Unsplash 上的照片

对于这个推荐系统,我们正在寻找具有相似特征的推荐餐馆,即美食、位置、价格、交易。

利用这些因素,我们基于以上使用余弦相似度创建了一个矩阵来推荐餐馆。余弦相似性是基于向量的相似性度量。

from sklearn.metrics.pairwise import cosine_similaritycos_sim = cosine_similarity(restaurants_sim_df, restaurants_sim_df)
  • 自然语言处理

在这项技术中,我们将使用文本来推荐餐馆。该文本将来自用户的评论和类似的餐馆,有类似的文本将被推荐。

我们将查看由 reviews 端点生成的 reviews 表。它有不同餐馆用户的评论,包括评论的描述。

reviews_df = user_reviews_df.groupby('slug').agg({'text': ' '.join})

首先,我们必须将来自相同餐馆的所有文本组合成一行。例如,B & C 的评论 A 可能属于餐馆 A。我们将把这些评论组合在一起,以便它们代表单个餐馆的相同评论。

from nltk.corpus import stopwords
import string
from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
import nltk
nltk.download('words')
words = set(nltk.corpus.words.words())stopwords_ = set(stopwords.words('english'))
punctuation_ = set(string.punctuation)def filter_tokens(sent):
    return([w for w in sent if not w in stopwords_ and not w in punctuation_])def cleaned_text(string):
    word_list = []
    sent_tokens = sent_tokenize(string)
    tokens = [sent for sent in map(word_tokenize, sent_tokens)]

    tokens_lower = [[word.lower() for word in sent]
                 for sent in tokens]
    tokens_filtered = list(map(filter_tokens, tokens_lower))
    for tlist in tokens_filtered:
        for w in tlist:
            if w != '...':
                word_list.append(w)

    return " ".join(word_list)reviews_df['cleaned_text'] = reviews_df['text'].apply(lambda t: cleaned_text(t))

在这一步中,我们对文本进行清理,例如删除停用词和标点符号。

cleaned_text表示删除了停用词和标点符号的文本。

from sklearn.feature_extraction.text import CountVectorizercorpus = reviews_df['cleaned_text']tf = CountVectorizer()document_tf_matrix = tf.fit_transform(corpus)
doc_sim = cosine_similarity(document_tf_matrix, document_tf_matrix)

使用计数矢量器创建矩阵,并执行余弦相似性。

基于模型的协同过滤

在这项技术中,我们将需要一个用户项过滤。最后两种技术是逐项过滤。

瓦列里·安德鲁斯科Unsplash 上的照片

在 reviews 表中,我们有餐馆名称、用户名和评级。我们可以创建一个新的矩阵,只包含这些列,这样它将成为一个用户条目矩阵。

ratings_df = reviews_df.merge(restaurants_name_df, left_on='slug', right_on='alias')
ratings_df.drop(columns=['slug', 'alias'], inplace=True)

它看起来会是什么样子的截图

我们可以在此基础上创建一个数据透视表

ratings_crosstab = ratings_df.pivot_table(values='rating', index='user_id', columns='name', fill_value=0)

由于大多数值将为 null(并非所有用户都会查看所有餐馆),所以我用 0 填充了这些值。

看这个表,我们在这个矩阵中有许多行(餐馆)和列(用户)。为了减少列数,我们使用奇异值分解(SVD)将用户数减少到 x 列数(因子)。要阅读更多关于 SVD 的内容,请点击这里的。

import numpy as np
import sklearn
from sklearn.decomposition import TruncatedSVDSVD = TruncatedSVD(n_components=12, random_state=17)
resultant_matrix = SVD.fit_transform(ratings_crosstab.values.T)

可以生成相关矩阵

corr_mat = np.corrcoef(resultant_matrix)

一旦生成了相关矩阵,我们就能够根据索引推荐餐馆。

如果你想看看我是如何用不同的推荐技术生成餐馆的,请看看知识库!

[## 悦翁/yelp _ 推荐者 _ 餐厅

Yelp 提供了一个我可以查询商家的 API。在这个项目中,我专注于获得餐厅,所以…

github.com](https://github.com/yueweng/yelp_recommender_restaurants)

在数据科学领域取得成功的三个要做和三个不要做

原文:https://towardsdatascience.com/3-dos-and-3-don-ts-to-become-successful-in-data-science-c49e2c293a56?source=collection_archive---------15-----------------------

意见

我希望开始时就知道的黄金法则。深入了解如何转变为一名成功的 ML 或 DS 从业者

照片由 Nghia LeUnsplash 上拍摄

数据科学和人工智能是巨大的领域,我喜欢每天都在努力改进。

到了现代,最被炒作和谈论的是实体。随着数据科学和人工智能的持续发展和不断成就,世界对每天出现的各种机会充满敬畏。

然而,要成为一名成功的数据科学家或机器学习实践者,有一些黄金规则必须遵循,以提高他们期望的任务或项目的生产率和整体效率。

我构建机器学习和深度学习模型已经有相当一段时间了,并且一直在从事各种项目。根据我的个人经验,这是我想与大家分享的三个要做和三个不要做的列表,这样你就可以启动并开始你的史诗般的旅程,或将你的成功轨迹提高到天文数字的水平。

让我们开始学习对您的数据科学未来最重要的方面。

1.做:广泛的研究持续的研究

绿色变色龙Unsplash 上拍照

人工智能和数据科学最棒的部分是这些学科每天都在不断发展。技术的进步正在迅速增加。了解数据科学领域的最新趋势和新兴发展变得越来越重要。

研究是任何数据科学项目不可或缺的一部分。对人工智能领域的发展有所了解或至少有一个简单的概念是至关重要的。

研究一个项目或任何特定的任务,甚至只是一个简单的数据科学术语是非常必要的。感谢每个人,尤其是专家对这个问题的看法,因为他们每个人都有自己的观点,你可以适应和学习。

因此,研究和批判性思维是将你的技能提升到一个完全不同的水平的少数方法之一。

我的建议:我强烈建议观看大量来自优质数据科学、人工智能、数学或编程频道的 YouTube 视频。阅读书籍和最重要的研究论文是绝对知识和理解任何特定主题或数据科学方面的必要条件。

1.不要:放弃!

尼克·舒利亚欣Unsplash 上拍摄的照片

数据科学有时会很难,尤其是对于试图入门的初学者来说。你看看这个领域的潜在话题,它可能会吓到不少人。

与编程类似,数据科学的有趣之处在于,你犯的每一个错误都会让你学到新的东西,以及你做错了什么,前提是你通过在互联网上查找或自己破解找到了解决方案。这种感觉让整体体验更加令人满意。

如果你第一次尝试无法解决机器学习或数据科学问题,也不要担心。只要你坚持不懈,找到解决方案,更好地理解这些概念,这是完全没问题的。

此外,如果这能让你感觉更好的话,即使是这个领域的专家也会犯错误,并且不得不查找资料来解决某些问题。这个领域可能是唯一一个你不需要记很多东西的领域,因为你可以用谷歌来记你忘记的东西。

我的建议:我强烈建议你改变对挑战性任务的看法,并更加享受它们。每一次失败都应该被视为成功的垫脚石,仅此而已。在数据科学中,你犯的错误越多,你学到的就越多。所以,振作起来,继续学习!

2.待办事项:实际实施

乔尔·罗兰在 Unsplash 上拍摄的照片

要欣赏数据科学的真正魅力,你需要尝试许多项目。能完成的任务,能解决的问题,绝对了不起。

从理论上理解机器学习概念的直觉和这些数据科学概念背后的数学至关重要。

但是,您还需要知道如何在现实生活的实际场景中实现以下项目。不要害怕接触一些代码,自己实现这些项目。

这方面的一个例子可以是任何机器学习或深度学习概念。让我们考虑一个多层感知器或神经网络反向传播的例子。你可能知道这些概念在数学上和理论上是如何工作的。

太棒了。但同样重要的是实际执行这些,并通过您的执行来实现此类任务的解决方案。这有助于你提高,也有助于你突破面试。

我的建议:即使它只是一个简单的机器学习算法,我也强烈建议不要使用 scikit-learn 库或类似的有用工具来实现更简单的实现。相反,试着发现最好的可能性,然后自己从头开始执行。这有助于提高技能并更好地理解这些概念。

2.不要:犹豫是否寻求帮助

安妮·斯普拉特Unsplash 上拍摄

在数据科学中,陷入长期致力于解决的问题并不罕见。最棒的是,数据科学有一个非常棒的社区,里面有非常乐于助人的人和大量资源供您使用。

堆栈溢出、不和谐频道、YouTube 视频、免费在线代码营、GitHub、走向数据科学等。都是有用的资源,可供我们所有人利用和提高我们的技能。

与他人和专家交流分享想法是学习更多知识的好方法。不能有效地沟通会导致很多问题,比如你可能会对某个特定的话题产生误解。

此外,与人交谈非常有助于分享你的观点,以及获得知识。通过与更多的人交谈,你会产生更好的想法,最重要的是互动,这在与数据科学项目团队合作的公司中非常有用。

我的建议:刚开始的时候,我会犹豫是否要寻求帮助。我认为最好靠自己找到这些问题的所有解决方案。很长一段时间以来,我认为这是最佳实践,但这只是部分正确。有时你可能误解了一个概念,或者没有做好某件事。自己尝试后,如果还是有困惑,问问能帮你解惑的朋友或专家是个不错的做法!

3.Do:不断探索,建立新项目,积极参与!

本·怀特在 Unsplash 上的照片

人工智能和数据科学领域非常广阔。有太多的东西值得好奇和探索。有很多数学功能,机器学习和深度学习的多个方面的深入理论。

实践变得很重要,让自己跟上所有最新的趋势,并处理这个巨大领域中正在进行的技术。随着不断的发展,每个方面都有很大的空间。所以,继续编码,继续致力于实际的实现!

尽量积极参加网站上的比赛。Kaggle 就是这样一个网站,它主办了一些最好的数据科学相关竞赛。不要担心你是第几名。只要你能学到新东西,这没多大关系。

有很多网站可以提高你的编码水平,也可以参加像 HackerRank 这样的比赛,你应该考虑一下。加入社区有助于不断向其他数据科学爱好者学习更多知识。

我的建议:我对这个 Do 的建议类似于我在文章第二个 Do 中的建议。有大量的实际项目和想法可以实施。只要选择一个你喜欢的项目,然后开始着手去做。多做项目是保持学习的最好方法!多找项目,不断升级技能!

3.不要:一旦你解决了一个问题,就不要停止寻找更好的解决方案!

照片由斯科特·格雷厄姆Unsplash 上拍摄

祝贺您完成数据科学项目!

但是嘿!你可以做更多的事情来改进你的项目。数据科学领域的美妙之处在于它为您提供了多种选择。总有比你能尝试并相应实现的更好的东西。

为了让你们更好地理解我在这一点上的意思,请随时重温我的前两篇关于人类情感和手势识别项目的文章。你可以通过下面的链接来完成。

[## 使用深度学习的人类情感和手势检测器:第 1 部分

了解如何从零开始构建具有深度学习的人类情感和手势检测器。

towardsdatascience.com](/human-emotion-and-gesture-detector-using-deep-learning-part-1-d0023008d0eb) [## 使用深度学习的人类情感和手势检测器:第 2 部分

深入探究人类情感和手势识别

towardsdatascience.com](/human-emotion-and-gesture-detector-using-deep-learning-part-2-471724f7a023)

你可以观察我在这些文章的第一部分和第二部分中发布的情感模型。我建立的最好的定制深度学习模型是经过了大量的试错。我对自己能够取得的成绩感到高兴。但是对于同一个问题的第二个模型,经过更多的尝试和概念上的理解,我能够获得更高的准确性和更好的结果。

你在数据科学领域构建的每个模型,完成的每个项目,都有很大的提升空间。考虑备选方案和各种其他方法或改进,以获得更好的结果,这始终是一个好的做法。

我的建议:在最初的日子里,我常常会因为完成一个项目而兴奋不已,以至于我会放松下来,继续下一个任务。这也是一件很好的事情,但是通常有办法将你的项目提高到下一个水平。在迈向下一个目标之前,列出你可以改进的地方。😃

Johannes PlenioUnsplash 上拍摄的照片

结论:

用几句话总结我们在本文中讨论的所有内容,在我看来,最重要的收获是保持专注于数据科学的不断发展,在一致的基础上建立更多的机器学习或深度学习项目,每天都学习新的东西,阅读更多的研究论文,并保持实践。

有时你可能在第一次尝试时没有得到想法或项目,只要你从每次失败中学到新的东西,这完全没问题。遇到困难时,不要犹豫寻求帮助,并不断整合你的技能,以发挥你的最大潜力。

如果你对这篇文章有任何疑问或建议,请随时告诉我,我会尽快给你们答复。

看看我的其他一些文章,你可能会喜欢读!

[## 用代码和例子理解 Python 中的高级函数!

详细了解 python 中的匿名函数和高级函数及其实际应用…

towardsdatascience.com](/understanding-advanced-functions-in-python-with-codes-and-examples-2e68bbb04094) [## 简单有趣的万圣节 Python 项目!

这是一个有趣的“不给糖就捣蛋”的游戏,让你在万圣节愉快地学习 python 编程

towardsdatascience.com](/simple-fun-python-project-for-halloween-ff93bbd072ad) [## 2020 年及以后最受欢迎的 10 种编程语言

讨论当今 10 种最流行的编程语言的范围、优缺点

towardsdatascience.com](/10-most-popular-programming-languages-for-2020-and-beyond-67c512eeea73)

谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!

3 种简单且非侵入性的方法可以立即提升您的 Python 代码性能

原文:https://towardsdatascience.com/3-easy-and-noninvasive-ways-to-instantly-boost-your-python-code-performance-b21cd823f37e?source=collection_archive---------8-----------------------

对于想要更快的代码,但不想钻研低级优化的人来说,这是一个小指南。

Unsplash 上的 chuttersnap 拍摄

我看到的一个常见模式是人们没有充分利用 Python 标准库。虽然这不必要地膨胀了代码,使维护更加困难,但也可能导致低效和缓慢的代码。因此,在本文中,我想解决后一个问题,并向您展示一些能够让您编写更快代码的东西。

在我将要向你展示的非常简单的优化之后,程序可以运行数千倍,而你几乎不用付出任何努力。这就是等待一分钟或等待一整天来完成一个程序的区别。

由于我是数学家,所以我喜欢处理高层次的问题。我不想移动位,从我的代码中获得最后的性能。我钦佩能做到这一点的工程师,我很高兴他们给了我们这么多伟大而高效的程序,但这不是我自己喜欢做的事情。

然而,有时我不得不自己编码一些东西。它发生了。当它出现时,我使用一些非常简单的技巧来加快速度,而不会太深入。

这是我给你的建议。

1.使用集合

集合对很多任务都很有用。从高层次来看,您可以将集合视为不允许重复值的列表。写作

l = [1, 1, 2, 3, 3, 3]
s = set(l)

将留给您集合 s = {1,2,3}。您可以使用并集、交集、补集和对称差将几个集合组合成新的集合。您可以检查一个集合是否包含在另一个集合中。可能性是无限的!

但是我真正想告诉你的是:当你想检查一堆元素是否包含在一个列表中时,使用集合——对不起,集合!

想象一下,我们得到一串小于 50,000 的随机数,我们必须测试它们是否是素数。此外,我们还想检查得出一个素数的概率是多少。所以,让我们先定义 50,000 以内的质数。

def is_prime(n):
    for i in range(2, n):
        if n%i == 0:
            return False
    return True

primes = [n for n in range(2, 50000) if is_prime(n)]

现在,我们可以开始通过蒙特卡洛模拟计算概率。这是通过将我们抽取的素数的个数除以抽取的数的总数来完成的。

n_numbers = 10000
counter = 0

some_numbers_to_test = np.random.randint(0, 50000, n_numbers)

for number in some_numbers_to_test:
    if number in primes:
        counter += 1

probability = counter / n_numbers
print(probability)

这段代码在我的机器上运行了大约 6 秒,但是我们在这里使用的时间非常少,所以此时应该不会发生!我希望是几毫秒,甚至几纳秒。

问题是

你猜对了,问题是primes是一个列表。测试,如果一个元素被包含在一个列表中,平均花费列表长度的线性时间,因为每个元素都必须被一个接一个地检查!这意味着:如果你有一个包含 10,000 个元素的列表,并且搜索一个元素需要 1 秒,那么如果你在包含 1,000,000 个元素的列表中搜索这个元素,将需要 100 秒。

当然,我们可以运气好,我们寻找的元素是在开始,然后搜索很快。但是平均来说,我们可以期望我们的元素在中间的某个地方,在最坏的情况下元素甚至不在列表中,我们查看列表中的所有元素。

解决方案

用套!神奇的是,在内部,集合中的元素得到了散列。简单地说,你可以把它看作每个元素都有一个固定的地址,有点像普通数组。这样,检查一个元素是否在一个集合中归结为散列元素,查看地址,敲门,看看是否有人在那里。这可以在恒定时间内完成(散列通常可以忽略不计)。

比较列表和集合中的搜索时间,在我的机器上得到以下结果:

你可以清楚地看到,列表搜索时间线性增长,而设置的搜索时间保持不变。

所以,让我们用一种非常简单的方式来修改我们的代码:

primes = set(primes) # <- the fix!

n_numbers = 10000
counter = 0

some_numbers_to_test = np.random.randint(0, 50000, n_numbers)

for number in some_numbers_to_test:
    if number in primes:
        counter += 1

probability = counter / n_numbers
print(probability)

现在代码在我的机器上运行的时间是 2 毫秒,这是 3000 倍的巨大进步!

关于概率的注意事项:根据素数定理实际在 1/ln(50000)≈9.24%左右!

如您所见,提升代码非常容易。它只需要添加一点点关键字set

2.隐藏物

有时,尤其是在使用递归函数时,一些函数值会被反复计算。以斐波那契数列为例。

def fibonacci(n):
    if n in [0, 1]: # a list is ok here ;)
        return 1
    else:
        return fibonacci(n-2) + fibonacci(n-1)

在我的机器上,计算第 35 个斐波那契数需要大约 4 秒,这也是相当慢的。我不想去想当我计算第 100 个数的时候会发生什么。但是为什么呢?

问题是

如果你像这样执行它,它是有效的,但是它也是非常低效的,因为许多函数值被反复计算。以fibonacci(4)的执行树为例:

斐波那契(4)调用斐波那契(2)和斐波那契(3),依此类推。我用箭头旁边的小数字表示了执行的顺序。

您可以看到 fibonacci(2)是在两个不同的地方计算的:第 7 次和第 8 次调用是多余的,因为这两次调用与第 2 次和第 3 次调用完全相同。

斐波纳契数越高,问题就越严重。树变得更深,因此会出现越来越多的重复和浪费的重新计算。如果我们计算斐波那契( n ),我们会重新计算 fib(2) n -2 次,比如。我们将重新计算 fib(3) n -3 次,fib(4) n -4 次,以此类推。,简直是灾难。

解决方案

functools导入lru_cache!这是一个装饰器,使您的函数能够存储已经计算过的值,并在需要时重用它们。其他什么都不用做,导入它,修饰你的功能就行了!

from functools import lru_cache

@lru_cache()
def fibonacci(n):
    if n in [0, 1]: # a list is ok here ;)
        return 1
    else:
        return fibonacci(n-2) + fibonacci(n-1)

使用这一改进,执行树看起来更像这样:

最后一次调用只是从缓存中读取 fibonacci(2)的值,而不是再次手动计算。

您还可以看到运行时间的改进。计算第 35 个斐波那契数现在需要 0.05 毫秒,比以前快了 80000 倍

所以,缓存肯定有帮助,尽管你必须记住你的机器上有足够的存储空间。

3.多进程和多线程

当没有其他帮助时,你总是可以像以前一样继续,但是并行或并发地做事情。很多资源告诉你多处理(并行性)和多线程(并发性)的区别是什么。

一个小小的烹饪例子

想象一下,你要炒肉、切菜、烤蛋糕。

卡罗琳·阿特伍德在 Unsplash 上的照片

如果你是一个人,你不知道如何多任务,也许你先切蔬菜,然后完全烤蛋糕。然后,你开始煎肉。当然,这很慢,但这是你的程序通常的运行方式。

相比之下,并行性就是你和几个厨师(处理者)一起完成这个任务。你团队中的一个人炸肉,另一个人切蔬菜,第三个人烤蛋糕,所有这些都在同一时间进行。这已经好多了!

使用多处理(并行性),几个任务并行完成。当您必须处理大量计算繁重的任务,并且 CPU 是瓶颈时,它工作得最好。

并发是指你再次独自一人,但更聪明和/或更有经验。你把蛋糕放进烤箱,把肉扔进锅里,然后切蔬菜,在肉熟之前完成。然后你继续吃肉,最后,你再次处理蛋糕,因为它需要最多的时间。并发就是当你不得不等待一个进程完成时,不要无所事事。

使用多线程(并发),总是同时完成一个任务,但是如果有等待时间,任务就会被切换。当您经常不得不等待其他进程完成,并且 I/O 是瓶颈时,它工作得最好。

我给你做了一个小图来说明不同之处:

在顺序方法中,每项任务都是一个接一个地完成的。在并行方法中,情况是一样的,但是有更多的处理器在处理它。在并发方法中,任务在各处被启动、暂停、恢复,以减少等待时间。这也可以由单个 CPU 来完成。

如果你不确定是使用多处理还是多线程,就两者都试试。Python 中的代码几乎相同,看看这个。这就像把单词 ThreadPoolExecutor 换成 ProcessPoolExecutor 一样简单,反之亦然。

之所以会发生这种情况,是因为 CPU 受限任务和 I/O 受限任务之间的区别并不总是很明显。以图像处理为例。假设您的磁盘上有许多较大的图片,您想对它们进行一些变换。

很难事先判断加载图片是整个过程的瓶颈,还是转换本身。

现在,让我们来看一个具体的例子。想象一下,你想获取一些网站的 HTML 代码,因为你想从中解析一些东西。您的代码可能如下所示:

import requests

urls = ['https://google.com', 'https://yahoo.com', 'https://bing.com', 'https://amazon.com']
get_url = lambda url: requests.get(url).content

for url in urls:
    get_url(url)

对我来说,这大约需要 3.5 秒。同样,这可以更有效地完成!

问题是

你是一个不会一心二用的厨师!你请求一个网站,等到你得到它,然后去下一个。同时,你就等着吧。

以下是修复方法。

解决方案

你可以从concurrent.futures包中导入 Python 的ThreadPoolExecutor。然后,您可以使用map方法将get_url函数应用于所有 URL。结果被收集在迭代器T4 中。

import requests
from concurrent.futures import ThreadPoolExecutor

urls = ['https://google.com', 'https://yahoo.com', 'https://bing.com', 'https://amazon.com']
get_url = lambda url: requests.get(url).content

with ThreadPoolExecutor(max_workers=4) as executor:
    result = executor.map(get_url, urls)

通过这种方式,你可以向所有网站发送请求,并在收到回复时收集回复。对我来说,现在只需要 1.6 秒,大约是以前的两倍。

好处:使用更智能的算法

通常你可以通过这些简单且非侵入性的方法来调整你的算法的性能。不过,有时候还是想出一个更好的算法比较好。

检查一个数是否是质数有比将它除以所有可能的约数更好的方法(尽管这在第一个例子中不是问题)。有更好的方法来计算斐波纳契数列,因为有一个封闭公式可用于此!

睁大眼睛寻找更智能的算法。你不一定要自己想出来,但你至少应该搜索它们,看看它们是否真的能提高你的表现!或许你在实践中也永远不会使用冒泡排序(我希望如此),而是依赖快速排序或者其他更好的排序算法,如果你碰巧必须自己编写一个排序方法的话。

结论

我们已经看到了一些简单的方法来改善你的问题的性能,几乎是免费的。这些方法都是高级的,每个懂一点 Python 的人都可以实现。我们学到了以下内容:

  1. 使用集合:或者更一般的,使用正确的数据结构。有些结构非常适合写东西,有些数据结构非常适合读取条目(集合!).
  2. 缓存:不要反复计算东西。如果你有存储空间(通常都有),那就好好利用它。
  3. 多进程和多线程:通常你需要计算一个不同输入的函数。并行或者并发就行,别让你的 CPU 休息!
  4. 使用更好的算法:这种算法可能很难实现,但要经常考虑。要么自己想一个更好的算法,要么尝试在网上搜索一个适合你问题的算法。

如果你把这些建议付诸实践,你可以更快地完成工作,并且有更多的时间处理新的令人兴奋的问题!

我希望你今天学到了新的、有趣的、有用的东西。感谢阅读!

作为最后一点,如果你

  1. 想支持我多写点机器学习和
  2. 无论如何,计划获得一个中等订阅,

为什么不做 通过这个环节 ?这将对我帮助很大!😊

透明地说,给你的价格不变,但大约一半的订阅费直接归我。

非常感谢,如果你考虑支持我!

如有问题,在LinkedIn上写我!

初学者改进 R 中 plotly 图表的 3 个简单技巧

原文:https://towardsdatascience.com/3-easy-tricks-for-beginners-to-improve-your-plotly-charts-in-r-86d65772a701?source=collection_archive---------28-----------------------

简单的改进和定制让您的图表脱颖而出

卢克·切瑟在 Unsplash 上的照片

我们都经历过数据科学项目的尾声:我们清理了所有数据,探索了数据,获得了有价值的见解,并通过网络工具将结果提供给企业。我们甚至已经用 plotly 制作了令人敬畏的交互式可视化!

唯一的问题是,这些图表的现成格式很一般。同事对分析洞察力印象深刻,但你会听到他们说“我希望图表更好,这样我们就可以展示给客户看了!”或者“为什么光标看起来这么奇怪?”您还在想如何为未来的项目改进图表。

如果这就是你(或者如果你想更多地定制你的图表),这里有 3 个简单的技巧来改进你的 R 绘图图表(这些技巧也很容易移植到其他语言,如 Python)。

在我们开始之前,我们需要一个可以改进的样本图表。下面是一个简单的条形图,显示了三种不同产品在一年中的销售情况。

条形图示例(图片由作者提供)

技巧 1:删除/定制模式栏

模式栏 是位于右上角的小菜单,鼠标悬停在图表上时会显示出来。

标准模式栏(图片由作者提供)

如果您不想让它出现,或者您只是不想向用户提供某些功能,可以很容易地禁用该功能。

fig %>% config(displayModeBar = FALSE)

或者,用户也可以自定义模式栏,只显示某些选项,例如下载绘图为图像按钮。

fig %>% config(modeBarButtons = list(list("toImage")), displaylogo = FALSE, toImageButtonOptions = list(filename = "plotOutput.png"))

欲了解更多定制可能性,请点击此处查看 plotly-r 文档。

技巧 2:定制光标

悬停在绘图图表上时显示的标准光标是十字准线。有些人可能喜欢这样,但我个人更喜欢默认的箭头光标。

要实现这一点,最简单的方法是使用 htmlwidgets 包中的 onRender 函数和一点 JavaScript。

fig %>% onRender("function(el, x) {Plotly.d3.select('.cursor-crosshair').style('cursor', 'default')}")

技巧 3:自定义悬停信息

正如我们在基本条形图中看到的,显示的标准悬停信息是 (x 值,y 值),旁边是系列名称(在我们的案例中是笔记本电脑或电视)。要添加更多的信息和格式,我们可以创建一个单独的变量并将其添加到悬停中,例如,如果我们想显示每月总销售额的百分比,我们可以创建一个包含百分比值的新列,并在 plot_ly 函数调用中使用该列作为文本参数。

#add percentages to our data
data <- data %>%
  group_by(variable) %>%
  mutate(pct = value / sum(value), pct = scales::percent(pct))#updated plot_ly function call
plot_ly(x = ~dates, y = ~value, type = 'bar', text = ~pct, name = ~variable, color = ~variable)

带首次悬停定制的条形图(图片由作者提供)

如果我们想更进一步,显示一些自定义文本,就没有必要向数据中添加另一列,它的唯一用途是显示一些文本。我们可以用 plot_ly 的 hovertemplate 参数来代替!

通过使用%{var}语法可以访问数据集的各个部分,例如 x 和 y 值、文本参数甚至数据集本身(通过使用 fullData.var,请参见附加部分)。

#updated plot_ly function call
plot_ly(data, x = ~dates, y = ~value, type = 'bar', name = ~variable, color = ~variable, text = ~pct, hovertemplate = "Units sold: %{y} <br> Percentage: %{text}")

具有高级悬停自定义功能的条形图(图片由作者提供)

奖金:

虽然这个 hoverinfo 看起来已经好多了,但是如果将“售出的数量”替换为“售出的电视”,而不是在盒子外面显示系列名称,不是更好吗?轻松点。使用${fullData.name}访问系列名称,并将其添加到 hovertemplate。要删除框旁边多余的文本,添加空的 html 标签,不要忘记关闭它!

#updated plot_ly function call
plot_ly(data, x = ~dates, y = ~value, type = 'bar', name = ~variable, color = ~variable, text = ~pct, hovertemplate = "%{fullData.name} sold: %{y}<br>Percentage: %{text} <extra></extra>")

带有完整悬停定制的条形图(图片由作者提供)

结论

在这篇文章中,我展示了 3 个快速简单的技巧,您可以在开始使用 plotly in R 时立即使用。这些方法允许您增强和定制图表的某些方面,并使您和您的用户能够从数据中获得更多的洞察力。所有这一切只需几行简单的代码,没有任何复杂的格式!

posted @ 2024-10-14 11:50  绝不原创的飞龙  阅读(270)  评论(0)    收藏  举报