1
2
3
4
5
6
7
8
9
10
11
## Step.3  Evaluating model performance ###
 
#추천실시
UBCFlist <- predict(mUBCF, recommenderUserList, n=5)
 
IBCFlist <- predict(mIBCF, recommenderUserList, n=5)
 
 
#추천받은 리스트 보기
as(UBCFlist, "list")
as(IBCFlist, "list")
cs

이제 본격적으로 모델을 구현해 보겠다.

위 코드처럼 입력해주면 우리는 추천 리스트를 만들게 되는데, 그 결과는 아래 화면과 같다 



직관성이 떨어지지만 읽어보면 제일 위 114 고객에는 20, 425, 771, 31, 47번 물품을 추천한다는 것이다.

바로 위에서 추천을 할때 n을 5로 주어서 다섯개만 추천해 준 것이며, 이 숫자를 바꿔주면 해당 숫자의 갯수만큼 추천해준다.


이제 모델 결과표와 그래프를 생성해 보겠다. (사실 위 과정까지만 해도 추천 과정은 끝난것이다)


1
2
3
4
5
6
7
8
9
10
# 시뮬레이션에 사용할 알고리즘과 유사도 지표 종류 지정
alUBCF<-list("user-based CF_Cosine" = list(name = "UBCF"
                                           param = list(method = "Cosine")),
             "user-based CF_Pearson" = list(name = "UBCF"
                                           param = list(method = "Pearson")))
 
alIBCF<-list("item-based CF_Cosine" = list(name = "IBCF"
                                           param = list(method = "Cosine")),
             "item-based CF_Pearson" = list(name = "IBCF"
                                           param = list(method = "Pearson")))
cs


위는 평가를 위한 알고리즘을 생성한 것이다. 각각 Cosine과 Pearson 두 가지를 모두 포함한 알고리즘을 만들어주면 된다.




위는 우리가 생성했던 모델에 대한 최종 평가에 사용할 evaluation 함수이다. 바로 위에서 생성한 알고리즘이 알고리즘 자리로,

초반부에 evaluationScheme 함수로 생성한 결과같이 scheme로 오게 된다.


 

1
2
3
4
5
6
7
8
# 실행 및 결과 표시
result1<-evaluate(scheme, alUBCF,n=c(1,3,5))
result1
avg(result1) #결과값 테이블을 볼 수 있는 결과물 
 
result2<-evaluate(scheme, alIBCF,n=c(1,3,5))
result2
avg(result2) 
cs


이런식으로 실행을 해주게 되면 



이런 결과가 나온다. 


여기서 핵심적으로 봐야할 것은 precision 과 recall 이며, 해당 지표에 대한 설명은 이전 포스팅에서 진행하였다.

하지만 직관성이 떨어지기 때문에 다시 그래프를 그려보도록 한다.


