TowardsDataScience 博客中文翻译 2019(四百四十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用 TensorFlow 2.0 的简单 BERT

原文:https://towardsdatascience.com/simple-bert-using-tensorflow-2-0-132cb19e9b22?source=collection_archive---------4-----------------------

在 15 行代码中使用 BERT 和 TensorFlow Hub。最后更新时间:2020 年 11 月 15 日。

这个故事展示了一个使用 TensorFlow 2.0 嵌入 BERT [1]的简单例子。最近发布了 TensorFlow 2.0,该模块旨在使用基于高级 Keras API 的简单易用的模型。伯特之前的用法在的长篇笔记本中有描述,它实现了一个电影评论预测。在这个故事中,我们将看到一个使用 Keras 和最新的 TensorFlowTensorFlow Hub 模块的简单 BERT 嵌入生成器。

Google Colab 上新的更新版本在这里(2020–11–15)。老版本在这里有。

我之前的文章使用了[bert-embedding](https://pypi.org/project/bert-embedding/) 模块,使用预先训练的无案例 BERT 基本模型生成句子级和标记级嵌入。这里,我们将只通过几个步骤来实现这个模块的用法。

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

TensorFlow 2.0

更新 2020 年 11 月 15 日:HUB 上的新模型版本 v3

对于 TensorFlow Hub 上的新模型版本 v3,它们包括一个预处理器模型来实现本故事中描述的步骤。Hub 版本还更改为使用字典输入和输出变量,因此如果您想以原始故事中描述的方式实现,请在使用较新的模型版本时考虑到这一点。

有了新版本,我们有 3 个步骤要遵循:1)从 TF、TF-Hub 和 TF-text 导入正确的模块和模型;2)将输入加载到预处理器模型中;3)将预处理的输入加载到 BERT 编码器中。

BERT with TensorFlow HUB — 15 lines of code (from the official HUB model example)

我没有更新 Colab,而是用上面的例子创建了一个新的笔记本。我把原始版本留在这里,因为我相信它有助于理解预处理器模型的步骤。使用不同版本时,请注意轮毂模型导入结束时的版本(/3)。

模块导入

我们将使用最新的 TensorFlow (2.0+)和 TensorFlow Hub (0.7+),因此,它可能需要在系统中进行升级。对于模型创建,我们使用高级 Keras API 模型类(新集成到 tf.keras 中)。

BERT 记号赋予器仍然来自 BERT python 模块(bert-for-tf2)。

Imports of the project

模型

我们将基于 TensorFlow Hub 上的示例实现一个模型。在这里,我们可以看到 bert_layer 可以像其他 Keras 层一样用于更复杂的模型。

该模型的目标是使用预训练的 BERT 来生成嵌入向量。因此,我们只需要 BERT 层所需的输入,并且模型只将 BERT 层作为隐藏层。当然,在 BERT 层内部,还有一个更复杂的架构。

hub.KerasLayer函数将预训练的模型作为 Keras 层导入。

BERT embedding model in Keras

预处理

