概要
- (動機)Pythonのscikit-learnライブラリを用いてロジスティック回帰を実施する際,ラッソ回帰のように正則化項を設けて変数選択もしたいと思った.
- 調べたところ,scikit-learnのLogisticRegressionではパラメータ指定することでラッソ回帰のように正則化項を設けられることが分かった.
本編
実現方法
以下のように,ロジスティック回帰モデルのインスタンスを作成する際に各引数を設定すればよい.(3行目)
penalty = "l1"
によって,Lasso回帰で用いられるL1ノルムが評価関数のペナルティ項に設定される.
solver
を設定しないと後述の通りエラーとなる.
ちなみにpenalty
のデフォルト値はl2
(L2ノルムを評価関数のペナルティ項に設定)であるため,デフォルトでRidge回帰の機能(係数の値がなるべく小さくなるように学習する機能)が働いていることになる.
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(penalty = "l1",solver = "liblinear")
引っかかった点(solverの指定の必要性)
penalty
の種類ごとに利用できる「最適化問題で使用するアルゴリズム(solver
)」が異なるらしい.
デフォルトのsolver
はlbfgs
というものだが,これがl1
に対応していない.
そのため,penalty = "l1"
のみ引数に設定して,学習を実施しようとすると以下のようなエラーを返す.
エラーとなるケース
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# irisデータセットの用意
X,y = load_iris(return_X_y=True)
# ロジスティック回帰モデル(Lasso回帰と同様の正則化項を設定)のインスタンスの生成.この時点ではエラーは出ない.
clf = LogisticRegression(penalty = "l1")
# 学習の実施.最適化アルゴリズムが正則化項"l1"に対応していないためエラーとなる.
clf.fit(X,y)
実行結果
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-17-539bf9374066> in <module>()
6
7 clf = LogisticRegression(penalty = "l1")
----> 8 clf.fit(X,y)
1 frames
/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/_logistic.py in _check_solver(solver, penalty, dual)
443 if solver not in ['liblinear', 'saga'] and penalty not in ('l2', 'none'):
444 raise ValueError("Solver %s supports only 'l2' or 'none' penalties, "
--> 445 "got %s penalty." % (solver, penalty))
446 if solver != 'liblinear' and dual:
447 raise ValueError("Solver %s supports only "
ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.
penaltyとsolverの対応関係一覧
0 y-vectorfield @y-vectorfield 2020年11月14日 【調査中】Logistic回帰 @ scikit-learnのPenaltyとSolverのディープな関係
上記のサイトにscikit-learnで指定できるpenalty
とそれに対応するsolver
一覧がわかりやすくまとめられていた.
各penaltyとsolverの解説も今後記載されるとのことなので,solverについてこちらのサイトで勉強させて頂く予定.