Takip et

Veri Normalizasyonu ve scikit-learn ile Uygulamaları

Veri Normalizasyonu ve scikit-learn ile Uygulamaları Makine öğrenimi projelerinde veri ön işleme, modelin performansı ve genellenebilirliği ü

Veri Normalizasyonu ve scikit-learn ile Uygulamaları

Makine öğrenimi projelerinde veri ön işleme, modelin performansı ve genellenebilirliği üzerinde kritik bir etkiye sahiptir. Ham veriler genellikle farklı ölçeklerde, birimlerde ve dağılımlarda özellikler içerir. Bu durum, özellikle mesafe tabanlı algoritmalar veya gradyan inişi gibi optimizasyon tekniklerini kullanan algoritmalar için ciddi sorunlara yol açabilir. Veri normalizasyonu (veya daha geniş anlamda veri ölçeklendirme), bu farklı ölçekleri tutarlı bir aralığa veya dağılıma dönüştürerek bu sorunları çözmeyi amaçlayan temel bir ön işleme adımıdır. Python’da scikit-learn kütüphanesi, bu işlemi kolay ve etkili bir şekilde gerçekleştirmek için güçlü araçlar sunar. Bu makalede, veri normalizasyonunun ne olduğunu, neden gerekli olduğunu, farklı normalizasyon yöntemlerini ve scikit-learn ile bunların nasıl uygulanacağını detaylı kod örnekleriyle ele alacağız.

Veri Normalizasyonu Nedir ve Neden Gereklidir?

Veri normalizasyonu, bir veri setindeki sayısal özelliklerin değer aralığını standart bir aralığa dönüştürme işlemidir. Bu işlem, özelliklerin farklı ölçeklerde olmasından kaynaklanan önyargıları ortadan kaldırmak ve tüm özelliklerin modele eşit katkıda bulunmasını sağlamak için yapılır. Örneğin, bir veri setinde “yaş” özelliği 0-100 arasında değişirken, “gelir” özelliği 10.000-1.000.000 arasında değişebilir. Bu durumda, gelir özelliği, değer aralığı çok daha geniş olduğu için model tarafından gereğinden fazla önemli algılanabilir.

Veri Ölçeklendirme ve Normalizasyon Arasındaki Fark

“Veri ölçeklendirme” ve “veri normalizasyonu” terimleri genellikle birbirinin yerine kullanılsa da, teknik olarak farklı anlamlara gelebilirler.
* Ölçeklendirme (Scaling): Özelliklerin değer aralığını değiştirme işleminin genel adıdır. Bu, değerleri belirli bir aralığa sıkıştırmak (örn. [0, 1]) veya ortalamayı sıfıra ve standart sapmayı bire ayarlamak gibi farklı yöntemleri içerebilir.
* Normalizasyon (Normalization): Genellikle veriyi belirli bir aralığa (örn. [0, 1] veya [-1, 1]) ölçeklendirmeyi ifade eder (Min-Max Normalizasyonu). Bazı bağlamlarda, veriyi bir birim vektöre dönüştürme (L1 veya L2 normuna göre) anlamına da gelebilir.
* Standardizasyon (Standardization): Genellikle veriyi ortalamayı sıfıra ve standart sapmayı bire ayarlayarak dönüştürmeyi ifade eder (Z-Score Normalizasyonu). Bu, verinin bir Gauss dağılımına benzer bir şekle sahip olduğunu varsayar ancak verinin kendisini Gauss dağılımına dönüştürmez.

Bu makalede “normalizasyon” terimini daha geniş anlamda, yani veri ölçeklendirme tekniklerinin tamamını kapsayacak şekilde kullanacağız.

Normalizasyonun Amaçları

Veri normalizasyonunun temel amaçları şunlardır:

