sklearn - problema de sobreajuste

8

Estou procurando recomendações sobre o melhor caminho a seguir para o meu atual problema de aprendizado de máquina

O resumo do problema e o que eu fiz é o seguinte:

  • Tenho mais de 900 tentativas de dados de EEG, em que cada tentativa dura 1 segundo. A verdade básica é conhecida para cada um e classifica o estado 0 e o estado 1 (divisão de 40 a 60%)
  • Cada tentativa passa por pré-processamento, onde filtra e extrai a energia de certas bandas de frequência, e elas formam um conjunto de recursos (matriz de recursos: 913x32)
  • Então eu uso o sklearn para treinar o modelo. cross_validation é usado onde eu uso um tamanho de teste de 0,2. O classificador está definido como SVC com o kernel rbf, C = 1, gama = 1 (tentei vários valores diferentes)

Você pode encontrar uma versão abreviada do código aqui: http://pastebin.com/Xu13ciL4

Meus problemas:

  • Quando uso o classificador para prever rótulos para o meu conjunto de testes, todas as previsões são 0
  • a precisão do trem é 1, enquanto a precisão do conjunto de testes é de cerca de 0,56
  • meu gráfico de curva de aprendizado é assim:

insira a descrição da imagem aqui

Agora, este parece ser um caso clássico de sobreajuste aqui. No entanto, é improvável que o ajuste excessivo aqui seja causado por um número desproporcional de recursos nas amostras (32 recursos, 900 amostras). Eu tentei várias coisas para aliviar esse problema:

  • Tentei usar a redução de dimensionalidade (PCA) no caso de ter muitos recursos para o número de amostras, mas as pontuações de precisão e o gráfico da curva de aprendizado têm a mesma aparência acima. A menos que eu defina o número de componentes abaixo de 10, quando a precisão do trem começa a diminuir, mas isso não é esperado, dado que você está começando a perder informações?
  • Eu tentei normalizar e padronizar os dados. A padronização (DP = 1) não altera as pontuações de trem ou precisão. Normalizar (0-1) reduz a precisão do meu treinamento para 0,6.
  • Eu tentei uma variedade de configurações C e gama para SVC, mas elas não mudam a pontuação
  • Tentei usar outros estimadores como o GaussianNB e até métodos de conjunto como o adaboost. Sem alteração
  • Tentou definir explicitamente um método de regularização usando linearSVC, mas não melhorou a situação
  • Tentei executar os mesmos recursos através de uma rede neural usando theano e a precisão do trem é de 0,6, o teste é de 0,5

Fico feliz em continuar pensando no problema, mas neste momento estou procurando um empurrão na direção certa. Onde está o meu problema e o que posso fazer para resolvê-lo?

É perfeitamente possível que meu conjunto de recursos simplesmente não faça distinção entre as duas categorias, mas eu gostaria de tentar outras opções antes de chegar a essa conclusão. Além disso, se meus recursos não diferenciarem, isso explicaria as baixas pontuações no conjunto de testes, mas como você obtém uma pontuação perfeita no conjunto de treinamento nesse caso? Isso é possível?

Simon
fonte
1
Como eram os dados em 2 ou 3 dimensões após a aplicação do PCA, havia clusters perceptíveis? Que exemplos estão sendo classificados incorretamente, existe um padrão?
Image_doctor 12/08
Como são os espectros de potência dos traços? se você plota os espectros médios para cada classe, eles parecem diferentes; se sim, como e como otimizar um classificador para capturar essa diferença?
image_doctor
1) Você pode nos mostrar o gráfico de cluster do PCA ?, 2) Você tentou as árvores de decisão? Se os recursos originais forem um pouco controláveis ​​pelo homem, você poderá entender o que está acontecendo de errado. Caso contrário (exceto alguns erros bobos da sua parte), parece que seus recursos simplesmente não são discriminativos o suficiente.
Lollercoaster
É muito possível que os dados do EEG não sejam separáveis, mas você inspecionou os conjuntos de testes de treinamento v para garantir que eles não sejam tendenciosos (por exemplo, um só tem exemplos positivos ou é normalizado de maneira diferente)?
Jamesmf 11/11/2015
1
Você pode postar os dados em algum lugar? "AllData" ou "features_all" (sem normalização e PCA).
stmax

Respostas:

1

Para verificar se o SVM consegue capturar algum sinal, tente equilibrar seus dados: crie conjuntos de treinamento e teste que consistam em exatamente 50% de amostras positivas e 50% de negativas (ou seja, subamostrando aleatoriamente o número que for maior). Padronize também os dados (subtraia a média e divida pelo desvio padrão).

(Para balanceamento, você pode tentar alterar o parâmetro class_weight no sklearn, mas achamos que o método manual (subamostragem) funciona melhor.)

Valentas
fonte