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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

国家独立性度量:在奥运舞台上,国家运作的体育系统有多有效。

原文:https://towardsdatascience.com/capstone-the-state-independency-metric-how-effective-is-state-run-sports-system-on-the-olympic-8ce06db17344?source=collection_archive---------75-----------------------

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

克里斯蒂安·卢在 Unsplash 上的照片

我有一些在学术项目中使用 Python 进行数据分析的经验,我想做一个简单的项目,将 Python 和 SQL 结合起来,提取一些数据见解。自从奥运会开始以来,我和每一位参与者都接触过“奥运会数据集——120 年的数据”。这种分析很有意思,可以观察国家支持的体育体制是否会提高运动员的奖牌产量。它不仅是一种宣传手段,还帮助孩子们找到了生活的目标,并帮助人们通过大众体育文化保持健康。苏联运动员在奥运会上的成功就是一个很好的例子。虽然这个国家在 1954 年加入了国际奥委会,并一直竞争到 1992 年,但结果是惊人的,值得进一步探索。

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

1992 年代表队由来自已经解体的苏联的运动员组成

我假设的客户:

我与 SportsStats 密切合作,为他们的合作伙伴发现有趣的事实。在审查所提供的数据后,有希望产生有新闻价值的故事或健康见解。

假设:

1)在美国之外,所有国家控制的体育系统国家都将比业余国家表现更好。

2)每一个苏联国家都会有一个时间滞后,在这个时间滞后里,新的制度会被实行。因此,从参赛开始的 3 个奥运周期后,所有的成绩都会提高。

做法:
1。导入和清理数据;将原始数据集分成第一个和第二个 word countries 表;
2。根据团队和年份进行筛选,以查看绩效;
3。通过 Pearson 和 P 值进行统计分析,找出相关性。

第一步:导入并清理数据。

我们从导入库和数据集的 csv 开始。一旦导入,最好熟悉我们已经得到的数据。

在浏览了各列之后,很明显并不是所有提供的数据都是分析所必需的。所以我们将放弃其中一些。

一旦我们过滤了所需的列,就该将数据集分为苏联和资本主义两类了。为了获得更准确的结果,我们将使用 1952 年至 1992 年的时间限制,因为在此期间,苏联系统在华沙条约组织国家实施并活跃。

第二步:根据团队和年份进行筛选,查看绩效。

一旦我们把我们的国家分成几个表,就该看看他们在全球范围内的表现了!我们将创建一个函数来计算每个国家的奖牌数,以及苏联赢得的奖牌总数。当我们在前 3 个奥运周期运行该函数时,我们得到以下结果:

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

从提供的数字来看,趋势并不一致。随着时间的推移,苏联、保加利亚、捷克斯洛伐克、波兰和罗马尼亚的奖牌数都在增加。然而,匈牙利(在 1954 年奥运会上获得第三名)和南斯拉夫表现出下降趋势。同样值得注意的是,直到 1964 年,德国作为一个统一的国家参加,所以从 1968 年奥运会的奖牌情况来看将是一个好主意。

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

随着东德的引入,大多数球队都表现出类似的趋势。随着时间的推移,苏联、东德、保加利亚、古巴、波兰和罗马尼亚的奖牌数都在增加。而匈牙利、南斯拉夫(略有增加)和捷克斯洛伐克则呈下降趋势。这使得我们的第二个假设有点混乱——随着时间的推移,大多数国家开始显示出更好的结果,但也有一些国家,显示出相反的动态。

我们将使用相同的构建函数来确定资本主义集团中的哪些国家对整体奖牌表现贡献最大。

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

提供的两个游戏摘要让我们可以比较苏联对资本主义国家的表现。一旦计算出这一指标,就会发现在 1968 年之前,表现最好的资本主义国家生产率更高。然而,在美国之外,这些国家比他们的苏联对手表现得更好,直到东德和它的贡献越来越大,从 1972 年开始扭转了局势。

(*注:我们不包括 1980 年和 1984 年的奥运会,因为分别在 1980 年和 1984 年遭到资本主义国家和苏联的抵制。)

在对所有游戏运行该功能后,我们设法分离出表现最好的国家。现在,我们可以创建一个他们最有成效的学科的表格,这样我们就可以确定,在给定的运动中,哪个系统是最好的,以及哪个领域被证明是每个区块最有成效的。

我们可以在上面的柱状图中清楚地看到哪些运动对美国在奥运会上的成功贡献最大。为列表中的每个团队运行这些图表,我们将为两个模块创建性能表。

所有被讨论的国家都有几项运动的优异表现要感谢。通过游戏年份过滤国家,我们得到以下结果。

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

这些图表表明,苏联国家更喜欢团队运动,他们一直是一股强大的力量。

测量的周期。个别学科更倾向于哪个体育学校对个别国家来说更强(例如苏联的滑雪)。同样显而易见的是,在苏联对该国的体育制度进行改革后,成绩有所提高,并且从零开始建立了联合会(古巴的拳击运动,直到革命后才普及)。

另一方面,资本主义国家更擅长个别项目——田径、游泳、自行车。后来的调查显示,在这个国家最受欢迎或最普及的运动最终占据了奖牌的希望——就像美国的田径、英国的自行车或英国和澳大利亚的曲棍球。

第三步。通过 Pearson 和 P 值进行统计分析,找出相关性。


皮尔逊相关(双变量相关)是一种统计,用于测量两个变量 X 和 y 之间的线性相关。它的值介于+1 和 1 之间,其中 1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。

P-value 是如果相关系数实际上为零(零假设),您找到当前结果的概率。如果这个概率低于常规的 5% (P < 0.05),则相关系数称为统计显著性。


我们要找出每张桌子上运动表现之间的相关性。由于对奖牌榜贡献最大的是田径和游泳,我们将首先比较它们,然后看看其他学科的表现如何。

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

看起来两个表的相关性很强。这并不奇怪,因为我们看到的是历届奥运会中最成功的球队。让我们来看看田径运动和自行车运动之间的关系。

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

这显示了更强的相关性,但我们的资本主义表给出了一个很弱的皮尔逊值和一个很高的 P 值。因此,正确的结果将是这两者之间的非线性相关。水上运动的情况与整个水上运动家族非常相似:在一个家族中表现出色的人通常在另一个家族中表现出色。

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

然而,资本主义表显示更多的是线性关系,而苏联看起来像是非线性关系。

但是团队运动呢?既然苏联队应该表现得“好得多”?结果并不简单:

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

资本主义表中的关系几乎没有显示出任何相关性,而苏联的表现更加线性,尽管不是完全线性。

结论。

1.采用苏联的体育体制提高了每个国家每一届比赛的成绩,即使从结果来看,最大的受益者是苏联

2.具有独立准备体系的资本主义国家在其最强的学科中表现出更一致的结果。

3.东欧体操学校给了苏联国家巨大的优势。从 20 世纪 50 年代初开始,为了“提高苏联人民的身体健康水平”,体操运动开始普及。后来,这项法令变成了在最高级别上赢得更多奖牌的一种方式,这导致了苏联在奥运会舞台上的统治地位。除了日本,没有哪个资本主义国家在奥运会上表现更好。

4.特别值得一提的是击剑。作为一项竞技运动,它起源于意大利,意大利一直是这项运动中最强大的力量。匈牙利击剑学校也被认为是欧洲第二好的学校。在欧洲赛区之后,高标准的匈牙利击剑在整个苏联地区被教授,结果苏联运动员有了很大的提高。

5.加入苏联阵营的每个国家的强校都为其他国家的训练方法做出了贡献。苏维埃制度吸取了一个国家的经验并采用了这种做法。很好的例子——击剑、体操和水球

假设:结论

1.除了美国之外,所有国家控制的体育系统国家都会比业余的表现更好。
部分正确——从 1972 年奥运会开始。

2.每个苏联国家都会有一个时间差,在这个时间差里,新的制度会被实施。因此,从参赛开始的 3 个奥运周期后,所有的成绩都会提高。 部分正确——部分国家呈下降趋势。1968 年东德加入后,所有国家都呈现稳定增长。

讨论。

尽管体育是苏联政权的一种政治宣传手段,但它是一种大众现象,吸取了它所庇护的国家的最佳实践,并全面实施。中国在筹备 2008 年奥运会时也采取了同样的方法,这促使他们成为奥运会的主要力量之一。在国际合作方面有很大的空间,当谈到最佳的训练方法,以使奥运会更具竞争力,胜利者的范围更广,更包容其他国家。

感谢您的阅读,您可以在我的 GitHub 上找到代码,任何反馈、意见、建议都将不胜感激!

使用 Inception-v3 进行汽车分类

原文:https://towardsdatascience.com/car-classification-using-inception-v3-71b63e9825b7?source=collection_archive---------20-----------------------

关于使用 Monk 训练 3 个模型来分类汽车的品牌、型号和年份,并通过 Flask API 部署它们的文章

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

奥拉夫·特维特在 Unsplash 拍摄的照片

介绍

这篇文章是关于使用 Monk 训练 3 个深度卷积神经网络,这是一个计算机视觉的开源库,然后通过一个 API 部署它们。这些模型以汽车的图像作为输入,然后预测汽车的品牌、型号和年份。这些模型已经在 Cars 数据集上进行了训练。

对于迁移学习,使用了带有预训练权重的 Inception-v3 架构。一些初始层被冻结,并且在剩余层上进行训练。

训练之后,模型通过 Flask API 被部署。它通过 POST 请求接受图像,并将预测返回给用户。

对于**培训笔记本,**勾选

对于**烧瓶 API,**检查这个

目录

  1. 安装 Monk
  2. 数据集
  3. 训练模型
  4. 培训结果
  5. 通过 API 部署模型
  6. 运行 API
  7. 结论

1.安装 Monk

Monk 是一个开源的计算机视觉库。你不需要深入了解 Python 或任何深度学习框架就能使用它。它通过为流行的深度学习框架提供包装函数来简化计算机视觉,并使人们能够使用最少的代码来使用它们的功能。查看它的 GitHub 库以获取更多信息。

本文使用 Monk 库的 PyTorch 后端,但是如果您愿意,您可以安装任何其他版本的 Monk。点击查看的详细安装说明。

  • CPU(非 GPU) : pip install -U monk-pytorch-cpu
  • 谷歌实验室 : pip install -U monk-colab
  • 卡格尔 : pip install -U monk-kaggle
  • 对于支持 CUDA 的版本,请遵循这里提供的说明

要手动安装库**,请遵循此处提供的说明**

2.数据集

用于该任务的训练数据集是 Cars 数据集 。它包含 196 类汽车的 16,185 张图片。级别通常在品牌、型号、年份级别,例如特斯拉 Model S 2012 或宝马 M3 coupe 2012。数据集附带一个 devkit,其中包含每张图像的标签,以及汽车周围边界框的坐标。但是我们只用标签。这里给出的代码打算在 python 笔记本中运行。

下载数据集:

*# Create a directory for the dataset*
! mkdir data*# Download train dataset and extract it* ! wget "http://imagenet.stanford.edu/internal/car196/cars_train.tgz"
! tar -xvf 'cars_train.tgz' -C 'data'*# Download test dataset and extract it* ! wget "http://imagenet.stanford.edu/internal/car196/cars_test.tgz"
! tar -xvf 'cars_test.tgz' -C 'data'*# Download the devkit and extract it*
! wget "https://ai.stanford.edu/~jkrause/cars/cars_devkit.tgz"
! tar -xvf 'cars_devkit.tgz' -C 'data'

准备标签:

准备标签所需的 devkit 中的文件:

  • cars_meta.mat :包含类名的单元格数组,每个类一个。
  • cars_train_annos.mat :包含变量‘annotations’,其中每个元素都有边界框的坐标,字段‘class’是图像的整数类 id,字段‘fname’是图像文件夹中图像的文件名。

要为培训准备标签:

  • 首先,我们处理文件 cars_meta.mat 来分离每个类 id 的品牌、型号和年份。

  • 然后,我们处理文件 cars_train_annos.mat ,为数据集中的每个图像分配标签,包括品牌、型号和年份。

  • 此处下载cars _ test _ annos _ with labels . mat后,可以按照类似的程序给测试图像分配标签。

  • 或者,准备好的 csv 文件可以从这里下载。

目录结构:

./Project_directory/
|
|-------data (for dataset)
|         |
|         |------cars_test
|         |         |----------00001.jpg
|         |         |----------........(and so on)
|         |------cars_train
|         |         |----------00001.jpg
|         |         |----------........(and so on)
|         |------devkit
|         |         |----------cars_meta.mat
|         |         |----------cars_train_annos.mat
|         |         |----------........(and other files)
|                               _
|------vehicles_make.csv         |
|------vehicles_model.csv        |  (csv files with labels)
|------vehicles_year.csv        _|
|
|------.......(and other files/folders)

3.训练模型

当使用和尚时,实验模型变得非常容易。通过更改几个参数,我们可以很快看到它如何影响模型的整体性能。这也加快了原型制作的速度。

我们将使用 Monk 的 PyTorch 后端。但是,Keras 和 MXNet-gluon 后端也是可用的。

在这里,我将解释训练 Make 分类器的程序。其他两个分类器可以用类似的方式训练。你可以在这里找到整个训练笔记本

导入并打开一个项目:

分配数据集:

设置模型参数:

我们将用预训练的权重加载 Inception-v3 模型,以便使用迁移学习来训练分类器。当训练数据集不够大时,这通常会使模型表现得更好。

我也尝试过训练 ResNet-50 模型,但是它的性能远不如 Inception-v3。

设置训练参数:

现在,我们将为 5 个时期训练模型。如果学习率和其他超参数足够好,训练可以从最后一个时期继续。我们将使用 softmax 交叉熵作为损失函数,因为它通常对分类任务非常有用。对于乐观者来说,我已经试验了随机梯度下降,但是 RMSProp 似乎表现得更好。

培训:

这将把在每个时期之后获得的模型连同一些与训练相关的附加信息一起保存到工作空间目录中。

运行ptf.Summary()可获得培训的详细总结。

4.培训结果

我们将对整个测试数据运行模型以获得测试准确性,然后对一些单独的图像运行它们。

根据测试数据评估模型:

下面的代码返回了总体测试精度以及基于类的单个精度,这可以用来获得关于其性能的一些有用的见解。

运行部分图像的训练模型:

获得的结果:

在 8,041 幅图像的全部测试数据上评估模型。验证集与原始训练数据集有 20%的差异。模型获得的精度:

  1. 制作分类器:最佳验证准确率:94.72%。测试准确率:84.27%
  2. 模型分类器:最佳验证准确率:96.50%。测试准确率:83.99%
  3. 年分类器:最佳验证准确率:94.17%。测试准确率:83.19%

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

从测试数据获得的图像预测

5.通过 API 部署模型

当使用 Monk 训练模型时,它会自动创建一个工作空间目录。它包含所有的训练日志和在训练期间获得的所有中间模型。为了开发 API,我们只需要最终的模型具有与创建它们时相同的目录结构。如果你已经训练了你的模型,你可以使用它们。否则,你可以从这里下载最终模型的工作空间。

如果只是想测试 API,就勾选这个。自述文件中有设置环境的详细说明。

在项目目录中创建一个名为“uploads”的子目录,用户上传的文件将在返回预测之前保存在其中。设置虚拟环境并安装所需的库。虚拟环境不是必需的,但建议使用。从这里下载 requirements.txt 文件并运行pip install -r requirements.txt

在工作区所在的项目目录下创建一个名为 app.py 的文件。我们将在这个文件中编写 API 的代码。

导入和实用功能:

响应 HTTP 请求的函数:

我已经为 API 提供了一个用户界面,但这不是必需的。如果你也想使用它,将这个这个目录下载到项目目录中,然后定义下面给出的 index()函数,使 API 在通过浏览器访问时加载网页。

upload()函数在“/predict”处响应 POST 请求,将其保存到名为“uploads”的子目录中,如果文件是有效的图像,则返回带有预测的字符串。

驱动功能:

它加载模型并启动服务器。

6.运行 API

使用终端中的命令python3 app.py运行应用程序。

一旦服务器启动,您就可以通过使用 cURL 发送 POST 请求来测试 API。为此,如果您还没有 cURL,那么您首先需要安装它。然后,通过您的终端,在用图像的有效路径替换了<image_path>之后,运行下面的命令。</image_path>

curl -X POST -F file=@'<image_path>' ‘http://0.0.0.0:5000/predict'

这将把预测返回到您的终端本身。

或者,您可以在您的浏览器中进入http://0 . 0 . 0:5000查看用户界面。然后使用“选择”按钮上传任何图像,并单击“预测”。然后它会返回这样一个预测:

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

API 的用户界面

7.结论

本文涵盖了整个过程,包括数据准备、训练图像分类模型,以及最终通过 Flask API 部署它们。我们还使用了数据标准化、随机水平翻转、迁移学习、自定义优化器、学习率和损失函数。根据测试数据评估模型,它们表现得非常好,准确率接近 85%。然而,我对年份分类器具有如此好的准确性感到有点困惑,因为确实没有任何明显的特征可以帮助预测汽车的制造年份。我不确定仅仅用图像来预测年份是否是个好主意。

你也应该尝试调整一些超参数,或者使用不同的模型架构,看看它会怎么样。也可以用 Monk 同时测试模型或超参数的多个组合,点击查看

参考资料:

  1. 培训笔记本的 GitHub 存储库:https://GitHub . com/piyu shm 1/Car-make-model-and-year-classifier
  2. API 的 GitHub 存储库:https://github.com/PiyushM1/Car-classification-API
  3. 数据集:https://ai.stanford.edu/~jkrause/cars/car_dataset.html
  4. 僧库:https://github.com/Tessellate-Imaging/monk_v1

感谢阅读!如果你觉得这篇文章有帮助,请告诉我。我们通过 LinkedIn 来连线。

卡拉·威尔逊:通过技术教育提升职业流动性

原文:https://towardsdatascience.com/cara-wilson-enabling-upward-career-mobility-through-tech-education-26eed4190fcb?source=collection_archive---------54-----------------------

科技女性系列

菲律宾妇女基金会联合创始人访谈

尽管数据科学的发展和越来越多的报告描述了人工智能日益增长的重要性,但显然“并非所有的工作都有光明的未来”。在菲律宾等新兴国家,技术性别差距仍然很大,创造包容性的技术环境对该领域的整体发展至关重要。特别是在菲律宾,只有约 50%的工作年龄女性加入了劳动力大军——其中近一半从事“不稳定工作”一个组织正在带头创建一个技术领域的菲律宾人社区,他们被授权打破这个玻璃天花板

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

图片由菲律宾 FTW 基金会提供

for the Women Foundation(FTW Foundation)是一家菲律宾非营利机构,为女性提供免费的数据科学和人工智能培训。他们的使命是“通过密集的技术技能培训来改变女性的生活,以实现向上的职业流动”⁴ FTW 基金会的第一批数据科学团队在为期 14 周的项目结束后,月薪平均增长了 286%。此外,他们 92%的学者仅在 6 周内就获得了数据科学工作。ftw 基金会成立于 2018 年,迄今已培训和安置了近 100 名学者。通过他们的影响,FTW 基金会开创了一项运动——无论女性的社会经济和学术背景如何,每个参与该计划的 FTW 学者都有一个坚定不移的目标,即通过技术解决一些社会最大的问题来帮助菲律宾。⁶

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

图片由菲律宾 FTW 基金会提供

作为一名在马尼拉长大的菲律宾裔美国人,卡拉·威尔逊在美国完成了大学学业,之后在意大利米兰生活和工作了 22 年。她在哈佛学院学习历史,然后在纽约和马尼拉从事广告工作。此后不久,卡拉在意大利米兰的 SDA Bocconi 完成了 MBA 课程,然后在那里工作并组建了家庭。"我想你可以说我在三大洲安家了!"卡拉说,当我问她背景时。

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

图片由卡拉·威尔逊提供

Amber: 你一直都知道你想从事科技行业吗?
Cara: 完全不是。作为一名人文学者和营销主管,我一直认为技术对我来说就像一门外语。然而,由于我热爱语言,我想这最终是一个令人愉快的发现。技术可以是一个很好的均衡器,这就是 FTW 所利用的。

一个组织正在带头创建一个技术领域的菲律宾人社区,他们被赋予打破玻璃天花板的权力

**答:**是什么激励你从事数据科学职业,并开始为妇女基金会工作?你在市场营销方面的经验,以及你的历史学位,对你的决定起了什么作用?
C: 首先,我想澄清一下,我不是一名数据科学家,但我必须熟悉数据科学/分析的基础知识,以便完成 FTW 的使命,让值得帮助的女性进入这一充满希望的职业。当我在米兰的时候,我遇到了许多聪明的菲律宾妇女,她们被困在家务劳动中,尽管她们受过教育,有潜力做更多的事情。这一切都是因为在菲律宾缺少有前途的工作机会,他们不得不去国外工作,以便寄钱回家养家。在菲律宾,这意味着一代孩子在没有母亲和姐妹的情况下成长。我想成为解决方案的一部分,试着在某一天改变这一切。这是一次非常有益的经历。

我认为历史学位是让你投身于任何职业的完美方式——它不仅教会你写作,还让你拥有全面的视角,以及获取大量信息并以简洁的方式提取关键知识的能力。作为一名营销人员,我敏锐地意识到沟通的重要性,这些都是我工作中重要的技能。我认为我的思考和分析过程因为有这样的背景而得到了加强。

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

图片由菲律宾环球时报提供

A: 你创办 FTW 基金会时面临的最大挑战是什么,你是如何克服的?
C:【嗯,我想我不得不实际一点,说筹资过去是——现在也是——艰难,但不知何故,既然我对自己的工作充满热情,宇宙似乎站在我们这一边,事情就迎刃而解了。我还认为,找到相信我们倡导的敬业导师也是一个挑战。数据科学家大多是年轻的专业人士,他们忙于建立自己的事业,很难要求他们抽出一些时间投入教学。然而,一旦我们找到了合适的人选,他们很快就会对我们的女学者的干劲和参与度印象深刻,这是灵感的巨大来源。他们可以真正看到这项工作如何让他们继续从事有趣的数据项目,同时真正改变生活。

FTW 基金会正在带头发起一场运动,为女性和科技行业的转行者增加可及性和经济机会。

答: FTW 基金会的愿景是创建一个技术领域的菲律宾人社区,让他们能够突破职业障碍。FTW 基金会是如何实现这一使命的,从第一批学生到现在的学生,你们的方法有什么变化?C: 通过我们短短的 1.5 年和近 100 名女性毕业生,我们对课程进行了改进,以反映菲律宾就业市场的现实。可持续就业是我们的成功标准,因此这很重要。我们还在为每位学员定制学习体验,并收集数据以不断改进我们的选择和培训方式。

一个有趣的发现是,我们已经意识到支持性社区学习经历在 FTW 项目中是多么重要。女性转行者往往是冒名顶替综合症的受害者,你需要一个强大的支持系统来鼓励你去争取,即使你有所怀疑。这种精神是 FTW 团队和我们校友的强大力量。我们的毕业生都自愿回来指导下一批学者。他们相信自己得到了这个独一无二的机会,他们想要付出——这个社区的力量随着每一个新的群体而增长。这已经成为一项真正的资产。

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

图片由菲律宾环球时报提供

A: 你对其他希望在数据科学领域发展事业的女性有什么建议?
C: 我会建议他们沉浸在所有关于数据和数据科学的课程、小组和网络研讨会中。这是培养技能和从事个人数据项目的大好时机。这种“暂停”也是一个思考更大图景的独特机会——互联网、政府和特殊利益集团如何使用或滥用数据来操纵他们的信息。数据所扮演的角色在这场(冠状病毒公共卫生)危机中得到了凸显,他们应该思考自己为什么要成为数据科学家,以及自己希望在数据伦理领域扮演什么角色。这可能会给他们的职业道路带来更多的目标。

****答:你认为菲律宾下一代女性技术专家面临的最大挑战是什么,已经入行的女性能帮上什么忙?
C: 在菲律宾,最大的挑战是为所有菲律宾人提供高质量的教育机会,从而实现就业。社会经济差距很大,我担心随着 covid 危机的发展,这些经济不平等会更加明显。对于许多经济困难的女性来说,找到这些机会并拥有利用它们的资源是很困难的。

已经在科技领域取得成功的女性可以做很多事情来提供帮助——主持一场科技研讨会或网络研讨会,自愿参加一场鼓舞人心的演讲,指导一位开始科技职业生涯的女性,参与公司的多元化目标,为年轻女性营造一个可以茁壮成长的支持空间。我很惊讶有多少成功女性在确定了回报的优先顺序后,真的找到了分享她们经历的意义。他们只需要做出这样做的决定。

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

图片由菲律宾 FTW 基金会提供

****答:我们的读者如何参与 FTWFoundation?
C: FTW 正在招聘和寻找我们课程中许多主题的讲师、客座讲师和合作者/志愿者。我们还在设计一个新的导师计划,让有经验的数据专业人员能够单独了解我们的学员,并真正塑造他们开始数据职业生涯的第一步。这是一次鼓舞人心的经历,对导师和学员都有好处,而且可以远程完成。我很乐意听到任何感兴趣的人的意见,所以请联系我在cara@ftwfoundation.org这样我们就可以探索合作——这些只是一些可能的参与方式,当然还有很多其他方式。

FTW 基金会正在带头发起一场运动,为女性和科技行业的转行者增加可及性和经济机会。不仅仅是提高妇女的技术素养和技能,FTW 基金会还教导他们的菲律宾学者要相信自己,为更美好的未来而奋斗。

要了解菲律宾妇女基金会的更多信息,请随时通过以下平台与他们联系:网站上的
::::
::::【https://www.facebook.com/ftwfoundation/】::
:;LinkedIn:::

特别感谢 Cara Wilson 允许我为这个系列采访她,也非常感谢 TDS 编辑团队对这个项目的支持。

你认识一位鼓舞人心的科技界女性,你希望她出现在这个系列中吗?你是否正在从事任何你希望我写的很酷的数据科学和技术项目?欢迎给我发电子邮件,向 angelamarieteng@gmail.com 寻求意见和建议。感谢阅读!

[1]引自 FTW 网站https://www.ftwfoundation.org/

[2]统计自以下文章https://www . wheninmanila . com/read-ftw-foundation-provides-free-tech-courses-for-young-women/

[3]视觉来自 FTW 网站https://www.ftwfoundation.org/

[4]来自 FTW 网站的任务https://www.ftwfoundation.org/

[5]从 FTW 官方网站获得的统计数据

[6]关于这方面的更多信息,请见 https://www.ftwfoundation.org/about

参考

彭扎兰,凯利。阅读:FTW 基金会为年轻女性提供免费的技术课程。

FTW 基金会https://www . edukasyon . ph/organizations/ftw-foundation/about。

埃拉·里维拉。这些女性在数据科学领域处于领先地位,你也可以https://young star . ph/这些女人在数据科学领域处于领先地位。

马纳洛,希拉。Sherlyn Malit 主持的第一次 FTW 基金会开工演习https://medium . com/the-looking-glass/1st-ftw-foundation-commencement-exercises-by-sherlyn-malit-bf7ab 845250 b。

为妇女基金会https://www.ftwfoundation.org/.

媒体混合建模中的遗留和形状效应:论文综述

原文:https://towardsdatascience.com/carryover-and-shape-effects-in-media-mix-modeling-paper-review-fd699b509e2d?source=collection_archive---------5-----------------------

在下面的文章中,我将回顾并实现“带遗留和形状效应的媒体混合建模的贝叶斯方法”的主要部分。

全文可以在这里找到:链接

目录

— — —

首先,媒体组合模型(MMM)旨在揭示付费媒体对利益衡量标准(通常是销售额)的因果影响。从历史上看,这个问题在很大程度上是通过线性回归建模的,因果影响是使用 Rubin 的潜在结果框架得出的。

用简单的(数据科学)术语来说,这意味着

  1. 使用媒体支出和控制变量训练预测销售额的回归模型。
  2. 通过比较媒体支出达到观察金额时和媒体支出为零时的销售额,得出因果影响。

从观察数据中估计偶然影响有许多问题,例如,对于初学者来说,“相关性不等于因果关系”。媒体混合模型有许多独特的问题需要注意。在这里可以找到对这些问题的精彩回顾:媒体混合建模的挑战和机遇

本文重点讨论两个具体问题:

  • 结转效应,即滞后效应
  • 形状效应,即收益递减

同时还提供贝叶斯模型、ROAS 计算和优化方法。

遗留效应

结转效应,通常被称为滞后效应,发生在媒体支出影响几天的销售时。例如,如果我们今天在展示广告上花了 100 美元,我们可能几天都看不到这笔花费的效果。adstock 函数试图将这种现象参数化,本文采用两种方法对 adstock 建模:

几何

  • 这是过去 L 天的加权平均值,其中 L 可能因媒体渠道而异。
  • 该效应对消费日的影响最大,并在此后衰减。

延迟的股票

  • 媒体花费的影响在媒体花费之后 T(θ)天达到峰值。

履行

**def** **geoDecay**(alpha, L):
    '''
    weighted average with geometric decay

    weight_T = alpha ^ T-1 

    returns: weights of length L to calculate weighted averages with. 
    '''
    **return** alpha******(np**.**ones(L)**.**cumsum()**-**1)

**def** **delayed_adstock**(alpha, theta, L):
        '''
    weighted average with dealyed adstock function

    weight_T = 

    returns: weights of length L to calculate weighted averages with. 
    '''
    **return** alpha******((np**.**ones(L)**.**cumsum()**-**1)**-**theta)******2

**def** **carryover**(x, alpha, L, theta **=** None, func**=**'geo'):
    '''
    1\. x is a vector of media spend going back L timeslots, so it should be len(x) == L

    2\. Weights is a vector of length L showing how much previous time periods spend has on current period. 

    3\. L is max length of Lag.

    returns transformed vector of spend

    # update with numpy average 
    # np.average(x[:2], weights=[1,.9])
    '''
    transformed_x **=** []
    **if** func**==**'geo':
        weights **=** geoDecay(alpha, L)

    **elif** func**==**'delayed':
        weights **=** delayed_adstock(alpha, theta, L)

    **for** t **in** range(x**.**shape[0]):
        upper_window **=** t**+**1
        lower_window **=** max(0,upper_window**-**L)
        current_window_x **=** x[:upper_window]
        t_in_window **=** len(current_window_x)
        **if** t **<** L:
            new_x **=** (current_window_x*****np**.**flip(weights[:t_in_window], axis**=**0))**.**sum()
            transformed_x**.**append(new_x**/**weights[:t_in_window]**.**sum())
        **elif** t **>=** L:
            current_window_x **=** x[upper_window**-**L:upper_window]
            ext_weights **=** np**.**flip(weights, axis**=**0)             new_x **=** (current_window_x*****ext_weights)**.**sum()
            transformed_x**.**append(new_x**/**ext_weights**.**sum())

    **return** np**.**array(transformed_x)

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

上面,我们可以看到给定参数的几何和延迟的 adstock 函数的形状。正如预期的那样,几何函数以强烈的冲击开始,然后稳步下降,而延迟的 adstock 函数在花费后 3 天(θ= 3)达到峰值,然后迅速下降。

形状效应和收益递减

接下来,本文讨论了收益递减现象,在本文中称为形状效应。当媒体渠道开始失去其有效性时,即花费 0 美元和 50 美元之间的差额远大于 200 美元和 250 美元时,就会出现这种情况。

Hill 函数用于对此建模,这源于生物化学。

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

哪里;

  • S =斜率;大于 0
  • K =半饱和点;大于 0
  • β=通道系数;大于 0
  • x =媒体支出
**def** **beta_hill**(x, S, K, beta):
    **return** beta **-** (K******S*****beta)**/**(x******S**+**K******S)

上面的等式是原始等式的修改版。在最初的希尔函数中,当 X 接近无穷大时,该函数接近 1,因此我们乘以一个β系数来说明营销渠道的各种优势。如果我们排除贝塔变量,每个渠道将有同样的效果。

论文确实指出了函数的可辨识性差。例如,当 K(半饱和度)点在观察到的媒体花费之外时。

  • 我们可以在下图的蓝线中看到这一点。请注意,我们没有观察到半饱和点,即由于收益递减,蓝线没有开始变平,因此我们的模型不可能找到正确的值。因此,随着媒体支出持续增加,我们的模型可能会错误地预测高回报。

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

上图显示了希尔函数可以呈现的各种形状。

组合:结转和形状/滞后和收益递减

接下来,我们需要一种方法来结合遗留效应和形状效应。该文件提出了两种可能的方法。

  1. 首先应用 adstock 函数,然后应用 shape 函数。
  2. 首先应用 shape 函数,然后应用 adstock 函数。

如果在任何给定的时间段内都有少量的花费,本文推荐路线 1。这是有意义的,因为形状效应不太可能被小额消费激活。或者,对于大的持续花费,首先应用形状(收益递减)效果,然后应用 adstock 函数是有意义的。

模型

现在我们可以指定我们(报纸)媒体组合模型的功能形式:

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

其中 Xt 已经通过 Adstock 函数进行了转换,Z 代表控制变量。

模拟

接下来我们进入模拟阶段。当从观察研究中估计因果效应时,模拟总是很重要的。通过模拟,我们可以生成一个合成数据集,使用我们的模型来估计因果关系,并将我们的估计与地面事实进行比较。这使得我们可以用一种用观测数据不可能的方式来测试我们的模型。

模拟数据集将包含:

  • 两年的销售数据
  • 三个媒体渠道
  • 一个控制变量(价格)
  • 媒体支出是通过将白噪声加入以一年为周期的正弦季节性而产生的
  • 价格是通过 AR(1)系列生成的
*# media channels* N **=** 102 *# number of data points* t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_1 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) ) 

t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_2 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) )  

t **=** np**.**linspace(0, 4*****np**.**pi, N)
data **=** 3**+**np**.**sin(t**+**0.001) **+** 0.5 **+** np**.**random**.**randn(N)
media_3 **=** ((data**-**min(data))**/**(max(data)**-**min(data)) )  

*# price* **from** statsmodels.tsa **import** arima_process **as** arima

arparams **=** np**.**array([.7, .6])
maparams **=** np**.**array([.1, .02])
ar **=** np**.**r_[1, arparams] *# add zero-lag and negate* ma **=** np**.**r_[1, maparams] price_variable = arima.arma_generate_sample(ar,ma,102)alpha_media_1 **=** .6
theta_media_1 **=** 5
k_media_1     **=** .2
s_media_1     **=** 1
beta_media_1  **=** .8

alpha_media_2 **=** .8
theta_media_2 **=** 3
k_media_2     **=** .2
s_media_2     **=** 2
beta_media_2  **=** .6

alpha_media_3 **=** .8
theta_media_3 **=** 4
k_media_3     **=** .2
s_media_3     **=** 2
beta_media_3  **=** .3

L**=**13
ru**=**4
lamb **=** **-**.5
ep **=** .05******2

m1 **=** [beta_hill(x, s_media_1, k_media_1, beta_media_1) **for** x **in** carryover(media_1, alpha_media_1, L, theta **=** theta_media_1, func**=**'delayed')]m2 **=** [beta_hill(x, s_media_2, k_media_2, beta_media_2) **for** x **in** carryover(media_2, alpha_media_2, L, theta **=** theta_media_2, func**=**'delayed')]m3 **=** [beta_hill(x, s_media_3, k_media_3, beta_media_3) **for** x **in** carryover(media_3, alpha_media_3, L, theta **=** theta_media_3, func**=**'delayed')]

y **=** np**.**repeat(ru, N) **+** m1 **+** m2 **+** m3 **+** (lamb*****price_variable) **+** np**.**random**.**normal(0, ep, N)

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

拟合模型。

既然已经模拟了数据集,现在是时候拟合模型了。论文用的是 STAN,然而我用的是 Python/PyMC3。

import arviz as az
import pymc3 as pmwith pm.Model() as m:
    alpha = pm.Beta('alpha'          , 3 , 3  , shape=3)
    theta = pm.Uniform('theta'       , 0 , 12 , shape=3)
    k     = pm.Beta('k'              , 2 , 2  , shape=3)
    s     = pm.Gamma('s'             , 3 , 1 , shape=3)
    beta  = pm.HalfNormal('beta'     , 1      , shape=3)
    ru    = pm.HalfNormal('intercept', 5) 
    lamb  = pm.Normal('lamb'         , 0 , 1) 
    noise = pm.InverseGamma('noise'  , 0.05, 0.0005) 

    transpose_m1 = [beta_hill(x, s[0], k[0], beta[0]) for x in carryover(media_1, alpha[0], L, theta = theta[0], func='delayed')]
    transpose_m2 = [beta_hill(x, s[1], k[1], beta[1]) for x in carryover(media_2, alpha[1], L, theta = theta[1], func='delayed')]
    transpose_m3 = [beta_hill(x, s[2], k[2], beta[2]) for x in carryover(media_3, alpha[2], L, theta = theta[2], func='delayed')]

    y_hat = pm.Normal('y_hat', mu=ru + transpose_m1 + transpose_m2 + transpose_m3 + lamb * price_variable,
                  sigma=noise, 
                  observed=y)trace = pm.fit(method='svgd')

结果

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

  • MAPE: 0.12
  • 平均寿命:0.026

正如所料,样本内拟合(MAE 梅伊)相当好,1)因为它是样本内的,2)因为我们生成的数据与我们正在建模的函数形式相同。因此,这归结于 MCMC 近似的效果。

真实参数与近似参数。

下面,我们可以看到模型参数相对于真实模型参数的后验分布(蓝线)。这使我们能够了解我们的模型在恢复真实模型参数方面表现如何。

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

ROAS / mROAS 计算

现在,我们用以下公式计算 roa 和 mROAS。

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

在英语中,上面的等式转化为所有媒体渠道打开时的预测销售额减去除第 M 个媒体渠道之外的所有媒体渠道的预测销售额,再除以支出。唯一的问题是,我们必须考虑后期效应(即合成实验结束后的遗留效应)。因此,我们不仅要计算变更期,还必须包括后变更期。

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

# simulate ROAS media_1_roas = []
media_2_roas = []
media_3_roas = []burnin=500
for i in range(1000):
    burnin=5
    s = np.random.randint(1,1000-burnin)
    intercept = t['intercept'][s]

    s_sample1, s_sample2, s_sample3 = t['s'][:,0][burnin:][s],     t['s'][:,1][burnin:][s],  t['s'][:,2][burnin:][s]
    k_sample1, k_sample2, k_sample3 = t['k'][:,0][burnin:][s],     t['k'][:,1][burnin:][s],  t['k'][:,2][burnin:][s]
    b_sample1, b_sample2, b_sample3 = t['beta'][:,0][burnin:][s],  t['beta'][:,1][burnin:][s],  t['beta'][:,2][burnin:][s]

    a_sample1, a_sample2, a_sample3 = t['alpha'][:,0][burnin:][s], t['alpha'][:,1][burnin:][s],  t['alpha'][:,2][burnin:][s]
    t_sample1, t_sample2, t_sample3 = t['theta'][:,0][burnin:][s], t['theta'][:,1][burnin:][s],  t['theta'][:,2][burnin:][s]

    fitted_m1 = [beta_hill(x, s_sample1, k_sample1, b_sample1) for x in carryover(media_1, a_sample1, L, theta = t_sample1, func='delayed')]
    fitted_m2 = [beta_hill(x, s_sample2, k_sample2, b_sample2) for x in carryover(media_2, a_sample2, L, theta = t_sample2, func='delayed')]
    fitted_m3 = [beta_hill(x, s_sample3, k_sample3, b_sample3) for x in carryover(media_3, a_sample3, L, theta = t_sample3, func='delayed')]

    y_hat    = intercept + fitted_m1 + fitted_m2 + fitted_m3 + t['lamb'][burnin:][s] * price_variable

    y_hat_m1 = intercept + fitted_m2 + fitted_m3 + t['lamb'][burnin:][s] * price_variable
    y_hat_m2 = intercept + fitted_m1 + fitted_m3 + t['lamb'][burnin:][s] * price_variable
    y_hat_m3 = intercept + fitted_m1 + fitted_m2 + t['lamb'][burnin:][s] * price_variable media_1_roas.append(sum(y_hat[L:]-y_hat_m1[L:]) / media_1[L:len(media_1)-L].sum())
    media_2_roas.append(sum(y_hat[L:]-y_hat_m2[L:]) / media_2[L:len(media_1)-L].sum())
    media_3_roas.append(sum(y_hat[L:]-y_hat_m3[L:]) / media_3[L:len(media_1)-L].sum())

优化营销预算

最后,我们继续优化预算。为了做到这一点,我们采用我们的模拟 ROAS 数,并将其转化为一个约束优化问题。

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

为了实现这一点,我们可以将我们的 ROAS 数字插入到一个 SciPy 优化函数中,以找到我们的销售额最大化的支出。

摘要

本文探讨了与介质混合建模相关的许多方面,重点是遗留物和形状效应,但也提供了贝叶斯模型的规范,并探讨了它在合成数据集上恢复真实模型参数的有效性以及先验和样本大小的影响(未涵盖)。

下一步,我会发现有趣的是,如何用这个模型做出决策,不仅最大化销售,而且最大化模型的“知识”。我们可以认为这是强化学习中的“探索”阶段。

Carto vs Kepler.gl:位置分析选择哪种工具?

原文:https://towardsdatascience.com/carto-vs-kepler-which-tool-to-use-for-geospatial-analytics-894c867545b4?source=collection_archive---------25-----------------------

地理空间分析和洞察

不同用例的地理空间工具的比较

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

开普勒

工具的简要介绍

Carto 和 Kepler.gl 是公司在分析中用来做出地面运营决策的工具。在这篇文章中,我们从技术到目标用户等方面对它们进行了比较。

开普勒

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

开普勒

Kepler.gl 是一个基于网络的平台,用于可视化大规模位置数据。它由优步大学的可视化团队创建并开源,其使命是创建行业级开源框架来增强大数据。

三维电解剖标测系统

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

三维电解剖标测系统

Carto 是一个基于 PostGIS 和 PostgreSQL 的开源位置情报平台。CARTO(以前称为 CartoDB)是一个软件即服务(SaaS)云计算平台,提供 GIS、web 制图和空间数据科学工具。

Locale.ai

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

locale.ai

Locale.ai ,我们正在为按需公司的供应和运营团队建立一个使用位置数据的运营分析平台。类似于 web 分析工具(Google Analytics、Mixpanel、Clevertap)使用点击流数据对 web 产品进行分析,Locale 有助于使用地理空间数据分析和优化您的现场操作。

比较

此图简单展示了三种工具在不同特性或参数上的比较。本节将深入探讨所有参数。

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

比较汇总表

1-分析和可视化

开普勒

开普勒是探索性数据分析(EDA)的最佳地理空间可视化工具之一。优步团队已经对与移动公司相关的可视化特性做了彻底而详细的研究。

它最大的缺点之一是任何需要对数据进行的处理都需要在外部完成。不幸的是,Kepler.gl 是一个桌面工具,只接受 CSV、JSON 和 geoJSON 文件形式的数据。

当您处理大量数据并需要不断下载 CSV 以绘制到工具上时,这些特征会使您非常痛苦

三维电解剖标测系统

Carto 的可视化和分析能力更加水平,在他们作为一家公司处理的用例上撒下一张大网,其中包括不同种类的过滤器和小部件。它们在产品内部也有几个内置的分析(帮助你操作数据的预置函数)。

这里的缺点是,所有这些分析一次只能在一个数据集上进行。因此,这里的预处理也需要在系统之外进行,尤其是在更复杂的数据集的情况下。

现场

在现场,我们试图包括两个世界的最好的。我们从开普勒获得了可视化的灵感,并在产品中加入了分析——不是作为功能,而是作为用例。我们还跨不同的数据库、格式和系统接收您的所有数据,将其放在一个位置并建模,以便能够非常容易地进行这些分析。

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

三维电解剖标测系统

2-目标人物角色

开普勒

Kepler.gl 主要面向商业用户,由于其简单性,他们根本不知道如何编写代码或 SQL。然而,我们已经看到谷歌和 Airbnb 的大量数据科学家将它用于可视化。

三维电解剖标测系统

Carto 被定位为一个位置智能平台,具有数据分析和可视化的能力,不需要以前的 GIS 或开发经验。他们的 UX 是根据现代 web 开发人员和数据科学家的需求定制的。他们的可视化可以被商业用户用来做决定。

现场

我们在现场的目标用户也是业务用户——公司内部的供应和运营团队、产品团队、战略团队和营销团队。我们发现他们是最痛苦的人,大部分时间都在使用 excel 表格。他们仍然依赖分析师提供 BI 报告,或者依赖开发人员提供实时仪表盘。

3-目标行业

开普勒

如前所述,由于开普勒已经被优步开源,它的许多功能与移动公司更加相关。它也被学者和记者大量使用,因为他们不处理大量的数据直播。

三维电解剖标测系统

由于 Carto 更像一个平台,他们最终与各种各样的客户合作,从政府到金融、医疗保健到物流。

现场

我们认为我们的市场是供应和/或需求不断变化的每一家公司。这包括按需交付、微移动、物流、供应链以及劳动力公司。

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

开普勒

4-使用案例

开普勒

Kepler.gl 主要用于地理空间可视化。开普勒上已经建立的地图的一些例子是:

  • 加州地震
  • 纽约出租车之旅
  • 旧金山海拔等高线
  • 纽约市人口
  • 旧金山街道树木地图

三维电解剖标测系统

Carto 涉足的用例有:

  • **场地规划:**推动场地选择和投资决策
  • **物流优化:**优化供应链设计
  • **地区优化:**协调销售和服务地区
  • **地理营销:**根据用户的位置和移动方式锁定用户&
  • **移动性规划:**更好的基础设施决策&减少流量

现场

我们在现场处理的用例有:

  • **生命周期分析:**对用户、骑手或订单旅程的分析,以减少掉线。
  • **供需分析:**分析需求(订单)和供应(骑手)的不匹配,减少闲置时间。
  • **行程分析:**分析行程和移动以提高利用率。
  • **单次行程分析:**根据运动模式创建单个用户、自行车或行程的简档。
  • **站址分析:**分析静态(或固定)实体的性能。

5-技术

开普勒

Kepler.gl 中有四个主要套件可供使用——Deck、Luma、React map 和 React vis——来制作漂亮的数据驱动地图。它是用 deck.gl 构建的和利用 WebGL (一个 JavaScript API)更快更高效地渲染大数据。

三维电解剖标测系统

Carto 的网络应用程序名为 Builder,用户可以在其中管理数据,运行用户侧分析和设计定制地图。CARTO 引擎是一组 API 和开发人员库,用于创建自定义地图和数据可视化界面。该工具在前端 web 应用程序、后端基于 rails 的 API 和客户端库中广泛使用 JavaScript。

现场

Locale.ai 使用各种强大的开源工具来处理前端和后端的大规模数据集。前端由优步的 Deck.gl 提供高性能可视化,Nebula.gl 提供额外的编辑功能,Mapbox-GL 用于渲染地图。

与其他平台不同,Locale 提供了实时和按需摄取大量数据的能力,以便动态地进行分析和获得洞察力。后端由 python、PostgreSQL 和 PostGIS 提供支持,用于强大的数据处理和地理空间操作。

内部构建

在与一些领先的按需和微移动公司合作时,我们观察到他们最终围绕开普勒本身或 QGIS 等开源工具进行黑客攻击。

有时开发人员也构建他们自己的内部工具,但大多数时候他们并不适合公司内部所有不同的受众,而且由于这些工具不是以可扩展的方式构建的,维护这些工具经常会占用他们大量的带宽!

很多时候甚至有重复的努力,轮子一遍又一遍地被重新发明。正如 Twilio 的杰夫·劳森所说

“构建软件比以往任何时候都容易,但操作软件却比以往任何时候都难”。

为什么选择区域设置?

因此,如果你是一家决定在内部构建这一平台的公司,它必须像一个平台一样构建,(很像优步的做法),并具有以下特征:

  • 简单直观的用户界面来执行分析,特别是对于商业用户
  • 具有可操作性的可扩展地理空间可视化
  • ETL 足够健壮,可以处理流数据以及及时返回的历史分析

这需要建立一个至少 6-7 人的团队(由前端和数据工程师、地理空间分析师以及数据科学家组成)。最重要的是,等待至少 6 个月来构建平台和启动分析的额外痛苦。

如果你想进一步钻研,可以查看我们的 网站 出来或者在LinkedIn或者Twitter上与我取得联系。

原贴 此处

相似读数

[## 开普勒& QGIS:开源地理空间工具浅析

为什么我们需要地理空间分析?为什么现在比以往任何时候都重要?人类的大脑主要识别信息…

blog.locale.ai](https://blog.locale.ai/kepler-qgis-a-brief-analysis-of-the-open-source-geospatial-tools/) [## 在地理空间上弥合最后一英里递送公司的供需差距

当供需缺口存在时,我们要么失去订单,要么我们的骑手闲置-这两者都导致…

blog.locale.ai](https://blog.locale.ai/bridging-supply-demand-gaps-in-last-mile-delivery-companies-geospatially/)

卡通对峙:使用 Viola Jones 检测人类卡通人物

原文:https://towardsdatascience.com/cartoon-face-off-detecting-human-cartoon-characters-using-viola-jones-f805aa3c8e3b?source=collection_archive---------46-----------------------

《辛普森一家》、《南方公园》和《冰雪奇缘》中著名的人脸检测框架。

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

原始图像取自动画屏幕截图

我为基于图像的生物统计学课程做的一个有趣的项目。所有的脚本和数据都可以在 这里找到

介绍

人脸检测是计算机视觉中一个广泛研究的领域。随着近年来神经网络的兴起,我们的模型现在可以产生几乎人类水平的性能。然而,神经网络并不是所有任务的答案。它们在计算上是昂贵的、复杂的并且严重依赖于训练数据集,训练数据集也需要足够大并且提供大的变化以防止过拟合。换句话说,有时我们只是没有足够的数据、时间、计算能力……或者坦率地说,我们只是不想处理这些。

因此,我们仍然发现自己使用传统方法来解决某些人脸检测问题。在本文中,我们回到 2001 年,回到可以说是第一个实时提供有竞争力的对象检测率的对象检测框架——Viola-Jones 框架。这个计算机视觉老计时器今天仍然在许多不同的应用中使用。它简单、快速,而且在实时检测人脸方面做得很好,所以如果它没有坏,为什么要修复它呢?在本文中,我们检查该框架如何面对检测非人类人脸的挑战。我们在卡通人物脸上测试了预训练的 Viola-Jones 分类器。

方法学

数据和预处理

我们截取了三部风格迥异的动画片的截图:《辛普森一家》、《南方公园》和《Frozen⁴.》对于每部漫画,我们随机选择了 70 张截图,如果这些截图包括人脸而不是卡通人物的脸(脸朝向相机,不应倾斜),我们认为这些截图将是合适的输入。

我们还对图像进行了预处理:为了减少 CPU 时间,我们将较大的图像的最大宽度调整为 700 px,并将它们转换为灰度,因为它们更容易处理,需要处理的数据也更少。为了能够正确评估我们的检测,我们使用了一个在线工具来注释我们的图像。

人脸检测

OpenCV 提供了预先训练好的 Viola-Jones 人脸分类器。我们对人脸使用正面人脸分类器,后来,为了改进我们的检测器,我们还使用人脸和眼睛分类器的组合——只有当这些分类器的检测区域相应地重叠时,我们才接受人脸检测。

检测器评估

对于每幅图像,我们以两种不同的方式评估我们的检测:

  • 交集超过并集(IoU) ,在这里我们测量检测到的对象和地面真实之间的相似性。

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

  • 与数据集中所有人脸的数量相比,计算误检测和正确检测

结果

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

人脸检测示例。原始图片取自斯普林菲尔德!斯普林菲尔德!动画屏保Frinkiac

我们使用带有默认参数的 Viola-Jones 正面人脸分类器。我们的脚本返回每个输入图像的 IoU 值。因为这些值不是正态分布,我们使用非参数 bootstrap⁵来说明 IoU 均值的不确定性。结果如下图所示。

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

IoU 和 95%自举百分位数置信区间。

由于我们的数据集相对较小,我们也可以用更直观的方式呈现结果。这很费时间,但是值得!底部的条形图让我们对分类器的性能有了更好的了解。它显示了每幅漫画的错误检测总数和正确检测总数与数据集中所有人脸总数的比较。

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

每幅漫画的错误检测总数和正确检测总数与数据集中所有人脸总数的比较。

毫不奇怪,该算法在冻结数据集上表现最佳。这部漫画的画风是最真实的,人物都有相配的五官,如眉毛、鼻梁等。虽然《辛普森一家》是一部关于(相关的)人类家庭的卡通片,但维奥拉-琼斯似乎不同意最后一部分。这些角色是以如此艺术的方式绘制的,以至于我们的算法在大部分时间里都在挣扎并优雅地失败了。还有,我们几乎从来没有看到他们“直接面对镜头”,这是 Viola-Jones 默认的问题。相反,南方公园的绘画风格非常扁平,大多数场景都包括直接“面对镜头”的人物。这使得算法的工作容易得多,即使他们的特征不太像人脸(大眼睛,小或不存在的鼻子和耳朵,怪异的头型),结果也令人惊讶地好。

最后,我们尝试通过结合 Viola-Jones 人脸和眼睛分类器来增强我们的检测器。我们在 IoU 最高的数据集(在我们的例子中是冻结数据集)上测试了它。我们注意到,平均 IoU 显著降低(平均从 0.46 降至 0.27),下图再次帮助我们理解结果,它显示了更详细的比较。

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

检测器的比较:冻结数据集上的人脸分类器与人脸和眼睛分类器的组合。

如果我们只关注 IoU 值,看起来面部分类器优于我们提出的方法,但是如果我们仔细观察,我们注意到通过使用分类器的组合,错误检测的数量显著下降,并且我们的检测器不容易出错,这在一些应用中也可能是期望的。因此,我们不能说分类器的组合导致更差的性能,这只是取决于用户的需求。

结论

快 20 岁了,但对一个老前辈来说还是很适合的!Viola-Jones 人脸检测器再次证明了它的鲁棒性,即使在“非人类”人脸上也表现出了不错的性能(但当然,只有在卡通人脸与人脸足够相似以使算法检测到典型的面部特征的情况下)。

这个有趣的小研究项目引出了更多的问题和想法!如果我们使用一些优化方法来确定分类器的最佳参数,我们可能会改进我们的结果。仔细观察每幅漫画的结果并试图确定最像人类的角色也是很有趣的,但我们需要更大的数据集才能确定。

[1] P. Viola 和 M. Jones,使用简单特征的增强级联进行快速目标检测 (2001),CVPR,2001 年

[2] 《辛普森一家》剧集截图,访问时间:2019–12–06

[3] 《南方公园》剧集截图,访问时间:2019–12–06(编辑:他们的服务器目前好像宕机了,你可以在网络档案馆上访问)

[4] 截图自《冰雪奇缘》,访问时间:2019–12–06

[5] B. Efron, Bootstrap Methods:再看 Jackknife (1979),统计年鉴

使用 TF-Agents 解决横向问题——构建您的第一个强化学习应用程序

原文:https://towardsdatascience.com/cartpole-problem-using-tf-agents-build-your-first-reinforcement-learning-application-3e6006adeba7?source=collection_archive---------46-----------------------

TF-agent 利用深度 Q-网络学习最优策略

强化学习是人工智能的一个新兴子领域,在一些应用中既酷又有效。这篇文章的前几段提到了强化学习,还有数百篇关于这个主题的介绍性博客文章。假设读者熟悉强化学习的概念,让我们使用 CartPole 问题创建我们的第一个强化学习应用程序。

横竿问题

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

信用:开放健身房

侧手翻问题就是平衡侧手翻的问题。CartPole 是一种结构,其中一根杆连接到车上,车可以在无摩擦的表面上自由滑动。通过向左或向右滑动手推车,手推车可以保持平衡。

目标

所以,翻筋斗的目的是防止它落下或移出射程。因此,故障条件为:

  • 极点相对于垂直线的角度幅度超过某个阈值。
  • 横竿离中心的距离超过了某个阈值。

为了让横滚继续无限多步,我们将步数限制在某个值(在我们的例子中是 200)。

为了让步骤和情节之间的区别更加清晰,我引用前面提到的博客中的摘录:

这里值得一提的是步。一集是一个游戏的实例(或者游戏的生命)。如果游戏结束或生命减少,该集结束。另一方面,步长是在情节中单调增加的时间或某个离散值。随着游戏状态的每次改变,步骤的值增加,直到游戏结束。

环境

一般来说,环境是主体执行动作的环境或设置。在这里,横竿环境是横竿和横竿运作的环境。环境由重置功能、下一步生成器(基于当前状态和动作)、动作说明、状态说明和其他辅助功能组成。我们不需要像在之前的博客中那样创建一个定制的环境。我们通过 TF-Agents 使用 OpenAI gym 中可用的环境。TF-Agents 的一个通用特性是它支持像 OpenAI Gym、Unity 的 ML-Agents 等现成的图书馆环境。

让我们使用套件 _ 健身房模块加载横拉杆环境。

国家、行动和奖励

那么,我们如何在 CartPole 环境中表示状态?磁极在某个位置(线性和角),它有一定的速度(也是线性和角)。因此,四个变量——线性位置、角位置、线速度、角速度——代表环境的状态。

让我们在重置环境后得到横竿的状态—初始状态。

它返回时间步长对象,该对象包含环境状态以及一些其他信息。我们稍后会谈到这一点,但现在,我们可以看到它如何给出当前状态。

动作是代理执行的活动。在这里,代理可以让购物车向右或向左走。所以,动作用 0 和 1 来表示。0 表示向左,1 表示向右。

含糊地说,奖励是代理人因执行良好行为而获得的好处或鼓励。就像一个学生因为取得好成绩而受到表扬一样,如果我们的代理商表现良好,我们也应该给予表扬。在这里,翻筋斗不倒下或出界应该得到奖励和鼓励。因此,对于每一个没有倒下或超出范围的掷骰子的例子,我们有+1.0 的奖励。

现在让我们对我们的环境采取一些行动,看看状态如何变化,奖励如何授予,以及情节如何结束。更重要的是,让我们了解什么是时间步长以及时间步长的组成部分是什么意思。

时间步长和实验

当我们运行 envreset 方法时,我们得到了时间步长对象。我们先来了解这个对象是什么,包含了什么。

TimeStep 是包含状态信息的对象,如当前观察值、步长类型、奖励和折扣。给定在某个状态上执行的某个动作,它给出新的状态、新步骤(或状态)的类型、折扣和获得的奖励。在我们的 CartPole 环境中,有三种类型的步骤——一集的开始、一集的中间步骤和一集的最后步骤。当一集开始时,该步骤的类型为 0,并在该集结束前变为 1。在剧集的最后一步,该步骤的类型变为 2。这有助于了解该步骤是否是最后一步。折扣是一个参数,它给出了后一个奖励相对于前一个奖励的重要性比率。奖励是对达到当前步骤的奖励。

最初,我们运行重置方法,并获得时间步长,这给出了当前观察值。我们看到 step_type0 ,显然没有收到奖励。

让我们连续对其应用动作 1 (向右移动)并查看该集何时结束。

结果显示在下面的熊猫数据框 df 中。

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

显示每个步骤的时间步长值的表格

我们在这里看到,在 10 步之后,这一集结束了。可以猜得很好,总是右动的政策不好。

让我们看看随机向左或向右移动。如果代理从可能的动作列表中采取随机动作,则该策略称为随机策略。

平均步骤数比我们尝试的仅右策略多一倍左右,但是不,这并不好。

培训架构

TF-Agents 培训项目的培训架构通常由两部分组成:采集部分和培训部分。收集部分使用驱动程序来收集轨迹(经验),训练部分使用代理来训练网络。网络一度训练更新收集政策。在解释培训架构时,我们将讨论收集策略。

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

TF-agent 的典型训练架构(来源:Scikit-Learn、Keras 和 TensorFlow 的上机学习,第 2 版,Aurelien Geron(第 18 章:强化学习))

我们已经讨论了环境、时间步长和行动。让我们一个一个地讨论与我们的横竿问题有关的各个部分。

环境

我们创建了两种不同的环境:用于培训的培训环境和用于评估的评估环境。这是正常情况,因为培训可能需要多种环境和比评估环境更多的资源。

DQN 代理商

现在让我们创建深度 Q-网络代理。代理从重放缓冲器中取出一批轨迹,并训练 Q-网络。我们创建一个 Q 网络( q_net )并将其传递给代理。与网络一起,我们通过时间步长动作规范列车环境、优化器、损耗和列车步数计数器。

策略和收集策略

在深度强化学习环境中有两种类型的策略。策略是用于评估和部署我们的模型的策略,而收集策略是用于创建轨迹/体验的策略。基于收集策略,驱动程序执行动作并生成轨迹。轨迹简单来说就是经历。它们由当前步骤、奖励和当前下一步组成。它们的批次用于训练网络。

为了用一些轨迹填充重放缓冲区,以便在训练之前帮助评估一次代理的策略,我们利用随机策略并预先收集数据。

此外,让我们创建实用函数来计算平均回报并收集重放缓冲区中的数据。在此之前,让我们运行一下重放缓冲区。重放缓冲器是存储轨迹的缓冲器。从中提取批次轨迹来训练 Q 网络。当从重放缓冲区以随机方式创建批次时,训练轨迹是相同且独立的,因此有助于使用梯度下降算法的训练过程。

现在,来自重放缓冲区的数据被转换为 iterableTF . data . dataset管道,并将被提供给代理。

这里, num_steps 被设置为 2 ,因为我们需要两个观察值来计算损失。将 num_steps 设置为 2 会对批次中每个项目的两个相邻行进行采样。并行调用和预取优化了数据集。

培养

由于我们已经构建了所有组件,现在让我们来培训我们的代理。在训练之前,让我们定义我们的超参数。

num_iterations 是我们将要进行的训练的迭代次数。collect _ steps _ per _ iteration是我们将在每次训练迭代中执行的收集步骤数。我们将其设置为 1,因此在训练开始时只有一个单独的集合步骤。 replay_buffer_max_length 是重播缓冲器的最大长度。它是在可用内存的基础上保存的。 batch_size 是供给代理的一批轨迹的大小。 learning_rate 是 Adam 优化器的学习速率。 log_interval 是记录训练损失的间隔, eval_interval 是使用平均回报率评估算法的间隔。num _ eval _ epites是我们用来计算平均回报的剧集数。

我们现在开始训练吧。

希望平均回报保持增长,直到饱和在 200 步左右(这是每集允许的最大步数)。

恭喜你!你用 TF-Agents 训练了你的第一个强化学习算法。拿一杯你最喜欢的饮料。你应得的!

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

惠特尼·赖特在 Unsplash 上拍摄的照片

形象化

现在让我们来想象一下训练过程。我们看到的是平均回报而不是损失的趋势,因为平均回报是我们的目标,而不是损失。更好地了解政策和损失可能并不总是齐头并进。当代理探索新的空间时,它可能仍在学习,但损失可能会增加。类似地,当代理人长时间被困在某个空间时,损失可能会减少,但策略不是广义的策略,即过度拟合。

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

我们学习过的代理的平均回报与迭代

我们在这里看到,在 5000 集之后,平均奖励在 200 左右饱和。呜哇!

在活动

现在,让我们看看我们的代理如何使用我们刚刚学到的最优策略。

由于培训和评估是在 Jupyter 实验室进行的,下面给出了显示评估视频的代码片段。

现在,我们的代理人在 CartPole 环境中表演的视频附在下面。

由于我们将最大步数保持在 200 的范围内,代理并不关心如何平衡它,使它能够支持超过 200 步数。所以,我们看到它在接近 200 级台阶时会下降。我们可以通过增加最大步数的限制或者根据线性和角位移给予不同的奖励来解决这个问题。

怎么会。酷毙了。是。它?

希望这篇文章能给读者一些关于强化学习及其使用 TF-Agents 实现的想法。TF-Agents 通过使培训体系结构的组件模块化、灵活和容易获得,使许多事情变得更容易。在接下来的日子里,我们将探索更多的强化学习环境和问题。敬请期待!

级联相关,一个被遗忘的学习架构

原文:https://towardsdatascience.com/cascade-correlation-a-forgotten-learning-architecture-a2354a0bec92?source=collection_archive---------22-----------------------

1990 年第一个“深度学习”方法如何胜过经典神经网络。

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

1990 年,Scott E. Fahlman 和 Christian Lebiere 提出了一种动态神经网络架构,称为“级联相关”[1],在训练速度、准确性和规模方面优于静态神经网络。在最近的一次讲座中,法尔曼称之为第一种使用类似“深度”学习的方法。
利用这种算法,他们成功地完成了“双螺旋”分类任务和人工语法学习问题。

然而他们的工作在很大程度上被遗忘或者被当作历史的旁注。尽管这个想法本身在精神上非常接近我们现在所说的机器学习算法的‘助推’家族——在某些问题集上比深度学习表现更好的技术。这些方法——就像级联相关一样——都是基于这样的想法:通过堆叠专门的学习器,一次训练一个,来迭代地改进分类器。

有足够的理由去理解和实现 Fahlman 的方法——并在各种领域和挑战中对其进行测试!让我们调查它是否、在哪里以及如何仍然能够与现代机器学习工具竞争。

本文是关注(循环)级联相关系列文章的第一部分。

在第一部分中,我们将详细介绍如何使用 Python 和 PyTorch 实现一个简单的仅向前级联相关(简称 CasCor)网络。我们还将看到将它应用到一个简单问题领域的一些结果。

在接下来的部分中,我们将研究如何更好地自动化和优化算法。我们还将实现和训练它的一个递归版本,并根据标准的机器学习解决方案对 CasCor 进行基准测试。

要阅读本文,您应该熟悉如何使用损耗梯度的反向传播来训练神经网络(截至 2020 年,这是一种广泛使用的方法)。也就是说,您应该了解梯度通常是如何计算的,并应用于网络的参数,以尝试迭代实现损耗收敛到全局最小值。

第 1 部分:级联相关

事不宜迟,让我们实现一个简单版本的 CasCor!因为我们正在使用 Python,所以我们需要导入一些基础知识和 PyTorch:

概观

CasCor 算法从一层网络(只有输出神经元)开始。然后,它遵循以下步骤:

  1. 火车(仅限!)输出神经元,直到达到平台期
  2. 如果残差足够好,停止;
  3. 否则,冻结现有网络的所有权重
  4. 然后,通过优化其输出和最后测量的残差之间的相关性,训练一个新的隐藏神经元(见下文)
  5. 回到步骤 1——冲洗并重复

第四步。是 CasCor 最重要也是最复杂的部分,如下图所示。在训练完成之前,隐藏神经元与网络断开。我们静态地将所有原始输入和早期层的值作为加权和提供给它的激活函数。然后,训练算法优化神经元的权重,以实现其输出值与在早期迭代中测量的样本集残差的最佳可能相关性。
为了训练最佳相关性,我们将需要使用相关性度量来代替一些标准的损失函数,稍后会详细介绍。

训练完成后,我们可以将隐神经元加入到网络中。输出神经元现在将接收它的值作为额外的输入,我们需要训练它们的新权重,所以我们跳回到步骤 1。

CasCor 论文[1]以类似的方式说明了最终的网络(带有快捷方式)和添加隐藏神经元的过程:

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

添加新的隐藏神经元时,仅迭代新的权重(红色方块)。在这里,箭头是馈入描述激活函数的圆的加权和。(图片翻译自维基百科,2020)

在本文中,我们主要关注 CasCor 的两个主要部分:步骤 1。第四。,即训练输出和训练隐藏神经元。其余的我们将简单地手动完成。

测试装置

为了简单起见,我们使用 2D 分类任务进行测试(这样更容易调试)。因此,我们的网络将有 2 个输入维度(网格的坐标)和 1 个输出维度(介于 0 和 1 之间的值)。
我们将在以下数据集上进行训练(没有测试集),其中 0 值为黑色,1 值为白色:

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

为了将输入和输出实际输入到我们的训练函数中,我们还需要将它们转换成“长”形式,并添加一个静态偏置值 1。
此外,测试表明,当输入标准化时,CasCor 和 quickprop 的性能更好,所以我们也这么做吧。

快速推进

为了训练 CasCor 网络中的单元,他们使用了一种也被 Fahlman 在 1988 年发明的技术[2],叫做 quickprop。
Quickprop 是反向传播的一种替代方案,它使用了牛顿法的一种变体。除了原始论文之外,关于这方面的更多信息,Giuseppe Bonaccorso 的这篇有用的博客文章也很好地描述了这一点。

注意,quickprop 并不是实现 CasCor 所必需的。然而,为了贴近原文并最大限度地学习,我们也将在这里使用它。这本身就是一个有趣的话题,我鼓励你去研究它!
如果您对 quickprop 不感兴趣,请跳到下一节,将任何关于它的进一步提及简单地视为“基于给定输入的训练神经元权重&预期输出对”。

我们的实现是基于这篇博文的——但是由于我们不想在本文中关注 quickprop,我们将只看一下他们代码的一些调整,而不是深入研究数学。

**灵活性。**post 的代码使用了固定的激活和丢失函数,静态实现了它们的渐变。对于 CasCor,我们需要更灵活一点(至少在损失方面),所以我们将这些函数作为参数传递。

**自动梯度计算。**由于激活和损失函数现在是可变的,我们在试图建立它们的梯度时会遇到麻烦。但是,使用 PyTorch,我们可以轻松地跳过这一步,让autograd来完成繁重的工作。

收敛。 Giuseppe 的代码测试每次迭代的权重变化,以确定收敛性。一些快速测试发现这很麻烦,因为它似乎经常陷入鞍点和局部最小值。所以不用这个,我们用残差。
具体来说,我们将计算残差的移动平均值,并检查每次迭代的平均值差异是否小于给定的tolerance
最后但同样重要的是,如果误差发散或收敛太慢,quickprop 在一定的迭代次数后干脆放弃(它用完了patience,见函数参数)。

输出训练

随着 quickprop 的实现,让我们开始有趣的部分吧!
CasCor 从一层网络开始,即我们将使用单个输出神经元,并将其连接到我们的输入(和偏置)。为了开始训练这个神经元,我们获取输入(x)和输出(y)样本集,并创建新初始化的(随机)权重,所有这些都输入到 quickprop 中。

注意,这种方法并不关心网络是单层的还是更深层的——因为我们只是训练输出权重,我们也可以通过多个隐藏层运行输入,并将其用作训练的 *x*

让我们用训练集来测试一下。

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

简单的看起来不错!

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

不出所料,这不是很匹配,因为我们只训练了一个单位。但就目前而言,这是一个足够好的近似值。

隐藏神经元训练

正如我们所看到的,我们简单的单神经元模型近似第二种形状,有相当大的误差。为了达到更好的拟合,我们需要添加隐藏层。当我们添加一个隐藏的神经元时,我们:

  1. 冻结所有其他参数(包括输出)
  2. 通过网络向前运行训练样本,并使用输入值和其他隐藏单元值作为新单元的输入
  3. 训练新神经元,使其值与先前运行中计算的残差最佳相关

协方差函数 S(我们将用它来代替相关性;关于[1]中的更多细节由下式给出:

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

其中 phi 是神经元的激活函数,V 是它的值,E 是残差(较早的预测减去实际目标)。条形项是平均值,o 和 p 分别是输出值和样本的指数。

有了这个“损失”函数,我们可以简单地再次运行 quickprop。

请注意,事后看来,在这里使用 quickprop 有点危险,因为它使用了二阶导数的近似值。这不是一个好的解决方案,因为 S 的一阶导数由于幅度计算而不是连续的。在 CasCor 的论文中,Fahlman 等人实际上使用梯度上升来训练神经元。

让我们用上一个样本集的单层网络预测(pred)来运行这个!

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

这很好地向我们展示了目前误差最大的地方(第一张图中非常暗或非常亮的点)以及神经元试图与之相关的事情(第二张图)。

组合隐藏和输出神经元

作为(本文的)最后一步,我们现在再次训练我们的输出层,另外基于我们新训练的神经元计算的值(neuron_value)。为此,我们需要将这些值作为输入包含到输出神经元中(x2)。

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

漂亮!

输出神经元现在可以近似该形状,因为它可以将其回归基于隐藏神经元的附加值。由于这与我们从早期优化中得到的误差相关,添加它具有将输出神经元必须解决的问题减少一维的效果。

警告

所有的图片都是执行代码片段的结果,然而,你看不到的是它们在生成这些图片之前的运行频率。特别是,训练神经元仅以非常低的概率收敛到产生显示值的权重,即,我必须运行算法几次,直到我得到特定的输出。
这可能部分归因于此处 quickprop 的使用,因为它依赖于损失函数的一些性质,如在其一阶导数中连续。正如我上面提到的,法尔曼等人。艾尔。实际上在[1]中使用梯度上升来训练隐藏的神经元。

但是 quickprop 有更多的问题,上面的简单实现没有正确解决。从 Fahlman 的论文[2]和另一篇更近期的 quickprop 与反向传播的比较[3]中可以清楚地看出,a)它需要更多的调整才能更可靠地产生好的结果,b)它并不是在所有领域都表现得一样好。具体来说,在一些现实世界的图像分类问题中,它无法在偏差和方差上与 back-prop 竞争。

也就是说,使用标准反向传播和 Adam 优化器训练的可比网络结构(1 个隐藏,1 个输出神经元)在测试运行期间甚至从未收敛到上述结果(它需要至少一个其他神经元来收敛到该结果),但这可能是坏运气,因为它不是受控的测试设置。

CasCor 的另一个问题是网络的厚度与深度。由于 GPU 可以非常有效地处理矩阵,因此与较薄和较深的网络(如 CasCor 默认生成的网络)相比,通过深度较浅(即可以更好地表示为矩阵)的较宽网络运行会更快。对于我们的小例子来说,这当然不是太大的问题,但当生成的网络解决更复杂的任务时,这可能会成为一个问题。

这就把我们带到了下一部分。

未来的改进

正如我们所看到的,CasCor 的这个基本实现实际上是可行的!😃
然而,我们仍然缺少许多使过程自动化的样板代码,以及训练方法的一些优化,以更高的概率找到全局最优。
这就是为什么,在本系列的下一部分,我们将看到我们如何:

  • 自动化输出- >隐藏- >输出- >隐藏- > … 训练循环
  • 更改 quickprop 以提供更稳定的结果,并训练一组新节点,而不是只有一个(并选择最好的)
  • 进一步改进该流程以选择多个节点(即具有“更宽”的层)
  • 将问题域转换为更有趣/更具挑战性的问题域(例如,只能通过更深层次和/或循环网络解决的问题域)
  • 在一个受控的环境中,将其与其他机器学习方法进行比较

如前所述,Quickprop 本身值得更详细的研究。出于这个原因,我写了一篇更深入的文章,涵盖了它背后的数学原理、可能的实现和一些改进。

该系列的第 2 部分目前正在进行中,当它发布时将链接到这里。
该系列所有成品笔记本和代码也在 Github 上。请留下反馈并提出改进建议。

如果你想支持这篇和类似精彩文章的创作,你可以注册一个中级会员和/或关注我的账户

[1] S. E. Fahlman 和 C. Lebiere,《级联相关学习架构》 (1990),神经信息处理系统的进展(第 524–532 页)

[2] S. E. Fahlman,反向传播网络学习速度的实证研究 (1988),卡内基梅隆大学计算机科学系

[3] C. A. Brust,S. Sickert,M. Simon,E. Rodner 和 J. Denzler,既不快速也不适当——学习深度神经网络的 QuickProp 的评估 (2016),arXiv 预印本 arXiv:1606.04333

案例研究:使用支持向量机的乳腺癌分类

原文:https://towardsdatascience.com/case-study-breast-cancer-classification-svm-2b67d668bbb7?source=collection_archive---------18-----------------------

创建一个模型,根据肿瘤特征预测患者是否患有乳腺癌

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

彼得·波恰Unsplash 上拍摄

在本教程中,我们将创建一个模型,根据几个肿瘤特征来预测患者是否有阳性乳腺癌诊断。

问题陈述

乳腺癌数据库是来自 UCI 机器学习知识库的公开可用的数据集。它提供了肿瘤特征的信息,如肿瘤的大小、密度和质地。

**目标:**创建一个分类模型,根据几个特征预测癌症诊断是良性还是恶性。

使用的数据:Kaggle-乳腺癌预测数据集

第一步:探索数据集

首先,让我们了解我们的数据集:

**#import required libraries** import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns**#import models from scikit learn module:** from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.svm import SVC**#import Data**
df_cancer = pd.read_csv('Breast_cancer_data.csv')
df_cancer.head()**#get some information about our Data-Set** df_cancer.info()
df_cancer.describe()**#visualizing data** sns.pairplot(df_cancer, hue = 'diagnosis')plt.figure(figsize=(7,7))
sns.heatmap(df_cancer['mean_radius mean_texture mean_perimeter mean_area mean_smoothness diagnosis'.split()].corr(), annot=True)sns.scatterplot(x = 'mean_texture', y = 'mean_perimeter', hue = 'diagnosis', data = df_cancer)

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

乳腺癌数据

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

关于数据集的一些信息

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

Data.describe()

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

乳腺癌数据的特征对图

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

特征之间的相关性

**#visualizing features correlation** palette ={0 : 'orange', 1 : 'blue'}
edgecolor = 'grey'fig = plt.figure(figsize=(12,12))
plt.subplot(221)ax1 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_texture'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_texture')plt.subplot(222)
ax2 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_perimeter'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_perimeter')plt.subplot(223)
ax3 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_area'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_area')plt.subplot(224)
ax4 = sns.scatterplot(x = df_cancer['mean_radius'], y = df_cancer['mean_smoothness'], hue = "diagnosis",
data = df_cancer, palette =palette, edgecolor=edgecolor)
plt.title('mean_radius vs mean_smoothness')fig.suptitle('Features Correlation', fontsize = 20)
plt.savefig('2')
plt.show()

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

第二步:缺失/分类数据的处理

  • 在应用任何方法之前,我们需要检查是否有任何值丢失,如果有,就处理它们。在这个数据集中,没有丢失的值,但是始终保持检查数据集中的空值的习惯!
  • 由于机器学习模型基于数学方程,我们需要对分类变量进行编码。这里我使用了标签编码,因为我们在“诊断”列中有两个不同的值:
**#check how many values are missing (NaN)** here we do not have any missing values
df_cancer.isnull().sum()**#handling categorical data** df_cancer['diagnosis'].unique()df_cancer['diagnosis'] = df_cancer['diagnosis'].map({'benign':0,'malignant':1})df_cancer.head()

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

让我们继续攀升我们的数据集:

**#visualizing diagnosis column >>> 'benign':0,'malignant':1** sns.countplot(x='diagnosis',data = df_cancer)plt.title('number of Benign_0 vs Malignan_1')**# correlation between features** df_cancer.corr()['diagnosis'][:-1].sort_values().plot(kind ='bar')
plt.title('Corr. between features and target')

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

计数图—相关性

第三步:将数据集分割成训练集和测试集

数据分为Train组和Test组。我们使用Train集合让算法学习数据的行为,然后在Test集合上检查我们的模型的准确性。

  • 特性(X):插入到我们的模型中的列将用于进行预测。
  • 预测(y):特征预测的目标变量。
**#define X variables and our target(y)** X = df_cancer.drop(['diagnosis'],axis=1).values
y = df_cancer['diagnosis'].values**#split Train and Test** from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=101)

第四步:数据建模——支持向量机

支持向量机(SVM) 是最有用的监督 ML 算法之一。它可用于分类和回归任务。

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

来源:研究之门/图

我们首先需要理解几个概念:

  • SVM 的工作是什么?SVM 选择类之间分离最大的超平面。
  • **什么是硬边距和软边距?**如果数据可以线性分离,SVM 可能会返回最大的准确性(硬利润)。当数据不是线性可分的时候,我们需要做的就是放宽界限,允许错误分类 ( 软界限)。
  • **什么是超参数 C?**可以使用 C 参数控制误分类错误的数量,C 参数对超平面有直接影响。
  • 什么是超参数伽玛? Gamma 用于对接近支持向量的点进行加权。换句话说,改变 gamma 值会改变超平面的形状。
  • **什么是内核绝招?**如果我们的数据不是线性可分的,我们可以应用“核技巧”方法,将非线性数据映射到更高维空间。

现在让我们回到我们的代码!

**#Support Vector Classification model** from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train, y_train)

第五步:模型评估

from sklearn.metrics import classification_report, confusion_matrixy_predict = svc_model.predict(X_test)
cm = confusion_matrix(y_test, y_predict)
sns.heatmap(cm, annot=True)

confusion_matrix信息结果是什么意思?:

  • 在我们的测试集中有 143 名女性。
  • 在 55 名预测不会患乳腺癌的女性中,有两名被归类为没有患,而实际上她们已经患了(第一类错误)。
  • 在 88 名预测患有乳腺癌的女性中,14 名被归类为患有乳腺癌,而她们并没有(第二类错误)。

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

这个分类报告结果意味着什么?基本上,这意味着 SVM 模型能够以 89%的准确率将肿瘤分为恶性和良性。

注意:

  • 精度是相关结果的分数。
  • Recall 是所有相关结果中被正确分类的部分。
  • F1-得分是精确度和召回率之间的调和平均值,范围在 0(糟糕)到 1(完美)之间。

第六步:我们能做些什么来改进我们的模型?

1。数据标准化

特征缩放将帮助我们从相同的镜头(相同的比例)看到所有的变量,这样我们将把所有的值带入范围[0,1]:

**#normalized scaler - fit&transform on train, fit only on test** from sklearn.preprocessing import MinMaxScaler
n_scaler = MinMaxScaler()X_train_scaled = n_scaler.fit_transform(X_train.astype(np.float))
X_test_scaled = n_scaler.transform(X_test.astype(np.float))**#Support Vector Classification model -  apply on scaled data** from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train_scaled, y_train)from sklearn.metrics import classification_report, confusion_matrix
y_predict_scaled = svc_model.predict(X_test_scaled)
cm = confusion_matrix(y_test, y_predict_scaled)
sns.heatmap(cm, annot=True)print(classification_report(y_test, y_predict_scaled))

混淆矩阵信息结果是什么意思?:

  • 我们的测试中有 143 名女性
  • 在 55 名预测未患乳腺癌的妇女中,4 名妇女被归类为未患,而实际上她们患了(1 型错误)
  • 在 88 名预测患有乳腺癌的妇女中,7 名被归类为患有乳腺癌,而她们并没有(2 型错误)

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

SVC 模型的结果-缩放数据集

W **这个分类报告结果是什么意思?**基本上,这意味着 SVM 模型能够以 92%的准确率将肿瘤分为恶性/良性。

2。SVM 参数优化

C 参数 —如我们所说,它控制着Train数据上错误分类的成本。

  • 较小的 C: 较低的方差但较高的偏差(软裕度)并降低误分类的成本(较少的惩罚)。
  • 更大的 C: 更低的偏倚和更高的方差(硬边际)以及增加误分类的成本(更严格)。

**Gamma:
Gamma 越小:**方差越大,到达距离越远,解越一般化。
更大的 Gamma: 高方差低偏倚,接近到达,也更接近的数据点具有更高的权重。

因此,让我们使用网格搜索找到模型的最佳参数:

**#find best hyper parameters** from sklearn.model_selection import GridSearchCVparam_grid = {'C':[0.1,1,10,100,1000],'gamma':[1,0.1,0.01,0.001,0.001], 'kernel':['rbf']}grid = GridSearchCV(SVC(),param_grid,verbose = 4)
grid.fit(X_train_scaled,y_train)grid.best_params_
grid.best_estimator_grid_predictions = grid.predict(X_test_scaled)
cmG = confusion_matrix(y_test,grid_predictions)
sns.heatmap(cmG, annot=True)print(classification_report(y_test,grid_predictions))

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

使用 SVC 模型的结果(缩放数据+最佳参数)

如您所见,在这种情况下,最后一次模型改进并没有产生正确的百分比。然而,我们成功地减少了第二类错误。

我希望这有助于你更好地理解这个话题。欢迎任何反馈,因为它让我获得新的见解,并纠正任何错误!

自动取款机现金需求预测

原文:https://towardsdatascience.com/cash-demand-forecasting-for-atms-6113dd45fb2d?source=collection_archive---------29-----------------------

我努力为任何一款 lvl 的 DS 提供端到端的解决方案

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

Nikita Lazarionok 的图片

介绍

在这个主题中,我想向您展示一个端到端的解决方案。两周前在明斯克有一场由白俄罗斯银行代表领导的黑客马拉松。总共有 3 个任务,其中一个必须解决。对我来说,自动取款机上的现金需求任务是最有趣的,我想分享一下我的解决方案。

工作

需要预测各种自动取款机的每日现金需求量。数据是匿名的,特定 ATM 的操作时间以小时为单位,位置靠近主要城市设施(地铁、大型购物中心、企业检查站等)。)以及它属于哪个类似的无名城市。还会有用户贡献的金额报告。应该注意的是,如果在足够长的一段时间内没有对给定自动柜员机的需求(目标变量为零),那么,可能当时它由于这样或那样的原因而不工作。SMAPE 将被用作度量标准。

目标

此任务的目标是预测在要求的日期需要存入自动柜员机的现金金额。

计划

解决这样一个问题的计划很简单:

  • 熊猫的 EDA 分析
  • 数据编码
  • RF (sklearn)模型和 XGBoost 模型
  • 自定义搜索参数
  • 创建最终模型

导入,设置

import numpy as np
import pandas as pd
import pickle
import warnings
import xgboost as xgbfrom sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import LabelEncoderpd.set_option('max_columns', 105)
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=DeprecationWarning)

了解数据

总共提供了 3 个数据集:每个自动柜员机的参考书、交易活动以及带有目标的数据集。但是,既然这种竞争的条件之一是对未来时期的预测,那么,相应地,我们将无法考虑并从交易活动中获得必要的信息。这会导致我们接受再培训,这并不好。因此,考虑剩下的 2 个数据集。

首先是一本参考书。

active_atms_lookup = pd.read_csv('active_atms_lookup.csv', delimiter=',')
active_atms_lookup.head()

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

Nikita Lazarionok 的图片

我们看到的:只有 4 列,如自动柜员机的 ID、类别、工作小时数和所在城市。

让我们检查一下是否有空值。

active_atms_lookup.isna().sum()

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

Nikita Lazarionok 的图片

原来我们只有 6 台 ATM 的信息,但是我们不知道它们。让我们移除它们。

active_atms_lookup = active_atms_lookup[~active_atms_lookup['TID_anon'].isna()]

让我们试着从这个指南中分离出尽可能多的信息,以便它能帮助我们在将来改进我们的结果。在这种情况下,我们可以将小时数带入值[0;1],我们立即通过 LabelEncoder 和 Pandas 编码器对分类特征进行编码。

active_atms_lookup['working_hours'] = active_atms_lookup['working_hours'] / 24active_atms_lookup["atm_category"] = active_atms_lookup["atm_category"].astype('category')
active_atms_lookup["city_anon"] = active_atms_lookup["city_anon"].astype('category')active_atms_lookup["atm_category"] = active_atms_lookup["atm_category"].cat.codes
active_atms_lookup["city_anon"] = active_atms_lookup["city_anon"].cat.codeslb = LabelEncoder()
active_atms_lookup['DEVICEID_anon_code'] = lb.fit_transform(active_atms_lookup['DEVICEID_anon'])filename = 'atm_encoder.sav'

关键时刻-考虑一个带有目标变量的数据集。

train_target = pd.read_csv('train_target.csv', delimiter=';')
train_target.head()

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

Nikita Lazarionok 的图片

让我们将每个自动柜员机的值分组,看看是否有负值或零值。

train_target.groupby('DEVICEID_anon')['target'].sum().reset_index().sort_values('target')

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

Nikita Lazarionok 的图片

原来有这样的自动取款机。让我们移除它,在未来,为了形成预测,我们将移除它。

train_target = train_target[train_target['DEVICEID_anon'] != 'ATM_615']

现在,让我们结合我们的数据集,并做一些进一步的转换。

train_target = train_target.merge(active_atms_lookup, on=['DEVICEID_anon'])
train_target.head()

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

Nikita Lazarionok 的图片

我们有个约会。我不想用这种形式寄它。让我们从中提取所有信息:日、月、年等。让我们进行一些额外的转换,例如选择十年、一个周末或一个工作日。

train_target['POSTINGDATETIME'] = pd.to_datetime(train_target['POSTINGDATETIME'])train_target['HOUR'] = train_target['POSTINGDATETIME'].dt.hour
train_target['DAYOFWEEK'] = train_target['POSTINGDATETIME'].dt.dayofweek
train_target['QUARTER'] = train_target['POSTINGDATETIME'].dt.quarter
train_target['MONTH'] = train_target['POSTINGDATETIME'].dt.month
train_target['YEAR'] = train_target['POSTINGDATETIME'].dt.year
train_target['DAYOFYEAR'] = train_target['POSTINGDATETIME'].dt.dayofyear
train_target['DAYOFMONTH'] = train_target['POSTINGDATETIME'].dt.day
train_target['NAME_WEEKOFYEAR'] = train_target['POSTINGDATETIME'].dt.day_name()
train_target['WEEKOFYEAR'] = train_target['POSTINGDATETIME'].dt.weekofyeartrain_target['WORKDAY'] = train_target['NAME_WEEKOFYEAR'].apply(lambda x: 0 if x == 'Saturday' or x == 'Sunday' else 1)train_target.reset_index(inplace = True)
train_target.drop(['index'] , axis = 1, inplace = True)train_target['POSTINGDATETIME'] = train_target['POSTINGDATETIME'].dt.strftime('%Y-%m-%d')train_target = train_target.drop(['NAME_WEEKOFYEAR'], axis = 1)train_target = train_target.replace([np.inf, -np.inf], np.nan)

我们应该受到祝贺。我们会对这些数据做任何我们想做的事情。

建模和评估

让我们从度量开始。在这项任务中,使用了 STAPE 度量。一方面,使用这个指标,你可以很容易地向企业解释这个或那个机器学习模型是如何表现的,这很好。另一方面,在我们有一个目标变量= 0 的情况下,它会导致问题,因为我们以这样一种方式调整我们的算法,它猜测 0 而不是零值。

SMAPE 的公式是:

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

Nikita Lazarionok 的图片

这个公式的代码是:

def smape(actual, predicted):
    return 100/len(actual) * np.sum(2 * np.abs(predicted - actual) / (np.abs(actual) + np.abs(predicted)))

对于这个任务,我只选择了两个模型进行评估:梯度推进和决策树。为什么是他们?因为我测试了很多不同的,这 2 个显示了最好的结果。

但是我们也不会用我们的数据进行测试。为了不满足过度拟合的事实,我们将使用时间序列交叉验证。

先说梯度提升。

data_for_modeling = train_target
data_for_modeling['POSTINGDATETIME'] = pd.to_datetime(data_for_modeling['POSTINGDATETIME'])
tscv = TimeBasedCV(train_period=360,
                   test_period=60,
                   freq='days')
for train_index, test_index in tscv.split(data_for_modeling,
                                          date_column='POSTINGDATETIME'):
    print(train_index, test_index)# get number of splits
tscv.get_n_splits()#### Example- compute average test sets score: ####
X = data_for_modeling[columns]
y = data_for_modeling['target']
from sklearn.linear_model import LinearRegression
import numpy as npscores = []
for train_index, test_index in tscv.split(X):data_train   = X.loc[train_index].drop('POSTINGDATETIME', axis=1)
    target_train = y.loc[train_index]data_test    = X.loc[test_index].drop('POSTINGDATETIME', axis=1)
    target_test  = y.loc[test_index]

    dtrain = xgb.DMatrix(data_train, label=target_train)
    dvalid = xgb.DMatrix(data_test)# if needed, do preprocessing here
    watchlist = [(dtrain, 'train')]

    model = xgb.train(xgb_pars, dtrain, 500, watchlist, early_stopping_rounds=500,
                  maximize=False, verbose_eval=15)

    preds = model.predict(dvalid)

    # accuracy for the current fold only    
    r2score = smape(target_test, preds)
    print('SMAPE is ' + str(r2score))scores.append(r2score)# this is the average accuracy over all folds
average_r2score = np.mean(scores)

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

Nikita Lazarionok 的图片

老实说,我期待更好的结果。而当它们在不同的时间间隔分歧这么大的时候,那我们以后就不用了。然后我们将重点放在决策树上。

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

Nikita Lazarionok 的图片

这样好多了:)
但是我不认为这是建模的极限。因此,我们来调一下模型。

调谐

众所周知的调优方法,如 hoperopt 和 gridsearch,对于这样一个模型似乎并不十分重要。因此,我们将自己的调音称为“一步一步”。有什么意义?我们接受 n 个参数并开始迭代它们。一旦我们找到最好的,就采用+1 或+2 参数,以同样的方式进行。以此类推直到结束,直到参数用完。
这样调音的一个例子:

def random_forest(n_estimators, max_depth):
    result = []
    for estimator in n_estimators:
        for depth in max_depth:
            wmaes_cv = []
            for i in range(1,5):
                print('k:', i, ', n_estimators:', estimator, ', max_depth:', depth)
                x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, test_size=0.3)
                RF = RandomForestRegressor(n_estimators=estimator, max_depth=depth)
                RF.fit(x_train, y_train)
                predicted = RF.predict(x_test)
                wmaes_cv.append(smape(y_test, predicted))
            print('SMAPE:', np.mean(wmaes_cv))
            result.append({'Max_Depth': depth, 'Estimators': estimator, 'SMAPE': np.mean(wmaes_cv)})
    return pd.DataFrame(result)n_estimators = [56, 58, 60]
max_depth = [25, 27, 30]random_forest(n_estimators, max_depth)

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

Nikita Lazarionok 的图片

找到最佳参数后,我们可以保存模型并使用它。

import picklefilename = 'model_reg.pkl'
pickle.dump(RF, open(filename, "wb"))

结论

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

Nikita Lazarionok 的图片

在独立的数据集上,这样的模型显示了相当好的结果。落后于对手的差距往往只有几分之一。

需求会受到许多其他因素的影响,这些因素可以从互联网上收集:假期、各种经济形势、政治、天气等。如果我们学会考虑到这一点,我们可以保证结果有时会有所改善。

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

Nikita Lazarionok 的图片

我希望这篇文章对一个初学数据的科学家来说非常有用,并且有所帮助。
如果你喜欢这篇文章,请点赞:)

强化学习入门

原文:https://towardsdatascience.com/casual-intro-to-reinforcement-learning-4a78b57d4686?source=collection_archive---------49-----------------------

AWS DeepRacer 系列

对强化学习的直观解释

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

Unsplash 上由 Picsea 拍摄的照片

首先,我要感谢 Jakarta 机器学习和 AWS 让我有机会加入 AWS DeepRacer 新兵训练营。我一定会通过我的文章分享我在这次训练营的学习经历。所以,请继续关注并了解更多关于我的新兵训练营经历!

在这次训练营中,我和其他 8 名参与者将为 AWS DeepRacer 联赛做准备。对于那些不知道的人来说,AWS DeepRacer 基本上是一辆自主规模的赛车,AWS DeepRacer League 是第一个全球自主赛车联盟。

为了自主比赛,AWS DeepRacer 需要学习如何自己驾驶,就像职业赛车手驾驶自己的汽车一样。这种学习机制也类似于学步儿童学习如何走路。和前面的例子类似,AWS DeepRacer 也应用了这种学习的方法,称为强化学习

什么是强化学习?

此时,你可能会疑惑强化学习是什么意思。简单来说,强化学习就是通过与环境互动来学习。它是主动的和顺序的,这意味着未来取决于早期的互动。除此之外,它指向一个目标,并且系统可以在没有最佳行为示例的情况下进行学习()。

对于自动驾驶汽车,你可能会问以下问题。

为什么我们不能给汽车编程,让它准确地知道在哪里左转和右转?

,学习有两个原因。首先,我们想找到以前未知的解。比如能打败人类象棋大师的程序。其次,我们想为无法预见的*情况找到解决方案。例如,一辆自动驾驶汽车可以在不同于任何已知轨道的轨道上行驶。*

换句话说,强化学习是从与环境的相互作用中学习做出决策的科学。这个概念被应用于许多领域,从计算机科学到经济学。

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

作者图片

几个特征使得强化学习不同于其他类型的学习。第一,没有没有监督,只给出奖励信号。它只是告诉你它有多喜欢一个决定,但并没有告诉你你必须做什么。另一个特点是反馈可以延迟,而不是瞬间获得。序列也很重要,因为之前的决定会影响之后的互动。

为了更好地理解强化学习,我们需要看一个决策问题的例子。一个例子是管理一个投资组合,其中你根据回报 ( 利润)做出决定。这个奖励可能是短期的,也可能是长期的,也就是说奖励是延迟的。此外,买卖顺序也会影响你的投资组合。它表明这是一个强化学习问题的例子。

强化学习的特征是奖励信号、延迟反馈和顺序。

核心概念

在理解强化学习时,有几个方面是我们必须知道的。他们是*****奖励信号***和 ***代理人。*代理还包括 代理状态 策略 值函数

代理环境之间的交互可以描述如下。在每个时间步,代理接收观察奖励,同时执行一个动作。另一方面,环境接收一个动作然后发出观察奖励。**

奖励是一个反馈信号,表明代理在每个时间步做得有多好。代理人的工作是最大化从现在到未来的累计奖励。累计奖励也称为回报回报回报。这向我们展示了强化学习是基于奖励假设的。**

任何目标都可以被认为是回报最大化的结果。

现在,我要你考虑一下。你接受还是拒绝这个假设?

基于回报,我们还对感兴趣,它是从现在开始的预期回报。“预期”一词意味着我们考虑到了未来回报发生的可能性。因此,代理的目标变为通过选择最佳行动最大化** 。**

然而,行动可能会产生长期后果,奖励可能不会立即收到。在某些情况下,牺牲眼前的回报从长远来看可能是有益的。例如,一项金融投资可能需要几年时间,直到它变得非常有利可图,尽管它在开始时可能会有一些损失。

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

吉利Unsplash 上拍照

代理组件

一个代理的三个基本组成部分:代理状态、策略、价值函数

动作取决于代理的状态。一个状态可以被定义为用于确定接下来发生什么的信息。在最简单的情况下,只有一个状态。然而,根据具体情况,可能有许多不同的状态。例如,当我们想要购买食物时,我们会无意识地访问我们身体的状态,例如饥饿程度和食物偏好。****

状态动作的映射称为 策略策略根据代理的当前状态定义代理的行为。以我自己为例,每次下雨我都会想要一杯热巧克力。相反,我会在大热天喝一杯冰柠檬茶。换句话说,我的行为是由我的政策决定的,它将天气状况状态转化为我的饮料选择动作

状态政策决定代理人的行为,而 价值函数 计算预期回报或对未来回报的预测。它用于评估状态的可取性,以及哪些操作最有益。有时,使用折扣系数是很有用的,它权衡了即时回报和长期回报的重要性。低折扣系数意味着你只关心眼前的回报,反之亦然。**

虽然强化学习解决了很多决策问题,但是有一个问题叫做 剥削和探索剥削是指代理人利用已知的信息来最大化报酬。另一方面,探索正在寻找新的信息,希望获得更多的回报。

比如,在决定你想吃什么的时候,你可以认为奖励就是你的进食满意度。为了充分利用它,你可以选择吃你最喜欢的食物。或者,你可以尝试新的菜肴,寻找味道更好的东西。

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

照片由雷切尔·帕克Unsplash 拍摄

结论

简而言之,强化学习是指通过试错来学习,在此期间,代理人应该通过与环境的交互来发现一个使回报最大化的好政策。

参考

如果你想了解更多关于强化学习的知识,我建议你像我一样查阅这些资料。

  1. Hado van Hasselt 关于强化学习的讲座——课程 1:强化学习简介。
  2. 《强化学习:导论》( 2015 ),作者理查德·萨顿和安德鲁·巴尔托。

结束语

感谢您花时间阅读这篇文章!希望你能学到新的东西,能把这个理念融入到你的生活中。请务必关注我即将发表的关于强化学习和 AWS DeepRacer 细节的文章。我希望你有美好的一天!

关于作者

Alif Ilham Madani 是一名有抱负的数据科学和机器学习爱好者,他热衷于从他人那里获得洞察力。他在印尼顶尖大学Institut Teknologi Bandung主修电子工程。

如果你有任何要讨论的话题,你可以通过 LinkedInTwitter 与 Alif 联系。

数据团队的编目工具

原文:https://towardsdatascience.com/cataloging-tools-for-data-teams-8d62d7a4cd95?source=collection_archive---------16-----------------------

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

Unsplash 上由伊尼基·德尔·奥尔莫拍摄的照片

数据科学

介绍数据编目和数据团队可用于数据发现的主要工具

这篇文章最后一次更新是在 2021 年 10 月 12 日。

随着过去十年中各种数据存储和检索系统的激增,数据团队不得不处理许多数据源——所有数据源都用于特定的用例。这催生了 ETL 解决方案,它集成了高度异构的数据源、灵活、高度可伸缩的数据仓库和数据湖。由于有如此多的来源,将数据复制、转换和集成到几个目标中,数据系统变得相当复杂。也就是说,有像 Airflow 这样的工具来管理工作流编排,有工具来监控作业,等等。

数据发现对于数据科学家、数据分析师和业务团队来说至关重要

如果你认为将所有的数据整合到一个真实的来源,甚至多个来源就能完成任务,那么真相就离它不远了。根据一份报告,数据科学家至少有 50%的时间 寻找、清理和准备数据。数据科学家、数据分析师和业务团队经常发现很难找出数据的含义和来源,这两个问题在数据团队中都很常见。前者可以通过实现数据目录或数据字典来解决,后者可以通过实现数据沿袭解决方案来处理。

数据沿袭和数据编目都属于元数据管理的范畴。在本文中,我们将讨论市场上最流行、最有效的数据编目工具。我们将探索开源项目、专有软件和基于云的解决方案,这些解决方案总体上解决了数据发现、编目、沿袭和元数据管理的问题。

如今,数据系统高度异构,它们是多云、多源甚至多目标的。

开源数据目录

竞争者不多,但是活跃的竞争者做得很好,例如由一个政府组织发起并被许多人采用的 Magda T1。通过 Postgres 中的后端存储和 Elasticsearch 的搜索功能,Magda 提供了一个类似搜索引擎的界面来搜索您的数据。你可以在这里看到真实数据集的现场演示

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

magda——开源数据目录

在 Magda 出现之前, CKAN 是主要的开源数据目录。事实上,玛格达也在引擎盖下使用 CKAN 的部分。加拿大政府和美国政府使用 CKAN 作为他们的元数据管理系统之一。

大约一年半以前,Amundsen 是这个领域的另一个有力竞争者。它已经被很多像 Workday 和 Asana 这样的大公司采用。与 Magda 不同,Amundsen 使用 neo4j 作为后端数据库来存储元数据,但使用 Elasticsearch 进行搜索。你可以在这里和冯涛的这篇博文中了解到阿蒙森的建筑。

