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

概述
??这是使用机器学习预测平均气温系列文章的最后一篇文章了,作为最后一篇文章,我将使用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()函数返回的结果。

正如你所看到的,它输出的是平均损失(均方误差)和训练中的步骤的总损失(平方误差和),这一步是第400步。 在训练有素的网络中,你通常会看到一种趋势,即训练和评估损失或多或少地平行下降。 然而,在某个时间点的过度配置模型中,实际上在过拟合开始出现的地方,验证训练集将不再看到其evaluate()方法的输出降低。 这是你想停止进一步训练模型的地方,最好是在变化发生之前。 ??现在我们对每个迭代都有一个评估集合,让我们将它们作为训练步骤的函数来绘制,以确保我们没有过度训练我们的模型。 为此,我将使用matplotlib的pyplot模块中的一个简单的散点图。


?从上面的图表看来,在所有这些迭代之后,我并没有过度配置模型,因为评估损失从来没有呈现出朝着增加价值的方向的显着变化。现在,我可以安全地继续根据我的剩余测试数据集进行预测,并评估模型如何预测平均天气温度。 ??与我已经演示的其他两种回归方法类似,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门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!
点击阅读原文,查看本书更多信息
扫一扫上方二维码,回复“关注”参与活动!
本文摘自异步社区,点击下方阅读原文查看详情

原文地址:http://blog.51cto.com/13127751/2060361

时间: 2024-08-28 18:35:00

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

机器学习进化史:从线性模型到神经网络

[深度]机器学习进化史:从线性模型到神经网络 本文作者:天诺 2015-05-05 16:54 导语:Reza Zadeh是斯坦福大学工程计算和数学研究所顾问教授,他主要专注于机器学习理论和应用,分布式计算.如果你对人工智能感兴趣,那他讲述的机器学习进化史你一定要看. Reza Zadeh是斯坦福大学工程计算和数学研究所顾问教授,也是Databricks公司技术顾问,他主要专注于机器学习理论和应用,分布式计算,以及离散应用数学.近日,他接受了oreilly网站的采访,尝试谈论了人工智能的各方面.

从软件工程的角度写机器学习6——深度学习之卷积神经网络(CNN)实现

卷积神经网络(CNN)实现 背景 卷积神经网络广泛用于图像检测,它的实现原理与传统神经网络基本上是一样的,因此将普遍意义的神经网络和卷积神经网络的实现合成一篇. 神经网络实现思路 "扔掉神经元" 尽管所有教程在介绍神经网络时都会把一大堆神经元画出来,并且以输入节点--神经元--输出结点连线,但是,在编程实现时,基于神经元去编程是低效的.典型如这篇经典文章里面的代码: http://blog.csdn.net/zzwu/article/details/575125. 比较合适的方法是将神

一文学会机器学习预测流程(电信客户流失率问题)

摘要: 本文介绍了如何把机器学习算法应用到具体问题中. 以电信运营商客户流失率问题为例,从问题的提出, 数据的分析, 算法的评估, 到最终的结果展示, ,一步步介绍机器学习基本流程. 用户数据来源于互联网. 1 定义问题 客户流失率问题是电信运营商面临得一项重要课题,也是一个较为流行的案例.根据测算,招揽新的客户比保留住既有客户的花费大得多(通常5-20倍的差距).因此,如何保留住现在的客户对运营商而言是一项非常有意义的事情. 本文希望通过一个公开数据的客户流失率问题分析,能够带着大家理解如何应

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

《机器学习导论》第三章 贝叶斯决策定理 学习笔记

在机器学习领域,我们碰到的第一个问题就是:如何选择特征量. 可是看了一些资料,这点好像都是一笔带过,因为很多都是所谓的不可观测量,如何把不可观测量量化呢?这个或许能给机器学习带来新的契机,就像当年牛顿把力.质量.加速度等模糊的概念定义下来,经典物理出现了前所未有的发展,香农把信息量化,造就了信息革命. 以前觉得贝叶斯好像没有大家说的那么神奇,现在知道,是因为当年对它的理解就有问题,贝叶斯更重要的一点应该是能够在加入evidence的情况下,从先验概率进化到后验概率,这点简直就是机器学习的内涵啊

位置预测系列(三)

What's Your Next Move: User Activity Prediction in Location-based Social Networks 这篇文章来自于SDM'13年(SIAM InternationalConference on Data Mining 2013)的录用论文集,是关于在基于位置社交网络里面(LBSN)进行用户签到预测的.本文解决问题的角度很创新,并没有直接入手于用户签到预测问题,而是先预测用户的下一个签到活动类型,然后在此基础上,再预测用户的下一个签到

ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法

ng机器学习视频笔记(三) --线性回归的多变量.特征缩放.标准方程法 (转载请附上本文链接--linhxx) 一.多变量 当有n个特征值,m个变量时,h(x)= θ0+θ1x1+θ2x2-+θnxn,其中可以认为x0=1.因此,h(x)= θTx,其中θ是一维向量,θ=[θ0, θ1-θn] T,x也是一维向量,x=[x0,x1..xn] T,其中x0=1. 二.特征缩放(Feature Scaling) 特征缩放的目的,是为了让每个特征值在数量上更加接近,使得每个特征值的变化的影响相对比较"

分享《Python机器学习—预测分析核心算法》高清中文版PDF+高清英文版PDF+源代码

下载:https://pan.baidu.com/s/1sfaOZmuRj14FWNumGQ5ahw 更多资料分享:http://blog.51cto.com/3215120 <Python机器学习-预测分析核心算法>高清中文版PDF+高清英文版PDF+源代码高清中文版,338页,带目录和书签,文字能够复制粘贴.高清英文版,361页,带目录和书签,文字能够复制粘贴.中英文两版对比学习.配套源代码.经典书籍,讲解详细. 其中,高清中文版如图所示: 原文地址:http://blog.51cto.c

《Python机器学习—预测分析核心算法》高清中文版PDF+高清英文版PDF+源代码

资源链接:https://pan.baidu.com/s/1J61jH-fqwGceoId6F8mr5Q<Python机器学习-预测分析核心算法>高清中文版PDF+高清英文版PDF+源代码高清中文版,338页,带目录和书签,文字能够复制粘贴.高清英文版,361页,带目录和书签,文字能够复制粘贴.中英文两版对比学习.配套源代码.经典书籍,讲解详细.其中,高清中文版如图所示: 原文地址:http://blog.51cto.com/14063572/2317037