機械学習のための数学メモ #4 (予測値を評価する)

#評価

今回は、予測関数<img width="28" alt="スクリーンショット 2017-10-30 0.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/cbde7612-c716-4a95-dfbc-7ce1dfe04efa.png">の正確性、要するに精度を定量的に表す方法について。
未知データ<img width="11" alt="スクリーンショット 2017-11-03 15.34.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/71a124ed-5ec5-97ad-0129-c1dc63198411.png">に対して、<img width="28" alt="スクリーンショット 2017-10-30 0.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/cbde7612-c716-4a95-dfbc-7ce1dfe04efa.png">が出力する予測値ができるだけ正確であることが求められる。

##交差検証（クロスバリデーション）
<回帰問題の検証>
モデルの評価は、学習データをテスト用と学習用に分けて、テスト用のデータでモデルを評価する。例えば、学習データが10個あったとしたら、3:7など学習用の方を多めにして分ける。
<img width="288" alt="スクリーンショット 2017-10-29 13.11.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3e88fd42-6449-15e1-3f6c-eda7982e0ee9.png">

これは学習データに対してしか正確でないという代表的な例。
<img width="289" alt="スクリーンショット 2017-10-29 13.13.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/f083bc15-df30-3dcd-477c-93282e730633.png">

学習済みのモデルがどれくらいテスト用データにもフィットしているかどうかを確認して評価していく。
ただし、図に書くことが難しい場合などが多いことから、定量的に精度を計算する必要がある。
回帰の場合は、学習済みのモデルに対してテスト用データで誤差の2乗を計算してその平均を取る。
テスト用データがn個あるとき、式は次のようになる。
<img width="255" alt="スクリーンショット 2017-10-29 13.14.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7cbff3e1-a707-0786-a05c-e179d0aedd3e.png">
これは平均二乗誤差（またはMSE（Mean Square Error））という値で、この誤差が小さければ小さいほど精度が高い良いモデルということになる。

<img width="287" alt="スクリーンショット 2017-10-29 13.14.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/90153e3c-3b69-b379-f9cd-812dc2016b75.png">

交差検証の中でも、特にK分割交差検証という手法がある。
・学習データをK個に分割する。
・K-1個を学習用データ、残りの1個をテスト用データとして使う。
・学習用データとテスト用データを入れ替えながらK回の交差検証を繰り返す。
・最後にK個の精度の平均を計算して、それを最終的な精度とする。
<img width="290" alt="スクリーンショット 2017-10-29 13.17.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/06776005-dafa-c766-d542-c54c69d55c75.png">
ただし、学習データが多ければ、何回も学習する必要があるため時間がかかる。
適切なKを決めることが大切。

<分類問題の検証>
回帰の時と同じように、テスト用と学習用がそれぞれ次のように分かれている場合を考える。
<img width="198" alt="スクリーンショット 2017-10-29 13.14.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/76e0402e-e808-ba7a-214f-6b832c12d0d4.png">
次は、学習用データは完璧に分類できているが、テスト用データを完全に無視してしまっている例。
<img width="197" alt="スクリーンショット 2017-10-29 13.15.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3915b91f-a277-352f-e5b4-f5bbc3a23c2f.png">

ロジスティック回帰では、分類が成功したかどうかは次の４種類の状態を考えることが大切。表にすると、
<img width="401" alt="スクリーンショット 2017-10-29 13.15.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/9cd0a4c2-076a-d1d5-a028-2e5395e3550a.png">
横長であることを正、横長でないことを負、とすると一般的に二値分類の結果は次のような表で表すことができる。
<img width="401" alt="スクリーンショット 2017-10-29 13.15.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/acfefb98-0ab5-8ec6-9d5f-d6246777abc9.png">
・Positive:分類結果が正
・Negative:分類結果が負
・True:分類がうまくできている
・False:分類が失敗している

分類の精度は、上記の表の４つの記号を使って計算できる。
TPとTNがどれだけあるかという割合が分類の精度（Accuracy）ということになる。
<img width="349" alt="スクリーンショット 2017-10-29 13.15.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/b589cea6-534b-e8d0-fee9-34d5bbcdf071.png">

例えば、データが100個あって、そのうち、80個が正しく分類できたなら、精度は次のようになる。
<img width="242" alt="スクリーンショット 2017-10-29 13.15.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/490c5bf5-e208-93e9-53d6-39248e7c1c8c.png">

