作って遊ぶ機械学習。

~基礎的な確率モデルから最新の機械学習技術まで~

データに欠損がある場合の教師あり学習

おはようございます.

今回は教師あり学習モデルを題材に,入力データが欠損している場合のベイズ流の対処法を解説します.ベイズモデルというと,たいていの場合は事前分布の設定の仕方云々だとか,過学習を抑制できるだとかに議論が注目されがちですが,個人的には,パラメータや潜在変数を推論することとまったく同じ枠組みで欠損値も同時に推論できることが,実用上非常に便利なベイズの特性だと思っています.

 

データの欠損部分の取扱い

データに欠損部分が存在することはよくあります.センサーデータを解析する際は,ネットワークの状況やデバイスの不具合によってデータの一部が欠けた状態で上がってくることがあります.スマホから複数種類のデータを集めるといった状況を考えてみると,例えば加速度センサーの値は継続的に取得できたとしていても,GPSの位置情報はほとんど上がってこないといった場合もあるかと思います.また,何かしらのユーザーのアンケートデータを利用した予測を行う場合は,収集したアンケートに未記入項目が出てしまうのはごく自然でしょう.

ナイーブな対処方法としては次の2つ考えられます.1つめとしては,あるデータの一部が欠損している場合は,そのデータごと解析の対称から外してしまうことです.しかし,これは貴重なデータを使わずに捨ててしまっていることになるので,よほどデータ量が潤沢にない限りは非常にもったいないやり方になります.また,継続的に観測される時系列データなどを取り扱う場合には,そもそもうかつにデータを削除することすらできません.2つめの対処法としては,予測アルゴリズムを適用する前に,前処理として線形補間や平均値の当てはめなどを行って欠損を埋めてしまうことです.しかし,こちらの方法も問題があり,前処理で欠損を埋めてしまうと,後段の予測アルゴリズムは受け取ったデータの中の実際に観測された部分と補間された部分の違いが区別できないため,誤った推定結果を出してしまうことになります*1

ベイズの枠組みで確率的な推論を行えば,データを使った予測と欠損値の補間を同時に行うことができます.補間値に対する不確実性も見積もることもできるため,誤った補間による予測性能の劣化や過学習も基本的には起きません.

 

ベイズロジスティック回帰

さて,ここではベイズロジスティック回帰を例にいわゆる「教師あり学習」のモデルをおさらいしたいと思います*2.ロジスティック回帰は,多次元の実数値入力データを2値に分類するようなモデルです.入力データ(説明変数)をX,出力データ(目的変数)をY,さらにパラメータをwとすれば,N個のデータに対する同時分布は次のようにモデル化されます*3

f:id:sammy-suyama:20170830214813p:plain

ただし,式(1)のそれぞれの分布は次のようになっています.

f:id:sammy-suyama:20170830214830p:plain

式(2)のσはシグモイド関数で,中身の実数値を0から1までの間に押し込める役割を担っています.式(3)ではwの事前分布にガウス分布を仮定しています.

このモデルから,下記のパラメータの事後分布に関する特性(平均や分散など)を得ることが,ベイズロジスティック回帰における「学習」にあたります.

f:id:sammy-suyama:20170830214850p:plain

式(4)の事後分布はロジスティック回帰の場合では解析可能な表現形式が得られません.ですので,変分ベイズによって何かしらのシンプルな分布で近似をするか,MCMCを使って大量のサンプルを取得することによって平均や分散などを調べる必要があります.

 

入力データに欠損値がある場合

ここからが本題です.今回は入力データXの一部を,パラメータwと同じようなやり方で推論する必要があるので,次のようにXに対しても事前分布を置いてあげる必要があります*4

f:id:sammy-suyama:20170830215000p:plain

また,ここでは,入力データセットXの任意の部分が欠損しているような状況を考えることにします.あるn番めのデータx_nは,要素の一部が欠損していてもいいですし,まるごと全部無くなっている状態でもOKです.データセットをX={Xo,Xm}のように,観測部分Xoと欠損部分Xmに分解して書けば,求めたい事後分布は次のようになります.

f:id:sammy-suyama:20170830215059p:plain

あとは欠損値がなかった場合と同じように,何かしらの近似推論手法を使って式(7)の事後分布の特性を調べてやればOKです.

 

