Un árbol de decisión binario es un grado $G=(V,A)$ dónde, $V$ son los nodos y $A$ las ramas de pares de nodos ordenados dónde:
Cada nodo representa una pregunta característica (dimensión de los datos)
Cada rama representa una decisión sobre la pregunta
Podemos pensar que con forme atravesamos el árbol vamos filtrando los datos
¿Cómo hacemos que cada pregunta sea la más informada?
¡Entropía!
La entropía mide la incertidumbre de tomar una decisión aleatoriamente
$$ H(t) = -\sum_{i=1}^lP(t=i)log_2(P(t=i)) $$¿Cómo hacemos que cada pregunta sea la más informada?
Cambia
¿Cómo escogemos un pregunta que reduzca la entropía?
Entropía de todo el dataset
$$ H(\mathcal{D},Y)=-\sum_{y\in \tau(Y)} P(Y=y)\cdot log_2(Y=y) \\ $$Entropía de una parte del dataset con respecto a una característica $F$
$$ R(\mathcal{D},F)=-\sum_{f\in \tau(F)} \frac{|\mathcal{D}_{F=f}|}{|\mathcal{D}|} \cdot H(\mathcal{D}_{F=f},Y) \\ $$Que diferencia hay entre la entropía del dataset comparada con la respecto la característica $F$
$$ IG(\mathcal{D},F) = H(\mathcal{D},Y)-R(\mathcal{D},F)\\ $$Entrada: $X$, $Y$ con $X={f_1,...,f_m}i$ y $Y$ con $k$ clases
Salida: Árbol de decisión
def id3(X,Y):
if total_clases(Y)=1:
return node(class(Y))
elif total_feature(X)==0:
return node(most_frequent(Y))
else:
F_i = argmax(F,IG(X,F))
for f in values(F_i):
tree.add(brach(f))
X_f,Y_f=X[F_i=f/F_i]
tree[f].add(id3(X_f,Y_f))
return tree
Uso de bins
Uso de umbral
Remplazamos $H(\mathcal{D},Y) \rightarrow S(Y)$ i.e., desviación estándar
Remplazamos $R(Y,F) \rightarrow S(Y,F)$ i.e., desviación estándar de $Y$ dado $F$ $$ S(Y,F)=\sum_{f\in\tau(F)}P(f)S(Y_f) $$
Remplazamos $IG(\mathcal{D},F) \rightarrow SDR(Y,F)$ i.e., reducción de desviación estándar $$ SDR(Y,F)=S(Y)-S(Y,F) $$
Porcentaje de las reducción
Se regresa el promedio
Pre o post podado
Podemos pensar que cada modelo que entrenamos es un experto
Si tenemos múltiple expertos...los podemos preguntar por su opinión dada una entrada $X$
Para una entrada $X$ y una colección de $B$ expertos $f$ $$y=f_1(X)\bigoplus f_2(X)\bigoplus \ldots \bigoplus f_B(X)$$
La probabilidad para que un ensamble de clasificadores de tamaño $B$ nos de la respuesta correcta
$$\sum_{B/2+1}^B \left(\begin{matrix} B\\k \end{matrix}\right) p^k(1-p)^{B-k} $$Con $p>0.5$ si $B\rightarrow \infty$ entonces la se acerca a 1.0, con cien un buen trabajo
Tenemos $B$ datasets del mismo fenómenos y una metodología
Tenemos $B$ metodologías y un dataset
Una metodologías y un dataset, bootstrap
Bagging para regresión $$f_{avg}(X)=\frac{1}{B} \sum_{b=1}^B f_b(X) $$
Voting para classificación $$f_{avg}(X)= \begin{cases} 1, & if \frac{1}{B} \sum_{b=1}^B f_b(x) \leq 0.5 \\ 0, & otherwise \end{cases}$$
Un conjunto de árboles de decisión, un bosque
$B$ Boostraps para el dataset
Cada pregunta se decide del la característica más informativa de entre $p$ características aleatoria
Entrada: $X$, $Y$ con $X={f_1,...,f_m}i$ y $Y$ con $k$ clases, $B$ y $p$
Salida: Un bosque ${T_i}_b^B$
def random_forest(X,Y,B,p):
for b=1 to N do
X_b,Y_b set to boostrap(n,X)
T_b set to random_tree(X_b,Y_b,p)
Entrada: $X$, $Y$ con $X={f_1,...,f_m}i$ y $Y$ con $k$ clases y $p$
Salida: Un bosque ${T_i}_b^B$
def random_tree(X,Y,p):
if total_clases(Y)=1:
return node(class(Y))
elif total_feature(X)==0:
return node(most_frequent(Y))
else:
F_p = random_feature(X,p)
F_i = argmax(F_p,IG(X,F_p))
for f in values(F_i):
tree.add(brach(f))
X_f,Y_f=X[F_i=f/F_i]
tree[f].add(random_tree(X_f,Y_f))
return tree
Entrada: $X$, $Y$ con $X={f_1,...,f_m}i$ y $Y$ con $k$ clases, $B$ y $p$
Salida: Un bosque ${T_i}_b^B$
def random_forest(X,Y):
for b=1 to N do
X_b set to boostrap(n,X)
T_b set to id3(X_b,Y,p)