More Related Content
Similar to pymcとpystanでベイズ推定してみた話 (20)
pymcとpystanでベイズ推定してみた話
- 1. Copyright © 2019 Classi Corp. All Rights Reserved. 1
pymc3とpystanを比較してみた話
Classi株式会社 データAI部 小原
- 2. Copyright © 2019 Classi Corp. All Rights Reserved.
● 自己紹介
● pymc3/pystanを使おうと思ったきっかけ
● pymc3/pystanとは
○ 特徴
○ 使い方
○ 比較結果
● まとめ
アジェンダ
- 3. Copyright © 2019 Classi Corp. All Rights Reserved.3
◯ 高校への営業
◯ 学習支援アプリ開発
◯ 活用コンサルテーション
◯ プラットフォーム開発
◯ ネイティブアプリ開発
◯ 学校へのICT関連サポート
会社概要
ベネッセとソフトバンクのジョイントベンチャー
- 4. Copyright © 2019 Classi Corp. All Rights Reserved.
「Classi」は教育現場を支援する
クラウドサービス
• 国内No.1、全国の高校の
50%超が導入
• 利用者数83万人超
• 先生、生徒、保護者が繋がる
学習支援プラットフォーム
4
事業について
- 5. Copyright © 2019 Classi Corp. All Rights Reserved.
● 名前: 小原陽介(Twitter: @deerto_herajika)
● 所属: Classi株式会社 データAI部
○ 学校教育現場をICT活用で支援する会社です
● 職業: DataScientist
○ 元データ整備職人
○ 普段の業務
■ 学習データに関する分析・モデル開発/社内BI環境の構築/ etc
○ 使用している言語・ツール: Python(Jupyter Lab)/GCP/Tableau
■ 一昨年R→Pythonにチェンジしました
自己紹介
- 6. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3・pystanを触ろうと思ったきっかけ
● 業務でベイズ推定を行う必要が発生した
● 既存のパッケージでサクッと事後分布を取得したい
○ pymc3とpystanが良さそう
■ 両方試してみよう
● pymc3とpystanとは: MCMC法(マルコフ連鎖モンテカルロ法)を行うパッケージ
○ MCMC法: マルコフ連鎖に則りサンプリングを行うことで、解析的に解くことので
きない計算や分布を求める方法
- 7. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3の特徴
● 環境
○ python: >=3.5.4
○ Theano:>=3.3 and < 3.6
○ 3.6までは開発テスト済み
■ →3.5.4の環境で使用
● 使い方
○ with pm.model()でモデルを定義
し、確率分布を記述
- 8. Copyright © 2019 Classi Corp. All Rights Reserved.
pstanの特徴
● 環境
○ python: >=3.3
● 特徴
○ .stan(C++の確率的プログラミン
グ言語)でモデルを定義
○ 下記の3構造で構成される
■ data: 渡すデータ(dict)
■ parameters: 推定するパラ
メータ
■ model: モデル(確率分布)
- 9. Copyright © 2019 Classi Corp. All Rights Reserved.
使い方
● 流れ: モデルを記述→サンプリングを「iteration × chain」回実行→結果を取得
○ 推定結果のsummaryとplotが取得できる
summary
plot
- 10. Copyright © 2019 Classi Corp. All Rights Reserved.
使い方
● 「モデルを記述→サンプリング→結果を取得」の流れ
○ summary: 推定量のパラメータ毎に統計量が算出される
- 11. Copyright © 2019 Classi Corp. All Rights Reserved.
使い方
● 「モデルを記述→サンプリング→結果を取得」の流れ
○ summary: 推定量のパラメータ毎に統計量が算出される
平均・分散 収束結果
(r_hat < 1.1が目安)
- 12. Copyright © 2019 Classi Corp. All Rights Reserved.
使い方
● 「モデルを記述→サンプリング→結果を取得」の流れ
○ summary: 推定量のパラメータ毎に統計量が算出される
- 13. Copyright © 2019 Classi Corp. All Rights Reserved.
使い方
● 「モデルを記述→サンプリング→結果を取得」の流れ
○ summary: 推定量のパラメータ毎に統計量が算出される
カーネル密度推定結果
(色はchain)
サンプリング段階毎の
サンプル値
(ある近辺を蛇行してい
ればOK)
- 14. Copyright © 2019 Classi Corp. All Rights Reserved.
使用したシチュエーション
● 8つのカテゴリに所属する試行をN回行う
場合の確率を推定したい
● 事前情報も(後々)反映させたい
● データの確からしさも推定結果の表現に
入れたい
○ 下記のベイズモデリング
■ 尤度:多項分布
■ 事前/事後分布:ディリクレ分布
○ (まとめに繋がるが)そもそもMCMCす
る必要なかった。。。
ややこしい離散分布に関するまとめより
引用
- 15. Copyright © 2019 Classi Corp. All Rights Reserved.
使用したシチュエーション
● pymc3でMCMCの実行
○ pymc3の文法上、尤度(y)は 1
レコード文の尤度を記述する
● カテゴリ毎の確率を算出
○ 点推定ではなく、曖昧さを 定量
的に表現できる
- 16. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3とpystanの比較
● (社内データを出せないの
で)sklearn.datasets.load_wineに対し
て重回帰モデルを使って比較
● 相関の高い2つの変数を選択し、 下
記のモデルを定義
wine_dataのインポート
相関表
モデル式
- 17. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3とpystanの比較 ~pymc3~
カーネル密度推定結果 inputデータの定義
モデルの定義 説明変数の次元が2なのでshapeを入力
- 18. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3とpystanの比較 ~pystan~
データ・モデルの読み込み・サンプリング
モデルの定義(.stan)
カーネル密度推定結果
- 19. Copyright © 2019 Classi Corp. All Rights Reserved.
pymc3とpystanの比較
● 推定結果はだいたい同じ(ともに収束)
● pymc3の方が実行時間がかかったが、pythonっぽく書ける事はメリット
pymc3
pystan
- 20. Copyright © 2019 Classi Corp. All Rights Reserved.
まとめ
● pymc3とpystan(あくまで個人の感想です)
○ 実行スピード: pymc3 < pystan
○ 書きやすさ: pymc3 > pystan
○ ドキュメントの充実度: pymc3 < pystan
○ モデルの表現度: pymc3 < pystan (?)
■ pymc3で使っているtheanoの開発が終了しているのも気になるところ
● 業務のベイズ推定はそもそも解析的に解けるパターンだった
○ (ディリクレ分布 × 多項分布 = ディリクレ分布)
○ まずは解析的に解けるかどうか考える癖をつける
■ 解析的に解けない / 階層モデルを作る際に初めて選択肢に入れる
- 21. Copyright © 2019 Classi Corp. All Rights Reserved.
We are Hiring!
Classiでは一緒に働く仲間を募集しています
● Pythonエンジニア/データサイエンティスト/データエンジニア/…
● 詳細は採用ページにて https://hrmos.co/pages/classi