Skip to content

İ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
İlk Yapay Zeka Modeliniz: Iris Çiçeği Sınıflandırıcı
🎉 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:
  1. Veriyi yükle ve incele (EDA)
  2. Train/test ayır
  3. Decision Tree eğit
  4. Performansı değerlendir
  5. Cross-validation uygula
  6. Overfitting'i tespit et
  7. 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_iris
iris = 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 np
unique, 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.
max_depth=3
ile aşırı derinleşmesini engelliyoruz.
python
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from 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 DecisionTreeClassifier
from sklearn.datasets import load_iris
+ from sklearn.model_selection import train_test_split
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
+ )
+ 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)
max_depth
gibi karmaşıklık parametrelerini düşür, (3) regularization ekle, (4) ensemble (Random Forest) kullan.

📈 Overfitting'i görselleştir#

Bir modelin karmaşıklığını (örn.
max_depth
) 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:
Üç bölge:
Bölgemax_depthTrainTestTanı
Underfitting1-2düşükdüşükModel çok basit — kapasite yetmez
Sweet spot3-5yükseken yüksekDoğru genelleme
Overfitting7+mükemmeldüşüyorModel 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:
E[(yy^)2]=Bias(y^)2+Var(y^)+σirreducible2E[(y - \hat{y})^2] = \text{Bias}(\hat{y})^2 + \text{Var}(\hat{y}) + \sigma^2_{\text{irreducible}}
  • 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_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
 
iris = load_iris()
 
# 5-fold cross-validation
model = 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 numpy
Successfully installed scikit-learn-1.5.2 pandas-2.2.3 numpy-1.26.4
 
$ python train.py
Loading Iris dataset...
Training DecisionTreeClassifier...
Validation accuracy: 96.67%
Model saved -> iris_model.pkl
 
$ python predict.py --features 5.1 3.5 1.4 0.2
Loading model from iris_model.pkl
Prediction: setosa (confidence: 99.2%)

Sonuçlar nasıl yorumlanır?#

MetrikYorumu
AccuracyDoğru tahmin oranı. Dengeli sınıflarda iyi metrik.
PrecisionModelin "pozitif" dediklerinin ne kadarı gerçekten pozitif.
RecallGerçek pozitiflerin ne kadarını bulduk.
F1Precision ile Recall'un harmonik ortalaması — dengesiz sınıflarda kullan.
Confusion MatrixHangi 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...

Related Content