-
[scikit-surprise] SVD 모델 추론하기AI-ML 2024. 5. 26. 10:22728x90반응형
- 목차
키워드.
- scikit-surprise
- Inference
- SVD
함께 보면 좋은 글.
https://westlife0615.tistory.com/858
https://westlife0615.tistory.com/844https://westlife0615.tistory.com/851?category=1008315
들어가며.
이번 글에서는 생성한 SVD 모델을 활용하여 User 가 경험하지 못한 Item 에 대해 몇 점의 Rating 을 부여할지 예측하는 방법에 대해서 알아보도록 하겠습니다.
아래의 링크는 SVD 모델을 생성하는 방법에 대해 기술한 페이지이구요.
SVD 모델 생성 방법에 대해서 선행하시길 추천드립니다.
https://westlife0615.tistory.com/844SVD 모델 생성하기.
먼저 SVD 모델을 생성하도록 하겠습니다.
저는 Dataset 은 Movielens 데이터를 사용하며, Parameter Tuning 과정은 생략하도록 하겠습니다.
아래의 코드는 SVD 모델을 생성하는 간략한 예시 코드입니다.from surprise import Dataset, Reader, accuracy, SVD from surprise.model_selection import train_test_split import numpy as np import pandas as pd # Movielens lm-100k 를 로드합니다. dataset = Dataset.load_builtin("ml-100k") # dataset 으로부터 trainset 을 생성합니다. trainset = dataset.build_full_trainset() # SVD 모델을 생성한 후에 trainset 을 통하여 학습시킵니다. algo = SVD(n_factors=200, n_epochs=100, verbose=False) model = algo.fit(trainset)
그리고 생성된 모델의 특징들을 살펴봅니다.
Trainset 은 943 개의 user 와 1682 개의 item 들로 구성됩니다.print((trainset.n_users, trainset.n_items)) # --> (943, 1682)
모델의 정확도는 0.0321 의 RMSE 를 가집니다.predictions = model.test(testset, verbose=False) accuracy.rmse(predictions)
RMSE: 0.0321 0.03210897867018982
여기까지 간략한 모델 생성 단계를 마무리하였구요.
자세한 생성법에 대해서 알고싶으시다면 아래의 페이지를 참고해주세요.
https://westlife0615.tistory.com/844SVD 추론하기.
SVD 모델은 추론을 위한 estimate 함수를 제공합니다.
아래의 예시는 0번 user 와 0번 item 의 예측 결과이구요.
0번 user 가 0번 item 에 몇점의 Rating 을 부여할지에 대한 예측결과입니다.user = 0 item = 0 estimate_rating = model.estimate(user, item) print(estimate_rating)
2.996392482923106
이러한 방식으로 모든 user 와 모든 item 의 Rating 을 예측합니다.estimate_ratings = np.zeros(trainset.n_users, trainset.n_items) for inner_user in range(trainset.n_users): for inner_item in range(trainset.n_items): estimate_ratings[inner_user][inner_item] = \ model.estimate(inner_user, inner_item) pd.DataFrame(estimate_ratings)
참고로 SVD Model 은 인코딩된 user 와 item 식별값을 사용합니다.
만약 'Andy', 'Bob', 'Chris' 라는 세명의 user 들은 SVD Model 내부에서 0, 1, 2 로 인코딩됩니다.
이는 Item 또한 마찬가지입니다.
이번에는 원본 데이터를 Pivot Table 형식으로 구성해보겠습니다.
코드가 좀 복잡한데요. 그냥 원본 데이터를 User - Item 기준으로 표현하기 위한 코드라고 생각하시면 됩니다.df = pd.DataFrame(dataset.raw_ratings).pivot_table(index=0, columns=1, values=2) df.columns = list(map(lambda x: trainset.to_inner_iid(x), df.columns)) df.index = list(map(lambda x: trainset.to_inner_uid(x), df.index)) df.index.name = 'user' df.columns.name = 'item' df.sort_values(by=['user'], ascending=[True], inplace=True) df = df.T.sort_values(by=['item'], ascending=[True]) df = df.T df
이제 원본 데이터와 예측 데이터를 비교해보겠습니다.
하단 왼쪽 이미지는 예측 데이터입니다. 그리고 하단 우측 이미지는 원본 데이터입니다.
원본 데이터는 Sparse Matrix 형태로 상호작용하지 않은 User - Item 의 관계가 존재합니다.
하지만 예측 데이터에서는 이 미관측 데이터를 예측한 결과를 보여주죠.
그리고 (0,0), (1,1), (2,2) 등과 같이 관측 데이터의 경우에는 유사한 Rating 결과를 보여줍니다.- 0 user & 0 item = estimate(2.996392) & origin(3)
- 1 user & 1 item = estimate(2.985677) & origin (3)
- 2 user & 2 item = estimate(0.999926) & origin (1)
user & item 식별값 디코딩하기.
이번에는 인코딩된 user 와 item 의 식별값은 디코딩하는 방법에 대해서 알아봅니다.
SVD Model 은 4가지 함수를 제공합니다.- to_inner_uid
- to_inner_iid
- to_raw_uid
- to_raw_iid
이름에서 유추할 수 있듯이, uid 는 User Id , iid 는 Item Id 입니다.
그리고 inner 는 0부터 시작하는 Numeric Index 값이구요.
이는 인코딩된 결과입니다.
반면 raw 는 실제 User 와 Item 의 식별값입니다.
to_inner_uid 는 Raw User Id 를 Inner User Id 로 변환하는 함수입니다.
to_inner_iid 는 Raw Item Id 를 Inner Item Id 로 변환하는 함수입니다.
to_raw_uid 는 Inner User Id 를 Raw User Id 로 변환하는 함수입니다.
to_raw_iid 는 Inner Item Id 를 Raw Item Id 로 변환하는 함수입니다.
이러한 방식의 4가지 Mapper Function 이 제공됩니다.
trainset.to_inner_uid('196') --> 0 trainset.to_raw_uid(0) --> '196' trainset.to_inner_iid('196') --> 53 trainset.to_raw_iid(53) --> '196'
결론적으로 아래와 같은 형식으로 Raw User id 와 Raw Item Id 를 가지는 DataFrame 을 생성할 수 있게 됩니다.columns=list(map(lambda item: trainset.to_raw_iid(item), range(trainset.n_items))) index=list(map(lambda user: trainset.to_raw_uid(user), range(trainset.n_users))) pd.DataFrame(estimate_ratings, columns=columns, index=index)
반응형'AI-ML' 카테고리의 다른 글
[PyTorch] requires_grad 알아보기 (0) 2024.05.26 [PyTorch] squeeze, unsqueeze 알아보기 (0) 2024.05.21 [ scikit-surprise ] SVD Regularization Terms 알아보기 (0) 2024.05.18 [scikit-surprise] SVD 모델 생성하기 (0) 2024.05.18 [scikit-surprise] Dataset 이해하기 (0) 2024.05.14