Support Vector Machines: diferenças entre revisões

Fonte: aprendis
Saltar para a navegaçãoSaltar para a pesquisa
Sem resumo de edição
 
(Há 7 edições intermédias do mesmo utilizador que não estão a ser apresentadas)
Linha 1: Linha 1:
As Support Vector Machines (SVM) são uma das técnicas mais utilizadas em [[Data Mining]]  quando é necessário construir um classificador para dados constituídos maioritariamente por variáveis numéricas continuas/discretas.  
As Support Vector Machines (SVM) são uma das técnicas mais utilizadas em [[Data Mining]]  quando é necessário construir um classificador para dados constituídos maioritariamente por variáveis numéricas continuas/discretas. No entanto dada a sua complexidade existem varias variáveis que podem e devem ser ajustadas a quando da construção do classificador e a compreensão das mesmas necessita um estudo aprofundado o que implica que seja muito difícil por vezes de obter uma justificação clara para o classificador obtido. No entanto se utilizarmos as ferramentas certas e os valores por defeito podemos de forma rápida construir um classificador e utiliza-lo, por exemplo através da plataforma [[WEKA]].  
=A Ideia por detrás da SVM=
=A Ideia por detrás da SVM=
A estratégia que a SVM implementa para construir um classificador é bastante simples:
A estratégia que a SVM implementa para construir um classificador é bastante simples:
Se tivermos x bolas de duas cores [[Ficheiro:bolas1.png|50px]] podemos simplesmente colocar uma linha de forma a que se separem [[Ficheiro:bolas2.png|50px]], isto permite-nos saber a partir desta informação que bolas acima da linha são azuis e bolas abaixo são vermelhas, o problema é que a linha pode estar em muitas posições diferentes e aparentemente esta não é a melhor [[Ficheiro:bolas3.png|50px]] e por isso recolocamos a linha [[Ficheiro:bolas4.png|50px]] de forma a que o classificador seja preciso [[Ficheiro:bolas5.png|50px]].
Se tivermos x bolas de duas cores [[Ficheiro:bolas1.png|50px]] podemos simplesmente colocar uma linha de forma a que se separem [[Ficheiro:bolas2.png|50px]], isto permite-nos saber a partir desta informação que bolas acima da linha são azuis e bolas abaixo são vermelhas, o problema é que a linha pode estar em muitas posições diferentes e aparentemente esta não é a melhor [[Ficheiro:bolas3.png|50px]] e por isso recolocamos a linha [[Ficheiro:bolas4.png|50px]] de forma a que o classificador seja preciso [[Ficheiro:bolas5.png|50px]].
No entanto a realidade é que casos assim não existem, na verdade todos os casos que uma SVM classifica são sempre uma mistura de bolas azuis e vermelhas  [[Ficheiro:bolas6.png|50px]]  e por isso não existe nenhuma linha que separe estes casos [[Ficheiro:bolas7.png|50px]] mas de certeza  que existe um plano! É por isso aumentamos uma (geralmente varias dimensões diferentes) dimensão para assim encontrar o plano que divide as bolas.[[Ficheiro:bolas8.png|50px]] Este passo é o mais complicado de entender pois sabemos que em duas dimensões o que é uma recta e em 3 dimensões um plano mas e em 4 ou em 6,7,20,50,1000 dimensões? É por isso que chamamos de hiperplano ao que separa as bolas vermelhas das azuis.\p
No entanto a realidade é que casos assim não existem, na verdade todos os casos que uma SVM classifica são sempre uma mistura de bolas azuis e vermelhas  [[Ficheiro:bolas6.png|50px]]  e por isso não existe nenhuma linha que separe estes casos [[Ficheiro:bolas7.png|50px]] mas de certeza  que existe um plano! É por isso aumentamos uma (geralmente varias dimensões diferentes) dimensão para assim encontrar o plano que divide as bolas.[[Ficheiro:bolas8.png|50px]] Este passo é o mais complicado de entender pois sabemos que em duas dimensões o que é uma recta e em 3 dimensões um plano mas e em 4 ou em 6,7,20,50,1000 dimensões? É por isso que chamamos de hiperplano ao que separa as bolas vermelhas das azuis.


=Como encontrar o hiperplano=
=Como encontrar o hiperplano=
Linha 13: Linha 13:




=Quando devo optar pela SVM e qual o melhor Kernel?=
As SVM são óptimas para dados numéricos contínuos como por exemplo no caso dos datasets de http://www.bcdr.eu/, onde as variáveis contêm a situação clínica e o resultado de diversas médias e cálculos feitos a partir das mamografias dos vários pacientes. A escolha do kernel para este ou outro dataset é sempre algo que implica varias tentativas pois mesmo existindo recomendações para quais as situações em que cada kernel deve ser utilizado existem sempre excepções, e diferentes parametros que podem retornar no mesmo kernel resultados completamente diferentes. É importante ter em atenção também que o kernel escolhido vai ser o que mais vai influenciar a disposição dos objectos na dimensão em que a SVM calcula o hiperplano.


