본문 바로가기

ML Recommendation

포트폴리오를 위한 추천 알고리즘 구현 [1장] : Scikit-Surprise

반응형

포트폴리오 구성을 위한 첫 번째 시간입니다.

 

추천 알고리즘 구현을 위해 포트폴리오를 구성하기 위한 실습을 하겠습니다. 

본 과정을 통해 초급자로서 기본적인 추천 알고리즘을 구현하고 차 후 응용하여 실무에 적용하려 합니다.

 

추천 알고리즘에 콘텐츠 기반 필터링, 아이템 기반 협업 필터링, 잠재 요인 기반 협업 필터링 등이 있으나 실제적인 서비스 구현을 위해서는 알고리즘 외에 대용량 트래픽에 안전한 네트워크 구축과 보안정책 수립, 실제 알고리즘을 적용하기 위한 프론트 개발자와의 협업 등 매우 다양한 협업이 필요합니다.

 

 

그 시작으로 파이썬 기반에서 작동하는 Surprise 추천 패키지를 구동하고 응용하여 한글 검색도 가능한 수준의 검색 추천 알고리즘을 구현합니다. 이정도 스펙에서도 Mid급이나 Small Size Business에 적용해도 매우 잘 작동을 하는 수준이 됩니다.

 

  • 진행 방법 및 얻고자 달성하고자하는 것
    • 무조건 따라 하면서 구동을 테스트해보겠습니다.
    • 추천 알고리즘은 이론과 코딩 실력에 비례합니다.  전체 맥락을 하나씩 알아가며 진행하겠습니다.
    • 학습 후에는 꼭 복습도 해주세요.
    • 진행은 Pycharm에서 진행하였습니다.
    • 본 내용을 바탕으로 추천에 사용된 알고리즘에 대한 이해를 대략적으로 이해하고 포트폴리오에 사용될 리포트를 작성하게 된다.
  • Surprise Package의 특징
    • 아이템 기반 최근접 협업필터링, SVD, SVD++, NMF 기반의 잠재 요인 협업 필터링을 쉽게 적용해 추천 시스템을 구축할 수 있습니다.
    • 사용법이 사이킷런과 유사하여 사이킷런 사용에 익숙하다면 구현이 더욱 용이합니다.
    • 패키지에 대한 자세한 설명은 이곳 [링크]

 

 

1. 패키지 설치하기

colab에서 다음을 실행하여 surprise 패키지를 실행합니다.

! pip install scikit-surprise

 

집중) surprise 패키지를 사용하기 위해서는 MicroSoft Visual Studio Build Tools이 설치되어 있어야 하니 아직 설치가 안되어 있다면 업데이트 혹은 다운로드

 

 

 

2. Surprise 실습 데이터 실행과 예측 시뮬레이션 테스트 실습

추천 데이터를 학습용과 테스트용 데이터 세트로 분리한 뒤 SVD행렬 분해를 통한 잠재 요인 협업 필터링을 수행하는 테스트를 해보겠습니다.

 

2-1. 관련모듈 설치 및 데이터 세트 다운로드

다음의 라이브러리를 다운로드합니다.

from surprise import SVD

from surprise import Dataset

from surprise import accuracy

from surprise.model_selection import train_test_split

 


사용할 데이터는 무비렌즈(MovieLens) 데이터로 평점을 영화의 평점이 들어가 있습니다. 다운로드하기 위해 surpries dataset 클래스의 load_bulletin()을 이용하고 이 데이터를 이용하여 train_test_split() API를 이용하여 학습 데이터 세트와 테스트 데이터 세트로 분리해 보겠습니다. 참고로 surprise에서는 Dataset을 이용해서만이 데이터를 로딩할 수 있습니다.

 

data = Dataset.load_builtin('ml-100k')
trainset, testset = train_test_split(data, test_size=25, random_state=52)
print('type--\n', type(testset))
print('len--\n',len(testset))
print('value--\n',testset)
print('value top5--\n',testset[:5])

 

Dataset.load_builtin의 경우 처음 실행을 하면 다운로드를 한 후 다음 실행부터 다운로드된 local의 위치를 로딩합니다. 다운로드된 위치는 'C:\Users\[이름]\.surprise_data'입니다. 

 

train_test_split의 경우 data 중 test를 25개 설정, random_state=0은 test 25개를 산출 시 고정된 값을 가져오라는 뜻을 내포합니다. 

 

