지금까지 콘텐츠 가반 필터링, 아이템 가번 협업 필터링, 그리고 잠재 요인 기반 협업 필터링을 파이션 코드로 구현해 봤습니다. 앞에서 다룬 예제 코드는 최적화나 수향 속도 측면에서 좀 더 보완이 필요합나다 추천 시스템은 상업적으로 가치가 크기 때문에 별도의 패기지로 제공되면 매우 활동도가 높은 것입니다.
!pip install scikit-surprise
!conda install -c conda-forge scikit-surprise
Singular value decomposition (SVD) is a powerful technique in linear algebra that can help you perform various tasks in machine learning, such as dimensionality reduction, data compression, noise reduction, feature extraction, and latent factor analysis
data = Dataset.load_builtin('ml-100k')
trainset, testset = train_test_split(data, test_size = .25, random_state = 0)
algo = SVD(random_state = 0)
algo.fit(trainset
predictions = algo.test(testset)
print('prediction type', type(predictions))
predictions[:5]
Output:
prediction type <class 'list'>
Out[11]:
[Prediction(uid='120', iid='282', r_ui=4.0, est=3.5114147666251547, details={'was_impossible': False}),
Prediction(uid='882', iid='291', r_ui=4.0, est=3.573872419581491, details={'was_impossible': False}),
Prediction(uid='535', iid='507', r_ui=5.0, est=4.033583485472446, details={'was_impossible': False}),
Prediction(uid='697', iid='244', r_ui=5.0, est=3.846363949593691, details={'was_impossible': False}),
Prediction(uid='751', iid='385', r_ui=4.0, est=3.1807542478219157, details={'was_impossible': False})]
SVD 알고리즘 객체의 test (데이터 세트) 메소드의 호출 결과는 파이션 리스트이며 크기는 입력 인자 데이터 세트의 크기와 같은 25,000개입니다. 호출 결과로 반환된 리스트 객체는 25,000개의 prediction 객체를 내부에 가지고 있습니다, prediction 객체는 surprise 페키지에서 제공하는 데이터 타입이며 개별 사용자 아이디(uid)user id , 영화아이템아이디(iid) item id, 실제평점 review user id (r_ui)정보에 기반해 surprise의 추천 예측평점 (est)estimate score 데이터를 튜플 형태로 가지고 있습니다. prediction 객체의 details 속성은 내부 처리 시 추천 예측을 할 수 없는 경우는 로그용으로 데이터를 남기는 데 사용된니다
'was impossible' 이 True이면 예측값을 생성할 수 없는 데이터는 의미입니다. 여기서는 모두 fasle입니다
리스트 객체 내에 내포된 prediction객체의 uid iid r_ui est 등의 속성에 접근하려면 객체명 uid와 같은 형식으로 가능합니다 다음은 3객의 prediction 객체의 uid iid est 속성을 추출한 예제입니다
[(pred.uid, pred.iid, pred.est) for pred in predictions[:3]]
output:
[('120', '282', 3.5114147666251547),
('882', '291', 3.573872419581491),
('535', '507', 4.033583485472446)]
이번에는 surprise 페키징의 다른 추천 예측 메소드의 predict ()를 이용해 추천 예측을 해보겠습니다
predict()는 개별 사용자의 아이템에 대한 추천 평점을 예측해 줍니다. 인자로 개별 사용자 아이디, 아이템아이디를 입력라면 추천 예측 평점한 정보를 반환합니다
uid = str(196)
iid = str(302)
pred = algo.predict(uid,iid)
print(pred)
Output:
user: 196 item: 302 r_ui = None est = 4.49 {'was_impossible': False}
accuracy.rmse(predictions)
결과처럼 predict()는 개별 사용자와 아이템 정보를 입력하면 추천 예측 평점을 est로 반환합니다.
test()메소드는 입력 데이터 세트의 모든 사용자와 아이템아이디에 대해서 predict()응 반복적으로 수행한 결과라고 생각하면 좀 더 이해하기 쉬울 것입니다
테스트 데이터 세트를 이용해 추천 예측 평점과 실제 평점과의 차이를 평가해 보겠습니다. surprise 의 accuracy 모듈은 RSME , MSE 등의 방법으로 추천 시스템의 성능 평가 정보를 제공합니다, accuracy 모듈의 rsme()를 이용해 RSME 평가 결과를 확인해 복겠습니다