CF(Collaborate Filtering)을 활용한 간단한 추천 시스템
nodeml 라이브러리
nodeml은 요즘 기계학습 실험을 진행하면서 관련 알고리즘을 정리하며 만든 node.js용 기계학습 라이브러리이다. 현재 Bayes, CNN 등의 분류 알고리즘과 User-based CF 알고리즘을 라이브러리 형태로 구현해 놓았고, Yeast, bbc의 공개된 데이터셋과 개인적으로 수집해놓았던 사용자별 영화 평가 데이터 220만건을 샘플 데이터로 이용 할 수 있게 해놓았다.
라이브러리 설치는 node.js 프로젝트 경로에서 아래의 명령어를 통해 설치가 가능하다.
npm install --save nodeml
nodeml을 이용한 추천 시스템 코드
아래의 코드는 영화 데이터를 nodeml을 사용하여 사용자별 40개씩 추천한 후 ndcg를 계산한 코드이다.
const {sample, CF, evaluation} = require('nodeml');
const movie = sample.movie();// 영화 데이터셋 {movie_id: no, user_id: no, rating: num, like: num}let train = [], test = [];
for (let i = 0; i < movie.length; i++) {
if (Math.random() > 0.8) test.push(movie[i]);
else train.push(movie[i]);
}
const cf =new CF();
cf.maxRelatedItem = 40;
cf.maxRelatedUser = 40;
cf.train(train, 'user_id', 'movie_id', 'rating');
let gt = cf.gt(test, 'user_id', 'movie_id', 'rating');
let result = cf.recommendGT(gt, 40);
let ndcg = evaluation.ndcg(gtr, result);
console.log(ndcg);
영화 데이터셋
nodeml에 있는 영화 데이터는 총 220만건의 유저-아이템 평가 데이터이다. 데이터는 아래의 형태와 같이 구성되어있다.
[ { movie_id: '1', user_id: '1', rating: '3', like: '1011' } , ... ]
아래의 코드는 영화 데이터셋을 불러온 후 8:2 비율의 트레이닝, 테스트 집합으로 분할한다.
let movie = nodeml.sample.movie();
let train = [], test = [];
for (let i = 0; i < movie.length; i++) {
if (Math.random() > 0.8) test.push(movie[i]);
else train.push(movie[i]);
}
추천 알고리즘
nodeml의 추천 알고리즘은 유저 기반(User-based) CF 알고리즘이다. 알고리즘은 아래의 순서로 동작한다.