学習データ: 欠損値について

Forecasting Experience チームの矢田です。

2回ほど開発秘話ということで、あまり関係ない話を書いてしまいましたが、今回は、まじめに学習データについて書いていきたいと思います。今回のテーマは欠損値についてです。ちなみに人材は引き続き募集してます。

さて、機械学習をやるうえでの大きな悩みの1つが、学習データの欠損値です。

そもそも欠損値って何?
欠損値とは、何らかの理由でデータが取得できなかったなど、データに歯抜けがあることを言います。

欠損値の種類には大きく
データ的な欠損値:  データ自体が入ってない場合(つまり、空データとか、NULLとか)
理論的な欠損値:  -1とか、99999などの数字が入力されているがその数字は意味を持っているわけではなく、あくまでもデータベースなどにインサートするために補完したもの、つまり、データの意味的に不適切なもの
の2つのタイプがあります。

尚、サポートベクターマシン系やニューラルネットワーク系のテクノロジーでは、データ的な欠損値は、基本的に許容できません。そのため、機械学習を行う上で、欠損値が大きな問題になります。

欠損値に対するアプローチ
1. 欠損値が含まれるデータを削除する
2. 欠損値を埋める
3. 一番最初に考えないといけないこと

1. 欠損値が含まれるデータを削除する
当たり前ですが、欠損値があるデータ(行や列)を削除してしまうというのが一番簡単なアプローチです。

ただし、それだとデータに偏りが出たり、そもそもの学習データが減ってしまったりと、豊富にデータがある状態を除き、このアプローチが取れない場合もあります。

2. 欠損値を何らかの方法で数字に置き換える
次に考えられるのは、欠損値を何らかの方法で埋めるということになります。

2.1 代表的な数値で置き換える
平均値、中間値、最頻値など、統計的な代表値を入れるという方法があります。一番最初に検討される方法だと考えています。

2.2 定数で置き換える
例えば、0といった数字で埋めます。

2.3 類似したデータの数字を数字で埋める
類似したデータ行を見つけ出して、そのデータが持つ列の数字をコピーしてくる。できれば類似した行を複数見つけて平均するなど、特定なデータを選択しない努力をする必要があります。

2.4 計算式を作って数字を作りだす
データの状況を見て、何らかの計算を行い、データを作りだす。もちろん、2.3のような類似する列を見つけるという方法もありますが、欠損しているデータ行の中で、関連するデータを見つけて、その平均をとって補完するというやり方もあります。

2.5 2.1から2.4までをうまく組み合わせる

3. 一番最初に考えないといけないこと
そもそもとして、なぜ、データが欠損したかを考えてみるということです。なぜ、欠損したかを考えるとおのずから、どの方法を取ればいいかの答えが見えることが多いと感じています。

学習データ作りでお悩みがある方は、是非ともご連絡ください。このブログで一緒に悩んでいきたいと思います。