意外と簡単? Apache Sparkで映画のレコメンド機能を実装しよう

IT・IT製品TOP > Key Conductors > 栗村 彰吾(日本アイ・ビー・エム株式会社) > 意外と簡単? Apache Sparkで映画のレコメンド機能を実装しよう
この記事をtweetする このエントリーをはてなブックマークに追加

IT現場の道先案内人 Key Conductors

意外と簡単? Apache Sparkで映画のレコメンド機能を実装しよう

データ分析 2017/03/30

 前回はApache Spark(以下Spark)の活用例を紹介し、次世代のデータ分析に必要なITインフラ要件について説明しました。

 今回は実際にSparkを使ってパーソナライズされた映画のレコメンドを行ってみましょう。今回も同様にLinuxONE Community CloudのRed Hat Enterprise Linux 7.2の仮想サーバで実施します。仮想サーバの作成方法はこちら(第2回)を参照ください。

「あなたにお薦めの映画は……」の仕組みもDockerで簡単に展開できる

 今回実施するデータ分析では、「パーソナライズされたレコメンド」を実現するために必要なデータとして、「MovieLens(https://movielens.org/)」が提供するデータセットを用います。

 MovieLensは、ミネソタ大学のリサーチラボであるGroupLensによって管理されているプロジェクトの1つです。映画のタイトルやジャンル、ユーザーによる映画の評価などのデータセットを誰でも利用できます。

 最新のデータセット(注1)には、「medium」と「large」が用意されています。スモールバージョンには、9000作の映画に対し、700人による10万の評価データが含まれ、フルバージョンには、4万作の映画に対し、26万人による2400万もの膨大な評価データが含まれています。これらの評価データを基に映画をレコメンドしていきます。今回の映画レコメンドシステムの全体像を図1に示します。

図1 映画レコメンドシステムの全体像

※会員登録いただくと図をご覧いただけます。
会員登録はこちら(無料)

図1 映画レコメンドシステムの全体像
(出典:日本IBM)

注1)最新のデータセット  https://grouplens.org/datasets/movielens/を参照ください。

レコメンドで使われる分析手法「協調フィルタリング」とは

 今回の分析では、Sparkの機械学習ライブラリである「MLlib」のうち、「協調フィルタリング」が使われています。協調フィルタリングは一般的にレコメンド機能でよく用いられるアルゴリズムです(図2)。

図2 協調フィルタリング

※会員登録いただくと図をご覧いただけます。
会員登録はこちら(無料)

図2 協調フィルタリング
(出典:日本IBM)

 例えば、Aさんは「映画X」と「映画Y」を高く評価し、同様にBさんも「映画X」と「映画Y」を高く評価したとします。そこで、まず「AさんとBさんは好みが似ている」と判断されます。さらに、Bさんは高く評価しているが、Aさんはまだ評価していない「映画Z」がある場合、「映画ZはAさんの好みに合う」と推測され、「映画Z」はAさんにレコメンドすべき映画と判断されます。

 このようにユーザー同士の類似性を見つけ出して、おすすめコンテンツをレコメンドする方法が協調フィルタリングです。

学習データの実際とレコメンド処理

 Movielensのデータセットには以下のような形式でユーザーによる評価データが入っています。

・評価データ
 例)ユーザーID::映画ID::ユーザー評価::タイムスタンプ
------
1::1::5::978300760
1::2::5::978302109
1::3::5::978301968
::
::

 ここには、ユーザーごとに映画の評価スコアが入っており、それぞれの数字は、[ユーザーID::映画ID::ユーザー評価::タイムスタンプ]を表しています。

 例えば、ユーザーID「1」番のユーザーは、映画ID「1」番の映画に対して、「5」の評価(1を最低、5を最高、とする5段階評価)を行っていることを表します。ここには、映画とそのIDが入っており、[映画ID::映画タイトル::映画ジャンル]を表しています。

・映画データ
 例)映画ID::映画タイトル(年)::映画ジャンル
------
1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3:: Babe (1995)::Children's|Comedy|Drama
::
::

 例えば、上記の評価データと映画データをデータセットとして用いた場合、次のような処理を行って、パーソナライズされたレコメンドを実現します(図3)。

■ステップ1:ユーザーが評価を行う

 ユーザーID:2が『Toy Story』(映画ID:1)と『Jumanji』(映画ID:2)に評価5を与える。

■ステップ2:評価データの中から類似の評価傾向を確認する

 評価データを参照し、ユーザーID:2にはユーザーID:1と同様の評価傾向があると確認する。

■ステップ3:レコメンドすべき映画を選択する

 ステップ2の結果を基に、ユーザーID:1が他に高く評価した『Babe』(映画ID:3)をユーザーID:2へのレコメンドとして選択する。

