Suponho que a entropia foi mencionada no contexto da construção de árvores de decisão .
Para ilustrar, imagine a tarefa de aprender a classificar os nomes em grupos de homens / mulheres. É fornecida uma lista de nomes, cada um com um m
ou outro f
, queremos aprender um modelo que se ajuste aos dados e possa ser usado para prever o sexo de um novo nome invisível.
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
O primeiro passo é decidir quais recursos dos dados são relevantes para a classe de destino que queremos prever. Alguns exemplos de recursos incluem: primeira / última letra, comprimento, número de vogais, termina com uma vogal, etc. Então, após a extração do recurso, nossos dados se parecem com:
# 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
O objetivo é construir uma árvore de decisão . Um exemplo de uma árvore seria:
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
basicamente, cada nó representa um teste realizado em um único atributo e vamos para a esquerda ou direita, dependendo do resultado do teste. Continuamos percorrendo a árvore até chegarmos a um nó folha que contém a previsão de classe ( m
ou f
)
Portanto, se rodarmos o nome Amro nessa árvore, começamos testando " é o comprimento <7? " E a resposta é sim , então seguimos pelo ramo. Após a ramificação, o próximo teste " é o número de vogais <3? " Novamente avaliado como verdadeiro . Isso leva a um nó de folha rotulado m
e, portanto, a previsão é masculina (o que acontece, a árvore previu o resultado corretamente ).
A árvore de decisão é construída de forma descendente , mas a questão é como você escolhe qual atributo dividir em cada nó? A resposta é encontrar o recurso que melhor divide a classe de destino nos nós filhos mais puros possíveis (ou seja: nós que não contêm uma mistura de ambos, masculino e feminino, nós bastante puros, com apenas uma classe).
Essa medida de pureza é chamada de informação . Representa a quantidade esperada de informações que seriam necessárias para especificar se uma nova instância (primeiro nome) deve ser classificada como masculino ou feminino, dado o exemplo que atingiu o nó. Nós o calculamos com base no número de classes masculinas e femininas no nó.
Entropia, por outro lado, é uma medida de impureza (o oposto). É definido para uma classe binária com valoresa
/b
como:
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
Esta função de entropia binária está representada na figura abaixo (a variável aleatória pode assumir um dos dois valores). Atinge seu máximo quando a probabilidade é p=1/2
, o que significa que, p(X=a)=0.5
ou similarmente, p(X=b)=0.5
tem 50% / 50% de chance de ser um a
ou outro b
(a incerteza é máxima). A função de entropia é no mínimo zero quando a probabilidade é p=1
ou p=0
com total certeza ( p(X=a)=1
ou p(X=a)=0
, respectivamente, o último implica p(X=b)=1
).
Obviamente, a definição de entropia pode ser generalizada para uma variável aleatória discreta X com N resultados (não apenas dois):
(o log
na fórmula geralmente é considerado o logaritmo da base 2 )
De volta à nossa tarefa de classificação de nomes, vamos ver um exemplo. Imagine que em algum momento do processo de construção da árvore, estávamos considerando a seguinte divisão:
ends-vowel
[9m,5f] <--- the [..,..] notation represents the class
/ \ distribution of instances that reached a node
=1 =0
------- -------
[3m,4f] [6m,1f]
Como você pode ver, antes da divisão, tínhamos 9 machos e 5 fêmeas, ou seja, P(m)=9/14
e P(f)=5/14
. De acordo com a definição de entropia:
Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403
Em seguida, comparamos com a entropia calculada após considerar a divisão observando dois ramos filhos. No ramo esquerdo de ends-vowel=1
, temos:
Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852
e o ramo direito de ends-vowel=0
, temos:
Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917
Combinamos as entropias esquerda / direita usando o número de instâncias em cada ramificação como fator de peso (7 instâncias foram para a esquerda e 7 instâncias foram para a direita) e obtemos a entropia final após a divisão:
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
Agora, comparando a entropia antes e depois da divisão, obtemos uma medida do ganho de informações ou quanta informação obtivemos ao fazer a divisão usando esse recurso específico:
Information_Gain = Entropy_before - Entropy_after = 0.1518
Você pode interpretar o cálculo acima da seguinte maneira: ao fazer a divisão com o end-vowels
recurso, conseguimos reduzir a incerteza no resultado da previsão de subárvore em uma pequena quantidade de 0,1518 (medida em bits como unidades de informação ).
Em cada nó da árvore, esse cálculo é realizado para cada recurso, e o recurso com maior ganho de informação é escolhido para a divisão de maneira gananciosa (favorecendo recursos que produzem divisões puras com baixa incerteza / entropia). Esse processo é aplicado recursivamente do nó raiz para baixo e para quando um nó folha contém instâncias todas com a mesma classe (não é necessário dividi-lo mais).
Observe que pulei alguns detalhes que estão além do escopo deste post, incluindo como lidar com recursos numéricos , valores ausentes , árvores de sobreajuste e poda , etc.