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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

带有 Amazon SageMaker、Lambda 和 AWS 阶跃函数的简单 Data Science SDK

原文:https://towardsdatascience.com/simple-mlops-with-amazon-sagemaker-lambda-and-aws-step-functions-data-science-sdk-e8052825a56c?source=collection_archive---------13-----------------------

使用 AWS 上的无服务器组件构建您自己的 ML CI/CD 管道。

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

斯特凡·纳图、T2、史瑞亚斯·苏布拉曼尼安、李庆伟

介绍

随着机器学习领域的成熟,越来越需要简单的方法来自动化 ML 管道并将其部署到生产中。随着数据科学平台的爆炸式增长,公司和团队经常使用不同的机器学习平台进行数据探索、提取-转换-加载(ETL)作业、模型训练和部署。在这篇博客中,我们描述了用户如何使用 Docker 自带算法代码来构建训练和推理图像,使用 Amazon SageMaker 和 AWS StepFunctions 来训练和托管他们的模型。我们使用 Mask R-CNN,这是一种非常流行的实例分割模型,用于许多计算机视觉用例,如[1]。希望亲自了解这篇博客内容的读者可以参考我们的Github【2】。

使用的 AWS 服务

**AWS code build:**AWS code build 是一个完全托管的持续集成(CI)服务,允许用户将代码编译和打包成可部署的工件。在这里,我们将使用 CodeBuild 将我们的自定义 Mask R-CNN 容器打包到 Docker 映像中,我们将该映像上传到 Amazon Elastic Container Registry(ECR)

**AWS Lambda:**AWS Lambda 是一种服务,它允许您在不提供服务器的情况下运行代码。这里我们将使用 AWS Lambda 来部署一个代码构建作业。

**AWS step functions:**AWS step functions 是一个编排工具,允许用户构建管道并将微服务协调到工作流中。然后,AWS StepFunctions 可以以事件驱动的方式触发该工作流,而无需用户管理任何底层服务器或计算机。

亚马逊 SageMaker: 亚马逊 SageMaker 是一个完全托管的机器学习平台,用于构建、训练和部署机器学习模型。在这里,我们使用 Amazon SageMaker 编写培训和模型部署作业,使用 SageMaker Jupyter 笔记本编写 StepFunctions 工作流。

创建一个屏蔽 R-CNN 容器

因为我们在培训或托管中运行相同的映像,所以 Amazon SageMaker 用参数trainserve运行您的容器。当 Amazon SageMaker 运行训练时,你的train脚本就像一个普通的 Python 程序一样运行。托管与训练有着非常不同的模型,因为托管是对通过 HTTP 传入的推理请求做出响应。在这个例子中,我们使用我们推荐的 Python 服务栈来提供推理请求的健壮和可伸缩的服务:

集装箱

在“container”目录中,是您打包 Amazon SageMager 的示例算法所需的所有组件。

├── Dockerfile
    ├── build_and_push.sh
    └── mask_r_cnn
        ├── nginx.conf
        ├── predictor.py
        ├── serve
        ├── wsgi.py
        ├── transforms.py
        ├── utils.py
        ├── coco_eval.py
        ├── coco_utils.py
        ├── engine.py
        └── helper.py

让我们依次讨论这些问题:

  • **Dockerfile**描述如何构建 Docker 容器映像。更多细节见下文。
  • **build_and_push.sh**是一个脚本,它使用 docker 文件来构建你的容器图像,然后将其推送到 ECR。我们将在本笔记的后面直接调用这些命令,但是您可以复制并运行您自己算法的脚本。
  • **mask_r_cnn**是包含将要安装到容器中的文件的目录。

在这个简单的应用程序中,我们只在容器中安装了五个文件。我们将放入容器的文件是:

  • **nginx.conf**是 nginx 前端的配置文件。通常,您应该能够照原样接受这个文件。
  • **predictor.py**是实际实现 Flask web 服务器和该应用程序的决策树预测的程序。
  • **serve**容器启动托管时程序是否启动。它只是启动 gunicorn 服务器,运行在predictor.py中定义的 Flask 应用程序的多个实例。您应该能够照原样接受这个文件。
  • **train**是运行容器进行训练时调用的程序。
  • **wsgi.py**是一个用来调用 Flask app 的小包装器。您应该能够照原样接受这个文件。

我们已经定制了train.pypredictor.py用于在训练期间微调掩码 R-CNN,以及用于加载调整后的模型、反序列化请求数据、进行预测和发送回序列化结果。

文档文件

Dockerfile 文件描述了我们想要构建的图像。我们将从一个标准的 Ubuntu 安装开始,运行普通的工具来安装所需的东西,比如 python、torch、torchvision 和 Pillow。最后,我们将实现特定算法的代码添加到容器中,并设置合适的运行环境。docker 文件如下所示,

