본문 바로가기

R/R로 만드는 추천 시스템

추천 시스템에서 사용되는 데이터 마이닝 기법-01

반응형

추천 시스템을 만들어보는 것이 이 책의 주된 목적이지만, 널리 사용되는 데이터 마이닝 기법을 살펴보는 것은 추천 시스템을 만드는 과정을 시작하기 전에 필요한 단계다. 이 장에서는 추천 시스템에서 널리 이용되는 데이터 전처리 기법(Data Preprocessing), 데이터 마이닝 기법, 데이터 평가 기법(Data Evaluating)을 배우게 될 것이다. 이 장의 첫 부분은 어떻게 데이터 분석 문제를 해결하는지 설명하고, 이어서 유사도 측정(Similarity Measure)과 차원 축소(Dimensionality Reduction) 같은 데이터 전처리 기법에 관해 설명한다. 그다음으로는 데이터 마이닝 기법과 평가 기법을 다룰 것이다.

 

유사도 측정에서는 다음 내용을 다룬다.

  • 유클리디안 거리
  • 코사인 거리
  • 피어슨 상관 계수

차원 축소 기법에서는 다음 내용을 다룬다.

  • 주성분 분석

데이터 마이닝 기법에서는 다음 내용을 다룬다.

  • K-평균 클러스터링
  • 서포트 벡터 머신
  • 앙상블 기법: 베깅, 부스팅, 랜덤 포레스트

데이터 분석 문제 해결하기

데이터 분석 문제들은 다음과 같은 단계들을 포함한다.

  • 비즈니스의 문제 파악하기
  • 해당 분야 전문가의 도움으로 비즈니스의 문제 영역 이해하기
  • 데이터 출처를 파악하고 분석에 적절한 변수 파악하기
  • 결측치(Missing Value) 제거, 정성적(Quantitative)과 정량적(Qualitative) 변수 구분하기, 데이터 변환(Data Transformation)과 같은 데이터 전처리나 데이터 정제(Data Cleansing) 작업하기
  • 데이터를 이해하기 위해 상자 그림(Box Plot)이나 히스토그램(Histogram)을 통한 탐색적 분석(Exploratory Analysis)하기
  • 데이터의 성격을 이해하기 위해 변수 간의 평균(Mean), 중앙값(Median), 최빈값(Mode), 분산(Variance), 표준 편차(Standard Deviation), 상관관계(Correlation), 공분산(Covariance) 등의 기본적인 통계치 확인하기
  • 데이터를 트레이닝 데이터(Training Data)와 테스트 데이터(Testing data)로 나누고 트레이닝 데이터를 가지고 머싱 러닝 알고리즘들을 적용한 모델에 교차 검증(Cross Validation) 기법 적용하기
  • 새로운 모델을 평가하기 위해 테스트 데이터를 이용해 모델 검증. 검증 단계의 결과에 따라 모델 성능 개량 진행하기
  • 결과를 시각화하고 실시간 예측을 위해 모델 배포하기

아래는 데이터 문석 문제를 해결하는 방법을 보여준다.

문제 발생 데이터 소스 식별과
데이터 수집
데이터 정제 탐색적 분석 통계 모델 생성 모델 검증 결과 시각화 및 예측

 

데이터 전처리 기법

데이터 전처리 과정은 데이터 분석 문제를 해결하는 과정에서 매우 중요한 절차다. 모델의 정확도는 대부분 데이터의 품질에 따라 달라진다. 일반적으로 데이터 전처리 과정은 데이터 정제, 변환, 결측치 확인, 처리 방법을 포함한다. 머신 러닝 알고리즘에는 이러한 전처리 과정을 거친 자료만이 사용될 수 있다. 이번 절에서는 주로 데이터 전처리 기법들을 다룰 것이다. 이러한 기법들은 유사도 측정(유클리디안 거리, 코사인 거리, 피어슨 상관 계수)과 추천 시스템에서 널리 사용되는 PCA와 같은 차원 축소 기법들을 포함한다. PCA 외에도 SVD(Singular Value Decomposition) 같은 차원 축소 방법이 있지만 여기서는 PCA에 대해서만 알아본다.

 

유사도 측정

모든 추천 시스템은 사용자와 아이템 간의 유사도를 고려해 작동한다. 이번 절에서는 유클리디안 거리, 코사인 거리, 피어슨 상관 계수와 같은 유사도 측정 방법들을 알아볼 것이다.

 

