Precomputar la matriz de Gram para ElasticNet

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 cómo precomputar la matriz de Gram mientras se utilizan muestras ponderadas con un ElasticNet. Es importante tener en cuenta que si se utilizan muestras ponderadas, la matriz de diseño debe centrarse y luego reescalarse por la raíz cuadrada del vector de pesos antes de calcular la matriz de Gram.

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/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49118{{"Precomputar la matriz de Gram para ElasticNet"}} sklearn/datasets -.-> lab-49118{{"Precomputar la matriz de Gram para ElasticNet"}} ml/sklearn -.-> lab-49118{{"Precomputar la matriz de Gram para ElasticNet"}} end

Carga del conjunto de datos y creación de pesos de muestra

Comenzamos cargando el conjunto de datos y creando algunos pesos de muestra. Utilizamos la función make_regression de scikit-learn para generar un conjunto de datos de regresión aleatorio con 100.000 muestras. Luego, generamos un vector de pesos lognormal y lo normalizamos para que sume el número total de muestras.

import numpy as np
from sklearn.datasets import make_regression

rng = np.random.RandomState(0)

n_samples = int(1e5)
X, y = make_regression(n_samples=n_samples, noise=0.5, random_state=rng)

sample_weight = rng.lognormal(size=n_samples)
## normalize the sample weights
normalized_weights = sample_weight * (n_samples / (sample_weight.sum()))

Precomputación de la matriz de Gram con muestras ponderadas

Para ajustar la red elástica utilizando la opción precompute junto con los pesos de muestra, primero debemos centrar la matriz de diseño y reescalarla con los pesos normalizados antes de calcular la matriz de Gram. Centramos la matriz de diseño restando el promedio ponderado de cada columna de características de cada fila. Luego, reescalamos la matriz de diseño centrada multiplicando cada fila por la raíz cuadrada del peso normalizado correspondiente. Finalmente, calculamos la matriz de Gram tomando el producto punto de la matriz de diseño reescalada con su traspuesta.

X_offset = np.average(X, axis=0, weights=normalized_weights)
X_centered = X - np.average(X, axis=0, weights=normalized_weights)
X_scaled = X_centered * np.sqrt(normalized_weights)[:, np.newaxis]
gram = np.dot(X_scaled.T, X_scaled)

Ajustando la red elástica

Ahora podemos proceder con el ajuste. Debemos pasar la matriz de diseño centrada a fit para evitar que el estimador de la red elástica detecte que no está centrada y deseche la matriz de Gram que pasamos. Sin embargo, si pasamos la matriz de diseño escalada, el código de preprocesamiento la reescalará incorrectamente una segunda vez. También pasamos los pesos normalizados al parámetro sample_weight de la función fit.

from sklearn.linear_model import ElasticNet

lm = ElasticNet(alpha=0.01, precompute=gram)
lm.fit(X_centered, y, sample_weight=normalized_weights)

Resumen

Esta práctica demostró cómo precomputar la matriz de Gram mientras se utilizan muestras ponderadas con un ElasticNet. Primero cargamos un conjunto de datos de regresión y creamos un vector de pesos lognormal que se normalizó para sumar el número total de muestras. Luego centramos la matriz de diseño, la reescalamos con los pesos normalizados y calculamos la matriz de Gram. Finalmente, ajustamos la red elástica utilizando la matriz de Gram precomputada y los pesos normalizados.