まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

ggpointdensityでgeom_pointの重なっている部分をヒートマップで表現する

表題通り。基本的にはドキュメントレベルしかしてないのでただのメモ。

github.com

ggpointdensityの特徴

散布図を作図するgeom_poin()では点が重なっている場合どれくらい重なっているかわからなかった。

対応策として、geom_density2d()や、geom_bin2d()が開発されたが 可視化表現が点である散布図ではなくなっている

つまり、個々の点そのものがどこにあるのか?という情報が要約されていてわからない(なんとなくの傾向はわかるが)。この解決策として、通常のgeom_point()に密度の色を塗ったようなggpointdensityができた。

f:id:chito_ng:20190901173506p:plain [ドキュメントの図]

実践

adjustオプションで割り当てられる色を変更できる模様。デフォルトの範囲は(重なり数の最小値 ~ 重なり数の最大値)なので最大範囲を何倍するかを指定できる模様。

library(ggplot2)
library(dplyr)
library(viridis)
library(ggpointdensity)
library(patchwork)

dat <- bind_rows(
  tibble(x = rnorm(7000, sd = 1),
         y = rnorm(7000, sd = 10),
         group = "foo"),
  tibble(x = rnorm(3000, mean = 1, sd = .5),
         y = rnorm(3000, mean = 7, sd = 5),
         group = "bar"))

g1 = ggplot(data = dat, mapping = aes(x = x, y = y)) +
  geom_pointdensity() +
  scale_color_viridis() # adjust = 1.0

g2 = ggplot(data = dat, mapping = aes(x = x, y = y)) +
  geom_pointdensity(adjust = 2.0) +
  scale_color_viridis()

g3 = ggplot(data = dat, mapping = aes(x = x, y = y)) +
  geom_pointdensity(adjust = 0.5) +
  scale_color_viridis()

g1 | g2 | g3

f:id:chito_ng:20190901174455p:plain

注意点

表示範囲指定をするときに、xlim()ylim()を使うと通常の場合と同様に、範囲外の点が除外される。
除外されることで、色が 範囲内での重なり数最大値 になるのでcoord_cartesian(xlim = ..., ylim = ...)で拡大した方が、範囲外の重なり数も加味した色になるのでベター。

おまけ

上記コード(ドキュメントのサンプルコードを少しいじったもの)で使っているviridisパッケージは、視認性の高いカラーパレットを提供するパッケージのうちのひとつとのこと。

cran.r-project.org

DIDと傾向スコアを用いた手法の使い分け

なにを書くか

岩波DS vol.3(因果推論)のp.91で傾向スコアを用いて「スマホアプリ利用時間」に対する「CM接触効果」を調べるようなデータについて。本文中では、傾向スコア(Propensity Score)を用いて平均CM接触効果(ATE)を測っているが、これはCM施策前後の比較としてDID(Difference In Difference)でもできるのでは?と考えて調べました。

岩波データサイエンス Vol.3

岩波データサイエンス Vol.3

github.com

では、そもそも どういうときに傾向スコアを用いて、どういうときにDIDを使うのか? という疑問がわいたので、主に使い分けについて記載します。

なお、各手法の概要は以前書いた以下を参照。

knknkn.hatenablog.com

knknkn.hatenablog.com

結論

それぞれ使用するにあたり 前提として置く仮定に必要となる共変量の性質が違う ため、利用可能な共変量に従って使う。
ただし、DID・傾向スコアどちらも使用ができる場合は、DIDでは固定効果によるバイアスを無視できるのでDIDを使う。

それぞれの前提となる仮定

DID

DIDに置いている仮定として、 「共通ショック仮定(common shocks assumption)」と「平行トレンド(Common trend assumption)仮定」 がある。

また、基本的なことだが、 施策前と後の2時点の目的変数が必要

以下、説明のためにTJOさんのブログから画像をお借りする。

統計的因果推論(1): 差分の差分法(Difference-in-Differences)をRで回してみる - 六本木で働くデータサイエンティストのブログ

f:id:chito_ng:20190828074451p:plain

共通ショック仮定

効果を見たい施策以外に、t_0t_1の間で目的変数に影響を与えるイベントがなかった、あるいは介入群と対照群に全く同じ影響があった、という仮定。

平行トレンド

介入群に介入が行われなかった場合、対照群と同じ推移をする、という仮定(反実仮想)。

施策を受けなかったならば(C-D)と全く同じ振る舞いをするという仮定を置くことで、 実際観測できない(A-E)を計算することができる

