Preprocessing

Photo by Catalin Dragu on Unsplash

Einführung

Vor dem Trainieren des oder der Lernalgorithmen auf den Daten und nach dem Feature Engineering gibt es noch einen letzten Schritt in der Machine Learning Pipeline, um den Datensatz zu perfektionieren.

Die Methoden die beim Preprocessing (Datenvorverarbeitung) zum Einsatz kommen, sollen dazu beitragen, Informationen klarer herauszustellen und die Daten so zu transformieren, dass der Lernalgorithmus optimal aus ihnen lernen und Muster extrahieren kann.

Die Methoden sollten empirisch eingesetzt und getestet werden, denn es kann, wie bei der Algorithmen-Auswahl und der Feature-Zusammenstellung nie im Vorhinein bekannt sein, welche Transformation die besten Ergebnisse bringen wird, oder ob der Datensatz unbearbeitet möglicherweise sogar am besten performt. Die Komplexität des Datensatzes wird beim Preprocessing nicht verändert.

Die am häufigsten verwendeten Methoden sind das Standardisieren, Normalisieren der Variablen, das Encoding von kategorischen Variablen, die Untersuchung und Behandlung von Multikollinearität im Datensatz und verschiedene Transformationen, um die Wahrscheinlichkeitsverteilung einzelner Variablen anzupassen.

Anforderungen und Annahmen des Lernalgorithmus

Je nach Funktionsweise eines Lernalgorithmus, wie die Verlustfunktion aussieht und welcher Optimierungsalgorithmus verwendet wird, unterscheiden sich die Ansprüche verschiedener Lernalgorithmen an die Daten.

Parametrische Algorithmen beispielsweise haben eine festgelegte funktionelle Form, womit bereits Annahmen über die Form der wahren Funktion getroffen werden. Bei einer Linearen Regression bedeutet dies, dass der Datensatz frei von Multikollinearität und der Fehlerterm homoskedastisch und normalverteilt sein sollte.

Auch bei nichtparametrischen Lernalgorithmen können Maßnahmen getroffen werden, um das Lernen zu vereinfachen und zu beschleunigen. So sollte bei der Verwendung von Lernalgorithmen, die Distanz-Metriken oder Gradient Descent verwenden, die Daten immer skaliert werden.

Über baumbasierte Algorithmen ist oft zu lesen, dass sie anspruchslos seien, doch ist dies fraglich. In der Praxis zeigt sich oft, dass bei diesen eine Multikollinearität im Datensatz Probleme bei der Abschätzung der Wichtigkeit von Variablen (Feature Importance) machen kann.

Aus diesem Grund ist es unerlässlich, vor der Verwendung eines Lernalgorithmus diesen gut kennen zu lernen und zu wissen, wie er funktioniert, um mögliche Fallen zu umgehen.

Die Standardisierung

Beim Standardisieren wird eine Variable so transformiert, dass die resultierende Wahrscheinlichkeitsverteilung einen Mittelwert 0 und eine Standardabweichung von 1 hat. Dabei fallen die Einheiten weg, was für den Vergleich verschiedener Variablen von Vorteil sein kann. Bei der Anwendung sollte bedacht werden, dass der Einfluss von Ausreißern stark reduziert wird. Dies kann, je nach Einsatz, zum Vorteil oder Nachteil gereichen.

Die Hauptkomponentenanalyse, Logistic Regression, Linear Regression, Support Vector Machines, Perceptrons, Neuronale Netze, Linear Discriminant Analysis und auch Clusteranalysen profitieren von einer Standardisierung.

Wichtig zu wissen ist hier, dass bei linearen Funktionen die Koeffizienten nur richtig interpretiert werden können, wenn die Daten standardisiert sind.

In Scikit-Learn wird für das Standardisieren der StandardScaler verwandt.

Die blaue Normalverteilung ist standardisiert, die beiden anderen nicht. Quelle

Die Normalisierung

Bei der Normalisierung werden die Daten so skaliert, dass sich alle Werte der Variablen in einem definierten Bereich befinden.

