Ortalama kare hata
Zorluk: Kolay Çözüldükayıp fonksiyonları
Kayıp fonksiyonu (loss function), bir modelin tahminlerinin (prediction) hedef değerlerden (target) ne kadar uzak olduğunu tek bir sayıyla ölçer. En yaygın olanlarından biri ortalama kare hatadır (mean squared error, MSE).
mse(y_hat, y) fonksiyonunu yaz. y_hat modelin tahminlerini, y target’ları içerir. İkisi de şekli (shape) (n,) olan birer dizidir (array).
Hesap üç adımdır:
- Her örnek (sample) için tahminle target’ın farkını al.
- Farkın karesini hesapla.
- Bu karelerin örnek üzerindeki ortalamasını döndür.
Formülü şudur:
Tahminler target’lara ne kadar yakınsa MSE o kadar küçüktür. Hepsi tam isabetliyse MSE olur. Tek bir Python float döndür.
Örnekler
Girdi: y_hat = [2.5, 0.0, 2.0, 8.0], y = [3.0, -0.5, 2.0, 7.0]
Çıktı: 0.375
Girdi: y_hat = [1.0, 2.0, 3.0], y = [1.0, 2.0, 3.0]
Çıktı: 0.0
Girdi: y_hat = [-1.0, 4.0, 0.5, -2.0, 3.0], y = [1.0, 3.0, -0.5, 2.0, 3.0]
Çıktı: 4.4
İpucu 1
y_hat - y, her örnek için tahminle target’ın farkını içeren yeni bir array verir. NumPy array’lerinde - ve ** gibi işlemler eleman bazında (element-wise) çalışır. Karesini ve ortalamasını sonra düşün.
İpucu 2
Ortalamayı almadan önce her hatanın karesini al. Hatalar pozitif de negatif de olabilir. ile ortalamada birbirini götürür.
Bir array’in her elemanının karesi a ** 2 ile bulunur.
İpucu 3
np.mean, karelerin ortalamasını tek bir sayı olarak verir. Döndürmeden önce sonucu float(...) ile sade bir Python float’una çevirebilirsin.
Gereksinimler
y_hatveyaynı(n,)shape’inde array’lerdir. En az bir örnek içerirler.- Dönüş değeri tek bir
float: array ya da liste değil.np.mean’in verdiğinp.float64de kabul edilir.float(...)ile çevirmek zorunda değilsin. - Önce her hatanın karesini al, sonra ortalamayı hesapla.
y_hat’ı vey’yi değiştirme. Fonksiyon bittiğinde çağıran kodun array’leri aynı kalır.- Örnekler üzerinde döngü kullanma: tek bir NumPy ifadesi yeter.
MSE’yi üç örnekle hesapla. Hatalar sırasıyla , ve olsun:
- Hataların karesini al: , ve .
- Karelerin ortalamasını al: , yani yaklaşık .
Kare almak işareti ortadan kaldırır. Hataların kendisini ortalarsan ile birbirini götürür. İki tahmin de yanlış olduğu hâlde sonuç çıkar.
Kare ayrıca büyük hataları küçüklerden daha ağır sayar. Hata iken karesi , hata iken karesi olur. Bu yüzden MSE, çok yanlış tek bir tahminden güçlü biçimde etkilenir.
Hataların mutlak değerinin ortalaması olan ortalama mutlak hata (mean absolute error, MAE) bu kadar etkilenmez:
| Kayıp | Hesap | Çok yanlış tek bir tahminin etkisi |
|---|---|---|
| MSE | Hata karelerinin ortalaması | Güçlü |
| MAE | Hataların mutlak değerinin ortalaması | Daha az |
Hangisinin uygun olduğu veriye bağlıdır.
MSE, modelin parametrelerine (parameter) bağlı bir sayıdır. Ağırlık (weight) ve sapma (bias) gibi parametreler değişince tahminler değişir. Dolayısıyla kayıp (loss) da değişir.
Öğrenme, bu loss’u en küçük yapan parametreleri aramaktır. Bunu Gradyan inişi dersinde yapacaksın.
Daha fazlası için Model, parametre, kayıp dersine bak.
Hataları al, karelerinin ortalamasını hesapla ve sonucu bir Python float’una çevir:
import numpy as npdef mse(y_hat: np.ndarray, y: np.ndarray) -> float: return float(np.mean((y_hat - y) ** 2))
Sık yapılan hata, ortalamayı aldıktan sonra karesini almaktır (np.mean(y_hat - y) ** 2). Hataların işaretleri birbirini götürür. Bu yüzden ve hataları verir, oysa doğru MSE ‘dir.
Kare, ortalamanın içinde, her hataya ayrı ayrı uygulanmalıdır.
Bu problemde bir sorun mu var?