オーストラリアで勉強してきたMLデザイナーの口語自由詩

主に、データ分析・機械学習・ベイズ・統計について自由に書く。

Chapter 3 統計モデリングをはじめる前に 3.3〜3.5 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

3.3 背景知識の役割

背景知識を活用することで内部構造がブラックボックスな問題(逆問題: inverse problem)を解く手がかりとなる. 逆問題の回答は何通りもあり得, 答えが一意に定まらない問題は不良設定問題(ill-posed problem)と呼ぶ.

データを活用して解きたいビジネス問題の多くはこのようにメカニズムが不明なものが多いように思える. 例えば, 金融業界における株価の上下や広告のクリック率の増減など.

統計モデリングでは背景知識にもとづいた仮定をモデル式(数式)として表現し, 逆問題を解く手がかりとする. 真のモデル(正解)はわかりえないため仮定したモデルが「正しい」かではなく, そのモデルが

  • 解釈しやすいのか(複雑すぎず理解しやすいのか等)
  • 納得しやすいのか(背景知識と整合性が取れているのか等)
  • 予測がよいのか(未知のデータに対して予測がよいのか等)

という観点が重要.

3.4 モデルの記述方法

モデル式 は以下のような変数の式で表される.

Y[μ] ~ Normal(μ, 1) n = 1,…,20

Y[μ]は平均がμで標準偏差が1の正規分布から確率的に生成されたことを表す.

3.5 情報量基準使ったモデル選択

情報量基準 という指標を用いてモデルの評価をすることができる. 主に以下の4つが挙げられている. しかし, 本書の中ではこの指標を過信しないように敢えて情報量基準について触れない(らしい).

  • 予測のよさを表す
  • 真のモデルへの近さを表す

情報量基準については別途資料を参照したほうがよさそう.

特に以下の本を読む必要がありそう.

see: ベイズ統計の理論と方法

TODO

  • [ ] グラフィカルモデルについて別途説明

参考資料

Chapter 3 統計モデリングをはじめる前に 3.1〜3.2 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

3.1 データ解析の前準備

このあたりのデータ前処理(Data Preparation)のプロセスは一般的なものなので特に深入りしない. データの分布を可視化して確認する点は機械学習EDA(Exploratory Data Analysis)のプロセスでも重要とされているが, 多くの統計モデリングや確率的プログラミングの書籍やサイトでは特に可視化を重要視しているように思える.

  • データをとる前に
    • 背景知識の収集(Domain Knowledge)
    • 問題設定(Define Problem)
    • 解析計画(Plan)
  • データをとった後で
    • データの分布の確認(Visualisation)

個人的にはデータ解析のプロセスに関しては以下の本がわかりやすいと思う.

see: データ解析の実務プロセス入門

3.2 統計モデリングの手順

対象書籍内では複数のプログラミング言語が使用されているが, 本ブログでは一貫してPythonで実装・実行する想定.

  1. 解析の目的
  2. データの分布の確認
  3. カニズムの想像
    • イラストで考えをまとめる
  4. モデル式の記述
    • 数式に落とし込んでみる
  5. Rでシミュレーション
  6. Stanで実装
  7. 推定結果の解釈 + 図によるモデルのチェック

特に3と4のプロセスが統計モデリングでは重要らしい.

複雑なモデルだとMCMCが収束しないなどの問題が起こりやすいため, まずはシンプルなモデル式を使うこと.

追加プロセス

  • 再現性のチェック
  • データ解析のサイクル
    • 新しいデータを取得しモデルを改良する等のサイクルを回していくことで予測性能を上げていく

参考資料

Chapter 2 ベイズ推定の復習 2.4〜2.7 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

2.4 ベイズ推定とMCMC

伝統的な統計学の手法や最尤推定の問題を解決する一つの手法がベイズ推定(Bayesian inference)とマルコフ連鎖モンテカルロ法(MCMC).

ベイズ統計

  • パラメータを確率変数とみなして確率分布を推定する(伝統的な統計学の点推定と異なる)

 p(θ|Y) = \dfrac{p(Y|θ)p(θ)}{p(Y)}

  • p(θ|Y): 事後分布(posterior distribution)
  • p(θ): 事前分布(prior distribution)

分母の p(Y) は観測データに依存する定数のため, と比例の式に書き換えることができる. (そもそも p(Y) の計算は現実的に難しいらしい)

 p(θ|Y) \propto p(Y|θ)p(θ)

