Problème
L'entropie mesure l'incertitude d'un ensemble d'étiquettes : H(S) = -Σ pₖ × log₂(pₖ), où pₖ est la proportion d'étiquettes de la classe k. Le gain d'information est la baisse d'entropie obtenue en divisant l'ensemble selon une variable :
IG = H(labels) - Σ (|Sᵥ| / |S|) × H(Sᵥ)
où Sᵥ contient les étiquettes des exemples dont la variable vaut v. Les arbres de décision choisissent la variable au gain le plus élevé.
Implémentez information_gain(feature, labels).
Entrée
feature : la valeur de la variable pour chaque exemple.
labels : l'étiquette de classe de chaque exemple (même longueur).
Sortie
Renvoyez le gain d'information en bits, sous forme de nombre décimal.
Contraintes
1 ≤ longueur ≤ 10 000
Chaque valeur et étiquette compte de 1 à 20 caractères
Exemples
Entrée :
labels = ["no", "no", "yes", "yes"]
feature = ["sunny", "sunny", "rain", "rain"]
Sortie attendue :
expected = 1.0
Entrée :
std::vector<std::string> labels = {"no", "no", "yes", "yes"};
std::vector<std::string> feature = {"sunny", "sunny", "rain", "rain"};
Sortie attendue :
double expected = 1.0;
Entrée :
string[] labels = new string[] {"no", "no", "yes", "yes"};
string[] feature = new string[] {"sunny", "sunny", "rain", "rain"};
Sortie attendue :
double expected = 1.0;
Explication
Les étiquettes sont pour moitié yes et pour moitié no, donc H = 1 bit. Diviser selon la météo donne deux groupes purs (H = 0 chacun), donc le gain vaut 1 - 0 = 1 : la variable dit tout.
Entrée :
labels = ["yes", "yes", "no", "no"]
feature = ["a", "b", "a", "b"]
Sortie attendue :
expected = 0.0
Entrée :
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
std::vector<std::string> feature = {"a", "b", "a", "b"};
Sortie attendue :
double expected = 0.0;
Entrée :
string[] labels = new string[] {"yes", "yes", "no", "no"};
string[] feature = new string[] {"a", "b", "a", "b"};
Sortie attendue :
double expected = 0.0;
Explication
Chaque groupe a et b contient encore un yes et un no (H = 1), donc le reste vaut 0.5 × 1 + 0.5 × 1 = 1 et le gain 1 - 1 = 0 : la variable est inutile.
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.