Explorando Parâmetros de SVM Linear

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Máquinas de Vetores de Suporte (SVMs) são usadas para análise de classificação e regressão. As SVMs encontram a melhor linha ou hiperplano possível que separa os dados em diferentes classes. A linha ou hiperplano que maximiza a distância entre os dois pontos de dados mais próximos de classes diferentes é chamado de margem. Neste laboratório, exploraremos como o parâmetro C afeta a margem em uma SVM linear.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para você.

Importar Bibliotecas

Começamos importando as bibliotecas necessárias, incluindo numpy, matplotlib e scikit-learn.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

Gerar Dados

Geramos 40 pontos separáveis usando a função random.randn do numpy. Os primeiros 20 pontos têm uma média de [-2, -2] e os próximos 20 pontos têm uma média de [2, 2]. Em seguida, atribuímos uma etiqueta de classe 0 aos primeiros 20 pontos e uma etiqueta de classe 1 aos próximos 20 pontos.

np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20

Ajustar o Modelo

Ajustamos o modelo SVM usando a classe SVC do scikit-learn. Definimos o kernel como linear e o parâmetro de penalidade C como 1 para o caso não regularizado e 0,05 para o caso regularizado. Em seguida, calculamos o hiperplano separador usando os coeficientes e a intersecção do modelo.

for name, penalty in (("unreg", 1), ("reg", 0.05)):
    clf = svm.SVC(kernel="linear", C=penalty)
    clf.fit(X, Y)

    w = clf.coef_[0]
    a = -w[0] / w[1]
    xx = np.linspace(-5, 5)
    yy = a * xx - (clf.intercept_[0]) / w[1]

Calcular Margens

Calculamos as margens para o hiperplano separador. Primeiro, calculamos a distância da margem usando os coeficientes do modelo. Em seguida, calculamos a distância vertical dos vetores de suporte ao hiperplano usando a inclinação do hiperplano. Finalmente, plotamos a linha, os pontos e os vetores mais próximos do plano.

margin = 1 / np.sqrt(np.sum(clf.coef_**2))
yy_down = yy - np.sqrt(1 + a**2) * margin
yy_up = yy + np.sqrt(1 + a**2) * margin

plt.plot(xx, yy, "k-")
plt.plot(xx, yy_down, "k--")
plt.plot(xx, yy_up, "k--")

plt.scatter(
    clf.support_vectors_[:, 0],
    clf.support_vectors_[:, 1],
    s=80,
    facecolors="none",
    zorder=10,
    edgecolors="k",
    cmap=plt.get_cmap("RdBu"),
)
plt.scatter(
    X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.get_cmap("RdBu"), edgecolors="k"
)

plt.axis("tight")
x_min = -4.8
x_max = 4.2
y_min = -6
y_max = 6

Plotar Contorno

Plotamos o contorno da função de decisão. Primeiro, criamos uma malha usando os arrays xx e yy. Em seguida, transformamos a malha em um array 2D e aplicamos o método decision_function da classe SVC para obter os valores previstos. Em seguida, plotamos o contorno usando o método contourf.

YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)

plt.contourf(XX, YY, Z, cmap=plt.get_cmap("RdBu"), alpha=0.5, linestyles=["-"])

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)

plt.xticks(())
plt.yticks(())

Exibir os Gráficos

Exibimos os gráficos para os casos não regularizados e regularizados.

plt.show()

Resumo

Neste laboratório, exploramos como o parâmetro C afeta a margem em uma SVM linear. Geramos dados, ajustamos o modelo, calculamos as margens e plotamos os resultados. Em seguida, exibimos os gráficos para os casos não regularizados e regularizados.