Introdução
Este laboratório apresenta o desempate SVM e seu efeito na fronteira de decisão. No SVM, o desempate é o mecanismo usado para resolver conflitos entre duas ou mais classes quando suas distâncias são iguais. Ele não está habilitado por padrão quando decision_function_shape='ovr' porque é custoso. Portanto, este laboratório ilustra o efeito do parâmetro break_ties para um problema de classificação multiclasse e decision_function_shape='ovr'.
Dicas da Máquina Virtual
Após o início da VM, 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ê.
Importação de Bibliotecas Necessárias
Neste passo, importamos as bibliotecas necessárias para SVM e visualização.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_blobs
Criar Dados de Exemplo
Neste passo, criaremos um conjunto de dados de exemplo utilizando a função make_blobs do scikit-learn. Este conjunto de dados contém 3 classes e 2 características.
X, y = make_blobs(random_state=27)
Criar Modelo SVM com e sem Quebra de Empate
Neste passo, criaremos dois modelos SVM - um com quebra de empate desativada e outro com quebra de empate ativada. Usaremos a classe SVC do scikit-learn para criar esses modelos. O parâmetro break_ties é definido como False e True para os dois modelos, respectivamente.
for break_ties, title, ax in zip((False, True), titles, sub.flatten()):
svm = SVC(
kernel="linear", C=1, break_ties=break_ties, decision_function_shape="ovr"
).fit(X, y)
Criar Fronteira de Decisão
Neste passo, criaremos a fronteira de decisão para os dois modelos. Usaremos a função predict para prever as classes para os pontos de dados de amostra e traçaremos a fronteira de decisão.
xs = np.linspace(xlim[0], xlim[1], 1000)
ys = np.linspace(ylim[0], ylim[1], 1000)
xx, yy = np.meshgrid(xs, ys)
pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])
colors = [plt.cm.Accent(i) for i in [0, 4, 7]]
points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap="Accent")
classes = [(0, 1), (0, 2), (1, 2)]
line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)
ax.imshow(
-pred.reshape(xx.shape),
cmap="Accent",
alpha=0.2,
extent=(xlim[0], xlim[1], ylim[1], ylim[0]),
)
Plotar Fronteira de Decisão
Neste passo, plotaremos a fronteira de decisão criada no passo anterior. Usaremos os atributos coef_ e intercept_ do modelo SVM para plotar a fronteira de decisão.
for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):
line2 = -(line * coef[1] + intercept) / coef[0]
ax.plot(line2, line, "-", c=colors[col[0]])
ax.plot(line2, line, "--", c=colors[col[1]])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
ax.set_title(title)
ax.set_aspect("equal")
Mostrar o Gráfico
Neste passo, mostraremos o gráfico contendo a fronteira de decisão para ambos os modelos.
plt.show()
Resumo
Este laboratório ilustrou o efeito da quebra de empate do SVM na fronteira de decisão. Criamos dois modelos SVM - um com quebra de empate desabilitada e outro com quebra de empate habilitada. Em seguida, plotamos a fronteira de decisão para ambos os modelos. A fronteira de decisão para o modelo com quebra de empate habilitada foi não-convexa na área onde as classes estavam empatadas.