Pergunta

Cenário


Eu estou tentando implementar aprendizagem supervisionada ao longo de um conjunto de dados de uma aplicação Java GUI. O usuário será dada uma lista de itens ou 'relatórios' para inspecionar e vai classificá-los com base em um conjunto de etiquetas disponíveis. Uma vez que o aprendizado supervisionado é concluída, os casos rotulados será então dado a um algoritmo de aprendizagem. Isto irá tentar ordenar o resto dos itens no quão provável é que o usuário vai querer vê-los.

Para obter o máximo de tempo do usuário que deseja pré-selecionar os relatórios que irão fornecer o máximo de informações sobre toda a coleção de relatórios, e tem o rótulo de usuário deles. Pelo que entendi, para calcular isso, seria necessário encontrar a soma de todos os valores de informação mútua para cada relatório, e encomendá-los por esse valor. Os relatórios rotulados de aprendizagem supervisionada, então, ser usado para formar uma rede Bayesiana para encontrar a probabilidade de um valor binário para cada relatório restante.

Exemplo


Aqui, um exemplo artificial pode ajudar a explicar, e pode esclarecer a confusão quando eu usei sem dúvida, a terminologia errada :-) Considere um exemplo onde o aplicativo exibe notícias histórias para o usuário. Ele escolhe quais notícias para exibição com base em primeiro lugar na preferência do usuário mostrado. Características de uma notícia que têm uma correlação são country of origin, category ou date. Portanto, se um usuário rotula uma notícia única tão interessante quando ele veio da Escócia, diz o aluno máquina que há uma maior chance outras notícias da Escócia vai ser interessante para o usuário. Semelhante por uma categoria como Desporto, ou uma data como 12 de dezembro de 2004.

Esta preferência pode ser calculado, escolhendo qualquer ordem para todas as notícias (por exemplo, por categoria, por data) ou requisitá-los aleatoriamente, em seguida, calcular a preferência que o usuário vai junto. O que eu gostaria de fazer é obter uma espécie de "vantagem" em que ordenação por ter o usuário de olhar para um pequeno número de notícias específicos e dizer se eles estão interessados ??neles (a parte de aprendizagem supervisionada). Para escolher quais histórias para mostrar ao usuário, eu tenho que considerar toda a coleção de histórias. Este é o lugar onde Informação Mútua entra. Para cada história que eu quero saber o quanto ele pode me dizer sobre todas as outras histórias quando ela é classificada pelo usuário. Por exemplo, se houver um grande número de histórias originário da Escócia, eu quero obter o usuário para classificar (pelo menos) um deles. Semelhante por outro correlacionando recursos como categoria ou data. O objetivo é encontrar exemplos de relatórios que, quando classificados, fornecer o máximo de informações sobre os outros relatórios.

Problema


Porque a minha matemática é um pouco enferrujado, e eu sou novo para aprendizagem de máquina Eu estou tendo alguns problemas para converter a definição de informação mútua para uma implementação em Java. Wikipedia descreve a equação para Informação Mútua como:

equação de informação mútua

No entanto, não estou certo se isso realmente pode ser usado quando nada foi classificada, eo algoritmo de aprendizagem não calculou nada ainda.

Como no meu exemplo, digamos que eu tinha um grande número de novos casos, não rotulados desta classe:

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

Em meu cenário específico, a correlação entre os campos / características é baseado em um correspondência exata assim, por exemplo, um dia e 10 anos diferença na data são equivalentes em sua desigualdade.

Os factores de correlação (por exemplo, está mais data correlacionando de categoria?) Não são necessariamente iguais, mas podem ser pré-definida e constante. Quer isto dizer que o resultado da p(x,y) função é o valor pré-definido, ou estou confundindo termos?

A Pergunta (finalmente)


Como posso ir sobre como implementar o cálculo de informação mútua dado este (falso) exemplo de notícias? Bibliotecas, javadoc, exemplos de código etc, são todas as informações de boas-vindas. Além disso, se essa abordagem é fundamentalmente falho, explicando porque este é o caso seria tão valioso como resposta.


PS. Estou ciente de bibliotecas como Weka e Apache Mahout, então apenas mencioná-los não é realmente útil para mim. Eu ainda estou procurando através de documentação e exemplos para estas duas bibliotecas à procura de coisas sobre Informação Mútua especificamente. O que realmente me ajudar a apontar para recursos (exemplos de código, javadoc), onde essas bibliotecas de ajuda com informação mútua.

Foi útil?

Solução

Eu estou supondo que o seu problema é algo como ...

"Dada uma lista de exemplos não marcados, tipo lista por quanto a precisão de previsão do modelo deverão melhorar se o usuário classificou o exemplo e acrescentou que para o conjunto de treinamento."

Se este for o caso, eu não acho que a informação mútua é a coisa certa a usar, porque você não pode calcular MI entre duas instâncias. A definição de MI é em termos de variáveis ??aleatórias e uma instância individual não é uma variável aleatória, é apenas um valor.

Os recursos e o rótulo de classe pode ser pensada como variáveis ??aleatórias. Ou seja, eles têm uma distribuição de valores em todo o conjunto de dados. Você pode calcular a informação mútua entre dois recursos, para ver como 'redundante' um recurso é dado a outra, ou entre um recurso e o rótulo de classe, para ter uma idéia do quanto essa previsão recurso pode ajudar. Isto é como as pessoas geralmente usam informação mútua em um problema de aprendizado supervisionado.

