Slide 1

Slide 1 text

データ分析手法を シミュレーションを通して理解する 2021/10/13 みんなのPython勉強会 #74 森下光之助(@dropout009)

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

話したいこと

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

僕はよくわかりません

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

なんでシミュレーション? どんな設定だとうまくいって、 どんな設定だとうまくいかないのか ふるまいを知りたければシミュレーションデータ! 実データ • 実際のデータ(iris, titanic, …) • メリット • 現実にある • デメリット • 理論的な関係がわからないこ とが多い • 設定を細かく調整できない シミュレーションデータ • データを自分で作る • メリット • 理論的な関係がわかっている • 設定を細かく調整できる • デメリット • 現実的ではない/あまり意味の ない設定になる可能性がある

Slide 10

Slide 10 text

やってみよう

Slide 11

Slide 11 text

分析手法例:Partial Dependence(PD) PD! 𝑥" = 𝔼 & 𝑓 𝑥" , 𝑿∖" = * & 𝑓 𝑥" , 𝒙∖" 𝑝 𝒙∖" 𝑑𝒙∖" 学習済みモデル ! 𝑓(𝑿)について、特徴量とモデルの予測値の関係を知り たい 線形モデルなら良いが、ブラックボックスモデルは特徴量と予測値の 関係が複雑なので、そのままだと解釈が難しい → いま興味のある特徴量𝑋! 以外は周辺化で消してしまうことで、関係 を単純化して解釈する

Slide 12

Slide 12 text

データからPDを計算するアルゴリズム ' PD! 𝑥! = 1 𝑁 . "#$ % ! 𝑓(𝑥! , 𝒙",∖! )

Slide 13

Slide 13 text

シミュレーション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で変換

Slide 14

Slide 14 text

予測モデルの構築と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”を指定すると両方計算 される

Slide 15

Slide 15 text

シミュレーション1-1:相関係数 = 0 PDは理論的な関係をうまく復元できている モデルは Random Forest

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

なんでPDがうまくいかないのか? → 外挿がうまくいっていない

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

シミュレーション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()

Slide 21

Slide 21 text

PDは交互作用をうまく捉えられていない モデルは Random Forest

Slide 22

Slide 22 text

PDが交互作用を捉えられない原因 つまり、学習がうまくいっていても、交互作用が存在する場合、 PDはうまく特徴量とモデルの予測値の関係を捉えられない PD" 𝑥" = 𝔼 & 𝑓 𝑋! , 𝑥" , 𝑋# = 𝔼 𝑋! − 5𝑥" + 10𝑥" 𝑋# = 0 ! 𝑓 𝑋( , 𝑋$ , 𝑋) = 𝑋( − 5𝑋$ + 10𝑋$ 𝑋) のように、 モデルが理論的な関係を完全に学習できていたとしても、 Partial Dependenceは以下のようになるはず

Slide 23

Slide 23 text

対応:Individual Conditional Expectation(ICE) 平均を取ると相殺しちゃう ので、インスタンスごとに 特徴量とモデルの予測値の 関係を見てみよう 参考:tidymodelsとDALEXによるtidyで解釈可能な機械学習 https://dropout009.hatenablog.com/entry/2019/11/17/112655

Slide 24

Slide 24 text

まとめ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

参考文献 • 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

Slide 27

Slide 27 text

Pythonが使えるエンジニア・データサイエンティスト大募集