›   Demo 3: Predictive Maintenance mit R
›   Performance-Kennzahlen

Im ersten Teil des Demonstrators haben wir die Frage nach den Kombination von Merkmalen, die zu einem Ausfall eines Motors führen, anhand des Vorhersagemodells des Entscheidungsbaumes beantwortet. Dieser Baum wurde danach interpretiert und zur Vorhersage eines Ausfalls bei neu erfassten Daten verwendet.

Nun stellt sich die Frage, wie gut das Vorhersagemodell überhaupt ist.
Wie in Schritt 4: Datenanalyse Fortsetzung beschrieben, erheben wir mit Hilfe des Testverfahrens der Kreuzvalidierung die Kennzahlen Accuracy, Precision, Recall und AUC zur Beurteilung des Testfehlers und überprüfen, ob diese in einem vorher festgelegten, akzeptablen Bereich liegen.

Die Abbildung des Prozesses in RStudio wird durch ein 7-Minuten-Video veranschaulicht.

Die Fragestellung

Uns interessiert, wie sicher das Vorhersagemodell den Ausfall eines Motors vorhersagt. Anhand der Kennzahlen zum Testfehler lässt sich dies beantworten: Liegen die Kennzahlen in einem vorher festgelegten, akzeptablen Bereich? Wenn ja, dann ist das Modell gut, d.h. wir können uns auf die Aussagen und Vorhersagen durch das Modell verlassen.

Die erweiterte Datenanalyse mit R

Der zur Erstellung des Entscheidungsbaums und zur Vorhersage verwendete R-Code aus dem ersten Teil des Demonstrators wird nun erweitert, um zusätzlich die zur Bewertung der Güte des Vorhersagemodells benötigten Kennzahlen zum Testfehler zu bestimmen.

Der erweiterte R-Code besteht aus den folgenden Teilen: dem allgemeinen Code, dem Kennzahl-Code und der wiederverwendbaren Hilfsfunktion CreateCVFolds() zur Bestimmung der Teildatensätze der Kreuzvalidierung.

                          
 #Demo 3: Predictive Maintenance mit R -Teil 2 

 #Lade benötigte Pakete
 library(rpart)
 #Funktionen für Kennzahlen
 library(caret)
 #Funktionen für AUC 
 library(ROCR)  
 
 #Setze den Arbeitspfad
 setwd("C:/Demo3")
 
 #Lade externe Funktion
 source("CreateSamples.r")
 
 #Lese die CSV-Datei ein und speichere 
 #sie unter dem Namen "demo3"
 demo3=read.csv2( "demo3_data.csv")

 #Wähle Merkmale aus
 #Erstelle Trainingsdaten demo3training
 demo3training=demo3[ ,c(-1,-24)] 

 #Eingabe-Variable
 K=10 
 #Anzahl der Teildatensätze in CV

 #Erzeuge Teildatensätze mittels 
 #externer Funktion
 folds=createCVFolds(demo3training, K,seed=2012)

 #Lege Ausgabematrix für die 
 #Performance-Kennzahlen an
 m_perf=matrix(nrow = K, ncol = 4)
 colnames(m_perf)=c("recall", "precision",
                   "accuracy", "auc")
                          
 for (i in 1:K){
  #Erstelle Entscheidungsbaum 
  #mit dem CART-Algorithmus
  #und k-1 Trainingsdatensätzen
  fit = rpart(Ausfall ~ ., 
              data=demo3training[folds!=i,], 
              method='class', 
              parms=list(split="information"),
              control=list(minsplit = 15))
  
  #Vorhersage für den 
  #ausgelassenen Teildatensatz/Testdaten
  testdata=demo3training[folds==i,]
  pred=predict(fit, newdata=testdata, 
               type="class")
  
  #Erzeuge Konfusionsmatrix mittels 
  #caret-Paket
  m_conf=confusionMatrix(pred,testdata$Ausfall,
                         positive="ja")
  
  #Speichere die Perf.-Kennzahlen 
  #des i-ten Durchlaufs der CV
  m_perf[i,1]=m_conf$byClass[6] #recall
  m_perf[i,2]=m_conf$byClass[5] #precision
  m_perf[i,3]=m_conf$overall[1] #accuracy
  
  #AUC, ROC
  #Vorhersage für die Testdaten 
  pred.prob=predict(fit, newdata=testdata, 
                    type="prob")
  
  #Vektor mit TRUE/FALSE für Ausfall 
  #in den Beobachtungen der Testdaten
  obs=(testdata$Ausfall=="ja")
  
  #Verwende ROCR-Paket zur Berechnung der AUC
  prediction.obj=prediction(pred.prob[,1],obs)
  perf.auc=performance(prediction.obj, 
                       measure = "auc")
                      
  #Speichere die AUC des i-ten 
  #Durchlaufs der CV
  m_perf[i,4]=as.double(perf.auc@y.values)
  }

 #Mittelung der Performance-Kennzahlen 
 #über alle CV-Durchläufe
 perf=colSums(m_perf)/K

 #Ausgabe der Performance-Kennzahlen
 perf
                          
 #externe Funktion					
 createCVFolds= function(data, K=10, seed=444){ 
 #K=n means LeaveOneOut-Cross-Validation
 
  n=nrow(data)
  groesseSample=n%/%K
  set.seed(seed)
  i=runif(n)
  rang=rank(i)
 sample=(rang-1)%/% groesseSample + 1
 sample =as.factor(sample)
 return(sample)
 }

