跳转到内容

R 中的数据挖掘算法/包/nnet

来自维基教科书,开放的书籍,为了一个开放的世界

本章介绍用于预测和分类数据的 Feed-Forward 神经网络包。 人工神经网络 (ANN),通常被称为“神经网络”(NN),是一种数学模型或计算模型,其灵感来自生物神经网络的结构和/或功能方面。 神经网络由相互连接的人工神经元组成,它使用连接主义方法处理信息。 在大多数情况下,ANN 是一种自适应系统,它根据学习阶段流经网络的外部或内部信息改变其结构。 现代神经网络是非线性统计数据建模工具。 它们通常用于对输入和输出之间的复杂关系进行建模或查找数据中的模式。 在本章中,我们将探索通过 Ripley 创建的 NNET 包[1][2] 使用前馈神经网络。

前馈神经网络

[编辑 | 编辑源代码]

前馈神经网络是一种人工神经网络,其中单元之间的连接形成有向循环。 这与循环神经网络不同。

前馈神经网络是最早也是最简单的类型的人工神经网络。 在这种网络中,信息仅沿一个方向移动,即从输入节点,通过隐藏节点(如果有)到输出节点。 网络中没有循环或回路。

ADALINE 代表Adaptive Linear Element。 它由伯纳德·维德罗教授及其斯坦福大学的研究生泰德·霍夫于 1960 年开发。 它基于麦卡洛克-皮茨模型,包含权重、偏差和求和函数。

操作:

它的适应性是通过残差 的成本函数(误差度量)来定义,其中 是期望的输入。 使用MSE 误差度量,自适应的权重和偏差变为:

Adaline 在控制领域有实际应用。 具有抽头延迟输入的单个神经元(输入数量受存在的最低频率和奈奎斯特速率限制)可用于通过双线性 z 变换确定物理系统的较高阶传递函数。 这是因为 Adaline 在功能上是自适应 FIR 滤波器。 与单层感知器一样,ADALINE 在统计建模中也有对应项,在本例中是最小二乘法 回归

Adaline 有一种扩展,称为多重 Adaline (MADALINE),它由两个或多个串联连接的 Adaline 组成。

Ripley 创建的 NNET 包提供了使用具有单个隐藏层的向前神经网络以及多项式对数线性模型的方法。具体来说,本书的本章将介绍 NNET 方法。以下是简要描述的方法和使用参数。

NNET 用于 R 的前馈神经网络的实现可在 CRAN 上获得,并且已经嵌入到 R 环境中。

拟合单隐藏层神经网络,可能具有跳层连接。


//Usage
nnet(x, ...)

//S3 method for class 'formula':
nnet(formula, data, weights, ...,
subset, na.action, contrasts = NULL)

//Default S3 method:
nnet(x, y, weights, size, Wts, mask,
linout = FALSE, entropy = FALSE, softmax = FALSE,
censored = FALSE, skip = FALSE, rang = 0.7, decay = 0,
maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000,
abstol = 1.0e-4, reltol = 1.0e-8, ...)


  • formula 形式为 class ~ x1 + x2 + ... 的公式。
  • x 矩阵或数据框,包含示例的 x 值。
  • y 矩阵或数据框,包含示例的目标值。
  • weights 每个示例的(案例)权重 - 如果缺失,则默认为 1。
  • size 隐藏层中单元的数量。如果存在跳层单元,则可以为零。
  • data 数据框,优先从中获取公式中指定的变量。
  • subset 指定用于训练样本的案例的索引向量。(注意:如果给出,则此参数必须命名。)
  • na.action 指定在找到 NA 时要采取的操作的函数。默认操作是程序失败。另一种选择是 na.omit,这将导致拒绝任何必需变量上具有缺失值的案例。(注意:如果给出,则此参数必须命名。)
  • contrasts 用于模型公式中出现的一些或所有因子的对比列表。
  • Wts 初始参数向量。如果缺失,则随机选择。
  • mask 逻辑向量,指示应优化哪些参数(默认情况下为全部)。
  • linout 线性输出单元的开关。默认情况下为逻辑输出单元。
  • entropy 用于熵(= 最大条件似然)拟合的开关。默认情况下为最小二乘法。
  • softmax 用于 softmax(对数线性模型)和最大条件似然拟合的开关。linoutentropysoftmaxcensored 是互斥的。
  • censored softmax 的变体,其中非零目标表示可能的类别。因此,对于 softmax,(0, 1, 1) 的一行表示类别 2 和 3 的一个示例,但对于 censored,它表示一个类别仅知为 2 或 3 的示例。
  • skip 开关,用于从输入到输出添加跳层连接。
  • rang 在 [-rang, rang] 上的初始随机权重。值约为 0.5,除非输入很大,在这种情况下,应选择它,以便 rang * max(|x|) 约为 1。
  • decay 用于权重衰减的参数。默认值为 0。
  • maxit 最大迭代次数。默认值为 100。
  • Hess 如果为真,则返回在找到的最佳权重集中拟合度量的 Hessian 作为组件 Hessian。
  • trace 用于跟踪优化的开关。默认值为 TRUE。
  • MaxNWts 允许的最大权重数。代码中没有固有限制,但增加 MaxNWts 可能允许非常缓慢且耗时的拟合。
  • abstol 如果拟合准则降至 abstol 以下,则停止,表示基本完美的拟合。
  • reltol 如果优化器无法将拟合准则减少至少 1 - reltol 的因子,则停止。
  • ... 传递给其他方法或来自其他方法的参数。

