Veri Hazırlığının Vazgeçilmezi : Özellik Ölçeklendirme

Merhaba VBO okuyucuları!

Bu yazımda sizlere veri hazırlığında çok önemli yeri olan ve Feature Scaling olarak da bilinen ‘Özellik Ölçeklendirme’ kavramından ve yöntemlerinden bahsedeceğim. Verileri modele vermeden önce dikkat edilmesi gereken önemli noktalardan bazıları şunlardır:

  • Verinin dağılımı: Verinin normal dağılıp dağılmaması, bazı algoritmaların çalışmasını etkileyen bir faktör. Veriler sağa yatık, ya da sola yatıksa, model performansı bu durumdan etkilenebilir.
  • Özellikler arasındaki ölçek farklılıkları: Klasik bir örnekten gidecek olursak, verimiz yaş ve gelir boyutlarını içeriyor olsun. Yaş aralığı 0-90 yaşlarını kapsıyor ve gelir boyutu da 0- 250.000 TL arasında değerler içeriyor olsun. Burada Öklid, Manhattan gibi uzaklık bazlı hesaplamaları kullanan algoritmalar için değerler sapacaktır. Bu bağlamda bu özellliklerin ortak bir veri aralığına çekilmesi ile daha doğru sonuçlar elde edebiliriz.

Bu değerleri normal hale getirmek ve baskınlığı azaltmak adına bazı yöntemler mevcuttur. Bunlar, normalizasyon, standardizasyon gibi metodlardır. Bu metodlar uzaklık tabanlı ve gradyan tabanlı tahminleyici algoritmaları kullanmadan önce uygulanması faydalı olan yöntemlerdir. Peki bu metodlar nedir ve hangi durumlarda kullanılır?

  • MinMax Scaling, verinin 0 ile 1 arasında değerler aldığı bir durumdur. Burada dağılım, verinin dağılımı ile benzerdir. Burada ‘outlier’ denilen dışta kalan verilere karşı hassasiyet durumu vardır, bu yüzden bu değerlerin fazla olduğu bir durumda iyi bir performans gösteremeyebilir.

Formülü aşağıdaki gibidir. Açıklayacak olursak: Değerimizden o veri aralığındaki minimum değeri çıkartıyoruz, aralık değerine bölüyoruz.

X-Xmin / Xmax-Xmin
from sklearn import preprocessing
min_max_scaler = MinMaxScaler()
scaled_df = min_max_scaler.fit_transform(df)
df_sc = pd.DataFrame(scaled_df)
  • Robust Scaler, Normalizasyon ile benzer şekilde çalışır. Aykırı değerlere sahip verilerde daha iyi sonuçlar verebilir. Yine veri dağılımı ile benzerlik gösterir ancak aykırı değerler dışarıda kalır. Medyan değeri sonradan kullanılmak üzere elenir ve değerler 1.ve 3. kartil aralığına oturtulur.
X-Q1(X) / Q3(X)-Q1(X)
from sklearn import preprocessing
robust_scaler = RobustScaler()
scaled_df = max_scaler.fit_transform(df)
df_sc = pd.DataFrame(scaled_df)
  • MaxAbs Scaler, her özelliğin maksimum mutlak değeri 1 olacak şekilde her özelliği ayrı ayrı ölçeklendirir ve dönüştürülür.
X / max(abs(X))
from sklearn import preprocessing
max_scaler = MaxAbsScaler()
scaled_df = max_scaler.fit_transform(df)
df_sc = pd.DataFrame(scaled_df)
  • Standardizasyon, ortalama değerin 0, standart sapmanın ise 1 değerini aldığı, dağılımın normale yaklaştığı bir metoddur. Formülü şu şekildedir, elimizdeki değerden ortalama değeri çıkartıyoruz, sonrasında varyans değerine bölüyoruz.
(X - u) / s
from sklearn import preprocessing
scaler = preprocessing.StandardScaler()
scaled_df = scaler.fit_transform(df)
df_sc = pd.DataFrame(scaled_df)
  • PowerTransformer, varyansı stabilize etmek ve çarpıklığı en aza indirmek için en uygun ölçeklendirme faktörünü bulur. Yine ortalama değerin 0, standart sapmanın ise 1 değerini aldığı bir metoddur.
