Upgrade to Pro — share decks privately, control downloads, hide ads and more …

tidymodels+DALEXによる解釈可能な機械学習 / Tokyo.R83

tidymodels+DALEXによる解釈可能な機械学習 / Tokyo.R83

2020年1月25日に行われた第83回Tokyo.Rでの発表資料です
https://tokyor.connpass.com/event/161709/

資料で使われたコードは以下になります
https://github.com/dropout009/tokyoR83

森下光之助

January 25, 2020
Tweet

More Decks by 森下光之助

Other Decks in Science

Transcript

  1. 1. 機械学習の解釈⼿法 2. tidymodelsとDALEX 3. 特徴量の重要度が知りたい PFI (Permutation Feature Importance)

    4. 特徴量と予測値の関係が知りたい PD (Partial Dependence) 5. インスタンス毎の異質性を捉えたい ICE (Individual Conditional Expectation) 6. なぜこの予測値が出たか理由が知りたい SHAP (SHapley Additive exPlanations)
  2. 解釈⼿法をどう使うか︖ どこまでのことがわかるのか︖ モデルのデバッグ 事前知識と整合的か、想定外の挙動はないか → ⽐較的安全な使い⽅ モデルの振る舞いを解釈 モデルは特徴量Aを重視している、特徴量Aが⼤きくなると予測 値が⼤きくなる →

    モデルの⼀側⾯を捉えているだけなので間違った解釈をする 可能性 因果関係の探索 モデルの振る舞いを因果関係として解釈 → 実験やより厳密な因果推論の⼿法をあわせて使うべき 「弱い」使い⽅ ⽐較的安全 「強い」使い⽅ 注意が必要
  3. diamondデータセットをtidymodelsとDALEXで分析する df = diamonds %>% mutate(log_price = log(price)) %>% select(log_price,

    carat, cut, color, clarity, depth, table) > df # A tibble: 53,940 x 7 log_price carat cut color clarity depth table <dbl> <dbl> <ord> <ord> <ord> <dbl> <dbl> 1 5.79 0.23 Ideal E SI2 61.5 55 2 5.79 0.21 Premium E SI1 59.8 61 3 5.79 0.23 Good E VS1 56.9 65 4 5.81 0.290 Premium I VS2 62.4 58 5 5.81 0.31 Good J SI2 63.3 58 ⽬的変数の対数をとっておく
  4. parsnipでモデルを作成と学習を⾏う model = parsnip::rand_forest(mode = "regression", trees = 500, min_n

    = 5) %>% parsnip::set_engine(engine = "ranger", num.threads = parallel::detectCores(), seed = 42) model_trained = model %>% parsnip::fit(log_price ~ ., data = df) ※データ分割、前処理、ハイパーパラメータのチューニングなど、 tidymodelsの詳細な使い⽅は「tidymodelsによるtidyな機械学習」をご確認下さい https://speakerdeck.com/dropout009/tidymodelsniyorutidynaji-jie-xue-xi モデルを作成 ハイパーパラメータは 決め打ち 学習
  5. DALEXでexplainerを作成する explainer = model_trained %>% DALEX::explain(data = df %>% select(-log_price),

    y = df %>% pull(log_price), label = "Random Forest") Preparation of a new explainer is initiated -> model label : Random Forest -> data : 53940 rows 6 cols -> data : tibbble converted into a data.frame -> target variable : 53940 values -> predict function : yhat.model_fit will be used ( default ) -> predicted values : numerical, min = 5.945424 , mean = 7.786629 , max = 9.784551 -> residual function : difference between y and yhat ( default ) -> residuals : numerical, min = -0.3707432 , mean = 0.0001399497 , max = 0.718558 -> model_info : package parsnip , ver. 0.0.5 , task regression ( default ) A new explainer has been created! 解釈⼿法を使うための準備
  6. 重要度をどう定義する︖PFIのアイデア • 各特徴量をシャッフルして予測精度の減少率を計算する • 予測精度が⼤きく落ちる → モデルとって重要な特徴量︕ 予測精度を計算 予測精度を計算 予測精度を⽐較

    シャッフル 特徴量の重要度の求め⽅(caratの場合) 元データ シャッフル後データ carat cut color clarity 1.04 Ideal G VS2 0.59 Very Good E SI2 0.53 Ideal G VVS1 1.51 Premium H VS2 carat cut color clarity 0.59 Ideal G VS2 1.51 Very Good E SI2 1.04 Ideal G VVS1 0.53 Premium H VS2
  7. 特徴量ごとに誤差の増加率を可視化して、重要な変数を調べる 各特徴量の重要度 pfi = explainer %>% ingredients::feature_importance(type = "ratio", B

    = 1) plot(pfi) ダイヤの価格には ⼤きさが極めて強く影響 ※Dropout Lossはシャッフルで 何%精度が落ちるかを⽤いて定義
  8. PFIの注意点と対処 • 相関する特徴量をモデルに投⼊すると重要度の「⾷い合い」が⽣じる → グループ化して同時にシャッフル︕ • 緯度経度など、同グループの変数を個別にシャッフルする意味は︖ → グループ化して同時にシャッフル︕ •

    ⽋落変数による「疑似相関」の問題 → そもそも因果的解釈は危険だが、必要な変数を全て含めるなどで対処。 ドメイン知識が必要。 • PFIをtrainとtestのどっちで計算するべきか︖ → trainならモデルが重視しているか、testなら予測に効くか • 特徴量の重要度はわかるが特徴量と予測値の関係はわからない → PDを使う︕
  9. どうやって関係を単純化する︖ PDのアイデア ブラックボックスモデルは⼊出⼒の関係が複雑 → ターゲットの特徴量以外の影響を消して単純化したい → 他の特徴量の影響を周辺化して消してしまう︕ 𝑓! 𝑥! =

    𝐸𝑿! 𝑓 𝑥! , 𝑿# = ' 𝑓 𝑥! , 𝒙# 𝑝(𝒙# )𝑑𝒙# • 𝑓(⋅)は学習済みモデル • 𝑋! はターゲットになる特徴量 • 𝑿# はその他の特徴量
  10. carat cut color clarity ICE 0.5 Ideal G VS2 𝑓!"#"$,&

    (0.5) 0.5 Very Good E SI2 𝑓!"#"$,' (0.5) 0.5 Ideal G VVS1 𝑓!"#"$,( (0.5) 0.5 Premium H VS2 𝑓!"#"$,) (0.5) 𝐸𝑿! 𝑓 𝑥" , 𝑿# を推定するには︖ 具体例で確認。 予測結果を平均 ̅ 𝑓!"#"$ (0.5) 元データ carat cut color clarity 1.04 Ideal G VS2 0.59 Very Good E SI2 0.53 Ideal G VVS1 1.51 Premium H VS2 carat cut color clarity ICE 1 Ideal G VS2 𝑓!"#"$,& (1.0) 1 Very Good E SI2 𝑓!"#"$,' (1.0) 1 Ideal G VVS1 𝑓!"#"$,( (1.0) 1 Premium H VS2 𝑓!"#"$,) (1.0) carat cut color clarity ICE 1.5 Ideal G VS2 𝑓!"#"$,& (1.5) 1.5 Very Good E SI2 𝑓!"#"$,' (1.5) 1.5 Ideal G VVS1 𝑓!"#"$,( (1.5) 1.5 Premium H VS2 𝑓!"#"$,) (1.5) 予測結果を平均 ̅ 𝑓!"#"$ (1.0) 予測結果を平均 ̅ 𝑓!"#"$ (1.5) ̅ 𝑓! 𝑥! = 1 𝑁 2 ,-. / 𝑓(𝑥! , 𝑿#, ) PDの推定式
  11. carat cut color clarity ICE 0.5 Ideal G VS2 𝑓!"#"$,&

    (0.5) 0.5 Very Good E SI2 𝑓!"#"$,' (0.5) 0.5 Ideal G VVS1 𝑓!"#"$,( (0.5) 0.5 Premium H VS2 𝑓!"#"$,) (0.5) ICEの計算⽅法は︖ PDの推定に使った予測値を平均せずに使⽤ 元データ carat cut color clarity 1.04 Ideal G VS2 0.59 Very Good E SI2 0.53 Ideal G VVS1 1.51 Premium H VS2 carat cut color clarity ICE 1 Ideal G VS2 𝑓!"#"$,& (1.0) 1 Very Good E SI2 𝑓!"#"$,' (1.0) 1 Ideal G VVS1 𝑓!"#"$,( (1.0) 1 Premium H VS2 𝑓!"#"$,) (1.0) carat cut color clarity ICE 1.5 Ideal G VS2 𝑓!"#"$,& (1.5) 1.5 Very Good E SI2 𝑓!"#"$,' (1.5) 1.5 Ideal G VVS1 𝑓!"#"$,( (1.5) 1.5 Premium H VS2 𝑓!"#"$,) (1.5) 𝑓!,, 𝑥! = 𝑓(𝑥!, 𝑿#,) ICEの推定式
  12. あるインスタンスで「もしダイヤのサイズが変わったら」を可視化 あるインスタンスのcaratに関するICE ice = explainer %>% ingredients::ceteris_paribus(new_observation = df_instance) plot(ice,

    variables = "carat") + show_observations(ice, variables = "carat") > df_instance log_price carat cut color clarity depth table 1 8.178358 1.01 Very Good F SI2 63.4 60 ダイヤのサイズが1.01から 変化した場合の予測値を可視化 実際の値
  13. PDと複数のICEを同時に描くことでより情報量の多い可視化が可能 PDとICEを同時に可視化 ices = explainer %>% ingredients::ceteris_paribus(new_observation = df_subset, variables

    = "carat") pd_carat = explainer %>% ingredients::partial_dependency(variables = "carat") plot(ices) + show_aggregated_profiles(pd_carat) ⼀部に例外あり 特徴量を確認してみる ほとんどのインスタンス では似た影響
  14. PDでは捉えられない交互作⽤をICEやConditional PDで浮き彫りに PDによる可視化 ICEによる可視化 C-PDによる可視化 𝑌 = 𝑋. − 5𝑋1

    + 10𝑋1𝑋2 + 𝜖, 𝑋., 𝑋1 ∼ 𝑈 −1, 1 , 𝑋2 ∼ 𝐵𝑒𝑟𝑛𝑜𝑢𝑙𝑖 0.5 , 𝜖 ~ 𝒩(0, 0.11) シミュレーション設定
  15. ICEの注意点と対処 • 特に強く相関する変数がモデルに含まれている場合、特徴量を⼤きく動かすと 現実でありえないデータでの予測値となる危険性が⾼まる → What if?の解釈は特定インスタンスの元の特徴量からあまり⼤きく動かさな い範囲で⾏うほうが安全 例︓ 夏に気温が0℃になったらアイスの売上はどうなる︖

    • ICEはインスタンスレベルの解釈なので値の信頼性はPDより低い → 同質なグループごとにPDを計算するConditional PDを使う • 特定インスタンスに対して、「もし〜だったら︖」という解釈は可能だが、「な ぜモデルがこの予測値を出したのか︖」はわからない → SHAPを使う
  16. どうやって予測値の理由付けを⾏う︖ SHAPのアイデア 𝑿 = 𝑋., … , 𝑋3 4を特徴量とした機械学習モデル𝑓 𝑿

    について考える → あるインスタンスの予測値𝑓 𝒙 に対して、なぜモデルはそんな予測をした かを知りたい → モデルの平均的な予測結果𝔼[𝑓 𝑿 ]と、あるインスタンスに対する予測𝑓 𝒙 の差分を各特徴量の貢献度𝝓𝒋 に分解するといいのでは︖ 𝑓 𝒙 − 𝔼 𝑓 𝑿 = 2 6-. 3 𝜙6 𝑓 𝒙 = 𝜙7 + 2 6-. 3 𝜙6 𝜙! ≔ 𝔼[𝑓(𝑿)] Additive Feature Attribution Method
  17. モデルに投⼊した特徴量𝑿 = 𝑋., … , 𝑋3 4をゲームのプレイヤーと⾒⽴てて、 あるインスタンスの予測値への特徴量𝑗の貢献度𝜙6 をShapley Valueで測る

    貢献度をどうやって求める︖ 協⼒ゲーム理論のShapley Valueを応⽤ ※SHAPの詳細は「SHapley Additive exPlanationsで機械学習モデルを解釈する」をご確認下さい https://speakerdeck.com/dropout009/shapley-additive-explanationsdeji-jie-xue-xi-moderuwojie-shi-suru 𝜙, = ( 𝒮⊆ℳ∖{,} |𝒮|! |ℳ| − |𝒮| − 1 ! |ℳ|! 𝑣 𝒮 ∪ 𝑗 − 𝑣(𝒮) 組み合わせの出現しやすさ 特徴量𝑗のありなしでの予測値の差分 予測値の差分を全ての組み合わせで平均 = Shapley Value
  18. SHAPの注意点と対処 • 特定インスタンスに対して、「なぜモデルがこの予測値を出したのか」はわかる が「特徴量を動かしたときに予測値がどう変化するか」はわからない → ICEを使う • 計算コストが⾮常に⾼い → データセットの⼀部をサンプリングして計算する

    • 理論⾯が相対的にややこしく、クライアントへの説明が困難 → SHAPは適切な粒度で集計・可視化することで変数重要度やPDとしても使え るが、⾮専⾨家への説明が求められる場合はより直感的なPFIやPDを使う
  19. 参考⽂献︓機械学習の解釈性全般 • Exploratory data analysis using xgboost package in R

    https://www.slideshare.net/kato_kohaku/exploratory-data-analysis-using-xgboost- package-in-r-146048320 • How to use in R model-agnostic data explanation with DALEX & iml https://www.slideshare.net/kato_kohaku/how-to-use-in-r-modelagnostic-data- explanation-with-dalex-iml • 機械学習と解釈可能性 / Machine Learning and Interpretability https://speakerdeck.com/line_developers/machine-learning-and-interpretability • 機械学習モデルの判断根拠の説明 https://www.slideshare.net/SatoshiHara3/ss-126157179 • BlackBox モデルの説明性・解釈性技術の実装 https://www.slideshare.net/DeepLearningLab/blackbox-198324328
  20. 参考⽂献︓PFI • Fisher, Aaron, Cynthia Rudin, and Francesca Dominici. "All

    models are wrong, but many are useful: Learning a variable's importance by studying an entire class of prediction models simultaneously." arXiv preprint arXiv:1801.01489 (2018). • Hooker, Giles, and Lucas Mentch. "Please Stop Permuting Features: An Explanation and Alternatives." arXiv preprint arXiv:1905.03151 (2019). • Beware Default Random Forest Importances https://explained.ai/rf-importance/index.html • 特徴量重要度にバイアスが⽣じる状況ご存知ですか︖ https://aotamasaki.hatenablog.com/entry/bias_in_feature_importances
  21. 参考⽂献︓PD/ICE • Friedman, Jerome H. "Greedy function approximation: a gradient

    boosting machine." Annals of statistics (2001): 1189-1232. • Goldstein, Alex, et al. "Peeking inside the black box: Visualizing statistical learning with plots of individual conditional expectation." Journal of Computational and Graphical Statistics 24.1 (2015): 44-65. • Hastie, Trevor, et al. "The elements of statistical learning: data mining, inference and prediction." The Mathematical Intelligencer 27.2 (2005): 83-85. • Zhao, Qingyuan, and Trevor Hastie. "Causal interpretations of black-box models." Journal of Business & Economic Statistics just-accepted (2019): 1-19. • Zhao, Xilei, Xiang Yan, and Pascal Van Hentenryck. "Modeling heterogeneity in mode- switching behavior under a mobility-on-demand transit system: An interpretable machine learning approach." arXiv preprint arXiv:1902.02904 (2019).
  22. 参考⽂献︓SHAP • Lundberg, Scott M., and Su-In Lee. "A unified

    approach to interpreting model predictions." Advances in Neural Information Processing Systems. 2017. • Lundberg, Scott M., Gabriel G. Erion, and Su-In Lee. "Consistent individualized feature attribution for tree ensembles." arXiv preprint arXiv:1802.03888 (2018). • Lundberg, Scott M., et al. "Explainable AI for Trees: From Local Explanations to Global Understanding." arXiv preprint arXiv:1905.04610 (2019). • Sundararajan, Mukund, and Amir Najmi. "The many Shapley values for model explanation." arXiv preprint arXiv:1908.08474 (2019). • Janzing, Dominik, Lenon Minorics, and Patrick Blöbaum. "Feature relevance quantification in explainable AI: A causality problem." arXiv preprint arXiv:1910.13413 (2019). • GitHub - slundberg/shap: A game theoretic approach to explain the output of any machine learning model. https://github.com/slundberg/shap. • 岡⽥ 卓. "ゲーム理論 新版. " 有斐閣. (2011).