hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

機械学習を解釈する技術 3章 まとめ

PFI

 線形回帰なら回帰係数の大きさを見ることで特徴量の重要度を簡単に確認出来る.しかし,RandomForestなどの決定木モデルには回帰係数に相当する物が無く,NeuralNetはパラメータが複雑に関わり合い,パラメータから解釈するのは困難である.よって,どんなモデルでも計算できるアプローチを取る必要がある.

 どんなモデルでも共通して持っている要素は,予測値を出力する事である.よって,ひとつひとつの特徴量に対し,その特徴量が使えない時の予測値を計算して,全ての特徴量が使えるときの予測値と比較し,その差を見るという手法が考えられる.

 差が大きいと言うことは,その特徴量を使う事で性能が向上する=重要であると言えるし,差が小さかったらその特徴量を使わなくても似た性能を出せる=重要でないと言える.このように,予測値の誤差を調べることで特徴量の重要度を定義する手法がPFIである.

 PFIは特徴量の値をシャッフルすることで,特徴量を意味の無い状態=使えないようにする手法である.ある特徴量ひとつをシャッフルさせたデータで予測値を出し,シャッフルさせてないデータで予測値を出し,両者の差を特徴量重要度とする.これを全ての特徴量に対して行うことで,特徴量の重要度を求めることが出来る.

LOCOFI

 PFIはデータをシャッフルさせることで特徴量を使えなくしていたが,LOCOFIではより直感的に,データを削除する事で特徴量を使えなくする.ただし,特徴量を削除するとモデルの構造も変わってしまうため,学習もし直さないといけない.さらに,モデルの構造が変わってしまうため,本来評価したいモデルと同じ特徴量重要度を求めることが出来ているとはいいがたいという欠点もある.

GPFI

 特徴量同士が強い相関関係にある場合,PFIだと重要度が低くでる事がある.強い相関を持つ二つの特徴量があったとき,ある一方の特徴量を使えなくしても,相関関係のあるもう一方の特徴量を使えばある程度高い性能の予測値を出すことが出来てしまうからである. 

 このような場合,相関関係の強い特徴量のグループはひとつにまとめてシャッフルしてしまい,一つの特徴量として重要度を出すという手法が考えられる.これがGPFIである.

 相関関係だけでなく,one hot encodingした特徴量でも重要度が正しく求められない事がある.one hot encodingとは,例えば出身地が日本,アメリカ,イギリスのどれかを取るデータがあったときに,日本という特徴量を新たに作り,出身地が日本なら1そうでないなら0とする手法である.同様にアメリカという特徴量を作り,アメリカ出身なら1そうでないなら0とする.

 このような特徴量についてPFIを行った場合を考える.例えば日本の重要度を求めるためにシャッフルする.すると,日本が0だったデータが1となる可能性がある.しかし,そのデータはアメリカかイギリスで1のはずで,日本でも1となると出身地が日本とアメリカというようにあり得ない事になる.このようなデータを使って予測すると正しい重要度が得られない可能性がある.

 このような問題を回避するために,GPFIでカテゴリカル変数をまとめてシャッフルしてしまうという方法がある.まとめてシャッフルする事で出身地が複数あるような矛盾を回避することが出来る.

 また他に,label encoding使うという方法がある.one hot encodingのように,日本アメリカイギリスという特徴量を作るのではなく,出身地という特徴量を作り,日本なら1アメリカなら2イギリスなら3と指定する方法である.これならシャッフルしても日本とアメリカが出身地になるような矛盾は生じず,正しい重要度が得られると思われる.

 一般に,one hot encodingの方が高い性能を出す事が多いが,カテゴリカル変数を使う事で重要度の解釈性が高まる.逆に,one hot encodingを使ってPFIやGPFIを使ったときは,注意する必要がある.

因果関係

 PFIで求まった特徴量の重要度を因果関係として解釈する事は良くないとされている.理由の一つに疑似相関の可能性があるからである.

 因果関係のあるA→Bと,相関関係のあるA, Cがあったとき,CとBには高い関係が見られる.しかしC→Bという因果関係は無いという事は十分ありうることであり,これを疑似相関と呼ぶ.

 PFIで求まった特徴量の重要度を見て疑似相関か否かを判断するのは不可能なので,重要度から因果を見いだしてはいけない.

PFIの実装と実データでの分析

 PFIを実装し,kaggleにあるspaceship titanicコンペのデータを使って動作を確認してみる.(タイタニックコンペのデータを使おうと思っていましたがその宇宙版のコンペが新しく追加されていたのでこちらにしてみました)

使用データの確認

Spaceship Titanic | Kaggle

からデータをダウンロードします.kaggle APIを使うと便利です.

 train.csvをpandasで読み込んでデータの一部を見てみます.

出身地やCabinの情報などいろいろなデータがある事が分かる.(全体的にタイタニックコンペと似ていますがHomeplanetなど宇宙チックでユニークなデータがあります)

モデルの学習

 このコンペは転送されたかされてないか(生き残ったか生き残ってないか?)を予測するコンペなので分類タスクになる.よって使うランダムフォレストも分類のものを使う事に注意する.ランダムフォレストは数値データしか使えないため,カテゴリカル変数をlabel encodingする.すると以下になる.(今回は特徴量の重要度を見るための実験なので特徴量エンジニアリングなどの工夫はなしでシンプルにいきます)

PFIの実装

 基本は本書の実装に沿います.

特徴量の重要度の表示

 特徴量の重要度を表示します.

 乗客が航海中に仮死状態になることを選択したかどうかを示す(!?)CryoSleepという変数や,食事に関して宇宙船で請求された金額を示すFoodCountが特徴量の上位に来ていることが分かります.

 

 PFIを用いることでSpaceship Titanicのデータの特徴量の重要度を求めることが出来た.