File size: 3,883 Bytes
617cd6a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# -*- coding: utf-8 -*-
!pip install datasets
from sklearn.decomposition import TruncatedSVD
from scipy.sparse.linalg import svds
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
from datasets import load_dataset
"""## ๋ฐ์ดํฐ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
"""
# df:๋์๊ด,๋ฐ๋ฌผ๊ด,๊ณต์์ด place_id,place_name,gu_name,type ์ผ๋ก๋ ๋ฐ์ดํฐ: csv ํ์ผ๋ก ์ฝ์ด์ค๊ธฐ
df= read_csv('places.csv', index=False, encoding='utf-8')
"""# ์ฌ์ฉ์ ํ์ ๋ฐ์ดํฐ """
user_rating= read_csv('user_rating_1000.csv', index=False, encoding='utf-8')
"""์์ดํ
-ํน์ฑ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ"""
# place_id, type, place_name๋ง ์ถ์ถ
item_feature = df[['place_id', 'type', 'place_name']]
item_feature.head()
"""์ถ์ฒ์์คํ
๊ตฌํ
"""
# ์ฌ์ฉ์-์ฅ์-ํ์ ํผ๋ด๋ง๋ค๊ธฐ
df_user_place_ratings = user_place_data.pivot_table(index='user_id', columns='place_id', values='rating')
df_user_place_ratings.head()
"""
์ดํ ํ ์ผ
1)pivot table์ matrix๋ก ๋ณํ
2)np.mean(axis = 1)์ ํตํด ์ฅ์๋ณ ๊ฐ ์ฌ์ฉ์๋ค์ด ๋งค๊ธฐ๋ ํ์ ํ๊ท ์ ๊ตฌํจ
1์์ ๊ตฌํ ๊ฐ๊ณผ 2์์ ๊ตฌํ ๊ฐ์ ๋นผ์ ์ฌ์ฉ์-ํ๊ท ๋ฐ์ดํฐ ๊ฐ์ ๋ณ๊ฒฝ
"""
# floatํ์
์ str๋ก ๋ณํ
df_user_place_ratings.columns = df_user_place_ratings.columns.astype(str)
# df_user_place_ratings: pivot_table ๊ฐ์ numpy matrix๋ก ๋ง๋ ๊ฒ
df_user_place_ratings.columns = df_user_place_ratings.columns.str.strip() # ํ์ดํธ์คํ์ด์ค ์ง์ฐ๊ธฐ
matrix = df_user_place_ratings.values #as_matrix function์ depricated.
# user_ratings_mean: ์ฌ์ฉ์์ ํ๊ท ํ์
user_ratings_mean = np.mean(matrix, axis = 1)
# # matrix_user_mean : ์ฌ์ฉ์-์ํ์ ๋ํด ์ฌ์ฉ์ ํ๊ท ํ์ ์ ๋บ ๊ฒ.
matrix_user_mean = matrix - user_ratings_mean.reshape(-1, 1)
pd.DataFrame(matrix_user_mean, columns = df_user_place_ratings.columns).head()
# scipy์์ ์ ๊ณตํด์ฃผ๋ svd.
# U ํ๋ ฌ, sigma ํ๋ ฌ, V ์ ์น ํ๋ ฌ์ ๋ฐํ.
U, sigma, Vt = svds(matrix_user_mean, k = 12)
# ํ์ฌ ์ด Sigma ํ๋ ฌ์ 0์ด ์๋ ๊ฐ๋ง 1์ฐจ์ ํ๋ ฌ๋ก ํํ๋ ์ํ์
๋๋ค.
# ์ฆ, 0์ด ํฌํจ๋ ๋์นญํ๋ ฌ๋ก ๋ณํํ ๋๋ numpy์ diag๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค.
sigma = np.diag(sigma)
sigma.shape
# U, Sigma, Vt์ ๋ด์ ์ ์ํํ๋ฉด, ๋ค์ ์๋ณธ ํ๋ ฌ๋ก ๋ณต์์ด ๋๋ค.
# ๊ฑฐ๊ธฐ์ + ์ฌ์ฉ์ ํ๊ท rating์ ์ ์ฉํ๋ค.
svd_user_predicted_ratings = np.dot(np.dot(U, sigma), Vt) + user_ratings_mean.reshape(-1, 1)
df_svd_preds = pd.DataFrame(svd_user_predicted_ratings, columns = df_user_place_ratings.columns)
df_svd_preds.head()
df_svd_preds.shape
# ์์ธก ๊ฒฐ๊ณผ ์ ๋ ฌ ๋ฐ ๋ฐํ์ฝ๋
# ์ฌ์ฉ์์ ์์ธก ํ์ ์ด ๋์ ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ
# user_id๊ฐ 0๋ถํฐ ์์ํ๋ฏ๋ก user_row_number๋ก ์ด๋ค. 1๋ถํฐ์์ํ๋ฉด user_id-1ํ๋ฉด๋จ.
user_id = 0 # 0๋ฒํ์์ ํ์ ์์ธก
user_row_number = user_id
sorted_user_predictions = df_svd_preds.iloc[user_row_number].sort_values(ascending=False)
sorted_user_predictions = pd.DataFrame(sorted_user_predictions.reset_index())
sorted_user_predictions.columns = ['place_id', 'predict_rating']
sorted_user_predictions['place_id'] = sorted_user_predictions['place_id'].astype('int64')
# ์๋ณธ ํ์ ๋ฐ์ดํฐ์์ user id์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
user_data = user_rating[user_rating['user_id'] == user_id]
# user_data์์ ํ์ ์ด 0์ธ ๋ฐ์ดํฐ๋ ์์ง ์ ๊ฐ๋ณธ ๊ฒ์ด๋ฏ๋ก ์ญ์
user_data = user_data[user_data['rating'] != 0.0]
# (๊ฐ๋ณธ ์ฅ์) ์ถ์ถ๋ ๋ฐ์ดํฐ์ ์๋ณธ ์ฅ์ ๋ฐ์ดํฐ๋ฅผ ํฉ์นจ
user_history = user_data.merge(item_feature, on='place_id').sort_values(['rating'], ascending=False)
# ์ฌ์ฉ์๊ฐ ํ๊ฐํ์ง ์์ ์ฅ์๋ฅผ ์ถ์ฒ ๋์์ผ๋ก ์ค์
recommendations = item_feature[~item_feature['place_id'].isin(user_history['place_id'])]
|