Pregunta

Guión


Estoy intentando implementar el aprendizaje supervisado sobre un conjunto de datos dentro de una aplicación GUI de Java.El usuario recibirá una lista de elementos o 'informes' para inspeccionar y los etiquetará según un conjunto de etiquetas disponibles.Una vez que se completa el aprendizaje supervisado, las instancias etiquetadas se entregarán a un algoritmo de aprendizaje.Esto intentará ordenar el resto de los elementos según la probabilidad de que el usuario quiera verlos.

Para aprovechar al máximo el tiempo del usuario, quiero preseleccionar los informes que proporcionarán la mayor cantidad de información sobre toda la colección de informes y hacer que el usuario los etiquete.Según tengo entendido, para calcular esto, sería necesario encontrar la suma de todos los valores de información mutua para cada informe y ordenarlos por ese valor.Luego, los informes etiquetados del aprendizaje supervisado se utilizarán para formar una red bayesiana para encontrar la probabilidad de un valor binario para cada informe restante.

Ejemplo


Aquí, un ejemplo artificial puede ayudar a explicar y puede aclarar la confusión cuando sin duda he usado la terminología incorrecta :-) Considere un ejemplo en el que la aplicación muestra noticias al usuario.Elige qué noticias mostrar primero según las preferencias del usuario mostradas.Las características de una noticia que tienen una correlación son country of origin, category o date.Entonces, si un usuario etiqueta una sola noticia como interesante cuando proviene de Escocia, le dice al aprendizaje automático que existe una mayor probabilidad de que otras noticias de Escocia sean interesantes para el usuario.Similar para una categoría como Deporte, o una fecha como el 12 de diciembre de 2004.

Esta preferencia podría calcularse eligiendo cualquier orden para todas las noticias (p. ej.por categoría, por fecha) o ordenarlos aleatoriamente y luego calcular la preferencia a medida que avanza el usuario.Lo que me gustaría hacer es obtener una especie de "ventaja inicial" en ese orden haciendo que el usuario mire una pequeña cantidad de noticias específicas y diga si está interesado en ellas (la parte de aprendizaje supervisado).Para elegir qué historias mostrarle al usuario, debo considerar toda la colección de historias.Aquí es donde entra en juego la información mutua.Para cada historia quiero saber cuánto me puede decir sobre todas las demás historias cuando el usuario la clasifica.Por ejemplo, si hay una gran cantidad de historias originadas en Escocia, quiero que el usuario clasifique (al menos) una de ellas.Similar para otras características correlacionadas como categoría o fecha.El objetivo es encontrar ejemplos de informes que, cuando se clasifican, proporcionen la mayor cantidad de información sobre los demás informes.

Problema


Debido a que mis matemáticas están un poco oxidadas y soy nuevo en el aprendizaje automático, tengo problemas para convertir la definición de información mutua a una implementación en Java.Wikipedia describe la ecuación de información mutua como:

mutual information equation

Sin embargo, no estoy seguro de si esto realmente se puede usar cuando no se ha clasificado nada y el algoritmo de aprendizaje aún no ha calculado nada.

Como en mi ejemplo, digamos que tengo una gran cantidad de instancias nuevas sin etiquetar de esta clase:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

En mi escenario específico, la correlación entre campos/características se basa en un coincidencia exacta así, por ejemplo, una diferencia de fecha de un día y 10 años son equivalentes en su desigualdad.

Los factores de correlación (p. ej.¿La fecha se correlaciona más que la categoría?) no son necesariamente iguales, pero pueden ser predefinidos y constantes.¿Significa esto que el resultado de la función p(x,y) es el valor predefinido o estoy mezclando términos?

La pregunta (finalmente)


¿Cómo puedo implementar el cálculo de información mutua dado este ejemplo (falso) de noticias?Bibliotecas, javadoc, ejemplos de código, etc.Son todas informaciones bienvenidas.Además, si este enfoque es fundamentalmente defectuoso, explicar por qué es así sería una respuesta igualmente valiosa.


PD.Conozco bibliotecas como Weka y Apache Mahout, por lo que mencionarlas no me resulta realmente útil.Todavía estoy buscando documentación y ejemplos de ambas bibliotecas buscando cosas específicamente sobre información mutua.Lo que realmente me ayudaría es señalar recursos (ejemplos de código, javadoc) donde estas bibliotecas ayudan con información mutua.

¿Fue útil?

Solución

Estoy adivinando que su problema es algo así como ...

"Dada una lista de ejemplos no etiquetados, ordenar la lista por la cantidad de la exactitud predictiva del modelo mejoraría si el usuario marcado el ejemplo y ha añadido al conjunto de entrenamiento."

Si este es el caso, no creo que la información mutua es lo que hay que usar, ya que no se puede calcular IM entre dos instancias. La definición de infarto de miocardio es en términos de variables aleatorias y una instancia individual no es una variable aleatoria, es sólo un valor.

Las características y la etiqueta de clase pueden ser sin embargo de como variables aleatorias. Es decir, que tienen una distribución de valores en todo el conjunto de datos. Se puede calcular la información mutua entre las dos funciones, para ver cómo 'redundante' una característica se da el otro, o entre una entidad y la etiqueta de clase, para tener una idea de lo mucho que esa característica podría ayudar a la predicción. Así es como la gente suele utilizar la información mutua en un problema de aprendizaje supervisado.

