6 Temmuz 2017 Perşembe

Python - Pandas groupby/aggregate - LabelEncoder - LabelBinarizer

Daha önceki yazımızda Pandas kütüphanesine bir giriş yapmıştık. Bu yazı kapsamında ise Pandas ile alakalı bir kaç bilgi daha verdikten sonra kategorik verileri dönüştürmek için scikit-learn kütüphanesinin LabelEncoder ve LabelBinarizer metotlarını inceleyeceğiz. 


İlk olarak üzerinde çalışmak için bir DataFrame oluşturalım...

Boş bir DataFrame oluşturmak için ; (x0 kolonu ve a,b,c indeksleri ile)
df = pd.DataFrame(columns=['x0'], index=['a','b','c'])



index değerini parametre olarak vermeden, Sadece x0 kolonu içeren bir DataFrame için ; (Ayrıca x0 kolonunu dolduralım)
df = pd.DataFrame(columns=['x0'])
df['x0'] = [0,1,0,1,0,1,0,1,0,1]

Ardından rastgele değerler içeren 4 farklı kolon daha ekleyelim ;
for i in range(1,5):
    temp = np.random.randn(10)*i
    columnname = 'x'+str(i)
    df[columnname] = temp

Böylece üzerinde örnek uygulamalar gerçekleştireceğimiz bir veri seti oluşturmuş olduk...



df.sum() ile her bir kolonun elemanlarının toplamını hesaplatabiliriz ;
print(df.sum())

x0     5.000000
x1     5.870883
x2    -0.772695
x3    -7.872105
x4   -17.641340



SQL'dekine benzer .groupby() metodu ile istenen kolona göre gruplayıp, grupların toplam değerlerini hesaplatabiliriz;

data_sum_of_groups = df.groupby('x0').aggregate(sum)



data_sum_of_groups değerlerini, bar grafik ile çizdirirsek: x0 'ın 0 ve 1 değerleri için x1,x2,x3,x4 değerlerinin toplamını grafik olarak görüntüleyebiliriz.

data_sum_of_groups.plot(kind='bar')




Şimdi veri setimize kategorik değerler içeren yeni bir sütun daha ekleyelim ;

df['kategori'] = ['a','b','c','a','b','c','a','a','b','b']







Veri seti üzerinden istenen sütunların nasıl seçileceğini daha önceki yazımda belirtmiştim.
data = df[ ['x0','kategori'] ]

Kolon adı ile seçim yapabildiğimiz gibi, iloc metodu ile pozisyon belirterek de sütun seçebiliriz...;
data = df.iloc[:,[0,5]]



LabelEncoder ile kategorik verileri, makine öğrenmesi algoritmalarında kullanılabilmesi için integer değerlere eşleyebiliriz.

from sklearn.preprocessing import LabelEncoder

lab = LabelEncoder()

kategori = list(data['kategori'].values)
lab.fit(kategori)
data['kategori'] = lab.transform(kategori)





Veri setimizde tüm alanların 0-1 binary değerlerden oluştuğu durumlarda, LabelEncoder ile kategorik dönüşüm yapmak mantıklı/faydalı olmayabilir. Tüm kolonlar 0-1 değerlerinden oluşurken, LabelEncoder ile eşlediğimiz kolon birbirinden çok farklı değerler içerebilir ve bu kolonun değerlerinin kendi içerisindeki varyansı da diğer kolonlara nazaran çok daha büyük olacaktır. Bu durum ise seçtiğimiz makine öğrenmesi algoritmasının (sınıflandırma işlemi, regresyon vs. olabilir) varyansı çok daha büyük olan bu kolona yoğunlaşmasına ve performans düşüklüğüne sebep olabilir!. Bu sebeple LabelEncoder 'a alternatif olarak LabelBinarizer dönüşümü de bazı durumlar için kullanılabilir. LabelBinarizer ile bir kolon 0-1 değerleri içeren birden fazla kolona dönüştürülür.


Kategori kolonunu seçip,LabelBinarizer ile 3 binary kolona dönüştürüyoruz!!!
from sklearn import preprocessing

x = data['kategori'].values
lb = preprocessing.LabelBinarizer()
lb.fit(x)
x_binarized = lb.transform(x)



Daha sonra binarize edilmiş kategori kolonumuzu (kolon diyorum ama artık bu değişkeni 3 kolon ile ifade ediyoruz) DataFrame 'e dönüştürüyoruz. 

Not: Kolon adlarını otomatik atadık-> kategori_0, kategori_1, kategori_2
colums_names=[]
for i in range(x_binarized.shape[1]):
    colums_names.append('kategori_'+str(i))

df_x_binarized = pd.DataFrame(x_binarized,columns=colums_names)

Daha sonra data değişkenimizdeki kategori sütununu siliyoruz...

ve binarize ettiğimiz 3 kolondan oluşan yeni kategori değerlerini veri setimize ekliyoruz (Veri tabanındaki join işlemi: iki dataframe i birleştiriyoruz);
data_encoded = data.drop(['kategori'], axis=1)
data_encoded = data_encoded.join(df_x_binarized)



Ve x0 ve kategori kolonlarından oluşan data isimli veri setimizin encode edilmiş hali data_encoded içeriği şu şekilde...






Hiç yorum yok:

Yorum Gönder