Pré-calcul de la matrice de Gram pour ElasticNet

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire montre comment pré-calculer la matrice de Gram tout en utilisant des échantillons pondérés avec un ElasticNet. Il est important de noter que si des échantillons pondérés sont utilisés, la matrice de conception doit être centrée puis redimensionnée par la racine carrée du vecteur de poids avant de calculer la matrice de Gram.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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{{"Pré-calcul de la matrice de Gram pour ElasticNet"}} sklearn/datasets -.-> lab-49118{{"Pré-calcul de la matrice de Gram pour ElasticNet"}} ml/sklearn -.-> lab-49118{{"Pré-calcul de la matrice de Gram pour ElasticNet"}} end

Chargement du jeu de données et création de poids d'échantillonnage

Nous commençons par charger le jeu de données et créer quelques poids d'échantillonnage. Nous utilisons la fonction make_regression de scikit-learn pour générer un jeu de données de régression aléatoire avec 100 000 échantillons. Ensuite, nous générons un vecteur de poids lognormal et le normalisons pour qu'il somme au nombre total d'échantillons.

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()))

Pré-calcul de la matrice de Gram avec des échantillons pondérés

Pour ajuster le réseau élastique en utilisant l'option precompute avec les poids d'échantillonnage, nous devons tout d'abord centrer la matrice de conception et la redimensionner par les poids normalisés avant de calculer la matrice de Gram. Nous centrons la matrice de conception en soustrayant la moyenne pondérée de chaque colonne de caractéristiques à chaque ligne. Ensuite, nous redimensionnons la matrice de conception centrée en multipliant chaque ligne par la racine carrée du poids normalisé correspondant. Enfin, nous calculons la matrice de Gram en prenant le produit scalaire de la matrice de conception redimensionnée avec sa transposée.

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)

Ajustement du réseau élastique

Nous pouvons maintenant procéder à l'ajustement. Nous devons passer la matrice de conception centrée à fit pour empêcher l'estimateur du réseau élastique de détecter qu'elle n'est pas centrée et de rejeter la matrice de Gram que nous avons passée. Cependant, si nous passons la matrice de conception redimensionnée, le code de prétraitement la redimensionnera incorrectement une deuxième fois. Nous passons également les poids normalisés au paramètre sample_weight de la fonction fit.

from sklearn.linear_model import ElasticNet

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

Résumé

Ce laboratoire a montré comment pré-calculer la matrice de Gram tout en utilisant des échantillons pondérés avec un ElasticNet. Nous avons tout d'abord chargé un jeu de données de régression et créé un vecteur de poids lognormal qui a été normalisé pour qu'il somme au nombre total d'échantillons. Nous avons ensuite centré la matrice de conception, la redimensionné par les poids normalisés et calculé la matrice de Gram. Enfin, nous avons ajusté le réseau élastique en utilisant la matrice de Gram pré-calculée et les poids normalisés.