BERT 层需要 3 个输入序列:

  • 标记 id:针对句子中的每个标记。我们从伯特词汇词典中恢复它
  • mask ids:for each token,用于屏蔽仅用于序列填充的标记(因此每个序列都具有相同的长度)。
  • Segment ids:对于单句序列为 0,如果序列中有两个句子,并且是第二个,则为 1(更多信息请参见原始论文或 GitHub 上 BERT 的相应部分:[run_classifier.py](https://github.com/google-research/bert/blob/master/run_classifier.py)中的convert_single_example)。

Functions to generate the input based on the tokens and the max sequence length

预言;预测;预告

通过这些步骤,我们可以为我们的句子生成 BERT 上下文化嵌入向量!不要忘记添加[CLS][SEP]分隔符标记以保持原始格式!

Bert Embedding Generator in use

作为句子级嵌入的混合嵌入

原始论文建议使用[CLS]分隔符作为整个句子的表示,因为每个句子都有一个[CLS]标记,并且因为它是一个上下文化的嵌入,所以它可以表示整个句子。在我之前的作品中,也是用这个 token 的嵌入作为句子级的表示。来自 TensorFlow Hub 的bert_layer返回一个不同的合并输出,用于表示整个输入序列。

为了比较这两种嵌入,我们使用余弦相似度。汇集嵌入和第一个标记嵌入在例句中的区别*“这是一个好句子。”*为 0.0276。

BERT 中的偏差

当有人使用预先训练好的模型时,调查它的缺点和优点是很重要的。模型就像数据集一样有偏差,因此,如果使用有偏差的预训练模型,新模型很可能会继承缺陷。如果你使用 BERT,我建议你阅读我关于 BERT 中偏差的帖子。

摘要

这个故事介绍了一个简单的、基于 Keras 的 TensorFlow 2.0 对 BERT 嵌入模型的使用。像阿尔伯特这样的其他模型也可以在 TensorFlow Hub 上找到。

这个故事的所有代码都可以在 Google Colab 上获得。

参考

[1] Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。 Bert:用于语言理解的深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805

用伯特的故事学习 NMT

  1. BLEU-BERT-y:比较句子得分
  2. 嵌入关系的可视化(word2vec,BERT)
  3. 机器翻译:简要概述
  4. 使用 BERT 识别单词的正确含义
  5. 机器翻译:对比 SOTA
  6. 使用 TensorFlow 2.0 的简单 BERT

使用 uTensor 在 MCU 上运行卷积神经网络的端到端教程

原文:https://towardsdatascience.com/simple-cnn-on-mcu-with-utensor-372265ecc5b4?source=collection_archive---------14-----------------------

我试图在 uTensor 上展示 CNN,但在 2018 年的台湾 COSCUP 上没有成功。问题是,我不小心给所有的输入类输入了相同的图像,这和随机猜测一样好。在 CIFAR10 上,这产生了大约 10%准确度。尽管事实上分类器确实在工作!

这是 CNN 关于 uTensor 的背景故事。

在这篇文章中,我将指导你如何用 uTensor 构建一个 CNN。我们将使用utensor-cli将 Tensorflow 中训练的简单 CNN 无缝转换为等效的 uTensor 实现,在 MCU(具体来说是 STM32F767)上编译和运行。

如果你是 uTensor 的新手,在继续之前,你可能想读一读由 uTensor 核心开发者之一, Neil Tan 撰写的这篇 伟大的 MLP 教程

好了,我们开始吧!

获取演示代码

首先,克隆回购:

% git clone [https://github.com/uTensor/simple_cnn_tutorial.git](https://github.com/uTensor/simple_cnn_tutorial.git)
% cd simple_cnn_tutorial

接下来,通过运行以下命令来设置环境:

# setup a python virtual environment and activate it
% python2.7 -m virtualenv .venv
% source .venv/bin/activate# install mbed-cli and setup libraries
% pip install mbed-cli
% mbed deploy# install uTensor cli *after* setting up the libraries
% pip install utensor_cgen==0.3.3.dev2

安装完成后,如果没有其他错误,就可以开始了。

在回购中,有几个 python 脚本您可能想研究一下:

  • model.py是构建 CNN 图表的脚本。
  • train.py是训练脚本。如果你想自己训练一个,你可以运行python train.py --help来查看所有可用的超参数。在本教程中,我们将使用一个预先训练好的 protobuf 文件,cifar10_cnn.pb
  • cifar10_cnn.pb是我们将在本教程中使用的预训练模型。
  • prepare_test_data.py是一个 python 脚本,它将为您生成img_data.h ,这是在 MCU 上运行测试的数据。

如果您想立即看到结果,您可以连接开发板并运行make compile。它应该编译和闪存图像到您的开发板。然后按照 Neil Tan教程中“获取输出”部分的说明进行操作。

从 Tensorflow 到 uTensor

utensor-cli激活虚拟环境。我们将首先识别输出节点,然后从模型中生成 C++文件。

检查图形并找到输出节点:utensor-cli show <model.pb>

该命令显示给定模型文件中的所有操作/节点。例如,如果您运行utensor-cli show cifar10_cnn.pb --oneline,您将在终端上看到以下内容:

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

如您所见,该命令打印出给定cifar10_cnn.pb中的所有图节点。

当我们想将 protobuf 文件转换成 uTensor C++文件时,需要提供一个带有--output-nodes选项的输出节点列表。与其他工具如tensorboard相比,show命令对于探索模型是有用的和轻量级的。

cifar10_cnn.pb中,fully_connect_2/logits就是我们要找的。它是这个模型中的输出节点。

然后,使用convert命令将文件转换成 C++文件:

% utensor-cli convert cifar10_cnn.pb --output-nodes \
fully_connect_2/logits

您将在控制台上看到:

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

此时,您应该在models目录中找到您的模型的 uTensor 实现,它是由utensor-cli生成的。

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

最后,通过运行以下命令生成一批测试图像:

% python prepare_test_data.py # generate testing image batch

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

它只需下载 cifar10 数据集,并随机生成一批图像进行测试。您可以在img_data.h中看到像素值(标准化为[0,1])。

看,美国有线电视新闻网在 MCU 上

main.cpp中,您可以看到如何使用 cli 生成的模型文件。简要总结:

  1. 创建一个Context对象
  2. 在本教程中,使用 cli 生成的助手函数构建神经网络。
  3. 获取您想要用于推理的张量。
  4. 评估神经网络。

注意uTensor将在评估后清除参考计数为 0 的张量。如果你在神经网络评估后得到张量**,你会得到一个错误或悬空指针问题。**

好了,编码的东西够多了。有趣的部分来了,我们准备在 MCU 上编译和运行 CNN。

首先,将开发板连接到计算机上:

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

My NUCLEO-F767ZI

接下来,运行:

% mbed compile -m auto -t GCC_ARM --profile \
uTensor/build_profile/release.json -f
  • mbed将自动检测您的开发板型号,带有-m auto标志。
  • 使用概要文件构建二进制文件,在本教程中为release.json
  • 并将二进制映像闪存到您的主板,并启用-f标志。

如果一切顺利,您应该会看到:

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

可能需要一段时间才能完成,耐心一点就好;)

为了看到我的 NUCLEO-F767ZI 的串行输出,我使用了 CoolTerm(你可以从这里下载)。按照尼尔·谭教程中所述设置 CoolTerm,并按下重置按钮,您应该会看到:

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

精确度可能因您使用prepare_test_data.py生成的随机图像批次而异。如果你这一批运气不好,就试试另一批:P

恭喜你。我们的 CNN 在 MCU 上直播。

下一步是什么

助理团队 非常活跃,试图将数据科学带入边缘计算领域。

在本教程中,我们提供了一个展示案例,您可以使用 uTensor 和其他神经网络框架(如 Tensorflow)进行端到端应用。

如果你是 PyTorch 的忠实粉丝,想知道 PyTorch 是否在 uTensor 的路线图上,不要担心。我也是 PyTorch 的粉丝,我们的团队正在努力让 PyTorch 与 Tensor 集成,就像我们与 Tensorflow 集成一样。我们正在取得进展,但欢迎你加入。

你可以在https://github.com/uTensor找到代码,有两个回购你应该先通过:

  • 助手:c++运行时
  • ❤用 python 写的 uTensor CLI

最后,特别感谢尼尔·谭 卡扎米给我的有用建议和帮助我调试本教程。

运输中的简单复杂性

原文:https://towardsdatascience.com/simple-complexity-b63e1b573f96?source=collection_archive---------26-----------------------

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

Photo by @vidarnm

当人和技术比想象的更容易时

当一列载有 200 多名乘客的火车发生故障时,科技和人类如何合作解决这一问题?一个封闭的问题,因为我今天经历了一系列的延误和故障,以及它是如何处理的第一手资料。

9 月 15 日早些时候,一棵树倒在了挪威克里斯蒂安桑和奥斯陆之间的铁轨上。那是一个星期天,当我登上火车时,列车员看起来相对乐观。一列火车试图通过,但运气不佳,但故障可能会被修复。事实证明并非如此。

火车在克里斯蒂安桑和奥斯陆之间行驶了一半后,在一个偏僻的小站停了下来。在挪威寒冷的秋天,这个车站只有一个 20-30 平方米的房间,外面大约有 200 人。你可以听到人们的窃窃私语,被自动语音信息告知信号故障或延迟时间。

显然,火车公司没有可用的公共汽车,因为他们已将此分包给全国其他较小的供应商。然而,这些分包商没有义务交付货物,运营车站和轨道的公司与拥有列车的公司之间存在混淆。

我试图与工作人员交谈,但他们说这是另一家公司的过错,他们是来照顾车站的,而不是火车或乘客。我决定打电话给服务热线,然而那里的人对的了解甚至比车站宣布的延误或更新还要少。支持公司似乎是一个不同的公司,那些运行列车或负责车站的人。三家公司:Vy 随火车;BaneNor 与车站;和客服人员一起工作。

我与之交谈的支持公司也不接受任何反馈,这是根据我与之交谈的人不负责任的说法,因为这可能会令人困惑。我提到,如果他们在紧急情况下准备好司机会很好,她说她无法记下这一点或通过她的主管。我提到有孩子和老人没有吃东西。我遇到过一个老妇人,她在去医院检查她认为很紧急的东西的路上。她仍然说,她不能做任何事情来帮助或通知任何人,她只是在客户服务中,对现场的情况没有控制权。

我想联系的支持公司等了 40 分钟才联系上。人声 40 分钟。然后在我们的谈话中,支持部门的人让我和她的主管谈几秒钟,随后就挂断了电话,没有给我回电话。我又打了一次电话,不得不排了 30 分钟的队,直到再次与同一个人通话。她没有进一步的消息。

在火车被困在一个不知名的地方四个小时后,我开始想知道这些公司在做什么,他们如何关心或者他们是否关心。晚上晚些时候,一个人来了,他们设法叫了几辆出租车,我很幸运地得到了一辆出租车,当然是在有孩子或生病的家庭被优先考虑之后。

这种情况让我对那些委派责任却无人负责的公司产生了怀疑。隔壁放了一个警卫室,谁都不让进,200 人冷天。监视器上的机器人声音。有人在去医院的路上等着;没有食物的儿童;无处可坐或休息的老年人。没有人走到人们身边寻求安慰或提供信息,一切都是通过扬声器传达的,带有相互矛盾的信息和大量的自动装置。甚至有一条自动消息发给所有的乘客,这条消息是错误的,因为错过了更新或出现了小故障,每个人都跑出去重新进去。

人在回路中

人们已经广泛讨论过,人工智能领域无法在不断变化的环境中完成需要常识的简单任务。强化学习可以适应设定的环境(如游戏或某些房间或模式),如果提供足够的计算能力或数据,或许还可以适应变化的环境。虽然我怀疑火车公司使用强化学习。

在大多数情况下,人工智能无法像人类那样“关心”,只能以这种方式表达关心行为。奇怪的是,在这种情况下建立起来的系统并不允许回路中的人按照规定或内部期望的方式行事。因此,即使我们确实有人类在循环中,它也不需要一种人道的方式来处理给定的情况。

即使消息已经在特定等待时间过去时自动发送到该区域的所有出租车公司(如果等待时间> 3 小时,则发送出租车),他们甚至可以更早地决定修理公共汽车。这看起来确实像是一种节约措施,或者是在这种情况下减少开支的优化措施。人们必须主动申请食物、出租车或任何其他可能不会立即得到支付的费用——这些费用不是免费提供的。有些人还打电话给自己的家人或朋友来接他们。很少有人能幸运地找到人来接他们,或者指望他们买票的公司负责运输。

如果自动响应对公司来说是最低成本的途径,而对试图在全国范围内移动的公民来说是最高成本的途径,那么即使涉及到算法,这也有些问题。如果让员工为这些类型的紧急情况做好准备成本太高,并且打赌一些人会懒得报销费用,这似乎是一种不负责任的赌注,也是危险的,在某些情况下可能是致命的。那里有些人付不起去奥斯陆的出租车费,要等一段时间才有希望收回这笔费用。

在支持中也没有反馈系统,只是在另一端的一个人试图用一些基本信息来安抚你,这些信息甚至可能不够新,没有多大关系。世界上没有任何算法可以帮助错误优化的情况,或者当没有/很少准备处理这种情况时。

它没有针对系统故障的合理响应时间进行优化。我知道在其他领域可能会更难,而且有更大的问题,但考虑我们为哪些其他任务进行优化将是令人着迷的。在某些情况下,过程自动化和预测性维护可能不是最佳的。这取决于那些在这样的条件下定义变量或语句的人。如果是冬天会不会快一点?什么时候应该预料不到的事情?

200 个人在零下的温度下,看不到公共汽车,也没有食物,与这里的情况形成鲜明对比的是,秋天的时候几乎是一样的。我们针对速度或成本进行优化,在英特尔机器中,这可能会导致推测性执行的硬件漏洞。速度比安全更重要,他们希望很少有人会注意到这一点。

在这种情况下,乘坐火车的成本似乎在表面上是一个支配性的因素,以及关于不同行为者的责任或参与的混乱。也许更多的是,一种情况是多么不人性化,更加自动化,信息更少,更加反动。即使是不太像人类的人——疏远或缺乏理解或想要理解在场的人的表现。

积极的一面

更积极的一面是,我坐在等候室的地上,通过游戏编程英雄在手机上学习了更多的 Python 编程。这让我想到了编程在这种情况下能有什么帮助,但显然也有什么是它不能或不能帮助的。当一列火车发生故障时,我想要的不仅仅是一条自动信息和当时不在场的人。在互联网上为公民服务的基础设施出现类似的故障,比如我在火车上经历的那次,这可能不是不可想象的。当基础设施出现故障时,您希望如何处理?

这是第 500 天的第 104 天。我目前第 101-200 天的重点主要是 Python 编程。如果你喜欢这篇文章,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。

使用 SQL 进行简单的数据分析

原文:https://towardsdatascience.com/simple-data-profiling-with-sql-f2bafc07adcc?source=collection_archive---------11-----------------------

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

What lies beneath : like the water in this peaceful river, your database can conceal any number of problems. (photo: Author)

在开始之前,了解数据的真实状态。

许多组织将其数据存储在符合 SQL 的数据库中。至少在生命周期的一部分中,这些数据库是有机增长的,这并不是闻所未闻的,所以表可能包含也可能不包含它们的标签会让您认为它们包含的内容,并且质量可能符合也可能不符合您的期望并对您的应用程序有用。

无论如何,创建数据库的最初目的很少是为数据科学家创建一个方便的、结构良好的环境来使用分析基础。因此,尽管您渴望将数据迁移到 R 或 Python 中进行分析,并有望用它来构建模型,但是您需要弄清楚哪些数据是您所需要的,哪些数据满足数据质量的基本标准,从而使其值得使用。

确实,主要的数据库包都有专门用于数据分析的工具。然而,同样值得注意的是,这些工具学习起来很复杂,有时看起来像是敲碎核桃的大锤。真正需要的是一些能够快速完成工作的简单查询。

在本系列的早期文章中,我们研究了 SQL 中的分位数,以及 SQL 中缺失值的探索性统计。这一次,我们将着眼于识别独特的价值,并探索它们出现的频率。

唯一值本身并不难识别— SQL 有一个内置的关键字 DISTINCT,它将返回的行限制为具有唯一值的行。因此,通过创建查询 SELECT DISTINCT col _ name from Table 并查看返回了多少行来发现任何行的值的数量是很容易的。

简单地知道特定列中唯一值的数量有点用处,但可能不如知道变量是分类的情况下每个值出现的次数有用(如果您事先不知道,大多数值的多次出现可能是这是分类值的强烈信号)。

这也相对简单,因为您可以将 DISTINCT 等关键字放入 COUNT 等聚合的括号中。因此

select count(DISTINCT x) from tablegroup by x

更有用的是知道唯一变量的比例。如果字段的标签很差,并且您需要仔细检查哪些列可能是唯一 id,这可能会很有帮助,同时也可以避免将表示简单标识符的字段误认为是包含信息的字段。不要忘记,由于 COUNT 返回一个整数,您需要转换结果以获得一个分数:

select cast(count(DISTINCT x) as decimal)/count(X) 
from table

对于分类变量,理解唯一值的数量是理解整个数据集的总体有用性的重要一步。

罗伯特·德格拉夫的书《管理你的数据科学项目》》已经通过出版社出版。

在 Twitter 上关注罗伯特

python 中 2D 密度图的简单示例

原文:https://towardsdatascience.com/simple-example-of-2d-density-plots-in-python-83b83b934f67?source=collection_archive---------0-----------------------

如何可视化联合分布

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

这篇文章将向你展示如何:

  • 使用高斯核估计两个分布的概率密度函数
  • 使用 Matplotlib 用密度图周围带标签的等高线来表示 PDF
  • 如何提取等高线
  • 如何在 3D 中绘制上面的高斯核
  • 如何使用 2D 直方图绘制相同的 PDF

让我们从生成包含 3 个斑点的输入数据集开始:

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st
from sklearn.datasets.samples_generator import make_blobsn_components = 3
X, truth = make_blobs(n_samples=300, centers=n_components, 
                      cluster_std = [2, 1.5, 1], 
                      random_state=42)plt.scatter(X[:, 0], X[:, 1], s=50, c = truth)
plt.title(f"Example of a mixture of {n_components} distributions")
plt.xlabel("x")
plt.ylabel("y");

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

为了拟合高斯核,我们指定一个网格,该网格将在每个轴上使用 100 点插值(例如,mgrid(xmin:xmax:100j)):

# Extract x and y
x = X[:, 0]
y = X[:, 1]# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10xmin = min(x) - deltaX
xmax = max(x) + deltaXymin = min(y) - deltaY
ymax = max(y) + deltaYprint(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]

我们将使用 scipy 的 gaussian_kde 方法来拟合高斯内核:

positions = np.vstack([xx.ravel(), yy.ravel()])
values = np.vstack([x, y])
kernel = st.gaussian_kde(values)
f = np.reshape(kernel(positions).T, xx.shape)

用带注释的轮廓绘制内核

fig = plt.figure(figsize=(8,8))
ax = fig.gca()
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
cfset = ax.contourf(xx, yy, f, cmap='coolwarm')
ax.imshow(np.rot90(f), cmap='coolwarm', extent=[xmin, xmax, ymin, ymax])
cset = ax.contour(xx, yy, f, colors='k')
ax.clabel(cset, inline=1, fontsize=10)
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.title('2D Gaussian Kernel density estimation')

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

完成整个魔术的 matplotlib 对象被称为 QuadContour set(代码中的 cset )。我们可以通过迭代 allsegs 对象来编程访问轮廓线。计算标签可从标签文本访问。

plt.figure(figsize=(8,8))for j in range(len(cset.allsegs)):
    for ii, seg in enumerate(cset.allsegs[j]):
        plt.plot(seg[:,0], seg[:,1], '.-', label=f'Cluster{j}, level{ii}')plt.legend()

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

三维 KDE 图

我们将使用来自 mplot3d 的 matplotlib 的 axes3d。我们可以将密度绘制成一个表面:

fig = plt.figure(figsize=(13, 7))
ax = plt.axes(projection='3d')
surf = ax.plot_surface(xx, yy, f, rstride=1, cstride=1, cmap='coolwarm', edgecolor='none')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('PDF')
ax.set_title('Surface plot of Gaussian 2D KDE')
fig.colorbar(surf, shrink=0.5, aspect=5) # add color bar indicating the PDF
ax.view_init(60, 35)

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

或者作为线框:

fig = plt.figure(figsize=(13, 7))
ax = plt.axes(projection='3d')
w = ax.plot_wireframe(xx, yy, f)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('PDF')
ax.set_title('Wireframe plot of Gaussian 2D KDE');

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

使用 2D 直方图的表示法

呈现相同信息的另一种方式是使用 2D 直方图。将参数 normed 设置为 False 将返回实际频率,而设置为 True 将返回 PDF。

h =plt.hist2d(x, y)
plt.colorbar(h[3])

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

完整的代码可以在 Github 上获得。

简单的探索性数据分析:基于西雅图邻里特征的房地产列表(Airbnb 数据)

原文:https://towardsdatascience.com/simple-exploratory-data-analysis-real-estate-listings-based-on-seattles-neighborhood-67a51c515506?source=collection_archive---------15-----------------------

你好,数据人员!这是我的第一个媒体帖子。在这第一篇文章中,让我们看看如何利用简单的 EDA(探索性数据分析)从数据中提取有用的初步见解。对于数据或分析领域的新手来说,通常首先想到的是机器学习或复杂的统计建模。事实上,根据我过去几年的经验,在我们进行的每次分析中,并不总是强制执行一个花哨的统计模型或机器学习技术。我们可以只使用简单的 EDA 结合良好的领域知识。

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

Photo by Luca Bravo on Unsplash

首先,了解什么是 EDA 是有好处的。根据维基百科😊、探索性数据分析 ( EDA )是一种对 数据集进行分析以总结其主要特征的方法,往往采用可视化的方法。一个统计模型可以使用也可以不使用,但是 EDA 主要是为了看看数据能告诉我们什么,而不仅仅是正式的建模或假设检验任务。简而言之,EDA 通常在分析的早期阶段进行,以便为我们提供数据的主要思想,有进一步的假设,并可能导致新的数据收集和实验。单独使用 EDA 并呈现我们的发现也是可以的(就像本文中的分析一样!).

数据源和上下文

我们可以从 这个 Kaggle 链接 **得到 Airbnb 提供的数据集。**数据集由 3 个表组成(列表、日历和评论)。

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

Data description

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

‘listings’ table consists of detailed information of each listing (e.g. listing id, url, posted time, listing description, neighborhood description, normal price, location coordinate, etc)

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

‘calendar’ table. The availability of each listing in particular date and the price within that day

概述:

  1. Airbnb 是一个提供寄宿家庭或旅游服务的在线市场。它充当东道主的经纪人/聚合人,并从每笔预订中收取佣金。
  2. 西雅图是美国西海岸的一个海港城市,截至 2018 年有 73 万居民。

在这篇文章中,让我们关注“西雅图每个社区的氛围”。

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

Photo by Thom Milkovic on Unsplash

调查结果

国会山是 Airbnb 列出的房产可用性最高的社区。它的上市量甚至比上市量第二高的 Ballard 高出 65%。

国会山、贝尔敦和第一山的房源以公寓为主,而巴拉德、米纳尔和沃灵福德的房源大多是房子。安妮女王由一个更加平衡的房子和公寓组合而成。

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

挂牌价格最高且集中在相对较近区域的三个主要社区是派克市场、贝尔敦和中央商务区。

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

My Tableau, unfortunately, wasn’t able to connect and overlap the plot to the real map 😦 So let’s just display the snapshot from Gmaps side by side instead 😃

在“列表”表中有“邻居概述”列,在该列中,我们可以获得列表者/物业所有者给出的关于邻居的概述。

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

neighborhood overview column example

使用邻居概况数据,三个邻居共享或多或少相同的关键词:“中心”、“市场”、“市中心”、“游客”、“博物馆”、“空间”、“博物馆”、“步行”。很明显,派克市场、中央商务区和贝尔敦是西雅图最受欢迎的地区,因为它们位于西雅图市中心、市场/贸易中心,并且靠近旅游景点。因此,这个地区的房租价格较高。

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

通过计算价格差/距离比,存在一些提供更便宜的挂牌价格但靠近市中心的社区。第一山、国会山和东湖是价格差/距离比最高的社区,因此是西雅图推荐的租房社区。

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

参观这些街区最繁忙的时间是一年中的五月到八月,而岁末年初是最空闲的时候。

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

价格不像供货情况那样波动。不过由于最忙的时候是年中,所以最高价也在 6-8 月这个区间。

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

关键要点

  1. 国会山的上市数量最多,其次是巴拉德和贝尔敦。国会山、贝尔敦和第一山以公寓为主,而巴拉德、米纳尔和沃灵福德以住宅为主

2.挂牌价格最高且集中在相对较近区域的三个主要社区是派克市场、贝尔敦和中央商务区

3.派克市场、中央商务区和贝尔敦是西雅图最受欢迎的地区,因为它们位于西雅图市中心、市场/贸易中心,并且靠近旅游景点。因此,这个地区的房产租金价格较高

4.第一山、国会山和东湖是最值得推荐的社区,因为它们的挂牌价格更便宜,而且靠近市中心

5.每年 5 月至 8 月是推荐区域租赁物业的最繁忙时间,年末和年初是最空闲的时间

6.价格不像供货情况那样波动。然而,由于最繁忙的时间是在年中,最高价格也在 6 月至 8 月的范围内

附录

工具:

1.用于数据查询和处理的 SQL 和 Excel

2.可视化的 Tableau 和 Thinkcell

3.wordclouds.com 制造单词云

—我很乐意讨论关于分析的进一步想法,请通过https://www.linkedin.com/in/muhammad-lutfi-hernandi/联系我😄 —

—干杯—

时间序列预测的简单指数平滑法

原文:https://towardsdatascience.com/simple-exponential-smoothing-749fc5631bed?source=collection_archive---------6-----------------------

简单指数平滑法是预测时间序列的一种简单而强大的方法。此外,它还被许多其他模型用作构建模块。让我们看看它是如何工作的。

本文摘自我的著作 供应链预测的数据科学 。你可以在这里 阅读我的其他文章 。我也活跃在LinkedIn

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

想法

简单的指数平滑法是预测时间序列最简单的方法之一。该模型的基本思想是假设未来将或多或少与(最近的)过去相同。因此,该模型将从需求历史中学习的唯一模式是其水平(你可以在我的博客或我的中了解更复杂的模型)。

该水平是需求随时间变化的平均值。如下图所示,该水平是需求的平滑版本。

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

然后,指数平滑模型将预测未来需求,作为其对水平的最后估计。重要的是要明白,没有明确的数学定义的水平。相反,由我们的模型来估计它。

与更简单的预测模型(如简单模型或移动平均模型)相比,指数平滑模型具有一些优势:

  • 随着时间的推移,每个观察值的权重呈指数级下降(最近的观察值权重最高)。这通常比移动平均模型更好,移动平均模型对所有相关的历史月份分配相同的权重。
  • 离群值和噪声的影响比简单方法小。

模型

指数平滑模型的基本思想是,在每个时期,模型将从最近的需求观察中学习一点,并记住它所做的最后一次预测。神奇的是,模型填充的最后一个预测已经包含了一部分先前的需求观察和一部分先前的预测。诸如此类。这意味着之前的预测包括了模型基于需求历史到目前为止了解到的所有信息。平滑参数(或学习率)α将决定给予最近的需求观察多少重要性。让我们用数学来表示它,

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

这个公式背后的直觉是什么?

  • alpha 是相对于需求历史的重要性,模型将分配给最近观察的重要性的比率(或百分比)。
  • alpha d{t-1} 表示之前的需求观察乘以学习率。您可以说,该模型将某个权重(alpha)附加到最后一次需求发生上。
  • (1-alpha) f{t-1} 表示模型对其先前预测的记忆程度。注意,这就是递归魔术发生的地方,因为 f{t-1}本身被定义为部分 d{t-2}和 f{t-2}。

这里需要在学习记忆反应性和稳定性之间做出必要的权衡。如果 alpha 较高,则模型将分配更多的重要性给最近的需求观察(即,模型将快速学习),并且它将对需求水平的变化做出反应。但是它对异常值和噪声也很敏感。另一方面,如果 alpha 较低,模型不会注意到级别的快速变化,但也不会对噪声和异常值反应过度。

未来预测

一旦我们离开了历史时期,我们需要填充未来时期的预测。这很简单:上一次预测(基于最近需求观察的预测)只是对未来的推断。如果我们根据需求历史将 f{t*}定义为我们可以做出的最后一个预测,我们只需

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

模型初始化

与每个模型一样,问题来自于第一次预测的初始化。不幸的是,这个简单的问题没有简单的答案。在本书中经常会出现这种情况:最简单的问题并不总是有明确和绝对的答案。正如我们将反复讨论的那样,只有实验才能让我们理解哪种技术最适合每个数据集。我们来讨论一些想法。

简单初始化 —我们将第一个预测(期间 0)初始化为第一个需求观察。然后我们有

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

这是初始化预测的一种公平而直接的方式。

平均值 —我们将预测初始化为第一个 n 个需求发生的平均值。

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

在这种情况下,我建议测试不同的 n 值。它可以设置为一个固定的小值(3 到 5),也可以设置为学习率的倒数(1/alpha)。如果 n 被设置为学习率的倒数,这允许随着学习率降低而更平滑地估计 f_0。这是有意义的,因为 alpha 的低值意味着我们希望我们的模型对变化做出平滑的反应。

数据泄露

如果您选择的初始化方法包括关于未来多个期间的信息,例如,如果您将初始预测定义为前五个期间的平均值,您将面临数据泄漏。这意味着你为你的模型提供了关于未来的信息。基本上你告诉它:“你能给我提供一个下期的预测吗,知道未来五期的需求平均值是 10?”。这是一个典型的过度拟合的例子:该模型将为您提供初始阶段的良好预测准确性(这很简单,您给了它这些阶段的平均需求!)但未来将无法复制这样的准确性。

当你初始化一个模型的不同参数时,一定要小心,不要给它太多关于未来的信息。

洞察力

阿尔法的影响

下图显示,使用低 alpha 值(此处为 0.1)进行的预测将需要更多时间来对不断变化的需求做出反应,而使用高 alpha 值(此处为 0.8)进行的预测将密切跟踪需求波动。

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

为什么叫指数平滑?

该模型被称为指数平滑,因为给予每个需求观察的权重是指数减少的。为了说明这一点,我们将从回顾指数平滑模型开始。

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

如您所见,给予最近需求观察 d{t-1}的权重是α。现在让我们用公式来代替 f{t-1}。

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

如果我们做一点代数运算,我们会得到下面的公式:

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

我们看到,给予第二个最近的需求观察值 d{t-2}的权重是α(1-α),低于给予 d{t-1}的重要性。

让我们更进一步,用它的公式代替 f{t-2}。

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

我们看到给 d{t-3}的权重是 alpha(1-alpha),是给 d{t-2}的权重乘以(1-alpha)。从这里,我们推断出,给予每个进一步的需求观察的权重减少了一个因子(1-α)。这就是为什么我们称这种方法为指数平滑。

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

限制

这个简单的指数平滑模型比移动平均模型稍微聪明一点,因为它对历史需求观察的加权更聪明。但是它有许多限制:

  • 它不预测趋势。我们将通过我们的下一个模型来解决这个问题:趋势指数平滑,也称为双指数平滑
  • 它不承认任何季节性模式。我们将使用三重指数平滑模型来解决这个问题。
  • 它不能使用任何外部信息(如定价或营销费用)。

总之,第一个指数平滑模型很可能过于简单,无法获得好的结果,但它是以后创建更复杂模型的良好基础。

霍尔特-温特斯模型简史

指数平滑模型通常被称为“霍尔特-温特斯”,这是基于提出这些模型的研究人员的名字。指数平滑预报的早期形式最初是由布朗于 1956 年提出的。1957 年,来自麻省理工学院和芝加哥大学的美国工程师 Charles C. Holt 在他的论文“通过指数加权平均值预测趋势和季节”中完善了他的方程三年后,彼得·温特斯再次改进了指数平滑模型。他们的两个名字被记住,并被赋予不同的指数平滑技术,我们有时称之为“霍尔特-温特斯”**

Holt & Winters 提出了不同的指数平滑模型(简单、双重和三重),这些模型也可以理解和预测趋势或季节性。这种模型集合对于预测任何时间序列都是相当稳健的。而且,正如霍尔特和温特斯在 1960 年已经解释过的,这些预测只需要适度使用计算能力。

自己做

可以在 Excel ( 此处)或者 Python ( 此处)中做自己简单的指数平滑。

关于作者

[## Nicolas vande put——顾问,创始人——供应链| LinkedIn

查看 Nicolas Vandeput 在世界上最大的职业社区 LinkedIn 上的个人资料。尼古拉斯有 7 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/vandeputnicolas/)

icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两个科目。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟

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

用熊猫探索简单的足球数据集

原文:https://towardsdatascience.com/simple-football-data-set-exploration-with-pandas-60a2bc56bd5a?source=collection_archive---------9-----------------------

从 1872 年到 2019 年的国际足球结果

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

Image Courtesy of Syed Ali via Unsplash

熊猫的简单可视化——一个足球的例子

这篇教程文章详细介绍了如何使用 Python Pandas 库高效地探索数据集。具体来说,这个例子将使用数据集,从 1872 年到 2019 年的国际足球结果,可从 Kaggle 网站获得。首先,本教程将探索简单的可视化,以及如何过滤它们以允许更细粒度的探索。

此外,本教程旨在展示如何使用熊猫来回答数据科学相关的问题。

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

The Data-set is available by following the link attached, and has records for more than 40 thousand international football results.

画出每年国际比赛的次数?

首先,除了 matplotlib 库允许探索性的数据可视化之外,还需要导入 Pandas 库用于数据分析。我读入保存在本地目录中的 CSV 文件,并将其保存到名为 results 的数据帧中。接下来,我使用 head 方法查看结果数据帧的前 5 条记录。数据帧中的每一行代表一场国际足球比赛。为了帮助自己熟悉数据集,我还查看了列的数据类型。

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

To familiarize myself with the Dataframe, I check the number of rows and columns using the shape attribute, and check the datatype of the columns.

要计算和可视化每年发生的比赛数量,一个好的起点是查看日期列,因为它有每场比赛的日期。如前所示,日期列有一个对象数据类型。为了方便地从这个日期列中提取年份,只需对结果数据帧中的日期序列使用 pd.to_datetime 方法,并创建一个新列。这里,我创建的新列名为“date_time ”,现在具有 datetime 数据类型。

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

通过使用“dt”名称空间,可以提取诸如 year 之类的方便的属性,并且可以应用 value_counts 方法。为了绘图,必须对索引(显示在左侧的年份)进行排序。

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

通过简单的写作。情节,情节现在可以可视化和国际比赛的数量显示。

虽然这个情节当然可以使用一些视觉上的增强,一个简单的熊猫单句就能够传达每年发生的比赛数量!

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

The default for plot() is line. A line plot type is ideally suited for time-series data.

过滤时间序列以获得更精细的细节

看看更小范围的国际比赛也是很有见地的。时间序列列 date_time 可以使用 Pandas 一行程序进行过滤。在所示示例中,仅显示了 2014 年至 2019 年的国际比赛。

值得注意的是,2019 年的国际比赛似乎有所下降。然而,经过仔细检查,date_time 序列中最后记录的日期是在 2019 年年中,如对 date_time 序列使用 max()方法所示。这可能解释了 2019 年国际比赛突然明显下降的原因。

提示:我们可以很容易地使用多个条件语句过滤日期范围,如注释掉的第一行所示。有趣的是,我们还可以使用 between 方法,通过指定 left=和 right=关键字参数的值来选择和提取年份范围。注意,指定的两个值都包含在内。

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

Filtering using conditionals or the between method can permit more fined grained details to be visualized.

哪种锦标赛最激动人心?

使用数据集中表现良好的数据!

最激动人心的国际比赛可以用很多方式来定义,但其中一种方式可能是调查进球!为了决定哪一场比赛是最激动人心的,我创建了一个新的列,使用下面显示的代码片段计算每场国际比赛的比赛进球数。为了确认已经创建了该列,我从结果数据帧中抽取了三列,即 home_score、away_score 和 match_goals,并从结果数据帧中随机抽取 5 条记录进行验证。

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

对于每场锦标赛,我现在可以使用 Pandas groupby 来计算平均比赛进球数,并根据这一指标确定最激动人心的锦标赛。

然而,我必须注意要有合理的样本量,这样结果才有意义。在这个演示中,我将只包括数据帧中有 100 个或更多记录(国际比赛)的锦标赛。

我在结果数据帧的锦标赛系列中使用了 value_counts 方法。该命令返回一个新的系列,其中锦标赛是索引,值是特定锦标赛在数据帧中出现的次数。

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

我将这个系列保存到一个名为 tournament_count 的变量中,并过滤这个系列,使每个锦标赛只包含 100 个或更多的记录。然后,我选择索引,并使用 isin()方法调用过滤结果数据帧,这将返回一个新的数据帧,该数据帧现在只包括在数据集中出现 100 次或更多次的锦标赛!

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

现在,我在过滤后的数据框架中对每场锦标赛进行分组,查看每场锦标赛的记录数量(使用计数),并根据平均比赛进球数进行排序。我看着数据帧的尾部,因为排序是按升序进行的。

结果显示,“南太平洋运动会”平均每场比赛有 5.9 个进球,并且在过滤的数据帧中出现了 205 次,表示为 _tour。

进球显然不是决定哪场比赛最激动人心的唯一指标,数据集中缺少像射门次数、点球失误、犯规和所有其他增加比赛价值的因素,这是一个明显的弱点。

提示!要可视化特定的锦标赛,请使用接受列表的 filter 方法。

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

kind=’barh’ plots a horizontal bar plot, which is useful to differentiate between categories.

使用。过滤方法

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

过去 5 年的锦标赛次数

这个问题再次展示了熊猫在帮助回答与数据科学相关的问题方面有多么有用。

首先,我过滤结果数据框架,只包括 2015 年以后的数据(过去 5 年)。然后,通过从 date_time 列(具有 datetime 数据类型)中提取 year 属性,对每年进行分组。对于过滤后的数据帧中的每一年,我对锦标赛执行 value_counts,返回一个多系列索引,我使用 unstack 方法将它转换为数据帧。

最后,为了防止输出中出现大量的 nan,我用 0 填充它们。例如,国际足联世界杯每 4 年举行一次,因此每 4 年只有一次有人居住的场地。我将这个输出保存到一个名为“last_5_years”的新数据帧中,并提取我在我的旅程列表中指定的列。

现在我们可以清楚地看到,2018 年有 64 场世界杯比赛,但我们也可以看到一些有趣的关系,例如在 2019 年,非洲国家杯发生了 52 场比赛,这与 2015 年和 2017 年发生的 32 场比赛有所偏差。

用于调查过去 5 年比赛的相关代码包含在 github gist 中,如下图所示。

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

这与我的最后一个问题有关,自从非洲国家杯(AFCON)成立以来,已经举行了多少场比赛?

绘制非洲杯比赛开始以来的比赛次数

一幅图将有效而清晰地呈现这些数据。我只是通过出现“非洲杯”的锦标赛系列来过滤结果数据帧,并对每一年的锦标赛进行数值计算,然后使用 unstack 返回数据帧。然后,我从 afcon 数据框架中提取“非洲杯”列,并使用柱状图进行绘制。

名词(noun 的缩写)B I 不得不提取“非洲杯”列,以获得一个系列,我可以在那里绘制指数(x 轴上的年数),y 轴上的比赛数量。

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

现在,每个 Afcon 的游戏数量已经显示出来。快速的在线搜索显示,在最近的 2019 年 Afcon 锦标赛中,比赛数量确实有所增加。

摘要

熊猫可以直观地用来回答数据科学问题。所展示的从 1872 年到 2019 年的国际足球比赛结果提供了一个很好的用例来展示如何实现这一点。

集成学习方法简单指南

原文:https://towardsdatascience.com/simple-guide-for-ensemble-learning-methods-d87cc68705a2?source=collection_archive---------2-----------------------

什么,为什么,如何和装袋-推进去神秘化,解释,而非传统,读下去:)

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

在这个帖子之前,我已经发表了一个关于偏差方差权衡、过度拟合和欠拟合的圣杯。如果你是一个新手,或者只是想在全力投入整体建模的海洋之前温习一下偏差和方差的概念,这篇全面的文章可以作为这篇文章的重要前传。观众中的所有其他人可以很容易地从我的笔中了解更多关于整体造型的知识。我将引用一些现实生活中的例子来简化 集合模型的概念,重点是装袋和助推技术

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

场景 1: 你需要一副新耳机。现在,你有可能走进一家商店,购买销售人员向你展示的耳机吗?在这个时代,我确信答案是否定的,因为现在我们在购买任何东西之前都非常依赖我们的研究。你可以浏览一些网络技术门户网站,查看用户评论,然后比较你感兴趣的不同型号,同时检查它们的功能和价格。你也可能会询问你的朋友和同事的意见。简而言之,你不会直接得出结论,而是在彻底研究之后做出明智的决定。

现在,可以看看集成学习方法的技术定义。

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

什么是系综法?

*机器学习中的集成模型将来自多个模型的决策进行组合,以提高整体性能。*他们的操作思路与购买耳机时相似。

学习模型中误差的主要原因是由于噪声、偏差和方差

集合方法有助于最小化这些因素。这些方法旨在提高机器学习算法的稳定性和准确性。

**场景二:**假设你开发了一款健康健身 app。在将其公之于众之前,您希望收到重要的反馈,以弥补潜在的漏洞(如果有的话)。你可以求助于以下方法之一,阅读并决定哪种方法是最好的:

  1. 你可以听取你配偶或你最亲密朋友的意见。
  2. 你可以问一堆你的朋友和办公室同事。
  3. 你可以发布该应用的测试版,并接收来自 web 开发社区和非偏见用户的反馈。

猜答案没有印象分,😄 是的,我们当然会选择第三个选项。

现在,停下来想想你刚刚做了什么。你从足够多的人那里听取了多种意见,然后根据这些意见做出了明智的决定。这也是集合方法所做的。

机器学习中的集成模型将来自多个模型的决策结合起来,以提高整体性能。

**场景三:**看看下图;我们可以看到一群被蒙住眼睛的孩子在玩“触摸并告诉”的游戏,同时检查一头他们从未见过的大象。他们中的每一个人都有不同的版本来描述大象的样子,因为他们中的每一个人都接触到了大象的不同部位。现在,如果我们给他们一个任务,让他们提交一份关于大象描述的报告,根据他们的经验,他们的个人报告只能准确地描述一部分,但他们可以结合他们的观察,给出一份关于大象描述的非常准确的报告。

类似地,集成学习方法使用一组模型,与使用单个模型相比,它们的组合结果在预测准确性方面几乎总是更好。

集成是一种用来提高性能的分而治之的方法。

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

现在,让我们深入一些重要的合奏技巧。

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

Crack up a little 😄 You are doing great 😃

简单的集成技术

  1. 取结果的模式

众数:众数是一个统计术语,指在一组数字中出现频率最高的数字。

在这种技术中,使用多个模型来预测每个数据点。每个模型的预测都被视为单独的投票。我们从大多数模型中得到的预测被用作最终预测。

例如:我们可以通过参考上面的场景 2 来理解这一点。我在下面插入了一张图表来展示我们的健康和健身应用程序的测试版从用户社区获得的评级。(将每个人视为不同的模型)

输出=模式=3,因为大多数人都这样投票

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

2.取结果的平均值

在这种技术中,我们从所有模型中取预测的平均值,并用它来进行最终预测。

平均值=总和(评分*人数)/总人数=(1 * 5)+(2 * 13)+(3 * 45)+(4 * 7)+(5 * 2)/72 = 2.833 =四舍五入到最接近的整数将是 3

3.对结果进行加权平均

这是平均法的延伸。所有模型被赋予不同的权重,定义每个模型对于预测的重要性。例如,如果你的回答者中有 25 人是专业的应用程序开发人员,而其他人之前没有这方面的经验,那么这 25 人的回答会比其他人更重要。

例如:为了子孙后代,我将这个例子的规模缩减到 5 个人

加权平均值=(0.3 * 3)+(0.3 * 2)+(0.3 * 2)+(0.15 * 4)+(0.15 * 3)= 3.15 =四舍五入到最接近的整数得出 3

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

高级集成技术

我们现在将学习装袋和增压技术。但是,要使用它们,你必须选择一个基本的学习算法。例如,如果我们选择一个分类树,打包和提升将由一个我们想要的大小的树池组成。

1.打包(引导汇总)

自举聚合是一种集成方法。首先,我们用 replacment 创建训练数据集的随机样本(训练数据集的子集)。然后,我们为每个样本建立一个模型(分类器或决策树)。最后,使用平均或多数投票来组合这些多个模型的结果。

由于每个模型都暴露于不同的数据子集,我们在最后使用它们的集体输出,因此我们确保通过不太依赖我们的训练数据集来解决过度拟合的问题。因此,装袋帮助我们减少方差误差。

多个模型的组合降低了方差,尤其是在模型不稳定的情况下,并且可能产生比单一模型更可靠的预测。

随机森林技术实际上使用了这一概念,但它更进一步,通过随机选择每个自举样本的特征子集来进一步减少方差,从而在训练时进行分裂*(我的下一篇文章将详细介绍随机森林技术)*

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

2.助推

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

提升是一种迭代技术,它基于最后一次分类来调整观察的权重。如果一个观察被错误地分类,它会试图增加这个观察的权重,反之亦然。

一般来说,增强会降低偏差误差,并建立强大的预测模型。Boosting 显示出比 bagging 更好的预测准确性,但它也倾向于过度拟合训练数据。因此,参数调整成为 boosting 算法的一个关键部分,以使它们避免过拟合。

Boosting 是一种顺序技术,其中第一个算法在整个数据集上进行训练,后续算法通过拟合第一个算法的残差来构建,从而为先前模型预测不佳的那些观察值赋予更高的权重。

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

它依赖于创建一系列弱学习者,每个弱学习者可能对整个数据集都不好,但对数据集的某个部分是好的。因此,每个模型实际上都提高了整体的性能。

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

装袋和增压之间的差异总结

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

集合方法的优势/好处

几乎所有的 ML 黑客马拉松都使用集成方法来增强模型的预测能力。

让我们来看看使用系综方法的优势:

  1. 更准确的预测结果——我们可以将集合方法的工作与我们金融投资组合的多样化进行比较。建议保持债券和股票的混合投资组合,以减少可变性,从而最大限度地降低风险。类似地,在大多数情况下,与单个模型相比,模型集合将在测试用例场景(看不见的数据)上提供更好的性能。

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

2.稳定且更健壮的模型 -多个模型的综合结果总是比单个模型的噪音小。这导致模型的稳定性和鲁棒性。

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

3.集合模型可用于捕捉数据中的线性和非线性关系。这可以通过使用两种不同的模型并形成两者的集合来实现。

集合方法的缺点

  1. 降低模型解释能力- 由于复杂性增加,使用集成方法降低了模型解释能力,使得最终很难得出任何关键的商业见解。
  2. 计算和设计时间很长- 这对实时应用来说并不好。
  3. 选择模特来创作合奏是一门很难掌握的艺术。

所以,现在我们已经讨论了集合方法的所有基础知识,你可以着手尝试它们来进一步加深你的理解。

感谢您的阅读!😃

神经网络中超参数调整简单指南

原文:https://towardsdatascience.com/simple-guide-to-hyperparameter-tuning-in-neural-networks-3fe03dad8594?source=collection_archive---------0-----------------------

关于超参数优化的分步 Jupyter 笔记本演练。

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

Image courtesy of FT.com.

这是我的全连接(香草)神经网络系列的第四篇文章。在本文中,我们将优化一个神经网络并执行超参数调整,以便在 Beale 函数 上获得一个高性能的模型——这是许多常用于研究各种优化技术有效性的测试函数之一。这种分析可以在任何函数中重复使用,但是我建议您在另一个常见的测试函数中亲自尝试一下,以测试您的技能。就我个人而言,我发现优化一个神经网络会令人难以置信地沮丧(虽然不像 GAN 那么糟糕,如果你熟悉的话)…)除非你有一个清晰明确的程序可以遵循。我希望你喜欢这篇文章,并发现它很有见地。

