Coursera MachineLearning 6週目 まとめ

MachineLearning
機械学習界隈で評判高いCourseraのMachineLearningを受講したので、講義内容を個人的にまとめてみたいと思います。
6週目は、学習アルゴリズムの評価 (evaluating a learning algorithm)や機械学習診断(Machine learning diagnostic)についてです。

交差検定(Cross validation)


いままで学んできたことを使って様々なモデルを作成することができるようになりました。しかし、作ったのはいいものの「そのモデルは本当に最適なのか?」と聞かれるとどうでしょうか?
例えば、オーバーフィットを防ぐ手段の一つとして、目的関数に「正則化パラメーター λ 」を導入するという方法がありました。しかし、実際に値を設定して対策をしてみたものの「オーバーフィットしていません!」と言い切れるかというと、いまいち決め手に欠けます。新しいデータで試してみないとなんとも言えないですよね。
機械学習では、モデルの学習に使用した手元にあるデータだけでなく、これまで見たことのない新規のデータに対しても精度良く機能することが求められます。( 汎化(generalization) )
それじゃあモデルを汎化するために大量のデータをまた集めないといけないのか…となりそうですが、手持ちのデータだけでなんとかモデルを汎化できないだろうか?と考え、交差検定(cross validation)と呼ばれる方法で実際にその検証を行っていきます。

まずは、交差検定も何も考えずにモデルの評価を行おうとするとどうなるかを見てみましょう。

  1. はじめに、手持ちの data set を7:3に分割し、それぞれを「training set」「test set」とします。


  2. training set を使用して目的関数が最小になるようなパラメーター\(θ\)を求め、モデルを作成します。

  3. 求めたモデルにtest setに適用し、誤差がどれほどになるか確認します。もし誤差が大きければ、training set に対してオーバーフィッティングしているということなので、対策を取らなければなりません。正則化パラメーター\(λ\)を大きくする、特徴量を減らす、などを行います。ここでは、モデルの精度を高めるために test set を使用したということですね。

  4. 次に、選んだモデルがどれだけ汎化(generalize)されているか調べます。
    1つの方法として、test setを使用して汎化誤差(generalization error)を推定する。という方法がありますが…これは適切ではありません。

test set は既にモデルの精度を高める段階で使用してしまっています。よって、汎化誤差を調べる際に再び test set を使用してしまうと、得られる誤差は必ず小さくなります。まぁ当然といえば当然ですよね。 ここで、新しく追加データを集めるか…とならずに、交差検定(cross validation)を行うとどうなるか見ていきましょう。

  1. data set を3分割にする。training set 60% / cross validation set 20% / test set 20% (6:2:2 が一般的によく使われる割合のようです)


  2. training Set を使用して目的関数が最小になるようなパラメーター\(θ\)を求め、モデルを作成します。

  3. 求めたモデルにcross validation setを適用し、誤差を確認します。先ほどはここで test set を使用しましたが、その代わりに cross validation set を使用してモデルの精度を高めるための改善を行っていきます。

  4. test setはこれまでの工程に関与していないので、test setを使用して、選ばれたモデルの汎化誤差(generalization error)を推定します。


これで、モデルの汎化をより正しく判断することができるようになりました。 

bias & variance


機械学習では、モデルの学習に使用した手元にあるデータだけでなく、これまで見たことのない新規のデータに対しても精度良く機能することが求められることから、 汎化誤差をより正しく推定する方法を見てきました。
そして機械学習モデルに対してもう1つ言えることは、汎化誤差に加えて、training set での誤差(training error)や cross validation set での誤差(cross validation error)も小さい方が好ましいということです。 ここでは、第3週目でも学習したオーバーフィッティング(over fitting)とアンダーフィッティング(under fitting)についてみていきます。

●オーバーフィッティングとは…training set では誤差が小さいが、cross validation set や test set での誤差が大きい時に起きている。(モデルが High variance な状態)
●アンダーフィッティングとは…training set で十分に小さな誤差が得られない時に起きている。(モデルが High bias な状態)
それぞれ、以上のような状態を指します。グラフで示すと以下のような関係になります。
次数が上がりモデルが training set にフィッティングしていくにつれて training error は減少していきますが、cross validation error は上昇していきます。
training error だけでなく cross validation error も小さくするためには、cross validation error が最小になる点を選んであげると良さそうですね。 また、第3週目では、オーバーフィッティングを防ぐために正則化を行いました。より汎化なモデルを作成するためにパラメーターλを導入し、data set にフィッティングしすぎないようにしていました。このパラメーターλはどのように選べば良いのでしょうか? 先ほどと同様にグラフで示すと以下のような関係になります。 λが小さくなっていくと、モデルは training set にオーバーフィッティングしていきます。training error は小さくなり、cross validation error は大きくなります。
反対にλが大きくなっていくと、モデルは training set にアンダーフィッティングしていきます。training error 、cross validation error の両方が大きくなります。 こちらも同様に、cross validation error が最小になる点を選んであげると良さそうです。
λの値を決めるための具体的な手順を示すと…

  1. \(λ\)のリストを作成する。(0、0.01、0.02、0.04、0.08、0.16、0.32、0.64、1.28、2.56、5.12、10.24 など)
  2. 用意したモデルにリストの\(λ\)の値をモデルに代入し、それぞれの場合の\(θ\)を trainig set を用いて学習させる。
  3. 正則化していない モデルに (2) で求めた\(θ\)を適用し、cross validation set を使用して cross validation error を計算する。
  4. cross validation error が最小となった点の\(θ\)と\(λ\)を選択する。
  5. (4) で選択した\(θ\)と\(λ\)を モデルに適用し、汎化されているか確認する。

といった流れになります。 

学習曲線(Learning curves)