= Referências =
https://www.reddit.com/r/MachineLearning/comments/15zrpp/please_explain_support_vector_machines_svm_like_i/
https://www.reddit.com/r/MachineLearning/comments/15zrpp/please_explain_support_vector_machines_svm_like_i/
https://www.quantstart.com/articles/Support-Vector-Machines-A-Guide-for-Beginners
https://www.quantstart.com/articles/Support-Vector-Machines-A-Guide-for-Beginners

Edição atual desde as 18h06min de 14 de março de 2016

As Support Vector Machines (SVM) são uma das técnicas mais utilizadas em Data Mining quando é necessário construir um classificador para dados constituídos maioritariamente por variáveis numéricas continuas/discretas. No entanto dada a sua complexidade existem varias variáveis que podem e devem ser ajustadas a quando da construção do classificador e a compreensão das mesmas necessita um estudo aprofundado o que implica que seja muito difícil por vezes de obter uma justificação clara para o classificador obtido. No entanto se utilizarmos as ferramentas certas e os valores por defeito podemos de forma rápida construir um classificador e utiliza-lo, por exemplo através da plataforma WEKA.

A Ideia por detrás da SVM

A estratégia que a SVM implementa para construir um classificador é bastante simples: Se tivermos x bolas de duas cores Bolas1.png podemos simplesmente colocar uma linha de forma a que se separem Bolas2.png, isto permite-nos saber a partir desta informação que bolas acima da linha são azuis e bolas abaixo são vermelhas, o problema é que a linha pode estar em muitas posições diferentes e aparentemente esta não é a melhor Bolas3.png e por isso recolocamos a linha Bolas4.png de forma a que o classificador seja preciso Bolas5.png. No entanto a realidade é que casos assim não existem, na verdade todos os casos que uma SVM classifica são sempre uma mistura de bolas azuis e vermelhas Bolas6.png e por isso não existe nenhuma linha que separe estes casos Bolas7.png mas de certeza que existe um plano! É por isso aumentamos uma (geralmente varias dimensões diferentes) dimensão para assim encontrar o plano que divide as bolas.Bolas8.png Este passo é o mais complicado de entender pois sabemos que em duas dimensões o que é uma recta e em 3 dimensões um plano mas e em 4 ou em 6,7,20,50,1000 dimensões? É por isso que chamamos de hiperplano ao que separa as bolas vermelhas das azuis.

Como encontrar o hiperplano

Primeiro vamos assumir que cada bola é um objecto do tipo {<x1,x2,x3>,<y>} onde x* é os valores das variáveis e y a classe 1 ou -1, assim matematicamente o hiperplano é representado pela seguinte formula w.x*-b=0 onde w é vector de valores que queremos encontrar. Para isso precisamos de mais dois hiperplanos que serão os vectores de suporte estes hiperplanos são construídos a partir dos objectos que estão nas margens de cada classe,SuportVector.png neste caso A,B e C. Apartir destes calculamos então o hiperplano que maximiza a distancia entre os dois hiperplanos de suporte. Sendo que w e b é igual para os 3 hiperplanos ficamos então com w.x*-b = 1 quando y=1 e w.x*-b = -1 quando y=-1 . Desta forma para sabermos qual a classe de um novo objecto so temos que ver qual o sinal do resultado da equação para x*.

Dimensões e Kernels

Dado que os dados nunca estão arranjados da forma que desejamos é necessário acrescentar dimensões, o problema disso é que dado que todas as contas feitas numa svm são produtos vectoriais , acrescentar uma dimensão tem consequências gravíssimas na performance do algoritmo. Para ultrapassar esse problema usa-se uma técnica chamada de Kernel Trick. Um kernel é uma forma de aumentar as dimensões sem ter que aumentar a complexidade, para isso é utilizada uma formula como a do Kernel Medico que faz a multiplicação vectorial de todos os objectos para uma matriz para assim a SVM utilizar estes resultados no calculo dos hiperplanos e ou durante a classificação.


Quando devo optar pela SVM e qual o melhor Kernel?

As SVM são óptimas para dados numéricos contínuos como por exemplo no caso dos datasets de http://www.bcdr.eu/, onde as variáveis contêm a situação clínica e o resultado de diversas médias e cálculos feitos a partir das mamografias dos vários pacientes. A escolha do kernel para este ou outro dataset é sempre algo que implica varias tentativas pois mesmo existindo recomendações para quais as situações em que cada kernel deve ser utilizado existem sempre excepções, e diferentes parametros que podem retornar no mesmo kernel resultados completamente diferentes. É importante ter em atenção também que o kernel escolhido vai ser o que mais vai influenciar a disposição dos objectos na dimensão em que a SVM calcula o hiperplano.

Referências

https://www.reddit.com/r/MachineLearning/comments/15zrpp/please_explain_support_vector_machines_svm_like_i/ https://www.quantstart.com/articles/Support-Vector-Machines-A-Guide-for-Beginners