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 알고리즘이다. 알고리즘은 아래의 순서로 동작한다.

  1. 특정 사용자가 본 영화 목록을 불러온다