Makine Öğrenmesi - Genel Konular

Özellik Dönüştürme ve Ölçekleme Teknikleri

Yayın tarihi :14-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Makine öğrenimi alanında yapılan çalışmaların neredeyse tamamı oldukça geniş kapsamlı ve karmaşık yapılar üzerinden gerçekleştirilmektedir. Günümüzde teknolojik imkanların gelişimine bağlı olarak farklı amaçlar doğrultusunda farklı teknolojiler geliştirilmiş ve geliştirilen teknolojilerin imkanları dahilinde veri depolama ve işleme potansiyelinde oldukça ciddi artışlar elde edilmiştir. Bu bağlamda kullanılacak normal veya devasa boyutlardaki verilerin kolay ve başarılı bir şekilde işlenebilinmesi için, verilerin "ön hazırlık" denilen süreçten geçmesinin kritik bir önem taşıdığı söylenebilir. Ön hazırlık olarak ifade edilen bu süreçte, veri kümesi içerisinde bulunan herhangi bir verinin özelliğinin ön işlemesi veya özelliği değerlendirme ve geliştirme için kullanılacak model yapılarının seçimleri yapılmaktadır. Bu uygulamalar sayesinde karmaşık formlar basit formlara dönüştürülerek hem zamansal açıdan kazanç, hem de sonuçların başarı oranlarında ve doğruluğunda ciddi artışlar elde edilebilinmektedir. 

Günümüzde makine öğrenimi alanı uygulama çalışmalarında kullanılan model yapılarının ön hazırlık sürecinde iyileştirilmesi ve geliştirilmesi, bu alanda yapılan çalışmaların temel adımlarından birisi olarak ifade edilebilir. Bu durumun öneminin en basit ifadeleri; bazı zamanlarda veri kümesi içerisinde bulunan verisel özelliklerin oldukça az olmasına bağlı olarak modelin yeterli öğrenim görmemesi, oldukça yüksek oranlarda verisel özelliklerin mevcut olmasına bağlı olarak model yapılarının gereksiz bilgileri öğrenmesi veya verisel özelliklerin ifadelerinin kendi aralarında birbirleriyle ortak bir payda da ele alınamaması olarak ifade edilebilir. Buradan anlaşılacağı üzere, her üç durumda da özelliklerin kendi aralarında veya modeller arasında uyumsuzluk yaşayabileceği ve bu durumdan dolayı çalışmaların başarı oranlarında ciddi düşüşler gözlenebilineceği söylenebilir. Bu durumun daha iyi anlayabilmek için iki basit örnek inceleyelim. Örneğin;

  • Elimizde bazı insanların boy ve kilogram bilgilerini içeren bir veri kümesi olduğunu varsayalım. Bildiğimiz üzere boy terimi "cm" veya "feet-inç(Amerika'da resmi boy ölçü birimi)" terimleriyle ifade edilirken, kilogram terimi "kg" ile ifade edilmektedir. Yani, verisel özelliklerin ifadeleri birbirlerinden farklılık gösterdiği anlaşılmaktadır. Tam da bu noktada meydana gelebilecek karmaşıklıktan kurtulmak için tüm veriler normalizasyon teknikleri çerçesinde ele alınır ve maksimum düzeyde basit bir forma indirgenmeye çalışılır. 
  • Veya, elimizde bir şirkette çalışan personellerin maaş ve çalışma yılı bilgilerini içeren veri seti olduğunu varsayalım. Bir değişken değeri kişinin maaş miktarını tutuyorken (örn: 5000-20000), diğer değişken de kişinin kaç yıldır çalıştığı bilgisini tutuyor olsun (örn:1-20). Bu iki değişkenin sayıları ağırlık olarak büyük farklılıklara neden olacaktır. 

Bu örneklerden de anlaşılacağı üzere veri setlerindeki değişken değerleri, büyüklük, birim ve aralık açısından birbirinden farklı özellikler içerecektir. Makine öğrenmesi algoritmalarının çoğu, hesaplamalarında iki veri noktası arasındaki öklid mesafesini kullandığından, bu tip farklılıklar sorunlara neden olacaktır. 

Bu nedenle, makine öğrenmesi modellerini eğitmeden önce yukarıdaki örneklerde belirtildiği gibi veri kümesini oluşturan veriler arasında farklılıklar tespit edilirse, çalışmanın başarılı bir şekilde sonuçlanabilmesi için verilere normalleştirme yapmak gerekecektir. 

