Coursera Machine Learning Week6のメモ

Courseraのマシンラーニング講座を勉強しています。
week6はの理解が及ばず、復習しながらメモを取ったので、共有します。

乱雑な点はご了承ください。


#Evaluating a Learning Algorithm
## Deeciding What to Try Next
機械学習の誤差が大きい場合に、できることはいくつかある。

・training exampleを増やす
・set of featuresを減らす
・set of featuresを追加する
・polynomial featuresを増やす
・lambdaを小さくする
・lambdaを大きくする

これらのうちから勘で選ばれることが多いが、これは診断によって絞り込むことができる。


## Evaluating a Hypothesis(仮説の評価)


仮説は誤差が少なければいいわけではない。
overfittingしている可能性がある。
2次の線形回帰であればグラフにすればわかるが、featureが多いと目で見れない。

データを分けてみよう。
Training setとTest setを7:3に。
この2つにサンプル分ける際はランダムに選ばないといけない。

そしてTraining set　とTest setの
コスト関数を比較
分類問題のミス率を比較
してoverfittingか判断しよう。


## Model Selection and Train/Validation/Test sets

線形関数であれば、その次数を決めたいことがある。
その際は1次式、2次式、三次式の多項式を作り、それぞれについてtraining setを用いてシータを決める。
そしてそれぞれの多項式について別のデータセットに対する当てはまり（コスト関数の値の低さ）を見て、何次が良いか選ぶ。

では、それで選んだ多項式が一般化されているかを見定めるにはどうすればいいか？
そのためには、まだ使っていない3つ目のデータセットを用いる必要がある。

言い換えれば、
training setでトレーニングを行い、
cross validation setで各モデルの当てはまりを見て、モデルを選択する。
最後にtest setでの当てはまりを見て、一般化されているかを確認する。

比率は6:2:2が良い。


# bias vs variance

## Diagnosing Bias vs Variance

high bias : under fitting
high variance : over fitting
2つの判断は、パフォーマンスの改善方法を知るために大切。

ある次数のことなるモデルについて考える。

Jtrain(θ)は次数が低ければunder fitで大きくなる、
次数が高ければover fit で小さくなる。
次数が高ければよりフィットする。

一方Jcv(theta)を見てみると、
次数が低ければunder fitで大きいのはそうだが、
次数が高くてももちろん大きい。なぜなら、Jtrain(theta)はoverfitしてるから小さくなっているが、新たなデータセットのcross validation setについては当てはまらないから。

そのため、
・JTrainとJcvの両方が大きく、近ければ、underfit biasの問題
・Jtrain ＜＜　Jcv　ならoverfit highvarianceの問題




## regularization and Bias/Variance
overfittingを防ぐのがregularizaton

ある次数のhypothesisの場合、
lambdaが大きければ、theta1以降が0に収束するためy＝theta0に近くなる。
high bias

lambdaが小さければ、overfittingする。
適度なlambdaを選ぶ必要がある。


ではどのようにlambdaを決めるか。

正則化項なくJtrain,Jcv,Jtestを計算し、モデルを決める。

その上でlambdaの範囲を決める。
0、0.01、0.02、0.04・・・・10.24
2倍していく。

これら12個のlambdaの値が異なるモデルについて、Jtrain(theta)を計算し、それぞれthetaを決める。

そして12個のモデルについてJcv（theta）を求め、最も低いモデル（lambda）を選ぶ。

Jtest(theta)で、一般化できているか確認する。


trainとcvの誤差がどのように変化していくか

trainは
・lambdaが小さいとoverfitting variance
　Jtrainは小さくなる。

・lambdaが大きいとunderfitting bias
　Jtrainは大きくなる。

CVは

・lambdaが小さいとoverfitting varianceなので、Jcvも大きくなる。

・lambdaが大きいと、underfittingなので、high bias,Jcvも大きくなる。


## Learning curves

