Pular para o conteúdo principal

Tutorial de máquinas de vetor de suporte com o Scikit-learn

Neste tutorial, você aprenderá sobre Support Vector Machines, um dos algoritmos de aprendizado de máquina supervisionado mais populares e amplamente usados.
Actualizado 11 de set. de 2024  · 15 min de leitura

O SVM oferece uma precisão muito alta em comparação com outros classificadores, como regressão logística e árvores de decisão. Ele é conhecido por seu truque de kernel para lidar com espaços de entrada não lineares. Ele é usado em vários aplicativos, como detecção de faces, detecção de intrusão, classificação de e-mails, artigos de notícias e páginas da Web, classificação de genes e reconhecimento de escrita à mão.

Neste tutorial, você usará o scikit-learn em Python. Se você quiser saber mais sobre esse pacote Python, recomendo que dê uma olhada em nosso curso Aprendizado supervisionado com o scikit-learn.

Torne-se um cientista de ML

Domine as habilidades em Python para se tornar um cientista de aprendizado de máquina

O SVM é um algoritmo interessante e os conceitos são relativamente simples. O classificador separa os pontos de dados usando um hiperplano com a maior quantidade de margem. É por isso que um classificador SVM também é conhecido como classificador discriminativo. O SVM encontra um hiperplano ideal que ajuda a classificar novos pontos de dados.

Neste tutorial, você abordará os seguintes tópicos:

Assista e saiba mais sobre Support Vector Machines com o Scikit-learn neste vídeo do nosso curso.

Máquinas de vetor de suporte

Em geral, as máquinas de vetor de suporte são consideradas uma abordagem de classificação, mas podem ser empregadas em ambos os tipos de problemas de classificação e regressão. Ele pode lidar facilmente com diversas variáveis contínuas e categóricas. O SVM constrói um hiperplano no espaço multidimensional para separar classes diferentes. O SVM gera um hiperplano ideal de forma iterativa, que é usado para minimizar um erro. A ideia central do SVM é encontrar um hiperplano marginal máximo (MMH) que melhor divida o conjunto de dados em classes.

Vetores de suporte

Vetores de suporte

Os vetores de suporte são os pontos de dados que estão mais próximos do hiperplano. Esses pontos definirão melhor a linha de separação por meio do cálculo das margens. Esses pontos são mais relevantes para a construção do classificador.

Hiperplano

Um hiperplano é um plano de decisão que separa um conjunto de objetos com diferentes associações de classe.

Margem

Uma margem é um espaço entre as duas linhas nos pontos de classe mais próximos. Isso é calculado como a distância perpendicular da linha aos vetores de suporte ou aos pontos mais próximos. Se a margem for maior entre as classes, ela será considerada uma boa margem; uma margem menor é uma margem ruim.

Como o SVM funciona?

O principal objetivo é segregar o conjunto de dados fornecido da melhor maneira possível. A distância entre os dois pontos mais próximos é conhecida como margem. O objetivo é selecionar um hiperplano com a margem máxima possível entre os vetores de suporte no conjunto de dados fornecido. O SVM procura o hiperplano marginal máximo nas etapas a seguir:

  1. Gerar hiperplanos que segreguem as classes da melhor maneira. Figura do lado esquerdo mostrando três hiperplanos: preto, azul e laranja. Aqui, o azul e o laranja têm maior erro de classificação, mas o preto está separando as duas classes corretamente.

  2. Selecione o hiperplano direito com a segregação máxima dos dois pontos de dados mais próximos, conforme mostrado na figura do lado direito.

Separador Linear

Lidar com planos não lineares e inseparáveis

Alguns problemas não podem ser resolvidos usando o hiperplano linear, conforme mostrado na figura abaixo (lado esquerdo).

Nessa situação, o SVM usa um truque de kernel para transformar o espaço de entrada em um espaço de dimensão mais alta, conforme mostrado à direita. Os pontos de dados são plotados nos eixos x e z (Z é a soma ao quadrado de x e y: z=x^2=y^2). Agora você pode segregar facilmente esses pontos usando a separação linear.

Dimensão superior

SVM Kernels

