Feature Engineering in der Datenvorverarbeitung / Sudo Null IT News

Hey Habr! Rustem IBM Senior (pomodoro) DevOps Engineer ist in Kontakt und heute möchte ich über Feature Engineering in der Datenvorverarbeitung sprechen.

Unsere Requisiten: Python 3.6 und Pandas.

Codebasis: https://github.com/zetzo/Data-Preprocessing-Feature-Engineering.git

Was ist Feature Engineering/Measurement Engineering?

Feature-Engineering ist die Erstellung neuer Features auf der Grundlage vorhandener Features und fügt Ihrem Dataset Informationen hinzu, die in irgendeiner Weise nützlich sind: fügt Features hinzu, die für Ihre Vorhersage- oder Clustering-Aufgabe nützlich sind, oder vermisst das Verständnis der Beziehungen zwischen Features. Echte Daten sind oft verschwommen und sauber, und zusätzlich zu Vorverarbeitungsschritten wie der Standardisierung müssen Sie wahrscheinlich die Informationen extrahieren und erweitern, die in den Spalten Ihres Datensatzes vorhanden sind.

Feature Engineering ist, vereinfacht gesagt, eine Technik zur Lösung von Problemen des maschinellen Lernens, mit der Sie die Qualität der entwickelten Algorithmen steigern können. Sorgt für die Transformation von domänenspezifischen Daten in für das Modell verständliche Vektoren.

Das Feature-Engineering hängt stark von dem jeweiligen Dataset ab, das Sie analysieren, daher ist es sehr wichtig, ein tiefes Verständnis des Datasets zu haben, das Sie modellieren möchten.

Sehen wir uns einige Beispiele an, in denen wir unsere Metriken entwickeln möchten. Extrem häufig – mit Zeichenfolgendaten.

Dies ist beispielsweise eine Situation, in der wir möglicherweise die Anzahl der Meilen als numerisches Merkmal für die Modellierung aus Text extrahieren möchten.

Ein weiteres Beispiel für Zeichenfolgendaten ist ein Datensatz mit einer Spalte, die die Lieblingsfarben von Personen enthält.

Um diese Informationen in ein Modell in scikit-learn einzugeben, müssen Sie diese Informationen numerisch codieren.

Werfen wir einen Blick auf den Freiwilligen-Datensatz und identifizieren einige Möglichkeiten für das Feature-Engineering:

Diese drei Säulen sind gute Kandidaten für die Technik. recurrence_type ist eine binäre kategoriale Variable:

created_date ist ein Datum und es gibt mehrere andere Datumsspalten in diesem Datensatz, die vor der Modellierung konvertiert werden müssen:

Und schließlich ist category_desc eine kategoriale Variable mit mehreren Werten:

Merkmalsextraktion mit regulären Ausdrücken

Reguläre Ausdrücke sind Muster, die verwendet werden können, um Muster aus Textdaten zu extrahieren. Hier haben wir eine Zeichenfolge, und wir möchten die Temperaturzahl daraus extrahieren – 45,6:

Beachten Sie, dass diese Zahl eine Fließkommazahl ist. Wir benötigen eine Vorlage, um diese Gleitkommazahl zu extrahieren, die wir mit der re Python-Bibliothek erstellen können.

Lassen Sie uns die Vorlage in re.compile aufschlüsseln. \d bedeutet, dass wir Ziffern erfassen möchten, und + bedeutet, dass wir so viele wie möglich erfassen möchten. Wenn also zwei nebeneinander stehen, brauchen wir beide (z. B. 45). \. bedeutet, dass wir den Dezimalpunkt erfassen wollen und dann ein weiteres \d+ am Ende, um die Ziffern auf der rechten Seite des Dezimalpunkts zu erfassen.

Um das übereinstimmende Muster zurückzugeben, können wir findall() verwenden:

Beachten Sie, dass findall() eine Liste übereinstimmender Musterstrings zurückgibt. In dieser Situation möchten wir die Temperatur als Fließkommazahl zurückgeben. Da wir wissen, dass es in unserer Zeile nur eine Temperatur gibt, können wir Folgendes tun:

Dies wäre unter Umständen, in denen wir mehrere numerische Instanzen hintereinander haben, etwas schwierig, aber im Moment ist es gut genug.

