Mahoutイン・アクション

[cover photo]
  • 2012年10月 発行
  • 448ページ
  • ISBN978-4-87311-584-9
  • フォーマット Print PDF
  • 原書: Mahout in Action

オライリー・ジャパンで書籍を購入:
定価4,320円

Ebook Storeで電子版を購入:
価格3,456円

Apacheプロジェクトが提供するオープンソースの機械学習ライブラリ、Mahoutについて包括的に解説する書籍です。協調フィルタリングによるレコメンデーションについて、オンメモリ実装からHadoopベースの並列実装までを説明することで、分散環境における機械学習アルゴリズムの全体像を明らかにします。また、データの中で似た者同士をクラスタにグループ化するクラスタリングアルゴリズムに触れ、さらに分類器の構築、サンプルデータを使って「学習」させる方法を説明します。実装例を示しながら実践的に解説する本書は、Mahoutをマスターしたいエンジニア必携の一冊です。

関連書籍

Cassandra
Hadoop Hacks
Hadoop MapReduce デザインパターン
HBase
オープンソースで学ぶ社会ネットワーク分析
集合知プログラミング
入門 自然言語処理

序文
訳者まえがき
はじめに

1章 Apache Mahoutへようこそ
    1.1 Mahoutものがたり
    1.2 Mahoutが扱う機械学習の分野
        1.2.1 レコメンデーションエンジン
        1.2.2 クラスタリング
        1.2.3 分類
    1.3 MahoutとHadoopで大規模にスケールさせる
    1.4 Mahoutのセットアップ
        1.4.1 JavaとIDE
        1.4.2 Mavenのインストール
        1.4.3 Mahoutのインストール
        1.4.4 Hadoopのインストール
    1.5 まとめ
第1部 レコメンデーション

2章 レコメンダの紹介
    2.1 レコメンデーションを定義する
    2.2 初めてのレコメンデーションエンジンの実行
        2.2.1 入力データを作成する
        2.2.2 レコメンダを作成する
        2.2.3 出力を解析する
    2.3 レコメンダを評価する
        2.3.1 データの学習とスコア付け
        2.3.2 RecommenderEvaluatorを実行する
        2.3.3 結果を評価する
    2.4 適合率と再現率を評価する
        2.4.1 RecommenderIRStatsEvaluatorを実行する
        2.4.2 適合率と再現率の問題
    2.5 GroupLensのデータセットを評価する
        2.5.1 レコメンダの入力を取り出す
        2.5.2 他のレコメンダを試してみる
    2.6 まとめ

3章 レコメンダのデータを表現する
    3.1 プリファレンスデータの表現
        3.1.1 Preferenceオブジェクト
        3.1.2 PreferenceArrayと実装
        3.1.3 コレクションの速度向上
        3.1.4 FastByIDMapとFastIDSet
    3.2 インメモリDataModel
        3.2.1 GenericDataModel
        3.2.2 ファイルベースのデータ
        3.2.3 再読み込み可能なコンポーネント
        3.2.4 更新ファイル
        3.2.5 データベースに基づくデータ
        3.2.6 JDBCとMySQL
        3.2.7 JNDIを介して設定する
        3.2.8 プログラムで設定する
    3.3 プリファレンス値がない場合の処理
        3.3.1 いつ値を無視するか
        3.3.2 プリファレンス値がない場合のインメモリの表現
        3.3.3 互換性のある実装を選択する
    3.4 まとめ

4章 レコメンデーションする
    4.1 ユーザベースのレコメンデーションを理解する
        4.1.1 レコメンデーションがうまくいかないとき
        4.1.2 レコメンデーションがうまくいくとき
    4.2 ユーザベースのレコメンデーションについて学ぶ
        4.2.1 アルゴリズム
        4.2.2 GenericUserBasedRecommenderを使ったアルゴリズムを実装する
        4.2.3 GroupLensで試す
        4.2.4 ユーザの近傍を調べる
        4.2.5 固定サイズの近傍
        4.2.6 しきい値ベースの近傍
    4.3 類似性指標について学ぶ
        4.3.1 ピアソンの相関係数に基づく類似度
        4.3.2 ピアソンの相関係数の問題
        4.3.3 重み付けを適用する
        4.3.4 ユークリッド距離により類似度を定義する
        4.3.5 コサイン類似度を使う
        4.3.6 スピアマンの相関係数による相対順位によって類似度を定義する
        4.3.7 Tanimoto係数により類似度におけるプリファレンス値を無視する
        4.3.8 対数尤度検定を使ってより賢い類似度を計算する
        4.3.9 プリファレンスを推測する
    4.4 アイテムベースのレコメンデーション
        4.4.1 アルゴリズム
        4.4.2 アイテムベースのレコメンダについて学ぶ
    4.5 slope-oneレコメンダ
        4.5.1 アルゴリズム
        4.5.2 実用におけるslope-one
        4.5.3 DiffStorageとメモリに関する考察
        4.5.4 事前計算を分散する
    4.6 新しい実験的なレコメンダ
        4.6.1 特異値分解に基づくレコメンダ
        4.6.2 線形補間によるアイテムベースのレコメンデーション
        4.6.3 クラスタベースのレコメンデーション
    4.7 他のレコメンダとの比較
        4.7.1 コンテンツベースの技術をMahoutに投入する
        4.7.2 コンテンツベースのレコメンデーションをより詳細に見てみる
    4.8 モデルベースのレコメンダとの比較
    4.9 まとめ

