TechReport

技術者情報

テクノロジー

2010年11月10日(水)公開

第32回

「GMOとくとくショップ」でのレコメンド利用について(後編)

MahoutとHadoopの連携

GMOインターネット株式会社 次世代システム研究室 室長 堀内敏明。前編では、MahoutとHadoopを使ったレコメンデーション利用として個々の役割をレポートしました。後編は、MahoutとHadoopの連携などをレポート。

記事INDEX

MahoutとHadoopの連携

前編で説明したように、MahoutはHadoopと容易に連携することが出来ます。Mahoutは様々なアルゴリズムを担当し、Hadoopは並列計算処理を行うと考えると、この2つは非常に相性が良い組合せです。最初にMahoutのインストールを行います。前提条件としてここでは以下の環境を利用します。

  • Hadoop 0.20.x系がインストール、設定済み
  • Java JDK 1.6.x系、Maven 2.0.9以上

図1 Mahoutのビルド
図1 Mahoutのビルド

まず初めにmahoutのソースコードを取得してきて、ローカルリポジトリにmahoutをインストールします。利用するMahoutのバージョンは、最新バージョンである0.4になります。

次にデータを準備します。ここではアイテムベースのレコメンドを想定して以下のようなデータを利用します。(図2)

図2 pvデータ
図2 pvデータ

これはただの数の羅列のように見えますが、図.3のようにユーザがある商品ページを閲覧した際のログに相当して、ユーザID(user_id), 商品ID(item_id)の組になっています。このようなデータをGMOとくとくショップでは、WebサーバのログからHadoopで解析して生成しています。(図3)

図3 ユーザの商品閲覧イメージ
図3 ユーザの商品閲覧イメージ

それでは実際にMahoutとHadoopを連携させた解析を行います。図4の1,2行目では、先ほどのpv.txtデータをHDFS(Hadoop Distributed File System)上にディレクトリを作成して配置しています。3行目がMahoutによる解析の実行です。ここでは、商品間の類似性を計算するために、tanimoto係数を利用しています。

MapReduceの処理が何度か実行され、終了すると4行目のcatで[商品ID 商品ID スコア値]の組が表示されます。これは、2つの商品ID間の類似性を表しています。

たったこれだけで、複雑な解析処理をHadoopクラスタ上で実行することが出来ます。生成されたスコア値はアイテムベースのレコメンデーションを行う際に利用します。

ここではデータサイズが少ないため、PVデータ、スコア値をこのまま利用しますが、大量のPVを発生させているスパム的な動きをしているユーザの除去、低スコア値の除去を行い計算量の削減とレコメンデーションされる結果の精度をフィルターする処理も必要になります。

図4 データ解析の実行と表示
図4 データ解析の実行と表示
スコア値の計算ロジック

一体どういったロジックでスコアが計算されているか?を知ることは、どのような結果がレコメンデーションされるか把握する上で必要になります。ここでは、前述したTanimotoCoefficientSimilarityを使ったスコアの生成のロジックを説明します。

TanimotoCoefficientSimilarityはtanimoto係数と呼ばれる二つのオブジェクト間の類似度を評価するのに図5の式で定義されます。これは、A、B間の類似度を評価し、1に近いほど両者の類似度が高く、0に近いほど類似性が低くなることを表しています。

図5 2オブジェクト間の類似度を評価する式
図5 2オブジェクト間の類似度を評価する式

図5の式を利用する前に、解析対象のデータを整形します。最初に解析を行ったpv.txtのデータは次のようなデータに置き換えることが出来ます

item_iduser_id=1user_id=2user_id=3
1
1
0
1
2
1
1
1
3
1
1
0