##適合率と再現率
次のようなデータの場合、全体の精度を見るだけでは不確か。
なぜなら、全部をNegativeだと分類しても、精度は95%となるため（NegativeがPositiveに比べ非常に多いため）。
<img width="245" alt="スクリーンショット 2017-10-29 13.15.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1997a5a6-ef3f-2a59-9b5f-b983b82518bb.png">
Positiveがうまく分類できていない例。
<img width="402" alt="スクリーンショット 2017-10-29 13.15.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/260de85a-d861-29f2-2754-48f4876ce053.png">
1つ目の指標として、**適合率（Precision）**というものがある。
<img width="240" alt="スクリーンショット 2017-10-29 13.16.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1d9abbcb-7245-fb72-d961-fc5af31ed3ab.png">
TPとFPにだけ注目する。この式は、Positiveと分類されたデータの中で実際にPositiveだったデータの数の割合ということ。
<img width="244" alt="スクリーンショット 2017-10-29 13.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/295f76e7-e68b-ae70-e487-36fa6ca7139c.png">
実際に代入して、
<img width="361" alt="スクリーンショット 2017-10-29 13.16.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/244bbdd1-4329-0eb8-66ce-d6e3e46a2b86.png">
この適合率の値が高ければ高いほど、間違った分類が少ないということになる。今回の例では、Positiveに分類されたデータは３つあるが、実際にはそのうち１つしか正解ではないため、適合率は低い値となる。

また、**再現率（Recall）**とよばれる指標もある。この式は、Positiveデータの中で、実際にPositiveだと分類されたデータの数を表している。
<img width="203" alt="スクリーンショット 2017-10-29 13.16.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/bbf34591-97d7-c1e6-64ed-7ddfb932a861.png">
<img width="244" alt="スクリーンショット 2017-10-29 13.16.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7ebdf20c-b679-ae54-635b-d18d089d24f6.png">

実際に代入して
<img width="272" alt="スクリーンショット 2017-10-29 13.16.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ea9924e5-6d8c-7e15-9af6-1fd06863398d.png">
この値が高ければ高いほど、取りこぼしなく正しく分類しているということ。
今回の例だと、Positiveデータは全部で５個あるけど、実際には、そのうち１つしかPositiveには分類されていない。
よって、再現率も低い値になっている。

つまり、適合率と再現率の両方が高い値になっていれば、良いモデルだといえる。
ただし、適合率と再現率はどちらかが高くなればどちらかが下がるというトレードオフの関係にある。

##F値
総合的な性能をはかるものとして**F値（Fmeasure）**という指標がある。
適合率か再現率かどちらかが低ければ、それに引っ張られてF値も低くなるようになっている。
<img width="326" alt="スクリーンショット 2017-10-29 13.16.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/2ceedace-dfd9-bed6-a24d-f9a85a33bd55.png">
次のような２つのモデルの例があるときを考えてみる。
<img width="403" alt="スクリーンショット 2017-10-29 13.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/367d68d4-f1be-d0ac-c7b8-39ee09df1f75.png">

また、TNをメインに適合率と再現率を考えることも可能で、そのときの式は次のようになる。
<img width="179" alt="スクリーンショット 2017-10-29 13.17.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4fa1225d-0cb9-4f9c-ae8b-a08e2f50d5dd.png">
＊データに偏りがあるときは数が少ない方を使うと良い。

##正則化
学習データにしかフィットしないような状態を過学習（Overfitting）という。
（<img width="28" alt="スクリーンショット 2017-10-30 0.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/15a26caf-3a8a-450f-3856-8f2c68b4e60f.png">の次数を増やしすぎると過学習になることからもわかる。）

<過学習への対応>
・学習データの数を増やす
・モデルを簡単なものに変更する
・正則化

回帰の目的関数：
<img width="326" alt="スクリーンショット 2017-10-29 13.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/837de359-604a-d115-7a55-82a60c8a7cfc.png">
これに、**正則化項**とよばれる次のような項を追加する。
<img width="175" alt="スクリーンショット 2017-10-29 13.18.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/338917be-bdb5-09d1-a03f-2f9f4623aebb.png">