2群の間に平行トレンドがない場合は、 目的変数に影響を与えるが 2群で与える影響が違う共変量を用いる ことで統制をおこない、平行トレンドとなるように調整をおこなう。

介入群と対照群について

この推定は介入群の点Aから、平行トレンドの(C-D)を用いることで介入群の点Eを推定している。そのため、介入群自体の異なる時点のデータをベースにしており、対照群は平行トレンド部分のみを利用する。

つまり、施策前の介入群から施策後の介入群を推定している。同じ群を用いているので、次に紹介する傾向スコアと違い、介入群と対照群に属する人の性質の分布の違いを気にする必要はない。

傾向スコア

あえて先程と同じ図を用いる。下図でいうところ、時点t_1のみが必要で介入群の点Bと、介入群が仮に介入を受けなかった場合の点Eを比較することで効果をみたい。
f:id:chito_ng:20190828074451p:plain

ただし、当たり前だが点Eは実際に観測することができない。そのため、介入を受けていない対象群の点Dを使いたい。

しかし、RCTではない多くの場合は介入を受けるかどうかの割当は属性で偏りがあるので、介入群と対照群で所属する人の属性分布が違うので (B - E) ≠ (B - D)となる。
言い方を変えると、所属する人の属性分布が同じであるならば(B - E) = (B - D)となる。そのため、介入群と対照群が同じ分布となるように 介入を受けるかどうかに関係がある共変量を用いて 統制をおこなう。

このとき、IPW(Inverse Probability Weighting)推定やDR(Doubly Robust)推定においては、施策群に割り当てられるかを確率で表すことで、共変量をひとまとめにした傾向スコアを用いることで調整をおこなっている。

また、傾向スコアに置いている仮定として、"strong ignorability"の仮定がある。
これは 「どちらの群に割り当てられるかは観測された共変量にのみ依存し、目的変数の値とは無関係(共変量を条件付けると目的変数と割当は独立)」 という仮定。

介入群と対照群について

この推定は対照群の点Dを用いて介入群の点Eを推定している。

つまり、推定において別の群を用いているので、DIDと違い、介入群と対照群に属する人の性質の分布の違いを気にする必要がある。

DIDと傾向スコアで必要となる共変量がどう違うか

傾向スコアを用いた手法は、strong ignorabilityの仮定を満たすための 介入を受けるかどうかの割当を調整するための共変量 が必要になり、この共変量を用いた傾向スコアを用いることで 割り当てを統制する

DIDの場合は、平行トレンド仮定を満たすために 目的変数に影響を与えるが、2群で与える影響が違う共変量 が必要になり、この共変量で トレンドを統制する

このように、仮定を満たすのに必要となる共変量が異なっているので使える共変量によって手法を使い分ける。

どちらとも使える場合はどうするか

一般的に、「介入を受けるかどうかの割当を調整するための共変量」にも「目的変数に影響を与えるが、2群で与える影響が違う共変量」にもなる、各サンプル固有の時間不変の 固定効果 がある(例:地域性や個人の能力など)。

ただし、この固定効果は定量的な観測が不可能な性質を持つ。

knknkn.hatenablog.com

そして、観測が不可能ということはそれぞれの共変量に入れることができないのでバイアスが生じる。
・・・が、DIDの場合、差を用いるため時間不変の固定効果の影響を消すことができるためバイアスが生じない。

つまり、固定効果によってDIDではバイアスが生じないが、傾向スコアを用いた手法ではバイアスが生じる。
そのため、DID・傾向スコアを用いた手法どちらとも使える場合はDIDを用いた方が推定精度がよくなる。

おまけ。傾向スコアを用いる場合のIPW定量とDR推定量の違い

傾向スコア自体の推定精度が低いとIPW定量の推定精度も悪くなる。また、IPW定量は傾向スコアを推定した後の目的変数の周辺分布の母数推定に際して、対照群のデータの共変量の情報を用いていないため、データから得られる情報の一部を無駄にしている。

これらの欠点を改善したのがDR推定量。なにがDoblyでRobustなのかというと、

  • 傾向スコアの確率を求める式
  • 共変量を用いて目的変数を説明する回帰式

このどちらかが誤っていてもバイアスのない推定ができる、という意味でDoblyでRobust。そのため、傾向スコアを用いる場合は常にIPW推定ではなくDR推定をおこなう。

その他

