TowardsDataScience 博客中文翻译 2020(三百八十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Flink 检查点和恢复

原文:https://towardsdatascience.com/flink-checkpointing-and-recovery-7e59e76c2d45?source=collection_archive---------48-----------------------

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

图片来源于 Apache Flink

如何使用检查点和允许延迟建立容错的流管道

Apache Flink 是一个流行的实时数据处理框架。由于它以容错方式以极高的吞吐量进行低延迟处理,因此越来越受欢迎。

虽然 Flink 提供了很好的文档,但我花了一些时间来理解各种机制,这些机制共同使 Flink 检查点和恢复工作端到端地进行。在本文中,我将解释创建容错 Flink 作业需要在不同操作员级别执行的关键步骤。Flink 基本运算符是源、进程和接收器。流程操作符可以有多种风格。

因此,让我们开始了解您需要做些什么来启用检查点并让所有操作者都知道检查点。

Flink 环境配置(检查指向)

检查点的 Flink 作业配置

源操作符检查点

源操作符是从源中获取数据的操作符。我编写了一个简单的基于 SQL 连续查询的源操作符,并跟踪时间戳,直到数据被查询。该信息将作为 flink 检查点流程的一部分进行存储。flink 在作业操作员级别保存源的状态。check pointed function接口或者list check pointed接口应该由源函数实现如下:

根据配置,Flink 作业操作员将每 30 秒调用一次snapshot state方法。方法应该返回要保存在状态后端中的值

restoreState 方法在操作员重启时调用,该方法是处理程序方法,用于设置检查点期间最后存储的时间戳(状态)

过程功能检查点

Flink 支持通过KeyedProcessFunction保存每个按键的状态。process window function也可以在事件时间处理的情况下,按键保存窗口的状态

对于KeyedProcessFunctionValueState 需要按键存储如下:

ValueState 只是其中一个例子。还有其他拯救国家的方法。ProcessWindowFunction自动保存窗口状态,无需设置变量。

接收器函数检查点

接收器函数检查点的工作方式类似于源函数检查点,状态保存在作业操作符级别。我已经为 Postgres DB 实现了 Sink 函数。考虑到性能和效率,可以有多种方法来使宿功能容错和鲁棒。我采用了一种简单的方法,并会在今后加以改进。

通过在 snapshotState 方法中提交语句,我确保所有未决数据都被刷新并作为检查点触发器的一部分提交。

准备就绪

最后,您需要运行您的作业,您可以在处理之间尝试取消它,并通过提供如下检查点位置来尝试重新运行它。你需要自己通过最近的关卡,注意 -s 参数。

.\flink.bat run -m localhost:8081 **-s D:\flink-checkpoints\1d96f28886b693452ab1c88ab72a35c8\chk-10** -c <Job class Name> <Path to Jar file>

结论

这是检查点和故障恢复的基本方法,可能需要根据每个用例进行更多的改进。请随时向我提供您的反馈。快乐阅读!!

代码库的存储库链接:

[## 斯瓦吉-塔伦/弗林克-德莫斯

GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码、管理项目和构建…

github.com](https://github.com/swagy-tarun/flink-demos)

使用 Mapbox 和 Python 制作洪水地图动画

原文:https://towardsdatascience.com/flood-map-animations-with-mapbox-and-python-fb0b5d3109a7?source=collection_archive---------44-----------------------

进来吧,水很好!

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

纽约市洪水(凯尔·帕斯托尔)

在我以前写的一篇文章中,我们谈到了使用 Mapbox 和 Python 来获得超高分辨率的卫星图像。除了卫星图像之外,我们还能够获得海拔地图,它基本上告诉我们每一个像素的海拔高度,以米为单位。有关更多详细信息,请参见以下内容:

[## 用 Mapbox 和 Python 制作高分辨率卫星影像

超高分辨率卫星和高程图像

towardsdatascience.com](/creating-high-resolution-satellite-images-with-mapbox-and-python-750b3ac83dd7)

这次我想把这些数据应用到一些有趣的事情上。

如果海平面上升会发生什么?一座城市被水淹没后会是什么样子?

我们将假设我们运行了代码来获取之前的影像,所以我们在这里想要做的是编写一个简短的脚本,它将随着时间的推移来制作洪水水位的动画。

像往常一样,我们从导入和子目录开始

import numpy as np
import PIL **# Image manipulation library** mkdir ./depth  **# Just a place to store our animation frames**

接下来,我们将简单地循环我们感兴趣的深度级别。这就是一些艺术性来选择一个很好的水平范围来制作一个流畅有趣的动画。你可能要玩一会儿了!

**# Loop over a range between 0 and 100 in 0.25 increments**
for i, level in enumerate(np.arange(0,100,0.25)):

    **# First open up the satellite image we want as the background**
    im = PIL.Image.open('./composite_images/satellite.png')
        .convert('RGBA') ** # Create a solid image that looks like deep water (dark blue)**
    overlay = PIL.Image.new('RGBA', im.size,(4,22,37,255)) **# Convert it into a numpy array**
    ni = np.array(overlay) **# Next we extract the elevation data into a numpy array**
    e = np.array([np.array(xi) for xi in elevation_data]) **# NB: both ni and e are the same shape so we can operation on
    them with numpy** **# Perform element-wise subtraction with the level**
    depth = level - e

在循环的这一点上,我将快速离开一下。这里我们有一个与原始图像大小相同的数组。它包含每个像素的深度。下一步是决定如何根据深度修改*叠加图像。*在这个例子中,我决定根据深度缩放 alpha 通道(透明度)。越深,透明度越低,我们看到的水就越暗。

 alpha_mask = np.copy(depth)
    alpha_mask = alpha_mask*255/alpha_mask.max()
    alpha_mask  = np.where(alpha_mask<0, 0, alpha_mask)
    alpha_mask = alpha_mask**.2 
    alpha_mask = alpha_mask*255/alpha_mask.max()

让我们再一次一行一行地回顾我们刚刚做的事情。

L1:我们通过 复制 深度数组做了一个阿尔法遮罩。复制是非常重要的,否则它就是对对象的引用(如果对象改变了,它也会改变)。

L2:然后我们缩放蒙版,最深的像素设置为 255(最大不透明度)。这当然重新调整了所有的元素,这正是我们想要的。

L3:任何小于零(水面以上)的东西我们都将设置为完全透明。

L4:我遇到的一个问题是水的整体外观没有给人一种视觉上的深度感。它要么看起来完全黑暗,要么非常透明。我决定放大这些点,这样透明度会有一个梯度下降。我使用 x**0.2 作为我的函数,但你可以改变它,以适应什么好看。

L5:在我们的功率标度之后,我们做了另一个重新标度。

 **# Set the overlay layer opacity channel to the alpha mask**
    ni[...,3] = alpha_mask[...] **# Convert the numpy array back to an image**
    W = PIL.Image.fromarray(ni) **# Paste the image and save every depth frame**
    im.paste(W , (0,0),W)
    im.save('./depth/'+ str(i).zfill(4) +'.png')

为了体验一下单帧图像的效果,下面是多伦多大约 100 米深处的图像。你可以看到缩放使山谷看起来有更深的水。

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

多伦多被淹至 100 米左右(凯尔·帕斯托尔)

这看起来很不错,所以现在是时候制作动画了。我们将使用 ffmpeg 把我们的许多帧图像转换成一个. mp4 文件。首先,我们必须安装所需的软件包。注意,我在 Kaggle(在线 python 笔记本)上做了所有这些,它在最后有链接。

**# Install the package in linux**
apt-get update
apt install -y ffmpeg**# Run the command**
ffmpeg  -i ./depth/%04d.png -c:v libx264 -c:a aac -ar 44100 -filter "minterpolate='fps=30'" -pix_fmt yuv420p output.mp4

所用的一组参数大多是为了使 mp4 的最终编码可以在 insta gram(@ datastufplus)上发布。

在我们运行这个并做了一些简单的文字叠加(使用 inshot for android)之后,我们得到了最终的动画。

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

多伦多洪水(凯尔·帕斯托尔)

哇,看起来真酷!

最棒的是,你可以在任何地方重新运行。整个事情都是自动化的!

参考和链接

我做了这一切,因此图像是我的!万岁!

代码链接可在此处找到:

[## 使用 Mapbox 和 Python 制作洪水地图

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自非数据源的数据

www.kaggle.com](https://www.kaggle.com/kapastor/flood-map-with-mapbox-and-python)

flow-Forecast:py torch 中的时间序列预测库

原文:https://towardsdatascience.com/flow-forecast-a-time-series-forecasting-library-built-in-pytorch-bbae7d8407b3?source=collection_archive---------29-----------------------

准确的多元时间序列预测和分类仍然是许多企业和非营利组织面临的主要挑战。

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

Flow Forecast 是最近创建的开源框架,旨在方便使用最先进的机器学习模型来预测和/或分类复杂的时态数据。此外,flow-forecast 与 Google 云平台、Weights and Biases、Colaboratory 和其他行业常用工具进行了本机集成。

背景

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

在我之前的一些文章中,我谈到了对精确时间序列预测的需求以及使用深度学习的前景。流量预测最初是使用变压器和基线模型的变体来预测溪流和河流流量。然而,在训练变压器的过程中,我遇到了几个与找到正确的超参数和正确的架构相关的问题。因此,有必要开发一个平台来尝试多种配置。流量预测旨在允许您非常容易地为您的模型尝试许多不同的超参数和训练选项。改变一个模型就像在配置文件中交换模型的名字一样简单。

我面临的另一个问题是如何将额外的静态数据集整合到预测中。对于河流流量预测,有大量的元数据,如纬度、经度、土壤深度、海拔、坡度等。为此,我们决定研究像自动编码器这样的无监督方法来形成嵌入。这激发了创建一种通用方法来综合嵌入和时间预测的想法。

利用流量预测

有几个简单的资源可以用来开始流量预测。我在 5 月份录制了一个简短的介绍视频,还有更详细的现场编码会议我们还有一个基本的辅导笔记本,你可以用它来了解流量预测是如何解决一个基本问题的。此外,还有一个更详细的笔记本,我们用它来进行核心新冠肺炎预测。最后,我们还提供了 ReadTheDocs 以获取深入的文档以及我们的官方维基页面。

投稿

我们总是欢迎新的模型和损失函数出现在我们的知识库中。我们已经创建了一些描述贡献过程的简单文档。还有几个现场编码视频,所以你可以看到如何自己添加新的模型到存储库中。

流量预测和路线图的核心目标

  • 提供一个中央存储库,存储所有用 PyTorch 编写的最新时间序列预测和分类模型,并且易于扩展。
  • 使用各种损失函数、评估指标轻松评估您的模型,并查看预测值与实际值的图表。
  • 测试各种超参数、损失函数和轻微的架构变化。通过 Wandb 报告和自动减重到云来跟踪您的实验。
  • 从文本、图像、数字、地理空间等多种形式将静态元数据合成到您的预测中
  • 允许您利用时间序列的最新迁移学习/预培训技术来改进您的预测。
  • 支持将时间序列模型轻松部署到生产环境中,以及简单易用的持续评估机制。
  • 轻松集成云提供商,如 GCP、AWS 和 Azure 及其相关的数据存储解决方案 GCS、S3、Redshift、BigQuery 等

问题/反馈

我们感谢对我们的知识库的问题和反馈。如果你遇到一个 bug 或者想要一个额外的特性,比如一个模型或者一个损失函数,你可以自由地打开一个问题。

流畅的编程

原文:https://towardsdatascience.com/fluent-programming-db448fbdc441?source=collection_archive---------10-----------------------

不管是自然语言还是人工语言,学习语言都是一样的。

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

凯文·Ku 在 Unsplash 上的照片

我最大的爱好一直是语言。我小时候学过德语,后来又学了西班牙语。我自学了日语和普通话。然后是梵语,古希腊语,斯瓦希里语,西斯瓦提语,马来语,马来语。在研究生院,我学了捷克语。

我不认为我有任何特殊的语言天赋。这是任何人都可以学习和应用的东西。它让我学习编程语言的速度比学习自然语言还要快。

Python 作为第二语言

学习编程和机器学习最困难的部分之一是试图跟上最先进的技术。这些领域包括数学、计算机科学、信息论、哲学、系统理论、商业、心理学、数据管道、DevOps 以及您工作的任何领域的领域知识。技术——甚至语言本身——都在不断发展。保持现状就像从消防水管里喝水一样。

为了迎接不断快速自我提升的挑战,我借鉴了我的语言史:

热爱你的主题,让自己沉浸其中,创造一个丰富的环境来应用你的新知识。

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

照片由汉娜·莱特Unsplash 拍摄

想一想你坠入爱河的时候。你所爱的对象是你的世界中最迷人的东西。你想知道他们的每一个细节;他们侵入了你的思想;你不停地向任何愿意听的人滔滔不绝地讲述他们。

我一直迷恋我学过的每一种语言。我喜欢每一个不规则的习语和怪癖。记忆不规则动词和学习句法结构并不枯燥,因为这发生在发现的过程中。

c 编译器标志或 python 回溯比你所能想象的要美得多,除非你让自己被语言本身深深吸引。

让自己尽情地去爱。

沉浸

在你知道你在做什么之前,假装你知道你在做什么。

“三个月流利”的语言学习方法为快速“语言黑客”提供了以下一些技巧:

  • 用你的目标语言思考
  • 听音乐,比较一首歌的英语版本和目标语言版本
  • 了解文化细节
  • 需要的时候/当你想知道的时候,用谷歌搜索未知词汇
  • 创造助记符
  • 安排口语课
  • 制作词汇备忘单
  • 用你的目标语言阅读新闻,试着一段一段地获取它的要点

你不能把这些都直接映射到编程上,但是你可以接近:

  • 想想你如何将算法翻译成代码
  • 将一个用你知道的语言编写的程序与你想学的语言编写的相同程序进行比较
  • 学习“文化”细节,比如语言的历史和它的开发社区
  • 需要时/想知道时,谷歌未知语法
  • 创造助记符
  • 与懂这门语言的朋友一起编程
  • 制作函数和常见模式的备忘单
  • 阅读目标语言的源代码,试着一个函数一个函数地获取它的要点

当你还没准备好就开始的时候,你会写很多不太管用的代码。但是错误并不可怕;他们是值得拥抱的东西。我们从错误中学习比从做对事情中学习更快——如此之快以至于它绕过了有意识的思考。错误信息不应该被诅咒——它们是强化学习的即时反馈。

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

蒂姆·莫斯霍尔德Unsplash 上拍摄的照片

语境

背景,而不是记忆,是学习和掌握知识的关键。仅仅阅读 Java 教程是不行的,也不要用它编写任何程序。

做一个项目。不是大的;一些愚蠢和渺小的东西。c 中需要随机数生成器吗?一个 bash 脚本来清理你的目录?一个为你下载 pdf 的 Python 程序?如果你用你正在学习的语言做一个小项目,你会从被动地吸收它变成主动地将它重新组合成新的、有用的表达方式。

就像你学会说话一样。

引用:

我们为什么努力学习语言,加布里埃尔·怀纳

研究揭示了我们为什么从错误中学习生活科学,吉安娜·布吕纳

资源:

程序设计语言的历史和演变 —计算机语言历时发展的入门

任何编程语言中厄拉多塞的筛子 —著名算法在许多不同语言中的实现

与我结对编程 —远程结对编程资源

open hack——一个程序员可以一起做任何事情的聚会

Fn 图 Python 中的轻量级管道

原文:https://towardsdatascience.com/fn-graph-lightweight-pipelines-in-python-121f8d5f9ef6?source=collection_archive---------38-----------------------

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

管理、维护和操作数据科学、财务或任何其他复杂的业务逻辑

今天我们发布我们新的 Python 建模管道(或函数图)库 fn_graph 。过去十年来,我们一直在构建和运营各种类型的计算模型,无论是机器学习模型、金融模型还是通用数据管道。这个图书馆是我们过去所有学习的成果。

什么是 fn_graph?

fn_graph 是一个轻量级的库,让您可以轻松地在 python 中构建和可视化数据流样式的模型,然后轻松地将它们移动到您的生产环境中或嵌入到您的模型支持产品中。

fn_graph 旨在改善车型生命周期的开发阶段、生产阶段和维护阶段。

等等,我们说的模型是什么意思?

模型是一个非常超载的术语,但这里我们指的是整体意义上的。这包括统计和机器学习模型,它们之前的数据准备逻辑,以及更经典的定量模型,如金融模型。与模型相关联的是进行测试、评估和配置的所有逻辑。

标准方法有什么“错误”?

开发模型并将它们集成到生产系统或产品中的标准方法有许多令人恼火和低效的地方。标准模型开发生命周期可以(非常粗略地)分为 3 个阶段:

模型开发

模型开发需要调查任何基础数据、设计解决方案、准备数据、训练任何机器学习模型以及测试任何结果。这通常发生在 Jupyter 笔记本电脑中,也经常发生在分析师的笔记本电脑(或个人云实例)上。在这个阶段,快速迭代、尝试新想法并与相关利益相关者分享这些结果的能力是至关重要的。

笔记本是数据社区的一大进步,但它们也有一些不尽人意的品质。主要问题是它们主要是为实验而构建的,而不是构建可重用的东西。这在学术界是很好的,在那里你主要是想展示一些可以做的事情或者证明一个特定的结果,用相关的可爱的标记、图表和一个写得很好的文化编程风格的叙述。不幸的是,令许多数据科学家新手失望的是,这不是工业界想要的。行业希望能够不止一次地运营某项业务,以便有希望实现盈利。

普遍的现实甚至更糟糕,大多数时候你不会得到一个漂亮的唐纳德·克努特风格的笔记本。相反,由于笔记本的性质,它不利于模块化,你会得到一堆难看的非常非结构化、未封装的代码,这些代码通常不会运行,除非这些单元以一种连作者都不知道的神奇顺序运行。对于一个适当复杂的领域,笔记本可能会变得非常长(因为记住将事情分解成模块并不容易,当你这样做时,你会失去轻松查看中间结果的能力)并且非常笨拙。

这些考虑进一步扩展到模型生命周期中,我们将会谈到,但也横向扩展到可扩展性、可重用性和跨团队维护技术和机构知识的容易性等方面。

模型生产

一旦分析师/数据科学家/建模师完成了他们的模型,结果得到了验证,所有的数字看起来都不错,下一个阶段就是将模型投入生产。对于不同的项目,这可能意味着不同的事情,但也可能是将它作为某种预定的任务转移到生产数据源之外,或者将其包装到 API 中,或者将其更深入地集成到现有产品的代码库中。

无论是哪种情况,需求都与基于笔记本的模型开发阶段有很大的不同。模型开发阶段优先考虑能够快速尝试新事物,并能够深入检查模型的所有步骤和内部工作。相反,生产阶段优先考虑对模型进行清晰的封装,这种封装易于配置,并且可以端到端地重复运行。

所以经常发生的是笔记本被扔给生产工程师,他现在想要写模块化的合理可重用的代码,必须把它分成不同的函数、类等等。这不可避免地会产生微妙的错误,需要很长时间才能消除,特别是在统计模型中,测试比仅仅检查最终结果是否相等要困难得多。

如果模型没有被重写,它就会被包裹在一个可怕的大函数中,这使得调试、测试和维护变得非常困难,同时效率也非常低。

无论发生什么,该模型的一个版本已经准备好投入生产…事实就是如此。

车型维护

模型投入生产一段时间后,是时候做出改变了。这可能是因为需求发生了微小的变化,或者现在有了更多的数据和使用,结果没有给出最初期望的行为。

这些变化需要分析师/数据科学家/建模师的技能,而不是生产工程师的技能,来进行和验证这些变化。请记住,我们实际上有两个版本的代码,分析师的笔记本和工程师的模块。这些人在行为上可能也有一些不同。

分析师不能只使用工程师的产品代码,因为它被很好地封装,所以很难到达中间步骤,这可能是你需要研究的。因此,要么必须对原始笔记本进行修补和更新,以适应任何差异,要么必须将生产代码翻过来,平铺到另一个笔记本中。

然后可以进行更改,必须重复之前的生产过程。这种情况会持续到产品的有效寿命。没那么有趣。

fn _ graph 有什么帮助?

fn_graph 让你从普通的 python 函数中构建可组合的数据流风格管道(真正的图形)。它用最少的样板文件做到了这一点。这种结构允许在模型开发过程中探索和询问模型的细节,并且可以轻松地将整个管道导入到生产代码中,而无需任何更改。

该库的核心技巧是,它将函数参数名与函数名进行匹配,以构建图形。这留下了一个非常清晰的实现,其中一切都只是一个函数,但因为我们知道函数图的结构,它可以询问它并访问中间结果,这使得检查非常容易。因为每个函数都可以而且应该是纯的,因为它不应该有任何副作用,所以代码非常可靠并且容易推理。一旦这个我们称之为 Composer 的函数图完成,它就是一个普通的 python 对象,可以导入到生产代码中,并调用结果。这在示例中更容易看到(取自 fn_graph 信用模型示例)。

信贷建模示例

我们有一个credit_data.csv文件,该文件包含贷款账簿中大量贷款的信息,并且它有一个状态栏,其中包含值已付、违约和存活。其中已付表示贷款已还清,违约表示客户在还清贷款前已停止付款,最后还活着表示贷款仍在偿还。此外,它还具有贷款的许多属性以及剩余的未偿余额。这里的目标是训练一个模型,预测哪些贷款将被偿还,并最终计算出剩余图书的价值。

现在我们将它们链接起来,添加到链接它们的Composer:

这将通过函数名和参数名链接两个函数(注意loan_data是函数名,training_data是参数名)。

我们可以通过(这在笔记本电脑环境中有效)查看这个(非常简单的图表):

这应该能让我们得到这个。

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

我们可以通过函数名查询结果:

这会给我们带来这样的结果

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

这显然非常简单,所以让我们扩展一下。您可以浏览代码,细节并不重要,但应该是不言自明的。

这就给出了下面的函数图:

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

需要注意的是,很容易一眼就能对模型的流程有一个总体的感觉。此外,它在锅炉钢板上的含量极低。唯一的额外代码是每个函数多一行。fn_graph 也没有将你束缚于任何特定的数据结构或库,我们自由地将普通的 python 数据结构与 Pandas 数据帧甚至绘图混合。

如果我们想调查,也可以很容易地查询中间结果:

Fn 图形工作室

访问功能图的显式调用结构允许我们创建一些非常有趣的工具。一个与 fn_graph 的兄弟项目是 fn_graph_studio ,这是一个为 fn_graph 作曲家设计的基于网络的浏览器。它允许用户浏览功能图,查看和操作结果。这在模型开发阶段是非常有用的(它伴随着热重新加载),一旦部署,它可以被用来允许不太技术化的涉众仍然获得对模型的良好理解。工作室值得拥有自己的职位,但它是一个非常强大的机器,可以很好地增强笔记本电脑。

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

Fn 图形工作室显示了作曲家的图形和熊猫的结果

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

Fn Graph Studio 显示了 composer 图和 Seaborn 图

转向生产

因此,尽管 fn_graph 使模型开发变得更加容易和清晰,我们还没有讨论它如何使模型生产变得更加容易。最重要的是,您可以通过编程轻松地操作编写器,顾名思义,它允许您编写和管理逻辑。

为了举例,让我们假设我们想把我们的风险模型打包在一个 API 中,这个 API 接受一个贷款帐本名称,根据某种映射从 S3 加载相关数据,然后返回结果。基本上,我们只是创建了一个函数,它接受一个字符串作为参数并返回一个数字。

我们能做的就是导入我们的 composer,然后更新它。

这更新了 loan_data 函数,用一个接受字符串输入并从 S3 加载相关文件的函数替换了以前从文件系统加载的函数。如果我们查看它的 graphviz,我们会看到 loan_data 函数现在接受了一个尚未提供的输入(因此它显示为一个红色错误节点)。

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

对于像这样的情况,我们只想将输入输入到一个 composer 中,我们可以使用参数。最简单的例子是:

它设置 loan_book 参数,然后调用结果。这非常容易用一个函数来包装:

您可以在 flask endpoint 或任何其他地方轻松地调用它。

请注意,我们不需要以任何方式重构我们的初始模型,如果对它进行了更改,它们会自动流入到产品中。

同样,如果您需要调查一个特定的结果,您可以下载一个文件并使用原始的 composer,或者直接调查生产 composer。这是可能的,因为您可以直接处理中间结果。例如:

这在通常封装的代码中是不可能的,比如生产工程师编写的代码,它会隐藏模型的内部。在这里,我们得到了两个世界的最好的东西,我们有一个很好的封装接口,能够调用最终结果(value_of_live_book),同时还可以访问内部工作。

一些其他功能

其他几个功能被包括在内,或者自然地从 fn_graph 中掉出。

复杂的组合和名称空间

一旦模型变大,它们就变得难以组织。为了帮助这个*,fn_graph* 有了名称空间的概念。名称空间允许您将更小的子模型组合成更大的模型,确保它们没有命名冲突。与 fn_graph_studio 相结合,它使得处理非常复杂的模型变得简单得多,更重要的是更容易解释和协作。我们已经建立了包含数百个函数的非常大的模型,如下所示,同时能够轻松地讨论和实现正在进行的更改。

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

贮藏

分析师和数据科学家在他们的笔记本上反复实现的一个常见的东西是缓存。当处理甚至稍微大一点的数据集时,如果整个模型必须为每个变更完全重新运行,那么它会大大降低迭代时间(或者是完全禁止的)。这经常导致在笔记本上散布 if 语句,这些语句控制是计算一个值还是仅仅从先前保存的文件中提取它。随着一些灵巧的无序单元执行,这种工作方式会留下凌乱的笔记本,并且很难重现,逻辑中更糟糕的变化可能会被无意中忽略(缓存无效错误),导致各种错误和浪费时间。

然而,由于 fn_graph 具有依赖图或被称为缓存的函数,缓存失效变成了一个可以统一自动应用的简单练习。 fn_graph 附带多个缓存后端,包括一个development_cache,它将智能地缓存到磁盘,并在函数更改时使缓存无效。这使得缓存对用户完全透明。

这只是普通的 Python 函数

fn_graph 的最大优势在于它实际上只是普通的 python 函数。没有必须学习的重量级对象模型,也没有复杂的运行时。

它对您可以使用的工具包没有任何限制,因为它实际上只是编排函数调用。你可以把它和你最喜欢的机器学习库、熊猫、纯 python 数据结构或者任何你需要的利基库一起使用。您可以集成到任何 web 服务器或您可能拥有的其他任务系统中,只要它可以调用 python 函数,就没有任何限制。

听起来有趣吗?

可以用 pip 安装 fn_graph

pip install fn_graph

你可能想安装 fn_graph_studio (它作为一个依赖项被分离出来,因为生产系统不需要它),以及示例的依赖项。

pip install fn_graph_studio

然后运行我们在这里提到的例子:

fn_graph_studio example credit

您也可以在https://fn _ graph . business optics . biz/找到实时画廊网站。你可以在https://fn-graph.readthedocs.io/en/latest/找到文档,并查看 github 库:

我们希望听到您的反馈。

关注决定,而不是结果!

原文:https://towardsdatascience.com/focus-on-decisions-not-outcomes-bf6e99cf5e4f?source=collection_archive---------13-----------------------

社会为结果偏差付出的可怕代价

(为了增加趣味,在你继续阅读之前,先看看。)

学习是好事,但不要因为错误的诊断而学到错误的教训。有时候,生活会扔给你一个你无法预料的随机曲线球,不管你的决策能力有多高。当这种情况发生时,调整你的决策过程是糟糕的想法。

我举个例子解释一下。

想象一下,你即将观察到一个公平的硬币同时翻转,一个公平的六面骰子同时滚动。在此之前,你有两个选择:

  1. 在硬币上赌博,忽略骰子:如果是正面,获得 100 美元,否则没有。
  2. 在骰子上赌博,忽略硬币:如果是 6,就获得 100 美元,否则什么也没有。

你选择哪个?

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

图片:来源

更好的决定似乎是硬币,它有 1/2 的机会给你钱,而在骰子上有 1/6 的机会。对吗?没错。如果你被 100 美元所激励,这应该是显而易见的。

现在动作发生了,我们看到了结果:硬币落下时反面朝上,而骰子显示 6。该死,你应该选择死亡!

不,不,你不应该。肯定不是。这就是 结果偏差 ,这是一个你应该尽快戒除的习惯——尤其是如果你希望成为一名优秀的领导者或决策者的话。

始终只根据决策时已知的信息来评估决策质量。

如果我们看结果,当你可以得到 100 美元的时候,你得到了 0 美元。我们能解决吗?不,那个决定已经结束了。你应该从中学到什么?我希望没什么。否则,下次你可能会选择公平的骰子而不是公平的硬币。如果你喜欢钱,那将是一个愚蠢的选择。不管你怎么划分,50%的胜率比 17%的胜率更好。

对社会的威胁

或许更令人担忧的是,结果偏差威胁着社会提拔和留住有能力的领导人的能力。假设赌硬币和骰子之间的抉择不是由你来做的。相反,你看着希瑟成功了。像希瑟一样,你也会选择硬币,但你不会去想它。你太忙于关注她得到的坏结果:反面+6 =错过了 100 美元的机会。如果你对结果有偏见,你会把结果归咎于她的*——忘记了她做出了明智的决定——你会吵着让另一个没有坏结果的决策者取代她,因为:*

  • 他们没有希瑟有经验,所以他们的记录没有污点。
  • 他们很幸运。(一有空就查 生存偏差 。)

不管怎样,你刚刚投票缩小了社会中有能力的决策者的范围,惩罚了希瑟的随意性( 结果 ),而你本应该根据她当时所知道的来庆祝她的明智行动( 决定 )。

结果偏差给社会带来了可怕的代价。

结果偏差给社会带来了可怕的代价。我们明智的决策者是我们最好的资产,然而当真正的罪魁祸首是随机性时,许多人愿意牺牲他们作为替罪羊。如果你有理由相信某人的决策过程是一流的,不要对他们持有不好的结果。

实用建议

评估决策者的技能时,忽略结果。只看决策时已知的情况。在我们的例子中,这是 50%对 17%的胜算。决策者选择了 50%?很好。我希望他们下次也会选择同样的方式。

更实用的建议

如果你是一名高层领导(或渴望成为一名高层领导),你可以在我的后续文章 事后分析决策的问题 中找到更多实用建议。

脚注

结果偏见不是关于道德哲学的争论。原因如下。

感谢阅读!

如果你想了解结果偏见在延续偏见中的作用,可以看看我相关文章的最后一部分:

* [## 你是一个糟糕的决策者吗?

决策分析的黄金法则:避免结果偏差

medium.com](https://medium.com/@kozyrkov/are-you-a-bad-decision-maker-34690deae223)

与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。

人工智能课程怎么样?

寻找一个为初学者和专家设计的有趣的应用人工智能课程?我做了一个给你看。

在这里欣赏整个课程播放列表:bit.ly/machinefriend*

叶子:创建交互式传单地图

原文:https://towardsdatascience.com/folium-create-interactive-leaflet-maps-919def6d6c63?source=collection_archive---------31-----------------------

一个用于创建地图的 python 库。

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

在本文中,我们将探索一个 Python 库follow,它使得在交互式活页地图上可视化用 Python 处理的数据变得容易。

使用 lyum 创建的地图具有高度的交互性,这使得它对于仪表板的构建更加有用。所以,让我们开始探索叶,并了解我们探索它的方式。

安装叶片

我们可以通过在命令提示符下运行下面给出的命令来安装 lyum。

pip install folium

使用 leav 创建世界地图

在安装了 leav 之后,我们需要将它导入到我们的 Jupiter 笔记本中来开始工作。Folium 是一个易于理解的库,通过它,您只需几行代码就可以创建具有高度交互性和视觉吸引力的地图。

在这里,我们将学习如何使用它来创建一个世界地图。为此,我们只需要调用 Map()函数。下面给出的代码将帮助您更好地理解这一点。

#importing folium library
import folium# calling Map() function
world_map = folium.Map()#displaying world map
world_map

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

使用只有一行代码的 follow 进行映射。

上面创建的地图是交互式的,也就是说,你可以使用“+”和“-”或只使用鼠标光标来放大和缩小地图。

我们可以将包含特定位置的经度和纬度的“位置”参数传递给 Map()函数,以显示所需位置的地图。例如,你可以看到下面的代码,我用它的坐标创建了俄罗斯的地图。这里我还传递了一个名为“zoom_start”的属性,它已经相应地放大了。

mah_map = folium.Map(location=[61.5240, 105.3188], zoom_start=3)
mah_map

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

用叶子制作的俄罗斯地图

此外,您可以使用 lyum 创建不同类型的地图。其中一些我已经解释如下。

雄蕊调色图

这些是高对比度的黑白地图。它们非常适合数据混搭和探索河流蜿蜒和沿海地区。

为了创建它,我们只需要给 Map()函数添加一个名为’瓷砖’的属性,并将其设置为雄蕊调色剂。下面的代码是用来创建一个印度雄蕊调色地图。

india_map = folium.Map(location=[20.5937, 78.9629 ], zoom_start=4,              tiles='Stamen Toner')india_map

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

印度雄蕊调色地图。

雄蕊地形图

这些地图显示了山丘阴影和自然植被颜色。它们还展示了双车道道路的高级标签和线条综合。

为了创建这个,我们需要设置属性瓦片的值为雄蕊地形。下面的代码将生成印度的雄蕊地形图。

india_map = folium.Map(location=[20.5937, 78.9629 ], zoom_start=4, tiles='Stamen Terrain')india_map

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

印度雄蕊地形图。

除此之外,还有更多磁贴选项,如“亮地图框”等。你可以探索和学习。

Folium 还有一个标记功能,可以标记您选择的给定坐标的所需位置。我们也可以选择标记的图标。

下面给出的代码用于创建一个地图,并在所需的位置显示标记。

my_map = folium.Map(location=[20.5937, 78.9629], zoom_start=4,   tiles='Stamen Terrain')folium.Marker([28.73158, 77.13267], popup='MyLocation',                 
               marker_icon='cloud').add_to(my_map)
my_map

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

显示弹出式菜单的标记。

结论

在本文中,我们探索了一个漂亮的库,它可以用来创建具有交互性和视觉吸引力的传单地图。我们可以在仪表板中或根据需要使用这些地图。Folium 易于理解库,只用一行代码就创建了地图。本文只是对 leav 的一个基本了解,继续下去,探索 leav 的更多特性。

[## 下载股票数据并直观地展示出来

使用 YFinance 和 Plotly 库进行股票数据分析

towardsdatascience.com](/downloading-stock-data-and-representing-it-visually-6433f7938f98) [## 逐步了解数据分析

对数据集应用数据分析以获得关于数据的见解。

towardsdatascience.com](/understanding-data-analysis-step-by-step-48e604cb882)

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 您也可以在我的*Github 中查看我在这里使用的代码和数据。*

跟随我的极端预算改造(英尺。Gmail API)

原文:https://towardsdatascience.com/follow-along-with-my-extreme-budget-makeover-ft-the-gmail-api-2872cc006b60?source=collection_archive---------43-----------------------

使用 Gmail 和 Google Sheets APIs 的端到端支出跟踪器

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

照片由费边布兰克Unsplash 上拍摄

2020 年是改善之年——对自己,对政府和现有机构,对消费习惯。我的预算方法拥抱了这一主题,并把自己从一个半可接受的过程(使用硒和美丽的汤)磨练成一个精炼无缝的过程(使用 Gmail API)。

我第一次偶然发现使用 Gmail 的想法是因为我注意到每次我完成与 Venmo 的交易后都会收到一封电子邮件。这些邮件包含了我预算所需的所有信息——日期、商家和金额。我研究了 Gmail API,看能否解析出这些信息,并将其插入到 Google Sheets 中。这是一个令人惊讶的无痛过程,我发现我可以通过打开任何超过 0.00 美元的交易的电子邮件通知,用我的每张信用卡收到类似的交易电子邮件。

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

打开信用卡交易通知的选项

与我以前使用 Selenium 和 Beautiful Soup 的方法不同,使用 Gmail API 提供了更好的安全性和对历史数据的访问。API 只需要一个认证步骤,并且不需要本地机器上的明文密码。您还可以在收件箱中检索任何过去的交易,只要电子邮件格式没有改变。然后,我使用 Google Sheets API 上传所有这些检索到的事务,以便于查看、分类和聚合。这些实质性的好处带来了比以前更好的用户体验。

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

这一过程的最终产品

跟着我来创建你自己的端到端方法,来掌握你今年的消费习惯。

完整代码可以在我的 Github 这里 找到。如果你想建立自己的预算工具,我很乐意帮忙——到 jenniferrkim7@gmail.com 找我。

目录:

  1. 检索交易电子邮件
  2. 提取交易数据
  3. 发送到 Google 工作表
  4. 死刑
  5. 结论

检索交易电子邮件

证明

我们首先需要认证才能访问我们所有的电子邮件。Gmail API 的 Python Quickstart (也有其他语言版本)让这一切变得简单,因为它提供了一个完整的样本,可以验证您的第一个请求。因为我们将只在本地机器上使用这个脚本,所以如下所示的认证方法对于这个项目来说已经足够了。

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

使用 Python 快速启动 Gmail API 的身份验证

现在我们已经通过了身份验证,是时候发出请求了。

使用 Gmail 的用户检索电子邮件。邮件:列表和获取

用户消息:列表

response = service.users().messages().list(userId='me', q=query).execute()

[list](https://developers.google.com/gmail/api/v1/reference/users/messages/list) 方法返回我们检索的电子邮件的 id 和 threadId,稍后可以将它们传递给get方法以获得电子邮件的文本。多亏了query参数,我们可以让这个方法只返回我们感兴趣的邮件。这里,我们以与 Gmail 搜索框相同的查询格式传入一个参数。由于每个银行机构的电子邮件格式不同,我们可以创建一个函数,根据选择的银行返回不同的查询。

我们使用文档中的以下代码片段来查看多页回复。

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

用户.消息:获取

[get](https://developers.google.com/gmail/api/v1/reference/users/messages/get) 方法返回给定来自list方法的 id 的特定电子邮件的附加信息。

msg = service.users().messages().get(userId='me', id=item['id'], format = raw_or_nah).execute()

如上所示,get方法有一个format参数,我们可以在“完整”、“元数据”、“最小”和“原始”之间选择消息的格式。我们首先必须确定是否可以从“元数据”格式返回的片段中获得我们需要的数据,该片段包含电子邮件的主题和前几行。如果我们需要的信息不在这个代码片段中,我们可以在格式“full”或“raw”之间进行选择,这将以 base64url 编码的字符串形式返回完整的电子邮件。我选择了“原始”

现在我们有了我们的信息,是时候提取有趣的信息了。

提取交易数据

正在解析格式为“元数据”的消息

我们需要的交易信息是日期、商家和金额。来自美国银行和 Venmo 的交易通知电子邮件在以“元数据”格式返回的消息中包含了所有这三个内容

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

“元数据”格式的消息示例

不幸的是,不容易看到信息在哪里,因为这些信息中的每一条都是一个又大又乱的字典。我们必须通读字典,看看我们需要哪些键值对。日期可能嵌套在关键字“payload”和“headers”中,我们可以使用[parser.parse](https://dateutil.readthedocs.io/en/stable/parser.html)提取日期值。

for msg in msgli:        
    # getting dates        
    headerli = msg['payload']['headers']        
    for nestdic in headerli:            
        if nestdic['name'] == 'Date':                
            date = parser.parse(nestdic['value']).date()
            dateli.append(date)

其余信息可能包含在关键字“snippet”的值中。我们可以使用 money-parser 包的 price_str 函数来查找交易的金额,并通过识别我们知道的指示商家信息/描述所在位置的关键字来定位商家。

# getting amounts and description of transaction        
snippet = msg['snippet']        
amount_index = snippet.find("Amount")        
date_index = snippet.find("Date")        
where_index = snippet.find("Where")        
end_index = snippet.find("View details")        
if end_index == -1:            
    end_index = snippet.find("This may") amt_string = snippet[amount_index:date_index]        
where_string = snippet[where_index + 7:end_index]

当我们从每条消息中提取日期、商家和金额时,我们可以将每条信息添加到它们各自的列表中,以便在提取完成后放入数据帧中。

在 Venmo 上的旁白

在信用卡账单上,返还给我们的钱显示为负余额,与消费交易相反。然而,在 Venmo 上,无论我们是付款人还是收款人,金额总是正的。为了保持我们的支出数字准确,我们必须将我们被支付时的实例数量乘以-1。要查看代码,请参考上面 parse_venmo.py 中的第 21 行。

解析格式为“raw”的消息

当我们的信息不在关键字“snippet”的值中时,我们需要完整的电子邮件数据,使用格式“raw”进行检索。由于这种格式返回的字符串是 base64url 字符串,因此必须先对其进行解码才能读取(第 9 行)。解码后,我们需要的信息可以像元数据片段中的商家一样提取出来——根据关键字的位置解析字符串。

当您想要解析的数据在电子邮件中不存在时

有时候,生活会让你陷入困境。其他时候,巴克莱会这么做。巴克莱发送的电子邮件只包含交易的日期和金额,没有商家。这个我们真的无能为力,可能想用 Selenium 和 Beautiful Soup 之类的工具直接从银行网站获取信息。

发送到 Google 工作表

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

谷歌工作表公式计算每个类别的总和

Google Sheets 提供了一个可访问的基础来创建一个体面的预算界面,上面就是一个例子。我们可以通过 pygsheets 使用 Google Sheets API 将所有交易信息发送到预算文件中的一个表中。下面的方法来自埃里克·鲁德的帖子这里。在对表中某一列的交易进行手动分类后,我们可以使用“sum if”公式计算每个支出类别的总额。

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

Google Sheets 中的最终数据框架

死刑

为了便于执行,我们可以将上述所有函数添加到一个main函数中,该函数根据我们选择的金融机构(包括选择“all”)启动整个交易聚合过程。

结论

我们现在有了一个脚本,可以和 Mint 一样好地获取我们的支出数据(如果不是更好,也要感谢包含了 Venmo)。借助 Google Sheets 的强大功能,我们甚至可以根据自己的需要定制界面。凭借这一新发现的力量,我们有望在 2020 年及以后继续培养良好的理财习惯。

完整代码可以在我的 Github 这里 找到。如果你想建立自己的预算工具,我很乐意帮忙——到 jenniferrkim7@gmail.com 找我。

随着冠状病毒的传播

原文:https://towardsdatascience.com/following-the-spread-of-coronavirus-23626940c125?source=collection_archive---------22-----------------------

一个可免费下载的仪表板,用于可视化新冠肺炎疫情

作者: 保罗 罗莎丽娅 ,克尼梅

2020 年 7 月 6 日更新

世界范围的新冠肺炎起义

我们现在都熟悉这张图表了。

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

图一。累计确诊新冠肺炎病例数和因新冠肺炎导致的死亡数。JHU 不再支持恢复次数。

这一次,我们所说的“所有人”实际上是指全世界的所有人。随着新冠肺炎病毒在世界各地的逐渐传播,我们已经读到和听到了更多关于它的传染性的报道;在中国、韩国、意大利、美国、巴西等一些地区的极端侵略性,以及未来更多地区的侵略性;采取的严厉遏制措施;我们已经看到了这张图表,通过统计全世界确诊病例和死亡的累计人数,每天都在监测疾病的传播。

这些数字的详细分类可以在现在非常受欢迎的博客文章“冠状病毒:为什么你必须现在行动”中找到,作者是托马斯·普约。这种疾病在世界范围内的传播和在中国以外的世界范围内的传播之间的显著差异表明了中国的遏制措施是多么有效,以及猖獗的新冠肺炎病毒现在对世界其他地区构成的危险:首先是美国、巴西、南韩、伊朗和意大利,它们是中国以外受影响最严重的国家。一个星期后的今天,情况是否有了重大变化?

我们在一个免费下载的网络应用程序中复制了这个线图和其他图表,以深入了解当前情况。我们对这些数据进行了分类,以了解各大洲和各个国家的情况。

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

亚洲

让我们从疫情开始的亚洲的数据开始分析。图 2a 显示了截至 2020 年 7 月 6 日亚洲国家新冠肺炎确诊病例的累计数量。

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

图 2a。亚洲各国每日累计确诊新冠肺炎病例数

图 2a 显示,COVID19 确诊病例数的领先优势现在属于俄罗斯,而中国似乎最终达到了控制局势所需的曲线平坦化。紧随俄罗斯之后,我们发现印度也有类似的曲线。中国和韩国的曲线提前变平,给所有仍在抗击病毒的国家带来了希望。自 2 月 20 日以来,韩国实施了封锁和人员跟踪措施。显然,大约过了两周,这些措施的效果才在情节中显现出来。

俄罗斯和印度的数据差异很大,因此很难看出其他国家的情况。为了更好地了解细节,这个相同的线图被移动到 y 轴上的对数刻度(图 2b)。在这里,可以更容易地看到所有国家的趋势,而不仅仅是俄罗斯和印度。请注意,在对数标度中,一切都变得不那么引人注目:指数曲线变成了直线,较慢的增长变得更加明显。例如,我们可以看到,中国和韩国确诊病例数量的增长比俄罗斯或印度下降得多,尽管这两条对数曲线非常接近。

对东亚国家的曲线调查是一个相当重要的难题,因为这些国家较早受到疫情的影响,因此在处理疫情方面有较长的经验。通过检查这些曲线,我们可以更多地了解疾病的传播和遏制措施的有效性。

对韩国来说,疫情的发作可以追溯到 1 月 20 日左右;2 月中旬出现大幅增长,直到 3 月初开始放缓。这证实了大约两周前控制措施生效的数字。

俄罗斯的曲线开始稍晚,开始时与中国的曲线增长相似,在 4 月中旬加速,但继续稳定增长。还没有像中国或韩国那样放缓的迹象。

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

图 2b。亚洲各国每日累计确诊新冠肺炎病例数的对数标度

往西看,我们看到疫情在中东爆发,主要是在伊朗。这种疾病在这里的传播比在远东开始得晚,但它遵循同样的戏剧性趋势,目前没有减缓的迹象。

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

欧洲

下面的图 3a 显示了欧洲的严峻形势,现在英国以惊人的最高确诊病例数领先。截至 2020 年 5 月,意大利是确诊病例最多的国家。从 3 月初开始,意大利实施了严厉的禁售措施,最初的形式较为温和,但从 3 月 9 日开始,形式变得更加严格。经过一个多月的强制封锁,意大利确诊病例的增长速度才开始放缓。不过,对所有欧洲国家来说,曲线变平是显而易见的,包括现在的英国。

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

图 3a。欧洲各国每日累计确诊新冠肺炎病例数

然而,关于传染病传播的数字并不能说明全部情况。流行病的另一面是死亡率,即死亡人数。图 3b 中示出了与图 3a 中相似的曲线。这一次在 y 轴上,我们看到的是新冠肺炎病毒导致的累计死亡人数,而不是确诊病例数。该图类似于图 3a,英国和意大利付出的代价最大,紧随其后的是法国和西班牙。到目前为止,所有欧洲国家都遇到了疫情。迄今为止,德国的情况仍未得到解释(图 3a),确诊病例数量很高,随之而来的死亡人数相对较低(图 3b)。

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

图 3b。欧洲各国每天因新冠肺炎病毒导致的累计死亡人数

在 3 月至 5 月的某个时间点,在意大利 3 月采取行动后,所有这些国家都实施了遏制措施。结果是所有曲线变平。

从以前的经验中学习

在过去的几个月里,在互联网上可以看到的另一个流行图表是由马克·汉德利制作的,可以在他的 T2 推特账户上看到。这是一个累积数字的线形图,其中 x 轴上的时间被标准化为该国疫情开始后的天数。将时间零点视为该国确诊第一例新冠肺炎病例的时间,随后绘制从时间零点开始的天数曲线。这种视图的优点是曲线重叠,就好像它们同时在进化。这是各国现在从早期受影响国家的经验中学习的一种方式(图 4)。

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

图 4。10 个受影响最严重国家每日确诊的新冠肺炎病例累计数。x 轴上的时间已被标准化为从该国疫情开始的天数,我们将其定义为至少有 20 例病例的第一天。

马克·汉德利在三月初用这幅图展示了如果德国、美国或法国不采取紧急遏制措施,他们将面临什么。的确,在那个时候,许多国家都表现出与意大利相同的曲线起点;这表明如果不采取早期的控制措施,也会发生类似的演变。这里我们可以看到,到目前为止,美国、巴西、俄罗斯和印度在确诊病例数量上已经迅速达到并超过了所有其他国家,即使在时间轴上晚了几天。

今年 3 月,将意大利与中国进行比较,我们可以看到,这两个国家疫情的早期开始是相似的,尽管中国在发病后约一个月开始看到确诊病例的增长受到限制。根据这张图表,并假设遏制措施在这两个国家产生了相同的效果,我们可以预计意大利的增长率将在一两周内下降。意大利在 COVID spread 上的曲线达到与中国曲线相同的形状确实花了更长的时间。请注意,“假设遏制措施在这两个国家有相同的效果”是一个很大程度上未经证实的假设,因为意大利没有实施跟踪其人口。同样值得一提的是,这两个国家的人口统计数据非常不同,它们的规模和卫生系统也是如此。

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

北美洲

北美最令人担忧的趋势是美国的趋势(图 5a)。疾病的快速传播类似于欧洲国家的早期数据点(图 4)。

与美国相比,加拿大确诊的新冠肺炎病例较少。然而,如果我们检查对数曲线,我们可以看到疾病传播的侵略性是相似的(图 5b)。

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

图 5a。北美累计确诊新冠肺炎病例数

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

图 5b。北美新冠肺炎确诊病例累计数的对数标度

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

南美。参见 AMERICA

截至 2020 年 7 月,所有国家都出现了 COVID19 确诊病例。最具侵略性的传播是在南美洲。这确实是这篇博文与之前版本最大的不同:南美确诊病例数量高(图 6)。

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

图六。南美累计确诊新冠肺炎病例数

总的来说

累积数字和曲线的平坦并不能说明全部情况。我们可以通过每天检查受影响最严重国家的新增确诊病例数来更深入地了解情况(图 7)。

在这里,我们可以看到,2020 年 7 月 6 日,全球确诊的新冠肺炎病例数量急剧上升。

逐国深入研究,我们没有看到中国和韩国的数据,即确诊病例数量微不足道。相反,我们看到美国(深蓝色)、巴西(浅蓝色)、印度(橙色)和俄罗斯(浅橙色)的确诊病例数量每天都在大幅增加。尽管每日增加的数字似乎在减少,但鉴于这种情况,可以持谨慎乐观的态度。

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

图 7。受影响最严重的国家每日新增确诊新冠肺炎病例数

web 应用程序

最后,让我们抛开传染和死亡这个悲伤的领域,简单地看看我们是如何使用引导分析实现这个 web 应用程序的。它由两页组成。第一页显示了全球确诊病例和死亡病例的总体线图(如图 1 所示)。在这里,我们还可以选择我们想要执行的分析类型:全球范围的或特定洲的;统计确诊病例和死亡人数。

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

图 8。可视化全球新冠肺炎数据的 web 应用程序的第一页。在这里,您可以选择是否在接下来的页面中显示特定洲的确诊病例数、死亡人数和康复人数。

通过点击页面右下角的“Next ”,我们移动到 web 应用程序的第二页(图 9)。在这里你可以找到我们在图 2、3、4、5 和 6 中展示的所有子图形,以及世界地图上的一个 choropleth。所有情节都是互动的。您可以在列表中添加和删除国家/地区,放大和缩小图的部分,选择数据点,并在所有其他图中显示相同的数据点。

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

图 9。用于可视化全球新冠肺炎数据的 web 应用程序的第二页。这是显示上述图和图表的地方。在这种情况下,我们只看到欧洲国家的仪表板。

开发这个应用程序不需要编码,因为它是使用免费开源的 KNIME 分析平台开发的。实现该 web 应用程序的工作流“新冠肺炎实时可视化使用引导分析”(图 10)是免费的,可以从 KNIME Hub 下载。

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

图 10。 KNIME 工作流程 实现了 web 应用程序来可视化世界范围的新冠肺炎数据,可以从KNIME Hub下载,并在免费开源的 KNIME 分析平台 上执行。图像权利 CC-BY-4.0

工作流获取这个 GitHub 存储库通过 REST API 提供的数据。API 服务检查约翰霍普金斯 CSSE 的 2019-nCoV 数据仓库,并每小时缓存最新数据。每次工作流执行时,我们都从 REST API 获取这些缓存数据。如果 API 由于某种原因中断,KNIME 工作流也会通过一个简单的表阅读器节点提供额外的缓存数据。克尼姆。表格文件存储在工作流中,每次在 KNIME Analytics 平台上执行工作流时都会更新。

接下来,工作流使用适当的 KNIME 扩展处理 JSON 结构化数据,将带有洲名的列附加到每个记录的,添加正确的时间戳域,识别缺失值,最后使用组件“新冠肺炎概览”可视化应用程序的第一页。使用单选控件用户可以选择要可视化的患者病例类别(如确诊病例)和洲(如欧洲)。在名为“新冠肺炎焦点”的下一个组件中,可以通过 PlotlyGoogle GeoChart 以及其他 KNIME JavaScript 节点来可视化各个选择的更多信息。

工作流程可以通过 KNIME 服务器部署在 KNIME 门户网站上,所有这些复杂性对用户来说都是隐藏的。用户可以通过任何网络浏览器的简单链接访问组合视图(或仪表板),并与之交互,以可视化冠状病毒危机的最新可用数据。

更多示例工作流可在 KNIME Hub 上获得,例如Paolo Tamagnini 的另一个工作流逐地区可视化新冠肺炎病毒数据。您可以随意下载工作流程,进行定制,在社交媒体上重新分享,并在 KNIME 论坛发表评论。

坚持到底

原文:https://towardsdatascience.com/following-through-7a7bb6ec021f?source=collection_archive---------88-----------------------

在我们的 Github 中,我们都有未完成的项目,以下是如何确保你的下一个项目不会成为其中之一

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

尼娅斯·汗在 Unsplash 上的照片

在我最近的两篇文章中(你可以点击这里的和这里的和)我谈到了我执行一个项目的一些步骤。

在第一篇文章中,我讨论了如何“追踪”一个项目想法。我特别强调,项目想法不会一下子就完全成形了。或者至少,这种情况非常罕见,不应该被依赖。有几条途径可以帮助你聚焦于你想要获得的技能或者你想要工作的领域。同样,对我来说,只是想想你希望存在的工具。

在我的第二篇文章中,我谈到了实现这个项目的第一步。本质上,你需要一个大致的方向和具体的步骤,同时在出现问题时保持灵活性。开始项目是一个平衡的行为,你必须有方向,但要灵活,你应该研究,但也要尽快投入编码。

虽然每一步都很难,但我认为最后一步是最难的:完成项目。

新项目的开始总是令人兴奋的。你有了这些新的想法,要么最终产品感觉简单,要么最初的步骤感觉非常简单。你需要做的就是弄清楚如何做这三件事,然后你就会有一个闪亮的新项目。然后你开始工作。

发挥创造力

我喜欢开玩笑说,我每迈出一步,就有五个以上的问题需要解决。这不是一个独特的经历。事实上,我敢说任何做过任何一种创造性项目的人在某种程度上都有这种经历。事实是,也许你已经看了一些教程,但是,如果你的项目是好的,没有人会给你具体的指导。这意味着你可能会朝一个方向前进,但随后意识到你实际上无法沿着这条路走下去,因为有些东西需要太多的处理能力,或者根本不可行。这也是我在上一篇文章中提到的灵活性发挥作用的地方。你不能抱着这样的心态来完成一个项目:做一件事只有一种可能的方式,你必须按照这个特定的顺序通过执行这些特定的步骤来完成一件事。解决问题需要创造力,而不是僵化。当然,能够解决问题本身就是一项很有价值的技能,但是在完成项目的同时学习并适应解决问题的方法尤为重要。之所以如此重要,是因为你在一个问题上陷得越深,你就越有可能永远无法完成这个项目。然而,这种创造力和想象力可能是一把双刃剑,这就引出了我的下一个观点

着眼于奖品

您从一个步骤开始工作,然后您想,“哦,但是如果我也以所有这些方式增强这个特性,那不是很酷吗?”然后你在这个支线任务上花了更多的时间,这导致了另一个支线任务,然后你意识到你已经在一些事情上花了很多时间,而这些事情你可能不得不完全放弃,这取决于项目的其余部分。或者可能,甚至不是那样,而是,“好吧,我用这种方式来做这件事,但是我确信我能找到更好的方式来做这件事。”再说一次,你花了很多时间纠结于一件事,然后意识到以后你可能不得不完全返工,放弃你的大部分工作。如果你经常这样做,你会变得意志消沉,这个项目会变成另一个被放弃的回购。此外,这不是很好地利用你的时间。这就是为什么把目光放在奖励上很重要。你首先想要的是有用的东西。然后你就可以把它做成好看又高效的东西。做一个顽强的问题解决者固然很好,但做一个知道什么时候继续前进,什么时候再回来的人也很好。即使有些事情并不完美,也没关系!很有可能,当你再次使用它的时候,你已经有足够的经验来修复它,或者甚至不需要那个特定的特性或功能。记住,好的项目是已经完成的项目。所有这些都表明,很难保持解决这些问题和前进的动力。这就是为什么我认为最后一点是最有价值的

合作

https://tenor . com/view/HSM 3-high-school-musical-are-all-in-this-together-dance-gif-5323618

很难保持坚持到底的动力。当你被十种不同的虫子困在杂草中时,很容易就放弃了。到目前为止,你可能已经想出了一个更好的项目创意,而且是全新的。当你一个人工作时,弃船非常容易。然而,当你和另一个人合作时,要做到这一点就困难多了。而你的合作者(或合作者!)当然可以在同一个领域或者有相似的技能,我认为最好和技能完全不同的人一起工作。就我而言,我的合伙人是一名软件工程师。虽然我知道如何编写代码,接受一个模式并输出一个搜索 url,但我不知道如何建立一个网站,让人们可以真正使用它。另一方面,她知道如何构建 web 应用程序,并让每个人都可以使用它们。这样,我们已经有了明确的分工,因为它只是由我们互补的技能组合来划分。和某人一起工作也给你提供了责任感。放弃一个项目更难,因为你必须向某人或多人解释,为什么你决定不再做这个项目。即使你有最善解人意、最冷静的项目合作者,采取这一步骤也可能成为实际退出的巨大阻碍。

这三个主要因素帮助我产生了一个项目想法,创建一个程序来生成类似的针织图案,并将其转化为最终产品,你可以在下面看到!我确信人们已经使用了很多其他的工具,而且可能还有很多我将要学习的。

[## React 应用

使用 create-react-app 创建的网站

pure-peak-95236.herokuapp.com](https://pure-peak-95236.herokuapp.com/)

FOMC 命名实体识别—信息内容发展了吗?

原文:https://towardsdatascience.com/fomc-named-entity-recognition-has-information-content-evolved-2da6da8abd88?source=collection_archive---------36-----------------------

本文使用“FedTools”包和 SpaCy 来检测和分析 FOMC 语句中的命名实体。

最后的数字。现在,我们可以使用按钮和下拉菜单来选择感兴趣的项目和时间段。作者创建的图像。

TL DR : Github RepoFedTools 包。

为什么解释 FedSpeak 很重要?

“Fedspeak”最初是由艾伦·布林德(Alan Blinder)定义的,用来描述美联储的主席们在发表含糊、不明确或模棱两可的声明时所使用的“英语方言”。近年来,由于全球金融机构自然语言处理(NLP)能力的提高,美联储政策沟通发生了巨大的变化。对 FOMC 声明的解读可以为对冲基金、自营交易公司和银行等机构的短期交易策略、套利交易、投资组合倾斜和企业融资策略提供信息。

那么,什么是自然语言处理呢?

NLP 是一个人工智能领域,它使机器能够与人类语言进行交互,分析,理解和解释人类语言的含义。自然语言处理由许多子领域组成,例如自动摘要、自动翻译、命名实体识别、关系抽取、语音识别、主题分割和情感分析。

本文主要讨论在 FOMC 语句上实现一种信息提取技术,应用命名实体识别来确定每个主题被提及的次数。

命名实体识别

命名实体识别可以被认为是基于用户偏好的简单或复杂的信息提取方法。用户既可以像在本教程中一样使用预先训练好的模型,也可以选择训练自己的命名实体识别模型。

一旦模型被训练,命名实体识别可以被认为是检测任务和分类任务的组合:

1)第一步涉及将文本分割成多个记号,也称为分块。分块试图应用非嵌套,例如“美联储”是单个令牌,而不是作为单独令牌存在的“联邦”和“储备”。

2)第二步需要选择适当的本体,通过该本体来组织类别。

为了简单起见,本教程使用 SpaCy 的预训练en_core_web_sm模型,可以在这里找到

实际实施

现在我们已经了解了底层模型,我们可以通过 7 个简单的步骤来实现它。

第一步是安装我们将使用的包和模块:

其次,我们需要通过“FedTools”库获得 FOMC 的历史陈述,可以在这里找到。在此之后,从数据集中移除附加的非文本操作符,并且解析每个语句,返回包含标记化数据、词条数据、词性标签、命名实体、与命名实体相关联的标签、标签出现的相关次数以及语句中每个项目被检测到的次数的数据帧。

现在,我们可以开始从解析的数据中生成附加信息。我们在每个语句的number_of_labels列中搜索特定的标签,确定每个标签实体被提及的次数。潜在命名实体标签的完整列表可以在这里找到。

接下来,我们可以尝试检测每个 FOMC 语句中的相关主席。可用作 FOMC 现任主席的快速识别工具,但如果声明中未出现理事会成员的姓名,则可能会生成“NaN”值(如示例中的前几年)。

我们现在可以生成一个交互式 Plotly 图表,它概述了在每个语句中检测到的总信息内容,并将其分解为特定的标记实体。这对于直观地检验潜在假设特别有用,例如:“美国大选周期前的 FOMC 声明包含的信息很少”或“市场危机期间的声明包含更多定量信息”。

现在,我们可以调用plot_figure函数,该函数在内部调用上述函数来生成和解析数据,最终绘制出检测到的命名实体的数量。

最后的数字。现在,我们可以使用按钮和下拉菜单来选择感兴趣的项目和时间段。作者创建的图像。

另外,displacy.render可以在单个 FOMC 报表上调用,从而实现对实体识别准确性的可视化分析。

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

2019 年 1 月 30 日发布的 FOMC 声明的显示可视化。作者创建的图像。

要选择您想要可视化的 FOMC 语句,请将(dataset[‘FOMC_Statements’][103])中的数值更改为不同的值。-1(负索引)提供最近语句的可视化。

思考的食粮——纸星期二

原文:https://towardsdatascience.com/food-for-thought-paper-tuesday-3c0a9b3e432f?source=collection_archive---------38-----------------------

使用形状偏差数据提高了准确性和鲁棒性

每周二,我都会强调我在研究或工作中遇到的一篇有趣的论文。希望我的评论能帮助你在 2 分钟内获得论文中最多汁的部分!

基本思想

人们普遍认为,CNN 通过提取曲线和边缘等形状特征来学习图像。然而,来自图宾根大学和爱丁堡的一组研究人员在他们的 ICLR 2019 论文中挑战了这一信念 ImageNet 训练的 CNN 偏向于纹理;增加形状偏差可以提高精确度和鲁棒性

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

来自的论文

下面是链接:【https://openreview.net/pdf?id=Bygh9j09KX】T4

通过巧妙设计几个实验,研究人员证明了 CNN 比人们预期的更偏向于图像纹理。由此,他们进一步发现,形状增强数据集可以作为一种有效的数据增强方法,提高模型的准确性和鲁棒性。

研究人员认为,CNN 严重偏向于局部特征,这可能是由于卷积滤波器的感知范围较小。他们的论点得到了 CNN 在无纹理图像上令人惊讶的低性能的支持,如下图所示

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

摘自论文

如图所示,当纹理信息(轮廓和边缘)被移除时,所有主流架构如 AlexNet、GoogleNet 和 VGG16 都经历了显著的性能下降。同时,只要存在纹理(纹理),即使当形状信息被移除时,CNN 也产生高置信度。

结果

为了进一步测试他们的假设,研究人员生成了一个新的数据集,称为风格化图像网(SIN),其图像的局部纹理特征被无信息的随机特征所取代。

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

来自的论文

如果 CNN 偏向于局部纹理特征,我们可以预期在原始 ImageNet 数据集上训练的 CNN 在 SIN 上表现不佳。事实的确如此,如下表所示

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

来自的论文

好了,现在我们确信 CNN 偏向于本地纹理。但是我们如何利用这些信息呢?研究人员证明,在 SIN 和 IN 上联合训练的模型对图像失真(噪声、裁剪、过滤等)更具鲁棒性,并在图像分类和对象检测方面实现了出色的准确性。

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

来自的论文

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

来自的论文

一些想法

很长一段时间,我相信 CNN 有能力进行图像分类,因为它有强大的边缘检测器。这篇论文为我们打开了一扇新的门——有许多关于神经网络的手工解释和理解。要理解哪怕是一种最简单的神经网络形式,还有大量的理论工作要做!

思考的食粮——纸星期二

原文:https://towardsdatascience.com/food-for-thought-paper-tuesday-de81f92c3e3?source=collection_archive---------44-----------------------

一种增强图像的新方法

每周二,我都会强调我在研究或工作中遇到的一篇有趣的论文。希望我的评论能帮助你在 2 分钟内获得论文中最多汁的部分!

基本思想

深度神经网络在许多计算机视觉任务中具有无与伦比的性能,如图像分类、对象分割和图像生成。许多人会认为,正是数百万个参数赋予了模型学习困难任务的能力。然而,天下没有免费的午餐。如果我们想训练更多的参数,我们就需要更多的数据。数据扩充是一种通过简单的转换从收集的数据中生成新数据的方法。更具体地说,当涉及到图像时,人们习惯于随机旋转和翻转图像或者改变亮度和色调。

最近,香港中文大学的一组研究人员开发了一种惊人简单而有效的增强方法,可以与最复杂的自动增强算法相媲美。这是这篇论文的链接:

GridMask 数据增强,【https://arxiv.org/pdf/2001.04086.pdf】T2

信息丢弃通过去除图像中的像素,迫使网络更少地关注输入数据的琐碎细节。这里有一个例子:

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

来自 GridMask 数据增强

根据作者的观点,现有解决方案如随机擦除、剪切和捉迷藏的两个问题是连续区域的过度删除和保留。例如,在上面的图像中,第二个和第四个地块(左起)遭受了过度删除,第一个遭受了连续区域的保留(我们希望删除狗的某个部分,而不仅仅是草)

作者发现了一种更好地避免这两个问题的直接方法——从图像中移除网格块。

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

来自 GridMask 数据增强

算法就是这么简单!创建一个遮罩(上图中的第二行)并将其与原始图像相乘。

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

来自 GridMask 数据增强

结果

作者证明,与当前方法相比,GridMask 不太可能移除(过度删除)或保留 99+%(过度保留)目标对象。

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

来自 GridMask 数据增强

作者还在 ImageNet -1K 和 CIFAR10 等标准数据集上测试了 GridMask,并展示了这种简单算法的潜力。

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

来自 GridMask 数据增强

令人惊讶的是,GridMask 不断超越所有其他信息丢弃方法!

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

来自 GridMask 数据增强

正如我在文章前面提到的,信息丢弃是一种有效的正则化方式。GridMask 也是一个很好的正则化方法。

一些想法

虽然 1%的改善在现实生活中并不显著,但在 Kaggle 这样的数据科学竞赛中却非常有用,在这些竞赛中,人们创建了巨大的集合模型,只是为了小幅增加。这篇文章提醒所有人,我们应该花更多的时间探索简单的技巧,而不是参与“军备竞赛”,在这场竞赛中,人们只是堆积更多的参数。

[FoodieBuddie]我们如何打造新加坡首个美食推荐者

原文:https://towardsdatascience.com/foodiebuddie-how-we-built-singapores-first-food-recommender-b7f3eed0ac77?source=collection_archive---------36-----------------------

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

Ethan HuUnsplash 上拍摄的照片

社会数据分析,建立一个食品和食品影响者推荐,一个必须为您的食品业务!

你可以在这里找到这个项目的代码,在这里找到我们的网站

背景和动机

新加坡是国际美食天堂,拥有价值数十亿美元的食品产业。新加坡的食品行业年收入达 83 亿新元,每年为该国的国内生产总值做出 43 亿新元的贡献,雇用了 48,000 名工人。根据贸易部&工业(MTI) 食品工业转型图显示,2020 年生产率增长 4.5%,计划新增 2000 个工作岗位。这使得新加坡的食品行业成为对初露头角的企业家颇具吸引力的行业。

83 亿新元的年度收入,43 亿新元的年度 GDP 贡献

此外,由于新冠肺炎疫情的结果及其后果,现有的食品企业很难重新考虑他们的产品和商业策略,以便积累足够的销售额,在竞争中保持领先或出局。

一个由细川玉子吉姆孟克里斯托组成的令人惊叹的团队,因此花了我们夏天的一部分时间开发 FoodieBuddie ,目的是帮助新的和现有的食品企业主最大限度地扩大他们在价值数十亿美元的食品行业中的份额。FoodieBuddie 根据 Instagram 趋势向企业推荐潜在的受欢迎的食品和美食,并确定这些企业可以与之合作的潜在食品影响者,以最大限度地扩大他们的影响力和曝光率。

数据收集

我们的主要数据来源是 Instagram。我们承认 Instagram 对食品行业的影响,因为它不仅是食品企业营销食品的平台,也是影响者通过发布对推荐菜肴的评论来曝光食品企业的平台。因此,为了识别将成为流行趋势的食物,我们查看了食物影响者发布的内容。在这个项目中,我们将范围缩小到新加坡前 12 名食品影响者的客户:

新加坡 12 大食品影响者,按作者排列

Instagram 帖子是用 Python Selenium WebDriver、BeautifulSoup 和 Pandas 刮出来的。帖子数据包括食品影响者的用户名、标题、点赞数、评论数和评论。这些数据将用于使用数据工程技术的文本分析,这将在下面的章节中进一步讨论。

我们还使用 Phantombuster 搜集了食物影响者的关注者名单。这些数据将用于生成社交网络图。

基于维基百科的语料库建设

为了识别 Instagram 帖子中提到的食物,我们需要一个食物名称及其相应菜名的语料库。通过维基百科的分类和多层次的子分类功能,食物列表已经与它们各自的烹饪相关联,因此允许我们快速生成一个相当大的语料库。在这个项目中,我们专注于新加坡美食子类别,并使用维基百科 API 为我们的语料库做了初步的搜集。

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

维基百科食物和饮料子类别,截图来自 Wikipedia.org

这给了我们一个最初废弃的语料库,包含 112 个与 9 个菜系相关的独特食物名称。大多数食物都归入中国和马来菜系。

数据清理

从语料库的视觉检查中,我们发现一些食物名称可以被纠正,而另一些可以用替代名称来指代。因此,我们做了一些数据清理,纠正错误的食品名称,并为上述食品项目添加替代名称,我们将以下食品名称列表添加到我们的语料库中,得到了 129 个搜索词。

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

添加到维基百科语料库,图片由作者提供

在把食物按各自的菜系分类后,我们意识到在新加坡很容易找到的两大菜系——日本和韩国——都不见了。为了添加这些美食,我们开始了网络搜索。

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

维基百科语料库摘要,图片由作者提供

基于网络抓取的语料库建设

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

*日韩美食的美食博客,*日式美食:https://www . Japan centre . com/en/pages/156-30-must-try-Japanese-foods,韩式美食:https://migrationology.com/south-korean-food-dishes/

我们首先通过字符串解析从日本食品博客中抓取食品名称——这需要从零开始抓取食品名称,而不是使用预先构建的包,通过将网站的 html 代码作为字符串。然后,我们使用 BeautifulSoup 从韩国美食博客中抓取。这给了我们 30 个日本和 29 个韩国食物名称。

对语料库的进一步检查揭示了关于韩国食物的两个见解:

  1. 一些新加坡人常吃的食物不见了,比如韩国炸鸡、军队炖肉等。
  2. 搜集的语料库使用的食物名称不同于我们在新加坡使用的名称(例如,KBBQ,“tteokbokki”而不是“红米蛋糕”)

因此,我们扩大了韩国食品的语料库,增加了新加坡更常见的韩国食品名称,以及替代食品名称,从而使语料库扩展到 42 个搜索词。

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

韩国美食文集*,作者图片*

基于帕累托分析的语料库建设

由于这个语料库是独立于 Instagram 数据集创建的,所以我们考虑了在使用我们的语料库时食物影响者被低估的可能性。事实上,我们有两个有影响力的人,他们的贴子占总贴子的比例非常低。

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

帕累托分析前的影响者表现*,作者图片*

因此,我们进行了帕累托分析,并确定了 9 个新的食品名称,这些名称经常被代表性不足的影响者发布。

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

帕累托分析识别频繁发布的食品名称*,作者图片*

将这 9 种新食物添加到我们的语料库中,我们获得了一个突出的结果。我们发现,这 9 种新食品使我们原来的标签数量增加了近 50%,使 eatbooksg 的标签数量增加了一倍,使 sheeatshecooks 的标签数量增加了约 66.7%。

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

帕累托分析后的影响者代表*,作者图片*

有了我们创建的语料库,我们现在可以标记我们的数据集了!

情感分析

我们意识到,有很多评论的帖子不一定意味着人们喜欢帖子中提到的食物,因为一些评论可能是在批评食物。因此,我们需要提取对一篇文章的看法,并以此作为衡量标准,而不是评论的数量。

我们给每条评论一个从-1 到+1 的综合情绪分数,平均这些分数给每条帖子一个从-1 到+1 的情绪分数。

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

帖子情感得分汇总统计,图片由作者提供

数据分析

我们使用 Tableau 可视化了我们迄今为止设计的数据。在仪表板中创建和组装了各种图表。为新老企业主创建了两个独立的 Tableau 仪表盘。新的企业所有者可以与仪表板进行交互,以获得关于销售哪些潜在受欢迎的食品以及与之合作的相应合适的影响者的建议。在新企业主打算出售鸭肉米饭、kopi 和辣椒螃蟹的情况下,他/她可以从热图中选择指定的食物项目。此后,他/她可以基于他们的追随者、喜欢的数量、评论和情感分数,找出哪些影响者在张贴陈述的食物项目方面具有更好的状态。因此,这允许新的企业主接触影响者以与其合作,从而获得关于他/她将要出售的食品的更多曝光,这反过来为他/她的新食品企业赢得顾客。

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

新企业主仪表板*,作者图片*

类似地,现有的企业主可以查看潜在的趋势食品,但他们根据烹饪进行过滤。这是因为我们认识到,现有企业主出售不属于他们领域的潜在受欢迎食品是不切实际的。如果现有企业主既出售马来菜肴又出售印度菜肴,他/她可以通过下拉菜单选择菜肴。在那里,他/她可以找到影响者根据所选美食发布的帖子数量,以及其他指标,包括关注者数量、喜欢、评论和情感评分。因此,现有企业所有者知道与哪个影响者合作来基于影响者的帖子的影响范围来推广他/她的企业以吸引他/她的潜在客户。

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

现有企业所有者仪表板*,作者图片*

社会网络分析

我们有兴趣了解食品影响者及其追随者的网络。为了做到这一点,我们准备了一个 csv 文件,描述食品影响者和他们的追随者之间的映射。然后,我们将这个文件导入 Gephi,并获得了一个社交网络图。然而,由于节点数量庞大,社交网络图并不清晰可见,因此我们过滤掉了一些节点。下图中的节点代表新加坡前 12 名食品影响者以及至少关注其中 7 名影响者的人。

Gephi 中生成的图形如下:

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

社交网络图*,作者图片*

有趣的是,影响者本身被分组到不同的社区,通过调查,我们发现了以下见解。

对于紫色社区,我们发现 sheeatsshecooks 与 butcher @meatcosg 合作,发布了很多关于生肉的帖子。也许她的追随者对生肉感兴趣,但许多人可能没有同样的兴趣。对于绿色社区来说,这两个是所有 12 大食品影响者中最不受欢迎的。对于 orange 社区来说,这些有影响力的人与其他人不同,因为他们倾向于发布饮料和蛋糕等小吃,而不是大餐。最后,蓝色社区聚集在一起,因为他们很受欢迎,有许多追随者。也许追随者喜欢追随受欢迎的美食家。

从图表中,我们可以看到许多追随者追随多个食物影响者,这表明食物社区是紧密结合的,他们是食物的粉丝,而不是食物影响者。这一观察与韩国流行乐迷不同,在韩国流行乐迷中,粉丝们每次都承诺对某个特定群体忠诚。

结论

由于网络的紧密中心性,食物趋势很容易在人与人之间传播。这个紧密团结的社区提供了证据,证明食品行业是企业主考虑进入或发展的好行业。

这个项目是新加坡管理大学 IS434 社会分析和应用课程的一部分。

我身边的食物:用 Python 和 Google Colab 抓取谷歌地图数据

原文:https://towardsdatascience.com/foods-around-me-google-maps-data-scraping-with-python-google-colab-588986c63db3?source=collection_archive---------3-----------------------

我一直是这样的人,当我想到一个问题时,我会伸手拿起我的智能手机;和食物有关的时候会更快。这是我去年 12 月去巴厘岛的经历。那是旺季——当然,时间选错了。作为一个美食家,当我到达时,食物是我首先想到的。我们都知道巴厘岛有 Ayam Betutu、Sate Lilit 和 Lawar——但我不知道在哪里可以买到它们,或者确切地说,我不知道在哪里可以买到它们。

“要是我有附近所有餐馆的完整列表,包括等级和地址就好了……”我脑海中有个小小的声音说道。

一旦我从假期回来,我冲向我的笔记本电脑。了解如何实现“如果……就好了”真实的。答案当然是数据搜集。数据抓取,或网络抓取,是从网站导入数据到我们的本地机器。输出通常是电子表格的形式。因此,我可以在一个简单的电子表格中获得我周围餐馆的完整列表,包括地址和评级!我觉得听起来很棒。

我在记事本上写了一个简单的 Python 脚本,因为我的(办公室)笔记本电脑上还没有安装 Python 3。众所周知,安装 Python 非常方便,尤其是对于安装了如此多安全设置的办公笔记本电脑。我的朋友 Mahendri 也帮我校对了我的剧本,他建议 Google Colab 来运行这个剧本。它允许我在云上运行 Python 脚本,所以我不需要事先在我的笔记本电脑上安装 Python 3。我只需要在 Google Colab 中写下我的代码,按下‘运行’,就完成了。

既然我的目标是获得完整的地点列表,那么谷歌地图数据就是答案。有了 Google Maps 数据,我们就可以获得地名、地址、坐标、地点类型、等级、电话号码和其他基本数据。当然,对于初学者来说,我们需要获得位置 API。一旦我们有了 API,我们就可以继续收集位置数据。

**第一步:**你想获取什么数据?

对我来说,我希望我周围的餐厅(在萨努尔的海滩边,巴厘岛)半径 1 公里。因此,参数将是“餐馆”、“萨努尔海滩”(在坐标中)和“1 公里”。

翻译成 Python,应该是:

coordinates = ['-8.705833, 115.261377']
keywords = ['restaurant']
radius = '1000'
api_key = 'acbhsjbfeur2y8r' #insert your API key here

“关键词”让我们可以找到任何注册为餐馆或者名字中包含“餐馆”的地方。所以,我认为这比使用地点的“名称”或“类型”更好,因为我可以获得类型和名称包含“餐馆”的地点的完整列表。比如我可以同时得到寿司 Tei 和 Se’i Sapi 餐厅。如果我们使用“name ”,我们将只能找到名称中包含“restaurant”的地方。如果我们使用“type ”,我们将只得到类型为“restaurant”的地点。然而,使用“关键字”的缺点是需要更长的时间来清理数据。

**第二步:**准备一些需要的库,比如:

import pandas as pd, numpy as np
import requests
import json
import time
from google.colab import files

你注意到“从 google.colab 导入文件”了吗?是的,使用 Google Colab 需要我们使用 google.colab 库来打开或保存数据。

**第三步:**根据第一步中的参数编写一个代码,生成数据。

for coordinate in coordinates:
for keyword in keywords:url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location='+coordinate+'&radius='+str(radius)+'&keyword='+str(keyword)+'&key='+str(api_key)while True:
print(url)
respon = requests.get(url)
jj = json.loads(respon.text)
results = jj['results']
for result in results:
name = result['name']
place_id = result ['place_id']
lat = result['geometry']['location']['lat']
lng = result['geometry']['location']['lng']
rating = result['rating']
types = result['types']
vicinity = result['vicinity']data = [name, place_id, lat, lng, rating, types, vicinity]
final_data.append(data)time.sleep(5)if 'next_page_token' not in jj:
break
else:next_page_token = jj['next_page_token']url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?key='+str(api_key)+'&pagetoken='+str(next_page_token)labels = ['Place Name','Place ID', 'Latitude', 'Longitude', 'Types', 'Vicinity']

该代码允许我们获得每个坐标和关键字的地名、id、经纬度、等级、类型和邻近地区。由于 Google 在每个页面中只显示 20 个点的数据,我们必须插入’ next_page_token '来抓取下一页的数据。假设 Sanur 周围有 40 家餐厅,那么 Google 会用两页显示数据。如果有 58 页,那就是三页。

我们能提取的最大数据点只有 60 位。这是谷歌的规定。举个例子,在离我站的地方 1 公里的半径范围内,萨努尔周围有 140 家餐馆。这意味着 140 家餐馆中只有 60 家会产生。因此,为了防止差异,我们应该控制我们的半径并有效地协调。确保半径不要太宽,否则会导致“只生成 60 个点,而有很多个点”。此外,确保半径不要太小,这会导致我们列出很多坐标。这两种方式都不是很有效,因此我们需要事先了解该地点的环境。

第四步:将数据保存到本地机器

export_dataframe_1_medium = pd.DataFrame.from_records(final_data, columns=labels)
export_dataframe_1_medium.to_csv('export_dataframe_1_medium.csv')

最后一步:将上述所有步骤编织成一个完整的代码

import pandas as pd, numpy as np
import requests
import json
import time
final_data = []# Parameters
coordinates = ['-8.705833, 115.261377']
keywords = ['restaurant']
radius = '1000'
api_key = 'acbhsjbfeur2y8r' #insert your Places APIfor coordinate in coordinates:
for keyword in keywords:url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location='+coordinate+'&radius='+str(radius)+'&keyword='+str(keyword)+'&key='+str(api_key)while True:
print(url)
respon = requests.get(url)
jj = json.loads(respon.text)
results = jj['results']
for result in results:
name = result['name']
place_id = result ['place_id']
lat = result['geometry']['location']['lat']
lng = result['geometry']['location']['lng']
rating = result['rating']
types = result['types']
vicinity = result['vicinity']data = [name, place_id, lat, lng, rating, types, vicinity]
final_data.append(data)time.sleep(5)if 'next_page_token' not in jj:
break
else:next_page_token = jj['next_page_token']url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?key='+str(api_key)+'&pagetoken='+str(next_page_token)labels = ['Place Name','Place ID', 'Latitude', 'Longitude', 'Types', 'Vicinity']export_dataframe_1_medium = pd.DataFrame.from_records(final_data, columns=labels)
export_dataframe_1_medium.to_csv('export_dataframe_1_medium.csv')

现在,轻松地从 Google Colab 文件中下载您的数据。单击左侧窗格上的箭头按钮,单击“文件”,然后下载您的数据!😃

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

您的数据以 CSV 格式保存,可以使用您熟悉的任何工具进行可视化!可以是 R,Python,Tableau 等。在这种情况下,我使用开普勒**将其可视化。**GL;一款数据不可知、支持 WebGL 的高性能 web 应用,用于地理空间分析可视化。哦,对了,是网站上的描述。

这是我的数据在电子表格中的样子:

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

这是它在 Kepler.gl 地图中的样子:

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

是的,在我站的地方周围有 59 家餐馆,在萨努尔的海滩边放松。是的,只需在地图中添加名称和评级,然后我们就可以探索我们周围的一些食物了!

这是我第一次在媒体上发表作品。感谢 Swandika Gumilang 教我 Python &并解释了脚本背后的一些逻辑,感谢 Deo Dedianto & Aldo Leofiro 帮我校对代码,也感谢 Mahendri M. D .建议 Google Colab 运行脚本&并发现其中的错误。

如果你愿意合作,需要一些帮助,或者想复制这个项目,请联系我的 LinkedinUpwork

被随机性愚弄:将蒙特卡罗模拟应用于基金经理

原文:https://towardsdatascience.com/fooled-by-randomness-applying-monte-carlo-simulations-to-fund-managers-94b926fa7ee9?source=collection_archive---------14-----------------------

塔勒布的模型走得太远了

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

“火星上的脸”是我们倾向于看到不存在的图案的一个例子。来源维基百科

第一个原则是你不能欺骗自己——而你是最容易被欺骗的人。
理查德·费曼

自从 10 年前看到这本书以来,我第一次重读纳西姆·尼古拉斯·塔勒布的《被随机愚弄的 T4》。当时,当他进行统计论证时,我只是相信了他的话。今天,情况并非如此,我认为我们可以通过挑战他的一些假设并自己构建这些模拟来了解更多。

对于外行人来说,塔勒布的第一本书发人深省地讨论了随机性的影响,特别是在金融市场中,以及面对这些影响时人类的局限性、认知偏差和错误。从他的作品中可以收集到许多智慧、机智和洞察力(如果你能超越他的自我);我发现自己经常反思他多年来提出或推广的一些概念,从黑天鹅事件,反脆弱性,到游戏中有皮肤的激励

塔勒布经常提到蒙特卡洛模拟的力量,通过数学模拟潜在的未来来处理随机性的影响。看到这些不同的途径如何发挥作用,我们就可以根据期望而不是纯粹的概率做出明智的决定。此外,我们可以根据这些随机过程的结果来检查我们正在落入认知陷阱的区域。就金融而言,这是一个特别有害的问题。

调查幸存者

众所周知,交易者和职业基金经理面临着一个严格的考验,当亏损开始增加时,他们会被迅速从人群中剔除,不管他们过去的记录如何。在动荡时期,他们很快就被扫地出门,从此杳无音信(塔勒布用约翰和尼禄的故事说明了这一点,前者是一个雄心勃勃的交易者,在破产前积累了数百万美元,被行业和上流社会抛弃,而更保守的尼禄仍在继续)。考虑到这样一个艰难的过程,那些在金融“新闻”网络的观众面前持续展示的有着出色业绩记录的人(新闻是松散地使用的,因为他们倾向于首先娱乐,然后宣传股票)必须是对市场有着非凡洞察力的杰出投资者。

塔勒布强烈反对这种想法。

这种思路属于生存偏见——只看到那些在一天结束时仍然存在的人,而忽略了游戏中失败的进入者。塔勒布把这比作一场金融俄罗斯轮盘赌游戏,你一次又一次地冒风险,通常情况下,游戏室会发出咔嚓声,奖励你又一天,并给你一种你自己有能力的错误印象。然而,最终,这将是一个非常糟糕的结局。如果有足够多的参与者,我们可以预计一些人会简单地作为数字游戏生存下来。然而,将这些幸存者视为效仿的榜样是极其愚蠢的。

我们可以通过对书中给出的思想实验建立自己的蒙特卡罗模拟来从数学上探索这一点(见本文代码)。

5 年基金经理存活率

塔勒布通过让我们想象一群 1 万名基金经理争夺投资来阐述他的观点。每年我们都会评估经理们的表现,淘汰那些赔钱的人。如果我们假设市场给我们提供了一个二元结果,我们要么盈利,要么亏损(在我们的世界里没有盈亏平衡),而且每种结果的可能性都是相等的,我们会发现我们自己有活力的经理人在迅速减少。

模拟基金业绩

这种模拟的技术术语是伯努利过程。这仅仅意味着,我们有一个随机的,二元结果的事件序列。在这种情况下,我们在第一年年底投掷 10,000 个硬币,对于我们得到的每个人头,一位经理获得了利润,并幸存下来,以在第二年再次投资。每条尾巴都表明一位经理正在寻求职业改变。

将这个模型进行到底,我们会得到一条曲线,显示只有一小部分经理的存活率。

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

5 年后,我们的 10,000 名经理减少到只有 269 名。塔勒布更进一步指出,即使你赔钱的倾向大于赚钱的倾向(45/55),你还是会有很多“成功的”经理人可供选择(约 190)。

这些经理人将会有出色、完美的记录,并可能为他们自己、他们的公司和/或投资者积累了令人难以置信的大量资金,但你没有理由在未来投资他们。至少,这是塔勒布的论点。

性能有多随机?

如果我们假设在市场中获利是一个纯粹的随机过程,那么塔勒布的观点是正确的。然而,考虑到他是以期权交易者的身份赚钱的,并且认为自己聪明能干,我认为他并不真的相信市场会按照他的描述运行。事实上,似乎确实存在各种不同的投资者策略和技能水平。

让我们回到他的例子,给模型添加一点细微差别。不要假设所有参与者的结果是平等的,每个人都有 50:50 的机会盈利或亏损,让我们随机产生具有一定技能水平的经理。在这种情况下,经理的平均技能水平是 50,这意味着生存的几率是 50:50。如果我们将标准差设为 10,那么高于平均值一个标准差的经理的技能水平为 60。他有 60%的机会活下来等等。

我们的技能分布如下:

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

模拟这种情况,我们可以看到更多的基金经理坚持到 5 年,即使人群的预期回报是相同的。

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

在这种情况下,幸存下来的基金经理数量更多(439 比 269)。换句话说,我们的 5 年基金经理存活率从 2.7%提高到了 4.4%。

这并不能告诉我们所有的事情,因为如果你是一个关注过去业绩的投资者,你会想知道它是否能告诉你一些东西。

如果我们将我们的经理分成不同的分位数,并跟踪他们的表现,我们可以看到技能如何影响他们的表现。

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

在上面的图中,我根据技能将经理分成几个部分,并跟踪他们 5 年的表现,其中每年,经理们根据他们的技能水平得到 1 或-1 分,如果他们盈利的话。在这种情况下,我没有排除那些失败的人——我们只需要关注右边的列,以查看那些从未有过下跌年的人。从这里,我们可以看到我们不同的技能组的结局。

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

我们可以看到,在我们的优秀员工(5 年幸存者)中,61%来自我们技能最高的管理团队。接下来的 22%来自第三组,他们高于平均水平,但不在顶尖的 25%熟练经理之列。余额由两个低于平均水平的组(1 和 2)组成。这些才是真正的幸运儿。平均而言,排名靠前的一组有 63%的时间盈利,而排名靠后的两组分别只有 37%和 47%的时间盈利。

如果你通过延长时间跨度来改变模型,你会看到熟练投资者和非熟练投资者之间的界限越来越清晰。这表明那些拥有较长成功记录的人可能确实比那些拥有较短记录的人更有优势(即使短记录很突出)。在我看来,我们永远也不能排除运气作为一种解释——像巴菲特这样的长期记录可能表明他是有史以来最幸运的投资者——但随着记录的不断延伸,这降低了运气和随机性是成功的主要解释的可能性。

如果我们将我们的投资决策限制在有 5 年利润记录的基金经理(或公司)身上,那么,在这种分布下,我们有 61%的机会选择表现最好的,有 83%的机会选择表现高于平均水平的!这些肯定比我们仅仅通过阅读塔勒布的治疗得到的几率要大。

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

宇宙时间旅行者在 Unsplash 上拍摄的照片

随机性到底起到了什么作用?

这并不意味着不涉及任何运气,但似乎塔勒布在他的简化插图中证明了太多。为了避免有人把我过于简单的蒙特卡洛模型看得太重,认为仅仅通过查看 5 年的记录,他们就有 83%的机会获利,我的模型也做出了一些关键且非常有问题的假设。

所有的模型都是错的,但有些是有用的。
乔治·博克斯

首先,请注意,我假设运气和技能之间存在平衡,两者相互抵消。即使我们将其他东西归入技能桶(例如,投资策略、技术基础设施、支持人员等。)我们仍会遗漏市场机制等其它信息。我们可以称之为“运气”,但如果你在 2009 年成年并开始投资,你将享受到历史上最长的牛市。这当然是运气的一个重要方面!然而,从塔勒布使用这个短语的意义上来说,这似乎更多的不是运气或随机性(尽管他在书中的其他地方似乎模棱两可)。这种调整需要使用适当的基线来校正。

另一个关键假设是,这个技能因素是正态分布的。我很有信心,技能——或任何区分投资者的东西——并不像塔勒布的模型所假设的那样因人而异,但我不知道它是否正态分布,是否向左或向右倾斜,或者它在投资者群体中如何变化。我也不知道吉姆·西蒙斯或沃伦·巴菲特如何与你的普通散户投资者相比,按照我设计的这个单一的、包罗万象的“技能”衡量标准。

最后,我假设这个技能因素随着时间的推移保持不变(我很确信这是错误的),并且随着时间的推移相对于市场保持不变。

不要被你自己的模型所迷惑

纠正这些假设并不简单。但是我们应该小心从我们的模型中推断出的东西。当我们推断得太多时,正如我相信塔勒布在他的书中所做的那样,你可能会走上危险的道路。顺便说一句,每当有人援引单一原因来解释复杂现象时,你应该天生持怀疑态度。要是有那么简单就好了。

塔勒布关于随机性在我们生活中的作用的许多更广泛的观点是成立的。我们经常成为其恶习的受害者,因为我们坚持认知偏见和启发,这些在我们生活的大部分时间里都很有用,但在面对概率时却灾难性地失败了。尽管事实如此,但这并不意味着我们不能从我们受到的随机噪音的冲击中获得一些重要的信号。

足球运动员跟踪——使用 OpenCV 根据运动员球衣的颜色识别他们的球队

原文:https://towardsdatascience.com/football-players-tracking-identifying-players-team-based-on-their-jersey-colors-using-opencv-7eed1b8a1095?source=collection_archive---------21-----------------------

使用 Yolov3、SORT 和 OpenCV 检测、跟踪、确定球员的球队并将其转换为鸟瞰图。

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

球员追踪在鸟瞰图中,蓝点和白点代表两队,红点是裁判。(背景图片来自https://commons . wikimedia . org/wiki/File:Soccer _ field - empty . SVG)

介绍

在我之前的工作中,我使用预训练的 Yolov3 模型进行检测,并使用 SORT(简单的在线和实时跟踪)从视频中跟踪足球运动员。然后我用 OpenCV 的 getPerspectiveTransform 函数把视频转换成鸟瞰图。

[## 如何使用 Yolo,SORT 和 Opencv 追踪足球运动员?

使用 Yolov3、Opencv 和 SORT 检测和跟踪足球运动员,并将球员的运动转换为鸟瞰图。

towardsdatascience.com](/how-to-track-football-players-using-yolo-sort-and-opencv-6c58f71120b8)

这项工作的一个问题是模型不能区分团队。如果程序能够识别玩家的团队,而不仅仅是检测“人”,那就太好了。为了进一步改善这一点,我希望包括一个功能,告诉球员球衣颜色的差异。

我现在能想到解决这个问题的两种方法。

  1. 使用包含 3 个类的自定义数据集训练对象检测模型——两个队的球员和裁判。这种方法对于实际应用可能不实用,因为必须在每次比赛前训练特定的模型。
  2. 使用当前对象检测模型并从检测中提取颜色信息。基于此,我可以识别球员球衣的颜色。

我决定使用 OpenCV 尝试方法 2。

足球视频

静止足球视频从这里下载。

“t . D ’ orazio,M.Leo,N. Mosca,P.Spagnolo,P.L.Mazzeo 足球视频序列地面实况生成的半自动系统,第六届 IEEE 高级视频和信号监控国际会议,意大利热那亚,2009 年 9 月 2 日至 4 日”

OpenCV 的彩色蒙版

球队和裁判之间的主要区别是球衣的颜色——一个球队是白色的,另一个是蓝色的,而裁判是红色的。我想根据球衣颜色来确定球员的球队。

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

视频中的一帧。

首先,我确定了三种颜色的范围。

color_list=['red','blue','white']boundaries = [
    ([17, 15, 75], [50, 56, 200]), #red
    ([43, 31, 4], [250, 88, 50]), #blue
    ([187,169,112],[255,255,255]) #white
    ]

然后我应用 OpenCV 的 inRange 函数为三种颜色创建蒙版。

mask = cv2.inRange(image, lower, upper)

然后使用 bitwise_and 对框架应用遮罩。

output = cv2.bitwise_and(image, image, mask = mask)

现在提取了三种颜色

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

应用于图像的红色、蓝色和白色遮罩。

现在我们需要将这些掩模应用到检测中。我根据检测到的边界框裁剪了图像,然后应用了蒙版。

crop_img = frame[ymin:ymax, xmin:xmax]

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

应用于检测的掩码。基于非黑色/总像素比率,球衣被识别为蓝色。

我识别颜色的方法是计数非黑色像素,并计算三种颜色的输出图像的比率(非黑色/总像素)。比例最高的是球衣的颜色。在上面的例子中,蓝色的比例最高,所以球衣被识别为蓝色。

现在我把这个功能集成到玩家检测脚本中,这里是一些面具和玩家检测的例子。

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

检测样本

基于球衣颜色的结果,我可以画出不同颜色的包围盒。

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

足球运动员追踪。边界框的颜色代表运动衫的颜色。

然后和我之前的帖子类似,通过使用 Opencv 的 getPerspectiveTransform ,得到了开头所示的鸟瞰图。

结论

仍然存在一些问题:

  1. 一些玩家在一些帧中没有被检测到,一些非玩家的人也被检测到。可以通过专门为足球运动员训练对象检测模型而不是使用预先训练的模型来改进。即使球很小,也可以跟踪球,这将是很有趣的,有可能尝试它或其他对象检测架构。
  2. 当有玩家遮挡时 ID 改变。尝试像深度排序这样的其他跟踪算法可能会有帮助。

这种跟踪的一些应用:

  1. 跟踪玩家并计算他们的速度和距离。
  2. 获取两个队的球员路线的热图
  3. 更多

感谢阅读,欢迎建议和反馈。

在这里支持我:【https://medium.com/@c.kuan/membership】T2

足球运动员自相矛盾的生日

原文:https://towardsdatascience.com/footballers-paradoxical-birthdays-1aa0cbade7e5?source=collection_archive---------43-----------------------

用贝叶斯因子证明生日问题

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

Unsplash卡特琳娜·伯杰的照片

序文

好吧,好吧。这个标题有点误导——甚至是 clickbait 。至少有 66%是这样的。首先,我今天要解决的现象并不是足球运动员独有的,但鉴于在可预见的未来,白俄罗斯以外的所有足球活动都将被取消,我想我们都可以通过这种方式解决问题。其次,他们的生日一点也不矛盾。生日悖论如此命名纯粹是因为它的反直觉性质;这只不过是冷酷的统计数字。

生日问题(我们以后会更准确地提到它)指出,给定一个只有 70 个人的房间,有 99.9%的可能性至少有两个人同一天生日。事实上,房间里的 23 个人将确保我们有比扔硬币更好的机会(> 50%)在一年中的至少一天为不止一个人唱生日快乐歌。考虑到一年中至少有 365 个可能的生日,这听起来很奇怪。其实我们是不会相信的。我们会证明的。有证据。

瞧,命运安排得好,参赛国最多允许带 23 名运动员参加国际足球比赛。这对我们来说非常方便,因为我们刚刚声称,有(超过)50%的机会,一个满是 23 个人的房间会有至少一对人一起过生日。因此,如果我们看一些国际足球队,其中大约一半应该有球员一起切蛋糕。

*但是,即使这是真的,也可能是偶然发生的——*我听到你说——也许你只是运气好。我欣赏你的怀疑精神。这就是为什么我们将使用贝叶斯推理来发现我们的结果有多么重要,并一劳永逸地撕掉隐喻性的史酷比小人面具。

为什么

嗯,为什么不是。除非你预测办公室蛋糕费用,否则你很难找到与生日问题直接相关的业务。但是我们从数据科学家的瑞士军刀技术中探索两个基本工具:

  • **网络搜集:**我们将从网页上收集数据,以建立我们对足球运动员生日的了解。从客户参与到市场分析,抓取网页是许多真实数据科学用例的基本元素。
  • **数据操作:**我们将使用 Pandas 从我们从网络收集的数据中提取相关信息。
  • **统计评估:**我们将使用贝叶斯因子来检验我们的假设。假设检验是任何自尊的数据科学家的面包和黄油,贝叶斯统计与机器学习和模型选择有很强的相关性。

此外,我发现生日问题是一个有趣的问题,谁不喜欢一个好的证明呢?

什么

让我们浏览一下我们的攻击计划和所需的概念。

生日

生日问题是怎么解决的?上面我们做了一些大胆的主张,那么我们来提供一个数学上的解释。为了更好地理解至少两个人同一天生日的概率,思考一下在任何群体中没有个人同一天生日的概率是有帮助的:

设想两个人在一个房间里,亚伦和比阿特丽斯。他们同一天生日的概率有多大?Aaron 将在一年中的某一天过生日,Beatrice 可以在一年中的任何一天过生日,因为他们不在同一天过生日。因此概率为 364/365

注意:在整个练习中,我将使用 365 天。我假设如果有人出生在闰日,他们的父母会仁慈地伪造他们的出生证明。

如果有第三个人,塞西尔出现了呢?嗯,Aaron 过生日,Beatrice 过另一个生日,所以她还有 363 天可以选择。因此,她不和艾伦和塞西儿过同一天生日的概率是 363/365。艾伦和比阿特丽斯不在同一天生日的概率是364/365×363/365。然后迪米特里出现了,留给他的是 363/365 的概率,如此等等…

因此,Aaron、Beatrice、Cecile 和 Dimitri 中没有两个人同一天生日的概率是:

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

因为在我们的设置中有两种可能的结果,没有两个人过同一天生日至少有两个人过同一天生日,所以这些结果的概率总和必须是 1。因此,Aaron、Beatrice、Cecile 和 Dimitri 中的至少一个生日相同的概率是:

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

如果我们把这个思考过程扩展到 23 个人(省去了我再想出 19 个字母名字的麻烦),我们会得到:

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

给定一个满是 23 的房间,至少两个人共享一个生日的概率确实超过 50%。但是我还是觉得不太对劲。别担心,我们会用数据证明这一点。

足球运动员

我们将使用哪些数据?我在上面提到过,每个国际足球队由 23 名球员组成。因此,我们将分析 18/19 FIFA 世界杯的球队,并收集他们每个球员的生日。

我们将使用这些维基百科页面获得每个国家队的球员名单:

将这些组合起来,我们将得到 56 个组,这是一个不错的样本。

悖论

我们将如何证明帕拉…呃,T4 问题?我们将分析 56 组 23 人的生日,并检查是否有任何匹配。拥有至少一对匹配生日的团队的百分比将是我们的实验结果,而理论值为 50.73%。

但是我们的结果有多可靠呢?如果你仔细考虑我们的问题,这实际上是一系列的掷硬币——一个二元结果的实验(球队要么有同一天生日的球员,要么没有),在这种情况下,我们可以很容易地测试我们结果的重要性。唯一的区别是,考虑到概率略高于 50%,我们的硬币稍微偏向一边。

测试这一点的 frequentist 方法将使用 p 值。我们将建立一个无效假设,即生日匹配的概率确实是 50.73%,即我们的硬币是公平的。然后,我们将计算生日相同的球队数量(即人头数),并计算在给定样本的情况下获得该数字的概率。这将给出我们的 p 值,如果低于预先确定的值(通常为 1%-5%),我们将拒绝我们的零假设,并说我们的理论是错误的,即我们的硬币是不公平的。

然而,我们不仅仅是常客。我们将使用托马斯·贝叶斯对 p 值的回答,贝叶斯因子。它比较两个概率模型,帮助我们选择更合适的一个,定义为:

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

用英语来说,就是得到我们的数据的可能性, D ,给定模型 M1 ,除以得到数据的可能性 D 给定模型 M2 。一般来说,至少 5 比 1 的比率(即> 5 的值)意味着对 M1 的实质性支持。

贝叶斯因子优于 p 值的一个主要优点是它对样本大小的矛盾性。虽然我说过我们有一个不错的样本,有 56 个团队,但这并不完全是大数据。

我们将建立两个基本模型来描述给定实验结果的理论概率。我们的第一个模型, M1 将是,概率正好是 50.73%。因此, M1 的概率密度在该点为∞,在其他地方为 0。我们的第二个模型将非常天真,我们将假设我们根本不知道概率,它们都是同样可能的:

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

怎么做

让我们做些重活。

网页抓取

维基百科页面在一个单独的表格中列出了每个国家队中的每个球员。我们希望建立一个数据框,每行都有一名球员,包括他们的出生日期和他们为哪个国家效力。这意味着我们需要从维基百科中获得:

  1. 民族
  2. 玩家姓名
  3. 生日

首先,让我们使用 BeautifulSoup 解析 Wikipedia 页面的 HTML 内容:

import requests
from bs4 import BeautifulSoupmens_wiki = requests.get('https://en.wikipedia.org/wiki/2018_FIFA_World_Cup_squads')mens_soup = BeautifulSoup(mens_wiki.content, 'html.parser')

我们将从维基百科页面获取这些信息,并找出包含它们的 HMTL 元素标签/类,为搜集做准备:

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

维基百科页面上感兴趣的 HTML 元素

**国家:**表格按顺序列出,每个表格都以国家名称开头,这是一个 h3 HTML 元素,带有“mw-headline”类。比赛中有 32 个国家参赛,所以我们取页面上的前 32 个 h3 元素(后面有我们不想要的 h3 文本)。然后我们将使用 np.repeat() 重复每个国家 23 次(每个玩家一次):

h3 = mens_soup.find_all('h3')h3 = h3[:32]mens_countries = []for h in h3:
    mens_countries.append(h.find('span', class_='mw-headline').text)mens_countries = np.repeat(mens_countries, 23)

**表格:**每个国家都有单独的球员信息表格。他们的类是“sortable wiki table plainrow headers”,页面上没有这种类型的表,所以我们将它们全部收集起来:

tables = mens_soup.find_all("table", class_="sortable wikitable plainrowheaders")

Row: 在每个表中,我们将遍历这些行来获取其中的数据。我们可以使用以下方式识别每个表中的行:

rows = table.find_all('tr', class_='nat-fs-player')

**姓名和出生日期:**我们将找到每一行中的第二个链接,并获取与之相关的文本;我们还将从每一行中获取出生日期,这是一个带有类“bday”的 span 元素:

player = row.find_all('a')[1].textbday = row.find('span', class_='bday').text

将所有这些整合到一个函数中,并对团队的数量进行参数化,以确保我们可以为女子团队(有 24 个团队,而不是 32 个团队)重复该过程:

def get_football_bdays(main_url, n_teams):
  '''
  function to generate df of footballers and bdays
  ''' # get main Wiki page
  wiki = requests.get(main_url)
  soup = BeautifulSoup(wiki.content) # get list of country names
  h3 = soup.find_all('h3')
  h3 = h3[:n_teams]
  countries = []
  for h in h3:
    countries.append(h.find('span', class_='mw-headline').text) countries = np.repeat(countries, 23) # get players and birthdays
  players = []
  player_links = []
  bdays = [] tables = soup.find_all("table", class_="sortable wikitable plainrowheaders") for table in tables:
    table.find_all('th') rows = table.find_all('tr', class_='nat-fs-player') for row in rows:
      players.append(row.find_all('a')[1].text)
      bdays.append(row.find('span',  class_='bday').text) df = pd.DataFrame(data={'Country': countries,
                          'Player': players,
                          'Date_of_Birth': bdays}) return df

我们将应用于男子和女子队页面,并将结果数据框合并为一个:

df_men = get_football_bdays('https://en.wikipedia.org/wiki/2018_FIFA_World_Cup_squads', 32)df_women = get_football_bdays('https://en.wikipedia.org/wiki/2019_FIFA_Women%27s_World_Cup_squads', 24)df_men['Gender'] = 'Men'
df_women['Gender'] = 'Women'
df = df_men.append(df_women).reset_index(drop=True)

让我们来看看我们的数据:

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

数据操作

在这一部分,我们将找出至少有一对生日相同的团队。为此,我们将首先提取每个出生日期的月和日元素:

df['Date_of_Birth'] = df['Date_of_Birth'].apply(pd.to_datetime)df['Birthday'] = df['Date_of_Birth'].map(lambda x: str(x.month) + '-' + str(x.day))

然后,我们将创建一个列来指示生日是否在团队中重复(如果重复,则用 1 表示,否则用 0 表示):

df['Duplicated'] = df.duplicated(['Gender', 'Country', 'Birthday']).astype(int)

计算每个团队中的副本数量,并显示结果:

df_duplicates = df.groupby(['Gender', 'Country']).agg({'Duplicated':'sum'}).reset_index()
df_duplicates = df_duplicates.sort_values('Duplicated', ascending=False)
df_duplicates['Team'] = df_duplicates.apply(lambda x: x['Country'] + ' ' + x['Gender'], axis=1)g = sns.barplot(data=df_duplicates, x='Team', y='Duplicated', hue='Duplicated', dodge=False, palette=sns.color_palette("GnBu_d"))g.set_xticklabels(g.get_xticklabels(), rotation=90, fontsize=6)
g.set_ylabel('Shared Birthdays')
g.set_title('Number of shared birthdays in each team')
g.legend_.remove()fig = g.get_figure()
fig.tight_layout()

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

波兰男队 23 名球员中有多达 4 对重复生日;葡萄牙男人有 3 个;摩洛哥男队和两支巴西队各得 2 分。更重要的是,56 支队伍中有 28 支队伍有相同的生日,正好是一半。似乎很幸运!或者是?

统计计算

我们已经掷了 56 次硬币,假设 50.73%的时间硬币落在头上,但有一半的时间硬币落在头上。我们的硬币公平吗,即我们 50.73%概率的模型正确吗?

给定 50.73%的理论概率,获得 28 个生日匹配的团队的可能性由二项式概率质量函数给出:

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

其中 n 是试验次数, k 是成功次数, p 是我们的理论概率。我们会用 Python 找到确切的可能性。

首先,我们计算得到至少一对与 23 个人生日匹配的精确理论概率:

mltp = 1for i in range(343, 366):
  mltp*=ip = 1 - mltp*((1/365)**23)

得出 0.5072972343239852 。我们的 kn 简单来说就是生日匹配的队伍数量和队伍总数,分别是:

k = len(df_duplicates[df_duplicates['Duplicated']>0].index)
# 28n = len(df_duplicates.index)
# 56

我们将使用 Scipy 中的 binom() 函数来计算可能性:

from scipy.stats import binomp_M1 = binom.pmf(k, n, p)

以上(结果为 0.10551566641902223 )是在 56 支队伍中找到 28 支生日相匹配的队伍的可能性,给定我们不久前的模型 M1 :

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

我们的另一种先验信念是,所有的概率都是同等可能的——也就是说,我们不知道概率。这可以用贝塔函数参数 α = 1,β = 1 的贝塔二项式先验分布来建模。贝塔二项式概率质量函数为:

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

其中 B()是β函数,参数如上所述。幸运的是,SciPy 对此也有一句俏皮话:

from scipy.stats import betabinomp_M2 = betabinom.pmf(k, n, 1, 1)

上面是给定一个均匀的概率密度先验,得到 28 个生日匹配的球队的可能性。这表现为:

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

我们记得贝叶斯因子是两种可能性的比率:

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

超过 5 的 K 值指向 M1 的“实质性”证据,支持我们的假设,即我们的结果用 50.73%的概率描述要比随机描述好得多。

外卖

那么我们从这一切中学到了什么呢?

  • 我们已经详细探讨了生日问题,并从数学上表明,在 23 人的小组中,两个人更有可能过同一天生日。
  • 我们通过分析 2018/19 年世界杯每队 23 名球员的生日来寻找支持这一观点的证据,通过使用自定义网页抓取功能抓取两个维基百科页面来收集必要的数据。
  • 我们发现 56 支参赛队伍中有一半的队员是同一天生日的;有些甚至超过两对。
  • 给定我们收集的数据,我们使用 Bayes 因子来测试两个先验假设:使用二项式概率质量函数计算的概率是精确的;或者,使用β-二项式概率质量函数,所有概率都是同等可能的(即我们不知道)。
  • 我们为前一个模型找到了的实质性证据,证明了生日问题(以及引申开来的数学)是正确的。

引人入胜的东西,如果我可以这么说。

事后思考

我做错什么了吗?我能做得更好吗?我做得好吗?

请随时在 LinkedIn 上联系我;如果你对我的工作感兴趣,我总是很乐意接受挑战或者只是聊聊天。

如果你想自己玩代码,请点击我的 Google Colab 笔记本的链接:

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/drive/1BfeeVJbHqets02tTNwIiEeWpQ7xtX163)

对于循环

原文:https://towardsdatascience.com/for-loops-c302e0bfd655?source=collection_archive---------64-----------------------

看看 Python 编码中最基本的概念之一

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

For 循环允许我们迭代 Python 中的列表、元组、集合和字典等集合。虽然您可以选择在单独的代码行中操作每一项,但这将是非常低效的,尤其是当列表非常长的时候。

nums = [1, 2, 3, 4, 5]print (nums[0])
print (nums[1])
print (nums[2])
print (nums[3])
print (nums[4])1
2
3
4
5

For 循环使编码人员能够编写一行代码来根据需要修改任意多的项目。该方法逐个检查集合中的每一项,并执行 for 循环声明中的任何操作。for 循环的标准语法如下:

**for** number **in** [1, 2, 3, 4, 5]**:**
  1. 一词为
  2. 您选择的占位符变量名,它将引用当前正在迭代的项目
  3. 中的一词
  4. 您正在迭代的集合——可以是集合本身,如上面的示例,也可以是代表集合的变量名,如下面的示例
  5. 冒号( : )
  6. 要对集合中的每一项执行的缩进代码块

每个 for 循环都遵循这个基本结构。

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

Kelly SikkemaUnsplash 上拍摄的照片

如果您想像在第一个代码块中一样打印列表中的每个数字,使用 for 循环的代码和结果将如下所示:

nums = [1, 2, 3, 4, 5]**for** num **in** nums**:
**    print (num)1
2
3
4
5

一旦缩进块中的代码完成,它就对集合中的下一项运行,直到没有其他项。之后,缩进块之外的下一行代码将运行。

nums = [1, 2, 3, 4, 5]**for** num **in** nums**:
**    print (num)
print ("That's all folks!")1
2
3
4
5
That's all folks!

虽然使用 for 循环迭代列表、元组和集合看起来非常相似,但使用 for 循环迭代字典看起来略有不同。

字典包含键,值对,而不是单个元素。出于这个原因,我们的占位符变量名引用了当前正在迭代的项目,现在将有两个名称,一个是键的名称,一个是值的名称,用逗号分隔。默认情况下,如果我们只使用一个变量名来遍历字典,那么只有键会被选中。如果我们希望获得键值,我们必须首先获得字典的条目

players = {'Eli': 10, 'Saquon': 26, 'Odell': 13} print (players**.items()**)**dict_items**([('Eli', 10), ('Saquon', 26), ('Odell', 13)])

这里我们看到 dict_items 看起来像一个列表,其中每个项目都有两部分,即

现在,鉴于这一点:

players = {'Eli': 10, 'Saquon': 26, 'Odell': 13}**for** name **in** players**:**
    print (name)Eli
Saquon
Odell **for** name, number **in** players**.items():
**    print ("This is the name: ", name)
    print ("This is the number: ", number)
    print ("")This is the name: Eli
This is the number: 10This is the name: Saquon
This is the number: 26This is the name: Odell
This is the number: 13

正如我们所看到的,for 循环允许我们只用一行代码就对许多项执行操作,后面是我们希望对每一项执行什么操作的指示。For 循环是 Python 代码的一个重要方面,许多其他语言的代码也是如此。作为一名编码人员,你可能会处理许多不同的数据,你希望对这些数据执行相同的操作,你会经常使用 for 循环。因此,了解它们的工作原理和内部情况非常重要。

对于编码和空闲时间的妈妈们

原文:https://towardsdatascience.com/for-moms-who-code-and-the-idle-hours-72964d75d11d?source=collection_archive---------38-----------------------

我希望我拥有的超能力:心灵遥感

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

Unsplash 上由 Lacie Slezak 拍摄的照片

作为一个两个月大的漂亮宝宝的第一次妈妈,我发现自己大部分时间都被限制在尴尬和累人的位置来喂她,并帮助她放松和睡觉。那时,我最想要的超能力肯定是心灵遥控,因为一旦你处于喂食的位置,例如,如果你没有你需要的所有东西,也没有人帮助你,这取决于婴儿的情绪,你注定会盯着你试图够到的东西,而你抓不到的东西,墙,或者更糟的是,电视。这很可能是接下来的…一两个小时?乐观估计:)

我希望我拥有的超能力:心灵遥感

在经历了最初几周的疯狂、懒散和失眠后,我想我应该想出如何最大限度地利用这些安静的时间,每当我被捆住手脚,除了静静地等待什么也做不了的时候。

所以…简而言之,我需要:

  • 我的手机,因为把我的小家伙放在腿上的时候拿着笔记本电脑是不可能的(手机也必须放在安全的距离内)
  • 一些帮助我编码的东西
  • 帮助我跟上文章写作的东西
  • 帮助我学习的东西

首先:中型应用程序

几个月前,当我怀孕 7 个月的时候,我开始在媒体上写作,以便更好地理解我所知道的事情。我很享受这个过程,但是现在对我来说打开我的笔记本开始写作和研究是不可行的。回到这个话题,每当我有几分钟的时间,我都会尝试使用 Medium 的移动应用程序。这个编辑器几乎和浏览器的编辑器一样,看起来在手机上运行得很好。不过,到目前为止,我还没有找到添加标题或删除图片的方法。

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

盗梦空间!

泰尔穆克

我需要做的另一件事是在现有代码上工作,例如修复 bug 或添加特性或创造新东西。这意味着我需要一种方法在我的手机上获得我的代码,所以最简单和最合理的方法是通过版本控制工具,git,可能还有 github。我发现 Termux 很有帮助!经过几次尝试和一些搜索,才找到了存储库的保存位置,以便其他应用程序可以看到它们。

**# first of all install git**
pkg install git**# then create the projects' space and start cloning repos**
cd /storage/emulated/0
mkdir Projects
cd Projects
git clone ....exit

到目前为止,我喜欢特穆克斯!

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

Termux 接口

Python 编辑器和环境

最近我的大部分工作都是用 Python 完成的,所以我需要一些东西来帮助我处理 Python 文件。当然,我不期望在手机上运行我的项目,否则我会浪费宝贵的时间。我只需要基本的,一个编辑器,将为我提供基本的支持。快速搜索后,我想到了以下两个。

Pydroid 3

Pydroid 3 安装 Python 3,让你创建和编辑你的 Python 文件。它支持你自动完成和基本的错误和警告提示。

例如,Jinja 2 没有安装在当前的 python 环境中,所以我得到以下错误:

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

缺少库错误

但是文本换行使得阅读和操作有些困难。我不确定这是否是可配置的,我会就此回复你。例如,以下示例在正常模式下完全对齐,但在移动模式下完全对齐:

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

文本换行使得代码难以阅读

为了查看自动完成特性的有用性,我尝试了下面的简单测试:添加traceback而不导入会给出一个未定义的变量错误。但是没有提出可能的纠正建议。当您开始编写导入时,自动完成建议就开始了,例如import traceback,这很有用。但最重要的是,对于导入的模块,本例中的追溯模块,有一些建议。

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

尝试自动完成功能第 1 部分

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

尝试自动完成功能第 2 部分

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

尝试自动完成功能第 3 部分

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

尝试自动完成功能第 4 部分

我目前正在尝试付费版本,到目前为止还不错,除了在一个复杂项目的文件之间切换的困难。

qd python 3

Pydroid 3 的替代产品。我还没有时间去充分地探索它,但是,第一眼看上去,那种烦人的文本换行并不存在,代码看起来也应该如此。然而,它似乎缺乏 autoconplete,我不能很容易地导航到项目文件夹,但同样,没有足够的测试到目前为止。我在考虑用它比用 Pydroid 更容易地查看代码,但是我们会看到的。

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

没有文本换行—使内容更具可读性

学习新事物——更新旧知识

我发现我正处于一个很好的机会来更新旧的东西,比如算法和数据结构,并学习新的东西,比如用 PyTorch 进行深度学习等等。也就是说,当我没有疯狂地寻找和研究与婴儿有关的每一件小事,以及对于一个新生的☺来说什么是正常的或不正常的时候

Algorhyme

我并没有花太多时间去搜索,我只是选择了目前评论最好的应用。它有算法和数据结构的理论,以及一些非常好和有用的动画——我总是通过可视化学得更好。

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

安卓版 Kindle

我想这是一个显而易见的问题,我把去年购买的一些编程电子书加载到了我的安卓版 Kindle 上。失眠当然不会让阅读一些技术性的东西变得容易,但是有时候我思路清晰,能够阅读一些与工作相关的东西对我来说是件好事。它让我的思维活跃,好奇心增强。这也是一个积极的改变,从阅读关于婴儿猝死综合症和所有可能出错的婴儿相关的事情——是的,我就是那个人……

现在,当我头脑模糊的时候,我通过欣赏像亚历克斯·诺里斯的《哦,不》和内森·w·派尔的《T2 奇怪的星球》这样的漫画来保持头脑简单。

笔记

  • **准备好能量银行!**你的电池会比你想象的更快耗尽,而且你无法移动,记得吗?
  • 不言而喻:只要有可能就睡觉而不是让自己全神贯注于其他事情,尤其是在最初的几个月。
  • 也不言而喻:练安全。确保您的宝宝处于安全的位置,并始终 始终 关注他们。
  • 这些应用是为安卓用户准备的,但我相信 iOS 也有类似的应用。如果你知道的话,请告诉我。
  • 我花了几天的时间来写和发表这篇文章,而且我有时确实需要使用我的笔记本电脑,所以,目前完全在移动设备上做事情似乎是不可行的。但是能发表出来的感觉真好,即使是这样的速度!让我们看看我是否能做得更好。

我希望这些想法对你有所帮助。让我知道你的经历,或者你有其他的想法或建议!

保重!

真的吗?基于机器学习的汽车保险欺诈索赔检测。

原文:https://towardsdatascience.com/for-real-auto-insurance-fraud-claim-detection-with-machine-learning-efcf957b38f3?source=collection_archive---------10-----------------------

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

作者:Ice Asher Chew | linkedin.com/in/iceasherchew | github.com/iceasherchew

读者们,这篇文章是关于我做的一个关于汽车保险欺诈索赔检测的项目,使用了许多不同的分类器和集成器。这篇文章可能会引起一些公司的兴趣,这些公司正在研究将机器学习作为一种方法来对少数民族班级或正在做类似项目的学生进行分类。请查看我的 GitHub 以获取代码和更详细的报告,我在其中详细介绍了数据清理、EDA 和其他组件。

链接到代码:

https://github . com/iceasherchew/Asher-github/tree/master/Handling % 20 不平衡% 20classes _ auto % 20insruance %欺诈

问题陈述

这个项目的目标是建立一个可以检测汽车保险欺诈的模型。机器学习中欺诈检测背后的挑战是,与合法的保险索赔相比,欺诈远不常见。这类问题被称为不平衡分类。欺诈是不道德的,是公司的损失。通过建立一个可以对汽车保险欺诈进行分类的模型,我能够为保险公司减少损失。亏损越少,收益越多。

与业务的相关性:

不平衡的阶级问题在很多行业都很普遍。很多时候,我们感兴趣的是一个少数阶级,而不是另一个大得多的阶级。例如,对其他类型的欺诈进行分类、对有缺陷的商品进行分类、对处于危险中的青少年进行分类、识别高潜力雇员、识别恐怖分子等相关人员等等。

成功的标准:

该模型应该能够在它没有看到的数据集上准确地分类索赔是否是欺诈。这通过 F1 得分来衡量,并与 F1 的基线天真预测值 0.397 进行比较。ROC 曲线下面积(ROC AUC)也将作为次要标准在模型选择中加以考虑,因为区分欺诈和合法索赔非常重要。这是因为对欺诈的调查既耗时又昂贵,甚至可能对客户体验产生负面影响。作为强制性标准,ROC AUC 必须高于 0.50。最重要的是,我的目标是 ROC AUC 至少为 0.70。

保险诈骗背景:

保险欺诈是保险公司或代理人为获取经济利益而故意实施的欺骗行为。申请人、投保人、第三方索赔人或为索赔人提供服务的专业人员可能在交易的不同环节实施欺诈。保险代理人和公司员工也可能实施保险欺诈。常见的欺诈包括“填充”,或夸大索赔;在保险申请中歪曲事实;提交从未发生的伤害或损害的索赔;制造事故。

联邦调查局估计,保险欺诈的总成本(不包括健康保险)每年超过 400 亿美元。
汽车保险欺诈的范围很广,从在保险申请中歪曲事实、夸大保险索赔,到策划事故、提交从未发生的伤害或损坏的索赔表,再到虚报被盗车辆。

根据保险研究委员会(IRC)的一项研究,欺诈占 2012 年汽车保险人身伤害总索赔额的 15%至 17%。该研究估计,2012 年,汽车保险人身伤害赔付中有 56 亿至 77 亿美元被欺诈,而 2002 年的数字为 43 亿至 58 亿美元。

目前的研究旨在对索赔引起的汽车保险欺诈进行分类。该数据集中没有披露欺诈的类型,可能是虚假报告、夸大索赔、策划事故或提交从未发生的损害或伤害的索赔表。

来源:https://www.iii.org/article/background-on-insurance-fraud

行动纲要

这个项目的目标是建立一个可以检测汽车保险欺诈的模型。机器学习中欺诈检测背后的挑战是,与合法的保险索赔相比,欺诈远不常见。这类问题被称为不平衡分类。

用处理不平衡数据集的不同方法测试了几个模型。顶级模特也穿着不同的套装进行试衣和测试。

最终拟合的模型是一个加权 XGBoost,其 F1 值为 0.72,ROC AUC 值为 0.84。该模型的表现远好于基线 F1 评分 0.397 和 ROC AUC 目标 0.7。该模型的 F1 评分和 ROC AUC 评分是其他模型中最高的。总之,该模型能够以较高的准确度正确区分欺诈索赔和合法索赔。

在建模之前,数据是干净的,并进行探索性数据分析。之后,数据被预处理用于建模。建模后,评估模型,并使用 F1 评分和 ROC AUC 评分选择最佳拟合模型。进一步详细讨论了最终拟合模型的性能,并展示了其主要特征。该项目最后重申了研究的重要性和已经完成的工作,并提出了一些限制。

关于数据集

数据来源:【https://www.kaggle.com/roshansharma/insurance-claim

这个项目的灵感是对不平衡类数据集进行分类,特别是欺诈。欺诈数据集非常难以获得,并且由于其敏感性,通常是未标记的。

当前数据集用 n=1000 个样本标记。与许多其他数据集不同,这个数据集不太受欢迎,只有作者和另一个人在 Kaggle 上有一个笔记本,这使得这个数据集在本质上相当新颖。该数据集包括从 2015 年 1 月 1 日到 2015 年 3 月 1 日来自俄亥俄州、伊利诺伊州和印第安纳州的 1000 起汽车事故和汽车保险索赔。在任何清理或特征工程之前,数据集总共有 39 个变量。没有说明这个数据是来自多家保险公司还是只有一家公司。但是,在整个报告中,将使用“保险公司”来指代这些数据的来源。

这个数据集的明显缺点是样本量小。但是,仍然有很多公司没有大数据集。对于任何希望转型到利用数据科学的公司来说,利用可用资源的能力至关重要。在 2017 年 MIT tech review,EmTech 演示中,吴恩达教授在白板上写下了一个循环图,并解释说,许多公司从一些小数据开始,开发一个拥有用户的产品,这反过来导致更多产品的产生。类似地,公司可能从一个小的数据集开始,随着时间的推移,建立一个更大的数据集。与等待拥有庞大数据集的那一天的公司相比,从小型数据集开始并处理它的公司更有可能在数据科学之旅中更早成功并获得回报。

探索性数据分析

查看我的 GitHub 获取更多详细的 EDA

因变量
从因变量 Fraud_reported 开始进行探索性数据分析。有 247 起欺诈事件,753 起非欺诈事件。24.7%的数据是欺诈性的,而 75.3%是非欺诈性的索赔。

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

变量间的相关性
接下来,检查连续变量(序数、区间/比率变量)间的相关性。为 Pearson 相关系数至少为 0.3 的变量绘制热图,包括 DV。

客户的月份和年龄的相关系数为 0.92。可能是因为司机在拥有一辆车时购买了汽车保险,而这一时间尺度只会随着年龄的增长而增加。

事故严重性和不同类型的索赔有明显的相关性($ r $ = 0.36–0.50)

除此之外,数据中似乎没有太多的相关性。
似乎不存在多重共线性问题,除了可能所有索赔都是相关的,并且总索赔已经说明了它们。
但是,其他索赔提供了一些粒度,否则总索赔将无法获取这些粒度。因此,这些变量被保留下来。

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

将变量相对于 DV
可视化,绘制 DV 分割的每个变量的计数。下面是几个值得注意的情节。

我一点也不怀疑欺诈在不同的爱好中有所不同。看起来棋手和异装癖者有更高的欺诈倾向。我停下来想,这项运动是否会让人倾向于欺诈,或者有这种倾向的人会被它吸引

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

重大事件的严重性似乎是欺诈案例最高,超过了非欺诈案例。

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

从索赔总额的平均值来看,欺诈索赔似乎比非欺诈索赔多。

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

索赔损失

在这里,我将损失定义为从保险公司流出的钱。另一方面,收入来源是保险费。虽然我们知道保费和索赔不是保险公司资金进出的唯一来源,但这两个变量是我们从该数据集中获得的唯一信息。通常,其他资金流动的来源可能是保险公司的投资。

我创建了一个变量来衡量索赔额减去客户支付的保费,以显示索赔损失。正数表示亏损,负数表示盈利。每次索赔金额超过客户支付的总保费时;这是保险公司的损失。

2015 年,保险公司通过欺诈索赔损失了 8,198,060.09 美元。诈骗的平均损失为 43752.03 美元 (M = 43752.03,SD = 21812.68) ,多了 10383.35 美元 (p < .001) 。比通过合法债权的平均损失 (M = 33368.68,SD = 29690.41)

请注意,这不是保险公司赚的钱,因为数据集只显示事故索赔。

在美国,过去发生过失事故的全国平均数大约是 12%的车主。

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

预处理

DV,fraud_reported 编码为 1 代表欺诈,0 代表非欺诈。

创建了六个交互术语。财产索赔金额和事故严重程度、车辆索赔金额和事故严重程度、伤害索赔金额和事故严重程度、总索赔金额和事故严重程度、保单年度保费和总索赔金额、总限额和总索赔金额之间的相互作用。

名义变量被一次性编码,数据集被分成 75%的训练集和 25%的测试集,根据欺诈报告进行分层。

基线分数

由于我们的数据集是不平衡的,准确性不是衡量成功的好标准。高精度可以通过仅选择多数类的差模型来实现,因此,不检测和测量对感兴趣的类进行分类的精度。事实上,仅预测多数类将给出 75%的准确性,100%的特异性,但灵敏度为 0%。

如果我们天真地预测所有索赔都是欺诈,因此没有欺诈逃过我们的监视,我们的得分如下所示:

-灵敏度:1.0
-特异性:0.0
-精确度:0.248

  • F1 得分:0.397
  • ROC AUC 得分:0.50

因为目标是识别尽可能多的欺诈,所以 F1 分数 0.397 被用作基线。然而,对欺诈的调查可能既费时又费钱,甚至可能影响客户体验。因此,ROC AUC 分数也将用于衡量我们如何区分欺诈和合法索赔。基线 ROC AUC 得分为 0.50。我的 ROC AUC 至少为 0.70。

建模

在这个项目中使用了五种不同的分类器:
-逻辑回归
-K-最近邻
-随机森林

  • XGBoost
  • AdaBoost

使用随机搜索对所有模型进行超参数调整和选择。由于运行的参数和模型的数量,与 gridsearch 相比,RandomizedSearch 是一个更快更有效的选择。

在 10 倍随机化搜索 CV 之后,模型及其选择的超参数被拟合在训练集上。

计算随机化搜索 CV 的最佳估计值的平均准确度分数、训练集的准确度分数和测试集的准确度分数。然后,计算灵敏度、特异性、精确度、F1 评分和 ROC AUC 评分。

查看 RandomizedSearch 与 GridSearch 的实验链接(剧透:RandomizedSearch 在 10、50、100、500 次试验中获胜,时间和成本函数值不同,但情况并非总是如此):

https://towardsdatascience . com/random-search-vs-grid-search-for-hyperparameter-optimization-345 e 1422899d

本节讨论不同的模型块是如何运行的。对模型的评估将是评估部分。

1.具有类别加权和超参数调整的模型

如上所述的五个分类器用超参数调谐来运行。具有类别加权选项的模型将类别加权作为该模型块中的超参数之一。也就是说,随机搜索将测试加权和非加权模型,以查看哪一个表现更好。

使用类权重的最佳实践是使用训练数据集中存在的类分布的逆分布。例如,测试数据集的类分布是少数类与多数类的比例为 1:100。这个比率的倒数可以用 1 表示多数阶级,用 100 表示少数阶级;例如:{0:1.0,1:100.0}。在我们的例子中,类权重是{0:0.246667,1:0.75333}。在 XGBoost 中,类权重的定义是不同的。XGBoost 使用比例正权重,即负样本总数除以正样本总数。对于不平衡的二元分类数据集,负类是指多数类(类 0),正类是指少数类(类 1)。在此分析中,按比例调整的正权重为 3.054。

2.使用 SMOTE 进行过采样建模

五个分类器在 SMOTE 数据集上运行,具有超参数调整。SMOTE 的工作方式是选择特征空间中接近的示例,在特征空间中的示例之间画一条线,并在沿着该线的一点处画一个新的样本。具体来说,首先从少数类中随机选择一个例子。则找到该示例的 k 个最近邻居(通常 k=5)。选择随机选择的邻居,并且在特征空间中的两个示例之间的随机选择的点处创建合成示例。仅对训练集进行过采样。在 SMOTE 之后,欺诈和非欺诈在训练集中有 565 个样本。由于 SMOTE 是为处理不平衡的类而设计的,所以没有对类进行加权。

3.使用 ADASYN 进行过采样建模

ADASYN 和 SMOTE 做的一样,只是有一点小的改进。创建这些样本后,它会在点上添加一个随机的小值,从而使其更加真实。换句话说,不是所有样本都与母体线性相关,而是样本中有更多的方差和噪声,而且有点分散。ADASYN 过采样只对训练集进行。在 ADASYN 之后,欺诈和非欺诈都在训练集中有 565 个样本。五个分类器在 ADASYN 数据集上运行,并进行超参数调整。

4。使用自举进行过采样建模

与 SMOTE 或 ADASYN 不同,bootstrap 从现有的发行版中提取数据,不会创建合成数据。因此,数据只是对现有数据的简单重复,而且被许多人认为不那么有偏见。Bootstrap 过采样是通过从现有欺诈数据集中随机抽取替换数据进行的,直到欺诈和非欺诈的样本量相同,均为 565。Bootstrap 只在训练集上进行。五个分类器在自举数据集上运行,具有超参数调整。

集合模型

机器学习中的集成模型组合来自多个模型的决策,以提高预测的整体性能和稳定性。

在集合之前,运行预测的相关性。XGB、Random forest 和 AdaBoost 具有高相关性,可能因为它们都是 CARTs(分类和回归树)。除此之外,模型似乎捕捉到了特征空间的不同方面,正如它们预测的小至平均相关性(皮尔逊试探法)所示。

通过学习结合它们各自的优势,一个集合可能能够胜过任何单一的模型。然而,我们为集合选择的模型不应该高度相关。否则,我们的模型将无法解释独特的变化,因此,不太可能改善。集成模型将使用最佳逻辑回归、KNN 以及 XGB、随机森林和 AdaBoost(集成 3 模型)中的最佳者,基于来自具有类别加权的模型、通过 SMOTE 过采样的模型、ADASYN 和 Bootstrapping 的 F1 分数。

选择的树模型有:
-带 SMOTE 的逻辑回归(F1: 0.41)
-带 bootstrapping 的 KNN(F1:0.42)
-加权 XGBoost (F1: 0.72)

1.无过采样的最大投票

最大投票法一般用于分类问题。在这种技术中,使用多个模型来预测每个数据点。每个模型的预测被认为是一次“投票”。我们从大多数模型中得到的预测被用作最终预测。这三个选定的模型在投票分类器中组合在一起。

进行 10 重交叉验证,打印其平均分数,然后计算训练和测试准确度分数。然后,计算灵敏度、特异性、精确度、F1 评分和 ROC AUC 评分。

2.过采样下的最大投票

因为在这个项目中,自举总体上比其他过采样技术产生了最好的 F1 分数,所以它在这里被用于最大投票集合。在训练集被引导之后,该过程与没有过采样的最大投票相同

3.无过采样混合

在混合方法的第一步中,训练集被分为两部分,即新的训练集和称为验证集的维持集,两者的比例分别为 75:25。混合方法将 3 个选定的模型拟合到新的训练集,并同时对验证集和测试集进行预测。验证集的 3 个不同预测堆叠成一个长列。对测试集的预测也是如此。然后,将元模型(在这种情况下为逻辑回归)拟合到堆叠的验证预测上,并在堆叠的测试预测上评分。

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

进行 10 重交叉验证,打印其平均分数,然后计算训练和测试准确度分数。然后,计算灵敏度、特异性、精确度、F1 评分和 ROC AUC 评分。

关于混合的更多信息:

Blending 是网飞竞赛获胜者引入的一个词。它与叠加综合密切相关,但更简单,信息泄露的风险也更小。

一些研究人员和数据科学家交替使用“堆叠集合”和“混合”。通过混合,您可以创建定型集的一个小型维持集,而不是为定型集创建折叠外预测。然后,预测被用作特征,并且元模型(通常是线性模型)被用于进行最终和实际的评分和预测。该模型中使用的元模型是逻辑回归。

4.混合过采样

因为在这个项目中,自举一般来说比其他过采样技术产生最好的 F1 分数,所以它在这里被用于混合系综。在训练集被引导之后,该过程与没有过采样的混合集成相同

估价

交叉验证准确度分数、训练集准确度分数、测试集准确度分数、灵敏度、特异性、精确度、F1 分数和 ROC AUC 如下表所示进行计算和打印。

观察结果:

  • 通过比较非过采样数据集、SMOTE 数据集、ADASYN 数据集和 bootstrapped 数据集上拟合的模型,我选择了最佳的逻辑回归、KNN 和 CART 模型。
  • 最佳逻辑回归模型是在 SMOTE 数据集上训练的模型。它的 F1 值为 0.41,AUC 为 0.64
  • 最好的 KNN 模型是在 bootstrap 数据集上训练的模型。它的 F1 值为 0.42,AUC 为 0.60。
  • CARTs 在这个数据集上表现非常好。然而,由于购物车的预测都是高度相关的,所以选择了其中最好的。最好的 CART 模型是没有过采样的数据集上的加权 XGBoost。它产生 0.72 的 F1 分数和 0.84 的 AUC。
  • 总的来说,与其他过采样方法相比,自举方法似乎具有最好的 F1 分数。
  • 在自举数据集上训练的 max voting 模型在所有集成模型中表现最好,F1 得分为 0.55,AUC 为 0.77。
  • 在没有过采样的数据集上,集成模型并不比加权 XGBoost 表现得更好。这可能是因为 XGBoost 和另外两个选择的模型的分数差异很大,并且它的分数已经很高了。其他 2 个模型的 F1 和 AUC 分数低得多,因此可能会影响整体性能。相反,当所有模型表现一般时,集成模型可能表现得更好。

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

最终模型:加权 XGBoost

最终拟合的模型是没有过采样的数据集上的加权 XGBoost。模型的最佳估计量如下:

-Scale _ pos _ weight:3.054054054054054,

  • Reg_lambda (L2 正则化权重):0.1,
  • Reg_alpha (L1 正则化权重):0.05,
    -N _ estimates:550,
  • Max_depth: 6,
  • Gamma: 3,
  • Eta: 0.05

有关这些参数的更多信息,请访问:https://xgboost.readthedocs.io/en/latest/parameter.html

更多关于 XGBoost 的信息请见陈天琦(XGB 主要作者)讲座:&feature = emb _ logo

最终拟合模型的性能

该模型的训练精度得分为 0.967,测试精度为 0.844。高准确度分数暗示了低偏倚(这只是一个暗示,因为在不平衡类问题中准确度不是偏倚的良好量度)。
训练和测试之间 0.123 的准确度分数差异相对较小。因此,这个模型可以说具有低方差,并且可以在看不见的数据上推广。

下面的混淆矩阵中显示了测试集的每个类别的案例数。y 轴显示实际类别,而 x 轴显示预测类别。
测试集总样本量的百分比打印在每个象限上。

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

分类报告摘要如下。

敏感性(欺诈案例的回忆)源自:

  • 真阳性/(真阳性+假阴性)
  • 敏感度总结了我们的真实阳性率,即在所有阳性病例中我们有多少是正确的。
  • 最终模型的灵敏度为 81%。

特异性(非欺诈案例的回忆)源自:

  • 真阴性/(真阴性+假阳性)
  • 特异性概括了我们真正的阴性率,也就是在所有阴性病例中我们得到了多少正确答案。
  • 最终模型的特异性为 86%

欺诈案例的精确度来自:

  • 真阳性/(真阳性+假阳性)
  • 欺诈案例的准确性总结了检测到的欺诈案例的准确性。也就是说,在我预测的所有欺诈中,有多少是正确的。
  • 欺诈检测的准确率为 65%。

非欺诈案例的精确度来自:

  • 真阴性/(真阴性+假阴性)
  • 非欺诈案例的准确性总结了检测到的非欺诈案例的准确性。也就是说,在我预测的所有非欺诈中,有多少是正确的。
  • 非欺诈检测的准确率为 93%。

F1 分数是召回率和精确度的调和平均值,其来源于

  • (2 倍查全率 x 查准率)(查全率+查准率)
  • 由于我们对欺诈案例感兴趣,因此只报告欺诈案例的 F1 分数。
  • 该模型的 F1 分数为 72%。

总之,这个模型远远超过了 F1 的基准分数。

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

下面的 ROC 曲线总结了我们的模型在真阳性率(灵敏度)和假阳性率(1-特异性)之间的平衡程度。理想情况下,我们希望预测欺诈的真实阳性率为 100%,预测非欺诈的真实阴性率为 100%(或 0%的假阳性,即 100% — 100%的真实阴性率)。这意味着我们对两个类都有完美的预测。然而,在不平衡类问题中,这在现实世界中极难实现。除此之外,在真阳性率和真阴性率以及相反的假阳性率之间有一个交易。
该图总结了我们在真阳性和假阳性率的每个阈值下区分两个类别的能力。曲线下面积用作此指标的汇总百分比。总之,该模型远远超过了基线 ROC AUC 得分。

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

尽管我们的模型在预测非欺诈案例时表现更好,但该模型在预测欺诈案例时表现也非常好。我们有比逃避检测的欺诈更高的错误警报。在我们的情况下,识别更多的欺诈比让欺诈案件逃脱检测要好。因此,该模型成功地实现了检测欺诈索赔的目的。与牺牲太多资源进行调查并阻碍客户体验的基线模型不同,我们也能够在该模型中平衡这一点。我们可以检测到更多的欺诈行为,并且能够通过正确预测非欺诈案件来平衡这一点。

顶级功能

重要性提供了一个分数,该分数指示每个特征在模型内的增强决策树的构造中的有用性或价值。在决策树中,一个属性被用来做关键决策的次数越多,它的相对重要性就越高。这种重要性是为数据集中的每个属性显式计算的,允许对属性进行排序和相互比较。

体重(点击图片可放大):

使用某个特征在所有树上分割数据的次数。XGBoost 中专门实现的最后一项措施是计算受基于特性的分割影响的样本数。

下图根据权重总结了按功能重要性排名的前 20 名。有象棋、越野赛等爱好的司机似乎更容易作弊。事故严重程度和财产索赔也是最高的。保费和总索赔额、车辆索赔额和事故严重性等交互术语也是权重最高的特征。

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

增益(点击图像放大):

它有时被称为“基尼重要度”或“平均减少杂质”,并被定义为在集合的所有树上平均的节点杂质的总减少量(由到达该节点的概率加权(由到达该节点的样本的比例近似))。

下图根据权重总结了按功能重要性排名的前 20 名。事故严重性再次成为最重要的因素之一。当考虑杂质的平均减少时,诸如国际象棋和交叉健身等爱好也在最重要的特征之列。总索赔和事故严重性等交互术语也是主要特性。

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

结论和局限性

根据保险研究委员会(IRC)的一项研究,欺诈占 2012 年汽车保险人身伤害总索赔额的 15%至 17%。该研究估计,2012 年,汽车保险人身伤害赔付中有 56 亿至 77 亿美元被欺诈,而 2002 年的数字为 43 亿至 58 亿美元。

这个项目建立了一个可以检测汽车保险欺诈的模型。这样,该模型可以减少保险公司的损失。机器学习中欺诈检测背后的挑战是,与合法的保险索赔相比,欺诈远不常见。

在这个项目中使用了五种不同的分类器:逻辑回归、K-最近邻、随机森林、XGBoost、AdaBoost。用这五个分类器测试了处理不平衡类的四种不同方式:具有类加权和超参数调整的模型、具有 SMOTE 的过采样、具有 ADASYN 的过采样和具有 bootstrapping 的过采样。在此基础上,建立了两个最大投票群体。一个在训练集上,一个在引导训练集上。还执行了两个混合系综。一个在训练集上,一个也在引导训练集上。

最佳和最终拟合模型是加权 XGBoost,其 F1 值为 0.72,ROC AUC 为 0.84。该模型的表现远好于基线 F1 评分 0.397 和 ROC AUC 目标 0.7。该模型的 F1 评分和 ROC AUC 评分是其他模型中最高的。总之,该模型能够以较高的准确度正确区分欺诈索赔和合法索赔。

这项研究并非没有局限性。首先,本研究受到样本量小的限制。数据集越大,统计模型越稳定。它也更容易概括,因为它占实际人口的比例更大。此外,数据仅涵盖 2015 年 1 月 1 日至 2015 年 3 月 1 日 3 个州的事故索赔。这意味着我们不知道没有发生事故的汽车保险投保人与发生事故的投保人的比例。我们还局限于两个月之间的事件,这可能不是一年中的准确情况。这一点很重要,因为一年中的某些时间可能与较高的事故率相关,如圣帕特里克节或其他假期。未来的研究可能会调查获取一个更大的多年数据集。然而,由于欺诈的敏感性和此类数据中的机密信息,这可能仍然是一个挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值