유클리디안 거리

두 아이템 간의 유사도를 계산하는 가장 간단한 방법은 유클리디안 거리(Euclidean Distance)를 계산하는 것이다. 데이터 세트에서 두 점 혹은 사물 간의 유클리디안 거리는 다음과 같은 식으로 정의된다.

 

이 방정식에서 (p,q)는 두 개의 연속적인 데이터며, n은 데이터 세트의 자료드의 개수다.

 

유클리디안 거리를 계산하는 R 코드는 다음과 같다.

x1 <- rnorm(30)
x2 <- rnorm(30)
Euc_dist = dist(rbind(x1, x2), method = "euclidean")

 

코사인 거리

코사인 유사도는 내적 공간(Inner Product Space)의 두 벡터 유사도 값으로 벡터 사이의 코사인 값이다. 코사인 유사도는 다음과 같이 정의된다.

코사인 거리(Cosine Distance)를 계산하기 위한 R 코드는 다음과 같다.

vec1 = c(1,1,1,0,0,0,0,0,0,0,0,0)
vec2 = c(0,0,1,1,1,1,1,0,1,0,0,0)
#install.packages("lsa")
library(lsa)
cosine(vec1, vec2)
          [,1]
[1,] 0.2357023

 

이 식에서 x는 데이터 세트의 모든 변수 값을 담고 있는 매트릭스다. cosine 함수는 lsa 패키지에 포함돼 있다.

 

피어슨 상관 계수

두 상품 간의 유사도는 변수들 간의 상관관계를 구하는 것으로도 얻을 수 있다. 피어슨 상관 게수(Pearson Correlation)는 두 변수의 공분산 값을 변수들의 표준 편차의 곱으로 나눠 구하며 가장 널리 사용되는 상관 계수 중 하나다.

 

R 소스 코드는 다음과 같다.

Coef = cor(mtcars, method = "pearson")

 

mtcars 데이터 세트는 R 기본 내장 데이터 세트다.

경험적 연구에서 볼 때 피어슨 상관 계수는 다른 유사도 측정 방식보다 사용자 기반 협업 필터링 추천 시스템에서 뛰어난 성능을 보인다. 또한 기존 연구들에 따르면, 코사인 유사도는 아이템 기반 협업 필터링에서 일관되게 좋은 성능을 보여준다.

 

차원 축소

추천 시스템을 구성하는 동안 직면하는 가장 일반적인 문제점 중 하나는 고차원(High Dimensional)이며 희소한(Sparse) 데이터들이다. 다시 말해, 많은 경우에 우리는 데이터가 매우 많은 특징들을 가지며 데이터 세트 내부에 매우 적은 데이터 포인트가 존재하는 상황에 직면하게 된다. 이터한 데이터에 분석 모델을 적용할 경우 모델의 예측 능력은 현저하게 낮아지며, 이러한 문제를 '차원의 저주(The curse of dimensionality)'라 부른다. 일반적으로 차원 축소(Dimensionality Reduction)의 한 가지 형태로 알려진 희소한 데이터 세트에 데이터를 추가하거나 특징 선택을 축소하는 방식으로도 차원의 저주를 감소시키는 효과를 얻을 수 있다. 이번 장에서는 '차원의 저주'를 감소시키기 위해 사용되는 차원 축소 기법 중 널리 사용되는 주성분 분석에 대해 알아본다.

 

주성분 분석

주성분 분석(PCA)은 차원 축소를 위한 전통적인 통꼐 기법으로 주성분 분석 알고리즘을 적용해 고차원의 데이터 공간을 더 낮은 차원으로 변환한다. 이 알고리즘은 선형적으로 m 차원의 입력 공간을 n 차원(m>n)의 출력 공간으로 변환하며, (m-n)만큼의 차원을 포기하면서 발생하는 분산 값/정보의 손실을 최소화하는 것을 목표로 한다. 주성분 분석을 수행하면 변수들이나 특징들이 더 낮은 분산 값을 갖게 된다.

 

기법적으로 말하자면, 주성분 분석은 주성분(principal component)이라 불리는 선형적으로 상관관계가 없는 변수들의 값들에 매우 큰 상관관계를 가진 변수들을 정투영(orthogonal projection)한다.

 

