Scikit-Learn ile Lojistik Regresyonu Uzmanlaşma: Kapsamlı Bir Rehber
Giriş
Makine öğrenimi, günümüzün veri odaklı dünyasında karar verme süreçlerini otomatikleştirmek ve öngörülerde bulunmak için vazgeçilmez bir araç haline gelmiştir. Bu geniş alanın temel taşlarından biri de sınıflandırma algoritmalarıdır. Sınıflandırma, bir veri noktasının hangi kategoriye ait olduğunu tahmin etme görevidir. Örneğin, bir e-postanın spam olup olmadığı, bir müşterinin ürünü satın alıp almayacağı veya bir tümörün iyi huylu mu kötü huylu mu olduğu gibi ikili (binary) seçimler, sınıflandırma problemlerine güzel örneklerdir. İşte tam da bu noktada Lojistik Regresyon devreye girer. Adında “regresyon” kelimesi geçse de, Lojistik Regresyon aslında bir sınıflandırma algoritmasıdır ve özellikle ikili sınıflandırma görevleri için oldukça güçlü ve yorumlanabilir bir model sunar.
Bu makale, Lojistik Regresyon’un temel teorik prensiplerinden Scikit-Learn kütüphanesi ile nasıl uygulanacağına, modelin nasıl değerlendirileceğine ve performansının nasıl optimize edileceğine dair kapsamlı bir rehber sunmaktadır. Scikit-Learn, Python ekosistemindeki en popüler makine öğrenimi kütüphanelerinden biridir ve Lojistik Regresyon gibi birçok algoritmayı kolayca kullanmamızı sağlar. Bu rehberin sonunda, Lojistik Regresyon’u hem teorik hem de pratik düzeyde derinlemesine anlamış ve kendi veri setlerinizde etkili bir şekilde uygulayabilir hale gelmiş olacaksınız.
Temel Kavramlar ve Teorik Arka Plan
Lojistik Regresyon’u tam olarak anlamak için, altında yatan bazı temel matematiksel ve istatistiksel kavramları kavramak önemlidir.
Regresyon mu Sınıflandırma mı?
Adının aksine, Lojistik Regresyon bir sınıflandırma algoritmasıdır. Geleneksel Doğrusal Regresyon, sürekli bir çıktı değişkenini tahmin etmeye çalışırken (örneğin, ev fiyatları), Lojistik Regresyon, bir olayın gerçekleşme olasılığını tahmin eder ve bu olasılığı belirli bir eşik değeri üzerinden bir sınıf etiketi olarak yorumlar. Yani, çıktısı 0 ile 1 arasında bir olasılık değeri olup, bu değer daha sonra ikili bir sınıflandırma (örneğin, “evet” veya “hayır”) için kullanılır.
Sigmoid Fonksiyonu (Lojistik Fonksiyon)
Lojistik Regresyon’un kalbinde Sigmoid (veya Lojistik) fonksiyonu yer alır. Bu fonksiyon, herhangi bir gerçek sayıyı 0 ile 1 arasında bir olasılık değerine dönüştürür. Matematiksel olarak şu şekilde ifade edilir:
$h(z) = 1 / (1 + e^{-z})$
Burada $z$, bağımsız değişkenlerin doğrusal bir kombinasyonudur (tıpkı doğrusal regresyonda olduğu gibi): $z = b_0 + b_1x_1 + b_2x_2 + … + b_nx_n$. Sigmoid fonksiyonu, $z$ değeri ne kadar büyük olursa olsun, çıktıyı 1’e yaklaştırır; $z$ değeri ne kadar küçük olursa olsun, çıktıyı 0’a yaklaştırır. Bu özellik, onu olasılıkları modellemek için ideal kılar.
Karar Sınırı (Decision Boundary)
Sigmoid fonksiyonu bize bir olasılık değeri verir (örneğin, %70 bir olayın gerçekleşme olasılığı). Ancak sınıflandırma için bir sınıf etiketi (0 veya 1) elde etmemiz gerekir. Bu dönüşüm, bir karar sınırı (decision boundary) kullanılarak yapılır. Genellikle bu eşik değeri 0.5 olarak belirlenir. Eğer tahmin edilen olasılık 0.5’ten büyükse, model olayı pozitif sınıf olarak (örneğin, 1), 0.5’ten küçükse negatif sınıf olarak (örneğin, 0) sınıflandırır. Bu karar sınırı, özellik uzayında bir doğru, düzlem veya hiperdüzlem şeklinde olabilir. Lojistik Regresyon’un temel varsayımı, bu karar sınırının doğrusal olduğudur.
Maliyet Fonksiyonu (Cost Function)
Makine öğrenimi modelleri, tahminleri ile gerçek değerler arasındaki farkı en aza indirmek için bir maliyet fonksiyonunu optimize eder. Doğrusal regresyonda Ortalama Kare Hata (Mean Squared Error – MSE) kullanılırken, Lojistik Regresyon’da MSE uygun değildir çünkü Sigmoid fonksiyonunun doğrusal olmayan yapısı nedeniyle maliyet fonksiyonu dışbükey (convex) olmaz ve birden fazla yerel minimuma sahip olabilir. Bu durum, gradyan inişi gibi optimizasyon algoritmalarının küresel minimumu bulmasını zorlaştırır.
Bunun yerine, Lojistik Regresyon’da Çapraz Entropi (Cross-Entropy) veya Log Kaybı (Log Loss) adı verilen bir maliyet fonksiyonu kullanılır. Bu fonksiyon, modelin tahmin ettiği olasılık ile gerçek sınıf etiketi arasındaki farkı ölçer ve dışbükeydir, bu da küresel minimumun kolayca bulunabileceği anlamına gelir.
$J(\theta) = -1/m \sum_{i=1}^{m} [y^{(i)} \log(h_{\theta}(x^{(i)})) + (1 – y^{(i)}) \log(1 – h_{\theta}(x^{(i)}))]$
Burada $y^{(i)}$ gerçek sınıf etiketi, $h_{\theta}(x^{(i)})$ ise modelin tahmin ettiği olasılıktır. Amaç, bu maliyet fonksiyonunu minimize etmektir.
Gradyan İnişi (Gradient Descent)
Maliyet fonksiyonunu minimize etmek için Gradyan İnişi algoritması kullanılır. Bu algoritma, maliyet fonksiyonunun parametrelere göre kısmi türevlerini (gradyanlarını) hesaplayarak, parametreleri maliyetin en hızlı azaldığı yönde iteratif olarak günceller. Her adımda, parametreler (katsayılar ve sabit terim) güncellenir ve bu işlem maliyet fonksiyonu minimuma ulaşana veya belirli bir iterasyon sayısına ulaşana kadar devam eder.
Scikit-Learn ile Lojistik Regresyon Uygulaması
Scikit-Learn, Lojistik Regresyon’u uygulamak için son derece basit ve güçlü bir arayüz sunar. İşte adım adım uygulama süreci:
Veri Seti Hazırlığı
Her makine öğrenimi projesinin ilk adımı veri hazırlığıdır. Bu, veriyi yüklemeyi, temizlemeyi, ön işlemeyi ve eğitim ile test setlerine ayırmayı içerir.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_breast_cancer # Örnek bir veri seti
Veri setini yükle
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)
Veriyi eğitim ve test setlerine ayır
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
Özellik ölçeklendirme (Gradient Descent tabanlı algoritmalar için önemlidir)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
Bu adımda, load_breast_cancer veri setini kullandık. Bu veri seti, göğüs kanseri teşhisi için kullanılan çeşitli özelliklere ve iki sınıfa (iyi huylu veya kötü huylu) sahiptir. train_test_split ile veriyi %70 eğitim, %30 test olarak ayırdık ve stratify=y parametresi ile sınıfların dağılımının hem eğitim hem de test setlerinde korunmasını sağladık. StandardScaler ile özellikleri standartlaştırdık, bu da gradyan inişi tabanlı algoritmaların daha hızlı ve kararlı bir şekilde yakınsamasını sağlar.
Model Oluşturma ve Eğitme
Veri hazırlandıktan sonra, Lojistik Regresyon modelini oluşturmak ve eğitmek oldukça basittir.
from sklearn.linear_model import LogisticRegression
Modeli oluştur
model = LogisticRegression(random_state=42)
Modeli eğitim verisiyle eğit
model.fit(X_train_scaled, y_train)
LogisticRegression sınıfını sklearn.linear_model modülünden import ettik. random_state parametresi, modelin eğitim sürecindeki rastgelelikleri kontrol ederek sonuçların tekrarlanabilir olmasını sağlar. fit() metodu, modelin eğitim verileri üzerinde öğrenmesini sağlar.
Tahmin Yapma
Eğitilmiş model ile test verileri üzerinde tahminler yapabiliriz.
# Sınıf etiketlerini tahmin et
y_pred = model.predict(X_test_scaled)
Olasılıkları tahmin et (her sınıf için)
y_pred_proba = model.predict_proba(X_test_scaled)
predict() metodu, her bir test örneği için doğrudan sınıf etiketini (0 veya 1) döndürür. predict_proba() metodu ise, her bir test örneği için her sınıfın olasılıklarını içeren bir dizi döndürür. Bu olasılıklar, modelin tahminlerine olan güvenini anlamak ve ROC eğrisi gibi değerlendirme metrikleri için önemlidir.
Model Değerlendirme Metrikleri
Bir sınıflandırma modelinin performansını değerlendirmek için sadece doğruluk (accuracy) yeterli değildir. Özellikle dengesiz veri kümelerinde (bir sınıfın diğerine göre çok daha fazla örneğe sahip olduğu durumlar), daha detaylı metrikler kullanmak gerekir.
Sınıflandırma Metriklerine Giriş
Sınıflandırma modellerini değerlendirirken, modelin hem pozitif hem de negatif sınıfları ne kadar iyi tahmin ettiğini anlamak kritik öneme sahiptir.
Doğruluk (Accuracy)
Doğruluk, doğru tahmin edilen örneklerin toplam örnek sayısına oranıdır.
$Accuracy = (Doğru Pozitifler + Doğru Negatifler) / Toplam Örnek Sayısı$
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f"Doğruluk (Accuracy): {accuracy:.4f}")
Karmaşıklık Matrisi (Confusion Matrix)
Karmaşıklık matrisi, bir sınıflandırma modelinin performansını görselleştiren ve analiz eden temel bir araçtır. Dört ana bileşeni vardır:
* Doğru Pozitifler (True Positives – TP): Gerçekte pozitif olan ve modelin pozitif olarak tahmin ettiği örnekler.
* Doğru Negatifler (True Negatives – TN): Gerçekte negatif olan ve modelin negatif olarak tahmin ettiği örnekler.
* Yanlış Pozitifler (False Positives – FP): Gerçekte negatif olan ancak modelin pozitif olarak tahmin ettiği örnekler (Tip I hata).
* Yanlış Negatifler (False Negatives – FN): Gerçekte pozitif olan ancak modelin negatif olarak tahmin ettiği örnekler (Tip II hata).
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print("Karmaşıklık Matrisi:\n", cm)
Kesinlik (Precision), Duyarlılık (Recall), F1-Skor
Bu metrikler, karmaşıklık matrisinden türetilir ve modelin farklı yönlerini ölçer:
* Kesinlik (Precision): Modelin pozitif olarak tahmin ettiği örneklerin ne kadarının gerçekten pozitif olduğunu gösterir. Yanlış pozitiflerin maliyetinin yüksek olduğu durumlarda önemlidir (örneğin, spam olmayan bir e-postayı spam olarak işaretlemek).
$Precision = TP / (TP + FP)$
* Duyarlılık (Recall) / Hassasiyet (Sensitivity): Gerçekte pozitif olan tüm örneklerin ne kadarının model tarafından doğru bir şekilde pozitif olarak tanımlandığını gösterir. Yanlış negatiflerin maliyetinin yüksek olduğu durumlarda önemlidir (örneğin, kanserli bir hastayı sağlıklı olarak teşhis etmek).
$Recall = TP / (TP + FN)$
* F1-Skor: Kesinlik ve Duyarlılık’ın harmonik ortalamasıdır. Her ikisinin de dengeli bir şekilde iyi olduğu durumlarda tercih edilir. Özellikle dengesiz veri setlerinde doğruluktan daha iyi bir ölçüt olabilir.
$F1-Score = 2 (Precision Recall) / (Precision + Recall)$
from sklearn.metrics import classification_report
print("\nSınıflandırma Raporu:\n", classification_report(y_test, y_pred))
classification_report fonksiyonu, bu metrikleri her sınıf için ve ortalama olarak özetleyen kapsamlı bir rapor sunar.
ROC Eğrisi ve AUC
ROC (Receiver Operating Characteristic) eğrisi, bir sınıflandırıcının farklı karar eşiklerinde performansını gösteren bir grafiktir. X ekseninde Yanlış Pozitif Oranı (False Positive Rate – FPR), Y ekseninde Doğru Pozitif Oranı (True Positive Rate – TPR) bulunur.
* TPR (Duyarlılık): $TP / (TP + FN)$
* FPR: $FP / (FP + TN)$
AUC (Area Under the Curve), ROC eğrisinin altında kalan alandır. AUC değeri 0 ile 1 arasında değişir. 1’e yakın bir AUC, modelin sınıfları çok iyi ayırdığını gösterir. 0.5’lik bir AUC ise rastgele bir tahminciye eşdeğerdir. AUC, modelin sınıflandırma eşiğinden bağımsız olarak genel performansını değerlendirmek için harika bir metriktir.
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
Pozitif sınıf için olasılıkları al (ikinci sütun)
y_proba_positive = y_pred_proba[:, 1]
ROC eğrisi noktalarını hesapla
fpr, tpr, thresholds = roc_curve(y_test, y_proba_positive)
AUC değerini hesapla
roc_auc = roc_auc_score(y_test, y_proba_positive)
print(f"ROC AUC Skoru: {roc_auc:.4f}")
ROC eğrisini çiz
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Yanlış Pozitif Oranı (False Positive Rate)')
plt.ylabel('Doğru Pozitif Oranı (True Positive Rate)')
plt.title('Alıcı Çalışma Karakteristiği (ROC) Eğrisi')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()
Hiperparametre Ayarı ve Model Optimizasyonu
Lojistik Regresyon modelinin performansını daha da artırmak için hiperparametrelerini ayarlamak önemlidir. Scikit-Learn’deki LogisticRegression sınıfı birçok ayarlanabilir hiperparametreye sahiptir.
Regülarizasyon (Regularization)
Regülarizasyon, modelin aşırı öğrenmesini (overfitting) önlemek için kullanılan bir tekniktir. Aşırı öğrenme, modelin eğitim verilerini çok iyi öğrenmesi ancak yeni, bilinmeyen verilere genelleme yapamaması durumudur. Lojistik Regresyon’da iki ana regülarizasyon türü vardır:
* L1 Regülarizasyon (Lasso): Modelin katsayılarını sıfıra doğru iter. Bu, bazı önemsiz özelliklerin katsayılarını tamamen sıfır yaparak özellik seçimi yapma özelliğine sahiptir.
* L2 Regülarizasyon (Ridge): Katsayı değerlerini küçültür ancak nadiren tam olarak sıfır yapar. Daha karmaşık modellerin katsayılarını küçülterek aşırı öğrenmeyi azaltır.
Scikit-Learn’deki LogisticRegression sınıfında penalty parametresi ile l1, l2, elasticnet veya none (regülarizasyon yok) seçeneklerini belirleyebilirsiniz. C parametresi ise regülarizasyon gücünün tersidir. Daha küçük bir C değeri, daha güçlü regülarizasyon anlamına gelir. Genellikle C için 0.01, 0.1, 1, 10, 100 gibi değerler denenir.
# L2 regülarizasyon (varsayılan) ile C değerini değiştirme
model_l2 = LogisticRegression(penalty='l2', C=0.1, random_state=42)
model_l2.fit(X_train_scaled, y_train)
L1 regülarizasyon (solver='liblinear' veya 'saga' ile kullanılır)
model_l1 = LogisticRegression(penalty='l1', C=1.0, solver='liblinear', random_state=42)
model_l1.fit(X_train_scaled, y_train)
Çözücü Algoritmalar (Solvers)
LogisticRegression sınıfı, maliyet fonksiyonunu minimize etmek için farklı optimizasyon algoritmaları (çözücüler) kullanabilir. Her çözücünün farklı avantajları ve dezavantajları vardır ve belirli penalty türleriyle uyumludur:
* 'liblinear': Küçük veri setleri için iyidir, hem L1 hem de L2 regülarizasyonu destekler.
* 'newton-cg', 'lbfgs', 'sag', 'saga': Büyük veri setleri için daha hızlı olabilirler.
* 'lbfgs' varsayılan çözücüdür ve genellikle iyi performans gösterir. Yalnızca L2 regülarizasyonunu destekler.
* 'newton-cg' ve 'sag' de yalnızca L2 regülarizasyonunu destekler.
* 'saga' hem L1 hem de L2 regülarizasyonunu destekler ve büyük veri setleri için uygundur.
Doğru çözücüyü seçmek, modelin yakınsama hızını ve doğruluğunu etkileyebilir.
# Farklı bir çözücü kullanma
model_saga = LogisticRegression(penalty='elasticnet', solver='saga', l1_ratio=0.5, random_state=42)
'elasticnet' için 'l1_ratio' parametresi de ayarlanmalıdır.
model_saga.fit(X_train_scaled, y_train)
Çoklu Sınıflandırma (Multinomial Classification)
Lojistik Regresyon, doğası gereği ikili sınıflandırma için tasarlanmıştır. Ancak birden fazla sınıf etiketine sahip veri kümeleri için de kullanılabilir. Scikit-Learn’de bu durum multi_class parametresi ile yönetilir:
* 'ovr' (One-vs-Rest): Her sınıf için diğer tüm sınıflara karşı ikili bir sınıflandırıcı eğitilir. Bu, varsayılan davranıştır ve genellikle iyi çalışır.
* 'multinomial': Doğrudan çok sınıflı bir maliyet fonksiyonunu minimize eder. Bu, daha “gerçek” bir çok sınıflı Lojistik Regresyon yaklaşımıdır ancak 'lbfgs', 'sag', 'saga', 'newton-cg' gibi çözücüler gerektirir.
Hiperparametre Optimizasyonu
En iyi hiperparametre kombinasyonunu manuel olarak bulmak zordur. Scikit-Learn, bu süreci otomatikleştirmek için GridSearchCV ve RandomizedSearchCV gibi araçlar sunar.
* GridSearchCV: Belirtilen tüm hiperparametre kombinasyonlarını dener ve çapraz doğrulama kullanarak en iyi kombinasyonu bulur. Kapsamlıdır ancak çok sayıda parametre ve değer varsa zaman alıcı olabilir.
* RandomizedSearchCV: Belirtilen aralıklardan rastgele örneklenmiş hiperparametre kombinasyonlarını dener. Daha az hesaplama maliyetiyle iyi sonuçlar bulabilir.
from sklearn.model_selection import GridSearchCV
Denenecek hiperparametreler
param_grid = {
'C': [0.001, 0.01, 0.1, 1, 10, 100],
'penalty': ['l1', 'l2'],
'solver': ['liblinear', 'saga'] # L1 ve L2'yi destekleyen çözücüler
}
GridSearchCV'yi oluştur
grid_search = GridSearchCV(LogisticRegression(random_state=42), param_grid, cv=5, scoring='roc_auc', n_jobs=-1)
Eğitim verisi üzerinde çalıştır
grid_search.fit(X_train_scaled, y_train)
En iyi parametreleri ve skoru yazdır
print("\nEn iyi parametreler:", grid_search.best_params_)
print("En iyi ROC AUC skoru:", grid_search.best_score_)
En iyi modeli al
best_model = grid_search.best_estimator_
cv=5 5 katlı çapraz doğrulama yapılacağını belirtir. scoring='roc_auc' ise modelleri AUC skoruna göre değerlendireceğimizi ifade eder. n_jobs=-1 tüm işlemci çekirdeklerini kullanır.
Gelişmiş Konular ve En İyi Uygulamalar
Lojistik Regresyon’u daha etkili kullanmak ve performansını artırmak için bazı gelişmiş konular ve en iyi uygulamalar göz önünde bulundurulmalıdır.
Ölçeklendirme (Feature Scaling)
Gradyan inişi tabanlı algoritmalar (Lojistik Regresyon gibi), özelliklerin farklı ölçeklerde olması durumunda daha yavaş yakınsayabilir veya optimum çözüme ulaşamayabilir. Bu nedenle, StandardScaler veya MinMaxScaler gibi yöntemlerle özellikleri ölçeklendirmek kritik öneme sahiptir. Bu, tüm özelliklerin benzer bir aralıkta olmasını sağlayarak optimizasyon sürecini hızlandırır ve modelin performansını artırır.
Özellik Mühendisliği (Feature Engineering)
Modelin performansını artırmanın en etkili yollarından biri özellik mühendisliğidir. Bu, mevcut özelliklerden yeni, daha anlamlı özellikler oluşturmayı içerir. Örneğin:
Polinom Özellikler: Doğrusal olmayan ilişkileri yakalamak için mevcut özelliklerin kuvvetlerini (örn. $x^2$, $x^3$) veya etkileşim terimlerini (örn. $x_1 x_2$) eklemek. sklearn.preprocessing.PolynomialFeatures bu konuda yardımcı olabilir.
* Kategorik Özelliklerin Dönüştürülmesi: Tek sıcak kodlama (One-Hot Encoding) veya etiket kodlama (Label Encoding) gibi yöntemlerle kategorik verileri sayısal verilere dönüştürmek.
Dengesiz Veri Kümeleriyle Başa Çıkma
Bir sınıfın diğerine göre çok daha az örneğe sahip olduğu dengesiz veri kümeleri, Lojistik Regresyon gibi sınıflandırma modellerinin performansını olumsuz etkileyebilir. Model, çoğunluk sınıfına eğilim gösterebilir ve azınlık sınıfını doğru tahmin etmekte zorlanabilir. Bu durumu ele almak için çeşitli teknikler mevcuttur:
* Sınıf Ağırlıkları (class_weight): Scikit-Learn’deki LogisticRegression sınıfının class_weight='balanced' parametresi, modelin eğitim sırasında azınlık sınıfına daha fazla ağırlık vermesini sağlar. Bu, maliyet fonksiyonunun azınlık sınıfındaki hatalara daha fazla ceza vermesine neden olur.
* Yeniden Örnekleme (Resampling):
* Aşırı Örnekleme (Oversampling): Azınlık sınıfının örneklerini çoğaltmak (örneğin, SMOTE – Synthetic Minority Over-sampling Technique).
* Az Örnekleme (Undersampling): Çoğunluk sınıfının örneklerini azaltmak.
* Farklı Metrikler Kullanma: Doğruluk yerine Kesinlik, Duyarlılık, F1-Skor veya AUC gibi metrikleri kullanarak model performansını değerlendirmek.
Modelin Yorumlanabilirliği
Lojistik Regresyon’un en büyük avantajlarından biri yorumlanabilirliğidir. model.coef_ ve model.intercept_ nitelikleri, her bir özelliğin hedef değişken üzerindeki etkisini gösterir:
* model.coef_: Her bir özelliğin katsayısıdır. Pozitif bir katsayı, o özelliğin değerindeki artışın pozitif sınıf olasılığını artırdığını, negatif bir katsayı ise azalttığını gösterir.
* model.intercept_: Sabit terimdir.
Bu katsayılar, modelin hangi özelliklere daha fazla önem verdiğini ve bu özelliklerin tahminler üzerindeki yönünü anlamamızı sağlar. Örneğin, bir tıbbi teşhis modelinde, belirli bir biyobelirtecin pozitif katsayısı, o biyobelirtecin yüksek değerlerinin hastalığın varlığı olasılığını artırdığını gösterebilir.
Pratik Bir Uygulama Örneği
Şimdiye kadar ele aldığımız tüm adımları bir araya getiren basit bir uygulama örneği üzerinden geçelim. Meme Kanseri veri setini kullanarak Lojistik Regresyon modelini kurup değerlendireceğiz.
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, roc_auc_score, roc_curve
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
1. Veri Yükleme
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)
print("Veri Seti Boyutu:", X.shape)
print("Hedef Sınıf Dağılımı:\n", y.value_counts())
2. Veriyi Eğitim ve Test Setlerine Ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
3. Özellik Ölçeklendirme
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
4. Model Oluşturma ve Eğitme (Başlangıç Modeli)
initial_model = LogisticRegression(random_state=42)
initial_model.fit(X_train_scaled, y_train)
5. Başlangıç Modelini Değerlendirme
y_pred_initial = initial_model.predict(X_test_scaled)
y_proba_initial = initial_model.predict_proba(X_test_scaled)[:, 1]
print("\n--- Başlangıç Modeli Değerlendirmesi ---")
print(f"Doğruluk (Accuracy): {accuracy_score(y_test, y_pred_initial):.4f}")
print("Sınıflandırma Raporu:\n", classification_report(y_test, y_pred_initial))
print(f"ROC AUC Skoru: {roc_auc_score(y_test, y_proba_initial):.4f}")
6. Hiperparametre Optimizasyonu (GridSearchCV)
param_grid = {
'C': [0.01, 0.1, 1, 10, 100],
'penalty': ['l2'], # Sadece L2 regülarizasyonunu deneyeceğiz
'solver': ['lbfgs', 'liblinear'] # L2 ile uyumlu çözücüler
}
grid_search = GridSearchCV(LogisticRegression(random_state=42, class_weight='balanced'),
param_grid, cv=5, scoring='roc_auc', n_jobs=-1)
grid_search.fit(X_train_scaled, y_train)
print("\n--- Hiperparametre Optimizasyonu Sonuçları ---")
print("En iyi parametreler:", grid_search.best_params_)
print("En iyi ROC AUC skoru (Çapraz Doğrulama):", grid_search.best_score_:.4f)
7. En İyi Modeli Değerlendirme
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test_scaled)
y_proba_best = best_model.predict_proba(X_test_scaled)[:, 1]
print("\n--- En İyi Modelin Test Seti Üzerindeki Değerlendirmesi ---")
print(f"Doğruluk (Accuracy): {accuracy_score(y_test, y_pred_best):.4f}")
print("Sınıflandırma Raporu:\n", classification_report(y_test, y_pred_best))
print(f"ROC AUC Skoru: {roc_auc_score(y_test, y_proba_best):.4f}")
8. ROC Eğrisi Çizimi
fpr_best, tpr_best, _ = roc_curve(y_test, y_proba_best)
plt.figure(figsize=(8, 6))
plt.plot(fpr_best, tpr_best, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc_score(y_test, y_proba_best):.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Yanlış Pozitif Oranı (False Positive Rate)')
plt.ylabel('Doğru Pozitif Oranı (True Positive Rate)')
plt.title('En İyi Model İçin ROC Eğrisi')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()
9. Model Katsayılarını Yorumlama
print("\n--- Model Katsayıları ---")
coefficients = pd.DataFrame({'Feature': X.columns, 'Coefficient': best_model.coef_[0]})
print(coefficients.sort_values(by='Coefficient', ascending=False))
print(f"Sabit Terim (Intercept): {best_model.intercept_[0]:.4f}")
Bu örnek kod, veri yüklemeden hiperparametre optimizasyonuna ve model yorumlamaya kadar Lojistik Regresyon’un tüm temel adımlarını göstermektedir. Özellikle class_weight='balanced' parametresinin kullanımı, dengesiz veri setlerinde modelin azınlık sınıfına daha fazla odaklanmasını sağlamak için önemlidir.
Sonuç ve İleri Adımlar
Lojistik Regresyon, basitliği, hızı ve yorumlanabilirliği sayesinde makine öğreniminde en sık kullanılan sınıflandırma algoritmalarından biridir. Özellikle ikili sınıflandırma görevlerinde güçlü bir başlangıç noktası sunar. Scikit-Learn kütüphanesi, bu algoritmayı Python ortamında kolayca uygulamanıza, değerlendirmenize ve optimize etmenize olanak tanır.
Bu rehberde, Lojistik Regresyon’un teorik temellerini, Sigmoid fonksiyonu, maliyet fonksiyonu ve gradyan inişi gibi kavramları inceledik. Ardından, Scikit-Learn kullanarak bir modeli nasıl eğiteceğimizi, tahminler yapacağımızı ve doğruluk, kesinlik, duyarlılık, F1-Skor, karmaşıklık matrisi, ROC eğrisi ve AUC gibi çeşitli metriklerle nasıl değerlendireceğimizi öğrendik. Son olarak, regülarizasyon, çözücüler ve hiperparametre optimizasyonu (GridSearchCV) gibi tekniklerle model performansını nasıl artıracağımızı ve özellik ölçeklendirme, özellik mühendisliği ve dengesiz veri kümeleriyle başa çıkma gibi en iyi uygulamaları tartıştık.
Lojistik Regresyon’da ustalaşmak, makine öğrenimi yolculuğunuzda önemli bir adımdır. Ancak bu sadece başlangıçtır. Bilginizi derinleştirmek için aşağıdaki konuları araştırmayı düşünebilirsiniz:
* Daha Gelişmiş Sınıflandırma Algoritmaları: Destek Vektör Makineleri (SVM), Karar Ağaçları, Rastgele Ormanlar (Random Forests), Gradyan Artırımı (Gradient Boosting) algoritmaları (XGBoost, LightGBM) gibi modelleri keşfedin.
* Derin Öğrenme (Deep Learning): Karmaşık, doğrusal olmayan ilişkileri modellemek için sinir ağları ve derin öğrenme çerçevelerini (TensorFlow, PyTorch) inceleyin.
* Pipeline ve FeatureUnion: Scikit-Learn’deki bu araçları kullanarak veri ön işleme ve modelleme adımlarını birleştirin ve daha düzenli, tekrarlanabilir iş akışları oluşturun.
* Model Seçimi ve Çapraz Doğrulama: Farklı modelleri karşılaştırmak ve genellenebilirliklerini artırmak için çapraz doğrulama tekniklerini daha derinlemesine öğrenin.
Lojistik Regresyon, birçok gerçek dünya problemine uygulanabilir ve sağlam bir temel sağlar. Bu rehberdeki bilgileri kullanarak, kendi veri setlerinizde güvenle Lojistik Regresyon modelleri geliştirebilir ve etkili tahminler yapabilirsiniz.