実験

さて,簡単な2次元のトイデータを使って欠損値補間付きベイズロジスティック回帰の動作を確認してみます.ここでは入力データの次元数をD=2,データ数をN=30とします.また,入力データはそれぞれの要素が50%の割合で欠損しています.今回はスケールの小さい簡単な問題ですので,MCMCの1つであるMetropolis-Hastings法を使用して学習しています.

2クラス分類を行うと,次のような「平均確率の等高線」を描くことができます.

f:id:sammy-suyama:20170830023317p:plain

(左図)すべての次元がそろっている場合のデータのみを使った予測結果になります.今回の場合はN=10個のみを使用し,残り20個は捨ててしまった上で学習しています.

(中央図)今回の欠損値補間の方法を用いて,欠損値(×印)を補間推定しながら予測を行った結果です.

(右図)欠損が一切なかった場合の予測結果で,いわば今回の「正解」の予測分布になります.

結果から分かるように,左図では欠損のあるデータを捨ててしまっているので,右図の正解とはほど遠い予測結果になってしまっています.中央図ではx印の点が欠損値を持つデータの推定位置(平均)を表しており,薄い棒はサンプルから計算された推定位置の偏差を表しています.青・赤それぞれのクラスがなんとなくまとまるように配置されている様子が分かりますね.中央図と右図はかなり近い形状の等高線(予測確率)になっており,欠損のあるデータをうまく利活用した方が,データが完全に観測された場合の予測に近づいている様子がわかります

 

まとめ

さて,今回の話を簡単にまとめてみます.

1,データは使えるだけ使った方が良い.

データを捨てるのはもったいないですアルゴリズムの実装コストや計算コストなどともよく相談する必要がありますが,なるべくなら余計な前処理などせず,上手に単一のモデルから推論できた方が望ましいでしょう.ただし,データの欠損値補間をもっと真剣にやるのであれば,今回のような教師ありモデルを使わずに,生成モデルによってしっかりXをモデル化した方が良いかもしれません.

2,ベイズの枠組みでは,欠損値もパラメータと同様に確率推論を行う.

推定したい値はすべて確率変数として扱う」のがベイズの基本です.したがって,教師あり学習を普通に使うときは存在を意識する必要はありませんでしたが,入力の欠損値を推論したい場合は今回のように事前分布を明示的に導入することになります.また,欠損値を確率推論できるようにしておけば,前処理や例外処理をあれこれ実装する手間もなくなります.今回のアルゴリズムであれば,極端な場合入力Xがすべて欠損だったとしても「うまく予測できませんでした」という予測結果が返ってくるだけで,バグになることはありません*5

3,欠損値の補間を行っても過学習はしない.

ベイズにはそもそも「過学習」という概念すらないので,これはかなりナンセンスな言い方ではあります.仮に,ベイズの代わりに最尤推定を用いて欠損値を推定した場合,尤度を向上させるために際限なく「都合の良い」Xmを求めてしまいます.これは推定というよりも「データの捏造」に近いため,当然ながら新規データに対する汎化性能は期待できません.

 

今回の実験を行ったソースコード(Julia実装)は下記にあります.(logistic_regression_intrp.jl)

MLBlog/src at master · sammy-suyama/MLBlog · GitHub

 

今回の記事がよくわからん!という方には,次のような入門書もあります.

books.rakuten.co.jp

*1:僕の経験上最悪のデータは,欠損部分がすでに0で埋められているというものでした.どこが欠損していたかの情報もなかったため,観測値として本当に0なのか,欠損のため0なのか,まったく検討がつきませんでした.

*2:ちなみに,個人的には「教師あり」だとか「教師なし」だとかっていう区別はあんまり本質的ではないと思っています.

*3:ちなみに,個人的には「説明変数」だとか「目的変数」だとかっていう区別はあんまり本質的ではないと思っています. 

*4:欠損値がない場合でもXに事前分布を置いても構いませんが,Xがすべて完全に与えられている状況では,結果としてXの事前分布はwの事後分布やyの予測には一切の影響を与えないことが分かります(グラフィカルモデルの記事を参照ください).

*5:より正確に言うと,事前分布の情報のみを使った大雑把な予測を出力してくれます.