hirohirohirohirosのブログ

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

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

PD

 PFIは特徴量をシャッフルすることで,その特徴量がどれほど予測値に影響を与えているのかを調べることが出来た.しかし,PFIは特徴量の重要度しか分からず,特徴量を上げると予測値が上がるのかどうかなど,特徴量と予測値の関係までは分からない.

 特徴量と予測値の関係を知ることが出来るのがPDである.PDでは,他の特徴量を固定して興味のある特徴量だけを動かし,各データの予測値を平均する.例えば,ある特徴量のみを増加し全てのデータに対し予測させ予測値の平均を取り,グラフにプロットすればその特徴量と予測値の関係が可視化されることになる.

 PDは複雑なブラックボックスの沢山の特徴量と予測値の関係を直接解釈するのは難しいが,一つの特徴量と予測値の関係に絞れば人間にも解釈できるだろうというアイデアから生まれている.

 学習済みモデルを \widehat f(x_0, x_1)とする.今特徴量 x_0と予測値の関係を知りたい場合,数式で表すと

\begin{align}
\widehat{PD}_0(x_0) = \frac{1}{N}\sum \widehat f(x_0, x_{i, 1})
\end{align}

となる.この数式を観察すると,PDは x_1で周辺化し平均をとったものと言える.

 PFIと同様に,PDもあくまで特徴量と予測値の関係を表しているだけで,特徴量と予測値の因果関係を表している訳では無いことに注意する.

実データでの分析

使用データの確認

 今回も3章で使ったデータと同じspaceship titanicコンペのデータを使う.

モデルの学習と特徴量の重要度計算

 3章と同じ方法で学習し,特徴量の重要度を求める.(シード値を固定していないため)3章と微妙に結果が異なり最も重要度が高いのはFoodCourtという特徴量であった.

 今回はFoodCourtという特徴量のPDを求めてみることにする.

PDの実装

 前回はスクラッチで実装したが,今回はsklearnにあるライブラリを利用してみる.sklearnのinspectionライブラリにはPDを計算するpartial_dependenceという関数がある.

scikit-learn.org

これを使うと今回の場合,

とたった2行で求めることが出来る.引数estimatorには学習済みモデル,Xには用いるデータ,featuresにはPDを求めたい特徴量,kindには予測値の平均を返してほしいならaverage,平均を取らないならindividualを入れる.(individualの場合ICEと呼ばれる指標になる.これは5章で解説される)今回はFoodCourtのPDを計算したいのでfeaturesにFoodCourtを入れた.

 この関数は予測値の平均と特徴量の値をdictで返す.これをグラフにプロットための関数もsklearnには存在する.

scikit-learn.org

 コードは以下になる.

 本書に従って新たに関数化しているが,肝心のコードは5行目の1行分のみである.取る引数はほとんど変わらない事が分かる.プロットされるグラフはこのようになった.

 X軸にある太い線は元データがどこに密集しているかを表している.FoodCourtは宇宙船内で請求された食事に関する金額である.よって元データでは請求された金額が約0,250,1100ドルの乗客が多いことが分かる.

 グラフを見るとFoodCourtが大きくなるほどPDが低くなっていることが分かる.つまり,生き残る確率が低くなっていると言える.請求された金額が高い=沢山食事を取った乗客は生き残りにくそうだと言えるので,このモデルの結果に問題はなさそうだと考えられる.