Classificação de email em R

8

Estou trabalhando em um projeto no R onde tenho cerca de 1200 e-mails de uma empresa, a maioria rotulada como classe1 ou classe2, que são os tipos de solicitações. Cerca de 1000 e-mails são rotulados como classe1e 200 são rotulados como classe2. Meu objetivo é usar o aprendizado supervisionado para criar um modelo que classifique novos e-mails.

Porém, depois de muito pré-processamento (análise, remoção de palavras-chave, etc.) e tentativa de algoritmos típicos (SVM, árvores de decisão etc.) em uma matriz de termos de documentos, minha matriz de confusão continha muitos falsos positivos e falsos negativos, mas apenas alguns falsos negativos com SVM.

Eu estou querendo saber como eu poderia melhorar meus resultados? Preciso usar oversampling ou representação de recurso de dois gramas? Eu acho que o problema é que os tópicos das duas categorias são muito próximos.

MarcelRitos
fonte
Você pode fornecer mais algumas informações? Que tipo de SVM você está usando - como em, qual função do kernel e como você otimizou os parâmetros? Você pode nos dar mais informações sobre os métodos de pré-processamento que você usou? Além disso, notei que você disse que havia basicamente duas classes ... como você está lidando com as outras classes?
Kyle.
"duas categorias são muito próximas" - você pode nomeá-las (ou similares)?
lukeA
Você poderia fornecer os rótulos reais da classe e um texto ilustrativo para cada classe? A ciência é os detalhes ...
Brandon Loudermilk

Respostas:

2

(Todos os emails são em francês ou em inglês)

Métodos de pré-processamento:

  • Mesclar "Resumo" e "Conteúdo", que são o cabeçalho do email e o conteúdo
  • Remova todos os endereços de e-mail
  • Remover tudo "De: Alguém Para: alguém ... assunto: alguma coisa"
  • Remova todas as imagens incluídas no email
  • Encomende o email de acordo com a classe
  • Substitua todo o sotaque francês por nenhum sotaque como é -> e; ê -> e ...
  • Coloque o texto para diminuir
  • remover pontuação
  • remover números
  • espaço em branco da tira
  • remova o primeiro nome de uma lista e algumas palavras específicas
  • remover palavras de parada em francês e inglês
  • documento original em francês e inglês
  • Remover termo

-> Em seguida, documente a matriz de termos, com TF-IDF

As duas classes são de um suporte técnico, duas categorias "complexo" e "fácil", "complexo" são tópicos sobre finanças (em teoria), problema "simples" com o software (em teoria), mas na prática eles têm muitas palavras em comum. E nas outras aulas eu não as levo em conta, apenas me concentro nas duas por enquanto

Na verdade, o tipo de algoritmo de classificação que usei não é tão relevante porque tentei com 5 algo e nenhum deu bons resultados

Exemplo (matriz de confusão) Árvore de decisão:

  Decision tree:           

pred:

335 10
59 | 12

SVM:

331 1
83 1 1

Knn (n=10):

330 2

83 1

Naive Bayes:

1 | 83

12 320

bouritosse
fonte
Você pode ter bons motivos para isso, mas por que você remove campos como anexos e remetente? Isso pode conter informações. Descobri em uma configuração um tanto semelhante que certas pessoas são mais propensas a criar documentos de um determinado tipo.
S van Balen
A matriz de confusão para RN está correta? (Estou assumindo superior esquerdo é classe 1 real e previsão)
S van Balen
0

Como você está lidando com apenas 2 classes, você pode criar um commonality.cloud()de ambas as classes (eu uso essa função no R, não conheço outras línguas).

Ele mostrará as palavras que são comuns em class1e class2. Essas palavras talvez não ajudem o algoritmo a distinguir as classes, para que você possa remover essas palavras e fazer alguns testes.

TheBiro
fonte
0

Você pode tentar um classificador bayesiano em vez de SVM ou Árvores de Decisão. Seu problema é uma generalização do problema do filtro de spam, ou seja, a classificação de emails em 'Spam' (classe 1) ou 'Não é spam' (classe 2). A maioria dos filtros de spam usa a classificação bayesiana em vez do método de aprendizado supervisionado mais comum.

Alex S Kinman
fonte
0

Você poderia estudar os recursos: notei que você removeu os números. Pode ser que você tenha feito isso porque é pouco provável que colidam, mas você também pode resolver isso introduzindo classes de palavras (@ number @ ou @ big_number @, etc).

Você pode tentar usar as classes de palavras em outros grupos de palavras também. Se isso funcionar, isso pode indicar que o seu aparelho sofre com esparsidade (o que não me surpreenderia). Você pode usar um seletor de recursos para esse fim, por exemplo, classificando suas dimensões no ganho de informações.

As formas mais avançadas de combater a escassez incluem: o algoritmo de Rocchio ou o word2vec.

S van Balen
fonte