[## 开源 Amundsen:一个数据发现和元数据平台

由冯涛,张金赫,塔米卡坦尼斯,丹尼尔获得

eng.lyft.com](https://eng.lyft.com/open-sourcing-amundsen-a-data-discovery-and-metadata-platform-2282bb436234)

谈谈 Lyft 在 DataCouncil 的 Amundsen。

还有许多其他开源工具,如 LinkedIn 的 DataHub、Airbnb 的 Dataportal 、网飞的 Metacat 、WeWork 的 Marquez 。您可以在本文中找到关于这些工具的好资源。

荣誉提名 — Spotify 尚未开源 Lexikon,但这里有一篇有趣的文章讲述了它如何为他们的数据科学家解决数据发现问题。

特定于云平台的数据目录

所有主要的云平台现在都有大量的服务可以提供。对于基于云的编排服务、数据管道和 ETL 解决方案,需要实现一个基本的数据编目组件。像 AWS Glue CatalogGoogle Cloud Data Catalog 这样的大多数解决方案都使用了下面的 Hive Metastore 。微软在 Azure 数据目录中有自己的目录实现。

[## 数据目录:数据发现|谷歌云

发送反馈 Google Cloud Next '20: OnAir |了解数据目录中的新内容,聆听贝莱德的观点,现已在以下网站发布…

cloud.google.com](https://cloud.google.com/data-catalog)

不用说,这些工具在各自的云平台上与它们各自耦合的 web 服务配合得非常好,但是它们都具有有限的特性。它们不是为了元数据管理,而是为了确保它们有足够的数据来支持 ETL 操作、编排管道等等。可以把它们想象成您的数据库或数据仓库系统目录视图&带有一些附加信息的表。大概就是这样。

专有软件

考虑到商业性,许多公司已经为元数据管理构建了出色的成熟产品。 AtlanAtaccamaAlation 是这个市场的一些主要参与者。市场上也有许多传统的参与者 Informatica 是其中最受欢迎的,以至于它在 2019 年的 Gartner 元数据管理解决方案魔力象限中被评为该行业的领导者。

根据客户的说法,专有软件在为企业使用做好准备、强大的技术支持以及产品增强方面领先于开源软件。他们通常有一个非常吸引人的用户界面和一个没有 bug 的代码库。所有这些显然都是随着钱而来的😄

结论

最后,值得重申的是,元数据管理是数据工程领域中较少被关注的问题之一——使用适当的工具进行元数据管理和数据发现可以使数据科学家、数据分析师和公司的业务用户的生活更加轻松,工作效率更高。确保您选择了适合您需求的正确产品!

CatBoost

原文:https://towardsdatascience.com/catboost-d1f1366aca34?source=collection_archive---------25-----------------------

梯度助推器

人迹罕至

当 XGBoost 和 LightGBM 在 Kaggle 竞赛中独领风骚时,另一个竞争者在 Yandex 诞生了,即来自俄罗斯的 Google。它决定采用较少读取的路径,并采用不同的方法进行梯度提升。在他们看来,他们试图解决世界上所有其他 GBM 中的一个关键问题。

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

来源: Unsplash

让我们来看看它的不同之处:

分类编码

让我们来看看赋予该算法名称的创新——CatBoost。与 XGBoost 不同,CatBoost 以本机方式处理分类变量。许多研究表明,一次性编码高基数分类特征并不是最好的方法,尤其是在基于树的算法中。和其他流行的选择都在目标统计的保护伞下——目标均值编码、留一编码等。

目标统计的基本思想很简单。我们用具有相同分类值的训练样本的所有目标的平均值来替换分类值。例如,我们有一个称为天气的分类值,它有四个值—晴天、雨天、多云和下雪。最简单的方法是所谓的贪婪目标统计,我们用天气“晴朗”的所有训练样本的目标值的平均值来代替“晴朗”。

如果 m 是我们正在编码的分类特征,mᵢ是 m 中的特定值,并且 n 是 M = mᵢ的训练样本的数量

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

但是当具有 mᵢ的样本数量太低或为零时,这是不稳定的。因此,我们使用朴素贝叶斯分类器中使用的拉普拉斯平滑来使统计更加稳健。

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

其中a0 为参数。 p (之前)的常见设置是数据集中的平均目标值。

但是这些方法通常会遇到所谓的目标泄漏,因为我们使用目标来计算分类变量的表示,然后使用这些特征来预测目标。留一编码试图通过排除计算表示的样本来减少这种情况,但并不是万无一失的。

CatBoost 作者在这里提出了另一个想法,他们称之为有序目标统计。这是受在线学习算法的启发,该算法按时间顺序获取训练样本。而在这种情况下,目标统计将只依赖于过去的训练实例。为了使这种想法适应标准的离线训练范式,他们想象了一个人工时间的概念,但随机排列数据集,并认为它们在本质上是连续的。

然后,他们仅使用在人工时间中特定样本之前出现的样本来计算目标统计数据。值得注意的是,如果我们只使用一种排列作为人工时间,它将不会非常稳定,为此,他们用多种排列进行编码。

有序升压

如论文作者所述,CatBoost 算法的主要动机是传统梯度增强模型中固有的目标泄漏,他们称之为预测偏移。高层的想法很简单。正如我们所知,任何梯度推进模型都是通过以加法方式在基础学习者上构建基础学习者来迭代工作的。但由于每个基础学习器都是基于相同的数据集构建的,作者认为存在一点目标泄漏,这会影响模型的泛化能力。根据经验,我们知道梯度增强的树有过度拟合数据的压倒性趋势。针对这种泄漏的唯一对策是像二次采样这样的功能,他们认为这是一种启发式的处理问题的方法,只能缓解而不能完全消除它。

作者形式化了提出的目标泄漏,并从数学上证明了它的存在。他们的另一个有趣的观察结果是,目标位移或偏差与数据集的大小成反比,即如果数据集很小,目标泄漏会更加明显。这个观察结果也与我们的经验观察结果一致,即梯度增强的树倾向于过度适应小数据集。

为了解决这个问题,他们提出了一种新的梯度增强方法,称为有序增强。这个想法的核心是非常直观的。以前梯度增强的主要问题是每次迭代都要重复使用相同的数据集。因此,如果每次迭代都有不同的数据集,我们就解决了泄漏问题。但是,由于没有一个数据集是无限的,这种想法,纯粹应用,将是不可行的。因此,作者提出了上述概念的实际实现。

它从创建数据集的 s+1 排列开始。这种排列是算法考虑的人工时间。姑且称之为σ₀到σₛ.σ₁到σₛ的排列用于构造树分裂,σ₀用于选择叶值 bⱼ.在没有多重排列的情况下,具有短“历史”的训练样本将具有高方差,因此具有多重排列缓解了该缺陷。

我们之前看到了 CatBoost 处理分类变量的方式,我们提到过在那里我们使用多种排列来计算目标统计数据。这被实现为 boosting 算法的一部分,该算法在任何迭代中使用从σ₁到σₛ的特定排列。使用采样排列计算树分裂所需的梯度统计和分类编码所需的目标统计。

一旦所有的树都建立起来了,最终模型 f 的叶值就可以通过标准的梯度推进过程(我们在以前的文章中看到过)使用置换σ₀.来计算当最终模型 F 被应用于来自测试集的新样本时,目标统计量是在整个训练数据上计算的。

需要注意的一点是,CatBoost 还支持传统的梯度增强,除了有序增强(Boosting _ type= ‘Plain或’ Ordered ‘)。如果是’ Plain ',并且有分类特征,则仍然为目标统计创建排列,但是树构建和提升在没有排列的情况下完成。

被遗忘的树

CatBoost 在另一个关键方面也不同于其他鸟群——在它的整体中构建的树的种类。默认情况下,CatBoost 构建对称树或不经意树。这些是树,相同的特征负责将学习实例分成树的每一层的左和右分区。

这在算法中有双重影响-

  1. 正则化:由于我们将树构建过程限制为每层只有一个特征分裂,我们实质上降低了算法的复杂性,从而实现了正则化。
  2. 计算性能:任何基于树的算法中最耗时的部分之一是在每个节点搜索最优分割。但是,因为我们将每个级别的特征分割限制为一个,所以我们只需搜索单个特征分割,而不是 k 个分割,其中 k 是该级别中的节点数。即使在推断过程中,这些树也能让它快如闪电。据推断,它比 XGBoost 快 8 倍。

虽然默认选项是“ SymmetricTree ”,但是也可以使用参数“ grow_policy ”切换到“depth wise”(XGBoost)或“loss guide”(light GBM),

分类特征组合

CatBoost 的另一个重要细节是,它在树构建过程中隐式地考虑分类变量的组合。这有助于它考虑多个分类特征的联合信息。但是由于可能的组合总数会迅速增加,所以在树构建过程中采用了贪婪的方法。对于当前树中的每个分割,CatBoost 将叶中所有以前使用的分类特征与所有其余的分类特征连接起来作为组合,并动态计算目标统计数据。

过拟合检测器

CatBoost 中另一个有趣的特性是内置的过拟合检测器。如果 CatBoost 检测到过度拟合,它可以在我们设置的迭代次数之前停止训练。CatBoost 中实现了两个过拟合检测器:

  1. Iter
  2. IncToDec

Iter 相当于提前停止,算法在停止迭代之前等待 n 次迭代,因为验证损失值有所改善

IncToDec 稍微涉及一点。它通过跟踪一次又一次迭代的度量迭代的改进来采取稍微复杂的路线,并且还使用类似于指数平滑的方法来平滑进展,并且设置阈值以在平滑值低于阈值时停止训练。

缺少值

跟随 XGBoost 的脚步,CatBoost 也单独处理缺失值。CatBoost 中有两种处理缺失值的方法——最小值和最大值。

如果选择“最小值”,缺失值将作为该特征的最小值进行处理。如果您选择“最大”,缺失值将作为该特性的最大值进行处理。在这两种情况下,可以保证在每一次树拆分中都考虑缺失值和其他值之间的拆分。

超参数

如果说 LightGBM 有很多超参数,CatBoost 甚至更多。有这么多超参数需要优化,GridSearch 不再可行。对于任何给定的问题,获得正确的参数组合变得更像是一门艺术。但我还是会尝试总结一些你必须牢记的关键参数。

  • one_hot_max_size :设置分类特征中唯一值的最大数量,低于该数量时,将进行一次性编码,不使用目标统计数据。建议您在输入特性集之前不要进行一次性编码,因为这会损害算法的准确性和性能。
  • 迭代次数 —要在集合中构建的树的数量。这必须用 cv 来调整,或者应该采用一种过拟合检测方法来使迭代停止在理想迭代处。
  • od_type、od_pval、od_wait —这三个参数配置过拟合检测器。
  • od_type 是过拟合检测器的类型。
  • od_pval 为 IncToDec 的阈值(推荐范围:[10e-10,10e-2])。该值越大,越早检测到过度拟合。
  • od_wait 根据 od_type 有不同的含义。如果是 IncToDec ,则 od_wait 是过拟合检测器开始工作之前必须运行的迭代次数。如果是 Iter ,则 od_wait 是在停止训练之前,在度量没有改善的情况下,它将等待的迭代次数。
  • learning_rate —通常的意思。但是 CatBoost 会根据数据集属性和设置的迭代次数自动设置学习率。
  • 深度 —这是树的深度。最佳值范围从 4 到 10。如果 boosting_typeLossguide 则默认值为 6 和 16
  • l2 _ leaf _ reg 这是沿着叶子的正则化。任何正值都允许作为值。增加该值可以增加正则化效果。
  • has_time —我们已经看到,完成有序升压需要一段人工时间。但是如果你的数据实际上有一个时间顺序呢?在这种情况下,设置 has_time = True 以避免在有序提升中使用排列,而是使用数据被提供的顺序作为唯一的排列。
  • grow_policy —如前所述,CatBoost 默认构建“ SymmetricTree ”。但有时“ Depthwise ”和“Lossguide”可能会给出更好的结果。
  • min_data_in_leaf 是控制每个叶中训练样本的最小数量的常用参数。这只能在深度方向的损耗导轨中使用。
  • max_leaves 是任何给定树的最大叶子数。这只能在损耗导轨中使用。这里不建议使用大于 64 的值,因为这会显著降低训练过程的速度。
  • rsm 或 col sample _ by level-在每个分割选择中使用的特征百分比。这有助于我们控制过度拟合,值的范围为(0,1)。
  • nan_mode —可以将值“禁止”、“最小”、“最大”作为三个选项。“禁止”不允许缺少值,并将引发错误。最小值和最大值我们前面已经讨论过了。

中的其他文章 中的梯度助推器

参考

  1. 贪婪函数近似:一种梯度推进机器。安。统计学家。29 (2001 年),第 5 号,1189-1232。
  2. 普罗霍伦科娃、柳德米拉、古塞夫、格莱布等人(2018 年)。 CatBoost:具有分类特征的无偏增强。神经信息处理系统的进展
  3. CatBoost 参数。https://catboost . ai/docs/concepts/python-reference _ parameters-list . html

原载于 2020 年 2 月 29 日 http://deep-and-shallow.com

你能用信用卡付款吗?

原文:https://towardsdatascience.com/catch-me-if-you-can-predicting-credit-card-default-using-classification-analysis-28b2955f7f7d?source=collection_archive---------41-----------------------

使用分类分析发现客户拖欠付款的迹象。

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

图片由 ideyweb 通过 Shutterstock.com 提供

由于新冠肺炎,许多人失去了工作,导致人们捆扎现金和拖欠信用卡付款。情况变得如此糟糕,以至于摩根大通和花旗集团等信用卡公司不得不留出额外准备金,以弥补信用卡违约带来的损失。现在,这是一个非常极端的情况,这种情况并不经常发生(我真的希望不会)。人们无力支付信用卡账单可能是由于不同的情况。然而,当它是故意的,意味着客户没有偿还银行的计划,这将被认为是一种欺诈。不管怎样,这给信用卡公司带来了巨大的风险,我们需要找到一种方法来标记它们。

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

Slidesgo 的演示模板| Freepik 的信息图表

为了解决这个问题,我们可以根据某些属性来预测潜在的默认帐户。这个想法是,越早发现潜在的违约账户,我们承受的损失就越低。另一方面,我们可以主动向客户提供提示,以防止违约。这不仅保护了我们的客户,也将我们的风险和潜在损失降至最低。

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

Slidesgo 的演示模板| Freepik 的信息图表

目标

预测客户下个月是否会拖欠信用卡付款。

方法

下图是我如何着手构建和最终确定分类模型的高级概述。

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

幻灯片演示模板 go

为召回而优化

在这种情况下,我们将专注于拥有最高的回忆分数,同时不要过于牺牲精确性。高误报率意味着我们可能会错误地对下个月拖欠信用卡的人进行分类,并因为关闭他们的账户而失去客户。高假阴性意味着我们错误地将不会违约的账户分类,最终我们可能需要动用储备金来弥补损失。如前所述,信用卡违约可能被视为欺诈,因此我们正确地对所有违约案例进行分类以最大限度地降低风险和损失非常重要。

数据收集

加州大学欧文分校机器学习库获得的数据集包含台湾信用卡客户的信息。它包括 30,000 个观察值和 24 个特征。

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

幻灯片演示模板 go

特色

  • **信用信息:**信用额度
  • **人口统计:**性别、最高教育程度、年龄和婚姻状况
  • **还款历史(2005 年 4 月~ 9 月)😗*每月还款状态、还款金额、账单金额

目标

信用卡客户下个月会不会违约

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

幻灯片演示模板 go

数据探索

阶级不平衡

有一个类不平衡的问题,因此我们稍后将使用一些过采样技术来解决这个问题。

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

目标分布要求 22%为违约,78%为无违约。

阶级分布

在任何人口统计数据上,违约和非违约的分布都没有非常明显的区别。

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

人口统计变量的标准化分布条形图

然而,你可以看到每月还款状态的目标类别的分布差异。

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

2005 年 4-9 月客户还款状况归一化分布柱状图*(还款状况衡量尺度:-2:余额已全部支付且无交易;-1:全额支付的余额和由于最近交易的正余额;0:已付最低金额;1 =延迟一个月付款;2 =付款延迟两个月;。。。;9 =付款延期九个月)*

检查数据类型和空值

检查完特性后,我们看到没有空值,所有变量都是整数。

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

检查空值和数据类型的所有特性。

执行特征工程

请注意,我已经在 EDA、特征工程和建模之间走来走去,因此下面创建了转换的特征。

  • **信用额度使用:**从 0 到 1,这是从 2005 年 4 月到 9 月使用的信用的总百分比。
  • **世代:**用age计算此人属于哪一代,即“X 世代”、“千禧一代”等。
  • **延期付款的总月数:**6 个月(2005 年 4 月~ 9 月)中,延期付款的月数。
  • **付款延迟:**这是一个 1/0 标志,表示是否有付款延迟。
  • 虚拟变量为T1。

多重共线性

为了避免高维数的灾难,如果更少的要素(更简单的模型)产生相同(或更好)的结果,我们通常应该避免多重共线性。我们看到education_Universityeducation_Graduate School相互关联,这是意料之中的,因为这些变量对于教育来说是虚拟变量(互斥的)。其余的变量似乎并不相互关联。

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

数据建模

  1. **将数据分为 80%的训练集和 20%的保留集。**只在 80%的训练集上训练数据,在所有特征和超参数最终确定之前,不接触保留集。
  2. 使用 最小最大缩放器 **应用缩放,通过将每个特征缩放到 0 到 1 的范围来变换特征。**与标准缩放器相反,最小最大缩放器最适用于有异常值的数据集。由于我最终为模型选择的特征,我的数据集没有异常值。
  3. 使用ADASYN**应用过采样技术。**我也试过 RandomOverSamplerSMOTE ,最后 ADASYN 取得了最好的召回分数。然而,ADASYN 是最慢的采样方法,因为该技术通过计算数据点之间的距离来生成合成数据。
  4. 使用带有逻辑回归、K-最近邻、随机森林、额外树和朴素贝叶斯的五重交叉验证训练数据。
  5. **最终确定模型的特征。**以下是模型中最终确定的特征:1)信用额度使用,2)延迟付款的总月数,以及 3)education的虚拟变量
  6. **根据召回分数选择前 3 名表现最佳的车型。**根据召回分数,表现最好的前 3 个模型是随机森林、额外树和逻辑回归。

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

幻灯片演示模板 go

在上面的图表中,每一行都用不同的型号进行了颜色编码。图例显示,Random Forest 的 ROC-AUC 得分最高,这意味着它在三个模型中表现最佳。在右边,Random Forest 也显示了它几乎总是比其他两个模型表现得更好,因为几乎没有重叠的区域。

结果

根据 ROC-AUC 评分,随机森林胜出

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

Slidesgo 的演示模板| Freepik 的信息图表

韵律学

该模型的召回率为 67.37%。查看下面的混淆矩阵,误报率较高(22.52%),这是我们关注召回时所预期的。因此,假阴性相对较低,保持在 7.22%。

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

幻灯片演示模板 go

特征重要性

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

幻灯片演示模板 go

以下特征(及其特征重要性百分比)最终非常有助于预测客户下个月是否会拖欠信用卡付款:

  1. 延迟付款的总月数— 71%
  2. 信用额度使用率— 27%
  3. education–0.4 ~ 0.9%
    的虚拟变量你可能会奇怪,既然它们的重要性很低,我为什么不直接删除它们。我真的做了,模型实际上表现更差,因此我把它们留在那里。

最佳阈值

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

幻灯片演示模板 go

最后,阈值被设置为 0.465,以实现 0.67 的召回分数。随着阈值的上下移动,可以看到精度和召回率会相互补偿。由业务部门决定适当的误报和漏报百分比,我们可以随时调整阈值以达到期望的百分比。

未来的工作

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

幻灯片演示模板 go

如果有更多的时间,我希望在未来的分析中包括以下内容:

  1. 获取不同的数据集,特别是关于客户信用历史的长度、新信用历史、当前使用的信用类型等。因为我相信这些可以极大地提高模型的预测能力。
  2. 获取更近的数据,因为该模型使用的数据来自 15 年前的 2005 年。在过去的 15 年里,很多事情可能已经改变了!

[1]:美联社。(2020 年 4 月 15 日)。各大银行准备应对贷款违约,留出近 200 亿美元来弥补损失。https://www . Dallas news . com/business/banking/2020/04/15/major-banks-brace-for-loan-defaults-拨备-200 亿-弥补损失/

使用机器学习捕捉网络中的入侵者

原文:https://towardsdatascience.com/catching-intruders-in-networks-using-machine-learning-dd25443709fe?source=collection_archive---------39-----------------------

算法在检测和对抗网络攻击方面具有非凡的潜力。为什么它们很少被使用?

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

图片来自 PixabayYatheesh Gowda

电脑受到攻击。民族国家利用网络攻击占据上风。犯罪分子利用网络攻击获利。网络安全对于企业和个人保护其数据和计算机系统至关重要。检测攻击是网络安全中的一个重要目标,因为它会发出危险信号并实现快速响应。

入侵检测是检测针对计算机网络的攻击的一种方法。入侵检测系统监控来自网络或个人计算机的信息,以提醒响应者网络攻击。入侵检测系统通常分为基于网络和基于主机两类,但基于网络的系统最为常见。

随着网络对手调整他们的攻击,产生特征来检测他们是具有挑战性的。

入侵检测还可以分为基于特征的系统和基于异常的系统。基于签名的系统依赖于代表攻击的已知模式的目录。另一方面,基于异常的检测系统寻找与正常活动不一致的模式。

传统的入侵检测系统是基于特征的,并且依赖于人们创建规则,通常是基于他们经历过的攻击。随着网络对手调整他们的攻击,产生特征来检测他们是具有挑战性的。这些系统很少会发现新的攻击,因为它们是建立在预定义的规则之上的。

利用机器学习进行入侵检测

入侵检测的机器学习研究始于 1987 年左右[1]。从那以后,它一直是一个研究课题。合适的机器学习算法不仅能够检测已知的攻击模式,还能够检测新的攻击。

随着机器学习方法的发展,不同的算法已经被应用于入侵检测。成功的方法包括决策树、神经网络、贝叶斯算法、支持向量机和遗传算法。此外,无监督方法已经应用了图论、聚类和集成方法来检测入侵。

机器学习在入侵检测方面具有非凡的潜力,因为它特别擅长发现数据中的模式。在大多数情况下,人类分析师要处理的数据太多了。他们必须仔细检查大型日志文件,寻找攻击的迹象。这是机器学习算法做得最好的。

尽管进行了所有这些研究,但入侵检测的机器学习应用尚未在实践中广泛采用[2]。这是由于许多挑战。首先,网络上使用的数据集非常大,并且在持续增长。这使得资源饥渴的算法很难跟上。其次,入侵检测系统通常会产生很高的误报率。第三,与机器学习的许多应用不同,有一个对手试图篡改算法以逃避检测。许多机器学习算法容易受到篡改,这使得它们对于入侵检测来说不太准确。

不平衡数据的问题

与正常数据量相比,入侵数据非常小。因此,这些数据集非常不平衡。例如,UNSW-NB15 数据集中只有 3.2%的文件包含攻击示例。当机器学习应用于这些不平衡的数据集时,只看准确性是不够的。

准确度的计算方法是真阳性和真阴性的总和除以所有结果的总和。

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

如果一个数据集有 1000 条记录,有三条记录是攻击,那么一个简单地预测没有一条记录是攻击的算法,f(X) = 0,会产生 99.7%的准确率。

与其在不平衡的数据集中测量准确性,更重要的是看真实的阳性率,也称为召回率。真阳性率的计算方法是真阳性的数量除以真阳性和假阴性的总和。

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

在 f(X) = 0 的示例中,真正的阳性率是 0%,这意味着没有检测到任何攻击。这对于一个应该检测攻击的算法来说是不可接受的,即使它有很高的准确率。

不平衡数据集的另一个重要度量是假阳性率。假阳性率的计算方法是假阳性的数量除以假阳性和真阴性的总和。

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

