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

データ分析手法をシミュレーションを通して理解する / stapy74

データ分析手法をシミュレーションを通して理解する / stapy74

2021年10月13日に行われた、みんなのPython勉強会での発表資料です。
https://startpython.connpass.com/event/224564/

7a0892afffbcbd35fd84d46508b3a914?s=128

Mitsunosuke Morishita

October 13, 2021
Tweet

Transcript

  1. データ分析手法を シミュレーションを通して理解する 森下光之助(@dropout009)

  2. 自己紹介 森下光之助 TVISION INSIGHTS株式会社 データサイエンティスト 執行役員(データ・テクノロジー担当) テレビの視聴行動を分析しています データの利活用、マネジメント、組織づくり、 因果推論、機械学習の解釈手法などに興味があ ります

    Twitter: @dropout009 Speaker Deck: dropout009 Blog: https://dropout009.hatenablog.com/
  3. 話したいこと

  4. データサイエンスって 難しいですよね

  5. 教科書とか論文を読むと、 数式、図、アルゴリズム、言葉… 色んな方法で 分析手法を説明してくれるけど

  6. 僕はよくわかりません

  7. 結局、 自分で使ってみないと よくわからない

  8. なので、分析手法のふるまいを シミュレーションで確認するの、 結構いいですよっていう話をします

  9. なんでシミュレーション? どんな設定だとうまくいって、 どんな設定だとうまくいかないのか ふるまいを知りたければシミュレーションデータ! 実データ • 実際のデータ(iris, titanic, …) •

    メリット • 現実にある • デメリット • 理論的な関係がわからないこ とが多い • 設定を細かく調整できない シミュレーションデータ • データを自分で作る • メリット • 理論的な関係がわかっている • 設定を細かく調整できる • デメリット • 現実的ではない/あまり意味の ない設定になる可能性がある
  10. やってみよう

  11. 分析手法例:Partial Dependence(PD) PD! 𝑥" = 𝔼 & 𝑓 𝑥" ,

    𝑿∖" = * & 𝑓 𝑥" , 𝒙∖" 𝑝 𝒙∖" 𝑑𝒙∖" 学習済みモデル ! 𝑓(𝑿)について、特徴量とモデルの予測値の関係を知り たい 線形モデルなら良いが、ブラックボックスモデルは特徴量と予測値の 関係が複雑なので、そのままだと解釈が難しい → いま興味のある特徴量𝑋! 以外は周辺化で消してしまうことで、関係 を単純化して解釈する
  12. データからPDを計算するアルゴリズム ' PD! 𝑥! = 1 𝑁 . "#$ %

    ! 𝑓(𝑥! , 𝒙",∖! )
  13. シミュレーション1:特徴量の相関するとどうなる? 𝑌 = 𝑋( + 𝑋$ ) + 𝜖 𝑋(

    , 𝑋$ ∼ Uniform 0, 1 𝜖 ∼ 𝒩(0, 0.01)) def generate_simulation_data( N: int = 10000, rho: float = 0.0, ) -> tuple[np.ndarray, np.ndarray]: """シミュレーションデータを生成する関数""" mu = np.array([0, 0]) Sigma = np.array([[1, rho], [rho, 1]]) X = np.random.multivariate_normal(mu, Sigma, N) for j in range(2): X[:, j] = sp.stats.norm().cdf(X[:, j]) e = np.random.normal(0, 0.01, N) y = X[:, 0] + X[:, 1] ** 2 + e return X, y X, y = generate_simulation_data() 相関していて一様分布に従うシ ミュレーションデータを作る小技 多変量正規分布でデータを生成し て、それを正規分布のCDFで変換
  14. 予測モデルの構築とPDの計算 # Random Forestで予測モデルを作成 rf = RandomForestRegressor( n_jobs=-1, random_state=42 ).fit(X,

    y) # PDを計算 partial_dependence( estimator=rf, X=X, features=[j], kind="average” ) scikit-learnのinspectionモジュールに partial_dependence()関数がある ちなみに、 permutation_importance()という 変数重要度を計算する関数もある kind=“individual”を指定すると、ICEが計 算できる(後述) ちなみに、“both”を指定すると両方計算 される
  15. シミュレーション1-1:相関係数 = 0 PDは理論的な関係をうまく復元できている モデルは Random Forest

  16. シミュレーション1-2:相関係数 = 0.95 PDは理論的な関係とズレが生じている モデルは Random Forest

  17. PDの理論的なふるまい ! 𝑓 𝑋( , 𝑋$ = 𝑋( + 𝑋$

    )のように、 モデルが理論的な関係を完全に学習できていたとすると、 PDは以下のようになるはず。。。が、実際はうまくいっていない なんで? PD! 𝑥! = 𝔼 & 𝑓 𝑥! , 𝑋" = 𝔼 𝑥! + 𝑋" # = " $ + 𝑥! PD" 𝑥" = 𝔼[ & 𝑓 𝑋! , 𝑥" ] = 𝔼 𝑋! + 𝑥" # = " # + 𝑥" #
  18. なんでPDがうまくいかないのか? → 外挿がうまくいっていない

  19. 対応:Accumulated Local Effects(ALE) 外挿が問題なので、 データのあるところだけで 予測しよう 参考:Accumulated Local Effects(ALE)で機械学習モデルを解釈する https://dropout009.hatenablog.com/entry/2021/08/08/121858

  20. シミュレーション2:交互作用があるとどうなる? 𝑌 = 𝑋( − 5𝑋$ + 10𝑋$ 𝑋) +

    𝜖 𝑋( , 𝑋$ ∼ Uniform −1, 1 𝑋) ∼ Bernoulli 0.5 𝜖 ∼ 𝒩(0, 0.01) def generate_simulation_data( N: int = 10000 ) -> tuple[np.ndarray, np.ndarray]: """シミュレーションデータを生成する関数""" x0 = np.random.uniform(-1, 1, N) x1 = np.random.uniform(-1, 1, N) x2 = np.random.binomial(1, 0.5, N) e = np.random.normal(0, 0.1, N) X = np.column_stack((x0, x1, x2)) y = x0 - 5 * x1 + 10 * x1 * x2 + e return X, y X, y = generate_simulation_data()
  21. PDは交互作用をうまく捉えられていない モデルは Random Forest

  22. PDが交互作用を捉えられない原因 つまり、学習がうまくいっていても、交互作用が存在する場合、 PDはうまく特徴量とモデルの予測値の関係を捉えられない PD" 𝑥" = 𝔼 & 𝑓 𝑋!

    , 𝑥" , 𝑋# = 𝔼 𝑋! − 5𝑥" + 10𝑥" 𝑋# = 0 ! 𝑓 𝑋( , 𝑋$ , 𝑋) = 𝑋( − 5𝑋$ + 10𝑋$ 𝑋) のように、 モデルが理論的な関係を完全に学習できていたとしても、 Partial Dependenceは以下のようになるはず
  23. 対応:Individual Conditional Expectation(ICE) 平均を取ると相殺しちゃう ので、インスタンスごとに 特徴量とモデルの予測値の 関係を見てみよう 参考:tidymodelsとDALEXによるtidyで解釈可能な機械学習 https://dropout009.hatenablog.com/entry/2019/11/17/112655

  24. まとめ

  25. まとめ • データサイエンスってほんと難しいですよね • シミュレーションでいろいろ試行錯誤することで、分析手法のふるまいを 確認し、理解を深めることができる • シミュレーションは細かく設定を変更できるので、どんなときに手法がう まくいって、どんなときにうまくいかないのかを調べるのに適している •

    新しいことを勉強して、いろいろ試すのは素直に楽しい
  26. 参考文献 • 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. • Hooker, Giles, and Lucas Mentch. "Please Stop Permuting Features: An Explanation and Alternatives." arXiv preprint arXiv:1905.03151 (2019). • Apley, Daniel W., and Jingyu Zhu. "Visualizing the effects of predictor variables in black box supervised learning models." Journal of the Royal Statistical Society: Series B (Statistical Methodology) 82.4 (2020): 1059-1086. • Molnar, Christoph. "Interpretable machine learning. A Guide for Making Black Box Models Explainable." (2019). https://christophm.github.io/interpretable-ml-book/. • 森下光之助. 「機械学習を解釈する技術〜予測力と説明力を両立する実践テ クニック」. 技術評論社. (2021). (宣伝) https://is.gd/nkYPPG
  27. Pythonが使えるエンジニア・データサイエンティスト大募集