はじめに
この実験では、密集データと疎データに対する Scikit-learn の Lasso 回帰アルゴリズムの使用方法を示します。Lasso アルゴリズムは、回帰係数に罰則を加える線形回帰手法です。この罰則により、モデルが疎な係数を生成するように促されます。Lasso アルゴリズムは、サンプル数に対して特徴量の数が多い場合に役立ちます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。
ライブラリのインポート
必要なライブラリをインポートして始めます。Scikit-learn、NumPy、SciPy が必要です。
from time import time
from scipy import sparse
from scipy import linalg
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
密集データの生成
次に、Lasso 回帰に使用する密集データを生成します。Scikit-learn のmake_regression関数を使って、5000 個の特徴量を持つ 200 個のサンプルを生成します。
X, y = make_regression(n_samples=200, n_features=5000, random_state=0)
密集データで Lasso を学習する
次に、密集データと疎データのそれぞれに対して 2 つの Lasso 回帰モデルを学習します。alpha パラメータを 1 に設定し、最大反復回数を 1000 に設定します。
alpha = 1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)
密集データに Lasso を適合させる
Scikit-learn のfit関数を使って、Lasso 回帰モデルを密集データに適合させます。また、適合プロセスに時間を計測し、各 Lasso モデルの時間を表示します。
t0 = time()
sparse_lasso.fit(X_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")
t0 = time()
dense_lasso.fit(X, y)
print(f"Dense Lasso done in {(time() - t0):.3f}s")
密集 Lasso と疎 Lasso の係数を比較する
密集 Lasso モデルと疎 Lasso モデルの係数を比較して、同じ結果が得られていることを確認します。係数の差のユークリッドノルムを計算します。
coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")
疎データの生成
次に、Lasso 回帰に使用する疎データを生成します。前のステップの密集データをコピーし、2.5 未満のすべての値を 0 に置き換えます。また、疎データを Scipy の圧縮疎列形式に変換します。
Xs = X.copy()
Xs[Xs < 2.5] = 0.0
Xs_sp = sparse.coo_matrix(Xs)
Xs_sp = Xs_sp.tocsc()
疎データで Lasso を学習する
次に、密集データと疎データのそれぞれに対して 2 つの Lasso 回帰モデルを学習します。alpha パラメータを 0.1 に設定し、最大反復回数を 10000 に設定します。
alpha = 0.1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)
疎データに Lasso を適合させる
Scikit-learn のfit関数を使って、Lasso 回帰モデルを疎データに適合させます。また、適合プロセスに時間を計測し、各 Lasso モデルの時間を表示します。
t0 = time()
sparse_lasso.fit(Xs_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")
t0 = time()
dense_lasso.fit(Xs, y)
print(f"Dense Lasso done in {(time() - t0):.3f}s")
密集 Lasso と疎 Lasso の係数を比較する
密集 Lasso モデルと疎 Lasso モデルの係数を比較して、同じ結果が得られていることを確認します。係数の差のユークリッドノルムを計算します。
coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")
まとめ
この実験では、Scikit-learn の Lasso 回帰アルゴリズムを密集データと疎データに適用する方法を示しました。Lasso アルゴリズムは、密集データと疎データに対して同じ結果を提供すること、および疎データの場合、アルゴリズムが高速であることを示しました。