* Algoritma Performansı: Birçok makine öğrenimi algoritması, özelliklerin aynı ölçekte olmasını gerektirir veya bu durumdan fayda sağlar.
* Mesafe Tabanlı Algoritmalar: K-En Yakın Komşu (K-NN), Destek Vektör Makineleri (SVM), K-Means gibi algoritmalar, özellikler arasındaki mesafeyi hesaplar. Ölçeklendirilmemiş verilerde, daha geniş değer aralığına sahip özellikler mesafeyi domine edebilir ve bu da hatalı sınıflandırma veya kümelemeye yol açabilir.
* Gradyan İnişi Tabanlı Algoritmalar: Lojistik Regresyon, Yapay Sinir Ağları gibi algoritmalar, model parametrelerini optimize etmek için gradyan inişi kullanır. Ölçeklendirilmemiş verilerde, farklı ölçeklerdeki özellikler için farklı gradyanlar oluşur, bu da optimizasyon sürecini yavaşlatabilir ve hatta yerel minimumlarda takılıp kalmasına neden olabilir. Ölçeklendirilmiş verilerde, gradyan inişi daha hızlı ve daha kararlı bir şekilde yakınsar.
* Boyut İndirgeme Teknikleri: Temel Bileşen Analizi (PCA) gibi teknikler, varyansa dayalıdır. Ölçeklendirilmemiş verilerde, daha yüksek varyansa sahip özellikler, daha düşük varyansa sahip ancak daha önemli olabilecek diğer özelliklerin etkisini gölgede bırakabilir.
* Yakınsama Hızı: Özellikle yapay sinir ağları gibi yinelemeli algoritmalar, ölçeklendirilmiş verilerle daha hızlı yakınsar. Bu, eğitim süresini önemli ölçüde kısaltabilir.
* Aykırı Değerlerin Etkisi: Bazı normalizasyon yöntemleri, aykırı değerlerin etkisini azaltmaya yardımcı olabilir. Örneğin, medyan ve çeyreklik aralığına dayalı RobustScaler, aykırı değerlere karşı daha dirençlidir.
* Yorumlanabilirlik: Bazı durumlarda, verinin belirli bir aralığa ölçeklendirilmesi, sonuçların daha kolay yorumlanmasına yardımcı olabilir, ancak bu ana amaç değildir.

scikit-learn ile Normalizasyon Yöntemleri

scikit-learn, veri ön işleme için kapsamlı bir modül olan sklearn.preprocessing altında çeşitli normalizasyon ve ölçeklendirme araçları sunar. Bu araçların çoğu, fit(), transform() ve fit_transform() metodlarını içeren bir API’ye sahiptir.

* fit(X): Dönüşüm için gerekli parametreleri (örn. ortalama, standart sapma, minimum, maksimum değerler) X veri setinden öğrenir. Bu adım yalnızca eğitim verisi üzerinde yapılmalıdır.
* transform(X): Öğrenilen parametreleri kullanarak X veri setini dönüştürür. Bu adım, hem eğitim hem de test verisi üzerinde uygulanır. Test verisi üzerinde fit() çağrılmamalıdır, aksi takdirde “veri sızıntısı” (data leakage) meydana gelir.
* fit_transform(X): fit() ve transform() metodlarını tek bir adımda birleştirir. Genellikle eğitim verisi üzerinde kullanılır.

Şimdi scikit-learn’deki yaygın normalizasyon yöntemlerini inceleyelim.

Min-Max Normalizasyonu (MinMaxScaler)

Min-Max Normalizasyonu, özelliklerin değerlerini belirli bir aralığa, genellikle [0, 1] aralığına ölçekler. Formülü şu şekildedir:

$X_{\text{scaled}} = \frac{X – X_{\text{min}}}{X_{\text{max}} – X_{\text{min}}}$

Burada $X$ orijinal değer, $X_{\text{min}}$ özelliğin minimum değeri ve $X_{\text{max}}$ özelliğin maksimum değeridir.

* Ne Zaman Kullanılır: Veri dağılımının bir Gauss dağılımına uymadığı durumlarda veya çıktı değerlerinin belirli bir aralıkta (örn. [0, 1]) olması istendiğinde tercih edilir. Yapay sinir ağları genellikle bu tür ölçeklendirilmiş girdileri tercih eder.
* Avantajları:
* Verinin orijinal dağılım şeklini korur.
* Tüm özellik değerlerini belirli bir aralığa sıkıştırır, bu da bazı algoritmalar için faydalıdır.
* Dezavantajları:
* Aykırı değerlere karşı oldukça hassastır. Tek bir büyük aykırı değer, tüm diğer değerleri çok küçük bir aralığa sıkıştırarak etkisiz hale getirebilir.

