Problem
Entropy measures the uncertainty of a set of labels: H(S) = -Σ pₖ × log₂(pₖ), where pₖ is the fraction of labels of class k. Information gain is how much entropy drops when you split the set by a feature:
IG = H(labels) - Σ (|Sᵥ| / |S|) × H(Sᵥ)
where Sᵥ contains the labels of the samples whose feature equals v. Decision trees pick the feature with the highest gain.
Implement information_gain(feature, labels).
Input
feature: The feature value of each sample.
labels: The class label of each sample (same length).
Output
Return the information gain in bits, as a decimal number.
Constraints
1 ≤ length ≤ 10,000
Each value and label is 1 to 20 characters
Examples
Input:
labels = ["no", "no", "yes", "yes"]
feature = ["sunny", "sunny", "rain", "rain"]
Expected output:
expected = 1.0
Input:
std::vector<std::string> labels = {"no", "no", "yes", "yes"};
std::vector<std::string> feature = {"sunny", "sunny", "rain", "rain"};
Expected output:
double expected = 1.0;
Input:
string[] labels = new string[] {"no", "no", "yes", "yes"};
string[] feature = new string[] {"sunny", "sunny", "rain", "rain"};
Expected output:
double expected = 1.0;
Explanation
The labels are half yes and half no, so H = 1 bit. Splitting by weather gives two pure groups (H = 0 each), so the gain is 1 - 0 = 1: the feature tells you everything.
Input:
labels = ["yes", "yes", "no", "no"]
feature = ["a", "b", "a", "b"]
Expected output:
expected = 0.0
Input:
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
std::vector<std::string> feature = {"a", "b", "a", "b"};
Expected output:
double expected = 0.0;
Input:
string[] labels = new string[] {"yes", "yes", "no", "no"};
string[] feature = new string[] {"a", "b", "a", "b"};
Expected output:
double expected = 0.0;
Explanation
Each group a and b still has one yes and one no (H = 1), so the remainder is 0.5 × 1 + 0.5 × 1 = 1 and the gain is 1 - 1 = 0: the feature is useless.
How to approach it
Try on your own first, then open one hint at a time.
Hint 1
First measure the label uncertainty before any split, then compare it to the uncertainty inside each feature group.
Hint 2
Group samples by feature value, count labels within each group, and combine each group's entropy using its share of the data.
Hint 3
Be careful with repeated values and the case where a group has only one label, since its entropy contribution is zero.
Expected complexity
O(n) time, O(n) extra space
References
This challenge is adapted for CodeUtility. Follow the statement and constraints above.