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.
AI入門 第2回
「Scala/Spark/Mahout
でレコメンドエンジンを作る」
2017/06/12 ver0.5作成
2017/07/24 ver1.0作成
本セッションの趣旨
商品購入に至るまでの閲覧履歴、つまり、
ユーザ行動ログ (≒Webアクセスログ) を
「Scala/Spark/Mahoutで
解析すると、マーケティングで使える」
という内容です
統計モデルや数式、学習アルゴリズムとかは一...
2
マーケティングの歴史
をほんの少しだけ
マーケティング黎明期は「マス広告」中心
1950
1960
1970
1980
1990
2000
年代
高度経済成長期
(あこがれ消費)
安定成長期
(ふんいき消費)
バブル崩壊
(選択消費)
明るいナショナル
3時のおやつは文明堂
オーモー...
消費者の情報源はTV等、マスメディア4種
1950
1960
1970
1980
1990
2000
年代
高度経済成長期
(あこがれ消費)
安定成長期
(ふんいき消費)
バブル崩壊
(選択消費)
明るいナショナル
3時のおやつは文明堂
オーモ...
インターネットとスマホで消費者行動が激変
2000
2014
2017
年代
バブル崩壊
IT社会
(選択消費)
スマホ社会
勉強しまっせ
よーく考えよー
お金は大事だよ
カードの切り方が人生だ
白戸家
ビッグデータ元年
マーケティングのメディアも変革期を迎えた
2000
2014
2017
年代
バブル崩壊
IT社会
(選択消費)
スマホ社会
勉強しまっせ
よーく考えよー
お金は大事だよ
カードの切り方が人生だ
白戸家
ビッグデータ元年
デジタルマーケティング...
あらゆるデータが捕捉可能になったので...
「雰囲気」「カン」で行っていた顧客把握から
? ?
?
「データ中心」での分析・展開が可能となった
データ
10
データ中心の代表
「レコメンドエンジン」
=「おすすめ機能」
例1.ファッションサイトの購入ページ
商品に関連した「おすすめ」が表示される
関連性が高いミュールや
サンダルが「おすすめ」として
表示される
このミュールに…
例2.Amazon「この商品を買った人は~」
高確率で「トネガワ」にも
関心が高いであろうことから、
売上アップに繋がりやすい
「ハンチョウ」に興味あって
見に来る人は…
「おすすめ」を ”機械学習” で自動生成
• 商品属性相関
(こんなもの買った人は、
こんなもの買ってま
す)
• 顧客属性相関
(あなたに似た人は
こんなもの買ってま
す)
• 売上ランキング
などなど
レコメンド情報
(機械学習で生成)
エ...
15
レコメンドエンジン
を実装してみる
多数の商品閲覧履歴からレコメンド生成
Webアクセス
ログ(タグ)
SFTP
■Webアクセスログ取込
■レコメンドデータ生成
レコメンド
表示
レコメンド
データ
配信
サーバ
ファイル
システム
ビッグデータ解析
駆動エンジン
商品閲覧
相...
17
EMR?
Elastic(伸縮自在な) MapReduceの略
ポチれば作れるスケーラブルなデータ基盤
マネジメントコンソールでEMR+Spark選択
21
Spark
vs
Hadoop
Spark: 少量データをインメモリで高速処理
 集計対象データ量が多く
無いためオーバースペック
(速度よりも)データ量重視
で分散処理する
 データ量が多い(億越え)
 処理頻度が低い(1日1回)
 処理速度が普通
