Karar Ağacı
Decision Tree
Veriyi art arda evet/hayır sorularıyla bölerek tahmin yapan, açıklanabilirliği yüksek ve sınıflandırma ile regresyon için kullanılabilen bir algoritma.
Karar ağacı bir kök düğümden başlar, her düğümde verinin bir özelliği üzerinden bir eşik koyar ("yaş > 35 mi?") ve veriyi iki alt kümeye ayırır. Bu işlem, alt küme yeterince saflaşana ya da ağaç maksimum derinliğe ulaşana kadar tekrarlanır. Yapraklarda nihai tahmin yatar — bir sınıf etiketi ya da bir sayısal değer.
Düğümde "hangi özellikten ve hangi eşikten ayıracağım?" kararı, sınıflandırmada Gini impurity ya da entropy azalmasını, regresyonda ise varyans azalmasını maksimize edecek şekilde seçilir. Bu açgözlü (greedy) yaklaşım her zaman global optimum bulamaz, ama çok hızlı çalışır.
Karar ağaçlarının cazibesi, kara kutu olmamalarıdır. Eğitilmiş bir ağacı kâğıda çizip "müşteri X'in neden riskli sayıldığını" tek tek izleyebilirsin. Dezavantajı: tek bir ağaç çok kolay aşırı öğrenir. Bu yüzden gerçek dünyada genelde topluluk hâli olarak kullanılır — Random Forest, Gradient Boosting.
Bir ER hekiminin triyaj akışı gibi düşün. "Hasta nefes alabiliyor mu?" → evet ise sonraki soru, hayır ise hemen yoğun bakım. "Ateş 39'un üstünde mi?" → evet ise enfeksiyon yolu, hayır ise diğer şüpheler. Hekim her soruda hastayı bir alt akışa yönlendirir. Karar ağacı tam olarak bu akışın matematiksel hâlidir; ağacı veriden öğrenir, sonra her yeni hastaya aynı yolda yürür.
Bir banka kredi başvurusu reddetme kararını otomatikleştirmek istiyor ama şeffaflık zorunlu (yasal). Random forest çok daha doğru sonuç verirdi ama "modelimiz dedi ki" cevabı yetersiz. Tek bir karar ağacı eğitilir, derinlik 5 ile sınırlanır.
Sonuç: Kök düğüm "borç/gelir oranı > 0.45 mi?" diye sorar. Evet ise sağ dala, "geçmişte ödenmemiş kredi var mı?" sorusuna gider. Yapraklarda "onayla", "elle incele", "reddet" yatar. Müşteriye kararın gerekçesi yazılı olarak verilebilir: "borç/gelir oranınız 0.52 olduğu, son 24 ayda 1 ödenmemiş krediniz olduğu için elle incelemeye yönlendirildiniz." Açıklanabilirlik kazandı, son %2 doğruluk feda edildi.
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
# max_depth en kritik parametre — aşırı öğrenmeyi önler
tree = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=20,
random_state=42,
)
# Çapraz doğrulama ile dengeli değerlendirme
scores = cross_val_score(tree, X, y, cv=5, scoring="f1_macro")
print(f"F1 (5-fold): {scores.mean():.3f} ± {scores.std():.3f}")
# Eğit ve görselleştir
tree.fit(X, y)
plt.figure(figsize=(12, 8))
plot_tree(tree, feature_names=feature_names, class_names=class_names, filled=True)
plt.savefig("tree.png", dpi=150, bbox_inches="tight")- Tahminin gerekçesini elle açıklamak şartsa
- Hızlı bir baseline ve veri keşfi gerekiyorsa
- Hem sayısal hem kategorik özellikler bir arada ve normalleştirme yapmak istemiyorsan
- Eksik değerlere ve aykırı değerlere belirli oranda toleranslı bir model gerekiyorsa
- Doğruluk en önemli metrik ve sermayen veriye yetiyorsa — Random Forest / Gradient Boosting daha iyidir
- Veri çok dengesizse ve ağaç hızlıca büyük çoğunluğa kayıyorsa
- Çok küçük veri var ve aşırı öğrenmeyi sınırlamak zor
Sınırsız derinlik
max_depth ayarlamadan ağacı eğitirsen, eğitim verisini ezberler ve test setinde çuvallar. min_samples_leaf ve max_depth düzenlemeden ağaç eğitme.
Sınıf dengesizliği
Pozitif sınıf nadir ise ağaç hızlıca 'her şeye negatif de' yapısına kayabilir. class_weight='balanced' ya da örnekleme tekniğiyle dengeyi düzelt.
Tek ağaca güvenmek
Eğitim verisinin küçük bir değişimi ağacın tamamen başka şekil almasına yol açar — istikrarsızdır. Production için tek ağaç yerine topluluk modelini tercih et.