機械学習を学ぶのに最も適した教材と言われる、Machine Learning | Coursera を受講しているので、復習も兼ね学んだ内容を簡潔にまとめてみようと思います。
第六弾は、機械学習モデルの検証です。データを手に入れ、いざモデルを作りました。そのモデルはいいモデルなんでしょうか?そもそもいいモデルってなんでしょう?そういう、意外と大切なことを学ぶ回です。
過去の記事
Coursera Machine Learning (1): 機械学習とは?単回帰分析、最急降下法、目的関数
Coursera Machine Learning (2): 重回帰分析、スケーリング、正規方程式
Coursera Machine Learning (3): ロジスティック回帰、正則化
Coursera Machine Learning (4): ニューラルネットワーク入門
Coursera Machine Learning (5): ニューラルネットワークとバックプロパゲーション
交差検定 (Cross Validation)
もっとも有名なモデルの検証方法が、**交差検定 (Cross Validation)**でしょう。データをトレーニングセットとテストセットに分割し、トレーニングセットのデータを用いてモデルパラメーターを学習させます。そうしてできたモデルを、テストセットにあてはめてみて、どれだけエラーが出てくるか調べます。分割比は、$Training:Test = 70:30$ が一般的です。
これにより、新しくデータを取ってこなくても自分のモデルの検証ができるのですね。
ただ、交差検定により「実はあまりいいモデルではなかった」ことがわかることがままあります。ありがちなのは、オーバーフィッティング (Overfitting. またはHigh Varianceとも言う)で、トレーニングデータでは高い分類精度 (Classification Accuracy)を誇るけれども、テストデータでは分類エラー (Misclassification Error)を頻発する場合です。
こうなると**「よし、じゃあテストセットでも高い分類精度が出るよう、モデルを変えちゃうぞ!」**となりますね。例えばニューラルネットワーク (Neural Network)だったらレイヤー (Hidden Layer)の数を増やしたり、多項回帰 (Polynomial Regression)だったら次数を上げてみたり。
そうしてどうにか、テストデータでも高い精度を誇るモデルができたとします。「よし、完成だ!」……としてもいいのですが、これでは完璧ではありません。モデルをテストセットに合わせて変えてしまったので、そのモデルがテストセットで良い精度を示すのは当然です。もし全く新しいデータが得られたとき、そのモデルがトレーニング、テスト同様の良い精度を示すかは未知です。つまり、データをトレーニング、テストに分割するだけの方法だと、モデルの**一般化エラー (Generalization Error)**を甘く見積もることになります。
なので、こうします。
元のデータを分割する段階で、$Training, Test$ の2つではなく $Training, Cross Validation, Test$ の3つに分けます。分割比は、$Training:CV:Test = 60:20:20$が一般的です。こうすることで、
- Training Setを使ってパラメーターを見つけ、モデルを作る
- そのモデルの精度を、Cross Validation Setを使って確かめる
- モデル精度が悪ければ、Cross Validation Setでの精度が上がるようモデルを作り直す
- 最終的にできたモデルをTest Setに適用し、一般化エラー (Generalization Error) を推定する
と、モデルの一般化エラーをより正しく推定することができます。
注意点
**あくまでモデルパラメーター$\Theta$を見つけるのはTraining Setで行います。**Cross Validation SetとTest Setは学習に全く関与しません。Cross Validation SetとTest Setの違いは、Cross Validation Setにおける精度を上げるようにモデルを作り変えることは許されているけれども、Test Setは最終的にできたモデルの精度を確認するだけで、その精度を上げるようにモデルを作り変えることは許されていないことです。
バイアスとバリアンス (Bias & Variance)
よい機械学習モデルとは、Training Set, Cross Validation Set, Test Setいずれでも小さいエラーを示すモデルのことです。
Training Set, Cross Validation Set, Test Setいずれも高いエラーを示す場合、そのモデルはアンダーフィット (Underfit, またはhigh biasと言う)しています。
Training Setでのエラーは小さいけれども、Cross Validation, Test Setでエラーが大きい場合、そのモデルはオーバーフィット (Overfit, またはhigh varianceと言う)しています。
そもそもエラーとは?
学習したパラメーター$\theta$ を使ったモデルのエラーは、モデルの予測値$h_\theta (x)$ と実際の値$y$ の差を取って二乗したものを、各データポイントで足し合わせて計算できました。
J(\theta) = \frac{1}{2m} \sum^m_{i=1} (h_\theta (x^{(i)}) - y^{(i)})^2
$m$ はデータサンプル数です。この$J(\theta)$ を最小にするような$\theta$を探すように学習を進めるわけですが、オーバーフィッティング (Overfitting)しないよう**正規化パラメーター$\lambda$ (regularization parameter)**を導入しました。
J(\theta) = \frac{1}{2m} \sum^m_{i=1} (h_\theta (x^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum^m_{j=1} \theta_j^2
これにより、$\theta$が大きくなるとエラー$J(\theta)$が最小値を取りにくくなるため、overfitting (high variance)を防ぐことができます。
「じゃあ$\lambda$の値ってどう選べばいいの?」
という疑問には、縦軸にエラー、横軸に$\lambda$の値をとった以下のような図が答えてくれます。
$\lambda$が小さすぎると、モデルはオーバーフィット(高バリアンス)気味になるのでTraining Setのエラー$J_{train} (\theta)$は小さく、Cross Validation Setのエラー$J_{CV} (\theta)$は大きくなります。
逆に、$\lambda$が大きすぎると、モデルはアンダーフィット(高バイアス)気味になるのでTraining Setのエラー$J_{train} (\theta)$、Cross Validation Setのエラー$J_{CV} (\theta)$共に大きくなります。
そのため、図で赤い点線で囲ってあるように、**$J_{CV} (\theta)$ を最小にする$\lambda$**を選べば丁度いいわけですね。
正規化以外にも、モデルを改良する方法はあります。以下はまとめですが、地道な作業です^^;
アンダーフィット(高バイアス)を直したい
- 別の説明変数 (feature)を探す
- 多項変数 ($x_1^2, x_2^2, x_1x_2$など)を追加する
- 正規化パラメーター$\lambda$を小さくする
オーバーフィット(高バリアンス)を直したい
- トレーニングデータ数を増やす
- 説明変数 (feature)を減らす
- 正規化パラメーター$\lambda$を大きくする
#適合率と再現率 (Precision & Recall)#
データが偏っている場合、モデルの精度を推定するのは難しいです。
野菜嫌いの子供がある日母親にサラダバーに連れていかれ、「なんだここは、うちに食べれるものがなにもない!」と学習しました。子供の野菜嫌いを直したい母親は、今度は別のサラダバーへ連れていきます。そこでは10品のバイキングのうち、1品ハンバーグが紛れてるサラダバーでした。それでも、「サラダバー=野菜しかない=食べるものがない」と学習している子供は、「またうちに食べれるものがないに違いない!」と決めつけてしまい、大好きなハンバーグを見逃してしまいました。
この場合、新しいサラダバーにおける子供の正答率は、10品目のうち9品目を正しく野菜だと判断したので、モデル精度は90%となります。
……精度90%と聞くと良いモデルのように感じられますが、この精度は単純にトレーニングデータが極端に偏っている(野菜ばっか)ことによります。
別の例では迷惑メールの分類のように、偏りのあるデータ (skewed data)を扱う場合、分類精度 (Classification Accuracy)は信用できる検証指標ではありません。
こうしたとき役に立つ指標が、**F値 (F score)**です。
野菜かそうでないかの分類は、$0$ か $1$の二値 (binary)なので、モデルの予測結果は以下のようにまとめることができます。
このとき、適合率 (Precision)、**再現率 (Recall)**を以下のように定義します。
Precision = \frac{True Positive}{True Positive + False Positive}
\\
\\
Recall = \frac{True Positive}{True Positive + False Negative}
適合率 (Precision)は、$y = 1$ だと予測したうち、実際に$y = 1$な割合で、真陽性の数を、赤で囲まれた数 ($y = 1$だと予測した数)で割ると求められます。
再現率 (Recall)は、実際に$y = 1$である数のうち、正しく$y = 1$であると予測できた割合で、真陽性の数を、橙色で囲まれた数 (実際に$y = 1$である数)で割ると求められます。
この2つ、適合率と再現率 (Precision & Recall)はトレードオフ (Trade-Off) の関係になっています。
モデルの予測値$h_\theta (x)$がある閾値 (Threshold)より大きいとき$y = 1$だと予測するとすると、閾値が小さければ再現率は上がり適合率は下がる、逆に大きければ適合率が上がり再現率が下がるからです。
適合率$P$ と再現率$R$ のバランスを定量化したものが**F値 (F score)**です。
F = 2 \frac{PR}{P + R}
複数のアルゴリズムのうちどれを用いるか決めるとき、$F値$が大きいものを選べば、偏りのあるデータにも対応できるでしょう。
#まとめのまとめ#
- モデル検証には、Cross Validationを用いる。
- Training (パラメーター$\theta$を見つける), CV (モデル改良のための精度評価), Test (一般化エラー推定のための精度評価)。
- Overfit (high variance), Underfit (high bias)を修正する正規化パラメーター$\lambda$は、cross validation setのエラーが最小値となるものを使う。
- 偏りのあるデータ (skewed data)でのモデル評価は、適合率 (Precision)と再現率 (Recall)からF値を求める。
#終わりに#
今回は特別なモデルは扱わず、作ったモデルをどう評価するかという、比較的地味な話でした。ただ、内容としては今までで一番濃く、機械学習を正しく使用するためにとても大切な回だったなという印象です。**「たくさんデータを集めるのは、1)説明変数が目的変数を予測するのに十分な情報を持っているとき、2)説明変数が多いとき、だけしか意味がない」**というメッセージが授業の最後にあったのですが、「とりあえず取れるだけデータとってきて」という一言によって闇雲に思いつく実験と解析をし、研究室生活を棒に振る理系学生の1人であった私には涙。機械学習は、みんなに学んでほしい。
次回は、またアルゴリズムの話に戻ります。とうとうサポートベクターマシーン (Support Vector Machine)についてです。