Makine Öğreniminde Normalleştirme (Normalizasyon) Nedir?

Makine öğrenimini sürecinde normalleştirme, makine öğrenimi açısından yapılmak istenilen veri kaynaklı çalışmalarda kullanılmak istenilen veri kümelerinin içerisinde bulunan her verinin sayısal sütunları üzerinde değişiklik yapılabilinmesine olanak sağlayan, oldukça yaygın ve başarılı bir kullanıma sahip teknik olarak tanımlanabilir. Bu durum daha basit ifadesiyle, normalleştirme tekniğinin kullanımına bağlı olarak veri kümesindeki sayısal sütunlar referans alınır ve bütün veriyi kapsayacak ortak bir ölçek (örneğin 0 ve 1) meydana getirilir. Bu işlemin sonucunda ise, çalışmalarda kullanılacak modellerin yüksek performanslara yükseltgenmesi ve sonuçların güvenilirlik oranlarında oldukça ciddi artışlar meydana gelmesi sağlanmaktadır. Böylelikle, çalışmaların uygulanabilirliği ve başarı oranı için iyileştirmeler yapılır ve normalleştirmeye kaynak olan veri kümesi kullanıma hazırlanmış olur. 

Makine öğrenimi alanında kullanılan bu tekni yukarıda verilen örnekte olduğu gibi veri kümesi elemanları arasında öznitelik farklılıklarının gözlendiği durumlarda kullanılmaktadır. Bu bilgiden hareketle, makine öğrenimi alanında yapılacak her çalışmada bu tekniğin uygulanması zorunlu değildir veya kullanıma ihtiyaç duyulmamaktadır. 

Normalleştirme Teknikleri Nelerdir?

Günümüzde makine öğrenimi sürecinde birçok farklı normalleştirme tekniği geliştirilmiştir. Ancak bu alan için geliştirilen bu tekniklerden bazıları oldukça yaygın olarak kullanılırken, bazıları ise yeterince tercih edilmemektedir. İlgili normalleştirme teknikleri;

  • MinMax Scaler
  • Standard Scaler
  • MaxAbsScaler
  • Robust Scaler
  • Quantile Transformer Scaler
  • Log Transformation
  • Power Transformer Scaler
  • Unit Vector Scaler/Normalizer

Normalleştirme Teknikleri Nasıl Uygulanır?

Yukarıda verilen ve normalleştirme sürecinde yaygın olarak kullanılan teknikleri inceleyebilmek için "cars.xls" veri seti üzerinde bulunan "Price" sütununu üzerinde işlemler yapılacaktır ama ondan önce veri setinde bazı temizleme/düzenleme işlemleri uygulanacaktır.

import pandas as pd
import seaborn as sns
import numpy as np
import warnings
warnings.filterwarnings("ignore")
#veri seti içe aktarılır
df=pd.read_excel("cars.xls")
df.head()

Çıktı:

