scikit-learnメモ

scikit-learnメモ

LogisticRegressionが算出する直線の意味

2値分類においては1本の線が算出される。coef_属性で係数(傾き)、intercept_属性で切片が得られる。係数を各変数にかけて右辺をゼロとおき、グラフの縦軸にしたい変数について解くとグラフの式を得ることができる。なぜゼロとおくかというと、「そういうモデルだから」という理由のほかに、リンク関数であるロジット関数(log(p/(1-p)))に0.5を入れるとちょうどゼロになるからとも解釈できる。

2値分類においてはこの線は決定境界にぴたりと一致する。

いちおうコードもメモ。

3値分類ではこのようになる。

3値分類でもなにか明確な意味があるのではないかと思い、ググったり、実験して調べてみた。各線は任意の2つのグループの真ん中に引かれているのではないかとあたりをつけつつ調べたが、そんなことはなかった。2値分類とはちがい、綺麗な意味はなさそうだ。ひとつ気づく点は、線の交点が決定境界上にあること。ほかになにか本質的な関係がありそうではあるがいまはわからない。ググっても出てこない(後述するが、ずっとまえから持っている本に載っていた)。

そもそもの話、ロジスティック回帰は何本かの線を引き、交差エントロピー誤差が最小になるようにパラメーター(coef_, intercept_)を更新していくだけだ。算出される線と決定境界には直接的な関係はないと思う。少なくとも同一のものではないことだけはたしかだ。2値分類で両者が一致するので、3値以上の分類でもわかりやすい意味があるのではと勘違いして時間を使ってしまった。

ついでにKerasでつくったシンプルなNNではこうなる。

線が点にかぶってるが、決定境界はきれいでちゃんと分離できている。この例では決定境界の交点と線の交点がほぼ重なっているが、重なっていない場合もある。

softmax関数にとおすまえの式をイコールとおくと決定境界になる

「詳解ディープラーニング」p.117より、softmax関数にとおすまえの式をイコールとおくと決定境界と一致する直線になることがわかった。これは要するに、2種類のデータである確率が等しい線を3本求めているということ。

決定境界と3本の直線がぴたり一致。ちなみに「詳解ディープラーニング」では2本しか線を引いていなかったが、実際には3本ある。

以下はKerasによるシンプルなNN。2本はLogisticRegressionとおなじになったが、1本だけ違う線になった。エポック数を増やしても違う線のまま。なんでだろ。

fit/fit_transform/transform

fitは変換式を計算し、transformは変換式を使ってデータを変換する。fit_transformはそれらを同時に行う。

テストデータは、訓練データで計算した変換式で変換しなければならない。うっかりテストデータで計算した変換式でテストデータを変換しないこと。

訓練データにはfit_transformを使い、テストデータにはtransformを使えばいい。

scikit-learnでの学習済みモデルの保存と読み込み

joblib関数を使うのが推奨されているみたいだが、普通にpickleモジュールで保存することもできる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする