注意
转到末尾 下载完整示例代码。或通过 JupyterLite 或 Binder 在浏览器中运行此示例
使用预计算的 Gram 矩阵和加权样本拟合 Elastic Net#
以下示例展示了如何在使用加权样本的同时预计算 Gram 矩阵,结合 ElasticNet
。
如果使用加权样本,设计矩阵必须先进行中心化,然后通过权重向量的平方根进行重新缩放,最后再计算 Gram 矩阵。
注意
sample_weight
向量也会被重新缩放,使其总和为n_samples
,详见fit
方法中sample_weight
参数的文档。
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
我们首先加载数据集并创建一些样本权重。
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
选项和样本权重拟合 Elastic Net,我们必须首先对设计矩阵进行中心化,并在计算 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
,否则 Elastic Net 估计器会检测到它未中心化并丢弃我们传递的 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]],
shape=(100, 100)))
脚本总运行时间: (0 分 0.770 秒)
相关示例