2016-05-19 29 views
1

Ich möchte die Genauigkeit oder die RMSE der Prediction Ergebnis eines neuronalen Netzes erhalten. Ich habe begonnen, eine Verwirrungsmatrix zu verwenden, aber wie in früheren Antworten angezeigt, gibt die Verwechslungsmatrix gültige Ergebnisse für nicht kontinuierliche Variablen.Vorhersage über neuronales Netzwerk in R

Gibt es eine Möglichkeit, die Genauigkeit oder die Fehlerrate einer neuronalen Netzwerkvorhersage zu erhalten?

library(nnet) 
library(caret) 
library(e1071) 
data(rock) 
newformula <- perm ~ area + peri + shape 
y <- rock[, "perm"] 
x <- rock[!colnames(rock)%in% "perm"] 
original <- datacol(rock,"perm") 

nnclas_model <- nnet(newformula, data = rock, size = 4, decay = 0.0001, maxit = 500)  
nnclas_prediction <- predict(nnclas_model, x) 
nnclas_tab <- table(nnclas_prediction, y) 
rmse <- sqrt(mean((original - nnclas_prediction)^2)) 

Wer weiß, wie ich diese Arbeit machen kann:

Als Beispiel hier ist der Code, ich habe bis jetzt habe? oder wie kann ich die Genauigkeit oder die Neural Network Prediction erhalten? Jede Hilfe wird sehr geschätzt.

+0

Warum rufen Sie nicht 'confusionMatrix' direkt auf den vorhergesagten Ergebnisse und 'y'? d. h. 'confusionMatrix (nnclas_prediction, y)' – cdeterman

+1

Es scheint, dass Sie versuchen, eine Konfusionsmatrix für Vorhersagen über eine kontinuierliche Variable zu erstellen. Verwechslungsmatrizen sind für Klassifikationsprobleme gedacht ... – Jason

+0

meinst du etwa so: 'nnclas_prediction <- confusionMatrix ((vorhergesagt (nnclas_model, x)), y)'? – mina

Antwort

1

Wie in den Kommentaren erwähnt, sind Verwechslungsmatrizen für Klassifizierungsprobleme. Wenn Sie perm entsprechend seinen Ebenen klassifizieren wollten, dann sollte der folgende Code für Sie arbeiten.

library(nnet) 
library(caret) 
library(e1071) 
data(rock) 
rock$perm <- as.factor(rock$perm) 
nnclas_model <- nnet(perm ~ area + peri + shape, data = rock, 
        size = 4, decay = 0.0001, maxit = 500) 
x <- rock[, 1:3] 
y <- rock[, 4] 
yhat <- predict(nnclas_model, x, type = 'class') 
confusionMatrix(as.factor(yhat), y) 

Wenn Sie meinen perm als kontinuierlich zu behandeln, die Verwirrung Matrix macht keinen Sinn. Sie sollten stattdessen im Sinne eines Mittelquadratfehlers denken.

+0

Ich habe versucht, die 'RMSE' zu bekommen, aber immer noch habe ich keinen Erfolg, ich kann einfach nicht sehen, was ich falsch mache (siehe meine bearbeitete Frage) – mina

+0

@Jason in der letzte Zeile des Codes 'confusionMatrix (as.factor (yhat), y)', meinst du x statt y, wo ist 'y <- rock [, 4] '? Nur nicht sicher, woher dieses 'y' kommt. Vielen Dank! –

+0

@ nate-m, ja, ich hatte eine Zeile übersprungen. Ich habe es jetzt hinzugefügt. – Jason

2

Ich weiß nicht über "nnet", aber ich habe die "neuralnet" -Bibliothek verwendet und bin in der Lage, die RMSE zu bekommen. Hier ist mein vollständiger Code: einfach die Daten ändern für training_Data und testing_Data nach Ihren Wünschen und anstelle von „Channel“ geben, was ist Ihre Einstufung Attribut

dat <- read.csv("Give path of your data file here") 
summary(dat) 
cleandata <- dat 
cleandata <- na.omit(cleandata) 

#scaling 

apply(cleandata,MARGIN = 2, FUN = function(x)sum(is.na(x))) 
maxs = apply(cleandata, MARGIN = 2, max) 
mins = apply(cleandata, MARGIN = 2, min) 
scaledData =  as.data.frame(scale(cleandata, center = mins, scale = maxs - mins)) 
summary(scaledData) 

#Splitting data in 80:20 ratio 
train = sample(1:nrow(scaledData), nrow(scaledData)*0.8) 
test = -train 
training_Data = scaledData[train,] 
testing_Data = scaledData[test,] 
dim(training_Data) 
dim(testing_Data) 

#neural net 

library(neuralnet) 
n <- names(training_Data) 
f <- as.formula(paste("Channel ~", paste(n[!n %in% "Channel"], collapse = " + "))) 
neuralnet_Model <- neuralnet(f,data = training_Data, hidden = c(2,1)) 
plot(neuralnet_Model) 
neuralnet_Model$result.matrix 
pred_neuralnet<-compute(neuralnet_Model,testing_Data[,2:8]) 
pred_neuralnet.scaled <- pred_neuralnet$net.result *(max(scaledData$Channel)-min(scaledData$Channel))+min(scaledData$Channel) 
real.values <- (testing_Data$Channel)*(max(cleandata$Channel)-min(cleandata$Channel))+min(cleandata$Channel) 
MSE.neuralnetModel <- sum((real.values - pred_neuralnet.scaled)^2)/nrow(testing_Data) 
MSE.neuralnetModel 
plot(real.values, pred_neuralnet.scaled, col='red',main='Real vs predicted',pch=18,cex=0.7) 
abline(0,1,lwd=2) 
legend('bottomright',legend='NN',pch=18,col='red', bty='n')