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:
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?
Respostas:
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.)
fonte