›  Demo 3: Predictive Maintenance mit R

Demo 3: Predictive Maintenance mit R zeigt, wie eine Ausfall-Prognose im Rahmen eines Predictive Maintenance-Szenarios mit Hilfe des Entscheidungsbaum-Verfahrens in der statistischen Programmiersprache R mit der Entwicklungsumgebung RStudio durchgeführt wird. Wir verwenden denselben Automobildatensatz, der in allen Demos des Predictive Maintenance-Zyklus verwendet wird: eine Excel- bzw. csv-Datei mit 140 Beobachtungen. Die mit dieser Demo zu beantwortende Fragestellung aus dem Predictive Maintenance-Prozess lautet: "Bei welcher Kombination von Merkmalen tritt ein Ausfall ein?".

Zur Beantwortung dieser Frage wird der Datensatz in RStudio eingelesen, mit Hilfe des Trainingsdatensatzes wird ein Entscheidungsbaum-Modell erstellt, das dann anhand von Performance-Kennzahlen validiert und zur Klassifikation bzw. der Vorhersage eines Ausfalls im Testdatensatz verwendet werden kann. Der Quellcode zur Demo und dessen Ausführung in RStudio werden durch ein 7-Minuten-Video veranschaulicht.

info-icon Motivation

Was steckt hinter dem Begriff der Predictive Maintenance und wie wird sie durchgeführt?
Predictive Maintenance ist ein daten­gesteuerter Wartungsprozess, der die herkömmliche Wartung im Industrie 4.0-Umfeld ergänzt und zunehmend ersetzt. Die Predictive Maintenance hat sich zudem als industrielle Anwendung des Machine Learning etabliert und ist ein greifbares Beispiel des Internet of Things.

In dieser Demo werden die in der elab2go-Übersicht "Was ist Predictive Maintenance?" beschriebenen Schritte der Predictive Maintenance in der statistischen Programmiersprache R umgesetzt, insbesondere der Zyklus der Datenanalyse von der Datenvorbereitung bis zur Anwendung des Modells zur Vorhersage für neue Beo­bach­tungen.

Warum R?

R ist eine freie Programmiersprache für statistische Berechnungen und Grafiken, die 1992 von den Statistikern Ross Ihaka und Robert Gentleman an der Universität Auckland entwickelt wurde. R ist die moderne Implementierung der Statistik­sprache S, die bis 1975 zurückreicht, und ist auf UNIX-­Plattformen, Windows and MacOS lauffähig.

R wird als Standardsprache für statistische Probleme in Lehre, Wissenschaft und Wirtschaft verwendet. Kostenlose R-Pakete erweitern den Anwendungsbereich von R um viele Fachbereiche. Eine ausführliche Dokumentation und viele Foren, die sich der Verwendung von R widmen, ermöglichen ein einfaches Erfassen und Verwenden der Funktionalität. Da der Quellcode öffentlich ist, bietet R die Möglichkeit, schnell neue Pakete zu entwickeln und zur Verfügung zu stellen.

R hat einen klaren Fokus auf Statistik und Datenanalyse, im Unterschied zu Python, was eine Programmiersprache für den allgemeinen Einsatz ist, oder MATLAB, das allgemeiner auf numerische Verfahren und Simulation ausgerichtet ist. Während R nicht auf Performance- oder Echtzeitszenarien ausgerichtet ist, eignet es sich hervorragend für Statistiken und Datenvisualisierung.

info-iconÜbersicht

Demo 3 ist in sechs Abschnitte gegliedert. Zunächst wird der Automotive-Datensatz beschrieben und die Fragestellung erläutert, die mit der Datenanalyse beantwortet werden soll, gefolgt von der allgemeinen high-level Beschreibung des Ablaufs und der Beschreibung der Entwicklungsumgebung RStudio. Die Umsetzung des Datenanalyse-Zyklus beginnt bei der Vorbereitung des Datensatzes, gefolgt von der Definition des zu verwendeten Modells und Abschnitten zum Einlesen und Anpassen der Daten, zur Modellbildung, zur Bestimmung der Performance des Modells und zur Vorhersage für neue Beobachtungen (vgl. Abbildung).

