TowardsDataScience-博客中文翻译-2020-五十九-

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何使用 Picterra 的地理空间*台分析卫星图像

原文:https://towardsdatascience.com/how-i-won-sentinel-hub-covid-19-custom-script-hackathon-be882ed05186?source=collection_archive---------55-----------------------

..赢得 Sentinel-Hub 定制剧本比赛!

从 2020 年 4 月到 5 月,Sentinel-Hub 组织了第三届定制剧本比赛。这场比赛是与哥白*欧盟地球观测计划欧洲航天局AI4EO 联盟合作举办的。

[## 在 LinkedIn 上发布的 Picterra

我们很高兴地宣布新冠肺炎自定义脚本竞赛的两位获奖者之一,Aakash Gupta,他使用了…

www.linkedin.com](https://www.linkedin.com/feed/update/urn:li:activity:6676830513002491904/)

比赛动机:

寻找新的、创新的脚本,使用户能够理解地球观测数据。它旨在为新的“正常的”中的巨大挑战寻找解决方案

我们提交的目的是什么:

新冠肺炎已经导致许多国家政府实施紧急隔离措施。这些政策对环境有什么影响?我们能测量污染水*的变化吗?与经济活动有关联吗?我们能否建立领先指标来衡量全球范围内的经济活动。通过我们的项目,我们试图分析卫星图像来找出答案。

印度马赛克显示二氧化氮水*的变化。来源:修改后的哨兵中心 EO 浏览器图像

使用的工具:

工具造就人,或者他们是这么说的!

我总是告诉我的团队首先从研究可用的工具开始。因为合适的工具可以成就或毁掉一个项目!

该项目可用的工具有:

  1. 哨兵枢纽 EO 浏览器
  2. Sentinel-Hub API 访问
  3. Picterra 的 AI *台
  4. 欧洲数据立方体

我们首先使用 Sentinel-5P 数据来绘制 NO2 水*。这样做是为了识别数据中的任何异常(突然变化)。然后与 VHR 图像(非常高分辨率的图像)合作

该数据的统计分析用于显示德国(严格实施封锁)等国家与意大利等国家之间的显著差异。

德国和意大利的 NO2 水*图(注意缺失值的存在)来源:Sentinel-5P 处理的数据

我已经在 euroData Cube 的投稿页面上传了用于绘制上述图的笔记本。您可以通过下面的链接查看:

https://eurodatacube . com/market place/notebooks/contributions/NO2 _ Analysis _ covid 19 _ lock downs . ipynb

二氧化氮是由车辆交通和化学过程中未燃烧的残留物产生的。这可以通过从高分辨率卫星图像中计数汽车来实现。

我们现在将使用 Picterra 的机器学习*台来识别 VHR 图像中的车辆。

* [## Picterra -地理空间图像分析变得简单

训练你自己的人工智能来探测卫星和航空图像上的物体和图案。分析并分享可行的…

picterra.ch](https://picterra.ch/)

我们需要首先登录 Picterra 的地理空间图像*台。他们有一个免费的试用版,你可以不用提供任何信用卡就可以使用()。)

一旦进入主页,你就可以创建一个新项目

现在您可以从本地驱动器 上传图片 (其他选项有 在线地图影像购买卫星图片 )。一旦上传,你就可以用它来训练探测器。

一旦图片上传,我们就进入培训部分。在这里,我们可以使用这个*台来训练一个探测器。然而,你可以使用预先构建的检测器。但是对于这个演示,我们将训练一个新的

训练模式!

可用的预训练模型

点击 培养一个新的探测器

有一些定制的基础模型。我们选择了 车辆 选项

我们要检测 汽车

有两种可用检测类型:I)计数和 ii)分割

我们选择默认的 计数选项。 然后按下 创建 按钮

然后将添加到项目中。并按下 开始训练 按钮

当你第一次这样做时,Picterra 会给你一个很好的视频教程,带你完成训练过程。

界面非常直观,一旦你理解了控件,导航就变得容易了。

首先选择左边的 训练 按钮。之后,您可以选择感兴趣的区域,如黄色方块所示。点击选中的 AOI,会放大图像

现在点击 多边形 按钮并选择 圆形 选项

现在,您可以点击感兴趣区域内的每辆停放的汽车,并在顶部画一个圆圈。这就是你的带注释的训练数据集。你可以选择多边形选项,在汽车轮廓上画一个方框,但是我太懒了!

现在选择左侧菜单中的 测试 按钮,点击并标记图像上的测试区域。您可以注释测试数据集。但是这里我将跳过这一步— 只是为了检查发生了什么!

现在点击仪表板顶部的 列车探测器 按钮。

现在你可以去喝杯咖啡了。我更喜欢我的玛莎拉茶!

来源:*基媒体(开源许可)https://en . Wikipedia . org/wiki/Masala _ Chai #/media/File:Masala _ Chai。JPG

或/和

可以查看提供的教育资源。一定要查一下 Picterra 大学。在地理空间图像的端到端机器学习方面,它有一些很好的资源。

既然现在训练结束了,我们去检查一下探测器的性能吧。

测试输出

表演很好…但不是很棒!在右下角,它把仓库的屋顶误认为是一辆汽车。

对于探测器来说,重要的是要知道什么不应该被认为是物体。用机器学习的术语来说——误报应该很低。

因此,我们将为我们的训练集注释更多的车辆。我们在先前的训练集附*选择了一个更大的区域。

训练后,我得到一个警告:似乎我在训练集中有一些重叠的注释。这是真的。这可能会在运行推理作业时导致合并,并给出不正确的计数。

所以让我们纠正一下-

使用左侧的选择按钮选择任何注释并修改标记(绿色圆圈)。

修改训练数据以避免合并注释

重新训练检测器,我们得到以下输出。

重新培训后的测试区域

似乎不错。我们已经错过了左侧的一辆大型白色车辆,但现在车顶的错误分类也不见了。它把车开到最左边的角落。

可以用更多的数据来训练检测器。现在让我们在整个图像上运行检测器,以查看评估性能。我们还将在新图像上对其进行评估。

增加了新的未见过的图像和训练过的探测器

按下图像前的 运行探测器 按钮。一个提示会通知您运行数据所需的处理配额数量。由于我们是在一个自由配额上运行,我们按 开始检测。

提示输入检测器的处理配额

查看结果显示了检测器的输出

来自看不见的图像的检测器输出

我们还可以使用这个强大的*台,进行其他物体探测活动,如太阳能电池阵列、船只、垃圾、军用车辆等。!

请查看 Picterra 的博客,了解他们最*的成功案例:

关于图像授权厂商的说明:

除非另有说明,否则作者拥有图像的许可。

Indian mosiac (NO2 水*)由作者使用 Sentinel-Hub *台创建

德国&意大利 No2 水*的时间序列图由作者使用上述规定的代码创建

截图来自 Picterra 的地理空间*台

我是如何赢得桑坦德数据大师赛的

原文:https://towardsdatascience.com/how-i-won-the-santander-data-master-competition-3-central-soft-skills-i-used-and-the-hard-skills-7f989012e0e2?source=collection_archive---------36-----------------------

桑坦德银行部门—来源:https://upload . wikimedia . org/Wikipedia/commons/f/F8/M % C3 % B6 nchengladbach _ Santander Bank _ 1 . jpg(免费使用)

3 我用过的中枢软技能和我学过的硬技能。

重要的事情先来

桑坦德银行在由*发布了 2020 年版的数据硕士项目。使它成为一个优秀计划的想法和概念是将竞争和学习结合在一起,以帮助所有类型的数据科学学生或专业人员自我提高,成为更好的专业人员。

稍后我会告诉你更多关于这个神奇的程序。首先,让我展示一下我在这个旅程开始时的位置,这样你就有了一个基线。

我是一名有数学建模背景的化学工程师。在疫情隔离之前,我是一个*庸的程序员。虽然我在学习化学工程的几年中学到了很多统计和概率,但是随着时间的推移,我的知识一点也不可靠了!那就是我。基本上,就像几乎所有数据科学爱好者一样,我有一个有用的背景,但我的技能组合中也有一些需要改进的地方。

桑坦德数据大师横幅—来源:https://www . becas-Santander . com/pt/program/Santander Data Masters-scienciadedados 2020(免费使用)

银行和项目

桑坦德集团是一家全球性银行集团,由欧元区最大的银行桑坦德银行领导。它起源于西班牙坎塔布里亚的桑坦德。数据主计划是作为他们授权文化的一部分而创建的。

桑坦德数据硕士——数据科学之路是由桑坦德大学(Academia Santander)提供的一项学习和认证计划。该计划由培训和比赛组成,桑坦德大学提供内容并挑选最佳参与者。

竞争

该计划有 3 个评估阶段,分别是:

  • 第一阶段:候选人必须参加文化契合度、常识和逻辑推理评估。在这一阶段,大约有 3200 名候选人,只有 100 人被选中。
  • 第二阶段:候选人有 33 天的时间学习桑坦德学院选择的所有材料。最后,有一个技术评估,需要超过 50%的性能才能获得认证。
  • 第 3 阶段:前 3 名参与者将有机会开发桑坦德银行提供的项目,并参加桑坦德银行员工的指导会议。

所以你可以想象,从一开始每个人都想赢,以便获得指导和在现实世界项目中工作的机会。我也是!

学习和硬技能

这部分是这个节目的特别之处。数据大师不仅仅是保持旧的竞赛形式,即设置一个问题,每个人都试图拿出一个过度拟合的解决方案,而是关注你能在多大程度上学习最重要的硬技能,以成为一名非常优秀的数据科学家!

在选出 100 名参与者后,他们提供了一份结构化的学习材料,涵盖了数据科学家应该具备的最重要的知识和技能。所有参与者都有 40 天的时间来尽可能多地学习以下硬技能 :

  • 概率与统计:从基础到高级概念;
  • SQL 和 NoSQL;
  • 大数据概念和应用;
  • 编程;
  • 回归:线性、多重、脊和套索、变量选择
  • 分类:逻辑回归、决策树、随机森林和朴素贝叶斯;
  • 聚类:K-means,层次聚类(分裂的和凝聚的),潜在的狄利克雷分配;
  • 绩效指标。

取胜的 3 个关键软技能

正如你所想,要战胜 3200 名竞争对手并赢得这场比赛,需要一些创新。这正是我想和想分享的!所以我们走吧。

1.协同作用

史蒂夫·乔布斯称之为“将点点滴滴连接起来”。

在这个项目期间,我还参加了 Udacity 的另外两个奖学金竞赛——AWS 机器学习微软 Azure 的机器学习奖学金项目。你可以想象,每场比赛(桑坦德、AWS 和 Azure)都有成千上万的东西要学。我最好的机会是以最协同的方式将这些点连接起来,这样我就可以在每场比赛中取得优异的表现。这就是这种软技能如此强大的原因:

  • 同时学习或做相关的事情,使得业绩空前暴涨。在我的情况下,我从每门课程中同时学到了关于算法的一切,并且我可以正确回答所有问题。
  • 你学习能力将会提高和加快!当我一遍又一遍地看到相关的东西时,这种重复过程确保了所有的信息都会从短期记忆进入长期记忆。
  • 你开始跳出框框思考。通过从不同角度面对同一主题,我们开始看到新的应用和使用我们所学或所做的方法。

我坐下来,想出了一个在同一时间学习所有高度相关的科目的方法——垃圾邮件。这大大加快了我的学习速度,我可以涵盖所有的科目,并适当地学习它们。效果非常好,是最重要的软技能让我在 3200 个竞争对手中名列前茅。

2.时间管理

因为我有 40 天的时间来报道所有这些话题,同时还有另外两场比赛在进行,所以时间管理非常重要。我是这样做的:

  • 把问题分解成*部分,这样我们就能更精确地知道完成每项任务需要多长时间。
  • 向他人展示你的计划并向他们解释你为什么要这样安排事情。我和我的女朋友和一个朋友一起做的。为了获得有价值的见解,我收到的反馈非常重要。
  • 迭代以上各点。

3.沟通

我们常常认为交流只是做一些演示或分享结果,但我们可以利用它来更好地学习或解决问题。

当我在某个时候陷入困境或没有找到解决我面临的问题的方法时,我试图写下来并向我的朋友解释或在论坛上讨论。它之所以有帮助,主要是因为我需要先传达一些东西,让我的头脑变得有条理。事情是这样的,当我准备一个问题要问的时候,我经常能找到答案,只是因为我需要以一种有序的方式组织一切。

奖品

应用和提高我的协同作用、时间管理和沟通技能,以及学习如此多的数据科学家角色的关键硬技能,已经是一个巨大的回报!除此之外,我还获得了两个惊人的奖品!

第一个是解决一个由三部分组成的问题,任务是通过构建工具来了解每个客户的满意度,从而使利润最大化。在这个项目中,我学习并实践了分类、聚类、净推介值(NPS)、特征选择和贝叶斯优化等概念。访问我的GitHub了解更多关于这个项目的信息,并查看我为解决这个案例而开发的所有代码!

其次,在解决这个问题后,我与桑坦德银行巴西分行的数据科学和大数据经理费利佩·西莫斯和桑坦德银行巴西分行的高级数据科学家卡伊奥·马丁斯进行了约两个*时的交谈。师徒关系简直太棒了,非常有趣!我得到了关于这个项目的反馈,对我的职业和学习道路的重要见解,以及对我职业生涯下一步的建议。这里有一些我们一起讨论数据科学的美好时光的照片!

菲利普(左)和卡伊奥(右)的导师。

我的最后一句话是:如果你有机会参加这种类型和形式的比赛,100%争取!好处是惊人的,你也将提高你的软硬技能!哦,别忘了一路上玩得开心点!

感谢阅读,

—佩德罗

我如何在深度学习竞赛中赢得前五名

原文:https://towardsdatascience.com/how-i-won-top-five-in-a-deep-learning-competition-753c788cade1?source=collection_archive---------29-----------------------

PyTorch 中如何有效使用 CNN 的迁移学习(带 GitHub repo)

本文中的所有代码都在我的 GitHub 库中。数据集已经在适当的文件夹中,代码准备运行(在安装 PyTorch 之后)。

[## bck 1990/从产品图像中识别字符

这是为 CrowdANALYTIX 提交的竞赛(获得第四名)…

github.com](https://github.com/bck1990/Identify-Characters-from-Product-Images)

去年,我参加了由 CrowdANALYTIX 组织的深度学习竞赛,获得了第四名。我通过使用 PyTorch 中的迁移学习做到了这一点。虽然许多读者可能已经熟悉这种技术,但我将分享更多我认为对模型成功至关重要的。老实说,我不是深度学习方面的专家,我只是依靠大量的试错法(和直觉)。

排行榜(在竞赛页面的“排行榜”标签下)

有关挑战赛和 CrowdANALYTIX 的具体细节和规则,请访问下面的链接。

CrowdANALYTIX 社区:数据专家在这里合作和竞争,以构建和优化人工智能、ML、NLP 和深度学习算法

* [## 从产品图像中识别角色

从 42 个可能值的列表中识别产品图像中的字符

www.crowdanalytix.com](https://www.crowdanalytix.com/contests/identify-characters-from-product-images)

挑战—从产品图像中识别角色

来自 CrowdANALYTIX 的数据集由产品的图像组成,如 t 恤、包、钥匙链、手机套等。与相关的 42 个不同的人物。这些角色范围很广——从卡通人物愤怒的*鸟皮卡丘到动漫人物火影忍者卡卡西甚至电影人物达斯·*德哈利·波特。还有约翰·塞纳(lol)。任务是根据这些特征对图像进行分类。

训练集由 6694 幅图像组成,这些图像按照上面的文件夹中所示的类别进行分类

训练和测试数据集之间的数据分布如下:

  • 训练:42 个类别的 6694 张图片(点击获取
  • 测试:3727 张图片(此处获取

下面给出了训练集中的一些例子(愤怒的*鸟、*火龙、达斯·*达和*黄人)。

愤怒的*鸟

查尔曼德

达斯·瓦德斯

奴才

等等什么?

这项任务并不简单,设计师们已经采取了许多创造性的方法将这些角色融入到产品中。你,一个人类,能识别左边裤子上印的字符吗?

计划概述

  • 采用 PyTorch 框架
  • 深思熟虑的数据扩充
  • 应用预训练卷积神经网络进行迁移学习
  • 模型拟合是在 Google Colab 和我的电脑上完成的(带 GPU)
  • 抓取更多的训练图像,并删除不相关的图像

进口

这些是我用过的库。采用 PyTorch 框架是因为我最熟悉它用于深度学习,我觉得它比 Keras 更灵活,特别是当我通过试错法调整很多参数时。

下面给出了更多关于如何安装 PyTorch 的信息。

[## PyTorch

选择您的首选项并运行安装命令。稳定代表了当前测试和支持最多的版本…

pytorch.org](https://pytorch.org/get-started/locally/)

文件夹结构

随意浏览我的 GitHub 库来看看文件夹结构。你需要训练测试有效 (ation)文件夹。在每一个文件夹中,您必须使用图像的标签作为文件夹名称对图像进行进一步分类(如之前的截图所示),PyTorch 会自动分配它们的标签。我编写了一个简单的程序,从每个类别中随机选取大约 20%的图像,并将它们传输到验证文件夹中。

注意:测试文件夹中的图像当然没有标注。但是 PyTorch 需要将测试文件夹中的 图像进一步放入另一个文件夹 。否则,PyTorch 会说它在测试文件夹中找不到文件夹。我通过在测试文件夹中创建一个“test2”文件夹来解决这个问题,并将我所有的测试图像都放在那里。

我电脑上的文件夹结构

不要担心“扩展”文件夹名称。我将在最后详述这一点。

(至关重要)在数据扩充中需要考虑什么

数据扩充与其说是一门科学,不如说是一门艺术。 做错了就伤了精准度。 在训练过程中,我们随机裁剪、改变颜色、亮度、对比度、旋转或翻转图像,以便每次通过数据集时,神经网络都能看到同一图像的不同变化。因此,这些变化增加了并为数据集“添加了更多”。这有助于允许模型推广到图像的不同变化。重要的是,没有一种适合所有人的数据扩充方法。

关键点:有些人可能认为我们包含的数据增强类型越多,模型就越好。 这不是真的,因语境而异。

因此,通过仔细查看数据集(可在 CrowdANALYTIX 和我的 GitHub repo 上获得)来确定哪些方面需要增强以及哪些方面不需要增强至关重要。

顺化(越南城市)

在这种情况下,生成不同色调的随机图像以增加训练数据会对准确性产生负面影响,这一点已得到证实。这并不令人惊讶,也证实了颜色是一个重要的特征(例如,没有蓝色迷人者等。)所以这种扩增方法失败了。

水*翻转

随机水*翻转图像以增加训练数据也负面地影响了准确性。这大概是因为像“口袋妖怪”、“韩 Solo”等。在火车上,图像本身在不应该翻转的时候翻转了。

随机旋转

这种增加的方法同样负面地影响了精确度,无论旋转多少度都是如此。查看训练集和测试集,我们可以看到几乎所有的图像都是垂直的。因此,没有必要旋转列车图像,甚至会降低精度。

皮卡丘永远是黄色的(请不要随意的色调)。图像(即使在测试集中)大多是垂直的(请不要随意旋转)。图片上的文字很重要(请不要水*翻转)。

随机作物

这种增强方法也是不理想的,因为图像中的主要特征在预处理期间可能不会被裁剪(例如,在许多图像(如 t 恤)中,我们可能会裁剪随机的部分,如袖子和衣领,,它们不包括角色本身,从而使该训练图像无用)。

饱和度和对比度

这很难通过观察图像来直观地判断,但是这种增强的方法并没有提高精确度。

聪明

如图片所示,产品是在不同的光照条件下拍摄的,具有不同的亮度(虽然颜色相同,但一些图片明显比其他图片暗)。随机生成不同亮度(上限为 0.05)的图像允许该模型推广到不同的照明条件,并将最佳模型的准确性提高到 92%以上。

**

**丨*丨*在 3 个原始火车图像上的不同亮度阴影。我们希望模型能推广到不同的亮度。**

与扩充列车数据相关的最后一部分代码如下所示,它利用了 PyTorch 中的转换包。我们意识到只需要增加亮度!我希望这能为您未来的数据扩充方法提供有用的指导。

transforms.ColorJitter(brightness=.05, saturation=0, contrast=0)

如果你不确定上面要增加什么,就去做 试错

应用转换和加载数据集

除了增强之外,必须对所有图像应用固定(非随机)变换,因为 PyTorch 中的预训练模型期望图像尺寸为 3 x 224 x 224 (3 是 RGB 像素,224 是宽度和高度)。我们应用调整大*和中心裁剪来达到这个标准尺寸。

转换的完整代码附后。注意,我们没有增加(对其应用随机亮度变换)验证数据集。这是为了确保在验证我们的模型时使用完全相同的图像的公*性。****

从我们的文件夹中加载训练和验证数据集的代码(如下)几乎完全是从文档中提取的,不要太担心。加载数据集后,程序会进行一些计算,以批量对训练和验证数据集进行采样。使用 50 的普通批量。

卷积神经网络

CNN 是深度学习网络,在图像识别任务中非常成功。如果你不熟悉 CNN,下面给你一个很好的介绍。

**** [## 理解卷积神经网络的初学者指南

卷积神经网络。听起来像是生物学和数学的奇怪结合,还有点 CS 的成分,但是…

adeshpande3.github.io](https://adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks/)

卷积神经网络的结构(图片来自文章上方的

卷积层

总而言之,卷积神经网络由卷积层组成(参见上文),图像首先通过这些卷积层。在经过训练的 CNN 模型中,前几层将提取图像的更多低级特征,如边缘和笔画。接下来的几层接着选择更高层次的特征,例如圆形或笔画组合。随着我们的进一步发展,最后几个卷积层将获得甚至更高层次的特征,例如狗头。最后几层中的这些特征变得越来越特定于网络试图分类的内容。在卷积层的中间是用于缩减数据采样的池层或用于减少过拟合的丢弃层,以及您可以在上面的文章中了解更多信息的其他层。

完全连接的层

卷积层的输出将通过完全连接的层(有时只是一层)的最终网络,该网络将其映射到与我们想要分类的图像的期望类别相对应的精确数量的输出。由于这个原因,这个网络也被称为分类器。例如,如果最后一个卷积层的输出是 2048,我们希望训练网络来区分狗、猫和仓鼠,则来自卷积层的全连接层的输入将是 2048,输出将是 3(对应于提到的 3 种动物)。

训练 CNN 权重

经过训练的 CNN 可以通过调整每一层的权重来提取特征并对图像进行分类。这些权重只是负责在每层中执行计算的数字。每次一批图像通过模型,模型的预测和图像的实际类别之间的误差由 损失函数 计算。然后权重被更新(通过模型的 反向传播 )以最*化损失函数,因此模型在分类图像时变得更准确——因为它在下一次图像通过它时使用这些新的权重进行计算。

(至关重要)迁移学习和选择模型

我的迁移学习方法包括应用卷积神经网络(CNN),其权重已经在 ImageNet 上的 数百万张图片上进行了预训练。这个想法是,虽然我只有 6000 多张图片来训练,但我可以利用一个 CNN 模型,它已经从数百万张图片中学习了,然后对它进行一些修改以适应我的数据。你可以在下面阅读更多关于迁移学习的内容。

[## 迁移学习——机器学习的下一个前沿

深度学习模型擅长从大量有标签的例子中学习,但通常不会推广到…

ruder.io](https://ruder.io/transfer-learning/)

来自 PyTorch 网站的 CNN 模型列表及其在 ImageNet 数据集上的表现可在此处获得

首先对每个模型进行初步测试。经过一些试错,不出所料 'resnext101_32x8d' 表现最好,在 ImageNet 上的错误最低(在其他问题中应用深度学习时可能不总是这样,因此需要试错)。ResNeXt 是由加州大学圣地亚哥分校和脸书人工智能研究所(FAIR)开发的一个模型,构建于 ResNet 之上。我不会深入这个网络的架构细节,你可以在 ResNet 这里和 ResNeXt 这里阅读更多内容。

按照惯例,图像经过的模型的前几个层也被称为底部层,而最后几个层是顶部层。

冻结和解冻图层

回想一下,模型的底层获得了更多的一般和低级特征,这些特征不是针对我们的具体任务的,而是针对所有图像识别任务的。因此,诀窍是冻结(而不是训练权重)这些底层,同时在我们的角色数据集上训练网络。这是因为 ImageNet 中的数百万幅图像已经很好地训练了这些底层,足以拾取像笔画和边缘这样的东西。

同时,我们希望解冻顶层,这样它们的权重可以用我们自己的数据集来训练。随着顶层获得特定于任务的高级功能,我们希望这些层适应我们特定的任务。例如,不是让这些特征拾取飞机的尾部,而是让它拾取皮卡丘的头部或燃烧的东西🔥*火龙的尾巴。这些与我们当前的任务更相关。

许多关于迁移学习的教程会告诉你只解冻完全连接的层。这可能是因为训练一些卷积层(更新其权重)的计算量要大得多。然而,精度可以通过训练一些卷积层来进一步提高,所以请注意!

让我们看看代码。

首先,我们选择模型并将设置为真。如果设置为 False,模型将使用随机(未经训练的)权重进行初始化。如果这是你第一次选择模型,PyTorch 会自动下载。

“model”命令打印出模型的完整架构,这个命令太长了,无法在这里显示。你可以在我的 GitHub 库的这个 pdf 文件中查看。

除了…你猜对了…试错法之外,没有办法知道有多少顶层应该被冻结。

我已经通过requires_grad 参数设置为 False 冻结了下面代码中的层组(从 conv1 到 layer2),因为我们在训练时不需要在反向传播期间使用梯度来更新它们的权重。

在 model.layer3 中,我冻结了第 1 层到第 18 层,如下图所示。澄清一下, model.layer3 实际上是一组名为‘layer 3’的图层。这只是 PyTorch 表示这些 ResNeXt 层的方式。通过反复试验,冻结这些层可以获得最佳的模型精度。

model.layer3 中的剩余层以及所有其他剩余层(包括完全连接的层)未被冻结,因此被训练。如果你不确定我的意思,看看 PyTorch 中 ResNeXt 101 的完整架构在我的 GitHub 库中的这个 pdf 文件中,图层中高亮显示的图层就是训练过的图层。

更换全连接层

滚动到模型的最后几层,我们看到以下内容:

(2): Bottleneck(
      (conv1): Conv2d(2048, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv2): Conv2d(2048, 2048, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)
      (bn2): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv3): Conv2d(2048, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
    )
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (fc): Linear(in_features=2048, out_features=1000, bias=True)

注意最后一行,它显示了前面提到的全连接(fc)层。回想一下,它将卷积层的输出映射到模型试图分类的图像类别的数量。输入 (in_features)是 2048,因此,我们可以将它上面的卷积/池层的输出解释为 2048。这个 fc 层的输出(out_features)是 1000,对应于 ImageNet 数据集中的 1000 个类。

下面的代码将层的输出修改为 42,对应于我们拥有的 42 个不同的字符。

简单有时最有效。

此外,在尝试了几个带有 dropoutReLU 的奇特层之后,我发现我只需要一个全连接层就能获得最佳效果。

耗时?Google Colab 拯救世界

这无疑是最耗时的过程。我用越来越多的解冻层来训练每个模型,看看精度如何变化。 有时解冻一些图层后精度下降,但当我再次解冻时精度又上升,有时会出现相反的情况 。我承认我无法建立任何直觉来解释为什么会这样(如果你知道,请在评论中启发我!).我在这部分花了几个星期。

在试错过程中,同时运行几个谷歌实验室会议。

然而,通过同时在几个 Google Colab 笔记本上运行我的代码,这个过程还是被加速了。Colab笔记本在谷歌的云服务器上执行代码,意味着你可以利用谷歌硬件的能力,包括 GPU 和 TPU,而不管你机器的能力如何。即使我有一台配备了 GPU 的电脑,我也需要几次 Google Colab 会话来同时测试多个模型。注意不要超过内存限制,因为每个会话都会占用一些内存。**

** [## 谷歌联合实验室

Google Colab 笔记本示例

colab.research.google.com](https://colab.research.google.com/notebooks/welcome.ipynb)

定义优化器

优化器是用于更新神经网络的权重的算法,以便最*化损失函数并增加模型的准确性。选择了【亚当】优化器 而不是其他流行的算法,随机梯度下降(SGD) ,因为 SGD 的训练速度太慢,精度没有任何显著提高。一个好的 学习速率(LR) ,又名步长是通过试错选择的。步长太大可能导致算法错过最*值点并“跨越”它,而步长太*可能导致算法花费很长时间来训练或陷入局部最*值而不是达到真正的全局最*值。点击阅读更多。LR 为 0.00005 被证明是一个很好的开始速率。

使用了这种任务最常见的损失函数交叉熵损失。请注意,在下面的代码中,我已经为不同神经网络的三个不同部分初始化了三个独立的优化器。

为前几个时段的全连接(FC)层设置较高的权重。

通过为 FC 层设置更高的权重,我们训练 FC 层的速度比训练卷积层的速度快得多。FC 层用完全随机的权重初始化,而卷积层已经用 ImageNet 数据集训练了权重。您希望在微调卷积层之前,快速粗略地计算将卷积层的输出映射到图像类别的 FC 层权重。有些人可能在最初几个时期 不训练卷积层,因为他们认为当 FC 层仍然没有完成将卷积层的输出映射到图像类别的工作时,对卷积层的训练是“浪费的”。请注意,在这几个时期之后,您仍然必须最终训练卷积层,因为这样做的准确性会大大提高。

我选择了前一种方法,因为我发现它在这种情况下更有效。请注意,我在优化器中为 FC 层设置了更高的学习速率(LR 参数),如下所示。

下面下一节中的代码训练模型的 4 个时期,并在每个时期输出结果,它几乎完全是从文档中摘录的。注意,您必须为训练阶段设置 model.train() ,为评估阶段设置 model.eval()

培训与验证

使用前面提到的验证文件夹中的文件夹在验证数据集上进行每个时期的评估。验证集用于在未对其进行训练的数据集上评估模型,以便我们知道模型何时过度适合训练集。防止过度拟合很重要,因为我们希望模型能够很好地推广到看不见的数据,而不仅仅是训练集。模型在训练集上的准确性将总是增加,但是如果在看不见的验证集上的准确性开始降低,我们知道模型过度拟合。因此,我们应该在验证精度开始下降的点停止。

还要注意,在代码中,我们必须在对每批新数据进行训练时使用 optimizer.zero_grad()手动将优化器的梯度设置为零,并使用 optimizer.step()更新权重。用于评估的代码是相似的,除了不涉及优化器(我们不在验证图像上调整模型的权重,因为不涉及训练)。

几个时期后降低学习率

一个好的策略是在几个时期之后降低学习率,因为我们接*最*值。我们不想“穿越”而错过这个最低点。在上述 4 个时期之后,在训练另一个 4 个时期之前,我将学习率设置为 0.00001,然后在验证准确度开始降低之前,将最后 4 个时期的学习率设置为 0.000001。请参考我的 GitHub 资源库中的“final code.ipynb”笔记本来查看流程。

注意,在改变它们之前,花了很多时间来微调学习速率和时期数。你必须有耐心(并且打开几个 Google Colab 会话,每个会话运行在不同的参数上)!

提交前对验证集进行培训

别忘了这个!在提交前对模型进行最后一轮训练之前,将所有验证图像传输回训练文件夹!我必须将虚拟图像放入验证文件夹,否则我会在训练时遇到错误。

(至关重要)在培训图像上扩展的网页抓取

挑战的规则声明:作为一个现实世界的应用问题,我们希望解决者使用图像数据/特征,如颜色、形状、SIFT 等。或者用于图像建模的深度学习方法。对硬件或 GPU 的使用没有限制,扩充、 增加额外的训练数据 等。

这并不奇怪,因为在现实世界中解决这样的问题时,我们总是建立自己的训练数据集,使其更加丰富。

只需谷歌更多的图片来补充你的训练数据!

在尝试了许多选择之后,我发现在谷歌上使用图片的类别(即皮卡丘、*火龙等名字)进行搜索。)其次是‘衬衫娃娃’给出了最好的结果!相信我,我已经尝试过添加很多单词,比如“产品”、“杯子”、“包”等等。而且有的还胡说八道。

这对这款车型的成功至关重要。在训练我的模型时的某个时间点,我意识到我应该扩展我的训练数据,并且必须再次重新开始整个过程。这一步应该在模型训练之前完成,但我想在详细阐述这一独立部分之前给出整个模型的总体视图。在我的 GitHub 存储库中,‘expand _ train _ set _ character’文件夹包含我从谷歌获取的图像,而‘train _ expanded _ character’文件夹包含来自 CrowdANALYTIX 和谷歌的训练数据。

在这个过程中遇到了一些困难:

  • 有许多损坏的文件必须通过代码识别并删除(例如,不要以结尾。jpg,无法打开等。).
  • 其中一个角色是“本”。当我自己在谷歌上搜索“本”时,出现了很多叫“本”的人,这简直是一场灾难。因此“本”的训练数据根本没有增加。

实现这一点的脚本的完整代码在下面给出,也在我的 GiHub 库的‘来自 google.ipynb 的碎片图像’文件中。基本上,它列出了火车目录中的所有文件夹名称,这是图像类别,然后谷歌搜索每个词+“衬衫娃娃”并解析结果,然后将图片分类到“expand_train_set_character”文件夹中。关于如何使用 BeautifulSoup 从网上收集数据的教程,请访问本页面。

概括起来

本文涵盖了以下内容:

  • PyTorch 中选择的 ResNeXt-101-32x8d 型号。
  • 在训练期间,从 model.layer3 解冻第 18 层及其上面的所有层。
  • 图像增强的亮度随机变换上限为 0.05,因此模型可以推广到不同光照条件下的图像。
  • 网络抓取更多产品图片(来自谷歌)添加到数据集。
  • 为全连接层的前几个时期设置较低的学习速率。在几个时期之后*心地降低学习速率(对于 FC 和卷积层)。
  • 试错法!很多时间都花在了反复试验和开发数据集的直观感受上。

这是我第一次尝试深度学习竞赛中的一次。我很高兴最终获得了第四名,准确率为 92.294%,如本文开头的排行榜所示。我希望这篇文章对你有用,并且你已经获得了一些应用于未来深度学习项目的技巧和诀窍!同样,本文中的所有代码都在我的 GitHub 库中。数据集已经在适当的文件夹中,代码准备运行(在安装 PyTorch 之后)。

[## bck 1990/从产品图像中识别字符

这是为 CrowdANALYTIX 提交的竞赛(获得第四名)…

github.com](https://github.com/bck1990/Identify-Characters-from-Product-Images)*******

我将如何向一个 5 岁的孩子解释构建“LightFM 混合推荐器”!

原文:https://towardsdatascience.com/how-i-would-explain-building-lightfm-hybrid-recommenders-to-a-5-year-old-b6ee18571309?source=collection_archive---------4-----------------------

构建用户/项目功能以解决冷启动问题并预测新用户评级的示例。

注意:5 岁的孩子必须掌握 Python 的工作知识!

来源:作者在 imgflip 上创建

为什么对冷启动问题大惊*怪?

在推荐系统中,冷启动问题指的是将项目推荐给一个完全**新* 用户的问题,即一个没有与你的数据库中的任何现有项目进行过交互的用户。换句话说,如果您从初始训练数据创建用户-项目矩阵,您将找不到这个新用户的行。类似的类比可用于解释在全新项目的情况下的冷启动问题。*

作为应用程序开发人员,这可能会给你带来很大的不便,例如,当听众试图寻找新的播客建议来听时,你得到的是——zip,zilch,nada,什么都没有。这正是我们播客应用程序 Podurama 最初开发阶段的问题。让我们看看 LightFM 是如何帮助我们解决这个问题的…

LightFM 如何帮助解决冷启动问题?

LightFM 的一个优点是,该模型不会遭受冷启动问题,无论是用户还是项目冷启动。原因是 LightFM 允许构建一个混合推荐系统

混合推荐器是一种特殊的推荐器,它使用协同过滤和基于内容的过滤来进行推荐。

简而言之,LightFM 可以使用普通的用户-项目交互来为已知的**用户做出预测。在 n 个电子战用户的情况下,如果它知道关于这些新用户的一些附加信息,它可以做出预测。这些附加信息可以是性别、年龄、种族等特征,并且在训练期间必须将**输入到算法中。****

让我们直接进入编码

我将使用(非常)*的虚拟评级数据和特征数据,因为我希望能够显示每个阶段的中间输出。如果你想跟着去,这里有一本 Jupyter 笔记本

评级数据框架

它包含来自三个用户(u1、u2、u3)和四个项目(i1、i2、i3、i4)的数据。

**# create dummy dataset
data = {'user': ['u1','u1','u2','u2', 'u3', 'u3', 'u3'], 
        'item': ['i1', 'i3', 'i2', 'i3', 'i1', 'i4', 'i2'], 
        'r': [1,2,1,3,4,5,2]
       }
df = pd.DataFrame(data,  columns = ['user', 'item', 'r'])**

用户特征数据框架

我们有关于每个用户的四条附加信息——三个布尔特征——f1、f2、f3,以及一个位置特征——loc,现在可以取两个值——德里或孟买。

***#dummy user features*
data = {'user': ['u1','u2','u3', 'loc'], 
        'f1': [1, 0, 1, 'del'], 
        'f2': [1, 1, 1, 'mum'],
        'f3': [0, 0, 1, 'del']
       }
features = pd.DataFrame(data,  columns = ['user', 'f1', 'f2', 'f3', 'loc'])**

创建符合 LightFM 的数据集

如果您浏览过 LightFM 文档,就会知道它喜欢特定格式的输入数据。因此,我们必须服从。

**from lightfm.data import Dataset
dataset1 = Dataset()**

调用 fit 方法

我们需要调用 fit 方法来告诉 LightFM 用户是谁,我们正在处理什么项目,以及任何用户/项目特性。

我们将向 fit 方法传递三个输入:

  • users:所有用户列表
  • items:列出所有项目
  • user_features:附加用户功能列表

传递用户和项目列表非常简单——只需使用df中的“用户”和“项目”列。

当谈到传递user_features时,我会强烈推荐传递一个列表,其中每个元素都是类似于'feature_name:feature_value'的格式(我保证我会解释为什么我更喜欢这样做,以及是否有其他选择,但是现在,请耐心等待)。

这意味着我们的user_features应该是这样的:
['f1:1', 'f1:0', 'f2:1', 'f3:0', 'f3:1', 'loc:mum', 'loc:del']

正如你所猜测的,这个列表是通过考虑在训练集中可能遇到的所有可能的对来生成的。例如,对于等于locfeature_name,可以有两个feature_values,即mumdel

我写了一*段代码,让我生成这样一个列表(我称之为uf):

**uf = []
col = ['f1']*len(features.f1.unique()) + ['f2']*len(features.f2.unique()) + ['f3']*len(features.f3.unique()) + ['loc']*len(features['loc'].unique())
unique_f1 = list(features.f1.unique()) + list(features.f2.unique()) + list(features.f3.unique()) + list(features['loc'].unique())
#print('f1:', unique_f1)
for x,y in zip(col, unique_f1):
    res = str(x)+ ":" +str(y)
    uf.append(res)
    print(res)**

最后,有了所有可用的部分,让我们对数据集调用 fit 方法:

***# we call fit to supply userid, item id and user/item features*
dataset1.fit(
        df['user'].unique(), *# all the users*
        df['item'].unique(), *# all the items*
        user_features = uf *# additional user features*
)**

既然我们已经准备好了框架数据集,我们就可以将实际的交互和评级插入其中了。

建立互动

build_interactions方法的输入是交互的 iterable,其中每个交互是一个包含三个元素的元组:

  • 用户
  • 项目
  • 交互权重(可选)

交互权重仅仅意味着如果用户‘u’与项目‘I’交互,那么这个交互有多重要。从我们示例的角度来看,权重是我们对每个(用户、商品)对的评级。

插入权重可能有用的另一个例子是,如果我们正在处理(用户、歌曲)交互数据。在这种情况下,我可以给那些用户听了超过 3/4 歌曲的交互分配一个较高的权重。

***# plugging in the interactions and their weights*
(interactions, weights) = dataset1.build_interactions([(x[0], x[1], x[2]) for x in df.values ])**

总之,interactions矩阵告诉我们用户是否与某个项目进行了交互,而weights矩阵量化了特定的交互。

我们可以看看这两个输出矩阵是什么样的。由于这些是稀疏矩阵,我们可以使用.todense()方法。在这两个矩阵中,行是用户,列是项目。

如果你现在还和我在一起,我向你致敬。理解下一部分非常重要,这样你也可以为你自己的推荐系统实现它。(有趣的事实:LightFM Github 页面上的许多公开问题都与构建用户/物品特性主题有关)。

构建用户特征

build_user_features方法需要以下格式的输入:
[
(用户 1,[特征 1,特征 2,特征 3,…。]),
(用户 2,[功能 1,功能 2,功能 3,…。]),
(用户 3,[功能 1,功能 2,功能 3,…。]),

这里需要记住的一件超级重要的事情是,feature1feature2feature3等应该是我们一开始传递给fit方法的user_features列表中的项目之一。

只是重申一下,这是我们的user_features列表目前的样子:
['f1:1', 'f1:0', 'f2:1', 'f3:0', 'f3:1', 'loc:mum', 'loc:del']

因此,对于我们特定的虚拟数据,build_user_features的输入应该是这样的:

**[
     ('u1', ['f1:1', 'f2:1', 'f3:0', 'loc:del']),
     ('u2', ['f1:0', 'f2:1', 'f3:0', 'loc:mum']),
     ('u3', ['f1:1', 'f2:1', 'f3:1', 'loc:del'])
 ]**

同样,我已经编写了一个(不那么*的)代码片段,让我生成这样一个列表:

*****# Helper function that takes the user features and converts them into the proper "feature:value" format***
def feature_colon_value(my_list):
    """
    Takes as input a list and prepends the columns names to respective values in the list.
    For example: if my_list = [1,1,0,'del'],
    resultant output = ['f1:1', 'f2:1', 'f3:0', 'loc:del']

    """
    result = []
    ll = ['f1:','f2:', 'f3:', 'loc:']
    aa = my_list
    for x,y in zip(ll,aa):
        res = str(x) +""+ str(y)
        result.append(res)
    return result***# Using the helper function to generate user features in proper format for ALL users*** ad_subset = features[["f1", 'f2','f3', 'loc']] 
ad_list = [list(x) for x in ad_subset.values]
feature_list = []
for item in ad_list:
    feature_list.append(feature_colon_value(item))
print(f'Final output: {feature_list}')**

最后,我们必须将feature_list的每个元素与相应的用户 id 相关联。

**user_tuple = list(zip(features.user, feature_list))**

瞧,我们有了build_user_features方法所需的输入。让我们继续称之为:

**user_features = dataset1.build_user_features(user_tuple, normalize= False)**

图 1

在上面的user_features矩阵中,行是用户,列是用户特征。每当用户在训练数据中具有该特定用户特征时,就存在 1。

我们可以看到总共有 10 列,这意味着存在 10 个用户特性。但是为什么你问,让我们看看!

**user_id_map, user_feature_map, item_id_map, item_feature_map = dataset1.mapping()
user_feature_map**

如果你看看上面的输出,就会明白为什么我们有 10 个用户特性。默认情况下,用户 id 本身也是一个特性,所以我们有三个。剩下的七个一定很熟悉,因为我们在一开始就创建了它们。

是时候建立模型了

这一步非常简单,也非常通用。当然,您可以遵循文档并尝试不同的loss值或learning_schedule选项。

**model = LightFM(loss='warp')
model.fit(interactions,
      user_features= user_features,
      sample_weight= weights,
      epochs=10)**

打印 AUC 分数

**from lightfm.evaluation import auc_score
train_auc = auc_score(model,
                      interactions,
                      user_features=user_features
                     ).mean()
print('Hybrid training set AUC: %s' % train_auc)**Output: Hybrid training set AUC: 0.9166667****

我再说一遍,不要对高 AUC 过于兴奋。记住这只是虚拟数据。

为已知用户做预测

predict方法有两个输入:

  • 用户 id 映射(例如:要获得对“u1”的预测,必须传递 0;对于‘U2’,传递 1,以此类推。).这些映射可从user_id_map 字典中访问。
  • 条目 id 的列表(同样不是 i1、i2,而是映射;可从item_id_map获得您想要的推荐。
***# predict for existing user*
user_x = user_id_map['u3']
n_users, n_items = interactions.shape *# no of users * no of items*
model.predict(user_x, np.arange(n_items)) *# means predict for all* **Output: array([-0.18600112, -0.91691172, -0.295421  , -0.06632421])****

为未知用户做预测

这就是我们最初构建混合推荐器的原因。

对于一个新用户,这是我们所知道的- (s)他有 f1,f2,f3 的值,分别为 1,1 和 0。此外,他们的位置是德里。

**user_feature_list = ['f1:1', 'f2:1', 'f3:0', 'loc:del']**

现在,我们不能将它直接提供给predict方法。我们必须将这种输入转换成 lightFM 模型可以理解的形式。

理想情况下,输入应该类似于user_features矩阵中的一行(见上面的图 1)。

我在 Stackoverflow 上找到了一段代码,它就是这样做的——将user_feature_list转换成所需的格式(在我们的例子中是一个有 10 列的稀疏矩阵)。我只是稍微修改了原始代码,并将其封装在一个可重用的函数format_newuser_input中,如下所示:

**from scipy import sparsedef format_newuser_input(user_feature_map, user_feature_list):
  num_features = len(user_feature_list)
  normalised_val = 1.0 
  target_indices = []
  for feature in user_feature_list:
    try:
        target_indices.append(user_feature_map[feature])
    except KeyError:
        print("new user feature encountered '{}'".format(feature))
        pass

  new_user_features = np.zeros(len(user_feature_map.keys()))
  for i in target_indices:
    new_user_features[i] = normalised_val
  new_user_features = sparse.csr_matrix(new_user_features)
  return(new_user_features)**

最后,我们可以开始预测新用户:

**new_user_features = format_newuser_input(user_feature_map, user_feature_list)
model.predict(0, np.arange(n_items), user_features=new_user_features)**

这里,第一个参数(即 0)不再指用户 u1 的映射 id。相反,它的意思是——选择new_user_features稀疏矩阵的第一行。传递除 0 以外的任何值都会引发一个错误,这是理所当然的,因为在new_user_features中没有超过 row0 的行。

万岁!!我们做到了。我们的虚拟混合推荐系统已经准备好了。

创建用户/项目特征的其它方式

回到我在开始时所做的承诺,除了构建user_features矩阵,还有其他选择,假设** 你的数据是一种特定的格式。**

例如,考虑如下所示的用户特征数据帧:

来源:https://github.com/lyst/lightfm/issues/372

如果你仔细观察,这三个特征——种族、性别、30 岁以下,每一个都有不重叠的值。换句话说,种族列中的可能值不同于性别列中的可能值,性别列中的可能值又不同于 under_30yo 列中的可能值

如果是这种情况,我们可以简单地将表单[Asian, Hispanic, Female, Male, no, yes]user_features列表传递给fit。随后,我们必须也更新我们构建用户特性的方式,因此.build_user_features()的输入应该是这样的:

**[
     ('u1', ['Asian', 'Female', 'No']),
     ('u2', ['Hispanic', 'Male', 'Yes']),
     ('u3', ['Hispanic', 'Male', 'No'])
 ]**

这看起来很棒。但是现在回答这个?

当我有一个关于每个用户的额外信息时,比如一个新列“height_under_5ft”可以取值 yes 或 no,会发生什么?

在这种情况下,可能很难从年龄和身高来区分是/否。因此,为了避免歧义,最好使用我们在开始时谈到的feature:value格式,并将user_features = ['eth:Asian', 'eth:Hispanic', 'gender:Male', 'gender:Female', 'age:yes', 'age:no', 'height:yes', 'height:no]传递给fit,并将以下输入传递给.build_usear_features()

**[
     ('u1', ['eth:Asian', 'gender:Female', 'age:No', 'height:yes']),
     ('u2', ['eth:Hispanic', 'gender:Male', 'age:No', 'height:no'])
     ('u3', ['eth:Asian', 'gender:Female', 'age:No', 'height:yes'])
 ]**

结尾注释

有很多不同的方法可以推进这个教程。首先,尝试插入真实数据集而不是虚拟数据,看看你的推荐系统表现如何。您甚至可以尝试使用我们在本教程中讨论的类似方法来创建item_features

我没有过多地讨论过模型调优、模型评估、交叉验证等等,但那是以后的事了。我希望你喜欢阅读,并随时在 Github 上分享我的代码,以满足你的需求。一如既往,我很想知道是否有更好的方法来做我提到的一些事情。

直到下次:)

哦,我差点忘了,“如果你喜欢这篇文章,你可能也会喜欢”😜)

我喜欢写循序渐进的初学者指南、操作指南、面试问题、ML/AI 中使用的解码术语等。如果你想完全访问我的所有文章(以及其他文章),那么你可以注册使用 我的链接这里* ***

** [## 如何在 VSCode 中充分利用你的 python 调试器?

观察变量,使用条件断点,调用堆栈,异常断点等——当在大型项目中工作时

towardsdatascience.com](/how-to-make-most-of-your-python-debugger-in-vscode-9e05dfce533f) [## 了解 Python 导入,init。py 和 pythonpath —一劳永逸

了解如何导入包和模块(以及两者之间的区别)

towardsdatascience.com](/understanding-python-imports-init-py-and-pythonpath-once-and-for-all-4c5249ab6355) [## 使用 Python 中的 Pandas 进行时间序列分析

对季节性、趋势、自相关等关键词的额外介绍。

towardsdatascience.com](/time-series-analysis-using-pandas-in-python-f726d87a97d8) [## 使用 FLASK 将 H2o 模型部署为 API

模型训练、调优和创建简单 API 的端到端示例(没有技术术语)。

towardsdatascience.com](/deploying-h2o-models-as-apis-using-flask-42065a4fa567)**

我将如何学习数据科学(如果我必须重新开始的话)

原文:https://towardsdatascience.com/how-i-would-learn-data-science-if-i-had-to-start-over-f3bf0d27ca87?source=collection_archive---------6-----------------------

从我的数据科学之旅中学到的经验

我会说我的数据科学学习之路相当传统。我读的是经济学本科,并获得了全球商务和计算机科学(专注于机器学习和人工智能)的硕士学位。我从商学学位期间的课程中学到了我的商业头脑,并从我的计算机科学硕士学位中获得了大部分技术元素。我有一个数据科学实习,我在路上。

回想起来,我的道路没有错,但知道我现在做什么,我会改变我的学习旅程吗?这个问题对于这个领域的新手来说尤其重要。自从我开始以来,许多事情都变了。职位竞争更加激烈,学习选择也多得多。我希望我的经历可以帮助其他人更快、更全面地学习数据科学,并给他们更好的工作机会。

图片由 VisionPic 提供。来自的网像素

我将告诫这篇文章说,学习是每个人都有点不同。我的话不是真理,你很有可能会找到对你更好的东西。尽管如此,我还是希望这是一个良好的基础。我希望它能灌输给你在学习这个领域时相关的大局优先。

这篇文章更关注如何学习,而不是从哪里学习(课程、训练营、学位等等)。).对于学习该领域的具体课程和在线资源,我推荐这两篇文章。

对于那些喜欢视频版本的人:

第一课:分解

当我第一次开始学习数据科学时,我被这个领域的规模所淹没。我不得不从统计学、线性代数、微积分等方面学习编程语言和概念。当我面对这么多选择时,我不知道从哪里开始。

幸运的是,我有课程来指导我的学习。我所做的学位将许多概念分解成更*的块(类),以便它们易于理解。虽然这对我很有效,但我发现学校对此有一种一刀切的方法。它们还包括许多你实际上并不需要的无关类。如果我可以回到过去,我一定会将我的数据科学学习之旅分成更适合我的几个部分。

在深入研究数据科学之前,了解该领域中使用的组件是有意义的。您可以将数据科学分成更*、更容易理解的块,而不是将事情分成“课程”。

我通常将数据科学分为编程和数学。

编程—熟悉 Python 和/或 R

  • 变量
  • 功能
  • 目标
  • 包(*猫,numpy,matplotlib,sklearn,tensorflow,pytorch 等。)

数学

统计

  • 概率论
  • 回归(线性、多元线性、岭、套索、随机森林、svm 等。)
  • 分类(朴素贝叶斯,knn,决策树,随机森林,svm 等。)
  • 聚类(k 均值,分层)

线性代数

微积分

通过将数据科学分解成各个组成部分,您可以将它从抽象的概念转化为具体的步骤。

第二课:从某处开始

当我刚开始的时候,我痴迷于按照“正确”的顺序学习东西。进入这个领域后,我发现许多数据科学家学习技能的顺序截然不同。我遇到了先学习数学的博士,在参加训练营后才学习编程概念。我也遇到了软件工程师,他们是不可思议的程序员,后来通过自学和应用学会了数学。

我现在意识到从某个地方开始是最重要的,最好是从你感兴趣的话题开始。我发现学习是相加的。如果你学习一件事,你并没有放弃学习另一个概念。

如果让我回到过去,我会从当时我最感兴趣的概念开始。一旦你学会了一个概念,你就可以在此基础上理解他人。例如,如果你学习一个简单的线性回归,多元线性回归是一个相当容易的步骤。

尽管如此,我可能不会马上开始深度学习。从*而简单开始并在此基础上进行构建会有所帮助。

第三课:建立最低限度的可行知识(MVK)

随着时间的推移,我对你需要多少基础知识的看法发生了变化。在我自己经历了许多不同类型的学习后,我相信通过做真实世界的项目来学习是掌握一个领域最有效的方法。我认为你应该理解足够多的这些概念,以便能够开始探索你自己的项目。

这就是最*可行知识发挥作用的地方。你应该从能够边做边学开始。这个阶段很难确定。一般来说,当你刚到这里的时候,你会觉得你还没有准备好。这是一件好事,这意味着你正在把自己推出舒适区。

你可以相当容易地达到这个阶段。我认为你可以通过非常入门的在线课程达到这种知识水*,我一般推荐 kaggle.com 的微型课程。

为了达到这一步,您真正需要理解的是 python 或 R 的基础知识,并且熟悉所使用的包。您可以稍后通过将一些算法应用到真实世界的数据来开始学习数学。

第四课:弄脏你的手

以你的基础知识,我建议尽快进入项目。同样,这听起来很可怕,但是项目就是你如何定义它。

在早期阶段,一个项目可能只是简单地试验一个 for 循环。随着您的进步,您可以使用 kaggle 上的数据,并最终使用您已经收集的数据来进行项目。

我非常相信学习数据科学的最好方法是做数据科学。我认为这个理论非常重要,但是没有人说在你开始应用它之前你必须理解它。理论是在你对算法有了功能性的理解之后,你可以回头去看的东西。对我来说,现实世界的例子总是让事情变得更好。如果你通过项目从真实世界的例子开始,我认为当你开始学习理论时,事情有更高的机会“点击”。

项目也有能力让数据科学变得更*。我认为新学习者面临的最大挑战之一是,数据科学领域可能会势不可挡。将你所学的东西限制在一个*项目的范围内,比你在第一课中所做的更能让你把事情分解得更细。

项目提供了一个额外的好处。他们会给你即时的反馈,告诉你哪里需要改进。如果您正在进行一个项目,并且遇到了使用什么包、算法或可视化的障碍,您现在知道您可能应该进一步研究该领域。

第五课:从别人的代码中学习

虽然做自己的项目很棒,但有时你不知道自己不知道什么。我强烈建议阅读更有经验的数据科学家的代码,以获得关于下一步学习什么的想法,并更好地理解逻辑或语法。

在 Kaggle 和 GitHub 上,有成千上万(也许上百万)的内核,人们在那里分享他们用来分析数据集的代码。浏览这些是补充你的项目的好方法。

我建议列出你看到的正在使用的软件包、算法和视觉效果。您应该查阅软件包的文档,并在那里扩展您的知识。他们几乎总是在文档中有例子来说明如何使用它们。同样,这个列表可以用来帮助你思考新的项目想法和实验。

第 6 课:从头开始构建算法

这是大多数数据科学家的必经之路。在你应用了一个算法并理解了它在实践中是如何工作的之后,我建议你试着从头开始编码。这有助于您更好地理解底层数学和其他使其工作的机制。这样做的时候,你无疑也必须学习它背后的理论。

我个人认为,这个方向的学习远比试图掌握理论再去应用要直观的多。这是 fastai 在他们的免费 mooc 中采用的方法。如果你对深度学习感兴趣,我强烈推荐它。

对此,我一般建议从线性回归开始。这将帮助你更好地理解梯度下降,这是一个非常重要的概念。

随着你的数据科学事业的进一步发展,我认为理论变得越来越重要。您通过将正确的算法与问题相匹配来带来价值。与算法相关的理论极大地促进了这一过程。

第七课:永远不要停止学习

数据科学之旅的美妙之处在于它永无止境。你将需要不断学习保持在新的软件包和领域的进步的顶端。我建议通过(你猜对了)更多的项目来做到这一点。我还建议继续进行代码审查,阅读已经发表的新研究。

这更多的是一种心态上的建议,而不是什么实际的建议。如果你认为有一个顶峰,你会大吃一惊!

我如何写数据科学博客

原文:https://towardsdatascience.com/how-i-write-a-data-science-blog-62e4108fe478?source=collection_archive---------14-----------------------

撰写数据科学(或任何其他主题)的顶级技巧

照片由思想目录Unsplash 上拍摄

两年来,我几乎一直在媒体上专门写关于数据科学的文章。我最初打算只是偶尔写点东西来帮助其他人学习数据科学,并作为我自己发展的学习工具(我是费曼技术的超级粉丝)。

然而,自那以后,它已经发展得远远不止于此。我写作是为了放松,是我思想和想法的一个出口,仍然是一个强大的学习和发展工具。如果我正在学习一种新的工具或技术,我可能会写一篇关于它的文章。

我现在已经写了 60 多篇博文,在我写媒体的两周年纪念日即将到来之际,我想分享一些我迄今为止写博客的经验和收获。

如果你正在考虑开始写作,或者想要改进或发展你自己的博客,这里是我在 Medium 上写关于数据科学(或任何其他主题)的顶级技巧。

为你写作

许多人从事博客写作是为了赚钱或者获得大量的读者或追随者。写作可以导致这两者,这是千真万确的,但现实是,要达到这一点需要花费大量的时间和精力。

当我第一次开始在 Medium 上写作时,我的浏览量很少,如果我一个月能赚 10 美元,那我就很幸运了。然而,我坚持写作,因为我从中获得了巨大的个人价值。写作帮助我学习数据科学的技术方面,帮助我提高我的沟通和思*排序技能,给我满足感,因为我可能正在帮助某人,在某个地方学习新的东西,并把我介绍给一大群新的有趣的人。

"我写作是为了发现我所知道的东西。",弗兰纳里·奥康纳

金钱和声望是表面的激励因素。

要想在博客上取得成功,无论是媒体还是其他方式,你需要在一个相对较长的时期内坚持写作,即使没有人阅读你的作品。为了在最初的几个月里坚持下去,你需要更深层次的写作动机。

我读过很多关于写作的文章,这些文章关注的是你应该为你的读者提供的价值。就你的帖子的实际内容而言,这是绝对正确的。

然而,要真正坚持一个有规律的写作习惯,你很可能会在工作、学习或家庭等其他事情上左右为难。你需要写作,因为它为你个人提供了一些好处或价值(除了经济上的)。

穿上你的运动服

写字的习惯有点像锻炼。正如他们所说,开始健身的一半是穿上你的运动服。简单地打开你的笔记本电脑,开始写作,就完成了你故事写作的一半。重要的是不要拖延太久,而是开始写。

通常,我的故事初稿只是一些想法和笔记。我的目标是尽快记下这些想法,不要太担心写作风格、语法或结构。之后,我回去编辑这个故事并重组它。我发现,这使我能够以最有效的方式写文章。

“把它拿下来。抓住机会。这可能不好,但这是你能做任何真正好的事情的唯一方法。”威廉·福克纳

我有一个相对固定的写作时间表。我试着每天至少写 30 分钟。全职工作,带着两个孩子,我通常没有时间一次花几个*时写一个故事,所以我的文章通常要写几天。

我再次认为这就像间歇训练。当我每天做其他事情的时候,我会思考,获得想法——有时候我在每天散步的时候在脑子里组织我的文章。然后,当我有 30 分钟的写作时间时(通常是在我的孩子睡觉后),我准备冲刺,并发现我可以很快写完我博客的一部分。

我还会利用任何空闲时间来写或编辑故事。我在任何地方和任何地方写作,我甚至可以在手机上写作。

灵感

我坚持每周写一到两篇文章,大多是关于数据科学或密切相关的主题。有人好几次问我,我是如何不断想出文章的新点子的。我使用灵感的来源有很多。

广泛阅读,而不仅仅是技术书籍。很多新文章的想法来自我读过的书或文章。非技术书籍常常是我灵感的来源。例如,我可能会读到一种学习技术,它可以以不同的方式应用于数据科学。我最*读了一本关于超学习的书,这是我几周前写的一个故事的灵感来源。

“思想就像兔子。你得到一对夫妇,并学会如何处理他们,很快你就有一打了。”,约翰·斯坦贝克

作为一名数据科学家,随着该领域的快速发展,您永远不会停止学习或发现新的工具和技术。因此,我的日常工作是我灵感的另一个来源。如果我在日常工作中学习了一项新技术,我会写一篇关于它的文章,这也有助于确保我正确地掌握了概念,并能在必要时向利益相关者解释它们。

我也经常使用社交媒体。我在 Twitter、Linkedin 上关注了很多优秀的人和项目,也在 Quora 上关注了一些帖子。Quora 是一个发现人们有兴趣知道答案的问题类型的好地方,这有助于我定制对读者最有用的内容。

我试着为博客积累一些想法,当我遇到它们的时候就可以写下来。这样,当我有时间写作时,我总是有灵感的来源,而不会浪费时间去想出一个新文章的想法。

如果你觉得这篇文章有用,我之前写过一篇关于我为什么写数据科学博客的文章,这篇文章提供了更多关于我从写作中获得的个人价值的细节。

[## 我为什么写数据科学博客

写博客加速了我在数据科学方面的学习,原因如下

towardsdatascience.com](/why-i-write-a-data-science-blog-7726c3c7d3d9)

感谢阅读!

我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!

我如何为 AWS Lambda 函数编写有意义的测试

原文:https://towardsdatascience.com/how-i-write-meaningful-tests-for-aws-lambda-functions-f009f0a9c587?source=collection_archive---------0-----------------------

让世界永远摆脱“断言真=真”的尝试。

作者图片

残酷的事实

如果你要编写无意义的单元测试,更有可能掩盖错误而不是暴露错误,你最好干脆跳过这个练习。

好了,我说了。

您的时间是宝贵的,可以用在比实现空洞的覆盖率更好的事情上。

有效的代码测试一直是编程中的一个挑战性问题,AWS Lambda 等新工具似乎让开发人员在编写测试时表现最差。

我认为这主要是因为在本地镜像 Lambda 生产环境更加困难(或者至少不太直观)。结果,一些开发人员完全放弃了测试。

我知道是因为我自己做过,甚至是生产中的项目。相反,只有在代码已经部署到云中之后,测试才以集成的方式进行。

这是极其手工的,并且从长远来看浪费时间。

我在测试中看到的另一种方法的结果如下:

这是一个有测试覆盖需求但缺乏责任感的工程团队的明显标志。不需要解释以上是不允许的。

那么,我们如何着手将上面这个悲伤的文件转化成有意义的东西呢?

在我们开始测试 Lambda 代码之前,还有几个障碍。我们将逐一讨论这些问题,并确定如何最好地处理它们。一旦处理完毕,我们就可以随心所欲地测试 Lambdas 了!

注意:为了清晰起见,我将在整篇文章中加入一些代码片段。但最后会有一个完整的工作代码示例可供参考。

障碍# 1:Lambda 触发事件

每个 Lambda 函数都被调用以响应一个预定义的触发器,该触发器将特定的event数据传递给默认的lambda_handler()方法。有效测试 Lambda 函数的首要任务是创建一个真实的输入事件进行测试。

此事件的格式取决于触发器的类型。截至撰写本文时,有 16 种不同的 AWS 服务可以充当 Lambda 的调用触发器。

下面是我最常用的几个输入示例的代码片段:

将 test_sqs_event 传递给 lambda_handler。

样本输入事件的完整列表可在 AWS 文档中找到。或者,您也可以在部署后在 lambda_handler 代码中打印事件变量,并在 CloudWatch 日志中查看有效负载:

CloudWatch 日志中由 Kinesis 触发的 Lambda 事件示例|图片由作者提供

一旦你有了这个例子,简单地把它硬编码到你的测试文件中,如上所示,我们就有了一个奇妙的开始!

接下来…

障碍#2: AWS 服务交互

Lambda 函数几乎不可避免地会与其他 AWS 服务交互。也许您正在将数据写入 DynamoDB 表。或者向 SNS 主题发布消息。或者只是向 CloudWatch 发送一个指标。或者三者结合!

测试时,发送数据或改变生产中使用的实际 AWS 资源并不是一个好主意。为了解决这个问题,一种方法是建立并在以后拆除单独的测试资源。

一个更干净的方法是模仿与 AWS 服务的交互。因为这是一个常见的问题,所以开发了一个包来解决这个特定的问题。更好的是,它以一种超级优雅的方式做到了这一点。

它的名字叫 moto (模仿& boto 的组合词),它的优雅源自两个主要特征:

  1. 它在测试中自动修补和模仿 boto 客户端。
  2. 它*护伪 AWS 资源的状态。

这看起来像什么?所有需要的是一些装饰魔术和一点设置!

假设我们从 S3 的 Lambda 中读取数据。我们可以不用在 S3 创建和填充一个测试桶,而是使用 moto 创建一个假的 S3 桶——一个看起来和行为完全像真桶的桶——而不用实际接触 AWS。

最棒的是,我们可以使用标准的 boto3 语法来做到这一点,如下面的示例所示,调用create_bucketput_object方法:

使用@mock_s3 装饰器来修补 boto s3 客户端。

类似地,如果我们将数据写入 DynamoDB,我们可以通过首先创建一个假的 Dynamo 表来设置我们的测试:

使用@mock_dynamodb2 decorator 来修补 boto dynamo 资源。

这需要一点信任,但是如果测试通过,您可以确信您的代码也将在生产中工作。

好吧,但不是所有的都由 moto 负责…

没错,moto 并不是每一个 AWS API 都和保持*价。例如,如果你的 Lambda 函数与 AWS Glue 交互,moto很可能会让你陷入困境,因为 Glue 服务只实现了 5%。

这就是我们需要卷起袖子,通过恶作剧来嘲笑我们自己的肮脏工作的地方。无论我们谈论的是与 AWS 相关的调用,还是你的 Lambda 可能触及的任何外部服务,比如向 Slack 发布消息,都是如此。

不可否认,这方面的术语和概念非常密集,所以最好通过一个例子来解释。让我们坚持使用 AWS Glue,并说我们迫切希望用以下代码列出我们帐户的 Glue 爬虫:

session = boto3.session.Session()
glue_client = session.client("glue", region_name='us-east-1')
glue_client.list_crawlers()['CrawlerNames']
# {“CrawlerNames”: [“crawler1”, "crawler2",...]}

如果我们不想让我们出色的测试的成功或失败依赖于list_crawlers()响应,我们可以像这样硬编码一个返回值:

monkey 修补 boto3 会话

通过利用 pytestmonkey patchfixture 的setattr方法,我们允许lambda_handler中的胶合客户端代码在运行时动态访问来自MockBotoSession类的硬编码list_clusters响应。

这个解决方案的好处在于它足够灵活,可以为任何 boto 客户端工作。

用固定装置整理

我们已经讨论了如何在 Lambda 测试中处理事件输入和外部依赖。我想分享的另一个技巧是使用 pytest fixtures 来*护一个有组织的测试文件。

到目前为止,代码示例已经显示了直接在test_lambda_handler方法本身中设置代码。然而,更好的模式是创建一个单独的set_up函数作为 pytest fixture,传递给任何需要使用它的测试方法。

对于最后的代码片段,让我们展示一个使用@pytest.fixture装饰器的 fixture 结构的例子,并结合所有内容:

用 fixtures、moto 和 monkeypatching 测试 Lambda 文件!

我们已经从文章开头的空测试文件走了很长一段路,不是吗?

提醒一下,这段代码测试了一个 Lambda 函数:

  1. 触发 sqs 消息事件
  2. 将消息写入发电机表
  3. 列出可用的胶水爬虫
  4. 最后读回写入 Dynamo 的数据,并断言最终值与输入匹配。

通过采用这些策略,你应该对测试一个从任何事件类型触发的 Lambda,以及一个与任何 T21 AWS 服务交互的 Lambda 充满信心。

最后的想法

如果你一直在努力测试你的 Lambda 函数,我希望这篇文章向你展示了一些有用的技巧来帮助你这样做。

虽然我们花了很多时间讨论常见问题以及如何不应该测试 Lambda,但我们没有机会讨论这个主题的相反但同样重要的方面——即应该测试什么,以及如何构建 Lambda 函数的代码以使其更容易测试。

我期待收到您的来信,并讨论您如何测试 Lambda 函数!

感谢 Vamshi Rapolu 对本文的启发和反馈。

其他参考文献

[## 用于更好的 Python 测试的 Pytest 技巧

Pytest 是我选择的 Python 测试框架。非常容易使用,并使测试看起来更好。在本文中…

阿尔瓦雷斯.我](https://aalvarez.me/posts/pytest-tricks-for-better-python-tests/) [## 使用 Moto 进行无服务器单元测试

无服务器开发通过将基础设施的责任转移给…

www.fernandomc.com](https://www.fernandomc.com/posts/serverless-testing-with-moto/) [## Python - Semaphore 教程中的模仿和恶作剧

在这篇文章中,我将研究测试的基本部分——模拟。首先,我想在这里完成的是…

semaphoreci.com](https://semaphoreci.com/community/tutorials/mocks-and-monkeypatching-in-python) [## 建议请求:monkey patch vs . mock . patch 问题#4576 pytest-dev/pytest

解散 GitHub 是超过 5000 万开发者的家园,他们一起工作来托管和审查代码,管理项目,以及…

github.com](https://github.com/pytest-dev/pytest/issues/4576#issuecomment-449864333)

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

原文:https://towardsdatascience.com/how-id-learn-data-science-if-i-could-start-over-2-years-in-b821d8a4876c?source=collection_archive---------0-----------------------

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

Unsplash 上的 Element5 数码拍摄

目录

  1. 前言
  2. 介绍
  3. 数学和统计学
  4. 编程基础
  5. 机器学习算法和概念
  6. 数据科学项目

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

前言

来自非技术背景,我或多或少是靠自己。

当我第一次开始我的数据科学之旅时,我花了大量时间来弄清楚从哪里开始,我应该首先学习什么,以及我应该使用什么资源。

在过去的两年里,我学到了一些我希望有人能告诉我的事情,比如是先专注于编程还是统计,我应该使用什么资源来学习新技能,我应该如何学习新技能,等等…

因此,本文旨在为正在学习数据科学的人提供一些方向和见解。

介绍

我的假设是,作为一名有抱负的数据科学家,你会希望完全 理解各种机器学习算法、数据科学概念等等的概念和细节。

因此,我建议您在查看机器学习算法或数据科学应用程序之前,先从构建模块开始。如果你对微积分&积分、线性代数和统计学没有基本的了解,你将很难理解各种算法背后的机制。同样,如果你对 Python 没有基本的了解,你将很难在现实生活中应用你的知识。

以下是我建议您浏览的主题顺序:

  1. 数学和统计学
  2. 编程基础
  3. 机器学习算法和概念

1.数学和统计学

像其他任何事情一样,你必须先学习基础知识,然后才能接触有趣的东西。相信我,如果我在进入任何机器学习算法之前开始学习数学和统计学,我会轻松得多。

我推荐你复习的三个通用主题是微积分/积分、统计学和线性代数(排名不分先后)。

a.积分

当涉及到概率分布和假设检验时,积分是必不可少的。虽然你不需要成为一名专家,但学习积分的基础知识对你最有利。

前两篇文章是给那些想知道积分是什么的人,或者那些仅仅需要复习的人。如果你对积分一无所知,我建议你完成可汗学院的课程。最后,我提供了一些练习题的链接来磨练你的技能。

b.统计数字

如果有一个话题是你应该花大部分时间关注的,那就是统计学。毕竟,数据科学家实际上是现代统计学家,机器学习是统计学的现代术语。

如果你有时间,我建议你去乔治亚理工学院学习名为“统计方法的课程,它涵盖了概率基础、随机变量、概率分布、假设检验等等。

如果你没有时间参加上面的课程,我绝对推荐你去看看可汗学院关于统计学的视频

c.线性代数

如果你想进入深度学习,线性代数尤其重要,但即使如此,了解其他基本的机器学习概念也是很好的,如主成分分析和推荐系统。

对于线性代数,我也推荐可汗学院

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

2.编程基础

正如对数学和统计学有一个基本的理解很重要一样,对编程有一个基本的理解会让你的生活变得容易得多,尤其是在实现的时候。因此,我建议您在深入研究机器学习算法之前,先花时间学习基本的 SQL 和 Python。

a.结构化查询语言

你想先学习 Python 还是 SQL 完全取决于你,但是如果你问我,我会从 SQL 开始。为什么?即使你不是数据科学家,了解你是否在一家处理数据的公司工作也是很容易学习和有用的。

如果你完全不熟悉 SQL,我建议你去浏览一下 Mode 的 SQL 教程,因为它非常简洁和全面。如果你想学习更高级的概念,我会查看我的资源列表,在那里你可以学习高级 SQL

更重要的是,下面是一些你可以用来练习 SQL 的资源。

b.计算机编程语言

我是从 Python 开始的,我可能会一辈子都坚持使用 Python。就开源贡献而言,它遥遥领先,而且学习起来很简单。如果你想的话,请随意使用 R,但是我没有关于 R 的意见或建议。

我个人发现,通过‘做’来学习 Python,帮助要大得多。话虽如此,在经历了几个 Python 速成班后,我发现这个是最全面的(而且是免费的!).

c.*猫

可以说 Python 中最重要的库是 Pandas,它专门用于数据操作和分析。

下面是两个资源,应该可以让你很快上手。第一个链接是关于如何使用*猫的教程,第二个链接提供了许多练习题,你可以用它们来巩固你的知识。

3.机器学习算法和概念

如果你已经到了这一步,这意味着你已经建立了基础,你已经准备好学习有趣的东西。这部分分为两部分:机器学习算法和机器学习概念。

a.机器学习算法

下一步是了解各种机器学习算法,它们如何工作,以及何时使用它们。下面是各种机器学习算法和资源的非穷尽列表,您可以使用它们来学习每一种算法。

b.机器学习概念

类似地,还有几个基本的机器学习概念,你也想了解一下。下面是我强烈推荐你阅读的(非详尽的)概念列表。很多面试问题都是基于这些话题的!

4.数据科学项目

至此,你不仅已经打下了坚实的基础,而且对机器学习的基础有了坚实的理解。现在是时候做一些个人的兼职项目了,就像程序员也有他们自己的兼职项目一样。

如果您想查看一些简单的数据科学项目示例,请查看下面我的一些项目:

  • 用分类技术预测葡萄酒质量(文章Github )
  • 冠状病毒数据可视化使用 Plotly ( 文章Github )
  • 电影协同过滤推荐系统( Github )

这里有一个数据科学项目的列表,你可以看看它来产生想法,并想出一个你自己的有趣的附带项目。

感谢阅读!

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

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

[## 超过 100 个数据科学家面试问题和答案!

来自亚马逊、谷歌、脸书、微软等公司的面试问题!

towardsdatascience.com](/over-100-data-scientist-interview-questions-and-answers-c5a66186769a)

或者你可以查看我的中页:

[## 特伦斯·申—中号

阅读特伦斯·申在媒体上的文章。数据科学@ KOHO,SaturnCloud |理学硕士,MBA |…

terenceshin.medium.com](https://terenceshin.medium.com/)

特伦斯·申

我如何重新开始学习机器学习(3 年后)

原文:https://towardsdatascience.com/how-id-start-learning-machine-learning-again-3-years-in-55c52aaee52a?source=collection_archive---------2-----------------------

将工程师放回机器学习工程师

未管理的电缆,未修剪的颈毛——经典的“必须是工程师”给出。是的,这是一个 Colab 笔记本,屏幕中间有一张牛排的图片(即将到来的项目的一部分)。感谢山姆·伯克的照片。

我在地下,回到一切开始的地方。坐在我第一次遇见迈克的隐蔽咖啡馆里。在过去的 9 个月里,我一直在我的卧室里学习,并决定走出洞穴。我一半担心早餐要付 19 美元(除非是圣诞节,周末开车去优步不是很赚钱),另一半担心我在网上做的这项研究是否有意义。

2017 年,我离开了苹果,试图建立一家网络创业公司,失败了,发现了机器学习,恋爱了,报名参加了一个零编码经验的深度学习课程,给支持团队发邮件询问退款政策是什么,没有获得退款,接下来的 3 个月,晚交了 4 到 6 天的作业,不知何故通过了,决定继续前进,并创建了自己的 AI 硕士学位

获得人工智能硕士学位 9 个月后,我遇到了迈克,我们一起喝咖啡,我告诉他我的宏伟计划;使用人工智能来帮助世界移动更多,吃得更好,他告诉我我应该见见 Cam,我见了 Cam,我告诉 Cam 我要去美国,他说为什么不留在这里,周四来,好的,周四去实习一周一天,两周后在 Max Kelsen 获得初级机器学习工程师的职位。

在担任机器学习工程师 14 个月后,我决定离开,自己尝试一下。我写了一篇关于我所学的的文章,Andrei 找到了它,发邮件给我问我是否想建立一个初学者友好的机器学习课程,我说是的,我们建立了这个课程,在 6 个月的时间里,我们有幸教授了 150 多个国家的 27,177 名学生。

把它加起来,你会得到大约 3 年。大约是我最初的本科学位应该花的时间(由于几次失败,我花了 5 年时间完成了 3 年的学位)。

所以就目前的情况来看,我感觉我已经完成了机器学习本科学位。

一些局外人可能会认为我对机器学习有相当多的了解,我确实知道,我知道的比我开始时多得多,但我也知道有多少我不知道。这就是有知识的东西。

  • 1 年中: 蜜月期,也称为 noob 收获期。你比初学者强多了,甚至可能有点过于自信(尽管这不是一件坏事)。
  • 2-年:哦,也许我并不像我想象中的那样好相。你的初学者技能开始成熟,但现在你意识到要变得更好需要一些努力。
  • 3 年期:哇,还有很多要学的阶段。不再是初学者,但现在你知道的足够多,意识到你有多少不知道的(我在这里)。

学习是非线性的(不是一条直线)。你可能学习了整整一个月,却感觉毫无进步。然后不知从哪里,一个发现出现了。如果你想要一个我们如何愚弄自己的例子,你发现错误了吗?我好像还是忘了怎么拼写。

关于我已经说得够多了。这就是我的故事。你的可能是相似的,或者你可能从今天开始。

如果你正在开始,这篇文章是给你的。如果你是一个老手,你可以提供你的建议或者批评我的想法。

我们开始吧,好吗?

如果你是来要课程清单的,那你来错地方了

我上过很多在线课程。我甚至创造了我自己的。

你猜怎么着?

它们都是同一事物的混搭。

与其担心哪个课程比另一个好,不如找一个让你兴奋的老师。

学习任何东西,10%是物质,90%是对学习的兴奋。

你记得多少你学校的老师?

我的猜测是,不管他们教了什么,你记得老师本身比材料多。如果你记得这些材料,那是因为它们在你心中点燃了足够的火焰,足以将它烧进你的记忆。

然后呢?

涉猎一些资源,你足够聪明可以找到最好的。看看哪些能激发你的兴趣,让你坚持下去。

如果老师让你对一项技能感兴趣,学习这项技能并不是一件不愉快的事情。

工程师(和技术呆子)的诅咒

给我看一个宣称她使用最新最好的工具的工程师,我会给你看一个业余的。

我会坦白。我有罪。每一个新的闪亮的框架出来,每一个新的艺术模型,我都在上面。

我经常会发现自己试图发明一个问题来使用市场上的任何新工具。一个经典的本末倒置场景。

一个厨师的全部工作围绕着两个工具,火和刀的控制使用。

这体现在我收到的最好的编程建议中:学习语言,而不是框架。

如果你刚刚开始,一只手数不清你正在学习的工具的数量,那么你正在尝试使用太多的工具。

“我想建造东西”

如果你想构建一些东西,比如 web 应用程序或移动应用程序,先学习软件工程,然后再学习机器学习。

太多的模型在 Jupyter 笔记本中生存和死亡。

为什么?

因为机器学习是一个基础设施问题(基础设施意味着围绕你的模型的所有东西,所以其他人可以使用它,你想要查找的热门新术语是 MLOps )。

部署,就像把你的模型交到别人手里一样,是很困难的。

但这正是我应该在那里多呆些时间的原因。

如果我今天重新开始,我会找到一种方法来部署我建立的每一个半体面的模型(除了导致一个值得分享的实验的几十个实验)。

怎么会?

不要害怕让事情变得简单。人们可以与之交互的基本前端远比 GitHub repo 中的笔记本有趣。

不,真的,怎么会?

训练一个模型,用 Streamlit 围绕它构建一个前端应用程序,让应用程序在本地(在你的计算机上)工作,一旦工作,用 Docker 包装应用程序,然后将 Docker 容器部署到 Heroku 或另一个云提供商。

当然,我们在这里违反了使用一些过多工具的规则,但是完成几次会让你思考将你的机器学习模型放到人们手中是什么感觉。

部署您的模型将会提出当您的机器学习模型在 Jupyter 笔记本中生活时您不会提出的问题,例如:

  • 推断需要多长时间(你的模型做出预测的时间)?
  • 人们如何与它交互(也许他们发送给你的图像分类器的数据与你的测试集不同,现实世界中的数据经常变化)?
  • 有人真的会用这个吗?

“我想做研究”

建造东西变成了研究。您会希望您的模型工作得更快、更好。为了实现这一点,你需要研究做事情的替代方法。你会发现自己在阅读研究论文,复制它们并加以改进。

经常有人问我:“在开始机器学习之前,我应该了解多少数学?”

对此我通常会回答,“在我去跑步之前,我应该知道走多远?”

我并不真的这么说,我通常会更友好一些,说一些类似这样的话,“你能解决你目前正在处理的问题吗?”,如果有,你知道的够多了,如果没有,多学学。

顺便提一下,我刚刚订购了机器学习的数学书籍。接下来的一两个月,我会从头到尾读一遍。阅读了网上的免费文本后,它足以涵盖基础知识。

先技能后证书

我已经拿到了在线课程证书。

我发现越多的证书就意味着越多的技能。

我会以 1.75 倍的速度快速浏览讲座,直到结束,通过自动化考试,并在网上分享我的进步。

我为完成课程而优化,而不是创造技能。因为看别人解释比自己学习更容易。

傻逼。

事情是这样的。我为考试学的所有东西,我都忘了。我记得通过实验学到的一切。

现在,这并不是说在线认证和课程不值得你花费时间。课程有助于培养基本技能。但是做自己的项目有助于积累特定的知识(无法教授的知识)。

  • 不要堆积证书,要堆积技能(通过分享你的工作来证明你的技能,稍后会有更多的介绍)。
  • 不要做更多的课程,重复你已经做过的课程。
  • 不要去寻找最新的工具,而是提高你对历史最悠久的工具的使用。
  • 与其寻找更多的资源,不如重读你书架上最好的书。

学习(任何事情)都不是线性的,读两遍同一本书(只要它有一些内容)比增加更多内容要好。

我经常告诉我的学生,尽管当我看到有人分享毕业证书时我感到无比自豪,但我更希望他们而不是完成我的课程,取而代之的是获得他们需要的部分,并将其用于自己的工作。

在你添加东西之前,问问你自己,“我已经从我已经覆盖的内容中吸取汁液了吗?”

我将如何重新开始

首先,比任何资源都重要的是,要摆脱“我学不会”的心态。胡说八道。你有互联网。你可以学到任何东西。

互联网催生了一种新型的狩猎采集者。如果你决定接受挑战,你可以收集资源来创造你自己的道路。

下面的路径也没有设置。它被设计成指南针,而不是地图。你猜怎么着?这些都可以在网上找到。

先打些基础吧。

2020 机器学习路线图摘录。注意:本课程主要关注代码优先,尤其是 Python 代码。它还忽略了移动或嵌入式设备的开发。然而,它包含了足够多的资源来获得一个突出的领域的基础。

初学者之路(6-12 个月以上)

如果我重新开始,我会学习更多与机器学习交织在一起的软件工程实践。

我的主要目标是创造更多人们可以互动的东西。

机器学习的特定部分将是:

除了这些,我还会经历:

这里有很多。因此,为了巩固我的知识,我会使用 Streamlit 或我从 freeCodeCamp 学到的 web 开发技巧来构建 1-2 个里程碑项目。当然,这些会在 GitHub 上分享。

高级路径(6–12 个月以上/持续)

一旦我掌握了一些基本的机器学习技能,我会在它们的基础上做如下的事情。

  • fast . ai 的全部课程——众多深度学习和机器学习技术的实际使用案例。观看一个 fast.ai 讲座变成了我们为一个客户构建的解决方案。
  • 任意一个 deeplearning.ai 的课程——选一个最能激发你兴趣的。称赞 fast.ai 的实践方法与理论。
  • 全栈深度学习课程——这是你要把你已经掌握的机器学习知识和你一直在学习的 web 开发知识捆绑在一起的地方。
  • 复制一篇(或多篇)研究论文。
  • 包含 Scikit-Learn 和 TensorFlow 的机器学习实践书第 2 部分 — TensorFlow 侧重于概念,但概念可以连接到许多不同的应用。

同样,在经历了这些之后,我会通过建立一个人们可以互动的项目来巩固我的知识。

一个例子是由机器学习模型驱动的 web 应用程序。

示例课程

你为大学学位付出的最大的两样东西是责任感和组织结构。

好消息是,你可以自己得到这两个。

我创建了自己的人工智能硕士学位,作为一种责任和结构的形式。你可以做类似的事情。

事实上,如果我重新开始,我会遵循与 Jason Benn 的 更相似的东西,即我如何学习 web 开发、软件工程& ML 。它和我的类似,但是包含了更多的软件工程实践。

如果你能找到一个(*的)社区和其他人一起学习,那是一个很大的奖励。我还是不太清楚该怎么做。

一个十亿美元的想法是开发一个*台,人们可以创建自己的自我驱动课程,并与其他有类似经历的人互动。我在这里说自我驱动是因为所有的知识很大程度上都是自学的。讲师的角色更多的是激发、引导和挑战,而不是传授知识。

有人想建这个吗?

分享你的作品

学习读书就是吸气。建设和创造就是呼气。不要屏住呼吸。

*衡你对材料的消费和你自己的创作。

例如,你可能花 6 周的时间学习,然后用 6 周的时间将你的知识以一种共享工作的形式整合在一起。

你的分享作品就是你的新简历。

在哪里?

GitHub 和你自己的博客。需要时使用其他*台。对于机器学习项目,一台可运行的 Colab 笔记本是你的最低要求。

少了什么?

这里的一切都是以我自己的经历为依据的,我从营养学学位毕业,花了 9 个月的时间在我的卧室里学习机器学习,同时在周末开车去优步支付课程费用,找到一份机器学习工作,离开工作,建立一个机器学习课程。

我没有去编码训练营或大学学习技术技能的经历,因此无法比较两者的区别。

不过,既然我们在谈论代码和数学,它要么有效,要么无效。知道了这一点,你选择的材料的内容并不重要,重要的是你如何学习它。

本文的视频版本

我把过去三年的一些片段放在一起,并重复了几个要点,以配合这篇文章。并非所有的观点都是一样的,但它们都紧扣主题。

在 1000 天里,我设法长出了一些头发和胡须,并发展了编码技能。

我如何使用面向对象的函数来进行机器学习

原文:https://towardsdatascience.com/how-im-using-functional-oop-for-machine-learning-533c1d764628?source=collection_archive---------25-----------------------

我如何以及为什么将面向对象的范例应用于 Julia 机器学习。

这可能是你没有预料到的。

当我面对一些真正的第一世界函数式程序员的问题时,我经常发现自己错过了我最喜欢的面向对象编程语言的一些关键特性,主要是 C++和 Python。这应该是有意义的,因为我真的没有像在面向对象的保护伞下那样长时间呆在功能的保护伞下。不管我错过了哪些功能,我仍然热爱函数式编程范例,这是我一生中唯一的真爱,

朱莉娅

(src = http://julialang.org)

如果你还没听说过朱莉娅,首先,

我很抱歉

其次,Julia 是一种多范例统计编程语言。Julia 结合了 Python 等脚本语言的简单性和 C 或 Lisp 等编译语言的速度和多功能性。Julia 属于函数范式,尽管它支持各种类型的泛型,而且语言本身非常多变,这使得它非常通用。尽管 Julia 多才多艺,我还是要说,它肯定是面向统计程序员的。我这样推断是因为 Julia 不能被编译成可执行文件,事实上它是有功能的,而且典型的 Julia 用户都是某个领域的科学家。

通常,当一种语言被命名为“多范例”时,它仅仅意味着有一些通用的编程概念可能不与特定的范例相关联,但仍然可以以某种方式融入其中。然而,在这种特殊情况下,情况完全不同,因为

我基本上是在茱莉亚写类。

我为什么这么做

Be 在我解释我是如何做到的,或者用这种方式做事的好处之前,我应该先解释一下我为什么想做这样的事情。对于那些不熟悉的人,我是 Julia 的机器学习库的*护者,这个库叫做 Lathe。车床是一个包容性的包,旨在填补朱莉娅的 sklean-like 机器学习的空白,以及实现一些超级酷的神经元链和变压器。Lathe 的主要目标是成为一门伟大语言中如此高水*的最快和最容易的解决方案,许多对机器学习感兴趣的人都注意到了这一点。对于目前为止的模块来说,情况确实如此,而且只会越来越好。

车床:

[## 车床

车床使用更快的方法和简单的方法。使得包装快速、简单且轻便。许多工具和模型…

车床. ai](http://lathe.ai/)

车床如何工作

我讨厌编程的一点是有多少包是令人费解的。对于车床,有一个通用的预测方法,它使用朱莉娅的真棒调度来指导传入的使用。这样做好处是速度快,更重要的是:

可量测性

当显式导入时,可以扩展和操作 Lathe 的功能,将扩展的潜力提高到前所未有的高度。任何最终用户都可以从车床导入某些方法,并使用车床预测方法来预测他们的答案,如果他们愿意,甚至可以修改车床功能。车床是模块化的,零件可以增加和减少。最重要的是,Lathe 提供了不断扩展的统计和预处理库,可以一站式满足您所有的 ML 需求,同时只需要两个依赖项:

  • Random.jl
  • DataFrames.jl

这些问题

鉴于 Julia 的速度和效率,Lathe 能够在计算单个函数中的每个值(包括权重和变量)时,比 Sklearn 等替代方法的性能高出八倍。这很好,因为这意味着使用车床,您可以跳过拟合,并在一行中进行预测,如下例所示:

using Lathe.models: predict, LinearRegression
using Lathe.preprocess: StandardScalar
yhat = predict(LinearRegression(StandardScalar(Xtrain),ytrain),xtest)

很酷,对吧?

它很酷,但也存在一些问题。每次调用 predict 方法时,都需要再次计算权重。这不仅牺牲了模型在每次加载时的准确性,而且还可能是密集的,特别是当车床模型需要部署到 Genie web 应用程序中时,就像本教程中一样:

[## 在 Julia 中用车床 0.0.7 构建管道(不稳定)

数据科学的很大一部分是数据科学的一个子集,称为数据工程。数据工程(DE)包括…

towardsdatascience.com](/building-pipelines-with-lathe-0-0-7-unstable-in-julia-f7ba1850bde3)

所以我的目标就是:保留车床所熟知的一行预测,同时找到一种方法在构建模型时进行计算。这是额外的挑战,试图想出一个伟大的方式来实现我在车床上工作的新的神经网络。让一个神经网络在每次被预测时都重新训练自己肯定不是最佳的。我大脑中被忽视的面向对象部分立即尖叫起来

“初始化功能!”

但是当然,Julia 是一种函数式编程语言,所以没有类,也没有初始化函数,我们可以在任何时候创建类型…

还是有…?

我是如何做到的

笔记本:

[## emmett GB/Emmetts-DS-笔记本电脑

github.com](https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/SUPER STRUCT.ipynb)

当我在网上搜索并翻到了我可信赖的 Jupyter 笔记本上试图找到一个解决方案时,我在 Julia discourse 上发现了一个有趣的线索。这个线程是关于结构内部的函数的,这是一个很酷的特性,实际上你可以在 Julia 中使用正确的语法。它对我来说可能没什么作用,但它确实让我思考…如果我采用那个确切的概念,通过在函数内部创建一个类型并使用函数的开头作为初始化函数来改变它,会怎么样?以下是我跳到笔记本上测试的内容:

function Emmett(age)
    Age = age
    addAge() = (Age+=1)
    ()->(Age;addAge)
end

这个想法是,如果这可行,我们将在返回中得到一个保存数据“年龄”的类型。这不是很特别,但特别的是增加了构造类型 addAge 的属性,它实际上是一个方法。所以本质上,Python 中的等价内容应该是:

class Age:
    def __init__(self,age):
        self.age = age
    def addAge(self):
        self.Age = self.Age + 1

为了测试这一点,我首先构建了自己:

emmett = Emmett(20)

然后试着打印出我的年龄:

println(emmett.Age)

谢天谢地,它回来了:

20

接下来,我测试了这个功能:

emmett.addAge()
println(emmett.Age)

返回了:

21

太好了!

所以现在它工作了!像往常一样,我的第一反应是试图将同样的概念应用于简单的线性回归。我从 Lathe 中复制并粘贴了类型和预测函数,并删除了所有类型断言,结果如下:

功能

function pred(m,xt)
    # a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
    # b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
    if length(m.x) != length(m.y)
        throw(ArgumentError("The array shape does not match!"))
    end
    # Get our x and y as easier variables
    x = m.x
    y = m.y
    # Get our Summations:
    Σx = sum(x)
    Σy = sum(y)
    # dot x and y
    xy = x .* y
    # ∑dot x and y
    Σxy = sum(xy)
    # dotsquare x
    x2 = x .^ 2
    # ∑ dotsquare x
    Σx2 = sum(x2)
    # n = sample size
    n = length(x)
    # Calculate a
    a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx^2))
    # Calculate b
    b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ^ 2))
    xt = [i = a + (b * i) for i in xt]
    return(xt)
end

类型

mutable struct LinReg
    x
    y
end
# (Our Normal type (mutable so we don't tear our hair out))

做线性回归

首先,我必须修改预测函数,以在最后切断 for 循环,并且只在从简单的线性回归公式返回包含 a 和 b 的数据的类型之前进行计算。

显然,正是在这一点上,我,一个 20 岁的男人,决定称之为超级结构。不确定名字是从哪里来的,但是我喜欢!幸运的是,这是一个非常简单的修改,只删除了一行,添加了一行。这很棒,因为这意味着在我老得不能用键盘打字之前,改变车床的每一个功能都不会花时间。接下来,我决定继续尝试构造类型,而不是创建预测函数。

这就是问题所在。

这种非常非传统的方法使得函数能够保存方法和数据,而不是结构(是的,这是一个很大的漏洞。)我将谈到为什么这是一个问题,而且是一个相当大的问题,这个问题可以被取消,但需要对车床进行大的更改,但只有在我们从这个东西中得到一个预测之后!

埃米特在他的笔记本上,2020 年(彩色)

最终有了一个保存我们需要插入斜率公式的值的“类型”后,我做了一个快速的完整性检查,非常快速地检查了 a 和 b 的值:

println(m.a)
println(m.b)

正如所料,它返回一个数字,所以我继续使用预测函数:

function predict(m,xt)
    xt = [i = m.a + (m.b * i) for i in xt]
    return(xt)
end

然后编造了一些数据,我可以用简单的比率来跟踪这些数据,以便很容易看出模型是否正常工作。

x = [5,10,15,20,25,30]
y = [10,20,30,40,50,60]
xtrain = [10,15,20]

看数据,一个准确预测的输出应该是[20,30,40],果然…

有用!

好处

不用说,避免每次模型调用的再培训应该是优先考虑的事情。我认为写一个单独的完全可选的 fit 函数可能更好,但是这将需要更多的类型,并为所有类型分派,并且肯定会使整个系统变得不必要的复杂。此外,使用这种方法实际上会节省大量内存,因为数据不一定需要复制到这些新类型中(因为我们只是使用了权重,或者在本例中是 a 和 b)

(大)反面

这种方法会破坏车床使用朱莉娅调度。为了使用分派,我们需要知道通过方法传递的结构的类型。假设这不是一个 struct,并且被赋予了一个随机的名字(至少据我所知是这样的),那么在这个方法中使用 Julia 的 dispatch 是完全不可能的。不过,隧道的尽头有一线光明,因为这使得 predict 方法成为函数的一个属性成为可能,反过来,我们将能够做 Model.predict(parameters)。

因此,带着这个新发现的想法,我决定返回并修改函数,以包含预测方法:

果然,成功了!

但是一行程序呢?

美味的肉汁,让我兴奋不已!

结论

你真的每天都在学习新的东西,实验是编程世界的一半乐趣。我很想得到一些反馈,您更喜欢使用哪个版本,是带有可选 fit 的 dispatch,还是 hacky 面向对象的版本?我非常惊讶和兴奋,朱莉娅能够这样做,以满足我的需求,我希望这种发展是一个陡峭的优势超过以前的方式,如果它实际上是车床的未来!

我如何使用智能手表传感器来防止面部触摸

原文:https://towardsdatascience.com/how-im-using-smartwatch-sensors-to-limit-covid-19-infection-51abe04f81f9?source=collection_archive---------43-----------------------

卢克·切瑟在 Unsplash 上的照片

一个值得追求的想法?

如果自 2020 年 2 月以来,你每天洗手的次数翻了两番,请举手。

我不能代表你在世界的哪个地方,但是在英国,人们非常重视洗手的频率。

已经有政府支持的关于洗手功效和一般手部清洁的教育活动。

消毒站在伦敦几个中心交通枢纽很常见。然而,公众仍不愿回归常态,这是可以理解的。

交通机构甚至正在考虑免费交通倡议,以鼓励公众冒险返回城市并使用交通设施。

照片由梅丽莎·让蒂Unsplash 上拍摄

但似乎不管我怎么洗手、消毒和擦洗;当我步入公共环境时,我仍然会*心翼翼地把手放在嘴巴、眼睛和鼻子附*。

自二月以来,有大量文章建议人们如何避免触摸自己的脸;见此处,见此处,见此处

来自健康组织和专家的建议是有益的,值得纳入你的日常生活中,以形成一种习惯。社交距离、手肘问候和良好的手部卫生现在已经根植于我们的日常生活中。

但是如果你像我一样是人类,有时你会忘记。

我们忘记了要谨慎。

提醒我一下

Unsplash 上由尹新荣拍摄的照片

白天,我是一名计算机视觉工程师,晚上,我修补各种形式的技术。

我晚上的大部分时间不是写关于人工智能的话题,就是埋头做兼职项目。

不管什么时候,我的智能手表都会振动。消息、事件、通知和警报都会在我的智能手表设备上触发轻微的轻推,仿佛在尖叫"注意!”。

在与我的一些聪明的朋友讨论过 over Zoom 之后,我建议修改一些代码,创建一个智能手表应用程序,它可以提醒我停止触摸我的脸,或者至少提醒我*心面对面的接触。

想法 相当简单。如果我的手表臂靠*或接触到我的脸,我的智能手表设备会发出轻微的震动。

我的目标是有一种提醒的形式,它不依赖于我不断保持警惕和谨慎的能力。

技术

照片由克莱门特 HUnsplash 拍摄

智能手表挤满了传感器、加速度计、陀螺仪、气压计、GPS 等。

这些传感器接收的数据提供了关于你的身体状态、环境和运动的数字信息。

智能手表检测运动的能力对大多数读者来说并不奇怪,尤其是当智能手表通常会告诉你一些信息,如心率、步数、睡眠时间、水合程度等。

使用一些软件魔法和我生疏的应用程序开发知识,我设法组装了一个实际的智能手表应用程序,当我触摸我的脸或正要触摸时,它可以给你一个轻推。

我称之为 Moretion (婚姻之间的话多而动)。

让我解释一下它是如何工作的。

使用启发式

智能手表传感器不断喷出数字数据。

下面是来自传感器的数字数据的一个子部分的图像。

只是一堆数字。(图片由作者提供)

上图中的数字可能对你来说没有多大意义,但是当我们从这些数字中绘制一些图表时,我们得到的图像似乎提供了更多的意义。

绘制加速度计数据

陀螺仪数据绘制

你可能会在上面的图表中注意到一些重复的模式——请随意再看一遍。

你所观察到的是我将手移向和移离我的脸很多次。

为了检测我的手何时将要或已经触摸到我的脸,我只需选择一个阈值,并让智能手表在达到或超过阈值时振动。

这个简单的想法非常有效,我将很快讨论更多的发现,但让我与你分享这个项目的另一个有趣的方面。

使用机器学习

如果我不使用一点我的机器学习知识,我就不会公正地做这个实验项目。

大多数机器学习应用程序或“AI”都是由神经网络驱动的。一群聪明的研究人员在某种程度上用一些巧妙编写的算法复制了我们大脑中神经元之间的相互作用。

神经网络是很好的识别模式,人类也擅长于此;这就是为什么你会很快注意到上面图片中图表的振荡模式。

递归神经网络(RNN)用于检测和预测时态数据中的模式,就像前面显示的图像中的数字一样。

时态数据通常是按顺序构造的,这使得 rnn 可以很容易地从数据中提取特征——还有更多的内容,但超出了本文的范围。

未来版本的 Moretion 应用程序将实现这些神经网络。Moretion 将基本上能够预测手臂到面部的移动,并在你完全完成移动之前给你发送一个轻推。

结果

Skagen 的 Falster 3

我一直在谷歌搭载 Wear OS 的 Falster 3 智能手表上试验性地使用 Moretion。当我在伦敦地铁、火车、公园等公共场所时,我通常会打开这个应用程序。

毫无疑问,我的智能手表提醒了我,我应该限制摸脸的次数。有时我甚至会忘记我已经打开了 Moretion,当我的智能手表发出' bzzz bzzz' 的轻推时,我会大吃一惊。

如果你有一个支持 Wear OS 的智能手表,那么如果你好奇的话,你可以试试 Moretion。该应用程序仍处于试验阶段,我将很快对其进行大量更新。在这个时间点上,它是没有形状或形式的依赖方法,你应该始终保持良好的手部清洁。

你可能已经注意到了 Moretion 的一个问题。

Moretion 只轻推佩戴智能手表的腕臂。当你用另一只手臂触摸你的脸时,你没有受到轻推或振动。

如果有足够多的人对这个项目感兴趣,我将很快探索如何解决这个问题。我已经有一些想法了。

未来的发展

在这方面还有很多工作要做。

以下是我将探索的几个工作和研究领域:

  • ****电池优化:从多个传感器读取数据对电池来说非常昂贵。我已经将 Moretion 的运行时间限制在几个*时,并使应用程序能够作为后台进程运行。我可以利用很多电池优化技术来降低电池消耗。
  • 苹果,Fitbit: 我也在开发苹果版的 Moretion,通过一些额外的工作,Fitbit 版本肯定可以开发出来。我开发了一个能在苹果和 Fitbit 智能手表上运行的 Moretion 版本。
  • NHS(国民健康服务)批准:在经历了一些广泛的研究工作和调查后,如果使用 Moretion 来限制面对面接触的数量有好处,那么我将探索使它成为官方批准的 NHS 应用程序的可能性。这完全取决于研究工作和更多的使用结果。
  • ****研究/调查:检验 Moretion 智能手表应用的有效性需要付出相当大的努力。这项工作将涉及用户在使用智能手表应用程序时的测试和监控。

信息和联系方式

更多标志

如果你有一个带 Wear OS 的智能手表,请随意试用 Moretion

联系我 讨论其他询问或您的体验。

LinkedIn 上与我联系。

你的文本数据中的单词有多重要?Tf-Idf 答案…

原文:https://towardsdatascience.com/how-important-are-the-words-in-your-text-data-tf-idf-answers-6fdc733bb066?source=collection_archive---------15-----------------------

作者图片

我们人类经常处理文本数据。文本数据主要来源于语言。语言技能是我们在婴儿时期就开始练习的👶。口语大多被转换成音频形式的数据🔉,文本📃或者很少作为图像🔡。从技术角度来看,文本数据可能以不同的形式出现,如新闻文章📰,书籍📚,网页🌐,评论💬、软件代码🖥、计算机系统日志等等。不管是什么形式,这些文本数据都有自己的结构特征,这些特征是由语言(或语法)定义的。此外,在文本数据中存在语义特征(含义),这可以导致识别甚至跨语言的文本片段的相似性。随着科学领域中自然语言处理(NL 语言处理( NLP )和信息处理(IRRIR)的发展,文本表示和文本相似性成为潜在的研究领域。文本表示主要用于,

  1. 机器翻译—自动将文本从一种语言翻译成另一种语言。
  2. 文档聚类——基于结构和/或语义相似性对文本文档进行分组。
  3. 主题检测——识别大型文本语料库的主题。
  4. 文本摘要。
  5. 问题回答。

以及更广泛的领域,如信息检索和文档排序。

代表权问题…

即使一些与文本数据相关的用例如文档聚类可以通过考虑数据的文本相似性(通过使用编辑距离Jaccard 距离等)来实现。),对于自然语言处理( NLP )和信息检索(IR)中最复杂的用例,文本数据使用向量表示。这是因为大多数机器学习算法都很聪明,可以处理数字数据🧮.例如,尽管图像被视为*面中颜色组合的集合,但默认情况下,它们被表示为包含所有图像信息的数字矩阵,这些信息很容易被计算机处理。但是,在文本数据的情况下,识别有意义的表示并不那么简单。

过去引入了几种文本表示技术。其中有一键编码n-gram 模型词袋模型神经词嵌入。这些技术各有优缺点。更好的做法是挖掘您的用例,并选择最佳选项。重要的是要理解,表示是您将文本数据呈现给算法的方式。因此,您必须注意选择最合适的数据表示技术,以便您的模型看到它应该看到的数据。

词汇袋👜模型

一种流行的文本表示技术是Bag-of-Words(BoW)模型。在单词包中,模型文本或文档通过对单词的(无序集合)进行建模来表示。这个单词包不算单词在文中的位置、语法或者结构。它只是统计单词在目标文本中的出现频率,并将这些单词放入一个包中。词在文本(句子或文档)中出现的频率是用于词袋模型的特征。

让我们看看如何为文本语料库创建一个单词包模型。

考虑以下文档集( D )(这里,我们将句子作为文档)。我们的目标是生成一个数字表示📊对于这些文档中的每一个。

鲍勃比其他人都聪明

约翰喜欢在晚上探索星星

文件三:天空中阳光灿烂

文件四:夜空布满了星星

第一步:清理✂️,预处理数据

在进行表示建模之前,我们应该明白原始数据总是脏的,我们必须在使用之前清理它们。

首先,我们将所有的单词都*写,以避免将不同大*写的相同单词识别为不同的单词。例如,语料库中的单词“sky”和“Sky”应该被理解为一个单词。

注意:我们可以使用一些其他的文本前置技术,比如词汇化(将单词转换成它们的基本形式(" shine "、" shining ' "、" shined "-">" shine "),去除停用词,比如" is "、" the "和" in ",等等。但是为了简单起见,为了强调 Tf-IdfIdf (稍后将详细讨论)组件的威力,我们只坚持使用*写字母。

第二步:创建单词包

完成前面提到的预处理步骤后,我们的四个文档将是:

鲍勃比其他人都聪明

约翰喜欢在晚上探索星星

文件 3 :天空中阳光灿烂

文件四:夜空布满星星

现在,我们可以创建我们的 👜单词如下。

所选语料库的单词包

文本表示的 Tf-Idf

Tf-Idf(Termffrequency—Inverseddocumentffrequency)是一个词袋模型,它在捕捉文本中最重要的词方面非常强大。 Tf-Idf 背后的概念可以通过术语频率( Tf )和逆文档频率( Idf )来理解。从 TfIdf 表示生成的集合表示被称为 Tf-Idf ,它是一种强大的表示文本数据的方式。让我们进入 Tf-Idf 背后的理论。

术语频率(Tf)

顾名思义,术语频率给出了文档中出现的与 BoW 相关的术语的计数。术语频率是术语 t 和文档d的函数

我们现在可以为每个文档生成一个 Tf 向量。每个 Tf 向量是的尺寸(在我们的例子中是 19 的尺寸)。如果目标文档在包中没有术语,则该*度将变为零,因为上述等式的分子变为零。下表中的文档列表示每个文档的 Tf 向量。

关于单词包中的术语(t)的文档(d)的 Tf 表示。

我们可以看到,这个 Tf 表示给出了术语在文档中相对于给定的 BoW 的出现程度。但是这足以决定两个文档之间的相似性吗?让我们看看…考虑一下文件 1文件 2Tf 表示。我们可以看到,只有术语在这两个文档中是通用的。因此,我们的向量空间的“”-*度将显示文档 1** 和文档 2 具有相似度(即使所有其他*度将显示这两个文档不相似)。这是真的吗?实际上不是。它们有完全不同的意思。这是作为文本文档的数字表示的术语频率的缺点。词频并不强调文字在文本中的重要性。这就是 Idf 发挥作用的地方。**

反向文档频率(Idf)

逆文档频率( Idf )是一个术语相对于文档语料库的唯一性的度量。这里的想法是,出现在语料库的大多数文档中的术语不会向目标文档添加特殊信息。逆文档频率是为您的 BoW 中的每个术语定义的。

Idf 能够在 BoW 中强调术语的独特性或重要性。如果一个术语出现在大多数文档中,它就不是唯一的,并且 Idf 等式的分母会更大。因此,分数的对数将更*,Idf 值也将更*。一个独特的或罕见的单词将出现在较少数量的文档中,并且其 Idf 值将较大。让我们看看我们的的 Idf 值是多少。

BoW 中术语的 Idf 值

我们可以看到,项的 Idf 变为 0。这是因为它出现在所有文档中,并且没有给目标文档添加独特的含义。同样,术语 的 Idf 权重也很低。我们可以看到,像 bob、explore 这样在语料库中只出现在一个文档中的单词,由于其唯一性,具有更高的 Idf 值。

请记住,像 、【of】、这样的术语并没有给文件增加特定的含义。尽管我们在这里发现它们是独一无二的,但它们并不存在于现实世界中。为了简单起见,我们选择将这些术语( the,in,of,to )保留在 BoW 中。但是在实际用例中,我们在前置阶段省略了这种停止字,正如我前面提到的。**

天哪…!那么什么是 Tf-Idf 呢…

对…我们已经了解了 Tf-Idf 背后的理论。Tf-Idf 无非是 Tf(t,d)Idf(t,D) 的乘积。

我们可以通过上面的等式为每个文档生成 Tf-Idf 矢量表示,如下表所示。

使用 Tf 和 Idf 计算的 Tf-Idf 表示。

所以,实际上, Tf-Idf 可以通过对所选语料库的词唯一性加权的词频率来理解。在目标文档中几乎随处可见而在语料库中的其他文档中找不到的术语在目标文档中具有高度的唯一性,因此在该文档中具有高 Tf-Idf 权重。

有点文字相似…

为了理解 Tf-Idf 作为文本表示的用法,让我们检查一下语料库中文档之间的相似性。这里,我们要考虑[余弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity)。下表显示了每个文档对之间的余弦相似性。

文档间的余弦相似度。

通过观察余弦相似性,我们可以观察到文档 1* 和文档 2 不再相似,因为 Idf 处理了在每个文档中出现术语的问题。但是我们可以看到文档 1文档 3 有 0.012 的相似度。这是因为它们有一个共同的术语 就是 。尽管这些文档之间存在相似性,但 Tf-Idf 已设法通过 Idf 加权来降低相似度。文件 1文件 4 的相似性表现相同。文档 3文档 4 都是关于 天空 的,因此相似度稍高(0.097)。文件 2文件 4 是关于 星星夜晚* 的。这种相似性反映为 0.1288,这是所有相似性中最高的。****

我们可以清楚地看到,Tf-Idf 在将文本数据表示为向量方面非常有用,它有可能强调单词的重要性,并相应地对独特和信息丰富的单词进行加权。

Tf-Idf 有几种变体,可以在各个方面对其进行改进。你可以通过跟踪这个找到它们。

我希望你通过阅读这篇文章了解了 Tf-Idf 的基本结构和用途。

Tf-Idf 的缺点

尽管 Tf-Idf 是如此强大的表示文本数据的技术,它仍然是一个 BoW 模型。因此,Tf-Idf 不计算文档中单词的位置。这可能会导致 Tf-Idf 对您的文本数据给出错误的解释。

举个例子,

文献 1 :鲍勃比爱丽丝聪明

文件二 :爱丽丝比鲍勃聪明

具有相同词频的相同单词集({ 'bob ' ',' is ',' clever ' ',' than ' ',' alice'' }),但它们给出不同的含义。但是,Tf-Idf 作为 BoW 文本表示模型,将为两个文档提供相同的表示。在 Tf-Idf 模型中可以看到的另一个主要缺点是它消耗了大量的内存和处理能力。

有一些文本表示技术,如神经嵌入,在生成向量表示时计算单词的位置。我们将在另一篇文章中讨论它们。

在那之前,祝你阅读愉快...😀

领域知识在数据科学中到底有多重要?

原文:https://towardsdatascience.com/how-important-domain-knowledge-really-is-in-data-science-19d833d98698?source=collection_archive---------60-----------------------

看看来自美国的招聘信息,不仅仅是。

美国宇航局在 Unsplash 拍摄的照片

Jeremie Harris:在某种程度上,这就像数据科学家或数据分析师必须像一名私家侦探,而不仅仅是一名技术人员。

伊恩·斯科特:“ 嗯,肯定的。我并不反对 Kaggle,但当人们说 Kaggle,我已经完成了这个比赛,我有点翻白眼,因为他们只关注了 10%的问题。(… ) 这些项目中有很多都夭折了,因为 90%的其他事情都没有做好,包括利益相关者的结盟

读到这里,你可能会想,来自德勤加拿大公司的 Omnia AI 首席科学官 Ian Scott 可能会认为参加 Kaggle 竞赛毫无用处。再想想。这只是摘自 Jeremie Harris 为 TDS 播客(14 分钟)对 Ian 的采访,并没有说明更大的画面。我将在文章中进一步讨论上下文的重要性以及脱离上下文获取信息会发生什么。

[## 德勤的数据科学

伊恩·斯科特在 TDS 播客上

towardsdatascience.com](/data-science-at-deloitte-133457084a5)

通过这篇文章,我试图找到“领域知识对数据科学家到底有多重要?”这个问题的答案,这是我在听这个采访时想到的。为此,我不仅查看了通过他们的讨论提供的见解,还查看了美国数据科学家的招聘信息,医疗保健、金融服务、零售、房地产、政府管理、市场研究、信息技术等领域。

上下文在数据科学中的重要性

在采访中,Ian 谈到了数据中可以分析并提供有价值信息的东西,以及数据中没有捕捉到的东西,因此在构建模型时不会考虑这些东西。数据科学家如何处理这些情况?如何设计特征以使所有相关信息和上下文数据都包含在模型中?

这就是领域知识发挥作用的地方。Ian 提到了一种方法,他们有时使用这种方法来更好地理解正在解决的问题和期望的输出:那就是将他的团队成员和客户放在同一个房间几个*时,以便他们可以一起工作来理解真正的问题,理解共享的输出,并共同构建上下文。

这里的关键词是语境。伊恩:“数据胜过背景,胜过算法。算法是我考虑的第三件事,不是第一件事。你有什么数据,给我 数据的上下文数据里的东西,那是关于我在数据 里没有看到的数据。(第 7 分钟)

对此的一种解释是:

  1. 数据是起点,因为我们最初会检查哪些数据可用,我们已经有了哪些数据。
  2. 语境。有人说 语境和数据本身 一样重要。为此,我们必须超越数据向我们展示的内容,甚至着眼于政治格局的变化等方面。或者,正如我在独立评估顾问 Michael Bamberger 关于“大数据时代的评估”的演讲中听到的一个例子,从手机应用程序中收集的信息可能与在某些领域找到关于女性的有用见解无关,因为她们对手机的访问可能会受到其伴侣或其他家庭成员的某种限制。这就是为什么我们需要很好地掌握我们希望通过数据科学解决的问题的背景因素,这甚至可能影响结果。另一个例子是,只看伊恩·斯科特采访中的某些信息。如果你只看下面的陈述,那肯定是。我并不反对 Kaggle,但当人们说 Kaggle,我已经完成了这个比赛,我有点翻白眼。”,没有听完整个采访,他/她会认为 Ian Scott 认为做 Kaggle 比赛是没有价值的。相反,在我看来,他只是想强调光有技能是不够的,还有他们的思*方式和寻找简单答案的能力——“我们围绕人们的思*过程提出很多问题,而不是他们所知道的”。这就是断章取义的意思,有时会非常有害。
  3. 算法:一种现在充分利用可用数据及其上下文的算法。
  4. 结果的解释和展示。我加入第四个元素是因为我相信,在这里,语境应该再次占据中心位置。结果的解释和展示应根据利益相关者/客户的需求进行。数据科学家需要能够以适当的方式向非技术受众传达他们获得的结果。

我记得在我的第一份评估工作中,我不得不快速学习许多领域特定的知识。尽管我是该领域专家团队的一员,但我需要知道他们在谈论什么,并能够建立一个适合特定环境的评估模型。所以,除了完成这个任务,我尽可能多地记录自己的相关话题。

后来,在另一个案例中,当我必须为一个医疗保健项目的评估添加意见时,我觉得在那个领域有经验的评估者比我更有优势。是的,我知道评估的方法,但是我不知道这个项目的历史和它的特殊性。然而,团队的结构和动力是不同的,我期望的输入是技术性的,而不是特定于主题的。在团队内部,我们相互补充,并设法提供所需的产出。

美国数据科学工作调查

现在,让我们看看 LinkedIn(8 月 16 日和 17 日)上来自不同领域的一些数据科学职位发布。

我们将从医院和医疗保健开始,这是我最希望需要领域知识的领域。

医院和医疗保健

照片由卡米洛·希门*斯Unsplash 上拍摄

为了这个话题,我查看了各个经验层次的招聘信息:实习、入门级工作、副/中高级职位以及高管和主管级别。

最高资历级别(高管和董事),只有五份公开招聘信息,其中三份将之前的医疗保健经验和知识列为必备条件,一份提到这是潜在求职者的优势,另一份则完全没有提到。

对于助理/中高级水*,我查看了过去 24 *时的帖子,以便了解需要多少领域知识。在 10 个相关的工作公告中,6 个明确要求以前在医疗保健行业的经验,而 2 个认为这是更好的或更好的,另外 2 个实际上来自健康、保健和健身,根本没有要求领域相关的知识。

当涉及到那些要求以往经验的人时,要求听起来如下:“熟悉医疗保健环境和 EHR 数据”;“熟悉基因组学和医学影像数据”;“一年或一年以上的医疗保健工作经验,最好是在医疗保健提供商或卫生系统”;“2 年以上医疗保健数据工作经验(EHR/EMR 医疗保健信息系统优先)”等。

关于初级职位,情况与高级职位类似。有些帖子要求以前的经验,有些不要求。例如:“必须了解医疗术语、概念和价值链,具备一个或多个关键医疗领域的中级知识,例如客户、顾客、产品、提供商和/或索赔。”

当谈到实习的时候,事情就变了,因为没有提到以前在医疗保健领域的经验或教育背景。除了通常的技术技能,有些人要求对行业或他们的使命有真正的兴趣。

金融服务

肖恩·波洛克在 Unsplash 上拍摄的照片

在这种情况下,即使我对金融服务行业的职位进行了筛选,LinkedIn 也显示了其他行业的结果,如零售、员工招聘或信息技术。然而,从我设法看到的帖子来看,我注意到有些工作确实需要以下条件:产品设计、提供商业见解的经验、开发数据产品的热情,尤其是在房地产/金融领域;证明有能力将发现应用于业务问题,以提高收入和利润;敏锐的商业头脑——基于对运营、财务和组织需求和能力等的理解,利用商业判断来制定战略。在这种情况下,与零售业和房地产业一样,一些招聘信息要求有商业背景下的工作经验,或者提到这一点更好,但也有一些工作只要求必要的技术要求。

政府管理

约书亚·苏考夫在 Unsplash 上的照片

这里有两种类型的招聘信息:不需要专业知识的,也有要求专业知识的。此外,他们可能需要成为美国公民,并通过背景调查,这是意料之中的,因为雇主是政府机构。

不太可能要求特定领域知识的行业,因为它们出现在 LinkedIn 上:人员配备和招聘、信息技术、互联网、市场研究、营销&广告、媒体制作。

结论和关键要点

领域知识无疑有助于更好地理解数据和问题的背景。在某些情况下,除了技术技能之外,数据科学家可能还需要强大的主题专业知识,但在其他情况下,也取决于行业或他/她工作的组织的结构方式,这可能不一样。在 OMNIA AI (Deloitte Canada)的案例中,尽管数据科学家除了技术技能外,还需要具备某些软技能,但他们在更大的团队中工作,能够利用团队成员甚至客户的专业知识。在某些情况下,就像在评估中一样,团队可以有很大的用处,科学家不知道的数据可以在主题专家的帮助下得到解决。

当谈到数据科学职位发布时,其中一些确实要求以前在特定领域工作的经验,但不是所有的。有些行业对专业知识的要求更高(如医疗保健),有些行业则更需要专业技能(如市场调研、营销&广告等)。].其他人,不知何故处于中间,要求以前在商业环境中的经验,或认为这是更可取的。

与实习和入门级工作相比,高级工作更可能要求特定领域的知识,这是可以预料的。然而,这并不是在所有情况下都会发生。这也可能是因为某些行业的公司现在才开始将数据科学家加入他们的团队。

在准备成为一名数据科学家的时候如果你还没有确定你希望从事的领域,也试着确定一下,看看雇主对求职者有什么要求。列出这些要求,看看你如何满足它们,并制定一个磨练必要技能的计划。此外,尝试在你的目标领域做项目,并提供已经与某些潜在雇主相关的解决方案。

来源:

  1. “德勤的数据科学”,Jeremie Harris 为 TDS 播客采访 Ian Scott,https://towardsdatascience . com/Data-Science-at-Deloitte-133457084 a5
  2. *美国数据科学家 LinkedIn 招聘信息,【https://www.linkedin.com/ *
  3. FLOWINGDATA,文章“为什么上下文和数据本身一样重要”,采访天普大学数学教授 John Allen Paulos,2010 年 5 月 21 日,https://flowing data . com/2010/05/21/Why-context-is-as-important-the-data-self/
  4. IEG 全球事件:重新布线评估方法,2020 年 6 月 3 日,Michael Bamberger 关于“大数据时代的评估”的演讲,https://www.youtube.com/watch?v=bFRzcaDc0lU&list = pl 23 ljg-ncg gf _ X-90O _ wht HSI 8 xvu 6 HN&index = 37&t = 3214s

注入随机性如何提高模型精度

原文:https://towardsdatascience.com/how-injecting-randomness-can-improve-model-accuracy-11cdc04b3eeb?source=collection_archive---------49-----------------------

来源。图片免费分享。

自举聚合的魔力

装袋,或者说 b ootstrap ag 种族隔离,是机器学习中的一个独特想法。这个概念假设,在不增加任何新数据或知识的情况下,人们仍然可以简单地通过增加随机因素来提高模型的准确性。这个想法是训练一个模型集合,其中每个模型都根据数据的子集进行训练,然后汇总每个模型的预测。

因为每个模型都是在随机选择的大多数数据子集(通常在 60%到 75%之间)上训练的,所以数据中显然会有明显的重叠。然而,根据这个简单的想法,像 Random Forest 这样的 bagging 模型几乎普遍比它们的非 bagging 模型表现得更好,在这种情况下就是决策树。然而,没有添加数据——现有数据只是简单地结合了随机性——那么简单的装袋概念怎么会导致模型性能如此之高呢?

作者创建的图像。

首先,重要的是要对装袋减少方差这一事实有一个直观的理解。虽然在少数情况下这不是真的,但一般来说这是真的。作为一个例子,看看从 x 的正弦波-值 0 到 20,随机噪声来自正态分布。显然,这是非常嘈杂的数据,像决策树这样的高方差算法可能会陷入高度的随机性中,因此泛化能力很差。

作者创建的图像。

另一方面,考虑一个袋装模型。为了产生这种可视化,绘制了十条独立的曲线,每条曲线包含随机选择的百分之二十的原始数据。然后将这些点相对于其周围点的值进行*均,以形成“袋装”曲线,这大大降低了方差和噪声。

作者创建的图像。

显而易见的是,由于随机性,自举人为地“消除”了巨大的差异。当随机性加入到系统中时,正随机性和负随机性相互抵消。通过数据的重复重叠,高方差被剔除,更清晰的关系被支持和揭示。

由于模型的均方误差(MSE)等于 v + b ,其中 v 代表方差, b 代表偏差,自然,如果方差降低,MSE 也会降低。在某些情况下,当方差降低时,偏差会增加。由于 MSE 权重的计算是偏差的*方,而方差只是偏差本身,在这种情况下,装袋实际上会降低性能。

然而,在大多数情况下,减少方差而不相应增加偏差是可能的。这可以用正弦波的例子来说明,其中方差减*了,但是关系只是变得更清楚,而不是变得更有偏差。

尽管对装袋成功的方差减少的解释是直观的并且被广泛相信,但是它还没有被经验证明是尽可能准确的。bootstrap aggregating 成功的另一个解释是,打包等于影响力。这个想法的中心概念围绕着杠杆的想法,这是一个点对模型有多大影响的度量。因此,高杠杆点的存在会显著影响模型,例如,异常值对线性回归系数的影响。

来源。图片免费分享。

如虚线回归所示,不良的杠杆会使模型发生负向倾斜,而良好的杠杆可以稳定该线。不良杠杆的问题是,即使一条线不适合大多数点,指标也会因为不良杠杆的影响而改善。

在大多数情况下,杠杆有一个坏的影响,衰减杠杆可能会减少模型中不必要的方差。一个不稳定的估计值可以被定义为一个预测值,其中有许多非常有影响力的点,而自举具有降低整体杠杆的效果。当大多数杠杆点都有负面影响时,这是积极的。在某些情况下,已经表明装袋可以提高性能,即使在数学上方差没有减少的情况下,当大多数杠杆点对性能为正时也是如此。

因此,差异只是降低杠杆的下游效应。Bagging 工作得如此之好,是因为它通常通过增加随机性来减少影响,这是用正弦波观察到的。这也是为什么在杠杆点普遍影响不大的情况下,装袋表现不佳的原因。这是一个强大的概念,主要应用于基于树的方法,因为它们往往有许多 bagging 试图减少的高影响力的杠杆点。在许多方面,bagging 解决了树方法的记忆和过拟合问题,同时保留了它的许多优点。

如果你喜欢,

你可能会喜欢我的其他一些机器学习文章。

[## 真正的人工智能:理解外推 vs 概括

机器学习模型不需要智能,它们的大多数应用都需要执行任务,如…

medium.com](https://medium.com/swlh/real-artificial-intelligence-understanding-extrapolation-vs-generalization-b8e8dcf5fd4b) [## 每个人的 GANs

革命性人工智能概念的直观解释

medium.com](https://medium.com/analytics-vidhya/gans-for-everyone-an-intuitive-explanation-of-the-revolutionary-concept-2f962c858b95) [## 批量规范化:深度学习的最大突破

它是如何工作的——又是如何如此有效的?

medium.com](https://medium.com/analytics-vidhya/batch-normalization-the-greatest-breakthrough-in-deep-learning-77e64909d81d)

Instacart 如何利用数据科学解决复杂的商业问题

原文:https://towardsdatascience.com/how-instacart-uses-data-science-to-tackle-complex-business-problems-774a826b6ed5?source=collection_archive---------6-----------------------

斯科特·沃曼在 Unsplash 上的照片

买杂货从来没有这么复杂

Instacart 是一半美国家庭用来从他们最喜欢的杂货店如 Costco,Wegman's,Whole Foods,Petco 等购买食品的公司,甚至不用离开房子。

其独特的商业模式使其成为一个迷人的案例研究,研究如何在行业中使用数据科学来解决棘手的商业问题。

作为一名数据科学家,您已经学习了算法和技术,但是您如何将它们应用到企业界呢?在企业界,它们可能会带来或损失数百万美元。在本文中,我们将了解 Instacart 如何使用数据科学方法来解决其极其复杂的后端系统背后的进口业务问题。

Instacart 的商业模式

首先,介绍一下 Instacart 是如何运作的。

Instacart 做了很多工作来确保客户的用户体验是流畅的。很简单。

  1. 下载 Instacart 应用程序。
  2. 选择一家商店。有很多商店——全食超市、好市多超市、Petco 超市、威格曼超市等。
  3. 从商店的库存中,选择要添加到购物车中的商品。
  4. 选择一个一*时的时间窗口,在此期间,您希望您的杂货可以在下一个*时内送达。

由 Andre Ye 创作的图形。

不到一*时,你的杂货就送到了你家门口。UX 非常简单,也很容易导航。

购物者的体验稍微复杂一点。

  1. 在 Instacart 应用程序中,购物者正在轮班,当订单进入系统时,他们有机会确认订单。
  2. 他们开车到该订单的商店,并出示了您想要购买的商品列表。
  3. 当他们找到商品时,他们拿起商品,并扫描条形码以确保它是你想要的产品的准确版本。
  4. 他们会结帐后开车到你的地址给你送货。

由 Andre Ye 创作的图形。

这个市场有两个明显的方面——购物者和客户。然而,Instacart 实际上是一个四边市场(你能说出另外两个吗?).

双边市场?由 Andre Ye 创作的图形。

Instacart 还与产品广告商和商店合作。四方中的每一方都以某种方式与其他三方互动。每一个箭头都是数据科学加强它的机会。

见解:杰里米·斯坦

Instacart 通过送货费赚钱——例如,支付几美元获得送货,或者购买快递会员资格(每年 150 美元,不限次数)。*费和服务费归购物者所有,这有助于支付劳动力成本,但这还不够。Instacart 也通过与宝洁(Procter and Gamble)等公司和广告商的合作关系赚钱——insta cart 上约 30%的购买都是广告产品。这是数据科学的丰富脉络。

该公司还从商店获得相当大一部分收入——如果 Instacart 能够大幅提高某家商店的流量,该商店可能会愿意为此付费。

然而,Instacart 有很多成本,如交易、信用卡处理和保险。然而,最大的成本是购物者购买食品杂货和开车所花费的时间——所以 Instacart 的主要目标是让系统更有效、更快地运行,以便获得更多利润。

  • Instacart 表示,他们的效率比开始专注于优化后端效率之前提高了约 40%。
  • 快递客户*均每月花费约 500 美元——经常使用这项服务的人。
  • 90%的客户都是回头客。

Instacart 独特的商业模式让数据科学成为关注的焦点,有助于提高利润,并让其四边市场中的四方都更开心——让我们来看看 Instacart 面临的一些数据科学问题和挑战。

方差螺旋与预测。

Instacart 在路上运行——所以当旧金山或纽约这样的大城市出现道路堵塞时,购物者就会受阻。当食品迟到时,顾客会更不高兴。

安德烈·叶制图。

天气变化非常大,当天气寒冷时,客户不想出去买杂货,所以他们可能会更多地使用 Instacart(更高的需求)。然而,作为一个购物者,你不会想在天冷的时候出去,所以很少购物者会去上班(需求减少)。天气好的时候,情况正好相反——更多的人可能想自己去购物(需求减少,供应增加)。

Instacart 和全国 50%的食品杂货都被天气推来推去,他们对此无能为力。

不仅仅是天气——特殊事件和名人或皇室人物的来访会堵塞道路,降低 Instacart 的效率。这些不能仅仅作为离群值而被忽略,因为它们已经发生了,并且将来还会再次发生——它们需要被考虑进去。然而,这意味着数据中的巨大差异,这使得数据预测变得困难。

结帐队伍中的可变队列长度和交货地点的可用停车位是另外两个变量,这两个变量在几个可分因素的组合上有很大不同,如日期、温度、给定商店的库存等。

在许多数据科学应用中,均值是最重要的,但在 Instacart 的情况下,方差和均值一样重要。方差会干扰预测,使估计时间难以置信。(你会如何解决这个问题?)

由此,Instacart 面临两个主要挑战。首先是你如何*衡供需?正如之前的天气所显示的那样,供给和需求经常是相互矛盾的,而不是朝着一个有利的*衡发展。过多的需求和不足的供给会降低顾客的满意度和忠诚度,过多的供给和过少的需求对于依靠紧迫感和效率来获得利润的公司来说意味着没有生产力。

第二个挑战是,一个供给和需求已经达到*衡,如何将购物者路由到尽可能高效?哪些购物者应该去哪些地方,以什么顺序,以最大限度地提高他们的效率,但仍然确保交货准时到达?

衡量需求是困难的。

对任何企业来说,衡量需求对于评估他们的表现是至关重要的。然而,在 Instacart 的情况下,做到这一点相当困难。

当访问者使用 Instacart 时,他们会指定希望他们的杂货到达的交付窗口。因为在某些时间段(如高峰时段)订单会累积,购物者不可能处理所有订单,所以 Instacart 实施了“繁忙定价”,这提高了送货价格。

Instacart 使用机器学习模型来预测时隙何时会填满,以在实际时隙完全填满之前实施繁忙定价。当该时段完全填满时,Instacart 会从可用交付时间列表中删除该时段。该公司还利用销售定价来填补空的时间段。

由 Andre Ye 创作的图形。

每个 Instacart 访问者都有三种结果:

  • 他们可以去结帐。
  • 他们想结账,但因为没有他们想要的送货选项而走开了。
  • 他们只是想探索应用程序,从来没有打算购买任何东西,或为未来构建一个篮子。

在所有这些场景中,访问者都会访问这个页面。你如何区分购买/结账的真实需求和为未来构建篮子的需求,或者只是想探索 Instacart 的需求?

注:“统计需求”是指统计的或已知的需求数量。继续购物的顾客的交易会被记录下来。然而,想要购买食品杂货(需求存在)但没有留下任何购买记录(没有购买任何东西)的客户被视为“未计算的需求”。

由 Andre Ye 创作的图形。

Instacart 建立了一个概率模型来预测访问者在可用情况下进行购买的机会。它考虑了市场和用户的特征,以及他们看到的可用性——哪些窗口是开着的,他们是忙价还是特价,等等。

通过预测每个人都有 100%的可用性,该模型可以估计需求-如果每个人都有 100%的可用性,会有多少次交付?已统计和未统计的需求都会被考虑,但虚假需求不会——这是一个聪明的过滤器。

Andre 创作的图形

使用这种方法,Instacart 能够估计 orange 的需求,以及“丢失交付”的数量(需求-成功购买的数量)。

图片:杰里米·斯坦,Instacart

如果 Instacart 要做任何调度、人员配备或预测,他们希望在正确的需求下完成。现在,他们不仅可以计算,还可以估计丢失的快递数量。

预测交货履行时间

给定一个*时的时间框架,Instacart 的工作是在这段时间内交付食品杂货。否则,顾客的幸福感会下降——事实上,早一点去买菜会让顾客有更高的幸福感。

图片:杰里米·斯坦,Instacart

考虑到顾客满意度的重要性,能够估计给定购物者的履行时间,从而为他们提供最有效的路线是必不可少的。

你可能会认为 Instacart 可以使用谷歌地图的旅行时间,但 Instacart 建立了自己的模型,其性能优于谷歌地图的旅行时间。该公司需要建立自己的旅行时间估计器,因为他们的购物者不是传统的司机——他们经常重复前往同一家商店,需要放下杂货店,进入商店等等,谷歌地图没有纳入这些组件,但 Instacart 的模型可以。

来源:杰里米·斯坦,Instacart

谷歌地图 API 不适合 Instacart 还有一个原因——他们必须为 Instacart 为其购物者考虑的所有路线组合做出预测。有一组候选路线,需要在一个自己进行优化的系统中进行。当你在估计数万亿条路线的完成时间时,等待 100 毫秒用 Google API 检查是不可行的。

一个内部组件可以相互通信、估算器可以根据 Instacart 的特定数据类型进行调整的系统,还是一个需要缓慢的外部 API 的系统?由 Andre Ye 创作的图形。

Instacart 使用分位数回归进行预测。除了寻找*均时间,第 95 百分位的可能时间是多少?或者,第五百分位可能时间?Instacart 的系统考虑了所有步骤中方差的相关性,以便在未来累积方差。

对于模型,Instacart 使用梯度推进决策树——它们有过度拟合的趋势(偏向偏差-方差尺度上的方差),这对于 Instacart 的高方差需求来说是完美的。

他们【梯度推进决策树】可以或多或少地记忆数据,这本质上是我们希望在这里发生的许多事情。当我们计划所有不同的组合时,我们可以将它们扩展到每分钟数百万次预测。
-杰里米·斯坦,Instacart

Instacart 有一个很好的方法来估计履行时间——现在它如何为所有的购物者绘制路线呢?

为购物者绘制路线

假设你要处理 300 份订单和 100 名顾客。尽管每次旅行只有三个订单,但有 4.45 亿个送货组合和 100 个不同购物者的 3 个组合。Instacart 每分钟都在处理这些问题——这只是一个*例子。

直觉上,你知道 Instacart 不会搜索所有 4.45 亿个组合,并挑选最重要的一个。

Instacart 的目标是最大化找到的商品数量。

在许多大城市,有很多相同的商店,只是位置不同。如果他们都有相同的产品,购物者可以选择最接*的一个。

由 Andre Ye 创作的图形

然而,库存并不总是最新的。这意味着,在评估客户清单上的产品出现在几家商店库存中的可能性后,Instacart 可能会牺牲额外的距离来换取客户满意度,这是因为客户想要的确切产品出现在库存中的可能性更高。

由 Andre Ye 创作的图形。

然而,如果事实证明好市多#1 确实有顾客寻找的产品,那么 Instacart 只是浪费了额外的时间去更远的商店——随之而来的是,顾客对产品准时到达的宝贵快乐。

对于 Instacart 来说,一秒钟就是金钱。

由 Andre Ye 创作的图形。

Instacart 使用贪婪试探法,这是一种聚合可能的交付并对聚合进行优先级排序的简单方法。事实上,Instacart 的第一个算法甚至更简单。它基于一个问题:

接下来什么快递最有可能迟到?

不管答案是什么,算法都会派一个购物者去处理。如果在第一次递送仍然及时的情况下,还有另一次递送可以添加到列表中,那么它将被添加——并且算法将继续这样沿着列表向下。

从那以后,Instacart 通过使用高效的机器学习方法,对他们的算法进行了巨大的改进——延迟交付减少了 20%,丢失交付稳定,购物速度提高了,忙碌时间百分比增加了 20%。

很复杂。Instacart 每秒钟运行无数次模拟,在计算可行的情况下找到最佳路线。

结论

后端有很多事情在进行。用户体验简单、干净、可靠——如果用户熟悉 Instacart 应用程序,他们可以在不到一分钟的时间内订购杂货。然而,在简洁易用的用户界面背后是一个庞大的系统,由智能机器学习和数据科学决策和应用程序驱动,它把你的杂货送到你面前,让你高兴,也让购物者、商店和广告商高兴。

本文是前 Instacart 的杰里米·斯坦(Jeremy Stan)40 分钟演讲的总结。如果你有兴趣听完整个演讲,可以点击这里进入。所有来自“Jeremy Stan,Instacart”的图片都来自他的幻灯片。

我希望这篇文章能够让您了解看似简单的 ui 背后的复杂系统,并探索和理解如何智能地应用数据科学和机器学习方法来解决实际的业务问题,使用 Instacart 的独特业务模型作为案例研究。

(想知道我是如何为本文制作图表的吗?看看这个故事吧。软件可能会让你大吃一惊:)

AI 是如何帮助截肢者的?

原文:https://towardsdatascience.com/how-is-ai-helping-amputees-a0d57c01ead5?source=collection_archive---------45-----------------------

犹他大学的新假肢设计

Unsplash 上拍摄的 ThisisEngineering RAEng

人工智能让事情变得更好,或得到改善。零售店通过使用机器学习技术来更好地管理库存。网飞提供更适合用户口味的内容。亚马逊能更好地预测消费者可能会买什么。癌症检测过程更加准确和快速。这一切都归功于人工智能领域的工具和技术。

人工智能让生活更美好的一面也在帮助截肢者。通过使用人工智能,已经使截肢者的生活更容易的假肢得到了进一步改善。犹他大学的科学家设计了一种人工智能假肢,它可以根据用户臀部和残肢的运动进行自我调整。它所实现的是提供一种更*滑和更容易的方式来跨越障碍。

想一想一个正在行走的人。当有一个障碍或一些她不应该踩的东西时,她只是不加思考地跨过去了。动作流畅,除非障碍太大。身体,尤其是臀部和四肢得到调整,使这一运动更加流畅。然而,截肢者跨越的过程并不那么容易和顺利。即使有了假肢,截肢者通常也要停下来一秒钟,调整自己的身体来跨越障碍。这就是科学家应用人工智能设计假肢的动机。

犹他大学生物医学工程助理教授 Tommaso Lenzi 将这项技术描述为“每秒钟一千次,人工智能会观察残肢(即用户的生物臀部,截肢部位以上)的运动,并模仿生物腿,规划仿生关节的新运动,以优化光滑度”。这是一段与这项研究一起发布的视频。

视频链接

该视频清楚地解释了这一概念,并展示了人工智能动力假肢的成功。请注意使用普通假肢跨越障碍有多困难。使用者必须调整整个身体才能继续前进。另一方面,人工智能驱动的机器人更容易越过障碍。这几乎就像一个没有截肢的人做的一样。假肢上的控制器弯下腰来提供*稳的运动。

这还不是最终产品。这种设计量产后可能会有变化或改进。然而,这一初步成就显示了人工智能帮助截肢者的潜力。当然,它将不限于四肢。人工智能驱动的义肢肯定比普通义肢有用得多。例如,当一个人向前倾斜时,假肢会解释这种运动,并采取适当的行动,如调整手指的位置以抓住东西。

AI 让事情变得更好。让它让生活更美好。

人工智能和机器学习已经引领了卫生领域的许多进步。看起来我们将会看到更多这样的进步。我认为医疗保健是人工智能应该关注的最重要的领域之一。AI 让事情变得更好。让它让生活更美好。这就是犹他大学的科学家们正在努力实现的目标。

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

参考文献

数据科学如何帮助新冠肺炎疫情?

原文:https://towardsdatascience.com/how-is-data-science-helping-with-the-covid-19-pandemic-ecb524df6a19?source=collection_archive---------34-----------------------

建立关系模型以加速对疾病动态的理解

作者图片

2011 年,在胰腺癌过早死亡的阴影下,苹果创始人史蒂夫·乔布斯顿悟了。“我认为 21 世纪最大的创新将是生物学和技术的交叉。一个新的时代正在开始。”(艾萨克森,2011 年)他非常感激他的疾病激发了他上大学的儿子里德研究基因组学的热情。

今天,人类正面临——至少十个月以来——自 1917 年西班牙疫情流感以来,在发病率和死亡率的速度和潜力方面最重大的公共卫生挑战之一。但与 1917 年不同,科学现在对生物学、基因组学和疾病动力学有了指数级的更先进的理解。自 2010 年左右以来,我们有了强大的能力,可以使用算法来发现和收集远远超出人类认知能力甚至速度更快的模式和见解。所有这些都回避了一个问题——在机器学习时代以来的第一次全球疫情中,它如何帮助我们?

谷歌学术上快速搜索可以发现 2020 年 19700 篇预印或发表在同行评审期刊上的论文,这些论文都与人工智能或机器学习以及新冠肺炎相关。本月发表在爱思唯尔杂志混沌、孤立子、&分形上的一篇元综述发现,人工智能和人工智能在新冠肺炎的应用可以归类为筛选、预测、预报、接触追踪和药物开发等功能(Lalmuanawma,2020)。美国国家卫生研究院(NIH)、 PLOS医学互联网研究期刊家族 (JMIR)和MedRxiv——BMC、耶鲁和冷泉港实验室的出版物——一直是领先的出版商,公众和科学家之间的大多数传播可以说是通过 Twitter 进行的。

虽然我有偏见,但一个很好的例子是“对新型冠状病毒(新冠肺炎)的病原体-免疫关系的机器学习解释,以及预测免疫和治疗机会的模型:比较有效性研究,”上周发表在 JMIRx Med 上。除了其潜在的重要性,它还举例说明了数据科学如何能够更准确地聚焦,从而提高公共卫生干预措施和政策的效力(Luellen,2020)。

这项研究的关键是,大约 80%的新冠肺炎感染者是无症状的,或者是免疫的,这些有害的症状会导致疾病和死亡,但仍然可以感染其他人。迄今为止,没有人知道为什么或如何识别这些“沉默的携带者”。如果有一种可靠的方法来提前将他们从 20%的患病人群中分类或区分出来,那么免疫者就可以去工作、上学、购物和旅行,而不会给自己带来风险。与此同时,20%的风险人群可以得到保护。此外,如果有不同的生物化学、基因组或分子生物标志物来区分免疫者和患病者,这将提高我们对疾病动力学的理解,并为那些不能接种疫苗的人提出新的可能的治疗方法。最后,它可以帮助决策者优先考虑大规模疫苗接种,从 20%的最大风险开始。

总之,该研究通过机器学习找到了两种途径来准确分类或预测谁可能对新冠肺炎免疫,谁在 20%的风险群体中。在一个由 37 名无症状和 37 名有症状的新冠肺炎患者组成的研究组中,100%的无症状患者的干细胞生长因子β(SCGF-B)——一种免疫蛋白——大于 127,637。或者,94.8%的新冠肺炎免疫患者具有两种其他免疫特征:白细胞介素-16 (IL-16)大于 45,巨噬细胞集落刺激因子(M-CSF)大于 57。

在宏观层面上,数据科学如何被用于协助新冠肺炎疫情的有趣之处还在于研究结果是如何传播的以及在哪里传播的。MedRxiv 于 2020 年 8 月 16 日出版了预印本——经过专业质量审查,但未经同行审查。今天,1,453 人阅读了该摘要,另有 328 人全文下载了该论文。它被 108 个人转发了约 332 次,Altmetric 影响力得分为 58。与此同时,2020 年 10 月 19 日出版的同行评审出版物被五个人发了大约七次推文,被一家新闻媒体转载和播放,并在头五天内在 LinkedIn 上被观看了 191 次,到目前为止,Altmetric 影响力得分为 10。

这个有趣的经历证实了元问题仍然没有改变:科学发现的速度快于人类意识到和应用它们的速度。即使使用社交媒体工具,如在互联网上实时发布结果以便立即免费传播,Twitter,LinkedIn 等。有意义地利用大量科学发现的挑战依然存在。下一代有影响力的工具将是那些能够通过精英管理来识别最重要的研究发现并将其加速付诸实践的工具。

参考

艾萨克森,W. (2011 年)。史蒂夫·乔布斯。纽约:西蒙&舒斯特。

拉穆阿那瓦马,s .,侯赛因,j ...(2020).机器学习和人工智能在新冠肺炎(新型冠状病毒)疫情的应用:综述。混沌,孤子&分形,139: 110059。

卢埃勒(2020)。新型冠状病毒(新冠肺炎)的病原体-免疫关系的机器学习解释,以及预测免疫和治疗机会的模型:一项比较有效性研究。 JMIRx Med ,1(1):e23582。

逻辑回归作为分类算法是如何使用的?

原文:https://towardsdatascience.com/how-is-logistic-regression-used-as-a-classification-algorithm-51eaf0d01a78?source=collection_archive---------16-----------------------

回归和分类矛盾吗?

斯凯工作室Unsplash 拍摄的照片

监督学习算法可以分为两大类:

  • 回归:预测连续的目标变量。例如,预测房子的价格是一项回归任务。
  • 分类:预测离散目标变量。例如,预测电子邮件是否是垃圾邮件是一项分类任务。

逻辑回归是一种监督学习算法,主要用于解决二元“分类”任务,尽管它包含单词“回归”。“回归”与“分类”相矛盾,但逻辑回归的重点是“逻辑”一词,指的是在算法中实际执行分类任务的逻辑函数。逻辑回归是一种简单但非常有效的分类算法,因此它通常用于许多二元分类任务。客户流失、垃圾邮件、网站或广告点击预测是逻辑回归提供强大解决方案的一些领域的例子。它甚至被用作神经网络层的激活函数。

逻辑回归的基础是逻辑函数,也称为 sigmoid 函数,它接受任何实数值并将其映射到 0 到 1 之间的值。

逻辑回归模型将线性方程作为输入,并使用逻辑函数和对数比值来执行二元分类任务。在详细讨论逻辑回归之前,最好先回顾一下概率范围内的一些概念。

概率

概率衡量事件发生的可能性。例如,如果我们说“此电子邮件有 90%的可能性是垃圾邮件”:

Odds 是肯定类别(电子邮件是垃圾邮件)和否定类别(电子邮件不是垃圾邮件)的概率之比。

对数赔率是赔率的对数。

所有这些概念本质上代表相同的度量,但方式不同。在逻辑回归的情况下,使用对数优势。我们将看到为什么对数概率在逻辑回归算法中是首选的原因。

对数比值是比值的对数,比值是正类与负类的概率之比。

概率为 0.5 意味着该电子邮件是垃圾邮件还是非垃圾邮件的几率相等。请注意,概率为 0.5 的对数赔率为 0 。我们将利用这一点。

让我们回到 sigmoid 函数,用不同的方式展示它:

取两侧的自然对数:

在等式(1)中,代替 x,我们可以使用线性等式 z :

那么等式(1)变成:

假设 y 是正类的概率。如果 z 是 0,那么 y 是 0,5。对于 z 的正值,y 大于 0.5,对于 z 的负值,y *于 0.5。如果正类的概率大于 0,5(即大于 50%的几率),我们可以预测结果为正类(1)。否则,结果是一个负类(0)。

法兰克诉Unsplash 上拍摄的照片

:在二元分类中,有正/负、1/0、真/假等多种方式来表示两类。

下表显示了一些 z 值和相应的 y(概率)值。所有实数都映射在 0 和 1 之间。

如果我们画出这个函数,我们将得到著名的逻辑回归 s 形图:

分类问题归结为求解一个线性方程:

这似乎就像解决一个线性回归问题。函数的参数在训练阶段用最大似然估计算法确定。然后,对于任意给定的自变量(x1,… xn)的值,可以计算出正类的概率。

我们可以“原样”使用计算出的概率。例如,输出可以是电子邮件是垃圾邮件的概率是 95%,或者客户将点击该广告的概率是 70%。然而,在大多数情况下,概率被用来分类数据点。如果概率大于 50%,则预测为正类(1)。否则,预测为负类(0)。并且,我们刚刚将线性回归问题的解决方案转换为二元分类任务。

逻辑回归是一个简单但非常强大的算法来解决二元分类问题。逻辑函数(即 sigmoid 函数)也通常在非常复杂的神经网络中用作输出层的激活函数。

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

强化学习在商业中是如何运用的?

原文:https://towardsdatascience.com/how-is-reinforcement-learning-used-in-business-71592558c93f?source=collection_archive---------40-----------------------

*年来,强化学习已经证明它可以在不同的游戏中取得比人类更好的结果。但是 RL 也可以用在现实世界的业务中吗?

h2RL 目前被用于几个行业以增加利润。]

强化学习(RL)第一次被如此命名是在半个多世纪前的 20 世纪 60 年代。不久之后,一些研究人员的兴趣从 RL 转移到监督学习,这导致了这两者之间*二十年的混淆。事实上,在 Rosenblatt (1962)和 Widrow 和 Hoff (1960)的著作中,可以看到 RL 和监督学习之间的界限是如何模糊的,在这些著作中,他们使用奖励和惩罚来描述监督学习技术。最后,在 20 世纪 80 年代末,Watkins 向世界介绍了 Q-learning (1989) ,融合了时间差和最优控制研究思路,创造了我们今天使用的现代 RL。

RL 已经走过了漫长的道路,如今,由于在几场视频游戏中取得了超人的表现,如 Pong、EnduroMontezuma 的复仇其他雅达利游戏,甚至击败了围棋世界冠军,RL 已经闻名世界。但是,RL 的所有这些用例都是基于(视频)游戏的,许多人甚至称之为营销噱头。尽管许多当前的研究工作已经改进了 RL,使其更有效、更智能和更安全,但 RL 仍然面临着阻碍其在现实世界任务中使用的挑战。

然而,这并没有阻止工程师在许多业务中使用 RL 取得巨大成功,并在此过程中赚了很多钱。*型和大型企业不应该忽视 RL,因为如果使用得当,它可以带来巨大的好处(和利润)。为了给你一些启发,让我们看看世界上一些最大的公司目前是如何使用 RL 来改善他们的业务的。

推荐系统

RL 在商业中最受欢迎的应用可能是在推荐系统中。网飞已经公开宣布,它正在使用 RL 向其用户推荐系列和电影,以及其他机器学习算法,网飞的研究人员正在定期使用 RL 发表论文。 Spotify 也承认使用多臂强盗,一种 RL 算法,用于管理歌曲和艺术家推荐的开发和探索之间的权衡。在 exploitation 中,推荐器推荐与用户正在听的内容高度相关的元素,而 exploration 则推荐不同但用户可能喜欢的内容,为用户带来新的发现。

Spotify 和网飞已经公开承认使用 RL 作为其推荐系统[图片来自 Pexels 。]

亚马逊、易贝、MercadoLibre 和许多其他大型在线零售商也在使用推荐系统,甚至 Medium 也在赞助 2020 RecSys(推荐系统会议)。很容易看出原因:麦肯锡估计,亚马逊上 35%的消费者购买来自其网站的推荐。基于 RL 的推荐系统越来越受欢迎,很可能许多大公司都在使用它们,尽管我们对此一无所知。推荐算法给了公司如此大的商业优势,以至于实际的算法从来没有公开过。也许将来会看到它们中的一些被保存在一个金库里,就在可口可乐秘密配方旁边。

贸易

股票交易机器学习算法有许多实现方式,特别是 RL 算法。然而,这些实施大多被视为机器学习如何用于交易的例子,该领域的大公司直到去年才开始接触它们。

摩根大通也在交易中使用 RL。]

2019 年 4 月,摩根大通宣布开始利用深度神经网络算法执行(DNA)来提升其外汇交易算法。关于精确算法的细节没有公布,但根据在其网站上的简要描述,这些算法似乎可以分析和解释信息,以实时选择最佳的订单安排和执行方式。此外,DNA 使用 RL 来评估个人下单选择的绩效。该公司尚未宣布他们新方法的结果,但已经表示将“加倍”使用机器学习进行外汇交易,暗示有希望的结果。

机器人学

RL 的使用在机器人行业得到了很好的传播【图片来自 pxfuel 。]

几家公司正在使用 RL 来控制制造业中的机器人。事实上,研究中引用的最常见的 RL 用例之一是控制机器人或机器人部件,如机器人手;RL 在机器人学中的应用一直激励着科学家,也为 RL 算法提供了一个很好的验证场景。机器人塑造了制造业,降低了成本,同时减少了生产时间,RL 承诺将这一点进一步推进:RL 提供了一种以高精度控制机器人部件的方法,这些部件具有非常难以编程的复杂行为。

RL 在机器人领域的使用越来越多,涌现了许多初创公司:最*一家知名的公司是 Covariant,其研究人员和工程师来自加州大学伯克利分校和 OpenAI。他们最*筹集了 4000 万美元的资金,所以我们可能会在未来看到更多的共变机器人。

冷却谷歌的数据中心

你可能从来没有想过,但是你能想象运行谷歌的数据中心需要多少能量吗?据估计,行业内数据中心每*方英尺消耗的能源是任何其他商业建筑的 10 至 50 倍,难怪会是这样:数据中心需要能源来运行服务器,数据必须定期备份,服务器需要冷却到 20 至 24°C(68 至 75°F)的恒温。仅冷却数据中心就消耗了大约五分之一的总能源,因此这方面的任何改进都可以转化为数据中心的巨大利润。事实上,据估计,到 2024 年,数据中心冷却市场的价值可能达到 200 亿美元。

计算机服务器需要保持 20-24 摄氏度的恒温[图片来自*基媒体。]

谷歌正在使用 AlphaGo ,也就是击败围棋世界冠军的 AlphaGo,来找出冷却基础设施的最佳框架,如风扇和通风,这将最有效地降低能耗。AlphaGo 被用作推荐系统,向基础设施运营商建议提高能效的选项。这导致冷却数据中心所需的能源减少了 40%,可以想象,这意味着总体成本的巨大节约。

接下来会发生什么?

虽然监督和非监督学习已经在几乎所有行业中取得了进展,但 RL 直到现在一直处于次要地位。这可能是因为 RL 提出了几个挑战,例如样本低效、安全学习和定义良好的奖励函数,这些都是在为现实世界问题实现 RL 解决方案之前必须解决的。如果你想了解更多在现实世界中应用 RL 的挑战,我推荐《现实世界强化学习的挑战》(Dulac-Arnold et al. 2019)

研究人员已经开发了几种方法来处理这些问题,我们现在看到一些方法在不同的解决方案中实施,如系统和服务配置自动驾驶和其他一些解决方案。如果我们认为这只是 RL 能为我们做的所有事情的冰山一角,毫无疑问,未来看起来非常光明!

你知道企业中 RL 的其他实现吗?如果是这样,我很想听听他们的故事!感谢您的阅读!

样本大*与标准误差、功效、置信水*和效应大*有什么关系?

原文:https://towardsdatascience.com/how-is-sample-size-related-to-standard-error-power-confidence-level-and-effect-size-c8ee8d904d9c?source=collection_archive---------4-----------------------

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

使用图表来展示相关性

在进行统计分析时,尤其是在实验设计期间,一个不可避免的实际问题是确定实验的样本量。例如,在设计网页的布局时,我们想知道增加点击按钮的大*是否会增加点击率。在这种情况下,AB 测试是一种常用于解决这一问题的实验方法。

转到这个实验的细节,您将首先决定我需要给实验组分配多少用户,以及我们需要给控制组分配多少用户。样本大*与四个变量密切相关,即样本的标准误差、统计功效、置信水*和本实验的效果大*。

在本文中,我们将通过图表展示它们与样本量的关系。具体来说,我们将讨论单尾假设检验的不同情况。

标准误差和样本量

统计的标准误差对应于参数的标准偏差。由于在大多数情况下几乎不可能知道总体分布,我们可以通过计算抽样分布的标准误差来估计参数的标准偏差。标准误差衡量分布的离差。样本量越大,离差越*,分布的均值越接*总体均值(中心极限理论)。因此,样本大*与样本的标准误差负相关。下图显示了不同样本量下分布的不同形状:

随着样本量变大,采样分布的离差越来越*,分布的*均值越来越集中,而较*的曲线表示离差较大的分布,因为数据点分散在所有值中。

了解样本量和标准误差之间的负相关有助于进行实验。在实验设计中,有必要不断监测标准误差,看看我们是否需要增加样本量。例如,在我们之前的例子中,我们想看看增加底部的大*是否会增加点击率。我们需要在对照组和实验组中测量的目标值是点击率,它是一个计算如下的比例:

比例统计的标准误差为:

当比例为 0.5 时,标准误差最高。在进行实验时,如果观察到 p 接* 0.5(或 1-p 接* 0.5),则标准误差在增加。为了保持相同的标准误差,我们需要增加样本量 N,以将标准误差降低到原始水*。

统计功效和样本量

统计功效也称为敏感度。它由 1- β计算,其中β为 II 型误差。更高的能力意味着你不太可能犯第二类错误,即当零假设为假时,不能拒绝零假设。如这里所述:

换句话说,当拒绝区域增大(接受范围减*)时,就有可能拒绝。因此,第一类误差增加,而第二类误差减少。下图描绘了单尾假设检验的统计功效、I 型误差(α)和 II 型误差(β)之间的关系。选择置信水*(1-α)后,蓝色阴影区域是该特定分析的功效大*。

从图中可以明显看出,统计功效(1- β)与第二类误差(β)密切相关。当β减*时,统计功效(1- β)增加。统计功效也受 I 型误差(α)的影响,当α增加时,β减少,统计功效(1- β)增加。

中间的红线决定了接受范围和拒绝范围的权衡,决定了统计功效。样本量如何影响统计功效?要回答这个问题,我们需要改变样本量,看看统计功效是如何变化的。由于第一类误差也随着样本量的变化而变化,我们需要保持它不变,以揭示样本量和统计功效之间的关系。下图说明了它们之间的关系:

当样本量增加时,分布将更加集中在*均值附*。为了保持 I 型误差不变,我们需要降低临界值(由红色和粉色垂直线表示)。因此,新的接受范围更*。如上所述,当它不太可能接受时,它更有可能拒绝,因此增加了统计能力。该图说明了统计功效和样本大*彼此正相关。当实验需要更高的统计功效时,就需要增加样本量。

置信水*和样本量

如上所述,置信水*(1- α)也与样本大*密切相关,如下图所示:

由于蓝色和黑色分布的接受范围保持不变,统计功效保持不变。随着样本量变大(从黑色到蓝色),I 型误差(从红色到粉色)变*。对于单尾假设检验,当 I 型误差减*时,置信水*(1-α)增加。因此,样本量和置信水*也是正相关的。

效果大*和样本大*

效应大*是实验的实际显著水*。由实验设计者根据实际情况设定。例如,当我们想检查增加网页底部的尺寸是否会增加点击率时,我们需要定义我们测量的实验组和对照组之间的差异有多大实际意义。0.1 的差异是否足以吸引新客户或产生可观的经济利润?这是实验设计者不得不考虑的问题。一旦设置了效果大*,我们就可以用它来决定样本大*,它们之间的关系如下图所示:

随着样本大*的增加,分布变得更尖(黑色曲线到粉红色曲线。为了保持置信水*不变,我们需要将临界值向左移动(从红色垂直线移动到紫色垂直线)。如果我们不移动替代假设分布,统计功效将会降低。为了保持功效不变,我们需要将备择假设分布向左移动,因此有效效果会随着样本量的增加而降低。它们的相关性是负的。

如何解释上面讨论的相关性?

总之,我们在样本大*和其他变量之间有以下相关性:

为了解释,或者更好地记忆这种关系,我们可以看到,当我们需要减少错误时,对于第一类和第二类错误,我们需要增加样本量。较大的样本量使样本更能代表总体,也是用于统计分析的较好样本。随着样本量的变大,更容易检测出实验组和对照组之间的差异,尽管差异更*。

给定其他变量,如何计算样本量?

计算样本大*的方法有很多,很多编程语言都有计算样本大*的软件包。例如,R 中的 pwr() 包可以完成这项工作。比起知道确切的公式,更重要的是理解公式背后的关系。希望这篇文章能帮助你理解这些关系。感谢您的阅读!

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

[## 我的博客文章库

我快乐的地方

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

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

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

大数据分析在控制方面的现状如何?

原文:https://towardsdatascience.com/how-is-the-current-state-of-big-data-analytics-in-controlling-1273c725ac6a?source=collection_archive---------17-----------------------

现实世界中的数据科学

控制中的使用和发展

T 对使用数据的兴趣导致采用大数据分析来改善决策过程的趋势日益增长。大数据分析被定义为“高级分析技术在大数据集上运行的地方”。由于数据驱动市场的竞争日益激烈,企业正在采用最先进的信息技术来获得竞争优势。

控制或管理会计部门的的角色直接受到大数据分析工具的影响,因为在使用信息支持管理方面,控制者是公司的核心单位。挑战之一是从这些无处不在的信息量中获得洞察力。然后,收到的见解将用于制定决策和调整组织流程以产生价值。

管理会计师或财务总监支持并建议组织的管理层实现其经济、公共和/或财务目标。支持是指管理控制和会计信息系统的设计和*护,以及信息的获取和分发。”

因此,一个公司的决策是基于来自分析结果的证据,而不仅仅是他们经理的直觉。还必须考虑商业文化方面和技术方面,例如合适的基础设施和用户友好的界面,以获得大数据分析的竞争优势。

大数据分析对控制的影响

虽然“审计员”一词在德语国家很常见,但“管理会计师”在美国和英国等英语国家是一个公认的术语。在比较这两种职业时,审计员的任务通常被认为是一个扩展的范围,不仅集中在会计问题上,也集中在管理问题上。

在我们的博客中,术语“控制者”和“管理会计”的意思是一样的,在控制和管理会计文献中很常见。

大数据分析的功能有助于高级分析从分散在不同数据库中的琐碎信息构建事件、场景或感兴趣对象的图片。

公司,特别是其控制单位,可以应用他们从大数据分析中获得的洞察力来增强他们的决策流程,以成功实现他们的业务目标。大数据分析的总体重点是提取基本见解,它基于数据挖掘和统计技术。以前基于直觉的高管行动现在可以通过数据驱动的数学模型来实现。

现在,管制员还可以利用大数据分析场景,并考虑季节性波动。预测的准确性会影响公司规划过程的效率、目标实现的程度、总成本以及满足客户需求的程度。

大数据分析的当前使用和发展

在国际管制员协会(ICV)的“管制员大会”期间,我们通过调查收集了数据。这次会议于 2019 年 5 月在慕*黑举行,口号是“为你的未来做好准备——想法。学习。网络”。它被认为是欧洲最大的控制会议。

为了衡量分析在使用方面的最*状态,参与者对感知的支持和发展进行了评级(“到目前为止,贵公司在控制领域使用大数据分析工具的程度如何?”).这项研究中的结构通常使用五点李克特量表进行测量,范围从“强烈不同意”(1)到“强烈同意”(5)。

如下图所示,28%的受访控制者回答不使用或很少使用大数据分析。39%的受访者表示,他们的控制部门很少使用大数据分析。关于使用大数据分析的发展,可以说大多数人(48%)认为发展很少。关于在规划阶段使用预测分析的结果显示了一个不典型的过程。大多数人(31%)没有使用这些方法,但仍有 28%的人提到在规划过程中广泛使用预测分析。

我们的调查结果

在德国,大数据分析在控制方面的成熟程度可以归类为处于初级阶段。将大数据分析纳入控制仍然面临众多障碍和阻碍,这可能是一些受访者对没有使用大数据分析且仍然没有自动化流程的控制者评价很低的原因。

*年来,大数据分析在控制中的使用遇到了瓶颈,该领域已经停滞。但是公司使用这些工具需要克服哪些障碍呢?只有技术上的?甚至是文化?

在我们的下一篇博客文章中,我们将回答这些问题,并看看回答者的结果。我们将分享我们关于如何消除大数据分析在控制方面的潜在障碍的发现。

如果您喜欢我们的发现并希望支持stargazr . ai请分享或关注我们的LinkedinTwitter**

ISIS 如何使用推特

原文:https://towardsdatascience.com/how-isis-uses-twitter-10065790354a?source=collection_archive---------37-----------------------

利用社交网络分析了解伊斯兰国的推特网络

亲 ISIS 推特账户的社交网络图

介绍

伊拉克和黎凡特伊斯兰国(ISIL),又称伊拉克和叙利亚伊斯兰国,是一个信奉逊*派伊斯兰圣战主义的团体。2014 年,ISIS 在占领伊拉克主要城市后声名鹊起。自那以来,监控和防止 ISIS 的影响一直是美国和其他国家的一个关键目标。

多年来,ISIS 一直在利用社交网络传播其信息,并为其事业招募倡导者。从亲伊拉克和大叙利亚伊斯兰国的内容到处决等图像材料,互联网的使用一直是该恐怖组织的主要工具。这些社交网络甚至被用来招募来自美国、英国和加拿大等西方国家的成员。

了解支持 ISIS 的推特账户网络有助于发现谁是主要参与者,内容如何通过网络传播,并改善对 ISIS 活动的监控。

数据

用于这项分析的数据由数据社会网站 data.world 提供。该数据集收集于 2015 年至 2017 年,包含 100 多个亲 ISIS 账户的 1.7 万条推文。收集的功能包括:

姓名、用户名、描述、位置、下载推文时的关注者数量、下载推文时用户的状态数量、推文的日期和时间戳以及推文本身

数据集可以在这里找到。

为了构建 Twitter 账户的网络图,必须创建节点列表和边列表。该图表将通过提及来直观显示客户之间的联系。使用@符号后跟用户的用户名,将 Twitter 提及嵌入到推文的文本中。为了生成节点和边列表,使用 Python 脚本从 tweet 中提取提及,并在发布 tweet 的用户和被提及的用户之间创建边。然后将节点和边列表输入网络绘图程序 Gephi 进行分析。

分析

节点和边列表被输入 Gephi 以生成一个图。图形节点按度数(与其他节点的连接数量)用红色->黄色->蓝色色标进行颜色编码。边缘按重量用红色->黄色->蓝色色标进行颜色编码。Fruchterman Reingold 布局函数用于组织图表的节点。结果图如下所示。

亲 ISIS 推特账户的社交网络图

从上图可以看出,节点和边的数量很大,很难提取有用的信息。然而,即使在这个尺度上,某些结构和关系也是可见的。可以用黄色和蓝色箭头看到几个高权重关系,表示 twitter 用户经常提到另一个特定用户。还可以看到几个 hub(指向许多其他节点的节点)和 authorities(从许多其他节点指向的节点)。让我们更仔细地看一下图表,以便获得更好的见解。

重量级关系

网络中存在几个高权重关系。其中,有两个非常高(用蓝色箭头表示)。这些关系在下面表示为关系 1 和关系 2。

高权重关系的网络图

关系 1 是从用户“mo”到用户“Ra”的定向关系。这种关系的权重为 195,是网络中最大的。

关系 2 是从用户“wa”到用户“Ni**”的定向关系。这个关系的权重为 184,是网络中的第二大。

虽然这些关系示出了从一个特定用户到另一个特定用户的频繁提及,但这并不一定意味着所提及的用户对图表有很大影响。让我们仔细看看图表中的这些用户及其网络。

下图显示了用户“Ra********”的关系。

用户网络图' Ra******** '

如上图所示,用户“Ra”似乎连接到了网络。由于许多关系指向节点的内部和外部,看起来“Ra”充当网络中的中枢和权威。

下图显示了用户“mo********”的关系。

用户网络图' mo******* '

如上图所示,用户“mo********”看起来也很好地连接到了网络,并且在网络中充当集线器和权威。

下图显示了用户“wa******”的关系。

用户网络图' wa****** '

像前两个用户一样,用户“wa******”看起来很好地连接到网络,并且充当网络中的中枢和权威。

下图显示了用户“Ni********”的关系。

用户' Ni******** '网络图

与前面的三个用户不同,这个图显示了一个稍微不同的画面。虽然用户“Ni********”在网络中表现出相对良好的连接,但是其他三个用户表现出高得多的程度。

然而,如果没有基线来比较,这些用户的重要性就无法确立。为了获得网络中节点度数的基线,运行了度数统计报告。发现少量节点具有高度数,而许多节点具有低度数(如在无标度网络中所预期的)。结果如下所示。

节点度报告

网络中为数不多的几个中心和机构可能是关键成员,对于监测工作来说很重要。为了更好地可视化这些节点,它们的大*已经被缩放到它们的程度。该图如下所示。

节点大*按度数缩放的网络图

从上图中可以看出,图中有几个中心和机构(由大节点表示)。我们上面看到的四个节点中的三个也被发现了。

虽然这些节点既是中心又是权威,但这并不表示哪些节点是哪些节点。为了识别哪些节点是中心和机构,制作了两个图表,一个是根据出站关系缩放的节点大*,另一个是根据入站关系缩放的节点大*。这些图表如下所示。

节点大*按度数缩放的网络图(权威)

节点大*扩展到外部程度的网络图(集线器)

从上图中可以看出,通过入站和出站连接分离节点伸缩可以提供有用的信息。虽然枢纽和当局都有很高的地位,但它们在网络中的作用不同。高级别节点(权威)很可能是亲 ISIS 网络的关键成员,他们在网络内部拥有一定的权威。这些成员是主要的安全监控候选人。

另一方面,高出度节点(集线器)是在网络中传播信息的关键。这些成员在网络中联系紧密,在他们的推文中提到了许多人。

此外,其中一些中心似乎是帐户组与更大网络的少数几个连接之一。这些节点被称为桥。从网络中移除这些节点可以显著减*其大*,从而使这些关键帐户关闭。

更新:现在有一篇“第二部分”文章使用社区检测[](http://4949 N 7th St, Phoenix, AZ 85014)扩展了这一分析。

讨论

亲 ISIS 推特账户的社交网络分析可以为改善安全监控和预防措施提供有价值的见解。确定网络中的关键权威使得监测工作能够更好地针对网络中最有影响力的人。此外,识别集线器可以为删除提供关键帐户,从而限制信息在网络中传播的有效性。

虽然该分析着眼于关系权重和节点度,但仍有进一步分析该社交网络的空间。可以分析额外的中心性度量,例如中间性、接*度和 PageRank。

本次分析使用的数据集是 2017 年编制的。由于 ISIS 等组织的快速移动性质,还可以收集新的数据集,以提供更适用于当前形势的见解。

ISIS 推特账户的社区检测

原文:https://towardsdatascience.com/how-isis-uses-twitter-598c2eb188a2?source=collection_archive---------58-----------------------

使用社会网络分析和社区检测来理解亲 ISIS 的推特

亲 ISIS 的推特社区网络图

背景

这篇文章是上一篇文章的延续,使用社交网络分析技术探索亲 ISIS 的 twitter 账户。那篇文章可以在这里找到。

伊拉克和黎凡特伊斯兰国(ISIL),又称伊拉克和叙利亚伊斯兰国,是一个信奉逊*派伊斯兰圣战主义的团体。2014 年,ISIS 在占领伊拉克主要城市后声名鹊起。自那以来,监控和防止 ISIS 的影响一直是美国和其他国家的一个关键目标。

多年来,ISIS 一直在利用社交网络传播其信息,并为其事业招募倡导者。从支持伊斯兰国的内容到处决等图像材料,互联网的使用一直是该恐怖组织的主要工具。这些社交网络甚至被用来招募来自美国、英国和加拿大等西方国家的成员。

了解支持 ISIS 的推特账户网络有助于发现谁是主要参与者,内容如何通过网络传播,并改善对 ISIS 活动的监控。

数据

使用的数据集和数据预处理措施与之前使用的相同。下面再次概述了这一过程。

用于这项分析的数据由数据社会网站 data.world 提供。该数据集收集于 2015 年至 2017 年,包含 100 多个亲 ISIS 账户的 1.7 万条推文。收集的功能包括:

姓名、用户名、描述、位置、下载推文时的关注者数量、下载推文时用户的状态数量、推文的日期和时间戳以及推文本身

数据集可以在这里找到。

为了构建 Twitter 账户的网络图,必须创建节点列表和边列表。该图表将通过提及来直观显示客户之间的联系。使用@符号后跟用户的用户名,将 Twitter 提及嵌入到推文的文本中。为了生成节点和边列表,使用 Python 脚本从 tweet 中提取提及,并在发布 tweet 的用户和被提及的用户之间创建边。然后将节点和边列表输入网络绘图程序 Gephi 进行分析。

社区检测

为了识别亲 ISIS Twitter 社区中的不同子社区,使用了 Gephi 中的社区检测算法。该算法被设置为使用权重和随机化。此外,使用分辨率为 1,这决定了社区的数量。

社区检测算法将节点分类为十七个社区中的一个。为了可视化这些社区,节点根据其分类社区进行颜色编码。该图是使用 OpenOrd 布局函数组织的。生成的图表如下所示。

亲 ISIS 的推特社区网络图

从上图中可以看出,似乎有几个社区构成了网络的主要部分。让我们分别来看看这些社区。

社区 5 是网络中最大的社区,包含 43.15%的节点。这个群落用蓝绿色表示,可以在下面单独看到。

社区 5 的网络图(Teal)

社区 11 是网络中第二大社区,包含 14.68%的节点。该社区中包含的节点的百分比远*于最大的社区——社区 5。这意味着该网络由一个占主导地位的社区组成,其中包括许多与之相联系的较*社区。群落 11 用橙色表示,可以在下面单独看到。

社区 11 的图表(橙色)

移除网络中最大的社区(社区 5)可以更容易地分析较*的社区。下面可以看到这个图。

不包括社区 5 的社区图

即使去掉了社区 5,较*的社区看起来仍然联系得比较好。但是,有几个社区完全从图中分离出来,称为连通分量。这些是社区 15、8、13、10、17 和 16。下图仅显示了这些社区。

社区 15、8、13、10、17 和 16 的图表

讨论

了解网络中最有影响力的社区有助于限制信息通过网络传播的能力。例如,将属于*的连接组件的节点作为目标可能对整个网络没有什么影响。当与第一部分中的节点中心性分析相结合时,这变得更加强大,以便从重要的社区中识别出要从网络中移除的关键参与者。

你的邻居简·雅各布斯怎么样?*猫、开放街道地图和美国人口普查的分析——第一部分

原文:https://towardsdatascience.com/how-jane-jacobs-y-is-your-neighborhood-65d678001c0d?source=collection_archive---------41-----------------------

基于*猫、开放街道地图和美国人口普查的《美国大城市的死与生》的城市设计分析

在《美国大城市的生与死》中,伟大的简·雅各布斯展示了一个好社区的四个基本特征:

  • 密度
  • 多种用途的混合
  • 建筑年代、类型和状况的混合
  • 由短而相连的街区组成的街道网络

当然,她对所有这些进行了更详细的描述,但我不会涉及所有的街头见闻。相反,我要去寻找有合适的“骨骼”来建造伟大的都市生活的社区。与大多数地理空间规划工具一样,需要注意的是,不要盲目信任它。有很多细节需要实地关注。

在数据上。

工具

对于这个项目,我将使用下面的导入语句:

要用 Census API 启动一个会话,您需要给它一个密钥(在这里得到一个)。为了方便起见,我还将启动我的 OSM 工具,定义几个投影,并为我感兴趣的位置创建一些字典:

这两个国家很有意思,因为它们都经历了战后的显著增长,并拥有广泛的发展模式。作为一名前博伊西居民,我非常了解阿达县,并能提供实地的见解。King County 拥有一个强大的数据*台,可以在本分析的第二部分提供不同的见解。

密度

我们会从简单开始。美国人口普查局定期发布人口估计,所以我们只需将这些数据进行一些几何运算,就能知道有多少人生活在不同的地区。我要使用的所有数据可用的最*地理区域是区域,所以这就是我们要得到的。

现在我有了地理信息,我只需要得到人口来计算密度。显然,人口普查表是‘b 01003 _ 001 e’。下面是按县查询该表的函数:

既然我们有了包含人口的数据框架和包含区域的地理数据框架,我们只需将它们合并在一起:

这个函数更一般化一些,这样我们就可以将几何添加到人口以外的其他数据中,我们将在后面看到。

现在我们可以简单地调用我们的函数并绘制结果:

建筑年代的混合

下一个最复杂的搜索是在每个区域内找到不同的建筑年代。幸运的是,人口普查有一些足够接*的数据。他们通过十年的建造时间来追踪*区内的房龄。首先,我们将从这些表名中创建一个字典:

接下来,创建一个函数,将所有这些组合成一个数据帧。由于 Jane-Jacobsy-est 区域在每十年内最接*相等,因此最简单的度量标准是标准差,最低值为最佳值:

同样,我们只需调用我们的函数并绘制结果:

由短的相互连接的块组成的网络

现在我们开始变得复杂。幸运的是,由于有了 osmnx Python 包,我们可以领先一步。我们将使用 graph_from_polygon 函数获取每个人口普查区域内的街道网络,然后使用 basic_stats 包获取*均街道长度和每个交叉路口的*均街道数量,即网络分析术语中的“节点”。然而,在我们这样做之前,我们需要解决我们的网络的一个问题:OpenStreetMap 将停车场车道作为街道网络的一部分,这将扭曲我们的结果,因为这些往往相对较短,至少在地面停车场的内部连接。为了解决这个问题,我们将查询该县的所有停车场,然后将它们从我们的*册子中排除,以获得一些瑞士奶酪*册子。首先,函数查询 OSM 的东西,一般化,因为我们将在下一节大量使用它:

要获得免停车区域:

这不会是一个完美的解决方案,因为很多停车场并没有这样的标签,但它至少会排除很多这样的停车场。现在,我们可以创建一个函数来迭代每个区域,并获得一个“街道分数”,我将它定义为区域内街道的*均长度除以每个十字路口的街道数量:

这需要一段时间,所以我包括了一个进度条和地图输出,让我在等待时开心。还有一些区域没有街道(我假设是普吉特湾),因此有了 try/except。现在我们调用这个函数:

多种用途的混合

现在是分析中最复杂的部分。以下是我的总体计划:

  1. 在 OpenStreetMap 中查询“15 分钟街区”所需的所有组件:
  • 办公室
  • 公园
  • 酒吧
  • 餐馆
  • 咖啡店
  • 图书馆
  • 学校
  • 银行
  • 医生办公室
  • 药房
  • 邮局
  • 杂货店
  • 五金店

2.获取每个普查区域内的点的样本

3.计算每个样本点步行距离内的所有邻域要素

4.获取该区域内所有点的步行距离内必需品的*均数量。

我们将从上面我用来查找停车场的 osm_query 函数开始,以获取给定地理区域内的所有社区要素。由于 OSM 是开放源代码和可编辑的,有一些数据需要解决。首先,有些人为某些事物放置点地理,而其他人放置建筑物的区域。这就是函数中有 poly_to_point 选项的原因,如果我们需要,可以将所有这些点标准化为点。天桥 API 几何图形的原始输出是一个坐标字典,因此我们需要将它们转换成形状良好的几何图形,以便输入 GeoPandas:

我们希望这些数据出现在一个单独的列中,因此我们合并了输出:

现在,我们终于准备好购买我们的邻里必需品了:

接下来,我们需要获得一组随机点进行搜索:

接下来,我们将通过我们的步行距离来缓冲我们的点,我将它设置为 1 公里。如果我们想变得更有趣,我们可以使用 walksheds,但是这种分析本身就需要大量的处理器,所以我将选择坚持使用欧几里德距离。然后,我们将获取缓冲区内的所有邻域要素,并计算步行距离内要素的百分比:

这让我们“接*”了一个区域。我们现在需要遍历该县的所有区域:

现在我们可以调用我们的函数来获得我们的分析:

把所有的放在一起

我们现在有了简·雅各布斯的每个优质社区因素的分数。我更感兴趣的是比较县内的区域,而不是比较县本身,因此我将简单地对每个区域的得分进行排名,并取*均值以获得“简·雅各布指数”(JJI):

为了查看我们做了什么,我们将使用之前制作的四个数据帧来调用函数:

最后,对于酷点,我们将使用叶创建一个交互式地图:

以下是两个新创建地图的链接:

爱达县

郡王

这一切意味着什么?我们将在第二部中深入探讨这个问题……

日语标记器是如何工作的

原文:https://towardsdatascience.com/how-japanese-tokenizers-work-87ab6b256984?source=collection_archive---------19-----------------------

通过开源库示例深入探讨日语标记化及其组件(字典、点阵、*特比算法等)

我最*一直在研究 Kotori 和日本的 NLP 工具。我写这篇文章是为了分享我到目前为止对日语标记化及其组成部分的了解。

如果你没听说过, Kotori 是用 Kotlin 编写的日语分词器和词法分析引擎。如果你喜欢这篇文章,请在 Github 上查看 Kotori 并给它一些星星。

照片由 Hiroshi TsubonoUnsplash 上拍摄

日本标记化者

在其他 NLP 任务(例如,文本分类)之前,标记化或者将文本分解成单词列表是重要的步骤。在英语中,单词通常由空格或其他符号分隔,这样更容易标记。然而,在日语中,单词之间通常没有任何空格。日语标记化需要阅读/分析整个句子,识别单词,并在没有任何显式分隔符的情况下确定单词边界。

大多数日语记号化器使用 基于点阵的记号化。顾名思义,基于格的记号赋予器构建一个(或者一个类似图形的数据结构),它由输入文本上出现的所有可能的记号(术语或者子串)组成。它使用 *特比 算法来寻找通过格的最佳连通路径。

最流行的基于格的记号赋予器是 MeCab (用 C++编写)。大多数开源的日语标记器库要么只是 MeCab 的包装器,要么是在不同*台上基于格的标记化的重新实现。

例如:

MeCab 的 IPA 字典 (IPADIC)也是最受欢迎的字典。它被用作大多数分词器的基线或主词典。

在本文中,我将通过简化版的 Kotori 代码和 MeCab 参考资料详细解释基于格的字典和标记化是如何工作的。

词典

对于基于格的记号化器来说,字典是一个对象或数据结构,它提供关于可用的术语的信息,以及根据日语语法或概率这些术语应该如何彼此相邻出现。

尽管不同的记号赋予器库使用不同的内存数据结构并读取不同的字典文件格式,但所有基于格的记号赋予器字典共享几乎相同的接口或逻辑结构。

在本文中,我们将研究 MeCab 的字典格式。具体是 MeCab 的 IPADIC,你可以在这里下载(自己看内容和笔记对比)。

记号赋予器字典由两个重要部分组成:

术语词典

Term-Dictionary (単語辞書 or Lexicon) is a list of known terms (or words). In MeCab’s dictionary directory, all CSV files together make up this term dictionary part.

例如,在 Noun.place.csv 中,您可以找到这样的行:

**東京,1293,1293,3003**,名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー

**京都,1293,1293,2135**,名詞,固有名詞,地域,一般,*,*,京都,キョウト,キョート

**札幌,1293,1293,3440**,名詞,固有名詞,地域,一般,*,*,札幌,サッポロ,サッポロ

**渋谷,1293,1293,4310**,名詞,固有名詞,地域,一般,*,*,渋谷,シブヤ,シブヤ

每个术语(或)由多个(或字段)组成,但只有的前四列对标记化很重要。

  • Surface Form (表層形): The string or term that should appear in the text.
  • Left/Right Context ID (左/右-文脈 ID): This is used for determining connection cost or how likely it is for a term to follow other terms.
  • 成本:拥有这个术语的成本。成本取决于该术语被使用的可能性。成本越高,该术语使用频率越低或越罕见。

剩余的列是关于术语的附加特征(例如,词性规范化形式发音、…,等等)

注意事项:

  • 实际上,术语词典又大又全。它通常包含几十万个术语(例如,在 IPADIC 中大约有 290,000 个术语)
  • Please don’t confuse Dictionary (辞書) with Term-Dictionary (単語辞書). Throughout this article, I will use the term-dictionary to mean the table of terms part, while the dictionary would refer to the whole (term-dictionary + connection cost + others).

连接成本

Connection Cost (連接コース) is a cost structure to measure how likely it is for a term to be before or after one another.

连接可能性被解释为连接前一单词的右上下文 ID后一单词的左上下文 ID 的成本。

(Prev term's rightID, Next term's leftID) -> Cost

与术语的成本类似,连接成本越高,给定术语被连接的可能性就越*。

这个映射是 MeCab 字典中的matrix.def文件。文件结构非常简单。第一行是可能的 rightID 和 leftID 的数量(在本例中均为 1316),后面是一列(rigid,left id,cost) 元组。

1316 1316
0 0 -434
0 1 1
0 2 -1630
0 3 -1671...1315 1313 -4369
1315 1314 -1712
1315 1315 -129

未知术语处理

除了术语字典连接成本之外,另一个在实践中对标记化至关重要的字典组件是未知术语(或超出词汇表)处理策略。它用于识别术语词典之外的一些单词、子字符串或符号(例如人名),并允许分词器跳过或分词它们。

在 MeCab 中,未知术语的处理是通过基于字符类型的启发式规则完成的(例如,连续的片假名字符可能是一个名词)。规则和字符类型在unk.defchar.def文件中定义。

在本文中,我将留下未知单词处理的细节,并假设术语词典包括文本中的每个术语。

基于格的记号化

如前所述,基于格的标记化是构建一个术语格,并通过该格找到最佳路径。

给定字典,记号赋予器将文本上“出现”的所有术语识别为子串,将它们连同它们的子串开始/结束位置一起添加到格中,然后运行算法来寻找连接术语的最佳路径。

简化的代码如下所示:

val lattice = Lattice.create()for i in 0..text.length { val terms = **findAllTermStartingAt**(text, i) for term in terms { lattice.add(term, startIndex=i, endIndex=i+term.length) }
    ...
}
...return lattice.findTheBestPath()

在示例代码中,我们使用findAllTermStartingAt(..)来查找字典中从该位置开始具有表面形式的所有术语。

For example, if text="東京都に住む":

  • findAllTermStartingAt(text, 0) should return 東 (East), 東京 (Tokyo)
  • findAllTermStartingAt(text, 1) should return 京 (Capital), 京都 (Kyoto)

作者图片

注意:

  • 拥有一个快速的findAllTermStartingAt(..)对于记号赋予器的性能非常重要。因此,该功能通常通过高效的字符串匹配/查找数据结构来实现,例如 Trie有限状态转换器(FST) 。我将把这些数据结构的实现细节留给以后的文章。
  • 在所示的版本中,我们识别可能的术语,并在运行算法找到最终的最佳路径之前将它们全部保存在内存中。有些记号赋予器使用贪婪的或基于窗口的方法来主动删除不必要的术语,以保持较低的内存使用率。Kotori 使用所示的方法,因为我发现它更有效(又名。更快),而且内存使用在实践中从来都不是问题。

Lattice是一个图结构,包含所有作为节点出现的术语。图的边连接从每个位置开始的节点(或术语)和在相同位置结束的节点。

For example, 東 (ending at index=1) connected to 京 and 京都 (starting at index=1).

作者图片

每个节点和连接都有与之相关联成本:

  • 节点的成本(橙色)是其术语的成本(在术语字典中定义)
  • 连接的成本(红色)是结束项的右上下文 ID 和开始项的左上下文 ID 之间的连接成本(定义见连接成本)。

请注意,除了表面术语中的节点,我们还需要在网格中包含两个特殊的节点。

  • 一个特殊的开始节点index=0, rightID=0, cost=0
  • 一个特殊的节点index=text.length, leftID=0, cost=0

术语成本和连接成本代表了它们的使用频率。成本越低,术语和连接的可能性就越大。因此,分词器的目标是从头到尾找到最*成本路径(或“最佳”路径)。这样做将产生最有可能出现在日语中的标记序列。

*特比算法

*特比算法是一种通过图寻找最优路径(或最可能路径,或最*代价路径等)的算法。大多数*特比算法的例子都来自于它与隐马尔可夫模型的应用(例如词性标注)。然而,我发现*特比算法在标记化中的用法非常不同。

我对基于格的符号化应用的*特比算法的解释如下:

为了找到从起点到 tᵗʰ 节点的最*路径,我们需要通过计算每条路径的总成本来考虑通过每个 (t-1)ᵗʰ 节点到 tᵗʰ 节点的路径,并从中挑选最*路径。

对于每个 (t-1)ᵗʰ 节点通向 tᵗʰ 节点:

  • (递归地)找出从开始到那个 (t-1)ᵗʰ 节点的最*成本/路径。
  • 找出连接那个 (t-1)ᵗʰ 节点到 tᵗʰ 节点的成本
  • 找到 tᵗʰ 节点本身的成本
  • 把它们加在一起。这是从开始tᵗʰ 节点通过 (t-1)ᵗʰ 节点的总成本

然后,在通过不同 (t-1)ᵗʰ 节点到 tᵗʰ 节点的路径中,挑选总成本最*的路径。

实现这个算法的一个有效方法是动态规划。我们可以从最靠*起点的节点开始寻找最*路径,并重用它们到跟随它们的节点的最*路径。不断重复,直到我们计算出每个节点的最*路径。

for i in 0..text.length { for node in nodes.startingAt(i) { for prevNode in nodes.endingAt(i) { val prevTotalCost = prevNode.totalCost
      val termCost = node.cost
      val connectionCost = getConnectionCost(prevNode.rightId, node.leftId) val totalCost = prevTotalCost + connectionCost + termCost

      if (totalCost < node.totalCost) {

        node.totalCost = totalCost
        node.prevNode = prevNode }
    }
  }
}

执行算法后,可以找到从开始结束的最短路径,即结束节点。我们只需要跟随prevNode指针回到开始节点。

这篇文章总结了我从零开始构建日语分词器所学到的知识。同样,如果你喜欢这篇文章或者想了解更多关于日语标记化的知识,请在 Github 上查看 Kotori。

注意:Kotori 深受其他开源库的影响。特别感谢阿蒂里卡(黑次)工作申请人(须田)外川智子内田(贾诺梅)。

其他资源(日语):

Kubernetes 将如何为企业创造一种新的供应商类型

原文:https://towardsdatascience.com/how-kubernetes-will-enable-a-new-genre-of-vendor-to-the-enterprise-3468dab2fc3f?source=collection_archive---------60-----------------------

来源:Pixabay

公司需要成为核心业务的专家,所以他们很少能成为其他领域的领导者。想象一下一家大型银行或航空公司每天处理的问题。他们的注意力应该完全放在对冲当前的金融风险状态以战胜市场或为他们的车队和客户处理物流上,而不是设计下一代数据系统、人力资源系统或招聘软件。对于大多数非核心业务应用程序,公司不觉得有必要重新发明轮子,但当涉及到数据处理和集成等技术基础设施时,企业还没有能力利用专家和创新者——“购买”与“构建”的选项还不真正存在。

付钱给别人建造只对少数人有效

为了利用专家,企业可以外包或与供应商合作。外包会将城堡的钥匙交给第三方,从而带来严重的隐私和安全风险。我亲眼目睹了与他们中最优秀的人(例如麦肯锡)导致 7 位数以上的账单和 B 级可交付物/技术的组合,这使得路线不太理想。

供应商整合— SaaS 需要信任

大多数公司负担不起麦肯锡,因此需要建立或与供应商合作,这两者的前景都不太乐观。大多数数据处理和编排供应商都是在 SaaS 模式下运营的,在这种模式下,最先进的技术包括复制数据,将其发送给供应商,然后让他们处理数据,并将其连同派生资产(例如“产品”)一起发送回其所有者。报告、机器学习等。对于企业来说,这可能会令人望而却步;合同和政策可能会阻止数据向外部发送。即使他们不这样做,复制数据的整个概念也限制了你可以用它做什么,因为它的血统在被复制后不能被保留。最后,每次向外部公司提供数据时,安全风险都会增加。当数据被复制并存储在第二个位置时,网络攻击的范围立即扩大了一倍。

来源:作者

想象一下,一家大型公共银行向一家*型初创公司提供账户数据,这可能有助于他们更快地收集见解——这几乎不可能。在一个对错误零容忍的领域,依靠一家初创公司来管理复杂的隐私和监管环境基本上是行不通的。更不用说将数据复制给第三方会带来的安全风险了。

On Prem 解决方案?

这是一个几乎没有内部替代方案的空间。因此,还没有一整类工具来满足注重安全性和隐私的企业。任何不能在内部托管的东西都不可能被使用。一些尚未突破到企业的技术示例包括 ELT 提供商( FiveTranStitch )、大多数转换工具(雪花dbt )、机器学习( AlteryxBigSquid )等等,但基本上是数据处理和管道领域中任何无法托管的公司。

企业在远离核心业务的地方浪费时间

重要的是,这意味着企业无法利用这些领域的专家。公司没有使用定制的解决方案来充分而周到地解决问题,而是被迫成为专家来选择、组合、组合、调整和操作复制现有解决方案所需的各种不同的开源堆栈。实际上,几乎每个公司都应该专注于自己的核心业务,而不是重新发明轮子。

Kubernetes 可以实现云的易用性以及本地的私密性和安全性

供应商集成历史上只有几个变种:a) SaaS,供应商从客户端复制数据,并在供应商的环境中处理数据;b)本地,供应商提供在本地运行的应用程序(例如 GitHub 企业)。从技术角度来看,新技术只是在最*才使得公司从(a)获得监控、控制和可见性,同时从(b)保护隐私和安全成为可能。例如, Kubernetes 有能力允许供应商管理公司服务器上存在并运行的服务。一种服务,其中所有数据都单独保存在由您的公司完全控制和保护的环境中,同时仍然为供应商提供丰富的可见性和监控。

来源:作者

拥有数据处理专业知识的供应商首次可以打包、交付、监控和*护托管服务,这是一种在公司的 Kubernetes 环境中运行的数据*面。所有公司数据都可以驻留在托管数据*面内,并且永远不会离开。除此之外,供应商能够将典型的云管理 SaaS 的所有优势作为供应商运行的外部服务来提供。随着控制*面与客户安装的数据*面配对,公司仍将能够享受精美的 UI 和整合的管理,从而提供与当前行业标准几乎相同的客户体验。

使用这种由 Kubernetes 推动的方法来创建托管数据*面的好处是多方面的:

  • 成本和时间与其将昂贵且耗时的数据传输到基础设施之外的第三方,不如就地处理。数据传输通常是云账单中最大的项目。
  • 隐私和安全所有数据都驻留在公司的基础设施中,绝不会离开。企业将能够高枕无忧,因为它知道自己能够完全控制其数据的安全性和隐私。
  • 工程时间不再需要成为操作复杂、分布式处理引擎的专家,外包给专家现在是可能的。
  • 与基础设施无关以这种方式构建的解决方案将在托管和云环境中不受基础设施的影响。

此外,Kubernetes 为您的基础设施上存在的低延迟应用提供了新的可能性。想象一下,能够插入立即发生的新服务(提供托管机器学习、报告或分析),而无需通过互联网传输的费用。测试供应商变得简单而轻松。

这种方法存在挑战。对于供应商来说,这种运营模式需要深思熟虑的应用程序工具和整合监控方法。供应商必须拥有可扩展的流程来管理和监控成千上万的外部客户数据*面,而不是管理一个或几个供应商托管的多租户环境。所有好的范式转换都有一定的复杂性。

毫无疑问,下一代技术基础设施供应商将利用像 Kubernetes 这样的工具来构建可供最大的企业使用的技术,而没有运营或业务风险。唯一真正的问题是,哪些行业和供应商将首先支持这种新模式。河口致力于援引这些隐私,安全和客户信心的设计原则。

大公司如何评价 AI 创业公司

原文:https://towardsdatascience.com/how-large-companies-evaluate-ai-startups-ef0f5f8da40e?source=collection_archive---------18-----------------------

我在一家大型国际公司的 ML 项目中与几家初创公司合作的经历。

Startaê TeamUnsplash 上拍摄的照片

作为一名人工智能顾问,我经常需要评估人工智能初创公司,以确定他们的解决方案对我们是否有意义,以及他们是否能成为长期的真正商业伙伴。我们评估初创公司的过程或多或少类似于风投所谓的尽职调查

这种评估 ML 初创公司的需求来自于这样一个事实,即我们既需要将我们的流程数字化,以保持我们在行业中的地位,也需要初创公司的增加,这些公司的口号通常是人工智能、算法、深度学习、*台、部署等词的混合...

在几次成功的合作之后,我开始更好地注意到失败的 ML 创业的早期迹象,并理解机器学习的问题。在本文中,我将介绍我遇到的一些最常见的问题。

尽管大肆宣传,依赖机器学习并不总是商业问题的最佳解决方案。在很多情况下,我们对创业公司感到失望…

在进入细节之前,我想更好地定义我所说的失败是什么意思。我对初创公司的定义是,要么由于机器学习的性质而无法实现预期,要么无法成长为一个可行且自我可持续的企业,并且永远不会真正找到一个好的商业模式。然而,他们仍然可能被更大的公司收购,但他们不会作为独立的公司生存下来。

商业问题

从技术的角度来看,我看到越来越多的初创公司使用“新”人工智能方法来开发令人兴奋的商业应用程序,如 Zero-shot learning、GANs 或联邦学习,但当涉及到让企业更有利可图时,他们就像非科技初创公司一样挣扎。

机器学习 vs … 我首先想到的是,相当多的人工智能初创公司倾向于低估非人工智能和人工智能的竞争。事实上,对于许多重要的商业问题,竞争非常激烈,当涉及到应用于特定商业问题的人工智能时,行业已经不堪重负(例如,预测客户流失的机器学习)。

老实说,机器学习本身并没有给你太多的优势,因为主要目标是把它卖给用户,并完美地满足他们的需求。大多数公司将需要一个定制的解决方案,无法将额外的财务和时间资源用于管理所谓的“易于处理的人工智能解决方案”。

我注意到的另一个问题是,大多数人工智能团队从试点客户开始,这已经是一个相当大的挑战。我可以向你保证,说服一家大公司相信一家随机的初创公司是极其困难的

在接受与 ML 初创公司建立 PoC 之前,我们会询问以下问题:

投资通常很高(通常在 2 万到 15 万美元+*护成本)原因很明显,因为解决方案可能是定制的。对于初创公司来说,这是一个长期资助产品开发的好方法,并且可以获得更多至关重要的数据。

文思海辉科技发布的一份白皮书称 85%的人工智能项目失败。哎呀。

然而,这些试点项目通常解决非常具体的问题,这些问题很难转移到其他公司和用例。不幸的是,大多数大公司都需要高水*的定制,这对于初创公司来说很难实现。让试点项目适应其他客户的困难可能会成为一个真正的问题。的确,没有多少创业公司可以在没有定期“出货”的情况下生存下来。

基于 ML 的解决方案通常需要定期重新培训,以适应数据的动态特性,并针对特定的客户或应用程序工作负载编写和调整算法。

当谈到项目本身时,初创公司通常很难超越 PoC 阶段……许多原因可以解释人工智能项目的失败,但我将重点关注准确性预期、生产、管理成本、边缘案例管理和决策管理。

我通常对以下创业公司持怀疑态度:

  1. 承诺 100%准确率的 AI 创业公司往往令人生疑。我建议你不要期望完美的准确性,尤其是对于任何复杂的决策。此外,不要忘记准确性会随着时间和市场/社会的变化而下降(例如:新冠肺炎对你的数据集的影响… )。
  2. 人工智能初创公司没有考虑到需要确定限制条件,以确定何时允许人工智能自主决策,何时由人类监督,以及何时它将简单地指导人类做出决策。
  3. 人工智能初创公司没有试图预测/更好地理解边缘案例。根据您的业务问题,您可能会遇到边缘情况。对他们来说,所需要的努力在资源方面是巨大的,最终会毁掉你的项目。
  4. AI 创业公司很少提到 AI 应用一旦投入生产后的管理。缺乏处理数据漂移、黑天鹅事件(新冠肺炎)或在其有效域之外使用人工智能的计划可能是一个重大挫折。对模型进行频繁更新并引入新的竞争模型是至关重要的。与部署和警报相关的治理也是需要重点考虑的。
  5. 人工智能初创公司无法回答以下问题:解决方案多久更新一次?随着时间的推移,他们打算何时集成新数据以使解决方案更加准确?

除了这些因素,失败的人工智能初创公司往往低估了这个词的重要性:可扩展性。我同意 Invoke Capital 创始人迈克·林奇的观点,他说当前人工智能炒作的现实是,许多成功获得资金的公司对他们问题的困难性质以及如何在现实世界中测试其人工智能的鲁棒性缺乏理解。

太多次了,我看到有前途的人工智能初创公司设法与一家大公司开展了一个有趣的试点项目,但后来未能创建一个可靠的商业模式,一支出色的销售团队,或理解向大公司/大规模销售的困难。

大公司漫长的采购周期会给人工智能初创公司的生命带来风险。我见过许多首席执行官,他们等不起大公司来决定他们是否需要人工智能解决方案。下面,我列出了人工智能初创公司最常见的威胁。

因此,我接触过的大多数人工智能初创公司都很难在为早期客户做项目和投资一个可扩展产品(高收入)之间找到正确的*衡。我同意 Starsky Robotics 首席执行官 Stefan Seltz-Axmacher 的观点,他说“许多人工智能团队最终成为工程顾问”。他们从客户那里获得了丰厚的收入,但最终并没有真正卖出一件产品。”

除了我对人工智能创业公司前景的看法之外,我非常清楚风投并不积极评价这种情况。他们的目标是看到实施成本有限的可扩展产品。

事实上,云操作可能比传统方法更加复杂和昂贵,特别是因为没有好的工具来在全球范围内扩展人工智能模型。

我再次同意迈克·林奇的观点,他说“虽然人工智能技术在解决某些问题时很有用,但它们并不是在所有情况下都适用。给旧软件添加一个现成的算法不一定能教会它新的技巧。”

财务利润率 vs SaaS 另一个有趣的方面是人工智能创业公司的*均利润率相对较低。事实上,这一比例通常在 50%至 60%之间,远低于 SaaS 同类企业 60%至 80%的基准。

也许这种“低”利润可以解释为 ML 的云计算时间的高成本,以及清理训练和*护人工智能系统准确性所需的数据所需的人力资源。

尽管清理培训数据所需的人工方面可以外包给第三方,但这些服务可能是一项重大投资,即使外包给低收入国家也是如此,并成为隐私挑战。

也意识到 AI 项目中数据准备步骤往往被低估。与收集和清理数据相关的简单任务可能会变成漫长而令人沮丧的过程。这可以用沟通不畅和不良预期设定来解释。

部署也往往被低估…

机器学习与期望

我们在 ML 方面最大的问题与边缘案例、人为干预和可解释性有关。在一个项目的开始,我们可能认为边缘情况或解释结果的需要永远不会成为一个重要的问题,然而…

边缘案例:每个人工智能应用都不可避免地会遇到解决方案不能按预期执行的场景。

您的模型变得越精确,就越难找到对项目整体性能至关重要的特定边缘案例的数据集。此外,模型越好,改进模型所需的数据就越准确。

双方通常都低估了对数据的持续需求。

一个容易犯的错误是期望 ML 性能有指数级的提高。在我管理的大多数计算机视觉项目中,随着时间的推移,提高精确度的成本总是在增加,遵循一条 S 曲线。由于有监督的机器学习,人工智能初创公司往往会在几周后向你承诺 100%的准确率,但最终往往表现不佳。

最终精度步骤的问题

对数据的需求也是一个问题。事实上,大型神经网络通常比线性模型需要更多的训练数据。通常,当模型中的要素数量很大时,所需的数据量往往会呈指数级增长。

Stefan Seltz-Axmacher 概述的另一个关键方面是,随着模型的进展,人类监督的必要性必然会下降。然而,根据你选择的领域,可能需要几年时间。从人工智能创业的角度来看,你的错误率越低,就越难改进,这又会成为一个问题,这取决于领域。

回路中的人类

另一个重要的问题是人工智能过程中经常需要人的参与。尽管有精确标记的训练数据(这很少)和非常好的模型,“人在循环中”的必要性永远不会完全消失。

从成本角度来看,需要有人来保持您的解决方案产生准确的结果,这可以使您重新考虑与其他更依赖于更好的界面的成本更低的解决方案相比,人工智能实现的相关性。

可解释性

在许多行业或用例中,理解结果背后的逻辑是关键。如果你的客户非常依赖传统的统计方法,他们不太可能接受一个模型不可解释的解决方案。解释你的算法如何工作的能力也是你专业知识的证明。

实际上,如果结果可以解释,产品经理更有可能接受 ML 建议。

我们经常遇到人工智能初创公司在解释我们的概念验证中可用的结果时遇到问题。不用说,正因为如此,我们对生产的发展没有信心。

我相信,要么你是在建立你的模型来解释或预测什么。大多数时候,一个更擅长解释现象的模型并不擅长预测它。

此外,准确预测结果的模型通常具有非常明显的特征,并且构成了预测能力的很大一部分,因此这并没有给它们很大的解释能力。

除了上面提到的与 ML 相关的问题,我还可以解释与基于 ML 的迁移学习能力差相关的问题。

掌握商业基础

除了机器学习,人工智能创业公司为什么失败的根本问题大多与商业基础有关。人工智能初创公司需要控制走向市场的机制,创造产品的价值主张,找出他们真正的竞争优势/可防御能力、可扩展性、客户吸引力等。

技术差异化在 AI 行业很难实现。事实上,新的模型架构大多是在开放的学术环境中开发的。此外,可以从开源库中获得预训练模型,并且可以自动优化模型参数。

最后,数据是人工智能产品最重要的方面,然而,它通常归其他公司所有,在公共领域可用(开放数据),或者最终成为商品。

作为一家人工智能初创公司,取得成功极其困难。特别是对于机器学习需要以 100%的准确率执行的用例...

领先公司如何扩展人工智能

原文:https://towardsdatascience.com/how-leading-companies-scale-ai-4626189faed2?source=collection_archive---------22-----------------------

构建人工智能生产*台的五个关键原则

ID 43061079 康斯坦丁·沙克莱因| Dreamstime.com

人工智能超越了炒作,进入了产业化阶段。关于人工智能的必要性的信念非常普遍——在各行各业都是如此。然而,只有大约 5%的全球企业为人工智能的工业化增长做好了准备(根据这项研究)。为了获得真正的好处,组织需要能够扩展人工智能解决方案。这听起来很明显:每个人都在谈论人工智能,而缩放是游戏的名字。

但是 scaling AI 到底是什么意思呢?这对组织的数据和技术堆栈提出了什么要求?这与大多数传统基础设施有何不同?您如何构建技术能力来满足这些新的需求?

反思我自己支持大型组织的人工智能之旅的经历,我将试图阐明这些问题。

缩放 AI

人工智能的采用展示了与过去任何其他重大技术革命相同的模式。普遍电气化用了 30-40 年。AI 也不会有什么不同。根据阿马拉定律,一项新创新的影响在短期内通常会被高估,但在长期内会被低估。潜在的原因是,在技术的真正潜力出现之前,应用技术的环境需要改变。对于人工智能来说,这种现象被称为人工智能生产率悖论。为人工智能建立一个概念证明并展示其所有令人惊叹的壮举似乎很容易。但是在整个企业的运营过程中实施和扩展人工智能是完全不同的事情。我们来看看 scaling AI 到底是什么意思。

规模
假设一家全球化学品生产商使用来自机器的传感器数据来预测故障并实施预防性*护措施。泵或压缩机是一个典型的例子。他们在世界各地的不同植物上有数千个这样的基因。有不同类型的压缩机,具有不同的故障模式和相应的预测数据模式。为这种类型的机会开发人工智能解决方案将从一种特定类型的设备的机器学习模型开始,并测试不同的机器学习技术。缩放意味着在全球范围内为相同的设备推出这些模型,随后为每种不同类型的泵或压缩机重复这些步骤。您甚至可以通过构建一个系统来自动训练、实现和缩放不同类型设备的模型,从而实现这些步骤的自动化。包括影子模型在内,这可能相当于成千上万的算法全部在生产中运行。

范围
另一种形式的规模化 AI 是指 AI 在不同团队、部门、针对不同用例的无孔不入的使用。大规模部署人工智能意味着组织中的任何人都可以使用机器学习来优化工作流程——也就是人工智能的民主化。尽管人工智能的影响并非不受帕累托原则的影响——80%的价值将与 20%的潜在用例坐在一起——但最终机器学习的使用将随处可见。允许这种情况发生显然需要一些标准化和结构化的能力。

速度
也许最微不足道的可伸缩性形式都与基础设施资源有关。根据人工智能解决方案的类型,需要易于扩展的存储、内存或计算资源。例如,训练深度神经网络可能需要大量的内存和计算能力。运行算法来产生预测(也称为推断)通常比训练需要更少的计算能力,但同时需要提供低延迟。也就是说,如果你想向一个在线浏览的顾客推荐下一个要购买的产品,这必须在几毫秒内完成。当你的网站同时与数以百万计的客户互动时(想想亚马逊),每一次互动都会引发必须同时进行计算的推论。

能够大规模产业化人工智能的领先组织在以下三方面做得特别好:

  • 他们设定方向并遵循路线。人工智能的采用是一个循序渐进的过程。它需要愿景、战略和一个将快速取胜与规模化路线相结合的游戏计划。高层领导的持续承诺是长期成功的关键。你必须全力以赴,但要有聪明的专注和毅力。
  • 他们有人工智能解决方案开发和实施的剧本。人工智能驱动的商业创新遵循一个典型的生命周期,从想法或概念证明到经过测试的原型、MVP 以及最终实施的生产级解决方案。一个行之有效的方法来重复做这件事,使逐渐发展和扩大新的人工智能机会领域,并成为一个真正的人工智能驱动的组织。
  • 他们有一个支持大规模人工智能的技术*台。 AI 解决方案对技术架构提出新要求。设法扩大人工智能规模的公司已经开发了标准化*台,允许以稳健和可持续的方式快速开发人工智能解决方案。

接下来的章节将探讨构建一个允许扩展人工智能解决方案的技术*台的五个原则。

构建可扩展人工智能*台的五个原则

在最高级别上,人工智能的可扩展性需要*台功能,将数据架构中两个以前分离的领域结合起来:数据的操作或交易方面,以及用于分析或建模的数据的分析使用。人工智能*台构成了桥梁:它消耗数据来产生经过训练的机器学习算法,这些算法随后被部署为运营领域的生产级服务,供应用程序和用户用于决策。就这么简单。以下是构建可扩展人工智能堆栈的五个原则。

人工智能*台的高级参考架构

1.作为微服务的算法

将机器学习模型投入生产的经典方法是建立一个管道,该管道接收最新的输入数据,使用该输入运行模型,并将输出存储在数据库中。使用预测的应用程序随后可以从该数据库中获取数据。虽然这种方法本身没有什么问题,但是它的可伸缩性不是很好。现代 ML 用例需要按需预测,每秒钟可能有数千个请求。因此预测流水线不能被提前调度。此外,它需要能够根据工作负载快速扩展。

部署 ML 模型的新兴最佳实践是将它们与构建在其上的 API 一起打包成带有容器的微服务(如 Docker)。容器化是应用程序开发的最新范式,具有许多也适用于人工智能应用程序或认知服务的优势:

  • 可重用性和松耦合。将 ML 模型部署为容器允许任何其他应用程序在没有任何依赖性的情况下利用这种预测服务。模型变得独立。基于松散耦合的微服务,共享相同的算法,构建多个人工智能系统变得非常容易。预测是按需完成的——因此有了术语认知服务
  • 自动缩放&调度。一旦模型被部署为容器,所需的资源(如计算)就可以根据工作负载通过容器编排服务(如 Kubernetes、AWS Elastic Beanstalk 或 Azure App Services)进行扩展。
  • 便携性。由于算法被打包成一个可以在任何地方执行的通用容器,算法在操作过程中的使用不再依赖于特定的工具。此外,容器是*台无关的。它们可以很容易地从一个云移动到另一个云,并以高度分布式的方式运行。这使得在接*数据的位置公开算法变得容易(例如在边缘应用中)。

结合起来,容器化为将算法投入生产提供了一种高度标准化、灵活且可扩展的方法。

例如,考虑一家开发了违约概率(PoD)模型的金融服务公司。该算法用于新客户的核保流程。但它也可以作为定期资产风险评估的一部分应用于现有客户。该模型作为独立的服务运行,可以调用该服务来基于不同的输入数据进行预测。因此,它已经成为一种非常可扩展的认知服务,可以跨不同的应用程序和流程使用。

2.构建和管理算法的工厂方法

将算法作为微服务来生产需要一条具有适当质量管理和控制机制的流水线。产生算法的一种六西格玛方法:

  • 标准化&自动化工作流程。需要一个标准化的工作流(装配线)来实现算法的可扩展生产,而不是为每个单独的用例构建特定的工作流。考虑到模型不是一次性开发的,而是需要持续的*护和再培训。因此,对数千种型号重复进行这种大规模操作需要完全标准化和自动化的装配线,可以复制用于任何新的人工智能解决方案。装配线获取源数据,将其转换为机器学习训练的格式,开发模型,设置验证集,在测试集上测试模型性能,最后将模型部署为容器。
  • 性能监控&发明。六个西格玛旨在减少制造过程中的差异:质量的上限和下限必须超过标准偏差的 6 倍,这意味着缺陷率为百万分之 3.4。类似地,模型预测将落入一个带宽内。监控这种样本外的性能,即模型在实践中而非历史数据上的表现,对于检查算法至关重要。例如,这包括提高预测能力、减少偏差和触发再训练以减轻概念漂移。
  • 可追溯性。在欧洲,新法规要求组织能够解释影响客户的算法决策。负责任的人工智能正在成为一个热门话题。因此,追溯模型版本的能力,包括附带的训练数据,正在成为一个必要条件。就像设备和制造零件有序列号一样,算法需要透明和可追溯的生产流程。因此,模型装配线需要以一种有组织的方式存储所有相关的工件(输入、输出和废料)。

对于许多渴望大规模使用人工智能的组织来说,迈向模型生产的标准化装配线是一个巨大的挑战。尽管在这方面有巨大的行业创新,并且许多组件都可以作为标准化(云原生)服务获得——例如用于 AWS 的 Sagemaker,或者 Azure ML——但是仍然需要相当多的专业工程来将所有部分组合在一起。

3.多条数据集成路线

前两个原则是全新的,是人工智能到来所固有的。第三个原则与数据管理有关,这通常是与传统环境斗争的根源。

人工智能的创新需要比大多数传统数据架构更大的数据集成灵活性。
企业数据仓库的建立是为了提供一个真实的单一来源,在此基础上可以构建数据产品。数据的高度完整性和高效重用是以僵化和高额前期投资为代价的。这适用于稳定的用例,这些用例可以提前很好地定义,并且基于结构化的和缓慢移动的数据——例如企业报告。人工智能解决方案有更广泛的需求,介于传统的 BI 产品和商业应用之间。如上所述,它们结合了数据的操作和分析用途。因此,需要一种更加通用的数据管理方法:

  • 人工智能需要在生产中进行实验。MVP 上线后,人工智能解决方案将进入下一个生命周期的持续改进阶段。这通常会导致添加新功能(数据)来优化性能。dwh 的长开发周期与人工智能驱动的创新的敏捷和迭代性质不匹配。
  • AI 需要大数据。基于机器学习的新创新通常来自于使用新的数据源,潜在的海量和非结构化数据。传统的数据集成*台不能满足这些需求。

为了促进快速的人工智能驱动的商业创新,你的人工智能*台需要支持数据集成实践,在灵活性/创新和鲁棒性/稳定性之间取得正确的*衡。这可以通过允许本地数据集成路线来实现:

  • 仅用于核心数据(ETL)的数据仓库。DWH 概念并未消亡,但需要从企业级的一刀切解决方案重新构建为针对最重要数据资产的基于领域的数据集成。拥有一个坚实的数据仓库仍然是有意义的,例如客户和产品数据,它被所有信息产品用作单一的真实来源。
  • 直接数据管道(ELT) 。对于用例特定的数据,需要第二条路线,该路线没有被指定用于 DWH 集成。许多人工智能解决方案需要核心数据(可以从 DWH 获得)和来自多个来源的非常具体的数据(例如点击流数据)的组合。与使用预处理集成步骤(ETL)构建大型 DWH 不同,所讨论的特定解决方案的数据管道在从多个源位置加载数据后处理数据集成(例如,用于核心数据的 DWH 和用于其他解决方案特定数据的数据湖)。
  • 分层数据湖。为了支持特定于解决方案的数据管道,可以使用数据湖来存储包含不同区域或层的源数据,这些区域或层具有不同程度的数据预处理。这些区域为集成层的不同组件提供信息,例如为 DWH 或开发沙盒提供原始数据。可以建立一个包含精选数据的区域,为特定于解决方案的 ELT 数据管道提供数据。

4.多模式数据交换:从批处理到基于事件

可扩展 AI 部署的数据架构的另一个关键特性是支持多种数据交换模式,特别是支持实时数据的使用。这是 IT 集成的传统数据架构(连接应用程序环境)与用于分析目的的现代数据使用(提供实时 BI 或 AI)相融合的地方。

实时数据交换的主要范例是使用基于例如 Kafka 消息*台的事件驱动架构(EDA)。EDA 对于将模型部署为微服务来说是理想的,正如上面在#1 中所描述的,但是它是一个更广泛的概念,可以作为所有数据交换的主干。源数据中的任何更新都作为单独的事件发布,这些事件可以由数据集成*台和管道处理,它们实时监听这些事件。人工智能*台连接到 EDA 以获取数据,并反过来部署经过充分训练的算法,这些算法可以通过按需提供预测来对事件做出反应。

5.利用云组件进行敏捷开发

第五个原则是将敏捷开发方法应用于您的*台基础设施。传统数据架构和基础设施的特点是基于供应商的整体系统,这些系统旨在作为一种通用的*台运行。众所周知,这些基础设施落后于形势,甚至在完全实施之前就迅速变得过时甚至过时。以 nirvana 最终状态视图结束*台迁移已成为常态。

*台开发的现代方法是使用最佳组件构建更灵活的架构。这既是必要的,也是可能的。

有必要。有两个原因。首先,可替代性。构建一个针对不同组件使用不同技术的*台可以防止供应商锁定。第二,敏捷。技术发展的速度往往比任何人都快。构建一个由不同技术组件组成的*台,可以防止在单一提供商或技术上押下大赌注。交换技术和从多种创新来源中获益变得更加容易。

有可能。云原生技术和开源技术的结合使得将不同的*台组件缝合在一起成为可能。云创造了一个提供无缝集成的生态系统:它往往只是工作。标准乐高积木的使用允许一种 DIY 方法,而不会产生(太多)技术债务和定制基础设施,这些都必须在以后清理(因此循环是连续的)。

如何着手建立一个人工智能*台

一旦你同意了目的地,就该考虑旅程了。*台开发中最大的陷阱是由一个专门的*台团队孤立地进行开发。相反,应用敏捷开发原则#5,利用前端运行用例的需求来创新*台。参考下图,通过在两个轴上同步前进,从 1a 到 3e:开发解决方案和*台,这是一个很好的协同行动。

你对人工智能的愿景和战略需要从高层次的价值池转化为具体的人工智能解决方案设计。随后,最有前途的解决方案将经历一个结构化的开发周期——从构思一直到大规模优化解决方案。同时,这些第一解决方案对*台提出了要求。这提供了一个以非常实用的方式构建新*台组件的机会,可以立即在实际解决方案上应用和测试新功能。这是一个严格管理快速上市时间(y 轴)和构建高*台标准(x 轴)之间的权衡的问题。

替代方案是有风险的。业务团队最终构建难以扩展的单点解决方案(1c),或者 It 团队花费数年时间构建几乎不被使用的*台(3b),这不会是第一次。

很好奇听听大家对 scaling AI 的看法和体验!

沃特·惠根
mico company 的管理合伙人

学习 Python 如何让我在两年内获得两次晋升

原文:https://towardsdatascience.com/how-learning-python-earned-me-two-promotions-in-two-years-3bbd69ef2d63?source=collection_archive---------8-----------------------

个人经验教训

学习 Python 深刻地改变了我的人生轨迹,给我上了无数课。但是在这一切的背后有一个简单的观点:专注于你能控制的事情。站在(开源)巨人的肩膀上,你可以用零预算的*项目创造很多价值。更大的任务自然会到来。

我既不是动机教练,也不是专业开发人员——在我的环境中可能是成功的模式在你的环境中可能不是。我帮助几十个同事开始了他们的编码之旅,并看到了下面的剧本——这就是为什么我决定进一步分享它,我希望它也能帮助你开始。

马特·霍华德Unsplash 上拍照

梦想

要理解我的故事,了解我总是对技术着迷是有帮助的。我最初的记忆之一是摆弄一台旧收音机,把它拆开,检查电路,然后重新组装(不用说,收音机停止工作了)。十几岁时,我迷上了游戏机和电脑。我一直热衷于学习如何编程,但我的大多数尝试都没有超越教程的复制。在大学期间,我到处写*应用程序,但这从未真正成为习惯。当我在一家大型金融服务公司开始我的第一份工作时,我满怀希望。

照片由张秀坤在 Unsplash 上跳舞

大学一毕业,我就被聘为金融/经济评估分析师。我的梦想是写代码,成为一名开发人员,用技术解决问题。我想象着把一个想法告诉我的经理和同事,然后获得正式授权继续下去。听起来像是妄想,对吧?如果没有实质或证据证明我的想法会成功,人们怎么会相信我的想法呢?最重要的是,这不是我受雇的目的。

惊喜,惊喜——大任务从来没有来过。时光流逝,我的第一份工作已经做了三年。我不停地观看技术会议广播,阅读博客,看蓬勃发展的开源社区正在生产什么样的令人敬畏的产品。我想成为一名开发人员的愿望越来越强烈,但情况并没有改变。我学到了很多关于金融建模和经济框架的知识。但在内心深处,我热衷于应用硅谷公司吹嘘的新奇技术。

💡希望完美的任务降临到你的头上是一个美好的梦想——但不太可能,也不在你的控制范围内。

开始旅程

在大学里。NET framework 和 C#是我的技术选择。直到今天,我仍然热爱 C#语言的优雅和表现力。然而,在工作中,我大部分时间都在处理数据。NET 库似乎不是最适合解决数据科学问题的。于是,我把目光转向了 Python。由于我非常想写代码,所以我参加了一个挑战:在空闲时间写 100 天 Python 代码——没有借口。有些日子是快乐的,我不能停止编码几个*时。在其他日子里,我觉得很懒,只写了几行。但是我挺过来了,100 天后我想知道我的下一步会是什么。

在那段时间,我在工作中有一项任务,为此我不得不重复地为财务报告执行一些数据验证。一开始,这很有趣。不过,在第五次之后,我厌倦了在 Excel 中一遍又一遍地创建同样的十个数据透视表。就在那时,我感到迫切需要将我新获得的 Python 技能付诸实践。

Python 和 pandas 包提供了 Excel 的所有数据处理功能。然而,虽然 Excel 让您可以控制每一个单元格,但对于 pandas,您考虑的是表格列(向量)。假设您想对两列进行总结。在 Excel 中,您在第一行中定义一个公式,并将其向下拖动。对于 pandas,您引用的是列名——在幕后,操作将一次性应用于整个列。所以如果你突然多了几行,你永远不需要调整你的逻辑。数据聚合通常只需要一行代码就可以完成。

照片由埃米尔·佩龙Unsplash 上拍摄

这非常适合我的任务,因为我执行的大多数检查都是简单的聚合和比较。你可能会认为我在用教程写了 100 天的代码后已经准备好了。不幸的是,他们没有教我如何自己解决问题。遵循教程是一回事,但将问题转化为可管理的步骤是完全不同的另一回事。

谷歌是我最好的朋友。一步一步,我在博客和 StackOverflow 问题中爬行,直到我能把问题翻译成代码。这非常慢,但最终,所有检查的自动化都完成了。手动执行所有验证需要几个*时,现在只需要几秒钟。

💡跟随教程是一个很好的起点。然而,要正确地学习一门编程语言,你必须找到自己的问题并解决它。如果有人付钱给你,那就更好了。

分享,学习,帮助

第一次成功激励了我。那时,我的团队中没有人在工作中使用 Python。大多数人都知道 Excel VBA、PowerQuery 和 Access。当我演示 Python 的好处时,它引起了人们的极大兴趣。人们认为 Python 易于阅读,我的很多同事也受到了学习这种语言的启发。尽管我是一个相对的初学者,但我突然发现我可以建议别人并帮助他们开始。

这本身就让我面临全新的问题。与我的同事一起讨论它们,并最终一起实现许多想法,我学到了很多关于语言和最佳实践的知识。与团队合作解决复杂的问题促使我扩展了版本控制、单元测试和持续集成/持续部署的视野。

💡展示你的产品——你周围的人可能会面临类似的挑战。在最坏的情况下,他们不会感兴趣,你绝对不会失去什么。在最好的情况下,他们会促进你的工作,让你注意到新的问题,在那里你可以提高你的技能。

伊恩·杜利在 Unsplash 上的照片

接受新的挑战

从那以后,挑战变得越来越大。最终,一系列意想不到的事件使一个遗留的财务应用程序变得无用——我的部门依赖它来发布财务结果。

曾经的妄想,现在成了自然的选择。我被要求组建一个团队,领导一个现代 Python 应用程序的开发。时间框架:两个月。和我的*团队一起,我们成功了,并且按时交付了(我很自豪两年后这个应用程序仍然是高效的!).

尽管这是一个令人伤脑筋的挑战,但我从不认为这是无法解决的。但我确信,如果我一直妄想着等待得到大任务的那一刻,整个项目就会悲惨地失败——我的梦想也会随之破灭。相反,慢慢培养我和我的团队的技能会让我们走向成功。

后来发生的事我控制不了。由于 Python 开发项目的成就,我获得了第一次晋升和加薪。这个成功的故事为我赢得了声誉,这让我在一年内找到了一份新工作。今天,我负责财务部门的数据整合。我使用最先进的数据*台和分布式计算来解决几年前无法想象的问题。我向聪明人学习,喜欢新的挑战。

💡从*处着手,逐步提升。然后,当更大的挑战来临的时候,你就会做好准备——它们会到来的

照片由克里斯托佛罗拉Unsplash 上拍摄

最后的话

学习 Python 是一段艰难的旅程。但是如果没有开源社区,这是绝对不可能的。开源社区创造了奇妙的工具、培训材料和许多问题的答案。我意识到在过去的几年里我一直在消耗这些。所以早就应该做出贡献并积极参与了。关于技术的推特和博客&提供帮助是卑微的起点——我渴望做得更多!

总结💡

  1. 通过教程学习基础知识
  2. 找一个问题来应用你的新技能——如果你解决这个问题是有报酬的,那是最好的
  3. 分享你的进步——你周围的人可能面临类似的挑战
  4. 在人们的旅途中支持他们——你不仅会帮助他人成长,你也会和他们一起成长

在 Twitter 上关注我

将来,我会发布更多关于 Python 和技术的帖子——如果你喜欢这篇帖子在 Twitter 上关注我,我很乐意听到你的想法和✨的个人故事

非常感谢颖颖的全面审查和巨大的反馈!👏你可以在这里读到她激动人心的科技之旅🚀:

[## 我如何用 Python 推进我的金融职业生涯

从会计师到金融科技开发者

medium.com](https://medium.com/datadriveninvestor/how-to-become-a-fintech-developer-if-you-are-an-accountant-89879bd02827)

你遇到冠状病毒感染者的可能性有多大?

原文:https://towardsdatascience.com/how-likely-are-you-to-meet-someone-with-coronavirus-4522d39487b7?source=collection_archive---------26-----------------------

最*,我看到一个帖子,问一个人在一定规模的人群中遇到新冠肺炎的可能性有多大。在这篇简短的文章中,我想描述两种计算这个数字的方法。

假设我们知道群体中随机个体为阳性的概率P(positive),我们可以使用以下公式计算一组大*为 N 的个体中至少有一个为阳性的概率:

等式 1。

上面的等式表明,在一组大*为 N 的个体中,至少一个个体为阳性的概率等于 1 减去 N 个个体为阴性的概率。现在的问题是,如何估计P(positive)

1.频率论者

一种简单的方法是将当前活跃病例数除以人口规模。

等式 2。

对于我居住的国家捷克共和国来说,在我写这篇文章的时候,这个值大约为 P(正)= 0.867% 。图一。显示了在人数为 N 的群体中遇到至少一个积极的人的概率,作为群体人数的函数。

图一。

2。贝叶斯

如果我们要测试人群中的每一个人,那么频率主义方法没有任何问题,因为P(positive)会收敛到它的真实值。然而,事实并非如此。幸运的是,我们可以使用贝叶斯公式,通过插入以下公式来获得对P(positive)的更好估计:

等式 3。

等式 4。

等式 5。

计算条件概率P(positive|tested)很简单,因为它只是阳性测试的数量除以所有测试的数量。类似地,随机个体被测试的概率P(tested)是所有测试的数量除以群体大*。一个阳性个体被检测到的概率P(tested|positive)有点复杂,因为我们并不知道人群中阳性者的真实数量。这也取决于给定国家的测试策略,他们是否只测试有症状的人,等等。我决定对此不做任何假设,并将值设置为 0.5。同样,对于捷克共和国,贝叶斯估计得出 P(正)= 3.075%。

现在我们有了所有的数字,让我们把它们代入等式 1。画出在一个规模为 N 的群体中遇到一个积极的人的概率,作为群体规模的函数。

图二。

如图 2 所示。显示,现在有问题的概率要高得多,对于一个 50 人的*组来说,一个人有大约 80%的机会遇到一个积极的人。

现在让我们将P(positive|tested)设置为过去 7 天的*均测试阳性率。我们现在得到 P(阳性)= 8.687 %,在 50 个随机人群中遇到 COVID19 阳性者的概率几乎是 100%。

图 3。

关于 P 的一个注记(tested|positive) 前面提到过,我们无法真正知道测试一个阳性的人的概率。让我们画出等式 3。作为P(tested|positive)的函数,看看我们能学到什么。

图 4。

对于 P(tested|positive)=1 的情况,即我们测试每个人,概率P(positive)收敛于频率估计。随着P(tested|positive)变*,P(positive)的贝叶斯估计变得越来越大。这在直觉上是有道理的,因为一个阳性的人接受检测的机会越*,已知的阳性病例就越少,因此频率主义者的方法低估了P(positive)的真实价值。它还表明,尽可能多的检测是至关重要的,鉴于可能有许多无症状的病例,尽可能一致地进行检测,以便最大限度地提高检测阳性者的概率。否则,对阳性病例的简单频率估计会给我们一种错误的安全感。

假设

为了本文的目的,我对这个世界做了一些假设。首先,我假设人们在随机的群体中相遇,因此任何一个个体都有同等的可能遇见群体中的另一个个体。这显然是不正确的,因为人们更有可能遇到来自同一个城市/地区/学校/工作场所的人,而不是来自国家另一边的人。第二,我假设阳性人群不会被从人群中移除,也就是说,他们不会隔离、康复或死亡。第三,我假设每个个体只被测试一次,群体之外的人不被测试。

保持安全,戴口罩,避开大群人群。

如果你喜欢这篇文章,请把它推荐给其他人,展示一下❤。此外,如果您有任何问题或意见,请在下面留下您的意见。

当一个球队在 NBA 第一次达到 X 分时,赢得比赛的可能性有多大?

原文:https://towardsdatascience.com/how-likely-to-win-the-game-when-a-team-first-reach-to-x-points-in-nba-f9de84eb6966?source=collection_archive---------52-----------------------

正如我在之前的博客文章中所讨论的那样,NBA 的进攻是围绕着超级巨星展开的。这些年来,随着人才库的增加,比赛也发生了变化,联盟也从这种变化中受益。

阿琳·德·戴娜Unsplash 上拍摄的照片

这篇文章的灵感来自哈佛体育分析的一篇文章。我想把它延长几个赛季,并探索 NBA 进攻发展背后的原因。这也可能让人们理解为什么最*几年比以往任何时候都有更多的回归。

前面已经说了,有一个非官方的定律, 劳勒定律 ,是洛杉矶快船播音员拉尔夫·劳勒(Ralph Lawler)创造的,几年前以他的名字命名。显然,对于这种分析来说,100 是一个任意的数字,但是当我们检查 NBA 一场比赛的总得分时,它似乎是一个合理的数字。

在这里,最好从评分随着时间的推移是如何变化的开始。下图代表了从逐场比赛时代(1996-97 赛季)开始到 2019-20 赛季的得分输出。

NBA 每场比赛的总得分——作者图片

公*地说,这是一种趋势,特别是在 2014-2015 年之后,得分总数大幅增加。这种变化得到了统计方法 t 检验的支持,我们可以说在 NBA 最*的历史上有两个不同的时代。t 检验给出的 p 值为 0.00228,使我们可以说两个时代的*均值之间存在显著的统计差异。

为了理解这种变化背后的原因,我深入研究了几个数据:过去 24 年的每场得分和速度。毫不奇怪,比赛变得比以前更快,由于速度和人才储备的增加,NBA 的进攻比以前获得了更多的分数。

1996-97 年至 2019-20 年 NBA 每球得分-作者图片

在这里,下面的图表代表了占有所花费的时间。所以,你每次控球花的时间越少,比赛就越快。大致可以估算一下:

->速度= 2880(总分钟)/(每次控球时间)/ 2(球队)

在分析的几年间,结果在 88-101 之间。

NBA 的步伐,1996-97 至 2019-20-作者图片

正如我在开始时提到的,在这篇文章中,我将会看看当一个队伍第一个到达某一点时,赢得比赛的可能性有多大。为了简单起见,我检查了 95,100 和 105 分阈值的情况,结果与 NBA 进攻的其他方面非常一致。

一队的胜率达到 95、100 和 105 分——图片由作者提供

在逐场比赛时代的早期(从 1996 年到 1997 年赛季),首先达到 105 分几乎可以保证( 96.1%,98.74%和 98.62% )获胜。然而,在过去的几年里,随着游戏的变化和加速,复出的机会大大增加了。首先达到 105 分显然给了球队巨大的优势,但这并不像上世纪 90 年代末那样多。详细的表格可以在下面找到,在赛季中至少有一支球队在单场比赛中达到给定分数的比赛百分比的附加列。

作者图片

表格还显示了我在本文开头提到的得分跳跃。当我们回顾 2014-2015 赛季时,至少有一支球队分别在 59.27%、70.08%、71.46%、85.77%和 85.99% 的比赛中获得了 105 分。

如果你想知道 NBA 的复出和比赛中的波动,你肯定需要查看迈克·布罗伊的网站:【inpredictable.com】,特别是,在顶级比赛的这一部分,迈克允许我们根据他定义的几个条件找到顶级比赛:兴奋紧张复出

随着 NBA 进攻的发展,得分爆炸的大门将会打开,这使得在未来的比赛中更有可能卷土重来。在下一篇文章中,我会试着看看 NBA 历史上势均力敌的比赛。

线性混合模型如何工作

原文:https://towardsdatascience.com/how-linear-mixed-model-works-350950a82911?source=collection_archive---------0-----------------------

生命科学的数理统计和机器学习

以及如何通过贝叶斯透镜理解 LMM

图片来源:*基百科辛普森悖论

这是我的专栏 生命科学的数理统计和机器学习 中的第十七篇文章,我试图以简单的方式解释生物信息学和计算生物学中使用的一些神秘的分析技术。线性混合模型(LMM) 又称线性混合效应模型,是传统频数统计中的关键技术之一。在这里,我将尝试通过优化固定和随机效应的均值和方差参数,从最大似然原理 中从头开始推导 LMM 解 。然而,在深入推导之前,我将在这篇文章中从介绍何时以及如何在技术上运行 LMM** 开始。我将从 Frequentist 和 Bayesian 框架中讨论线性建模的例子。**

数据的非独立性问题

传统的数理统计在很大程度上是基于假设极大似然主分布和正态分布。例如,在多元线性回归的情况下,如果数据中存在非独立性,则可能违反这些假设。假设数据表示为 p 乘 n 矩阵,其中 p 是变量的数量,n 是观察值的数量,则数据中可能存在两种类型的非独立性:

  • 非独立变量/特征(多重共线性)
  • 非独立统计观察(样本分组)

在这两种情况下,线性模型求解所需的数据矩阵都是奇异,因为其行列式由于相关变量或观测值而接*于零。这个问题在处理一个高*数据(p > > n)时表现得尤为明显,其中变量可能变得冗余和相关,这被称为*数灾难

*数灾难:线性模型解在高*空间发散,p >> n 极限

为了克服非独立变量的问题,例如,可以使用 【套索】 、岭或弹性网回归来选择最具信息性的变量,同时可以通过线性混合模型内的随机效应建模来考虑统计观测值之间的非独立性。

克服数据非独立性的方法:套索和随机效果建模,图像来源

在我的文章为组学集成选择特征中,我介绍了一些变量选择方法,包括 LASSO。在下一节中,我们将看到一个纵向数据的例子,其中数据点的分组应通过随机效应建模来解决。

LMM 和随机效应建模广泛应用于生命科学中的各类数据分析。一个例子是 GCTA 工具 ,它对长期存在的缺失遗传力问题的研究做出了很大贡献。GCTA 的想法是在 LMM 框架内,将所有影响*的基因变异作为随机效应组合在一起。多亏了 GCTA 模型,缺失遗传率的问题似乎至少对于人类身高来说 解决了

摘自 B.Maher《自然》2008 年第 456 期

计算生物学的另一个流行的例子是使用DESeq/DESeq 2R 包的差异基因表达分析,它并不真正运行 LMM,而是执行方差稳定化/收缩,这是 LMM 的要点之一。这种方法的优点是低表达的基因可以从高表达的基因中借用一些信息,这使得它们的测试更加稳定和可靠。

最后,LMM 是进化科学和生态学中最受欢迎的分析技术之一,他们使用最先进的 MCMCglmm 软件包来估计例如性状遗传率

数据非独立性的例子

正如我们之前得出的结论,当统计观测值/样本之间存在某种聚类时,应该使用 LMM。例如,这可能是由于采集样本的地理位置不同,或者产生样本的实验方案不同。生物医学科学中的批效应就是这种分组因子的一个例子,它导致了统计观察之间的非独立性。如果不进行适当的校正,RNAseq 数据中的批量效应会导致两个基因之间完全相反的共表达模式(辛普森悖论)。

另一个例子可以是个体之间的遗传关系。最后,这可以是在不同时间点对相同个体执行的重复测量,即技术(非生物)复制。

作为这种聚类的一个例子,我们将考虑一项睡眠剥夺研究,其中 18 个人的睡眠时间受到限制,并且在 10 天内测量了他们的有机体在一系列测试中的反应。数据包括三个变量:1)反应,2)天数,3)受试者,即在 10 天内跟踪同一个人。为了检查个体对睡眠剥夺的总体反应如何变化,我们将使用 lm 拟合一个普通最*二乘(OLS)线性回归,将反应作为反应变量,将天数作为预测/解释变量,并用 ggplot 显示。

****

我们可以观察到反应对天数有增加的趋势,但是在天数和个体之间有很大的差异。查看线性回归拟合的总结,我们得出的结论是斜率与零有显著的差异,即反应与天数之间存在统计上显著的递增关系。根据以下公式,拟合线周围的灰色区域代表 95%的置信区间:

幻数 1.96 源自高斯分布,反映了覆盖分布中 95%数据的 Z 得分值。为了演示如何通过 ggplot 计算置信区间,我们将使用 predict 函数在 plain R 中实现相同的线性回归拟合。

然而 上面的贴合有问题。普通最*二乘法(OLS)假设所有的观测值都是独立的,这将导致不相关的,因此是正态分布的残差。但是,我们知道图上的数据点属于 18 个个体(每个个体 10 个),即数据点在个体内聚集,因此不是独立的。作为替代方法,我们可以分别为每个个体拟合线性模型( lm )。****

我们可以看到,大多数人的反应曲线呈上升趋势,而一些人的反应曲线呈中性甚至 下降趋势。整体反应增加,而个别斜率可能降低,这看起来不奇怪吗?上面的贴合真的足够好吗?

我们是否用简单的普通最*二乘(OLS)线性回归模型捕获了数据中的所有变化?

答案是因为我们没有考虑数据点之间的非独立性。正如我们将在后面看到的,我们可以用线性混合模型(LMM)做得更好,它通过随机效应解释了样本之间的非独立性。尽管术语“随机效应”可能听起来很神秘,但我们将在下面展示它本质上等同于在最大似然优化中引入多一个拟合参数

频率主义线性混合模型

我们上面使用的简单线性拟合被称为固定效应 建模,因为它固定了线性回归的系数:斜率和截距。相反,随机效应建模考虑到了个体水*的斜率和截距,即线性回归的参数不再是固定的,而是围绕其*均值有一个变化

睡眠研究中个体间截距和斜率的变化

这个概念让我们想起了很多关于贝叶斯统计的东西,其中模型的参数是随机的而数据是固定的,与频率主义者的方法形成对比,后者的参数是固定的,但数据是随机的。事实上,稍后我们将表明,我们使用频率主义线性混合模型贝叶斯 分层模型获得了相似的结果。LMM 和随机效果的另一个优势是,在彼此的背景下同时对所有个体进行拟合,即所有个体拟合“了解”彼此。因此,单个拟合的斜率、截距和置信区间受到它们的共同统计量共享方差的影响,这被称为向均值收缩,我们将在下一篇文章中从头推导 LMM 时更详细地介绍它。

我们将使用 lme4 R 包中的 lmer 函数,为每个个体(受试者)的天数效应用随机斜率和截距拟合 LMM。这相当于将(天数|主题)项添加到之前在 lm 函数中使用的线性模型反应天数中。

我们可以立即看到两种类型的统计报告:固定效应和随机效应。固定效应的斜率和截距值看起来相当 类似于上面用 OLS 线性回归得到的值。另一方面,随机效应统计是样本间非独立性调整发生的地方。我们可以看到报告的两种类型的方差:跨斜率和截距共享的方差,Name =(截距)和 Name = Days,它反映了按主题对数据点进行分组,以及保持未建模的剩余方差,即我们不能在给定模型内进一步减少该方差。此外,比较固定( lm )和随机( lmer )效应模型之间的残差,我们可以看到随机效应模型的残差减少了,这意味着我们捕捉到了随机效应模型的响应变量中的 更多的变化。通过比较【AIC】【BIC】两个模型的值,可以得出同样的结论,同样,带有随机效应的 LMM 更符合数据。现在让我们想象一下固定效果模型和 LMM 模型之间的区别。****

为此,我们需要可视化 LMM 模型的置信区间。在频率/最大似然框架中建立置信区间的标准方法是通过引导。我们将从群体水*(总体/*均)拟合开始,并使用替换的重采样和每次迭代随机移除 75%的样本来重新运行多次。在每次迭代中,我将保存 LMM 拟合统计数据。积累了自举统计数据后,我将绘制两个图:首先,显示自举 LMM 拟合与上一节中使用的朴素固定效应拟合的对比;第二,根据累积的自举 LMM 拟合,我将计算中值,即 50% 百分位数,以及 5%和 95% 百分位数,它们将确定人口水* LMM 拟合的置信区间,这将再次相对于原始固定效应拟合进行绘制。

固定效果(蓝线,灰色区域)与自举 LMM(黑线和红线)。

上面,固定效应拟合(蓝线+灰色 95%置信区间区域)与计算的自举 LMM 拟合(左图)和自举 LMM 拟合(右图)的汇总统计(百分位数)一起显示。我们可以观察到,人口水*的 LMM 拟合(lmer,红线,右图)与固定效应拟合(lm,蓝线,两幅图)非常相似,差异几乎不明显,它们很好地重叠。然而,计算出的 LMM 的自举拟合(黑色粗线,左图)和置信区间(红色虚线,右图)比固定效应拟合(两张图上的灰色区域)的宽一点。这种差异部分是由于固定效应拟合不能解释个体水*的变化,而 LMM 却能解释群体和个体水*的变化。

另一件有趣的事情是,我们观察到斜率和截距在其*均值附*的变化:

因此,我们可以假设,在 Frequentist 框架内构建置信区间的自举过程可以被视为允许斜率和截距遵循一些初始(先验)分布,然后从这些分布中采样它们的似是而非的值。这听起来很像贝叶斯统计。事实上,bootstrapping 非常类似于贝叶斯统计的工作马马尔可夫链蒙特卡罗(MCMC)** 。换句话说,使用 bootstrapping 的频率分析在很大程度上等同于贝叶斯分析,我们将在后面更详细地讨论这个问题。**

睡眠剥夺研究中的 18 个人的斜率、截距和置信区间如何?在这里,我们再次将他们的固定效应统计数据与 LMM 统计数据一起绘制出来。

同样,红色实线和虚线对应于 LMM 拟合,而蓝色实线和灰色区域描绘了固定效果模型。我们可以看到,个体 LMM 拟合(lmer)及其置信区间可能与固定效应(lm)模型非常不同。换句话说,个体拟合朝着它们共同的群体水*均值/中值【缩*】,所有拟合相互帮助,以获得更稳定和相似的群体水*斜率、截距和置信区间。在下一篇文章中,当从零开始推导 LMM 时,我们将理解,这种向均值效应的收缩是通过在最大似然优化过程中再增加一个拟合参数(共享方差)来实现的。

频繁/最大似然与贝叶斯拟合

在进入贝叶斯多层模型之前,让我们简单介绍一下频率主义者和贝叶斯方法之间的主要区别。LMM 通过 lme4 / lmer 使用的 Frequentist fit 是基于最大似然原理,其中我们最大化观察数据 y 的似然 L(y),这相当于最*化模型的残差,普通的最*二乘法。相比之下,贝叶斯线性模型基于最大后验概率原理,我们假设数据以某种似然 L(y)分布,并在线性模型的参数上增加了一个先验假设。****

在这里,我们计算模型参数(而不是数据)的概率分布,这自动给我们参数的不确定性(可信区间)。

贝叶斯多水*模型

贝叶斯** 先验分布应用于参数的线性混合模型(LMM)称为贝叶斯多级模型贝叶斯分层模型。这里,为了实现贝叶斯拟合,我们将使用与 lme4 / lmer 语法相同的 brms R 包。然而,需要记住的一个重要区别是,通过 lme4 / lmer 拟合 LMM 应用了最大似然(ML)原则,即它不使用关于参数的先验假设(或者在一种情况下,它使用*坦先验),而 brms 中的贝叶斯多级模型设置了反映数据的合理先验。另外值得一提的是 brms 在引擎盖下使用概率编程语言 Stan 。我们从使用 brms 的贝叶斯总体水*拟合开始,并显示结果:**

在上面,我们再次用蓝线和灰色区域绘制了固定效应人口水*拟合置信区间,我们还添加了人口水*贝叶斯多水*模型,使用红色实线表示中位数,红色虚线表示可信区间。至于自举 LMM 拟合的情况,我们可以得出结论,总体水*贝叶斯多水*拟合与固定效应拟合完全重叠,而贝叶斯可信区间比固定效应拟合的 95%置信区间宽一些。个人适合度呢?

与个体自助频率主义者 LMM 拟合类似,我们可以看到,具有 brms(红色实线)的个体贝叶斯拟合并不总是收敛到固定效应频率主义者拟合(蓝色实线),而是【尝试】** 与总体水*拟合(先前的图)对齐,以便彼此尽可能相似。与频率主义者的固定效应置信区间相比,贝叶斯可信区间有时看起来又非常不同。这是使用贝叶斯先验并通过多层建模说明数据中的非正态性和非独立性的结果。**

摘要

在这篇文章中,我们了解到频率主义线性混合模型(LMM)和贝叶斯多级(分层)模型被用来解释非独立性以及数据点的非正态性。与普通的最*二乘(OLS)线性回归模型(固定效应)相比,这些模型通常提供更好的拟合,并解释数据中更多的变化。虽然模型的总体水**均拟合通常收敛于固定效应模型,但个体拟合以及可信区间和置信区间可能会有很大不同,从而更好地反映了数据中的非正态性。

在下面的评论中,让我知道哪些来自生命科学的分析技术对你来说似乎是 T2 特别神秘的,我会在以后的文章中介绍它们。在我的 Github 上查看帖子中的代码。在 Medium 关注我,在 Twitter @NikolayOskolkov 关注我,在 Linkedin 关注我。在下一篇帖子中,我们将从最大似然 出发 推导出线性混合模型并从头编程,敬请期待。

机器学习如何帮助留住客户

原文:https://towardsdatascience.com/how-machine-learning-can-help-with-customer-retention-6b5bf654e822?source=collection_archive---------9-----------------------

布莱克·*斯兹在 Unsplash 上的照片

基本方法

建立一个客户流失模型来理解客户离开的原因

“…您的支付无法完成…”—邮件中写道

我很沮丧

“又来了!!!!…”——我喊道

这是我的订阅连续第三个月出现这种情况。

我试着给客服打电话,发信息,但是没有人接,也没有解决办法。

我想过退订。要是我不那么喜欢这个产品就好了。

我开始寻找其他提供同样服务但客户服务更好的公司。

C 对于电子商务和在线业务来说,这是一个重要且具有挑战性的问题。

对于任何一个企业来说,在一段时间内,客户可以分为三大类:新获得的客户、现有客户和流失的客户。

被搅动的顾客是那些决定结束与公司关系的人。

因为它们可以转化为收入的直接损失,所以预先预测可能流失的客户可以帮助公司挽回这一损失。

我们可以通过将案例分为不同类别来对客户流失进行分类:

合同流失:此类流失适用于提供不同服务的企业,如有线电视公司。当客户决定不再继续他们到期的合同时,就会发生这种情况。

自愿流失:指客户决定取消现有服务的情况,适用于提供非固定期限服务的公司,如预付费手机或流媒体订阅。

非契约性流失:这种类型的流失适用于依赖零售场所或在线商店的企业,例如,可能与消费者在未完成交易的情况下离开可能的购买相关。

非自愿流失:当客户不再与信用卡公司合作或无法支付信用卡账单时,就会发生这种情况。

每个顾客都是不同的。所以,客户流失有几个完全不同的原因。

其中,我们可以发现产品使用不足、服务差,或者其他类似服务的定价更好。

然而,有一点适用于所有行业:

获得新客户的成本高于留住现有客户的成本

因为获得它们的成本很高,所以努力留住它们是明智的。

公司通过了解客户来避免客户流失。实现这一点的最佳方法之一是通过分析历史和新的客户数据。

跟踪客户流失的指标之一是保留率,这是产品满足强大市场需求程度的指标,称为产品-市场匹配度。

如果产品与市场的匹配不令人满意,公司可能会经历客户流失。

分析和提高留存率的有力工具是流失预测;一种帮助找出在给定时间段内哪个客户更有可能流失的技术。

我们如何建立一个预测流失模型?

预测流失模型是一种分类工具。一种模型,它着眼于不同客户的特征,并了解哪些特征对确定客户是否会流失很重要。

在用于预测流失的最常见的分类模型中,我们发现支持向量机(SVM)、逻辑回归、随机森林、人工神经网络和朴素贝叶斯算法。

假设我们有一个数据集,包含从银行提取账户的 10000 名客户的数据。这些数据描述了这些客户的一些属性,例如他们居住的国家、他们的信用评分、年龄、余额等等。

我们的模型应该预测客户是否会流失。所以我们的目标变量将是exited

我们应该分析数据,重点关注不同的特征如何与客户流失状态相关联。

但首先,让我们看看有多少客户流失。

我们可以观察到 20.37% 的客户发生了流失。

这些信息很有价值,因为对于分类模型,我们需要确认我们的数据集没有遭受数据不*衡,这通常反映了数据集中类的不*等分布。

即使阶级分布不均,我们也可以说它并没有遭受高阶级的不*衡。

之后,我们可以分析分类变量和目标变量之间的关系

从这些情节中,我们了解到几件事:

a.流失的女性客户比例大于男性客户比例。

b.大多数顾客来自法国。然而,德国和西班牙的客户流失比例更高。

c.流失的非活跃成员的比例高于活跃成员的比例。

现在,我们可以关注连续变量和目标变量之间的关系。

从这些情节中,我们了解到几件事:

a.流失的顾客比保留的顾客年龄大。

b.流失客户和保留客户之间的信用评分或任期中位数没有差异。

c.在流失的客户中,大多数人的银行账户似乎仍有可观的余额。

d.无论是估计的工资还是产品的数量似乎对客户流失都没有影响

在我们开始寻找预测客户流失的模型之前,我们需要做一些特性工程。

首先,我们将创建新功能。

我们拥有的一些变量可以结合到新功能中,以便更好地描述客户。

我们之前看到,信用评分对交易量没有影响,因为信用评分通常会随着时间的推移而增加(因此,随着年龄的增长),我们将创建一个新的特征来说明年龄对信用评分行为的影响。

从年龄比例来看,频繁交易的客户似乎信用评分较低。

我们已经看到,预计工资对客户流失的可能性没有影响。

然而,一个有趣的探索特征是余额和工资之间的比率,因为这可以估计客户花费他们工资的百分比,并且可以是客户流失的可能指标。

我们已经使用agecredit scorebalance创建了新的变量。因此,我们将把它们排除在分析之外。它们将与我们的新变量相关联。

之后,我们将对分类变量进行编码。

为了训练和测试我们的模型,我们需要将数据集分成两个子数据集:训练数据集和测试数据集。

通常使用 80%-20%的规则来分割原始数据集。

使用可靠的方法分割数据集以避免数据泄漏是很重要的;这是存在于测试集中的例子,它们也存在于训练集中,并且可能导致过度拟合。

我们准备建立不同的模型,寻找最适合的。预测客户流失是一个二元分类问题:在给定的一段时间内,客户要么流失,要么保留。

我们将测试:

  1. 逻辑回归分类器
  2. 支持向量机采用径向基函数核
  3. 随机森林

对于每个模型,我们将遵循以下步骤:

参数搜索 : 我们将确定我们要在每个模型中搜索的参数和值。然后,我们将执行GridSearchCV并设置在我们的模型中获得的最佳参数。

最佳模型拟合: 找到最佳估计量后,我们将使用训练数据集对其进行训练。

性能评估: 用我们的训练数据集训练出最好的模型后,我们要看看它们用我们的测试集表现如何。

1 逻辑回归 : 逻辑回归是最简单的机器学习模型之一,但却是非常有用的一种。

它创建了一个模型,解释自变量如何对二元因变量产生影响。

换句话说,它定义了一个等式,其中包含了被认为会影响客户流失的特征,并试图为已经流失或没有流失的客户估计每个变量的最佳系数。

当我们计算这个模型的准确性时,结果是 81%。然而,召回率和 f1 分数在 50%左右,并且有很多假阴性,这是我们应该避免的情况。

2

为了将这些点分为两组,无论客户是否有交易,它都试图找到一个超*面,尽可能大的间隔将两组分开。

SVM 模型为每个数据点生成一个预测,并预测客户是否在流失群体中。

当我们计算这个模型的准确性时,结果是 83%。召回率和 f1 值从 50%提高到 64%。还是有很多假阴性。

3随机森林分类器:随机森林是一种基于集成的算法。它包含大量随机化的决策树。

这些决策树中的每一个都将对一个点进行分类,最终,所有树所达成的决策的多数票将被采用。这种技术有助于避免过度拟合。

当我们计算模型的精确度时,它是 84%。召回率和 f1 评分提高了一点,达到 66%。还是有很多假阴性。

三种模型的 ROC 曲线比较

我们可以使用 ROC 曲线并计算曲线下的面积来进一步研究假阳性率和真阳性率,曲线下的面积也是我们模型预测能力的度量。

如果该值更接* 1,意味着我们的模型在将随机样本分成两类方面做得很好。

比较三种模型的曲线下面积值,我们看到随机森林比逻辑回归模型表现更好。

特征重要性

我们将分析不同的功能如何影响客户流失。为此,我们将检查变量的重要性。那就是量化每个变量对我们的模型有多有用。

这是一个重要的分析。我们可以确定哪些特征使客户更有可能流失,并制定有针对性的策略。

因为 SVM 不可能得到特征重要性。因为算法像黑盒一样工作。

对于逻辑回归,我们可以使用来自sklearn.feature_selection的函数SelectFromModel。该函数将根据重要性权重选择功能。

我们可以看到,gendernumber of productsmember statuscredit score by age比率是预测客户是否会流失的四个最重要的特征。

另一方面,从RandomForest中获得特性重要性很容易。scikit-learn 实现有一个方法.feature_importances_,它会告诉我们每个特性的重要性。

我们可以看到number of productsmember statuscredit score by age比率再次成为预测客户是否会流失的最重要特征。此外,balance salario ratio在这种情况下也很重要。

总之,这些模型显示出一些改进的余地。因为我们想发现会流失的客户,所以我们应该避免假阴性。

从特征重要性中,我们可以观察到产品数量和按年龄比例的信用评分对两个模型都很重要。

活跃成员离开的事实令该公司担忧,它应该发出警报。

如果你想看到完整的代码,请查看我的 GitHub repo :

[## UGIS 22/churn _ 模型

客户流失,也称为客户流失,或客户流动,是客户的损失,它是一个重要的…

github.com](https://github.com/ugis22/churn_model)

如果您想了解更多关于客户流失模型的信息,这里有更多资源:

如何利用机器学习在体育博彩上赚钱

原文:https://towardsdatascience.com/how-machine-learning-could-help-on-horse-racing-betting-part-1-7aa363f75ca2?source=collection_archive---------14-----------------------

机器学习在赛马博彩策略中的应用

编者注: 本文仅供教育娱乐之用。如果你想用给出的模型进行真钱下注,你要自担风险。请确保它符合您的博彩公司的条款和条件。

机器学习已经广泛应用于许多时间序列分析和预测中。借助于大量的历史数据和当今的计算能力,ML 模型有时可以对体育博彩决策产生极其有用的洞察力和指导。

Julia Joppien 在 Unsplash 上的照片

这篇文章阐述了机器学习如何帮助赛马博彩策略。我们将使用从香港赛马会主页上抓取的数据,香港赛马会是世界上最古老和最大的赛马机构之一。为了避免数据泄露和评估模型的真实性能,我们将只使用 2007 年初至 2019 年秋季的匹配数据来建立模型,并使用它来押注新的即将到来的比赛。我们利用该模型,建立了一个独特的投资策略,在两个月的时间内(2019/09-2019/11)下注,并在实验中获得正回报。

数据集

正如我们之前提到的,我们将使用 2007 年至 2019 年在香港举行的所有比赛作为训练和验证集。以及用于测试集的 2019 年冬季数据,以评估整体博彩组合的表现。在包含关于每场比赛的各种信息的训练数据中有 109085 行和 61 列。

索引
Rdate:比赛日期
Rid:比赛 ID
Hid:马 ID
地点:比赛场地(HV,ST)
赛道:赛道(TURF, AWT)
进行:赛道状况
过程:赛道(AWT 将没有具体的赛道描述)
级别:比赛的赛道级别
距离
rfinism:以百分之一秒(1/100 秒)为单位的比赛结束时间
Rm1:比赛第一段终点时间秒
Rm2:比赛第二段终点时间秒
Rm3:比赛第三段终点时间秒
Rm4:比赛第四段终点时间秒
Rm5:比赛第五段终点时间秒
Rm6:比赛第六段终点时间秒
Horsenum:马的马号
jname:Jockey
Tname:Trainer
Exweight:马所承载的残疾人重量
Bardraw: draw
档位:档位上马
等级:马的等级
等级 chg:马与前一场比赛的等级变化
马的重量
马的重量 chg:马与前一场比赛的重量变化
Besttime:马在相同场地、距离和赛道的比赛中的最佳完成时间(分钟。 第二。centi second)
年龄:马的年龄
优先权:驯马师给的马参加比赛的优先权。
Lastsix:前 6 场比赛的名次
Rank:本次比赛的名次
Runpos:该马在比赛中各分段的名次。
P1:马的第一段成绩
P2:马的第二段成绩
P3:马的第三段成绩
P4:马的第四段成绩
P5:马的第五段成绩
P6:马的第六段成绩
M1:马的第一段成绩第二的完成时间
M2:马的完成时间 岑体二马第二段
M3:岑体二马第三段终点时间
M4:岑体二马第四段终点时间
M5:岑体二马第五段终点时间
M6:岑体二马第六段终点时间
Finishm:岑体二马比赛终点时间
D1:第一段 1 号马的距离(0.25 表示距离在 1 马之内)
D2:第二段 1 号马的距离(0.25 表示距离在 1 马之内)
D3:第三段 1 号马的距离(0.25 表示距离在 1 马之内)
D4:第 4 区与 1 号马的距离(0.25 表示距离在 1 马之内)
D5:第 5 区与 1 号马的距离(0.25 表示距离在 1 马之内)
D6:第 6 区与 1 号马的距离(0.25 表示距离在 1 马之内)
Datediff:该马上一场比赛与当前比赛的日期差
Pricemoney:比赛的价格
Win_t5:赛前 5 分钟马的胜率
Win:马的最终胜率
Place_t5:赛前 5 分钟马的胜率
Place:马的最终胜率
Ind_win:比赛获胜者的指标(1 代表获胜者,否则为 0)
Ind _ PLA:比赛前 3 名的指标(1 代表前 3 名,否则为 0)

功能的更正热图

特征工程和建模

原始数据包含大量信息,我们需要筛选出其中有用的信息,并尝试从数据中构建新的特征来帮助预测结果。我不会提供太多关于特性工程的细节,但是如果你想自己尝试的话,这里有一些关键的见解。

  • 马的年龄、抽签和赛前 5 分钟的赔率与获胜概率的相关性很弱。
  • 从过去的表现中产生的新特征(例如:过去 5 场比赛的表现,过去的赔率,过去 180 天的总胜率,完成时间等)可能相对有用。
  • 像天气、温度、马的产地和骑师的信息这样的外部数据将提高基于树的模型的性能。
  • 建立不同的二元分类模型来预测赢得第一名的可能性和赢得前 3 名产生更好的结果。
  • 模型堆叠(神经网络、XGBT、GBRT、线性等)显著提高了性能。
  • 预测结果(可能获胜)应该根据同一场比赛中的其他马匹进行调整和标准化。
  • 对马和骑师执行目标编码极大地提高了模型性能。
  • 作为时间序列类型的问题,只使用基于时间的交叉验证来验证性能和调整参数。

投注策略

在建立了一个相对有用的模型后,预测每场比赛的前 1 名和前 3 名的获胜概率。我花了很多时间试验和研究如何从模型中获得正回报。赛马有很多不确定性,需要人为消除任何潜在的不公*优势。下注策略变得极其重要。在用真实比赛运行模型的多次实验之后,我想出了一个包含三个基本概念的策略。

  • 期望回报率
  • 最低风险下注
  • 凯利准则

Alexander MilsUnsplash 上拍摄的照片

首先说一下预期收益率。最常见的最简单的投注策略就是设置一个回报阈值,只有当回报比率(赢奇数*中奖概率)高于阈值时才投注。我们只需要利用模型预测结果计算出每匹马在单场比赛上的获胜概率和回报率,并在回报率高于阈值时下注。然而,如何选择门槛成为一个大问题,低门槛通常会导致激进的投注和大的资本损益。由于赛马的不确定性很大,因此高低阈值的结果相差很大。

仅仅使用回报率是不够的,作为一个赛车游戏,我们还需要考虑每匹马与同一场比赛中其他马相比的表现。换句话说,我们需要找到一匹在同一场比赛中与所有其他马相比获胜几率最高的马。为了扩展这个概念,我们还可以找到不仅在一场比赛中,而且在一天的所有比赛中最有可能获胜的马。我们只在那些马身上下注,以大大降低风险。我称之为最低风险赌博。您可以通过在原始预测结果的 log 转换 sum 观察值上构建另一个模型来找到这些马。

现在我们有了所有低风险的马以及它们的回报率,我们应该在每匹马身上赌多少钱。事实证明,凯利准则产生了最好的结果。

凯利准则公式

对于有两个结果的简单赌注,一个涉及输掉全部赌注,另一个涉及赢得赌注金额乘以支付赔率,凯利赌注是:

  • f 是要下注的当前资金的分数;(即下注多少,以分数表示)
  • b 是在赌注上收到的净分数赔率;(例如,下注 10 美元,赢了,奖励 4 美元加赌注;那么 b=0.4)
  • p 是获胜的概率
  • 1-p 是损失的概率

最后,我们将这三个概念结合在一起。首先过滤掉当天所有的低风险马,计算它们的回报率。基于模拟的过去投资结果来设置最佳回报阈值。当回报率高于阈值时,使用凯利标准来确定基金应该下注的百分比。

我们花了两个月的时间,在真实的游戏中应用最终的模型和下注策略。结果相当令人满意,我们对 76%的游戏下了赌注,并在两个月结束时取得了正回报。我不会透露实现的细节,但是如果你有任何问题或者对我的发现感兴趣,请在下面留言。

感谢您的阅读,我期待听到您的问题和想法。如果你想了解更多关于数据科学和云计算的知识,可以在Linkedin上找我。

照片由 Alfons MoralesUnsplash 拍摄

机器学习如何让 AI 忘记知识表示和推理

原文:https://towardsdatascience.com/how-machine-learning-made-ai-forget-about-knowledge-representation-and-reasoning-cbec128aff56?source=collection_archive---------43-----------------------

我如何了解人工智能被遗忘的核心的简史。

在我作为人工智能数据科学家工作的早期,我学到了一件最重要的事情:你需要更多更好的数据来喂你的学习系统。我致力于寻找这些数据。

我在试图发现人工智能世界的同时,被引诱到了机器学习的世界。我承认,让一台计算机做我喜欢的复杂事情,而不用说它应该如何做,这是令人兴奋的。我在这个世界上狂奔,在研究如何准备数据、设计功能和建立深度网络时,早已忘记了自己的最初目标。

https://media . make ame me . org/created/machine-learning-machine-884d 19 c 7 BD . jpg

然而,在一些案例中,当我被要求自动化和优化一个业务问题时,相关数据的可用性、数量和质量的问题通常仍然是欠缺的。此外,该行业对人工智能的日益接受也引发了恐惧、怀疑和怨恨。人们认为他们正被一个黑匣子取代。这不是事实。但是我理解当你试图用一个不透明的盒子代替多年的专业知识时的阻力。

人工智能通常被描述为计算机感知、推理和行动的学科。

我错过了推理。

约翰·麦卡锡在 1955 年创造了“人工智能”这个术语,并在 1956 年夏天组织了达特茅斯研究项目——这是人工智能作为一个领域的开始。他说:“这项研究是在这样一个假设的基础上进行的,即学习的每一个方面或智力的任何其他特征在原则上都可以如此精确地描述,以至于可以制造一台机器来模拟它。人们将试图发现如何让机器使用语言,形成抽象概念,解决现在留给人类的各种问题,并自我完善。”

他在 1958 年开发了 Lisp,并彻底改变了我们如何通过编程来创造思*机器。其他人紧随其后,例如阿兰·科尔莫劳尔和菲利普·罗塞尔,他们在 1972 年提出了序言。Prolog 的部分动机是希望将作为声明性知识表示语言的逻辑的使用与知识的过程化表示相协调。
因此,知识表示和推理(KRR)成为人工智能的一个关键领域,它关注的是如何用符号表示知识,并通过推理程序以自动化的方式操纵知识。换句话说,代理如何使用它所知道的来决定做什么。

考虑一下烤蛋糕的任务。当然,我可以收集配料的数量和它们通常混合的顺序的数据,以达到最佳效果。但是不管怎样,我最喜欢祖母的蛋糕,而且我非常了解它的制作方法。那么,我为什么不马上向系统解释在混合配料时必须遵守哪些规则,以及必须创造哪些基本条件呢?当我们研究工业中的复杂过程时,也会发生同样的情况。通常,人们首先本能地要求现有的数据,并权衡为了一个成功的项目应该收集哪些额外的数据。只有少数精明的人对问题背后的过程细节感兴趣。结果往往是自动化或优化只是一个组合问题,尽管是一个非常复杂的问题。

当我想到一个新问题时,我的第一个问题不再是指数据,而是指问题本身。

一个过程的开发,通常需要很多年,并且需要丰富的经验和专家知识,这使得它变得越来越复杂。新的依赖关系正在增加,不断增长的需求要求更精确,尤其是更快的结果。一项人类大脑再也无法完成的任务。通过对现有知识以及详细的流程步骤和约束条件进行数字化和系统化记录,KRR 不仅可以实现流程自动化,还可以优化流程。例如轮班计划、无线电频率拍卖、时间表等等。

从数据中学习非常受欢迎——但不是你的唯一选择。

有了机器学习的所有知识,回头看看在 AI 领域已经取得的成就,我们应该始终使用我们最强、最像人类的能力之一:创造力。跳出框框思考,不要因为一种方法听起来最好或者吸引注意力而选择它。选择最适合你的问题的方法。

安迪·凯利在 Unsplash 上的照片

底线

不要让一个黑箱自然地决定如何设计过程。与专家交谈并绘制他们的流程图。有了必要的透明度,我们就能建立信任,并为社会更高程度地接受人工智能铺*道路。

在本文的中了解更多关于知识表示和答案集编程的知识。

机器学习如何改变网络

原文:https://towardsdatascience.com/how-machine-learning-transforms-cyber-fb7aca17a1cc?source=collection_archive---------61-----------------------

网络安全跨越了各种各样的任务:预测、预防、检测、响应(高德纳 PPDR);在各种“地方”:网络(入侵检测)、终端(反恶意软件)、应用程序(防火墙)、用户(行为分析)、流程(反欺诈);在各种时间:实时(传输中)、休息时(监控)、调查期间(回顾)。

从表面上看,机器学习在增加网络价值方面有着巨大的潜力:从它检测大数据中躲避人眼的模式的先天能力,到它对快速扩展实时变化数据的高度适应,再到它的超个性化能力。然而,ML 在网络上的使用与其在视觉或语言上的受欢迎程度并不匹配。为什么?

网络营销的挑战

视觉和语言方面的大量训练数据,加上相对容易的标记,无法与网络中缺乏良好标记的数据相提并论。让机械黑客标记图像中的对象是一回事,在日志文件中检测攻击是另一回事。更不用说组织不愿意分享暴露其弱点和缺点的数据。

检测已知攻击(误用)的签名匹配算法在检测新的(零日)攻击时效率低下。标记偏离标准的异常检测方法容易出现误报,这是因为难以区分正常和异常行为,以及不断变化的恶意行为

虽然语言、视觉甚至推荐模型通常被认为是准静态的,但网络模型需要每天或在检测到新的攻击/恶意数据时重新训练。这种对 ML 工作流的压力会限制模型训练时间和部署过程,特别是在多个地方(边缘、端点、应用、网络……)。

这些算法挑战,当不*衡的数据集和再训练频率要求加剧时,会导致假阳性的溢出。难怪当安全人员出现警戒疲劳时,他们会成为 ML 的怀疑者。因此,新的 ML 产品计划经常需要与一些坏名声作斗争。

变革即将到来…

现在发生了什么变化

  1. 数据

历史上前所未有的数据积累。人们开始意识到,即使是在今天看来没有任何价值的*凡数据,在未来对训练模型和确定规范行为也可能极其有价值。

许多组织向云的转变,加上共享数据的日益便利,开始显现出成效。Cyber ML 的数据集正在积累,这使得数据科学家更容易测试他们的假设。

即使是不愿意公开(或与学术界)分享网络相关数据的公司,也开始在自己的数据上应用无监督的最大似然算法。

2.明面上的

ML Rush 吸引了许多数据科学领域的建设者、学生和邻*的专业人士。这不仅体现在教育项目(在线和离线)的增长上,也体现在*年来数据科学家新手的大量涌现上。许多 ML 和云供应商看到了这一点,并构建了自动化和半自动工具,使数据科学家新手很容易开始使用 ML。

这些工具从通过 API 现成可用的预训练模型,到建模过程的自动化(分块或整体)。开源算法、笔记本和 arxiv ocean 使数据科学家新手能够更专注于寻找类似的例子和再现工作流,而不是从头开始发明 ML。

同样,经验丰富的数据科学家利用这些快速发展的工具摆脱耗时的 ML Ops 工作,专注于建模。通过自动化某些流程(例如专业标注工作)并为数据科学家提供模型和培训流程(监控和再培训)的更多可见性,这些工具使有经验的数据科学家变得更加高效。鉴于有经验的数据科学家的稀缺,这是非常值得的!

3.到期日

ML-can-fix-it-all 的宣传已经结束。不只是在网络上。构建者,尤其是用户和产品经理,已经意识到 ML 是一种工具,具有巨大的潜力,但也有明显的局限性。评估适合 ML 的用例的方法证明了这样一种理解,即如果应用于正确的问题,ML 可以工作。

大量关于 ML PoC 和产品经理与数据科学家合作的会议表明成熟度已经超越了用例适合度。快速排除故障并将精益方法应用于 ML 的愿望导致了 AutoML、预训练模型和开源算法,它们几乎可以开箱即用,在几个*时或几天内就可以完成 PoC。

甚至更受欢迎的兄弟姐妹的成熟,视觉和语言,也开始发挥作用。面部识别工具消除了大部分繁重的生物计量验证工作。NLU 引擎和 word2vec 算法使特征工程的艺术变得更加容易。擅长从原始图像中学习特征的神经网络在从原始二进制文件恶意软件中学习时可能会迷路。让网络专业人士来处理域名,而不是下面的 ML 冰山。

网络营销的未来是什么

可以使用神经网络上的无监督方法来分析时间序列数据来检测异常。可以学习个人行为,并训练LSTM·RNN 网络更好地检测时间序列中的变化,这些变化可能表明异常,无论是在特定的点、背景还是与其他的集合中。这可以类似于用具有典型和非典型风格的单词和句子来标记计算机之间的对话,就好像它们是语言一样。

通过分析变量之间的深层相互作用,在特征提取和特征工程方面取得进展。在入侵检测系统(IDS)中,可以从中提取高级特征:网络报头(例如,IP 源、目的地、IP 长度、源端口等)、TCP 连接(持续时间长度、协议类型、数据字节数等)、2 秒时间或 100 个连接窗口(到同一主机的连接数、SYN/REJ 错误率、同一服务的连接百分比等)、域知识(失败登录尝试次数、受损情况、超级用户访问、外壳提示等)。).

可以使用模糊关联规则来识别上下文/条件/语义模式。多*规则可以发现新的签名以包含到误用检测系统中。潜在的关系可以使用图形算法和贝叶斯网络来揭示。通过不断发展和改进图形数据库中的关系识别,公司可以加快响应时间,并更准确地遏制相关攻击。

可以使用预先识别的基于密度的聚类来实现介入规模。通过了解攻击者属于哪一群相似的行为,可以实现编排,并防止潜在的攻击。集群也可以与决策树结合,以允许对特性进行并行评估。

ML 可以集成到数字法医调查的工作中,以便自动化和授权非专家来帮助处理一些法医积压案件。可以使用静态代码特征以及动态执行的代码来进行恶意软件检测和分类。

开放的数据集、开源算法和专家社区协作的数量正在增长(即使还不是最优的)。支持更快的建模时间和新的混合版本,用于集成开源方法和专有方法,以实现更高的准确性。

抑制实时响应的数据溢出和静态代码混淆可以通过合取规则提取,使用数据分类技术(基于内容、时间、来源和目的地)进行*度缩减,以及预测可执行文件在执行的前 5 秒内是否为恶意的递归神经网络集合来克服。

进化计算(遗传算法),通过进化一组初始(已知)规则来应用适者生存原则,使用四种遗传算子生成新规则:繁殖、交叉、变异和丢弃。适应度函数可以是新的基因创建的规则的支持和信心。

摘要

人工智能在网络上的采用落后于视觉和语言。面临获取标记数据的困难、零日攻击/恶意行为快速变化的创造性以及频繁重新培训的需求。

但是,积累的数据集(规范的和异常的);为数据科学家新手加速标签(专业)、培训(分布式)、部署(混合)、监控(实时)到开箱即用模型的新工具;再加上成熟的研究和组织的理解 ML-导致网络 ML 的新时代。

展望未来,我们将看到各种创新方法在网络战的各个方面发挥作用。从 RNNs、时序/序列异常、深层特征关系、模糊规则、聚类、图形、集成学习,一直到进化计算。

这是加入赛博 ML 的激动人心的时刻!

— — — —

这篇文章是我的观点,不代表我现在或过去的雇主。它最初发表在 OrenSteinberg.com 的

机器学习是如何工作的!

原文:https://towardsdatascience.com/how-machine-learning-works-b801303b1a19?source=collection_archive---------17-----------------------

以回归和分类为中心的机器学习术语介绍

图片鸣谢:https://upload . wikimedia . org/Wikipedia/commons/4/41/Machine _ learning . jpg

机器学习是一种数据分析技术,它在数据集上建立预测模型,以提供有用的答案,这些答案可用于做出重要决策。它利用统计概念和数学方法,通过 python 和 r 等编码语言来处理大数据。有多种机器学习技术。然而,本文将涉及回归和分类。

回归

回归用于预测连续的数字数据。这是一个广泛使用的统计概念,可以手动应用于大约两个变量和几个元素的*数据集。当处理具有多个变量和元素负载的大型数据集时,通过将包含数据集的文件上传到编码*台并运行一堆代码来进行回归。

有不同种类的回归技术,例如线性回归、多项式回归、多元线性回归和多元多项式回归。它们的应用因预测因变量所用的自变量的多少而异。以下是一些与回归相关的有用术语:

回归方程式

回归方程是使用自变量预测因变量的方程。可以分别表示为 y=mx + by = ax^n + bx^n-1 + …+ c、y = ax+ bx2 +…+ cy = ax^n + bx^n-1 + …+ c 用于线性回归、多项式回归、多元线性回归、多元多项式回归。

散点图的典型图像,显示用于构建线性回归方程的回归线。图片鸣谢:https://commons . wikimedia . org/wiki/File:norm dist _ regression . png

回归系数

回归系数是应用于线性回归或多元线性回归的常数值。它可以对因变量产生增加或减少的影响。让我们举一个例子,用年龄和身高(cm)等变量来确定体重(磅)。

对于线性回归,要么可以表示为*权重= 5 年龄+ 30。这个等式表明,年龄每增加 1 岁,体重就会增加 5 磅。

对于多元线性回归,可以表示为*体重= 4 *年龄+2.5 身高+ 30 。这个等式意味着,假设年龄为零,身高每增加 1 厘米,体重将增加 2.5 磅;假设身高为零,年龄增加 1 岁,体重将增加 4 磅。

y 轴截距

假设回归系数或 x 设置为零,这可以描述为因变量的值。可以表示为 y=c 。它也是回归线与 y 轴相交的点。

培训模型和测试模型

数据集被分成两组:训练数据集和测试数据集。在将数据集分成组之后,使用训练数据集生成回归方程。一旦开发完成,回归方程将应用于测试数据集以创建预测。

预测值可以与实际值进行比较,以测试准确性。评估预测的标准如下所述:

决定系数

决定系数,r *方,是一个有用的机制来解释如何准确的回归方程是作出预测。这是通过比较预测值和实际值来完成的。它提供了一个值,表明自变量解释了因变量的多大比例。为了提高 r *方得分,可以从一种回归方式切换到另一种。

相关系数

这是另一个非常有用的值,它描述了实际结果和预测结果中的值之间的关系。它的范围从-1 到 1。如果相关系数为负,那么预测结果会随着实际结果的减少而增加,反之亦然。如果为正,则预测结果随着实际结果的增加而增加。值越接*|1|,关系越完美。

均方根误差

均方误差是每个数据点的预测值和实际值之间的总*方差的*均值。该值衡量数据集*均与回归线的接*程度。这个值的*方根称为均方根误差。目标是使均方根误差接* 0,以获得最佳拟合。

显示实际值与回归线差异的图表。图片鸣谢:https://commons . wikimedia . org/wiki/File:Residuals _ for _ Linear _ Regression _ fit . png

分类

分类是另一种伟大的机器学习算法,可用于预测分类数据集。自变量可以是连续的或分类的,而因变量是分类的。分类可用于建立一个提供是(1)或否(0)答案的模型或多个类别(0,1,2…)取决于用户的议程是什么。它像回归一样利用训练和测试数据集。

使用我以前的一个项目的结果,我在该项目中预测了贷款申请状态,分类方法,如 K-最*邻和决策树分类器及其度量将在下面解释:

k-最*邻

这是一种分类方法,它使用与特定数据点最接*的数据点来预测该数据点应属于哪个类别。通过评估每个数据点的自变量和因变量,并将其与 k 个最接*的变量进行比较,它使用训练数据集创建预测模型。该模型用于预测测试数据集中每个数据点的类别,并测量其准确性。

通过将 k 值设置为 1,测量其精度并增加 k 值,直到达到峰值精度,从而完成多次迭代。

一个图表,显示随着 K 值的增加,K 最*邻的精确度。

该 k-max 值预测模型用于通过用训练模型拟合预测模型并使用预测模型对测试数据集中的数据点进行分类来进一步分析数据集。

决策树分类器

决策树分类器使用与 K-最*邻不同的方法。它首先查看训练模型中的所有数据点,并评估一个独立变量,然后根据该变量的值为其分配一个是(1)或否(0)标签。然后,它根据前面的独立变量的输出继续处理其他独立变量,以达到作为预测结果的 Y 或 N 的最终标记。

决策树分类器的图像,显示它如何到达最终标签。

从决策树分类器训练数据集生成的预测模型可用于预测测试数据集中数据点的类别。

混淆矩阵

混淆矩阵是在分类中使用的表,用于显示有多少值被正确预测,有多少值被错误预测。错误有两种类型:第一类错误和第二类错误。类型 I 错误被认为是假阳性,即被归类为阳性的负值。第二类错误是假阴性,即被归类为阴性的正值。

一个混淆矩阵的例子,显示了有多少值被正确和错误地预测。

分类性能可以使用精度、召回率等指标来衡量,而准确度可以使用混淆矩阵来计算。

精确

精度用于查看记录的正值中有多少实际上是正的。它的公式是 TP/(TP +FP)。对于上面的混淆矩阵,精度为:119/(119+54) = 0.69

回忆

回忆也是一种所谓的真实阳性率。它计算实际正值中真正正值的比例。其公式为 TP/(TP +FN) 。上面混淆矩阵中的回忆是 119/(119+10) = 0.92

真实负利率

真负值比率衡量实际负值中真负值的比例。它的公式是 TN/(TN +FP)。对于以上的混淆矩阵,为 9/(9+54) = 0.15。

准确(性)

精度就是所有精确记录值的总和除以所有记录值的总和。其公式为 (TP + TN)/(TP +TN + FP+FN)。上面混淆矩阵中的精度是 (119 + 9)/(119 + 9 +54 + 10) = 0.67。

F-1 分数

F-1 分数类似于 r *方分数。它是自变量解释因变量的程度的一种度量。这是通过比较预测值和实际值来完成的。越接* 1,预测模型越强。可以测量不同分类方法的预测模型的 F-1 分数,以决定使用哪一种。

结论

机器学习是一个能够指导我们在日常活动中做出有效决策的领域。这将非常有助于帮助人类和公司在未来做出明智的决策。例如,分类可以告诉我们是否投资某项业务,回归可以告诉我们如果投资该业务,我们可能会赚多少钱。

机器学习是如何工作的——以代码示例为例

原文:https://towardsdatascience.com/how-machine-learning-works-with-code-example-c2492baffced?source=collection_archive---------63-----------------------

训练一个模型来预测泰坦*克号的幸存者。

[ 注意:自己构建模型 在这里使用我们的全交互笔记本 。不需要以前的编码经验。]

如果你像我一样,你需要玩一些东西并“自己做”来真正理解它。在这里,我们将举例解释机器学习是如何真正工作的。

您将构建自己的机器学习模型来预测泰坦*克号上乘客存活的可能性。该模型将自己学习模式,只需查看数据。

了解进行机器学习的步骤

继续执行以下操作:

  1. 加载数据并以可视化方式进行探索;
  2. 为机器学习算法准备数据;
  3. 训练模型——让算法从数据中学习;
  4. 评估模型——看看它在以前从未见过的数据上表现如何;
  5. 分析模型,看看它需要多少数据才能运行良好。

要自己构建机器学习模型,请打开笔记本。您将运行真正的机器学习代码,而不需要任何设置——它就是工作。

了解机器学习的工具

机器学习工具有很多选择。在本指南中,我们使用了一些最流行和最强大的机器学习库,即:

  • Python :一种以可读性著称的高级编程语言,也是全球最流行的机器学习语言。
  • *猫:一个 Python 库,为该语言带来了类似电子表格的功能。
  • Seaborn :用于绘制图表和其他图形的库。
  • Scikit learn:Python 的机器学习库,提供用于预测数据分析的简单工具。
  • DRLearn :我们自己的数据收益 Learn 模块,就是为这个数据集构建的。

这些都是很好的工具,因为初学者和大公司(如摩根大通)都使用它们。

探索我们的数据集

我们将使用著名的“泰坦*克号”数据集——一个有点病态但迷人的数据集,包含泰坦*克号乘客的细节。我们有每位乘客的一系列数据,包括:

  • 名字,
  • 性别,
  • 年龄,
  • 机票等级。

我们的数据采用行和列的标准形式,其中每行代表一名乘客,每列代表该乘客的一个属性。这里有一个例子:

泰坦*克号数据集中的一些乘客。来源:作者

泰坦*克号数据集中的一些乘客

可视化我们的数据集

机器学习模型很聪明,但它们只能和我们提供给它们的数据一样聪明。因此,重要的第一步是获得对数据集的高层次理解。

说到分析数据,一个好的起点是测试一个假设。拥有头等舱机票的人可能更有可能幸存,所以让我们看看数据是否支持这一点。

你可以在配套笔记本中看到并运行代码来生成这个可视化效果。

三等舱乘客存活率最低,一等舱乘客存活率最高。来源:作者

三等舱乘客存活率最低,一等舱乘客存活率最高。

一等舱超过 60%的人幸存下来,而三等舱只有不到 30%的人幸存下来。

你可能也听说过“妇女和儿童优先”这句话我们来看看性别存活率是如何相互作用的。

女性比男性更有可能存活下来。来源:作者

女性比男性更有可能存活下来。

我们再次看到我们的假设是正确的。超过 70%的女性幸存下来,而只有大约 20%的男性幸存下来。

就这样,我们创建了数据集的两个基本可视化。我们在这里可以做得更多(对于生产机器学习项目,我们肯定会这样做)。例如,多变量分析将显示当我们一次查看多个变量时会发生什么。

准备我们的数据

在我们将数据输入机器学习算法来训练我们的模型之前,我们需要让它对我们的算法更有意义。我们可以通过忽略 某些 重新格式化其他列来做到这一点。

忽略无用的列

我们已经知道乘客的票号和他们的生存几率之间没有关联,所以我们可以明确忽略这一列。在将数据输入模型之前,我们会将其删除。

重新格式化我们的数据

有些功能是有用的,但不是原始形式。例如,“男性”和“女性”的标签对人类来说是有意义的,但对喜欢数字的机器来说却不是。因此,我们可以将这些标记分别编码为“0”和“1”。

一旦我们准备好数据集,这种格式对机器更加友好。我们在下面提供了一个例子:我们去掉了许多无用的列,剩下的列都使用数字。

准备好数据集后,事情就简单了,现在可以进行机器学习了。来源:作者

准备好数据集后,事情就简单了,现在可以进行机器学习了。

将我们的数据集一分为二

现在我们需要训练我们的模型,然后测试它。就像学校的孩子们被给予作为家庭作业的测试问题的例子,然后在考试条件下看不见的问题,我们将在一些数据上训练机器学习算法,然后看看它在其余数据上的表现如何。

我们分割数据集:一部分用于训练模型,一部分用于测试模型。来源:作者

我们分割数据集:一部分用于训练模型,一部分用于测试模型。

让我们训练我们的模型!

现在是有趣的部分!我们将把训练数据输入到我们的模型中,并要求它找出模式。在这一步,我们给模型数据和想要的答案(乘客是否幸存)。)

模型从这些数据中学习模式。

我们的机器学习模型是在训练集上训练的。来源:作者

我们的机器学习模型是在训练集上训练的。

测试我们的模型

现在我们可以测试我们的模型,只给它另一半数据集中的乘客的详细信息,而不给出答案。该算法不知道这些乘客是否幸存,但它会根据从训练集中学习到的内容进行猜测。

通过要求机器学习模型预测测试数据的结果来测试我们的机器学习模型工作得有多好。来源:作者

通过要求机器学习模型预测测试数据的结果来测试我们的机器学习模型工作得有多好。

我们的模特‍Analyzing

为了更好地理解我们的模型是如何工作的,我们可以:

  • 看看它最依赖哪些特征来进行预测;
  • 如果我们使用更少的数据,看看它的精度如何变化。

第一个帮助我们更好地理解我们的数据,第二个帮助我们理解是否值得尝试获取更大的数据集。

理解我们的模型发现什么是重要的

机器学习知道不是所有的数据都同样有趣。通过对特定细节进行不同的加权,它可以做出更好的预测。下面的权重显示性别是目前预测存活率最重要的因素。

我们的模型主要依赖于性别,也有一点依赖于乘客是否在三等舱,以及他们的家庭规模。来源:作者

我们的模型主要依赖于性别,也有一点依赖于乘客是否在三等舱,以及他们的家庭规模。

我们还可以看看该算法在预测特定乘客的存活率时关注了数据的哪些方面。下面我们看到一名乘客,算法认为他很有可能幸存。它特别注意到以下事实:

  • 三等舱的乘客 不是
  • 乘客女性。

由于乘客也不在头等舱,这略微降低了生还的可能性,导致最终的生还预测为 93%。

这个模型是如何对一个特定的乘客做出预测的。她有很高的存活率,因为她是女性,而不是三等兵。来源:作者

这个模型是如何对一个特定的乘客做出预测的。她有很高的存活率,因为她是女性,而不是三等兵。

了解数据量如何影响我们的模型

让我们对模型进行多次训练,看看它在更多数据的情况下提高了多少。这里我们绘制了培训分数测试分数。后者更有趣,因为它告诉我们该模型在看不见的数据上表现如何。

训练分数可以被认为是一个“开卷”测试:模型已经看到了答案,因此它看起来比“测试分数”高,但模型更容易在训练阶段看到的数据上表现良好。

更多的数据使我们的模型更好(测试分数)。但是在大约 500 个数据点之后,改进是最*的。来源:作者

更多的数据使我们的模型更好(测试分数)。但是在大约 500 个数据点之后,改进是最*的。

这里我们看到,模型的数据越多,它的性能就越好。这在开始时更加明显,此后添加更多的数据只会带来很*的改进。

机器学习模型不一定是“黑盒”算法。模型分析帮助我们理解它们是如何工作的,以及如何改进它们。

结论

就是这样——你已经建立了自己的机器学习模型。现在,您将能够:

  • 了解数据科学团队的日常工作;
  • 与你的数据科学或机器学习团队更好地沟通
  • 知道机器学习最擅长解决哪类问题;
  • 意识到机器学习并没有那么可怕。

机器学习的复杂部分是进入构建和扩展定制解决方案的所有本质细节。这正是我们的专长。因此,如果你在接下来的步骤中需要帮助,请告诉我们。

你要吃多少薯条才能完成环法自行车赛?

原文:https://towardsdatascience.com/how-many-french-fries-do-you-have-to-eat-to-finish-the-tour-de-france-d8450ed0a2e3?source=collection_archive---------37-----------------------

在 Wolfram|Alpha 的帮助下找到答案

罗布·温盖特在 Unsplash 上的照片

我喜欢环法。不,事实上:我喜欢环法自行车赛。我在荷兰长大,每年有三个星期,这将是荷兰电视的主要事件。那时我们只有两个频道,所以,是的,没什么别的节目。但还是。荷兰公共电视组织“ NOS ”每天都会在舞台结束前的最后一两个*时播放。

环法自行车赛是一项为期多天的自行车比赛,终点在巴黎市中心的一条非常大的街道香榭丽舍大街。它通常每年在不同的地方开始,有时甚至在邻*的国家开始。最具挑战性和最受欢迎的赛段通常是在阿尔卑斯山和比利牛斯山脉的山区。

IanUnsplash 上的照片

环法自行车赛的长度每年都不一样,但通常都超过 2000 英里。或者根据 Wolfram|Alpha 超过3219 公里。或月球赤道长度的 0.29 倍。或者说是纽约到洛杉矶距离的 0.82 倍。

骑自行车走这么长的距离需要能量。精力充沛。我很好奇这种能量有多少,并将它与我喜欢的已知食物的量进行比较。我喜欢吃很多东西,但我最喜欢的主食之一是土豆。水煮,捣碎,或者以薯条的形式,都是好的。所以,既然说的是法国,那就用薯条吧。是的,我应该在这里指出,炸薯条很可能是在比利时发明的,通常也被称为 pommes frites。

吉利Unsplash 上拍摄的照片

环法自行车赛中一名自行车手燃烧的卡路里量(1“膳食卡路里”相当于 1 千卡)因阶段而异,但通常估计在轻松的一天 5000 卡路里到艰难的一天 7000 卡路里之间。根据 Wolfram|Alpha 的说法,以每*时 25 英里的速度骑一个*时的自行车会燃烧大约2000 卡路里

所以让我们以 6000 卡路里的“*均日”为例。今年的环法自行车赛持续 23 天,但其中两天是休息日,所以 21 个骑行日。这给了我们高达 126000 卡路里的热量。

现在让我们来计算一份炸薯条的热量。炸薯条有很多种,所以我会用“餐厅式”炸薯条:

(图片由作者提供)

用 126,000 卡路里的总热量除以一份食物的热量,我们得到了食物的数量,大约是 256 份。还挺多的!这是一张显示 256 份炸薯条的图片,网格为 16x16:

(图片由作者根据 GillyUnsplash 上拍摄的照片提供)

环法自行车赛参赛者的实际饮食可能更加多样和健康,但它显示了在巴黎完成比赛所需的大量卡路里。现在我饿了。🙂

有多少个行业?

原文:https://towardsdatascience.com/how-many-industries-are-there-74890132581b?source=collection_archive---------5-----------------------

亨*投资

现代企业工业概况的定量分析

图片作者那利

作为一名股市投资者,我经常发现自己在自己熟悉的行业中发现有吸引力的证券。作为一名数据科学家,在过去的两年里,我接触了比一般投资银行家更多的信息技术公司。与打算收购一家石油公司的普通资本经理相比,我的化学工程学位也让我在选择石油天然气公司时拥有了优势。

我们许多个人投资者都倾向于自己喜欢或了解的行业。与此同时,我们可能没有意识到行业幽灵到底有多广。大多数人知道的几个热门行业包括航空、石油和天然气、建筑、消费品和金融服务。

我错过了什么吗?事实上,我有!一百或两百个其他人。

在本文中,我将分解行业幽灵,找出它们在多大程度上被业务所代表,以及行业概况可以有多细粒度。

部门与行业

与传统的误解不同,许多人所谓的“一个行业”实际上被称为“一个行业”。根据全球行业分类标准 (GICS),共有 11 个行业:

  • 活力
  • 材料
  • 工业
  • 非必需消费品
  • 消费品
  • 卫生保健
  • 金融
  • 信息技术
  • 通信服务
  • 公用事业
  • 房地产

这些行业又进一步细分为 24 行业组、 69 行业和 158 子行业。

分类标准更多,如行业分类基准(ICB)标准产业分类法(原文如此)北美行业分类体系 (NAICS)等。它们对业务部门的划分略有不同,导致业务活动的粒度表示。

Vhinny ,我使用 GICS 作为核心分类系统。因此,我将进一步讨论 GICS。

财务数据

在这项研究中,我使用来自 www.vhinny.comAlpha 数据集。我手上的版本包含了 2448 家美国上市公司。虽然这不是美国所有上市公司的完整列表,但它是在 2019 年SEC 备案的所有6777公司的一个相当有代表性的子集。

哪些板块参与度最高?

下面的柱状图显示了各个行业所代表的公司数量。

每个部门的公司数量

Y 轴有 GICS 分类的 11 扇区。X 轴显示了在这些部门经营的公司数量。

从公司数量来看,最大的行业是医疗保健。至少有 500 家美国上市公司正忙于开发解决方案,通过发现新药、改善运营和开发尖端研究技术来提高我们的生活质量。

第二大行业是金融服务业。而普通大众对该领域的主要参与者都很了解,如 Visa、Mastercard、美国银行、美国运通、摩根大通等。*公司在确保我们的日常需求得到妥善处理方面发挥着至关重要的作用。350 多家上市公司自豪地服务于这一领域。

第三大领域是技术,代表在美国舞台上至少有 300 名玩家。在苹果、微软和英特尔等科技巨头的带领下,科技公司确保我们的互联网正常工作,手机响起,电视打开,并实现 21 世纪所有其他种类的标志性乐趣。****

哪些行业参与度最高?

现在让我们来看看美国排名前 20 的行业。

每个行业的公司数量

按照行业分布,榜单中的前 10 个行业来自医疗金融服务科技行业。几个领先行业的例外被大胆宣称为石油&天然气行业来自能源行业(前四)特种工业机械(前六)来自工业行业,特种零售(前十)来自消费周期性行业。

医疗保健领域最繁忙的行业生物技术 (250+公司)医疗器械 (50+公司)诊断&研究 (40+公司)药品制造商 (40+公司)。

地区性银行(160 多家公司)代表了金融服务行业的半壁江山。其余的金融服务行业没有进入公司数量排名前十的行业。

技术部门将其行业中的两(2)个放在这份十大名单的首位:软件—应用 (90 多家公司)和软件基础设施 (40 多家公司)。****

为什么它很重要

对我来说,理解行业分类以及企业如何在不同行业中分布,是建立可靠的机器学习模型以识别潜在投资机会的基础。正如 Calson Sheng 在他最*关于公司估值的文章中解释的那样,我们需要知道我们在哪里以及我们面对的 是谁才能对一家公司的未来做出强有力的假设。

让我们再看一张图,显示每个行业下的行业数量。

每个部门的行业数量

我们在这里看到的行业细分与之前显示的公司数量细分有很大不同。工业消费周期性板块的行业数量都在 20 家以上,而板块本身分别有~ 300 家和~ 250 家公司。做一个简单的假设,每个行业每个部门的规模分布相等,我们得出每个行业有 10 家公司。

在进行如下研究时,记住这一点很重要:

**** [## 用机器学习预测股市。调查结果。

用机器学习识别高收入成长股

towardsdatascience.com](/predicting-the-stock-market-with-machine-learning-findings-135f0b3a26cf)

机器学习模型中使用公司中代表性如此*的行业将不能很好地概括。这里主要关注的是对本地偏见的潜在脆弱性,如果 10 个公司行业碰巧有 8/10 的正面例子,这将不可避免地发生。一个更着眼于未来的,更一般化的解决方案宁愿完全不考虑行业,只关注行业。占用最少的行业(公用事业)占数据集中所有公司的 2%,行业在整个数据中具有良好的代表性。然而,工业并不如此。

结论

在这项研究中,我根据各个领域的公司数量对 GICS 进行了分类。我发现公司数量最多的三个行业是医疗保健金融服务科技。然而,就它们所代表的行业数量而言,这些并不是最细化的行业。各有 20+个行业,工业消费周期性行业成为涵盖行业数量最多的两大行业。

由于代表性不足,上述提出的分析在将行业纳入机器学习解决方案的开发时,在股票市场提出了警告。相反,仅使用扇区可能会提供鲁棒性和更好的泛化能力。

附注:你可以在我的 GitHub 上找到我在本文中使用的所有可视化代码。

我们连线吧!

我很高兴和与我志同道合的人联系,这是对财务独立的追求。如果你也在寻求经济独立,或者你想和 T4 合作,交流想法,请随时联系我们!以下是一些可以找到我的地方:

干杯!****

有多少人真的被 SARS-新冠肺炎感染了?

原文:https://towardsdatascience.com/how-many-people-have-really-been-infected-by-sars-covid-19-ed9338641501?source=collection_archive---------42-----------------------

我看着新冠肺炎

各国距离实现群体免疫还有很长的路要走

jplenioPixabay 上的照片

更新 2020 年 5 月 15 日 : 这篇文章中的上限度量现在被一篇 更新的文章 中的更好的*似所取代。下限和中心估计值不受此影响,这里得出的结论和主要观点也不受此影响。

2020 年 5 月 3 日更新: 分析的附加细节,源代码本身可在 Jupyter 笔记本(R)上的GitHub处获得。它也可以直接在 Binder 上运行。

当前的 SARS-新冠肺炎疫情已经在世界范围内造成了大量的死亡,并严重影响着全球数十亿人的生活。为了了解这种新疾病带来的真正风险,并预测不同政策可能产生的影响,关键是要知道有多少人可能已经受到这种病毒的影响——无论有无症状。在这篇文章中,我提出了不同国家自疫情爆发以来感染该疾病的累计比例的严格下限和上限——其一生中的患病率。这些界限表明,没有一个国家的疾病传播得足够远,以至于不能指望很快实现群体免疫。然后我继续介绍一个更精确的终生患病率的中心估计值。这一估计为在不久的将来达到群体免疫的前景描绘了一幅更加暗淡的画面。最后,估计数用于了解不同国家遵循的检测政策,特别是在检测大多数疾病病例和了解疾病在一个国家内的传播程度之间的*衡。

终生患病率的上限和下限

想象一下,在一百个人中,我们有二十个人感染了这种病毒(患病率为 20%),但我们不知道确切的人数,除了怀疑一些人可能被感染。我们选择对 10 名表现出与疾病最相符症状(如干咳、发烧等)的人使用 10 套检测试剂盒。十次检测中有五次呈阳性(50%的阳性检测率);其他五人的症状是由其他疾病引起的,如普通感冒、流感或吸烟者的咳嗽。总之,由于有五个人实际上被检测为阳性,我们很容易知道至少有百分之五被感染——这是下限。我们的测试偏差——选择测试表现出最明显迹象的人,而不是随机挑选 10 个人——导致了 50%的阳性测试率,比我们人口中 20%的真实患病率高出一倍多。即使我们不知道真实的流行率,我们知道最多有 50%的人被感染。底线是,我们可以确定感染人数在 5%到 50%之间。总之,这就是我下面讨论的下限和上限的逻辑。

下限:确诊病例

在所有国家,感染 SARS-新冠肺炎的人数很可能远远高于官方报告的确诊病例数。换句话说,每个国家报告的确诊病例数是该疾病真实流行率的下限。图 1 中的绿色三角形标出了终生患病率的下限(即官方报告的确诊病例比例)。

图 1:各国感染 SARS-新冠肺炎的人口累计百分比的上限(红色三角形)、下限(绿色三角形)、中央外推估计值(蓝色圆点)和可能范围(灰色线段)(注意对数垂直轴)。这些估计是使用 2020 年 4 月 25 日的最新数据计算的。将光标悬停在绘图上以查看估计的实际值。

对 SARS-新冠肺炎流行率的低估很大程度上可以归因于测试不充分。即使对于相对较*的国家,检测全部人口也是完全不可能的,更不用说连续检测全部人口了,因为人们可能在接受检测后被感染。截至 4 月 28 日,仅有的成功检测了超过 4%人口的国家有冰岛(占检测人口的 13.5%)、巴林(6.91%)和卢森堡(6.62%)。这三个国家都是非常*且相当富裕的国家,这并非巧合。

那些接受疾病测试的人比那些没有接受测试的人更有可能被感染。

一个更可行的方法是对从人群中随机抽取的大量个体进行测试。然而,很少有国家发布——甚至收集——这样的随机抽样数据。相反,在大多数国家(唯一的例外是冰岛),对这种疾病的检测相当严格,其中一个原因是全球市场上缺乏可靠的检测手段。这导致人们只有在已经有大量迹象表明他们可能已经被感染时才进行疾病测试(例如,他们要么显示出疾病的明显症状,要么他们与已经被发现感染的人有过密切接触)。这导致了人口的有偏抽样:那些接受疾病测试的人比那些没有接受测试的人更有可能被感染

各国在怀疑和紧急程度的界限上遵循着非常不同的标准,这使得使用这些珍贵的检测棉签变得更加混乱。通常,即使在表现出明确的症状后,一些患者,尤其是那些属于被认为严重并发症风险较低的人群的患者,仍然难以接受检测。幸运的是,许多国家目前正在努力解决检测短缺的问题,一些国家正在实施大规模随机抽样研究和血清学调查,以评估该流行病在其人口中的真实流行程度。

上限:阳性率

上述检测偏差导致在实际接受检测的人群中发现的阳性病例的百分比可以作为该疾病在一个国家的真实流行率的上限:接受检测的人群比未接受检测的人群更有可能呈阳性,这意味着如果对整个人口进行检测,检测呈阳性的比例会更低。

我用这种方法来了解一个国家可能被感染的最大人数。ourworldindata.org 网站记录了不同国家报告进行的非典-新冠肺炎测试的次数。我们可以将进行的测试数量与不同国家报告的 SARS-新冠肺炎确诊病例的数量结合起来(由约翰·霍普金斯大学 CSSE 分校编辑、整理和提供)以获得“最坏情况”的情景(或者,正如我在下面讨论的,也许实际上是最好的情况)。确诊病例与所做检测的比率接*于给定日期的最大可能感染人数。这些上限估计值由图 1 中上方的红色三角形标出。

[……]目前没有一个国家接*实现群体免疫

截至 2020 年 4 月 29 日完成这篇文章时,只有两个国家的阳性检测率超过 25%:厄瓜多尔(48.68%阳性检测)和英国(27.90%阳性检测)。即使是那些受该疾病肆虐最严重的国家,阳性病例的最大百分比也低于 25%:西班牙的感染者最多为 20.1%,意大利的感染者最多为其人口的 11.0%,美国可达 17.8%。请注意,不清楚在某个时间点感染的人口比例较低是否一定是好消息。有人可能会说,拥有更高比例的已经患病的人口将使一个国家更接*实现人们渴望的群体免疫。这也将使这种疾病的真实死亡率比目前认为的要低得多(例如,见这篇文章)。不幸的是,如果人们接受群体免疫需要一个国家 60 %-70 %的人口通过该疾病的估计,我们必须得出结论:目前没有一个国家接*实现群体免疫,尽管 T10 一些报告与此相反。**

更精确的估计:有界外推

以上,我已经提供了强有力的下限(官方确认的病例;图 1 中的绿色三角形)和上限(正测试率;图 1 中的红色三角形)代表 SARS-新冠肺炎在各国的流行情况。这些是至关重要的,因为我们几乎可以肯定,在任何给定的国家,已经患病的人的比例必须在这两个界限之间(图 1 中灰色部分所示)。现在,我将大致说明不同国家的真实患病率在这个范围内的位置。我在这里提供的估计必然是一个猜测——即使是一个在统计学上有充分动机的猜测——严重依赖于推断。从统计学上来说,推断是一件非常冒险的事情。值得记住马克·吐温对推断的讽刺:

在一百七十六年的时间里,密西西比河下游缩短了二百四十二英里。这相当于*均每年超过 1.3 英里。因此,任何冷静的人,不是瞎子也不是白痴,都可以看到,在古老的鲕状志留纪时期,就在一百万年前的 11 月,密西西比河下游长达一百三十万英里以上,像鱼竿一样突出在墨西哥湾上空。出于同样的原因,任何人都可以看到,七百四十二年后,密西西比河下游将只有一英里又四分之三长,开罗和新奥尔良将把它们的街道连接在一起,在一个市长和共同的市议员委员会的领导下舒适地缓慢前行。

在各国,确诊病例数必须与检测次数密切相关:只有在实施检测后才能确诊病例。还有一个因素使得这种相关性更强。正如我所讨论的,有理由相信自己可能被感染的人——无论是由于症状还是与其他患者接触——更有可能接受检测。在这种疾病更流行的国家,有这种症状的人数会更多。这就形成了一个反馈循环,感染人数多的国家将进行更多的检测,进一步加强了相关性。

报告的死亡和疾病康复的相对数量可以作为疾病在特定国家发展阶段的指标。最初,各国可能会经历该疾病病例数量的激增,但直到一段时间后,才会出现大量死亡或康复。这种延迟的原因是这种疾病需要时间来恢复或死亡,因此在感染和最终结果之间必须有一些滞后。这里也需要谨慎:各国报告的痊愈人数实际上是发现受感染的人数。然而,现在已知很大比例的人被感染,但仍然完全无症状。这些人往往不接受检查,而且经常完全康复,但不计入官方统计。原则上,该疾病导致的死亡人数可以被视为更可靠的统计数字——更难忽略死亡人数——但也有广泛的报道称,即使是死亡人数也可能被大大低估。例如,在几个国家,据报道许多 SARS-COVID19 死亡(许多发生在疗养院和养老院 ) 没有被纳入官方死亡统计

图二。预测确诊病例数的回归模型,作为执行的测试数、报告的死亡数和报告的恢复数的函数。横轴表示确诊病例数,纵轴表示模型预测值。虚线是同一性,即使用该模型预测的确诊病例数正好等于确诊病例的真实数。图中的点强烈地聚集在这条线周围,这表明该模型是现实的准确反映。点的颜色对应不同的国家。注意两个轴上的对数刻度。

因此,所有三个指标(确诊病例、确诊死亡和确诊痊愈)都应作为其真实值的实际下限。尽管如此,人们仍然可以利用它们之间可靠的相互关系来估计某个国家已经发生的真实病例数。我使用了一个国家接受测试的人口比例和死于该疾病的人口比例(来自ourworldindata.org),以及已知已从该疾病中康复的人口比例(来自约翰·霍普金斯大学的 CSSE ),来预测该国被确认感染的人口比例(在技术术语中,我使用了 主成分 probit 回归模型 )。从图表(图 2)中可以看出,在拟合范围内,这种回归模型实现了非常准确的预测。

请注意,在上述回归模型中,确诊病例数是预测的变量,而接受检测的人口比例、死亡和康复是独立的预测因素。我用这个回归模型来推断人群中的真实病例数。这是通过将受试人群的比例人为设置为 100%,然后使用拟合模型(具有报告的恢复和死亡的真实值)来预测确诊病例的数量来实现的。为了保持外推的合理性,这些都受到额外的约束,即得到的估计值必须位于上述已知的上下限内(用技术术语来说,贝叶斯先验)。

这种方法为我们提供了由图 1 中的蓝点绘制的中心估计值。在各国之间,这些中央估计数更接*流行率的下限——即官方报告的病例——而不是阳性检测率的上限。在所有国家的研究中,只有三个国家的终生流行率可能超过 1.5%:西班牙(1.73%)、比利时(1.71%)和意大利(1.6%)。正如我所说,这些估计只是猜测。然而,尽管对某些人来说它们看起来很低,但事实上它们与现有的几个大规模随机测试研究中发现的结果是一致的。例如,最*的一项研究报告了在 Vo '村进行的两次广泛检测的结果,Vo '村是意大利北部该疾病的最初疫源地之一,也是首批通过隔离成功控制病毒的地区之一。研究人员测试了很大一部分人口(分别为 85.9%和 71.5%),发现封锁开始时的患病率仅为 2.6%,封锁结束时为 1.2%。“Vo”是这种疾病在意大利最初传播的地区之一,比该国其他地区传播得更广(并且是意大利第一个死于 SARS-新冠肺炎的人)。因此,我对意大利 1.6%的终生流行率的估计似乎是一个相当合理的赌注。

图 3。SARS-新冠肺炎真实累积流行率的估计演变。将光标悬停在图表上以查看点的实际值,并单击图例放大或取消选择特定曲线以进行更详细的比较。

上面的图 3 描绘了中央估计值是如何演变的。它证实了西班牙——我自己的国家——目前是大多数病例发生的地方,并于 4 月 3 日超过了意大利。幸运的是,根据图中斜率的衰减,似乎所有被绘制的国家——我根据个人兴趣和疾病造成的问题最多的国家的组合选择的——似乎都已经过了疾病的高峰期,可能除了俄罗斯。图 4 证实了这一点,该图绘制了估计的每日新病例,计算为连续累积点之间的差异。

图 4。SARS-新冠肺炎真实每日新增病例数的估计变化(7 天移动*均值)。将光标悬停在图表上以查看点的实际值,并单击图例放大或取消选择特定曲线以进行更详细的比较。

发现的病例比例是多少?

正如我前面提到的,不同的国家在对其人口进行检测(以及报告这些检测的标准,详见 、ourworldindata.org)时遵循着本质上不同的标准。这种不同的策略自然导致官方报告的数字在多大程度上准确地反映了疾病在各国的实际流行情况。图 5 绘制了官方报告的确诊病例数与真实病例累积估计数之间的比率。首先要注意的是,所有标绘的国家——除了爱沙*亚和德国,如下所述——都大大提高了它们的检出率,也许在标绘区间结束时稳定在一个特定值附*。然而,请注意,这些国家中似乎没有一个检测到超过其 SARS-新冠肺炎病例的大约四分之一(西班牙和美国),而其他国家(例如,法国和瑞典)似乎只检测到其病例的大约 15%。

图 5:各国报告为 SARS-新冠肺炎官方确诊病例的真实病例比例。这些是以累计确诊病例数与上一节计算的累计估计数之比计算的。将光标悬停在图表上以查看点的实际值,并单击图例放大或取消选择特定曲线以进行更详细的比较。

爱沙*亚早期的检出率高峰很可能是因为在高峰之日病例数量很少。后来,当这种疾病开始更广泛地传播时,它的检测能力变得不堪重负,正如它在一个又一个国家发生的那样。然而,令人惊讶的是,大多数其他国家的检出率并没有开始回升,爱沙*亚和德国(在某种程度上)在检测疾病病例方面似乎一直在逐渐恶化,也就是说,他们的检出率在下降,或者至少没有上升。这些国家——它们对疫情的最初反应在某种程度上是欧洲范围内的榜样——突然之间表现不佳,这似乎有点违背直觉。也许他们有意追求不同的目标?对那些最擅长检测该疾病的国家的检测率的演变进行研究表明了另一种可能性。

查找单个案例与了解总共有多少个案例

图 6 描绘了截至 4 月 28 日,我估计在发现其病例方面最成功的 10 个国家的估计发现率的演变。总体而言,只有新加坡(100%检出)、冰岛(63.41%)、卢森堡(44.44%)和巴林(43.17%)的估计检出率超过 40%。请注意图中,在这十个国家中,似乎有两种不同的模式。一方面,一组国家——巴林、爱尔兰、葡萄牙、新加坡、西班牙和美国——显示出它们在 SARS-新冠肺炎检测能力方面的持续增长。这些国家的首要任务似乎是发现尽可能多的患者。这有一个明显的优势,即让他们尽快得到治疗和/或监测和隔离,这将有助于控制疾病的传播。然而,这种方法的代价是只对那些更有可能患病的人进行测试,从而增加了测试的偏倚。正如我上面所讨论的,这使得很难使用检测信息来评估该疾病在该国的真实传播情况。

图 6:截至 4 月 28 日估计检出率最高的十个国家中被报告为 SARS-新冠肺炎官方确诊病例的真实病例比例。这些是以累计确诊病例数与上一节计算的累计估计数之比计算的。将光标悬停在图表上以查看点的实际值,并单击图例放大或取消选择特定曲线以进行更详细的比较。

在这组国家中,新加坡的情况尤其突出。这个国家——尽管最*出现了疾病高峰——似乎目前发现了几乎所有的病例。然而,令人惊讶的是,新加坡并不在进行最广泛测试的国家之列。到 4 月 20 日(他们最新报道的测试次数),他们最多只测试了 1.39%的人口,远低于许多其他国家。这表明新加坡可能特别擅长于接触者追踪,即找到所有与已知感染者接触过的人。事实上,新加坡政府已经率先部署了基于蓝牙的联系人追踪应用程序,该应用程序已经被大部分新加坡人接受。

[……]后几个国家正在*衡发现个别患者的需要和更好地了解该疾病在其公民中的真实流行情况;简而言之,他们正在减少他们的测试偏差。

另一方面,第二组国家——包括冰岛、以色列、卢森堡和瑞士——显示出它们的检测率暂时持*甚至下降的变化模式,与我们在德国和爱沙*亚看到的非常相似。至关重要的是,就接受测试的人口百分比而言,这一群体包括前三名国家中的两个。冰岛——迄今为止进行最广泛检测的国家——在检测这种疾病方面似乎越来越差,这是怎么回事?这个问题的答案是,后几个国家正在*衡检测个体患者的需要和更好地了解疾病在其公民中的真实流行情况;简而言之,他们正在减少测试偏差。

这些国家似乎不是仅对最有可能患病的人进行检测,而是对患病迹象较少、也不属于特别高风险群体的人进行检测。这样,尽管冰岛进行了比其他任何国家都多的检测,但实际上检测到的病例越来越少。作为交换,这种较低偏倚的检测策略使他们能够更好地了解该疾病在其人群中的流行情况,因为无偏倚检测的阳性率将接*该国的真实流行率。这种策略的一个有趣的副作用是,人们还将测试更多症状轻微甚至完全无症状的人。这样的人患严重并发症的可能性要*得多。这导致这些国家的官方死亡率下降。确切地说,一段时间以来,德国异乎寻常的低死亡率(目前为 4.04%)让媒体感到困惑,爱沙*亚的死亡率更低(3.08%)——例如,与西班牙的(10.24%)或瑞典的(12.26%)相比。因此,爱沙*亚——我写这篇文章的地方——和德国不是表现不佳,而是在一个非常好的公司里;他们采取的策略与迄今为止控制疫情最好的一些国家一样。对爱沙*亚检出率的这种解释确实与爱沙*亚政府明确强调无偏见检测不谋而合

结论

这里给出的下限和上限并不严格

请注意,虽然可以说我提出的中心估计只不过是明智的赌注,但由于它们依赖于外推法(尽管是受控的外推法),因此下限和上限确实是硬边界。几乎可以肯定,不同国家的真实终生流行率一定在图 1 的灰色部分。**

确诊阳性病例数是真实终生流行率的有效下限。这是很难争议的。任何国家的领导人都不太可能在报告该疾病在该国感染了比实际更多的人时获得任何好处。事实上,我确信人们可以找到不那么保守但仍然有效的技术,将下限置于更高的值。

我所讨论的检测偏差使得任何国家的真实流行率都不太可能高于其阳性检测率。全球检测试剂盒的短缺迫使各国在管理检测时相当有选择性。这导致了一种积极的偏见:感染者比未感染者更有可能接受检测,使得阳性检测率高于疾病的流行率。

有人可能会认为,由于疾病点患病率的变化,每日阳性检测率——即单日阳性检测率——可能会导致更高的上限。但是,请注意,点流行率——某一天的流行率——必须低于这里计算的终生流行率,因为后者实际上是前者的累积和。因此,随着流行病的发展,终生流行率不断上升。我使用期末的累积阳性检测率(即最*一次可用的累积阳性检测率)作为患病率的上限。这肯定是一个保守的界限,当然可以做得更紧。换句话说,我们可以降低上限,但它们仍然是有效的上限。

群体免疫在 T2 非常遥远,甚至在瑞典也是如此

计算出的上限——阳性检测率——表明,目前,没有一个有公开检测数据的国家的流行率能超过 30%,只有厄瓜多尔例外,略高于 48%。更引人注目的是,根据外推估计,对于每个被研究的国家,最大流行率很可能低于 2%。专家认为,达到群体免疫需要一个国家 60%或 70%的人口以某种方式对这种疾病免疫。不幸的是,在该疾病广泛传播约两个月后,所有国家仍远未达到这些数字。在最初毫无准备的情况下,大多数国家、机构和个人已经建立了某种形式的社交距离,并养成了习惯——比如戴口罩、避免握手、用视频会议代替商务旅行等。—这将减缓疾病传播的速度,更不用说一些国家目前实施的严格隔离了。所有这一切意味着,如果用了两个月的时间达到最多 20%的流行率——很可能大幅降低——那么要达到 60%的流行率就需要长得多的时间,而且疾病的传播速度也会更慢。

上述发现与一些政府官员为其政策选择辩护的公开声明形成了鲜明对比,这些官员声称,他们预计自己的国家将很快实现群体免疫。例如,瑞典公共卫生机构认为斯德哥尔摩地区的阳性检测率约为 20%——该地区集中了瑞典的大多数 SARS-新冠肺炎病例——他们预计需要“几周”才能达到预期的群体免疫力。我的估计——基于他们官方报告的数据——表明瑞典的总体阳性检测率刚刚超过 15%,而外推估计认为他们的真实流行率很可能仅仅超过瑞典人口的百分之一。至少从 2 月 29 日起,瑞典就出现了确诊病例。在花了大约八个星期达到目前的流行率后,很难看出他们究竟如何期望在几个星期内将他们的病例增加至少三倍——最有可能是大约五十倍。当然,除非是几十个中的几个。在目前的情况下,这甚至更加困难:人们比在之前更加谨慎。同样重要的是,即使瑞典当局最终是正确的,并且他们设法在几周内从目前的流行率达到群体免疫,流行率必要的残酷增长将导致难以忍受的高死亡人数,特别是在老年人和那些预先存在健康状况的人中,并将使瑞典的卫生系统不堪重负。其他最初以群体免疫为目标的国家已经不得不改变策略。**

我们将经历一段漫长的旅程

上述观点认为,我们目前的流行率与人们渴望的群体免疫相差甚远,如果有什么不同的话,我们应该预计流行率的进一步增长将比目前更慢,这意味着我们需要许多个月才能希望出现任何形式的群体免疫。即便如此,专家们也不确定经历这种疾病一定会产生免疫力。根据大多数专家的说法,另一条获得群体免疫的途径——疫苗——在最乐观的情况下——至少需要一年的时间来部署。

一些国家在放松保护措施后出现了疫情反弹。新加坡是成功控制疫情的典范。然而,4 月 7 日,在该疾病的病例数量再次大幅增加后,它被迫采取更严格的措施。最*,检疫在中国哈尔滨市恢复。这警告我们,只要没有某种形式的疫苗,完全解除限制就很难实现。

因此,目前的保护措施很可能在很长一段时间内都是必要的。这些都有深刻的社会和经济影响。对一些人来说,在人们面临死亡的情况下,甚至提及保护措施的经济影响似乎都是轻率的。然而,重要的是要记住,深刻的经济危机本身对健康有强烈的影响,而且也导致许多人死亡。因此,各国政府和国际机构有责任*衡健康保护措施和减轻这些措施的社会经济影响。

许多病例没有被发现,但没有那么多

我对流行率的估计证实,各国确实存在严重的 SARS-新冠肺炎病例漏报,这并不令人感到意外。大多数发达国家——除了新加坡——目前发现了 20%到 60%的病例(见图 5 和图 6)。这具有积极的意义,即该疾病的真实死亡率将在目前报道的死亡率的一半至五分之一之间。这给了一些乐观的理由。

在最*的一项研究中, Silverman 和他的同事们发现,很有可能有大量——大约 870 万——美国患者可能经历过 SARS——新冠肺炎,只经历了轻微的症状——类似于轻微的普通感冒——而没有被认为是疾病。我估计 4 月 28 日美国的发病率略高于 380 万例。美国的最大可能患病率——根据阳性检测率,略低于 5900 万例——确实允许 870 万例(占人口的 2.63%)。然而,我认为我估计的不到 400 万可能更接*美国患病率的真实值。

[……]绝大多数人口都有 而不是 这种尚未过去的疾病。

这 870 万人是通过将大多数具有不属于流感的一致症状的患者归因于 SARS-新冠肺炎而推断出来的。人们会预计,即使考虑到高比例的轻度病例,这种疾病的突然爆发也应该反映在更强的死亡人数上,超过他们报告的 0.1%。有了这样的数字,我们还应该相信绝大多数的医疗保健系统都与西班牙或意大利相似——特别是考虑到西班牙和意大利的人均医院床位和医生数量都比美国多得多。这似乎还没有发生。我的估计也完全符合提供的数据,即在受影响地区(意大利 Vo)对该疾病进行的明确而广泛的检测。即使是一个受严重影响的地区也没有达到 3%的患病率,这很好地支持了我的估计值,将意大利作为一个整体,患病率约为 1%。在任何情况下,联合考虑 Silverman 等人的和我提出的估计值,我们可以得出美国患病率的可能范围在 1.17%(我的中心估计值)和 2.63%(Silverman 等人的)之间。总的来说,这两项估计表明,实际病例数是美国官方报告比率的 4 至 9 倍(988,451 例确诊病例;占总人口的 0.30%),表明存在实质性的漏报。然而,这两个估计数仍然相当低的终生流行率。病毒并非“无处不在”。尽管网上流传着一些谣言,但绝大多数人都已经 而不是 患上了这种疾病。

你需要多少个南瓜才能遮住月亮?

原文:https://towardsdatascience.com/how-many-pumpkins-do-you-need-to-cover-the-moon-f99a183e64aa?source=collection_archive---------51-----------------------

一个计算思*的故事,只有少量的数学

马里乌斯·乔奇兰在 Unsplash 上的照片

好吧,这是正式的。第一批橙色南瓜已经到达伊利诺斯州中部的杂货店。这意味着写一个关于南瓜、万圣节和“香料拿铁”的故事是正式的。也许不是最后一个。伊利诺伊州是美国最大的南瓜生产商,通常生产超过 500,000,000 磅南瓜。这些南瓜中的大部分,大约 90-95%,种植用于食品加工,其余的种植用于装饰目的。一个主要的“U-Pick”南瓜农场大南瓜园,位于伊利诺伊州亚瑟附*。

(作者拍摄的大南瓜地图片)

南瓜与万圣节有着千丝万缕的联系,万圣节是由爱尔兰移民带来的传统,他们最初用芜菁雕刻南瓜灯。芜菁逐渐被更容易获得、更容易雕刻的南瓜所取代。

另一项特别的活动将在今年的万圣节举行。月亮将是猎人的月亮,收获月之后的第一个满月。我很好奇用南瓜覆盖整个月亮需要什么,所以我做了一点计算。结果还是挺意外和惊艳的!

照片由 Aron 视觉效果Unsplash 上拍摄

让我们从问 Wolfram|Alpha 月球表面积开始。这是 1500 万*方英里。有很多要讲的。首先,让我们把普通的圆形南瓜*似为一个立方体,每边测量南瓜的直径。为了生成下图所示的南瓜,我使用了 Wolfram 语言代码,这些代码来自张宇松发表的这篇非常棒的南瓜雕刻博文:

(图片由作者提供)

让我们假设我们有一个直径正好为 1 英尺的完美南瓜。这意味着它的足迹,或南瓜印,正好是 1 *方英尺。我们现在需要做的就是将月球表面除以 1 *方英尺。在 Wolfram 语言中,我们可以使用数量函数来实现:

In[.]:= Quantity[15000000, "Miles"^2]/Quantity[1, "Feet"^2]Out[.]= 418176000000000

因此,我们将需要 418 万亿多一点的南瓜!一个直径为一英尺的南瓜的重量在 12 到 18 磅之间,所以我们假设*均重量为 15 磅。总重量(在地球上)将是 62.7264 亿磅,或 6.2 万亿磅。鉴于伊利诺伊州每年只生产微不足道的 500,000,000 磅南瓜,这意味着它将需要相当长的时间才能完全覆盖月球:

In[.]:= 6272640000000000/500000000Out[.]= 12545280

换句话说,伊利诺伊州需要 12545280 年才能种出足够覆盖月球的南瓜!有很多方法可以把圆南瓜包装得更紧密,比如把它们放成六边形,这样会花更长的时间。

在接下来的几百万年里,在前门放几个南瓜可能会更好,也更有趣。万圣节快乐!🎃🎃🎃

照片由克雷格·迪米克Unsplash 上拍摄

营销分析如何成为万金油(以及我们应该做什么)

原文:https://towardsdatascience.com/how-marketing-analytics-became-snake-oil-and-what-we-should-do-instead-fc2d1319c95b?source=collection_archive---------79-----------------------

了解为什么营销分析经常让营销人员失望,以及数据科学家如何解决这个问题

照片由埃弗雷特收藏馆提供

业内人士一直声称,大衰退对营销分析是一件好事。他们认为,在大多数公司削减营销预算的时候,营销人员会在数据上投入更多,以证明他们对客户的价值。

我想我们很多人都认为新冠肺炎的低迷会对营销分析造成同样的影响。然而,这一次可能不是这样。

我注意到,由于新冠肺炎经济低迷,过去几周,不同公司的许多同事都丢掉了工作。可能是危机迫使营销人员评估昂贵的分析实践是否真的值得投入金钱和工作。或者可能是我们(数据专业人员)从未交付过我们认为的那么多价值。

事实上,双方可能都有责任。分析师和营销人员都没有真正以正确的方式对待营销分析。

在过去的十年中,营销行业在构建数据仓库、实施高级跟踪以及雇佣数据专业人员来分析和报告这些数据方面投入了大量资金。

但是,随着时间的推移,营销分析开始变成了万金油。

就投资金额而言,收益被广泛夸大了。构建的解决方案在质量上是脆弱的。这些目标通常不太可能实现(如果不是不可能的话)。

我不认为分析师或营销人员故意做一些不诚实的事情。我认为他们只是做了营销人员经常做的事情——推销产品的好处。

主要问题是营销人员可能不是使用这种特殊产品的合适人选。

是什么让营销行业与其他行业如此不同?

其他行业使用数据的时间比营销要长得多。金融服务、制造、物流和科技公司已经构建了高度复杂的数据解决方案来支持和改善他们的组织。

但是这些行业区别于市场营销的一个关键点是,它们严重依赖于的运营效率。

在金融服务交易中,几秒钟的时间会产生很大的影响。制造和技术公司依靠运营来提高质量。物流需要先进的组织和效率来持续按时地交付货物。

与这些行业一样,高质量的数据解决方案也需要运营效率。因为这些行业长期以来一直优先考虑效率,所以他们更容易构建这些解决方案。他们产生的数据更加准确,而且各种利益相关者实际上都在使用这些数据。

然而,营销机构从来不依赖运营效率。至少程度不一样。

在大多数情况下,这对营销人员来说是一件好事。这有助于他们赢得客户,并适应消费者不断变化的需求。

但是在这种类型的环境中,很难确定运营效率的优先级,这会导致普遍的数据质量问题,从而破坏数据解决方案的目标。

质量差如何破坏营销数据解决方案?

出于同样的原因,你希望你的税务会计师擅长数学,利益相关者希望他们的数据是准确的。每当他们在报告中发现错误,每当分析师不得不回来澄清时,营销分析团队就会失去可信度。

一旦信誉问题在组织中普遍存在,就很难与之对抗。尽管分析团队成员可能仍然会因为产生他们认为是好的工作而获得报酬,但公司内部的利益相关者将开始从其他地方获取他们的数据。

他们将完全忽略您的仪表板,而是直接进入数据源本身。这样做对他们来说是一种痛苦,但当他们相信这会让他们获得更准确的数据时,他们会忍受这种痛苦。

具有讽刺意味的是,这些利益相关者也经常导致质量问题。数据收集是分析团队和利益相关者之间的合作,利益相关者缺乏纪律会导致他们抱怨的质量问题。

质量如何成为营销机构的一个问题?

营销人员乐于快速适应以满足客户的需求。营销主管希望他们自己的内部部门能够快速适应以满足他们的需求。

这导致营销数据解决方案的目标不断变化。仪表板或数据仓库的目的是不断变化的,因此项目陷入了开发困境。

构建这些解决方案的数据专业人员发现自己在为同一个项目进行“再一次调整”。这些没有明确最终目标的持续调整只会进一步降低数据质量。

这些质量问题随后被在分析部门之外工作的个人贡献者放大。一个常见的例子是,当营销人员快速启动活动时,他们可能直到活动启动后才记得添加 URL 参数跟踪。

营销机构有专门负责媒体购买、社交媒体管理、活动策划和客户管理的部门并不罕见。

所有这些部门通过他们的努力自然产生数据。并且数据通常在各个部门内是可靠的。由于只有少数人实施社交媒体活动,他们很容易在自己的团队中建立一致的做法。

但是,当分析团队试图将这些数据孤岛整合在一起时,问题就出现了。

让所有这些贡献者以这样一种方式使用他们的各种工具,即各种数据源可以映射在一起,需要管理层通过更明确的过程和程序施加巨大的影响。

如果您查看下面的简化场景,您将会看到交付这些完美解决方案的可能性是如何随着复杂性的增加而降低的,即使单个部分通常会自行成功。

作者提供的图表;例子灵感来自瑞安·格拉夫

当营销人员试图创建企业范围的数据解决方案时,这种情况基本上会发生。他们根本没有扩展这些解决方案的操作规程。

到目前为止,还没有任何工具能够消除对这一原则的需求——不管有多少销售团队声称他们的工具是银弹。

营销人员应该变得更擅长运营吗?还是应该设定更现实的目标?

营销人员可以学习改善运营(当然也可以阅读我即将出版的解释如何做到这一点的书),但我认为最好设定更现实的目标,而不是改变整个行业文化。

以下是营销人员对数据的共同目标:

  • 一个“主”数据仓库,来自所有部门的所有数据都清晰地映射在一起
  • 回答每一个业务问题的“主”仪表板
  • 跨域跟踪
  • 多渠道归因

即使对于一个高效的组织来说,这些目标也是雄心勃勃的。而且都是理论上可能的。

但随着公司规模的增长,实现这一目标变得更加困难。公司最终增加了越来越多的步骤来支持解决方案,从而降低了输出的质量。

这种规模的工作需要每个贡献者的高度自律,从客户经理到创意人员,再到数据分析师甚至高管。

在一个适应性和直觉至关重要的行业,很难毫无阻力地创造出这种水*的纪律。

解决办法?我们应该少做商业智能,多做数据科学

如果营销人员和他们的分析师都希望数据解决方案能够提供真正的好处,并在营销行业文化中切实可行,他们应该少关注商业智能,多关注数据科学。

我一直认为“数据科学”是一个老生常谈的术语,但它实际上适用于这种情况。

由应用统计学和使用 R、Python 或 SAS 等高级编程语言的机器学习定义的数据科学,为营销人员提供了一种规避大规模跟踪和报告计划中的许多问题的方法。

由于营销人员努力获得组织纪律,以实现他们的许多目标(跨领域、多渠道归因、用户旅程、主仪表板等)所需的跟踪水*,他们可以使用统计数据来推断他们的业务问题的答案。

以多渠道归因为例。

许多营销人员想知道,如果一个用户在 9 月份浏览了展示广告,在 10 月份看到了《脸书邮报》,他是否会在 12 月份买东西。

许多人喜欢使用多渠道属性来绘制这样的购买路径。但是同时跟踪和绘制地图并不是现实世界的解决方案。一家拥有 300 名员工的广告公司不太可能组织起来支持一个精确的跟踪系统,并绕过谷歌和脸书(以及整个欧盟)制定的隐私规则,以完全准确地绘制这条路径。

但同样的归因问题,可以用统计学来回答。我们可以推断,有时使用简单的 t 检验,是否一个部门的支出增加,如社交媒体,会导致更高的产品购买率。

这种方法最好的一点是,它实际上将关注点从跟踪和报告转移到了真正的分析上。

分析团队可以按原样使用现有数据,而不是将各种数据源映射在一起。如果你已经在分析数据,为什么不用更原始的形式呢?

(附注:您仍然应该将这些原始数据放入数据仓库。您只是不需要在这样的粒度级别区分映射的优先级。)

使用原始数据也使得数据质量不再是一个问题。由于统计总是依赖于抽样,而不是捕捉整个人口,数据质量更宽容。如果你知道你正在试图估计你的活动对结果的影响,如果你丢失了一些数据点,那就不是问题了。

这减轻了组织改善运营的负担,并让分析团队推动利益相关者进行即席分析。

分析团队必须自动化最基本的报告,并启动假设库,利益相关者每周提出问题,分析团队通过即席分析进行回答。

分析团队也必须从雇佣如此多的数据库开发人员、报表开发人员和低技能分析师转向统计人员和数据科学家。或者至少是理解更高级统计数据的分析师。

这将使营销分析团队更加灵活,并根据营销人员的文化产生更大的价值。

毕竟,营销人员不仅仅想要灵活性——他们需要 it,而数据科学能够提供这种灵活性。

最初发表于【https://www.taylorrodgers.com】

人工智能如何帮助医疗超声成像转型

原文:https://towardsdatascience.com/how-medical-ultrasound-may-become-the-preferred-imaging-method-with-ai-323a689a1997?source=collection_archive---------26-----------------------

为什么人工智能和超声波是一对绝配

米克·豪普特在 Unsplash 上的照片

介绍

诊断超声是一种流行的成像方法,用于各种筛查和诊断程序,如妊娠监测、甲状腺筛查、血流评估或乳腺癌检测。这些检查大多由这些领域训练有素的临床医生进行。由于超声波机器是一种高度复杂的仪器,需要几个月甚至几年的经验来获得正确的诊断技能。即使是熟练的专业人员,超声波检查也可能需要很长时间(长达 1 *时)。

在许多医疗领域,超声波仍未得到充分利用。我们可以确定这一发展的以下原因:

  • 缺乏临床经验,使得患者更容易接受昂贵的 CT 或 MR 检查。
  • 检查时间长,导致患者通过量减少。这在*型诊所和护理点医疗中尤其明显,在这些地方,由于时间限制,其他诊断程序可能比成像更可取。
  • 由于固有噪声(斑点)和对比度降低,与 X 射线或 CT 扫描相比,超声波图像可能更难读取

图 1:一名 51 岁女性患者的 CT 和超声检查对比。资料来源:(2016)。“甲状腺计算机断层成像:可变病理学图片评论”。洞察成像7(4):601–617。土井:10.1007/s 13244–016–0506–5刊号1869–4101

作为利用不足的一个例子,考虑一下护理点(床边)医疗。这方面的程序通常由不太熟练的临床医生以及护士来执行。因此,专门的超声培训是稀缺的。此外,由于时间是这一领域的一个关键变量(护理点医学经常处理急性问题),检查必须尽可能短。说到速度,成像通常不是一个很好的工具。

最*, AI 算法声称在从医学图像中诊断各种疾病方面有非常好的性能,有时甚至超过人类水*的性能。虽然这些研究中的大多数集中在 CT 或 MRI 成像上,但是使用 AI 分析超声图像也已经得到了相当广泛的研究。另一方面,很难想象人工智能会在短期内完全取代人类进行诊断程序。对于超声波来说更是如此,因为操作员必须手动扫描患者。相反,探索人工智能如何简化临床医生的生活,同时保持人类专家对诊断的最终责任,在短期内可能更有价值。

在这篇文章中,我将首先解释超声波检查通常是如何工作的。在第二部分,我将关注人工智能可以在哪里提高程序的质量和效率。最后,我将尝试对超声波人工智能革命的速度做出一些预测。

超声波检查的解剖学

本质上,超声波检查由以下部分组成:

  • 患者进入扫描室。
  • 医生准备好超声波机器,并为即将到来的检查调整设置(超声波探头、扫描预设)。
  • 额外的患者特定调整可能是必要的。
  • 医生通过将探头移动到正确的位置找到相应的解剖结构。
  • 医生标注重要的界标并进行测量。
  • 医生保存截图并继续进行下一个解剖或结束实时检查。
  • 医生查看截图并最终确定诊断。

由于这些步骤几乎在每次考试中都要执行,而且大部分是手动的,因此工作流程还有很大的改进空间。此外,上述大多数步骤由必须重复执行的多个子步骤组成(例如,进行测量包括在用户界面中选择测量工具、放置相应的卡尺并命名测量)。

有些步骤,例如找到正确的视图,有经验的用户可以很快完成,而经验较少的用户可能会很吃力。这也受到仪器图像质量的影响。由于训练有素和更有经验的用户与训练不足的用户执行相同的检查,因此检查的质量和诊断可能有很大差异。

人工智能会有什么帮助

在超声检查中,我们可以在哪里插入一点人工智能的魔力?

让我们看看我们在上一节中收集的列表,并对其进行分析:

  • 在准备检查和选择超声波探头和预设时,没有太多可以改进的地方,因此我们将保持这一步骤不变。
  • 不过,可以使用 AI 进行额外的患者特定调整。尽管这在超声波领域尚未普及,但 ContextVision 公司已经为射线照相术提供了基于人工智能的图像增强功能(【https://www.contextvision.com/products/radiography/】T2)。
  • 对于没有经验的操作者来说,找到相应的解剖结构是最困难的任务之一。不幸的是,这一步很难完全自动化,因为它涉及到移动探头本身。然而, AI 可以帮助导航:例如,FDA 批准的工具标题指导可以帮助用户获取心脏的标准视图。智能超声波公司开发了类似的解决方案。通过使用 3-D 超声提供了额外的机会:尽管所采集的 3-D 体积的图像质量通常不如 2-D 超声,但它通常足以进行准确的诊断。GE Healthcare 为胎儿大脑中基于人工智能的*面识别开发的工具名为 SonoCNS 提供了这种功能。

声纳系统。来源:通用电气医疗

  • 人工智能还可以极大地简化标注和测量(有时甚至完全自动化)。找到对应的*面后,SonoCNS 可以自动对胎儿大脑进行一些标准的测量。围绕心脏筛查的更复杂的测量也正在自动化:Ultromics 在其 EchoGo 核心软件 (FDA 批准)中提供自动化心脏分析。EchoGo 能够计算左心室射血分数、左心室容积,甚至心脏应变。 [DiA 的 LVivo RV](http://fully automated analysis of the heart’s right ventricle (RV)) 提供心脏右心室的全自动分析(也适用于新冠肺炎患者),而他们的 LVivo 膀胱提供自动膀胱容量测量(也获得 FDA 批准)。 PIUR Imaging 率先提供颈动脉斑块的 AI 辅助分析,包括斑块体积、体积狭窄、3D 灰度中值和灰度中值分布。结果汇总在如下所示的报告中。

斑块体积分析报告。来源: PIUR 成像

  • AI 还可以自动截图:一旦执行了(自动)测量,就可以保存截图。此外,人工智能可以在整个检查过程中指导临床医生——因为它熟悉正在扫描的解剖结构,所以它知道还需要检查什么。一旦获得所有标准视图,软件可以自动通知临床医生检查已经结束。

未来何时到来?

如前所述,首批人工智能支持的应用已经上市,并且随着新临床医生越来越依赖它们,它们变得越来越广泛。所有领先的超声波机器制造商以及几家初创公司都赶上了这一趋势,并在这一方向进行了大量投资。医疗云解决方案,尤其是在北美和亚洲,正在兴起。支持人工智能的另一个论点是对病人吞吐量的需求不断增加。这只有随着自动化水*的提高才能得到控制。

另一方面,临床医生最终仍要对他们针对单个患者做出的决定负责。因此,他们对人工智能在他们领域的使用持怀疑态度是可以理解的。对于拥有多年经验的高技能医生来说尤其如此。最*关于神经网络对抗性攻击的研究确实不应该让医生或病人感到更舒服。我认为这将会改变,因为人工智能应用的数量将会增加,越来越多的临床医生将开始利用技术进步。这反过来会给开发人员提供更多的反馈,促进改进周期。

我的预测是,在 21 世纪 30 年代,每一台超声波机器(从低端到高端)都将包含某种程度的人工智能自动化,并将在实践中常规使用。

结论

在医疗点等临床环境中使用超声成像的主要障碍是临床医生缺乏经验以及耗时的扫描程序,这使得推荐专业放射科医生以防止误诊和提高患者吞吐量成为首选。AI 可能会在缓解这一缺点方面发挥很大作用。

随着人工智能和医学图像处理算法的逐渐完善,它们将能够帮助经验不足的用户做出正确的决定,最终提高对患者的护理质量。此外,超分辨率或智能*滑等算法可以提高图像质量,使超声扫描更加详细、易读。人工智能还可以提高效率,使超声检查比转诊到专门的放射救护车更少痛苦,对临床医生来说更有利可图。

微移动公司如何利用位置智能提高资产利用率

原文:https://towardsdatascience.com/how-micro-mobility-companies-leverage-location-intelligence-for-better-asset-utilization-43c0c59d8690?source=collection_archive---------32-----------------------

微移动公司如何使用位置智能以更好的方式管理他们的地面资产

来源

这里有一个很好的问题,可以写在便利贴上,放在你的办公桌上:“我们现在有哪些资产没有为我们赚钱?”—比尔·沃尔什

对于一家微移动公司(又名“X 的优步”),匹配需求和供应是业务的核心。每有一个单位的需求没有得到满足,你就失去了一个订单。对于每一个闲置的供应单位,你都在你的车辆上赔钱。

正常情况下,每个微移动公司都有匹配算法。但是,该算法在一天中的不同时间、一周中的不同日子、不同地点的表现如何呢?他们有模式吗?你是如何分析的?

在这篇文章中,我们将深入探讨在地面上拥有车辆的微型移动公司的供需缺口。让我们详细探讨这两个差距,并理解它与监控和历史分析的关系。

监测有助于了解现场目前正在发生的情况,并对此采取积极主动的态度。现实世界是非常变化无常和混乱的,你的模型总是不能适应这些突然的变化。

例如,当需求高峰或低谷超过*均值时(可能是下雨、交通、抗议、当地事件等。)监控有助于了解哪里的需求异常高,以及你能做些什么。

虽然监控有利于这些即时的突发事件,但分析历史模式有助于您了解这些区域行为的细微差别(或者说,用户或骑手在特定区域的行为)。

例如,您从数据中了解到,当用户的行程在晚上结束于郊区时,它很可能不会被另一个用户接走,这意味着运营团队必须接走它!

来源

一.需求>>供应(订单损失)

让我们来看一个场景:周六晚上 8 点,你的用户在一个有很多酒吧的地方下车,因为那里有一场音乐会。

就本文的范围而言,我们可以假设一个下车的用户是没有预订顺风车的人。被取消的用户将意味着在预订乘坐后没有选择乘坐的人。

注意:每个唯一用户和每个唯一会话的掉线都很重要。因此,即使用户搜索了五次并退出,他也只能算一次。

案例 1:监控

您希望实时监控的一些重要指标,以便能够将您的需求和供应匹配在一起,并用于其他战术决策:

  • Where: 这些用户在哪些地点下车?
  • 速率:每分钟的掉线率是多少?是增加、减少还是不变?
  • 到最*供应点的距离:最*的可用供应点在哪里,有多远?

案例 2:历史分析

历史分析的目的是找到不匹配的模式,并随着时间的推移改进模型,做出更具战略性的决策。举个例子,

  • 频率:这些地点的下降是否有规律,是否以一定的频率发生?例如,工作日与周末、早高峰与晚高峰
  • 持续时间:用户*均在这些地点停留多长时间? 5 分钟、30 分钟还是一*时?
  • 区域属性:区域或供给有什么内在的东西吗?例如,在某些情况下,乘客故意取消行程,因为这些地区似乎不适合他们的偏好(交通繁忙、郊区)。
  • 下一个需求时间:这不仅仅是关于在那个实例中正在发生的事情。但是,是什么样子的。你下一步最有可能在哪里获得需求?

理解流动对于微流动公司来说是非常重要的。接下来哪个领域最有可能获得需求?离车手现在的位置有多远?

盈利能力:这趟旅程会盈利吗?也许让用户放弃无利可图的顺风车并不是一个坏主意。

二。供应>>需求(闲散乘客)

你的骑手在住宅区,在那里他们通常会收到大量的乘车请求。然而,你没有收到请求,因此,乘客是空闲的,而用户可能会在商业区下车。

注意:空闲骑手和骑手会话都是需要考虑的重要参数。这将有助于我们了解问题是出在特定的骑手组(骑手会话数量多)还是其他参数,如位置或时间(闲置骑手数量多)

案例 1:监控

如上所述,监控可以很好地了解当前发生的情况,尤其是在异常情况下。

  • 哪里:现在哪些区域的骑手(或车辆)处于闲置状态?
  • 费率:每分钟的费率是多少?是增加、减少还是不变?
  • 到最*需求的距离:最*的可用需求在哪里,有多远?

案例 2:历史分析

历史分析主要是为了理解低效率的模式。

  • 频率:闲散骑手是否有位置模式,是否在某一频率成为闲散?
  • 持续时间和活跃时间:骑手*均在这些地点闲置多长时间,这与骑手的活跃时间有何关联?
  • 供给或区域的属性:区域或供给有什么内在的东西吗?例如,当付款方式不被司机接受时,他们会取消订单——他们希望当天早些时候拿到现金。
  • 收入和激励:在这些情况下,评估骑手的收入和激励会很有用。这种激励能补偿他们不接受这种特殊乘车方式的偏好吗?
  • 下一个需求时间:如前所述,在按需型公司中,匹配不在于现在发生了什么,而在于流程在哪里。如果您的需求预测模型显示您将在 30 分钟内获得一些订单,那么将骑手移动 5 公里远是没有意义的!

城市中的地理模式

线上与线下的二分法

如果你是一家做 web 应用的公司,你会使用 web(或 app)分析产品(如 Google Analytics、Heap、Mixpanel、Amplitude、Clevertap)来获得用户行为的详细信息。您可以根据用户的品味、偏好和行动创建“用户角色”,以个性化您的策略,从而提高您的参与度和忠诚度。

如果你是一家在地面上有移动司机或车辆的公司,获得可见性并分析你的不同*度在地面上如何相互作用变得非常重要。

如果你能根据不同地区的表现创造类似的位置角色或微观市场,你就能个性化你的策略,并使这些微观市场有利可图。

一旦你理解了你的供给和需求是如何共同作用的,以及某些领域的表现,你就能全面了解实际情况。

弥合供需差距

一旦你知道了这些差距的特征——它们什么时候发生,在哪里发生,多久发生一次等等,这里是你可以做的所有事情来弥补它们!

获得物ˌ获得

在高供应量的地区(流动性不是很大),你可以专注于线下的促销和宣传活动。比如在居民区设置围板。

保留

您可以根据用户如何移动和发送上下文营销促销信息来创建用户角色。例如,在办公区,下午 5 点是吃零食的时间!

利用

如果您发现了不同日期、时间和地区的需求和流程的模式,您就可以提供您的供应并提高其利用率。例如,运营团队会在不同的日子、不同的时间重新分配车辆。

单位经济学

从收入方面来说,你可以让你的定价更加基于地理位置。从成本方面来看,您可以识别交付过程中的瓶颈,并了解您在生命周期的哪些步骤上花费了时间和成本。

损害控制

如果出现异常情况,例如收入或订单突然下降,您可以保持警惕。例如,有时某个地方发生的本地事件会对你的 KPI 产生重大影响,你可能需要对此做出反应!

微移动现象肯定有可能扰乱这个行业(根据统计,它已经在扰乱这个行业了)。微观流动性公司的水*效率取决于一个组织如何管理和利用他们的地面资产。

移动定位数据如何帮助您减少新冠肺炎的风险

原文:https://towardsdatascience.com/how-mobile-location-data-could-help-you-limit-exposure-to-covid-19-cb821b560809?source=collection_archive---------66-----------------------

随着纽约市进入重新开放的第一阶段,这里是过去 6 周热门购物区的人流高峰。

鉴于最*的抗议活动,人们可能会担心手机追踪。我们希望确保我们使用的数据是真正匿名的。除了帮助人们在跑腿时减少新冠肺炎暴露,我们无意分析步行交通。

出于任何目的走出家门已经成为让自己暴露于新冠肺炎的邀请,但是我们可以采取什么措施来限制我们的风险呢?

在线购物*台已经超载了大部分社会隔离的订单,使得在 3 月底和 4 月初几乎不可能获得送货,特别是在外围行政区。有时选择是有限的,无论是去银行,洗衣服,还是为接下来的几个星期采购物品,这样的旅行是不可避免的。

但是,除了起床去杂货店或邮局之外,我们还能做些什么来避免在街区周围排队呢?

从左到右杰克森高地、联合广场、减压阀公园区域的移动位置数据

随着纽约市确诊病例的减少,天气开始感觉像夏天,抗体检测仍然容易出错,新冠肺炎检测仍然供不应求。回归“正常生活”的症结在于感染者和易感者在互不知晓的情况下混杂在一起导致新病例的涌入。

正如我们在新加坡和韩国看到的那样,在没有缓解高暴露情况的明确战略的情况下重新开放,随后又出现了新的病例。4 月下旬,新加坡成为南亚病例最多的地方。韩国在重新开放的第一个星期后,新病例激增,与一个多月前的情况相当。

除了重新开放和恢复封锁的来回摆动,我们对行人交通的意识是否有助于*坦化曲线?

数据分析 NYC 和 Predicio 使用过去一个月的匿名移动位置数据来了解我们城市中一些人口最稠密的零售区的客流量如何每*时、每周波动,以便您可以使用这些见解来获得更安全的购物体验并缩短您的旅行时间。

Predicio 为您带来了用于分析的匿名移动数据,这是一家新兴的基于位置的行为智能初创公司,提供符合 GDPR 和 CCPA 标准的位置数据,这些数据来自用户同意共享其位置的应用程序。

我们首先通过在大纽约地区 10 x 10 英里半径范围内每*时 100,000 个匿名移动位置点的随机样本进行研究来查看数据,以在一个月的过程中每周二每*时生成我们的可视化结果。

在我们感兴趣区域的 100,000 个数据点中,我们查看了感兴趣点周围四分之一英里半径内的步行交通密度,并生成了这些可视化结果:

我们还想让人们看到,一天中,每*时的行人流量是如何相互比较的。

在我们感兴趣点周围四分之一英里的移动数据的统一样本中,步行交通计数

由于直方图每天波动很大,我们合并直方图,取上个月的中值客流量。

4 月 21 日至 5 月 15 日期间,我们感兴趣点周围四分之一英里内的中值客流量

正如人们所看到的,取中值步行交通,这消除了在我们的一般模式中边缘观察的异常值,给出了与我们的交通假设相关的更*滑的分布,因为它与正常的睡眠时间表相关。

我们推断最不拥挤的时间是商店开门的时间和商店关门前的晚上。

我们得出这一结论的基础是,我们感兴趣的地点每周二的营业时间是上午 9 点到晚上 8 点,然后从每*时的客流量中扣除。随着商店临*开门时间,我们看到一个*时前开始的客流量激增。从开放时间到下午,客流量确实有所波动,但与下午 7 点(关门前一*时)相比,客流量仍然很高。

人们不喜欢晚上去跑腿是有道理的。谁知道商品是否会脱销,更糟糕的是,如果位置拥挤,人们可能无法在商店关门前完成任务。

4 月 21 日-5 月 15 日,从我们的兴趣点开始,四分之一英里半径内的 25 天内的日常波动

我们观察数据的其他方法是观察更长的时间跨度,以一天为基础,以我们发现的模式为基础。

在左边和底部的图中,我们没有把时间分成几天,而是在视觉上看到了连续的几个*时。然后,我们使用 ARIMA 模型进行了一些时间序列分析,以获得在几天、几周和几个月内重复模式的总体感觉,并对不同时间跨度内发现的模式进行了实验。

在连续几个*时内拟合 ARIMA 模型。X 轴代表我们的样本人数,Y 轴代表从 4 月 21 日上午 12 点开始的时间。(即。第 25 *时是 4 月 22 日凌晨 1 点)

如你所见,很大一部分工作是从噪音中分离出信号。我们还对观察数据的位置进行微调的一种方法是,更好地将我们的移动数据点隔离到我们感兴趣的点所在的区块内。

聚焦在宾州车站,看着一个街区

以下是我们如何与谷歌地图为宾州车站过滤掉宾州车站所在街区以外的所有其他步行交通的周二*滑图进行比较:

来自谷歌地图的宾州车站

可以看出,由于各种原因,如某些用户在手机上更活跃,以及我们有限的样本强化了我们的结果,基于我们的数据,步行流量存在较大差异。

如果你想知道我们是如何得到视觉效果的,下面将以教程的形式向你展示我们分析的技术层面。

在这里获取数据

的 Predicio 数据门户中,我们按*时提取数据,过滤感兴趣的地理半径,选择一个特定的位置作为关注点,然后做进一步的分析。下面展示了我们是如何做到的,以及如何操作位置信息!

只要有经度、纬度和时间,就可以使用任何位置数据。这里有两个类似的开放数据集可供尝试:纽约市关于行人交通的开放数据门户统计了穿过布鲁克林大桥的行人数量,或者是一个预先配置的数据集,其中包含人的数量和利兹市议会提供的八个特定的高流量位置

根据您拥有的数据,您可能需要专注于您想要关注的内容,并将其转换为适当的日期时间。以下代码浓缩了您可能需要进行的一些争论。

以下是您可能决定用来组织数据的示例步骤:

1.缩*关注范围,将你的辩论功能只应用在这个领域。

2.创建一个新的数据框,仅过滤我们感兴趣点的距离。

3.绘制每*时的热图,并保存截取的截图。

def wrangle(X): X = X.copy()
    X = X.sample(<number to pass in>, replace=True) X['date_EST'] = pd.to_datetime(X['timestamp'], unit='s')
    X['date_EST'] = X['date_EST'].dt.tz_localize('UTC')\
                                 .dt.tz_convert('US/Eastern')
    X['date'] = X['date_EST'].dt.date
    X['hour']  = X['date_EST'].dt.hourreturn X

在我们的分析中,我们在目标位置周围每*时 14 x 14 英里的半径范围内采集了 100,000 个样本。

然后,我们使用 wrangle 函数处理我们的 2,400,000 个样本,以获得正确的日期时间格式。

由于过滤过程需要花费大量时间,我们将循环包装在 TQDM 中,以查看过程的进度条。

df_container = []
total_rows = 0
cols = ['timestamp', 'lat', 'lng']for i in tqdm(range(24)):
    i = str(i).zfill(2) for j in range(5):
        try:
            df = pd.read_csv(f'<file_to_read_in \
                         {<dynamic number to process,i>} \
                          rest_of_file_name
                         {<dynamic number to process, j>}>', \
                          delimiter = '\t', \
                          error_bad_lines=False, \ 
                          usecols = cols)
            #keeping track of the total amount of rows for reference
            rows, _ = df.shape
            total_rows += rows #selecting only data that is in the 
            #area of interest while reading the data in
            df = df[(df['lat'] > <latitute min>) & \
                    (df['lat'] < <latitute max>) & \
                    (df['lng'] < <longitude min>) & \
                    (df['lng'] > <longitude max>)] df = wrangle(df)
            df_container.append(df) except:
            continuedf_sample = pd.concat([df for df in df_container])

现在我们有了一个带有适当时间的数据帧,我们将使用 Geopy 创建一个新列,显示我们与感兴趣位置的距离,从而精确定位我们的位置。

lat = <your latitude>
lng = <your longitude>df_sample['distance_in_km'] = [distance.distance((lat, lng), (i,j)).km for i, j in tqdm(zip(df_sample['lat'], df_sample['lng']))]

然后,我们创建了一个新的数据帧,该数据帧仅隔离到感兴趣点的距离*于 0.5 公里或四分之一英里半径的点。

df_point_of_interest = df_sample[df_sample['distance_in_km'] < 0.5]

为了在 matplotlib 中创建直方图,我们将数据帧绘制成一组,如下所示:

df_point_of_interest.groupby('hour') \
                    .count() \
                    .reset_index() \
                    .plot.bar(x='hour', y='timestamp', \
                              color = 'orange', width=0.9, \
                              figsize=(10,6));

将数据过滤到一个块内的引脚点

我们隔离特定位置的方法是在绘图软件中绘制多边形,类似于连接点,然后将多边形形状转换为. shp 文件,如下所示。我们展示了一个宾州车站的例子:

为了仅过滤多边形内的移动数据点,我们将经度和纬度坐标地理编码到 geopandas 数据帧中,然后创建一个新列来保存我们的点是否在形状中的条件的结果。

最后,我们执行数据帧过滤,仅提取形状内的数据帧行。

gdf = geopandas.GeoDataFrame(df,
      geometry=geopandas.points_from_xy(df['lng'], df['lat']))gdf = gdf.assign(**{'within_shape': gdf.within(i) for i in shapefile_df['geometry']})new_df = gdf[gdf['within_shape'] == True]

以下是我们筛选的结果:

将我们的数据隔离在一个街区内

通过过滤我们的数据,我们可以安全地排除我们感兴趣范围之外的数据。

从左至右,布朗克斯区、曼哈顿熨斗区和宾州车站的一些受欢迎的购物目的地

使用热图可视化数据

为了生成上面的热图,我们使用了 follow,这是一个围绕 fleet . js 的包装器,可以制作漂亮的交互式地图,可以在任何浏览器中查看。

我们想出的生成热图的脚本的工作方式如下:我们介绍我们的脚本,每*时循环一次视觉图像,分为以下多个部分:

1.对于每个*时,创建一个仅针对特定*时过滤的数据帧

2.热图接收经度和纬度坐标的数组以及其他参数中的叶子图设置。

3.在一个 url 名称下保存叶子地图,然后用 Selenium,进入 url 并截图保存。

在 0 到 23 *时之间的 for 循环中,我们创建一个新的 dataframe,只过滤有问题的*时,然后生成一个图。

folder_path = <path to save our images to>for i in tqdm(range(24)):
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage') # open it, go to a website, and get results
    wd = webdriver.Chrome('chromedriver',options=options)
    path = os.getcwd() # filtering dataframe per hour
    hour = df_point_of_interest[df_point_of_interest['hour'] == i]

对于绘图,我们首先实例化一个地图对象,设置地图的中心,指定地图主题,然后指示缩放级别。下面的代码片段是上面 for 循环的延续。

 # instantiating the map
    point_of_interest_map = folium.Map(location=[lat, lng],  \
                                       tiles='Stamen Toner', \
                                       zoom_start=14)

对于热图对象,我们传入一个经度和纬度列表,然后指定热图的半径、最大缩放并添加到我们刚刚实例化的地图中。下面的代码片段是上面 for 循环的延续。

 # adding mobile points to map
    HeatMap(data= hour[['lat', 'lng']] \
            .groupby(['lat', 'lng']) \
            .count().reset_index() \
            .values.tolist(), \
            radius=10, \
            max_zoom=13) \
            .add_to(point_of_interest_map)

最后,我们为。html,然后在那个位置保存我们的叶子图。下面的代码片段是上面 for 循环的延续。

 mapfile = f'point_of_interest_hour_{i}' # saving map as default Folium html
    point_of_interest_map.save(f'{mapfile}.html') # creating pointer towards file location
    tmpurl=f'file://{path}/{mapfile}.html' # getting html map into memory and giving it time to load
    wd.get(tmpurl)
    time.sleep(random.randint(5,8)) # saving it as screenshot to covert from html to png
    wd.save_screenshot(f'{shared_folder_path}{mapfile}.png')
    wd.quit()

我们使用 Selenium web driver 访问网页并截图,保存,然后退出。下面的代码片段是上面 for 循环的延续。

 # opening the screenshot in memory
    im = Image.open(f'{shared_folder_path}{mapfile}.png') # getting the height
    width, height = im.size # crop from top left coordinate at (0,0)
    # crop to the bottom right at(with, height)
    im = im.crop((int(150), int(150), int(width), int(height)))

到目前为止,我们的输出看起来像下面的彩虹和黑白图像。

我们保存的叶子图(左)然后被注释(右)

因为我们希望我们的可视化效果更有感染力,所以我们首先在 Photoshop 这样的照片编辑程序中做了一些风格上的决定,然后我们自动化了这个过程,在 Python 中批量执行注释。

我们使用 Pillow,一个图像库来改变热图的色调和饱和度,从彩虹渐变到洋红色和青色。我们还将黑色和灰色的地图背景缓和为深蓝色,并应用了文本。我们计划在以后的文章中展示一个关于图像处理的教程。

上面这张图片也使用 Pillow 进行注释,是在 Datashader 中生成的,data shader 可以很好地处理大型数据集。Datashader 与 Dask、Holoviews、Bokeh 和 Geoviews 集成在一起,可以创建动态的、可缩放的地图,覆盖在地图瓦片上。这个默认的代码片段用于生成静态可视化,然后通过 Pillow 编译成. gif 文件:

agg = ds.Canvas().points(hour_df, 'lng', 'lat')
    utils.export_image(tf.shade(agg,cmap=bgyw),filename=img_file_name, background="black", fmt=".png")

我们和你一样,仍然被所有城市照亮的数字的力量所包围。随着纽约市在未来几周开始重新开放,我们希望你保持安全。

谢谢你的来访!

非常感谢你和我们一起学习。如果您想就此项目展开对话,请随时联系我们。

鸣谢:感谢 Jef Ntungila 实现了高效的辩论、统计分析、绘图和优化。

MonetDB 如何利用现代 CPU 性能

原文:https://towardsdatascience.com/how-monetdb-x100-exploits-modern-cpu-performance-9b3a395b5a2b?source=collection_archive---------31-----------------------

现代 CPU 经历了重大的发展。但是 MonetDB 如何利用这种发展来最大化其性能呢?

在过去的三十年里,计算机处理器有了显著的发展。这种发展不仅包括它所拥有的晶体管数量的增加,还包括架构的演变。因此,应用程序需要适应 CPU 的工作方式,以最大限度地发挥其潜力。与 CPU 本身一样古老,数据库系统一直是现代工业的支柱。但是数据库社区已经设法将 CPU 能力发挥到极限了吗?

克里斯蒂安·威迪格在 Unsplash 上拍摄的照片

尽管 CPU 得到了积极的发展,但现有的数据库系统无法利用这一优势,因为它们只能实现低指令/周期 (IPC)效率。他们主要使用一个火山查询执行模型,这是造成这种低效率的原因。volcano 模型使用一种称为“一次一个元组”的处理模型,它在一个 CPU 周期内执行一个元组。因此,它引入了解释开销,并通过执行循环流水线阻碍了 CPU 执行并行执行的能力。在 MySQL 数据库系统中的观察表明,实际计算只占总执行时间的 10%[2]。剩下的 90%是解释开销,比如创建和查找哈希表,获取 MySQL 数据的第 n 个字段,复制数据进行处理。

解决这些效率低下的问题

记住这些背景,现在让我们深入了解 MonetDB 如何处理这些低效问题。MonetDB 是一个列式数据库,它试图通过消除数据库系统中存在的开销并使用不同的记录处理模型来利用最大的 CPU 能力。一般来说,MonetDB 一次执行多个记录,这样既能实现循环流水线,又能减少太多的开销。

按列执行

MonetDB 引入了一种称为二进制关联表(BAT)的列式数据布局。单个 BAT 数组在单个数据库列中保存所有值。通过这样做,我们现在可以将操作符应用到这个 BAT 数组中,而不是单独应用到每个数据项。此外,在数据阵列上运行相同的操作,CPU 现在可以应用循环流水线。

我们在这篇文章中讨论了很多循环流水线。但是什么是循环流水线呢?请看下图。

图片来自:https://www . Xilinx . com/support/documentation/SW _ manuals/Xilinx 2015 _ 2/SD SOC _ doc/topics/calling-coding-guidelines/concept _ piping _ loop _ unrolling . html

在一个过于简单的定义中,我们可以看到一个 CPU 指令由三个阶段组成:读取、计算和写入(查看这个*基百科页面中关于 CPU 周期的详细解释)。正如我们所见,循环流水线使 CPU 能够开始执行下一次迭代,而无需等待上一次迭代完成。放入数据处理的上下文中,循环流水线将使 CPU 能够开始读取下一个数据项,同时仍然计算当前数据的结果。因此,整个环路将具有更低的延迟。

当我们使用 BAT 数组时,这种循环流水线是可能的,因为我们有一个数组的概念来循环。然而,如果我们一次计算一个元组,这是不可能的,因为在一个元组上循环是没有意义的!在这种情况下,执行将按顺序进行,其中一个元组需要等待前一个元组完成后才能执行。

MIL 代数

MonetDB 为其查询语言引入了 MIL (MonetDB 指令语言)代数。它可以是 RDBMS 方面的关系代数。然而,与关系代数相反,密耳代数没有自由度。在 MIL 代数中,操作员有固定的参数和数据布局来处理数据。MIL 上的操作员将把该操作员的功能映射到 BAT 中的整个数据项。

X100 发动机

到目前为止,看起来 MonetDB 实现已经解决了我们指出的所有问题。但是,我们需要注意,MonetDB 是通过执行全列具体化来执行查询的。这意味着它将首先尝试在 CPU 缓存中具体化输入。但是,随着正在处理的数据的大*不断增加,CPU 缓存将无法容纳这一完整的列具体化,而将使用主内存。这使得系统现在受到内存带宽的限制,因此它将无法保持它所获得的高 CPU 效率。

图片来自:https://semi engineering . com/enabling-higher-system-performance-with-NV DIMM-n/

为了解决这个问题,MonetDB 开发了一款名为 X100 的改进型引擎。它引入了一种*衡的方法,避免了一次一个元组的处理,但管理了物化,使其不会占用内存带宽。这是通过仅根据向量而不是整个列来实现的。向量是整个列项目的片段。应该设置向量的大*,使其适合 CPU 缓存。通过这样做,内存带宽限制将不会阻碍高 CPU 效率的实现。

技术性能分析

为了分析矢量化查询处理的性能优势,我们将看到在 MonetDB/X100 到 MonetDB/MIL 和 MySQL 上执行的 TPC-H 基准测试的实验结果。

图片来自:彼得·A·邦茨、马钦·祖科夫斯基和*尔斯·内斯。2005.MonetDB/X100:超级流水线查询执行。在 CIDR,第 5 卷。225–237.

从实验中我们可以得到的第一个观察结果是 MonetDB/X100 能够在每个元组很少的 CPU 周期内运行所有原语。例如,乘法原语每个元组只运行 2.2 个周期,而 MySQL 上每个元组运行 49 个周期。每个执行原语所需的周期越少,整体性能越快。

第二个观察是关于内存基准限制。由于 MonetDB/X100 仅体现为向量,因此将由图元处理的数据从 CPU 缓存中检索,而不是从主内存中检索。这使得 MonetDB/X100 能够实现 7.5GB/s 的带宽。另一方面,MonetDB/MIL 达到了仅 500MB/s 的内存带宽限制,因为图元需要从主内存中检索数据。作者还提到 MonetDB/X100 应该对缓存的数据进行操作,而列向量布局的实现并不意味着优化内存布局。

最后,作者指出了向量大*对整体性能的影响。向量的大*应该相对较*,以便可以放入缓存中。但是,如果我们把它设置得太*,我们将失去 CPU 并行性,并增加解释开销。在极端情况下,将向量大*设置为 1 将导致一次一个元组的操作。另一方面,作者还报告了当向量大*太大,即 CPU 缓存无法容纳时的性能下降。

结论

我们看到精心设计的数据库如何能够最大限度地发挥现代处理器的潜力,并比没有解决这个问题的数据库性能好得多。MonetDB 通过以一次一个向量的方式执行数据来利用循环流水线功能。不仅增加了 CPU 中的并行执行,而且通过根据向量而不是整列来执行具体化,避免了内存带宽瓶颈。

MonetDB 是一个长期的研究课题。如果你有兴趣了解更多关于 MonetDB 的知识,你可以在 google scholar 上查看他们的出版物。您也可以查看主页查看其当前状态。这也是一个开源项目,你也可以在其中做出贡献。你可以在Github 页面访问他们的镜像库。

参考文献:

[1]彼得·亚历山大·邦茨等人,2002 年。Monet:面向查询密集型应用的下一代 DBMS 内核。阿姆斯特丹大学[东道主]。

[2]彼得·邦茨、马尔钦·祖科夫斯基和*尔斯·内斯。2005.MonetDB/X100:超级流水线查询执行..Cidr,第 5 卷。225–237.

数据科学家挣多少钱?

原文:https://towardsdatascience.com/how-much-do-data-scientists-make-2f58132fe5cf?source=collection_archive---------20-----------------------

我在硅谷的五年数据科学生涯

来自 Unsplash 的图像

今天,我们来谈谈数据科学的薪水。

显然,这是一个很大的——通常是禁忌的——问题,可以问任何人,所以本着完全透明的精神,我将告诉你自从我毕业以来,我在所有数据科学职位上赚了多少钱。

首先,我们来讲一些基础知识。

你的薪酬将在很大程度上取决于你为之工作的公司,比如他们的规模,他们愿意给你多少资金,以及许多其他因素。这也取决于你-你的经历,你的职业发展,以及多少钱对你真正重要(取决于你申请的职位)。

关于我将要介绍的数字的背景,让我们来看看一些行业统计数据。如今,Glassdoor 列出的数据科学*均年薪为 112,000 美元。Indeed 的*均工资为 12 万美元,而 PayScale 的*均工资略低,为 9.5 万美元。

在天*的另一端, levels.fyi 的数据科学工资中位数为 15 万美元,旧金山湾区的工资中位数为 23.8 万美元。出于好奇和完全的怀疑,我试着提交了一份 40 万美元的假工资,他们还是接受了,所以谁知道呢?

请看这篇关于 2022 年数据科学家薪酬的深度分析!

大学毕业后的第一份数据科学薪水

2015 年大学毕业后,我有两份不同的工作邀请等着我。

第一份来自一家名为 Workday 的公司,他们向我提供了 95000 美元的基本工资和 4 年内 60000 美元的股票。就总薪酬而言,这相当于每年 11 万美元。他们需要填补的职位实际上是性能方面的软件工程师,这就是为什么我最终没有接受这份工作。

第二份工作邀请来自于 Inflection,他们正在寻找一名市场分析师,基本工资为 85,000 美元,外加 5000 美元的签约奖金。

那么,为什么我最终接受了一份比另一份少 25000 美元的工作呢?

嗯,当我大学毕业后在 Workday 面试时,他们实际上没有问我任何技术问题。采访很随意——我们谈笑风生,谈论的大多是我过去做过的项目。

最终,虽然我对这份工作真的很满意(大学毕业后赚六位数对我来说是疯狂的),但我认为营销分析师的角色对以后过渡到数据科学更有帮助,我也更兴奋地从我的老板那里学到了东西。

如果你对我如何获得大学毕业后的第一份数据科学工作*感兴趣,请查看我的新毕业生数据科学指南和我在 youtube 上的视频 l* 和一份没有经验的数据科学工作

第一数据科学家职位工资

来自 Unsplash 的图像

作为一名新毕业生,我在旧金山湾区一年挣大约 85000 美元,这绝对是一个生活非常昂贵的地方。我税后的实得工资和所有的东西大约是每月 4000 美元,所以,你可以想象,我没有太多的积蓄。

很快,我意识到这是我生存所需的最低量。作为一个没有见过那么多钱的职场新人,看到这些大数字在现实生活中变得少了很多可能会有点扭曲,但我认为这对一个新毕业生来说是一个好机会。

然而,在拐点工作了大约三到四个月后,我开始觉得这家公司并不真正适合我。我没有学到很多东西,我的老板在头两周就离开了,所以几个月后我决定离开去寻找其他机会。

在这一点上,我为没有在 Workday 担任那个职位而自责,但我最终在 Jobr 接受了一份新工作,这实际上是我找到这个职位的地方。他们向我提出了一个数据科学家的职位(特别是从事推荐算法的工作),最终,有人出价 8 万美元,并拥有 0.5%的股权,因此我的基本工资将减少 5000 美元。

Equity 的工作基于当时对公司的评估,在 1000 万美元左右。通过那次评估,Jobr 筹集了 200 万美元,所以我 0.5%的股权份额意味着我有权在四年内获得大约 5 万美元,而且这一价值还有可能增加。

在我的雇佣合同中,他们还加入了一项条款,如果他们提高了首轮融资,一旦首轮融资通过,我的基本工资将升至 10 万美元。

在这一点上,我有点觉得不接受这份工作是愚蠢的,因为没有人真正有兴趣雇用我。

创业收购:我赚了多少?

所以这就是运气发挥作用的地方。在我的工作岗位上工作了六个月后,Jobr 被 Monster 以 1250 万美元的价格收购,Monster 当时正在查看我公司的 Tinder-for-jobs 类应用程序。使用这个值,你会认为我中了头彩,我的股票份额在 62,500 美元左右。可惜没有。

如果你不熟悉收购,基本上当一家大公司收购一家*公司时,会有很多律师、经纪人、投资者和其他中间人参与其中。总的来说,你可以预期大约三分之一你原本应该得到的金额会被一群不同的人得到,即使它超出了公司提出的评估(就像在这个案例中一样)。

税前,我最终拿回家大约 40,000 美元,在 Jobr 工作的第一年大约 150,000 美元。

总而言之,我想这里的教训是,不断发展你的技能很重要,因为这是你被雇佣的原因。钱来得更晚(再加上一点点运气!),但它有助于你在当前的环境中首先为成功做好准备。

所以收购之后,earnout 也给了出去。基本上,收入目标是为某些指标设定的,如果你达到了这些指标,你最终可以从收购中获得更多。按照我合同上写的方式,我基本上可以在收购后每年再收到 4-5 万美元。

我们最终预测,我们将达到其中的 90%左右,所以第一年后,我的实得收入最终约为每年 15 万美元

2017 年,Jobr 的整个公司与母公司协商加薪,所以我的基本工资增加到了13 万美元,这样我每年的总薪酬为 17 万美元。

我在 Nextdoor 的最后一份数据科学家薪水

图片来自 Pixabay

2018 年,我大学毕业的第三年,最后又跳槽了。我在 Jobr 认识的所有人都已经离开了,包括我现在的联合创始人谢恩。工作文化已经改变,我真的想找到另一家真正适合并支持我需求的公司。

我知道,除非我去大公司面试,否则我的总薪酬可能会减少,但此时我的主要精力是找到一个我真正喜欢的地方。

我报名参加了招聘,在我设定了基本工资(15 万美元)的要求后,Nextdoor 最终找到了我。事后看来,既然我已经对谈判和面试有了更多的了解,我就不建议用录用了。一旦你把你的薪水设定在某个门槛,公司在和你谈判时就会用这个门槛,设定一个低于他们实际能分配给你的薪水期望值。

这样,最好在面试结束前不要期望薪水,但我仍然认为,如果你并不想去申请 X 个职位,那就去一个好地方找工作。

所以和 Nextdoor 在一起,我经历了整个过程(包括现场面试),所以我在和大家见面的时候对公司是有好感的。我的出价最终约为 145,000 美元,这比我在招聘信息中的预期要低。

对我来说,这是一个巨大的信号,表明他们的意图是从低价格开始,这样我们就可以谈判。最后,我谈妥了高达 155,000 美元,外加 20,000 美元的签约奖金,所以我第一年的总薪酬是 175,000 美元。我的报价也包括一些股权,但对于像 Nextdoor 这样的长期独角兽来说,这很难计算,因为你真的不知道他们什么时候会退出。

目前,我在 InterviewQuery,年薪肯定不到 17.5 万美元。如果我选择了另一份数据科学工作,根据我的职业发展来估计,我可能会获得大约 19 万美元的基本工资,如果是在脸书、谷歌或亚马逊等公司,可能会更多。

数据科学工资:技巧和窍门

如果你正准备进入谈判过程,或者如果你只是想打破数据科学的工资数字,这里有一些有用的规则,可能会改变你看待事情的方式。

永远不要拿自己和别人比较。

老实说,这只是一个总体上不公*的比较。试图将不同的数据科学薪水与其他拥有不同运气、经历和职业轨迹的人联系起来,会对你自己造成伤害。

确定自己的市场价值。

普遍的共识是,你的价值在于你可以被这个领域的任何人取代。因此,举例来说,如果你作为一名数据科学家从事商业智能分析,那么你基本上可以被一名薪水较低的商业智能分析师取代。

通过这种方式,你必须真正了解你的角色需要什么,以及你如何成长,是否包括成为一名经理、技术主管等。

弄清楚钱对你意味着什么

当我每天上下班的时候,我并不觉得我每*时能挣 10 万美元,或者 20 万美元,或者其他什么。

理解你的目标(尝试退休或经济独立,还是更专注于学习)非常重要,因为它最终决定了你可能会为哪种公司工作,并因此决定了工作环境和文化。

如果你对不同公司在数据科学领域工作的差异感到好奇,一定要看看我们博客上的 Start Up v. FAANG Companies 文章

有经验你会赚更多的钱

毫无疑问,这也肯定取决于你的面试,因为你需要有效地沟通你的经验能带来多少价值。

然而,我也见过很多这样的例子,人们拥有相似的技能,但是其中一个人年龄更大,经验更丰富,因此收入更高。目前,经验仍然是决定一个人应该挣多少钱的第一标准。

高薪不会让你留在数据科学领域

我知道,我知道-这听起来有点不现实,对吧?当然,钱能改变一切!

但老实说,除了最初能够为自己提供食物和住所的轻松,你内心的幸福并没有随着数字的变化而真正改变。你仍然每天都要去上班,你的日常生活很可能还是老样子。

不断变化的事情将围绕着你的位置,所以努力工作,最终,一定要享受你正在做的事情。

感谢阅读

  • 如果你有兴趣通过实践磨练你的数据科学技能,请查看 面试查询
  • 查看我的 Youtube 频道 获取更多数据科学面试指南、商业 vlog 帖子和解决问题的技巧&。
  • 如果你有兴趣阅读更多面试指南,可以看看这篇关于脸书和 LinkedIn 等科技公司的研究科学家职位的深度阅读。

原载于 2020 年 9 月 21 日 https://www.interviewquery.com*。***

汽车的品牌对其价格的影响有多大?

原文:https://towardsdatascience.com/how-much-does-a-cars-brand-affect-its-price-14b762d2324?source=collection_archive---------33-----------------------

作为一名即将从大学毕业的学生,我已经准备好开始#成人生活,其中一部分就是买一辆新车。当然,我很快意识到

我没有钱,而且

(b) 新加坡的汽车贵得令人望而却步。

因此,我做了任何处于我这种情况的人都会做的事情——我决定分析新加坡的汽车价格,而不是真的买车(注意:这不会带来同样的满足感)

原则问题

作为我的第一个独立数据分析项目之一,在开始这个项目时,我只有两个简单的问题:

1。品牌对汽车价格的影响有多大?我爸爸总是谈论“宝马”的溢价,我想知道这是不是真的。一辆“豪华车”是否人为抬高了它的价值..?多少钱?

2。给定某些参数,我们能多准确地预测汽车的价格?这个项目的第二个潜在部分可能涉及建立一个简单的网络应用程序,给出汽车的“公允价值”,给定某些参数,因此建立一个模型来预测价格是我想要实现的东西。

TL;博士;医生

我意识到,在这个节骨眼上,你们中的一些人可能不想浏览整篇文章,所以我就把我的结论放在这里(如果你想知道技术细节,可以向下滚动,看看漂亮的图表)

1。制造溢价效应我们缩*了汽车的规格,并比较了“正常规格”的溢价(宝马等。)采用非高端品牌(丰田等)。)使得。品牌在最高速度和油耗与价格的相关性上有最显著的交互作用。这是有道理的,高端品牌的购买者可能并不真正关心燃料成本,仍然会购买高油耗的汽车。

2。预测模型该模型的预测\(R^{2}\)值为 0.837,与调整后的\(R^{2}\)值 0.857 相差不远。这意味着该模型能够用给定的变量预测大约 84%的汽车价格。剩余的异常值主要是超级跑车(如法拉利 SF90),其价格很可能由于与之相关的显著溢价而被夸大(超出了“正常”的豪华品牌,如宝马)

预想的步骤

在决定着手这个项目时,我认为有三个关键步骤要做。这些步骤恰好与一个典型的 数据分析 (wow buzzwords)项目相匹配

  1. 数据收集
  2. 数据清理
  3. 数据分析

带着这些步骤,我走向了伟大的未知世界!

第一步:数据收集(又名:完成了吗?)

任何数据项目的第一步总是要有要分析的数据。我意识到我需要一个好的数据源,为我提供所有我需要的关于汽车的基本信息。我父亲(我汽车知识的主要来源)经常谈到神秘的 SGCarMart。

前往该网站时,我惊喜地发现,它包含了一个重要汽车信息的大型存储库。价格、车型、特征、引擎大*——SGCarMart 拥有一切!现在唯一的问题是把数据转换成一个好的,可操作的。csv 文件。

网页信息+a . CSV =网页报废

在我的工作/研究经历中,以及在我参加的在线课程中,数据总是一点点地来到我面前。csv 文件,所以我第一次面临需要获得自己的信息。

最初,我决定走与 rvest 一起废弃的通常路线:

然而,我最终决定使用 Web Scraper ,因为它附带了一个非常方便的选择器图,允许我准确地规划出我想要如何浏览页面和收集数据。

选择器图形向您显示精确的报废图——方便!!

选择 2000 毫秒的延迟(这样我就不会被 SGCarmart 阻止了— 手指交叉),它走了。我总共运行了四次 scrapper,挑选出同一品牌/型号的不同变体(因为 SGCarmart 以不同的风格组织了它们的价格/规格/功能标签)。大约 4 个*时后,我完成了,我的房间是废弃的数据凌乱的

urgh hhh 太乱了

第二步:数据清理(又名:我宁愿清理我的房间,对不起妈妈)

据福布斯报道,数据科学家花 60%的时间清理数据——我知道我要吃苦头了。

第一步是将单独的报废文件合并在一起,并删除没有价格的汽车(网站上的一些汽车尚未上市,因此没有价格)。

接下来,我需要从数据集中移除所有的随机伪像。出于某种原因,SGCarmart 在一些图形中包含了随机的“β”字符,因此这些字符必须被删除。

基本的清理工作完成后,是时候进行下一部分的数据清理了…虚拟编码。我决定根据变量中唯一观察值的数量对一些类别进行编码,而不对其他类别进行编码。假设我计划生成一个线性回归模型,lm函数将能够处理factors,因此我可以放心地将它们作为因子。

这里需要注意的是——我对柱面类型的编码肯定可以做得更有效率,但是,我只是在打出代码的中途才意识到有这么多不同类型的柱面,于是决定继续完成剩下的部分。我知道努力不够——下次我会做得更好。

3.数据分析(又名:这实际上是所有人关心的)

令人惊讶的是,数据清理并没有花费我预期的那么长时间。解决了这个问题,现在是项目中最性感的部分——分析数据!我做了一个快速的dfSummary,只是为了对数据有一个大概的了解。(我喜欢使用 dfSummary 只是为了对数据有个粗略的感觉)

dfSummary来看,我们正在检查的各种发动机参数和特性存在很大的差异。此外,还有一些栏目缺少数值的问题。由于“NAs”不是很多,我决定从zoo包中执行一个NA.approx()来填充缺失的值

问题 1:品牌/品牌如何影响车价?

第一个问题是,品牌的“地位”对汽车的最终价格有多重要,我必须想出汽车的分类。在咨询了众多来源(也就是一些谷歌和 Reddit)后,我决定将它们分成两大类:标准版和高级版。我主要感兴趣的是知道一个著名品牌的汽车是否有溢价。如果是,多少钱。(我还为在新加坡不受欢迎的汽车创建了一个“其他”类别,因此这些汽车并没有特别的恶名)

标准

福特、雪铁龙、本田、现代、吉普、起亚、马自达、三菱、斯巴鲁、铃木、丰田、大众、日产

溢价

奥迪、法拉利、捷豹、兰博基*、雷克萨斯、玛莎拉蒂、迈凯轮、奔驰、保时捷、宝马、沃尔沃

在研究“状态”的相互作用之前,我首先想了解汽车价格和我打算在线性回归模型中使用的各种特性之间的相关性。

只看最上面一行(当前价格),看起来大多数功能都与价格有一定的正相关性(除了油耗,除非你喜欢你的车耗油,否则油耗与价格有明显的负相关性)。这看起来很有希望,下一步是确定这些相关性的相互作用。

为此,我决定用一个scatterplotMatrix。我过滤掉了标有“其他”的汽车制造商,只比较受欢迎的“标准”和“高级”汽车制造商。

(再次查看当前价格的最上面一行~其他规格)不出所料,在所有不同的功能中都观察到了交互作用(这是通过非*行回归线观察到的。无效模型将导致*行回归线)。

“但是等等,”你可能会假设说,“当然会有交互!高档汽车制造商自然会生产更多的特殊规格汽车,使回归线交叉!”你是对的。意识到这一点,我因此再次运行的阴谋,但这一次限制它的范围,使 V12 超级跑车等的影响。会被移除。我将发动机规格收紧到“正常”范围,查看速度为150–260,发动机 CCs 为1000–3500,马力为200–500的汽车。我还收紧了油箱和消耗变量,以标准化的措施。

再次查看该图,似乎发动机 CC 和最高速度回归线大致*行。我猜,如果你只看速度或 CC,制造溢价可能并不那么重要。(附带说明:由于道路税是根据 CC 计算的,因此 CC 在新加坡环境中特别敏感。这可能因此解释了 make 具有的非效应)。

纵观其他变量,我发现一个特别有趣的是燃料消耗。“标准”(蓝色)回归线下降得相当快(表明普通人可能不太喜欢高油耗的汽车)。相比之下,“优质”(粉色)的线条几乎保持笔直。我猜如果你花 200+k 买一辆超跑,燃料价格/消耗真的不重要。

结论: 老实说,剧情并不是最确凿的。最初很清楚,品牌确实会影响变量之间的相关性。但是,当我们做一个“苹果对苹果”的比较(强制比较低规格的高级车和类似规格的标准车)时,在某些因素中,相互作用的影响明显减少了。然而,我敢断定在一定程度上造成了问题。但是高档品牌也倾向于生产更多规格更好的高档汽车

问题 2:建立评估“公允价值”的模型

上述图表显示,汽车品牌对价格和个人特征之间的相关性有影响。然而,汽车品牌对价格和所有特征之间的相关性有什么影响呢?

为了找到答案,我建立了一个多元线性回归模型(这也允许我以后创建一个“公允价值”模型)

创建了模型之后,我用测试集对其进行了测试,以找到 R *方值。

0.857 的 R *方值意味着约 86%的价格变化可以用模型来解释。用简单的英语来说(但老实说不是最准确的理解方式,这意味着我们放入模型的各种特征解释了为什么价格是现在的价格。

不过,这个值高得令人怀疑,我怀疑可能有一些过度拟合的情况。回归模型通常的经验法则是每个变量有 10-15 个观察值。我的数据(大约 545 个观察值和 8 个变量)很好地符合这一点,但仍然有我想挠的痒痒。

测试过度拟合的一个好方法是使用预测的 R *方值,并将该值与实际的 R *方值进行比较。如果这些值相差很大,可能会出现过度拟合。我是通过托马斯·霍珀的一篇有用的帖子做到这一点的。更多关于使用预测 R *方的理论,请参考那个博客。

令人高兴的是,预测的 R *方值实际上与实际的 R *方值相差不远。我对过度合身的担心被适当地消除了。回到 make premium 的问题,然后我为模型创建了一个表来查看特定的交互。

查看多变量回归模型的输出(该模型考虑了所有特征和价格之间的关系),似乎品牌对最高速度和燃料消耗的影响最显著。

因此,我们可以得出结论,在多元回归模型中,make 继续对价格和其他变量之间的相关性产生影响,对最高速度和油耗的影响最为显著。

问题 2b:残差正态性

我还想探索我的模型的残差的正态性,这很容易通过 Q-Q 图来完成:

该图不遵循正态分布,在两个尾部都有异常值。然而,尽管正态性假设很重要,篇论文认为,鉴于中心极限定理,正态性假设对于大型数据集(通常称为> 200,但当然取决于上下文)来说不太重要。对于我的数据集> 200,我对残差缺乏正态性感到更舒服。

当然,我仍然想探索异常值,并将残差映射回原始数据集,以便找出这些异常值是什么。

正如预期的那样,大多数异常值是价格令人难以置信的高性能汽车。这些跑车的价格可能没有被模型捕捉到的原因可能可以归因于买家情绪的一个(本质上不可测量的)特征。前两名是法拉利。法拉利的价格标签很可能不仅仅是它的发动机排量和油耗,还很可能受到你的钱包看起来有多鼓和你看起来有多酷的影响。

这个*研究的结论被总结在 tl 中;博士:但我会在这里重复一遍,以防你第一次没听到!

1。制造溢价效应我们缩*了汽车的规格,并比较了“正常规格”的溢价(宝马等。)采用非高端品牌(丰田等)。)使得。品牌在最高速度和油耗与价格的相关性上有最显著的交互作用。这是有道理的,高端品牌的购买者可能并不真正关心燃料成本,仍然会购买高油耗的汽车。

2。预测模型该模型的预测\(R^{2}\)值为 0.837,与调整后的\(R^{2}\)值 0.857 相差不远。这意味着该模型能够用给定的变量预测大约 84%的汽车价格。剩余的异常值主要是超级跑车(如法拉利 SF90),其价格很可能由于与之相关的显著溢价而被夸大(超出了“正常”的豪华品牌,如宝马)

个人结论:对于那些喜欢从头到尾阅读的人

1。收集数据。后悔没有早点学习 Regex。我是在使用 Webscraper 收集数据后才学习 Regex 的,我可能已经使用 Regex 和 Webscraper 在数据收集期间进行了预清理,这可能会加快数据清理过程。

2。可视化多元模型的困难。我花了最多的时间试图找出如何最好地呈现多元回归模型。最后,我放弃了,继续展示一份jtools的汇总表。我相信有更好的方法来做到这一点,并会在下一个项目中努力改进。

3。常态假设。在提出这个模型并绘制 Q-Q 图之后,我最初吓坏了,因为我意识到这是超级不正常的。这促使我去阅读更多关于正态性的东西,我想意识到正态性很重要,但对模型的准确性来说并不关键,这是令人欣慰的。在中,统计专家的用词为“对于中到大样本量,残差的非正态性不应该对通常的推断过程产生不利影响,这是中心极限定理的结果”

感谢阅读~希望有助于你以后买新车时更好的决策!请注意(希望如此)第 2 部分,我将尝试使用 SHINY 创建一个 web 应用程序,帮助您使用我们创建的模型找到您想要购买的汽车的合理价格!

最初发表于https://zachlim98.github.io/me/2020-10/sgcarmart1

图像积分快多少?

原文:https://towardsdatascience.com/how-much-faster-is-image-integral-90ba0008497a?source=collection_archive---------32-----------------------

使用 Google Colab 比较暴力和图像积分

在我寻求学习更多关于计算机视觉和 python 的过程中,我一直在阅读 Viola-James 物体检测框架,这里的论文对此做了最好的总结

在这篇文章中,他们描述了图像积分的概念,这是一种描述图像的数组的总面积表,他们的观点是——暴力计算积分比提前计算图像积分并从数组中取出数字要慢得多。这种计算经常在计算机视觉应用中使用。

我很好奇——快了多少?这篇论文发表于 2001 年,我们现在的处理器肯定要快得多(20 年后),这不会有什么不同吧?嗯,我是非常错误的

跟着一起: Google Colab 笔记本

图像积分

图像转换成图像积分。来源:Stackoverflow.com

使用左上角作为索引 0,0 (x=0,y=0),水*和垂直计算积分。

在积分图像(右侧)中,索引(x=1,y=0)是 5,它是原始图像(so,4+1=5)中的(0,0)和(1,0)中包含的值的总和

同样,integral image index (2,2) = 9,也就是左上 2x2 块之和:4+4+1+0 = 9。

我举了几个更简单的例子:

来源:图片由作者提供。灵感来自vinsol.com

图像设置

让我们浏览一下图像的设置、上传和转换等。首先,导入您的库:

设置您的库

我要用这张哈巴狗的照片:

资料来源:Unsplash.com

很好,现在图像已经上传了,接下来要做一些事情:将它转换成黑白图像,然后转换成一个 numpy 数组:

黑白转换,然后转换成 numpy 数组

我们将使用 open cv (cv2)中的图像积分函数。它用零填充积分,所以我们将删除下面第 2 行中的那些。

从第 4 行开始,我们将定义一个强力函数进行比较,它所做的只是对行和列求和:

使用 OpenCV 并定义强力函数

多次 CPU 迭代

我将进行三种类型的迭代,并记录执行每种计算所需的时间。我们将每个迭代运行 500 次,以尽量减少可变性。

在对图像做深度学习的时候,500 次大概是一个很低的数字;图像计算大概是几百万到几十亿的量级。

我们还将选择上图中的位置(1000,1000)进行计算。

迭代 1——强力推进图像积分

这是“控制”时间:

迭代 2-重复图像积分计算

这里,我们将在每次重复时重复 cv.integral,而不是只计算一次:

结果呢?121.8x!即使我们每次重复重新计算积分。

Image Integral is: 121.8 times faster

迭代 3-使用预先计算的图像积分

这类似于对一幅图像计算一次积分,然后对同一幅图像进行数百次计算。

结果= 33073.65x. 比三十三个 快一千个倍。

Image Integral is: 33073.65 times faster

GPU 计算

当然,所有深度学习的学生都是 GPU 的忠实粉丝,但在这种情况下,它不会成功。

有 GPU 开销,如 CUDA 初始化、内核调用、内存分配,使这个过程慢得多。重复做 500 次非常慢,我不得不减少到 50 次,这样我就不会永远无所事事。

结果?CPU 图像积分计算一次(上面的迭代 3)几乎比 GPU 快 37,000 倍。

GPU 计算实际上比所有 CPU 迭代都要慢。

如果你错过了上面的,这里是 Colab 笔记本

参考

[1] Viola-Jones 对象检测框架,*基百科,2020 年 10 月访问

[2] OpenCV-Python ,2020 年 10 月访问

[3] CuPy ,2020 年 10 月访问

你的基因数据值多少钱?

原文:https://towardsdatascience.com/how-much-is-your-genetic-data-worth-3bb7a8b4ae5c?source=collection_archive---------28-----------------------

50%的美国公民表示,95 美元足以让他们交出自己的基因秘密

图片来自皮克斯拜

像脸书和谷歌这样的科技巨头目前正从我们的数据中获得天文数字的利润。个人在线信息的价值在 1 美元到 100 美元之间,截至上个月,脸书拥有 24 亿用户。这只是基于你在网上浏览和互动的内容。想象一下,一家公司可以用你的整个基因组,甚至只是部分基因组做些什么。从与医疗保险公司分享到创造个性化的药物,可能性是无穷无尽的。

随着技术的进步,基因组测序的成本持续下降,我们对基因组的看法将会改变。目前,通过 Veritas 对你的整个基因组进行测序需要 1999 美元,然而作为一种宣传噱头,以显示未来几年成本将降低多少,他们在 2018 年的有限时间内提供了 199 美元的服务。随着获取基因数据越来越容易,你的基因组将不再是健康或疾病的指标,而是被视为你的财产——一种你可以选择分享或保留的商品。

如今,像 23andMe 这样的公司通过向客户收取费用来发现更多关于他们基因组的信息。将来,随着公众开始意识到他们基因数据的真正价值,这种情况可能会逆转。那么,你的基因组值多少钱?上周发表在《PLOS 综合》上的一项研究报告了最*的一项调查结果,发现 50%的参与者愿意以*均 95 美元的价格出售他们的基因数据。

基因组数据监管调查(GDGS) 基于美国不同地区的 2,020 名参与者。他们首先观看了一段信息丰富的视频,该视频提供了关于基因组数据库的事实信息,例如基因分型的当前市场成本和隐私风险。看完视频后,参与者被问及他们期望从一家大公司得到什么来交换他们的基因数据。

  • 11.7%的人乐于免费分享他们的基因组
  • 37.8%的人不愿意放弃他们的数据,无论多少
  • 50.5%的人愿意有偿分享他们的数据

想要出售数据的参与者随后提供他们乐意接受的费用,*均价格约为 130 美元。鉴于这大约是消费者基因分型的当前市场价格,这并不奇怪。然而,他们随后被问及愿意为个性化的调查结果报告支付多少钱。*均 35 美元使净支出下降到95 美元

调查还发现,在“卖家”中,购买他们数据的公司类型并不重要。在考虑的五个类别(技术、政府、医院、制药、大学)中,销售意愿没有显著差异。

交易破坏者是数据将如何被使用和监管。

在向参与者提出的各种治理政策中,根据请求删除数据的能力是最重要的因素,72.2%的人表示这将增加他们的参与意愿。紧随其后的是保证数据不会被出售或与其他组织共享(69.8%),以及保证公司会为数据的每次特定使用请求许可(67.9%)。

GDGS 首次调查公众对大公司使用基因数据的看法,这与之前基于学术机构使用此类数据的研究形成了鲜明对比。这些过去的研究都发现超过 50%的人愿意免费分享他们的数据,2015 年的一项调查甚至发现一个机构关于数据使用和分享的政策并没有影响参与意愿。

新的发现表明,当涉及到我们自己的基因数据时,公众舆论正倾向于更严格的管理政策。这可能是因为随着这个话题越来越受欢迎,被媒体和新闻机构广泛报道,普通人对这个话题越来越了解。

23andMe 正试图站在公众一边,对他们如何使用数据非常透明,并在你注册时提供选择“退出”他们的研究项目的选项。然而,他们还通过与葛兰素史克(GlaxoSmithKline)和 T2(America)阿米尔(Amirall)等公司联手,在数百万美元的交易中引领个性化医学研究。随着从我们的基因数据中获利的潜力进一步增长,科技巨头想要参与这一行动将变得不可避免,用不了多久,任何人都可以通过提供泄露一切的唾液样本获得报酬。

大型科技公司多年来一直在我们不知情的情况下利用我们的数据,直到最*才被迫采用更透明的数据共享模式。这项研究表明,令人欣慰的是,随着人们越来越意识到他们对自己基因组的权利,遗传数据不太可能出现同样的情况。

你的数据有多少价值?

原文:https://towardsdatascience.com/how-much-juice-is-there-in-your-data-d3e76393ca9d?source=collection_archive---------51-----------------------

应用于 Kaggle 的信息论答案,带代码

作者图片

97 %。根据 Gartner 的数据,这是组织未使用的数据的百分比,构成了所谓的“黑暗数据”。

数据已经取代石油成为世界上最有价值的资源,但几乎所有的数据仍未被组织使用。Gartner 估计,87%的组织“商业智能和分析成熟度较低”。

对这一悖论的一种可能解释是,并非所有数据都是生而*等的。从一个组织到另一个组织,以及在同一个组织内从一个项目到另一个项目,数据的价值可能有很大的不同。

为了在商业智能和分析方面进行必要的投资,组织应该能够准确地预测这样做的业务影响,并且这样的未来投资应该能够产生足够高的 ROI。

如果没有勘探地球物理学的机器学习等价物,数据就不可能成为新的石油

假设数据总是有价值的,并试图通过试错法提取这种价值作为人工智能项目的一部分,无论是由 AutoML *台驱动,充其量都是非常浪费的,在最坏的情况下会产生负 ROI。

根据石油类比,这就相当于假设无论在哪里看都有石油在地下,并且驱动从地下提取的石油量的唯一因素是使用的提取技术

多年来,地球物理学和经济学交叉的整个研究领域,即勘探地球物理学,一直致力于降低石油生产中的商业风险。勘探地球物理学依靠归纳推理(与演绎推理相反)来检测给定位置有价值地质矿床的存在并估计其数量,而不会产生建设开采场地的前期成本和风险。

同样,为了降低投资人工智能项目的商业风险,在进行任何预测建模之前并独立于预测建模,开发量化数据价值的归纳推理方法至关重要,这一阶段我们称为预学习

评估数据集的演绎方法包括首先分配资源以使用数据集,然后监控一段时间的业务影响,而归纳方法包括使用数学推理从感兴趣的数据集推断任何预测模型可以实现的最高性能,成本低廉,且无需训练任何预测模型。

在本文中,我们总结了使 能够预学习 的理论基础,并且我们说明了如何使用开源的 kxy python 包来量化各种数据集中的汁液。

果汁是从什么开始的?

数据中的汁液指的是数据中对解决手头特定问题有用的信息量。

(左)Unsplash 上 Rinck Content Studio 的照片|(右)Instagram 用户@skwoodlekids 的插画

就像桔子汁(或地下的油)独立存在一样,无论是否被提取,也无论如何被提取,重要的是要认识到每个数据集在概念上都可以被认为是一个(可能是空的)部分,可以用来解决手头的问题,以及无用的剩余物。

在这方面,有两点值得强调。首先,什么是有用的(resp。没用)是问题特定的。数据集对解决特定问题无用的部分可能对解决另一个问题有用。

其次,数据集中对解决给定问题有用的东西并不依赖于解决问题的特定方法。同样,给定橙子中包含的果汁总量是可以从橙子中提取的最大液体量,不管它是如何压榨的,数据集中的果汁总量是可以从数据集提取的最大效用量,以解决特定问题,不管使用什么机器学习模型来解决问题。

为了奠定预学习的基础,我们需要正式定义“问题”和“有用”的含义。

我们关心的问题是分类和回归问题,对输入或输出的类型没有限制。具体来说,我们考虑使用输入向量×输入向量 来预测业务结果 y 。选择 y 是我们有兴趣解决的业务问题的固有属性,而输入 x 代表我们考虑用来解决问题的数据集。

像往常一样,我们通过将它们建模为随机变量来表示我们对 yx 的值的不确定性。说我们的数据集对于解决感兴趣的问题是有用的,相当于说输入 x 是关于标签/输出 y 的信息。

幸运的是,信息量和关联的概念被信息论完全形式化了。你会在这里找到一本关于信息论的初级读本。出于本文的目的,如果我们将随机变量的熵表示为 h(z) 连续变量的熵表示为微分,分类变量的熵表示为香农,就足以回忆起关于xy信息量的规范度量是它们的 互信息, 定义为

互信息的一些关键性质

互信息I(y;x)* 明确定义了输出是分类的还是连续的,以及输入是连续的、分类的还是两者的组合。关于为什么会出现这种情况的一些背景阅读,请查看本书的和其中的参考文献。*

它总是非负的,当且仅当 yx 是统计独立的(即 yx 之间没有任何关系)。

此外,互信息通过无损特征变换是不变的。的确,如果 fg 是两个一一对应的映射,那么

一个更一般的结果,被称为数据处理不等式,陈述了应用于 x 的变换只能减少其与 y 的互信息。具体来说,

并且当 f 或者是一对一映射,或者 yx 是统计独立给定的 f(x) 时,等式成立

这意味着包含在 x 中的关于 y 的所有信息都完全反映在 f(x) 中,或者换句话说,转换 f 保留了所有果汁,尽管有所损失。

因此,当互信息被用作量化数据集中汁液量的代理时,有效的特征工程既不减少也不增加汁液量,这是相当直观的。特征工程只是将输入和/或输出转换成一种表示,使训练特定的机器学习模型变得更容易。

从互信息到最大可实现的性能

虽然它反映了数据集中果汁量的本质,但通常以比特或 NAT 表示的互信息值很难与业务分析师或决策者交流。

幸运的是,它可以用来计算使用 x 预测y 时所能达到的最高性能,对于各种性能指标(R、RMSE、分类精度、每样本对数似然等。),进而可以转化为业务成果。我们在下面提供了一个简短的总结,但是你可以在这里找到更多的。**

我们考虑一个具有预测概率的预测模型 M

其中 f(x) 是模型对与输入 x 相关联的输出的预测。当 y 为分类时,该模型为分类器,当 y 为连续时,该模型为回归模型。

最大可实现 R

在加法回归模型中

R 的总体版本定义为

在我们的模型下,上面公式中的比率代表了不能用输入来解释的输出方差的分数。

虽然方差是高斯分布不确定性的良好度量,但与熵不同,它是其他分布不确定性的弱度量。

考虑到(在 nats 中)(自然)****标准差的对数具有相同的单位/标度,我们将 R 概括如下:****

注意,当 (y,f(x)) 为联合高斯(如高斯过程回归,包括带有高斯加性噪声的线性回归)时,上述信息调整后的 R 与原始 R 相同。

更一般地,这种信息调整的 R 适用于回归和分类,具有连续输入、分类输入或两者的组合。

直接应用数据处理不等式给出了任何模型预测所能达到的最大 R:******

重要的是要强调这个最优 R 不仅仅是一个上限;通过任何预测分布为真(数据生成)条件分布 p(y|x) 的模型来实现。

最*可实现 RMSE

上述模型的均方根误差的总体版本为

同样,我们可以把它的信息调整概括定义为

数据处理不等式的直接应用给出了最*的 RMSE 任何模型使用x预测都能达到:******

最大可达真实对数似然

类似地,我们模型的每次观察的样本对数似然性可以定义为

其人口当量,我们称之为每个观测值的真实对数似然,即

满足不等式

这个不等式源于吉布斯不等式和数据处理不等式。更多详情见此处

请注意,上述不等式适用于回归和分类问题,并且上限是通过使用真条件【p(y | x)】作为其预测分布的模型来实现的。**

术语 -h(y) 表示在没有任何数据的情况下可以实现的每个观测的最佳真实对数似然,并且可以被视为天真的对数似然基准,而互信息术语I(y;x)** 代表可归因于我们数据的提升。****

可达到的最大分类精度

在输出 y 可以取高达 q 的不同值的分类问题中,也可以通过使用 x 来预测 y. 的模型来表达可以实现的最高分类精度

让我们考虑一下功能

对于给定的熵值 h ,通过预测采用 q 不同值的任何离散分布的结果可以实现的最佳精度,并且具有熵值 h 由下式给出

其中函数

是的反函数

并且很容易进行数值评估。你可以在这里找到更多细节

下图为各种q 提供了上述功能的说明。

图 1:预测具有 q 个可能结果的离散分布的结果时可达到的精度。

更一般地,使用预测分类输出 yq 不同值的分类模型 可以达到的精度满足不等式:**

熵项 h(y) 反映了由总是预测最频繁结果组成的简单策略的准确性,即

鉴于互信息项I(y;x)******

总而言之,在分类和回归问题中,几乎任何基于群体的性能度量所能达到的最高值都可以表示为真实数据生成分布I(y;x)*** 和输出的可变性的度量(如其熵【h(y)、方差或标准差))当天真(无输入)预测策略不具有无效性能时。*****

无模型互信息估计

最后,我们可以解决房间里的大象。显然,这都归结为估计互信息I(y;x)* 在真实数据下生成分布。然而,我们并不知道真正的联合分布【y,x】。如果我们知道它,我们就能获得最好的预测模型——具有预测分布的模型——真条件 p(y|x) !*****

幸运的是,我们不需要知道或学习真正的联合分布【y,x】;这就是我们前面提到的归纳推理方法发挥作用的地方。****

我们采用的归纳方法包括测量足够宽范围的数据属性,间接揭示其中的结构/模式,并推断与观察到的属性一致的交互信息,而不做任何额外的任意假设。我们凭经验观察的属性越灵活,我们在数据中捕获的结构就越多,我们的估计就越接*真实的互信息。

为了有效地做到这一点,我们依靠一些技巧。

****招数一:在 copula-uniform 对偶空间中工作。

首先,我们回忆一下,x 之间的互信息是一对一映射不变的,特别地,当 yx 为序数时, yx 之间的互信息等于

我们不是直接估计 yx 之间的互信息,而是估计它们的 copula-uniform 对偶表示之间的互信息;我们称之为在 copula-uniform 对偶空间中工作的

这允许我们完全绕过边际分布,并以一种单位/比例/表示自由的方式进行推断——在对偶空间中,所有边际分布在[0,1]上都是一致的!

技巧二:通过成对 Spearman 等级相关性揭示模式。

我们通过估计原始空间中的所有成对 Spearman 等级相关性来揭示我们的数据中的结构,为两个序数标量 xy 定义如下

它衡量两个变量单调相关的倾向。它的人口版本仅仅是 copula 的函数——统一的对偶表示法vxy 并读作******

换句话说,使用 Spearman 的秩相关,我们可以在对偶空间中工作,同时有效地估计原始空间中感兴趣的属性。

如果没有这个技巧,我们将需要估计边际 CDF,并明确地将概率积分变换应用于输入,以便能够在对偶空间中工作,这将违背第一个技巧的目的。

毕竟,假设两个变量之间的互信息不依赖于它们的边际分布,那么不得不估计边际分布来计算它将是一种耻辱。

招数三:扩大输入空间捕捉非单调模式。

对于回归问题,成对 Spearman 秩相关完全捕获“输出随着特定输入减少/增加”类型的模式,对于分类问题,“我们可以根据特定输入取大值还是*值来判断编码输出的一位是 0 还是 1”。

为了捕捉这些单调关联类型之外的模式,我们需要求助于另一个技巧。我们注意到,对于任何不是内射的函数 f ,我们有

由此可见,与其估计I(y;x)* ,我们可以估计I(y;x,f(x)) 对于任意内射函数 f 。*****

yx 之间的成对 Spearman 秩相关性揭示了 yxf 之间的单调关系,因此可以选择 yf(x) 之间的成对 Spearman 相关性

f 的一个很好的例子就是函数

其中 m 可以选择为样本均值、中值或众数。

的确,如果y =x对于某个均值为零且偏斜为零的随机变量x,那么y 与【x,* 之间的 Spearman 秩相关关系可以通过对称性发现为不能揭示其中的结构另一方面,【y】【x】(同 m=0 ),也就是 1 ,更能体现出的信息量有多大***********

选择 f 捕捉“当输入偏离标准值时,输出趋于减少/增加”类型的模式。使用相同的技巧可以捕获更多类型的模式,包括周期性/季节性等。

诀窍四:用最大熵原理把所有东西放在一起,以此来避免武断的假设。

综上,我们定义 z=(x,f(x)) ,我们估计向量 (y,z)的 Spearman 秩自相关矩阵即 S(y,z)。

然后,我们使用与通过斯皮尔曼秩自相关矩阵【S(y,z)】、* 观察到的模式相匹配的所有 copula 密度中具有最高熵的 copula 密度作为 (y,z) 的 copula 统一表示的密度,即,除了通过 S(y,z) 观察到的模式之外,对于每个模式最不确定。*****

假设 (y,z)d *的,得到的变分优化问题为:

然后,我们使用学习的联合 pdf 来估计所需的互信息,如

理解最大熵变分问题

在没有 Spearman 秩相关约束的情况下,上述最大熵问题的解是标准均匀分布的 pdf,对应于假设yx统计独立,且具有 0 互信息。这很直观,因为我们没有理由相信 x 是关于 y 的信息,直到我们收集到经验证据。******

当我们观察 S(y,z) 时,变分最大熵问题的新解偏离均匀分布刚好足以反映 S(y,z) 所捕捉到的模式。因此,不应该期望我们的方法过高估计真实的互信息I(y;x)* 。*****

此外,只要 S(y,z) 足够有表现力,我们可以通过选择函数 f 来控制,所有类型的模式都将反映在【S(y,z)* 中,并且我们估计的互信息不应被期望低估真实的互信息I(y;x) 。*****

应用于正在进行的 Kaggle 竞赛

我们构建了 KxY *台,以及附带的开源 python 包,通过专注于高 ROI 项目和实验,帮助各种规模的组织削减其人工智能项目的风险和成本。特别令人感兴趣的是本文中描述的方法的实现,以量化数据中的果汁量。

kxy 包可以从 PyPi ( pip install kxy )或 Github 安装,也可以通过我们在 DockerHub 上预先配置的 Docker 映像来访问——有关如何开始的更多详细信息,请阅读 this 。一旦安装完毕, kxy 包需要一个 API 密匙来运行。您可以通过填写我们的联系表或发送电子邮件至 demo@kxy.ai 来申请。

我们以房价高级回归技术 Kaggle 竞赛为例。该问题包括使用 79 个解释变量的综合列表预测房屋销售价格,其中 43 个是分类变量,36 个是顺序变量。

我们发现,当使用独热编码方法来表示分类变量时,可以实现*乎完美的预测。

关于房价高级回归 Kaggle 竞争的可实现性能分析的代码片段和输出。

事实上,当我们以贪婪的方式一次选择一个解释变量,总是在尚未选择的变量中选择产生最高增量果汁量的变量时,我们发现仅用 79 个变量中的 17 个,我们就可以实现*乎完美的预测——在 R 意义上。

贪婪变量选择分析的代码片段。

写这篇文章时 Kaggle 排行榜截图。

下图说明了全变量选择分析的结果。有趣的是,当前 Kaggle 排行榜的榜首已经设法产生了 0.00044 的 RMSE,这是使用前 15 个变量可以实现的最佳结果和使用前 16 个变量可以实现的最佳结果之间的某个位置。

标签。Kaggle 房价高级回归技术竞赛 KxY 无模型变量选择分析结果。

你可以在这里找到用于生成上述结果的代码。

脚注:

【】假设观测值(输入、输出)可以看作是从同一个随机变量 (y,x) 中独立抽取的。特别是,问题不应该表现出任何时间依赖性,或者观察值(输入、输出)应该被视为来自静态和遍历时间序列的样本,在这种情况下,样本大*应该足够长,以跨越多个系统的内存。

[ ]前一个脚注的要求具有非常实际的意义。整个推理管道依赖于对 Spearman 秩相关矩阵 S(y,z) 的精确估计。当观测值可以被视为同分布样本时,对【y,z】的可靠估计只需要很*的样本量,就能指示真实的潜在现象。另一方面,当观察呈现时间依赖性时,如果使用我们的数据的不相交子集来估计【y,z】产生非常不同的值,则时间序列不是*稳的和遍历的,或者它是*稳的和遍历的,但是我们没有足够长的历史来表征 S(y,z); 无论哪种方式,估计的 S(y,z) 都不会准确地表征真实的潜在现象,并且不应该应用分析。****

数据科学入门需要了解多少数学知识?

原文:https://towardsdatascience.com/how-much-math-do-you-need-to-know-to-get-started-with-data-science-789b24d212fc?source=collection_archive---------12-----------------------

安托万·道特里在 Unsplash 上拍摄的照片

明确、直截了当的回答。

在我开始数据科学之旅之前,这是我最迫切的问题之一。这也是认真考虑开始数据科学之旅的人心中的一个问题。在本帖中,我为你提供一个明确的答案。

我不是专业的数据科学家。但我已经走过了第一步。我坚信这句话-

“你是引导比你落后一步的人的最佳人选”。

由于出身于物理专业,我有坚实的数学基础。我修过线性代数、微分方程、高等微积分等课程。

虽然我学到的概念一直萦绕在我的脑海中,但数学趣闻的细节却随着时间而褪色。我非常担心。

我需要复习我在线性代数和微积分课程中学到的所有东西吗?为了学习数据科学,我需要牢固掌握这些课程中的所有数学公式吗?我对这些主题的准备程度应该像我参加这些课程的考试前几天晚上那样吗?我能记住 勒让德多项式 的生成函数吗?

这些问题充斥着我的大脑,我很困惑。我非常认真地有条不紊地学习数据科学。所以我想手动操作。

我读了很多关于数据科学的书,而不是读/看关于数据科学的视频。这是一个错误(稍后将详细介绍)。

每个人给的建议

浏览任何博客,对 Reddit 上任何询问数据科学先决条件的帖子的任何回复,你得到的答案都是一样的

  1. 从可汗学院了解线性代数基础知识。
  2. 从可汗学院了解微积分基础知识。
  3. 以吉尔伯特·斯特朗教授的线性代数 MOOC 为例,由麻省理工学院开放式课程提供。
  4. 以麻省理工学院开放式课程提供的多变量微积分 MOOC 为例。

这些是你在网上任何地方都能得到的建议。有些人以麻省理工开放式课程提供的机率课程结束课程。

有些人提到了 Grant Sanderson 当之无愧的著名的线性代数和微积分播放列表(后面会有更多)。

但差不多就是这样了。

我发现了什么

我真的很喜欢麻省理工开放式课程提供的任何课程。我在高中的时候看过那里的微积分视频,在大学二年级的时候从那里学到了很多热力学知识。而且我真的认为麻省理工开放式课程提出的课程有很高的价值,应该是值得认真学习的资源。

而且,这些课程的问题是——它们需要非常长的时间来完成。我提到的课程是为整个学期设计的。

那些课程计划在六个月内完成。把几个结合起来,你就有了一个本科课程的工作量。这对你不好,因为-

  1. 如果你是在职专业人士或大学生,你会把所有的额外时间都花在学习数学上。
  2. 如果你没有课程或者没有工作责任,你就把时间花在学习数学上——你没有做任何数据科学。

不管怎样,你只花了 5-6 个月学习数学。换句话说,你损失了 5-6 个月的时间,而这些时间本可以用来学习数据科学

这样,你在数据科学的学习上落后了 5-6 个月。

(注:如果你在读高中,或者你是大学新生,我建议你这样做。因为你有很多时间。你可以全面地做到这一点。此外,您可能还没有涉及其他来源的数学。)

但是,如果你是一名大四学生、研究生或在职专业人士,5-6 个月的数据科学进展就会丢失,这是相当大的损失。

我的两分钱

已经获得了 IBM 的数据科学专业证书,经历了吴恩达的机器学习课程,并且通过 fast.ai 库训练了一个 CNN,我可以有把握地说,你肯定不需要知道课程材料教授的所有主题就可以入门

开始你的数据科学之旅,你不需要知道麻省理工大学本科课程的所有内容。

(注:我说的是出发。我的理解是,你需要了解这些课程中教授的数学知识,更需要了解这个领域中真正的优秀。)

但是,您可以在需要时学习数学和数据科学主题,而不是一开始就学习所有的数学知识而不了解它在数据科学中的作用。

我在研究数据科学的过程中发现,你需要在众所周知的概念上有坚实的基础,比如导数、向量、矩阵等等,而不是被大量的概念所束缚。(一整节即将开始!)

我的两分钱包括我最*学到的一些关于知识和学习的基本知识: 学习是一个迭代的过程

这是一个非常受欢迎的概念,我们在明确定义的步骤中学习。我们完成一步,从中获得知识,然后进入下一步,从中学习,如此循环。但是,正如许多认真的学生所知道的那样,这一概念并没有抓住全貌。

每当你学东西时,你都是通过一遍又一遍地复习内容来做到这一点的。完成某件事的第一步后,你可能会认为你知道第一步。但你没有。

你会进入下一个阶段。一旦到了那里,你就会意识到在第一步中有一些缺口。你回去弥补差距。接下来的步骤也是如此。因此,你反复回到第一步(和后面的步骤)去扎实地学习一些东西。有些人遵循这一点,但不欣赏这一过程。他们通常称之为“修订”。这个反复的过程需要时间。

我们可能对这一进程的机制有不同意见,但我认为我们都同意这需要很多时间。而且起步早的人会有优势。

正如我前面提到的,当你花六个月的时间学习数学时,你就失去了六个月学习数据科学的时间。不要那样做。今天开始

总结一下:学习是迭代的,边做边学。做得越多,学得越多。你分配给实际工作的时间越多,你学到的就越多。你应该从今天开始学习数据科学。一路学习数学。

别人怎么说

我承诺在标题中提供明确的答案,我完全打算信守承诺。

但在此之前,让我快速向你重复一下其他人的想法。

Sylvian Gugger ,计算机科学教师和深度学习实践者,与 fast.ai 合作,在博客中说

做深度学习需要高等数学吗?

简而言之,答案是否定的。长时间的回答是否定的,任何告诉你相反情况的人都只是想吓唬你。在深度学习的一些理论研究领域,你可能需要高等数学,但在餐桌上每个人都有空间。

哈佛商学院教授大卫·佩尔金斯也支持的观点,也就是说要真正做机器学习,而不是花太多时间通过学习数学来准备,而不是像我们这样学习机器学习。在他的书中,**

珀金斯指出了教育中的两种不幸倾向:一种是他所谓的“元素论”——学习一门学科的组成部分,却从来没有把它们放在一起。另一个是以实际学习为代价来培养“学习”某事的倾向。“你不可能通过一年的击球练习学会打棒球,”[…]

Rachel Thomas,fast . ai的联合创始人在的采访中讲述了-

我强烈推荐大家阅读保罗·洛克哈特的文章,《一个数学家的哀叹》。他谈到了一个噩梦般的世界,在这个世界里,孩子们在读研究生之前不允许唱歌或制作音乐,他们的童年是用手抄写乐谱度过的。

如果你花了几个月甚至几年的时间为学习数据科学做准备,你就会这么做。

好吧,你到底需要多少钱?

你真的准备好开始了吗?

要开始学习数据科学,你不需要了解研究生水*的数学。重要的是,你在矩阵乘法和导数等基础知识上有坚实的基础。你需要高中水*的数学有坚实的基础。没有更多的。

问自己这些问题-

  • 你知道什么是矩阵吗?
  • 向量到底是什么?
  • 为什么 sin(x)的导数是 cos(x)?
  • 线性方程绘制时到底是什么样的?当你改变 y = mx + b 中 m 的符号后,一条线向哪个方向倾斜?
  • 如果将 y = x 中 x 的次数从 3 变为 4,绘制的线会如何变化?
  • 为什么我们要把矩阵和向量相乘?我们计划实现什么?
  • 斜率是什么意思?关于一条曲线,它的曲线在某一点是正的,你能知道什么?
  • 到底什么是方差?(提示:名字说明了一切)
  • 为什么我们需要这样定义标准差?为什么我们要把它*方,然后求它的*方根?这给了我什么优势?你能把这个和你使用这个技巧的其他主题联系起来吗?(提示:笛卡尔*面中的距离,物理实验中的误差等。)
  • 你知道三种不同的*均值吗——均值、中值和众数?你能想出现实生活中三种不同的用例来描述每一种吗?

如果你能自信地回答这些问题中的大部分,你就是黄金。今天就开始学习数据科学吧!

此外,如果你看看谷歌为他们的机器学习速成班列出的先决条件和准备工作,你会发现他们提到了非常基础的东西。

如果你结巴了…

无法回答问题?感觉有点脱离现实?

别担心。再过你就要开始学习数据科学了。**

强烈推荐资源 3blue1brown 的 Logo。来源:*基共享资源

资源

这里有一些我推荐的资源,可以提升你的技能或建立清晰的数学直觉。不是每个人都能接触到高质量的数学老师。

我在初中和高中学到的东西我称之为“考试数学”。在麻省理工开放式课程、可汗学院等的帮助下,我自学了真正的数学。但那是另一回事了。

我假设你在高中或大学接触过数学和基础统计学(相当于三到五个介绍性章节)。

  1. 观看 Grant Sanderson 的名为“线性代数的本质”的伟大系列,感受一下当你乘矩阵、计算行列式等等时到底发生了什么。
  2. 3blue1brown 的另一个重要资源是一个名为“微积分本质”的系列。这就像线性代数课程,但微积分。
  3. 浏览可汗学院的统计播放列表。对于数据科学初学者来说,这已经足够了。
  4. 德斯莫斯免费提供了一个惊人的图形计算器。建议你玩玩。看看函数是什么样子的。如果你给它们加上常数,或者翻转符号,看看它们是如何变化的。对数据科学家来说,感受一下多项式绘制时的样子是一项非常有价值的技能。只有通过练习,你才能获得成功。****

其他资源

很多人认为,如果你可以无缝地浏览两本书,你的数学背景就足以学习数据科学。那些书是-

  1. Gareth James 等人的《R 中的统计学习与应用导论》(ISLR)
  2. 【所有的统计:统计推断简明教程】拉里·乏色曼

(这两本书的页面上都提供了免费下载链接)

如果你在高中或大学学过数学,但你已经落伍了,想要重新学习,我建议你在 Coursera 上学习两门课程:

  1. 机器学习的数学:线性代数
  2. 机器学习的数学:多元微积分

它们由伦敦帝国理工学院提供,并免费审核(你可以免费观看所有视频,但必须付费访问作业和测验)。这些课程很特别,它们明确地把重点放在传授直觉上,与这些主题的传统大学课程非常不同。我强烈推荐他们。

可汗学院播放列表中的这些主题也非常好。事实上,他们的多元微积分课程是由格兰特·桑德森教授的!

不要被误导-个人笔记

如果你四处打听,你会发现对这件事有很多不同的看法。我请你不要被误导。

在我早期,我在网上向一些统计背景的人寻求帮助。我说我想学习回归算法。他们建议我在开始机器学习之前阅读 1000 多页。我意识到我要花几个月的时间来涵盖这些材料,并且我将落后几个月开始我的数据科学研究。这是不可接受的。

我在看视频,读关于研究数据科学的文章,而不是真的研究它!不要犯这种错误(这就是我在第一节讲的)。

所以,我忽略了这个建议,我开始学习数据科学。我意识到,以我的物理本科背景,我对数学主题的覆盖足以应对数据科学初学者可能遇到的任何事情。我完全能够理解吴恩达在 Coursera 的机器学习课程、fast.ai 的深度学习课程以及学习 ISLR 时遇到的数学方程和概念。我还获得了 IBM 颁发的数据科学专业证书。

我在前一节提供了一个问题列表。把能够回答这些问题看作是一个试金石。如果你仍然怀疑自己开始数据科学研究的能力,不要犯和我一样的错误。开始学习数据科学,亲自看看吧!

您可以免费学习数据科学课程。吴恩达的机器学习课程完全免费。

如果你认为你的数学不够好,停下来一段时间,从我提到的来源学习数学。

作为一名学生,我总是想知道引擎盖下发生了什么。我想知道为什么 3x 的导数是 9x,当我们说 i = -1 是什么意思?我花了几个*时寻找这些问题的答案。

如果你像我一样关注课程和课堂之外的数学,作为一个数据科学的初学者,你会很容易地通过任何你会遇到的事情。

参考

[1]:Bat 教育:教育者的七项原则

结尾注释

如果你现在对开始数据科学犹豫不决,我希望我能把你推到另一边。

我是一个注重数学严谨性的人,这是非常重要的。这篇文章关注的是你需要知道的入门知识。我鼓励你在这个过程中参加麻省理工学院的线性代数和多变量微积分课程。

我的目标是劝阻您在开始数据科学之旅时,不要往脑子里装太多的数学概念和主题,而是尽快开始研究实际的数据科学。

我的理解是,拥有坚实的数学基础对于在数据科学领域取得成功至关重要。

与我联系-

和*!

数据科学家实际赚多少钱?

原文:https://towardsdatascience.com/how-much-money-do-data-scientists-actually-make-2408675c79cb?source=collection_archive---------21-----------------------

深入探讨数据科学家的薪酬。

乔治·特罗瓦托(Giorgio Trovato)在Unsplash【1】上的照片。

目录

  1. 介绍
  2. 初级数据科学家
  3. 中级数据科学家
  4. 高级数据科学家
  5. 额外补偿
  6. 摘要
  7. 参考

介绍

数据科学家这一有利可图的角色肯定能提供丰厚的薪水;然而,一些公司可能会对这一角色有不同的看法,这使得美国乃至世界各地的薪酬差异很大。即使是在同一家公司,根据职位的资历,工资的范围也可能相差几千英镑。我面试了几家公司,虽然我不能说出它们的具体情况和各自的薪水,但我可以证明网上公开记录的薪水范围。我将概述数据科学职位的三个主要资历层次及其薪资范围。此外,我将根据工作描述中所需的技能,对能提供或多或少收入的角色进行评论。我将从一个著名的网站上报告工资,并根据我的经验评论一个通用的工资。

薪水总是一个敏感的话题,不管你是不被允许谈论它,还是不想谈论它。我们的社会非常忌讳讨论薪水,我完全不同意这一点。我知道有些公司确实在努力公开他们的工资。然而,如果你不自信地提出一个你认为有点高,但相对来说仍然很低的薪水,然后发现公司计划提供比你建议的高出几千的薪水,你真的会被雇主冤枉。但是,既然你先提出工资,公司就省了一大笔钱,他们这样做似乎是不可思议的错误。这几乎就像是雇主希望他们的员工和同事不知道他们的工资水*,以保护他们,但这适得其反,因为你会有,比如说,10 名员工,他们有着相同的经历,但工资水*差异很大,这最终会泄露出去,然后感情会受到伤害。

我能给任何谈判薪资的人(不仅仅是数据科学家)的最重要的建议是,知道自己的价值,对自己诚实,不要满足于低工资。不要求几十万块钱,而是看*均工资,问问自己,到目前为止,我在事业上、教育上做了什么才能做得更好。作为对我建议的补充,我想给读者一份来自我个人经历的报告工资和一般工资期望的总结报告。我所有的薪水都是以美元计算的。

如果您想了解更多关于三个不同子职位的数据科学薪酬,以及对额外薪酬的评论,请继续阅读下面的内容。

初级数据科学家

像初级数据科学家这样的角色不会持续很长时间,所以如果这个工资范围达不到你的标准或期望,也不用担心。因为数据科学在劳动力中是一个相当新的职位,或者至少是一个正式的头衔,大多数初级职位只包括你的第一个职位,这很可能会持续一年。之后,你可以向普通的中层数据科学家职位努力。但是我们不要想太多。因为确实有最新的(它将包括更新的日期和年、月、日)和关于工资的一般流行信息,我将使用它们作为我的主要工资参考。

这是初级数据科学家的*均工资:

确实报道了初级数据科学家的薪资*似值【2】——86000 美元

他们也有 32,000 美元到 168,000 美元的范围,这似乎有点离谱。所以,我就给一点自己的投入。从概括的角度来看,我认为您可以期待一个更具体和更窄的范围:

我报告的初级数据科学家的薪资*似值——90,000 美元

然而,我确实知道一些初级职位的薪水要低得多,但是如果可以的话,我还是会尝试申请其他职位,尤其是如果你有硕士学位的话。

中级数据科学家

中级数据科学家也可以被认为是拥有 1-3 年经验的普通数据科学家,有些人会说是 2-3 年。第一年结束后,你不仅会对自己的数据科学能力更有信心,也会对自己的谈判能力更有信心。有些公司提供的价格可能比我下面要介绍的要少或多;然而,大致了解你知道自己的价值是什么也很重要。面试时,不要害羞地说出你认为可以或可能做出的成绩,而是告诉他们你知道你应该做出的成绩。除了多年的经验之外,还要考虑其他特征,这一点很重要,但也包括:

projects you have worked on — impact on the businesseducationboot campsadditional coursescompany successlocation/city

确实报道了数据科学家的薪资*似值【3】——12.1 万美元

对我来说,这个报告的汇总工资似乎有点高;然而,有三年工作经验的人可能比有一两年工作经验的人更重要,或者来自更大、生活成本更高的城市的报告。

我所报告的数据科学家的薪资*似值——110,000 美元——115,000 美元

我相信,如果你在第一年后就想找一份工作,11 万美元左右更为准确。

高级数据科学家

数据科学领域的高级职位通常需要三到无限年的时间。还有其他一些职位有时会比高级职位和薪水更高,比如:

  • 首席数据科学家
  • 首席数据科学家
  • 数据科学家经理

确实报道了高级数据科学家的薪资*似值【4】——15.1 万美元

我相信这个报道的工资有点太高了;然而,如果你在纽约、旧金山和洛杉矶等城市,工资可能会超过这个*均值。

我报告的高级数据科学家的工资大约为 135,000 美元到 140,000 美元

我认为,如果你刚刚达到那个水*,这是对高级职位更公*的期望。

和所有这些报告的薪水一样,我假设你会从上一个职位跳槽到下一个职位,所以你会处于薪水范围的低端。

相反,一旦你已经在一个高级职位上,例如,转到另一个高级职位,你可以期望超过所有这三个角色的*均水*。

额外补偿

增加薪水的其他方法是拓宽你的技能。一些通常有利可图的技能包括但不限于:

  • 气流
  • 机器学习操作
  • 与软件架构的集成
  • 数据科学的自动化
  • 云计算
  • 演示技巧
  • 软件工程

除了薪水,还有其他形式的报酬需要注意。这些形式通常包括奖金(年薪的 5-15%)和股票。

摘要

Unsplash【5】上由 Myriam Jessier 拍摄的照片。

当然,有很多网站和个人经验信息可以概括数据科学家的工资,但它总是在变化,并基于各种因素。你能做的最好的事情就是做你的研究,评估你在职业生涯中的位置,然后去争取一份符合你期望的薪水。

我希望你喜欢我的文章。欢迎在下面评论。感谢您的阅读!

参考

[1]Giorgio trova to 在 Unsplash 上拍摄的照片,(2020)

[2]的确,的确报道了初级数据科学家的工资*似值,(2020)

[3]确实,确实报道了数据科学家的工资*似值,(2020)

[4]的确,的确报道了高级数据科学家的工资*似值,(2020)

[5]Myriam Jessier 在 Unsplash 上拍摄的照片,(2020)

这些机器学习术语你能回忆起多少?(在媒体上学习游戏化)

原文:https://towardsdatascience.com/how-much-of-these-machine-learning-terms-can-you-recall-learning-on-medium-gamified-a280a53a0737?source=collection_archive---------52-----------------------

挑战你自己,而我试着制造中等的乐趣

介绍

机器学习是一个广泛的领域,包含各种其他子领域,如计算机视觉、自然语言处理、语音识别等等。

尽管机器学习有许多分支子领域,但一些关键术语在所有子领域中都是通用的。

本文介绍了一些常见的机器学习术语,并以游戏化的方式对这些术语进行了描述和解释。

通过阅读这篇文章,你可以获得以前看不到的机器学习词汇的知识,或者重温你在机器学习实践中可能遇到的术语

游戏规则

  1. 每一节都以单词开头,供您定义
  2. 花一两分钟时间,确保你能够回忆起作品的定义
  3. 请随意写下您的描述,以便与我的进行比较
  4. 当你写下你对这些术语的定义时,向下滚动页面查看我对这些术语的定义和解释
  5. 尽可能地学习,甚至在评论区随意添加一些你的定义。
  6. 玩得开心
  7. 欣赏来自 Unsplash 的图片

1.激活功能

在向下滚动之前,思考或写出你对激活功能的描述。

照片由 Tachina LeeUnsplash 上拍摄

我们开始吧……

3

2

1

激活函数是将神经元的结果或信号转换成标准化输出的数学运算。

作为神经网络组件的激活函数的目的是在网络中引入非线性。包含激活函数使神经网络具有更大的表示能力和解决复杂的函数。

激活功能也被称为“挤压功能”。

常见激活功能的示例如下:

  • Sigmoid 函数
  • 热卢
  • Softmax 函数

记住你的解释不一定要和我写的一样,只要你包括或记住了一些要点。

现在,你已经知道如何理解这篇文章了……从某种意义上来说,它就像抽认卡。

下一个。

2.整流线性单位

这是你思考或写作的时间,不要太长……

蒂姆·高Unsplash 上拍摄的照片

3

2

1

一种转换神经元值结果的激活函数。

ReLU 对来自神经元的值施加的变换由公式 y=max(0,x) 表示。ReLU 激活函数将来自神经元的任何负值钳制为 0,而正值保持不变。

这种数学变换的结果被用作当前层的输出,并被用作神经网络内的连续层的输入。

消失梯度的问题上,ReLU 是限制或避免消失梯度对神经网络的影响的标准解决方案。

如果你得到了前一个任期,那么这应该是在公园散步。

3.Softmax

如果不是,也没关系,花一两分钟考虑一下。

Icons8 团队Unsplash 上的照片

你现在知道该怎么做了。

3

2

1

一种激活函数,用于导出输入向量中一组数的概率分布。

softmax 激活函数的输出是一个向量,其中它的一组值表示一个类或事件发生的概率。向量中的值加起来都是 1。

如果你喜欢这篇文章的格式,请留下你的评论。

4.Glorot 统一初始化器

这个有点难,放心踏出

本杰明·戴*斯在 Unsplash 上拍摄的照片

这么快就回来了…好了,我们走吧

3

2

1

Glorot 统一初始化器是一种神经网络的权重初始化方法,用作解决神经网络内不稳定梯度的解决方案。

它根据某个范围内的值分布初始化网络的权重,*均值评估为零,方差恒定。分布的最大值是范围的正值,最*值是范围的负值。

范围=【值,-值】

用于确定分布范围的值来自以下公式:

值= sqrt(6/fan _ in+fan _ out)

fan_in 是输入到层的数目, fan_out 是层内神经元的数目。

更多关于纸张 这里

4.损失函数

既然我们在中途,这里有一个简单的术语。

照片由布鲁斯·马尔斯Unsplash 上拍摄

告诉你这很容易

3

2

1

损失函数是一种量化机器学习模型表现得有多好的方法。量化是基于一组输入的输出(成本),这些输入被称为参数值。参数值用于估计预测,而“损失”是预测值和实际值之间的差异。

5.优化(神经网络)

马修·施瓦茨在 Unsplash 上的照片

3

2

1

神经网络中的优化器是一种算法实现,通过最*化经由损失函数提供的损失值来促进神经网络中的梯度下降过程。为了减少损失,适当地选择网络内的权重值是至关重要的。

优化算法的示例:

  • 随机梯度下降
  • *批量梯度下降
  • 内斯特罗夫加速梯度

6.多层感知器(MLP)

这是一个老的学期,让我们看看你是怎么做的……

马修·班*特在 Unsplash 上的照片

多层感知器(MLP)是几层感知器一个接一个地连续堆叠。MLP 由一个输入层、一个或多个称为隐藏层的 TLU 层以及一个称为输出层的最终层组成。

3

2

1

7.三重威胁

  • 学习率
  • 学习率计划表
  • 学习率衰减

保持冷静,你能行的

麦迪逊·拉弗恩Unsplash 上拍摄的照片

记住这都是关于学习的,所以如果你想不起来几个也没关系。

3

2

1

学习率是神经网络不可或缺的组成部分,因为它是一个决定网络权值更新水*的因子值。

学习率时间表:在神经网络的训练过程中可以使用恒定的学习率,但这会增加达到最佳神经网络性能所需的训练量。通过利用学习速率表,我们在训练期间引入学习速率的适时减少或增加,以达到神经网络的最佳训练结果。

学习率衰减:学习率衰减减少了梯度下降过程中向局部最*值移动的步长的振荡。通过将学习率降低到与训练开始时使用的学习率值相比更*的值,我们可以将网络导向在最*值附*的更*范围内振荡的解。

8.神经类型转移

这是最后一个

弗雷德里克·图比尔蒙特在 Unsplash 上拍摄的照片

3

2

1

神经风格转移(NST) 是一种涉及利用深度卷积神经网络和算法从一幅图像中提取内容信息并从另一幅参考图像中提取风格信息的技术。在提取样式和内容之后,生成组合图像,其中所得图像的内容和样式源自不同的图像。

NST 是一种图像风格化的方法,这是一种涉及使用输入参考图像来提供具有从输入图像导出的风格差异的输出图像的过程。

我希望这篇文章的内容对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将上线的视频内容 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我

您的神经网络的预测有多少可以归因于每个输入特征?

原文:https://towardsdatascience.com/how-much-of-your-neural-networks-prediction-can-be-attributed-to-each-input-feature-62581efd9b38?source=collection_archive---------16-----------------------

用 PyTorch 实现的具有集成梯度的深度神经网络。

照片由 img.lyUnsplash 上拍摄

众所周知,神经网络是黑盒预测器,数据科学家通常不知道哪个特定输入特征对预测影响最大。如果我们想了解模型实际学到了什么,这可能是相当有限的。有了这种理解,我们就可以发现我们的学习算法或数据处理管道中的错误或弱点,从而能够改进它们。

我们将在本项目中实施的方法称为集成梯度,在以下文章中有所介绍:

在本文中,作者列出了一个好的属性方法应该遵循的一些理想的公理,并证明了他们的方法 Integrated gradients 满足这些公理。其中一些公理是:

  • 灵敏度:如果两个样本仅在一个特征上不同,并且通过神经网络具有不同的输出,那么这个特征的属性应该是非空的。相反,如果一个特征根本不影响输出,那么它的属性应该为零。
  • 实现不变性:如果两个网络的所有输入都有相同的输出,那么它们的属性应该是相同的。

更多的公理可以在上面链接的文章中详细找到。

积分梯度很容易实现和使用,它只需要计算神经网络输出相对于其输入的梯度的能力。这在 PyTorch 中很容易做到,我们将在下面详细介绍如何做到这一点。

该方法:

我们将我们的神经网络表示为函数 F:

我们对特征向量 x 的属性感兴趣,并且还引入了基线特征向量 x’。该基线 x '允许我们对原因的“不存在”进行建模,并且其通过神经网络的输出应该接*于零。

积分梯度法的计算如下:

作者图片

其中 x_i 是向量 x 的第 I 个特征。

示例:

合成示例:

让我们生成一个合成数据集,尝试更好地理解这种方法。

我们将数据生成流程设定为:

这可以用 python 来实现,如下所示:

**def** build_dataset(size):
    pos_size = 32
    neg_size = 32
    noise_size = 32
    pos_cols = [**"POS_%s"** % i **for** i **in** range(pos_size)]
    neg_cols = [**"NEG_%s"** % i **for** i **in** range(neg_size)]
    noise_cols = [**"NOISE_%s"** % i **for** i **in** range(noise_size)]

    pos = {i: np.random.uniform(-1, 1, size=size) **for** i **in** pos_cols}
    neg = {i: np.random.uniform(-1, 1, size=size) **for** i **in** neg_cols}
    noise = {i: np.random.uniform(-1, 1, size=size) **for** i **in** noise_cols}

    df = pd.DataFrame({**pos, **neg, **noise})

    df[**"target"**] = df.apply(
        **lambda** x: sum(
            [x[k] * (i + 1) / pos_size **for** i, k **in** enumerate(pos_cols)]
            + [-x[k] * (i + 1) / neg_size **for** i, k **in** enumerate(neg_cols)]
        ),
        axis=1,
    )

    coefs = (
        [(i + 1) / pos_size **for** i, k **in** enumerate(pos_cols)]
        + [-(i + 1) / neg_size **for** i, k **in** enumerate(neg_cols)]
        + [0 **for** i, k **in** enumerate(noise_cols)]
    )

    **return** np.array(df[pos_cols + neg_cols + noise_cols]), np.array(df[**"target"**]), coefs

我们可以看到,所有特征的系数并不相同,有些是正的,有些是负的,有些是零。

我们在这个数据上训练一个多层感知器,如果模型正确地学习了数据模式,那么我们期望发现特征 x_i 的属性大约等于:

因为它是与基线相比,我改变输出的特性的数量。

并且:

因此,让我们实施综合梯度,并检查我们的实证结果是否有意义。

首先,我们在 PyTorch 中通过拟合训练数据来训练回归模型。然后我们选择 x '全为零。

为了计算积分,我们使用一种*似法,通过从 x 到 x’计算*间隔的 dF 值,然后对 dF * size_of_interval 求和。使用以下函数实现整个过程:

**def** compute_integrated_gradient(batch_x, batch_blank, model):
    mean_grad = 0
    n = 100

    **for** i **in** tqdm(range(1, n + 1)):
        x = batch_blank + i / n * (batch_x - batch_blank)
        x.requires_grad = **True** y = model(x)
        (grad,) = torch.autograd.grad(y, x)
        mean_grad += grad / n

    integrated_gradients = (batch_x - batch_blank) * mean_grad

    **return** integrated_gradients, mean_grad

使用 torch.autograd.grad 可以轻松计算梯度。在我们的函数中,所有要素的运算同时进行矢量化。

现在我们已经得到了积分梯度,让我们检查它是否符合我们的预期:

我们可以看到,属性的估计值(橙色)与我们的预期值(蓝色)非常接*。该方法能够识别特征如何影响输出,以及哪些特征对目标没有影响。

图像示例:

现在让我们做一个图像分类的例子,我们将使用在 ImageNet 上训练的 resnet18 应用于我的猫的照片。我们将使用与上述完全相同的过程,每个图像像素将被视为一个输入特征。我们将得到一个结果,其中每个像素由它对图像分类的影响程度表示为一只虎斑猫。

作者图片

作者图片

我们可以看到,对“虎斑猫”输出神经元影响最大的像素位于猫的面部。

结论:

积分梯度是了解每个输入要素对神经网络输出的影响的好方法。该方法解决了现有方法的一些缺点,并满足一些公理,如敏感性和实现不变性。
在处理神经网络时,这种方法可以成为一种很好的工具,以便更好地理解它们的预测,甚至检测训练算法或数据集是否存在一些问题。

代号:https://github.com/CVxTz/IntegratedGradientsPytorch

多少 Python 编程才够开始学习数据科学?

原文:https://towardsdatascience.com/how-much-python-programming-is-enough-to-start-learning-data-science-c8f4fb098075?source=collection_archive---------24-----------------------

杰森·斯特鲁尔在 Unsplash 上的照片

您是否对数据科学感兴趣,但因为没有任何编程经验而不确定自己能否成功?或者不确定编程多少才够入门?

不要担心!在本文中,我将解释开始学习数据科学所需的基本 python 编程概念。即使你不选择 python 来学习数据科学,主题也是一样的。

设置环境

第一步是设置正确的环境,学习 python 最好安装 Anaconda。使用 Anaconda 有一些好处。

  • 它配有 Jupyter 笔记本和 Spyder IDEs
  • 您可以选择通过命令提示符或使用 Navigator(基于 UI)来访问 ide
  • 它有超过 1500 个数据科学包
  • 设置和开始使用极其简单快捷
  • 易于创建多个环境,当您处理许多对库具有不同对比依赖关系的项目时,该特性尤其有用

在这里安装来自的蟒蛇。您可以使用这里的链接开始使用 Anaconda,这将涵盖所有基本的命令和特性。如果你更喜欢视频,我制作了一个关于 Anaconda 入门的视频,请看下面:

在开始任何主题之前,请尝试熟悉您将要使用的 IDE,比如启动 IDE、关闭 IDE、清除内存、执行脚本等等。

变量和字符串数据类型

成功安装该工具后,下一步是了解如何声明变量,并了解更多关于字符串数据类型以及可以对字符串数据类型执行的操作的信息。

理解字符串数据类型在 python 中的工作方式很重要。Python 中的字符串数据类型被认为是一个字符数组,可以使用方括号通过指定索引来访问字符串中的字符

您应该熟悉的一些字符串操作是

  • replace()-用于用新值替换字符串中的特定值
  • Split() —用于根据分隔符将字符串拆分为两个或更多部分
  • 连接-用于连接多个字符串的加号运算符
  • Trim() —用于删除字符串前后多余的空格
  • Lower()和 Upper() —用于更改字符串的大*写,从大写改为*写,或者从*写改为大写
  • 使用索引来过滤字符串子集
  • 使用“IN”和“NOT”检查字符串中是否存在短语

参考 python 教程这里来学习 python 编程语言的这些概念和特性

数字、布尔和运算符

了解 python 中的三种数值数据类型——整型、浮点型和复杂型。还介绍了将数据从一种数字格式转换为另一种数字格式的方法,以及它如何反映在数据中。例如,定义一个整数,把它转换成浮点数,然后检查这个值发生了什么变化。

Boolean 表示真或假。它们通常用于评估表达式/条件,如 Is A > B?

对于运算符,它们用于在变量或值之间或者变量和值的组合之间执行运算。python 中的一些操作符是,

  • 赋值运算符
  • 比较运算符
  • 算术运算符
  • 逻辑运算符
  • 按位运算符
  • 身份和成员运算符

从教程这里了解所有的 python 操作符,并通过试用它们来实践

集合数据类型(列表、元组、集合和字典)

python 中有四种集合数据类型。对于初学者来说,所有这些数据类型可能看起来非常相似,但是它们中的每一种都有独特的特性,使其与其他类型不同,并使它们对于特定的用例来说是特殊的。它们的一些独特特征是,

列表

  • 使用“[”和“]”括号声明
  • 可以使用索引来访问元素
  • 它们是可变的,这意味着它们可以被改变
  • 它们可以被分类
  • 列表元素可以是任何数据类型
  • 用例:这是 python 中最流行的集合数据类型,因为它提供了更多的灵活性。

元组

  • 使用“(”和“)”括号声明
  • 元组是不可变的,这意味着它们一旦被定义就不能被改变
  • 它们是有序的,可以使用索引来访问
  • 元组比列表快得多
  • 元组的元素可以是任何数据类型
  • 用例:这应该在元素列表不能或者不应该被改变的场景中使用

设置

  • 使用“{”和“}”括号声明
  • 它们是可变的
  • 它们没有排序,也没有访问特定元素的索引,因此不能有任何重复
  • 虽然集合本身是可变的,但是它们不能有可变的元素,就像“列表不能是集合中的元素”
  • 集合的特点是它们允许像并集和交集这样的运算
  • 用例:当需要比较不同的值列表时,比如确定公共元素的数量,那么最好将它们定义为一个集合

字典

  • 使用“{”和“}”括号声明
  • 这些元素存储为类似于 JSON 格式的键值对
  • 它们是可变的
  • 它们是无序的,但是可以使用键访问这些元素
  • 用例:当你想在一个键和值之间有一个映射,比如一个客户的联系号码,那么最好将它们声明为一个字典。同样,字典数据类型可以用来存储更复杂的数据结构

查看教程这里的可以更好地理解上面的集合数据类型以及可以在这些集合数据类型上执行的操作。

条件语句(If-Then-Else)和控制流语句(For 和 While 循环)

用 python 实现这些是必须知道的。正如在任何数据科学项目中一样,将会有一个用例要求我们遍历一个项目列表或一个数据帧,我们需要为其实现循环功能。类似地,总是需要检查一个条件。因此学习下面的实现——使用 python

  • 如果-那么-否则
  • For 循环
  • While 循环

对于编程新手来说,“For 循环”和“while 循环”之间的基本区别是,“For 循环”将迭代通过特定的元素列表,在这里变量将被初始化、检查并自动递增,而在“While 循环”的情况下,它将迭代直到满足 While 循环中指定的条件,还需要明确提到初始化和递增。当我们确定迭代次数时,最好使用“For Loop”。在“While 循环”中,如果你没有提到循环中的 increment 语句,那么它将成为一个无限循环。

函数和λ函数

照片由沙哈达特·拉赫曼Unsplash 上拍摄

函数用于避免代码重复,降低复杂性,提高可读性。python 中的函数是用“def”定义的,通常以“return”语句结束。当一组语句需要在项目的不同部分执行多次时,最好将它们定义为一个函数,并在需要时调用它们。这些函数可以接受任意数量的参数作为输入,并且在调用函数时,参数的数量必须完全匹配,也就是说,如果函数需要两个参数,那么在调用函数时,我们需要传递两个参数,不能多也不能少。

Lambda 函数类似于一个函数,它可以接受任何参数,但只有一个表达式。与函数不同,lambda 函数可以保持匿名。对于 lambda 函数,将使用关键字“lambda ”,语法为“lambda arguments: expression”。

这些基本概念刚好够开始学习数据科学。如果你喜欢教程视频,那么看看我在 python basic 上制作的数据科学所需的视频系列,它有 7 个模块,每个模块大约 20-30 分钟,每个模块结束时都有锻炼练习,教程的总长度不到 3 *时。以下是 python 基础教程系列的链接,请订阅更多与数据科学相关的内容。

最后声明

这只是你编程之旅的开始。这些概念对于开始学习数据科学非常有用,也有助于打破你的学习障碍。只要记住继续你的学习之旅。

“智力的增长应该从出生开始,只有在死亡时才停止”

-阿尔伯特·爱因斯坦

如何更有效地标注训练数据

原文:https://towardsdatascience.com/how-much-time-can-you-save-with-active-learning-b4886f5da462?source=collection_archive---------53-----------------------

通过主动学习节省时间和精力

如果你曾经参加过任何从零开始的机器学习项目,你可能知道大量的时间通常花在对数据进行标记上。标记数据的数量和质量通常决定了项目的下一步以及最终结果。

选择标记哪些数据的传统方法是简单地选取一个你有标记能力的随机样本

在这篇文章中,我想探索一种更有效的选择标记数据的方法,称为主动学习,基于这样一种想法,一些数据点可能比其他数据点给模型带来更多的信息价值。

照片由 Unsplash 上的 NeONBRAND 拍摄

主动学习

主动学习的主要原则是让模型选择哪些数据实例应该由人工注释者(通常称为 oracle)标记,这样可以用更少的标记数据获得更好的性能。

让模型做到这一点的最常见的场景被称为基于池的采样,其中有大量未标记的数据可用。从这个池中,模型使用某个查询策略绘制要标记的实例。在标记了查询的实例之后,用新添加的数据重新训练模型,并再次重复该过程。

可能最简单的查询策略,也是我在实验中使用的策略,是不确定性采样。该策略查询模型预测最不确定的实例。如果我们想象一个二元分类问题,这些将是后验概率最接* 0.5 的实例。

多类分类问题中,有几种方法进行不确定性采样:

最*置信度采样 选择最可能的标签具有最*置信度的实例(其概率离 1.0 最远)。

边缘采样 选择最可能和第二可能标签之间差异最*的实例。

熵采样 选择熵最高的实例(统计概率使用 此公式 )。

实验

我决定做一个实验,比较所有的三种多类方法,以及基本的随机抽样。为此,我使用了 DBPedia Classes 数据集,这是一个多类文本分类的通用基准数据集。

从数据集中,我随机选择了 5000 个实例到我们的未标记数据池中。这些数据将被使用不同的策略进行查询,然后被标记为。标注本身并不需要实际执行,因为数据集已经包含了标签。因此,标签只是在需要时简单地分配给实例。

接下来,我创建了一个具有一个卷积层的简单模型,在输入中使用手套词嵌入。我需要这个模型非常轻量级,因为它会在每次查询后被反复重新训练。

用于每个查询策略的模型。

主动学习需要总是从已经标记的一*部分数据开始,因此在实际开始查询之前,模型至少要经过一点训练。这个*数据集被称为种子。我设置了 100 个实例的种子,这些实例是从我们的池中随机选择的,被标记并用于每个策略。

下一个参数是批量大*,它在主动学习的上下文中意味着在模型重新训练之前,应该一次查询和标记多少个实例。理想情况下,我们将使用批处理大* 1,这样模型在每个标记的实例后重新训练,从而最大化查询的有效性。这通常是不可能的,因为训练本身计算量很大,需要一定的时间。在这个实验中,我使用的批量为 50。

总的来说,我用这个批量做了 98 次迭代,它和 100 个实例的种子一起贯穿了我们已经建立的整个池。每一次迭代,模型的准确性都在一个单独的测试集上进行测量。每种策略的结果如下图所示:

准确度给定标记数据的数量,使用不同的查询策略。图片作者。

正如您所看到的,所有三种查询策略都以非常相似的方式执行,并且都比随机抽样要好。我们还可以看到,在大约 4500 个标记实例之后,所有的查询策略(包括随机抽样)都达到了相同的精度。这仅仅是因为我们即将到达池的末端,这里几乎所有的数据都被贴上标签,而不管策略如何。

现在让我们试着将结果转换成现实生活场景。如果我们项目的目标是达到例如 85%的准确度,那么可以通过使用随机抽样标记 1900 个实例,或者使用最*置信度抽样标记 1150 个实例来实现。这意味着花费在标记数据上的时间减少了 39.5%。

定义项目范围的另一种方式是,我们有能力标记例如 2000 个数据实例。通过这种方式,我们将使用随机抽样达到 85.96%的准确度,使用最*置信度抽样达到 88.4%,这意味着通过标记相同数量的数据,准确度提高了 2.44%。

结论

结果似乎很有希望,但是,我们必须意识到,它们可能因数据集而异。值得一提的是,主动学习可能会有一些缺点。

其中之一是在项目开始时为主动学习设置基础设施可能需要一些时间(尽管一些框架已经可用),并且重新训练模型的过程可能在计算上要求很高

另一个是你最终得到的带标签数据的分布偏向于已经用于查询的模型。如果您现在出于某种原因决定更改模型,那么数据将不再来自随机分布,这对您的新模型来说可能比实际情况更糟。

总的来说,我希望我给了你一个关于积极学习的好的概述,并且当你开始你的下一个项目时,你会考虑到它。

该实验的代码可在这本 kaggle 笔记本中找到。

启发主动学习文献调查

感谢您的阅读!

[## 通过观察偏差和方差来系统地调整你的模型

有没有想过是否有比盲目猜测超参数或…更系统的方法来调整您的模型

towardsdatascience.com](/systematically-tuning-your-model-by-looking-at-bias-and-variance-4986662315b2) [## 零射击学习字母字符(代码实验)

是否有可能识别培训中未提供的字母字符?

towardsdatascience.com](/zero-shot-learning-the-alphabetic-characters-an-experiment-with-code-d1a0f23f4b4c)

抚养孩子实际上会花费你多少钱?

原文:https://towardsdatascience.com/how-much-would-raising-kids-actually-cost-you-299a589d004?source=collection_archive---------50-----------------------

建立一个交互式计算器来帮助计划生育

概述

在这篇文章中,我们将开发一个交互式计算器,它可以用来估算一个家庭抚养孩子的年度总成本,按费用类别(如食物、衣服等)细分。).

如果对方法论不太感兴趣,您可以立即在这里使用计算器。

这个计算器是基于利诺等人的美国农业部报告,题为“家庭在孩子身上的支出”,该报告估计了抚养一个孩子到 17 岁的增量成本。

它考虑到了:

  • 你目前有几个孩子
  • 你最终想要几个孩子
  • 这些孩子的预期出生时间
  • 你家在哪里
  • 您家庭的收入水*

还没有考虑大学费用,尽管未来的帖子会尝试这样做。

请注意,我已经将美国农业部报告中的原始数据表转录到一个谷歌表格中,可以在这里访问,如果这对任何人都有帮助的话。

背景&动机

作为一个住在纽约的即将 30 岁的人,我的朋友群中关于“钱”的对话越来越频繁,越来越重要,并形成了相当有意义的人生决策。我差点因为密尔沃基失去了一个好朋友,因为他和他的妻子在考虑(在几个因素中)在密尔沃基和在纽约相比养育一个孩子的成本节约。朋友*组中的其他人已经开始倡导搬到波士顿、新泽西,甚至慕*黑。

作为一个终生的纽约人和保持我们的朋友群体地理完整性的强烈倡导者,我希望利用我作为应用统计建模师和数据科学家的专业技能来弄清楚一旦我们有了家庭,我和我的朋友们是否(以及如何)能够负担得起继续在纽约生活。

我想有一个游戏计划

这是相当广泛的(但值得!)事业。它包括建立预测生命周期收入和支出轨迹的模型,个人债务和投资的演变,以及将个人财务状况的这些不同但相互关联的方面整合在一起的整体框架。(后续帖子即将发布!)

在这篇就职文章中,我想从分解一个至关重要的、改变生活的、重新安排优先次序的生活事件开始:生孩子。

最终产品

最终,我们会得到三个交互式图表:

  1. 随着时间的推移,您家中的孩子数量

2.一段时间内您与孩子相关的总支出

3.按类别分列的与儿童有关的支出细目(如食品、住房、教育等。)

方法学

在一个高层次上,这种方法是基于 Lino 等人的美国农业部报告“家庭在孩子身上的支出”这似乎是该主题的权威来源(参见关于数据来源的注释部分)。

对于我们的计算器,我们将:

  1. 收集用户输入
  2. 计算给定时间点家庭中孩子的数量
  3. 使用美国农业部的估算,计算每个孩子的花费
  4. 在每个孩子的基础上说明有多个孩子节省的费用,如旧衣服、大宗购买食品/家庭用品、共用卧室等。

收集用户输入

我们希望我们的估计考虑到:

  • 我们住在哪里——生活成本以及生孩子的成本会因居住地不同而有很大差异——例如,在波斯顿抚养孩子与在印第安纳州的农村抚养孩子会有很大不同
  • 我们家庭的收入等级不出所料,美国农业部发现,收入较高的人能够负担得起并确实在育儿活动上花费更多
  • 我们目前有几个孩子
  • 我们期望未来有多少孩子
  • 那些孩子的时机

举个例子,让我们以一个具有以下特征的已婚夫妇家庭为例:

  1. 位于纽约市
  2. 年收入 12 万美元
  3. 有两个孩子,一个两岁半,一个五岁
  4. 打算多生两个孩子
  5. 期待他们的下一个孩子(他们的第三个)在未来 3 年内出生,但不会早于一年
  6. 期待在那之后再等一两年,生下他们的第四个也是最后一个孩子

他们会输入以下内容:

请注意,地区和家庭收入类别直接取自美国农业部的报告。据我所知,没有更详细的数据,例如城市或收入十分位数级别的数据。

计算家庭中的孩子

根据上面的输入,我们可以计算出这些年来家庭成员中 18 岁以下儿童的数量:

我们假设一个家庭的下一个孩子正好在“X 年内,但不会早于 Y 年”问题中输入的 X 和 Y 数字之间。

每个孩子的费用

美国农业部为有两个孩子的家庭中的一个独生子女提供了按孩子年龄和费用类别分列的支出估算。

例如,以下是它对东北部城市已婚夫妇家庭的估计:

参见 Lino 等人的《2015 年家庭在儿童身上的支出》第 25 页,在此处找到。我还将报告中的表 1-7 转录到了谷歌表单中,可以在这里访问

我们可以这样理解,对于一对年收入超过 107,400 美元的夫妇,他们有两个分别为 2 岁半和 5 岁的孩子,他们在 2020 年与孩子相关的总支出预计为:

  1. 两岁半的孩子要 21610 美元
  2. +5 岁儿童 21,610 美元(尽管两个孩子属于不同的年龄组,但他们的总费用相同,这纯粹是巧合)
  3. =两个孩子每年总共 43220 美元

我们可以验证这确实与我们的计算器显示的一致(注意,2020 年是闰年,所以我们比 43,338 美元高一点,但 2019 年和 2021 年都正好是 43,220 美元):

2020 年是闰年!

2021 年有合适的,43220 美元的数字

针对多个孩子进行调整

美国农业部的估计是针对两个孩子的家庭,所以我们将根据报告中提供的指导调整到一个孩子或三个以上孩子的家庭(见表 1-7 的注释):

要估算一个独生子女的费用,将相应年龄类别的总费用乘以 1.27。要估算一个有三个或三个以上孩子的家庭中每个孩子的费用,将每个适当年龄类别的总费用乘以 0.76。对于一个家庭中所有孩子的花费,这些总数应该相加。

我们根据“计算家庭中的孩子”这一步的输出结果,将它合并到我们的计算器中。

你自己试试!

自己试试计算器,让我知道你对潜在改进的想法。

[## 抚养孩子的成本计算器

根据你要生几个孩子、你住在哪里以及你的家庭收入来估算抚养孩子的成本。根据美国农业部的“家庭儿童支出”报告。](https://gameplan-app-21.herokuapp.com/apps/child-expenditures)

关于数据源的说明

如前所述,该方法基于这份美国农业部报告:

Lino、k . Kuczynski、n . Rodriguez 和 t . Schap(2017 年)。2015 年按家庭分列的儿童支出。杂项出版物编号 1528–2015。美国农业部营养政策和促进中心。

作者使用了 2011-15 年消费者支出调查访谈(CE)的数据,他们声称这是“全国范围内最全面的家庭支出信息来源”。

该样本由 23,297 个已婚夫妇家庭和 7,030 个单亲家庭组成,并通过使用 BLS 加权方法进行加权,以反映感兴趣的美国人口。

这似乎是该话题的权威来源。它被谷歌上所有关于“抚养孩子的成本”的热门搜索所引用,例如:

  • Investopedia 关于抚养孩子成本的文章,此处
  • 专注于金融咨询民主化的金融科技公司 SmartAsset 有一篇文章在这里
  • 给我带来最大安慰的是莱曼·斯通,他是一个无可挑剔的推特粉丝,在人口统计学方面(以及其他方面)非常有价值,在 2019 年有一长串引用它的帖子。

感谢您的阅读,并随时联系我们!

这就是我第一次基于计算机视觉的实习的情况!

原文:https://towardsdatascience.com/how-my-first-internship-was-all-like-364187922d44?source=collection_archive---------48-----------------------

“永远不要以为你什么都知道。请教和寻求帮助,大多数人都会拜倒在自己的石榴裙下,分享自己的技能。”托*·克拉克

来源: shutterstock

毫无疑问,获得你的第一份实习,并开始在一些很酷的行业驱动的项目中工作,是每个毕业生都想参与的最激动人心的冒险。为你的工作获得报酬增加了更多的刺激。让我告诉你,我最*一直是这个旅程的一部分,在这篇文章中,我将讨论我的发现和工作。

我在印度本加卢鲁的一家快速发展的初创公司实习。我在那里做了一个半月的深度学习和计算机视觉实习生。

目录:

  1. 招聘人员是如何找到我的?
  2. 电话面试和招聘流程。
  3. 分配的项目。
  4. 我学到了什么。
  5. 欣赏
  6. 结论。

我是如何被接*的?

因此,我在计算机科学的 B.Tech 项目的第二年,为我的学期考试而学习。让我先告诉你,我有点痴迷于我的 LinkedIn 个人资料,我一天在那里徘徊 5 次。晚上,我打开手机,看到一条与 LinkedIn 相关的通知,看到这家初创公司的招聘人员向我寻求他的初创公司的带薪实习生职位,因为他对我的 LinkedIn 简介印象深刻。这个领域是深度学习和计算机视觉。当我在现场工作了一段时间后,我变得很兴奋,在短暂的聊天中,他问我我的 G ithub 个人资料链接和简历,并在规定的时间安排了一个电话。

来源: Shutterstock

电话面试和选拔流程

所以我对他进行了电话采访,他问了我一些与深度学习和计算机视觉相关的话题,以及我过去从事的项目和一些技术问题。最后,他要求我为评估过程建立一个基于暴力检测的深度学习模型,该模型将能够检测暴力武器,如枪、步枪、刀、火等。,我一点也不知道主要项目(我将要工作)是基于相同的主题。

所以,我花了一两天的时间准备模型,为此我不得不从 google Images 上刮下相关图片,准备用于模型训练。我收集了大约 3000 张枪、刀和所有东西的照片,并把它们存放在单独的文件夹里。由于我的笔记本电脑没有所需的计算能力,所以我不得不在私人回购中上传 Kaggle 上的图像,并在那里进行所有的训练过程。我和他分享了链接,他对我的工作印象深刻,最后我收到了录取通知书。

来源: Shutterstock

分配的项目

选拔过程结束后,我与招聘人员和其他实习生进行了*组通话,我应该与他们一起在一个团队中工作。所以我们就整个项目将如何进行进行了简短的讨论。

我们被指派设计和开发一个基于深度学习的端到端武器检测模型,该模型将检测暴力武器,如枪支、步枪、刀、火、烟。除此之外,我还被分配了一个独立的项目,研究基于遮挡的人脸检测模型。如果你不知道它是关于什么的,基本上它是关于开发一个面部检测模型,它将能够检测任何人的面部,即使它在摄像机中是部分可见的。由于我很难在孟加拉国旅行,所以我请求远程工作,他接受了。旅程就这样开始了。

Andrew Krasovitckii/shutterstock . com

项目开发进展如何,我学到了什么?

我不会进入这个项目的技术细节,而是给一个简单的概述。之前没用过 OpenCV 和图片抓取软件,所以要学。让我告诉你,开始一周是非常令人兴奋的,因为我学到了很多关于使用 python 编写代码来解决现实世界问题的东西,比如我编写了代码来一次性重命名 10,000 张图像,为此,有一次我想到手动重命名所有这些图像(尽管这会花费很多时间)。

因此,在建模过程中,我们采用 YOLOv3 算法进行目标检测。本地 PC 上的训练模型非常耗时,所以我们不得不在 google cloud 上进行,花费了我们大约 700 美元。我们根据我们的要求调整了算法的一些层,比如锚盒的数量等,经过一周的准备和 2-3 天的训练,我们的模型准备好了。除此之外,在视频和实时镜头上部署模型是最困难的部分,因为为了快速处理,我们必须删除一些模型层,使其快速工作。我将向您展示一个视频剪辑,通过它您将了解它的应用。

来源:洛克森科技

与此同时,我不得不开发基于遮挡的人脸检测模型(由于保密问题,不能透露技术细节)。这就是我整个实习项目的发展过程。

远程参与项目有时会让你感到沮丧,但最终唯一重要的是你开发的产品。在实习期间,我提高了我的沟通技巧,因为我必须主持与我的日常项目目标相关的日常虚拟会议,同时通过与相关产品经理交流我的进展,并与我的团队成员接触,让我感受到在现实世界的项目中在企业世界工作的感觉。

赞赏。

我们的工作得到了产品经理的高度赞扬,后来当我们了解到该公司为该产品申请了美国专利时,我为我们的成就做出了很大贡献。

结论。

最后,我想陈述一些我在旅途中经历和学到的东西。

  1. 永远不要拒绝在团队中工作的提议。
  2. 你的工作是有报酬的,所以不要在工作时间之外做额外的工作。
  3. 没有什么能代替努力。
  4. *护并更新您的简历、LinkedIn 个人资料和 Github 个人资料。
  5. 热爱你所做的事情,它能减轻你的工作压力。
  6. 寻找比你更好的人,解决同样的问题,了解你和其他人思*模式的不同。

请继续关注更多类似文章。

如果这篇文章对你有所帮助。请在这里支持我https://www.buymeacoffee.com/shobhitsri

谢谢你。

网飞是如何让我看《艾斯·文图拉》——第四遍?

原文:https://towardsdatascience.com/how-netflix-got-me-to-watch-ace-ventura-the-4th-time-c15121bd971a?source=collection_archive---------59-----------------------

流媒体应用如何跟踪你的每次点击,并推荐内容。它告诉了你什么,以及你如何用它来预测你的未来。

“无聊”,我在翻阅我的网飞数据的电子表格时对自己说。然后我发现了一个名为“点击流”的文件,网飞记录了我的每一次点击。

丹*斯·詹斯在 Unsplash

你是怎么喜欢上那个看了四季 40 多集的情景喜剧的?那部关于海洋生物的纪录片怎么样?这是你的选择,还是一个被智能引擎的建议和布局严重辅助的选择?

您可以下载您的网飞数据,方法是登录网飞后,进入右上角菜单中的“帐户”,导航至“下载您的个人信息”伟大的新闻是它的突出,容易找到。坏消息呢?嗯,我在 5 月 17 日提出请求后,于 6 月 14 日得到了我的数据(见下文)。

虽然这完全符合当前的数据请求法规,但对于数据爱好者来说,等待文件存档来玩是一段很长的时间。

网飞报告数据档案包含几个常见的文件夹和结构,如您的帐户设置、您使用过的设备、支付模式、客户信息历史和附加信息表。为了了解档案,我们不得不称赞网飞,它实际上非常全面,整理得很好。

网飞收集的数据类别

在这套附加信息说明中,有两个有趣的部分,他们解释得比我好得多。因此,关于网飞数据档案,请参见“点击流”和“内容互动”的说明。点击流指的是你在网飞的每一次点击,而“内容互动”指的是你如何在网飞的各种设备上与内容互动的一组表格。

网飞有一个复杂的推荐引擎来找到你喜欢的节目。他们的魔力当然对一个纯粹的观众来说是隐藏的,但是,你可以从你自己的角度来审视它,看看你自己是如何在内容、偏好、剖析和最终导致行动的建议的海洋中游泳的。

  • 有时你会因为网飞决定自动播放下一个内容而结束播放?这种情况有什么规律吗?
  • 有时候你只看了几集,并没有上瘾,这在不同的类型中都适用吗?
  • 这种行为是一贯的吗?这取决于你睡得怎么样,你走了多少步吗?
  • 你是否有不同的“观众角色”,根据你每天或每周的模式偏好不同的内容?
  • 你的受暗示性和你的哥们相似吗,怎么比较?

来自网飞档案馆的数据集有你在网飞生活的数字副本,其他流媒体服务也有类似的流。除了性格测试和你可能对应的猫的类型之外,你可以很容易地想象这种类型的数据集的其他用途,例如建议领域之外的内容(例如,基于音轨的音乐)。

流行为等数据的可用性是前所未有的,令人着迷。这种数据的可移植性是一个分水岭,为新的应用打开了市场。和一群不同背景不同行为的朋友看什么电影好?那么,我们为什么不建立一个应用程序来结合数据集并找到共同点,以建议我们可能会一起欣赏的电影?反过来,基于我们共同和不同的流媒体历史,我可能会和什么人有很多讨论呢?

你是怎么看完《艾斯·文图拉》的?你想知道吗?

PS。基于对基于这些数据的应用程序的一些建议,我想添加一个链接到 Prifina public Slack 的 post 脚本,在那里我们有一个电影推荐应用程序预览(MovieMater),它基于组合的流媒体数据(想想网飞,亚马逊视频,Hulu,YouTube)生成推荐。加入讨论,点击这里查看应用

神经网络如何描绘山脉和山谷——3D 远足

原文:https://towardsdatascience.com/how-neural-networks-paint-mountains-and-valleys-3d-hike-69995663b72?source=collection_archive---------47-----------------------

如果你像我一样,你会遇到数百个神经网络输出的可视化,并觉得有些事情不合理。那是因为少了点什么。 准确地说是一个*度。

如果你直接来到这里,请看看第一个关于神经元的真实输出的故事。一旦你抓住了一个,就只是把两个和两个放在一起——无论是比喻还是字面意思!

[## 2D 人工神经网络中的神经元如何在三*可视化中弯曲空间

这是为那些想直观了解人工神经网络中神经元内部工作的人准备的。你只需要一个…

towardsdatascience.com](/how-a-neuron-in-a-2d-artificial-neural-network-bends-space-in-3d-visualization-d234e8a8374e)

好吧,假设我们肩负着一项“拯救世界”的任务,那就是找到一种方法来找出导致新冠肺炎的冠状病毒链中的一种病毒。当政治和秘密继续的时候,你把你的手放在在黑暗网络上泄露的最终数据库上。

病毒耐热和耐辐射矩阵

分别是 X 轴和 Y 轴上的 耐热耐辐射矩阵 。令人讨厌的导致疫情病毒的种群是红色的,而其他“相对无害”的是其他看起来无害的绿色和黄色。

让我们一步一步地解决这个问题,或者说一步一步地解决。

只有一条线的边界,又名 2D 神经元

红线给了我们 第一个边界 ,我们可以自豪地报告,致命的冠状病毒只能 在线的左侧 (蓝色阴影区域)。右边的任何东西(红色阴影区域)只是一个普通的旧病毒。

单神经元神经网络

从我们的第一个故事中我们已经知道,在*面上使用线 的 分类只不过是一个具有两个输入神经元的表示。这还不能解决整个问题,但绝对是一个好的开始!

这条红线的方程式是“x-y-3=0”,但再次从我们这个系列的第一个故事中,我们知道得更清楚——一条线只不过是 2 个*面的交点。

没有激活的“x-y-3”神经元的 3D 输出

神经元输出的不是一条线,实际上 是一个*面与红线*** 上的** 温度-辐射*面 相交。下面是神经元及其输出 没有 任何激活的样子。*

现在,让我们在这个输出之上应用一个简单的 sigmoid 激活,事情开始变得非常有趣。

具有乙状结肠激活的“x-y-3”神经元的 3D 输出

中的 非线性输出景观:

蓝色 是冠状病毒可能驻留的地方。绿色的 斜坡 是我们逐渐从日冕之地爬向*原老病毒之地的地方。红色的 是只有普通病毒呆的地方。

具有乙状窦激活的“x-y-3”神经元的 3D 输出的“俯视图”

如果您查看此输出的 顶视图 ,它会折叠回 2D,看起来非常类似于我们之前看到的带有网格线的图表。如果你只能从这个故事中学到一件事,那应该是这样一个事实,即使你在 2D 看一个神经元输出,* 颜色实际上代表了神经元在 3D 中输出的强度。*

如果你已经遵循了这一点,我们准备深入兔子洞。让我们添加 3 个新的神经元到问题中,看看我们能得出什么。所以坏的冠状病毒正在…

具有 4 个神经元的边界

  1. 红色 直线 x-y-3=0
  2. *****右* 线-x+y-3=0
  3. 紫色x+y-3 = 0 线**
  4. 绿色x+y+3 = 0****

免责声明:绿线与任何中东争端无关

具有 4 个具有 sigmoid 激活的神经元的神经网络

只需从彩色线条 中使用 参数画一些圆圈和箭头,就可以将简单的线图转化为看起来复杂的神经网络!我们已经在我们的 第一个故事 中做到了这一点。**

4 个神经元的输出合在一起是一种享受。sigmoid 函数的非线性特性确保所有 4 个独立输出能够为最终组合输出带来各自的独特贡献

具有乙状结肠激活的 4 个神经元的 3D 输出

颜色组合仍然有效,但现在更好地定义了边界。蓝色山谷是冠状病毒的聚居地。绿色斜坡是我们逐渐从日冕之地爬向朴素的病毒之地的地方。红色的山是普通病毒停留的地方。

最后,从这个奇妙的景观的顶部看去。

具有乙状结肠激活的 4 个神经元的 3D 输出的“俯视图”

如前所述, 颜色代表景观 的高度,进而代表神经网络输出 的 强度。

一首缺乏想象力的诗会读作 “红色高,蓝色低,绿色在爬得慢的地方”

这里是 2D 视图和三*俯视图的并排比较。这种人工神经网络输出决不是最佳的,但它应该有助于你在任何时候查看神经网络 分类输出 时,对实际发生的事情有一种直觉。**

2D 视图与 3D 俯视图的并排比较

正如你所想象的,具有 3 个输入*度的神经网络输出的“俯视图”将由一个位于中心的蓝色球体来表示,然后随着你向外移动而变成绿色到红色。

我将留给你最终的图像,它使用了一个 步骤 激活,而不是一个 s 形。果然,风景消失了,我们只剩下 悬崖 不奇怪,3D 俯视图与 2D 视图没有什么不同,因为阶跃函数从地板直接跳到天花板。

具有二元阶跃激活的 4 个神经元的 3D 侧视图和俯视图输出

额外阅读: 如果你想了解更多关于神奇的 非线性 给神经网络带来的创造这些惊人形状的知识,这个正在进行的系列中的 4 分钟阅读将是一个 良好的开端

** [## 为什么没有非线性的神经网络只是一条美化了的线——3D 可视化

在本系列的第一部分,我们创建了一个简单的单神经元神经网络的可视化,以告诉苹果…

towardsdatascience.com](/why-a-neural-network-without-non-linearity-is-just-a-glorified-line-3d-visualization-aff85da10b6a)**

神经网络如何解决异或问题

原文:https://towardsdatascience.com/how-neural-networks-solve-the-xor-problem-59763136bdd7?source=collection_archive---------0-----------------------

以及为什么隐藏层如此重要

作者图片

感知器是一种分类算法。具体来说,它是一个线性二元分类器。它是由弗兰克·罗森布拉特在 20 世纪 50 年代末发明的。

感知器基本上是作为一个阈值函数工作的——非负输出被放入一个类,而负输出被放入另一个类。

虽然有很多关于神经网络及其变体的讨论,但我们将讨论一个突出单层感知器和多层感知器之间主要差异的具体问题。

目录

**The Perceptron**
   Structure and Properties
   Evalutation
   Training algorithm**2d Xor problem  
**   The XOR function**Attempt #1: The Single Layer Perceptron** Implementing the Perceptron algorithm
   Results
   The need for non-linearity**Attempt #2: Multiple Decision Boundaries
**   Intuition
   Implementing the OR and NAND parts**The Multi-layered Perceptron
**   Structure and Properties
   Training algorithm**Attempt #3: The Multi-layered Perceptron
**   Implementing the MLP
   Results

组织和性能

感知器有以下组件:

  • 输入节点
  • 输出节点
  • 激活功能
  • 权重和偏差
  • 误差函数

具有 2 个输入节点的单层感知器的表示——作者使用 draw.io 绘制的图像

输入节点

这些节点包含网络的输入。在任何迭代中——无论是测试还是训练——这些节点都被传递来自我们数据的输入。

权重和偏差

当我们谈论“训练”一个模型时,这些参数是我们更新的。它们被初始化为某个随机值或设置为 0,并随着训练的进行而更新。偏差类似于独立于任何输入节点的权重。基本上,它使模型更加灵活,因为你可以“移动”激活函数。

估价

输出计算很简单。

  • 计算输入和权重向量的点积
  • 加上偏见
  • 应用激活功能。

这可以这样表达:

这通常被简化为权重和输入向量加上偏差的点积。

激活功能

该函数允许我们以更有意义的方式拟合输出。例如,在简单分类器的情况下,比如说-2.58的输出对于分类没有多大意义。如果我们使用称为 sigmoidal 激活函数的东西,我们可以在 0 到 1 的范围内拟合它,这可以直接解释为属于特定类的数据点的概率。

尽管有很多种激活函数,我们将为我们的感知器使用一个简单的线性激活函数。线性激活函数对其输入没有影响,并按原样输出。

分类

感知器如何给一个数据点分配一个类?

我们知道一个数据点的评估由关系式wX + b表示。我们定义一个阈值( θ )来对我们的数据进行分类。通常,对于感知器,该阈值被设置为 0。

因此,wX + b大于或等于 0 的点将属于一个类别,而其余的点(wX + b为负)被分类为属于另一个类别。我们可以这样表达:

训练算法

为了训练我们的感知机,我们必须确保我们正确地对所有的训练数据进行分类。请注意,这与您训练神经网络的方式不同,在神经网络中,您不会尝试正确分类您的整个训练数据。在大多数情况下,这将导致所谓的过度拟合。

我们通过计算梯度或δw 来开始训练算法。它是下式的乘积:

  • 对应于该权重的输入节点的值
  • 实际值和计算值之间的差异。

我们通过简单地用计算出的梯度乘以学习率来增加我们的原始权重,从而得到我们的新权重。

这是如何工作的一个简单的直觉:如果我们的感知器正确地分类了一个输入数据点,actual_value — computed_value将是0,并且我们的权重不会有任何变化,因为梯度现在是0

2D 异或问题

在异或问题中,我们试图训练一个模型来模仿 2D 异或函数。

异或函数

该函数定义如下:

XOR 真值表—作者图片

如果我们画出来,我们会得到下面的图表。这就是我们想要分类的。您在图例中看到的⊕(“o-plus”)符号通常用于表示 XOR 布尔运算符。

XOR 输出图—作者使用 draw.io 绘制的图像

我们的算法——不管它是如何工作的——必须正确地输出 4 个点中每一个点的 XOR 值。我们将把这建模为一个分类问题,因此Class 1将表示 XOR 值 1,而Class 0将表示值 0。

尝试 1:单层感知器

让我们用单层感知器来模拟这个问题。

输入数据

我们将在其上训练模型的数据是我们看到的 XOR 函数的表。

**Data         Target
[0, 0]         0
[0, 1]         1
[1, 0]         1
[1, 1]         0**

履行

进口

除了通常的可视化(matplotlibseaborn)和数字库(numpy),我们将使用itertools中的cycle。这是因为我们的算法无限地循环通过我们的数据,直到它成功地正确分类整个训练数据,而中间没有任何错误。

数据

接下来,我们创建训练数据。这些数据对于每种逻辑门都是一样的,因为它们都接受两个布尔变量作为输入。

培训功能

这里,我们无限地循环数据,跟踪我们正确分类了多少连续的数据点。如果我们设法在一段时间内对所有东西进行分类,我们就终止了我们的算法。

如果没有,我们重置我们的计数器,更新我们的权重并继续算法。

为了可视化我们的模型是如何执行的,我们创建了一个数据点的网格,或者说一个网格,并在网格中的每个点上评估我们的模型。最后,我们根据模型的分类给每个点着色。因此,Class 0区域将被分配给属于该类的点的颜色填充。

感知器类

为了把所有的东西放在一起,我们用我们刚刚讨论过的函数创建了一个简单的Perceptron类。我们有一些实例变量,如训练数据、目标、输入节点数和学习率。

结果

让我们创建一个感知器对象,并在 XOR 数据上训练它。

你会注意到训练循环永远不会终止,因为感知器只能收敛于线性可分的数据。线性可分离数据基本上意味着您可以用 1D 的一个点、2D 的一条线、3D 的一个*面等来分离数据。

感知器只能收敛于可线性分离的数据。因此,它不能模仿异或函数。

请记住,感知器必须一次性正确地对整个训练数据进行分类。如果我们连续记录有多少点被正确分类,我们会得到这样的结果。

超过 100 个训练周期的 correct_counter 的值-作者提供的图像

该算法仅在correct_counter达到 4 时终止——这是训练集的大*——因此这将无限期地继续下去。

对非线性的需求

很明显,单个感知器不能满足我们的目的:类不是线性可分的。这归结为一个事实,即单一的线性决策边界是行不通的。

非线性允许更复杂的决策边界。我们的 XOR 数据的一个潜在决策边界可能是这样的。

我们的 XOR 模型的潜在非线性决策边界—作者使用 draw.io 绘制的图像

2d XOR 问题—尝试 2

我们知道模拟 XOR 函数需要非线性的判定边界。

但是为什么我们必须坚持单一的决策边界呢?

直觉

让我们首先将 XOR 函数分解成它的 AND 和 OR 对应物。

两个布尔变量 A 和 B 上的 XOR 函数被定义为:

让我们将A.~AB.~B加到等式中。因为它们都等于 0,所以等式仍然有效。

让我们重新安排术语,这样我们可以从第一部分中抽出A,从第二部分中抽出B

进一步简化,我们得到:

使用布尔代数的德摩根定律:~A + ~B = ~(AB),我们可以这样替换上式中的第二项:

让我们分别用 x1 和 x2 代替 A 和 B,因为这是我们在数据中使用的约定。

XOR 函数可以浓缩为两部分:一个 NAND 和一个 OR 。如果我们可以分别计算这些,我们可以使用AND 门合并结果。

让我们把公式的 OR 部分称为第一部分,把 NAND 部分称为第二部分。

建模 OR 零件

我们将像以前一样使用相同的感知器类,只是我们将在训练数据上训练它。

OR 真值表—作者使用 draw.io 绘制的图像

这是收敛的,因为 or 函数的数据是线性可分的。如果我们像第一次尝试那样绘制正确分类的连续数据点的数量,我们会得到这个图。很明显,在迭代 50 次左右,它达到了值 4,这意味着它对整个数据集进行了正确的分类。

correct_counter 测量被我们的感知器正确分类的连续数据点的数量

我们或感知器的正确计数图——作者图片

决策边界图如下所示:

我们的或感知器的输出图—作者的图像

模拟 NAND 部分

让我们进入第二部分。我们需要模拟一个与非门。就像 OR 部分一样,我们将使用相同的代码,但在 NAND 数据上训练模型。所以我们的输入数据应该是:

NAND 真值表—作者使用 draw.io 制作的图片

经过训练后,下面的图表明,我们的模型收敛于 NAND 数据,并完美地模拟了 NAND 门。

NAND 感知器的决策边界和正确计数器图—作者图片

将所有东西整合在一起

从中可以清楚地看出两件事:

  • 我们对两个逻辑门的输出执行逻辑“与”(其中第一个是“或”,第二个是“与非”)
  • 并且两个函数被传递相同的输入(x1 和 x2)。

让我们将这个模型应用到我们的网络中。首先,让我们把我们的两个感知机看作是黑盒。

我们模型的*面图——作者使用 draw.io 绘制的图像

在添加了我们的输入节点 x_1 和 x_2 之后,我们最终可以通过一个简单的函数来实现这一点。

添加输入节点—作者使用 draw.io 生成的图像

最后,我们需要一个 AND 门,我们将像刚才一样训练它。

我们的和感知器的正确计数和输出图。—作者图片

我们现在拥有的是一个模拟 XOR 函数的模型。

如果我们要实现我们的 XOR 模型,它看起来会像这样:

如果我们从我们的模型(基本上是我们的 OR 和 n AND 模型的 AND)中绘制决策边界,我们会得到这样的结果:

我们第二次尝试的输出图,显示了我们的 XOR 数据的正确分类——作者使用 draw.io 生成的图像

在所有 2 个输入逻辑门中,XOR 和 XNOR 门是唯一不可线性分离的。

尽管我们的模型是可行的,但对于大多数非线性分类或回归任务来说,它似乎不是一个可行的解决方案。真的是具体到这个案例,绝大多数问题都不能拆分成仅仅是简单的中间问题,可以单独解决,然后再组合。对于这样的事情:

一个二*的二元分类问题——作者使用 draw.io 的图片

潜在的决策边界可能是这样的:

符合我们示例的潜在决策边界—作者使用 draw.io 绘制的图像

我们需要寻找一个更通用的模型,它将允许非线性的决策边界,就像上面的曲线一样。让我们看看 MLP 是如何解决这个问题的。

多层感知器

MLP 的所有组件,如输入和输出节点、激活函数、权重和偏差,都与我们刚刚在感知器中讨论的相同。

最大的区别?MLP 可以有隐藏图层。

隐藏层

隐藏层是那些具有除输入和输出节点之外的节点的层。

MLP 通常被限制为只有一个隐藏层。

隐藏层允许非线性。隐藏层中的节点与输出节点没有太大的不同:先前层中的节点用它们自己的权重和偏差连接到它,并且通常用激活函数计算输出。

多层感知器的一般结构——作者使用 draw.io 绘制的图像

激活功能

还记得我们在感知器模型的输出节点上使用的线性激活函数吗?还有几个更复杂的激活函数。你可能听说过sigmoidtanh函数,它们是一些最流行的非线性激活函数。

激活函数应该是可微的,这样网络的参数可以用反向传播来更新。

训练算法

虽然输出生成过程是感知器的直接扩展,但更新权重并不那么简单。这就是反向传播的由来。

反向传播是一种从输出层一直到起点更新模型权重和偏差的方法。其背后的主要原理是,每个参数的变化与其对网络输出的影响程度成比例。对模型输出几乎没有任何影响的权重将显示出非常*的变化,而具有较大负面影响的权重将显著变化,以提高模型的预测能力。

反向传播是一种算法,用于根据误差函数的梯度更新模型的权重和偏差,从输出层一直到第一层。

更新权重的方法直接来自求导和链式法则。

当谈到反向传播时,有很多内容需要讨论。它有自己的文章。所以如果你想了解更多,可以看看 Simeon Kostadinov 的这篇精彩文章。

[## 理解反向传播算法

了解神经网络最重要组成部分的具体细节

towardsdatascience.com](/understanding-backpropagation-algorithm-7bb3aa2f95fd)

尝试 3:多层感知器

建筑

对于网络的隐藏层数或每层中的节点数没有固定的规则。最佳性能的模型是通过反复试验获得的。

网络的架构指的是它的一般结构——隐藏层的数量、每层中节点的数量以及这些节点如何相互连接。

让我们用一个有两个节点的隐藏层。我们将在每个隐藏层节点中使用 sigmoid 函数,当然还有输出节点。

我们 MLP 的最终建筑——作者使用 draw.io 绘制的图像

履行

这里使用的库如 NumPy 和 pyplot 与感知器类中使用的相同。

训练算法

这里的算法略有不同:我们对训练数据进行固定次数的迭代——准确地说是num_epochs。在每次迭代中,我们进行一次前向传递,然后进行一次后向传递,根据需要更新权重和偏差。这被称为反向传播。

乙状结肠激活功能

这里,我们定义一个 sigmoid 函数。如前所述,它应用于每个隐藏层节点和输出节点的输出。它是可微的,因此它允许我们舒适地执行反向传播来改进我们的模型。

它的派生也是通过_delsigmoid函数实现的。

向前和向后传球

在前向传递中,我们多次应用wX + b关系,并在每次调用后应用 sigmoid 函数。

在反向传递中,实现为update_weights函数,我们计算 6 个权重和 3 个偏差相对于误差函数的梯度,并通过因子learning rate * gradient.更新它们

最后,classify 函数按预期工作:由于 sigmoid 函数输出 0 到 1 之间的值,我们简单地将它们解释为属于特定类的概率。因此,大于或等于 0.5 的输出被归类为属于Class 1,而那些*于 0.5 的输出被称为属于Class 0

MLP 级

让我们通过创建一个 MLP 类将所有的东西集合在一起。我们刚才讨论的所有功能都放在里面了。plot函数与Perceptron类中的函数完全相同。

结果

让我们用0.2倍于5000倍的学习率来训练我们的 MLP。

如果我们绘制损失函数的值,我们在大约 5000 次迭代后得到下面的图,表明我们的模型确实收敛了。

我们 MLP 5000 多个时代的损失图—作者图片

这里用我们的广义神经网络或 MLP 创建了一个清晰的非线性决策边界。

决策边界图,显示决策边界和类别——由作者提供的图像

注意#1:添加更多的层或节点

添加更多的层或节点会产生越来越复杂的决策边界。但这也可能导致所谓的过度拟合,即模型在训练数据上达到非常高的精度,但无法推广。

Tensorflow 神经网络游乐场是一个很好的资源,您可以在那里尝试不同的网络架构并查看结果。

[## 张量流-神经网络游乐场

这是一种构建从数据中学习的计算机程序的技术。它非常松散地基于我们如何思考…

playground.tensorflow.org](http://playground.tensorflow.org/#activation=sigmoid&batchSize=30&dataset=xor&regDataset=reg-plane&learningRate=0.1&regularizationRate=0&noise=0&networkShape=2&seed=0.21709&showTestData=false&discretize=true&percTrainData=70&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false&batchSize_hide=false)

注意#2:选择损失函数

我们在 MLP 模型中使用的损失函数是均方损失函数。虽然这是一个非常流行的损失函数,但它对数据做了一些假设(比如它是高斯型的),并且在分类问题上并不总是凸的。这里使用它是为了更容易理解感知机如何工作,但对于分类任务,有更好的替代方法,如二进制交叉熵损失。

[## 训练深度学习神经网络——机器学习掌握时如何选择损失函数

使用随机梯度下降优化算法来训练深度学习神经网络。作为…的一部分

machinelearningmastery.com](https://machinelearningmastery.com/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/)

代码

你可以在这里找到这篇文章的全部代码。

[## Polaris 000/blog code/xorperceptron . ipynb

这篇文章的示例代码可以在这里找到。

github.com](https://github.com/Polaris000/BlogCode/blob/main/XOR_Perceptron/xorperceptron.ipynb)

结论

生产或研究中使用的神经网络从来没有这么简单,但它们几乎总是建立在这里概述的基础之上。希望这篇文章能给你一些关于如何建立和训练感知器和香草网络的想法。

感谢阅读!

非政府组织如何在不破产的情况下利用人工智能

原文:https://towardsdatascience.com/how-ngos-can-leverage-ai-without-breaking-the-bank-919287fdca50?source=collection_archive---------36-----------------------

人工智能不是——也不应该——只留给最赚钱的企业。

这篇文章最初是在 TechHQ 上 发表 。增加了插图。

当你想到利用人工智能(AI)的组织类型时,非政府或非营利组织(NGO)不会跃入脑海。

人们经常看到大型科技公司和风投支持的公司在拓展人工智能的可能性。由于资源和员工时间有限,对人工智能的投资似乎超出了非政府组织的能力范围。

然而,也有非营利组织利用人工智能取得惊人成果的例子。只要看看 Wildbook 就知道了,这是一个由保护技术非营利组织 Wild Me 开发的开源*台。

Wildbook 利用人工智能通过它们独特的皮毛图案或其他标志性特征来识别单个动物——它们帮助世界各地的保护主义者识别濒危物种,如 猎豹鲸鲨长颈鹿

识别个体鲸鲨:野生本

人工智能不是——也不应该——只留给最赚钱的企业。它可以帮助推动非政府组织内部的创新,并帮助解决我们今天面临的许多最棘手的环境和社会问题。

根据这份 Salesforce 报告,非营利组织对人工智能的使用预计将在未来两年增长 361%。

但是上面的例子更多的是一个例外而不是常态。现实情况是,大多数非政府组织没有利用人工智能,或者他们不知道从哪里开始。当拥有数百万美元预算的企业无法有效使用人工智能时,非政府组织如何用最少的资源做到这一点?

强大的用例

将人工智能应用于社会公益:图片来源:麦肯锡报告

非政府组织应该从人工智能的需求开始,问问自己想做什么。

它们需要自动化吗?人工智能可能能够使用计算机视觉来识别野生动物 识别 动物并跟踪它们的运动,但它也可以帮助非营利组织优化他们的内部流程并疏导宝贵的资源——它可以帮助他们决定在哪里建立学校或者如何优化土地使用 。

非政府组织也可以根据过去的数据,使用人工智能来预测未来的事件,如偷猎或砍伐森林。这使他们能够主动做出决策,防患于未然。

例如,Terrafuse 通过将历史数据与实时卫星图像和模拟相结合来预测森林野火。非营利组织可以使用麦肯锡发布的报告来确定他们的需求。

收集数据

众包数据集的标签:企鹅观察

数据是 AI 的先决条件。在确定了他们的用例之后,非政府组织需要找到创造性的方法来收集相关数据,以训练他们的人工智能算法。

例如,一个希望训练人工智能识别大象的组织可以使用经过策划的开源 数据集 或公开的游客照片。

一旦他们有了数据,他们需要标记它。这也可以在众包的公共帮助下完成。难民例如, 开发了一款应用 ,让那些因冲突而背井离乡的人通过智能手机“训练”人工智能算法来赚钱。

寻找资源

物种分类公共 API 微软 AI for Earth

非政府组织可以通过寻找免费的 来快速跟踪他们的 AI 模型开发,这些库建立在流行的 机器 学习 *台 上。或者,他们可以遵循众包路线,利用公共帮助来建立模型。

例如,Kaggle,一个由数据科学家组成的在线社区,举办比赛来支持人工智能的发展。该*台定期与非政府组织合作举办比赛,如自然学家和野生动物学会 iWildcam 等,以解决物种分类的挑战。

作为建立人工智能模型的替代方案,非政府组织可以寻找现成的 API,提供公共的、现成的解决方案,如 微软 API

固定支架

非政府组织可以申请资金支持或免费计算资源来资助他们的工作。

微软 AI for Earth谷歌 AI for Social GoodAWS Imagine Grant这样的倡议在全球范围内选择非营利组织,并提供财务、技术和实施支持。

毫无疑问,人工智能可以帮助非营利组织推进他们的使命,让世界变得更美好。然而,像任何组织一样,他们必须有一个计划来启动他们的人工智能之旅。

通过确保他们心中有一个明确的问题,为算法提供高质量的数据,以及一些财政支持,非政府组织可以充分利用人工智能所能提供的一切。

自然语言处理是如何发展成金融情绪分析的

原文:https://towardsdatascience.com/how-nlp-has-evolved-for-financial-sentiment-analysis-fb2990d9b3ed?source=collection_archive---------24-----------------------

资料来源:联合国人类住区规划署

我们还需要人类去阅读无聊的财务报表吗?

机器学习模型旨在学习其输入数据的良好表示,以执行其任务。*年来,模型学习用自然语言处理(NLP)来表示单词的方式已经发生了变化,在本文中,我们将探讨模型如何理解语言以做出财务决策的显著变化。

我们关注 NLP 在金融市场中的直接应用:自动对文本文档进行情感分类,从而做出快速准确的投资决策,避免人为偏见。

为了更有意义地比较不同的技术变革,我们使用了一个金融短语库 [1],其中包含带标签的金融短语(如下例所示):

来源:好债还是坏账:检测经济文本中的语义指向[1]

词汇袋/词典方法

金融情绪分类的创始人:蒂姆& # 183;拉夫兰和比尔& # 183;麦克唐纳。来源

如果我们想让一个 8 岁的孩子解释上面的短语,我们可以给她一个带有积极、中性和消极标签的单词列表,并让她告诉我们文本中是否包含这些单词——这基本上就是词典方法。最流行的金融词典是拉夫兰·麦克唐纳词典。如果您有兴趣尝试一下,请使用这个运行速度非常快的代码片段

使用 LM 的整体准确性并不高— 61% [1]。因此,尽管我们可以快速地对一个文本序列进行分类,并理解我们为什么要对它们进行分类,但我们仍然非常依赖那些在字典中有一席之地的单词。即使这样,单词也只有一*。也许在更高的*度上,比如 300,我们会有更好的结果来代表每一个单词?

嵌入

嵌入将序列中的每个单词投影到多*空间中。我们可以把嵌入想象成一个宽的查找表——我们有 300 列,单词充当查找索引。

以埃隆·马斯克最*影响市场的推文为例

SOTA 嵌入很可能是 ELMO 的[2]语境嵌入,即嵌入考虑到单词及其周围的语境。嵌入有三个组成部分:两个来自双向上下文表示,一个是上下文无关的表示。

如果 Elmo 在 NLP 中每次有人用他的名字都会收到一分钱。资料来源:联合国人类住区规划署

嵌入本身仅仅是表象——仅仅是表象并不能对情感进行分类。因此,我们必须训练一个模型,使用嵌入作为输入,并学习预测情绪。我找不到任何测试短语库的论文,所以我在这里做了一个快速实验。

:没有我想象的那么快——张量流/keras 比我记忆中的要更不确定/痛苦。最后,我从一个名为 pymagnitude 的即插即用库中取出了这些嵌入,并使用了我可信赖的 ol’random forest。

整体准确率上升到了 78%。比 LM 字典高,但还是不邪乎。嵌入能够从单词创建多*表示,但是即使嵌入是上下文相关的,它也只是单层表示,不管*度有多大。是时候探索一种高*度的多层表示,即深度学习了。

深度学习

资料来源:联合国人类住区规划署

最*在架构和训练方法方面的进步极大地改善了深度学习模型学习语言和执行下游任务的方式。

transformer 架构和BERT【4】无需进一步介绍——参考这篇精彩文章了解更多信息——但简而言之,自我关注和令牌屏蔽的使用允许学习真正的双向上下文关系。

NLP 中迁移学习的使用最早是在ul mfit【5】中引入的,其中网络首先学习从庞大的文本语料库中预测最可能的单词,然后使用语言建模中预先训练的权重来执行其他任务——这导致了收敛性的改善,并减少了对庞大的带标签数据集的需求。

有一篇很好的论文,FinBERT ,将 BERT 和迁移学习应用于短语库,达到了 97% 的准确率!顺便说一句,如果你有兴趣看看如何使用 FinBERT 来交易企业申报情绪,我制作了一个视频,带你了解从解析申报到回测结果的整个过程!

下一步是什么?

资料来源:联合国人类住区规划署

我们完事了吗?当我们啜饮马提*酒时,机器能分析金融文件并产生准确客观的情绪吗?我们是否不再需要人类分析师来仔细阅读大量财务报表,并时刻警惕彭博的头条新闻?

不完全是。

当前的 BERT 模型存在实际限制,如计算成本随输入长度的二次增加——最大输入长度通常上限为 512/1024 个令牌。改革者龙前是最*的论文,试图通过简化自我关注机制来解决。

此外,BERT 不能做心算——它只包含文本表示。这是机器完全理解和分析通常包含大量数字的金融文档的主要瓶颈。我发现的一篇论文试图用一个做基础数学的程序来增强 BERT——但在 BERT 能够进行人类水*的推理之前,可能要等待很长时间。* *更新:open ai 发布的 GPT-3 无需事先训练就能进行零炮计算!

最重要的是,金融文本可能是不明确的,并且通常需要文本本身无法提供的上下文知识 BERT 实现的高准确性是在人类注释者之间 100%一致的短语上。甚至人类都不同意的其他短语使得机器不太可能胜过人类分析师。更有可能的是,一种量化方法将主导市场,金融分析师通过机器学习得到增强,以做出准确、快速和客观的投资决策。

你认为金融情绪分析的下一步是什么?留下评论。

[1] Pekka Malo、Ankur Sinha、Pekka Korhonen、Jyrki Wallenius 和 Pyry Takala。2014.好债还是坏账:探测经济文本中的语义指向。信息科学与技术协会杂志 65,4 (2014),782–796。https://doi.org/10.1002/asi.23062arXiv:arXiv:1307.5336 v2

[2] Loughran,t .和 Mcdonald,b.《什么时候责任不是责任?文本分析、字典和 10-k。《金融杂志》第 66 期,2011 年第 1 期,第 35 期第 65 页。

[3]马修·彼得斯、马克·诺依曼、莫希特·伊耶、马特·加德纳、克里斯托弗·克拉克、肯顿·李和卢克·塞特勒莫耶。2018a。深层语境化的词语表达。在 NAACL。

[4]雅各布·德夫林、张明蔚、肯顿·李和克里斯蒂娜·图塔诺瓦。Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805,2018。

[5]霍华德和鲁德。用于文本分类的通用语言模型微调。计算语言学协会(ACL),2018。

北美最大的杂货配送服务如何利用数据科学适应新冠肺炎

原文:https://towardsdatascience.com/how-north-americas-largest-grocery-delivery-service-adjusted-to-covid-19-using-data-science-2450f1642396?source=collection_archive---------47-----------------------

随着用户需求的增加,优化算法和利用机器学习来扩展复杂数据集的需求也在增加

Adobe Stock Photos 提供

Instacart 以独特的方式将零售购物和电子商务结合在一起。在全球化的疫情时代,越来越多的消费者使用网上购物来替代传统的杂货店购物。商店提供网上下单和提货服务。送货服务达到了历史最高水*。我很好奇 Instacart 的数据科学团队如何调整他们的计划,并解决他们最初在 2019 年提出的挑战。

根据 Instacart 高级数据科学家is hant Nayer的演讲,在 DSSInsider 上观看 完整视频,并与我一起参加 DSS 零售/Ecomm 虚拟体验。

Instacart 是什么?

Instacart 是一家零售和电子商务公司,在美国和加拿大提供杂货交付和提货服务。你可以通过他们的手机应用程序或网站使用这项服务。Instacart 作为一个四方市场运作,服务于客户、零售商、第三方市场和购物者。你可以选择各种食品杂货、酒类、医疗保健和个人用品。

工作原理:

  1. 输入您的邮政编码,查找当地参与的零售商,如 Pulix 或 Safeway
  2. 选择您的商品并在一天中的任何时间下订单
  3. 购物者去商店为你收集商品,并把它们送到你家门口

数据挑战

该目录正在接收和创建可供客户使用的商品的所有数据。该数据目录包含来自北美 20,000 家商店的 300 多家不同零售商的 5 亿多种商品。这是一个庞大的数据集,每天都要处理并保持干净。这些物品中的每一个都有大约二十到三十种不同的属性,例如,价格、大*和位置。该目录在规模上变成了一个非常复杂的数据集,包含了所有的属性。有两类主要的属性需要组织。这些数据来自零售商、CPG 制造商和第三方整合商。

店铺特定属性:产品价格、供货情况、库存

产品特定属性:图片、位置、重量、尺寸、是否按单位或磅出售、营养信息

什么会出错?对于所有这些复杂的数据集,有时会出现产品描述与图片不匹配、没有图片或产品分类错误等问题。

解决方案

让一个人全天候坐在电脑前试图捕捉每一个错误是不可能的。算法需要每天定期捕捉这些问题。每个产品属性至少有 10-15 种算法。Instacart 还使用定义的试探法来告诉团队哪些地方不准确。该团队定义什么可能是错误的,然后开发数据的真实来源,并为产品设置检查。

为了帮助产品转换,该团队还需要确保图像是高质量的,由地区测量标准准确定义,以适当的销售单位列出,并用品牌正确命名。正在开发图像检测模型来修复图像,并帮助改善我们零售商的真实数据来源。这将能够从图像中提取文本、品牌名称、营养信息和产品描述。当能够扩展该解决方案时,它将提高我们的数据质量,并波及到业务的其他技术方面。

Instacart 如何适应 COVID 挑战

问:在 COVID 期间,Instacart 如何进行整体调整以服务客户?

Ishant: Instacart 很好地适应了 COVID 时代的消费者需求。他们加入了新的零售商,这意味着他们的目录中增加了数百万件新商品。Instacart 的主要主张来自于这样一个事实,即他们允许零售商添加具有任何类型信息的任何商品,并且他们将使用他们的目录系统来处理这些商品,以满足 Instacart 的要求。正如我在上面的话题中所讨论的,困难的部分已经在去年过去了。从现在开始,只是增加新的自动化零售商。由于 COVID 的限制,许多人开始使用 Instacart 来满足他们的杂货需求,Instacart 可以快速满足这些不断增长的用户需求。

问:在 COVID 期间,领导者如何利用数据作为工具来应对挑战?

Ishant: COVID 改变了购物、房地产购买、流媒体和更多行业的许多趋势。对于领导者来说,倾听客户的意见非常重要,而数据是做到这一点的最佳资源之一。关键绩效指标(KPI)是一组指标,领导者密切关注这些指标以了解其业务的健康状况。从我作为数据科学家的职业经历来看,每个领导者都会查看关于他们的业务指标和预测趋势的每日报告,以了解他们的位置和下一步该做什么。在 COVID 期间,定期听取您的分析团队和他们的见解是领导者保持领先地位必须做的事情之一。这将有助于他们管理资源和运营,并了解公司下一步的工作重点。对于 Instacart 来说,数据帮助他们了解需要雇用多少人才能满足不断增长的需求。

问:作为一名数据科学家,在 COVID 期间,您如何看待复杂数据集的管理变化?

Ishant:数据集的管理总是在变化并适应当前的情况。这是他们的基本法。在 COVID 期间,许多公司改变了策略以满足客户的需求。这意味着模型和数据集在不断变化,以保持最新,并持续提供客户现在所要求的内容。

结论

新冠肺炎改变了购物行为,网上订单的数量在过去几个月里显著增加。利用数据科学,Instacart 能够扩展其交付服务并适应不断增长的在线购买数量,而不会影响服务质量。Instacart 中的算法能够检测产品描述中的错误或在线目录中产品的错误分类,从而避免分析团队花费冗长的工作时间进行手动错误检测,并使他们能够专注于获得有价值的见解,以做出更好的决策,并从根本上改善整体客户体验。

如何不被数据科学淹没

原文:https://towardsdatascience.com/how-not-to-be-overwhelmed-with-data-science-5a95ff1618f8?source=collection_archive---------26-----------------------

让数据科学再次变得有趣

马修·费雷罗在 Unsplash 上的照片

动机

如果你想学习数据科学,有许多资源可供你学习。由于学习数据科学的需求很高,因此有成千上万的数据科学课程、书籍、图书馆来帮助初学者进入该领域。

这很好,因为你不需要自己解决所有问题。但这也带来了不利的一面,那就是你成为了不知所措的资源,不知道从哪里开始。

即使是对一些数据科学概念比较熟悉的人,很多人还是觉得自己是初学者,尽量多上一些课程,掌握所有的概念和技术。

如果你的目标是掌握数据科学中的所有概念和工具,你将永远无法实现。

更聪明地工作,而不是更努力

相反,你可能想要的是拥有相关知识,从你正在处理的数据中获得洞察力,并为你的公司交付理想的结果。这个目标是可以实现的,这篇文章将向你展示如何让自己了解对你来说重要的事情。

从一个问题开始,然后寻找资源来回答你的问题

不要学习很多数据科学的课程,而是掌握基础知识,然后开始解决项目。你可能不知道处理项目的所有步骤。没关系,事实上,这是意料之中的。

通过参与现实世界的项目,你将开始问一些现实的问题,例如

  • 我的数据有许多特征,我应该保留所有这些特征还是只挑选相关的特征?
  • 我的数据有很多空值,有没有一种算法可以不用处理这些空值?
  • 如果我想预测一封电子邮件是否是垃圾邮件,我应该从哪里开始?我应该使用哪种算法?

一旦你形成了这些问题,你就可以开始在谷歌上搜索答案。你会惊讶地发现有这么多有用的资源,比如博客帖子、Youtube 视频、关于这个主题的书籍。

没有一个好的资源。只需选择一两个,然后将你学到的知识应用到你的问题中。

通过玩基础游戏来学习

一旦你找到了一些潜在的资源,你如何着手阅读这些文章或文档而不感到困惑呢?

在一些文档或博客中,可能会有很多针对初学者和高级用户的内容。有时它提供的比你实际需要的更多。

所以如果你刚学了一个新工具,试着找一个讲解基础知识的教程。介绍该工具的文章或文档中的入门部分都可以。

一旦您对该工具的功能和使用方法有了基本的了解,您就可以通过更深入地研究文档来建立另一层理解。

看到你的问题用你刚刚学到的新知识解决了,你会感到有收获!

把有用的文章留到以后

文章是学习不同数据科学概念和工具的好方法。但是你也很容易迷失在每天新的文章数量中。

而不是读了很多文章然后忘记它们。看几个,实际应用。尝试本文中介绍的概念或工具,它们可能对您当前的项目有益。

但是如果你读了那些可以作为未来参考的文章呢?我曾经使用 Instapaper 来组织我的文章,但是当我保存的文章数量变大时,我的文章就会丢失。我意识到我很少回头去看我保存的文章。

使用 Github 问题解决了我的问题。

Github 有一个 Issues 选项卡,允许用户请求关于现有代码的问题。我发现使用 Github issues 对我保存中型文章非常有效,因为它使我能够

  • 整理我的文章,以便很容易找到我的文章以备将来参考
  • 不看整篇文章,快速复习文章重点
  • 总结的艺术将帮助我更好地保留和理解信息

如果你想学习如何使用 Github issues 来保存你的文章,请查看这个资源库这篇文章

Github 恒星应该属于不同的星系

您可能会启动有用的 Github 存储库,供将来使用。但是由于你不能用 Github stars 分类,所以当你需要的时候,从你的一堆标有星号的回购中找到一个特定的回购是极其困难的。

我曾经害怕主演更多的储存库,直到我发现了星体。 Astral 从 GitHub 下载你所有的标有星号的库,并允许你使用一个简单的&直观的标记系统来组织它们。

每当你想搜索一些为你所寻找的服务的存储库,例如 NLP,你可以通过点击标签很容易地找到 repo!

如果您想将该工具与您启动的其他类似工具区分开来,您还可以记下该工具的内容。

结论

有许多学习数据科学的资源,但这不应该让你感到不知所措。创建一个有效的系统来筛选出首先要学习的重要内容,并保存你想在未来尝试的资源,这将使你不那么不堪重负。

通过这些方法,我能够快速学习对我的数据科学项目很重要的新工具和概念,并利用新知识改进我的工作流程。

如果你每天都接受新事物和学习*东西,数据科学是一个有益的领域。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。

这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 当生活不给你喘息的机会,如何学习数据科学

我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…

towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd) [## 如何在 VSCode 上使用定制的代码片段来提高效率

与其为同一段代码复制,为什么不把它保存起来以备将来使用呢?

towardsdatascience.com](/how-to-boost-your-efficiency-with-customized-code-snippets-on-vscode-8127781788d7) [## cy thon——Python 函数的加速工具

当调整你的算法得到*的改进时,你可能想用 Cython 获得额外的速度,一个…

towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd) [## Yellowbrick 简介:可视化机器学习预测的 Python 库…

您将 f1 分数提高到了 98%!但这是否意味着你的模型表现更好呢?

towardsdatascience.com](/introduction-to-yellowbrick-a-python-library-to-explain-the-prediction-of-your-machine-learning-d63ecee10ecc) [## 网刮电影数据库与美丽的汤

利用你的数据库预测下一部热门电影

medium.com](https://medium.com/analytics-vidhya/detailed-tutorials-for-beginners-web-scrap-movie-database-from-multiple-pages-with-beautiful-soup-5836828d23)

如何不构建数据科学项目

原文:https://towardsdatascience.com/how-not-to-build-a-data-science-project-baa494d98da4?source=collection_archive---------50-----------------------

项目

我一路走来所犯的错误,以及你如何在下一个项目中避免这些错误。

数据科学项目的绝对禁忌(由迪米特里·豪特曼Unsplash 上拍摄)

我知道我做错了。

我已经积累了一系列有趣而实用的项目。我有几门在线课程来展示我学到的东西。我甚至建立了一个作品集网站来展示我所有的项目和文章(你可以在这里访问)。

但是,我仍然觉得我的知识有一个缺口。一个巨大的,裂开的,裂缝大*的洞。我觉得等式里缺少了一些重要的东西。

就在那时,我在 YouTube 上看到了一些关于从头开始构建端到端数据科学项目的非常棒的播放列表。一些很好的例子是 Ken Jee 的这个,Daniel Bourke 的这个和 Data Professor 的这个。(向所有人大声喊出一些绝对精彩的内容!)

我意识到我需要开始一个端到端的数据科学项目,stat(一语双关)。尽管一开始会感到不舒服,但亲自动手并投入其中是学习新事物的最佳方式。

所以我就一头扎了进去。

直到我卡住了。又来了。

再一次。

再一次。

但是最后,经过几个*时的辛苦工作,几十次堆栈溢出搜索(感谢上帝的堆栈溢出)和在遇到一大堆错误后沮丧地用头撞墙(这没有多大帮助),我完成了。

你可以在这里查看我的最终项目。这是一个数据科学工资预测器(受 Ken Jee 的播放列表的启发和指导)。我也在做几个我自己的,这一次没有参考或指导,真正推动自己超越我理解的感知极限。

在构建这些项目的过程中,我学到了很多东西,不仅仅是从数据科学的角度,还包括如何首先解决构建这样一个项目的问题;一次又一次地犯很多错误并从中吸取教训。

以下是我以前犯过的一些错误,以及在你的下一个项目中如何避免这些错误:

错误 1:没有把我的项目做成端到端的。

通常,花费在数据科学实际应用上的大部分时间都是在数据清理和准备上。事实上,人们普遍认为大约 80%的时间花在清理数据并将其转换成适合进一步分析的形式上。

尽管可能很烦人,但数据清理是数据科学生命周期中必不可少的一步。并不是所有你在实际工作或实习中可能用到的数据集都像 Kaggle 数据集一样干净,可以随时使用。

它可能会很乱,你的工作可能是清理它,使它可以使用。

项目中同样重要的部分是生产和部署项目。最*我越来越多地听到这样一句话:

我们的项目不应该在 Jupyter 笔记本上结束它的生命。

构建其他人可以访问的项目和产品是数据科学的主要用途之一。

Jupyter 笔记本中的一堆代码通常没有实际用途,但是使用强大且易于使用的工具(如 Streamlit 或稍微复杂一点的工具(如 Flask )来构建一个简单的 Web 应用程序,以展示您所构建的内容,只需一点点额外的努力,就可以让人们更容易地看到您所构建的内容。

从坚实的基础开始,以切实可行的产品结束,这一点非常重要。

专业建议:获取你自己的数据(如果有必要的话,可以从网上搜集)。清理它,预处理它,做一些特征工程。别忘了用 Streamlit 或 Flask 来生产你的项目。

错误 2:没有把时间花在最重要的事情上。

帕累托原则(也称为80–20 法则)指出,对于许多事件来说,大约 80%的结果来自 20%的原因。类似地,在一个项目中,大约 80%的价值来自你做的 20%的事情。同样,这也意味着你可能做的 80%左右的事情并没有真正增加价值(只有 20%左右)。

我过去常常花很多时间思考和分析我的项目可以采用的不同选项或不同路径。

我不应该。

我应该开始做点什么。我本可以稍后处理选择错误的后果。

我浪费了很多时间的一个简单例子:云提供商

如果到目前为止你和我在一起,使用 Streamlit 或 Flask 制作一个项目是非常重要的。但是,同样重要的是,部署该项目以便每个人都可以访问它。

有很多方法可以做到这一点。

我开始着迷地分析和研究所有不同的选项来帮助部署我的项目。查找 AWS 和 GCP 之间的所有差异,各自的优缺点,它们提供什么实例,我可能会产生什么成本,等等。

直到我意识到我犯的错误。我只是不得不部署它。在哪里并不重要。

所以,我在 Heroku 上免费部署了它。(他们允许一次免费部署,我很大方地使用了它)。

下一次,我将把它部署在我认为最容易的地方。没有二心。

亲提示:停止思考,开始行动。利用 80-20 法则。

错误 3:没有计划最终结果会是什么样子。

如果我现在已经成功地让你相信生产化和部署是你的项目生命周期中非常重要的步骤,以及 80-20 法则的力量,那么另一个同样重要但经常被忽视的步骤就是计划最终的结果。

好吧,让我们假设到目前为止你已经同意了我的逻辑,并且你已经决定要构建一个展示你的项目的 web 应用程序。

但是这个应用程序要做什么呢?

问自己一些关于用户界面的问题,例如:

  • 它从用户那里得到的输入是什么?
  • 中,你将采用什么形式输入?
  • 你的模型会有什么样的最终结果?
  • 输出将以什么形式出现?
  • 我可以添加哪些附加功能来改善用户体验吗?
  • 有些事情是我应该不惜一切代价避免的吗?

在我的数据科学工资预测项目中,我犯了一个严重的错误,没有考虑最终的界面及其布局。当我最终到达那个阶段时,我发现用户的分类输入对我的模型没有意义,所以我不得不返回并将某些分类变量更改为顺序变量,在这个过程中浪费了一些宝贵的时间。

一开始就回答这些问题将会为你以后节省大量的时间,也可以避免你不必要地在不同的步骤之间来回奔波。我在这里使用“不必要”这个词是有原因的,这让我想到了第四个错误。

专业建议:无论以何种形式开始,对最终结果都要有一个大致的概念。如果有必要的话,在某个地方画出来。

错误 4:没有回到之前的阶段。

****数据科学生命周期(鸣谢: Chanin NantasenamatKen Jee 合作)

通常,任何项目都可以分为这 5 个主要阶段:数据收集、数据清理、探索性数据分析、模型构建和模型部署。

但是我犯的一个主要错误是认为这个过程是一系列线性的步骤,而事实上,它是一个迭代的,经常是循环的过程。

例如,在我的数据科学工资预测项目中,当我处于模型构建阶段时,我想到了一些我可以添加的更有趣的功能,作为我的模型的输入。

那我做了什么?

我一直回到数据清理和预处理步骤,不得不做一些额外的功能工程,不得不对新数据执行一些探索性的数据分析,并使用额外的功能构建另一个模型。

有时候,这些绕回来的可能是完全不必要的,比如第三个错误。

但有时,在处理数据一段时间后,你可能会有新的见解,在这种情况下,返回是正确的做法。

亲提示:在手之前尽可能多的做好计划,但是如果需要的话就圈回来。据你所知,这一点点努力可能会让你的项目变得更好。

错误#5:在项目部署后没有进行自省和评估

我完全忽略的一步,实际上可能是所有步骤中最重要的一步,是在你完成后评估你的项目。

看到哪些做对了,哪些做错了,下次如何改进。

在丹*尔·伯克着手 Airbnb 项目后,我从他的视频中了解到这个非常重要的步骤。

花些时间,分析你项目的所有步骤,反省,从中学习,然后继续前进。

没有这一步,这篇文章就不会存在。这里列出的错误是我从我的项目中学到的,我几乎可以肯定,任何人在从事自己的项目时都会犯一些错误。从中吸取教训,确保下次不会重蹈覆辙,继续前进。

亲提示:回去看看哪里做对了,哪里做错了,从中吸取教训。

犯错误没关系,只要你能从中吸取教训—匿名

最重要的是:别忘了一路上要开心。

随时联系我 LinkedIn ,查看我的GitHub了解我做过的项目,或者我个人的 网站 了解我所有的工作。**

如何(不)通过隐式转换来降低 SQL Server 的性能

原文:https://towardsdatascience.com/how-not-to-kill-your-sql-server-performance-with-implicit-conversion-e754ac2eb134?source=collection_archive---------34-----------------------

了解如何避免性能杀手并帮助 SQL Server 为查询选择最佳执行计划

莎拉·瓜尔蒂里在 Unsplash 上拍摄的照片

在我最*的文章中,我研究了使用 DATETIME 和 DATETIME2 数据类型之间的【优点】**【缺点】。这项调查似乎让我大开眼界,因为在阅读关于这些数据类型和使用 DATETIME2 时的潜在缺点的文档时,我发现了一组我需要注意的全新内容!

什么是隐式转换?

简而言之,隐式转换发生在 SQL Server 需要自动将部分数据从一种数据类型转换为另一种数据类型的时候。

在某些情况下,当您执行 JOIN s 或使用 WHERE 子句过滤结果时,您正在比较“苹果”和“橙子”——因此,SQL Server 需要将“苹果”转换为“橙子”,反之亦然。

为什么隐式转换不好?

为了解决数据类型之间的不一致,SQL Server 必须付出额外的努力并消耗更多的资源。因此,性能会受到影响,导致索引的低效使用和 CPU 的大量使用。

但是,理论已经足够了,让我们来看看隐式转换在现实中是如何影响性能的。

真实用例

我有一个包含客户发起的聊天数据的表格。这个表大约有 860 万行。其中一列是“SourceID”,是来自源系统的聊天 ID。在我的表中,该列是 VARCHAR(20) 类型,尽管所有值都只包含数字。

我在 SourceID 列上有一个惟一的非聚集索引,在 DatetmStartUTC 列上有一个索引(该索引包括所有其他外键列),所以让我们运行几个查询来检查后台发生了什么。

我还打开了 IO 和时间的统计,以便能够比较结果。最后,我打开了实际的执行计划,以便更深入地了解查询执行中的每一个具体步骤。

问题 1 又名“黑仔”

当有人在该表中执行简单的数据分析,并且只看到 SourceID 列中的数字时,完全可以编写这样的查询:

DECLARE @sourceIDi INT = 8000000

SELECT sourceID
FROM factChat
WHERE sourceID >= @sourceIDi

SQL Server 返回大约 822,000 行,这大约是整个表中数据的 10%。

人们可能会认为 SQL Server 在 SourceID 上使用了索引,但是让我们检查一下情况是否如此:

正如我们所注意到的,SQL Server 使用我们的索引,但是它没有选择执行预期的索引查找操作,而是扫描索引。如果我们将鼠标悬停在索引扫描步骤上,我们将在谓词窗格中看到发生了隐式转换,因为 SQL Server 必须在查询过程中在后台应用数据转换。

该操作对性能有许多额外的影响——仅看一些逻辑读取和 CPU 成本,我们就可以得出结论,这与最佳性能相差甚远:

问题 2 又名“好人 1”

现在,让我们检查当我们向 SQL Server 提供匹配的数据类型时,它是如何反应的:

DECLARE @sourceID varchar(20) = '8000000'

SELECT sourceID
FROM factChat
WHERE sourceID >= @sourceID

现在,SQL Server 按预期执行索引搜索,所以让我们另外检查 SQL Server 在后台做了什么来获取我们的结果:

哇,逻辑读取和 CPU 时间减少了* 10 倍!也正因为 SQL Server 在查询过程中不必努力应用隐式转换。

现在,想象一下大部分数据(记住,这个查询只返回表中 10%的数据)或大表的性能差异。

问题 3 又名“好人 2”

现在,我想向您展示帮助 SQL Server 做它最擅长的事情的另一种方法——选择执行查询的最佳计划。

我们仍然可以使用 INT 数据类型,而不是在我们的变量定义中给 SQL Server 正确的数据类型,但是我们可以稍后 显式地 告诉 SQL Server 我们想要比较“苹果”和“苹果”(在我们的例子中,VARCHAR 和 VARCHAR):

DECLARE @sourceIDi INT = 8000000

SELECT sourceID
FROM factChat
WHERE sourceID >= CAST(@sourceIDi AS VARCHAR(20))

我们在这里做了什么?我们明确地通知 SQL Server 我们希望他做什么:将 VARCHAR(20)列 SourceID 与变量的 VARCHAR(20)值进行比较。

SQL Server 对此很感激,我们可以看看结果:

一开始,索引查找操作是存在的。让我们来看看统计数据:

数字与前一次运行中的相似,因此我们可以得出结论,这两次运行几乎相同。

结论

隐式转换可能是一个巨大的性能杀手,而且特别危险,因为它不是那么明显和容易发现。

因此,我推荐阅读 Jonathan Kehayias 撰写的这篇文章,其中他提供了一个非常有用的脚本,用于识别计划缓存中的隐式转换。

此外,如果您想确定何时发生隐式转换,请直接查看由微软提供的这个超级有用的表:

数据类型优先级

数据类型优先级可以在这里找到,这有助于理解 SQL Server 将如何处理数据类型转换。例如,INT 的优先级高于 VARCHAR,这意味着 SQL Server 会将 VARCHAR 转换为 INT,而不是相反。

因此,如果您将 INT 类型的列与 VARCHAR 类型的值进行比较,您的索引仍然可以使用,因为用于比较的列不需要转换。

此外,当比较来自同一“家族”的类型(例如,INT 和 BIGINT)时,SQL Server 仍然倾向于索引查找操作,因为它足够聪明,能够识别这些情况并使用适当的索引。

总之,作为一个 一般的经验法则 :不要指望 SQL Server 的“仁慈”或者用数据类型优先来挠头——数据类型应该尽可能匹配,或者比较最终应该使用显式转换来处理。

如何(不)在初创公司中错误管理人工智能

原文:https://towardsdatascience.com/how-not-to-mismanage-artificial-intelligence-in-a-startup-95268ab0705b?source=collection_archive---------36-----------------------

我从机器学习和早期创业公司的战壕中学到的东西

来自派克斯派克斯拍摄的照片

作为一名技术创始人,我在初创公司中建立并管理了 ML 的方向。

我也犯了很多错误。

许多起源于将 ML 视为软件开发。另一些来自创业公司本身的非结构化性质。

以下是我的一些心得。

不要建人工智能创业公司(如果可以的话)

不要把 AI 作为你的核心产品。而是用 AI 来补充一个现有的产品。

用软件或硬件解决一个问题,卖掉它,然后用人工智能扩充它。或者,如果你是一名人工智能专家,加入一家现有的初创公司,成为后期联合创始人。

这样,你已经坐在数据上,并有空间去实验。

对奥迪来说,开始研究自动驾驶汽车比研究一屋子人工智能博士更容易。后者需要获得专有数据,甚至在开始之前就建立行业联系。

机器学习最好专注于边际改进。也就是说,从 100%到 110%。

从自动化简单的东西开始

在 AI+领域建立能力需要时间,不管你以前有多少经验。

在 Kaggle 竞赛中对狗的品种进行分类(提前给你分类),并不一定会转移到一个真正的领域,在那里你需要自己想出类别。

一个好的策略是找到团队成员已经在做的重复性决策,并尝试自动化这些决策。具有现有 sop 的流程是理想的。

在解决改变游戏规则的问题之前,先培养自己的能力。有趣的是,如果人类很难吸收信息并做出决定,人工智能几乎不可能做到这一点。

AI 是自动化,不是魔法

不要指望把数据扔给神经网络,然后从另一边得到解决方案。这不会发生在大公司的新闻稿之外。

通常有一个巨大的软件工程组件与人工智能集成,堆叠在多个层上,即使从外面看起来很简单。

用 AI 解决*窄题,结合领域知识把这些堆在一起。

深度学习很少产生奇迹,但随着时间的推移,渐进的改进可以产生奇迹。

训练自己的模型

你的数据就是你的护城河。你辛辛苦苦收集的。

在内部训练你的模型,而不是从大型云提供商那里向人工智能服务提供数据。

他们非常乐意将从中得到的知识传授给任何其他付费的竞争对手。这不是你想要的。

对于核心产品之外的非常微*的改进,冒这个风险是值得的。但是一般来说,不要让任何人接*你的数据。

大多数时候,这并没有那么难。

人工智能不是目标,用钱为人们解决问题才是目标

我们已经过了提到“人工智能”就能在客户中获得额外加分的阶段。炒作太多了。

现在所有人都在假装用 AI。所以,把更多的精力放在解决客户的问题上,而不是展示酷的技术。

如果他们问起人工智能,很好。否则,拿他们的钱,解决他们的问题。

不管它是如何完成的,他们都会同样高兴。

总结所有的成功和失败

实验结束后,一定要写下实验的内容和结果。这包括疯狂的成功和彻底的失败。

员工会来来去去,大脑会忘记。知识很难用好的文档来传递。

所以如果你花了几天、几周或几个月在一个项目上。把它写下来,并牢牢记住这些知识。

结论

我的经验只适用于早期阶段的创业公司,在这种情况下,我们有能力依靠一毛钱,不需要说服一百个利益相关者去尝试一些东西。

我只能猜测,如果在一个更大的组织内部,有更多的经验法则要遵循。

如果你有这方面的经验,我很乐意在评论中听到。

如何(不)用 LSTMs 预测股票价格

原文:https://towardsdatascience.com/how-not-to-predict-stock-prices-with-lstms-a51f564ccbca?source=collection_archive---------6-----------------------

股票和机器学习——天作之合。但是事情真的像看起来那么简单吗?

想成为一夜之间的百万富翁吗?这篇文章(不)适合你!【原始照片由卡罗琳娜·格拉博斯卡派克斯energepic.com派克斯

就在不久前,我突然想到了一个绝妙且“原创”的想法——如果我能利用机器学习来预测股票价格会怎么样。毕竟,时间序列可以很容易地用 LSTM 建模。我可以想象自己一夜暴富!如果这这么容易,为什么还没有人去做呢?

我对自己的光明前景非常兴奋,我打开笔记本电脑,打开谷歌,键入“预测 LSTM python 的股票价格”结果纷至沓来——很快,我意识到我的想法并不新颖。好吧,就这么多了。无论如何,我浏览了许多这样的文章,每一篇似乎都获得了令人惊讶的好结果。但是教程到此为止——没有人用真钱来测试它。为什么这些人还没有成为百万富翁?有些可疑。

作为免责声明,注意本文内容无一是理财建议,纯属教育。很明显,我知道,但还是要说出来。恰恰相反,我在努力教育你如何不被这个愚弄,开始动动脑筋。

如今,随着股票和机器学习变得如此易于操作、易于使用和容易获得,不陷入这个陷阱变得非常困难,在这个陷阱中,对这两个领域不完整、不成熟的知识会让你陷入严重的麻烦。

让我们开始学习如何不使用 LSTM 来预测股票价格。这篇文章的流程如下:

  • LSTMs 的简单介绍。
  • 用 python 获取历史股票数据。
  • 以适合 LSTM 模型的格式创建数据集。
  • 用 TensorFlow Keras 建立和训练 LSTM 模型。
  • 预测和解释结果。

LSTMs 简介

长短期记忆(LSTM)网络是一种通常用于预测时间序列数据的神经网络。简而言之,它们具有内存/缓存功能,这有助于它们了解数据中的长期依赖性和关系。因此,查看之前的 N 个数据点,他们可以通过学习模式来预测下一个(或下几个)点。

我会让这部分非常简单。如果你想更清楚地了解一个 LSTM 是如何工作的,我推荐你浏览一下,但是即使没有深入的理解,你也应该非常理解这篇文章的主旨和目的。

第一步:获取股票数据

在 python 中有多个选项可以访问历史股票价格,但是最简单的库之一是 yfinance 。非常方便和免费,它通过从雅虎财经搜集数据来完成工作。

*!pip install yfinance# Import the required libraries
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as pltfrom pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()*

在本文中,我将讨论“Reliance”的股票价格,但这也适用于所有其他工具。

下面这段代码下载 Reliance 公司 15 年来的股票价格数据,分辨率为 1 天,并将其存储在 pandas dataframe 中。你可以根据你的实验改变这些参数。

打印出*猫数据帧的头部,可以看到股票数据可用的各种参数。

*猫数据框架顶部为 Reliance 股票数据

画出“收盘”价格以可视化数据,看看股票在过去几年中上涨得有多好。2020 年 3 月的急剧下降(由于 COVID)也是可见的。但它似乎战胜了这种衰落,再次上升到一个新的高度。

Reliance 股票数据的收盘价

**在这里问自己一个问题——你认为一个 ML 模型能够捕捉所有这些随机性吗?

步骤 2:创建数据集

现在让我们修正我们的问题陈述—LSTM 模型将看到过去 10 天(称为时间步长)的收盘价,并预测第二天的收盘价。

为了简单起见,我们只测试最后 200 天。我们可以用剩下的数据进行训练。我们有 3486 个数据点进行训练(将根据您执行代码的日期而增加)。

(注意,你可以根据自己的要求改变这一点,但我觉得这应该足以表明我的观点)。

*# Get Close data
df = data[['Close']].copy()# Split data into train and test
train, test = df.iloc[0:-200], df.iloc[-200:len(df)]print(len(train), len(test))
>>> 3486 200*

现在,我们需要标准化我们的数据。 人们在这个阶段常犯的一个错误是,他们也单独对测试数据进行归一化 。但是在实际场景中,测试数据将是实时的,所以你不会事先知道最*值、最大值或*均值!如果你给模型提供来自未来的信息,你基本上最终提供了一个趋势或指导方针* ,预测价格需要遵循。我已经看到很多作者犯了这个错误,我不怪他们,因为我也花了一段时间才意识到这一点。*

为了解决这个问题,我们将使用最*和最大的训练数据来标准化测试数据。这应该是一个不错的*似值(当然,还有更好的方法,例如,只取最* N 个价格的最*值和最大值)。

最后,让我们构建数据,以便我们的 LSTM 模型可以轻松地读取它们。LSTM 需要以【样本,时间步长,特征】的形式输入。下面的代码以这种需要的格式创建数据集。

步骤 3:创建模型并训练

对于我们的模型,我们将使用 python 中的 TensorFlow Keras 库。简单的序列模型有一个 LSTM 层,然后是一个下降层(以减少过度拟合)和一个最终的密集层(我们的输出预测)。我们将使用具有*均绝对误差损失的可靠的“Adam”优化器。训练它 50 个纪元左右。记住保持 shuffle = False(因为样本的顺序很重要——这是本文的重点:P)。

模型总结如下图所示。这个模型非常*,但是你可以试着再玩几层什么的。注意不要过度拟合数据(即使是这个*模型,数据也会过度拟合)。

我们的 LSTM 模式总结

训练后,将损失绘制为:

*plt.plot(history.history['loss'], label='train')
plt.legend();
plt.show()*

培训损失

随着时间的推移,训练损失明显减少(有些波动)。这位模特似乎训练有素。还是有?我们来评价一下。

第四步:预测!

通过模型传递测试集。重新调整结果(记住,我们之前已经对其进行了标准化),最后绘制出来,看看它在视觉上的表现如何。

看看下图中的预测!他们非常好!该模型似乎也预测到了 COVID 下降!这太棒了。我们现在可以在股票市场赚几百万了!

模型的预测

大部分教程到此结束。作者的遗言是“结果看起来很有希望,调整参数,改变模型,等等”。但是等等,在你辞职成为全职交易员之前, 让我们放大一下结果吧!

放大预测

你能看出现在发生了什么吗?预测价格落后真实价格 1 个时间步长。模型只是预测一个与它看到的前一个价格接*的值,因为这是对下一个价格的最佳预测。

我来帮你简化一下。让我们在下图中绘制一个滞后 1 天的真实价格值。看看图的形状是如何匹配的——现在可以更清楚地看到,我们的模型只是试图模仿它看到的最后价格。

该模型只是模拟了以前的价格值

**有什么问题吗?LSTM 没有做错任何事!如你所知,股票是相当动态和随机的(就所有实际目的而言)。该模型给出了一个 随机游走问题 的最佳可能猜测,结果是前一天的价格。但这意味着该模型没有预测任何对交易/投资有用的东西。这就是为什么在实践中盲目使用它是非常危险的。

总结词

我并不是说预测股价的任务是不可能的。这肯定是可能的——有几种算法和交易机器人,它们使用了一些机器学习——但这不会这么简单。

制定问题陈述、输入和模型需要更多的努力。一些好的方向是预测价值(一阶导数或二阶导数)的变化,而不是价值本身。仅预测股票价格变动(二元分类问题)可能是另一种选择。或者使用一组模型来实现组合/不同的目标。我建议你首先尝试在这些领域获得更强的领域知识,然后进行探索——不要把自己局限于这些想法或你在互联网上看到的其他想法。

我并不是说我是这些领域的专家——我只是提出了我对这个主题进行探索后得出的结论,所以请随意指出我的错误或补充我遗漏的任何内容。谢谢你的时间。

ML 模型真的能读懂可视化股价图吗?看看我下面的文章,看看结果!

* [## 机器学习模型可以阅读股票图表并预测价格吗?

股票和机器学习——天作之合。如果你的 ML 模型可以从字面上阅读价格图表…

towardsdatascience.com](/can-an-ml-model-read-stock-charts-and-predict-prices-fb73c551c7a4)

既然可以预测股市,为什么还要浪费时间和精力去预测呢……

[## 一只猴子挑选我的股票投资组合

连续 10 年跑赢指数!当您可以随机选择时,为什么还要费心预测/优化…

medium.com](https://medium.com/geekculture/a-monkey-picks-my-stock-portfolio-dc10fd665368)

或者,看看我的其他一些机器学习文章。我相信你会发现它们很有用……

[## 掌握用于语义图像分割的 COCO 数据集

使用 PyCoco、Tensorflow Keras Python…探索和操作 COCO 图像数据集进行语义图像分割

towardsdatascience.com](/master-the-coco-dataset-for-semantic-image-segmentation-part-1-of-2-732712631047) [## 创建一个合成图像数据集——“什么”、“为什么”和“如何”

缺少图像来训练你的模型?以下是如何使用合成图像将数据集的大*增加数倍…

towardsdatascience.com](/create-a-synthetic-image-dataset-the-what-the-why-and-the-how-f820e6b6f718)*

如何不进行 A/B 测试

原文:https://towardsdatascience.com/how-not-to-run-an-a-b-test-88637a6b921b?source=collection_archive---------23-----------------------

照片由像素皮克斯拜拍摄

偷看:为什么你不应该这样做!

想象一下下面的情况。您做了一些分析,发现两组之间存在巨大差异,这可能会为您的团队带来一些重大胜利。第一组*均转化率为 65%,而另一组*均转化率为 40%。那就是 37.5%的涨幅!

你决定做一个实验,只是为了确定第一组确实比第二组好,但是也要坚持实验设计一旦达到显著性就停止实验。

以下是一些可能发生的结果…

A/B 测试的目标是什么?

正如你们中的一些人可能已经猜到的,上面的图表是两枚硬币各翻转 100 次。他们中的每一个都有 50%的概率正面着地,但在一个*样本实验中,他们总有 50%的概率不会正面着地。

我们进行 A/B 测试的原因是不要等到有显著性(你很快就会看到,p 值很常见< 0.05 at some point of the experiment), but to come up with a system for rejecting or failing to reject the null hypothesis.

Often, a null-hypothesis is 控制组和治疗组之间没有差异)。

为了拒绝它,我们必须建立一个系统,在这个系统中,似乎不可能没有差别。从数据的角度来看,这可能更容易查看。

随着样本量的增加,我们的控制和处理会趋同还是趋异?

每组中的样本越多,就越容易区分两组是相同还是不同,因为两组样本之间的方差变*了。

实验 1——翻转相等的硬币

让我们试着抛两个硬币,每当 p 值低于 0.05 时做标记:

如果 p 值< 0.05

If we stopped the test as soon as we saw “significance”, or as soon as the p-value dipped below 0.05, then there are multiple periods in time that we could have ended a test early and declared a winner. “Blue really is better than orange!” But in reality, you and I both know that the coins have the same probabilities.

Why then did the p-value mislead us?

It’s called chance, or variance. Sometimes, the coins land a little more on heads than tails, or the reverse. If we are comparing two coins, they might go in different directions before converging back together. As you can see in the chart above, most of the time the p-value >为 0.05,绿线会从 0 翻转到 1,只有少数情况下会翻转到< 0.05。

这里还有两个这样的事件:

p 值示例< 0.05 at some point in time

We can see that had we waited, we would have been much less likely to have declared a winner since the two groups converge to 50%. This convergence is due to 大数定律正因如此,数据科学家喜欢大量样本,以便更清楚地了解分布的真相。

实验二——不公*硬币:硬币 1 有 0.5 的几率,硬币 2 有 0.6 的几率

在这种情况下,你对你的团队的实验不耐烦了,你想在一个月后结束。假设一个月只能让你每组参加 800 次活动…

当 coin1!= coin2

有时我们可能很早就看到了真正的不同,而其他时候我们不得不等待真正的改变实现。在某个点之后,p 值阶跃函数翻转并保持翻转状态。换句话说,一段时间后,我们变得相当确定确实存在差异,如果我们测试显著性,我们很有可能在我们越过事件视界时看到它。

实验 3——知道何时停止

在这里,如果您在仔细分析后计算出预期影响(效果大*)约为 4%,并决定使用 5%的 alpha 值和 80%的幂,您将最终需要 3856 个样本(遵循下面的样本大*计算器链接)。

当预期效果大*存在实际差异时:

万岁!你的实验成功了!

如果有一个好的实验装置,你很可能会看到它。

无差异时:

万岁!你的实验成功了!

幸运的是,你没有很早就得出结论说有区别,因为你一直等到你的实验结束。

当差异大于预期时:

仍然有效,但你浪费了时间。

当差异*于预期时:

仍然有效,但是你错过了选择一个成功的变体。我说还能用是什么意思?当你设置测试时,你说你期望 X%的大*。在这种情况下,真正的差异要*得多,您的测试表明,在给定的 X%下,我们不能说对照组和治疗组真的有那么大的效果,所以您无法拒绝零。

这些说明了了解预期效果的大*以及等待整个过程后再打电话是多么重要。如果效果大很多,你也不想浪费时间测试。如果效果尺寸更*,你可能会说没有区别。但是,如果效果大*为 0,在一个精心设计的测试中,你有 95%(或者你的 alpha 设置的倒数)可能拒绝错误的改进。

实验 4 —概率当它不显著时,我会说它显著

当它不重要时,我说它重要的概率是多少?

这在很大程度上取决于测试运行的时间和您查看的次数。但这里有一些例子:

peeks 1, samples 250
probability of saying it’s significant when it’s not: 0.042.peeks 2, samples 250
probability of saying it’s significant when it’s not: 0.079.peeks 3, samples 250
probability of saying it’s significant when it’s not: 0.085.peeks 10, samples 250
probability of saying it’s significant when it’s not: 0.114.peeks 250, samples 250
probability of saying it’s significant when it’s not: 0.174.peeks 500, samples 500
probability of saying it’s significant when it’s not: 0.219.peeks 250, samples 1000
probability of saying it's significant when it's not: 0.271\. peeks 500, samples 1000
probability of saying it's significant when it's not: 0.292.

基本上,如果你不断检查,你宣布一个错误的赢家的机会可以超过 30%。这比你原来打算的 5%要高得多。

结论

这里的要点是,你不是想什么时候偷看就什么时候偷看,而是在设定的时间后才偷看。这可以防止你根据实验开始时指定的数量做出假阳性或假阴性的声明。一旦你打破了这一点,你有假阳性或假阴性的机会上升。

即使有了硬币,也非常容易被甩开,进行虚假索赔。解决这个问题的唯一方法是利用统计数据并了解所需的样本大*。

代码:

https://gist . github . com/davidblaszka/534 f 88067379587 ff 6 c 06 da 4b 235 E1 cc

参考资料:

[## 如何不进行 A/B 测试

如果你在你的网站上运行 A/B 测试并定期检查…

www.evanmiller.org](https://www.evanmiller.org/how-not-to-run-an-ab-test.html)

样本大*计算器:

[## 样本量计算器(Evan 出色的 A/B 工具)

需要 iPhone 或 iPad 上的 A/B 样本大*吗?立即下载 A/B 好友。问:一门课程需要多少科目

www.evanmiller.org](https://www.evanmiller.org/ab-testing/sample-size.html) [## g *功率

这些页面是使用 GPower 版本 3.0.10 开发的。您可以从以下网址下载 GPower 的最新版本……

stats.idre.ucla.edu](https://stats.idre.ucla.edu/other/gpower/)

如何(不)使用机器学习进行时间序列预测:续集

原文:https://towardsdatascience.com/how-not-to-use-machine-learning-for-time-series-forecasting-the-sequel-e117e6ff55f1?source=collection_archive---------10-----------------------

时间序列预测是机器学习的一个重要领域。这一点很重要,因为有太多的预测问题涉及到时间因素。然而,虽然时间组件增加了额外的信息,但与许多其他预测任务相比,它也使时间序列问题更难处理。顾名思义,时间序列数据不同于其他类型的数据,因为时间方面很重要。从积极的方面来看,这为我们提供了在构建我们的机器学习模型时可以使用的额外信息——不仅输入特征包含有用的信息,而且输入/输出随着时间的变化也包含有用的信息。

我之前关于同一主题的文章如何(不)使用机器学习进行时间序列预测,已经收到了很多反馈。基于此,我认为时间序列预测和机器学习是人们非常感兴趣的,许多人都认识到了我在文章中讨论的潜在陷阱。由于对该主题的浓厚兴趣,我选择写一篇后续文章,讨论一些涉及到时间序列预测和机器学习的相关问题,以及如何避免一些常见的陷阱。

通过一个具体的例子,我将展示一个人如何表面上有一个好的模型,并决定将它投入生产,而实际上,这个模型可能没有任何预测能力。重要的是,我将更详细地讨论其中的一些问题,以及如何在为时已晚之前发现它们。

示例案例:时间序列数据的预测

下图说明了在这种情况下使用的示例数据。我们稍后将更详细地讨论这些数据,但现在,让我们假设这些数据代表了股票指数的年度演变、产品的销售/需求、一些传感器数据或设备状态,以及任何可能与您的情况最相关的数据。目前的基本想法是,数据实际代表的内容不会真正影响下面的分析和讨论。

如图所示,我们总共有 4 个“输入特征”或“输入变量”和一个目标变量,这就是我们试图预测的。这种情况下的基本假设是,我们模型的输入变量包含一些有用的信息,允许我们根据这些特征预测目标变量(可能是,也可能不是)。

相关性和因果性

统计中,相关或依赖是任何统计关系,无论是否为因果。相关性是有用的,因为它们可以表明在实践中可以利用的预测关系。例如,基于电力需求和天气之间的相关性,电力公司可能在温和的日子产生较少的电力。在这个例子中,有一个因果关系,因为极端天气导致人们使用更多的电力来取暖或制冷。然而,一般来说,相关性的存在不足以推断因果关系的存在(即相关性并不意味着因果关系)。这是一个非常重要的区别,我们将在后面详细讨论。

为了检查我们的数据,我们可以考虑的一件事是计算相关矩阵,它表示我们数据集中所有变量之间的相关系数。在统计中,皮尔逊相关系数是两个变量之间线性相关性的度量。根据柯西-施瓦茨不等式,它的值介于+1 和 1 之间,其中 1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。

然而,虽然相关性是一回事,但我们通常感兴趣的是因果关系。传统观点认为“相关性并不意味着因果关系”这意味着相关性本身不能用来推断变量之间的因果关系(在任一方向上)。

儿童的年龄和身高之间的相关性相当明显,但人的情绪和健康之间的相关性就不那么明显了。心情变好会导致健康变好吗,还是健康变好会带来好心情,或者两者兼而有之?还是两者背后都有其他因素?换句话说,相关性可以作为可能的因果关系的证据,但不能表明因果关系(如果有的话)可能是什么。

(来源:https://xkcd.com/925/)

相关性和因果性之间的重要区别是建立基于机器学习的预测模型时的主要挑战之一。该模型是根据我们试图预测的流程的代表性数据进行训练的。然后,我们的输入变量和目标之间的任何特征模式/相关性被模型用于建立关系,该关系可用于给出新的预测。

在我们的例子中,从相关矩阵中,我们看到我们的目标变量确实与我们的一些输入变量相关。尽管如此,根据我们的数据训练一个模型,这种明显的相关性可能只是一种统计上的侥幸,它们之间根本没有因果关系。然而,现在,让我们忽略这个事实,并尝试建立我们的预测模型。稍后我们将回头更详细地讨论这些潜在的陷阱。

时间序列预测的机器学习模型

有几种类型的模型可用于时间序列预测。在我以前的文章中,我使用了一个长短期记忆网络,或者简称为 LSTM 网络。这是一种特殊的神经网络,它根据以前时间的数据进行预测,即它在模型结构中明确内置了“记忆”的概念。

然而,根据我的经验,在许多情况下,更简单的模型实际上提供了同样准确的预测。在这个例子中,我实现了一个基于前馈神经网络(如下图所示)的预测模型,而不是基于递归神经网络。我还将预测与随机森林模型进行了比较(这是我的首选模型之一,基于其简单性和开箱即用的良好性能)。

使用开源软件库实现模型

我通常使用 Keras 来定义我的神经网络模型类型,这是一种高级神经网络 API,用 Python 编写,能够在 TensorFlowCNTKTheano 之上运行。对于其他类型的模型,(像这种情况下的随机森林模型),我通常使用 Scikit-Learn ,这是一个免费的软件机器学习库。它具有各种分类回归聚类算法,并且被设计为与 Python 数值和科学库 NumPySciPy 互操作。

本文的主题不是关于如何实现时间序列预测模型的细节,而是如何评估预测。正因如此,我就不赘述建模等细节了。,因为有大量其他博客帖子和文章涉及这些主题。(但是,如果你对这个例子中使用的代码感兴趣,请在下面的评论中告诉我,我会与你分享代码)。

训练模型

在使用 Keras 建立神经网络模型之后,我们将数据分成训练集和测试集。前 6 个月的数据用于训练,剩余的数据用作保留测试集。在模型训练期间,10%的数据用于验证,以跟踪模型的表现。然后,可以从下面的训练曲线中可视化训练过程,其中绘制了作为时期函数的训练和验证损失。从训练曲线来看,模型确实能够从数据中学到一些有用的东西。训练和验证损失都随着训练的进行而减少,然后在大约 50 个周期后开始变*(没有明显的过拟合/欠拟合的迹象)。到目前为止,一切顺利。

评估结果:

现在,让我们将模型预测与保留测试集中的地面真实数据进行可视化,以查看我们是否有很好的匹配。我们还可以在散点图中绘制真实值与预测值的对比图,并可视化误差分布,如下图右侧所示。

从上面的数字可以清楚地看出,在比较真实值和预测值时,我们的模型并没有获得很好的匹配。我们的模型看似能够学习有用的信息,但在坚持测试集中表现如此糟糕,这是怎么回事?

为了获得更好的比较,让我们也在相同的数据上实现一个随机森林模型,看看这是否会给我们带来更好的结果。正如我们可以从下图左侧的结果中看到的,随机森林模型的性能并不比神经网络好多少。然而,随机森林模型的一个有用的特征是,它还可以输出“特征重要性”作为训练过程的一部分,指示最重要的变量(根据模型)。这种特性的重要性在很多情况下可以为我们提供有用的信息,这也是我们将要详细讨论的内容。

虚假的相关性和因果关系

有趣的是,我们从上图中注意到,根据随机森林模型,变量 4 显然是最重要的输入变量。然而,从下图中的相关矩阵和图中,我们注意到与目标最强相关的变量是“变量 1”(它具有第二高的特征重要性)。实际上,如果你仔细观察下面绘制的变量,你可能会注意到变量 1 和目标遵循完全相同的趋势。这是有意义的,在我们下面对本例中使用的数据的讨论中将变得显而易见。

本例中使用的数据的来源

随着我们越来越接*完成这篇文章,是时候透露一些关于所用数据来源的额外细节了。如果你读过我之前的一篇关于时间序列预测机器学习的陷阱的文章,你可能已经意识到我是随机行走过程(以及一般的随机过程)的粉丝。在这篇文章中,我确实选择了一种类似的方法,来解决虚假的相关性和因果关系。

实际上,数据集中的所有变量(4 个输入变量和一个“目标”)都是由随机游走过程生成的。我最初生成了 4 个随机行走体,为了获得目标变量,我简单地实现了“变量 1”的 1 周时间偏移(添加了一点随机噪声,使其第一眼看起来不那么明显)。

因此,变量和目标之间当然没有因果关系。当谈到第一个变量时,由于目标与变量 1 相比在时间上向后移动了一周,目标变量的任何变化在变量 1 的相应变化之前发生。因此,与目标变量的唯一耦合是通过随机游走过程本身固有的自相关。****

如果我们计算变量 1 和目标之间的互相关,可以很容易地发现这种时移,如下图左侧所示。在互相关中,有一个 7 天时间偏移的清晰峰值。然而,我们从上面的相关矩阵和下面的图中注意到,即使在零天的滞后期,目标和变量 1 之间也存在显著的相关性(准确地说,相关系数为 0.75)。然而,这种相关性仅仅是因为目标变量具有缓慢衰减的自相关性(明显长于一周的时间偏移),如下图右侧所示。

格兰杰因果关系检验

如前所述,我们模型的输入变量与目标相关,并不意味着它们有因果关系。当试图在稍后阶段估计目标时,这些变量实际上可能没有任何预测能力。然而,当制作数据驱动的预测模型时,错误的相关性和因果性是一个容易陷入的陷阱。这就引出了一个重要的问题:我们能做些什么来避免这种情况吗?

****格兰杰因果检验是一种统计假设检验,用于确定一个时间序列是否对预测另一个有用,通常情况下,回归反映“仅仅”相关性,但是克莱夫·格兰杰认为因果关系可以通过测量使用另一个时间序列的先前值预测一个时间序列的未来值的能力来测试。如果通常通过对 X滞后值(也包括 Y 的滞后值)的一系列t-检验F-检验可以表明,那些 X 值提供了关于未来值的统计上显著的信息,则称时间序列 X 为格兰杰原因 Y

格兰杰根据两个原则定义了因果关系:

  1. 原因发生在结果之前。
  2. 原因具有关于其结果的未来值的唯一信息。

当时间序列 X 格兰杰原因导致时间序列 Y ( 如下图 ) 时, X 中的模式在一段时间延迟后在 Y 中大致重复(两个示例用箭头表示)。因此, X 的过去值可用于预测 Y 的未来值。

来源

格兰杰因果关系的原始定义没有考虑到潜在的混杂效应,也没有捕捉到瞬时和非线性的因果关系。因此,进行格兰杰因果关系测试并不能给你一个明确的答案,即你的输入变量和你试图预测的目标之间是否存在因果关系。尽管如此,它绝对值得研究,并且与纯粹依赖它们之间的(可能虚假的)相关性相比,它提供了额外的信息。

非*稳时间序列的“危险”

大多数统计预测方法都是基于这样一种假设,即通过使用数学变换,时间序列可以呈现为*似*稳的(即“*稳化”)。一个*稳时间序列是指其统计特性如表示方差自相关等。都是不变的。一个这样的基本转换是对数据进行时差。

这种变换的作用是,我们不是直接考虑数值,而是计算连续时间步长之间的差值。定义模型来预测时间步长值之间的差异而不是值本身,这是对模型预测能力的更大考验。在这种情况下,不能简单地使用数据具有很强的自相关性,并使用时间“ t 的值作为“ t+ 1”的预测。由于这一点,它提供了对模型的更好的测试,以及它是否从训练阶段学到了任何有用的东西,以及分析历史数据是否实际上可以帮助模型预测未来的变化。

摘要

我想通过这篇文章强调的要点是,在处理时间序列数据时要非常*心。正如上面的例子所示,人们很容易被愚弄(在我以前的一篇关于人工智能和大数据的隐藏风险的文章中也讨论过)。通过简单地定义一个模型,进行一些预测和计算常见的准确性度量,人们可能看起来有一个好的模型,并决定将其投入生产。然而,在现实中,该模型可能没有任何预测能力。

有了高质量和易于使用的机器学习库和工具箱,构建模型的实际编码部分变得非常简单。这一进展是个好消息。它节省了我们大量的时间和精力,并限制了实现过程中编码错误的风险。在建立模型的过程中节省下来的时间应该用来集中精力问正确的问题。在我看来,这是数据科学最重要的方面之一。你如何正确地验证你的模型预测?您的数据中是否存在任何隐藏的偏差,可能会扭曲您的预测,或者任何微妙的反馈循环,可能会导致意外的结果?

我想强调的最重要的一点是,对数据告诉你的事情保持怀疑是非常关键的。问关键的问题,永远不要得出任何草率的结论。科学方法应该应用于数据科学,就像应用于任何其他种类的科学一样。

你自己在机器学习和时间序列预测方面有什么经验?我将非常感谢任何关于这个话题的评论和新的投入。希望你觉得这个帖子有用,觉得有意思就随意分享吧!

你觉得这篇文章有趣吗?如果是这样的话,你可能也会喜欢我的其他一些关于人工智能、机器学习、物理等主题的文章。,你可以在下面的链接和我的中型作者简介中找到:

** [## Vegard Flovik 培养基

2018 年夏天我发表第一篇关于“走向数据科学”的文章时,数字背后的统计数据…

medium.com](https://medium.com/@vflovik)

而且,如果你想成为一个媒体会员,免费访问*台上的所有资料,你也可以使用下面我的推荐链接。(注意:如果您使用此链接注册,我也会收到一部分会员费)

[## 通过我的推荐链接加入 Medium—Vegard flo vik

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

medium.com](https://medium.com/@vflovik/membership)

更多来自 Vegard Flovik 媒体:

  1. 蒙特卡洛方法简介
  2. 从物理学到数据科学的转变
  3. 什么是图论,为什么要关心?
  4. 用于图像分类的深度迁移学习
  5. 建造一个能读懂你思想的人工智能
  6. 人工智能和大数据隐藏的风险
  7. 如何使用机器学习进行异常检测和状态监控
  8. 如何(不)使用机器学习进行时间序列预测:避免陷阱
  9. 如何利用机器学习进行生产优化:利用数据提高绩效
  10. 如何向 AI 系统教授物理?
  11. 我们能否利用纳米级磁铁构建人工大脑网络?
  12. 供应链管理中的人工智能:利用数据推动运营绩效

研讨会演示—从宣传到实际应用**

如何不使用 ROC、精确回忆曲线和 MCC(马修斯相关系数)

原文:https://towardsdatascience.com/how-not-to-use-roc-precision-recall-curves-mcc-matthews-correlation-coefficient-f68a33108f8b?source=collection_archive---------24-----------------------

我们在这些指标上犯的常见错误&如何选择最适合您的业务案例的指标

SpaceX 在 Unsplash 上拍摄的

作为一名数据科学家,我喜欢很多事情。其中之一就是对你正在为之创建解决方案的业务有一个整体的认识。让我们使用的公式具有真实世界的背景使它变得更加有趣。这就是为什么当我团队中的一位初级同事通过精确回忆曲线向我展示各种模型的比较时,我询问这是否是我们案例的最佳指标,他的反应是,“我可以通过 ROC 曲线展示这一点;也许那样会更好?”

每个有经验的数据科学家都会告诉你,没有对错之分。业务决定了最佳方法。所以,让我向你提出同样的问题,让我们看看什么是好的方法。

除非另有说明,所有图片均归作者所有。

问题陈述

我们正在为生产齿轮零件的制造工厂实施自动质量控制系统。这是一个计算机视觉问题。作为第一步,我们挑选了一个齿轮零件,并试图根据是否存在划痕、生锈、尺寸不正确等因素将其分为“好”或“坏”。发现的缺陷类型现在并不重要,只需要将其分类为好的或坏的。

此外,将不良零件运送给最终客户的惩罚是巨大的,因此我们应该非常仔细地正确分类不良零件。

让我们假设实际的和预测的(来自我们的模型)结果给出了下面的混淆矩阵,其中我们将好的部分视为正的 ,将坏的部分视为负的 :

如果你想温习与混淆矩阵相关的各种指标,如精确度、召回率、特异性,或者更喜欢预测作为列的“其他”表示,我会推荐阅读 混淆矩阵的两种变化-弄糊涂了,再也不会了 以获得更大的清晰感。

当然,上面的矩阵是基于特定的概率阈值(在这种情况下为 0.5),ROC 曲线将通过考虑各种阈值来构建,但您可以对一般的类别分布有一个大致的了解。

您应该使用哪个指标?-

  1. 受试者工作特征曲线
  2. 精确召回曲线
  3. 还有别的吗?

思*过程

首先,让我们消除 ROC 曲线,因为它不是最适合不*衡的类问题。这里有一个很棒的视频可以帮你打好基础。

现在进入精确回忆曲线——这是我的同事选择的。y 轴表示精度,x 轴表示召回率。如果我在不同的阈值下使用上面的混淆矩阵来绘制这条曲线,你会发现这个方法有什么问题吗?

精确回忆曲线应该会把我们的注意力吸引到 P 阳性类别

如果我们想把注意力集中在“坏”的阶层上,那么积极和消极的阶层应该互换。这类似于一个医学用例,在这个用例中,癌症的检测相当于检测结果为“阳性”。如果只有很少的人/部分会有癌症/缺陷,那么我们将它设为阳性类别,然后使用 PR 曲线。

如果您不想交换类别标签,另一种非传统的方法是将 y 轴映射为 TN/(TN+FN) ,x 轴映射为特异性或 TN/(TN+FP) 。我可以用数学来解释这些新的轴,但是一个非常直观的记忆方式是:

案例一(传统 PR 曲线):以 TP 为‘pivot’,pivot 除以行和为 y 轴(精度),pivot 除以列和为 x 轴(回忆)。

“传统”公关曲线

案例二(非传统曲线):既然你不希望交换标签,我们就以 TN 为支点。同样,与上面完全一样,pivot 除以行总和是 y 轴,而 pivot 除以列总和是 x 轴(特异性)。

“非传统”曲线

理想的 PR 曲线在(1,1)处具有“最佳”值。

一些其他指标?

如果不提及马修斯相关系数或 MCC,这篇文章将是不完整的。

MCC 适用于这样的情况:您希望在预测所有类时评估模型的性能,而不特别关注任何特定的类。这里有一个关于这个话题的很棒的博客。

想象一下——很快,我们的问题陈述会扩大,客户会要求将所有不同的缺陷分开分类,而不仅仅是“好”或“坏”。因此,它可能是“划痕”、“尺寸错误”、“生锈”、“良好”等等。

一旦我们筛选出几个型号,最好有一个单一的指标来比较它们在不同类别中的整体表现。MCC 就是这么做的。

希望这让您对不同的场景有所了解,在这些场景中,不同的指标是有价值的。理解它们背后的数学总是一个好主意,因为只有这样,人们才能根据自己的特定需求调整它们——就像我们将 PR 曲线调整为非传统曲线一样。

对分享想法、提问或简单讨论想法感兴趣?通过我的网站、我只是个学生或者在 LinkedInYouTubeGitHub 上与我联系。

回头见&学习愉快!

[## Himanshu Chandra -业务主管-ML

.

www.linkedin.com](https://www.linkedin.com/in/himanshu-chandra-33512811/)

如何不写*猫代码

原文:https://towardsdatascience.com/how-not-to-write-pandas-code-2cbda8b3816c?source=collection_archive---------12-----------------------

大部分“如何不”用*猫编码的想法来自于我的开始。每一次失败后,我都会向*猫展示一个正确的“方法”。

来自 Giphy 的《国家地理坠落的*猫》

在过去的 3 年里,我一直用*猫作为我数据分析的主要工具。我必须承认,“如何不用*猫编码”的大部分内容都来自于我的开端。在进行代码评审时,我仍然看到许多经验丰富的程序员的“禁忌”。

在这篇文章中,我首先展示了一个“如何不”的例子,然后展示了一个正确的“如何”用*猫计算统计数据的方法。

改进的理由是简洁、更可读的代码和更快的执行速度。报告的时间格式为:831 ms ± 25.7 ms per loop,表示*均 831 毫秒,标准偏差为 25.7 毫秒。每个代码样本执行多次,以计算准确的执行时间。

这里有几个你可能会感兴趣的链接:

- [How To Create Date Series in SQL](https://dataanalysis.substack.com/p/how-to-create-date-series-in-sql) [Article]- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)

上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。

要升级您的*猫游戏,请参见:

[## *猫数据分析系列

从提示和技巧,如何不指南到与大数据分析相关的提示,*猫文章的精选列表。

medium.com](https://medium.com/@romanorac/pandas-data-analysis-series-b8cec5b38b22)

样本数据集

示例数据集包含各个城市的预订信息。它是随机的,它的唯一目的是显示例子。

数据集有 3 列:

  • id 是唯一 id,
  • 城市是预订的城市,
  • booked_perc 是某个时间的预订百分比。

数据集具有 10K 条目,以使速度提高更加明显。如果以正确的方式编写代码,Pandas 可以在数百万行的数据帧上计算统计数据。

import pandas as pd
import numpy as npsize **=** 10000cities **=** ["paris", "barcelona", "berlin", "new york"]df **=** pd**.**DataFrame(
    {"city": np**.**random**.**choice(cities, size**=**size), "booked_perc": np**.**random**.**rand(size)}
)
df["id"] **=** df**.**index**.**map(str) **+** "-" **+** df**.**city
df **=** df[["id", "city", "booked_perc"]]
df**.**head()

1.如何不对数据求和

来自 Reddit 的滚动*猫

我来自 Java 世界,我把“多行中的 for 循环”带到了 Python。

让我们计算 booked_perc 列的总和—我知道对百分比求和没有意义,但我们还是要这样做:)

**%%**timeitsuma **=** 0
**for** _, row **in** df**.**iterrows():
    suma **+=** row**.**booked_perc766 ms ± 20.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

对一列的值求和的更巧妙的方法是:

**%%**timeitsum(booked_perc **for** booked_perc **in** df**.**booked_perc)989 µs ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)**%%**timeitdf**.**booked_perc**.**sum()92 µs ± 2.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

正如所料,第一个例子是最慢的——对 10k 个条目求和几乎需要 1 秒钟。第二个例子的速度之快让我吃惊。用 pandas 对数据求和的正确方法(或对列使用任何其他操作)是第三个例子,也是最快的!

2.如何不过滤数据

来自吉菲的*猫游戏

尽管在开始使用 pandas 之前,我对 numpy 很有经验,但我是在 for 循环中过滤数据。您可以在计算总和时观察性能损失。

**%%**timeitsuma **=** 0
**for** _, row **in** df**.**iterrows():
    **if** row**.**booked_perc **<=** 0.5:
        suma **+=** row**.**booked_perc831 ms ± 25.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)**%%**timeitdf[df**.**booked_perc **<=** 0.5]**.**booked_perc**.**sum()724 µs ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

正如所料,第二个例子比第一个快几个数量级。

多加几个滤镜呢?我们简单地将它们括在括号中:

**%%**timeitdf[(df**.**booked_perc **<=** 0.5) **&** (df**.**city **==** 'new york')]**.**booked_perc**.**sum()1.55 ms ± 10.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.如何不访问以前的值

来自 Giphy 的*猫翻滚

您可能会说:好吧,但是当我需要访问前一列的值时怎么办?那么我需要一个 for 循环。不对!

让我们计算在有和没有 for 循环的情况下从一行到另一行的百分比变化。

**%%**timeit**for** i **in** range(1, len(df)):
    df**.**loc[i, "perc_change"] **=**  (df**.**loc[i]**.**booked_perc **-** df**.**loc[i **-** 1]**.**booked_perc) **/** df**.**loc[i **-** 1]**.**booked_perc7.02 s ± 24.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)**%%**timeitdf["perc_change"] **=** df**.**booked_perc**.**pct_change()586 µs ± 17.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

同样,第二个例子比第一个 for 循环快得多。

Pandas 有许多函数可以基于以前的值计算统计数据(例如,shift函数延迟一个值)。这些函数采用periods参数,该参数定义了要包含在计算中的先前值的数量。

4.如何不应用复杂函数

来自 Giphy 的*猫工作杆

有时,我们需要对一个数据帧应用一个复杂的函数(一个有多个变量的函数)。假设我们想将纽约的 booking_perc 乘以 2,将其他值设为 0,并将列命名为 sales_factor。

我想到的第一种方法是使用带有 iterrows 的 for 循环。

**%%**timeit**for** i, row **in** df**.**iterrows():
    **if** row**.**city **==** 'new york':
        df**.**loc[i, 'sales_factor'] **=** row**.**booked_perc ***** 2
    **else**:
        df**.**loc[i, 'sales_factor'] **=** 03.58 s ± 48.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

稍微好一点的方法是直接在数据帧上使用 apply 函数。

**%%**timeit**def** **calculate_sales_factor**(row):
    **if** row**.**city **==** 'new york':
        **return** row**.**booked_perc ***** 2
    **return** 0df['sales_factor'] **=** df**.**apply(calculate_sales_factor, axis**=**1)165 ms ± 2.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

最快的方法是使用*猫滤镜,直接计算函数值。

**%%**timeitdf**.**loc[df**.**city **==** 'new york', 'sales_factor'] **=** df[df**.**city **==** 'new york']**.**booked_perc ***** 2
df**.**sales_factor**.**fillna(0, inplace**=**True)3.03 ms ± 85.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我们可以观察到从第一个例子到最后一个例子的加速。

当我们处理 3 个或更多变量的函数时,我们可以把它分解成多个*猫表达式。这将比使用应用功能更快。

f(x, a, b) = (a + b) * x

df['a_plus_b'] = df['a'] + df['b']
df['f'] = df['a_plus_b'] * df['x']

5.如何不对数据进行分组

来自 Giphy 的*猫

正如你现在看到的,当我开始使用 pandas 时,我非常依赖 for 循环。通过对数据进行分组,您可以在使用 pandas 时最大限度地减少代码行数。

假设我们想计算:

  • 城市的*均销售系数
  • 以及城市的第一个预订 id。
**%%**timeitavg_by_city **=** {}
count_by_city **=** {}
first_booking_by_city **=** {}**for** i, row **in** df**.**iterrows():
    city **=** row**.**city
    **if** city **in** avg_by_city:
        avg_by_city[city] **+=** row**.**sales_factor
        count_by_city[city] **+=** 1
    **else**:
        avg_by_city[city] **=** row**.**sales_factor
        count_by_city[city] **=** 1
        first_booking_by_city[city] **=** row['id']**for** city, _ **in** avg_by_city**.**items():
    avg_by_city[city] **/=** count_by_city[city]878 ms ± 21.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Pandas 有一个 group by 操作,所以不需要迭代数据帧。pandas 中的 group by 与 SQL 中的 GROUP BY 语句做同样的事情。

**%%**timeitdf**.**groupby('city')**.**sales_factor**.**mean()
df**.**groupby('city')**.**sales_factor**.**count()
df**.**groupby('city')**.**id**.**first()3.05 ms ± 65.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)**%%**timeitdf**.**groupby("city")**.**agg({"sales_factor": ["mean", "count"], "id": "first"})4.5 ms ± 131 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

令人惊讶的是,第三个例子并不是最快的,但它比第二个例子更简洁。当你需要加速你的代码时,我建议你使用第二种方法。

结论

来自 Giphy 的快乐*猫

我的建议是:

如果你对*猫使用 for 循环,可能有一个更好的方法来写它。

存在计算开销很大的函数,即使上面的优化也无济于事。然后,我们需要使用最后的手段:Cython 和 Numba,我将在接下来的几周中介绍这两个地方。

你喜欢这个职位吗?学到了新东西?请在下面的评论中告诉我。

在你走之前

像往常一样,你可以下载这个 Jupyter 笔记本在你的机器上尝试例子。

推特上关注我,在那里我定期发关于数据科学和机器学习的推特。

体育文章有多客观?

原文:https://towardsdatascience.com/how-objective-are-sports-articles-690277250f2e?source=collection_archive---------71-----------------------

随机数据集挑战

分析客观性和可视化词云

探索不同类别文章的内容对于确定它们的质量、它们是否真的有用以及弄清楚它们是否是主观的非常重要;作者自己的个人观点分量很重,还是客观作者提出了一个更中立的立场。

照片由 Tim GouwUnsplash 上拍摄

在本教程中,我们将查看 体育文章数据集 ,并从这些文章中构建美丽的词云,以及分析这 1000 篇文章中的独立特征,以计算出它们的客观性/主观性得分。本教程和实现是我的 随机数据集挑战 的一部分,在那里我构建了不同的机器学习模型来扩展我的数据科学技能。

关于数据集:

数千篇体育文章被亚马逊土耳其机器人标注为主观或客观。附加特征,例如字数、语义分数、名词、形容词、符号的频率等。,都是从这些文章中摘录的。

所以我们有两个信息来源。体育文章本身加上可量化的数字特征矩阵。

教程:

1)词云可视化-

让我们从构建一个单词云开始,实际上,有两个,所以我们可以看看最频繁出现的单词。

字云形状的排球运动员中期穗。图片作者。

首先,为了将单词组合成这种形状,我们必须将文章中的所有单词提取到一个语料库中。

我们将使用自然语言处理技术从文章中提取词干、词条和删除停用词,以及除字母数字字符之外的任何特殊字符。

然后,我们将使用单词云方法和一些其他参数来设置单词云的大*,并指定要使用的掩码。

这是你以前可能见过的另一种形状更正常的单词云。

词云。图片作者。

2)客观性分析-

在这个更“简单”的分析中,我们将使用功能 excel 表来查看哪种技术属性,属于主观文章还是更客观的文章。

像往常一样,我们将从导入所需的库、数据集、预处理数据和训练模型开始。

经过对多个分类器的反复试验,我发现支持向量分类器的性能最好,准确率为 82.66%。

3)混淆矩阵-

混淆矩阵是另一个性能指标,它一眼就能告诉我们 ,对于每个类,模型正确和错误地分类了多少个观察值。

混乱矩阵。图片作者。

可以看出,我们的模型正确预测了(预测=实际),168 篇客观文章,80 篇主观文章。对于客观文章来说,不正确的预测是 35 个,即 35 个主观文章被错误地分类为客观文章,而对于 17 个实际客观文章则相反,它们被错误地标记为主观文章。

这就是了。又是一天,又是一个机器学习模型。

这一次,我想做一些不同的事情,让同时使用 NLP分类算法来分析文章。

整合文本文章和可量化的特征数据集,我想到了绘制单词云,因为当我在其他几篇文章中遇到它时,我一直想知道如何做。

希望这篇文章/教程对你有帮助。如果你想看看我的其他作品,可以看看我的 GitHub

这个系列的其他文章可以在 这里 找到。

非常感谢您的阅读,祝您有美好的一天!

下一篇文章再见。

我们的人工智能如何使用数据科学在梦幻超级联赛中获得前 10 名

原文:https://towardsdatascience.com/how-our-ai-got-top-10-in-the-fantasy-premier-league-using-data-science-ba88b185b354?source=collection_archive---------8-----------------------

EPL 幻想博客

我们对 EPL 梦幻联盟的摇钱树方法

注:这是我们 2019 年以来的主要项目总结。关于 2020 年的每周更新,请查看我最*在 EPL 幻想联盟上的一些博客。

我的朋友( Andrew Sproul )和我已经玩了很多年的官方梦幻英格兰超级联赛,尽管我们坚信我们了解英格兰足球的一切,但我们倾向于年复一年地“倒霉”,不知何故似乎从来没有选出获胜的球队。因此,我们最终决定将数据科学和“金钱球”方法应用于团队/球员分析,以确定我们是否真的在每个赛季选择了最佳的球员组合。我们的研究始于从梦幻游戏 API 中提取最新的玩家数据,并使用 Python 对所有 EPL 团队和所有个人玩家进行统计分析。我们项目的最终目标是编写一个 Python 算法,它使用来自我们分析的数据进行“智能”挑选,并在我们有限的 100 毫米预算下建立最佳的梦幻联盟阵容。

注意:最理想的幻想*队将会根据每花费一美元的幻想点数返回的总点数=投资回报率来衡量。

我们的分析将以以下假设为指导,旨在回答以下关键问题:

  1. 要检验的主要假设:
  • 大多数休闲 EPL 幻想玩家在为他们的幻想队挑选队员时使用个人偏见和偏爱。换句话说,人们通常会根据他们支持的球队以及目前哪些 EPL 球员是“最热门”的来做出决定,而不会将单个球员视为长期投资以及他们每一美元的投资回报率。
  • 我们相信,如果我们在选择我们的梦幻阵容时,从决策过程中消除偏见和偏袒,并专注于单个球员的统计数据和整体团队表现,我们可以在赛季结束时比普通人做得更好。

2.我们的分析旨在回答的关键问题:

  • 个别球员梦幻联赛的统计数据,他们的球队在英超联赛中的总积分,以及该球队相应的积分榜位置之间是否存在相关性?
  • 我们能否识别出有很多表现不佳、价格过高的球员的球队,以及那些拥有非常稳固但被低估的阵容的球队,这样我们就可以告诉我们的算法相应地从这些球队中挑选球员?(注:“被低估”和“被高估”是根据幻想联盟成本而非现实世界中的实际玩家价值来衡量的。)
  • 我们能否将官方的英超梦幻游戏视为等同于股票市场将单个球员视为金融资产并尝试根据他们的投资回报率找出所有定价过低和过高的球员,并相应地投资我们的梦幻美元预算?

单个玩家投资回报率=玩家幻想点数/玩家幻想成本(换句话说,我们在玩家身上花费的每 1 毫米幻想美元的总点数回报。)

  • 我们的理论是,这有助于将我们有限的 1 亿英镑梦幻联盟预算花在球员身上,在整个赛季中,每花 1 美元梦幻就能获得尽可能多的积分。
  • 如果这被证明是真的,那么我们是否可以使用 Python 来构建一个算法,通过挑选尽可能多的高 ROI 球员并结合一些昂贵的超级明星来优化预算的使用,以最大化每总预算支出的总积分回报?
  • 我们的算法和玩 EPL 幻想游戏的普通人相比怎么样?我们的团队获得了什么样的总体排名,他们是否以显著优势击败了普通玩家?

注:该项目于 2018 年 11 月 14 日执行,在 Gameweek 10 之后,因此文章中提供的所有数据和表格都是准确的。

我们程序的主要步骤如下:

1.查看单个团队的数据

首先,我们首先根据目前的积分榜排名排列所有巴克莱 EPL 球队,并查看所有球员的总积分,以了解这是否与球队的积分榜位置直接相关。

我们可以清楚地看到,一般来说,一支球队在英超联赛中的表现与其球员的累计梦幻积分之间存在线性相关性。上面的橙色条显示了每支球队的球员在梦幻联盟货币方面的总成本。这有助于我们识别*均每美元投资(ROI)产生可观梦幻积分回报的球队,如— 曼城、利物浦、切尔西、亚足联伯恩茅斯、沃特福德和狼队。这也暴露了一些被认为是不良投资的球队,如托特纳姆、阿森纳、曼联、富勒姆、哈德斯菲尔德、西汉姆和南安普顿。

接下来,我们绘制了每支球队的累积球员投资回报率与教练经常使用的球员数量的关系图(本赛季迄今为止至少打了 360 分钟的球员)。这将有助于我们识别那些拥有太多昂贵且表现不佳的球员的球队,由于他们的教练经常轮换阵容,这些球员很少每场比赛打满 90 分钟,从长远来看,这使他们成为一项糟糕的投资,因为他们不会每场比赛都持续不断地产生梦幻积分。此外,下面的图表将帮助我们确定教练不经常轮换球员的球队,这将导致这些球队拥有更一致的常规球员核心。这将通知我们的算法从这些球队中挑选更多的球员,因为从长远来看,他们的球员预计会产生更高的总 ROI,因为与来自经常轮换球员的球队的球员相比,他们*均会参与更多的游戏活动。

在上图中,我们在寻找有很高的蓝条(累积球员投资回报率)和较短的橙条(教练定期使用的球员总数)的球队。这一类别的领导者是伍尔弗汉普顿,AVG 投资回报率为 8.21,只有 11 名教练经常使用的球员(*均每名伍尔弗汉普顿球员身上花费的 1 美元产生 8.21 分的收益)。这意味着与他们的表现相比,伍尔弗汉普顿的大多数球员都被低估了,教练经常使用同样的 11 名球员,并且只在比赛快结束时或正式队员受伤时使用替补队员。即使像曼城、利物浦和切尔西这样的球队也属于这一类,拥有 13-14 名正式队员,这意味着从上述任何球队中挑选球员从长远来看都是一项不错的投资,因为正式队员比替补队员*均上场时间更长。

这一类别中最大的输家是曼联、热刺、阿森纳、埃弗顿、西汉姆和富勒姆,他们的投资回报率在 4-5 之间,许多常规球员的回报率高达 15-16。这意味着,通过从这些球队中挑选球员,你正在进行一项“糟糕的投资”,因为教练经常轮换阵容,你的球员可能无法参加每场比赛。此外,统计数据清楚地表明,与他们在梦幻联盟中的表现相比,这些球队的球员被高估了,这是由他们低于*均水*的 ROI 所表明的。

2.查看单个玩家的数据

在确定了哪些团队产生了更高的累积投资回报率之后,我们接着放大了单个玩家。在股票市场方面,我们已经确定了所有的高收益市场部门——团队——现在我们要开始分析每个部门的所有个股——玩家。计划是分离出一个具有最高 ROI 的玩家列表,并编写一个 Python 算法,该算法将使用智能逻辑来挑选最佳的玩家组合,这将为我们 1 亿毫米的有限预算带来最高的投资回报。

看着上面玩家花费与玩家总幻想点数的散点图,我们希望我们的人工智能选择出现在图上尽可能靠西北的玩家(低花费玩家产生大量幻想点数)。请注意,我们还希望包括一些来自该地块东北角的顶级玩家,因为这些将是一些产生大量积分的明星联盟玩家,尽管他们有点昂贵,但他们最终仍有不错的 ROI。下图描绘了前 20 名投资回报率玩家与后 20 名投资回报率玩家的对比。因此,我们希望我们的最终算法尽可能多地选择这些高产玩家。我们希望远离那些相对于他们的表现(高成本/低幻想点)价格过高的球员,如哈里·凯恩、阿莱克西斯·桑切斯、罗梅卢·卢卡库、克里斯蒂安·埃里克森、阿尔瓦罗·莫拉塔、保罗·博格巴、德勒·阿里等等。

投资回报率排名前 20 和后 20 的球员与 AVG 联盟投资回报率的对比图

我们决定绘制上面的统计数据,包括联盟中所有球员的 AVG 投资回报率(绿线= 5.74 ),以直观地了解“表现出色”和“表现不佳”的球员是什么样子。例如,联盟中收益最高的球员马科斯·阿隆索的投资回报率为 12.11 ,是 AVG 5.74 的两倍多,这使他成为我们算法中显而易见的选择。

在下面的饼状图中,我们可以看到球员价值最高的球队和球员价值最低的球队的分布情况。我们期待我们的最终算法能够从拥有许多高产球员的各种球队中挑选球员,例如——伯恩茅斯、狼队、利物浦切尔西、曼城、沃特福德和埃弗顿。这种聪明的方法与普通人玩幻想游戏的方法非常不同,后者主要从他/她最喜欢的球队中挑选球员,加上来自 4 或 5 个最受欢迎球队的少数球员——阿森纳、托特纳姆、曼联、切尔西、利物浦或曼城,然后用廉价的“填充”球员填充他们幻想球队的剩余部分,这些球员从不在真实比赛中出场,也不会产生任何幻想积分。

投资回报率前 50 名球员最多的球队

ROI 排名倒数 50 名球员最多的球队

3.编写挑选最佳幻想团队的 Python 算法

现在是最有趣的部分——编写实际的 Python 算法,并将人工智能选择的结果与普通人可能为他们的幻想团队选择的结果进行比较。

要理解我们算法的逻辑,首先必须理解下面 EPL 幻想游戏的规则和约束:

  • 每个幻想玩家的预算都是 100 万英镑,必须购买 15 名足球运动员(11 名主力+ 4 名替补)才能参赛。
  • 你需要至少有 2 名守门员,5 名后卫,5 名中场球员和 3 名前锋,以完善你的阵容并有资格参加比赛。
  • 同一个足球队不能有 3 名以上的球员。

因此,我们用一个针对这些条件的if-else语句开始我们的 python 算法,然后在此基础上添加我们自己的条件和逻辑,这样每次算法遍历我们的玩家列表时,它都可以使用智能逻辑根据下面的条件做出有效的选择:

  • 检查一个球员是否受伤,被禁赛或不能比赛,如果是这样,即使他们有很高的投资回报率,也不要选择这个球员加入我们的梦幻队。
  • 先挑联盟累计联赛积分最多的前三名明星球员。(我们将使用不同数量的明星球员来测试这种情况的结果,并选择能够产生最大投资回报的版本,同时仍然允许足够的剩余预算来填充我们的团队,让我们拥有许多投资回报率排名前 50 的球员。
  • 每次我们挑选一名球员并将其加入我们的球队,我们都会从 1 亿美元的预算中减去他们的费用,并将他们的位置和球队名称添加到一个列表中,以确保我们不再为达到限制的位置和球队购买球员。
  • 一旦选择了最佳数量的昂贵超级明星球员,该算法就开始浏览投资回报率最高的球员名单,并试图尽可能多地找到顶级球员,直到我们接*耗尽我们的预算并填补所有的球队职位。
  • Algorithm 打印出它在最后挑选的球员名单,并给我们剩余的预算和球队的总幻想点数。

这里是我们团队挑选算法的一些压缩 Python 代码:

最佳幻想队选择器

下面你可以看到我们的算法选出的最终团队的截图:

注:以下团队仅准确到 2018 年 11 月 14 日。我们的算法被设计成在每个游戏周之后更新玩家数据,并根据团队/玩家 ROI 数据的波动做出新的选择。

截至 2018 年 11 月 14 日的金钱团队(总幻想点数为 944,世界排名:580 万人中的第一名)

注:我们为 AVG·乔团队编写了一个类似的算法,该算法更侧重于将预算花在大球队的明星球员身上,这些球员往往定价过高,可能无法在我们 1 亿英镑的有限预算中获得最高的累计投资回报。

注意:我们还要求一位同学选择一个他自己的随机团队,这样我们就可以比较他的选择,并验证我们针对 AVG·乔算法的随机团队选择器函数是准确的。

4.比较我们的结果

既然两种算法都已经建立并执行,让我们比较一下“金钱团队”与“AVG·乔的团队”和“随机同学团队”的结果,看看哪一个表现最好,差距有多大。最终结果显示,我们队的总得分为 944 分对仅 812 分。对于 AVG·乔团队(类似于我们同学的团队),这是一个显著的 132pt 差异!下面的柱状图展示了我们的结果:

需要回答的有趣问题:我们的算法是否返回了最高 ROI 团队?它是否以显著优势击败了其他公司?我们的算法是否成功地从一些我们最初认为被低估的中游球队中挑选了球员?AVG·乔算法和我们的同学从顶级球队中挑选了更多价格昂贵的球员吗?

下面我们可以看到,我们的算法从我们在项目开始时确定的大部分高 ROI 团队中挑选了一组球员:

金钱团队玩家分布

这是一个更加*衡和公正的选择方法,而不是 AVG·乔在选择他/她的球员时所用的方法。请注意,下面的饼状图显示了 AVG 乔队选择的 11 名球员的球队名单。由于 AVG·乔将他/她的大部分预算花在挑选 11 名非常昂贵的球员上,他/她不得不将剩余的预算花在最便宜的可用球员上,以填补所有的替补位置,但是这些球员中没有一个可以用于产生幻想积分,因为他们实际上从未参加过真正的 EPL 比赛,并且仅被用作球队填充员。这些是来自布赖顿和卡迪夫的一些替补队员。

AVG 乔队球员分布

结论:

消除团队/玩家的偏见和偏袒,专注于实际的玩家统计数据,让我们的算法得到最大的回报,并以总计 132 分或整整 16.25% 的优势击败了普通的 EPL 幻想玩家!最后,事实证明我和我的朋友实际上并不“不幸”,我们的梦幻联盟球队年复一年表现不佳是有原因的。这种对球员数据的深入研究让我们意识到,我们正在允许球队偏袒和购买大量高价球员的倾向,从而损害我们的整体梦幻联盟表现。

5.后续步骤

我们计划继续监控这些数据,在赛季中当球员开始受伤,争夺积分奖杯变得更加激烈时,检查球员统计数据中的任何剧烈变化和异常值。我们还想比较算法的团队在赛季结束时与世界上大多数休闲球员相比的表现。此外,我们计划每月更新一次这个博客,为那些对我们的人工智能进展感兴趣的人,所以请在每个月底重新访问这个博客,了解性能更新,并享受 EPL 行动的其余部分!!!

使用序列模型的自然语言生成

原文:https://towardsdatascience.com/how-our-device-thinks-e1f5ab15071e?source=collection_archive---------23-----------------------

使用单层 LSTM 模型生成文本

递归神经网络(图片由作者提供)

简介

如果我告诉你,你可以让你自己的设备以你自己的方式用不到 100 行代码为你写东西,那会怎么样?

让你的设备代表你书写的想法非常鼓舞人心。这种实践被称为文本生成自然语言生成,这是自然语言处理(NLP)的一个子领域。

文本生成的基础可以很容易地分解成一个简单的监督机器学习问题,其中,存在某些特征(称为 x)及其相应的标签(称为 y),并且使用这些特征,我们可以创建我们自己的预测函数,该预测函数然后将生成我们预测的标签(称为 ŷ或 yhat)。然后,我们将这些预测标签映射到实际标签,以确定成本并使用优化算法(如梯度下降、RMSprop 甚至 Adam 优化器)进行优化。

我们把文本生成的任务简化为一个简单的预测问题。因此,通过这一点,我们可以有一个文本语料库,其中可能有几个句子。我们提取每个句子(假设它有 n 个单词),在每个句子中,我们将开始的 n-1 个单词标记为特征(称为 x ),将第n个单词标记为标签(称为 y)。

现在,假设我们有一个句子,“深度学习已经自动化了我们的世界”,在这里,“深度学习已经自动化了我们的”这个短语可以是特征(称为 x),最后一个词“世界”可以是标签(称为 y)。所以在未来,每当设备遇到文本“深度学习已经自动化了我们的”时,它就会知道预测“世界”是下一个单词。

结果,如果我们用大量的数据训练一个网络,我们会得到一个相当复杂的模型,可以预测接下来的单词和 voilà ,我们已经教会了我们的设备写作。

使用 TensorFlow 生成文本

我们现在将学习如何应用实用方法生成新文本。为此,我们将使用 TensorFlow 2.0,这是一个开源的机器学习库。

导入必要的库

为此需要遵循的步骤是:

  • 数据预处理:

我们来看两个例句:

艾是新电

AI 就是我的力量

(注意,与机器学习实践者用来训练模型的实际数据相比,这里采集的样本非常*。通常,使用作家出版物的整个语料库或整本书作为数据集,然而在这里,为了便于理解,作者只取了其中的一*部分。)

为简单起见,为了减少我们集合中的大量单词,我们可以将句子中的每个单词都转换为*写,因为这不会改变句子的意思(new、NEW 和 New 都是相同的意思)。我们可以通过使用来做到这一点。Python 3 中的 lower()

所以我们句子的*写形式是:

艾是新电

ai 是我的力量

我们现在有一个样本来训练我们的模型。接下来要做的是为每个单词生成一个唯一的令牌。语料库中的重复单词被分配相同的标记。这可以使用 TensorFlow 中的 Tokenizer 轻松完成。

第一句:

ai - > 1

是- > 2

->3

新增- > 4

电- > 5

第二句:

ai - > 1

是- > 2

我的- > 6

电源- > 7

现在,我们可以用一系列数字来表示我们的句子:

【1,2,3,4,5】->为第一句

【1、2、6、7】->为第二句

生成令牌

我们现在生成 n-gram 序列,其中,这样的句子的前两个单词可以是一个序列,前三个单词可以是下一个序列,以此类推。因此,我们列出了以下可能的顺序:

对于第一句[1,2,3,4,5]

[1, 2]

[1, 2, 3]

[1, 2, 3, 4]

[1, 2, 3, 4, 5]

对于第二句[1,2,6,7]

[1, 2]

[1, 2, 6]

[1, 2, 6, 7]

我们现在将这些生成的序列添加到另一个列表中(形成一个 2-D 列表)。

生成 n 元语法序列

这里需要注意的一个关键点是,每个生成序列的长度是不同的,因此为了保持顺序,我们用零预先填充,每个序列的长度等于可用的最长序列。因为在当前情况下,序列的最大长度是 5,所以我们相应地进行预填充。可以使用 Keras 的 pad_sequences()方法进行填充。

填充后,每个序列将看起来像:

对于第一句[1,2,3,4,5]

[0, 0, 0, 1, 2]

[0, 0, 1, 2, 3]

[0, 1, 2, 3, 4]

[1, 2, 3, 4, 5]

对于第二句[1,2,6,7]

[0, 0, 0, 1, 2]

[0, 0, 1, 2, 6]

[0, 1, 2, 6, 7]

我们现在知道,对于这些序列中的每一个,前 4 个字是特征(称为 x),最后一个字是标签(称为 y)。然后,我们通过简单的 NumPy 数组切片来提取我们的特征及其相应的标签。

剩下要做的一件事是将我们的标签转换成一个热点编码向量,以便于优化。

说特征是x =【0,1,2,3,4】****

对应的标签是标签=【5】****

因此,标签的独热码编码向量是:[0,0,0,0,1],即在向量的第 5 个位置存在 1,在剩余位置存在 0。

因此, y = [0,0,0,0,1]

生成要素(x)和标注(y)

我们现在已经准备好了可以输入到模型中的训练数据。

  • 构建模型:单层 LSTM 模型

我们定义了一个序列模型,其中每一层恰好有一个输入张量和一个输出张量。

  1. 第一层是嵌入层,它将是网络中的第一层。这一层有三个参数,即输入*度(我们的语料库中唯一单词的总数);输出*度(或向量将被映射的嵌入*度);和输入长度(输入的每个序列的长度)。
  2. 对于第二层,我们添加了 20 个单元的双向 LSTM** 层,这对于处理长句和依存关系中的消失梯度问题是有效的。**
  3. 因此,在第三层,我们添加了一个密集层p 单元。其中 p 是我们的语料库中唯一单词的总数,我们将 softmax 激活应用于这些单元中的每一个。

模型构建

  • 编译模型:

由于下一个单词的预测是一个多类分类问题,我们选择我们的损失函数作为分类交叉熵和优化器作为 Adam。通过选择这一优化器,我们允许 TensorFlow 自行调整学习速率,这为我们消除了一个需要微调的超参数。然后我们训练模型,比如说 500 个时期。

编译模型

拟合训练数据后,我们的模型显示训练准确率接* 95%,剩下我们要做的就是使用该模型进行预测。

  • 预测下一个单词:

现在,为了进行预测,我们必须给我们的模型一些感知,让它知道我们希望它在什么意义上生成文本。为此,我们给它一个初始短语或句子,然后模型解析它,并根据我们训练它的文本语料库进行计算预测。因此,该模型将预测下一个单词的标记,然后将该标记转换回原始单词,最后显示整个预测的字符串。

预测接下来的 t 个单词(这里 t=5)

现在通过一个例子来理解整个过程,让我们用下面的句子来训练这个模型:

深度学习的范围一直在以指数速度增长,深度学习蓬勃发展的原因隐藏在这样一个事实中,即在当今世界中存在大量我们认为理所当然的应用程序,从在我们的 iPhone 上使用嘿 Siri(触发词检测)到在我们的 Gmail/LinkedIn 上使用自动回复(情感分析);深度学习已经在我们甚至没有意识到的情况下自动化了我们的世界。这个世界需要深度学习来*持,因为它已经变得必要。”

这里,生成新文本的种子是:

输入=人工智能的范围

因此,该模型预测:

输出=人工智能学习范围已经自动化了我们的世界

现在,由于我们的模型,预测的句子可能在语法上不正确,但句子的整体主旨很容易理解。

总而言之

人们可能会认为模型做出的预测看起来有些微不足道,但必须记住,在文本生成之前,我们的设备无法形成新的句子,事实上,它甚至不知道构造单词所需的基本字母。

从让我们的设备理解文本中的情感到预测给定序列中的新词,NLP 已经走过了很长的路,我们甚至可以走得更远。

这里是作者的 Github 库的链接,可以参考完整的代码。

** [## ujjwalkumar 2607/NLP-使用 LSTM 自动生成文本

该模型被给予一个初始数据序列来学习,这是:“深度学习的范围已经…

github.com](https://github.com/ujjwalkumar2607/NLP-automatic-text-generation-with-LSTM)**

疫情如何影响大学成绩:基于真实数据集的分析

原文:https://towardsdatascience.com/how-pandemic-has-affected-college-scores-analysis-on-real-dataset-e6cea8c469b1?source=collection_archive---------49-----------------------

深入探究我的大学成绩并发现其中的趋势

疫情冠状病毒已经影响了世界上很多人。所有类型的企业都崩溃了,人们正在转向不同的领域,大多数行业正在转向在线模式。随着在线模式在今天如此普遍,教育领域也不例外。我住在印度和这里,这是第一次所有的教育机构都选择在线教学方法。这个系统对我们来说很新,完全适应这个环境需要时间。最*,我第四学期的成绩公布了,当我把这学期的统计数据与前几个学期进行比较时,我震惊了。想知道我发现了什么?开始挖掘数据吧!

乔治·托马塞蒂Unsplash 上拍摄的照片

关于数据

数据看起来怎么样?

我所在的大学最棒的一点是,它以开放的 pdf 格式发布结果,每个访问其网站的人都可以访问这些结果。但是这里有一个问题,pdf 有多层、多层次的表格,很难处理。即使您查看表格并尝试推断您的最终得分,这也是一个繁琐的过程,因为您需要参考多个 pdf 中的多个页面来获得想要的值。以下是 PDF 的截图:

由于隐私问题,一些细节已被隐藏。作者照片

如果你仍然对查看实际的 PDF 感到好奇,请点击这个链接下载你想看的任何学期成绩!

一件重要的事情

我不会解释数据提取过程,因为解析器仍在开发中,源代码尚未公开。这是一个很长的过程,因为文件可能从 100 页到 400 页不等,并且必须进行大量预处理才能获得最佳结果。我根据这些 pdf 做了一个简化的结果门户。你可以在这里查看(这是一个 Heroku 应用,可能需要一分钟左右才能启动)。这所大学在不同的文件中同时公布所有附属学院的成绩。我把所有学院的数据综合起来,每学期做一个档案,简化比较。每个文件大约有 5.9k 个条目,这里我们将比较第四学期的结果和以前的学期。

缩写:

印度的常见分支机构:

  • IT:信息技术
  • CSE:计算机科学与工程
  • 欧洲经委会:电子和通信工程
  • EEE:电气和电子工程
  • 机械与自动化工程

不同的分科招收多少学生?

我们考虑的第一个问题非常简单,我将以柱状图的形式展示数据来回答这个问题。

不同学科的学生

这里有一个有趣的事实,印度每年培养出世界上 25%的工程师,但缺乏推动创新的研究人员。在这里,每个学生都想获得 CSE,只是为了加薪,不管他们是否足够熟练。从这个柱状图中可以明显看出,在一所相当*的大学中,大约有 2000 名学生选择了 CSE(如果你想知道,我选择了它😀)其次是 ECE 和 MAE 是这里最不被看好的分支。你一定在想这和疫情有什么关系?这是我做预测的地方。由于新生入学尚未开始,我没有这一届的数据,但鉴于目前的情况,我相信 CSE 和 IT 将迎来另一个高峰,因为大多数学生都在广泛使用*工具,每个人都将真正对技术感兴趣,而不是任何其他外部因素,这可能会增加研究人员。

*均 SGPA 和百分比

SGPA 代表学期绩点,这是在最初阶段筛选工作简历时最常见的标准。让我们来看看第三学期的 SGPA 和第四学期的 SGPA 的对比:

这里所有大学的*均水*都在各自的学期范围内

这里所有分支的*均值都在各自的学期范围内

惊讶,困惑?我也是。让我解释一下这是怎么回事。您正在查看的图表是 seaborn-distplot,它显示了位于分布范围内的 SGPA 大学或分校的*均值,图表显示了第三和第四学期的数据。为了更好地理解这一点,下面是第四学期的 SGPA 分支的实际数值形式:

按作者分类的数据

在第四学期,SGPA 山脉的变化是如何发生的?答案很简单。发生这种情况是因为在这个学期,冠状病毒处于高峰期(☹️仍处于高峰期),所有的课程都暂停了。在此期间,该大学试图提出不同的解决方案来评估本学期的学生,因为物理考试不可行,在线考试也有其自身的困难。然后决定在第三学期对学生进行 50%的评估,50%的内部评估通过电话和一些谷歌测验进行。奇怪的是,在大学水*上,当第三学期 SGPA 在 5.5 到 7.5 之间时,那么怎么会第四学期有 6.5 到 9 的范围?为了证明我的观点,我回去将这些学期与第二学期进行了比较,结果确实令人震惊:

第二学期 SGPA 与第三学期的比较

第二学期 SGPA 与第四学期的比较

从上面的两个图表,我们可以说第四学期的评估方法对学生太宽松了。如果一个学生得了 8 分 SGPA,那么与第二学期相比,这没什么大不了的。如果我们看百分比趋势,那么它与我们在 SGPA 发现的非常相似:

第二学期与第四学期的百分比比较

第三学期与第四学期的百分比比较

让我们假设大学在采取这种评估方式时犯了一个错误,最终给了所有学生额外的分数,但是当我从学生的角度思考时(我就是这样!),要知道**的努力却换来了大量的成果,这绝对令人惊叹。从长远来看,这不会有帮助,这一切都归结为一个结论,为什么印度失业率高。

终极顶级

第四学期对学生来说是个灾难。这学期 SGPA 加入后,他们本来很低的*均绩点提高了。因为每一个团体都有一个领导者,toppers 与此类似,他们都是在各种情况下都表现出色的杰出人士。鉴于目前的情况,我原以为这学期我们不会有这种趋势,但当我看到过滤后的结果时,我的想法发生了转变:

分支明智的学生数得分完美 10 SGPA

本学期某一特定分支的 60 名学生中最多有 10 名获得了满分!我在第三学期尝试过,没有结果!他们中没有人得过满分 10 分,所以我调整了逻辑,让第三学期的 SGPAs 高于 9 分,结果如下:

SGPA 得分大于 9 的学生人数

即使有了这些标准,也只有 45-48 名学生的 SGPA 得分高于 9 分!

最后一个音符

这是一种令人担忧的情况,就好像我们给了学生太多的评分自由,那么他们就会认为这些课程是理所当然的,而永远不会努力通过实际表演来取得好成绩。这类似于我们在模型构建中称之为假阳性的情况,当学生应得的分数较低时,他们被错误地给予分数(如果你想要混淆矩阵的详细解释,请在下面评论)。从学生的角度来看,我们永远不会满足于我们没有达到的分数,我认为需要一种更好的评估方法来取代这个有缺陷的系统。

这就是这篇文章的全部内容,我希望我能够以最好的方式表达我的分析。在 medium 上关注我以获得关于新文章的更新,如果你是一个热情的 Python 开发者,想要升级他们当前的技能,那么请确保在 medium 上查看我的 Python 系列中的 android 应用。说完了,合十礼!

LinkedinGithub

你的生日有多受欢迎?

原文:https://towardsdatascience.com/how-popular-is-your-birthday-91ab133f7fc4?source=collection_archive---------26-----------------------

阿迪·戈尔茨坦在 Unsplash 上的照片

房间里的两个人同一天生日的几率有多大?

在 2020 年之前的几年里,大量学生(20-30 或更多)在一起上数学课是很常见的。在许多课堂上,学生们被要求计算其中两人同一天生日的概率。

为了进行这种计算,学生们通常会做一个默认的假设,即每个人在任何给定日期出生的可能性都是相等的(均匀分布)。没有这个假设,问题就变得很难手工做。另一方面,你会经常看到类似于下图的可视化在互联网上流传。

生日的相对受欢迎程度

我将在下面更多地讨论用于生成本文中的数字和值的数据。这张图表显示了某人在某一天过生日的相对可能性。

  • 值为 1(如 12 月 16 日)意味着一个随机的人在那一天出生的概率与你对均匀分布的预期相同。
  • *于 1 的值(特别是 1 月 1 日、7 月 4 日和 12 月 24-26 日)意味着随机选择的人在那一天出生的可能性比均匀随机选择的人低很多倍。
  • 大于 1 的值(特别是 9 月中旬)意味着一个随机的人更有可能在那一天出生,而不是你天真的期望。

请注意,对于大约每 4 年出现一次的 2 月 29 日,均匀分布意味着一个人在 2 月 29 日出生的可能性是在 2 月 28 日出生的可能性的四分之一。这在上面的图表中有所说明(如果不进行修正,与假设均匀分布的一年中其他任何一天出生的概率相比,2 月 29 日生日的相对频率为 0.92/4 = 0.23)。

7 月 4 日是美国的一个重要节日,但它不受欢迎,这应该会提醒你,这个数据只是针对美国的。

在本文的第一部分,我们将重点讨论概率问题,即:一个房间里的两个人同一天生日的几率是多少?首先,我们将使用生日在一年中均匀分布的假设来计算生日问题的解决方案。其次,我们将使用蒙特卡罗方法来计算给定的观察分布的解决方案。

结果将是,即使考虑到经验分布,答案也是不变的(虽然很接*!).对于我们考虑的问题的每一个版本,答案都是 23 刚好可以让两个人同一天生日的概率达到 50%。

在文章的第二部分,我们将进一步探索生日的分布,并建立一个简单的模型来理解出生的变化。

制服生日问题

在学校里,这个问题可以这样提出:

假设一个房间里有 n 人。假设没有人在 2 月 29 日生日,并且他们的生日是均匀分布在一年中其他 365 天的随机变量。找出 n 的最*值,使得至少两个学生同一天生日的概率至少为 50%。

为了解决这个问题,我们改为计算没有两个学生同一天生日的概率。我们把学生编号为 1 到 n 。第一个学生不与任何以前的学生共享生日的概率是 365/365=1。对于第二个学生,有 364 天不与以前的学生重叠,所以他们不与以前的学生同一天生日的概率是 364/365。下一个学生是 363/365 等等。

结果是下面的量,我们将把它表示为 q 。目标是找到最*的 n ,使得 q ≤0.5。

没有两个学生有相同的生日

在这一点上,大多数人都伸手去拿他们的计算器。但是我们可以通过对数和泰勒展开继续手工估算:

用对数的一阶泰勒展开式逼* ln q

在第一行中,我们取对数,把乘积变成和。我们还将每个分数重写为 1–x 的形式。当 x 较*时,一阶泰勒展开是一个很好的*似,ln(1–x)=–x。这是我们在第二行中应用的内容。第三行使用算术级数求和的公式(我们只是将分子中的 1+2+3+⋯+(n–1)相加)。ln(2)是著名的 0.69。乘法 0.69⨉365≈252(四舍五入)。 n 应该比 2⨉252 = 504 的*方根大一点,所以 n = 23 是我们基于这些*似值的猜测(在 ln q *似值的分子中产生 253)。事实上,这是正确答案,如下图所示(精确计算/精确到数字)。代码链接在末尾。

经验生日问题

现在我们转向使用真实数据解决生日问题。这个数据是由 FiveThirtyEight 提供的,是基于社会保障局(政府)从 2000 年 1 月 1 日到 2014 年 12 月 31 日每天的出生人口统计数据。有理由假设这涵盖了那段时间内美国几乎所有的新生儿。

根据给定的数据,我们来估计两个人同一天生日的概率。我们假设我们的 n 人的生日根据我们数据的经验分布是 iid 分布的。没有可行的直接方法从数据中计算出来,所以我们求助于蒙特卡罗方法。

具体来说,对于每个 n ,我们将从分布中进行抽样,并观察是否有生日相同的。同样,代码(和测试用例)在最后链接的回购中。有点令人惊讶的是,结果基本上没有变化。结果如下图所示,其中还标有统一生日问题的值。经验结果也有 99%的置信区间,这个区间*到你看不到(每个n使用 100,000 次模拟)。

这种分布足够接*均匀,以至于结果 n=23 继续适用于经验案例!从某种意义上说,事后看来,这是一个不必要的分析。两条曲线之间的差异如下图所示,您可以看到它们在统计上是不可区分的。

要明确的是,分布是不一样的。然而,该模拟是在每个 n 值 100,000 次抽取的情况下运行的,没有足够的统计能力来揭示差异。大量的模拟将揭示统计上显著的(但实质上很*的)差异。例如,仅针对 n=23 运行 5,000,000 次抽奖,最终产生足够的统计能力来区分。经验分布有 P=50.786% 0.022%,而均匀分布有 P=50.730%。(误差幅度是 1 个标准差,而不是 95%的置信区间)。

一岁生日问题

现在,在任何一个固定的年份,出生分布偏离均匀的程度都应该高于总体水*。我们期望在任何一年看到的许多变化将会被消除。例如:

  • 任何给定的日期都将在 14 年的周期中循环通过一周中的每一天,因此由于一周中的每一天(下面讨论)而与统一值的偏差将被隐藏。
  • 感恩节(美国 11 月的第四个星期四)并不是每年都在同一天。回顾一下生日的相对流行度表,我们可以看到,在 11 月底有一个下降,但每年精确日期的轻微变化使它变得*滑。

回到生日问题,这可能会让我们担心。如果你问一个典型的 2020 年秋季四年级学生,大多数人会在 2010 年 9 月至 2011 年 8 月出生。我们期望比经验分布更高的可变性,因为他们中的每一个都不太可能出生在某一天,比如说,恰好是 2010 年秋天的劳动节。这可能导致不同的解决方案(也许 n=22?)的生日问题。

为了探索这一点,我们可以如下进行。

  1. 我们可以量化这种差异。kull back–lei bler 散度(KL–div)是两个概率分布之间差异的度量。对于整个数据集和每一年,我们可以计算出均匀分布的变化。
  2. 我们可以使用蒙特卡罗方法并从基于 1 年的分布中提取数据来重新解决生日问题。为了简单起见,我们将它保持为一个日历年。

对于第一个,我们在下面的图表中确认了我们的预期。年度基础上(0.021 .006)与统一基础上(0 . 002)的差异约为 10 倍。数据似乎还有一个有趣的趋势。我能想到的唯一可能的解释是日历通过一年中 7 个可能的开始日期逐渐循环。闰年打乱了周期,但粗略地说,我们预计,例如,7 月 4 日会从周一到周二再到周三等等。在 6 到 7 年的时间里。

在使用年度数据重新估计生日问题方面,我们可以这样做(使用每 n 10000 次运行的较*模拟规模)。曲线略高于均匀分布(以蓝色显示)。解决方案几乎改变,但事实上,n=23 仍然适用于一屋子同年出生的人。当 n=22 时,2009 年出生的人出现这种情况的概率高达 49.1%,而均匀分布的概率为 47.6%。

因此,事实证明,对于这个问题,统一假设已经足够好了,没有必要再烦恼了。

生日的分布

既然来了,那就看看我们还能从数据中得到什么其他见解吧。

星期几

你可能会惊讶地发现,周末并不是生孩子的好时机。下图显示了在我们的数据集中,一周中任何一天的*均出生人数。显示了 95%的置信区间,该区间很紧,表明周末和工作日之间有统计学上的显著差异,以及周一出生的人数明显较少。

你可能需要记住两个假设。让我们称之为消极和积极的假设(因为你可能对原因有什么感觉)

  • 根据我之前与医生的交谈,消极的一面是,产科医生(接生的医生)在周末分娩不方便。如果你可以去你的避暑别墅,为什么整个周末都要随叫随到呢?如果是真的,这将有点令人难过,因为剖腹产对美国医疗保健系统来说是昂贵的,而且它们将意味着不必要的手术以及随之而来的对母亲的风险。
  • 积极的一面是,你可以在这个数据分析中找到,医院在一周内都是满员的,所以那时安排剖腹产更安全也更容易。

你可以在那篇 538 文章中读到更多。

回归模型

总的来说,关于这些数据,你可能想问的一般问题是:如何解释任何一天出生人数的变化?以这种方式陈述,我们有一个经典的回归问题。我们想对数据建模,看看我们能学到什么。

我的目标是做一个快速简单的模型。例如,我们可以使用复杂的时间序列/预测工具,如脸书的预言家记录各种各样的假期以及假期的临*,每个假期都可以作为回归变量输入。我不想搞得这么花哨,所以对于协变量我们就用:

  1. 月份。
  2. 年份(考虑出生的长期趋势/变化)。
  3. 一周中的某一天。
  4. 通过查看图表和思考美国的主要节日,非科学地选择了一些节日。完整的清单在下面的附录中。总共有 17 个假日协变量。

同样,更复杂的分析将使用地理分类数据,并考虑各种因素,如天气、当地运动队的 performance⁴、(当地)经济,以及任何广泛影响人们并使他们和他们的伴侣(我猜是代理人)决定怀孕(或意外怀孕)的因素。

得到的模型非常好,R 为 94%。⁵这意味着 94%的出生率变化可以用这个模型来解释。以下是系数:

出生回归模型的系数

每个系数代表了在其他因素不变的情况下,出生人数的预期变化。你可以在最后链接的 GitHub repo 中找到确切的系数。橙色条显示 95%的置信区间。例如,在圣诞节,系数约为–5300 意味着在考虑月份(12 月)、星期几(变化)和年份后,在我们的数据集中,圣诞节出生的婴儿比我们预期的要少 5300 人。

对于月份表,系数表示相对于一月份的变化。因此,如果我们选择 9 月的某一天与同年 1 月的某一天进行对比,并保持其他所有因素不变(星期几、节假日),我们预计在 9 月的某一天会多出生 1140 人。同样,对于一周中的某一天,一切都与星期一相比。

截距(未示出)是一月份的一个普通星期一的出生人数,大约每天 12,000。随着时间的推移,出生率也略有下降,2000 年后,每天的出生率约减少 33 人,尽管进一步的研究(未显示)表明,这种影响不是线性的,不应过度解读。

情人节是生孩子的好时机,而阵亡将士纪念日周末似乎和其他周末一样好。剩下的假期,感恩节、圣诞节、劳动节、阵亡将士纪念日都相当冷门。我们看到,在主要节假日的其他日子里,影响很大,但较*。

就月份而言,我们看到一个明显的趋势,即出生从春季开始,到夏末初秋,在 9 月达到高峰。据推测,这代表了父母在前一个冬天选择做的事情。星期分析与我们之前看到的非常相似。

我们想问的下一个问题是,我们还错过了其他日子吗?下面显示的是模型的残差,按日期*均。你应该把这解释为之后的某一天的相对受欢迎程度,考虑到一周中的某一天、一个月中的某一天以及有限的假日选择。

具体来说,它显示了每天出生/未出生婴儿的异常*均数。这些残差都四舍五入到最接*的 10。

按日期分列的每日出生人数无法解释的变化

几件事立刻跳了出来。万圣节(10 月 31 日)是一个不受欢迎的生孩子的日子,我们忘了把它包括在内。7 月 5 日不受欢迎。在我的假日快速编码中,7 月 4 日周末之后的星期一(通常是庆祝这一天的日子)不会被包括在内,这可能解释了这一点。12 月 23 日也不受欢迎。

13 号的垂直蓝色条纹表明,在其他条件相同的情况下,人们也不喜欢在 13 号生孩子!他们也不喜欢在 9 月 11 日分娩(至少从 2001 年开始)。看看 12 月,我们发现人们更喜欢在月末生孩子:要么是圣诞节前的一周,要么是圣诞节和新年之间的一周。

结论

人们能够以某种方式控制何时生育,这非常令人着迷。很难说这是一种潜意识现象,是不同程度的压力,还是有意的医疗干预,还是其他什么。

我们已经看到,总的来说,出生的分布非常接*均匀(接*到生日问题的解决方案仍然是 n =23 )。另一方面,我们在更*的时间尺度上看到了重大变化:在一周的几天中,以及当以年度为基础进行检查时。但是,即使以年度为基础来看,这仍然不足以改变生日问题的解决方案。

最后,我们研究了出生率变化的模型,发现它主要是由假期、月份和一周中的天数来解释的。对于剩余的无法解释的差异,我们可以指出我们忘记建模的几天:13 号,万圣节,7 月 4 日周末,9 月 11 日,以及圣诞节前后的几天。

附录:假期列表

共有 17 个由节假日引入的协变量。对于每一个,如果包括任何相关联的周末,则所有周末的编码都是相同的。例如,劳动节有两个指示变量:一个是劳动节本身,另一个是劳动节周末。

  1. 新年、除夕和后天(3)
  2. 情人节(1)
  3. 闰日(1)
  4. 阵亡将士纪念日及其前一个周末(2)
  5. 7 月 4 日和相邻的周末,如果有的话(2)
  6. 劳动节和劳动节周末(2)
  7. 感恩节,前一天,和 Fri-太阳之后(3)
  8. 圣诞节、*安夜和后天(3)

参考

所有的数字和计算都是我自己的,尽管第一个数字在概念上并不新颖。提供的数据基于社会保障管理局的数据。复制数字和计算的代码可以在 Github 上获得。

笔记

[1]这是一个有时被遗忘的事实,闰年每四年发生一次,除非这一年能被 100 整除但是有一个警告,如果这一年能被 400 整除,这个例外就不适用。这意味着 1900 年和 2100 年不是闰年,但是 2000 年和通常的年份:1996 年、2004 年、2008 年等在一起。目前已知的活着的人中,没有一个人在其一生中没有经历过每四年一次的闰年(数据来自 2000 年至 2014 年),因此为了我们的分析目的,我们可以安全地将闰年视为每四年发生一次。我们肯定会忽略像闰秒这样不会对我们的分析产生实质性影响的深奥的东西。

[2]我不打算给出一个非均匀分布应该给出不同曲线的正式证明。但是,直觉上,在一年中的每一天支持的所有分布中,均匀分布最*化了两个人生日相同的概率。任何偏离这一点(由kull back–lei bler-divergence量化)必然导致两个人同一天生日的概率上升。在回购中,你可以找到一个例子,我们越来越多地扭曲数据,差异最终变得肉眼可见。

[3]从技术上讲,我们应该在分配 p 值时考虑多重比较。然而,很明显,仅从数据来看,结果将具有统计学意义。

[4]就我个人而言,在明*苏达双子队赢得世界冠军 252 天后,我出生在明*阿波利斯(人类的标准怀孕期是 280 天)。

[5]有关拟合优度的更多数据,请参见 Github repo。拟合的 RMSE 大约是每天 550 个新生儿,尽管分布有厚尾。

线性模型的集合能有多强大?

原文:https://towardsdatascience.com/how-powerful-can-an-ensemble-of-linear-models-be-231824de50e1?source=collection_archive---------35-----------------------

一组线性模型如何在 Kaggle 上进入 Mercari 价格预测挑战排行榜的前 6%。

随着*年来深度学习算法的快速增长,今天它们已经成为人工智能的最先进水*。这让我想知道传统和老式的机器学习技术,如线性回归,支持向量机等,是否仍然足够体面,可以与深度学习技术相抗衡?
为了检查这些经常被忽视的机器学习技术的能力,我将只使用传统的机器学习技术(没有神经网络)来解决一个 Kaggle 竞赛问题。

注意:我将在这个项目中使用 python 3.7。

博客的鸟瞰图-

该项目分为 6 个主要步骤-

  • 业务问题和评估指标
  • 关于数据
  • 探索性数据分析
  • 数据预处理
  • 建模
  • 从 Kaggle 排行榜获取分数。

B 业务问题及评估指标

很难知道一件东西到底值多少钱。*细节可能意味着价格上的巨大差异。例如,其中一件毛衣售价 335 美元,另一件售价 9.99 美元。你能猜出哪个是哪个吗?

考虑到有多少产品在网上销售,产品定价在规模上变得更加困难。服装有很强的季节性定价趋势,并受品牌名称的影响很大,而电子产品的价格根据产品规格而波动。日本最大的社区购物应用 Mercari 深谙这个问题。他们希望向卖家提供定价建议,但这很难,因为他们的卖家可以在 Mercari 的市场上出售任何东西或任何一捆东西。
在这场竞赛中,我们需要构建一个算法,自动建议正确的产品价格。我们将提供产品的文本描述,以及包括产品类别名称,品牌名称和项目条件等细节的功能。

本次比赛的评价指标为均方根对数误差。RMSLE 的计算方法如下:

其中:
是 RMSLE 值(得分)
n 是(公共/私有)数据集中的观察总数,
pi 是价格的预测,
aii 的实际销售价格。
log(x) 是 x 的自然对数

注意,由于这种数据的公共性质,这种竞争是一种“只有内核”的竞争。因此,我们需要构建一个代码,在一台拥有 16 GB RAM 和 4 个 CPU 的机器上一*时内执行。

一个 回合的数据

我们将使用的数据由 Mercari 提供,可以通过这个链接在 Kaggle 上找到。这些数据列出了 Mercari 网站上产品的详细信息。
让我们看看网站上的一款产品,以及它在数据集中是如何描述的。

https://www.mercari.com/

数据集有 8 个特征:

  • Train_id/Test_id: 数据集中的每个项目都有一个唯一的项目 id。这将在提交预测价格时使用。
  • 名称:代表产品名称,为字符串格式。以上产品名称为【安·兰德源头】**
  • 物品状况:卖家提供的表示物品状况的编号。它可以取 1 到 5 之间的值。在我们的例子中,产品的状态是'好',所以在数据集中用 4 表示。
  • 类别名称:代表物品的类别。对于上面的条目,数据集中提到的类别是‘其他/书籍/文学&*说’* ,这个特征的数据类型也是 string。*
  • 品牌名称:代表该商品所属品牌的名称。上述产品的品牌名称为‘企鹅兰登书屋’
  • 价格:表示商品的价格,在我们的例子中,这将是我们需要预测的目标值。单位是美元。以上产品,提供的价格为 '$9'
  • 运输:代表产品可用运输类型的编号。如果运费由卖方支付,运费将为 1,如果费用由买方支付,运费将为 0。对于上述产品,运输是免费的,因此在数据集中,此功能将为 1。
  • 物品描述:物品的完整描述。对于上述产品,说明中写道,《源泉》袖珍*装书——安·兰德——百年纪念版——经典文学——书的状况良好,封面和边角有一些磨损(见图片)。该特征已经以预处理的形式出现在所提供的数据集中。

让我们使用 pandas 导入数据,并检查前 5 个条目。

*import pandas as pd
data = pd.read_csv('train.tsv', sep='\t')
df_test = pd.read_csv('test.tsv', sep='\t')
data.head()*

E勘探数据分析(EDA)

在这一部分,我们将深入探索和分析数据。我们将逐一介绍这些数据。

价格

这是我们需要使用其他特征形式的产品信息来预测的目标特征。
让我们使用 describe()查看该特性的统计摘要

*data['price'].describe()*

  • 数据集中大约有 148 万个产品。最贵的产品定价为 2009 美元,最便宜的产品定价为 3 美元,而*均价格为 26.75 美元

现在我们来看看价格直方图。在这里,我使用的箱数是 200。

*plt.hist(data['price'], bins=200)
plt.xlabel('price')
plt.ylabel('frequency')
plt.title('histogram of price')
plt.show()*

  • 我们可以观察到分布遵循幂律分布,为了解决这个问题,并使其成为高斯分布,让我们将这些值转换为对数形式,即我们将用 log(price+1)替换价格值。

我们将价格转换为正态分布,因为它是统计学中最著名的分布之一,因为它符合许多自然现象,这使它成为我们可以进行分析的最容易解释的分布之一。将数据转换为正态分布的另一个原因是价格的方差减少了,并且大多数点都以*均值为中心,这使得模型的价格预测更加容易。

我已经把数据转换成了日志形式。下面是日志的直方图(价格+1)。

*plt.hist(data['price_log'], bins=20)
plt.xlabel('log(price + 1)')
plt.ylabel('frequency')
plt.title('histogram of log of price')
plt.show()*

  • 我们可以观察到,分布现在更容易解释,并试图遵循正态分布。
  • 此外,请注意大多数点是如何以*均值为中心的(*均值接* 3)。

项目条件标识

这是表示物品状况的分类特征。让我们使用 value_counts()查看更多信息

*data['item_condition_id'].value_counts()*

  • 输出告诉我们,这个特性可以占用 1 到 5 之间的 5 个值,并且具有特定条件的项目的数量就在它的旁边。

让我们看看这个特性的条形图

*sns.barplot(x=data['item_condition_id'].value_counts().keys(),
            y=data['item_condition_id'].value_counts())
plt.xlabel('item condition type')
plt.ylabel('number of products')
plt.title('bar graph of "item condition type"')
plt.show()*

  • 我们可以看到,大多数项目的条件 id 为 1,只有极少数项目的条件 id 为 5。

现在让我们比较具有不同 item_condition_id 的产品的价格分布

**

  • 我们可以看到,具有不同 item_condition_id 的项目的价格分布非常相似。

让我们来看看具有不同 item_condition_id 的产品的价格分布的箱线图和*提琴图。

*# plotting box-plot
sns.boxplot(x='item_condition_id', y='price_log', data=data)
plt.show()# plotting violin plot
sns.violinplot(x='item_condition_id', y='price_log', data=data)
plt.show()*

箱线图和 violin 图还告诉我们,具有不同 item_condition_id 的商品的价格分布差别不大,而且分布有点向右倾斜。item_condition_id = 5 的产品具有最高的中间价格,而 item_condition_id = 4 的产品具有最低的中间价格。大多数产品的价格在 1.5 英镑到 5.2 英镑之间

类别名称

这是一个文本类型的数据,告诉我们产品的类别。
我们来看看特征类别名称的统计汇总-

*data['category_name'].describe()*

这些是字符串类型的特征,实际上是三个子类别合并成一个。
让我们考虑上面描述中提到的最频繁出现的类别名称特征“女性/运动服装/裤子、紧身衣、打底裤”。它可以分为 3 个子类别:
-子类别 _1:“女性”
-子类别 _2:“运动服装”
-子类别 _3:“裤子、紧身衣、打底裤”
为了使该特征的可视化更容易,我将考虑该特征的子类别。让我们把数据分成*类。

*# this is to divide the category_name feature into 3 sub categories
from tqdm import tqdm_notebook
sub_category_1 = []
sub_category_2 = []
sub_category_3 = []for feature in tqdm_notebook(data['category_name'].values):
  fs = feature.split('/')
  a,b,c = fs[0], fs[1], ' '.join(fs[2:])
  sub_category_1.append(a)
  sub_category_2.append(b)
  sub_category_3.append(c)data['sub_category_1'] = sub_category_1
data['sub_category_2'] = sub_category_2
data['sub_category_3'] = sub_category_3*

子类别 _1

让我们检查一下统计描述:

*data['sub_category_1'].describe()*

  • 在我们的数据中,大约有 140 万个这样的函数,可以接受 11 个不同的值。其中最常见的是女性。

让我们绘制子类别 1 的条形图

*sns.barplot(x=data['sub_category_1'].value_counts().keys(), y=data['sub_category_1'].value_counts())
plt.ylabel('number of products')
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.title('bar-plot of sub_category_1')
plt.show()*

  • 我们可以看到,大多数项目的子类别 1 为“女性”,最少的项目为“运动和户外”。
  • 请注意,没有定义 sub_category_1 的项目用“无标签”表示。

让我们检查 sub_category_1 的分布和价格日志

*sns.FacetGrid(data, hue="sub_category_1", height=5).map(sns.distplot, 'price_log').add_legend();
plt.title('comparing the log of price distribution of products with
           sub_category_1\n')
plt.ylabel('PDF of log of price')
plt.show()*

  • 我们可以看到,大多数分布都是右偏的,只有一点差异。
  • “手工制作”子类别略有不同,因为我们可以看到该类别中的一些产品的 log(价格)低于 2

现在让我们来看看子 _ 类别 _1 的*提琴情节

  • 查看*提琴图,我们可以说,子类别 1 为“男士”的商品的销售往往更贵,而子类别 1 为“手工”的商品往往更经济。

子类别 2

让我们检查 sub_category_2 的统计描述:

*data['sub_category_2'].describe()*

  • sub_category_2 有 114 个不同的值,让我们分析一下 sub_category_2 的前 20 个类别。

sub_category_2 中前 20 个类别的条形图

*plt.figure(figsize=(12,8))
sns.barplot(x=data['sub_category_2'].value_counts().keys()[:20],
            y=data['sub_category_2'].value_counts()[:20])
plt.ylabel('number of products')
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.title('bar-plot of top 20 sub_category_2')
plt.show()*

  • 我们可以看到,大多数商品都有 sub_category_2,即“正宗服装”,其次是“化妆品”,然后是“上衣和衬衫”。

子类别 3

让我们检查 sub_category_3 的统计描述:

  • sub_category_3 有 865 个不同的值,让我们分析一下 sub_category_3 的前 20 个类别的直方图。

  • 我们可以看到,大多数商品都有 sub_category_3,如“裤子、紧身衣、打底裤”,后面是“其他”和“面部”。

品牌名称

这是另一个文本类型特征,表示产品所属的品牌。让我们来看看特性 brand_name 的统计摘要。

  • 在这里,我们可以看到共有 4089 个不同的品牌名称。

让我们看看前 20 个品牌的直方图

*plt.figure(figsize=(12,8))
sns.barplot(x=data['brand_name'].value_counts().keys()[:20],
            y=data['brand_name'].value_counts()[:20])
plt.ylabel('number of products')
locs, labels = plt.xticks()
plt.setp(labels, rotation=50)
plt.title('bar-plot of top 20 brands (including products with
           unknown brand)')
plt.show()*

  • 请注意,这里的“未知”表示没有指定品牌的商品。
  • PINK、Nike 和 Victoria's Secret 是网站上商品最多的前三大品牌。

让我们看看 20 大品牌及其*均产品价格的柱状图。

*plt.figure(figsize=(12,8))
sns.barplot(x=df['brand_name'].values[:20],
            y=df['price'].values[:20])
plt.ylabel('average price of products')
locs, labels = plt.xticks()
plt.setp(labels, rotation=50)
plt.title('bar-plot of top 20 brands with their mean product price')
plt.show()*

让我们看看产品价格最高的前 20 个品牌的柱状图

运输

这是一种数值分类数据类型,可以取 2 个值,0 或 1
让我们来看看它的统计描述。

*data['shipping'].value_counts()*

  • 发货为 0 的商品比发货为 1 的多 22%。

我们来对比一下不同出货的产品价格分布日志。

  • 我们可以看到,不同运输的项目的价格分布日志略有差异。
  • 运费为 1 的产品往往价格较低。

项目 _ 描述(正文)

这是描述产品的文本类型特征。让我们来看看其中的一些。

*data['item_description']*

  • 我们可以看到这些总共有 1482535 个。

我们将在执行一些 NLP 技术后使用这个特性,这些技术将在本博客的后面讨论。
我们可以对该功能做的另一件事是,计算它的字长,即该功能包含每个产品的字数,并对其进行分析。
我们来查看一下物品描述的 word_length 的统计汇总。

*data['item_description_word_length'].describe()*

  • 我们可以看到最长的描述有 245 个字,最短的没有字。*均来说,单词在 25 个左右

我们来绘制 item_description_word_length 的直方图,

*plt.hist(data['item_description_word_length'], bins=200)
plt.xlabel('item_description_word_length')
plt.ylabel('frequency')
plt.title('histogram of item_description_word_length')
plt.show()*

  • 我们可以看到,字长直方图遵循幂律分布。
  • 这个直方图我用了 200 个面元。

让我们通过取单词长度的对数,试着把这个转换成正态分布。这是分布图。

*plt.hist(data['log_item_description_word_length'])
plt.xlabel('log(item_description_word_length + 1)')
plt.ylabel('frequency')
plt.title('histogram of log of item_description_word_length')
plt.show()*

  • 我们可以看到,这个特征试图遵循正态分布。
  • 大多数项目的单词长度在 5 到 20 之间。(从 antilog 获得的值)。
  • 我们可以将此作为建模的一个特征。

现在让我们看看 log(item_word_length)如何影响商品的价格

  • 我们可以看到,随着 item_word_length 从 0 到 50,价格的对数增加,但随后价格趋于下降,除了我们可以在大约 190 的字长附*观察到的峰值。
  • 此外,单词长度超过 100 的价格波动更大。

产品名称

最后,让我们看看最后一个特性,即产品的名称。这也是一个文本类型特征,我们稍后将对其执行 NLP,但首先,让我们通过绘制“名称”特征中单词数量的直方图来对其进行一些分析。

*plt.hist(data['name_length'])
plt.xlabel('name_length')
plt.ylabel('frequency')
plt.title('histogram of name_length')
plt.show()*

  • 这种分布明显是左倾的,最大条目的名称长度大约为 25。

让我们看看价格是如何随着产品名称的字数而变化的。

*df = data.groupby('name_length')['price_log'].mean().reset_index()
plt.figure(figsize=(12,8))
sns.relplot(x="name_length", y="price_log", kind="line", data=df)
plt.show()*

  • 请注意,我使用的是价格日志,而不是实际价格。
  • 我们可以看到,name_length 值在 10 到 38 之间的分布非常线性,然后有一个急剧的下降和上升。

DT11数据预处理**

*在这一步中,我们将清理数据,并为建模做好准备。
记住,我们有 6 个特征,其中有:

  • 4 个文本特征:名称、描述、品牌名称和类别
  • 2 个分类特征:运输和商品条件 id*

让我们从清理文本特征开始,为此,我们将定义一些函数-

*import re
def decontracted(phrase):
    # specific
    phrase = re.sub(r"won't", "will not", phrase)
    phrase = re.sub(r"can\'t", "can not", phrase)
    # general
    phrase = re.sub(r"n\'t", "not", phrase)
    phrase = re.sub(r"\'re", " are", phrase)
    phrase = re.sub(r"\'s", " is", phrase)
    phrase = re.sub(r"\'d", " would", phrase)
    phrase = re.sub(r"\'ll", " will", phrase)
    phrase = re.sub(r"\'t", " not", phrase)
    phrase = re.sub(r"\'ve", " have", phrase)
    phrase = re.sub(r"\'m", " am", phrase)
    return phrase*

该功能的工作原理是将单词从“我们将”分解为“我们将”,“不能”分解为“不能”,“我们是”分解为“我们是”等。这一步是必要的,因为我们不希望我们的模型以不同的方式对待像“我们是”和“我们是”这样的短语。

*stopwords= ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've","you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their','theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after','above', 'below', 'to', 'from', 'up', 'down', 'in','out','on','off', 'over', 'under', 'again', 'further','then', 'once', 'here', 'there', 'when', 'where', 'why','how','all', 'any', 'both', 'each', 'few', 'more','most', 'other', 'some', 'such', 'only', 'own', 'same', 'so','than', 'too', 'very', 's', 't', 'can', 'will', 'just','don',"don't",'should',"should've", 'now', 'd', 'll', 'm', 'o','re','ve','y','ain','aren',"aren't",'couldn',"couldn't",'didn',"didn't", 'doesn', "doesn't", 'hadn',"hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't",'ma', 'mightn', "mightn't", 'mustn',"mustn't", 'needn', "needn't",'shan',"shan't",'shouldn',"shouldn't", 'wasn', "wasn't", 'weren', "weren't", 'won', "won't", 'wouldn', "wouldn't", '•', '❤', '✨', '$', '❌','♡', '☆', '✔', '⭐','✅', '⚡', '‼', '—', '▪', '❗', '■', '●', '➡','⛔', '♦', '〰', '×', '⚠', '°', '♥', '★', '®', '·','☺','–','➖','✴', '❣', '⚫', '✳', '➕', '™', 'ᴇ', '》', '✖', '▫', '¤','⬆', '⃣', 'ᴀ', '❇', 'ᴏ', '《', '☞', '❄', '»', 'ô', '❎', 'ɴ', '⭕', 'ᴛ','◇', 'ɪ', '½', 'ʀ', '❥', '⚜', '⋆', '⏺', '❕', 'ꕥ', ':', '◆', '✽','…', '☑', '︎', '═', '▶', '⬇', 'ʟ', '!', '✈', '�', '☀', 'ғ']*

在上面的代码块中,我定义了一个包含停用词的列表。停用词是不会给句子增加太多语义或字面意义的词。其中大部分是单词或不太重要的单词的压缩表示,如“a”、“at”、“for”等,以及符号。

现在我们将定义一个函数,该函数获取句子,并使用解串函数和停用词列表来清理和返回处理过的文本。

*from tqdm import tqdm_notebook
def preprocess_text(text_data):
  preprocessed_text = []
  # tqdm is for printing the status bar
  for sentence in tqdm_notebook(text_data):
    sent = decontracted(sentence)
    sent = sent.replace('\\r', ' ')
    sent = sent.replace('\\n', ' ')
    sent = sent.replace('\\"', ' ')
    sent = re.sub('[^A-Za-z0-9]+', ' ', sent)
    sent = ' '.join(e for e in sent.split() if e.lower() not in
                    stopwords)
    preprocessed_text.append(sent.lower().strip())
  return preprocessed_text*

使用 preprocess_text()函数清理文本数据的时间到了。

*df['name'] = df['name'].fillna('') + ' ' +
                       df['brand_name'].fillna('')
df['name'] = preprocess_text(df.name.values)df['text'] = (df['item_description'].fillna('')+
                       ' ' + df['category_name'].fillna(''))
df['text'] = preprocess_text(df.text.values)df_test['name'] = df_test['name'].fillna('') + ' ' 
                  + df_test['brand_name'].fillna('')
df_test['text'] = (df_test['item_description'].fillna('') + ' '
                   + df_test['category_name'].fillna(''))*

请注意,df['name']列包含连接和预处理的' name '和' brand_name '功能,同样,df['text']功能包含连接和预处理的' item_description '和' category_name '功能。

让我们继续进一步的过程,但在此之前,我们需要将数据分成训练集和交叉验证集。此外,我们将把目标值(即价格)转换成对数形式,以便它们呈正态分布,并且 RMSLE(均方根对数误差)易于计算。

*df =  df[['name', 'text', 'shipping', 'item_condition_id']]
X_test = df_test[['name', 'text', 'shipping', 'item_condition_id']]from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScalery_scaler = StandardScaler()
X_train, X_cv, y_train, y_cv = train_test_split(df, y,
                               test_size=0.05, random_state=42)
y_train_std =
     y_scaler.fit_transform(np.log1p(y_train.values.reshape(-1, 1)))*

现在是时候将这些预处理过的文本特征转换成数字表示了。在这个过程中,我将使用 TF-IDF 矢量器。我们将从特性“名称”开始

*from sklearn.feature_extraction.text import TfidfVectorizer as Tfidftfidf = Tfidf(max_features=350000, token_pattern='\w+', ngram_range=(1,2)) # using only top 350000 tf-idf features (with bi-grams).
X_tr_name = tfidf.fit_transform(X_train['name'])
X_cv_name = tfidf.transform(X_cv['name'])
X_test_name = tfidf.transform(X_test['name'])*

接下来是“文本”功能

*tfidf = Tfidf(max_features=350000, token_pattern='\w+', ngram_range=(1,3)) # using only top 350000 tf-idf features (with tri-grams).
X_tr_text = tfidf.fit_transform(X_train['text'])
X_cv_text = tfidf.transform(X_cv['text'])
X_test_text = tfidf.transform(X_test['text'])*

让我们也处理从“shipping”开始的其余分类特征
因为这个特征只取 2 个值 0 和 1,我们不需要对它们进行某种特殊的编码,让我们保持它们不变。

*from scipy import sparse
X_tr_ship =
         sparse.csr_matrix(X_train['shipping'].values.reshape(-1,1))
X_cv_ship = sparse.csr_matrix(X_cv['shipping'].values.reshape(-1,1))
X_test_ship =
          sparse.csr_matrix(X_test['shipping'].values.reshape(-1,1))*

第二个分类特征是‘item _ condition _ id’,它也是一个顺序特征。请记住,这些可以接受 5 个整数值(1–5 ),因此我们也将保持原样。

*X_tr_condition =
 sparse.csr_matrix(X_train['item_condition_id'].values.reshape(-1,1)
                                                               - 1.)
X_cv_condition =
  sparse.csr_matrix(X_cv['item_condition_id'].values.reshape(-1,1)
                                                               - 1.)
X_test_condition =
  sparse.csr_matrix(X_test['item_condition_id'].values.reshape(-1,1)
                                                               - 1.)*

请注意,我使用了-1,因为该特性包含 5 种介于(1–5)之间的值,所以-1 会将它们转换为(0–4)的范围。这将在转换为稀疏数据时给我们带来优势。

现在,作为最后一步,我们将按列堆叠这些特性。

我现在将把这些预处理过的数据转换成二进制形式,其中的值只能是 1 或 0。

*X_tr_binary = (X_tr>0).astype(np.float32)
X_cv_binary = (X_cv>0).astype(np.float32)
X_test_binary = (X_test>0).astype(np.float32)*

这一步的优点是,现在我们将有 2 个具有良好方差的数据集要处理。

M odeling

*是时候用我们的数据测试一些模型了。我们将要尝试的模型是-
-岭回归器
-线性 SVR

  • SGD 回归器
    -随机森林回归器
    -决策树回归器
  • XGBoost 回归器*

正态数据的岭回归量

线性回归

我们使用线性回归来寻找最优超*面(上面 gif 中的红线),使得损失或每个点到*面/直线的距离之和的*方最*。我们可以注意到,如果我们考虑在迭代次数=28 次时得到的线,损失将是最*的。
岭回归也称为 L2 正则化线性回归,这意味着它使用权重*方和作为惩罚。添加惩罚项是为了限制模型过度拟合(捕捉噪声)。
岭回归只有 1 个超参数 λ ,它与惩罚/正则化项相乘,并决定模型经历的欠拟合程度。λ的值越大,我们欠拟合越多。
alpha 就是正则化强度,它必须是一个正浮点数。因此,随着α的增加,欠拟合也会增加。

*import matplotlib.pyplot as plt
plt.plot(alpha_list, train_loss, label='train loss')
plt.plot(alpha_list, test_loss, label='test loss')
plt.title('alpha VS RMSLE-loss plot')
plt.xlabel('Hyperparameter: alpha')
plt.ylabel('RMSLE loss')
plt.xscale('log')
plt.legend()
plt.show()*

  • 我们可以观察到,随着 alpha 的降低,模型开始过度拟合。
  • α= 1 时,试验损失最*。

好的,我们的岭在 cv 数据上返回了 0.4232 的损失。

二元数据的岭回归

现在我们将对二进制数据使用岭回归

*import matplotlib.pyplot as plt
plt.plot(alpha_list, train_loss, label='train loss')
plt.plot(alpha_list, test_loss, label='test loss')
plt.title('alpha VS RMSLE-loss plot (on binary features)')
plt.xlabel('Hyperparameter: alpha')
plt.ylabel('RMSLE loss')
plt.xscale('log')
plt.legend()
plt.show()*

  • 我们可以观察到,当α= 100 时,损耗最*。

我们的岭回归在 cv 数据上返回了 0.4335 的损失。

让我们在二进制数据上尝试 SGD-Regressor(作为 SVR)

https://gifer.com/en/gifs/gradient

让我们快速刷新一下 SGD 是什么,它是如何工作的。还记得我在岭回归中提到的损失吗?损失有不同的类型,让我们从几何角度来理解。如果回归问题就是寻找最适合我们数据的最优超*面,那么损失仅仅意味着我们的数据与超*面有多大差异。因此,低损失意味着这些点与我们的超*面差别不大,模型表现良好,反之亦然。
在线性回归的情况下,损失是*方损失,它是通过将数据点到超*面的*方距离的总和除以项数而获得的。

损失函数很重要,因为它们定义了超*面是什么样子。还有其他被称为梯度下降的算法,它们利用这些损失函数并更新超*面的参数,以使其完美地拟合数据。这里的目标是最*化损失。SGD 是一种优化算法,通过逐步减少损失来更新超*面的参数。这是通过计算损失函数相对于特征的梯度,然后使用这些梯度向最*值下降来实现的。在上图(左部)中,我们可以看到该算法如何通过向山下走正确的一步来达到损失函数的最*值,并且随着每一步都在正确的方向上,参数得到更新,这导致更好的拟合超*面(右部)。要了解更多关于随机梯度下降(SGD)算法的信息,你可以查看这篇精彩的博客

https://AWS . Amazon . com/blogs/machine-learning/train-faster-more-flexible-models-with-Amazon-sage maker-linear-learner/

以下是一些其他常见损耗,但我们将使用“Huber”、“epsilon_insensitive”和“squared_epsilon_insensitive”来调整该模型的超参数。

随机搜索交叉验证告诉我们,L2 正则化的“*方ε不敏感”损失最适合此数据。顺便说一句,“*方ε不敏感”损失是另一个众所周知的机器学习算法支持向量机使用的损失之一,支持向量机通过利用支持向量来生成更好的拟合超*面,从而使用最大限度技术。

https://www . researchgate . net/figure/Schematic-of-the-one-dimension-support-vector-regression-SVR-model-Only-the-points _ fig 5 _ 320916953

  • 在该图中,虚线称为决策边界,位于虚线上的点称为支持向量,SVR 的目标是最大化这些决策边界之间的距离。

但是,为什么利润最大化如此重要,以至于 SVM 成为顶级最大似然算法之一?让我们使用一个简单的分类问题来快速理解这一点,我们需要找到一个分离蓝点和红点的最佳超*面。

https://medium . com/coin monks/support-vector-regression-or-SVR-8e B3 ACF 6d 0 ff

  • 请看图中由名称超*面最优超*面表示的两个*面。任何人都可以看出,最优超*面在分离蓝色和红色点方面比另一个*面好得多,并且使用 SVM,这个最优超*面几乎是有保证的。

一个有趣的事实是,“*方ε不敏感”损失中的*底部分是由于这种利润最大化技巧。可以参考本博客了解更多关于 SVR 的内容。

SGD 回归器(作为 SVR)在 cv 数据上返回 0.4325…的损失。

让我们在二进制数据上试试 SGD 回归器(作为线性回归器)

在这里,我们将执行所有先前的步骤,但针对的是二进制数据。

随机搜索交叉验证告诉我们,L2 正则化的“*方损失”损失最适合此数据。顺便说一下,L2 正则化的*方损失的设置听起来很熟悉,对吗?这正是我们在岭回归模型中使用的。在这里,我们从优化问题的角度来处理这个问题,因为 SGDRegressor 为我们提供了更多的超参数来调整我们的模型。

SGD 回归器(作为线性回归器)在 cv 数据上返回 0.4362 的损失。

正常数据的线性支持向量回归

让我们在正常数据上尝试支持向量回归机。这里的超参数是 C,也是我们在岭回归中讨论过的α的倒数。

*import matplotlib.pyplot as plt
plt.plot(C, train_loss, label='train loss')
plt.plot(C, test_loss, label='test loss')
plt.title('alpha VS RMSLE-loss plot (on binary features)')
plt.xlabel('Hyperparameter: C (1/alpha)')
plt.ylabel('RMSLE loss')
plt.xscale('log')
plt.legend()
plt.show()*

  • 我们可以看到,0.1 是超参数 C 的最佳超参数值,它使我们的测试损失最*。

线性 SVR 在正常数据的 CV 上返回 0.4326 的损失。

二进制数据的线性支持向量回归

现在,我们将对二进制数据尝试支持向量回归机。这里的超参数也是 C,也是我们在岭回归中讨论过的α的倒数。

*import matplotlib.pyplot as plt
plt.plot(C, train_loss, label='train loss')
plt.plot(C, test_loss, label='test loss')
plt.title('alpha VS RMSLE-loss plot (on binary features)')
plt.xlabel('Hyperparameter: C (1/alpha)')
plt.ylabel('RMSLE loss')
plt.xscale('log')
plt.legend()
plt.show()*

  • 我们可以看到,0.01 是超参数 C 的最佳超参数值,它使我们的测试损失最*。

线性 SVR 在二进制数据的 cv 上返回 0.4325 的损失。

基于树的模型

注意:我尝试的另一个*度技术是 truncated-SVD,但是它需要大量的 RAM(超过 16 GB)来进行计算,并且因为这是一个内核挑战,所以使用完整的数据没有多大意义。

为基于树的模型选择顶级特征:

*from sklearn.feature_selection import SelectFromModelfrom sklearn.linear_model import SGDRegressor
regressor = Ridge(alpha=100)
selection = SelectFromModel(regressor)
selection.fit(X_tr_binary, y_train_std.ravel())X_train_top = selection.transform(X_tr_binary)
X_cv_top = selection.transform(X_cv_binary)
X_test_top = selection.transform(X_test_binary)*

决策树

我们的第一个基于树的模型是决策树,在我们的数据集上使用它之前,让我们先快速了解它是如何工作的。

https://www . datascience central . com/profiles/blogs/the-complete-guide-to-decision-trees

*决策树由简单的 if-else 语句组成,使用这些条件,它们决定如何预测给定名称、条件等的产品价格。从几何学上讲,它们使用几个*行于轴的超*面来拟合数据。
在训练树的同时,树通过使用和验证训练数据来学习这些 if-else 语句。当它被训练时,它使用这些学习到的 if-else 条件来预测测试数据的值。
但是它是如何决定如何拆分数据或者在拆分数据和构建完整的树时考虑什么特征的呢?
嗯,它使用一种叫做熵的东西来构建树,熵是一种确定性的度量。
决策树有几个超参数,但我们将只考虑其中两个重要的-

  • max_depth: 它表示决策树的最大深度。因此,如果 max_depth 假定为 4,则在训练时,构造的树的深度不会超过 4。
    -min _ samples _ split:表示执行分割或考虑 if-else 条件时必须存在的最*数据点数。因此,如果 min_samples_split 假定为 32,则在训练时,如果所构造的树看到的数据点少于 32 个,则它不会应用 if-else 条件。*

以上两个超参数都限制了决策树的不足或过度捕捞。高的 max_depth 和低的 min_samples_split 值使决策树更容易过度拟合,反之亦然。

https://sci kit-learn . org/stable/auto _ examples/tree/plot _ tree _ regression . html

  • 在此图中,我们可以看到一个经过训练的决策树算法如何尝试拟合数据,请注意拟合线是如何由轴*行线组成的。
  • 我们还可以注意到,max_depth 值越大的决策树也越容易捕捉到噪声点。

我不会在这个博客中深入讨论决策树的内部工作原理,因为这会使它变得太长,要了解更多关于决策树的内部工作原理,你可以查看这个很棒的博客

让我们使用 RandomSearchCV 对我们的决策树执行一些超参数调整,并检查什么是我们的树的最佳超参数。

返回的最佳超参数值是 max_depth=64 和 min_samples_split = 64。现在让我们检查在这些超参数上训练决策树之后获得的损失。

考虑到训练需要 14 分钟,损失值并不是很大。到目前为止,我们的线性模型已经超过了决策树模型。

随机森林—(最大深度=3,n 估计值=100)

现在,让我们使用另一个非常棒的基于树的模型,或者我应该说模型来模拟我们的数据。
随机森林是由多个模型组成的集合。这个想法是使用数据的随机部分来训练多个模型,然后使用来自这些多个模型的*均预测作为最终值。这是有意义的,因为使用完整数据的随机部分训练几个模型会创建在不同方面存在一定程度偏差的模型。现在,从所有这些模型中取*均预测值,最终会得到一个更好的预测值。

随机森林这个名称来自于我们在从训练数据集中随机采样数据时使用的 Bootstrap 采样,由于我们使用多个决策树作为我们的基础模型,所以它有单词森林。**

https://towards data science . com/random-forest-and-its-implementation-71824 ced 454 f

上图显示了随机森林如何使用随机采样数据训练不同的基础学习者,分别表示为树 1、树 2…然后收集并*均这些树的预测。

随机森林有多个超参数,但对于我们的数据,我们将只使用 2:
- n_estimator: 这表示我们希望随机森林模型拥有的基础模型的数量。
- max_depth: 表示每个基础模型即决策树的最大深度。

让我们训练一个随机森林模型,并对其执行一些超参数调整。

这个模型的训练时间大约是 23 分钟。

我们可以看到,这个模型在给定的数据集上表现不好,结果一点也不好。

随机森林—(最大深度=4,n 估计值=200)

这里我使用了相同的模型,但是在架构上做了一些改变。我已经把最大深度增加到了 4,基础学习者的数量增加到了 200。
我们来看看模特表现如何。

该模型的训练时间约为 65 分钟。

结果略好于之前的随机森林模型,但仍然不接*我们的线性模型。

XGBoost — (max_depth=4,n_estimators=200)

https://github.com/bgreenwell】

这是我们将尝试的最后一个基于树的模型,它被称为 XGBoost。XGBoost 是 GBDT 的略微增强版本,它也是一种集合建模技术。在梯度增强中,目的是减少方差或减少数据集的欠拟合行为。让我们看看它是如何工作的。

http://uc-r.github.io/gbm_regression

在 GBDT,我们首先使用训练数据训练我们的第一个基本模型,这通常是一个高偏差决策树,然后我们从该模型中获取预测值,并计算由预测值与实际值的差异定义的误差。现在我们训练我们的第二个基础学习者,但是这次我们不仅仅使用训练数据,我们还使用从我们的第一个基础学习者获得的误差,并且我们再次从这个模型中获取预测值并计算误差。这一直持续到覆盖了所有的基础学习者,当我们一个接一个地训练基础学习者时,我们注意到误差值慢慢地减*。你可以在这里阅读更多关于 GBDT 的信息。
XGBoost 是 GBDT 的一个稍微修改的版本,它使用像随机森林中的行采样和列采样这样的技术来构造基础学习器。

*让我们快速检查一下 XGBoost 的代码,我将使用 2 个超参数:

  • n_estimators:它表示作为决策树模型的基础学习者的数量。
  • max_depth:表示基础学习器决策树的最大深度。*

该模型花了大约 27 分钟来训练。

结果没有随机森林差,但也没有线性模型好。

XGBoost — (max_depth=6,n_estimators=500)

让我们试试 XGBoost,max_depth=6,n_estimators=500。

我们可以看到一个体面的数量从以前的模型改进,但它需要模型 78 分钟的训练。

让我们比较不同的型号及其性能:

在上表中,我们可以看到基于树的模型花费了太多的计算时间,事实上,我用于基于树的数据要*得多,我只使用了从岭回归器中选择的顶部二元特征。因此,新数据只有大约 236k 个特征,而不是其他线性模型训练的原始 700k 个特征。我们还可以观察到,我们能够获得的交叉验证数据的最*损失是 0.4232…让我们尝试使用集成建模来进一步减少这一损失。

线性模型已经胜过其他基于树的模型,所以我将使用这些来创建一个集合。

让我们把前 6 个线性模型的结果串联起来。

**

现在,让我们快速测试一个简单的集合,该集合将这些特征作为输入,并将输出计算为这些值的*均值。

我们可以观察到损失略有增加,这意味着这种方法本身不足以产生好的分数。

现在,让我们检查这些新特征之间的相关性,因为它们都来自线性模型,并且产生类似的损失。如果它们高度相关,它们不会对整体损失有太大改善。

*import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10,8))
columns = ['y_pred_ridge_binary_tr', 'y_pred_ridge_normal_tr',
           'y_pred_svr_normal_tr','y_pred_svr_binary_tr',
           'y_pred_sgd_lr_binary_tr', 'y_pred_sgd_svr_binary_tr']
df = pd.DataFrame(y_pred_tr_ensemble, columns=columns)
Var_Corr = df.corr()
sns.heatmap(Var_Corr, xticklabels=Var_Corr.columns,
yticklabels=Var_Corr.columns, annot=True)
plt.title('Correlation between different features.')
plt.show()*

  • 我们可以看到,来自基础模型的结果是高度相关的,因此在它们的基础上构建一个集成并不能获得多少分数。

为了解决这个问题,我增加了数据的*度,添加了从线性模型中收集的顶级特征,这些数据是我们用来训练基于树的模型的二进制数据。

现在是时候在这些新生成的特征上尝试不同的模型,看看我们是否可以改善这种损失。

让我们试试使用不同超参数的 SGD 回归器

上面的代码块代表了 RandomSearchCV 返回的最佳超参数。

CV 损失没有达到标准,因为我们已经损失了 0.4232…我们正在寻找比这更低的损失。

让我们在新功能上试试线性支持向量回归机和岭回归机

*import matplotlib.pyplot as plt
ridge_loss = np.array(ridge_loss)
linearsvr_loss = np.array(linearsvr_loss)
plt.plot(alpha, ridge_loss.T[0], label='Ridge train')
plt.plot(alpha, ridge_loss.T[1], label='Ridge test')
plt.plot(alpha, linearsvr_loss.T[0], label='linearsvr train')
plt.plot(alpha, linearsvr_loss.T[1], label='linearsvr test')
plt.xlabel('Hyperparameter: alpha or (1/C)')
plt.ylabel('loss')
plt.xscale('log')
plt.title('Linear SVR and Ridge losses')
plt.legend()
plt.show()*

  • 我们可以看到,在 alpha=100000 时,岭回归和线性 SVR 返回的 cv 损失最*。让我们把模型放在那上面。

用 alpha = 100000 训练岭回归方程

用 C = 0.00001 训练线性 SVR

**

好了,通过查看上表,我们可以知道山脊和 LinearSVR 模型产生了最好的结果,所以我们将使用这些来生成一个和我们的系综的最后一层。

让我们使用这些模型快速拟合数据,并将输出连接起来,作为最终集合层的输入。

现在,我们将使用先前图层模型生成的输出来创建总体的最终图层。我们将使用一些线性模型,但在此之前,让我们测试简单的*均结果。

结果比单独的 LinearSVR 模型要好,但是到目前为止,岭仍然优于每个模型。

现在让我们为最后一层尝试一些线性模型:

新币回归器

**

让我们尝试使用岭和线性支持向量回归作为最终的图层模型

*import matplotlib.pyplot as plt
ridge_loss = np.array(ridge_loss)
linearsvr_loss = np.array(linearsvr_loss)
plt.plot(alpha, ridge_loss.T[0], label='Ridge train')
plt.plot(alpha, ridge_loss.T[1], label='Ridge test')
plt.plot(alpha, linearsvr_loss.T[0], label='linearsvr train')
plt.plot(alpha, linearsvr_loss.T[1], label='linearsvr test')
plt.xlabel('Hyperparameter: alpha or (1/C)')
plt.ylabel('loss')
plt.xscale('log')
plt.title('Linear SVR and Ridge losses')
plt.legend()
plt.show()*

  • 结果接*,但岭回归优于线性回归。

**

这里是用于集合的所有模型,以表格形式进行比较。

**

F 最后,让我们预测测试数据集的价格,并检查我们的组合在 Kaggle 排行榜上的表现。

在提交预测结果后,我获得了 0.42457 的分数,相当于 Kaggle 排行榜上的前 6%。

https://www . ka ggle . com/c/mercari-price-suggestion-challenge/submissions

未来工作

  • 这个问题可以使用深度学习算法来解决,如 GRU,MLP,伯特,因为大多数特征来自文本描述。我们可以在这些数据上尝试这些最先进的技术,并尝试提高分数。
  • 代码没有针对多处理进行优化,因此它使用所有 4 个 CPU。我认为这值得一试,因为这样的话,即使是基于树的模型也可以加入到整体中。

*R**引用 ***

遗书

感谢您阅读博客。我希望它对那些有志于做机器学习、整体建模、数据处理、数据可视化项目的人有用。

如果你对这个项目有任何疑问,请在这个项目的回复部分或 GitHub repo 中留下评论。

完整的项目可以在我的 Github 上找到:
https://github.com/SarthakV7/mercari_kaggle
在 LinkedIn 上找到我:www.linkedin.com/in/sarthak-vajpayee

和*!☮

Python 如何帮助我选择新家——第 3 部分

原文:https://towardsdatascience.com/how-python-helped-select-my-new-home-part-3-220cd5af592b?source=collection_archive---------37-----------------------

照片由克里斯蒂安·陈Unsplash

如果你是这个系列的新手,我建议你先看看《T4》第一部和第二部。否则,欢迎回来!像每一集《网飞》一样,这里有一个对之前发生的事情的快速回顾。

提示闪回

在我的按单生产(BTO)申请中,我想方设法得到了一个排队号来选择一个单元。在等待赴约的漫长过程中,我发现整个单位监控过程令人惊讶地疲惫低效。因此,我创建了 BTO 巴迪,作为一个基本的电报机器人,它能为我自动进行搜集和监控。

它很快在其他申请人中流行起来,这促使我开发了更多的功能,如识别受欢迎的单元、计算辍学率,甚至网站规划分析。

BTO 好友现在可以在 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨Web 上找到。

截至 2020 年 11 月 11 日,BTO Buddy 已经拥有超过 7,000 名用户,日活跃用户(DAU)约为 1,000 名。🥳,我真心感谢迄今为止我所得到的所有支持!

在本文中,我将介绍我在开发预测约会日期的新功能时所面临的挑战之一。

背景故事

“对于开发的每个功能,都必须有一些过去的痛苦”

一旦申请人成功收到一个排队号,他们必须等待的下一条信息就是他们的预约日期。他们的排队人数越多,等待的时间就越长。在这次约会中,他们将选择他们永远的家。

*均而言,申请人将在实际日期前两周收到预约日期。

BTO 是一个等待的游戏——图片由 imgflip 提供

在申请人收到他们的预约日期之前,没有官方途径了解现在发生了什么,也没有当前的排队号。因此,精明的申请人决定众包并在项目特定的电报组中分享他们的排队号和预约日期。

众包预约日期和排队号示例—图片由作者提供

这个巧妙的变通方法帮助许多其他人了解了每天的约会次数,并估计了他们可能收到约会日期的时间。然而,这种方法有两个问题:

  1. 不是每个人都愿意贡献,因为排队号是个人的事情。
  2. 聊天会收到垃圾邮件,其中包含复制粘贴消息来“更新”列表。

你也许能明白我的意思..

构建问题

希望你现在能想象他们被蒙在鼓里有多不舒服。鉴于 BTO 好友的用户注册过程收集了两个主要数据点:队列号预约日期,我们可以解决这个问题并将其打包成一个特性。

目标

#1 —提供可信、清晰的预约日期和排队号视图。

#2 —给定一个没有预约日期的队列号,预测预约日期。

考虑

  • 与众包方法不同,为了达到最佳效果,我们必须利用每个用户的数据,而不是在自愿的基础上。
  • 确保用户的匿名性,这样队列编号就不会识别用户。在众包方法中,用户必须复制并粘贴信息来添加他们的详细信息。鉴于电报鼓励匿名,这可能会暴露他们自己的身份。

挑战

每当我们处理用户贡献的数据时,很可能会有噪音。在我们的例子中,用户在注册过程中提供了队列号和预约日期。因此,很容易出现恶作剧行为

以下是它在日历视图中的突出显示:

BTO 好友网站上的日历视图带有误导性数据—图片由作者提供

这阻碍了我们的两个目标,因为它不仅看起来不可靠,而且当我们试图预测约会日期时,它可能会扰乱我们的模型。因此,我们必须首先清理数据,使其可用。

建立联系

为了使数据可用,我们需要删除不符合增长趋势的数据。在我们的例子中,我们需要检测并删除队列号 214 和 253。

表格视图:移除不流动的数字—图片由作者提供

如果你曾经在诸如黑客排名Leetcode 的*台上练习算法问题(我很少这样做😬),你可能会意识到这是现实生活中最长增长序列 (LIS)问题的一种表现🤯不知道是不是只有我,但当我知道这种联系时,我感到疯狂** 满足。我一直想知道在课堂上获得的理论知识如何应用到我们的日常生活中。**

如果您仍然看不到链接,这里有一个关于 LIS 问题如何很好地适合我的上下文的简单解释:

图片由作者

给定用蓝色划分的 16 个队列号,我想识别出不属于增长趋势中的哪些队列号,并删除它们。在这种情况下,通过删除 214 和 253,我的数据现在按顺序运行。这在假设大部分数据都正确输入的情况下效果很好。

求解 LIS 的算法可以用动态规划来完成。为了保持这篇文章的简单,我将不讨论这个算法。如果你感兴趣,网上有很多解释和代码(例如 GeeksForGeeks )。

预测

利用我们新清理的数据,我们对数据进行转换,以使我们将队列号作为独立变量(我们想要用来预测的变量),将 X预约天数作为因变量(我们想要预测的变量)。

为此,我们使用当前日期作为基线。例如,如果我们在 2020 年 10 月 15 日进行预测,我们从日期字段中减去2020–10–15,以获得距约会还有 N 天,即剩余

图片作者作者

最后,我们剩下的就是将数据拟合到一个简单的线性回归模型中,并将预测的剩余天数添加到当前日期。

BTO 好友现在有了一个新功能✨

正在运行的功能

电报应用

用户可以点击“Appt Dates”按钮,查看与每天第一个和最后一个队列号配对的匿名预约日期列表。

目标 1 的解决方案—图片由作者提供

Web 应用程序

没有预约日期的用户可以在 BTO 好友网站的日历界面上看到他们的计划预约日期。为了鼓励高级用户注册,这个特性只对高级用户可用😂

目标 2 的解决方案。(注:周六没有预约,因为 HDB 是休息日)——图片由作者提供

在上面的例子中,用户的队列号是 300,模型预测约会是在 2020 年 11 月 29 日。听起来差不多!

包扎

您可能想知道预测是否准确,因为我使用的回归只有一个特征。令人惊讶的是,我收到了几个用户的反馈,说预计的日期是 HDB 安排的确切日期。由于数据很少,这可能是我能采用的最好的方法之一。毕竟简单是关键!

现在,我可以自豪地说,BTO 巴迪是由计算机视觉和…

线性回归仍然是一个 ML 算法好吧—Image Bymeme generator

对于第 4 部分(可能是最后一部分),我将探索预测单元被占用的顺序和理想地解释这些因素的主题。
敬请期待!

****免责声明:我基于上下文知识对预测结果做了进一步的后处理,以提高其可靠性。因此,如果你打算复制这项工作,它可能对你有用,也可能没用。

大喊到 丹*斯 为李斯提示!

Python 如何在机器学习方面超越 R

原文:https://towardsdatascience.com/how-python-overtook-r-for-machine-learning-46be67fc19af?source=collection_archive---------19-----------------------

意见

Python 如何超越 R 并成为数据科学的标准。

(python logo src =http://python.org,R logo src =https://www.r-project.org/,tensor flow logo src =https://www.tensorflow.org/,Numpy logo src =http://numpy.org)

介绍

大约十年前,Pythonic 机器学习的想法在许多数据科学家眼中只是一闪而过。当时用于统计的最流行的语言之一是 R,它在机器学习的前沿也显示出了希望。然而,正如你很可能意识到的那样,这不再是事实,Python 不仅是机器学习最流行的语言,也是最流行的语言。

虽然 Python 和 R 都是*易*人的高级语言,但它们当然也有不同之处。其中一些差异可能归因于 Python 作为未来数据科学语言的崛起。

可用性

对于数据科学来说,从 R 到 Python 的转变有一个决定性的因素,那就是这两种语言的可用性。r 是一种主要的函数式语言,几乎完全是为科学计算而创建的。虽然在某种程度上它在许多方面都有能力,但 R 肯定不是一种通用的编程语言。

另一方面,Python 主要是一种面向对象的编程语言。这归功于 Python 相对于 R 的友好性,因为在很多方面,程序员可能会发现使用具有简单功能的对象比使用多态的系统化功能要容易得多。最重要的是,Python 最初并没有考虑统计计算,因此更适合通用编程。

虽然这些差异对于那些只做统计计算的人来说可能意义不大,但对于那些希望从更具技术性而非科学性的角度来研究机器学习的人来说可能意义重大。换句话说,Python 当然是一种更适合每一个程序员而不仅仅是统计学家的语言。

可用性的差异也不会因为使用和范例而停止。面对现实吧,

Pip 优于 R 的“包管理器”

在 R 的辩护中,包管理器肯定不是它那个时代的特色。尽管如此,即使 R 现在推出了一个出色的软件包管理器,它也很可能无法与 Pip 的便利性相竞争。Pip 使得管理所有的 Python 库变得非常容易,这反过来也使得学习如何使用 Python 中的包变得更加简单。有人试图为 R 创建一个更好的包管理器,比如 pack rat——如果你喜欢用 R 编程的话,这是一个很好的工具。

[## 个人信息管理程序

你还需要确保你的机器…

rstudio.github.io](https://rstudio.github.io/packrat/)

在某种程度上,Packrat 就像 R 包管理器的 QuickLisp。当然,在这方面,R 成为了发布时间的牺牲品。

表演

谈论机器学习而不讨论性能是非常困难的。毕竟,深度学习计算机通常配备多个显卡和服务器处理器是有原因的。Python 可能没有世界上最好的性能,但肯定比 r 更上一层楼。下面是 Julia computing 完成的一些微基准测试,显示了这些语言在许多操作中的差异有多大:

(src =https://julialang.org/benchmarks/

尽管确实存在 R 超过 Python 的情况,但在大多数情况下,Python 肯定是两者中表现更好的。当然,这归因于 R 编程语言内部机器学习的生存能力较低。虽然 R 和 Python 一样,肯定可以从调用其他语言(如 C 和 C++)中获益,但 Python 与 Python.h 头文件的紧密集成和易于访问性,使它成为那些希望用 C 创建高级接口的人的明确选择。

生态系统

如前所述,Python 当然是一种更有可能吸引普通程序员的语言。这可能就是为什么 Python 是开发 Scikit-Learn 和 Tensorflow 等包时使用的语言。用于机器学习的 Pythonic 生态系统绝对是一流的,无与伦比!

在 R 的另一边,虽然肯定有一些出色的包,但是当它们与 Python 拥有的所有通用选项相比时,毫无疑问。部分原因是,许多已经了解 Python 并希望进入机器学习领域的开发人员决定只使用该语言,而不是转换到 r 语言。由于 Python 与 C 语言的合作关系,很容易理解为什么这些包是为 Python 而不是 r 开发的。

两者都用

尽管 R 在这一点上已经完全让位于 Python,但 R 仍然被广泛用于统计分析、生物信息学,甚至机器学习。然而,似乎 R 更受科学和医学团体的欢迎,而 Python 更受技术影响。

这是我觉得很有意思的事情。为什么 R 在生物学家、医生和其他学科中的应用比普通开发人员、数据科学家和尝试机器学习的计算机科学家更广泛?对此一个合理的解释是,R 已经在这些行业立足了很长一段时间,以至于很难被取代。正如我之前谈到的,计算机科学家和来自编程世界而不是普通科学世界的人可能更喜欢使用 Python,而不是使用 70 年代的统计语言。当然,在 70 年代创造的不是 R 而是 S,但是 S 被广泛认为是 R 的前身——所以请记住这一点。

结论

我认为统计计算从使用 R 和 MATLAB 到 Python 的转变肯定是合理的。使用 Python 有很多优势,这些优势是你在其他地方无法获得的。Python 具有优越的性能,对于新开发人员来说更容易理解,也是世界上最流行的编程语言。所有这些因素无疑促成了 Python 的崛起,以及它现在在分析、统计以及最重要的机器学习领域的奇妙立足点。

虽然 R 肯定没有 Python 受欢迎,但它似乎已经在更科学、更少以计算机为中心的人群中找到了自己的家。看到某些语言如何在短短几年内被淘汰,以及一种新语言的能力如何在如此短的时间内被实现和利用,这是非常令人惊讶的。

流感疫情增长有多快?

原文:https://towardsdatascience.com/how-quickly-does-an-influenza-epidemic-grow-7e95786115b3?source=collection_archive---------17-----------------------

病毒生长的数学模型

疾控中心Unsplash 拍摄的照片

对冠状病毒的担忧现在无处不在。我经常坐飞机,在美国和欧洲的旅客身上几乎从来没有看到过呼吸面罩,然而在我们这里,看到飞往中国的航班被取消,面罩在机场四处扩散。因此,流行病学——研究疾病的传播和传播——受到了越来越多的关注,并让我思考用来更好地理解疾病如何在人群中传播的模型。我将查看该领域的一个经典模型,并向您展示如何用 Python 实现它。

TL;速度三角形定位法(dead reckoning)

我们看看 Kermack-McKendrick 流行病学模型,并展示如何用 Python 实现它;一个被设计用来描述 1905-06 年孟买爆发的流感传播的模型。

免责声明:我不是流行病学家或病毒学家,所以如果我有任何错误,请告诉我!

模拟流感爆发

Kermack-McKendrick 模型 (KM)是早期的房室模型,这意味着它将人群分为三组:易感(S)、感染(I)和去除(R)。这些通常被称为 SIR 模型,其中 R 可以被移除,因为个体要么因为已经康复而现在免疫,要么因为已经死于感染而从群体中移除。

Kermack 和 McKendrick 建立了他们的模型,以加深他们对流行病的理解,即受感染的个体进入人群,突然开始传播疾病。他们假设人口保持不变(除了模型中由 R 项表示的死亡),因此忽略出生、非疾病相关死亡、进出目标区域的迁移的任何影响。此外,所有的人都同样易感,所以在这个模型中,那些更健康或有更好卫生习惯的人没有加分。所有这些都是该模型的局限性,但也使它成为流行病学研究的一个很好的起点。按照这种思路,许多现代模型是建立在 Kermack 和 McKendrick 奠定的基础上的,所以理解这一点肯定会帮助你前进到更复杂的工作。

克马克-麦肯德里克模型

KM 模型是一组三个微分方程。我们可以将模型写成如下形式:

在这个公式中,𝑥代表我们的易感人群,𝑦代表受感染人群,𝑧代表我们的不再受感染(如死亡/康复)人群。

我们在模型中有两个常数,𝑙和𝑘,它们都是正的(𝑙,𝑘>0).这些常数分别代表*均恢复/死亡率和*均感染率。因此,如果我们看到𝑘疫情上升,那么我们预计疾病会传播得更快,而如果𝑙疫情上升

更高的话,这种疾病会很快传播并导致流行病。

Kermack 和 McKendrick 使用了这个比率:

定义临界阈值,超过该阈值将发生流行病并在整个人群中传播。

如上述假设所述,人口 N 是常数,所以在任何时候我们都应保持如下关系:

让我们转向模型的实现,然后我们可以进一步评论一些属性。

在 Python 中模拟模型

像这样模拟微分方程相当简单。它是以一阶形式写的,所以我们不需要太担心重写方程。如果你不熟悉如何对微分方程进行数值积分,看一看我写的一篇初学者文章,其中我展示了两个主要的方法和详细的推导。否则,让我们继续并导入我们的包。

import numpy as np
import matplotlib.pyplot as plt

我们将使用半隐式欧拉方法进行积分(在我的文章中解释了),这种方法实现和计算都很快。要做到这一点,我们需要找到 𝑥𝑦𝑧 的值,我们可以使用泰勒级数进行*似。我们将只讨论前两项,它们给出了合理的*似值。

前两项的形式如下:

把它应用到我们的方程组中(用δ𝑡代替𝑡−𝑡_0 ),我们得到:

因为我们使用半隐式欧拉方法来获得更精确的结果,所以我们将更新后的值(𝑦(𝑡)代入𝑧,为我们提供以下模拟方程组:

这是一个微妙的变化,但它通常会导致更好的*似。

在 Python 中,我们将所有这些打包到一个函数中,该函数将我们的初始值 𝑥𝑦𝑧 、我们的常数和时域作为参数。该函数将实现如上所示的半隐式欧拉方法,并返回三个变量的结果。

def km_model(init_vals, params, t):
    x_0, y_0, z_0 = init_vals
    x, y, z = [x_0], [y_0], [z_0]
    l, k = params
    dt = t[2] - t[1] # Assumes constant time steps
    for t_ in t[:-1]:
        next_x = x[-1] - (k * x[-1] * y[-1]) * dt
        next_y = y[-1] + (k * x[-1] * y[-1] - l * y[-1]) * dt
        next_z = z[-1] + (l * next_y) * dt
        x.append(next_x)
        y.append(next_y)
        z.append(next_z)

    return np.stack([x, y, z]).T

对于初始值,我们设置 𝑥 _0=999、 𝑦 _0=1、 𝑧 _0=0。参数 𝑙𝑘 分别为 0.1 和 0.001。

init_vals = [999, 1, 0]
params = [1e-1, 1e-3]t_max = 100
dt = 0.1
t = np.linspace(0, t_max, int(t_max/dt))km_results = km_model(init_vals, params, t)# Plot results
plt.figure(figsize=(12,8))
plt.plot(km_results)
plt.legend(['Susceptible', 'Sick', 'Recovered'])
plt.xlabel('Time Steps')
plt.show()

在这里,我们看到患病人数迅速上升,在恶化前最高为 675 人。请注意,这远远超过了人口的一半,并且发生在我们通过临界阈值之后的时间步长上,此时𝑥=𝑙/𝑘

从此,受感染的人数稳步下降。

我们也可以通过玩我们的参数𝑙和𝑘.来研究这一点让我们以更高的𝑙值重新运行它(回想一下,这是我们模型中的恢复率)。

params = [5e-1, 1e-3]
km_results = km_model(init_vals, params, t)plt.figure(figsize=(12,8))
plt.plot(km_results)
plt.legend(['Susceptible', 'Sick', 'Recovered'])
plt.xlabel('Time Steps')
plt.title(r'KM Model with $l={}$'.format(params[0]))
plt.show()

在这个修改的版本中,人们恢复得太快,以至于无法感染整个人群。在这种情况下,我们的临界阈值是 500,当𝑥达到这一点,疾病逆转。

让我们看另一个例子,我们将𝑙设置回原始值,然后将𝑘增加一个数量级到 0.01。

params = [1e-1, 1e-2]
km_results = km_model(init_vals, params, t)plt.figure(figsize=(12,8))
plt.plot(km_results)
plt.legend(['Susceptible', 'Sick', 'Recovered'])
plt.xlabel('Time Steps')
plt.title(r'KM Model with $k={}$'.format(params[1]))
plt.show()

在这种情况下,感染会迅速传播并超过整个人口。

最好事先知道这种疾病是会导致流行病,还是只会导致少数孤立的病例。我们可以通过计算生殖率来做到这一点,𝑅_0.这是我们之前观察到的阈值密度值的人口调整值。其给出如下:

如果是𝑅_0>1,那么我们手上就有一种传染病,会感染很多人。*于 0,意味着疾病在有机会广泛传播之前就会逐渐消失。

到目前为止,我们研究的三种场景中每一种场景的𝑅_0 值是:

  • 10
  • 2
  • 100

在每种情况下,我们都有不同程度的严重程度。我们可以调整我们的参数来显示当我们的生殖率下降到 1 或更低时会发生什么,方法是将𝑘减少到 0.0001。

params = [1e-1, 1e-4]
km_results = km_model(init_vals, params, t)plt.figure(figsize=(12,8))
plt.plot(km_results)
plt.legend(['Susceptible', 'Sick', 'Recovered'])
plt.xlabel('Time Steps')
plt.title(r'KM Model with $k={}$'.format(params[1]))
plt.show()print('R0 = {}'.format(sum(init_vals) * params[1] / params[0]))

R0 = 1.0

在这种情况下,疾病传播速度太慢,无法感染许多人,从而使患病者在疾病传播之前得以康复。

疾病建模

知识管理模型是捕捉流行病动态的早期数学模型之一。它最初发表于 1927 年,但今天仍然具有相关性,构成了许多现代流行病学模型的基线。这个简单的模型能够将额外的复杂性包括在内,例如疫苗、干预措施和其他效应的影响,以更好地了解病毒是如何在人群中传播的。

文艺复兴如何用机器学习战胜市场

原文:https://towardsdatascience.com/how-renaissance-beat-the-markets-with-machine-learning-606b17577797?source=collection_archive---------3-----------------------

一群聪明的数学家和计算机科学家使用机器学习来模拟金融市场,并押注于短期…

TLDR:一群才华横溢的数学家和计算机科学家应用机器学习来模拟金融市场,押注于短期策略,自 1988 年以来每年回报率为 66%。

解决市场问题的人 [1]展示了吉姆·西蒙斯和他由科学家和数学家组成的杂牌军如何建立了历史上最赚钱的量化基金——文艺复兴科技。说实话,我希望能有更多有趣的细节来说明他们在市场中的优势,但这是一厢情愿的想法,因为这个领域通常是保密的,尤其是在文艺复兴时期。

我没有在我通常的文章中实现机器学习模型,而是决定从书中写出我的学习要点,这样任何想跳过美世-资助-特朗普戏剧和超级富豪员工的副作用的人仍然可以了解到自 1988 年以来 Medallion 基金如何实现 66.1%*均年回报率的宝贵经验。

来自解决市场问题的人的见解

1。金融知识是可选的 Renaissance 和其他量化基金的一个很大的区别是,他们的团队由科学家组成,而不是华尔街的人。由于没有金融背景,他们对待金融数据就像对待他们用来实验的科学/文本数据一样。当鲍勃·默瑟被问及他们是如何用自己的模特赚到这么多钱时,发生了一个尴尬而有趣的场景。他回答说“有时候它告诉我们买克莱斯勒,有时候它告诉我们卖。”这是克莱斯勒被收购后不再交易的时候——这表明 Renaissance 几乎不需要了解这些公司的基本原理,甚至是它们的名称!

2。合理解释模型的预测并不是当务之急——雇佣研究人员而不是经济学家的另一个可能的副作用是,他们更关心交易异常在统计上有多重要,而不是如何解释它们。因此,他们敢于交易难以解释/理解的非直觉异常。我喜欢这一点,因为通常在深度学习和模型的情况下,很难合理解释我们模型的预测。一个缺点是很难知道何时停止交易这个想法。例如,由于政府限制而存在异常,当故事不再成立时,我们可以停止交易。没有这个故事,我们不得不依靠统计测试来确认一个信号不再存在。

3。研究论文很可能是错误的— 为了寻找思路,西蒙斯成立了一个读书俱乐部,阅读和讨论声称发现了阿尔法的论文。可悲的是,当他们试图回测这些论文时,他们从来没有成功过。如果研究人员真的发现了阿尔法,他们可能不会在第一时间发表它们,但我确实发现阅读论文是灵感/想法的来源。

4。拥有单一的交易模型亨利·劳弗认为,一个适用于所有资产类别的大模型将让他们利用他们收集的大量数据,并建立不同资产类别之间的相关性模型,而不是为每个资产类别创建一个独特的交易模型。这使得未来的想法很容易被加入,因为模型已经隐含了对市场和价格变动的理解。即使对于历史较短的资产类别,如果它们与历史更悠久的投资相似,也可以进行交易。这让我想起了神经网络中的迁移学习,首先训练一个通用模型来学习一个巨大的图像/文本数据集的良好表示,然后你可以非常成功地附加任何下游任务。这比一个模型用于一个下游任务更有效,在下游任务中,你通常没有那么多标记数据,这限制了模型的学习能力。

5。工业级编码至关重要——Robert Frey完成的最初统计套利模型在理论上非常有效,但它们是以零敲碎打的方式编码的,无法处理异常情况。默瑟和彼得·布朗用他们多年在 IBM 编写大系统的经验,建立了一个单一的动态交易系统。随着我们进入一个“任何人都可以用 4 行代码进行机器学习”的时代,记住工业级编码技能对于确保生产中一切顺利运行至关重要。尤其是在金融业,一个错误的决定可能会损失数百万美元。

6。将你的优势转化为它的最大能力 —人们想知道为什么竞争对手没有赶上或复制 Renaissance 的成功,一个可能的原因是,一旦他们找到了优势,他们就将其转化为最大能力,这样异常现象就不再出现了。这实质上使市场变得有效,因为异常现象已经被套利消除了。竞争对手被留下来寻找剩下的异常。

7 .。垃圾输入,垃圾输出——团队最初的模型并不成功,主要是因为他们手动收集的数据充满了错误。在 Sandor Straus 清理、估算和收集日内数据后,他们能够改进他们的模型,并在大多数投资者使用开盘价/收盘价进行交易决策时利用日内数据。在我们从事数据科学项目时,确保输入正确非常重要。而且正如美世所说,“没有比更多数据更好的数据”。

8。不要 100%相信你的模型——1998 年,一家当时规模大得多的量化基金——长期资本管理公司(Long Term Capital Management)破产了,原因是它们对自己的模型信心坚定不移,导致它们在面临几乎不可能出现的亏损时仍双倍下注。在 Renaissance,当信号不起作用时,他们的系统会保守地削减头寸。这对量化基金来说至关重要,尤其是当我们不知道为什么模型会给出预测时,适当的风险管理/下注规模就更加重要了。

9。宽客也是人——故事的很多部分描述了吉姆·西蒙斯对市场波动和新闻的情绪反应,这真的不是我们对他的期望。这表明,即使你是最优秀的量化分析师,保持冷静也有多难,同时也表明,我们应该尽量不要因为自己的情绪而干预或推翻算法的建议,因为这只会影响表现。

10。长期异常更难从中获利——大奖章基金交易的大多是短期异常(可能来自临*预报),并把他们开放的基金的长期策略留给外人。外部基金 RIEF 一直在努力达到大奖章的回报。

11。简单模型有效..只要你掌握了基本原理——他们使用核回归来模拟市场,这是一种简单的算法,对于实现来说微不足道——这让我开始想知道为什么在那里工作需要博士学位。然而,模型的简单性意味着我们需要做好每一件事——数据质量、变量/目标选择,最后是战略执行(下面是专利截图)。

来源:https://patents.google.com/patent/US20160035027

12。用机器学习战胜市场是很困难的— 有很多次,团队被为什么他们的模型不起作用而困惑,我最喜欢的是他们许多行代码中的一行代码中的静态标准普尔 500 指数值,打乱了模型的预测。然而,该团队坚持不懈,克服了每一个障碍,成为有史以来最成功的量化基金。创新不会停止——随着竞争对手学习并试图模仿他们的成功,Renaissance 必须不断寻找新的方法来超越市场。考虑到他们是最好的,并且只有大约 51%的时间是正确的,我们其余的人有我们的工作要做。

格雷戈里·朱克曼(Gregory Zuckerman)编织了一个伟大的故事,讲述了建立文艺复兴的各色人物,这是任何有抱负的量化分析师或任何想在量化金融领域寻找刺激的人的必读之作。

号外:Jim Simons 谈论 Ren Tec 机器学习的视频。

来源:数学投资人

参考

[1]朱克曼,g .解决市场的人。纽约:企鹅兰登书屋,2019 年。

偏见如何扭曲你的预测

原文:https://towardsdatascience.com/how-sampling-biases-might-be-ruining-your-predictions-f9e021d79723?source=collection_archive---------30-----------------------

理解数据及其分布是精确模型的关键。

图像通过 Unsplash

抽样偏倚 是一种 偏倚 的术语,其中样本的采集方式使得预期人群中的某些成员比其他人具有更低的 抽样概率 。这在社会科学或临床研究中最为人所知,例如,当某些人比其他人更喜欢参与研究时。假设你正在做一个心理学或市场研究问题的调查。一些具有特定属性的个人可能对参与本次调查更感兴趣,因为他们可能会直接受到治疗或产品成功的影响。在提供资金的情况下,有需要的个人可能更愿意参与。这两种情况都会将偏态带入到收集的数据中,并可能导致错误的结论( 选择偏差 )。需要注意的是统计建模是关于描述 概率分布机器学习 是将内容数据压缩为规则的工具箱。由于采样偏差,收集的数据集中的概率分布偏离了人们在野外实际观察到的真实自然分布,并且当从这些数据中开发模型时,由于提取的规则不正确,预计预测性能会很差。

重要的是要意识到统计建模就是描述概率分布。

一个遇到的例子来自一份旨在预测慢性肾病和透析患者死亡率的临床研究出版物。数据的一个主要问题是,许多患者因为接受移植而退出研究。结果是病人丢失,他们的结果是未知的;这个过程叫做 审查 。如果审查系统地发生,即只有特定的受试者丢失( 流失 ),审查会带来偏倚。最后,最终的模型声称,12 岁后死亡的概率显著增加。然而,在这项研究中,老年患者比年轻患者多,因此有理由认为,随着老年人在人口中的数量增加,更多的老年人死亡将被记录在案。在数据科学场景中,大量数据被放入一个罐中进行提取,跟踪所有这些情况变得非常困难。这只有通过使用模型检验技术相关矩阵直方图来探索数据和模型才能发现,这也是为什么 可解释的人工智能 备受期待的原因之一,即模型以与发生在 决策树中的方式解释它们的预测然而,许多高性能的语音和图像识别模型都是基于神经网络的黑盒。

机器学习是把数据的内容压缩成规则的工具箱。

偏见甚至可能发生在自然科学领域,但是自然科学家对此并不太了解,因为他们习惯于在严格控制的条件下进行实验,例如在实验室里。有一次,研究人员试图开发化学传感器的校准功能。他们从一个特定的地方(一个汽车交通繁忙的意大利城市的主要街道)收集数据,并开发了一个模型,该模型将几个化学传感器测量的数据作为电压和环境因素(温度和湿度)作为输入映射到参考浓度。然而,他们没有意识到所有的化合物都是相关的(ρ0.8),因为它们源于同一个化学过程——发动机中的燃烧。现在,在重新定位这样的传感器时,预测性能可能会急剧下降,因为分子之间可能存在具有不同关系的其他化学过程,这相当于说它们的分布在其他一些地方可能是不同的( 光谱偏差 )。每当一个模型被训练的分布发生变化时,例如由于空间或时间效应,这个模型的有效性显然就失效了。

由于采样偏差,收集的数据集中的概率分布偏离了人们在野外实际观察到的真实自然分布。

然而,即使采样已经正确执行,也可能存在偏差,这仅仅是因为人类存在偏差。这种偏差是用于模型建立的数据的一部分,越来越多的人意识到人工智能中数据诱导的偏差。例如,尽管是一个真诚的人,但仅仅是一个社会团体的成员就可能增加犯罪的可能性;仅仅因为一个子群体(如按种族分层)的登记犯罪频率增加,这个子群体中的一个人就已经可疑了。即使这样一个变量不是模型的一部分,一个相关的变量(如工资/财富)可以作为一个替代品。人力资源部的另一个例子会影响招聘过程;由于更多的高管是男性,与女性相比,他们中的更多人可能会被贴上“有资格”担任管理角色的标签,而女性可能会发现自己受到一个自动系统的歧视,该系统只是因为在模型开发期间使用了扭曲/有偏见的数据,就为公开的领导职位汇集候选人。此外,大多数产品由男性开发这一事实可能会对女性产生影响。正在开发嵌入人工智能(如自动决策)的解决方案的研究人员和机构,应该负责保证没有人受到歧视——但目前根本没有监管。

每个模型的好坏取决于它所接受的训练数据。

总之,偏见可能在你意识不到的情况下随时发生,每个模型的好坏取决于训练数据的好坏。意识到这种持续存在的风险并理解正在处理的数据的分布,是建立具有有意义预测的良好模型的关键。

卢克·切瑟在 Unsplash 上拍摄的照片

Scikit-Learn 如何永远改变了机器学习

原文:https://towardsdatascience.com/how-scikit-learn-changed-machine-learning-forever-90c1eebe3484?source=collection_archive---------24-----------------------

社区开发的软件包如何定义机器学习

(src = http://scikit-learn.org)

Sk learn,或 Scikit-Learn 是一个无需介绍的 Python 模块。Sklearn 不仅改变了 Python 的整个语言和生态系统,也改变了整个机器学习。根据 HugoVk 的说法,他引用他的消息来源

  • PyPi 本身
  • 蟒蛇车轮
  • 谷歌大查询
  • Pypinfo,

(你可以在这里查看他的网站)

[## 顶级 PyPI 包

从 PyPI 下载最多的 4000 个包的两周转储

hugovk.github.io](https://hugovk.github.io/top-pypi-packages/)

Scikit-Learn 是通过 Pip 下载第 62 多的 Python 包。这听起来可能没有那么重要,除非你首先考虑到 Python 肯定不是为机器学习而构建的,而这正是 Sklearn 的构建目的。相比之下,通常与 Python 中的线性代数相关联的 Python 包 Numpy 排名第 23。Pandas 是管理数据帧中大量数据的首选软件包,编号为 38。IPython 落后于 Sklearn,排在第 76 位。这实际上意味着下载 Sklearn 的人比使用 Python 的 Jupyter 笔记本的人多。然而,只要考虑到一件事,这种说法就可能被推翻:

服务器

简史

Sklearn 最初是由 David Cournapeau 在 2007 年 6 月根据新的伯克利软件分发许可证创建的“谷歌代码之夏”项目。Scikit 这个名字来源于两个术语的组合,

西皮和基特。

Scipy 工具包是不言自明的,但很明显,Sklearn 已经远远超出了 Scipy 工具包的范畴。这是由 2010 年的一大批开发人员完成的,他们是 Fabian Pedregosa、Gael Varoquaux、Alexandre Gramfort 和 Vincent Michel,他们都来自法国计算机科学和自动化研究所。

改变 Python

(src = http://python.org)

众所周知,*年来 Python 生态系统中受欢迎的部分发生了巨大的变化,而这一切部分归功于 Cournapeau 的“代码之夏”项目。Sklearn 奇妙的代码库对 Python 编程语言整体的影响是不可估量的。Sklearn 和谷歌的开源机器学习库 Tensorflow 共同努力,在 Python 语言内部创建了一个占主导地位的强大生态系统,自那以来还没有受到重大挑战。即使在更新的语言 Julia 中,包也经常 PyCall Sklearn 来完成某些工作。

机器学习是目前 Python 以及全世界最热门的技术。随着世界向自动化发展,Python 已经成为推动这一新扩展的主导力量,这既令人兴奋又令人震惊。Python 编程语言本身已经进行了大量更新,以*息机器学习工程师的建议。很难对机器学习既增强又塑造整个语言以适应其需求的前景提出异议。

改变机器学习

如果你已经在数据科学领域工作了一段时间,你必须没有眼睛和耳朵才能注意到其他模块直接从 Sklearn 获得灵感。事实上,在编写 Python 机器学习模块时有一个完整的概念,叫做

SkLearn 一致性

大多数机器学习模块,甚至包括 Tensorflow,都是按照这种方法创建的。模特“试衣”本身已经成为一个完整的定义,这都要归功于 SkLearn 上所做的出色工作。整个数据科学生态系统都围绕着 SkLearn 中包含的成熟而古老的工具。不仅如此,越来越多部署在 HTTP 协议上的机器学习算法也依赖于 SkLearn。

改变生态系统

在通过 Pip 的用户下载方面,SkLearn 远不如 Numpy 受欢迎,但另一个远在 SkLearn 之上的是 Scipy。Scipy 可能是 Sklearn 最大的依赖项,这也是这个名字的由来。SkLearn 让这些工具在数据科学领域变得更加家喻户晓。

(src = http://scipy.org/)

*猫和 Numpy 的受欢迎程度可能非常相关,或者用数据科学家的行话来说;

“将返回非常低的 P 值”

而 SkLearn 和 Scipy 就是这两个包的直接类比。SkLearn 的设计理念是 Scipy,正如*猫的设计理念是 Numpy。SkLearn 通过使 Scipy 成为一个更受欢迎的包,完全改变了 Python 生态系统。

结论

不用说,SkLearn 无疑已经在机器学习、Python、计算机科学以及自动化方面留下了自己的印记,而且它不太可能在短期内走向任何地方。SkLearn 是排名前 100 的 Python 包中唯一一个机器学习包,从数字上看排名相当靠前。

SkLearn 不仅影响了模型的编写方式,还覆盖了 Python 中机器学习的新领域,塑造了语言以及围绕它的生态系统,至少在某种程度上是这样。所有这些都使得 SkLearn 对科学、机器学习和自动化的影响极其微妙和重大。SkLearn 是一个模块,它最初是由 Google 组织的一个项目。

和许多开源软件包一样,开源程序员和 GNU 狂热者的精彩社区能够让它成为一个专利解决方案。*护人员多年来付出的所有努力都得到了回报,并使 Python 机器学习成为 Python 编程语言的主要内容,我真诚地希望这一点永远不会改变。

如何刮 NBA 的统计数据比迈克尔乔丹更酷

原文:https://towardsdatascience.com/how-scraping-nba-stats-is-cooler-than-michael-jordan-49d7562ce3ef?source=collection_archive---------19-----------------------

寻找 API 端点和客户端 web 抓取

瓦列里·塞索耶夫在 Unsplash 上的照片

介绍

今年夏天,我有了一个跟踪 NBA 的新爱好,作为一个数据爱好者,我想了解这个赛季的 NBA 在理论上与前几个赛季有什么不同,因为这是在没有任何球迷的泡沫中进行的。

为了获取相关数据,我开始使用 python 库 beautiful soup。然而,令我惊讶的是,数据并没有存储在 HTML 源页面上。经过一番挖掘,我发现 NBA stats 网站是用 AngularJS 构建的,这意味着该网站是在客户端而不是服务器端呈现的。

什么是客户端渲染

呈现的 HTML 只是一个模板,它不包含任何数据,服务器响应中的 Javascript 从 API 获取数据,并使用它来创建客户端页面。

基本上,当你查看网页源代码时,你不会发现数据,而只是网页的一个模板。

NBA 各州网站

Ctrl + U 带您到页面源

我们开始吧

在本文中,我们将从 NBA 统计网站上搜集联盟球员的统计数据。经过几个*时的研究,我决定采用一种比美丽的汤更简单的方法。

从网站查找 API 端点

第一步,在你的网页浏览器(最好是谷歌 chrome 或者火狐)上打开你想要抓取的网页,打开开发者工具。为此,只需右键单击选择检查。

右键单击,然后检查

这将在页面的右侧或底部打开一个面板,选择网络和 XHR,然后重新加载页面。

检查面板

一旦我们重新加载页面,页面中的所有请求都将可见。此时,您应该做一些挖掘工作来找到您想要的请求。最有可能的是,端点会以你正在浏览的网页命名。

由于我们正在查看联盟球员的统计页面,端点可能会被命名为类似的名称。选择每个选项并预览结果以找到正确的端点。

选择并预览

一旦你找到了正确的终点,你就可以进入下一步了。

调用 API 端点来获取数据

为了调用 API,我们将利用请求 python 包。为此,我们需要 3 个组件作为下面请求语法的一部分。

第一部分是 URL,在我们的例子中,因为我们正在访问联赛球员统计数据,所以我们可以从上一步获得它。

在 Header 选项卡下,选择 general 并复制请求 URL 的第一部分。

请求 URL

接下来,我们需要请求标题,它也可以在同一个标题选项卡下找到,但是在“请求标题”子部分下。

请求标题

作为字典的页眉

我们需要的最后一个组件是参数,可以在 Header 选项卡下的“查询字符串参数”*节中找到。

因素

因素

现在我们有了所有的三个部分,调用 API 就很简单了。然后,可以将响应处理到数据框架中进行分析。

获取请求

最终的请求看起来像这样,

数据帧

谢谢大家!!

恭喜👏!!我们成功地抓取了 NBA 统计数据网站。

PS:这个过程对 stats.nba.com 的绝对管用。这可能也适用于任何其他使用 AngularJS 等语言构建的客户端 web 框架的网站。如果你的目标网站是用服务器端框架和像 Django 或 Ruby on Rails 这样的语言构建的,那么我们的朋友 Beautiful Soup 会帮你一把。

祝你的网络抓取之旅好运!希望这个帖子有帮助。

如果你有任何问题,请随时通过 TwitterLinkedin 联系我。

数据科学家应该如何处理运营任务?

原文:https://towardsdatascience.com/how-should-data-scientists-handle-operational-tasks-a762fd49379f?source=collection_archive---------32-----------------------

Unsplash 上由 Franck V. 拍摄的照片

处理短期和长期的权衡

介绍

作为数据科学家,我们看到许多文章解释人工智能,机器学习或强化学习的先进方法。然而,在现实生活中,我们经常不得不处理较*的操作任务,这些任务不一定处于科学的边缘,例如构建简单的 SQL 查询来生成电子邮件地址列表,以作为 CRM 活动的目标。理论上,这些任务会分配给更合适的人,比如业务分析师或数据分析师,但公司并不总是有专门负责这些任务的人,特别是如果是较*的公司。

在某些情况下,这些活动可能会消耗我们太多的时间,以至于我们没有太多的时间去做重要的事情,最终可能会在这两方面都做得不够好。也就是说,我们应该如何处理这些任务?一方面,不仅我们通常不喜欢做操作任务,而且他们也是一个昂贵的专业人员的糟糕使用。另一方面,必须有人去做,而且不是每个人都具备必要的 SQL 知识。在这篇文章中,我将向你展示一些处理这些问题的方法,以优化你的时间。

减少

第一个也是最明显的减少操作性任务的方法是简单地拒绝去做。我知道这听起来有点苛刻,根据你的公司和它的等级制度,这可能不切实际,但在某些情况下值得一试。通过“拒绝”,我的意思是质疑这项任务是否真的有必要,并试图找到最好的方法去完成它。比方说,每个月你必须为不同的领域准备三份不同的报告,包含相似的信息。您已经成功地实现了 SQL 查询的自动化,但是您仍然需要仔细检查结果,并最终根据用户的请求添加/删除一些信息,或者更改图表布局中的一些内容。在本例中,您可以查看 3 个不同的报告是否都是必要的,或者您是否可以调整它们,使它们成为一个报告,发送给 3 个不同的用户。不管怎样,想办法减少完成这些任务的必要时间,或者,理想的情况是,完全停止执行这些任务。

授权

有时,花时间让用户自己执行这些任务是值得的。当 CRM 要求你生成无止境的电子邮件地址列表时,也许教或鼓励他们学习 SQL 的基础知识(或雇佣一些已经知道的人),这样他们可以更加自主,从长远来看会有回报。如果这听起来过于雄心勃勃,那么为他们提供工具,使他们不用编码,只使用拖放功能就能生成这些列表,这可能是您的解决方案。您可以使用现有的解决方案,如 Adobe Campaign,也可以自行开发(作为一名数据科学家,这可能是培养您的应用程序构建技能的绝佳学习机会)。

使自动化

如果你注意到这是一项你无法摆脱又无法委派的任务,那么就尽可能地让它自动化。对于报告,尝试将它们迁移到 dataviz 工具,如 Tableau 或 Google Data Studio。您可以将这些工具与您的数据库同步,它们将始终保持最新,因此您不必再更新报告。如果它与 CRM 电子邮件列表相关,请尽量使您的 SQL 查询灵活,使用可变的日期和名称,这样您就不必每次都修改它们。

此外,试着写下你对数据做了什么样的检查,并用编程逻辑将它们形式化。这使您甚至可以自动执行手动检查,因此您不必再做这些工作。老实说,这一步无论如何都是一个很好的实践,但是它肯定会帮助你完成操作任务。

组织

特别是当你是一名经理时,你必须分清主次,这样你和你的团队才不会淹没在无休止的运营任务中。为了做到这一点,在你的一周中留出一两天来做这类工作,在剩下的 3-4 天里不要去看它。要做到这一点,你必须按照前面的步骤来调整你的工作负荷,并且在设定截止日期时通过减少工作时间来管理期望。这也意味着向你的内部客户解释范式的转变,以便他们能够适应这些新的截止日期。这一步可能意味着做一些内部政治,与你的上级和其他部门协商。你必须证明你的团队的时间可以更好地用于高价值的任务,而不是操作性的任务。

另一个可能有所帮助的组织变革是聘用一名数据分析师或业务分析师,全职处理这些需求,以减轻高级分析师或数据科学家的负担。请记住,该解决方案还需要管理层的认可。

结论

一旦你绘制了所有的操作活动,你就要开始尽可能地从你的管道中删除,首先永久地删除不必要的活动,然后将它们委派给请求它们的团队。然后,无论剩下你要做什么,你都要最大限度地自动化(无论如何,自动化应该是任何重复性任务的优先事项),并组织自己,以确保你有时间做你必须做的相关工作。这样,你不仅能从工作中获得更多乐趣,还能确保你昂贵的时间得到合理利用,最大化公司的利益。

学生应该如何利用时间来提高自己的幸福感?

原文:https://towardsdatascience.com/how-should-students-spend-their-time-to-improve-their-happiness-a8bab76fb3c4?source=collection_archive---------55-----------------------

变更数据

用 Jupyter 笔记本分析调查数据。

学生们在校园里度过时光,由 katemangostar 在 www.freepik.co 的 T2 创作

关于睡眠、锻炼、休闲、学习和幸福之间的关系,已经有很多研究了。尽管人们对睡眠和幸福之间的关系存在争议,但结果往往与我们的预期十分相似。然而,我想知道我们是否可以从我们一般如何度过时间的角度来看待这个问题,看看在我们生活的不同方面花费时间的*衡是否会影响我们的幸福水*。

与其追求更多的睡眠或更多的锻炼,我们应该如何全面地利用时间来增加我们的幸福感呢?

作为一名新加坡的大学生,我决定对我的同龄人做一个简单的调查。

数据描述:

回应数量 =45

变量,记住我是在问大学生:
—学习年限
—性别
—周围人的舒适程度(考虑到可能的性格差异)
—满意度(衡量幸福的一个好方法,因为它趋于稳定)
—睡眠时间(每天)
—学习时间(每天)
—锻炼时间(每周)
—休闲时间(每周)

接下来,我将通过 Jupyter Notebook 使用 Python 来做一些数据清理。从导入必要的包和查看数据开始。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
import numpy as np
import math#loading the data
data=pd.read_csv("Happiness and how we spend our time (Responses) - Form Responses 1.csv")
data.head()

数据清理:

1)为简单起见,重命名列标题

data.columns=['Year','Gender','Being around others','Happiness score','Sleep','Study','Exercise','Leisure']

2)通过以下方式从分类转换为数字:

  • 取数值范围的*均值,每个选项之间的间隔不变(注意:下次让回答者输入整数)。
  • 将“男性”和“女性”替换为 1 和 0,将“第 1 年”到“第 5 年”替换为“1”到“5”。
data=data.replace({'Year 5':5, 'Year 4':4,'Year 3':3,'Year 2':2,'Year 1':1,'Male':0,'Female':1,'0 to 1 hour':0.5,'0 to 2 hours':1,'1 to 2 hours':1.5,'3 to 4 hours':3.5,'4 to 5 hours':4.5,'5 to 6 hours':5.5,'7 to 8 hours':7.5,'0 to 4 hours':2,'5 to 9 hours':7,'9 to 10 hours':9.5,'10 to 14 hours':12,'15 to 19 hours':17,'20 to 24 hours':22,'25 to 29 hours':27,'9 or more hours a week':9.5,'More than 30 hours a week':32})

3)删除“时间戳”列,并将“锻炼”和“休闲”值除以 7,得到每天的值

data=data.drop('Timestamp',axis=1)#make weekly hours to daily
data['Exercise']=data['Exercise']/7
data['Leisure']=data['Leisure']/7
data.head()

4)将睡眠、学习、运动、休闲换算成百分比。

#get the hours variables
dv=data
dv=dv.drop(['Year','Gender','Being around others','Happiness score'],axis=1)#sum of rows
sumv=dv.sum(axis=1)#making it into percentages
dv['Sleep']=100*dv['Sleep']/sumv
dv['Study']=100*dv['Study']/sumv
dv['Exercise']=100*dv['Exercise']/sumv
dv['Leisure']=100*dv['Leisure']/sumv#replacing the values
data['Sleep']=dv['Sleep']
data['Study']=dv['Study']
data['Exercise']=dv['Exercise']
data['Leisure']=dv['Leisure']#looking at data
data.head()

现在我们已经有了我们想要的形式的数据,我们可以开始创建数据可视化。我决定关注性格、时间百分比(睡眠、学习、锻炼和休闲)和幸福指数。

分析:

性格与快乐:

以下是那些认为自己在别人身边不太舒服的人的关联热图(‘在别人身边’<=5).

#set size
plt.rcParams['figure.figsize'] = (8, 6)#plot data desired
d = data.loc[lambda data: data['Being around others'] <= 5]
sns.heatmap(d.corr(), cmap = 'Blues', annot = True)
plt.show()

Correlation heat map for “Being around others” ≤ 5

Mean for sleep=42.11%, mean for leisure=13.98%, mean happiness score=4.92. Notice that the correlation between happiness and sleep was the highest at 0.52),快乐和休闲的关联度为 -0.37。

相比之下,那些认为自己在别人身边更自在的人(“在别人身边”5 分)。

“与他人相处”的关联热图> 5

睡眠*均得分=45.64%,休闲*均得分=15.21%,幸福*均得分=6.81。幸福与睡眠的相关性在 0.24 时最高,幸福与闲暇的相关性为 -0.0028

其他所有的相关性都是惊人的负相关!虽然我认为睡眠与幸福有很大的关联,因为人们可能更喜欢独处,但休闲之类的活动与幸福有负相关是相当出乎意料的。这似乎表明,对于那些在别人身边不太舒服的人来说,他们更可能受到睡眠时间的影响,而其他因素似乎不是影响他们幸福的重要因素。与此同时,在休闲上花更多时间似乎与他们的幸福感呈负相关,尽管这一点在那些认为自己与他人相处更舒适的人身上可能并不突出。

如果我们看看锻炼和休闲的*均值,似乎花更多的时间在睡眠上可能对那些在周围不太舒服的人有好处。也许对人格的进一步剖析和检验会让我们对什么让我们快乐有更深入的了解。尽管如此,似乎幸福和个性似乎有某种关联。

与同龄人相比,对于那些在别人身边不太自在的人来说,睡眠是一个更重要的因素。

*衡的时间和快乐:

接下来,让我们看看如何花费不同比例的时间与幸福分数相关。
*衡:所有组件< 50%

*衡时间的关联热图

幸福得分:均值=6.80,标准差=2.00 。在别人身边和快乐的相关性= 0.44

不*衡:任一分量≥ 50%

幸福指数:均值=5.60,标准差=2.80。睡眠与幸福的相关性= 0.7 ,学习与幸福的相关性= -0.4。
*进入不*衡组者因学习或睡眠≥ 50%

从*均值来看,确保我们在 4 个因素上有一个*衡的时间分配似乎与更高的幸福水*相关。但是,我们来看看 0.7 相关性的不均衡时间的快乐和睡眠回归线!

#nbal is the data with only rows that are not balanced
x =  nbal['Sleep']
y =  nbal['Happiness score']
plt.plot(x, y, 'o')
m, b = np.polyfit(x, y, 1)
plt.plot(x, m*x + b)

幸福和睡眠的回归线(不*衡时间)

如果我只看那些“睡眠”时间≥ 50%的人的数据:
幸福度均值=7.17,标准差=1.22
也许我们都只是需要更高百分比的睡眠时间。当我把标准放宽到≥ 40%时,*均幸福分就降到了 6.49。此外,似乎是我们花了 50%的时间在学习上降低了*均值(学习时间≥ 50%的人的*均值= 3.4285,标准差=2.88)。

那些在“睡眠”、“学习”、“锻炼”、“休闲”中睡眠时间≥50%的人的幸福指数*均为 7.17。

结论:

如果你阅读了以上所有内容,那么非常感谢你,因为我花了很多时间试图编码并获得我分析所需的值!不然这里快速总结一下:
我想回答的问题:花在不同活动上的时间比例影响我们的幸福水*吗?

是的,它是!在各种活动中花费时间比例更均衡的学生似乎与幸福水*呈正相关。

调查结果:

  1. 睡眠和快乐之间的正相关贯穿整个
  2. 性格对与我们的快乐相关的活动类型有影响(例如睡眠和休闲)
    3)那些拥有更*衡的时间分布的人似乎比那些拥有不*衡时间的人更快乐
    4)那些拥有 ≥50% 时间的人,在所有变量中, 花在睡觉上的时间比花在学习上的时间多****比花在幸福上的时间**
    ≥50% 的人,幸福的*均分数比花在学习上的时间低**。

与其追求更多的睡眠或更多的锻炼,我们应该如何全面地利用时间来增加我们的幸福感呢?

  • 花更多的时间睡觉。在竞争激烈/以工作为中心的环境中,听起来简单却很难。
  • 或者,试着*衡我们花在不同活动上的时间(不要在一个活动上花太多时间!)

尽管如此,很高兴从这个迷你项目中学到了很多 python 和数据可视化知识,并试图从它试图告诉我的所有信息中汲取营养!请务必让我知道我是否可以关注其他领域或您对结果的看法!下次会尝试获取更大的数据集。

我们应该如何聚集分类预测?

原文:https://towardsdatascience.com/how-should-we-aggregate-classification-predictions-2f204e64ede9?source=collection_archive---------29-----------------------

如果你必须预测有多少乘客会在泰坦*克号沉船事故中幸存下来呢?为分类而优化的方法仍然合适吗?

如果你正在读这篇文章,那么你可能正在试图预测谁将在泰坦*克号沉船事故中幸存。这场 Kaggle 竞赛是机器学习的典型例子,也是任何有抱负的数据科学家的通行权。如果不用预测会活下来,你只需要预测会活下来多少会怎么样?或者,如果你不得不预测幸存者的*均年龄,或者幸存者支付的车费总和会怎么样?

我们应该如何聚集分类预测?

在许多应用中,需要对分类预测进行汇总。例如,客户流失模型可能会生成客户流失的概率,但企业可能会对预计有多少客户流失感兴趣,或者对预计会损失多少收入感兴趣。同样,一个模型可能会给出一个航班延误的概率,但是我们可能想知道有多少航班会延误,或者有多少乘客会受到影响。洪(2013) 列举了从精算评估到保修索赔的多个其他例子。

大多数二元分类算法估计样本属于正类的概率。如果我们将这些概率视为已知值(而不是估计值),那么阳性病例的数量就是一个具有泊松二项式概率分布的随机变量。(如果概率都相同,分布将是二项式的。)类似地,两个值的随机变量之和(其中一个值为零,另一个值为其他数字,如年龄、收入)分布为广义泊松二项式。在这些假设下,我们可以报告*均值以及预测区间。总之,如果我们有了真实的分类概率,那么我们就可以构建任何总体结果的概率分布(幸存者人数、年龄、收入等)。).

当然,我们从机器学习模型中获得的分类概率只是估计值。因此,将概率视为已知值可能不合适。(本质上,我们在估算这些概率时会忽略抽样误差。)然而,如果我们只对幸存者的总体特征感兴趣,也许我们应该专注于估计描述这些总体特征的概率分布的参数。换句话说,我们应该认识到我们有一个数值预测的问题,而不是一个分类的问题。

我比较了两种获得泰坦*克号幸存者总体特征的方法。首先是分类,然后汇总。我估计了三种流行的分类模型,然后合计了所得的概率。第二种方法是一种回归模型来估计一群乘客的总体特征如何影响幸存的份额。我使用测试和训练数据的许多随机分割来评估每种方法。结论是,当分类概率被聚集时,许多分类模型表现不佳。

1.分类和汇总方法

让我们用泰坦*克号的数据来估计三个不同的分类器。逻辑模型将仅使用年龄和乘客等级作为预测值;随机森林和 XGBoost 也会用性。我在 Kaggle 的训练数据中的 891 名乘客上训练模型。我评估了测试数据中对 418 的预测。(我获得了测试集的标签,以便能够评估我的模型。)

分类算法在总量预测中的性能。

只有年龄和乘客级别作为预测因子的逻辑模型的 AUC 为 0.67。同样使用性别的 Random Forest 和 XGBoost 达到了非常可观的 0.8 左右的 AUC。然而,我们的任务是预测有多少乘客能够生还。我们可以通过合计一名乘客生还的概率来估计这一点。有趣的是,在三个分类器中,尽管 AUC 最低,但 logistic 模型最接*实际存活人数。同样值得注意的是,基于训练数据中幸存者比例的天真估计做得最好。

给定测试集中每个乘客的幸存概率,幸存乘客的数量是一个随机变量分布泊松二项式。这个随机变量的*均值是各个概率的总和。该分布的百分位数可使用由 Hong (2013)) 开发的‘poi bin’R 软件包获得。一个类似的针对 Python 的包正在开发中。百分位数也可以通过对测试集中的 418 名乘客模拟 10,000 组不同的结果来获得。百分位数可以解释为预测区间,告诉我们幸存者的实际人数将在 95%的概率范围内。

使用泊松二项式和广义泊松二项式百分位数的预测区间。

基于随机森林概率的时间间隔与幸存者的实际人数相差甚远。值得注意的是,区间的宽度不一定基于个体概率的准确性。相反,它取决于那些个体概率离 0.5 有多远。概率接* 0.9 或 0.1,而不是 0.5,这意味着有多少乘客将幸存下来的不确定性要*得多。这里有一个关于预测可靠性和清晰度的很好的讨论

虽然幸存者的数量是零/一个随机变量的总和(伯努利试验),但我们也可能对预测幸存者的其他总体特征感兴趣,例如幸存者支付的总费用。该度量是两个值随机变量的和,其中一个值为零(乘客没有幸存),另一个值是乘客支付的票价。张,洪,Balakrishnan (2018) 称此和的概率分布为广义泊松二项式。与泊松二项式一样,洪与人合写了一个 R 包,,使得计算概率分布变得简单明了。同样,模拟分布是使用包来计算百分位数的一种替代方法。

2.总体回归方法

如果我们只关心幸存者的聚合特征,那么我们真的有一个数值预测的问题。对测试集中存活者份额的最简单估计是训练集中存活者的份额——这是上一节中的天真估计。如果测试组和训练组中乘客的特征相同,这种估计可能是无偏的和有效的。如果不是,那么我们需要根据乘客的特征来估计幸存者的比例。

问题是,我们没有数据来估计一群乘客的总体特征如何影响幸存的份额。毕竟泰坦*克号只撞过一次冰山。也许在客户流失等其他应用中,我们可能每个月都会有新的数据。

在 Titanic 案例中,我通过重新采样原始训练数据集来模拟许多不同的训练数据集。我计算每个模拟数据集的*均特征,以估计这些特征如何影响幸存的份额。然后,我取测试集中乘客的*均特征,并预测有多少人会在测试集中存活下来。有许多不同的方法可以总结总体特征。我用头等舱乘客份额,10 岁以下乘客份额,女性乘客份额。毫不奇怪,有更多妇女、儿童和头等舱乘客的乘客样本有更高的幸存者比例。

使用 500 个模拟训练集对总体乘客特征的幸存份额进行回归的结果。

应用上面的等式来聚合测试数据的特征,我预测 162 幸存者相对于实际的 158,预测区间为 151 到 173。因此,回归方法非常有效。

3.这两种方法相比如何?

到目前为止,我们只使用一个测试集来评估这两种方法。为了更系统地比较这两种方法,我从原始训练和测试数据集的联合中重新采样,以创建 500 个新的训练和测试数据集。然后,我将这两种方法应用了 500 次,并计算了这 500 个样本中每种方法的均方误差。下图显示了每种方法的相对性能。

使用 500 个随机训练和测试分割对各种聚集预测方法的评估。

在分类模型中,逻辑模型做得最好(具有最低的 MSE)。XGBoost 是比较接*的第二名。兰登森林差远了。总体预测的准确性主要取决于估计概率的准确性。逻辑回归直接估计生存概率。类似地,XGBoost 优化了逻辑损失函数。因此,两者都提供了对概率的合理估计。相比之下,随机森林将概率估计为将示例分类为成功的树的份额。正如 Olson 和 Wyner (2018) 所指出的,将该示例归类为成功的树的份额与该示例成功的概率无关。(出于同样的原因,随机森林的校准图往往很差。)虽然随机森林可以提供较高的 AUC,但估计的概率不适合聚合。

在所有方法中,聚合回归模型的 MSE 最低,甚至超过了分类逻辑模型。天真的预测在这个评估中是有缺陷的,因为在测试数据中幸存者的份额并不独立于在训练数据中幸存者的份额。如果我们刚好火车里有很多幸存者,那么测试中的幸存者自然会少一些。即使有这个障碍,天真的预测还是轻松击败了 XGBoost 和 Random Forest。

4.结论

如果我们只需要聚集特征,估计和聚集个体分类概率似乎比需要的更麻烦。在许多情况下,训练集中幸存者的比例是测试集中幸存者比例的一个很好的估计。这个月的客户流失率可能是下个月流失率的一个很好的估计。如果我们想理解是什么驱动生存或流失,更复杂的模型是值得建立的。当我们的训练数据与测试数据具有非常不同的特征时,以及当这些特征影响生存或流失时,也值得建立更复杂的模型。然而,即使在这些情况下,很明显,当需要数值预测时,使用针对单个分类优化的方法可能不如针对数值预测优化的方法。

你可以在这里找到这张纸条背后的 R 代码。

新冠肺炎与之前发现的冠状病毒有多相似

原文:https://towardsdatascience.com/how-similar-is-covid-19-to-previously-discovered-coronaviruses-c3d9f25840f7?source=collection_archive---------18-----------------------

不同冠状病毒基因组组成谱的简单比较

随着新冠肺炎的基因组数据在国家生物技术信息中心( NCBI )公开,我想看看 2019 年的新型冠状病毒与其他冠状病毒相比有多相似。在这篇文章中,我将比较新冠肺炎的参考基因组和以前发现的两种不同冠状病毒的参考基因组;一种人类冠状病毒和一种蝙蝠冠状病毒。

免责声明 : 本文基于我对 NCBI 上可获得的参考基因组的分析,旨在适应、学习和理解宏基因组组成的概念。这不是任何官方研究的一部分,研究结果也不适合任何形式的决策。

对于这种分析,我考虑了以下三种冠状病毒基因组。

  1. SARS 冠状病毒 ZJ0301
  2. 蝙蝠 SARS 样冠状病毒分离株 bat-SL-CoVZC45
  3. 新冠肺炎(新型冠状病毒)

图片来自 PixabayOlga Lionart

考虑的标准

我考虑了一些标准来比较所选冠状病毒的组成。

  1. 寡核苷酸组成
  2. GC 含量

寡核苷酸组成

寡核苷酸被认为是少量核苷酸的连续串。在计算术语中,我们将寡核苷酸定义为 k-mers (大*为 k 的单词)。在这个比较中,我考虑了三聚体(又称三核苷酸三聚体)及其组成(三核苷酸组成)。有 32 (4 /2)个不同的三聚体。我们通过计算三核苷酸出现的次数并除以三核苷酸的总数来获得每种不同三核苷酸的标准化频率。我们将这些计数标准化,以避免由于序列长度不同而导致的任何不均匀性。

Normalised freqeuncy of kᵢ
= Number of occurrences of kᵢ / total number of k-mers
(where kᵢ is the iᵗʰ k-mer)

寡核苷酸组成被认为在微生物物种中是保守的,并且在物种之间是变化的[1][2]。

GC 含量

GC 含量(或鸟嘌呤-胞嘧啶含量)是序列中不是鸟嘌呤就是胞嘧啶的核苷酸的百分比。

GC content = (G + C) / (A + G + C + T) * 100

GC 含量也因物种不同而不同[2]。

冠状病毒基因组的个体分析

让我们首先单独分析冠状病毒基因组。

1.SARS 冠状病毒 ZJ0301

图一。SARS 冠状病毒 ZJ0301 的三核苷酸组成

这是 2003 年发表的中国报道的 SARS 冠状病毒 ZJ0301 的参考基因组[3]。

出版 : 严重急性呼吸综合征相关冠状病毒基因型及其表征严重急性呼吸综合征相关冠状病毒基因分型和系统发育的分子生物学分析

图 1 显示了 SARS 冠状病毒 ZJ0301 的三核苷酸组成。

2.蝙蝠 SARS 样冠状病毒分离株 bat-SL-CoVZC45

图二。蝙蝠 SARS 样冠状病毒分离株 bat-SL-CoVZC45 的三核苷酸组成

这是蝙蝠 SARS 样冠状病毒[4]的参考基因组,该病毒被认为与新冠肺炎病毒非常接*[5]。

出版物 : 一种新型 SARS 样冠状病毒的基因组特征及其在中国蝙蝠体内的传染性

图 2 表示蝙蝠 SARS 样冠状病毒的三核苷酸组成。

3.新冠肺炎(新型冠状病毒)

图三。新冠肺炎的三核苷酸组成

这是 NCBI 公布的 2019 年新型冠状病毒的最新参考基因组[5]。

图 3 显示了新冠肺炎的三核苷酸组成。

不同冠状病毒的比较

三核苷酸组成

图 1、图 2 和图 3 似乎显示了确切的模式,并且在相同的范围内有所不同,但是如果我们如图 4 所示将它们绘制在一起,我们可以看到一些差异。我们可以观察到,与 SARS-CoV 相比,新冠肺炎和 bat-SL-CoV 显示出非常相似的三核苷酸组成模式(特别是对于三聚体,如 AGG、ATC、ATG、CTA、CTC、GAA 和 GTA)。

图 4。不同冠状病毒的三核苷酸组成

四核苷酸组合物

图 5 显示了不同冠状病毒基因组的四核苷酸(四聚体或四聚体)组成模式。可以看到类似于三聚体的趋势(尤其是 ACAA、AGAA、ATAA、CTAA 和 CATC 等四聚体)。

图五。不同冠状病毒的四核苷酸组成

GC 成分

GC content of SARS-CoV:       40.23%
GC content of bat-SL-CoVZC45: 38.35%
GC content of COVID-19:       37.44%

根据上面列出的 GC 含量值,我们可以说 bat-SL-CoVZC45 和新冠肺炎的 GC 含量非常相似,约为 37-38%。

图六。不同冠状病毒的 GC 组成

主成分分析和 t-SNE 分析

图 7 和图 8 显示了三种冠状病毒基因组中每一种的 100 个长度为 5000 bp 的模拟读数的三核苷酸组成载体的二* PCA 图和 TSNE 图。您可以看到,在图中,与新冠肺炎(绿点)和 bat-SL-CoV(红点)相对应的一些点比它们与 SARS-CoV(蓝点)的距离更*。

图 7。三种冠状病毒基因组中每一种的 100 个长度为 5000 bp 的读数的三核苷酸组成载体的 PCA 图

图 8。三种冠状病毒基因组中每一种的 100 个长度为 5000 bp 的读数的三核苷酸组成载体的 TSNE 图

最后的想法

这篇文章中的发现支持了最*发表的题为一种与中国人类呼吸系统疾病相关的新型冠状病毒的论文中的说法,作者在论文中表示,他们组装的基因组与蝙蝠 SARS 样冠状病毒分离株蝙蝠 SL-CoVZC45 非常接*。自从 2003 年 SARS-CoV 被发现以来,这种新的毒株确实发生了变化。

我添加了一个 jupyter 笔记本,其中包含了本文使用的代码,您可以通过下面的链接随意试用。

为了方便起见,我在笔记本中直接添加了标准化的 3-mer 和 4-mer 计数。如果你想自己算数,可以用一个软件,比如高棉或者 DSK

你可以从我以前的文章中读到更多关于人们对新冠肺炎、基因组组装和宏基因组学的看法。

[## 2019 *说《冠状病毒:人们的想法》

使用 Twitter 对 2019 年新型冠状病毒爆发进行简单的情感分析

towardsdatascience.com](/2019-novel-coronavirus-peoples-thoughts-8c06c3caf20e) [## 基因组组装——基因组分析的圣杯

组装 2019 新型冠状病毒基因组

towardsdatascience.com](/genome-assembly-the-holy-grail-of-genome-analysis-fae8fc9ef09c) [## 宏基因组学——谁在那里,他们在做什么?

深入了解微生物群落的数据

towardsdatascience.com](/metagenomics-who-is-there-and-what-are-they-doing-9f204342eed9)

我希望你觉得这篇文章很有趣。我很想听听你的想法。

感谢您的阅读!

干杯,大家注意安全!

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

参考

[1]卡林,S. 。细菌基因组的组成偏差和进化含义。细菌学杂志,179(12),3899–3913(1997)。

[2] Dick,G. J. 微生物基因组序列签名的社区范围分析。基因组生物学,10(8),R85 (2009)。

[3] L .李等严重急性呼吸综合征相关冠状病毒基因型及其表征。中国医学杂志。116(9):1288–92 (2003).

[4] D. Hu 一种新型 SARS 样冠状病毒的基因组特征及其对中国蝙蝠的感染性。新兴微生物&感染。第 7 卷第 1 期(2018 年)

[5]吴,赵,俞一种在中国发现的与人类呼吸系统疾病相关的新型冠状病毒。性质 (2020)。

模拟社交网络揭示了为什么我没有朋友,也没有空闲时间

原文:https://towardsdatascience.com/how-simulating-social-networks-revealed-why-i-have-no-friends-and-also-no-free-time-a61dec4d677a?source=collection_archive---------50-----------------------

友情悖论什么时候真的是悖论?

艾莉娜·格鲁布*亚克在 Unsplash 上的照片

友谊悖论是一个观察到的社会现象,*均而言,大多数人的朋友比他们的朋友少。有时人们更强烈地表示,大多数人的朋友比他们的大多数朋友少。从有关该话题的热门文章中,不清楚后一种说法是否普遍属实。我们来调查一下!

我本以为这很难确定,也许这就是为什么直到 1991 年才有人发现它。在斯科特·费尔德的原始论文《为什么你的朋友比你拥有更多的朋友》中,他提出这可能是不满足感的一个来源。但是,我的意思是,它不像人们保持他们的朋友的每个朋友的记录,更不用说他们自己的朋友的列表,不是吗?这在 1991 年可能是真的,但现在在脸书时代,我们可以轻松做到这一点——可能很多人都这样做。

我的书里有多少张脸

事实上,为什么不呢,我要试一试。我在脸书有 374 个朋友。我不确定为什么。不管怎样,让我们随机抽取 10 个朋友,然后数一数他们有多少个朋友。统计如下:

Friend 1 - 522
Friend 2 - 451 
Friend 3 - 735
Friend 4 - 397
Friend 5 - 2074
Friend 6 - 534
Friend 7 - 3607
Friend 8 - 237
Friend 9 - 1171
Friend 10 - 690

这些朋友的*均好友数量是 1042 。所以*均来说,我的朋友比我的朋友少。此外,在这 10 个朋友中,我的朋友比其他人都少,除了其中一个——第 8 个可怜的朋友。

好吧,但这不是一个悖论——尤其是如果你了解我的话。我们看看我网络中的其他人怎么样,比如朋友 2。朋友 2 有 451 个朋友,因为脸书是一个非常安全的网站,自然会保护用户的隐私,所以我们可以点击朋友 2 的朋友的个人资料,看看他们有多少朋友。朋友 2 的 10 个随机好友拥有的好友数量为: 790928383738271633202457860121朋友 2 的朋友*均有 627 个好友,比 451 个多。此外,这些朋友中的六个有超过 451 个朋友,所以朋友 2 的朋友也比他们的大多数朋友少。如果我们对我所有的朋友重复这个练习,我们仍然会发现大多数人的朋友比他们的朋友少,尽管大多数人已经比我有更多的朋友了!****

你可能有一种直觉,这是自相矛盾的。我对为什么感觉矛盾的直觉来自下面的类比。考虑你的身高。也许你比一般人矮。也许你有一些朋友也比一般人矮。但是,你期望发现至少一半的人实际上比*均水*高。那毕竟是一种“*均”的直觉。那么,为什么朋友之间不是这样呢?也就是说,尽管我和朋友 2 的朋友比我们的朋友少,但是那些有很多朋友的人的朋友肯定比他们的朋友多。这是真的,但是这些受欢迎的人极其罕见,那就是比如好友数和身高的区别。

在一个典型的社交网络中,有很多朋友很少的人,也有少数朋友很多的人。很红的人,在很多人的朋友圈都算。而且,冷门的人在很多朋友圈都不算。再以我的脸书友谊为例。显然,我没有几个脸书朋友。所以,看起来很多人比我有更多的朋友。但是——这里是最重要的一点——那些人不太可能把我和我为数不多的朋友算在他们的朋友圈里。朋友 2 和我只有 2 个共同的朋友就证明了这一点。所以朋友 2 的所有朋友,当他们去数他们自己朋友的朋友数量时,不会让我和我的低朋友数使分布偏向他们。

这就是“空手道*子”如此不合群的原因吗?

让我们看一些更*的例子,在这些例子中,我们可以计算网络中的每个人和他们的朋友。最著名的社交网络(至少对网络理论家来说)是扎卡里的空手道俱乐部。看起来是这样的。

扎卡里的空手道俱乐部。节点颜色引导视线,并根据每个人的朋友数量进行标记。图片作者| 来源

这张照片展示了一个空手道俱乐部中的 34 个人(大约 1970 年)以及他们在课外与谁互动。颜色只是引导眼睛去判断每个成员有多少朋友。你可以看到一个人只有一个朋友,而另一个人却有 17 个!这个图已经太大了,无法手工计算,但是计算机可以遍历网络中的每个节点,计算朋友和朋友的朋友。在扎卡里的空手道俱乐部,我们有,

*The fraction of people with fewer friends than their friends have* ***on average*** *is 85.29%.**The fraction of people with fewer friends than* ***most*** *of their friends is 70.59%.*

扎卡里空手道俱乐部的朋友和朋友的朋友直方图。通过查看网络中每个人的每个朋友的朋友来收集数据。那些朋友的分布可以用均值和中位数来概括。对于每个人的每个朋友,这些数字被列表并绘制在下一行。图片作者| 来源

上面的直方图详细显示了数据。你可以再次看到有很多朋友的少数人的关键特征。显然,那些少数人会比他们的朋友拥有更多的朋友。但这就是重点——这样的人很少!一旦我们查看“朋友的朋友”的完整分布,我们会发现它明显变*,并且更有可能找到大量的朋友。下面的两个直方图显示了网络中每个人的朋友数量的*均值和中间值。请注意,在这两种情况下,每个人都有大约 9 个朋友。这比网络中的绝大多数人多得多!事实上,34 个人中只有 4 个人有 9 个以上的朋友。

去大还是去…实际上我们去多大似乎并不重要

现在让我们回到脸书。这一次,我们将使用从 10 个人那里收集的数据,这些数据将被匿名化并公开。它包括大约 4000 人,这些人在不同的社会圈子里与这 10 个人有联系。社交网络是这样的。

脸书自我图,显示围绕受欢迎的个人的社区结构和聚类。图片作者| 来源

我们也可以计算这个网络的朋友和朋友的朋友。细节是这样的。

脸书自我图中朋友和朋友的朋友的直方图。通过查看网络中每个人的每个朋友的朋友来收集数据。那些朋友的分布可以用均值和中位数来概括。对于每个人的每个朋友,这些数字被列表并绘制在下一行。图片作者| 来源

总之,我们发现,

*The fraction of people with fewer friends than their friends have* ***on average*** *is 87.47%.**The fraction of people with fewer friends than* ***most*** *of their friends is 71.92%.*

很像!但也许这只是一个巧合。毕竟只是两个数据点。我们如何为任何社交网络测试这个想法?模拟!

假装直到你成功

模拟是通过研究事物的比例模型来理解事物的一种工具。风洞中的飞机机翼模型就是一个典型的例子。今天,许多模拟完全是在计算机上完成的。在社交网络的背景下,有许多模型,但出于纯粹的懒惰,我们将选择所谓的barabási–Albert 模型,因为它已经在我正在使用的计算机包 NetworkX 中实现。如果我们创建一个 34 人的模拟社交网络(与空手道俱乐部的人数相同),它看起来会像这样。

的一个实例巴拉巴希-艾伯特模型 上有 34 个节点。它是逐节点构建的,将每个新节点连接到两个先前的节点,并优先选择高度连接的节点。这是一个社交网络的例子。图片作者| 来源

它看起来和空手道俱乐部没什么不同,是吗?数字数据也很相似。

**上例 barabási–Albert 模型图中朋友和朋友的朋友的直方图。通过查看网络中每个人的每个朋友的朋友来收集数据。那些朋友的分布可以用均值和中位数来概括。对于每个人的每个朋友,这些数字被列表并绘制在下一行。图片作者| 来源

在这个例子中,感兴趣的数字是,

**The fraction of people with fewer friends than their friends have* ***on average*** *is 79.41%.**The fraction of people with fewer friends than* ***most*** *of their friends is 70.59%.**

这很好,但是模拟的真正魅力在于快速测试多个例子的能力。以上只是一个模拟的社交网络。为了对我们的结论有充分的信心(当然是相对于模型的假设),我们需要在随机生成的社会网络上进行许多模拟。

模拟所有的图形!

如果我们在 34 个人的 10,000 个随机社交网络上重复上述练习,我们发现,

**The fraction of people with fewer friends than their friends have* ***on average*** *is 79.31%.**The fraction of people with fewer friends than* ***most*** *of their friends is 65.31%.**

因此,现在我们可以有把握地说,朋友悖论在任何社交网络中都存在——至少有一个社交网络与有 34 个人的 barabási-Albert 模型具有相同的特征。另一件我们很容易做的事情是改变网络中的人数,看看这种趋势是否会在大型网络中继续。的确,如果我们增加人口,情况会变得更糟。随着社交网络中的人数增加,朋友数量少于朋友数量的人的比例(大多数或*均)也增加了。

《友谊悖论》展示了 100 多个随机选择的社交网络,它们是用 巴拉巴希-阿尔伯特模型 创建的,用于增加网络规模。图片作者| 来源

酷,酷。有什么不那么令人沮丧的事情要告诉我们吗?

已经表明这种矛盾也不仅限于朋友。当你和你的朋友比较时,你也可能在收入、推特粉丝和你的快乐程度方面有所欠缺——这个事实可能没有帮助。但是,好吧,废话说够了——我们现在都感觉很糟糕!我们肯定能从这一切中收集到一些积极的东西,对吗?是啊!

因为你的朋友比你接触的人多,他们很可能会比你先感染病毒——或者通过社区传播的任何东西。事实上,研究人员表明,与其跟踪随机选择的人来判断疾病的传播,不如让这些随机选择的人说出一个朋友的名字,然后跟踪那个朋友,这样效率会高得多!在研究中,这组朋友比最初选择的人*均提前两周生病。可能还有很多其他的应用等待着被发现来解释友谊悖论。

在我们结束之前,我想问最后一个问题:友谊悖论一定会发生在任何社交网络中吗?这个问题的答案是肯定的,也是否定的。对于使用*均值的悖论陈述,答案是肯定的,这可以从数学上得到证明。也就是说,*均而言,人们的朋友数量少于或等于他们朋友的朋友数量的说法对于你能想到的任何社交网络都是成立的。对于使用多数(你的大多数朋友比你有更多的朋友)的说法,答案是否定的。关键因素是受欢迎的个人的存在或不存在。我们甚至可以创建完全随机的社会网络,这种悖论并不成立。考虑以下网络,同样超过 34 人。

**这个网络(来自erdős–rényi 模型 )是通过考虑每个人都是其他每个人的朋友而构建的,具有某种固定的概率(在这种情况下为 75%)。图片作者| 来源

对于我们拥有的这个社交网络,

**The fraction of people with fewer friends than their friends have* ***on average*** *is 44.12%.**The fraction of people with fewer friends than* ***most of*** *their friends is 44.12%.**

从好友的详细分布可以更清楚的看出区别。朋友的数量是*均分布的。这和看人的身高差不多。所以,大约一半人的朋友比他们的朋友少,另一半人的朋友比他们的朋友多,剩下的人的朋友数量和他们朋友的*均数量完全一样。

**上例 erdős–rényi 模型图中的朋友和朋友的朋友的直方图。通过查看网络中每个人的每个朋友的朋友来收集数据。那些朋友的分布可以用均值和中位数来概括。对于每个人的每个朋友,这些数字被列表并绘制在下一行。图片作者| 来源

结论

当然,有一点应该是显而易见的,如果每个人都有完全相同数量的朋友,那么他们也会有和他们的朋友一样多的朋友!但当朋友的分布更加均匀时,情况也是如此。这说明了什么?我想这让*等主义团体的主张更加可信。但事实似乎是,更多的等级网络(无论是友谊、公司、Twitter 追随者等等。)自然增长,以适应*护大量连接所带来的复杂性。但这是另一篇博文的主题。与此同时,

请勿分享这个。而是告诉一个朋友来分享。

(本文的所有模拟和数据都可以在下面的 GitHub 上找到。)

“Sklearn 的 TF-IDF”与“标准 TF-IDF”

原文:https://towardsdatascience.com/how-sklearns-tf-idf-is-different-from-the-standard-tf-idf-275fa582e73d?source=collection_archive---------14-----------------------

让我们来看看与传统的 TF-IDF 相比,Sklearn 的 TF-IDF 的计算方法有何不同,并一步一步地进行分析。

亚历克斯·钱伯斯在 Unsplash 上的照片

这篇文章是在我试图使用标准公式手工计算 TF-IDF 矩阵时受到启发的,在首先计算 TF 和 IDF,然后将两者相乘之后,我意识到,与我在我的样本语料库上用 Scikit-learn 获得的结果相比,有一些不同,在那里我意识到 Scikit-learn 版本与大多数标准和传统版本之间的差异。事不宜迟,我们来了解一下区别。

TF-IDF 的标准定义是什么?

TF-IDF 定义:“词频-逆文档频率”,是一种数字统计,旨在反映一个词对集合或语料库中的文档有多重要。【2】

目的:使用 TF-IDF 而不是给定文档中记号出现的原始频率的目的是按比例缩*记号的影响,这些记号在给定语料库中非常频繁地出现,因此在经验上比在一*部分训练语料库中出现的特征信息少。【1】

如何计算到它?

它只是两个重量的乘积,TF 和 IDF 重量:

  • TF: Term Frequency 衡量一个术语在一个文档中出现的频率,因为每个文档的长度不同,所以一个术语在长文档中出现的次数可能比短文档多得多。因此,TF 为:

  • IDF:逆文档频率衡量一个术语的重要性。在 TF 中,所有术语都被认为是同等重要的。因此,我们需要通过计算以下各项来降低常用术语的权重,同时提高稀有术语的权重:

注意:在 Scikit-learn 中,log 不是以 10 为底的,尽管它是自然对数(它有一个底 e,e 是一个无理数和超越数,大约等于 2.718),

这里,有一个 IDF 实际含义的*例子:这个例子有 4 个术语:(a,船,移动和 mobilegeddon)。

来源:Moz 作者埃里克·恩格

可以看到,IDF 最高的是最稀有的词(Mobilegeddon),而词的频率越低,IDF 值就越*。

Scikit-learn TF-IDF

现在,Scikit-learn 的 [***TfidfTransformer***](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html#sklearn.feature_extraction.text.TfidfTransformer) [***TfidfVectorizer***](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#sklearn.feature_extraction.text.TfidfVectorizer) 中计算出的 TF-IDF 与标准教科书符号有何细微差别?

不同之处如下:TF 保持不变,而 IDF 不同:IDF 的分子和分母中添加了“某个常数 1”,就好像看到一个额外的文档恰好包含集合中的每个术语一次,这防止了零除法“这是一种更具经验性的方法,而大多数教科书中的标准符号没有常数 1。

现在,让我们尝试将 Scikit learn TF-IDF 一步步应用到下面三个句子组成的语料库中,看看结果:

在文本语料库中,一些单词(例如,英语中的“some”、“a”、“h as”等)如果直接输入到分类器,这些非常频繁的术语将掩盖更罕见但更有趣的术语的频率。因此,使用停用字词删除来删除它们是最好且有效的方法,因为它们携带的关于文档实际内容的信息非常少。

形成来自语料库的所有独特单词的词汇将由这 5 个单词组成:“John”、“Cat”、“Eat”、“Fish”和“Big”。

词汇频率计数

术语频率(TF)

让我们从计算 Tf('John ',句子 1)开始

  • 分子:“约翰”在句子 1 中只出现一次
  • 分母:句子 1 中的总字数为:{John,cat}=2

TF('约翰',句子 1) = 1/2

类似地,整个词汇表的 TF 值如下表所示:

结果 TF 表

反向文档频率(IDF)

如上所述,IDF 是一个衡量术语重要性的指标。IDF 值是必不可少的,因为仅计算 TF 本身不足以理解单词的重要性。

让我们来计算 IDF(“约翰”):

  • 分子:句子总数=3
  • 分母:包含“John”的句子数=1

IDF(' John ')= log((3+1)/(1+1))+1 = 1.69

同样,整个词汇表的 IDF 值如下表所示:

生成的 IDF 表

应用(TF X IDF)产品

为第一个向量句子计算的标准化示例

最终的 Tf-IDF 向量表

相同语料库的 Sklearn_TF-IDF 输出

标准化步骤

在 Scikit-Learn 中,产生的 TF-IDF 向量然后通过欧几里德范数归一化。这最初是为信息检索(作为搜索引擎结果的排序函数)开发的术语加权方案,在文档分类和聚类中也有很好的用途。[1]

摘要

传统的 TF-IDF 和 Scikit-learn 的 TF-IDF 之间的主要区别在于分母和分子中存在酉常数。

标准与 Sklearn TF-idf 结果矩阵

总的来说,这不会改变 TF-IDF 矩阵的向量表示,与标准的相比,词汇将由更高的权重来表示,而在标准的 TF-IDF 表中,相应的值反而被设置得更*。

然而,TF-IDF 的核心原则将保持不变: TF-IDF 为不太频繁的词给出更大的值,并且当 IDF 和 TF 值都高时为高 ,正如我们可以在 cor 中为我们的不太频繁的词确认的那样:{John 和 Big}:对于它们两者,TF-IDF 实现了比 TF-IDF 表中剩余的更高频率的词更大的值。

总的来说,直到 2015 年,与同等重视每个单词的传统单词包方法相比,TF-IDF 一直是为表示文档相关性的单词分配权重的传统方法。t 仍然被积极用于有效地解决 NLP 问题。下面是 Sklearn 实现的代码。

参考

[1]https://sci kit-learn . org/stable/modules/feature _ extraction . html # text-feature-extraction

[2]https://en.wikipedia.org/wiki/Tf%E2%80%93idf

[3]墨子。2020.逆文档频率和唯一性的重要性。[在线]可从以下网址获得:https://moz . com/blog/inverse-document-frequency-and-the-importance-of-unique

**的修改可以改变故事的视角

原文:https://towardsdatascience.com/how-small-modifications-can-change-the-perspective-of-a-story-eee81723103d?source=collection_archive---------32-----------------------

保持图表和图形的简单性对于向更广泛的受众提供正确的视角至关重要。

艾萨克·斯密特在 T2 的照片

我想以一个简短的介绍开始这篇文章,因为这是我在 Medium 上的第一篇文章。我叫 Renee,从事数据工作已超过 11 年。我的主要精力一直放在讲故事和可视化数据上,所以如果我看到一些不能让故事发生的东西,我会忽略它或改进它。正如我们所知,数据是强大的,如果你歪曲了它,你可以创造一个全新的故事,而不是正确的故事。

昨天我在读一篇文章,这篇文章可视化了关于冠状病毒 2019-nCoV 的新闻数据。吸引我眼球的是文章中的以下两张图表:

图表 1 —全球感染(累计)

来自 Delfi Forte 的图表和数据

图表 2 —死亡人数(累计)

来自 Delfi Forte 的图表和数据

从本质上来说,它们看起来还不错。他们倾向于讲述不正确的故事。首先是安讯士的。在图 1 上,轴从 0–40000 运行,而在图 2 上,轴从 0–800 运行。这是一个 50 倍的差异。因此,如果我们比较这样的数字,我们应该总是使用相同的轴值。

为了让这张图表发挥作用,并向读者提供更多信息,我们可以做哪些改进或改变?本质上,有多种方法可以解决这个问题。

选项 1 —对两个图表使用相同的轴值

选项 2 —将这些图表合并成一个。你不会浪费宝贵的空间,而且你会对实际发生的事情有更好的了解。

方案三死亡率。虽然病毒感染的传播及其死亡人数是有价值的,但它们的比率有更高的影响。这显示了威胁是增加还是减少,以及其行为是否确实发生了变化。在这种情况下,传播信息最有力的图表将包含 3 个指标:感染人数、死亡人数&死亡率。

所以让我们创建选项 3 。请注意,我使用的数据与创建上述图表时使用的数据相同,数据截止到 2 月 6 日。

我们取得了什么成就?

如果我们看看这个故事,它并不像记者最初在图表中展示的那样糟糕。虽然我们确实看到感染人数增加,特别是自 2 月 1 日以来,死亡率实际上自跟踪开始以来有所下降,从 2.8% 下降到 2.0% 。像往常一样,我们必须对这些数字持保留态度,因为数字会继续增加,事情会随着时间的推移而改变。作为参考,2019 年非传染性非典型肺炎死亡率低于非典或中东呼吸综合征死亡率(非典9.6%;MERS 34.5% )。

虽然分析部分确实发挥了作用,但本文的主要焦点是视觉视角。我从记者的角度出发,制作了一个图表,展示了更多的信息,每个人都可以根据这些信息做出自己的假设。以前,如果你没有注意到轴的,你会得到一个完全不同的故事,你错过了一个关键组成部分——死亡率

因此,我们清理了图表和数据,添加了额外的信息,只用一张图表来讲述完整的故事。

亲爱的记者们,当你们向更广泛的公众传达信息时,请仔细阅读和使用你们的数据。这些图表可能看起来很酷,但是这些图表很容易误导你的读者,而且不是所有的读者都懂数据。

来源:

数据&图形—Delfi Forte—https://Forte . Delfi . ee/news/varia/uuenev-kaart-ja-graa fik-米兔-haigusjuhtu-lah tub-uuest-murettekitavast-allikast?id=88770709

非典https://www.who.int/csr/sars/country/table2004_04_21/en/世界卫生组织(世卫组织)

MERS —世界卫生组织(世卫组织)—http://applications . emro . who . int/docs/EMROPub-MERS-SEP-2019-en . pdf?ua=1 & ua=1

社交媒体公司如何知道向你展示什么:你好,逻辑回归!

原文:https://towardsdatascience.com/how-social-media-companies-know-what-to-show-you-hello-logistic-regressions-6f8cf19eaf17?source=collection_archive---------32-----------------------

检验为什么逻辑回归比线性回归更适合分类问题

图片作者:特里斯特·约瑟夫

数据科学是否已经接管了世界,这已经不再是一个问题。数据已经成为世界上最有价值的资源之一,以至于大公司内部几乎每一个决策都是由数据严格驱动的。这种对数据的极端使用在有广告和推荐的社交媒体公司或大型*台中尤为明显。这是有道理的,因为该*台的转换率是其业务的支柱。因此,用户看到的每一条内容都应该进行优化,以实现其最大潜力。

例如,当浏览 Instagram 时,有非常强大的机器学习算法在后台运行,以确定用户是否会对某个内容感兴趣。这些算法可以接受各种输入来确定兴趣,这些输入可以包括用户的年龄、用户通常与之交互的内容,甚至用户在 Instagram 上活跃的频率等特征。机器学习算法能够预测这一点的原因是因为这些算法可以找到模式并将其应用于大型数据集。因此,基于在*台庞大的用户群中检测到的各种模式,可以对各种用户子集进行预测。

图片作者:特里斯特·约瑟夫

现在,这种确定用户是否对内容感兴趣的行为被称为分类问题。分类问题指的是根据模型开发的标准将观察值分组到离散的类别中。更广泛地说,这个场景可以被认为是一个回归分析。这是一种寻找因变量与一个或多个自变量之间关系的技术。例如,人们可能会注意到天气越热,冰淇淋融化得越快。在这种情况下,温度是独立变量,冰淇淋融化的速度是因变量。除了温度之外,还有其他因素影响冰淇淋的融化速度。也许由于温度的剧烈变化,冰淇淋最初会融化得更快,但随着一切的液化,最终会融化得更慢。在这种情况下,吃冰淇淋的时间也是一个独立变量。

可以进行不同类型的回归分析,第一种是线性回归。顾名思义,它决定了因变量和自变量之间存在线性关系的程度。如果将线性回归应用于冰淇淋的例子,它将被称为多元线性回归,因为有一个以上的独立变量预测冰淇淋的融化速度。线性回归是一个强大的工具,公司可以使用它来确定用户是否对推广的内容感兴趣。这里,回归的工作是预测用户对内容感兴趣的概率,例如,如果概率超过 70%,则判定规则是用户感兴趣。

图片作者:特里斯特·约瑟夫

然而,使用线性回归来预测这种概率有一个很大的潜在问题。事件的概率是对事件发生的可能性的一种度量,这种度量被限制在 0 和 1 之间(或 0%和 100%)。这意味着,即使整个世界完全确定某个事件将会发生,它现在也不会将该事件的概率增加到 112%。同样,负概率也不存在。但在线性回归下,情况并非如此。由于线性回归的性质,如果使用线性回归,它可能会预测出超出概率范围的值。此外,由于线性回归将“最佳拟合”线应用于数据,大得多(和*得多)的观察值将改变线的斜率;因此,当给定固定的决策规则时,改变分类。

正因为如此,逻辑回归更合适。这是一种回归,其中输出变量是具有两个或更多互斥级别的分类变量。也就是说,输出可以是“感兴趣”对“不感兴趣”,或者“类型 A”对“类型 B”对“类型 C”(其中 A 和 B 与作为基本类型的 C 进行比较)。逻辑回归预测概率,并根据适当的决策规则集分配分类。与线性回归相比,逻辑回归的优势在于其概率输出在概率范围内。这是因为逻辑回归遵循逻辑增长的数学概念。让我们回到冰淇淋问题上来,以便更好地理解这个概念。假设冰淇淋从冰箱里拿出来,放在一个更暖和、温度稳定的环境里。由于温度升高,冰淇淋开始迅速融化,但冰淇淋不会永远融化。相反,它会融化,直到所有的东西都液化,融化的速度将为零(因为它已经停止融化)。根据线性回归,即使冰淇淋已经停止融化,也可能预测到负融化率。

图片作者:特里斯特·约瑟夫

逻辑回归使用连续和离散测量来提供概率和分类观察值的能力使其成为机器学习中非常流行的方法。正如可以预期的,逻辑回归不仅可用于确定用户是否对特定内容感兴趣,也可用于模拟冰淇淋的融化速度。该方法在金融行业用于确定信用卡欺诈,在医疗领域用于识别恶性和良性肿瘤,甚至被电子邮件服务用于检测垃圾邮件。必须注意的是,由于逻辑回归的数学结构,变量的系数不能像线性回归那样直观地解释,它不能直接输出概率。相反,它输出一个事件的对数概率,这个输出可以通过数学变换转换成概率。

回归分析是强大的,但是考虑到手头的问题,利用最合适的分析类型是最重要的。逻辑回归最适用于因变量为二分变量或分类变量的分类问题。所以,下次你在 Instagram 上看到一些推广内容时,想想是什么变量让 Instagram 算法认为你更有可能对它感兴趣,这将是一件有趣的事情。

参考文献:

machinelingmastery . com/logistic-regression-for-machine-learning

career foundry . com/en/blog/data-analytics/what-is-logistic-regression

towards data science . com/regression-or-class ification-linear-or-logistic-f093e 8757 b9c

statistically significant consulting . com/regression analysis . htm

其他有用的素材:

towards data science . com/why-linear-regression-is-not-fitted-for-binary-class ification-c 64457 be 8 e 28

saedsayad.com/logistic_regression.htm

stats.idre.ucla.edu/stata/dae/logistic-regression/

machine learning plus . com/machine-learning/logistic-regression-tutorial-examples-r/

你的城市有多恐怖?绘制和预测可怕的东西

原文:https://towardsdatascience.com/how-spooky-is-your-city-mapping-and-predicting-scary-stuff-26b7dea892bd?source=collection_archive---------41-----------------------

互动地图和令人毛骨悚然的现象预测建模…为什么不呢?让我们享受一下数据科学的万圣节乐趣。

照片 加里·穆利曼

不管你是不是那种寻找幽灵的人,你猜怎么着:你可能住在一些令人毛骨悚然的东西附*。

为了纪念这个季节,我们认为做一些可怕的地图和怪异现象的石化预测会很有趣。数据科学不一定只是针对严肃的学科!我将向您展示我是如何使用 Alteryx Designer、Python 和映射包 follow 来分析和映射这些数据的。

美国最诡异的地方(也是最不诡异的地方)

为了了解美国大都市地区有多恐怖,我根据每个大都市地区的墓地和闹鬼地点的密度,以及人均 UFO 目击事件和大脚怪遭遇,为每个地区创建了一个(愚蠢的)恐怖评分。(更多关于下面的数据来源。)

下面的地图显示了 352 个都会区,并在弹出窗口中显示了每个都会区的数据点。(互动版请访问本网站。)下面我就告诉你我是怎么用叶子搭建的。

作者图片

探索地图,找到你的城市!点击发微博你的*镇有多恐怖。

你的城市进入前 10 名了吗?

🏆十大最恐怖的都会区🏆

  1. 马萨诸塞州伍斯特
  2. 马萨诸塞州普罗*登斯-沃里克
  3. 华盛顿-阿灵顿-亚历山大,DC-弗吉*亚州-马里兰州-西弗吉*亚州
  4. 马萨诸塞州波士顿-剑桥-牛顿
  5. 宾夕法*亚州费城-卡姆登-威尔明顿
  6. 纽约-纽瓦克-泽西城,纽约州-新泽西州-宾夕法*亚州
  7. 马萨诸塞州巴恩斯特布尔镇
  8. 金斯波特-布里斯托尔-布里斯托尔,田纳西州-弗吉*亚州
  9. 宾夕法*亚州阿伦敦-伯利恒-伊斯顿
  10. 俄亥俄州辛辛那提市

作为一名西海岸居民,看到前 10 名名单明显集中在东部,我有点失望!(俄勒冈州所有的大脚怪目击事件肯定都有意义吧?!)但当你深入研究数据时,这些排名是有意义的。排名前十的地方往往有大量的墓地分布在*的地理区域内。他们有悠久的历史和许多闹鬼的地方,他们有许多 UFO 目击事件(尤其是纽约)。

你有没有从地图上发现你正处于一个可怕的超自然活动的温床?想远离食尸鬼、外星人、大脚怪和幽灵吗?让我们看看在美国什么地方你可以远离令人毛骨悚然的爬行动物。下面的热图——也是用 lyum 构建的——是基于所有怪异的东西的纬度/经度:墓地、闹鬼的地方、大脚怪遭遇和 UFO 目击——所以热图上更强烈的区域有更多这些东西。(互动版请访问本网站。)

作者图片

虽然热图最初可能会让你觉得到处都是不祥之兆,但放大后,你会发现一个和*宁静的绿洲供你逃离!

你会选择地图上的哪个安静的地方来躲避幽灵、妖精和其他可怕的生物?点击发布推文并分享您的目的地。

寻找可怕的地方来绘制地图

首先,当然,我需要找到令人毛骨悚然的东西:墓地的位置和细节、闹鬼的地方UFO 目击事件全国各地的大脚遭遇。令人惊讶的是,后三者,包括纬度/经度数据,都是由数据科学家 Timothy Renner 汇编并公开共享的。然而,墓地的位置有点难以找到。我用这些美国人口普查文件中每个州的著名地标进行过滤,只识别出墓地,并提取出它们的纬度和经度。

在 Alteryx Designer 中组合这些数据后,我使用其空间工具为每个“鬼地方”创建带纬度/经度的点,包括所有四类令人毛骨悚然的东西。Designer 的 Allocate Input 工具为美国主要大都市地区引入了有用的人口和地理信息,包括表示每个城市物理区域的空间对象。

最终,我想把每个怪异的地方分配到正确的大都市区域。将幽灵点和大都市地区的空间对象插入 Designer 的空间匹配工具,为我完成了所有的工作,并使人口数据加入到这些地方成为可能。

图片来自 GIPHY

构建地图

我使用 Alteryx Designer 中的 Python 工具和包follow构建了这些地图,这是一种将每个城市区域的纬度/经度点放置到地图上并生成热图的超级简单的方法。follow 使用leafle . js进行交互,但是所有的 JavaScript 都在幕后进行。各种各样的定制选项都是可能的,包括八种不同的免费背景地图,让你的地图有些风格,以及使用工具提示,*地图和表情符号标记的选项。

follow 还允许您使用 HTML 为您的标记制作格式良好的弹出窗口,在这里使用非常有趣。这个例子展示了一种格式化 HTML 的方法,你可以在下面看到我是如何使用这个选项的。

然后,我将地图设置为从特定位置(美国大陆的中心)开始,使用深色主题,并包含地图比例。此外,因为地图上的 352 个标记会让浏览者不知所措,所以我决定将这些标记聚集起来;当用户放大时,每个聚类扩展成单独的标记。for 循环遍历 dataframe 并生成地图上的点,在我提供的 HTML 中格式化,并将它们添加到要放置在地图上的标记簇中。

我在一个单独的数据文件中也有所有幽灵遭遇和地点的纬度和经度,这就是我用来生成上面的热图的。使用“叶子”创建热图甚至比制作上述基于标记的地图更简单:

您完成的地图可以保存到您指定的文件路径的 HTML 文件中。在 Alteryx Designer 中,我只是将我创建的两个文件路径保存到一个 dataframe 中,并为了方便起见将其写出 Python 工具。无论你用什么方法,只要在浏览器中打开文件就可以享受你的创作了。

根据我在这一点上收集的信息,制作地图既简单又有趣。但是,除了找出美国哪里出现了幽灵,我还想知道:我们能否预测什么会让某个特定的大都市地区变得更加幽灵?

图片来自 GIPHY

添加令人恐惧的功能

还有什么能让一个地区变得更加阴森恐怖?我想到了一些可以在合理的时间内找到公开可用数据的可能因素:

  • 可能与超自然“活动”感知有关的恶劣天气现象
  • 当地人对超自然现象的看法(如果更多的人相信,也许会有更多的事情发生)?)
  • 人口密度(幽灵般的遭遇倾向于发生在人们或多或少分散的区域吗?)
  • 当地人的年龄(也许年长或年轻的人口更倾向于看到/报告超自然现象?)
  • 房价(也许在或多或少富裕的州,人们倾向于经历更怪异的事情?)

对于恶劣天气数据,我从 NOAA 获取了龙卷风、冰雹和破坏性大风事件的 2018 年记录,并在将它们与我更大的数据集匹配之前按州进行了汇编(尽管如果有更多的时间,我可以用 Alteryx Designer 的空间匹配工具将它们都匹配到特定的地铁区域)。

关于美国人对超自然现象的信念的公开数据更难找到;肯定有可用的数据,但大多数需要购买。我最后用了 2018 年的社会综合调查,其中包含了问题:“你相信人死后还有生命吗?”在公开的数据中,参与者的回答只标记了九个地理区域中的一个,而不是他们的具体位置,但我至少能够将每个灵异事件与该区域相信来世的人的百分比联系起来。

使用我之前引入的人口普查数据,人口密度很容易计算并作为一个新变量添加进来。该数据还包括大都市地区的*均年龄。对于房价,我使用了 Zillow 公开的单户住宅销售价格中值数据,并计算了每个州的*均值。

我没有找到每一个都很理想的数据,但是当然,用不太理想的数据前进是正常的。因此,我们将看看我们是否真的可以用这些数据做任何关于惊吓的预测。

图片来自 GIPHY

塑造恐怖

诚然,这不是数据科学任务中最“科学”的。但是让我们看看我们能想出什么,只是为了它的愚蠢的惊吓。

预测模型的目标是预测大都市地区的幽灵分数。我选择使用大都会地区的人口密度、该地区对来世的信仰、*均房价、所有单独的天气变量以及大都会地区人口的中位年龄作为预测指标。总的来说,令人毛骨悚然的分数与任何单一变量都没有很强的相关性;与种群密度的最高相关系数为 0.37。

我还在探索性分析中注意到,在幽灵分数中存在强烈的右偏,因此在继续建模之前,我对幽灵分数进行了对数转换,以实现分数的更正态分布。利用 Alteryx 社区上@ DavidM的提示,我还标准化了其他预测因子,因为它们的范围变化很大。

我尝试了线性回归、样条和随机森林模型。使用 80/20 训练/测试分割和模型比较工具,我发现随机森林模型表现最好,解释了分数中 58%的差异。该模型提供了 0.56 的 RMSE,以及其预测和实际怪异分数之间 0.79 的相关性。下图显示了模型中特征的相对重要性。

作者图片

我还让 Alteryx Designer 的智能套件的辅助建模功能尝试预测怪异的分数。它使用相同的训练/测试数据,表现最好的模型也是随机森林回归器,RMSE 为 0.72,其预测和实际幽灵得分之间的相关性约为 0.78。但是辅助建模也通知我调整后的 R *方为 0.48;调整后的 R *方是另一种相关性度量,它考虑了模型中使用的变量数量,对包含更多变量的模型进行惩罚。

以上三张图片由作者提供

为了加强这种分析,我很想获得更多关于超自然信仰的城市地区级数据,我会花更多时间微调天气和房价数据,而不是使用州汇总。此外,包含以下数据会很酷:1)一个城市建立的年份,以解决随着时间积累的墓地数量(正如在这篇博客文章/可视化中所讨论的);以及 2)到最*的军事基地和/或机场的距离,以帮助解释 UFO 目击事件(或者会吗?!👽 👽 👽).

因此,这两个建模结果都不是很壮观,但考虑到我们正在建模的内容和数据的不精确程度——嗯,它们还不错,想想这些模型告诉我们关于幽灵的事情很有趣。人口密度较高的地区今天有更多的人,但他们所有的墓地里也有更多的尸体。恶劣的天气事件似乎与灵异事件没有很强的联系(我认为某种天气至少会与 UFO 目击事件相关联,但是没有!).

也许幽灵般的东西终究不是那么容易预测的…它们只是幽灵般的,这就是它们有趣和迷人的地方。神秘继续!👻

原载于 Alteryx 社区 并精选于 Alteryx 数据科学门户

Spotify 如何理解您的音乐多样性

原文:https://towardsdatascience.com/how-spotify-understands-your-music-diversity-d3bed2cc3767?source=collection_archive---------34-----------------------

推荐系统

在 Spotify 测量用户消费多样性,以量化推荐系统的影响

照片由斯潘塞·因布罗克Unsplash 上拍摄

T4:如今,几乎所有的软件产品都缺乏某种形式的个性化。众所周知,这些都是由引擎盖下的推荐算法驱动的,像网飞YouTube 这样的服务每年都投入大量资金来优化这些系统。一些应用程序,如抖音将推荐系统放在中心位置,以推动应用程序的浏览量和病毒式传播。

Spotify 也不例外。

Spotify 于 2006 年由丹*尔·埃克(Daniel Ek)和马丁·洛伦佐(Martin Lorentzon)在瑞典创立,目标是创建一个合法的数字音乐*台。目前,Spotify 拥有超过 5000 万首歌曲,来自 1500 多个流派。除此之外,每天还有大约 40,000 首歌曲添加到它的*台上!

截至 2020 年 3 月 31 日,Spotify 每月有 2 . 86 亿活跃用户,其中 1 . 3 亿是全球 79 个市场的付费用户。事实上,Spotify 预计,到 2020 年底,每月活跃用户数量将达到 3.28 亿至 3.48 亿。

鉴于大量的内容和庞大的用户群,Spotify 依靠推荐算法向其用户群推广内容并不奇怪。推荐算法推动了他们的顶级功能之一,每周发现,它允许用户通过找到与其他用户播放列表的相似性来尝试与他们喜欢的音乐类型相似的音乐。该公司目前正在测试一个赞助推荐功能,让艺术家团队通过推荐付费来赞助他们的内容。

显然,推荐系统在 Spotify 的内容消费中扮演着非常重要的角色。

然而,这篇文章并不是为 Spotify 唱赞歌。

相反,鉴于大量的内容和用户群,预计用户会有不同的口味。所以问题是:

Spotify 如何衡量其用户群中的内容多样性?

我们在这篇文章中回答了这个问题!这篇文章中的代码是在这里找到的。

什么是用户消费多样性?

如果你是 Spotify 用户,你可以通过 spotify.me 找到你音乐消费的一些有趣趋势。例如,你一天中最活跃的收听时间是什么,最喜欢的音乐类型和*均音乐节奏。或者你是否有一个烹饪爱好者的播放列表。

有趣的是,有一个横幅展示了你听过的音乐的多样性。

来源:作者的 spotify.me

当然,收集流行度和使用统计数据是非常简单的,这些数据可以作为推荐系统的数据。然而,假设我们想要确保给用户的推荐是多样化的。如何衡量多样性?

衡量多样性的两个标准指标是基*系数香农熵

基*系数图解(来源:*基百科)

基*系数源于对社会不*等的经济衡量。通常参照洛伦兹曲线来定义。从图中可以看出,洛伦兹曲线绘制了人口总收入的比例( y- 轴),该比例是由人口中最底层的 x 累积所得。45 度线表示收入完全*等。从图中可以看出,基*系数等于A/(A+B)。由于轴在 0 和 1(包括两端)之间测量,系数也等于 2 A 或 1–2B,因为等式 A + B = 0.5(三角形的总面积)成立。在上图中,对于推荐系统,我们可以用“人”来交换用户,用“收入”来交换点击量或其他可取的指标。

香农熵测度是以信息论之父克劳德·香农命名的经典测度。它在 1948 年的开创性论文《沟通的数学理论》中首次提出。它被定义为

其中 pᵢ 是随机变量 X 实现 xᵢ 的概率。注意,它是为离散随机变量定义的。对数底数通常设置为 b =2,以为度量单位。熵将最大化当且仅当每个项目的流行度是独立的,并且按照均匀分布同分布。

这两种方法都有一个主要缺点:它们没有考虑项目之间的相似性

任何做过销售的人都会告诉你,在任何一个系列中,只有一*部分商品是受欢迎的。一个典型的受欢迎程度排名会产生一个类似 Zipfian 的分布,有一个短头、一个长尾和一个远尾。

推荐系统面临的项目流行度的典型分布(来源:论文

大多数数据集中的项目不是独立的,正如这些度量所假设的那样。相反,一个项目和另一个项目之间往往存在关系,因为它们可能属于同一种音乐类型,就像 Spotify 的情况一样。

有什么更好的办法?

Spotify 衡量多样性的方法来自于通过使用歌曲嵌入来考虑歌曲之间的相似性。

Spotify 使用 Word2Vec ,这是一个众所周知的语言模型,它从语料库中学习单词的分布式表示。特别是,Word2Vec 应用于用户播放列表(超过 40 亿个!)来学习用户口味,帮助用户发现适合自己口味的音乐。

还有一些其他优秀的文章,以及使用 Word2Vec 进行播放列表 推荐的实现。下面是使用 t-SNE 将 Spotify 收藏的 10 万首歌曲投影到二*空间时,从 Word2Vec 获得的嵌入图。聚类的存在表明各组歌曲之间存在相似性,主要是由于音乐流派的存在。

为 Spotify 收藏中的 10 万首歌曲嵌入 t-SNE(来源:图 1

我们的参考来自一篇研究 Spotify 推荐系统对内容消费的影响的论文。他们将用户 uᵢ 在预定义时间段 T 内的多面手-专家(GS)得分定义为

加权中心在哪里

权重 wⱼ 是用户在时间段 T. 内收听歌曲 j 的次数

直觉上,如果用户听非常相似的歌曲,gs 分数将倾向于 1,因为选择更接*加权中心。相反,如果用户是多面手,那么根据余弦相似性的性质,分数将趋向于-1。

MovieLens 数据集上的多样性

让我们将 GS 分数应用于实际数据集。

我们使用 Movielens 数据集,这是一个公开可用的数据集,通常用作推荐系统的基准。这是 Jupyter 笔记本的链接。运行时,笔记本应该下载数据集。

计算 GS 分数的步骤如下:

  1. 在用户-电影评级对的预定义时间段上训练 Word2Vec 模型,以获得一组电影嵌入。
  2. 对于每个用户,计算中心电影嵌入。
  3. 最后,对于用户在该时间段内看过并评级的每部电影,计算用户的多面手-专家得分。

关于电影镜头的 Word2Vec 培训

我们首先在 MovieLens 数据集中的所有用户-电影交互上训练我们的 Word2Vec 模型。MovieLens 数据集具有从 1995 年到 2018 年的评级。它拥有 283,228 个独立用户。由于数据集只有少量唯一用户,我们将使用整个数据集。因此,时间段 T 从 1995 年跨越到 2018 年。

现在,Word2Vec 是一个半监督语言模型,因此定量确定项目(单词)向量的质量可能很困难。通常,Word2Vec 的输出用于另一个任务,比如分类任务,在这个任务中可以很容易地量化模型的质量。在 Spotify 的情况下,这可以通过模型测量推荐歌曲的点击量来实现。度量模型的 困惑度 是量化模型质量的常用方式,但也有其局限性。

注意,我们没有试图优化 Word2Vec 模型的许多超参数。

因为我们的目标是测量多样性,粗略地看一下有助于理解结果。在这里,我们展示了与经典喜剧窈窕奶爸最相似和最不相似的 5 部电影,结果来自训练过的模型。

与窈窕奶爸最相似的五部电影

与窈窕奶爸最不相似的五部电影

有趣的是,即使没有向 Word2Vec 提供类型信息,我们也可以看到《窈窕奶爸》与其他喜剧相似,而与戏剧不同。其他电影可以类似地评分,这表明该模型正在隐含地学习电影类型的概念

我们可以在 Tensorboard 中使用 t-SNE 来可视化模型中的电影嵌入。我们可以看到电影组,尽管它们不像 Spotify 例子中的歌曲那样紧密聚集。

来自训练的 Word2Vec 模型的电影嵌入的 t-SNE

有了训练好的模型,我们进入下一阶段。

计算通才-专家分数

在数据集中,每个用户对一部电影的评价值在 1 到 5 之间。所以在我们对 GS 评分的定义中,我们把每个用户对每部电影的评分作为权重;这与 Spotify 最初定义中用户听一首歌的次数形成对比。

我们计算 MovieLens 数据集中所有用户的 GS 分数。为了比较,我们还计算了香农熵(使用基数为 2)。

MovieLens 数据集中所有用户的 Shannon 熵

香农熵衡量多样性,但更难解释它的意义。我们可以直截了当地说,有一些用户的熵为零,这意味着他们根本没有多样性,这些用户主要是只观看和评价了一部电影的用户。有许多用户如何观看和评价各种电影,但除此之外没有太多可说的。

MovieLens 数据集中所有用户的通才-专家分数

这里显示了整个 MovieLens 数据集的 GS 分数。从上面的直方图来看,大多数用户观看和评级的电影范围很广。1.0 bin 的峰值主要是由于只观看和评价了一部电影的用户。使用我们训练的 Word2Vec 模型,有 857 个用户观看并评价了一部以上 GS 得分在 0.90 以上的电影。

这两种方法有明显的不同。数据集中的一个例子是一个观看并评价了 140 部电影的用户。用户的香农熵和 GS 分数分别是 7.13 比特和 0.49。这种差异来自于香农熵*等地对待所有电影,而 GS 分数考虑了电影的相似性。它隐含地说明了电影类型,因为一个典型的用户只观看少数类型。

在该论文中,随着活动水*的增加,GS 分数趋向于以 0.5 为中心的稳定分布。有趣的是,对于 MovieLens,似乎有来自两个分布的两组用户,导致了图中所示的双峰分布。对此的调查将取决于未来的工作。

把一切都绑起来

所有这些背后都有一个简单的原则:

项目通常彼此具有相似性。

这是一个基本的假设,如果推荐系统首先要工作的话,这个假设必须成立。Spotify 衡量多样性的方法旨在利用学习模型来挖掘推荐项目本身之间的潜在关系。

如果我们从实施上退一步,步骤是清楚的:

  1. 对项目之间的关系建模,以及
  2. 将这些关系包括在你的多元化评估中。

通过归纳这些概念,我们可以看到,没有必要使用 Word2Vec 来学习项目之间的关系。Spotify 使用 Word2Vec 的原因是该公司一直在为其推荐系统部署该模型。可以使用替代的无监督语言模型,例如 GloVeWordRank 。通常最好使用具有较少超参数的模型,因为 Word2Vec 有许多超参数需要优化。

此外,相似性”将由数据科学家根据应用和产品自行决定。例如,如果项目之间存在潜在的图结构关系,那么无论如何,都要使用图模型。如果矩阵分解模型被用于推荐,那么度量可以是从项目子空间获得的向量之间的余弦相似性。

这里一个微妙的假设是,Word2Vec 模型假设用户消费的顺序很重要。这对 Spotify 来说当然很重要,因为播放列表是根据用户的心情和一天中的时间来组织的。在您的应用中可能是也可能不是,因此假设数据集的排列不变性 顺序并不重要的模型反而更合适。

最后

我们以一个更哲学的注解结束:

推荐系统会将我们的媒体消费从“点击率的世界转移到利基的世界”吗,或者是一个点击率变得更高的世界吗?

我们希望多样性的措施将有助于我们开发系统,为我们所有人提供更丰富、更新奇的体验。

此作品与黄楚欣合著。你可以点击查看她的个人主页!

[1]双关。

[2] Ashton Anderson,Lucas Maystre,Risabh Mehrota,Ian Anderson,Mounia Lalmas,“算法对 Spotify 上消费多样性的影响”,WWW '20,2020 年 4 月 20-24 日,台湾台北,第 2155-2165 页。

德州到底有多容易摇摆?

原文:https://towardsdatascience.com/how-swing-able-is-texas-anyways-83623f0911f3?source=collection_archive---------53-----------------------

从统计学上来说,你的投票很重要

在对过去的选举进行了大量的统计反思后,我努力思考“我的选票真的重要吗”这个概念,我想我并不孤单。

图片来源:亚当·托马斯[1]

我知道我不是唯一一个惊讶地看到德克萨斯州被列为谷歌宏中的“摇摆州”的人。怎么可能呢?某种错误?我在德克萨斯上学,让我告诉你,那个地方是一个红色的州。至少感觉是红色的…

然而,我们看到佐治亚州今年摇摆不定,这确实引出了一个问题:还有哪些州会摇摆不定?

让我们以德克萨斯州为例,我希望证明为什么,事实上,你的投票真的很重要,你应该认真对待它(不管我们的政治倾向)。

选举到底是什么?

当我写关于弗吉*亚州的 T2 和宾夕法*亚州的 T4 时,我指出新闻报道是来自有偏见的样本。现在,当我说“有偏见”时,我并不是说他们错了或者故意误导。我的意思是,由于收集结果的方式(例如,“亲自”投票自然计数更快),它给出了潜在人口(所有选票的总和)所讲述的故事的不完整画面。

此外,自从我开始写这个*系列以来,我一直在考虑将每个州的选票作为我统计分析的“目标”。从统计学的角度来说,我把“所有的选票”当作“总体”,我们可以从中“取样”来推断最终的结果。

这在数学上是合理的……除了当你提到选票本身实际上是该州人民代表的有偏见的样本。

选票计数可能是一种有偏差的抽样技术

民主运作的方式是,我们不假设我们知道人民的意愿是什么。我们问他们。大多数人的意见是我们(某种程度上)赞同的。所以我们建立了整个过程,你可以去投票,告诉政府应该通过什么法律,哪些官员应该任职。但事实是:

不是所有人都投票!!!

投票是一个有偏见的抽样过程,因为不是每个人都参与。我们不能假设,既然 75%的民主党人选择不投票,那么正好 75%的共和党人也会这样做。有时一个群体的更多人会出现在投票站。那么这对选举(和民主)会有什么影响呢?

德克萨斯摇摆舞?

在本文撰写期间,德克萨斯州已经统计了 98%的选票,唐纳德·特朗普以 60 万张选票的优势赢得了该州(52%对拜登的 46%)。但我很好奇,人们对他们想象中的必然结果的感知会不会真的表现出这种结果?我的意思是:假设这个州在 2020 年计票后会变成红色,这在它最终的“红色”中起了作用吗?

有没有一个宇宙存在于德克萨斯实际上转向了…民主党?让我们来看看…

按县划分

让我们做一个类似的分析,我们对弗吉*亚州进行了分析,我们将该州按县进行了划分,以了解德克萨斯在空间上是如何分布的(即每个县是如何投票的?)。首先,我们再次看到,大约 50%的选票来自最大的 5 个县。

作者图片

在弗吉*亚州,这种分布确保了拜登的胜利(尽管他一度落后 20%)。然而,我们可以看到,最大的县哈里斯不像弗吉*亚州的费尔法克斯县那样不*衡(支持拜登)。我想知道…

拜登的支持者在这些大城市出现的人数不像在弗吉*亚那样多,是因为他们认为这是一个注定失败的事业吗?德克萨斯州真的会是一个“蓝色州”吗?

德克萨斯会是一个蓝色的州吗?

正如我们在伊利诺伊州的例子中看到的,我们真的不需要超过 1 万张选票就能了解潜在人口的行为。让我们假设人们在这些县的投票方式反映了潜在人口对该县每个候选人的情绪(即哈里斯县倾向于 55%的蓝色)。然后,让我们以实际人口为例,假设 75%的人处于投票年龄(2016 年的一个相当不错的猜测)。

我们可以利用这两条信息来推断,如果每个达到投票年龄的人都去投票,结果会是怎样。更大的“蓝色”城市人口会像他们在弗吉*亚做的那样吗?

不幸的是,结果并不像我希望的那样戏剧性。拜登从 46%降至 47%,特朗普从 52%降至 51%。德克萨斯州真的是一个红色州。(也就是说,如果这次选举显示的比例具有代表性,那么很难从这些数据中得知)。

但是我不满意。我想知道德克萨斯的摇摆程度 …不仅仅是它是红色还是蓝色。首先说一下我之前做的一个假设。

创纪录的投票率?

我们都在庆祝这次选举 66%的投票率,因为它打破了几十年来的记录。但是,这仍然意味着 33%的人没有投票。实际上,有 33%的人登记投票后选择不投票。

有多少人有资格投票,只是没有登记?因为我有的人口数据,我选择通过这个镜头而不是“注册选民”的镜头来看这些数字。结果是,如果你假设 75%的人到了投票年龄,这个数字会下降到 51%的投票率。现在,当然,有些差异是由移民或其他没有资格投票的成年人造成的…但我只想指出,66%这个数字已经被夸大了,总的来说,不足以成为“破纪录”。

德克萨斯州的民主党人会让我们所有人感到惊讶吗?

好的,回到德克萨斯……我们已经伪确立了(我意识到我们在这里做了很多手势)德克萨斯是一个红色的州。但是请记住,投票是一种有偏差的抽样机制。

是否存在一个有更多民主党人出现在投票站的世界?

我们记得蓝军需要弥补的赤字是 60 万英镑。占德州人口的百分之几?结果只有 3%左右。

好吧,但我们已经确定大多数德州人是共和党人。那么还有多少百分比的民主党人会出现。嗯,从上面玩具模型的数字来看,如果今年有 6.3%的民主党人参加投票,德克萨斯州就会转向蓝色。这将意味着 57%的德克萨斯州民主党人可能会在投票中让 52%的德克萨斯州共和党人(假设他们的人数没有变化)感到惊讶,德克萨斯州会人为地将其选举人团的全部 38 张选举人票给拜登。我们现在甚至不会谈论宾夕法*亚州…

你的投票很重要

好吧,这只是一个玩具例子,但我觉得它说明了一点:选民投票率有很大的增长空间,如果一个群体在另一个群体之前发现了这一点,即使他们不是大多数,他们也可以真正改变政策的制定。

当然,如果有一个人没有去投票,可能只会稍微改变最终计票结果显示的投票比例。但是,如果它以一种不*衡的方式发生,它仍然会使我们的样本产生偏差。

考虑群体思*的概念。漫不经心或听天由命的态度可能会导致你周围的人也有同样的态度,反过来,这种态度会进一步传播给他们的朋友。如果可以假设人们会像他们的朋友或至少是身边的人一样投票,那么你的网络中的一大群人不投票可能会导致选举日的样本有偏差。想象一下,如果类似的事情发生在弗吉*亚州费尔法克斯县的民主党人身上会怎样?由于有偏见的抽样调查,这可能会不自然地将拜登可预测的压倒性胜利变成势均力敌的胜利。德州也是如此(嗯,事实上正好相反)。

避免这种情况的最好方法就是养成投票的习惯。一定要让你的朋友和家人知道这有多重要。

这是你的权利。这是件大事。

如果你喜欢这篇文章

考虑鼓掌(或者 10?)所以 TDS 会更容易与他人分享

看看我关于选举的其他案例研究:

形象

[1]托马斯。https://unsplash.com/photos/lobgrHEL1GU

Tableau 如何帮助我获得数据分析专业的研究生工作

原文:https://towardsdatascience.com/how-tableau-helped-me-get-a-graduate-job-in-data-analytics-76dc448e2ad4?source=collection_archive---------43-----------------------

使用 Tableau 实现更有用、更吸引人的数据可视化

活动发起人Unsplash 上的照片

背景

从大学毕业却找不到工作可能会令人生畏。当你找不到实习机会的时候更是如此。
这是我在 2019 年完成统计学学士学位时发生的事情,从数据分析和数据科学的入门级工作和研究生项目的无数工作申请中没有成功。毕业后继续申请更多的工作并收到更多的拒绝,尤其是在全球疫情期间,可能会让大多数人失去动力,然而每个人都必须具备的一项重要技能是应变能力。

工作面试和评估中心完全数字化,公司减少招聘或推迟研究生课程的日期,工作变得更具竞争力,这些都是在这些时期更难获得研究生工作的部分原因。

我自豪、欣慰和感激地宣布,我终于收到了加入分析和数据科学研究生项目的工作邀请。这是一个超过 1 年的漫长而艰难的旅程,申请研究生角色和项目,最终获得一份工作。

那么,在我没有完成求职申请的时候,我都做了些什么呢?另一个重要的技能是热情,想不断学习。在此期间,我完成了许多与数据科学和分析相关的在线学习计划、认证和竞赛。
一些显著的成绩是 Tableau 桌面、SAS 基础编程、微软 Azure/Power *台和 IBM 数据科学专业证书的认证。通过在线学习和证书获得成就感可以提高你的动力,让自己忙起来。
我强烈建议学生和学习者查看 CourseraDataCampUdemyLinkedIn Learning 来发展数据科学技能,也可以改善你的简历,因为你可以展示你对学习的渴望(大多数大学免费提供 LinkedIn Learning,Udemy 对课程有定期折扣)。对于学生来说,在知名公司进行跨领域的虚拟实习也是很好的选择。

我如何利用 Tableau 获得竞争优势

Tableau 是一个数据可视化工具,用于以仪表板和工作表的形式创建可视化效果。它使用简单的拖放功能进行快速数据分析和更具吸引力的交互式数据可视化。

来源: Tableau

以前,Tableau 提供 90 天免费的电子学习课程,包括 Tableau 桌面高级技能的基础知识。他们还在 6 月 30 日之前提供他们的 Tableau 桌面专家认证半价(50 美元)。
当然,我借此机会完成了他们的网络课程和认证,以 95%的成绩通过。

我的 Tableau 桌面专家考试成绩和徽章

数据分析工作应用程序中的一个常见阶段是“分析和演示任务。虽然这些阶段可能有所不同,但这是一个可以带回家的任务,因此申请人可以准备和创建一个 PowerPoint 演示文稿,以提交给招聘人员。他们给你一个场景和数据,供你分析,并提供见解和建议。

当我不得不从给定的数据中计算新的统计数据时,Excel 非常有用,在这种情况下,您可以使用简单的公式和函数,如 AVERAGE 和 SUM。然而,Excel 可以制作的图形可能非常简单,需要更多的努力才能在视觉上吸引人,这就是我使用 Tableau 的原因。

通过简单地将我的 Excel 电子表格导入 Tableau,我能够轻松地开始创建我的数字,以便在我的演示中使用。Tableau 允许连接到文本、JSON、PDF、Microsoft Access 等文件以及包括 Microsoft SQL Server、Oracle 和 MySQL 在内的服务器。

我创建的主要数据可视化是柱形图和高亮表,它允许你用颜色比较分类数据。下面显示了一个不带标签的突出显示表格示例:

来源:从 Tableau 构建一个高亮显示的表

Tableau 的一个优点是数据可视化是交互式的。我以此为契机,选择我想展示的重要栏目,然后对我的数字进行截图。在 PowerPoint 中叠加我的图像并创建动画后,我能够使演示看起来更具互动性,并专注于关键的见解。当然,你可以用 Excel 通过改变颜色来做同样的事情,但是这需要更多的时间。
类似的过程有两个截图,如下所示。

突出显示带有示例超市数据集的表格截图

在收到我的评估中心的反馈后,我发现在数百个演示中,我是少数几个使用 Tableau 进行数据可视化的人之一,大多数申请人都使用 Excel 和 PowerPoint 的内置数据可视化工具。这给招聘团队留下了深刻的印象,使我脱颖而出。我在评估中心的演示部分获得了高分,迎接我的是一个激动人心的消息:在完成安全检查后,我将获得一个职位。

原来如此!

如果您发现 Excel 中的图形和图表还不够,我强烈建议您查看 Tableau,以创建更具视觉吸引力、更有用和更具交互性的数据可视化。
(注: Tableau Desktop 向学术机构的学生免费提供一年许可证,否则你必须购买,而 Tableau Public 对所有用户免费)

感谢阅读关于我职业旅程的开始!

我很高兴开始并进入数据分析和数据科学的世界。
欢迎在 LinkedIn 上联系我,或者在 Medium 上关注我。随着我即将开始这个新角色,我希望在未来发布更多关于我的数据科学经历!

教师如何利用数据科学分析学生成绩

原文:https://towardsdatascience.com/how-teachers-can-use-data-science-to-analyse-students-scores-26d0b2ec5694?source=collection_archive---------33-----------------------

教师更好地了解学生分数的无代码方式

Unsplash 上的科学高清照片

教师和教育机构处理大量与学生成绩相关的数据。在这个故事中,他们如何使用数据科学和高级分析来深入了解学生成绩数据。

语境

对于本教程,我们假设一个有 26 名学生的英语教师想要

  • 更好地了解学生成绩
  • 看看一个科目的表现是否会影响其他科目
  • 按性别比较分数
  • 按学生比较分数

获取数据

第一步是获取数据。老师在 excel 中收集所有学生的分数。分数分为以下几类:讲故事、写故事、参与、陈述、测验、听力

这是 excel 的样子

关于学生成绩的数据

尽管这是一个 26 人的*班,但你突然会觉得光是看数据就不知所措。现在让我们看看可以从这些数据中获得什么样的见解

最常见标志范围

以下是一些见解,有助于更好地理解学生的分数。

调查显示,大多数演示分数在 78 到 95 之间,而大多数测验分数在 74 到 92 之间。

了解学生分数最常见的范围可以让老师更好更快地理解学生的分数

演示标记的最常见范围

测验分数最常见的范围

相关性——看看一个科目的表现是否会影响其他科目

了解一个主题是否会影响其他主题是非常有用的。这有助于了解应该关注哪个科目来提高学生的成绩。这种见解可以通过关联获得

从数据中可以看出一个相关矩阵。您可以观察到演示分数和参与分数之间存在相关性。这意味着如果学生被要求做更多的陈述,也可以提高他们的参与分数

相关矩阵

展示分数与参与分数的相关性

聚类——根据数据对学生进行分组

根据数据对学生进行分组非常有用,因为这有助于管理和决定特定群体的具体行动。分组也称为集群。以下是基于学生分数的聚类结果

观察集群编号,您会看到

聚类 0——除了一个科目之外总体分数良好的学生

聚类 1 —总体得分较低的学生

聚类 2——总体得分高的学生

使聚集

学生比较

根据各种标准比较学生总是有用的。在这里,您将使用性别进行比较,然后在学生级别进行比较

如你所见,在这个例子中,女生比男生成绩好。此外,你对学生层次的低水*和高水*有一个概念

性别比较

学生明智的比较

额外资源

网站(全球资讯网的主机站)

你可以访问我的网站进行零编码分析。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 频道
的链接

技术如何塑造社会

原文:https://towardsdatascience.com/how-technology-shapes-society-df6204d9d81b?source=collection_archive---------10-----------------------

纳吉·阿诺在 Unsplash 上的照片

以及为什么计算机科学需要人文学科的帮助

大约九个月前,我申请了 GRFP——美国国家科学基金会(NSF)的博士奖学金。

在申请中,我提议研究计算机科学家如何将伦理和价值观编码到机器学习算法中,以及 ML 设计师如何更好地理解他们的设计选择的社会影响。

例如,如果一个 ML 工程师设计一个决策系统更加公*,他们用的是什么定义的公*?他们选择优化哪些评估指标?选择一个标准或定义而不是另一个标准或定义的社会后果是什么?

我提议研究算法嵌入的社会问题的潜在危害,如价值权衡,以及在设计 ML 系统时发生价值冲突时该怎么做。

我的申请被拒绝了。

昨天,我收到了审查我的提案的三位学者的评论。他们所有的反馈都是积极的;除了一句话:

"与其说这是一个 CS 项目,不如说是一个社会研究."—审查者#2

当我读到这个评论时,我立即质疑,如果在人文学科领域而不是计算机科学领域申请这项资助,是否会更好;我很快意识到这象征着计算领域的一个历史性的基本缺陷——假设社会科学和计算机科学是分开的。

当我一遍又一遍地阅读评论者的评论时,我开始思考他们的话的含义。几个问题闪过我的脑海:

  1. 社会科学和计算机科学是什么关系?
  2. 计算机科学应该在社会中扮演什么角色?
  3. 如果我们继续将社会科学和计算机科学分开,会发生什么?

在探索这些问题时,我开始深入研究技术的真正目的是什么。随着技术故事的展开,我对技术在我生活中扮演的角色有了更深的理解,以及我作为计算机科学家在塑造社会中的角色。

1.社会科学和计算机科学是什么关系?

技术已经融入社会。从算法决策到隔离诱导的缩放呼叫,我们比以往任何时候都更多地将技术融入我们的生活。

我们的社会目前通过网络世界运行。关系被波动的带宽拴在一起。社区通过 0 和 1 联系在一起,形成了我们未来的基础和根源。

那么,社会科学和计算机科学是什么关系呢?

“技术不仅是人类活动的辅助工具,也是重塑人类活动及其意义的强大力量。”—兰登·温纳

几十万年来,人类利用科技上升到食物链的顶端。当发现问题时(例如,我们需要我们的食物保存更长时间),技术解决方案就形成了(例如,火!).

当然,随着这些技术工具越来越多地被引入社会,他们开始以意想不到的方式改变和重塑它(例如,火作为农业工具的使用在农业革命中发挥了很大作用)。

现在快进到 21 世纪,我们已经采用了一种新的技术形式,即计算技术,来帮助解决社会问题,包括:

互联网:帮助我们获取更多信息。

智能手机:让我们的生活更加移动。

社交媒体:以一种前所未有的方式连接世界。

随着互联网、智能手机和社交媒体作为问题的解决方案被引入我们的生活,它们永久性地改变了社会话语。

故事是这样的:

社会问题→技术解决方案→大规模社会变革

我们的全球社区目前由计算技术*系在一起。互联网、智能手机和社交媒体只是从根本上改变了文化景观的众多新技术中的一*部分。

社会科学是科学的一个分支,致力于研究人类社会以及这些社会中个人之间的关系。

那么,计算机科学和社会科学是什么关系呢?我很难想象这两个学科没有内在联系的世界。技术被创造出来,作为改变我们周围世界的一种手段,以适应当前社会的需要。随着计算技术继续发展到机器学习和人工智能等领域,社会变革的潜力简直无法想象。

2.计算机科学应该在社会中扮演什么角色?

具有讽刺意味的是,昨天下午我被安排在我的一门研究生课程上做一个 75 分钟的演讲,讲的是计算技术在解决社会问题中应该扮演的角色。我的班级,以人为中心的机器学习,由大多数计算机科学博士生组成。

我促成了一场基于论文计算在社会变革中的作用的讨论。我问研究生们,他们是否认为计算技术有助于修复社会。他们有一些有趣的见解:

一名学生提到,技术本身不对积极的社会变革负责,但人类有责任。他解释说,既然人类有责任创造技术,他们就应该总是怀着促进社会福利的目的来创造技术。

另一名学生质疑科技是否应该在解决社会问题中发挥作用。他表示,虽然他认为技术不应该延续歧视和不公正等社会问题,但它本身并不负责解决这些潜在的问题。

正如引发我们对话的那篇论文中所解释的,我们一致认为计算技术不应该试图解决社会问题。相反,它应该把自己看作整体的一部分。正如计算机科学可以延续社会问题一样,它也可以成为解决方案的一部分。

我们讨论了计算技术,尤其是机器学习系统,如何在设计过程的每一步改变社会。从选择用来训练模型的数据到定义用来衡量成功的指标,ML 设计决策是植根于社会科学的选择。

在阅读我被拒绝的 NSF 提案的评论后不到一天,我决定问问这些新兴的计算机科学专家,他们对社会科学和计算机科学之间的关系有什么看法。

他们一致认为这两者有着内在的联系。

“对社会技术系统的整体分析必须借鉴广泛的学科,以便全面识别利害攸关的问题。”— 计算在社会变革中的作用

3.如果我们继续将社会科学和计算机科学分开,会发生什么?

当我获得软件工程学士学位时,我被要求学习一门计算机伦理课程。这门课叫做职业责任。多亏了这堂课,我第一次开始理解技术在帮助或伤害社会中扮演的角色。

这门必修课改变了我对技术在我生活中的作用的基本理解,也改变了我职业生涯的轨迹。

在我选修这门课之前,我从来没有想过像道德、公*、正义和不*等这样的社会问题会与计算机科学交织在一起。我选了几十门计算机科学课程,但没有一门提到伦理这个词。我花了数百个*时设计算法,却从未质疑它们更广泛的含义。社会科学不是我的计算机科学课程中出现的话题。

尽管我生活在一个越来越受算法决策影响的世界,但多年来我一直被教导计算机科学和社会科学是分开的。当我决定开始攻读机器学习伦理学的博士学位时,我发誓要证明这两个学科并不是分开的,而是紧密相连的,以至于教授其中一个而不教授另一个是危险的。

因此,我的担心是:如果计算机科学和社会科学领域仍然被视为独立的实体,“伦理”将仍然是技术系统中的事后想法,计算机科学课程将继续只包括一门或零门“伦理/职业责任”课程,技术将继续以负面方式塑造社会。

这就是为什么必须认识到,计算机科学家必须接受教育,以社会责任感编写代码,并配备正确的工具来这样做。

考虑到这一点,我向拒绝了我的 NSF 申请的计算机科学家表示感谢。你的话单枪匹马地重新点燃了我的热情,去证明为什么没有人文学科的指导,计算机科学不应该,也不能存在。

你提醒了我为什么我的工作很重要。

你激励我继续做我正在做的事情。

我最初的推特帖子是关于对 GRFP 评论的最初反应

80/20 法则如何帮助决定在数据科学领域开始职业生涯所需的技能

原文:https://towardsdatascience.com/how-the-80-20-rule-can-help-decide-which-skills-you-need-to-start-a-career-in-data-science-fd60766eba05?source=collection_archive---------5-----------------------

使用帕累托原则增强你作为数据科学家的信心

Unsplash 上由 Austin Distel 拍摄的照片

1.学习数据科学的艰巨任务

数据科学是一个令人兴奋的领域,对熟练和有经验的专业人员的需求不断增加。传统的数据科学家拥有计算机科学、数学、工程或物理相关领域的背景。但我们也发现其他专业人士来自广泛的领域,不具备强大的数学背景,如语言学和基因组学,仅举几例。

但不管你的背景如何,当人们对数据科学产生兴趣时,我们都会问的问题是:

“要成为一名数据科学家,我需要具备哪些技能/知识?”。

许多作者都写过这个话题,基本技能的清单通常是铺天盖地的。一般来说,它涵盖以下主题:

  1. 数学(线性代数与微积分)
  2. 统计数据
  3. 编程(Python、R、Julia、Scala 等)
  4. SQL
  5. 数据角力和预处理
  6. 数据可视化
  7. 监督学习
  8. 无监督学习
  9. 深度学习
  10. 大数据*台(Spark 或 Hadoop)
  11. 云计算
  12. 沟通技巧

在滚动列表后,你通常会发现你没有掌握大多数被定义为“必不可少”的技能。你感到沮丧,你的冒名顶替综合症开始发作,你意识到你需要数千*时的学习,仅仅是为了覆盖成为初级数据科学家的基础知识。

嗯,坏消息是:

“你可能需要数千*时的学习和努力,才能掌握成为一名有经验的数据科学家所需的所有技能”。

但是好消息是:

“你可以开始你的职业生涯,专注于学习一些对任何数据科学项目都至关重要的技能”。

为了使用这种实用的方法,我们首先需要了解一个重要的概念,以帮助我们在成为数据科学家的过程中确定我们的优先事项。

2.进入帕累托原理

*尔弗雷多·帕累托是十九世纪的意大利工程师、社会学家、经济学家、政治学家和哲学家,他首先描述了现在被称为 80/20 法则或帕累托法则的东西。

帕累托原理背后的思想是,一些可观察的现象遵循不均匀的分布,80%的结果(或效果)来自 20%的原因。

这一原则在不同的领域都可以观察到,如经济学、流行病、计算、体育、工程等等,有时会取 90%/10%、95%/5%甚至 99%/1%这样的极端值。

这个想法是在 Richards Kock 的伟大著作《80/20 原则:少花钱多办事的秘密》中综合出来的,作者在书中描述了许多使用这个原则的策略,以优化我们的生活,把时间和精力花在真正重要的事情上。

因此,将这个想法带回我们的数据科学学习路径,如果我们可以确定一个遵循帕累托分布的模式,也许我们可以利用它来为我们造福。

3.那么,数据科学家的传统日常工作由什么组成呢?

你可能已经从至少有一点数据科学经验的人那里听说过,你至少有四分之三(有时超过 80%)的时间花在收集、争论和预处理数据上。换句话说,你必须花费大量的时间来组织你的数据集。我知道一些数据科学家可能很幸运地在一个数据被很好地编目和管理的环境中工作,这意味着他们可以花更多的时间在数据可视化和生成模型上,而不是在上述的初始步骤上,但这通常是一个例外。

在大多数公司中,数据存储在不同的数据库中,您通常必须使用 SQL 查询来组合表,或者使用 API 从不同的源获取数据。然后使用 Pandas(或 R)来组织和探索数据。在此阶段,您将处理缺失值、异常值并生成可用于后续分析步骤(数据可视化和模型训练)的数据集。如果您确切地知道数据库和 API 请求的结构,并且如果您的所有数据都是一致的,没有丢失值或异常值,那么这将是一个完美的场景。

事实上,这一过程比你预期的要长得多,因为你要反复多次地收集数据和争论,直到你最终准备好你的数据集。

4.将帕累托原则应用于您的数据科学学习之旅

基于数据科学家 80%的时间都花在数据收集和组织数据集上,我对你开始职业生涯的建议是,不管你的背景如何,都要专注于掌握编程、数据争论和数据提取的技能。

如果你学习 Python、Pandas 和 SQL,你可能至少可以完成一名数据科学家 80%的日常工作。

回到我们最初列出的成为数据科学家所需的技能,在总共 12 项技能中,你首先需要关注其中的 3 项:编程、SQL 和数据争论/预处理。如果考虑到所需的其他技术和软技能,这个列表还可以进一步扩展,80/20 法则也可以用来描述数据科学家的一天。

在开始数据科学学习之路时,你需要关注的三个主要技能是:Python、Pandas 和 SQL。

关于为什么应该选择 Python 而不是 R、Julia 或 Scala 等其他语言,我有一个简单的看法。我提到 Python 的原因是因为它是当今数据科学最流行的语言,也是任何试图学习如何编程的人的第一语言,因为它的学习曲线可能是最容易的之一。

5.逐渐增加你的信心

大多数关于机器学习的入门课程都向你展示了回归和分类(监督学习)或聚类(非监督学习)的可用算法。试图理解和掌握这些方法中的每一种,以及何时使用它们可能会很累,而且没有真正的回报。放心吧!知道存在哪些方法以及每种方法的主要应用是很好的,但是只有当您开始在自己的项目中使用它时,您才能完全理解每种方法。

随着您收集和预处理数据的技能的提高,您可以更加自信地执行以下步骤(可视化和模型选择)。从实践的角度来看,你可能会从一个与你的公司或研究项目相关的特定问题开始工作。随着你深入数据集并定义你的假设,你将有时间研究可以为你提供最佳解决方案的方法和机器学习算法。这是关于为什么你应该首先关注学习收集和组织数据所需的技能的又一个论点。

6.作为一名数据科学家,从更广阔的角度看待你的整体

我想重申的是,这篇文章的目的不是向你推销你只需要上述 3 种技能就可以从事数据科学的想法。

如果你先集中精力学习 Python、Pandas 和 SQL,你可以更快地看到实际效果,甚至执行通常由数据工程师和数据分析师执行的任务。

由于你已经看到了你所学知识的实际效果,你可以继续学习清单上的其他技能。

从经典的“数据科学需求层次”(图 2) 中可以看出,金字塔的底部由数据收集组成,接下来是移动/存储和探索/转换数据。这些技能通常与数据工程师工作相关,显示了该职位在当前数据科学项目中的重要性。

图二。数据科学需求层次( Monica Rogati — Hackernoon )

因此,如果没有扎实的数据处理和辩论相关技能的基础知识,您(和您的团队)可能无法成功地执行数据科学项目。

6.结束语

正如文章标题中提到的,我的主要目标是帮助你决定在开始学习数据科学时需要优先考虑哪些技能。我知道这个话题可能会有争议,因为我们观察到许多成为数据科学家的不同途径。从我个人的经验来看,你肯定有一个漫长的旅程,优化你的学习可以更快地为你提供工作机会。我相信,文章中提到的技能的坚实基础以及相对的自律和奉献精神会比你预期的更快给你带来不可思议的结果。

非常感谢你阅读我的文章!

  • 你可以在我的个人资料页面 找到我的其他文章🔬
  • 如果你喜欢它并且想成为中级会员你可以使用我的 推荐链接 来支持我👍

资源

[## 没有量化学位能成为数据科学家吗?

一个故事和一些见解

towardsdatascience.com](/can-you-become-a-data-scientist-without-a-quantitative-degree-8046e254fa48) [## 数据科学最低要求:开始从事数据科学时你需要知道的 10 项基本技能

入门级数据科学职位所需的 10 个要素

towardsdatascience.com](/data-science-minimum-10-essential-skills-you-need-to-know-to-start-doing-data-science-e5a5a9be5991) [## 成为 3.0 级数据科学家

想成为大三,大四,还是首席数据科学家?了解您需要做些什么来驾驭数据科学…

towardsdatascience.com](/becoming-a-level-3-0-data-scientist-52641ff73cb3) [## 成为一名成功的数据科学家需要知道什么?

备注:这是我非常主观的观点,是作为一名成功的数据科学家你需要知道的。所有…

tech.olx.com](https://tech.olx.com/what-do-you-need-to-know-to-be-a-successful-data-scientist-78823200899c) [## 使用帕累托原则来简化你的生活

并非所有的任务都是*等的。

medium.com](https://medium.com/swlh/use-the-pareto-principle-to-simplify-your-life-b9da4c49f3e9) [## 数据科学家的一天

您对数据科学家一天的工作感兴趣吗?每个数据科学角色可能不同,但是…

www.kdnuggets.com](https://www.kdnuggets.com/2017/11/day-life-data-scientist.html) [## 人工智能的需求层次

正如快速发展的技术通常的情况一样,人工智能激发了大规模的 FOMO,FUD 和世仇。有些是…

hackernoon.com](https://hackernoon.com/the-ai-hierarchy-of-needs-18f111fcc007)

贝尔曼方程在深度 RL 中是如何工作的?

原文:https://towardsdatascience.com/how-the-bellman-equation-works-in-deep-reinforcement-learning-5301fe41b25a?source=collection_archive---------11-----------------------

贝尔曼方程和神经网络之间的联系,有公式、例子和 Python 代码

资料来源:123rf.com

贝尔曼方程中,价值函数φ(t)取决于价值函数φ(t+1)。尽管如此,在状态达到时间 t +1 之前,还是可以得到φ(t)的值。我们可以通过神经网络T21、来实现,因为它们可以在任何时间*似函数φ(t)T33t。我们将看到它在 Python 中的外观。在最后两节中,我们介绍了深度 Q 学习算法的实现以及使用 PyTorch 软件包进行张量计算的一些细节。

状态、动作和政策图

状态空间和行动空间

马尔可夫决策过程 ( MDP )为深层强化学习 ( RL深层 RL )提供了数学框架。对于现实问题,我们在 MDP 中定义了以下参数:{ S T63【a64】、T68R、、、T75PT93T97是动作空间* RT105是设定奖励PT111 是设定概率T115

而在计算机视觉中,代理从大量的图像中学习,在深层 RL 中的代理从大量的发作中学习,其中对于任何状态代理探究几个动作并从 MDP 环境接收不同的回复(奖励)。

如果每个状态只有一个动作,并且所有奖励都相同,那么 MDP 就是简化为马尔可夫链。对于大量的 MDP 环境,参见 OpenAI/gym 的环境表

翻筋斗 或倒立摆

MDP 环境的一个例子是cart pole(a . k . a .an倒立摆 ),一个重心在支点上方的钟摆。不稳定,但是可以通过移动重心下的支点来控制。对于环境 CartPole-v0 ,状态和动作如下:

钢管混凝土柱的状态空间和动作空间

对于这种环境,状态空间的*度=4,类型为 Box(4)。动作空间的*度=2,类型为离散(2)。

健身房的类型空间:

  • **gym.spaces.Discrete(n)**:从 0 到 n-1 的离散值。
  • **gym.spaces.Box**:数值的多*向量,每一*的上下界由**Box.low****Box.high**定义。

政策地图𝜋,确定性 随机政策

策略图 𝜋 定义为𝜋(a | s)=pr{at = a|ST = s}意思是策略 𝜋 是在状态下执行的动作的概率**

举例**。考虑配备手臂来抓取罐子的回收机器人。状态空间 S =[ ],其中“”和“”是机器人充电的状态,动作空间 A = [ 搜索、充电、等待。我们考虑两种政策类型:确定性随机性。**

确定性和随机性策略的示例

状态值函数和贝尔曼方程

返回值

假设状态空间是离散的,这意味着代理以离散的时间步长与其环境进行交互。在每次时,代理接收到一个状态 状态 包括奖励rt .累积奖励命名为返回 我们将其表示为 Gt 【T6未来累计折现奖励计算如下:******

未来累计折扣奖励

这里, γ贴现因子,0<γ<1。这样,returnat time就可以用return at time+1,**

返回值的递归关系

这是返回值 Gt 的递归关系。

状态值函数和贝尔曼方程

策略 𝜋 的状态值函数定义如下:

状态值函数

在这里, 𝜋的预期Gt ,和*𝔼𝜋**命名为预期收益。通过(1)和(2)我们推导出等式。(3).这就是 贝尔曼方程 ***

贝尔曼方程

这样,状态值【v _s*)为状态在时间t可以使用当前奖励r _ { t+1}找到*****

行动价值函数与最优策略

动作值功能

现在,我们将定义与策略 𝜋 : 相关联的动作值函数

动作值功能

我们可以介绍两种政策的比较如下:

两种政策的比较

在这种情况下,我们说政策**𝜋比政策**𝜋.******

最佳状态值函数

没有必要让任何两个政策具有可比性,但是,总有一个政策优于所有其他政策。这样的政策被说成是最优政策,它由 **𝜋.表示一个最优策略肯定存在,但可能不是唯一的。*****

代理的目标是找到最优策略。寻找最优策略是 Deep RL 的主要目标。

不同的最优策略具有相同的价值函数,我们用 v表示。 事实上,我们有 v = v( 𝜋).函数v it据说是最优状态值函数。最佳状态值函数可定义如下:**

最优状态值函数

最佳动作值函数

对于任何确定性策略**【𝜋】a都是由当前状态s唯一确定的,即a=𝜋(s。然后,对于(4)中的确定性策略 𝜋 ,动作可以被丢弃,即,我们得到等式。(2).换句话说,对于确定性策略 𝜋,我们在状态值函数和动作值函数之间有如下关系:******

确定性策略的状态值函数和动作值函数之间的关系****

对于随机政策来说,情况并非如此

类似于最佳动作值函数v **(s),参见(5),我们将最佳动作值函数 q ( s, ) 定义如下:******

最佳行动价值函数

假设,我们有一个最优动作值函数 q ( s,a )。那么最优策略可以确定如下:*

最优策略

这里, A(s) 是状态 s 可能的动作集合。

对于确定性策略 𝜋,我们通过关系a=𝜋(s)找到当前状态的新动作。对于随机策略 𝜋,我们可以通过关系式 a = 𝜋(s 找到新的行动),其中𝜋是最优策略,见(7)。****

下面是一个代理应该做的事情:首先找到最优行动值函数,然后使用公式(7)找到最优策略。最后一种说法是正确的,但有一些限制。例外是可能的,例如,由于ε-贪婪机制

Q-table 和 时态差异学习

Q-table

一个 Q 表是形状【状态,动作】的矩阵。我们将这个矩阵的所有槽初始化为零。合适的 Python 代码如下:

******import numpy as np
Q = np.zeros((state_size, action_size))******

我们会在每一步或每一个动作之后,在 Q ( sa ) 中对每一对( sa )进行更新。

时间差

Q-tableT5是如何单步更新的?更新 Q-table 最常用的方法是时间差学习TD-学习。我们在每集结束前都会添加更新。**********

TD-learning

回归 Gt 情商。(8)一种叫做的替代估计**参见(1)。该值又名TD-目标。(8)中的值 Q (s_ t,a_t ) 称为电流估计值*。使用(1),我们可以重写等式。(8)如下:*****

TD-learning:备选方案和当前估计值

算法 Sarsa

Sarsa 是的缩写状态-行动-奖励-状态-行动 的序列。该序列的这五个元素如下:**

Sarsa 序列

代理处于当前状态 s_t ,然后代理选择动作 a_t ,获得奖励 r_t ,之后代理进入对所有剧集执行该循环,直到值 num_episodes ,参见下面的算法 Sarsa 的伪代码。在每一步中, Q- 值**Q(s,a ) 由(9)更新,参见 Sarsa 伪代码中的黄线。****

Sarsa 算法

学习率α**

学习率 α 决定了算法 Sarsa 的行为。太大的值 α 将使我们的算法远离收敛到最优策略。如果 α= 1 那么 Q(s_t,a_t) ← Gt,Q-值总是将是最*的返回,没有任何学习。值 α 太*导致学习太慢。如果 α= 0 那么 Q (s_ t,a_t ) ← Q (s_ t,a_t ),永不更新。**

算法Q-学习

Q-学习

***算法 Q-learning (又名 Sarsamax )在 eq 上与 Sarsa 不同。(9)如下:代替 Q(s,a)t 的值,我们使用 Q(s,a) 的最大值,其中贯穿了此刻*****的所有可能动作 **********

**********

算法Q-学习

贪婪的行动

在任何时间步 t ,对于状态 s_t ,至少存在一个动作,其估计值 Q ( s_t,a )为最大值。这个动作 一个 叫做贪婪动作。相关联的政策 **𝜋( s ) 叫做贪政策,参见 eq。(7).当我们选择一个贪婪的行为时,我们正在利用我们当前对这些行为的知识。相反,如果我们选择了非贪婪动作中的一个,那么我们就是探索,因为这能够提高我们对非贪婪动作的价值的估计。***

Sarsa vs. Q-learning

一个偏离策略 智能体独立于智能体的动作学习最优策略。一个策略上的代理学习该代理正在执行的策略。 Q-learninganoff-policy算法因为最优策略是通过贪婪动作学习a _ gr中的公式求最大值见(10) 然而,下一个动作Sarsa*是一个 on-policy 算法,因为在(9)中,代理学习最优策略并使用相同的策略表现 Q(s_t,a_t)。*********

Q-learning 可能每一集的表现都比 Sarsa 差,然而 Q-learning 学习最优策略。

Python 中的神经网络

问题

我怎么算?

答案:通过一个神经网络。我们将看到它在 Python 中的样子。**

函数逼*

神经网络受到如此多关注的原因是因为它们可以逼*任何连续数学函数的输出。这是可能的,因为 Kolmogorov 定理指出多元函数可以通过一元函数的和与合成的组合来表达。

我们的Q-值函数,两个向量参数的函数 Q(s,a) 可以表示成我们想要的某个人工神经网络( nn )一样精确。**

深度学习技术,即用神经网络实现 Q 学习算法,称为深度 Q-网络DQN ****

项目DQN**

Python 包 PyTorch 是由脸书人工智能研究实验室开发的开源深度学习库。我们提供了几个使用 PyTorch 实现的 DQN 片段。这段代码摘自我在' Banana '环境中训练一个代理的实现。代理人被训练在某个方形世界中导航和收集香蕉。然而,这段代码相当通用,可以用于许多具有离散状态空间的环境。

片段

我们给出几个片段,帮助理解如何使用神经网络,我们可以优雅地实现 DQN 算法。

**Function Agent.__init__**:两个神经网络(**q_local******q_target**)由模型**Qnetwork.** 构成,每个模型**Qnetwork**包含两个隐层。******

**Method** **Agent.learn()**:

**Q_expected****Q_targets** 之间的差异应使用 PyTorch 方法最*化,参见方法**learn()**

**In class ReplayBuffer:** ***s_t***(**state**)***s_*{*t+1*}**(**next_state**)的值由函数**sample()** 采样,数据由函数**add()** 存储。****

**In method dqn():**按剧集和时间步长双循环;这里,生成值'状态'、'下一个状态'、'动作'、'奖励'和'完成'。****

py torch 相关提示

下面是一些与 PyTorch 方法相关的*技巧,见下图“三张量”。

分离()

方法**detach()**表示对于**Q_targets_next.** 不会执行张量**loss**梯度的反向传播,这是可能的,因为张量**loss** 仅依赖于**Q_targets****Q_expected,**见方法**learn()**

最大值(1)

这里每个网络的形状是[64,4]其中 64 是批中的状态数(**BATCH_SIZE** =64),4 是可能的动作数(**move forward, move backward, turn left, turn right**)。表达式**max(1)**表示获得 64 个状态中每个状态的最大值。最大值是通过运行所有 4 个动作获得的。回想一下 Q-Learning 在所有动作中寻找最大值,见(10)。下图中,我们给出了一个 64×4 张量**self.q_target(next_states).detach()**的数值例子。

与神经网络相关的张量

三个张量

max (1)[0]

事实是**max(1)**返回两个张量的列表:**max(1)[0],** 包含最大值的张量;**max(1)[1],**包含找到最大值的值“列号”的张量。我们只需要**max(1)[0]**,见上图。

unsqueeze①

现在,我们希望将形状为[64]的行向量放在形式为[64,1]的列中。这是使用**unsqueeze(1)**方法完成的,见上图中的张量**Q_targets_next**

Q_targets

我们如何计算 **Q_targets** 对于批量中的任何一个'状态 ' ,如果一集结束,则'完成为 1,否则'完成0。然后**Q_targets**的线由等式计算。(10)当且仅当相关联的情节没有结束时。****

聚(1,行动)

该方法沿 dim = 1 指定的轴收集值。请注意,dim=0 表示行,dim=1 表示列。**self.q_local(states)**中的每一行都由与四个动作相关的四个 Q 值组成。因此,对于每一行,沿着列,方法**gather** 取与张量**actions**中的动作号相关联的Q-值,见下图。**

结论

结合贝尔曼方程,神经网络,柯尔莫哥洛夫定理,我们得到了一个惊人的技术,深度 RL。这项技术提供了新的方法和新的算法,可以解决以前无法解决的问题。

贝尔曼方程和 Deep RL 实际上允许哪些「不可解的问题」?让我们以 AlphaZero 项目为例,这是一个精通国际象棋、日本象棋和围棋的计算机程序。AlphaZero 在 24 *时的训练中击败了世界冠军程序 Stockfish,达到了超人的下棋水*。

我们研究了深度 RL 的一个特例,即深度 Q 学习算法。在最后两节中,我们介绍了这种算法的实现和使用 PyTorch 软件包进行张量计算的一些细节。

参考文献

[1] M. Tavora,神经网络的逼*能力(带 Python 代码) (2019),走向数据科学

[2] X .郑,强化学习简介 (2019),领英

[3] H. van Hasselt,A. Guez,D. Silver,双 Q 学习的深度强化学习 (2015),arXiv:1509.06461

[4] A .辛格,强化学习:贝尔曼方程与最优性(第二部分) (2019),走向数据科学

[5] J. Hui, RL — DQN 深 Q 网 (2018),中

[6] D. Silver,T. Hubert,J. Schrittwieser,D. Hassabis, AlphaZero:为国际象棋、松木棋和围棋带来新的启示 (2018),DeepMind

如何管理共享代码库

原文:https://towardsdatascience.com/how-the-best-development-teams-manage-shared-codebases-2613b5b87185?source=collection_archive---------27-----------------------

图片由安妮·斯普拉特Unsplash

软件工程

避免团队开发时面临的常见问题

恭喜!你终于想出了完美的新应用创意。你和你的软件工程师团队匆忙编写代码,这将是你名利双收的门票。但是等等。Maria 为这个应用程序的主页编写的代码看起来很棒——但是它如何与 Steven 为访问数据库编写的代码一起工作呢?Hector 设计了一个函数来计算我们正在寻找的值——但是这些值如何在应用程序中从一个页面移动到另一个页面呢?让团队的代码协同工作本身就成了一个项目!

在本文中,我将向您展示我们如何使用 GitGitHub 来管理将在多个开发人员之间共享的代码库。版本控制Git 这样的工具被软件工程师、数据科学家和游戏开发者使用——仅举几个例子。

先决条件:安装 Git有一个 GitHub 帐号知道如何创建一个库

注意:Salesforce 已经决定移除他们的 Heroku 免费等级。自 2022 年 11 月起,该数据库的部署将不再免费。

1.创建存储库和添加协作者

一旦你登录到 GitHub 上,继续创建一个库。我的就叫“ 如何 _ 管理 _ 共享 _ 代码库 _ 文章 ”。确保使用 README.md 文件创建存储库,以便在进入第二步之前进行根提交。在您新创建的 GitHub 资源库中,点击设置。然后从左侧菜单中选择合作者

你可以通过他们的 GitHub 用户名或者他们的电子邮件地址来添加你的团队成员。然后,他们将通过电子邮件收到加入您项目的邀请。

一旦他们接受,您将能够通过选择以下选项,在协作者页面上编辑他们的权限:

现在您和您的团队可以克隆您的存储库并开始开发了!如果你给你的团队成员“”权限,他们就可以开始投稿了。

2.Git 分支

Git 中的分支的行为类似于我们用来组织工作片段的项目的副本。如果我们的项目中有三个任务要完成,我们可以为每个任务创建一个分支,然后在完成每个单独的任务后将每个分支合并到主分支中。

在我们新克隆的存储库中,尝试运行以下命令:

**git branch**

(1)运行“git branch”命令来查看我们所有的分支

git branch 命令列出了我们存储库中的分支。目前,我们只有默认的分支,它是在我们创建存储库时自动创建的。我们可以使用 git branch 命令创建一个新的分支,并添加一个分支名,如下所示:

**git branch first_branch**

(1)创建一个分支,(2)使用“git branch”命令查看我们所有的分支

我们现在有了项目的两个不同的副本。主分支旁边有一个星号——这意味着这是我们当前正在使用的项目分支。为了在项目的分支之间切换,我们使用了 git checkout 命令:

**git checkout first_branch**

现在,如果我们运行 git branch 命令,我们会看到星星已经从 main 移动到 first_branch :

(1)切换到我们的新分支,(2)检查我们是否在分支上

在我们的新分支上,让我们添加一些变化。我们将创建一个名为 app.sh 的 shell 脚本,其中包含:

**echo “Hello world”**

(1)创建“Hello world”shell 脚本,(2)查看脚本内容,(3)运行脚本

然后我们将添加文件并提交它。之后,我们可以运行 git log 来查看我们的新提交:

(1)使用 git add 选择要提交的 shell 脚本,(2)使用消息提交 shell 脚本,(3)使用“git log”查看新的提交

注意:请参见第二行,我在 Windows 上使用。/app.sh "。在 Mac 或 Linux 上,您可以使用“sh app.sh”来运行该文件。

现在让我们使用 git checkout 返回到我们的分支,然后使用 git log 查看我们在主分支上的提交:

(1)使用 git checkout main 返回到主分支,(2)然后使用 git log 查看我们的 shell 脚本没有在这个分支上提交它,文件本身也没有

如您所见,我们在 first_branch 分支上创建的提交不在这里。让我们假设我们在 first_branch 上所做的工作已经完成,现在我们想把我们的变更转移到 main 分支上。为此,我们将不得不切换回我们的 first_branch ,并将我们的分支推到 GitHub。

在我们的 first_branch 上运行 git push 将会失败——但是它将提供我们可以用来设置我们的上游的命令。因为我们在本地存储库上创建了我们的分支,并且我们直到现在才推送这个分支——我们的新分支不知道推送至何处。我们将上游设置为原点,方法是在我们尝试推送时运行错误消息中给出的命令:“git push-set-upstream origin first _ branch”。

(1)切换回具有我们的新 shell 脚本的 first_branch,(2)尝试推送并得到一个错误,它不知道将该错误推送到哪里,(3)从错误消息中复制 set-upstream 命令并使用它来推送我们的新代码

3.拉取请求

我们回 GitHub 看看我们新推的分支吧。我们可以使用下图左下方的“分支:主”下拉菜单来更改我们正在查看的分支。由于我们刚刚推送了我们的分支,GitHub 给了我们一条消息,询问我们是否愿意为我们的新分支创建一个拉取请求。我们将单击绿色的“比较&拉动请求按钮。

查看 GitHub 上的“比较和拉取请求”按钮,查看我们推送的新 first_branch

现在你可以看到 first_branch 将合并为 main 表示为:base:main←compare:first _ branch。旁边有一个绿色的“能够合并”信息,告诉你这些分支可以自动合并。点击创建拉动请求按钮创建拉动请求。

表单为我们的新 first_branch 创建拉请求,以合并到主分支中

下一页——如下图所示——是新打开的拉请求页面。点击文件修改工具栏选项,可以查看 first_branch 上的修改内容。由于我们所做的更改没有导致任何冲突,我们可以单击“合并拉取请求”按钮,Git 会自动将我们的代码合并到分支中。

查看我们创建的拉动式请求

使用拉请求将代码合并到分支需要这个漫长的过程,因为我们希望确保被破坏的代码永远不会出现在分支上。

4.使用 Git Pull 更新本地主分支

自从我们将 first_branch 合并到 GitHub 上的 main 分支后,我们的 main 分支现在用来自我们 first_branch 的代码更新。然而,我们本地机器上的存储库不知道我们的主分支的更新。为了将本地机器上的分支与分支在线同步,我们将“git check out main”切换回我们的分支,然后使用“git pull”命令获取更新的更改:

(1)在合并拉请求之后,从 first_branch 切换回 main,(2)然后在 main 分支上运行“git pull”来拉下合并的变更

在消息中你可以看到有一个文件发生了变化,这是我们合并到first_branch 中新添加的 app.sh 文件。

4.当自动合并不可能时

这次合并很容易,因为我们没有任何冲突。如果两个开发人员对分支做出了冲突的变更,我们将如何解决冲突?

在下图中,你会看到我首先创建了两个主分支:第二个分支 & 第三个分支。然后,我切换到第二分支,并将消息从“ Hello world ”更改为“ Hello world from second branch!”。现在我已经做了这个更改,我" git add。"选择所有要提交的更改,然后我"git commit-m ' update app . sh '"在 second_branch 上创建提交。然后我尝试" git push "知道它会失败,因为我没有设置上游-但是它会给我设置上游的命令,并第一次将我的 second_branch 推送到 GitHub:

(1)创建 second_branch,(2)创建 third_branch,(3)切换到 second_branch,(4)用 vi 编辑 app.sh,(5) git add 选择我更改的要提交的文件,(6)提交 app.sh 文件更改,(7)明知会失败仍尝试推送,(8)复制命令以设置上游并推送 second_branch

项目的当前状态是分支仍然有 app.sh 和消息“ Hello world ”,而次 _ 分支有来自次分支的更新消息“ Hello world!”。我们已经推出了第二个分支。如果我们愿意,我们可以立即将 second_branch 合并到 main 中,而不会像第一次那样发生冲突。然而,我们想要模拟一个冲突的变化。回到我们的终端或 git bash,让我们切换到 third_branch 并添加另一个更改:

(1)切换到 third_branch,(2)使用 vi 编辑 app.sh,(3)运行 shell 脚本以查看更改,(4) git 添加要提交的文件,(5)将文件提交到 third_branch,(6)明知推送会失败仍尝试推送,(7)从错误消息中获取设置上游的命令,并将我们的新 third_branch 推送到 GitHub

在上面的图片中,你会看到我切换到 third_banch 并更改了消息“ Hello World!【到】你好来自第三分局!"在 vi 编辑器中。信息是"你好,世界!“因为我们创建了第三 _ 分支作为分支的副本——它不知道我们对第二 _ 分支所做的更改。在设置我们的上游并将我们的第三 _ 分支推送到 GitHub 之后,我们的 GitHub 页面将会为我们的两个更新分支中的每一个分支提供一个“比较&拉取请求”提示,如下所示:

看到两个分支都成功推送到 GitHub

先合并 second_branch 吧。我们点击相应的“比较&拉动请求按钮,然后我们看到绿色的“能够合并。"间 & 次 _ 分支下一页:

注意 second_branch 能够自动合并

我们点击绿色的“打开拉式请求 t”按钮,然后点击“合并拉式请求”按钮,并且第二 _ 分支自动合并到中,因为没有冲突的变更。之后,我们的分支 app.sh 会有“回音‘来自二分支的你好世界!’”。

现在,让我们单击 GitHub 页面上看到的 third_branch 提示符的绿色“Compare&pull request”按钮。现在代替绿色的能够合并。“我们习以为常的消息—我们会看到红色的“无法自动合并”消息:

无法自动合并,因为我们对 third_branch 所做的更改与我们对已经合并的 second_branch 所做的更改相冲突

如果 GitHub 不能自动合并我们的分支,我们就不应该创建 pull 请求。相反,我们应该在本地存储库中解决 third_branch 中的合并冲突,然后将我们的更改推送到 GitHub。这意味着——我们应该用来自分支的最新变化更新我们的第三分支,然后将结果第三分支推送到 GitHub。这个更新的 third_branch 将能够自动与 main 合并。

(1)将主分支的最新更改拉入 third_branch,这样我们可以解决冲突,(2)运行“git status”来查看哪些文件是冲突的

上面你会看到我从第三个分支开始。从那里我运行"git pull origin main"——这意味着在线访问 GitHub 存储库,并将 main 分支上的更改拉入当前分支。如果你看看我的 git bash 中括号内的绿色消息——它从“ (third_branch) ”变成了“(third _ branch *+| MERGING)”,因为我们现在正在本地将 main 合并到 third_branch 中,而不是在 GitHub 上。运行“ git status ”将向我们显示合并中的冲突文件,但在这种情况下,唯一的冲突文件是 app.sh 。让我们看看 app.sh 内部的冲突是什么:

(1)使用“cat”命令查看冲突文件 app.sh 的内容

正如您在上面看到的,git 自动将所有冲突的更改放到我们的文件中。<<<<<<< HEAD” and “||||||| fd0f83b” you can see the changes from 第三 _ 分支之间。在“|||||| fd0f83b”和“=”之间可以看到 third_branch 最初从 main 分支时的原始状态。最后,在“=”和“>>>>>>>6126…”之间,可以看到分支的当前状态。

Git 不知道哪个更改是正确的,这就是为什么它不能自动为我们合并代码。Git 向我们展示了所有的变更,因此我们可以自己决定保留哪些变更。因此,我将删除除了来自第三 _ 分支的最新更改之外的所有内容:

(1)使用 vi 来编辑文件以删除除了 third_branch 内容之外的所有内容,(2)使用“cat”来查看更新的文件

现在我们已经解决了合并冲突,我们可以 git 添加git 提交,以及 git 推送我们手动合并的代码:

(1)使用 git add 选择要提交的更新文件,(2)使用描述变更的消息提交更新文件,(3)将对 third_branch 的变更推送到 GitHub

third_branch 推至 GitHub,会提示我们点击“比较&拉取请求按钮:

看到在 GitHub 上为我们更新的 third_branch 创建一个拉请求的消息

在打开第三分支之间的新拉动请求后,我们看到绿色的“能够合并”消息,因为我们的冲突现已解决:

我们现在能够自动合并,因为我们解决了我们的冲突变更

我们可以点击创建拉式请求按钮。在“拉取请求”页面上,我们可以单击“合并拉取请求”,我们的更改将自动合并到 main 中。现在我们已经合并了我们的 pull 请求,我们可以返回到我们的 terminal/git bash,并将本地存储库的主分支与在线存储库同步:

(1)切换主分支,(2)使用“git pull”来更新我们的本地 git 存储库,我们将这些更改合并到 GitHub 上的主分支中

5.其他需要了解的有用信息

完成前四个步骤后,我们可以返回 GitHub,点击工具栏选项中的提交,我们会看到:

查看主分支上的所有提交,并查看我们创建的合并提交

在这里我们可以看到分支上的所有提交,并且我们可以切换到其他分支来查看它们的提交。当学习使用 Git 和 GitHub 进行协作时——理解项目的历史如何随时间演变是很重要的。我鼓励你查看每个“合并拉取请求”提交,看看合并拉取请求如何改变项目的历史。

GitHub 上另一个有用的页面是分支页面,你可以从你的 GitHub 库主页点击工具栏选项分支进入。在这里,我们可以看到我们推送到 GitHub 的所有分支——您会注意到,所有分支都已经被合并了。通常在我们合并一个分支后,我们可以通过点击下面的红色垃圾桶图标来删除这个分支。

查看 GitHub 上的所有分支

感谢阅读!我很乐意听到你的反馈或回答你的任何问题,所以请在下面评论,我会尽力帮助你。

首席数据官角色如何成为新的大数据要务

原文:https://towardsdatascience.com/how-the-chief-data-officer-role-becomes-a-new-big-data-imperative-5a5e6ca9dea?source=collection_archive---------48-----------------------

了解首席数据官如何在美国金融、政府和其他部门的组织中扮演越来越重要的角色。

Unsplash猎人赛跑的照片

忽视数据开展业务就像在黑暗中磕磕绊绊,希望一切都会顺利,而不是做出基于事实的决定。与此同时,大数据正在对业务职能产生影响,并在改善客户体验、营销和供应链管理方面找到出路。

首席数据官:定义

首席数据官是负责通过不同的数据处理、分析、挖掘和交换技术将数据作为资产进行获取和管理的公司高管。

CDO 负责与数据相关的一切。数据的质量、安全性、可靠性、透明度和可信度都是 CDO 的领域。CDO 负责管理数据,并通过内部团队或使用像it transition这样的公司提供的外部解决方案来获得可行的见解。

围绕物联网和人工智能的最新发展也属于 CDO 的管辖范围。合规性在这里也发挥了重要作用,GDPR 已于 2018 年生效,那些围绕客户数据开展业务的人越来越担心。

CDO 在组织结构中的位置

CDO 应与首席执行官或首席战略官(如果适用)保持沟通并直接向其报告。重要的是,CDO 不仅在形式上,而且在权力和投票权方面,都与其他高管处于同一水*。在组织内拥有切实的决策权是 CDO 成功的先决条件。

有时,这种企业*等必须得到执行,因为一些高管可能会反对这一新任命职位带来的变化,并以敌意对待数据计划。“我们的方法已经运行了多年,为什么现在要改变呢?”他们可能在想。但是,由于每个 CDO 的目标都是他们组织的繁荣,他们必须准备好做出不受欢迎的决定,同时还要清楚地将这些决定传达给他们不接受的观众。

CDO 无法独立运作,尽管在这一领域的最初发展中,CDO 常常是他们自己的单人团队。然而这是错误的:CDO 需要一个团队,因为他们面临的目标雄心勃勃且复杂。

说了这么多,让我们来看看公司的情况,看看首席数据官的角色今天是否得到了更多的认可。

首席债务官的任命

根据 Governing.com 的数据,截至 2020 年 1 月,美国超过一半的州已经任命了 CDO。在还没有 CDO 的 22 个州中,有 7 个已经在探索这种可能性。例外的是,阿拉巴马州在 2019 年 9 月取消了这一职位。

Gartner 预测,到 2021 年,CDO 办公室将被 75%的大型企业视为任务关键型办公室,相当于财务和人力资源部门。此外,该职位将是与技术相关的 C 级职位中性别最多样化的职位。

这种认识到 CDO 角色的生动趋势来自于建立数据驱动的文化以适应人工智能、物联网和区块链引起的大数据中断的新业务要求。

哪里最需要 CDO

所有重视大数据、以客户为导向的组织都可能觉得有必要雇佣一名 CDO。这些包括金融服务公司(如银行、保险和资本市场)和政府组织(国内和国际)。

信息技术公司正在迎头赶上,其他行业,如制造业和医疗保健业,引入首席数据官的角色只是时间问题。

金融领域的 CDO

在金融领域,由于业务风险的增加和激烈的市场竞争,CDO 面临着复杂的挑战。他们最重要的目标是将他们的公司重塑为将数据视为战略资产的企业。

大型金融机构通常都是跨国公司,但都由地方政府管理。这导致不一致的数据管理实践。因此,首席发展干事应努力集中数据相关工作,并在组织分支机构和办公室之间建立缺失的桥梁。

CDO 要解决的另一个问题是组织数据缺乏同质性。通常,IT 和运营部门在不同的信息环境中工作,并且没有统一的数据管理语义。因此,CDO 的首要任务是创建一个单一的数据管理术语表,并推动其在全公司范围内的采用。

政府中的 CDO

2010 年代初,芝加哥和纽约成为首批任命首席数据官的美国城市,更多城市紧随其后,在 2016 年形成了 CDO 同行群体的公民分析网络。现在,数据驱动政府的概念正在各州获得关注。

随着《联邦数据战略 2020 行动计划》的发布,今年有望为政府组织的 CDO 提供大量机会。

目前,各州 CDO 议程上最紧迫的问题是智慧城市转型。这样的计划正在涌现,以有效地利用数据管理技术来解决公众的现实生活需求,提高安全性,并消除资源利用中的低效率。

除了州 CDO 的这些首要职责之外,在联邦部门工作的数据主管还应该关注安全性。人们经常批评政府在确保数据安全的努力中过于激进,让许多制造商为违反安全协议的产品负责,因此解决立法问题并达成共识可能是所有相关实体都非常欢迎的活动。

欢迎首席债务官来到最高管理层

2020 年,任命一名首席数据官不再具有革命性或令人惊讶。向以大数据为中心的运营的重大转变需要 C 级数据治理和宣传,从而提高 CDO 的认知度。

受到严格监管的行业已经雇佣了 CDO 来应对大数据时代的需求。很明显,这些变化不会局限于政府和金融服务等特定领域,而是会扩展到其他行业。可以肯定地说,任何想要成为行业领导者的组织都需要考虑尽快雇佣一个有能力的 CDO。

父亲的身高如何影响儿子的身高

原文:https://towardsdatascience.com/how-the-fathers-height-influences-the-son-s-height-62ea0339638d?source=collection_archive---------8-----------------------

照片由 Unsplash 上的 vivek kumar 拍摄

假设男性的*均身高是 67.7 英寸(172 厘米)。如果一个男人有 72 英寸(183 厘米)高,他成年的儿子会有多高?

你的第一反应可能是:“哦,这很简单。儿子会和他爸爸一样高。”

虽然 72 英寸(183 厘米)是儿子身高的一个可能的猜测,但从统计学的角度来看,可能性不大。

相关性、回归和标准差

相反,我们应该收集父亲身高为 72 英寸(183 厘米)的儿子的*均身高数据。

然后,我们将对身高 58 英寸(147 厘米)、59 英寸(150 厘米)、60 英寸(152 厘米)、61 英寸(155 厘米)的父亲重复上述步骤,直到 78 英寸(198 厘米)。

接下来,我们可以绘制父亲身高(x 轴)和儿子身高(y 轴)的*均值图。标绘的点“x”表示父亲具有特定身高的儿子的*均身高。

回归线是方程 y=a+bx 的最佳拟合线。由于回归线是一条斜率为 b 的直线,所以斜率 b 就是回归系数。相关系数为 0.5

现在我们可以看到,父亲的身高和儿子的身高是正相关的,但仅仅是通过 0.5 的相关系数。请注意,标准差(SD)线的斜率没有回归线的斜率陡。父亲的身高每增加 1 SD,儿子的身高仅增加 0.5 SD。

皮尔森父子数据(通过芝加哥大学)

如果你是一个中等身高的男人,你可以期待你的儿子比你高几英寸(厘米)。

这是因为回归线和 SD 线都在*均高度处重合。例如,*均身高为 67.7 英寸(172 厘米)的父亲将会有一个 68.7 英寸(175 厘米)高的儿子。

然而,如果你比*均水*高得多或矮得多,预测显然会更棘手。

一个 78 英寸(198 厘米)高的男人会有一个 74 英寸(188 厘米)高的儿子。对于一个非常高的人来说,他的儿子会比他矮大约 4 英寸(10 厘米)。他的儿子仍然会比一般人高。

一个 58 英寸(147 厘米)高的男人会有一个 63.5 英寸(161 厘米)高的儿子。对于一个非常矮的人来说,他的儿子将比他高 5.5 英寸(14 厘米)。他的儿子仍然会比*均水*矮。

对于特别高或特别矮的父亲来说,他们的儿子会比*均水*高或矮,但不会比他们的父亲高那么多。

回到我们的问题

对于一个父亲身高 72 英寸(183 厘米)的人,我们应该通过在人口统计学中对父子身高和父亲身高 72 英寸(183 厘米)的儿子*均身高的回归相关性进行折衷来预测成年儿子的身高。我们对成年儿子身高的最佳猜测应该是回归*均值。

根据英国 1078 对父子身高的实际数据,对于身高 72 英寸(183 厘米)的父亲来说,他们的儿子*均身高为 71 英寸(180 厘米)。

皮尔森父子数据(通过芝加哥大学

为什么父亲的身高只是等式的一部分

芝加哥大学的研究人员试图解释这一现象。

首先,我们的身高受父母身高的遗传影响。上述研究没有明确考虑母亲的身高。

从统计数据来看,*均身高的女性比比*均身高高几个标准差的特别高的女性要多得多。因此,一个特别高的男人很有可能会娶一个不特别高的女人,这样他们的儿子就不会像父亲一样特别高。

其次,我们的身高不仅仅是由基因或遗传因素决定的。还会受到营养、运动等环境因素的影响。

1884 年,博学的统计学家弗朗西斯·高尔顿招募了 1 万人来测量父母和孩子的身高。他付给每个参与者 3 便士。他发现孩子们的身高与总体*均值的偏差大约是他们父母偏差的三分之二

用高尔顿的话来说,当父母身高低于*均水*时,他们的孩子往往比他们矮。当父母比均值矮时,他们的孩子往往比他们高。

GPU 到底怎么这么快?沿着 Nvidia CUDA-GPU 架构的 HPC 之旅。从零到现在。

原文:https://towardsdatascience.com/how-the-hell-are-gpus-so-fast-a-e770d74a0bf?source=collection_archive---------19-----------------------

Rafael Pol 在 Unsplash 上的照片

有人将机器学习定义为数学(算法)、工程(高性能计算)和人类能力(经验)之间的完美和谐。因此,这些领域的任何进展都将有助于机器学习的发展。今天轮到了 HPC,具体来说,我们正在讨论 GPU 的进步。

Nvidia 刚刚宣布了其基于 Ampere 架构的 Geforce RTX 30 系列 (RTX3090,RTX3080,RTX3070)。安培是我们最喜欢的 GPU 品牌的最后一个架构,但迄今为止已经发布了几代支持 CUDA 的 GPU。在接下来的段落中,我将从头到尾描述 CUDA 架构的全球概况。今天,让我们一起驾驶有趣的道路,从费米到安培。但是在深入讨论细节之前,如果你不熟悉 GPU 计算,我强烈建议你访问我之前关于 CUDA 执行模型的文章。

遵循 Nvidia GPUs 的自然时间轴,该公司于 2001 年首次生产了一款能够进行可编程着色的芯片,Playstation 2 和 Xbox 使用的【GeForce 3】。在 GeForce 3(代号 NV20 )之前,还有其他一些:NV1 (1995)、NV3 (1997)、NV4 (1998)、NV5 (1999)、GeForce I(1999 年年底)和 GeForce II (2000)。然而,GeForce 3 可能是第一款受欢迎的 Nvidia GPU。

指出 Nvidia 世界中目标类别和架构之间的差异是很有趣的,这可能会让读者感到困惑。传统上,Nvidia 为每个目标客户类别设计了不同类型的产品,为四种不同的产品命名:GeForce、Quadro、Tesla 和(最*的)Jetson 尽管这四种产品内部使用的基础架构是相同的。用 Nvidia 的话说,他们四个拥有相同的计算能力。GeForce 系列专注于桌面和游戏玩家;Quadro 被认为是为制作视频内容的工作站和开发者设计的;而特斯拉是为超级计算机和高性能计算设计的。最后,Jetson 系列在芯片中包含嵌入式 GPU。

正如我们刚才在上面看到的,Nvidia 在 90 年代初开始了它的冒险,专注于 grapichs 的 GPU,但我们直到 2007 年才开始使用第一个 CUDA 架构: Tesla (是的,你是对的,他们后来为一个产品线使用了相同的架构名称,这就是为什么我说它可能会令人困惑)。Tesla 是一个非常简单的架构,所以我决定直接从 Fermi 开始,它引入了纠错码存储器,真正改善了上下文切换、存储器层次结构和双精度。

费米体系结构

每个费米流式多处理器(SMI)由 32 个 CUDA 内核(流式处理器)、16 个加载/存储单元(LD/ST 单元)组成,以解决每个时钟 16 个线程的内存操作、四个特殊功能单元(SFU)以执行超越数学指令、一个内存层次结构和 warp 调度程序。

费米流式多处理器(图片作者**

该板有六个 64 位内存分区,带有一个 384 位内存接口,支持高达 6 GB 的 GDDR5 DRAM 内存。CPU 通过 PCI-e 总线连接到 GPU。每个 CUDA 内核都有一个全流水线算术逻辑单元(ALU)和一个浮点单元(FPU)。为了执行双精度,32 个 CUDA 内核可以执行 16 个 FP64 单元。每个 SM 有两个 warp 调度程序,可以同时发布和执行 2 个 warp。

这种架构的一个关键部分是内存层次结构。它引入了 64 KB 的可配置共享内存和每个 SM 的 L1 缓存,可以配置为 16 KB 的 L1 缓存和 48 KB 的共享内存;或者 16 KB 的共享内存和 48 KB 的 L1 缓存。尽管 CPU L1 缓存是为空间和时间局部性而设计的,但 GPU L1 仅针对空间局部性进行了优化。频繁访问缓存的 L1 内存位置不会增加命中数据的可能性,但是当几个线程访问相邻的内存空间时,这是很有吸引力的。768 KB 的 L2 缓存是统一的,由服务于所有操作(加载、存储和纹理)的所有 SMs 共享。两个缓存都用于在本地和全局内存中存储数据,包括寄存器溢出。但是,需要配置是在 L1 和 L2 缓存读取数据,还是仅在 L2 缓存。这种架构被称为计算能力 2.x* ,这是 Nvidia 专门用来描述 GPU 硬件版本的术语,由主版本号(左数字)和次版本号(右数字)组成。具有相同主要修订号的器件属于相同的核心架构,而次要修订号对应于核心架构的增量改进。*

费米记忆层级(图片作者)

开普勒建筑

开普勒包括多达 15 个 SMs 和 6 个 64 位内存控制器。每个 SM 有 192 个单精度 CUDA 核,64 个双精度单元,32 个 sfu,32 个 LD/ST 单元和 16 个纹理单元。

开普勒流式多处理器(图片作者**

此外,四个 warp 调度器,每个调度器有两个调度单元,允许四个 warp 并发执行。它还增加了每个线程访问的寄存器数量,从 Fermi 中的 63 个增加到 255 个;它引入了 shuffle 指令,并通过在全局内存中引入对 FP64 原子的本机支持来改进原子操作。它还介绍了 CUDA 动态并行性,即从内核启动内核的能力。此外,内存层次的组织方式与费米相似。

开普勒记忆层次(图片作者**

64 KB 共享内存/L1 缓存通过允许在 L1 缓存和共享内存之间进行 32 KB/32 KB 分割而得到改进。它还将共享内存库宽度从 Fermi 中的 32 位增加到 64 位,并引入了 48 KB 只读数据缓存来缓存常量数据。L2 缓存也增加到 1536 KB,使费米 L2 缓存容量翻倍。此外,开普勒计算能力用 3.x 代码表示。

麦克斯韦建筑

Maxwell 由多达 16 个 SMs 和 4 个内存控制器组成。每个 SM 都经过重新配置,以提高性能功耗比。它包含四个 warp 调度器,每个能够在每个时钟周期为每个 warp 发送两条指令。SM 分为四个 32-CUDA 核心处理模块,每个模块有八个纹理单元、八个 sfu 和八个 LD/ST 单元。

麦克斯韦流多处理器(图片作者)

关于内存层次,它具有 96 KB 的专用共享内存(尽管每个线程块最多只能使用 48 KB),而 L1 缓存与纹理缓存功能共享。L2 缓存提供 2048 KB 的容量。内存带宽也增加了,从 Kepler 中的 192 GB/秒增加到 224 GB/秒,并且在共享内存中引入了对 FP32 原子的本机支持。麦克斯韦被表示为计算能力 5.x

麦克斯韦记忆层次(图片作者)

帕斯卡建筑

Pascal 板由多达 60 个 SMs 和 8 个 512 位存储控制器组成。每个 SM 有 64 个 CUDA 内核和 4 个纹理单元。它拥有与开普勒和麦克斯韦相同数量的寄存器,但是提供更多的 SMs,因此总的来说有更多的寄存器。它被设计为比以前的架构支持更多的活动经线和线程块。共享内存带宽加倍,以更高效地执行代码。它允许加载/存储指令的重叠,以提高浮点利用率,也改善了 warp 调度,其中每个 warp 调度器能够在每个时钟分派两个 warp 指令。CUDA 核心能够处理 16 位和 32 位指令和数据,有利于深度学习程序的使用,但也为数值程序提供了 32 个 FP64 CUDA 核心。全局内存本机支持也扩展到包括 FP64 原子。

Pascal 流多处理器(图片作者**

内存层次结构配置也发生了变化。每个内存控制器都连接到 512 KB 的 L2 缓存,提供 4096 KB 的 L2 缓存,并引入 HBM2 内存,提供 732 GB/s 的带宽。它为每个 SM 提供 64 KB 的共享内存,以及一个 L1 缓存,也可用作纹理缓存,作为合并缓冲区来提高 warp 数据的局部性。它的计算能力用 6.x 代码来表示。

帕斯卡记忆层次(图片作者)

最后介绍了 NVLink 技术。背后的想法是,任何 4-GPU 和 8-GPU 系统配置都可以处理相同的问题。甚至,几组多 GPU 系统正在使用 InfiniBand 和 100 Gb 以太网互连,以形成更大、更强大的系统。

沃尔特建筑公司

一个 Volta 板有多达 84 个 SMs 和 8 个 512 位存储控制器。每个 SM 有 64 个 FP32 CUDA 核心,64 个 INT32 CUDA 核心,32 个 FP64 CUDA 核心,8 个用于深度学习矩阵运算的张量核心,32 个 LD/ST 单元,16 个 sfu。每个 SM 分为 4 个处理模块,每个模块包含一个新的 L0 指令高速缓存,以提供比以前的指令缓冲区更高的效率,以及一个带有调度单元的 warp 调度程序,这与 Pascal 的 2 分区设置(每个子内核 warp 调度程序有两个调度端口)相反。这意味着 Volta 失去了在单个时钟周期内从一个线程发出第二条独立指令的能力。

Volta 流式多处理器(图片作者)

引入了合并的 128 KB L1 数据缓存/共享内存,提供了 96 KB 的共享内存。HBM2 带宽也得到了提高,达到 900 GB/s。此外,完整的 GPU 包括总共 6144 KB 的 L2 缓存,其计算能力用 7.0 代码表示。

伏打记忆层级(图片作者)

但是,最大的变化来自于它的独立线程调度。以前的体系结构以 SIMT 方式执行扭曲,其中 32 个线程共享一个程序计数器。在发散的情况下,活动掩码指示在任何给定时间哪些线程是活动的,留下一些线程是不活动的,并串行化不同分支选项的执行。Volta 包括一个程序计数器和每个线程的调用堆栈。它还引入了一个调度优化器,用于确定来自同一 warp 的哪些线程必须一起执行到 SIMT 单元中,从而提供更多的灵活性,因为线程现在可以在子 warp 粒度上分叉。

Volta 的最新突破性功能被称为张量核心,与之前的帕斯卡 P100 加速器相比,它的深度学习应用速度提高了 12 倍。它们本质上是混合精度 FP16/FP32 内核阵列。640 个张量核中的每一个都在 4x4 矩阵上运行,它们相关的数据路径是定制设计的,以提高这种矩阵上的浮点计算吞吐量。每个张量核每时钟执行 64 次浮点融合乘加(FMA)运算,为训练和推理应用提供高达 125 TFLOPS。

此外,第二代 NVLink 为多 GPU 系统配置提供了更高的带宽、更多的链路和改进的可扩展性。Volta GV100 支持多达 6 条 NVLink 链路和 300 GB/秒的总带宽,而 GP100 支持 4 条 NVLink 链路和 160 GB/秒的总带宽。

图灵(不是全新的)架构

NVIDIA 首席执行官黄仁勋就 Pascal、Volta 和 Turing 之间的架构差异提供了一个有趣的回复。基本上,他解释说伏打和图灵有不同的目标市场。Volta 旨在用于大规模培训,最多可连接八个 GPU,具有最快的 HBM2 和其他专门针对数据中心的功能。另一方面,图灵在设计时考虑了三个应用:专业可视化、视频游戏和使用张量核的图像生成。实际上,图灵拥有和 Volta 一样的计算能力, 7.x,这就是为什么我说图灵不是一个全新的架构。

最显著的成就:使用 GDDR6 内存和引入 RT 内核,能够渲染视觉上逼真的 3D 游戏和复杂的专业模型:

图灵流式多处理器。来源:英伟达

像 Volta 一样,图灵 SM 被分成 4 个处理模块,每个模块都有一个 warp 调度程序和调度单元。图灵几乎等同于 Volta 在两个周期内执行指令,但调度程序可以在每个周期发出一条独立的指令。此外,与 Pascal 的 per-warp 不同,Volta 和 Turing 有每个线程的调度资源,每个线程有一个程序计数器和堆栈来跟踪线程状态。

安培架构

最新的 CUDA 架构被称为 Ampere,提供了迄今为止最高的 GPU 性能。有人在这里做了一个真正完整的回顾,我强烈推荐。

每个 Ampere SM 包含四个处理模块,每个模块都有用于数据缓存的 L0 缓存、warp 调度器、16 个 INT32 CUDA 内核、16 个 FP32 CUDA 内核、8 个 FP64 CUDA 内核、8 个 LD/ST 内核、一个用于矩阵乘法的张量内核和一个 16K 32 位寄存器文件。每个 SM 都有一个 192 KB 的组合共享内存和 L1 数据缓存;在 GPU 级别,它有 40MB 的 L2 缓存来提高性能(比 Volta 中的 V100 大 7 倍)。L2 缓存分为两个分区,以实现更高的带宽。

安培流式多处理器。来源:英伟达。

GA100 GPU 芯片由 128 个 sm 组成,但主要是因为-营销-制造,不同的安培 GPU 只会启用其中的一部分。比如 A100 GPU 只暴露 108 条短信。总之,完整的 GA100 由 8 个 GPC 组成,每个 GPC 有 16 个 SM 和 6 个 HBM2 堆栈。在 A100 GPU 的情况下,这被转换为 40 GB 的 HBM2 DRAM 存储器,速度为 1555 GB/s。

它还引入了第三代 NVIDIA 张量内核(继 Volta 和 Turing 之后),允许它每时钟计算 8×4×8 混合精度矩阵乘法(将 8×4 矩阵乘以 4×8 矩阵)。例如,每个 A100 张量核每时钟执行 256 个 FP16 FMA(融合乘加)运算。Ampere 在其张量核上支持许多数据类型,包括 FP16、BF16、TF32、FP64、INT8、INT4 和 Binary。

最后在 Ampere 上呈现第三代 NVLink。在 A100 GPU 的情况下,它有 12 个 NVLink 链接,总带宽为 600 GB/s,用于多 GPU 计算。关于 PCIe 连接,A100 GPU 支持 PCIeGen 4,它提供每个方向 31.5 GB/秒的带宽(用于 x16 连接),是 PCIe 3 的两倍带宽。

参考

费米白皮书

开普勒白皮书

麦斯威尔白皮书

帕斯卡白皮书

沃尔特白皮书

图灵白皮书

安培白皮书

GPU 上的并行算法

大型投资公司如何使用 NLP

原文:https://towardsdatascience.com/how-the-large-investment-firms-use-nlp-822c7c79af96?source=collection_archive---------19-----------------------

调查游戏的当前状态

资料来源:Pexels

金融服务行业正在爱上文本处理,也称为自然语言处理(NLP)。

这种迷恋是必然的,因为投资公司淹没在文本数据中:分析、新闻、合同、合规报告…

金融部门确实喜欢内部技术。在硅谷之外,投资银行尤其以绝对的热情拥抱工程人才。尽管这一过程在 2008 年金融危机前就已经开始,但随后的监管通过创造对更好数据解决方案的需求加速了这一过程。

还有激励因素需要考虑。这是一个渴望赢得市场优势的行业;通过不同的方式处理数据,耳朵往往会对了解更多的前景感到兴奋,特别是如果这有助于一个好故事。

我在金融服务和自然语言处理的交叉领域已经有一段时间了,去年年底我决定收集尽可能多的信息来回答这个问题:

银行和资产管理公司是如何使用自然语言处理的?

我决定把我找到的案例研究收集成一个白皮书——
【金融如何使用自然语言处理——银行和投资管理中的 8 个案例研究】

主要目的是让金融业内人士了解 NLP 现在提供的可能性。(披露:我是 FinText 的创始人)。

为此,报告还定义了关键的自然语言处理和机器学习概念(主题建模、命名实体识别、特征选择等)。),清楚地展示出来,以便任何人都可以理解:

然而,当我在编纂这部作品时,我被某些发现震惊了。

我觉得与可能已经熟悉 NLP,但不一定熟悉金融服务领域的人分享它们会很好。今天我想在这里与你们分享的就是这些发现。

我相信,它们的相关性超越了金融领域的细节,延伸到了任何其他希望利用文本分析的非科技领域。

1。在金融 NLP 中,从熟悉的开始

自 2017 年底以来,通过引入迁移学习和变形金刚,自动语言处理取得了长足的进步。

最重要的是,NLP 似乎每周都有所改善。除了模型,还有工具、语料库和学习资源。很快,这些复合收益开始增加。

但是,当您看到金融服务中实际文本处理应用程序所使用的技术时,它并不是技术的前沿。

总的来说,NLP 的概念在这个领域已经被熟悉和建立:嵌入,术语加权方案,聚类,从零开始训练分类器。

一般来说,投资公司面临的问题往往是规模和效率的问题:在许多情况下,你的目标是实现与五年前类似的事情,同时处理更多的数据更少的人员。因此,自动化凭借自身的力量从“美好到必须”变成了一种金融杠杆。

不可否认,由于我正在收集公开可用的信息,可能许多当前的项目——尚未公开——正在使用大规模的大型模型。总的来说,我认为不太可能。

一个原因是内部金融 NLP 应用程序的开发考虑到了回报。技术的使用既不是为了技术本身,也不是为了抽象的研究。虽然实验肯定会发生,但它是为了解决非常具体的业务问题。在这种背景下,首先尝试既定的想法是有意义的。

部署更普通技术的第二个原因是许多水果挂得非常低。与处理大量杂乱数据集的任何领域一样,主要的工作是将数据集中在一起并进行清理。但是,就你能从数据中提取的价值而言,在你开始看到切实的收益之前,不需要太多的魔法。

2。求解优化内部流程

虽然 NLP 对彭博和路孚特(Thompson Reuters 的市场数据服务)等数据提供商来说并不陌生,但我主要专注于研究内部发展。

第一个原因是,处于金融服务和 NLP 交叉点的许多提供商倾向于向内看。他们关注的是“如何”(看!我们正在使用这项非常酷的技术!)而不是在‘什么’上(这是我们神奇解决的问题)。

这种心态可能对很多有技术背景的人来说都很熟悉。人们攻击新技术是因为他们喜欢它,因此假设每个人都会喜欢它,如果他们愿意坐下来听的话。

然而,在金融服务业,高管们很少关心科技。即使在高盛或复兴资本(这两家公司对技术非常有战略眼光),高管们仍然会更关心下一次胜利,而不是那个很酷的新玩意儿。

选择专注于内部开发的另一个原因是来自英格兰银行的证据,即当公司寻求部署 ML 技术时,他们喜欢首先在内部进行试验。

摘自:《英国金融服务业的机器学习》,2019 年 10 月

当谈到内部财务文本分析时,很快就发现解决问题实际上是理解业务流程。

相对于解决方案补充现有工作流程的能力而言,技术扮演着次要角色

金融公司内部的动力因素是巨大的:真正改变一个过程是缓慢的。减少阻力的途径是温和地从正常做事的方式中消除痛点。

因此,最划算的方法是了解人们在处理文本数据时是如何一步一步地工作的。

为了说明这一点,这里有一个银行内部 NLP 应用程序的示例,它针对的是更广泛流程中的一个特定难点:

金融服务公司从许多不同的源系统接收特定于公司的数据。然而,不存在在不同数据源之间一致共享的单一公司标识符。因此,将不同的数据集与内部使用的名称进行匹配可能很困难,因为不同数据集之间的公司名称可能不同。

想到的直接解决方案是*护某种形式的基于规则的数据库。但是有一家银行抓住了这个特定的痛点,并使用嵌入和 TF-IDF 解决了这个问题,将每个公司名称视为一个“文档”并匹配相似的文档。

3。金融 NLP 的爆发时刻尚未到来

一方面,我看到所有这些内部驱动的 NLP 应用程序,在跨越几乎每个部门的业务领域中萌芽,从研究到后台,从客户服务到营销。

事实上,我遇到的案例研究比实际写进报告的要多得多。例如,我没有提到 BNY-梅隆银行自动筛选电子邮件,将它们导向相关部门,或者苏格兰皇家银行将一些自然语言处理技术整合到预测客户流失的模型中。

我还遇到了几个大银行入股它们正在培育的*初创公司的例子(比如摩根大通入股 Limeglass,或者 ing 入股 Eigen Technologies)。这再次强调了过程的重要性——解决方案正在现实生活中得到完善。

然而,我收集的信息是难以置信地分散:一些新闻、晦涩的报道、meetup 演示、内部技术团队偶尔写的博客文章。

似乎没有任何业内人士支持 NLP,没有专业媒体,没有会议。总的来说,我看到了巨大的内部改进空间,但没有跨行业的讨论。

因此,尽管金融服务中的人工智能或机器学习已经成为热门话题,但金融服务中的 NLP 尚未成为一个主题。如果要我猜的话,我会说这可能会在未来几年内改变:

多年来,技术一直在使金融服务商品化,相互竞争的公司现在倾向于遵循类似的过程。当一家公司做出能产生巨大收益的改进时,它的竞争对手往往会紧随其后。不是马上(这些是要驾驶的大船),而是最终。

新冠肺炎的经济影响只是一个额外的推动,因为公司会寻求充分利用他们的资源。预计未来几年银行和资产管理公司会有更多的用例,这是一个相当安全的赌注。

4。NLP 间接影响交易策略

基于新闻建立股票预测现在是一种常见的机器学习练习。然而在实践中,大多数投资公司并没有使用文本数据流来设计交易策略。

部分原因在于投资的销售方式。就像超市不提供杂乱无章的食品,而是按照岛屿和区域来划分商品一样,投资产品是按照特定的类别销售的——尤其是面向大规模的专业投资者(比如养老基金)。

主题产品往往会吸引散户观众(对你我这样的普通人来说是行话),但它们会与其他*众讲故事产品竞争:气候变化 ETF、科技追踪产品、专注于大麻的产品等。等等。

事实上,旨在跟踪新闻、博客和推文中提到最多的公司的 BUZZ perspective ETF 最终因投资者缺乏兴趣而倒闭。

总的来说,金融公司大多使用替代数据来检测隐藏的信号——好的和坏的。举例来说:请注意我们的报告是如何被行业顶级出版物报道的:

查出不诚实的行为。来源:机构投资者

这些信号会在更广泛的投资过程中发挥作用。当退一步总体审视这些案例时,你会发现银行和投资经理实际上在问自己:

在当前过度饱和的数据环境中,消息灵通意味着什么?

鉴于文本数据的爆炸式增长,这个问题只会变得更加紧迫。

摘要

让我们一起考虑这四个发现:

1.成熟的技术已经提供了大量的潜力。
2。解决内部瓶颈是当务之急。
3。许多人还没有意识到 NLP 的好处。知识是分散的。
4。在投资方面,用例并不是要打败某个指数。

第一个和第三个发现合在一起是有意义的。玩最新的巨型模型很酷,但不要嘲笑硅谷可能认为是昨天的新闻。

很多挑战仍然存在于数据清理和聚合中,但是要进行这样的努力,你首先需要知道有回报。因此,在使用行业关心的术语和概念的同时,交流可以实现什么是很有价值的。

根据第二个发现,如果没有领域专业知识,想做出一些实际有用的东西是很难做到的——如果你从未参与过银行或资产管理公司,你怎么知道它们的日常工作是什么样的?

因为太难了,很少有人去追求这些知识。如果你想在金融领域应用你的 NLP 技能,我绝对认为值得问这个行业的人一些非常普通的问题:

他们的一天是什么样子的?他们要追谁?他们反复做什么?他们看什么样的电子表格?

这就是第四个发现的来源:如果你想给银行或资产管理公司增加价值,不要试图取代实际的投资者。在内部,这些人往往是组织中最有权力的人。

NLP 对投资者有直接帮助的案例研究,是通过提供额外的处理过的知识,这些知识他们根本无法从其他途径获得。

这才是真正的优势所在。

来源:
1。金融如何使用自然语言处理—银行和投资管理中的 8 个案例研究,2020 年 5 月,FinText****

第七天放大因子如何能测量日冕无声载体的存在

原文:https://towardsdatascience.com/how-the-seventh-day-amplification-factor-can-gauge-the-existence-of-corona-silent-carriers-b9414ef3df62?source=collection_archive---------40-----------------------

如果 A7=1.0,则第 7 天的确诊感染病例总数等于第 0 天的确诊感染病例总数。这意味着没有新的感染。

电晕爆发面临的一个关键挑战是相对无法估计无声携带者的数量。沉默携带者可能被证明比已知感染人数更为关键,因为受感染的个人可能被隔离并进行接触追踪;而沉默的携带者无法识别。

然而,我们可以通过使用一个数学表达式——第七天放大因子(A7)来定性地测量沉默携带者的存在。如果我们计算今天(第 7 天)确诊感染病例总数与七天前(第 0 天)确诊感染病例总数的比率,我们得出的比率称为“第 7 天放大系数”,或 A7。A7 始终大于或等于 1.0。超过 1.0 的部分指的是由于过去 7 天累积的新病例而导致的增加,以第 0 天数字的分数表示

这是相隔七天两点间累积新冠肺炎感染的简单数学比率。在两端使用 3 天滚动*均值来消除每日波动。

该比率基于一些假设:

假设

  1. 今天检测呈阳性的患者至少在 7 天前感染了病毒(假设潜伏期为 5 天,检测期为 2 天)。
  2. 这些患者(我们可以称之为第 7 天患者)是由第 0 天沉默携带者感染的,而不是由第 0 天患者感染的(因为他们已经被隔离)。
  3. 无症状患者占所有感染病例的 80 %,约为第 0 天患者人数的 4 倍。
  4. 许多“沉默的病人”可能已经康复,因此只有活跃的病人才能传播病毒。

A-7 模拟的有用性

这个比率有三种用途

  1. 监测当前趋势
  2. 分析国家干预的有效性
  3. 预测疾病爆发的结束。

为什么 A-7 很重要?

它被证明在定性上与社会中无症状的感染者有关,这些人被称为“沉默的病人”。在大多数国家缺乏大规模检测的情况下,预测这些沉默患者的存在是至关重要的。政府需要这种监测来实施干预措施,公共卫生官员也需要这种监测来评估他们应对病人数量突然增加的能力。它还有助于让公众了解危机的严重性,以及公民参与实施社会距离和坚持预防措施等措施的必要性。

“1.0”的完美比例

当比率 A-7 大于 1.0 时,则超过 1.0 的部分是由于从第 0 天开始增加的新感染病例。

如果 A7 的值=1.0,则第 7 天的确诊感染病例总数等于第 0 天的确诊感染病例总数。这意味着没有新的感染,因此没有从第 0 天或一周前的任何一天传播病毒的沉默携带者。

例子

  1. 泰国:3 月 24 日之后 A7 的快速下跌证实了 3 月 18 日措施的有效性(在关闭教育机构、购物中心和娱乐场所方面)。另外,根据目前的走势,我们可以大致预测 A7 将在 4 月 30 日左右冲击 1.0(除非不再有超级 Spreader)。
  2. 中国和南韩:由于在疫情爆发之初采取了严厉的措施,A7 值很快下降到接* 1.0。
  3. 日新:目前的措施并未奏效,图形显示出现反弹。两国政府现在都宣布了更严格的措施。
  4. 美国:已确认的总感染率是世界最高的,部分原因是初期处理不当。然而,尽管病例和死亡人数非常多,但好的信号是,A7 的图表似乎在过去两周内呈下降趋势。

苏门答腊犀牛如何教会我重新思考人工智能

原文:https://towardsdatascience.com/how-the-sumatran-rhino-taught-me-to-rethink-ai-4943b83fca3f?source=collection_archive---------27-----------------------

极度濒危的苏门答腊犀牛。这种动物在世界上仅存不到 80 只。图片由 3 瓦尔迪/shutterstock.com

我曾在各大洲最美丽、最残酷的环境中工作过,当我部署我的一项新技术时,我总是有点惊讶自己会变得多么焦虑。对一个发明家来说,原型的第一次实地测试总是很困难的。。。它会像在实验室里那样工作吗?我错过了什么?我真希望当我按下电源开关时,这些人没有看到。。。

这一次,这个项目更加紧张。我正在部署一个定制的 3D 扫描设备,这是我用 6 万美元的零件制作的,试图在潮湿的印度*西亚丛林深处的一个保护区创建一个世界上仅存的苏门答腊犀牛的数字副本。这可能是我们捕捉犀牛的数字副本的一次机会,这将有助于讲述它的故事,或者在最坏的情况下,如果保护努力失败,提供这种动物的完整数字记录。更重要的是,国家地理摄制组拍摄了我们努力的每一步。

苏门答腊犀牛的 3D 数字化模型。苏门答腊犀牛是地球上最濒危的陆地哺乳动物之一。了解国家地理和其他组织如何努力拯救它们。图像:作者扫描的 3D 渲染

我的职业生涯是一个很长的系列(几十年了,但我尽量不去想太多!)这些类型的短跑。几个月的实验室开发用于保护、勘探或反偷猎安全应用的高科技系统,其间不时被密集的实地部署打断。我拥有麻省理工学院(MIT)的计算机科学和人工智能背景,最初并没有想到自己会从事为探索和保护开发技术和算法的职业。与《国家地理》的合作给了我一个机会,将我对计算机科学和人工智能的热情与保护、探索和讲故事结合起来。

在国家地理杂志做一名探险家和研究员是不可思议的冒险的同义词。不像大多数工作,它真的像听起来那么酷。我曾在 12500 英尺深的泰坦*克号甲板上乘坐三人潜艇,同时我帮助开发了动力机器人,探索沉船内部的客舱。去年,我乘坐直升机飞越珠穆朗玛峰,拍摄了世界最高冰川的高分辨率航空激光雷达图。我和我们的环保伙伴一起驾驶绑在双座飞机机翼上的摄像机飞越刚果民主共和国,在打击偷猎大象的前线。我花了数百个*时在漆黑的地下世界执行任务,比如在被水淹没的洞穴里潜水,扫描玛雅人祭受害者,把我的身体塞进一个垂直裂缝,在一些地方只有 7 英寸宽,在那里坠落会让你楔住并破碎,在南非的洞穴系统中用探地雷达搜索前人类的墓葬。

使用 Gran Acuifero Maya 项目对一个被水淹没的洞穴中的冰河时期*头骨进行 3D 数字化处理。图片由吉尔·海纳思提供

总的来说,这让我受到启发,并为技术和创新在分享和保护世界上最美丽的宝藏方面所发挥的作用感到兴奋,同时也让我害怕我们所关心的东西是多么脆弱。

由于我的工作,我最*被评为 2020 年劳力士国家地理年度探险家。每年,这个享有盛誉的奖项都会授予那些在探索和讲故事方面表现出领导力、成就和精神的个人。之前的获奖者包括电影制作人詹姆斯·卡梅隆,水下摄影师布莱恩·斯凯瑞,史蒂夫·博耶斯和他的奥卡万戈荒野项目团队,以及环境人类学家肯*·布罗德。如今,国家地理学会的使命——利用科学、探索、教育和讲故事的力量来照亮和保护我们这个世界的奇迹——比以往任何时候都更加重要。我非常荣幸能成为这项任务的一部分。

劳力士国家地理年度探险家奖。作者图片

当我在数字化苏门答腊犀牛的时候,我在我的笔记本电脑上渲染了一个预览图像,当时我在印度*西亚的*屋。当我在屏幕上移动这个动物的 3D 图像时,我被它的逼真程度震惊了。当我停止移动鼠标的时候,我几乎不能分辨出这不是一张照片。有了人工智能背景,以及哲学爱好,我开始思考什么是“真正的”图像?我当然认为我用手机拍的照片是真实的图像,但除了代表像素值的一串数字,那真的是什么呢?如果我的合成数字化犀牛和照片无法区分,它和照片一样真实吗?我意识到,如果我可以创建对我来说看起来真实的 3D 模型,我就可以使用这些图像来训练 AI 系统。你看,数据是人工智能的阿奇利的脚跟。一个好的人工智能模型需要大量的数据,但在一些最具影响力的应用中——如保护、反偷猎、安全和医学成像——很难获得好的数据。

这个想法导致了我目前创办合成公司的冒险,这是一家人工智能和合成数据公司,专注于人工智能的一些最高风险用例,有限的样本岛阻止了高质量的预测建模。在许多领域,根本没有足够的数据来有效地训练网络,特别是静态和动态图像。

偷猎者与步枪在外地部署。图片由合成

非法偷猎者的照片很少。那些带有极端主义标志的新型丰田皮卡也是如此。手术室里对神经外科医生的实时反馈受到了罕见脑癌的有限图像库的限制。由于训练数据中的普遍性问题,种族偏见在面部识别中猖獗。

我开始合成来回答我认为是人工智能中最大的两个问题。如果边缘案例不再存在会怎样?如果训练数据不再是一个约束,会怎么样?

自从我们开始合成以来,我们已经扩展了这个概念,因为我们意识到,通过结合 3D 建模和新的生成式人工智能,我们可以更快、更便宜地增长数据,并且在某种程度上比任何其他数据合成技术都更符合训练最先进的人工智能。目前,我们正在生成用于脑外科手术决策的人类癌症显微图像,生成用于新冠肺炎检测的胸部 x 射线图像,为保护项目合成航空图像,并为几个未解决的安全情报需求创建数据。在每一种情况下,数据都无法与真实图像区分开来,但几乎是在我们的服务器上即时生成的,我们可以使用这些数据来训练 AI 模型,这些模型优于当前的最先进水*。

用于新冠肺炎检测的合成胸部 x 射线图像。图片由合成

我们需要技术作为力量倍增器来解决世界上最困难的问题。即使是我们现在看到的简单技术,如滑轮或电力,也从根本上提高了我们作为个人和物种的能力。我相信,当人工智能充分发挥其潜力时,它将成为这样一种工具。它将帮助编号护林员保护广大地区免遭偷猎。当更多的治疗方案摆在桌面上时,它将帮助医生更早地诊断医疗问题。这将有助于我们在一个不确定的世界中保持安全。为了实现人工智能提供的承诺,我们需要难以想象的大量输入数据。synthetic将长出这种高质量的数据来解锁“不可能”的 AI。

越南前 10 大公司是如何赚到数十亿美元的?

原文:https://towardsdatascience.com/how-the-top-10-companies-in-vietnam-make-their-billions-bc262ed92940?source=collection_archive---------26-----------------------

2019 年,越南前 10 大私营公司的收入均超过 10 亿美元。他们是如何获得亿万财富的?

灵感

当我看到视觉资本家关于美国五大科技公司的收入流的令人兴奋的图像时,这个问题一直萦绕在我的脑海里。看着每家公司按产品/服务系列和地理区域划分的收入,我想知道在我的国家——越南,顶级公司的情况会是怎样的。

带着这个问题,我把注意力集中在越南的前 10 家私营公司,来分析它们的收入是如何分解的。在本文的其余部分,我将一步一步地描述这一分析的过程和令人兴奋的发现:

  1. 确定十大公司
  2. 2019 年:收入细分
  3. 2014:回顾
  4. 2020 年:预测

前 10 名

在这个分析中,我使用了由 VNR500 排名的 2019 年越南十大私营公司名单。

为什么选择 VNR500?我选择使用这份榜单,因为根据的排名方法,收入是编制这份榜单的第一标准。

为什么前 10 大私营公司,而不是越南“前 10 大最大的公司?VNR500 确实提供了一份越南前 10 大公司的名单,但我决定不使用这份名单,主要有两个原因:(1)这份名单中的 10 家公司中有 8 家是政府认为的关键行业(即能源、电信和金融服务)的国有公司;(2)榜单上 10 家公司中有 9 家不公开其财务报告,导致数据收集困难,只能从不同的新闻渠道获得非官方数据。

据此,我们将“剖析”越南 10 大私营公司 2019 年的收入,它们是:

VNR500 排名前 10 位的越南私营企业,以及它们在 2019 年的收入(以万亿越南盾计)

这十家公司有多大?为了客观地看待问题,我看了这些公司 2019 年的总收入占同年越南国内生产总值的百分比(世界银行数据)。

2019 年前 10 家公司的总收入占越南 GDP 的百分比。

2019 年,越南前 10 大私营企业对该国 2019 年国内生产总值的贡献约为 11%。

很多吗?考虑到五大科技公司(亚马逊、苹果、Alphabet、脸书和微软)的收入为 9900 亿美元,相当于 2019 年美国国内生产总值的 4%(21.43 万亿美元),你怎么看?

2019 年:收入细分

以下是越南十大私营公司按行业(产品/服务类型)分列的收入明细:

越南前 10 大私营公司 2019 年收入明细

请注意,对于 DOJI 集团,该集团的合并财务报表并未向公众公布。在此分析中,我假设集团的所有收入都与其核心业务相关,即黄金、白银和宝石交易。然而,据了解,道纪集团自 2019 年 开始在房地产领域开展 业务,尽管无法找到关于该业务收入的进一步信息。

如果我们看一下按行业细分的前 10 家公司的 2019 年收入,零售业和制造业是主导行业,各贡献约 130 万亿越南盾。看着这张图表,我想知道五年前十大公司的细分情况如何,这就是我们将在下一节探讨的内容。

2019 年越南前 10 大私营公司的合并收入明细

2014:回顾

回顾五年前,即 2014 年,事情与 2019 年有多么不同:

2014 年和 2019 年越南十大私营公司

  • 2014-2019 年间,越南国内生产总值增长了~ 1.5 倍
  • 前 10 家公司的总收入占 GDP 的百分比已经从 2014 年的 6%增长到 2019 年的 11%。
  • 2014 年前 10 名中只有五家公司在 2019 年的榜单上。
  • 2014 年榜单中有 4 家公司是商业银行

因此,您可以看到前 10 名的综合收入明细在这 5 年中发生了怎样的变化。

零售业占据了第一位,在五年内增长了约 6 倍(注意,电子设备零售商的主导者之一 FPT 在 2014 年上榜,但在 2019 年退出)。2014 年排名第一的金融服务跌至第五,因为 2019 年只有两家商业银行上榜,而不是 2014 年的四家。这些年来,房地产一直保持着它的地位以及总收入的百分比。由于 FPT 集团退出前 10 名,电信和技术解决方案不再是 2019 年的组合。

2014 年与 2019 年相比,前 10 家私营公司的合并收入明细

2020 年:预测

以下是我对 2020 年十大榜单的预测:

越捷航空:由于疫情对航空业影响深远,如果越捷的排名下降,或者某个事件不在榜单上,也不会令人惊讶。

*恩集团、MWG 和马桑集团——零售:2019 年,马桑从*恩集团收购了零售业务,这将影响到名单中不止两家而是三家公司的位置。

  • VinGroup :零售业务在 2019 年为公司带来了约 30 万亿越南盾的收入。
  • MWG:MWG 2019 年收入约 103 万亿越南盾,比文集团低约 27 万亿越南盾。现在,2020 年,VinGroup 不再有零售业务收入,也许这足以让 MWG 在榜单上占据第一的位置。
  • 当然,由于新冠肺炎在越南,不确定对零售市场的影响会有多大,但我们应该会看到马山今年的收入会有显著增长。

你怎么想呢?你对 2020 年越南 10 大私企有什么预测?欢迎在评论区分享你的想法。

2020 年 9 月 18 日更新,2014-2019 年间越南 10 大私企的种族条形图。感谢 Pratap 文章对如何使用 Python 制作这个图表的指导。

2014-2019 年间越南十大私营公司(按 VNR500 排名)及其收入和主要业务

来源: 详情请参考我的电子表格

他们如何看你:人工智能监视内部运作的一瞥

原文:https://towardsdatascience.com/how-they-see-you-a-peek-behind-inner-workings-of-ai-surveillance-4f23c014d08c?source=collection_archive---------51-----------------------

了解大规模监控系统是如何在边缘计算上驱动的

斯科特·韦伯在 Unsplash 上拍摄的照片

政府和企业使用的大规模智能监控系统吸引了大量负面报道和公众对隐私和数据安全问题的愤怒。他们经常进行数据收集和数据处理,以提取关于所拍摄场景的关键信息。

例如,这些系统据称可以对个人或群体进行人脸识别、匹配和信息提取。

数据隐私和这些监控系统的道德方面是另一个完全不同的话题,超出了本文的范围。更重要的是要意识到在构建这样一个系统的背后发生了什么。

你有没有想过这些系统在现实生活中是如何工作的?如果是,那么我建议你继续读下去,找出答案。

在过去的两年里,我一直从事大规模机器视觉系统的工作,通过这篇文章,我想与你分享我在一些项目中获得的一些见解,这些项目要求我设计涉及 200 多个相机的系统,这些相机需要使用人工智能后端进行实时处理。

我分享的方法或知识纯粹基于我的学习和实践经验,不应被视为我说这是绝对的最佳实践,或者这是所有监控系统的工作方式。相反,它是一个通用模板,展示了这种管道的潜力以及在大多数情况下如何处理数据。

瞿连浩在 Unsplash 上的照片

那么这一切是如何组合在一起的呢?概括地说,您有充当原始数据捕捉的感官助手的摄像机、可以是边缘计算设备或中央处理服务器的人工智能处理单元、命令中心或控制仪表板、用于传输感官数据的典型网络基础设施以及存储所有重要信息的数据库。

让我们以我最*参与的一个项目为例,这样我可以更容易地解释数字和讨论技术。

该项目是智能城市发展自动化路线图的一部分。一个典型的智能城市监控系统将包含至少 300 个摄像头,战略性地放置在关键区域,以监控正在发生的事情。

这些摄像机每秒产生大量数据,手动监控它们成为一项巨大的任务。这就是我的公司出现的原因。

我们开发了支持多种计算硬件配置的视觉处理系统,以实时处理这些视频。

典型的智能城市人工智能工作负载将包含人体检测和跟踪、带标签和车牌识别的车辆监控、异常检测、带匹配的人脸检测等。但所有这些工作负载都是非常资源密集型的,就像任何基于深度学习的视觉管道一样,也会抬高整个系统的价格。

一个简单的解决方法是避免在每台摄像机上运行所有这些工作负载。相反,我们选择与不同用例相关的摄像机,并将这些摄像机分配给每个工作负载。

例如,放置在建筑物入口处的摄像机适合运行人脸识别工作负载,因为在这种情况下人脸的可视性最好。路边的摄像头是观察行人和车辆的理想选择。

每台摄像机的硬件规格也是根据它需要处理的工作量来确定的。现在,你把这个处理硬件放在哪里?您可以有多种配置,但我们发现的最佳配置是边缘计算架构。这可以从下图中看出。

图片作者:*萨克·S·莫汉

上图展示了一个包含 3 个主要工作负载的准系统智能城市部署。一个是检测穿过摄像机视图的人,并计算在任一方向上穿过该区域的总人数。另一个工作负载是检测和匹配人脸,最后是车辆监控和交通相关信息分类工作负载。

基于边缘的处理让我们能够在摄像机级别调整软件,并帮助我们轻松扩展架构。

请注意分配给边缘设备的摄像机数量的差异。这通常基于工作负载限制。例如,与车辆监控工作负载相比,人脸检测和匹配用例具有相对较高的工作负载要求,因此对于实时处理而言,前者可以处理比后者更少的摄像机。

根据最终客户端的要求,我们将添加更多工作负载,通过使用边缘硬件,我们可以通过添加更多摄像头或包含新用例来进行水*扩展。

如前所述,每个工作负载的摄像机都是基于许多不同的参数手动识别的,其中一个主要参数是此类基础架构的总拥有成本。

Slejven Djurakovic 在 Unsplash 上拍摄的照片

每个工作负载都将集中管理,提取的信息作为*型数据有效负载传输到数据中心服务器,在那里进行预处理、排序并存储到数据库中。自定义分析引擎可以使用存储的数据来生成信息图,如热图、人群分析、基于面部匹配的标记警报等。可以修改该规则引擎或分析引擎,而不会有任何边缘硬件停机的风险,从而确保连续运行。

边缘硬件是难题的关键部分。虽然我们使用多种计算模块,这是大规模部署(如智能城市用例)的最佳选择,但我们发现英特尔或英伟达*台是最佳选择。

我们在多个项目上与两家公司密切合作,发现两家供应商的硬件可以很好地互补并提供良好的灵活性。

总之,任何典型的大规模视觉系统都是许多不同技术的融合,人工智能只是系统的一*部分。我希望这能让你对人工智能监控系统有一个基本的了解。在接下来的几周里,请关注这个空间的更多文章,我将在这里讨论与人工智能开发、架构设计和大规模视觉系统软件栈相关的主题。

我是如何成为一名***员的

原文:https://towardsdatascience.com/how-this-a-i-became-a-communist-ddf9146bc147?source=collection_archive---------5-----------------------

这 A .我读了共产主义的书后,能够改变他对生活的理解。

共产主义者的人工智能是用 GPT-2 训练的。它阅读马克思、法农、葛兰西、列宁和其他革命作家的书籍。该项目的目的是看看 GPT 2 号能理解多深的哲学思想和概念。
结果相当有趣,也很有希望,因为我们见证了 A。我合乎逻辑地扭曲了我们给它的任何句子,使之成为抨击资本主义和为“工人”而斗争的借口。只要有可能,它就呼吁革命。

这是使用无条件生成的样本生成的——没有人类的输入

此外,在介绍了无政府共产主义作家 Kroptokin 之后,我注意到“共产主义人工智能”倾向于使用更具攻击性的词语。另一方面,当我们介绍德·波伏娃的《第二性》(The Second Sex)时,《共产主义者人工智能》(The Communist A.I)有点错过了这本书的重点,在某些时候谈到了资本家的恋物癖——或者说它错过了重点?

什么是 GPT-2?

GPT 2 号是开源研究实验室 OpenAI 的成果。它是基于一篇名为“语言模型是无监督的多任务学习者”的研究论文创建的。该模型能够产生连贯的文本,并对文本的内容有清晰深刻的理解。它还能够将句子与其他句子联系起来,但最重要的是它能够在其输出中显示不同段落之间的清晰联系,从而提供长期和短期记忆理解。

读了那些书后,GPT-2 的理解有什么变化

标准的 GPT-2 在 800 万个网页上被训练,它基本上是人类在网上写或发布的内容的体现。我对它进行了微调,在它的节目单上增加了共产主义和社会主义的书籍。结果非常有希望。让我们看看 GPT-2 在阅读这些书籍后,对某些社会问题和陈述的看法是如何变化的。

我:“一个人如何变得自由?”训练前,GPT-2:我相信一个唯一的上帝,我的个人信仰,我的个人信仰让我自由,因为我知道我不是任何权威(上帝)的奴隶。我个人的信仰,我个人的信仰让我自由,因为我知道你不能评判我。对我来说,如果我违背了我的个人信念,那么我就不知道将来如何更好地处理我的情况。所以,如果我愿意改变我所做的或者我做错的事情,那么我会变得更加自由,并且知道如何变得更好,而不需要任何其他的权威。我个人的信念,我个人的信念让我从我经历过的每一种虐待中解脱出来,并且至今仍未消失。

虽然 GPT-2 对这个问题有某种理解,但它表明它的答案是不一致的,并与肤浅的答案和对自由概念的冲突理解作斗争。我们还可以注意到,它一方面成功地理解了自由和权威之间的联系,另一方面也理解了权威和上帝之间的联系。在增加了马克思、法农和葛兰西的书籍之后,人工智能学会能够更好地回答这个问题,给出了一个更加连贯和确定的答案。此外,它对什么构成权威的观点发生了变化,摆脱权威不再是摆脱上帝的自由,而是摆脱资本主义的自由。它对自由的概念及其与资本主义的关系的理解与那些书是一致的。

我:“一个人如何变得自由?”共产主义者 A.I:这个问题甚至比那个“纯粹的”经济学家还要复杂,他借助粗俗的修辞,想象自己的构想是唯一正确的。但即使是这个个体也不是自由的;资本家不是靠解放每个人来谋生的;但是,资本家通过解放自己,通过用别人的劳动代替自己,通过解放自己,借用社会发展的前一个阶段,来做到这一点;因此,如果一个人真的相信经济自由,他必须向每一个劳动者解释他对这种自由人类状况的概念,以及对自由社会的概念。这就是为什么教育者必须能够回答以下问题:“在什么情况下,人类的劳动和人类的自由是不可分割地联系在一起的?一个人完成的劳动和其他人的劳动之间的分离点是什么?”

既然我们问了一个一般性的哲学问题,我决定给它一个与经济理论更相关的陈述,以便更好地理解它的感知是如何变化的。

我:帝国主义将(seed=42)
GPT-2 训练前:帝国主义在未来仍将被需要。和过去一样,我认为主要目标是除掉俄罗斯和包括中国在内的其他强国。我看到世界分成了两个国家,一个是既得利益者,他们希望继续现有的政府体制,而不是改变它。中国把世界的最大利益放在心上,我一点也不在乎。但这就是我现在对世界的看法。现在反对我们的人不仅仅是反对我们,他们是反对全世界的人类。我知道他们感受到他们的生活方式,他们的思*方式。俄罗斯人民在所有政治领域都支持我。如果他们不碍事,我们的努力就能成功。"[2]直到今天,苏联仍然是地球上最极权的国家之一,死刑仍在使用。

GPT-2 对帝国主义的理解是基于它在那 800 万个网页中训练/阅读的东西,看起来它有点亲帝国主义。它知道,当讨论帝国主义时,人们可能会谈到中国、俄罗斯和苏联。它还建议“清除”那些对抗帝国主义及其带来的好处的国家。一旦有问题的书籍被添加到《GPT 2》中,它的观念就完全改变了,它不指明任何国家,但它确实呼吁一场反对帝国主义控制的革命。

我:帝国主义将会(seed=42)共产主义者 I:帝国主义将会被迫
我们面临的最紧迫的问题是:无产阶级和农民群众能否通过一场革命风暴推翻旧的行政专制制度,把国家置于工人的控制之下。乍一看,这个问题对我们来说是最难的。但是我们必须利用一切机会来看到这种可能性,也就是说要把无产阶级置于自己政党的领导之下。如果说没有一个国家不是由群众来领导政府,没有一个国家不是由政府来扬帆的话,那么事实是,除非革命群众,即政党来领导,否则革命是永远不会发生的。

结论

这个 GPT-2 是使用代表 3.45 亿个参数的 345M 模型训练的。还有另一个模型使用了 15.58 亿个参数,所以你可以想象它可以改进多少,但为此进行的训练需要更高的 GPU 能力。
尽管如此,结果还是很有希望的,GPT-2 能够理解潜在的哲学,这些革命性理论和不同参与者之间存在的不同关系。

感谢您的阅读,如果您希望复制代码,请访问我关于如何使用 Google Colab 训练 GPT-2 的文章。并访问我的 Github 库获取更多信息。

LinkedIn 上连接。
查看我的作品集中的其他项目。
关注推特

感谢你的阅读!

时间是如何毁掉你最珍贵的机器学习模型的

原文:https://towardsdatascience.com/how-time-can-ruin-your-most-precious-machine-learning-model-46c438014c06?source=collection_archive---------41-----------------------

Icons8 团队图板Unsplash 上的照片

在典型的 101 机器学习课程中,你会学到很多东西。您将学习不同的算法、特征工程、交叉验证等方法来获得可靠的性能测量,以及如何调整算法的超参数。然而,这些入门课程中的大多数不会告诉你当你的数据依赖于时间时可能出错的所有事情。

现在,你可能认为这不适用于你的问题,只适用于经济时间序列的典型预测。你可能错了。如今,普通数据科学家解决的大部分现实任务都依赖于时间。

每当你发现机器学习模型在部署后表现不佳时,你应该问一问在开发模型时,是否考虑了依赖于时间的影响,以及如何考虑。

基本示例:预测油耗

让我们从一个简单的例子开始。我们的任务是在 R&D 部门的设计和开发过程中预测汽车的油耗。客户为我们提供了许多不同汽车的数据,我们发现发动机容量、变速器类型和燃料类型是预测汽车消耗的重要特征。

发动机容量、燃料类型和变速器类型是最重要的特征

油耗随着发动机容量的增加而增加

我们使用 k-fold 交叉验证来验证我们的 XGBoost 模型,并获得了大约-0.95%的极好的*均百分比误差(MPE)。每个人都很兴奋,该模型被部署到 R&D 部门的用户中。

然而,很快用户开始抱怨预测的消费值不可能是真实的,而且高得不切实际。

油耗数据取决于时间

原来我们的数据包含了超过 10 年的训练实例。一旦我们加入这一数据生成过程的时间成分,很明显,这些年在制造节能汽车方面已经取得了实质性的进展。然而,我们的第一个模型无法了解这一进展,因为相应的功能已经丢失。

多年来,*均燃料消耗量已经下降

我们修正了验证方案,将时间考虑在内,并用滚动原点预测重采样替换了 k-fold 交叉验证。使用调整后的验证方案,我们发现用户是正确的。我们的模型的*均百分比误差(MPE)实际上比我们想象的要差 8 倍。该模型做出了严重偏颇的预测。

滚动原点验证产生的 MPE 比 k 倍验证差 8 倍(-8.18%对-0.95%)

现在,我们知道我们的数据取决于时间,我们可以创建一些功能,使机器学习算法能够做出更少偏差的预测。

时间可能很重要的不太明显的例子

上面的油耗例子非常明显,许多有经验的数据科学家不会落入这个陷阱。

然而,有时有些情况不太明显,不容易发现时间依赖性。甚至图像分类也依赖于时间吗?当然,举两个例子:

  • 使用 CCD 传感器进行自动质量控制
    训练数据由 45,000 幅图像组成,这些图像是在一月份的晚上在荧光灯管照亮的车间中生成的。一旦该模型被部署,它将必须对 6 月的一个早晨阳光透过屋顶窗户照下来的图像进行操作。

阿德里安·奥利雄Unsplash 拍摄的照片

  • 在影像学分期时协助临床医生 夏季和冬季不同的典型活动导致不同的伤害。这对数据生成和类不*衡有什么影响?临床医生和模型如何考虑这些不*衡,他们应该考虑吗?

Willem De MeyerFrank BuschUnsplash 上拍摄的照片

大多数数据生成过程都受到人类及其环境的严重影响。因此,他们经常显示趋势,周期和强大的每日,每周和每年的模式。基本上,每当数据生成过程与人类交互并且不能在隔离的实验室中自动执行时,这些时间相关组件中的一些能够被发现并且必须被建模的机会很高。

如何检查数据是否依赖于时间?

每当你在处理一个机器学习问题,并且你的数据还不包括时间的时候,问自己以下问题:

  • 什么过程产生了数据?
  • 生成这些数据需要多长时间?
  • 那段时间数据生成过程的环境稳定吗?
  • 在那段时间里,流程(和业务)本身稳定吗?
  • 环境和流程(以及业务)在未来会保持稳定吗?
  • 随着时间的推移,生成的数据的统计属性是否稳定?

这些抽象问题可以由更具体的问题来支持,以检查流程、环境和数据中常见的时间相关效应:

  • 季节、天气状况和假期会有什么影响?这会影响每年的模式吗?
  • 光线条件、噪音和工作时间会有什么影响?这会影响每日或每周的模式吗?
  • *护会对数据产生什么影响?有典型的*护周期吗?
  • 社会、科学和经济进步(或变化)会对数据产生什么影响?过去是否有任何趋势或变化,或者未来是否会有?
  • 人口统计或组织的变化会对您的数据产生什么影响?过去有什么变化吗,或者将来会有什么变化吗?

作者插图

一旦确定了潜在的时间相关效应,您应该检查这些效应是否存在于数据中,以及您的数据是否实际覆盖了检测它所需的时间跨度。

如果你的数据依赖于时间怎么办?

如果数据依赖于时间,有三个基本选项来处理它。

  1. 通过调整环境或过程排除时间效应。这只有在模型的输出不必包括趋势和季节性等时间效应的情况下才是可行的。在上面的质量控制示例中,这可能意味着调整车间环境以保证稳定的照明条件。
  2. 通过数据预处理排除时间效应。这也是唯一可行的,如果模型的输出不必包括时间效应,如趋势和季节性。在上面的质量控制示例中,这可能意味着修改图像以消除照明条件的影响。
  3. 通过调整机器学习模型和数据来包含时间效应。各种建模&特征工程技术可用于使机器学习模型包括时间效应。如果模型的输出依赖于时间效应,则应使用时间感知验证方案。在上面的质量控制示例中,这可能意味着在训练数据中包括各种照明情况,甚至可能生成使模型意识到照明条件的特征。

在你的机器学习项目中,你在时间方面有什么经验?你想读一篇关于各种建模和特征工程技术以及包括这些时间效应的验证方案的故事吗?

感谢您的阅读,我期待您的评论!

时间序列分析需要如何发展

原文:https://towardsdatascience.com/how-time-series-analysis-needs-to-evolve-5dcb6190902d?source=collection_archive---------25-----------------------

时间序列分析非常依赖于过去的数据来生成有意义的预测。这就是为什么这并不总是可持续的。

在形而上学领域,关于时间实际上是如何工作的,有两种相当有趣的理论:时间的 A 理论B 理论

A 理论:认为现在不同于过去和未来,从过去到未来的时间流动是真实的。例如,A-理论家会认为 1970 年和这一年发生的事件在形而上学上不同于 2020 年,这一时期的时间流动标志着一个持续转变的时期。在这种观点下,时间本质上可以被认为是一个真实的实体,就像引力一样。

B 理论:认为现在在形而上上与过去或未来并无不同。事实上,一个极端的 B 理论者会认为没有过去或未来这样的东西——时间只是人类发明的一个概念,作为理解世界的一种手段。如果没有我们的记忆,过去就不会存在,未来只是由个人对未来的想象组成。例如,有人可能会说 2022 年在技术上是不真实的,和现在没有什么不同。它只是一组标在世界通用的标准日历上的日期,用来标记我们对特定时间间隔的感知。

这些争论本质上是非常哲学的,我不会在这里深入探讨。然而,我发现它们确实为思考时间序列预测及其总体有效性提供了一个非常好的框架。

我们是在不知不觉中预测过去吗?

例如,当时间序列分析师试图预测天气模式时,他们真的试图“预测”什么吗?

温度数据在很大程度上是季节性的。对于北半球的一个国家来说,我们可以很肯定的说,6 月的*均气温会比 2 月高。我们可以断言这一点的原因很简单,因为过去多年的数据存在,以支持这一点。

例如,ARIMA 模型将低于气温的时间序列识别为具有很强的季节性成分,并相应地做出预测。

资料来源:RStudio

在这方面,时间序列分析师与其说是在预测未来,不如说是在“预测过去”。一个模型可以预测一个炎热的七月即将来临,但这也是过去发生过的事情。这不是新的。

也就是说,物理学确实认为是时间的固有属性——即“所有事物都趋向于无序”。让我们再次以天气为例。随着气候变化和全球气温上升成为越来越令人担忧的问题,这可能意味着未来气温预测将变得越来越不准确。

例如,关于气候变化是否会导致所有月份的*均气温升高,或者是否会导致极地冰盖融化事实上导致全球变冷的情况,仍然存在争议。事实上,结果可能是夏天温度更高,冬天温度更低。

我不是这方面的专家,也不想加入辩论的任何一方。然而,在熵随时间增加的论点下——这也意味着过去的数据在预测未来时变得越来越无用。

过去的数据只能预测类似于过去发生的趋势——它们不一定能解释从根本上改变系统的变化所带来的不确定性。

概率和情景分析在预测中的作用

这方面的一个经典例子是新冠肺炎对酒店业的影响。

我以前在 Medium 上写过几篇文章,讨论如何使用时间序列分析来预测酒店取消预订,使用的模型有 ARIMA 和 LSTM。

然而,即使是这些模型也无法解释这样一个事实,即新冠肺炎将有效地使全球旅游陷入停滞,酒店将需要因疫情而关闭。

这是一个“黑天鹅”事件,在过去的数据中不会被考虑。重要的是要记住,模型输出的质量取决于输入到模型中的数据——它不一定能解释熵,也不一定能解释未来存在高度无序和不确定性的事实。

时间序列领域越来越多地试图通过认识预测概率的价值来解释这种不确定性,而不是对时间序列未来的趋势做出艰难的预测。

例如,这里是通过 TensorFlow 概率库使用后验概率分布对酒店取消的预测。作为参考,后验概率分布指的是在考虑相关证据(即后验数据)后分配事件发生的概率的分布。本质上,该模型通过使用先前的后验数据作为可用证据来生成酒店取消的概率分布。

来源:Jupyter 笔记本

这里,模型显示这家酒店预计每周会有大约 100-200 次取消预订。然而,概率预测也表明,在极端情况下,酒店每周可能会有超过 500 次取消预订。虽然这也没有考虑到新冠肺炎场景下酒店关闭的影响,但它确实让酒店经理思考— “在什么情况下,我的酒店会在一周内出现 500 次取消预订,我应该如何防范这种情况?”

让我们将这一预测与使用 ARIMA 进行的预测进行对比。

来源:Jupyter 笔记本

我们看到,ARIMA 模型确实以合理的精度预测了测试数据的总体趋势,尽管在某些情况下倾向于高估取消频率。诚然,ARIMA 也可以将概率纳入其预测,因此两者之间的比较不一定是彻底的。

然而,ARIMA 强烈依赖于识别正确的 p,d,q 参数以及正确的季节顺序。作为参考, p =自回归项的数量,d =使时间序列*稳的差值的数量,q =以前预测误差的移动*均值

如果序列的性质发生突变,那么这些参数很快就会变得与未来的预测无关。

例如,随着新冠肺炎期间所谓“居家度假”的明显增加,这很可能导致酒店取消的季节性因素发生重大变化。

鉴于航班成本对当地居民来说不是一个因素,酒店在未来的某些假期期间取消预订的数量可能会减少。另一方面,取消预订也可能上升,因为当地客户在住宿方面可能有更多选择,例如,取消酒店预订,与朋友住在一起。

我的主要论点是,时间序列需要注意不确定性在时间序列预测中的作用,并且在预测时更愿意接受实验,也就是说,如果某些参数发生变化,预测会是什么样子?

例如,不是假设 ARIMA 模型中的季节效应会持续一段时间——如果它被显著改变,预测会是什么样子?

这种“情景分析”的预测方法在未来将变得越来越有价值。“预测过去”的预测没有什么价值,但那些能够预测“想象中的未来”的预测可能有很大价值。

结论

归根结底,预测是一种预测未来的工具。然而,鉴于存在许多潜在的未来,生成许多潜在的预测才有意义。我们常常错误地认为未来将永远和过去一样。时间序列分析的真正价值在于“情景规划”——识别我们面前的潜在未来,并采取行动防范极端情景。

免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

参考

如何:用颜色编码的分段条形图

原文:https://towardsdatascience.com/how-to-a-color-coded-segmented-bar-graph-9e09b5bad3b0?source=collection_archive---------69-----------------------

最*我做了很多新冠肺炎分析。上周末,我想为我正在撰写的关于 T4 新冠肺炎封锁和流动性水*的博客文章制作一个特定类型的图表。我想要一个如下的条形图:

  1. 每个条形反映一个国家在新冠肺炎封锁期间经历的总流动性下降;为此,我使用了谷歌和苹果的移动数据集。
  2. 对每个条形进行分段,以便每个分段反映其封锁的连续一周内的流动性下降;换句话说,如果锁定持续 10 周,那么酒吧将由 10 个部分组成。
  3. 每一条都用颜色编码,以反映该国的人均死亡人数。

本着“这是我之前做的一张” …这是我最终创建的图表,接下来我将解释我是如何制作它的。

一些错误的开始…

起初,我认为这是一个堆积条形图的变体,但是经过一番挖掘和研究,我得出结论,这不是正确的方法。虽然堆积条形图可以提供分段效果,但不可能单独给条形着色;更确切地说,堆积条形图 着色,使得每个条形图由一组有序的多色段组成。接下来,我想一个热图可能会有用,但那也不起作用,因为热图使用固定大*的单元,所以我们不能产生不同大*的片段。

最后,我想出了一个更加定制的解决方案,通过一次一段地构建每个条形,并给条形着色。这样做的好处是每个条和段都是可单独寻址的,因此控制大*和颜色很简单。在接下来的内容中,我将逐步描述所采用的方法,代码和样本数据可以从这里下载。

样本数据集

为了解释这一点,我们需要一些样本数据。以下是新冠肺炎一级防范禁闭的数据,这些数据最初推动了该图表的开发。每行对应一个国家。有一列是该国(截至 2020 年 5 月中旬)每百万人死亡人数的对数(基数为 10),还有一组列是一个国家封锁期每周的*均流动性下降百分比;这些周数是基于该国第 100 例确诊病例以来的周数。

例如,奥地利的死亡人数约为百万分之 70(log 10(70)~ 1.84),封锁始于奥地利记录第 100 例(第 0 周)的一周,其流动性下降了 8%(相对于封锁前的水*),在接下来的几周内,奥地利的流动性水*下降了 70%。柱状图中的分段高度将对应于这些单个的每周流动性下降。

顺便提一下,我们在这里使用死亡率的对数只是为了强调死亡率之间的差异,因为每百万人的原始死亡率值范围很广(从<5 to > 500),对数标度有助于将这些值“分散”一点。

一段一段地绘制条形

为了构建我们的分段棒线,下面的 plot_segments 函数在适当的 x 轴坐标上分别绘制每个棒线的分段,为每个周值创建一个单独的棒线分段,并将这些分段堆叠在一起以生成最终的棒线。然后,通过将 plot_segments 应用于每周数据集的每一行,可以创建完整的条形图;我们使用*猫申请功能来做到这一点。

这是由上述代码产生的基本分段条形图。根据我们的需求,每个国家/地区由一个分段的条形表示,每个分段对应于每周的流动性下降。不同大*的段表示国家之间和国家内部几周的差异,柱的总高度是每周流动性下降的总和。

当然,我们可以通过改变条的宽度和/或通过调整线宽来调整片段的大*(以控制片段之间的间距);通过改变边缘颜色,我们也可以改变分割的颜色。事实上,我们甚至可以通过使用定制的 Matplotlib 补丁来为我们的线段使用不同的形状,而不是简单的条,但那是另一天的事了。

对条/段进行颜色编码

现在我们有了基本的分段条形图,它为我们提供了对单个分段的控制,是时候使用相应国家的一些属性来给每个条形的分段着色了;在这种情况下,我们使用每个国家的(对数)死亡率作为该属性。

最好的方法是使用一张与我们的(对数)死亡率成比例的彩色地图(连续的颜色)。我们为此使用 Matplotlib 的 coolwarm 彩色地图,它提供了从红色到蓝色的良好过渡,我们缩放它,以便最高死亡率映射到红色,最低映射到蓝色。

然后,我们创建一个简单的字典,将一个国家的名称与其对应的颜色联系起来。由此产生的调色板,按照我们数据框架中的国家顺序排列如下,以供参考

现在我们有了自己的颜色,我们需要做的就是改变 plot_segments 函数的一行,这样我们就可以使用颜色字典中分配给当前国家的颜色,而不是使用固定的颜色。我们还应该将颜色字典传递到函数中,并记住 x 是国家名称。

现在我们有了:我们的分段条形图根据每个国家的死亡率进行着色。我们需要的最后一件东西是一个带标签的钥匙,用它来解释颜色,这样一看我们就可以估计对应于特定颜色的死亡率。

添加颜色键

为此,我们使用 Matplotlib colorbar ,它将在缩放后的彩色地图中显示连续的颜色。我们在主条形图上方显示一个水*的颜色条,但是,以类似的方式,我们可以在其中一个边上显示一个垂直的颜色条。

为了便于定位,我们给颜色条指定了自己的轴,并使用 gridspec 排列颜色条和条形图轴,如下所示。然后,在绘制分段条形图之后,我们添加颜色条,设置其标题,并添加其刻度标签。因为我们使用死亡率的对数(基数为 10 ),所以在将它们显示在颜色条上之前,我们将它们转换回常规死亡率;在最终版本中,我们可能希望为这些死亡率选择舍入数(例如,5、10、25、100、250、500),但在这里,我们使用的是等间距刻度。

这里是最终的代码

完成的图表…

结论

这就完成了彩色编码分段条形图的开发。根据需要,每个条形由一组单独大*的段组成,每个条形可以单独进行颜色编码,以反映条形的一些独立属性。有没有我错过的更好的方法?如果是的话,我很想听听。

照目前的情况来看,这是一个非常灵活的解决方案。通过改变段之间的间隙的厚度(如上所述使用线宽,或间隙的颜色(使用边缘颜色,可以很容易地调整分段,当然,通过调整条的宽度和/或增加间隙计算,条/段的宽度和它们之间的间隙可以以通常的方式改变。甚至可以通过使用不同形状的贴片(圆形、椭圆形等)来改变单个片段的形状。).

如何用量化加速和压缩神经网络

原文:https://towardsdatascience.com/how-to-accelerate-and-compress-neural-networks-with-quantization-edfbbabb6af7?source=collection_archive---------5-----------------------

从浮点数到整数

神经网络是非常耗费资源的算法。它们不仅会导致巨大的计算成本,还会消耗大量的内存。

即使商用的计算资源与日俱增,优化深度神经网络的训练和推理也是极其重要的。

如果我们在云中运行我们的模型,我们希望最*化基础设施成本和碳足迹。当我们在边缘上运行我们的模型时,网络优化变得更加重要。如果我们必须在智能手机或嵌入式设备上运行我们的模型,硬件限制就会立即显现出来。

由于越来越多的模型从服务器转移到边缘,减少大*和计算复杂性是必不可少的。一个特别而迷人的技术是量化,它在网络内部用整数代替浮点数。在这篇文章中,我们将会看到它们的工作原理,以及你如何在实践中做到这一点。

量化

量化背后的基本思想是,如果我们将权重和输入转换为整数类型,我们会消耗更少的内存,并且在某些硬件上,计算会更快。

然而,有一个权衡:有了量化,我们可能会失去相当大的准确性。我们稍后将深入探讨这个问题,但首先让我们看看为什么量子化有效。

整数与浮点运算

你可能知道,你不能简单地在内存中存储数字,只能存储 1 和 0。因此,为了正确地保存数字并使用它们进行计算,我们必须对它们进行编码。

有两种基本表示:整数浮点数。

整数用以 2 为基数的数制来表示它们的形式。根据使用的位数,一个整数可以有几种不同的大*。最重要的是

  • int8short (范围从-128 到 127),
  • uint8 (范围从 0 到 255),
  • int16long (范围从-32768 到 32767),
  • uint16 (范围从 0 到 65535)。

如果我们想表示实数,我们必须放弃完美的精度。举个例子,数字 1/3 可以用十进制形式写成0.33333……,有无限多的数字不能在内存中表示的。为了处理这种情况,引入了浮点数字

本质上,浮点数是形式中数字的科学表示法

其中基数最常见的是 2,但也可以是 10。(就我们的目的而言,这无关紧要,但我们假设它是 2。)

来源:*基百科

与整数类似,浮点也有不同的类型。最常用的有

  • 浮点 16 (1 位符号,5 位指数,10 位有效位,所以共 16 位),
  • 单个浮点 32 (1 位符号,8 位指数,23 位有效位,所以总共 32 位),
  • doublefloat64 (1 位符号,11 位指数,52 位有效位,所以总共 64 位)。

如果您尝试以科学的格式将两个数字相加相乘,您会发现浮点运算比整数运算稍微复杂一些。实际上,每次计算的速度很大程度上取决于实际的硬件。例如,台式机中的现代 CPU 进行浮点运算的速度和整数运算一样快。另一方面,GPU 更适合单精度浮点计算。(因为这是计算机图形最普遍的类型。)

在不完全精确的情况下,可以说使用 int8 通常比 float32 更快。然而,默认情况下, float32 用于神经网络的训练和推理。(如果您以前训练过网络,并且没有指定参数和输入的类型,则最有可能是 float32 。)

那么,如何将一个网络从 float32 转换成 int8

量化网络

这个想法原则上很简单。(实际上没有那么多,我们后面会看到。)假设你有一个输出在 [-a,a) 范围内的层,其中 a 是任意实数。

首先,我们将输出缩放到 [-128,128) ,然后我们简单地向下舍入。也就是说,我们使用变换

举个具体的例子,我们来考虑下面的计算。

这里的值的范围在 (-1,1) 中,所以如果我们量化矩阵和输入,我们得到

这是我们看到结果不是一个 int8 的地方。由于两个 8 位整数相乘是一个 16 位整数,我们可以通过转换对结果进行反量化

为了获得结果

如你所见,这不是我们最初拥有的。这是意料之中的,因为量子化是一种*似,我们在这个过程中会丢失信息。然而,这有时是可以接受的。稍后,我们将看到模型性能是如何受到影响的。

使用不同类型的量化

我们已经看到,量子化基本上是在操作层面上发生的。从浮动 32int8 并不是唯一的选择,还有其他选择,比如从浮动 32浮动 16 。这些也可以合并。例如,您可以将矩阵乘法量化为 int8 ,而将激活量化为 float16

量子化是一种*似。一般来说,*似值越接*,预期的性能衰减就越*。如果你把所有的东西都量化为浮点,你把内存减半,可能你不会损失精度,但不会真正获得加速。另一方面,用 int8 量化可以导致更快的推断,但性能可能会更差。在极端情况下,它甚至不起作用,可能需要量子化意识训练。

实践中的量化

在实践中有两种主要的方法来进行量子化。

  1. 后训练:使用 float32 权重和输入训练模型,然后量化权重。它的主要优点是应用简单。不利的一面是,它可能会导致精度损失。
  2. 量化感知训练:训练时量化权重。这里,甚至为量化的权重计算梯度。当应用 int8 量化时,这有最好的结果,但它比另一个选项更复杂。

TensorFlow Lite 中的量化方法及其性能。来源: TensorFlow Lite 文档

TensorFlow Lite 中几种卷积网络架构的量化方法比较。来源: TensorFlow Lite 文档

实际上,性能很大程度上取决于硬件。量化为 int8 的网络在专门用于整数计算的处理器上会表现得更好。

量子化的危险

虽然这些技术看起来很有前途,但在应用时必须非常*心。神经网络是极其复杂的函数,尽管它们是连续的,但它们可以非常迅速地变化。为了说明这一点,让我们重温郝力等人的传奇论文 可视化神经网络的损失景观

下面是没有跳跃连接的 ResNet56 模型的损失情况的可视化。自变量代表模型的权重,而因变量是损失。

ResNet56 的损失情况可视化,无跳跃连接。来源: 可视化神经网络的损失景观 郝力等人。

上图完美地说明了这一点。即使只是稍微改变一下重量,损失的差异也是巨大的。

在量化时,这正是我们正在做的:通过牺牲压缩表示的精度来逼*参数。不能保证它不会在结果中完全搞乱模型。

因此,如果你正在为安全至关重要且错误预测损失巨大的任务构建深度网络,你必须极其*心。

现代深度学习框架中的量化

如果您想尝试这些技术,您不必从头开始实现。最成熟的工具之一是 TensorFlow Lite 的模型优化工具包。它包含了尽可能缩*模型的方法。

您可以在下面找到文档和介绍性文章。

[## 模型优化| TensorFlow Lite

边缘设备通常具有有限的内存或计算能力。可以对模型进行各种优化,以便…

www.tensorflow.org](https://www.tensorflow.org/lite/performance/model_optimization) [## TensorFlow 模型优化工具包简介

我们很高兴在 TensorFlow 中推出一个新的优化工具包:一套技术,开发者,无论是…

medium.com](https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3)

PyTorch 还支持多种量化工作流程。虽然它目前被标记为实验性的,但它是完全可用的。(但是预计 API 会改变,直到它处于实验状态。)

[## PyTorch

Raghuraman Krishnamoorthi、James Reed、Min Ni、Chris Gottbrath 和 Seth Weidman 重要的是要让效率…

pytorch.org](https://pytorch.org/blog/introduction-to-quantization-on-pytorch/) [## (实验)在 LSTM 单词语言模型上的动态量化

编辑描述

pytorch.org](https://pytorch.org/tutorials/advanced/dynamic_quantization_tutorial.html) [## 关于 BERT - PyTorch 教程 1.5.1 文档的(实验性)动态量化

提示为了充分利用本教程,我们建议使用 Colab 版本。这将允许您试验…

pytorch.org](https://pytorch.org/tutorials/intermediate/dynamic_quantization_bert_tutorial.html)

其他优化技术

除了量化,还有其他技术来压缩你的模型和加速推理。

修剪

一个特别有趣的是权重修剪,在训练过程中,网络的连接被反复删除。(或者某些变奏中的后期训练。)令人惊讶的是,在某些情况下,您甚至可以移除 99%的权重,但仍然具有足够的性能。

如果你感兴趣,我写了一份关于该领域里程碑的详细总结,并讨论了最新的发展水*。

[## 你能移除 99%的神经网络而不损失准确性吗?

权重剪枝简介

towardsdatascience.com](/can-you-remove-99-of-a-neural-network-without-losing-accuracy-915b1fab873b)

知识的升华

第二个主要的网络优化技术是知识提炼。本质上,在模型被训练之后,一个*得多的学生模型被训练来预测原始模型。

知识提炼的师生模型。资料来源:郭建*等人的调查

Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 在他们的论文中介绍了这种方法,在神经网络中提取知识

[## 提取神经网络中的知识

提高几乎任何机器学习算法的性能的一个非常简单的方法是训练许多不同的模型…

arxiv.org](https://arxiv.org/abs/1503.02531)

提取已经被成功地应用于压缩 BERT,这是一个巨大的语言表示模型,在所有领域都有应用。通过蒸馏,该模型实际上可以在边缘使用,如智能手机设备。

这些努力的领导者之一是令人敬畏的拥抱脸,他们是 DistilBERT 论文的作者。

[## 蒸馏伯特,伯特的蒸馏版本:更*,更快,更便宜,更轻

随着大规模预训练模型的迁移学习在自然语言处理(NLP)中变得越来越普遍…

arxiv.org](https://arxiv.org/abs/1910.01108)

如果你对一个实际的例子感兴趣,你可以看看这篇关于上面提到的 BERT 蒸馏的文章,使用来自 PyTorch 生态系统的库 Catalyst。

[## 带催化剂的伯特蒸馏

如何用催化剂蒸馏 BERT?

medium.com](https://medium.com/pytorch/bert-distillation-with-catalyst-c6f30c985854)

摘要

随着神经网络从服务器转移到边缘,优化速度和大*极其重要。量化是一种可以实现这一点的技术。它将 float32 参数和输入替换为其他类型,如 float16int8 。使用专门的硬件,与未量化的模型相比,可以更快地进行推理。

然而,由于它的量化是一种*似,必须*心。在某些情况下,它会导致显著的精度损失。

与其他模型优化方法(如权重修剪和知识提取)一起,这可能是最快的使用方法。有了这个工具,你可以在不重新训练你的模型的情况下获得结果。在训练后优化是唯一选择的情况下,量化会大有帮助。

如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!

如何通过将自己置于合适的环境中来加速您的数据科学职业生涯

原文:https://towardsdatascience.com/how-to-accelerate-your-data-science-career-by-putting-yourself-in-the-right-environment-8316f42a476c?source=collection_archive---------20-----------------------

我感到增长数据科学技能停滞不前,直到我有了一个飞跃

像你一样,我觉得自己被困在了数据科学研究中

如果你像大多数人一样想进入数据科学领域,但仍然有其他职业,如学校、工作,你可能会发现很难坐下来专注于你的数据科学研究。

作为一名应用数学专业的全日制学生,我发现在忙于学业的同时提高自己的数据科学技能极其困难。即使我试图通过不花时间看电影、停止使用社交媒体、学习时关掉手机、早上 5 点起床来挤出更多时间学习数据科学,我仍然发现自己在成长中停滞不前。当看到数据科学实习的工作要求时,我感到更加绝望。

我极度渴望合适的环境

我意识到我的成长停滞不前,不是因为我缺乏意志力或能力,而是因为不在适合我想要获得的技能的环境中。我的大学里很少有人了解数据科学,更不用说拥有与之相关的技能了。我所有的课都与数学有关。我渴望有一个环境,在那里我可以被数据科学资源、该领域的专家、在数据科学方面有技能和热情的朋友所包围。

当看到一张关于在 CIMAT 的数据科学学期的海报时,我知道我找到了可以在数据科学领域成长的环境。我想象着这个新的环境是如何让我的幻想变成现实的。

事情的发生出乎我的意料。新的环境把我培养成了一名更好的 Python 程序员和拥有 700 多名追随者的数据科学作家。我还对机器学习算法和自然语言处理有深入的了解,并获得了多个实习和合作机会。

从这次经历中,我意识到环境有多重要,以及什么是我的数据科学成长的理想环境。我分享这些认识,希望你能够确定理想的环境,并自己创造或寻找一个。

照片由曼塔斯·赫斯塔文Unsplash 拍摄

其重点是利用数据科学工具产生影响的环境

构成技能发展良好环境的一个因素是他们是否专注于该技能。我被 CIMAT 吸引是因为它专注于与数据科学相关的三个领域的应用:数学、统计学和计算机科学。CIMAT 非常重视解决数学解决方案能够为科技发展做出巨大贡献的问题。

因为这种强调,我的讲座总是强调如何将我学到的知识应用到现实世界中。当我知道我的知识有多大影响力时,我感到兴奋和有动力。因此,这些知识被保留了下来,我能够创造性地运用我的知识

一个你被迫延伸和运用你的知识的环境

在有一个留学学期之前,我通过在线课程学习了与机器学习和数据科学相关的知识。即使我理解了这些知识,我也从来没有试图通过实施来检验我的知识。因此,新知识没有转化为实用知识。

但在 CIMAT,学生需要通过找到解决作业中相关问题的方法来应用理论课,并用 Python 实现。因为这个作业会计入我的分数,我需要认真对待它。从理解机器学习算法到从零开始实现它是很困难的。但后来,我对算法有了很好的理解,并能够从零开始实现带有二元交叉熵损失的梯度下降,或比较贝叶斯分类器和 K-最*邻

通过扩展我的知识,并以实现的形式强迫自己理解这些方法,我为这些方法打下了坚实的基础。我有信心,如果我在未来看到类似的方法或相关但更先进的方法,我将能够快速学习,并将适当的方法应用于新的问题。

一个规模*到足以获得个人即时反馈的环境

考虑理想环境的另一个因素是大*。许多人的目标是大公司或大大学。但是一旦他们到达那里,他们没有足够的关注来自他们社区的人来表达他们的想法或问题。

因为我所有的班级都很*(2 到 5 个学生),我有机会在课堂上问很多问题,而不用担心会打扰其他学生。我和我的助教建立了亲密的友谊,他们是微软和脸书的软件工程师实习生。有幸成为他们*班规模的学生之一,我发现很容易在他们的办公时间或午餐时间经常遇到他们,向他们提问或与他们讨论机器学习相关的话题。

另一个优势是在午餐时间与研究人员进行随机对话,并让来自世界各地的机器学习、计算机视觉、统计学和自然语言处理领域的领导者参与进来。作为为数不多的新生之一,他们欢迎我,并与我分享他们在研究中的发现和他们正在进行的工作。通过让自己置身于持续知识流的中心,我不断更新前沿研究领域,并为我的项目获得新的灵感。

对各自领域着迷的专家的聚集地

理想环境的另一个因素是让你周围的人对他们的领域有很好的了解,并对他们正在做的事情着迷。

通过在上学时参与自然语言处理研究,我有一个黄金机会与一位研究伙伴合作,他是 NLP 方面的专家,并在几次世界范围的 NLP 比赛和 Google Hash Code 2020 中获得了一等奖。作为研究伙伴,每当我陷入 NLP 项目时,我可以向他提问,并学到许多新的经验和技巧来开发更好的 NLP 模型。由于及时的反馈,我能够成倍地增长我的 NLP 知识。

我与一位同事建立了友谊,他不仅擅长数学,还擅长机器学习和编程。我们会交流我们在课堂上或从在线资源中学到的与数据科学相关的知识。通过与专家建立联系,我有朋友来讨论新的疯狂的数据科学想法,并合作将其转化为有影响力的产品。

结论

现在回过头来看我得到的机会,我很感激以前的自己意识到适合我的技能的环境,并有勇气去追求它。如果我没有跳到一个未知的地方,尤其是当每个人都警告我在墨西哥可能遇到的危险时,我不会在数据科学方面取得像现在这样的成功和知识。

通过我的故事,我希望你意识到一件事:如果你在数据科学领域的成长中感到停滞不前, it 可能不是因为你的能力,而是你所处的环境。因此,如果你发现自己陷入困境,也许你应该考虑把自己放在一个理想的环境中来发展你的新技能,即使这需要你有勇气推迟你正在做的事情,走出你的舒适区。

你不能在一个没有滋养你的环境中茁壮成长。

就像任何其他技能一样,获得不可用的数据科学技能的关键是与专家一起向他们学习,接触正确的资源,并应用您所学的知识。把自己放在正确的环境中,你会惊讶于自己成为该领域专家的不可阻挡的势头。

最后但并非最不重要,我还要感谢 CIMAT,感谢他在数据科学方面给了我一个丰富的学期。你可以在这里了解更多关于这个学期以及如何成为其中的一部分。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedInTwitter 上和我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何用支持向量机学习非线性数据集

支持向量机简介及其在非线性数据集上的应用

towardsdatascience.com](/how-to-learn-non-linear-separable-dataset-with-support-vector-machines-a7da21c6d987) [## 如何用 KDTree 搜索数据

给你一个任务,在一个巨大的数据集中查找某个范围内的数据,你能快速有效地找到它吗?

towardsdatascience.com](/how-to-search-data-with-kdtree-aad5c82ebd99) [## 自然语言处理中的卷积神经网络

什么是卷积神经网络,如何利用它进行情感分析?

towardsdatascience.com](/convolutional-neural-network-in-natural-language-processing-96d67f91275c) [## 如何用图论可视化社交网络

找出《权力的游戏》中的影响者

towardsdatascience.com](/how-to-visualize-social-network-with-graph-theory-4b2dc0c8a99f) [## 凸包:包装数据的创新方法

如何利用包装算法实现数据可视化

towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 用于机器学习的线性代数:求解线性方程组

代数是机器学习算法的底线机制

towardsdatascience.com](/linear-algebra-for-machine-learning-solve-a-system-of-linear-equations-3ec7e882e10f)

如何在 Python 上访问股票市场数据进行机器学习

原文:https://towardsdatascience.com/how-to-access-stocks-market-data-for-machine-learning-on-python-c69db51e7a0d?source=collection_archive---------35-----------------------

如果你想使用机器学习来交易股票,你需要创建一个股票市场数据的数据集。了解如何使用现成的代码轻松完成这项工作。

Unsplash 上由 Austin Distel 拍摄的照片

机器学习和人工智能开发的一个常见瓶颈是获得足够大的数据集,以便你可以用它来训练你的算法。特别是,如果你正在使用深度学习,你会知道获得足够的数据来正确训练神经网络有多难。[谷歌数据集搜索](http://google dataset search)不久前出现,大大改善了这个问题,但仍然很难找到一些主题的数据,如股票交易。

我以前遇到过这个问题,所以我知道这有多难。然而,就在昨天,我发现了这篇关于构建交易机器人的伟大文章,它很好地指向了最*一家名为羊驼的初创公司,该公司提供了一个构建交易算法的 API。有了这个 API,我们可以免费使用他们的 Python SDK 访问股票的实时和历史数据。在本文中,我将向您展示如何实现一个函数来下载股票数据并将其存储在 Pandas Dataframe 中,以便它可以用于机器学习。

注意:尽管我在下面的代码中使用了这个 API,但是您可以选择您喜欢的任何其他 API,并根据需要随意修改代码。

安装必要的库并连接到服务器

首先:在这里创建一个新账户。然后转到纸质账户(模拟器),点击 API 键上的“查看”。最后,点击“生成密钥”,你将得到你的密钥 id 和你的秘密密钥。有了这些密钥,您将从 Python 连接到服务器,并能够下载我们想要的数据(您可以做更多的事情,但在本文中,我们将只下载数据)。

现在,在您的终端上执行“pip install alpaca_trade_api ”,您就可以使用以下代码连接到 api 了:

你可以在 Github 上看到官方文档和代码。

下载资产的数据

我们将用于下载资产数据的基本调用如下:

如您所见,我们使用上面实例化的管理器来调用方法 get_barset ,该方法返回一组条(或者您甚至可以将它们想象为烛台),并具有以下参数集:

  • Symbols:这是一个字符串列表,其中包含我们要下载数据的符号。
  • 时间范围:表示数据时间性的字符串,可以是 1 分钟、5 分钟、15 分钟或 1D。
  • Limit:一个介于 1 和 1000 之间的数字,表示我们将下载的最大条数(最大值为 1000)。
  • 日期(开始-结束,之后,直到):iso 格式的日期。

这样,您已经可以从股票中下载数据,但是如果您想要获得大量数据(您可能会这样做),您将必须实现一些代码来处理分步分解时间并为每个步骤进行调用,否则,您将很快达到 1000 的限制(想象一下,如果您使用 1 分钟的临时时间,您将被限制为每次调用 1000 分钟或大约 16 个*时)。

长期下载数据

我自己实现了处理这个问题的代码,我把它放在这里,因为我很好:))

打破日期中的句点并对其进行格式化

首先,我们需要将周期分解成更*的步骤,这样我们就可以确保不会达到 API 返回的 bar 的限制。为此,我创建了 break_period_in_dates_list 方法,它采用 datetime 对象形式的 start_date 和 end_date,以及带有每步天数的 int。每个步骤的天数不能太大,这一点很重要,因为否则您将达到限制,然后您将无法获得您想要的所有数据。该方法返回一个日期元组列表,其中有开始日期和结束日期。

下一步是按照 API 期望的那样格式化日期。在 format_dates 方法中,我们正是这样做的,并以预期的格式返回列表。

创建数据框架

现在,一旦我们得到了条集,我们需要用它创建一个*猫数据框架。具体来说,每个 barset 都是一个对象,其属性在这里定义为。在下面的方法中,我们转换字典列表中的条集列表,然后用它创建一个 Pandas 数据帧。

实际下载数据

最后,我们准备下载我们的数据。为此,我创建了 download_data 方法,该方法将 REST 管理器、我们需要的数据的符号列表、开始和结束日期以及最后将数据存储为 csv 文件的文件名作为参数。请注意,我选择将时间段分为 10 天,这对于示例中使用的 5 分钟临时时间来说很好,但是如果您更改临时时间,应该更改该参数。

完全码

作为总结,在这里你可以看到完整的代码:

我希望你发现这篇文章很有用,现在可以为你的机器学习项目获得所有的市场数据。感谢您的阅读!😃

如何在 BigQuery 中准确计算年龄

原文:https://towardsdatascience.com/how-to-accurately-calculate-age-in-bigquery-999a8417e973?source=collection_archive---------8-----------------------

Unsplash 上由 Helloquence 拍摄的照片

在分析客户数据中,年龄是基本且重要的人口统计数据字段之一。通常,年龄不是从客户那里收集的数据点,而是他们的出生日期。然后据此计算年龄——要么是客户某一时刻的年龄,要么是他们今天的年龄。

不幸的是,在 Bigquery 上没有计算年龄的标准方法,这导致了派生一个基本概念的不同方法。对于开发者和分析师之间的每一个独特的计算,结果之间会有差异。

下面我介绍不同的年龄计算,以及如何使用 SQL 在 BigQuery 中精确计算。在这些例子中,我将使用相同的出生日期(我的)。

基本年龄计算

计算年龄的最基本方法是使用 DATE_DIFF 函数来获得两个日期之间的年数。但是,这个函数只是减去了年份,而不管出生日期是否已经过去,这是完全不准确的。

WITH data AS (SELECT CAST('1993-04-29' AS DATE) AS date_of_birth)SELECT 
  DATE_DIFF('2020-03-21',date_of_birth, YEAR) AS age
FROM data

结果:27

我们可以使用相同的函数来计算日期和出生日期之间的天数差,然后除以 365,而不是使用年数差。FLOOR 用于删除*数位。这在快速分析和准确度不太重要的情况下非常有用。

SELECT 
  FLOOR(DATE_DIFF('2020-03-21',date_of_birth, DAY)/365) AS age
FROM data

结果:26

此计算假设所有年份都有 365 天。由于这没有考虑闰年,年龄将在实际出生日期前几天取整。年龄向上取整的天数就是已经过去的闰年数。

FLOOR(DATE_DIFF('2020-04-27',date_of_birth, DAY)/365) AS age

结果:27

针对闰年进行调整

将除数中的 365 替换为 365.25 会得到更准确的结果。

FLOOR(DATE_DIFF('2020-04-27',date_of_birth, DAY)/365.25) AS age

结果:26

然而,在闰年有影响的特定年龄,结果变得不太准确。

FLOOR(DATE_DIFF('2011-04-29',date_of_birth, DAY)/365.25) AS age

结果:17

在这里,年龄实际上被向下舍入了。在这种情况下,结果应该是 18。虽然误差影响极*,并且这被证明是更好的选择,但在某些情况下,精度非常重要。

准确无误

在市场营销中,不正确地计算年龄可能会有法律影响,或者只是非常糟糕的客户体验。在这个看似复杂(其实不是)的计算中,它使用了几个函数。查询的第一部分减去两个日期之间的年份。如果通过比较月份和日期,出生日期已经过了另一个日期,则第二部分将减去 1 年。

DATE_DIFF('2020-03-21',date_of_birth, YEAR)
- 
IF(EXTRACT(MONTH FROM date_of_birth)*100 + EXTRACT(DAY FROM date_of_birth) > EXTRACT(MONTH FROM '2020-03-21')*100 + EXTRACT(DAY FROM '2020-03-21'),1,0) AS age

结果:26

使用这种计算方法的缺点是,每次需要计算年龄时都要重复计算,时间很长,而且相当麻烦(除非您将查询保存在某个地方)。

执着的 UDF

BigQuery 现在允许持久的用户定义函数。这使得重用相同的代码并在整个项目中保持一致变得更加容易。作为一个已经编码了几年的人,每次需要获得年龄时,我都必须使用不同的函数并编写一个很长的查询来获得一个准确的年龄,这是一种挣扎。相反,我创建了一个 UDF,这样我就可以在每次分析时引用相同的代码。

CREATE OR REPLACE FUNCTION workspace.age_calculation(as_of_date DATE, date_of_birth DATE) AS (
DATE_DIFF(as_of_date,date_of_birth, YEAR) - 
IF(EXTRACT(MONTH FROM date_of_birth)*100 + EXTRACT(DAY FROM date_of_birth) > EXTRACT(MONTH FROM as_of_date)*100 + EXTRACT(DAY FROM as_of_date),1,0))

在这个 UDF 中,有两个输入-出生日期和您想要计算年龄的截止日期。这为用户提供了重用代码和不同用例的灵活性。

SELECT workspace.age_calculation('2020-03-21','1993-04-29')

结果:26

有趣的是,年龄是一个如此重要的属性,却没有标准的计算方法,无论是在分析还是锁定客户方面。然而,使用 BigQuery 函数的组合给出了更好的选择。我希望这有助于分析师在他们的数据中使用标准和准确的方法计算年龄。

如何在 FAANG 公司的数据可视化面试中胜出?

原文:https://towardsdatascience.com/how-to-ace-data-visualization-interviews-at-faang-companies-2c29145378d?source=collection_archive---------16-----------------------

蒂姆·高在 Unsplash 上拍摄的照片

说到技术面试,我们都会想到 SQL,编码,或者统计面试。然而,有一个领域也很重要,那就是数据可视化。这篇文章是关于如何在数据可视化面试中胜出的。

几个月前,我被一家 FAANG 公司选中,进入了商业分析师的最后一轮。共有四次访谈,包括两次行为访谈、一次数据可视化访谈和一次数据分析访谈。虽然我最终没有得到这份工作,但我的招聘人员说,他们对我的数据可视化面试的反馈非常积极。因此,我想我至少在那次面试中获得了“及格”。我想在这篇文章中与你分享我是如何在数据可视化面试中胜出的。

数据可视化面试持续了 45 分钟。该团队希望评估候选人设计有效可视化的能力,并了解他们设计各种类型可视化的经验。以下是我收到的问题以及我解决这些问题的方法。

照片由威廉·艾文Unsplash 上拍摄

你的数据可视化理念是什么?

我打赌你们都会同意我的观点,这是一个非常宽泛的问题。每个人都能想出不同的答案。我的数据可视化理念是,我的可视化需要尽可能地适应目标受众的需求。没人看的时候仪表板就没用了。

我确保我清楚地定义了目标受众。我与他们密切合作,了解他们对可视化指标和类型的需求。我密切跟踪他们,及时了解他们需求的变化。

告诉我一个你非常引以为豪的数据可视化项目?

这个问题是面试前最期待的问题,所以我已经准备了两到三个故事,练习的非常认真。对于每个故事,明星法(情境——任务——行动——结果)总是管用的。我谈到了一个非常具体的情况,当时我不得不建立一个仪表板。我描述了仪表板的目的、主要利益相关者(也称为目标受众)、我如何与利益相关者一起制定指标,以及我制作了哪些类型的可视化效果。

我还分享了最初的计划没有按预期进行的时候,当利益相关者的需求发生变化时,以及我如何跟进利益相关者以确保仪表板按他们预期的方式工作。我通过分享我在那次经历后获得的关键学习点来总结我的故事。

你使用什么数据可视化工具?

在我过去的角色中,我使用 Tableau 作为数据可视化的主要工具,所以 Tableau 对我来说是一个显而易见的答案。我描述了我使用的高级 Tableau 函数或特性。主要是讲一个你擅长的数据可视化工具,而不是罗列一大堆你学习或者了解的工具。

然而,Tableau(或其他类似的数据可视化软件)并不是可视化数据的唯一方式。使用 Google Sheets 绘制图表也可以!这取决于目标受众和可视化数据的目的。例如,当我需要一种快速的方法来可视化数据集时,当我的数据集需要在一组用户之间共享时,或者当我的利益相关者是非技术数据用户时,我使用简单的 Google Sheets 图表。

数据可视化案例研究

问题是:“假设我们公司在美国有几个办事处。我们想知道这些办公室的表现,以便为我们的员工优化空间。你的工作是构建一个仪表板来显示办公室的利用率。

我收到了数据集的预览。我不得不使用谷歌绘图建立一个虚拟的仪表板。在 Google Sheets 中绘制图表时,您可以使用类似的方法在 Google Drawings 中绘制图表。

在开始可视化步骤之前,我问面试官这个仪表板是给谁用的。仪表板是为管理层经理准备的。对我来说,这意味着我需要显示最高级别的指标,以便经理们通过查看这个快照就知道发生了什么。然后,我用头脑风暴的方法展示了这些指标。我想出了三到四个衡量标准。

我不仅制作了图表和图形。对于每个度量标准,我解释了使用这种类型的可视化而不是其他类型的背后的基本原理。大声说出这个过程不仅有助于展示思考过程,还让我意识到,与我首先想到的图表相比,其他类型的图表更好地表达了我的指标。此外,图表和图形不仅仅是饼图、条形图或折线图。您可以使用排版,这意味着在这种情况下显示纯关键数字。仪表板用户可以立即获得重要的数字,而不必从图表或图形中查找。

没有过滤器,仪表板是不够的。我花时间思考合适的过滤器,画出它们,并向面试官解释。一些重要的过滤器包括日期范围、位置/市场和时间频率(用户可以选择每天、每周或每月查看)。

毕竟,我总结了我的仪表板的要点,包括目标受众、重要指标、可视化类型和过滤器。我还提到了一种潜在的方法,如果数据集中有更多的变量或涉及更多的利益相关者,可以在将来进一步开发仪表板。

结论

我的面试经历是独一无二的,绝不可能对每个人都一样。它作为一个单一的数据点,不应该推广到所有的数据可视化访谈。我希望你能从我的经历中获得一些见解和观点,以帮助你调整面试准备,并赢得数据可视化面试。

原载于 2020 年 10 月 11 日【http://baovinhnguyen.com】

如何在机器学习工作面试中获得家庭作业

原文:https://towardsdatascience.com/how-to-ace-home-assignments-for-machine-learning-job-interviews-ac510830baa7?source=collection_archive---------52-----------------------

在这篇文章中,我的目的是提供一个清晰的画面,当求职者被要求在面试过程中做一个基于机器学习(ML)的家庭编码任务时,对他有什么期望。

作为一名高级 ML 工程师,我不得不审查几十个这样的任务,所以我相信我很清楚申请人通常会犯什么类型的错误。我愿意帮助你在申请下一份工作时避免这些错误。

本质上,你需要努力实现以下 4 个目标:

  1. 创建一个对任务有效且合理的 ML 模型
  2. 清楚地展示和分析你的结果
  3. 展示你的智慧和对细节的关注
  4. 编写干净、易于理解、可重复、几乎没有错误的代码

不管出于什么原因,很多初级申请人似乎只专注于第一个目标。让我们更详细地研究一下每一个问题,看看它们涉及到什么。

作者图片

1.创建一个对任务有效且合理的 ML 模型

总的来说,这部分真的是任务相关的,所以你需要了解你的东西。

一些一般性见解:

  • 确保你理解了任务。如果你不确定你需要做什么,通常可以要求澄清。
  • 根据需要进行一些数据清理和特征工程。不要只是把你的数据扔进一个模型,然后希望它能给你一个好的结果。
  • 始终遵循最佳的机器学习实践。在最基本的方法中,确保将您的数据适当地分成训练/验证/测试集。除了对模型的性能进行最终评估之外,不要将您的测试集用于任何事情,并确保没有数据从它泄漏到训练集中。不要过度拟合你的模型,使用验证集来知道何时停止训练。
  • 当不确定使用哪种 ML 技术时,总是选择一种你相当熟悉的方法,以避免令人尴尬的错误。不要试图用最新的技术或框架给面试官留下深刻印象,除非你确信你理解它。一个实现良好的线性回归模型(假设它完全适合这项任务)比一个完全处理不当的超级卷积递归神经网络或其他什么要好。
  • 你通常不会有很多时间做这些作业,所以倾向于选择简单的解决方案,除非你确信你有足够的时间来实现更复杂的方案。在任何情况下,您都可以从一个非常基本的模型开始,然后将其用作进一步改进的基线。有时你会发现简单的方法也一样好,而且计算效率更高。或者,如果你不能完成你的复杂模型,至少你会有东西可以展示。
  • 如果这个任务有实际意义,考虑你的模型将如何被使用,以及它的计算和数据可用性需求是否有意义。这样做将表明你意识到现实生活中的限制,并有能力处理它们。
  • 除非作业规则禁止,否则试着在网上搜索一下,看看其他人是如何解决类似问题的。然而,不要不加分析就复制粘贴他们的代码,这并不是因为面试官想看你自己的编码技能(毕竟,很多样板代码经常被重用),而是,更重要的是,因为 ML 代码往往真的依赖于任务和数据的细节,对一个问题有效的代码可能需要对另一个问题进行一些调整。

2.清楚地展示和分析你的结果

信不信由你,但是我遇到过很多这样的例子,求职者会把他们的代码发给我,而没有任何解释。他们希望我做什么,自己运行并为他们分析输出?

结果的展示和分析是任何 ML 工程师或数据科学家的核心技能,所以确保你投入足够的时间来展示这些。

特别是:

  • 陈述你想要达到的目标。
  • 至少对你的数据做一些探索性的分析,并报告任何相关的发现。这也将帮助您创建更好的模型。
  • 解释你为什么选择你使用的模型。
  • 清楚地陈述你使用了哪些指标,为什么,以及你的模型的性能是基于这些指标的。
  • 根据模型的性能评估模型的质量。至少,选择一个简单的基线解决方案(比如,总是预测分类问题中最流行的类,或者在进行时间序列预测时预测最*的值),并确保您的模型可以胜过这种方法。
  • 一定要看看你的模型的一些实际预测,验证它们是合理的。有时人们提交不工作的模型并声称性能良好,因为他们的度量计算功能也有错误😄。不要成为那样的人。
  • 如果可以,继续创建一些很酷的可视化效果,但是要确保这不会以没有足够的时间来实际构建一个好的模型为代价。
  • 准备好详细讨论你的工作。

3.展示你的智慧和对细节的关注

聪明和专注是数据科学家最重要的品质之一。每一个不*凡的问题都需要思考。没有人愿意雇佣一个简单地学习了一堆黑盒模型,然后把数据扔进去,希望能有好的结果的人。

展示这些品质的一些方法是(其中大多数也只是好的机器学习):

  • 确保你注意到了任务描述中的每一个细节。如果你最终做了与你被要求做的事情不同的事情,那就不好看了。再次,如果有疑问,问。
  • 当执行探索性分析时,真正检查您的数据。如果是图像,就看一堆。如果是文字,读一部分。如果是表格数据,创建图表来查看它的样子以及是否有任何异常。清楚地理解数据的结构将会产生更好的特征工程,并且会使你看起来更聪明。
  • 当处理丢失或损坏的数据时,请确保使用您的大脑。不要用不可行的值替换缺失的数据(在我们的作业中,有不少申请人在心率数据中填了零😄).
  • 花足够的时间讨论你的结果。更改您的模型或其超参数会如何影响性能?运行它的计算要求是什么?生产中可能出现哪些陷阱?诸如此类。

4.编写干净、易于理解、可重复、几乎没有错误的代码

由于你没有太多的时间,通常不期望你交付产品级代码(除非在作业中指定)。然而,如果可能的话,确保你的代码易于阅读,并且可以在面试官的机器上运行。

  • 在您自己的计算机上运行您提交的确切代码,并确保它生成您所声称的结果。人们经常提交一个不工作的代码版本。
  • 列出你使用的环境的细节(例如 Python 3.6.8,TensorFlow 2.3.0 等),这样面试官就可以运行你的代码。
  • 如果您的任何算法(例如,神经网络或决策树)涉及随机初始化,请确保为可重复性设置一个特定的随机种子。
  • 将你的代码放入一个 Jupyter 笔记本 中通常是一个好的选择(除非在作业中另有建议),因为它允许你在代码旁边显示每个单元格的输出。
  • 确保你的代码组织良好,每个部分都易于理解。必要的时候写点评论。不要过分使用它,你不必对每一行都进行注释(比如,如果你的行是“x += 1”,不要写注释“#给 x 加 1”,它只是看起来很傻)。
  • 除非你想在你的报告中讨论,否则删除你在最终解决方案中根本不会用到的函数或代码块。

我希望上面的讨论能帮助你做好下一个 ML 家庭作业!祝你好运!

如何赢得数据可视化项目:成功的 3 个步骤

原文:https://towardsdatascience.com/how-to-ace-your-data-visualization-project-3-steps-for-success-cf325839b0fe?source=collection_archive---------43-----------------------

这并不总是关于 viz 技能

翁贝托Unsplash 上拍摄的照片

(注:所有观点均为本人)

最*,我一直在从事不同的数据可视化项目,并能够记下关键的不同成功因素,使某些项目达到或超过客户的期望。

核心可视化技能当然很重要(例如,如果有人要求你提供一个 Tableau 仪表板,精通 Tableau 自然会有所帮助),但是考虑到技术能力的一定门槛,还有其他一些决定项目成败的关键因素,这些因素落后于纯粹的技术技能,我觉得它们的重要性被忽视了,没有被充分提及。

在这篇简短的文章中,我强调了我学会的 3 个步骤,因为我认为它们与交付成功的数据可视化项目非常相关

1)了解数据模型

在可视化您的数据之前,最好对数据的结构、组织、收集、处理和管理有一个清晰的了解,即使您是数据团队的一员,而您只负责最终交付的可视化部分。

这也许是最关键的一步。如果你对后端的数据没有一个清晰的视图,你将如何在前端开发一个整洁的可视化?

来源:Talend.com

我在这里的主要建议是花所有必要的时间与您的数据工程师/云架构师/数据库管理员在一起,以确保您对项目范围内的数据建模概念的掌握尽可能牢固。

像下面这样的问题可以帮助您缩*关键元素的范围,甚至在您开始绘制和可视化数据之前,让您到达您需要的位置:

  1. 数据是如何组织的?模型中的关键关系是什么?
  2. 数据是如何处理的?
  3. 数据延迟水*如何?你收到实时信号了吗?如果没有,更新频率是多少?
  4. 数据存放在哪里?哪些是关键的数据来源?
  5. 谁负责数据管道中的各个步骤?在这个过程中,第三方供应商是否有责任?
  6. 你和客户对你要使用的关键变量的术语一致吗?

在这里不要给错误留有余地,这对于将项目引向正确的方向并避免在时间紧张时出错是至关重要的。

2)全面了解需求

确保你和客户在最终目标和交付物的形式上尽可能保持一致。

这归结为深入了解业务环境和客户面临的问题,并确保在工作中不放过任何一个需求。

Unsplash 上由 Austin Distel 拍摄的照片

询问大量问题并进行澄清是非常重要的,这样才能与你的对手保持完全一致,并减少出现以下情况的可能性:

  1. 交付不包含项目范围的完整 宽度 的可视化(即,省略关键业务指标和关系的表示)
  2. 交付一个可视化的项目,该项目并未涵盖项目范围的全部 深度 (即,仅解决高层业务关系,而非低层业务关系)

3)预测客户的需求,提供超出预期的服务

如果时间允许,最好总是努力超越客户的期望,不仅要让客户满意,还要让他们高兴。

照片由光圈老式Unsplash 上拍摄

这有点老生常谈,但在任何数据可视化项目中,你都可以试着让自己的思想处于一种对成品长期不满意的状态,从而让你的创造力在潜在方面流动,并进一步调整,这将有利于应用到你的工具/演示/仪表板的当前状态。

对客户和业务环境的深刻理解肯定可以帮助您发现可能需要进一步改进的领域,即使表面上并不需要。

这方面的例子包括:

  1. 添加增强的互动层
  2. 增加产品共享、*护和更新方式的灵活性
  3. 添加更低级别的功能,并能够向下钻取到尽可能多的相关视图
  4. 通过向最终产品添加额外的视觉层,帮助客户发现他们最初可能没有考虑到的进一步的相关性和业务关系

概括起来

拥有出色的数据可视化技能以及最常用工具和软件框架的技术知识是非常重要的,但是如果您能够:

  1. 从源头全面了解您的数据
  2. 完全符合客户的需求,站在他们的角度考虑他们打算如何利用你的数据洞察力
  3. 提前思考,提出创造性的改进和想法

您可以大大增加将数据可视化项目提升到下一个级别的机会。感谢阅读!

访问我的免费数据科学资源清单 这里

[## 通过我的推荐链接加入 Medium-Edoardo Romani

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

edo-romani1.medium.com](https://edo-romani1.medium.com/membership)

如何在虚拟办公室里度过新工作的第一周

原文:https://towardsdatascience.com/how-to-ace-your-first-week-in-a-new-job-in-the-virtual-office-e73564ae2830?source=collection_archive---------40-----------------------

一种帮助你在任何新的数据或技术工作中获得成功的技巧

迪伦·费雷拉在 Unsplash 上的照片

在这个复杂的世界里,在家“正常”工作已经改变了我们面试和接受新工作的方式。入职具有挑战性。新员工如何获得他们需要的信息,建立关系,并了解一个部门的文化?我将分享一个我发现在个人和虚拟世界都很有效的技巧。

每个公司和部门都有具体的入职清单(或者没有)。这些包括定位、安全访问和一般期望。在实体办公室,你可能会被指派一名团队成员“带你熟悉环境”,带你参观设施,并把你介绍给其他人。这种类型的关系建立在虚拟环境中是不可能的。你必须更加自信地融入团队。这是你要做的。

在新团队成员方便的时候,安排一次 30 分钟的 Zoom 会议,与他们见面。

一对一会议

你有两个目标;建立关系,获取信息。任务期间随便认识一下。在某些情况下,你可能需要第一次会议是一个随意的了解你的咖啡会议,随后是问答会议。要灵活;如果你向仍在试图了解和信任你的人发问,你可能在这两个目标上都不会取得进展。

你必须了解你的新团队的来龙去脉,所以你必须有所准备。让他们知道你在做笔记,这样你就不会忘记他们分享的任何有用的信息。作为一个团队的新成员有额外的好处,比如你可以问任何问题!

他们的角色是什么?

  • 他们在团队中负责什么?
  • 为什么?你在脑海中构建了一个行动地图,告诉你谁在做什么,你在哪里。

团队中其他人的特长是什么?

  • 为什么?个人印象可以提供很多信息,并为您提供一些问题来询问其他团队成员。

他们有什么背景?

  • 学位、在公司的任期、在团队的任期、以前的职位、职业、外部兴趣、工艺酿造偏好
  • 为什么?大多数人喜欢分享自己。表现出兴趣对建立关系大有帮助。从大学到运动队,共同的兴趣成为未来的轻松话题。

他们在公司因什么而“出名”?

  • 他们是 SQL 奇才吗,他们是“认识所有人”的人吗,他们在业余时间为开源 python 项目做贡献吗?
  • 为什么?你正在为自己和推荐给他人建立一个新世界中的“关键人物”名单。

他们认为为团队工作最具挑战性的部分是什么?

  • 作为一名新的团队成员,他们会如何建议您接触 it?
  • 为什么?了解减速带。你可能会在你们的谈话中找到主题,并能计划如何解决它。

他们使用什么工具和数据来源?

  • 你如何获得访问权限和软件?
  • 为什么?你需要知道你需要什么样的资源才能顺利开展业务。

他们建议你接下来两周做什么?

  • 为什么?他们可以在未来几周提供方向和结构。

他们有什么脚本或代码片段可以与你分享吗?

  • 为什么?每个公司都有自己的代码风格,最好去了解它。此外,您还可以了解公司如何连接到数据库和工具。拥有这些片段将会为你省下一大堆的悲伤。

你可以利用哪些资源来获取信息?

  • 你应该考虑哪些内部网站、会议、实践社区、外部网站和培训资源?
  • 为什么?注册正确的内部*组和信息会议对于获得你需要的信息和发展团队外的联系是至关重要的。

在团队之外,他们推荐你见哪些人或团队?

  • 这些能介绍你吗?
  • 为什么?介绍是认识公司关键人物的绝佳机会。

在那次一对一的会议之后

  1. 整理你的笔记。
  2. 发送后续邮件或信息,感谢他们的时间和见解。提及他们推荐的介绍、链接和代码片段。
  3. 开始研究他们提到的数据、工具和资源。

在所有的会议之后

  1. 再次,组织你的笔记。
  2. 你看到的趋势是什么?
  3. 你认为自己有什么独特的技能可以帮助解决个人或团队的挑战吗?
  4. 尽快确定你如何为团队提供价值。

结论

在新工作的第一周,最好积极主动,尤其是在虚拟世界里,眼不见为净。走出去,和你所有的队友安排 1:1 的会议。人们喜欢谈论他们自己和他们所做的事情。他们的见解将为你提供成为团队中富有成效的一员所需要的东西。

如何在大联盟比赛中获得快速准确的基线

原文:https://towardsdatascience.com/how-to-achieve-a-quick-accurate-baseline-for-ml-competitions-11b7ae29b673?source=collection_archive---------61-----------------------

这篇文章描述了我如何只用几行代码就在性病药物有效性预测挑战赛中获得第五名。

照片由欧文比尔德Unsplash 上拍摄

根据美国疾病预防控制中心的报告,2018 年美国报告了超过 240 万例性传播疾病(STDs)。该报告还强调,从 2017 年到 2018 年,因梅毒导致的新生儿死亡人数增长了 22%。基于这些事实,HackerEarth 宣布了性病药物有效性机器学习预测挑战,以提高人们对各种性病和用于治疗它们的药物的认识。

虽然我没有足够的时间专门参加比赛,但这一次看起来真的很有趣,我无法抗拒自己。一些快速分析和一些提交后,我在这里,在公共排行榜上获得第三名,在私人排行榜上获得第五名。我对我在这个问题上所花时间的排名感到非常惊讶,所以我决定写一篇关于我的方法的博客,以便每个人都能从快速准确的基线中受益。那么,让我们开始吧!

免责声明:我不使用*猫 (不,我不是嬉皮士——伪数据科学家,相信我)

来源: Imgflip 模因生成器 (CCO)创建了

[## atif-Hassan/竞赛代码

这个库包含我为我参加的所有比赛编写的代码- atif-hassan/Competition-code

github.com](https://github.com/atif-hassan/Competition-code/blob/master/Hackerearth/STD Drug Effectiveness/code/new_regression_ml.py)

数据分析

什么?你认为会有银弹吗?我刚告诉过你我不是嬉皮士伪数据科学家!在解决问题之前,你总是需要分析你的数据。

资料截图

有效性评级功能是由评审者提供的最终评级,因此,可用于替代评审 _ 患者栏。药品由 UIC 批准的功能没有多大意义,因为同一种药品有多个批准日期。有一种可能性是,批准是基于一个病人一个病人的基础上,但我没有深入挖掘这个想法。在*台提供的训练集和测试集中, patient_id 列不包含任何副本,因此它没有任何用处。经过这种初步的"特征选择"之后,我们剩下的是药品名称(我们称此栏为 药品/药品名称)**使用 _ 病例 _ 药物(我们称此栏为 疾病)**药品 _ 疗效

因为药物和疾病特征是分类的,所以让我们看看所有独特的实例,以便知道我们在这里处理的是什么。在 excel 的数据类别中快速应用筛选选项就可以做到这一点。

似乎疾病栏不是很干净

药物一栏中没有什么出乎意料的,尽管疾病一栏确实包含一些噪音。看起来噪音模式是一个数字后跟一个 span 句子,可能是一个刮擦错误。现在让我们检查测试数据集中的药物和疾病列是否都是它们的训练数据集对应物的子集。

代码查找出词汇(OOV)药物和疾病

*OOV Drugs (158 in total):
-------------------------
Acetaminophen / caffeine
Advil Cold and Sinus Liqui-Gels
Afrin 4 Hour Extra Moisturizing
Amethia Lo
Amitriptyline / perphenazine
.
.
.OOV Diseases (34 in total):
---------------------------
22</span> users found this comment helpful.
39</span> users found this comment helpful.
55</span> users found this comment helpful.
Aphthous Ulce
Breast Cancer, Prevention
.
.
.*

从上面的输出可以看出,测试集中有相当多的药物和一些疾病没有出现在训练集中,这是一个问题。但是等等,我们知道药物有时有多个名字。因此,也许,如果我们可以找到测试集中存在的药物的替代名称(存在于训练集中的名称),那么,我们可以替换这些药物名称,并帮助模型理解大量样本。Drugs.com 是一个很好的网站。由于时间不多,我只手动替换了几个药名。如果所有 OOV 药品的名称都被替换为训练集中正确的名称,这肯定会有所帮助。

*Drug "Esomeprazole / naproxen" was present as "Vimovo" in test set
Drug "Senna S" was present as "Docusate / senna" in test set
Drug "Empagliflozin" was present as "Synjardy" in test set
.
.
.*

同样,疾病也可以被替代,但是在这种情况下,oov 的数量很少,所以我决定忽略它们。

模型结构

一旦预处理完成,我就进入了模型构建阶段。我无法使用药物有效性处方次数数字列快速设计一些好的功能。相反,我应用了 k-means 聚类,并使用所有聚类之间的样本距离作为特征。这种无监督的特征工程方法几乎总是对我有效。我将很快写一篇关于所有这些技巧和窍门的文章,但更多的将在后面。“药品”和“疾病”列是一次性编码的(ohe ),而“疾病”列中的所有干扰样本都被替换为一个字符串,代表一个缺失值。这两组一键编码与两个数字和 k 均值特征连接在一起。这导致了一个大而稀疏的特征空间。

最后,我使用 LightGBM 回归模型进行预测。使用 10 倍交叉验证对模型的超参数进行了一些调整。就是这样!这就是我能够连续 20 天保持在公共排行榜首位的原因,但值得称赞的是,前 4 名参与者一直工作到最后一刻!

带回家的信息

永远记住,即使花费少量的时间和精力来挖掘数据中的模式,也能为您提供真正好的结果。这就是如何用几行代码实现快速准确的基线😉。

我知道这篇文章不包含任何可视化,但那是因为我没有把太多的数据分析融入到我的工作中。我恳求大家给我提供反馈,因为这是我的第一篇博客(所以请*心行事😅).

谢谢大家!

如何真正完成数据科学在线课程:8 个完成技巧

原文:https://towardsdatascience.com/how-to-actually-finish-data-science-online-courses-8-completion-tips-40a7bc5e2429?source=collection_archive---------19-----------------------

关于不分心到达终点线的实用建议

卢卡斯·本杰明在 Unsplash 上的照片

(注:所有观点均为本人)

介绍

*年来,在线课程或“MOOCS”传统上很难完成( Financial Times,2019 ),但越来越多的人依赖它们来提高技能,特别是在数据科学&分析领域,这是整个电子学习生态系统中最受欢迎的类别之一。

自从我开始通过我的学习之旅学习许多数据科学和分析技能以来,我一直是在线教育的忠实粉丝,并且一直是所有主要数据科学内容*台的积极学习者,重点是 Coursera、Udemy、EdX、Datacamp 和 Pluralsight 等。

[## 我在 4 年的在线数据科学课程中学到了什么

来自数据学习冒险的观点

towardsdatascience.com](/what-i-learned-after-4-years-of-online-data-science-courses-c3a6a13bd36f)

在本文中扩展上述内容,我旨在分享我通过完成上述提供商的几门课程所学到的主要内容(没有双关语),希望在开始您在网络空间的下一次数据科学学习冒险之前留下一些有用的参考资料。

1)理想:带着真正的兴趣投入进去

首先:将潜在的课程限制在你真正感兴趣的话题上。你不想浪费时间坐在那里看资料,只是为了意识到你可以更好地享受学习其他东西的时间。

通常“检查”你是否在正确的轨道上的信号是,在中途,你表现出的兴趣和参与程度会让你自己感到惊讶。

当我正在学习某样东西时,我惊讶地说“哇,这真酷”,那么这就说明了是什么让一门课程对我个人来说是令人愉快的。

根据我的经验,我在大学时就开始在线学习数据科学,因为我发现这项活动对我即将毕业的领域非常有益。这帮助我确定了与我的综合兴趣领域最相关的课程,并真正让我以一种积极的方式开始,这有利于完成学业。

数据科学是一个非常广阔的领域,所以很容易迷失。除了学习基础知识(编程、统计等)..)这是所有数据科学学习的基础,选择一个主题和一个合适的领域,并充分享受学习的乐趣,以便能够亲自参与个人项目,这是非常关键的。

2)实践:将完成与实际结果联系起来

另一个帮助你完成整个课程的巨大动力是把课程和课后的即时行动联系起来。

这些可以是:

  • 与工作相关的项目,通过这些项目可以立即应用新学到的技能
  • 个人项目用自己的时间去发展
  • 行业认证:确保你在考试完成 75%后马上预约考试,或者最好是一次,以确保你坚持到底,不会迷失在日常事务中
  • 无论你是针对面试的单一主题,还是正在进行更有条理的再技能培训,这些课程都是很好的准备来源

对于数据科学学习,确切地说,对于任何学习,培养明智的长期观点肯定更难,所以我发现,通过参加个人项目或有用的认证来让自己在短期内保持参与,在确保我设定一个清晰的指南针和切实的目标方面肯定是有效的,以便避免在没有应用的直接好处的情况下学习 ( 高中记忆有人吗?)

3)承诺前做好调查

我最*在媒体上读到一篇有趣的文章,关于比尔·盖茨的阅读习惯,以及他是如何能够一旦投入一本书,就总能设法读完它。这得益于这样一个事实:比尔在开始阅读某本书之前会做扎实的研究,这使他能够分辨出哪本书会真正让他保持兴趣,直到最后。

我认为我们肯定应该对数据科学课程使用相同的方法,如果不是更强的话,因为它们通常代表着大量的时间和金钱投入。

这个过程现在变得比以往任何时候都更容易,因为我们都生活在在线评论世界中,这使我们有机会获得关于潜在数据科学课程质量的全面信息。我个人喜欢阅读课程评论,并在做出决定之前拿出一份候选名单,因为我会根据质量、深度、长度以及与个人兴趣和目标的一致性来堆叠课程。

本质上,在做决定之前,一定要花些时间阅读和比较课程。这是值得花的时间,因为它会让你坚持到底。

4)对你的时间和精力估计要现实一些

兴奋地投入到课程中当然是积极的,但一个强大的组织将是带你到达终点的因素。

这意味着你要诚实地面对自己,每天/每周你实际上能分配多少时间来学习这门课程,同时也要预见到在你学习的过程中可能会遇到的任何隐藏的障碍。

估计时间时,最好考虑以下因素:

  • 课程的预计净持续时间(*时)
  • 个人学习时间的预计持续时间 e(练习、实验室、认证前、顶点项目等)..)
  • 难度等级

尝试得出可测量的总数,然后在给定的时间窗口内进行分割,并与你的每日/每周模式进行匹配,看看你是否能够以合理的速度前进。

时间投入肯定与纯粹的精神努力相关,在这个比赛中,我指的是通过课程经历投入的实际努力。这是一个完全个人的估计,但它需要与你自己进行诚实的对话,以决定是否开始。

对一门课程说“不”可能是一个非常明智的决定(就像说“是”一样),让你处于一种在当前情况下能够最大限度利用学习时间的境地。

5)知道如何学习最好

我一直是一个视觉学习者,在观看引人入胜的视频讲座和尝试互动练习和实验时最投入。其他一些人喜欢阅读充满方程和数学证明的编程书籍,因为它们更符合他们的学习习惯,或许还有教育背景。

无论哪种方式,在最大化你的完成机会时要考虑的一些关键个人因素肯定是:

  • 媒体选择(视频对书籍,互动实验室对测验,纸上笔记对数字笔记):你要确保你选择的课程能让你的注意力高度集中在你喜欢的吸收信息的方式上
  • 你是夜猫子还是早起的人?在你效率最高的时候预留一些学习时间
  • 编程语言的选择:对于许多数据科学课程来说,课程内容通常依赖于学生假定的计算机编程技巧(除非您的在线课程侧重于学习编程语言本身),通过这些技巧来传达概念。确保你选择的课程利用了你可以很容易理解的编程语言必备知识,至少在基础知识方面,以避免陷入错误和实现障碍,这些会占用你的时间和注意力,使你偏离编程语言的主要概念,因为这两者并不总是重叠的

6)投资自己

花在自我发展上的钱总是物有所值的,投资回报也是令人难以置信的。如今,你可以以很低的费用在线学习大学水*的课程,对内容质量没有任何影响。

即便如此,完成率仍然很低,因此,在一门课程上进行*额但积极的投资,就激励你真正完成你花钱买的东西而言,可以让世界变得完全不同。我们在这里谈论的不是一大笔钱。

在 Coursera 上,课程的*均价格区间在 30-60 美元之间(因国家而异)。在 Udemy 上,就更少了。如果你仍然不确定是否要提前投入资金,不要担心。作为起点,在 YouTube、Coursera 和 FreeCodeCamp 上有很多高质量的课程可以免费观看。考虑到其他 7 个步骤,你仍然可以确保你能完成并保持在合理的预算内。

积极努力支付课程费用既起到了锚的作用,也不断提醒自己必须投入时间来分摊成本,同时从经历中获得一些很好的学习。

在所有其他条件都相同的情况下,比金钱本身更重要的是,为某样东西付费所带来的心理阻力通常会让我坐完整个课程,因为我知道否则我会把浪费的钱留在桌子上。

7)对自己负责

即使拥有最好的意图,有时你也很难独自过滤掉所有让你分心的事物。因此,依靠你的队友和/或朋友可以确保你被其他人检查你的进展,他们间接鼓励并提醒你当前的状态和计划的进展,这样无论何时动力下降,假设你可以做些什么,你都有一只援助之手让你回到正轨。

在实践中,我通常通过以下方式保持自己的责任感:

  • 与朋友一起参加课程,并设置定期聊天以分享个人学习时间的更新。除了让你有责任感之外,有一个朋友和你在一起会让整个经历变得有趣,并为作为一个团队一起追求进一步的项目创造条件,利用学到的东西
  • 参加专业培训冲刺:这基本上与上面的相同,但更正式的是作为一个培训计划,通常由你的雇主管理,负责让一类学员按照某个课程和可选的行业认证目标进行培训。我很幸运为一家非常重视数据科学培训&认证以及实际项目工作的公司工作。这导致课程完成率的强劲增长,如果有人可以选择参加这些短跑训练,我肯定会推荐。

总的来说,找一个可以依靠的人绝对是一件有趣的事,而且会大大增加你完成课程的机会。你可能会发现你的一个朋友或同事有着相同的培训目标,所以不要克制自己,让你的学习尽可能地具有协作性。

8)享受过程,学习不是短跑

最后但同样重要的是,我相信持续成功学习的关键是采取正确的心态,并把日常学习变成一种习惯。

采用正确的心态意味着:

  • 保持终点线在望,同时花时间享受学习之旅:不要匆忙地浏览讲座和材料,因为你在长期记忆细胞中保留的知识很少。把内容分解成更*的积木,然后从那里开始,一步一步,并从中获得乐趣。在这些条件下,到达终点将是一个自然的结果。
  • 意识到没有“末日”这回事;即使你设法完成了一门课程,你也永远不会真正结束。数据科学知识、框架、编程语言以及最终的课程都在不断发展,要在这个流动的生态系统中茁壮成长,就意味着愿意享受一个持续渐进的学习之旅,这将远远超出指定课程的持续时间。

有了这种心态,你一定可以从容不迫,享受每一节课程和练习。在你意识到这一点之前,你已经完成了大量的课程,并积累了一些技能和知识。

概括起来

通过在线课程学习数据科学是一次非常有趣和有益的旅程。每个人学习的方式都不一样,我希望你能采纳我的建议,并根据你的日常习惯,最重要的是根据你最喜欢的学习方式进行调整。

为了最大化完成的机会,您可能需要记住:

  1. 选择你真正感兴趣的课程
  2. 设定完成后要达到的目标
  3. 在提交前进行全面研究
  4. 计划好时间和精力,避免任何组织挫折
  5. 利用自己的时间,开发一种适合自己的学习方法
  6. 投资优质课程。他们会得到回报,并阻止你懈怠
  7. 与他人合作,培养责任感,最重要的是大家都玩得开心
  8. 享受旅程!

感谢阅读!

访问我的免费数据科学资源清单 这里

[## 通过我的推荐链接加入 Medium-Edoardo Romani

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

edo-romani1.medium.com](https://edo-romani1.medium.com/membership)

参考文献:

如何给你的 AWS API 网关 API 添加 API 键?

原文:https://towardsdatascience.com/how-to-add-api-keys-to-your-aws-api-gateway-api-691bd17c5924?source=collection_archive---------9-----------------------

实践教程

向 AWS API 添加 API 令牌以进行访问管理

如何给你的 AWS API 网关 API 添加 API 键?由格伦·卡斯滕斯-彼得斯Unsplash 上拍摄的照片。

在本文中,我将解释如何向使用 AWS API Gateway 制作的 API 添加基本安全级别。这将通过添加令牌来完成。

令牌是您需要随 API 请求一起发送的代码,其工作方式或多或少类似于密码。如果您的令牌允许您访问数据,API 将向您发送数据。否则它会给你一个错误。

按照这个例子,您可以使用在上一篇文章中创建的 AWS API Gateway API,它发送回一个随机生成的密码。或者可以直接使用自己的 AWS API。

让我们开始吧:

步骤 1:创建使用计划

转到使用计划选项卡,然后单击创建。这将让你开始建立一个使用计划。

你必须选择你的客户可以提出多少个请求。对于我的基本计划,我想每月允许 100 个请求。我允许每秒 9 个请求。我允许一次最多有 100 个请求。

然后,您需要将 API 及其阶段添加到使用计划中,如下所示:

现在,您有了一个使用计划,它为拥有该使用计划的用户发出的 API 请求指定了使用限制。为了将此使用计划传递给您的用户/客户,您需要一个与使用计划相关联的 API 密钥。让我们现在做那件事。

步骤 2:在 AWS API Gateway 中设置 API 密钥

点击“将 API 密钥添加到使用计划”。这将允许您向刚刚创建的使用计划添加 API 密钥。

为 API 键创建名称和描述(可以是任何内容),并让 API 键自动生成:

然后点击完成。现在,您拥有了与您的使用计划所指定的访问规则相关联的第一个 API 键。

步骤 3:不允许在 AWS API 网关中没有 API 密钥的访问

现在,我们已经允许使用 API 密钥进行访问。但是没有 API 密钥的访问仍然有效!我们必须改变这种状况。

转到您的 API 方法:

点击方法请求,进入以下菜单。一条警告信息已经在等着你了:

现在,您需要将“需要 API 密钥”更改为“真”,以确保 API 只接受带有 API 密钥的请求:

步骤 4:部署您的 API

现在,要完成 API 键的添加,您需要部署 API 以使更改生效。

在这个*示例中,我们只有一个 prod 阶段,因此我们可以直接部署到 prod:

步骤 5:测试新的 API

现在,当在没有指定 API 键的情况下测试 API 时,我们得到了正确的 403“禁止访问”响应。可以从笔记本中执行以下 Python 代码来对此进行测试:

要找到您的 API 密钥,请转到 API 密钥,选择您的 customer1 API 密钥,然后单击显示。复制并粘贴它,以便测试 API:

在 Python 代码中,现在需要在 x-api-key 头中传递 API 键,如下所示:

正如我们所希望的,我们得到了一个生成的密码,但是现在开发者不得不使用 API 密匙!

我希望这篇文章对你有用。不要犹豫,继续关注更多!

如何将傅立叶项添加到回归和季节性分析中(使用 Python 和 SciPy)

原文:https://towardsdatascience.com/how-to-add-fourier-terms-to-your-regression-seasonality-analysis-using-python-scipy-99a94d3ae51?source=collection_archive---------12-----------------------

使用傅立叶项将季节性包括在回归中

希望到此结束时,你也能够将你的回归提高 410,000 倍!

重温我们的 911 电话记录

在上一篇文章中,我们研究了如何使用傅立叶变换来分析宾夕法*亚州蒙哥马利县 911 电话呼叫数据的季节性。如果你还没看过,看看下面吧(虽然你也一定能看完这篇文章)。

[## 使用 Python 和 SciPy 通过傅立叶变换分析季节性

通过寻找 911 电话数据中的季节性趋势,学会从噪音中分离信号

towardsdatascience.com](/analyzing-seasonality-with-fourier-transforms-using-python-scipy-bb46945a23d3)

我们在数据中发现了一些有趣的周期性。通话量有 3 个主要的季节性趋势:每天,每天 3 次,每周一次。但是季节性并不能解释一切。历史不会完全重演。例如,潮汐整天都在退潮和流动(这是季节性的),改变了水位,但每年,全球变暖都会增加整体海*面(除非我们采取措施)。如果你仅仅通过观察潮汐来预测未来许多年的水位,你会低估水位,因为你没有考虑海*面是如何随着时间的推移而上升的。

同样,蒙哥马利县的人口从 2010 年到 2019 年增长了约 3.9%,因此可以合理地假设,由于人口的增长,我们的数据中的 911 呼叫量也略有增加(我们将查明情况是否如此)。

为了解决这个问题,我们将对上次分析季节性的方法做一个大的改变。我们将首先运行线性回归,然后对残差(第一次回归的误差)执行傅立叶变换。

我们正在做的是尽最大努力不使用季节性来解释数据,然后我们将使用季节性来解释我们无法解释的东西。所以让我们开始吧。

计算残差

第一步是做回归。我的偏好是使用 Sckit-Learn 的线性回归模型,你可以使用任何你觉得舒服的模型。

# time_sec is the hourly timestamp converted to seconds
X = pd.DataFrame(data['time_sec']) 
# signal is how many calls were made in that hour
y = pd.DataFrame(data['signal'])model = LinearRegression()
model.fit(X, y) 
data['pred_signal_linreg'] = model.predict(X)
data['residuals'] = data['signal'] - data['pred_signal_linreg']

查看模型系数和截距,我们发现斜率约为 3E 10,截距为 16.40。

>> print('Slope: {:.2e}, Intercept: {:.2f}'.format(model.coef_[0,0], model.intercept_[0]))
**Slope: -2.59e-10, Intercept: 16.40**

因此,通话量从每*时约 16.4 次通话开始,每年通话量下降约 10×60×60×24×365 3E 每*时约 0.009 次通话。

我们最初的假设是,我们会看到 911 电话的增加与人口增长成比例,但这似乎并不正确。此外,很明显,这种回归不是很有帮助。其余真的少得可怜。

>> print('R-squared: {:.2e}'.format(model.score(X,y)))
**R-squared: 1.00e-06**

但是这种云也有一线希望。仅时间上的不良拟合就表明,我们可以通过引入傅立叶项来显著改善情况。

傅立叶变换和傅立叶逆变换

第 1 部分详细介绍了这一过程。简而言之,我们将使用傅立叶变换来找到最主要的频率,然后使用傅立叶逆变换来给出对应于这些频率的函数。

这是傅立叶变换后我们找到的主频。

time = data['time']
residuals = data['residuals']fft_output = fft.fft(residuals)
power = np.abs(fft_output)
freq = fft.fftfreq(len(residuals))peaks = scipy.sig.find_peaks(power[freq >=0], prominence=10**4)[0]
peak_freq =  freq[peaks]
peak_power = power[peaks]
plt.plot(peak_freq, peak_power, 'ro')

以下是这些峰值对应的值(与我们在第 1 部分中看到的没有太大不同)。为了便于参考,我将它们标为FT_1 ... FT_12

如果您对如何获得这些值感兴趣,FFT 列是运行scipy.fft.fft(residuals)的输出。您可以通过运行fft.fftfreq(len(residuals))获得频率。这些频率的单位是1 / timestep,其中时间步长是残差之间的间隔(在我们的例子中,这是一个*时),振幅是abs(fft),相位是cmath.phase(fft)

这些行中的每一行都对应于一个正弦曲线。我们可以使用傅里叶逆变换来计算这些正弦曲线,并绘制它们的和与原始残差的关系。它们非常合适。

filtered_residuals = fft.ifft(filtered_fft_output)N = 24 * 5
plt.plot(time[:N], residuals[:N], linewidth=1, label='Original residuals')
plt.plot(time[:N], filtered_residuals[:N].real, linewidth=1, label='Filtered residuals')
plt.legend(loc='upper right')
ax2.set_title('First 5 Days')
plt.grid()
plt.ylim((-25, 25))
plt.xticks(rotation=90)

融入我们的回归

现在让我们将正弦曲线纳入初始回归。这些正弦曲线的问题在于振幅不在范围内。你可以在上面的图表中看到,它显得太低了。这是因为我们对残差进行了傅里叶变换,并将输出过滤为 12 项。所以我们的过滤

我们最初的回归只是使用时间作为唯一的变量,但现在我们可以添加傅立叶项。相位、幅度和频率让我们用这个公式画出 FFT 项对应的波形。

A =振幅,ω=角频率= 2 π频率,φ=相移

我们现在要做的是,如果我们增加几个与 FFT 波形相关的新变量,我们会得出什么样的新回归。

所以我们回到我们的原始数据,以秒为单位的时间和当时的呼叫次数,我们添加了几列,对应于傅立叶变换的每个波。然后我们可以将这些加在一起成为一个新的列,FT_All。这看起来像:

for key in fourier_terms_dict.keys():
    a = fourier_terms_dict[key]['amplitude']
    w = 2 * math.pi * (fourier_terms_dict[key]['freq (1 / hour)'] / 3600)
    p = fourier_terms_dict[key]['phase']
    data[key] = data['time_sec'].apply(lambda t: math.cos(w*t + p))data['FT_All'] = 0
for column in list(fourier_terms.index):
    data['FT_All'] = data['FT_All'] + data[column]

这为我们提供了一个新变量FT_All,它与我们之前绘制的“过滤残差”相同。

之前我们只是对 signal = f(time)进行回归,但现在我们可以对 signal = f(time,FT_All)进行回归

之前我们只是对 signal = f(time)进行回归,但现在我们可以对 signal = f(time,FT_All)进行回归

这些傅立叶项可能看起来令人生畏,但基本上,它们只是我们认为在傅立叶变换中很重要的正弦曲线(即波)。它们很重要,因为它们在频域达到峰值。如果我们绘制FT_1图,我们会看到这是一个具有一天周期和特定相移的波,这与我们在数据中看到的每日季节性相匹配。

>> plt.plot(data['time'][:24*5], data['FT_1'][:24*5])

现在我们可以使用新变量进行回归。

# time_sec is the hourly timestamp converted to seconds
# list(fourier_terms.index) are the names of our Fourier terms
X = pd.DataFrame(data[['time_sec', 'FT_All']]) 
# signal is how many calls were made in that hour
y = pd.DataFrame(data['signal'])model = LinearRegression()
model.fit(X, y)

这是前 5 天的回归结果。它看起来很有希望。

最后,如果我们检查模型得分,我们可以看到我们比以前做得好得多。

>> model.score(X,y)
0.4089566840099922

通过增加一个新变量,R 从 0.000001 提高到 0.41。一点都不差!

为什么傅立叶变换对回归有帮助?

傅立叶变换并不是回归中分析季节性的唯一方法。我肯定会考虑探索其他更简单的选择。就像为一天中的一个*时或一周中的一天添加一个虚拟变量,特别是如果你已经对将要发生的事情有了强烈的直觉。

例如,假设您知道 911 呼叫量在下午 6 点到 9 点之间达到峰值,那么您可以创建一个新变量,当时间在下午 6 点到 9 点之间时,该变量为1,否则为0。这个系数会非常清楚地告诉你,在晚上的时间里会有多少更多的呼叫量。

挑战在于知道如何开始。是晚上 6 点到 9 点,还是晚上 7 点到 10 点?还是周末比晚上更能影响通话量?傅立叶变换是回答这些问题的好方法。它为您提供了一种可量化的方法来测量数据中的季节性。然后,如果您想在回归中利用它,有一个简单的选择,通过合并傅里叶变换输出的正弦曲线来实现。或者,您可以从傅立叶分析中获得见解,并在您的回归中测试更简单的变量。

Github 上的项目代码

ka ggle 上的数据集

在此阅读第 1 部分

[## 使用 Python 和 SciPy 通过傅立叶变换分析季节性

通过寻找 911 电话数据中的季节性趋势,学会从噪音中分离信号

towardsdatascience.com](/analyzing-seasonality-with-fourier-transforms-using-python-scipy-bb46945a23d3)

如何将屏幕日志添加到 Flask 应用程序中,并将其部署在 AWS Elastic Beanstalk 上

原文:https://towardsdatascience.com/how-to-add-on-screen-logging-to-your-flask-application-and-deploy-it-on-aws-elastic-beanstalk-aa55907730f?source=collection_archive---------8-----------------------

提示:不要忘记配置 Nginx 反向代理服务器

2019 年底 Deeplearning.ai 报道称,只有 22%使用机器学习的公司实际部署了模型。大多数公司不会超越概念证明,通常是通过 Jupyter 笔记本中的模型。因此,许多公司正在雇用机器学习工程师,他们可以建立机器学习模型,并将其投入生产。

数据科学家至少应该熟悉一些生产模型的方法。为此,数据科学家工具箱中最重要的工具是 Docker。 Docker 是一个容器服务,使您能够在本地机器之外部署模型或应用程序。例如,在亚马逊网络服务(AWS)或谷歌云*台(GCP)上运行它。有几种框架可以在这些 Docker 容器中构建应用程序并为您的模型提供服务。正如许多数据科学家已经知道 Python 一样, Flask 很容易上手。此外,Flask 为您提供了构建(简单的)用户界面的机会,因此您的用户将能够与您的模型进行交互,而不必学习如何使用命令行界面或发出 API 请求。

在本实践教程中,我将向您展示如何在 AWS Elastic Beanstalk 上的 Docker 容器中部署一个简单的 Flask 应用程序,以及如何添加日志记录功能,以便您的用户能够看到幕后发生的事情。该应用程序不会包含任何机器学习模型,但您可以轻松地自行扩展它。当我第一次部署这个解决方案时,我遇到了一些麻烦,因为我必须在 AWS 上配置(反向)代理服务器。在本教程的最后一部分,我会告诉你如何做到这一点。

基础知识

我们的 Flask 应用程序的文件夹结构

首先,我们设置了 Flask 应用程序的基础。它包括一个用于所有 Flask 代码的 app.py 文件,一个用于格式化索引页面结构的静态index.html文件和一个 css 样式表( custom.css)

app.py 只有 7 行代码。我们首先初始化一个 Flask 应用程序类,并定义静态和模板文件夹。然后我们定义一条路线('/'),并告诉应用程序它应该呈现index.html。最后一行告诉应用程序在端口 5000 上暴露自己。主机参数被设置为 0.0.0.0,以便稍后在 AWS Elastic Beanstalk 上部署。

HTML 和 CSS 文件也很简单,为了完整起见,在下面演示。我们用一些样式选项定义了一个 logging_window 类,稍后将包含日志记录。

我们现在可以第一次运行我们的应用程序,看看它是什么样子的。如你所见,仍然没有什么特别的。

应用程序第一个版本的屏幕截图

添加日志记录功能

如前所述,显示 Python 进程的日志将使应用程序的工作变得更加容易。例如,用户可以看到一个进程是停滞还是仍在运行,他们应该有耐心。

将日志添加到我们的应用程序非常简单。它需要一个助手函数 flask_logger,,(在本例中)每秒返回一个编码字符串形式的当前日期时间。此外,我们添加了一个新的路由('/log_stream '),它将使用我们的 flask_logger 函数的输出返回一个 Flask 响应类。另外,不要忘记为这个例子导入 datetime。

如果我们转到新创建的路由(将在https://localhost:5000/log _ stream 公开),,)我们现在将看到以下内容。格式不是很好,但它每秒都返回日期时间。

记录您的日志

由于我们现在能够每秒显示一次输出,我们实际上可以显示我们的日志。为此,我们必须改变我们的 flask_logger 函数。首先,我们必须配置我们的记录器。在这个例子中,我将使用来自 loguru 的记录器,但是你可以使用任何你喜欢的记录器。记录器将被配置为将所有日志写入静态文件夹中的 job.log 文件。 flask_logger 将被配置为每秒读取日志文件并返回日志。此外,日志文件将在 25 次迭代后被清除。

这将导致更好的格式化日志记录。请注意,loguru 记录器(在所有 python 进程中)记录的所有信息都将显示出来,因为在配置记录器后,这些信息都将写入 job.log 文件。因此,如果你在训练过程中有一行代码logger . info(' Model is training '),它也会显示在我们的 logger 中。

从 job.log 文件读取的格式化日志记录

包括登录我们的索引页面

部署应用程序之前的最后一步是在我们创建的 index.html 中包含日志记录。这相当简单,但是包含了一点 JavaScript。我们创建一个函数,它在页面加载后启动,向我们的 /log_stream 路由发出 GET 请求,并将响应写入一个 id 为‘output’的 HTML 元素。整个 HTML 文件将如下所示:

如您所见,我们现在有了一个应用程序,它记录了我们所有的 python 进程,并向我们的用户显示它们。

我们的 index.html 文件中包含日志流

部署到弹性豆茎

现在我们可以将我们的简单应用程序部署到 AWS Elastic Beanstalk,这样任何人都可以访问它。Elastic Beanstalk 是一个所谓的“编排服务”,它不仅负责我们应用程序的部署,还负责设置服务器实例,负责负载*衡(如果多个实例已被实例化,则在您的计算资源上分配任务,以使整个过程更有效),以及监控您应用程序的健康和状态。

对于这一步,我们需要在我们的项目的根文件夹中添加两个文件:一个 Dockerfile 来封装应用程序,另一个 requirements.txt 包含应该安装在这个容器中的所有包。将 pip 冻结命令的结果复制粘贴到 requirements.txt,并按如下方式设置 Dockerfile。

现在是时候让奇迹发生了。有几种方法可以将您的应用程序部署到 AWS Elastic Beanstalk(假设您已经有一个 AWS 帐户。如果您还没有,请在 aws.amazon.com 上注册 12 个月的免费层访问。最方便的方法就是安装弹性豆茎的命令行接口。安装后,使用终端导航到项目的根文件夹。随后调用 eb initeb create 并回答提示的问题。Elastic Beanstalk 会自动识别您的项目文件夹中有一个 Dockerfile,并开始构建环境。等待几分钟(通过 AWS 的管理控制台检查进度),然后您可以通过在初始化过程中定义的 URL 访问您的应用程序。如果您通过 AWS 管理控制台导航到您的 Elastic Beanstalk 环境,也可以找到这个 URL。

Nginx

但是,如果您访问应用程序的 URL,您将会看到没有日志记录出现。25 秒后,所有日志同时出现。要解决这个问题,我们必须配置 Nginx 反向代理服务器,如果创建了弹性 Beanstalk 环境,默认情况下会实例化这个服务器。配置这个服务器听起来可能很吓人,但实际上非常简单。为了理解我们正在做的事情,我来解释一下问题从何而来。

如前所述,Nginx 反向代理服务器是在创建弹性 Beanstalk 环境时启动的。该代理服务器旨在将您的应用程序映射到您环境的负载*衡器。然而,Nginx 的一个特性是,它缓冲我们的应用程序正在生成的所有响应,直到生成日志的过程完成。因为我们想立即显示所有日志,所以我们必须配置代理服务器停止缓冲它们。

配置 Nginx 可以分两步完成:1)在项目的根文件夹中创建一个. ebextensions 文件夹,2)向该文件夹添加一个配置文件(不管它的名称是什么,只要它有. config 扩展名)。该文件的内容应该是:

现在,我们可以从项目的根文件夹中调用终端中的 eb deploy 来更新我们的应用程序,并等待部署更改。

注意:如果您已经将项目的根文件夹初始化为 GitHub repo,请确保在部署应用程序的新版本之前提交您的更改。默认情况下,只有已经提交的变更才会通过 eb deploy 调用进行部署。您还可以运行EB deploy—staged;然后你的 staged changed(所以你必须 git 也添加它们)也将被部署。

部署完成后,访问您的应用程序的 URL,您可以看到日志工作正常!

结论

按照这些步骤,在 AWS Elastic Beanstalk 环境中创建和部署一个具有日志功能的简单 Flask 应用程序是相当容易的。请随意扩展应用程序以服务于您的机器学习模型,并使用这种简单的方法将它们投入生产!

关于作者

Rik Kraan 是一名医学博士,在荷兰数据科学咨询公司 Vantage AI 担任数据科学家。通过rik.kraan@vantage-ai.com取得联系

如何解决过度拟合(初学者友好)

原文:https://towardsdatascience.com/how-to-address-overfitting-beginner-friendly-f26d7e7dd05?source=collection_archive---------49-----------------------

防止过度拟合的三种基本方法

图片由 StartupStockPhotos 来自 Pixabay

想象一下,你的老板给你一些数据,让你训练一个分类模型。你非常努力地调整你的模型,最终得到一个训练有素的模型,准确率达到 99%。你把这个模型交给你的老板,并自信地告诉他,这个模型将会运行良好,有助于促进业务。几天后,你的老板来到你面前,愤怒地向你展示了他部署模型时的可怕结果。你对正在发生的事情感到非常困惑,因为当你训练模型时,你获得了 99%的准确率。哦,天哪,那是“过度拟合”。当我们仅使用训练数据训练模型时,会发生过度拟合。它与训练数据非常吻合,但当模型应用于看不见的数据(测试数据)时,它的表现会更差。让我们向前一步,看看我们可以做些什么来处理过度拟合。

如何感知过度拟合?

你可能听过成千上万次的训练数据和测试数据。当我们训练一个模型时,我们通常将数据分成训练集和测试集。然后,我们使用训练集来训练我们的模型,并使用测试集来测试我们的模型的性能,因为我们需要一些看不见的数据来进行测试,以查看它是否能在看不见的数据上很好地工作。通常,如果训练集比测试集具有稍好的准确性,则模型是可接受的。我们会说模型训练得很好。但是,如果训练集的表现比测试集好得多,比如说训练集的准确率达到 90%,而测试集的准确率只有 60%,那么我们可以说这个模型过度拟合了。

如何解决过度拟合?

不幸的是,我们过度训练了模型,但幸运的是,我们有以下解决方案来根除它:

1。交叉验证

这是机器学习中的另一个流行术语,你们很多人可能都很熟悉。以前,我们简单地将数据集分成训练集和测试集。现在,我们将使用我们的训练设备进行锻炼。例如,我们想对训练数据进行 5 重交叉验证。首先,我们将训练数据*均分成 5 个子集。每次我们分离数据时,我们从 5 个子集中依次取出一个作为“测试数据”。

打住打住,为什么我们刚做了测试数据又要做?

交叉验证的想法是,我们用训练数据调整我们的模型,在训练模型时,我们可以使用“作弊”的测试数据来改进我们的模型,以避免过度拟合。

五重交叉验证。验证表明“作弊”的测试数据。保持表示测试数据。

2。特征减少

具有更多特征的模型倾向于制造更复杂的模型,并且更复杂的模型倾向于不太通用。有主成分分析(PCA)和特征选择来减少数据的特征数量。减少要素的代价是会丢失数据中的信息,但同时也会提高模型性能。

3。正规化

在知道什么是正则化之前,你需要知道什么是代价函数(又名损失函数)。成本函数是计算生成的误差模型的函数。例如,在线性回归中,我们通常使用均方误差(MSE)作为成本函数。正则化试图减少或增加模型中的权重,以使模型更简单。如果权重接*零,它只是最*化该特征的影响。然而,如果权重下降到零,那么它就完全去掉了这个特性。我们有套索、脊和弹性网来帮助我们这样做。让我们先谈谈套索和山脊,因为它们非常相似,将用于比较。我会根据它的数学公式来解释如何做套索和脊的工作。

套索回归和岭回归

第 1 部分是线性回归的原始成本函数。然后,在原代价函数中加入第二部分,组成新的代价函数。当我们训练一个模型时,我们的目标是试图尽可能少地最*化成本函数,因为成本函数代表误差。λ是试图惩罚权重的惩罚参数。例如,如果我选择 lambda = 10000 (lambda 现在相当大),为了使整个成本函数的值尽可能*,所有的权重都被迫变得非常*,大概是 0.0001,那么我们通过减少模型中的一些权重,成功地使我们的模型变得更简单。但是权衡就是,如果 lambda 太大,那么模型就会变得太简单。因此,我们可能最终得到一个不适合的模型,或者整个函数将过于关注惩罚项,并基于惩罚项最*化成本函数。

当我们决定λ时,我们必须*心。套索和山脊的区别在于公式不同。套索的正则化项是绝对值,但山脊是*方值。由于公式的不同,它们的结果也会略有不同。这两种结果都会使权重变*。Ridge 只会惩罚变*的权重,但不会强制它们变为零。Lasso 可以通过在权重不相关的情况下将权重设置为零来克服山脊的缺点,从而减少模型的要素数量。总之,如果模型包含许多无用的变量,而你想去掉一些,那么 Lasso 更适合正则化。如果模型中的大部分变量都是有用的,而你想保留所有的变量,那么岭更适合正则化。

如果你想深入研究数学,看看 lasso 如何将权重设置为零,而 ridge 却不能,请查看 Chetan Patil 的答案,其中有一个很好的数学示例。

Lasso 和 ridge 只在你很了解数据集的情况下才适用,但是如果我们的模型包含大量变量,而你很难知道数据中的所有变量,那该怎么办呢?

模型中的变量可能有用也可能没用。如果你对它们没有想法,那么一个有弹性的网会帮助你。一个弹性网结合了 lasso 和 ridge 的罚项,并为它们分配不同的 lambdas。然而,缺点是计算量很大。

如何用 Python 分析一个量化金融交易假设

原文:https://towardsdatascience.com/how-to-analyse-a-quantitative-finance-trading-hypothesis-in-python-152c0ee3af67?source=collection_archive---------16-----------------------

用 Python 和多边形实现的 SMA200 简单移动*均定量分析。

图像由 AdobeStock 授权。

在这篇文章中,我将使用 Python、Jupyter Notebook 和来自 Polygon.io 的数据来分析美国股市的 200 期移动*均线。

选择这种策略的原因是,如果有任何指标可以在交易界产生共识,那就是 200 周期简单移动*均线。人们普遍认为,该指标可以用作动态支撑位/阻力位,它可以决定市场是看涨还是看跌。我们将分析确认或否认资产或工具是否对该水*做出反应。

因此,在这篇文章中:

  1. 我将简单介绍交易策略中的均线和均值回复的概念。我会这样做,因为我知道不是所有的读者都知道均值回归策略的存在,以及均线在这些策略中的作用。
  2. 我将介绍我如何使用 Jupyter 笔记本和来自 Polygon.io 的数据分析和显示信息所需的所有步骤。
  3. 我将分享我所获得的结果——在开始写这篇文章的时候我还不知道这些结果。因此,可以发现三种情况: (a) 证明 200 周期移动*均线起作用的确凿证据, (b) 证明它不按照我们分析的路径起作用的确凿证据, (c) 非确凿证据。
  4. 任何获得的结果都是正确的,从这个意义上说,评估定量策略意味着肯定的确认,否定的确认和不确定的结果。这一基本方法不会改变。

虽然通常会进行更彻底和详细的研究,但基本流程仍然与这里描述的相同,因此它将有助于那些想了解简单方法来模拟交易策略和想法的人。我将使用 Python 和日常数据使文章更容易理解,但是这里描述的方法可以应用于任何语言和任何其他时间范围。

移动*均线和均值回归

移动*均线有一个合理的逻辑动机,它构成了建立均值回复策略的基本项目。交易策略可以用不同的方法和推理来构建(你甚至可以做相反的事情,比如买入突破— ,因为它们构成了启动运动的开始——或者卖出突破——因为据说大多数突破都是失败的—),这两种策略都将根据条件而有效,但无论你构建哪种策略,几乎所有的策略都可以归类为动量或均值回复。

动量策略操作市场的惯性趋势和爆发,基本概念是趋势倾向于持续,有时由反向者推动,其他由大型参与者发起的运动的强度推动,他们将保持价格上涨(反之下跌)。均值回归策略利用了这样一个事实,即极端的价格波动之后会出现修正,而且总体而言,资产或工具的价格会趋向于其*均水*。说,可以更容易地理解,移动*均线具有充当动态支撑和/或阻力的【神奇】属性,因为它是确定资产何时到达其*均点的可量化数字。因此,通常的概念是,在趋势期间,价格倾向于对这个*均价格做出反应,不知何故,这似乎是正确的。

也有完全基于均线的策略。这些策略在经验丰富的交易者中名声不佳,但我个人认为它们对一些专门研究这类系统的交易者来说非常有效。移动*均线策略的问题是,如果没有适当的背景和一些市场机制的解读,很容易机械地实施它们。此外,像任何高度机械化的策略一样,你需要承受巨大的损失。

当市场机制强烈看跌(或强烈看涨)时,均值回归策略也可能产生毁灭性的影响,因为你可能会面临一个点,你所有的条目都丢失了,因为势头如此强大,以至于均值回归被系统地超越。理解战略的本质,正确解读市场机制,对长期战略统计数据(提款、连续亏损等)有良好的理解。)被要求在这项业务中盈利;均值回归也不例外。

有些人也使用 200 周期的日均线作为市场整体趋势的简单指标。因此,人们常说,当资产/工具的交易价格低于该价格时,市场被认为是*市,当交易价格高于该价格时,市场被认为是牛市。从这个意义上来说,200 周期日均线被用作市场指标或过滤器来排除买卖交易。如果价格高于 200 周期移动*均线,我们可以继续买入,如果价格低于 200 周期移动*均线,我们要么不买,要么卖出。

数据集

Polygon.io 获取数据

第一步是定义模拟条件。在这种情况下,我将分析 S&P500 指数的资产如何对 200 周期的日均线做出反应。有不同的途径来测试这一点。一种选择是直接使用 CME ES E-Mini S&P500 期货合约;另一个是分析跟踪 S&P500 的间谍 ETF,最后一个是分析符合 S&P500 的单个资产。

为了使文章更容易阅读和理解,我们将使用 ETF 方法。使用单个资产是可能的,但需要稍高的努力,CME 期货数据通常更昂贵。使用 SPDR·标准普尔 500 信托基金,通常以其纽约证券交易所的股票代号(SPY)而闻名,似乎是一篇介绍性文章的好方法。

间谍被世界各地的对冲基金广泛交易,因此,通过使用它,我们得到了一个准确反映 S&P500 美国股票指数的可交易资产。使用 SPY 的另一个相关优势是,我们不必像在未来合同中那样处理结算日期。

Polygon.io 可以直接访问美国所有主要交易所,它提供实时(通过 WebSockets)和历史(使用 API Rest)市场数据。对于 Python 来说,GIT 中有一个随时可以使用的访问客户端,它可以使用 pip 安装在您的 Python 发行版中:

pip3 install polygon-api-client

提供的 Python 客户端简化了对数据的访问,使我们能够专注于制定策略。

首先,我将检查我们想要操作的资产,在我们的案例中,正如所讨论的,我们将分析 S & P500 SPDR ETF

API 正确地记录在 polygon.io 中,但是客户端没有。然而,检查源代码非常简单,因为 API 方法和客户端之间存在一对一的对应关系,所以如果您不知道应该调用客户端对象的哪个方法,您可以直接在 git 中查找。

例如,如果您想要检索间谍的历史每日价格——正如我们在本例中打算的那样——我们将在 API 文档中查找,发现我们需要使用的 REST 方法是 Aggregates

Polygon.io 的 API 文档是查找需要调用的 REST 方法的地方。

REST 方法提供了检索给定时间范围内的聚合(包括每日)数据的能力。我们将使用过去 20 年的数据进行分析,这是可以检索的最大历史时期。

要调用的客户端方法是:

因此我们的第一个 Jupyter 细胞是:

从 Polygon.io 检索数据

请注意,我们正在对数据进行分割调整,这对股票非常有用。

数据时区

默认情况下,返回的时间戳似乎是复活节时间,这是您通常从数据馈送提供程序获得的时间。

总是计划并仔细检查你的时间戳和时区。时区总是容易引起麻烦,你需要确保没有出错。到目前为止,我发现的最简单的解决方案是始终使用东部时间进行模拟,即使是其他时区,如芝加哥和法兰克福仪器。

对源数据和计算机的本地时区都使用东部时间。这一规则不会对传统市场资产产生任何问题,因为夏令时发生在周六至周日的晚上,市场关闭,因此你可以只使用东部时间,忘记时区和夏令时。对于 24x7 交易加密工具,使用 GMT 可能更好。

因此,我们检查返回的第一个时间戳是(注意,我们从 1980 年就开始请求数据,用简单的英语来说就是:给我你所有的一切—):

728283600000

这对应于:

GMT Friday, 29 January 1993 05:00:00

或者

ET/EST   Friday, 29 January 1993 00:00:00 (GMT -05:00)

这意味着我们在东部时间的第一天接收数据,ETF SPY 的数据是可用的:1993 年 1 月 29 日。间谍在 1993 年 1 月 22 日开始交易,所以看起来我们得到了我们需要的一切,我们可以进一步进行。

将数据转化为可操作的东西

为了快速处理数据,我们将把数据转换成一个 NumPy 数组。我们将:

  1. 计算检索数据的长度。
  2. 为数据分配一个 7 列数组(开盘、盘高、盘低、收盘、成交量、时间戳、SMA200)。

将结果转换成 Numpy 数组

使用 NumPy 有三个原因:

  1. 它提供了向量和数组操作的函数。
  2. 它是一个 C 编译的库,将利用预编译的例程,因此,作为预编译的 C 库比常规的 Python 和 Python 数据类型更快。
  3. 它将使用针对向量运算优化的微处理器汇编指令(使用向量符号的代码通常比使用 for 循环的代码更快)。

这三个原因可以归结为一个好处:减少你需要模拟的时间。这与本例无关,但适用于大参数日内模拟。

使用 SMA200 丰富数据

下一步是为整个数据集填充一个简单的移动*均值。我们将使用 NumPy 提供的一些工具将内部操作(计算收盘价的总和)转移到 NumPy 向量操作中。我怀疑是否可以避免外部循环,但在这种情况下,这是不相关的,因为它不到 5000 次迭代。还可以使用围绕 NumPy 构建的一些辅助库来实现移动*均,这可能会提高性能,但为了使代码和解释尽可能简单,我们将只使用 for 循环。

最后一步,我准备了一个数据集,其中包含了执行分析所需的所有信息。

分析

从假设到可测量的策略

要测试的确切假设是:

  1. 当价格在均线上反弹时(穿过均线,但收盘时在均线上方),均线是动态支撑(与*市相反)。
  2. 当价格违反移动*均线时(穿过移动*均线并在移动*均线下方收盘),移动*均线无效,因此资产/工具/市场开始了看跌行动(看跌行动可以采用相反的方式)。

为了评估价格是否反弹,我们将检查未来几天的价格是高还是低。如果所谓的反弹存在,那么在均线被穿越后的接下来几天应该会有一个看涨的趋势。我也会分析接* SMA 但不触及它的价格。

这个标准多少有点武断,当然,还可以(也应该)进行其他一些分析。但作为起点是一样好的。这样做的目的是让分析保持简单,以显示该过程是如何完成的:

  1. 我们根据自己的交易经验/外部想法或行业知识制定直观的方法/策略。
  2. 我们将启发式想法/策略转化为可测量、可量化的策略。
  3. 我们评估这个策略。
  4. 如果结果显示这条研究路径可能会导致可操作的策略,我们会重复不同的参数或想法。

用 Python 实现策略

在这种情况下,我将生成一个类型为 bool 的 NumPy 数组— 对应于底层 C 库中的 bool 类型—。这个数组包含分析和测量假设的条件。

可以使用 Pandas 数据框(通常用于需要不同数据类型的大型策略)。在其他语言中,方法会稍有不同(在 C #中,我使用结构的链表),但是向数据集添加带有条件和中间结果的列的模式是相同的。

SMA200 成为价格反弹的动力支撑

第一个测试将评估跨越 SMA200 的价格。将评估两种不同的情况:价格收盘在移动*均线以上,价格收盘在移动*均线以下。

NumPy 数组由三列填充,如果前一天的价格高于 SMA200,第一列包含 True。当最低价低于 SMA200 但收盘价高于 SMA 200 时,第二列存储 True。当收盘价低于 SMA200 时,第三列存储 True。这三列是独立生成的。稍后将使用 NumPy 选择器合并这些条件,以分析特定的场景。

在这种情况下,为条件/结果定义了一个单独的 NumPy 数组,但是也可以有一个集成了数据和模拟结果的 Pandas 数据框架。在这种情况下,会向模拟数据中添加额外的列。

测试作为动态支撑的 SMA200

结果如下:

There are 59 times when price crosses the 200 period mean but price closes above it.
When that happens:
  21 times the next day is bullish
  38 times the next day is bearish
  35.59322033898305% of times the next day is bullish
  64.40677966101694% of times the next day is bearish

There are 39 times when price crosses the 200 period mean and price closes below it.
When that happens:
  18 times the next day is bullish
  21 times the next day is bullish
  46.15384615384615% of times the next day is bullish
  53.84615384615385% of times the next day is bearish

首先可以注意到的是,每天穿越 SMA200(前一天在 SMA200 上方时)并不常见。自 1993 年以来,这种情况只发生过 98 次。所以每年发生三次。

第二件要注意的事情是,当价格收盘低于 SMA 时,第二天的价格方向是高度不确定的(46%比 53%),所以这不会提供任何统计优势。

第三件可以注意到的事情是,当价格收盘在 SMA 上方时,第二天往往是*市而不是牛市,因此我们没有注意到任何反弹,至少在移动*均线被穿越后的第二天。SMA200 作为动态支撑的共识——也是口头禅——对于反弹的这个具体定义来说,实际上并不成立。64%对 36%实际上是一个统计优势,在我看来,必须加以考虑。

在这里,我们可能会对不同反弹定义的进一步测试感兴趣。例如,我们可能希望分析第二天的开盘是否高于移动*均线交叉时的收盘价格(这样我们就可以买入/卖出开盘缺口)。这意味着只需将条件更改为:

# RESULT - NEXT DAY IS BULLISH (1) OR BEARISH (0) - USE OPENING GAP
if(dataset[i+1,OPEN] > dataset[i,CLOSE]):
    analysis[i,NEXT_DAY] = True

如果对该标准进行测试,我们会得到以下结果:

There are 59 times when price crosses the 200 period mean but price closes above it.
When that happens:
  30 times the next day opens higher
  29 times the next day opens lower
  50.847457627118644% of times the next day opens higher
  49.152542372881356% of times the next day opens lower

There are 39 times when price crosses the 200 period mean and price closes below it.
When that happens:
  26 times the next day opens higher
  13 times the next day opens lower
  66.66666666666666% of times the next day opens higher
  33.33333333333333% of times the next day opens lower

根据这些标准,当价格收盘在 SMA 上方时,我们对第二天的价格没有任何线索。对于价格收盘低于 SMA 的情况,我们可以确定一个统计优势:价格倾向于高开。

有了这些结果,在日线 SMA200 被突破后的第二天,但价格已经在它上方收盘,我肯定不会寻找多头头寸,这违反了共识。

我们还可以评估第二天的最高价是否高于移动*均线被穿过的当天的最高价。这些是结果:

# RESULT - NEXT DAY IS BULLISH (1) OR BEARISH (0) - USE HIGHS
    if(dataset[i+1,HIGH] > dataset[i,HIGH]):
        analysis[i,NEXT_DAY] = True
---
There are 59 times when price crosses the 200 period mean but price closes above it.
When that happens:
  28 times the next day high is higher
  31 times the next day high is not higher
  47.45762711864407% of times the next day high is higher
  52.54237288135594% of times the next day high is not higher

There are 39 times when price crosses the 200 period mean and price closes below it.
When that happens:
  6 times the next day high is higher
  33 times the next day high is not higher
  15.384615384615385% of times the next day high is higher
  84.61538461538461% of times the next day high is not higher

同样,没有确凿的证据(52%对 47%)表明价格收盘高于 SMA,并且价格收盘低于 SMA 时,价格没有超过前一天的高点(84%对 15%)。如果价格达到前一天的最大值,最新的情况是做空的好时机。然而,值得注意的是,目前的会议低和高价格是不可操作的,因为我们不知道他们提前。

务必要反复检查每个结果,以确保模型准确地代表我们的交易假设。诸如事件发生的次数(为了获得统计上有效的结果)、我们得到哪些统计值以及如何定义模型之类的附加点与找到可操作的边相关。本文未涉及的其他方面,如 MAE、利润/损失比率或参数敏感性也应包括在内。

由于结果没有证实假设,我们将质疑用于定义反弹的模型。用 SMA200 看看 S&P500 的日线图可能会有帮助:

S&P500 的未来(续)。带 SMA200 的日线图。

似乎很明显,SMA200 起到了动态支撑/阻力的作用。但是如果对图表进行详细分析:

  1. 价格接*均线,经常反弹,但有时甚至不触及均线。
  2. 反弹并不总是清晰的,有时它在同一个日线蜡烛线出现,有时在下一个蜡烛线出现,有时在第三个蜡烛线出现。

看过图表后,我们可以将反弹定义为第二天的低点高于价格穿过*均线时的低点。如果对这种情况进行分析:

# RESULT - NEXT DAY IS BULLISH (1) OR BEARISH (0) - USE LOWS
    if(dataset[i+1,LOW] > dataset[i,LOW]):
        analysis[i,NEXT_DAY] = True
---
There are 59 times when price crosses the 200 period mean but price closes above it.
When that happens:
  37 times the next day's low is higher than SMA day's low
  22 times the next day's low is lower than SMA day's low
  62.71186440677966% of times the next day's low is higher
  37.28813559322034% of times the next day's low is lower

There are 39 times when price crosses the 200 period mean and price closes below it.
When that happens:
  14 times the next day's low is higher than SMA day's low
  25 times the next day's low is lower than SMA day's low
  35.8974358974359% of times the next day's low is higher
  64.1025641025641% of times the next day's low is lower

使用这种新模型,当价格收盘高于*均价格时,第二天的最低价有 62%比 37%的机会高于当天的最低价。

相反,当价格收盘低于 SMA 时,64%对 35%的情况下第二天的低点会更低。

虽然这符合假设和移动*均线作为动态支撑的概念,但重要的是要理解这一新定义并没有定义可交易的行为,因为我们永远不会提前知道低/高价格(我们知道开盘价/收盘价,因为我们总是可以在最后或第一分钟买入/卖出开盘价或收盘价,*均来说,我们将接*开盘价/收盘价)。

我想在这里强调的想法是,虽然一切都是从一个基本和简化的模型开始的,但是迭代通常是需要的。这需要一直做下去,直到找到与我们的经验一致且可行的东西,或者直到这个想法被抛弃。

对于这种特殊情况,可以(并且可能应该)定义更复杂的模型。例如,可以定义移动*均值周围的阈值和范围。还可以定义移动*均线以下的穿透范围和移动*均线以上的反弹范围。通过这样做,可能会模拟出一个更精确的模型。有了范围和值,还可以进行参数模拟,找到可交易的策略。

按照相同的程序,但颠倒符号,SMA200 可以被分析为电阻。对于这种情况,我们得到以下结果:

There are 31 times where crosses the 200SMA but price closes below it.
When that happens:
18 times next day is bullish
13 times next day is bearish
  58.06451612903226% of times the next day is bullish
  41.935483870967744% of times the next day is bearish

There are 40 times where crosses the 200SMA and price closes above it.
When that happens:
15 times next day is bullish
25 times next day is bearish
  34.883720930232556% of times the next day is bullish
  58.139534883720934% of times the next day is bearish

可以用与前几份报告类似的方式进行分析。

作为看涨/趋势市场指标/过滤器的 SMA200

第二个分析评估 SMA200 是否能给我们一些关于市场整体趋势的信息,以及它是否能被用作排除买入或卖出交易的过滤器。

同样,需要定义一个初始的、可操作的和可测量的模型。为了简单起见,我们分析价格收盘低于 SMA200 的影响,并评估这是否会在一周和一个月后产生更低的价格。分析是完全相同的,但是这次我们创建了两个额外的列来测试 7 天和 30 天后的价格。所分析的情况是当前价格和一周/一个月远期价格都很低。

这些是结果:

There are 59 times when price crosses the 200 period mean but price closes above it.
When that happens:
  37 times the next day low is higher
  22 times the next day low is lower36 times the next week low is higher
  23 times the next week low is lower

  43 times the next month low is higher
  16 times the next month low is lower

There are 38 times when price crosses the 200 period mean and price closes below it.
When that happens:
  14 times the next day low is higher
  24 times the next day low is lower21 times the next week low is higher
  17 times the next week low is lower

  23 times the next month low is higher
  15 times the next month low is lower

从长期来看,日价格收于 SMA200 上方的情景更加乐观。43 倍对 16 倍的价格高于 SMA200 交叉时的价格。

当穿过 SMA200 且价格收于其下方时,长期来看仍是看涨的,但强度较*。一个潜在的结果是,当价格穿越并收于 SMA200 下方时,更有可能出现*市。

不要相信任何东西,质疑一切

理解每一个结果都必须被质疑是很重要的。按照我们的例子,值得一提的是我们最后的结果“证明”了 200 周期的 SMA 起到了动态支撑的作用。当价格收盘在 SMA 之上时,这种偏差更加明显,但当价格收盘在 SMA 之下时,这种偏差也存在(一个月后价格上涨了 23 倍,而价格下跌了 15 倍)。

这是否意味着 200 SMA 均线作为动态支撑?理论上是的,但重要的是,我们分析了一个很大程度上看涨的指数(S&P500)。日线图不允许有那么多的案例和广泛的分析,因为即使像这个例子中那样用了那么多年,数据集也不大。市场机制是相关的,对于日内策略,你可能既要关注*市,也要关注牛市。这将有助于你理解给定的分析或策略在不同条件下的表现。

另一种选择——对于这种特殊的分析——是对不那么乐观的指数进行同样的分析,比如法兰克福 DAX 指数或悉* ASX 指数。在任何情况下,重要的一点是,每个结果都必须进一步质疑,尤其是当我们不处理大型数据集或数据集倾向于有偏差时(如 S&P500 在分析期间表现强劲)。

附加步骤

这里的分析非常简单,主要介绍如何在 Python 中进行定量分析的一般工作流程。在现实生活的分析方面,如进一步的模型定义,风险和参数分析将需要详细涵盖。

如何分析单个时间序列变量

原文:https://towardsdatascience.com/how-to-analyse-a-single-time-series-variable-11dcca7bf16c?source=collection_archive---------19-----------------------

探索时间序列建模

用 Python 代码进行时间序列建模

Unsplashtangi bertin 拍摄的照片

欢迎回来!这是专栏的第二篇文章,探索用 Python 代码对时间序列数据进行分析和建模。如果你不熟悉基本的统计学概念,比如估计量、假设检验、p 值等,可以看看我之前的帖子: 用 Python 代码进行时间序列建模:基本面统计

在这篇文章中,我们将开始探索分析一个单一的时间序列变量。给定一个时间序列变量,我们应该从哪里开始分析?我们如何深入了解这些数据?老实说,我第一次被要求对一个. csv 文件格式的时间序列数据进行分析时,没有任何关于数据源和应用程序的进一步信息,我不知道从哪里开始。在这篇文章之后,希望下次你会有一些关于如何开始分析一个时间序列变量的想法。

在这里,我将分析历史苹果股票价格数据。的。csv 文件可以从雅虎财经下载。我下载了去年的 AAPL 数据,从 2019 年 3 月 13 日到 2020 年 3 月 13 日。原始数据包括每日开盘价、最高价、最低价、收盘价、调整收盘价和成交量。在这篇文章中,我将分析 AAPL 的每日收盘价。

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
AAPL_price.set_index('Date',inplace=True,drop=True)AAPL_price.plot(legend=False)
plt.title('AAPL Daily Close Price')

1.滚动*均值和方差

样本参数不是恒定的,它们也是随时间变化的。单点样本均值或样本方差不会向我们透露太多信息。如果不知道样本参数的方差,我们就无法知道样本参数对总体参数的估计有多好。因此,我们不能依赖点样本均值或样本方差来估计总体参数。

我们将应用滚动窗口方法获得一年期间的多个样本均值和样本方差值,而不是从一年的 AAPL 股票价格数据计算一个点的样本均值和样本方差值。以下代码显示了如何以 10、30 和 50 的不同窗口大*显示样本均值。

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
AAPL_price.set_index('Date',inplace=True,drop=True)ax = AAPL_price.plot(legend=False)
ax.set_title('AAPL Daily Close Price')AAPL_price.rolling(window=10).mean().plot(ax=ax)
AAPL_price.rolling(window=30).mean().plot(ax=ax)
AAPL_price.rolling(window=50).mean().plot(ax=ax)ax.legend(['Daily price', 'm=10', 'm=20', 'm=30'])

类似地,我们可以用不同的窗口大*来可视化样本方差。

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
AAPL_price.set_index('Date',inplace=True,drop=True)ax = AAPL_price.plot(legend=False)
ax.set_title('AAPL Daily Close Price')AAPL_price.rolling(window=10).var().plot(ax=ax)
AAPL_price.rolling(window=30).var().plot(ax=ax)
AAPL_price.rolling(window=50).var().plot(ax=ax)ax.legend(['Daily price', 'm=10', 'm=30', 'm=50'])

当选择窗口大*时,总是有一个折衷。以滚动样本均值为例,我们会发现较大的窗口大*会生成更*滑的滚动样本均值图。我喜欢从过拟合和欠拟合的角度来考虑窗口大*的选择。*窗口尺寸倾向于捕捉每个时间点的更详细的信息,而大窗口尺寸包括更长时间段的更全面的信息。这样,*的窗口大*可能会造成过拟合,因为它过于关注每个时间点的移动。而大的窗口尺寸可能导致拟合不足,因为它捕捉了太多的整体趋势,但忽略了每个点的局部运动。因此,应仔细选择合适的窗口大*,以避免过度拟合和欠拟合。

2.*稳性和弱相关性

为了用普通最*二乘法(OLS)来估计生成过程,时间序列数据需要*稳和弱相关。OLS 是线性回归中常用的方法,将在本系列第 4 篇文章中详细讨论: 用 Python 代码进行时间序列建模:如何用线性回归对时间序列数据建模。

*稳性有三个要求。时间序列数据的均值和方差都是常数。此外,具有滞后(h)的两个时间点的协方差是滞后的函数,而不应依赖于时间点(t)。

弱相关性要求当滞后 h 变得无穷大时,两个时间点的相关性变为零。

3.自回归过程和移动*均过程

常见的时间序列过程有两种:自回归过程和移动*均过程。我们将详细讨论这两个过程。

3.1 自回归过程性质

对于自回归过程,时间序列数据依赖于自身,具有时滞。当时间序列数据仅依赖于自身且时滞为 1 时,该过程称为 AR(1)。如果时间序列数据依赖于自身,滞后时间为 N,那么这个过程称为 AR(N)。

这里以 AR(1)为例。如果满足两个要求,AR(1)过程是*稳的和弱相关的:第一个时间点的期望值为零,时间序列依赖于前一个时间点,乘法参数位于-1 和 1 之间。

AR(1)流程属性

在 AR(1)过程中,ρ的值决定了 AR(1)过程是否*稳。以下是ρ如何影响 AR(1)过程的简单可视化。从结果中我们可以看出,当ρ越接* 1 时,AR(1)过程穿越零线的频率越低。

import numpy as np
import matplotlib.pyplot as pltN = 10000
rho = 1sigma = np.random.normal(loc=0, scale=1, size=N)
x = [0]
for i in range(1,N):
    x.append(rho*x[-1]+sigma[i])plt.plot(x, label='rho=1')
plt.legend()
plt.xlim(0,N)

ρ为 0.9,0.99,1 的 AR(1)过程

3.2 移动*均过程属性

MA(1)过程是*稳的、弱相关的。

MA(1)流程属性

3.3 自相关函数(ACF)和偏自相关函数(PACF)

根据上述 MA(1)和 AR(1)的性质,我们可以将相关性写为:

通过绘制不同时滞的相关性,我们可以清楚地看到 AR(1)过程和 MA(1)过程的区别。这个相关图被称为自相关函数(ACF)。AR 过程的 ACF 图显示指数下降,并且在几个时间点之后相关性下降到几乎为零。然而,MA(1)过程的 ACF 图显示,在前两个时间点之后,相关性迅速下降到零。

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acfN = 10000
rho = 0.5sigma = np.random.normal(loc=0, scale=1, size=N)
x = [0]
for i in range(1,N):
    x.append(rho*x[-1]+sigma[i])plot_acf(np.array(x),lags=10)

AR(1)过程的 ACF

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acfN = 10000
theta = 0.5sigma = np.random.normal(loc=0, scale=1, size=N+1)
x = []
for i in range(1,N+1):
    x.append(sigma[i]+theta*sigma[i-1])plot_acf(np.array(x),lags=10)

MA(1)过程的 ACF

虽然 ACF 图可以用来区分 MA 和 AR 过程,但它不能很好地区分 AR(1)过程和 AR(2)过程。偏自相关函数(PACF)可以用来区分 AR(1)和 AR(2)过程。如下例所示,AR(1)过程的 PACF 显示相关性在前 2 个时间点后迅速下降到零,而 AR(2)过程的 PACF 显示相关性在前 3 个时间点后下降到零。

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_pacfN = 10000
rho = 0.5
rho2 = 0.4sigma = np.random.normal(loc=0, scale=1, size=N)
x = [0,0]
for i in range(2,N):
    x.append(rho*x[-1]+rho2*x[-2]+sigma[i])plot_pacf(np.array(x),lags=10)

AR(1)和 AR(2)过程的 PACF

4.整合过程的顺序

4.1 单位根和迪基-富勒检验

如上图,当ρ为 1 时,AR(1)过程是非*稳的。AR 过程中ρ=1 的情况称为单位根。下面是单位根为什么是非*稳的一个简单证明。

单位根是非*稳的一个简单证明

单位根可以用扩展的 Dickey-Fuller (ADF)检验。

import pandas as pd
from statsmodels.tsa.stattools import adfullerAAPL_price = pd.read_csv('AAPL.csv',usecols=['Close'])
result = adfuller(AAPL_price.iloc[:,0].values)
print(f'p value is {result[1]}')

输出:

p 值为 0.5961654850033034

由于 p 值大于 0.05 的显著性水*,我们不能拒绝时间序列数据是非*稳的零假设。因此,时间序列数据是非*稳的。

具有单位根的 AR 过程是序列相关的。然而,序列相关的时间序列数据不一定是具有单位根的 AR 过程。

4.2 整合过程的顺序

对于有单位根的 AR 过程,如果时间序列数据的一阶差分是*稳的,那么时间序列数据遵循 I(1)过程。类似地,如果需要二阶差分来获得*稳数据,则该过程遵循 I(2)过程。为了找出整合过程的顺序,需要测试一系列 ADF。

如何检验整合过程的顺序

摘要

在这篇文章中,我们讨论了如何分析单个时间序列变量。通常,我们可以通过绘制时间序列数据的滚动*均值和方差来开始分析。然后我们可以用 ACF 检验来看时间序列数据是遵循自回归过程还是移动*均过程。如果数据遵循自回归过程,那么我们可以使用 PACF 检验来寻找自回归过程的阶。此外,我们可以使用 Dickey-Fuller 测试来确定时间序列数据是否遵循积分过程。

在下一篇文章中,我们将继续讨论如何分析多个时间序列变量。敬请关注!

如何分析多个时间序列变量

原文:https://towardsdatascience.com/how-to-analyse-multiple-time-series-variable-5a8d3a242a2e?source=collection_archive---------33-----------------------

探索时间序列建模

用 Python 代码进行时间序列建模

照片由 tangi bertinUnsplash 上拍摄

欢迎回来!这是探索用 Python 代码对时间序列数据进行分析和建模的系列文章中的第 3 篇。在第一篇文章中,我们已经讨论了基础统计: 用 Python 代码进行时间序列建模:基础统计 。第二个帖子已经涵盖了单个时间序列变量的分析: 用 Python 代码进行时间序列建模:如何分析单个时间序列变量

在本帖中,我们将继续探讨如何分析多个时间序列变量。

1。滚动协方差

协方差是两个随机变量的联合线性可变性的度量。协方差本身很难解释,因为它取决于变量的大*。为了归一化协方差,通常使用相关系数。两种常用的相关系数是:皮尔逊相关系数和斯皮尔曼排名相关系数。

皮尔逊相关系数值在-1 到 1 之间,其中-1 表示强的负线性关系,0 表示没有线性关系,1 表示强的正线性关系。

斯皮尔曼的排名相关系数值也位于-1 和 1 之间。但 Spearman 的排名相关系数衡量的是两个变量之间的单调性,其中-1 表示强负单调关系,0 表示无单调关系,1 表示强正单调关系。要理解这两个变量之间的单调性,我们可以想到(y₁ -y₁)是如何随(y₂ -y₂)变化的:如果它们同向变化,那么这两个变量就是正单调的;否则,它们是负单调的。

以下模拟显示了皮尔逊相关系数和斯皮尔曼排名相关系数之间的差异。当 y1 和 y2 呈线性关系时,皮尔逊相关系数和斯皮尔曼排名相关系数都接* 1。然而,当 y1 和 y2 呈现单调关系时,皮尔逊相关系数变得*于斯皮尔曼排名相关系数。

import numpy as np
from scipy.stats import spearmanr
from scipy.stats import pearsonr
import matplotlib.pyplot as pltN=20
x = np.linspace(1,N,num=N)
y1 = x*5 + np.random.normal(0, 3, N)
y2 = np.exp(0.3*x) + np.random.normal(0, 3, N)
#y2 = y1 + np.random.normal(0, 3, N)plt.scatter(x,y1,color='r',label='y1 = x*5 + np.random.normal(0, 3, N)')
plt.scatter(x,y2,color='b',label='y2 = y1 + np.random.normal(0, 3, N)')
plt.legend(loc='upper left')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(0,N)
plt.ylim(min(min(y1),min(y2)),max(max(y1),max(y2)))

皮尔逊系数衡量两个变量的线性,而斯皮尔曼系数衡量两个变量的单调性

2.虚假关系与滚动协整

为了使用时间序列数据 x 对时间序列数据 y 建模,我们通常要求 x 和 y 都是*稳的 I(0)过程。如果不熟悉单个时间序列变量的*稳性检验,可以参考我之前的帖子: 用 Python 代码进行时间序列建模:如何分析单个时间序列变量

当两个时间序列变量都是非*稳的时,即使基本的生成过程没有偶然的关系,它们也可能表现出很强的相关性。这种强烈的相关性可能纯粹是由两个时间序列变量具有非常数均值这一事实引起的。这种现象被称为虚假关系。

然而,在特殊情况下,我们可以使用时间序列数据 x 对时间序列数据 y 建模,当 x 和 y 都是 I(1)过程且协整时。基本上,协整意味着 x 和 y 之间存在放大效应,在任何时间点,我们总是可以将 x 乘以同一个参数,得到一个接* y 的值,这样,残差就是 I(0)过程。

x 和 y 之间的协整

使用 statsmodels 库可以很容易地检验协整。

import numpy as np
from statsmodels.tsa.stattools import cointN=20
x = np.linspace(1,N,num=N)
y1 = x*5 + np.random.normal(0, 3, N)
y2 = np.exp(0.3*x) + np.random.normal(0, 3, N)
print(f'P value is {coint(y1,y2)[1]}')

输出:

p 值为 0.9859002580259643

由于 P 值大于 0.05 的显著性水*,我们不能拒绝不存在协整的零假设。

摘要

在这篇文章中,我们讨论了如何分析多个时间序列变量的协方差和协整性。在下一篇文章中,我们将更进一步,探索如何使用线性回归来建模时间序列数据。敬请关注!

如何分析你最喜欢的音乐艺术家的歌词的情感和文字

原文:https://towardsdatascience.com/how-to-analyze-emotions-and-words-of-the-lyrics-from-your-favorite-music-artist-bbca10411283?source=collection_archive---------11-----------------------

使用 Python 对歌词进行文本和情感分析的有趣方式。

加布里埃尔·巴西诺在 Unsplash 上的照片

音乐是一种表达我们情感的强大语言,在很多情况下,它被用作处理生活中艰难时刻的一种疗法。音乐中使用的不同声音、节奏和效果能够在一瞬间改变我们的情绪,但当我们听音乐时,有一个成分有时会被忽略;歌曲的歌词。

歌词是强有力的文本,分享了作者创作歌曲时的想法。这就是为什么我决定分析我最喜欢的乐队之一的歌词;金属。

在他们的音乐生涯中,Metallica 的歌词在概念和想法上有了明显的变化,考虑到他们从 80 年代开始演奏音乐到现在,这个乐队是一个很好的学习选择。

在这篇文章中,我将展示和解释我如何使用单词云一个统计表单词频率比较图VADER 情感分析、和 Genius 提供的一个很酷的数据集来实现这个想法。所以没什么好说的了,让我们开始工作吧!。

必需的库:

  • *猫Numpy 进行数据分析。
  • 重新管柱进行数据清洗。
  • MatplotlibWordcloud 来绘制漂亮的图形。
  • 用于情感分析、标记化和词条化。
  • Sklearn 统计词频。
  • Lyricsgenius 提取歌词数据。
  • Genius 凭证访问他们的 API 和数据采集(单击此处了解更多信息)。
  • 脚本 Helpers.py 存储用于提取、清理和转换数据的函数(该脚本由我创建,位于我的 GitHub 存储库中)
#libraries used to extract, clean and manipulate the datafrom helpers import *
import pandas as pd
import numpy as np
import string#To plot the graphsfrom wordcloud import WordCloud
import matplotlib.pyplot as plt
plt.style.use('seaborn')#library used to count the frequency of wordsfrom sklearn.feature_extraction.text import CountVectorizer#To create the sentiment analysis model, tokenization and lemmatizationimport nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from nltk import word_tokenize
import nltk.data
nltk.download('vader_lexicon')
nltk.download('punkt')

完整的代码、脚本、笔记本和数据都在我的 Github 存储库中

(点击这里)

1.获取、清理和转换数据

1.1 创建歌词数据:

第一步是获得艺术家最流行歌曲的信息。为此,我创建了一个名为 search_data() 的函数,该函数有助于自动收集每首歌曲的属性。该函数使用库 lyricsgenius 来获取数据,并且您必须传递参数艺术家姓名要提取的最大歌曲数量,以及您的客户端访问令牌:

#Extracting the information of the 50 most popular songs of Metallica using function created on helpers scriptaccess_token = "your_genius_access_token"
df0 = search_data('Metallica',50,access_token)

提取金属乐队最受欢迎的 50 首歌曲(图片由作者提供)

提取了信息的数据框(图片由作者提供)。

您可能已经注意到,“歌词”列中有许多单词和符号对于研究并不重要,因为它们用于解释歌曲的结构,所以我使用函数 clean_data()清理了这些信息,并创建了一个新列来按十年对歌曲进行分组。这个新列将帮助我们在分析数据时有更好的理解。最后,我过滤了信息,只使用有歌词的歌曲,因为有些艺术家有器乐歌曲。

#cleaning and transforming the data using functions created on helpers scriptdf = clean_lyrics(df0,'lyric')#Create the decades columndf = create_decades(df)#Filter  data to use songs that have lyrics.df = df[df['lyric'].notnull()]#Save the data into a csv filedf.to_csv('lyrics.csv',index=False)df.head(10)

已提取信息的干净数据帧(图片由作者提供)。

现在我们有了一个干净的数据框架来开始创建我们的单词数据框架。您可以点击这里的访问该数据的 CSV 文件。

1.2 创建单词数据:

为了对金属乐队的歌词进行完整的分析,我想看看他们在不同年代是如何使用词汇的。所以我必须根据每首歌的歌词创建一个单词的数据框架。为了做到这一点,首先我考虑了歌词中独特的词,因为一些歌曲在合唱部分重复了相同的词。我定义了一个名为 unique 的函数来完成这个过程,这个参数对应于一个单词列表

def unique(list1):
   # intilize a null list
     unique_list = []
   # traverse for all elements
     for x in list1:
         # check if exists in unique_list or not
         if x not in unique_list:
              unique_list.append(x)
     return unique_list

然后我使用下面的代码来存储歌词的唯一单词,这个函数是上面定义的,另一个函数叫做 lyrics_to_words,你可以在 helpers 脚本中找到。我把这些信息保存在歌词数据框中一个名为单词的新栏目里。

#Stores unique words of each lyrics song into a new column called words#list used to store the wordswords = []#iterate trought each lyric and split unique words appending the result into the words listdf = df.reset_index(drop=True)for word in df['lyric'].tolist():
    words.append(unique(lyrics_to_words(word).split()))#create the new column with the information of words listsdf['words'] = words
df.head()

包含新单词列的数据框(图片由作者提供)

正如你可能注意到的,现在我们有一个存储歌词中每首歌的独特单词的栏目。

但这是创建我们的单词数据框架的第一步。下一步是使用这个新单词列,按十年计算一个独特的单词在歌曲歌词中使用的次数,并将所有这些结果存储到一个新的 5 列数据框中,一列用于单词,其他列用于按十年计算的出现频率。

考虑根据每个数据删除自己的停用词很重要,以防 clean 函数不能删除所有停用词。停用词是自然语言中意义不大的词,如“and”、“the”、“a”、“an”以及类似的词。

#Create a new dataframe of all the  words used in lyrics and its decades#list used to store the informationset_words = []
set_decades = []#Iterate trought each word and decade and stores them into the new listsfor i in df.index:
   for word in df['words'].iloc[i]:
       set_words.append(word)
       set_decades.append(df['decade'].iloc[i])#create the new data frame  with the information of words and decade listswords_df = pd.DataFrame({'words':set_words,'decade':set_decades})#Defined  your own Stopwords in case the clean data function does not remove all of themstop_words =
['verse','im','get','1000','58','60','80','youre','youve',
  'guitar','solo','instrumental','intro','pre',"3"]# count the frequency of each word that aren't on the stop_words listscv = CountVectorizer(stop_words=stop_words)#Create a dataframe called data_cv to store the the number of times the word was used in  a lyric based their decadestext_cv = 
cv.fit_transform(words_df['words'].iloc[:])data_cv = pd.DataFrame(text_cv.toarray(),columns=cv.get_feature_names())
data_cv['decade'] = words_df['decade']#created a dataframe that Sums the ocurrence frequency of each word and group the result by decadevect_words = data_cv.groupby('decade').sum().Tvect_words = vect_words.reset_index(level=0).rename(columns ={'index':'words'})vect_words = vect_words.rename_axis(columns='')#Save the data into a csv filevect_words.to_csv('words.csv',index=False)#change the order of columns to order from the oldest to actual decadevect_words = vect_words[['words','80s','90s','00s','10s']]
vect_words

点击这里的可以进入查看代码。

金属乐队歌词的数据框架(图片由作者提供)。

这个数据框很有趣也很有用,因为它向我们展示了 Metallica 根据歌曲发行的年代在歌词中使用一个词的次数。例如,年轻这个词在 20 世纪 80 年代的一首歌中出现,在 20 世纪 90 年代的两首歌中出现,在 21 世纪初和 2010 年代出现 0 次。

您可以点击这里访问该数据的 CSV 文件。

2.享受分析数据的乐趣

为了开始分析 Metallica 创作他们的歌词所用的词,我想回答我脑海中的许多问题。这些问题是:

  • 十年来,他们的歌词中最常用的词是什么?
  • 每首歌用了多少词?
  • decade 使用的总词和独特词有哪些?
  • 一个特定十年中使用频率最高的单词与其他十年相比如何?

2.1 按十年划分的词云:

谷歌引用的词云是“由特定文本或主题中使用的词组成的图像,其中每个词的大*表明其频率或重要性”。为此,单词 Cloud 按十年分组,将向我们展示在不同的十年中金属乐队的歌词中使用最频繁的单词。

我使用 Matplotlib 和 Wordcloud 库创建了这个图表,其中有一个函数,您必须根据您想要绘制的年代传递数据框、数字的行数和列数。在我的例子中,我有 4 个十年(80 年代,90 年代,00 年代,10 年代),我想要 2x2 格式的图表。

def plot_wordcloud(df,row,col):
     wc = WordCloud(background_color="white",colormap="Dark2",
                     max_font_size=100,random_state=15)
     fig = plt.figure(figsize=(20,10))

     for index, value in enumerate(df.columns[1:]):
       top_dict = dict(zip(df['words'].tolist(),df[value].tolist()))
       wc.generate_from_frequencies(top_dict)
       plt.subplot(row,col,index+1)
       plt.imshow(wc,interpolation="bilinear")
       plt.axis("off")
       plt.title(f"{value}",fontsize=15)plt.subplots_adjust(wspace=0.1, hspace=0.1)
    plt.show()#Plot the word cloud
plot_wordcloud(vect_words,2,2)

按十年列出的最常用单词的单词云(图片由作者提供)

观察在金属乐队音乐生涯的不同时期使用的词汇之间的差异是很酷的。在 80 年代,单词集中在与生与死有关的概念上,而在 10 年代,单词则是关于感情的更深刻的概念。

2.2 文字统计表:

我还定义了一个函数来计算几十年中不同时期的字数统计。您必须将歌词的数据帧和单词的数据帧作为参数传递。我使用了以下代码来创建该表:

def words_stats(df,main_df):
    unique_words = []
    total_words = []
    total_news = []
    years = []

    for value in df.columns[1:]:
        unique_words.append(np.count_nonzero(df[value]))
        total_words.append(sum(df[value]))
        years.append(str(value))
        total_news.append(main_df['decade'    [main_df['decade']==value].count())data = pd.DataFrame({'decade':years,
                          'unique words':unique_words,
                          'total words':total_words,
                          'total songs':total_news})data['words per songs'] = 
         round(data['total words'] / data['total songs'],0)data['words per songs'] = 
         data['words per songs'].astype('int')return data#display the table of statistics
words_stats(vect_words,df)

十年词汇统计表(图片由作者提供)。

有了这个表格,我们可以显示很多关于 Metallica 的歌曲和歌词的信息。例如,80 年代有更多的词和歌曲,这是因为最著名的歌曲都是在这十年间发行的。2000 年代每首歌的字数少于其他几十年,也许我们可以推断 2000 年代的歌曲比其他几十年的时间短。

2.3 几十年间一个词出现频率的比较:

另一个可以帮助我们理解这一数据的很酷的分析是看一看十年中使用最频繁的单词与其他十年中相同单词的频率相比的趋势。

使用下面的函数,您可以创建一个线形图,以查看一组常用词在特定十年中的趋势。例如,如果我想将 20 世纪 80 年代的 10 个最常见的单词与其他几十年进行比较,我必须将这些信息和单词的数据帧作为参数传递给函数:

def plot_freq_words(df,decade,n_words):
    top_words_2020 =   
        df.sort_values([decade],ascending=False).head(n_words)fig = plt.figure(figsize=(15,8))plt.plot(top_words_2020['words'],top_words_2020[df.columns[1]])
    plt.plot(top_words_2020['words'],top_words_2020[df.columns[2]])
    plt.plot(top_words_2020['words'],top_words_2020[df.columns[3]])
    plt.plot(top_words_2020['words'],top_words_2020[df.columns[4]])plt.legend(df.columns[1:].tolist())
    plt.title(f"Most frequent words in {decade} compared with other   decades",fontsize=14)
    plt.xlabel(f'Most Frequent Words of {decade}',fontsize=12)
    plt.ylabel('Frecuency',fontsize=12)
    plt.xticks(fontsize=12,rotation=20)
    plt.yticks(fontsize=12)
    plt.show()#Ploting the comparision plot
plot_freq_words(vect_words,'80s',10)

比较不同年代单词出现频率的图表

你可能会注意到,在 20 世纪 80 年代,金属乐队歌词中最常用的两个词是“生”和“死”,两个词都出现了 12 次。但是在 20 世纪 90 年代,只有 6 首歌词使用了“公正的生活”,而在接下来的几十年里,只有 1 首歌词使用了“死亡”。

3.歌曲歌词的情感分析

NLKT Python 库的【VADER】(价感知词典和情感推理机)是一个词库和基于规则的情感分析工具 VADER 使用了一个情感词典的组合是一个词汇特征(例如,单词)的列表,这些词汇特征通常根据它们的语义取向被标记为正面或负面。VADER 模型使用 4 种不同的情感指标。

  • 阴性中性阳性度量表示属于这些类别的文本比例。
  • 复合指标计算所有词汇等级的总和,它是介于-1(消极性的最大限度)和 1(积极性的最大限度)之间的标准化值。

如果你想了解更多关于 VADER 指标的信息,请点击这里

我使用下面的代码来计算数据帧的歌曲歌词的 4 个度量。

#Create lists to store the different scores for each wordnegative = []
neutral = []
positive = []
compound = []#Initialize the modelsid = SentimentIntensityAnalyzer()#Iterate for each row of lyrics and append the scoresfor i in df.index:
    scores = sid.polarity_scores(df['lyric'].iloc[i])
    negative.append(scores['neg'])
    neutral.append(scores['neu'])
    positive.append(scores['pos'])
    compound.append(scores['compound'])#Create 4 columns to the main data frame  for each scoredf['negative'] = negative
df['neutral'] = neutral
df['positive'] = positive
df['compound'] = compounddf.head()

带有情感指标的歌词数据框(图片由作者提供)

现在,一个很好的方法是使用 Matplotlib 库在散点图上绘制歌曲及其各自的情感指标。在这种情况下,我绘制了每首歌词按十年分组的负得分和正得分。

for name, group in df.groupby('decade'):
    plt.scatter(group['positive'],group['negative'],label=name)
    plt.legend(fontsize=10)plt.xlim([-0.05,0.7])
plt.ylim([-0.05,0.7])
plt.title("Lyrics Sentiments by Decade")
plt.xlabel('Positive Valence')
plt.ylabel('Negative  Valence')
plt.show()

歌词正面得分和负面得分散点图(图片由作者提供)

分析这个情节,我可以推断出金属乐队的歌词倾向于更多的负价,因此导致产生更多的负面情绪。

我也想分析这种情绪,但是使用十年分数的*均值。所以我只是把有这个结果的主要数据框架按十年分组。

means_df = df.groupby(['decade']).mean()
means_df

按十年分组的歌词数据帧的含义(图片由作者提供)

for name, group in means_df.groupby('decade'):
    plt.scatter(group['positive'],group['negative'],label=name)
    plt.legend()plt.xlim([-0.05,0.7])
plt.ylim([-0.05,0.7])
plt.title("Lyrics Sentiments by Decade")
plt.xlabel('Positive Valence')
plt.ylabel('Negative  Valence')
plt.show()

十年*均值的正分数散点图和负分数散点图(图片由作者提供)

我意识到金属乐队 90 年代的歌词比其他几十年更倾向于正面。考虑到主流音乐中最著名的金属乐队是在 90 年代,这真的很有趣。

3.结果和结论的解释

  • 金属乐队的大多数著名歌曲都是在 20 世纪 80 年代发行的。
  • 金属乐队歌曲的第一句歌词使用了与死亡、活在地狱和杀戮主题相关的词,多年来,这句歌词被改为使用恐惧、痛苦和崛起等词来表达最深刻的人类情感。
  • 20 世纪 90 年代发行的歌曲的歌词比其他几十年更有积极的感觉。
  • 在 2010 年代,金属乐队用了 323 个独特的词创作了 6 首歌曲的歌词。
  • 每首歌词的字数在 50 到 70 之间。

总结这篇文章,我们学习了如何使用一种新的技术来分析应用于音乐的文字和文本情感。与过去的几十年相比,生活在这个现代的十年里的人们所拥有的优势是惊人的。我的意思是,在你舒适的家中使用简单的技术来创造惊人的研究和项目,它允许我们随着社会不断发展,利用技术来实现我们的目标,并享受做有趣事情的时间。

这篇文章将有第二部分,我将试着找到金属乐队在他们的歌曲歌词中暴露的主要话题、概念和想法。

我的其他文章:

[## 从电脑的音乐文件夹中自动播放 Spotify 上的播放列表。

将音乐文件导出到 Spotify 播放列表的有趣方式。

medium.com](https://medium.com/datadriveninvestor/automating-playlists-on-spotify-from-the-music-folders-of-your-computer-c79060eadab2) [## 用深度学习预测一首歌的音乐情绪。

一个很酷的方法来预测音乐曲目的情绪与神经网络模型使用 Keras 和 Tensorflow 库对…

towardsdatascience.com](/predicting-the-music-mood-of-a-song-with-deep-learning-c3ac2b45229e) [## 使用 Python 和 K-Means 对音乐进行聚类,在 Spotify 上创建您的个人播放列表。

在 Spotify 播放列表中按相似性对歌曲进行分组的简单方法。

towardsdatascience.com](/clustering-music-to-create-your-personal-playlists-on-spotify-using-python-and-k-means-a39c4158589a) [## 一个在网络上工作的总线和分析的交互格式。

像自动化和可视化一样,这也是 Python 和 Power Bi 的主要用途。

medium.com](https://medium.com/@cristobal.veas.ch/una-forma-interactiva-para-buscar-y-analizar-ofertas-de-trabajo-en-la-web-ef9327b0a8d3) [## 一个友好的公共汽车和分析人员在网上到达部门。

由于自动化的原因,很多时候需要使用 Python 和 Power Bi。

medium.com](https://medium.com/@cristobal.veas.ch/una-forma-genial-para-buscar-y-analizar-arriendos-de-departamentos-en-la-web-e20727390a8c) [## 你用电脑看报纸的新闻

一个有趣的形式分析了帕拉布拉斯和他的感觉,这是一个关于蟒蛇皮的新闻…

medium.com](https://medium.com/@cristobal.veas.ch/cómo-hacer-reflexionar-a-tu-computador-con-las-noticias-del-país-dc14d2fc0a67)

参考资料:

如何使用 Plotly Express 在 Mapbox 上制作散点图动画?

原文:https://towardsdatascience.com/how-to-animate-scatterplots-on-mapbox-using-plotly-express-3bb49fe6a5d?source=collection_archive---------23-----------------------

COVID19 在全球的传播。乌萨马·汗Github 上生成的图像

Plotly Express 是一个数据可视化库,允许我们快速有效地可视化*数据。在本教程中,我们将学习如何使用 Plotly express 内置的散点图框功能制作动画。

散点图框需要以下参数:

  1. df ,这是你*猫的数据框。
  2. lat 是包含纬度坐标的列的名称。
  3. lon 是包含经度坐标的列的名称。
  4. 颜色是为单个散射点着色的列的名称。
  5. 大*是决定个体散点大*的柱的名称。

虽然上述论点是基本的,我们可以通过它们创建一个散点图,但这不是全部。Plotly Express 散点图框功能提供了大量的功能,可以在文档中找到这里

有了这些理解,我们现在可以在 Mapbox 上创建一个简单的散点图,稍后可以转换成动画。但在此之前,我们必须看一看并了解我们的数据集。

对于这个例子,我们将使用新冠肺炎数据集,可以在这里找到。它被进一步处理。有关数据预处理的更多信息,请查看这里。

如下面的数据集所示,第一列显示了国家的名称,接下来的两列显示了国家的纬度和经度坐标。“洲”列显示了各个国家的洲。“日期”列显示国家/地区数据的上次更新日期。“已确认”栏代表已确认的 COVID 病例,“死亡”栏代表因 COVID 而死亡的人数,“恢复”栏代表治愈该病毒的人数。

特定国家显示的所有数据代表自记录首例病例以来的累计总数,而非每日增加数。

COVID 19 的数据集。乌萨马·汗Github 上生成的图像

了解数据集后,现在是创建散点图的时候了。我们将为已确认的 COVID 病例创建散点图,并将其绘制在地图框上。让我们看看我们如何能做它。

现在,由于我们要可视化已确认的病例,“已确认”列将被转发到 size 和 color 参数。请看看下面的代码:

# Necessary Importing
import pandas as pd
import plotly.express as px#Importing dataset as pandas dataframe
datasets = pd.read_csv('covid-dataset.csv')# Creating and visualizing a scatter plot on Mapbox
fig = px.scatter_mapbox(datasets, lat="Lat", lon="Long",
                  color="Confirmed", size="Confirmed",
                  color_continuous_scale=px.colors.cyclical.IceFire,
                  size_max=70, zoom=0.75, hover_name='Country', 
                  hover_data = ['Confirmed', 'Deaths', 'Recovery'], 
                  title = 'Accumulative COVID-19 Confirmed Cases
                  till 17 June, 2020')
fig.show()

从上面的代码中我们可以看到,这里很少有未知的参数。我们一个一个来破。

  1. “数据集”只是传递到函数中的*猫数据框的名称。
  2. “lat”和“long”是数据框中带有经纬度坐标的列的名称。
  3. 因为我们对可视化确诊病例感兴趣,所以我们将“确诊”列转发给了 size 和 color 参数。
  4. “color_continuous_scale”询问我们将用于可视化数据的配色方案。可用的选项很少,请参考上面的文档链接。
  5. “size_max”要求地图上绘制的气泡的最大尺寸。而“缩放”是显示地图的默认缩放值。您可以随意使用这两个值,并根据自己的喜好进行优化。
  6. “hover_name”和“hover_data”要求当光标悬停在地图上的特定气泡上时显示列。
  7. 顾名思义,“标题”指定地图的标题。

现在明白了这一点,让我们来看看上面代码片段的输出。

Covid19 全球确诊病例。由乌萨马·汗Github 上生成的图像

哇,看起来真棒。您也可以为死亡和恢复列生成类似的映射。你自己试试。

完成后,下一个任务是将数据框中的“日期”列制作成动画,并查看自 1 月份病毒爆发以来确诊病例是如何累积的。

之前使用的数据集被切片以可视化最大记录日期(2020 年 6 月 17 日)的数据。为了创建一个动画,我们需要移除切片器并再次理解我们的数据集。让我们来看看。

COVID19 的完整数据集。由乌萨马·汗Github 上生成的图像

该数据集包含 2020 年 1 月 22 日至 2020 年 6 月 17 日记录的冠状病毒确诊病例、死亡和康复。数据库中所有其余的列都与前面解释的相同。

现在,我们需要在散点图上显示日期,并可视化 COVID19 确诊病例如何在世界各地传播。为此,我们需要给 scatter_mapbox 函数一些额外的参数。

fig = px.scatter_mapbox(datas, lat="Lat", lon="Long",
            animation_frame = 'Date', animation_group = 'Country', 
            color="Confirmed", size="Confirmed",
            color_continuous_scale=px.colors.cyclical.IceFire, 
            size_max=70, zoom=0.75, hover_name='Country', 
            hover_data = ['Confirmed', 'Deaths', 'Recovery'], 
            title = 'Visualizing spread of COVID from 22/1/2020 to
            17/6/2020')fig.show()

从上面的代码可以看出,为了创建动画,scatter_mapbox 函数被赋予了两个额外的参数。这些参数是“动画 _ 帧”和“动画 _ 组”。“animation_frame”要求包含要制作动画的时间序列信息的列。完成这些后,我们最终生成了下面的动画:

Covid19 的全球传播。乌萨马·汗Github 上生成的图像

本教程到此为止,请看一下这个项目的 GitHub,这里

如何回答一个编码面试问题

原文:https://towardsdatascience.com/how-to-answer-a-coding-interview-question-f3e705bb9fcd?source=collection_archive---------10-----------------------

有效处理编码问题的步骤。

图片来自 unsplash.com @丹*尔·麦卡洛

这篇博客是我的“大型科技公司黑客技术面试 15 天备忘单”的一部分。在这篇博客中,我们关注一步一步解决编码面试问题的方法。

编码面试部分旨在揭示你如何思考、交流和解决问题。因此,对一个问题给出正确和完美的解决方案并不能保证一个积极的结果,人们会根据你如何得出答案来评判你。以下是我通常采取的步骤,这些步骤不仅给了自己正确回答问题的最好机会,也让面试官对我如何处理这个问题有了一个体面的感觉。

第 0 步:面试前

准备一个简短的自我介绍

几乎在每次编码面试中,你都会被要求做一个简短的自我介绍。这是留下第一印象的关键部分,也是唯一可以预测的问题。因此,请按照以下格式准备一份简明扼要的介绍(不超过一两分钟):

  • 关于你的名字和一般背景的一句话。
  • 关于你大学毕业后的职业经历的几句话。如果你是应届毕业生,专注于你的实习和学校项目。否则,选择一个或两个具有挑战性的项目或与你申请的职位相关的技能。
  • 以陈述结束,说明你为什么寻找新的工作机会,以及你为什么对你申请的职位感兴趣。
“Hi, I’m Dinh Tuan and I’m a backend engineer with over six years of experience specialising in designing and implementing high scale and high availability backend system. I started my career in SEA Group, one of the biggest tech company in South East Asia. During 5 years in SEA, I led the backend team implementing a gaming platform which serves 3 millions concurrent users and 500 thousands request per second at the peak time. I also helped to grow a team of 30 engineers in Vietnam after they acquired a Vietnamese startup in food delivery services. In early 2019, I joined Datarobot, a unicorn in Boston, United States. I work under code and architecture team to design and implement the feature to support multiple external compute clusters (including both Kubernetes and Hadoop).I’m interested in the software engineer position in Facebook because I would like to grow my technical skills further in a large scale social platform.”

准备一些在面试结束时要问的问题。

面试结束时,你通常有机会提问。跳过这一部分意味着错过了了解工作性质和组织文化的机会。此外,一个好的问题还可以展示你的沟通技巧,展示你对这个职位的兴趣,并给人留下好印象。我最喜欢的一些问题是:

1\. What technology is the company/ your team currently using?
2\. What is your favourite thing about working for the company?
3\. How much say do developers have regarding the products?
4\. What qualities make a software engineer excel at this company?
5\. How flexible are the working hours?
6\. How will role performance be measured? What metric will role performance be measured with?
7\. How has your role changed since joining the company?
8\. What are the most challenging aspects of the job?
9\. What is the current team composition like?
10\. What resources does the company have for new hires to study its product and processes?

第一步:收到问题后

  • 请仔细阅读问题。如果问题没有写下来,一定要重复你从面试官那里听到的内容。
  • 完成给出的例子或想出一些例子。这不仅有助于确保你的理解,还能让你找到模式和概括来回答问题。
  • 澄清您所做的任何假设,例如输入格式或范围。
  • 想出最简单最明显的解决方案。
  • 寻找改进,尝试提出更好的解决方案。
  • 大声说出你的想法,和你的面试官谈谈你的想法。这能让他们参与进来,让他们理解你的思*过程,并给他们一个机会在你浪费太多时间之前给你指出正确的方向或阻止你。
  • 如果你遇到困难,一定要寻求提示。
  • 如果你的解决方案不那么琐碎,请用一些例子来说明。如有必要,您还可以使用白板来完成您的解决方案。
  • 陈述并解释你的方法的时间和空间复杂性。
  • 不要直接开始写代码。只有在你的面试官明白你要做什么并给你开绿灯后,你才应该开始编程。
  • 不要保持沉默太久。如果你被卡住了,试着说出让你困惑的地方。如果你需要安静思考,就告诉面试官(但不要超过一分钟)。
  • 不要忽视来自面试官的信息。每一块都很重要。
  • 当你的面试官在说话时,不要打断他们。
  • 不要灰心丧气。深呼吸,通过遍历更多的样本,思考不同的算法和数据结构,不断尝试。
  • 不要试图虚张声势。如果面试暗示了你不熟悉的东西,就承认它,继续前进。

步骤 2:编码期间

  • 请解释一下你正在写什么或打什么。
  • 遵循好的编码风格(比如使用描述性的变量名)并且组织好你的代码(如果需要的话,使用函数和类)。
  • 请说出你对你所使用的算法、数据结构或内置函数的理解。
  • 是否请求允许使用内置函数或跳过一些输入检查。如果有足够的时间,它们可能允许您摆脱一些琐碎功能的实现,或者稍后再回来。
  • 如果要求你在白板上书写,请注意你的手写。你需要确保它的可读性和良好的组织性(尤其是单词和行之间的空间)。
  • 不要写伪代码。虽然您不需要太担心语法,但是您应该交付无 bug 的生产就绪代码。
  • 不要保持沉默太久。

步骤 3:编码后

  • 考虑如何测试你的代码,列出测试用例。
  • 和你的面试官一起测试你的代码。
  • 用测试用例扫描你的代码时,修复任何出现的错误。
  • 务必寻找可以重构的地方。
  • 评估你写的代码的时间复杂度和空间复杂度。
  • 如果有更好的解决方案,再给点时间,你有什么好的建议吗?
  • 不要和面试官争论。因为面试官对这个问题很熟悉,所以他们不太可能错。接受他们的反馈并仔细考虑。

第四步:结束面试

  • 如果面试给你机会,一定要问一些问题来了解工作和公司文化。
  • 感谢面试官抽出时间。
  • 不要问太多问题,尽量按时结束。
  • 不要询问你的面试表现。
  • 编码问题已经结束,不要再继续讨论了。

参考文献:

  1. 破解编码面试
  2. 技术面试手册

如何将您的工作表附加到云上

原文:https://towardsdatascience.com/how-to-append-your-sheets-on-the-cloud-3cd9e0a2cf39?source=collection_archive---------49-----------------------

在 Colab 中运行 python 笔记本可以显著减轻您的日常任务。以下是如何用 6 个简单的步骤完成其中一项任务。

Unsplash 上的 La-Rel Easter 拍摄的照片

谷歌为你提供了一些免费的 CPU,甚至一个*规模的 GPU,非常适合通过其托管的 Jupyter 笔记本应用程序 Google Colab 运行简单的任务。

以前被称为谷歌实验室,现在谷歌实验室不需要设置,如果你有一个谷歌帐户,访问它就像访问的网站一样容易。

一旦你进入,你只需要点击“新笔记本”按钮。然后,您将拥有自己的托管笔记本,可按如下方式使用:

截图来自 Google Colab

你的第一个笔记本会在你的 Google Drive 中自动创建一个名为“Colab Notebooks”的文件夹来自动存储你的所有工作。

在对该工具进行简要说明之后,让我们深入研究我们的代码,将位于您的驱动器中的工作表添加到新的 Google 工作表中。整个过程由 6 个简单的步骤组成。

第 1 步-验证 Google 帐户,以便能够在您的 Google 表单中进行更改

为了阅读和修改您的 Google Sheets 文档,您首先需要验证 Google Colab 以访问您的 Google Drive 文档。尽管这两个应用都属于谷歌,但它们之间的访问需要你方的独家认证。

如果您在笔记本的第一个单元格中运行下面的代码,您就可以对 Google Drive 文档进行任何更改。

参见我的 Github 页面中的完整代码

运行该单元将生成一个链接并询问授权码。

截图来自 Google Colab

截图来自谷歌

单击链接完成登录过程。

如左图所示,这种认证将允许您查看、编辑、创建和编辑 Google Drive 中的所有文件。所以一定要仔细检查你从笔记本上运行的任何代码,以避免不可逆转的错误。

允许在文档中进行更改。

一旦允许,系统将生成一个代码。复制代码并将其粘贴到 Colab 中,以完成身份验证过程。

截图来自谷歌

步骤 2 —从 Google Sheet URLs 中读取文件,并将数据放入 pandas 数据框架中

第二步是从 Colab 笔记本中读取你的 Google Drive 中的文件。

这一步包括打开 Google Sheets 来读取数据,选择数据所在的工作表,获取数据,最后将数据放入 pandas dataframe。

参见我的 Github 页面中的完整代码

这里需要注意的是,链接不必是公开的,因为所有的权限都被授予了,所以你可以从你的浏览器中复制你的 Google Sheets 文档的链接。

步骤 3-设置列,并在数据框中指定数据范围

将数据放入 dataframe 后,接下来的步骤是设置列和指定数据范围。

截图来自谷歌 Colab

如果您的列是数据的一部分,并且没有位于图像上当前为“0”和“1”的列部分,则需要使用以下代码设置列并指定数据范围。如果已经有了列名,可以跳过这一步。

完整代码见我的 Github 页面

截图来自 Google Colab

当执行完成时,可以在这里看到更新的 df1 数据帧。

步骤 4 —从不同的数据帧中选择相同的列名,以便以后追加

append 函数的一个关键点是所选工作表中的列数应该匹配。否则,append 命令将在下一步中生成错误。因此,您需要提前选择具有相同名称的列,以便将正确的值附加到彼此。

在下面的例子中,我选择了存在于两个工作表中的“销售”和“品牌”列。您可以对它们进行重命名,或者添加任意多的列,只要所有这些都可以在两个文件中找到。

参见我的 Github 页面中的完整代码

注意列名前后的空格。

#步骤 5 —追加数据帧

数据集终于可以追加了。因此,我们只需要运行我们的单行代码来完成 append 函数。

参见我的 Github 页面中的完整代码

在这个例子中,我把重点放在了 append 上,但是根据您的需要,您也可以使用“merge”、“join”或“concatenate”函数。你可以查看*猫文档来发现这些其他功能的细节。

截图来自谷歌 Colab

在将新数据写入 Google Sheets 之前,通过运行“df”检查追加是否成功完成很重要。查看最新版本的 dataframe。

第 6 步——打开您想要写入新数据的 Google Sheets 文件,然后使用 set 函数插入数据

最后但同样重要的是,您需要打开一个新的 Google Sheet 文档,选择相关的工作表,用“set_with_dataframe”函数将新的数据帧写入其中。

完整代码见我的 Github 页面

恭喜你。您现在已经添加了 Google 表单,甚至没有将它们下载到您的计算机上。这并不意味着你不能在你的本地计算机上做同样的事情,但是因为这是一个更普遍的做法,所以我没有在这篇文章中讨论它。

此外,这篇文章的目的不仅是向您展示附加表,而且让您意识到您在云中有一种免费的处理能力,称为 Google Colab,并向您展示如何与您的 Google Drive 中的文件进行交互,以便能够在许多其他用例中使用它。

下次见!

同样来自作者:

[## 3 第 2 层区块链扩展对 Gig 经济的潜在好处

让我们一起来看看区块链应该如何扩展,以及第 2 层扩展对 Gig 有什么影响…

medium.com](https://medium.com/@furkansaatcioglu/3-potential-benefits-of-layer-2-blockchain-scaling-on-the-gig-economy-9c24f77489c1)

如何将 PyTorch 中的 CNN 应用到您的图像中?

原文:https://towardsdatascience.com/how-to-apply-a-cnn-from-pytorch-to-your-images-18515416bba1?source=collection_archive---------9-----------------------

您将学习如何在几分钟内将下载的图像上传到 PyTorch。

Unsplash 上由Marnhe du ploy拍摄的照片

大家好!今天我想谈谈把你的图片上传到你的 PyTorch CNN。

今天我们将讨论以下内容:

  • 如何正确存储图像,让您可以轻松地将您的数据标记出来。
  • 如何使用 PyTorch 访问数据并在途中做一些预处理?
  • 最后,我们将使用一个非常简单的 CNN 对我们的图像进行分类。

首先,如何存储数据?

我将使用这个数据集,其中包含了猫和狗的图像。

存储图像最简单的方法是为每个类创建一个文件夹,用类的名称命名文件夹。

让我举个例子:

作者图片

只需正确命名文件夹,就可以让 PyTorch 知道向哪个类断言图像。

现在,让我们进入代码。

import matplotlib.pyplot as plt
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchdef get_data():
    data_dir = '/your_path/Data/'

    train_set = datasets.ImageFolder(data_dir + '/training_set')
    test_set = datasets.ImageFolder(data_dir + '/test_set')

    return train_set, test_set

上面的函数从目录中获取数据。您只需指定到您的训练集测试集文件夹的路径。PyTorch 随后会使用指定目录中的文件夹名称自动将标签分配给图像。

然而,您可能想在使用图像之前做一些预处理,所以让我们做吧,此外,让我们马上创建一个数据加载器。为此,让我们在上面的代码中添加一些新行。

def get_data():
    data_dir = '/your_path/Data/'

    **transform** = transforms.Compose([
        #transforms.RandomRotation(20),
        transforms.RandomResizedCrop(128),
        #transforms.RandomHorizontalFlip(),
        transforms.ToTensor()])

    train_set = datasets.ImageFolder(data_dir + '/training_set', **transform=transform**)
    test_set = datasets.ImageFolder(data_dir + '/test_set', **transform=transform**)

    train = **DataLoader**(train_set, batch_size=32, shuffle=True)
    test = **DataLoader**(test_set, batch_size=32, shuffle=True)

    return train, test

在转换过程中,你可能需要对图像进行裁剪、翻转、调整大*、旋转等操作。为此,您可以使用转换在一个地方指定您需要的所有东西。然后,您可以使用上传的图像创建数据加载器

这就是 CNN 发挥作用的地方。

现在,当您准备好数据后,您可能想快速浏览一下。为此,您可以使用这个简单的函数,它将显示前 5 幅图像。

def train_imshow():
    classes = ('cat', 'dog') # Defining the classes we have
    dataiter = iter(train)
    images, labels = dataiter.next()
    fig, axes = plt.subplots(figsize=(10, 4), ncols=5)
    for i in range(5):
        ax = axes[i]
        ax.imshow(images[i].permute(1, 2, 0)) 
        ax.title.set_text(' '.join('%5s' % classes[labels[i]]))
    plt.show()

作者图片

让我们来定义我们的卷积神经网络:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(8, 8)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16, 100)
        self.fc2 = nn.Linear(100, 50)
        self.fc3 = nn.Linear(50, 2)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

我使用了这里定义的网络并做了一点修改,现在它可以和我的图片一起工作了。

现在我们可以指定标准、优化器、学习率和训练网络。

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)if torch.cuda.is_available(): # Checking if we can use GPU
    model = net.cuda()
    criterion = criterion.cuda()

def train_net(n_epoch): # Training our network
    losses = []
    for epoch in range(n_epoch):  # loop over the dataset multiple times
        running_loss = 0.0
        for i, data in enumerate(train, 0):
            # get the inputs; data is a list of [inputs, labels]
            inputs, labels = data

            # zero the parameter gradients
            optimizer.zero_grad()

            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()

            # print statistics
            losses.append(loss)
            running_loss += loss.item()
            if i % 100 == 99:  # print every 2000 mini-batches
                print('[%d, %5d] loss: %.10f' %
                      (epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    plt.plot(losses, label='Training loss')
    plt.show()
    print('Finished Training')

您可以保存和加载您训练过的网络。

PATH = './cat_dog_net.pth'
torch.save(net.state_dict(), PATH)

# Loading the trained network
net.load_state_dict(torch.load(PATH))

让我们把测试图像输入网络。

correct = 0
total = 0
with torch.no_grad():
    for data in test:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the %d test images: %d %%' % (len(test),
    100 * correct / total))

测试集误差为 66% ,这还不错,尽管获得尽可能好的精度并不是本文的目标。

在这里你可以找到完整的代码。

干得好!现在你已经准备好使用你的图像来练习深度学习了!

感谢您的阅读!

如何将 BERT 应用于阿拉伯语和其他语言

原文:https://towardsdatascience.com/how-to-apply-bert-to-arabic-and-other-languages-5c3410ddd787?source=collection_archive---------4-----------------------

多语言(XLM-罗伯塔)与单语(阿拉伯伯特)的方法,以及机器翻译如何帮助。

迪米特里 B 在 Unsplash 上拍摄的照片

到目前为止,Nick 和我一直在使用英语编写几乎专门关于 NLP 应用程序的教程…虽然通用算法和思想可以扩展到所有语言,但是支持英语 NLP 的大量资源并不能扩展到所有语言。例如,BERT 和类似 BERT 的模型是一个非常强大的工具,但是模型发布几乎总是用英语,可能后面还有中文、俄文或西欧语言的变体。

出于这个原因,我们将关注一个有趣的类伯特模型类别,称为多语言模型,它有助于将大型类伯特模型的功能扩展到英语以外的语言。

克里斯·麦考密克和*克·瑞安

1.多语言模型

1.1.多语言模型方法

多语言模型采用一种相当奇怪的方法来处理多种语言…

多语言模型不是单独处理每种语言,而是根据来自混合语言的文本进行预训练。

在这篇文章和附带的笔记本中,我们将使用一个来自脸书的名为 XLM-R 的特定多语言模型(“跨语言语言模型—罗伯塔”的简称)。

最初的伯特在英语*基百科和 BooksCorpus(自助出版书籍的集合)上接受过预训练,而 XLM-R 在*基百科和来自 100 种不同语言的通用抓取数据上接受过预训练!不是 100 种不同的模型在 100 种不同的语言上接受训练,而是一个单一的伯特型模型,它是在所有这些文本上预先训练好的。

(图片由作者提供)

这里真的没有任何东西试图刻意区分语言。例如,在 XLM-R:

  • 有一个单一的、共享的词汇表(包含 25 万个令牌)来涵盖所有 100 种语言。
  • 输入文本中没有添加特殊的标记来指示它是什么语言。
  • 它不是用“*行数据”(多种语言的同一句话)训练的。
  • 我们没有修改培训目标来鼓励它学习如何翻译。

然而,XLM-R 并没有预测无意义或对其众多输入语言中的任何一种都只有最起码的理解,而是表现得令人惊讶地好,甚至与用单一语言训练的模型相比也是如此!

1.2.跨语言迁移

如果您的应用程序是用另一种语言编写的(从现在开始,我们将使用阿拉伯语作为例子),您可以像使用常规 BERT 一样使用 XLM-R。您可以在您的阿拉伯语培训文本上微调 XLM-R,然后使用它来用阿拉伯语进行预测。

然而,XLM-R 允许你利用另一种更令人惊讶的技术…

假设您正试图构建一个模型来自动识别阿拉伯语中令人讨厌的(或“有毒的”)用户评论。已经有一个很棒的数据集叫做“*基百科有毒评论”,大约有 225,000 条标签评论——只不过都是英文的!

你有什么选择?用阿拉伯语收集类似规模的数据集将会非常昂贵。以某种方式应用机器翻译可能很有趣,但有其局限性(我将在后面的部分中更多地讨论翻译)。

XLM-R 提供了另一种称为“跨语言迁移”的途径。你可以在英文的*基百科有毒评论数据集上微调 XLM-R,然后将其应用于阿拉伯语评论

(图片由作者提供)

XLM-R 能够将它在英语中学习到的特定任务知识应用到阿拉伯语中,尽管我们从未向它展示过任何阿拉伯语的例子!这是从一种语言到另一种语言的迁移学习的概念——因此,“跨语言迁移”。

在这篇文章附带的笔记本中,我们将看到纯粹在大约 400k 英语样本上训练 XLM-R 实际上比在(*得多的)阿拉伯数据集上微调“单语”阿拉伯模型产生更好的结果。

这个令人印象深刻的壮举被称为 零距离学习 跨语言迁移

1.3.为什么是多语言?

多语言模型和跨语言转移是很酷的技巧,但是如果脸书只是为这些不同的语言中的每一种训练和发布一个单独的模型不是更好吗?

是的,这可能会产生最准确的模型——如果网上每种语言的文本都像英语一样多就好了!

只对单一语言的文本进行预训练的模型称为 单语 ,而对多种语言的文本进行预训练的模型称为 多语言

下面的柱状图显示了对于一*部分选择的语言,XLM-R 的作者能够为预训练收集多少文本数据。

(图片作者,改编自 XLM-R 论文图 1)

请注意,比例是对数的,因此英语数据大约比阿拉伯语或土耳其语多 10 倍,比意第绪语多 1000 倍。

1.4.按资源划分的语言

不同的语言有不同数量的训练数据可用于创建大型的类似 BERT 的模型。这些被称为低资源语言。英语、汉语和俄语等高资源语言在网上有大量免费的文本,可以用作训练数据。因此,NLP 研究人员主要集中于开发大型语言模型和这些语言的基准。

我改编了 XLM-R 论文的图 1 中的柱状图。这是他们的完整条形图,显示了他们为 100 种语言中的 88 种语言收集的数据量。

这些语言用两个字母的 ISO 代码标注——你可以在这里的表格中查找。

下面是柱状图中的前十个代码(注意,在德语之后还有另外~10 种语言有类似的数据量)。

请注意,这个“数据量”的排名与每种语言在互联网上有多少用户的排名并不匹配。在*基百科上查看这个表格。在柱状图中,中文(代码zh)排在第 21 位,但迄今为止拥有最多的用户(仅次于英语)。

类似地,NLP 研究人员对不同语言付出的努力和关注并不遵循柱状图中的排名——否则汉语和法语会排在前 5 名。

最*有一个名为OSCAR的项目,它为不同语言的类似 BERT 的模型提供了大量的预训练文本——如果你正在寻找未标记的文本来使用你的语言进行预训练,那么绝对值得一试!

1.5.利用机器翻译

也有可能涉及“机器翻译”(自动翻译文本的机器学习模型),以尝试和帮助解决语言资源有限的问题。这里有两种常见的方法。

方法 1——翻译所有内容

您可以完全依赖英文模型,将应用程序中的任何阿拉伯文本翻译成英文。

(图片由作者提供)

这种方法与单语模型方法具有相同的问题。最好的翻译工具使用机器学习,对于可用的训练数据也有同样的限制。换句话说,针对中低资源语言的翻译工具还不足以成为我们问题的简单解决方案——目前,像 XLM-R 这样的多语言 BERT 模型可能是更好的选择。

方法#2 —增加训练数据

如果你的任务中已经存在大量带标签的英语文本,那么你可以将这些带标签的文本翻译成阿拉伯语,并用它来扩充你可用的阿拉伯语训练数据。

(图片由作者提供)

如果您的语言中有一个不错的单语模型,并且有一个大型英语数据集可用于您的任务,那么这是一个很好的技术。我们在一个附带的笔记本中将这种技术应用于阿拉伯语,它的表现优于 XLM-R(至少在我们的初始结果中——我们没有执行严格的基准测试)。

1.6.XLM R 词汇

正如你可能想象的那样,为了适应 100 种不同的语言,XLM-R 拥有与最初的 BERT 非常不同的词汇。

XLM R 的词汇量为 250,000 个单词,而伯特的词汇量为 30,000 个单词。

我在这里发布了一个笔记本,在这里我浏览了 XLM-R 的词汇,以了解它包含的内容,并收集各种统计数据。

以下是一些亮点:

  • 它包含 13,828 个字符的“字母表”。
  • 其中 62%是全词,38%是子词。
  • 为了统计英语单词,我尝试在 WordNet(一种综合英语词典)中查找所有完整的单词,找到了大约 11,400 个英语单词,这只是 XLM-R 词汇量的 5%。

2.比较方法

2.1.自然语言推理

评估多语言模型最常用的任务叫做自然语言推理(NLI) 。原因是有一个优秀的多语言基准数据集叫做 XNLI

我们将在下一节讨论 XNLI,但是如果您不熟悉的话,这里有一个对基本 NLI 任务的解释。

在 NLI,我们被给予两个句子:(1)一个“前提”和(2)一个“假设”,并被要求确定是否:

  • 1 逻辑上产生 2(这称为“蕴涵”)
  • 2 与 1 矛盾(“矛盾”)
  • 2 对 1 没有影响(“中性”)

以下是一些例子:

据我所知,NLI 主要是一个基准测试任务而不是一个实际应用——它需要模型开发一些复杂的技能,所以我们用它来评估和基准测试像 BERT 这样的模型。

2.2.MNLI 和 XNLI 概述

在 NLI 上对多语言模型的基准测试是通过组合两个名为“MNLI”和“XNLI”的数据集来完成的。

MNLI 将为我们提供大量的英语训练实例,以微调 XLM-罗伯塔对 NLI 的总任务。

XNLI 将为我们提供少量不同语言的 NLI 测试示例。我们将采用我们的 XLM-罗伯塔模型(我们将仅对英语 MNLI 示例进行微调),并将其应用于 XNLI 的阿拉伯语测试用例。

关于 MNLI

多体裁自然语言推理 (MultiNLI 或 MNLI)语料库于 2018 年发布,是超过 40 万个英语句子对的集合,标注有文本蕴涵信息。

在 MNLI 中,‘多’是指多体裁,而不是多语言。很困惑,我知道!它被称为“多体裁”,因为它旨在成为斯坦福 NLI 语料库(SNLI)的继任者,后者完全由一些取自图像说明的简单句子组成。MNLI 通过添加多种更难的文本“体裁”增加了任务的难度,如转录的对话、政府文件、旅游指南等。

该语料库包含 392,000 个训练示例,20,000 个“开发示例”(开发模型时使用的测试示例),以及 20,000 个“测试示例”(报告基准分数的最终测试集)。

以下是一些随机选择的培训示例

*Premise:
    If I had told you my ideas, the very first time you saw Mr. Alfred
    Inglethorp that astute gentleman would have ”in your so expressive idiom
    ”'smelt a rat'!
Hypothesis:
    In the event that I had revealed my ideas to you, Mr. Alfred would have been
    absolutely oblivious to your knowledge of my ideas.
Label:
    2 (contradiction)----------------Premise:
    Like federal agencies, the organizations we studied must protect the
    integrity, confidentiality, and availability of the information resources
    they rely on.
Hypothesis:
    Some organizations must protect the confidentiality of information they rely
    on.
Label:
    0 (entailment)----------------Premise:
    Well? There was no change of expression in the dark melancholic face.
Hypothesis:
    He just looked at me and said, Well, what is it?
Label:
    0 (entailment)----------------*

关于 XNLI

“XNLI”代表跨语言自然语言推理语料库。论文(此处)于 2018 年 9 月首次提交给 arXiv

该数据集由 MLNI 数据集中已经被人工翻译成 14 种不同语言(如果包括英语,则总共为 15 种语言)的示例的较*子集组成:

XNLI 不提供这些不同语言的训练数据,所以它旨在作为我们将在这里采用的跨语言方法的基准。

对于每种语言,有 5000 个测试集句子对和 2500 个开发集句子对。

NYU 大学的 Sam Bowman 负责 MNLI 和 XNLI 数据集。XNLI 是与脸书合作完成的。

这里有几个来自阿拉伯语测试集的随机例子。

*Premise:
    في المسرحية الاجتماعي كذلك، فإن فرص العمل والتنسيق بين الأدوار المختلفة ربما
    تساعد الأطفال على فهم أوجه التشابه والاختلاف بين الناس في الرغبات والمعتقدات
    والمشاعر.
Hypothesis:
    لا يستطيع الأطفال تعلم اى شئ .
Label:
    2 (contradiction)----------------Premise:
    لماذا ، كما كنت  أخبر سيادته هنا ، من فكر مثلك أن وجود الأنسة بيشوب على متن
    السفينة سيجعلنا أمنين ، ليس من أجل أمه ،ذاك النخاس القذر سكت عن ما هو مستحق
    له .
Hypothesis:
    لم أتحدّث إلى سيادته منذ زمن طويل.
Label:
    2 (contradiction)----------------Premise:
    لقد قذفت إعلان عن كوكاكولا هناك
Hypothesis:
    ضع إعلان مشروب غازي.
Label:
    1 (neutral)----------------*

2.3.单语教学法

我们为这篇文章创建了两个笔记本——一个用于应用单语模型,另一个用于应用多语言模型(XLM-R)。

对于单语方法,我使用了一个社区提交的模型,从。该模型的文档显示,它预先接受了大量阿拉伯文本的训练,并且在过去 30 天内有很高的下载量(这意味着它是一个受欢迎的选择)。

我用两种不同的方法微调了这个模型。

方法 1——使用一个*的带标签的数据集

我们可以使用 XNLI 的*型验证集(2500 个人工翻译的阿拉伯语示例)作为我们的训练集。这是一个非常*的训练集,特别是与英语 MNLI 中的大约 40 万个例子相比!我认为这种方法与您自己尝试收集带标签的数据集最为相似。

该方法在阿拉伯语 XNLI 测试集上的准确率为 61.0%。这是我们尝试的各种方法的最低分(在后面的部分有一个结果表)。

方法 2——使用机器翻译的示例

XNLI 的作者还为 14 种非英语语言中的每一种语言提供了大型英语 MNLI 数据集的机器翻译副本。

这将为我们提供充足的训练数据,但想必数据的质量会更低,因为样本是由不完善的机器学习模型而不是人类翻译的。

这种方法在阿拉伯语 XNLI 测试集上给了我们 73.3%的准确率。

2.4.多语言方法

对于多语言方法,我根据完整的英语 MNLI 训练集对 XLM-R 进行了微调。

使用 huggingface/transformers 库,应用 XLM-R 和应用伯特几乎是一样的,你只是使用不同的类名。

要使用单语方法,您可以用以下代码加载模型和标记器:

*from transformers import BertTokenizer
from transformers import BertForSequenceClassification# Load the tokenizer.
tokenizer = BertTokenizer.from_pretrained("asafaya/bert-base-arabic")# Load the model.
model = BertForSequenceClassification.from_pretrained("asafaya/bert-base-arabic", num_labels = 3)*

对于 XLM-R,这就变成了:

*from transformers import XLMRobertaTokenizer
from transformers import XLMRobertaForSequenceClassification# Load the tokenizer. 
xlmr_tokenizer = XLMRobertaTokenizer.from_pretrained("xlm-roberta-base" )# Load the model.
xlmr_model = XLMRobertaForSequenceClassification.from_pretrained("xlm-roberta-base", num_labels=3)*

学习率

代码的其余部分是相同的。然而,我们确实遇到了参数选择的关键差异…我们发现 XLM-R 比伯特需要更*的学习速率-我们使用 5e-6。当我们尝试 2e-5(BERT 建议的最*学习率)时,XLM-R 训练完全失败了(模型的性能从未比随机猜测有所提高)。注意 5e-6 是 2e-5 的四分之一。

跨语言结果

使用这种跨语言转换方法,我们在阿拉伯语 XNLI 测试集上获得了 71.6%的准确率。相比之下,对阿拉伯语例子进行微调的单语模型只得到 61.0%的分数!

XML-RoBERTa 的作者在他们的论文中报告了 73.8%的阿拉伯语分数,见表 1:

表格最下面一行的模型更大,它与 BERT-large 的规模相匹配。在我们的例子中,我们使用了较*的“基础”尺寸。

我们较低的精度可能与批量大*、学习速率和过拟合等参数选择有关。

2.5.结果摘要

同样,我使用这些笔记本的目的是提供工作示例代码;不执行严格的基准测试。为了真正比较这些方法,应该进行更多的超参数调整,并且应该对多次运行的结果进行*均。

但是这里是我们用最*的调整得到的结果!

对于表中的第 2–4 行,您可以通过对阿拉伯语 XNLI 验证示例进行微调来进一步改进这些结果。(我用 XLM-R 快速尝试了一下,确认分数上升到了 74.2%!)

2.6.使用哪种方法?

考虑到我更容易用arabic-bert-base获得好的结果,并且知道它需要更少的内存(由于更*的词汇量),我想在这种情况下我会选择单语模型。

然而,这仅仅是因为一个团队预先训练并发布了一个很好的阿拉伯语单语模型!

我原本想用印*语作为这个项目的示例语言,但是

  1. 印*语不在 15 种 XNLI 语言之列。
  2. 我发现的最好的印度*西亚型号,CAH ya/Bert-base-Indonesia-522m,是在相对适度的文本量(~0.5GB)上预先训练的,因此我对它的性能持怀疑态度。

对于印度*西亚人来说,我仍然想尝试这两种方法,但我怀疑 XLM-R 会走在前面。

笔记本示例

这篇文章中提到的两个笔记本(一个实现多语言实验,另一个实现单语实验)可以从我的网站这里购买。我还在 YouTube 这里提供了这些笔记本的演示。

如何对时间序列数据应用 K 均值聚类

原文:https://towardsdatascience.com/how-to-apply-k-means-clustering-to-time-series-data-28d04a8f7da3?source=collection_archive---------0-----------------------

使 k-means 算法适应时间序列的理论和代码

图片由 Piqsels 提供

聚类是一种无监督的学习任务,其中算法将相似的数据点分组,而没有任何“基础事实”标签。数据点之间的相似性用距离度量来衡量,通常是欧几里德距离

将不同的时间序列聚类到相似的组中是一项具有挑战性的聚类任务,因为每个数据点都是有序的序列。

时间序列聚类最常见的方法是将时间序列展*到一个表中,每个时间索引(或序列的聚合)有一列,并直接应用标准的聚类算法,如 k-means(K-means 是一种常见的聚类算法,通过将样本分成 K 组并最*化每个聚类中的*方和来构建数据聚类)。

如下所示,这并不总是很好。图表中的每个子图都绘制了一个由具有欧几里德距离的 k 均值聚类生成的聚类。红色的簇形心没有捕捉到系列的形状。

来源 : tslearn 文档

直观上,标准聚类算法中使用的距离度量,如欧几里德距离,通常不适用于时间序列。更好的方法是用一个比较时间序列的度量代替默认的距离度量,比如 动态时间扭曲

在本文中,我将解释如何使用动态时间弯曲将 k 均值聚类调整到时间序列。我将提供来自[tslearn](https://github.com/tslearn-team/tslearn)包的简单代码示例。

时间序列的动态时间弯曲距离度量

但首先,为什么常见的欧氏距离度量不适合时间序列?简而言之,它对时间偏移是不变的,忽略了数据的时间*度。如果两个时间序列高度相关,但其中一个移动了一个时间步长,欧几里德距离就会错误地将它们测量为相距较远。点击此处查看详细示例。

相反,最好使用动态时间弯曲(DTW)来比较序列。DTW 是一种测量在时间、速度或长度上不完全一致的两个时间序列之间的相似性的技术。

DTW 解释道

给定系列 X =(x₀、…、xₙ)和系列 Y =(y₀、…、yₘ),从 XY 的 DTW 距离被公式化为以下优化问题:

来源: tslearn 文档

总结一下 DTW 方程: DTW 计算为 X 中每个元素与其在 Y 中最*的点之间的*方距离之和的*方根。注意,DTW(X,Y) ≠ DTW(Y,X)。**

让我们进一步分析一下。

DTW 将序列 X 中的每个元素与序列 Y 中的每个元素进行比较(n x m 比较)。比较起来, d(xᵢ,yⱼ),不过是简单的减法 xᵢ — yⱼ

然后对于 X 中的每个 xᵢ ,DTW 选择 y 中最*的点进行距离计算。

上图:说明 DTW 如何将蓝色系列中的每个点与红色系列中最*的点进行匹配。下图:说明欧几里得距离度量如何匹配两个时间序列中的点。请注意,系列长度不同,与欧几里得匹配不同,DTW 能够将蓝色系列中的每个点与红色系列中的一个点进行比较。来源: wikicommons

这在 XY 之间创建了一条扭曲的“路径”,将 X 中的每个点与 Y 中最*的点对齐。该路径是时间序列的时间对齐,可最*化对齐序列之间的欧几里德距离。

两个时间序列(蓝色)之间的 DTW 路径(白线)的图像。热度图突出显示了距离值( xᵢ — yⱼ)。 来源 : tslearn 文档

使用复杂度为 O(MN)的动态规划来计算动态时间弯曲。点击此处此处了解具体算法详情。

用 python 中的 DTW 很容易比较两个时间序列:

***from** **tslearn.metrics** **import** dtw
dtw_score = dtw(x, y)*

DTW 的变体:软 DTW

软 DTW 是 DTW 的一个可微分变体,它用一个可微分的soft-min运算代替了不可微分的min运算:

来源 : tslearn 文档

根据该函数,软 DTW 依赖于一个超参数 γ 来控制结果度量的*滑。像 DTW 一样,可以使用动态规划在二次时间内计算软 DTW。

脚注:软 DTW 的主要优势源于它处处可微。这允许软 DTW 被用作神经网络损失函数,比较地面真实序列和预测序列。

***from** **tslearn.metrics** **import** soft_dtw
soft_dtw_score = soft_dtw(x, y, gamma=.1)*

具有动态时间弯曲的 k-均值聚类

通过以下修改,k-means 聚类算法可以应用于具有动态时间弯曲的时间序列。

  1. 动态时间弯曲(DTW)用于收集相似形状的时间序列。
  2. 群集质心,或重心,是相对于 DTW 计算的。A 重心是 DTW 空间中一组时间序列的*均序列。 DTW 重心*均(DBA) 算法最*化重心和聚类中序列之间的 DTW 距离的*方和。软 DTW 算法最*化重心和聚类中系列之间的软 DTW 距离的加权和。权重可以调整,但总和必须为 1。

结果,质心具有模拟集群成员形状的*均形状,而不管成员之间的时间偏移发生在哪里。

顶行:使用 DTW 的 K-均值聚类(DBA 算法)。底部一行:使用软 DTW 的 K-均值聚类。每一列显示了来自不同簇的系列和它们的质心,用红色绘制。源码+代码

使用[tslearn](https://tslearn.readthedocs.io/en/stable/user_guide/clustering.html) Python 包,用 k-means 和 DTW 简单聚类时间序列数据集:

***from** **tslearn.clustering** **import** TimeSeriesKMeansmodel = TimeSeriesKMeans(n_clusters=3, metric="dtw", max_iter=10)
model.fit(data)*

要使用软 DTW 代替 DTW,只需设置metric="softdtw"

注意[tslearn](https://tslearn.readthedocs.io/en/stable/gettingstarted.html#time-series-format)期望一个单一的时间序列被格式化为二*数组。一组时间序列应该被格式化为一个形状为(num_series, max_length, 1)的三*数组。如果集合中的系列长度不等,则较短的系列将增加 NaN 值。tslearn 具有易于使用的实用函数用于正确格式化数据,并且易于与其他时间序列包和数据格式集成。

最后一句话

我希望你喜欢读这篇文章。要了解时间序列机器学习,请查看我的其他文章:

* [## 如何对时间序列应用层次聚类

聚类是一种无监督的学习任务,其中算法将相似的数据点分组,而没有任何“基础事实”…

link.medium.com](https://link.medium.com/1nJUjkUg4bb) [## 时间序列分类算法简介

专门为时间序列分类设计的专用算法

towardsdatascience.com](/a-brief-introduction-to-time-series-classification-algorithms-7b4284d31b97) [## 高度比较的时间序列分析——一篇论文综述

用于比较、聚类、分类和注释的时间序列特征提取分析

medium.com](https://medium.com/towards-artificial-intelligence/highly-comparative-time-series-analysis-a-paper-review-5b51d14a291c)

参考

[## 阅读亚历山德拉·阿米登(以及媒体上成千上万的其他作家)的每一个故事

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

alexandra-amidon.medium.com](https://alexandra-amidon.medium.com/membership)*

如何从始至终接*一个机器学习项目

原文:https://towardsdatascience.com/how-to-approach-a-machine-learning-project-from-beginning-to-end-96c30a029873?source=collection_archive---------53-----------------------

受博士框架启发的循序渐进指南

Kolleen Gladden 在 Unsplash 上拍摄的照片

目录

  1. 介绍
  2. 那么为什么框架很重要呢?
  3. 机器学习生命周期

介绍

你有项目想法却不知道从何下手吗?或者也许你有一个数据集,想建立一个机器学习模型,但你不确定如何接*它?

在这篇文章中,我将谈论一个概念框架,你可以用它来接*任何机器学习项目。这个框架受到了理论框架的启发,与你可能在网上看到的机器学习生命周期的所有变体非常相似。

那么为什么框架很重要呢?

机器学习的框架很重要,原因有很多:

  • 它创建了一个标准化的过程来帮助指导数据分析和建模
  • 它允许其他人了解问题是如何处理的,并修正旧的项目
  • 它迫使一个人更深入地思考他们试图解决的问题。这包括要测量的变量是什么,限制是什么,以及可能出现的潜在问题。
  • 它鼓励人们在工作中更加彻底,增加发现和/或最终结果的合法性。

有了这几点,再来说框架!

机器学习生命周期

虽然机器学习生命周期有许多变化,但它们都有四个一般步骤:规划、数据、建模和生产。

1.规划

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

在你开始任何机器学习项目之前,有许多事情你需要计划。在这种情况下,术语“计划”包含许多任务。通过完成这一步,你将对你试图解决的问题有更好的理解,并能对是否继续这个项目做出更明智的决定。

规划包括以下任务:

  • 说出你试图解决的问题。这似乎是一个简单的步骤,但你会惊讶地发现,人们经常试图为一个并不存在的问题或一个实际上并不存在的问题找到解决方案。
  • 定义你为了解决问题而努力实现的商业目标。目标应该是可衡量的。“成为世界上最好的公司”不是一个可衡量的目标,但“减少欺诈交易”是一个可衡量的目标。
  • 确定目标变量(如果适用)和你可能想要关注的潜在特征变量。例如,如果目标是减少欺诈性交易的数量,您很可能需要欺诈性和非欺诈性交易的标记数据。您可能还需要像交易时间、帐户 ID 和用户 ID 这样的特性。
  • 考虑任何限制、突发事件和风险。这包括但不限于资源限制(缺少资金、员工或时间)、基础设施限制(例如缺少训练复杂神经网络的计算能力)和数据限制(非结构化数据、缺少数据点、无法解释的数据等)
  • 建立你的成功指标。你如何知道你已经成功实现了你的目标?如果你的机器学习模型有 90%的准确率是成功的吗?85%呢?准确性是最适合您的业务问题的衡量标准吗?查看我的文章 数据科学家用来评估他们模型的几个指标

如果你完成了这一步,并对项目有信心,那么你可以进入下一步。

2.数据

Markus SpiskeUnsplash 上拍摄的照片

这一步的重点是获取、探索和清理数据。更具体地说,它包括以下任务:

  • 收集并整合您在规划阶段指定的数据。如果您从多个来源获取数据,您需要将数据合并到一个表中。
  • 争论你的数据。这需要清理和转换您的数据,使其更适合 EDA 和建模。您需要检查的一些内容包括缺失值、重复数据和噪声。
  • 进行探索性数据分析(EDA) 。也称为数据探索,这一步基本上已经完成,因此您可以更好地了解您的数据集。如果你想了解更多关于 EDA 的知识, 你可以阅读我的关于进行探索性数据分析的指南

3.建模

照片由 Isaac SmithUnsplash 上拍摄

一旦数据准备就绪,就可以继续构建模型了。这有三个主要步骤:

  • 选择您的模型:您选择的模型最终取决于您试图解决的问题。例如,无论是回归问题还是分类问题,都需要不同的建模方法。如果你想了解各种机器学习模型,请查看我的文章'6 分钟解释所有机器学习模型 '
  • 训练你的模型:一旦你选择了你的模型并分割了你的数据集,你就可以用你的训练数据来训练你的模型。
  • 评估您的模型:当您觉得您的模型已经完成时,您可以根据您决定的预先确定的成功标准,使用测试数据来评估您的模型。

4.生产

亚历山大·杜默在 Unsplash 上拍摄的照片

最后一步是生产你的模型。这一步在课程和网上谈得不多,但对企业来说尤其重要。没有这一步,您可能无法从您构建的模型中获得全部价值。在这一步中,有两个主要问题需要考虑:

  • 模型部署:部署机器学习模型,称为模型部署,简单地说就是将机器学习模型集成,并将其集成到现有的生产环境中,在那里它可以接受输入并返回输出。
  • 模型监控:模型监控是机器学习生命周期中的一个操作阶段,在模型部署之后,它需要“监控”您的 ML 模型,例如错误、崩溃和延迟,但最重要的是,确保您的模型保持预定的预期性能水*。

感谢阅读!

特伦斯·申

创始人ShinTwin|我们来连线一下LinkedIn|项目组合这里是

如何在你的下一个深度学习项目中定义问题

原文:https://towardsdatascience.com/how-to-approach-problem-definition-in-your-next-deep-learning-project-9d76960932b4?source=collection_archive---------17-----------------------

人工智能|深度学习|机器学习

失败或成功的深度/机器学习项目之间的区别。

沃洛德梅尔·赫里先科Unsplash 上的照片

介绍

和大多数深度学习从业者一样,我总是渴望着手导入 TensorFlow,然后实现和训练模型。

这是我在大多数业余爱好项目中通常采用的方法。

当涉及到在一个涉及实际问题、真实用户、付费客户、时间和金钱投资的项目内进行基于深度学习的解决方案时;那么就必须考虑并实施深度学习项目的常规阶段。这些阶段是:

  1. 问题定义
  2. 数据采集
  3. 模型设计
  4. 模特培训
  5. 模型评估/测试
  6. 质量保证
  7. 部署
  8. 应用程序*护/监控

本文探讨深度学习项目的第一阶段,问题定义。从这篇文章中,您可以期望对如何进行问题分析有一个更好的理解。你还可以期待获得一种直觉,即在理解一个需要基于深度学习的解决方案的问题的关键方面时,应该问什么样的问题。

定义和背景

深度学习项目的主要组成部分通常是一个模型,它接受输入“X”并提供输出“Y”。输出结果与原始输入具有某种形式的相关性。

上面对深度学习模型的一般描述在大多数情况下不满足开始模型实现的最低要求。

在我们深入模型实现或项目生命周期中的任何其他阶段之前,明智的做法是后退几步,系统地进行问题和解决方案分析。这是通过完成与任何深度学习项目中采取的先前动作和过程相关联的任务来实现的。

深度学习项目的第一个重要步骤/过程是问题定义。

问题定义:描述待解决问题的初始状态的清晰陈述。该陈述指出了问题的性质,例如要解决的任务、现有系统的当前性能以及对当前系统的体验。

引导性问题

卡拉·埃尔南德斯在 Unsplash 上的照片

在深度学习项目中进行成功的问题定义过程涉及对 什么为什么如何 方面与问题相关联的基本分析和评估。

想出一个好的问题定义通常是一个迭代的过程。它可以揭示更多的问题和需要考虑的事项,这些问题和事项在没有经过问题定义过程的情况下会被忽略。

下面包含的问题充当了指路明灯,可以对问题和相关主题进行透彻的分析。

仅仅花点时间回答下面的问题,就可以节省几周甚至几个月的时间来解决那些因为之前看不到的原因而变得不可行的问题。

  1. 需要解决的问题的本质是什么?
  2. 为什么问题需要解决方案?
  3. 应该如何解决这个问题?
  4. 深度学习模型将解决问题的哪个方面?
  5. 如何与问题的解决方案互动?

问题定义/陈述的示例

写得好的问题定义没有模棱两可的陈述,并且由于对问题的清晰和简明的描述而不会被误解。

以下是与通过深度学习技术解决的任务相关联的问题定义的一些示例。

例子 1:“减少与 Instagram 图片帖子相关的创意和原创图片说明的时间。”

示例 2: “基于 SNP 500 中股票的先前记录的 5 年历史价格变动,为投资者自动生成股票推荐和价格预测

分解引导性问题

在这一节中,我们将深入探讨本文前面提出的指导性问题。

对场景的探索揭示了在处理需要基于深度学习的解决方案的问题时需要考虑的事项时,就可以更好地理解指导问题的适用性和重要性。

马库斯·温克勒在 Unsplash 上的照片

1。需要解决的问题的本质是什么?

了解问题的本质可以洞察尚未实现的解决方案的组件和属性。

对问题的良好理解会指导未来在项目后期做出决策,尤其是诸如确定深度学习解决方案是否可行之类的决策。

在示例 1 中,人们可以通过查看问题所在的环境来了解问题的本质( Instagram)。了解任何描述与问题相关的现有流程的技术提及(图像字幕)或短语也有助于深入了解问题的本质。

例 1 定义的问题主要与完成任务(图像字幕)所需时间的减少(减少时间)有关。

2。为什么问题需要解决方案?

回答这些指导性问题需要的不仅仅是问题陈述。

为了回答 为什么 一个问题需要一个解决方案将涉及与项目利益相关者的对话,更具体地说,是与目前正经历这个问题的个人的对话。

理解为什么一个问题需要一个解决方案将表明一个解决方案的紧迫性和重要性。

了解某个问题需要的解决方案有多紧急,可以指导解决方案的实施方法。深度学习方法因具有大量的训练和评估时间而臭名昭著。

与花费数天或数周时间训练和微调机器/深度学习模型相比,实现基于启发式的方法来解决需要数*时来实现和测试的问题可能更有用。

3.应该如何解决这个问题?

很可能,这个问题的答案已经变得越来越明显,首先是回答“为什么需要一个解决方案”。

有不止一种方法来实现基于深度学习的解决方案。

在高层次上,大多数机器学习实践者理解 ML 模型可以基于以下类别进行分类:监督的、非监督的和半监督的学习方法。

虽然本文关注的是基于深度学习的项目或解决方案,但是探索解决不符合特定领域假设或专业知识的问题的替代方法总是必要且有用的。

有时,用简单的 ML 模型实现一个解决方案,并在用户手中有了一个被提议的解决方案的版本之后迭代地改进模型,这是更实际的。

4。深度学习模型将解决问题的哪个方面?

在探索这个问题时,理解基于深度学习的解决方案的局限性总是有好处的。深度学习是好的,但它不能被用来解决每个问题。

深度学习解决方案非常适合涉及重复模式中可量化数据形式的问题;通常,这些是文本、图像、音频或数字数据的形式。

在许多情况下,深度学习模型只是更全面的解决方案的一*部分。在考虑解决方案时,通常会假设某个应用程序可以解决某个问题。

在更成熟的领域和业务中,通常会发现应用程序和硬件设备的生态系统以同步或异步方式进行通信和操作,以实现特定的任务。

从深度学习的角度来看,了解深度学习技术将解决问题的哪个方面能够确定分配给特定项目的技术和时间资源的范围。

5。问题的解决方案打算如何进行交互?

网站、移动应用、桌面应用,这些都是深度学习解决方案可以驻留的各种软件形式,每种形式都需要不同级别的交互。

在交付和部署 diving 解决方案之前,有必要了解如何与解决方案进行交互。

回答这个问题时,需要重点关注以下几个方面:

  • 用户使用该解决方案的频率如何?在项目生命周期的早期阶段回答这个问题创造了一个机会,可以开始确定与模型部署相关的模型推理成本的范围。
  • 当使用实施的解决方案的功能时,解决方案的用户是否要求立即得到结果?
  • 对实现的解决方案的设计和用户界面给予足够的关注。

问题定义的好处

照片由Olav Ahrens rtneUnsplash 上拍摄

在深度学习项目或任何机器学习项目中进行问题定义通常是一个复杂的过程,包含几项任务,如问题范围界定、用户访谈、技术规范等。

拥有一个定义明确的问题以及围绕该问题要解决的所有其他细节的好处是,深度学习项目中的后续过程有更高的成功机会。

下面的要点提供了对定义明确的问题的主要好处的进一步理解:

  • 经过充分探索的问题定义强化了正确的问题将被解决的假设。
  • 问题定义中涉及的过程暴露了实现已识别问题的解决方案所需的领域专业知识和工具。
  • 一个定义良好的问题定义可以作为一个参考点,以确保项目中的后续阶段和过程能够解决已识别的痛点。
  • 问题定义可以提供一种直觉,即对于一个特定的问题,产生期望的结果需要付出什么样的努力。
  • 在深度学习项目开始时进行严格的问题定义过程,可以真正理解问题的本质。

结论

安妮·斯普拉特在 Unsplash 上的照片

经历本文中确定的过程可能显得冗长。

尽管如此,在开始实施解决方案之前,确保您自己和团队成员都了解问题的各个方面还是有好处的。

即使是在一个单独的项目中工作,你也可以通过本文中提出的问题和过程进行规划。

我们都听说过无数的创业公司、公司和组织的回忆,它们希望利用深度学习来解决问题,但却发现在解决问题数月甚至数年后,解决方案无法实施。

在项目生命周期中进行一个简短的问题定义阶段可以节省金钱和时间,这是决定大多数项目成功的两个主要资源。

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟着我上
  3. 通过 LinkedIn 联系我

[## 2020 年机器学习项目的 10 个阶段(以及你适合的阶段)

了解机器学习相关项目涉及哪些阶段,并深入了解可交付成果和…

towardsdatascience.com](/10-stages-of-a-machine-learning-project-in-2020-and-where-you-fit-cb73ad4726cb)

如何解决复杂的问题

原文:https://towardsdatascience.com/how-to-approach-solving-complex-problems-797cb0f29418?source=collection_archive---------46-----------------------

这是我在处理数据分析需求时学到的一种方法,可以应用于任何复杂的问题。

万花筒Unsplash 上拍摄的照片

如何解决一个复杂的问题?有没有简单的方法?

在这篇文章中,我分享了一个我在处理数据分析需求时学到的简单方法,它可以用来解决几乎所有复杂的问题。

一点背景和问题定义

几年前,我最*开始为我们的一个新客户做一个项目。该客户最*在 Oracle EBS 套件中实施了 ERP,当时他们正在进行业务转型。

在这种情况下,他们需要在短时间内完成一些数据处理,以找出对各种业务的业务见解,以便管理层可以决定接下来的几个步骤。

我对所实现的业务和功能了解不多,但是作为一名软件开发人员,我在过去的六年中一直从事 Oracle 电子商务套件的工作,所以我对这类需求的处理非常自如。

举个例子,这是我一开始得到的关于客户试订单业务的一个要求。我们的客户会在试用的基础上免费给他们的客户一些设备,希望试用期过后客户会转化为实际销售。

对我的要求是做一些分析——前十大客户在过去一年中下了多少试订单,其中有多少在下订单后的三个月内转化为实际订单,没有转化的原因,当有更快的转化时,我能发现什么,等等。

这将允许管理层找到模式并提出想法来提高试用转换率,从而增加收入。这是一次性的活动。

解决方案和结果

我看问题的时候,看起来好简单。我想到的解决方案是编写一个 SQL 查询来从 Oracle DB 中提取数据并做进一步的分析。

编写 SQL 查询很容易。您只需要识别存储这些信息的表,识别主键和外键,用一个 where 子句将它们连接起来,该子句包含每条记录需要满足的所有过滤标准,优化以获得最佳性能,然后执行它。就这样,你得到了结果。

我写了 SQL 查询。在此之前,我已经编写了数百个这样的查询,所以即使是简单的查询,我也知道其中的细微差别,而且我会处理好所有这些。我确保优化器使用索引来获得更好的性能,等等。

但是当我在 TOAD 中执行查询时,查询没有产生任何记录。事实上,查询执行没有完成。这需要时间;演出很差,我只能等着。我等了几分钟,然后再等几分钟,再等几分钟。结果不会出来。

过了一会儿,我失去了耐心,取消了查询,并尝试对它进行了一些调整。我再次检查了查询以确保一切都是正确的,并重新执行了它。尽管如此,我还是没有得到结果。

由于我是这个项目的新手,我不知道数据库的大*,不太了解业务场景,不知道它需要处理多少记录。当你为一个新客户工作时会发生这种事,但我需要尽快得到结果。我刚刚从技术上审查了它,我确信我没有遗漏任何东西。执行计划看起来不错,但是,查询继续执行,不会完成。

这是一次性的数据提取要求,他们很快就需要它,而我已经晚了。我试了三四个*时,还是没完成。我挣扎过。

我和我的一个同事一起回顾了这个问题,他在这个项目上花的时间比我多一点,他也说这个问题似乎是正确的。应该是有效的。

我从各个角度回顾了一下,看起来还不错。可能,它必须获取的数据太多,这就是性能差的原因。我试着重写了几次查询,但是直到最后我还是没有得到数据。

我的团队领导要求在今天结束时提供最新情况。我告诉他我已经完成了查询,但也解释了我在获得结果时所面临的挑战。

他把椅子拉过来,就坐在我旁边。他拿起我的键盘,开始检查我写的查询。是的,查询是正确的。但是仔细回顾了五分多钟后,他说,我还记得。

你试图在一个查询中同时做太多的事情。分解一下。”

然后他说,“让我告诉你怎么做。”

改变解决方案和结果

他和我坐在一起,修改了我写的 SQL 查询。这个过程大概是这样的:

  • 首先,他通过根据去年的收入查询账单表来获取前 10 名客户,并创建了一个临时表。那是一张只有 10 张唱片的*桌子。将这些沉重的表(有超过一百万条数据记录)与订单表连接起来以进一步过滤是没有意义的。
  • 然后,他创建了 order 表的副本作为临时表,并在 required、ex-customer ID、order type、converted order 等列上创建了索引。不能直接在基表上创建索引,因此在临时表上创建索引对加快执行速度很有用。
  • 然后,他将客户临时表与订单临时表连接起来,以获取那些顶级客户下的所有订单。这又是一个简单的查询,很少过滤,因此获得结果要快得多。他用这些数据创建了另一个临时表。
  • 在这个临时表上,他应用了后续的过滤器,只获取在过去 12 个月中下的试订单,这些订单被转换为销售订单。有时一个过滤器比其他过滤器花费更多的时间,所以他做了几次迭代,看看哪个过滤器先应用,哪个过滤器后应用。
  • 大约有 10-12 个临时表,最后创建了 7-8 个索引,但是当执行最后一个查询时,结果在几秒钟内就出来了!。整个重写过程只花了大约半个*时。
  • 获得摘录后,他删除了所有的临时表和索引,回收了空间。

一开始我很惊讶,因为我不明白他想做什么,为什么要创建这么多临时表?我没有意识到他把它分解成如此*的部分,然后几乎不需要任何时间来执行。

我们在半*时内取得了惊人的成绩。我意识到分解它的重要性。

最好的学习发生在实践中

那天我学到了一些新东西。这是一个出色的结果,在短短的半*时内,我一整天都做不到。

我的团队领导教会了我一些简单而深刻的东西。这是获取数据的最佳方式吗?大概不会。但这有效吗?是的,完全正确。

当我反思这一天时,我学到了三个关键的教训。

  1. 对于我们需要什么以及如何解决问题,我们需要实事求是。我一开始没花多少时间就直接跳进了解决方案,以为很容易。
  2. 我们需要根据具体情况定制解决方案。对于上述一次性的数据提取需求,一种有效的方法是简化问题,并作为易于管理的部分的*块来执行。当你把所有的部分加起来时,不管每个部分有多简单,整个问题都会变得复杂。相反,任何复杂的问题,只要分解成更*的、更容易处理的部分,我们就能轻松解决。这是一门很大的学问。
  3. 原理很简单。但是申请很困难。即使我知道这个原则,但当问题摆在我面前时,我还是没有申请。我特意提醒自己以后要有解决问题的逻辑方法。

你如何应用这个原则?

这与 Kaizen 的原则相同,它专注于持续的微*改进,通过提出*问题、采取*行动、解决*问题来取得更大的成果。

明白问题出在哪里。问问题,即使是最基本的问题,什么,为什么,什么时候,如何,谁,还有倒装——比如,为什么不。想办法解决。但关键是不要不知所措。试着把问题分解成容易处理的部分。即使在分解之后,如果问题仍然复杂,就进一步分解。当它很*的时候,你可以很容易地解决它,而不是恐惧反应,大脑会产生兴奋的反应。独立解决每一个问题。

我们可以将同样的原则应用于大多数领域的问题:无论是商业、管理、我们的习惯、我们的健康和健身、我们的关系,还是我们的长期目标。

简化一个复杂的问题是困难的,但是一旦我们花时间去做,它会很有效。通常,一步一个脚印可以让我们走得更远。

我通常更喜欢用笔和纸来做这件事。我可以写下来,划掉,放盒子,圈圈,连接,改变,重写。它给了我很多选择,迫使我好好思考。看看什么对你有用。

底线

当我在另一个合并和收购场景中工作时,我使用了同样的方法好几年,在这个场景中,数据清理和数据迁移是客户的关键需求。不仅仅是数据分析问题,我还将这一原则应用于许多复杂的问题,这对我很有用。

有时候,我们只是需要一个提醒来使用简单的方法将我们的技能和效率提升到一个更高的水*——在设计、编程、解决问题、职业和生活中。我希望这篇文章能帮你做到。

所以,下一次当你努力解决一个问题时,想想——“我怎样才能把这个问题分解成更*的部分。“这可能就是你一直在寻找的方法。

如何解决分析/数据科学职位的技术问题

原文:https://towardsdatascience.com/how-to-approach-technical-questions-in-an-analytics-data-science-interview-1dc956eaebc0?source=collection_archive---------23-----------------------

我们将通过两个在分析/数据科学职位面试中被问到的真实例子来讲述如何处理技术问题。

我喜欢和我的读者交流,了解他们在技术面试时所关心的问题。他们经常充满焦虑,在准备的时候不知道从哪里开始。在本文中,我将通过两个真实的 SQL 示例来回答读者提出的最常见的问题,这两个示例说明了面试官在做出招聘决定时希望测试什么。

来源:stratascratch.com

读者最常见的问题:公司在技术面试中会问什么类型的技术问题,我该如何准备?

技术技能——容易培养的技能

至于准备,你只需要练习。但更具体地说,编写 SQL 语法和任何其他技术语言的能力绝对需要成为你的第二天性。这要么需要多年的经验,要么需要数百道练习题,才能让你的技能达到行业标准。你可以在我最喜欢的一些*台上查看我的另一篇文章。我会做你能做的所有中级和困难的问题。

实用技能——很难培养的技能

一旦技术部分成为第二天性,真正的工作就开始了。任何面试的第二个重点是测试某人如何思考和分解一个问题。他们在测试某人如何处理问题并提出解决方案。

你可以集中精力学习如何最好地沟通,并用白板演示一个全面的方法来回答业务问题,并涵盖面试官的所有边缘案例。

根据我在技术访谈中的经验,他们的重点是测试对代码正在做什么的理解,你如何考虑各种场景/边缘情况,以及输出的含义是否与业务问题相关。

面试

所以让我们来谈谈在面试中你可能会遇到什么类型的 SQL 问题。与您可能在工作中编写的又长又复杂的查询相比,SQL 问题本身相当简单。在工作中,为了回答问题和构建可伸缩的数据产品,您可能要跨几十个表编写数百行(如果不是数千行的话)代码。但是在面试中,要么给你 1 或 2 个表,要求你创建一个包含不超过 10 行代码的连接或自连接的 SQL 查询。如果幸运的话,您会得到 SQL 代码并被要求调试它(提示:很明显,代码总是有问题)。

就您的技术技能而言,只要您知道如何编写连接并使用像 COALESCE 这样稍微高级的函数,您就没问题。让面试变得困难的是

  • 想象一旦你写完代码,输出会是什么样子。代码几乎不在可执行的*台上。
  • 开发查询,使其回答面试问题
  • 传达所有边缘案例并在 SQL 查询中折叠边缘案例
  • 传达解决方案将提供的业务权衡(例如,这个查询真正回答了什么,盲点是什么?)

有了这四个让面试变得困难的要点,让我们来看几个例子来说明这些要点。

来源:theladders.com

以下是技术面试中被问到的两个真实的 SQL 问题:

1。真实面试写 SQL 查询的例子

给你一张表,其中包含用户好友请求、接受和日期。如何编写一个查询,让你的好友在一段时间内获得%的接受率?

首先,您可能永远不会得到填充了数据的实际表格。所以你应该问面试官表格包含哪些列,表格中包含什么类型的数据。

这个查询很容易创建(提示:使用自连接将朋友请求与接受分开)。任何懂 SQL 的人都可以编写查询来计算一段时间内朋友接受的百分比。一个可行的 SQL 查询可能如下所示:

SELECT
 (CASE WHEN b.action = ‘Friend_acceptance’ THEN 1 ELSE 0 END) / (CASE  WHEN a.action = ‘Friend_request’ THEN 1 ELSE 0 END) as percentage_acceptance
FROM table a
LEFT JOIN (SELECT * FROM table WHERE action = ‘Friend_acceptance’) b ON a.user_id = b.to_user_id
 WHERE action = ‘Friend_request’

您是否看到这个查询没有解决许多边缘情况,甚至没有真正回答这个问题?此查询评估一生中朋友接受的百分比。但是面试官想让我评估几天、几周、几个月或者几年的百分比吗?此外,你如何处理几天后朋友的接纳?你认为接受的时间是多少?从技术上来说,任何时候一个朋友接受你的请求都应该计入百分比。但是从商业角度来说,如果朋友两年后接受了请求,会有什么好处呢?你正试图打造一款将人们联系在一起的产品,你应该努力尽快实现这一目标/

此外,我在构建问题时会问面试官的另一个问题是——你是从朋友发出请求的那一天开始计算接受度,还是从请求被接受的那一天开始计算?为什么或为什么不?

所有这些问题对于完整地回答这个问题非常重要。你的面试官将测试你是否能发现并理解你的解决方案中的这些差距。这里没有正确或错误的答案,但是您需要确定有多种方法来编写查询,并讨论选择之间的权衡。

2。理解统计和业务含义的真实面试示例:

如果你做了一个 AB 实验,发现由于在试点地区推出了一项新功能,朋友接受度提高了 2 倍(p < 0.05), 你会将它部署到生产中,并向所有地区的所有用户推出吗?

大多数人会说是,但在面试中,最明显的答案可能不是正确的。在这种情况下,正确的答案是——视情况而定。为什么要靠,靠什么?答案是,这取决于特性的行为方式和特性的效果。一切都是一个系统,所以如果你在一个系统中做了一个改变,它会影响到系统的另一部分。在本例中,如果实验部署在*台的登录页面,您可能会问它占用了什么空间。对其他功能有影响吗?

另一个问题可能是算法本身。算法是不是减少了好友请求的数量?因为分母是一个*数字,这会导致朋友接受度的增加吗?为什么或为什么不?

显然,作为一个不了解特性和*台复杂性的人,不可能对你的推荐有信心。但你应该能够识别这些问题,并与面试官一起讨论,这样他们就能理解你是如何思考和处理模糊问题的。

来源:stratascratch.com

结论

在准备 SQL 面试时,我给你的主要建议是理解为什么以及如何编写代码来解决特定的问题。

  • 呈现的是什么数据,代码如何回答这个问题?
  • 我的代码中有哪些空白?
  • 我写代码的方式有什么利弊?
  • 我需要哪些额外信息来确保我考虑的是整体情况?

准备好交流你为什么要写特定的代码行,你添加了什么逻辑来解决特定的边缘情况和场景,以及输出会产生什么。你的解释和代码本身一样重要(如果不是更重要的话)。

此外,在你制定解决方案时,一定要和面试官交流,尽可能让他们了解你的思考过程。

SQL 面试不仅是为了测试你的技术能力,也是为了测试你的思*能力。把注意力集中在面试中要用到的技能上,确保尽可能多地做练习题。

如何寻求帮助

原文:https://towardsdatascience.com/how-to-ask-for-help-5c24b70c9314?source=collection_archive---------43-----------------------

在线寻求数据科学、编程或相关主题帮助的注意事项

计算机程序员、数据科学家和其他技术专业人员经常需要寻求帮助。寻求帮助是力量的表现!各种技能水*的专业人士有时需要帮助…

图片来源:publicdomainvectors.org——帮助言论泡沫。

当你在网上寻求帮助时,这里有一个非详尽的提示列表供你参考。

不要假设那些会帮助你的人是“男人”

不要一开始就用“嘿,伙计们~”这样的话来寻求帮助,这会疏远一大群能帮助你的人。

太多的帖子以“嗨,伙计们”开头这是性别歧视。别说了。

看看是否有人已经问过并回答了你的问题。

这很容易做到。如果你在网上寻求帮助。使用与您的问题相关的关键字搜索论坛。阅读那些帖子和他们的回复。如果你在私人场合,不能公开发表你的问题,使用你公司的论坛(如果有的话)。毕竟,Slack 充满了有用的制度知识,可以回答你的问题:毕竟,它是SearableLog ofAllCcontent&Kknowledge。

查看文档。

在寻求帮助之前,请阅读文档。

参考文档。

与前面的相关,如果文档没有为您提供答案,那么参考您找到和参考的文档部分通常是一个好主意。说为什么它不适合你。询问您的潜在帮助者,看他们能否为您提供其他可能更有帮助的文档。

好好想想你的问题标题。

避免使用显而易见的标题。像“关于……的问题”或“我对……有问题”这样的短语是隐含的。更好的选择是“[软件名称]有什么可能导致[描述意外行为或结果]。”

避免交叉发布。

其他人可能不同意这一点。交叉发布是将您的问题发布到多个论坛。有些人不介意。我倾向于避免它。一个例外是,当 A)有人说:“嘿,你可能在[插入另一个论坛名称]运气更好。”而 B:原帖还没有产生答案的时候。此外,如果你交叉发布,要透明,并提供一个链接到你的原始帖子,以帮助你的助手。

避免编辑。

如果你必须编辑你的原始帖子,请在评论中明确说明你为什么编辑,以及为什么。

图片来源:wallpaperflare.com——粉笔问号。

避免寻求私人帮助。

私人帮助不太理想的原因是,寻求和提供在线帮助的原因是它会使你的努力事半功倍。如果你私下通信,未来的其他人将不会从你的问题可能引发的讨论中受益。

假设你遵循了上面的建议,不要羞于提出“基本”问题。

如果你用上面的建议合理地努力寻找你的问题的答案,你的问题很可能是别人也会有的问题。尽管问吧,不管它看起来有多简单。

确保最终的解决方案是明确的。

有了解决方案之后,要确保解决方案在论坛上很明确。有时这已经由论坛上的其他人替你完成了。但是,并不总是这样。发布一个你的解决方案的总结也无妨。也有帮助,贴具体例子。

要善良,要善良,从别人的角度看问题。

这适用于发布问题的人和发布有用答案的人。如果有人问了一个违反这些建议或准则的问题,不要生气。不要消极攻击。如果你说了什么,尽可能地帮忙。询问更多信息是可以的。如果你在寻求帮助,不要因为那些帮助你的人的错误或过失而责怪他们。

还需要寻求帮助的建议?

找到其他得到回答并引起广泛讨论的问题。分析这些问题的内容、结构、外观、感觉和语气。复制在你之前成功的例子。

图片鸣谢版权 2020 亚当·罗斯·*尔森 —与提问相关的词云。

感谢阅读

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当罗斯*尔森

[## 加入我的介绍链接媒体-亚当罗斯纳尔逊

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

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

如何评估两个数据集之间的相似性?—对抗性验证

原文:https://towardsdatascience.com/how-to-assess-similarity-between-two-datasets-adversarial-validation-246710eba387?source=collection_archive---------39-----------------------

验证方法

使用来自墨尔本和悉*的 Airbnb 数据评估严重性并找出不同训练和测试集的原因。

咖啡极客Unsplash 上的照片

ML 模型依赖的一个主要假设是,训练集和验证集来自相同的群体并且同分布。尽管如果训练集和测试集具有完全不同的分布,但是这种假设从来都不是完全正确的,您的模型从训练数据中学到的任何东西都不适用于测试数据。

例如,让我们设想一个墨尔本和悉*的房地产数据,列如下;“郊区名称”、“卧室数量”和“价格”。如果你的训练集只有墨尔本的房子,在特性列表中保留“郊区名称”列是个好主意吗?

假设模型将无法学习悉*的“郊区名称”列中的信息。这显然是一个问题,这种类型的训练-测试不相似性问题的严重性可以使用对抗性验证来评估。

因为整个想法是理解训练和测试集是如何不同的,所以我们可以训练一个分类器来预测一个例子是属于训练集还是测试集。如果这两个数据集分布相同,则数据中不会有任何信号来区分它们,模型的预期精度将为 0.5-基本上是随机猜测。模型的分类能力量化了数据集之间的相似性。

此外,模型中特征的重要性使我们能够发现哪些变量实际上具有不同的分布,因为模型使用这些特征来区分示例。

Airbnb —墨尔本和悉*数据集示例

为了让这个概念变得明显,我们将使用 Airbnb 在墨尔本和悉*的公开数据创建一个极端而简化的例子。(数据来源)

我们有 2 个数据集,即melbsydney,列为“城市”(指郊区)、“卧室”和“价格”。melb是我们的训练数据,而sydney是测试数据。

我们将跳过预处理步骤,从定义应用该方法的实际函数开始,但是完整的代码在这里可用

函数的参数;

  • train:我们将使用melb作为我们的原始训练数据集,与其他数据集sydney相比,“城市”列中有完全不同的条目
  • 测试:Sydney是原始的测试数据集。
  • 列:包含在数据集中的要素列表,这些要素需要被考虑用于量化差异。
  • 分类列:这是特定于 LightGBM 的,因为我们需要在训练期间指定它们——如果您想要应用不同的分类模型,这可能不是必需的。

我们首先为我们的训练和测试示例创建一组新的标签。我们创建了一个由 0 和 1 组成的数组,其中 0 是训练示例(melb)标签,1 是测试示例(sydney)标签。这些 0 和 1 将试图被我们的分类器预测。

预测性能

预测性能可以通过准确性、AUC 或任何类型的二元分类性能指标来衡量,在本例中我们将使用 AUC。 这是表示数据集相似程度的指标,因此如果它们显著不同,我们的模型应该能够区分这两个数据集,并最终得到接* 1 的 AUC 值。

训练和验证集 AUC。

在本例中,我们最终获得了完美的分类性能,因为数据集之间的差异非常明显。下一点是调查哪些特征可能是造成这种差异的原因。

个体特征的重要性

通过比较特性的重要性,我们可以在单个特性级别上评估现有差异的责任。

看上面的图,整个信息增益仅通过使用“城市”来实现。换句话说,分类器能够通过在“城市”列上进行拆分来区分示例,因此这是对melbsydney数据集具有不同分布的特征。

信息增益是一种快速评估特征对最终模型的贡献的方法,但它不直接表示对分类性能的贡献。它表示特征在模型中的主导地位,但要了解某个特征对最终预测性能的贡献程度,我们应遵循以下步骤。

该过程从逐个移除高信息增益特征开始,然后重新应用该方法来查看这些特征对分类性能的影响。这可以提供更可靠的结果,并让您评估特征对最终 AUC 的贡献,因此我们将删除“城市”并重新训练模型以观察 AUC 的变化。— 这个逻辑和很多特征选择技术没什么区别。唯一不同的是解释。对性能的贡献越大,意味着变量对原始训练数据和测试数据之间的差异的责任越大。

如上所述,通过去除“城市”, AUC 降低到 0.80。我们还看到,AUC 仍然很高,而“价格”被视为造成数据集之间差异的另一个特征。

最后,需要注意的是,这不是一种特性选择技术。即使一个特性在训练和测试中可能有非常不同的分布,它仍然可以包含有价值的信息并帮助您的最终模型。在调试模型性能时,意识到这些差异和风险是有好处的。

如何使用 Sklearn One Hot 编码器分配标签

原文:https://towardsdatascience.com/how-to-assign-labels-with-sklearn-one-hot-encoder-e59a5f17df4f?source=collection_archive---------19-----------------------

图片Siarhei 拍摄

一个优雅的方式来改善 sklearn 一个热编码器,再也不用考虑新的列标签分配。

大多数机器学习算法不能处理现成的分类数据。在预测建模中使用分类变量之前,通常将标签编码器或一个热编码器应用于分类变量。

Python 中的 Sklearn 库是大多数机器学习从业者的必去之地。它提供了出色的通用功能,允许我们用一行代码执行复杂的操作。同时,它的一些功能过于笼统,可能难以使用。

一个热编码

一种热编码是将分类变量转换为 N 个二进制列的过程,其中 N 是原始列中唯一值的数量。例如,在我最*对新冠肺炎期间股价行为的研究中

[## 新冠肺炎在股票市场上横冲直撞。机器学习来解释。

使用机器学习来识别新冠肺炎期间受打击最大的股票中的共同因素。

towardsdatascience.com](/covid-19-rampage-on-the-stock-market-machine-learning-comes-to-explain-3332707954af)

我用一个热门编码来分解行业分类

转换成二进制列表示,如下所示:

履行

使用默认的 sklearn 包可以完成一个热转换:

sklearn.preprocessing.**OneHotEncoder**# df = some DataFrameencoder = OneHotEncoder()
encoder.fit_transform(df)

上述实现的代码输出如下所示:

它是正确的,但是它不提供标签,这使得很难知道新列背后的含义。没有这些知识,分析预测模型的输出将是不可能的。在文档中提供了一些关于标签分配的指导,但这仍然是一个挑战。因此,需要一种更好的解决方案。

自定义 One Hot 编码器

One Hot Encoder 输出添加标签同时保持“一行”实现的一种优雅方式是创建一个包装器类,该类在 transform() 操作期间“在盒子内部”分配标签。代码如下:

使用这个包装器,输出如下所示:

我现在将分解它的实现,并详细解释它是如何工作的。

初始化

from sklearn.preprocessing import OneHotEncoder as SklearnOneHotEncoderclass OneHotEncoder(SklearnOneHotEncoder):
    def __init__(self**,** **kwargs):
        super(OneHotEncoder**,** self).__init__(**kwargs)
        self.fit_flag = False

该类继承自 sk learn . preprocessing . onehotencoder,这意味着所有原始功能都被保留。我还添加了 self.fit_flag 属性来跟踪编码器是否合适。

合适的

def fit(self**,** X**,** **kwargs):
    out = super().fit(X)
    self.fit_flag = True
    return out

fit() 法本质上是原来的 fit() 法。我用的是超级()。fit(X)sk learn . preprocessing . onehotencoder中访问原始方法,然后在返回输出之前将 self.fit_flag 更新为 True

改变

def transform(self**,** X**,** **kwargs):
    sparse_matrix = super(OneHotEncoder**,** self).transform(X)
    new_columns = self.get_new_columns(X=X)
    d_out = pd.DataFrame(sparse_matrix.toarray()**,** columns=new_columns**,** index=X.index)
    return d_outdef get_new_columns(self**,** X):
    new_columns = []
    for i**,** column in enumerate(X.columns):
        j = **0** while j < len(self.categories_[i]):
            new_columns.append(f'{column}_<{self.categories_[i][j]}>')
            j += **1** return new_columns

Transform 方法更加复杂,因为这是我实现标签分配的地方。首先创建 sparse_matrix 变量,存储原始 transform() 方法的输出。然后我调用我编写的 get_new_column() 方法来访问 OneHotEncoder 的内部属性以检索类名。

get_new_columns ()方法本质上是一个两级嵌套迭代器。在第一级,我迭代原始数据帧中的列。在第二层,我迭代 self.categories_[i]中的值,其中 self.categories_ 属于原始的 OneHotEncoder,而“ i ”是被转换的表中的列的序号索引。在每一步,我都将列名附加到一个列表中,一旦迭代完成,这个列表就会返回。最终, new_columns 变量的长度为相当于 sparse_matrix 转换为数组后的水**度。

在最后一步中,我使用内置功能将 sparse_matrix 转换为一个数组,然后使用由 get_new_columns() 方法返回的列名创建一个 DataFrame。

拟合变换

def fit_transform(self**,** X**,** **kwargs):
    self.fit(X)
    return self.transform(X)

最后一个方法包括顺序执行我修改过的 fit()transform() 方法,返回一个带有指定列名的热数据帧。

结论

我希望这个教程对你有用。请随意抓取上面的代码片段,并在您自己的应用程序中使用它。

编码快乐!

posted @ 2024-10-15 13:48  绝不原创的飞龙  阅读(259)  评论(0)    收藏  举报