O algoritmo SVM é implementado na prática usando um kernel. Um kernel transforma um espaço de dados de entrada no formato necessário. O SVM usa uma técnica chamada de truque do kernel. Aqui, o kernel pega um espaço de entrada de baixa dimensão e o transforma em um espaço de dimensão mais alta. Em outras palavras, você pode dizer que ele converte problemas não separáveis em problemas separáveis, acrescentando mais dimensão a eles. Ele é mais útil em problemas de separação não linear. O truque do kernel ajuda você a criar um classificador mais preciso.

  • Kernel linear Um kernel linear pode ser usado como produto de ponto normal de duas observações dadas. O produto entre dois vetores é a soma da multiplicação de cada par de valores de entrada.
K(x, xi) = sum(x * xi)
  • Kernel polinomial Um kernel polinomial é uma forma mais generalizada do kernel linear. O kernel polinomial pode distinguir espaços de entrada curvos ou não lineares.
K(x,xi) = 1 + sum(x * xi)^d

Onde d é o grau do polinômio. d=1 é semelhante à transformação linear. O grau precisa ser especificado manualmente no algoritmo de aprendizado.

  • Kernel de função de base radial O kernel de função de base radial é uma função de kernel popular comumente usada na classificação de máquinas de vetor de suporte. A RBF pode mapear um espaço de entrada em um espaço dimensional infinito.
K(x,xi) = exp(-gamma * sum((x – xi^2))

Aqui, gamma é um parâmetro, que varia de 0 a 1. Um valor mais alto de gama se ajustará perfeitamente ao conjunto de dados de treinamento, o que causa um ajuste excessivo. Gamma=0,1 é considerado um bom valor padrão. O valor de gamma precisa ser especificado manualmente no algoritmo de aprendizado.

Criação de classificadores no Scikit-learn

Até agora, você aprendeu sobre a base teórica do SVM. Agora você aprenderá sobre sua implementação em Python usando o scikit-learn.

Na parte de construção do modelo, você pode usar o conjunto de dados de câncer, que é um problema de classificação multiclasse muito famoso. Esse conjunto de dados é calculado a partir de uma imagem digitalizada de um aspirado por agulha fina (FNA) de uma massa mamária. Eles descrevem as características dos núcleos celulares presentes na imagem.

O conjunto de dados inclui 30 recursos (raio médio, textura média, perímetro médio, área média, suavidade média, compacidade média, concavidade média, pontos côncavos médios, simetria média, dimensão fractal média, erro de raio, erro de textura, erro de perímetro, erro de área, erro de suavidade, erro de compacidade, erro de concavidade, erro de pontos côncavos, erro de simetria, erro de dimensão fractal, pior raio, pior textura, pior perímetro, pior área, pior suavidade, pior compactação, pior concavidade, piores pontos côncavos, pior simetria e pior dimensão fractal) e um alvo (tipo de câncer).

Esses dados têm dois tipos de classes de câncer: maligno (prejudicial) e benigno (não prejudicial). Aqui, você pode criar um modelo para classificar o tipo de câncer. O conjunto de dados está disponível na biblioteca scikit-learn ou você também pode baixá-lo da Biblioteca de aprendizado de máquina da UCI.

Execute e edite o código deste tutorial online

Executar código

Carregando dados

Primeiro, vamos carregar o conjunto de dados necessário que você usará.

#Import scikit-learn dataset library
from sklearn import datasets

#Load dataset
cancer = datasets.load_breast_cancer()

Explorando dados

Depois de carregar o conjunto de dados, você pode querer saber um pouco mais sobre ele. Você pode verificar os nomes dos recursos e dos alvos.

# print the names of the 13 features
print("Features: ", cancer.feature_names)

# print the label type of cancer('malignant' 'benign')
print("Labels: ", cancer.target_names)
Features:  ['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']
Labels:  ['malignant' 'benign']

Vamos explorá-lo um pouco mais. Você também pode verificar a forma do conjunto de dados usando shape.

# print data(feature)shape
cancer.data.shape
(569, 30)

Vamos verificar os 5 principais registros do conjunto de recursos.

# print the cancer data features (top 5 records)
print(cancer.data[0:5])
[[1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01
  1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02
  6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01
  1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01
  4.601e-01 1.189e-01]
 [2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02
  7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01
  5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01
  2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01
  2.750e-01 8.902e-02]
 [1.969e+01 2.125e+01 1.300e+02 1.203e+03 1.096e-01 1.599e-01 1.974e-01
  1.279e-01 2.069e-01 5.999e-02 7.456e-01 7.869e-01 4.585e+00 9.403e+01
  6.150e-03 4.006e-02 3.832e-02 2.058e-02 2.250e-02 4.571e-03 2.357e+01
  2.553e+01 1.525e+02 1.709e+03 1.444e-01 4.245e-01 4.504e-01 2.430e-01
  3.613e-01 8.758e-02]
 [1.142e+01 2.038e+01 7.758e+01 3.861e+02 1.425e-01 2.839e-01 2.414e-01
  1.052e-01 2.597e-01 9.744e-02 4.956e-01 1.156e+00 3.445e+00 2.723e+01
  9.110e-03 7.458e-02 5.661e-02 1.867e-02 5.963e-02 9.208e-03 1.491e+01
  2.650e+01 9.887e+01 5.677e+02 2.098e-01 8.663e-01 6.869e-01 2.575e-01
  6.638e-01 1.730e-01]
 [2.029e+01 1.434e+01 1.351e+02 1.297e+03 1.003e-01 1.328e-01 1.980e-01
  1.043e-01 1.809e-01 5.883e-02 7.572e-01 7.813e-01 5.438e+00 9.444e+01
  1.149e-02 2.461e-02 5.688e-02 1.885e-02 1.756e-02 5.115e-03 2.254e+01
  1.667e+01 1.522e+02 1.575e+03 1.374e-01 2.050e-01 4.000e-01 1.625e-01
  2.364e-01 7.678e-02]]

Vamos dar uma olhada no conjunto de metas.

# print the cancer labels (0:malignant, 1:benign)
print(cancer.target)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0
 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1
 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1
 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0
 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1
 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1
 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0
 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1
 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1
 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0
 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 0 0 0 0 0 0 1]