Die Ergebnisse werden im letzten Abschnitt mit dem Modell aus Demo 2 verglichen wird.

Zyklus der Datenanalyse

Ein YouTube-Video veranschaulicht den Quellcode zur Demo und dessen Ausführung in der Entwicklungsumgebung RStudio.

1 Der Automotive-Datensatz

Der Automotive-Datensatz ist eine Excel- bzw. csv-Datei und besteht aus insgesamt 140 Beobachtungen von Motoren. Als Trennzeichen für die Spalten wird in der csv-Datei das Semikolon verwendet.

Jede Beobachtung enthält den Vorhersagewert Ausfall, mit angenommenen Werten ja/nein, die Messungsnummer und Sensorwerte zu insgesamt 22 Merkmalen. Die erhobenen Merkmalswerte stammen aus Temperatur- und Druckmessungen sowie Mengenangaben zum Kraftstoff und zu Abgasdämpfen, die an verschiedenen Stellen im Motor erfasst wurden. Weiterhin enthält der Datensatz acht Merkmale zu den Lambdasonden (LS), die an jeweils einem Zylinder im Motor Messwerte liefern und in 2 Bänke unterteilt sind (d.h. das Merkmal LS32 gibt den Sensorwert vom dritten Zylinder innerhalb der zweiten Bank an). Bis auf die Katalysatortemperatur (Merkmalsname: KatTemp, Werte: normal/hoch) liegen für alle Merkmale numerische Messungen vor.


2 Die Fragestellung

Uns interessiert, welche Merkmalskombinationen, d.h. welches Zusammenspiel der Sensorwerte, zu einem Ausfall des Motors führen. Die Frage, die der Entscheidungsbaum beantworten soll, lautet also: Welche Kombination von Merkmalen wird zu einem Ausfall führen? Werden alle Merkmale einen Einfluss auf den Ausfall haben und falls nein, mit welchem Gewicht werden welche Merkmale einen Ausfall bewirken?

3 Ablauf der Datenanalyse

Die Datenanalyse für die Predictive Maintenance läuft in fünf Schritten ab:

Zyklus der Datenanalyse



4 Die Definition des Modells

Gemäß des Schrittes 2 des Zyklus der Datenanalyse in der Predictive Maintenance wählen wir ein den Daten entsprechendes Modell, die Formatierung der Daten und die Festlegung der Zielvariablen hängt von der Fragestellung ab. In dieser Demo wurde gemäß der Fragestellung das Merkmal AUSFALL als Zielvariable festgelegt, d.h. das Modell soll eine Klassifikation der Daten in AUSFALL Ja oder Nein durchführen.

Der Entscheidungs­baum ist ein intuitiv nutzbares Klassifikation­smodell, das für den Einstieg besonders geeignet ist, da es eine Visualisierung der Klassifikation bzw. der hierarchisch aufeinanderfolgenden Entscheidungen ermöglicht. Ein Entscheidungs­baum besteht aus einer Wurzel, Kindknoten und Blättern, wobei jeder Knoten eine Entscheidungsregel und jedes Blatt eine Antwort auf die Fragestellung darstellt. Um eine Klassifikation eines einzelnen Datenobjektes abzulesen, geht man vom Wurzelknoten entlang des Baumes abwärts. Bei jedem Knoten wird ein Merkmal abgefragt und eine Entscheidung über die Auswahl des folgenden Knoten getroffen. Dies wird so lange fortgesetzt, bis man ein Blatt erreicht. Das Blatt entspricht der Klassifikation.

Mehr Details und ein Mini-Beispiel zum Entscheidungsbaum-­Modell sind unter Predictive Maintenance: Die Datenanalyse zu finden.

5 Die RStudio-Entwicklungsumgebung

Als Datenanalyse-Tool wird RStudio eingesetzt, eine Entwicklungs­umgebung und grafische Benutzer­oberfläche für Datenanalyse mit Hilfe der statistischen Programmier­sprache R, die in Open-Source- und kommerziellen Editionen erhältlich ist und auf dem Desktop (Windows, Mac und Linux) oder in einem Browser läuft. Die zur Datenanalyse benötigten Algorithmen sind in Pakete zusammengefasst, die nach Bedarf über die R-Konsole geladen werden können.

Die Installation und Verwendung von RStudio sowie die ersten Schritte in der Programmier­sprache R werden in Demo-R1: R-Tutorial des elab2go beschrieben, ebenso die Erstellung von Skripten und grundlegende R-Syntax: die Verwendung von Kommentaren, wie R-Code mit Hilfe spezieller Kommentare in Abschnitte gegliedert wird, wie externe Daten mit Hilfe der Funktionen read_csv und read_csv2 in DataFrames importiert werden etc.

6 Der Datenanalyse-Prozess in RStudio

Im Folgenden werden die Schritte des Datenanalyse-Prozesses – Datenvorbereitung, Modell­erstellung, Validierung und Vorhersage / Klassifikation – in der Programmiersprache R und mit der Entwicklungsumgebung RStudio umgesetzt.

Vorbereitung: Projekt erstellen

Zunächst wird in RStudio mit File > New Project ein neues Projekt "Demo3" angelegt, das alle Skripte und Daten zu Demo3 enthalten wird.
Projekt anlegen Beim Anlegen des neuen Projektes erstellt RStudio den Ordner C:\R\Demo3, der als Arbeitsverzeichnis für die neue Demo genutzt wird. Das Arbeiten mit Projekten in RStudio hat verschiedene Vorteile, z.B. können Projekt-Templates (Directory, R Package, Shiny Web Applications) verwendet werden, auch die Versionskontrolle und damit kollaboratives Arbeiten wird über Projekte unterstützt. Weiterhin wird durch das Anlegen eines Projektes das Arbeits­verzeichnis automatisch auf das aktive Projekt gesetzt und der Pfad zum Arbeitsverzeichnis muss nicht explizit im Skript mit setwd gesetzt werden.

Vorbereitung: R-Skript erstellen

Als Nächstes wird mit File > New File > R Script ein neues R-Skript demo3.R erstellt, das den R-Code enthalten wird. Wir gliedern das R-Skript demo3.R in vier Abschnitte, die den Schritten des überwachten Lernens entsprechen, dies macht den Code übersichtlicher. Zur Erinnerung: ein Abschnitt kann in RStudio mit Code > Insert Section eingefügt werden, oder auch einfach, indem man einen benannten Kommentar einfügt, der von mindestens 4 Symbolen desselben Typs gefolgt wird, und erzeugt ein einklappbares und separat ausführbares Code-Fragment. Der R-Code für die einzelnen Schritte wird in den folgenden Abschnitten beschrieben und kann an den mit TODO gekennzeichneten Stellen eingefügt werden.

R-Skript demo3.R
# 0 Benötigte Pakete importieren ----
# TODO: laden Sie hier benötigte Pakete
# Verwendete Funktionen: library

# 1 Datenvorbereitung ----
# TODO: fügen Sie hier den Code zur Datenvorbereitung ein
# Verwendete Funktionen: read_csv

# 2 Modell erstellen  ----
# TODO: fügen Sie hier den Code zur Erstellung des Modells ein
# Verwendete Funktionen: rpart, rpart.plot

# 3 Modell validieren ----
# TODO: fügen Sie hier den Code zur Validierung des Modells ein
# Dieser Schritt wird in demo3_R_teil2.R durchgeführt

# 4 Modell verwenden ----
# TODO: fügen Sie hier den Code zur Klassifikation ein
# Verwendete Funktionen: predict


