Normalization, Standardization, train_test_split

Kategori: Machine Learning , 23 Kasım 2019 , JanFranco


Preprocessing aşamasının son kısımlarındayız. Önceki yazıların üstüne koyarak ilerliyoruz. Yaş, boy, kilo gibi değerleri çekmiştik. Ancak verileri incelediğimizde bu değerler arasında bir problem vardır. Her bir kolonda minimum ve maximum değer arasındaki fark hemen hemen aynı iken veriler arasında bir uçurum vardır. Boylar 160-170-180 civarında değişirken, yaş değerleri 20-30 civarlarında değişmektedir. Aynı şekilde kilo değerleri de bu şekildedir. Bu verileri beraber işlememiz pek sağlıklı olmaz. Verileri bir aralığa ölçeklememiz gereklidir. Bunun için iki yöntem mevcut: Standartization ve Normalization. Normalizasyon ve standardizasyon formülleri:


Normalization = (Value - Min(Values)) / (Max(Values) - Min(Values))
Standardization = (Value - Mean(Values)) / Standard Dev.(Values)
Hangi işlemi seçeceğiz? Eğer verilerde aykırı bir değer, bir outlier yoksa normalization kullanabiliriz. Ancak minimum ve maksimum değerler arasında bir uçurum varsa ve normalization kullanırsak, outlier durum 1 iken diğer tüm durumlar 0 olabilir ve öğrenme gerçekleşmez. Böyle bir durumda da standardization kullanabiliriz. Python'da nasıl yapacağımızı görelim. Bunun için kodun biraz öncesine gidelim ve age değişkenine atadığımız boy, kilo, yaş değerlerini değiştirelim:


from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

age = sc.fit_transform(age)
Artık tüm sütunların ön işlemesini bitirdik. Şimdi tüm sütunları birer DataFrame'e dönüştürelim ve sonrasında birleştirelim:


result = pd.DataFrame(data=country, index=range(22), columns=['fr', 'tr', 'us'])
result_2 = pd.DataFrame(data=age, index=range(22), columns=['height', 'weight', 'age'])

gender = df.iloc[:, -1:].values
df = pd.concat([result, result_2], axis=1)
Son olarak da veriyi eğitim ve test olarak ikiye ayıracağız. Yukarıda gender değişkenine, yaş değerlerini çekmemizin sebebi de bu. Tahmin edeceğimiz değeri verisetine eklememiz gereksiz. Genellikle 1/3 oranı tercih edilir. Ayrıca verilerimizi incelediğimizde sırayla gittiğini görüyoruz. İlk bir kaç satır Fransa iken sonraki bir kaç satır Türkiyedir. Yani burada bir rastgelelik katmazsak, bilgisayarımız Amerikanın olduğu verileri öğrenemeyecektir. Rastgelelik katacağız ve 1/3 oranın böleceğiz:


from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(df, gender, test_size=0.33, random_state=0)

print(x_train)
print(x_train.shape)
print(x_test)
print(x_test.shape)
print(y_train)
print(y_train.shape)
print(y_test)
print(y_test.shape)

>>

     fr   tr   us    height    weight       age
8   0.0  1.0  0.0  0.662202 -0.098114 -0.518613
6   0.0  1.0  0.0  1.293501  0.820402 -0.277398
16  1.0  0.0  0.0  1.439185  1.279660  0.000000
4   0.0  1.0  0.0 -1.668748 -1.108482 -1.322664
2   0.0  1.0  0.0 -1.377379 -1.292185 -1.483474
5   0.0  1.0  0.0  0.807886  1.279660  0.124628
17  1.0  0.0  0.0  1.147816  0.820402 -0.116587
9   0.0  0.0  1.0  1.050693  1.968547  0.365843
7   0.0  1.0  0.0  0.565079  1.279660  0.526653
18  1.0  0.0  0.0  0.953570  1.187809 -0.036182
3   0.0  1.0  0.0 -1.474502 -1.475889 -1.563879
0   0.0  1.0  0.0 -1.620187 -1.475889 -1.483474
15  1.0  0.0  0.0  0.516517  0.361144  1.491514
12  0.0  0.0  1.0 -0.163343 -0.189966  0.000000
(14, 6)
     fr   tr   us    height    weight       age
20  1.0  0.0  0.0  0.030903  0.177441  0.285438
10  0.0  0.0  1.0  0.079464 -0.327743 -0.116587
14  0.0  0.0  1.0  0.176587 -0.006263  2.134755
13  0.0  0.0  1.0 -0.066220 -0.144040  1.009084
1   0.0  1.0  0.0 -1.862994 -1.200334 -1.403069
21  1.0  0.0  0.0  0.128026 -0.281818  1.089489
11  0.0  0.0  1.0 -0.406150 -0.557372  1.250299
19  1.0  0.0  0.0 -0.211905 -1.016631  0.044223
(8, 6)
[['k']
 ['e']
 ['e']
 ['e']
 ['k']
 ['e']
 ['e']
 ['e']
 ['e']
 ['e']
 ['k']
 ['e']
 ['e']
 ['k']]
(14, 1)
[['k']
 ['k']
 ['k']
 ['k']
 ['e']
 ['k']
 ['k']
 ['k']]
(8, 1)


Sonraki Yazı: Simple Linear Regression
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın