fastaiライブラリの協調フィルタリングを使って、君の名は。に類似のアニメを求めてみた

Python
元教師
元教師

こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!

この記事では、Practical Deep Learning for Codersの第7章で学んだ協調フィルタリングの内容を参考に類似のアニメを出力するレコメンドエンジンを作成してみたので、実装のコードを紹介いたします!

fastaiライブラリを使えば、比較的簡単に協調フィルタリングを実装することができるので、興味を持った方はぜひご自身でも類似のデータセットを使って実装してみてください!

アニメデータセットについて

今回の実装で使用したデータセットはKaggleからダウンロードできるアニメのレビューデータセットで、約7万人のユーザーが約1万件のアニメに対する評価を行った膨大なデータセットです。

今回はこのデータセットを使って、「君の名は。」を観た人にはどのアニメをオススメするのがいいのかを出力してくれるモデルを作成します。

実装のコード

実装のコードは以下の各段階に分かれています。

  • データの読み込み
  • データの結合・外れ値削除
  • データローダーの作成
  • モデルの学習

順を追ってみていきましょう

データの読み込み

本実装に用いるデータは以下リンクよりダウンロードすることができます。

上記リンクからダウンロードしたデータを以下のコードで読み込みます

ついでにライブラリも読み込みます

from fastbook import * 
from fastai.collab import * 
from fastai.tabular.all import * 

# ユーザー側の評価データとアニメ側の評価データの読み取り
ratings = pd.read_csv('rating.csv')
animes = pd.read_csv('anime.csv')[['anime_id', 'name']]
display(ratings)
display(animes)

データの結合・外れ値の削除

ratingsデータとanimesデータを、anime_idをキーに結合します。

その後、「ratingsが-1のアニメは【ユーザーはそのアニメを観たが評価を行っていないアニメ】」という情報から、ratingsが-1であるようなデータを学習データから削除します。

# データの結合
ratings = ratings.merge(animes)

# ratingsのrating=-1は「アニメは見たけど評価はしなかった」ことを意味するので、データから排除
ratings = ratings.query('rating >= 0')

display(ratings)

データローダーの作成

fastaiライブラリの学習の際には、DataLoaderクラスに学習に使うデータを入れることが必要になります。

# データローダーの作成(バッチサイズは64)
dls = CollabDataLoaders.from_df(ratings, item_name = 'name', bs = 64)
dls.show_batch()

モデルの学習

最後にモデルの学習を実施します。

なお、潜在変数は50個とし、レーティングの範囲は0.5から10.5に絞ります。

ユーザーのレーティングは1から10までですが、ある程度の下振れ、上振れを強要するような範囲設定にしています。

また、学習率は5e-3、L2正規化の重みは0.1に設定し、小さい学習率で学習を進めながらも過学習を防ぎます。

# モデルの学習
learn = collab_learner(dls, n_factors = 50, y_range = (0.5, 10.5))
learn.fit_one_cycle(1,5e-3, wd = 0.1)

実装結果

# 君の名は。を見た人に似ているムービーをおススメする
anime_factors = learn.model.i_weight.weight
ids = dls.classes['name'].o2i['Kimi no Na wa.']
distances = nn.CosineSimilarity(dim = 1)(anime_factors, anime_factors[ids][None])
idx = distances.argsort(descending = True)[:2]
dls.classes['name'][idx]

潜在変数を50とした時の協調フィルタリングの結果、君の名は。とコサイン類似度の高いアニメはキングダムの2ndシーズンのようです。

まとめ

今回の記事では、fastaiライブラリを使用してアニメに対する協調フィルタリングを適用してみました!

fastaiライブラリを使用すれば非常に短いコードで協調フィルタリングを実装できることがお分かりいただけたでしょうか?

皆さんもぜひfastaiライブラリを活用して、クイックな機械学習の実装を試してみてください!

コメント

タイトルとURLをコピーしました