Hier können Sie den Quellcode des Projektes herunterladen, die Datei demo3_R_teil2.R (als komprimierte zip-Datei) und die R-Datei CreateSamples.r, die die externe Funktion enthält.

Im allgemeinen Code werden die benötigten Pakete geladen. Hier werden neben dem "rpart"-Paket noch das "caret"-Paket und das "ROCR"-Paket geladen, diese enthalten Funktionen, die die Bestimmung der Kennzahlen durchführen.

Neben dem Setzen des Arbeitspfades und dem Einlesen und Speichern der Trainingsdaten wird zusätzlich noch die Matrix "m_perf" erzeugt, die Platz für die Speicherung der Kennzahlen "recall", "precision", "accuracy" und "auc" bereitstellt, die Spalten dieser Matrix (colnames(m_perf)) werden den Kennzahlen entsprechend benannt.

In Zeile 14 wird die R-Datei "CreateSamples.r" mit dem Befehl "source("CreateSamples.r")" eingelesen, damit werden alle darin enthaltenen Funktionen zur Verwendung bereit gestellt. In Zeile 30 wird die Funktion "createCVFolds" aus der R-Datei "CreateSamples.r" auch verwendet um den Trainingsdatensatz in K=10 in etwa gleich große Teildatensätze zu zerlegen. Die Anzahl K der Teildatensätze kann in Zeile 25 verändert werden.

Der Kennzahl-Code besteht aus einer for-Schleife, die bei jedem Schleifen-Durchlauf einen Teildatensatz auswählt, mit den übrigen Teildatensätzen das Vorhersagemodell/Baum erstellt und dann für ausgewählten Teildatensatz eine Vorhersage durchführt. Die vorhergesagten Werte werden dann mit den tatsächlichen Werten für die Variable Ausfall verglichen und somit die Kennzahlen bestimmt. Dies erfolgt K mal und nachdem die Schleife durchlaufen wurde, werden alle K Werte der Kennzahlen gemittelt (Zeile 49) und die Performance-Matrix "perf" ausgegeben.

Das "caret"-Paket stellt die Funktion "confusionMatrix" (Zeile 19) bereit, die alle Kennzahlen bis aus die AUC bestimmt, die AUC wird mit der "performance"-Funktion des "ROCR"-Paketes bestimmt.

Die Kennzahlen werden im i-ten von K Schleifen-Durchläufen in der i-ten Zeile und der der Kennzahl entsprechenden Spalte gespeichert, z.B. die AUC in Spalte 4 von Durchlauf i: m_perf[i,4].

Die Hilfsfunktion ordnet jeder Beobachtung des übergebenen Datensatzes eine Zahl zwischen 1 und K zu, somit erfolgt eine Einteilung der Daten in K in etwa gleich große Teildatensätze. Der Übergabeparameter "seed" dient der Reproduzierbarkeit der Aufteilung, da das Ziehen der Zufallszahl i somit an einem festen, seed-abhängigen Punkt beginnt und damit nachvollziehbar wird.

Im Folgenden werden die beiden zur Bestimmung der Kennzahlen benötigten Funktionen und deren Parameter im Detail vorgestellt.

Die confusionMatrix-Funktion stellt eine Beobachtung-Vorhersagematrix auf.

Die confusionMatrix-Funktion ist eine Funktion, der die Vorhersagen durch das Modell und die tatsächlichen Werte der Zielvariablen Ausfall übergeben werden. Mit dem Parameter "positive" wird festgelegt für welchen Wert der Zielvariablen die Kennzahlen ermittelt werden sollen, hier Ausfall=ja, also positive="ja". Mittels der in Schritt 4: Datenanalyse Fortsetzung vorgestellten Formeln werden dann die Kennzahlen aus der Beobachtung-Vorhersagematrix bestimmt.

Im Objekt "byClass" der Funktion sind an verschiedenen Stellen die Kennzahlen zu finden, z.B. an Stelle 6 des Objektes der Recall-Wert: m_conf$byClass[6].

Die performance-Funktion vergleicht zwei Vektoren miteinander.