Eu acho que a sugestão de ferdystschenko que você olhar para métodos de aprendizagem ativos é uma boa.


Em resposta ao comentário de Grundlefleck, eu vou ir um pouco mais fundo na terminologia usando a sua ideia de um objeto analogia Java ...

Em conjunto, temos usado o termo 'exemplo', 'coisa', 'relatório' e 'exemplo' para se referir ao objeto que está sendo Clasified. Vamos pensar nestas coisas como instâncias de uma classe Java (eu deixei o construtor clichê):


class Example
{ String f1;
  String f2;
}

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

A terminologia usual na aprendizagem de máquina é que e1 é uma exemplo , que todos os exemplos têm dois apresenta F1 e F2 e que por E1, F1 toma o valor 'foo 'e f2 assume o valor 'bar'. Uma coleção de exemplos é chamado de conjunto de dados .

Tome todos os valores de f1 para todos os exemplos do conjunto de dados, esta é uma lista de strings, ele também pode ser pensado como uma distribuição. Podemos pensar o recurso como um variável aleatória e que cada valor na lista é uma amostra retirada de essa variável aleatória. Assim, podemos, por exemplo, calcular o MI entre F1 e F2. O pseudocódigo seria algo 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
}

No entanto, você não pode calcular MI entre E1 e E2, é só não definido dessa forma.

Outras dicas

Eu sei ganho de informação apenas em conexão com árvores de decisão (DTS), onde na construção de um DT, a divisão de fazer em cada nó é aquele que maximiza o ganho de informação. DTs são implementados em Weka, então você provavelmente poderia usar isso diretamente, embora eu não sei se Weka permite ganho de informação calcular em qualquer grupo em particular debaixo de um nó DT.

Para além de que, se eu entendi corretamente, acho que o que você está tentando fazer é geralmente referido como aprendizagem activa . Lá, você primeiro precisa de alguns dados de treinamento marcados iniciais que é alimentado para o seu algoritmo de aprendizagem de máquina. Então você tem o seu rótulo classificador um conjunto de instâncias não marcados e os valores de confiança de retorno para cada um deles. Instâncias com os valores de confiança mais baixos são geralmente os que são mais informativo, para que mostrar estes a um anotador humana e que ele / ela rotular estes manualmente, adicione-os ao seu conjunto de treinamento, treinar seu classificador, e fazer a coisa toda e outra vez até que seu classificador tem uma precisão alta o suficiente ou até que algum outro critério de parada for atendida. Então, se isso funciona para você, você poderia em uso princípio, qualquer ML-algoritmo implementado na Weka ou qualquer outro ML-estrutura, enquanto o algoritmo que você escolher é capaz de retornar valores de confiança (em caso de Bayesian aproxima este seria apenas probabilidades) .


Com a sua pergunta editada Acho que estou começando a entender o que o seu visando. Se o que você quer é calcular MI, em seguida, resposta e pseudo código de StompChicken não poderia ser muito mais claro na minha opinião. Eu também acho que MI não é o que você quer e que você está tentando re-inventar a roda.

Vamos recapitular: você gostaria de treinar um classificador que pode ser atualizado pelo usuário. Este é um caso clássico para a aprendizagem ativa. Mas para isso, você precisa de um classificador inicial (você poderia basicamente apenas dar ao usuário dados aleatórios para rótulo, mas eu levá-la esta não é uma opção) e, a fim de treinar seu classificador inicial, você precisa de pelo menos uma pequena quantidade de treinamento rotulado dados para a aprendizagem supervisionada. No entanto, tudo que você tem são dados não marcados. O que você pode fazer com estes?

Bem, você poderia conjunto los em grupos de casos relacionados, usando um do padrão algoritmos de agrupamento fornecidas por Weka ou alguma ferramenta agrupamento específico como Cluto . Se você agora tomar as x exemplos mais centrais de cada cluster (x, dependendo do número de clusters e a paciência do usuário), e tem o rótulo de usuário lo como interessante ou não é interessante, você pode adotar esse rótulo para as outras instâncias do nesse cluster (ou, pelo menos, para as centrais). Voila, agora você treinar de dados que você pode usar para treinar seu classificador inicial e começar o processo de aprendizagem ativo, atualizando o classificador cada vez que o usuário marca uma nova instância como interessante ou não. Eu acho que o que você está tentando alcançar através do cálculo MI é essencialmente similar, mas pode ser apenas o carro errado para o seu comando.

Sem saber os detalhes de seu cenário, eu acho que você não pode sequer precisa de quaisquer dados rotulados em tudo, exceto se você estiver interessado nos rótulos si. Apenas agrupar seus dados uma vez, deixar o usuário escolher um interessante item para que ele / ela os membros centrais de todos os clusters e sugerir outros itens dos clusters selecionados como, talvez, de ser interessante também. sugerem também alguns casos aleatórios de outros grupos aqui e ali, de modo que se o usuário seleciona um desses, você pode assumir que o cluster correspondente pode geralmente ser interessante também. Se há uma contradição e um usuário gosta de alguns membros de um cluster, mas nãot alguns outros da mesma, em seguida, tentar re-cluster os dados em grupos de grão mais finos que discriminam os bons dos maus. A etapa de re-formação poderia mesmo ser evitado pelo uso de agrupamento hierárquico desde o início e viajar para baixo na hierarquia conjunto a cada causas de entrada do usuário contradição.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top