2016-07-12 14 views
1
myformula <- close ~ High+Low+Open 
nn_close <- neuralnet(myformula,data=train_,hidden=c(5,3),linear.output=T) 
nn_close$net.result[[1]] 

Hallo, angesichts der obigen Zeilen. Ich habe ein neuronales Netzwerkmodell konstruiert, mit dem ich versuchen werde, den engen Preis vorherzusagen. Könnte mir bitte jemand erklären, was die nn_close$net.result[[1]] Linie macht? Ich habe die CRAN documentation überprüft, aber das ist mir immer noch nicht klar.R Neural Network Package - was zeigt net.result?

Antwort

1

Die Ergebnisse von compute()$net.result enthalten nur eine Ebene und das gibt die Wahrscheinlichkeit, dass jede Probe eine bestimmte Spezies ist (in diesem Beispiel). Mit anderen Worten, die Summe der Zeilen ist (ungefähr) gleich 1. Im folgenden Beispiel habe ich diese Informationen verwendet, um die Spezies in der Validierungsuntermenge der Daten vorherzusagen, und diese werden unter Verwendung von table mit ihren wahren Werten verglichen:

# install.packages("neuralnet") 
library(neuralnet) 

# adapted iris 
data(iris) 
iris2 <- iris 
iris2$setosa <- c(iris2$Species == 'setosa') 
iris2$versicolor <- c(iris2$Species == 'versicolor') 
iris2$virginica <- c(iris2$Species == 'virginica') 
# iris2$Species <- NULL 

# training and validation subsets 
train.samples <- sample(nrow(iris), nrow(iris)*0.5) 
train <- iris2[train.samples,] 
valid <- iris2[-train.samples,] 

# fit model 
inet <- neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + 
    Petal.Length + Petal.Width, train, hidden=3, lifesign="full") 

# prediction 
pred <- compute(inet, valid[,1:4]) 
head(pred$net.result) # only one level (probability of each category) 
predspp <- factor(c("setosa" , "versicolor", "virginica"))[apply(pred$net.result, MARGIN=1, FUN=which.max)] 
table(predspp, valid$Species) 
# predspp  setosa versicolor virginica 
# setosa   19   0   0 
# versicolor  0   24   4 
# virginica  0   2  26 

In meinem Fall wurden alle Setosa Proben korrekt vorhergesagt. Es gab 2 und 4 falsche Vorhersagen für versicolor bzw. virginica. Im Allgemeinen war die Vorhersage für 92% der Validierungsproben korrekt (69/75 * 100).

1

Sie werden verstehen dies besser mit einem Beispiel (ich es modifiziert, um ein wenig, aber ich habe es von here):

itrain <- iris[sample(1:150, 50),] 

itrain$setosa <- c(itrain$Species == 'setosa') 

itrain$versicolor <- c(itrain$Species == 'versicolor') 

itrain$virginica <- c(itrain$Species == 'virginica') 

itrain$Species <- NULL 

inet <- neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + 
        Petal.Length + Petal.Width, itrain, hidden=3, lifesign="full") 

#make a prediction on the training set and then compare to 
#inet$net.result[[1]] 
predict <- compute(inet, itrain[1:4]) 

Nun nehmen Sie einen Blick auf die Ergebnisse:

head(predict$net.result) 
#    [,1]   [,2]   [,3] 
#80 0.0167232688257 0.995316738272 -0.011840391533 
#112 -0.0008289388986 -0.006814451178 1.007637170495 
#17 1.0028534166840 0.004240124926 -0.007115290101 
#104 -0.0002256650283 -0.031771967776 1.031855488316 
#149 0.0019424886784 0.007205356060 0.990892583485 
#82 -0.0061699713404 0.957656929739 0.048564910023 
head(inet$net.result[[1]]) 
#    [,1]   [,2]   [,3] 
#80 0.0167232688257 0.995316738272 -0.011840391533 
#112 -0.0008289388986 -0.006814451178 1.007637170495 
#17 1.0028534166840 0.004240124926 -0.007115290101 
#104 -0.0002256650283 -0.031771967776 1.031855488316 
#149 0.0019424886784 0.007205356060 0.990892583485 
#82 -0.0061699713404 0.957656929739 0.048564910023 

I verwendet compute, um eine Vorhersage über den Trainingssatz unter Verwendung des neuronalen Netzwerkmodells zu treffen. Wie Sie sehen können, sind inet$net.result[[1]] und predict$net.result gleich. So ist inet$net.result[[1]] nur eine Vorhersage für den Datensatz, den Sie verwendet haben, um das Modell zu trainieren (es entspricht den angepassten Werten des Modells lm).

Laut @sebastimms wirklich nützlichen Kommentar gibt es einen Grund, warum net.result eine Liste ist. Im Grunde hat neuralnet einen Parameter rep, der es ermöglicht, mehrere Modelle in einem Aufruf zu trainieren. Wenn rep größer als 1 ist, wird net.result größer als 1 (wie auch andere Komponenten (weights, result.matrix, start.weights)).

+0

Excellant vielen Dank. Es ist seltsam, dass das inet $ net.result [[1]] das Ergebnis eine Liste mit 1 Element ist. Bedeutet dies, dass in bestimmten Szenarien mehr als 1 Ergebnismenge wie inet $ net.result [[2]] gesetzt sein könnte? – edb500

+0

Sie sind herzlich willkommen @ edb500. Um ehrlich zu sein, habe ich nie 'inet $ net.result [[2]]' oder irgendein anderes Element benutzt, also bin ich mir nicht sicher. – LyzandeR

+1

Ok danke trotzdem – edb500