部分従属プロットを、sklearnのあらゆる分類器に実装する(partial dependence plot)

Pocket
LinkedIn にシェア
LINEで送る

部分従属プロット(partial dependence plot)

部分従属プロット(partial dependence plot)とは、分類器が学習を行った際に、どの変数がどの程度クラス分類に影響しているかを視覚的に表す方法である(詳細な説明・原理はまた後日)。Pythonの機械学習オープンソースライブラリscikit-learnにもその機能は実装されているが、使用できるのはGradientBoostingClassifier(勾配ブースティング回帰木)に限られている。

そこで今回は、RandomForestClassifierなど、scikit-learnが実装しているあらゆる分類器に適応できる部分従属プロットのプログラムを作成した。主要な関数はpartial_dependenceとpartial_dependence_plotの2つである。以下、その使い方について説明する。

使い方

partial_dependence

partial_dependence(clf, X, feature=[], target=[], percentiles=(0.05, 0.95), grid_resolution=100, scaler=None):

Parameters:clf : classifier

学習済みの分類器。属性 n_features_ と n_classes_ を持つ分類器なら何でも可。

X : numpy.ndarray

学習に用いた入力データ。

feature : list (default=[])

部分従属を計算する特徴量を指定したリスト。デフォルト値では、すべての特徴量について部分従属を計算する。(例)0番目、2番目、4番目の特徴量について部分従属を計算したいとき:feature=[0, 2, 4]。

target : list (default=[])

部分従属を計算するラベルを指定したリスト。デフォルト値では、すべてのラベルについて部分従属を計算する。(例)0番目、2番目のラベルについて部分従属を計算したいとき:target=[0, 2]。

percentiles : tuple (0.05, 0.95)

学習用入力データのうち、部分従属の計算に用いる値の範囲を設定したタプル。デフォルト値では、入力データ全体の5%~95%を計算に用いる。

grid_resolution : int (default=100)

部分従属を計算する回数。デフォルト値では、入力データの値の範囲を100段階に区切って部分従属を計算する。

scaler: scaler

機械学習にStandardScalerなどのスケーラを用いた場合は、fit済みのscalerを引数として与えることで、軸の値を逆変換してスケーリング前の値として表示する。

Returns:pdp : np.ndarray

計算された部分従属を格納したnumpy配列。

axes : np.ndarray

部分従属をプロットするための軸情報を格納したnumpy配列。

学習済みの分類器を引数に与えることによって、部分従属を計算し、その値とプロットのための軸情報を返してくれる関数。部分従属計算を行う特徴量やラベルは番号で指定する。プロット軸は特徴量ごとに作成されるため、複数のラベルを指定した場合は軸を共有することになる。

partial_dependence_plot

partial_dependence_plot(clf, X: np.ndarray, feature_names: list, target_names: list, feature: list = [], target: list = [], percentiles=(0.05, 0.95), grid_resolution=100, scaler=None):
Parameters:clf : classifier

学習済みの分類器。属性 n_features_ と n_classes_ を持つ分類器なら何でも可。

X : numpy.ndarray

学習に用いた入力データ。

feature_names : list

特徴量の名前を格納したリスト。

target_names : list

ラベルの名前を格納したリスト。

feature : list (default=[])

部分従属を計算する特徴量を指定したリスト。デフォルト値では、すべての特徴量について部分従属を計算する。(例)0番目、2番目、4番目の特徴量について部分従属を計算したいとき:feature=[0, 2, 4]。

target : list (default=[])

部分従属を計算するラベルを指定したリスト。デフォルト値では、すべてのラベルについて部分従属を計算する。(例)0番目、2番目のラベルについて部分従属を計算したいとき:target=[0, 2]。

percentiles : tuple (0.05, 0.95)

学習用入力データのうち、部分従属の計算に用いる値の範囲を設定したタプル。デフォルト値では、入力データ全体の5%~95%を計算に用いる。

grid_resolution : int (default=100)

部分従属を計算する回数。デフォルト値では、入力データの値の範囲を100段階に区切って部分従属を計算する。

scaler: scaler

機械学習にStandardScalerなどのスケーラを用いた場合は、fit済みのscalerを引数として与えることで、軸の値を逆変換してスケーリング前の値として表示する。

Returns:なし

学習済みの分類器を引数に与えることによって、部分従属を計算し、その値を図にプロットしてくれる関数。図への表示のため、引数はpartial_dependenceに加えて特徴量とラベルの名前一覧が必要になる。部分従属のグラフは特徴量ごとにサブプロットとして作成されるが、特徴量が多すぎるとグラフが潰れて見にくくなりやすい。推奨は3×3程度で、4×4が限界と思われる。

コード

実行例

scikit-learnのbreast_cancerのデータをランダムフォレストで分類した際の部分従属プロットである。このデータセットでは、乳癌組織の特徴量を用いて良性・悪性を分類する。(【特徴量:0. mean radius, 1. mean texture, 2. mean perimeter, 3. mean area, 4. mean smoothness, 5. mean compactness, 6. mean concavity, 7. mean concave points, 8. mean symmetry】、【ラベル:0. malignant】)

部分従属プロットを見ると、mean radius(平均半径)、mean smoothness(平均平滑度)、mean compactness(平均緊密度)、mean symmetry(平均対称度)ではほとんど直線になっていることがわかる。これはすなわち、これらの特徴量の値が変化してもmalignant(悪性)である確率はほとんど変わらないため、分類にはあまり寄与していないことを意味している。対してmean concave points(平均陥凹点)は折れ線上のグラフとなっており、しかも0.05付近でpartial dependenceの値が跳ね上がっていることがわかる。そのためこの特徴量は分類に大きく寄与しており、さらにmean concave points = 0.05を境に良性・悪性が明確に分けられることが読み取れる。

Pocket
LinkedIn にシェア
LINEで送る

神経科学を研究している博士学生。Rust, Python, C/C++, Unityを活用して、世界の様々な現象を分析・シミュレートしています。理系分野だけでなく、政治学や社会学も、もちろん分析対象です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です