5章 実環境におけるレコメンダ
    5.1 出会い系サイトのサンプルデータを分析する
    5.2 効果的なレコメンデーションエンジンを見つける
        5.2.1 ユーザベースのレコメンダ
        5.2.2 アイテムベースのレコメンダ
        5.2.3 slope-oneレコメンダ
        5.2.4 適合率と再現率を評価する
        5.2.5 性能を評価する
    5.3 ドメイン固有の情報を挿入する
        5.3.1 カスタムなアイテム類似性指標を使用する
        5.3.2 コンテンツに基づいてレコメンドする
        5.3.3 IDRescorerを用いてレコメンデーションを修正する
        5.3.4 IDRescorerを使って性別を取り入れる
        5.3.5 カスタムレコメンダをパッケージ化する
    5.4 匿名ユーザにレコメンドする
        5.4.1 PlusAnonymousUserDataModelを用いて一時的なユーザを作成する
        5.4.2 匿名ユーザの情報を集約する
    5.5 Web上で利用できるレコメンデーションエンジンを作成する
        5.5.1 WARファイルをパッケージ化する
        5.5.2 Web上で動作確認する
    5.6 レコメンデーションエンジンの更新と監視
    5.7 まとめ

6章 レコメンデーションの計算を分散する
    6.1 ウィキペディアのデータセットを解析する
        6.1.1 規模と格闘する
        6.1.2 分散コンピューティングの利点と欠点を評価する
    6.2 分散型のアイテムベースのアルゴリズムを設計する
        6.2.1 共起行列を構築する
        6.2.2 ユーザベクトルを計算する
        6.2.3 レコメンデーションを生成する
        6.2.4 結果を理解する
        6.2.5 分散実装に向けて
    6.3 MapReduceを使って分散アルゴリズムを実装する
        6.3.1 MapReduceとは
        6.3.2 MapReduceに変換する:ユーザベクトルの生成
        6.3.3 MapReduceに変換する:共起を計算する
        6.3.4 MapReduceに変換する:行列の積を見直す
        6.3.5 MapReduceに変換する:部分積を利用した行列の掛け算
        6.3.6 MapReduceに変換する:レコメンデーションの生成
    6.4 HadoopでMapReduceを実行する
        6.4.1 Hadoopをセットアップする
        6.4.2 Hadoopでレコメンデーションを実行する
        6.4.3 MapperとReducerを設定する
    6.5 レコメンダを擬似分散する
    6.6 レコメンデーションの初めの一歩の次に
        6.6.1 クラウドで実行する
        6.6.2 レコメンダの特殊な利用法を想像する
    6.7 まとめ
第2部 クラスタリング

7章 クラスタリングとは
    7.1 クラスタリングの基本
    7.2 アイテムの類似度を測る
    7.3 クラスタリングの簡単なサンプルを実行する:Hello World
        7.3.1 座標を入力する
        7.3.2 Mahoutのクラスタリング機能を使ってみる
        7.3.3 出力結果を分析する
    7.4 さまざまな距離測度を検討してみる
        7.4.1 ユークリッド距離
        7.4.2 ユークリッド平方距離
        7.4.3 マンハッタン距離
        7.4.4 コサイン距離
        7.4.5 Tanimoto距離
        7.4.6 重み付き距離
    7.5 さまざまな距離測度を使ってみる:再び「Hello World」
    7.6 まとめ

