前回、【正則化のLasso回帰とRidge回帰】について説明しました。
今回の記事はLasso進化形のGroup Lassoの正則化について解説します。
Group Lassoとは
Group Lassoは、説明変数の属性に基づいていくつかのグループに分けられるとき、変数選択においてグループ単位で選択したいときに利用する方法です。
Lassoというのは、正則化項にL1normを使ったいわゆるL1正則化のことで、大部分の重みが0に潰れて疎な解が得られます。
この進化形として、Group Lassoという手法があります。Group Lassoでは、重みベクトルの次元をグループ分けして、各グループごとのL2normを正則化項として使います。
使うメリットは以下になります。
カテゴリー変数の効果をモデルに反映
例えば、都道府県を説明変数に入れる場合があります。この場合は、各都道府県をフラグ化して、変数にします。しかしこの方法では「都道府県じたい」が効果のある変数かどうかを判定したい場合にはわかりません。そのためカテゴリー変数じたいの効果の有無を調べる場合に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のライブラリはおすすめです。