kakakakakku blog

Weekly Tech Blog: Keep on Learning!

現場の視点で機械学習に必要な知識を学べる「仕事ではじめる機械学習 第2版」を読んだ

「仕事ではじめる機械学習 第2版」を読んだ.実は「第1版」を買ってずっと積読をしていたところに「第2版」が出たので書い直した📖書名に「仕事ではじめる」と書いてある通り,現場の視点で理解しておくべき「機械学習」の知識がまとまっていて良かった.そして,本当に読みやすく挫折させないように工夫して書かれているのも素晴らしかった!読書メモを見返しながら書評記事をまとめる.

目次

「第I部」では幅広く知識を学び「第II部」ではケーススタディから学ぶ.流れるように最後まで読み進めることができる.「第1版」と比較すると「MLOps」「解釈性」など,重要なトピックが追加されているため,間違いなく「第2版」を読むべきだと思う.

また本書を読んでいて個人的に感じたのは「関連するけど詳しくは扱わないトピック」に関しては注釈などを使って関連情報(ドキュメントやブログなど)にうまく誘導していた.よって,興味があったら追加で調べることにより,本書を超えて知識を獲得できる仕組みになっている点も良かった.

  • 第I部
    • 1章 : 機械学習プロジェクトのはじめ方
    • 2章 : 機械学習で何ができる?
    • 3章 : 学習結果を評価するには
    • 4章 : システムに機械学習を組み込む
    • 5章 : 学習のためのリソースを収集する
    • 6章 : 継続的トレーニングをするための機械学習基盤
    • 7章 : 効果検証:機械学習にもとづいた施策の成果を判断する
    • 8章 : 機械学習のモデルを解釈する
  • 第II部
    • 9章 : Kickstarter の分析、機械学習を使わないという選択肢
    • 10章 : Uplift Modeling によるマーケティング資源の効率化
    • 11章 : バンディットアルゴリズムによる強化学習入門
    • 12章 : オンライン広告における機械学習

なお「第2版」の誤植は以下にまとまっている.載っていないものだと以下を発見した.

  • P.81
    • 真陽性率と縦軸、偽陽性率を横軸にプロット真陽性率を縦軸、偽陽性率を横軸にプロット

github.com

前提

本書の冒頭に「二冊目として活用する」と読者層が紹介されている.具体的には「Coursera : Machine Learning」を受講したり「ゼロから作る Deep Learning」を読んだ次に読むべしと書いてある.僕自身は「機械学習図鑑」「Pandas ライブラリ活用入門」を読んだり,Kaggle Courses を試したりしているため,ピッタリ読者層だった.実際に「第1版」を買って積読をしてしまった理由は「前提知識が足りなくて理解しにくかった」となるため,今はより自信を持って読めるようになったと感じる.

機械学習プロジェクト

1章「機械学習プロジェクトのはじめ方」は,技術職に限らず「機械学習に興味のある人なら」誰もが読むべき内容になっていた.機械学習を導入することを「目的」にせず,あくまで「手段」としてビジネスに活用するべきという視点が重要で「機械学習をしなくて良い方法を考える」というのはまさに!という感じだった.例えば,9章「Kickstarterの分析、機械学習を使わないという選択肢」も Excel でここまで深く分析できる!ということに気付かされる内容になっている.そして「システム設計を考える」では「具体的な目標性能と撤退ラインを決めておく」とも書いてある.サンクコストを考慮しつつ「撤退する判断」も現場では重要になりそうだと感じた.

  • ビジネス課題を機械学習の課題に定式化する
  • 類似の課題を、論文を中心にサーベイする
  • 機械学習をしなくて良い方法を考える
  • システム設計を考える
  • 特徴量、教師データとログの設計をする
  • 実データの収集と前処理をする
  • 探索的データ分析とアルゴリズムを選定する
  • 学習、パラメータチューニング
  • システムに組み込む

試して学べるサンプルコード

本書は読者を挫折させないように工夫して文章が書かれているだけではなく,図解や簡単なサンプルコードを使った解説も充実している.サンプルコードは GitHub に Jupyter Notebook として公開されているため,「1周目」は本書をザッと読んで「2周目」は気になったところを試しながら学ぶこともできる.

github.com

例えば,3章「学習結果を評価するには」では,分類と回帰それぞれの評価指標が解説されている.分類の評価指標として「F 値」以外に使うことができる「ROC 曲線と AUC」もあり,scikit-learn のサンプルコードを書き換えながら試行錯誤ができる.

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve

#
# AUC = 0.8333333333333333
#

y_pass = [0, 0, 0, 1, 0, 0, 1, 0, 1, 1]
y_score = [0.1, 0.2, 0.4, 0.45, 0.5, 0.65, 0.7, 0.8, 0.85, 0.95]

fpr, tpr, thresholds = roc_curve(y_pass, y_score)

plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR: False Positive Rate')
plt.ylabel('TPR: True Positive Rate')
plt.grid()

#
# AUC = 1.0
#

y_perfect = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
y_score_perfect = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

fpr, tpr, _ = roc_curve(y_perfect, y_score)

plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR: False Positive Rate')
plt.ylabel('TPR: True Positive Rate')
plt.grid()

f:id:kakku22:20211128192027p:plain f:id:kakku22:20211128192036p:plain

MLOps

「第2版」で追加された6章「継続的トレーニングをするための機械学習基盤」では,最近特によく聞くようになった MLOps という概念を学べる.DevOps などの文脈で出てくる CI (Continuous Integration) / CD (Continuous Delivery or Continuous Deployment) に CT (Continuous Training) を追加することで,機械学習プロジェクトを継続的に進めるための心得を学べる.また本書では,以下のドキュメントで紹介されている MLOps のレベルをよりわかりやすく整理されている.

  • 共通の実験環境
  • 予測結果のサービング
  • 学習,予測共通の処理のパイプライン化
  • モデルの継続的トレーニング・デプロイ

cloud.google.com

そして,MLOps を実現するために使えるツールの選択肢は多岐にわたるため,本書では概要レベルでたくさん紹介されていた.一部を抜粋すると,Amazon SageMaker / MLflow / Hydra / Apache Airflow / Kubeflow など(正確には並列に列挙するのは正しくないけど).このあたりは興味のあるところから入門したいと思う.ツールの選択肢をポインタとして知ることができただけでも価値があった.

解釈性

同じく「第2版」で追加された8章「機械学習のモデルを解釈する」では,「Explainable AI(説明可能な AI)」とも言われるトピックで「解釈性(どの特徴量が寄与していたのか?など)」をサンプルコードを使って体験できる.今回は Kaggle に公開されている「退職予測データセット」を使って「線形回帰(回帰係数と切片)」「決定木」「ランダムフォレスト」それぞれで解釈性を可視化する方法を学べる.

IBM HR Analytics Employee Attrition & Performancewww.kaggle.com

例えば「ランダムフォレスト」では SHAP を使って(解釈可視化ツール)を使って,「解釈性」を可視化する.

github.com

以下を見ると,例えば「OverTime_Yes(残業の有無)」「MonthlyIncome(月収の低さ)」が影響していることを確認できたりする.

f:id:kakku22:20211128192016p:plain

まとめ

「仕事ではじめる機械学習 第2版」を読んだ.ザッと「1周目」を読んでから「2周目」ではサンプルコードを試したりしていた.並行して Kaggle Courses なども活用しつつ,理解度が上がってきたため,読書メモを見返しながら書評記事にまとめた.この記事では紹介しきれないほどに素晴らしい一冊なので是非読んでみると良いのではないでしょうか!