R: Error in nrow[w] * ncol[w] : non-numeric argume

2020-02-09 14:53发布

I am using neuralnet package for training a classifier. The training data looks like this:

> head(train_data)
   mvar_12      mvar_40 v10       mvar_1   mvar_2  Labels
1 136.51551310       6   0   656.78784220      0      0
2 145.10739860      87   0    14.21413596      0      0
3 194.74940330       4   0   196.62888080      0      0
4 202.38663480       2   0   702.27307720      0      1
5  60.14319809       9   0    -1.00000000     -1      0
6  95.46539380       6   0   539.09479640      0      0

The code is as follows:

n <- names(train_data)
f <- as.formula(paste("Labels ~", paste(n[!n %in% "Labels"], collapse = " + ")))
library(neuralnet)
nn <- neuralnet(f, tr_nn, hidden = 4, threshold = 0.01,        
                stepmax = 1e+05, rep = 1, 
                lifesign.step = 1000,
                algorithm = "rprop+")

The problem arises when I try to make a prediction for a test set:

pred <- compute(nn, cv_data)

Where cv_data looks like:

> head(cv_data)
   mvar_12      mvar_40 v10      mvar_1    mvar_2
1 213.84248210       1   9  -1.000000000     -1
2 110.73985680       0   0  -1.000000000     -1
3 152.74463010      14   0 189.521812800     -1
4  64.91646778       7   0  47.854257730     -1
5 141.28878280      12   0 248.557857500      5
6  55.36992840       2   0   4.785425773     -1

To this I get an error saying:

Error in nrow[w] * ncol[w] : non-numeric argument to binary operator
In addition: Warning message:
In is.na(weights) : is.na() applied to non-(list or vector) of type 'NULL'

Why do I get this error and how can I fix it?

4条回答
够拽才男人
2楼-- · 2020-02-09 15:17

Becasue you never set startweights in the function neuralnet()
According to the documentation

neuralnet(formula, data, hidden = 1, threshold = 0.01,
    stepmax = 1e+05, rep = 1, startweights = NULL,
    learningrate.limit = NULL,
    learningrate.factor = list(minus = 0.5, plus = 1.2),
    learningrate=NULL, lifesign = "none",
    lifesign.step = 1000, algorithm = "rprop+",
    err.fct = "sse", act.fct = "logistic",
    linear.output = TRUE, exclude = NULL,
    constant.weights = NULL, likelihood = FALSE)

startweights            a vector containing starting values for the weights. The weights will not be randomly initialized.

Note that the default value is NULL, and it will NOT be randomly initialized. Try to put something there and see if that works.

查看更多
贼婆χ
3楼-- · 2020-02-09 15:19

Try adjusting the threshold to a higher than 0.01 value or the stepmax to more than 1e06, or using a threshold of 0.1 and then decreasing it from there. You can also add in the lifesign = "full" argument to observe the model creation performance in increments of 1000 steps to really dial in the threshold. This "resolved" the non-binary error I had, but the accuracy of the model, the mean squared error, and other results were less than satisfying as a direct result.

查看更多
对你真心纯属浪费
4楼-- · 2020-02-09 15:23

I just came up against the very same problem. Checking the source code of the compute function we can see that it assumes one of the resulting attributes (i.e. weights) only defined when the network finishes the training flawless.

> trace("compute",edit=TRUE)
function (x, covariate, rep = 1) {
    nn <- x
    linear.output <- nn$linear.output
    weights <- nn$weights[[rep]]
    [...]
}

I think the real problem lies on the fact that neuralnet doesn't save the current network once reached the stepmax value, causing this error later in the compute code.

Edit

It seems you can avoid this reset by commenting lines 65 & 66 of the calculate.neuralnet function

> fixInNamespace("calculate.neuralnet", pos="package:neuralnet")
[...]
#if (reached.threshold > threshold) 
#    return(result = list(output.vector = NULL, weights = NULL))
[...]

Then everything works as a charm :)

查看更多
戒情不戒烟
5楼-- · 2020-02-09 15:33

Do a str(cv_data) and make sure they are all numeric.

查看更多
登录 后发表回答