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

Entropía cruzada categórica

Mide la pérdida de un clasificador multiclase a partir de sus probabilidades predichas y las clases reales.

Lo que aprenderás

  • Puntuar probabilidades predichas frente a las clases reales
  • Promediar la pérdida entre las muestras
  • Evitar log(0) acotando los valores

Problema

Ver original (inglés)

Un clasificador multiclase devuelve una probabilidad por clase (por ejemplo, con softmax). La entropía cruzada categórica lo penaliza cuando da una probabilidad baja a la clase correcta:

loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n

donde pᵢ es la probabilidad que el modelo dio a la clase correcta del ejemplo i. Para evitar ln(0), primero sube cualquier probabilidad menor que 0.0000001 a 0.0000001.

Implementa categorical_cross_entropy(probabilities, labels).

Entrada

probabilities: Una fila por ejemplo, con una probabilidad por clase.

labels: El índice de la clase correcta de cada ejemplo (empezando en 0).

Salida

Devuelve la pérdida promedio como número decimal.

Restricciones

1 ≤ ejemplos ≤ 1000, 2 ≤ clases ≤ 100

0 ≤ cada probabilidad ≤ 1

0 ≤ labels[i] < número de clases

Ejemplos

Ejemplo 1
Entrada:
labels = [0, 1]
probabilities = [
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1]
]

Salida esperada:
expected = 0.289909
Entrada:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
    {0.7, 0.2, 0.1},
    {0.1, 0.8, 0.1}
};

Salida esperada:
double expected = 0.289909;
Entrada:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
    new double[] {0.7, 0.2, 0.1},
    new double[] {0.1, 0.8, 0.1}
};

Salida esperada:
double expected = 0.289909;

Explicación

Las clases correctas recibieron 0.7 y 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.

Ejemplo 2
Entrada:
labels = [1]
probabilities = [
    [1.0, 0.0]
]

Salida esperada:
expected = 16.118096
Entrada:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
    {1.0, 0.0}
};

Salida esperada:
double expected = 16.118096;
Entrada:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
    new double[] {1.0, 0.0}
};

Salida esperada:
double expected = 16.118096;

Explicación

La clase correcta recibió probabilidad 0, que se sube a 0.0000001, así que la pérdida es -ln(0.0000001) ≈ 16.118096: una respuesta incorrecta dada con seguridad se castiga con dureza.

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.