Projeler · Proje 4
Depoda nesne sınıflandırma
Konveyör bandındaki nesneleri biçim, renk ve boydan tanıyıp doğru kutuya iten model
Senaryo. Bir e-ticaret deposunda konveyör bandı karışık ürün getiriyor. Bandın üstündeki kapıda bir kamera nesnenin silüetinden yuvarlaklığını ve rengini, bir lazer ölçer boyunu okur. Kapıdan sonra dört itici var: oyuncak, elektronik, gıda ve büyük koli kutuları. Depo görevlisi daha önce bir grup ürünü elle etiketledi; robot gerisini kendisi ayıracak.
Amaç. Banttan geçen 200 yeni nesneyi doğru kutuya ayırmak: doğruluk %85’in üstünde, hiçbir kutunun duyarlılığı çok düşük olmasın.
3B sahne yükleniyor…
Eğitim paneli
Eğitim çalıştırılıyor…
Model bu sayfada, tarayıcında sıfırdan eğitilir (sabit tohum: aynı ayarlarla her seferinde aynı sonuç). Eğitim her karede küçük parçalar hâlinde yapılır; sekme ya da sahne görünmezken durur.
Adımlar
- Kapıdaki sensörler her nesneden üç sayı okur: yuvarlaklık (küp 0,1 civarı, küre 0,95 civarı), renk tonu (0–1) ve boy (cm). Sensör gürültüsü bu sayıları biraz oynatır.
- Model, görevlinin etiketlediği örneklerle eğitilir. k-NN yalnız örnekleri saklar; ağaç eşik soruları seçer; naive Bayes her kutu için ortalama ve varyans hesaplar.
- Her yeni nesne kapıdan geçerken sınıflanır ve tahmin edilen kutunun hizasında yana itilir. Yanlış kutuya düşen nesnenin üstünde kırmızı bir işaret yanar.
- Gerçek kutu bilindiği için her tarama karışıklık matrisine bir sayı ekler: satır gerçek kutu, sütun tahmin. Köşegen doğrular, geri kalan her hücre belirli bir karışıklıktır (ör. büyük koli sanılan elektronik).
- Kutu başına duyarlılık (o kutuya ait olanların ne kadarı oraya gitti) ve kesinlik (kutuya gidenlerin ne kadarı ona ait) ayrı ayrı izlenir: ortalama doğruluk tek bir zayıf kutuyu gizleyebilir.
Model
Üç klasik sınıflandırıcıdan biri, tarayıcıda etiketli örneklerle eğitilir: k en yakın komşu (ölçeklenmiş üç özellikte en yakın k örneğin oyu), karar ağacı (Gini ile seçilen eşik soruları) ve Gauss naive Bayes (sınıf başına ortalama ve varyans). Derslerdeki iki özellikli sürümlerin üç özellikli hâlidir; sonuç kesinlik ve duyarlılık dersindeki gibi karışıklık matrisiyle okunur.
Kullanılan dersler: k en yakın komşu (k-NN) · Karar ağacı · Naive Bayes: olasılıkla karar · Kesinlik, duyarlılık ve F1
Kendin dene
- Modeli 1 (karar ağacı) yap ve derinliği 1’e indir. Tek soru bandı yalnız ikiye bölebilir: dört kutudan ikisi hiç kullanılmaz ve saklı nesnelerde doğruluk %48’e düşer. Derinlik 3’te ağaç yeniden %92’ye çıkar; daha derin ağaç bir şey kazandırmaz.
- Sensör gürültüsünü 0,3’ten 1’e çıkar. Saklı nesnelerde k-NN %92’den %85’e, ağaç %91’den %81’e, naive Bayes %92’den %87’ye düşer. Karışıklık matrisine bak: hataların çoğu oyuncak, gıda ve büyük koli arasında toplanır; elektronik mavi rengi sayesinde az karışır.
- Etiketli örneği 20’ye indir. k-NN %92’den %74’e düşer, naive Bayes ise %86’da kalır: k-NN birkaç komşuya güvenmek zorundadır, naive Bayes her kutu için yalnız birkaç ortalama ve varyans öğrenir. Tohumu değiştir: bu kadar az örnekte sonuç tohuma göre çok oynar.
Python karşılığı
import numpy as npD = np.genfromtxt('depo-nesneleri.csv', delimiter=',', names=True) # 120 etiketli, 200 yeni nesneF, k, et = np.c_[D['yuvarlaklik'], D['ton'], D['boy']], D['kutu'].astype(int), D['grup'] == 0 # özellikler: yuvarlaklık, ton, boy (cm)X, y, X_yeni, y_yeni = F[et], k[et], F[~et], k[~et]mu, sd = X.mean(0), X.std(0)Z, Z_yeni = (X - mu) / sd, (X_yeni - mu) / sd # ölçekle: boy (cm) tonu ezmesindef knn(z, k=5):d = ((Z - z) ** 2).sum(1) # her etiketli örneğe uzaklıkoy = np.bincount(y[np.argsort(d)[:k]], minlength=4) # en yakın k örneğin oyureturn oy.argmax()m = np.array([X[y == c].mean(0) for c in range(4)]) # naive Bayes: kutu başına ortalamav = np.array([X[y == c].var(0) for c in range(4)]) # ve varyansp = np.bincount(y, minlength=4) / len(y) # kutuların oranı (önsel)def nb(x):lp = np.log(p) - 0.5 * (np.log(2 * np.pi * v) + (x - m) ** 2 / v).sum(1)return lp.argmax() # log olasılığı en büyük kutuM = np.zeros((4, 4), int) # karışıklık matrisihistory = {'n': [], 'true': [], 'pred': [], 'correct': [], 'accuracy': []} # geçmiş: taranan her nesne bir satırfor z, x, c in zip(Z_yeni, X_yeni, y_yeni): # banttan gelen her yeni nesnetahmin = knn(z) # ya da nb(x)M[c, tahmin] += 1 # satır gerçek, sütun tahminfor k, v in zip(history, (M.sum(), c, tahmin, c == tahmin, np.trace(M) / M.sum())): history[k].append(float(v) if k == 'accuracy' else int(v))print(M)print("doğruluk", np.trace(M) / M.sum()) # köşegen / toplamprint("duyarlılık", np.diag(M) / M.sum(1)) # kutu başınaprint("kesinlik", np.diag(M) / M.sum(0))P, R = np.diag(M) / np.maximum(1, M.sum(0)), np.diag(M) / np.maximum(1, M.sum(1))F1 = 2 * P * R / np.maximum(1e-12, P + R) # kutu başına F1for ad, p_, r_, f_ in zip(['oyuncak', 'elektronik', 'gida', 'buyuk koli'], P, R, F1): # son ölçümler tablosuprint(f'{ad:<12}kesinlik {p_:.2f} duyarlılık {r_:.2f} F1 {f_:.2f}')import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yazcsv.writer(f).writerows([list(history), *zip(*history.values())])try:import matplotlib.pyplot as plt # varsa grafik çizfig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.5))a1.plot(history['n'], history['accuracy']); a1.set_xlabel('n'); a1.set_ylabel('accuracy')a2.imshow(M, cmap='Greens'); a2.set_xlabel('tahmin'); a2.set_ylabel('gerçek') # karışıklık matrisiplt.show()except ImportError:print('matplotlib yok: grafik atlandı')
Veri seti
Tüm veri setleri →- Depo konveyörü: nesnelerVeri 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.