比較的少な目のデ...
Spark: 少量データをインメモリで高速処理
通常ScalaコードとSparkコードの差
val file = scala.io.Source.fromFile( "/tmp/log.txt" )
val lines = file.getLines
val error = lines.fi...
25
Mahout?
Mahout: レコメンド向き機械学習エンジン
Mahout: 最大の特徴は…
レコメンドやクラスタリングの機械学習
アルゴリズムをコマンドラインから
パラメータ指定するだけで利用できる
ノンプログラミングで、大規模データの
分析が気軽にハンドリングできる
(使ってないけど)Sparkとネイ...
28
①商品別で
商品閲覧を
集計する
ScalaからSpark呼出で商品別集計
Webアクセス
ログ(タグ)
SFTP
■Webアクセスログ取込
■レコメンドデータ生成
レコメンド
表示
レコメンド
データ
配信
サーバ
ファイル
システム
ビッグデータ解析
駆動エンジン
商品閲覧...
ScalaからSpark呼出で商品別集計
2017-06-01T00:00:27Z activities.xxxxxxxxxx
{"ts":1496275227402,"account":"xxxxxxxxxx","vt":"wKPoI.lNw...
ScalaからSpark呼出で商品別集計
// Sparkの初期化
val conf = new SparkConf().setAppName( "mario-opt-mapred/ActivitiesItemCorrCalculation" ...
32
②商品閲覧の
相関を
計算する
Mahoutで商品閲覧の相関を計算
Webアクセス
ログ(タグ)
SFTP
■Webアクセスログ取込
■レコメンドデータ生成
レコメンド
表示
レコメンド
データ
配信
サーバ
ファイル
システム
ビッグデータ解析
駆動エンジン
商品閲覧
相関...
Mahoutで商品閲覧の相関を計算
3 69 0.9577542080518994
3 482 0.9091600912310319
3 601 0.8981679030325392
3 909 0.9038946377087511
3 116...
Mahoutで商品閲覧の相関を計算
org.apache.mahout.cf.taste.hadoop.similarity.item.ItemSimilarityJob
引数:
-i s3://xxxxxxxxxxxxxxx/xxxxxxxx...
36
③レコメンド
データの配信
配信したレコメンドデータで「おすすめ」表示
Webアクセス
ログ(タグ)
SFTP
■Webアクセスログ取込
■レコメンドデータ生成
レコメンド
表示
レコメンド
データ
配信
サーバ
ファイル
システム
ビッグデータ解析
駆動エンジン
商品閲...
Upcoming SlideShare
Loading in …5
×

AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」

3,119 views

Published on

AWS EMRをベースに、Scala→Sparkによるデータ集計と、Mahoutの機械学習を組み合わせて、レコメンドエンジンを構成し、マーケティングシステムとして活用します

Published in: Data & Analytics
  • Be the first to comment

AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」

  1. 1. AI入門 第2回 「Scala/Spark/Mahout でレコメンドエンジンを作る」 2017/06/12 ver0.5作成 2017/07/24 ver1.0作成
  2. 2. 本セッションの趣旨 商品購入に至るまでの閲覧履歴、つまり、 ユーザ行動ログ (≒Webアクセスログ) を 「Scala/Spark/Mahoutで 解析すると、マーケティングで使える」 という内容です 統計モデルや数式、学習アルゴリズムとかは一切出てき ません & その領域でのご質問にお応えする領域があまり ありませんが、 「ビジネス領域での適用」については面白いと思います
  3. 3. 2 マーケティングの歴史 をほんの少しだけ
  4. 4. マーケティング黎明期は「マス広告」中心 1950 1960 1970 1980 1990 2000 年代 高度経済成長期 (あこがれ消費) 安定成長期 (ふんいき消費) バブル崩壊 (選択消費) 明るいナショナル 3時のおやつは文明堂 オーモーレツ (丸善石油) 違いがわかる男 ネスカフェ 24時間戦えますか? 5時から男のグロンサン いつかはクラウン (TOYOTA)
  5. 5. 消費者の情報源はTV等、マスメディア4種 1950 1960 1970 1980 1990 2000 年代 高度経済成長期 (あこがれ消費) 安定成長期 (ふんいき消費) バブル崩壊 (選択消費) 明るいナショナル 3時のおやつは文明堂 オーモーレツ (丸善石油) 違いがわかる男 ネスカフェ 24時間戦えますか? 5時から男のグロンサン いつかはクラウン (TOYOTA) マスマーケティング 広告宣伝部→総合広告代理店 4マスメディア(TV、ラジオ、新聞、雑誌) 統合的マーケティング 差別商品開発、販売促進、セグメンテーション ライフスタイル研究、消費者ニーズへの対応
  6. 6. インターネットとスマホで消費者行動が激変 2000 2014 2017 年代 バブル崩壊 IT社会 (選択消費) スマホ社会 勉強しまっせ よーく考えよー お金は大事だよ カードの切り方が人生だ 白戸家 ビッグデータ元年
  7. 7. マーケティングのメディアも変革期を迎えた 2000 2014 2017 年代 バブル崩壊 IT社会 (選択消費) スマホ社会 勉強しまっせ よーく考えよー お金は大事だよ カードの切り方が人生だ 白戸家 ビッグデータ元年 デジタルマーケティング 4マスメディア +WEB広告(モバイル、SEM、SNS) 統合データマーケティング 4マスメディア +WEB広告(モバイル、SEM、SNS) +ビジネスデータ・WEBトラッキング
  8. 8. あらゆるデータが捕捉可能になったので...
  9. 9. 「雰囲気」「カン」で行っていた顧客把握から ? ? ?
  10. 10. 「データ中心」での分析・展開が可能となった データ
  11. 11. 10 データ中心の代表 「レコメンドエンジン」 =「おすすめ機能」
  12. 12. 例1.ファッションサイトの購入ページ
  13. 13. 商品に関連した「おすすめ」が表示される 関連性が高いミュールや サンダルが「おすすめ」として 表示される このミュールに…
  14. 14. 例2.Amazon「この商品を買った人は~」 高確率で「トネガワ」にも 関心が高いであろうことから、 売上アップに繋がりやすい 「ハンチョウ」に興味あって 見に来る人は…
  15. 15. 「おすすめ」を ”機械学習” で自動生成 • 商品属性相関 (こんなもの買った人は、 こんなもの買ってま す) • 顧客属性相関 (あなたに似た人は こんなもの買ってま す) • 売上ランキング などなど レコメンド情報 (機械学習で生成) エンドユーザー
  16. 16. 15 レコメンドエンジン を実装してみる
  17. 17. 多数の商品閲覧履歴からレコメンド生成 Webアクセス ログ(タグ) SFTP ■Webアクセスログ取込 ■レコメンドデータ生成 レコメンド 表示 レコメンド データ 配信 サーバ ファイル システム ビッグデータ解析 駆動エンジン 商品閲覧 相関計算商品別集計
  18. 18. 17 EMR?
  19. 19. Elastic(伸縮自在な) MapReduceの略
  20. 20. ポチれば作れるスケーラブルなデータ基盤
  21. 21. マネジメントコンソールでEMR+Spark選択
  22. 22. 21 Spark vs Hadoop
  23. 23. Spark: 少量データをインメモリで高速処理  集計対象データ量が多く 無いためオーバースペック (速度よりも)データ量重視 で分散処理する  データ量が多い(億越え)  処理頻度が低い(1日1回)  処理速度が普通 比較的少な目のデータを 高い頻度でバンバン回す  データ量が比較的少ない  処理頻度が高い  処理速度が高速  インメモリで高速処理可能  集計対象データ量もメモリ 容量の範囲内に収まる 業務要件 選定/非選定理由 Hadoop Spark
  24. 24. Spark: 少量データをインメモリで高速処理
  25. 25. 通常ScalaコードとSparkコードの差 val file = scala.io.Source.fromFile( "/tmp/log.txt" ) val lines = file.getLines val error = lines.filter( _.contains( "ERROR" ) ).size 通常のScalaコードを書くのと、ほぼ変わら ないコードで、複数クラスタでの分散処理 が実現されてしまうのが、Sparkの凄さ 通常のScalaコード val lines = sc.textFile( "/tmp/log.txt" ) val error = lines.filter( _.contains( "ERROR" ) ).count Spark呼出を利用したScalaコード(裏では、複数のクラスタに分散されている) Spark 2.x系 (初回リリースは2016/7/26) だとメソッド セットが変わる (RDD※/DataFrameもDatasetに変更) ※Resilient Distributed Dataset: 不変で並列実行可能な分割コレクション
  26. 26. 25 Mahout?
  27. 27. Mahout: レコメンド向き機械学習エンジン
  28. 28. Mahout: 最大の特徴は… レコメンドやクラスタリングの機械学習 アルゴリズムをコマンドラインから パラメータ指定するだけで利用できる ノンプログラミングで、大規模データの 分析が気軽にハンドリングできる (使ってないけど)Sparkとネイティブ 接続もできて、更に高速化できるらしい
  29. 29. 28 ①商品別で 商品閲覧を 集計する
  30. 30. ScalaからSpark呼出で商品別集計 Webアクセス ログ(タグ) SFTP ■Webアクセスログ取込 ■レコメンドデータ生成 レコメンド 表示 レコメンド データ 配信 サーバ ファイル システム ビッグデータ解析 駆動エンジン 商品閲覧 相関計算商品別集計
  31. 31. ScalaからSpark呼出で商品別集計 2017-06-01T00:00:27Z activities.xxxxxxxxxx {"ts":1496275227402,"account":"xxxxxxxxxx","vt":"wKPoI.lNwXiTH","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"HNHYA-367693- 04"}]} 2017-06-01T00:00:57Z activities.xxxxxxxxxx {"ts":1496275257338,"account":"xxxxxxxxxx","vt":"16fHvG.lMYDCZ7","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"HNKYA-364957- 04"}]} 2017-06-01T00:01:48Z activities.xxxxxxxxxx {"ts":1496275308434,"account":"xxxxxxxxxx","vt":"3%2BsMkQ.lN4P72N","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"HNRYB- 360844-04"}]} 2017-06-01T00:02:52Z activities.xxxxxxxxxx {"ts":1496275372269,"account":"xxxxxxxxxx","vt":"6TxF1.lLWEepM","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"HNHJB-357844- 03"}]} 2017-06-01T00:03:45Z activities.xxxxxxxxxx {"ts":1496275425990,"account":"xxxxxxxxxx","vt":"Y9hcv.lFgztJ0","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"FKMYA-368333- 03"}]} 2017-06-01T00:05:14Z activities.xxxxxxxxxx {"ts":1496275514546,"account":"xxxxxxxxxx","vt":"1jrjda.lNhpu8E","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"OSHGF-363474- 02"}]} 2017-06-01T00:05:24Z activities.xxxxxxxxxx {"ts":1496275524952,"account":"xxxxxxxxxx","vt":"3%2525252525252525252520il- g.lzgfvlh","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"CTRJA-362952-05"}]} 2017-06-01T00:06:43Z activities.xxxxxxxxxx {"ts":1496275603657,"account":"xxxxxxxxxx","vt":"2LXKDi.lBqDjmb","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"CTJJK-265962- 03"}]} 2017-06-01T00:07:36Z activities.xxxxxxxxxx {"ts":1496275656723,"account":"xxxxxxxxxx","vt":"6TxF1.lLWEepM","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"HNHJB-357841- 03"}]} 2017-06-01T00:08:10Z activities.xxxxxxxxxx {"ts":1496275690808,"account":"xxxxxxxxxx","vt":"28Y4OC.lwdLlM4","cid":"","ctype":"1","act_type":"bdr_detail","act_params":[{"product_id":"FUJJK-368890- 03"}]} … 商品IDとユーザIDの入ったユーザ行動 (Webアクセス)ログを商品別に集計する ※集計後のデータは、公開控えさせてください
  32. 32. ScalaからSpark呼出で商品別集計 // Sparkの初期化 val conf = new SparkConf().setAppName( "mario-opt-mapred/ActivitiesItemCorrCalculation" ) conf.set( "spark.hadoop.validateOutputSpecs", "false" ) val sc = new SparkContext( conf ) val hadoopConf = sc.hadoopConfiguration hadoopConf.set( "fs.s3a.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem" ) hadoopConf.set( "fs.s3a.awsAccessKeyId", configs.getOrElse( "AWS_ACCESS_KEY_ID", "" ) ) hadoopConf.set( "fs.s3a.awsSecretAccessKey", configs.getOrElse( "AWS_SECRET_ACCESS_KEY", "" ) ) … // 入力ファイルからRDDを作り集計 val inputAct = sc.textFile( actFile ) q.sourceAggregateType match { case SOURCE_AGGREGATE_TYPE_COUNT => val rddAct = inputAct.filter( x => x.nonEmpty && x.contains( schemaName ) ).map { x => val json = gson.fromJson[ AggregateBehavior ]( x, classOf[ AggregateBehavior ] ) val id = if ( json.params.get( q.sourceAttribute ) != null && json.params.get( q.sourceAttribute ).length > 128 ) json.params.get( q.sourceAttribute ).substring( 0, 128 ) else json.params.get( q.sourceAttribute ) ( id, ( json.vt.hashCode, json.count ) ) }.filter( x => x._1 != null && x._1.nonempty ) val rddActAndItem = rddAct.join( rddItem ) val csv = rddActAndItem.map( x => { Array( x._2._1._1, x._2._2, x._2._1._2 ).mkString( "," ) } ) csv.repartition( 1 ).saveAsTextFile( outputFile ) Sparkを呼び出すバッチをScalaで作成
  33. 33. 32 ②商品閲覧の 相関を 計算する
  34. 34. Mahoutで商品閲覧の相関を計算 Webアクセス ログ(タグ) SFTP ■Webアクセスログ取込 ■レコメンドデータ生成 レコメンド 表示 レコメンド データ 配信 サーバ ファイル システム ビッグデータ解析 駆動エンジン 商品閲覧 相関計算商品別集計
  35. 35. Mahoutで商品閲覧の相関を計算 3 69 0.9577542080518994 3 482 0.9091600912310319 3 601 0.8981679030325392 3 909 0.9038946377087511 3 1161 0.9474190693417451 3 1532 0.9026751528181597 3 2533 0.9007963954721725 3 2561 0.8957260345613678 3 2568 0.8964474529800505 3 2575 0.8990213228483238 … 前述の「商品別閲覧集計」で作った結果 の相関をMahoutで算出すると、以下の ような、商品間の相関係数が取得でき、 相関係数が高いものをレコメンドする
  36. 36. Mahoutで商品閲覧の相関を計算 org.apache.mahout.cf.taste.hadoop.similarity.item.ItemSimilarityJob 引数: -i s3://xxxxxxxxxxxxxxx/xxxxxxxxxx/xxxxxx/xxxxxx/xxxxxxxx/201706060332/ds/out/Ratings -o s3://xxxxxxxxxxxxxxx/xxxxxxxxxx/xxxxxx/xxxxxx/xxxxxxxx/201706060332/recommendations -s SIMILARITY_LOGLIKELIHOOD --tempDir xxxxxxxxxxxxxxx --booleanData true MahoutをEMRから起動して、算出結果 はS3を経由して、Auroraに書き出される
  37. 37. 36 ③レコメンド データの配信
  38. 38. 配信したレコメンドデータで「おすすめ」表示 Webアクセス ログ(タグ) SFTP ■Webアクセスログ取込 ■レコメンドデータ生成 レコメンド 表示 レコメンド データ 配信 サーバ ファイル システム ビッグデータ解析 駆動エンジン 商品閲覧 相関計算商品別集計

×