Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

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

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

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

森下光之助

October 13, 2021
Tweet

More Decks by 森下光之助

Other Decks in Programming

Transcript

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

    メリット • 現実にある • デメリット • 理論的な関係がわからないこ とが多い • 設定を細かく調整できない シミュレーションデータ • データを自分で作る • メリット • 理論的な関係がわかっている • 設定を細かく調整できる • デメリット • 現実的ではない/あまり意味の ない設定になる可能性がある
  2. 分析手法例:Partial Dependence(PD) PD! 𝑥" = 𝔼 & 𝑓 𝑥" ,

    𝑿∖" = * & 𝑓 𝑥" , 𝒙∖" 𝑝 𝒙∖" 𝑑𝒙∖" 学習済みモデル ! 𝑓(𝑿)について、特徴量とモデルの予測値の関係を知り たい 線形モデルなら良いが、ブラックボックスモデルは特徴量と予測値の 関係が複雑なので、そのままだと解釈が難しい → いま興味のある特徴量𝑋! 以外は周辺化で消してしまうことで、関係 を単純化して解釈する
  3. シミュレーション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で変換
  4. 予測モデルの構築と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”を指定すると両方計算 される
  5. PDの理論的なふるまい ! 𝑓 𝑋( , 𝑋$ = 𝑋( + 𝑋$

    )のように、 モデルが理論的な関係を完全に学習できていたとすると、 PDは以下のようになるはず。。。が、実際はうまくいっていない なんで? PD! 𝑥! = 𝔼 & 𝑓 𝑥! , 𝑋" = 𝔼 𝑥! + 𝑋" # = " $ + 𝑥! PD" 𝑥" = 𝔼[ & 𝑓 𝑋! , 𝑥" ] = 𝔼 𝑋! + 𝑥" # = " # + 𝑥" #
  6. シミュレーション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()
  7. PDが交互作用を捉えられない原因 つまり、学習がうまくいっていても、交互作用が存在する場合、 PDはうまく特徴量とモデルの予測値の関係を捉えられない PD" 𝑥" = 𝔼 & 𝑓 𝑋!

    , 𝑥" , 𝑋# = 𝔼 𝑋! − 5𝑥" + 10𝑥" 𝑋# = 0 ! 𝑓 𝑋( , 𝑋$ , 𝑋) = 𝑋( − 5𝑋$ + 10𝑋$ 𝑋) のように、 モデルが理論的な関係を完全に学習できていたとしても、 Partial Dependenceは以下のようになるはず
  8. 参考文献 • 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