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 rbf
vez de poly
ou linear
simplesmente não funcione, enquanto ele funciona realmente bem para poly
e 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.
fonte
Respostas:
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.
fonte
O problema acaba sendo o teste de parâmetros. Eu não tentei quando
gamma
está entre 0,0 (que é 1 / n_feature) e 1. Em meus dadosgamma
deve ser girar para algo em torno de1e-8
fonte