Vectorisierung eines Pandas-Dataframe für Scikit-Learn

Sagen Sie, ich habe ein Dataframe in Pandas wie die folgenden:

> my_dataframe col1 col2 A foo B bar C something A foo A bar B foo 

Wo Zeilen repräsentieren Instanzen und Spalten Eingabe-Features (nicht die Ziel-Label, aber das wäre für eine Klassifizierung Aufgabe), dh ich versuche, X aus my_dataframe zu bauen.

Wie kann ich das effizient mit zB DictVectorizer vektorisieren?

Muss ich jeden Eintrag in meinem DataFrame zuerst in ein Wörterbuch umwandeln? (So ​​ist es im Beispiel im obigen Link). Gibt es einen effizienteren Weg, dies zu tun?

4 Solutions collect form web for “Vectorisierung eines Pandas-Dataframe für Scikit-Learn”

Zuerst bekomme ich nicht wo in deinem Beispiel-Array Features und wo Beobachtungen.

DictVectorizer hält DictVectorizer keine Daten und ist nur über Transformations-Utility und Metadaten-Speicherung. Nach der Transformation speichert es Feature-Namen und Mapping. Es gibt ein numpy Array zurück, das für weitere Berechnungen verwendet wird. Numpy Array (Features Matrix) Größe entspricht features count x number of observations , mit Werten gleich Merkmal Wert für eine Beobachtung. Also, wenn Sie Ihre Beobachtungen und Funktionen kennen, können Sie dieses Array auf jede andere Art und Weise erstellen, die Sie mögen.

Sollten Sie erwarten, dass Sklearn es für Sie tun, müssen Sie nicht dict manuell rekonstruieren, wie es mit to_dict auf transponierte Dataframe angewendet werden kann:

 >>> df col1 col2 0 A foo 1 B bar 2 C foo 3 A bar 4 A foo 5 B bar >>> df.T.to_dict().values() [{'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}, {'col2': 'foo', 'col1': 'C'}, {'col2': 'bar', 'col1': 'A'}, {'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}] 

Seit Scikit-Learn 0.13.0 (3. Januar 2014) gibt es einen neuen Parameter 'records' für die to_dict() Methode zur Verfügung, so jetzt können Sie einfach diese Methode ohne zusätzliche Manipulationen verwenden:

 >>> df = pandas.DataFrame({'col1': ['A', 'B', 'C', 'A', 'A', 'B'], 'col2': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar']}) >>> df col1 col2 0 A foo 1 B bar 2 C foo 3 A bar 4 A foo 5 B bar >>> df.to_dict('records') [{'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}, {'col2': 'foo', 'col1': 'C'}, {'col2': 'bar', 'col1': 'A'}, {'col2': 'foo', 'col1': 'A'}, {'col2': 'bar', 'col1': 'B'}] 

sklearn-pandas Sie einen Blick auf sklearn-pandas die genau das bietet, was Sie suchen. Der entsprechende Github Repo ist hier .

Sie wollen eine Design-Matrix aus einem Pandas DataFrame mit Categoricals (oder einfach Strings) zu erstellen und der einfachste Weg, um es zu tun ist mit patsy , eine Bibliothek, die repliziert und erweitert R Formeln Funktionalität.

Mit dem Beispiel wäre die Umwandlung:

 import pandas as pd import patsy my_df = pd.DataFrame({'col1':['A', 'B', 'C', 'A', 'A', 'B'], 'col2':['foo', 'bar', 'something', 'foo', 'bar', 'foo']}) patsy.dmatrix('col1 + col2', data=my_df) # With added intercept patsy.dmatrix('0 + col1 + col2', data=my_df) # Without added intercept 

Die daraus resultierenden Designmatrizen sind nur NumPy Arrays mit einigen zusätzlichen Informationen und können direkt in scikit-Learn verwendet werden.

Beispiel Ergebnis mit Intercept hinzugefügt:

 DesignMatrix with shape (6, 5) Intercept col1[TB] col1[TC] col2[T.foo] col2[T.something] 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 Terms: 'Intercept' (column 0) 'col1' (columns 1:3) 'col2' (columns 3:5) 

Beachten Sie, dass patsy versucht, Multicolinearität zu vermeiden, indem Sie die Effekte von A und bar in den Intercept integrieren. Auf diese Weise sollte zum Beispiel der col1[TB] als die zusätzliche Wirkung von B in Bezug auf Beobachtungen interpretiert werden, die als A klassifiziert werden.

Sie können definitiv DictVectorizer . Weil DictVectorizer ein erträgliches von dict DictVectorizer erwartet, können Sie folgendes tun:

 from sklearn.base import TransformerMixin from sklearn.pipeline import make_pipeline from sklearn.feature_extraction import DictVectorizer class RowIterator(TransformerMixin): """ Prepare dataframe for DictVectorizer """ def fit(self, X, y=None): return self def transform(self, X): return (row for _, row in X.iterrows()) vectorizer = make_pipeline(RowIterator(), DictVectorizer()) # now you can use vectorizer as you might expect, eg vectorizer.fit_transform(df) 
  • Python - Rolling window OLS Regression Schätzung
  • Zeichnen Sie ein Dokument tfidf 2D Diagramm
  • Klassifizierungsergebnisse abhängig von random_state?
  • Speicherfehler bei Python beim Konvertieren in Array
  • Multilabel-Raster-Suche in ScikitLearn
  • Sklearn-Fehler: "X und y haben unvereinbare Formen."
  • Volle Sklearn Pipeline Beispiel
  • Verwirrt über random_state in entscheidungsbaum von scikit lernen
  • Plotten der Grenzen der Clusterzone in Python mit Scikit-Paket
  • Wie fügt man Regression-Funktionen in Python, oder erstellen Sie eine neue Regressionsfunktion aus gegebenen Koeffizienten?
  • Führen Sie eine OLS-Regression mit Pandas Data Frame aus
  • Python ist die beste Programmiersprache der Welt.