您可以访问下面的前几篇文章。第一个为那些不熟悉的人提供了神经网络主题的简单介绍。第二篇文章涵盖了更多的中间主题,如激活函数、神经结构和损失函数。

[## 神经网络简介

神经网络的详细概述,有大量的例子和简单的图像。

towardsdatascience.com](/simple-introduction-to-neural-networks-ac1d7c3d7a2c) [## 神经网络体系结构综合介绍

神经架构、激活函数、损失函数、输出单元的详细概述。

towardsdatascience.com](/comprehensive-introduction-to-neural-network-architecture-c08c6d8e5d98) [## 神经网络优化

涵盖优化器,动量,自适应学习率,批量标准化,等等。

towardsdatascience.com](/neural-network-optimization-7ca72d4db3e0)

所有相关代码现在都可以在我的 GitHub 存储库中找到:

[## GitHub-mpstewart 1/神经网络

这个存储库包含与我的全连接神经网络系列相关的 Jupyter 笔记本内容。

github.com](https://github.com/mpstewart1/Neural-Networks)

比厄的功能

神经网络现在在工业和研究中相当普遍,但令人尴尬的是,其中很大一部分人无法很好地与它们合作,以产生能够超越大多数其他算法的高性能网络。

当应用数学家开发一种新的优化算法时,他们喜欢做的一件事是在测试函数上测试它,这有时被称为人工景观。这些人造景观帮助我们找到一种方法,从以下方面比较各种算法的性能:

  • 收敛(他们到达答案的速度)
  • 精确度(它们与精确答案有多接近)
  • 健壮性(它们是对所有功能都表现良好,还是只对一小部分功能表现良好)
  • 一般性能(例如计算复杂性)

只要向下滚动维基百科关于优化测试函数的文章,就可以看到一些函数非常糟糕。他们中的许多人被选中,因为他们强调了可能困扰优化算法的具体问题。在本文中,我们将关注一个看起来相对无害的函数,叫做比厄函数

比厄函数看起来是这样的:

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

The Beale function.

这个函数看起来并不特别可怕,对吗?这是一个测试函数的原因是,它评估优化算法在具有非常浅的梯度的平坦区域中执行得有多好。在这些情况下,基于梯度的优化程序特别难以达到任何最小值,因为它们不能有效地学习。

本文的其余部分将跟随我的 GitHub 资源库中的 Jupyter 笔记本教程。我们将讨论处理这种人造景观的方法。这种情况类似于神经网络的损耗面。训练神经网络时,目标是通过执行某种形式的优化(通常是随机梯度下降)来找到损失面上的全局最小值。

通过学习如何处理一个困难的优化函数,读者应该更好地准备处理现实生活中实现神经网络的场景。

对于那些不熟悉 Jupyter 笔记本的读者来说,可以在这里阅读更多关于它的内容。

在我们接触任何神经网络之前,我们首先必须定义函数并找到它的最小值(否则,我们怎么知道我们得到了正确的答案?).第一步(在导入任何相关的包之后)是在我们的笔记本中定义 Beale 函数:

然后,我们设置一些函数边界,因为我们对这种情况下的最小值(从我们的图中)以及网格的步长有一个大概的估计。

然后,我们根据这些信息制作一个网格,并准备寻找最小值。

现在我们做一个(可怕的)初步猜测。

然后我们使用scipy.optimize函数,看看会弹出什么答案。

这是结果:

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

看起来答案是(3,0.5),如果你把这些值代入方程,你会发现这是最小值(维基百科页面上也是这么说的)。

在下一部分,我们将开始我们的神经网络。

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

神经网络中的优化

神经网络可以被定义为结合输入并试图猜测输出的框架。如果我们足够幸运地有一些结果,称为“地面真相”,来比较网络产生的输出,我们可以计算出误差。因此,网络进行猜测,计算某个误差函数,在尝试最小化该误差的同时再次猜测,并且再次猜测,直到误差不再下降。这就是优化。

在神经网络中,最常用的优化算法是 **GD(梯度下降)**算法。梯度下降中使用的目标函数就是我们想要最小化的损失函数

本教程将集中在 Keras 现在,所以我会给一个简短的 Keras 复习。

复习者

Keras是一个用于深度学习的 Python 库,可以运行在 Theano 和 TensorFlow 之上,这两个强大的 Python 库分别由脸书和谷歌创建和发布,用于快速数值计算。

Keras 的开发是为了尽可能快速、简单地开发深度学习模型,用于研究和实际应用。它运行在 Python 2.7 或 3.5 上,可以在 GPU 和 CPU 上无缝执行。

Keras 建立在模型的理念之上。在其核心,我们有一个称为Sequential模型的层序列,它是层的线性堆栈。Keras 还提供了 functional API,这是一种定义复杂模型的方法,例如多输出模型、有向无环图或具有共享层的模型。

我们可以使用顺序模型总结 Keras 中深度学习模型的构建如下:

  1. 定义你的模型:创建一个Sequential模型,添加图层。
  2. 编译你的模型:指定损失函数和优化器,调用.compile()函数。
  3. 适合您的模型:通过调用.fit()函数对模型进行数据训练。
  4. 进行预测:通过调用.evaluate().predict()等函数,使用模型对新数据进行预测。

您可能会问自己——如何在模型运行时检查它的性能?这是一个很好的问题,答案是通过使用回调

回调:在我们的模型训练时偷看一眼

您可以通过使用callbacks来查看您的模型的各个阶段发生了什么。回调是在训练过程的给定阶段应用的一组函数。在训练期间,您可以使用回调来获得模型的内部状态和统计数据的视图。您可以将一个回调列表(作为关键字参数回调)传递给顺序类或模型类的.fit()方法。回调的相关方法将在训练的每个阶段被调用。

  • 你已经熟悉的一个回调函数是keras.callbacks.History()。这自动包含在.fit()中。
  • 另一个非常有用的是keras.callbacks.ModelCheckpoint,它保存了模型在训练中某一点的重量。如果您的模型运行了很长一段时间,并且发生了系统故障,那么这可能是有用的。那么,并非一切都失去了。例如,只有当acc观察到改进时,才保存模型权重,这是一个很好的做法。
  • keras.callbacks.EarlyStopping当监控的数量停止改善时,停止训练。
  • keras.callbacks.LearningRateScheduler会改变训练时的学习率。

我们稍后将应用一些回调。有关callbacks的完整文档,请参见https://keras.io/callbacks/

我们必须做的第一件事是导入许多不同的功能,让我们的生活更轻松。

如果您希望您的网络使用随机数工作,但为了使结果可重复,您可以做的另一个步骤是使用随机种子。这每次都会产生相同的数字序列,尽管它们仍然是伪随机的(这是比较模型和测试可再现性的好方法)。

步骤 1 —确定网络拓扑(并非真正意义上的优化,但非常重要)

我们将使用 MNIST 数据集,它由手写数字(0–9)的灰度图像组成,尺寸为 28x28 像素。每个像素是 8 位,因此其值的范围是从 0 到 255。

获取数据集非常容易,因为Keras内置了一个函数。

我们的 XY 数据的输出分别是(60000,28,28)和(60000,1)。最好打印一些数据来检查值(以及数据类型,如果需要的话)。

我们可以通过查看每个数字的一个图像来检查训练数据,以确保它们没有从我们的数据中丢失。

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

最后一项检查是针对训练集和测试集的维度,这可以相对容易地完成:

我们发现我们有 60,000 个训练图像和 10,000 个测试图像。接下来要做的是预处理数据。

预处理数据

要运行我们的神经网络,我们需要预处理数据(这些步骤可以互换执行):

  • 首先,我们必须使 2D 图像数组成为 1D(展平它们)。我们可以通过使用numpy.reshape()keras方法的数组整形来实现这一点:一个叫做keras.layers.Flatten的层将图像格式从 2d 数组(28×28 像素)转换为 28 * 28 = 784 像素的 1D 数组。
  • 然后,我们需要使用以下变换来归一化像素值(给它们 0 到 1 之间的值):

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

在我们的例子中,最小值是零,最大值是 255,所以公式变成简单的 𝑥:=𝑥/255.

我们现在想一次性编码我们的数据。

现在我们终于准备好构建我们的模型了!

步骤 2 —调整learning rate

最常见的优化算法之一是随机梯度下降(SGD)。SGD 中可以优化的超参数有learning ratemomentumdecaynesterov

Learning rate控制每批结束时的重量,而momentum控制前一次更新对当前重量更新的影响程度。Decay表示每次更新的学习率衰减,而nesterov根据我们是否要应用内斯特罗夫动量取值“真”或“假”。

这些超参数的典型值为 lr=0.01,衰变=1e-6,动量=0.9,nesterov=True。

学习率超参数进入optimizer函数,我们将在下面看到。Keras 在SGD优化器中有一个默认的学习率调度程序,它在随机梯度下降优化算法中降低学习率。学习率根据以下公式降低:

lr = lr×1/(1+衰变∫历元)

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

Source: http://cs231n.github.io/neural-networks-3

让我们在Keras中实现一个学习率适应计划。我们将从 SGD 和 0.1 的学习率值开始。然后,我们将训练 60 个时期的模型,并将衰减参数设置为 0.0016 (0.1/60)。我们还包括动量值 0.8,因为当使用自适应学习率时,它似乎工作得很好。

接下来,我们构建神经网络的架构:

我们现在可以运行模型,看看它的表现如何。这在我的机器上花了大约 20 分钟,可能快或慢,取决于你的机器。

在它完成运行后,我们可以为训练集和测试集绘制准确度和损失函数作为历元的函数,以查看网络的表现如何。

损失函数图如下所示:

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

Loss as a function of epochs.

这就是准确性:

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

我们现在来看看如何应用定制的学习率。

使用LearningRateScheduler应用自定义学习率变化

编写一个函数,执行指数学习率衰减,如下式所示:

𝑙𝑟=𝑙𝑟₀ × 𝑒^(−𝑘𝑡)

这与前面的类似,所以我将在一个代码块中完成,并描述不同之处。

我们在这里看到,这里唯一改变的是我们定义的exp_decay函数的出现及其在LearningRateScheduler函数中的使用。请注意,我们这次还选择在模型中添加了一些回调函数。

我们现在可以绘制学习率和损失函数,作为历元数的函数。学习率曲线非常平滑,因为它遵循我们预先定义的指数衰减函数。

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

与以前相比,损失函数现在看起来也更平滑了。

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

这向您展示了开发一个学习率调度器是提高神经网络性能的一个有用的方法。

步骤 3 —选择一个optimizer和一个loss function

当构建一个模型并使用它进行预测时,例如,为图像分配标签分数(“猫”、“飞机”等)。),我们想通过定义一个“损失”函数(或目标函数)来衡量自己的成败。优化的目标是有效地计算最小化该损失函数的参数/权重。keras提供各种类型的损失函数

