Quebra de Empate em SVM

Beginner

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

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.