›   Demo 5 Teil 3: Datenanalyse mit MATLAB
›   Performance-Kennzahlen

Im Rahmen der Datenanalyse (Teil 2 dieses Demonstrators) haben wir die Frage nach den Kombinationen von Merkmalen, die zu einem Ausfall eines Motors führen, in einem MATLAB-Live Script beantwortet. Das Vorhersagemodell, der Entscheidungsbaum, wurde im Live Script erstellt, interpretiert und danach zur Vorhersage eines Ausfalls bei neu erfassten Daten verwendet.

Nun stellt sich die Frage, wie gut das Vorhersagemodell überhaupt ist.

In diesem Teil der Demo werden Kennzahlen bestimmt, die zur Beantwortung dieser Frage herangezogen werden können. Wie in Schritt 4: Datenanalyse Fortsetzung beschrieben, erheben wir mit Hilfe des Testverfahrens der Kreuzvalidierung die Kennzahlen Accuracy, Precision und Recall zur Beurteilung des Testfehlers und überprüfen, ob diese in einem vorher festgelegten, akzeptablen Bereich liegen.

Dazu wurde ein interaktives Live Script mit Hilfe der MATLAB Statistics and Machine Learning Toolbox und des LiveScript Editors erstellt. Die Funktionalität und die einzelnen Schritte sind in dem Lernvideo Demo5 - Predictive Maintenance mit MATLAB - Kennzahlen auf unserem YouTube-Kanal veröffentlicht.

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 MATLAB

Der zur Erstellung des Entscheidungsbaums und zur Vorhersage verwendete MATLAB-Code aus dem Datenanalyse-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 MATLAB-Code bzw. das interaktive Live Script besteht neben den bereits erläuterten Teilen aus: einem Daten-Code, dem Kennzahl-Code und den wiederverwendbaren Hilfsfunktionen cvpartition() zur Bestimmung der Teildatensätze der Kreuzvalidierung und cfmatrix2() aus der MATLAB-Community zur Bestimmung der Kennzahlen.

Bevor das Live Script verwendet werden kann, muss die Statistics and Machine Learning-Toolbox in MATLAB installiert sein und der Arbeitspfad auf den Ordner gesetzt werden, der alle unter dem Download vorhandenen Dateien und das Live Script enthält.

                        
 % Einlesen der Daten
 data = readtable('demo2_training2.xlsx',...
                  'ReadVariableNames',true); 
 
 % Ausfall-Variable auslesen und speichern
 ausfall = data(1:end,2); 
 % Merkmale erstellen 
 merkmale = data(1:end,[3:23 25]); 
 % Erstellung der Teildatensätze 
 anzahl=size(ausfall);
 x=1:anzahl(1);
 
 anzTeil = 10;
 teilds = cvpartition(x,'k',anzTeil);
 
 % Parameterwahl und Erstellung des Modells
 n=20; m=10;
 
 % Ausgabe-Matrix für die CV-Durchläufe(Zeilen) 
 % mit Kennzahlen (Spalten: Precision, 
 % Sensitivity and Accuracy)
 m_kenn = zeros(teilds.NumTestSets,3);
 
 % Kreuzvalidierung
 for i = 1:teilds.NumTestSets
     trIdx = teilds.training(i);
     teIdx = teilds.test(i);
     % Bestimmung des Modells anhand der Trainingsdaten
     treeCV = fitctree(...                             
     merkmale(trIdx,:), ausfall(trIdx,:),..
     'SplitCriterion','deviance',...
     'MinParentSize',n,'MaxNumSplits',m);
           
     vorhersageCV = predict(treeCV,merkmale(teIdx,:));
     
     % Bestimmung der Kennzahlen
     actual = strcmp(ausfall{teIdx,:}, 'ja');
     vorhersageCV = strcmp(vorhersageCV,'ja');
    
     Cf = cfmatrix2(actual, vorhersageCV,...
          [0,1], 0, 0);
     
     mCv = Cf{1};
     m_kenn(i,1) = mCv(1,2);
     m_kenn(i,2) = mCv(2,2);
     m_kenn(i,3) = Cf{2};
 end
 
 kenn = ...
  [sum(m_kenn(:,1))/teilds.NumTestSets, ...
   sum(m_kenn(:,2))/teilds.NumTestSets,...
   sum(m_kenn(:,3))/teilds.NumTestSets ];
     
 % Output-Layout
 array2table(kenn, 'VariableNames',...
  {'Precision', 'Recall', 'Accuracy'})
 
 teilds = cvpartition(x,'k',anzTeil);
 
 Cf = cfmatrix2(actual, vorhersageCV,...
          [0,1], 0, 0);
