[TIL] 내일배움캠프 120일차_[ML] Surprise 라이브러리를 활용한 추천 시스템
👀Today I LearnPermalink
Surprise 라이브러리란?Permalink
- Surprise는 Scikit-learn 스타일의 API를 제공하는 추천 시스템 라이브러리로, 다양한 협업 필터링 알고리즘을 지원
- 특히, 사용자-아이템 평점 데이터를 다루는 데 최적화되어 있으며, 다양한 평가 지표를 제공하여 모델의 성능을 분석할 수 있음
주요 특징Permalink
- 다양한 추천 알고리즘 제공 (SVD, KNN, NMF 등)
- 간편한 데이터 로딩 및 학습
- 커스텀 알고리즘 구현 가능
- RMSE, MAE 등의 평가 지표 제공
Surprise 설치하기Permalink
-
Surprise는 pip을 이용하여 간단히 설치할 수 있음
pip install scikit-surprise
-
설치 후 정상적으로 라이브러리가 로드되는지 확인
import surprise print(surprise.__version__)
Surprise를 이용한 추천 시스템 구현Permalink
(1) 데이터 로드Permalink
-
Surprise는 Movielens와 같은 공개 데이터셋을 쉽게 불러올 수 있습니다.
from surprise import Dataset from surprise.model_selection import train_test_split # Movielens 100k 데이터 로드 data = Dataset.load_builtin('ml-100k') trainset, testset = train_test_split(data, test_size=0.2)
(2) SVD 모델 학습 및 평가Permalink
-
SVD(Singular Value Decomposition) 알고리즘을 사용하여 추천 모델을 학습
from surprise import SVD from surprise import accuracy from surprise.model_selection import cross_validate # SVD 모델 생성 model = SVD() # 모델 학습 model.fit(trainset) # 예측 수행 predictions = model.test(testset) # RMSE 평가 rmse = accuracy.rmse(predictions) print(f"RMSE: {rmse}")
(3) 특정 사용자에게 영화 추천하기Permalink
-
학습된 모델을 이용하여 특정 사용자에게 맞춤형 추천을 제공
# 특정 사용자(user_id = 196)의 영화(movie_id = 302)에 대한 예상 평점 예측 user_id = str(196) item_id = str(302) pred = model.predict(user_id, item_id) print(f"예상 평점: {pred.est}")
(4) 전체 영화 추천 리스트 생성Permalink
-
사용자가 아직 평가하지 않은 영화에 대한 추천 목록을 생성할 수도 있음
def get_top_n_recommendations(predictions, n=10): from collections import defaultdict top_n = defaultdict(list) for pred in predictions: top_n[pred.uid].append((pred.iid, pred.est)) # 예측 평점 기준으로 정렬 for uid, user_ratings in top_n.items(): user_ratings.sort(key=lambda x: x[1], reverse=True) top_n[uid] = user_ratings[:n] return top_n # 모든 사용자에 대한 추천 리스트 생성 top_n_recs = get_top_n_recommendations(predictions, n=5) # 특정 사용자(196) 추천 목록 확인 print(f"User 196 추천 영화: {top_n_recs['196']}")
다양한 알고리즘 적용Permalink
- Surprise는 SVD 외에도 여러 알고리즘을 지원
KNN 기반 협업 필터링Permalink
from surprise import KNNBasic
sim_options = {'name': 'cosine', 'user_based': True}
model = KNNBasic(sim_options=sim_options)
model.fit(trainset)
predictions = model.test(testset)
accuracy.rmse(predictions)
참고 자료Permalink
- Surprise 공식 문서: https://surprise.readthedocs.io/
- Movielens 데이터셋: https://grouplens.org/datasets/movielens/
💡Today I ThoughtPermalink
오늘의 체크리스트Permalink
- 알고리즘 코드카타 1문제
- SQL 코드카타 1문제
- 프론트 오전 중에 재정비
- 2차 유저테스트 올리기
- ML 시스템 기능 개선 - ing
- README 작성
- TIL 작성
회고Permalink
내일 README 초안 작성해야지.. 매일매일 해야하는게 산더미다.. 해야하는게 너무 많아..🥺
댓글남기기