TowardsDataScience 博客中文翻译 2016~2018(一百四十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何走出缓慢的模式

原文:https://towardsdatascience.com/how-to-engineer-your-way-out-of-slow-models-e62568f02fde?source=collection_archive---------8-----------------------

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

你刚刚完成了你那个伟大的神经网络架构的设计。它有数量惊人的 300 个完全连接的层,与 200 个各有 20 个通道的卷积层交织在一起,其结果被作为一个光荣的双向 堆叠 LSTM 的种子,并受到少量关注。训练后,你获得了 99.99%的准确率,你就可以把它投入生产了。

但是随后您意识到生产约束不允许您使用这个工具进行推理。你需要在 200 毫秒内完成推断。

换句话说,你需要砍掉一半的层,放弃使用卷积,让我们不要开始昂贵的 LSTM…

要是你能让那个神奇的模型更快就好了!

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

有时候你可以

在塔布拉,我们做到了。嗯,不完全是…让我解释一下。

我们的一个模型必须预测一个项目的点击率,或者换句话说,用户喜欢一篇推荐文章并点击它的概率。

该模型有多个模态作为输入,每个模态都经历不同的转换。其中一些是:

  • 分类特征:这些特征嵌入到一个密集的表示中
  • 图像:像素通过卷积层和全连接层
  • 文本:在被标记后,文本通过 LSTM,接着是自我关注

然后,这些处理过的模态通过完全连接的层,以学习模态之间的交互,最后,它们通过 MDN 层。

可想而知,这种模式很慢。

我们决定坚持模型的预测能力,而不是修整组件,并提出了一个工程解决方案。

如果可以的话,请把我藏起来

让我们把重点放在图像组件上。该组件的输出是图像的学习表示。换句话说,给定一个图像,图像组件输出一个嵌入。

该模型是确定性的,因此给定相同的图像将导致相同的嵌入。这是很昂贵的,所以我们可以缓存它。我来详细说说我们是怎么实现的。

(缓存的,而不是模型的)架构

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

  • 我们使用一个 Cassandra 数据库作为缓存,将图像 URL 映射到它的嵌入。
  • 查询 Cassandra 的服务叫做 EmbArk(嵌入存档,当然拼错了)。这是一个 gRPC 服务器,它从客户端获取图像 URL,并从 Cassandra 检索嵌入内容。在缓存未命中时,EmbArk 发送一个异步请求来嵌入该映像。为什么是异步?因为我们需要尽可能快地对结果做出反应。鉴于它不能等待图像被嵌入,它返回一个特殊的 OOV(不在词汇表中)嵌入。
  • 我们选择使用的异步机制是Kafka——一个用作消息队列的流媒体平台。
  • 下一个链接是 KFC (Kafka 前端客户端)—我们实现的 Kafka 消费者,用于将消息同步传递到嵌入服务,并将结果嵌入保存在 Cassandra 中。
  • 嵌入服务被称为视网膜。它从肯德基获得一个图像 URL,下载它,预处理它,并评估卷积层以获得最终的嵌入。
  • 使用链接器完成所有组件的负载平衡。
  • EmbArk,KFC,Retina,Linkerd 在 Docker 内部运行,由 Nomad 编排。这使我们可以根据自己的需要轻松扩展每个组件。

这种架构最初用于图像。在证明了它的价值之后,我们决定将它用于其他组件,比如文本。

EmbArk 对迁移学习来说也是一个很好的解决方案。假设我们相信图像的内容具有预测 CTR 的良好信号。因此,一个被训练用来对图像中的物体进行分类的模型,比如《盗梦空间》,对于我们的需求来说是有价值的。我们可以将 Inception 加载到 Retina 中,告诉我们打算训练的模型,我们要使用 Inception 嵌入,就这样。

不仅提高了推理时间,还改进了训练过程。只有当我们不想进行端到端的训练时,这才是可能的,因为梯度不能通过 EmbArk 反向传播。

所以当你在生产中使用模型时,你应该使用 EmbArk,对吗?嗯,不总是…

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

警告

这里有三个非常严格的假设。

1.新输入的 OOV 嵌入不是一件大事

当我们第一次看到一幅图像时,我们不会有它的嵌入,这不会伤害我们。

在我们的生产系统中,这是可以的,因为在很短的时间内,同一项目的 CTR 会被评估多次。我们每隔几分钟就创建一个我们想要推荐的商品列表,所以即使一个商品因为非最佳点击率预测而没有进入列表,它也会在下一个周期出现。

2.新投入的比率很低

的确,在 Taboola,我们一直都有很多新商品。但是相对于我们需要对已知项目进行的推理数量来说,这并不算多。

3.嵌入不会经常改变

因为嵌入是缓存的,所以我们相信它们不会随时间而改变。如果是这样,我们将需要执行缓存失效,并使用 Retina 重新计算嵌入。如果这种情况经常发生,我们将失去架构的优势。对于像 inception 或语言建模这样的情况,这种假设成立,因为语义不会随着时间的推移而显著改变。

一些最后的想法

有时,使用最先进的模型会因其计算需求而产生问题。通过缓存中间结果(嵌入),我们能够克服这一挑战,并且仍然享受最先进的结果。

这种解决方案并不适合所有人,但是如果上述三个假设适用于您的应用程序,您可以考虑使用类似的架构。

通过使用微服务范式,该公司的其他团队能够使用 EmbArk 来满足 CTR 预测之外的需求。例如,一个团队使用 EmbArk 来获得图像和文本嵌入,以检测不同项目之间的重复。但是我会把这个故事留给另一篇文章…

【engineering.taboola.com】最初由我在 发表。

如何增强你的机器学习工具箱脱颖而出

原文:https://towardsdatascience.com/how-to-enhance-your-machine-learning-toolbox-to-stand-out-95fc917efdaf?source=collection_archive---------22-----------------------

即使每个机器学习工程师使用的工具略有不同,但在核心方面,他们仍然是相似的:一种脚本语言,一个 ML/DL 框架,也许还有一些数据准备工具。但是当谈到作为一名机器学习工程师工作时,尤其是远程工作时,你可能需要添加一些东西来突出自己。

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

这个故事最初出现在【RemoteML.com】上。

在生产中弄脏你的手

在一些公司,机器学习模型不仅仅是分析数据或玩玩的东西,它们还被积极部署在网络、手机或嵌入式设备上。

你可以获得的任何帮助你优化推理速度、最小化模型大小和增强可部署性的技能都可以极大地帮助一个团队。

在许多情况下——对于许多框架来说——这意味着你要么能够使用预构建的工具,要么能够编写一些 C++或类似的代码来使用低级 API。但是,知道可以采取什么步骤来缩小模型大小以及对性能有什么影响也很重要。

如何处理海量数据

当学习机器学习时,你通常会得到很好的清理和处理过的训练数据。在某些情况下,您甚至可以将它本地下载到您的机器上使用。

嗯,特别是在创业环境中工作时,情况可能不是这样。您可能需要处理大量(1TB 以上)嘈杂的、未清理的数据。那你是怎么做到的呢?

自学在分布式集群上处理数据,比如使用 Apache Spark,并学习一些关于如何处理远程数据的最佳实践。提示:如果您必须使用远程数据存储,那么一个一个地下拉图像是行不通的。

这是当今机器学习就业市场上问得最多的技能之一,也是年轻机器学习工程师的工具箱中最缺少的技能之一。

画面

很多人是视觉型的人。他们喜欢图像胜过数字,喜欢电影胜过书籍。与取得令人印象深刻的结果同样重要的是向全世界展示它们——或者至少向你的经理展示。一个精心制作的逻辑图或图表是做这件事的正确方法。

大多数人都知道如何处理像matplotlib这样的图形框架,但是一旦你知道了一些高级功能和技巧,你的图形就会更清晰、更好,更容易让非技术人员理解。这将成为一项有价值的技能,特别是如果你在一家非 ML 公司做演示或从事机器学习。

有了这三个技巧,你的技能将变得更广泛,对一系列不同的公司更有价值。一个研究机构可能不需要生产就绪的代码,但是可以使用你的图形技能。对于机器学习初创公司来说,反之亦然。

如何扩展固定张量流估计量

原文:https://towardsdatascience.com/how-to-extend-a-canned-tensorflow-estimator-to-add-more-evaluation-metrics-and-to-pass-through-ddf66cd3047d?source=collection_archive---------6-----------------------

或者在使用固定评估器时,如何添加更多的评估指标并传递实例键

像 DNNRegressor 和 DNNLinearCombinedRegressor 这样的预构建的(“封装的”)估算器使编写 TensorFlow 程序变得简单。例如,下面是一个完整的 TensorFlow 程序,用于从内存中的 Pandas 数据帧开始训练 TensorFlow 模型:

import tensorflow as tffeatcols = [
  tf.feature_column.numeric_column("sq_footage")
]
model = tf.estimator.LinearRegressor(featcols, './model_trained')def train_input_fn(df, num_epochs):  # a Pandas dataframe
  return tf.estimator.inputs.pandas_input_fn(
    x = df,
    y = df['price'],
    num_epochs=num_epochs)model.train(train_input_fn(df,100), steps=1000)

如果你想像 scikit-learn 一样使用 TensorFlow,代码行数也差不多。

稳健估计量

然而,实际上,你想要比这更健壮。你想要读取不完全适合内存的分片文件,批处理它们,等等。这涉及到在您的输入函数中使用 TensorFlow 中的数据集 API 的更多代码。当你训练的时候,你需要时不时的检查和评估。所以,你不要只叫 train,你要叫 train_and_evaluate

预构建的评估者非常简单,但也非常固执——他们选择一种特定的做事方式,并给你一堆现成的东西。如果你想要更大的灵活性?好吧,写一个自定义估算器(见例)!

但两者之间存在灰色地带。您可以使用固定的估计器,并且仍然可以获得一定的灵活性。怎么会?使用 extenders.py 中的功能。在这篇博文中,我将向您展示两种这样的能力(顺便提一下,这是两个非常常见的问题)。

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

You can extend a canned estimator too!

如何添加额外的评估指标

当您使用 DNNRegressor 时,作为评估循环一部分的度量只有 average_loss,在本例中恰好是 RMSE。但是如果您想要更多的度量标准呢?简单地用 add_metrics 包装估算器,如下所示:

def my_rmse(labels, predictions):
    pred_values = predictions['predictions']
    return {'rmse': tf.metrics.root_mean_squared_error(labels, pred_values)}def train_and_evaluate(output_dir):

    estimator = tf.estimator.DNNLinearCombinedRegressor(
        ...)

    estimator = tf.contrib.estimator.add_metrics(estimator, my_rmse)  
    ... tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

让我们稍微解释一下:

  1. 编写一个函数,根据标签和预测值计算感兴趣的指标,并返回一个字典。
  2. 将该函数与您的原始估算器一起传递给 add_metrics
  3. 从该点开始使用返回的估计量

注意,上面的 my_rmse 方法接收标签和整个预测张量。这样,如果您正在进行分类,并且您的一些指标需要预测的类,而其他指标需要预测的概率,您可以计算您想要的。

在这里看到一个完整的例子

如何将键和输入特征转发到输出

由固定估计器返回的预测 dict 中只有预测(咄!).但是,在很多情况下,您希望预测也包含一些输入。例如,您可能有一个与每一行相关联的唯一键,并且您希望该键成为预测的一部分,以便您知道预测对应于哪一行。或者,您可能希望根据特定的输入值来计算评估(例如,根据婴儿是早产还是足月来计算婴儿体重的 RMSE)。

为此,用 forward_features 包装估计器,如下所示:

estimator = tf.contrib.estimator.forward_features(estimator, KEY_COLUMN)

你可以传入一个单独的字符串(就像我上面做的那样)或者一个字符串列表。理想情况下,这就是你所需要的。然而,有两个警告。

第一个警告是,上面的键列被添加到预测的输出中,但没有添加到导出签名中,因此当模型在内存中时它可以工作,但如果在训练后恢复,它就不能工作(这没有意义:我已经向 TensorFlow repo 提交了一个 pull 请求来解决这个问题)。在那之前,你需要这个解决方案:

def forward_key_to_export(estimator):
    estimator = tf.contrib.estimator.forward_features(estimator, KEY_COLUMN)
    # return estimator## This shouldn't be necessary (I've filed CL/187793590 to update extenders.py with this code)
    config = estimator.config
    def model_fn2(features, labels, mode):
      estimatorSpec = estimator._call_model_fn(features, labels, mode, config=config)
      if estimatorSpec.export_outputs:
        for ekey in ['predict', 'serving_default']:
          estimatorSpec.export_outputs[ekey] = \
            tf.estimator.export.PredictOutput(estimatorSpec.predictions)
      return estimatorSpec
    return tf.estimator.Estimator(model_fn=model_fn2, config=config)
    ##

第二个警告是,你不能既传递一个特征把它作为模型的输入。要么消费输入,要么传递输入。这里的解决方法是使用 tf.identity 在输入函数中复制这样的列:

features['gw'] = tf.identity(features['gestation_weeks'])

希望这有所帮助!

如何使用 Python 从 MS Word 文档中提取数据

原文:https://towardsdatascience.com/how-to-extract-data-from-ms-word-documents-using-python-ed3fbb48c122?source=collection_archive---------0-----------------------

这篇博客将详细介绍如何从本地 Word 文档中提取信息。由于许多公司和角色都与 Microsoft Office 套件密不可分,对于任何面临通过传输数据的人来说,这都是一个有用的博客。多克还是。docx 格式。

作为先决条件,您需要在计算机上安装 Python。对于那些在工作中这样做的人,你可能没有管理员权限。这篇博客解释了如何在没有管理员权限的情况下在 Windows 机器上安装 Anaconda。

你可以在这里找到支持这个博客的笔记本。

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

Image created with Microsoft Word and google searches “Microsoft Word Logo” and “Python Logo”

我们将利用每个 word 文档的 XML 构成。从那里,我们将使用 regex 库来查找文档文本中的每个 URL,然后将这些 URL 添加到一个列表中,这对于执行 for 循环来说将是完美的。

#specific to extracting information from word documents
**import** **os**
**import** **zipfile**#other tools useful in extracting the information from our document
**import** **re**#to pretty print our xml:
**import xml.dom.minidom**
  • os 将允许您在操作系统上导航和查找相关文件
  • zipfile 将允许你从文件中提取 xml
  • xml.dom.minidom 解析 xml 代码

首先,我们需要指导我们的代码在文件存储的位置打开文件。要从我们的笔记本上看到这一点(而不是打开文件浏览器),我们可以使用os。虽然知道了感兴趣的单个文件的路径就不需要在这个简单的例子中使用os,但是这个库以后可以用来创建存储在目标文件夹中的文档列表。如果您想编写一个 for 循环来从文件夹中存储的所有 word 文档中提取信息,那么在文件夹中存储一个文档列表会很有帮助。

要查看当前目录中的文件列表,请在os文件路径中使用一个句点:

os.listdir('.')

要查看当前位置上方目录中的文件列表,请使用双句点:

os.listdir('..')

一旦找到 word 文档的存储位置,就可以将找到的文件路径转换为 zip 文件。ZipFile 文件类型,对于我们来说,它是可读的。

ZIP 文件格式是一种常见的归档和压缩标准

https://docs.python.org/3/library/zipfile.html

document = zipfile.ZipFile('../docs/TESU CBE 29 Employee Job Description Evaluation - Final Approved.docx')#document will be the filetype zipfile.ZipFile

现在,zipfile 类的.read()对象需要一个名称参数,它不同于文件名或文件路径。

ZipFile.read(name, pwd=None)

要查看可用名称的示例,我们可以使用.name()对象

document.namelist()

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

在这个博客的 Jupyter 笔记本中,我探究了其中几个名字来展示它们是什么。包含 Word 文档正文文本的名称为“word/document.xml”

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

我在 StackOverflow 用户 Nate Bolton 对问题的回答中发现了漂亮的打印技术:用 Python 漂亮地打印 XML

我们将只使用漂亮的字体来帮助我们识别 XML 中的模式以提取我们的数据。我个人不太了解 XML,所以我将依靠语法模式来查找 word 文档文本中的每个 URL。如果您已经知道提取数据的语法模式,您可能根本不需要打印出来。

在我们的例子中,我们发现字符>http<包围了文档文本中包含的每个超链接。

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

我需要完成我们的目标,收集上述字符之间的所有文本。为了帮助使用 regex 实现这一点,我使用了下面的 StackOverflow 问题,它包含了我在最初的 ask 中要寻找的内容:正则表达式查找两个字符之间包含的字符串,同时排除分隔符。

虽然我确实想保留http,但我不想保留<>。我将使用字符串切片和列表理解对列表项进行这些修改。

link_list = re.findall('http.*?\<',xml_str)[1:]
link_list = [x[:-1] for x in link_list]

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

要查看这个博客后面的完整 Jupyter 笔记本,点击这里

如果您对使用 python 创建和编写 MS Word 文档感兴趣,请查看库 python-docx

还有其他从 word 文档中提取文本和信息的方法,比如在下面的 Python 论坛帖子的回答中提到的 docx2txt 和 docx 库。

这是我关于托马斯·爱迪生州立大学(苏特)开源材料可访问性倡议的博客的姊妹博客。中邮 / Github 资源库

我为这个项目撰写的第一篇博客很具体,有点笨拙,所以这篇博客是我将撰写的系列文章中的第一篇,深入探讨苏特项目的各个方面,并使材料更容易理解。

如何使用 Python 从 pdf 中提取关键词并按权重排序

原文:https://towardsdatascience.com/how-to-extract-keywords-from-pdfs-and-arrange-in-order-of-their-weights-using-python-841556083341?source=collection_archive---------1-----------------------

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

Batman masked Word cloud : Find code at the bottom

关键词提取只不过是识别最能描述文档主题的术语的任务。

关键术语“、*关键片段“*或仅仅是“*关键词”*是不同的术语,通常用于定义表示包含在文档中的最相关信息的术语。虽然它们听起来不同,但它们都服务于相同的目的:描述文档中讨论的主题。

为什么要提取关键词?

在文本挖掘、信息检索和自然语言处理领域,提取关键词是处理文本数据时最重要的任务之一。

使用案例:

读者从关键词中受益,因为他们可以更快地判断给定的文本是否值得阅读。

网站制作者从关键词中受益,因为他们可以根据主题对相似的内容进行分组。

算法程序员受益于关键字,因为它们将文本的维度减少到最重要的特征。

这些只是许多例子中的几个。

让我们开始讨论这个话题的实质。接下来是一个教程,教你如何解析一个 PDF 文件,并把它转换成一个关键字列表。我们将通过动手解决问题来学习和巩固我们的理解,所以一起编码吧!

问题陈述-

给定一个特定的 PDF/文本文档,如何使用 Python 提取关键词并按权重排序?

依赖关系:

(本教程我用的是 Python 2.7.15 版本。)

你需要在你的机器上安装下面提到的库来完成这个任务。如果您没有,我在下面的代码块中插入了每个依赖项的代码,您可以在 windows 的命令提示符下或 mac 操作系统的终端上键入。

  • PyPDF2 (将简单的基于文本的 PDF 文件转换成 Python 可读的文本)
pip install PyPDF2
  • textract (将重要的扫描 PDF 文件转换成 Python 可读的文本)
pip install textract
  • 回复(查找关键字)
pip install regex

:我尝试了三种方法来完成这项任务。对于方法 1,上述库就足够了。然而,我刚刚提到了我在网上找到的另外两种方法。把他们当做替代品。下面是 jupyter 笔记本,上面有这三种方法。看一看!

Jupyter 笔记本:

所有必要的备注都用“#”表示。

  • 方法 1 未装箱

第一步:导入所有库。

第二步:将 PDF 文件转换为 txt 格式,读取数据。

第三步:使用*。findall()"* 正则表达式提取关键字的功能。

步骤 4 :将提取的关键字列表保存在数据帧中。

第五步:应用 TF-IDF 的概念计算每个关键词的权重。

第六步:将结果保存在数据帧中,使用*。sort_values()"来按顺序排列关键字。*

更多详情请点击这里 !

参考文献:

  1. www.wikipedia.org

2.PDF 到文本转换的中等帖子

3.关键词提取教程

4.正则表达式

我希望你觉得这篇教程很有收获,值得一读。此外,我相信一定有很多其他方法可以让你完成上述任务。如果你遇到了,请在评论区分享它们。

屏蔽字云的代码:

在这里找到 GitHub 回购

***# modules for generating the word cloud* 
from os import path, getcwd 
from PIL import Image 
import numpy as np 
import matplotlib.pyplot as plt 
from wordcloud import WordCloud%matplotlib inline 
d = getcwd()  
text = open('nlp.txt','r').read()#Image link = '[https://produto.mercadolivre.com.br/MLB-693994282-adesivo-decorativo-de-parede-batman-rosto-e-simbolo-grande-_JM](https://produto.mercadolivre.com.br/MLB-693994282-adesivo-decorativo-de-parede-batman-rosto-e-simbolo-grande-_JM)' mask = np.array(Image.open(path.join(d, "batman.jpg")))

wc = WordCloud(background_color="black",max_words=3000,mask=mask,\
               max_font_size=30,min_font_size=0.00000001,\
               random_state=42,)    
wc.generate(text) 
plt.figure(figsize=[100,80]) 
plt.imshow(wc, interpolation="bilinear") 
plt.axis("off") 
plt.savefig('bat_wordcloud.jpg',bbox_inches='tight',pad_inches=0.3);**

阅读我发表的其他文章

  1. 如何使用 Python 从 Excel 创建 PDF 报告
  2. 最后一分钟修订:第一部分—机器学习&统计
  3. 什么是探索性数据分析?

机器学习失败的 5 种方式

原文:https://towardsdatascience.com/how-to-fail-at-machine-learning-36cf26474398?source=collection_archive---------2-----------------------

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

https://lawschooli.com/wp-content/uploads/2014/03/shutterstock_123177382.jpg

机器学习是艰难的。当我第一次知道它的时候,我真的认为它可以做任何事情。你只要朝它扔点东西,它就会发出“滴滴答答”“哔哔”的声音,然后出来……什么东西?我甚至不确定机器学习的最终结果是什么。

从那以后,我学会了在我的产品中实现机器学习时正确地设定我的期望,以便它为我的客户提供价值。这是我学到的一些事情的一个过于简单化的例子:

  1. 机器学习是为了预测。这就是它的作用。它可以预测你正在展示的图片是一只猫还是一座火山,或者根据你的教育程度和年龄预测你目前赚了多少钱。你基本上是用一种模式来武装它,然后当你向它展示新的信息时,它试图根据与模式的匹配程度来对信息进行分类。
  2. 不能含糊。至少,现在还没有。你需要解决一个具体的问题。你需要认真思考你要解决的问题,从小事做起。你不能把你所有的数据都扔进去,然后期望得到有用的回报。最幸运的是,我开始训练一个模型来预测两件事情中的一件。这个客户评价是好是坏?这幅画是一只猫还是一只狗?你可以在此基础上成长,但要确保你真的在思考你试图解决的问题。
  3. 你需要大量的训练数据。在面部识别方面已经有了一些令人着迷的进步,例如,你需要用来训练的面部数量非常少。但对于大多数其他类型的机器学习模型,你需要高质量的训练数据,而且是大量的数据。不要指望只用 100 个例子就能训练出一个预测房价或交通模式的模型。你的训练数据也需要高质量。也就是说,让它尽可能与你期望的真实输入相匹配。不要用加州的房价来训练你的模型,然后期望它能很好地适应纽约的房价。
  4. 不要指望准确率超过 80% 。当然,尽可能接近 100%的准确性是很好的,但事实证明,80%是非常好的。事实是,大多数人的平均准确率约为 80%。如果你将顾客评论外包给 1000 个人,并要求他们将评论分为正面或负面,经过全面分析后,你会发现所有回答的准确率约为 80%。但是你猜怎么着?你的机器学习驱动的产品为他们做到了这一点,所以你刚刚为你的客户节省了一大笔钱,获得了与雇佣 1000 个人相同的结果。这就是价值。
  5. **机器学习不能解决一切。**你可能认为房价或股市有规律可循,但实际上可能没有。即使你用纽约证券交易所的每笔交易训练了一个机器学习模型,然后试图用它来预测市场,你也会失败。有些事情是无法预测的。你必须记住,没有机器学习模型是在真空中运行的。它只和你提供给它的数据一样好,如果数据没有足够的信息或者太不一致,模型就不能解决你的问题。

用数据科学加速旧金山的住房搜索

原文:https://towardsdatascience.com/how-to-find-housing-in-san-francisco-with-data-science-2991ff503602?source=collection_archive---------4-----------------------

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

不久前有人问我如何在旧金山找到住房。一年前,在我找到我现在的客厅沙发之前,我开始寻找住房,并且很快成为一种压倒性的经历,试图找到任何低于一只胳膊和一条腿的租金。我花越来越多的时间在网上搜索,并把搜索范围从金融区扩大到旧金山的几个地区,包括臭名昭著的嫩腰区。这种搜索慢慢消耗了我的精力,以至于我每天醒来至少花一个小时点击 Craigslist,看到熟悉的地方,一张疲惫的脸。

我心想:“一定有什么办法可以加快找房子的速度!”作为一名有抱负的数据科学家,我的解决方案是创建一个 web scraper,它可以收集旧金山几个地区的信息,并以简洁的方式呈现它们,而不是所有的绒毛。虽然不能保证找到房子,但至少我可以把 1 个多小时的搜索时间减少到 10 分钟。

TLDR:我写了一个脚本,以地点和价格为参数来抓取 Craigslist。代码位于底部,但除此之外继续阅读,看看整个网页抓取过程!

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

One of the most helpful pictures I had in finding housing

第 0 步:了解你的敌人

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

What the Craigslist interface looks like

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

What I wanted the results to look like

很多时候,我们很容易超越自己,一头扎进问题中。对我的编码技能有很大帮助的一件事是从较小的目标开始,然后把它变成一个大的、宏伟的目标。我的大目标是得到每篇文章的标题以及它到个人页面的链接。然后我想从旧金山的一个地区(比如格伦公园)搬到另一个地区(比如巴尔博亚公园)。查看 Craigslist 界面,似乎每篇文章都有一个标题和一个蓝色超链接,显示在描述旁边会很有用。

因此,分解大目标,我的攻击计划是:

  1. 使用 Selenium 打开一个远程控制页面
  2. 刮一页 Craigslist 住房获得标题
  3. 进一步抓取以获得卖家帖子的链接
  4. 移动到另一个位置而不重写任何内容
  5. 重复此过程,直到所有位置都被刮除
  6. 把所有的都集中到一个好的功能上

第一步:引入网络抓取工具

from selenium import webdriver
from bs4 import BeautifulSoup
import urllib2
import re
import pandas as pd
import numpy as np
pd.set_option('max_colwidth', 5000)
pd.options.display.max_rows = 999

第二步:用硒打开一个网页

Selenium 是一个工具,它让我们在浏览器中自动操作,就像我们像人一样点击或打字一样。这让我们可以登录并做任何人类在使用浏览器时可以做的事情。也许最重要的是,它允许我们从网页中抓取数据,这些网页使用在浏览器中执行的 JavaScript 生成 HTML 旧金山大学的 Terence Parr 教授说

为了初始化 Selenium 工具,我们需要从 Chromedriver(或 geckodriver)所在的路径调用它。(链接下载 Selenium)

driver = webdriver.Chrome(executable_path="/Users/shsu/Downloads/chromedriver")

在那里,我们可以使用驱动程序打开某些网页,例如:

driver.get('http://google.com')

这应该会在你的 Chrome 上打开一个新的浏览器,然后可以用代码自动完成。用你选择的任何网站试试吧!

第三步:从页面上刮下帖子标题

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

A general query for my housing limitations

如前所述,我们宏伟计划的第一个目标是抓取 Craigslist 的一个页面。让我们打开一个页面,实际输入一些过滤器(参数),然后查看内容(左边的图片)。就我的预算而言,我正在寻找一个低于 900 美元的地方,并希望最近的帖子首先显示出来。当我查看由该查询创建的超链接时,我得到这样的结果:

"【https://sfbay.craigslist.org/search/roo?query=】T4格伦+公园sort =datemax _ price =900availability mode = 0

你知道什么?看起来 url 中的头包含了我输入的参数,也就是查询字符串。让我们从代码开始。

url = [https://sfbay.craigslist.org/search/roo?query=glen+park&sort=date&max_price=1000&availabilityMode=0](https://sfbay.craigslist.org/search/roo?query=glen+park&sort=date&max_price=1000&availabilityMode=0)driver.get(url)

此时,你可能会奇怪为什么我选择 Chromedriver 而不是其他 web 驱动。主要原因是因为开发者工具可以用这三个键打开:

选项+命令+ U

通过同时点击这三个键,您可以查看任何网页背后的 HTML 代码。

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

Inside the developer source with the tag information we need

通过搜索单个标题文章,我们可以提取该文章的标签和标题。在这种情况下,请注意上图顶部带有“result-info”类的“p”标签。在这个标签中包含了关键文本(特别是“Lafayette 的出租房间”、“1100 美元”和“(Lafayette/or inda/moraga)”,我们可以用. text 来抓取。

craig_title = []
all_posts = driver.find_elements_by_class_name("result-row")
for post in all_posts:
    craig_title.append(post.text)

现在我们已经从帖子的标题中获得了所有重要的信息!接下来我们要做的就是抓取这个页面,不仅要获取标题信息,还要获取标题所指向的网页。

第四步:抓取个人帖子的链接

棘手的部分来了:如果我不能在不重定向 Selenium 浏览器的情况下点击链接并获得它的超链接,我如何获得到个人卖家页面的链接?

解决方案:使用我们的网络抓取工具寻找一个标题,然后将其推广到页面上的所有帖子。

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

What we see on the website

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

What the code on the website looks like

通过搜索原始标题文章,我们可以看到“a”标签和“href”类等同于我们正在搜索的文章链接。我们将首先用 urllib2 打开 url(因为我们不想用 selenium 远程打开另一个页面),然后按照与步骤 2 类似的过程获得 post 超链接。

link_list = []
html_page = urllib2.urlopen(url)
soup = BeautifulSoup(html_page, "lxml")
for element in soup.findAll("a", {"class": "result-title hdrlnk"}):
    print element['href']

我们现在已经抓取了文章标题和它们各自的链接。

第 5 步和第 6 步:迭代整个过程并进行归纳

我们可以用变量代替所有参数来概括我们的刮削。

例如,转动这个:

craig_title = []
url = **"https://sfbay.craigslist.org/search/roo?query=glen+park&sort=date&max_price=1000&availabilityMode=0"**
driver.get(url)
allthing = driver.find_elements_by_class_name("result-row")
for post in allthing:
    craig_title.append(post.text)

变成这样:

**place = ['glen+park']
price = '900'**craig_title = []
url = **"**[**https://sfbay.craigslist.org/search/roo?query=**](https://sfbay.craigslist.org/search/roo?query=)**"+ \
                str(place)+ 
                "&sort=date&max_price="+
                str(price)+
                "&availabilityMode=0"**
driver.get(url)
all_posts = driver.find_elements_by_class_name("result-row")
for post in all_posts:
    craig_title.append(post.text)

我们可以对所有其他变量重复这个过程,比如当我们遍历页面并添加到列表中时。

第七步:把所有东西放在一起

我们有(1)抓取一个页面的标题和链接,(2)移动到另一个页面并重复步骤 1,以及(3)将所有信息附加到一个列表。所以现在,我们要做的就是创建一个漂亮的小函数,允许我们包含一些参数并返回一个数据帧。姑且称之为: craig_list()

from selenium import webdriver
from bs4 import BeautifulSoup
import urllib2
import re
import pandas as pd
import numpy as np
pd.set_option('max_colwidth', 5000)
pd.options.display.max_rows = 999
from IPython.display import display, HTMLdriver = webdriver.Chrome(executable_path="/Users/shsu/Downloads/chromedriver")def craig_list(price, location_list=list):
    """
    craig_list is a function that creates the condensed Craigslist post information
    Inputs:
        price_max: integer of the maximum price of houses one wants
        places: list of strings where the string represents the region of choice 
    Output:
        a dataframe with the description and the link of the post 
    """
    craig_title = []
    link_list = []
    for place in location_list:
        print("--------- MOVING TO PLACE: " + str(place) + " -----")
        link_list.append(" ")
        craig_title.append(str(place).upper())

        url = "[https://sfbay.craigslist.org/search/roo?query=](https://sfbay.craigslist.org/search/roo?query=)"+ \
                str(place)+ "&sort=date&max_price="+ str(price)+"&availabilityMode=0"
        driver.get(url)
        all_posts = driver.find_elements_by_class_name("result-row")
        for post in all_posts:
            craig_title.append(post.text)

        html_page = urllib2.urlopen(url)
        soup = BeautifulSoup(html_page, "lxml")
        for pid in soup.findAll("a", {"class": "result-title hdrlnk"}):
         link_list.append(pid['href'])
    craig_df = pd.DataFrame(np.column_stack([craig_title,link_list]), 
columns = ["Info", "Link"])
    return craig_dfplaces = ["glen+park", "balboa+park"]
price_max = 900
craig_df = craig_list(price_max, places)
display(craig_df)

就像这样,你现在也可以节省 40 分钟在 Craigslist 上搜索房屋的时间,最终在一个改造过的客厅里租到一张沙发!

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

Even San Francisco is not safe from satire

总之,我们了解到,虽然抓取看起来困难且耗时,但它可以被分解为更容易的部分,在实际的用户界面和背后的 HTML 源代码之间可视化,并最终概括为模拟整个人类行为。感谢你的阅读,祝你找房子好运!

附言:很多帖子都是垃圾邮件制造者,他们复制真实的帖子,并给出一个通用的消息“请把你的联系电话发给我,我会尽快与你联系。”

参考资料:

  1. 硒下载页面
  2. 特伦斯·帕尔教授的硒教程
  3. 美汤文档
  4. 查询字符串
  5. 【Beautifulsoup 网页抓取教程
  6. 旧金山 Craigslist

如何用 TURI (Twitter 低估指数)在 Twitter 上找到被低估的人

原文:https://towardsdatascience.com/how-to-find-underrated-people-on-twitter-with-turi-twitter-underrated-index-c3ab8867bea9?source=collection_archive---------6-----------------------

你可以培养的最好技能之一是在别人之前找到有才华的人的能力。

泰勒·考恩(边际革命的经济学家和博客作者)的这个好建议让我思考:有什么策略可以找到有才华但被低估的人?

一个可能的来源是 Twitter。很长一段时间,我没有“得到”Twitter,但在遵循了迈克尔尼尔森的建议后,我正式成为了一名皈依者。关键是仔细选择你关注的人的名单。如果你做得好,你的 Twitter feed 就会变成源源不断的有价值的信息和有趣的人。

如果你仔细观察,你会发现 Twitter 上有很多被严重低估的人,即非常聪明的人,他们提供有价值和有趣的内容,但他们的追随者比你想象的要少

这些人是最值得关注的:你可以获得很多其他人得不到的见解(因为没有多少人关注他们),他们更有可能回应询问或参与讨论(因为他们需要管理的关注者较少)。

寻找这些人的一个选择是试错法,但我想看看是否有可能量化人们在 Twitter 上被低估的程度,并自动化寻找优秀人物的过程。

我称之为 TURI (Twitter 低估指数),因为嘿,它需要一个名字,缩写词让事情听起来如此官方。

TURI 的组件

该指数有三个主要组成部分:增长、追随者的影响力和追随者的数量。

增长(G):用户发布的每单位内容(即每条推文)的关注者数量。

一个推特粉丝迅速增长的用户暗示他们被低估了。这意味着他们正在推出高质量的内容,人们开始迅速注意到这一点。我衡量的方法是一个人在每条推特上获得的关注者数量。

另一个可能的增长衡量标准是用户在单位时间内获得的关注者数量(即关注者数量除以 Twitter 账户存在的时间长度)。然而,这个选项有几个问题:

  • Twitter 账户可能会休眠数年。举例来说,有人可能开了一个账户,但 5 年没有发微博,然后发布了很棒的内容。用时间来衡量增长会不公平地惩罚这些人。
  • 一个人可能有不断发微博的策略。部分内容产生了追随者,但整体质量仍然较低。我们在寻找发布伟大内容的人,不一定是发布大量内容的人。

关注者影响力(IF):用户的关注者的平均关注人数。

在我看来,一个人的粉丝影响力是决定他们在 Twitter 上是否被低估的最重要因素。以下是几个原因:

  • 一般来说,有影响力的人能更好地判断好内容。
  • 有影响力的人在决定追随谁时更有选择性,尤其是如果 Twitter 是他们在线“品牌”的重要组成部分。
  • 有影响力的人往往在他们的线下个人生活中与其他高质量的人接触或有某种联系,这些人更有可能出现在他们的 Twitter feed 中,即使他们还没有被广泛了解或欣赏。

我有点偏向于这种方法,因为从我个人的经验来看,当我浏览那些在我的 feed 上被有影响力的人关注的人时,这种方法非常有效。如果我看到有人被泰勒·考恩亚历克斯·塔巴罗克鲁斯·罗伯兹帕特里克·科利森马克·安德森追随,但他们只有 5000 名粉丝,那么我很有信心这个人目前被低估了。

经过一番考虑,我认为利用 Twitter API 中的可用数据来衡量用户追随者影响力的最佳方式是获取用户追随者的追随者的平均数量。

我仔细考虑了使用中间值而不是平均值的可能性,但决定不这么做:如果一个有 100 万粉丝的人关注一个有 50 个粉丝的人,我想更多地了解那个人,即使他们的 TURI 很高只是因为那个有很大影响力的粉丝。离群值是好的——我们在寻找未经雕琢的钻石。

关注者总数(NF):用户当前拥有的关注者总数。

在这种情况下,我们对“被低估”的定义是,当一个用户没有你预期的那么多追随者时,那么追随者的总数显然将在 TURI 中发挥重要作用。

因此,总结 TURI 背后的主要思想:如果一个人拥有大量“有影响力的”追随者,相对于他们发布的内容量,他们的追随者数量增长很快,但他们仍然拥有少量的追随者,那么他们很可能被低估。

定义索引

对于任何用户 I,我们可以计算他们的 Twitter 低估指数(TURI)为:

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

其中 G 是增长,IF 是追随者的影响力,NF 是追随者的数量。

这个公式具有我们正在寻找的一般关系:每单位内容用户的高增长,高影响力的追随者,以及低数量的总追随者都推动 TURI 向上。

我们可以通过重写 G = NF / T 来简化等式,其中 T 是用户的推文总数。取消一些条款,这给了我们最终版本的指数:

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

换句话说,我们关于一个人在 twitter 上被低估程度的指数是由用户 I 的每条 tweet 的平均粉丝数给出的。

在为一组用户计算 TURI 之前,您可能需要采取一些预处理步骤来改善结果:

  1. 过滤掉已核实的账户 。TURI 的缺点之一是,如果一个用户已经是名人,他的成长/轨迹会非常高。这些人通常在每条推特上有大量的追随者,不是因为他们发布的内容,而是因为他们已经在其他地方获得了名气。幸运的是,Twitter 有一个名为“验证账户”的功能,如果被确定为公共利益的账户,则应用“”。通常,这包括用户在音乐、表演、时尚、政府、政治、宗教、新闻、媒体、体育、商业和其他关键兴趣领域维护的账户。这是一个要过滤掉的素数群,因为我们找的不是知名人士。
  • 虽然可能会有这样的情况,一个拥有 50 万追随者的人被低估了,但这似乎不太可能是你要找的那种人,所以不值得 API 资源。
  • 通过一些较高的追随者阈值进行过滤降低了包括没有经过验证的账户的名人的风险。
  • 您可以限制调用 API 的次数。就 API 调用而言,成本最高的操作是计算出关注者的影响力。一个人的追随者越多,计算 TURI 所需的 API 调用就越多。

试用 TURI

为了测试这个指数,我计算了 49 个人的一个子集的价值,这些人是泰勒·考恩(Tyler Cowen)关注的,他们有 1000 个或更少的关注者(泰勒在我最喜欢的博客的上写博客,激发了这个项目,并对关注的人有很好的品味)。

下图显示了这些用户的 TURI(不包括由于隐私设置而无法访问的 4 个帐户)。

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

正如你所看到的,有一个用户( @xgabaix )是一个显著的异常值。仔细看看这个简介,这是哈佛大学的著名经济学家 Xavier Gabaix。他的 TURI 很高,因为他有几个非常有影响力的追随者,而且他还没有发微博。

那么 TURI 在这里失败了吗?我不这么认为,因为如果他真的在发微博,这很可能是一个值得关注的人。然而,将一个实际上没有任何 Twitter 内容的人放在列表的顶部似乎有点奇怪。

所以,我再次筛选了发布了至少 20 条推文的用户:

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

下面的图表只关注不同用户的 IF(他们的追随者的影响力)。有趣的是,另一个用户 @shanagement 拥有迄今为止最有影响力的关注者。然而,他们在总体旅游指数中排名第三,因为他们发推特的次数明显多于@davidbrooks13 或@davidhgillen。

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

限制

当然,TURI 也有一些缺点:

  • 很难判断 TURI 的表现有多好 :这些指标是基于直觉,显然没有关于 twitter 用户实际上被低估程度的“基本事实”数据。所以,我们并没有一个真正的基于数据的方法来观察指数的效果,并系统地改进它。例如,你可能会问增长 G 是否应该包含在指数中。我认为这有一个很好的论据:如果人们在每单位内容上很快获得追随者,那么该内容一定有吸引其他人的地方。但是,另一方面,也许他们并没有被真正低估。也许真正被低估的人有很好的内容,但是你的普通 Twitter 用户即使读了一些帖子也低估了他们。当人们看到高质量时,并不总是知道它。
  • 计算 TURI 需要相当长的时间:这是由于 API 请求的 Twitter 速率限制。例如,计算上面 49 个 Twitter 用户的 TURI 大约需要一个小时。对于拥有大量追随者的人来说,这需要更长的时间(记住,我只关注拥有 1000 或更少追随者的人)。所以,如果你想做一个大批量的人,这可能是一个好主意,在一个服务器上运行这个持续的基础上,并存储用户和 TURI 信息到一个数据库中。

其他想法?

有很多不同的方法可以指定这样的索引。如果你有任何建议,请在推特电子邮件上留言或联系我。

另一个可能的调整是计算用户关注的人数。我注意到一些 Twitter 用户似乎有一个策略,那就是关注大量的人,希望被跟踪回来。在这些情况下,他们的跟随战略可能是他们高增长的原因,而不是他们内容的质量。一种解决方案是通过乘以(用户关注者的数量)/(用户关注的人数)来调整 TURI。举例来说,这将惩罚那些拥有 15,000 名追随者但自己却追随 15,000 人的人。

技术细节

你可以在这里找到我用来与 API 交互并计算 TURI 的代码。代码使用了 python-twitter 包,它提供了一种与 Twitter API 交互的好方法,抽象出令人讨厌的细节,因此您不必处理它们(例如,使用 OAuth 进行认证,处理速率限制)。

原载于 2018 年 7 月 8 日 www.marknagelberg.com。要访问我共享的 Anki deck 和 Roam Research notes 知识库,以及关于间隔重复和提高学习效率的技巧和想法的定期更新,* 加入“下载马克的大脑”。***

如何用神经网络找到沃利

原文:https://towardsdatascience.com/how-to-find-wally-neural-network-eddbb20b0b90?source=collection_archive---------1-----------------------

如何训练一个模型来解决沃利难题的指南

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

Process of a Neural Network learning to find Wally from start to finish

深度学习提供了另一种方法来解决 Wally 在哪里的难题。但与传统的图像处理计算机视觉方法不同,它只使用少数几个带标签的例子,包括沃利在图像中的位置。

如果神经网络可以为你做这件事,为什么还要去找沃利呢?

带有评估图像和检测脚本的最终训练模型发布在 my Github repo 上。

这篇文章描述了使用 Tensorflow 对象检测 API 训练神经网络的过程,并使用围绕它构建的 Python 脚本来找到 Wally。它由以下步骤组成:

  • 通过创建一组带标签的训练图像准备数据集,其中标签代表 Wally 在图像中的 x-y 位置
  • 获取并配置模型以与 Tensorflow 对象检测 API 一起使用
  • 在我们的数据集上训练模型
  • 使用导出的图表在评估图像上测试模型

启动前,请确保按照说明安装 Tensorflow 对象检测 API。

准备数据集

虽然处理神经网络是深度学习中最值得注意的过程,但令人遗憾的是,数据科学家花费最多时间的步骤是准备和格式化训练数据。

最简单的机器学习问题的目标值通常是标量(如数字检测器)或分类字符串。Tensorflow 对象检测 API 训练数据使用两者的组合。它由一组图像组成,并附有所需对象的标签以及它们在图像中出现的位置。位置由两个点定义,因为(在 2d 空间中)两个点足以在对象周围绘制边界框。

因此,为了创建训练集,我们需要提供一组 Wally 在哪里的拼图图片,以及 Wally 出现的位置。

虽然我可以花几个星期的时间用注释工具如 LabelImg 手工标记图像来解决 Wally 谜题,但我发现了一个已经解决的训练集Wally 谜题在哪里。

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

Where’s Wally training dataset with last four columns describing where Wally appears in an image

准备数据集的最后一步是将标签(保存为.csv)和图像(.jpeg)打包成一个二进制.tfrecord文件。这样做的过程在这里解释,但是你可以找到 train 和 eval Wally 在哪里。tfecord我的 Github 回购上的文件。

准备模型

Tensorflow 对象检测 API 提供了一组在几个公共数据集上训练的具有不同性能(通常是速度-精度权衡)的预训练模型。

虽然该模型可以从随机初始化的网络权重开始从头开始训练,但这一过程可能需要数周时间。相反,我们使用了一种叫做迁移学习的方法。
它包括采用一个通常被训练来解决一般问题的模型,并对其进行再训练来解决我们的问题。迁移学习背后的想法是,我们可以使用预训练模型中获得的知识,并将其转移到我们的新模型中,而不是通过从头开始训练我们的模型来重新发明轮子。这为我们节省了大量时间,因此我们可以将花在培训上的时间用于获取针对我们问题的知识。

我们使用了 RCNN 和在 COCO 数据集上训练的 Inception v2 模型以及它的管道配置文件。该模型包括一个检查点.ckpt文件,我们可以用它来开始训练。

下载配置文件后,请确保用指向您的检查点文件、培训和评估的路径替换“PATH_TO_BE_CONFIGURED”字段。tfrecord 文件和标签映射文件。

需要配置的最后一个文件是labels.txt地图文件,它包含了我们所有不同对象的标签。因为我们只寻找一种类型的对象,所以我们的标签文件看起来像这样

item {
  id: 1
  name: 'waldo'
}

最后,我们应该以下列内容结束:

  • 带有.ckpt检查点文件的预训练模型
  • 训练和评估.tfrecord数据集
  • 标签映射文件
  • 指向上述文件的管道配置文件

现在,我们准备开始训练。

培训

Tensorflow 对象检测 API 提供了一个简单易用的 Python 脚本来本地重新训练我们的模型。它位于models/research/object_detection中,可以运行:

python train.py --logtostderr --pipeline_config_path= PATH_TO_PIPELINE_CONFIG --train_dir=PATH_TO_TRAIN_DIR

其中PATH_TO_PIPELINE_CONFIG是我们的管道配置文件的路径,PATH_TO_TRAIN_DIR是新创建的目录,我们的新检查点和模型将存储在这里。

train.py的输出应该是这样的:

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

寻找最重要的信息是损失。它是训练集或验证集中每个例子的错误总和。当然,您希望它尽可能低,这意味着如果它缓慢下降,这意味着您的模型正在学习(…或过度拟合您的训练数据)。

还可以使用 Tensorboard 更详细地显示训练数据。

该脚本会在完成一定数量的步骤后自动存储一个检查点文件,这样您就可以在学习时随时恢复您保存的检查点,以防您的计算机崩溃。

这意味着当您想要完成模型的训练时,您可以终止脚本。

**但是什么时候停止学习呢?**关于何时停止训练的一般规则是当我们的评估集上的损失停止减少或通常非常低时(在我们的示例中低于 0.01)。

测试

现在,我们可以通过在一些示例图像上测试来实际使用我们的模型。

首先,我们需要使用models/research/object_detection中的脚本从存储的检查点(位于我们的火车目录中)导出一个推理图:

python export_inference_graph.py — pipeline_config_path PATH_TO_PIPELINE_CONFIG --trained_checkpoint_prefix PATH_TO_CHECPOINT --output_directory OUTPUT_PATH

导出的推理图现在是我们的 Python 脚本可以用来查找 Wally 的。

我写了几个简单的 Python 脚本(基于 Tensorflow 对象检测 API ),您可以使用它们在您的模型上执行对象检测,并在检测到的对象周围绘制框或暴露它们。

[find_wally.py](https://github.com/tadejmagajna/HereIsWally/blob/master/find_wally.py)[find_wally_pretty.py](https://github.com/tadejmagajna/HereIsWally/blob/master/find_wally_pretty.py)都可以在我的 Github repo 中找到,并且可以简单地运行

python find_wally.py

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

或者

python find_wally_pretty.py

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

在您自己的模型或评估图像上使用脚本时,请确保修改model_pathimage_path变量。

最后的想法

在我的 Github repo 上发布的模型表现得出奇的好。

它设法在评估图片中找到了 Wally,并在网上找到了一些额外的随机例子。它没能在沃利真正大的地方找到他,凭直觉这应该比在他真正小的地方找到他更容易解决。这表明我们的模型可能过度拟合我们的训练数据,主要是因为只使用了少量的训练图像。

任何希望通过手动标记一些来自网络的额外图片来提高模型性能的人,都可以在我的 Github repo 上提交 PR,并帮助改进训练集。

如何在非递归优雅 Python 中展平深度嵌套的 JSON 对象

原文:https://towardsdatascience.com/how-to-flatten-deeply-nested-json-objects-in-non-recursive-elegant-python-55f96533103d?source=collection_archive---------0-----------------------

用递归 python 解决方案来扁平化深度嵌套的 JSON 对象是很危险的。因为 python 解释器限制了堆栈的深度,以避免可能导致堆栈溢出的无限递归。从性能的角度来看,递归通常比迭代解决方案慢。

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

Deeply Nested “JSON”. Photo credit to wikipedia.

本文的目的是分享一种使用 python 源代码和提供的示例来展平深度嵌套的 JSON 对象的迭代方法,这类似于迭代地将所有嵌套的 matryoshka 玩偶带到外面呼吸一些新鲜空气。

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

Photo credit to MagiDeal

简化 JSON 的传统递归 python 解决方案

下面的函数是递归展平 JSON 的一个例子。第 16 行和第 20 行的代码调用函数“flatten”来保持 JSON 对象中项的解包,直到所有值都是原子元素(没有字典或列表)。

在下面的示例中,“pets”是两级嵌套的。键“dolphin”的值是一个字典列表。

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

将展平后的结果加载到 pandas 数据框中,我们可以得到

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

使用迭代方法展平深度嵌套的 JSON

函数“flatten _ json _ iterative _ solution”用迭代的方法解决了嵌套的 JSON 问题。这个想法是,我们扫描 JSON 文件中的每个元素,如果元素是嵌套的,就只解包一层。我们不断迭代,直到所有的值都是原子元素(没有字典或列表)。

  • 第 27 行的 chain.from_iterable() 用于从单个可迭代参数中获取链式输入,即 chain.from_iterable([‘ABC ‘,’ DEF’]) → A B C D E F
  • 第 27 行的 starmap() 用于创建一个迭代器,该迭代器使用从 dictionary.items()获得的参数来计算函数“unpack”

使用新的迭代解决方案“flatten _ JSON _ iterative _ solution”,例如“pets”:

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

使用另一个示例“pets2”进行单元测试,该示例在键“dolphin”处嵌套了 3 层。一个 list [{ “鸟”:“蓝鸟” },{ “鱼”:“海豚” }] 打包成 key "老虎"的值。

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

在本文中,我描述了一种用于展平深度嵌套的 JSON 对象的迭代解决方案。在实践中可以随意使用源代码。如果你有任何优化迭代解的想法,请给我发消息。

恭喜你!你刚刚读完一篇文章,同时解放了一些套娃。

报名参加🦞:的 Udemy 课程

具有机器学习和统计的推荐系统

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

https://www.udemy.com/course/recommender-system-with-machine-learning-and-statistics/?referralCode=178D030EF728F966D62D

如何在数据科学工作面试中炫耀自己对分析的热情?

原文:https://towardsdatascience.com/how-to-flaunt-your-passion-for-analytics-in-data-science-job-interviews-2cb432cc3d3d?source=collection_archive---------5-----------------------

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

Photo by Jason Rosewell on Unsplash

“数据科学家是本世纪最性感的工作。”

每个人都想分一杯羹。数以百万计的有志之士都在追求那些有限的、有价值的职位,并愿意为此付出一分一毫。那么,如何真正表明他们是特别的一个适合数据科学的角色呢?

多年来,我一直在面试 Gramener 的分析职位,我经常遇到一些求职者试图通过声称自己对分析有着深厚的热情来让自己与众不同。有些人甚至声称数据在他们的血液中流动。

但事实上,除了每天申请这个职位的数千份简历之外,没有什么能真正让大多数候选人的简历脱颖而出。他们的项目或职业兴趣并没有显示出对分析的关注,更不用说对它的热情了。而且,他们的答案没有给出最微妙的暗示,暗示 T4 内心深处燃烧的火焰。

在没有事实证据支持的情况下,以纯粹的情感理由为数据工作辩护,这难道不具有讽刺意味吗?

“有数据,就看数据。如果我们只有意见,那就用我的吧。”— 吉姆·巴克斯代尔

每当一个“数据科学”的流行语被说出,下一批渴望分析的人就会从一所精修学校毕业。虽然我不确定数据科学家的开放职位是否如分析师报告所述达到数百万,但毫无疑问的是,分析培训课程正在蓬勃发展。

考虑到供需不平衡的情况,我们不能只在 JD 清单上打勾。考虑到明显有利的经济形势,要么是天生对数据有热情,要么是试图凭空捏造;即使他们的教育背景或工作经验并不太好。

因此,最大的挑战往往是在数据科学采访中展示和捍卫这种对分析的热情。一个人怎样才能从人群中脱颖而出呢?根据我的经验和许多从业者对候选人的要求,以下是实现这一目标的 5 个步骤。

1.读、写并熟悉数据

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

Photo by Annie Spratt on Unsplash

当被问到简历中所列术语以外的问题时,应聘者往往会张口结舌。虽然人们可能会解释情绪分析,并提出一种从社交媒体数据中提取行为洞察的方法,但他们也必须知道这种收获如何被滥用于社会操纵

尽管有多年的工作经验,有些求职者说,逻辑回归还没有学会简单的神经网络,或者懒得去好奇为什么世界会因为深度神经网络而疯狂。这些模式并没有公正地对待那些声称要成为这个行业一部分的热情。

人们必须超越分析课程的教学大纲。除了一些核心技术的深度之外,获得分析的广度也很重要。探索像博客书籍播客视频这样的途径,并沉迷于数据内容。在信息过剩的今天,缺少的是时间和兴趣。

2.执行您自己的数据项目

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

Photo by Laith Abuabdu on Unsplash

人们几乎可以通过查看候选人简历上的模板*“实时项目】*来确定毕业学校。专家面试官倾向于自动掩饰不真诚的内容和无差别的项目。横向思维者经常犯下不把注意力放在直接工作线之外的项目上的错误。

不通过个人项目支持对数据的热情是不真诚的,即使是初步的。开放数据运动正在使世界各地的数据民主化,无论人们喜欢与否,每一个世界事件都留下了大量的数据。一些谷歌搜索可以获取任何感兴趣领域的数据。

人们只需要挑选一个问题,并把分析学习作为一个小项目来应用。个人数据项目的不完美解决方案远比付费直播项目的完美答案更有说服力。更重要的是主动性和努力,这肯定会引起别人的注意。

3.公开展示你的商品

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

Photo by Annie Spratt on Unsplash

那些把自己的能力局限在简历或刻板的 LinkedIn 页面上的求职者只是在光天化日之下,在就业市场上束缚自己。我在简历中首先寻找的是外部网站、门户网站或任何支持候选人的公共知识库的链接。

网络是一个充满可能性的奇妙地方。在 Github 上发布你的代码,通过在 Stackoverflow 上破解 bug 来展示你的技术能力。在公众可视化 门户上炫耀你的数据可视化技能。通过在媒体上撰写博客,展示你在数据科学领域的思想领导力。

今天,有无数种方式在公共场合兜售你的商品。这不再是一个平衡谦虚和表演技巧的问题。这已经成为建立一个人的可信度的最低要求,同时也有助于摆脱 PDF 文档的束缚。

4.与数据科学家竞争

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

Photo by Timothy Eberly on Unsplash

今天,当公司招聘转向公开的黑客马拉松和编码竞赛时,一个从未在像 Kaggle 这样的平台上竞争过的候选人看起来就像一个来自互联网时代的时间旅行者。

一个显而易见的展示激情的方法就是挤进竞争的竞技场。一个人不需要出现在比赛排行榜上就能得分。与任何运动一样,这都是关于采取主动,在正确的技能水平上竞争,坚持一些高质量的参赛项目,而不是以最终结果为目标。

各种技能的数据竞赛如雨后春笋般涌现,如 KaggleInformationIsBeautifulopen data 竞赛。从技能培养的角度来看,没有比应用更好的学习方法了。与人联系、在团队中竞争以及与数据科学家同事一起忙碌都有助于加速这一过程。

5.开始在你做的所有事情中看到(吃饭、睡觉和做梦)数据

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

Photo by Radu Florin on Unsplash

谷歌由你的数据驱动。脸书收获了它。你从来不知道存在的公司已经用你的数据建立了完整的商业模型。当一个人开始对其他人的数据进行新奇的预测分析时,难道他们不应该关心如何利用自己拥有和产生的数据做最简单的事情吗?

一个真正对数据感兴趣的人会开始看到数字生活在他们周围。无论是从你的手机和健身追踪器中提取数据,还是下载我们慷慨捐赠给谷歌脸书Linkedin 的数据,利用你新发现的数据技能来兜一圈吧。

想出用例,将数据用于一些有趣的或个人的用途。用数据来决定什么时候买最便宜的票?为什么不建立一个个性化的模型来为自己推荐下一部电影呢?吃你自己的山茱萸,享受数据带来的乐趣,因为这些花絮也能在面试中创造精彩的故事。

摘要

展示对分析的强烈热情的捷径是培养对数据的真正兴趣。

如果你认真对待一份与数据有关的工作,那就全力以赴,成为一名与数字打交道的人。或许就像葡萄酒一样,数据有一种后天习得的味道。一个人只需要系好安全带,开始这个认真的旅程,享受它总是给予的兴奋。

如果你觉得这很有趣,你会喜欢我写的这些相关文章:

对数据科学充满热情?随时在LinkedIn上加我,订阅我的 简讯

如何使用自动编码器生成图像

原文:https://towardsdatascience.com/how-to-generate-images-using-autoencoders-acfbc6c3555e?source=collection_archive---------10-----------------------

你知道什么会很酷吗?如果我们不需要所有这些标记数据来训练我们的模型。我的意思是标记和分类数据需要太多的工作。遗憾的是,现有的从支持向量机到卷积神经网络的模型,大部分都离不开它们的训练。

除了一小组他们能做到的算法。好奇吗?这叫做无监督学习。无监督学习通过自身从未标记的数据中推断出一个函数。最著名的无监督算法是 K-Means 和 PCA,K-Means 已被广泛用于将数据聚类成组,PCA 是降维的首选解决方案。K-Means 和 PCA 可能是有史以来最好的两种机器学习算法。让它们更好的是它们的简单。我的意思是,如果你抓住了它们,你会说:“为什么我没有早点想到呢?”

我们想到的下一个问题是:“有没有无监督的神经网络?”。你大概从帖子的标题就知道答案了。自动编码器。

为了更好地理解自动编码器,我将在解释的同时提供一些代码。请注意,我们将使用 Pytorch 来构建和训练我们的模型。

自动编码器是简单的神经网络,其输出就是输入。就这么简单。他们的目标是学习如何重建输入数据。但这有什么帮助呢?诀窍在于它们的结构。网络的第一部分就是我们所说的编码器。它接收输入,并在低维的潜在空间中对其进行编码。第二部分(解码器)获取该向量并对其进行解码,以产生原始输入。

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

中间的潜在向量是我们想要的,因为它是输入的压缩的表示。应用非常广泛,例如:

  • 压缩
  • 降维

此外,很明显,我们可以应用它们来复制相同但稍有不同甚至更好的数据。例如:

  • 数据去噪:给它们一幅有噪声的图像,然后训练它们输出没有噪声的相同图像
  • 训练数据扩充
  • 异常检测:在单个类上训练它们,使得每个异常都给出大的重构误差。

然而,自动编码器面临着和大多数神经网络一样的问题。他们倾向于过度拟合,并遭受梯度消失问题。有解决办法吗?变分自动编码器是一个非常好的和优雅的努力。它本质上增加了随机性,但不完全是。

让我们进一步解释一下。变分自动编码器被训练来学习模拟输入数据的概率分布,而不是映射输入和输出的函数。然后从该分布中采样点,并将它们馈送到解码器,以生成新的输入数据样本。但是等一下。当我听到概率分布时,我想到的只有一件事:贝叶斯。是的,贝叶斯法则再次成为主要原则。顺便说一下,我不想夸大其词,但贝叶斯公式是有史以来最好的方程式。我不是在开玩笑。到处都是。如果你不知道什么是,请查一下。放弃这篇文章,学习贝叶斯是什么。我会原谅你。

回到变分自动编码器。我认为下面的图片说明了问题:

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

这就是了。随机神经网络。在我们自己构建一个生成新图像的示例之前,有必要再讨论一些细节。

VAE 的一个重要方面是损失函数。最常见的是,它由两部分组成。重建损失衡量重建数据与原始数据的不同程度(例如二进制交叉熵)。KL-divergence 试图调整该过程,并尽可能保持重建数据的多样性。

另一个重要的方面是如何训练模型。困难的出现是因为变量是确定性的,但随机和梯度下降通常不会这样工作。为了解决这个问题,我们使用了重新参数化。潜在向量(z)将等于我们分布的学习均值(μ)加上学习标准差(σ)乘以ε(ε),其中ε遵循正态分布。我们重新参数化样本,使随机性与参数无关。

在我们的例子中,我们将尝试使用可变自动编码器生成新图像。我们将使用 MNIST 数据集,重建的图像将是手写的数字。正如我已经告诉你的,我使用 Pytorch 作为一个框架,没有特别的原因,除了熟悉。首先,我们应该定义我们的层。

正如你所看到的,我们将使用一个非常简单的网络,只有密集的(在 pytorch 的例子中是线性的)层。下一步是构建运行编码器和解码器的函数。

只是几行 python 代码。没什么大不了的。最后,我们开始训练我们的模型,并看到我们生成的图像。

快速提醒:Pytorch 有一个与 Tensorflow 相反的动态图,这意味着代码正在运行。不需要创建图形,然后编译并执行它,Tensorflow 最近通过其急切执行模式引入了上述功能。

当训练完成时,我们执行测试函数来检查模型的工作情况。事实上,它做得相当好,构建的图像几乎与原始图像相同,我相信没有人能够在不了解整个故事的情况下区分它们。

下图显示了第一行中的原始照片和第二行中生成的照片。

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

很好,不是吗?

在我们结束这篇文章之前,我想再介绍一个话题。正如我们所见,变分自动编码器能够生成新的图像。这是生成模型的经典行为。生成模型正在生成新数据。另一方面,判别模型是对现有数据进行分类或判别。

用一些数学术语来解释:生成模型学习联合概率分布 p(x,y ),而判别模型学习条件概率分布 p(y|x)。

在我看来,生成模型要有趣得多,因为它们为许多可能性打开了大门,从数据扩充到可能的未来状态的模拟。但是在下一篇文章中会有更多的介绍。可能是关于一种相对新型的生成模型的帖子,叫做生成对抗网络。

在那之前,继续学习 AI。

如果您有任何想法、评论、问题或者您只想了解我的最新内容,请随时在LinkedinTwitterinsta gramGithub或在我的

原载于 2018 年 9 月 8 日sergioskar . github . io

如何在 Keras 中使用 LSTM 神经网络生成音乐

原文:https://towardsdatascience.com/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834d4c5?source=collection_archive---------0-----------------------

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

介绍

网络正被用来改善我们生活的方方面面。它们为我们提供想要购买的物品的建议,根据作者的风格生成文本,甚至可以用于改变图像的艺术风格。近年来,已经有一些关于如何使用神经网络生成文本的教程,但缺乏关于如何创作音乐的教程。在本文中,我们将介绍如何使用 Keras 库在 Python 中使用递归神经网络来创作音乐。

对于不耐烦的人,在教程的最后有一个 Github 库的链接。

背景

在我们进入实现的细节之前,有一些术语我们必须澄清。

递归神经网络(RNN)

递归神经网络是一类利用序列信息的人工神经网络。它们之所以被称为递归,是因为它们对序列中的每个元素都执行相同的功能,其结果取决于之前的计算。而输出与传统神经网络中的先前计算无关。

在本教程中我们将使用一个【LSTM】长短期记忆网络。它们是一种可以通过梯度下降有效学习的递归神经网络。使用门控机制,LSTMs 能够识别和编码长期模式。LSTMs 对于解决网络必须长时间记忆信息的问题非常有用,例如音乐和文本生成。

音乐 21

Music21 是一个用于计算机辅助音乐学的 Python 工具包。它允许我们教授音乐理论的基础知识,生成音乐示例并研究音乐。该工具包提供了一个简单的接口来获取 MIDI 文件的乐谱。此外,它允许我们创建音符和和弦对象,以便我们可以轻松地制作自己的 MIDI 文件。

在本教程中,我们将使用 Music21 来提取数据集的内容,并获取神经网络的输出,将其转换为乐谱。

克拉斯

Keras 是一个高级神经网络 API,它简化了与 Tensorflow 的交互。它的开发重点是支持快速实验。

在本教程中,我们将使用 Keras 库来创建和训练 LSTM 模型。一旦模型被训练,我们将使用它来为我们的音乐生成乐谱。

培养

在本节中,我们将介绍如何为我们的模型收集数据,如何准备数据以便在 LSTM 模型中使用,以及我们模型的架构。

数据

在我们的 Github 库中,我们使用了钢琴曲,主要由《最终幻想》的配乐组成。我们选择《最终幻想》音乐是因为大部分作品都有非常独特和美丽的旋律,而且作品数量庞大。但是任何由单个乐器组成的 MIDI 文件集都可以满足我们的需求。

实现神经网络的第一步是检查我们将使用的数据。

下面我们可以看到使用 Music21 读取的 midi 文件的摘录:

...
<music21.note.Note F>
<music21.chord.Chord A2 E3>
<music21.chord.Chord A2 E3>
<music21.note.Note E>
<music21.chord.Chord B-2 F3>
<music21.note.Note F>
<music21.note.Note G>
<music21.note.Note D>
<music21.chord.Chord B-2 F3>
<music21.note.Note F>
<music21.chord.Chord B-2 F3>
<music21.note.Note E>
<music21.chord.Chord B-2 F3>
<music21.note.Note D>
<music21.chord.Chord B-2 F3>
<music21.note.Note E>
<music21.chord.Chord A2 E3>
...

数据分为两种对象类型:音符 s 和和弦 s。音符对象包含关于音符的音高八度音程偏移的信息。

  • 音高是指声音的频率,或者说高低,用字母【A、B、C、D、E、F、G】来表示,A 最高,G 最低。
  • 八度 指的是你在钢琴上使用的那一组音高。
  • 偏移指音符在乐曲中的位置。

和弦对象实质上是同时播放的一组音符的容器。

现在我们可以看到,为了准确地产生音乐,我们的神经网络必须能够预测下一个音符或和弦。这意味着我们的预测数组必须包含我们在训练集中遇到的每个音符和弦对象。在 Github 页面上的训练集中,不同音符和和弦的总数是 352。对于网络来说,这似乎需要处理很多可能的输出预测,但 LSTM 网络可以轻松处理。

接下来我们要担心我们要把笔记放在哪里。正如大多数听过音乐的人所注意到的,音符之间通常有不同的音程。你可以在短时间内连续弹奏许多音符,然后是一段休息时间,在这段时间内没有音符弹奏。

下面我们有另一个用 Music21 读取的 midi 文件的摘录,只是这次我们在它后面添加了对象的偏移量。这让我们可以看到每个音符和和弦之间的音程。

...
<music21.note.Note B> 72.0
<music21.chord.Chord E3 A3> 72.0
<music21.note.Note A> 72.5
<music21.chord.Chord E3 A3> 72.5
<music21.note.Note E> 73.0
<music21.chord.Chord E3 A3> 73.0
<music21.chord.Chord E3 A3> 73.5
<music21.note.Note E-> 74.0
<music21.chord.Chord F3 A3> 74.0
<music21.chord.Chord F3 A3> 74.5
<music21.chord.Chord F3 A3> 75.0
<music21.chord.Chord F3 A3> 75.5
<music21.chord.Chord E3 A3> 76.0
<music21.chord.Chord E3 A3> 76.5
<music21.chord.Chord E3 A3> 77.0
<music21.chord.Chord E3 A3> 77.5
<music21.chord.Chord F3 A3> 78.0
<music21.chord.Chord F3 A3> 78.5
<music21.chord.Chord F3 A3> 79.0
...

从这段摘录和大部分数据集可以看出,midi 文件中音符之间最常见的音程是 0.5。因此,我们可以通过忽略可能输出列表中的变化偏移来简化数据和模型。它不会太严重地影响网络产生的音乐的旋律。因此,在本教程中,我们将忽略偏移量,将可能的输出列表保持在 352。

准备数据

既然我们已经检查了数据,并且确定了我们想要使用的特征是作为我们的 LSTM 网络的输入和输出的音符和弦,那么是时候为网络准备数据了。

首先,我们将数据加载到一个数组中,如下面的代码片段所示:

from music21 import converter, instrument, note, chordnotes = []for file in glob.glob("midi_songs/*.mid"):
    midi = converter.parse(file)
    notes_to_parse = None parts = instrument.partitionByInstrument(midi) if parts: # file has instrument parts
        notes_to_parse = parts.parts[0].recurse()
    else: # file has notes in a flat structure
        notes_to_parse = midi.flat.notes for element in notes_to_parse:
        if isinstance(element, note.Note):
            notes.append(str(element.pitch))
        elif isinstance(element, chord.Chord):
            notes.append('.'.join(str(n) for n in element.normalOrder))

我们首先使用 converter.parse(file) 函数将每个文件加载到一个 Music21 流对象中。使用这个流对象,我们得到了文件中所有音符和和弦的列表。我们使用每个音符对象的字符串符号来附加其音高,因为音符的最重要部分可以使用音高的字符串符号来重新创建。我们通过将和弦中每个音符的 id 编码到一个字符串中来添加每个和弦,每个音符用一个点来分隔。这些编码使我们能够轻松地将网络生成的输出解码成正确的音符和和弦。

现在我们已经把所有的音符和和弦放入一个序列列表中,我们可以创建序列作为我们网络的输入。

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

Figure 1: When converting from categorical to numerical data the data is converted to integer indexes representing where the category is positioned in the set of distinct values. E.g. apple is the first distinct value so it maps to 0, orange is the second so it maps to 1, pineapple is the third so it maps to 2, and so forth.

首先,我们将创建一个映射函数,从基于字符串的分类数据映射到基于整数的数值数据。这样做是因为神经网络对于基于整数数字数据的性能比基于字符串的分类数据好得多。从分类到数字转换的一个例子可以在图 1 中看到。

接下来,我们必须为网络及其各自的输出创建输入序列。每个输入序列的输出将是音符列表中输入序列中音符序列之后的第一个音符或和弦。

sequence_length = 100# get all pitch names
pitchnames = sorted(set(item for item in notes))# create a dictionary to map pitches to integers
note_to_int = dict((note, number) for number, note in enumerate(pitchnames))network_input = []
network_output = []# create input sequences and the corresponding outputs
for i in range(0, len(notes) - sequence_length, 1):
    sequence_in = notes[i:i + sequence_length]
    sequence_out = notes[i + sequence_length]
    network_input.append([note_to_int[char] for char in sequence_in])
    network_output.append(note_to_int[sequence_out])n_patterns = len(network_input)# reshape the input into a format compatible with LSTM layers
network_input = numpy.reshape(network_input, (n_patterns, sequence_length, 1))
# normalize input
network_input = network_input / float(n_vocab)network_output = np_utils.to_categorical(network_output)

在我们的代码示例中,我们将每个序列的长度设为 100 个音符/和弦。这意味着,为了预测序列中的下一个音符,网络有前 100 个音符来帮助进行预测。我强烈建议使用不同的序列长度来训练网络,以查看不同的序列长度对网络生成的音乐的影响。

为网络准备数据的最后一步是标准化输入和一次性编码输出

模型

最后,我们开始设计模型架构。在我们的模型中,我们使用四种不同类型的层:

LSTM 层是一个递归神经网络层,它将一个序列作为输入,可以返回序列(return_sequences=True)或矩阵。

辍学层是一种正则化技术,包括在训练期间的每次更新时将一部分输入单元设置为 0,以防止过拟合。该分数由该层使用的参数决定。

密集层全连接层是全连接神经网络层,其中每个输入节点连接到每个输出节点。

激活层决定了我们的神经网络将使用什么激活函数来计算一个节点的输出。

model = Sequential()
    model.add(LSTM(
        256,
        input_shape=(network_input.shape[1], network_input.shape[2]),
        return_sequences=True
    ))
    model.add(Dropout(0.3))
    model.add(LSTM(512, return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(256))
    model.add(Dense(256))
    model.add(Dropout(0.3))
    model.add(Dense(n_vocab))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

现在,我们已经了解了将要使用的不同层的一些信息,是时候将它们添加到网络模型中了。

对于每个 LSTM、密集和激活层,第一个参数是该层应该有多少个节点。对于丢弃层,第一个参数是训练期间应该丢弃的输入单元的分数。

对于第一层,我们必须提供一个名为 *input_shape 的参数。*该参数的目的是通知网络它将训练的数据的形状。

最后一层应该总是包含与我们系统的不同输出相同数量的节点。这确保了网络的输出将直接映射到我们的类。

在本教程中,我们将使用一个简单的网络,包括三个 LSTM 层,三个下降层,两个密集层和一个激活层。我建议试验一下网络的结构,看看能否提高预测的质量。

为了计算每次训练迭代的损失,我们将使用分类交叉熵,因为我们的每个输出只属于一个类,而我们有两个以上的类要处理。为了优化我们的网络,我们将使用 RMSprop 优化器,因为它通常是递归神经网络的一个非常好的选择。

filepath = "weights-improvement-{epoch:02d}-{loss:.4f}-bigger.hdf5" checkpoint = ModelCheckpoint(
    filepath, monitor='loss', 
    verbose=0,        
    save_best_only=True,        
    mode='min'
)    
callbacks_list = [checkpoint] model.fit(network_input, network_output, epochs=200, batch_size=64, callbacks=callbacks_list)

一旦我们确定了网络的架构,就该开始培训了。Keras 中的 model.fit() 函数用于训练网络。第一个参数是我们之前准备的输入序列列表,第二个参数是它们各自的输出列表。在我们的教程中,我们将训练网络 200 个历元(迭代),通过网络传播的每一批包含 64 个样本。

为了确保我们可以在任何时间点停止训练而不丢失我们所有的辛苦工作,我们将使用模型检查点。模型检查点为我们提供了一种在每个时期后将网络节点的权重保存到文件中的方法。这使得我们一旦对损失值感到满意,就可以停止运行神经网络,而不必担心失去权重。否则,在我们有机会将权重保存到文件之前,我们将不得不等待网络完成所有 200 个时期。

创作音乐

既然我们已经完成了对网络的训练,现在是时候让我们花了几个小时训练的网络玩一玩了。

为了能够使用神经网络生成音乐,你必须将它置于与以前相同的状态。为简单起见,我们将重用培训部分的代码来准备数据,并以与之前相同的方式建立网络模型。除了不是训练网络,而是将我们在训练部分保存的权重加载到模型中。

model = Sequential()
model.add(LSTM(
    512,
    input_shape=(network_input.shape[1], network_input.shape[2]),
    return_sequences=True
))
model.add(Dropout(0.3))
model.add(LSTM(512, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(512))
model.add(Dense(256))
model.add(Dropout(0.3))
model.add(Dense(n_vocab))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')# Load the weights to each node
model.load_weights('weights.hdf5')

现在,我们可以使用训练好的模型开始生成注释。

由于我们有一个完整的音符序列列表,我们将在列表中选择一个随机索引作为我们的起点,这允许我们在不做任何更改的情况下重新运行生成代码,并且每次都会得到不同的结果。但是,如果您希望控制起始点,只需用命令行参数替换 random 函数。

这里我们还需要创建一个映射函数来解码网络的输出。这个函数将从数字数据映射到分类数据(从整数到注释)。

start = numpy.random.randint(0, len(network_input)-1)int_to_note = dict((number, note) for number, note in enumerate(pitchnames))pattern = network_input[start]
prediction_output = []# generate 500 notes
for note_index in range(500):
    prediction_input = numpy.reshape(pattern, (1, len(pattern), 1))
    prediction_input = prediction_input / float(n_vocab) prediction = model.predict(prediction_input, verbose=0) index = numpy.argmax(prediction)
    result = int_to_note[index]
    prediction_output.append(result) pattern.append(index)
    pattern = pattern[1:len(pattern)]

我们选择使用网络生成 500 个音符,因为这大约是两分钟的音乐,并给网络足够的空间来创作旋律。对于我们想要生成的每个音符,我们必须向网络提交一个序列。我们提交的第一个序列是起始索引处的音符序列。对于我们用作输入的每个后续序列,我们将删除序列的第一个音符,并在序列的末尾插入前一次迭代的输出,如图 2 所示。

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

Figure 2: The first input sequence is ABCDE. The output we get from feeding that to the network is F. For the next iteration we remove A from the sequence and append F to it. Then we repeat the process.

为了从网络的输出中确定最可能的预测,我们提取最高值的索引。输出数组中索引 X 处的值对应于 X 是下一个音符的概率。图 3 有助于解释这一点。

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

Figure 3: Here we see the mapping between the an output prediction from the network and classes. As we can see the highest probability is that the next value should be D, so we choose D as the most probable class.

然后,我们将网络的所有输出收集到一个数组中。

现在我们已经将所有音符和弦的编码表示放在一个数组中,我们可以开始解码它们并创建一个音符和弦对象的数组。

首先,我们必须确定我们正在解码的输出是音符还是和弦。

如果模式是一个和弦,我们必须将弦分成一系列音符。然后我们遍历每个音符的字符串表示,并为每个音符创建一个音符对象。然后我们可以创建一个包含这些音符的和弦对象。

如果模式是一个音符,我们使用模式中包含的音高的字符串表示创建一个音符对象。

在每次迭代结束时,我们将偏移量增加 0.5(正如我们在上一节中所决定的),并将创建的音符/和弦对象添加到一个列表中。

offset = 0
output_notes = []# create note and chord objects based on the values generated by the modelfor pattern in prediction_output:
    # pattern is a chord
    if ('.' in pattern) or pattern.isdigit():
        notes_in_chord = pattern.split('.')
        notes = []
        for current_note in notes_in_chord:
            new_note = note.Note(int(current_note))
            new_note.storedInstrument = instrument.Piano()
            notes.append(new_note)
        new_chord = chord.Chord(notes)
        new_chord.offset = offset
        output_notes.append(new_chord)
    # pattern is a note
    else:
        new_note = note.Note(pattern)
        new_note.offset = offset
        new_note.storedInstrument = instrument.Piano()
        output_notes.append(new_note) # increase offset each iteration so that notes do not stack
    offset += 0.5

现在我们有了网络生成的音符和和弦列表,我们可以使用该列表作为参数来创建 Music21 Stream 对象。最后,为了创建包含网络生成的音乐的 MIDI 文件,我们使用 Music21 工具包中的 write 函数将流写入文件。

midi_stream = stream.Stream(output_notes)midi_stream.write('midi', fp='test_output.mid')

结果

现在是惊叹结果的时候了。图 4 包含使用 LSTM 网络生成的音乐的活页乐谱表示。我们一眼就能看出它有一定的结构。这在第二页倒数第三行尤为明显。

了解音乐并能读懂乐谱的人会发现乐谱上散布着一些奇怪的音符。这是神经网络无法创造完美旋律的结果。在我们目前的实施中,总会有一些错误的注释,为了能够取得更好的结果,我们需要一个更大的网络。

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

Figure 4: An example of sheet music generated by the LSTM network

从这个相对较浅的网络得到的结果仍然令人印象深刻,这可以从 Embed 1 中的音乐示例中听出来。对于那些感兴趣的人,图 4 中的活页乐谱代表了 NeuralNet Music 5 的乐谱。

Embed 1: Examples generated by the network

未来的工作

我们用一个简单的 LSTM 网络和 352 节课取得了显著的效果和优美的旋律。然而,也有可以改进的地方。

首先,我们目前的实现不支持音符的不同持续时间和音符之间的不同偏移。为了实现这一点,我们可以为每个不同的持续时间添加更多的类,并添加代表音符之间的休止符的休止符类。

为了通过添加更多的类来获得令人满意的结果,我们还必须增加 LSTM 网络的深度,这将需要一台功能强大得多的计算机。我在家里使用的笔记本电脑花了大约 20 个小时来训练现在的网络。

第二,将开头和结尾添加到片段中。由于网络现在没有片段之间的区别,也就是说网络不知道一个片段在哪里结束,另一个片段在哪里开始。这将允许网络从头到尾生成一个片段,而不是像现在这样突然结束所生成的片段。

第三,添加一个处理未知音符的方法。现在,如果网络遇到它不知道的通知,它将进入失败状态。解决该问题的可能方法是找到与未知音符最相似的音符或和弦。

最后,向数据集添加更多仪器。现在,网络只支持只有一个乐器的作品。看看它是否能扩展到支持整个管弦乐队会很有趣。

结论

在本教程中,我们已经展示了如何创建一个 LSTM 神经网络来生成音乐。虽然结果可能并不完美,但仍然令人印象深刻,并向我们展示了神经网络可以创作音乐,并有可能用于帮助创作更复杂的音乐作品。

点击这里查看 Github 资源库中的教程

如何用 Python 代码将 AE (Autoencoder)应用于 Mnist 生成机器学习中的新数据

原文:https://towardsdatascience.com/how-to-generate-new-data-in-machine-learning-with-vae-variational-autoencoder-applied-to-mnist-ca68591acdcf?source=collection_archive---------6-----------------------

链接到 github

自动编码器是用于生成新数据的神经网络(无监督学习)。该模型用于为数据集生成新数据,或者在我们想要从数据中消除噪声的情况下使用。网络由多个神经网络组成;一个编码器和一个解码器通过一个瓶颈连接;这个瓶颈就是下图所示的潜在空间;

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

font: Hackernoon

编码器处理数据,直到瓶颈(潜在空间)减小尺寸,并且解码器获取数据并重构数据结构,以给出与我们的原始数据相同的输出。我们可以把潜在空间看作是我们数据的一种表示。

在这个具体的例子中,我们正在读取 28x28 像素(784 个元素)的数字(Mnist 数据集)图像,我们希望将它们减少到 32 个元素(潜在空间),再次创建 28x28 像素的图像。

MNIST 数据集 是一个大型的 c 手写数字集合,常用于图像处理。

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

font: Wikipedia

我们可以开始导入我们将需要的所有库:

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

import

我们正在使用来自 keras.models 的类模型。为了更深入,使用 keras 功能 API 的教程是有用的,这是定义复杂模型的方法,例如多输出模型、有向无环图或具有共享层的模型。

在所有的导入之后,我们需要导入数据集,在本例中是由 keras 提供的。

我们使用的图像是 28x28 像素的黑白图像。每个像素由 1 到 255 范围内的一个数字表示。

导入数据后,我们将对它们进行归一化,将每个像素值除以 255,这是可能的最大值,所有值的范围为 0-1。

标准化之后,我们需要为输入层重新调整数组的形状。

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

Importing and Data Normalization

一旦我们有了所有的数据,我们可以开始定义我们的模型,在这里我们可以清楚地看到 3 个部分(编码,瓶颈和解码。通过我们的模型结构,我们可以看到,我们有超过 25k 个参数需要训练,这些参数由权重和偏差表示。这些参数将帮助你生成新的数据。

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

模型架构的代码可以在 github 上看到。

在建模之后,我们需要编译(定义优化器损失函数)并使其适合我们的训练集。

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

Compiling the model

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

Plotting the Validation Loss

与训练损失相比,验证损失告诉我们我们的模型在泛化方面有多好。

现在我们已经编译和训练了模型,我们可以使用模型的预测功能生成新数据。

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

code for plotting

用这个代码我们绘制了两行,每行 10 个数字。第一行是真实的图像,第二行是生成的图像。正如我们所看到的,我们丢失了一些信息,但数量显然是相同的。

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

1s row real <***> 2nd row generated

这是一个非常强大的模型,可以与管道中的其他机器学习模型相结合,也可以用于预训练模型或减少数据中的噪声。

如果你愿意支持我写其他类似的文章, 请我喝杯咖啡 😃

如何获得一份数据科学家的工作?

原文:https://towardsdatascience.com/how-to-get-a-job-as-a-data-scientist-f417078fe13e?source=collection_archive---------0-----------------------

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

大家好。这篇博客文章来自我最近在 LinkedIn 发表的三篇文章。他们是第一部分的、第二部分的第三部分的

这是一个很难回答的问题。这一个和我一起挂吧(而这并不是关于宇宙、存在和一切的最终答案)。

这是我最常从我认识的人或我的关系@ LinkedIn 那里收到的问题之一。

我告诉你我的经历。我现在已经做了一段时间的数据科学家(尽管有些人仍然认为这不是一个职业,或者可能不是一个新的职业)。不过我还是要说说我是如何在 BBVA 数据&分析 得到现在这份工作的。

我去年完成了我的硕士学位,我做了一个关于宇宙学和贝叶斯机器学习的物理学。就在毕业前,我想了想我想做什么,我决定我想在数据科学领域工作。

我申请了将近 125 份工作(真的,也许你申请了更多),我只收到了 25-30 份回复。有些人只是说:谢谢,但是不用了。我接受了将近 15 次采访。我从每一个人身上学到了东西。变好了。我不得不面对许多拒绝。一些我实际上没准备好的事情。但我喜欢接受采访的过程(说实话,并不是所有人)。我学习了很多,每天编程,看了很多文章和帖子。他们帮了大忙。

但是,我是怎么得到这份工作的?

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

很有耐心。这并不容易,但到了第七次面试时,我意识到了几件事:

  • 有些人不知道什么是数据科学。
  • 招聘人员是你面试时最好的朋友,他们想帮你进去。所以相信他们,让他们帮助你,提出问题!
  • 人们更感兴趣的是你如何解决问题,如何处理一些特定的情况,而不是你的技术知识。

我真的做好了回答算法、机器学习、Python、Spark 等问题的准备。但是我还没有准备好回答关于我如何解决一个问题,或者我将如何处理一个情况的问题。

到第八次面试时,我回顾了我以前作为数据科学家、计算机工程师、物理学家和人类所做的一切。我准备好回答关于现实生活工作的问题,如何处理复杂的情况,如何处理新数据,如何做数据科学工作流,如何向经理解释困难的概念等等。

我做得好多了。我也平静下来了。我知道面试我的人是想让我进公司,这不是调查。

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

我的建议是找一份数据科学家的工作:

  • 耐心点。在找到一份工作之前,你可能会申请上百份工作。
  • 准备好。很多。不仅要学习重要的概念、编程和回答商业问题,还要记住你将是组织中的重要一员,你将与不同的人和情况打交道,准备好回答关于你在不同工作情况下如何表现的问题。
  • 有一个投资组合。如果你正在寻找一份严肃的数据科学的有偿工作,做一些有真实数据的项目。如果你能把它们发布在 GitHub 上。除了 Kaggle 比赛,找一些你喜欢的事情或者你想解决的问题,用你的知识去做。
  • 招聘人员是你的朋友。面试你的人也是。他们希望你进入公司,这是我每天都记得的一个强有力的建议。
  • 询问人们是做什么的。我建议您关注马修·梅奥 关于“数据科学家的一天”的帖子,以便更好地了解我们的工作。
  • 如果你想要一份实习工作,就要有你的学术技能。

祝你一切顺利,成功:)。

跟我来:【https://www.linkedin.com/in/faviovazquez/】T4。

没有经验如何在 AI 找工作

原文:https://towardsdatascience.com/how-to-get-a-job-in-ai-with-no-experience-16526874165d?source=collection_archive---------4-----------------------

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

Photo by James Harrison on Unsplash

介绍

在我们开始之前,我想我应该给一些背景信息,关于我写这篇文章的动机。我刚刚从计算机科学学士学位毕业。大约在我第三年的中途,我知道我唯一想从事的领域是人工智能。我的大学没有任何人工智能的专门课程,在都柏林也没有多少人工智能实习。我很高兴地说,我现在作为一名毕业生在一个人工智能研发团队工作。

这篇文章将简要概述我是如何为一份没有经验的人工智能工作做准备的。现在承认,这些信息中没有一个是令人兴奋的,大多数提示都是显而易见的。然而,就像健康饮食和锻炼一样,我发现尽管每个人都知道这是你需要做的事情,但很多人还是不去做。我希望这篇文章能帮助人们制定自己的计划,进入令人兴奋的人工智能世界。我想指出的另一件事是,这个建议通常适用于软件开发的所有领域,然而具体的指导方针和主题显然将集中在 AI/ML 上。

人工智能的现状

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

Nvidia provides a nice infographic of how AI has progressed over the past several decades, source

对于软件毕业生和初级开发人员来说,ML 是一个非常独特的领域。这个领域在过去 5 年才真正起步,而且还相对年轻。这为新的开发者和雇主提供了一个真正的问题/机会。

毕业生:对这个领域没有任何扎实的信息,大学里的模块很少,很难获得相关的经验。

**雇主:**发现很难找到有相关经验的人。

作为一名大学生,这是一个艰难的困境,但也提供了一个很好的机会。目前,合格的机器学习(ML)开发人员数量严重不足。所有公司都在招聘这些职位,但都招不到人。如果你能证明你有相关的专业知识,你将是一个非常理想的候选人,不仅会从毕业生中脱颖而出,也会在有经验的雇员中脱颖而出。

这在理论上听起来很棒,但当然没那么简单。很难找到这些人是有原因的。这是一个很难精通的领域,而且这个领域正在快速发展,每个月都有更多的进步需要跟上。下面我将介绍你需要努力的关键领域,以便建立你作为机器学习专家的品牌。

  • 经验
  • 对理论的理解
  • 专业化
  • 大学

经验

但是题目说没经验??Wtf!

是的,我知道,但是说实话,没有人会雇佣一个完全没有经验的人。

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

Source

就像我之前说的,在做 ML 的公司工作很难获得经验。因此,如果这不是一个选项,你需要为自己提供所需的经验。下面是一些你可以做到这一点的好方法。

  • 个人项目
  • 黑客马拉松
  • 编码挑战
  • 开源项目

个人项目

你 100%需要在你的 GitHub 中有 ML 项目。这是从招聘过程中剔除人员的一个非常快速的方法,也是招聘人员在看完你的简历后首先要看的。现在,当你还在学习 ML 的时候,想出一个项目可能有点困难,没关系。它不需要很大或华而不实或创新,它只需要显示你对主题的理解,并给人们一个信号,表明你能够以良好的编码标准独立工作/研究。构建 GitHub 项目时需要关注的几件事。

  1. 完成这个项目不会超过一个月
  2. 确保你的代码是干净的,模块化的,有注释的
  3. 为您的代码提供自述文件和其他文档,如使用的技术、参考教程、依赖项等
  4. 如果可能,为代码库的关键部分提供单元测试

接下来的事情是选择做什么项目。你希望它足够简单,你可以在一个月内完成,并且足够相关,你可以在这个过程中学到有用的技能。以下是一些例子:

  • 使用 CNN 的图像分类器。只是让它区分两种类型的图像(即狗/猫)。
  • 标准前馈神经网络对数据进行分类。Kaggle.com 有很多很棒的数据集。以虹膜数据集为例,根据给定的数据对一种花的虹膜类型进行分类。
  • 电影评论的情感分析。另一个受欢迎的 first 项目是使用神经网络对电影评论的情绪进行分类(好的或坏的),你可以使用 IMDB 数据集,也可以在 kaggle 上找到。

黑客马拉松

黑客马拉松之所以伟大,有几个原因。它迫使你走出去,建立一些东西,你会遇到更多有经验的人,你可以把它放在你不断增长的简历/投资组合中。试着去找专门的人工智能黑客马拉松,但也去找一般的软件黑客马拉松,试着在你的项目中加入人工智能元素。查看 meetup.com,看看你所在的地区是否有专注于人工智能或软件开发的 meetup 团体。这些团体通常每年至少有一次黑客马拉松。

编码挑战

类似于黑客马拉松,编码挑战迫使你建立一个你所学的实际应用,当你申请你的 ML 工作时,这是值得的。作为一个额外的奖励,这些比赛通常很有趣,增加的竞争意识可以成为一个很好的动力。看看 KaggleCodinGameHalite.io 等地方

开源项目

这是你能得到的最接近真实世界的经验,除了真正得到一份 ML 开发者的工作。开源项目让你真正了解产品级代码,并教会你有价值的技能,如调试、版本控制、与其他人一起开发,当然还有大量的 ML(取决于项目)。

理解理论

好的,所以最主要的事情是获得一些项目和经验,但这不仅仅是跟随一些教程并贴在 GitHub 上(尽量不要这样做,😄)你需要了解你正在构建什么。很多大学生都知道,学习一个东西和理解它是有很大区别的。

有很多很好的资源,清楚地介绍了 ML 和深度学习的重要理论。另一个重要的事情指出,不要只关注深度学习。我知道这是 AI“更性感”的一面,但这只是一面。熟悉更多传统形式的 ML,如回归模型、支持向量机和所有主要的概率和统计概念。无论你在构建什么类型的人工智能,这些都是有价值的。

以下是我发现的一些更好的资源。

  • 斯坦福机器学习是 coursera 上的一门免费课程,涵盖了你需要了解的从回归模型到深度学习的所有机器学习知识
  • DeepLearning.ai 作者吴恩达。与之前的课程一样,Ng 对人工智能进行了非常全面的研究,然而这门课程是专门针对深度学习的,而不是一般的 ML。
  • 安德鲁·特拉斯克的《探索深度学习》可能是我找到的关于深度学习的最好的书。除了 numpy,这本书没有使用任何库来构建神经网络。它更复杂,也更费钱,但如果你有时间仔细阅读,它是非常有价值的。
  • Siraj Raval’ 的 youtube 频道是一个很好的地方,可以获得几乎所有相关 ML 主题的高水平概述,观看起来也很有趣。

专业化

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

diagram showing some of the major areas of AI today, source

对于雇主来说,这是一个去粗取精的好方法。ML 是一个巨大的领域。一个人不可能什么都知道。这就是为什么人们专门化并成为专家。如果你不仅能展示出你对 ML/Deep Learning 总体上有着扎实的理解,而且在某个领域有专长,你将对潜在雇主变得更有价值。但是注意不要把自己放在一个盒子里,你不必现在就决定你的整个职业道路,相反,试着找到一个真正让你兴奋的领域,了解更多,如果可以的话,也许可以做几个项目。这里有一些专业化的例子。

  • 计算机视觉: CNN,分割,标记,描述,物体检测
  • **经常性网络:**时间序列数据如股票市场和一个视频,LSTM 细胞
  • **强化学习:**教代理学习技能,比如玩视频游戏或驾驶
  • **自然语言处理:**聊天机器人、情感分析、内容生成、内容摘要
  • **生成对抗网络:**学习生成内容,如图像、3D 模型、学习策略、音频
  • 元学习:学会学习
  • **一次性学习:**用很少的数据学习
  • **神经网络可视化和调试:**巨大的研究领域,神经网络仍然是一个黑匣子,我们很难可视化它们,也很难理解为什么它们在损坏时不工作。

大学

这是很多人不同意的一点。成为软件开发人员的道路正在改变。大学不再像以前那样是进入这个行业的硬性要求。谷歌和苹果等科技巨头甚至已经开始放弃对学士学位的要求。这是因为创新型公司认识到,他们希望与之共事的人充满激情,自我驱动,渴望采取主动。所有这些都不需要明确的学位,有了互联网上的大量资源,你可以在家自学任何东西,只要你愿意付出努力。

话虽如此,在大学里表现良好是一个很大的奖励,不应该被低估。因此,我的建议是,如果你的情况不允许你上大学,不要纠结于此,还有许多其他途径向你敞开。如果你在大学,那么你需要粉碎它。

如果你执行了这篇文章中提到的所有其他事情,你很有可能在大学成绩不好的情况下找到一份工作。然而,如果你得了 1.1 分(根据爱尔兰教育系统,这是最好的成绩)或高 GPA,并且有一个围绕前面提到的主题的令人敬畏的最后一年项目(FYP),你将处于一个更好的位置。所以这是你需要关注的事情。抱着“我要碾压这个”的攻击性心态进大学。每节课都去,记笔记,早点完成作业,好好学习,拿成绩。

结论

现在是进入人工智能行业的最好时机。就像互联网的出现一样,人工智能将影响所有领域的所有业务,使其成为任何组织最受追捧的工具之一。目前,我们仍处于人工智能能力的初级阶段。这意味着该行业正处于巨大的创新、发现和不确定状态。专家很少,没有人知道所有的答案。人工智能社区处于不断学习和完善的状态。所以,投入时间,尽可能多的学习,你很快就会发现你能多快提高你的技能。这不是一件容易的事,需要时间。所以要有耐心,坚持不懈,保持专注。

如何获得远程机器学习工作

原文:https://towardsdatascience.com/how-to-get-a-remote-machine-learning-job-aa378d9879f9?source=collection_archive---------2-----------------------

如今,大部分软件公司都提供远程工作。然而,这大多忽略了机器学习职位:大多数仍然局限于办公室。那么,进入远程机器学习的最佳方式是什么呢?

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

这篇内容首先在 RemoteML 上发布——远程机器学习的全球社区。

ML 为什么不一样?

是什么让机器学习不同于其他通常提供远程工作的工程职位?嗯,最大的机器学习雇主通常是大型科技公司,他们正在建设大型办公园区,很少提供远程工作。

初创公司通常喜欢提供远程工作,通常外包机器学习或使用公共 API 和服务。然而,这在不久的将来可能会改变。机器学习变得越来越实用,用不了多久(远程优先)初创公司也会开始招聘机器学习人员。

准备

远程工作听起来很棒。但是你确定你适合吗?在开始申请之前,问自己这些问题:

  • 你是否生活在一个可以安静工作、不受干扰、有稳定电力/互联网连接的环境中?
  • 工作时,你需要帮助或询问问题的频率如何?你是自导自演吗?在远程环境中,您必须依赖异步通信。如果你不停地检查每个人,没人会有效率。你需要能够独立工作。
  • 你的社交生活准备好了吗?你不会和你的同事有很多社交互动。所以你需要一个社会环境来帮助你不变得孤独。

寻找职位和申请

你认为你已经准备好接受机器学习领域的远程职位了吗?你需要找到一些远程机器学习的位置。这样做的一些好地方有 AngelList (针对初创公司) RemoteML (针对远程机器学习职位) RemoteOKwe work Remote。设置职位通知,并始终阅读职位描述:有时远程职位只适用于某些时区或国家。

如前所述,能够独立工作在远程工作中非常非常重要,所以在申请职位时,向他们展示你以前是如何独立工作的。可以说,在实现远程工作的过程中,预期、沟通和性格比你实际的硬技能更重要。

另外请记住:选择远程工作时,您是在与全球人才库竞争!对你所做的事情充满信心,你会很快找到你梦想的职位。

如何让临床人工智能技术获得监管机构的批准

原文:https://towardsdatascience.com/how-to-get-clinical-ai-tech-approved-by-regulators-fa16dfa1983b?source=collection_archive---------0-----------------------

本文于 2019 年 6 月更新,以适应医疗器械法规即将到来的变化

医学中的人工智能正在迅速发展,除了一个讨厌的障碍,几乎没有什么可以阻止它。无论你是一家三人创业的小公司,还是一家价值数十亿美元的国际企业集团,你都必须通过医疗器械监管的试金石测试。没有回避它,没有躲避它,所以你不妨拥抱它。还记得儿童故事书《我们要去猎熊吗?…

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

与医疗保健产品相关的法规比人工智能存在的时间要长得多。这一切开始于 20 世纪 60 年代,当时人们开始意识到(可悲的是)沙利度胺会严重损害未出生的婴儿。因此,药品开始要求上市前证据和质量控制监管,以避免这种灾难性事件再次发生。在药品之后不久,医疗器械也被纳入监管范围。

医疗器械法规传统上适用于物理产品(例如手术器械)和运行物理临床机器的软件(心电图机内的软件)。制定这些法规的原因很简单——患者安全。监管机构只想知道一件事——您的产品是否能安全有效地用于预期目的?医学上(或任何地方)没有什么是 100%完美的,所以你必须提供证据,证明你已经尽了最大努力来确保使用该设备的好处大于任何风险,并且任何未减轻的风险都是可以接受的。

试图以极快的速度创新固然很好,但监管者并不在乎这些。他们希望你停下来,测试,验证并证明你不会“造成伤害”。请记住,你现在是在医疗保健行业,而不是某个应用商店或研究实验室,你和任何医生一样对病人负有责任。你不会希望你的技术被认为和沙利度胺一样危险吧?

你不仅要使用可验证的数据真实准确地描述设备的性能和功能,还必须以你的营销团队能够传达的方式进行描述,而不要过度宣传、错误销售或错误品牌。一个巨大的错误是告诉监管者一件事,然后又卖另一件…

听说过 Theranos 吗?这家美国实验室公司告诉 FDA,他们的血液测试只能检测极少量样本的结果,但随后被发现有多达三分之一的内部质量控制检查失败,影响了凝血测试结果的患者护理,并可能导致中风和心脏病发作,从而损失了近 90 亿美元的价值。这里要学习的一课——对你的产品能做什么要真实和诚实!

在本文中,我将介绍根据最新版本的医疗器械法规,使您的产品获准进入欧洲市场所需的最新步骤,并获得圣杯式的认证标志——CE 标志。

你可能想知道一个学术放射学家是如何知道这些东西的?2016 年,我在英国数字健康技术初创公司( Babylon Health )负责监管事务,并成功为一个人工智能支持的医疗移动应用程序获得了世界上第一个 CE 标志(I 级),现在是 Kheiron Medical 的临床总监,这是第一家获得放射学深度学习软件 CE 标志(IIa 级)的英国公司。

你可以这样做…但是我警告你,这不是为容易被吓住的人准备的…

什么是 CE 标志?

CE 是法语短语“Conformité Européene”的首字母缩写。希望这不需要翻译…

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

CE 标志不仅适用于医疗器械,在欧洲几乎任何产品上都可以找到。只要看一下你附近的一个物体,在小字的某个地方会有一个 CE 标志。该标志表示该产品符合相关指令的基本要求,并且可以合法地在整个欧洲成员国自由投放市场。就医疗器械而言,产品必须符合欧盟委员会制定的欧盟医疗器械法规 2017/745 (MDR)的要求。这些法规是强制性和规范性的,将于 2020 年 5 月取代现有的医疗器械指令(MDD 或 MEDDEVs)。它们也是治疗失眠的好方法,但这不是它们的预期用途。

预期用途

无论你的算法或 AI 产品做什么,你都需要仔细清晰地定义它。这种描述在监管术语中被称为设备的“预期用途”,它是你进入监管行业迷宫之旅的基石。定义一个目的不仅能让监管者清楚地了解你的设备,还能帮助你的团队牢牢记住他们在做什么。

预期用途通常分为几个部分:

名称、型号、设备描述、安全分类、操作原理、预期用途、确切的医疗适应症、医疗条件的阶段和严重程度、预期使用环境、预期患者人群(包括排除)、预期用户、使用风险、预期结果限制和正常使用条件。

明确设备的预期用途是获得监管机构批准的第一步,因此确保正确非常重要。你必须准确描述你的设备能做什么,而不是它能做什么。(如果你不确定它的预期用途是什么——去你的浴室橱柜,拿出一包药片,并阅读里面那张纸的开头。这是您需要生成的最低限度的文档级别)。一旦你定义了你的预期用途,就是这样。没有回头路可走——监管机构将根据你的描述对你的产品进行分类和评判。对你预期用途的任何改变都意味着你必须重新开始整个过程。

找出你的设备的类别

在欧洲,医疗器械的分类是由 MDR 定义的(见下面分类的最新变化)。在美国,FDA 规定了设备类别。根据对患者的潜在风险,分类分为三种主要类型:

I 级—低风险,如听诊器、温度计或助残工具。

II 级——中等风险在欧洲也分为 IIa 级和 IIb 级,后者风险更大,如与人体直接接触的隐形眼镜。

III 级—高风险,如手术器械或植入式除颤器。

这些等级(I、IIa、IIb、III)决定了您需要走四条合格评定路线中的哪一条。

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

不言而喻,你的设备风险越大,它的故障就越具有侵入性或危险性,它的副作用就越多,它的级别就越高。类似地,所需的监管审查水平随着设备类别的增加而增加。

一般来说,根据当前的规则,支持医生决策的人工智能算法被称为临床决策支持软件(CDS),并被视为第二类。它是 IIa 类还是 b 类取决于您的算法的预期用途。我希望我能给你一个精确的分类,到底哪个算法函数属于哪个类,但不幸的是,这不是非黑即白的。然而,根据经验,其输出能够被人重写的 CDS 装置通常是 IIa,而那些更自主的是 IIb。

如果你不确定,你应该和监管者或监管顾问展开对话。不要浪费时间去申请一个不正确的课程!

二级符合性

一旦您确定了您的预期用途和设备类别,您需要指定一个认证机构(NB)。这是一个独立的外部组织,它来到你的工作场所,审查你如何制造和测试你的产品。指定机构的原因是,欧盟委员会没有时间或资源自己完成这项工作(并且不信任您自己完成这项工作,除非您的设备属于 I 类),因此他们转而依赖第三方,而第三方又受当地政府机构的监管。例如,在英国,负责监管医疗器械法规的政府机构是执行 MDR 的药品和医疗保健产品监管局(MHRA)。他们要求开发人员使用经批准的 NB,以使 CE 标志有效。

对于 IIa 类医疗器械,您可以选择 NB 按照以下四种规定的合规途径之一对您进行审核:

  • 每个产品的检查和测试;
  • 生产质量保证体系的审核;
  • 最终检验和测试的审计;或者
  • 全面质量保证体系的审计。

对于 IIb 类,你需要一个 NB 来执行第四个选项,前三个中的任何一个。

在实践中,临床人工智能开发人员不会想走批量测试路线或最终检查和测试(选项 1 和 3),因为这意味着算法的每一次更新都需要经过反复的临床验证。这将是极其缓慢和昂贵的。相反,人工智能开发人员应该选择质量保证路线,因为这是一个衡量你在确保产品开发过程中严格质量保证的标准。

质量管理体系简介

质量管理体系是一系列文件和标准操作程序(sop ),详细说明贵公司的开发程序、风险管理和测试。不出所料,这听起来很无聊,但如果你想卖掉你的算法,这绝对是至关重要的。对你来说幸运的是,有一个固定的标准可以遵循,即所谓的【ISO13485:2016】。这也是治疗失眠的另一个好方法。幸运的是,即使是监管行业的人也意识到了这一点,甚至有人把它翻译成简单的英语,让它稍微容易理解一些。

ISO13485 有许多不适用于人工智能系统,如消毒、包装和环境危害,但其中许多仍然对您的 ce 标志之旅直接至关重要,并且基本上是医疗设备 CE 标志所需的唯一标准。另一方面,许多 ISO13485 已经被其他指令覆盖,如质量管理(【ISO9001】,你的组织可能已经有了)、风险管理(,同上)和信息安全管理(【ISO27001】,双重同上)。是的,几乎所有事情都有一个标准,所以不要认为你可以偷工减料!如果你的人工智能正在使用实时患者数据并以任何方式存储它,你很可能需要后者。

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

A typical QMS will contain all of the above… and much more! Get expert advice if you don’t know where to start!

我的建议是尽可能早地开始按照这些标准工作,因为仅仅为了进入市场而改变你的开发过程是不会成功的。审核员希望看到完整的质量管理体系,并有证据证明你在审核开始前至少已经使用了三个月。如果你有困难,你可以把一些工作外包给无数以此为生的第三方公司。

与认证机构合作,您必须通过两阶段审核才能获得 ISO13485 认证。然而,要获得 CE 标志还需要做更多的事情!

技术文件

除了通过质量管理测试之外,您还必须通过额外的审核才能获得 CE 标志。这将考虑到你的 13485 认证,但也要求你出示所谓的技术文件。该文件是一份电子或硬拷贝档案,不仅与您的 QMS 相关联,还包含几个关键因素,使您能够证明您符合 MDR 中规定的基本要求。

使用说明;如您的手册/支持材料或软件本身所示

标签;盒子和包装上的标签。这也是一个好主意,有营销文案的例子,所以你知道你的营销将是光明正大的。

设计规范,如可接受的功能和为确保设备按预期工作而采取的措施。

系统架构;这是设计档案的形式。

符合性声明;公司负责人签署的声明,基本上说一切都符合要求。

最后…

临床评估报告(CER)

到目前为止,你们当中精明的(并且仍然清醒的)人会注意到还没有提到临床表现数据。你以为你逃脱了,是吗?嗯,抱歉,你还需要通过进行临床研究来证明你的人工智能有效。

CER 是您的设备在开发、上市前测试和上市后性能期间进行的所有临床测试的档案。

你不需要证明你的设备 100%准确地工作——在医学中没有什么是需要证明的。相反,你必须证明你已经按照你的预期用途在正确的临床环境下对你的设备进行了适当的测试,并且可以用证据支持任何准确性的声明。例如,市场上的化疗药物只能治愈 5%的患者。这很好,只要这是在临床试验中证明的,并在任何标签或营销中明确说明。必须明确风险/效益比率,该比率在很大程度上取决于正在接受治疗/诊断的疾病的严重程度以及任何临床研究的结果。

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

您的 CER 将包括四个关键部分:

  1. 文献综述—您需要确定您的设备的最先进水平,任何同等设备的性能和安全指标,并对您的设备的潜在优势和风险有一个关键的了解。
  2. 临床研究计划——这是一份正式的研究大纲,通常由独立的研究伦理委员会(REC)批准,该委员会既遵守良好临床实践(GCP)原则,也遵守 ISO 14155 标准。是的,另一个 ISO 标准供你阅读和入睡!
  3. 临床调查结果和分析——包括阳性和阴性结果。这通常是以可发表论文的形式,但你不一定需要在杂志上发表结果,只需准备好供专家分析。如果你不确定要运行什么样的统计分析,我会在这里支持你——或者你可以从 FDA 查看一些好的建议。
  4. 最终报告——总结文献综述的风险和益处,以及关于您的设备的临床性能及其局限性的结论。

如果你的公司缺乏临床研究的专业知识,你可以和一个被认可的学术机构,合同研究组织(CRO)合作,或者在内部雇佣相关的专家。在大多数情况下,认证机构希望看到真实世界的证据(RWE),因此这意味着您需要对真实的临床数据或患者进行试验,因此在这方面,拥有良好的临床合作伙伴关系至关重要。也不要低估一项适当的临床研究需要多长时间——记住,大多数研究从计划到完成需要一年或更长时间!

那么是什么改变了呢?

新法规于 2017 年 5 月生效,过渡期为 3 年,这意味着对于那些希望保持合规并进入市场的人来说,最后期限是 2020 年 5 月。MDD 和 MDR 之间的主要变化如下(非详尽列表):

  • 医疗器械的定义已经扩大到包括不受 MDD 监管的非医疗和美容器械。例如吸脂设备。因此,到 2020 年 5 月,你可能会看到吸脂服务的减少…
  • 被通知机构的严格监督被通知机构更严格的审查(其影响之一是一些国家统计局最近已经放弃提供这些服务,例如 LRQA )。
  • 在新的 MDR 中,“安全”一词出现了 290 次,而 MDD 只用了 40 次。你想读什么就读什么…
  • 附录 I 基本要求现在是“一般安全和性能要求”(GSPR),它确定了组织必须针对大多数遗留设备解决并重新认证的新条件(即那些在 MDD 下具有 ce 标志的设备需要更新到新的 MDR)。
  • 根据新规定,大多数设备制造商需要更新临床数据、技术文件和标签。
  • 可植入器械和 III 类器械需要更严格的临床证据。
  • 将实施唯一设备识别(UDI ),这使得随着时间的推移跟踪设备版本变得更加容易。
  • 根据更高的风险对设备进行重新分类,这意味着许多聊天机器人将被移至 IIa 类,一些放射人工智能软件将被移至 IIb 类。
  • 确定公司内部法规遵从性的“负责人”。我和你一样惊讶地发现这在以前并不是一项要求。
  • 更加重视警戒报告、上市后临床随访(PMCF)和经前综合症收集数据。记住,CE 标志是终身的,不仅仅是圣诞节的!

唷——就是它

一旦你有了一个有效的质量管理体系,ISO 13485 认证和一份完整的临床评估报告,你就为你的最终 ce 认证审核做好了准备!

然而,它并不止于此…

一旦获得认证,您需要保持您的 ISO 认证,并定期重新审核和重新测试您的设备的性能。拥有一个良好的售后市场监督(PMS)系统将有助于你保持 CER 更新,正确使用 QMS 将确保你在事情的顶部。雇佣一个质量经理是个好主意,因为你需要有人来确保你在竞争中领先——记住——监管者可以随时来看你的文件!

如果您想在欧洲之外的其他地方推出,有一个新的流程称为医疗器械单一审核计划( MDSAP ),其中包括一个进一步的审核,让您获得澳大利亚、巴西、日本和加拿大、美国认可的质量管理体系,并很可能在不久的将来成为医疗器械的国际标准。并非所有的认证机构都有资格进行 MDSAP 审计,所以一定要先询问。

最后……进入美国市场涉及到众所周知的严格的美国食品药品监督管理局( FDA ),它有相似但稍微更严格和详细的程序要通过。但是我已经告诉你够多了,所以我现在就把它留在这里!

监管机构,上马!

如果你和我一样对人工智能在医学成像领域的未来感到兴奋,并想讨论这些想法,请联系我们。我在推特@drhughharvey

如果你喜欢这篇文章,点击推荐并分享它会很有帮助。

关于作者:

Harvey 博士是一名委员会认证的放射科医生和临床学者,在英国国民医疗服务体系和欧洲领先的癌症研究机构 ICR 接受过培训,并两次获得年度科学作家奖。他曾在 Babylon Health 工作,领导监管事务团队,在人工智能支持的分诊服务中获得了世界第一的 CE 标记,现在是顾问放射科医生,皇家放射学家学会信息学和人工智能委员会成员,以及人工智能初创公司的临床总监,包括 Kheiron Medical。

如何让 fbprophet 在 AWS Lambda 上工作

原文:https://towardsdatascience.com/how-to-get-fbprophet-work-on-aws-lambda-c3a33a081aaf?source=collection_archive---------11-----------------------

解决 fbprophet 无服务器部署的包大小问题

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

Adi Goldstein / Unsplash

我假设你正在阅读这篇文章,因为你正在寻找在 AWS Lambda 上使用令人敬畏的 fbprophet(脸书开源预测)库的方法,并且你已经熟悉了完成它的各种问题。我将使用 python 3.6 示例,但是这种方法适用于其他运行时以及其他大型 ML 库。事不宜迟:

  1. 本地安装 Docker。另一种方法是运行 EC2 实例,并在实例和本地机器之间复制文件,这对我来说更复杂,也更不可靠。
  2. 使用您的代码在工作目录中的相关 lambda 映像上运行一个 shell(看一下 lambci ),它应该在 Lambda 上运行(它有 Lambda 处理程序):
docker run --rm -it -v “$PWD”:/var/task lambci/lambda:build-python3.6 bash

关于这里使用的命令的解释,请点击 Docker docs 或这里

3.创建虚拟环境并安装相关软件包:

python3 -m venv venv
. venv/bin/activate
pip install --upgrade pip
pip install fbprophet --no-cache

4.你可以检查你的代码是否工作正常:python lambda_handler.py

5.将 venv 的大小减少到 250Mb 以下:

pip uninstall -y matplolibfind "$VIRTUAL_ENV/lib/python3.6/site-packages" -name "test" | xargs rm -rffind "$VIRTUAL_ENV/lib/python3.6/site-packages" -name "tests" | xargs rm -rfrm -rf "$VIRTUAL_ENV/lib/python3.6/site-packages/pystan/stan/src"rm -rf "$VIRTUAL_ENV/lib/python3.6/site-packages/pystan/stan/lib/stan_math/lib"echo "venv size $(du -sh $VIRTUAL_ENV | cut -f1)"

这里发生的事情是,您正在摆脱 matplotlib(如果您不需要绘图)、测试和 pystan 源代码(软件包中最重的部分)。最后一个命令显示 venv 的大小,应该低于 250Mb。

6.确保你的代码在清理后仍然工作:python lambda_handler.py

7.创建一个. zip 文件上传到 Lambda:

pushd $VIRTUAL_ENV/lib/python3.6/site-packages/zip -r -9 -q /var/task/name_of_your_zip.zip *popdzip -9r name_of_your_zip.zip name_of_your_code_folder/zip -9 name_of_your_zip.zip lambda_handler.py

8.现在您的工作目录中有了一个. zip 文件,可以用于 Lambda。你现在可以停止/退出 Docker 了——这个压缩文件仍然在你的文件夹里。

其他资源:

关于为 Lambda 准备 ML 库的精彩帖子:https://medium . com/@ Mae Bert/machine-learning-on-AWS-Lambda-5dc 57127 aee 1

为 Lambda 准备 fbprophet 的讨论:https://gist . github . com/CarstVaartjes/77 DBE 8249d 171 e 592 BD 17847 f 7009272

缩小 scipy 的大小:https://gist . github . com/wrwrwr/4a 38 a 17113 e 3845 f 3385 e 9388 effc 064

如何进入数据科学领域

原文:https://towardsdatascience.com/how-to-get-into-data-science-ca61930360c8?source=collection_archive---------9-----------------------

几个朋友发现我的故事对他们自己的求职和进入数据科学很有用。我想分享我的故事,让更多人受益。我不仅想分享我是如何在没有工作的情况下收拾行李搬到旧金山的,还想分享我对数据科学的热情,以及为什么我认为这是目前最好的技术领域。

关于我自己的一点点。2017 年 4 月,我决定搬到旧金山,没有工作,但有几个面试在排队。这就是旧金山湾区的伟大之处——你周围的每个人都愿意提供帮助,也更愿意了解你的故事。你只需要问:)我在 Fit 3D 公司担任数据科学家,这是一家专注于健身和健康的 3D 人体扫描公司。找工作并不容易——我使用了所有的在线门户网站(Angellist、Linkedin、Kaggle 等。)终于收到 Fit3D 的 offer 了。

我的工作:你有多胖?

自从加入 Fit3D 以来,我已经参与了各种项目,包括使用人体测量数据预测身体脂肪成分,使用图像分类验证扫描,以及使用机器学习来建立可被消费者用作产品的预测模型。使用回归和统计概念,我们能够建立一种算法,该算法随着时间的推移不断改进,为用户提供最准确的体脂值。事实上,我开发的一个功能最终被现实世界中的客户所使用,这是所有这些中最有价值的部分。

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

Check out Fit3D: https://www.fit3d.com/solutions/

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

Complete blog post: http://hd2i.org/blog/2018/03/07/fit3d-training-set-update.html

上图显示了随着 Fit3D 积累了更多的身体数据,增加了我们的数据集,以及我对身体脂肪算法进行了改进,RMSE(均方根误差)随着时间的推移而减少。较低的 RMSE 意味着残差中的误差幅度较低(与样本均值的偏差,例如:DEXA 机器上的观察值)。

数据科学增长

最棒的是,数据科学行业一直在快速发展,这使得找到更多与你的特定技术经验相关的职位变得很容易。数据科学行业的增长是有意义的。所有其他行业和公司都可以从使用数据进行数据分析和预测中受益。Fit3D 使用数据为人体提供测量/健身解决方案,谷歌和苹果都在其所有产品中使用机器学习来改善人工智能功能、客户参与、语音识别和计算机视觉,航空公司使用客户数据来波动机票价格。

狩猎

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

Percentage growth per year in DS jobs

到了找工作的时候,我在研究生院的研究工作中是一名兼职数据科学家,但缺乏成为全职数据科学家的专业技能。在电气工程项目期间,我很幸运地被拉进了数据科学和机器学习项目。在哥伦比亚大学的两年里,电气工程是我的必修课,但机器学习是我的主要关注和兴趣。毕业后,我决定花几个月的时间,通过 Udemy(我强烈推荐任何在特定领域寻找工作的人)等在线资源上的编程课程,严格学习机器学习,同时练习我的编程技能。从我的经验来看,数据科学领域有三个关键领域(高度重叠)——分析、机器学习和编程,你越早决定要从事哪一个或两者的结合,找工作就越容易。成功找工作的关键是找到合适的机会,帮助你最好地利用技能,只有首先选择你想要学习的技能,你才能做到这一点。这一点非常重要,因为这将是你在工作中大部分时间要做的事情。

无论你属于光谱的哪个领域,R/Python 库如 caret 和 scikit-learn 都是最好的开始方式,机器学习概述(不是很必要),基本(必要)和高级统计概念很重要。计算机科学中级和高级基础更多的是软件开发的角色。挑选数据集和从事预测/分析项目是练习这些技能的最佳方式。我建议使用 hackhive,这是一个非常容易使用的在线平台,可以向招聘人员展示你的项目(下面是我的项目的链接),在这里你还可以与具有相似技能和兴趣的开发人员联系。如果你没有技术背景,也没有研究生学位,投资一个新兵训练营是个不错的主意。有一些非常有竞争力的训练营有奖学金,可以让你免费参加训练营,比如数据孵化器。我进入了数据孵化器奖学金的最后一轮,如果我能走到那一步,你也能。

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

Hackhive Profile and Projects UI

带有机器学习的 R 和 Python 课程是最便宜的,而且在 Udemy 上非常有吸引力。任何关于统计学的书都可以。通常,Hastie 的《统计学习元素》是很好地介绍统计学和机器学习背后的数学的最佳书籍。如果你觉得你已经很好地掌握了上面的概念和技巧,在线博客和关于面试的一般文章也非常有用。为了提高你的编程技能,破解编码面试是你最好的选择。你可以通过谷歌找到很多其他资源,但我提到的是我用过的。

数据真的让我兴奋,因为它真的是现在和未来。通过一个简单的散点图和几个字节的数据,你可以了解任何主题或行业的很多信息。我能够从 lending club 快速积累一个数据集,其中包含客户银行贷款和违约率的信息,并建立一个客户贷款违约分类器。一旦你真正开始详细探索一个主题,它会变得非常复杂和有趣,这就是数据科学的全部乐趣。

hack hive:https://www.thehackhive.com/profile/kobe2792

LinkedIn(随意伸手):【https://www.linkedin.com/in/rikinmathur/T2

Instagram(关注我,因为我想多去旅行):【instagram.com/rikinmathur

如何在你的博客上获得更多赞(1/2)

原文:https://towardsdatascience.com/how-to-get-more-likes-on-your-blogs-1-2-f5a564c29d27?source=collection_archive---------5-----------------------

使用数据分析揭开媒体博客上掌声的神秘面纱

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

作为一个业余博主,我总是想知道是什么让一个好的博客变得“好”。重要的是内容,还是我们也必须关注其他方面?为了解开这个谜,我使用了我能想到的唯一工具——数据!

这是我和 Neerja Doshi 写的两篇博客中的第一篇,旨在了解影响媒体博客点赞/鼓掌的因素。第一部分包括网页抓取、特征提取和探索性数据分析。在的第二篇博客中,我们将应用包括一些机器学习算法在内的数据科学技术来确定特征的重要性,并有望尝试预测掌声。

免责声明:本博客的目的是出于好奇,应用数据科学获得有用的见解。我们绝不是在贬低博客实际内容的重要性。这是也将永远是决定一个博客质量的最重要的因素。此外,“鼓掌”是决定一个博客的有用性或质量的指标之一。还可以有其他指标,如“浏览量”。然而,我们只用“拍手”作为指标。

方法

我们用 python 构建了一个 web-scraper(谢谢,美丽的汤&硒!)获得了大约 600 篇博文。为了保持一致性,我们只抓取与数据科学和人工智能相关的博客。我不打算在这里写 python 脚本(我们谦卑地试图保持博客的整洁)。但是特别好奇的人可以去这个 GitHub 链接上找到它。

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

Raw Data Scrapped from Blogs

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

特征工程

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

***#Title***
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()data = pd.DataFrame()
for i in range(data_scrapped.shape[0]):
    data.loc[i, "title_length"] = len(data_scrapped.loc[i, "title"])
    data.loc[i, "title_emot_quotient"] =  abs(sid.polarity_scores(data_scrapped.loc[i, "title"])['compound'])***#Body***data.loc[i, "ct_image"] = len(data_scrapped.loc[i, "images"])
    text =  " ".join(data_scrapped.loc[i, "para"] +      data_scrapped.loc[i, "bullets"]).split()
    data.loc[i, "ct_words"] = len(text)
    data.loc[i,'read_time'] = int(data_scrapped.loc[i,'read_time'])***#Additional***
    data.loc[i, "days_passed"] = (datetime.now() -     data_scrapped.loc[i,'datePublished'] ).days
    data.loc[i, "featured_in_tds"] = 'Towards Data Science' in data_scrapped.loc[i,'tags']
   data.loc[i, "ct_tags"] = len(data_scrapped.loc[i, "tags"]

数据汇总

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

形象化

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

Scatter plot of Claps vs Features

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

片段与特征的相关图

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

Correlation Plot

最常用的词语

from wordcloud import WordCloud, STOPWORDS
from nltk.corpus import stopwords
stop = STOPWORDS.union(set(stopwords.words('english')))
wordcloud = WordCloud(relative_scaling = 1.0, stopwords = stop, width=1500, height=800).generate(text)
plt.figure(figsize=(18, 16))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

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

一些有趣的观察

  1. 与中值相比,鼓掌次数的平均值要高得多。这表明,大多数博客获得的掌声数量较低,并且分布向右倾斜
  2. 大多数标题在情感商数方面是中性的,在掌声和标题的情感内容值之间没有明显的趋势
  3. 阅读时间、字数和图片数量与鼓掌次数正相关,这是我们通常所期望的(越长的博客获得越多的喜欢)。此外,words_count/img_count 具有负相关性,因为图像比文本更能吸引注意力。
  4. 从上面的图表可以清楚地看出,标签数量越多的博客获得的掌声越多。所以下次别忘了加标签。
  5. 标题的平均长度是 6-7 个单词。然而,具有 10 个单词的标题具有最高的平均鼓掌次数(异常值被移除以创建下图)。

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

6.拍击次数随着天数的增加而增加,直到达到某个值。从图中可以看出,150 天后,days_passed 并不重要,因为 claps 已经饱和。

7.一个博客的平均阅读时间是 6-7 分钟。然而,长度为 11 分钟的博客拥有最高的平均鼓掌次数(异常值被删除以创建下图)。

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

我希望你喜欢读它!更多有趣的观察,请阅读第二篇博客。对于探索性分析,我们只使用了 600 篇博客,但是对于采用机器学习技术,我们使用了更大的数据集——4000 篇博客。让我们看看这些推论中有多少仍然成立。

第二篇博客的链接可以在这里 找到

领英:www.linkedin.com/in/alvira-swalin

资源:

  1. 网络报废的灵感来自于特伦斯·帕尔在 USF 的数据采集讲座
  2. https://stack overflow . com/questions/21006940/how-to-load-all-entries-in-a-infinite-scroll-once-to-parse-the-html-in-pytho

如何在你的博客上获得更多赞(2/2)

原文:https://towardsdatascience.com/how-to-get-more-likes-on-your-blogs-2-2-f8ef0be21771?source=collection_archive---------7-----------------------

估算你得到的掌声,数据科学的方式

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

想知道如何让你的故事更有趋势吗??是标题、图片、引语还是内容让你赢得更多掌声?在我和阿尔维拉·斯瓦林的这个系列中,我们试图探索一个博客的特征和它获得的点击量之间的关系。第 1 部分,讲述了特征提取和初步探索性数据分析(EDA),而在第 2 部分,我们建立模型来预测一个博客可以获得的掌声。

数据

第 1 部分中的 EDA 基于 600 个数据科学博客,但是为了进一步分析,我使用了大约 4000 个中型博客。为了内容和受众的一致性,我们从数据科学、人工智能、技术和编程类别中挑选了这些博客。我们的功能包括博客的长度,图片/文字,标签数量,标题的情感分数,博客发表以来的持续时间和追随者的数量。从初步的 EDA 中,我们可以看到 claps 与阅读时间和标签数量成正相关。更多的标签似乎能获得更多的掌声,而标题的情感似乎对掌声没有太大的影响。

方法学

为了进一步研究这个问题,我们首先尝试先将这个问题视为回归,然后再进行分类。正如所料,回归没有做得很好,因为预测和变化的范围很大。因此,我们决定对这些数据进行分类处理,并将进一步讨论这种方法。

看看我们的初步分析是否适用于更广泛的博客——

  • 3 标签分类,看看一个博客是否得到低,中或高的掌声
  • 20 标签分类获得更精细的预测

特色工程

总之,我包含了 24 个特征,包括直接提取的特征以及与内容、作者和日期相关的特征。

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

基于标签的预处理

拍手的范围从 1 到 62,000,标准偏差为 2.8k!这是一个很大的预测范围,所以为了处理这种变化,我们在第 90 百分位截取数据。

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

Before and after clipping the data

3 标签分类

为此,我根据鼓掌次数将博客分为低、中、高三个等级。

  • 低:< 150 claps → corresponds to the 45th %ile
  • Medium: 150–750 claps → corresponds to the 85th %ile
  • High: > 750 拍手

我在两种方法中尝试的分类器是逻辑回归和随机森林,因为两者都是可解释的。随机森林优于后者,因为它可以捕捉非线性和逻辑回归不能捕捉的特征之间的相互作用。

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

经过一些参数调整,我不会在这里深入讨论,我们得到以下结果—

我们的模型能够比类别 2 相对更准确地预测类别 0 和 1。这是由于在训练数据中跨类的观察分布的不平衡。

20 标签分类

为了将标签转换成类别,这里我根据它们的分布分类了拍手。这确保了观察值均匀地分布到所有类别中(不同于 3 标签方法),并且类别不平衡得到处理。以下是对应于箱的几个范围。

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

与前面的案例一样,我们使用 5 重交叉验证来调整参数,对大约 3300 个博客的训练数据建立了逻辑回归和随机森林模型。

结果和解释

我们在这里使用日志损失作为度量。该模型在预测拍手的 bin 时给出了 2.7 的对数损失。因为我们的类是连续的,所以我们也可以计算平均绝对误差。对于我们的模型,我们得到 MAE = 5.16。

多类分类的测井损失——

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

预测仓给了我们博客能获得的掌声范围。让我们来看看一些实际和预测的范围:

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

虽然有些预测(红色的)完全不准确,但也有一些预测(橙色的)实际上非常接近,但仍然被错误分类。

那么决定你的博客是否会流行的特征是什么呢?
在计算功能重要性时,我们看到的关注者数量的内容质量 t 是更多鼓掌数量的可靠指标,当然,除了博客发表后的天数。图片占博客长度的比例是另一个重要因素。

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

令人惊讶的是,标题的字数和阅读时间似乎不是一个非常关键的因素,这与我们在最初的 EDA 中观察到的情况相矛盾。

更进一步,让我们看几篇博客,试着解释这些因素的影响是积极的还是消极的(以及我们的预测有多接近)。

作为一个例子,我们选取了两个样本博客,分别有大约 760 和 1800 次点击。你可以在这里找到第和第第二的博客。让我们先来看看他们的特点和预测:

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

第一篇博客的预测是 17 次,即 754–1000 次鼓掌(砰!)和 14 秒,即 380-490 拍。这完全超出了 1400–2000 次拍手的实际范围。

要了解为什么我们对第二篇博客的预测如此错误,让我们再来看看那篇博客。对于这个博客来说,内容为王指出了我们模式的一个缺点。我们的模型无法捕捉博客在内容和写作风格方面的吸引力。为此,需要对文章本身进行更多的分析。目前,我们只能根据粉丝数量、图片、情感、篇幅等特征来评判博客。

结束注释

其他可以在博客上完成的工作可以是—

  • 分析博客的目的——是否旨在教育、探索问题、提供问题的解决方案等
  • 计算两个博客之间的相似度,以避免重复/抄袭
  • 根据一个话题能获得多少掌声来决定它的受欢迎程度
  • 如前所述,更多的 NLP 用于确定一个博客有多受欢迎,例如,我们可以检查一个博客是否包含当前的流行语(如加密货币),它是否提供了相关主题的解决方案等。

我希望你喜欢读这篇文章!欢迎任何想法、建议或评论!

领英—https://www.linkedin.com/in/neerja-doshi/

参考

  1. 使用 Python 实现的 Github repo】
  2. 这是一个关于写好博客的非常酷的博客作者昆西·拉森

如何开始学习 NLP

原文:https://towardsdatascience.com/how-to-get-started-in-nlp-6a62aa4eaeff?source=collection_archive---------0-----------------------

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

Dependency parse tree visualized by displaCy

我在某处读到过,如果你不得不回答同一个问题两次,把它变成一篇博客文章可能是个好主意。为了遵守这条规则,也为了给未来的自己节省一些时间,我现在给出了这个问题的标准答案:“我的背景是科学,我对学习 NLP 感兴趣。我从哪里开始?”

在您开始之前,请注意下面的列表实际上只是一个非常一般的起点(并且很可能是不完整的)。为了帮助浏览大量的信息,我在括号中添加了简短的描述和难度估计。建议掌握基本编程技能(例如 Python)。

在线课程

图书馆和开源

  • spaCy ( 网站博客)【Python;新兴开源库,包含奇妙的使用示例、API 文档和演示应用
  • 自然语言工具包(NLTK) ( 网站书籍)【Python;NLP 编程实用入门,主要用于教学]
  • 斯坦福 CoreNLP ( 网站)【Java;高质量的分析工具包]
  • AllenNLP ( 网站)【Python;NLP 研究库建立在 PyTorch 之上
  • fastText ( 网站)[c++;用于文本分类和表示学习的高效库]

活跃的博客

多方面的

DIY 项目和数据集

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

Source: http://gunshowcomic.com/

Nicolas Iderhoff 已经创建了一个公开可用的 NLP 数据集的完整列表。除此之外,我还可以向任何想要尝试的 NLP 新手推荐一些项目:

社交媒体上的 NLP

在推特上联系我***@ melto mene***

如何入门 Kaggle 竞赛和数据科学?或者“如何在没有机器学习或统计的情况下获得一个像样的分数”

原文:https://towardsdatascience.com/how-to-get-started-with-kaggle-competitions-and-datascience-26d27108a444?source=collection_archive---------7-----------------------

这是一个面向初学数据科学和机器学习的程序员(比如我自己)的入门教程。它向人们介绍了 Kaggle 竞赛、Python 中的 Jupyter 笔记本,以及 Pandas 和 NumPy 库。

我展示了在没有任何统计、数据科学或机器学习的情况下,我们如何能够在 Kaggle 的泰坦尼克号竞赛排行榜上名列前三。

0.先决条件— Anaconda、Jupyter 笔记本

我们需要一些编程的基础知识(变量,基本的 Python 语法)。安装您需要的东西的最简单方法是前往 Anaconda 并下载 Python 3.7 GUI 安装包。它将自动安装最常用的库,包括下面我们正在使用的库。

一旦安装了 Anaconda,启动“Anaconda Navigator”启动程序,然后从它启动“Jupyter Notebook”。或者,从命令行输入“ jupyter 笔记本”。

这将打开一个 web 界面,您可以在其中浏览、打开和创建新的“笔记本”(一种 Python 程序,让您以交互方式编写和运行代码、编辑文本和绘制图像,大多数从事数据科学和机器学习的人都在使用它)。本教程就是在这样的笔记本上写的。你可以在我的 GitHub 库上查看完整的笔记本并下载以运行它。

在 Jupyter 笔记本中,您可以编辑单元格,通常是代码或降价。

有许多可用的快捷键,您可以在帮助->键盘快捷键菜单中查看,或者在不编辑单元格时按“h”键查看。

您可以通过按下 Ctrl+Enter 来执行代码单元格内的代码(或者格式化一个 markdown 单元格)。您执行代码并通过按下 Shift+Enter 自动前进到下一个代码。

单击单元格的侧面将其选中,单击其内容或双击单元格开始编辑。按 Escape 键退出编辑模式。

1.首先,参加一个 Kaggle 比赛。

在全球最大的人工智能、机器学习和数据科学在线社区 Kaggle 上创建一个用户账户。

Kaggle 泰坦尼克号幸存者比赛是任何 Kaggle 新人都应该开始的比赛,因为它总是开放的(排行榜定期清理),简单易懂。

从列出泰坦尼克号灾难中幸存或未幸存乘客的样本训练集得知,我们的模型可以基于不包含幸存信息的给定测试数据集来确定测试数据集中的这些乘客是否幸存。

在你参加比赛之后,去数据区,点击“下载全部”,然后将下载的档案文件解压到你想要编写 Jupyter 笔记本程序的子文件夹中。

我在“ MyWork 文件夹下工作,已经将下载的测试和训练数据保存到“ titanic_data 子文件夹下。

2.导入用过的库

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

3.加载培训和测试数据

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

train_raw 和 test_raw 都是 Pandas 的“DataFrame”对象,为操作表格数据、访问任何行、列或单元格提供了有用的方法和变量。

我们通常使用语法 dataframe[“ColumnName”]来访问一个列,但是偶尔,为了简洁起见,我们将使用 dataframe。请改为 ColumnName。

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

数据框的一个很棒的特性是我们可以对它们进行选择。例如,这是幸存的女性乘客名单:

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

请在竞赛数据页面上查看有关数据文件中各列含义的详细信息。

让我们看看存活率是如何与其他数据相关的:

Pandas crosstab 函数可以让您看到一个特性(列)如何与另一个相关联,它显示了一个漂亮的表格,在垂直方向上计算一个特性的值,在水平方向上计算另一个特性的值。

因为我们将熊猫作为 pd 导入(这是最常见的约定),所以我们将这样使用它:

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

在 Pandas 中,我们可以通过它的名称(在我们的 csv 文件中,从第一行开始读取)来寻址一个列(特性)。我们通常会说

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

现在,我们可以根据训练数据文件得出初步结论:

  1. 培训数据中 65%的人是男性(577 人),35%是女性(314 人)
  2. 在所有男性中,约 80%死亡(0.523 / 0.647,又名 468 / 577)
  3. 在所有妇女中,不到 26%的人死亡(81 / 314)
  4. 在所有人中,62%死亡,38%幸存(“所有”栏)

基于以上的见解,我们可以做一些琐碎的尝试来解决问题。

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

现在,我们前往 Kaggle 泰坦尼克号比赛页面,点击选项卡菜单上的“提交预测”按钮。将上面生成的“submission_zeros.csv”文件拖放到“上传文件”区域,然后单击“提交”按钮。

等待计算分数,然后…

我们获得了 0.72727 的准确度分数,这使我们在超过#10000 名竞争对手中排名大约#9000(在撰写本文之日,2018 年 11 月 16 日)。这意味着 1000 多人比我们错得更多——这比最微不足道的答案还要错。

4.首次提交——性别

不如说所有的男人都死了,所有的女人都活了下来?Kaggle 已经在这方面帮助了我们,他们在数据存档中提供了一个 gender_submission.csv 文件。您可以直接上传,或者我们可以在下面的单元格中自己生成一个:

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

我们可以测试我们的版本和从 Kaggle 得到的版本之间的差异

diff-w my _ gender _ submission . CSV gender _ submission . CSV

它们是相同的(除了空格之外,这取决于您的计算机/操作系统)。

将新文件上传到 Kaggle 并测试其得分,我们的得分为 0.76555,在 10000 多名竞争者中排名第 6300 位。

换句话说,近 4000 人(40%)除了上传他们从 Kaggle 得到的默认答案之外,并没有做得更好。

我们的基础教程大概可以到此为止,因为它已经达到了目的,向你展示了很多有用的东西:

  • 如何参加 Kaggle 比赛
  • 如何开始写代码给竞赛一个答案
  • 如何在 csv 文件中加载数据
  • 如何看数据的前 5 行(表头法)
  • 如何使用交叉表命令查看一个要素与另一个要素的关系
  • 如何为解决方案创建新的数据框架并将其保存到 csv 文件中
  • 如何向 Kaggle 提交您的解决方案文件并了解您的分数

但是,我们的无编码“性别解决方案将我们置于最后 40%。我很好奇,用很少的编码或知识,我们是否能在排行榜上爬得更高一点。我们可能需要使用 pandas/numpy 库中的一些方法。

5.调整性别解决方案

我们已经达到了一个合理的分数,声称所有的男性都死了,所有的女性都活了下来。这显然不是 100%的真实。让我们看看是否能找到一些其他可以帮助我们取得更好成绩的唾手可得的果实。

我们可能看过电影,当一艘船正在下沉时,妇女和儿童通常被首先放在船上。

我将添加一个新列,说明乘客是妇女还是儿童(10 岁以下),并将其命名为“MightSurvive”(也用于其他生存标准)

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

那么,这与我们声称只有女性幸存的时候相比如何呢?

在加载训练数据后生成的交叉表中,我们注意到,当我们说只有女性幸存而所有男性都死了时,在总共 891 次中,我们对了 233 次(女性实际幸存)+ 468 次(男性实际死亡)。这大约是正确的 78.6 倍。

在我们目前的情况下,如果我们说只有妇女或儿童幸存,891 次中我们有 252 + 455 次是正确的。这大约是 79.3% —一个小而显著的进步。

现在让我们将这个解决方案上传到 Kaggle,看看它的得分如何。

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

Kaggle 给了我们 0.77033 的分数,这是相当大的成就。在#10100 排行榜中,我们已经上升到了第 5500 名左右,位列前 55%。

如果“有钱人活下来了”呢?

在同一部《泰坦尼克号》电影中,看起来富人通常能活下来(凯特),而穷人却不能。让我们使用现有的工具来检查这些假设。

乘客财富与乘客等级相关(一等比三等好)。让我们用生存来交叉分析乘客等级。

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

基于此,说只有 1 班的人活了下来,其他人都死了,那就对了 891 次中的 136 次(实际 1 班幸存者)+ 469 次(2 班实际非幸存者 97 次+ 3 班实际非幸存者 372 次)。这仅仅是 67%倍,比上面的估计还要差。

所以,现在我们可能不应该关注人工尝试的乘客等级,忽略这个假设。

6.大家庭里的小孩子怎么办?

这可能是轶事,但我可以想象贫穷移民的大家庭努力聚集所有留下的人,因此无法到达救援船。也许他们的父母幸存了下来,但大多数孩子没有。这可能不是一个普遍的事实,但在这种情况下,一些家庭可能会帮助我们获得更好的分数。因此,我想验证大家庭成员更容易死亡的假设。

SibSp(兄弟姐妹和配偶)和 Parch(父母和子女)列包含这些信息。交叉表显示,对于大量同胞来说,它确实与无存活率相关。

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

我们发现至少有 4 个兄弟姐妹的孩子存活的可能性更小(30 个孩子中只有 3 个存活)。

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

同样,至少有 4 个孩子的父母不太可能存活(只有十分之一存活)。

让我们将上述见解添加到我们的可能幸存标准中(到目前为止,该标准仅适用于妇女和儿童)

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

交叉表显示,我们的“可能幸存于”标准将是正确的(248 + 480)/891 = 81.7%倍。这明显比以前好,比性别解决方案提高了近 3%。

7.构建我们的解决方案并将其发送给 Kaggle

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

现在我们正在谈话!我们从 Kaggle 得到的分数是 0.78468,明显比以前好。

这使我们在排行榜上排名第 3200 位左右——我们现在排名前 32%,没有使用机器学习或统计数据。

我们的教程到此结束。分数的进一步提高和洞察力的提高可能需要统计、可视化和机器学习。但是今天我们已经做得足够好了。

恭喜你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值