scikit-learn Uygulaması:

from sklearn.preprocessing import MinMaxScaler
import numpy as np

Örnek veri

data = np.array([[1, 2000], [2, 3000], [3, 10000], [4, 5000]])

MinMaxScaler örneği oluşturma

scaler = MinMaxScaler()

Veriyi dönüştürme

scaled_data = scaler.fit_transform(data) print("Orijinal Veri:\n", data) print("Min-Max Ölçeklendirilmiş Veri:\n", scaled_data)

Çıktı:

Orijinal Veri:

[[ 1 2000]

[ 2 3000]

[ 3 10000]

[ 4 5000]]

Min-Max Ölçeklendirilmiş Veri:

[[0. 0. ]

[0.33333333 0.125 ]

[0.66666667 1. ]

[1. 0.375 ]]

feature_range parametresi ile hedef aralığı değiştirebilirsiniz, örneğin MinMaxScaler(feature_range=(-1, 1)).

Z-Score Normalizasyonu (StandardScaler)

Z-Score Normalizasyonu veya Standardizasyon, veriyi ortalamayı sıfıra ve standart sapmayı bire ayarlayarak dönüştürür. Formülü şu şekildedir:

$X_{\text{scaled}} = \frac{X – \mu}{\sigma}$

Burada $X$ orijinal değer, $\mu$ özelliğin ortalaması ve $\sigma$ özelliğin standart sapmasıdır.

* Ne Zaman Kullanılır: Veri dağılımının yaklaşık olarak bir Gauss dağılımına benzediği veya algoritmaların (örn. Lojistik Regresyon, SVM, Lineer Regresyon, PCA) ortalama ve varyansa duyarlı olduğu durumlarda tercih edilir.
* Avantajları:
* Aykırı değerlere Min-Max ölçeklendirmeye göre daha az hassastır, çünkü standart sapma aykırı değerlerden etkilenir ancak aralığın kendisi kadar aşırı değildir.
* Birçok istatistiksel model ve makine öğrenimi algoritması için varsayılan bir ön işleme adımıdır.
* Dezavantajları:
* Veriyi belirli bir aralığa sıkıştırmaz, bu nedenle dönüştürülmüş değerler pozitif veya negatif olabilir.

scikit-learn Uygulaması:

from sklearn.preprocessing import StandardScaler
import numpy as np

Örnek veri

data = np.array([[1, 2000], [2, 3000], [3, 10000], [4, 5000]])

StandardScaler örneği oluşturma

scaler = StandardScaler()

Veriyi dönüştürme

scaled_data = scaler.fit_transform(data) print("Orijinal Veri:\n", data) print("Standard Ölçeklendirilmiş Veri:\n", scaled_data)

Çıktı:

Orijinal Veri:

[[ 1 2000]

[ 2 3000]

[ 3 10000]

[ 4 5000]]

Standard Ölçeklendirilmiş Veri:

[[-1.34164079 -0.83391219]

[-0.4472136 -0.55594146]

[ 0.4472136 1.66782439]

[ 1.34164079 -0.27797073]]

Robust Normalizasyon (RobustScaler)

RobustScaler, aykırı değerlerin yoğun olduğu veri setleri için tasarlanmıştır. Bu yöntem, ortalama ve standart sapma yerine medyan ve çeyreklik aralığı (IQR – Interquartile Range) kullanır. IQR, üçüncü çeyreklik (Q3) ile birinci çeyreklik (Q1) arasındaki farktır. Formülü şu şekildedir:

$X_{\text{scaled}} = \frac{X – \text{median}}{Q3 – Q1}$

* Ne Zaman Kullanılır: Veri setinde önemli sayıda aykırı değer bulunduğundan şüphelenildiğinde ve bu aykırı değerlerin normalizasyon sürecini bozması istenmediğinde tercih edilir.
* Avantajları:
* Aykırı değerlere karşı son derece dirençlidir, çünkü medyan ve IQR bu değerlerden daha az etkilenir.
* Dezavantajları:
* Veriyi belirli bir aralığa veya belirli bir dağılıma (örn. ortalama 0, standart sapma 1) dönüştürmeyi garanti etmez.

