TIL

👀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

💡Today I ThoughtPermalink

오늘의 체크리스트Permalink

  • 알고리즘 코드카타 1문제
  • SQL 코드카타 1문제
  • 프론트 오전 중에 재정비
  • 2차 유저테스트 올리기
  • ML 시스템 기능 개선 - ing
  • README 작성
  • TIL 작성

회고Permalink

 내일 README 초안 작성해야지.. 매일매일 해야하는게 산더미다.. 해야하는게 너무 많아..🥺

댓글남기기