2016-09-23 4 views
2

Neu bei Python und sklearn so Entschuldigung im Voraus. Ich habe zwei Transformatoren und möchte die Ergebnisse in einer FeatureUnion sammeln (für einen letzten Modellierungsschritt am Ende). Dies sollte recht einfach sein, aber FeatureUnion stapelt die Ausgaben, anstatt ein nx2-Array oder DataFrame bereitzustellen. Im folgenden Beispiel werde ich einige Daten erzeugen, die 10 Zeilen mal 2 Spalten umfassen. Dies erzeugt dann zwei Funktionen, die 10 Zeilen mal 1 Spalte sind. Ich möchte, dass die letzte Feature-Vereinigung 10 Zeilen und 1 Spalte hat, aber was ich bekomme, sind 20 Zeilen mal 1 Spalte.Binding Ausgänge von Transformatoren in FeatureUnion

Ich werde versuchen, mit meinem Beispiel zu demonstrieren, unter:

einige Importen

import numpy as np 
import pandas as pd 
from sklearn import pipeline 
from sklearn.base import TransformerMixin 

einige zufälligen Daten

df = pd.DataFrame(np.random.rand(10, 2), columns=['a', 'b']) 

ein benutzerdefinierter Transformator, das eine Spalte

class Trans(TransformerMixin): 
    def __init__(self, col_name): 
     self.col_name = col_name 
    def fit(self, X): 
     return self                  
    def transform(self, X):               
     return X[self.col_name] 
wählt

, eine Pipeline, die den Transformator zweimal verwendet (in meinem realen Fall I habe zwei verschiedene Transformatoren aber diese reproduzieren das Problem)

pipe = pipeline.FeatureUnion([ 
    ('select_a', Trans('a')), 
    ('select_b', Trans('b')) 
    ]) 

jetzt verwende ich die Pipeline, aber es gibt einen Array von doppelter Länge

pipe.fit_transform(df).shape 

(20,) 

aber ich möchte ein Array mit Abmessungen (10, 2).

Schnellkorrektur?

Antwort

2

Die Transformatoren in der FeatureUnion müssen 2-dimensionale Matrizen zurückgeben, aber in Ihrem Code, indem Sie eine Spalte auswählen, geben Sie einen 1-dimensionalen Vektor zurück. Sie können dies beheben, indem Sie die Spalte mit X[[self.col_name]] auswählen.