주성분의 개수는 데이터의 원래 변수 개수와 같거나 작으며, 이 선형 변환은 첫 번째 주성분이 가장 큰 분산값을 갖도록 하는 형태로 정의된다. 이는 높은 상관관계를 가진 특징들을 고려해 데이터의 가능한 한 많은 변동성을 설명한다. 다음 구성 요소들은 첫 번째 주성분과 상관관계가 적고 이전의 주성분과 직교를 이루는 특징을 사용해 주성분 다음으로 가장 높은 분산 값을 갖는 특성을 지닌다.

 

쉽게 설명하기 위해, 두 개의 특징이 달느 세 번쨰 특징보다 더 높은 상관관계를 갖는 3차원의 데이터를 가정해보자. 이 데이터를 PCA를 사용해 2차원 공간으로 축소하길 원한다. 첫 번쨰 주성분은 데이터의 두 개의 상관관계가 높은 변수들을 사용해 최대한의 분산을 갖도록 하는 방식으로 생성된다. 다음의 그래프에서 첫 번째 주성분(긴 빨간색 점선)이 데이터의 가장 큰 분산 값을 설명하는 값이다. 두 번쨰 주성분을 찾기 위해 가장 큰 분산 값을 갖고 첫 번째 주성분과 직교하는 또 다른 선을 찾아야 한다. PCA의 구현과 기법에 대한 상세한 설명은 이 책의 범위를 넘어서므로, 여기서는 R에서 어떻게 사용되는지 살펴본다.

 

 

여기서는 USArrests 데이터 세트를 사용해 PCA를 설명해본다. USArrests 데이터 세트는 미국 내 50개 주의 10만 명 당 살인(Murder), 폭행(Assault), 강간(Rape) 등의 범죄 관련 통계와 도시 인구 비율(UrbanPop)을 포함하고 있다.

#PCA
data("USArrests")

rownames(USArrests)
 [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"       "California"    
...

names(USArrests)
[1] "Murder"   "Assault"  "UrbanPop" "Rape"    

#USArrests 데이터 세트의 열에 apply 함수를 사용해 각각의 변수가 어떻게 퍼져 있는지 보기 위해 분산을 구해본다.
apply(USArrests, 2, var)
    Murder    Assault   UrbanPop       Rape 
  18.97047 6945.16571  209.51878   87.72916 

#정규화 작업을 거친 후 PCA를 적용한다
pca <- prcomp(USArrests, scale = TRUE)
pca

Standard deviations (1, .., p=4):
[1] 1.5748783 0.9948694 0.5971291 0.4164494

Rotation (n x k) = (4 x 4):
                PC1        PC2        PC3         PC4
Murder   -0.5358995  0.4181809 -0.3412327  0.64922780
Assault  -0.5831836  0.1879856 -0.2681484 -0.74340748
UrbanPop -0.2781909 -0.8728062 -0.3780158  0.13387773
Rape     -0.5434321 -0.1673186  0.8177779  0.08902432

#PCA 결과 값들에 대해 알아본다.
names(pca)

#pca$rotation을 통해 각 변수들의 비율을 설명하는 주성분들의 로딩 매트릭스를 확인할 수 있다.
#이제 biplot 그래프를 이용해 pca의 결과를 해석해본다. biplot은 각 변수들의 두 개 주성분의 비율을 사용한다.
#다음 코드는 biplot의 방향을 변경한다. 만약 다음 두 줄의 코드를 포함하지 않으면 그래프는 거울에 비친 것처럼 마주 볼 것이다.

[1] "sdev"     "rotation" "center"   "scale"    "x"       
pca$rotation = -pca$rotation
pca$x = -pca$x
biplot(pca, scale = 0)

 

biplot 결과 이미지에서 USArrests 데이터 세트의 두 개 주성분(PC1, PC2)을 확인할 수 있다. 빨간색 화살표는 로딩 벡터로 주성분 벡터를 따라 변수들이 어떻게 분포하는지를 나타낸다.

 

그래프에서 PC1은 Rape, Assault, Murder라는 세 개의 변수들이 같은 방향으로 근접해 위치하고 있는 것을 볼 수 있다. 이는 이 세 개의 변수가 다른 하나인 UrbanPop보다 서로 상관관계가 더 높음을 의미한다. PC2는 UrbanPop에 높은 가중치를 두지만, 다른 나머지 세 개의 변수와 다른 방향에 위치하고 있으므로 상관관계가 낮다.

반응형