有时“损失”函数度量“距离”我们可以用适合问题或数据集的各种方法来定义两个数据点之间的“距离”。使用的距离取决于数据类型和要解决的问题。例如,在自然语言处理(分析文本数据)中,汉明距离更为常见。

距离

  • 欧几里得的
  • 曼哈顿
  • 其他的,比如汉明,测量字符串之间的距离。“carolin”和“cathrin”的汉明距离是 3。

损失函数

  • MSE(用于回归)
  • 分类交叉熵(用于分类)
  • 二元交叉熵(用于分类)

步骤 4 —决定batch sizenumber of epochs

批量大小定义了通过网络传播的样本数量。

例如,假设您有 1000 个训练样本,您想要设置一个等于 100 的batch_size。该算法从训练数据集中获取前 100 个样本(从第 1 个到第 100 个)并训练网络。接下来,它获取第二个 100 个样本(从第 101 个到第 200 个)并再次训练网络。我们可以继续这样做,直到我们通过网络传播了所有的样本。

使用批量大小的优势< number of all samples:

  • It requires less memory. Since you train the network using fewer samples, the overall training procedure requires less memory. That’s especially important if you cannot fit the whole dataset in your machine’s memory.
  • Typically networks train faster with mini-batches. That’s because we update the weights after each propagation.