Creo que la sugerencia de ferdystschenko que nos fijamos en los métodos de aprendizaje activo es una buena.


En respuesta al comentario de Grundlefleck, voy a ir un poco más en la terminología mediante el uso de su idea de un objeto Java analogía ...

Colectivamente, hemos utilizado el término 'ejemplo', 'cosa', 'informe' y 'ejemplo' para referirse al objeto que se está clasified. Vamos a pensar en estas cosas como instancias de una clase Java (He dejado de lado el constructor repetitivo):


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

La terminología usual en el aprendizaje de máquina es que e1 es un ejemplo , que todos los ejemplos tienen dos características f1 y f2 y que para e1, f1 toma el valor 'foo 'y f2 toma el valor 'bar'. Una colección de ejemplos se denomina conjunto de datos .

Tome todos los valores de f1 para todos los ejemplos en el conjunto de datos, esta es una lista de cadenas, sino que también puede ser pensado como una distribución. Podemos pensar en la función como un variable aleatoria y que cada valor de la lista es una muestra tomada de esa variable aleatoria. Por lo que podemos, por ejemplo, el cálculo del IM entre f1 y f2. El pseudocódigo sería algo así como:

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

Sin embargo no se puede calcular IM entre e1 y e2, es simplemente no definido de esa manera.

Otros consejos

Sé información de ganancia sólo en relación con los árboles de decisión (DT), donde en la construcción de un DT, la división de hacer en cada nodo es el que maximiza la ganancia de información. El DT se implementan en Weka, por lo que probablemente podría utilizar directamente que, aunque no sé si Weka le permite calcular la ganancia de información para cualquier fractura en particular por debajo de un nodo de DT.

Aparte de eso, si he entendido bien, creo que lo que estamos tratando de hacer por lo general se conoce como aprendizaje activo. Hay, primero tiene algunos datos de entrenamiento etiqueta inicial que se alimenta a su algoritmo de aprendizaje automático. Entonces usted tiene su etiqueta clasificador un conjunto de instancias sin marcar y devolver los valores de confianza para cada uno de ellos. Instancias con los valores de confianza más bajos son generalmente los que son más informativo, por lo que mostrar estos a un anotador humana y que él / ella etiqueta de forma manual, añadirlos a su conjunto de entrenamiento, entrenar el clasificador, y hacer todo el asunto una y otra vez hasta que el clasificador tiene una precisión suficientemente alta o hasta que se cumpla alguna otra criterio de parada. Así que si esto funciona para usted, usted podría, en principio, utilizar cualquier ML-algoritmo implementado en Weka o cualquier otro ML-marco, siempre y cuando el algoritmo que elija sea capaz de devolver valores de confianza (en el caso de bayesiano se acerca a este sería sólo probabilidades) .


Con su pregunta editada Creo que voy a entender lo que su apuntando. Si lo que desea es calcular MI, entonces la respuesta y la pseudo código de StompChicken no podría ser mucho más claro en mi opinión. También creo que la EM no es lo que quiere y que usted está tratando de reinventar la rueda.

Recapitulemos: que le gustaría entrenar a un clasificador que puede ser actualizado por el usuario. Este es un caso clásico para el aprendizaje activo. Pero para ello, es necesario un clasificador inicial (que podría básicamente sólo dar al usuario datos aleatorios para etiquetar pero tomarlo esto no es una opción) y con el fin de entrenar a su clasificador inicial, se necesitan al menos una pequeña cantidad de la formación etiquetado los datos para el aprendizaje supervisado. Sin embargo, todo lo que tienes son datos no etiquetados. ¿Qué se puede hacer con esto?

Bueno, se podría en grupos de casos relacionados, usando uno de la norma algoritmos de agrupamiento proporcionados por Weka o alguna herramienta de agrupamiento específico como Cluto . Si ahora tomar las x mayoría de los casos centrales de cada grupo (x dependiendo del número de grupos y la paciencia del usuario), y tienen la etiqueta de usuario lo más interesante o no interesante, se puede adoptar esta etiqueta para los otros casos de ese grupo, así (o al menos para las centrales). Voila, ahora se cuenta con datos de entrenamiento que se puede utilizar para entrenar a su clasificador inicial y poner en marcha el proceso de aprendizaje activo mediante la actualización del clasificador cada vez que el usuario marca una nueva instancia tan interesante o no. Creo que lo que estás tratando de lograr mediante el cálculo de MI es esencialmente similar, pero puede ser sólo el transporte inadecuado para su carga.

Sin saber los detalles de su situación, debería pensar que puede que ni siquiera necesita ningún datos etiquetados en todos, excepto si usted está interesado en las propias etiquetas. Sólo agrupar sus datos una vez, deja al usuario elegir un elemento interesante para él / ella de los miembros centrales de todos los grupos y sugerir otros elementos de los grupos seleccionados como tal vez de ser interesante también. También sugieren algunos casos al azar de otros grupos aquí y allá, de modo que si el usuario selecciona uno de ellos, se puede suponer que el clúster correspondiente podría ser interesante en general, también. Si hay una contradicción y un usuario le gusta a algunos miembros de un grupo, pero sint algunos otros de la misma, a continuación, intenta volver a agrupar los datos en grupos de grano más fino que discriminan a los buenos de los malos. La etapa de re-formación, incluso podría evitarse mediante el uso de agrupación jerárquica desde el principio y viaja por la jerarquía de grupo a cada usuario contradicción provoca de entrada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top