SVM para Classes Desequilibradas

Beginner

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

Introdução

Neste laboratório, aprenderemos a utilizar Máquinas de Vetores de Suporte (SVM) para classes desequilibradas. Primeiro, encontraremos o plano separador com um SVM simples e, em seguida, plotaremos (tracejado) o hiperplano separador com correção automática para classes desequilibradas. Usaremos a função make_blobs para criar dois grupos de pontos aleatórios.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Importar Bibliotecas

Começaremos importando as bibliotecas necessárias para o laboratório: matplotlib.pyplot, svm, make_blobs e DecisionBoundaryDisplay.

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay

Criar Dados

Criaremos dois grupos de pontos aleatórios usando a função make_blobs. Criaremos um grupo com 1000 pontos e outro com 100 pontos. Os centros dos grupos serão [0.0, 0.0] e [2.0, 2.0], respetivamente. O parâmetro clusters_std controla o desvio padrão dos grupos.

n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
    n_samples=[n_samples_1, n_samples_2],
    centers=centers,
    cluster_std=clusters_std,
    random_state=0,
    shuffle=False,
)

Ajustar o Modelo

Ajustaremos o modelo e obteremos o hiperplano separador usando a função SVC da biblioteca svm. Usaremos um kernel linear e definiremos C como 1.0.

clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)

Ajustar o Modelo com Classes Ponderadas

Ajustaremos o modelo e obteremos o hiperplano separador usando a função SVC da biblioteca svm. Usaremos um kernel linear e definiremos class_weight para {1: 10}. Isso dará mais peso à classe menor.

wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)

Plotar as Amostras

Plotaremos as amostras usando a função scatter de matplotlib.pyplot.

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")

Plotar as Funções de Decisão para Ambos os Classificadores

Plotaremos as funções de decisão para ambos os classificadores usando a função DecisionBoundaryDisplay da biblioteca sklearn.inspection. Definiremos plot_method para "contour", colors para "k" para o SVM simples e "r" para o SVM ponderado, levels para [0], alpha para 0.5 e linestyles para ["-"]. Também definiremos ax para plt.gca().

ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    plot_method="contour",
    colors="k",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

wdisp = DecisionBoundaryDisplay.from_estimator(
    wclf,
    X,
    plot_method="contour",
    colors="r",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

Adicionar Lenda

Adicionaremos uma legenda ao gráfico usando a função legend de matplotlib.pyplot. Definiremos as etiquetas para "não ponderado" e "ponderado", respectivamente.

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["não ponderado", "ponderado"],
    loc="upper right",
)

Mostrar o Gráfico

Finalmente, mostraremos o gráfico usando a função show de matplotlib.pyplot.

plt.show()

Resumo

Neste laboratório, aprendemos a utilizar Máquinas de Vetores de Suporte (SVM) para classes desequilibradas. Usamos a função make_blobs para criar dois grupos de pontos aleatórios e criámos dois modelos SVM, um com SVM simples e outro com correção automática para classes desequilibradas. Representámos as amostras e as funções de decisão para ambos os classificadores e adicionámos uma legenda ao gráfico.