Disadvantages of using a batch size < number of all samples:

  • The smaller the batch, the less accurate the estimate of the gradient will be.

The 历元数是一个超参数,它定义了学习算法在整个训练数据集中工作的次数。

一个时期意味着训练数据集中的每个样本都有机会更新内部模型参数。一个时期由一个或多个批次组成。

对于选择批次大小或周期数没有硬性规定,也不能保证增加周期数会比减少周期数得到更好的结果。

步骤 5 —随机重启

这个方法在keras中似乎没有实现。这可以通过改变keras.callbacks.LearningRateScheduler很容易地做到。我将把这个留给读者做练习,但它本质上涉及到在指定数量的时期后,在有限的次数内重置学习率。

使用交叉验证调整超参数

现在,我们将使用 Scikit-Learn 的 GridSearchCV 为我们的超参数尝试几个值并比较结果,而不是手动尝试不同的值。

为了使用keras进行交叉验证,我们将使用 Scikit-Learn API 的包装器。它们提供了一种在 Scikit-Learn 工作流程中使用顺序 Keras 模型(仅单输入)的方法。

有两种包装器可用:

keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params),它实现了 Scikit-Learn 分类器接口,

keras.wrappers.scikit_learn.KerasRegressor(build_fn=None, **sk_params),实现 Scikit-Learn 回归器接口。

尝试不同的权重初始化

我们将尝试通过交叉验证优化的第一个超参数是不同权重初始化。

我们网格搜索的结果是:

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

我们看到,使用 lecun_uniform 初始化或 glorot_uniform 初始化的模型获得了最好的结果,并且我们可以使用我们的网络实现接近 97%的准确度。

将您的神经网络模型保存到 JSON

分层数据格式(HDF5)是一种数据存储格式,用于存储大型数据数组,包括神经网络中的权重值。

可以安装 HDF5 Python 模块:pip install h5py

Keras 允许您使用 JSON 格式描述和保存任何模型。

使用多个超参数进行交叉验证

通常,我们对查看单个参数如何变化不感兴趣,而是查看多个参数变化如何影响我们的结果。我们可以同时对多个参数进行交叉验证,有效地尝试它们的组合。

注意:神经网络中的交叉验证计算量很大。实验前先思考!将您正在验证的要素数量相乘,以查看有多少种组合。使用 k 折叠交叉验证来评估每个组合( k 是我们选择的参数)。

例如,我们可以选择搜索以下各项的不同值:

  • 批量
  • 时代数
  • 初始化模式

选择在字典中指定,并传递给 GridSearchCV。

我们现在将对batch sizenumber of epochsinitializer的组合进行网格搜索。

结束前的最后一个问题:如果我们必须在 GridSearchCV 中循环的参数和值的数量特别大,我们该怎么办?

这可能是一个特别麻烦的问题——想象一下,有五个参数被选择,而我们为每个参数选择了 10 个潜在值。这种独特组合的数量是 10⁵,这意味着我们必须训练数量多得离谱的网络。这样做是疯狂的,所以通常使用 RandomizedCV 作为替代。

RandomizedCV 允许我们指定所有的潜在参数。然后,对于交叉验证中的每个折叠,它选择一个随机的参数子集用于当前模型。最后,用户可以选择一组最佳参数,并将其用作近似解。

最终意见

感谢您的阅读,希望这篇文章对您有所帮助和启发。我期待着从读者那里听到他们对这个超参数调整指南的应用。本系列的下一篇文章将涵盖全连接神经网络的一些更高级的方面。

延伸阅读

深度学习课程:

面向 NLP:

以视觉为导向:

重要的神经网络文章:

如何将 R 包上传到 Artifactory

原文:https://towardsdatascience.com/simple-guide-to-uploading-packages-to-cran-repositothosted-by-artifactory-ef302db74d04?source=collection_archive---------29-----------------------

带截图的快速入门指南

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

Photo by Paul Hanaoka on Unsplash

工厂起重机

假设您想将您的 R 包上传到某个地方,以便其他人可以下载它们。一种简单的方法是使用 Artifactory 托管本地 CRAN 存储库。在下面的指南中,我将向您展示如何以最少的麻烦(主要是通过可视界面)自己完成这项工作,当然,当您想开始更多地自动化这项工作时,一切都是可以脚本化的。

步骤 0:安装 RStudio

这是标准的 IDE,所以您可能已经安装了它。如果没有,就在这里下载:【https://rstudio.com/T2

步骤 1:在 Artifactory 中创建 CRAN 存储库

在 web 浏览器中导航到 Artifactory UI,然后转到“管理”选项卡。

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

从那里,转到仓库、仓库、本地,然后选择起重机作为包类型。请记住您的回购的名称,因为您稍后将使用它来上传您的文件!如果您没有访问管理页面的权限,您可能需要请求您的 Artifactory 管理员为您创建 CRAN repo。更多信息可以看官方文档

步骤 1:创建您的 R 包

如果你发现这篇博文,你可能已经创建了 R 包,但是如果你还没有打包好,这里有一篇关于这个的经典博文:https://Hilary Parker . com/2014/04/29/writing-an-R-package-from-scratch/

步骤 2:构建您的包

一旦你有了你的 R 包,你应该用 RStudio 打开它。在这里,您可以打开 Rproj 文件,以便 RStudio 知道您正在构建一个包。

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

click on this file in the RStudio file browser

从“构建”菜单中选择“构建源代码包”。如果你有很多文件需要针对特定平台进行编译,那么你可以选择“构建二进制包”,但是你上传到 Artifactory 的时候就要输入相关数据了。此操作的结果将是一个压缩文件,然后您可以上传到您的 CRAN on Artifactory。

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

this is where the Build menu is

步骤 3:将包上传到 Artifactory

首先,使用 RStudio 找到您的包 tarball 是在哪里生成的。它应该位于包含您的软件包源代码的目录旁边。

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

the build window shows where the tar file is generated. it should be located in the parent directory of your package.

导航到您的 Artifactory web 应用程序。然后,在 Artifactory 上打开工件存储库窗口,并点击 deploy 按钮。

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

从“目标存储库”菜单中选择您的 CRAN repo。它应该显示为“包装类型:起重机”,如下所示。然后,选择您生成的包文件或将它拖到此窗口中。满意后点击部署。

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

this is what the deploy menu should look like before you add your package

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

this is what the deploy menu looks like after you add your package

现在,您应该能够在工件存储库浏览器的树浏览器视图中看到您的包。

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

you should be able to see your package in artifactory now

步骤 4:检查是否可以从工厂起重机安装

首先,您想通过运行remove.packages("sample.r.package")从 R 库中移除示例包。然后,您可以通过运行install.packages("sample.r.package", repos=c("http://my_artifactory.com/artifactory/my-cran/"))从本地 CRAN 安装它。希望一切都已正确安装,现在您可以与组织的其他成员共享您的软件包了!

恭喜你!您将第一个包上传到 Artifactory!

既然你已经有了自己的计划,世界就是你的了!告诉你公司的每个人你的软件包,他们可以很容易地安装它,而不必使用 devtools 。不错!

旅程的下一步是开始将二进制包上传到 Artifactory。这就是使用像 CRAN 这样的包管理器的真正优势所在,因为这意味着你的包的用户不必安装复杂的工具链来为他们自己的系统重新编译你的包。当你准备好采取下一步行动时,请点击这里的查看文档。

卷积神经网络简介

原文:https://towardsdatascience.com/simple-introduction-to-convolutional-neural-networks-cdf8d3077bac?source=collection_archive---------0-----------------------

在本文中,我将使用许多 swan 图片来解释卷积神经网络(CNN)的概念,并将使用 CNN 的常规多层感知器神经网络来处理图像。

图像分析

让我们假设我们想要创建一个能够识别图像中天鹅的神经网络模型。天鹅具有某些特征,可以用来帮助确定天鹅是否存在,例如它的长脖子、白色等等。

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

A swan has certain characteristic features that can be used for recognition purposes.

对于某些图像,可能更难确定是否存在天鹅,请看下图。

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

Harder to classify swan image.

这些特征在上面的图像中仍然存在,但我们更难挑出这些特征。让我们考虑一些更极端的情况。

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

Extreme cases of swan classification.

至少颜色是一致的吧?或者是…

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

Don’t forget about those black swans!

还能更糟吗?肯定可以。

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

Worst-case scenarios.

好了,天鹅的照片已经够多了。先说神经网络。我们一直在以一种非常天真的方式谈论检测图像中的特征。研究人员建立了多种计算机视觉技术来处理这些问题:筛选、快速、冲浪、摘要等。然而,类似的问题也出现了:探测器要么太普通,要么太复杂。人类正在设计这些特征检测器,这使得它们要么过于简单,要么难以推广。

  • 如果我们学会了检测特征会怎么样?
  • 我们需要一个可以进行表征学习(或者特征学习)的系统。

表征学习是一种允许系统自动找到给定任务的相关特征的技术。取代手动特征工程。有几种技术可以做到这一点:

  • 无监督的(K 均值、主成分分析等)
  • 监督(Sup。字典学习,神经网络!)

传统神经网络的问题

我将假设你已经熟悉传统的神经网络称为多层感知器(MLP)。如果您对这些不熟悉,Medium 上有数百个概述 MLP 如何工作的教程。这些都是在人脑上模拟的,神经元受到连接节点的刺激,只有当达到某个阈值时才会被激活。

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

A standard multilayer perceptron (traditional neural network).

MLP 有几个缺点,尤其是在图像处理方面。MLP 为每个输入使用一个感知器(例如,图像中的像素,在 RGB 情况下乘以 3)。对于大图像,权重的数量很快变得难以管理。对于具有 3 个颜色通道的 224 x 224 像素图像,大约有 150,000 个权重必须被训练!因此,在训练和过度配合时会出现困难。

另一个常见的问题是 MLP 对输入(图像)及其平移版本的反应不同,它们不是平移不变的。例如,如果一张图片中的图像的左上方出现了一只猫,而另一张图片的右下方出现了一只猫,则 MLP 会尝试自我纠正,并假设图像的这一部分中总会出现一只猫。

显然,MLP 不是图像处理的最佳选择。一个主要问题是当图像被展平为 MLP 时,空间信息丢失。靠近的节点很重要,因为它们有助于定义图像的特征。因此,我们需要一种方法来利用图像特征(像素)的空间相关性,这样无论猫出现在哪里,我们都可以在照片中看到它。在下图中,我们正在学习多余的功能。这种方法并不可靠,因为猫可能会以另一种姿势出现。

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

A cat detector using an MLP which changes as the position of the cat changes.

进入卷积神经网络

我希望这个案例清楚地说明为什么 MLP 是一个用于图像处理的糟糕想法。现在让我们继续讨论如何使用 CNN 来解决我们的大部分问题。

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

CNN’s leverage the fact that nearby pixels are more strongly related than distant ones.

我们用一种叫做过滤器的东西来分析附近像素的影响。一个过滤器就是你所想的那样,在我们的情况下,我们采用一个由用户指定大小的过滤器(一个经验法则是 3x3 或 5x5 ),我们将它从左上向右下移动穿过图像。对于图像上的每个点,使用卷积运算基于过滤器计算一个值。

过滤器可以与任何东西相关,对于人类的图片,一个过滤器可以与看到的鼻子相关联,我们的鼻子过滤器会给我们一个指示,即鼻子在我们的图像中出现的强度,以及出现的次数和位置。与 MLP 相比,这减少了神经网络必须学习的权重数量,也意味着当这些特征的位置改变时,它不会扰乱神经网络。

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

The convolution operation.

如果您想知道网络如何学习不同的特征,以及网络是否有可能学习相同的特征(拥有 10 个鼻子过滤器有点多余),这是非常不可能发生的。在构建网络时,我们随机指定过滤器的值,然后随着网络的训练,过滤器不断更新自身。除非选择的过滤器数量非常大,否则生产出两个相同的过滤器是非常不可能的。

下面是一些过滤器的例子,我们称之为内核。

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

Examples of kernel filters for CNN’s.

在滤波器通过图像之后,为每个滤波器生成特征图。然后通过激活函数获取这些图像,激活函数决定某个特征是否出现在图像中的给定位置。然后我们可以做很多事情,例如添加更多的过滤层和创建更多的特征地图,随着我们创建更深的 CNN,这些变得越来越抽象。我们还可以使用合并图层来选择要素地图上的最大值,并将其用作后续图层的输入。理论上,任何类型的操作都可以在池化图层中完成,但在实践中,仅使用最大池化,因为我们希望找到异常值-这些是我们的网络看到的要素!

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

An example CNN with two convolutional layers, two pooling layers, and a fully connected layer which decides the final classification of the image into one of several categories.

只是重申一下我们目前的发现。我们知道 MLP:

  • 不适合图像缩放
  • 忽略像素位置和与邻居的相关性带来的信息
  • 无法处理翻译

CNN 的总体想法是智能地适应图像的属性:

  • 像素位置和邻域具有语义含义
  • 感兴趣的元素可以出现在图像中的任何地方

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

