Preprocessing in Data Science (Teil 1): Zentrieren, Skalieren und k-NN
Dieser Artikel zeigt, warum Preprocessing in der Machine-Learning-Pipeline so wichtig ist – anhand davon, wie Zentrierung und Skalierung die Modellleistung verbessern können.
· 11 Min. lesen
Entdecke KI
Ähnlich

Tutorial
Wie man Listen in Python aufteilt: Einfache Beispiele und fortgeschrittene Methoden
Lerne, wie du Python-Listen mit Techniken wie Slicing, List Comprehensions und itertools aufteilen kannst. Finde heraus, wann du welche Methode für die beste Datenverarbeitung nutzen solltest.
Tutorial
OLS-Regression: Die wichtigsten Ideen erklärt
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
Tutorial
Python Datenstrukturen Tutorial
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.

In diesem Artikel nutze ich das Beispiel der Skalierung numerischer Daten (numerische Daten: Werte bestehen aus Zahlen statt Kategorien/Strings; Skalierung: mithilfe einfacher Arithmetik den Wertebereich verändern; Details folgen), um zu zeigen, warum du Preprocessing stets als Bestandteil einer größeren Struktur betrachten solltest: der Machine-Learning-(ML)-Pipeline. Dazu schauen wir uns ein Praxisbeispiel an, in dem Skalierung die Modellleistung verbessert.
\nZunächst führe ich in Klassifikationsprobleme im ML ein und in k-Nearest Neighbors, einen der einfachsten Algorithmen dafür. Um die Bedeutung der Skalierung numerischer Daten in diesem Setting zu verstehen, stelle ich Metriken zur Beurteilung der Modellleistung sowie die Konzepte Trainings- und Testset vor. All das wenden wir anschließend auf einen Datensatz an, in dem ich die Qualität von Rotwein klassifizieren möchte. Außerdem ordne ich Preprocessing an der sinnvollsten Stelle ein: zu Beginn einer iterativen Data-Science-Pipeline. Alle Beispiele sind in Python. Wenn du Python noch nicht kennst, findest du unsere DataCamp-Kurse hier. Ich verwende die Bibliotheken pandas für DataFrames und scikit-learn für Machine Learning.
\nDies ist Teil eins eines dreiteiligen Tutorials:
\nTeil 2: Zentrieren, Skalieren und Logistische Regression
\nTeil 3: Skalierung synthetischer Daten
\nEin kurzer Einstieg in Klassifikationsprobleme im Machine Learning
\nDinge in der erlebbaren Welt zu klassifizieren und zu benennen, ist eine uralte Kunst. Bereits im 4. Jahrhundert v. Chr. entwarf Aristoteles ein Klassifikationssystem für Lebewesen, das 2.000 Jahre lang genutzt wurde. Heute verstehen wir Klassifikation meist als Machine-Learning-Aufgabe, genauer als Aufgabe des überwachtes Lernens. Das Grundprinzip ist simpel: Wir haben Daten, bestehend aus Prädiktorvariablen und einer Zielvariablen. Ziel des überwachten Lernens ist es, ein Modell zu bauen, das die Zielvariable auf Basis der Prädiktoren „gut“ vorhersagt. Besteht die Zielvariable aus Kategorien (z. B. „Klick“ oder „kein Klick“, „bösartig“ oder „gutartig“), sprechen wir von Klassifikation. Handelt es sich dagegen um eine stetige Variable (z. B. Hauspreis), ist es eine Regression.
\nEin Beispiel macht es greifbar: Im Heart-Disease-Datensatz gibt es 75 Prädiktoren wie „Alter“, „Geschlecht“ und „Raucherstatus“. Die Zielvariable beschreibt das Vorhandensein von Herzerkrankungen und reicht von 0 (keine) bis 4. Viele Arbeiten zu diesem Datensatz konzentrieren sich darauf, das Vorhandensein von Herzkrankheiten vom Nichtvorhandensein zu unterscheiden. Das ist eine Klassifikationsaufgabe. Würdest du versuchen, den tatsächlichen Wert (0 bis 4) vorherzusagen, wäre das ein Regressionsproblem (weil die Zielvariable geordnet ist). Über Regression spreche ich im nächsten Beitrag. Hier schauen wir uns einen der einfachsten Klassifikations-Algorithmen an: den k-Nearest-Neighbors-Algorithmus.
\nk-Nearest Neighbors für Klassifikation im Machine Learning
\nAngenommen, wir haben gelabelte Daten, etwa Merkmale von Rotwein (z. B. Alkoholgehalt, Dichte, Zitronensäuregehalt, pH-Wert usw.; das sind die Prädiktoren) mit der Zielvariable „Quality“ und den Labels „good“ & „bad“. Dann besteht die Klassifikationsaufgabe darin, für einen neuen, noch nicht gelabelten Wein seine „Quality“ vorherzusagen. Sind alle Prädiktoren numerisch (für kategoriale gibt es andere Ansätze), kann jede Zeile/jeder Wein als ein Punkt in einem n-dimensionalen Raum betrachtet werden. k-Nearest Neighbors (k-NN) ist dann ein konzeptionell und rechnerisch einfacher Klassifikationsansatz: Für jeden neuen, ungelabelten Wein berechnen wir für ein ganzzahliges k seine k nächsten Nachbarn im n-dimensionalen Prädiktorraums. Dann schauen wir auf die Labels dieser k Nachbarn („good“ oder „bad“) und vergeben dem neuen Wein das Label mit den meisten Stimmen (z. B. wenn k = 5, drei Nachbarn „good“ und zwei „bad“, labelt das Modell den Wein als „good“). Beachte: „Training“ bedeutet hier im Grunde nur, die Datenpunkte zu speichern – es gibt keine zu schätzenden Parameter!
\nEine visuelle Beschreibung von k-Nearest Neighbors
\nIn der Abbildung unten siehst du k-NN in 2D: Wie würdest du den Punkt in der Mitte klassifizieren? Wenn k=3 ist, wäre er rot; bei k=5 wäre er grün.
\nk-NN in Python (scikit-learn) implementieren
\nSchau dir zunächst die Wertebereiche der Prädiktoren an: „free sulfur dioxide“ reicht von 0 bis ca. 70, „volatile acidity“ von ca. 0 bis 1,2. Ersteres hat also einen zwei Größenordnungen größeren Bereich als letzteres. Jeder Algorithmus, der Distanzen zwischen Punkten berücksichtigt – wie k-NN –, kann dadurch stark und unfair auf Variablen mit großem Wertebereich fokussieren, etwa auf „free sulfur dioxide“, das womöglich nur Rauschen enthält. Das ist ein starkes Argument für die Skalierung der Daten, zu der wir gleich kommen.
\nDie Zielvariable ist eine „Quality“-Bewertung und reicht von 3 bis 8. Für eine einfachere Darstellung machen wir daraus eine binäre Variable: „good“ (Rating > 5) und „bad“ (Rating <= 5). Wir plotten Histogramme beider Varianten, um ein Gefühl für die Verteilung zu bekommen.
\n\n\nk-Nearest Neighbors: Wie gut performt es?
\nHinweis: Accuracy lässt sich auch anhand der Konfusionsmatrix definieren und wird für binäre Klassifikation häufig über True Positives und False Negatives beschrieben. Weitere gängige Kennzahlen aus der Konfusionsmatrix sind Precision (True Positives geteilt durch True Positives plus False Positives) und Recall (True Positives geteilt durch True Positives plus False Negatives). Eine weitere Kennzahl ist der F1-Score, das harmonische Mittel aus Precision und Recall. Siehe Machine Learning Mastery für eine gute Einführung; außerdem die Wikipedia-Artikel zur Konfusionsmatrix und zum F1-Score.
\nk-Nearest Neighbors: Praxisleistung und Train-Test-Split
\nJetzt führen wir Skalierung und Zentrierung ein – die grundlegendsten Methoden des Preprocessings numerischer Daten – und prüfen, ob und wie sie die Modellleistung beeinflussen.
\nDie Mechanik des Preprocessings: Skalieren und Zentrieren
\nBevor du ein Modell wie Regression (Vorhersage einer stetigen Variable) oder Klassifikation (Vorhersage einer diskreten Variable) trainierst, lohnt sich fast immer etwas Preprocessing. Für numerische Variablen ist es üblich, die Daten zu normalisieren oder zu standardisieren. Was bedeutet das?
\nNormalisierung heißt, einen Datensatz so zu skalieren, dass das Minimum 0 und das Maximum 1 ist. Dazu transformieren wir jeden Datenpunkt $x$ zu
\n$$x_{normalized} = \\frac{x-x_{min}}{x_{max}-x_{min}}.$$\n
Standardisierung ist etwas anderes; sie zentriert die Daten um 0 und skaliert relativ zur Standardabweichung:
\n$$x_{standardized} = \\frac{x-\\mu}{\\sigma},$$\n
wobei $\\mu$ und $\\sigma$ Mittelwert bzw. Standardabweichung des Datensatzes sind. Wichtig: Diese Transformationen verändern nur den Wertebereich, nicht die Verteilung. Später kannst du weitere Transformationen wie Log- oder Box-Cox-Transformation nutzen, um die Daten „glockenkurviger“ zu machen. Vorher sollten wir aber fragen: Warum skalieren wir überhaupt? Wann ist es besonders sinnvoll? Ist es etwa bei Klassifikation wichtiger als bei Regression?
\nBeginnen wir mit Klassifikationsaufgaben und sehen wir uns an, wie Skalierung die Leistung von k-Nearest Neighbors beeinflusst:
\nPreprocessing: Skalierung in der Praxis
\nIm Folgenden (i) skaliere ich die Daten, (ii) setze k-Nearest Neighbors ein und (iii) prüfe die Modellleistung. Ich verwende die scale-Funktion von scikit-learn, die alle Features (Spalten) des übergebenen Arrays standardisiert.
\n\nAlle Kennzahlen haben sich um 0,1 verbessert – das sind 16 % und damit deutlich. Wie oben angedeutet, gab es vor der Skalierung Prädiktoren mit sehr unterschiedlichen Größenordnungen. Bei einem Algorithmus wie k-NN können dadurch ein oder zwei Features dominieren. Die zwei Hauptgründe fürs Skalieren sind:
\n\n- Deine Prädiktoren haben stark unterschiedliche Wertebereiche, und in bestimmten Verfahren wie k-NN musst du verhindern, dass einzelne Features das Ergebnis dominieren.
\n- Du willst Merkmale einheitsunabhängig machen, also unabhängig von der Messskala: Wenn ich ein Feature in Metern habe und du in Zentimetern, erhalten wir durch Skalierung die gleichen Merkmalswerte.
\n
\nWir haben gesehen, welche zentrale Rolle Preprocessing – in Form von Skalierung und Zentrierung – in der Data-Science-Pipeline spielt, und damit einen ganzheitlichen Blick auf ML-Aufgaben gefördert. In kommenden Artikeln möchte ich das auf weitere Arten des Preprocessings ausweiten, etwa Transformationen numerischer Daten und Preprocessing kategorialer Daten – beides gehört in jeden Data-Science-Werkzeugkasten. Bevor wir dahin gehen, beleuchte ich im nächsten Artikel die Rolle der Skalierung bei regressionsbasierten Klassifikationsansätzen. Konkret schauen wir auf Logistische Regression – und du wirst sehen, dass das Ergebnis sich deutlich von dem hier bei k-Nearest Neighbors unterscheidet.
\nIm interaktiven Fenster unten kannst du selbst mit den Daten experimentieren. Starte damit, die Variable n_neig zu ändern – sie legt die Zahl der Nachbarn im k-NN-Algorithmus fest. Du kannst die Daten auch skalieren, indem du sc = True setzt. Führe dann das gesamte Skript aus, um die Accuracy des Modells sowie den Classification Report zu sehen.
\n\nGlossar
\nÜberwachtes Lernen (Supervised Learning): Die Aufgabe, aus Prädiktorvariablen eine Zielvariable abzuleiten. Beispiel: Die Zielvariable „Vorhandensein von Herzkrankheit“ aus Prädiktoren wie „Alter“, „Geschlecht“ und „Raucherstatus“ vorhersagen.
\nKlassifikationsaufgabe: Eine Aufgabe des überwachten Lernens ist eine Klassifikation, wenn die Zielvariable aus Kategorien besteht (z. B. „Klick“ oder „kein Klick“, „bösartiger“ oder „gutartiger“ Tumor).
\nRegressionsaufgabe: Eine Aufgabe des überwachten Lernens ist eine Regression, wenn die Zielvariable stetig ist (z. B. Hauspreis) oder eine geordnete kategoriale Variable wie die „Qualitätsbewertung von Wein“.
\nk-Nearest Neighbors: Ein Algorithmus für Klassifikationsaufgaben, bei dem ein Datenpunkt das Label erhält, das die Mehrheit seiner k nächsten Nachbarn trägt.
\nPreprocessing: Alle Schritte, mit denen Data Scientists Daten in eine geeignetere Form für die geplante Analyse bringen. Beispiel: Vor einer Sentimentanalyse von Twitter-Daten entfernst du HTML-Tags und Leerzeichen, schreibst Abkürzungen aus und zerlegst Tweets in Wortlisten.
\nZentrieren und Skalieren: Formen des Preprocessings für numerische Daten, also Zahlenwerte statt Kategorien oder Strings. Zentrieren heißt, vom jeweiligen Wert den Mittelwert abzuziehen, sodass der neue Mittelwert 0 ist. Skalieren heißt, jeden Wert mit einer Konstante zu multiplizieren, um den Wertebereich zu verändern. Warum das wichtig ist, zeigen Beispiele im Artikel.
\nDieser Artikel wurde aus einem Jupyter Notebook generiert. Du kannst das Notebook hier herunterladen.
\n