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.
import numpy as nprng = np.random.default_rng(5)def veri(n):X = rng.uniform([0, 20], [12, 90], (n, 2)) # titreşim, sıcaklıkr = (X[:, 0] / 9) ** 2 + ((X[:, 1] - 20) / 60) ** 2 # eğri sınırreturn X, (r > 1) ^ (rng.random(n) < 0.12) # %12 yanlış etiketX, y = veri(200); Xt, yt = veri(1000) # eğitim, testkir = lambda y: y.sum() * (1 - y.mean()) # n·p·(1 − p)def agac(X, y, d):f = rng.integers(2); ts = np.unique(X[:, f])[:-1] # rastgele özellikif d == 0 or y.all() or not y.any() or not len(ts):return y.mean() # yaprak: arıza oranıs = lambda t: kir(y[X[:, f] <= t]) + kir(y[X[:, f] > t])t = min(ts, key=s); L = X[:, f] <= t; d -= 1 # en iyi eşikreturn f, t, agac(X[L], y[L], d), agac(X[~L], y[~L], d)def oy(n, X):if type(n) is not tuple: return np.full(len(X), n)f, t, L, R = nreturn np.where(X[:, f] <= t, oy(L, X), oy(R, X))B = rng.integers(0, 200, (25, 200)) # 25 torba (bootstrap)orman = [agac(X[i], y[i], 6) for i in B] # derinlik ≤ 6P = np.array([oy(a, Xt) for a in orman]) > .5 # her ağacın oyufor k in (1, 5, 25):print(k, 'ağaç', ((P[:k].mean(0) > .5) == yt).mean()) # çoğunluk oyuPe = np.array([oy(a, X) for a in orman]) > .5 # eğitimde oylaroob = np.array([~np.isin(np.arange(200), b) for b in B]) # torba dışıK = "trees", "train_acc", "test_acc", "oob_acc", "tree_acc"history = {k: [] for k in K} # ağaç sayısına görefor k in range(1, 26):v, n = (Pe[:k] & oob[:k]).sum(0), oob[:k].sum(0)m = n > 0 # en az bir ağacın torbası dışındarow = (k, ((Pe[:k].mean(0) > .5) == y).mean(),((P[:k].mean(0) > .5) == yt).mean(),((v[m] / n[m] > .5) == y[m]).mean(),(P[k - 1] == yt).mean()) # o ağaç tek başınafor c, x in zip(K, row): history[c].append(float(x))s, p = P.mean(0), P.mean(0) > .5 # oy oranı, karartp, fp = (p & yt).sum(), (p & ~yt).sum()prec, rec = tp / max(tp + fp, 1), tp / max(yt.sum(), 1)pos, neg = s[yt], s[~yt]auc = ((pos[:, None] > neg).mean() # ROC AUC: sıralama olasılığı+ .5 * (pos[:, None] == neg).mean())for k, x in [("test_acc", (p == yt).mean()),("precision", prec), ("recall", rec),("f1", 2 * prec * rec / (prec + rec)),("auc", auc)]: # son ölçümlerprint(f'{k:<10}{x:>8.3f}')import csvwith open("egitim_gecmisi.csv", "w", newline="") as f:w = csv.writer(f); w.writerow(K) # satır başına bir ormanw.writerows(zip(*history.values()))try:import matplotlib.pyplot as plt # varsa grafikfor k in K[1:]: plt.plot(history["trees"], history[k])plt.legend(K[1:]); plt.xlabel("trees"); plt.show()except ImportError: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.
Veri seti
Tüm veri setleri →- Kredi başvuruları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.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- 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.
- 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.
- 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.
- Orman çoğunluk oyuyla karar verir: hatalar birbirini götürür, sınır yumuşar.
- Ş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 →