ImplicitのAlternating Least Squaresを使って、レコメンドエンジンをさくっと作る。

ImplicitのAlternating Least Squaresを使って、レコメンドエンジンをさくっと作る。

「長生きするほど今後も長く残る」という法則

– リンディ効果

こんにちは、機械学習や推薦エンジン周りを担当している、しゅんです。

ちなみにリンディとはNYにあるチーズケーキ屋の名前です。何故、長生きするかが気になる人はこちらへ。

私はよく機械学習が好きだからという理由で、新しいもの好きだと思われますが、それは誤解です。むしろ逆で、長く使われてきたという理由で好きです。

機械学習はITの世界では、もっとも枯れた技術です。ニューラルネットの元になったパーセプトロンは1957年、ベイズの定理に至っては200年前のアルゴリズムです。

むしろ、ブラウザやインターネットプロトコルのTCP/IPやHTTPの方が後発です。

なぜ、今になってこんなに枯れた機械学習がもてはやされてしまったかというと、それはWebが登場してデータのアクセスポイントが大量にできたから(大量のデータ)、GPUが登場したから(強力な演算装置)、そしてクラウドやライブラリの登場です(誰でも使える)。

オープンソースライブラリで、大量のデータを、より強力なマシンで学習できるようになりましたが、元となったアルゴリズムは昔からあったのです。

一方で、Web周辺の技術の移り変わりは凄まじいです。最近はついていけなくなりました。。特に、フロントエンドに関しては常にhotだと思います。

リンディ効果じゃないけど、機械学習アルゴリズムは、シンプルなものであれば、あと100年たっても変わらないでしょう。時という試練に耐えてきた先人達の英知、それこそが、自分が機械学習に魅せられた理由かもしれません。

大事なのは、枯れたとか新しいではなく、目の前の問題を解決できるかですね。

それでは本題。

本記事は、自分もまだ学習中で備忘録としたいです。

今日はimplicitというライブラリを使って、わずか10行ほどのコードでレコメンドエンジンを作ってみたいと思います。

今回は理論より、動くものを作ってみたいと思います。

Alternating Least Square(ALS)は一言でいうと、疎な行列を因子分解するアルゴリズムです。疎な部分は目的関数で最適化して予測します。

イメージにすると↓ですね。行列を分解して、データが空の部分を分解した特徴の内積をとって予測します。

目的関数。

実際のアルゴリズムはこのブログが詳しいです。

まずはライブラリをインポート

import implicit
import scipy.sparse as sparse

データは以下のgithubのサンプルを使いました。典型的な映画を評価したuser-item行列です。

item_user_data = pd.read_csv('movielens_ratings.csv')

データをsparse.csr_matrixを使って変換します。sparse.csr_matrixに関してはこのブログが詳しいです。

sparse_item_user = sparse.csr_matrix((item_user_data['rating'].astype(float), (item_user_data['movieId'], item_user_data['userId'])))

sparse_user_item = sparse.csr_matrix((item_user_data['rating'].astype(float), (item_user_data['userId'], item_user_data['movieId'])))

AlternatingLeastSquaresの呼び出し。

model = implicit.als.AlternatingLeastSquares(factors=50)

alpha_val = 20
data_conf = (sparse_item_user * alpha_val).astype('double')

モデルを作成

model.fit(data_conf)

ユーザー別に映画をレコメンド

user_id =   0
recommended = model.recommend(user_id, sparse_user_item)
print(recommended)

似たような映画を3本レコメンド

item_id = 7
n_similar = 3
similar = model.similar_items(item_id, n_similar)
print(similar)

いかがでしたか?強力なライブラを使えば、わずか10行ほどでレコメンドエンジンが完成します。アルゴリズムの理解にはじっくり時間を掛けたいですね。

エンジョイワークスでは、バックエンドエンジニアを募集しております。空き家問題を、自分のスキルで解決したいエンジニアは、是非ご応募ください!

リクルート情報はこちら!
https://enjoyworks.jp/recruit

一覧へ戻る