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.

2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016

7,874 views

Published on

An overview of Spark MLlib

Published in: Data & Analytics

2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016

  1. 1. Spark MLlib Now and Beyond 株式会社リクルートテクノロジーズ アドバンスドテクノロジーラボ 石川有
  2. 2. 発表のねらい • エンジニアの方: • MLlib で機械学習アプリケーションが簡単に構築できることを知って いただく • データ分析の方: • Spark への移行はそれほど難しくないことを知っていただく 2
  3. 3. アジェンダ • これまでの MLlib • DataFrame API • Pipeline API • MLlib 2.0 に向けて • まとめ 3
  4. 4. spark.mllib spark.ml
  5. 5. MLlib とは? • Spark に組み込まれている機械学習ライブラリ • spark.mllib パッケージ • spark.ml パッケージ • ミッション • より簡単でスケーラブルに機械学習アプリケーションを構築 • MLlib のコントリビュータ • 個人:220+, 組織:70+ • 豊富な機会学習アルゴリズムやユーティリティ • Spark Streaming や Spark SQL とシームレスに統合可能 5
  6. 6. spark.mlパケージ • DataFrame を利用した機械学習パイプラインのためのハイレベル API を提供 • Spark 1.6 では spark.mllib より spark.ml の利用を推奨 • Python の scikit-learn ライブラリの API 設計に影響され開発 • API design for machine learning software: experiences from the scikit-learn project , Lars Buitinck et al. 6 // モデルの学習 val model = algo.fit(trainingDataFrame) // 学習したモデルで予測 model.transform(testDataFrame)
  7. 7. SparkとMLlibの簡単な歴史 7 RDD DataFrame Dataset spark.mllib spark.ml Pipeline API 1.2 1.3 1.60.8 2.0 Dataset 向けの全く新しい パッケージは作らない予定
  8. 8. 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. 8 [https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark]
  9. 9. 豊富なアルゴリズムとユーティリティ 9
  10. 10. アジェンダ • これまでの MLlib • DataFrame API • Pipeline API • MLlib 2.0 に向けて • まとめ 10
  11. 11. DataFrame API 11 age prefecture name 34 Tokyo **** 41 Osaka **** 27 Saitama **** 24 Chiba **** // 都道府県ごとのユーザの平均年齢を計算 data.groupBy(“prefecture”).agg(ave(“age”)) // 年齢 25 歳以上のユーザ数 data.filter(“age >= 25”).count() // SQL でも記述できる sqlContext.sql(“select age from user_table”) データ分析でよく使われる機能を DSL として提供 より少ないコード量で可読性高く記述できる API 設計は Pandas に影響を受けている user_table
  12. 12. サポートしているデータソースとフォーマット 12
  13. 13. DataFrame API の豊富なビルトイン関数 • 数学関数,文字列関数,日付関数など • ユーザ定義関数も利用可能 13
  14. 14. Catalystによる処理の最適化 14 cited by: Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data DataFrame API を利用すれば 少ないコードでより高速に処理することができる
  15. 15. アジェンダ • これまでの MLlib • DataFrame API • Pipeline API • MLlib 2.0 に向けて • まとめ 15
  16. 16. Simple ML Pipeline 16 Data Feature Extraction Train Model Final Model
  17. 17. サンプルタスク • レビュー (review) のテキストから評価 (rating) を予測 17 review Model rating String Int
  18. 18. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") 18 Training Data Hashed Term Logistic Regression Evaluate Tokenizer words i, have, bought, several, of, the,… product, arrived, labeled, as, jumbo, … this, is, a, confection, that, has, … if, you, are, looking, for, the, secret,…
  19. 19. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") 19 Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer features (1.0, 2.0, 1.0, 3.0, ….) (2.0, 1.0, 1.0, 2.0, ….) (3.0, 1.0, 2.0, 1.0, …) (1.0, 1.0, 3.0, 2.0, ….)
  20. 20. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) 20 Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  21. 21. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) 21 Pipeline Training Data Hashed Term Freq. Logistic Regression Final Model Tokenizer
  22. 22. Simple ML Pipeline 22 Data Feature Extraction Train Model Final Model
  23. 23. A Little Simple ML Pipeline 23
  24. 24. ML Pipelines for Test 24 Pipeline Training Data Hashed Term Freq. Logistic Regression Final Model Tokenizer Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  25. 25. 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(100) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) model.transform(test) 25 Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  26. 26. 結果のイメージ 26 review Model rating String Int review
  27. 27. 実際の ML Pipeline は複雑 27 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
  28. 28. パラメータチューニング 28 Hashed Term Freq. Logistic Regression Evaluate Tokenizer hashingTF.numFeatures {10, 20, 40} lr.regParam {0.01, 0.1, 0.5} Pipeline
  29. 29. クロスバリデーション 29
  30. 30. 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() 30
  31. 31. 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) cvModel.transform(testDataset) 31 Parameter Tuning も Cross-Validation も API が用意されているので複雑な PIpeline も簡単に定義
  32. 32. 訓練した Pipeline や学習モデルの永続化を Spark 1.6 でサポート 32 Pipeline Training Data Hashed Term Freq. Logistic Regression Tokenizer save Model Load Model Evaluate 訓練済みモデルを保存することで 再構築の必要がなく再利用が簡単
  33. 33. 機械学習モデルや Pipeline が永続化できるメリット 33 データ分析者 エンジニア Model プロダクト Python で永続化 Scala で読み込んでデプロイ 言語インタフェースをまたいだ利用が可能 Spark Streaming 上が学習したモデルを利用することもできる 学習したモデルのバージョン管理も簡単 Model
  34. 34. アジェンダ • これまでの MLlib • DataFrame API • Pipeline API • MLlib 2.0 に向けて • まとめ 34
  35. 35. Spark MLlib 2.0 Roadmap • Extended support for GLM model families and link functions • Improve GLM scalability • Tree partition by features • Locality sensitive hashing (LSH) • Deep learning: RBM/CNN • Improved pipeline API • Pipeline persistence • Model serving • Better SparkR coverage • Project Tungsten integration • Reorganize user guide 35
  36. 36. Pipeline 永続化の課題 36 Pipeline Hashed Term Freq. Random Forest Tokenizer 永続化未対応 save Model X Pipeline 中のひとつでも永続化できなければ, Pipeline 全体を永続化できない
  37. 37. Spark 1.6 時点で永続化未対応のアルゴリズム • Classification • DecisionTreeClassifier • GBTClassifier • MultilayerPerceptronClassifier • OneVsRest • RandomForestClassifier • Regression • DecisionTreeRegressor • GBTRegressor • RandomForestRegressor 37
  38. 38. SparkR の MLlib 対応 • Spark 1.6 の時点で SparkR がサポートしている機械学習アルゴ リズムは GLM のみ • k-means や survival analysis などの対応を行っていく 38 PySpark に比べると SparkR の MLlib 対応が遅れている
  39. 39. アジェンダ • これまでの MLlib • DataFrame API • Pipeline API • MLlib 2.0 に向けて • まとめ 39
  40. 40. まとめ • エンジニア向け: • Spark の機械学習ライブラリ MLlibで,プロダクションでの機械学習を簡単にスケー ラブルに実行 • データ分析者向け: • spark.ml のAPI設計は scikit-learn に影響を受けているので,scikit-learn ユーザに とっては学習コストが低い • DataFrame API は pandas に影響を受けている • Pipeline API を利用することで複雑化する ML Pipeline の管理が簡単 • 機械学習モデルや Pipeline の永続化により,言語インターフェースやコンポーネントを またいだ利用が簡単 • Pipeline API は発展途上なのでパフォーマンスや永続化対応を進めていく必要あり • SparkR の開発は 2.0 以降に期待 40 MLlib は実践を意識したスケーラブル機械学習アプリケーションを より簡単に構築できることを目指している

×