Como aumentar a precisão dos classificadores?

16

Eu estou usando o exemplo do letter_recog.cpp do OpenCV para experimentar em árvores aleatórias e outros classificadores. Este exemplo possui implementações de seis classificadores - árvores aleatórias, reforço, MLP, kNN, ingênuo Bayes e SVM. É usado o conjunto de dados de reconhecimento de cartas da UCI com 20000 instâncias e 16 recursos, que eu divido ao meio para treinamento e teste. Tenho experiência com o SVM, então rapidamente defino seu erro de reconhecimento para 3,3%. Depois de algumas experiências, o que consegui foi:

Reconhecimento de letras UCI:

  • RTrees - 5,3%
  • Aumento - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Bayes - 11,5%
  • SVM - 3,3%

Parâmetros utilizados:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Impulso - tipo_ impulso = REAL, número_ fraco = 200, peso_trim_rate = 0,95, profundidade_máx = 7

  • MLP - método = BACKPROP, param = 0,001, max_iter = 300 (valores padrão - muito lento para experimentar)

  • kNN (k = 3) - k = 3

  • Bayes - nenhum

  • SVM - kernel RBF, C = 10, gama = 0,01

Depois disso, usei os mesmos parâmetros e testei nos conjuntos de dados Digits e MNIST extraindo primeiro os recursos de gradiente (elementos do tamanho 200 do vetor):

Dígitos:

  • RTrees - 5,1%
  • Impulso - 23,4%
  • MLP - 4,3%
  • kNN (k = 3) - 7,3%
  • Bayes - 17,7%
  • SVM - 4,2%

MNIST:

  • RTrees - 1,4%
  • Impulso - falta de memória
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Eu sou novo em todos os classificadores, exceto SVM e kNN, para esses dois posso dizer que os resultados parecem bons. E os outros? Eu esperava mais de árvores aleatórias, no MNIST kNN dá melhor precisão, alguma idéia de como aumentá-lo? Boost e Bayes oferecem precisão muito baixa. No final, eu gostaria de usar esses classificadores para criar um sistema de múltiplos classificadores. Algum conselho?

Mika
fonte

Respostas:

9

Redução de dimensionalidade

Outro procedimento importante é comparar as taxas de erro no conjunto de dados de treinamento e teste para verificar se você está fazendo um ajuste excessivo (devido à "maldição da dimensionalidade"). Por exemplo, se sua taxa de erro no conjunto de dados de teste for muito maior do que o erro no conjunto de dados de treinamento, esse seria um indicador.
Nesse caso, você pode tentar técnicas de redução de dimensionalidade, como PCA ou LDA.

Se você estiver interessado, escrevi sobre PCA, LDA e algumas outras técnicas aqui: http://sebastianraschka.com/index.html#machine_learning e no meu repositório GitHub aqui: https://github.com/rasbt/pattern_classification

Validação cruzada

Além disso, você pode dar uma olhada nas técnicas de validação cruzada para avaliar o desempenho de seus classificadores de maneira mais objetiva.


fonte
Sim, de fato, as taxas de erro no conjunto de dados de treinamento são de aproximadamente 0. Alterar parâmetros para reduzir o overfitting não resultou em maior precisão no conjunto de dados de teste no meu caso. Vou analisar as técnicas mencionadas o mais rápido possível e comentar, obrigado.
Mika
Quais são as proporções relativas do conjunto de dados de treinamento e teste btw? Alguma linha 70:30, 60:40 ou 50:50?
Primeiro conjunto de dados - o reconhecimento de letras UCI é definido como 50:50 (10000: 10000), os dígitos são cerca de 51:49 (1893: 1796) e o MNIST é cerca de 86:14 (60000: 10000).
Mika
Eu experimentei o PCA, ainda não obtive bons resultados com o forrest aleatório, mas o boost e o Bayes agora fornecem resultados semelhantes a outros classificadores. Encontrei uma discussão sobre o forrest aleatório aqui: stats.stackexchange.com/questions/66543/… É possível que eu não esteja fazendo um ajuste excessivo, mas não consegui encontrar o erro de previsão OOB (out-of-bag) mencionado lá. Agora, experimente executar um grande número de árvores para ver se a precisão melhorará.
Mika
Ok, parece que você está progredindo um pouco :) Uma pergunta trivial, mas você padronizou seus recursos (z-score) para que eles fiquem centralizados na média com desvio padrão = 1?
5

Eu esperava mais de árvores aleatórias :

  • Com florestas aleatórias, geralmente para recursos N, os recursos sqrt (N) são usados ​​para cada construção da árvore de decisão. Como no seu caso, N = 20, você pode tentar definir max_depth (o número de sub-recursos para construir cada árvore de decisão) como 5.

  • Em vez de árvores de decisão, modelos lineares foram propostos e avaliados como estimadores de base em florestas aleatórias, em particular regressão logística multinomial e Bayes ingênuo. Isso pode melhorar sua precisão.

Em MNIST kNN dá melhor precisão, alguma idéia de como aumentá-lo?

  • Tente com um valor mais alto de K (digamos 5 ou 7). Um valor mais alto de K daria a você mais evidências de suporte sobre o rótulo da classe de um ponto.
  • Você poderia executar o PCA ou a Análise Discriminante Linear de Fisher antes de executar o k-vizinho mais próximo. Com isso, você pode se livrar de recursos correlatos enquanto calcula as distâncias entre os pontos e, portanto, seus vizinhos k seriam mais robustos.
  • Tente diferentes valores de K para pontos diferentes, com base na variação nas distâncias entre os vizinhos K.
Debasis
fonte
Acredito que você esteja se referindo ao parâmetro nCet_vars do OpenCV (não max_depth), que defino como o valor padrão sqrt (N), que é nactive_vars = sqrt (16) no primeiro conjunto de dados e sqrt (200) nos outros dois. max_depth determina se as árvores crescem até a profundidade máxima (25 é o seu valor máximo) e equilibra entre underfitting e overfitting, mais sobre isso aqui: stats.stackexchange.com/questions/66209/… Não tenho certeza sobre min_sample_count, mas tentei vários valores e defini-lo para 1 funcionou melhor.
Mika
A documentação do OpenCV fornece uma breve explicação dos parâmetros: docs.opencv.org/modules/ml/doc/… Por enquanto, gostaria de fazer com que as árvores aleatórias funcionassem razoavelmente bem e manter as coisas simples, porque quero me concentrar em trabalhar com um sistema classificador múltiplo.
Mika
Sobre o kNN - todas essas sugestões são realmente boas, mas o que eu quis dizer é que o kNN teve um desempenho melhor que o classificador de árvores aleatórias e acho que há muito espaço para melhorias com as árvores aleatórias.
Mika
sim, não sei por que a floresta aleatória não está funcionando tão bem (ou melhor) do que a abordagem simplista do k-NN ... pode ser o caso de uma abordagem baseada no kernel em que você tenta diretamente estimar P (y | D) (dados fornecidos de saída), como em k-NN, sem estimar P (theta | D) (dados latentes do modelo), como nos modelos paramétricos.
Debasis