機械学習SEの取り組みログ

pythonを使ったいろんな取り組み(kaggleだったり)を紹介していきます.

python scikit-learn

【scikit-learn】Logistic回帰にLasso回帰の正則化項(ペナルティ項)を設定する方法【Python】

投稿日:2020年11月21日 更新日:

概要

  • (動機)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)」が異なるらしい.
デフォルトのsolverlbfgsというものだが,これが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についてこちらのサイトで勉強させて頂く予定.

-python, scikit-learn

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

【kaggle】「SIIM-ISIC Melanoma Classification」コンペのデータを用いてEfficientNetとResNetの性能比較をしてみる

本記事の概要 kaggleで2020/07/07現在開催中のSIIM-ISIC Melanoma Classification(画像認識コンペ)に最近注力しています. 画像認識ど素人ですが,以下の2つ …

no image

【自然言語処理】ニュース記事のベクトル表現と株価変動の関係性を可視化する【python】

本記事の概要 以前紹介したニュース記事をスクレイピングするスクリプトとニュース記事をベクトル化するスクリプトで得られたベクトルの各成分のうちどれかが,株価の変動との間に相関があるかどうか調べてみました …

no image

【自然言語処理】得られたニュース記事をgensim, nattoライブラリを用いてベクトル化する【python】

記事の概要 この記事では,機械学習手法であるdoc2vecを用いてニュース記事を30次元のベクトルで表現した結果について紹介していきます. また記事をベクトル化する過程で,文を品詞ごとに区切る処理(形 …

no image

【2018年10月時点】産経ニュースから経済カテゴリのニュースの情報をスクレイピング【python】

スクリプトの目的・概要 タイトルの通り, 産経ニュース様から経済カテゴリのニュース情報をスクレイピングするスクリプトを書きました. 株価の時系列分析の補足情報として用いることを考えているため, 記事タ …

no image

【TensorFlow 2.0】tfrecordファイルに格納されているデータの数を確認するコマンド【Python】

記事の概要 TensorFlow特有のデータ保存形式「tfrecord」で保存したデータセットについて,何件のデータがtfrecordに圧縮されているかを確認する方法を記載しました. 単純にlen(t …

プロフィール


sudot

某IT企業でデータ分析業務をしています.
日ごろの機械学習に関する取り組みを発信していきます.
最近kaggleのexpertになれました.いつかmasterになるのが夢.