A melhor maneira de lidar com o conjunto de dados de várias classes não balanceado com o SVM

9

Estou tentando criar um modelo de previsão com SVMs em dados bastante desequilibrados. Meus rótulos / saída têm três classes: positivo, neutro e negativo. Eu diria que o exemplo positivo representa cerca de 10 a 20% dos meus dados, neutro cerca de 50 a 60% e negativo cerca de 30 a 40%. Estou tentando equilibrar as classes, pois o custo associado a previsões incorretas entre as classes não é o mesmo. Um método foi reamostrar os dados de treinamento e produzir um conjunto de dados igualmente equilibrado, maior que o original. Curiosamente, quando faço isso, tenho a tendência de obter melhores previsões para a outra classe (por exemplo, quando equilibrei os dados, aumentei o número de exemplos para a classe positiva, mas nas previsões fora da amostra, a classe negativa foi melhor). Alguém pode explicar geralmente por que isso ocorre? Se eu aumentar o número de exemplos para a classe negativa, obteria algo semelhante para a classe positiva nas previsões fora da amostra (por exemplo, melhores previsões)?

Também estou muito aberto a outras reflexões sobre como eu posso lidar com os dados desequilibrados, impondo diferentes custos na classificação incorreta ou usando os pesos de classe no LibSVM (embora não tenha certeza de como selecionar / ajustar adequadamente).

tomas
fonte

Respostas:

6

Ter penalidades diferentes para as variáveis ​​de folga de margem para os padrões de cada classe é uma abordagem melhor do que reamostrar os dados. É assintoticamente equivalente a reamostrar de qualquer maneira, mas é mais fácil de implementar e contínuo, do que discreto, para que você tenha mais controle.

No entanto, escolher os pesos não é simples. Em princípio, você pode elaborar uma ponderação teórica que leve em consideração os custos de classificação incorreta e as diferenças entre os treinamentos, definindo probabilidades operacionais de classe anterior, mas não fornecerão o desempenho ideal. A melhor coisa a fazer é selecionar as penalidades / pesos para cada classe, minimizando a perda (levando em consideração os custos de classificação incorreta) pela validação cruzada.

Dikran Marsupial
fonte
Existe uma maneira automatizada de como fazer isso ou existem alunos com essa funcionalidade incorporada?
Vam
Normalmente, apenas escrevo uma função do matlab para avaliar a perda de um determinado conjunto de penalidades e, em seguida, minimizá-la usando o algoritmo simplex Nelder-Mead. Eu não conheço nenhuma biblioteca que tenha esse
recurso
@DikranMarsupial Uma pesquisa na grade das duas variáveis ​​de folga de margem em um problema de duas classes seria equivalente ao que você está fazendo com o algoritmo simplex?
Spacey
@Tarantula sim, o método de otimização preciso é relativamente sem importância, o ponto principal é garantir que você esteja otimizando a estatística de validação cruzada na qual está realmente interessado para os fins do seu aplicativo (ou seja, as mesmas frequências de classe encontradas no uso operacional e levando em consideração os custos de classificação incorreta, se conhecidos).
Dikran Marsupial