■ステップ4:レコメンドすべき映画のタイトル情報を取得する

 映画データを参照し、映画ID:3に対応する映画タイトルを選択する。

■ステップ5:お薦め映画タイトルを表示する

 ユーザーID:2へのおすすめ映画として『Babe』を提示する。

図3 パーソナライズされたレコメンドを提供する流れ

※会員登録いただくと図をご覧いただけます。
会員登録はこちら(無料)

図3 パーソナライズされたレコメンドを提供する流れ
(出典:日本IBM)

実データを使ったデモ環境の構築

 では実際にMovieLensのデータセットから、自分の嗜好に合った映画を分析してみましょう。

 今回は、Sparkの実行環境およびMovielensデータセットが設定済みのDockerコンテナを活用します。DockerHubレジストリからDockerイメージをローカルのDockerレジストリにダウンロードし、Dockerイメージからコンテナを起動させます(図4)。

図4 Dockerコンテナを展開して起動

※会員登録いただくと図をご覧いただけます。
会員登録はこちら(無料)

図4 Dockerコンテナを展開して起動
(出典:日本IBM)

 デモは以下の流れで実施します。


・その1:OSの設定
・その2:Dockerコンテナ実行環境の構築、起動
・その3:ユーザーデータの入力、分析実行
 

その1 OSの設定

■手順(1)Firewalldおよびiptablesを有効にしている場合、以下のコマンドで無効にする

 以降の作業に影響がないよう、Firewalldおよびiptablesを有効にしている場合、以下のコマンドで無効にしておきます。

[linux1@rhel72 ~]$ sudo systemctl stop firewalld
[linux1@rhel72 ~]$ sudo systemctl disable firewalld
[linux1@rhel72 ~]$ sudo systemctl stop iptables
[linux1@rhel72 ~]$ sudo systemctl disable iptables

その2 Dockerコンテナ実行環境の構築、起動

■手順(2)Dockerのバイナリコードをダウンロードし、展開する

 次の手順でDockerの実行環境を入手して展開します。

[linux1@rhel72 ~]$ sudo -i
[root@rhel72~]#wget ftp://ftp.unicamp.br/pub/linuxpatch/s390x/redhat/rhel7.2/docker-1.11.2-rhel7.2-20160623.tar.gz
[root@rhel72 ~]# tar xzvf docker-1.11.2-rhel7.2-20160623.tar.gz
■手順(3)Dockerを起動する

 DockerのバイナリをPATHの通ったディレクトリに置き、起動します。

[root@rhel72 ~]# mv docker-1.11.2-rhel7.2-20160623/docker* /usr/bin/
[root@rhel72 ~]# sudo docker daemon &
■手順(4)Dockerイメージをダウンロードする

 次の手順で別のターミナルを起動し、Spark実行環境とMovieLensデータセットが設定済みのDockerイメージをダウンロードします。

[linux1@rhel72 ~]$ sudo -i
[root@rhel72 ~]# docker pull movielensdemo/movielens
Using default tag: latest
latest: Pulling from movielensdemo/movielens
13e1ca791732: Pull complete
a3ed95caeb02: Pull complete
c515c198742a: Pull complete
82294b7bd398: Pull complete
9fd9790f615b: Pull complete
Digest: sha256:c305a13882eb8f98a38a5ff82ee4eee1b14a642d84d97f0ba92981e469a0ef36
Status: Downloaded newer image for movielensdemo/movielens:latest
■手順(5)ダウンロードしたイメージからDockerコンテナを起動する

 Dockerイメージを確認し、起動します。ここまでの操作で、Spark実行環境とMovieLensデータセットが設定済みのDockerイメージが起動しました。

[root@rhel72 ~]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED        SIZE
movielensdemo/movielens   latest   2d10d81e31e9   13 hours ago  1.958 GB
[root@rhel72 ~]# docker run --name sparkdemo -i -t movielensdemo/movielens:latest /bin/bash
●Sparkの起動を確認するには?

 Sparkが起動したかどうかを確認するには次のコマンドを実行してみます。

bash-4.2# /opt/ibm/spark/bin/spark-shell --master local

 起動すると、次のように表示されます。

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.0
      /_/
        
Using Scala version 2.11.8 (IBM J9 VM, Java 1.8.0)
Type in expressions to have them evaluated.
Type :help for more information.

scala>


 表示が確認できたら、[CTRL]+[C]を入力して、終了します。

その3 ユーザーデータの入力、分析実行

