Vorbereiten von Dateien für Machine Learning

Abgeschlossen

Bevor Sie ein Machine Learning-Modell erstellen können, müssen Sie die Daten vorbereiten, die Sie zum Trainieren und Auswerten verwenden. Daten werden aus der Quelle in Azure Databricks erfasst, häufig als Datendateien. Optional können Sie Deltatabellen basierend auf den Datendateien erstellen, um die Datenuntersuchung und -analyse zu vereinfachen. Nachdem die Daten erfasst wurden, bereitet eine wissenschaftliche Fachkraft für Daten sie für maschinelles Lernen vor.

In der Regel umfasst die Vorbereitung von Daten zwei wichtige Aufgaben:

  • Datenbereinigung: Identifizieren von Problemen in den Daten und deren Reduzierung, um ihren Nutzen für maschinelles Lernen zu erhöhen.
  • Featureentwicklung und Vorverarbeitung: Auswählen und Transformieren geeigneter Features für das Modelltraining.

Datenbereinigung

Die spezifischen Schritte, die zum Bereinigen von Daten erforderlich sind, variieren von Projekt zu Projekt. Folgende Probleme, die Sie beseitigen müssen, sind jedoch typisch:

  • Unvollständige Daten: Daten enthalten häufig Datensätze, in denen einzelne Felder fehlen (oft weisen NULL-Werte darauf hin). Sie müssen fehlende Werte identifizieren und wie folgt verringern:
    • Ersetzen Sie sie in geeigneter Weise, entweder durch Interpolieren eines Werts in einer Reihe, durch Verwendung eines Mittelwerts (oder Medians) oder durch Erstellen eines anderen geeigneten Werts.
    • Vollständiges Entfernen unvollständiger Zeilen (vorausgesetzt, dass genügend geeignete repräsentative Daten für die Modellierung übrig bleiben)
  • Fehler: Es ist nicht ungewöhnlich, dass Daten Fehler enthalten, die durch Fehler bei der Dateneingabe oder fehlerhafte Upstreamdatenverarbeitung verursacht werden. Das Auffinden von Fehlern kann schwierig sein und erfordert in der Regel eine umfassende Überprüfung der Daten mithilfe von Abfragen und Visualisierungen, um die Daten zusammenzufassen und nach Werten zu suchen, die nicht mit den meisten anderen Werten in einem bestimmten Feld übereinstimmen.
  • Ausreißer: Ausreißer sind Werte, die deutlich außerhalb der statistischen Verteilung der Daten liegen (oberhalb oder darunter). Manchmal sind Ausreißer ein Hinweis auf einen Fehler (z. B. kann ein Wert eine zusätzliche Null aufweisen, oder ein Dezimalzeichen wurde ausgelassen) und manchmal handelt es sich um echte Werte, die im Vergleich zu den meisten Beobachtungen ungewöhnlich hoch oder niedrig sind. In beiden Fällen können sich extreme Ausreißer negativ auf das Training eines Machine Learning-Modells auswirken. Daher ist es in der Regel am besten, sie zu behandeln, indem Sie sie auf einen oberen oder unteren Schwellenwert zurücksetzen oder Datensätze, die Ausreißer enthalten, aus dem Dataset entfernen.
  • Falsche Datentypen: Machine Learning-Algorithmen können empfindlich auf die Datentypen reagieren, die den Featurewerten zugewiesen sind. Häufig wandeln Datasets, die auf Fehler oder NULL-Werte enthaltenden Textdateien basieren, numerische Felder fälschlicherweise in einen Zeichenfolgendatentyp um, und häufig werden Werte, die diskrete ganzzahlige Werte darstellen, fälschlicherweise in Dezimalzahlen umgewandelt (oder umgekehrt). Sie sollten das Schema Ihrer Daten untersuchen und die geeigneten Datentypen zuweisen, die die Datenwerte am effektivsten widerspiegeln.
  • Unausgeglichene Daten: Machine Learning-Training funktioniert am besten, wenn die Trainingsdaten alle verschiedenen Feature- und Bezeichnungskombinationen, die auftreten können, angemessen darstellen. In einem unausgeglichenen Dataset sind Datensätze, die einen bestimmten kategorischen Wert oder eine Kombination aus Feldern enthalten, überrepräsentiert. Dies kann den Trainingsalgorithmus beeinflussen und im Modell zu Verzerrungen führen. Üblicherweise wird zur Reduzierung dieses Problems für unterrepräsentierte Werte ein Oversampling durchgeführt, indem duplizierte Zeilen eingeschlossen werden, oder für überrepräsentierte Zeilen ein Undersampling (indem sie aus dem Dataset entfernt werden).

