Hızla gelişen veri bilimi dünyasında Python, kendi kendine yerleşmiş bir lingua franca (ortak dil) haline gelmiştir. Bu ekosistemin kalbinde, makine öğrenimini demokratikleştiren sağlam ve açık kaynaklı bir kütüphane olan Scikit-learn (sıkça sklearn olarak kısaltılır) yer alır. Orta seviye ve ileri düzey geliştiriciler için temel eğitimlerin ötesine geçip Scikit-learn'in mimari nüanslarını anlamak, üretim seviyesinde öngörü modelleri oluşturmak açısından hayati önem taşır. Bu yazı, kütüphanenin kritik bileşenlerini, sıkı veri ön işlemeden sofistike topluluk yöntemlerine (ensemble methods) kadar kapsar ve potansiyelini tam olarak kullanmak için bir yol haritası sunar.
Tutarlılık Felsefesi
Scikit-learn'i TensorFlow veya PyTorch gibi diğer makine öğrenimi çerçevelerinden ayıran şey, tutarlı bir API'ye olan bağlılığıdır. PCA ile boyut indirgeme yapmanız, Destek Vektör Makinesi (SVM) eğitmeniz veya GridSearchCV ile hiperparametreleri ayarlamanız fark etmez; arayüz her zaman aynı kalır. Her tahminleyici (estimator), eğitim için bir fit yöntemi ve çıkarım için bir predict yöntemi uygular; birçokları ayrıca score ve transform yöntemlerini de destekler. Bu tasarım deseni, geliştiricilerin etrafındaki mantığı yeniden yazmadan bir boru hattı (pipeline) içinde algoritmaları kolayca değiştirmesine olanak tanır ve deneysel iş akışını önemli ölçüde hızlandırır.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
# Veriyi yükle
X, y = load_iris(return_X_y=True)
# Tutarlı bir API kullanarak modeli başlatın ve eğitin
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)
# Tahmin yapın
predictions = model.predict(X)
accuracy = model.score(X, y)
print(f"Doğruluk: {accuracy:.4f}")
Sıkı Veri Ön İşleme ve Boru Hatları
Makine öğrenimine yeni başlayan geliştiriciler için yaygın bir hata, test kümesinden gelen bilgilerin eğitim süreci üzerinde bilinçsizce etkide bulunmasıdır (veri sızıntısı). Scikit-learn, Pipeline sınıfı aracılığıyla bunu ele alır; bu sınıf veri ön işleme adımlarını ve nihai bir tahminleyiciyi birbirine zincirler. Bu, ölçeklendirme veya normalleştirme gibi dönüşümlerin yalnızca eğitim verisi üzerinde sıkı bir şekilde eğitilmesini ve ardından test verisine uygulanmasını sağlar, böylece değerlendirmenizin bütünlüğünü korur.
Ayrıca, eksik değerlerin ve kategorik değişkenlerin yönetimi için özel dönüştürücüler gereklidir. SimpleImputer eksik veri stratejilerini yönetirken, OneHotEncoder kategorik özellikleri makine tarafından okunabilir bir forma dönüştürür. Bunları tek bir boru hattına birleştirmek, kodunuzu temizlemenin yanı sıra joblib kullanarak modelinizin serialization (serileştirme) işlemini de basitleştirir.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
import pandas as pd
# Sayısal ve kategorik sütunlar için ön işleme tanımlayın
numerical_features = ['age', 'income']
categorical_features = ['city', 'job']
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
# Tam boru hattını oluşturun
clf = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', LogisticRegression(max_iter=1000))
])
# Boru hattı, imputer ve scaler'ı yalnızca eğitim verisi üzerinde eğitir
# clf.fit(X_train, y_train)
Model Değerlendirmesi ve Hiperparametre Ayarı
Bir model oluşturmak işin yarısıdır; performansını sıkı bir şekilde değerlendirmek de aynı derecede önemlidir. Scikit-learn, cross_val_score ve cross_validate gibi çapraz doğrulama için bir araç seti sunar; bu araçlar, sonuçları birden fazla katman üzerinde ortalamak suretiyle modelinizin görünmeyen verilere iyi bir şekilde genelleştiğinden emin olur. Tek bir eğitim-test bölünmesine güvenmek, aşırı iyimser veya kötümser performans tahminlerine yol açabilir.
Hiperparametre ayarı için kütüphane, GridSearchCV ve RandomizedSearchCV sunar. GridSearch parametre bir gridini kapsamlı bir şekilde ararken, RandomizedSearch, birçok hiperparametresi olan modeller için genellikle daha verimlidir ve sabit bir ayar sayısı örnekleme yapar. Bu tahminleyiciler, yalnızca en iyi parametreleri bulmakla kalmaz, aynı zamanda bulunan en iyi model hakkında metrikler de sağlar ve Scikit-learn ekosisteminin geri kalanıyla sorunsuz bir şekilde entegre olur.
from sklearn.model_selection import GridSearchCV, cross_val_score
param_grid = {
'classifier__C': [0.1, 1, 10],
'classifier__solver': ['liblinear', 'lbfgs']
}
grid_search = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
print(f"En iyi parametreler: {grid_search.best_params_}")
print(f"En iyi çapraz doğrulama skoru: {grid_search.best_score_:.4f}")
Sonuç
Scikit-learn, Python'daki klasik makine öğrenimi görevleri için endüstri standardı olmaya devam etmektedir. Tutarlılığı, ön işleme boru hatlarını sağlam şekilde yönetmesi ve değerlendirme için kapsamlı araçları sunması, güvenilir ve yorumlanabilir modeller oluşturmayı hedefleyen geliştiriciler için vazgeçilmez bir varlıktır. Boru hatları, dönüştürücüler ve tahminleyiciler arasındaki etkileşimi ustalıkla kullanarak hem verimli hem de tekrarlanabilir iş akışları oluşturabilirsiniz. Basit algoritmalar karmaşık topluluk yöntemlerine (ensembles) ilerledikçe, Scikit-learn'in gücünün yalnızca bireysel algoritmalarında değil, bunları hassasiyetle yönetmenizi sağlayan modüler mimarisinde yattığını unutmayın.