コンテンツベースのレコメンドを作る

Pythonでつくるレコメンデーションエンジン

Rob O'Callaghan

Director of Data

Jaccard類似度の導入

Jaccard類似度: Jaccard類似度を示すベン図。 $$J(A,B)=\frac{A\cap B }{A \cup B}$$

Pythonでつくるレコメンデーションエンジン

本同士のJaccard類似度を計算

genres_array_df:

Book Adventure Fantasy Tragedy Social commentary ...
The Hobbit 1 1 0 0 ...
The Great Gatsby 0 0 1 1 ...
A Game of Thrones 0 1 0 0 ...
Macbeth 0 0 1 0 ...
... ... ... ... ... ...
Pythonでつくるレコメンデーションエンジン

本同士のJaccard類似度を計算

from sklearn.metrics import jaccard_score


hobbit_row = book_genre_df.loc['The Hobbit']
GOT_row = book_genre_df.loc['A Game of Thrones']
print(jaccard_score(hobbit_row, GOT_row))
0.5
Pythonでつくるレコメンデーションエンジン

全アイテム間の距離を求める

from scipy.spatial.distance import pdist, squareform


jaccard_distances = pdist(book_genre_df.values, metric='jaccard') print(jaccard_distances)
[1.  0.5 1.  1.  0.5 1. ]
square_jaccard_distances = squareform(jaccard_distances)
print(square_jaccard_distances)
[[0.  1.  0.5 1. ]
 [1.  0.  1.  0.5]
 [0.5 1.  0.  1. ]
 [1.  0.5 1.  0. ]]
Pythonでつくるレコメンデーションエンジン

全アイテム間の距離を求める

print(square_jaccard_distances)
[[0.  1.  0.5 1. ]
 [1.  0.  1.  0.5]
 [0.5 1.  0.  1. ]
 [1.  0.5 1.  0. ]]
jaccard_similarity_array = 1 -  square_jaccard_distances
print(jaccard_similarity_array)
[[1.  0.  0.5 0. ]
 [0.  1.  0.  0.5]
 [0.5 0.  1.  0. ]
 [0.  0.5 0.  1. ]]
Pythonでつくるレコメンデーションエンジン

使いやすい距離テーブルを作成

distance_df = pd.DataFrame(jaccard_similarity_array,
                           index=genres_array_df['Book'], 
                           columns=genres_array_df['Book'])

distance_df.head()
            The Hobbit The Great Gatsby  A Game of Thrones          Macbeth     ...
The Hobbit        1.00             0.15               0.75             0.01     ...
The Great Gatsby  0.15             1.00               0.01             0.43     ...
...
Pythonでつくるレコメンデーションエンジン

本を比較する

print(distance_df['The Hobbit']['A Game of Thrones'])
0.75
print(distance_df['The Hobbit']['The Great Gatsby'])
0.15
Pythonでつくるレコメンデーションエンジン

最も類似する本を探す

print(distance_df['The Hobbit'].sort_values(ascending=False))
title
The Hobbit                                                             1.00
The Two Towers                                                         0.91
A Game of Thrones                                                      0.50
...
Pythonでつくるレコメンデーションエンジン

Ayo berlatih!

Pythonでつくるレコメンデーションエンジン

Preparing Video For Download...