Sie kann sich positiv auf die Geschwindigkeit von Lernalgorithmen, die Gradient Descent als Optimierungsalgorithmus verwenden, auswirken. Auch Lernalgorithmen, die die Inputs gewichten, wie alle Regressionsalgorithmen und Neuronale Netze ist eine Normalisierung der Daten ein wichtiger Schritt.

Ebenso sollten die Daten für die Verwendung von Lernalgorithmen, die Distanz-Metriken verwenden, so wie K-Nearest-Neighbors, normalisiert werden. Die einzigen Lernalgorithmen, die immun gegen verschiedene Größenordnungen von Skalen in den Variablen sind, sind jede, die auf Entscheidungsbäumen basieren.

Wenn es viele Ausreißer im Datensatz gibt, kann es beim Normalisieren Probleme geben, da alle anderen Werte an diese angepasst werden, was beispielsweise bei einem Ausreißer nach oben bedeuten würde, dass alle anderen Werte unten zusammengequetscht würden.

In Scikit-Learn skaliert der MinMaxScaler alle Daten in einen Bereich von [0,1] und der MaxAbsScaler skaliert die Daten auf [-1,1]. Der RobustScaler kann verwendet werden, wenn es viele Ausreißer gibt. Er skaliert die Daten in den Bereich von vordefinierten Interquartilsabständen.

Lernalgorithmen, die von einer Normalisierung profitieren, sind: Neuronale Netze, Regressionsalgorithmen, Support Vector Machines, K-Nearest-Neighbors und alle Algorithmen, die Optimierungsalgorithmen wie Gradient Descent verwenden.

Um Data Leakage zu vermeiden, sollte der Datensatz erst nach der Aufteilung in Train/Test normalisiert werden.

Das Kodieren kategorischer Variablen

In Scikit-Learn können Lernalgorithmen nur zusammen mit rein numerischen Datensätzen verwendet werden. Um dieser Anforderung zu genügen, werden kategorische Variablen in Dummy Variablen umgewandelt. Dieses sind binäre Variablen die das Vorhandensein oder die Abwesenheit eines Attributes anzeigen.

Nach der Umwandlung sollte eine der Kategorien entfernt wird, dies ist dann die Basis-Kategorie. Dies wird gemacht, um eine Multikollinearität zu vermeiden und nicht in die Dummy Variable Trap zu fallen.

Eine Ausnahme, bei der die kategorischen Variablen nicht transformiert werden müssen, ist die Implementierung von Random Forest und anderen Algorithmen, die auf Entscheidungsbäumen basieren, in H2O. Hier werden die kategorischen Daten direkt gehandhabt.

Das Kodieren von kategorischen Variablen kann in Scikit-Learn mit dem  OneHotEncoder oder in Pandas mit get_dummies gemacht werden.

Multikollinearität im Datensatz

Multikollinearität bedeutet, dass eine oder mehrere Variablen im Datensatz eine hohe Korrelation miteinander haben. Dadurch enthält der Datensatz redundante, und damit überflüssige, Informationen.

Bei Regressionsanalysen stellt die Multikollinearität insofern ein Problem dar, da hier vorausgesetzt wird, dass die Prädiktoren unabhängig voneinander sind. Dies ist eine Voraussetzung, damit die Beziehung zwischen Prädiktor und Target zu isoliert werden kann. Es wird der marginale Effekt einer Variablen auf das Target gemessen, indem diese verändert wird, während alle anderen konstant gehalten werden. Dies ist nicht mehr möglich, wenn die Veränderung einer Variablen die Veränderung einer anderen nach sich zieht, und die Koeffizienten der unabhängigen Variablen können nicht mehr eindeutig bestimmt werden.

Dies bedeutet eine sehr hohe Varianz (Standardfehler) bei der Schätzung der Koeffizienten, womit die Konfidenzintervalle sehr weit werden, und Signifikanztests erschwert werden.

Das resultierende Modell ist nicht robust und schon kleine Änderungen im Datensatz, beispielsweise durch das Hinzufügen oder Entfernen einer Variablen, oder die Wahl einer anderen Stichprobe, große Änderungen der geschätzten Koeffizienten nach sich ziehen können.

Die Vorhersagen aus Modellen mit kollinearen Variablen sind im Allgemeinen korrekt, wenn davon ausgegangen werden kann, dass bei neuen Daten die Kollinearität das gleiche Muster aufweist. Ist dies nicht der Fall, werden auch die Vorhersagen nicht mehr stimmen.

Weder bei der Klassifizierung noch bei der Regression können die Koeffizienten und damit die Feature Importance korrekt interpretiert werden. Selbst bei Random Forest, von dem es im Allgemeinen heißt, dass das Modell nicht sensitiv auf Multikollinearität sei, kann davon ausgegangen werden, dass die Feature Importances nicht stimmen.

Ein Hinweis auf eine Multikollinearität im Datensatz kann eine starke Änderung der Koeffizienten, beim Hinzufügen oder Entfernen von Prädiktoren.

Auch hilfreich ist eine Analyse bivariater Korrelationen, beispielweise mit einer Korrelationsmatrix in Pandas, die für alle Variablenpaare den Korrelationskoeffizienten nach Pearson, Kendall oder Spearman berechnet. Ist der Korrelationskoeffizient größer als 0.9, sollte korrigiert werden.

Eine zuverlässige Methode ist die Berechnung der Varianzinflationsfaktoren (Variance Inflation Factor, VIF). Diese werden für jede unabhängige Variable berechnet. Dafür wird nacheinander für jede angenommen, dass sie die abhängige Variable ist. Damit wird dann die Güte der Erklärung durch die anderen in einer Regression berechnet. Der Bereich für die Faktoren startet bei 1 und ist nach oben offen. Ein Wert von 1 bedeutet keine Korrelation. Ein VIF zwischen 1 und 5 weist auf eine moderate Korrelation hin, für die aber noch keine Maßnahmen ergriffen werden müssen. Erst ein VIF über 5 ist als kritisch anzusehen, manche sagen, erst ab 10.

Multikollinearität kann dadurch entstehen, dass eine wichtige Variable im Datensatz fehlt, die mehrere Variablen im Datensatz beeinflusst. Die fehlende Variable wird als Drittvariable oder Confounder bezeichnet. Hier kann eine Vergrößerung der Stichprobe helfen. Am besten wäre es, die fehlenden Prädiktoren zu finden und in den Datensatz zu integrieren.

Beim Kodieren von kategorischen Variablen entsteht Multikollinearität, wenn vergessen wird, die Basisvariable zu entfernen (Dummy Trap).

Auch beim Hinzufügen von Interaktions- oder polynomialer Terme kann sie entstehen, dem kann mit einem Zentrieren der Variablen vor dem Hinzufügen dieser entgegengewirkt werden.

Eine gute Methode, um Multikollinearität im Datensatz zu reduzieren, ist die Hauptkomponentenanalyse. In dieser werden durch eine Linearkombination der Variablen unkorrelierte künstliche Variablen (Hauptkomponenten) erzeugt.

Multikollinearität muss nicht immer ein Problem darstellen und kann oft einfach ignoriert werden. Viele Algorithmen, wie Ridge Regression oder Lasso Regression habe keine Schwierigkeiten mit einer Multikollinearität im Datensatz.

Wie so oft, kommt es auf mehrere Faktoren an. In folgenden Fällen kann man den Datensatz belassen, wie er ist:

  • Wenn die Korrelationen schwach sind.
  • Bei der Verwendung des Modells, wenn das primäre Ziel Vorhersagen sind, kann man auch hoch korrelierende Variablen belassen, da die Qualität der Vorhersagen davon unberührt bleibt.
  • Wenn es nur Kontrollvariablen sind, die hoch korreliert sind und die interessanten Variablen nicht miteinander korrelieren
  • Wenn die Korrelationen in Dummy-Variablen oder Polynomialen- bzw. Interaktionstermen stammen

