Что такое H(X) в контексте классификации, например энтропия?
Что проверяют
Различаете ли вы энтропию распределения, условную энтропию и кросс-энтропию. Это три разные величины, которые в разговоре сливают в одно слово, а в коде путают прямо в формуле функции потерь. Вопрос базовый, поэтому ценится точность формулировок.
Как отвечать
H(X) это средняя неопределённость распределения: сумма вероятностей на логарифм вероятностей со знаком минус. Логарифм по основанию два даёт биты, натуральный даёт наты. Ноль означает вырожденное распределение, где ответ известен заранее; максимум достигается на равномерном и равен логарифму числа классов.
В классификации величина живёт в двух ролях. Как критерий разбиения в решающих деревьях: прирост информации это энтропия узла минус взвешенная по долям объектов энтропия потомков, то есть разность H(Y) и условной H(Y|X). Как функция потерь: кросс-энтропия сравнивает истинное распределение с предсказанным, и оптимизируется именно она, а не H(X).
import numpy as np
def entropy(y):
_, counts = np.unique(y, return_counts=True)
p = counts / counts.sum()
return -np.sum(p * np.log2(p))
def gain(y, left, right):
w = len(left) / len(y)
return entropy(y) - w * entropy(left) - (1 - w) * entropy(right)Где спотыкаются
Забывают соглашение о нулевой вероятности. Логарифм нуля уходит в минус бесконечность, и в коде появляется nan: класс с нулевой частотой просто не входит в сумму, а предсказания в кросс-энтропии подрезают снизу малой константой.
Считают энтропию потомков без весов и удивляются, почему дерево режет выборку на крошечные чистые листья. Взвешивание по доле объектов и есть защита от такого разбиения.
Путают H(X) с качеством модели. Энтропия разметки описывает данные, а не классификатор: на перекошенной выборке она низкая сама по себе, и модель, предсказывающая один класс, выглядит прилично, пока не посмотришь на полноту по редкому классу.