SVM para clases desequilibradas

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

En este laboratorio, aprenderemos a usar Máquinas de Vectores de Soporte (SVM) para clases desequilibradas. Primero encontraremos el plano separador con una SVM simple y luego graficaremos (con líneas discontinuas) el hiperplano separador con corrección automática para clases desequilibradas. Usaremos la función make_blobs para crear dos clusters de puntos aleatorios.

Consejos sobre la VM

Una vez que se haya iniciado 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 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 sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/inspection -.-> lab-49283{{"SVM para clases desequilibradas"}} sklearn/datasets -.-> lab-49283{{"SVM para clases desequilibradas"}} ml/sklearn -.-> lab-49283{{"SVM para clases desequilibradas"}} end

Importar bibliotecas

Comenzaremos importando las bibliotecas necesarias para el laboratorio: matplotlib.pyplot, svm, make_blobs y DecisionBoundaryDisplay.

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

Crear datos

Vamos a crear dos clusters de puntos aleatorios utilizando la función make_blobs. Crearemos un cluster con 1000 puntos y otro con 100 puntos. Los centros de los clusters serán [0.0, 0.0] y [2.0, 2.0], respectivamente. El parámetro clusters_std controla la desviación estándar de los clusters.

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 el modelo

Vamos a ajustar el modelo y obtener el hiperplano separador utilizando la función SVC de la biblioteca svm. Usaremos un kernel lineal y estableceremos C en 1.0.

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

Ajustar el modelo con clases con pesos

Vamos a ajustar el modelo y obtener el hiperplano separador utilizando la función SVC de la biblioteca svm. Usaremos un kernel lineal y estableceremos class_weight en {1: 10}. Esto dará más peso a la clase más pequeña.

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

Graficar las muestras

Vamos a graficar las muestras utilizando la función scatter de matplotlib.pyplot.

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

Graficar las funciones de decisión para ambos clasificadores

Vamos a graficar las funciones de decisión para ambos clasificadores utilizando la función DecisionBoundaryDisplay de la biblioteca sklearn.inspection. Estableceremos plot_method en "contour", colors en "k" para el SVM simple y "r" para el SVM con pesos, levels en [0], alpha en 0.5 y linestyles en ["-"]. También estableceremos ax en 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,
)

Agregar leyenda

Vamos a agregar una leyenda a la gráfica utilizando la función legend de matplotlib.pyplot. Estableceremos las etiquetas en "no ponderado" y "ponderado", respectivamente.

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["non weighted", "weighted"],
    loc="upper right",
)

Mostrar la gráfica

Finalmente, mostraremos la gráfica utilizando la función show de matplotlib.pyplot.

plt.show()

Resumen

En este laboratorio, aprendimos cómo utilizar Máquinas de Vectores de Soporte (SVM) para clases desequilibradas. Utilizamos la función make_blobs para crear dos grupos de puntos aleatorios y creamos dos modelos de SVM, uno con SVM simple y otro con corrección automática para clases desequilibradas. Graficamos las muestras y las funciones de decisión para ambos clasificadores y agregamos una leyenda a la gráfica.