Я предполагаю, что энтропия упоминалась в контексте построения деревьев решений .
Для иллюстрации, представьте себе задачу обучения , чтобы классифицировать первоклассник имен в мужские / женские группы. Это дает список имен, каждое из которых помечено либо, m
либо f
, мы хотим изучить модель, которая соответствует данным и может использоваться для прогнозирования пола нового невидимого имени.
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
Первый шаг - это решить, какие особенности данных относятся к целевому классу, который мы хотим предсказать. Некоторые примеры функций включают в себя: первую / последнюю букву, длину, количество гласных, заканчивается ли это гласной и т. Д. Итак, после извлечения признаков наши данные выглядят следующим образом:
# name ends-vowel num-vowels length gender
# ------------------------------------------------
Ashley 1 3 6 f
Brian 0 2 5 m
Caroline 1 4 8 f
David 0 2 5 m
Цель состоит в том, чтобы построить дерево решений . Примером дерева будет:
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
в основном каждый узел представляет тест, выполненный для одного атрибута, и мы идем влево или вправо в зависимости от результата теста. Мы продолжаем обходить дерево, пока не достигнем конечного узла, который содержит прогноз класса ( m
или f
)
Поэтому, если мы запустим имя Amro по этому дереву, мы начнем с проверки « есть длина <7? » И ответ « да» , поэтому мы идем по этой ветви. После ветки следующий тест « количество гласных <3? » Снова оценивается как true . Это приводит к листовому узлу, помеченному m
, и, таким образом, предсказание является мужским (что, как мне показалось, является таким, поэтому дерево предсказало результат правильно ).
Дерево решений построено в нисходящем порядке , но вопрос в том, как выбрать, какой атрибут разделить на каждом узле? Ответ заключается в том, чтобы найти функцию, которая наилучшим образом разбивает целевой класс на самые чистые из возможных дочерних узлов (то есть: узлы, которые не содержат смесь как мужского, так и женского, довольно чистые узлы только с одним классом).
Эта мера чистоты называется информацией . Он представляет ожидаемый объем информации , который потребуется для указания того, должен ли новый экземпляр (имя) быть классифицирован как мужской или женский, учитывая пример, который достиг узла. Мы рассчитываем это на основе количества мужских и женских классов в узле.
С другой стороны, энтропия - это мера нечистоты (противоположность). Он определен для двоичного класса со значениямиa
/b
как:
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
Эта двоичная энтропийная функция изображена на рисунке ниже (случайная величина может принимать одно из двух значений). Он достигает своего максимума, когда вероятность равна p=1/2
, что означает, что p(X=a)=0.5
или аналогичным образом вероятность p(X=b)=0.5
50% / 50% может быть равной a
или b
(неопределенность максимальна). Энтропийная функция находится на нулевом минимуме, когда вероятность равна p=1
или p=0
с полной уверенностью ( p(X=a)=1
или, p(X=a)=0
соответственно, последнее подразумевает p(X=b)=1
).
Конечно, определение энтропии можно обобщить для дискретной случайной величины X с N результатами (а не только двумя):
( log
в формуле обычно берется логарифм к основанию 2 )
Возвращаясь к нашей задаче классификации имен, давайте рассмотрим пример. Представьте себе, что в какой-то момент в процессе построения дерева мы рассматривали следующее разбиение:
ends-vowel
[9m,5f] <--- the [..,..] notation represents the class
/ \ distribution of instances that reached a node
=1 =0
------- -------
[3m,4f] [6m,1f]
Как видите, до раскола у нас было 9 мужчин и 5 женщин, т.е. P(m)=9/14
и P(f)=5/14
. Согласно определению энтропии:
Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403
Далее мы сравним это с энтропией, вычисленной после рассмотрения разделения, рассматривая две дочерние ветви. В левой ветке ends-vowel=1
мы имеем:
Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852
и правильная ветвь ends-vowel=0
, мы имеем:
Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917
Мы объединяем левую / правую энтропию, используя количество экземпляров по каждой ветви в качестве весового коэффициента (7 экземпляров пошли влево, а 7 экземпляров - вправо), и получаем окончательную энтропию после разделения:
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
Теперь, сравнивая энтропию до и после разделения, мы получаем показатель прироста информации , или сколько информации мы получили, выполнив разделение, используя эту особенность:
Information_Gain = Entropy_before - Entropy_after = 0.1518
Вы можете интерпретировать приведенный выше расчет следующим образом: выполнив разделение с помощью end-vowels
функции, мы смогли уменьшить неопределенность в результате прогнозирования поддерева на небольшое значение 0,1518 (измеряется в битах как единица информации ).
В каждом узле дерева этот расчет выполняется для каждого объекта, и объект с наибольшим выигрышем информации выбирается для разделения жадным образом (таким образом, отдавая предпочтение объектам, которые производят чистое разделение с низкой неопределенностью / энтропией). Этот процесс применяется рекурсивно от корневого узла и останавливается, когда конечный узел содержит экземпляры, имеющие один и тот же класс (нет необходимости разбивать его дальше).
Обратите внимание, что я пропустил некоторые детали, которые выходят за рамки этого поста, в том числе о том, как обрабатывать числовые функции , пропущенные значения , переоснащение и обрезку деревьев и т. Д.