■・手順(6)ユーザーデータを入力する

 rateMoviesを起動すると、映画のレーティングを更新するかを聞かれますので「y」と回答します。すると、「次の映画を5段階で評価してください」といった表示に続いて、映画のタイトルが表示されます。それぞれに、1〜5または0で評価を入力していきます。

 ここで入力したデータが協調フィルタリングにかけられ、おすすめの映画が分析されます。

bash-4.2# cd training/machine-learning/
bash-4.2# python bin/rateMovies
Looks like you've already rated the movies. Overwrite ratings (y/N)? y
Please rate the following movie (1-5 (best), or 0 if not seen):
Toy Story (1995): 5
::
::
■手順(7)入力したユーザーデータを分析用にコンパイルする

 次のコマンドでデータのコンパイルを行います。

bash-4.2# cd scala/
bash-4.2# /opt/ibm/spark/sbt/bin/sbt assembly

 以下のように表示されれば、コンパイルは成功です。

[success] Total time: 186 s, completed 2017/02/10 4:30:03
■手順(8)ユーザーデータから自分におすすめの映画を分析する

 scalaのディレクトリに移動してSparkでデータ分析の処理を実行します。4GBのメモリを利用し、コンパイルしたデータとmediumの映画評価データ、レーティングのデータを使ってお薦めの映画を分析しています。

bash-4.2# SPARK_MEM=4g /opt/ibm/spark/bin/spark-submit --class MovieLensALS /root/training/machine-learning/scala/target/scala-2.10/movielens-als-assembly-0.1.jar /root/training/data/movielens/medium/ /root/training/machine-learning/personalRatings.txt

 すると、以下のように、1位から50位のおすすめ映画が表示されます。

The best model was trained with rank = 12 and lambda = 0.1, and numIter = 20, and its RMSE on the test set is 0.8689154230984806.
The best model improves the baseline by 21.97%.
Movies recommended for you:
 1: Chushingura (1962)
 2: Bandits (1997)
 3: Hard Core Logo (1996)
 4: Ayn Rand: A Sense of Life (1997)
 5: Raiders of the Lost Ark (1981)
 6: Sanjuro (1962)
 7: Big Trees, The (1952)
 8: Bewegte Mann, Der (1994)
 9: For All Mankind (1989)
10: Shawshank Redemption, The (1994)
(・・・省略・・・)
50: X-Men (2000)

 MovieLensのデータセットには、mediumとlargeのデータ件数の異なる2つが用意されています。手順(8)では、/root/training/data/movielens/medium/を指定しましたが、/root/training/data/movielens/large/を指定することで、より多くのサンプルデータを使用し、分析することも可能です。

 今回のデモのようなおすすめコンテンツのレコメンドについて、ビジネスの現場では、企業が持つ顧客情報などの基幹データを分析することで、それぞれの顧客に適切な提案を行うことが可能となります。そして結果として業績向上や顧客ロイヤリティー向上につながることが期待できます。

 おすすめコンテンツのレコメンドで最も重要視するべきことは、リアルタイム性です。例えば、2時間前に顧客が興味を持っていた商品が今現在も興味を持っているとは限りません。常に変化している顧客のニーズをリアルタイムに把握しなければ、効果のあるレコメンドはできないからです。Sparkはそのようなリアルタイムな分析を可能にするツールです。
 

 次回はアプリケーションやミドルウェアなどのソフトウェアインストール、システムの各種設定を自動化するシステム構成管理ツールである「Chef」を紹介します。

 次回もお楽しみに。

会員限定で「読者からのコメント」が読み書きできます! 「読者からのコメント」は会員限定の機能。会員登録を行い、ログインすると読者からのコメントが読み書きできるようになります。

会員登録(無料)・ログイン

Myリストへ

この記事をtweetする このエントリーをはてなブックマークに追加


この寄稿記事に掲載している情報は、掲載日時点での情報となります。内容は変更となる場合がございますのでご了承下さい。また、「Key Conductors」の寄稿記事及び当該記事に寄せられたコメントについては、執筆者及びコメント投稿者の責任のもと掲載されているものであり、当社が、内容の最新性、真実性、合法性、安全性、適切性、有用性等を保証するものではありません。


30009584


IT・IT製品TOP > Key Conductors > 栗村 彰吾(日本アイ・ビー・エム株式会社) > 意外と簡単? Apache Sparkで映画のレコメンド機能を実装しよう

このページの先頭へ

キーマンズネットとは
さまざまなオープンソースソフトウェア(OSS)に携わり、現在は「LinuxONE」を中心に、提案および構築を担当。お客さまのミッションクリティカルな業務にふさわしいシステムの提供に尽力する傍ら、LinuxONEの活用に関するセミナー講師として「メインフレームの価値」や「なぜ今メインフレームか」を啓蒙する活動にも従事する。

ページトップへ