傾向スコア関係のRパッケージの使用例。

調査観察データにおける因果推論(3) - Rによる傾向スコア,IPW推定量,二重にロバストな推定量の算出 - About connecting the dots.

参考

調査観察データにおける因果推論(1) - 無作為割り当てされていないことの問題 - About connecting the dots.

調査観察データにおける因果推論(2) - 傾向スコアとIPW推定量,二重にロバストな推定量 - About connecting the dots.

因果効果の推定!Rで実践 - 傾向スコア,マッチング,IPW推定量 - - Data Science by R and Python

www.slideshare.net

差分の差分分析(Difference-in-differences design) – 医療政策学×医療経済学

プロペンシティスコア(Propensity score; PS)(2)-PSに関する5つの誤解 – 医療政策学×医療経済学

facet_gridで1軸に複数要素を指定する

めちゃくちゃしょうもない小ネタですが、以下のようにfacet_gridで軸列を指定するときに+を使うと複数指定が可能になる模様。

facet_grid(. ~ c(color, cut))とかで複数要素指定できるんかなー → できないやんけ!と思ってたら。。。。

library(tidyverse)

diamonds %>% 
  filter(color %in% c('E','I','J')) %>% 
  filter(cut %in% c('Ideal','Good')) %>% 
  ggplot(aes(x=carat, y=price)) +
  geom_point() + 
  facet_grid(. ~ color + cut)

f:id:chito_ng:20190827164129p:plain

ggforce::facet_matrixを用いてfacet_grid(c(A,B,C) ~ c(D,E))的な表現を実現する

以下のツイートを見かけたので試してみた記事。

ドキュメント的にはこれ。

https://cran.r-project.org/web/packages/ggforce/ggforce.pdf

使い方

ドキュメントのサンプルコードを使う。まずは基本的なやつ。

library(ggforce)
library(tidyverse)

# Standard use:
ggplot(mpg) +
  geom_point(aes(x = .panel_x, y = .panel_y)) +
  facet_matrix(vars(displ, cty, hwy))

f:id:chito_ng:20190812203928p:plain

facet_matrixを使うときは、aesaes(x = .panel_x, y = .panel_y)にしておく。
panel_x,panel_yが後のfacet_matrixで指定した列となる。

通常、facet_matrix(rows = vars(hoge,fuga), cols = vars(piyo))のように、.panel_xrowsで指定した列.panel_ycolsで指定した列が入ったfacetが作られる。

上記サンプルのfacet_matrix(vars(displ, cty, hwy))のように、rows, colsを指定しないと暗黙的にrows = vars(displ, cty, hwy)になるようだ。また、デフォルトではcols = rowsなので上記サンプルではx,y軸ともにdispl, cty, hwy列のfacetとなる。

以下のようなコードの方がわかりやすいかも。

ggplot(mpg) +
  geom_point(aes(x = .panel_x, y = .panel_y)) +
  facet_matrix(rows = vars(cty, hwy), cols = vars(model, drv, fl))

f:id:chito_ng:20190812205036p:plain

facet_matrixを使わない場合

facet_matrixを使わないときはツイート主の言うように、tidyr::gatherを使わないといけなかった。
サンプルコードにあった以下のコードで考える。

# Make asymmetric grid
ggplot(mpg) +
  geom_boxplot(aes(x = .panel_x, y = .panel_y, group = .panel_x)) +
  facet_matrix(rows = vars(cty, hwy), cols = vars(drv, fl))

f:id:chito_ng:20190812205251p:plain

facet_matrixを使わない場合、個々に各組み合わせを作る

# 個々を作る(facet_matrix図の左上)
mpg %>%
  select(drv, cty) %>%
  ggplot(aes(drv, cty)) +
  geom_boxplot()

f:id:chito_ng:20190812205410p:plain

または、tidyr::gatherで作る。ただし、こちらの場合x軸かy軸の片方は1列となる。

# gather使う(facet_matrix図の1行目のみ)
mpg %>%
  select(drv, fl, cty) %>%
  gather(key = type, value = value, -cty) %>% 
  ggplot(aes(value, cty)) +
  geom_boxplot() +
  facet_grid(. ~ type)

f:id:chito_ng:20190812205657p:plain

媒介分析で因果効果の内訳を考える

因果媒介分析とは

概要