Probieren wir das am Wanderdatensatz aus. Die Spalte “Länge” im Wanderungsdatensatz ist eine Spalte mit Zeichenfolgen, aber die Spalte enthält die Kilometerleistung der Wanderung. Wir werden diesen Lauf mit regulären Ausdrücken extrahieren und dann ein Lambda in Pandas verwenden, um die Extraktion auf den gesamten DataFrame anzuwenden.

Lassen Sie uns zunächst eine Funktion erstellen, die den Kilometerstand als Fließkommawert findet und zurückgibt. Das Erstellen einer Funktion macht es etwas einfacher, sie auf den gesamten DataFrame anzuwenden. In dieser Funktion verwenden wir Pythons isinstance(), um sicherzustellen, dass wir eine Zeichenfolge verarbeiten – andernfalls schlägt sie bei fehlenden Werten fehl. Indem wir die Länge unserer findall()-Liste überprüfen, stellen wir fest, ob es Übereinstimmungen gibt, und geben sie gegebenenfalls zurück.

Wenden wir uns dann auf die Spalte „Länge“ an und erstellen eine neue Spalte nur mit Laufleistung:

Vergleichen wir abschließend unsere neue Spalte mit der ursprünglichen Spalte, um zu sehen, ob sie funktioniert:

Binäre Codierung kategorialer Variablen

Da Modelle in scikit-learn eine numerische Eingabe erfordern, müssen Sie diese codieren, wenn Ihr Datensatz kategoriale Variablen enthält. Das Codieren von Binärwerten ist eigentlich ganz einfach und kann sowohl in Pandas als auch in Scikit-Learn erfolgen. Möglicherweise möchten Sie Variablen in Pandas codieren, wenn Sie die Vorverarbeitung noch nicht abgeschlossen haben oder nach der Codierung an weiteren Forschungsarbeiten interessiert sind. Andererseits möchten Sie möglicherweise scikit-learn verwenden, wenn Sie beispielsweise die Codierung als Teil der scikit-learn-Pipelinefunktionalität implementieren, wodurch Sie verschiedene Teile des maschinellen Lernprozesses kombinieren können.

Sehen wir uns ein Beispiel mit dem Wanderdatensatz an. Eine Spalte, die codiert werden muss, ist die Spalte Zugänglich, die entweder Y oder N ist.

In Pandas können wir apply() verwenden, um Einsen und Nullen in einem DataFrame zu codieren, indem wir eine einfache Bedingung verwenden, die 1 zurückgibt, wenn der Wert in Accessible Y ist, und 0, wenn der Wert N ist.

Wenn Sie sich den direkten Vergleich der Spalten ansehen, können Sie sehen, dass die Spalte jetzt numerisch codiert ist.

Sie können dies auch in scikit-learn mit dem LabelEncoder tun. Durch das Erstellen eines LabelEncoder-Objekts können Sie diese Codierung auch für andere Daten wiederverwenden, z. B. für neue Daten oder einen Testfall. Sie können fit_transform() verwenden, um sowohl den Encoder an die Daten anzupassen als auch die Spalte zu transformieren.

Durch Drucken von Accessible und seinen codierten Gegenstücken sehen wir, dass die Y- und N-Werte sowohl in Pandas als auch in scikit-learn auf die gleiche Weise auf 1 und 0 codiert wurden.

Kategoriale Variablencodierung, One-Hot

One-Hot-Codierung codiert kategoriale Variablen in Einsen und Nullen, wenn Sie mehr als zwei Variablen zu codieren haben. Es funktioniert, indem es die gesamte Liste der eindeutigen Werte in einer Spalte durchgeht, jeden Wert in ein Array umwandelt und 1 an der entsprechenden Position zuweist, um zu codieren, dass ein bestimmter Wert gefunden wird.

Schauen wir uns ein Spielzeugbeispiel an, um zu sehen, wie es funktioniert, indem wir einen kleinen Farbdatensatz nehmen:

Hier haben wir drei Werte: blau, grün und rot. Um diese Werte sofort zu codieren, können wir get_dummies() verwenden, um Spalten für jeden zu erstellen.

Um diese Spalten mit den Originaldaten zu verketten, können Sie pd.concat verwenden:

Wenn wir diese Farben basierend auf dieser Liste mit 0 und 1 codieren würden, würden wir ungefähr Folgendes erhalten: Blau hätte eine Eins an der ersten Position, gefolgt von zwei Nullen, Grün hätte eine Eins an der zweiten Position und Rot würde es tun einen an letzter Stelle haben. Die codierte Spalte würde also ungefähr so ​​aussehen, wobei ein Wert von 1 anzeigt, dass diese Farbe in der ursprünglichen Spalte in dieser bestimmten Zeile vorkam.