기본적으로 train_test_split는 머신러닝에서 매우 흔하게 사용되는 함수로 데이터의 3가지 종류인 test, train 그리고 validation에 대해 공부하면 앞으로 매우 유용하게 사용됩니다.  사실 너무 기본이어서.. 알아야 합니다.


 

다음은 위에서 시행한 테스트 데이터를 이용하여 잠재 요인 협업 필터링(Latent Factor)을 수행해보겠습니다. 여기서는 SVD(Singular Value Decomposition)를 이용합니다.

 

! 다음에 공부해야 할 내용 - 잠재요인 협업 필터링, SVD

 

다음은 위에서 시행한 테스트 데이터를 이용하여 잠재 요인 협업 필터링(Latent Factor)을 수행해보겠습니다. 여기서는 SVD(Singular Value Decomposition)를 이용합니다.

 

 

(중요 부분) SVD()로 알고리즘 객체를 생성한 후 train 데이터를 이용하여 알고리즘을 학습을 시키게 됩니다. 이후 test()와 predict() 메서드를 이용하여 데이터 전체에 대해 추천을 예측하게 됩니다.

 

  • test(): 사용자-아이템 평점 데이터 세트 전체에 대해서 추천을 예측하는 메서드. 즉 입력된 데이터 세트에 대해 추천 데이터 세트를 만들어 주게 됩니다. 
  • predict(): 개별 사용자와 영화에 대한 추천 평점을 반환해 주게 됩니다.

algo = SVD()
algo.fit(trainset)
predictions = algo.test(testset)
print('Prediction type:', type(predictions), ' size: ', len(predictions))
# print(predictions)
print(predictions[:5])

print(predictions[:1])
print(predictions[0].uid)
print(predictions[0].iid)
print(predictions[0].est)

 

-- 다른 방식 출력

[print(pred.uid, pred.iid, pred.est) for pred in predictions[:3]]

 

 

상기 코드의 결과를 확인하면 개별사용자 아이디(uid), 영화코드아이디(iid)와 실제 평점(r_ui)정보에 기반해 Surprise의 추천 예측 평점(est)데이터를 튜플 형태로 가지고 있습니다. details 속성은 내부 처리 시 추천 예측을 할 수 없는 경우에 로그용으로 데이터를 남기는 데 사용합니다.  was_impossible이 true이면 생성 불가, false은 생성 가능입니다.

 

--Result

[Prediction(uid='699', iid='234', r_ui=3.0, est=3.6607379550742176, details={'was_impossible': False}), 

Prediction(uid='387', iid='176', r_ui=3.0, est=3.957850266528912, details={'was_impossible': False}), 

Prediction(uid='293', iid='443', r_ui=4.0, est=3.2788445667056454, details={'was_impossible': False}), 

Prediction(uid='932', iid='855', r_ui=5.0, est=4.1538633234052815, details={'was_impossible': False}), 

Prediction(uid='212', iid='511', r_ui=4.0, est=3.7585318180910816, details={'was_impossible': False})]

 

! 다음에 공부해야 할 내용 - 데이터형(튜플)

 

 


 

이번에는 predict() 메서드를 이용해 추천 예측을 합니다. predict() 메서드에 uid(아이디), iid(영화코드 아이디) 값을 입력하고 실행하면 됩니다.

 

uid = str(699)
iid = str(234)
pred = algo.predict(uid, iid)
print(pred)

 

--Result

user: 699        item: 234        r_ui = None   est = 3.31   {'was_impossible': False}

 

 


마지막으로 추천 예측 평점과 실제 평점과의 차이를 평가합니다. 모델의 정확성을 확인하기 위해서는 RMSE, MSE 등의 방법이 사용이 됩니다. 여기서는 surprise의 rmse()을 이용해 보겠습니다.  아래 내용을 확인해보면 정확성 96%입니다.

 

pred_accuracy = accuracy.rmse(predictions)

 

--result

RMSE: 0.9654

 

! 다음에 공부해야 할 내용 - 알고리즘 Accuracy에 대해 RMSE, MSE.. 방법에 대해

 

 

 

포트폴리오를 위한 추천 알고리즘 구현 [2장] : Scikit-Surprise

 

nicola-ml.tistory.com

 

반응형