La mayoría de los métodos de selección de atributos incluyen la búsqueda en el espacio de atributos de un subconjunto que resulten los mejores en la predicción para así optimizar el modelo y obtener los mejores resultados. El número de posibles subconjuntos de atributos se incrementa exponencialmente según el número de atributos, haciendo la búsqueda exhaustiva impracticable. Típicamente se hace la búsqueda en el espacio de descriptores de manera “ambiciosa-greedy” en una de dos direcciones; desde lo superior a lo inferior y desde lo inferior hacia lo superior. En cada estado, se realiza un cambio en el subconjunto actual de atributos, el cual puede ser agregar o eliminar uno de ellos. Cuando se comienza con dirección “hacia abajo” y sin atributos para ir agregándolos, se le conoce como “selección hacia adelante” y por consiguiente, cuando se busca “hacia arriba” y se comienza con el conjunto total de atributos y se van eliminando estos en función del tiempo, se le conoce como “selección hacia atrás”. En la selección “hacia adelante” cada atributo que aún no esté en el subconjunto actual, es provisionalmente adicionado y el conjunto resultante es evaluado. Esta evaluación produce una medida numérica de la representación del subconjunto. El efecto de agregar cada atributo en turno se corresponde con el valor de esta medida, luego el mejor atributo es escogido, y el procedimiento continúa. Sin embargo, si ningún atributo produce una mejora al agregarse al subconjunto actual, la búsqueda concluye. Esto garantiza un óptimo subconjunto de descriptores pero no necesariamente uno global.
Además de estos existen otros métodos más sofisticados. Estos métodos antes mencionados pueden ser combinados en aras de realizar una búsqueda bidimensional.
De manera general se puede decir que la selección “hacia atrás” produce como resultado grandes conjuntos de atributos y una mejor precisión de clasificación que la búsqueda “hacia adelante”. (Frank, 2005)
Según (Ruiz, 2008), los algoritmos de selección de descriptores tienen dos objetivos fundamentales; reducir el costo computacional asociado tanto al aprendizaje como al propio modelo de conocimiento generado (eliminando atributos irrelevantes o redundantes) y aumentar la precisión de dicho modelo (eliminando atributos perjudiciales para el aprendizaje).
Para lograr esto, estos métodos realizan una búsqueda supervisada sobre el espacio de descriptores, aplicando una función criterio que evalúa la calidad del subconjunto seleccionado. Esta búsqueda
suele ser heurística, ya que una búsqueda exhaustiva supone un problema combinatorio enormemente costoso.
Esta búsqueda, según la función criterio o evaluador, puede ser clasificada en:
1. Wrappers: la función criterio es el propio conjunto de reglas generadas por el algoritmo de aprendizaje que posteriormente se usará en la clasificación.
2. Filtros: la función criterio es independiente del algoritmo de aprendizaje, usando medidas de distancia, información o dependencia.
Además también según el resultado es separable en:
1. Individual: la cual genera un ranking de descriptores con todos ellos. 2. Subconjunto: genera un subconjunto de descriptores.
Figura 2.3.1
Selección de variables Monte Carlo
Los modelos de estructura cuantitativa se desarrollan frecuentemente examinando un gran número de descriptores basados sobre las estructuras moleculares de compuestos muestreados, donde el número de cómputos en la muestra (n) es más pequeña o incluso más pequeña que el número total de descriptores considerados (p), esto es, n<p o n<<p. Existen diversas técnicas para la selección automática de variables o rasgos en un subconjunto mucho menor de descriptores (de medida k, k<<p). Por ejemplo, cuando un modelo QSAR utiliza el método de regresión lineal múltiple (MLR), el coeficiente de Pearson de la regresión (r) o sus equivalentes por tabulaciones cruzadas tipo LOO (Leave-one-out) se utilizan para justificar o guiar la selección. Los modelos QSAR, basados tanto en MLR como no-MLR, reportan cuando los modelos ajustan bien con el subconjunto de calibración (entrenamiento) reportando el error cuadrático medio (MSE) de calibración:
2.3.1
o la raíz cuadrada del error cuadrático medio
RMSE
MSE
. Aquí yi es la respuesta real observada en la base, yi’
es el valor estimado para el i-ésimo compuesto, y nc la medida del subconjunto de aprendizaje, y donde el i-ésimo compuesto se incluyó en el subconjunto de entrenamiento o calibración. En el campo de ML (Machine Learning), MSE se conoce además como error empírico o riesgo empírico. MSE representa la capacidad del modelo para fijar los datos, y mientras más flexible es el modelo en términos del número de parámetros o coeficientes no restringidos, más fácil es minimizar MSE.
Aunque los valores MSE son todavía comúnmente reportados por los modelos QSAR, el error cuadrático medio de la predicción
o su raíz cuadrada
RMSEP
MSEP
que es más apropiada para expresar la potencia predictiva o exactitud de un modelo QSAR. Aquí se usa la misma notación (yi’) pero en este caso yi’ es el valor predicho para el i-ésimo compuesto por el modelo QSAR y nv es la medida del subconjunto de validación (o de prueba), y donde el i-ésimo compuesto fue excluido del subconjunto de entrenamiento.Este método incluye una validación cruzada la cual se define a continuación.
Validación cruzada de Monte Carlo (MCCV). Considere una muestra de n compuestos, descrita por una matriz Z de ordenn (p+1) con la siguiente estructura:
2.3.3
donde Y = (y1, y2, …,yn)T es el vector columna (esto es una matriz n 1) de valores de actividad o respuesta (el superíndice “T” denota la transpuesta), X es una matriz n p de valores descriptores y p es el número de descriptores de la estructura, o generalmente hablando, cualesquiera variables predictivas. La matriz X pudiera ser referenciada por sus columnas (es decir, por descriptores),
donde Dj = (x1j ,x2j … xnj)T es el vector columna de los valores del j-ésimo descriptor, 1 j p. Otra forma conveniente de referirse a los datos de esta matriz, es por filas (esto es, por compuestos),
2.3.5
donde Xi = (xi1, xi2, …, xip) es el vector fila de valores de descriptores para el i-ésimo compuesto, 1 i n. La variable respuesta de actividad predicha por un modelo QSAR para el i-ésimo componente se denota por yi‟.
Sea S = {1, 2, …, n} el conjunto de etiquetas que identifican los compuestos disponibles (esto es numerados de 1 a n). Cada iteración particular del método MCCV separa S en un subconjunto de validación
v n v
v
S
I
i
i
i
S
(
)
1,
2,...
(| Sv |=nv) y un subconjunto de calibración o aprendizaje n n n c cS
I
i
i
i
S
v v,
,...,
)
(
1
2
(| Sc | = nc = n – nv ) donde Sv Sc = y Sv Sc = S. La letra I identifica la partición de S en dos subconjuntos en cada iteración, el símbolo | * | denota el operador de cardinalidad, esto es, la cantidad de elementos del conjunto “*”. Los subconjuntos son entonces codificados por vectores de bits de 1‟s y 0‟s, de manera tal, que por ejemplo,) ,... , ,..., ,..., , , , ,..., , ( i i i i i i i n v nv nv S 0102 0 11 0 10 2 1 0 10 2 0 2 1 1 1 1
donde, sin pérdida de generalidad,
i
1i
2...
i
nv y el valor de “1” en la i-ésima posición significa que el i-ésimo compuesto se incluye en el subconjunto de validación.El caso de los descriptores se manipula similarmente a los compuestos, donde H={1,2,…,p} es el conjunto de etiquetas de todos los descriptores, numerados desde 1 a p. Entonces J = {j1, j2, … , jk} denota una hipótesis de selección de variables que selecciona k descriptores a partir de H (esto es, | J | = k), esto es J es un subconjunto de H. Note que los índices basados en i – j se usan para distinguir respectivamente las entidades basadas en compuestos – descriptores a lo largo de este
estudio. El conjunto completo de todas las hipótesis posibles a partir de J, que seleccionan exactamente k descriptores se denota Hk y resulta claro que | Hk | = p!/(k!(p-k)!).
Para una iteración simple de MCCV; la exactitud predictiva del modelo QSAR se estima por el MSEP (denotado como la función de pérdida L(I,J), para brevedad),
2.3.6
La cual se reporta por su raíz cuadrada (RMSEP), donde y J m i '
es el valor de la actividad predicho por el modelo QSAR entrenado con el subconjunto Sc(I) de compuestos y usando el subconjunto J de descriptores. El método MCCV repite el procedimiento anterior N veces, y obtiene el MSEP promedio (denotado L(J)),
2.3.7
Recocido simulado (SA-MCVS). La evaluación exhaustiva de todas MSEP posibles (es decir, L (I, J)) aun para conjuntos de datos relativamente pequeños (n 100), puede no ser factible, con independencia de la potencia computacional disponible, ya que el número de combinaciones distintas (n!p!)/ (nc!nv!k! (p–k)!) se incrementa exponencialmente. Además para calcular los valores P no es suficiente buscar un único subconjunto óptimo Jbest. Idealmente para cada iteración de MCCV, deben ser examinados todos los posibles subconjuntos J para calcular los valores P exactamente. Ya que tal evaluación exhaustiva es frecuentemente imposible para los modelos QSAR, se pueden rastrear un número (m) de subconjuntos con conformaciones mejores (es decir con los más bajos L(J)) para ofrecer una aproximación calculable para los valores P. Obviamente,
las estimaciones P’(J) obtenidas a partir de un número fijado m de las hipótesis J de mejor desempeño siempre serán menor o igual al verdadero valor,
1 0 P'(J) P(J)
La aplicación práctica importante de la ecuación anterior es que mientras más alto es, el valor de P’(J), será más probable que la hipótesis nula sea cierta, esto es, que el subconjunto de descriptores J no es el mejor disponible, en otras palabras, solamente los subconjuntos que rechacen la hipótesis nula (por ejemplo P’(J) < 0.0) deben ser verificados en la repetición de los métodos MCVS un número de veces.
Tradicionalmente tales problemas complejos de optimización/búsqueda se han estudiado por el recorrido simulado (SA) y otros. Estos algoritmos son heurísticos (es decir, no exactos) y el algoritmo que nos ocupa se basa en los métodos de la mecánica estadística.
Algoritmo de recocido simulado (Simulated Annealing) SA. .
Paso1: Comenzar seleccionando aleatoriamente J={j1, j2, …, jk}.
Paso2. Continuar seleccionando aleatoriamente los subconjuntos de compuestos Sv(I ) y Sc(I ). Crear un nuevo J’ intercambiando descriptores aleatoriamente seleccionados j J y j J. Calcular el nuevo costo Lnew=L(I ,J’) y el costo actual Lcurr=L(I ,J) asociado a la selección original de los descriptores J. [ Esto se hace con la ecuación 2.3.6 ]
Paso 3. Si Lnew Lcurr se acepta la nueva configuración J’ y se convierte en la actual. Si Lnew > Lcurr , calcular el cambio resultante en el valor de costo L = (Lnew - Lcurr) / Lnew > 0, donde Lnew > 0 por el hecho de que 0 Lcurr < Lnew . La nueva configuración es aceptada con la probabilidad Pr( L) = exp(- L/(kBT )), donde T es la temperatura de recocido y kB es originalmente la constante de Boltzmann la cual se convierte en una constante de normalización y se usa la distribución original de Bolztmann como se hizo por Kirkpatrick et al. El rol de la temperatura de recocido es permitir la aceptación de configuraciones sub-óptimas al comienzo del proceso de recocido. Este es un hecho clave del algoritmo SA, que permite al algoritmo escapar de mínimos locales de la función de pérdida.
Paso 4. Mantener una lista de hasta m subconjuntos de descriptores de mejor desempeño Bm( ) = {J1, J2, …, Jm} con los más bajos L(J) medidos por
2.3.8
donde L (J1) L (J2) … L (Jm) y donde nJ( ) es el número de veces que el subconjunto de descriptores J ha sido seleccionado hasta ahora (hasta la iteración ), es decir, nJ N.
Se calculan los P valores por la fórmula
2.3.9
donde bJ( ) es el número de veces que el subconjunto de descriptores J alcanzó el más bajo L(I,J) hasta ahora.
Paso 5. Repita los pasos 2-4 con T = (N - + 1) / N donde es la cantidad de iteraciones, obteniendo T1 =1, TN = 1/N, y 0 < T 1. Ya que 0 < L 1, la constante de Boltzmann kB = - (1/ln 0.5) = 1.4427 se selecciona para lograr Pr( L=1)=exp(-1/kB)=0.5; esto es existe al menos un chance del 50% de aceptar al inicio del recocido simulado la nueva configuración con valores de costo mayores que los que la configuración inicial (T <<N 1). Se consideró que los estudios de optimalidad de las secuencias de temperaturas (esquemas de recocido) quedaran fuera del alcance del presente trabajo. El algoritmo descrito se confía en la siguiente conjetura (C1):
Aún cuando esta conjetura es plausible, puede no ser posible la demostración matemática exacta para un modelo QSAR (incluyendo MLR). Si se encontrara, (al menos para MLR) tal prueba puede suministrar una tendencia cuantificable a la optimización de los esquemas de recocido. Note que ya que la evaluación exacta de P(J) es NP-completa, la velocidad de la convergencia PN(J)→P(J) tiene que ser exponencialmente suave; es decir, lo opuesto resolvería el problema NP-completo.
La complejidad total del algoritmo es O(N m log m). Un mínimo comienzo razonable para el número N = 100 n, es decir, cada compuesto muestreado será considerado 100 veces (como promedio) en el entrenamiento o la validación. El acceso de los usuarios a la potencia de cálculo controla la calidad de la solución; esto es, mientras más alto es el número N, más alta es la probabilidad de encontrar la solución óptima. De nuevo, la estabilidad de la solución debe siempre ser chequeada incrementando N hasta que los resultados converjan a los niveles requeridos de exactitud; por ejemplo los resultados P’(J) fueron estables dentro de la exactitud 0.01 en este estudio. Como fue mencionado anteriormente, tal validación rigurosa de la estabilidad de los resultados de P’(J) es solamente necesario para valores bajos P’(J), ya que estrictamente hablando el algoritmo SA no garantiza encontrar el mínimo global de L(J).
Definición computacional del método de Monte Carlo.
Para la implementación de este método se crearon 3 clases MonteCarlo, SubconjuntoAtributo y Lista. La clase SubconjuntoAtributo contiene todo lo necesario para representar un subconjunto de atributos sometido a un proceso de selección de atributos. La clase Lista es para mantener los subconjuntos de atributos con los mejores valores.
Pseudocódigo
Se definen los siguientes atributos y métodos: Instances inst; conjunto de instancias
int numAtrib; número máximo de atributos para los subconjuntos int Instancias; número de instancias
int Atributos; número de atributos
int nc; cardinalidad del conjunto de entrenamiento o calibración int nv; cardinalidad del conjunto de test o validación
El constructor de la clase que tiene como parámetro el conjunto de instancias y la cardinalidad máxima del número de atributos.
int[] generarArreglo(int dim,int valorMax); este método genera el arreglo con los valores de dimensión del subconjunto de atributos y el máximo valor de estos.
SubconjuntoAtributo generarSubconjuntoAtributos(int a) este genera el subconjunto de atributos. Se apoya en el método anterior generando sus valores aleatoriamente.
double calcularLaJ(SubconjuntoAtributo sa) implementa la fórmula que modifica la función de pérdida. Devuelve el valor resultante.
double calcularLIJ(SubconjuntoAtributo sa) este método implementa la función de pérdida de un subconjunto determinado y devuelve el valor resultante.
SubconjuntoAtributo generarJPrima(SubconjuntoAtributo sa) este método genera aleatoriamente un subconjunto de atributos relacionado con el anterior (parámetro) variando el número de atributos en el subconjunto o intercambiando uno de los descriptores existentes por uno de los restantes. determinarMenorLIJ() este método busca en la lista de los mejores subconjuntos de descriptores. String runSA() este método inicia el proceso de selección de variables.
Se usarán las clases Instances, Instance y Evaluation.
Se declara un objeto de tipo SubconjuntoAtributo y se inicializan las constantes para los cálculos y se genera con la llamada al método generarSubconjuntoAtributos(int). Se actualiza este como “actual” y se inserta en la lista. Las siguientes operaciones se harán dentro de un ciclo según la cantidad de iteraciones señalada. Se genera un subconjunto “primo” con el método y se calculan las funciones de pérdida de los subconjuntos existentes hasta el momento. Si el valor de pérdida del subconjunto nuevo es menor, se acepta este como “actual”; de lo contrario, se calcula la probabilidad de aceptación del nuevo subconjunto generado. Se calcula luego la modificación de la función de pérdida del subconjunto “actual” y si pertenece a los mejores subconjuntos de descriptores entonces se inserta en la lista. Después se determina el subconjunto de menor valor de pérdida y se le incrementa este valor existente en los subconjuntos de atributos para cálculos posteriores.
Se calcula el valor de P‟ (Subconjunto) según la fórmula 13, se le asigna al subconjunto en cuestión y se incrementan las constantes que intervienen en la iteración y en la simulación del recocido.
Outliers
Detección y borrado de Outliers
La detección y el borrado de Outliers constituyen una prioridad en los estudios QSAR y de esto depende el éxito de modelos QSAR. En una edición reciente de la revista de información química y modelado Maggiora, se expresaba que una de las principales deficiencias de los conjuntos de datos químicos es que no satisfacían totalmente la hipótesis principal a la cual se subordinan todos los estudios QSAR: compuestos similares tienen similares actividades biológicas o propiedades. En Maggiora se define el “farallón” (ciffs) en el espacio de descriptores donde las propiedades cambian muy rápidamente; de hecho agregando o eliminando un pequeño grupo químico pueda guiar hacia un cambio dramático en las propiedades del compuesto. En otras palabras, pequeños cambios en los valores del descriptor trae consigo grandes cambios en las propiedades de la molécula. En este caso podría haber no solo un outlier, pero un subconjunto de compuestos cuyas propiedades son diferentes de esos en el otro lado del “farallón”. Los “farallones” son áreas donde la hipótesis principal de QSAR (compuestos similares tienen propiedades similares) no tiene agarre, por lo tanto la detección de “farallones” es un gran problema en QSAR. En esta área muchas personas han estado conscientes de este y otros problemas relacionados con la detección de outliers, pero no han prestado suficiente atención para direccionar estos en sus procedimientos QSAR. Existen 2 tipos de outliers de los cuales hay que estar consciente: outliers estructurales y los outliers de actividad. Los estructurales son definidos como elementos libres en un dataset clusterizado usando cualquier técnica descrita en la literatura estadística estándar y los outliers de actividad son esencialmente definidos como farallones” (cliffs) de actividad. Se debe tener en mente que ambos tipos de outliers pueden ser reales o que deban su existencia a errores en la representación de la estructura o en anotaciones de la actividad biológica; pero en cualquier caso, preservar outliers en un conjunto de datos de modelado, podrá guiar a la inestabilidad del modelo y esto último causa diferencias significativas en el poder predictivo externo de modelos construidos con estrategias de validación externa N-fold. Entonces los outliers deben ser removidos antes de proceder con el desarrollo del modelo y analizar por separado para ver los posibles errores, sin embargo, ninguna de las técnicas
de modelado QSAR proporciona una manera fiable de construir modelos tomando en cuenta a los outliers. Encontrar estos enfoques es uno de los desafíos en este campo.(Tropsha, 2010b)
Definición teórica del método de eliminación de outliers.
Dada la importancia del tema en la rama, surge entonces la idea de implementar un método a partir de los resultados de la aplicación de una Red de Kohonen sobre el conjunto de datos. En la red de Kohonen ocurre un proceso de mapeo que tiene como conjunto dominio el conjunto de atributos de una data determinada, y como imagen, elementos pertenecientes a R². Como este algoritmo cuenta y guarda el número de instancias pertenecientes a cada punto (x,y) del mapa generado, se puede pensar que aquellos puntos que tengan una sola instancia como indicador de activación única en el mapa son más propensos a constituir outliers del modelo determinado. Además si luego de tener estos puntos bien ubicados, se construyen sucesivos modelos sin cada uno de ellos y se observa una diferencia de peso en los parámetros resultantes de construcción del modelo; entonces es muy probable que el punto en cuestión sea un outlier.
Definición computacional del método de eliminación de outliers.
Partiendo de la generación de una red de Kohonen, se puede implementar de la siguiente manera:
Pseudocódigo
Atributos y métodos principales
NeuronaSuperior [][] SOM; mapa de neuronas resultante de la red de Kohonen. Vector<NeuronaSuperior> elem; vector con elementos candidatos a outliers Instances inst; conjunto de instancias
Algunos métodos son:
void buscarValoresMenores(): inserta en el vector elem los elementos de menor aparición en el mapa.
int elementosInstanciaSimple (): este método busca en el vector elem los elementos cuya cantidad de instancias sea igual a la unidad y retorna la cantidad de objetos que cumplen esta condición. Modelo [] construccionModelos (int q): construye N modelos en función de la cantidad de neuronas de una sola instancia en el vector y devuelve estos modelos.
Como paso inicial, (después de haber realizado la red de Kohonen) se llama al método buscarValoresMenores(); este llena el vector con los candidatos a outliers. Luego con elementosInstanciaSimple () se obtienen de entre los elementos del vector, los que tienen una sola instancia en su conjunto de datos. Después se construyen tantos modelos como unidades devuelva el método anterior y se muestran los resultados de estas evaluaciones de modelos con sus respectivas instancias eliminadas.