Okullar için Robotik ve Mühendislik · anaokulundan liseye

Bölüm 3 · Klasik algoritmalar · Ders 14

Karar ağacı

Çizgi izleyen robotun kararını evet/hayır sorularına bölmek

Veri. Bir uzman, çizgi izleyen robotu elle sürerken 160 an kaydettik: sol ve sağ çizgi sensörünün okuması (0–1023) ve o an seçtiği eylem: sola, düz ya da sağa. Çizgi koyu; sensör koyu yüzeyde büyük değer okur. Robot aynı kararları kendisi versin istiyoruz, ama okunabilir kurallarla.

başlangıç: Gini 0,570160 an · derinlik ≤ 3
1 / 25
karar_agaci.pypython
  1. import numpy as np
  2. D = np.genfromtxt('cizgi-izleyen.csv', delimiter=',', names=True) # 160 eğitim, 80 test anı
  3. A, e, tr = np.c_[D['sol'], D['sag']], D['eylem'].astype(int), D['grup'] == 0 # [sol, sağ], 0 sola 1 düz 2 sağa
  4. X, y, X_test, y_test = A[tr], e[tr], A[~tr], e[~tr]
  5. def gini(y): p = np.bincount(y, minlength=3) / max(len(y), 1); return 1 - (p ** 2).sum()
  6. def best_split(X, y):
  7. best = (gini(y), None, None)
  8. for f in range(2): # her sensör
  9. for t in np.unique(X[:, f]): # her eşik
  10. L = X[:, f] <= t
  11. g = (L.sum() * gini(y[L]) + (~L).sum() * gini(y[~L])) / len(y) # bölmeden sonraki safsızlık
  12. if 0 < L.sum() < len(y) and g < best[0]: best = (g, f, t)
  13. return best
  14. def grow(X, y, depth):
  15. g, f, t = best_split(X, y)
  16. if depth == 0 or f is None: return np.bincount(y).argmax() # yaprak: çoğunluk
  17. L = X[:, f] <= t
  18. return (f, t, grow(X[L], y[L], depth - 1), grow(X[~L], y[~L], depth - 1))
  19. tree = grow(X, y, depth=3)
  20. def predict(t, x):
  21. while isinstance(t, tuple): t = t[2] if x[t[0]] <= t[1] else t[3] # evet: sol dal, hayır: sağ dal
  22. return t
  23. acc = lambda X, y: np.mean([predict(tree, x) == c for x, c in zip(X, y)])
  24. print(acc(X, y), acc(X_test, y_test)) # eğitim ve saklı veride doğruluk
  25. n_leaves = lambda t: n_leaves(t[2]) + n_leaves(t[3]) if isinstance(t, tuple) else 1
  26. history = {'depth': [], 'train_acc': [], 'test_acc': [], 'leaves': []} # derinliğe göre geçmiş
  27. for d in range(1, 11):
  28. tree = grow(X, y, d) # aynı veriyle daha derin ağaç
  29. for k, v in zip(history, (d, acc(X, y), acc(X_test, y_test), n_leaves(tree))): history[k].append(float(v))
  30. tree = grow(X, y, depth=3)
  31. p = np.array([predict(tree, x) for x in X_test])
  32. M = np.zeros((3, 3), int); np.add.at(M, (y_test, p), 1) # karışıklık matrisi: satır gerçek, sütun tahmin
  33. print(M)
  34. prec, rec = np.diag(M) / np.maximum(M.sum(0), 1), np.diag(M) / np.maximum(M.sum(1), 1)
  35. f1 = 2 * prec * rec / np.maximum(prec + rec, 1e-12)
  36. for k, v in [('test_accuracy', np.trace(M) / M.sum()), ('precision_m', prec.mean()), ('recall_m', rec.mean()), ('f1_m', f1.mean())]: # son ölçümler tablosu
  37. print(f'{k:<14}{v:>8.3f}')
  38. import csv
  39. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  40. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir derinlik
  41. try:
  42. import matplotlib.pyplot as plt # varsa grafik çiz
  43. for k in ('train_acc', 'test_acc'): plt.plot(history['depth'], history[k], 'o-', label=k)
  44. plt.xlabel('depth'); plt.ylabel('accuracy'); plt.legend(); plt.show()
  45. except ImportError:
  46. print('matplotlib yok: grafik atlandı')

Eğitim paneli

Eğitim çalıştırılıyor…

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

  • Çizgi izleyen robot: uzman sürüşücizgi-izleyen.csv · 240 satır · 4 sütun
    Veri setini indir
  • Kredi başvurularıalıştırmakredi-basvurulari.csv · 500 satır · 4 sütun
    Veri setini indir
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

karar_agaci.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Gini safsızlığı, bir kutudaki eylemlerin ne kadar karışık olduğunu ölçer: tek eylem varsa 0.
  2. Her düğümde iki sensörün de bütün eşikleri denenir; safsızlığı en çok azaltan tek soru seçilir ("sol ≤ 612 mi?").
  3. İki yarıya aynı işlem uygulanır, derinlik sınırına kadar. Yapraklar çoğunluk eylemini verir.
  4. Derinlik 1 kaba kalır; 2–3 kuralı bulur ve son karede kurallar Arduino’ya aktarılacak if-else satırları olarak yazılır.
  5. İkinci veri kümesi bir banka: 500 müşterinin aylık geliri, kaçırdığı ödeme sayısı ve krediyi ödeyip ödemediği (400’ü eğitim, 100’ü yeni müşteri). Arkadaki kural “gelir 3.000’in üstünde ve en fazla 1 kaçan ödeme, ya da gelir 5.000’in üstünde”; müşterilerin %12’si sürpriz yapar. Veriyi 1 yap: derinlik 3’te ağaç kuralı neredeyse aynen bulur ve her reddi tek satırla açıklar.
  6. Şunu dene: derinliği 3’ten 10’a çıkar. Eğitim verisinde doğruluk %100’e çıkar, saklı veride ise derinlik 4’ten sonra hiç kıpırdamaz: fazladan yapraklar yalnızca uzmanın yanlış etiketlerini ezberler. Aradaki fark ezberin ölçüsüdür (aşırı öğrenme dersindeki durumun aynısı) ve 21 yapraklı ağacın kuralları artık okunamaz.
  7. Aynısını kredi verisinde dene: derinliği 3’ten 10’a çıkar. Eski müşterilerde doğruluk %89’dan %95’e çıkar, yeni müşterilerde %85’ten %77’ye düşer ve yaprak sayısı 8’den 60’a fırlar. Ağaç sürprizleri kural sanıp ezberlemiştir.

Neden önemli

Karar ağacının kuralları okunabilir ve doğrudan bir Arduino if-else zincirine çevrilebilir. Kararın gerekçesinin gösterilmesi gereken her yerde bu yüzden tercih edilir: bir banka krediyi neden reddettiğini (“gelir ≤ 3.000 ve kaçırılan ödeme > 1”) müşteriye açıklayabilmelidir. Yüzlerce ağaç birleşince (rastgele orman, gradyan artırma) tablo verisinde bugün de en güçlü yöntemler arasındadır.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç