[18주차] 추천시스템 구현

2023. 7. 21. 12:15BOOTCAMP/프로그래머스 인공지능 데브코스

아마존 뷰티 제품 평점 정보:

  • 2M 개 이상의 고객 리뷰와 평점 정보를 포함한 데이터셋을 가지고 인기 제품 추천과 을 만들어 보자. 앞서 영화 추천과 비슷하게 진행가능하다.
  • 데이터셋에는 총 4가지 정보가 포함되어 있다:
  • 앞서 2일 차와 4일 차 강의 내용을 기반으로 인기도 기반의 추천과 SVD 기반의 추천을 만들어 보자
import pandas as pd
import numpy as np

amazon_ratings = pd.read_csv("https://grepp-reco-test.s3.ap-northeast-2.amazonaws.com/ratings_Beauty.csv")

4가지 정보 중에 하나라도 비어있는 레코드들을 모두 날리고 처음 5개의 레코드를 살펴본다.

amazon_ratings = amazon_ratings.dropna()
amazon_ratings.head()

몇 개의 레코드와 몇개의 칼럼이 있는지 살펴본다

amazon_ratings.shape
(2023070, 4)

 

인기도 기반 추천 만들기

정보가 없는 사용자들에게 가장 쉽게 사용할 수 있는 형태의 추천 방식

리뷰의 수가 가장 큰 상품 10개를 계산해 본다.

popular_products = pd.DataFrame(amazon_ratings.groupby('ProductId')['Rating'].count())
most_popular = popular_products.sort_values('Rating', ascending=False)
most_popular.head(10)

이 10개를 바 그래프로 그려본다

most_popular.head(10).plot(kind = "bar")

리뷰 수가 어느 정도 이상되는 상품을 대상으로 평균 평점이 4 이상인 뷰티 상품을 리턴하게 해 보자

# 각 제품에 대한 평균 평점 계산
average_ratings = amazon_ratings.groupby('ProductId')['Rating'].mean()

# 평균 평점이 4 이상인 제품 선택
highly_rated = average_ratings[average_ratings >= 4]

# 각 제품에 대한 리뷰 수 계산
review_counts = amazon_ratings['ProductId'].value_counts()

# 리뷰 수가 100 이상인 제품만 선택
highly_rated = highly_rated[highly_rated.index.isin(review_counts[review_counts > 100].index)]
print(highly_rated)

 

ProductId

B00004 TUBL    4.634409
B00004 TUBV    4.269006
B00004 U9 UY    4.726027
B000050 B6 U    4.175066
B000052 XW5    4.245399

                ...   

B00 KHGIK54    4.757962
B00 KHH2 VOY    4.802469
B00 KQBR9 FM    4.686131
B00 KWFDBKE    4.757396
B00 L5 JHZJO    4.526639
Name: Rating, Length: 1918, dtype: float64

 

모델 기반 CF 추천 시스템 만들기

평점 행렬을 기반으로 SVD++를 사용해 보는 방식. 앞서 사용해 본 surprise 모듈을 사용하던지 scikit-learn의 TruncatedSVD를 사용해 본다

amazon_ratings1 = amazon_ratings.head(10000)
ratings_utility_matrix = amazon_ratings1.pivot_table(values='Rating', index='UserId', columns='ProductId', fill_value=0)
ratings_utility_matrix.head()
ratings_utility_matrix.shape
 (9697, 886)
X = ratings_utility_matrix.T
X.head()
X.shape
 (886, 9697)
X1 = X
from sklearn.decomposition import TruncatedSVD

SVD = TruncatedSVD(n_components=10)
decomposed_matrix = SVD.fit_transform(X)
decomposed_matrix.shape
 (886, 10)
correlation_matrix = np.corrcoef(decomposed_matrix)
correlation_matrix.shape
(886, 886)

 

뒷부분은 각자 Surprise 구현을 바탕으로 만들어보기 바란다

!pip install surprise

from surprise import SVD
from surprise import Dataset
from surprise import Reader
from surprise.model_selection import train_test_split

# 데이터 로드
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(amazon_ratings[['UserId', 'ProductId', 'Rating']], reader)

# 훈련 세트와 테스트 세트로 분할
trainset = data.build_full_trainset()

# SVD 모델 훈련
model = SVD()
model.fit(trainset)

# 특정 사용자 (예: 'A3R5OBKS7OM2IR')에 대한 상품 추천 생성
user_id = 'A3R5OBKS7OM2IR'
user_ratings = amazon_ratings[amazon_ratings['UserId'] == user_id]
known_product_ids = set(user_ratings['ProductId'])

# 모든 상품에 대한 예측 평점 생성
predicted_ratings = []
for product_id in amazon_ratings['ProductId'].unique():
    if product_id not in known_product_ids:
        predicted_rating = model.predict(user_id, product_id).est
        predicted_ratings.append((product_id, predicted_rating))

# 예측 평점이 가장 높은 상품 추출
top_recommended_products = sorted(predicted_ratings, key=lambda x: x[1], reverse=True)[:10]

# 추천된 상품 출력
print(top_recommended_products)
[('B005 V247 N8', 4.919562784490177), ('B004 AIAVYS', 4.918523710261444), ('B00466 VJ04', 4.907686990169151), ('B0006 B65 PC', 4.906617527016292), ('B004 AI5756', 4.904143524481818), ('B00 J3 K9 W6 G', 4.89984832133474), ('B004 CNRDBU', 4.894454650325265), ('B001 F0 RBRE', 4.8915666080415185), ('B009 OWSHQE', 4.891043401699439), ('B002 YFN49 I', 4.884813644458682)]
 

'BOOTCAMP > 프로그래머스 인공지능 데브코스' 카테고리의 다른 글

[17주차] GAN  (0) 2023.07.21
[16주차] NLP II와 Visual Recognition  (0) 2023.07.21
[15주차] NLP  (0) 2023.06.28
[14주차] Spark  (0) 2023.06.28
[13주차] monthly project3  (0) 2023.06.28