Comparison of architecture for MLP and CNN.

CNN 也是由层组成的,但这些层并不完全相连:它们有过滤器,即应用于整个图像的立方体形状的权重集。滤波器的每个 2D 切片被称为内核。这些过滤器引入了平移不变性和参数共享。它们是如何应用的?回旋!

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

Example of how convolutions are applied to images using kernel filters.

现在的一个好问题是图像的边缘会发生什么?如果我们在普通图像上应用卷积,结果将根据滤波器的大小进行一定量的下采样。如果我们不想让这种情况发生,我们该怎么做?我们可以用衬垫。

填充

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

Illustration of how full padding and same padding are applied to CNN’s.

填充本质上使得由滤波器核产生的特征图与原始图像具有相同的大小。这对于深度 CNN 非常有用,因为我们不希望输出减少,这样我们在网络的末端只剩下一个 2×2 的区域来预测我们的结果。

我们如何将过滤器连接在一起?

如果我们有许多特征地图,如何在我们的网络中组合这些地图以帮助我们获得最终结果?

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

为了清楚起见,每个过滤器都与整个 3D 输入立方体进行卷积,但会生成 2D 要素地图。

  • 因为我们有多个过滤器,我们最终得到一个 3D 输出:每个过滤器一个 2D 要素地图
  • 从一个卷积层到下一个卷积层,特征映射维度可能会发生巨大变化:如果一个层有 128 个滤波器,我们可以以 32x32x16 的输入进入该层,以 32x32x128 的输出退出。
  • 用滤波器对图像进行卷积产生特征图,该特征图突出了图像中给定特征的存在。

在卷积层中,我们基本上是在图像上应用多个滤波器来提取不同的特征。但最重要的是,我们正在学习那些过滤器!我们遗漏了一件事:非线性。

介绍 ReLU

CNN 最成功的非线性是整流非线性单元(ReLU ),它解决了 sigmoids 中出现的梯度消失问题。ReLU 更容易计算并产生稀疏性(并不总是有益的)。

不同层的对比

卷积神经网络中有三种类型的层:卷积层、池层和全连接层。这些图层中的每一个都有不同的参数可以优化,并对输入数据执行不同的任务。

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

Features of a convolutional layer.

卷积层是对原始图像或深层 CNN 中的其他特征地图应用过滤器的层。这是网络中大多数用户指定参数的位置。最重要的参数是颗粒的数量和颗粒的大小。

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

Features of a pooling layer

池层类似于卷积层,但它们执行特定的功能,如最大池(在某个过滤区域取最大值)或平均池(在某个过滤区域取平均值)。这些通常用于降低网络的维度。

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

Features of a fully connected layer.

完全连接的图层位于 CNN 的分类输出之前,用于在分类之前展平结果。这类似于 MLP 的输出图层。

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

The architecture of a standard CNN.

CNN 层学什么?

  • CNN 的每一层都学习越来越复杂的过滤器。
  • 第一层学习基本的特征检测过滤器:边缘、拐角等
  • 中间层学习检测物体部分的过滤器。对于面部,他们可能会学会对眼睛、鼻子等做出反应
  • 最后一层有更高的表现:他们学习识别不同形状和位置的完整物体。

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

Examples of CNN’s trained to recognize specific objects and their generated feature maps.

要看 CNN 实际工作的 3D 例子,请点击下面的链接这里

时事通讯

关于新博客文章和额外内容的更新,请注册我的时事通讯。

