İlk Yapay Zeka Modeliniz: Iris Çiçeği Sınıflandırıcı
Şimdi gerçek bir model eğitelim. Iris veri seti üzerinde 3-sınıf classifier yapacak, overfitting'in nasıl tespit edildiğini görecek ve cross-validation kullanacaksınız. Tüm kod tarayıcıda çalışır.
Şükrü Yusuf KAYA
28 min read
Intermediate🎉 Hands-on bölümüne hoş geldin
Bu ders boyunca tüm kodu tarayıcıda çalıştırabilirsin — Python kurmana gerek yok. Pyodide ilk yüklemede ~10 saniye sürer; sonrası anında çalışır. Hadi başlayalım.
Hedef#
Iris veri seti üzerinde 3-sınıf classifier eğiteceğiz:
- Setosa, Versicolor, Virginica (3 farklı zambak türü)
- 4 öznitelik: sepal length, sepal width, petal length, petal width
- 150 örnek (her sınıftan 50)
Ulaşacağımız adımlar:
- Veriyi yükle ve incele (EDA)
- Train/test ayır
- Decision Tree eğit
- Performansı değerlendir
- Cross-validation uygula
- Overfitting'i tespit et
- Tahmin yap
Adım 1-2: Veriyi yükle ve incele#
Aşağıdaki notebook tek tek hücreleri çalıştırarak veriyi tanı. Run all butonu hepsini sırayla çalıştırır.
Hücre 1 — Veriyi yükle
scikit-learn yerleşik veri setlerinden Iris'i çekeriz.
python
from sklearn.datasets import load_irisiris = load_iris()print("Shape:", iris.data.shape)print("Sınıflar:", iris.target_names)print("Öznitelikler:", iris.feature_names)Hücre 2 — Sınıf dağılımı
python
import numpy as npunique, counts = np.unique(iris.target, return_counts=True)for cls, cnt in zip(unique, counts): print(f"{iris.target_names[cls]}: {cnt} örnek")Hücre 3 — İlk 5 örneğe göz at
Gerçek tablonun ne olduğunu görelim.
python
for i in range(5): feats = ", ".join(f"{f}={v:.1f}" for f, v in zip(iris.feature_names, iris.data[i])) print(f"[{i}] {feats} -> {iris.target_names[iris.target[i]]}")Adım 3-4: Eğit ve değerlendir#
Decision Tree, en yorumlanabilir ML algoritmalarındandır — verdiği kararı insan diliyle açıklar. ile aşırı derinleşmesini engelliyoruz.
max_depth=3python
from sklearn.datasets import load_irisfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score, classification_report iris = load_iris()X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.3, random_state=42, stratify=iris.target) model = DecisionTreeClassifier(max_depth=3, random_state=42)model.fit(X_train, y_train) train_acc = accuracy_score(y_train, model.predict(X_train))test_acc = accuracy_score(y_test, model.predict(X_test)) print(f"Eğitim doğruluğu: {train_acc:.2%}")print(f"Test doğruluğu: {test_acc:.2%}")print()print("Sınıf bazında rapor (test):")print(classification_report(y_test, model.predict(X_test), target_names=iris.target_names)) ▶️ Çalıştır — eğitim ve test setlerinde performansı yan yana göreceksin. Train accuracy >> test accuracy ise overfitting alarmı.
python · diff modu
Senin kodun
Hedefe karşı diff
+ # İyi kod — eğitim ve test ayrı 👍- # Kötü kod — eğitim setini hem eğit hem test için kullanıyor 🙅from sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import load_iris+ from sklearn.model_selection import train_test_splitiris = load_iris()+ X_train, X_test, y_train, y_test = train_test_split(+ iris.data, iris.target, test_size=0.3, random_state=42+ )+ model = DecisionTreeClassifier(max_depth=3, random_state=42)+ model.fit(X_train, y_train)+ print(f"Train: {model.score(X_train, y_train):.2%}")+ print(f"Test: {model.score(X_test, y_test):.2%}")- model = DecisionTreeClassifier()- model.fit(iris.data, iris.target)- print(model.score(iris.data, iris.target))- # 100% — ama bu sahte! Modeli görmediği veride test etmedik.
Kötü → İyi: eğitim setiyle test etmek 'data leakage'tır. ML'in en yaygın hatalarından biri.
⚠️ Overfitting tehlikesi
Eğitim doğruluğu %100, test doğruluğu %75 ise: model ezberlemiş. Çözümler: (1) daha fazla veri, (2) gibi karmaşıklık parametrelerini düşür, (3) regularization ekle, (4) ensemble (Random Forest) kullan.
max_depth📈 Overfitting'i görselleştir#
Bir modelin karmaşıklığını (örn. ) artırdıkça eğitim doğruluğu ve test doğruluğu birbirinden ayrılır. Bu klasik "U-eğrisi" overfitting'i tek bir bakışta gösterir:
max_depthÜç bölge:
| Bölge | max_depth | Train | Test | Tanı |
|---|---|---|---|---|
| Underfitting | 1-2 | düşük | düşük | Model çok basit — kapasite yetmez |
| Sweet spot | 3-5 | yüksek | en yüksek | Doğru genelleme |
| Overfitting | 7+ | mükemmel | düşüyor | Model ezberliyor — gerçek dünyada başarısız |
Pratik kural: Test eğrisinin tepe yaptığı noktayı seç. Cross-validation bu noktayı bulmana yardım eder.
Bias-Variance ayrıştırması — toplam hata nereye gider?#
Bir modelin yaptığı hata matematiksel olarak şu üç bileşenin toplamıdır:
- Bias² — modelin sistematik sapması; ne kadar karmaşıklaşırsa o kadar azalır
- Variance — modelin eğitim verisindeki gürültüye duyarlılığı; karmaşıklaşırsa artar
- σ² — verideki azaltılamaz gürültü (sensor hatası, etiket gürültüsü); model değiştirmez
Bias düşürdükçe variance yükselir — bu trade-off'tur. Optimal model toplam hatayı minimize eder, tek bir bileşeni değil.
Adım 5: Cross-validation — daha güvenilir performans tahmini#
Tek bir train/test ayrımı şanslı/şanssız olabilir. K-fold cross-validation veriyi K eşit parçaya böler, her seferinde 1'i test 4'ü eğitim olur ve K skor üretilir. Ortalaması daha güvenilirdir.
python
from sklearn.datasets import load_irisfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import cross_val_scoreimport numpy as np iris = load_iris() # 5-fold cross-validationmodel = DecisionTreeClassifier(max_depth=3, random_state=42)scores = cross_val_score(model, iris.data, iris.target, cv=5, scoring='accuracy') print(f"5 fold skorları: {[f'{s:.2%}' for s in scores]}")print(f"Ortalama: {scores.mean():.2%}")print(f"Std sapma: {scores.std():.2%}")print()print(f"Güven aralığı (~95%): [{scores.mean() - 2*scores.std():.2%}, {scores.mean() + 2*scores.std():.2%}]") ▶️ 5-fold CV — ortalama doğruluk + std sapma. Std düşükse model stabil, yüksekse modelin performansı veriye duyarlı.
bash
$ pip install scikit-learn pandas numpySuccessfully installed scikit-learn-1.5.2 pandas-2.2.3 numpy-1.26.4 $ python train.pyLoading Iris dataset...Training DecisionTreeClassifier...Validation accuracy: 96.67%Model saved -> iris_model.pkl $ python predict.py --features 5.1 3.5 1.4 0.2Loading model from iris_model.pklPrediction: setosa (confidence: 99.2%)Sonuçlar nasıl yorumlanır?#
| Metrik | Yorumu |
|---|---|
| Accuracy | Doğru tahmin oranı. Dengeli sınıflarda iyi metrik. |
| Precision | Modelin "pozitif" dediklerinin ne kadarı gerçekten pozitif. |
| Recall | Gerçek pozitiflerin ne kadarını bulduk. |
| F1 | Precision ile Recall'un harmonik ortalaması — dengesiz sınıflarda kullan. |
| Confusion Matrix | Hangi sınıfı hangi sınıfla karıştırıyor. |
Iris için 96-97% accuracy beklenir. Daha yüksek accuracy mümkün ama overfitting riski var. Asıl gerçek hayat ML projelerinde %70-90 accuracy normal.
Mini-meydan: Senin sıran 🔥#
Aşağıdaki gömülü soruyu çöz. Iris veri setini yüklemen ve shape'ini yazdırman bekleniyor.
Bu derste neler yaptık?#
✓ Iris veri seti ile 3-sınıf classifier eğittik.
✓ Train/test ayrımı + stratify (sınıf dengesini koru).
✓ Decision Tree + max_depth ile karmaşıklık kontrolü.
✓ Overfitting tespiti: train >> test ise alarm.
✓ 5-fold cross-validation ile güvenilir performans tahmini.
✓ CLI workflow (pip install → python train.py → python predict.py).
Sıradaki ders: AI etiği ve sorumlu yapay zeka — modeli yapmak kolay, doğru yapmak sanat.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...