8章 データを表現する
    8.1 ベクトルを視覚化する
        8.1.1 データをベクトルに変換する
        8.1.2 Mahoutで利用するためのベクトルを準備する
    8.2 テキストドキュメントをベクトルで表現する
        8.2.1 TF-IDFを使って重みを改善する
        8.2.2 Nグラムの連語により単語の依存関係を説明する
    8.3 ドキュメントからベクトルを生成する
    8.4 正規化によりベクトルの質を向上させる
    8.5 まとめ

9章 Mahoutにおけるクラスタリングアルゴリズム
    9.1 k平均法クラスタリング
        9.1.1 k平均法について知っておくべきこと
        9.1.2 k平均法クラスタリングを実行する
        9.1.3 キャノピークラスタリングを用いて理想的なkを発見する
        9.1.4 ケーススタディ:k平均法を使ってニュース記事をクラスタリングする
    9.2 k平均法の次に:クラスタリング手法の概要
        9.2.1 異なる種類のクラスタリングの問題
        9.2.2 異なるクラスタリングのアプローチ
    9.3 ファジィk平均法クラスタリング
        9.3.1 ファジィk平均法を実行する
        9.3.2 どれくらいのファジィさ(曖昧さ)が妥当か
        9.3.3 ケーススタディ:ファジィk平均法を使ったニュース記事のクラスタリング
    9.4 モデルベースのクラスタリング
        9.4.1 k平均法の問題
        9.4.2 ディリクレクラスタリング
        9.4.3 モデルベースのクラスタリングの例を実行する
    9.5 潜在的ディリクレ配分法を使ったトピックモデリング
        9.5.1 潜在的ディリクレ配分法を理解する
        9.5.2 TF-IDFとLDA
        9.5.3 LDAのパラメータの調整
        9.5.4 ケーススタディ:ニュースのドキュメントのトピックを見つける
        9.5.5 トピックモデリングの応用
    9.6 まとめ

10章 クラスタリングの質の評価と向上
    10.1 クラスタリングの結果を詳しく調べる
    10.2 クラスタリングの結果を分析する
        10.2.1 距離測度および特徴を選択する
        10.2.2 クラスタ間およびクラスタ内の距離
        10.2.3 クラスタの混合とオーバラップ
    10.3 クラスタの質を向上させる
        10.3.1 文書ベクトルの質を向上させる
        10.3.2 距離測度をカスタマイズする
    10.4 まとめ

11章 実環境でのクラスタリング
    11.1 Hadoop上でクラスタリングを実行するためのクイックスタートガイド
        11.1.1 ローカルなHadoopクラスタ上でクラスタリングを実行する
        11.1.2 Hadoopの設定をカスタマイズする
    11.2 クラスタリングの性能をチューニングする
        11.2.1 CPUの制約を受ける操作での性能の落とし穴を回避する
        11.2.2 I/Oの制約を受ける操作での性能の落とし穴を回避する
    11.3 バッチクラスタリングとオンラインクラスタリング
        11.3.1 ケーススタディ:ニュース記事のオンラインクラスタリング
        11.3.2 ケーススタディ:ウィキペディアの記事をクラスタリングする
    11.4 まとめ

12章 実世界におけるクラスタリングアプリケーション
    12.1 Twitter上で似たユーザを見つける
        12.1.1 データの前処理と特徴の重み付け
        12.1.2 特徴選択において、よく陥る落とし穴を避ける
    12.2 Last.fmのアーティストのタグをサジェストする
        12.2.1 共起を利用したタグのサジェスト
        12.2.2 Last.fmのアーティストの辞書を作成する
        12.2.3 Last.fmタグを、アーティストをその特徴とするVectorに変換する
        12.2.4 Last.fmのデータに対しk平均法を実行する
    12.3 Stack Overflowのデータセットを解析する
        12.3.1 Stack Overflowのデータセットを解析する
        12.3.2 Stack Overflowにおけるクラスタリング問題を見つける
    12.4 まとめ
第3部 分類

13章 分類とは
    13.1 なぜ分類にMahoutを使うのか
    13.2 分類システムの基礎
        13.2.1 分類とレコメンデーション、クラスタリングの違い
        13.2.2 分類の用途
    13.3 分類の動作
        13.3.1 モデル
        13.3.2 学習と評価、運用
        13.3.3 説明変数と目的変数
        13.3.4 レコード、フィールド、値
        13.3.5 説明変数の値の4つの型
        13.3.6 教師あり学習と教師なし学習
    13.4 典型的な分類プロジェクトにおけるワークフロー
        13.4.1 段階1:分類モデルの学習のワークフロー
        13.4.2 段階2:分類モデルの評価のワークフロー
        13.4.3 段階3:運用におけるモデルの利用ワークフロー
    13.5 ステップ・バイ・ステップで見るシンプルな分類の例
        13.5.1 利用するデータと問題
        13.5.2 モデルの学習をしてcolor-fillを見つける:予備的考察
        13.5.3 モデルの学習を行う学習アルゴリズムを選択する
        13.5.4 color-fill分類器の性能を改善する
    13.6 まとめ

