2016-10-01 14 views
5

ayarlayın. Ayrıca verileri bir boru hattı ile önceden işlemek istiyorum. Ancak benim tren ve test verileri kategorik değişkenin farklı seviyeleri var. Örnek: göz önünde bulundurun: Kukla oluşturma Şu anda scikit boru hatlarını öğrenmek keşfetmeye çalışıyorum

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

I2 sütun tren verileri ve test verileri 4 sütun için panda

class CreateDummies(TransformerMixin): 

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

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

fit_transform verimleri kullanarak TransformerMixinClass yazdım. Yani burada bir sürpriz, ama bir boru hattı

Similary için uygun değildir, ben (potansiyel sonraki adımlar için ve OneHotEncoder) etiketi kodlayıcı içe çalıştık:

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

hangi verimleri, şaşırtıcı olmayan bir hata.

Yani burada sorun ben test kümesi bulunan bazı bilgilere ihtiyaç vardır. bir boru hattında bu eklemek iyi bir yolu var mı?

+1

Can sen get_dummies Eğer tren ve testi ayrılmasından önce? – piRSquared

+0

Kaggle yarışmalarından elde ettiğim veriler tren ve test olarak ayrıldı. Ama tabii ben sadece bu setleri (test seti de tren setinin farklı sütunlarda nans vardır) birleştirerek bu yapabilirdi. Ben de burada bir ön ön işleme adımı yapmak zorunda korku, bunu isterseniz henüz emin değilim;) – Quickbeam2k1

cevap

5

this answer açıklandığı gibi categoricals kullanabilirsiniz:

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

Hey, güzel cevap için teşekkürler: Bir Birden fazla boyutlu dataframe için bir '' 'tren kullanmalıdır. Uygula (lambda x: x.astype ('kategori', kategoriler = kategoriler), eksen = 0) '' '. İlk olarak, sendika1d işlevi konusunda endişeliydim çünkü tüm kategorilerdeki seviyeler yakalandı. Ama bu bir sorun değil. Buradaki uygulamadan kaçınmanın bir yolunu görüyor musunuz? – Quickbeam2k1

+1

'astype ('category')' yalnızca şu anda bir boyutlu diziler için çalışır, bu nedenle 'apply' veya açık bir forma ihtiyaç duyulur. – ayhan

İlgili konular