技術覚書

自分のために技術的なことを色々と書こうと思います。

【読んでみた】仕事ではじめる機械学習(1章:機械学習プロジェクトのはじめ方)

まとめはこちら

「仕事ではじめる機械学習」の第1章を読みました。

目次

1章:機械学習プロジェクトのはじめ方

機械学習プロジェクトの流れ

  1. 問題を定式化する
  2. 機械学習をしないで良い方法を考える
  3. アルゴリズムを選定する
  4. 特徴量、教師データとログを設計をする
  5. 前処理をする
  6. 学習・パラメータチューニング
  7. システムに組み込む

問題を定式化する

「プロジェクトの目的」と「解き方」をセットで考えることが大切。

具体的でアクション可能なレベルまでブレイクダウンする。

指標(KPI)を決める。

アクションがすぐ起こせない曖昧なものや目的がよくわからないのはNG。

(良い例)

  • ECサイトの売上をあげるために、ユーザ毎におすすめ商品を提示する
  • 工場の電力消費量を最適化するために、消費電力を予測する

(悪い例)

  • 有料会員を増やしたい ⇒ どうやって?アクションがすぐ起こせない。
  • 深層学習ですごいことをする ⇒ もはや目的がよくわからない。

機械学習をしないで良い方法を考える

機械学習を含んだシステムは通常のシステム以上に技術的負債*1が蓄積しやすい。

 

機械学習を利用するなら、ビジネス上の課題に対して以下の条件を満たすことが大切

  • 大量のデータに対して、高速に安定して判断を求める必要がある
  • 予測結果には、一定数の間違いが含まれることが許容できる

条件が整ったら小さくはじめる(MVP*2

システム設計を考える

設計の上で重要なポイント

  • 予想結果をどういう形で利用するのか
  • 予想誤りをどこで吸収するのか

アルゴリズムを選定する

採択するアルゴリズムを決める指針は「2章 機械学習で何ができる?」で後述。


特徴量、教師データとログを設計をする

  • 特徴量・・・機械学習の予測モデルに入力する情報
  • 教師データ・・・「教師あり学習」正解ラベルと元となるデータのセット
  • ログ・・・教師データのもととなるデータとしてWebアプリで出るログを使ったりすることもある。ログを設計するタイミングに合わせて、思いつく特徴量を列挙しておくとよい。

前処理をする

機械学習をするために不要なデータをそぎ落としたり利用できるよう整形したりする作業。

(P.13)

実際のWebログなどの生データはテキスト形式だったり、すぐにそのまま使えるデータではありません。数値データも、センサーデータが一部取得できていないことによる欠損値と呼ばれるデータの処理や、異常な値を除外したり、値の取りうる幅の影響を受けないように正規化したりといった作業が必要です。テキストデータの場合には、単語に分割して頻度を数えたり、低頻度語を除去したりという調整を行います 

 ネットで色々みていると機械学習の中でここが一番大変な作業らしい。

この作業だけで本が一冊出てるくらいのレベル。

学習・パラメータチューニング

 決めたアルゴリズムを使って、パラメータ調整をしながら良い結果が出るように調整する。

一発目で99.9%のような高い予測精度が出たら過学習、Data Leakageを疑うこと。

 

システムに組み込む

組み込む時、予測性能とそれに伴うビジネスインパクトをモニタリングすること。

予測性能のモニタリングにはあらかじめ人手で用意したデータと正解ラベルのセット((これを「ゴールドスタンダード」という)を使って予測性能を計測する。

実システムにおける機械学習の問題点への対処方法

問題点

  1. 確率的な処理があるため自動テストがしにくい
  2. 長期運用しているとトレンドの変化などで入力の傾向が変化する
  3. 処理のパイプラインが複雑になる
  4. データの依存関係が複雑になる
  5. 実験コードやパラメータが残りやすい
  6. 開発と本番の言語/フレームワークがバラバラになりやすい

対処法

  1. 人手でゴールドスタンダードを用意して、予測性能のモニタリングをする
  2. 予測モデルをモジュール化してアルゴリズムのA/Bテストができるようにする
  3. モデルのバージョン管理をして、いつでも切り戻し可能にする
  4. データ処理のパイプラインごとに保存する
  5. 開発/本番環境の言語/フレームワークは揃える

要はこういうことですかね。

  • テストデータ重要
  • モジュールは小さく分割する。大きなモジュールはテストできない。
  • バージョン管理しましょう
  • 開発/本番環境は限りなく同じにする

機械学習だけに限った話じゃないですね。

機械学習を含めたシステムを成功させるには

以下の4人がチームで必要。

  1. プロダクトに関するドメイン知識を持った人
  2. 統計や機械学習に詳しい人
  3. データ分析基盤を作れるエンジニアリング能力のある人
  4. 失敗しても構わないとリスクを取ってくれる責任者

とくに4.だろうなぁ。

権限を持っている人をいかにして根回しして味方につけて

お金をがっちり確保するか!

この章のまとめ

  • 解くべき問題の仮説を立て、MVPを作りコンセプトの検証を最優先にする
  • 機械学習しないことを恐れない
  • 機械学習に適している問題設定かを見極める
  • 予測性能とKPIの両方のモニタリングをし、継続して改善を続ける。

参考

仮説検証とサンプルサイズの基礎 - クックパッド開発者ブログ

プロトタイプで終わらせない死の谷を超える機械学習プロジェクトの進め方 #MLCT4

失敗から学ぶ データ分析グループの チームマネジメント変遷 (デブサミ2016) #devsumi

Ponanza開発者、山本一成氏が語る強化学習とA/Bテスト運用の舞台裏 - ログミーTech


*1:リリースを優先するがあまり、問題を先送りにして残ったもの。ドキュメント・テストコードがないとか設計がぐちゃぐちゃとか

*2:Minimum Viable Product。最低限の顧客価値を生み出す最小のプロダクト