Tutte le sfide
Facile 0 risolte 0% di accettazione

Funzioni di perdita: MSE, MAE ed entropia incrociata

Misura quanto sono sbagliate le previsioni di un modello con l'errore quadratico medio, l'errore assoluto medio o l'entropia incrociata binaria.

Cosa imparerai

  • Misurare l'errore di previsione in tre modi
  • Limitare le probabilità per evitare log(0)
  • Scegliere una loss per regressione o classificazione

Problema

Una funzione di perdita trasforma gli errori di un modello in un unico numero da minimizzare. Implementa compute_loss(kind, predictions, targets) per tre perdite comuni, dove n è il numero di previsioni:

  • "mse" (errore quadratico medio): media di (p - t)²
  • "mae" (errore assoluto medio): media di |p - t|
  • "binary_cross_entropy": -media di [t × ln(p) + (1 - t) × ln(1 - p)]. Prima limita ogni previsione p all'intervallo [0.0000001, 0.9999999], così il logaritmo non è mai ln(0).

Input

kind: "mse", "mae" o "binary_cross_entropy".

predictions: Le previsioni del modello.

targets: I valori corretti (stessa lunghezza). Per l'entropia incrociata sono 0 o 1 e le previsioni sono tra 0 e 1.

Output

Restituisci la perdita come numero decimale.

Vincoli

1 ≤ lunghezza ≤ 1.000

-1.000 ≤ ogni valore ≤ 1.000 (0 ≤ p ≤ 1 e t ∈ {0, 1} per l'entropia incrociata)

Esempi

Esempio 1
Input:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Output atteso:
expected = 0.166667
Input:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Output atteso:
double expected = 0.166667;
Input:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

Output atteso:
double expected = 0.166667;

Spiegazione

Errori al quadrato: 0.5² = 0.25, 0.5² = 0.25 e 0² = 0. La loro media è 0.5 / 3 ≈ 0.166667.

Esempio 2
Input:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Output atteso:
expected = 0.164252
Input:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Output atteso:
double expected = 0.164252;
Input:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Output atteso:
double expected = 0.164252;

Spiegazione

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Previsioni corrette e sicure danno una perdita piccola.

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.