Como classificar dados usando SVM no R

Confira nosso curso online de QGIS

Inteligência Artificial não é somente para o pessoal da Ciências da Computação – Engenheiros também podem utilizá-la. Aprenda como usar SVM no R.

Normalmente quando pensamos em inteligência artificial, não conseguimos imaginar como utilizar ela. Somos meros engenheiros ambientais que não podem utilizar inteligência artificial.

Embora suas técnicas tenham nomes complicados, como Aprendizado de Maquina (“Machine Learning”), Redes Neurais Artificiais (“Artificial Neural Network”) ou Algoritmos Genéticos (“Genetic Algorithms”), isso não deveria nos impedir de utiliza-las.

Uma das técnicas de inteligência artificial, as Maquinas de Vetores Suporte (SVM – “Support Vector Machine”), pode ser facilmente implementada utilizando o R. Acompanhe nosso tutorial.

Um pouco de teoria…

As maquinas de vetores suporte são definidas como uma técnica que visa traçar uma linha separando um conjunto de dados de entrada, seja para classificação, regressão ou outras análises, sendo que os pontos localizados próximos desta linha são chamados de vetores de suporte.

Exemplo simples de um separador ótimo em SVM.
Exemplo simples de um separador ótimo em SVM.

Na classificação de dados, a técnica das SVM busca determinar uma linha (em outras palavras, um separador linear ótimo) onde a distância dos vetores de suporte é sempre maior, maximizada. Entretanto, há situações onde isso não é possível, e neste caso, permite-se que a SVM classifique alguns dados incorretamente, até um certo grau.

Essa é a função da constante C (parâmetro de penalização), onde valores maiores permitem um maior número de classificações incorretas.

Salienta-se que nem sempre é possível classificar linearmente os dados em duas dimensões. Neste caso, os dados de entrada são mapeados em uma dimensão mais elevada, por meio de funções de núcleo (kernel functions).

Há vários tipos de funções de núcleo, sendo que os mais comuns são função de base radial, função polinomial e perceptron.

SVM no R

O pacote que utilizaremos para desenvolver nosso código e aplicar SVM será o ‘e1071’, que apresenta diversas funções para classificação, entre elas a Support Vector Machine. Para instalá-lo e carregá-lo no R, utilizaremos, respectivamente, as funções install.packages() e o library().

Além disso, iremos utilizar dados que já acompanham o software R e para carregá-los, utilizaremos a função attach() e o conjunto de dados ‘iris’.


install.packages("e1071")
library("e1071")
attach(iris)

O conjunto de dados iris apresenta várias medições de três espécies de plantas que utilizaremos para classifica-las. A técnica de SVM pode ser aplicadas em diversos contextos de classificação, como solos, genética e até mesmo hidrologia.

Leia também: Como evitar enchentes usando inteligência artificial.

Neste exercício de classificação com SVM, seria como se tivéssemos as medições das plantas, mas não sabemos quais são suas espécies, e utilizaremos a técnica SVM para nos dizer quais são as espécies de cada medição (amostra).

Porém, quando trabalhamos com inteligência artificial, precisamos treinar nosso modelo para reconhecer nossos dados inseridos, ou seja, vamos fornecer para ele alguns dados já classificados para que ele crie um modelo e possa classificar nossos dados futuros.

Classificando dados com SVM

Inicialmente, vamos separar nossos dados em dados brutos e resultados, de forma a alimentarmos nosso modelo SVM e posteriormente realizar a classificação.

# Separando dados levantados das classificações
dd_brutos <- subset(iris, select = -Species)
resultados <- iris$Species

# Criando modelo SVM a partir do conjunto de dados iris
modelo_svm <- svm(Species ~ ., data = iris)

# Resumo do modelo
summary(modelo_svm)

No código acima, utilizamos a função subset() para separar do conjunto inicial os resultados (ou seja, as espécies) e criamos uma variável chamada resultados somente as elas.

Depois, utilizamos a função svm() para criar um modelo onde informamos que a variável dependente (a saída do modelo) será a coluna Species e as variáveis independentes são todas as outras colunas (por isso o ponto depois do til). E utilizamos a função summary() para observarmos um resumo do modelo criado.

No R, representamos funções f(x) = x utilizando o til (~), ou seja, a relação entre x e y obtida numa equação como y = ax + b pode ser representada como y ~ x.

Agora que temos um modelo para classificar nossos dados, vamos utilizá-lo para classificar os dados que separamos anteriormente, ou seja, vamos utilizar os dados sem respostas (sem classificação) e comparar se nosso modelo esta classificando eles corretamente.


teste001 <- predict(modelo_svm, dd_brutos)
table(teste001, resultados)

Neste momento, utilizamos a função predict(), que significa prever, para que nosso modelo nos diga quais são as classes dos nossos dados a partir das medições das plantas e em seguida, usamos a função table() para agrupar nossos dados no formato de tabelas.

A tabela criada, comparando os dados reais com os dados previstos, é chamada de Matriz de Confusão – ou tabela de contingência. Os valores que encontram-se na diagonal são aqueles classificados corretamente.

É possível melhorar nosso modelo SVM?

Sim. Havíamos comentado no inicio que temos uma constante C (parâmetro de penalização) e funções de núcleo e é por meio delas que melhoramos a performance do nosso modelo. No pacote ‘e1071’, utilizamos a função tune() para encontrar a melhor condição para esses parâmetros.


tune_svm <- tune(svm, train.x = dd_brutos, train.y = resultados, kernel = "radial", ranges = list(cost=10^(-1:2), gamma=c(0.5, 1,2))

print(tune_svm)

Neste código, indicamos qual o modelo a ser melhorado, quais seus parâmetros e resultados, a função de núcleo desejada e a abrangência (“ranges”) da constante C e Gamma a serem testadas. A função print() irá mostrar os parâmetros escolhidos, os quais vamos inserir novamente na função svm().

Por fim, basta rodarmos novamente nosso modelo na função predict() para visualizar se nosso modelo melhorou.


modelo_svm_melhorado <- svm(Species ~ ., data = iris, kernel="radial", cost=1, gamma=0.5)
teste002 <- predict(modelo_svm_melhorado, dd_brutos)
table(teste002, resultados)

Note que nossa matriz de confusão não modificou, ou seja, mesmo adotando novos valores para a constante C e Gamma, nosso classificador não apresentou melhorias.

Leia também: Inteligência Artificial nas Ciências Ambientais.

Trabalhar com inteligência artificial pode parecer uma área exclusiva para os programadores e técnicos de TI, mas ela pode ser adotada por nós, engenheiros ambientais para solucionar problemas ambientais complexos e nos auxiliar no árduo trabalho de melhorar a qualidade ambiental de onde vivemos.

Fontes Consultadas:

SVM example with Iris Data in R. Disponível em: http://rischanlab.github.io/SVM.html. Acesso em 21 jul. 2017.

HASTIE, T. et al. The Elements of Statistical Learning. Nova Iorque: Springer, 2009. 745 p.

LORENA, Ana Carolina; CARVALHO, André C.P.L.F. Uma introdução às support vector machines. Revista de Informática Teórica e Aplicada. v. 14, n.2. 2007. 25 p.

KARATZOGLOU, A. et al. Support Vector Machines in R. Journal of Statistical Software. v. 15, n. 9. 2006. 28 p.

MEYER, David et al. Package 'e1071'. 2015. 62 p. Disponível em: . Acesso em 16 ago. 2015.

RUSSEL, Stuart. NORVIG, Peter. Inteligência Artificial. Rio de Janeiro: Elsevier, 2004. 1021 p.

SEMOLINI, Robinson. Support Vector Machines, Inferência Transdutiva e o Problema de Classificação. Dissertação (Mestrado) – PPG em Engenharia Elétrica e Computação. Universidade Estadual de Campinas, 2002. 142 p.


Clique na figura abaixo e assine nossa lista de emails para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".

Apostila Mapa de Localização Banner

Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de geoprocessamento, mineração e hidrologia. Busca soluções utilizando softwares como QGIS, R e Python.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *