機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて

# はじめに

昨日のTwitterで書いたこちらが非常に反響を呼びました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">半年間かけたデータ解析の仕事が全くうまくいかなかった<br>今回の失敗は契約書に納品物を明記していなかったこと<br>機械学習の依頼は学習済みモデルのファイルを納品しただけでは、先方は検収できず、結果支払いを受けられない<br>この教訓をひとりでも多くの人に知ってもらいたい</p>&mdash; キカガク代表 吉崎亮介 (@yoshizaki_kkgk) <a href="https://twitter.com/yoshizaki_kkgk/status/932564375969284103?ref_src=twsrc%5Etfw">2017年11月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そうなんですよね。
全く先方が悪いわけでもなく、私自身が「機械学習のお仕事＝解析」だと思いこんでいたことが失敗の始まり。

結局のところ、機械学習系のプロダクトを依頼されて、学習済みモデルを作成して即納品とはいかず、検証結果を示されないと検収できないよとなってしまうので、結局アプリケーション側まで組み込まないと納得感はないんですよね。
この検証とは、訓練データと検証データを分けた時の、検証データに対する結果ではありませんよ？

実運用フェーズに載せた時にちゃんと動作するかといった検証なのです。

# 根本的な誤解

私自身、機械学習のプロダクトを開発して運用するまでの流れを以下のように考えていました。

![before.png](https://qiita-image-store.s3.amazonaws.com/0/130181/4e88a74b-5cc9-5c23-be38-4ef941b5b7c0.png)

これまでの私は「機械学習と一口にいっても、その多くの仕事が**データ整理**や**データの前処理**に費やされており、機械学習だけを勉強しても実務に入ることができるエンジニアにはなれませんよ」とお伝えしていました。
もちろん、今でもその言葉に間違いはないと確信しています。

しかし！

それだけではないのです。
データ整理をするためにSQLがかけて、データの前処理をするためにPythonを書けて、データ解析をするために難解な数学とライブラリを駆使できても、結局だめなのです。

ビジネス上の納品とは最終的なゴールに達さない限り、８０点で良いものではありません。
１００点以外納品はありえません。
９９点でもだめです。
お客様とすり合わせを行った仕様を１００％満たす製品を作って納品しないとだめなのです。

そう考えると、「人工知能（AI）・機械学習を使って何かしたい！」思っているお客様と協業していくためには、どのようなシチュエーションに遭遇するかをイメージしながら、ゴールを考えながら作っていかないと行けません。

# お客様との商談シミュレーション

>
先方「AIを使って○○したいんだけど、**この仕事**お願いできない？」

※この段階で気をつけないといけないことが、**この仕事**の範囲を明確にしてからスタートしないと、ビジネス上の１００点を取ることがかなり厳しくなるということです。

>
私「わかりました。では、目安として精度が○○%くらいといった目標はございますか？」
>
先方「○○％くらいは望ましいね〜。このぐらいいける？」
>
私「正直なところ、データを解析してみないとわかりませんね。。。」
>
先方「それはそうだと思うけど、**肌感でどう**？」
>
私「そのぐらいの精度であればであれば、達成できるような気がしますね。見極めのためにも、**PoC**（この業界の人がよく使う言葉で仮説検証のこと、Proof of Concept）を回してみませんか。」
>
先方「OK。いくらぐらいかかるの？」

ここで、ストップです。
「**肌感でどう？**」と私もよく聞く質問ではあるのですが、データ解析は実装して検証してみるまで、正直なんとも言えません。
とは言え、その分野での解析に関する経験があれば、基準値が○○％とすぐに答えられるかもしれません。
しかし、一旦言ってしまうと相手の期待値がそこまで上がってしまい、その期待値をなかなか下げることができないため、経験上それも言わないほうが良い気がしています（とは言え、未知のものに投資できないので、言わざるを得ないのですが、、、）。

そして、ここからが見積りの値段決めに入ります。

よくありがちな失敗としては、日頃解析業務を趣味等で行っており、**ライブラリの使い方を把握**されている方であれば、解析のテンプレートができているため、機械学習の実装に関しては１〜３日ほどあれば、実装完了して検証まで行えると思います。

しかし、お客様から受ける案件に関しては、**データを解析するまでの道のりが非常に長い**ことを忘れないようにしましょう。

その道程すべてを加味して、工程を分解し、そうしてようやく見積りを出すことができるため、絶対にその場で、
「じゃあ３日間ぐらいでできるので○○万円でどうでしょう？」
とは言わないように気をつけましょう。

# 例え話. 情報収集先がWebサイトの場合

## 依頼のはじまり

例えば、データの収集先（Webサイト）を指定されて、ここのデータを使って解析してほしいと言われた場合、
「あ、Webスクレイピングを最近勉強しているので、いけますよ！」
と答えてしまいますが、本当にそれで良いのでしょうか？

このお仕事の工程を分解していきましょう。

|工程|時間|補足|
|:--|:--|:--|
|Webスクレイピング|○○日|○○から○○の情報を取得|
|データ前処理1|○○日||
|データ解析|○○日|まず大雑把に解析|
|データ前処理2+解析|○○日|重要な特徴量探しと外部要因の検討|

と少し慣れている人だとこんな感じで考えるのではないでしょうか。
ちゃんと前処理の日程も確保しつつ、解析をした後にさらに前処理の手戻りが発生することも考慮できているため、割と手堅い計画になっていると思います。

>
私「では、このような日程で計画を立てたので、合計○○日で○○円でいかがでしょうか。」
>
先方「（おっ、結構高いな。AIエンジニアが高いとは聞いていたけれど、これほどまでとは。でも仕方ない。）わかりました。この金額で進めましょう。」

では、このまま解析を行ってうまくいったとしましょう。

>
私「先日依頼されておりました解析の結果がでました。まだPoC段階ですので、カリカリのチューニングとまでは手が及んでいませんが、訓練データに対して○○％の結果、検証データに対して○○％くらいの精度が出ましたね。基準としていたラインまでは達成できそうですね。」
>
先方「良いですね。この感じだと運用しながらさらにデータが集まっていくので、精度も上がっていき、かなり期待できますね。」

となり、これで検収完了！支払いへGo!といけば良いのですが、そうはいきません。

みなさんも依頼側の立場に立って考えてもらうと分かるのですが、
「これってアウトプットが報告書なので、信用はしているのですが、嘘か本当かがわかりません。」
と思いますよね？

そりゃそうです。

そうなるとどうなるかというと、**ちゃんと動作するまで、数日〜数ヶ月程度運用してみて、その様子を見たい**という話になります。

何回も言いますが、そりゃそうです。

## 大変な未来が見えてきた

そうなると実運用していくためには、**毎日情報を自動的に収集**して、**予測値を計算**して、**その結果を報告**出来るような仕組みを作らないといけません。
これってオフラインで解析していたときとは全く異なるスキルで、**Webによるシステム自動化**の知識が必須になってきます。
スキルセットとしては、以下のようなものがあります。

- サーバーでの環境構築（LinuxやDocker等）
- データベース（MySQL）
- Webアプリケーション（Ruby on Rails, HTML, CSS, JavaScriptなど）
- Web API（Python）
- Cron（定期実行）
- Webサーバー（NginxやApache）

こんなにリッチに作る必要はなかったりしますが、とは言え、このぐらいのスキルセットがないと、最終的な自動的に運用しながら報告できる仕組みづくりを行うことはできません。

たとえば、私が納品しているようなケースだと解析を終えた後に、仮の検証を行うための仕組みとして以下のような構成を作っています（各サーバーが1Dockerコンテナ）。

![システム構成.png](https://qiita-image-store.s3.amazonaws.com/0/130181/57ccc93a-6d26-125e-2789-776ba8619c3a.png)

こうなると、全く今までの予算では足りなく、確保していた時間に関しても全然足りないわけです。

とは言え、依頼側からすると、実運用しながら検証してもらえないと納得して支払いができないため、やっぱりこのあたりは必要になってくるケースが多いかと思います。

# 総括
機械学習案件を依頼された時は、納品物を明確にしておきましょう。
相手方の不安に寄り添いながら進めていく必要があるため、ちゃんと長い目でみて運用できるような仕組みを考えて、その分の予算を確保しておくようにしましょう。

「検証とは、検証データに対する結果をみることではなく、仮運用をはじめた後に得られる結果を見ることである」

そのため、お客様と考えていくべき納品フローはこのようになります。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/130181/ec993881-7aa0-4e50-73e8-fe530ddbcf93.png)

仮運用には、Webアプリケーション等のViewも必要になるケースがありますので、ご注意ください（簡単なのはSlackボット）。

それでは、今回は私の猛省も兼ねた振り返りでした。

ひとりでも多くの方が、幸せな機械学習案件に携われますように。


# 著者紹介
株式会社キカガク
代表取締役社長　吉崎 亮介（twitter: [@yoshizaki_kkgk](https://twitter.com/yoshizaki_kkgk)）