Surprise

2022. 5. 15. 10:42AI/Machine learning

    목차
반응형

CFMF 기반 추천 시스템을 구현하고 test 할 수 있는 package

surprisescikit package의 일부

 

설치

pip install scikit-surprise

error: Microsoft Visual C++ 14.0 is required… 에러가 발생하면서 설치가 되지 않을 시,

https://visualstudio.microsoft.com/ko/vs/community/

에 방문하여 Visual Studio Community 2022download 한 후, 이를 설치합니다.

 

설치 시

수정을 누르고,

check 하여 설치한 후, PCreboot 해야 합니다.

 

Anaconda 환경에서 설치하고자 할 때는, 다음과 같이 설치합니다.

conda activate myenv
conda install -c conda-forge scikit-surprise

 

MovieLens 데이터

Surprise package에는 movie lens site에서 제공하는 영화 평점 데이터를 제공합니다. 

다음과 같이 사용할 수 있습니다. 

 

우선 package들을 import 합니다. 

import surprise
import pandas as pd
import matplotlib.pyplot as plot

 

이후 surprise의 Dataset에서 movie lens 데이터를 load 합니다. 

data = surprise.Dataset.load_builtin('ml-100k')

 

 데이터에 column name을 지정한 후 데이터를 확인해 봅니다. 

df = pd.DataFrame(data.raw_ratings, columns=["user", "item", "rate", "id"])
del df["id"]
df.head(10)

위 데이터를 pivot table 형태로 만들면 x축이 상품, y 축이 사용자인  rating matrix (utility matrix) R을 만들 수 있습니다.

 

df_table = df.set_index(["user", "item"]).unstack()
df_table.shape

 

혹은 DataFramepivot을 이용하여  rating matrix를 만들 수 있습니다.

 

df.pivot(index='user', columns='item', values='rate').fillna(0)

 

이 평점 행렬의 일부만 살펴보면 다음과 같이 대부분이 값이 없는(NaN) sparse matrix임을 알 수 있습니다.

 

df_table.iloc[212:222, 808:817].fillna("")

 

surprise 제공 기능

test data를 기본적으로 가지고 있습니다.

MovieLens라는 영화 추천 사이트의 데이터를 sample data로 제공하고 있습니다.

 

        Ÿ   ml-100k, ml-1m, jester 이렇게 3개의 데이터가 내장되어 있습니다.

        Ÿ   mk-100K

                n  MovieLens 100K 데이터

        Ÿ   ml-1m

                n  MovieLens 1m(100만개) 데이터

        Ÿ   jester

                n  미국의 버클리 대에서 추천 시스템 목적으로 수집한 조크 사이트의 게시물

                        s   조크나 재미있는 이야기 650만개의 평가 데이터

 

다음의 알고리즘들이 제공됩니다. 

surprise package name package 설명
random_pred.NormalPreditor train data가 정규분포일 시, 평점을 무작위로 추출하는 알고리즘
보통 성능이 나쁨
baseline_only.BaselineOnly 사용자 평점평균과 아이템의 평점평균을 모델화하여 예측
knns.KNNBasic 이웃을 고려한 CF 알고리즘
knns.KNNWithMeans 사용자의 평가경향을 고려한 CF 알고리즘
knns.KNNWithZScore 사용자의 평가경향을 표준(정규분포)화 한 CF 알고리즘
knns.KNBaseline 사용자의 평점평균과 아이템의 평점평균을 모델화 한 것인 baseline rating을 고려한 CF 알고리즘
matrix_factorization.SVD MF 알고리즘 (사실 SVD는 아님)
matrix_factorization.SVDpp MF 기반으로 사용자의 특정 아이템에 대한 평가여부를 이진값으로 하여 암묵적 평가로 추가한 SVD++ 알고리즘
참고논문: Advances in Collaborative Filtering. 14th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 2008
matrix_factorization.NMF 행렬의 값이 전부 양수일 때 사용 가능한 MF 알고리즘
slope_one.SlopeOne 간단하며 정확도가 높은 SlopeOne 알고리즘을 적용한 Item-based CF 알고리즘
co_clustering.CoClustering 사용자와 아이템을 동시에 clustering 하는 기법을 적용한 CF 알고리즘

 

추천 시스템 알고리즘들

        Ÿ   Baseline model

        Ÿ   Collaborative Filtering

        Ÿ   Neighborhood Models

                n  User-based CF

                n  Item-based CF

        Ÿ   Latent Factor Models

                n  Matrix Factorization

        n  SVD

                Ÿ   Content-based Recommendation

 

baseline model의 사용

from surprise.model_selection import KFold

bsl_options = {
    'method': 'als',
    'n_epochs': 5,
    'reg_u': 12,
    'reg_i': 5
}
algo = surprise.BaselineOnly(bsl_options)

np.random.seed(0)
acc = np.zeros(3)
cv = KFold(3)

for i, (trainset, testset) in enumerate(cv.split(data)):
    algo.fit(trainset)
    predictions = algo.test(testset)
    acc[i] = surprise.accuracy.rmse(predictions, verbose=True)

acc.mean()
Estimating biases using als...
RMSE: 0.9453
Estimating biases using als...
RMSE: 0.9377
Estimating biases using als...
RMSE: 0.9500
0.9443304984013942

 

유사도 계산

Cosine similarity

sim_options = {'name': 'cosine'}
algo = surprise.KNNBasic(sim_options=sim_options)
cross_validate(algo, data)["test_mae"].mean()

Pearson similarity

sim_options = {'name': 'pearson'}
algo = surprise.KNNBasic(sim_options=sim_options)
cross_validate(algo, data)["test_mae"].mean()

 

kNN 가중치 예측

sim_options = {'name': 'pearson_baseline'}
algo = surprise.KNNBasic(sim_options=sim_options)
cross_validate(algo, data)["test_mae"].mean()

 

반응형

'AI > Machine learning' 카테고리의 다른 글

비트코인 가격 예측 모델  (0) 2024.01.12
Latent factor model: matrix factorization  (0) 2022.05.15
데이터 마이닝 1  (0) 2022.05.14
CF model with visual information  (0) 2022.03.27
언어모델  (0) 2022.03.13