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

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

Rastgele orman

Birbirinden biraz farklı yirmi beş ağacın oylaması

Veri. Bir fabrikadaki konveyör motorlarından 1200 kayıt topladık: titreşim sensörünün RMS değeri (0–12 mm/s), sargı sıcaklığı (20–90 °C) ve bakım ekibinin notu: arızalandı mı? Titreşim ya da sıcaklık yükseldikçe arıza riski eğri bir sınırla artıyor; üstelik kayıtların yaklaşık %12’si yanlış girilmiş. 200 kayıtla öğreniyor, 1000 kayıtla sınıyoruz.

200 kayıt: 93 arıza, 107 sağlam200 eğitim · 1000 test · 25 ağaç
1 / 60
rastgele_orman.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(5)
  3. def veri(n):
  4. X = rng.uniform([0, 20], [12, 90], (n, 2)) # titreşim, sıcaklık
  5. r = (X[:, 0] / 9) ** 2 + ((X[:, 1] - 20) / 60) ** 2 # eğri sınır
  6. return X, (r > 1) ^ (rng.random(n) < 0.12) # %12 yanlış etiket
  7. X, y = veri(200); Xt, yt = veri(1000) # eğitim, test
  8. kir = lambda y: y.sum() * (1 - y.mean()) # n·p·(1 − p)
  9. def agac(X, y, d):
  10. f = rng.integers(2); ts = np.unique(X[:, f])[:-1] # rastgele özellik
  11. if d == 0 or y.all() or not y.any() or not len(ts):
  12. return y.mean() # yaprak: arıza oranı
  13. s = lambda t: kir(y[X[:, f] <= t]) + kir(y[X[:, f] > t])
  14. t = min(ts, key=s); L = X[:, f] <= t; d -= 1 # en iyi eşik
  15. return f, t, agac(X[L], y[L], d), agac(X[~L], y[~L], d)
  16. def oy(n, X):
  17. if type(n) is not tuple: return np.full(len(X), n)
  18. f, t, L, R = n
  19. return np.where(X[:, f] <= t, oy(L, X), oy(R, X))
  20. B = rng.integers(0, 200, (25, 200)) # 25 torba (bootstrap)
  21. orman = [agac(X[i], y[i], 6) for i in B] # derinlik ≤ 6
  22. P = np.array([oy(a, Xt) for a in orman]) > .5 # her ağacın oyu
  23. for k in (1, 5, 25):
  24. print(k, 'ağaç', ((P[:k].mean(0) > .5) == yt).mean()) # çoğunluk oyu
  25. Pe = np.array([oy(a, X) for a in orman]) > .5 # eğitimde oylar
  26. oob = np.array([~np.isin(np.arange(200), b) for b in B]) # torba dışı
  27. K = "trees", "train_acc", "test_acc", "oob_acc", "tree_acc"
  28. history = {k: [] for k in K} # ağaç sayısına göre
  29. for k in range(1, 26):
  30. v, n = (Pe[:k] & oob[:k]).sum(0), oob[:k].sum(0)
  31. m = n > 0 # en az bir ağacın torbası dışında
  32. row = (k, ((Pe[:k].mean(0) > .5) == y).mean(),
  33. ((P[:k].mean(0) > .5) == yt).mean(),
  34. ((v[m] / n[m] > .5) == y[m]).mean(),
  35. (P[k - 1] == yt).mean()) # o ağaç tek başına
  36. for c, x in zip(K, row): history[c].append(float(x))
  37. s, p = P.mean(0), P.mean(0) > .5 # oy oranı, karar
  38. tp, fp = (p & yt).sum(), (p & ~yt).sum()
  39. prec, rec = tp / max(tp + fp, 1), tp / max(yt.sum(), 1)
  40. pos, neg = s[yt], s[~yt]
  41. auc = ((pos[:, None] > neg).mean() # ROC AUC: sıralama olasılığı
  42. + .5 * (pos[:, None] == neg).mean())
  43. for k, x in [("test_acc", (p == yt).mean()),
  44. ("precision", prec), ("recall", rec),
  45. ("f1", 2 * prec * rec / (prec + rec)),
  46. ("auc", auc)]: # son ölçümler
  47. print(f'{k:<10}{x:>8.3f}')
  48. import csv
  49. with open("egitim_gecmisi.csv", "w", newline="") as f:
  50. w = csv.writer(f); w.writerow(K) # satır başına bir orman
  51. w.writerows(zip(*history.values()))
  52. try:
  53. import matplotlib.pyplot as plt # varsa grafik
  54. for k in K[1:]: plt.plot(history["trees"], history[k])
  55. plt.legend(K[1:]); plt.xlabel("trees"); plt.show()
  56. except ImportError:
  57. 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.

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.

rastgele_orman.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Torba (bootstrap): 200 kayıttan, geri koyarak, 200 çekiliş yapılır. Bazı kayıtlar iki üç kez gelir, üçte biri hiç gelmez. Her ağaç kendi torbasını görür.
  2. Her düğümde iki özellikten biri rastgele seçilir; ağaç yalnız o özellikte en iyi eşiği arar. Böylece ağaçlar birbirine benzemez.
  3. Tek bir derin ağaç yanlış etiketleri de ezberler: sınırı tırtıklı ve kararsızdır. Ama her ağaç farklı yerde yanılır.
  4. Orman çoğunluk oyuyla karar verir: hatalar birbirini götürür, sınır yumuşar.
  5. Şunu dene: ağaç sayısını 1 yap ve test doğruluğuna bak; sonra 5, sonra 25. Eğri önce hızla yükselir, sonra düzleşir.

Neden önemli

Rastgele orman, tablo verisinde ayar gerektirmeden iyi çalışan ilk yöntemlerdendir. Kestirimci bakımda (titreşim, akım, sıcaklık), arazi sınıflamada ve sensör füzyonunda yaygındır; Microsoft Kinect’in vücut parçası tanıması da rastgele ormanla yapılıyordu.

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ç