学習曲線は、モデルの正当性チェックやパフォーマンス改善に役立つ

サンプルを減らした場合を考えてみる。
二次関数の場合、正則化項を入れなければ
m=1、2、3　は完全にフィット。
mを大きくしていくと徐々にerrorは大きくなる。

cvはどうだろうか。
mが小さければ、そんなので作成したモデルは外れるに決まっているため、errorは大きくなる。
mが大きくなれば減少していく、いい仮説ができているはずだから。



ではここで、high biasの場合について考える。
hx = theta0 + theta1*x

ただの直線。
mを増やしてもその直線はあまり変わらない。
フィットしない。

Jcvについて考えると、mがある程度の数まで行けば、可能な範囲でベストの直線を得ることになるが、その後errorは減らない。
トレーニングセットについても、ある程度の数まで行けば、ベストの直線は得られる。
errorは両方とも高い。

trainとcvのerrorは最終的に近くなる。
なぜなら、パラメータが少なくデータはたくさんあるため、errorは似たり寄ったりになる。

つまり、high bias　の場合は、mを増やしてもerrorは下がらないので、施策としては意味がない。


high varianceの場合
100次の式だったり、lambdaが小さかったり。

mが少なければoverfitting
増やしてもあるところまではoverfittingだが、そのうちerrorは増える。

overfittingしているからもちろんJcvは高くなる。

そのためJtrainとJcvの差は大きい。

しかし、mを増やしていけば、trainは増え、cvは減る。

そのため、high varianceの場合はmを増やすことが施策としてあり得る。

このように学習曲線を見ることでbias,varianceの問題かを判断することは価値がある。



## Deciding What to Do Next Revisited

学習曲線でhigh bias か high varianceかわかったら、下記の手法を取れば良い。

|  | training example | feature | lambda |
|:-:|:-:|:-:|:-:|
|high bias(underfitting)   | そのまま| 増/polynomial　feature | 減 |
|high variance(overfitting)| 増 | 減| 増|

NNに関連付けると
・小さなNN
　under fitting
　計算量少ない

