SingularCode

Algoritmo SVM

Algoritmo SVM

O algoritmo SVM, que significa Máquina de Vetores de Suporte (do inglês, Support Vector Machine), é uma técnica poderosa para resolver problemas de classificação e regressão dentro do campo da aprendizagem de máquina e estatística computacional. O SVM é particularmente útil para lidar com conjuntos de dados de alta dimensão e situações onde a precisão na classificação é crucial. Vamos explorar em detalhes o funcionamento, características e aplicações do SVM.

 

Fundamentos do SVM

O objetivo principal do SVM é encontrar o hiperplano ótimo que separa os conjuntos de dados em classes. Em um espaço bidimensional, esse hiperplano pode ser visualizado como uma linha reta, mas em espaços de dimensões maiores, ele assume a forma de um plano ou superfície multidimensional.

 

Vetores de Suporte

Os vetores de suporte são os dados pontos mais próximos do hiperplano de separação. Estes pontos são críticos para a definição do hiperplano, pois são os que têm maior influência na sua localização e orientação. A margem é definida como a distância entre os vetores de suporte e o hiperplano, e o objetivo do SVM é maximizar essa margem para aumentar a robustez do modelo.

 

Tipos de SVM

  • SVM Linear: Utilizado quando os dados podem ser separados linearmente. É mais simples e rápido de treinar.
  • SVM Não Linear: Utilizado para dados que não podem ser separados linearmente. Requer o uso de funções kernel como RBF (Radial Basis Function), polinomial, e sigmoidal para mapear os dados para um espaço onde eles possam ser separados linearmente.

 

Aplicações do SVM

O SVM é amplamente utilizado em uma variedade de campos, incluindo:

  • Reconhecimento de Padrões: Como na identificação de rostos, gestos, e caracteres manuscritos.
  • Classificação de Textos: Para filtrar spam, categorizar notícias, e análise de sentimentos.
  • Bioinformática: Na classificação de proteínas, previsão de genes, e diagnósticos médicos.
  • Detecção de Fraudes: Em sistemas de segurança e monitoramento financeiro.

 

Vantagens

  • Alta Precisão: Particularmente eficaz em espaços de alta dimensão.
  • Eficiência em Espaços de Grande Dimensão: Funciona bem mesmo quando o número de dimensões excede o número de amostras.
  • Versatilidade: A capacidade de usar diferentes funções kernel permite adaptabilidade a vários tipos de dados.

 

Desvantagens

  • Seleção de Kernel e Parâmetros: A escolha do kernel e a configuração dos parâmetros podem ser complexas e requerem experiência.
  • Escalabilidade: Pode ser computacionalmente intensivo e menos eficiente em conjuntos de dados muito grandes.

Dataset Iris:

import pandas as pd
import seaborn as sns

iris = pd.read_csv("iris.csv")
iris

iris.info()

iris['target'].count()

iris['target'].value_counts()

sns.pairplot(iris, hue = "target")

iris.target.unique()
iris

iris['target'] = iris['target'].map({'SETOSA':1,'VERSICOLOR':2,'VIRGINICA':3})
iris

X = iris.iloc[:,0:4].values
X

y = iris.iloc[:,4].values
y

from sklearn import svm
from sklearn.model_selection import train_test_split
X_trein, X_teste, y_trein, y_teste = train_test_split(X, y, test_size=0.30, random_state=0)
print(len(X_trein),len(X_teste))

#Quando C=1, representa um equilíbrio entre maximizar a margem e minimizar o erro de classificação
classificador = svm.SVC(kernel='linear', C=1.0)
classificador.fit(X_trein, y_trein)

#Acurácia
classificador.score(X_teste,y_teste)

previsao = classificador.predict(X_teste)
previsao

y_teste

from sklearn.metrics import confusion_matrix
confusion_matrix(y_teste, previsao)

from sklearn.metrics import classification_report
print(classification_report(y_teste, previsao))