Die performance-Funktion ist eine Funktion, der ein prediction-Objekt übergeben wird, dieses wird durch Aufruf der prediction-Funktion aus dem ROCR erzeugt.

Die mit dem prediction-Objekt übergebenen Wahrscheinlichkeiten für einen Ausfall (mit predict(...,type="prob") bestimmt) und der Vektor mit TRUE/FALSE-Werten entsprechend der tatsächlichen Werten von Ausfall JA/NEIN werden zur Bestimmung des AUC-Wertes (Parameter measure = "auc") herangezogen. Der AUC-Wert kann mit as.double(perf.auc@y.values), also durch Umformatierung des Listenwertes y.values in eine Gleitkommazahl, zur weiteren Verwendung im Programm zur Verfügung gestellt werden.

Beurteilung des Vorhersagemodells anhand der Kennzahlen

Wie gut der Entscheidungsbaum aus dem ersten Teil der Demo zur Vorhersage eines Ausfalls geeignet ist, können wir nun anhand der vier ermittelten Kennzahlen zum Testfehler beurteilen:

Wie in Schritt 4: Datenanalyse Fortsetzung beschrieben, kann ein Modell als "gut" bewertet werden, wenn die Kennzahlen nahe an 100% liegen. Was genau "nahe" heißt, hängt von der Einschätzung des Experten ab, d.h. welche Abweichungen er noch als in Ordnung gelten lässt. Unsere Kennzahlen liegen in einem moderaten Bereich und können mit Vorbehalt zur Vorhersage eines Ausfalls verwendet werden.

Vergleich mehrerer Vorhersagemodelle anhand der Kennzahlen

Wie bereits in der Fortsetzung von Demo 2 erwähnt, können die hier ermittelten Kennzahlen auch zur Auswahl eines Vorhersagemodells aus mehreren zur Verfügung stehenden Modellen herangezogen werden. Neben den Kennzahlen spielen bei der Entscheidung für ein Modell auch die Verständlichkeit und intuitive Interpretierbarkeit sowie die praktische Anwendbarkeit des Modells eine Rolle.

Wir vergleichen nun die auf Basis derselben Daten erstellten Vorhersagemodelle aus dieser Demo und Demo 2 miteinander, um uns für eines der beiden Modelle zu entscheiden. Da es sich bei beiden Modellen um Entscheidungsbäume handelt, sind diese bezüglich Verständlichkeit und Interpretierbarkeit identisch. Der Baum aus dieser Demo ist etwas komplexer als der aus Demo 2, da der hier erstellte Baum 7 Merkmale zur Vorhersage aus den denn 22 Merkmalan auswählt statt nur 4 Merkmale in Demo 2. Die Drosselklappenstellung und die Kategorien der Katalysatortemperatur kommen aber in beiden Modellen vor, dies zeigt deren hohe Relevanz bei der Vorhersage eines Ausfalls. Da das Durchlaufen der Knoten in dieser Demo jedoch nicht viel länger als in Demo2 dauert, sind die Pfade vergleichbar lang und die Komplexität der Modelle damit auch ähnlich.

Tabelle der Kennzahlen zur Güte aus Demo 2 und 3 im direkten Vergleich.

Kennzahl Modell Demo 3 Modell Demo 2
Accuracy 66.15% 61.54%
Recall (True Positive Rate) 69.11% 59.29%
Precision 68.74% 71.79%
AUC 72.86% 52.3%

Erläuterung der Tabelle der Kennzahlen zur Güte aus Demo 2 und 3 im direkten Vergleich:

Stellen wir die Kennzahlen der beiden Bäume gegenüber, so sind die Precision- und Accuracy-Werte der Modelle vergleichbar.

Die True Positive Rate und die AUC sind in Demo 3 auffallend höher als in Demo 2 und damit näher an dem Idealwert von 100%.


Auf Basis der Kennzahlen entscheiden wir uns für das Modell aus dieser Demo, bezüglich der anderen Kriterien gibt es keinen nennenswerten Unterschied der Modelle.

Betrachten wir die praktische Anwendbarkeit der Modelle, dann spielt es natürlich eine große Rolle welche Tools bereits im Unternehmen zur Anwendung kommen und welche Kompetenzen die Mitarbeiter im Umgang mit den zur Verfügung stehenden Tools besitzen. Damit die Bäume auch vor Ort/in der Fachabteilung zum Einsatz kommen, spielt die Auswahl des Tools (Demo 2: RapidMiner oder Demo 3: Programmiersprache R mit RStudio als Umgebung) neben den anderen Kriterien eine zusätzliche wichtige Rolle und bedarf einer Absprache zwischen der Fachabteilung und dem Experten/Analysten.

Mit Beiträgen von: Anke Welz, Eva Kiss
Tools: RStudio, Images: https://openclipart.org/