aplicacion de algoritmos genéticos con mapeo

Anuncio
APLICACION DE ALGORITMOS GENÉTICOS
CON MAPEO GENOTIPO-FENOTIPO
NO TRIVIAL
PARA ENCONTRAR
REDES NEURONALES ÓPTIMAS
A. H. Llarena
Instituto de Matemáticas Aplicadas a Sistemas (IIMAS), UNAM.
Circuito Escolar, Ciudad Universitaria
México D.F. C.P. 04510
Extracto: Las aplicaciones de las redes neuronales son amplias y variadas, sin embargo uno de
los problemas principales que se presentan durante el proceso de diseño lo constituye el factor de
diseño de la arquitectura de la red neuronal, ya que el hecho de introducir a la red información
irrelevante o poco relacionada con la salida de la misma introduce ruido y complica los
procedimientos de entrenamiento y prueba. En este artículo nos damos a la tarea de utilizar
algoritmos genéticos para encontrar una topología que inhiba o anule aquellas variables de
entrada que tengan poca o nula repercusión en la salida de la red neuronal, también se explica la
importancia de encontrar una función de fitness adecuada para medir el desempeño de la red, ya
que, dependiendo del tipo de función definida, el algoritmo genético nos entregará topologías que
proporcionen el mayor rendimiento para ese tipo específico de evaluación de la red Por último se
analizarán los resultados obtenidos utilizando un mapeo genotipo-fenotipo no trivial para
encontrar una red que pueda predecir los casos en que un probable comprador adquiera una póliza
de seguros basados en información socio-económica del mismo.
Palabras Clave: Redes neuronales – Algoritmos genéticos – Predicción – Mapeo genotipofenotipo no trivial
1
1. Introducción:
Uno de los problemas actuales en el desarrollo de redes neuronales capaces lo constituye el hecho
de que no existen reglas precisas sobre cómo diseñar la arquitectura de una red, ya que su
funcionamiento depende de una serie de factores (tipo de neuronas, función de activación,
número de entradas, factor de aprendizaje, etc.) que hacen difícil evaluar hasta qué grado el
desempeño depende de la arquitectura sugerida. En la mayoría de los casos se trabaja por prueba
y error, es decir, se diseña una arquitectura, se entrena, se prueba, si no tiene buen rendimiento se
tira y se comienza nuevamente el proceso.
Lo que sí sabemos es que el hecho de introducir información irrelevante para la red, además de
complicar el diseño de la misma, introduces un factor de ruido y retrasa considerablemente el
tiempo de aprendizaje ya que la red debe “aprender” a ignorar dicha información.
Una alternativa a este proceso consiste en utilizar algoritmos genéticos para obtener una
codificación de la arquitectura de la red dentro de un “gen” o individuo, que integre dentro de su
cadena las posibles conexiones de las variables que constituyen los datos de entrada, a cada una
de las neuronas de la capa intermedia de la red. Dicho individuo podrá ser evaluado construyendo
la red correspondiente a su codificación, realizando el proceso de aprendizaje (dentro de un límite
de épocas, por supuesto) y probando el desempeño final de la red con un conjunto de prueba.
Un factor primordial en este proceso lo constituye el hecho de que, para que algoritmo genético
funcione correctamente, el fitness de un individuo debe ser siempre el mismo. Para lograr lo
anterior se deberá tener cuidado de mantener iguales los valores iniciales de los pesos de la red,
el factor de aprendizaje, conjuntos de entrenamiento y prueba, etc.
Por otro lado, recientemente se efectuó un concurso denominado “Coil Challenge 2000”1 para
encontrar de una base de datos de 5300 personas aproximadamente, aquellas con la mayor
probabilidad posible de adquirir una póliza de seguros y analizar de aquellas que ya han adquirido
esta póliza los factores que influyeron en su compra. Para tal efecto se proporcionaron un
conjunto de 4000 datos de entrenamiento y 5200 datos de prueba. Retomaremos dicho problema
para encontrar, mediante selección, recombinación y mutación, aquella red que, luego de ser
entrenada en cierto tiempo, proporcione la mayor cantidad posible de predicciones acertadas.
Para tal efecto limitaremos los datos de entrada a las variables:
PPERSAUT, APERSAUT, PBRAND, ABRAND, MGODRK, MOPLMIDD, MBERMIDD, MSKC,
MZFONDS, MFGEKIND, MGEMOMV y MGODGE
y como salida la variable CARAVAN.
2
2. Aplicación de Algoritmos Genéticos para Encontrar una Red Neuronal Óptima
Determinación de parámetros libres y estructura del genotipo
El primer paso consiste en saber qué parámetros del diseño de la arquitectura de la red deseamos
dejar libres para ser incluidos en un genotipo, una posibilidad consiste en dejar fija la estructura
interna de una red y modificar únicamente las conexiones de la capa de entrada, por ejemplo se
puede diseñar una estructura de red neuronal con 12 neuronas (variables) de entrada, 4 neuronas
(permanentemente conectadas) en la capa intermedia y una neurona de salida:
Capa de Salida
Capa
Intermedia
1
2
3
4
5
6
7
8
9
10
11
12
Capa de Entrada
Figura 1. Una arquitectura de Red Neuronal
Ahora debemos definir el genotipo y el fenotipo, para nuestro ejemplo el genotipo consiste en una
cadena de 8 x 4 = 32 bloques de 4 letras, donde cada letra constituye la codificación (desde “a”
hasta “h”) de uno de los ocho posibles valores utilizando 3 bits (0..7), en total cada bloque
contiene 3 x 4 = 12 bits, y cada bit del bloque i indica si la variable de entrada correspondiente
(1..12) se encontrará conectada a la neurona i de la capa intermedia. Como puede apreciarse
existe una diferencia de 4 bloques ya que la capa intermedia únicamente tiene 4 neuronas,
entonces ¿qué significa ésto?
Mapeo Genotipo-Fenotipo No Trivial
Si en nuestro ejemplo utilizáramos una cadena de 4x4 = 16 bloques de 4 letras y cada bloque
correspondiese a las conexiones de la neurona intermedia con cada una de las 12 variables de
entrada, hablaríamos de un mapeo genotipo-fenotipo trivial, esto es: el genotipo constituye la
información genética completa de un individuo (las 32 letras en nuestro ejemplo), mientras que el
3
fenotipo constituye las características observables que produce dicha representación (las
conexiones entre las neuronas de la capa de entrada y la capa intermedia); al hablar de un mapeo
trivial implica que cada cambio en el genotipo (a nivel bit inclusive) repercute directamente en
una característica observable (una conexión aparece o desaparece) y que cada genotipo constituye
en si mismo un tipo de arquitectura diferente de los demás genotipos. De este modo, si se tienen
N características observables, entonces con 2^N genotipos se cubrirían todas las posibles
combinaciones, sin embargo el propósito del presente artículo consiste en explorar qué sucede
cuando el mapeo es no-trivial, es decir, se tiene información extra dentro del genotipo y la
construcción del fenotipo (las conexiones entre las neuronas en nuestro ejemplo) no es directa.
En lugar del mapeo trivial se propone la siguiente codificación:
Bloque 1
Bloques
Constructores
Bloque 2
g
a = 000
b = 001
c = 010
d = 011
e = 100
f = 101
g = 110
h = 111
a
c
d
d
Bloque 3
a
Bloque 4
Bloque 6
b
Bloque 7
f
h
c
f
f
a c
d h
g d
a b
c f
f a
f e
e a
a
d
c
f
Neurona 1
Bloque 5
c
h
f
a
g
a
f
e
e
Bloque 8
e
a
a
d
b
e
a
Neurona 2
Neurona 4
Neurona 3
entradas 1
entradas 2
000 010 110 011
011 110 000 001
entradas 3
010 101 101 100
Figura 2. Mapeo Genotipo-Fenotipo no Trivial
4
entradas 4
101 000 100 000
Como se observa en la figura el primer paso consiste en tomar el primer bloque y observar cada
una de las 4 letras que lo componen, como sabemos cada letra tiene 8 posibilidades (“a”..”h”). Si
nombramos los 8 bloques que forman el genotipo como “a” el primero hasta “z” el último,
entonces por cada letra del primer bloque del genotipo (“acdh” en el ejemplo) vamos a tomar el
correspondiente bloque (de los ocho) que aparece referenciado (bloques 1,3,4 y 8). Enseguida se
forman 4 matrices de 2 x 2 poniendo en la parte superior las primeras 2 letras de cada bloque y
abajo las siguientes 2 letras. A continuación se colocan forma una matriz de 2x2 donde los 2
elementos superiores son las primeras 2 matrices construidas (a partir de los bloques 1 y 3 en el
ejemplo) y en la parte inferior las otras 2 (a partir de bloques 4 y 8). Una vez que se tiene este
arreglo matricial se toma cada renglón de la matriz resultante (de 4 x 4 elementos) para
conformar las entradas de cada neurona de la capa intermedia, dado que cada renglón tiene 4
letras y cada letra corresponde a 3 bits, en total por cada renglón se tienen 12 bits que
corresponde exactamente al numero de variables (neuronas) de la capa de entrada.
Como puede apreciarse, este tipo de mapeo resulta interesante ya que produce muchas
posibilidades de genotipos que conforman el mismo tipo de fenotipo (conexiones entre neuronas
en el ejemplo) y posee información que podría parecer redundante o inútil, sin embargo como en
nuestro caso vamos a utilizar procedimientos de recombinación y mutación, dicha información
podría ser activada por estos procesos con lo cual dejaría de ser irrelevante e influiría
directamente en el fenotipo observado.
Construcción de la Red Neuronal Adaptable
Una vez desarrollada la función de mapeo genotipo-fenotipo, el siguiente paso consiste en
desarrollar una estructura que permita crear una red neuronal a partir del fenotipo encontrado,
como alternativas tenemos el uso de software comercial (MathLabtm por ejemplo) o el desarrollo
en algún lenguaje de programación de alto nivel (c, c++, java, etc.). Se cual sea la herramienta de
desarrollo se deberá tomar en cuenta que, dado que se desea anular completamente las entradas a
la capa intermedia de la red, tanto el software comercial como el programa elaborado deberán ser
capaces de hacer esto, ya que se podría pensar que con solo fijar el peso de la conexión en cero se
anularía su efecto, esto es cierto, pero sólo si el algoritmo de retro-propagación utilizado para
entrenar la red es capaz de no modificar los valores de dichos pesos se logrará el resultado
esperado.
Si la opción elegida es el lenguaje de programación de alto nivel se deberá partir de un tipo de
datos “neurona” definido por el usuario:
X1
Neurona
X2
Xn
Σ Xi * Wi
Figura 3. Tipo de Datos / Clase “Neurona”
5
Y
A continuación es posible definir un tipo de objeto “layer” o capa, esto se recomienda por
cuestiones de reutilización de código y por facilidad de añadir capa tras capa a la red.
Layer
Entradas
Salidas
X
1X
2X
n
X
1X
2X
n
Neu
rona
ΣX
Neu
i*
rona
Wi
ΣX
i*
Wi
Neu
rona
X
1X
2X
n
Y
Y
Y
ΣX
i*
Wi
Una cuestión primordial será el hecho de que la implementación deberá permitir especificar al
momento de crear la capa de neuronas a qué entrada se conectará cada neurona de la capa, esto
puede hacerse mediante una matriz de conexión neurona / entrada ó simplemente pasando a cad
neurona la lista de entradas a las cuales se conecta al momento de su creación y dejando que cada
neurona realice las conexiones.
Figura 4. Tipo de Datos / Clase “Layer”
Una vez se tenga el tipo “layer” podemos unir varias capas para formar la red neuronal (2 para
nuestro ejemplo), las cosas se facilitan si, como lo hicimos al principio, se establece que todas las
salidas de la capas intermedias (si hubiere más de una) se encuentran permanentemente
conectadas, de no ser así el mapeo genotipo-fenotipo debería proporcionar dicha información.
Layer 1
Entradas
Salidas
Entradas
X
X
1
2X
X
n
X
1
2X
n
X
X
1
2X
n
N
eu
ro
na
N
eu
ro
Σ
na
Layer 2
Y
Y
X
Σ
N
i
Y
eu
*
ro
X
na
W
i 5. Red Neuronal
Figura
i
*
Σ
W
6
i
X
i
X
X
1
2X
n
N
eu
ro
na
Σ
X
i
*
W
i
Sal
ida
Y
Una vez se tenga la estructura que pueda construir la red neuronal a partir de la información
extraída del genotipo, se deberán establecer los parámetros de entrenamiento y prueba de la red
neuronal.
Entrenamiento y Prueba de la Red Neuronal Adaptable
El algoritmo utilizado para entrenar redes neuronales más ampliamente difundido es retropropagación, sin embargo, como sabemos éste se basa en el cálculo del error cuadrático entre las
salidas reales y las salidas esperadas de la red. Dado lo anterior, es necesario analizar previamente
la información de entrada que recibirá la red, ya que, en muchos casos, no son tan importantes
para nosotros (la aseguradora por ejemplo) los casos en los cuales la red predice una salida
verdadera y en realidad era falsa (falsos positivos) como cuando predice una salida falsa y ¡en
realidad era verdadera! (falsos negativos). Si no tomamos en cuenta lo anterior el entrenamiento
mediante retro-propagación siempre tomará por igual cualquier tipo de error y continuará
avanzando hasta hacerlo mínimo. Cabe aclarar que, aunque no podemos modificar el algoritmo
de retro-propagación para dar preferencia a alguno de los dos tipo de error, sí podemos
determinar en qué momento del entrenamiento hemos obtenido una red suficientemente capaz de
cubrir nuestras expectativas, en éste punto podremos detener el aprendizaje y pasar a la fase de
pruebas.
Un factor primordial lo constituye el valor inicial de los pesos. Aunque sabemos que si definimos
pesos iniciales aleatorios es más fácil realizar el entrenamiento, esto no nos conviene en nuestro
caso ya que si definimos un límite de épocas (veces que se presenta completo el conjunto de
entrenamiento a la red) el mismo genotipo tardará más o menos tiempo en ser entrenado
dependiendo de los pesos que le tocaron, de tal suerte que al momento de ser evaluado tendrá
distintos valores de fitness según los pesos que le tocaron al momento de ser entrenado. De esta
forma conviene fijar los pesos iniciales de la red en algún valor, pero ¿cuál, 0, 1, -1, ...?.
En este punto conviene examinar los datos de entrada. Lo primero que hay que hacer es
normalizarlos, es decir, ponerlos en un rango determinado (-1 a 1 por ejemplo) esto se logra
estableciendo un máximo, un mínimo y un valor medio para cada variable de entrada, luego se
encuentra qué valor le corresponde dentro de dicho rango a cada valor de la variable en cuestión.
Enseguida tenemos que observar las salidas, si existe una gran cantidad de salidas negativas
(como en el caso de la predicción de compra de pólizas, véase introducción), conviene fijar los
pesos iniciales en cero, ya que el algoritmo de retro-propagación arrancará con un alto índice de
predicción y poco a poco comenzará a predecir los casos positivos. En caso contrario, si existe
una mayor cantidad de salidas verdaderas, conviene fijar los pesos iniciales en uno para que la red
prediga de entrada una gran cantidad de casos positivos y poco a poco encuentre los negativos.
En caso de no tomar lo anterior en cuenta, dado que impusimos un límite al entrenamiento, la red
va a perder la mayor parte del tiempo en reducir la mayoría de los casos que no nos interesan y
nos va a dar un pobre desempeño.
7
Evaluación del Desempeño de la Red Neuronal y Función de Fitness
En la fase de pruebas se alimenta nuevamente la red con nuevos datos (conjunto de prueba) y se
mide el error resultante entre las predicciones de la red y las salidas reales.
Para el caso del concurso “Coil Challenge 2000”1 (véase introducción) nuestros conjuntos de
entrenamiento y prueba poseen una enorme cantidad de casos falsos (90%). Si observamos lo
anterior notaremos que una red que prediga en cualquier caso una salida falsa tendrá el 90% de
aciertos, por lo tanto el error cuadrático medio de la red no constituye un buen parámetro de
medición, a continuación se proponen 2 alternativas:
1) Tomar la medida del desempeño de la red como
(Positivos Verdaderos)/(Positivos Verdaderos + Falsos Positivos)
En este caso se está calculando la relación entre las salidas verdaderas predichas y el
total de salidas verdaderas predichas. Desafortunadamente
2) Asignar una función de costo-beneficio
Consiste en asignar un valor (positivo o negativo) a cada caso predicho (Positivos
Verdaderos, Falsos Positivos, Negativos Verdaderos y Falsos Negativos). A
continuación se multiplica el número de predicciones totales de cada rubro hechas por
la red por su correspondiente valor y se hace la suma. Para encontrar la medida de
desempeño de la red se calcula la máxima pérdida y máxima ganancia posible (en
función de las salidas reales) y se establece una ecuación de correspondencia entre el
valor proporcionado por la red (en el rango del peor al mejor) y el valor del
desempeño que le deseamos asignar (puede ir de –1 a 1). Hablamos de una función de
costo porque involucra directamente las pérdidas o ganancias relacionados con cada
aseveración de la red. Al tratar de maximizarla estaríamos tratando de igual forma de
alcanzar la máxima ganancia posible.
Función de Costo-Beneficio
----------------------------------------Positivos Verdaderos : + $ 20.00
Falsos Positivos:
- $ 2.00
Negativos Verdaderos :
$ 0.00
Falsos Negativos:
$ 0.00
Desempeño
/ Fitness
1
Máxima
Pérdida
Análisis de información de prueba
----------------------------------------Positivos Reales : 300
Negativos Reales : 2700
----------------------------------------Máxima Ganancia : 300 * $20.00
= $6,000.00
Máxima
Ganancia
Ganancias /
Pérdidas de
la Red
-1
Máxima Pérdida : 2700 * - $2.00
20.00 = - $ 7,400.00
Figura 6. Función Costo-Beneficio para el caso Coil Challenge 2000
8
Desarrollo del Algoritmo Genético
En este punto ya contamos con una estructura que permita crear y evaluar una red neuronal a
partir de un genotipo dado, estamos listos para implantar el algoritmo genético que maximice el
desempeño de la red.
1) Población inicial .- Establecer una población inicial suficiente pero no muy extensa (30
individuos por ejemplo).
2) Valuación de la población inicial.- Con base en la función de fitness determinada,
evaluar al total de la población inicial
3) Criterio de Selección.- Utilizar algún criterio de selección (los 10 mejores por ejemplo).
4) Actuar con recombinación.- Generar el resto de la población mediante algún tipo de
recombinación (de 1 punto ó 2 puntos p.ej).
5) Actuar con mutación.- Incluir un factor de mutación que permita que aparezcan nuevas
características en la población.
6) Evaluar nuevamente a la población y repetir desde (3) hasta alcanzar un máximo fitness
previamente definido
7) Minimos Locales: En ocasiones el algoritmo puede quedar atrapado dentro de un mínimo
local si todos los individuos tienen el mismo fitness o tenemos una población homogénea,
en este caso conviene aumentar dramáticamente la probabilidad de mutación para que
comiencen a generarse alteraciones en los individuos.
Como resultado de aplicar el algoritmo anterior, luego de algunas generaciones se pretende
obtener un individuo con un alto fitness , si el proceso se repite varias ocasiones, podemos tener
una población que implique en el fenotipo las conexiones que deben ser puestas o removidas de
la red neuronal, indicando con ello las variables que no influyen en el entrenamiento y prueba de
la misma.
Ejemplo “Coil Challenge 2000”
Para el problema de la predicción de compras de pólizas se elaboró un programa en Microsoft
Visual C++ para implementar la red neuronal, los procedimientos de entrenamiento y prueba y
para implementar el algoritmo genético.
a) Inicialmente se procesaron los conjuntos de entrenamiento (5822 registros) y prueba (4000
registros) normalizando los valores de –1 a 1
9
c) Se implementó el genotipo mostrado en el presente artículo utilizando las siguientes variables
en el orden en que se muestran:
1
PPERSAUT
Contribution car policies
2
APERSAUT
Number of car policies
3
PBRAND
Contribution fire policies
4
ABRAND
Number of fire policies
5
MGODRK
Roman catholic
6
MOPLMIDD
Medium level education
7
MBERMIDD
Middle management
8
MSKC
Social class C
9
MZFONDS
National Health Service
10
MFGEKIND
Household without children
11
MGEMOMV
Avg size household
12
MGODGE
No religion
Figura 7. Variables de entrada para el caso Coil Challenge 2000
c) Se elaboró un módulo que acepta un genotipo y aplica la función de mapeo genotipo-fenotipo
para construir una red neuronal con las conexiones establecidas.
d) Se implementó como función de fitness la función de costo-beneficio mostrada en la figura 6.
e) Posteriormente se implementó una rutina de entrenamiento que toma el conjunto de
entrenamiento, lo evalúa con la red y aplica retro-propagación un número finito de ocasiones (30
épocas como mínimo). En cada época se va midiendo el fitness o desempeño de la red de acuerdo
a nuestra función de costo. Al final del entrenamiento la rutina nos informa el número de época
con el mejor fitness para el conjunto de entrenamiento.
f) Se creó una población inicial de 30 individuos
g) Se evalúa la población de la siguiente forma
i. Se crea la red neuronal con el genotipo
ii. Se entrena la red con el conjunto de entrenamiento
iii. Se hace “Rollbak” en la red neuronal, es decir, devolvemos la red hasta el
estado reportado como de “mejor fitness” para el conjunto de
entrenamiento. Una vez hecho esto se evalúa el fitness de la red con el
conjunto de prueba. y se asigna dicho fitness al individuo
al final de cada generación se encuentra el fitness promedio de la población.
10
h) Se ordenan los individuos de acuerdo a su fitness
i) Se seleccionan los 10 individuos con mejor fitness
j) Los restantes 20 nuevos individuos se generan por recombinación del primero con el último
fitness, el segundo con el penúltimo y así suceivamente.
k) Se implementa mutación para el total de la población (factor de 0.15). En caso de que el fitness
promedio se haya estancado se aumenta el factor de mutación a 0.8 para una generación.
l) Se repite el proceso desde el inciso c) hasta llegar a un límite de 30 generaciones.
m) Se muestra el mejor individuo y su mejor fitness.
Resultados “Coil Challenge 2000”
Se aplicó el procedimiento anterior con 20 generaciones y 30 épocas de entrenamiento por cada
red, se muestra los resultados en la primera y última (20) generación
Generation
Gen 0:( fgab
Gen 1:( dhde
Gen 2:( faca
Gen 3:( fhfc
Gen 4:( haha
Gen 5:( cgch
Gen 6:( cdgf
Gen 7:( gffa
Gen 8:( fdbh
Gen 9:( ghch
Gen 10:( hgba
Gen 11:( ffbb
Gen 12:( geab
Gen 13:( cbba
Gen 14:( bgff
Gen 15:( bdba
Gen 16:( gccc
Gen 17:( haae
Gen 18:( gbhf
Gen 19:( aheh
Gen 20:( fche
Gen 21:( cdef
Gen 22:( ffhd
Gen 23:( aeab
Gen 24:( bceb
Gen 25:( ahfg
Gen 26:( daeb
Gen 27:( hcea
Gen 28:( hhbe
Gen 29:( bbcb
0 ...
adga acaa
gfdf baba
daah fbed
bged geeb
eceb hgeg
edba acfd
cagg ecdf
hfed bhaf
heah agfh
egha gcfa
bdaa daec
fadh bbhb
cabe hded
gffc gdfe
aaca egaa
ggeb hfdf
ggdg faga
bhfb cgah
agde bdgh
aahb hdah
aefc egff
heae eebh
hfgh fcff
ffgb bfaf
edaf hgeh
hfhg ghdd
gfch bfda
deba bfhg
hdhb adhh
ahce cabb
hgge
bdgb
faee
echg
bdch
ahhh
bdhb
fheg
efag
fbcf
hdhe
hdfg
cfge
fgde
cfaf
fehh
haab
chad
hchg
eeha
abcg
dcfe
bach
hhcf
bfec
cchh
fchh
dagd
ggaa
fdff
agfe
fcga
dhee
fgfb
chea
cabe
dgbg
ebaa
bfee
hhdg
afha
bbaf
dhdb
afba
abdf
dcfe
haac
fgee
acgh
hbgh
dadc
dbcg
hdfa
cfba
eedd
addh
cdaf
edhc
bchh
ccgd
hfdf
hfad
adfh
afag
gfae
feah
bbbd
adhh
degh
ehfc
fccg
fahb
gbfc
gdha
cgad
bcab
affc
bchh
cdgh
ddfe
agae
acgd
ecca
ebgg
heaf
bega
bcab
eedd
eaga
gghd
gfbd
ghbe
ceea
addh
badf
egge
aeda
cdad
aahb
dghg
dheg
hcce
dhhg
hbha
deeh
aagb
ffhc
hacb
egge
aaga
agde
hhea
hheb
acfa
hbfd
aegc
gach
ebhh
dcae
hdfa
defa
bach
ehfb
hfgd
ghae
abac
bceh
adba
ehbg
fdga
aaah
eaee
ehah
dcaa
hfhd
hadh
hchh
hche
hcgc
hhdc
effa
fgef
gfbg
fhbg
fcga
abgb
aahh
aecc
hhad
face
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
0.0135
0.0245
0.0236
0.0135
0.0141
0.0135
0.0290
0.0212
0.0147
0.0206
0.0135
0.0135
0.0212
0.0214
0.0204
0.0174
0.0228
0.0235
0.0216
0.0135
0.0169
0.0171
0.0253
0.0135
0.0256
0.0135
0.0222
0.0135
0.0169
0.0198
Fitness Average: 0.0187
Best Generation Gen: ( cdgf cagg ecdf bdhb dgbg bbbd aeda bceh )
Phenotype: [ 100010001011 011101111001 000100001001 011000001011 ]
11
Generation
Gen 0:( dhdh
Gen 1:( dhdh
Gen 2:( dhdh
Gen 3:( dhdh
Gen 4:( dhdh
Gen 5:( dhdh
Gen 6:( dhdh
Gen 7:( dhdh
Gen 8:( dhdh
Gen 9:( dhdh
Gen 10:( dhdh
Gen 11:( dhdh
Gen 12:( dhdh
Gen 13:( dhdh
Gen 14:( dhdh
Gen 15:( dhdh
Gen 16:( dhdh
Gen 17:( dhdh
Gen 18:( dhdh
Gen 19:( fehh
Gen 20:( fhdh
Gen 21:( dhdh
Gen 22:( dhdh
Gen 23:( fhdh
Gen 24:( dhdh
Gen 25:( dhdh
Gen 26:( cddh
Gen 27:( dhdh
Gen 28:( dhdh
Gen 29:( dhdh
29 ...
aahb hdah
aahb hdah
aahb hdah
aahb hdah
aagf hdah
aahb hdah
aahb hdah
aagf hdah
aahb hdah
aahb hdah
aahb hdah
aagf hdah
aahb hdah
aahb hdah
aahb hdah
aahb hdah
aahb hdaf
aahb hdah
aagf hdah
aahb hdah
aahb hdah
aahb hdah
aahb hdah
aabb hdah
aehf hdah
aagb hdah
aagb hdah
aahb hdah
aabb hdah
aahb hdah
bfea
bfea
bdea
bdea
bdea
bdea
bdea
bdea
bdea
bdea
bfea
bdhb
bfea
bdhb
bdeb
bdha
bfhb
bdea
bdea
bdea
bdea
bdeb
bdeb
bdea
bdea
fdeb
bfea
bdea
bdeb
bdea
fcga
fcga
fcga
fcga
fcga
fcge
fcga
fcga
fcga
fcba
fcga
fcga
fcga
dgga
fcga
dcga
fcga
fcge
fcge
fcga
fcge
cfaa
fcga
fcga
fcga
fcea
fcga
fcgc
fcba
fcga
heaa
heaf
heaa
heaa
heaa
heaf
heaa
heaa
heaa
heaf
heaa
heaa
heaa
heaf
heaa
heaf
heaa
heaa
heaf
heaa
heaf
hfaa
heaa
heaf
heaf
heaa
heaa
heaf
heaf
heaf
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aeda
heda
aeda
aeda
ahhe
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aeda
aehe
aeda
aeda
aeda
aeda
heda
aeda
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bach
bacg
bach
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
Fitness
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
0.0991
0.0991
0.0836
0.0836
0.0836
0.0836
0.0836
0.0836
0.0836
0.0836
0.0991
0.0135
0.0991
0.0135
0.0830
0.0251
0.0135
0.0836
0.0836
0.0171
0.0135
0.0830
0.0830
0.0135
0.0836
0.0174
0.0178
0.0836
0.0178
0.0836
Fitness Average: 0.0632
Best Generation Gen: ( dhdh aahb hdah bfea fcga heaa aeda bach )
Phenotype: [ 001101001000 100000010111 001101001000 100000010111 ]
Best Fitness:
0.0991
Training...:
Time
No
R +
R T +
F +
T F Error
Perform
1
5822
238
3762
0
0
3762
238
0.060 0.014
2
5822
238
3762
0
0
3762
238
0.060 0.014
3
5822
238
3762
0
0
3762
238
0.060 0.014
4
5822
238
3762
46
390
3372
192
0.060 0.099
5
5822
238
3762
23
132
3630
215
0.060 0.073
6
5822
238
3762
8
38
3724
230
0.069 0.036
7
5822
238
3762
4
12
3750
234
0.075 0.027
8
5822
238
3762
3
8
3754
235
0.080 0.024
9
5822
238
3762
1
3
3759
237
0.086 0.017
10
5822
238
3762
0
2
3760
238
0.093 0.013
11
5822
238
3762
0
1
3761
238
0.094 0.013
12
5822
238
3762
0
1
3761
238
0.092 0.013
13
5822
238
3762
0
0
3762
238
0.090 0.014
14
5822
238
3762
0
0
3762
238
0.089 0.014
15
5822
238
3762
0
0
3762
238
0.088 0.014
16
5822
238
3762
0
0
3762
238
0.087 0.014
17
5822
238
3762
0
0
3762
238
0.086 0.014
18
5822
238
3762
0
0
3762
238
0.085 0.014
19
5822
238
3762
0
0
3762
238
0.084 0.014
20
5822
238
3762
0
0
3762
238
0.084 0.014
Best Train: 4 , Best Performance : 0.099
Training...:
Time
No
R +
R T +
F +
Perform
1
5822
238
3762
0
0
2
5822
238
3762
0
0
3
5822
238
3762
0
0
4
5822
238
3762
46
390
12
T -
F -
Error
3762
3762
3762
3372
238
238
238
192
0.060
0.060
0.060
0.060
0.014
0.014
0.014
0.099
A continuación se muestran algunos individuos obtenidos luego de varias corridas del programa:
Gen´s Name
Fitness
T+
F+
T-
F-
( dhdh aahb hdah bfea fcga heaa aeda bach )
0.0991
46
Phenotype: [ 001101001000 100000010111 001101001000 100000010111 ]
390
3372
192
( gegg hafa eefd dfca caah gdee afce dfff )
0.0800
38
Phenotype: [ 000101010000 010100000111 000101000101 010100010100 ]
338
3424
200
( ghhh fbeh echg bdec ffbh hfhg baaa decf )
0.0606
41
Phenotype: [ 001000011100 000000010101 011100011100 010101010101 ]
456
3306
197
( chch hacg cfag bdbb hgfa ffdd fgcd dbde )
0.0719
111
Phenotype: [ 010101011001 000110011100 010101011001 000110011100 ]
1491
2271
127
( bgee eegb badh fcbc bheb cgfb aaea defe )
0.076
37
Phenotype: [ 100100000000 110001100000 001111001111 100001100001 ]
339
3423
201
En este caso observamos que, aunque las redes predicen muchos falsos negativos, la función de
costo compensa el valor prediciendo muchos positivos verdaderos y dado que estamos utilizando
una función de costo los valores se compensan.
Comportamiento del fitness promedio.
A continuación se muestra una gráfica del comportamiento del fitness promedio en cada
generación tomando el promedio de las 4 primeras corridas de la tabla anterior
Total Fit. avg
0.060
0.050
0.040
0.030
Total Fit. avg
0.020
0.010
0.000
1
3
5
7
9
11 13 15 17 19 21 23 25 27 29
Generation
13
Como puede observarse el fitness promedio comienza a crecer y luego de aproximadamente 23
generaciones su valor se estabiliza, en este punto el algoritmo utilizado por nosotros genera un
alto índice de mutación, por lo cual el fitness nuevamente desciende y se vuelve a incrementar de
inmediato, sin embargo no se observa un mayor aumento que el que se tenía previo al aumento
del índice de mutación.
La gráfica siguiente muestra el comportamiento del fitness promedio para las 4 primeras corridas
del programa.
Fitness Average Per Run
0.07
0.06
0.05
0.06-0.07
0.04
0.05-0.06
0.04-0.05
0.03
0.03-0.04
0.02
0.02-0.03
0.01
0.01-0.02
29
27
25
23
Generation
21
19
17
15
13
11
9
7
5
3
0-0.01
1
0
G1
Como puede observarse con más detalle, efectivamente el fitness promedio para cada generación
comienza a crecer y luego de 23 generaciones se estabiliza, en ese punto entra en acción una alta
tasa de mutación (que disminuye el fitness promedio) y al cabo de 2 generaciones ha alcanzado
su máximo nivel. En un solo caso el fitness logó seguir creciendo por encima de su máximo valor
anterior.
El la tabla siguiente se detalla el fitness promedio obtenido para cada generación en cada una de
las 4 primeras corridas.
14
Generation Fit. Avg. 1 Fit. Avg. 2 Fit. Avg. 3 Fit. Avg. 4
0
0.0187
0.0185
0.0196
0.0203
1
0.0199
0.0233
0.0203
0.0212
2
0.022
0.025
0.0218
0.0211
3
0.021
0.0256
0.0231
0.0237
4
0.0234
0.0264
0.0248
0.0282
5
0.0255
0.0271
0.026
0.028
6
0.0254
0.0313
0.0292
0.0291
7
0.0304
0.0349
0.0328
0.0314
8
0.0292
0.0355
0.034
0.0348
9
0.0285
0.0445
0.0371
0.0344
10
0.0343
0.0424
0.0391
0.0366
11
0.0358
0.0432
0.0405
0.0409
12
0.0402
0.0453
0.0436
0.0448
13
0.0439
0.0453
0.0452
0.0456
14
0.0464
0.0373
0.0464
0.0506
15
0.0502
0.045
0.0478
0.051
16
0.0521
0.0437
0.0488
0.0519
17
0.0559
0.0437
0.0493
0.0511
18
0.0588
0.0452
0.0531
0.0511
19
0.0598
0.0451
0.0536
0.0526
20
0.0589
0.0452
0.0545
0.0516
21
0.0597
0.0451
0.0563
0.0491
22
0.0605
0.0452
0.0572
0.0505
23
0.0605
0.0405
0.0572
0.0525
24
0.0477
0.0452
0.0499
0.0525
25
0.0562
0.0452
0.0555
0.0505
26
0.0612
0.0448
0.0539
0.0525
27
0.0607
0.0452
0.0543
0.0525
28
0.0619
0.0452
0.0559
0.0525
29
0.0632
0.034
0.0567
0.0525
En ella se encuentran marcados en negrita el caso en que se logró evadir el minimo local, de
hecho dicho salto nos permitió obtener el mejor individuo (el primero de la lista) con un fitness
de 0.0991.
Análisis de Conectividad
A continuación se muestra las conexiones obtenidas para las 5 corridas efectuadas, en ella se
indican las conexiones de las 12 variables de entrada a cada una de las 4 neuronas de la capa
intermedia, se indica el número total de veces que cada variable fue conectada a cada neurona y
una suma ponderada de la ocurrencia de cada variable en cada neurona, esto se logró dividiendo
el fitness del individuo entre el total de la suma de los 5 fitness, el resultado se multiplica por 0 o
1 (según esté activada o no la conexión) para cada uno de los 5 individuos, de esta manera se
tiene un valor que da prioridad a las conexiones de aquellos individuos con mayor fitness.
15
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
NEURON 0
fitness gen
PPERSAUT
APERSAUT
PBRAND
ABRAND
MGODRK
MOPLMIDD
MBERMIDD
MSKC
MZFONDS
MFGEKIND
MGEMOMV
MGODGE
NEURON 1
PPERSAUT
APERSAUT
PBRAND
ABRAND
MGODRK
MOPLMIDD
MBERMIDD
MSKC
MZFONDS
MFGEKIND
MGEMOMV
MGODGE
NEURON 2
PPERSAUT
APERSAUT
PBRAND
ABRAND
MGODRK
MOPLMIDD
MBERMIDD
MSKC
MZFONDS
MFGEKIND
MGEMOMV
MGODGE
NEURON 3
PPERSAUT
APERSAUT
PBRAND
ABRAND
MGODRK
MOPLMIDD
MBERMIDD
MSKC
MZFONDS
MFGEKIND
MGEMOMV
MGODGE
gen 1
0.0991
0
0
1
1
0
1
0
0
1
0
0
0
gen2
0.08
0
0
0
1
0
1
0
1
0
0
0
0
gen3
0.0606
0
0
1
0
0
0
0
1
1
1
0
0
gen 4
0.0719
0
1
0
1
0
1
0
1
1
0
0
1
gen 5
0.076
1
0
0
1
0
0
0
0
0
0
0
0
total
0.3876
1
1
2
4
0
3
0
3
3
1
0
1
Ponderated
1
0
0
0
0
0
0
1
0
1
1
1
0
1
0
1
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
1
0
1
0
1
0
0
0
1
1
0
0
1
1
1
0
0
1
1
0
0
0
1
1
0
0
0
0
0
2
2
0
2
1
1
1
3
1
4
2
3
0.45
0.40
0.00
0.39
0.19
0.20
0.20
0.60
0.19
0.80
0.46
0.62
0
0
1
1
0
1
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
1
0
1
0
1
1
1
0
0
0
1
1
1
0
0
0
1
0
1
0
1
0
1
1
0
0
1
0
0
1
1
1
1
0
0
1
1
1
1
0
2
3
5
1
4
0
2
4
3
1
3
0.00
0.34
0.61
1.00
0.20
0.84
0.00
0.34
0.79
0.56
0.20
0.59
1
0
0
0
0
0
0
1
0
1
1
1
0
1
0
1
0
0
0
1
0
1
0
0
0
1
0
1
0
1
0
1
0
1
0
1
0
0
0
1
1
0
0
1
1
1
0
0
1
0
0
0
0
1
1
0
0
0
0
1
2
2
0
3
1
2
1
4
1
4
1
3
0.45
0.36
0.00
0.55
0.19
0.35
0.20
0.80
0.19
0.80
0.26
0.61
16
0.20
0.19
0.41
0.84
0.00
0.65
0.00
0.55
0.60
0.16
0.00
0.19
Enseguida se graficaron los valores ponderados para cada neurona
Connectivity
Analysis
1.00
0.90
0.80
0.70
0.60
0.50
0.40
0.30
0.20
0.10
0.00
0.90-1.00
0.80-0.90
0.70-0.80
0.60-0.70
0.50-0.60
0.40-0.50
MZFONDS
MBERMIDD
MGODRK
MGEMOMV
Input
PBRAND
PPERSAUT
0.30-0.40
Variables
Neuron 0
0.20-0.30
0.10-0.20
0.00-0.10
Por lo que se observa en la gráfica la variable ABRAND (Number of Fire Policies) es la que
domina en la mayoría de las entradas, sin embargo vemos que variables que podemos estimar
poco influyentes en el resultado también aparecen con mucha frecuencia como MFGEKIND
(Household without children), mientras que algunas otras no figuran en absoluto como
MGODRK (Roman catholic) o MZFONDS (national Health Service).
Enseguida se presenta la tabla de donde se obtuvo la gráfica.
PPERSAUT
APERSAUT
PBRAND
ABRAND
MGODRK
MOPLMIDD
MBERMIDD
MSKC
MZFONDS
MFGEKIND
MGEMOMV
MGODGE
Neuron 0
0.20
0.19
0.41
0.84
0.00
0.65
0.00
0.55
0.60
0.16
0.00
0.19
Neuron 1
0.45
0.40
0.00
0.39
0.19
0.20
0.20
0.60
0.19
0.80
0.46
0.62
17
Neuron 2
0.00
0.34
0.61
1.00
0.20
0.84
0.00
0.34
0.79
0.56
0.20
0.59
Neuron 3
0.45
0.36
0.00
0.55
0.19
0.35
0.20
0.80
0.19
0.80
0.26
0.61
Conclusiones
Como se puede apreciar de los resultados obtenidos, existen variables que a pesar de poder ser
consideradas como “ruido”, influyen de una manera directa en el tipo de redes encontradas. De lo
anterior podríamos decir que esos valores ayudan de alguna manera a dar una “estabilidad” a la
red, no sabemos a ciencia cierta porqué no sucede que dichas variables sean eliminadas del todo.
Por otro lado observamos que las variables que definitivamente no tienen ninguna relación son
eliminadas por el algoritmo genético.
De lo anterior podemos concluir que el uso de algoritmos genéticos para encontrar redes
neuronales óptimas resulta una manera excelente de poder evaluar qué tan ciertas son nuestras
presunciones acerca de la relación entre la variables de entrada y los datos, de tal suerte que
existen factores que, al ser difíciles de observar en una muestra, al no ser tomados en cuenta por
el diseño de la red neuronal, restarían efectividad a la misma.
Del ejemplo anterior podemos concluir que dadas las gráficas obtenidas la muestra no es
totalmente heterogénea y puede mostrar una cierta tendencia a incluir individuos con ciertas
características (Household with Children). En este caso la red neuronal puede estar “aprendiendo”
a relacionar la salida con estas variables si no se presentan casos positivos con una población que
tenga valores diferentes para estas mismas variables, lo cual significa que la misma red neuronal
puede estar asignando dependencias que no existen.
Por otro lado nuestra principal conclusión reside en el hecho de que el resultado del algoritmo
genético depende en gran medida de la función de fitness utilizada ya que el algoritmo
únicamente nos entregará aquellos individuos más calificados según los parámetros que hayamos
estipulado.
Cabe aclarar que hicimos algunas corridas con una función de fitness del tipo Positivos
Verdaderso/Total de Positivos Predichos, sin embargo desechamos los resultados ya que nos
proporcionaban individuos que predecían pocos casos verdaderos (con uno basta) y ningún falso
positivo.
Bibliografía
O. Palacios, H. Waelbroeck & C.R. Sttephens
Emergence of Algorithmic Language in Genetic Systems
ICN-UNAM-97-08 Pag. 5
T. Masters
Practical Neural Networks Recipes in C++
Academic Press 1993
18
Descargar