FROM ubuntu:16.04MAINTAINER Amazon AI <sage-learner@amazon.com> RUN apt-get -y update && apt-get install -y --no-install-recommends \
         wget \
         gcc\
         g++\
         python3 \
         python3-dev\
         nginx \
         ca-certificates \
    && rm -rf /var/lib/apt/lists/* RUN wget [https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py) && python3 get-pip.py && \
    pip install cython numpy==1.16.2 scipy==1.2.1 pandas flask gevent gunicorn && \
        (cd /usr/local/lib/python3.5/dist-packages/scipy/.libs; rm *; ln ../../numpy/.libs/* .) && \
        rm -rf /root/.cache
RUN pip install  torch torchvision fastai thinc  PillowENV PYTHONUNBUFFERED=TRUE
ENV PYTHONDONTWRITEBYTECODE=TRUE
ENV PATH="/opt/program:${PATH}"# Set up the program in the image
COPY mask_r_cnn /opt/program
WORKDIR /opt/program

使用 AWS Lambda 和 CodeBuild 构建您的映像

SageMaker 集装箱项目

为了构建 SageMaker-ready 容器,比如上面讨论的 Mask R-CNN,我们使用开源的“SageMaker 容器”项目,可以在 https://github.com/aws/sagemaker-containers这里找到。SageMaker Containers 为您提供了创建 SageMaker 兼容的 Docker 容器的工具,并提供了用于创建框架的附加工具(可以运行任意 Python 或 shell 脚本的 SageMaker 兼容的 Docker 容器)。目前,这个库被以下容器使用: TensorFlow 脚本模式MXNetPyTorchChainerScikit-learn 。要创建 Sagemaker 兼容容器,我们需要以下组件:

  1. train.py 文件和您的培训代码,以及
  2. Dockerfile,如上图所示

训练脚本必须位于文件夹/opt/ml/code下,其相对路径在环境变量SAGEMAKER_PROGRAM中定义。支持以下脚本:

  • Python 脚本:将 Python 解释器用于任何带有。py 后缀
  • Shell 脚本:使用 Shell 解释器来执行任何其他脚本

当训练开始时,解释器执行上面例子中的入口点:

python train.py

关于超参数和环境变量的更多信息,请参考https://github.com/aws/sagemaker-containers#id10

使用 Lambda 和 CodeBuild 自动化容器构建

我们将使用云形成模板来自动化我们的掩模 R-CNN 的容器构建。该模板建立了以下体系结构:

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

Lambda 函数包含可以内联编辑的 train.py 文件和 Dockerfile 文件。一旦触发(手动或通过下一节所示的阶跃函数方法),Lambda 函数:

  1. 创建一个 ECR 存储库(如果还不存在的话),用于存储构建后的容器映像
  2. 将 train.py 和 docker 文件上传到 S3 存储桶
  3. 创建一个 Codebuild 项目,并使用上述带有 buildspec.yml 的文件来启动构建容器的过程,将映像推送到 ECR。

Lambda 函数还包含有用的环境变量,可以针对新的构建进行重新配置。

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

使用 AWS Step 函数 Data Science SDK 训练和部署您的容器

一旦 Lambda 函数设置完毕,我们现在就可以构建自动化管道来训练和部署模型到端点。为此,我们将使用 AWS Step Functions,这是一个编排工具,它允许用户将状态机作为 JSON 对象创作并执行它们,而无需提供或管理任何服务器。Step Functions 现在还提供了一个数据科学 Python SDK,用于在熟悉的 Jupyter 笔记本环境中使用 Python 创作机器学习管道。我们建议读者参考 Github 存储库的 Step Functions 来开始[3]。

这里我们简单演示一下我们的 Github [2]中详细描述的管道的关键组件。为了编写代码,我们将使用 Amazon SageMaker,AWS 完全管理的机器学习平台。

与所有 AWS 服务一样,我们首先需要提供适当的 IAM 服务权限来调用其他 AWS 服务。为此,我们首先需要允许 Amazon SageMaker 调用 Step 函数 API,并允许 AWS Step 函数调用 SageMaker 进行模型训练、端点创建和部署。[3]中详细介绍了如何设置正确的 IAM 凭证。

一旦设置好,我们将首先创建一个 Lambda 状态来运行 Lambda 函数,该函数获取代码并将其作为容器部署到 ECR 中。

lambda_state = LambdaStep(
    state_id="Calls CodeBuild to Build Container",
    parameters={  
        "FunctionName": "Docker_Lambda", #replace with the name of the Lambda function you created
        "Payload": {  
           "input": "HelloWorld"
        }
    }
)lambda_state.add_retry(Retry(
    error_equals=["States.TaskFailed"],
    interval_seconds=15,
    max_attempts=2,
    backoff_rate=4.0
))lambda_state.add_catch(Catch(
    error_equals=["States.TaskFailed"],
    next_step=Fail("LambdaTaskFailed")
))

这里添加了重试和捕获步骤,用于错误处理。您可以用您的自定义错误处理步骤来修改这些,但是如果 Lambda 函数未能部署容器,这将让步骤函数知道结束工作流。

接下来的步骤是将训练任务和来自已训练工件的模型创建链接在一起。幸运的是,Step Functions Data Science SDK 提供了将这些步骤链接在一起的逻辑和 API,以及可能需要的任何自定义分支逻辑。

train_step = TrainingStep('Train Step',
estimator=maskrcnn,
data=os.path.dirname(data_location),
job_name=execution_input['JobName'])model_step = ModelStep('Save model',
model=train_step.get_expected_model(),
model_name=execution_input['ModelName'])endpoint_config_step = EndpointConfigStep(
    "Create Endpoint Config",
    endpoint_config_name=execution_input['ModelName'],
    model_name=execution_input['ModelName'],
    initial_instance_count=1,
    instance_type='ml.m5.large'
)endpoint_step = EndpointStep("Create Endpoint",
endpoint_name=execution_input['EndpointName'],
endpoint_config_name=execution_input['ModelName'])

在这里,我们使用我们的 mask-rcnn 估计器,它是一个通用的 SageMaker 估计器对象,允许我们指定我们想要在其上训练我们的模型的实例的类型,识别任何网络或安全设置(如果需要)和模型超参数,以及模型的输出路径。估计器的输入是由上面的 Lambda 函数创建的容器图像。

maskrcnn = sagemaker.estimator.Estimator(image,
                       role, 1, 'ml.p2.xlarge', #feel free to modify with your own. A cost estimate is provided in Readme.
                       output_path="s3://{}/{}/output".format(sess.default_bucket(), key),
                       sagemaker_session=sess)maskrcnn.set_hyperparameters(num_epochs = 1,
                              num_classes = 2)

通过使用 Chain 实用程序,我们可以将上述所有步骤串联起来,按顺序进行。然后,我们可以选择将整个工作流输出为 JSON,例如,可以在更大的云形成模板中使用,该模板还包括关于实例供应、网络安全设置等的信息。,或者自行运行。通过创建工作流和呈现图形,将在 Amazon Step Functions 控制台中创建一个状态机。

workflow_definition = Chain([
    lambda_state,
    train_step,
    model_step,
    endpoint_config_step,
    endpoint_step
])# Next, we define the workflow
workflow = Workflow(
    name="MyWorkflow-BYOC-MaskRCNN-{}".format(uuid.uuid1().hex),
    definition=workflow_definition,
    role=workflow_execution_role
)workflow.render_graph()

这将呈现以下输出:

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

这就完成了我们的步骤功能工作流程。我们现在可以直接在 Amazon SageMaker
中执行这个工作流,并使用 workflow.execute 和 workflow . render _ progress()API 或直接从 Step Functions 控制台检查进度。执行将被记录在 CloudWatch 中,并可用于在下游系统中向用户发送警报和通知。

借助 AWS Step Functions Data Science SDK,数据科学家和工程师可以无缝部署定制容器、训练 ML 模型并将其部署到生产中。为了将其他 AWS 大数据工具(如 EMR 和 AWS Glue)集成到 Step Functions 工作流中,我们建议读者参考[4,5]。

参考

[1] He,k .,Gkioxari,g .,Dollar,p .,Girshick,R .,Mask R-CNN,https://arxiv.org/abs/1703.06870.
【2】https://github . com/AWS-samples/AWS-step functions-byoc-mlops-using-data-science-SDK
【3】https://github . com/aw slats/Amazon-sagemaker-examples/tree/master/step-functions-data-science-SD

“拉平曲线”和“解除锁定”的简单建模

原文:https://towardsdatascience.com/simple-modeling-of-flattening-the-curve-and-lifting-lockdown-1a774a248e68?source=collection_archive---------25-----------------------

一个基本流行病学模型的简单 Python 脚本,用于演示社交距离的影响,以及如果封锁解除得太快会发生什么。

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

图片:(作者用 Pixabay 免费图片和编程制作)

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

介绍

新冠肺炎——自二战以来最大的全球性危机和自 1918-1919 年西班牙流感以来最大的全球性疫情今天降临在我们身上。每个人都在关注死亡人数的每日上升,以及这种新型病毒的快速指数传播。

数据科学家,像其他各行各业的许多人一样,也可能感到焦虑。他们可能也渴望看到自己是否能为抗击这种高传染性病原体做出贡献。

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

来源: Pixabay(免费用于商业用途)

数据科学家和统计建模专业人员可以通过许多途径为这项事业做出贡献。在几乎所有情况下,他们都应该与领域专家密切合作——病毒学家、医疗保健专家、流行病学家。没有这种积极的合作和团队精神,开展预测性建模或预测疾病传播和缓解努力的项目是危险和无意义的。

正如广受欢迎的数据建模网站 Five-38 所言,制作一个准确的新冠肺炎模型异常困难。

[## 为什么做一个好的新冠肺炎模型如此困难

我们在这里,在疫情的中间,像观赏鱼一样盯着我们起居室的窗户。关于…的问题

fivethirtyeight.com](https://fivethirtyeight.com/features/why-its-so-freaking-hard-to-make-a-good-covid-19-model/)

然而,即使不冒险进入实际的预测模型,也有可能通过一种简单的编程方法来展示我们所有人对抗新冠肺炎病毒的唯一基本武器——“T4”社交距离 ”的功效。

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

来源: Pixabay(免费商业使用)

在本文中,我们将展示如何用 Python 构建这样一个演示,遵循简单而基本的流行病学理论

这并不是试图建立任何预测或预测模型。除了一些虚构的数字之外,没有实际的数据将用于生成图表和可视化。

目标是展示仅用一个基本的动力学模型,就有可能理解关键概念,例如“使曲线变平”、“群体免疫”和“过快解除封锁”。并且,你可以用基本的 Python 和数学知识编写这样一个模型。

然而,即使不冒险进入实际的预测模型,也有可能通过简单的编程方法来展示我们所有人对抗新冠肺炎病毒的唯一基本武器——“社交距离”的功效。

(流行病学)模型和 Python 类

我们基于基础流行病学的 SEIR 模型创建了一个叫做SEIRclass的 Python 类。该脚本在 my Github repo 中的SEIRclass.py文件中,该类需要为该演示导入。

SEIR 模式

SEIR 模型将全部人口分为四组,

  • 易感 :从未被感染过且尚未产生任何免疫力的人群。
  • :接触过病毒但没有表现出任何症状或不能被称为“感染者”的人。病毒正处于 潜伏期
  • 已感染 :处于活跃感染状态的人口比例,表现为轻度或重度症状,可能需要住院治疗。这是对 医疗能力规划 最重要的类别,几乎所有的 死亡事故 都将来自这一人群。
  • 收复 :噩梦彼岸的乡亲们!那些被感染并从中康复的人。请注意,在这个简单的模型中,这些人被假定具有“永久免疫力,即他们不会再次落入易感或受感染人群。

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

来源:维基百科(知识共享许可)

参考文章

这个想法是受这篇文章的启发,这篇文章清楚地阐述了流行病学模型和动力学方程: 社会距离减缓冠状病毒

* [## 社交距离减缓冠状病毒

模拟新冠肺炎峰的变平

towardsdatascience.com](/social-distancing-to-slow-the-coronavirus-768292f04296)

下面是上面文章对应的 Github 回购:https://github.com/dgoldman0/socialdistancing

动力学方程

几乎所有传染病传播的分室模型在本质上都是动态的,即它们由一组以时间为自变量的一阶/二阶微分方程描述。基本的动力学方程如下,

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

需要注意的是,著名再现数 R0 是这个模型的β和γ之比。

所有系数(α、β、γ等。)在这里被假定为常数。实际上,病原体的传染性可能会随着时间的推移而变化

随着第四个参数 𝜌 的引入,前两个方程略有变化,第四个参数代表社会混合。𝜌越高,社交距离就越小。它的值可以从 0 到 1。

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

这里有两篇文章展示了如何使用 Python 编程来数值求解这样的动态方程组。

[## Python 中的动态模拟

表示微分方程的三种方法是(1)传递函数,(2)状态空间,和(3)半显式…

apmonitor.com](https://apmonitor.com/pdc/index.php/Main/ModelSimulation) [## 用 Python 模拟动态系统的初学者指南

Python 中数字积分微分方程

towardsdatascience.com](/a-beginners-guide-to-simulating-dynamical-systems-with-python-a29bc27ad9b1)

核心 Python 类

分部类定义如下所示。一个测试 Jupyter 的笔记本可以在这里找到。模型类在这里是。它们是在 MIT 许可下发布的,因此,我们鼓励您下载并使用它,通过添加其他有用的方法来增强它,等等。****

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

各种方法

我们在这个类中定义了各种实用方法,

  • reinitialize:用新值(总体值)重新初始化模型
  • set_params:设定动态参数的值
  • reset:将内部列表重置为零状态,即初始值
  • run:运行给定时间量的动力学模拟(具有给定的时间步长增量)
  • plot:在时间轴上绘制模拟的基本结果

简单的演示

动态模拟和绘图

我们从导入类并创建一个对象作为实例开始。

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

然后,我们可以运行一段时间的动态模拟——比如 90 个时间单位。这可以被认为是 90 天或任何其他长度的时间。

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

我们可以简单地绘制出这个模拟的结果,

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

图片:SEIR 模型的代表性模拟结果(作者制作)。

拉平曲线——社交距离如何影响峰值

接下来,我们对各种社会距离因素进行模拟,以检查它们对曲线峰值的影响。请注意,这里的值越高意味着社交距离越小,即社交混合/互动越多

我们观察到更高程度的社会融合会导致感染人口比例达到更高的峰值,这可能会超出医疗保健系统的能力。

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

图片:社会距离因素对感染比例峰值的影响(作者制作)。

调整社交距离——提前结束封锁

现在,我们研究提前终止封锁或“留在家中”措施会发生什么,这些措施旨在减少社会交往,即增加社会距离。

我们从社会距离因子的某个值开始,让它运行一段时间,然后放松规范,即增加社会距离因子的值,并观察感染人口比例会发生什么。我们将观察到第二个峰值出现。根据各种社会和流行病学因素,第二个峰值可能高于第一个峰值。

在这项研究中,我们将使用两个 SEIR 模型,

  • 第一个模型将在低社交混合因子(严格的社交距离规范)下运行一段时间
  • 该模型得出的人口比例最终值将输入第二个模型。
  • 第二个模型将运行一个更高的社会混合值(宽松的社会距离标准)

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

图片:提前终止封锁会导致第二个高峰吗?(作者制作)

优化锁定期可以减少所有峰值

在“呆在家里”的规定结束和社会距离标准有所放松后,不可避免地会出现另一个感染病例高峰。问题是,这一比例会有多高,以及更长时间的封锁能否在某种程度上抑制这一趋势。

通过这个简单的模型,我们可以观察到,让第一次“锁定”运行很长时间可能会降低两个峰值的绝对值——一个在锁定期间,另一个在锁定结束后不可避免地出现。

**这是由于增强的 【群体免疫】的影响,随着封锁时间的延长,易感人群随着时间的推移逐渐缓慢减少(没有产生尖峰)**。因此,当封锁放松时,病毒感染的易感人群就减少了!

我们还注意到,超过 150 天后,易感分数水平不会显著下降,即从 150 天的情况到 180 天的情况再到 210 天的情况,没有明显的下降。因此,如果目标是建立群体免疫,锁定扩展可能仅在特定时期内有效

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

图片:随着封锁期的延长,易受影响的比例下降(作者制作)

上面“调整社交距离”的例子显示了高达> 0.05 的第二个峰值,即 5%的人口被感染。这里,我们展示了让第一次锁定运行更长时间可能会减少两个峰值。事实上,我们在该实验中看到第一个峰值更高,仅为 0.018 或 1.8%左右。

当然,这种情况取决于初始感染率、疾病参数和社会动态。这只是我们的计划可以强调的一个可能的结果。

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

图片:更长时间的封锁可能有助于整体降低峰值(作者制作)

这是一个演示,而不是新冠肺炎的实际模型

同样,这项工作是为了展示如何使用一个简单的 Python 脚本来编程一个广泛使用的流行病学动态模型。

一旦建立了这样一个程序化的模型,许多流行的短语,如’使曲线变平’、群体免疫’和’从锁定的早期结束起的尖峰可以通过玩模型参数和模拟设置来测量。

目标是展示仅用一个基本的动力学模型,就有可能理解关键概念,例如“使曲线变平”、“群体免疫”和“过快解除锁定”。而且,您可以用基本的 Python 和数学知识编写这样一个模型。

这个模型非常简化。没有地理空间互动 n,这是采用图论算法的最先进的传染病模型的核心。

该模型没有任何统计估计,这是估计参数(α、β、γ等)的核心。)来运行真实的模拟。

所以,请不要把这个模型当成与当前新冠肺炎局势发展相关的实际数据和预测有任何关联。有许多优秀的资源可供参考。

**** [## 特别报道:模拟推动世界对新冠肺炎的反应

当尼尔·弗格森参观位于伦敦唐宁街的英国政府中心时,他更接近于…

www.nature.com](https://www.nature.com/articles/d41586-020-01003-6)

然而,即使这样一个简单的编程方法也足够强大,可以创建关键的可视化效果,将“呆在家里”和“曲线变平”的信息传递给家庭。

这里有一篇很棒(但是很长)的可播放的 JavaScript 动画,

[## 接下来会发生什么?新冠肺炎期货,用可玩的模拟解释

“唯一值得恐惧的是恐惧本身”是个愚蠢的建议。当然,不要囤积卫生纸——但如果政策制定者担心…

ncase.me](https://ncase.me/covid-19/)

再次,一个测试 Jupyter 的笔记本可以在这里 找到 。模型类在这里是。它们是在 MIT 许可下发布的,因此,我们鼓励你下载并使用它。****

注意安全,各位!

作者注 : 我是一名半导体工艺师,有兴趣将数据科学和机器学习应用于与我领域相关的各种问题。我没有医学、分子生物学、流行病学或任何与新冠肺炎相关的专业知识。请不要给我发这种问题的邮件。

A lso,你可以查看作者的 GitHub 知识库获取机器学习和数据科学方面的代码、思想和资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我

** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…

通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…

www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)*******

Python 中的简单莫尔斯码解码器

原文:https://towardsdatascience.com/simple-morse-code-decoder-in-python-39f6db635af2?source=collection_archive---------8-----------------------

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

作者 Rhey t . Snodgrass&Victor f . Camp,1922 — Image:Intcode.png 和 Image:国际莫尔斯 code.png,公共领域,https://commons.wikimedia.org/w/index.php?curid=3902977

莫尔斯电码是一种用于电信的方法,其中每个字母、数字和标点符号由一系列点/破折号/空格表示。它是由塞缪尔·莫尔斯在 20 世纪 30 年代首先发明的,并且已经在海军工业中大量使用。本文将描述用 Python 构建一个简单的莫尔斯码解码器的过程。

Python 中的莫尔斯码表示

如上图所示,每个字母和数字都由一系列点和破折号表示。我们可以在 Python 中这样表示它们,但是为了更清楚,让我们将它们翻译成‘0’和‘1’,其中**‘0’表示点**,而**‘1’表示破折号**。

character = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']code = ['01','1000','1010','100','0','0010','110','0000','00','0111','101','0100','11','10','111','0110','1101','010','000','1','001','0001','011','1001','1011','1100','11111','01111','00111','00011','00001','00000','10000','11000','11100','11110']

由于每个字符(即一个字母或数字)对应一系列 0 和 1,我们将使用一个字典结构在 Python 中存储它们。你可以在这里参考我之前关于用 Python 构建字典数据结构的帖子。

# Define an empty dictionary 'morse_dict'
morse_dict = {}# Convert the 2 lists into a dictionary using a tuple
zipped_char_code = zip(character, code)
morse_dict = dict(zipped_char_code)# Print the dictionary 'morse_dict' on the terminal line by line
for key, value in morse_dict.items():
    print(key, value)

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

作者图片-包含莫尔斯电码表示的字典的 Python 输出

建造莫尔斯电码解码器

莫尔斯解码器的构建方式是,我们将提示用户键入莫尔斯码表示(即 0 和 1),每个字母或数字由一个 ***** 分隔。一旦用户按下“回车”,程序将解码莫尔斯电码并以字母数字的形式显示出来。

# reverse the previous dict as it's easier to access the keys
zipped_code_char = zip(code,character)
rev_morse_dict = dict(list(zipped_code_char))
# initiating a while loop
while True:
    # empty list to store original message
    ori_msg = [] 
    # empty list to store decoded message
    dec_msg = []

    # prompt the user to input morse code
    input_msg = input ("Please enter any Morse Code sequence for decoding. Leave blank to quit. ")
    # append input_msg (string) to ori_msg (string)
    ori_msg.append(input_msg)
    # split each morse code by '*'
    new_msg = input_msg.split("*")

    # printing out the original message
    for line in ori_msg: # to print original message without the []
        print("Original message: " + line + "\n")

    # loop through each morse code representation
    for j in range (0,len(new_msg)):
        # get the alphanumeric alphabet based on the dict keys and append to dec_msg
        if new_msg[j] in rev_morse_dict.keys():
            dec_msg.append(rev_morse_dict[new_msg[j]])

    # printing out the decoded message
    print ("Decoded Message is: " + ''.join(dec_msg) + "\n") # end the infinite while loop
    break

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

图片作者——莫尔斯电码解码器的 Python 输出

正如在程序输出中看到的,莫尔斯电码解码器能够将莫尔斯电码解码为 MYNAMEISKIERAN。

错误检查

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

图片由作者提供——带“abc”输入的莫尔斯电码解码器的 Python 输出

到目前为止,我们只实现了一个简单的莫尔斯电码解码器,它只能在用户只输入莫尔斯电码表示(即 0 和 1)的情况下解码**。如截图所示,如果用户输入’ abc ',解码器将无法解码剩余的莫尔斯电码,也不会显示任何错误信息。让我们改进我们的解码器,进行以下简单的错误检查:

  1. 用户只能输入 0、1 和*
  2. 用户只能输入预先定义的莫尔斯电码表示法(例如 0000000 不是有效的表示法)
  3. 程序可以继续解码莫尔斯电码,直到用户指定退出
# counter to do error check
    i = 0
    # proceed if user enters something
    if (len(input_msg)!=0):
        # while loop to check if only 0, 1 or * has been keyed in
        while (i<len(input_msg)):
            if input_msg[i] == "0" or input_msg[i] == "1" or input_msg[i] == "*":
                i+=1
            else:
                # if invalid chars found, print error message
                print ("Error input, Morse Code sequence should only consists of 0 and 1, with a * between subsequence")
               # break the error check once one error has been found
                break

我们添加上面的代码来纠正第一个无效字符的问题,如下面的屏幕截图所示,现在会向用户显示一条无效字符的错误消息。

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

作者图片——带“abc”输入的新型莫尔斯电码解码器的 Python 输出

# loop through each morse code representation
            for j in range (0,len(new_msg)):
                # get the alphanumeric alphabet based on the dict keys and append to dec_msg
                if new_msg[j] in rev_morse_dict.keys():
                    dec_msg.append(rev_morse_dict[new_msg[j]])
                # if morse code representation not found in original list, append input to err_msg
                else:
                    err_msg.append(new_msg[j])

            # to print error message only when necessary
            if len(err_msg) != 0:  
                for line in err_msg: 
                    print(line + " has no known morse translation")

我们添加上面的代码来纠正在预定义列表中找不到的无效莫尔斯码表示的第二个问题。新程序现在将向用户显示一条错误消息,如下所示,同时对那些有效的消息进行解码。

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

图片由作者提供-新莫尔斯电码解码器的 Python 输出,带有无效的莫尔斯电码输入

最后,如前所述,我们将使我们的程序有能力继续解码莫尔斯电码表示,如果用户继续输入,只有当用户选择退出时才停止。

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

作者图片—新莫尔斯电码解码器的 Python 输出

限制

这个程序的第一个限制是,如果用户想键入句子,程序将无法识别。从程序的输出中可以看出,字母数字被解码,中间没有任何空格。当然,有一些方法可以改进这一点,比如指定用户键入“***”作为空格。

第二个限制是,我们没有在这个莫尔斯电码解码器中加入标点符号,因为它对这个程序的目的来说并不重要。由于标点符号也是由点和破折号组成的,我们可以简单地扩展预定义的莫尔斯电码表示来包含标点符号。

摘要

本文描述了构建一个莫尔斯码解码器的过程,该解码器能够接受用户输入,并以原始的字母数字形式输出。此外,我们在程序中实现了几个错误检查功能,以确保莫尔斯电码解码器按照预期的方式工作。希望你们喜欢这篇文章,并开始建立自己的莫尔斯码解码器的乐趣!干杯!

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

带宇宙魔方的简单 OCR

原文:https://towardsdatascience.com/simple-ocr-with-tesseract-a4341e4564b6?source=collection_archive---------0-----------------------

如何训练宇宙魔方阅读你独特的字体

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

天使昆的照片

在本文中,我想与您分享如何使用 Tesseract 构建一个简单的 OCR,“一个用于各种操作系统的光学字符识别引擎”。宇宙魔方本身是自由软件,最初由惠普开发,直到 2006 年谷歌接手开发。它可以说是迄今为止最好的开箱即用的 OCR 引擎,支持 100 多种语言。这是最受欢迎的 OCR 引擎之一,因为它易于安装和使用。

现在,假设你的老板给了你一个任务,让你能够将下面的图片转换成机器语言,或者用更简单的话来说,“建立一个 OCR 模型,以便能够阅读一些图片中的这些字体!”。“好的,没问题,”你说,但突然你的主管对你说“我要你今天完成,在接下来的 3-5 个小时内。”

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

例如,我们将这张图片命名为 file_0.png

" Welp,我怎么能这么快地建立一个 OCR 模型?"你对自己说。但是别担心,这就是宇宙魔方的作用!首先,你必须把它安装在你的电脑上。

  • 如果你用的是 Windows 操作系统,去https://github.com/UB-Mannheim/tesseract/wiki用安装程序安装宇宙魔方(你可以选择最新的稳定版本,或者我用的是宇宙魔方 4.0.0)。按照说明操作。然后,进入编辑环境变量,添加一个新路径到你的宇宙魔方安装文件夹,如下图所示

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

然后点击“确定”

  • 如果使用 Ubuntu OS,那么打开终端,运行
    sudo apt-get install tesserac t-ocr

在你的电脑上成功安装了宇宙魔方之后,打开命令提示符对于 windows 或者终端如果你使用的是 Ubuntu,然后运行:

tesseract file_0.png stdout

其中file _ 0 . png是上图的文件名。我们希望宇宙魔方读取它在上面的图像中找到的任何单词。您应该在终端中看到这些输出:

Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 147
40293847 S565647386e2e91L0

哦不!看起来宇宙魔方不能完美地阅读上图中的文字。似乎它误读了一些字符,可能是因为图像中的字体独特而奇怪。幸运的是,你可以训练你的宇宙魔方,让它可以很容易地阅读你的字体。跟着我的脚步走!

免责声明,正如 Tesseract 的 wiki 中所述,建议使用默认的“语言”,这种语言已经在 tesseract 的许多数据上进行了训练,并在最后关头训练您自己的语言(这意味着,您应该在跳转到训练之前尝试预处理图像、阈值处理和其他图像预处理方法)。这是因为宇宙魔方本身在一般干净的图像上相当准确,并且很难使宇宙魔方的训练预测更准确,除非你的字体非常不同和独特(就像在我们的例子中),或者如果你试图阅读一些恶魔的语言。

安装和数据准备

要训练您的字体,首先,您需要:

  1. 安装宇宙魔方*(你不说)*

  2. 安装 jTessBoxEditor 这个工具用于创建和编辑地面真相来训练宇宙魔方。请注意,您需要 Java 运行时才能打开它,您可以下载https://www.java.com/en/download/。安装 Java 之后再在 上安装 jTessBoxEditor (不是 FX 的)https://SourceForge . net/projects/vietocr/files/jTessBoxEditor/ 解压 zip 文件就可以打开 jTessBoxEditor,运行 train.bat 如果你用的是 Windows,或者

  3. [ 可选的 ]一个工作 Word Office (Windows)或 LibreOffice (Ubuntu)和。您的字体的 tiff 文件。例如在上面的例子中,我使用的是OCR——一种扩展的字体。你可以很容易地从谷歌上下载你的字体(只需搜索 font_name。tiff 下载)。安装您的字体(只需双击。tiff 文件)或者,您最好有一个图像集合,以便以后作为训练数据进行预测。

在你准备好上面所有的安装步骤后,你就可以训练你的魔方了。Tesseract 使用“语言作为其 OCR 模型。有很多默认语言,像 eng (英语)、 ind (印尼语)等等。我们试图创造一种新的语言,让宇宙魔方能够预测我们的字体,通过使用我们的字体创建一些由随机数组成的训练数据。有两种方法可以做到这一点。首先,如果你有一个仅由你的字体组成的图像集合,那么你可以使用这种方法,或者第二种方法,即使用你的字体在 word 上键入任何你想要的数字(或字符),并使用剪切工具(windows)或 shift 键+ PrintScreen (Ubuntu)来捕获并将其保存在一个文件夹中。

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

训练数据示例

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

训练数据示例

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

训练数据示例

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

多行的训练数据示例

**根据我的经验,10–15 个数据足以产生一个准确的(主观)模型,对于干净和一些有噪声的图像都足够准确。请注意,您应该尝试创建尽可能平衡的数据,并尽可能接近真实案例。如果您想要预测一些蓝色背景、红色字体的图像,那么您应该创建蓝色背景、红色字体的训练数据。

训练宇宙魔方

一般来说,宇宙魔方的训练步骤是:

  1. 将培训数据合并到。使用 jTessBoxEditor 的 tiff 文件
  2. 通过创建一个. box 文件来创建一个训练标签,该文件包含来自。tiff 文件并修正每个不准确的预测
  3. 训练宇宙魔方

第一步。合并培训数据

创建完一些数据后,打开 jTessBoxEditor。 在顶栏,进入“工具”→“合并 Tiff”(或者你也可以只使用快捷键 Ctrl + M )。转到保存训练图像的文件夹。将过滤器更改为 PNG(或您的图像的任何扩展名),选择所有图像,然后单击“确定”。然后在选择面板中,键入 font_name.font.exp0 ,其中 font_name 是您想要的任何名称(这将是您自己的新宇宙魔方语言的名称)。

第二步。创建培训标签

打开“终端”,导航到存储训练图像的文件夹,然后。tiff 文件。既然我们现在有了训练数据,我们如何得到训练标签呢?恐怕不行,您不应该手动标记每个图像,因为我们可以使用 Tesseract 和 jTessBoxEditor 来帮助我们。在终端中,运行以下命令:

tesseract --psm 6 --oem 3 *font_name.font.exp0.tif font_name.font.exp0 makebox*

等等,为什么突然有了 psm 和 oem?当我键入上面的命令时会发生什么?如果你跑步:

tesseract --help-psm
#or
tesseract --help-oem

您将会看到 psm 表示页面分段模式,即宇宙魔方如何处理图像。如果你想让宇宙魔方把它看到的每张图片都当作一个单词,你可以选择 psm 8。在我们的例子中。tiff 文件是单行文本的集合,我们选择 psm 6。至于 OEM,这意味着 Ocr 引擎模式,至于 tesseract,有通过识别字符模式工作的传统引擎,或者使用神经网络和 LTSM 引擎(如果您想使用 LTSM,请安装 tesseract 版本> 4.0.0)。

使用上面的命令,我们希望 tesseract 生成边界框和。tiff 文件,并将其保存到 font_name.font.exp0.box 文本文件中。如果您不知道,我们之前制作的. tiff 文件包含您的按“页面”划分的训练图像。通过使用上面的命令,它将生成一个包含预测的. box 文件,以及。tiff 文件。名为 font_name.font.exp0.box

现在打开 jTessBoxEditor,导航到“框编辑器”选项卡,单击“打开”并选择。tiff 文件。您应该看到每个页面上的每个图像都有其边界框和预测。您现在的工作是修复每个边界框及其在。盒子文件。(没错,这是最无聊的部分)

第三步。训练宇宙魔方

创建了已经修复的。箱文件和。tiff 文件。创建包含以下内容的新文本文档

font 0 0 0 0 0

将其作为 font_properties 保存到与。tiff 文件和。盒子文件。现在你已经准备好开始训练了!(终于)。在该文件夹中,您应该有所有这些文件:

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

现在在终端上运行以下命令:

# Create a .tr file (training file)
tesseract num.font.exp0.tif font_name.font.exp0 nobatch box.train# Create a unicharset file
unicharset_extractor font_name.font.exp0.box# Create a shapetable file
shapeclustering -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.tr# Create a pffmtable, intemp file
mftraining -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.trecho Clustering..# Create a normproto file
cntraining font_name.font.exp0.tr

如果遇到错误,您可能需要使用 extractor.exe、unicharset_extractor.exe 和 cntraining.exe(对于 windows 用户)。您将在终端中看到一些输出,最重要的是在 shapeclustering 部分。如果您的训练图像包含所有必要的字符,您将看到形状的数量= {您想要的类的数量}。例如,如果我想训练宇宙魔方能够正确读取数字,那么形状的数量等于 10(即 0,1,2,3,…,9)。

Master shape_table:Number of shapes = 10 max unichars = 1 number with multiple unichars = 0

如果您的形状数不等于您想要的类数,您应该返回创建训练数据,并尝试创建更清晰的数据

如果你做的一切都是正确的,你会在你的文件夹中看到 4 个主要文件。shapetable、normproto、intemp 和 pffmtable。将这些文件重命名为 font_name.shapetable,font_name.normproto,font_name.intemp,font_name.pffmtable.

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

然后运行:

combine_tessdata font_name.

运行完上面的所有命令后,您会在文件夹中看到这些文件

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

现在将font _ name . trained data复制到:

C:/Program Files x86/tesseract/4.0/tessdata  # Windowssudo cp /usr/shared/tesseract/4.0/tessdata # ubuntu

你完了!是的,因为我们使用少量的数据,训练本身不需要几个小时,只需要几秒钟或者几分钟。与如果你必须从头开始训练一个深度学习模型(可能使用对象检测模型)相比,这要快得多。现在,下次运行 Tesseract 时,可以使用

tesseract -l font_name file0.png

记得之前用默认语言,上图用默认 Tesseract 引擎的结果是 40293847 S565647386e2e91L0。使用我们新训练的语言,结果是

Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 147
10293847 565647382910

如你所见,结果更加准确。耶!仅用少量训练数据和相对较短的时间,您就创建了一个能够读取独特和奇怪字体的 OCR 模型!

为了进一步检查模型的结果,您可以创建另一个。通过使用另一个图像或使用以前的。tiff 文件。打开终端,再次运行:

tesseract -l font_name --psm 6 --oem 3 *font_name.font.exp0.tif font_name.font.exp0 makebox*

现在打开 jTessBoxEditor → 框编辑器→打开并选择你的。tiff 文件。检查一下你的模型是否比前一个模型给出了更准确的预测。你应该看到预测提高了很多。

最后的想法

"但是如果你想要一个现成的快速 OCR 引擎,宇宙魔方是唯一的选择吗?"你可能会问。当然不是,如果你愿意拿出一些钱,有很多 OCR API 提供者。在我看来,如果您的图像非常干净(例如,一个 word 文档、一张收银单等等), Tesseract 是很好的。如果您的图像数据包含许多噪声,您可以使用阈值来区分背景和噪声与字体本身。根据我的经验,使用少至 10-20 个数据,Tesseract 甚至能够与最先进的对象检测模型竞争,如使用更多数据训练的更快的 R-CNN(也有很多增强)。但是,如果你的图像数据有一些噪声(随机点,脏标记)与你的字体颜色相同,宇宙魔方将无法正确预测你的图像。我说如果你想尽快建立 OCR 模型,或者你的训练数据有限,你应该使用宇宙魔方**。**

宇宙魔方的一个主要弱点(我认为)是它很不稳定。我可以通过使用相同图像的更大裁剪来得到不同的结果。同样出于某种原因,如果我使用超过 50 个数据,那么宇宙魔方的性能会更差。嗯,我自己也还在学习。如果你在这篇文章中发现一些错误或误解,请随时联系我。感谢阅读,快乐学习!

参考文献:

** [## 宇宙魔方-ocr/宇宙魔方

这个包包含一个 OCR 引擎——libtesserac t 和一个命令行程序——tesserac t。宇宙魔方 4 增加了一个新的…

github.com](https://github.com/tesseract-ocr/tesseract) [## nguyenq/jTessBoxEditor

Tesseract OCR 的框编辑器和训练器,提供 Tesseract 2.0x 和 3.0x 格式的框数据编辑和…

github.com](https://github.com/nguyenq/jTessBoxEditor) [## 在 windows 10 上训练您的宇宙魔方

Tesseract 是由谷歌实验室开发并由谷歌维护的开源 OCR(光学字符识别)引擎…

medium.com](https://medium.com/@gaopengbai0121/training-your-tesseract-on-windows-10-df6756946d4f) [## tesserac-ocr/Tess doc

宇宙魔方文档。在 GitHub 上创建一个帐户,为 tesseract-ocr/tessdoc 开发做出贡献。

github.com](https://github.com/tesseract-ocr/tessdoc) [## Tesseract-OCR 如何与 Python 协同工作?

这篇文章指导你使用 Tesseract OCR、OpenCV 和 Python 从图像中识别字符。

medium.com](https://medium.com/@latifvardar/how-does-tesseract-ocr-work-with-python-a6bccf85a002) [## 宇宙魔方 OCR 初学者指南

基于 Tesseract 和 Python 的光学字符识别

medium.com](https://medium.com/better-programming/beginners-guide-to-tesseract-ocr-using-python-10ecbb426c3d) [## [教程 Python 中的 OCR 与 Tesseract、OpenCV 和 Pytesseract

光学字符识别。换句话说,OCR 系统转换文本的二维图像,可以…

nanonets.com](https://nanonets.com/blog/ocr-with-tesseract/#installingtesseract?&utm_source=nanonets.com/blog/&utm_medium=blog&utm_content=%5BTutorial%5D%20OCR%20in%20Python%20with%20Tesseract,%20OpenCV%20and%20Pytesseract)**

简单的实时竞价游戏

原文:https://towardsdatascience.com/simple-real-time-bidding-game-11bd1a7674ef?source=collection_archive---------27-----------------------

使用 Pytorch 和一些真实数据一瞥在线广告的实时竞价机制。

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

照片由基里尔·沙尔科夫斯基Unsplash 上拍摄

我们都会在各种网站、社交媒体平台、视频流媒体服务等上看到广告。对于不同的人来说,它们通常是不同的。这是因为网站提供的是广告空间。然后是对空间的竞价,胜出的广告显示在那个位置。无需深入细节,要更好地了解这一过程,请查看这篇文章:

[## 广告技术简化版:什么是实时竞价,(RTB)?

实时竞价指的是在线拍卖过程,其中在线广告投放的购买和出售是在…

medium.com](https://medium.com/@greedy_game/ad-tech-simplified-what-is-real-time-bidding-rtb-8ee9754c3ab8)

我们将构建一个简单的类似游戏的环境,向用户展示广告,不同的投标人试图优化投标价格。这只是一个例子,实际过程很复杂。我们将使用一个简单的神经网络来评估出价。因此,让我们深入一些编码。

种子数据

虽然整个过程是可生成的,但我们将使用一些种子数据以合理的方式进行初始化。我们将使用 Avazu CTR 预测数据集。可以从这里下载。

没有访问网站的唯一用户的明确数据。因此,我们使用(“设备 id”、“设备型号”)来区分各个用户。

在将数据用于游戏之前,我们将首先分析数据,以了解一些简单的趋势。最近的实证研究表明,在线广告的效果不能被 CTRCR 完全捕捉到。观众通常不会在获得广告印象后立即点击广告(当用户看到一个广告时,它被称为该广告的印象)。他们往往是在抓取多了,对同一个广告的印象多了之后才点击的。

为了捕捉特定广告的这一点(由数据中的“site_id”定义),我们获取所有获得其印象的用户的数据。然后,对于每个用户,我们找出在点击广告之前走过的距离(访问过的网站)以及在此期间用户获得了多少广告印象。

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

图片由叶琳琳·莫迪

我们绘制了频率对距离图,其中频率是(印象数)/距离。我们可以看到频率随着距离的增加而降低。

创造环境

在我们的例子中,每个用户都拥有每个广告的点击数和浏览量的向量。它还必须在用户查看和点击时更新这些向量。用户还必须根据观看和点击来决定是否点击所显示的广告。

根据视图和点击量,用户可以使用 toss()生成 0-1 点击向量。每当特定用户被展示广告时,为该用户生成“点击”向量。如果赢得投标的广告的“点击”向量是“1”,则假定用户点击了所示的广告。

现在我们需要设置投标人。每个投标人被分配一组广告,每个广告由单个整数标识。

“投标模型”是一种简单的神经网络模型,其作用类似于投标的估计器。每个投标人都有自己的奖励,目标是使其最大化。为此,在“反向预测”函数中,我们将正确的预测定义为奖励和模型的预测点击概率的函数。我们还添加了一些随机事件,以允许模型探索其他可能性。

最后,我们需要一个生成器来创建一个环境,在这个环境中,用户被给予一个位置,投标人投标来赢得这个位置。

把东西放在一起

最终的笔记本会是这样的。在示例笔记本中,使用了 avazu 数据集的精简版本。

结束语

自从 1980 年在线广告开始以来,它已经经历了许多发展,并且人们不断尝试显示相关的广告。这个游戏只是这个领域大量研究的一小部分。

本文由 Akhilesh RaviKaushal Modi 联合制作。这是我们数据科学课程项目的一部分。

参考

  1. 李,K. C .,贾拉里,a .,&达斯丹,A. (2013 年 8 月)。在线广告中具有平滑预算交付的实时出价优化。在第七届在线广告数据挖掘国际研讨会论文集(第 1-9 页)。
  2. m .比连科和 m .理查森(2011 年 8 月)。个性化广告的预测客户端配置文件。第 17 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集*(第 413–421 页)。*
  3. 蔡海红,任,张,马利亚斯,王,于,郭,(2017 年 2 月)。展示广告中基于强化学习的实时竞价。第十届 ACM 网络搜索和数据挖掘国际会议论文集(第 661-670 页)。
  4. 阿尔查克,n .,米尔洛克尼,V. S .,& Muthukrishnan,S. (2010 年 4 月)。使用 adfactors 挖掘特定广告客户的用户行为。在第 19 届万维网国际会议记录(第 31-40 页)。

下一代测序中 mRNA 的简单重建

原文:https://towardsdatascience.com/simple-reconstruction-of-mrna-from-next-generation-sequencing-rna-seq-c4faaa5da90d?source=collection_archive---------45-----------------------

使用 NGS 数据重建二型糖尿病患者和非患者的前胰岛素原 mRNA。

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

图片由来自 Pixabay 的 Arek Socha 提供

P 个性化/精准医疗:根据患者独特的基因构成开出药物处方的能力。这个概念一直是许多医疗从业者的目标,随着下一代测序(NGS)的进展,个性化医疗有望很快从概念过渡到实践。

世界各地的科学界继续在人类基因组和遗传疾病之间取得新的发现。因此,科学家现在已经产生了比以往任何时候都多的数据,可能为研究人员提供更多证据来联系遗传和疾病之间的关系。

通过利用 RNA-seq 的基因测序数据,一种通过对提取的 m RNA 分子(转录组)进行测序来检查细胞产生的大多数蛋白质的 NGS 方法,我能够重建 10 个不同个体的前胰岛素原的 mRNA 和蛋白质序列,其中 4 个被诊断为二型糖尿病(T2D)。

虽然我检查了前胰岛素原的 mRNA,但读者只需要知道胰岛素是一个复杂的生物过程的最终产物,其中前胰岛素原是这个过程的开始。此外,DNA 被用来制造 mRNA,而 mRNA 可以用来制造蛋白质。

步骤 1:获得 NGS 数据和参考基因序列

为了开始这项研究,我从瑞典斯德哥尔摩卡罗林斯卡学院桑德伯格实验室的研究人员那里获得了提交给欧洲生物信息研究所的 RNA-seq 数据。(该数据用于 2016 年出版的细胞。)

接下来,我从 NCBI获得了所有 4 种已知的前胰岛素原 mRNA 序列变体。这些遗传序列被认为是在大多数个体中发现的正常/野生型序列,并将作为与 RNA-seq 数据进行比较的参考序列。

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

**NCBI,4 种前胰岛素原变体:**浅绿色矩形是编码 mRNA 的外显子,而(重叠的)深绿色矩形是蛋白质编码区。从顶部开始,变量依次为 1、2、4 和 3。当匹配/比对来自 RNA-seq 数据的序列时,使用变体 3,因为 mRNA 编码区(浅绿色)覆盖所有其他变体,并且前胰岛素原蛋白序列对于所有变体都是相同的。

步骤 2:用 Biopython 加载和排列基因序列

精彩的 Biopython 套装让接下来的步骤变得简单了!只需加载数据并将 RNA-seq 数据与参考序列进行比对。然后我把所有的比赛记录在熊猫的数据框里。

**# Load FASTQ File(s):**
fastq = SeqIO.parse('RNA-Seq\\' + file, "fastq")**# Local Alignment of Sequences:**
for seq_record in fastq:
    seq = str(seq_record.seq)matches = pairwise2.align.localms(variant_3, seq, 1, -1, -99, -99)**# The numeric arguments of localms() determine the score for each 
# "match". I set my score requirement to 35+ since all sequences are
# 43 nucleotide long. Also, I did not considered matches that 
# changed the reference sequence.**

虽然在 RNA-seq 数据中读取的每个核苷酸序列都与测序质量值(FASTQ)相关,但在这种情况下并不相关,因为有大量的比对匹配,其中异常值不会对 mRNA 重建产生任何影响。

步骤 3:重建前胰岛素原 mRNA 变体

一旦所有的测序数据都被扫描匹配,我计数所有测序的核苷酸,并提取每个位置最常见的核苷酸,以重建前胰岛素原 mRNA 序列。

**# Counting Matched Nucleotides:** count_df = pd.DataFrame(columns= list(range(0, 644)), index= ['A', 'T', 'G', 'C'])**# Getting the columns/nucleotide positions of the DataFrame with the mRNA sequence matches (match_df).
# The len() function will count how many of nucleotides matched in each position and works around needing to change NaN values.** for position in match_df.columns: A_count = len(count_df[count_df[position] == 'A'])  
    T_count = len(count_df[count_df[position] == 'T']) 
    G_count = len(count_df[count_df[position] == 'G']) 
    C_count = len(count_df[count_df[position] == 'C']) count_df.loc['A', int(position)] = A_count   
    count_df.loc['T', int(position)] = T_count 
    count_df.loc['G', int(position)] = G_count  
    count_df.loc['C', int(position)] = C_count

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

**mRNA 重建:**图像显示了所有 10 个个体的 mRNA 重建的前几个核苷酸位置。看看这些重建,大部分的 mRNA 序列是相同的。所有名字后面有“T2D”的人都是二型糖尿病。请注意,虽然此图像从“0”位置开始,但所有遗传数据和信息通常从 1 开始。

步骤 4:找出 mRNA 和蛋白质序列之间的差异

既然已经进行了重建,就需要扫描 mRNA 序列中每个位置的任何核苷酸差异。

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

**mRNA 重建差异:**这些是与每个个体或参考序列存在差异的 mRNA 位置。空的核苷酸单元意味着不存在覆盖该特定个体的核苷酸位置的序列。

只看差异,很明显,人与人之间可能存在许多可能的单一突变。然而,最重要的是,这些 mRNA 位置不位于蛋白质编码区——这意味着一旦 mRNA 被核糖体(翻译)读取,这些差异/变异不会影响前胰岛素原蛋白。蛋白质编码区的范围从位置 239-572(使用我的编号系统为 238-571),所有这些变异都位于该范围之外。但是,这并不意味着这些变化不重要!

下一步是将 mRNA 转化成蛋白质序列。然而,由于所有重建的蛋白质编码区没有差异,转换将导致产生相同的蛋白质序列。

最后一步:从生物学角度解释重建

要解释的主要数据是 mRNA 重建之间的差异。虽然变异的 mRNA 位置不在蛋白质编码区内,但它们可能影响其他方面,如 mRNA 转化为前胰岛素原的速率。mRNA 的起始和末端被称为非翻译区(UTRs),在将 mRNA 信息转化为蛋白质时,它们有助于 mRNA 和核糖体之间的相互作用。除了与核糖体的相互作用,其他蛋白质利用这些区域与 mRNAs 一起执行其他功能。

从该分析中可以得到的第二个认识是,变体 1 是细胞中存在的最普遍的 mRNA 形式(数据未显示)。这是预期的,因为直接转化变体 1 mRNA 序列将产生前胰岛素原的蛋白质序列,而其他变体需要在 mRNA 序列到达核糖体之前对其进行后修饰(选择性剪接)。

考虑:样本多样性和不常见的重建

最后要考虑的是细胞/样本来自哪里,来自谁,以及其他可能的 mRNA 重建。

二型糖尿病(T2D)是一种很难确定病因的疾病——它可能源于一个人的遗传、生活习惯、饮食、健康和其他环境因素。但是,棘手的部分在于,它很可能是由任何或所有这些因素造成的。因此,对于这种疾病和其他类似的疾病,遗传学研究可能无法提供一个关于一个人的遗传是否是其疾病的主要原因的结论性答案。在这项分析中,没有提供关于这些人的其他医学信息——因此,在开始这项分析之前,任何关于 T2D 的结论预计都是站不住脚的。

此外,这些个体的基因库也不清楚。这很重要,因为在这项研究中只有 10 个人,这极不可能反映世界上的遗传多样性。然而,令人惊讶的是,所有这些个体都没有产生与 mRNA 位置 80 处的参考序列相同的核苷酸(A80G,前面图像中的“79”)。

最后,对于一些个体来说,可能存在不太常见的 mRNA 重构。然而,我没有对这些重建进行全面的分析,因为最常见的重建与其他重建之间的百分比很可能保持在 2%以下。这些重构的低群体应该不会对胰岛素生产有显著的影响,因为最常见重构的群体将足以满足细胞的需要,如果不太常见的重构一开始就不存在的话。

结论

这项研究的目的是以 T2D 为例,从 NGS 数据中重建 mRNA,这是通过与参考序列的比对来完成的。虽然该分析没有显示 10 个个体(有或没有 T2D)之间产生的前胰岛素原蛋白有任何差异,但非蛋白编码区(UTRs)的变异在个体和群体之间是常见的、允许的和可行的突变。

查看我的 GitHub 获取 Python 代码。ipynb)! ]

简单可扩展图形神经网络

原文:https://towardsdatascience.com/simple-scalable-graph-neural-networks-7eb04f366d07?source=collection_archive---------4-----------------------

巨型图上的深度学习

到目前为止,阻碍图形神经网络在工业应用中广泛采用的挑战之一是难以将它们扩展到大型图形,如 Twitter follow graph。节点之间的相互依赖性使得将损失函数分解成单个节点的贡献具有挑战性。在这篇文章中,我们描述了一个在 Twitter 上开发的简单的图形神经网络架构,它可以处理非常大的图形。

本文与 法布里索·弗拉斯卡 伊曼纽·罗西 合著。

G 图形神经网络(GNNs)是近年来出现的一类 ML 模型,用于对图形结构数据进行学习。GNNs 已经成功地应用于各种不同领域的关系和相互作用的模型系统,包括社会科学、计算机视觉和图形学、粒子物理、化学和医学。直到最近,该领域的大多数研究都集中在开发新的 GNN 模型并在小图上进行测试(其中 Cora 是一个仅包含约 5K 个节点的引用网络,仍在广泛使用[1]);在处理大规模应用程序方面投入的精力相对较少。另一方面,工业问题经常处理巨型图,例如包含数亿个节点和数十亿条边的 Twitter 或脸书社交网络。文献中描述的大部分方法不适合这些环境。

简而言之,图形神经网络通过聚集来自本地邻居节点的特征来运行。将 d 维节点特征排列成一个 n × d 矩阵 X (这里 n 表示节点的数量),在流行的 GCN 模型 [2]中实现的对图的最简单的类似卷积的操作将逐节点变换与跨相邻节点的特征扩散相结合

Y = ReLU( AXW )。

这里 W 是一个跨所有节点共享的可学习矩阵, A 是一个线性扩散算子,相当于邻域中特征的加权平均[3]。这种形式的多层可以像在传统的 CNN 中那样按顺序应用。图形神经网络可以被设计成在节点(例如,用于诸如检测社交网络中的恶意用户的应用)、边(例如,用于链接预测,推荐系统中的典型场景)或整个图形(例如,预测分子图形的化学属性)的级别进行预测。例如,可以通过以下形式的两层 GCN 来执行逐节点分类任务

Y= soft max(AReLU(AXW)W’)。

W 为什么标度图神经网络具有挑战性?在前述的逐节点预测问题中,节点扮演样本的角色,GNN 在样本上被训练。在传统的机器学习设置中,通常假设样本是以统计独立的方式从某个分布中抽取的。这反过来允许将损失函数分解成单个样本贡献,并采用随机优化技术,一次处理训练数据的小子集(小批量)。实际上,现在每个深度神经网络架构都是使用小批量来训练的。

另一方面,在图中,节点通过边相互关联的事实在训练集中的样本之间产生了统计相关性。此外,由于节点之间的统计相关性,采样会引入偏差,例如,它会使一些节点或边比训练集中的其他节点或边出现得更频繁,这种“副作用”需要适当的处理。最后但并非最不重要的一点是,必须保证采样后的子图保持一个 GNN 可以利用的有意义的结构。

在许多关于图形神经网络的早期工作中,这些问题被掩盖了:GCN 和切布内[2]、莫奈[4]和加特[5]等架构是使用整批梯度下降来训练的。这导致了在内存中保存图的整个邻接矩阵和节点特征的必要性。结果,例如,一个 L 层 GCN 模型具有时间复杂度𝒪( Lnd )和内存复杂度𝒪(lnd+LD)【7】,即使对于中等大小的图也是禁止的。

解决可伸缩性问题的第一份工作是 GraphSAGE [8],这是 Will Hamilton 和合著者的开创性论文。GraphSAGE 使用邻域采样结合小批量训练来在大型图上训练 gnn(缩写 SAGE 代表“样本和集合”,是对该方案的引用)。主要思想是,为了计算具有 L 层 GCN 的单个节点上的训练损失,只有该节点的 L 跳邻居是必要的,因为图中更远的节点不包括在计算中。问题是,对于“小世界”类型的图,比如社交网络,一些节点的 2 跳邻居可能已经包含数百万个节点,这使得它太大而无法存储在内存中[9]。GraphSAGE 通过对邻居进行采样直到第 L 跳来解决这个问题:从训练节点开始,它均匀采样,替换[10]固定数量的 k 个 1 跳邻居,然后对于这些邻居中的每一个,它再次采样 k 个邻居,以此类推 L 次。这样,对于每一个节点,我们保证有一个有界的 L 跳的𝒪( kᴸ 节点的采样邻域。如果我们随后构造一批具有 b 个训练节点的节点,每个节点都有其自己独立的 L 跳邻域,我们得到一个独立于图大小 n 的𝒪( bkᴸ 的记忆复杂度。一批 GraphSAGE 的计算复杂度为𝒪(bldt30】kᴸ。

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

graph sage 的邻域抽样程序。从全图中对一批 b 节点进行子采样(在本例中,b=2,红色和浅黄色节点用于训练)。在右边,用 k=2 采样的 2 跳邻域图,其被独立地用于计算嵌入,并因此计算红色和浅黄色节点的损失。

GraphSAGE 的一个显著缺点是采样节点可能会出现多次,因此可能会引入大量冗余计算。例如,在上图中,深绿色节点出现在两个训练节点的 l 跳邻域中,因此它的嵌入在批处理中被计算两次。随着批量 b 和样本数量 k 的增加,冗余计算的数量也增加。此外,尽管每批内存中都有𝒪( bkᴸ 节点,但损失仅在其中的 b 节点上计算,因此,其他节点的计算在某种意义上也是浪费的。

多项后续工作集中于改善小批量的抽样,以消除 GraphSAGE 的冗余计算,使每批更有效。这个方向上最近的工作是 ClusterGCN [11]和 GraphSAINT [12],它们采用了图采样的方法(与 GraphSAGE 的邻域采样相反)。在图采样方法中,对于每一批,原始图的子图被采样,并且完整的类 GCN 模型在整个子图上运行。挑战在于确保这些子图保留大部分原始边,并且仍然呈现有意义的拓扑结构。

ClusterGCN 通过首先对图进行聚类来实现这一点。然后,在每一批中,在一个集群上训练该模型。这使得每批中的节点尽可能紧密地连接在一起。

GraphSAINT 提出了一种通用概率图采样器,通过采样原始图的子图来构造训练批次。图形采样器可以根据不同的方案进行设计:例如,它可以通过使用随机行走计算节点的重要性并将其用作采样的概率分布来执行均匀节点采样、均匀边采样或“重要性采样”。

同样值得注意的是,采样的优势之一是,在训练期间,它充当一种边缘方向的丢失,这使模型正规化,并有助于性能[13]。然而,边缘丢失需要在推理时仍然看到所有的边缘,这在这里是不可行的。图形采样的另一个效果可能是减少瓶颈[14]和由邻域的指数扩展导致的“过度挤压”现象。

在我们最近与 Ben Chamberlain、Davide Eynard 和 Federico Monti [15]合作的论文中,我们研究了为节点分类问题设计简单、免采样架构的可能性。你可能想知道,鉴于我们刚刚在上面强调的间接好处,为什么人们宁愿放弃抽样策略。这有几个原因。首先,节点分类问题的实例可能彼此显著不同,并且据我们所知,迄今为止没有工作系统地研究了当采样实际上提供除了仅仅减轻计算复杂性之外的积极效果时的*。其次,采样方案的实施带来了额外的复杂性,我们认为简单、强大、免采样、可扩展的基线架构很有吸引力。*

我们的方法是由几个最近的经验发现所激发的。首先,简单的固定聚合器(如 GCN)在许多情况下表现往往优于更复杂的聚合器,如 GAT 或 MPNN [16]。第二,虽然深度学习的成功建立在有很多层的模型上,但在图形深度学习中,是否需要深度仍然是一个公开的问题。特别是,Wu 和合著者[17]认为具有单个多跳扩散层的模型可以与具有多个层的模型性能相当。

通过在单个卷积层内组合不同的、固定的邻域聚合器,有可能获得一个极其可扩展的模型,而无需诉诸图形采样[18]。换句话说,所有与图相关的(固定的)操作都在体系结构的第一层,因此可以预先计算;然后,预聚合的信息可以作为输入提供给模型的其余部分,由于缺乏邻域聚合,该模型可以归结为一个多层感知器(MLP)。重要的是,通过使用几个可能专门的和更复杂的扩散算子,即使使用这样的浅层卷积方案,图过滤操作中的表达性仍然可以保留。例如,可以设计操作符来包含局部子结构计数【19】或图形主题【20】。

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

SIGN 架构包括一个类似 GCN 的层,该层具有可能作用于多跳邻域的多个线性扩散算子,随后是逐节点应用的 MLP。其效率的关键是扩散特征的预先计算(用红色标记)。

所提出的可扩展架构,我们称之为可扩展的类初始图网络(SIGN ),对于节点分类任务具有以下形式:

y= soft max(relu(xw₀**| axw| axw|…| axww**’)

这里at24】ᵣ是线性扩散矩阵(例如归一化的邻接矩阵、其幂或基序矩阵)并且wt28】ᵣ和 W 是可学习的参数。如上图所示,通过增加节点层,网络可以变得更深,

y= soft max(relu(…relu(xw₀**| axw|…| axw**)w’)…w’ ')

最后,当对同一扩散算子采用不同的幂时(如a₁=bt56】,A ₂= B 等)。),图操作有效地在越来越远的跳中从邻居聚集,类似于在同一网络层中具有不同感受域的卷积滤波器。这种与经典 CNN 中流行的 inception 模块的类比解释了所提出的架构的名称[21]。

如上所述,上述等式中的矩阵乘积 AX ,…,ax不依赖于可学习的模型参数,因此可以预先计算。特别是,对于非常大的图形,可以使用 Apache Spark 等分布式计算基础设施来有效地扩展这种预计算。这有效地将整个模型的计算复杂度降低到 MLP 的计算复杂度。此外,通过将扩散移至预计算步骤,我们可以从所有邻居聚集信息,避免采样以及可能的信息丢失和随之而来的偏差【22】。

SIGN 的主要优势是其可扩展性和效率,因为它可以使用标准的小批量梯度下降来训练。我们发现我们的模型在推理时间上比 ClusterGCN 和 GraphSAINT 快两个数量级,同时在训练时间上也快得多(所有这些都保持了与最先进的 GraphSAINT 非常接近的准确性性能)。

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

不同方法在 OGBN-Products 数据集上的收敛性。与 GraphSaint 和 ClusterGCN 相比,SIGN 的变体收敛更快,验证 F1 分数更高。

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

OGBN-Products 数据集上不同方法的预处理、训练和推理时间(秒)。虽然预处理速度较慢,但 SIGN 的训练速度更快,推理时间比其他方法快近两个数量级。

此外,我们的模型支持任何扩散算子。对于不同类型的图形,不同的扩散操作符可能是必要的,我们发现一些任务受益于基于基元的操作符,如三角形计数。

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

SIGN 和其他可扩展方法在一些流行数据集上对节点分类任务的性能。基于三角形主题的扩散算子在 Flickr 上提供了有趣的性能增益,并在 PPI 和 Yelp 上提供了一些改进。

尽管只有一个图卷积层和线性扩散算子的限制,SIGN 在实践中表现非常好,达到与更复杂的模型相当甚至更好的结果。鉴于其速度和实现的简单性,我们设想 SIGN 是一种用于大规模应用的简单基线图学习方法。也许更重要的是,这样一个简单模型的成功引出了一个更基本的问题:我们真的需要深度图神经网络?我们推测,在社交网络和“小世界”图的许多学习问题中,我们应该使用更丰富的局部结构而不是诉诸蛮力深度架构。有趣的是,传统的 CNN 架构按照相反的趋势发展(更深的网络和更小的滤波器),因为它具有计算优势,并且能够将复杂的功能组合成简单的功能。我们不确定同样的方法是否适用于图,在图中,组合性要复杂得多(例如,某些结构不能通过消息传递来计算,无论网络有多深)。当然,还需要更精细的实验来验证这个猜想。

[1]最近推出的开放图形基准现在提供具有数百万个节点的大规模图形。社区可能需要一段时间才能转用它。

[2] T. Kipf 和 M. Welling,用图卷积网络进行半监督分类 (2017)。继续。ICLR 引入了流行的 GCN 架构,该架构是对 M. Defferrard 等人提出的 ChebNet 模型的简化(2016)。继续。乳头。

[3]作为扩散算子,Kipf 和 Welling 使用具有自循环的图邻接矩阵(即,节点本身有助于其特征更新),但是其他选择也是可能的。可以使扩散操作依赖于形式为 A ( X ) X (即,它仍然是节点特征的线性组合,但是权重取决于特征本身)的特征,如在 MoNet [4]或 GAT [5]模型中,或者完全非线性,x,如在消息传递神经网络(MPNN) [6]中。为简单起见,我们集中讨论应用于节点分类的 GCN 模型。

[4] F. Monti 等人,利用混合模型 CNN 对图和流形进行几何深度学习 (2017)。进行中。CVPR。

[5]p . veli kovi 等人,图形注意网络 (2018)。进行中。ICLR。

[6] J. Gilmer 等人,量子化学的神经信息传递 (2017)。进行中。ICML。

[7]这里为了简单起见我们假设图是稀疏的,边数为||=𝒪(n

[8] W. Hamilton 等人,大型图上的归纳表征学习 (2017)。进行中。神经炎。

[9]在这样的图中,邻居的数量随着邻居的扩展而呈指数增长。

[10]带有替换的采样意味着一些邻居节点可能出现不止一次,特别是如果邻居的数量小于 k 时。

[11] W.-L. Chiang 等人, Cluster-GCN:一种训练深度和大型图卷积网络的高效算法 (2019)。进行中。KDD。

[12] H. Zeng 等, GraphSAINT:基于图抽样的归纳学习方法 (2020)在 Proc .ICLR。

[13] Y. Rong 等.【DropEdge:面向节点分类的深度图卷积网络 (2020)。进行中。ICLR。一种类似于丢弃的想法,其中在训练期间使用边的随机子集。

[14] U. Alon 和 E. Yahav,关于图形神经网络的瓶颈及其实际意义 (2020)。arXiv:2006.05205。确定了图形神经网络中的过度挤压现象,这类似于在顺序递归模型中观察到的现象。

[15]弗拉斯卡等人,符号:可扩展的初始图神经网络 (2020)。ICML 图形表示学习研讨会。

[16] O. Shchur 等人图神经网络评估的陷阱 (2018)。关系表征学习工作坊。显示简单的 GNN 模型与更复杂的模型表现相当。

[17] F. Wu 等,简化图形神经网络 (2019)。进行中。ICML。

[18]虽然我们强调,为了计算效率,SIGN 不需要采样,但是还有其他原因说明图形子采样为什么有用。j .克利茨佩拉等人扩散改善图形学习 (2020)。继续。NeurIPS 表明,采样扩散矩阵提高了图形神经网络的性能。我们在早期的符号实验中观察到了同样的现象。

[19] G. Bouritsas 等通过子图同构计数提高图神经网络表达能力 (2020)。arXiv:2006.09252。展示了如何通过结构节点编码获得强大的 gnn。

[20] F. Monti,K. Otness,M. M. Bronstein, MotifNet:一种基于 motif 的图卷积网络,用于有向图 (2018)。arXiv:1802.01572。使用基于基元的扩散算子。

[21] C. Szegedi 等人,用卷积进行更深入的研究 (2015)。继续。CVPR 在经典的 Google LeNet 架构中提出了 inception 模块。公平地说,我们并不是第一个想到图初始模块的人。我们的合作者来自慕尼黑工业大学的 Anees Kazi 是去年帝国理工学院的访问学生,她首先介绍了他们。

[22]注意,到达更高阶的邻居通常是通过与直接邻居一起操作的深度堆叠图卷积层来实现的;在我们的架构中,这是在第一层通过图操作符的能力直接实现的。

符号 工具 选项可用 PyTorch 几何 。本帖的 中文翻译 刘止庸 提供。对图形深度学习感兴趣?关于图形深度学习的其他文章,请参见我的 博客 关于走向数据科学, 订阅 到我的帖子,获取 中等会员 ,或者关注我的Twitter**

具有弹性搜索的简单搜索引擎

原文:https://towardsdatascience.com/simple-search-engine-with-elastic-search-d36086591d26?source=collection_archive---------7-----------------------

从头开始构建泰米尔歌词搜索

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

图 1:作者解释的弹性叠加

弹性堆叠

Elastic Stack 是来自 Elastic 的一组开源产品,旨在帮助用户从任何类型的来源以任何格式获取数据,并实时搜索、分析和可视化这些数据。

  • Elasticsearch 是一个 RESTful 分布式搜索引擎。它基于 Java,可以搜索和索引不同格式的文档文件。
  • Kibana 是一个开源的数据可视化和探索工具,专门用于大量的流和实时数据。该软件通过其图形表示,使庞大而复杂的数据流变得更加容易和快速理解。

还有一些其他的产品。 logstash节拍 。博客的目的是通过配置一个非常简单的歌词搜索引擎来指导读者,特别是对于使用 ElasticSearch 的泰米尔人。

先决条件

歌词语料库需要添加的歌词数据
邮递员测试 API 调用

ElasticSearch带 API 的搜索引擎

样本歌词搜索引擎 →包含 lyricsdata、UI [HTML/CSS]和 python 脚本,用于 FLASK 的后端支持

要遵循的步骤

数据抓取

  • 在构建歌词搜索引擎之前,必须收集歌词数据。www.tamilpaa.com 是一个收集了电影名、歌手和音乐导演的歌词的网站。泰米尔语歌词的必要性和数据量(3200+歌词可刮擦)使得使用特定网站作为爬虫主机成为必要。
  • 曾经用scrapy写了一个网络爬虫,从网站上抓取原始数据。爬虫是回购中可用的 colab 笔记本。
Raw_Data : The data scraped directly from the website. Stored in different folders, categorized based on year.
  ├── Tamil_movie_song_lyrics_2017
  ├── Tamil_movie_song_lyrics_2018
  ├── Tamil_movie_song_lyrics_2019
  ├── Tamil_movie_song_lyrics_2020
  ├── Tamil_movie_song_lyrics_random_2300+ 

PreProcessedData : The data has to be pre-processed(convert to Tamil) for values of some fields were in English(E.g. A.R.Rahman => A. R. ரஹ்மான்)

ModifiedData : The data was modified by adding more fields to spice up search ("வகை","நுகர்ச்சி","மதிப்பீடு") -('genre','views','ratings')

配置弹性搜索

第一步

下载elastic search,有多种格式,包括 ZIP 和 TAR.GZ 格式,解压文件夹。打开一个命令行工具,遍历到 elasticsearch 的 bin 文件夹,然后运行“elasticsearch”命令。

C:\Users\cvvin>cd C:\Users\cvvin\Desktop\Notes\elasticsearch-7.7.1\binC:\Users\cvvin\Desktop\elasticsearch-7.7.1\bin>elasticsearch

“elasticsearch”命令将在 localhost 中托管 elasticsearch。默认端口是 9200。

第二步

打开 web 浏览器并粘贴以下 URL,检查 elasticsearch 搜索服务器是否启动并运行。

http://localhost:9200/

结果必须类似于下图。

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

图 2 .检查 ElasticSearch 服务器启动时的结果——由作者截取

请注意,默认端口是 9200,可以更改。在弹性搜索中遍历到 config 文件夹。打开“config.yml”文件,根据需要编辑端口号。

http.port: 9300

第三步

下载邮差如果你还没有。Postman 是一个专门用来测试别人或者你自己开发的 RESTful API 的工具。

步骤 4

  • Elasticsearch 类似于一个数据库。下面是一个比较 ElasticSearch 和更一般的关系数据库的类比。
Elastic Search => Mysql
Index => Database
Types => Tables
Properties => Columns
Documents => Rows
  • 索引就像一组键,隐含着指向搜索查询中的术语的指针。索引将由一个或多个文档组成。ElasticSearch 使用一个倒排索引,它将一个以页面为中心的数据结构倒排到一个以关键字为中心的数据结构。
  • 我们可以使用 PUT 请求创建索引。这里我选择了’Tamil songlyricsdatabase’作为索引名。
http://localhost:9200/tamilsonglyricsdatabase

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

图 3 .使用 Postman 屏幕在 ElasticSearch 中创建新索引——由作者捕获

并且响应将类似于上图中的内容(图 3)。如果索引已经存在于 ElasticSearch 中,服务器将抛出一个引用现有索引的错误。

第五步

我们现在可以使用 POST 请求创建类型(即数据库中的表)和添加文档(即数据)。 文档 是搜索和索引的单位,由一个或多个字段组成。

  • 我选择了 “歌词” 作为文档类型,选择了“***2”***作为文档 ID。将歌词数据作为 JSON 添加到帖子请求的 正文部分 如下图所示(Fi.4. |左)。可以从语料库中获取歌词数据。
[http://localhost:9200/tamilsonglyrics/lyrics/](http://localhost:9200/tamilsonglyrics/lyrics/2)2

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

图 4. ( )将文档添加到索引屏幕-由作者捕获| ( )响应屏幕-由作者捕获

  • 在图 4(左)中,显示的 JSON 是文档。蓝色的是字段,粉色的是这些字段的相关值。
  • 如果对添加文档的响应如图 4 所示,则可以从响应中验证成功添加了文档(右图)
  • 但是像这样手动添加几个 JSONs 将会是一项繁忙的任务,而且成本很高。因此,弹性搜索有了“批量 API”的帮助,我们可以在一次 API 调用中添加大量文档。
  • 要通过 BulkAPI 添加文档,需要将我通过抓取网站收集的所有单个 JSON 转换成一个 BulkJSON。 这里 (年份 2017,2018,2019) 你可以找到三个这样的 BulkJSONs。但是需要添加一个小的 python 脚本来修改我收集的数据,并使用 Python 通过 BulkAPI 添加数据。
  • 必须在当前的 python 解释器中添加 elasticsearch,elasticsearch_dsl。
pip install elasticsearchpip install elasticsearch-dsl

一旦添加了库,现在就可以运行 python 脚本了。

如果您已经克隆了 repo 并且更喜欢尝试,只需运行***bulk data . py .***否则,如果您在读取文件和添加任何字符替换时有自己的数据和操作,请尝试修改下面的脚本。还可以使用 python 和 elasticsearch 库创建索引、添加文档和搜索。

bulkdata.py 可从作者的 github 获得

  • 获取 python 脚本***‘bulk data . py***’来添加索引(如果之前没有添加,取消对索引部分的注释)。并通过运行脚本向 BulkAPI 添加文档。修改“索引”名称以适合您的名称,并运行 python 脚本。将数据添加到一个文件夹(如 corpus ),并在read_all_songs()方法中更新路径。如果您想要添加更多文档,请将它们添加到同一个文件夹中并运行脚本。对于抓取的数据,我已经相应地定义了字段。但是,如果您对数据进行了任何更改,请在genData()方法中添加相同的字段。

通过这些步骤,我们将能够成功上传数据,并可以搜索歌词。

高级索引

但是另外,您可以设置现有的分析器或定制的分析器来支持更有效的索引。必须创建一个定制的分析器,结合适当的字符过滤器记号赋予器记号过滤器

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

图 5 . Arun Mohan 的博客中弹性搜索的文本分析

一个字符过滤器接收作为字符流的原始文本,并可以通过添加、删除或改变字符来转换该流。

一个 记号赋予器 接收一个字符流,将其分解成单独的记号(通常是单独的单词),并输出一个记号流。

记号过滤器接受来自记号赋予器的记号流,并且可以修改记号(例如小写),删除记号(例如删除停用词)或者添加记号(例如同义词)。

我已经创建了一个自定义分析器,你可以从 这里 得到。并遍历到机器中 ElasticSearch 的 config 文件夹。

elasticsearch-7.7.1\config
  • 创建一个名为“analyze”的文件夹,并添加您从 repo 中获取的文件。
elasticsearch-7.7.1\config\analyze\

定制分析仪包括

1.标准记号化器→它在单词边界上将文本分成术语,并删除大部分标点符号。对于任何语言来说,它都是最常用的标记符。因此我们坚持使用这个记号化器。

2.自定义过滤器,包括

自定义阻止符 →包含 Tamil(Like:ஒரு、என்று、மற்றும்、இந்த、இது、என்ற、கொண்டு的停用词,这些词在 Thamizh 中非常常见,但在搜索中可以忽略,因为它们通常不会为搜索提供任何特定的意义。

自定义词干 →词干是提供单词的词干。例如,在英语中,我们可以用“播放,播放,播放器”→ 播放。通常蒸可以用动词。在塔米兹我们也能阻止。比如“உண்ண、உண்டு、உண்டேன்、உண்கிறேன்、உண்பேன்、உண்ணும்”→உண்

自定义匿名 →可以添加匿名词,这样我们可以减少各种索引的数量,从而提高索引和搜索的效率。比如“மிகச்சிறந்த、மிகசிறந்த,மிகவும்சிறப்பான、சிறப்பான、தலைசிறந்த、உயர்ந்த”→சிறந்த

添加“分析器”文件夹(包含 stem.txt、stopwords.txt、synonym.txt)后,需要创建(新的)索引,包括以下示例 JSON 作为主体。

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

图 6 .添加定制分析器屏幕——由作者捕获

示例搜索查询

我们已经看到了添加文档、添加批量数据、添加定制分析器,现在我们可以继续搜索查询。下面的例子可以用 Postman 试试。

  • 基本搜索 —用户可以只进行搜索,而无需将任何必需的信息添加到搜索获取请求的正文中。
http://localhost:9200/tamilsonglyrics/_search
  • 如果用户只知道电影/年份/歌手/作词人/流派,他可以搜索歌词。将下面的代码片段作为正文添加到 Postman GET 请求中。在所提供的例子中,யுகபாரதி 是一个作词人,他想检索他写的歌词。我们可以通过在查询中提到电影的名称来搜索特定电影的歌词。我们可以通过在查询中提及特定的风格来搜索某个风格的歌词。

例如-“யுகபாரதி”

{
    "query": {
        "query_string": {
            "query":"யுகபாரதி"
        }
    }
}

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

图 7 .简单搜索查询屏幕——由作者捕获

  • 当用户知道电影/年份/歌手/作词人/流派时,他可以搜索指定该领域的歌词,这与上面提到的广泛搜索相反。这是一个**匹配查询。**这里的பாடலாசிரியர்(lyricist)是与用户正在搜索的搜索词யுகபாரதி相关的字段。与在特定字段中搜索相比,这种搜索将减少在每个字段中搜索查询词的开销。这将提高搜索的持续时间。

例如-“பாடலாசிரியர்யுகபாரதி”

{
     "query" : {
          "match" : {
             "பாடலாசிரியர்" : "யுகபாரதி"
         }
     }
 }
  • 通配符查询帮助用户即使有拼写错误也能进行搜索。当用户不确定作词人的全名*யுகபாரதி* *,*时,他可以使用யுக* 作为通配符进行搜索。ElasticSearch 将带来与通配符匹配的高分结果。

如“யுகபாரதி”的“யுக”*

"query" : {
         "match" : {
            "பாடலாசிரியர்" : "யுக*"
        }
    }
}
  • 多匹配查询允许在一个以上的特定字段中搜索一个术语。这里*அனிருத்* 预期出现在பாடியவர்கள்(singers)இசையமைப்பாளர்(Music director)的一个或两个字段中

例如——《அனிருத்》

{
      "query" : {
         "multi_match" : {
             "query" : "அனிருத்",
             "fields": ["பாடியவர்கள்","இசையமைப்பாளர்"]
         }
     }
}
  • 用户可以搜索特定性质(流派/歌手/音乐导演)的前 20 首歌曲。这里我们搜索*மிகச்சிறந்த 20 குத்துபாடல் (top20 rock songs).* W e 定义Top 应该排在மதிப்பீடு (rating)上。在这个搜索查询中,我们将结果的大小定义为 20,因为我们期望有top20 首歌曲,并且我们将它们按照மதிப்பீடு (rating)的降序排序。

例如— மிகச்சிறந்த 20 குத்துபாடல்

"size":20,
   "sort" : [
       { "மதிப்பீடு" : {"order" : "desc"}}
   ],
   "query": {
       "multi_match": {
           "fields":["வகை"],
           "query" : "குத்துபாடல்",
           "fuzziness": "AUTO"
       }
   }
}
  • 我们可以搜索famous 排名在நுகர்ச்சி (views)之上的(音乐导演/流派/歌手的)著名歌曲。搜索查询是*பிரபல்யமான 15 ஹரிஷ் ஜெயராஜ் பாடல்கள்(15 famous Harish Jeyaraj songs)* *。这里我们将尺寸定义为 15(因为我们要求如此)。并将待搜索的特定字段定义为இசையமைப்பாளர்(music director) 并将模糊度设置为自动。*模糊支持有拼写错误的搜索。我们根据நுகர்ச்சி (views)排序。

例如——பிரபல்யமான15ஹரிஷ்ஜெயராஜ்பாடல்கள்

"size":15,
   "sort" : [
       { "நுகர்ச்சி" : {"order" : "desc"}}
   ],
   "query": {
       "multi_match": {
           "fields":["இசையமைப்பாளர்"],
           "query" : "ஹரிஷ் ஜெயராஜ்",
           "fuzziness": "AUTO"
       }
   }
}
  • 布尔查询用于减少搜索空间,添加更多条件,如 must、should、must_not,这些条件与布尔 od 和、OR、not 类似。在下面的搜索查询中,我们期望结果包括作为இசையமைப்பாளர்(musicdirector)இமான்和作为வருடம்(year)2019

如இமான் 2019 பாடல்வரிகள்

{
 "query": {
   "bool": {
         "must": [
             { "match": { "இசையமைப்பாளர்": "இமான்" }},
             { "match": { "வருடம்": "2019" }}
         ]
       }
     }

}
  • 范围查询在我们需要包含给定范围内的搜索结果时很有帮助。这里,当搜索*சமீபத்திய பாடல்கள் (latest songs0 ,*时,我们将latest 定义为基于年份,并定义了范围查询。gte标志着范围的开始。

例如——இமான்சமீபத்தியபாடல்கள்

"query": {
    "bool": {
      "must": [{
          "match": {
            "இசையமைப்பாளர்": "இமான்"
          }
        },
        {
          "range": {
            "வருடம்" : {
                "gte" : "2019"
            }
          }
        }
      ]
    }
  }
}
  • 用户在搜索歌词时只能得到偏好的字段。这里我们只期望有திரைப்படம்(movie),இசையமைப்பாளர்(music director),因此为15 famous rock songs的查询将这些字段添加到了“_source”:{"includes":[திரைப்படம்","இசையமைப்பாளர்"]

例如——著名的குத்துபாடல்திரைப்படம்/இசையமைப்பாளர்

{
   "_source":{
       "includes":["திரைப்படம்","இசையமைப்பாளர்"]
   },
   "size":10,
   "sort" : [
       { "மதிப்பீடு" : {"order" : "desc"}}
   ],
   "query": {
       "multi_match": {
           "fields":["வகை"],
           "query" : "குத்துபாடல்",
           "fuzziness": "AUTO"
       }
   }
}
  • 我们可以搜索与歌词相关的其他细节。 MLT( more_like_this) 查询有助于文本挖掘,因此扩展了对巨大搜索输入项的支持,并带来相关文档。
{
    "query":{
       "more_like_this":{
          "fields":[
             "பாடல்வரிகள்"
          ],
          "like":"நெஞ்சில் மாமழை நெஞ்சில் மாமழை தந்து வானம் கூத்தாட கொஞ்சும் தாமரை கொஞ்சும் தாமரை வந்து எங்கும் பூத்தாட    எத்தனை நாள் எத்தனை நாள் பார்ப்பது எட்டி நின்று எட்டி நின்று காய்வது கள்ள குரல் பாடல் உள்ளே ஓடுது கண்மூடி கண்மூடி காதோரம் பாடுது    நெஞ்சில் மாமழை நெஞ்சில் மாமழை தந்து வானம் கூத்தாட கொஞ்சும் தாமரை கொஞ்சும் தாமரை வந்து எங்கும் பூத்தாட   வாரத்தில் எத்தனை நாள் பார்ப்பது அன்றாடம் வந்து பார்க்க ஏங்குது வராமல் போகும் நாட்கள் வீண் என வம்பாக சண்டை போட வைக்குது   சொல்ல போனால் என் நாட்களை வண்ணம் பூசி .",
          "min_term_freq":1,
          "max_query_terms":20
       }
    }
  }
  • 用户可以使用项进行聚合桶查询**。**

聚合框架有助于针对一组文档构建复杂的数据和分析信息摘要。分桶、度量、矩阵、管道是聚合的类型。存储桶用于构建存储桶,其中每个存储桶都与一个和一个文档标准相关联。一旦执行,将提供存储桶列表和落入存储桶的文档摘要。

  • **但是,**在此之前,我们必须添加我们想要存储的特定字段作为字段数据,如图 8 所示。虽然字段自然会被索引、排序、聚合,但需要与搜索不同的访问模式。

搜索→ “哪些文档包含这个术语?”

排序和聚合→ “这个字段对于这个文档的值是多少?”

默认情况下,字段数据在字段上是禁用的,因为这将占用大量空间,我们需要手动为特定字段启用。

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

图 8 .添加字段数据屏幕——由作者捕获

添加வகை(genre)作为字段数据后,我们就可以进行分桶了。这种聚集存储的结果是基于类型的。这意味着将根据流派创建存储桶,并汇总每个存储桶/流派中的文档。

"aggs": {
   "ratings": {
     "terms": { "field": "வகை" }
   }
 }
}

尝试歌词搜索与用户界面的简单查询

  • 分叉并克隆回购
  • 从克隆的 repo 中提取 Analyzer 文件夹,并将其添加到 ElasticSearch/config 文件夹中
  • 运行弹性搜索
  • 运行“bulkdata.py”添加索引(如果不是手动添加的,则取消对索引部分的注释)并添加数据
  • LyricSearch 部件添加到 UI 的 htdocs 文件夹中。
  • 转到http://localhost/lyrics search/
  • 搜索歌词(目前仅适用于此用户界面的基本查询)

来自作者 github 的 query.py

github 只为某些查询定义,如基本查询、模糊查询、聚合查询。尝试 postman 集合,尝试上面小节中描述的各种其他查询。

来自作者 github 的 searchquery.py

这个searchquery.py阐述了我们如何通过 python 脚本进行搜索。

  • 对于高级查询,尝试来自 postman 的 Postman 查询集合(repo 中提供的 Postman API 调用集合)
  • 回购正在开发中,以支持高级查询。

这停止了我的博客开发一个简单的歌词搜索引擎(具体到 Thamizh)。下期博客再见。

使用 Python 按特定属性对对象列表进行简单排序

原文:https://towardsdatascience.com/simple-sorting-of-a-list-of-objects-by-a-specific-property-using-python-dac907150394?source=collection_archive---------30-----------------------

这没有你想象的那么难

在我对 Python 和数据建模的初步实验中,我必须将数据导入到我的 Jupyter 笔记本中。我想到了排序,并且想到了如何使用特定的实例变量(比如 name)对对象列表进行排序。例如,我有一个由名称和价格组成的汽车对象列表。

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

所以我想生成一个列表,其中的结果按照汽车名称的字母顺序排序,如下所示。我不想使用任何库,所以没有为我导入。

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

Googling 没有给我返回太多信息,因为结果返回了大量关于数字排序的信息,一些关于单词排序的结果,没有令人满意的作为实例变量一部分的单词排序结果。所以我决定尝试一下。Python 不是我日常工作中需要做的事情。但是当需要的时候,我偶尔会使用 Python 来编写脚本。所以我想我应该尝试一下。

这就是我解决问题的方法,我的示例代码如下所示

首先,我将声明一个汽车类,并创建一个列表来插入这些对象

class cars:
    def __init__(self, name, price):  
        self.name = name
        self.price = price unsorted_cars = []
unsorted_cars.append(cars('Ford', 20000))
unsorted_cars.append(cars('Volvo', 50000))
unsorted_cars.append(cars('BMW', 24000)) 
unsorted_cars.append(cars('Toyota', 15000)) 
unsorted_cars.append(cars('Kia', 12000)) 
unsorted_cars.append(cars('Audi', 40000)) 
unsorted_cars.append(cars('Tesla', 30000))

因为我想按照卡片的名称对列表进行排序,所以我创建了一个空列表,将汽车名称放入该列表,并使用标准的排序函数对列表进行排序

sorted_car_name = []
for car in unsorted_cars: 
	sorted_car_name.append(car.name)sorted_car_name.sort()

这将返回一个按字母顺序排序的汽车名称列表。最后,现在我有了排序后的名字列表。我可以以此为参考,使用这个双 for 循环遍历未排序 _ 汽车列表,并使用每个汽车对象中的名称实例变量与已排序 _ 汽车名称列表中的每个单词进行比较,如果匹配,则将其插入新的空列表已排序 _ 汽车列表

sorted_car = []
for sort_car in sorted_car_name:  
	for unsorted_car in unsorted_cars:
		if unsorted_car.name == sort_car:
			sorted_car.append(unsorted_car)
			break

sorted_car_list 现在将按照汽车名称的字母顺序排列汽车的最终列表,如上表 2 所示。请注意,由于双 for 循环,这种方法不是很有效,在双 for 循环中,我们遍历未排序 _ 汽车中的购物车对象列表,然后遍历已排序 _ 汽车 _ 名称中的每个单词,进行比较以查看是否匹配,然后我们将未排序 _ 汽车对象插入到已排序 _ 汽车列表中。

你可以在这里下载示例 Python 代码。要运行代码,只需在命令行输入**’ python python _ sort _ sample . py '**,它就会打印出未排序的汽车列表和最终排序的汽车。我希望这能对任何 Python 爱好者有所帮助。

心灵的朋友,文瑞,刚刚给我指出 Python 有一个 sorted() 函数可以用。函数的作用是:接收一个对象列表,作为排序依据的关键字,并返回排序后的列表。这个函数使用 Lamba 来创建一个匿名函数。因此,为了对未排序的汽车名称列表进行排序,我们使用

result_list = sorted(unsorted_cars, key=lambda cars: cars.name)
for car in result_list:
        print(car.name + " and price is " + str(car.price))

所以,通过传入未排序的汽车列表,匿名函数和作为排序依据的属性,也就是汽车的名称。我们将在 result_list 中得到排序后的列表。这是一种更好的排序方式,尽管 Lamba 的使用将您的 Python 代码转变为函数式编程范式。

我已经更新了我的示例代码,并将 sorted() 方法包含在这个 gisthttps://gist . github . com/gib Tang/83f 9681 b 525908900 ec4b 490992 f032d

排序函数的一些相关链接
https://Julien . danjou . info/python-functional-programming-lambda/
https://docs.python.org/3/howto/sorting.html
https://www.w3schools.com/python/ref_func_sorted.asp

使用 twitter-nlp-toolkit 进行简单的 Twitter 分析

原文:https://towardsdatascience.com/simple-twitter-analytics-with-twitter-nlp-toolkit-7d7d79bf2535?source=collection_archive---------37-----------------------

Twitter 是商业分析和学术或教学自然语言处理最丰富的数据源之一;Kaggle 上的许多顶级 数据集是在 Twitter 上收集的,最受欢迎的文本嵌入之一是使用 Twitter 训练的,几乎每个公司都在积极监控 Twitter。

原因有很多:Twitter 有一个可访问的 API,它的 hashtag 系统使数据收集和分类变得容易。也是因为 Twitter 是一个令人难以置信的两极分化和反动的平台;当某件事成为“推特上的流行趋势”时,它通常是一个令人震惊的产品公告,一个受到批评的新版本,或者有人说了一些煽动性的话。这使得 Twitter 成为公众情绪的一个极其强大的信息来源。我和我的合作者注意到,我们经常被分派收集和分析 Twitter 数据的任务,所以我们决定为此构建一个用户友好的包— twitter-nlp-toolkit 。在这里,我将通过我今年早些时候制作的一个可视化展示来告诉你如何使用它,展示伊隆·马斯克在 Twitter 上的几个煽动性评论的影响。

首先,你需要注册一个 Twitter API 密匙,安装软件包,并安装 Spacy 的en_core_web_sm模型。你可以很容易地做第一个这里——你将被简单地要求提供一个你正在做的需要一个的快速描述——后两个甚至更容易;只需在你的终端中运行pip install twitter-nlp-toolkitpython -m spacy download en_core_web_smtwitter-nlp-toolkit需要
tensorflow ≥2scikit-learn ≥0.22,所以你可能要把它安装在一个新的虚拟环境里。

倾听

Twitter API 的主要产品是一个监听器,它允许您将 tweets 实时传输到磁盘。搜索逻辑记录在这里。首先,将您的 Twitter API 密匙作为keys.key.json格式保存在您的工作目录中,如下所示:

你可以建立你的听众。这将监听包含“Musk”和/或“Tesla”的推文(如果你想要两个关键词,只需设置target_words = [‘Musk Tesla’])。)

这将持续不断地将所有包含“Musk”和/或“Tesla”的推文发送到musk_tweets.json。该文件可能会变得非常大,并且包含许多可能无关的信息,因此应该监控磁盘使用情况。比如这条推文:

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

“我对@elonmusk 的看法现在是零,开尔文。”— @AltPublicLands

被保存为超过 10kB 的信息:

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

呀。解析器会将包含 tweets 的.json文件转换成更易于管理的.csv文件:

生产parsed_musk_tweets.csv:

(因为我们没有商业 Twitter API 密匙,所以我们看不到用户的确切位置。)

我们还可以使用批量下载工具获取马斯克本人最后 200 条左右的推文:

这将产生已经以.csv格式解析的 tweets。

情感分析

twitter_nlp_toolkit 还包括一个情绪分析包,可以评估推文的正面或负面:

情感分类代码

predict()函数产生二元预测——0 表示负数,1 表示正数——而predict_proba() 产生连续预测。

我们的模特意识到这不是赞美

在 Tableau 中将推文量和平均情绪绘制为时间的函数,产生了以下可视化效果,表明虽然 Twitter 对淡化新冠肺炎严重性的推文有些担忧,但他们对关于特斯拉高股价的推文更加担忧。

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

随着时间的推移,受平均情绪影响的推文量。对比度得到增强,以提高可见度。

也可以利用用户账户位置来产生估计的地理地图。这里我使用了 Tableau 的地理编码服务;然而,Tableau 只能解释不到 20%的用户提供的位置,其中一些解释是不可信或不准确的。谷歌地图可能会做得更好,但免费层每天的请求数量限制在 2000 个左右:

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

这里还应该注意的是,在我们的测试中,情感分析只有大约 85%的准确性,在野外可能不太准确;我们的情感分析工具仅使用sensition 140数据集对文本内容进行训练,该数据集已相当陈旧。虽然我们正在努力改进模型,但它们可能只用于观察趋势,而不是对单个推文进行分类,除非它们可以在领域数据上进行微调。

功能愿望列表

该软件包仍在积极开发中,但这里显示的功能应该不会中断。当前的优先任务包括改进情感分析模型,提高推文解析和语言预处理的效率和定制,以及集成谷歌地理编码 API。

软件包中的所有代码,包括更多的例子,都托管在 Github 这里。我们鼓励读者带着问题或功能需求联系开发人员。

具有 Github 操作的简单版本化数据集

原文:https://towardsdatascience.com/simple-versioned-datasets-with-github-actions-bd7adb37f04b?source=collection_archive---------48-----------------------

实践教程

不到 10 行 Python 代码,保存了著名 CEO 的历史

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

凯文·Ku 拍摄于 Pexels

背景

几天前偶然发现了一篇关于作者创造的“git 抓取”概念的文章。这个过程最引人注目的方面是,作为开发人员,我不必维护服务器或大型代码库来获得最新的版本化数据集。我实际上可以利用 git 的版本控制功能和 Github 的动作。这个过程对我来说太有趣了,我不得不亲自尝试一下。这是我记录的旅程,所以你可以对你自己的数据集做同样的事情。

查找我的数据集

为了充分利用我的数据集的 git 版本控制,我想寻找一个数据集,在这个数据集上,随着时间的推移,查看它的变化会有附加值。我也不希望这些更改过于频繁,这样提交就会变得稀疏,这样单独的更新就更容易被识别出来。

在未能找到一个好的啤酒厂数据集后,我决定监控这张著名公司首席执行官(CEO)的表格。这个列表以表格的形式出现在维基百科页面上。

[## 首席执行官名单

以下是著名公司首席执行官的名单。的…

en.wikipedia.org](https://en.wikipedia.org/wiki/List_of_chief_executive_officers)

抓取维基百科

现在我的数据集已经确定了,我只需要编写一些代码来检索我们想要存储的信息。我还想确保以一种将来易于接收的方式公开它,以一种自动化的方式,因此考虑到这一点,我决定将这些数据存储为 CSV 文件。

要求

对于我提出的解决方案,需要以下 Python 3 包。在最终的存储库中,这些显示在requirements.txt文件中。

  • 熊猫——这可能是另一个类似于 tablib 的库,但是为了以防万一,我选择了熊猫
  • lxml —这个库在从 html 表格中获取表格的函数中得到利用。

摄入代码

我需要做的第一件事是从维基百科获取表格。幸运的是熊猫正好有这个功能。

在上面的代码中,我使用read_html检索该表,将标题标识为第一行,并选择第一个表添加到 DataFrame 中。此时,我已经将文件加载到 Pandas Dataframe 中,但是仍然需要将该文件导出为 CSV 文件格式。在此之前,我注意到摄取的数据有问题。

如您所见,我仍然需要删除显示在结果中的引用注释。为此,我添加了一个正则表达式来去掉这些注释。

首先将数据帧转换成 CSV 文件更容易,所以在应用正则表达式去除注释之前,我先转换了数据格式。在这一点上,我需要做的只是写入我希望数据驻留的文件,数据集已经成功地到达了预期的目的地。

如果您想将此代码用作参考实现,这里是运行来更新数据集的最后一个 main 函数。

由 Github 操作运行的 main.py

Github 操作工作流程

此时,我能够从 Wikipedia 获取该表,并将清理后的结果写入 CSV 文件。下一步是现在安排这个过程,当且仅当数据改变时,将结果提交给 Github。

在我构建动作工作流的步骤之前,我需要安排它每小时运行刚刚开发的代码。为了做到这一点,我需要以预定义的 yaml 格式为每小时的频率定义 cron 调度。

在构建我的工作流之前,我想定义 Github 动作需要运行的图像。为了简单起见,我只是让它使用最新版本的 ubuntu 运行,但在未来,一旦我有时间更深入地进行操作,我会使用一些更轻松的图像,如 python slim 版本或 alpine。

这个 Github 动作在它的工作流程中有许多步骤,在此之前,数据集可以被监控是否有变化。我们 cron 工作流的第一步是签出我们主分支的工作副本。我最近在实验中注意到,这通常是我利用的大多数行动的第一步。

在上面的第 4 行和第 5 行中,我们实际上不需要指定提取深度,因为默认值是 1,但是这定义了要提取的提交数量。起初,我打算尝试用它来比较数据集的版本,但正如你稍后会注意到的,这是一个不需要探索的兔子洞。我能够使所有这些工作合理化的方法是在我的文章中保留对该功能的引用,以供将来的读者查看。

既然我已经有了在动作工作流中运行的代码的工作副本,下一步将是让 Python 3.8 设置开始运行代码。和前面的步骤一样,下面你可以看到 Github 也为此提供了一个动作。Python 版本很容易设置,但是对于我的例子来说,目标是 3.8。

现在我们已经安装了 Python,我们希望安装所需的库。我在这个 repo 中包含了一个 requirements.txt 文件,但是这个步骤也可能是一个pip insall pandas lxml

在工作流中的这一点上,运行我们的代码以更新数据集所需的一切都已经提供给了环境,因此在这一步中,我们现在将这样做。

此时,我们拥有数据集的最新版本,该版本可能已更改,也可能未更改。因此,我们在这里要做的只是提交,如果数据已经更新,就推送。注意这里我们提前退出动作,如果是这样就不要推了。这里可以使用一些不同的模式,但是如果你好奇的话,Simon Wilson 在这里提到了一些。否则,一个干净的方式来实现我们想要的可以在下面找到。

这是其全部荣耀中的操作流程,您可以随意使用,但此时只需提交不到 10 行的 Python 代码和带有操作工作流的 yaml,一切都应设置为保存历史的版本化数据集。

我通常会发现,当我有一个参考实现时,工作起来会更容易,所以这里是包含完整代码库的 repo,其中包含我刚才单步执行的操作工作流。

[## Dylan Roy/CEO-数据集

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/dylanroy/ceo-dataset)

关键要点

正如你所看到的,它实际上很容易接收,并保持数据集最新,而不需要你自己的基础设施和一点点代码。Github 动作为简单的自动化提供了更多的选择。在这篇文章的例子中,我的回购是公开的,所以为了支持开源项目,Github 完全免费。

正如你从我的旅程中看到的,用一点 Python 知识,利用 Github 动作开始保持数据集更新并不困难。

我有另一个教程,我将在本周出版,所以请随时关注我,这样你就不会错过它,如果你对我的其他教程感兴趣,我将它们列在下面。

阅读迪伦的其他教程

[## 用 Python 创建漂亮的架构图

停止花费时间手动调整未对准的箭头

towardsdatascience.com](/create-beautiful-architecture-diagrams-with-python-7792a1485f97)

资源

简单的可视化非常棒

原文:https://towardsdatascience.com/simple-visualizations-are-pretty-darned-great-f5235c53df47?source=collection_archive---------40-----------------------

如果你像我一样不擅长 Viz,我们还有希望

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

图表中的图表(作者:Randy Au)

我必须承认,我有萝卜的艺术和视觉技巧。

这并不是说我曾经欺骗过自己,假装自己很擅长——我几乎总是依靠非常简单的日常工具,体面地过日子。但是在最近的一次团队场外活动中,我突然发现我已经变得对它超级适应了,这是一种非常奇怪的感觉,因为我真的应该改进这样一个缺陷。

触发这种认识的事件是由我上面的集团董事 2 组织结构图级别主持的 UX 峰会。大约有 100 人出席,包括我们产品领域的所有 UXers,所以在人群中有设计师、研究人员、作家和工程师,大概是这个顺序。我想房间里有两个量子 UX 研究员,包括我自己。

该活动的部分活动涉及一系列 10 个 3 分钟的闪电谈话,我是其中之一。人们谈论他们学到或做过的事情,在会议上做研究,他们开发的有趣的新功能,组织研究的框架,等等。我完全专注于品牌,正在谈论我的团队建立的流程,该流程用于设置和监控功能工作的成功指标。

当我那天看完所有的演示时,我意识到每个人都在使用漂亮的图形、可视化、照片,甚至视频剪辑,来讲述他们正在讲述的任何故事。有设计背景的人在这方面尤其出色,他们使用了一些最令人惊叹的设计图形和可爱的 gif 口音。

与此同时,我用默认的谷歌幻灯片字体在白色背景上显示黑色文本。我对设计的唯一认可是从 UX 团队的模板中复制的标题卡。回想起来,肯定有很多地方都有时间表、示例度量图等。,会更容易理解。但是在准备的几周里,我没有想到把一个很长的演讲缩短到 3 分钟。在那模糊的 360 秒里,我所有的话,以及从我嘴里说出来的一切。

虽然这个故事主要是说我在演讲时缺乏对设计和美学的优先考虑,但我向你保证,这个性格缺陷适用于我制作的任何图表。斯巴达是描述事物的好方法,这是我需要努力的地方。

作为数据人员,我们最重要的职责是将我们的发现和结果传达给其他人。无论是授权给决策者,帮助团队达成共识,还是向客户提供信息,都需要沟通。如果我们在最后一步失败了,我们的结果是否是完美的预言也没有关系。视觉化通常对沟通过程非常重要。一幅制作精良的图像,即使是非常简单的图像,也能比文字更好地表达观点。

现在著名的“拉平曲线”图形可能是过去几个月中“简单但强大的 viz”最突出和最令人难忘的例子。顺便说一句,在这里可以很好地看到这个图形的历史。

类似地,一些陈述只能通过可视化来理解,比如选举地图,网络地图。数据点太多,很难用文字来概括。

所以,我只想说,在这个角色中拥有视觉化技能从来都不是坏事。我想不出在任何情况下成为数据可视化的大师会有什么坏处。

令人惊讶的是,你可以用非常非常少的这些技能走多远,这里是我在生活中使用的几个工具。

Lv 1:简单的可视化往往就足够了

大概 99%为工作制作的图表都是用电子表格制作的。开始时,我可能会用复杂的 SQL 和代码处理大量的数据,但最终的演示步骤通常很小,足以放入一个简单的电子表格,可能还会有一个数据透视表,以便我可以播放、格式化和扩充最终的图表结果。

剩下的 1%时间是我不得不依靠 Python 或类似语言中一些更强大的外部工具。这是如此的罕见,以至于我每次做的时候都要查阅文档来绘制一个折线图。我不知道如何使用 D3 或者其他强大的工具。但是尽管我能力有限,我还是设法一瘸一拐地走了下去!

到处都是线!

如果要我猜的话,我的图表中有超过 70%是简单的线形图,你可以在 Windows 上最多通过 6 次按键(ctrl-a,alt,n n,1,enter)从 Excel 中输出。当他们在功能区上添加了太多功能时,他们在命令链中插入了一个“1”,多么令人讨厌。

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

我的大多数演示图表看起来都像上面这样😜。垂直的“启动”虚线是我的一个花哨的 viz 技巧。我不得不做太多的前/后分析。

我制作的另外 20%的图表只是条形图的变体,水平的或垂直的。剩下的部分是面积图(反正只是彩色的堆叠线)、堆叠条形图,偶尔我会用烛台图来近似误差棒线。我几乎从来不预测未来,所以我从来没有真正制作过误差界限线图,没有专门的软件包很难制作。

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

大多数时候,只要有适当的标签,一张类似上面的图表就足以让我理解我需要理解的任何一点。事情呈上升趋势,目前的指标与历史水平相似,我们没有因为发布而破坏系统,等等。诸如“样本量小,所以误差可能很大”这样的警告是通过画外音、脚注或添加到标题中来传达的。

这对于半正式的团队工作非常有效,在这种情况下,我们需要快速查看数据点或趋势,做出决定,然后永远不要再查看相同的图表(我们可能会在未来查看更新的图表)。将数据转换成适合图表的格式(装箱、标准化、剔除工件等)已经够麻烦的了,改进演示文稿的边际收益是不值得的。

对于更高级别的涉众的更正式的演示,出于演示的原因,我将在表面样式上投入额外的精力。升级通常包括确保所有标题、轴和图例都格外清晰,添加线条粗细/破折号以增加/消除强调,异常数据点在脚注中附有解释,等等。

在一天结束的时候,一个美学上令人愉悦的图表比一个有着相同内容的非常丑陋的图表更令人难忘。你也不希望小瑕疵分散你的主要信息。

Lv 2:图表。但是用语言

当我出于演示目的需要让变得真正奇特时(不可否认很少),我通常会拿出带注释的折线图,如下所示。这是一种为令人沮丧的时间序列提供更多背景信息的方式。同样,所有这些都是用 Excel 或工作表中的透明色块和文本框完成的。这是我的努力,也是我艺术能力的上限。

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

我在 Photoshop 中根据内存重新创建示例图表,因为在电子表格中我想要的地方人为地创建带有任意屈折的弯弯曲曲的长线条很烦人。这个图表的目的是简单地提供一段时间内的销售情况。因为每时每刻都有一大堆事情在发生,有时还会重叠,所以不可能找出哪些时间段足够相似来进行比较。

所有的注释和框都是手工完成的,这是一个巨大的时间投资,所以它被保留到需要理解回报的时候。我的颜色感觉特别差,所以当我需要在一个图表中包含 6 种以上的颜色时,事情变得非常难看,它们看起来不可能都一样,但也不能相互冲突。恶心。

尽管成本很高,但在图表上手写注释远比争论独立的数据系统要痛苦得多,我需要将这些独立的数据系统组合起来才能使其工作。其中一些数据点只存在于人们的头脑或随机的电子表格中。

Lv 3:更硬的东西通常有另一个用途

简单的视觉化很擅长清楚地表达一两点,因为它们能够编码的信息量是有限的。你可以用注释和颜色之类的巧妙技巧再多塞进去一点,但是还是有限制的。

除了简单的东西之外,当需要的时候,我会拿出一些更复杂的东西,但是我发现它们有不同的用途。地图、桑基图、网络流程图、动画,这些可视化的复杂性意味着人们需要时间来消化它们,或者它们是为探索而设计的。在某些情况下,它们有助于分析和理解,但在我个人的日常生活中却没有用。

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

来自https://developers . Google . com/chart/interactive/docs/gallery/Sankey的 sankey 示例

由于不熟悉制作这些可视化效果的细节,我主要依靠预建的版本来制作。Excel 的映射功能惊人地强大(我一生中已经做了足够多的 ZIP->FIPS 映射,以至于还想再做一次),有一些库可以根据需要制作桑基图。漏斗下降图我只是慢慢地用手或黑一个条形图来做。

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

懒人群组分析

有时我会给一个数字网格着色,就像队列分析一样…然后把它作为一个缩小的图形来阅读。它足够接近于我的大脑进行分析的可视化,而不需要实际做些什么。仅仅通过观察数字的形状就能很容易地看出模式。

吕∞:遥不可及的东西

当我想到我永远也做不了的非常酷的 vis 时,我会想到那些经常来自纽约时报数据团队、卫报或流动数据网站的工作。

其中许多都是复杂的设计,显示了对显示的每个像素投入的许多小时的工作。即使是简单的折线图和条形图,通常也是精心设计的,设计元素经过深思熟虑,颜色经过精心选择,轴和标签经过精心着色,不引人注目但又清晰可见,等等。

这并不是说我没有时间来制作如此美丽的图形,如果有一千个小时的空闲时间来尝试,我真的无法自己制作一个。我能做的最好的事情就是盲目地模仿,很可能会失败。

但至少,我可以坐在我的椅子上,欣赏我知道有人花了一些时间的小细节,因为默认设置(如果默认设置存在的话)看起来永远不会完全轻松。

尽管缺乏美感,但仍有影响力

考虑到我的 Lv 2 有多简单。问题是,你可能想知道你能走多远。

举例来说,这是我迄今为止 12 年多职业生涯中最好的(即最有影响力的)图表。这是一个“奇特”的双图形——棒线!再次在 Photoshop 中重新创建,但原始版本是许多年前在 Excel 中完成的,所以想象一下它的块状,锯齿状,默认红/蓝荣耀。由于我的记忆有缺陷,细节被更改以掩盖起源,并且在公共场合随意挥舞任何人的客户保持数据都不是件好事。

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

这张图表背后的故事是这样的:我的老板要求我做一个“是什么驱动了留存”的分析,因为一些投资者问了这个问题。在花费数周时间进行大量数据清理和大型回归分析后,一个没有人真正关注的因素出现了。分析该因素的结果变成了这张图表,它本质上是说“在续订时有净积极的[特定类型]活动意味着非常高的保留率!”。

我之所以称之为“我最好的图表”,是因为这个简单的图表能引起人们的讨论。产品人员很快意识到,他们可以做出改变,让许多客户的“净活动”增加 1 到 2 个单位。该公司并没有真正考虑过移动网络活动统计,他们认为这只是系统的一个有机属性。人们很兴奋,他们开始试验,几个月后,他们发现了针对用户共鸣的指标的非常棒的功能设计。

突然之间,整个公司的指标同比增长了 40%,而此前有一段时间,这一数字一直停留在 15%。我们的产品开发相当于一口油井,这张图表是我们最初的地图。太疯狂了。我们也不知道这种极高的增长会持续多久。人们不断问我这个问题,我没有办法模拟前所未有的增长。它最终持续了近 18 个月,才平息下来。狂野。

我完全意识到我在这里非常幸运。在整个职业生涯中,找到这种影响程度的图表可能只有一两次。许多我无法控制的事情都是为了让这种情况发生,包括发现一个流行产品中被严重忽视的方面,管理、工程和产品都兴奋地测试这个想法,以及人们偶然发现有用的设计和功能。

但是只有那一次,它成功地组合在一起,并且它全部来自一个巨大管道末端的一个大 SQL 查询的 CSV 转储,最后被扔进 Excel。除了轴标签之外,它甚至没有注释。图中嘈杂的极端情况(由于样本量小,保留率变得很高)被留在了所有嘈杂的荣耀中。我很确定我用默认的 Excel 蓝色和红色离开了图表。

我很确定,当时,我知道这个图表在说一些重要的东西,但是我认为它会是另一个一次性图表。我把它展示给人们,以获得我需要为一个完美的版本所做的改进的感觉……但是从那以后它就像病毒一样传播开来,所以我从来没有机会清理它。哦好吧。

¯_(ツ)_/¯

最初发表于 统计数据 ,兰迪的免费每周时事通讯涵盖了数据和技术中更平凡、更重要的部分。

在 scikit-learn (Python)中为您的数据找到合适算法的简单方法

原文:https://towardsdatascience.com/simple-way-to-find-a-suitable-algorithm-for-your-data-in-scikit-learn-python-9a9710c7c0fe?source=collection_archive---------14-----------------------

入门

使用这种实用的方法解决监督学习问题

在建立模型时,数据科学家需要选择合适的机器学习算法来使用。使用我们最喜欢的算法很有诱惑力,但是,对于数据来说,它可能并不总是正确的。那么我们如何从所有可用的选项中选择一个合适的算法呢?一个好的方法是在你的数据上尝试多种算法,从选项中选择一个或几个性能最好的算法来进一步微调。这个想法并不新颖。事实上,它可能是你已经以某种形式在做的事情。在这篇文章中,我将展示一种有组织地尝试多种算法的方法。

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

凯文·KuUnsplash 上拍摄

1.准备数据📦

如果你想跟随你电脑上的代码,确保你有numpypandasseabornsk learn xgboost

假设我们想为一个分类问题找到一个合适的机器学习算法。对于我们的示例,我们将使用 titanic 数据集中的一个要素子集。让我们导入相关的包和示例数据:

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

让我们将数据分成训练集和测试集。我们还将定义对以后预处理数据有用的特征组:

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

我们现在将准备几个自定义的转换器来预处理数据:
◼ ️️ Imputer:用一个常量值进行估算,并在熊猫数据帧中返回估算的数据
CardinalityReducer:将不常用的类别聚集到“其他”类别中,并在熊猫数据帧中返回转换后的数据

你会注意到,这篇文章中定义的大多数自定义函数或方法都返回数据帧,因为它们更容易查看。

现在,让我们转换数据。我们将并行预处理数字和分类特征。使用ColumnTransformerPipeline,我们将:

  • 将数据分成两组:分类数据和数字数据
  • 对每个组应用不同的变压器组
  • 将结果粘贴在一起

如果这是你第一次看到ColumnTransformer和/或Pipeline,下面的代码可能不容易理解。如果你想了解他们更多,我已经专门写了一个单独的帖子来解释这两个。

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

部分输出

2.评估多种算法🔧

现在,我们已经到了这篇文章的关键部分。利用您对数据和建模技术的了解,您可以选择一组潜在的候选者来尝试您的数据。例如,探索性的数据分析可能已经暗示了一些关于哪种算法可能对数据有效的方向。另外,你的机器学习算法的理论知识也可以指导你。像这样的小抄可能也会派上用场。

一旦你有了一套要尝试的算法,你就可以对数据逐一尝试每一种算法。然而,使用一些功能,我们可以让这个过程更有条理。这些功能的想法是从这里得到的启发。

我们将需要定义我们决定在create_baseline_classifiers函数中的数据上尝试的所有算法。在这个例子中,我们使用的是开箱即用的分类器,没有任何超参数调整。但是,如果您愿意,可以在这个阶段调整超参数。我们在这里包括了虚拟分类器作为基准:

assess_models()目前的定义方式使其能够创建多个指标的绩效总结。但是,如果您愿意,也可以只包含一个指标。或者,我们很快会看到如何从输出中提取单个指标性能。现在,是时候根据训练数据评估模型并比较它们的结果了:

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

使用我们创建的第三个函数,让我们根据一个单独的指标来比较所有的模型:ROC 曲线下的面积。

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

这是一个非常有用的总结,不是吗?只看平均表现是不够的。因此,我们在这里包括了其他列,以便为我们提供关于跨褶皱性能的更详细的信息。在分析了结果之后,我们应该列出候选名单,并把我们的努力方向放在微调一个算法上,或者如果你愿意的话,一个精选的前几个算法。

这种方法也可以很容易地修改成回归问题。例如,下面是一个创建多个回归变量的示例函数:

我发现这些函数对数据科学项目很有用!⭐️,我希望你也是。

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。我希望你能在你的监督学习项目中使用这种方法。如果你感兴趣,这里有我的一些帖子的链接:
◼️ 用这些提示整理你的 Jupyter 笔记本
◼️ 探索性数据分析指南
◼️python 中的探索性文本分析
◼️️ 给熊猫用户的 5 个提示
◼️️ 在熊猫中进行数据聚合的 5 个提示
◼️️ 在熊猫中编写 5 个常见的 SQL 查询

再见🏃💨

自然语言处理中的简单单词嵌入

原文:https://towardsdatascience.com/simple-word-embedding-for-natural-language-processing-5484eeb05c06?source=collection_archive---------29-----------------------

单词嵌入是一种将单词或短语表示为实数向量的语言建模技术。这些单词被组合在一起以获得具有相似含义的单词的相似表示。单词嵌入学习单词之间的关系来构建表示。这是通过各种方法实现的,如共生矩阵、概率建模、神经网络。它已经成为自然语言处理的基础知识之一。

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

乔恩·泰森在 Unsplash 上拍摄的照片

一键向量是单词的简单表示之一。每个单词都可以用一个热向量来表示,但是随着单词数量的增加,维数也会增加。单词嵌入通过使用各种方式来减少单词向量的维数,例如单词如何集体出现,如 King、Queen 或可以交替使用的单词,如 car、vehicle 等。所以相似的词用相似的向量表示。这降低了向量的维数。虽然一个热点向量很容易构建,但通常没有一个好的选择来表示大量的单词。这是因为它确实允许表达语料库中单词之间的相似性。

Word2Vec,GloVe 是流行的单词嵌入。伯特是一个最新的单词嵌入。

单词嵌入分为两种类型

基于频率的嵌入—计数向量、共现向量、哈希向量器、TF-IDF

预训练的单词嵌入— Word2Vec、GloVe、BERT、fastText

本文讨论了基于频率的嵌入及其在自然语言处理问题中的应用

频率基嵌入

基于频率的嵌入根据单词在文本/文档中出现的频率对文本进行矢量化。使用频率基嵌入的一个例子可以在文本分类中使用。考虑到我们将文本分为不同的技术、政治、经济等类别。使用基于频率的矢量器,例如计数矢量器,对文本中的单词进行矢量化。然后根据频率矢量化得到的向量对文档进行训练。编写的模型将能够预测文档类型。这是因为有些词在每种类型的文档中出现的频率会更高。与政治或经济文档相比,技术文档会有一套不同的词汇。

计数矢量器

CountVectorizer 是一个非常简单的矢量器,它获取文本中单词的频率。CountVectorizer 用于将文本文档集合转换为单词/单词计数。

考虑文本“杯子在桌子上”

Data =[‘The ‘,’ cup ‘,’ is ‘,’ present ‘,’ on ‘,’ The ‘,’ table’]

这可以矢量化为

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

计数矢量化可以通过 Sklearn 的 CountVectorizer 完成。下面是使用它的例子。计数矢量器根据单词在文档中出现的频率对文档进行编码。CountVectorizer 给出了文档中单词/ n 元语法的频率的稀疏矩阵。这对于创建文档分类、文档聚类、情感分析

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

同现向量机或 N 元语法

ngram_range 的默认参数是(1,1),它从文档中一次取一个单词的频率。ngram 范围给出了单词的下限和上限。这是必需的,因为有些单词如果单独使用,并不能给出完整的意思。例如,以文本“好书”、“好书”、“一美分”、“相当便宜”为例。在这些例子中,单词“nice read”的集合给出了比单个单词更完整的意思。

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

计数矢量器从文本中提取特征的简单方法之一,这些特征可以在以后的模型开发中使用。

哈希矢量器

HasingVectorizer 类似于 CountVectorizer,但它不存储文档的词汇。它使用散列来查找令牌字符串名称到特征索引的映射。

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

哈希矢量器将文档转换为包含标记出现频率的稀疏矩阵。根据 norm 参数,这被归一化为令牌频率。可以是 l1 范数,也可以是 l2 范数。

哈希矢量器有几个优点。

因为不需要存储词汇词典,所以减少了存储器消耗。

因为它不保持任何状态,所以浸酸和去浸酸很快。

由于没有使用状态,它可用于流式或并行管道数据。

这有一些缺点

不可能检索字符串名称,因为它们没有被存储。

如果特征的数量较少,则可能存在特征共谋。

没有 IDF 加权,因为它会呈现此状态。

当您拥有大型数据集时,最好使用哈希矢量器,因为它可以减少内存消耗并加快算法速度。如果数据集很小,那么最好使用计数矢量器,因为它很简单。

TF-IDF 矢量器

简单的基于频率的矢量器有时可能达不到目的,因为它只给出单词的频率。TF-IDF 矢量器试图解决这个问题。TF-IDF 是“词频—逆文档频率”的首字母缩写。

TF —术语频率:这是单词在文档中出现的次数

TF =(单词在文档中出现的次数)/(文档中的单词数)

IDF-逆文档频率:这将缩减文档中频繁出现的单词。

IDF = log_e(文档数/出现该术语的文档数)

基本上,TF-IDF 增加了对文档重要的单词或标记的值。

搜索引擎使用 TF-IDF 对与查询相关的文档进行排序。

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

CountVectorizer 给出了单词使用的绝对数量,但是 TF-IDF 给出了单词在文档中的重要性。

考虑一个文本分类问题。有些词在某种文件中很重要。考虑到关于药物的文档中会有一些医学术语,这些术语在文档中会很重要,TF-IDF 会突出显示这些术语。类似地,考虑与体育相关的文档,TF-IDF 将突出显示与体育和游戏相关的术语。

使用单词嵌入解决简单文本分类问题

让我们看看简单的测试分类问题,并使用单词嵌入来解决它。

这是一个垃圾短信分类的问题。这是从拥有 CC0 许可证的 Kaggle 获取的数据集。

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

将信息读入熊猫数据框。

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

使用计数矢量器作为单词嵌入

用计数矢量器拟合单词嵌入

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

使用 Sci-kit 中的标签编码器学习编码标签

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

将数据集分为训练数据集和测试数据集。

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

现在我们使用 Keras 创建一个简单的神经网络模型。

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

我们创建了一个简单的模型,有两个隐藏层,分别是 64 个节点和 32 个节点。我们已经使用 Softmax 层获得了火腿和垃圾邮件的输出。

我们使用 adam optimizer 进行优化,使用分类交叉熵进行损失。

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

我们可以使用 evaluate 函数来评估我们的模型

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

用 TF-TDF 做词嵌入 用 TF-TDF 拟合向量

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

使用 Sci-kit 中的标签编码器学习编码标签

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

将数据集分为训练数据集和测试数据集。

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

现在我们使用 Keras 创建一个简单的神经网络模型。

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

我们创建了一个简单的模型,有两个隐藏层,分别是 64 个节点和 32 个节点。我们已经使用 Softmax 层获得了火腿和垃圾邮件的输出。

我们使用 adam optimizer 进行优化,使用分类交叉熵进行损失。

评估模型

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

预测函数可用于进行预测。

得到模型的概要。

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

使用哈希矢量器作为单词嵌入

用哈希矢量器拟合矢量

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

标签编码器的使用和模型的创建保持不变。

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

我们看到参数的数量减少了,这取决于所用特征的大小。

结论

计数矢量器、散列矢量器和 TF-IDF 矢量器可用于为自然语言处理任务的单词创建单词嵌入。

在哈希矢量器中,参数所需的内存较少。参数的数量取决于特征的大小。此外,在哈希矢量器中,由于词汇不存储在哈希矢量器中,因此节省了词汇的存储量。

对于稍微复杂的分类工作,TF-IDF 获得了更好的准确性,因为单词在特定类型的文档中的出现被赋予了重要性。

作者

斯里尼瓦斯·查克拉瓦蒂——srinivas.yeeda@gmail.com

钱德拉舍卡——chandru4ni@gmail.com

Python 中的简单单词云

原文:https://towardsdatascience.com/simple-wordcloud-in-python-2ae54a9f58e5?source=collection_archive---------2-----------------------

💡 单词云 是一种可视化文本中频繁出现的单词的技术,其中单词的大小代表它们的频率。

创建单词云的一个简单方法是在谷歌上搜索“单词云”,找到一个可以生成单词云的免费网站。你可以自定义它的外观。又快又简单!

更令人兴奋的是,您可以用 Python 自己构建一个💫。这篇文章将展示如何创建一个像下面这样的单词云。

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

第三节的词云。Fancier 单词云🌸

0.Python 设置🔧

我假设读者(👀是的,你!)可以访问并熟悉 Python,包括安装包、定义函数和其他基本任务。如果你是 Python 新手,这个是一个入门的好地方。

我已经在 Jupyter Notebook 中使用并测试了 Python 3.7.1 中的脚本。

在我们开始之前,让我们确保您已经安装了以下库:
◻️ 创建单词云: 单词云 ◻️ 导入图像: 枕头(稍后将导入为pil)◻️**从维基百科中抓取文本:**维基百科

最后一个包是可选的,你可以加载或创建自己的文本数据,而不必通过网络抓取拉文本。

1.数据📦

作为我们的样本文本,我们将使用从维基百科“网络抓取”页面上抓取的文本。

# Import packages
import wikipedia
import re# Specify the title of the Wikipedia page
wiki = wikipedia.page('Web scraping')# Extract the plain text content of the page
text = wiki.content# Clean text
text = re.sub(r'==.*?==+', '', text)
text = text.replace('\n', '')

🔗我已经在另一篇关于抓取的文章中解释了这个脚本的作用。简而言之,这个脚本将提取段落中的纯文本内容,并将其分配给文本字符串。

2.字云☁️

首先,让我们准备一个绘制单词云的函数:

# Import package
import matplotlib.pyplot as plt# Define a function to plot word cloud
def plot_cloud(wordcloud):
    # Set figure size
    plt.figure(figsize=(40, 30))
    # Display image
    plt.imshow(wordcloud) 
    # No axis details
    plt.axis("off");

其次,让我们创建我们的第一个单词云并绘制它:

# Import package
from wordcloud import WordCloud, STOPWORDS# Generate word cloud
wordcloud = WordCloud(width= 3000, height = 2000, random_state=1, background_color='salmon', colormap='Pastel1', collocations=False, stopwords = STOPWORDS).generate(text)# Plot
plot_cloud(wordcloud)

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

Ta-da❕我们刚刚建立了一个单词云!以下是关于 WordCloud 函数参数的一些注意事项:

**◼️宽度/高度:**您可以使用这些选项将单词云的尺寸更改为您喜欢的宽度和高度。
◼️ random_state: 如果你不把它设置成你选择的数字,你很可能每次在相同的输入数据上运行相同的脚本时得到一个稍微不同的单词云。通过设置此参数,您可以确保完全相同的词云的再现性。你可以玩随机数,直到你找到你喜欢的单词云。
◼️背景 _ 颜色:‘白’和‘黑’是常见的背景颜色。如果你想探索更多的颜色,这个可能会派上用场。请注意,有些颜色可能不适用。希望你能找到你喜欢的东西。
**◼️色彩图:**通过这个参数,你可以设置文字显示的颜色主题。有很多漂亮的 Matplotlib 色图可供选择。我最喜欢的是“彩虹”、“地震”、“彩色 1”和“彩色 2”。
◼️ **搭配:**将此设置为 False 以确保单词云看起来不会包含任何重复的单词。否则你可能会在词云中看到’ web ‘、’ scraping ‘、’ web scraping '作为搭配,给人一种词被重复的印象。
**◼️停用词:**停用词是对文本意义几乎没有价值的常用词 We、are 和 the 是停用词的例子。我已经在这里更详细地解释了停用词(滚动到‘步骤 3。删除“停用词”部分)。这里,我们使用了来自 wordcloud 包的停用词。要查看停用词集合,使用print(STOPWORDS)并向该集合添加自定义停用词,使用此模板STOPWORDS.update(['word1', 'word2']),在生成词云之前用您的自定义停用词替换 word1word2 。您还可以自定义其他参数。查看 文档 了解更多信息。

让我们用不同的背景颜色颜色图生成另一个单词云🎨。你可以玩不同的组合,直到你找到你喜欢的。我觉得下面这个组合挺好的:

# Generate wordcloud
wordcloud = WordCloud(width = 3000, height = 2000, random_state=1, background_color='black', colormap='Set2', collocations=False, stopwords = STOPWORDS).generate(text)# Plot
plot_cloud(wordcloud)

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

假设我们对 word cloud 很满意,并希望将其保存为. png 文件,我们可以使用下面的代码来实现这一点:

# Save image
wordcloud.to_file("wordcloud.png")

3.Fancier 单词云🌸

我说的更好的单词云是指那些自定义形状的单词云,就像本文开头显示的那样。要创建一个花哨的单词云,我们需要首先找到一个图像作为遮罩。看来最大的挑战是找到正确的图像文件。你可以在谷歌图片上用关键词搜索图片:“屏蔽文字云图片”。在我的搜索过程中,我偶然发现了这个来源,一位慷慨的 kaggler 分享了一些有用的屏蔽图片。我在这篇文章的开头使用“upvote.png”来生成单词 cloud,使用了以下脚本(记得在运行脚本之前在当前目录中保存一份蒙版图像的副本):

# Import packages
import numpy as np
from PIL import Image# Import image to np.array
mask = np.array(Image.open('upvote.png'))# Generate wordcloud
wordcloud = WordCloud(width = 3000, height = 2000, random_state=1, background_color='white', colormap='Set2', collocations=False, stopwords = STOPWORDS, mask=mask).generate(text)# Plot
plot_cloud(wordcloud)

你会注意到,唯一的区别是我们将图像导入到了一个 numpy 数组,然后在 WordCloud 中添加了mask=mask。蒙版的一个特点是,最好将背景颜色设置为“白色”。如果我们尝试换成不同的颜色,单词 cloud 可能看起来不太好。让我们创建一个并查看:

# Generate wordcloud
wordcloud = WordCloud(width = 3000, height = 2000, random_state=1, background_color='navy', colormap='rainbow', collocations=False, stopwords = STOPWORDS, mask=mask).generate(text)# Plot
plot_cloud(wordcloud)

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

相对于拥有白色背景,你怎么看这个?我会让你来判断。

我喜欢单词云,并计划做一个(当然不是关于网络抓取的!🙈)用来当海报装饰我的房间。但是它也可以在其他环境中使用,例如在演示文稿和文档中作为视觉辅助。

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。我希望你已经学到了一些东西,✂️.如果你感兴趣的话, 以下是我其他一些帖子的链接:
◼️ 用 Python 从维基百科中抓取文本的两种简单方法
(下面列出了一系列关于 NLP 介绍的帖子)
◼️ 第一部分:Python 中的文本预处理
◼️ 第二部分:引理和词干的区别
◼️ 第三部分:TF-IDF 讲解
◼️ 第四部分:Python 中的有监督文本分类模型
◼️ 第 5A 部分:Python 中的无监督主题模型(sklearn)
◼️ 第 5B 部分:Python 中的无监督主题模型(gensim

再见🏃💨

SimpleGAN —用 3 行代码训练 GAN

原文:https://towardsdatascience.com/simplegan-train-gans-with-3-lines-of-code-c221bbf244?source=collection_archive---------28-----------------------

基于 TensorFlow 简化生成模型训练的框架

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

来源:https://pix abay . com/photos/fall-autumn-red-season-Woods-1072821/

介绍

近年来,深度学习背景下的生成模型领域一直在快速增长,特别是自从敌对网络出现以来。然而,训练这些模型并不总是容易的,即使你是一个只是试图在自定义数据集上复制结果的专家。解决方案: SimpleGAN 。SimpleGAN 是一个使用 TensorFlow 2.0 编写的框架,旨在通过提供高级 API 来促进生成模型的训练,同时提供强大的可定制性来调整模型和运行实验。

装置

安装 SimpleGAN 是一个非常简单的过程。有两种方法可以执行安装。

  • 使用 pip 软件包管理器。
$ pip install simplegan
  • 从源构建
$ git clone https://github.com/grohith327/simplegan.git
$ cd simplegan
$ python setup.py install

例子

现在您已经安装了软件包(如果没有,您应该😁),让我们来看两个例子,帮助你入门。

让我们看看如何使用 SimpleGAN 框架训练卷积自动编码器

Pix2Pix

现在让我们看一个例子,其中我们将利用对抗性训练来将图像从一个域翻译到另一个域,例如将分割图转换成具有细节的图像。看看这个链接

来源:https://tenor . com/view/Cheetos-零食-饿了么-yum-gif-16187308

注意:

对于那些可能想知道*“这不是 3 行代码”*的人,上面的例子只是为了展示框架的可用功能,从技术上讲,你仍然只需要下面显示的 3 行代码来训练你的模型。

>>> gan = Pix2Pix()
>>> train_ds, test_ds = gan.load_data(use_maps = True)
>>> gan.fit(train_ds, test_ds, epochs = 100)

所以,是的,这不是一个诱饵。

重要链接

  • 文档 —查看文档,更好地理解框架提供的方法
  • 示例笔记本—colab 笔记本列表可以帮助您入门并进一步理解框架
  • 问题 —如果您发现框架有任何错误,请在 Github 页面提出问题

结论

开发该框架是为了简化具有高级抽象的生成模型的训练,同时提供一些定制模型的选项。我相信“边做边学”是理解新概念的最好方法,这个框架可以帮助人们开始学习。

来源:https://tenor . com/view/simple-easy-easy-game-easy-life-deal-it-gif-9276124

[## grohith327/simplegan

简化生成模型训练的框架 SimpleGAN 是一个基于 TensorFlow 的框架,用于对生成模型进行训练

github.com](https://github.com/grohith327/simplegan) [## SimpleGAN - SimpleGAN v0.2.8 文档

是一个使用 TensorFlow 构建的 python 库,旨在通过高级 API 简化生成模型的训练…

simplegan.readthedocs.io](https://simplegan.readthedocs.io/en/latest/index.html) [## 简单根

简化生成模型训练的框架 SimpleGAN 是一个基于 TensorFlow 的框架,用于对生成模型进行训练

pypi.org](https://pypi.org/project/simplegan/)

正则表达式简单指南

原文:https://towardsdatascience.com/simplest-guide-for-regular-expressions-nlp-made-easy-bbb33cd694be?source=collection_archive---------41-----------------------

NLP 变得简单

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

弗兰基·查马基Unsplash 上拍摄的照片

如果你不知道正则表达式,它会被认为是很难和高级的东西,但是如果你知道,恭喜你,你知道很难和高级的东西。在这篇文章中,我们将揭示正则表达式的基础,在文章的最后,我附上了一个指向我的笔记本的链接,在那里你可以看到除了我们将在这里讨论的功能之外的三倍多的功能。

所以让我们从定义正则表达式开始:

正则表达式是定义搜索模式的字符序列。

它们被用在哪里?

正则表达式有广泛的用途:

  • 文本预处理
  • 根据某种模式提取文本,查找并替换某些符合模式匹配的单词,例如,查找所有以“a”开头的单词,并用单词 cat 替换它们
  • 密码模式匹配
  • 数据有效性

正则表达式在您的日常编码任务中起着至关重要的作用,此外,当涉及到数据清理、数据挖掘和其他过于庞大而无法硬编码的操作时,它还是一个超级强大的工具。我们创建一个正则表达式模式,在整个文本中滑动,匹配部分的位置或值返回给我们。

正则表达式模式匹配有两个部分:

1.正确的模式:它是关于找出我们真正想要匹配的东西

2.右 re 功能:与职位有关。不管我们是想匹配一开始的模式还是任何地方的模式。万一我们想要分裂和替换,我们也必须改变我们的 re 函数。

问题:给你两个文本,你必须找出它们是否以单词 corona 开头。

所以现在我们必须弄清楚两件事:使用什么模式,使用什么函数。

  1. 我们必须匹配单词 corona,所以 corona 是我们的模式字符串。
  2. 对于函数,我们将选择re.match,因为我们需要找到字符串是否以图案电晕开始
  3. re.match接受 3 个输入- >模式匹配、需要搜索的文本和标志。我们稍后会谈到旗帜。

输出:

<re.Match object; span=(0, 6), match='corona'>
None

如果模式与字符串匹配,则返回一个匹配对象,否则不返回任何对象。

在匹配的情况下,如在result_text1中,返回具有三个属性的匹配对象:

  • .span():返回包含匹配开始和结束位置的元组。
  • .string:返回传递给函数的字符串
  • .group():返回匹配的字符串部分

输出:

Span of result_text1:  (0, 6)
String passed to result_text1:  corona epidemic has taken world by storm.
Groups in result_text1:  corona

re.match的问题:

  • 这是一个非常好的函数,只在开始的时候匹配字符串。
  • 如果我们想要匹配字符串中的任何地方,我们使用re.search。它的工作原理和re.match一样,但是允许我们匹配字符串中的任何位置。返回一个匹配对象,如果没有找到匹配,则返回

输出:

<re.Match object; span=(0, 6), match='corona'>
None
<re.Match object; span=(29, 35), match='corona'>

re.matchre.search的限制

re.match只能在开始时匹配,而re.search可以在任何地方匹配,但只返回第一个匹配。原因是re.search是为了查找字符串中是否存在模式而设计的。如果我们想要返回所有的匹配,我们使用re.findall。事实上,re.findall默认用于模式匹配,因为通过各种标识符和条件,它可以表现为re.match & re.search

<re.Match object; span=(0, 6), match='corona'>
['corona', 'corona']

如果我们想替换模式匹配我们选择的字符串的地方,该怎么办?

假设我们想用新冠肺炎病毒取代所有出现的冠状病毒。为此,我们使用re.sub re.sub(pattern,replacement,text,count):模式是我们试图匹配的内容,替换是用来替换模式的内容,文本是我们搜索模式的内容。设定计数以替代有限的发生次数。默认情况下,它会替换所有引用。

输出:

coronavirus is causing international shutdowns. Neil Ferguson's report stated that coronavirus matches SARS.
COVID-19 is causing international shutdowns. Neil Ferguson's report stated that COVID-19 matches SARS.ONLY ONE OCCURENCE IS SUBSTITUTED IF WE MENTION COUNT = 1coronavirus is causing international shutdowns. Neil Ferguson's report stated that coronavirus matches SARS.
COVID-19 is causing international shutdowns. Neil Ferguson's report stated that coronavirus matches SARS.

在模式匹配的地方拆分文本

re.split(pattern,string,maxsplit,flags) 模式和字符串是常用参数。maxsplit 表示我们最大希望进行多少次分割,默认情况下表示全部。我们稍后会谈到旗帜

输出:

['COVID-19 is ', 'virus, as of 24 March ', 'virus has causes more than 400,000 cases.']

字符串在匹配模式的地方被分割。由于上述字符串有两个电晕事件,它只是分裂它在两个地方,因此导致三个部分。将返回拆分列表。

正则表达式也是优秀的武器文本清理、文本挖掘和在一行程序中做复杂的事情。

其余功能请查看我的 Github 笔记本。正则表达式的其他高级特性将在此讨论:

[## iamchiragshama/正则表达式-NLP-Text

自然语言处理和机器学习的正则表达式。贡献给 iamchiragshama/正则表达式-NLP-Text…

github.com](https://github.com/iamchiragsharma/Regular-Expressions-NLP-Text)

在 twitter 上关注我,了解关于自然语言处理、深度学习和文本分析的更多更新:

[## 奇拉格·夏尔马

Chirag Sharma 的最新推文(@csblacknet)。联合创始人 BlackNet |我创造可持续和实用的人工智能。印度

twitter.com](https://twitter.com/csblacknet)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值