Python'un geniş veri bilimi ekosisteminde Scikit-learn, klasik makine öğrenimi için tartışmasız lider olmaya devam ediyor. PyTorch ve TensorFlow gibi derin öğrenme framework'leri sinir ağları için manşetleri ele geçirse de, Scikit-learn regresyon, sınıflandırma, kümeleme ve boyut azaltma için temel araçları sağlar. Orta ve ileri düzey geliştiriciler için temel eğitimlerin ötesine geçerek sağlam, sürdürülebilir makine öğrenimi boru hatları (pipeline) oluşturmak, kütüphanenin mimarisine dair derin bir anlayış gerektirir.
Bu yazı, Scikit-learn'ün standartlaştırılmış API'sinden yararlanarak tekrarlanabilir ve ölçeklenebilir makine öğrenimi sistemleri nasıl kurulacağını inceler.
Birleşik API Felsefesi
Scikit-learn'ün temel gücü, tutarlı API tasarımında yatar. Algoritma ne olursa olsun; Destek Vektör Makinesi (SVM), Rastgele Orman veya K-Means kümeleme olsun, arayüz aynı kalır. Bu tutarlılık, geliştiricilerin minimum kod değişikliğiyle algoritmaları değiştirmesini sağlar ve hızlı prototipleme ile deneyimlemeyi kolaylaştırır.
Temel yapı üç ana yöntem etrafında şekillenir:
1.
fit(X, y): Modeli veriler üzerinde eğitir.
2.
predict(X): Yeni veriler için tahminler üretir.
3.
transform(X): Veriler üzerinde bir dönüşüm uygular (ön işlemede yaygındır).
Bu desene uyarak, kodunuzun okunabilir ve daha büyük sistemlere kolayca entegre edilebilir olduğundan emin olursunuz.
Dönüştürücülerle Sağlam Veri Ön İşleme
Gerçek dünya verileri nadiren temizdir. Verileri herhangi bir tahminleyiciye (estimator) beslemeden önce ön işleme kritiktir. Scikit-learn, ölçeklendirme, kodlama ve eksik veri doldurma işlemlerini yöneten bir dizi dönüştürücü sunar. Yeni başlayanlar için yaygın bir hata, veriyi bölmeden önce ölçeklendirme uygulamaktır; bu da veri sızıntısına (data leakage) yol açar.
Bunu önlemek için ön işleme adımlarımızı kapsüllemeliyiz. Aşağıda, sayısal ve kategorik özellikleri aynı anda işlemek için
ColumnTransformer kullanan bir örnek bulunmaktadır. Bu yaklaşım, dönüşümlerin hem eğitim hem de test kümelerine tutarlı bir şekilde uygulanmasını sağlar.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
# Sütunları tanımla
numeric_features = ['age', 'income']
categorical_features = ['gender', 'city']
# Dönüştürücüleri tanımla
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Dönüştürücüleri birleştir
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
Pipeline'lar ile İş Akışını Basitleştirme
Ön işleme tanımlandıktan sonra bir sonraki adım, onu modelle entegre etmektir. Scikit-learn'ün
Pipeline nesnesi bu konuda vazgeçilmezdir. Ön işleme adımlarını ve son tahminleyiciyi tek bir nesne içinde birbirine zincirler.
Pipeline'lar üç büyük avantaj sunar:
1. **Kod Kısalığı**: Ara değişkenlere duyulan ihtiyacı azaltır.
2. **Güvenlik**: Çapraz doğrulama sırasında dönüştürücülerin yalnızca eğitim verisine uygun şekilde oturmasını sağlayarak veri sızıntısını önler.
3. **Dağıtım (Deployment)**: Tüm iş akışı tek bir nesne içinde paketlendiği için modelleri kaydetmeyi ve yüklemeyi basitleştirir.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# X ve y'nin tanımlandığı varsayılıyor
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Tam pipeline'ı oluştur
model_pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])
# Eğit ve tahmin yap
model_pipeline.fit(X_train, y_train)
predictions = model_pipeline.predict(X_test)
print(f"Doğruluk: {accuracy_score(y_test, predictions):.2f}")
Hiperparametre Ayarı ve Doğrulama
Performansı en üst düzeye çıkarmak için hiperparametre ayarı şarttır. Scikit-learn, bu işlemi otomatikleştirmek için
GridSearchCV ve
RandomizedSearchCV sağlar. Pipeline'larla çalışırken, çift alt çizgiler
__ kullanarak pipeline yapısını gezinerek hem ön işleme adımlarındaki hem de modeldeki parametreleri ayarlayabilirsiniz.
from sklearn.model_selection import GridSearchCV
param_grid = [
{
'classifier__n_estimators': [50, 100],
'classifier__max_depth': [None, 10]
}
]
grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)
print(f"En İyi Parametreler: {grid_search.best_params_}")
Sonuç
Scikit-learn, yalnızca bir algoritma koleksiyonundan fazlasıdır; güvenilir makine öğrenimi iş akışları oluşturmak için bir çerçevedir.
Pipeline,
ColumnTransformer ve uygun çapraz doğrulama stratejilerinden yararlanarak geliştiriciler, yalnızca doğru olmakla kalmayan, aynı zamanda tekrarlanabilir ve üretim hazır modeller oluşturabilirler. ML mühendisliği becerilerini pekiştirmek isteyenler için bu araçları ustalıkla kullanmak, veri keşfinden dağıtıma doğru olan yolculukta kritik bir sonraki adımdır.