注意
转到页面底部 下载完整示例代码,或通过 JupyterLite 或 Binder 在浏览器中运行此示例。
使用预计算 Gram 矩阵和加权样本拟合弹性网 (Elastic Net)#
以下示例展示了如何在使用 ElasticNet 时预计算 Gram 矩阵,并同时使用加权样本。
如果使用加权样本,在计算 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 选项配合样本权重来拟合弹性网,我们必须在计算 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)
脚本总运行时间: (0 分 1.136 秒)
相关示例