Gráfico Iris:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler

# Carregar o conjunto de dados Iris
iris = datasets.load_iris()
X = iris.data  # Características
y = iris.target  # Rótulos das classes

# Normalização dos dados
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Redução de dimensionalidade com t-SNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)

# Treinamento do classificador SVM no espaço reduzido
model = svm.SVC(kernel='linear', C=1.0)
model.fit(X_tsne, y)

# Criação da grade para os limites de decisão
x_min, x_max = X_tsne[:, 0].min() - 1, X_tsne[:, 0].max() + 1
y_min, y_max = X_tsne[:, 1].min() - 1, X_tsne[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

# Previsão de classificação para cada ponto na grade
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# Plotar os limites de decisão
plt.contourf(xx, yy, Z, alpha=0.4, cmap=plt.cm.RdYlBu)
plt.colorbar()

# Plotar os pontos de dados
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap=plt.cm.RdYlBu, edgecolors='k')

plt.title('t-SNE com SVM: Limites de Decisão para o Conjunto de Dados Iris')
plt.xlabel('t-SNE característica 1')
plt.ylabel('t-SNE característica 2')
plt.show()

Dataset Wine:

import pandas as pd
import seaborn as sns

wine = pd.read_csv("wine.csv")
wine

wine.info()

# Quantos dados de cada Especie
wine['Wine'].count()

wine['Wine'].value_counts()

wine.Wine.unique()

X = wine.iloc[:,1:14].values
X

y = wine.iloc[:,0].values
y

from sklearn import svm
from sklearn.model_selection import train_test_split

X_trein, X_teste, y_trein, y_teste = train_test_split(X, y, test_size=0.30, random_state=0)
print(len(X_trein),len(X_teste))

#Quando C=1, representa um equilíbrio entre maximizar a margem e minimizar o erro de classificação
classificador = svm.SVC(kernel='linear', C=1.0)
classificador.fit(X_trein, y_trein)

#Acurácia
classificador.score(X_teste,y_teste)

previsao = classificador.predict(X_teste)
previsao

y_teste

from sklearn.metrics import confusion_matrix
confusion_matrix(y_teste, previsao)

from sklearn.metrics import classification_report
print(classification_report(y_teste, previsao))

Grafico Wine:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn import svm
from sklearn.preprocessing import StandardScaler
import pandas as pd
import seaborn as sns

# Carregar o conjunto de dados Wine
wine = pd.read_csv("wine.csv")

# Separar as características e os rótulos
X = wine.iloc[:, 1:14].values  # Características
y = wine.iloc[:, 0].values  # Rótulos das classes

# Normalização dos dados
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Redução de dimensionalidade com t-SNE
tsne = TSNE(n_components=2, random_state=0)
X_tsne = tsne.fit_transform(X_scaled)

# Treinamento do classificador SVM no espaço reduzido
svm_model = svm.SVC(kernel='linear', C=1.0)
svm_model.fit(X_tsne, y)

# Criação da grade para os limites de decisão
x_min, x_max = X_tsne[:, 0].min() - 1, X_tsne[:, 0].max() + 1
y_min, y_max = X_tsne[:, 1].min() - 1, X_tsne[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

# Previsão de classificação para cada ponto na grade
Z = svm_model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# Plotar os limites de decisão
plt.contourf(xx, yy, Z, alpha=0.4, cmap=plt.cm.RdYlBu)
plt.colorbar()

# Plotar os pontos de dados
sns.scatterplot(x=X_tsne[:, 0], y=X_tsne[:, 1], hue=wine['Wine'], palette=['red', 'blue', 'green'], legend='full', s=60)

plt.title('Visualização t-SNE do Conjunto de Dados Wine com Limites de Decisão SVM')
plt.xlabel('t-SNE característica 1')
plt.ylabel('t-SNE característica 2')
plt.show()

Atualizado em: 07/04/2024 por Nelson H. Koshoji