機械学習 はじめよう

第14回 ベイズ線形回帰を実装してみよう

この記事を読むのに必要な時間:およそ 5 分

予測分布を描く

共分散行列の読み方が少しわかったとはいえ,まだ物足りない感じがあります。

もっと事後分布を分布として活用する方法の一つとして,予測分布があります。

イメージ的には,事後分布p(w|X)とはパラメータwの分布なわけですが,これをp(y|w,x)に「代入」すると,xを与えるとyの分布が返ってくる「関数」p(y|X,x)が得られます。

いえ,分布に分布を単純に代入なんてできませんし,分布が返ってくるものは関数の定義にはあてはまりませんよ。あくまでもイメージです。

このようにターゲットとなる変数の分布に事後分布を反映させたものを予測分布と呼びます。

今回のベイズ線形回帰の予測分布は,導出過程は都合上省略しますが,確率の加法定理・乗法定理などを駆使すると次のように得られます。

これは「xごとに決まるyの分布⁠⁠,つまり2次元上の関数になりますので,これを描くには2次元では足りず,分布(確率密度)の高さを表すためにもう1次元必要になります。3次元のグラフを描いてもいいですが,ここでは濃淡で表すことにしましょう。

matplotlibのcontourf関数を使えばそういう図を簡単に描くことができるのですが,2次元上の関数値を計算して渡してあげる必要があり,そこだけは少々面倒なコードを書いてあげる必要があります。

# 正規分布の確率密度関数
def normal_dist_pdf(x, mean, var): 
    return np.exp(-(x-mean) ** 2 / (2 * var)) / np.sqrt(2 * np.pi * var)

# 2次形式( x^T A x を計算)
def quad_form(A, x):
    return np.dot(x, np.dot(A, x))

xlist = np.arange(0, 1, 0.01)
tlist = np.arange(-1.5, 1.5, 0.01)
z = np.array([normal_dist_pdf(tlist, np.dot(mu_N, phi(x)),
        1 / beta + quad_form(Sigma_N, phi(x))) for x in xlist]).T

plt.contourf(xlist, tlist, z, 5, cmap=plt.cm.binary)
plt.plot(xlist, [np.dot(mu_N, phi(x)) for x in xlist], 'r')
plt.plot(X, t, 'go')
plt.show()

画像

濃い部分は確率密度関数の値が高い,つまり推定される関数がそこを通る可能性が高い部分です。

こうして描いた予測分布を見ると,データの密度が高いところは推定に自信があり,薄いところはデータ点の間隔が広いため推定に自信がないといったことがわかります。

普通の線形回帰では目立って「過学習」っぽい振る舞いをしていたx=0.7のあたりなどは特に色が薄いので,推定した関数のこのあたりはあまり信用できないな,ということがわかってしまうのもベイジアンならではですね。

パラメータαとβの決め方

最後に,後回しにしていたパラメータαとβについて少し考えてみましょう。

そもそもαとβとは何だったでしょう? αは事前分布p(w)を導入するときに初めて登場しました。こういった,ベイジアンの事前分布に入っているパラメータは特にハイパーパラメータとも呼ばれます。

この式を見ると,αが大きいほど分散が小さくなる,つまりwが0に近い値だという事前知識が強くなります。この状態でベイズ線形回帰をとくと,wを0に近い値に推定しようとする力が強いため,いわゆる過学習しているような結果になるのが抑えられやすい反面,真の解にたどり着くまでに多くのデータを必要としてしまうかもしれません。

逆にαが小さいとwを押さえつける力が弱くなります。特にαが0の時は普通の線形回帰と一致します。そこで0に近い小さめの値,例えば0.1や0.01あたりを設定してまずは解いてみることが多いです。

もう一つのパラメータβは「精度」と呼ばれ,条件付き確率p(y|w,x)の導入で出てきました。

この式でβは,観測値tが真の値wTφ(x)からどれくらいぶれてもいいか(ノイズが乗ってもいいか)を表すパラメータとして与えられていました。βが大きいとぶれは少なく,小さいとぶれが大きくても許されます。

つまり,このβは「データを得るまでにノイズ要因がどれくらいあったか」といった事情を考慮しつつ,1以上のできるだけ大きめの値が好まれるようです。

ここまでαとβを問題を解きたい人が選ぶ話をしましたが,⁠交差検定」によってパラメータを自動的に決める方法や,αにも事前分布を入ることでパラメータを直接決定しなくてもいいようにする手法など,他にもいろいろなパラメータの決め方はあるのですが,いろいろあるということは裏返せば正解がないということ。

一番必要なのは「経験と勘」……と言ってしまうと身も蓋もないですね。ただ、それは機械学習全般に当てはまることなので,いろいろな技術を試しておくのが使いこなせるようになる一番の近道なのかもしれません。

次回予告

次回からは分類問題の話に入っていき,何回かかけてロジスティック回帰にたどり着きたいと思います。お楽しみに。

著者プロフィール

中谷秀洋(なかたにしゅうよう)

サイボウズ・ラボ(株)にてWebアプリ連携や自然言語処理を中心に研究開発を行いながら,英単語タイピングゲーム iVocaをサービス提供している。

URLhttp://d.hatena.ne.jp/n_shuyo/
Twitterhttp://twitter.com/shuyo