実際に追加すると、
<img width="304" alt="スクリーンショット 2017-10-29 13.18.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3424cab5-62ec-a9a2-f884-9573f945c0af.png">
この新しい目的関数を最小化していくことを**正則化**という。
（注意）
・mはパラメータの個数
・<img width="13" alt="スクリーンショット 2017-11-03 20.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7341f52a-44da-c4dd-6339-89333ef25213.png">に対しては正則化は適用しないので、<img width="33" alt="スクリーンショット 2017-11-03 20.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/00031ed5-600f-4255-ddfc-25a8ccbe319a.png">となっている。
予測関数が<img width="135" alt="スクリーンショット 2017-11-03 20.37.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/dfea3461-58d2-b214-f3ab-f10d6d50b48f.png">のとき、<img width="37" alt="スクリーンショット 2017-11-03 20.38.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c81ac9a8-ff1f-f803-243d-e74bcc9d123e.png">となって、正則化の対象になるパラメータは<img width="12" alt="スクリーンショット 2017-11-03 20.39.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ecdee766-fc8d-b415-aaed-c63abaff19ef.png">と<img width="12" alt="スクリーンショット 2017-11-03 20.39.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0d6a20d1-486e-e2a3-8389-be44ffc89c68.png">ということになる。
<img width="13" alt="スクリーンショット 2017-11-03 20.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/328bc683-78a7-8118-105a-f2b956f03a1a.png">のようなパラメータだけの項は**バイアス項**といい、普通は正則化しない。
・λは正則化項の影響を決める正の定数。これはどういう値にするかを自分で決める必要がある。

以上のようにして、過学習を防ぐことができる。

<正則化の効果>
目的関数を次のように２つに分ける。
<img width="220" alt="スクリーンショット 2017-10-29 13.18.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ea9ff301-c69f-23da-a80c-48ad96ab7043.png">
<img width="313" alt="スクリーンショット 2017-10-29 13.18.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6f24282b-4954-7675-384a-7a99cfe196e3.png">

この<img width="29" alt="スクリーンショット 2017-11-03 20.45.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/9c3a885d-30ae-9346-c95e-10a4d4200528.png">と<img width="28" alt="スクリーンショット 2017-11-03 20.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/fa212e46-117f-6a2c-b617-b125974997b0.png">を足したものが新しい目的関数となるため、実際にこの２つの関数をグラフにプロットして足してみる。
（ただし、パラメータの数が多いとグラフが書けないため、ここでは<img width="12" alt="スクリーンショット 2017-11-03 20.39.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/d3085b03-926c-bc0f-ed28-99dffa170dcc.png">だけに注目して考える。また、わかりやすくするためにλも省略する。）

正則化項のない目的関数だけの形だと、<img width="53" alt="スクリーンショット 2017-10-29 13.19.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0a24f307-3245-b59d-9701-210e7dc3169f.png">あたりで最小値となる。
<img width="313" alt="スクリーンショット 2017-10-29 13.18.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4b72690e-ddd9-0f55-ff34-63e2d091e3c1.png">


一方で、<img width="28" alt="スクリーンショット 2017-11-03 20.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0cc22619-8479-1efc-e160-9a359ec302e4.png">は<img width="23" alt="スクリーンショット 2017-10-29 13.19.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5abc2fdc-93e8-770b-77ff-49a0d1a5ed1e.png">の形なので、原点を通る単純な２次関数となる。

<img width="335" alt="スクリーンショット 2017-10-29 13.20.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/63795cc1-cfbb-6329-6177-7384f2dd0949.png">

実際の目的関数は、この２つを足した<img width="114" alt="スクリーンショット 2017-11-03 20.54.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4ec3cad6-ad0a-59e1-83ef-ee634bc9a4b7.png">で、それは次のようなグラフとなる。
（<img width="12" alt="スクリーンショット 2017-11-03 20.39.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/2b85a6d8-e462-d291-1dcb-b5ede6a662f3.png">の各点で<img width="29" alt="スクリーンショット 2017-11-03 20.45.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/66306406-132f-9f9d-cb0e-75e7795c2385.png">の高さと<img width="28" alt="スクリーンショット 2017-11-03 20.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7e5b4ad1-f1eb-e3cd-b08d-7638af1f918b.png">の高さを足して、それを線で結んでいく。最小値<img width="47" alt="スクリーンショット 2017-11-03 20.59.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/8bb14216-a4d3-c5d8-47b6-d8adbf3e280e.png">）

正則化項を足す前と比べて、<img width="12" alt="スクリーンショット 2017-11-03 20.39.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/89ddaf68-5dbb-c231-fea2-2942338935b0.png">が０に近づいている。
これが正則化項の効果で、パラメータが大きくなりすぎるのを防いで、小さい値に近づけてくれる。各<img width="13" alt="スクリーンショット 2017-11-03 16.43.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1249a6f0-2742-7508-9e14-1630b438a306.png">に対して、同様の動きをする。

<img width="332" alt="スクリーンショット 2017-10-29 13.20.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5ed7b85f-74a6-e392-4e87-7ad079c1b920.png">

そしてパラメータの値が小さければ、それだけその変数の影響を小さくできるということで、次のような予測変数<img width="28" alt="スクリーンショット 2017-10-30 0.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/893ec648-71bc-f00b-9faf-2e5d704d845d.png">を考える。

