2016-05-29_08h15_26

すべてのモデルについて、必ずデータを使って学習させなければなりません。よって、モデルの性能はデータによります。さらに、モデルを使うことのできる範囲もデータによります。

たとえば、中学の数学までしか学習していない人が、大学の入試試験をやったときに、何かしらの答えは書けますが、それが正解かどうかはあやしいです。これは、大学入試はその人を適用できる領域の外だった、ということになります。ただ、一応何かの答えがかけてしまう、これがやっかいなのです。

一般的な説明の前に、もう一つ身近な例を見てしましょう。

たとえば、気象予報士も一つのモデルです。つまり【天気予報予測モデル】です。天気図などの情報を気象予報士に (天気予報予測モデルに) 入力すると、明日の天気を出力します。しかし、たとえば日本の気象予報士は、あまり見慣れていない金星の天気図などの情報があっても、一応予測はできますが、予測された天気はあまり信頼できないと思います。少なくとも日本の天気予報よりは当たる可能性が低いです。つまり答えの信頼性が低いということです。また日本の天気図であったとしても、これまでに起きたことのない異常気象のときは、翌日の天気を予想するのは難しいでしょう。

つまり日本の気象予報士の【天気予報予測モデル】には、どんな天気図でも入力してよいというわけではなく、『日本の』『過去に似ている天気図が存在する』天気図といった具合に、モデルの出力を信頼できるものにするための入力の条件がありますこの条件は、モデルを利用する前に把握しておかなければなりません。つまり、日本の天気しか当たらない、これまで同じような天気図がないと当たらない、といったことが事前にわかっていれば、その条件以外の天気図は結果を信頼できないので入力しない、ということになります。

回帰モデル・クラス分類モデルもこれらと全く同じです。すべてのモデルを使うときには、必ずそのモデルを適用できるデータ領域 (適用領域) をまず決めてからそのモデルを使わなければなりません。

回帰モデルやクラス分類モデルがあると、どんなデータを入力しても推定した値を出力してくれます。ここがやっかいなところです。つまり、適当に入力しただけの、本来であれば信頼できないときにも何か『推定値』として出てきてしまいます。これを防がなければなりません。

では、どのようにモデルを適用できる領域(モデルの適用領域)を決めればよいのでしょうか?

大きく分けて4つの方法があります。

  • 各変数 (特徴量・記述子・説明変数・入力変数) の範囲に基づく方法
  • データセットの中心からの距離に基づく方法
  • データの密度に基づく方法
  • アンサンブル学習に基づく方法

順に説明します。

各変数 (特徴量・記述子・説明変数・入力変数) の範囲に基づく方法

これは一番単純な方法です。それぞれの変数に上限値・下限値を決めます。何かサンプルをモデルに入力するときには、すべての変数の上限値と下限値の中にそのサンプルが入っていなければなりません。たとえば身長・体重・座高という変数があったときに、身長が150cmから170cmまで、体重が50kgから70kgまで、座高が80cmから100cmまで、すべて満たした人でないと、学力偏差値推定モデル(こんなものがあるかどうか分かりませんが・・・)に入力できません、といった感じです。どれか一つでも上限値を超えていたり、下限値を下回っていたりすると、そのデータをモデルに入力したときの推定値は信頼できない、ということになります。

では、上限値と下限値をどのように設定すればよいでしょうか?

各変数で、データセットの最大値を上限値、最小値を下限値にすればよい、と思うかもしれません。しかし、最大値・最大値は、『たまたま』大きい値をもつサンプルがあったり『たまたま』小さい値をもつサンプルがあったりする、『たまたま』の状況に弱いです。よって、たとえばデータセットの99.7%のサンプルが入るような範囲を変数ごとに設定したりします。この99.7%は3シグマ法からきています。

単純に変数ごとに上限値・下限値を決める方法のほかに、主成分分析(PCA)やカーネル主成分分析(KPCA)などを行ったあとに、主成分ごとに上限値・下限値を決める方法もあります。こちらのほうが、変数の間の相関関係が考慮されていてよいです。

データセットの中心からの距離に基づく方法

各変数や各主成分の範囲を決める方法は、とても簡単にモデルの適用領域を設定できてよいのですが、すべての変数に上限値・下限値を設定しなければならずちょっと面倒です。さらに、変数の数が多くなるにつれて、どれか一つ以上の変数で99.7%に入らないサンプルの割合が多くなってしまいます。

そこで、『データセットの中心からの距離』という一つの指標でデータの適用領域を設定する方法を考えましょう。最初のデータセットのサンプルごとに、データセットの中心からの距離を計算します。そして、データセットにおける99.7%のサンプルが含まれる距離の上限値を設定します。たとえば1000サンプルあるときは距離が997番目に大きいサンプルの距離がしきい値になります。新しいサンプルに対しては、データセットの中心からの距離がしきい値以下のときに、モデルの適用領域内といえます。

距離としては、

  • ユークリッド距離
  • マンハッタン距離
  • マハラノビス距離

などがあります。

また、元の変数で考えるだけでなく、PCAやKPCAなどを行ったあとに『データセットの中心からの距離』を計算する方法もあります。

データの密度に基づく方法

データセットの中心からの距離も簡単に計算できてよいのですが、変数の間に非線形性があったり、データの分布のかたまり(クラスター)が複数に分かれているときはうまくいきません。そこで、これらのときにもうまくいくようにデータの密度を考えてみましょう

データの密度を考える一番単純な方法として、サンプルごとに最も近い距離にあるいくつかのサンプルとの距離の平均、があります。サンプルごとに、他のすべてのサンプルとの距離を計算し、その距離が最も小さいたとえば10個のサンプルを選びます。そしてその最も近い10個のサンプルとの距離の平均値の逆数が、データ密度に対応するわけです。近くにサンプルがたくさんある、つまりその周辺のデータ密度が高いときは、距離の平均値が小さくなり、その逆数が大きくなるわけです。このデータ密度の指標についても、値が大きい順に並べ替えて、データセットの99.7%のサンプルが含まれるような値をしきい値に設定します。

少し複雑にデータ密度を計算する手法の一つに、one-class support vector machineがあります。ただ基本的な考え方は、サンプルごとに最も近い距離にあるいくつかのサンプルとの距離の平均、と同じです。

先ほどまでと同じように、PCAやKPCAなどを行ってから主成分においてデータ密度を計算する方法もあります。

アンサンブル学習に基づく方法

アンサンブル学習とは、ざっくりというと、たくさんモデルを作ってそれらを総合的に考える、ということです。

たとえばあるデータセットにおいて、すべての変数の中からモデルの構築のために用いる変数の組み合わせをランダムに選択し、それぞれモデルを構築します。もともと100変数あったら、その中から50変数だけランダムに選択するということです。または、すべてのサンプルの中からモデル構築のために用いるサンプルの組み合わせをランダムに選択肢、それぞれモデルを構築します。新しいサンプルの目的変数の値を予測するときは、すべてのモデルにサンプルを入力し、モデルの数だけ予測値を得ます。それらの予測値の平均値や中央値を最終的な予測値にするわけです。

モデルの適用領域を考えるときは、平均値や中央値ではなく、複数の予測値の『標準偏差』を計算します。標準偏差が小さい、つまり複数の予測値が同じような値になるときに、適用領域内であり、標準偏差が大きい、つまり複数の予測値がばらばらのときに適用範囲の外、と考えるわけです。

以上がモデルの適用領域を設定する手法です。これらの方法を使って、モデルを予測に使うときは必ず適用領域を一緒に使いましょう