Eine der Spalten im Freiwilligen-Datensatz, category_desc, enthält Kategoriebeschreibungen für die aufgelisteten Freiwilligenjobs. Da dies eine kategoriale Variable mit mehr als zwei Kategorien ist, üben wir die Verwendung einer einmaligen Codierung, um diese Spalte numerisch zu transformieren:

Schließlich können wir sie wieder zu einem DataFrame verketten und uns ein paar Strings und ihre Codierung ansehen:

Aggregation von Statistiken

Wenn Sie beispielsweise eine Reihe von Merkmalen haben, die sich auf ein einzelnes Merkmal beziehen, z. B. Temperatur oder Laufzeit, können Sie stattdessen den Mittelwert oder den Median als zu modellierendes Merkmal verwenden.

Die übliche Methode zum Entwerfen von Merkmalen besteht darin, eine Reihe von Zahlen zu verwenden, die anstelle dieser Merkmale verwendet werden. Dies kann nützlich sein, um die Dimensionalität Ihres Merkmalsraums zu reduzieren, oder vielleicht möchten Sie einfach nicht mehrere identische Werte, die nahe beieinander liegen.

Nehmen wir an, wir haben einen Laufzeit-DataFrame namens running_times_5k:

Anstatt jede einzelne Laufzeit zum Erstellen unseres Modells zu verwenden, verwenden wir den Durchschnitt dieser fünf Läufe für jede Person im Datensatz.

Lassen Sie uns eine Liste von Spalten erstellen, die wir mitteln möchten, nur um die Dinge einfacher zu machen:

Auch hier können wir apply() verwenden, um eine Funktion auf unseren Datensatz anzuwenden. In dieser Situation wenden wir die mean()-Methode nur auf die Spalten an, die wir mitteln möchten, und axis=1 gibt die Werte zeilenweise zurück:

Und jetzt haben wir eine aggregierte Mittelwertspalte.

Arbeiten mit Datumsangaben

Daten und Zeitstempel sind ein weiterer Bereich, in dem Sie die Granularität eines Datensatzes reduzieren können. Wenn Sie eine Zeitreihenanalyse durchführen, ist dies wahrscheinlich eine andere Geschichte, aber wenn Sie eine Prognoseaufgabe durchführen, benötigen Sie möglicherweise Informationen auf höherer Ebene, z. B. Monat oder Jahr oder beides.

Der Freiwilligen-Datensatz hat mehrere Spalten, die aus Datum und Uhrzeit bestehen.

Angenommen, das vollständige Datum ist zu detailliert für die Vorhersageaufgabe, die wir ausführen möchten, extrahieren wir also den Monat aus der Spalte start_date_date.

Das erste, was Sie tun müssen, ist, diese Spalte mit der Methode to_datetime() in eine datetime-Spalte in Pandas umzuwandeln. Dies vereinfacht die Extraktionsaufgabe erheblich:

Da diese Spalte jetzt ein Datum und eine Uhrzeit enthält, können wir einfach das Attribut .month verwenden, um den Monat aus jeder Zeile zu extrahieren, wiederum mit apply():

Jetzt haben wir eine Spalte mit nur der Monatsnummer. Sie können auch Attribute wie “day” verwenden, um den Tag zu erhalten:

Und “Jahr”, um das Jahr zu erhalten:

Für viele Datums- und Uhrzeitvorgänge, insbesondere solche im Zusammenhang mit Zeitreihenanalysen, muss Ihre datetime-Spalte ein Index Ihres DataFrame sein. Dies ist jedoch alles, was wir wissen müssen, um unsere Reise durch den Abschnitt „Datenvorverarbeitung im Data Engineering“ fortzusetzen.

Wir laden alle zur offenen Lektion “Greenplum Platform Extension Framework (PXF)” ein. In dieser Lektion werden wir zusammen mit Vadim Zaigrin, einem Scala Big Data-Entwickler, das PXF (Platform Extension Framework) betrachten: Wir werden herausfinden, was es ist und warum es benötigt wird, und auch seine Architektur und Funktionsprinzipien betrachten. Anmeldung Verknüpfung.

Similar Posts

Leave a Reply

Your email address will not be published.