Implementação SVM mais rápida

16

Mais uma pergunta geral. Estou executando um SVM rbf para modelagem preditiva. Acho que meu programa atual definitivamente precisa de um pouco de velocidade. Eu uso o scikit learn com uma pesquisa de grade grossa a fina + validação cruzada.

Cada execução do SVM leva cerca de um minuto, mas com todas as iterações, continuo achando muito lenta. Supondo que, eventualmente, multiencadeie a parte da validação cruzada em vários núcleos, alguma recomendação para acelerar meu programa? Alguma implementação mais rápida de SVMs? Já ouvi falar de alguns SVMs de GPU, mas não me aprofundou muito nisso. Algum usuário e é mais rápido?

tomas
fonte
1
O SGDClassifier no scikit-learn é muito rápido, mas para SVMs lineares. Você pode perguntar ao pessoal do scikit-learn e também adicionar a tag scikit-learn.
Denis
O SVM não linear do kernel está fadado a ser lento. Talvez você deva começar a brincar com modelos lineares (confira o Vowpal Wabbit) e depois vá para não linear. Você pode até obter alguma não linearidade criando recursos mais complicados com modelos lineares. Com freqüência, os modelos não lineares resultam em algum aumento incremental de desempenho com grandes despesas computacionais. Nada contra o SVM do kernel não linear, mas apenas para ter em mente, do ponto de vista prático.
Vladislavs Dovgalecs 26/03
1
Você pode acelerar usando bibliotecas de ajuste especializadas para pesquisa de hiperparâmetros, que são muito mais eficientes que a pesquisa em grade (por exemplo, é necessário testar muito menos conjuntos de hiperparâmetros). Exemplos de bibliotecas de ajuste incluem Optunity e Hyperopt.
Marc Claesen

Respostas:

16

O algoritmo Sofia do Google contém uma implementação extremamente rápida de um SVM linear. É um dos SVMs mais rápidos do mercado, mas acho que ele suporta apenas classificação e apenas SVMs lineares.

Existe até um pacote R !

Zach
fonte
Seu link agora diz que "o pacote 'RSofia' foi removido do repositório CRAN". Alguma idéia do porquê?
James Hirschorn 2/11
@JamesHirschorn O desenvolvedor provavelmente parou de mantê-lo. Você pode instalá-lo a partir do arquivo CRAN.
Zach
10

A aceleração mais fácil que você obterá é executar a validação cruzada em paralelo. Pessoalmente, eu gosto do pacote de intercalação em R , que usa foreach como back-end. Isso facilita muito o farm de validação cruzada e pesquisa de grade em vários núcleos ou em várias máquinas.

O Caret pode lidar com muitos modelos diferentes, incluindo SVMs rbf:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

Observe que a biblioteca doMC () está disponível apenas no mac e no linux, deve ser executada a partir da linha de comando, não de uma GUI, e quebra todos os modelos do RWeka. Também é fácil usar clusters MPI ou SNOW como back-end paralelo, que não apresenta esses problemas.

Zach
fonte
Obrigado Zach. Acredito que os scikits também tenham uma maneira de executar a validação cruzada em paralelo, que é o que pretendo fazer. Excluindo isso, outras sugestões de aceleração? Obrigado.
tomas
@danjeharry: validação cruzada paralela é realmente a fruta mais baixa aqui, e eu sugiro fortemente que você explore isso primeiro. Além disso, não sei muito sobre como acelerar SVMs especificamente. Se você puder encontrar um algoritmo SVM paralelo, talvez seja uma boa ideia também. Quantas linhas / colunas está o conjunto de dados que você está usando para treinar?
Zach
Obrigado Zach vou olhar para cv paralelo. Estou fazendo cerca de 650 atributos e 5000 exemplos.
tomas
2

Dê uma olhada no módulo de multiprocessamento do Python . Torna as coisas paralelas realmente fáceis e é perfeito para validação cruzada.

bayerj
fonte
2

O R possui um ótimo pacote svm acelerado por GPU , rpusvm , leva ~ 20 segundos para treinar em amostras de 20K * 100 dimensões, e eu descobri que a CPU nunca é sobrecarregada por ela, portanto, ela usa a GPU com eficiência. No entanto, requer uma GPU NVIDIA.

Leo
fonte
1

Alerta: Este é um plug descarado.

Considere o DynaML uma biblioteca ML baseada em Scala em que estou trabalhando. Eu implementei LS-SVM (máquinas de vetores de suporte de mínimos quadrados) com base em kernel, juntamente com o ajuste automático de kernel, usando pesquisa de grade ou recozimento simulado acoplado.

http://mandar2812.github.io/DynaML/

mandar2812
fonte