Die Struktur des Demo3-Projektes sieht nach Erstellen der Skripte und Ablegen der csv-Dateien mit den Datensätzen wie abgebildet aus.

Projektstruktur
Projektstruktur des Demo3-Projektes


Pakete importieren

Der nächste vorbereitende Schritt besteht darin, benötigte Pakete zu installieren und in das Skript zu laden. In R gibt es verschiedene Pakete, die das Training und die Visualisierung von Entscheidungsbäumen unterstützen: tree, party, rpart. Das aktuell am häufigsten verwendete Paket ist rpart, dies ermöglicht eine besonders ansprechende Visualisierung des Entscheidungsbaums und wird daher in dieser Demo verwendet. Der R-Code zum Laden der benötigten Pakete ist wie folgt, damit werden die benötigten Pakete geladen. Das "rpart"-Paket enthält Funktionen, die zur Erstellung des Klassifikationsmodells gebraucht werden, insbesondere die gleichnamige Funktion rpart, die den Entscheidungsbaum auf Basis des CART-Algorithmus mittels des Informationgehalt-Kriteriums erstellt. Das Paket "rpart.plot" enthält Funktionen zur grafischen Darstellung des Entscheidungsbaumes.

R-Code: Pakete laden

#Demo 3: Predictive Maintenance mit R 

# 0 Benötigte Pakete importieren ----
library(rpart)
library(rpart.plot)

6-1 Datenvorbereitung

Im Schritt "Datenvorbereitung" der Datenanalyse werden die Daten aus externen Quellen (csv-Dateien, Datenbanken) in RStudio eingelesen, dabei wird festgelegt, welche Spalten genau eingelesen werden, und in welchem Format dies geschehen soll. In unserem Fall liegen die Daten als csv-Datei automotive_data_140.csv vor, die erste Spalte enthält die Spaltenüberschriften, als Trennzeichen wird das Semikolon verwendet, als Dezimaltrenner der Punkt. Da wir für die Modellerstellung die erste und 25te Spalte des Datensatzes nicht benötigen, werden diese nach dem Einlesen aus dem DataFrame entfernt.

R-Code: Datenvorbereitung

  
# 1 Datenvorbereitung ----                        
# Setze den Arbeitspfad
setwd("C:/R/Demo3")

# CSV-Datei einlesen und speichern 
demo3=read.csv2("automotive_data_140.csv",
  header = TRUE,sep = ";",dec = ".")

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

# Überprüfe die Struktur von demo3training
str(demo3training)

Erläuterung des R-Codes
In Zeile 3 wird der Arbeitspfad gesetzt, falls man zuvor den Projektordner als Projekt erstellt hat, ist dieser Schritt optional.
In den Zeilen 6-7 des Codes wird die CSV-Datei mit der "read.csv2"-Funktion eingelesen und mit der Zuweisung ("="-Zeichen) als DataFrame-Objekt demo3 gespeichert. Aus diesem Objekt, das die Daten des Automobildatensatzes enthält, werden nun die erste Spalte (die Messungsnummer) und 25. Spalte (Katalysatortemp, numerischer Wert) entfernt und die gekürzten Daten unter dem Namen "demo3training" gespeichert. Wir überprüfen noch die Struktur des DataFrame-Objektes demo3training mit Hilfe der str-Funktion, dies zeigt uns, ob die Spalten korrekt und mit den korrekten Datentypen importiert wurden. Die "demo3training"-Daten werden im Folgenden zur Erstellung des Entscheidungsbaums verwendet.

Verwendete Funktionen

Die library-Funktion lädt Pakete in der aktuelle R-Sitzung.

Die library-Funktion ist eine Funktion, die Pakete in die aktuelle R-Sitzung lädt und somit deren Funktionen zur Verfügung stellt. Wird hier verwendet um das rpart-Paket zu laden, dieses enthält Funktionen, die zur Erstellung und grafischen Darstellung von Klassifikationsmodellen verwendet werden.

