Como prever resultados apenas com casos positivos como treinamento?

21

Por uma questão de simplicidade, digamos que estou trabalhando no exemplo clássico de emails de spam / não spam.

Eu tenho um conjunto de 20000 e-mails. Destas, sei que 2000 são spam, mas não tenho nenhum exemplo de email que não seja spam. Eu gostaria de prever se os 18000 restantes são spam ou não. Idealmente, o resultado que estou procurando é uma probabilidade (ou um valor-p) de que o email seja spam.

Que algoritmo (s) posso usar para fazer uma previsão sensata nessa situação?

No momento, estou pensando em um método baseado em distância que me diga como o meu email é semelhante a um email de spam conhecido. Que opções eu tenho?

De maneira mais geral, posso usar um método de aprendizado supervisionado ou preciso necessariamente ter casos negativos em meu conjunto de treinamento para fazer isso? Estou limitado a abordagens de aprendizado não supervisionadas? E os métodos semi-supervisionados?

enricoferrero
fonte
1
Qualquer algoritmo de aprendizado que você usará preverá que todos os e-mails sejam spam. Você deve ter exemplos das duas categorias para qualquer aprendizado sensato.
JohnRos
OK, isso excluiria uma abordagem clássica de aprendizado supervisionado. Mas existe um algoritmo que retorna algum tipo de métrica de similaridade? Por exemplo: este email é muito parecido com um email de spam, este outro não é.
enricoferrero
6
@JohnRos não é verdade, aprender com dados positivos e não rotulados é um grande tópico no aprendizado semi-supervisionado e não é nada como você descreve.
Marc Claesen
5
@ MarcClaesen: Eu não conhecia essa linha (muito legal) de pesquisa. Vejo que essa mágica pressupõe que os dados não rotulados são uma mistura de spam e não spam, o que torna o problema solucionável.
JohnRos
2
@ JohnRos exatamente, e eu concordo com o fator de frescura. O que eu acho realmente interessante é o fato de termos sido recentemente capazes de mostrar como calcular métricas de desempenho tradicionais com base em tabelas de contingência (por exemplo, exatidão, precisão, recall, ...) sem negativos conhecidos !
Marc Claesen

Respostas:

19

Isso se chama aprendizado de dados positivos e não rotulados, ou aprendizado de PU, para abreviar, e é um nicho ativo de aprendizado semi-supervisionado.

Resumidamente, é importante usar os dados não rotulados no processo de aprendizado, pois eles produzem modelos significativamente aprimorados sobre os chamados classificadores de classe única que são treinados exclusivamente em positivos conhecidos. Os dados não rotulados podem ser incorporados de várias maneiras, as abordagens predominantes são as seguintes:

  • de alguma forma inferir um conjunto de prováveis ​​negativos a partir dos dados não rotulados e, em seguida, treinar um modelo supervisionado para distinguir os positivos conhecidos desses negativos inferidos.
  • trate o conjunto não marcado como negativo e, de alguma forma, leve em consideração o ruído do rótulo que se sabe estar presente.

Sou ativo nesse campo e, em vez de resumir aqui para você, recomendo a leitura de dois de meus artigos e as referências nele contidas para obter uma visão geral do domínio:

Marc Claesen
fonte
1
Excelente! Muito obrigado pelas referências. O RESVM e o SVM ensacado parecem ter um desempenho semelhante em um ambiente de aprendizado de PU. Você pode recomendar implementações (preferencialmente em R) de qualquer um dos algoritmos? Infelizmente, nenhum deles parece estar incluído no sinal de intercalação.
enricoferrero
1
@enricoferrero Sim, eles têm desempenho semelhante, a menos que haja falsos positivos (conhecidos). Nesse caso, o RESVM supera significativamente o SVM de empacotamento (eu projetei o RESVM para esse fim, pois o aplicativo em que trabalho tem falsos positivos). Eu não acho que existem implementações R prontamente disponíveis, mas você pode implementá-las facilmente, envolvendo uma implementação SVM como kernlabou e1071. Observe que o SVM e o RESVM de embalagem têm vários hiperparâmetros que você precisa otimizar, para o qual eu recomendo a biblioteca Optunity (possui uma interface R).
Marc Claesen
1
@enricoferrero Eu tenho uma implementação de linha de comando do RESVM disponível em github.com/claesenm/resvm , embora esse código não seja muito bem polido. Esse repositório específico é escrito em Python e é usado como um driver para o pacote EnsembleSVM .
Marc Claesen 28/09
Parece que outra boa opção para um algoritmo SVM ensacado poderia ser usar o pacote mlr em R com um invólucro de ensacamento em torno de um aprendiz de SVM .
enricoferrero
7

Suponho que não haja tantos casos de spam nos seus 18000 casos. Para usar uma abordagem de aprendizado supervisionado, é necessário ter mais de uma categoria / classe em seus dados. Como você sabe que 2000 casos são spam, você pode rotular os 18.000 casos restantes como 'categoria desconhecida' e treinar qualquer modelo de aprendizado supervisionado para prever se um caso está no spam ou na categoria desconhecida. Em seguida, verifique a precisão do modelo fora da amostra para ver o desempenho do modelo para distinguir entre as duas categorias. Se tiver um bom desempenho, é garantida minha suposição de poucos casos de spam na categoria 'desconhecido'. Se o desempenho não for bom, você precisará usar um aluno não supervisionado (como kmeans, etc.) para agrupar e identificar grupos homogêneos separados em seus dados. Em seguida, identifique quais clusters contêm a maioria dos 2.000 e-mails de spam, e quais não, e rotule-os como spam e não spam, respectivamente. Em seguida, você pode prosseguir com a modelagem usando um aluno supervisionado como eu descrevi anteriormente.

FelixNNelson
fonte
2

O que o OP está falando é uma tarefa de classificação de uma classe, que é muito desafiadora.

Existem muitos trabalhos sobre essa tarefa em diferentes campos de pesquisa. Também escrevi um esquema eficiente de verificação de autoria intrínseca baseado no aprendizado de conjuntos . É muito fácil adaptá-lo para classificar spam / não spam, em vez de autores. Experimente e me avise se precisar de mais detalhes ...

Exceção não tratada
fonte
Eu recebo um erro 404 ao seguir seu link.
enricoferrero
Houve um erro de digitação. Desculpe por isso, deve funcionar agora ;-)
Exceção não tratada