In Azure Databricks ist die gängigste Methode zum Erkennen und Behandeln dieser Art von Problemen, Code in ein Notebook zu schreiben, das die Daten untersucht und bearbeitet. Die für diese Art der Datenbearbeitung verwendete primäre Klasse ist der Spark-Datenrahmen.

Der folgende Code lädt beispielsweise Daten aus einer Textdatei in einen Datenrahmen:

df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")

Wenn die Daten in eine Deltatabelle im Azure Databricks-Arbeitsbereich geladen wurden, können Sie alternativ mit einer SQL-Abfrage die zugehörigen Daten in einen Datenrahmen laden:

df = spark.sql("SELECT * FROM mytable")

Nachdem die Daten in einen Datenrahmen geladen wurden, können Sie die zugehörigen Methoden und anderen Funktionen in der Spark SQL-Bibliothek verwenden, um die Daten zu untersuchen und zu transformieren. Der folgende Code verwendet beispielsweise die dropna-Methode, um alle Zeilen zu entfernen, die NULL-Werte enthalten, und weist Spalten im Datenrahmen bestimmte Datentypen zu.

clean_data = df.dropna().select(col("column1").astype("string"),
                                col("column2").astype("float"))

Tipp

Weitere Informationen zur Spark-Datenrahmenfunktionalität finden Sie in der Spark Dataframe-Dokumentation.

Featureentwicklung und Vorverarbeitung

Nachdem Sie sichergestellt haben, dass das Dataset vollständig und sauber ist, können Sie mit der Vorbereitung der Features für maschinelles Lernen beginnen. Die Featureentwicklung ist ein iterativer Ansatz, bei dem oft mittels Versuch und Fehler herausgefunden wird, welche Featurespalten einen Vorhersagewert haben, und wie die Features am besten dargestellt werden können. Zu den gängigen Aufgaben für Featureentwicklung und Vorverarbeitung gehören:

  • Ableiten neuer Features: Häufig können Sie neue, aussagekräftigere Vorhersagefeatures von vorhandenen ableiten. Angenommen, ein Dataset enthält eine Spalte Datum, und Sie vermuten, dass das vollständige Datum möglicherweise kein wichtiger Vorhersagefaktor für die Identifizierung der Bezeichnung ist, sondern dass es der Wochentag sein könnte. Sie könnten ein neues Feature Wochentag erstellen, das vom Datum abgeleitet ist, um Ihre Theorie zu testen.

  • Diskretisieren numerischer Features: In einigen Fällen kann ein numerischer Wert aussagekräftigere Vorhersagen liefern, wenn er in Kategorien diskretisiert wird, die bestimmte Wertebereiche repräsentieren. Beispielsweise könnten Sie die numerischen Werte in einem Feature Preis verwenden und sie basierend auf geeigneten Schwellenwerten den Kategorien niedrig, mittel und hoch zuweisen.

  • Codieren kategorischer Features: Viele Datasets enthalten kategorische Daten, die durch Zeichenfolgenwerte dargestellt werden. Die meisten Machine Learning-Algorithmen funktionieren jedoch am besten mit numerischen Daten. Daher ist es üblich, numerische Codes anstelle von Zeichenfolgen zur Darstellung von Kategorien zuzuweisen. Ein Dataset mit Produktdetails könnte beispielsweise ein Feature Farbe enthalten, das den Wert „Grün“, „Rot“ oder „Blau“ aufweisen kann. Sie könnten diese Werte mit einfachen ganzzahligen Codes codieren, z. B. 0 für „Grün“, 1 für „Rot“ und 2 für „Blau“. Alternativ könnten Sie ein One-Hot-Codierungsverfahren verwenden, bei dem Sie eine neue Spalte für jede mögliche Kategorie erstellen und jeder Spalte für jede Zeile wie folgt entsprechend den Wert 1 oder 0 zuweisen:

    Spalte „Originalfarbe“ Grün Red Blau
    Grün 1 0 0
    Blau 0 0 1
    Rot 0 1 0
  • Skalieren (Normalisieren) numerischer Werte: Numerische Datenwerte befinden sich häufig auf unterschiedlichen Skalen oder Maßeinheiten. Machine Learning-Algorithmen verarbeiten sie alle als absolute numerische Werte, und größere Werte von Features können häufig das Training des Modells dominieren. Um dieses Problem zu beheben, ist es üblich, alle numerischen Spalten so zu skalieren, dass die einzelnen Werte für eine einzelne Spalte die gleiche proportionale Beziehung zueinander beibehalten, aber alle numerischen Spalten sich auf einer ähnlichen Skala befinden. Angenommen, ein Dataset enthält die Werte Länge und Gewicht in Metern und Kilogramm. Sie könnten beide Features wie folgt in einen skalierten Wert zwischen 0 und 1 konvertieren:

    length weight scaled_length scaled_weight
    250,0 2.1 0,250 0,210
    176,0 0.9 0,176 0.09

