Anteriormente, vimos como executar a biblioteca LIBSVM usando o código em Java. Agora, o exercício é utilizar o código compilado em C++. No Windows é necessário que RTools esteja instalado (Dica:Instale na raiz do computador "C:\").
Esse componente do R instala juntamente com outras funções, o compilador de código fonte em C++ denominado MinGW. Qualquer outro compilador pode ser utilizado nesse exercício.
O próximo passo é obter o código fonte do programa libSVM que desejamos utilizar. Aqui, escolhemos o código desenvolvido por Youngmin Cho disponível aqui (arccos.tar.gz)! Baixe os arquivos e extrai-os em uma pasta (por exemplo C:\Blog\DeepLearning).
Em seguida, fazemos a preparação para a base de dados como no post Usando a biblioteca LIBSVM no R:
#Limpa o Workspace rm(list=ls()) #Importa os dados German.csv setwd("C:\\Blog\\DeepLearning") library(RCurl) URL <- "https://dl.dropboxusercontent.com/u/36068691/Blog/german.csv" x <- getURL(URL) dados <- read.csv(textConnection(x)) #Separa o vetor de resposta RESPONSE<-dados$RESPONSE #Troca zero por -1 RESPONSE[RESPONSE==0]<- -1 #Remove a coluna RESPONSE dados<-dados[,-32]O formato exigido pelo LIBSVM deve seguir o formato: [categoria] [coluna1]:[valor1] [coluna2]:[valor2] .... Nesse sentido, fazemos:
#Função para formato libSVM libsvm<-function(x){ tt<-cbind(t(x),1:length(x)) tt<-tt[tt[,1]>0,] str<-paste(c(rbind(tt[,2],":",tt[,1]," ")),collapse ="") return(str) } #Cria as strings str<-"" for(i in 1:nrow(dados)){ x<-dados[i,] str<-rbind(str,libsvm(x)) } str<-str[-1,] #Adiciona a resposta txt<-cbind(RESPONSE,str) txt<-apply(txt,1,function(x) paste(x[1],x[2])) write.table(txt,"C:/Blog/german",quote=F,row.names=F,col.names=F)O arquivo german gerado já estará no formato do LIBSVM. Em seguida, precisamos criar os arquivos executáveis por meio do código:
#Criar os executáveis system("make all")Após a criação dos arquivos o resultado que surge no console é: Criados os arquivos, fazemos a invocação do arquivo executável svm-train:
#Em seguida executamos a função C++ parms<-c("-s 0 "," -t 5 "," -N 0 1 1 "," -d 3 "," -g 1 "," german "," saida") #Passa os parâmetros system(paste("svm-train ",paste(parms,collapse = "")))Os parâmetros devem seguir a notação LIBSVM como a apresentado a seguir: Após a execução surgem alguns resultados acerca do modelo ajustado: Após a execução, um arquivo denominado saída é criado e todos os componentes para a previsão do modelo são inseridos nesse arquivo. Se quisermos, por exemplo, avaliar a precisão desse modelo podemos usar o arquivo executável svm-predict na forma a seguir:
#Faz a previsão para um novo conjunto de dados (german) system("svm-predict german saida resultado.txt") #Lê os dados preditos de volta para o R predito<-read.table("resultado.txt")O comando anterior deve conter três componentes: a base que deseja-se fazer a previsão (validação) aqui denominada german (e deve ter a mesma estrutura da base de treinamento), o arquivo de treinamento (denominado saida) e o arquivo com os valores preditos (aqui denominado resultado.txt). O resultado é apresentado a seguir:
Para outros modelos é necessário executar o mesmo código com variações nos parâmetros e avaliar a acurácia de cada modelo gerado para cada parâmetro selecionado.