2016-10-01 11 views
5

Obecnie badam potoki nauki o scikitach. Chcę również wstępnie przetworzyć dane za pomocą potoku. Jednak moje dane pociągu i testu mają różne poziomy zmiennej kategorycznej. przykład: Rozważmy:Tworzenie manekinów w rurociągu o różnych poziomach w zestawie kolejkowym i testowym

import pandas as pd 
train = pd.Series(list('abbaa')) 
test = pd.Series(list('abcd')) 

Napisałem TransformerMixinClass pomocą pandy

class CreateDummies(TransformerMixin): 

def transform(self, X, **transformparams): 
    return pd.get_dummies(X).copy() 

def fit(self, X, y=None, **fitparams): 
    return self 

plony fit_transform dla danych kolejowych 2 kolumny i danych testowych 4 kolumny. Więc nic dziwnego tutaj, ale nie nadaje się do rurociągu

Similary, próbowałem zaimportować koder etykiety (i OneHotEncoder dla potencjalnych kolejnych etapach):

from sklearn.preprocessing import LabelEncoder, OneHotEncoder 
le = LabelEncoder() 
le.fit_transform(train) 
le.transform(test) 

których plony, nie jest zaskoczeniem, błąd.

Problem polega na tym, że potrzebuję pewnych informacji zawartych w zestawie testowym. Czy istnieje dobry sposób na uwzględnienie tego w potoku?

+1

Można get_dummies przed podzielone pociąg i test? – piRSquared

+0

Dane, które otrzymałem od konkurencji kaggle, dzielą się na pociąg i test. Ale oczywiście mogłem to zrobić, po prostu łącząc te zestawy (zestaw testowy ma również nans w różnych kolumnach niż zestaw pociągu). Obawiam się również, że muszę zrobić tutaj wstępny proces wstępny, nie jestem jeszcze pewien, czy mi się to podoba;) – Quickbeam2k1

Odpowiedz

5

Można użyć categoricals jak wyjaśniono w this answer:

categories = np.union1d(train, test) 
train = train.astype('category', categories=categories) 
test = test.astype('category', categories=categories) 

pd.get_dummies(train) 
Out: 
    a b c d 
0 1 0 0 0 
1 0 1 0 0 
2 0 1 0 0 
3 1 0 0 0 
4 1 0 0 0 

pd.get_dummies(test) 
Out: 
    a b c d 
0 1 0 0 0 
1 0 1 0 0 
2 0 0 1 0 
3 0 0 0 1 
+1

Hej, dzięki za wspaniałą odpowiedź: dla więcej niż jednowymiarowej ramy danych należy użyć '' 'train. zastosuj (lambda x: x.astype ("kategoria", kategorie = kategorie), oś = 0) '' '. Po pierwsze, martwiłem się funkcją union1d, ponieważ zostały złapane poziomy we wszystkich kategoriach. Ale to nie jest problem. Czy widzisz sposób na uniknięcie zastosowania tutaj? – Quickbeam2k1

+1

'astype (" category ")' działa teraz tylko w jednowymiarowych tablicach, więc albo 'apply' albo jawna pętla for wydaje się konieczna. – ayhan

Powiązane problemy