Wir werden viele Anleihen bei João Neto und seinem Notebook Neural Networks machen.

Zunächst importieren wir die Iris-Daten vom UCI Machine Learning Repository und geben den Variablen (Attributen) aussagekräftige Namen (tun wir das nicht, haben die Variablen automatisch die Namen “V01”, “V02”,… ).

iris <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",header=F)
colnames(iris) <- c("sepal.length","sepal.width","petal.length","petal.width","species")

Damit wir später den Lernerfolg beurteilen können, spalten wir die Daten in eine Lernmenge (Trainingsmenge) und Validierungsmenge auf. Eine Faustregel (nach Abu-Mostafa) empfiehlt die Aufspaltung im Verhältnis 4:1.

set.seed(1011)
sample.ind <- sample(2,nrow(iris),replace=T,prob=c(4/5,1/5))
iris.train <- iris[sample.ind==1,]
iris.val <- iris[sample.ind==2,]

Unser Lernmodell ist “Neuronales Netz”. Wir verwenden die Implementierung als R-Paket neuralnet. Der Artikel neuralnet: Training of Neural Networks beschreibt das Paket und seine Anwendung ausführlich.

require(neuralnet)
## Loading required package: neuralnet

neuralnet kennt keine kategoriellen Attribute. Ersatzweise erfinden wir drei nicht-kategorielle Attribute und fügen sie als künstliche Spalten mit den Namen “setosa”, “versicolor” und “virginica” an die Daten an.

nn.iris.train <- iris.train
nn.iris.train <- cbind(nn.iris.train, nn.iris.train$species == 'Iris-setosa') # als 6.Spalte angehängt
nn.iris.train <- cbind(nn.iris.train, nn.iris.train$species == 'Iris-versicolor') # als 7.Spalte angehängt
nn.iris.train <- cbind(nn.iris.train, nn.iris.train$species == 'Iris-virginica') # als 8.Spalte abngehängt
# Namen für die neuen Spalten
names(nn.iris.train)[6] <- 'setosa'
names(nn.iris.train)[7] <- 'versicolor'
names(nn.iris.train)[8] <- 'virginica'

Einen Überblick, wie unsere Daten jetzt organisiert sind, liefert “summary”.

summary(nn.iris.train)
##   sepal.length    sepal.width     petal.length    petal.width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.500   1st Qu.:0.300  
##  Median :5.700   Median :3.000   Median :4.400   Median :1.300  
##  Mean   :5.801   Mean   :3.057   Mean   :3.691   Mean   :1.172  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.700   Max.   :2.500  
##             species     setosa        versicolor      virginica      
##  Iris-setosa    :42   Mode :logical   Mode :logical   Mode :logical  
##  Iris-versicolor:39   FALSE:78        FALSE:81        FALSE:81       
##  Iris-virginica :39   TRUE :42        TRUE :39        TRUE :39       
##                       NA's :0         NA's :0         NA's :0        
##                                                                      
## 

Nun lassen wir den Algorithmus, der in neuralnet implementiert ist,ein gutes neuronales Netz finden. “Gut” ist ein neuronales Netz, das wenige Fehler auf der Lernmenge macht. Gemessen wird der Gesamtfehler hier als Summe der Quadrate der Abweichungen vom wahren Wert. Wir wollen ein neuronales Netz mit einer verborgenen Schicht, die drei Knoten (Neuronen) enthält.

model.nn <- neuralnet(setosa + versicolor + virginica ~ 
                sepal.length + sepal.width + petal.length + petal.width,
                data=nn.iris.train, 
                hidden=c(3),
                act.fct = "logistic")

Hier isti eine grafische Darstellung des Ergebnisnetzes:

plot(model.nn, rep="best")

Auf der Validierungsmenge können wir sehen, wie gut das gefundene Netz neue Daten klassifiziert.

myprediction <- compute(model.nn,iris.val[,-5])

Das Ergebnis ist zunächst binär. Wir können es aber in ein kategorielles rückübersetzen.

maxidx <- function(arr) {
    return(which(arr == max(arr)))
}
idx <- apply(myprediction$net.result, c(1), maxidx)
prediction <-as.factor(c('Iris-setosa', 'Iris-versicolor', 'Iris-virginica')[idx])

Eine primitive Konfusionsmatrix bekommen wir mithilfe von “table”,

table(prediction,iris.val$species)
##                  
## prediction        Iris-setosa Iris-versicolor Iris-virginica
##   Iris-setosa               8               0              0
##   Iris-versicolor           0              10              1
##   Iris-virginica            0               1             10

eine komfortablere Konfusionsmatrix mithilfe von “confusionMatrix” aus dem caret-Paket.

require(caret)
## Loading required package: caret
## Loading required package: lattice
## Loading required package: ggplot2
confusionMatrix(prediction,iris.val$species)
## Confusion Matrix and Statistics
## 
##                  Reference
## Prediction        Iris-setosa Iris-versicolor Iris-virginica
##   Iris-setosa               8               0              0
##   Iris-versicolor           0              10              1
##   Iris-virginica            0               1             10
## 
## Overall Statistics
##                                                 
##                Accuracy : 0.9333333             
##                  95% CI : (0.7792646, 0.9918219)
##     No Information Rate : 0.3666667             
##     P-Value [Acc > NIR] : 0.0000000001144666    
##                                                 
##                   Kappa : 0.8989899             
##  Mcnemar's Test P-Value : NA                    
## 
## Statistics by Class:
## 
##                      Class: Iris-setosa Class: Iris-versicolor
## Sensitivity                   1.0000000              0.9090909
## Specificity                   1.0000000              0.9473684
## Pos Pred Value                1.0000000              0.9090909
## Neg Pred Value                1.0000000              0.9473684
## Prevalence                    0.2666667              0.3666667
## Detection Rate                0.2666667              0.3333333
## Detection Prevalence          0.2666667              0.3666667
## Balanced Accuracy             1.0000000              0.9282297
##                      Class: Iris-virginica
## Sensitivity                      0.9090909
## Specificity                      0.9473684
## Pos Pred Value                   0.9090909
## Neg Pred Value                   0.9473684
## Prevalence                       0.3666667
## Detection Rate                   0.3333333
## Detection Prevalence             0.3666667
## Balanced Accuracy                0.9282297