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

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ı.

300 kayıt, 8 sensör: hangileri arızayı haber veriyor?cevap gizli: 3 gerçek sinyal, 5 gürültü
1 / 27
boruta.pypython
  1. import numpy as np
  2. from math import comb
  3. rng = np.random.default_rng(8)
  4. n, R = 300, 20 # 300 kayıt, 20 tur
  5. X = rng.normal(0, 1, (n, 8)) # 8 sensör; 0, 2, 5 gerçek
  6. z = 1.6 * X[:, 0] + 1.2 * X[:, 2] + 0.8 * X[:, 5]
  7. y = (rng.random(n) < 1 / (1 + np.exp(-z))) * 1.0 # arıza oldu mu
  8. hits = np.zeros(8, int)
  9. history = {k: [] for k in ['round', *[f'imp_{j}' for j in range(8)], 'shadow_max', 'n_hits']} # tur geçmişi
  10. for r in range(R):
  11. S = rng.permuted(X, axis=0) # gölgeler: sütunları karıştır
  12. Z = np.hstack([X, S]) # 16 sütun
  13. w = np.zeros(16)
  14. for _ in range(50): # lojistik regresyon
  15. p = 1 / (1 + np.exp(-Z @ w))
  16. w -= Z.T @ (p - y) / n # gradyan inişi
  17. imp = np.abs(w) # önem
  18. best_shadow = imp[8:].max() # gölgelerin en iyisi
  19. hits += imp[:8] > best_shadow # isabet
  20. row = (r + 1, *imp[:8], best_shadow, (imp[:8] > best_shadow).sum())
  21. for k, v in zip(history, row): history[k].append(float(v))
  22. tail = lambda a, b: sum(comb(R, k) for k in range(a, b + 1))
  23. p_up = [tail(h, R) / 2**R for h in hits] # şanstan fazla mı
  24. p_lo = [tail(0, h) / 2**R for h in hits] # şanstan az mı
  25. print("isabet", hits) # hits
  26. print("kabul", [j for j in range(8) if p_up[j] < .01]) # accept
  27. print("ret", [j for j in range(8) if p_lo[j] < .01]) # reject
  28. sel = [j for j in range(8) if p_up[j] < .01] or list(range(8)) # seçilen sensörler
  29. tr = np.arange(n) % 4 != 3 # her 4. kayıt doğrulama
  30. def lojistik(cols): # seçilen sütunlarla model
  31. A, w = X[tr][:, cols], np.zeros(len(cols))
  32. for _ in range(50):
  33. w -= A.T @ (1 / (1 + np.exp(-A @ w)) - y[tr]) / len(A)
  34. return ((X[~tr][:, cols] @ w > 0) == y[~tr]).mean() # doğrulama doğruluğu
  35. for k, v in [("val_acc", lojistik(sel)), ("val_acc_all8", lojistik(list(range(8)))),
  36. ("accepted", len(sel)), ("hit_rate", hits.mean() / R)]: # son ölçümler
  37. print(f"{k:<13}{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 tur
  41. try:
  42. import matplotlib.pyplot as plt # varsa grafik
  43. for j in range(8): plt.plot(history["round"], history[f"imp_{j}"], label=f"sensör {j}")
  44. plt.plot(history["round"], history["shadow_max"], "k--", label="en iyi gölge")
  45. plt.xlabel("round"); plt.ylabel("|w|"); plt.legend(); plt.show()
  46. except ImportError:
  47. 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.

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.

boruta.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. 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.
  2. 16 sütunla basit bir model (lojistik regresyon) eğitilir; önem = ağırlığın büyüklüğü.
  3. Ö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.
  4. Ş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ı).
  5. Ş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 →
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ç