14章 分類器を学習させる
    14.1 Mahoutの分類器を構築するための特徴を抽出する
    14.2 生データを前処理し分類可能なデータにする
        14.2.1 生データの変換
        14.2.2 計算処理によるマーケティング分析の例
    14.3 分類可能なデータをベクトルに変換する
        14.3.1 データをベクトルで表現する
        14.3.2 Mahout APIを利用した特徴ハッシング
    14.4 20のニュースグループのデータセットをSGDで分類する
        14.4.1 はじめに:データセットの事前確認
        14.4.2 20のニュースグループのデータの特徴を解析しトークン化する
        14.4.3 20のニュースグループのデータのための学習コード
    14.5 分類器の学習を行うアルゴリズムを選択する
        14.5.1 非並列だが強力:SGDとSVMを利用する
        14.5.2 単純分類器の力:単純ベイズと補完型単純ベイズを利用する
        14.5.3 緻密な構造の強み:ランダムフォレストを利用する
    14.6 20のニュースグループのデータを単純ベイズで分類する
        14.6.1 はじめに:単純ベイズのデータ抽出
        14.6.2 単純ベイズ分類器の学習を行う
        14.6.3 単純ベイズモデルを評価する
    14.7 まとめ

15章 分類器を評価してチューニングする
    15.1 Mahoutにおける分類器の評価
        15.1.1 迅速なフィードバックを得る
        15.1.2 「良い」とは何かを決める
        15.1.3 間違いによるコストの差を認識する
    15.2 分類器の評価API
        15.2.1 AUCの計算
        15.2.2 混同行列とエントロピー行列
        15.2.3 平均対数尤度を計算する
        15.2.4 モデルを解剖する
        15.2.5 20のニュースグループに対するSGD分類器の性能
    15.3 分類器が失敗する場合
        15.3.1 目的変数リーク
        15.3.2 間違った特徴抽出
    15.4 チューニングして性能を良くする
        15.4.1 問題を調整する
        15.4.2 分類器をチューニングする
    15.5 まとめ

16章 分類器を運用する
    16.1 大規模なシステムにおける運用までのプロセス
        16.1.1 問題を詳しく調べる
        16.1.2 必要に応じて特徴抽出の最適化を行う
        16.1.3 必要に応じてベクトルエンコーディングの最適化を行う
        16.1.4 分類器サービスをスケーラブルにデプロイする
    16.2 規模と速度の要件を決める
        16.2.1 「大規模」というのはどれくらいの大きさか
        16.2.2 規模と速度のバランス
    16.3 大規模システム向けの学習パイプラインを構築する
        16.3.1 大規模データの取得と保有
        16.3.2 非正規化とダウンサンプリング
        16.3.3 学習で陥りがちな罠
        16.3.4 データの読み取りとエンコーディングの高速化
    16.4 Mahout分類器を組み込む
        16.4.1 事前に計画を立てる:統合に関する重要な問題
        16.4.2 モデルのシリアライズ
    16.5 Thriftフレームワークを用いた分類サーバの例
        16.5.1 分類サーバを実行する
        16.5.2 分類器サービスにアクセスする
    16.6 まとめ

17章 ケーススタディ:Shop It To Me
    17.1 Shop It To MeがMahoutを採用した理由
        17.1.1 Shop It To Meは何をする会社か
        17.1.2 Shop It To Meが分類システムを必要とした理由
        17.1.3 Mahoutが他を圧倒する
    17.2 Eメールのマーケティングシステムの構成概要
    17.3 モデルを学習する
        17.3.1 分類プロジェクトの目的を定義する
        17.3.2 時間で分割する
        17.3.3 目的変数リークを避ける
        17.3.4 学習アルゴリズムの修正
        17.3.5 特徴ベクトルのエンコーディング
    17.4 分類の速度を向上させる
        17.4.1 特徴ベクトルの線形結合
        17.4.2 モデルのスコアの線形拡張
    17.5 まとめ

付録A JVMのチューニング

付録B Mahout mathモジュール

付録C 参考文献

付録D Amazon Elastic MapReduceを利用したレコメンデーション
索引

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]