› 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'})
Auszüge der Funktionsaufrufe aus dem Kennzahl-Code.teilds = cvpartition(x,'k',anzTeil);
Cf = cfmatrix2(actual, vorhersageCV,...
[0,1], 0, 0);
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:
Das Objekt besteht aus Eigenschaften, denen Werte zugeordnet sind. Diese Eigenschaften können verschiedene Formate besitzen:
- Der Typ des Verfahrens "type" ist in dieser Demo "KFold", d.h. die Datensätze entsprechen den Bedingungen der Kreuzvalidierung.
- Die Variable "NumTestSets", die der Anzahl der Teildatensätze entspricht.
- Die Variable "NumObservations", die der Gesamtzahl der Beobachtungen in jedem Teildatensatz entspricht
- Der Vektor "TrainSize" der Länge "NumTestSets", der die Anzahl der Beobachtungen in dem Trainingsdatensatz für jede der "NumTestSets" Teildatensätze enthält.
- Der Vektor "TestSize" der Länge "NumTestSets", der die Anzahl der Beobachtungen in dem Testdatensatz für jede der "NumTestSets" Teildatensätze enthält.
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:
- Accuracy = 66.21%
- Recall (True Positive Rate) TPR = 81.93%
- Precision = 66.06%
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):
Autoren, Tools und Quellen
Autoren
M. Sc. Anke Welz
Prof. Dr. Eva Maria Kiss
Tools:
Hier können Sie den Quellcode des Projektes herunterladen, die Datei demo5_teil2.m (als komprimierte zip-Datei).
- [1] MATLAB Statistics and Machine Learning Toolbox: de.mathworks.com/products/statistics.html
- [2] MATLAB Live Editor: de.mathworks.com/products/matlab/live-editor.html
elab2go-Links
- [1] MATLAB-Tutorial: elab2go.de/demo-mat1
- [2] Demo-MAT3 Clusteranalyse "Automotive in 3D": elab2go.de/demo-mat3
- [3] Demo-MAT4 Predictive Maintenance mit MATLAB": elab2go.de/demo-mat4
Quellen und weiterführende Links
- [1] Funktion fitctree: de.mathworks.com/help/stats/fitctree.html
- [2] Avinash Uppuluri, cfmatrix2 (MATLAB File Exchange): Eine Funktion aus der MATLAB Community für die Berechnung von Confusion Matrix + Kennzahlen