これは「item_id=1の商品は、user_id=1,3の人が閲覧している」といったように、1は閲覧、0は閲覧していない、と置き換えた時のデータです。次にそれぞれのitem_idの類似性をtanimoto係数から求めると、次のような計算結果になります。

    T(1, 2) =  2 / (2 + 3 ・2) =  0.6666666

    T(1, 3) =  1 / (2 + 3 ・2) =  0.3333333

    T(2, 3) =  2 / (2 + 3 ・2) =  0.6666666

図4で行った解析結果と同じ結果を得ることが出来ました。この時、item_id=1から見た場合レコメンドされる商品は2の方が類似度が高いので、2、3の順で表示されれば良いということになります。

ユーザ、商品数が少ない場合は上記のように手で計算することもできますが、大量のデータに対して行うことは難しいので、MahoutやHadoopを使って容易に解析を行うことが出来ます。次にこの商品間のスコア値を使用して、レコメンデーションを行います。

レコメンデーションの実行

図5 レコメンデーションの実行
図5 レコメンデーションの実行

Mahoutに解析させた結果と、元のデータを使ってレコメンデーションを行います。アイテムベースのレコメンデーションでは、事前に生成したスコア値を利用できるという利点を生かすことが出来ます。元のデータを読込んでデータモデルを生成(1)して、商品間スコア値を準備(2)したら、レコメンダー(GenericItemBaseRecommender)を生成します(3)。これで準備は整いました。図5 の例では商品ID=2に対するレコメンデーションを取得(4)しています。

アイテムベースのレコメンデーションでは(2)の処理で、事前に生成したスコア値を利用できることが大きな利点です。事前生成したスコア値を用いない場合、Mahoutはレコメンダーの生成時に与えられた類似性に基づいてスコア値を計算するため、大量のデータや複数サーバでの運用では計算に時間がかかり過ぎる問題点があります。また、WebAPI経由でレコメンデーションを取得出来るようにすることで、システム全体の可用性を高めることが出来ます。GMOとくとくショップでは実際に、レコメンデーションをWebAPIにして、アプリケーションからレコメンデーション情報を取得できるようにしています。

レコメンデーションの運用と課題

MahoutとHadoopを組み合わせると、大規模なデータであっても容易にレコメンデーション情報を生成することができます。実際、GMOとくとくショップでは数百万のユーザ・商品データを使って、レコメンデーション情報を日々生成しています。ここでレコメンデーションシステムを運用していく上で大切になる点として、以下があります。


  • 履歴データの存在 :レコメンデーションのパフォーマンスを上げるため、Webサーバのログ等の履歴にある程度のボリュームが必要になります。
  • パフォーマンス測定 :レコメンデーションを行うアルゴリズム・組合せは色々考えられるため、常にCTRなどの評価値を測定しておく必要があります。
  • フィルタリング :スパム、スコアの高低や人気のある商品に偏りが生じるため、データやスコアの調整が必要になります。

ユーザの行動履歴からレコメンデーションを行う場合、その履歴データは多ければ多いほど、レコメンデーションのパフォーマンスは向上します。レコメンデーションのパフォーマンスはCTRはもちろん、インプレッションについても「どれくらいのユーザにレコメンデーション出来たか?」を知る上で計測するデータの一つにもなるでしょう。

最後に履歴データやスコア値についてはある程度の調整が必要になります。例えば、人気の商品には自然とユーザが集まるため、レコメンデーションもその商品に引きずられる傾向が出てしまいます。そこで、そのようなデータについてはある程度の切取りやクラスタリングを行い、商品の掘起しを行うことも必要になります。

また、次世代システム研究室ではクラウドを作りたいエンジニアを募集しています。ご興味がある方はこちらからエントリーをお願いします。



2010.11.10

堀内 敏明

GMOインターネット株式会社

2002年7月に、現・GMOメディア株式会社に入社後、2003年3月に同社取締役システム本部長に就任。2008年3月よりGMOインターネット株式会社 次世代システム研究室 室長としてインターネット最新テクノロジーの研究や開発に従事。2015年3月に同社常務取締役に就任。

執筆者一覧