Escalado del parámetro de regularización para SVMs

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 el efecto de la escala del parámetro de regularización al utilizar Máquinas de Vectores de Soporte (SVMs) para la clasificación. En la clasificación SVM, estamos interesados en la minimización del riesgo para la ecuación:

C \sum_{i=1, n} \mathcal{L} (f(x_i), y_i) + \Omega (w)

donde:

  • C se utiliza para establecer la cantidad de regularización
  • L es una función de pérdida de nuestras muestras y nuestros parámetros del modelo.
  • Ω es una función de penalización de nuestros parámetros del modelo

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 sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49311{{"Escalado del parámetro de regularización para SVMs"}} sklearn/model_selection -.-> lab-49311{{"Escalado del parámetro de regularización para SVMs"}} sklearn/datasets -.-> lab-49311{{"Escalado del parámetro de regularización para SVMs"}} ml/sklearn -.-> lab-49311{{"Escalado del parámetro de regularización para SVMs"}} end

Importar bibliotecas y generar conjunto de datos sintético

Comenzamos importando las bibliotecas necesarias y generando un conjunto de datos sintético adecuado para la regularización L1 y L2.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import validation_curve, ShuffleSplit

n_samples, n_features = 100, 300
X, y = make_classification(n_samples=n_samples, n_features=n_features, n_informative=5, random_state=1)

rng = np.random.RandomState(1)
y = np.sign(0.5 - rng.rand(n_samples))
X = rng.randn(n_samples, n_features // 5) + y[:, np.newaxis]
X += 5 * rng.randn(n_samples, n_features // 5)

Caso de penalización L1

En el caso de la penalización L1, la teoría dice que la consistencia del modelo, en términos de encontrar el conjunto correcto de parámetros no nulos y sus signos, se puede lograr escalando C. Demostramos este efecto utilizando un conjunto de datos sintético que es disperso, lo que significa que solo algunas características serán informativas y útiles para el modelo.

model_l1 = LinearSVC(penalty="l1", loss="squared_hinge", dual=False, tol=1e-3)

Cs = np.logspace(-2.3, -1.3, 10)
train_sizes = np.linspace(0.3, 0.7, 3)
labels = [f"fracción: {train_size}" for train_size in train_sizes]

results = {"C": Cs}
for label, train_size in zip(labels, train_sizes):
    cv = ShuffleSplit(train_size=train_size, test_size=0.3, n_splits=50, random_state=1)
    train_scores, test_scores = validation_curve(
        model_l1, X, y, param_name="C", param_range=Cs, cv=cv
    )
    results[label] = test_scores.mean(axis=1)
results = pd.DataFrame(results)

fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(12, 6))

## grafica los resultados sin escalar C
results.plot(x="C", ax=axes[0], logx=True)
axes[0].set_ylabel("Puntuación CV")
axes[0].set_title("Sin escalado")

## grafica los resultados escalando C
for train_size_idx, label in enumerate(labels):
    results_scaled = results[[label]].assign(
        C_scaled=Cs * float(n_samples * train_sizes[train_size_idx])
    )
    results_scaled.plot(x="C_scaled", ax=axes[1], logx=True, label=label)
axes[1].set_title("Escalando C por 1 / n_samples")

_ = fig.suptitle("Efecto del escalado de C con penalización L1")

Caso de penalización L2

Podemos repetir un experimento similar con la penalización l2. En este caso, la teoría dice que para lograr la consistencia en la predicción, el parámetro de penalización debe mantenerse constante a medida que crece el número de muestras.

model_l2 = LinearSVC(penalty="l2", loss="squared_hinge", dual=True)
Cs = np.logspace(-4.5, -2, 10)

labels = [f"fracción: {train_size}" for train_size in train_sizes]
results = {"C": Cs}
for label, train_size in zip(labels, train_sizes):
    cv = ShuffleSplit(train_size=train_size, test_size=0.3, n_splits=50, random_state=1)
    train_scores, test_scores = validation_curve(
        model_l2, X, y, param_name="C", param_range=Cs, cv=cv
    )
    results[label] = test_scores.mean(axis=1)
results = pd.DataFrame(results)

fig, axes = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(12, 6))

## grafica los resultados sin escalar C
results.plot(x="C", ax=axes[0], logx=True)
axes[0].set_ylabel("Puntuación CV")
axes[0].set_title("Sin escalado")

## grafica los resultados escalando C
for train_size_idx, label in enumerate(labels):
    results_scaled = results[[label]].assign(
        C_scaled=Cs * float(n_samples * train_sizes[train_size_idx])
    )
    results_scaled.plot(x="C_scaled", ax=axes[1], logx=True, label=label)
axes[1].set_title("Escalando C por 1 / n_samples")

_ = fig.suptitle("Efecto del escalado de C con penalización L2")

Resumen

Esta práctica demostró el efecto del escalado del parámetro de regularización en las SVMs para ambas penalizaciones L1 y L2. Para la penalización L1, observamos que el error de validación cruzada se correlaciona mejor con el error de prueba al escalar C con el número de muestras. Para la penalización L2, el mejor resultado proviene del caso en el que C no se escala.