分母の p(Y) 抜きだと正規化されておらずトータルが1にならないため, 実際には確率とみなすことはできないが, p(Y|θ)p(θ) から乱数サンプルを生成して事後分布の代わりにできる, というのがMCMCの考え方らしい(なぜそれが問題ないかは別途資料を読む必要がありそう)

MCMC周りの理論的な説明は別途参考資料を読んだが方が良さそう.

MCMCアルゴリズム

  • メトロポリス・ヘイスティング法
  • ギブスサンプリング

  • 初期値を適当に決める

  • 現在のサンプルから次のMCMCサンプルを乱数生成し更新する(生成したサンプル列は chain と呼ぶ)
  • 最初の方のサンプルは初期値への依存が高いため除外する(除外する期間を warm upburn in と呼ぶ)
  • ある程度のサンプルを生成すると事後分布の形状が変わらなくなり収束する(確か定常分布に収束すると表現するはず)
  • (おまけ)収束しない場合には, まびく( thinning )と改善する場合がある

2.5 ベイズ信頼区間ベイズ予測区間

ベイズ信頼区間

  • 確率分布の幅を計算することで「事後分布を考慮して, 95%の確率でパラメータの値がa〜bの範囲に入る」という言い方が可能になり, これを ベイズ信頼区間 と呼ぶ( 信用区間確信区間 と呼ぶ場合もある)

このベイズ信頼区間は伝統的な統計学の信頼区間と本質的に異なるので注意!

ベイズ予測区間

別途記事にする予定.

2.6 最尤推定ベイズ推定の関係

別途記事にする予定.

2.7 事前分布の選び方

  • 選択肢1: 無情報事前分布(non-informative prior)を使う
    • 何も情報がない場合
  • 選択肢2: 弱情報事前分布(weakly informative prior)を使う
    • パラメータの値についてある程度の知識や経験がある場合(例: 人間の身長は0m〜3mの間 etc)
  • 選択肢3: 共役事前分布(conjugate prior)を使う
    • 過去, コンピュータの計算速度が遅い時に使われていた(計算が速い)

TODO

  • [ ] 予測区間について
  • [ ] MAP(事後確率最大推定値)について

参考資料

MCMC関連

Chapter 2 ベイズ推定の復習 2.1〜2.3 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

TL;DR

確率周りに関する基本事項についてカバーしている. 詳細に理解するには別途参考文献を参照した方が良い.

2.1 基本用語と記法

次のような内容が前提知識のようです. 基本的にはベイズ推定など確率周りの事柄を理解しておく必要がありそうです. あとは微分/積分をわかっていると捗りそう.

確率関連

  • 確率分布(probability distribution)
  • 確率質量関数(probability mass function: PMF
  • 確率密度関数(probability distribution function: PDF)
  • 同時分布(joint distribution)
  • 周辺化(marginalization)と周辺分布(marginal distribution)
  • 条件付き確率分布(conditional probability distribution)
  • 正規化

次の本がわかりやすい.

see: プログラミングのための確率統計

微分関連

微分を根本的に理解するには次の本がわかりやすい. あとは普通の数学の教科書を読めばよさそう.

see: 数学ガールの秘密ノート/微分を追いかけて see: 数学ガールの秘密ノート/積分を見つめて

線形台数関連

  • ベクトルと行列(の意味が簡単にわかること)

前述の プログラミングのための確率統計 と同じ著者のため良書っぽい.

see: プログラミングのための線形代数

2.2 伝統的な統計学の問題点

  • 検定の解釈が直感的でない
    • 人づてに聞いた噂では, 最近はp値を論文に含めただけでrejectされるらしい.
  • 信頼区間の解釈が直感的でない
  • 複雑なモデルにおいて信頼区間と予測区間の算出が難しい
    • 基本的には最尤推定などで点推定するしかない

2.3 尤度と最尤推定

尤度最尤推定 については次の書籍がわかりやすい.

see: データ解析のための統計モデリング入門

尤度(likelihood)

ある観測データとある確率分布との当てはまりの良さを示す指標が尤度(likelihood)と呼ばれる.

最尤推定(maximum likelihood estimation)

確率分布のパラメータがわからない際に, そのパラメータを増減させて尤度が最大となった点を推定パラメータとする方法.

対数尤度(log likelihood)

コンピュータで処理する時に都合がよいので対数化する.

  • 掛け算 -> 足し算
  • 小さい値 -> 扱いやすい大きさの値

最尤推定の問題点

  • 過学習しやすくなる
    • 既知のデータに過剰適合し, 未知のデータに対する予測能力(汎化性能)が低下する
  • 最尤推定の実際の計算が難しくなる
    • 局所最適化しやすい

参考資料

Chapter 1 統計モデリングとStanの概要 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

1.1 統計モデリングとは

以前、「はじめに」でも触れた統計モデリングについてまとめてみます.

統計モデリングとは確率分布を取り入れたモデルをデータに当てはめて理解と予測をすることです.

整理すると, 確率分布を数理モデルに取り入れたモデルを 確率モデル と呼び, その確率モデルをデータに当てはめて理解と予測をすることを 統計モデリング と呼ぶようです.

このモデルにはパラメータがあり, その未知の値を推定することができれば, ある現象の理解と予測を行うことができる, というのが統計モデリングのコアの考えです.

例えば, 以前触れた人の歩幅と距離の例でいえば, 歩幅が平均1mに対して一歩一歩が±どの程度の誤差が起きるかというのもパラメータといえそうです. ある人は±30cmでずれるかもしれませんし, ある人は±5cmかもしれません. この誤差のパラメータも結果的に何mの距離を歩けたかという観測データを見れば推定できそうです.

1.2 統計モデリングの目的

統計モデリングの目的は主に2つあります.

  • 解釈: 現象をの理由や仕組みがわかること, 解釈できること
  • 予測: 過去のデータから未来の振る舞いを予測すること

また, 機械学習と古典的な統計分析と比較して場合の統計モデリングの特徴です.

  • 機械学習
    • 解釈: △/✕
    • 予測: ◯
  • 古典的な統計分析
    • 解釈: ◯
    • 予測: ✕
  • 統計モデリング
    • 解釈: ◯
    • 予測: ◯

とりあえず, 「統計モデリング最強」みたいな感じです(`・ω・´)

1.3 確率的プラグラミング言語

確率モデルのパラメータ推定の大変さとして主に以下の2つがありました.

  • 難解な数式を実装するのでバグりやすい
  • モデルが変わるたびにコードを修正しないといけない

これらの問題を解決するのが 確率プログラミング言語 で, Stanもその言語のうちの一つです.

1.4 なぜStanなのか?

確率プログラミング言語の主流としては, 以下の2つがありました.

そこでStanの登場.

  • Stan
    • 2012年ころからgithubで開発開始
    • R_Python_Matlabのインターフェースがある
    • エラーメッセージがわかりやすい
    • ドキュメントが充実
    • さまざまなパラメータ推定のアルゴリズムが使える
      • NUTS: MCMCというサンプリングアルゴリズムの一種のHamiltonian Monte Carloの一実装
      • ADVI: 変分ベイズ法の一実装. NUTSより50倍速いケースがあるらしい

1.5 なぜRStanなのか?

Rは可視化やデータ加工が得意なのでいろいろ捗るらしい(`・ω・´)

参考資料

統計モデリング - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

はじめに

この本はStan(スタン)というソフトウェアとそのR用のパッケージであるRStan(アールスタン)を使って, 統計モデリングを習得する本である

イントロで書籍の目的や内容や流れ, 前提知識や対象読者が記載されていたいりするので意外と大事です. まず上記の冒頭の「何について書かれた本か?」を読んでいきます.

以下の単語について明確にしていきます. なんとなくわかったつもりになっていることも多いので, できるだけ see: [参考資料のリンク] で参考資料も調べて記載するようにします.

統計モデリングとは

それでは以上のようなソフトウェアを用いて実施する 統計モデリング とはなんでしょうか.

統計モデリングとは確率分布を使った数理モデルをデータにあてはめて現象の理解と予測を促す営みだ.

確率分布 を使って 数理モデル をデータにあてはめて現象の理解と予測をすることということなので, 次の単語を整理してみます.

確率分布

確率分布(かくりつぶんぷ, 英: probability distribution)は、確率変数の各々の値に対して、その起こりやすさを記述するものである。

see: 確率分布 - Wikipedia

Wikipediaの例によると, 例えばサイコロ2個を振ったときの出目の和は 確率変数 で, 以下のような確率の分布を 確率分布 と呼びます.

f:id:yukinagae:20181102120153p:plain

サイコロ1個の出目の範囲は1から6のため, サイコロ2個を振ったときの出目の和は2から12の範囲になります. ここで重要なのは, サイコロ2個の出目の和という確率変数があった際に, 2から12のうちどの値になりやすいかは異なるという点です.

上記の例では, (単に組み合わせが多いため)7の値になりやすいことがわかります. 一方, 2もしくは12は最も確率的に低い値となります. しかし, 思考実験として両方のサイコロが歪んでいて小さい目が出やすい場合には, 2から6の値になりやすく, 一方8〜12の値にはなりづらくなるため確率分布が変化します.

このようにある値や事柄が起きやすいかどうかの確率を確率分布と呼びます.

f:id:yukinagae:20181102120017j:plain

補足ですが, 確率については以下の本がわかりやすいです.

see: プログラミングのための確率統計

数理モデル

そもそも 数理モデル という言葉が聞き慣れないため, やっぱりWikipediaを見てみます.

数理モデルは、特に数学によって記述されたモデルのことである。モデルという言葉に含意されているように、対象とのズレ(特に近似や抽象化)が意識されていることが多い。モデルの正当性が実験や観察などによって裏付けられ、非常にうまく行っている事が確かめられている場合は「理論」と呼ばれるようになることもある。

簡単な例.

「A君が歩けば歩くほど前に進む。歩幅が広いほど前に進む。」という現象を
(距離)=(歩幅)×(歩数)
という数式で表せば、これは数理モデルである。

see: 数理モデル - Wikipedi[f:id:yukinagae:20181102120153p:plain]a

とりあえず y = ax + b のように何らかの数式で事象を表現することを数理モデルと呼ぶようです.

つまり

統計モデリングとは, 確率分布 (というある値や事柄が起きやすいかという分布の情報)を使って 数理モデル (という数式を使って事象を説明するモデリング)をデータにあてはめて現象の理解と予測をすることと説明できます.

つまり, 先程の数理モデルの例では, (距離)=(歩幅)×(歩数) という概念的な数式がありましたが, これに 確率分布 を取り入れると統計モデリングとなりそうです.

例えば, 人間が歩く場合常に一定の歩幅で歩くことは難しいため, ある程度の±の誤差が生まれます これを歩幅の大きさが確率的に変動すると捉えると, 結果的に距離も確率的に変動しますと捉えることができそうです.

  • 数理的なモデル: (距離)=(歩幅)×(歩数)
  • 確率的なモデル: (距離がどれくらいになりそうか)=(歩幅の大きさがどれくらいになりそうか)×(歩数)

f:id:yukinagae:20181102120206j:plain

「じゃあ具体的にどういうこと?」という点がまだ気になってきますが, まずは概要を理解したところで次を読み進めます.

参考資料

Stan/R - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

はじめに

この本はStan(スタン)というソフトウェアとそのR用のパッケージであるRStan(アールスタン)を使って, 統計モデリングを習得する本である

イントロで書籍の目的や内容や流れ, 前提知識や対象読者が記載されていたいりするので意外と大事です. まず上記の冒頭の「何について書かれた本か?」を読んでいきます.

以下の単語について明確にしていきます. なんとなくわかったつもりになっていることも多いので, できるだけ see: [参考資料のリンク] で参考資料も調べて記載するようにします.

Stan / R / RStan

Stan - Stan は, 統計モデリングのためのプログラミング言語・ソフトウェアです(統計モデリングについては後述)

see: Stan - Stan
see: Stan - About

R: The R Project for Statistical Computing という検索しづらい名前のプログラミング言語・ソフトウェアは, 主に統計や分析で用いられます. pythonでも同様なことが可能なことが多いですが, 手軽に可視化したり, 統計値を簡単に算出したり, 分析の試行錯誤する場合にはRが適役のように思います.

see: R: The R Project for Statistical Computing
see: Rによるやさしい統計学

Rユーザはざっくり100万人はいるらしいですが, そのようなユーザに使ってもらうためにStanは RStan というインターフェースが用意されており, Rから容易にStanのコードが実行できるようです.

see: How many people use R? - Quora

またRだけでなく次のように様々なプログラミング言語のインターフェースが提供されています. 新しいところでは The Julia Language というプログラミング言語にも対応しているようです.

see: Stan - Interfaces

参考資料