Clasificación de documentos con múltiples etiquetas

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra un problema de clasificación de documentos con múltiples etiquetas utilizando scikit-learn. El conjunto de datos se genera aleatoriamente según el siguiente proceso:

  • Elegir el número de etiquetas: n ~ Poisson(n_labels)
  • N veces, elegir una clase c: c ~ Multinomial(theta)
  • Elegir la longitud del documento: k ~ Poisson(length)
  • K veces, elegir una palabra: w ~ Multinomial(theta_c)

En este proceso, se utiliza muestreo de rechazo para garantizar que n sea mayor que 2 y que la longitud del documento nunca sea cero. Del mismo modo, se rechazan las clases que ya han sido elegidas. Los documentos que se asignan a ambas clases se representan rodeados de dos círculos de colores diferentes.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/cross_decomposition("Cross decomposition") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/multiclass("Multiclass Classification") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} sklearn/cross_decomposition -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} sklearn/decomposition -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} sklearn/multiclass -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} sklearn/datasets -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} ml/sklearn -.-> lab-49221{{"Clasificación de documentos con múltiples etiquetas"}} end

Importar bibliotecas

En este paso, importamos las bibliotecas necesarias: numpy, matplotlib, make_multilabel_classification de sklearn.datasets, OneVsRestClassifier y SVC de sklearn.multiclass, PCA y 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

Definir la función de trazado

En este paso, definimos las funciones plot_hyperplane y plot_subfigure. La función plot_hyperplane se utiliza para obtener el hiperplano separador mientras que la función plot_subfigure se utiliza para trazar los subgráficos.

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="Clase 1",
    )
    plt.scatter(
        X[one_class, 0],
        X[one_class, 1],
        s=80,
        edgecolors="naranja",
        facecolors="none",
        linewidths=2,
        label="Clase 2",
    )

    plot_hyperplane(
        classif.estimators_[0], min_x, max_x, "k--", "Límite\npara la clase 1"
    )
    plot_hyperplane(
        classif.estimators_[1], min_x, max_x, "k-.", "Límite\npara la clase 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("Primer componente principal")
        plt.ylabel("Segundo componente principal")
        plt.legend(loc="superior izquierda")

Generar el conjunto de datos

En este paso, generamos el conjunto de datos utilizando la función make_multilabel_classification de sklearn.datasets.

X, Y = make_multilabel_classification(
    n_classes=2, n_labels=1, allow_unlabeled=True, random_state=1
)

Trazar subgráficos

En este paso, utilizamos la función plot_subfigure para trazar los subgráficos.

plt.figure(figsize=(8, 6))

plot_subfigure(X, Y, 1, "Con muestras sin etiquetar + CCA", "cca")
plot_subfigure(X, Y, 2, "Con muestras sin etiquetar + PCA", "pca")

X, Y = make_multilabel_classification(
    n_classes=2, n_labels=1, allow_unlabeled=False, random_state=1
)

plot_subfigure(X, Y, 3, "Sin muestras sin etiquetar + CCA", "cca")
plot_subfigure(X, Y, 4, "Sin muestras sin etiquetar + PCA", "pca")

plt.subplots_adjust(0.04, 0.02, 0.97, 0.94, 0.09, 0.2)
plt.show()

Resumen

Esta práctica mostró un problema de clasificación de documentos con múltiples etiquetas utilizando scikit-learn. Utilizamos la función make_multilabel_classification para generar el conjunto de datos y la función plot_subfigure para trazar los subgráficos.