機械学習案件を料理に例えると分かりやすい件

# はじめに

前回の記事『[**機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて**](https://qiita.com/yoshizaki_kkgk/items/fa8b45918445bb3e6dc3)』に多くの反響があり、現時点で1000近い、いいねを頂きました。
まだまだ発展途上の業界でもあり、かつ私自身も起業直後で経験不足といったところで生じた問題ではあったのですが、「**失敗談の共有は尊い**」といった嬉しいコメントもいただきました。

私は[**株式会社キカガク**](https://www.kikagaku.co.jp/)という会社で機械学習に関する教育（主に数学やプログラミング）を行っておりますが、今後はこういった**ビジネスサイドでのフロー**や**モデルの運用フロー**までフォローしていくのが本当の教育だと思っています。

その中で、今回は**現場でよく生じるある問題**に関して、フォーカスを当ててお話をします。

## 現場でのよくある話のはじまり

[**キカガク**](https://www.kikagaku.co.jp/)のセミナーや個人で頑張って勉強し、**現場で機械学習案件にアサインされた方々に待っているある問題**をご存知でしょうか。

それは「**人に伝えること**」です。

営業の方であればお客様先へ、エンジニアの方であればプロジェクトのマネージャーへ状況を伝える必要があります。

プロジェクトを進める以上はひとりではなく複数人のケースが大半であり、もちろんその中には、機械学習を学んでいない方もたくさんいると思います。
その方々に、うまく自分自身の仕事について伝えたり、採用した機械学習アルゴリズムの中身について**数式を用いずに伝える**必要が出てきます。

みなさんは、どのようにしてこの問題を解決されているでしょうか。


この問題をすごくスムーズに解決してくれる例え話が『**料理**』ではないかと思っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/ea67fd09-82aa-9737-7ef7-3548223e6480.png)


# 『機械学習』と『料理』は工程が似ている

たとえば、『**あるレストランでお客様に提供するメニューを作成したい**』といった工程が『**機械学習プロジェクトをうまく安定運用させたい**』といった工程と似ていると思います。

[**前回の記事**](https://qiita.com/yoshizaki_kkgk/items/fa8b45918445bb3e6dc3)でも書いていましたが、機械学習のプロジェクトを推進していく流れは以下の通りです。
※ 今回は仮運用と検証を一緒にまとめています。

![機械学習.png](https://qiita-image-store.s3.amazonaws.com/0/130181/12f1f87d-9755-7248-232d-0fa5f6683c0d.png)

そして、レストランであるメニューを作っていく工程は以下の流れではないでしょうか。

![料理.png](https://qiita-image-store.s3.amazonaws.com/0/130181/2694f8ae-1e17-ea8e-7d02-e711ca555384.png)

それでは、それぞれの工程について例えとともに見ていきましょう。

# 『データ収集・整理』＝『買い物』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/f209c96b-16cd-9391-630f-19b72233f676.png)

機械学習の案件で、まず一番最初に取り組むべきこととして、**データの収集と整理**が必ずあります。
既にこのデータが揃っている状況であればかなりラッキーですが、『**揃っているデータ=使えるデータ**』でもないケースが多く、結局『**使えるデータの収集**』は機械学習のことを詳しく知っている人でないとできません。
そのため、工数の見積りに入れ忘れてはいけない工程のひとつです。

『**解析をお願いしていて、データ揃えるのもお金払わないといけないの？**』
と言われた際には、
『**料理の依頼をして材料の買い出しの時間にはお金を払わないことありますか？**』
と尋ねると納得してもらえるかも知れません。

料理を行うためには、もちろん一番最初に、**決めた料理を作るために必要な材料をリストアップ**して、**材料の売っているスーパーを調査**して、**材料をスーパーに購入**しに行く必要があります。
もちろん、**料理のことを知らないで揃えられた材料で、決めた料理を作ることができるわけない**ですよね？
これが『**揃っているデータと使えるデータが違う**』ということです。
もちろん、与えられた材料の中でなんとか料理を作って欲しいという依頼であれば、ありあわせの材料で作った賄いを作ることができますが、**本当に食べたい料理を作るのであれば、シェフに材料の調達も任せるべき**なのです。
シェフが材料のリストアップを行い、買い物はアルバイトに任せるなどして行い、美味しい料理を作るために適切な材料を揃えてくれるはずです。

そのため、機械学習エンジニアには、**必要な材料のリストアップを行うスキル**や**どの部署（スーパー）に行けば欲しいデータ（材料）が手に入るか**を知る必要があります。
リストアップを行う際には、カッコを付けずに、現場でのヒアリングが一番効果が高く、私は現場に出向いて職人の方に**どこに着目しているか？**といった要因に関する話を尋ねるようにしています。
案外、この要因をしっかり聞くだけで、データを解析する前から重要な変数への目処をつけることができ、少ない変数の数でも精度を高められるというのが、個人的な経験談です。

# 『データ前処理＝下ごしらえ』

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/fef4f2b7-e6ff-a221-234c-415b3623f1e7.png)

いつもよく言っている話ですが、**データの整理や前処理にデータ解析プロジェクトの大半の時間を費やします**。
とは言え、なかなかデータ解析の作業風景をイメージできない方にとっては、この現実が受け入れられるものではありません。
解析を始めれば、「**どう？成果出た？**」と聞かれる日々で、その質問のたびにテンションが下がってしまう人も多いのではないでしょうか。

その際には、『**まだ野菜の皮剥きといった調理のための準備に時間をかけているので、まだ料理が出来上がった報告はできないのです**』というと少しは納得してもらえるかも知れません。

それでも納得してもらえない場合は、
『**どれだけ優れたコックがいたとしても、エビの殻をむかずに調理すれば、それでお客様が満足できる料理にはならないのではないでしょうか**』
というと、もう少し説得力が増し、前処理の時間も必要だと理解してもらえるかも知れません。

# 『データ解析（主に機械学習）＝調理』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/9831ced2-6db4-263d-29a4-50f31a7f1591.png)

材料の準備が終わると、煮るなり焼くなりして、材料をひとつの形にまとめ上げます。
決して、全ての材料（データ）に対して『**焼く**』といった手法が適切ではなく、材料（データ）によっては『**煮る**』方が適切な場合もあります。
また、状況によっては、『**煮た後に焼く**』といった合わせ技もあるかも知れません。

そんな『**煮る**』や『**焼く**』などの調理法ひとつひとつに対応するものが**機械学習のアルゴリズム**です。

『**万能な調理法はありませんよ**』とお伝えすると、『**それは素材によって違いますもんね**』と納得していただけますが、
『**今回はディープラーニングより適切な手法があると思いますがいかがでしょうか？**』と提案すると、がっかりされるケースも少なからずあります。

そして、受講生の方々も『**ディープラーニングを学びたい！**』というモチベーションの強い方が多くいらっしゃいますが、データやクライアントの要望に合わせて手法は**ケースバイケースで選択**するため、それぞれの手法を広く理解しておくことをおすすめします。
（焼くだけを覚えればプロとして大丈夫と教える料理の専門学校があるでしょうか？）

とは言え、**ディープラーニングでの適用範囲は他の手法と比べると広い**ため、幅広い料理に使える**中華鍋**（調理法ではありませんが）ぐらいの位置付けかもしれません。


## 『オーバーフィッティング＝コックの主観』

![3275.png](https://qiita-image-store.s3.amazonaws.com/0/130181/d9dc4b64-6fb1-4419-6497-4d589a4eb287.png)

機械学習には**オーバーフィッティング（過学習）**と呼ばれる**訓練データではばっちりと精度が出る**のですが、実運用を始めると、まったく精度がでないと言う現象にしばしば遭遇します。

調理を行っているコック（学習用のデータ）としては、『**抜群に美味しい料理ができた！**』と思っていても、**それが世間一般として美味しい**とは限らないのです。
これがオーバーフィッティングの原因です。

そうならないためにも、コックは他の人に味見（検証）をしてもらって、世間一般の美味しいに合わせた料理を作れるようになる必要があります。

## 『訓練データと検証データ＝コックとテスター』

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/7cd901f4-5eeb-5eb9-670f-3471bfc3df27.png)

オーバーフィッティングの対策として、コックの主観（訓練データ）だけでなく、他の人の意見（味見）を聞く必要があります。

そのため、機械学習では、手持ちのデータを**訓練データ**と**検証データ**に分割して、訓練データはモデルの学習に使用して、検証データはモデルの精度を確認するために使用します。
イメージとしては、**他のコックに味見**をしてもらったり、**テスターを招いて味見**をしてもらって美味しいかを**客観的**に判断してもらう作業です。

ここで大事な点としては、『**30代女性に好かれる料理**』と定めた場合、その**ペルソナに合った人**に味見のテストを依頼する必要があります。
これは機械学習の検証データ選びと同じで、予測したいと定めている状況（ペルソナ）において、予測精度が良いことを確かめる必要があるため、全てのデータに対して予測精度が高い必要はありません。

## 『ハイパーパラメータのチューニング＝最後の塩コショウ』

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130181/ae6c05ea-4010-e2e2-efdb-61483b6f05d0.png)

機械学習では**ハイパーパラメータ**と呼ばれる人間側で調整すべき変数が存在します。
これもなかなか伝わりづらかったりするのですが、料理も完成間近に**塩コショウなどで最後の味付け**を行いますよね？
これと同じで、機械学習においても**最終的なチューニング**が必要となります。

この**ハイパーパラメータがどこに存在するかよくわからないといった悩み**から数学をちゃんと勉強される方が多いです。
このご時世、優秀なライブラリの登場により、ほとんどがプログラミングだけで機械学習を実装出来るようになっていますが、この最後の味付けのポイントを抑えておかないと最後の最後に締まりのない結果（味）となります。
そういった悩みまで到達してから数学を学び始めても大丈夫ですし、やはり原理がわからないと気持ち悪くて始められないという方は、最初から数学とプログラミングを１セットで勉強することをおすすめします。

# 『検証＝お客様へ提供』
<img width="426" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/130181/0d7e584a-436b-5688-014c-373fd9a01cba.png">

[前回の記事](https://qiita.com/yoshizaki_kkgk/items/fa8b45918445bb3e6dc3)でも書いていましたが、
『**検証とは、検証データに対する結果をみることではなく、仮運用をはじめた後に得られる結果を見ることである**』
だと考えています。

そのため、実際にお客様へ提供して初めて本当のターゲットからの評価が得られ、そちらが本当の意味での**検証**となります。
美味しくなければ注文の数が減っていき、美味しければ注文の数が増えるといった本番での検証を行うことができます。

そのため、検証とは３段階あり、『**コックが味見（訓練データに対する検証）**』、『**テスターが味見（検証データに対する検証）**』、『**店のお客様に提供して調査（仮運用を始めた後に得られるデータに対する検証）**』です。

ここで気をつけないといけないこととしては、テスターでの味見でクライアントが納得するのではなく、基本的にはそのレストランに来るお客様が喜ぶかどうかを確認するまでは、プロジェクトの完結ではないということです。

ここで、３段階目でも高評価であれば、**定番メニュー化（本運用）**となります。


# おわりに

いかがでしたでしょうか。
機械学習の工程を料理で例えると、落とし穴のポイントであったり、どのくらい重要で時間がかかる作業であるかが、少しは見えてくるかもしれません。

ぜひ、クライアントとの交渉を行う際に、わかりやすい例として使っていただければ幸いです。

他にも、この例はわかりやすいよ！というものがありましたら、こちらの記事に追記させていただきますので、コメントいただけますと嬉しいです。

長文お読みいただき、ありがとうございました。

# 著者紹介
<img src='https://qiita-image-store.s3.amazonaws.com/0/130181/profile-images/1506322419' width='200px'>
株式会社キカガク
代表取締役社長　吉崎 亮介（twitter: [@yoshizaki_kkgk](https://twitter.com/yoshizaki_kkgk)）

一緒に機械学習の教育を推進してくださるメンバーを募集しています！
ぜひ、[Twitter](https://twitter.com/yoshizaki_kkgk)からメッセージお待ちしています！