Die setwd-Funktion setzt den Arbeitspfad für die aktuelle R-Sitzung.

Die setwd-Funktion ist eine Funktion, die den Arbeitspfad der aktuellen R-Sitzung festlegt, damit entfällt die Angabe des Pfades beim Speichern oder Laden von Workspaces und Daten.

Die read.csv2-Funktion liest Daten im csv-Format ein.

Die read.csv2-Funktion ist eine Funktion, die Daten im csv-Format anhand von Parametern einliest.
Die read.csv2-Funktion wird in unserem Prozess zweimal verwendet: einmal, um den Trainingsdatensatz einzubinden, und einmal, um den Testdatensatz einzubinden.

Ausgabe

Der Quellcode liefert bei Ausführung folgenden Trainingsdatensatz:

Trainingsdaten

Im aktuellen Arbeitsverzeichnis liegen nun die beiden Datensätze demo3 und demo3training vor:

Verzeichnis 1

6-2 Modell erstellen

Im Schritt "Modell erstellen" des überwachten Lernens wird ein zuvor festgelegtes Modell trainiert (hier: ein Entscheidungsbaum-Modell), indem die Modellparameter mit Hilfe eines passenden Algorithmus an die Trainingsdaten angepasst werden.

Die Erstellung eines Entscheidungsbaum-Modells in R erfolgt mit Hilfe der rpart-Funktion des gleichnamigen Pakets. Die allgemeine Syntax der Funktion ist rpart(formula, data, method, parms, control,…). Über die Parameter der Funktion wird festgelegt, wie genau der Entscheidungsbaum aufgebaut wird:

Wir erstellen den Baum mittels des Entropie/Informationgehalt-Kriteriums (split="information") basierend auf den Trainingsdatensatz der Motoren. Die hier übergebene Modellformel lautet "Ausfall ~ .", links vom Tilde-Zeichen steht die Variable, die vorhergesagt werden soll und rechts vom Tilde-Zeichen die Merkmale, die zur Modellbildung verwendet werden sollen, hier steht der Punkt "~." für die Verwendung aller Merkmale des Datensatzes.


R-Code: Modell erstellen
   
# 2 Modell erstellen ----                       
# Erstelle Entscheidungsbaum mit dem CART-Algorithmus
fit = rpart(Ausfall ~ .,   
  data=demo3training,               
  method="class",                   
  parms=list(split="information"),
  control=list(minsplit=15)) 

# Baum in Textform 
print(fit)  

# Baum visualisieren
rpart.plot(fit, type = 1, extra = 1, 
           uniform = TRUE, main = "Entscheidungsbaum")

Erläuterung des R-Codes

In den Zeilen 3-7 des Codes wird der Entscheidungsbaum mit den Trainingsdaten "demo3training" erstellt, indem die "rpart"-Funktion mit den entsprechenden Parametern aufgerufen wird. Das Modell wird unter dem Namen "fit" gespeichert, mit der print-Funktion in Textform und mit der rpart.plot-Funktion als Grafik ausgegeben.

Verwendete Funktionen

Die rpart-Funktion erstellt den Entscheidungsbaum.

Die rpart-Funktion ist eine Funktion aus dem rpart-Paket, mit deren Hilfe Entscheidungsbäume für Klassifikation und Regression erstellt werden können, wobei die genaue Art der Erstellung durch die Argumente der Funktion festgelegt wird. Die vollständige Syntax der Funktion lautet

fit = rpart(formula, data, weights, subset, na.action = na.rpart, method,
      model = FALSE, x = FALSE, y = TRUE, parms, control, cost, …)
Bis auf die Parameter formula und data sind alle Parameter optional, d.h. fit = rpart(Ausfall ~ ., demo3training) ist ein gültiger Funktionsaufruf und erstellt ein Entscheidungsbaum-Modell fit mit Default-Einstellungen.