在另一个例子中,假设在 1,000 个记录的数据集中,其中三个记录是攻击,该算法找到了所有三个攻击记录,但是也错误地预测了 100 个实际上正常的攻击。在这种情况下,90%的准确性分数不算太差,但假阳性率为 10%,这意味着人类分析师将需要花时间审查假警报。

寻找一个好的数据集

入侵检测机器学习的最大挑战之一是找到一个好的测试数据集。监督学习需要带标签的数据,但是由于网络数据的数量和保密性要求,大多数数据集都包含模拟数据。为了标记攻击,许多数据集使用红色分组在正常数据中创建攻击流。

最早的数据集,1999 年 KDD 杯,是作为第三届国际知识发现和数据挖掘工具竞赛的一部分而创建的[3]。竞赛的目标是建立一个网络入侵检测系统。该数据集基于从模拟空军局域网捕获的九周网络数据。原始网络数据被处理以创建 CSV 数据集。它包括四种主要类型的攻击:拒绝服务;来自远程计算机的未授权访问;对本地特权帐户的未授权访问;和探索。

入侵检测机器学习的最大挑战之一是找到一个好的测试数据集。

尽管 1999 年 KDD 杯的数据集对最初的比赛和随后的研究都很有用,但它几乎是 15 年来唯一用于入侵检测研究的数据集。随着时间的推移,数据集因包含重复记录和代表过时技术而受到批评。计算机和网络在 15 年里发生了巨大的变化。

从那时起,许多研究人员创造了更多的现代数据集,以解决 1999 年 KDD 杯的弱点。最值得注意的是,UNSW-NB15 数据集创建于 2015 年,代表了一个更现代的网络[4]。它是在模拟器中创建的,包括标记的数据以及计算机系统的 IP 地址。

UNSW-NB15 比 1999 年 KDD 杯数据集更不平衡,攻击记录比正常记录少得多。在撰写本文时,UNSW-NB15 数据集已有五年历史。尚不清楚它在研究中会有多长时间的用处,但是生成数据集的新方法使得创建数据集的工作量大大减少[5]。

未来方向

入侵检测仍然是机器学习中的一个开放的研究问题。它很可能仍然很有趣,因为技术变化很快,需要研究跟上最新的趋势。这也很有趣,因为对手经常采用新方法来攻击网络。能够识别新型攻击的机器学习算法对于成功防御计算机网络尤为重要。

参考

[1] D. E. Denning,一个入侵检测模型 (1987),IEEE 软件工程汇刊,(2),222–232

[2] R. Sommer 和 V. Paxson,在封闭世界之外:使用机器学习进行网络入侵检测 (2010 年 5 月),IEEE 安全和隐私研讨会,305–316

[3]加州大学欧文分校1999 年 KDD 杯数据 (1999)

[4] N .穆斯塔法, UNSW_NB15 数据集 (2019),IEEE 数据端口

[5] N. Moustafa,机器人-物联网数据集 (2019),IEEE 数据端口

用机器学习抓偷猎者

原文:https://towardsdatascience.com/catching-poachers-with-machine-learning-118eec41d5b9?source=collection_archive---------47-----------------------

建立一个监测自然保护区偷猎者的 ML 系统

完全披露:我是 的维护者,这是一个开源的 ML 平台,Cortex ,旨在构建类似下面讨论的项目。

据估计,每天都有近 100 头非洲象被偷猎者杀害。全世界每天总共有 1000 只动物被偷猎。

大量的偷猎发生在自然保护区,这是许多濒危物种最后(理论上)安全的地方。

对于负责保护这些动物的护林员来说,阻止偷猎者是一场寡不敌众的战斗。超过 70 亿美元的非法产业吸引了看似永无止境的偷猎者。

一个非营利组织,野生动物保护解决方案(WPS),最近开始用机器学习来打击偷猎者——而且很有效。

通过使用运动探测器、摄像机和训练有素的模型,WPS 正在以前所未有的速度识别更多的偷猎者,并在打击偷猎的斗争中引入新的优势。

你如何监控 100 万公顷的野生动物?

防止偷猎最难的部分也是最简单的部分之一:

自然保护区真的很大。

对一小队护林员来说,全天候监控 100 万公顷的区域,包括茂密的森林、悬崖和其他自然障碍,是一项艰巨的任务——即使是远程监控。

WPS 和相关团体已经在整个自然保护区部署运动传感器摄像机多年了。这种相机的工作原理是捕捉大型移动物体的图像,并实时发送给人类监视器,由监视器分析它们是否有偷猎活动。如果另一端的人类看到偷猎活动,他们会向响应者网络发送警报。

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

南非偷猎者被 WPS 抓获

虽然这种远程监控是一种进步,但它仍然存在一些挑战。同时分析来自许多摄像机的镜头——并且足够快地在行动中抓住偷猎者——需要比一般自然保护区更多的审查人员。

即使努力自动过滤偷猎者的图像,WPS 估计该系统也只能检测到 40%的记录在案的偷猎者。

用机器学习检测偷猎者

为了提高他们的检测率,WPS 将机器学习引入到他们的监控系统中。在引入机器学习之前,监控系统可以这样描述:

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

来源:银池

野外摄像头捕捉图像,并将它们传送到监控中心,如果管理中心的人看到偷猎活动的证据,他们会向相关人员发送通知。

他们引入机器学习的目标是在威胁评估阶段插入一个经过训练的模型,作为一个 API。所有传入的图片都将被自动过滤掉偷猎行为,只有正面的图片会被传递给审核者。

通过与 ML 开发平台 HighLighter 合作,WPS 能够训练一个对象检测模型,该模型可以识别特定的动物,以及人类、车辆和其他潜在的偷猎迹象:

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

来源:银池

部署该模型后,他们能够将其插入现有设置,而无需重新构建整个监控系统。

在测试的第一周,他们抓到了两名偷猎者。该小组估计,该系统的效率是以前的两倍,吹嘘有 80%的检测率,并在不断改进更多的数据。

自从最初的测试成功以来,WPS 已经在三大洲的自然保护区推出了该模型,仅在第一个月就提供了超过 100 万次预测。

非营利组织如何负担得起机器学习?

这个故事的许多令人兴奋的方面之一是,机器学习的这种应用不仅仅是可行的——它是可行的。

小团队和单独的工程师部署普通的预训练模型已经有一段时间了,但为这样的任务设计、培训和部署模型一直是大型科技公司的领域。

但是对于 WPS 来说,像 OpenCV 这样的现成解决方案是行不通的。他们需要培训和部署自己的模型。几年前,他们是一个小型非营利组织的事实会阻止他们这样做,但现在不会了。

模型开发平台和开源模型已经发展到现在,即使是小团队也可以训练模型。工程师们已经花了数年时间在像 Cortex 这样的开源基础设施平台上工作,因此任何工程师都可以将一个模型变成偷猎者探测器、视频游戏或癌症筛查器。

人们已经谈论机器学习民主化很长时间了,但这个项目证明,现在,它终于发生了。

赶上云趋势和 AWS 生态系统

原文:https://towardsdatascience.com/catching-up-with-the-cloud-trend-and-the-aws-ecosystem-dd512e8e2456?source=collection_archive---------18-----------------------

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

新加坡的海湾花园。 Pixabay

几个月前,我对云业务及其产品一无所知,尽管我反复听说过。 作为数据科学行业的标准,我必须赶上潮流。在本文中,我将与您分享我对市场领导者亚马逊网络服务(AWS)的了解。我还将向您展示哪些云架构和 AWS 服务可以用作全球数据密集型 web 应用程序的后端,如 Slack 。如果您对计算机网络(IP 地址、客户端、服务器等)有一些基本的了解,这将有所帮助,但不是强制性的。)为文章的第二部分。

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

AWS 上的 Slack 云架构概述。来源

介绍

云计算已经存在很多年了。亚马逊在 2006 年首次推广了这一概念,然后其他科技巨头在 2008 年(谷歌)和 2010 年(微软)跟进。这种技术转变的核心思想是,除非这是你的工作,否则你不应该费心去建立自己的 IT 系统。这怎么可能呢?让我们直入主题吧!

了解云计算和 AWS 生态系统

云计算定义

首先,我们应该界定这一切大惊小怪的原因。云计算是一种允许您访问 IT 资源和应用程序的服务:

  • 点播,
  • 通过互联网,
  • 采用现收现付的定价方式

这基本上意味着,你可以使用亚马逊的服务器( IT 资源)、坐在家里(通过互联网)、随着你的应用增长或放缓而扩展你的基础设施(按需),但总是为你所使用的东西付费(按需付费)。

不用说,这种设置使您能够真正专注于您的产品,而不是采购、IT 维护或扩展。你受益于科技巨头的规模经济。例如,亚马逊的云计算业务 AWS 被网飞用于其几乎所有的后端基础设施。当你将这一点与网飞占互联网下游流量的近 15%这一事实联系起来时(见 2019 Sandvine 报告),很明显,AWS 在购买他们的服务器、电力等时很可能进行了强烈的谈判。允许他们的最终客户享受更低的价格。

最后但同样重要的是,云提供商将其数据中心分布在世界各地。这具体意味着,您将能够在全球范围内以大致相同的速度为您的用户提供服务,因为他们很可能离云提供商的设施很近。这使您可以在几分钟内为全球用户创建应用程序,而无需在不同地理位置设置硬件。

现在让我们来关注一下最大的云提供商 AWS(根据 2019 年 Q2Synergy Research Group的数据,占有 33%的市场份额)。让我们看看 AWS 如何以灵活的方式构建其全球 IT 基础设施,以实际交付我们所描述的内容。

AWS 基础设施设置

到目前为止,AWS 已经在全球定义了 22 个地区(见下图),在那里安装了 it 基础设施集群。每个集群被称为一个可用性区域 (AZ),每个区域至少应该有两个(但通常是三个)。反过来,每个 AZ 由多个*数据中心组成。*最后,每个数据中心都可能由数千台服务器组成。

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

AWS 区域(黄色)和边缘位置(蓝色)的大致位置。基于 AWS 的网站

例如,AWS 定义的地区之一是我居住的新加坡。目前有三个 az,让我们假设它们分别位于樟宜(东)、商业区(南)和裕廊(西)。每个都有自己的建筑,24 小时有人看守。它还拥有独立的电源和网络连接,以便在该地区受到风暴或新加坡闪电影响的情况下限制中断。但是,这三个 az 通过低延迟(光纤)链路相互连接。通过这种方式,你的应用程序可以被复制,并提供更多的流量。如果您选择此设置,您的应用程序将被称为高可用性应用程序。这种冗余也使您的应用程序更具弹性,在发生故障时,流量可以路由到任何剩余的功能 AZ。

如果现在,你的用户位于菲律宾呢?那里没有阿兹。你的应用可能没有新加坡快。这就是为什么 AWS 也在许多边缘位置建立了数据中心。边缘位置基本上是一个缓存数据中心,它使静态内容更接近用户,以实现低延迟连接。现在全世界有超过 180 个这样的网站,即使你远离 AWS 地区,你也可以快速下载你的网飞电影。这项服务是由亚马逊 CloudFront ,一个内容交付网络(CDN)促成的。

通过查看地图,您仍然可以注意到没有 AWS 存在的区域。AWS 网络仍然是一项正在进行的工作,它显然是由市场力量驱动的,以发展其区域。然而,值得一提的是,它有一些严格的要求,例如电力供应商禁止它在任何地方安装区域。这是 AWS 保证的高水平服务的结果。例如,其存储服务 S3(简单存储服务)拥有 99.999999999%的耐用性。这具体意味着,如果你在 S3 上存储 1000 万个对象(每个对象可以包含高达 5TB 的数据),你可以预期每 10,000 年丢失一个对象。有了这些保障,在坚实的基础上建立区域是有意义的。

在 AWS 上构建 web 应用程序的架构

现在让我们探索构建 web 应用程序所需的 AWS 服务。

基本设置

在最简单的设置中,您可以放置您的 web 应用程序、数据库等。在单个弹性云计算 (EC2)实例上。这是 AWS 上最受欢迎的服务,基本上是在 AWS 的一个区域的服务器上运行的虚拟计算机。据说它是弹性的,因为你可以根据需要启动和停止你的实例(或者简单地说你的计算机)。您可以选择硬件规格(内存、CPU、GPU……)以及名为 Amazon 机器映像 (AMI)的软件配置,包括操作系统(Windows、Linux 等)。).设置计算实例后,您还需要处理一些其他事情,主要是网络、存储和安全性。我们将在我的下一篇文章中更详细地探讨网络和安全方面,敬请期待!

一旦您的 EC2 实例启动并运行,您将在一个特定的端口上启动您的应用程序(比方说一个 Flask 应用程序需要 5000 个端口)。知道了正确配置的实例的 IP 地址,人们现在应该能够从互联网访问您的应用程序。然而,在浏览器中,我们通常使用人类可读的地址,如*medium.com。*这就是为什么你需要建立一个域名系统(DNS),一个将网站名称(*medium.com)*转换成 IP 地址(104.16.120.127)的网络服务。与云中的一切一样,AWS 提供这项服务,它被称为 Route 53。

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

一个(非常)基本的应用程序设置。

解决可用性问题

这很好,但是,如果您需要关闭 EC2 实例或者在停电的情况下,您将会丢失 web 应用程序生成的所有数据,而不会提到您的网站将会关闭。那么如何让你的数据持久化呢?这是您想要使用数据库实例的地方,与初始 EC2 实例分开。您可以使用第二个 EC2 实例,自己设置一切,管理数据库等等。但是这就麻烦了。相反,AWS 拥有完全托管的数据库服务。对于结构化数据(比如表格数据),你可以选择亚马逊关系数据库服务(亚马逊 RDS),在上面你可以运行几个可能的数据库引擎,比如 MySQLPostgreSQL亚马逊 Aurora (据说比 PostgreSQL 快 3 倍)。

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

有了这个,你的数据就安全了,太棒了。但是,您的网站仍然处于关闭状态,以防出现故障。让我们让你的应用更有弹性,或者用 AWS 的行话来说就是 HA (高可用性)。

如果您的 EC2 实例宕机,这意味着它所在的 AZ 遇到了问题,对吗?然后,让我们使用第二个 AZ,也不太可能受到影响。您将简单地在一个区域内的几个 az 上复制以前的架构。将你的架构缝合在一起的主要工具是一个负载平衡器。它不是任何负载均衡器,它是一个弹性负载均衡器(ELB ),就像在任何云环境中一样。顾名思义,ELB 将向您的 web 服务器分发流量,并执行一些健康检查(您的服务器是否正在运行,以什么速度运行,等等)。).如果一台服务器出现故障,ELB 会自动将流量路由到其他服务器。这也有助于在实例上均匀分布流量,以避免流量突然激增时过载。您也可以使用两个数据库,其中一个被频繁使用,而另一个则始终维护一个副本。

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

跨 AZs 复制你的应用程序使它更有弹性和可用性。

到目前为止,您已经使您的应用程序具有弹性和高可用性。如果现在,你希望你的应用程序是高性能和高效的,即使有数百万用户?

解决体积问题

是时候利用我们之前谈到的边缘位置了!在你的网站上,你可能有大量的静态内容,如电影或图片,这些内容不会被编辑,但需要高度可用和高度耐用(你不想失去布拉德叔叔的照片)。由于亚马逊 CloudFront(内容交付网络),我们将把这种数据存储在一个简单的存储服务(T1 )( S3)桶中,并放在离你的用户更近的地方。内容将存储在您最初选择的地区(例如新加坡),并在边缘位置复制,所有这些都由 CloudFront 为您管理。使用 S3 的优势在于,它是一个对象存储解决方案,而不是 EC2 实例中使用的块存储解决方案(称为弹性块存储或 EBS,您可以将其视为硬盘)。无需深入了解两者之间的区别,您可以记住,对象存储是作为过去几年数据爆炸的解决方案出现的:

  • 它比块存储耐用得多,并且随着时间的推移更容易增加存储容量,同时降低成本
  • 它非常适合存储不需要像文本这样的增量变化的对象(例如,非常适合备份)
  • 当不经常访问数据时,存储成本会降低。例如,普通的 S3 存储桶每月每 GB 成本约为 2 美分,而 S3 冰川存储桶(用于长期归档)的成本为 0.2 美元(成本因地区而异)。

恭喜你。您的应用程序现在非常健壮,可以为全球用户提供大量内容和低延迟连接!

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

通过将 S3 桶与 CloudFront 结合使用,让静态内容更贴近用户,从而提高应用速度。

当您的需求随时间变化时,现在会发生什么?一场突如其来的炒作将你的网络应用置于聚光灯下,成千上万的用户涌入你的网站。或者相反,你刚刚度过了一个季节性高峰,面临着日常用户的急剧减少。这时你就需要一些自动化了!

自动缩放

网站流量的变化会转化为一些指标的具体变化:比如存储和 CPU 使用率。有了 Amazon CloudWatch ,您可以在一个预定义的组上监控这些指标,比如说下面这个组,它有两个 az 上的四个 EC2 实例:

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

您可以跨 AZs 定义自动缩放组。

在一个简单的例子中,您希望能够根据当前的需要添加或删除这个组。这很容易使用自动缩放来设置闹钟。在这里,您可以定义一个扩展策略。例如,假设您定义了一个当平均 CPU 利用率超过可用容量的 80%时触发的警报。您可以选择在现有 CPU 资源上增加 30%的容量,以防警报响起。正是这种灵活性让您能够适应用户流量的任何变化。

这是您的 web 应用程序的整体架构:

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

这是一个很大的过程,甚至有更多的 AWS 服务!以存储为例:你可以使用 DynamoDB 来存储非结构化数据,或者使用elastic cache来极快地访问数据。您可以使用弹性豆茎等等来自动化部署。我们无法在这里一一介绍,但是可以随意浏览亚马逊文档来了解更多。

结论

总的来说,你应该记住的是,云提供商已经在世界各地建立了极具弹性的基础设施,以托管任何类型的应用程序,所以你不应该自己做。除了节省成本,它还能为您带来灵活性。以(到目前为止)市场领导者 AWS 为例,我们看到了如何使用他们的(数百个)服务来构建云架构。

我希望你喜欢这篇文章。因为这是我的第一次,请在评论中告诉我你的反馈!敬请关注下一篇文章,我们将重点关注 AWS 网络和安全概念(VPC、安全组、互联网逃逸等)。)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值