Luigi Marongiu
2015-Dec-20 13:02 UTC
[R] neuralnet to discriminate a given outcome by giving cutoff outputs
Dear all, I am trying to use neural networks to discriminate positive and negative outcomes from a test; this outcome is given in the z variable of the example I am providing. Each outcome is associated with a pair of variables x and y and I was planning to identify the cut-offs that could separate the positive from the negative results by splitting the x/y space into 4 quadrants, the positive results lying in the 2nd quadrant (the top right). In the example, the two cut-offs for x and y are indicated with green lines (the values are absolutely subjective), positive results are in red. I was thinking of using the neural networks (implemented with the neuralnet package) to obtain the x and y cut-offs but the returned weight are off-scale. I tried to increment the number of hidden neurons, to use more replicates and a maximum number of iteractions but the results are never optimal. Since I am completely new in neural networks usage, could you tell me if the implementation is fine, where could I improve the model and whether the neural network is the right approach for the problem I need to solve? Thank you L>>>x<-c(31.1, 32.07, 33.01, 36.05, 17.88, 26.91, 27.35, 38.44, 35.92, 38.08, 26.14, 40.35, 36.12, 21.51, 22.75, 37.2, 16.94, 25.61, 25.83, 34.73, 36.93, 36.02, 37.43, 36.09, 34.74, 35.85, 16.35, 35.25, 26.98, 4.74, 2.89, 40.39, 42.18, 37.76, 2.73, 2.76, 2.64, 41.94, 45, 3.78, 2.86, 45, 2.77, 4.61, 2.52, 42.31, 2.92, 2.94, 3.01, 2.61, 45, 45, 44.54, 44.37, 36.24, 2.11, 2, 3.97, 44.54) y<-c(0.08, 0.054, 0.082, 0.095, 0.135, 0.129, 0.099, 0.072, 0.091, 0.093, 0.104, 0.077, 0.107, 0.108, 0.107, 0.088, 0.121, 0.111, 0.069, 0.106, 0.041, 0.091, 0.054, 0.083, 0.089, 0.086, 0.073, 0.085, 0.091, 0.008, 0.018, 0, 0, 0.001, 0.002, 0.011, 0.001, 0.002, -0.001, 0.005, 0.011, 0.002, 0.008, 0.006, 0.006, 0.001, 0.006, 0.003, 0.015, 0.003, 0.002, 0.001, 0, 0.001, 0.002, 0.001, -0.001, 0.002, -0.001) z<-c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) m<-data.frame(x,y,z) pos <- subset(m, z == 1) neg <- subset(m, z == 0) # show points X <- max(m$x) Y <- max(m$y) plot(pos$x, pos$y, pch=1, col="red", xlim=c(1,X), ylim=c(0,Y), xlab="x", ylab="y", main ="Training dataset", sub="Red = positive outcome; Black = negative outcome") points(neg$x, neg$y, pch=1, col="black") abline(v=6, lty=2, col="green") abline(h=0.03, lty=2, col="green") library(neuralnet) tnm <- neuralnet(z ~ x + y, data=m, hidden=1, algorithm = "rprop+", err.fct = "ce", act.fct = "logistic", linear.output = FALSE ) tnm$result.matrix co.x <- tnm$result.matrix[5] co.y <- tnm$result.matrix[6] abline(v=co.x, lty=2, col="blue") abline(h=co.y, lty=2, col="blue")