scikit-learn Uygulaması:

from sklearn.preprocessing import RobustScaler
import numpy as np

Örnek veri (aykırı değer içeriyor)

data = np.array([[1, 2000], [2, 3000], [3, 10000], [4, 5000], [100, 100000]])

RobustScaler örneği oluşturma

scaler = RobustScaler()

Veriyi dönüştürme

scaled_data = scaler.fit_transform(data) print("Orijinal Veri (Aykırı Değerli):\n", data) print("Robust Ölçeklendirilmiş Veri:\n", scaled_data)

Çıktı:

Orijinal Veri (Aykırı Değerli):

[[ 1 2000]

[ 2 3000]

[ 3 10000]

[ 4 5000]

[ 100 100000]]

Robust Ölçeklendirilmiş Veri:

[[-0.66666667 -0.2 ]

[-0.33333333 0. ]

[ 0. 1.4 ]

[ 0.33333333 0.4 ]

[32.33333333 19. ]]

Görüldüğü gibi, aykırı değer olan [100, 100000] diğer değerlere göre hala oldukça büyük, ancak diğer değerler arasındaki ilişkiler daha iyi korunmuştur.

Normalizasyon (Normalizer)

Normalizer sınıfı, diğer ölçekleyicilerden farklı olarak, her bir örneği (yani her bir satırı) bağımsız olarak bir birim vektöre dönüştürür. Bu, özelliklerin (sütunların) ölçeklendirilmesi yerine, her bir veri noktasının (satırın) normunun 1 olmasını sağlar. Özellikle metin sınıflandırması veya kümeleme gibi uygulamalarda, özellik vektörlerinin yönü (benzerliği) büyüklüğünden daha önemli olduğunda kullanılır.

Formülü (L2 normu için):

$X_{\text{scaled}} = \frac{X}{||X||_2}$

Burada $||X||_2$ vektörün Öklid (L2) normudur.

* Ne Zaman Kullanılır: Metin madenciliği (TF-IDF vektörleri), k-means kümelemesi veya kosinüs benzerliği gibi mesafe ölçütlerinin kullanıldığı durumlarda faydalıdır.
* Avantajları:
* Özellikler arasındaki açısal ilişkileri korur.
* Verinin yoğunluğunu veya büyüklüğünü dikkate almaz, sadece yönünü önemser.
* Dezavantajları:
* Özelliklerin tek tek ölçeklerini değiştirmez, bu nedenle diğer normalizasyon yöntemleriyle aynı amaçlara hizmet etmez.
* Sıfır vektörler için tanımsızdır (bölme sıfır olur).

scikit-learn Uygulaması:

from sklearn.preprocessing import Normalizer
import numpy as np

Örnek veri (her satır bir örnek)

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

Normalizer örneği oluşturma (varsayılan L2 normu)

normalizer = Normalizer()

Veriyi dönüştürme

normalized_data = normalizer.fit_transform(data) print("Orijinal Veri:\n", data) print("Normalizer ile Dönüştürülmüş Veri:\n", normalized_data)

Her satırın L2 normunu kontrol edelim

print("Dönüştürülmüş Verinin Satır Normları:\n", np.linalg.norm(normalized_data, axis=1))

Çıktı:

Orijinal Veri:

[[1 2 3]

[4 5 6]

[7 8 9]]

Normalizer ile Dönüştürülmüş Veri:

[[0.26726124 0.53452248 0.80178373]

[0.45584231 0.56980289 0.68376346]

[0.40000000 0.45714286 0.51428571]]

Dönüştürülmüş Verinin Satır Normları:

[1. 1. 1.]

norm parametresi ile ‘l1’, ‘l2’ veya ‘max’ normlarını belirleyebilirsiniz.

Pratik Uygulama ve Kod Örnekleri

Şimdi, farklı normalizasyon yöntemlerinin veri üzerindeki etkisini görselleştirmek ve gerçek bir senaryoda nasıl kullanılacağını göstermek için daha kapsamlı bir örnek yapalım.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler, Normalizer
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split

1. Sentetik Veri Oluşturma

İki özellikli ve farklı ölçeklerde bir veri seti oluşturalım

