パッケージの概要
ALEPlot パッケージは、予測モデルとデータをもとに、ALE (Accumulated Local Effects、累積局所効果) を可視化する機能を実装したパッケージです。
なお、ALE は、関心のある説明変数 X について、それが取りうる値の分割 [x_{[0]}, x_{[1]}), [x_{[1]}, x_{[2]}), ... を考え、各区間について、そこに含まれるデータの X の値を区間の両端の値に置き換えたときの予測値の増分の平均値をその区間の局所効果とみなし、区間ごとの局所効果を累積させることで、変数 X の影響を X に関する1変数関数として表現する手法です。
手法の詳細については、たとえば、「解釈可能な機械学習」に関するウェブ版書籍(Molnar著、株式会社HACARUS訳)の解説 https://hacarus.github.io/interpretable-ml-book-ja/ale.html などをご参照ください。
data (Boston, package = "MASS" )
library (parsnip) # 予測モデルの構築
library (dplyr) # データフレームの操作
# ランダムシードを固定する
set.seed (42 )
# 予測モデルを構築する
model <- boost_tree () %>%
set_mode ('regression' ) %>%
fit (medv~ ., data = Boston)
summary (model)
Length Class Mode
lvl 0 -none- NULL
ordered 1 -none- logical
spec 7 boost_tree list
fit 9 xgb.Booster list
preproc 4 -none- list
elapsed 2 -none- list
censor_probs 0 -none- list
ALEプロットを作成する(ALEPlot)
ALEPlot() 関数を使えば、ALE プロットを描画することができます。
ここで、pred.fun に渡す予測用の関数は、X.model と newdata を入力すると予測値を数値ベクトルとして出力するようなものであることが必要です。lm を含む多くのモデルでは、モデルに対応する predict 関数のメソッドが数値ベクトルを出力するため、pred.fun = predict としておけば動作します。predict の返り値がベクトルでないようなクラスのモデルでは、以下のように適切に定義することが必要です。
library (ALEPlot)
# ALEPlot関数の `X` に渡す説明変数Xを用意する
X <- select (Boston, - medv)
# ALEPlot関数の `pred.fun` に渡す予測のための関数を定義する
pred_parsnip = function (X.model, newdata){
predict (X.model, new_data = newdata)$ .pred
# 予測値をベクトルとして抽出
}
# ALEPlotを描画する
ale <- ALEPlot (X, model, pred_parsnip, J = "rm" , K = 50 )
DALEXパッケージがインストール済みの場合は、DALEX::yhat() 関数を利用することもできます。この関数は、ALEPlot() 関数が要求するのと同じ引数名で定義されており、しかも、かなり広範な種類の予測モデルに対応しています。
# 2次元ALEPlotを描画する
ale.2 d <- ALEPlot (X, model, DALEX:: yhat, c ("rm" , "dis" ))
標準のプロットは R のグラフィックス関数で作成されますが、返り値をデータフレーム化することで、ggplot2 パッケージで ALE を可視化することもできます。
library (ggplot2)
ggplot (data = as.data.frame (ale[2 : 3 ]),
aes (x = x.values, y = f.values)) +
geom_line () + geom_point ()
PDプロットを作成する(PDPlot)
PD プロットを作成するための関数 PDPlot() を用いれば、PD を描画することもできます。基本的な使い方は ALEPlot() 関数と同じです。
なお、PD は、ALE と同様に、予測モデルにおける特定の特徴量の効果を解釈するための手法です。詳細については、前掲のウェブ書籍の解説 https://hacarus.github.io/interpretable-ml-book-ja/pdp.html などをご参照ください。
# PDPlotを描画する
pdp <- PDPlot (X, model, pred_parsnip, "rm" , 20 )