About connecting the dots.

data science related trivial things

kaggleで予測モデルを構築してみた (6) - FIMLの仕組みとRのimputationパッケージ

さて,前回で述べた通りに今回はFIMLについてみていこうと思っていろいろ調べていましたが,結論からいうとFIMLでは欠測値の推定は行わないということがわかりました.FIMLの数理的な意味については,以下の論文に書かれているので,詳しくは読んでください.

http://www4.ocn.ne.jp/~murakou/missing_data.pdf

FIMLの概要

FIMLというのは,平たくいえばサンプルごとに異なる多変量正規分布を仮定したEMアルゴリズムということになります.EMアルゴリズムというのは,平たくいえばデータセットの変数群に対して多変量正規分布を仮定して,実際に得られたデータが最も現れる確率が高いような,平均ベクトルと分散共分散行列を推定する手法ということになります.

もともと正規分布というのは,平均と分散の2パラメタでモデルが完全に表現されるものなので,多変量正規分布の場合には,変数群の平均ベクトルと分散共分散行列がわかれば,完全に分布が記述できるということになります.正規分布のモデル式は以下の通りです.

f(x) = 1/√(2πσ^2) * exp{-(x-μ)^2/2σ^2} 

ということで,実際のデータから逆に,データに最もフィットするような平均ベクトルと分散共分散行列を,EMアルゴリズムで求めてあげれば,多変量正規分布がうまく推定できるということになります.そして,欠測値のあるサンプルについては,取得できた変数だけを用いての多変量正規分布を,欠測値のないサンプルについてはすべての変数を用いた多変量正規分布を仮定して,それらが最も当てはまるような平均ベクトルと分散共分散行列を推定するのが,ここでいうFIMlということになります.

FIMLの思想

ということで,上記のようにFIMLの根本は,欠測値を含んでいるデータから,より精度の高い混合正規分布を求めて,それをもとに統計モデル推定をしましょうということになります.より具体的にいうならば,FIMLは個別具体的な数値には興味がなくて,ただ全体を表す統計モデルの構築のみを目指している,ということです.

これに対して機械学習というのは,あくまで個別具体的な値を知りたくて,そのための手段として統計モデルを構築しているにすぎない,ということになるんだと思います.FIMLというのは基本的に統計解析側から提唱され使われているモデルなので,個別数値の推定は行わないのだろうなぁと感じています.

そのほかの欠測値補完パッケージ

そんなわけで,今回のケースではMIの数値を使うしかないのかなぁというところです.いちおうほかの手法もないかなぁと思っていろいろ探してみたところ,普通にRにはimputationというパッケージがあることがわかりました.中身はSVD, SVT, kNNと3つの手法を持っているみたいで,詳しくはマニュアルを読めばすぐわかる感じで書いているのでコードは省略します.

ちなみにそれぞれの手法についても軽く述べておきます.kNNは,いわゆるk近傍法と呼ばれているメソッドで,パターン認識だと特徴空間で当該サンプルに最も似ているk個のサンプルを持ってきて,その中での多数決を持って分類を行うような手法です.連続値に対しては平均でも取るのかもしれませんが,このパッケージには詳細は書いてないのでちょっとよくわからないです.割とプリミティブな手法です.

続いてSVDは要するに主成分分析で欠測値予測を行いましょうということです.これもあんまり一般的な手法ではなさそうですが,和文では以下の論文とかが似たようなやり口かなぁと思います.といっても信学技報はciniiで公開してくれていないので,読めはしないのですが...

CiNii 論文 -  混合主成分分析モデルによる欠測データ予測

SVTは,Singular Value Thresholdingを使ってSVDと似たようなことをやっているみたいです.気が向いたら,精度比較でもしてみようかなぁと思いますが,今日は疲れたのでこの辺で.とりあえず次回はそろそろ予測モデルの検証に進んでいきたいですね...