「仕事ではじめる機械学習」のメモ

仕事ではじめる機械学習
オライリー・ジャパン
有賀康顕、山中心太、西林孝

読んだので、印象的だった部分をメモする。

本の内容と構成

機械学習についてベースとなる知識は知っているけど、それを実際に業務に適用させるにはどうしたら良いのかといった、現実の課題解決にフォーカスした内容だった。そのため、具体的な実装や数式関しては多くは紹介されていない(Jupyterのサンプルコードが利用できる https://github.com/oreilly-japan/ml-at-work)。詳しい内容を学べる文献も多く紹介されていた。構成は以下の通り。

  • 機械学習をプロジェクトに導入し、運用する話
    • プロジェクトの進め方
    • アルゴリズムの選定と評価
    • システムへの組み込み
    • データ収集
    • 効果検証
      • 効果の有り無しを統計的に検定する話がメイン
  • 実践的な内容を3つの例で紹介
    • 映画の推薦システム(協調フィルタリング、Factorization Macine)
    • Kickstarterの分析(機械学習しない例、Excel)
    • Uplift Modeling(DMのコンバージョンアップ、A/Bテスト)

 

まとめ

  • 最低限の数学と機械学習の基本を知っていることが望ましい
    • CourseraのMachine Learningのオンラインコース(https://www.coursera.org/learn/machine-learning
    • ゼロから作るディープラーニング – Pythonで学ぶディープラーニングの理論と実装
    • Pythonではじめる機械学習
    • Python機械学習プログラミング 達人データサイエンティストによる理論と実践
    • PythonユーザのためのJupyter[実践]入門

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

  • 解きたい課題を機械学習で解ける問題設定に落とし込む
  • 解くための道具選びと前処理
    • 3. システム設計を考える
      • ここを過ぎると実際に手を動かすフェーズのため、ここまでに目標性能と撤退ラインを決めておく
    • 4. アルゴリズムを選定する
    • 5. 特徴量、教師データとログの設計をする
      • カテゴリカル変数とダミー変数
    • 6. 前処理をする
  • モデルの設計
    • 7. 学習・パラメータチューニング
      • 過学習(Overfitting): 学習データに最適化しすぎて、未知のデータで適切に予測できない状態
      • Data Leakage: 学習時に知り得ないはずのデータを混ぜて学習させてしまうこと
  • サービスへの組み込み
    • 8. システムに組み込む

※人が正解を決められない問題は、機械にも解くことができない
※機械学習の課題解決事例を見るときのポイント:アルゴリズム、特徴量、組み込み方(この引き出しがないと「機械学習でなにかすごいことをしたい」という上司が現れ、うまくいかずに終わる可能性があり危険)
※4〜7の試行錯誤が何度も繰り返すため、効率よく試行錯誤する必要がある

 機械学習を用いるシステム構築の難しさ
  • 確率的な処理があるため自動テストがしにくい
    • 意図しない予測結果が出てしまったときに後から介入できる仕組みを用意しておくことが重要
  •  長期運用しているとトレンドの変化などで入力の傾向が変化する
    • 文章に含まれる単語のポジネガの意味合いの変化や用法の変化
  • 処理のパイプラインが複雑になる
  • データの依存関係が複雑になる
  • 実験コードやパラメータが残りやすい
  • 開発と本番の言語/フレームワークがばらばらになりやすい

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

その他ポイント
  • 機械学習を利用できるビジネス上の課題
    • 大量のデータに対して、高速に安定して判断を求める必要がある
    • 予測結果には、一定数の間違いが含まれることが許容できる
  • システム設計のポイント
    • 予測結果をどういう形で利用するのか
    • 予測誤りをどこで吸収するのか
  • 過学習の防ぎ方
    • 交差検証(Cross Validation)でパラメータチューニング
    • 正則化(Regularization)する
    • 学習曲線(Learning Curve)を見る
  • 開発時にはKPIを改善していることを忘れない
    • ダッシュボードを作ったり、異常時にはアラートを飛ばすなど、アクションをいつでも取れる体制が重要
  • 成功に重要な人
    • プロダクトに関するドメイン知識を持った人
    • 統計や機械学習に明るい人
    • データ分析基盤を作れるエンジニアリング能力のある人
    • 失敗してもかまわないとリスクを取ってくれる責任者

機械学習で何ができる?

  • 機械学習の種類と特徴
    • 分類
      • 教師あり
      • パーセプトロン(Perceptron)
        • オンライン学習で学習
        • 予測性能そこそこ、学習は早い
        • 過学習しやすい
        • 線形分離可能(Linearly Separable)な問題のみ解ける
        • ヒンジ損失(Hinge Loss)を使う
        • 決定境界は直線
        • 活性化関数がステップ関数(Step Function)
      • ロジスティック回帰(Logistic Regression)
        • 出力とは別に、その出力のクラスに所属する確率値が出せる
        • オンライン学習でも、バッチ学習でも可能
        • 予測性能はまずまず、学習速度は速い
        • 広告のクリック予測にもよく使われている
        • 決定境界は直線
        • 活性化関数がシグモイド関数(Sigmoid Function)
        • 損失関数が交差エントロピー誤差関数(Cross-entropy Error Function)
        • 過学習を防ぐための正則化項(Regularization Term)(罰則項(Penalty Term))が加わっている
      • SVM(Support Vector Machine)
        • マージン最大化することで、なめらかな超平面を学習できる
        • カーネル(Kernel)と呼ばれる方法を使い、非線形なデータを分離できる(RBFカーネル)
        • 線形カーネルなら次元数の多い疎なデータも学習可能
        • バッチ学習でもオンライン学習でも可能
        • ヒンジ損失を使うが、ロスが0になる交点がパーセプトロンとは異なる(マージンがある)
      • ニューラルネットワーク(Neural Network)
        • パーセプトロンを1つのノードとして階層上に重ねたもの
        • 非線形なデータを分離できる
        • 学習に時間がかかる
        • パラメータの数が多いので、過学習しやすい
        • 重みの初期値に依存して、局所最適化にはまりやすい
        • 活性化関数には、ReLU(Rectified Linear Unit)が近年ではよく使われる
      • k-NN法(k近傍法、k-Nearest Neighbor Method)
        • 最近傍探索のアルゴリズム
        • 未知のデータが入力されたときに、そのデータの近くのk個の既知データの所属するクラスの多数決で決める
        • 類似アイテムを探索する使い方も可能
        • データを1つずつ逐次学習する
        • 基本的に全データとの距離計算をする必要がある、予測に時間がかかる
          • ユークリッド距離(Euclidean Distance)
          • マハラノビス距離(Mahalanobis Distance)
        • kの数によるがそこそこの予測性能
      • 決定木(Decision Tree)
      • ランダムフォレスト(Random Forest)
      • GBDT(Gradient Boosted Decision Tree)
        • 学習したモデルを人間が見て解釈しやすい
        • 入力データの正規化がいらない
        • カテゴリ変数や欠損値などを入力しても内部で処理してくれる
        • 特定の条件下では過学習しやすい傾向にある
          • 枝刈り(剪定、Pruning)
        • 非線形分離可能だが、線形分離可能な問題は不得意
        • クラスごとのデータ数に偏りのあるデータは不得意
        • データの小さな変化に対して結果が大きく変わりやすい
        • 予測性能はまずまず
        • バッチ学習でしか学習できない
      • ナイーブベイズ(Naive Bayes): テキスト分類などでよく使われる
      • HMM(隠れマルコフモデル、Hidden Markov Model): 音声認識で伝統的に使われてきた
    • 回帰
      • 教師あり
      • パーセプトロンの二値化の部分がなくなり、数値を直接出力するものと同じ
      • 線形回帰(Linear Regression)
        • 直線で近似
      • 多項式回帰(Polynomial Regression)
        • 曲線で近似
      • Lasso回帰(ラッソ回帰、Lasso Regression)
        • 学習した重みの絶対値を正則化項(L1正則化)に追加
        • 幾つかの重みが0になり、特徴を絞り込む性質がある
      • Ridge回帰(リッジ回帰、Ridge Regression)
        • 学習した重みの2乗を正則化項(L2正則化)に追加
      • Elastic Net(エラスティックネット)
        • L1正則化とL2正則化を追加
        • 幾つかの重みが0になり、特徴を絞り込む性質がある(L1正則化の特徴)
      • 回帰木
        • 非線形なデータに対してフィッティングできる
      • SVR(Support Vector Regression)
        • SVMベースの回帰で、非線形なデータに対してもフィッティングできる
    • クラスタリング
      • 教師なし
      • 他のクラスタリング手法と傾向
      • 階層的クラスタリング: 似ている組み合わせを順番にまとめていく
      • k-means: 距離の近いもの同士をk個のグループに分割する
    • 次元削減
    • その他
      • 推薦
      • 異常検知
      • 頻出パターンマイニング
      • 強化学習
        • 牧野貴樹, 澁谷長史, 白川真一ら. これからの強化学習, 森北出版, 2016

アルゴリズム選択フローチャート

※パーセプトロン、ロジスティック回帰、SVM、ニューラルネットワークは、超平面を表現する関数を学習する

  • 損失関数(Loss Function)、誤差関数(Error Function)
    • 真の値と予測値とのずれを表す関数
  • 目的関数(Objective Function)、評価関数
    • どれくらいモデルがデータに合っているかを表す関数
  • 確率的勾配降下法(Stocastic Gradient Descent、SGD)
    • 目的関数の山の上から谷に向かって少しずつ降りることで、最適なパラメータを得る
  • 活性化関数(Activation Function)
    • 出力値を非線形に変換する関数
  • 正則化(Regularization)
    • 学習時にペナルティーを与えることで、決定協会を滑らかにする働きを持つ
    • モデルをシンプルに保つための補正項
  • SVMのカーネル
    • 擬似的に特徴量を追加して高次元のベクトルに変換することで線形分離可能にする
      • 線形カーネル(Linear Kernel)
        • テキストなどの高次元で疎なベクトルのデータによく使われる
      • 多項式カーネル(Polynomial Kernel)
      • RBFカーネル(Radial Basis Function Kernel、動的基底関数カーネル)
        • 画像や音声信号などの密なデータによく使われる

学習結果を評価しよう

  • 正解率: 予測が正解した数 / 予測した全データ数
  • 適合率: あるクラスの実際の数 / あるクラスに分類された数
  • 再現率: あるクラスに分類され正解した数 / あるクラスの実際の数
  • F値: 適合率と再現率の調和平均
  • 混同行列
  • ROC曲線(Receiver Operating Characteristic Curve)、AUC(Area Under the Curve)
  • 平均二乗誤差(RMSE: Root Mean Squared Error)
  • 決定係数R2(Coefficient of Determination)

システムに機械学習を組み込む

  • バッチ処理で学習 + 予測結果をWebアプリケーションで算出(リアルタイム処理で予測)
  • バッチ処理で学習 + 予測結果をAPI経由で利用する(リアルタイム処理で予測)
  • バッチ処理で学習 + 予測結果をDB経由で利用する(バッチ処理で予測)
  • リアルタイム処理で学習をする

学習のためのリソースを収集しよう

いかにして教師データを集めるかで、友人知人を活用してラベル付けしてもらう手法や、クラウドソーシングを活用する方法などが紹介されていた。

  • 公開されたデータセットやモデルを活用する
  • 開発者自身が教師データを作る
  • 同僚や友人などにデータ入力してもらう
  • クラウドソーシングを活用する
  • サービスに組み込み、ユーザに入力してもらう

映画の推薦システムを作る

  • 協調フィルタリング
  • 内容ベースフィルタリング
  • ユーザ間型協調フィルタリング
    • ユーザの情報をベクトルで表現
    • ユーザ間がどれくらい似ているか類似度を決める
      • ピアソンの相関係数、コサイン類似度、ジャッカー度係数など
    • 類似度基づいて評価値を算出する
  • アイテム間型協調フィルタリング
  • メモリベース協調フィルタリング
  • モデルベース協調フィルタリング
  • Matrix Factorization
    • 2軸
    • 疎なデータを扱える
  • Factorization Machine
    • 複数の特徴量使える
    • 疎なデータを扱える
    • 特徴量間の影響を考慮できる、相関関係がある特徴量も適切に扱える
    • Adomavicius, Gediminas, and Alexander Tuzhilin. Context-aware recommender Systems.

 

投稿者: sussan_0416

さいたま市に住む一児のエンジニア。出身は北海道札幌市、学生時代に過ごした函館が好き。仕事はiOS・Androidのスマホアプリ開発。前職では、広告配信を最適化する機械学習システムの開発(Python)、アドサーバのAPI(PHP)を担当。