Die Ausgabe-Funktionen für das Modell: print und rpart.plot

Die print-Funktion ist eine Funktion, die das Modell/den Baum in Textform im Output-Fenster ausgibt.

Die rpart.plot-Funktion ist eine Funktion aus dem rpart-Paket, die die Äste, Knoten und Blätter des Baums im Grafikfenster ausgibt. Die Beschriftung mit den Merkmalen, den Bedingungen und den Werten der Vorhersagevariablen erfolgt automtisch. Beiden Funktionen können Parameter übergeben werden, die minimale Übergabe besteht aus dem Entscheidungsbaum, hier "fit".


Der Entscheidungsbaum

Der Entscheidungsbaum wählt nur einen Teil der 22 Merkmale zur Vorhersage eines Ausfalls aus. Die Merkmale werden hierarchisch als Baum oder Text dargestellt.

An jedem Knoten wird für das jeweilige Merkmal eine Bedingung abgefragt und je nach Beobachtungswert wird nach links (Bedingung erfüllt) oder rechts (Bedingung NICHT erfüllt) zum weiteren Knoten verwiesen. Dort erfolgt eine erneute Bedingung für ein Merkmal mit weiteren Verweis auf den nächsten Knoten. Dies wird solange durchgeführt bis der durchlaufene Pfad an einem Ja/Nein- Blatt des Baumes endet.

Wann kommt es zu einem Ausfall?

Wenn am Ende eines Astes "Ja" steht, dann führt der Pfad/die Merkmalskombination zu einem Ausfall der Anlage andernfalls, d.h. bei "Nein", kommt es bei durchlaufener Merkmalskombination zu keinem Ausfall.

Entscheidungsbaum_Demo3

Je höher des Merkmal im Baum steht, d.h. je weiter oben dessen Position ist, desto mehr Einfluss hat es auf die Vorhersage eines Ausfalls. In unserem Baum hat die Einlasslufttemperatur den höchsten Einfluss. An der Aufteilung Ja/Nein in den Blättern (z.B. 50/4 im ganzen linken Blatt) erkennt man, wie viele Beobachtungen des Trainingsdatensatzes mit beobachteten Ausfällen Ja/Nein diesem Blatt zugeordnet werden (z.B. insgesamt 54 Beobachtungen im ganzen linken Ast, bei denen 50 mal ein Ausfall vorliegt und 4 mal kein Ausfall). Daraus lassen sich die Wahrscheinlichkeiten für Ausfall Ja oder Nein je Blatt bestimmen, die auch bei der Ausgabe des Baums in Textform angeben sind.

Die oben bereits erwähnte alternative Darstellung des Entscheidungsbaum-Modells in Textform wird in der Programmiersprachen R mit dem print-Befehl standardmäßig ausgegeben.

Entscheidungsbaum Text

Die Ausgabe in Textform ist auf folgende Weise zu lesen: Jeder Knoten oder jedes Blatt des Baumes erhält eine Zeilenausgabe mit folgenden Informationen:

6-3 Modell validieren

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.

Der zur Erstellung des Entscheidungsbaums verwendete R-Code 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: Performance-Kennzahlen  

#Lade benötigte Pakete
library(rpart)
library(caret)
library(ROCR)  

#Setze den Arbeitspfad
setwd("C:/Demo3")

#Lade externe Funktion
source("CreateSamples.r")

#CSV-Datei einlesen und speichern 
demo3=read.csv2(
  "automotive_data_140.csv",
  header = TRUE,sep = ";",dec = ".")

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

#Eingabe-Variable für CV
K=10 

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

#Ausgabematrix für Kennzahlen
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
testdata=demo3training[folds==i,]
pred=predict(fit, newdata=testdata, 
  type="class")

#Erzeuge Konfusionsmatrix mit 
#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] 
m_perf[i,2]=m_conf$byClass[5] 
m_perf[i,3]=m_conf$overall[1] 

#AUC, ROC
#Vorhersage für die Testdaten 
pred.prob=predict(fit, 
  newdata=testdata, 
  type="prob")

#beobachteter Ausfall
obs=(testdata$Ausfall=="ja")

#ROCR-Paket liefert 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)
}
#for-Schleifen-Ende

#Mittelung der Kennzahlen 
perf=colSums(m_perf)/K

#Ausgabe der Kennzahlen
perf
                          
#externe Funktion	definieren				
createCVFolds= function(data, 
  K=10, seed=444){ 
#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)
}
# Funktion-Ende

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 (Zeile 31), 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 12 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 27 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 23 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 52) 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 (Zeile 41).

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, Performance vorgestellten Formeln werden dann die Kennzahlen aus der Beobachtung-Vorhersagematrixbestimmt.

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

Der abgebildetet Quellcode liefert beim Durchlaufen die folgende Ausgabe, also die Kennzahlen zu jedem Schleifendurchlauf der Kreuzvalidierung ("m_perf"-Matrix) und die gemittelten Werte der vier Kennzahlen ("perf"-Vektor) zur Validierung des Modells:

Kennzahlen

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

Wie in Schritt 4: Datenanalyse: Performance beschrieben, kann ein Modell als "gut" bewertet werden, wenn die Kennzahlen nahe an 100% liegen. Unsere Kennzahlen liegen die Kennzahlen in einem guten Bereich und können ohne Vorbehalt zur Vorhersage eines Ausfalls für neue Merkmalskombinationen verwendet werden.

6-4 Modell verwenden

Der R-Code der Klassifikation ist im Block "Vorhersage"-Code zu sehen und beinhaltet den Schritt des Einlesens der Testdaten der Vorhersage eines Ausfalls für die vier neuen Merkmalskombinationen mit Hilfe des erstellten Entscheidungsbaum-Modells (Details in Tab "Vorhersage").

                          
#Demo 3: Predictive Maintenance mit R 
#Vorhersage 

#CSV-Datei einlesen und speichern
demo3test=read.csv2(
"automotive_data_test_4.csv",
header = TRUE,sep = ";",dec = ".")

#Erstelle Testdaten
testdata=demo3test[ ,c(-1)]                              

#Vorhersage 
pred = predict(fit,
newdata=testdata, type="class")

#vereinfachte Ausgabe 
predOut=matrix(ncol=2, nrow=4)
colnames(predOut)=
c("Neuer Datensatz",
  "Ausfall?")

predOut[,1]=c("Motor 1", "Motor 2", 
"Motor 3", "Motor 4")
predOut[,2]=as.vector(pred)
print(predOut)                    

Hier können Sie den gesamten Quellcode des Projektes herunterladen, die Datei demo3.R und demo3_kennzahlen.R (als komprimierte zip-Datei).

Vorhersage

Der Vorhersage-Code ist die Fortsetzung des vorherigen Codes und beinhaltet das Einlesen der Testdaten mittels der "read.csv2"-Funktion und dessen Speicherung unter dem Namen "demo3test" (Zeilen 5-7), wie schon bei den Trainingsdaten werden die Testdaten gekürzt (Löschen von 1. Spalte/Merkmal) und dann unter dem Namen "testdata" gespeichert ("="- Symbol, Zeile 10).

Die Vorhersage für die Testdaten erfolgt durch Aufruf der "predict"-Funktion (Zeile 13, 14), an die das Modell "fit" und die Testdaten "testdata" übergeben werden. Die Vorhersage wird unter dem Namen "pred" gespeichert.

Um die Vorhersage übersichtlicher darzustellen, wird nur die Klasseneinteilung (type="class", Ausfall: Ja/Nein) zusammen mit dem Motor-Namen, z.B. Motor 1 usw. in einer Matrix namens predOut (Zeile 17, 18) als Gesamtvorhersage (Zeilen 17-25) ausgegeben.