・大きなNN
　overfitting(正則化すれば良い）
　計算量大（でも大丈夫）

基本的には大きなNNを選ぶことが多い。

hiddenいくつかは、
1つがデフォルトだが、
1,2,3でCVを試してどれが良いか決めるのも良い。





# Building a spam classifier
## Prioritizing What to work on

machine learning system design

機械学習のシステムをデザインする際に、どう優先付けするか。

メールのスパム分類を作る際には、
まずxをどう表現するか考える。

例えばキーワードがメールに出てくるかどうか。

手動で100選ぶのは辛いのでトレーニングセットに出てくる10000〜50000のキーワードを選んだりする。



何に時間を使うべきか
選択肢はたくさんある。
・多くのデータを得る。(honeypot)
・e-mailヘッダなどでfeatureを開発
・文章のfeatureをより工夫する
・ミススペルを利用する
などなど

ベストはどれか私にもわからないが、
ランダムに選んではいけない。
次のエラー分析ではその優先付け方について考える。


## Error Analysis

エラー分析

新たな機械学習の実装をする際にはまず
汚くて早い実装をしよう。24h程度。
時間をかけてはいけない。
これができれば、学習曲線が描ける。
そうすれば高バイアス、高バリアンスかがわかる。
次に何をすべきかがわかる。


エラー分析では
クロスバリデーションの分類のエラーを人力で見る作業
・どのようなカテゴリについて分類を間違えているか
・どのような追加のfeatureがあれば精度が上がるだろうか
手動で見ながら考える。

また、ある一つの実数値の評価指数を持てると良い。

機械学習の実装をする際は、いろいろなアイデアが出てきて、試したくなるだろう。
そのような時にそのアイデアを導入した場合、しなかった場合とでCVの誤差を見てみる。
導入したら誤差が高まるようであれば入れなければいいし、低くなるのなら入れたほうが良い、と素早く意思決定ができるようになる。


#Handling Skewed Data

## Error Metrics for skewed classes

スキュー（歪んだ）クラスの場合には、別の評価指標を持ったほうがいい。

例えばがん患者を分類する問題を考えよう。
99%の患者を正しく判断できていた、このモデルは好ましいだろうか？
そうとは限らない。なぜなら全体の1%ががん患者で、全員に対してがんでない、と判断しても99%の患者を正確に判断できていることになるから。

このような、陽性と陰性の割合が歪んでいるのをスキュークラスと呼ぶ。

このような場合、正確性を図る評価としては何を持つのが良いか。

Precision（精度）とRecall（再現）

| 予測\実際 | 1  | 0  |
|:-:|:-:|:-:|
| 1  | True Positive|False Positive|
| 0 |False Negative|True Negative|

Precisionはy=1と予測したもののうち、実際にy=1だったものの割合
P = True Positive/(True Positive + False Positive)


Recallは実際にはy=1のもののうち、正しくy=1と予測できたものの割合

R = True Positive / (True Positive + False Negative)


これらは高ければ良い。

なお、スキュークラスの場合は、y=1に稀なクラスを置く（がん患者など）

これらの指標であれば、スキュークラスでも有用である。



## Trading Off Precision and Recall

PrecisionとRecallのトレードオフ。

がん患者などを判断する際には、
htheta(x)の閾値を0.5から変化することも考えられる。

例えば、深く確信を持った場合にのみがん患者と判断したい場合、閾値は高めたほうがいいし、
確率が低くても、がん患者の人にがんだと告げることを優先したい場合には閾値を低くしたほうがいい。

だがそれぞれ、Higer Precision,Lower Recallないし、Higer Recall,Lower Precisionに成る。

PrecisionとRecallはどちらが高ければどちらが低くなる、トレードオフの関係だ。


では、このような時に閾値を決めるにはどうすれば良いか。モデルの単一の評価指標を定め意思決定を早くしたい。
PとRの平均をとることも考えられるが、それだと、どちらかが1に近く、どちらかが0に近いような極端な場合でも、高く数値が出てしまう。

そこでおすすめなのが、Fスコアだ。
これは低い方に重み付けをしていることになり、どちらかが0に近ければ0に近い数字となる。
両方大きい必要がある。
Fスコアの最大値は1で、最小値は0だ。

CVに対してFスコアを見ればどの閾値が良いか自動で選ぶことができる。


# Using Large Data sets
## Data for machine learning
どれだけのデータを試す必要があるか。

ある実験では、いろいろなアルゴリズムで実験をした時、
その精度はどのアルゴリズムを選んでも、多くのデータ量があれば他のアルゴリズムを超えるということがわかった。
つまり「機械学習における勝者は、最も良いアルゴリズムを持つものではなく、最も多くのデータを持つものだ」といえよう。


では、どのような時データを集めるべきか。
まず1つは、feature Xがyを予測するのに十分なデータ量があるかどうか。
それを判断するには、そのXを人間のプロフェッショナルが得た時に、yを予想できるかで判断すれば良い。

十分なfeatureがあるようなアルゴリズム（ロジスティック回帰、線形回帰、NNどれでも）これらはたくさんのパラメータを持つ強力なアルゴリズムで、複雑な関数にフィッティングできる。
low bias algorithms
これならJtrainは小さくなる。

そして大量のトレーニングセットがあればoverfitしない。
そのためJtrain = Jtest

よってJtextは小さくなる。


高いパフォーマンスを得るには高バイアス問題には学習アルゴリズムで対応し、高バリアンスにはたくさんのデータで対応する。

より多くのパラメータで、より多くのデータがあれば高パフォーマンスが出せる。

人間のエクスパートがyを予測できるだけのfeatureがあるか
大量のトレーニングデータを与えられ、パラメータをアルゴリズムが学習できるか。