LoginSignup
45
46

More than 5 years have passed since last update.

[機械学習]5分で説明するレコメンドアルゴリズム

Last updated at Posted at 2018-09-17

初めに。

LTで作成したので、口語での補足説明を前提としている、かつ5分という制約があるので説明不足な箇所があると思われます、ご注意くださいm(_ _)m

内容

機械学習を用いた、アニメレコメンド機能のアルゴリズムの一例を、数式抜きで図解を用いて5分ぐらいで説明。

ゴール:どうやってレコメンドされているか、大体のイメージがつかめればおk。

レコメンドする流れ

1, 好きなアニメのタイトルを入力。
2, おすすめアニメTOP5表示

※視聴済みについての制御はかけない。
※海外ニキのデータです。myanimelist.net

よてい (5min)

・データについて。(1min)

・アルゴリズムについて。(3min)

・バッファ(1min)

データについて。

Anime Recommendations Database(kaggle)
ここからDLしました。

中身

animeに対するユーザー毎の10段階評価

(前処理は省略。ここに最も時間がかかる)

image.png

2966行(縦:アニメタイトル数), 69500列(横:ユーザー数)の行列。

このように成分のほとんどが0である行列を疎行列と呼ぶ。

※実際は疎行列のままだと計算効率が悪いので、csr_matrixで変換します。

アルゴリズムについて

scikit-learnのNearestNeighborsを使う。(類似度を利用)

イメージ

1、それぞれのアニメをn次元空間の点に落とし込む

2、入力されたアニメと、距離(あるいは角度)が近いアニメたちをレコメンド

空間でとらえることが重要。

次でそれぞれ詳しく説明!

1、それぞれのアニメをn次元空間の点に落とし込む

わかりやすく2次元(2人の評価)で考える。
先ほどのデータだと、行列(2966×69500)から2ユーザーpick(2966×2)と考える。

今回は赤点が入力(選択)された時の おすすめアニメを求める。

※図だと間違えて5段階評価にしちゃってます。

image.png

わかりやすいようにラベルを付ける。

image.png

本来であれば、これらのアニメがn次元空間の座標に存在する。(nはユーザーの数)

※僕が適当にラベル付けしたので、実際のデータとは関係ない。

2、入力されたアニメと、距離(または角度)が近いアニメたちをレコメンド

image.png

今回は角度(コサイン類似度)を使うので、原点と結んだ直線2つのなす角が小さいアニメが選ばれる。

図よりオーバーロードが最も近い。

※これら以外にも色々な方法がある。また結果も異なる。
こちらが分かりやすい

コード

学習(NearestNeighbors)

# モジュール読み込み
from sklearn.neighbors import NearestNeighbors 
nn = NearestNeighbors(algorithm= "brute", metric= "cosine")

# 処理済みのデータを読み込み
model_NN = nn.fit(anime_data_csr)

構築したモデルでレコメンド実行!

# 好きなアニメのタイトルを入力(English)
Anime = "Overlord"

# 表示処理、最も近い5つを取り出す。
distance, indice = model_NN.kneighbors(anime_data.iloc[anime_data.index== Anime].values.reshape(1,-1),n_neighbors=6)
for i in range(0, len(distance.flatten())):
    if  i == 0:
        print(anime_data[anime_data.index== Anime].index[0],"が好きな人へのおすすめアニメTOP5")
    else:
        print("【{0}位】【{1}】\n score {2}".format(i,anime_data.index[indice.flatten()[i]],round(distance.flatten()[i],5)),"\n")

結果

Overlord が好きな人へのおすすめアニメTOP5

【1位】【Gate: Jieitai Kanochi nite, Kaku Tatakaeri】
 score 0.38582 

【2位】【Dungeon ni Deai wo Motomeru no wa Machigatteiru Darou ka】
 score 0.43646 

【3位】【Rokka no Yuusha】
 score 0.44624 

【4位】【Gate: Jieitai Kanochi nite, Kaku Tatakaeri 2nd Season】
 score 0.46009 

【5位】【One Punch Man】
 score 0.48241 

まとめ

pythonのモジュールを使えば、誰でも簡単に実装できる。

ただし、数学のお勉強をしていないとアルゴリズムの取捨選択を正確に行えないので、ある程度知識は必要。

おしまい。

参考

kaggle kernels
sklearn.neighbors.NearestNeighbors

45
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
46