Coursera Week6
はじめに
CourseraのWeek6を実施しましたので、私のメモを公開します。
Courseraってなんだ?という方はWeek1から御覧ください。
Advice for applying machine learnig
仮説関数の評価方法について(Evaluating a hypothesis)
仮説関数はトレーニングセットとの誤差が少ないだけだと、オーバフィットしてしまう。
オーバーフィットするとトレーニングセットに存在しない新しいサンプルの一般化に失敗してしまう。
オーバーフィットの判断として、フィーチャが1つの場合はグラフを書いてわかるが、複数のフィーチャがあると無理だったりする。
その新しいやり方として、トレーニングセットを分割して、70%をトレーニングセット、30%をテストセットとする。(ランダムに並べ替えてから。)
テストセットの線形回帰目的関数は以下のように求める。
$$
J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2
$$
ロジスティック回帰の場合は以下。
$$
J_{test}(\theta) = -\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}\log h_\theta(x_{test}^{(i)})+(1-y_{test}^{(i)})\log h_\theta(x_{test}^{(i)})
$$
分類問題におけるゼロワン誤判別計量。
$$
TestError = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}), (y_{test}^{(i)}))
$$
Diagnosing Bias vs. Variance
高バイアスはアンダーフィット、高分散はオーバーフィットを表している。
ちょうどいいのはこの2つの平均を見つけること。
トレーニング誤差$J_{training}(\theta)$は多項式の次数$d$を増やすと減少する。
交差検証誤差$J_{cross-validation}(\theta)$は$d$をあるポイントまで増加させると減少し、そこを超えると上昇する。つまり、グラフにすると凸曲線を形成する。
アンダーフィットしている場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$は両方高くなり、近似する。
オーバーフィットしている場合、$J_{training}(\theta)$は低く、$J_{cross-validation}(\theta)$は$J_{training}(\theta)$よりはるかに大きくなる。
正規化項$\lambda$に関して。
$\lambda$が大きすぎるとアンダーフィットし、0に近いとオーバフィットする。
トレーニングセットが多くなればなるほど、$J_{training}(\theta)$は大きくなる。
反対にトレーニングセットが多くなればなるほど、$J_{cross-validation}(\theta)$は小さくなる。
高バイアス(アンダーフィット)の場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$は共に高い値に落ち着く。
また、双方の値がかなり近い値になる。
なので、トレーニングデータを増やしても有効ではない。
高分散(オーバーフィット)の場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$はかなり大きな差が出る。
しかしトレーニングデータを増やすことでその差を縮めることができる。
層の少ない小さいニューラルネットワークの場合、相対的にアンダーフィットしやすい。
1層内にたくさんのニューロンがある場合や隠れレイヤが多い場合はオーバーフィットしやすい。
通常は少し大きめのニューラルネットワークを正規化してオーバーフィット対策をするのがベター。
ここまでのまとめ
トレーニングセットを増やす:高分散を修正
フィーチャの数を少なくする:高分散を修正
フィーチャーを追加する:高バイアスを修正
多項式フィーチャを追加する:高バイアスを修正
$\lambda$を減少させる:高バイアスを修正
$\lambda$を大きくする:高分散を修正
機械学習システム設計(Machine learning system design)
Priortizing what to work on Spam classification example
システムの設計について、スパムメールの判定をする例で説明する。
教師あり学習を実装するにあたり一番最初にやることは$X$をどう表現するか。
まず100個の単語を選ぶ。(スパムっぽい単語とかそうでない単語とか。)
※一般的には手動ではなく、トレーニングセットのメールの中で、頻出した単語の上位を選ぶ。
その単語がメールの中に登場したかどうかを0,1で表現し、Xの列ベクトルとする。
全てのXが出揃ったら、それを訓練してスパムメールの分類に使用する。
Error Analysis
エラー分析ではシステムで間違って分類されたものを人が見て、何らかのシステムで検知できる箇所が無いか分析する。
例えばミス分類されたメールの内容を分類する。(薬を売りつけるメール、偽物を売りつけるメール、フィッシングメール、その他 など)
それぞれ何件ミス分類があるか確認することで、多いところが弱いことがわかる。
弱いところのシステム的な条件を見つけてモデルに追加する。
Precision / Recall
予測値と結果を以下のように分類する
予測値 | 結果 | 分類 |
---|---|---|
Trueと予測 | True | True positive |
Trueと予測 | False | False positive |
Falseと予測 | True | False negative |
Falseと予測 | False | True negative |
Precision(精度) = P
$P = \frac{TruePositive}{TruePositive + FalsePositive}$
Recall(再現率) = R
$R = \frac{TruePositive}{TruePositive + FalseNegative}$
F1Score
$F_1Score = 2\frac{PR}{P+R}$
F1Scoreが高いPとRを使用するのが良い。