[## 时事通讯订阅

丰富您的学术之旅,加入一个由科学家,研究人员和行业专业人士组成的社区,以获得…

mailchi.mp](https://mailchi.mp/6304809e49e7/matthew-stewart)

神经网络导论

原文:https://towardsdatascience.com/simple-introduction-to-neural-networks-ac1d7c3d7a2c?source=collection_archive---------2-----------------------

神经网络的详细概述,有大量的例子和简单的图像。

“你的大脑不会制造思想。你的思想塑造了神经网络。” —狄巴克·乔布拉

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

本文是旨在揭开神经网络背后的理论以及如何设计和实现它们的系列文章中的第一篇。这篇文章旨在对神经网络进行详细而全面的介绍,面向广泛的个人:对神经网络如何工作知之甚少或一无所知的人,以及相对精通其用途但可能不是专家的人。在这篇文章中,我将涵盖神经网络的动机和基础知识。未来的文章将深入探讨关于神经网络和深度学习的设计和优化的更详细的主题。

这些教程主要基于哈佛和斯坦福大学计算机科学和数据科学系的课堂笔记和例子。

我希望你喜欢这篇文章,并且不管你以前对神经网络的理解如何,都能学到一些东西。我们开始吧!

神经网络的动机

未经训练的神经网络模型很像新生婴儿:他们生来对世界一无所知(如果考虑 tabula rasa 认识论的话),只有通过接触世界,即后验知识,他们的无知才会被慢慢修正。算法通过数据体验世界——通过在相关数据集上训练神经网络,我们试图减少它的无知。我们衡量进度的方法是监控网络产生的错误。

在深入研究神经网络世界之前,了解这些网络背后的动机以及它们为什么工作是很重要的。要做到这一点,我们必须谈一谈逻辑回归。

定量响应变量(如出租车接送数量、自行车租赁数量)的建模和预测为中心的方法被称为回归(以及岭、套索等。).当响应变量为分类时,则该问题不再被称为回归问题,而是被标记为分类问题。

让我们考虑一个二元分类问题。目标是尝试根据一组预测变量将每个观察值分类到由 Y 定义的类别(如类或聚类)中。

假设我们希望根据患者的特征来预测患者是否患有心脏病。这里的响应变量是分类的,有有限的结果,或者更明确地说,是二元的,因为只有两个类别(是/否)。

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

这里有很多特性—现在,我们将只使用 MaxHR 变量。

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

为了进行这种预测,我们将使用一种称为逻辑回归的方法。逻辑回归解决了在给定输入值 X 的情况下,估计某人患有心脏病的概率 P(y=1) 的问题。

逻辑回归模型使用一个名为逻辑函数的函数来模拟 P(y=1) :

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

因此,模型将使用一条 S 形曲线预测 P(y=1) ,这是逻辑函数的一般形状。

*β₀ 将曲线向左或向右移动*c =β₀/β₁,β₁ 控制 S 形曲线的陡度。

请注意,如果 β₁ 为正,则预测的 P(y=1) 从小值 X 的零变为大值 X 的一,如果 β₁ 为负,则具有相反的关联。

这在下面用图表进行了总结。

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

既然我们已经了解了如何操作我们的逻辑回归曲线,我们可以利用一些变量来得到我们想要的曲线。

我们可以改变 β₀ 值来移动我们的偏移量。

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

我们可以改变 β₁ 值来扭曲我们的渐变。

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

手动完成这项工作非常繁琐,而且不太可能收敛到最佳值。为了解决这个问题,我们使用损失函数来量化属于当前参数的误差水平。然后我们找到最小化这个损失函数的系数。对于这种二元分类,我们可以使用二元损失函数来优化我们的逻辑回归。

因此,神经网络的参数与网络产生的误差有关系,当参数改变时,误差也会改变。我们使用一种叫做梯度下降的优化算法来改变参数,这种算法对于寻找函数的最小值很有用。我们正在寻求最小化误差,这也被称为损失函数目标函数

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

那么我们刚才做的有什么意义呢?这和神经网络有什么关系?实际上,我们刚刚做的基本上是由神经网络算法执行的相同程序。

我们在之前的模型中只使用了一个特性。取而代之的是,我们可以采用多种特征,并以网络格式来说明这些特征。我们有每个特征的权重,也有一个偏差项,它们共同构成了我们的回归参数。根据问题是分类问题还是回归问题,表述会略有不同。

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

当我们谈论神经网络中的权重时,我们讨论的是我们各种输入函数的这些回归参数。然后将其传递给一个激活函数,该函数决定结果是否足够重要,足以“触发”该节点。我将在下一篇文章中更详细地讨论不同的激活函数。

所以现在我们开发了一个非常简单的网络,它由具有四个特征的多重逻辑回归组成。

我们需要从一些任意的值公式开始,以便开始更新和优化参数,这将通过在每次更新后评估损失函数并执行梯度下降来完成。

我们做的第一件事是设置随机选择的权重。最有可能的是,它会表现得很糟糕——在我们的心脏数据中,模型会给我们错误的答案。

然后,我们通过惩罚表现不佳的网络来“训练”它。

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

然而,仅仅告诉计算机它的性能是好是坏并没有特别的帮助。您需要告诉它如何更改这些权重,以提高模型的性能。

我们已经知道如何告诉计算机它运行良好,我们只需要参考我们的损失函数。现在,程序变得更加复杂,因为我们要处理 5 个砝码。我将只考虑一个重量,但所有重量的程序都是类似的。

理想情况下,我们想知道给出最小 ℒ (w)的 w 的值。

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

为了找到函数ℒ(w)的最佳点,我们可以对权重进行微分,然后将其设置为零。**

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

然后,我们需要找到满足该等式的 w 。有时没有明确的解决方案。

比较灵活的方法是从任意一点出发,然后确定往哪个方向走可以减少损失(本例中是向左还是向右)。具体来说,我们可以计算函数在这一点的斜率。如果斜率为负,我们向右移动,如果斜率为正,我们向左移动。然后重复这个过程,直到收敛。

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

如果步长与斜率成比例,则可以避免超过最小值。

我们如何执行此更新?这是用梯度下降法来完成的,这在前面已经简单提到过了。

梯度下降

梯度下降是一种寻找函数最小值的迭代方法。梯度下降有各种风格,我将在后续文章中详细讨论这些。这篇博文介绍了更新权重的不同方法。现在,我们将坚持传统的梯度下降算法,有时被称为德尔塔法则

我们知道,我们想要朝着导数的相反方向前进(因为我们试图“远离”误差),我们知道我们想要做出与导数成比例的一步。这一步由称为学习率的参数λ控制。我们的新权重是旧权重和新步长的相加,其中步长是从损失函数和我们的相关参数在影响学习速率中的重要程度(因此是导数)导出的。

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

一个大的学习率意味着更多的权重放在导数上,这样算法的每次迭代都可以进行大的步骤。较小的学习速率意味着导数的权重较小,因此每次迭代的步长较小。

如果步长太小,算法将需要很长时间才能收敛,如果步长太大,算法将不断错过最佳参数选择。显然,在建立神经网络时,选择学习速率可能是一个重要的参数。

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

梯度下降有各种考虑因素:

  • 我们仍然需要求导。
  • 我们需要知道学习率是多少,或者如何设置。
  • 我们需要避免局部最小值。
  • 最后,完整的损失函数包括所有单个“误差”的总和。这可以是几十万个例子。

现在求导是用自动微分来完成的,所以我们不太关心这个。然而,决定学习速率是一个重要而复杂的问题,我将在后面的系列教程中讨论。

局部最小值对于神经网络来说可能是非常成问题的,因为神经网络的公式不能保证我们将达到全局最小值。

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

Source

陷入局部最小值意味着我们的参数有一个局部好的优化,但在我们的损失面上有一个更好的优化。神经网络损失曲面可能具有许多这样的局部最优值,这对网络优化是有问题的。例如,参见下图所示的损失面。

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

Example neural network loss surface. Source

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

Network getting stuck in local minima.

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

Network reach global minima.

我们如何解决这个问题?一个建议是使用批量和随机梯度下降。这个想法听起来很复杂,但很简单——使用一批(子集)数据,而不是整个数据集,这样损失面在每次迭代过程中会部分变形。

对于每次迭代 k ,以下损失(可能性)函数可用于导出导数:

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

这是全损失函数的近似值。我们可以用一个例子来说明这一点。首先,我们从完全损失(可能性)表面开始,我们随机分配的网络权重为我们提供了初始值。

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

然后,我们选择一批数据,可能是整个数据集的 10%,并构建一个新的损失面。

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

然后,我们对该批次执行梯度下降,并执行我们的更新。

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

我们现在在一个新的地方。我们选择完整数据集的一个新的随机子集,并再次构建我们的损失面。

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

然后,我们对该批次执行梯度下降,并执行我们的更新。

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

我们用新的子集再次继续这个过程。

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

执行我们的更新。

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

这个过程持续多次迭代。

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

直到网络开始收敛到全局最小值。

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

我们的工具包中现在有足够的知识来着手建立我们的第一个神经网络。

人工神经网络

既然我们了解了逻辑回归是如何工作的,我们如何评估我们网络的性能,以及我们如何更新网络以提高我们的性能,我们就可以着手建立一个神经网络了。

首先,我想让我们明白神经网络为什么叫神经网络。你可能听说过这是因为它们模仿了神经元的结构,神经元是大脑中存在的细胞。神经元的结构看起来比神经网络复杂得多,但功能是相似的。

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

Source

实际神经元的工作方式涉及电势的积累,当超过特定值时,会导致突触前神经元穿过轴突放电,并刺激突触后神经元。

人类有数十亿相互连接的神经元,可以产生极其复杂的放电模式。与我们能够做到的相比,人脑的能力是不可思议的,甚至与最先进的神经网络相比也是如此。由于这个原因,我们可能不会很快看到神经网络模仿人脑的功能。

我们可以画一个神经图,把神经网络中的神经元结构和人工神经元进行类比。

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

Source

鉴于人类大脑的能力,应该很明显,人工神经网络的能力在范围上是相当无限的——特别是一旦我们开始将这些与传感器、致动器以及互联网的财富联系起来——这解释了它们在世界上无处不在,尽管事实上我们正处于它们发展的相对初期阶段。

毕竟,还原论者可能会认为人类只不过是通过神经系统的各个部分连接到传感器和执行器的神经网络的集合。

现在让我们想象我们有多种特征。每个特征都要经过一种叫做仿射变换的东西,这基本上是一种加法(或减法)和/或乘法。这给了我们一个类似回归方程的东西。在多层感知器中,当多个节点汇聚到一个节点时,仿射变换就变得很重要。

然后,我们通过激活函数传递这个结果,这给了我们某种形式的概率。这个概率决定了神经元是否会触发——我们的结果可以插入到我们的损失函数中,以评估算法的性能。

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

从现在开始,我将把仿射块和激活块抽象成一个块。然而,要清楚的是,仿射变换是来自上游节点的输出的合并,然后求和的输出被传递到激活函数,该函数评估概率以确定它是否是足以使神经元激活的量化值(概率)。

我们现在可以回到第一个例子,看看我们的心脏病数据。我们可以将两个逻辑回归合并在一起。个体逻辑回归看起来像下面的情况:

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

当我们连接这两个网络时,由于增加了自由度,我们获得了具有增加的灵活性的网络。

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

这很好地说明了神经网络的力量,我们能够将多个函数串在一起(求和),这样,通过大量的函数——这些函数来自大量的神经元——我们能够产生高度非线性的函数。有了足够大的一组神经元,就可以产生任意复杂的连续函数。

这是一个非常简单的神经网络的例子,然而,我们看到,即使是这样一个简单的网络,我们也已经遇到了问题。我们应该如何更新我们的权重值?

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

我们需要能够计算损失函数相对于这些权重的导数。为了学习缺失的权重,w₁、w₂和 w₃,我们需要利用反向传播。

反向传播

反向传播是神经网络学习的中心机制。它是告诉网络网络在预测过程中是否犯了错误的信使。反向传播的发现是整个神经网络研究中最重要的里程碑之一。

**传播就是在特定的方向或通过特定的媒介传递某种东西(如光、声)。当我们在神经网络的上下文中讨论反向传播时,我们谈论的是信息的传输,并且该信息与神经网络在对数据进行猜测时产生的误差有关。

在预测过程中,神经网络通过网络节点向前传播信号,直到信号到达做出决策的输出层。然后,网络通过网络反向传播关于该错误的信息,从而可以改变每个参数。

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

Source

反向传播是我们计算网络中每个参数的导数的方法,这是执行梯度下降所必需的。这是一个重要的区别,因为很容易混淆反向传播和梯度下降。首先执行反向传播,以便获得执行梯度下降所需的信息。

你可能已经注意到了,我们仍然需要计算导数。计算机不能区分,但可以建立一个函数库来做到这一点,而不需要网络设计人员参与,它为我们抽象了这个过程。这就是所谓的自动微分。下面是一个例子。

我们可以像这样手动完成,然后针对每个网络架构和每个节点进行更改。

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

或者我们可以编写一个函数库,该函数库与体系结构有着内在的联系,这样,当网络体系结构更新时,该过程就会被抽象出来并自动更新。

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

如果你真的想了解这种抽象的自动微分过程有多有用,请尝试制作一个具有半打节点的多层神经网络,并编写代码来实现反向传播(如果有人有耐心和勇气做到这一点,那么向你致敬)。

更复杂的网络

具有两个节点的网络对于大多数应用来说不是特别有用。通常,我们使用神经网络来逼近传统方法难以描述的复杂函数。

神经网络很特别,因为它们遵循一种叫做 的通用近似定理 。该定理指出,给定神经网络中无限数量的神经元,可以精确地表示任意复杂的连续函数。这是一个相当深刻的声明,因为它意味着,给定足够的计算能力,我们可以近似任何函数。

显然,在实践中,这个想法有几个问题。首先,我们受到现有数据的限制,这限制了我们预测类别或估计值的潜在准确性。其次,我们受到计算能力的限制。设计一个远远超过世界上最强大的超级计算机能力的网络是相当容易的。

诀窍是设计一种网络架构,使我们能够使用相对较少的计算能力和最少的数据实现高精度。

更令人印象深刻的是,一个隐藏层足以表示任意精度的任何函数的近似值。

那么如果一层就够了,为什么人们还要用多层神经网络呢?

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

A neural architecture with multiple hidden layers.

答案很简单。该网络将需要具有非常宽的神经架构,因为浅网络比深网络需要(指数地)更多的宽度。此外,浅网络对过度拟合具有更高的亲和力。

这就是为什么深度学习领域存在(深度指的是神经网络的多层)并主导机器学习和大多数涉及数据分类和预测的领域的当代研究文献背后的刺激因素。

摘要

本文讨论了神经网络的动机和背景,并概述了如何训练它们。我们讨论了损失函数、误差传播、激活函数和网络架构。下图很好地总结了所有讨论的概念以及它们是如何相互联系的。

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

Neural networks step-by-step. Source

这篇文章中的知识将为我们提供一个强大的基础,我们可以在未来的文章中讨论如何提高神经网络的性能并将其用于深度学习应用。

时事通讯

关于新博客文章和额外内容的更新,请注册我的时事通讯。

* [## 时事通讯订阅

丰富您的学术之旅,加入一个由科学家,研究人员和行业专业人士组成的社区,以获得…

mailchi.mp](https://mailchi.mp/6304809e49e7/matthew-stewart)

参考文献

J.《数值最优化》,施普林格,1999 年

TLDR: J. Bullinaria,“用动量学习,共轭梯度学习”,2015*

Numpy 中从头开始的简单线性回归

原文:https://towardsdatascience.com/simple-linear-regression-from-scratch-in-numpy-871335e14b7a?source=collection_archive---------10-----------------------

线性回归很可能是你已经学会的,或者打算学习的第一个“机器学习”算法。这是一个简单的算法,最初是在统计领域开发的,并作为理解输入和输出变量之间关系的模型进行研究。

顾名思义,它是一个线性模型,因此它假设输入变量()X)和单个(【连续】)输出变量( y )之间是线性关系。更准确地说, y 可以从输入变量的线性组合中计算出来。

在只有一个输入变量的情况下,该方法被称为简单线性回归,这将是本文的主题。你可以说在现实世界中你有不止一个输入变量,这是真的,但是从基础开始总是一个好主意。

线性方程为每个输入值分配一个比例因子,称为系数,通常用希腊字母 Beta ( β )表示。增加了一个系数,给线一个额外的自由度(向上或向下移动线),称为截距或偏差系数

简单的线性回归可以表示为:

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

如果你有一个以上的输入变量,回归“线”将被称为一个平面或超平面。此外,不用说,你会有更多的β系数,每一个乘以一定的输入值。如果β系数为零,它告诉你那个位置的变量对模型没有影响。

学习一个线性回归模型意味着用你现有的数据来估计表示中使用的系数的值。

线性回归的假设

准备用于线性回归的数据时,您应该记住以下几点:

  1. 线性假设 —模型假设变量之间的关系是线性的
  2. 无噪声 —模型假设输入和输出变量没有噪声——因此,如果可能的话,移除异常值
  3. 无共线性-当输入变量高度相关时,模型会过度拟合
  4. 正态分布-如果输入和输出变量呈正态分布,模型将做出更可靠的预测。如果不是这样,试着对你的变量进行一些变换,使它们看起来更正常
  5. 重定标输入 —使用定标器或规格化器进行更可靠的预测

贝塔系数公式

在简单线性回归中,有两个系数——β0 和β1。它们不一定要‘学习’,你可以通过一个简单的公式计算出来(仅用于简单的线性回归):

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

可以手工计算,也可以用 Python 计算。我会用 Python。

数据集介绍

我决定不从网上下载任意的数据集,而是自己制作。它由 300 个任意点组成:

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

快速散点图将揭示变量之间清晰的线性趋势:

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

现在,您可以将 xy 插入上面的公式中。首先,我将计算β1 系数:

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

这并不难。β0 或偏差系数的计算将更加简单:

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

仅此而已。你现在可以做预测了。为此,我决定声明一个函数,calc _ predictions(),它将接受 x 项作为输入。然后,您可以轻松计算预测值:

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

现在那些 y_preds 可以用来绘制回归线:

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

那才叫爽。 快也。但是你现在可能想知道,有没有更简单快捷的方法来计算系数?

更简单的方法

你不必使用上面的公式来获得系数,有一个更短的方法。还涉及到公式的用法,不过要短很多。偏差截距的公式保持不变,但β1 的公式发生了变化:

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

下面是用 Python 实现它的方法:

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

请注意您必须如何使用数组索引来获得相关系数,您的任务是探索如果不使用它会发生什么。
你可以看到系数值和之前计算的一样,所以一切正常(万岁)。

模型评估

评估一个回归模型的方法有很多,但我会用 均方根误差 。计算方法如下:

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

其中 Pi 为预测值。

要在 Python 中使用它,有两个选项:

  1. 从 Scikit 中导入 MSE 学习并求它的平方根
  2. 从头开始写

我将使用第二个选项,因为计算非常简单:

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

现在可以对模型进行评估:

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

最后的话

该说再见了。这是一篇相当短的文章,但是我想说这是线性回归的一个很好的介绍。稍后,我将从头开始发表一篇关于多元线性回归的文章,它在现实世界中有实际应用,因为您的数据集可能有多个输入变量。

在此之前,尝试在您的数据集上使用这些方程,然后尝试将结果与 Scikit-Learn 的线性回归进行比较。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

机器学习完全入门指南:简单线性回归四行代码!

原文:https://towardsdatascience.com/simple-linear-regression-in-four-lines-of-code-d690fe4dba84?source=collection_archive---------1-----------------------

一个清晰而全面的蓝图,绝对适合任何想要构建简单机器学习模型的人

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

甚至你可以建立一个机器学习模型。

说真的!

仅有好的数据并不能说明全部情况。你是想根据一个人多年的经验来计算他的工资应该是多少吗?你需要检查相对于你的年销售额你在广告上花了多少钱吗?线性回归可能正是你所需要的!

GIF via GIPHY

什么是线性回归?

线性回归着眼于您拥有的数据和您想要预测的数据之间的关系。

线性回归是一种基本且常用的预测分析类型。这是所有统计技术中应用最广泛的。它量化了一个或多个预测变量和一个结果变量之间的关系。

线性回归模型用于显示(或预测)两个变量或因素之间的关系。回归分析常用于显示两个变量之间的相关性。

例如,您可以查看棒球队球员的一些信息,并预测他们在该赛季的表现。你可能想研究一家公司的一些变量,并预测他们的股票走势。你甚至可能只想检查人们学习的小时数和他们在考试中的表现,或者你可以查看学生的家庭作业总成绩与他们在考试中表现的关系。这是一个非常有用的技术!

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

Photo by StockSnap via Pixabay

只要记住:相关不等于因果!两个变量之间存在关系并不意味着一个变量导致了另一个变量!回归分析不用于预测因果关系。它可以观察变量之间的关系。它可以检查变量之间的关联程度。这取决于你来仔细看看那些关系。

几个重要术语:

您的线性回归模型中的方程预测的变量称为因变量。我们称之为 y。用于预测因变量的变量称为**自变量。**我们称之为 X

你可以认为预测( y )依赖于其他变量( X )。这使得 y 成为因变量!

简单线性回归分析中,每个观察值由两个变量组成。这些是自变量和因变量。多元回归分析着眼于两个或更多的自变量,以及它们如何与自变量相关联。描述 y 如何与 X 相关的等式被称为回归模型

回归最早是由兴趣广泛的弗朗西斯·高尔顿爵士深入研究的。虽然他是一个非常有问题的角色,有很多值得反对的信仰,但他确实写了一些关于治疗枪伤和让你的马从流沙中脱离的很酷的信息的书。他还在指纹、听力测试方面做了一些有益的工作,甚至设计了第一张天气图。他于 1909 年被封为爵士。

在研究植物和动物中父母和孩子相对大小的数据时,他观察到,比一般人大的父母有比一般人大的孩子,但这些孩子在他们自己的一代中的相对位置会小一些。他称之为回归平庸。用现代术语来说,这将是向平均值的回归。

(然而,我不得不说,“回归平庸”这句话有一定的闪光点,我需要把它融入我的日常生活…)

GIF via GIPHY

不过,要明确的是,我们谈论的是期望(预测)而不是绝对确定性!

回归模型有什么好处?

回归模型用于预测真实值,例如工资或身高。如果你的自变量是时间,那么你就是在预测未来值。否则,您的模型预测的是当前未知的值。回归技术的例子包括:

  • 简单回归
  • 多次回归
  • 多项式回归
  • 支持向量回归

假设您正在查看一些数据,其中包括员工的工作年限和工资。你应该看看这两个数字之间的相关性。也许你正在经营一家新企业或小公司,这些数字是随机设定的。

那么你如何找到这两个变量之间的相关性呢?为了搞清楚这一点,我们将创建一个模型,告诉我们什么是这种关系的最佳拟合线。

直觉

这里有一个简单的线性回归公式:

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

(你可能认为这是高中代数中的斜率或趋势线方程。)

在这个等式中, y 是因变量,这就是你要解释的。在本文的其余部分, y 将是员工在一定工作年限后的工资。

可以看到上面的自变量。这是与你的预测值变化相关的变量。自变量可能引起变化,或者只是与变化有关。记住,线性回归不能证明因果关系

这个系数就是你如何解释自变量的变化可能不完全等于 y 的变化。

现在我们想看看证据。我们想在我们的数据中画一条最适合我们的数据的线。回归线可以显示正线性关系(该线看起来向上倾斜)、负线性关系(该线向下倾斜)或完全没有关系(一条平线)。

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

该常数是直线与纵轴相交的点。例如,如果你在下图中看到 0 年的工作经验,你的工资大约是 30,000 美元。所以下图中的常数大约是 30,000 美元。

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

坡度越陡,你多年的经验得到的钱就越多。例如,也许多一年的经验,你的工资(y)会额外增加 10,000 美元,但如果斜率更大,你可能会得到 15,000 美元。如果斜率为负,随着经验的积累,你实际上会赔钱,但我真的希望你不要在那家公司工作太久…

简单线性回归怎么找到那条线?

当我们看一张图表时,我们可以从这条线到我们的实际观察值画出垂直线。您可以将实际观察值视为点,而线条显示模型观察值(预测值)。

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

我们画的这条线是员工实际收入和他的模型(预测)收入之间的差异。我们将查看最小平方和以找到最佳直线,这意味着您将获得所有平方差的总和并找到最小值。

那叫普通最小二乘法法!

那么我们该怎么做呢?

首先是进口货!

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

现在让我们预处理我们的数据!如果你不太了解数据清理和预处理,你可能想看看这篇文章。它将引导您完成导入库、准备数据和要素缩放。

[## 数据清理和预处理完全初学者指南

如何在几分钟内为机器学习模型成功准备数据

towardsdatascience.com](/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d)

我们将复制并粘贴那篇文章中的代码,并做两处微小的修改。当然,我们需要更改数据集的名称。然后我们来看一下数据。在我们的例子中,假设我们的员工有一列年资和一列薪水,仅此而已。请记住,我们的索引从 0 开始,我们将继续从因变量的数据中分离出最后一列,就像我们已经设置的那样。然而,这一次,我们将获取自变量的第二列,所以我们将做一个小的改变来获取它。

dataset = pd.read_csv('salary.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values

现在 X 是一个特征矩阵(我们的自变量), y 是因变量的向量。完美!

是时候将我们的数据分成训练集和测试集了。通常,我们会对我们的训练和测试数据进行 80/20 分割。然而,在这里,我们使用的是一个只有 30 个观察值的小数据集。也许这一次我们将拆分我们的数据,这样我们就有 20 个训练观察和 10 个测试规模。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)

你有 X_train,X_test,y_train,y_test!你已经准备好了!(永远不要忘记,在这个过程的每一步,都有大约一百万件事情需要学习、改变和改进。你的模型的力量取决于你和你投入的一切!)

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

Photo by Thomas William on Unsplash

我们将随机状态设置为 0,这样我们可以得到相同的结果。(计算中可能会有随机因素,我想确保我们都在同一页上,这样就没有人会紧张。)

我们将在训练集上训练我们的模型,然后根据我们的信息预测结果。我们的模型将学习训练集上的相关性。然后,我们将通过让它用我们的测试集预测值来测试它学到了什么。我们可以将我们的结果与测试集上的实际结果进行比较,看看我们的模型做得如何!

A 总是把你的数据分成训练集和测试集!如果你用你用来训练它的相同数据来测试你的结果,你可能会有非常好的结果,但是你的模型并不好!它只是记住了你想让它做的事情,而不是学习任何可以用于未知数据的东西。那叫过度拟合,也就是说你没有造好模型

特征缩放

我们实际上不需要在这里做任何功能缩放!

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

Photo by Gift Habeshaw on Unsplash

线性回归

现在我们可以让模型适合我们的训练集了!

为此,我们将使用 Scikit-learn learn。首先,我们将导入线性模型库和线性回归类。然后,我们将创建该类的一个对象—回归量。我们将使用一种方法(fit 方法)来使我们创建的回归对象适合训练集。为了创建对象,我们给它命名,然后用括号调用它。我们可以用大约三行代码完成所有这些工作!

让我们从 Scikit-Learn 导入线性回归,以便我们可以继续使用它。在括号之间,我们将指定我们想要使用的数据,以便我们的模型确切地知道我们想要拟合什么。我们希望获得 X_train 和 y_train,因为我们正在处理所有的训练数据。

如果你想了解更多的细节,你可以看看文档。

现在,我们准备创建我们的回归变量,并使其适合我们的训练数据。

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

在那里!我们对数据使用简单的线性回归,并准备在测试集上测试我们的预测能力!

这是机器学习!我们创造了一台机器,回归器,我们让它在训练集上学习多年经验和薪水之间的关系。

现在,它可以根据已有的信息预测未来的数据。我们的机器已经准备好根据一个新员工的工作经验来预测他的工资了!

让我们用回归量来预测新的观察结果。我们想通过观察新的观察来了解机器是如何学习的。

我们将创建一个预测值的向量。这是因变量的预测向量,我们称之为 y_pred。为此,我们可以使用我们创建和训练的回归变量,并使用 predict 方法。我们需要指定要进行哪些预测,因此我们希望确保包含测试集。对于 regressor.predict 中的输入参数,我们希望指定新观测值的特征矩阵,因此我们将指定 X_test。

y_pred = regressor.predict(X_test)

说真的。那只需要一行代码!

现在,y_test 是测试集中 10 个观察值的实际工资,y_pred 是我们的模型预测的这 10 个雇员的预测工资。

你做到了!四行代码的线性回归!

GIF via GIPHY

形象化

让我们把结果可视化吧!我们需要看看我们的预测和实际结果之间有什么区别。

我们可以绘制图表来解释结果。首先,我们可以使用 plt.scatter 绘制真实的观察值,以制作散点图。(我们之前导入 matplotlib.pyplot 为 plt)。

我们将首先查看训练集,因此我们将在 X 坐标上绘制 X_train,在 y 坐标上绘制 y_train。那么我们可能想要一些颜色。我们用蓝色表示我们的观察,用红色表示我们的回归线(预测)。对于回归线,我们将再次对 X 坐标使用 X_train,然后使用 X_train 观测值的预测。

让我们用 x 轴和 y 轴的标题和标签来稍微想象一下。

plt.scatter(X_train, y_train, color = 'blue')
plt.plot(X_train, regressor.predict(X_train), color = 'red')
plt.title('Salary vs Experience (Training set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

现在我们可以看到我们的蓝点,它们是我们的真实值和我们沿着红线的预测值!

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

让我们对测试集做同样的事情!我们将更改测试集的标题,并将代码中的“train”改为“test”。

plt.scatter(X_test, y_test, color = 'blue')
plt.plot(X_train, regressor.predict(X_train), color = 'red')
plt.title('Salary vs Experience (Test set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

请务必注意,我们没有在第二行中将 X_train 更改为 X_test。我们的回归变量已经被训练集训练过了。当我们训练时,我们得到了一个唯一的模型方程。如果我们替换它,我们会得到相同的线,我们可能会建立相同回归线的新点。

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

这是一个相当不错的模型!

我们的模型很好地预测了这些新员工的工资。一些实际观察和预测是一样的,这很好。在 yX 变量之间没有 100%的相关性,所以一些预测不会完全准确。

你做到了!您导入了库,清理并预处理了数据,构建并训练了一个简单的线性回归器,用它来进行预测,甚至还可视化了结果!

恭喜你!!!

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

Photo by Free-Photos via Pixabay

想要更多吗?

接下来是多元线性回归

[## 机器学习完全初学者指南:4 行代码中的多元线性回归!

征服多元线性回归的基础(和向后消除!)并用你的数据预测未来!

towardsdatascience.com](/multiple-linear-regression-in-four-lines-of-code-b8ba26192e84)

继续学习!

机器学习建立在统计学的基础上,如果没有简单的线性回归等概念,你就无法开始理解机器学习。但这并不意味着统计学和机器学习是一回事!除了作为机器学习的基本构件的一部分之外,线性回归器在很大程度上是统计学(和数据科学)的工具。

如果你有兴趣了解更多关于统计学和机器学习之间的差异,我推荐你看看马修·斯图尔特博士研究员写的这篇精彩的文章!他很好地阐明了这些概念,我强烈推荐你花些时间通读他的文章。

[## 统计学和机器学习的实际区别

不,它们不一样。如果机器学习只是被美化的统计学,那么建筑学只是被美化了…

towardsdatascience.com](/the-actual-difference-between-statistics-and-machine-learning-64b49f07ea3)

和往常一样,如果你用这些信息做了什么很酷的事情,请在下面的回复中让人们知道,或者随时在 LinkedIn 上联系。

你可能也想看看这些文章:

[## Git 和 GitHub 入门:完全初学者指南

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…

towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6) [## 如何用 GitHub 毫不费力地免费创建一个网站

GitHub Pages 入门:创建和发布免费作品集的快速简便指南…

towardsdatascience.com](/how-to-create-a-free-github-pages-website-53743d7524e1) [## Google Colab 入门

沮丧和困惑的基本教程

towardsdatascience.com](/getting-started-with-google-colab-f2fff97f594c) [## 深度学习简介

新手、新手和新手的神经网络。

towardsdatascience.com](/intro-to-deep-learning-c025efd92535) [## WTF 是图像分类?

为好奇和困惑征服卷积神经网络

towardsdatascience.com](/wtf-is-image-classification-8e78a8235acb) [## 如何构建准确率高于 97%的图像分类器

清晰完整的成功蓝图

medium.freecodecamp.org](https://medium.freecodecamp.org/how-to-build-the-best-image-classifier-3c72010b3d55) [## 出色的模型部署初学者指南

一个清晰简单的路线图,让你的机器学习模型在互联网上,做一些很酷的事情

heartbeat.fritz.ai](https://heartbeat.fritz.ai/brilliant-beginners-guide-to-model-deployment-133e158f6717)

感谢阅读!

Python 中的简单线性回归

原文:https://towardsdatascience.com/simple-linear-regression-in-python-8cf596ac6a7c?source=collection_archive---------11-----------------------

一个带有简化解释的机器学习模型…

Video version of the story, if you are into that sort of thing | Performed by the author

简单线性回归是一种寻找两个连续变量之间关系的统计方法。在现有的两个变量中,一个是自变量,另一个是因变量。统计关系在确定两个变量之间的关系时不准确。比如身高和体重的关系。

这种关系是由著名的线方程定义的,你们在高中应该学过。

y = b0 + b1x*

在哪里,

y 是因变量

x 是自变量

b0 是关系的基值

b1 是解释 y & x. 关系的直线的斜率

例如,y 指的是一个人的工资如何随着他所拥有的经验年限而变化。因此,在这种情况下,工资将是因变量,经验将是自变量,基本价值将是一个没有经验的人的工资。在我们的代码示例中,我们将处理这样的数据集。

为了确定什么是最佳拟合线,让我们看看下面的曲线。

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

带有红叉的点是实际或真实的数据点,而带有绿叉的点是回归模型的预测值。这里的目标是建立这样一个回归模型,使得误差平方和最小。

I 导入数据集并进行数据预处理

今天,我们进入代码的数据集。我们有一个业务问题,一家公司希望在员工的工资和他们的经验之间建立一种关系。我们将使用简单的线性回归来研究这种相关性。

简单的线性回归会告诉我们这种关系的最佳拟合线是什么。让我们来看看数据集。你可以点击下载数据集。

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

我们的数据由总共 30 个对象和两个属性组成, 年经历薪水 。属性years experience是独立属性,属性 Salary 是从属属性。

我将使用 Spyder 来编写这个机器学习模型。在进入模型的回归部分之前,我们需要对数据集执行数据预处理。我将直接为其编写代码,但是如果您想了解更多,请访问下面的文章。

概念性数据预处理文章:

[## 数据挖掘和机器学习中的数据预处理

有了详细的概念…

towardsdatascience.com](/data-preprocessing-in-data-mining-machine-learning-79a9662e2eb)

编程数据预处理文章:

[## Python 中的数据预处理

对于机器学习与工作代码的例子…

towardsdatascience.com](/data-preprocessing-in-python-b52b652e37d5)

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd# Importing the dataset
dataset = pd.read_csv('SimpleLinearRegression.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)

执行完这段代码后,我们将训练集和测试集分别与独立属性和从属属性的数组和向量分开。它们应该是这样的:

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

将数据集拟合到简单的线性回归模型中

在中,为了使数据适合我们的回归模型,我们需要导入一个库,调用回归方法,并使我们的训练数据适合该回归模型。我们的做法如下:

# Fitting Simple Linear Regression to the Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

由于我们的机器学习模型已经知道了我们的训练集的相关性,我们现在将预测我们的测试集的值,然后稍后将它们与测试集的实际值进行比较。

为了预测测试集的值,我们需要编写以下代码:

# Predicting the Test set results
y_pred = regressor.predict(X_test)

在执行完代码之后,我们可以手动查看预测的测试集值和实际的测试集值,看看它们有什么不同。

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

如您所见,这些值互不相同。一些具有非常低的差异,如第 4 个条目,而一些具有稍高的差异,如第 8 个条目。

可视化数据集中的相关性

在中,为了判断数据之间的实际相关性,我们将绘制两条曲线。

  • 可视化训练集结果

我们使用以下代码来实现这一点:

# Visualising the Training set results
plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience (Training set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

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

可以看出,这里的线并没有那么差,因为只有几个点离它很远,大多数点都在线的周围。

  • 可视化测试集结果

我们使用以下代码来实现这一点:

# Visualising the Test set results
plt.scatter(X_test, y_test, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience (Test set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

这里,关于为什么在plt.plot(X_train, regressor.predict(X_train), color = 'blue')X_testregressor.predict()的参数没有被改变,可能存在混淆。这是因为,如果我们这样做,我们将得到一个新的行,但我们希望将我们的测试集与我们从训练集中得到的行进行比较。曲线看起来会像这样:

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

这里可以看到,10 个数据点中有 5 个数据点位于直线上。10 分中有 3 分非常接近终点线,10 分中只有 2 分稍微远一点。

这篇关于 Python 中用于机器学习建模的简单线性回归的文章到此结束。

我将免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。

如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中收到我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。

[## 加入我的推荐链接-塔伦古普塔

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)

感谢阅读。如果你喜欢这个,可以看看我的其他帖子:

[## 标记故事列表的快速链接—感谢您的访问

我也有一份以快节奏出版为目标的出版物。读书成为作家。

tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)

评估下一次加密投资的简单方法

原文:https://towardsdatascience.com/simple-method-to-assess-your-next-crypto-investment-9443f56ee4bf?source=collection_archive---------5-----------------------

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

Photo by Quantitatives on Unsplash

在本帖中,我们将使用 Python 研究加密货币市场的相关性,以分析和可视化这些市场是如何发展的,并为更深入的分析提供一个基础框架。

不熟悉加密?你可以找到一篇关于区块链技术、加密货币以及它们与中本聪创新的关系的精彩概述。

TLDR:评估各种加密货币之间的相关性和趋势,以了解:

  • 哪些硬币可以帮助分散你的投资组合:硬币之间通常有很强的相关性,因此很难分散风险(购买和持有比特币是一种安全的押注)。
  • 稳定的硬币实际上是稳定的吗:一般来说,它们似乎与比特币价格波动无关。
  • 如果有可能预测下一轮牛市:最多投机。然而,2019 年底看起来与 2015 年、2016 年和 2017 年相似……准备好装满你的袋子吧。

注:所有用于分析的代码都可以在我的 github 页面 上找到,数据来自 coinmarketcap.com,2014 - 2019 年市值排名前 100 的加密货币。

时间序列价格数据的相关性分析?

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

Image by the author | Price trend for 10 random coins from 2014 to 2019

从上图可以看出,一般来说,每个硬币的趋势似乎是相关的。然而,众所周知,直接在非平稳时间序列数据上计算相关性会给出有偏相关值。因此,每日百分比变化用于评估相关性。以下是市值最高的 20 种硬币价格变化的相关性。

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

Image by the author | Correlation of the price change of the current top 20 coins by market cap in 2015

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

Image by the author | Correlation of the price change of the top 20 coins by market cap in 2019

总的来说,市值排名前 20 位的加密货币有三个主要趋势:

  • 所有稳定硬币(一种与法定货币或其他商品挂钩的加密货币,如与美元挂钩的系绳)和 Ravencoin 与比特币和其他替代硬币的价格变化百分比的相关性非常低。
  • 如下图所示,这种相关性有逐年增加的总体趋势。
  • 目前排名前 20 的硬币中只有 45%是 5 年前的。

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

Image by the author | Density plot of the correlation of the top 20 coins from 2014 to 2019

哪些硬币有助于分散你的投资组合?

值得注意的是,几乎所有的加密货币都变得更加相互关联。实际上,投资股市时,拥有多样化的投资组合可以降低风险。然而,拥有一个前 20 名硬币的多元化投资组合,并不具有与交易股票相同的效果。

足够有趣的是,Ravencoin,这是比特币的一个分支,增加了资产发行的功能,而 transfer 与比特币和前 20 名中的大部分 altcoins 的相关性非常低。我不确定这样做的原因,但它肯定是值得关注的硬币之一。

此外,虽然比特币、以太币和莱特币在过去 5 年中一直排名前 5,但进一步评估其他硬币进入前 20 的驱动因素(技术、营销、创新、用例)将是有趣的。然而,这超出了本文的范围。

你稳定吗兄弟?

稳定的硬币,如系绳,似乎与比特币价格的波动无关。稳定的硬币有助于消除对转换率的怀疑,使加密货币更适合购买商品和服务。这是因为基础资产与比特币不相关。然而,对稳定硬币的主要批评(除了那些集中的),是证明用于支持稳定硬币的商品/法定货币的数量,反映了稳定硬币的流通供给。

月亮什么时候出现(我们能预测下一次牛市吗)?

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

Image by the author | Bitcoin price grouped by months from 2014 to 2019

这种分析在很大程度上是推测性的,并且是基于上面的箱线图,在过去的 6 年里按月分组。在 2015 年、2016 年和 2017 年,我们看到比特币价格在第 6 个月和第 7 个月左右飙升,之后我们看到年底出现牛市。

同样,2014 年和 2018 年非常相似,第 5 个月和第 6 个月出现增长,但接下来的几个月增长缓慢,预示着市场看跌。

对于 2019 年,如果 8 月份看起来像 7 月份一样强劲,根据 2015 年、2016 年和 2017 年的趋势,我们可能会迎来另一轮牛市,打破以前的纪录。

我们应该在什么时候看到这些高点…下面的直方图显示,比特币高点往往发生在 12 月和 1 月(由这几个月的大量异常值表示)。

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

Image by the author | Box plot of Bitcoin price grouped by months from 2014 to 2019

接下来呢?

在这一分析的基础上,还可以做更多的事情。我想到的几个例子是:

  • 使用来自流行交换的 API 来获得最新的设置。
  • 添加市值和交易量等其他指标来丰富分析。
  • 添加一些基于 google tends 或 twitter feed 分析的情绪分析来预测未来价格。
  • 训练一个预测机器学习模型来预测未来价格。

感谢您的阅读,希望这能激发您对该领域的兴趣。欢迎建设性的反馈,如果你发现代码有问题,你可以在 Github repo 这里提出问题。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值