使用预先计算的 Gram 矩阵和加权样本拟合弹性网络#

以下示例展示了如何在使用 ElasticNet 的加权样本时预先计算 gram 矩阵。

如果使用加权样本,则在计算 gram 矩阵之前,必须先对设计矩阵进行中心化,然后按权重向量的平方根进行缩放。

注意

sample_weight 向量也被重新缩放以求和到 n_samples,请参阅

fitsample_weight 参数文档。

让我们先加载数据集并创建一些样本权重。

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 选项和样本权重来拟合弹性网络,我们必须先对设计矩阵进行中心化,并在计算 gram 矩阵之前按归一化权重对其进行缩放。

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,否则弹性网络估计器将检测到它未中心化并丢弃我们传递的 gram 矩阵。但是,如果我们传递缩放后的设计矩阵,预处理代码将错误地再次缩放它。

from sklearn.linear_model import ElasticNet

lm = ElasticNet(alpha=0.01, precompute=gram)
lm.fit(X_centered, y, sample_weight=normalized_weights)
ElasticNet(alpha=0.01,
           precompute=array([[ 9.98809919e+04, -4.48938813e+02, -1.03237920e+03, ...,
        -2.25349312e+02, -3.53959628e+02, -1.67451144e+02],
       [-4.48938813e+02,  1.00768662e+05,  1.19112072e+02, ...,
        -1.07963978e+03,  7.47987268e+01, -5.76195467e+02],
       [-1.03237920e+03,  1.19112072e+02,  1.00393284e+05, ...,
        -3.07582983e+02,  6.66670169e+02,  2.65799352e+02],
       ...,
       [-2.25349312e+02, -1.07963978e+03, -3.07582983e+02, ...,
         9.99891212e+04, -4.58195950e+02, -1.58667835e+02],
       [-3.53959628e+02,  7.47987268e+01,  6.66670169e+02, ...,
        -4.58195950e+02,  9.98350372e+04,  5.60836363e+02],
       [-1.67451144e+02, -5.76195467e+02,  2.65799352e+02, ...,
        -1.58667835e+02,  5.60836363e+02,  1.00911944e+05]]))
在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示形式或信任笔记本。
在 GitHub 上,HTML 表示形式无法呈现,请尝试使用 nbviewer.org 加载此页面。


脚本总运行时间:(0 分钟 0.952 秒)

相关示例

SVM:加权样本

SVM:加权样本

SGD:加权样本

SGD:加权样本

元数据路由

元数据路由

Lasso 和弹性网络

Lasso 和弹性网络

由 Sphinx-Gallery 生成的图库