使用預先計算的 Gram 矩陣和加權樣本擬合彈性網路#

以下範例示範如何在將加權樣本與 ElasticNet 搭配使用時預先計算 Gram 矩陣。

如果使用加權樣本,則必須在計算 Gram 矩陣之前,先將設計矩陣置中,然後再按權重向量的平方根重新縮放。

注意

sample_weight 向量也會重新縮放,以總計為 n_samples,請參閱

fitsample_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)
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.847 秒)

相關範例

SVM:加權樣本

SVM:加權樣本

SGD:加權樣本

SGD:加權樣本

中繼資料路由

中繼資料路由

最近鄰居迴歸

最近鄰居迴歸

由 Sphinx-Gallery 產生的圖庫