【Draft版公開】Machine Learning Yearning 11-12章 by stanford大学Andrew Ng教授

現在、AIや機械学習界隈で最も有名なスタンフォード大学のAndrew Ng教授が、「Machine Learning Yearning」という書籍を執筆中です。2018年4月に、そのドラフト版（1-19章）が公開されました。
この投稿では、いち早く本書籍を翻訳しました。

http://www.mlyearning.org/
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/188414/741778bb-9523-9feb-736b-6bd5aedc42e6.png)

この本は、機械学習プロジェクトの構築方法を提供します。また、機械学習アルゴリズムを教えるのではなく、機械学習アルゴリズムが機能する方法に焦点を当てています。

本投稿は、11章、12章の翻訳になります。少しづつ翻訳していきます。

##### **1～5章の翻訳**
[【Draft版公開】Machine Learning Yearning 1～5章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/2096b8806a20c8ca52be)

##### **6章の翻訳**
[【Draft版公開】Machine Learning Yearning 6章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/8ddf5f01a33bb049a907)

##### **7-8章の翻訳**
[【Draft版公開】Machine Learning Yearning 7～8章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/94a73dcba8bdde25e48b)

##### **9-10章の翻訳**
[【Draft版公開】Machine Learning Yearning 9～10章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/f074a6609ae034762150)


## **11. When to change dev/test sets and metrics（開発/テストセットや評価尺度を変更するべきはいつか）**
新しいプロジェクトを開始するときには、私は開発/テストセットをすばやく選択しようと心がけています。これは、チームが目指す目標を明確にします。私は通常、初期の開発/テストセットや評価尺度を1週間以内に考え準備することを目指すように、チームに言います。めったにこれを超えることはありません。不完全なものを思いついたら、考え抜くよりもむしろすぐに動き始めた方が良いと思います。
しかし、この1週間のタイムラインは、成熟したアプリケーションには適用できません。例えば、スパム対策は成熟したディープラーニングのアプリケーションです。私は、すでに成熟したシステムに取組んでいるチームが、さらに優れた開発/テストセットを獲得するために数カ月を費やすのを見ています。
もし、あとで最初に設定した開発/テストセットもしくは評価尺度が的外れであったことを悟った場合、何としてでもそれを素早く変更してください。例えば、もしあなたが保持する開発セットと評価尺度が分類器Aを分類器Bの上にランク付けた一方で、チームは分類器Bがより製品にあきらかにフィットしている（＝優れている）と考えられている場合、これは、開発/テストセットや評価尺度を変更する必要があるという兆候かもしれません。正しくない採点をした結果、分類器Aがより高く見積もられる開発セットや評価尺度を得てしまう原因は、大きく3つあります。

**1. 実際に学習すべき分布と開発/テストセットのデータの分布が異なっている**

あなたの最初の開発/テストセットが、大人の猫の写真を主に保持していたとします。あなたは猫の画像アプリをリリースし、ユーザが期待するよりも子猫の画像を多くアップロードしていることを見つけます。したがって、その開発/テストセットの分布は、あなたがうまく取り込むべき実際の分布を表すものではありません。
この場合、より代表性のある開発/テストセットに更新してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/b47213aa-8cf2-4d1c-82d6-8aecd80c3d13.png)

**2. 開発セットに対して、オーバーフィットしている**

開発セット上で繰り返しアイデア（idea）を評価するプロセスは、徐々にあなたのアルゴリズムを開発セットに**オーバーフィット**させます。
アルゴリズムの開発が完了したら、テストセット上であなたのシステムを評価します。もし開発セットのパフォーマンスが、テストセットよりもはるかに優れていたら、それは開発セットに対してオーバーフィットしているサインです。その場合には、新しく開発セットを取得してください。

もし、チームの進捗状況をトラッキングする必要がある場合、テストセット上でシステムを定期的に評価することもできます（1週間に1回、もしくは1カ月に1回）。
しかし、前週のシステムにロールバックするかどうか等、そのテストセットをアルゴリズムに関するいかなる意思決定にも使用しません。そうしてしまうと、テストセットに対するオーバーフィットが始まり、システムのパフォーマンスを完全にバイアス抜きで評価することができなくなります。


**3. 評価尺度は、プロジェクトが最適化すべきもの以外の何かを測定している**

あなたの猫のアプリケーションでは、評価尺度は分類器の正解率（accuracy）であるとしましょう。この評価尺度は、現在分類器Aが分類器Bよりも優れていると評価しています。しかし、両方のアルゴリズムを試してみると、分類器Aは偶発的にポルノ画像をすり抜けてしまっていることがわかりました。分類器Aが正解率が高くても、偶発的なポルノ画像が与える悪い印象は、そのパフォーマンスを受け入れられないことを意味します。あなたはどうしますか？
ここでは、分類器Bのアルゴリズムが分類器Anoアルゴリズムより優れているという事実を、この評価尺度（正解率）で特定することはできません。したがって、最善のアルゴリズムを選択する上で、その評価尺度を信じることができなくなります。すなわち評価尺度を変更する時期にきています。例えば、評価尺度を変更して、ポルノ画像を通過させないようにすることができます。信頼できる評価尺度がない状態で長時間続け、後戻りして手作業で分類作業を行うよりも、新しい評価尺度を選択し、チームの新しい目標を明示的に定義することを強く推薦します。

プロジェクト期間中、開発/テストセットや評価尺度を変更することはとても一般的なことです。初期の開発/テストセットや評価尺度は反復試行を素早く開始する手助けをします。開発/テストセットや評価尺度が、もはやあなたのチームを正しい方向へと導いていないことがわかったなら、直ぐにそれを変更し、新しい方向が正しいかどうか確認してください。これらの変更することは、さして大きな問題ではありません。

## **12. Takeaways: Setting up development and test sets（要点：開発/テストセットの準備について）**

* 将来取得したい、もしくはうまく動作させたいと考えるデータを反映している分布から、開発/ テストセットを選択してください。あなたの訓練データの分布と違う可能性があります。
* 可能であれば、同じ分布を持つ開発/テストセットを選んでください。
* チームが最適化するべき評価尺度を一つ選択してください。もし、気にかけている目標の指標が複数あるのであれば、単一の指揮に結合したあり、最適化尺度/最小限化尺度を定義することを考えてください。
* 機械学習は非常に反復的なプロセスです。あなたが満足のいく結果を得るまでに、数重のアイデアを試すことになるでしょう。
* 開発/テストセットや単一の評価尺度を利用すれば、反復施行を高速化し、より早くアルゴリズムを評価できるでしょう。
* 新たなアプリケーションの開発を始めるときは、開発/テストセットや評価尺度の確立を1週間以内にすすめます。成熟したアプリケーションのフィールドでは、より時間がかかります。
* 古いヒューリスティックな方法、すなわち訓練データと/テストデータを70%：30％に分割する方法は、大量のデータがある場合においては適用されません。開発/テストセットは、データの30%未満にすることができます。
* 開発セットのサイズは、アルゴリズムの精度の有意な変化を検出するに十分な大きさであるべきですが、必ずしも大量に必要なわけではありません。テストセットは、システムの最終的なパフォーマンスに対して、信頼性を与えるに十分な大きさでなくてはなりません。
* 開発/テストセットと評価尺度が、チームを正しい方向に向かわせていない場合には、即座にそれを変えるべきです。1. 開発セットのオーバーフィットがある場合には、より多くの開発セットを取得してください。2. 実際の分布と開発/テストセットの分布が異なる場合には、新しい開発/テストセットを準備してください。3. 評価尺度がもはやあなたが重要であると考えるものを測定していない場合、評価尺度を変更してください。