Todos los desafíos
Fácil 0 resueltos 0% de aceptación

Funciones de pérdida: MSE, MAE y entropía cruzada

Mide cuán equivocadas son las predicciones de un modelo con el error cuadrático medio, el error absoluto medio o la entropía cruzada binaria.

Lo que aprenderás

  • Medir el error de predicción de tres formas
  • Acotar probabilidades para evitar log(0)
  • Elegir una pérdida para regresión o clasificación

Problema

Ver original (inglés)

Una función de pérdida convierte los errores de un modelo en un solo número que hay que minimizar. Implementa compute_loss(kind, predictions, targets) para tres pérdidas comunes, donde n es el número de predicciones:

  • "mse" (error cuadrático medio): promedio de (p - t)²
  • "mae" (error absoluto medio): promedio de |p - t|
  • "binary_cross_entropy": -promedio de [t × ln(p) + (1 - t) × ln(1 - p)]. Primero limita cada predicción p al rango [0.0000001, 0.9999999] para que el logaritmo nunca sea ln(0).

Entrada

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

predictions: Las predicciones del modelo.

targets: Los valores correctos (misma longitud). Para la entropía cruzada son 0 o 1 y las predicciones están entre 0 y 1.

Salida

Devuelve la pérdida como número decimal.

Restricciones

1 ≤ longitud ≤ 1000

-1000 ≤ cada valor ≤ 1000 (0 ≤ p ≤ 1 y t ∈ {0, 1} para la entropía cruzada)

Ejemplos

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

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

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

Salida esperada:
double expected = 0.166667;

Explicación

Errores al cuadrado: 0.5² = 0.25, 0.5² = 0.25 y 0² = 0. Su promedio es 0.5 / 3 ≈ 0.166667.

Ejemplo 2
Entrada:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Salida esperada:
expected = 0.164252
Entrada:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Salida esperada:
double expected = 0.164252;
Entrada:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Salida esperada:
double expected = 0.164252;

Explicación

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Las predicciones correctas y seguras dan una pérdida pequeña.

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Cada pérdida compara predicciones con objetivos elemento por elemento y luego promedia los errores por ejemplo.

Pista 2

Para cross-entropy, limita las predicciones lejos de 0 y 1 antes de tomar logaritmos.

Pista 3

Recuerda que el valor absoluto y el cuadrado no son lo mismo, y que cross-entropy usa el objetivo como peso en cada término logarítmico.

Complejidad esperada

tiempo O(n), espacio extra O(1)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.