from sklearn import preprocessing
transform_power = preprocessing.PowerTransformer()
scaled_df = transform_power.fit_transform(df)
df_sc = pd.DataFrame(scaled_df)

Bir önceki yazımda RFM analizinden bahsetmiştim, bu link üzerinden ulaşabilirsiniz. Şimdi çıkan RFM tablosundaki verileri normalize/standardize edelim.

Bu yöntemler ile uzaklık tabanlı algoritmalarda daha farklı sonuçlar alınabilir. Kullanılması faydalı olacaktır.

clus = rfm_table[['Monetary','Recency','Frequency']]
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
d_scaled = scaler.fit_transform(clus)
data_scaled1 = pd.DataFrame(d_scaled)
data_scaled1.head()
012
01.191780-0.9595420.285250
11.317505-0.9595422.360848
21.068039-0.9595422.822092
30.452246-0.9595422.437722
40.736600-0.9595422.437722

Burada verileri incelediğimizde negatif ve pozitif değerler aldıklarını görüyoruz. Dağılım benzerlik gösteriyor.

data_scaled1.describe()
012
count5.88E+035.88E+035.88E+03
mean2.54E-16-3.03E-15-8.97E-15
std1.00E+001.00E+001.00E+00
min-2.05E-01-9.60E-01-4.07E-01
25%-1.81E-01-8.40E-01-4.07E-01
50%-1.44E-01-5.06E-01-2.53E-01
75%-4.83E-028.51E-015.46E-02
max4.11E+012.57E+003.01E+01
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(clus)
data_scaled2 = pd.DataFrame(x_scaled)
data_scaled2.head()
012
00.033800.02267
10.03684400.09068
20.03080500.105793
30.015900.093199
40.02278300.093199

Burada verileri incelediğimizde 0 ve 1 arasında değerler aldığını görüyoruz. Dağılımın bu iki değer arasında dağıldığını görüyoruz.

data_scaled2.describe()
012
count587858785878
mean0.0049530.2721770.013323
std0.0242070.2836770.032769
min000
25%0.0005680.0338750
50%0.0014720.1287260.005038
75%0.0037850.513550.015113
max111

Burada özellik ölçeklendirme metodlarından ikisini de örneklendirmiş olduk. Bu yöntemler gerçekten hayat kurtarıcı olabiliyor. Uzaklık temelli algoritmaları kullanırken öncesinde verileri bu işlemlere tabi tutarak maliyeti azaltıp, modelin performansını iyileştirebilirsiniz.

Yorumlarınız için şimdiden teşekkürler!

Kaynakça:

https://medium.com/analytics-vidhya/feature-scaling-in-scikit-learn-b11209d949e7

https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html

Yazar Hakkında
Toplam 9 yazı
Sena Merter Dereli
Sena Merter Dereli
Pazarlama & Müşteri Analitiği Araştırmacısı / n11.com'da Pazarlama Analitiği Yöneticisi
Yorumlar (1 Yorum)
Nurettin
Nurettin Yanıtla
- 03:15

Hocam merhaba, öncelikle yazınız için çok teşekkür ederim. Benim bir sorum olacak elimde bir veri seti var belirli özellikleri olan arabaların satış fiyatlarını içeren bir veri bu veri setini eğitip model haline getirdim. Girdi olarak 5 özellik girip fiyat tahmini yapmasını sağladım tensorflow ile istediğim gibi oldu ama bu modeli .tflite’a çevirip android studio’da kullandığım zaman aynı sonucu alamadım. Daha sonra farkettimki tensorflow’da tahmin edilmek üzere girilen özellik verileri ya da girdileri önce scaler transforma sokup tahmin ettiriyorum. Öyle yapmadığım zaman aynı android studio’daki gibi sonuç alıyorum. Acaba bu scale etme özelliğini android studio’da nasıl kullanabilirim fikriniz var mı

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara