y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

目で見る過学習と正則化 (社内勉強会発表資料)

勤め先の社内勉強会で、過学習正則化について説明しました。発表資料を公開します。

www.slideshare.net

先月、社内勉強会でロジスティック回帰について説明したのですが、その際に触れられなかった話題として、今回改めて取り扱いました。機械学習は、実際にプログラムを書いて結果を可視化することで具体的なイメージを掴めるようになると思うため、今回もできるだけ図を多くして、視覚的に説明することを意識しました。説明内容に対応する Notebook ファイルは Gist で公開しています。
https://gist.github.com/y-uti/5127117445f28e5d5c66f7b5c66d262b

資料を作成しながら私自身が学んだ内容として、ソルバーの違いを意識できた点があります。scikit-learn の LogisticRegression クラスが利用する既定のソルバーは、現在は liblinear ですが、version 0.22 から lbfgs に変更されます。
sklearn.linear_model.LogisticRegression — scikit-learn 0.20.3 documentation

現在の version 0.20 では solver を指定しないと警告が表示されるので、今回は lbfgs を指定しました。ところが lbfgs では L1 正則化を指定できないことを知り、L1 正則化の実験では liblinear を利用しています。一方で liblinear では warm_start オプションが無視されるといった具合に、ソルバーによってそれぞれ制約があることに気付けました*1。勉強会の資料などを作成していると、普段とは少し違う観点で広く調べることになるので、このように新たな気付きがあるのも良い点ですね。

*1:最終的に発表資料には盛り込まなかったのですが、学習中に coef_ や intercept_ が動いていく様子を見たいと思い、warm_start=True に設定して max_iter=1 の学習を繰り返す方法を試してみました。その過程で、liblinear では warm_start=True が意味を持たないことを知ったという経緯です。