« 読了:Olden, Koy, & Death (2004) ニューラル・ネットワークの説明変数の重要性を測る最良の方法(それは意外にも...) | メイン | 読了:「パンティストッキングのような空の下」「花のズボラ飯」 »
2015年12月17日 (木)
なんというかその、判別モデルや回帰モデルを組んだ時、「で、どの説明変数が重要でしたか?」って聞かれること、あるじゃないですか。いやいや、ひとことで「重要」っていってもいろいろありましてですね... と交互作用や非線形性の話をしても、ある意味、煙に巻くようなもんじゃないですか。素朴な気持ちとしては、こっちも内心では 「いやあこの変数は効くなあ」なんて思っているわけだし。なんだかんだいいながら、どうにかして変数を選ばないといけないわけだし。
魚心あれば水心で、世の中には実にいろんな変数重要度指標があり、誠に困ったことである。さらに困ったことに、こういう話は仕事の中で不意に顔を出すので、いつかきちんと調べます、では間に合わない。
とりあえず、いろんなタイプの予測モデルを統合したパッケージである、R の caret パッケージが実装している重要性指標についてメモしておこう。出典はこちら。純粋に自分用の覚え書です。
まずは、モデルに依存しないタイプの指標。
- (2クラス分類の場合) ROC曲線下面積 (AUC)。
- (多クラス分類の場合) 他の個々のクラスとのペアワイズのAUCの最大値。[んんん...? 自分vs他クラスの分類のAUCじゃだめなの?]
- (2クラス分類の場合) 敏感度と特異度。
- (回帰の場合) 結果変数を説明変数に単回帰したときの傾きの t 値の絶対値。
- (回帰の場合) 結果変数を説明変数にloess回帰したときのR二乗。
モデルに依存するタイプの指標。
- 線形モデル: パラメータの t 値の絶対値。[ううむ、なんだかなあ... 重回帰の変数重要度評価の文脈では結構評判悪いと思うんだけど]
- ランダム・フォレスト: [たぶんここの説明は、おそらく randomForest パッケージのちょっと古いマニュアルの、impotrance関数の説明を引用しているのではないかと思う。かわりに最新のマニュアルから引用してみる。なお、importance関数では引数で2種類の重要度を選べる]
第一の指標は、OOBデータのpermutingから算出するものである。それぞれの木について、データのOOB部分における予測誤差を記録する(分類の場合はエラー率、回帰の場合はMSE)。で、それぞれの説明変数をpermuteしたあとでもう一度同じものを求める。この差をすべての木を通して平均し、差のSDで基準化する。ある変数について差のSDが0のときは割り算しない(しかしこの場合平均はたいてい0である)。第二の指標は、その変数についてsplitしたときのノードの不純度(分類の場合はジニ指標、回帰の場合は誤差平方和)の全体的減少をすべての木を通じて平均したものである。
- PLS: 回帰係数の絶対値の重みづけ和。重みはPLS成分を通した平方和の減少の関数。従って係数の寄与は平方和の減少と比例する形で重みづけられる。[いまいち腑に落ちない... plsパッケージのマニュアルをみたほうがよさそうだ]
- recursive partioning: それぞれの分岐における損失関数(たとえばMSE)の減少を当該の変数に帰属させ、変数ごとに合計する。なお、それぞれの分岐で競合していたが実際には使わなかった変数について合計する手もある[rpart.controlで制御できるって書いてある... つまりrpartパッケージの機能なんだろうな]
- バギング木: 上と同じ手法をすべてのブートストラップ木について行い合計する。[具体的にはどのパッケージを想定しているのだろう... caretの対応パッケージが多すぎてよくわからない]
- ブースティング木: gbmパッケージのラッパー。[現時点ではxgboostにも対応していたと思うんだけどな...]
- 多変量アダプティブ回帰スプライン(MARS): earthパッケージのevimp関数のラッパー。その説明変数がモデルに追加されたときのモデルの統計量の減少。統計量としては、一般化交差妥当化統計量(GCV)、誤差平方和(RSS)を選べる。ほかに、その変数が最終モデルに含まれた回数を調べるという手もある(nsubsets)。[駄目だ、MARSの仕組みについてよく知らないので全然腑に落ちない]
- nearest shrunken centroids [そもそも名前しか知らん...pamrというパッケージらしい]: その変数のクラス重心と全体重心の差。
- Cubist: その変数が条件に含まれるか線形モデルに含まれた回数の割合。[手法についてよく知らないので、意味もよくわからん...]
ふうん...
ランダムフォレストのような協調学習の分野では、変数重要性をpermutationベースで求めるとき、ふつうにその変数だけかきまぜちゃっていいのか (いわばmarginalな重要度になる)、それとも共変量で層別して層の中だけでかきまぜるべきか (conditionalな重要度になる)、という議論があるらしい。これは他の手法でもいえることであって、その辺のところが知りたいんだけど、caretパッケージではさすがにそこまで面倒はみてくれないようだ。
雑記:データ解析 - 説明変数の重要度指標のいろいろ (by caretの中の人)