df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 804 entries, 0 to 803
Data columns (total 12 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Price     804 non-null    float64
 1   Mileage   804 non-null    int64  
 2   Make      804 non-null    object 
 3   Model     804 non-null    object 
 4   Trim      804 non-null    object 
 5   Type      804 non-null    object 
 6   Cylinder  804 non-null    int64  
 7   Liter     804 non-null    float64
 8   Doors     804 non-null    int64  
 9   Cruise    804 non-null    int64  
 10  Sound     804 non-null    int64  
 11  Leather   804 non-null    int64  
dtypes: float64(2), int64(6), object(4)
memory usage: 75.5+ KB
#Veri seti üzerinden Price sütunu inceleneceğinden sadece ilgili sütunu alalım
df=df[["Price"]]
df.head()

Çıktı:

#Aykırı (outlier) değerlerin olup olmadığına bakılır.
sns.boxplot(df["Price"]);

Çıktı:

#45000 değerinden büyük Price değerleri aykırı değer(outlier) olduğundan dolayı veri setinden kaldırılabilir.
df=df[df["Price"]<45000] 
#Orijinal Price sütunu grafiklemesi
sns.histplot(df["Price"],kde=True,bins=40)

Çıktı:

Veri seti kullanım için hazır hale getirildi. Artlık yaygın olarak kullanılan normalleştirme teknikleri incelenebilir;

1. MinMax Scaler

Tüm verileri varsayılan olarak 0-1 değeri aralığında listelemek için kullanılır. Varsayılan değerler haricinde de istenilen değer aralığına veriler çevrilebilir.

Günümüzde evrensel olarak kabul görmüş MinMax Scaler matematiksel formül ifadesi;

Kullanabilmek için "minmax_scale" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import minmax_scale
#minmax_scale kütüphanesi ile varsayılan olarak 0-1 aralığına Price sütun değerleri atanır.
scaled_data = minmax_scale(df["Price"])

#0-1 aralığına çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(0-1)"]=scaled_data
df.sample(5)

Çıktı:

#min ve max değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(0-1)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(0-1)"].max()))

Çıktı:

en küçük değer: 0.0
en büyük değer: 1.0
#0-1 aralığına çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(0-1)"],kde=True,bins=40)

Çıktı:

#minmax_scale kütüphanesi ile 0-5 aralığına Price sütun değerleri atama yapılırsa
scaled_data2 = minmax_scale(df["Price"],feature_range=(0,5))

#0-5 aralığına çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(0-5)"]=scaled_data2
df.sample(5)

Çıktı:

#min ve max değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(0-5)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(0-5)"].max()))

Çıktı:

en küçük değer: 0.0
en büyük değer: 5.0
#0-5 aralığına çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(0-5)"],kde=True,bins=40)

Çıktı:

2. Standard Scaler

Değişken dağılımının normal olduğunu varsayarak, değerleri ortalama 0 ve standart sapma 1 (veya varyans) olacak şekilde ölçekler. Eğer değişken değerleri normal olarak dağılım sağlamıyorsa kullanılmamalı veya değişkenler normal dağılım şekline dönüştürülerek Standard Scaler uygulanmalıdır.

Günümüzde evrensel olarak kabul görmüş Standard Scaler matematiksel formül ifadesi;

Kullanabilmek için "StandardScaler" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import StandardScaler
#StandardScaler kullanımı
scale=StandardScaler()
scaled_data3=scale.fit_transform(df[["Price"]])

#StandardScaler olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(StandardScaler)"]=scaled_data3
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(StandardScaler)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(StandardScaler)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(StandardScaler)"].std()))

Çıktı:

en küçük değer: -1.4276748325838988
en büyük değer: 2.902677919982411
standard sapma: 1.0006367399562732
#StandardScaler il çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(StandardScaler)"],kde=True,bins=40)

Çıktı:

3.MaxAbsScaler

Her sütunun mutlak en büyük değerini alarak tüm sütun değerlerini bu değere bölmek için kullanılır. Sütun değerlerini mutlak en büyük değere böldüğü için [-1,1] aralığında değerler oluşacaktır.

Günümüzde evrensel olarak kabul görmüş MaxAbsScaler matematiksel formül ifadesi;

Kullanabilmek için "MaxAbsScaler" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import MaxAbsScaler
#MaxAbsScaler kütüphanesi kullanımı
scale=MaxAbsScaler()
scaled_data4=scale.fit_transform(df[["Price"]])

#MaxAbsScaler olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(MaxAbsScaler)"]=scaled_data4
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(MaxAbsScaler)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(MaxAbsScaler)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(MaxAbsScaler)"].std()))

Çıktı:

en küçük değer: 0.19305008625349598
en büyük değer: 1.0
standard sapma: 0.1864660403291091
#MaxAbsScaler il çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(MaxAbsScaler)"],kde=True,bins=40)

Çıktı:

4. Robust Scaler

Aykırı değerlere duyarlı olmadan verileri InterQuartile Range (IQR) (veri setinin üst ve alt çeyrekleri arasındaki farkını temsil etmektir) ile ölçekler. 

Günümüzde evrensel olarak kabul görmüş Robust Scaler matematiksel formül ifadesi;

Kullanabilmek için "RobustScaler" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import RobustScaler
#RobustScaler kütüphanesi kullanımı
scale=RobustScaler()
scaled_data5=scale.fit_transform(df[["Price"]])

#RobustScaler olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(RobustScaler)"]=scaled_data5
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(RobustScaler)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(RobustScaler)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(RobustScaler)"].std()))

Çıktı:

en küçük değer: -0.8080476387605205
en büyük değer: 2.368761493019793
standard sapma: 0.7340815205421987
#RobustScaler ile çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(RobustScaler)"],kde=True,bins=40)

Çıktı:

5.Quantile Transformer Scaler

Genellikle doğrusal olmayan değişkenler için kullanılan Quantile Transformer Scaler, değişkeni öncelikli olarak normal dağılıma dönüştürerek kümülatif dağılım fonksiyonununu hesaplar. 

Kullanabilmek için "QuantileTransformer" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import QuantileTransformer
#QuantileTransformer kütüphanesi kullanımı
scale=QuantileTransformer()
scaled_data6=scale.fit_transform(df[["Price"]])

#QuantileTransformer olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(QuantileTransformer)"]=scaled_data6
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(QuantileTransformer)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(QuantileTransformer)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(QuantileTransformer)"].std()))

Çıktı:

en küçük değer: 0.0
en büyük değer: 1.0
standard sapma: 0.28922620401409127
#QuantileTransformer ile çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(QuantileTransformer)"],kde=True,bins=40)

Çıktı:

6. Log Transformation

İsminde de anlaşılacağı gibi değişkenin logaritmasını alarak ölçekleme işlemi yapmaktadır.

#Log Transformation kullanımı
#numpy kütüphanesi kullanılarak değişken değerlerinin logaritması alınır
scaled_data7=np.log(df[["Price"]])

#Log Transformation olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(Log Transformation)"]=scaled_data7
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(Log Transformation)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(Log Transformation)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(Log Transformation)"].std()))

Çıktı:

en küçük değer: 9.064034115167342
en büyük değer: 10.708839724645777
standard sapma: 0.3818846179211658
#Log Transformation ile çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(Log Transformation)"],kde=True,bins=40)

Çıktı:

7. Power Transformer Scaler

Değişken değerlerini Gauss benzeri hale getirmek için kullanılan bir ölçekleme yöntemidir.

Kullanabilmek için "PowerTransformer" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import PowerTransformer

PowerTransformer kullanımında method değeri olarak 2 farklı değer alır;

  • yeo-johnson, pozitif ve negatif değerlerle çalışır.
  • box-cox, kesinlikle pozitif değerlerle çalışır.
#PowerTransformer kütüphanesi kullanımı
scale=PowerTransformer(method="box-cox")
scaled_data8=scale.fit_transform(df[["Price"]])

#PowerTransformer olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(PowerTransformer)"]=scaled_data8
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(PowerTransformer)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(PowerTransformer)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(PowerTransformer)"].std()))

Çıktı:

en küçük değer: -2.4563228683621654
en büyük değer: 1.9634483347157776
standard sapma: 1.0006367399562734
#PowerTransformer ile çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(PowerTransformer)"],kde=True,bins=40)

Çıktı:

8. Unit Vector Scaler/Normalizer

Değişkenleri tek birim normuna göre normalleştirmek için kullanılır. En az bir sıfır olmayan bileşene sahip her örnek, normu (l1, l2 veya inf) bire eşit olacak şekilde diğer örneklerden bağımsız olarak yeniden ölçeklendirilir.

Kullanabilmek için "Normalizer" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.preprocessing import Normalizer
#Normalizer kütüphanesi kullanımı
scale=Normalizer(norm="l1") #varsayılan olarak l2'dir
scaled_data9=scale.fit_transform(df[["Price"]])

#Normalizer olarak çevrilen Price sütununu veri setine eklenir
df["Scaled_Data(Normalizer)"]=scaled_data9
df.sample(5)

Çıktı:

#min ve max ve standard sapma değerlerine bakalım
print("en küçük değer: {}".format(df["Scaled_Data(Normalizer)"].min()))
print("en büyük değer: {}".format(df["Scaled_Data(Normalizer)"].max()))
print("standard sapma: {}".format(df["Scaled_Data(Normalizer)"].std()))

Çıktı:

en küçük değer: 1.0
en büyük değer: 1.0
standard sapma: 0.0
#Normalizer ile çevrilen Price değerlerini görselleştirilse;
sns.histplot(df["Scaled_Data(Normalizer)"],kde=True,bins=40)

Çıktı:

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.