Divisão de dados

Para entender o desempenho do modelo, dividir o conjunto de dados em um conjunto de treinamento e um conjunto de teste é uma boa estratégia.

Divida o conjunto de dados usando a função train_test_split(). você precisa passar 3 parâmetros: recursos, alvo e tamanho do conjunto de teste. Além disso, você pode usar random_state para selecionar registros aleatoriamente.

# Import train_test_split function
from sklearn.model_selection import train_test_split

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3,random_state=109) # 70% training and 30% test

Modelo de geração

Vamos criar um modelo de máquina de vetor de suporte. Primeiro, importe o módulo SVM e crie o objeto classificador de vetor de suporte passando o argumento kernel como o kernel linear na função SVC().

Em seguida, ajuste seu modelo no conjunto de treinamento usando fit() e faça a previsão no conjunto de teste usando predict().

#Import svm model
from sklearn import svm

#Create a svm Classifier
clf = svm.SVC(kernel='linear') # Linear Kernel

#Train the model using the training sets
clf.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)

Avaliação do modelo

Vamos estimar a precisão com que o classificador ou modelo pode prever o câncer de mama das pacientes.

A precisão pode ser calculada comparando-se os valores reais do conjunto de testes e os valores previstos.

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics

# Model Accuracy: how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.9649122807017544

Bem, você obteve uma taxa de classificação de 96,49%, considerada uma precisão muito boa.

Para avaliação adicional, você também pode verificar a precisão e a recuperação do modelo.

# Model Precision: what percentage of positive tuples are labeled as such?
print("Precision:",metrics.precision_score(y_test, y_pred))

# Model Recall: what percentage of positive tuples are labelled as such?
print("Recall:",metrics.recall_score(y_test, y_pred))
Precision: 0.9811320754716981
Recall: 0.9629629629629629

Bem, você obteve uma precisão de 98% e uma recuperação de 96%, que são considerados valores muito bons.