因果効果の内訳を考えるための手法として、因果媒介分析(Causal Mediation Analysis)というものがある。
これによって、A→Yという因果関係(Whether:AはYに効果があるのか?)だけでなく、AによってM1, M2, ...という事象が起きた結果Yに影響した、という内訳(Why/How:Aをしたら何故/どうやってYに効果があるか?)について考えることができる。

より具体的に書くと「ジムに入会する(A)ことで体脂肪率(Y)が変化したが、それは運動量が変化した(M1)からなのか、健康意識が変化した(M2)からなのか、食事習慣が変化したから(M3)なのか」「Aの効果の内、M1,M2,M3がそれぞれどれくらいの内訳で効果があったか’」という疑問に答えることができる。

これは、体脂肪率 = α 運動量 + β 健康意識スコア + γ 食習慣 のように、体脂肪と運動量の直接的な関係性を見るのではなく、ジムに入会することで生じた運動量の変化という、運動量に関して因果の内訳にのみ着目した効果を観測することができる(健康意識などに関しても同様)。

f:id:chito_ng:20190812143708p:plain

Uberでは、施策による仮説や効果の検証などに使われている模様。

Mediation Modeling at Uber: Understanding Why Product Changes Work (and Don’t Work)

因果媒介分析の手法

因果媒介分析にはいくつか手法があるが、基本的に以下の図で考える。

f:id:chito_ng:20190812151625p:plain

ジム入会における、体脂肪率への影響の内訳を考える。

図にある「運動量変化」をDirect Effect(間接効果)、「運動量変化以外の効果(健康意識の変化や、食習慣の変化などまとまたもの)」をDirect Effect(直接効果)と呼ぶ。つまり、ジム入会における体脂肪率への全影響量をTotal Effectとすると、 Total Effect = Direct Effect + Indirect Effect となる。

なお、以下では数式のAを「ジム入会」、Yを「体脂肪率」、Mを「運動量」とする。また、簡略化のため交絡Cは図、式からいったん省略する。

Difference Method

シンプルな手法。

まず、以下からTotal Effectを推定する。 f:id:chito_ng:20190812152541p:plain

Y = \alpha_0 A

このときの\alpha_0がジム入会(A)に対する全効果、つまりTotal Effectとなる。

次に以下を考える。 f:id:chito_ng:20190812151625p:plain

 Y = \alpha_1 A + \beta_1 M

このときの\beta_1は「運動量(M)」の効果となりIndirect Effectとなる。
\alpha_1は、「運動量(M)」を追加したときのジム入会(A)の、媒介変数を経由しない効果。つまり、\alpha_1はDirect Effectになる。

 Total Effect = Direct Effect + Indirect Effectより、 \alpha_0 =  \alpha_1 + \beta_1となる。
このことから、Indirect Effect  \beta_1 = \alpha_0 - \alpha_1で計算することができる。

ただし、このやり方は「ジム入会(A)」と「運動量(M)」の間に交互作用がある場合(例えば、ジム入会の有無で、体脂肪に対する運動量あたりの効果が変わるとき)は下図の式が交互作用部分を表す項を追加した Y = \alpha_1 A + \beta_1 M + \gamma_1 AMとなるので解析的にDirect Effect, Indirect Effectを求めることができなくなる。

また、下図のように「ジム入会(A)」と「体脂肪率(Y)」への交絡CはRCT(ランダム化比較実験)などによってコントロールすることができるので問題はない。一方で、「体脂肪率(Y)」と「運動量(M)」に交絡(U)がある場合は係数が正しく推定ができない。しかし、RCTなどを使おうが媒介変数Mはランダムに割り付けることはできないので一般的には交絡が生じていると考えられるし、仮にランダムに割り付けがされていても選択バイアスが生じるためどちらにせよ推定量にバイアスがかかることになる。

f:id:chito_ng:20190812160731p:plain

つまり、Difference Methodを用いた因果媒介分析は、「AとMの交互作用がない」「YとMに交絡がない」「Mの選択バイアスが微小」、更に言えば説明をはしょったが「A,MとYに線形関係がある」「Yがカテゴリカル変数ではない」という強い仮定を置いている

Baron-Kenny Method

以下の式で表す媒介分析の手法。  Y = \alpha_0 A + \beta_0 M
 M = \alpha_1 A

これらから、
 Direct Effect =  \alpha_0
 Indirect Effect =  \alpha_0 \alpha_1

で求めることができる。ただし、この手法もDifference Methodと同様の問題が生じる。

Counterfactual-based Mediation

先程までと違い、反事実(Counterfactual)モデルを考えることでDirect/Indirect Effectを考える。

