Atualmente, estou experimentando o gridsearch para treinar uma máquina de vetores de suporte. Entendo que, se possuo o parâmetro gama e C, a função R tune.svm executa uma validação cruzada de 10 vezes para todas as combinações desses 2 parâmetros.
Como não sabia como começar, tentei obter algumas informações sobre isso, por exemplo, a Wikipedia 2 sugere valores que não são lineares, por exemplo, C no intervalo {10, 100, 1000}.
Até agora, uso os exemplos do meu segundo link da wikipedia, que é:
gammas = 2^(-15:3)
costs = 2^(-5:15)
O que resulta em 399 combinações.
Isso leva muito, muito tempo (~ 2000 amostras). Por exemplo, para o kernel "radial", meu melhor resultado é gama = 0,5 e custo = 2.
Não poderia obter o mesmo resultado se apenas usasse valores como (1, 2, 3, 4, ... 10) para custos e (0, 0,5, 1, 1,5, 2) para gammas? Eu sei que este exemplo é construído porque eu já sei o resultado.
Minha pergunta:
Mas por que essa escala exponencial?
Existem tantos valores entre 0 e 1 que acho que é um desperdício de tempo de computação e tão poucos números muito grandes que, de qualquer maneira, não foi possível encontrar um resultado exato. Só faria sentido para mim se isso fosse usado para encontrar um intervalo menor, digamos que sabemos que o melhor custo é 2 ^ 3 e depois procuramos por ele. Mas em nenhum lugar é mencionado que é realizado dessa maneira.
Respostas:
A razão para a grade exponencial é que C e gama são parâmetros de escala que agem de forma multiplicativa, portanto, duplicar a gama é tão provável que tenha um efeito quase tão grande (mas na outra direção) quanto reduzi-la pela metade. Isso significa que, se usarmos uma grade com valores aproximadamente exponencialmente crescentes, haverá aproximadamente a mesma quantidade de "informações" sobre os hiperparâmetros obtidos pela avaliação do critério de seleção do modelo em cada ponto da grade.
Eu costumo pesquisar em uma grade com base em potências inteiras de 2, o que parece funcionar muito bem (estou trabalhando em um artigo para otimizar a pesquisa de grade - se você usar uma grade muito fina, poderá acabar ajustando demais o critério de seleção do modelo , portanto, uma grade bastante grossa acaba sendo boa para generalização e também para despesas computacionais.).
Infelizmente, quanto ao amplo intervalo, os valores ótimos de hiperparâmetros dependem da natureza do problema e do tamanho do conjunto de dados e não podem ser determinados a priori. A razão para a grade grande, aparentemente inútil, é garantir que bons valores sejam encontrados automaticamente, com alta probabilidade.
Se a despesa computacional é um problema, em vez de usar a pesquisa em grade, você pode usar o algoritmo simplex Nelder-Mead para otimizar o erro de validação cruzada. Este é um algoritmo de otimização que não requer informações de gradiente, por isso é bastante simples de usar para qualquer problema em que a pesquisa em grade seja usada atualmente. Eu não sou um usuário R, mas o Nelder-Mead é implementado no R via
optim
.fonte
Isso é chamado de "ajuste de parâmetro" para SVMs. Uma das abordagens mais fáceis é levar a mediana de cada um para os maiores níveis de precisão de previsão de classe obtidos à medida que você passa pelas dobras de CV.
Além disso, como regra geral, use um classificador mais simples para determinar se seus dados são separáveis linearmente. Se o vizinho mais próximo k (kNN) ou a regressão linear funcionar melhor, você não deve usar uma abordagem mais cara (computacionalmente) como o SVM. O SVM pode ser facilmente usado em excesso, portanto, avalie a regressão linear, kNN, análise discriminante linear, florestas aleatórias etc.
fonte