Sınıflandırma
Classification
Bir girdiyi sonlu sayıda etiketten birine atayan denetimli öğrenme problemi — örneğin 'spam mı, değil mi'.
Sınıflandırma, denetimli öğrenmenin iki ana ailesinden biridir. Modelden istenen şey, gördüğü her örnek için önceden tanımlı bir kategori kümesinden bir etiket seçmesidir. Etiket sayısına göre üç tip vardır: ikili sınıflandırma (spam/ham, kanserli/sağlıklı), çok sınıflı sınıflandırma (köpek/kedi/kuş/balık) ve çok etiketli sınıflandırma (bir film hem aksiyon hem komedi olabilir).
Çıktı genellikle ham bir etiket değil, her sınıf için bir olasılık dağılımıdır. Model "%87 spam, %13 ham" der, sen bir eşik (threshold) belirleyerek karara dönüştürürsün. Eşik, problem maliyetine göre hareket eder: yanlış pozitiflerin pahalı olduğu kanser teşhisinde eşik yüksek tutulur, kaçırılan dolandırıcılığın pahalı olduğu finansal modelde eşik düşürülür.
Doğru sınıflandırma çok eski bir problem; lojistik regresyon, karar ağaçları, destek vektör makineleri, k-NN ve sinir ağları hepsi bu aileyi çözer. Modeli seçerken veri büyüklüğü, açıklanabilirlik ihtiyacı, sınıf dengesizliği gibi faktörler belirleyici olur.
Posta odasında çalışan bir görevli düşün. Her zarfa bakar ve onu doğru bölmeye atar: "Pazarlama", "Fatura", "Önemli", "Çöp". Yıllarca önce öğrendiği örüntülerle, hiç düşünmeden saniyede onlarca zarf yönlendirir. Bazen tereddüt eder; o anda ihtimalleri tartar — bu senin modelin "olasılık dağılımı" üretmesidir. Eşik kararını görevlinin tedbiri verir: emin değilse "Önemli"ye atar, çünkü yanlış atılmasının maliyeti yüksektir.
Bir online haber sitesi yorum bölümündeki nefret söylemini otomatik yakalamak istiyor. Editörler 50.000 yorumu elle etiketlemiş: "temiz", "küfür", "nefret söylemi". Bu, üç sınıflı bir sınıflandırma problemi.
Eğitilen model her yeni yorum için üç olasılık çıktı verir. Eşik yöneticisi karar verir: "küfür" %40'ın üstüne çıkarsa moderatör kuyruğuna at; "nefret söylemi" %25'in üstüne çıkarsa otomatik gizle. Yanlışlık olunca editör eşiği gevşetir ya da sıkar. Tek bir "güvenlik bandı" yoktur — her sınıfın iş riskine göre ayarlanır.
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
# X: özellikler, y: 0 (ham) ya da 1 (spam)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
# Olasılık tahminleri
probs = model.predict_proba(X_test)[:, 1]
# Eşik problem maliyetine göre seçilir (varsayılan 0.5)
threshold = 0.4
preds = (probs > threshold).astype(int)
# precision/recall/F1 birlikte raporlanır
print(classification_report(y_test, preds, target_names=["ham", "spam"]))- Çıktı sonlu, ayrık etiketlerden birine düşüyorsa
- Doğru cevabı içeren tarihsel veri varsa
- Bir karar otomatikleştirilecekse: e-postayı arşivle, kartı blokla
- Her sınıfın olasılığını bilmek değer katıyorsa (eşik ayarı için)
- Çıktı sayısal ve sürekli ise — regresyon kullan
- Sınıf sayısı çok yüksek ve veride sadece birkaç örnek varsa (binlerce sınıflı, az veri)
- Etiketli veri toplamak imkansızsa — denetimsiz veya yarı denetimli yöntemleri düşün
Sadece doğruluğa (accuracy) bakmak
100 örnekten 99'u 'ham' ise her zaman 'ham' diyen model %99 doğruluk yakalar — ama spam'i hiç bulamaz. precision, recall, F1, confusion matrix bakmadan başarıyı yorumlama.
Eşiği unutmak
Çoğu kütüphane varsayılan 0.5 kullanır. Sağlık, güvenlik, dolandırıcılık gibi alanlarda bu yanlış olur. Hatalı pozitif ve hatalı negatifin maliyetlerini hesaplayıp eşiği iş kararıyla seç.
Sınıf dengesizliğini görmezden gelmek
Pozitif sınıf %1'in altındaysa, model sürekli negatif söyleyerek 'iyi' görünebilir. SMOTE, sınıf ağırlıkları, dengeli örnekleme gibi tekniklerle dengeyi düzelt.