<img width="246" alt="スクリーンショット 2017-10-29 13.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4f95b11a-b60c-41c5-e1a5-1b6d239588f1.png">

例えば、<img width="37" alt="スクリーンショット 2017-10-29 13.21.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6a8dcce3-e3dc-0c5d-21bf-70c5b7014c74.png">のとき、<img width="15" alt="スクリーンショット 2017-10-29 13.21.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/a41e8875-1dfa-4067-1cac-df15f2846da1.png">は消え、２次式ではなくなり１次式となる。
つまり、もともとは曲線だった予測関数が直線になる。

<img width="449" alt="スクリーンショット 2017-11-03 22.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/a7890f77-3374-c811-6cda-7b6568ca3479.png">


不要なパラメータの影響を小さくすることで、複雑なモデルを単純なモデルに変えて過学習を防ぐ。
（ただし、最も次数の高い項のパラメータの値が小さくなるとは限らない。）
パラメータの影響が大きくなりすぎないように、ペナルティを課しながら学習していくという感じ。
またλは、その正則化のペナルティの度合いを調整する役割をしている。

例えば、<img width="35" alt="スクリーンショット 2017-11-03 21.12.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/e37355dd-1ac2-195b-0e65-67c386c6de8e.png">のとき、正則化を適用しないことと同義。
<img width="218" alt="スクリーンショット 2017-10-29 13.21.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/fba2882e-718e-fa88-c38e-7fbc1c48fcd1.png">

逆にλを大きくすれば、正則化のペナルティが強くなっていく。
<img width="216" alt="スクリーンショット 2017-10-29 13.21.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5adc20a4-4c88-8710-0530-c4c576edd900.png">

<分類の正則化>
分類にも同じように正則化を適用できる。
ロジスティック回帰の目的関数、つまり対数尤度関数は、次のような式なので、
<img width="369" alt="スクリーンショット 2017-10-29 13.22.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5aadc738-80a7-fc1a-4291-b8db8854bb8a.png">

回帰の時と同様に、正則化項を足すと、
<img width="446" alt="スクリーンショット 2017-10-29 13.22.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1d44a8a4-d724-f7d5-3783-abf0fdd5174f.png">
（注意）
元の目的関数にマイナスがついているのは、対数尤度関数は、元々は最大化することが目的だったが、今回は（誤差を最小化する）回帰の目的関数と合わせて最小化問題として考えたいため。
符号を反転させたので、パラメータの更新の時は回帰と同じように微分した関数の符号と逆方向に動かすようにすることに気をつける必要がある。

目的関数の形が変わったので、パラメータ更新式も変わり、次はそれについて考えていく。

<img width="214" alt="スクリーンショット 2017-10-29 13.22.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/748aabf1-7137-9992-02ee-ce0769d8d7a4.png">
なので、
<img width="267" alt="スクリーンショット 2017-10-29 13.22.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/80e5ed7d-717e-4bc2-4c5d-8f1eefcd31c7.png">
<img width="29" alt="スクリーンショット 2017-11-03 20.45.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/8fb708a2-f20e-d199-a29e-18543d7d3979.png">は元の目的関数なので、回帰の時に既に微分した形を求めた次のような式となる。
<img width="339" alt="スクリーンショット 2017-10-29 13.22.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6e971897-d7f6-652d-5287-a449159a24ff.png">

正則化項のところの微分の計算は次のようになる。
<img width="226" alt="スクリーンショット 2017-10-29 13.22.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0590c1cc-6481-9e88-fe10-fa4421b036f1.png">

<img width="140" alt="スクリーンショット 2017-10-29 13.22.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ab9ee1c7-4ba9-fc13-ff4a-24ef9bbd0365.png">

したがって、最終的な微分結果は次のようになる。
<img width="362" alt="スクリーンショット 2017-10-29 13.22.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0433a066-35de-0f95-fd0a-12175e420bf9.png">
この微分結果をパラメータ更新式にあてはめると、
<img width="368" alt="スクリーンショット 2017-10-29 13.22.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/83b82b3d-7c26-c64c-037a-99736b2a3de0.png">

（注意）
<img width="13" alt="スクリーンショット 2017-11-03 20.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/33dfa956-99e2-8591-69b1-67fae320b773.png">に関しては正則化は適用しないので、<img width="28" alt="スクリーンショット 2017-11-03 20.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c9fb0499-6577-000d-554d-0c7346f60603.png">を<img width="13" alt="スクリーンショット 2017-11-03 20.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/80a59116-abc7-3419-89b5-4ee89dc08a2a.png">で微分すると０になるため、場合分けする必要がある。

ロジスティック回帰も同じような流れで、微分していくと、