Die Vorhersage wird mit Hilfe der Funktionen "read.csv2" (Daten aus Datei einlesen), "rpart" (Klassifikationsmodell erstellen) und "predict" (Modell anwenden) durchgeführt.

Die predict-Funktion führt die Vorhersage durch.

Die predict-Funktion ist eine Funktion, die das als Parameter übergebene Vorhersagemodell (hier "fit") auf einen Datensatz (hier newdata=tesdata) anwendet und somit die Vorhersage bzw. Klassifikation für eine neue Beobachtung durchführt.
In unserer Demo wird mit dem Parameter type="class" für neue Beobachtungen bzw. die Zeilen im Testdatensatz eine Klassifikation in Ausfall ja oder nein anhand des Entscheidungsbaums durchgeführt. Mit type="prob" (probability, deutsch: Wahrscheinlichkeit) wird die Wahrscheinlichkeit für die Einteilung in die jeweilige Klasse (Ausfall: JA/NEIN) vorhergesagt. Es erfolgt also in beiden Fällen eine Vorhersage für neue Messwertkombinationen.


Die Klassifikation mit dem Entscheidungsbaum

Vorhersage mit dem Entscheidungsbaum

Für die Beobachtungen im Testdatensatz, also für neu erfasste Daten, wird nun durch Aufruf der predict-Funktion eine Zuordnung in Ausfall ja oder nein anhand des erstellten Entscheidungsbaum-Modells durchgeführt. Diese Zuordnung/Vorhersage erfolgt mittels Durchwandern des Pfades im Baum bis ein Blatt erreicht wird.

Wie in der obigen Ausgabe von R zu erkennen ist, führen die zweite und vierte Merkmalskombination laut Baum zu einem Ausfall (Wert/Level: "ja"), die anderen Beiden laut Modell aber nicht (Wert/Level: "nein").

Im aktuellen Arbeitsverzeichnis liegen nun alle verwendeten Datensätze, das Modell und die Vorhersage vor:

Verzeichnis 1

YouTube-Video und weitere Predictive Maintenance-Demos

Die Abbildung der Datenanalyse mit RStudio im Rahmen des Predictive Maintenance-Prozesses wird durch ein 7-Minuten-Video veranschaulicht.

Der Predictive Maintenance-Zyklus besteht neben dieser R-Demo noch aus den folgenden elab2go-Demos:

Modell-Vergleich mit Demo 2

Die hier ermittelten Kennzahlen können 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 übersichtlicher als der aus Demo 2, da der hier erstellte Baum 7 Merkmale zur Vorhersage aus den denn 22 Merkmalen auswählt statt 11 Merkmalen in Demo 2. Viele Merkmale kommen in beiden Modellen vor (Einlasslufttemperatur, Drosselklappenstellung oder Lambdasonde42) und sind auch ähnlich von der Stellung im Baum, dies zeigt deren hohe Relevanz bei der Vorhersage eines Ausfalls. Da das Durchlaufen der Knoten in dieser Demo etwas kürzer als in Demo2 ist, die Pfade aber noch vergleichbar lang sind, ist die Komplexität der Modelle damit auch ähnlich.

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

Kennzahl Demo 3 Demo 2
Accuracy 72.1% 65.7%
Recall (True Positive Rate) 85.6% 69.2%
Precision 72.5% 73.8%
AUC 74.7% 69.6%

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 Accuracy, True Positive Rate und die AUC sind in Demo 3 höher als in Demo 2 und damit näher an dem Idealwert von 100%.


Betrachten wir die praktische Anwendbarkeit der Modelle, dann spielt es auch eine 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 entscheidende Rolle.

Autoren, Tools und Quellen

Autoren:
 M.Sc. Anke Welz
 Prof. Dr. Eva Maria Kiss

Tools:

R, RStudio

elab2go Links und weitere Demos zum Predictive Maintenance-Zyklus:

R Links: