2017-02-13 1 views
4

Ich versuche, die kategorischen Variablen meines Pandas-Datenrahmens, der sowohl kategoriale als auch fortlaufende Variablen enthält, mit oneHotEncode zu codieren. Ich weiß, dass dies leicht mit der pandas .get_dummies() - Funktion erledigt werden kann, aber ich brauche eine Pipeline, damit ich später eine PMML-Datei erzeugen kann.So führen Sie die Onehotizen-Kodierung in der Sklearn-Pipeline durch

Dies ist der Code zum Erstellen eines Mappers. Die kategorischen Variablen, die ich kodieren möchte, sind in einer Liste namens "Dummies" gespeichert.

from sklearn_pandas import DataFrameMapper 
from sklearn.preprocessing import OneHotEncoder 
from sklearn.preprocessing import LabelEncoder 

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] + 
    [(d, OneHotEncoder()) for d in dummies] 
) 

Und das ist der Code zum Erstellen einer Pipeline, einschließlich der Mapper und lineare Regression.

from sklearn2pmml import PMMLPipeline 
from sklearn.linear_model import LinearRegression 

lm = PMMLPipeline([("mapper", mapper), 
        ("regressor", LinearRegression())]) 

Wenn ich versuche jetzt (mit ‚Features‘ ein Datenrahmen ist, und ‚Ziele‘ eine Serie) zu passen, gibt es einen Fehler ‚konnte nicht Zeichenfolge konvertieren zu schweben‘.

lm.fit(features, targets) 

Wer kann mir helfen? Ich bin verzweifelt für die Arbeit Pipelines einschließlich der Vorverarbeitung von Daten ... Vielen Dank im Voraus!

Antwort

6

OneHotEncoder unterstützt keine Zeichenfolgenfunktionen, und mit [(d, OneHotEncoder()) for d in dummies] wenden Sie es auf alle Dummies-Spalten an. Verwenden LabelBinarizer statt:

mapper = DataFrameMapper(
    [(d, LabelBinarizer()) for d in dummies] 
) 

Eine Alternative wäre die LabelEncoder mit einem zweiten OneHotEncoder Schritt zu verwenden sein.

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] 
) 

lm = PMMLPipeline([("mapper", mapper), 
        ("onehot" OnehotEncoder()), 
        ("regressor", LinearRegression())]) 
+0

Vielen Dank, der labelbinarizer funktioniert für mich. Ich denke jedoch, dass ich nur die kategorischen Eigenschaften, die ich durch ein Hodenkodieren habe, nur noch bewahre. Gibt es eine Möglichkeit, auch die ursprünglichen kontinuierlichen Features einzubinden? –

+0

Ja, liste sie im 'DataFrameMapper' mit' None' als Transformer auf. – dukebody

Verwandte Themen