hscrown commited on
Commit
617cd6a
·
verified ·
1 Parent(s): 178bcef

Upload matrixRec.py

Browse files
Files changed (1) hide show
  1. matrixRec.py +105 -0
matrixRec.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ !pip install datasets
3
+
4
+ from sklearn.decomposition import TruncatedSVD
5
+ from scipy.sparse.linalg import svds
6
+
7
+ import matplotlib.pyplot as plt
8
+ import seaborn as sns
9
+ import pandas as pd
10
+ import numpy as np
11
+ import warnings
12
+ warnings.filterwarnings("ignore")
13
+ from datasets import load_dataset
14
+
15
+ """## 데이터로드 및 전처리
16
+
17
+ """
18
+
19
+ # df:도서관,박물관,공원이 place_id,place_name,gu_name,type 으로된 데이터: csv 파일로 읽어오기
20
+ df= read_csv('places.csv', index=False, encoding='utf-8')
21
+
22
+ """# 사용자 평점데이터 """
23
+ user_rating= read_csv('user_rating_1000.csv', index=False, encoding='utf-8')
24
+
25
+ """아이템-특성 데이터 만들기"""
26
+ # place_id, type, place_name만 추출
27
+ item_feature = df[['place_id', 'type', 'place_name']]
28
+ item_feature.head()
29
+
30
+ """추천시스템구현
31
+ """
32
+
33
+ # 사용자-장소-평점 피봇만들기
34
+ df_user_place_ratings = user_place_data.pivot_table(index='user_id', columns='place_id', values='rating')
35
+ df_user_place_ratings.head()
36
+
37
+ """
38
+ 이후 할일
39
+ 1)pivot table을 matrix로 변환
40
+ 2)np.mean(axis = 1)을 통해 장소별 각 사용자들이 매기는 평점 평균을 구함
41
+ 1에서 구한 값과 2에서 구한 값을 빼서 사용자-평균 데이터 값을 변경
42
+ """
43
+
44
+ # float타입을 str로 변환
45
+ df_user_place_ratings.columns = df_user_place_ratings.columns.astype(str)
46
+
47
+ # df_user_place_ratings: pivot_table 값을 numpy matrix로 만든 것
48
+ df_user_place_ratings.columns = df_user_place_ratings.columns.str.strip() # 화이트스페이스 지우기
49
+ matrix = df_user_place_ratings.values #as_matrix function은 depricated.
50
+
51
+ # user_ratings_mean: 사용자의 평균 평점
52
+ user_ratings_mean = np.mean(matrix, axis = 1)
53
+
54
+ # # matrix_user_mean : 사용자-영화에 대해 사용자 평균 평점을 뺀 것.
55
+ matrix_user_mean = matrix - user_ratings_mean.reshape(-1, 1)
56
+
57
+ pd.DataFrame(matrix_user_mean, columns = df_user_place_ratings.columns).head()
58
+
59
+ # scipy에서 제공해주는 svd.
60
+ # U 행렬, sigma 행렬, V 전치 행렬을 반환.
61
+ U, sigma, Vt = svds(matrix_user_mean, k = 12)
62
+
63
+ # 현재 이 Sigma 행렬은 0이 아닌 값만 1차원 행렬로 표현된 상태입니다.
64
+ # 즉, 0이 포함된 대칭행렬로 변환할 때는 numpy의 diag를 이용해야 합니다.
65
+
66
+ sigma = np.diag(sigma)
67
+
68
+ sigma.shape
69
+
70
+ # U, Sigma, Vt의 내적을 수행하면, 다시 원본 행렬로 복원이 된다.
71
+ # 거기에 + 사용자 평균 rating을 적용한다.
72
+ svd_user_predicted_ratings = np.dot(np.dot(U, sigma), Vt) + user_ratings_mean.reshape(-1, 1)
73
+
74
+ df_svd_preds = pd.DataFrame(svd_user_predicted_ratings, columns = df_user_place_ratings.columns)
75
+ df_svd_preds.head()
76
+
77
+ df_svd_preds.shape
78
+
79
+ # 예측 결과 정렬 및 반환코드
80
+
81
+ # 사용자의 예측 평점이 높은 순으로 정렬된 데이터
82
+ # user_id가 0부터 시작하므로 user_row_number로 쓴다. 1부터시작하면 user_id-1하면됨.
83
+ user_id = 0 # 0번회원의 평점 예측
84
+ user_row_number = user_id
85
+ sorted_user_predictions = df_svd_preds.iloc[user_row_number].sort_values(ascending=False)
86
+
87
+ sorted_user_predictions = pd.DataFrame(sorted_user_predictions.reset_index())
88
+ sorted_user_predictions.columns = ['place_id', 'predict_rating']
89
+
90
+ sorted_user_predictions['place_id'] = sorted_user_predictions['place_id'].astype('int64')
91
+
92
+ # 원본 평점 데이터에서 user id에 해당하는 데이터를 추출
93
+ user_data = user_rating[user_rating['user_id'] == user_id]
94
+
95
+ # user_data에서 평점이 0인 데이터는 아직 안 가본 것이므로 삭제
96
+ user_data = user_data[user_data['rating'] != 0.0]
97
+
98
+ # (가본 장소) 추출된 데이터와 원본 장소 데이터를 합침
99
+ user_history = user_data.merge(item_feature, on='place_id').sort_values(['rating'], ascending=False)
100
+
101
+ # 사용자가 평가하지 않은 장소를 추천 대상으로 설정
102
+ recommendations = item_feature[~item_feature['place_id'].isin(user_history['place_id'])]
103
+
104
+
105
+