ちょっと話題の記事

特徴量と目的変数の関係性を可視化する(sklearnを使ってpartial dependenceを可視化する)

SageMakerでトレーニングJOBを実行する前段階での試行錯誤をする際に利用しましょう
2019.12.20

概要

当エントリは『機械学習 on AWS Advent Calendar 2019』の20日目のエントリです。

先日、sklearnのversion「0.22」のリリースハイライトを見ていて「plot_partial_dependence」というAPIが気になり調べてみたので、結果をレポートします。

本エントリーの内容をざっくり言うと、「目的変数と特徴量の関係性」を可視化する際に便利なAPIである「plot_partial_dependence」が「sklearnの version0.22」でリリースされたのでその内容のレポートと、というものになります。
目的変数と特徴量の関係性を早期に把握して、無駄な「前処理」や「SageMakerトレーニングJOB」を減らしてコストも時間も削減しましょう。

目次

1.最初に

機械学習では「どの特徴量がどれくらい目的変数の予測に影響しているか、どのように影響しているのか」、といった部分が可視化しづらくブラックボックス化しがちでした。特にモデルが複雑になればなるほど難易度は上がります。
しかしながら、上記のような事柄を把握することは機械学習を用いて「意思決定」をしたり「モデルの改善」をする上では非常に重要なものです。
その上で「plot_partial_dependence」は特徴量と目的変数との関係性を簡単に可視化することができる機能です。

「partial dependence」は様々なモデルに適応することができ、「2つの特徴量と目的変数の関係性」も計算することもできて便利なのですが、下記の通りの注意点があります。

使えるモデルの制約

「sklearnのplot_partial_dependenceAPI」で使えるモデルは下記の通りの制限があります。

estimatorBaseEstimator A fitted estimator object implementing predict, predict_proba, or decision_function. Multioutput-multiclass classifiers are not supported.

参照:sklearn.inspection.permutation_importance

計算の前提

これは計算方法の問題になりますが、下記の点に注意しないとミスリードに繋がる可能性があります

  • 「各特徴量が互いに独立である」ことが前提になっており、現実のデータセットではそうなっていないことが殆どである
  • 「partial dependence」を計算する際に指定するモデルの精度が悪いとミスリードに繋がるので、必ずテストデータで検証してから「partial dependence」を確認する

実際にやってみる際はライブラリのアップデートを忘れずに

実際に動かしてみたい方は、sklearnのアップデートを忘れずにしましょう。
今回は、SageMakerのノートブックインスタンス上でsklearnのバージョンは「0.22」で確認しました。

!pip install --upgrade scikit-learn

import sklearn as sk

print(sk.__version__)
0.22

2.やってみる

sklearnにサンプルコードが提供されているので、実際に動かしてみたい方はこちら等をご参照ください。
下記に、「plot_partial_dependence」の要点となる部分だけ記述します。
(参照したものから一部修正を加えています)

from sklearn.inspection import plot_partial_dependence
import matplotlib.pyplot as plt

# 結果を大きく描画する
plt.rcParams['figure.figsize'] = (10.0, 10.0)

# 確認したい特徴量を記述
features = ['MedInc', 'AveOccup', 'HouseAge', 'AveRooms', # 目的変数との関係性を確認したい特徴量
            ('AveOccup', 'HouseAge'), # 特徴量間の関係性を可視化(下部のボックス)
            ('HouseAge', 'AveRooms') # 複数指定できる
           ]

# plot                        
plot_partial_dependence(estimator=est, X=X_train, features=features,
                        n_jobs=-1, grid_resolution=20, n_cols=2)

参照:Partial Dependence Plots

簡単ですね。
上記のように、「estimator」と「対象となるデータセット(X)」、「partial dependenciesを計算したい特徴量(features)」を指定することで利用できます。

続いて、結果の解釈に移ります。
青い波線のグラフは、各特徴量と目的変数の関係性をプロットしたものですが、「MedInc」変数が大きくなると目的変数は大きくなる関係性がある一方、「AveOccup」変数は逆の関係、「HouseAge」変数はあまり関係性がなく、「AveRooms」変数は判断に悩むところです。
(各ボックスの下部に記述してある線は各特徴量の十分位点です)

また、下部のカラフルなグラフは「2つの特徴量と目的変数の関係性」を可視化したものです。
これを見ると「HouseAge」変数と「AveRooms」変数は「両方とも値が小さい時」に目的変数との関係性があるかもしれません。

「2つの特徴量と目的変数との関係性」を可視化する際は3次元可視化をしてみると、より結果が解釈しやすいかもしれません。
こちらを見ると「HouseAge」変数と「AveOccup」変数の両方が小さい時は、目的変数の値が小さくなる傾向がわかりやすいです。

今回は取り上げませんが、複数のアルゴリズムの結果をまとめて描画することもできるので、色々な特徴量やモデルをまとめて試している時に便利かもしれません。

参照:Advanced Plotting With Partial Dependence

3.まとめ

「特徴量と目的変数との関係性の可視化」は「モデルの解釈」や「特徴量エンジニアリング」等の場面で重要となる要素であり、それをより容易にしてくれる機能は嬉しいですね。
re:Invent2019ではAmazon SageMaker ExperimentsAmazon SageMaker Debugger等の開発をサポートするサービスがたくさんリリースされましたが、こういった開発を支援してくれるものは上手く使いこなしたいです。

今回確認した内容をSageMakerで利用する場合は、恐らく「ノートブックインスタンス上での利用」がメインになるかと思いますので「ライブラリのアップデート処理」をライフサイクル設定に記述しておきましょう。

4.参照

参照したリンク先です。