在深入研究神经网络和深度学习模型之前,我们来看一看逻辑回归,它可以被看作是单层神经网络,甚至逻辑回归中通常使用的Sigmoid函数也被用作神经网络中的激活函数。
2.1.1做好准备逻辑回归是用于二分类/序数(离散的顺序)类别分类的监督机器学习方法。
2.1.2怎么做逻辑回归作为复杂神经网络模型的一个构建块,使用Sigmoid作为激活函数。逻辑函数(或Sigmoid)可表示如下:
前面的Sigmoid函数形成一个连续的曲线,其值为[0,1],如图2-1所示。
图2-1
逻辑回归模型的表达式可以写成如下:
此处,W是和X=[
]特征相关的权重,且b是模型的截距,也称为模型偏差。整个目标是针对给定的损失函数(如交叉熵)来优化W。为了获得
,带Sigmoid激活函数的逻辑回归模型的另一种表示如图2-2所示。
图2-2
2.2介绍数据集本节将展示如何准备用来演示不同模型的数据集。
2.2.1做好准备逻辑回归是一个线性分类器,假定自变量和对数概率是线性关系。因此,在独立特征与对数概率呈线性关系的情况下,模型表现非常好。模型中可以包含更高阶的特征来捕捉非线性行为。我们来看看如何使用第1章提到的主要深度学习包建立逻辑回归模型。网络必须保持畅通,以便从UCI存储库中下载数据集。
2.2.2怎么做在本章中,来自UCIrvine机器学习库的占用检测(OccupancyDetection)数据集被用于构建逻辑回归和神经网络模型。它是一个主要用于二元分类的实验数据集,根据表2-1中描述的多变量预测变量来确定房间是被占用(1)或未被占用(0)。数据集的贡献者是来自UMONS的LuisCandanedo。
有3个数据集可以下载,但是我们将使用进行训练/交叉验证,并将用于测试目的。
数据集有7个属性(包括答案占用率),有20,560个实例。表2-1总结了属性信息。
表2-1数据集属性
2.3使用H2O执行逻辑回归广义线性模型广泛用于基于回归和分类的预测分析。这些模型使用最大似然来优化且支持更大的数据集良好扩展。在H2O中,广义线性模型可以灵活处理L1和L2惩罚(包括弹性网)。它支持因变量的高斯分布(Gaussian)、二项分布(Binomial)、泊松分布(Poisson)和伽马分布(Gamma)。它在处理分类变量、计算完整正则化和执行分布式n重交叉验证以控制模型过拟合方面是有效的。它具有使用分布式网格搜索来优化诸如弹性网络(α)之类的超参数以及处理预测器属性系数的上限和下限的特征。它也可以处理自动缺失值的插补。它使用Hogwild方法进行优化,即随机梯度下降的并行版本。
2.3.1做好准备第1章提供了在R中安装H2O的详细信息,以及使用其Web界面的工作示例。要开始建模,请在R环境中加载H2O软件包:
require(h2o)
然后,在8个内核上使用()函数初始化一个单节点H2O实例,并在IP地址为localhost和端口号为54321上实例化相应的客户端模块:
localH2O=(ip="localhost",port=54321,startH2O=TRUE,min_mem_size="20G",nthreads=8)
H2O包依赖于JavaJRE。因此,应该在执行初始化命令之前预先安装JavaJRE。
2.3.2怎么做本小节将演示使用H2O构建广义线性模型的步骤。
1.现在,在R中加载占用的训练和测试数据集:
定义输入变量(x)和输出变量(y)x=c("Temperature","Humidity","Light","CO2","HumidityRatio")y="Occupancy"3.根据H2O的要求,将因变量转换为以下因子型变量:
训练模型occupancy_(x=x,响应/因变量的名字training_frame=occupancy_,随机数种子family="binomial",最佳正则化lambdaalpha=0.5,5折交叉验证)
6.除上述命令外,还可以定义其他参数来微调模型性能。下面的举例并不包括所有的函数参数,但基于重要性涵盖了一部分。完整的参数列表可以在H2O软件包的文档中找到。
使用fold_assignment,指定生成交叉验证样本的策略,如随机抽样、分层抽样、取模抽样和自动(选择)。也可以通过指定列名称(fold_column)对特定属性执行采样。
可以选择通过使用weights_column指定每个观察值的权重,或使用balance_classes执行过密采样/过疏采样来处理倾斜结果(不平衡数据)。
可以选择使用missing_values_handling,通过均值插补或跳过观察值来处理缺失值。
可以选择使用non_negative限制系数为非负数,并使用beta_constraints约束它们的值。
如果采样数据的响应平均值不能反映真实(先前),就可以选择为采样数据提供y==1的先验概率(逻辑回归)。
指定要考虑的交互的变量(interactions)。
2.3.3工作原理模型的性能可以通过多种指标进行评估,例如精确度、曲线下面积(AreaUnderCurve,AUC)、错误分类错误率(%)、错误分类的错误数、F1分数、精确度、召回率和特异性等。但是,在本章中,模型性能的评估是基于AUC的。
以下是训练模型训练的准确性和交叉验证的准确性:
交叉验证的准确性(AUC)occupancy_@model$cross_validation_metrics@metrics$AUC[1]0.9945057
现在,我们来评估模型用于测试数据时的性能。以下代码有助于预测测试数据的结果:
测试的准确性(AUC)yhat$pmax-pmax(yhat$p0,yhat$p1,=TRUE)roc_obj-pROC::roc(c((occupancy_$Occupancy)),c((yhat$pmax)))auc(roc_obj)Areaunderthecurve:0.9915
在H2O中,还可以从广义线性模型计算变量的重要性,如图2-3所示。
加载TensorFlownp-import("numpy")加载输入和测试数据xFeatures=c("Temperature","Humidity","Light","CO2","HumidityRatio")yFeatures="Occupancy"occupancy_(("",stringsAsFactors=T))occupancy_(("",stringsAsFactors=T))数据维度nFeatures-length(xFeatures)nRow-nrow(occupancy_train)2.在设置图形之前,我们使用以下命令重置图形:
启动会话作为交互式会话sess-tf$InteractiveSession()
4.在TensorFlow中定义逻辑回归模型。
W-tf$Variable(tf$random_uniform(shape(nFeatures,1L)))b-tf$Variable(tf$zeros(shape(1L)))y-tf$matmul(x,W)+b
5.输入特征x被定义为常数,因为它将是系统的输入。权重W和偏差b被定义为变量,它们将在优化过程中被优化。设置y为x、W和b三个变量的函数。权重W被设置为初始化随机均匀分布,并且b被赋值为零。
6.为逻辑回归设置成本函数(costfunction):
启动一个会话init-tf$global_variables_initializer()sess$run(init)
7.为优化权重,使用交叉熵作为损失函数,执行梯度下降算法:
训练的性能library(pROC)ypred-sess$run(tf$nn$sigmoid(tf$matmul(x,W)+b))roc_obj-roc(occupancy_train[,yFeatures],(ypred))为日志创建写对象log_writer=tf$summary$FileWriter('c:/log',sess$graph)图2-6显示了使用上述代码为逻辑回归创建的图。
图2-6
2.同样,可以使用正确的摘要将其他变量摘要添加到TensorBoard中,如下面的代码所示:
为测试设置交叉熵nRowt-nrow(occupancy_test)xt-tf$constant(unlist(occupancy_test[,xFeatures]),shape=c(nRowt,nFeatures),dtype=np$float32)ypredt-tf$nn$sigmoid(tf$matmul(xt,W)+b)yt_-tf$constant(unlist(occupancy_test[,yFeatures]),dtype="float32",shape=c(nRowt,1L))cross_entropy_tst-tf$reduce_mean(tf$nn$sigmoid_cross_entropy_with_logits(labels=yt_,logits=ypredt,name="cross_entropy_tst"))
前面的代码类似于训练交叉熵计算,使用的数据集不同。可以通过设置函数来返回张量(tensor)对象,从而尽可能地减少工作量。
4.添加要收集的摘要变量:
为日志创建写对象log_writer=tf$summary$FileWriter('c:/log',sess$graph)6.运行优化并收集摘要:
for(stepin1:2500){sess$run(optimizer)训练的性能ypred-sess$run(tf$nn$sigmoid(tf$matmul(x,W)+b))roc_obj-roc(occupancy_train[,yFeatures],(ypred))保存偏差和权重的摘要log_writer$add_summary(sess$run(b_hist),global_step=step)log_writer$add_summary(sess$run(w_hist),global_step=step)log_writer$add_summary(sess$run(crossEntropySummary),global_step=step)log_writer$add_summary(sess$run(crossEntropyTstSummary),global_step=step)}}7.使用摘要模块中的merge_all命令将所有摘要收集到一个张量中:
summary=tf$summary$merge_all()
8.使用log_writer对象将摘要写入日志文件:
log_writer=tf$summary$FileWriter('c:/log',sess$graph)summary_str=sess$run(summary)log_writer$add_summary(summary_str,step)log_writer$close()2.5.3工作原理本小节介绍如何使用TensorBoard进行模型性能可视化。训练和测试的交叉熵记录在SCALARS选项卡中,如图2-7所示。
图2-7
对于训练和测试的成本函数,目标函数表现出相似的行为。因此,对于给定情况,该模型似乎是稳定的,约1,600次迭代处收敛。
2.6从多层感知器开始本节将着重于将逻辑回归概念扩展到神经网络。
是受生物脑的神经元结构启发的计算范例。
2.6.1做好准备ANN是一组人工神经元,对数据执行简单的操作。这个神经元的输出被传递给另一个神经元。每个神经元产生的输出称为其激活函数。在图2-8中可以看到一个多层感知器模型的例子。
图2-8
图2-8中的每个链接都与神经元处理的权重相关联。每个神经元都可以看作一个处理单元,进行输入处理,并将输出传递到下一层,如图2-9所示。
图2-9
神经元的输出:在神经元进行的处理可能是一个非常简单的操作,如输入乘以权重,然后进行求和或变换运算,如Sigmoid激活函数。
2.6.2怎么做本小节涵盖了多层感知器中的类型激活函数。激活是ANN的关键组件之一,因为它根据给定的输入定义该节点的输出。构建神经网络时有许多不同的激活函数,如下所示。
Sigmoid:Sigmoid激活函数是一个连续函数,也称为逻辑函数,具有1/(1+exp(-x))的形式。在训练过程中,Sigmoid函数有一个趋势,将反向传播项归零,导致响应饱和。在TensorFlow中,Sigmoid激活函数是使用函数定义的。
ReLU(RectifiedLinearUnit,修正线性单元):神经网络中用于捕获非线性的最有名的连续但不平滑的激活函数之一。ReLU函数定义为max(0,x)。在TensorFlow中,ReLU激活函数被定义为。
ReLU6:限制ReLU函数在数值6并被定义为min(max(0,x),6),因此该值不会变得非常小或很大。在TensorFlow中,该函数定义为。
tanh:双曲正切函数(Hypertangent)是另一个在神经网络中用作激活函数的平滑函数,被绑定为[-1,1],并被实现为。
softplus:因为它是ReLU的一个连续版本,所以存在差异,并被定义为log(exp(x)+1)。在TensorFlow中,softplus被定义为。
2.6.3更多内容神经网络有以下3种主要的结构。
前馈人工神经网络(FeedforwardANN):一类神经网络模型,其中信息流从输入到输出是单向的,因此架构不会形成任何循环。前馈网络的示例如图2-10所示。
图2-10
图2-11
图2-12
2.7使用H2O建立神经网络在本节中,我们将介绍H2O在建立神经网络中的应用。该示例将使用与逻辑回归相似的数据集。
2.7.1做好准备首先,我们用下面的代码加载所有需要的软件包:
初始化H2O实例(单节点)localH2O=(ip="localhost",port=54321,startH2O=TRUE,min_mem_size="20G",nthreads=8)2.7.2怎么做
本小节将介绍如何使用H2O构建神经网络。
1.将占用训练和测试数据集加载到R中:
定义输入变量(x)和输出变量(y)x=c("Temperature","Humidity","Light","CO2","HumidityRatio")y="Occupancy"3.根据H2O的要求,将因变量转换为以下因子变量:
将训练和测试数据集转换为H2O对象occupancy_(x=occupancy_train,destination_frame="occupancy_")occupancy_(x=occupancy_test,destination_frame="occupancy_")
5.一旦数据被加载并被转换为H2OParsedData对象后,使用函数构建多层前馈神经网络。在当前设置中,使用以下参数来构建神经网络模型:
使用hidden设置5个神经元的单隐藏层;
使用epochs设置50次迭代;
自适应学习率(adaptive_rate)而不是固定学习率(rate);
基于ReLU的Rectifier激活函数;
使用nfold的5折交叉验证。
获得训练的精确度(AUC)train_(,train=T)train_performance@metrics$AUC[1]0.9848667获得测试的精确度(AUC)test_(,valid=T)test_performance@metrics$AUC[1]0.9905056
本文截选自《深度学习实战手册R语言版》
本书将深度学习和R语言两者结合起来,帮助你解决深度学习实战中所遇到的各种问题,并且教会你掌握深度学习、神经网络和机器学习的高级技巧。本书从R语言中的各种深度学习软件包和软件库入手,带领你学习复杂的深度学习算法。首先,从构建各种神经网络模型开始,而后逐步过渡到深度学习在文本挖掘和信号处理中的应用,同时还比较了CPU和GPU的性能。
阅读完本书,你将对深度学习的架构和不同的深度学习包有一个比较深入的理解,能够为你今后碰到的项目或问题找到合适的解决方案。





