後輩に「TrainとかTestとかValidとか分けるんですね」と言われたので

# はじめに
ふと後輩から「機械学習する時って，データセットがあったとしたら Train と Test と Valid に分けなきゃいけないらしいんですよね，どうしてなんですか？Train だけでよくないですか？」というめちゃめちゃいい質問をもらったので，素人ながらにお返事をしてみたよというレポートです．確かに自分もこの分野で研究をし始めた時に迷ったことがあったなぁと懐かしい気持ちでお話をしていました．というか，質問してくれてありがとうってめっちゃ心の底から思いました．

# Train? Test? Valid?
### ① 例えで説明してみた編
仮にたこ焼き屋さんでバイトをし始めるとする．(関西人アピールを忘れない)
一人前になるまでには **大きく３つのフロー** が必要になる．
**1.** **先輩に教えてもらう**
君は何もわからない状態からスタートするから，先輩に色々教えてもらうよね．すると，もしいい先輩に当たれば ([まさに "Garbage In, Garbage Out"](https://arxiv.org/pdf/2107.02278v1.pdf))，ちゃんと上達するだろうね．

<div align="center">
<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/9c4e1c83-c73b-af19-07f4-173f4f3a429d.png" alt="属性" title="タイトル">
</div>

**2.** **自分のベストコンディションを模索する**
けれども，その教えてもらったこととは別に君がまだ試していないことがある．例えばたこ焼きをクルクル回すピックが金属製なのか？プラスチック製なのか？それとも竹串なのか？どれでやれば一番上手く行くかはまだ試していないはず．他の要素として，どんな靴を履いた方が自分のベストコンディションが出せるのかも試せてないはず．
つまり，先輩からスキルを教えてもらう**以前に**自分のベストコンディションが出せる状態を知っておかなければいけない．

<div align="center">
<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/b47af182-367b-a2e6-88d4-9086425b415d.png" alt="属性" title="タイトル">
</div>

**3.** **他の店舗でも力を発揮できるようになる**
一方で，自分の店舗だけで上手に焼けても，ちょっと環境が変わると急に上手に焼けなくなるとしたら，それは大きな問題になる．バイトなら他店舗への応援とかもあるだろう．というわけで，君は「"**いい**"先輩から教えてもらって」かつ「自分のベストコンディション状態」を知っていてもまだなお，知らない環境でも力を発揮できるとは限らないのである．
よくいるじゃないか，自分の学校のテニスコートだと上手いのに遠征に行くと急に弱くなるタイプの選手．結局，**未知の状態でも大丈夫になってこそ一人前** なのである．

<div align="center">
<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711990/845c458f-fd06-a221-e29d-d1a27b5eee76.png" alt="属性" title="タイトル">
</div>


さて，この「先輩から教えてもらう」のが Train で，「自分のベストコンディションが出せる状態の模索」が Test で，「未知の状態でのチェック」が Valid にあたるというのが例えで説明してみた編のオチである．

### ② ちゃんと機械学習っぽく説明してみた編
1. **まず目的の動作に対して訓練をする**
Train データを用いて，ある Input から目的の Output が得られるように訓練する． 

1. **そもそもの訓練パラメータが大丈夫かを確認する**
訓練時にはハイパーパラメータという事前に設定したパラメータに基づいて訓練をする．例えば SVM における gamma や C といったパラメータがこれにあたる．他にも NN における Dropout 率や Optimizer がこれにあたる．そのため，Test データを用いて，そもそも訓練の前提となっている条件が最適かどうかを，これを用いて評価しなければならないのである．つまり，**Test データ自体は訓練に用いられず，訓練の前提条件を見直す目的で使われる**のである．

1. **未知のデータに対する汎化性を評価**
Valid データは未知のデータで，Train および Test を用いた訓練・調整の結果得られたモデルに対してもちゃんと精度が出るかどうかを評価するのに用いられる．**もちろん，場合によっては Test で調整したベストコンディションは実は汎化性がないかもしれないし，そもそも Train で用いられているデータは偏りまくってて全く汎化性が無い可能性もある．**

そして，Test や Valid は訓練に用いられているわけではないので，訓練の過程で Train に対する精度が上がっていったとしても Test や Valid の精度が低ければこれは汎化性能を獲得していると言えないので，**過学習** (Over-Fitting) ということになるのである．

# さいごに (なんだかんだ一番言いたかったことかも)
基礎の基礎ってなかなか質問するのが恥ずかしいことですけど，ちゃんと質問をしてくれた後輩に僕は大きく拍手を送りたいなと思いました．
自分も学部時代，指導教員と先輩が「アノテーションが〜」と話している間「？」となりながら小一時間話を聴き続け，終わった後先輩に「すいません...『あのてーしょん』？ってなんですか？」と恐る恐る質問したのをなんとなく覚えています．
「gg れよ」とか「自分でやれよ」とかいう気持ちもわからないでもないんですが，[Google も 15 分ルールだと言ってることですし](https://twitter.com/math_rachel/status/764931533383749632?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E764931533383749632%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fflowthink.jp%2Ftechnique%2F15min-rule%2F)，初学者の方々は，
1. まず自分で少しでもいいから調べてみる
1. そして分からなければ仲間に**やったこと**をありのまま伝える (**←重要!!これを言わないと門前払いを喰らいがち!!**)
1. それでも分からなかった旨を伝えて相談に乗ってもらう

というフローをちゃんと経ることができるなら，僕は質問は全然積極的にしていいと思います．初学者のうちって，gg るのすら難しいですからね．知らない概念を調べろという方が無理だと僕は思ってます．エンジニアとしてだけじゃなく，仲間として大事なことだなぁと思いました，というタイトル詐欺の啓蒙思想布教のお話でした．

## と，いいながら
間違ったことを教えていたら恥ずかしいので，コメントでご指摘などいただければ幸いです...

# 参考文献
1. “Garbage In, Garbage Out” Revisited: What Do Machine Learning Application Papers Report About Human-Labeled Training Data? https://arxiv.org/pdf/2107.02278v1.pdf

2. Google 15 分ルール https://twitter.com/math_rachel/status/764931533383749632?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E764931533383749632%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fflowthink.jp%2Ftechnique%2F15min-rule%2F