[Ejercicio 1 -- Clasificación supervisada -- "Supervised classification -- Predicción de la variable clase para casos nuevos, "unseen samples" -- "Class prediction"]

Como hemos comentado a menudo durante el curso, el clasificador final lo aprendemos con todos los casos etiquetados, de los cuales no dudamos del valor de su variable clase. En el problema de "iris", con los 150 casos etiquetados... Y en este ejercicio lo que haremos, consistirá en utilizar el clasificador final aprendido con todos estos casos, para predecir la clase de casos futuros de los cuales el experto duda (o desconoce) el valor de su variable clase. En inglés se le puede llamar a esto "categorize", o "class prediction".

Primero, entiende que, tal y como hemos hablado, esta predicción sobre casos futuros es una "apuesta", "bet": esto es, el clasificador final desconoce al realizar la predicción si está acertando o no. Aún así, previamente hemos estimado el porcentaje de bien clasificados de este clasificador, para intuir con qué probabilidad nos estamos equivocando/acertando: recuerda que ese porcentaje de bien clasificados se estima trabajando únicamente con los casos etiquetados.

Vayamos a simular con WEKA esta situación. Escoge una base de datos (con no más de 20 variables...: ya verás luego porqué...) supervisada en formato WEKA, de entre las que te ofrezco ("bases de datos seleccionadas") en la página del curso.
Abre primero la base de datos en formato texto (por ejemplo, en el navegador), y en base a lo que expone su cabecera, trata de entender brevemente el problema de clasificación que alberga: variable clase a predecir, significado de algunas variables predictoras, número de casos y variables, presencia de valores perdidos...
Ten esta base de datos en cargada en la primera ventana de "Preprocess" de WEKA: con estos casos construiremos el clasificador final, que se utilizará para predecir la clase de casos futuros de los cuales el experto desconozca el valor de la variable clase.           

Teniendo en cuenta el problema que has escogido, crea una fichero *.arff de WEKA con 5 casos inventados por ti, donde ubiques el valor '?' en la variable clase: esto es, clase desconocida, no podría ser de otra manera: "unlabeled, unseen samples". Ten en cuenta que este segundo fichero que creas debe tener el mismo formato, cabecera y definición de variables que el primero que contiene todos los casos etiquetados. Aprovecha la cabecera del fichero original para crearlo para este segundo fichero con los 5 casos creados por ti.

Carga este segundo fichero de casos sin etiquetar ("unseen samples") en WEKA en la pestaña "Classify", mediante la segunda opción de validación ("Test options"--> "supplied test set"). Y observa qué clase predicen para cada uno de estos 5 casos inventados por ti los siguiente clasificadores: naive Bayes (en WEKA, familia "Bayes"), 10-NN (10 nearest neighbour, el clasificador de los 10 vecinos más próximos: en WEKA, familia "Lazy") y otro clasificador de tu gusto. Ten en cuenta que el clasificador no ha sido construido-aprendido con estas 5 instancias inventadas por ti... sino con las cargadas en la ventana "Preprocess" y de las cuales es conocida su clase.

Para ver las clases predichas en estos 5 casos, activa la opción "Output Predictions" en el botón "More options". Para esto, no puedes fijarte en la "confusion matrix", donde no se diferencia lo predicho para cada caso individualmente. Acerca de estas predicciones, WEKA te muestra información interesante, que debes tratar de comprender: "actual", "predicted", "probability distribution"...


[Ejercicio 2 -- Técnicas de Preprocesamiento]

De entre las seleccionadas por mí, con alguna base de datos en formato *.arff de tu elección, aplicaremos varias técnicas de preprocesamiento. Antes de empezar con las tareas concretas, ten en cuenta los siguientes comentarios:


Los “filtros” o técnicas de preprocesado que os propongo, son los siguientes:

  1. Sobre una base de datos que tenga variables numéricas, discretizar en 3 intervalos por igual anchura e igual frecuencia. Descrubre por ti mismo cómo acceder a ese “filtro” en WEKA. Entiende sus parámetros “bins” y useEqualFrequency”.

  2. La técnica de discretización supervisada o “class-dependent” explicada en las transparencias.
  3. Sobre una base de datos que tenga valores perdidos, el “filtro” “ReplaceMissingValues”. Imputar valores perdidos. Entiende qué valor imputa en las variables numéricas; y qué valor imputa en las nominales.
  4. Sobre una base de datos que tenga variables numéricas, normalizar una variable: clave cuando se va a trabajar por ejemplo, con un clasificador como el del vecino más próximo y se deben calcular distancias Euclideas entre valores de una misma variable. Con el objetivo de que todas las variables tengan el mismo “peso”-”relevancia” en el cálculo de la distancia total entre dos casos.
  5. El filtro “unsupervised—Instance—Resample”. Entiende qué función realiza.
  6. El filtro “unsupervised--Attribute--AddExpression”. Entiende qué función realiza.
  7. El filtro “unsupervised-Instace-RemoveMisclassified”. Entiende qué función realiza.
  8. El filtro “unsupervised-Attribute-InterQuartileRange”. Entiende qué función realiza. Entiende sus parámetros clave. Necesitarás trabajar con un dataset con todas las predictoras numéricas.
  9. El “MultiFilter” que cuelga como un “filtro” principal.
  10. Todos los filtros vistos hasta ahora los podemos calificar de "generalistas" para matrices clásicas con variables numéricas y nominales. Dependiendo del dominio y el tipo de dato, existen filtros específicos: imágenes, voz, texto... Para el tratamiento de textos ("text mining", "natural language processing"), el filtro "unsupervised--Attribute-StringToWordVector". Para practicar con él, carga la base de datos de este enlace, "Telecom_Tweets.arff". Una explicación sobre ella la doy en el siguiente fichero: explico varios datasets de un mismo subdirectorio. Localiza la explicación referida al nuestro. Al cargarlo en WEKA descubres que únicamente dos variables caracterizan los casos: un string (cadena de caracteres) con el comentario, y la etiqueta con el tipo de sentimiento-opinión. WEKA no puede trabajar con la variable de tipo string tal y como se encuentra. Se trata de transformar la cadena de caracteres en unigramas que reflejan la aparición (o ausencia) de las distintas palabras. Consulta la ayuda del filtro, intenta entender sus parámetros, y data cuenta de su efecto al aplicarlo, qué tipos de variables se han creado, etc. Es un filtro complejo y muy completo.
  11. Descubre algún “filtro” por tu cuenta que te llame tu atención y no hayamos visto. Entiende y aplícalo.


 


[Ejercicio 3 -- Técnicas de preprocesamiento]
Abre la base de datos que está en el siguiente enlace. Lee su cabecera, y entiéndela. Date cuenta del tamaño de la base de datos y de los datos que recoge.

Se trata de un juego. Pero nos puede servir para hacernos cargo de la amplitud y variedad de filtros de preproceso, y la complejidad de algunos de éstos. A partir de este fichero Imaginemos que queremos hacer lo siguiente: seleccionar los casos de los partidos jugados por un equipo concreto (lo haremos para el equipo "LAGUN_ARO_GBC", o cualquier otro que tú elijas, es lo de menos) en la temporada 2012-2013:


[Ejercicio 4 – Preprocesamiento de datos - Distribución desbalanceada en la clase a predecir]

Para realizar el ejercicio, de entre las bases de datos que os propongo, escoge algún problema con dos valores en la variable clase, y en el que uno de ellos esté "notablemente menos representado", esto es, una distribución de los valores desbalanceada en la variable clase. Ideas:

Para un clasificador de tipo naiveBayes, comprueba los porcentajes de acierto, y muy especialmente el "true positive rate" (TPR) de la clase minotoria, esto es, la proporción de casos de la clase minoritaria que son capaces de "recuperar - bien clasificar": esto es, "hacerlo mejor" en la clase minoritaria que cuando entreno con costes de malaclasificación standard (FP=1, FN=1). Estima el porcentaje de acierto de los modelos mediante el método "HoldOut - Percentage Split" (entrenando con 66% y testando sobre el 33% restante).

Tal y como hemos comentado en las clases teóricas, puede ser de nuestro interés mejorar el TPR de la clase minoritaria, a costa posiblemente de empeorar el TPR de la clase mayoritaria: si el experto lo admite, adelante.

Para realizar lo expuesto, tienes el clasificador "CostSensitiveClassifier" dentro de la familia "meta" de clasificadores supervisados. Sus dos parámetros principales que debes controlar:

¿Han variado los porcentajes de acierto en la clase minoritaria, esto es, el TPR en la clase minoritaria? ¿En base a hacerlo peor en la clase mayoritaria? ¿Cuánto peor? ¿Cómo influye el aumento de los costes en la clase minoritaria en el TPR de ambas clases, tanto la minoritaria como mayoritaria?

Date cuenta que el conjunto de entrenamiento-training intermedio donde se han variado las proporciones de los casos de "training", es transparente para el usuario. Y que este proceso es independiente de cómo se realice la validación del porcentaje de bien clasificados (hold-out, cross-validation, etc.).

Hemos visto también en las transparencias teóricas el popular algoritmo SMOTE, que genera ejemplos sintéticos de la clase minoritaria en zonas intermedias entre casos reales de la clase minoritaria. Este algoritmo se encuentra dentro de los filtros de preproceso de WEKA: filters-supervised-instances. Para poder aplicarlo junto con un clasificador y ver su efecto en la matriz de confusión final, debemos hacer uso del clasificador "FilteredClassifier": dentro de la familia "meta" de clasificadores supervisados en la segunda pestaña de WEKA. Para "FilteredClassifier" escoge como "Classifier" a naiveBayes, y como "Filter" a SMOTE. Clicka en el nombre en negrita de SMOTE para ver sus parámetros: el tercer parámetro, "percentage", hace referencia al porcentaje de instancias artificiales-simuladas de la clase minoritaria a crear. Así, dándole el valor "100", se duplicará el número de instancias minoritarias, etc...

Para el dataset de Diabetes.arff. Variando el valor del parámetro "percentage" de SMOTE, fíjate en el efecto en los porcentajes de acierto estimados en cada clase, y especialmente la minoritaria. Como previamente, estima el porcentaje de bien clasificados medianteel "HoldOut - Percentage Split" (entrenando con 66% y testando sobre el 33% restante).


 


[Ejercicio 5 – Selección de variables, selección univariada: “filters for ranking features”]

Haremos el ejercicio con la base de datos “Hepatitis.arff”. Entiende primero brevemente el problema. Una breve explicación de sus predictoras y la clase a predecir la tienes aquí.
Antes de empezar, discretiza sus variables numéricas en 3 intervalos por igual anchura.

Dentro de la pestaña “SelectAttributes” de WEKA tenemos distintas funciones para tareas de selección de variables.

Si tienes interés en las distintas técnicas para seleccionar variables en problemas de clasificación supervisada, la segunda sección de este artículo es un buen punto de partida.

WEKA dispone de varias métricas para medir el nivel de correlación de cada predictora con la clase del problema. Entre ellas, trabajaremos con las siguientes tres:

  1. Information Gain Ratio”: al seleccionarla, pincha en el botón “More” para observar la forma en la que calcula la mencionada correlación. Esta medida es la que se utiliza para ubicar las variables en los nodos de muchas técnicas de árboles de clasificación;

  2. Symmetrical Uncertainty”: observa la fórmula que utiliza. Viene a ser una normalización de la métrica anterior;

  3. Chi-square”: ten en cuenta los apuntes de clase o la entrada de la Wikipedia para entenderla.

Ten en cuenta que como “Sarch Method”, WEKA te propondrá “Ranking”, esto es, rankear-ordenar las predictoras según su nivel de correlación (calculado de la manera escogida) respecto a la variable clase.

En el ranking aprendido, WEKA primeramente muestra el nivel de correlación calculado. Segundo, el índice de dicha predictora en la base de datos original. Tercero, el nombre de la variable.

¿Son los tres rankings aprendidos idénticos? ¿Deberían serlo?

Complicado, y eso que tenemos 19 predictoras: imagínate cientos o miles.

Como una forma de mitigar-aliviar este efecto de inestabilidad y reducir la variabilidad en los resultados de distintas técnicas, está de moda hoy en día en la comunidad “machine learning” el concreto de la estabilidad al realizar una selección de variables. Puedes realizar una búsqueda del estilo en Google: “stability for feature selection”; donde se han propuesta medidas especiales para medir el nivel de estabilidad de varias técnicas de selección de variables, esto es, el nivel de concordancia (“agreement”) en el ranking-ordenación propuesto. Hay varios trabajos que abordan este tema de la estabilidad de las variables seleccionadas. Uno de ellos, con un "abstract" sencillo de entender, lo tienes aquí [Kuncheva'07].

Un ejercicio sencillo para abordar lo anterior puede ser el siguiente. Calcular el ranking medio de los tres anteriores, para cada predictora: esto es, calcular qué posición tendría cada predictora en un ranking que reflejase la posición media de los tres rankings originales. Y quizás trabajar con este ranking medio, podría dar mayor estabilidad-robustez al modelado... WEKA no tiene esta funcionalidad, pero puedes empezar a hacerlo a mano (no lo acabes, es demasiado).

Escoge un clasificador. Siempre que tengas que estimar un porcentaje de bien clasificados, lo haremos con una “10-fold cross-validation” (si no conoces esta técnica de validación, la veremos en temas posteriores). Haz lo siguiente:


[Ejercicio 6 -- Selección de variables en clasificación supervisada -- "The univariate approach" -- Una aplicación en "bioinformática"]

Para contextualizar el campo de aplicación del ejercicio, espero que ayude la lectura del siguiente artículo. Utilizaremos este campo de aplicación como excusa para realizar un ejercicio sobre técnicas univariadas de selección de variables en problemas de clasificación supervisada.

Bajo lo amplio que es el término bioinformatica,  de forma general viene a englobar el rol de las tecnologías de la información en la biología y biomedicina. En recientes estudios en EE.UU., venía ocupando el puesto número 1 del ranking con profesiones con mayor futuro.

Una de las principales ramas de la bioinformática viene a ser la aplicación de las técnicas de "data mining" sobre datos de origen biológico y médico: donde, con el objetivo de realizar diagnósticos-pronósticos más certeros y rápidos, las técnicas de minería de datos juegan un rol fundamental en la búsqueda de posibles "biomarcadores" ("biomarkers"). Por "biomarcador" se puede entener aquella molécula de la vida (i.e. gen, proteína, microRNA, etc.) que pueda tener relación-influencia en la aparición de la enfermedad: pudiéndonos ayudar a realizar un diagnóstico-pronóstico más rápido y certero, y con el objetivo de desarrollar fármacos que actúen sobre ella.

Esto es, "biomarcadores" diferencialmente expresados en los distintos estados de la enfermedad (sano versus control; brote versus remisión versus sano; etc.).

Para investigar en el origen y posibles biomarcadores de muchas enfermedades complejas, durante los últimos años se han utilizado de manera masiva los chips de ADN: éstos son campaces de medir-monitorizar los niveles de expresión de la práctica totalidad de genes en un organismo (e.g. Homo sapiens). Las referencias a los términos "DNA microarrays" y "gene expression datasets" en la red son incontables. Su uso en la investigación de enfermedades de origen genético está popularizado: para la ayuda en el diagnóstico-pronóstico, o para la búsqueda de biomarcadores. La manera normal de proceder es la de monitorizar mediante chips de ADN sus niveles de expresión (en sangre, en el tejido de una biopsia) a un grupo de enfermos, y por otro lado a un grupo de personas sin la enfermedad: disease versus control.

Aquí está nuestra base de datos supervisada para aplicar técnicas de minería de datos: donde los casos se obtienen a partir de los microarrays de ADN monitorizados, y las variables predictoras vienen a ser los niveles de expresión de los distintos genes medidos. La variable clase a predecir, el fenotipo, habitualmente dicotómico: enfermo versus sano; disease versus control.

Así, este tipo de bases de datos y problemas vienen a suponer un interesante "challenge" computacional para aplicar técnicas de minería de datos: muy pocos casos (habitualmente menos de 100) y miles de variables predictoras (genes) por caso. Y en las hipótesis médicas habituales de médicos y biólogos, no más de 10-15 genes ("biomarcadores") están detrás de la generación de una enfermedad. Así, el rol de las técnicas de selección de variables en estos dominios es indispensable para detectar estos genes-biomarcadores: esto es, aquellos que muestran unos niveles de expresión diferenciados entre sanos y pacientes: feature selection y gen selection.

Vamos a hacer un ejercicio con WEKA:


[Ejercicio 7 – Selección de variables, selección multivariada: “filters multivariados” y “wrappers”]

Haremos el ejercicio con la base de datos “Hepatitis.arff”. Entiende primero brevemente el problema. Una breve explicación de sus predictoras y la clase a predecir la tienes aquí.

Antes de empezar, discretiza sus variables numéricas en 3 intervalos por igual anchura. Dentro de la pestaña “SelectAttributes” de WEKA tenemos distintas funciones para tareas de selección de variables.

Si tienes interés en las distintas técnicas para seleccionar variables en problemas de clasificación supervisada, la segunda sección de este artículo es un buen punto de partida.

Vamos a dar un salto con las técnicas de selección de variables. De técnicas univariadas que no medían ni tenían en cuenta los niveles de redundancia entre las variables seleccionadas, a dos técnicas distintas de realizar una selección multivariada de un subconjunto de variables que tenga en cuenta estas correlaciones.

Ten en cuenta que cuando hacíamos una selección univariada mediante una técnica “filter” (e.g. Information Gain Ratio), se realiza un ranking que refleja el nivel de correlación de cada predictora con la clase: para construir posteriormente un clasificador este ranking se “corta” en algún punto quedándonos con las “top-features”. Pero este ranking no tiene en cuenta los niveles de redundancia entre las predictoras, pudiendo por ejemplo la primera y segunda ser “mi sueldo en dolares, mi sueldo en euros”, y cada una de ellas tener un fuerte nivel de correlación con la clase.

Las técnicas multivariadas tratan de ir más allá, tal y como hemos visto en clase, escogiendo un subconjunto de variables que contenga variables altamente correladas con la clase, pero poco correladas entre sí.

Dos maneras de atacar estas técnicas multivariadas en WEKA, cuyos aspectos teóricos básicos hemos explicado en clase:

  1. Correlated Feature Selection” (CFS). Observa cómo cambiando el “Search Method” (heurístico de optimización) para moverse entre los distintos subconjuntos de variables, el subconjunto final de variables (el mejor encontrado en toda la búsqueda realizada) cambia. Ten en cuenta que supone un heurístico de búsqueda.

  2. WrapperSubsetEval”:


[Ejercicio 8 – Selección de variables: selección univariada + selección multivariada]

Ya has visto y practicado con varias técnicas de selección univariada y multivariada. Distintas medidas para calcular la correlación entre clase y atributo en el caso univariado; los filters multivariados (CFS) y "wrappers" para el multivariado.

Una aproximación clásica, muy popular en las bases de datos de microarrays de ADN en bioinformática, es la de primero lanzar un filter univariado y a partir del "top-k" de variables más correladas con la clase, lanzar sobre éstas una técnica multivariada ("multivariate filter" o "wrapper"). A este tipo de propuestas se las conoce como "hybrid feature selection techniques". Si lanzasemos la técnica multivariada sobre el total de varias miles de variables, es más que posible que nos encontrásemos con limitaciones computacionales: no end, or memory crash.

Prueba a realizar lo expuesto, tanto sobre una base de datos de microarrays de ADN, o alguna otra con un número elevado de variables originales (más de 40-50).

 


 

[Ejercicio 9 – Estimación del porcentaje de bien clasificados]

Para un clasificador y base de datos que tú elijas (trata de que la base de datos tenga un número de casos "suficiente", más allá de 300-400),   estima el porcentaje de bien clasificados de las siguientes formas, y muestra su porcentaje de bien clasificados estimado:

  1. ¿devuelven todos el mismo porcentaje de error estimado? ¿por qué?

  2. ¿cuál de los métodos anteriores devuelve el mejor porcentaje de error estimado? ¿era esperable? ¿por qué?

  3. ¿cuál te parece la estimación más fiable de las 6 anteriores? Ten en cuenta que el error real únicamente se pude conocer teniendo infinitos casos.

  4. ¿cuál de los 6 métodos anteriores de estimación le ha exigido más trabajo de cómputo a WEKA? Fíjate que durante la ejecución, en la parte baja izquierda del GUI, en Status, aparece un mensaje cambiante: ¿cuál es?

  5. cuando le pedimos a WEKA que estime el error mediante 10-fold cross-validation, ¿cuántos modelos aprende WEKA internamente? ¿Por qué no son 10? ¿Con qué porcentaje de casos del total aprende cada uno de esos modelos?

  6. ¿puede darse el caso que para una "seed-semilla" y método de validación concreto, en una ejecución el clasificadoX "sea mejor" que el "clasificadorY", y que para otra "seed-semilla" ocurra justamente lo contrario? ¿Qué es "ser mejor"? Habrá que ser más "finos", ¿no?


[Ejercicio 10 – Estimación honesta del porcentaje de bien clasificados]

Varios trabajos nos alertan sobre la obligación de ser cuidadosos en la estimación del porcentaje de bien clasificados. Entre ellos, resaltaría los siguientes [Reunanen'03] [Smialowski'09], con unos abstracts y mensajes muy claros. 

La clave es la siguiente:

Tras comprender todo lo anterior es el momento de estudiar la Fig1del trabajo de [Smialowski'09]. La figura asume que la validación se va a hacer mediante "hold-out" ("percentage split"): esto es, entreno con una partición de los datos y estimo su bondad en la partición restante. Observa que la manera errónea de validación sería la concatenación de los pasos B+C: en el paso B se realiza la selección de variables a partir del conjunto de datos completo, y aunque posteriormente el modelo de training se aprende únicamente sobre la partición de train, "el daño ya está hecho" al validar este modelo en la partición de test restante (paso C). Esto es, los casos de la partición de test sí se han utilizado en la fase de selección de variables (paso B), siendo falsa la necesaria premisa que los casos de la partición de test no han tomado parte en ningún procedimiento de aprendizaje del modelo.

Observa las diferencias del proceso anterior respecto a la concatenación de los pasos A+C.



[Ejercicio 11 – Comparación estadística entre los porcentajes de acierto de dos clasificadores en una base de datos]

Escoge una base de datos con un número "suficiente" de casos (i.e. al menos 300-400). Escoge dos clasificadores que te interese comparar en ese problema. Como método de estimación del porcentaje de bien clasificados, variando la semilla, escogeremos 5 ejecuciones de 10-fold cross-validation para cada clasificador. Obviamente, para que el proceso sea más completo, un número mayor de ejecuciones del 10-fold cross-validation es necesario: pero bueno, el tiempo es limitado. Compara ambos clasificadores con el test correspondiente, y extrae conclusiones del tipo:

Ten en cuenta que si utilizamos la misma semilla de aleatorización de casos para el par de clasificadores en cada ejecución (y de ahí se deriva la misma partición de los datos en las hojas-"folds" de la cross-validation), las muestras con los 5 porcentajes de acierto de ambos clasificadores son apareadas: esto es, la primera del clasificador1 con la primera del clasificador2, etc. Esto condicionará que los tests estadísticos que utilicemos para comparar ambas muestras de resultados sean apareados ("2-sample paired t-test" en el caso paramétrico; "Wilcoxon test" en el caso no-paramétrico).

Si quieres utilizar un test paramétrico (e.g. t-test), "para hacerlo bien" y asegurarte que el uso de los parámetros del test está justificado, se debería hacer uso del test de "Wilks-Shapiro" si es que quieres chequear que cada una de las dos muestras comparadas sigue una distribución normal. El test lo tienes implementado en R, y  también en otras webs que lo hacen online (search for "Wilks Shapiro test online" or similar).

A partir de ahí, para comparar los resultados de ambos clasificadores y obtener el p-value que nos diga el "nivel de significancia de las diferencias" entre ambos clasificadores, tienes varios recursos ("two sample t-test"; "Mann Whitney" es un test no-paramétrico para muestras no-pareadas; "Wilcoxon" es un test no-paramétrico pareado):

Echa un vistazo a este test estadístico de "Kruskall Wallis": ¿a qué tipo de preguntas trata de ofrecer respuestas?




[Ejercicio 12 – comparación estadística múltiple -- varios algoritmos en varios datasets]

Tal y como hemos visto en el video asociado al tema, una práctica común en la comunidad de "machine learning" consiste en la comparativa de varios algoritmos en varios datasets: por resumir, llamémosle "comparativa múltiple". Esto es, se trata de extraer conclusiones que vayan más allá del clásico "el algoritmoA es superior al algoritmoB en el datasetC". Compararemos una batería de algoritmos en un conjunto de datasets. Tras el pionero trabajo de Demsar'2006 (ver apartado referencias) y las posteriores mejoras y acotaciones propuestas por García y Herrera'2008 (idem), esta práctica es actualmente un standard en nuestra comunidad.

Desde entonces han surgido varias tecnologías para realizar este tipo de comparativas estadísticas. A mi conocimiento han llegado estas dos:

  1. La plataforma online STAC, "Statistical Tests for Algorithm Comparison". Atractiva, de uso sencillo, te llevará unos pocos minutos hacerte con ella gracias a su interfaz gráfico. Como podrás comprobar sus posibilidades van más allá de la "comparativa múltiple". Ésta la podrás encontrar en "Non parametric tests --> Multiple groups, All versus All". [Enlace]
  2. Para los "seguidores" de R tenemos el paquete "scmamp" ("statistical comparison of multiple algorithms in multiple problems"). En la siguiente viñeta nos ofrecen sus autores una amena ayuda para conocer el flujo común de funciones para realizar la comparativa: esta ayuda es relevante hasta el apartado "graphical representations", y a partir de ahí ya te ofrece posibilidades para varias filigranas. Aunque no es un tema que hemos tratado en profundidad, la viñeta de ayuda contiene un apartado interesante ("Parametric vs. non-parametric") que nos hace reflexionar sobre el uso de tests parámetricos y sus asunciones asociadas, o bien decantarnos por los no paramétricos. El paquete está disponible en el servidor CRAN de R y en la popular web "mloss" de software libre para "machine learning".

Me dejo muchos detalles en el camino sobre el uso de ambas plataformas. Pero tu intuición, experiencia y un poco de paciencia irá descubriendo su modo de uso. No dejes de acudir a la ayuda de ambas plataformas y a los ejemplos que ofrecen para facilitar tu uso.

Recuerda que primero se trata de realizar un test de hipótesis que chequee la hipótesis nula acerca del similar comportamiento de la batería de algoritmos en el conjunto de datasets. En caso de ser rechazada se pasan a realizar tests de hipótesis entre todas las parejas de algoritmos ("pairwise differences -- posthoc tests"), donde la hipótesis nula en cada uno de ellos es que la pareja de algoritmos tiene un comportamiento similar. A partir de aquí podemos obtener los conocidos como "Critical Difference Diagrams": los algoritmos conectados por una línea horizontal indican que no se ha rechazado para ellos la hipótesis de comportamiento similar. Los números de la parte alta nos indican, para el conjunto de datasets, el ranking medio de cada algoritmo tras ordenarlos en cada dataset por su bondad predictiva: el cálculo del estadístico del primer test del proceso se basa en dichos rankings.

Para cada test de hipótesis que realicemos y el "p-value" que éste nos devuelva, es necesario fijar un umbral de significancia que nos indica la "probabilidad de rechazar la hipótesis nula cuando esta es cierta": al fin y al cabo, se trata de un umbral de riesgo en la decisión que tomemos. Una práctica habitual es fijar este umbral en la probabilidad 0.05, y a partir de ahí, en caso de que el "p-value" del test sea menor que este umbral, rechazar la hipótesis nula. Se debe informar acerca del umbral elegido.

Escoge 5 datasets supervisadas en formato WEKA con un número "suficiente" de casos (i.e. al menos 300-400). Escoge 4 algoritmos supervisados que te interese comparar en esta batería de problemas. Como método de estimación del porcentaje de bien clasificados, variando la semilla de aleatorización ("Test options --> More options --> Random seed") , ejecutaremos una 10-fold cross-validation para cada algoritmo y dataset. Obviamente, para que el proceso sea más completo, un número mayor de ejecuciones del 10-fold cross-validation es deseable: pero bueno, el tiempo es limitado.

De entra las dos herramientas para realizar la batería de tests que os he presentado, escoge una de ellas.

Documenta los resultados obtenidos: analiza los resultados y extrae conclusiones. Tus conclusiones son lo que cuentan. Muestra también los "Critical Difference Diagrams".