<img width="364" alt="スクリーンショット 2017-10-29 13.23.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/22fc3be2-0bd1-a131-5b55-56f822637910.png">

それぞれの項目を微分、
<img width="268" alt="スクリーンショット 2017-10-29 13.23.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/36a6f8f7-c363-b5a7-6487-0101ac4983df.png">

ロジスティック回帰の元の目的関数<img width="29" alt="スクリーンショット 2017-11-03 20.45.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c26d4e5f-b6e4-11ca-ed85-218fcfff9dd2.png">の微分は、以前求めたものにマイナスををつけているところに注意（今回は最小化問題として考えているため。）
<img width="353" alt="スクリーンショット 2017-10-29 13.23.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7ae06f1a-46cd-feb9-e030-691e30bf104d.png">
<img width="140" alt="スクリーンショット 2017-10-29 13.23.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/42f986bc-1fa4-5996-d7a4-97195d57f024.png">

したがって、パラメータ更新式は、回帰同様、場合分けをして、次のようになる。
<img width="381" alt="スクリーンショット 2017-10-29 13.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/958bb200-b48b-c1a1-6e1a-a6fd99c9d74c.png">

##学習曲線
過学習とは逆で、学習データにフィットしていない状態のことを**未学習（Underfitting）**という。

例えば、次のようなグラフで複雑な境界線を持つようなデータを直線で分類しようとすると、どうやっても綺麗に分類できずに結果的に精度が悪くなる。
この原因は、解きたい問題に対してモデルが単純すぎるという点にある。

<img width="244" alt="スクリーンショット 2017-10-29 13.24.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ef36c091-8180-2606-1e0c-c2a5bc6269cf.png">



過学習か未学習かを見極めるには**学習曲線**を使う。

精度だけでは、どちらが原因かわからないため、横軸をデータの個数、縦軸を精度として、学習用データとテスト用データの精度をプロットしてみる。

<img width="258" alt="スクリーンショット 2017-10-29 13.24.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/eee14100-ea93-71a3-9f4c-2ccc818b83e9.png">

ここでは、<img width="28" alt="スクリーンショット 2017-10-30 0.56.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/2067ca05-65b8-fbad-8eda-a1e477bd674c.png">を1次関数として話を進めることにする。この中から適当に学習用データを2個だけ選んで、それで学習を進める。

<img width="263" alt="スクリーンショット 2017-10-29 13.24.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0d5a2be4-621e-6ce3-129e-67a0c06f1c63.png">
このグラフだと学習用データ２個についてはどちらにもフィットして誤差は0。

次は、学習用データ10個で学習してみる。誤差を0にするには、あまりに難しすぎるのがわかる。
<img width="263" alt="スクリーンショット 2017-10-29 13.24.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/bcd3ad39-3f9c-d434-1d0c-28fcbf3061d6.png">
つまり、モデルが簡単すぎる場合はデータ量が増えるにつれて、誤差も少しずつ大きくなり、精度が下がっていく。

横軸をデータの個数、縦軸を精度とするグラフを書いてみると、次のように、最初は精度が高いが、データ量が増えるにつれて精度が少しずつ下がるようになる。
<img width="273" alt="スクリーンショット 2017-10-29 13.24.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/84a41495-f5ca-5883-0c47-cd7b5e70288f.png">

先ほどの学習用データ10個とは別にテスト用データがあるとして、それぞれのモデルでテスト用データの評価をして、同じように精度を求めてプロットしてみる。
学習用データが少ない時のモデルでは、未知のデータを予測することは難しいから精度が低くなる。
一方で、学習用データが多くなればなるほど、少しずつ予測の精度が上がっていく。
<img width="263" alt="スクリーンショット 2017-11-03 22.09.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4f77e048-fd66-7159-9777-e68557020eb3.png">

<未学習の状態（**ハイバイアス**）のグラフ>
データの個数を増やしたとしても、学習用データでもテスト用データでも精度が悪い状態のグラフになる。
<img width="309" alt="スクリーンショット 2017-10-29 13.24.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7d67086c-3816-9857-33a5-fa1eb6e188a2.png">

<過学習の状態（ハイバリアンス）のグラフ>
学習用データに対してはデータを増やしてもずっと精度が高いままで、テスト用データに対しては精度が上がりきれていない状態のグラフになる。学習用データにだけフィットしいてしまうという過学習の特徴が見て取れる。

<img width="308" alt="スクリーンショット 2017-10-29 13.25.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/61a82860-2b95-03ff-3173-1e7f8fd048e4.png">

モデルの精度が悪い時に、過学習か未学習かわからないときは、学習曲線を描くといい。