如果 formula 中的响应是因子,则会构造一个适当的分类网络;如果级别数为两个,则它具有一个输出和熵拟合,如果级别数更多,则具有与类别数相同的输出数和 softmax 输出阶段。如果响应不是因子,则会将其原样传递给 nnet.default

优化通过 optimBFGS 方法完成。

类为 nnetnnet.formula 的对象。主要是内部结构,但具有以下组件

  • wts 找到的最佳权重集。
  • value 拟合准则值加上权重衰减项。
  • fitted.values 训练数据的拟合值。
  • residuals 训练数据的残差。
  • convergence 如果达到最大迭代次数,则为 1,否则为 0。
'''Utilizing Example'''

//use half the iris data
library(nnet)

ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])
targets <- class.ind( c(rep("s", 50), rep("c", 50), rep("v", 50)) )
samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))

ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)

test.cl <- function(true, pred) {
   true <- max.col(true)
   cres <- max.col(pred)
   table(true, cres)
}

test.cl(targets[-samp,], predict(ir1, ir[-samp,]))

// or
library(nnet)

ird <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
species = factor(c(rep("s",50), rep("c", 50), rep("v", 50))))

ir.nn2 <- nnet(species ~ ., data = ird, subset = samp, size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)

table(ird$species[-samp], predict(ir.nn2, ird[-samp,], type = "class"))

案例研究

[编辑 | 编辑源代码]

案例研究旨在说明 NNET 包的众多可能应用中的一个。

准确的诊断可以避免患者的并发症。为了确定患者是否患有乳腺癌,分析几个因素有助于确定准确的诊断。因此,从收集的许多患者数据中,试图推断出患者的诊断,并获得令人满意的准确性。

数据详情

[编辑 | 编辑源代码]

本案例研究中使用的数据来自 UCI[3][4][5][6] 的数据库。该数据库包含 10 个变量(9 个输入和 1 个输出),有 569 个诊断患者记录的实例。

输入

  • 团块厚度
  • 细胞大小均匀性
  • 细胞形状均匀性
  • 边缘粘附
  • 单层上皮细胞大小
  • 裸核
  • 淡色染色质
  • 正常核仁
  • 有丝分裂

输出(类别)

  • 诊断:良性或恶性

执行和结果

[编辑 | 编辑源代码]

使用该包的实现非常简单。以下是训练数据和测试数据的一部分。

trainingInput <- read.table("trainingInput.data", sep=", ", header=TRUE)
trainingOutput <- read.table("trainingOutput.data", sep=",", header=TRUE)

library("nnet")
neuralNetworkModel <- nnet(trainingInput, trainingOutput, size = 19, rang = 0.1, decay = 5e-4, maxit = 2000)

neuralNetworkTest <- function(true, pred) {
	true <- max.col(true)
	cres <- max.col(pred)
	table(true, cres)
}

neuralNetworkTest(trainingOutput, predict(neuralNetworkModel, trainingInput))

作为训练函数 neuralNetoworkModel <- nnet (...) 的结果,具有根据为 rangdecaymaxit 设置的参数进行迭代和逼近操作的步骤。

  # weights:  230
  initial  value 146.391298 
  iter  10 value 14.225442
  iter  20 value 0.478782
  iter  30 value 0.149068
  iter  40 value 0.140717
  iter  50 value 0.131745
  iter  60 value 0.124368
  iter  70 value 0.116663
  
  iter 740 value 0.086414
  iter 750 value 0.086414
  final  value 0.086414 
  converged

训练后,对矩阵(函数 neuralNetworkTest)获得的结果进行混淆。从矩阵中,可以应用各种指标来获取信息,例如准确率、错误率等等。

       cres
   true  1    2
     1  180   0
     2   0   120

从这个矩阵中,我们发现测试非常成功,因为 真阳性 = (1,1), 假阳性 = (1,2), 假阴性 = (2,1) 和真阴性 (2,2)

从这个案例研究中,从患者数据集获得的神经网络模型足以提供可靠的诊断。但是,为此,患者数据必须符合网络表示的模型的实际情况,否则 ANN 会出现误诊。因此,值得注意的是,NNET 包使用方便,使其适用于各种不同的受众,他们可以在不需要深入了解该主题的情况下使用它。

  1. ^ B. D. Ripley: "模式识别与神经网络", 1996 年剑桥。
  2. ^ W. N. Venables 和 B. D. Ripley: "S 语言的现代应用统计学", 第四版,斯普林格,2002 年。
  3. ^ O. L. Mangasarian 和 W. H. Wolberg: "通过线性规划进行癌症诊断", SIAM 新闻,第 23 卷,第 5 期,1990 年 9 月,第 1 & 18 页。
  4. ^ William H. Wolberg 和 O.L. Mangasarian: "应用于乳腺细胞学的多表面模式分离方法", 美国国家科学院院刊,第 87 卷,1990 年 12 月,第 9193-9196 页。
  5. ^ O. L. Mangasarian、R. Setiono 和 W.H. Wolberg: "通过线性规划进行模式识别:理论及其在医学诊断中的应用", 载于:"大规模数值优化", Thomas F. Coleman 和 Yuying Li 编辑,SIAM 出版物,费城 1990 年,第 22-30 页。
  6. ^ K. P. Bennett & O. L. Mangasarian: "两个线性不可分离集的鲁棒线性规划判别", 优化方法与软件 1, 1992, 23-34 (Gordon & Breach 科学出版社)。
华夏公益教科书