A saída do Scikit SVM na classificação multiclass sempre fornece a mesma etiqueta

10

Atualmente, estou usando o Scikit learn com o seguinte código:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

e ajuste e preveja para um conjunto de dados com 7 rótulos diferentes. Eu tenho uma saída estranha. Não importa qual técnica de validação cruzada eu use o rótulo previsto no conjunto de validação sempre será o rótulo 7.

Eu tento alguns outros parâmetros, incluindo o padrão completo ( svm.SVC()), mas contanto que o método do kernel que eu use seja em rbfvez de polyou linearsimplesmente não funcione, enquanto ele funciona realmente bem para polye linear.

Além disso, eu já tentei prever dados de trem em vez de dados de validação e eles se encaixam perfeitamente.

Alguém vê esse tipo de problema antes e sabe o que está acontecendo aqui?

Eu nunca olho para a minha distribuição de classe em detalhes, mas sei que deve ser em torno de 30% deles são 7, 14% são 4.

Eu até tento uma implementação manual 1-versus-rest e ainda não é útil.

Tamaki Sakura
fonte
Quais são as proporções dos seus dados que se enquadram em cada uma das classes?
gung - Restabelece Monica
De fato, existem mais "7" nos meus dados, mas não tanto. Cerca de 30% deles são 7. @gung
Tamaki Sakura

Respostas:

10

Uma causa provável é o fato de você não estar ajustando seu modelo. Você precisa encontrar bons valores para e . No seu caso, os padrões acabam sendo ruins, o que leva a modelos triviais que sempre produzem uma determinada classe. Isso é particularmente comum se uma classe tiver muito mais instâncias que as outras. Qual é a sua distribuição de classe?γCγ

O scikit-learn possui recursos limitados de pesquisa por hiperparâmetros, mas você pode usá-lo junto com uma biblioteca de ajustes como o Optunity . Um exemplo sobre o ajuste do SVC do scikit-learn com o Optunity está disponível aqui .

Isenção de responsabilidade: Eu sou o desenvolvedor principal do Optunity.

Marc Claesen
fonte
Na verdade, experimentei manuelmente todas as combinações de C e gama com uma potência de 10, de 0 a 4, mas todas elas me deram um total de 7. Cheguei a duvidar se compilei o aprendizado do scikit da maneira correta.
Tamaki Sakura
8

O problema acaba sendo o teste de parâmetros. Eu não tentei quando gammaestá entre 0,0 (que é 1 / n_feature) e 1. Em meus dados gammadeve ser girar para algo em torno de1e-8

Tamaki Sakura
fonte
4
Isso faz todo o sentido. Valores muito altos de levam a uma matriz do kernel próxima à matriz da unidade. Todas as previsões acabarão sendo o termo de viés (uma vez que todas as avaliações do kernel são muito próximas de zero), o que leva à classe 7 no seu caso. γ
Marc Claesen