Auszüge der Funktionsaufrufe aus dem Kennzahl-Code.

In den Zeilen 2-3 des Daten-Codes wird die Excel-Datei "demo2_training2.xlsx" mit der "readtable"-Funktion eingelesen und mit der Zuweisung ("="-Zeichen) unter dem Namen "data" gespeichert. Die Trainingsdaten werden verwendet um den Vektor, der die Ausfall-Variable enthält, und den Vektor mit ausgewählten Merkmalen zu erstellen und zu speichern (Zeilen 6 und 8).

Die Auswahl von Merkmalen aus dem Datensatz erfolgt durch Angabe der Zeilen und Spalten in der üblichen MATLAB-Syntax:

merkmale(1:end, [3:23 25]) wählt z.B. die Zeilen 1 bis zur letzen Zeile ("end") und die Spalten 3 bis 23 und 25 aus. Der Aufruf data(1:2, :) wählt z.B. die ersten beiden Zeilen und alle Spalten (":"-Zeichen) aus.

In Zeile 5 wird festgelegt wieviele Teildatensätze zur Durchführung der Kreuzvalidierung erstellt werden sollen, diese Variable "anzTeil" wird dann als ein Parameter an die "cvpartition"-Funktion in Zeile 6 übergeben, weitere Parameter dieser Funktion sind unter dem Tab "Hilfsfunktionen" erläutert. Die Funktion "cvpartition" liefert ein Objekt zurück, das neben anderen Werten auch die Teildatensätze enthält, dieses Objekt wird unter dem Namen "teilds" gespeichert.

In der for-Schleife (Zeile 17-39) wird die Kreuzvaliderung durchgeführt, d.h. für jeweils den i-ten Teildatensatz wird das Vorhersage-Modell mit dem Trainingsdatensatz (teilds.training(i);) mit Hilfe der "fitctree"-Funktion erstellt (Zeile 21-24), dieses wird dann mit dem i-ten Testdatensatz (teilds.test(i);) der "predict"-Funktion übergeben (Zeie 26) und die Vorhersagen werden danach in der "cfmatrix2"-Funktion mit den tatsächlichen Werten für den Ausfall der Testdaten verglichen (Zeile 32 und 33, Details siehe Tab "Hilfsfunktionen") um die Kennzahlen zu bestimmen.

In den Zeilen 41-44 werden die summierten Kennzahlen der einzelnen Kreuzvalidierungs-Durchläufe durch die Anzahl der gesamten Durchläufe (Variable "NumTestSets" aus dem cvpartition-Objekt "teilds") geteilt, um eine mittlere Kennzahlen zu erhalten.

Zeile 47 und 48 erstellt aus der Matrix der gemittelten Kennzahlen eine Tabelle mit den Spaltennamen "Precision", "Recall" und "Accuracy" und eine Ausgabe dieser Tabelle erfolgt in der Ausgabe-Spalte.

Der "cvpartition"-Funktion werden folgende Parameter beim Aufruf übergeben:

  • Ein Vektor "x" mit den Beobachtungsnummern, der die Werte 1 bis 136 enthält.
  • Der zweite Parameter gibt das Verfahren zur Bildung der Teildatensätze an, hier wird der Parameter auf "k", also "KFold" gesetzt, damit "anzTeil" Teildatensätze entsprechend der Kreuzvalidierung erstellt werden.
  • Der Wert "anzTeil", der die Anzahl der zu erstellenden Teildatensätze enthält.

Die Funktion "cvpartition" liefert ein Objekt zurück, das neben anderen Werten auch die Teildatensätze enthält, deswegen der Name "teilds" im Kennzahl-Code. Weitere Infos, siehe "Details zu den Variablen".

Die "cfmatrix2"-Funktion aus der MATLAB-Community ist von uns um Objekte zur Speicherung und damit zur Weiterverwendung der Kennzahlen modifiziert worden. Der Funktion werden folgende Parameter beim Aufruf übergeben:

  • Ein Vektor "actual" , der die tatsächlichen Werte zum Ausfall enthält, also die Werte JA/NEIN bzw. 1/0.
  • Ein Vektor "vorhersageCV" , der die vorhergesagten Werte zum Ausfall enthält, also die Werte JA/NEIN bzw. 1/0.
  • Der Vektor (0,1), der angibt welche Kategorien die beiden ersten Parameter annehmen können. Hier also 0 und 1.
  • Der vierter Parameter, der festlegt, ob die Werte in der Zuordnungstabelle in Prozent (=1) oder als Kommazahl (=0) angegeben werden.
  • Und der letzte Parameter, der die Ausgabe der Funktions-Ergebnisse im Command-Fenster steuert, mit dem Wert 0 wird die Ausgabe unterdrückt.

