Предварительное вычисление матрицы Грама для ElasticNet

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии показано, как предварительно вычислить матрицу Грама при использовании взвешенных выборок с ElasticNet. Следует отметить, что если используются взвешенные выборки, то перед вычислением матрицы Грама матрицу признаков необходимо центрировать и затем перемасштабировать по квадратному корню из вектора весов.

Советы по использованию ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


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{{"Предварительное вычисление матрицы Грама для ElasticNet"}} sklearn/datasets -.-> lab-49118{{"Предварительное вычисление матрицы Грама для ElasticNet"}} ml/sklearn -.-> lab-49118{{"Предварительное вычисление матрицы Грама для ElasticNet"}} end

Загрузка датасета и создание весов выборок

Начнем с загрузки датасета и создания некоторых весов выборок. Мы используем функцию make_regression из scikit - learn для генерации случайного датасета для регрессии с 100 000 выборками. Затем мы генерируем вектор весов, распределенных по логнормальному закону, и нормализуем его так, чтобы сумма составляла общее количество выборок.

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

Предварительное вычисление матрицы Грама с взвешенными выборками

Чтобы обучить эластичную сеть с использованием параметра precompute вместе с весами выборок, необходимо сначала центрировать матрицу признаков и перемасштабировать ее по нормализованным весам перед вычислением матрицы Грама. Центрируем матрицу признаков, вычитая из каждой строки взвешенное среднее каждого столбца признаков. Затем перемасштабируем центрированную матрицу признаков, умножая каждую строку на квадратный корень соответствующего нормализованного веса. Наконец, вычисляем матрицу Грама, взяв скалярное произведение перемасштабированной матрицы признаков на ее транспонированную матрицу.

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)

Обучение эластичной сети

Теперь мы можем приступить к обучению. Мы должны передать центрированную матрицу признаков в метод fit, чтобы предотвратить то, чтобы оценщик эластичной сети распознал, что она не центрирована, и не отбросил переданную нами матрицу Грама. Однако, если мы передадим перемасштабированную матрицу признаков, код предобработки неправильно перемасштабирует ее вторично. Мы также передаем нормализованные веса в параметр sample_weight функции fit.

from sklearn.linear_model import ElasticNet

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

Резюме

В этом практическом занятии показано, как предварительно вычислить матрицу Грама при использовании взвешенных выборок с ElasticNet. Сначала мы загрузили датасет для регрессии и создали вектор весов, распределенных по логнормальному закону, который был нормализован так, чтобы сумма составляла общее количество выборок. Затем мы центрировали матрицу признаков, перемасштабировали ее по нормализованным весам и вычислили матрицу Грама. Наконец, мы обучили эластичную сеть с использованием предварительно вычисленной матрицы Грама и нормализованных весов.