AI を「見える化」する手法: PDP, ICE Plot

AI を「見える化」する手法: PDP, ICE Plot

導入

こんにちは、HACARUS データサイエンティストの山下です。

普段業務で使っている機械学習では、データさえあれば、予測モデルを簡単に作ることができます。
一方で、性能を上げるためにアンサンブルやニューラルネットワークのような複雑なモデルを使用すると、モデルの解釈性の問題、つまり出来上がった予測モデルがどのように予測をしているのかを人間が理解できないという問題に直面します。

この問題を解決するために様々な手法が考案されていますが、今回は AI の判断基準を可視化する手法のうち、scikit-learn の version 0.24.1 でさらに使いやすくなった Partial Dependence Plot(PDP)および Individual Conditional Expectation plot(ICE plot)について、実際に適用した例を用いて紹介します。

PDP, ICE plot とは

PDP, ICE plot は、ある特徴量 (説明変数) が変化したときに、機械学習モデルの予測がどのように変化をするかを表した図で、ブラックボックスのモデルがどのような振る舞いをしているのかを解釈するために有用な手法です。
手法の詳しい説明は、HACARUSで翻訳プロジェクトを進めている「Interpretable Machine Learning」の5章をご覧ください。(和訳版はこちら

学習済みモデルに対して、個々のインスタンスの特定の特徴量の値のみを変化させて作った架空のデータを予測することで、モデルがどのように振舞うのかを調べるというのが、 ICE plot の基本的な考え方です。PDP は全インスタンスに対して ICE plot を行い、その平均をとったものです。
ただし、特徴量間に強い相関がある場合、PDP, ICE plot を作成する際に作り出される架空のデータが現実的なものではなくなってしまうため、PDP, ICE plot の解釈に注意が必要です。

実際に、乳がんのデータセットに対して適用したPDP および ICE plot の例を見てみましょう。

横軸が対象の特徴量(腫瘍細胞の半径)、縦軸が予測結果 (腫瘍が良性である確率)です。
細い青線の1本1本が個別のインスタンスを変化させたときのプロット(ICE plot)、中心の太い黒線がその平均(PDP)を表しています。この例で言えば、特徴量の値が大きくなると予測の値が小さくなる、という傾向が分かります。
横軸上に立っている黒線はヒストグラムの10分位を表しており、その特徴量における実際の入力データの分布が分かるようになっています。黒線が疎な部分は実際のデータが少なく、プロットも信頼性が低いと考えられるので注意が必要です。

scikit-learn を用いて PDP, ICE plot を試す

scikit-learn 内には PDP 用のモジュールが存在しており、最新(2020年12月)のアップデートで PDP だけでなく ICE plot が描画できるようになりました。今回は、この scikit-learn のモジュールを使って実際のデータに対して PDP, ICE plot を描画します。

まずは準備として、必要なライブラリをインポートします。scikit-learn は予め 0.24.1 以上に更新しておいて下さい(Google Colab で試す場合、`!pip install –upgrade scikit-learn`を実行しておきましょう)。

#モジュールのインポート
import matplotlib.pyplot as plt #表示用
import pandas as pd #データ操作用
from sklearn.ensemble import RandomForestClassifier #機械学習モデル(分類器)
from sklearn.inspection import plot_partial_dependence #PDPのモジュール
from sklearn.datasets import load_breast_cancer #データセット

機械学習モデルやデータセットは、自分の使いたいものを選んでください。今回の例には RandomForest と乳がんデータセットを使用しました。

まずは簡単にデータセットの中身を確認しておきます。

dataset = load_breast_cancer() #データセットの読み込み
X = pd.DataFrame(dataset.data, columns=dataset.feature_names) #特徴量をpandas.DataFrameに格納し、Xとする
y = dataset.target #目的変数をyとする

print(X.shape) #データの数×特徴量数
print(X.columns) #特徴量の名前

出力:

(569, 30)
Index([‘mean radius’, ‘mean texture’, ‘mean perimeter’, ‘mean area’,
‘mean smoothness’, ‘mean compactness’, ‘mean concavity’,
‘mean concave points’, ‘mean symmetry’, ‘mean fractal dimension’,
‘radius error’, ‘texture error’, ‘perimeter error’, ‘area error’,
‘smoothness error’, ‘compactness error’, ‘concavity error’,
‘concave points error’, ‘symmetry error’, ‘fractal dimension error’,
‘worst radius’, ‘worst texture’, ‘worst perimeter’, ‘worst area’,
‘worst smoothness’, ‘worst compactness’, ‘worst concavity’,
‘worst concave points’, ‘worst symmetry’, ‘worst fractal dimension’],
dtype=’object’)

このデータセットは、乳腺腫瘤から採取した細胞の半径、質感、周囲長、面積、滑らかさ、コンパクト性、輪郭の凹部強度、輪郭の凹点数、対称性、フラクタル次元のそれぞれについての平均、標準偏差、最悪値を特徴量としています。目的変数は腫瘍が良性か悪性かで、良性なら 1、悪性なら 0 となっています。

ただし、このデータセットは特徴量どうしが強い相関を持っており、PDP や ICE plot では、特徴量間の相関がある場合は「存在しえないデータ」(例:平均値が 1 なのに最大値が 0.5 など)の予測を見ることになる可能性があるため、あらかじめ Lasso などを使用して多重共線性の排除をしておきます。
今回は 7, 20, 21, 24, 27, 28 番の特徴量(輪郭の凹点数の平均値、半径の最悪値、質感の最悪値、滑らかさの最悪値、輪郭の凹点数の最悪値、対称性の最悪値)を使用します。

imp_features = [X.columns[7], X.columns[20], X.columns[21], X.columns[24], X.columns[27], X.columns[28]] #重要な特徴量を設定
imp_X = X[imp_features] #重要な特徴量のみのDataFrameを作成

print(imp_features) #重要な特徴量を表示

出力:

[‘mean concave points’, ‘worst radius’, ‘worst texture’, ‘worst smoothness’, ‘worst concave points’, ‘worst symmetry’]

次に、モデルを学習します。今回はモデルの中身を解釈するのが目的なので、全データを学習に使います。

model = RandomForestClassifier() #機械学習モデルを設定
model.fit(imp_X, y) #学習

モデルの学習が済んだら、いよいよプロットです。`plot_partial_dependence`を使ってグラフを作成します。

plt.rcParams[‘font.size’] = 18 #matplotlib.pyplot の文字サイズ設定
fig, ax = plt.subplots(figsize=(12, 6)) #matplotlib.pyplot の描画準備
fig.subplots_adjust(hspace=0.6, wspace=0.1) #間隔の設定
ax.set_title(‘Breast Cancer PDP of Random Forest Classifier’) #タイトルの設定
disp_RFC = plot_partial_dependence(model, imp_X, imp_features, ax=ax) #プロット
for i in range(disp_RFC.lines_.shape[0]):
disp_RFC.axes_[i, 0].set_ylabel(‘Benign Probability’) #縦軸ラベルの設定

上のコードでは表示が崩れないように色々と調整していますが、最低限のプロットを行うだけなら`plot_partial_dependence(学習済みモデル, 入力データ, 選択する特徴量のリスト)`だけで動きます。

plot_partial_dependence(model, imp_X, imp_features)

デフォルトでは PDP のみが描画されますが、パラメータで`kind=’individual’`とすれば ICE plot のみ、`kind=’both’`とすれば両方を描画できます。実際に ICE plot も見てみましょう。数が多すぎても見づらいので、`subsample=0.2`として線のうち 20% のみを描画するように設定しました。

fig, ax = plt.subplots(figsize=(12, 6)) #matplotlib.pyplot の描画準備
fig.subplots_adjust(hspace=0.6, wspace=0.1) #間隔の設定
ax.set_title(‘Breast Cancer ICE plots of Random Forest Classifier’) #タイトルの設定
disp_RFC = plot_partial_dependence(model, imp_X, imp_features, ax=ax, kind=’individual’, subsample=0.2) #プロット
for i in range(disp_RFC.lines_.shape[0]):
disp_RFC.axes_[i, 0].set_ylabel(‘Benign Probability’) #縦軸ラベルの設定

PDP と ICE plot を同時にプロットする場合は、デフォルトだと線の色や凡例が見づらいため、色々と整えると見やすくなります。scikit-learn のリポジトリでも色の変更には対応が進められているようなので、今後はより使いやすくなっていくと思います。

fig, ax = plt.subplots(figsize=(12, 8))
fig.subplots_adjust(hspace=0.7, wspace=0.1)
ax.set_title(‘Breast cancer PDP & ICE plots of Random Forest Classifier’)
disp = plot_partial_dependence(model, imp_X, imp_X.columns, ax=ax, kind=’both’, subsample=0.2)
for i in range(disp.lines_.shape[0]):
for j in range(disp.lines_.shape[1]):
if disp.lines_[i,j,-1] != None:
disp.lines_[i,j,-1].set_color(‘0.2′)
disp.axes_[i, j].legend(loc=’upper center’, bbox_to_anchor=(0.5, -0.4), borderaxespad=0, ncol=2, fontsize=10, labels=[‘PDP’, ‘ICE plot’], handles=[disp.lines_[i,j,-1], disp.lines_[i,j,0]])
if j==0:
disp.axes_[i, j].set_ylabel(‘Benign Probability’)

 ICEの必要性

PDP の結果から、多くの特徴量では値が大きくなるにつれて良性(1.0)であると判断される可能性が下がる様子が見られます。
その一方、ICE plot を見ないと分からないこともあります。例えば mean concave points の ICE plot を見てみると、PDP では 0.05 付近で急激に良性率が下がっていたのに対し、ICE plot ではそうでないデータ(むしろ 0.05 付近で上がっている線)があることがわかります(注:`RandomForest`および`plot_partial_dependence`の`random_state`によっては、プロットの見た目が今回の例と一致しない場合があります)。
平均的な輪郭の凹点数が 0.05 を超えたからといって、一概に良性率が低いと判断しているわけではなさそうです。

他の例も見てみましょう。下の図は、ボストンの住宅価格データセットを使い、ニューラルネットワークによる回帰モデルで予測を行ったときのプロットです。

横軸は雇用施設からの距離、縦軸は住宅価格の予測です。PDP では基本的には距離が遠いほど価格が下がっていますが、ICE plot では価格帯の低いインスタンスでは平坦または右上がりになっているものが多く、労働者向けの安い住宅があるのではないかと考えることができます。

このように、PDP だけでなく ICE plot も描画しておくことで、平均的な傾向のみからモデルの判断基準を誤って理解してしまうことを防げます。

まとめ

機械学習モデルの判断根拠を手軽に可視化する手法として、PDP と ICE plot の概要および scikit-learn での利用例を紹介しました。
実はこの手法はモデルに依存せず、どんなモデルに対しても適用することができるため、非常に汎用性が高い手法です。実際、SVM や勾配ブースティング、ニューラルネットワークなどに対しても同様に適用できます。
また、今回は2値分類問題について PDP と ICE plot を行いましたが、回帰問題でも同じように利用できます。

みなさんも、モデルが何を学習したのか、その振る舞いについて調査したいときは、PDP, ICE plot を是非活用してみてください。

ニュースレター購読Newsletter

登録はこちら