X, _ = make_blobs(n_samples=100, centers=1, random_state=42, cluster_std=3.0)

Özellik 1'i küçük bir aralığa, Özellik 2'yi büyük bir aralığa taşıyalım

X[:, 0] = X[:, 0] * 2 + 5 # Örneğin yaş gibi X[:, 1] = X[:, 1] * 1000 + 10000 # Örneğin gelir gibi

Aykırı değer ekleyelim

X = np.append(X, [[50, 200000]], axis=0) # Aşırı yaş ve gelir X = np.append(X, [[-10, -5000]], axis=0) # Negatif yaş ve gelir (mantıksız ama ölçekleyiciyi test etmek için)

Eğitim ve Test Setlerine Ayırma (Veri Sızıntısını Önlemek İçin Önemli!)

X_train, X_test = train_test_split(X, test_size=0.3, random_state=42) print("Orijinal Eğitim Verisi Boyutu:", X_train.shape) print("Orijinal Test Verisi Boyutu:", X_test.shape) print("Orijinal Eğitim Verisi İlk 5 Satır:\n", X_train[:5])

2. Görselleştirme Fonksiyonu

def plot_data(original_data, scaled_data_dict, title_prefix=""): fig, axes = plt.subplots(1, len(scaled_data_dict) + 1, figsize=(20, 5)) # Orijinal Veri axes[0].scatter(original_data[:, 0], original_data[:, 1], alpha=0.7) axes[0].set_title(f"{title_prefix} Orijinal Veri") axes[0].set_xlabel("Özellik 1") axes[0].set_ylabel("Özellik 2") axes[0].set_xlim(np.min(X[:,0])-5, np.max(X[:,0])+5) axes[0].set_ylim(np.min(X[:,1])-1000, np.max(X[:,1])+1000) for i, (name, data) in enumerate(scaled_data_dict.items()): axes[i+1].scatter(data[:, 0], data[:, 1], alpha=0.7) axes[i+1].set_title(f"{title_prefix} {name}") axes[i+1].set_xlabel("Özellik 1") axes[i+1].set_ylabel("Özellik 2") # Ölçeklenmiş veriler için dinamik eksen sınırları ayarlayalım axes[i+1].set_xlim(np.min(data[:,0])-0.5, np.max(data[:,0])+0.5) axes[i+1].set_ylim(np.min(data[:,1])-0.5, np.max(data[:,1])+0.5) plt.tight_layout() plt.show()

3. Her Bir Ölçekleyiciyi Uygulama

MinMaxScaler

scaler_minmax = MinMaxScaler() X_train_minmax = scaler_minmax.fit_transform(X_train) X_test_minmax = scaler_minmax.transform(X_test) # Test verisi sadece transform edilir!

StandardScaler

scaler_standard = StandardScaler() X_train_standard = scaler_standard.fit_transform(X_train) X_test_standard = scaler_standard.transform(X_test)

RobustScaler

scaler_robust = RobustScaler() X_train_robust = scaler_robust.fit_transform(X_train) X_test_robust = scaler_robust.transform(X_test)

Normalizer (fit() metodu yoktur, doğrudan transform uygulanır)

Normalizer'ın diğerlerinden farklı çalıştığını unutmayın, satır bazında normalizasyon yapar.

Bu örnekte görselleştirmesi diğerleri gibi doğrudan karşılaştırılamaz,

çünkü Normalizer özelliklerin dağılımını sütun bazında değil, her bir örneğin kendi içindeki

özellik değerlerinin oranını değiştirir.

Bu nedenle Normalizer'ı bu görselleştirme karşılaştırmasından çıkaralım veya ayrı ele alalım.

X_train_normalized = Normalizer().fit_transform(X_train)

X_test_normalized = Normalizer().transform(X_test)

Görselleştirme için tüm ölçeklendirilmiş eğitim verilerini bir sözlüğe toplayalım

scaled_train_data_dict = { "MinMaxScaler": X_train_minmax, "StandardScaler": X_train_standard, "RobustScaler": X_train_robust } plot_data(X_train, scaled_train_data_dict, title_prefix="Eğitim Verisi -")

Test verisinin de dönüştürülmüş halini görselleştirelim (eğitimden öğrenilen scaler ile)