Am besten ist es, man testet mehrere Herangehensweisen, um zu sehen, wie das Modell mit dem ursprünglichen Datensatz und mit reduzierter Multikollinearität jeweils performt.

Bei der Verwendung von Linear Regression, Logistic Regression, Support Vector Machines mit linearem Kernel und Random Forest sollte sie jedoch immer reduziert werden.

Unausgeglichene Klassen bei einer Klassifikation

In vielen natürlichen Systemen kommt es vor, dass es viel mehr Beobachtungen einer Kategorie gibt, als der anderen. Dies ist zum Beispiel bei der Fraud Detection oder beim  Auftreten seltener Krankheiten der Fall.

Im Fall einer explorativen Datenanalyse reicht es aus, festzustellen, ob die Verteilung der Klassen natürlich und nicht etwa ein Fehler aus dem Sampling ist.

Für das Modellieren der Repräsentation kann es jedoch oft hilfreich sein, die Klassen so auszugleichen, dass sie in etwa gleich häufig anzutreffen sind, damit der Lernalgorithmus sie gleich gut lernen kann. Das Ausgleichen findet über ein Resampling statt. Dafür werden entweder die unterrepräsentierte Klasse künstliche Instanzen hinzugefügt oder Instanzen der überrepräsentierten Klasse entfernt. Natürlich ist es immer vorzuziehen, so viele Informationen, wie möglich im Datensatz zu belassen, es sei denn, die Daten sind im Überfluss vorhanden.

Es gibt viele Methoden für das Erzeugen von neuen Instanzen, einige davon werden hier genauer beschrieben.

Variablentransformationen

In der Datenanalyse ist eine Transformation das Ersetzen einer Variablen durch eine Funktion dieser Variablen. Oft ist der Grund für die Verwendung einer Transformation die Veränderung der Form der Wahrscheinlichkeitsverteilung einer Variablen, um sie beispielsweise symmetrisch oder die Streuung gleichmäßig zu machen. Damit ist eine Variable leichter zu handhaben, als wenn sie eine Schiefe aufweist. Bei vielen statistischen Methoden ist eine Normalverteilung der Residuen Voraussetzung, was indirekt durch eine Normalverteilung der unabhängigen Variablen erreicht werden kann.

Durch eine Transformation können auch nichtlineare Beziehungen zwischen den unabhängigen Variablen und der unabhängigen Variablen linearisiert werden.

Natürliche Verteilungen, die nicht symmetrisch sind, also schief sind, kommen in der Natur sehr häufig vor, dazu gehörten vor allem Verteilungen, die dem Potenzgesetz (Power Law) unterliegen, wie bei es bei der Einkommensverteilung oder Bevölkerungsdichte der Fall ist. Diese Daten können so transformiert werden, dass sie einer Normalverteilung mit einer Schiefe von 0 gleichen.

Ist die Wahrscheinlichkeitsverteilung einer Variablen jedoch wider Erwarten nicht normalverteilt, sollte der Datensatz auf Plausibilität hin untersucht werden. Ausreißer, Messfehler oder auch eine nicht repräsentative Stichprobe könnten die Ursache für eine ungewöhnliche Verteilung sein und sollten vor der Anwendung einer Transformation erklärt oder ausgeschlossen werden.

Um eine rechtsschiefe Verteilung symmetrisch zu machen, kann die Variable logarithmiert werden, es kann die Wurzel gezogen oder der Kehrwert genommen werden.

Bei einer linksschiefen Verteilung kann die Variable quadriert oder kubiert werden. Um die beste Transformation für die vorliegenden Daten zu finden, kann eine Box-Cox Transformation angewandt werden.

In Scikit-Learn kann mit power_transform gearbeitet werden. Hier kann zwischen der Box-Cox Transformation, mit der ausschließlich positive Werte transformiert werden können und der Yeo-Johnson, die auch mit negativen Werten umgehen kann, gewählt werden. Auch in der SciPy Library gibt es eine Implementierung für boxcox.

Linksschiefe und Rechtsschiefe Verteilung aus Wikipedia

Zum Weiterlesen