Graficar la regresión de Ridge Kernel

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 tutorial, compararemos la regresión de Ridge Kernel (KRR) y la regresión de vectores de soporte (SVR) utilizando Scikit-Learn, una popular biblioteca de aprendizaje automático en Python. Ambos modelos aprenden una función no lineal mediante el uso del truco del kernel. La KRR y la SVR difieren en sus funciones de pérdida y métodos de ajuste. Utilizaremos un conjunto de datos artificial que consta de una función objetivo senoidal y ruido fuerte agregado a cada quinto dato.

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 para 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"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/kernel_ridge("Kernel Ridge Regression") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49178{{"Graficar la regresión de Ridge Kernel"}} sklearn/model_selection -.-> lab-49178{{"Graficar la regresión de Ridge Kernel"}} sklearn/kernel_ridge -.-> lab-49178{{"Graficar la regresión de Ridge Kernel"}} ml/sklearn -.-> lab-49178{{"Graficar la regresión de Ridge Kernel"}} end

Generar datos de muestra

Generaremos un conjunto de datos que consta de una función objetivo senoidal y ruido fuerte agregado a cada quinto dato.

import numpy as np

## Generate sample data
rng = np.random.RandomState(42)
X = 5 * rng.rand(10000, 1)
y = np.sin(X).ravel()

## Add noise to targets
y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))

X_plot = np.linspace(0, 5, 100000)[:, None]

Construir los modelos de regresión basados en kernel

Construiremos los modelos de KRR y SVR utilizando GridSearchCV de Scikit-Learn para encontrar los mejores hiperparámetros.

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
from sklearn.kernel_ridge import KernelRidge

train_size = 100

## SVR Model
svr = GridSearchCV(
    SVR(kernel="rbf", gamma=0.1),
    param_grid={"C": [1e0, 1e1, 1e2, 1e3], "gamma": np.logspace(-2, 2, 5)},
)

## KRR Model
kr = GridSearchCV(
    KernelRidge(kernel="rbf", gamma=0.1),
    param_grid={"alpha": [1e0, 0.1, 1e-2, 1e-3], "gamma": np.logspace(-2, 2, 5)},
)

Comparar los tiempos de SVR y regresión de Ridge Kernel

Compararemos los tiempos de ajuste y predicción de los modelos de SVR y KRR utilizando los mejores hiperparámetros encontrados en el Paso 2.

import time

## Fit SVR
t0 = time.time()
svr.fit(X[:train_size], y[:train_size])
svr_fit = time.time() - t0

## Print the best params and score for SVR model
print(f"Mejor SVR con parámetros: {svr.best_params_} y puntuación R2: {svr.best_score_:.3f}")
print("Se seleccionó la complejidad y la anchura de banda de SVR y se ajustó el modelo en %.3f s" % svr_fit)

## Fit KRR
t0 = time.time()
kr.fit(X[:train_size], y[:train_size])
kr_fit = time.time() - t0

## Print the best params and score for KRR model
print(f"Mejor KRR con parámetros: {kr.best_params_} y puntuación R2: {kr.best_score_:.3f}")
print("Se seleccionó la complejidad y la anchura de banda de KRR y se ajustó el modelo en %.3f s" % kr_fit)

## Compute the support vector ratio for SVR
sv_ratio = svr.best_estimator_.support_.shape[0] / train_size
print("Ratio de vectores de soporte: %.3f" % sv_ratio)

## Predict using SVR
t0 = time.time()
y_svr = svr.predict(X_plot)
svr_predict = time.time() - t0
print("Predicción de SVR para %d entradas en %.3f s" % (X_plot.shape[0], svr_predict))

## Predict using KRR
t0 = time.time()
y_kr = kr.predict(X_plot)
kr_predict = time.time() - t0
print("Predicción de KRR para %d entradas en %.3f s" % (X_plot.shape[0], kr_predict))

Observe los resultados

Visualizaremos el modelo aprendido de KRR y SVR cuando se optimizan tanto la complejidad/regularización como la anchura de banda del kernel RBF mediante búsqueda en cuadrícula.

import matplotlib.pyplot as plt