Viele Machine Learning-Bibliotheken enthalten Klassen, mit denen Sie allgemeine Featureentwicklungsaufgaben ausführen können. Die Spark MLlib-Bibliothek enthält beispielsweise die StringIndexer-Klasse, mit der Sie eine einfache ganzzahlbasierte Codierung für Zeichenfolgenwerte ausführen können.

from pyspark.ml.feature import StringIndexer

encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)

Hinweis

Es lohnt sich, das StringIndexer-Codebeispiel etwas ausführlicher zu erläutern. Spark MLlib-Klassen können Auswerter enthalten, die einen Algorithmus für einen bestimmten Transformationsvorgang einigen Beispieldaten anpassen. In diesem Fall passt der StringIndexer einen Codierungsalgorithmus den diskreten Zeichenfolgenwerten in der catCol-Spalte im Datenrahmen data an, um die spezifischen Berechnungen zu bestimmen, die zum Generieren einer neuen, die codierten Werte enthaltenden catColCode-Spalte erforderlich sind. Die Ausgabe eines Auswerters ist ein Transformator, der die vom Auswerter definierte Funktion kapselt und diese Funktion auf Daten anwenden und einen neuen Datenrahmen generieren kann. In diesem Beispiel übergeben wir dieselben Daten, die zum Bestimmen der Codierungsfunktion verwendet werden, an den resultierenden Transformator, um die Codierung praktisch anzuwenden.

In Spark MLLib können Sie eine Sequenz von Auswertern und Transformatoren in einer Pipeline verketten, die alle Schritte zur Featureentwicklung und Vorverarbeitung ausführt, die Sie zum Vorbereiten Ihrer Daten benötigen. Die Pipeline kann mit einem Machine Learning-Algorithmus enden, der als Auswerter fungiert, um die Vorgänge zu bestimmen, die erforderlich sind, um eine Bezeichnung aus den vorbereiteten Features vorherzusagen. Die Ausgabe der Pipeline ist ein Machine Learning-Modell, bei dem es sich tatsächlich um einen Transformator handelt, der verwendet werden kann, um die Modellfunktion auf Features in einem Datenrahmen anzuwenden und die entsprechenden Bezeichnungswerte vorherzusagen.