Todos los desafíos
Intermedio 0 resueltos 0% de aceptación

Ganancia de información

Calcula cuánto reduce la entropía dividir por una variable, el criterio de los árboles de decisión ID3.

Lo que aprenderás

  • Calcular la entropía antes y después de dividir
  • Ponderar subconjuntos por su tamaño
  • Elegir la característica más informativa

Problema

Ver original (inglés)

La entropía mide la incertidumbre de un conjunto de etiquetas: H(S) = -Σ pₖ × log₂(pₖ), donde pₖ es la proporción de etiquetas de la clase k. La ganancia de información es cuánto baja la entropía al dividir el conjunto por una variable:

IG = H(labels) - Σ (|Sᵥ| / |S|) × H(Sᵥ)

donde Sᵥ contiene las etiquetas de los ejemplos cuya variable vale v. Los árboles de decisión eligen la variable con la mayor ganancia.

Implementa information_gain(feature, labels).

Entrada

feature: El valor de la variable de cada ejemplo.

labels: La etiqueta de clase de cada ejemplo (misma longitud).

Salida

Devuelve la ganancia de información en bits, como número decimal.

Restricciones

1 ≤ longitud ≤ 10 000

Cada valor y etiqueta tiene de 1 a 20 caracteres

Ejemplos

Ejemplo 1
Entrada:
labels = ["no", "no", "yes", "yes"]
feature = ["sunny", "sunny", "rain", "rain"]

Salida esperada:
expected = 1.0
Entrada:
std::vector<std::string> labels = {"no", "no", "yes", "yes"};
std::vector<std::string> feature = {"sunny", "sunny", "rain", "rain"};

Salida esperada:
double expected = 1.0;
Entrada:
string[] labels = new string[] {"no", "no", "yes", "yes"};
string[] feature = new string[] {"sunny", "sunny", "rain", "rain"};

Salida esperada:
double expected = 1.0;

Explicación

Las etiquetas son mitad yes y mitad no, así que H = 1 bit. Dividir por el clima da dos grupos puros (H = 0 cada uno), así que la ganancia es 1 - 0 = 1: la variable lo dice todo.

Ejemplo 2
Entrada:
labels = ["yes", "yes", "no", "no"]
feature = ["a", "b", "a", "b"]

Salida esperada:
expected = 0.0
Entrada:
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
std::vector<std::string> feature = {"a", "b", "a", "b"};

Salida esperada:
double expected = 0.0;
Entrada:
string[] labels = new string[] {"yes", "yes", "no", "no"};
string[] feature = new string[] {"a", "b", "a", "b"};

Salida esperada:
double expected = 0.0;

Explicación

Cada grupo a y b sigue teniendo un yes y un no (H = 1), así que el resto es 0.5 × 1 + 0.5 × 1 = 1 y la ganancia es 1 - 1 = 0: la variable no sirve.

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.