Supongo que la entropía se mencionó en el contexto de la construcción de árboles de decisión .
Para ilustrar, imagine la tarea de aprender a clasificar los nombres de pila en grupos de hombres / mujeres. Se le da una lista de nombres etiquetados con m
o con f
, o queremos aprender un modelo que se ajuste a los datos y se pueda usar para predecir el género de un nuevo nombre invisible.
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
El primer paso es decidir qué características de los datos son relevantes para la clase objetivo que queremos predecir. Algunas características de ejemplo incluyen: primera / última letra, longitud, número de vocales, termina con una vocal, etc. Entonces, después de la extracción de características, nuestros datos se ven así:
# 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
El objetivo es construir un árbol de decisión . Un ejemplo de un árbol sería:
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
básicamente cada nodo representa una prueba realizada en un solo atributo, y vamos a la izquierda o derecha dependiendo del resultado de la prueba. Seguimos atravesando el árbol hasta llegar a un nodo hoja que contiene la predicción de clase ( m
o f
)
Entonces, si ejecutamos el nombre de Amro en este árbol, comenzamos probando "¿ es la longitud <7? " Y la respuesta es sí , así que bajamos esa rama. Siguiendo la rama, la siguiente prueba " es el número de vocales <3? " Nuevamente se evalúa como verdadero . Esto lleva a un nodo hoja etiquetado m
y, por lo tanto, la predicción es masculina (que resulta ser, por lo que el árbol predijo el resultado correctamente ).
El árbol de decisión se construye de arriba hacia abajo , pero la pregunta es cómo elegir qué atributo dividir en cada nodo. La respuesta es encontrar la característica que mejor divide la clase objetivo en los nodos hijos más puros posibles (es decir, nodos que no contienen una mezcla de nodos masculinos y femeninos, sino nodos puros con una sola clase).
Esta medida de pureza se llama información . Representa la cantidad esperada de información que se necesitaría para especificar si una nueva instancia (nombre) debe clasificarse como masculina o femenina, dado el ejemplo que llegó al nodo. Lo calculamos en función del número de clases masculinas y femeninas en el nodo.
La entropía, por otro lado, es una medida de impureza (lo contrario). Se define para una clase binaria con valoresa
/b
as:
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
Esta función de entropía binaria se representa en la figura a continuación (la variable aleatoria puede tomar uno de dos valores). Alcanza su máximo cuando la probabilidad es p=1/2
, lo que significa que, p(X=a)=0.5
o de manera similar, p(X=b)=0.5
tiene un 50% / 50% de posibilidades de ser a
o b
(la incertidumbre es máxima). La función de entropía está en cero mínimo cuando la probabilidad es p=1
o p=0
con certeza completa ( p(X=a)=1
o p(X=a)=0
respectivamente, esto último implica p(X=b)=1
).
Por supuesto, la definición de entropía puede generalizarse para una variable aleatoria discreta X con N resultados (no solo dos):
(el log
en la fórmula generalmente se toma como el logaritmo de la base 2 )
Volviendo a nuestra tarea de clasificación de nombres, veamos un ejemplo. Imagínese en algún momento durante el proceso de construcción del árbol, estábamos considerando la siguiente división:
ends-vowel
[9m,5f] <--- the [..,..] notation represents the class
/ \ distribution of instances that reached a node
=1 =0
------- -------
[3m,4f] [6m,1f]
Como puede ver, antes de la división teníamos 9 hombres y 5 mujeres, es decir, P(m)=9/14
y P(f)=5/14
. Según la definición de entropía:
Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403
Luego lo comparamos con la entropía calculada después de considerar la división al observar dos ramas secundarias. En la rama izquierda de ends-vowel=1
, tenemos:
Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852
y la rama derecha de ends-vowel=0
, tenemos:
Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917
Combinamos las entropías izquierda / derecha usando el número de instancias hacia abajo de cada rama como factor de peso (7 instancias fueron a la izquierda y 7 instancias a la derecha), y obtenemos la entropía final después de la división:
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
Ahora, al comparar la entropía antes y después de la división, obtenemos una medida de la ganancia de información , o cuánta información obtuvimos al hacer la división usando esa característica particular:
Information_Gain = Entropy_before - Entropy_after = 0.1518
Puede interpretar el cálculo anterior de la siguiente manera: al dividir con la end-vowels
función, pudimos reducir la incertidumbre en el resultado de la predicción del subárbol en una pequeña cantidad de 0.1518 (medido en bits como unidades de información ).
En cada nodo del árbol, este cálculo se realiza para cada característica, y la característica con la mayor ganancia de información se elige para la división de una manera codiciosa (favoreciendo así las características que producen divisiones puras con baja incertidumbre / entropía). Este proceso se aplica de forma recursiva desde el nodo raíz hacia abajo y se detiene cuando un nodo hoja contiene instancias que tienen la misma clase (no es necesario dividirlo más).
Tenga en cuenta que omití algunos detalles que están más allá del alcance de esta publicación, incluido cómo manejar características numéricas , valores faltantes , sobreajustar y podar árboles, etc.