Ajuste dos hiperparâmetros

  • Kernel: A principal função do kernel é transformar os dados de entrada do conjunto de dados fornecido na forma necessária. Há vários tipos de funções, como linear, polinomial e função de base radial (RBF). Polinomial e RBF são úteis para hiperplanos não lineares. Os núcleos polinomiais e RBF calculam a linha de separação na dimensão superior. Em alguns aplicativos, sugere-se o uso de um kernel mais complexo para separar as classes que são curvas ou não lineares. Essa transformação pode levar a classificadores mais precisos.
  • Regularização: Parâmetro de regularização no parâmetro Scikit-learn C do python usado para manter a regularização. Aqui C é o parâmetro de penalidade, que representa a classificação incorreta ou o termo de erro. O termo de erro ou classificação incorreta informa à otimização do SVM a quantidade de erro suportável. É assim que você pode controlar a compensação entre o limite de decisão e o termo de classificação incorreta. Um valor menor de C cria um hiperplano de margem pequena e um valor maior de C cria um hiperplano de margem maior.
  • Gamma: Um valor mais baixo de gama se ajustará livremente ao conjunto de dados de treinamento, ao passo que um valor mais alto de gama se ajustará exatamente ao conjunto de dados de treinamento, o que causa um ajuste excessivo. Em outras palavras, você pode dizer que um valor baixo de gama considera apenas os pontos próximos no cálculo da linha de separação, enquanto um valor de gama considera todos os pontos de dados no cálculo da linha de separação.

Vantagens

Os classificadores SVM oferecem boa precisão e fazem previsões mais rápidas em comparação com o algoritmo Naïve Bayes. Eles também usam menos memória porque usam um subconjunto de pontos de treinamento na fase de decisão. O SVM funciona bem com uma margem clara de separação e com espaço de alta dimensão.

Desvantagens

O SVM não é adequado para grandes conjuntos de dados devido ao seu alto tempo de treinamento e também leva mais tempo para ser treinado em comparação com o Naïve Bayes. Ele funciona mal com classes sobrepostas e também é sensível ao tipo de kernel usado.

Conclusão

Parabéns, você chegou ao final deste tutorial!

Neste tutorial, você cobriu muitas informações sobre o algoritmo de máquina de vetor de suporte, seu funcionamento, kernels, ajuste de hiperparâmetros, criação e avaliação de modelos no conjunto de dados de câncer de mama usando o pacote Scikit-learn. Você também abordou suas vantagens e desvantagens. Espero que você tenha aprendido algo valioso!

Para saber mais sobre esse tipo de classificadores, você deve dar uma olhada em nosso curso Classificadores lineares em Python. Ele apresenta outros tipos de funções de regressão e perda, bem como Support Vector Machines.

Aguardo ansiosamente qualquer comentário ou pergunta. Você pode fazer a pergunta deixando um comentário e eu farei o possível para respondê-la.

Obtenha uma das melhores certificações de IA

Demonstre que você pode usar a IA de forma eficaz e responsável.
Temas

Cursos de Scikit-learn

curso

Supervised Learning with scikit-learn

4 hr
162.7K
Grow your machine learning skills with scikit-learn in Python. Use real-world datasets in this interactive course and learn how to make powerful predictions!
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado
Big Data Concept

blog

Agrupamento no aprendizado de máquina: 5 Algoritmos de agrupamento essenciais

Saiba o que é clustering e como ele é usado no aprendizado de máquina. Veja os diferentes tipos de agrupamento no aprendizado de máquina e confira algumas perguntas frequentes.
Moez Ali's photo

Moez Ali

15 min

tutorial

Uma introdução ao Q-Learning: Um tutorial para iniciantes

Saiba mais sobre o algoritmo mais popular de aprendizado por reforço sem modelo com um tutorial em Python.
Abid Ali Awan's photo

Abid Ali Awan

16 min

tutorial

Introdução ao k-Means Clustering com o scikit-learn em Python

Neste tutorial, saiba como aplicar o k-Means Clustering com o scikit-learn em Python

Kevin Babitz

21 min

tutorial

Tutorial de manipulação de dados categóricos de aprendizado de máquina com Python

Aprenda os truques comuns para lidar com dados categóricos e pré-processá-los para criar modelos de aprendizado de máquina!
Moez Ali's photo

Moez Ali

28 min

tutorial

Tutorial do K-Means Clustering no R

Saiba o que é o k-means e descubra por que ele é um dos algoritmos de agrupamento mais usados na ciência de dados
Eugenia Anello's photo

Eugenia Anello

17 min

tutorial

Tutorial para entender a regressão logística em Python

Aprenda sobre a regressão logística, suas propriedades básicas e crie um modelo de aprendizado de máquina em um aplicativo do mundo real em Python.
Avinash Navlani's photo

Avinash Navlani

10 min

Ver maisVer mais