CDE(Controll Direct Effect)

YをY_{AM}で表す。例えば、Y_{1m}は、A=1(入会),M=mのときのYを示す。
このとき、 CDE(m) = Y_{1m} - Y_{0m}という概念を考える。

これは、運動量Mをある値に固定した上で入会した場合(A=1)と、入会してない場合(A=0)を比較している。つまり、運動量M以外の要素での差(=Direct Effect)はどうなるのか?ということがわかる。

当たり前だが交互作用がある場合はmによってCDE(m)の値は変わる。この性質からCDEは運動量をmに固定するような介入をするとAのM以外の効果はどうなるか という用途で使うことができる。

なお、Indirect Effectは見ることができない(用途的にはどうでもいいが)。

仮定

仮定としては以下の2つが必要で、RCTなどで対応可能。 -1. 共変量Cを与えると、未測定のA, Mへの交絡がない -2. 共変量Cを与えると、、未測定のA, Yにの交絡がない

Natural Direct Effect / Natural Indirect Effect

MをM_aで表す。例えば、M_1は、A=1(入会)のときのMを示す。
そのため、YはY_{AM_a}で表す。例えば、Y_{1M_0}は、A=0(非入会)のときのMを与えたときの、A=1(入会)のときのYを示す。
なお、交互作用がない場合はM_0M_1は一致する。

このとき、Direct Effect(Natural Direct Effect)とIndirect Effect(Natural Indirect Effect)はそれぞれ以下の式で示すことができる。

NDE = Y_{1M_0} -  Y_{0M_0}
NIE = Y_{1M_1} -  Y_{1M_0}

NDEは媒介変数MをM_0に固定した上でのAの変化による効果差(入会/非入会の差)を表している。
何故M_0に固定するかというと、Direct EffectはA=1での効果を知りたいのでA=0からA=1に変えたときのMを介さないAの効果を知りたい。そのため、Aを動かした中でのMの変化を除外した、Direct部分のNaturalな変化のみを捉えるために、M_0に固定した上でのAの変化を見ている。

NIEは媒介変数A=1に固定した上でのMの変化による効果差(入会/非入会の差)を表している。
何故Aを1に固定するかというと、Inirect EffectはDirect Effect以外、つまり媒介部分Mだけの効果差を知りたいのでM_0からM_1に変えたときのAが1のときの効果を知りたい。そのため、Direct Effectを固定するためにAを1に固定した上でのMのNaturalな変化のみを見ている。

なお、このときも Total Effect = NDE(Direct Effect) + NIE(Indirect Effect)で表せれるので、冒頭にあるような「入会の効果の内訳のうち運動量はどれくらいか?」という問に答えることができる。

このときのDirect Effect, Indirect Effectは 交互作用の有無や線形性、Yが非カテゴリカル変数の仮定は置かなくても良い
しかし、 Y_{1M_0},  Y_{0M_0}, Y_{1M_1}, Y_{1M_0} を推定するためにはIdentifiability Assumption(識別可能性の仮定)を必要とする。

Identifiability Assumption

NDE, NIEのためのは以下の4つの条件が必要となる。

  1. 共変量Cを与えると、未測定のA, Mへの交絡がない
  2. 共変量Cを与えると、未測定のA, Yへの交絡がない
  3. 共変量CとAを与えると、未測定のM, Yへの交絡Uがない
  4. Aの影響を受ける、未測定のY, Mへの交絡Lがない

1,2はRCTなどで対応可能。仮定3,4は前述のDifference Method, Baron-Kenny Methodと同様にRCTなどを使おうが媒介変数Mはランダムに割り付けることはできないので一般的には交絡が生じていると考えられるし、仮にランダムに割り付けがされていても選択バイアスが生じるためどちらにせよ推定量にバイアスがかかることになる。

そのため感度分析を用いてどの程度仮定違反でバイアスが出ているか確認する必要性がある。

未測定のM, Yへの交絡Uがある例 f:id:chito_ng:20190812175144p:plain

Aの影響を受ける、未測定のY, Mへの交絡Lがある例 f:id:chito_ng:20190812175237p:plain

NDE, NIE, CDEの解析

上記を満たしていて、以下の線形モデルが成立する場合。

 E(Y | A = a, M = m, C = c) = \alpha_0 + \alpha_1 a + \alpha_2 m + \alpha_3 am + \alpha_4 c
 E(M | A = a, C = c) = \beta_0 + \beta_1 a + \beta_2 c

