Eu tenho um conjunto de dados que contém ~ 100.000 amostras de 50 classes. Eu tenho usado o SVM com um kernel RBF para treinar e prever novos dados. O problema, porém, é que o conjunto de dados é inclinado para diferentes classes.
Por exemplo, Classe 1 - 30 (~ 3% cada), Classe 31 - 45 (~ 0,6% cada), Classe 46 - 50 (~ 0,2% cada)
Vejo que o modelo tende a prever muito raramente as classes que ocorrem com menos frequência no conjunto de treinamento, mesmo que o conjunto de teste tenha a mesma distribuição de classe que o conjunto de treinamento.
Estou ciente de que existem técnicas como 'subamostragem' em que a classe majoritária é reduzida para a classe menor. No entanto, isso é aplicável aqui onde existem tantas classes diferentes? Existem outros métodos para ajudar a lidar com este caso?
fonte
Eu não sou uma exportação no uso de SVMs, mas geralmente (se você estiver usando uma biblioteca de aprendizado de máquina como Python
scikit-learn
ou Rlibsvm
, existe oclass_weight
parâmetro ouclass.weights
, respectivamente.Ou, se você usasse um classificador Bayes, levaria em conta esse "desvio" pelas "probabilidades anteriores (de classe)" P (ω j )
fonte
Com relação à abordagem, o SVM com um kernel RBF faz um bom trabalho, mas os SVMs podem ser lentificados com grandes tamanhos de objeto, a menos que você esteja empregando CV com, por exemplo, um décimo dos dados atribuídos aleatoriamente a cada dobra. No entanto, você se perguntou por que está empregando SVMs em primeiro lugar?
Você já tentou de regressão linear múltipla, , onde cada registro de é codificado se o th objeto está em classe e caso contrário? Se a precisão da classificação for sensivelmente alta usando a regressão linear, seus dados serão separáveis linearmente e não serão necessários métodos mais complexos, como SVMs e ANNs. O passo 2 seria mostrar que o vizinho mais próximo k, Bayes ingênuo, análise discriminante linear (Fisher), regressão logística politômica, etc., quebram e falham.Y=Xβ Y yij=+1 i j yij=−1
Para terminologia, você pode abordar a questão de ter mais pesos de classe no contexto de "proporções mais baixas de objetos em determinadas classes" ou "tamanho de classe quase zero". A inclinação tende a ser usada para descrever a distribuição dos valores de um recurso, como a inclinação, caudas gordas etc.
Quantos recursos você tem? Você tentou agrupar não supervisionado (descoberta de classe) nos 100.000 objetos antes de tentar a classificação supervisionada (previsão de classe) com o SVM? Talvez os 100.000 objetos possam ser agrupados em menos classes que 50, para as quais a nova associação de classe possa ser usada como classe de destino durante a análise de classificação. Isso pode aliviar o problema de ter tamanho de classe próximo de zero.
fonte
Eu já enfrentei esse problema várias vezes ao usar o SVM com o kernel Rbf. Usar o kernel Linear em vez do Rbf resolveu meu problema, mas lidei com um menor número de classes. Os resultados foram menos distorcidos e mais precisos com o kernel linear. Espero que isso resolva seu problema.
Edit: Enquanto escrevia a resposta original, fui ingênuo o suficiente para não considerar o peso das aulas, como uma delas respondeu corretamente. Além disso, ao usar o rbf kernel, é importante garantir que o parâmetro de penalidade ou o valor 'C' conforme o módulo svm do sklearn seja muito genérico. Acho que o valor padrão de C = 1 é muito genérico na maioria das vezes e normalmente acabo com um valor de C = 10000. Espero que isso ajude outras pessoas que obtêm resultados distorcidos com o svm (rbf), apesar de ter uma boa distribuição de classes nos dados.
fonte