Verwendete MATLAB-Funktionen

Die readtable-Funktion liest Daten im Excel-Format ein.

Die readtable-Funktion ist eine Funktion, die Daten im Excel-Format einliest.
Die readtable-Funktion wird in unserem Prozess zweimal verwendet: einmal, um den Trainingsdatensatz einzubinden, und einmal, um den Testdatensatz einzubinden.

Die fitctree-Funktion erstellt den Entscheidungsbaum.

Die fitctree-Funktion ist eine Funktion aus der "Statistics and Machine Learning"-Toolbox, die für die Daten den passenden Algorithmus wählt und einen Entscheidungsbaum auf Basis eines unter den Parametern wählbaren Kriteriums erstellt, z.B. der Entropie bzw. des Informationgehalts.
Wir erstellen den Baum mittels des Entropie/Informationgehalt-Kriteriums (mit Setzen des Parameters "'SplitCriterion'" auf "'deviance'") basierend auf den Trainingsdatensatz der Motoren.

Die Variable "Ausfall" wird mit Übergabe als zweiter Parameter in der fitctree-Funktion als Vorhersagevariable definiert.

Die predict-Funktion führt die Vorhersage durch.

Die predict-Funktion ist eine Funktion, die das als Parameter übergebene Vorhersagemodell (hier "tree") auf einen übergebenen Datensatz anwendet und somit die Vorhersage bzw. Klassifikation für eine neue Beobachtung durchführt.

Die cvpartition-Funktion erstellt die Teildatensätze.

Die cvpartition-Funktion ist eine Funktion, die für einen übergebenen Datensatz (hier die Beobachtungsnummern, der Vektor x) "anzTeil" Teildatensätze erstellt, diese Teildatensätze sind jeweils in den Trainings- und Testdatensatz unterteilt.

Wenn der zweite Parameter auf "k", also "KFold", gesetzt wird, werden die Teildatensätze entsprechend der Verwendung in der Kreuzvalidierung erstellt.

Die Funktion "cvpartition" liefert ein Objekt zurück, das neben anderen Werten auch die Teildatensätze selbst und deren Aufteilung enthält.

Die cfmatrix2-Funktion liefert die Kennzahlen.

Die cfmatrix2-Funktion ist eine Funktion aus der MATLAB-Community zur Bestimmung der Kennzahlen, die wir um Objekte zur Speicherung und damit zur Weiterverwendung der Kennzahlen erweitert haben.

In der Funktion werden in einer Zuordnungstabelle die tatsächlichen Werten (Vektor "actual") zum Ausfall mit den Vorhersagen (Vektor "vorhersageCV") verglichen, die Ausgabe der Tabelle wird mit Setzen des letzten Übergabeparameters auf 0 unterdrückt. Ob die Werte in der Tablle in Prozent (=1) oder als Kommazahl (=0) angezeigt werden, das wird über den vierten Übergabeparameter gesteuert. Außerdem muss der Funktion über den dritten Parameter mitgeteilt werden, welche Werte die Ausfallvariable annehmen kann, hier 0 und 1.

Die von uns erweiterte cfmatrix2-Funktion liefert eine Liste mit den Kennzahlen zurück, die in jedem Schleifendurchlauf abgerufen wird.

Details zu den Variablen

Im MATLAB-Workspace ist die Struktur des cvpartiton-Objektes sichtbar:

cvpartition_Demo5

Das Objekt besteht aus Eigenschaften, denen Werte zugeordnet sind. Diese Eigenschaften können verschiedene Formate besitzen:

Außerdem können die Trainings- und Teildatensätze des i-ten Teildatensatzes gezielt mit name.training(i) und name.test(i) abgerufen werden, dazu muss das cvpartition-Objekt aber unter einem Namen "name" gespeichert werden.

Beurteilung des Vorhersagemodells anhand der Kennzahlen

Wie gut der Entscheidungsbaum aus dem Datenanalyse-Teil der Demo zur Vorhersage eines Ausfalls geeignet ist, können wir nun anhand der 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. Für unser Modell gilt folgende Beurteilung (Auszug aus dem Live Script-Output):

Kennzahlen_Demo5


Quellcode und weitere Infos

Hier können Sie den Quellcode des Projektes herunterladen, die Datei demo5_teil2.m (als komprimierte zip-Datei).

Mit Beiträgen von: Anke Welz, Eva Kiss
Tools: MATLAB Statistics and Machine Learning Toolbox