StatsModelsとscikit-learnのElastic Net(Lasso回帰)を比較してみた

 最近スパース推定の勉強会に参加しております.使っているテキストはこちら.

スパース推定法による統計モデリング (統計学One Point)

スパース推定法による統計モデリング (統計学One Point)

この本の第2章のElastic Netについて勉強がてらにプログラムを書いてみて,振る舞いを観察してみました.

 今回使うデータはこちら.リンク先のヘッダの「Earn」が観測日の売上.「MaxTemp」が観測日の最高気温で「MinTemp」が最低気温.「Humi」は観測日の湿度.「Wind」は風の強さ.「Sun」は日照時間です.この「Earn」売上に直結する項目は何かを分析することが目的です.
ちなみに,このデータは昔お世話になったアイスクリーム屋さん・ハンバーガ屋さんの統計をイメージして作成したものです.なので実際の現象とは異なりますのであしからず.

各項目の相関係数を出してみるとこんな感じです.「Wind」がわざとらしいほどに無相関ですね.
f:id:shu10038:20180713095238p:plain
各項目の関係をグラフにするとこんな感じ.
f:id:shu10038:20180712223511j:plain
明らかに「Wind」がやる気がない数字が入ってますね.(まぁ,だってそういう風に作ったんだもん)

StatsModelsのエラスティックネットを用いてPythonスクリプトを書いてみた

 統計を用いた分析をする時に「StatsModels」を使うか「scikit-learn」を使うか悩ましかったりします.StatsModelsはPandasのDataFrameを直接使うことができるので,私はどちらかというとStatsModelsを使うことが多いですね.現時点ではscikit-learnはDataFrameを受け付けないですが,そのうち変更があったらどうなるか分かりません.といってもscikit-learn昔書いたこちらの記事を参照にDataFrameからListに変換してあげればいいだけなんですけどね.

StatsModelsのエラスティックネットのドキュメントはこちらこちら

さて,下記のように書いてみました.

この書籍では罰則項を増加させたときの回帰係数を描画した解パス図というのを紹介していました.これに習って同じものを描いてみるとこんな感じ.
f:id:shu10038:20180714090330j:plain
あれ?なんか変だぞ??この場合は一番売上に一番関係なさそうな「Wind」が先に消えるんじゃないの??
なんか変なのでscikit-learnではどういう振る舞いを見せるのかやってみました.

scikit-learnによるエラスティックネット

scikit-learnを使ったエラスティックネットはネット上にサンプルコードが山ほどあるのでここでは特に記載しません.Gitには上げておいたので,興味がある方は下記を参照ください.

さて,同じように解パス図を書くとこんな感じ.
f:id:shu10038:20180714090331p:plain

あれ?StatsModelsとsklearnで結果が違う・・・・
そんな馬鹿な,,という感じですが原因不明です.これでは余りにも内容がない記事になってしまいますので,あとで加筆します.


ではそんな感じで.ではでは.