Estou usando modelos SVM para fazer previsões de curto prazo de poluentes do ar. Para treinar um novo modelo, preciso encontrar metaparameters apropriados para um modelo SVM (refiro-me a C, gama e assim por diante).
A documentação do Libsvm (e muitos outros livros que li) sugere o uso da pesquisa em grade para encontrar esses parâmetros - então eu basicamente treino o modelo para cada combinação desses parâmetros em um determinado conjunto e escolho o melhor modelo.
Existe alguma maneira melhor de encontrar metaparameters ótimos (ou quase ótimos)? Para mim, é principalmente uma questão de tempo de computação - uma pesquisa em grade desse problema leva cerca de duas horas (depois de algumas otimizações).
Prós da pesquisa em grade:
- Pode ser facilmente paralelizado - se você tiver 20 CPUs, ele será executado 20 vezes mais rápido, paralelizar outros métodos é mais difícil.
- Você verifica grandes partes do espaço do metaparameter, portanto, se houver uma boa solução, você a encontrará.
fonte
Se você assumir que existe uma função relativamente suave subjacente à grade de parâmetros, há certas coisas que você pode fazer. Por exemplo, uma heurística simples é começar com uma grade muito grossa de parâmetros e, em seguida, usar uma grade mais fina em torno das melhores configurações de parâmetros da grade grossa.
Isso tende a funcionar muito bem na prática, com ressalvas, é claro. A primeira é que o espaço não é necessariamente tranquilo e pode haver ótimos locais . A grade grossa pode faltar completamente e você pode acabar com uma solução abaixo do ideal. Observe também que, se você tiver relativamente poucas amostras em seu conjunto de espera, poderá ter várias configurações de parâmetros com a mesma pontuação (erro ou qualquer métrica que esteja usando). Isso pode ser particularmente problemático se você estiver aprendendo em várias classes (por exemplo, usando o método one-versus-all ), e você tiver apenas alguns exemplos de cada classe em seu conjunto de espera. No entanto, sem recorrer a técnicas desagradáveis de otimização não-linear, isso provavelmente serve como um bom ponto de partida.
Há um bom conjunto de referências aqui . No passado, adotei a abordagem de que você pode razoavelmente estimar uma boa variedade de hiperparâmetros do kernel inspecionando o kernel (por exemplo, no caso do kernel RBF, garantindo que o histograma dos valores do kernel ofereça uma boa distribuição de valores, em vez de ser inclinado para 0 ou 1 - e você pode fazer isso automaticamente também sem muito trabalho), o que significa que você pode diminuir o intervalo antes de iniciar. Em seguida, você pode concentrar sua pesquisa em outros parâmetros, como o parâmetro de regularização / capacidade. No entanto, é claro que isso só funciona com kernels pré-computados, embora você possa estimar isso em um subconjunto aleatório de pontos se não quiser usar kernels pré-computados, e acho que essa abordagem também seria boa.
fonte
Eu uso o recozimento simulado para pesquisar parâmetros.
O comportamento é governado por alguns parâmetros:
k
é a constante de Boltzmann.T_max
é a sua temperatura inicial.T_min
é o seu limite final.mu_T
(μ
) é o quanto você abaixa a temperatura (T->T/μ
)i
é o número de iterações em cada temperaturaz
é um tamanho de etapa - você determina o que exatamente isso significa. Eu me movo aleatoriamente por dentroold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
todas asi
iterações até você acertarT_min
.Brinque um pouco com os parâmetros e você poderá encontrar um conjunto que funcione bem e rápido.
E a Biblioteca Científica GNU inclui recozimento simulado.
fonte
Se alguém estiver interessado aqui, alguns dos meus pensamentos sobre o assunto:
fonte
fonte