Introdução
Este laboratório demonstra um problema de classificação de documentos multi-rótulo utilizando o scikit-learn. O conjunto de dados é gerado aleatoriamente com base no seguinte processo:
- Escolher o número de rótulos: n ~ Poisson(n_labels)
- N vezes, escolher uma classe c: c ~ Multinomial(theta)
- Escolher o comprimento do documento: k ~ Poisson(length)
- K vezes, escolher uma palavra: w ~ Multinomial(theta_c)
Neste processo, a amostragem por rejeição é utilizada para garantir que n seja maior que 2 e que o comprimento do documento nunca seja zero. Da mesma forma, as classes que já foram escolhidas são rejeitadas. Os documentos que são atribuídos a ambas as classes são plotados rodeados por dois círculos coloridos.
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 praticar.
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 a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.
Importar Bibliotecas
Neste passo, importamos as bibliotecas necessárias: numpy, matplotlib, make_multilabel_classification de sklearn.datasets, OneVsRestClassifier e SVC de sklearn.multiclass, PCA e CCA de sklearn.decomposition.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_multilabel_classification
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.cross_decomposition import CCA
Define Plotting Function
In this step, we define the plot_hyperplane and plot_subfigure functions. plot_hyperplane function is used to get the separating hyperplane while plot_subfigure function is used to plot the subplots.
def plot_hyperplane(clf, min_x, max_x, linestyle, label):
## get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(min_x - 5, max_x + 5) ## make sure the line is long enough
yy = a * xx - (clf.intercept_[0]) / w[1]
plt.plot(xx, yy, linestyle, label=label)
def plot_subfigure(X, Y, subplot, title, transform):
if transform == "pca":
X = PCA(n_components=2).fit_transform(X)
elif transform == "cca":
X = CCA(n_components=2).fit(X, Y).transform(X)
else:
raise ValueError
min_x = np.min(X[:, 0])
max_x = np.max(X[:, 0])
min_y = np.min(X[:, 1])
max_y = np.max(X[:, 1])
classif = OneVsRestClassifier(SVC(kernel="linear"))
classif.fit(X, Y)
plt.subplot(2, 2, subplot)
plt.title(title)
zero_class = np.where(Y[:, 0])
one_class = np.where(Y[:, 1])
plt.scatter(X[:, 0], X[:, 1], s=40, c="gray", edgecolors=(0, 0, 0))
plt.scatter(
X[zero_class, 0],
X[zero_class, 1],
s=160,
edgecolors="b",
facecolors="none",
linewidths=2,
label="Class 1",
)
plt.scatter(
X[one_class, 0],
X[one_class, 1],
s=80,
edgecolors="orange",
facecolors="none",
linewidths=2,
label="Class 2",
)
plot_hyperplane(
classif.estimators_[0], min_x, max_x, "k--", "Boundary\nfor class 1"
)
plot_hyperplane(
classif.estimators_[1], min_x, max_x, "k-.", "Boundary\nfor class 2"
)
plt.xticks(())
plt.yticks(())
plt.xlim(min_x - 0.5 * max_x, max_x + 0.5 * max_x)
plt.ylim(min_y - 0.5 * max_y, max_y + 0.5 * max_y)
if subplot == 2:
plt.xlabel("First principal component")
plt.ylabel("Second principal component")
plt.legend(loc="upper left")
Gerar Conjunto de Dados
Neste passo, geramos o conjunto de dados utilizando a função make_multilabel_classification de sklearn.datasets.
X, Y = make_multilabel_classification(
n_classes=2, n_labels=1, allow_unlabeled=True, random_state=1
)
Plotar Subgráficos
Neste passo, utilizamos a função plot_subfigure para plotar os subgráficos.
plt.figure(figsize=(8, 6))
plot_subfigure(X, Y, 1, "Com amostras não rotuladas + CCA", "cca")
plot_subfigure(X, Y, 2, "Com amostras não rotuladas + PCA", "pca")
X, Y = make_multilabel_classification(
n_classes=2, n_labels=1, allow_unlabeled=False, random_state=1
)
plot_subfigure(X, Y, 3, "Sem amostras não rotuladas + CCA", "cca")
plot_subfigure(X, Y, 4, "Sem amostras não rotuladas + PCA", "pca")
plt.subplots_adjust(0.04, 0.02, 0.97, 0.94, 0.09, 0.2)
plt.show()
Resumo
Este laboratório demonstrou um problema de classificação de documentos multirótulo usando o scikit-learn. Usamos a função make_multilabel_classification para gerar o conjunto de dados e a função plot_subfigure para plotar os subgráficos.