使用机器学习预测天气(第三部分神经网络)

使⽤机器学习预测天⽓(第三部分神经⽹络)
振镜概述诺基亚9500
这是使⽤机器学习预测平均⽓温系列⽂章的最后⼀篇⽂章了,作为最后⼀篇⽂章,我将使⽤google的开源机器学习框架tensorflow来构建⼀个神经⽹络回归器。关于tensorflow的介绍、安装、⼊门,请⾃⼰google,这⾥就不做讲述。
这篇⽂章我主要讲解⼀下⼏点:
了解⼈⼯神经⽹络理论 tensorflow⾼级API:Estimators
构建DNN模型预测天⽓
⼈⼯神经⽹络基础理论
上⼀篇⽂章主要讲解了如何构建线性回归模型(这是最基础的机器学习算法)来预测内布拉斯加州林肯市每天的平均⽓温。线性回归模型⾮常有效,并且可以被⽤于数值化(⽐如分类)、预测(⽐如预测天⽓)。线性回归算法也⽐较与局限性,它要求数据之间具有线性关系。 针对于⾮线性关系的场景,数据挖掘和机器学习有数不清的算法来处理。近些年最⽕的要数神经⽹络算法了,它可以处理机器学习领域的好多问
题。神经⽹络算法具备线性和⾮线性学习算法的能⼒。   神经⽹络受到⼤脑中的⽣物神经元的启发,它们在复杂的交互⽹络中⼯作,根据已经收集的信息的历史来传输,收集和学习信息。我们感兴趣的计算神经⽹络类似于⼤脑的神经元,因为它们是接收输⼊信号(数字量)的神经元(节点)的集合,处理输⼊并将处理后的信号发送给其他下游代理 ⽹络。 信号作为通过神经⽹络的数字量的处理是⼀个⾮常强⼤的特征,不限于线性关系。   在这个系列中,我⼀直关注⼀种称为监督学习的特定类型的机器学习,也就说说训练的数据结果是已知的,根据历史已知的输⼊和输出,预测未来的输⼊对应的输出。 此外,预测的类型是数值的真实值,这意味着我们使⽤的是回归预测算法。   从图形上看,类似于本⽂中描述的神经⽹络如图:
上⾯描述的神经⽹络在最左边包含⼀个输⼊层,即图中的x1和x2,这两个特征是神经⽹络输⼊值。这两个特征被输⼊到神经⽹络中,通过被称为隐藏层的两层神经元进⾏处理和传输。这个描述显⽰了两个隐藏层,每层包含三个神经元(节点)。 该信号然后离开神经⽹络,并作为单个数值预测值汇总在输出层。 让我花⼀点时间来解释箭头背后的含义,箭头表⽰数据在层间从⼀个节点到另⼀个节点的传输处理。 每个箭头代表⼀个数值的数学变换,从箭头的底部开始,然后乘以特定于该路径特定的权重。 ⼀个图层中的每个节点将以这种⽅式得到⼀个值。 然后汇总所有在节点收敛的值。 这个就是我之前提到的神经⽹络的线性操作。
在每个节点上进⾏求和之后,将⼀个特殊的⾮线性函数应⽤到总和上,这在上⾯的图像中被描述为Fn
(...)。 这种将⾮线性特征引⼊神经⽹络的特殊功能称为激活功能。 激活函数所带来的这种⾮线性特性赋予了多层神经⽹络以其功能。 如果不是将⾮线性加⼊到过程中,则所有层都将有效地代数地组合成⼀个常数运算,其中包括将输⼊乘以某个平坦系数值(即线性模型)。 好吧,这⼀切都很好,但是这怎么转化为学习算法呢? 那么最直接的答案就是评估正在进⾏的预测,即模型“y”的输出,到实际预期值(⽬标),并对权重进⾏⼀系列调整,以改善整体 预测准确性。   在回归机器学习算法的世界中,通过使⽤成本(⼜名“损失”或“客观”)函数(即平⽅误差之和(SSE))评估准确性。 请注意,我把这个声明推⼴到整个机器学习的连续体,⽽不仅仅是神经⽹络。 在前⾯的⽂章中,普通最⼩⼆乘算法完成了这⼀⼯作,它发现了使误差平⽅和(即最⼩⼆乘)最⼩化的系数组合。   我们的神经⽹络回归器会做同样的事情。 它将迭代训练数据提取特征值,计算成本函数(使⽤SSE),并以最⼩化成本函数的⽅式调整权重。 通过算法迭代推送特征的过程和评估如何根据成本函数来调整权重。   模型优化算法在构建鲁棒神经⽹络中⾮常重要。 例如通过⽹络体系结构(即宽度和深度)馈送,然后根据成本函数进⾏评估,调整权重。 当优化器函数确定权重调整不会导致成本函数计算代价的变化,该模型被认为是“学习”。
TensorFlow Estimator API
tensorflow由好⼏个部分组成,其中最常⽤的是Core API,它为⽤户提供了⼀套低级别的API来定义和训练使⽤符号操作的任何机器学习算法。这也是TensorFlow的核⼼功能,虽然Core API能应对⼤多数
的应⽤场景,但我更关注Estimator API。   TensorFlow团队开发了Estimator API,使⽇常开发⼈员可以更⽅便地使⽤该库。这个API提供了训练模型、评估模型、以及和Sci-Kit库相似的对未知数据的预测接⼝,这是通过实现各种算法的通⽤接⼝来实现的。另外,构建在⾼级API中的是机器学习最佳实践,抽象和可伸缩性的负载。   所有这些机器学习的优点使得基础Estimator类中实现的⼀套⼯具以及多个预先封装的模型类型,降低了使⽤TensorFlow的⼊门门槛,因此可以应⽤于⽇常问题。通过抽象出诸如编写训练循环或处理会话之类的问题,开发⼈员能够专注于更重要的事情,如快速尝试多个模型和模型架构,以到最适合他们需要的模型。 在这篇⽂章中,我将介绍如何使⽤⾮常强⼤的深度神经⽹络估计器之⼀DNN Regressor。
建⽴⼀个DNNRegressor来预测天⽓
我们先导⼊⼀些我们需要⽤到的库。
我们来处理⼀下数据,所有的数据我都放在了Github上,⼤家可以去查阅clone。
请注意,我们刚刚记录下了1000个⽓象数据记录,并且所有的特征都是数字性质的。 另外,由于我们在第⼀篇⽂章中的努⼒⼯作,所有记录都是完整的,因为它们不缺少任何值(没有⾮空值)。   现在我将删除“mintempm”和“maxtempm”这两列,因为它们对帮助我们预测平均温度毫⽆意义。 我们正在试图预测未来,所以我们显然不能掌握有关未来的数据。 我还将从⽬标(y)中分离出特征(X)。
和所有监督机器学习应⽤程序⼀样,我将把我的数据集分成训练集和测试集。 但是,为了更好地解释训练这个神经⽹络的迭代过程,我将使⽤⼀个额外的数据集,我将其称为“验证集合”。 对于训练集,我将利⽤80%的数据,对于测试和验证集,它们将分别为剩余数据的10%。为了分解这些数据,我将再次使⽤Scikit Learn 库的train_test_split()函数。
构建神经⽹络模型时要采取的第⼀步是实例化tf.estimator.DNNRegressor()类。类的构造函数有多个参数,但我将重点关注以下参数: feature_columns:⼀种类似列表的结构,包含要输⼊到模型中的要素的名称和数据类型的定义
hidden_units:⼀个类似列表的结构,包含神经⽹络数量宽度和深度的定义
optimizer:tf.Optimizer⼦类的⼀个实例,在训练期间优化模型的权重;它的默认值是AdaGrad优化器。
activation_fn:激活功能,⽤于在每⼀层向⽹络引⼊⾮线性;默认是ReLU
model_dir:要创建的⽬录,其中包含模型的元数据和其他检查点保存 我将⾸先定义⼀个数字特征列的列表。要做到这⼀点,我使⽤
tf.feature_column.numeric_column()函数返回⼀个FeatureColumn实例。
使⽤定义的特性列,我现在可以实例化DNNRegressor类并将其存储在回归变量中。 我指定我想要⼀个有两层深度的神经⽹络,其中两层的宽度都是50个节点。 我还指出,我希望我的模型数据存储在⼀个名为tf_wx_model的⽬录中。
接下来我想要做的是定义⼀个可重⽤的函数,这个函数通常被称为“输⼊函数”,我将调⽤wx_input_fn()。 这个函数将被⽤来在训练和测试阶段将数据输⼊到我的神经⽹络中。有许多不同的⽅法来建⽴输⼊函数,但我将描述如何定义和使⽤⼀个基于
tf.estimator.inputs.pandas_input_fn(),因为我的数据是在⼀个pandas数据结构。
请注意,这个wx_input_fn()函数接受⼀个必选参数和四个可选参数,然后将这些参数交给TensorFlow输⼊函数,专门⽤于返回的pandas数据。 这是TensorFlow API⼀个⾮常强⼤的功能。函数的参数定义如下:
X:输⼊要输⼊到三种DNNRegressor接⼝⽅法中的⼀种(训练,评估和预测)
y:X的⽬标值,这是可选的,不会被提供给预测调⽤
num_epochs:可选参数。 当算法在整个数据集上执⾏⼀次时,就会出现⼀个新纪元。
shuffle:可选参数,指定每次执⾏算法时是否随机选择数据集的批处理(⼦集)
batch_size:每次执⾏算法时要包含的样本数
通过定义我们的输⼊函数,我们现在可以训练我们基于训练数据集上的神经⽹络。 对于熟悉TensorFlow⾼级API的读者,您可能会注意到我对⾃⼰的模型的培训⽅式有点不合常规。⾄少从TensorFlow⽹站上的当前教程和⽹络上的其他教程的⾓度来看。通常情况下,您将看到如下所⽰的内容。
然后,作者将直接展⽰evaluate()函数,并且⼏乎没有提⽰它在做什么或为什么存在这⼀⾏代码。
在此之后,假设所有的训练模型都是完美的,他们会直接跳到执⾏predict()函数。
我希望能够提供⼀个合理的解释,说明如何训练和评估这个神经⽹络,以便将这个模型拟合或过度拟合到训练数据上的风险降到最低。因此,我们不再拖延,让我定义⼀个简单的训练循环,对训练数据进⾏训练,定期对评估数据进⾏评估。
上⾯的循环迭代了100次。 在循环体中,我调⽤了回归器对象的train()⽅法,并将其传递给了我的可重⽤的
柳永雨霖铃赏析wx_input_fn(),后者⼜通过了我的训练功能集和⽬标。 我有意地将默认参数num_epochs等于None,基本上这样说:“我不在乎你通过训练集多少次,只是继续训练算法对每个默认batch_size 400
”(⼤约⼀半的训练 组)。 我还将shuffle参数设置为默认值True,以便在训练时随机选择数据以避免数据中的任何顺序关系。 train()⽅法的最后⼀个参数是我设置为400的步骤,这意味着训练集每个循环将被批处理400次。 这给了我⼀个很好的时间以更具体的数字来解释⼀个epoch的意义。 回想⼀下,当⼀个训练集的所有记录都通过神经⽹络训练⼀次时,就会出现⼀个epoch。 所以,如果我们的训练集中有⼤约800(准确的说是797)个记录,并且每个批次选择400个,那么每两个批次我们就完成了⼀个时间。 因此,如果我们遍历整个训练集100个迭代400个步骤,每个批次⼤⼩为400(每个批次的⼀个半个时间),我们得到:
现在你可能想知道为什么我为循环的每次迭代执⾏和evaluate()⽅法,并在列表中捕获它的输出。 ⾸先让我解释⼀下每次train()⽅法被触发时会发⽣什么。它随机选择⼀批训练记录,并通过⽹络推送,直到做出预测,并为每条记录计算损失函数。 然后根据计算出的
损失根据优化器的逻辑调整权重,这对于减少下⼀次迭代的整体损失的⽅向做了很好的调整。 ⼀般⽽⾔,只要学习速率⾜够⼩,这些损失值随着时间的推移⽽逐渐下降。   然⽽,经过⼀定数量的这些学习迭代之后,权重开始不仅受到数据整体趋势的影响,⽽且还受到⾮实际的噪声在所有实际数据中的继承。 在这⼀点上,⽹络受到训练数据特性的过度影响,并且变得⽆法推⼴关于总体数据的预测。这与我之前提到的⾼级TensorFlow API许多其他教程不⾜之处有关。 在训练期间周期性地打破这⼀点⾮常重要,并评估模型如何推⼴到评估或验证数据集。 通过查看第⼀个循环迭代的评估输出,让我们
花些时间看看evaluate()函数返回的结果。
现在你可能想知道为什么我为循环的每次迭代执⾏和evaluate()⽅法,并在列表中捕获它的输出。 ⾸先让我解释⼀下每次train()⽅法被触发时会发⽣什么。它随机选择⼀批训练记录,并通过⽹络推送,直到做出预测,并为每条记录计算损失函数。 然后根据计算出的损失根据优化器的逻辑调整权重,这对于减少下⼀次迭代的整体损失的⽅向做了很好的调整。 ⼀般⽽⾔,只要学习速率⾜够⼩,这些损失值随着时间的推移⽽逐渐下降。   然⽽,经过⼀定数量的这些学习迭代之后,权重开始不仅受到数据整体趋势的影响,⽽且还受到⾮实际的噪声在所有实际数据中的继承。 在这⼀点上,⽹络受到训练数据特性的过度影响,并且变得⽆法推⼴关于总体数据的预测。这与我之前提到的⾼级TensorFlow API许多其他教程不⾜之处有关。 在训练期间周期性地打破这⼀点⾮常重要,并评估模型如何推⼴到评估或验证数据集。 通过查看第⼀个循环迭代的评估输出,让我们花些时间看看evaluate()函数返回的结果。
从上⾯的图表看来,在所有这些迭代之后,我并没有过度配置模型,因为评估损失从来没有呈现出朝着增加价值的⽅向的显着变化。现在,我可以安全地继续根据我的剩余测试数据集进⾏预测,并评估模型如何预测平均天⽓温度。   与我已经演⽰的其他两种回归⽅法类似,predict()⽅法需要input_fn,我将使⽤可重⽤的wx_input_fn()传递input_fn,将测试数据集交给它,将num_epochs指定为None,shuffle为False,因此它将依次送⼊所有的数据进⾏测试。   接下来,我做⼀些从predict()
⽅法返回的dicts迭代的格式,以便我有⼀个numpy的预测数组。然后,我使⽤sklearn⽅法explain_variance_score(),mean_absolute_error()和
median_absolute_error()来预测数组,以测量预测与已知⽬标y_test的关系。
我已经使⽤了与上⼀篇⽂章有关的线性回归技术相同的指标,以便我们不仅可以评估这个模型,还可以对它们进⾏⽐较。 正如你所看到的,这两个模型的表现相当类似,更简单的线性回归模型略好⼀些。然⽽,你可以通过修改学习速率,宽度和深度等参数来优化机器学习模型。
总结
本⽂演⽰了如何使⽤TensorFlow⾼级API Estimator⼦类DNNRegressor。并且,我也描述了神经⽹络理论,他们是如何被训练的,以及在过程中认识到过度拟合模型的危险性的重要性。   为了演⽰这个建⽴神经⽹络的过程,我建⽴了⼀个模型,能够根据本系列第⼀篇⽂章收集的数字特征预测第⼆天的平均温度。写这些⽂章的⽬的不是为了建⽴⼀个⾮常好的模型预测天⽓,我的⽬标是: 演⽰从数据收集,数据处理,探索性数据分析,模型选择,模型构建和模型评估中进⾏分析(机器学习,数据科学,⽆论...)项⽬的⼀般过程。 演⽰如何使⽤两个流⾏的Python库StatsModels和Scikit Learn来选择不违反线性回归技术关键假设的有意义的功能。 演⽰如何使⽤⾼级别的TensorFlow API,并直观地了解所有这些抽象层下正在发⽣的事情。 讨论与过度拟合模型相关的问题。 解释试验多个模型类型以战地进行曲
简并引物最好地解决问题。
延伸推荐
点击关键词阅读更多新书: Python|机器学习|Kotlin|Java|移动开发|机器⼈|有奖活动|Web前端|书单
一氧化二氮在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提⽰获取赠书链接,免费得异步图书⼀本。赶紧来参加哦! 点击阅读原⽂,查看本书更多信息 扫⼀扫上⽅⼆维码,回复“关注”参与活动! 本⽂摘⾃异步社区,点击下⽅阅读原⽂查看详情

本文发布于:2024-09-21 21:45:49,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/413136.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   模型   训练   学习
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议