sv_ind = svr.best_estimator_.support_
plt.scatter(
    X[sv_ind],
    y[sv_ind],
    c="r",
    s=50,
    label="Vectores de soporte de SVR",
    zorder=2,
    edgecolors=(0, 0, 0),
)
plt.scatter(X[:100], y[:100], c="k", label="datos", zorder=1, edgecolors=(0, 0, 0))
plt.plot(
    X_plot,
    y_svr,
    c="r",
    label="SVR (ajuste: %.3fs, predicción: %.3fs)" % (svr_fit, svr_predict),
)
plt.plot(
    X_plot, y_kr, c="g", label="KRR (ajuste: %.3fs, predicción: %.3fs)" % (kr_fit, kr_predict)
)
plt.xlabel("datos")
plt.ylabel("objetivo")
plt.title("SVR versus Ridge Kernel")
_ = plt.legend()

Visualizar los tiempos de entrenamiento y predicción

Visualizaremos el tiempo de ajuste y predicción de KRR y SVR para diferentes tamaños del conjunto de entrenamiento.

_, ax = plt.subplots()

sizes = np.logspace(1, 3.8, 7).astype(int)
for name, estimator in {
    "KRR": KernelRidge(kernel="rbf", alpha=0.01, gamma=10),
    "SVR": SVR(kernel="rbf", C=1e2, gamma=10),
}.items():
    train_time = []
    test_time = []
    for train_test_size in sizes:
        t0 = time.time()
        estimator.fit(X[:train_test_size], y[:train_test_size])
        train_time.append(time.time() - t0)

        t0 = time.time()
        estimator.predict(X_plot[:1000])
        test_time.append(time.time() - t0)

    plt.plot(
        sizes,
        train_time,
        "o-",
        color="r" if name == "SVR" else "g",
        label="%s (entrenamiento)" % name,
    )
    plt.plot(
        sizes,
        test_time,
        "o--",
        color="r" if name == "SVR" else "g",
        label="%s (prueba)" % name,
    )

plt.xscale("log")
plt.yscale("log")
plt.xlabel("Tamaño del entrenamiento")
plt.ylabel("Tiempo (segundos)")
plt.title("Tiempo de ejecución")
_ = plt.legend(loc="best")

Visualizar las curvas de aprendizaje

Visualizaremos las curvas de aprendizaje de KRR y SVR.

from sklearn.model_selection import LearningCurveDisplay

_, ax = plt.subplots()

svr = SVR(kernel="rbf", C=1e1, gamma=0.1)
kr = KernelRidge(kernel="rbf", alpha=0.1, gamma=0.1)

common_params = {
    "X": X[:100],
    "y": y[:100],
    "train_sizes": np.linspace(0.1, 1, 10),
    "scoring": "neg_mean_squared_error",
    "negate_score": True,
    "score_name": "Mean Squared Error",
    "std_display_style": None,
    "ax": ax,
}

LearningCurveDisplay.from_estimator(svr, **common_params)
LearningCurveDisplay.from_estimator(kr, **common_params)
ax.set_title("Curvas de aprendizaje")
ax.legend(handles=ax.get_legend_handles_labels()[0], labels=["SVR", "KRR"])

plt.show()

Resumen

En este tutorial, comparamos la regresión de Ridge Kernel (KRR) y la regresión de vectores de soporte (SVR) utilizando Scikit-Learn. Generamos un conjunto de datos que consistía en una función objetivo senoidal y ruido fuerte agregado a cada quinto dato. Construimos los modelos de KRR y SVR utilizando GridSearchCV de Scikit-Learn para encontrar los mejores hiperparámetros. Comparamos los tiempos de ajuste y predicción de los modelos de SVR y KRR utilizando los mejores hiperparámetros encontrados. Visualizamos el modelo aprendido de KRR y SVR cuando tanto la complejidad/regularización como la anchura de banda del kernel RBF se optimizan utilizando búsqueda en cuadrícula. También visualizamos el tiempo de ajuste y predicción de KRR y SVR para diferentes tamaños del conjunto de entrenamiento. Finalmente, visualizamos las curvas de aprendizaje de KRR y SVR.