Group Lassoの正則化

前回、【正則化のLasso回帰とRidge回帰】について説明しました。

今回の記事はLasso進化形のGroup Lassoの正則化について解説します。

 

Group Lassoとは

Group Lassoは、説明変数の属性に基づいていくつかのグループに分けられるとき、変数選択においてグループ単位で選択したいときに利用する方法です。

Lassoというのは、正則化項にL1normを使ったいわゆるL1正則化のことで、大部分の重みが0に潰れて疎な解が得られます。

group_lasso_01

 

この進化形として、Group Lassoという手法があります。Group Lassoでは、重みベクトルの次元をグループ分けして、各グループごとのL2normを正則化項として使います。

group_lasso_02
group_lasso_03

使うメリットは以下になります。

カテゴリー変数の効果をモデルに反映

例えば、都道府県を説明変数に入れる場合があります。この場合は、各都道府県をフラグ化して、変数にします。しかしこの方法では「都道府県じたい」が効果のある変数かどうかを判定したい場合にはわかりません。そのためカテゴリー変数じたいの効果の有無を調べる場合にGroup Lassoを使うとわかります。

 

大規模な線形分類、回帰のライブラのsklearn-contrib-lightningをインストールします。

pip install scikit-learn
pip install sklearn-contrib-lightning

 

ライブラリのインポート

from sklearn.datasets import fetch_20newsgroups_vectorized
from lightning.classification import CDClassifier

 

20 newsgroupsはこのブログでも過去何回か取り上げまたしが、ベクトル化済みのデータです。

(130,107のカラム)

bunch = fetch_20newsgroups_vectorized(subset=”all”)
X = bunch.data
y = bunch.target
print(X.shape)
print(y.shape)

(18846, 130107)
(18846,)

 

分類の設定と学習

clf = CDClassifier(penalty=”l1/l2″,
                   loss=”squared_hinge”,
                   multiclass=True,
                   max_iter=20,
                   alpha=1e-4,
                   C=1.0 / X.shape[0],
                   tol=1e-3)
clf.fit(X, y)

CDClassifier(C=5.3061657646184864e-05, Cd=1.0, alpha=0.0001, beta=0.5,
             callback=None, debiasing=False, loss=’squared_hinge’, max_iter=20,
             max_steps=’auto’, multiclass=True, n_calls=100, n_jobs=1,
             penalty=’l1/l2′, permute=True, random_state=None,
             selection=’cyclic’, shrinking=True, sigma=0.01,
             termination=’violation_sum’, tol=0.001, verbose=0,
             warm_debiasing=False, warm_start=False)

 

出力

# Accuracy
print(“Accuracy: ”,clf.score(X, y))
# 特徴量数:
print(“特徴量数: ”, clf.n_nonzero(percentage=False))
# 特徴量%
print(“特徴量%: ”, clf.n_nonzero(percentage=True))

Accuracy:  0.9597792635041918
特徴量数:  15117
特徴量%:  0.11618898291406304

 

まとめ

Group Lassoで大規模な特徴量データから有効な特徴量選択し、高い精度なモデルができました。Scikit-learnの機械学習のライブラリが慣れる方はsklearn-contrib-lightningのライブラリはおすすめです。