1
2
3
4
5
6
7
# 그래프 
 plot(result1, annotate = TRUE , legend = "bottomright"#  높음 (두자리)  - 코사인 높음 
 plot(result1, "prec/rec", annotate = TRUE , legend = "bottomright"# 낮음 (세자리) 
 
 plot(result2, annotate = TRUE , legend = "topleft"# 피어슨이 더 높다 
 plot(result2, "prec/rec", annotate = TRUE , legend = "topleft")
 # 추천성능 UBCF 가 현저하게 높다 
cs


 

참고로 plot 함수의 인자는 아래와 같다.




위의 과정을 끝냈으면, 각각 ROC 방식("pre/rec"라고 입력 안하면 defalt가 ROC) 일때 result1 과 result2의 성과를 확인해보도록 하겠다.

제일 위 코드를 실행시키면 아래와 같은 그래프가 뜬다.

UBCF 의 경우 코사인 방식이 더 성과가 좋은것을 알 수 있다. 


IBCF 의 경우 피어슨 방식이 더 성과가 좋은것을 알 수 있다. 






오늘은 R로 상품추천기술중 하나인 IBCF와 UBCF를 구현해 보겠다.



sample.csv


샘플데이터는 아래와 같이 생겼다.



데이터에 대하여 간단히 설명하면, V1과 V2, 그리고 V3는 각각 사용자식별번호, 아이템번호, 구매 횟수를 뜻한다.

즉 이미 전처리가 어느정도 완료되어 있는 데이터를 바탕으로, 우리는 사용자 베이스 추천, 아이템 베이스 추천을 진행하도록 하겠다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
##########################################
## 온라인 유통회사의 추천 시스템 사례 ####
##########################################
## step.1 preparing the data #####
 
# 데이터 로딩
data<-read.csv("sample.csv",head=FALSE, sep =",")
View(data)
 
# 추천시스템 패키지를 인스톨
install.packages("recommenderlab")
 
 
# 패키지를 로딩
library(recommenderlab)
 
 
# 데이터형을 realRatingMatrix로 변환
<-as(data, "realRatingMatrix")
 #바이너리는 산 횟수가 0 1 (샀다 안샀다) 리얼레이팅은 진짜 횟수 (0~) 
cs


우리가 사용할 패키지는 recommenderlab 이며, 없다면 설치하도록 하자.

아래 행의 realRatingMatrix 는 진짜 횟수에 대한 것으로, 우리는 V3칼럼에서 볼 수 있는 것처럼 샀는지 안샀는지의 유무가 아닌

얼마나 구매했는지를 바탕으로 모델을 만들어야 하기 때문에 realRatingMatrix를 사용한다.


binary 일 경우네는 쉽게 이야기해 더미 변수처럼 1 0 으로 샀냐 안샀냐만 구분해주는 것이다.


1
2
3
4
5
6
7
8
9
10
## Step.2 Training a model on the data ###
 
# 머신러닝을 위해 학습데이터선정
# 전체데이터의 90%를 학습데이터로 선정
trainingData<- sample(4945,4500#(4950개중 4500개 추출 )
trainingSet<- r[trainingData]
 
# 행의 총합 5개 이상의 아이템만 선택, 많이 팔리지 않은 아이템을 제외시킴
trainingSet<-trainingSet[rowCounts(trainingSet) > 5#아이템이 적은것은 왜곡된 추천결과 보내줄수 있음 
as(trainingSet,"matrix")  
cs


이제 모델을 생성하기 위한 작업을 해보자.

코드에서 볼 수 있는 것처럼 트레이닝셋과 테스트셋을 구분하기 위하여 추출을 해주는데, 이 과정에서 구매 횟수가 5보다 낮은것은

제외하도록 한다. 그 이유는 구매가 적으면 아웃라이어처럼 결과에 왜곡을 줄 수 있기 때문이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# scheme 지정과 표시
# 추천의 평가방식을 저장 
# split은 분할, crosss는 교차검정 
# train 은 모델만드는 데이터 비율로서 아래 코드는 이를 80%로, 나머지 20%를 평가셋으로 한 것을 의미
# given 은 사람당 평가하는 아이템 수 
# K는 시뮬레이션 반복횟수
scheme <- evaluationScheme(trainingSet,method="split", train = .8,
                           given = 6
                           goodRating = 4,
                           k = 3)
    #추천의 평가방식을 지정하고 저장 - 중요하다
    #교차검정(crosstable) - 전체 데이셋을 k개로 나눈다 
    # train - 모델을 만드는 데이터 비율 - 위 코드는 80퍼로 만듬
    # given 은 사람당 평가하는 아이템 수 
    # goodrating = 실제 사용 등급이 4이상이면 모두 평가에 포함 
    # 시뮬레이션 실행할때마다 결과가 바뀜 - 너무많이 돌리면 개선이 덜 되고, 적게돌리면  편차 큼 
cs


위는 상품추천기술의 핵심 함수라고 할 수 있는 evaluationScheme 함수이다. 설명은 주석을 참고하면 된다.

.




위는 또다른 핵심 함수인 Recommender에 대한 설명이다. 여기서 우리는 UBCF 와 IBCF를 구분해서 각각 모델을 생성하게 된ㄷ.

파라미터로는 cosine와 pearson 두 가지가 있으며, 선택해주면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 추천모델생성
mUBCF <- Recommender(trainingSet,method="UBCF",
                     parameter="Cosine")
 
mUBCF
 
mIBCF <- Recommender(trainingSet,method="IBCF",
                     parameter="Cosine")
 
mIBCF
 
# 추천을 받을 사용자리스트 (Testset)
recommenderUserList<-r[-trainingData] # 트레이닝데이터 반대되는 행들을 테스트셋으로 
 #트레이닝셋을 쓰지않고 데이터를 쓰는 이유는 이미 4500명에 대한 
 #트레이닝데이터를 만들었기 때문에 445명에 대한 테스트셋을 만들위해 추천리스트 다시 설정 
 
cs


위와 같이 코딩을 해주면 되고, 아래 -trainingData는 아까 설정한 트레이닝데이터를 제외한 나머지를 테스트 데이터로 사용하겠다는 뜻이다.



상품추천기술은 개인화 기술이라고 불리며 그 핵심 기술인 협업 필터링은 아래와 같은 특징을 가진다


협업필터링(Collaborative filtering) 

  • 공동여과기법 
  • 기호가 유사한 다른 사람이 좋아하는 상품을 추천하는 기법 
  • 자동화된 구전효과


글로만 보면 잘 이해가 안될텐데, 아래 사진을 같이 보자.



아래는 새로운 고객인 10번 고객과 기존 고객들간의 유사도를 계산하여 선호도를 계산하는 과정이다.

표에 있는 검은색 숫자가 기존에 유자10이 가지고 있던 선호도이고, 빨갠색 글자가 기존 고객과 비교를 통해

유사한 고객들과의 연관성을 바탕으로 예상되는 추천도를 계산한 것이다.


이 때 사용되는 계산법이 피어슨스 계수(Parson correlation coefficient) 이다.



이런식으로 특정 유저 두 명간 상관관계(유사도)를 피어슨스 계수를 통해 측정하는데,

이 때 나타난 그래프의 기울기가 1에 가까울수록 유사하다고 할 수 있우며, 최저는 당연히 0이다.


이러한 협업 필터링은 다시 두 가지로 분류할 수 있다.


유저 기반(UBCF)

  • 해당 유저와 취향이(성향) 비슷한 유저가 좋게 평가한 것을 추천 

  • 더 정교함

  • 유저가 신규 진입할때마다 계산해야 해서 구현에 시간이 더 걸린다

상품 기반(IBCF)

  • 상품간 유사도 바탕

  • 신규 진입할때마다 계산할 필요가 없음(미리 계산해놓을수 있음) 


UBCF를 그림으로 표시해보면 아래와 같다.





이 때 중요한건 수치가 중요한게 아니고, 그래프의 모양이 비슷해야 유사도가 높다는 것이다.

즉 유저 1과 Alice는 점수의 절대치에 있어서는 유사도를 찾기 힘들지만, 그 패턴은 동일하기 때문에 (유저1을 위로 2점씩 끌어올리면 Alice와 겹친다) 유사하다고 판단할수 있다.



이론상으로 유저들간 유사도를 계산하는 공식은 위와 같은데, 엑셀을 사용하면 비교적 쉽게 할 수 있다.




위 유사도를 구한 결과에서 상위 두 개의 유저를 선택하여(이 경우에는 U1, U2) 이 둘이 평가한 것을 바탕으로 Alice가 U5를 어떻게 평가할지 

그 추정치를 구하는 공식은 위와 같다. 

즉 우리는 UBCF기법을 사용하면 Alice가 아이템 5의 평가를 4.87로 할 것이라는걸 추측할 수 있다. 



다음은 IBCF를 알아보도록 하자. 아래 그림을 참고하면 된다.


IBCF는 코사인 유사도를 바탕으로 그 유사도를 계산한다. 


마찬가지로 엑셀로 유사도를 계산하도록 한다.


위와 같은 추천시스템의 평가지표로는 아래와 같은 지표들이 있다.


정확도(precision, accuracy) 

사용자가 실제 선택한 아이템 수  / 전체 측정된 아이템 수 


재현율(recall) 

맞는 추천 아이템 수 / 사용자가 선택한 전체 아이템 수 


F측정치 (F measure) 

(2*정확도*재현율) / (정확도 + 재현율) 


범위(coverage)

추천이 가능한 사용자 수(or 아이템 수) / 전체 사용자 수 (or 아이템 수) 





+ Recent posts