scaled_test_data_dict = { "MinMaxScaler": X_test_minmax, "StandardScaler": X_test_standard, "RobustScaler": X_test_robust } plot_data(X_test, scaled_test_data_dict, title_prefix="Test Verisi -")

Normalizer'ı ayrı bir örnekle gösterelim

Normalizer genellikle bir Pipeline içinde veya belirli bir adımda kullanılır.

Burada sadece transform edilmiş halini gösterebiliriz.

X_normalized_example = Normalizer().fit_transform(X[:5]) # İlk 5 örnek üzerinden print("\nNormalizer ile Dönüştürülmüş İlk 5 Örnek:\n", X_normalized_example)

Bu kod örneği, sentetik bir veri seti oluşturur, buna aykırı değerler ekler ve ardından MinMaxScaler, StandardScaler ve RobustScaler‘ı hem eğitim hem de test verilerine uygular. Görselleştirmeler, her bir ölçekleyicinin verinin dağılımını ve aralığını nasıl değiştirdiğini açıkça gösterir. Özellikle aykırı değerlerin MinMaxScaler ve StandardScaler üzerindeki etkisini, RobustScaler‘ın ise bu etkiyi nasıl daha iyi yönettiğini görebilirsiniz. Normalizer ise satır bazında çalıştığı için bu tür bir görselleştirmede diğerlerinden farklı bir etki gösterir.

### Hangi Normalizasyon Yöntemi Ne Zaman Kullanılmalı?

Doğru normalizasyon yöntemini seçmek, veri setinin özelliklerine ve kullanılacak makine öğrenimi algoritmasına bağlıdır. İşte genel bir rehber:

* MinMaxScaler (Min-Max Normalizasyonu):
* Ne Zaman: Verilerin belirli bir aralıkta (örn. [0, 1]) olmasının kesinlikle gerekli olduğu durumlarda (örn. görüntü işleme, yapay sinir ağlarının sigmoid veya tanh aktivasyon fonksiyonları kullanıldığı katmanları).
* Dikkat: Aykırı değerlere karşı çok hassastır. Aykırı değerler varsa, veriyi çok küçük bir aralığa sıkıştırabilir ve bilgi kaybına yol açabilir. Veri dağılımının bir Gauss dağılımına uymadığı durumlarda da kullanılabilir.

* StandardScaler (Z-Score Normalizasyonu):
* Ne Zaman: Çoğu makine öğrenimi algoritması için iyi bir başlangıç noktasıdır. Özellikle Lineer Regresyon, Lojistik Regresyon, SVM, PCA ve K-Means gibi algoritmalar için önerilir. Bu algoritmalar genellikle ortalama sıfır ve standart sapma bir olan verilere daha iyi yanıt verir.
* Dikkat: Aykırı değerlerden etkilenir (çünkü ortalama ve standart sapmayı kullanır). Ancak Min-Max’e göre daha az hassastır ve aykırı değerleri tamamen ezmez. Veri dağılımının yaklaşık olarak Gauss dağılımına benzediği durumlarda daha iyi performans gösterir.

* RobustScaler (Sağlam Ölçekleyici):
* Ne Zaman: Veri setinde bilinen veya şüphelenilen aykırı değerlerin çok olduğu durumlarda tercih edilmelidir. Medyan ve çeyreklik aralığı kullandığı için aykırı değerlere karşı çok daha dirençlidir.
* Dikkat: Veriyi belirli bir aralığa veya ortalama sıfır, standart sapma bir dağılıma dönüştürmez. Bu nedenle, belirli aralık gerektiren algoritmalar için ek işlem gerekebilir.

* Normalizer (Birime Normalizasyon):
* Ne Zaman: Her bir örneğin (satırın) vektör büyüklüğünün (normunun) önemli olmadığı, ancak vektörün yönünün veya özellikler arasındaki oranların önemli olduğu özel durumlarda kullanılır. Metin sınıflandırmasında TF-IDF vektörlerinin ön işlenmesi, veya kosinüs benzerliği kullanılan algoritmalar için idealdir.
* Dikkat: Özelliklerin dağılımını sütun bazında değiştirmez, sadece her bir örneği birim vektöre dönüştürür.