学習アルゴリズムのパフォーマンスを改善させる対策の1つとして、学習曲線(Learning curves)をプロットするという方法があります。得られたモデルは High bias なのか、High variance なのか、はたまた複合的な問題を抱えているのか等々を診断します。


縦軸をerror、横軸をm(training set size) としています。 training error をみてみると、m が少ない時は容易にフィットすることができるので誤差は小さくなっています。mが増加していくにつれてフィットしづらくなり、誤差も大きくなっていきます。
cross validation error についてもみてみます。新規のデータを扱うので、m が少ないと誤差は大きくなります。m が増加していくにつれて、だんだんとフィットしていく形になります。

(i) のグラフは High bias な状態を示しています。
途中から同じような値を取り始め、最終的に training error 、cross validation error の両方が大きい誤差を示しています。

(ii) のグラフは High variance な状態を示しています。
(i) のグラフとは異なり、training error と cross validation error の間にギャップがありますが、High bias のグラフよりも低い値で収束していきそうです。

Learning curves のグラフより…

  • High bias(アンダーフィッティング) の時は、サンプル数mを増やしても、あまり効果がない。
    ⇨ High bias(アンダーフィッティング)になっていると分かれば「サンプル数を増やす」という対策をとる必要がないと分かり、有効に時間を使うことができる。

  • High variance(オーバーフィッティング)の時は、サンプル数mを増やすことで training error と cross validation error のギャップは小さくなっていくので、「サンプル数を増やす」という選択肢には価値がある。

というようなことが読み取れます。

他にも High bias と High variance に対する対策をあげると…

High bias(アンダーフィッティング) に有効な対策

  • 特徴量(feature)を増やす
  • 多項式の項数(polynomial features)を増やす
  • 正則化パラメーター\(λ\)を小さくする。

High variance(オーバーフィッティング)に有効な対策

  • 特徴量(feature)を減らす。
  • サンプル数 \(m\) を増やす。
  • 正則化パラメーター\(λ\)を大きくする。

などが考えられます。 学習曲線(Learning curves)を描くことで「モデルを最適化するために何が必要なのか?」を知るためのヒントが得られる、というわけですね。

Precision(精度) と Recall(再現率)

偏りのあるデータ(skewed data)を扱うのは難しい

講義内でよく挙がる例題ですが、ガンの分類について再び考えます。
医療患者の特徴量(feature)がいくつかあって、彼らがガンかどうか( \(y=1\) or \(y=0\) )を判断したいとします。 
その際にロジスティック関数を使用してエラー率1%のモデルを作成することができた!となると良いモデルのように思えますが、ガン患者が全体の0.5%のみ(\(y=1\) が0.5%、\(y=0\) が99.5%)だとしたら話は変わってきます。
なぜかというと、常に \(y=0\) を示すアルゴリズムでもエラー率0.5%となってしまうからです。 この状況で「エラー率1%のモデルに変更を加えてエラー率0.5%にしました」といっても、良い変更を加えたかどうかが判断できなくなってしまいます。「モデルが常に\(y=0\) を示すように変更しました!」が良い修正ではないことは明らかですからね。 こうした偏ったデータ(skewed data)を取り扱う状況では、別の評価指標が必要になってきます。

精度(Precision) と 再現率(Recall)

・Precision = True positive / (True positive + False positive)
(ガン\(y=1\)だと予想した患者のうち、実際にガンである人はどれほどいたのか?)

・Recall = True positive / (True positive + False negative)
(実際にガン\(y=1\)である患者のうち、その人がガン\(y=1\)であるとどれだけ言いあてることができたか?)

これらを計算することで、正確なモデルかどうかを評価することができる。
先ほどの「常に \(y=0\) を示すようなアルゴリズム」をここに当てはめてみると、Recall が0になるので「このモデル、エラー率は低いけど分類する気がない!」とばれてしまうわけです。(この二つの評価指標は、レアなクラスを\(y=1\)とおいて使用しています)
また、この2つの指標はトレードオフの関係にあり、モデルのPrecition(精度)を上げたいと思い \(y=1\) とする閾値を大きくするとRecall(再現率)は下がり、逆にモデルのRecall(再現率)を上げようと \(y=1\) とする閾値を小さくするとPrecition(精度)が下がります。モデルの目的に応じて閾値を調整しましょう。
便利な評価指標が登場しましたが、ここで別の問題に直面します。
評価指標が2つになったことで、複数のアルゴリズムを比較したときにどちらがより優れているのか判断しづらくなってしまいました。以下のアルゴリズムのどちらがより優れたアルゴリズムなのでしょうか?

  • アルゴリズム1 :Precision = 0.5 / Recall = 0.4
  • アルゴリズム2 :Precision = 0.7 / Recall = 0.1

この問題を解決するために、F値(F score)というものを計算します。

F score = 2 (Precision * Recall) / (Precision + Recall)

何かを比較する際の指標はやっぱり1つの方が良いです。そこで両者のスコアを用いてF値を計算し、全体としての良し悪しを反映した数値を定義することで,モデルの優劣を議論しやすくしています。
複数のアルゴリスムを比較する際には、このF値を参考にすると良いみたいですね。



Error Analysis の章でもありましたが、汚くても良いから簡単なアルゴリズムを出来るだけ早く実装してみることが大事なようです。簡単な学習モデルでも、learning curveから解決策のヒントが得られるかもしれません。「試しの実装なんだから綺麗にする必要はないのに、それをやっている人がたくさんいる」とのこと。
無駄な時間を過ごさないためにも、何を優先的に行うか、どこに重きをおくのかは常に考えておかないといけないですね。 7週目は「Support Vector Machine」と「kernel」について学習していきます。

コメント

タイトルとURLをコピーしました