Bölüm 6 · Modeli ölçmek ve açıklamak · Ders 28
Boruta: hangi sensör gerçekten işe yarıyor?
Gölge kopyalarla özellik seçimi
Veri. Bir mobil robotun 300 çalışma kaydı var; her kayıtta 8 sensör okuması ve ardından arıza olup olmadığı. Sensörler: motor akımı, ortam ışığı, titreşim, nem, Wi-Fi sinyali, rulman sıcaklığı, hava basıncı ve pusula. Arızayı gerçekte yalnızca akım, titreşim ve sıcaklık haber veriyor; diğer 5'i gürültü. Algoritma bunu bilmeden bulmalı.
import numpy as npfrom math import combrng = np.random.default_rng(8)n, R = 300, 20 # 300 kayıt, 20 turX = rng.normal(0, 1, (n, 8)) # 8 sensör; 0, 2, 5 gerçekz = 1.6 * X[:, 0] + 1.2 * X[:, 2] + 0.8 * X[:, 5]y = (rng.random(n) < 1 / (1 + np.exp(-z))) * 1.0 # arıza oldu muhits = np.zeros(8, int)history = {k: [] for k in ['round', *[f'imp_{j}' for j in range(8)], 'shadow_max', 'n_hits']} # tur geçmişifor r in range(R):S = rng.permuted(X, axis=0) # gölgeler: sütunları karıştırZ = np.hstack([X, S]) # 16 sütunw = np.zeros(16)for _ in range(50): # lojistik regresyonp = 1 / (1 + np.exp(-Z @ w))w -= Z.T @ (p - y) / n # gradyan inişiimp = np.abs(w) # önembest_shadow = imp[8:].max() # gölgelerin en iyisihits += imp[:8] > best_shadow # isabetrow = (r + 1, *imp[:8], best_shadow, (imp[:8] > best_shadow).sum())for k, v in zip(history, row): history[k].append(float(v))tail = lambda a, b: sum(comb(R, k) for k in range(a, b + 1))p_up = [tail(h, R) / 2**R for h in hits] # şanstan fazla mıp_lo = [tail(0, h) / 2**R for h in hits] # şanstan az mıprint("isabet", hits) # hitsprint("kabul", [j for j in range(8) if p_up[j] < .01]) # acceptprint("ret", [j for j in range(8) if p_lo[j] < .01]) # rejectsel = [j for j in range(8) if p_up[j] < .01] or list(range(8)) # seçilen sensörlertr = np.arange(n) % 4 != 3 # her 4. kayıt doğrulamadef lojistik(cols): # seçilen sütunlarla modelA, w = X[tr][:, cols], np.zeros(len(cols))for _ in range(50):w -= A.T @ (1 / (1 + np.exp(-A @ w)) - y[tr]) / len(A)return ((X[~tr][:, cols] @ w > 0) == y[~tr]).mean() # doğrulama doğruluğufor k, v in [("val_acc", lojistik(sel)), ("val_acc_all8", lojistik(list(range(8)))),("accepted", len(sel)), ("hit_rate", hits.mean() / R)]: # son ölçümlerprint(f"{k:<13}{v:>8.3f}")import csvwith open("egitim_gecmisi.csv", "w", newline="") as f: # geçmişi CSV'ye yazcsv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir turtry:import matplotlib.pyplot as plt # varsa grafikfor j in range(8): plt.plot(history["round"], history[f"imp_{j}"], label=f"sensör {j}")plt.plot(history["round"], history["shadow_max"], "k--", label="en iyi gölge")plt.xlabel("round"); plt.ylabel("|w|"); plt.legend(); 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 →Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.
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
- Her sensörün bir "gölge" kopyası yapılır: aynı değerler, satırları karıştırılmış. Gölgenin arızayla ilişkisi kesinlikle yoktur.
- 16 sütunla basit bir model (lojistik regresyon) eğitilir; önem = ağırlığın büyüklüğü.
- Önemi gölgelerin en iyisinden büyük olan sensör o turda "isabet" alır. Gölgeler her turda yeniden karıştırılır.
- Şans eseri isabet olasılığı %50 kabul edilir; isabet sayısı bundan anlamlı biçimde fazlaysa kabul (yeşil), azsa ret (gri), arada kalırsa kararsız (sarı).
- Şunu dene: tur sayısını 5 yap; hiçbir karar verilemez. Turları artırdıkça kararlar netleşir.
Neden önemli
Gereksiz sensörler modeli yavaşlatır, aşırı öğrenmeye iter ve donanım maliyeti getirir. Boruta, kestirimci bakımda, tıbbi verilerde ve genetikte hangi ölçümlerin gerçekten bilgi taşıdığını bulmak için kullanılır. Robot tasarımında hangi sensörün kartta kalacağına karar vermeye yardım eder.
ESOF 323, 11. hafta: robotlarda derin öğrenme →