* Ne Zaman Normalizasyon Gerekli Değildir?:
* Ağaç Tabanlı Algoritmalar: Karar Ağaçları, Rastgele Ormanlar (Random Forests), Gradyan Yükseltme Makineleri (Gradient Boosting Machines – XGBoost, LightGBM) gibi algoritmalar, özelliklerin ölçeğine duyarlı değildir. Bu algoritmalar, özellik değerlerinin sıralamasına veya eşik değerlerine dayanır, bu nedenle normalizasyon genellikle performanslarını artırmaz ve hatta bazen gereksiz karmaşıklık ekleyebilir.

Özetle, başlangıçta StandardScaler çoğu durum için iyi bir seçimdir. Eğer veri setinizde belirgin aykırı değerler varsa RobustScaler‘ı deneyin. Eğer belirli bir aralıkta çıktıya ihtiyacınız varsa veya yapay sinir ağları kullanıyorsanız MinMaxScaler‘ı tercih edin. Normalizer ise çok spesifik kullanım durumları için ayrılmıştır.

Normalizasyonun Sınırlamaları ve Dikkat Edilmesi Gerekenler

Normalizasyon güçlü bir ön işleme tekniği olsa da, uygulanırken dikkat edilmesi gereken bazı önemli noktalar vardır:

Veri Sızıntısı (Data Leakage)

Bu, normalizasyonun en kritik hususlarından biridir. Makine öğrenimi modelinizin gerçek dünya performansını doğru bir şekilde tahmin etmek için, modelin eğitim verilerinden test verilerine “sızıntı” olmamasını sağlamak çok önemlidir. Normalizasyon bağlamında veri sızıntısı, test veri setindeki bilgilerin normalizasyon parametrelerini (ortalama, standart sapma, min, max vb.) öğrenmek için kullanılması durumunda meydana gelir.

Doğru Yaklaşım:
1. Veri setinizi eğitim (train) ve test (test) olarak ayırın.
2. Normalleştiriciyi (scaler) yalnızca eğitim verisi üzerinde fit() edin. Bu, normalleştiricinin parametreleri (örn. eğitim verisinin ortalaması ve standart sapması) eğitim verisinden öğrenmesini sağlar.
3. Öğrenilen normalleştiriciyi kullanarak hem eğitim hem de test verisini transform() edin. Test verisi üzerinde asla fit() çağırmayın.

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np

X = np.random.rand(100, 2) * 100 # Örnek veri
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)

scaler = StandardScaler()

DOĞRU: Sadece eğitim verisi üzerinde fit et ve transform et

X_train_scaled = scaler.fit_transform(X_train)

DOĞRU: Test verisini, eğitim verisinden öğrenilen scaler ile transform et

X_test_scaled = scaler.transform(X_test)

YANLIŞ: Test verisi üzerinde fit_transform çağırmak veri sızıntısına neden olur

scaler_wrong = StandardScaler()

X_test_scaled_wrong = scaler_wrong.fit_transform(X_test)

Test verisi üzerinde fit() çağırmak, modelin test verisinin dağılımı hakkında bilgi edinmesine neden olur ve bu da modelin genellenebilirlik performansını abartmasına yol açar.

Aykırı Değerlerin Etkisi

Daha önce de belirtildiği gibi, Min-Max ve Z-Score normalizasyonu aykırı değerlere karşı hassastır. Aykırı değerler, minimum/maksimum değerleri veya ortalama/standart sapmayı aşırı derecede etkileyerek, diğer “normal” verilerin çok dar bir aralığa sıkışmasına veya dağılımının bozulmasına neden olabilir. Eğer aykırı değerler veri setinizde önemli bir sorun teşkil ediyorsa, RobustScaler kullanmayı veya aykırı değerleri normalizasyondan önce ele almayı (örn. kırpma, dönüştürme) düşünmelisiniz.

Dağılımın Değişimi

Normalizasyon yöntemleri, verinin orijinal dağılımının şeklini koruyabilir (MinMaxScaler, StandardScaler) veya değiştirebilir (Normalizer). Bu, bazı analizler veya modelleme yaklaşımları için önemli olabilir. Örneğin, eğer bir model verinin normal dağılımını varsayıyorsa, StandardScaler bu varsayıma en uygun dönüştürmeyi sağlar. Ancak, normalizasyon veriyi gerçekten normal dağılıma dönüştürmez; sadece ortalamayı ve standart sapmayı ayarlar. Veriyi bir Gauss dağılımına daha yakın hale getirmek için logaritmik dönüşüm veya Box-Cox dönüşümü gibi diğer teknikler gerekebilir.

Her Zaman Gerekli mi?

Her makine öğrenimi projesinde normalizasyon yapmak zorunlu değildir. Karar ağaçları, rastgele ormanlar gibi ağaç tabanlı algoritmalar ve Naive Bayes gibi bazı algoritmalar, özelliklerin ölçeğine duyarlı değildir. Bu algoritmalar, özellik değerlerinin mutlak büyüklüklerinden ziyade sıralamalarına veya bölünme noktalarına odaklanır. Bu durumlarda normalizasyon yapmak, hesaplama maliyetini artırmaktan başka bir işe yaramayabilir. Ancak, şüpheniz varsa, normalizasyonun model performansını genellikle iyileştirdiğini veya en azından kötüleştirmediğini unutmayın.

Boru Hattı (Pipeline) Kullanımı

scikit-learn’in Pipeline özelliği, ön işleme adımlarını (normalizasyon dahil) ve makine öğrenimi modelini bir araya getirmenin en iyi yoludur. Bu, veri sızıntısını otomatik olarak önler ve kodunuzu daha düzenli ve yeniden kullanılabilir hale getirir.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

Örnek veri

X, y = make_classification(n_samples=1000, n_features=10, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Pipeline oluşturma

pipeline = Pipeline([ ('scaler', StandardScaler()), # İlk adım: StandardScaler ('classifier', LogisticRegression()) # İkinci adım: Lojistik Regresyon ])

Pipeline'ı eğitim verisi üzerinde fit etme

Bu, önce scaler'ı fit eder, sonra veriyi transform eder ve ardından sınıflandırıcıyı eğitir.

pipeline.fit(X_train, y_train)

Test verisi üzerinde tahmin yapma

Bu, önce scaler'ı (eğitimden öğrenilen parametrelerle) transform eder, sonra tahmin yapar.

y_pred = pipeline.predict(X_test) print("Pipeline ile Model Doğruluğu:", pipeline.score(X_test, y_test))

Bu Pipeline yaklaşımı, normalizasyonun yalnızca eğitim verisi üzerinde fit edilmesini ve test verisi üzerinde transform edilmesini otomatik olarak garanti eder, böylece veri sızıntısı riskini ortadan kaldırır.

Sonuç

Veri normalizasyonu, makine öğrenimi iş akışının vazgeçilmez bir parçasıdır ve model performansını önemli ölçüde etkileyebilir. scikit-learn kütüphanesi, farklı normalizasyon ihtiyaçlarına yönelik çeşitli güçlü ve kullanımı kolay araçlar sunar. MinMaxScaler, StandardScaler, RobustScaler ve Normalizer gibi yöntemler, veri setinizin özelliklerine ve kullandığınız makine öğrenimi algoritmasına bağlı olarak farklı senaryolarda avantajlar sunar.

Doğru normalizasyon yöntemini seçmek, verinizi anlamakla başlar: dağılımı nedir, aykırı değerler var mı ve hangi makine öğrenimi algoritmasını kullanmayı planlıyorsunuz? Her zaman veri sızıntısını önlemek için normalleştiriciyi yalnızca eğitim verisi üzerinde fit etmeyi ve ardından hem eğitim hem de test verilerini transform etmeyi unutmayın. scikit-learn’in Pipeline özelliği, bu süreci otomatikleştirmek ve kodunuzu daha sağlam hale getirmek için mükemmel bir yoldur.

Normalizasyon, bir “herkese uyan tek beden” çözümü değildir. Veri bilimcileri ve makine öğrenimi mühendisleri için, farklı yöntemleri denemek, sonuçları analiz etmek ve en uygun yaklaşımı bulmak önemlidir. Bu makalede sunulan bilgiler ve kod örnekleri, bu keşif yolculuğunuzda size sağlam bir başlangıç noktası sağlayacaktır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.