第一次使用带有 SPECT 心脏数据集的神经网络 R 包
First time using neuralnet R package with SPECT Heart Data Set
所以我正在试用 neuralnet 包以了解它的用法和可能的实现。
我正在研究 SPECTF 听力数据集,可在此处获取:
https://archive.ics.uci.edu/ml/machine-learning-databases/spect/SPECTF.test
我有兴趣预测的变量在第一列中。
实际上,我合并了 SPECTF.test 和 SPECTF.train 并在 R 中的 test_ 和 train_ 中再次随机拆分它们(所有变量都按比例缩放)。他们是这样的:
> str(train_)
'data.frame': 200 obs. of 45 variables:
$ V1 : num 1 1 0 1 1 1 1 1 1 1 ...
$ V2 : num 0.783 0.75 0.733 0.767 0.75 ...
$ V3 : num 0.75 0.633 0.6 0.783 0.7 ...
$ V4 : num 0.636 0.886 0.795 0.841 0.545 ...
...
$ V45: num 0.71 0.855 0.797 0.913 0.754 ...
> str(test_)
'data.frame': 67 obs. of 45 variables:
$ V1 : num 0 0 0 0 0 0 0 0 0 0 ...
$ V2 : num 0.583 0.6 0.6 0.633 0.683 ...
$ V3 : num 0.7 0.617 0.783 0.917 0.617 ...
$ V4 : num 0.955 0.705 0.705 0.75 0.727 ...
...
$ V45: num 0.899 0.812 0.899 0.797 0.797 ...
根据 R-blogging 教程,我按如下方式设置了神经网络:
n <- names(train_)
f <- as.formula(paste("train_[,1] ~", paste(n[!n %in% "train_[,1]"], collapse = " + ")))
nn <- neuralnet(f,data=train_,hidden=2,linear.output=T)
到目前为止它运行顺利,然后我尝试对测试数据进行预测:
pr.nn <- compute(nn,test_[,2:45])
但是它给我返回这个错误,我不知道如何解决:
> pr.nn <- compute(nn,test_[,2:45])
Error in neurons[[i]] %*% weights[[i]] : non-conformable arguments
非常感谢您的帮助和所有工作!这个社区是一个很好的资源!
你的问题出在你的公式f的创建上。让我们看看您正在创建什么公式
f <- as.formula(paste("train_[,1] ~", paste(n[!n %in% "train_[,1]"], collapse = " + ")))
> f
train_[, 1] ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 +
X11 + X12 + X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 +
X21 + X22 + X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30 +
X31 + X32 + X33 + X34 + X35 + X36 + X37 + X38 + X39 + X40 +
X41 + X42 + X43 + X44 + X45
乍一看这看起来不错。但是,如果您仔细观察,您会发现 X1 作为响应变量和预测变量包含在您的公式中,这将是一个问题。
如果你想 select 除了 X1 之外的每个变量,有一个更简单的方法:
f <- as.formula(paste(paste0(n[1]," ~ "),paste(n[-1], collapse = " + ")))
> f
X1 ~ X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 + X11 + X12 +
X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 + X21 + X22 +
X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30 + X31 + X32 +
X33 + X34 + X35 + X36 + X37 + X38 + X39 + X40 + X41 + X42 +
X43 + X44 + X45
您已经创建了一个变量名称向量,因此使用 n[1] 将获取第一个变量名称,而 n[-1] 将获取其他所有内容。
我只使用一些虚拟数据对此进行了测试,并且在使用 compute() 时没有标记任何错误,因此这应该可以解决您的问题。
所以我正在试用 neuralnet 包以了解它的用法和可能的实现。
我正在研究 SPECTF 听力数据集,可在此处获取: https://archive.ics.uci.edu/ml/machine-learning-databases/spect/SPECTF.test
我有兴趣预测的变量在第一列中。 实际上,我合并了 SPECTF.test 和 SPECTF.train 并在 R 中的 test_ 和 train_ 中再次随机拆分它们(所有变量都按比例缩放)。他们是这样的:
> str(train_)
'data.frame': 200 obs. of 45 variables:
$ V1 : num 1 1 0 1 1 1 1 1 1 1 ...
$ V2 : num 0.783 0.75 0.733 0.767 0.75 ...
$ V3 : num 0.75 0.633 0.6 0.783 0.7 ...
$ V4 : num 0.636 0.886 0.795 0.841 0.545 ...
...
$ V45: num 0.71 0.855 0.797 0.913 0.754 ...
> str(test_)
'data.frame': 67 obs. of 45 variables:
$ V1 : num 0 0 0 0 0 0 0 0 0 0 ...
$ V2 : num 0.583 0.6 0.6 0.633 0.683 ...
$ V3 : num 0.7 0.617 0.783 0.917 0.617 ...
$ V4 : num 0.955 0.705 0.705 0.75 0.727 ...
...
$ V45: num 0.899 0.812 0.899 0.797 0.797 ...
根据 R-blogging 教程,我按如下方式设置了神经网络:
n <- names(train_)
f <- as.formula(paste("train_[,1] ~", paste(n[!n %in% "train_[,1]"], collapse = " + ")))
nn <- neuralnet(f,data=train_,hidden=2,linear.output=T)
到目前为止它运行顺利,然后我尝试对测试数据进行预测:
pr.nn <- compute(nn,test_[,2:45])
但是它给我返回这个错误,我不知道如何解决:
> pr.nn <- compute(nn,test_[,2:45])
Error in neurons[[i]] %*% weights[[i]] : non-conformable arguments
非常感谢您的帮助和所有工作!这个社区是一个很好的资源!
你的问题出在你的公式f的创建上。让我们看看您正在创建什么公式
f <- as.formula(paste("train_[,1] ~", paste(n[!n %in% "train_[,1]"], collapse = " + ")))
> f
train_[, 1] ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 +
X11 + X12 + X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 +
X21 + X22 + X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30 +
X31 + X32 + X33 + X34 + X35 + X36 + X37 + X38 + X39 + X40 +
X41 + X42 + X43 + X44 + X45
乍一看这看起来不错。但是,如果您仔细观察,您会发现 X1 作为响应变量和预测变量包含在您的公式中,这将是一个问题。
如果你想 select 除了 X1 之外的每个变量,有一个更简单的方法:
f <- as.formula(paste(paste0(n[1]," ~ "),paste(n[-1], collapse = " + ")))
> f
X1 ~ X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 + X11 + X12 +
X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 + X21 + X22 +
X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30 + X31 + X32 +
X33 + X34 + X35 + X36 + X37 + X38 + X39 + X40 + X41 + X42 +
X43 + X44 + X45
您已经创建了一个变量名称向量,因此使用 n[1] 将获取第一个变量名称,而 n[-1] 将获取其他所有内容。
我只使用一些虚拟数据对此进行了测试,并且在使用 compute() 时没有标记任何错误,因此这应该可以解决您的问题。