Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群

6,187 views

Published on

2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群

Published in: Technology
  • Be the first to comment

2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群

  1. 1. きちんと知りたいApache Spark ∼機械学習とさまざまな機能群 株式会社リクルートテクノロジーズ アドバンスドテクノロジーラボ 石川有
  2. 2. 本発表の想定聴講者とゴール • 想定している聴講者 • CTOや技術選択の責任者レベルの方 • Spark の機械学習ライブラリの初学者 • ゴール • Sparkのデータサイエンス関連の Top-Level API は企業における • 「実践」を意識して作られていることを知っていただく • スケーラブルな機械学習アルゴリズムが簡単に利用できる • 実践的な機械学習に必要な一連の複雑な処理も簡単に利用できる • 本発表では話さないこと • Spark の分散処理のやキャッシュの仕組み • Spark のクラスタ管理やチューニング • 個別の機械学習アルゴリズムの具体的な解説 など 2
  3. 3. Talk Overview • Spark 関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 3
  4. 4. Apache Sparkとは? • 大規模データを処理するための分散処理システム • Speed, Easy of Use, Generality, Runs Everywhere • 「ポスト Hadoop MapReduce」の有力候補 • リリース頻度:約3ヶ月に1回リリース • 現在の stable バージョンは 1.5 • 次のバージョン 1.6 はおそらく 12 月初旬にリリース見込み • プログラミングインタフェース: • 企業におけるデータ分析シーンに対応 • バッチ,ストリーミング,インタラクティブ(探索的分析) • 標準で機械学習,グラフ処理などのコンポーネントを備えている 4
  5. 5. Spark Components 5
  6. 6. サポートしているデータソース 6
  7. 7. Talk Overview • Spark 関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • FAQ • まとめ 8
  8. 8. Spark Components 9 spark.mllib
  9. 9. MLlib のミッション • プロダクションレベルでの機械学習を簡単にスケーラブル で実行できるようにする • 機械学習アプリケーションを簡単に構築 • 大規模データセットでの学習を可能にする • Spark 0.8 から開発が始まる • 現在では累計で 50+ の企業,100+ の個人が開発に参加 • 分散機械学習アルゴリズムは日々追加されています • 1.6 でリリース予定の bisecting k-means の実装を担当 • 開発を通して得た知見はまた別の機会で話したいと思います 10
  10. 10. MLlib-specific Contribution Guidelines • Be widely known • Be used and accepted • academic citations and concrete use cases can help justify this • Be highly scalable • Be well documented • Have APIs consistent with other algorithms in MLLib that accomplish the same thing • Come with a reasonable expectation of developer support. 11 [https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark]
  11. 11. MLlib で実装されている手法 12
  12. 12. レコメンドアルゴリズム ALS の 単純な実行方法 val ratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) 13 Data (CSV) Load Data Train Model Evaluate user_id product_id rating 473 348 0.8 5623 87583 0.3 6545 9382 0.5 234 246 0.6
  13. 13. レコメンドアルゴリズム ALS の 単純な実行方法 val ratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) val als = new ALS.setRank(10).setIterations(10) val model = als.run(ratings) 14 Data Loa Data Train Model Evaluate レコメンド手法のひとつである ALS のオブジェクトを生成して訓練
  14. 14. レコメンドアルゴリズム ALS の 単純な実行方法 val ratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) val als = new ALS.setRank(10).setIterations(10) val model = als.run(ratings) val userId = 12345 val productId = 987654 model.predict(userId, productId) 0.4… 15 Data Loa Data Train Model EvaluateTop-level API がよくデザインされているので 非常に簡単に機械学習ライブラリが使える
  15. 15. ALSのベンチマーク • データセット:Amazon Reviews Dataset • データサイズ: 660万ユーザ, 220万アイテム • クラスタサイズ:m3.2xlarge x 16 16 cited by: Xiangrui Meng: A More Scaleable Way of Making Recommendations with MLlib
  16. 16. MLlib の ALS について詳しく知りたい方は 「レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証」 http://www.slideshare.net/recruitcojp/sparkmapreduce 17
  17. 17. Talk Overview • Spark 関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 18
  18. 18. Spark Components 19
  19. 19. DataFrame API 20 age prefecture name 34 Tokyo **** 41 Osaka **** 27 Saitama **** 24 Chiba **** // 都道府県ごとのユーザの平均年齢を計算 data.groupBy(“prefecture”).ave(“age”) // 年齢 25 歳以上のユーザ数 data.filter(“age >= 25”).count() // SQL でも記述できる data.sql(“select age from user_table”) データ分析でよく使われる機能を DSL として提供 Hive などのデータソースにも対応 user_table
  20. 20. DataFrame の豊富なビルドイン関数 • 日付け関数,数学関数,文字列関数など標準サポート • UDFで独自の関数も簡単に作成できる 21
  21. 21. Spark をネイティブで書くより早い 22 cited by: Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data DataFrame API を利用すれば 少ないコードでより高速に処理することができる
  22. 22. Talk Overview • Spark 関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 23
  23. 23. Spark Components 24 spark.ml spark.mllib
  24. 24. 実装面から見れば 25 MLlib DataFrame ML Pipeline
  25. 25. Simple ML Pipeline 26 Data Feature Extraction Train Model Final Model
  26. 26. Our Task • レビュー (review) のテキストから評価 (rating) を予測 27 review Model rating String Int
  27. 27. Load Data • Data Schema • label: Int • text: String 28 Load Data Feature Extraction Train Model Evaluate
  28. 28. Feature Extraction • Data Schema • label: Int • text: String • words: Seq[String] • features: Vector 29 Load Data Hashed Term Freq. Train Model Evaluate Tokenizer Transformer
  29. 29. Train a Model • Data Schema • label: Int • text: String • words: Seq[String] • features: Vector • prediction: Int 30 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer Transformer Estimator
  30. 30. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") 31 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  31. 31. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) 32 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  32. 32. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) 33 Pipeline Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  33. 33. Simple ML Pipeline 34 Data Feature Extraction Train Model Final Model
  34. 34. A Little Simple ML Pipeline 35
  35. 35. ML Pipelines for Test 36 Pipeline Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  36. 36. Pipeline API for Test val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) model.transform(test) 37 Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  37. 37. 結果のイメージ 38 review Model rating String Int
  38. 38. Practical ML Pipeline is Complicated! 39 Data Image! Parser Normalizer Convolver sqrt,mean Zipper Linear Solver Symmetric! Rectifier ident,abs ident,mean Global Pooler Patch! Extractor Patch Whitener KMeans! Clusterer Feature Extractor Label! Extractor Linear! Mapper Model Test! Data Label! Extractor Feature Extractor Test Error Error! Computer No Hyperparameters! A few Hyperparameters! Lotsa Hyperparameters
  39. 39. Parameter Tuning 40 Hashed Term Freq. Logistic Regression Evaluate Tokenizer hashingTF.numFeatures {10, 20, 40} lr.regParam {0.01, 0.1, 0.5} Pipeline
  40. 40. Cross-Validation 41
  41. 41. Practical Spark ML Pipeline API val paramGrid = new ParamGridBuilder() .addGrid(hashingTF.numFeatures, Array(10, 20, 40)) .addGrid(lr.regParam, Array(0.01, 0.1, 0.5)) .build() 42
  42. 42. Practical Spark ML Pipeline API val paramGrid = new ParamGridBuilder() .addGrid(hashingTF.numFeatures, Array(10, 20, 40)) .addGrid(lr.regParam, Array(0.01, 0.1, 0.5)) .build() val cv = new CrossValidator() .setNumFolds(3) .setEstimator(pipeline) .setEstimatorParamMaps(paramGrid) .setEvaluator(new BinaryClassificationEvaluator) val cvModel = cv.fit(trainingDataset) 43 Parameter Tuning も Cross-Validation も API が用意されているので複雑な PIpeline も簡単に定義
  43. 43. Model export/import for Pipeline API is coming soon! 44 Pipeline Load Data Hashed Term Freq. Logistic Regression Tokenizer save Model Load Model Evaluate モデルを保存することで 再構築の必要がなく再利用が簡単
  44. 44. Talk Overview • Spark 関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 45
  45. 45. まとめ • Spark は企業における3つの分析シーンに対応 • バッチ,ストリーミング,インタラクティブ(探索的分析) • DataFrame API は大規模分散処理の探索分析をより身近なものにする • SQL で実行することもできる • Hive などのさまざまなデータソースをサポート • 最適化機構により「ネイティブ」に Spark のコードを書くより早くなる • Spark の機械学習ライブラリ MLlibで,プロダクションレベルでの機械学習を簡単 にスケーラブルで実行できる • 機械学習アプリケーションを簡単に構築 • 大規模データセットでの学習を可能にする • Pipeline API を利用することで「実践」での複雑化する ML Pipeline の管理が簡単 46 Sparkのデータサイエンス関連の Top-Level API は 企業における「実践」を意識して作られていることを知っていただく

×