2022. 5. 15. 10:42ㆍAI/Machine learning
- 목차
CF와 MF 기반 추천 시스템을 구현하고 test 할 수 있는 package
surprise는 scikit package의 일부
설치
pip install scikit-surprise |
error: Microsoft Visual C++ 14.0 is required… 에러가 발생하면서 설치가 되지 않을 시,
https://visualstudio.microsoft.com/ko/vs/community/
에 방문하여 Visual Studio Community 2022를 download 한 후, 이를 설치합니다.
설치 시
수정을 누르고,
를 check 하여 설치한 후, PC를 reboot 해야 합니다.
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 |
혹은 DataFrame의 pivot을 이용하여 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 |