NDE, NIE, CDEは以下で解析的に求まる。

 NDE = \alpha_1 + \alpha_3 (\beta_0 + \beta_2 E(C)
 NIE = (\alpha_2 + \alpha_3 ) \beta_1
 \alpha_1 + \alpha_3 m

これはBaron-Kenny Methodと見比べるとBaron-Kenny Methodの拡張となっていることがわかる。

なお、Rでは以下のパッケージに実装されている)。
Causal Mediation Analysis Using R

mediation: R Package for Causal Mediation Analysis

参考

今回以下の記事を参考にしました。というか、krskさんの記事(上2つ)を自分なりに解釈し直したり他の見て自己補完した感じです。

因果効果のメカニズムを検討する:媒介分析(Causal Mediation Analysis)入門①~既存の手法の問題点~ - Unboundedly

因果効果のメカニズムを検討する:媒介分析(Causal Mediation Analysis)入門②~反事実モデルに基づく媒介効果の定義~ - Unboundedly

直接効果・間接効果の推定および未測定の交絡に対する感度解析

Causal Mediation Analysis(因果媒介分析)④:媒介因子が2つある場合|ドクターキッド(Dr.KID)

Causal Mediation | Columbia University Mailman School of Public Health

Unpacking the Black Box of Causality: Learning about Causal Mechanisms from Experimental and Observational Studies

A General Approach to Causal Mediation Analysis

Causal Inference Book

ランダムフォレストについて改めて要点をまとめる

概要

ランダムフォレストは何が理解の要点なのかを中心として自分用に改めてまとめる。
各見出しで参考にしたリンクを都度記載しているので数式などはそちらを見てください。

まず、ランダムフォレストについて一言で説明すると、「決定木モデルに対してアンサンブル学習をおこなったもの」である。

決定木モデルによる予測は、バイアスは小さいがバリアンスは大きくなる。
このひとつひとつの木を複数組み合わせる、つまりアンサンブル学習をさせることでバイアスは小さいままバリアンスも小さくするという試みがランダムフォレスト。

・・・と書くことはできるが、上記で出てきたそれぞれの用語についていったん解説した上で、改めて上記文言を考える。

決定木とは

「データに対してどの項目値で分割をすると目的変数の不純度が下がるか?」という基準でデータをひたすら分割していく手法。不純度はジニ係数エントロピーで計算されることが多い。

「これ以上分割ができない」状態まで分割をしていくと、学習させたデータに対してオーバーフィッティング、つまりバイアスは小さくなるが、バリアンスが大きくなる。そのため、汎化性能を上げるにはある一定基準で分割をやめる必要がある。

複雑になりがちな決定木を汎用的に変身!剪定の考え方について - Np-Urのデータ分析教室

バイアスとバリアンス

決定木の説明で出た「バイアス」と「バリアンス」について。

機械学習では「観測値と予測値の差(=誤差)を小さくする」ことを目的にしている。この誤差は バイアス + バリアンス + ノイズ に分解できる。

バイアスは、観測値とモデルの予測値の平均的なズレを指す。要するに「どれだけモデルがデータにフィットしているか」
これはモデルを複雑にして表現力を増やせば増やすほど減少する。つまり、モデルに由来するズレのことを指す。

バリアンスは、サンプルデータによってどれくらいモデルが変化するか(モデルの分散)を指す。つまり、データに由来するズレ。これが大きい状態をいわゆる「オーバーフィッティング」といい、その学習データに対して過剰にフィットしたモデルなので汎化性能が低い。

ノイズはその母集団特有のゆらぎのため、変化させることはできない。

1つの学習器では、バリアンスとバイアスはトレードオフの関係になっており、片方を小さくすると片方が大きくなる。

バイアスとバリアンスを理解する - Qiita

【機械学習】バイアスとバリアンスの違いを分かりやすく | pekochin

バイアス-バリアンス分解:機械学習の性能評価 - HELLO CYBERNETICS

アンサンブル学習とは

アンサンブル学習とは、学習器を組み合わせることで予測性能を向上させる試みを指す。
アンサンブル学習にはいくつかの手法があり、主に「バギング」「ブースティング」「スタッキング」の3つに分かれる。ランダムフォレストはこの中の「バギング」を応用したものが使われる。

機械学習上級者は皆使ってる?!アンサンブル学習の仕組みと3つの種類について解説します

pythonでランダムフォレストとアンサンブル学習まとめ - Qiita

【入門】アンサンブル学習の代表的な2つの手法とアルゴリズム | SPJ

バギング

Bootstrap Aggregatingの略で、ブートストラップ法を用いることである母集団に対して、複数の標本集団を作成し、それぞれの標本集団に対して学習したモデルを作成し、目的変数が不連続値なら多数決、連続地なら平均などの代表値を最終的な予測結果として採用する。

多数のモデルの総意を用いるため汎化性能が高まる、つまり バリアンスを小さくする 特徴がある。また、各モデル構築は並行でできるため 並列処理が可能で速度が比較的遅い

ブースティング

モデルを作成し、その結果に対する誤りをより重視するようにモデルを改善し、さらにそのモデル結果の誤りをより重視するようにモデルを改善し...を繰り返していくモデル。

誤りを修正していくためバイアスを小さくする特徴がある。こちらは順番にモデルを作成していくので並行処理は不可で、処理速度が比較的遅い。

ランダムフォレストとは

決定木モデルは、前述のようにバイアスは小さく、バリアンスが大きい
ランダムフォレストは、この決定木を複数作り組み合わせる。つまりアンサンブル学習させることでバイアスは小さいままバリアンスを下げることで予測性能を上げる。

アンサンブル学習の手法としては、バギングと同様にブートストラップ法によって複数の標本集団を作成する。そして通常のバギングとは異なり、それぞれの集団に対して、ランダムにx個の特徴量のみを使用した決定木モデルを作成し、それぞれのモデル結果の総意を結果として使用する。

通常、それぞれの決定木間の相関が高い場合はバリアンスが下がりづらいことが知られている(直感的には、多様な人による意見の総意の方が良い成果が出やすいことに似ている)。
ブートストラップ法によって標本を選ぶだけでなく、使われる特徴量も多様になるので、通常のバギングよりも更に多様な標本集団を用いた決定木モデルの作成をすることができ、決定木間の相関が低くなりやすいため通常のバギングよりもバリアンスが低いアンサンブル学習をおこなうことができる。

このように、バリアンスは小さいままバイアスも小さくするという試みをランダムフォレストという。

なお、組み合わせるモデルはなんでもいいといえばいいが、手法の特性上「バイアスが小さくバリアンスが大きい」モデルが適しているので決定木が使われているという背景がある。

【アンサンブル学習】多様性が大事? バギング・ランダムフォレスト編 - Np-Urのデータ分析教室

特徴量はいくつずつ使うか、どこで枝を生やすのをやめさせるか...などはパラメータで指定する。

3.2.4.3.1. sklearn.ensemble.RandomForestClassifier — scikit-learn 0.21.3 documentation

経験則だが、どれくらいにしたらいいかの定説はある模様。

決定木の2つの種類とランダムフォレストによる機械学習アルゴリズム入門 | SPJ

改めて、ランダムフォレストとは

「バイアスが小さくバリアンスが大きい決定木」に対して、「バギング的な手法でアンサンブル学習をおこなうことバリアンスを下げたモデルを作成」するため予測精度が高いモデルが作成できる手法

下記がパラメータや実用面について、色々とまとまっている https://shakezo.hatenadiary.org/entry/20121221/1356089207

https://www.jstage.jst.go.jp/article/itej/70/9/70_788/_pdf/-char/en

www.slideshare.net

どういう場合に使えないか(良い精度が出づらいか)

前述のように、組み合わせた決定木同士に相関が強い場合はバリアンスが下がりづらい。

そのため各々で特徴量をランダムにx個使った決定木を作成することで学習データの多様性を確保するが そもそも特徴量自体が少ない場合 、それぞれの決定木に使用される特徴量はランダムに採択しても似通うのでバリアンスが下がりづらい。

また、そもそも データ量が少ない場合 もブートストラップ法によって復元抽出される標本集団が似通うので相関が高く出やすく、バリアンスが下がりづらい。

他と比べてどういうメリット/デメリットがあるか

メリット

  • 決定木がベースなので、 特徴量の重要度を計算することができる
  • 並列処理が可能なので 計算が比較的早い
  • 各決定木の総意を用いるのでノイズに強い

また、SVMを使ったことがないためよく知らないのですが、以下のような特徴もあるようです。

  • SVMなどと違い特徴量のスケーリングが必要ない

デメリット

  • パラメータが多い(ただし、デフォルトでもある程度はうまくいく)
  • メモリ使用量が大きい
  • 前述の理由より、学習データに精度が依存する

Gradiant Boosting Decision Tree系との比較

同じく弱学習器として決定木を用いるが、アンサンブル学習の仕方がバギングでなく、ブースティングにしたものにXGBoostやLightGBMなど(Gradiant Boosting Decision Tree系、以下GBDT系)がある。

ランダムフォレストと比較して、GBDT系は高い予測性能を持ったモデルを作れるが、パラメータによって過学習が起きやすい。そのため、パラメータチューニングをちゃんとしないと高い予測性能を持ったモデルを作るのは難しいし時間がかかる。
また、モデル自体の学習時間も一般的にはランダムフォレストよりかかる。

そのため、GBDT系とランダムフォレストのどちらを使うかは、工数と精度のトレードオフになるとのこと。

どうやって学習をしていくか。何を学習すればいいか。

怪文書シリーズ第3弾。学びについて最近考えていることをつらつらと。頭整理用のメモなのでよみづらいです。

どうやって学習するか

最近、弊社は採用の強化をおこなっていて先輩の強いDSの人が採用面接によく駆り出されている。

面接の際に先輩は「xxx(面接者が最近学んだと言っていた手法)という手法のポイントはなにですか」という質問をよくするらしい。ポイントという言葉をもう少し具体化した「xxxはどういうときに使いますか」「xxxは他の類似手法と比べて何が優れているか」という質問の場合もある。

この質問の意図としては、どれだけ頭を使って各手法を使っているかを判断するためのようだ。つまり、「なんかよくわからんが(あるいはなんとなくアルゴリズム自体は知っているが)ランダムフォレストというモデルの性能が高いらしいからなんでもランダムフォレスト使えばええやん」みたいな使い方をしていないかをあぶり出すため。そして、これができている人はおそろしく低いとのこと。

(本論ではないので括弧書きをするが、これはミクロにはモデルの使い方の問題ではあるがマクロには、「そもそも目の前の事象についてちゃんと考えて取り組んでいるのか」というデータ分析への取り組み方にも繋がるように思える。)

考えてみると、このような問いかけをしながら学ぶのが一番要領がいいし、実際に使う際にちゃんと考えて使うことができる。逆に、これを考えずに学ぶことはただ目で字を追っているだけで使い物になる学習ではない。

自分を振り返ってみると、そのものの学習時はあまりそういうことは意識していない。類似手法を見かけたときに、「前の手法と似ているがどう使い分けするんだ?」は考える。つまり、学習の仕方としては△で、「類似手法を見かけたときに」改めて学びだすので無駄が多い。また、見かけなかった場合は手持ちの学習した内容は使い物にならない状態。

もちろん「類似手法を見かけ」ないと、比較的な考え方(AとBは何が違うか)はできないが、少なくともデータ分析系の手法は「xxxという仮定の上で使う(⇔その仮定が成り立たない場合は使えない)」という前提が存在する。つまり、この仮定がその手法のポイントであり、類似手法との違いとなる。

要するに、何が言いたいかというと「学習する際は、その手法のポイントは何かを意識しないと学習をしても使い物にならない」。

何を学習するか

論文を読もう

学習ソースについて

学習をしていて思うのは、そこらへんのブログはノイズが多い。上述を踏まえて書くと、「なんかやってみた、というだけで仮定などが書いてない」ものが非常に多い。

つまり、ブログ情報だけで学習するのは難しい(もちろんちゃんと書いているサイトも多いけれど)。

そうなると、何で学習したらいいかというと一番良いのは論文。原論文は、当たり前だが今までの手法との違いやメリットが書いているし、原論文じゃなくても「何故他の手法ではなくその手法なのか」書いている。

知識の広げ方1

「他にどういう手法があるか」ということも、前述の理由から論文に書いている。

知識の広げ方2

「xxしたいけどどういう手法があるだろう」ということは論文ですぐ調べられるし、その論文の参照などで過去論文などもすぐわかる。

要するに論文読め

つまり、何が言いたいかというと論文読めると世界が広がるし、逆に読めないといつまでもゴミのまま。もちろん銀の弾丸ではないけれど読めると色々と効率がよいのは間違いない。

そのため、論文を読めるようになろう。

数式読め

特に論文でそうだが、数式にはすべてが書いている。つまり数式を読めば大体のことがわかる。つまり数式を読めるようになろう。

さすがに今回は雑文すぎた。