Sıradaki

Ortalama kare hata

Zorluk: Kolay

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:

  1. Her örnek (sample) için tahminle target’ın farkını al.
  2. Farkın karesini hesapla.
  3. Bu karelerin NN örnek üzerindeki ortalamasını döndür.

Formülü şudur:

MSE=1N∑i=1N(y^i−yi)2\text{MSE} = \frac{1}{N}\sum_{i=1}^{N} (\hat{y}_i - y_i)^2

Tahminler target’lara ne kadar yakınsa MSE o kadar küçüktür. Hepsi tam isabetliyse MSE 00 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. −2-2 ile +2+2 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_hat ve y aynı (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ği np.float64 de kabul edilir. float(...) ile çevirmek zorunda değilsin.
  • Önce her hatanın karesini al, sonra ortalamayı hesapla.
  • y_hat’ı ve y’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 y^i−yi\hat{y}_i - y_i sırasıyla −1-1, 22 ve 00 olsun:

  1. Hataların karesini al: 11, 44 ve 00.
  2. Karelerin ortalamasını al: 5/35/3, yani yaklaşık 1,671{,}67.

Kare almak işareti ortadan kaldırır. Hataların kendisini ortalarsan −2-2 ile +2+2 birbirini götürür. İki tahmin de yanlış olduğu hâlde sonuç 00 çıkar.

Kare ayrıca büyük hataları küçüklerden daha ağır sayar. Hata 11 iken karesi 11, hata 1010 iken karesi 100100 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ıpHesapÇok yanlış tek bir tahminin etkisi
MSEHata karelerinin ortalamasıGüçlü
MAEHataları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 −1-1 ve +1+1 hataları 00 verir, oysa doğru MSE 11‘dir.

Kare, ortalamanın içinde, her hataya ayrı ayrı uygulanmalıdır.

Bu problemde bir sorun mu var?

solution.py
import numpy as npdef mse(y_hat: np.ndarray, y: np.ndarray) -> float:    """Tahminlerle hedef değerler arasındaki ortalama kare hatayı döndürür."""    # Kodunu buraya yaz.    return 0.0

İçindekiler

Geri bildirim

Tür