데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

머하웃

데이터 분석
기계학습
머하웃
작성자
admin
작성일
2021-02-15 14:19
조회
3357

이번 절에서는 머하웃의 개념과 활용법에 대해 알아본다. 2절에서는 머하웃 전반에 대해 간략하게 살펴보고, 머하웃을 사용하기 위한 각종 도구들에 대해 알아본다. 또한 머하웃 알고리즘에서는 머하웃이 제공하는 여러 알고리즘들에 대해 알아보며 머하웃 라이브러리를 사용해 실제 문제를 해결하려면 어떻게 개발환경을 구축하고 소스코드를 작성해야 하는지 예제를 통해 확인한다.


머하웃 소개

아파치 머하웃(Apache Mahout)은 ASF(Apache Software Foundation)에서 추진하는 오픈소스 프로젝트로서 확장 가능한(scalable) 기계학습 라이브러리의 구현을 목표로 하고 있다. 따라서 하둡 에코시스템 상에서는 분석ㆍ처리 부분을 담당하고 있다고 볼 수 있다.
최초에는 루씬의 하부 프로젝트로 시작됐다가 오픈소스 추천시스템 Taste를 흡수했고, 2010년 아파치의 탑 레벨 프로젝트가 되었다. 초기의 목표는 Andrew Ng의 논문 「Map-Reduce for Machine Learning on Multicore」에 나온 10개의 알고리즘을 구현하는 것이었으나 지금은 다양한 기계학습 알고리즘이 구현돼 있다. 현재 시점(2014년 9월)에 머하웃의 버전은 0.9이며, 지원하는 알고리즘 리스트는 계속해서 활발히 추가되고 있다. 최근에는 Giraph 같은 하둡 기반의 그래프 프로세싱 프레임워크에 대한 통합 계획이나 스파크 같은 최신 분산 프레임워크로 코드 기반을 변경하는 작업에 대한 논의가 계속 진행되고 있다. 실제로 2014년 4월 이후 추가적인 알고리즘은 맵리듀스를 이용해 구현하지 않을 계획이며, 향후 머하웃의 구현은 스파크 기반으로 이뤄질 것이라고 한다.


머하웃이란?

머하웃(Mahout)은 간단히 말해 확장성 있는(scalable) 기계학습 라이브러리라고 할 수 있다. 이 확장성 제공을 위해 알고리즘 구현의 많은 부분에서 하둡을 활용하고 있다. 즉, 머하웃의 핵심 알고리즘인 군집화, 분류, (배치 기반) 협업 필터링 추천 등의 기계학습 알고리즘이 하둡 맵리듀스(MapReduce)를 사용해 구현됐다는 뜻이다. 하지만 이는 강제적인 것이 아니라서 머하웃은 단일 노드나 하둡이 없는 독립(stand-alone) 환경에서도 잘 동작하도록 구현돼 있다. 앞에서 말한 핵심 알고리즘 외에도 머하웃은 추가적으로 선형대수, 통계 같은 공통 수학 모듈과 원시(primitive) 컬렉션 타입에 대한 자바라이브러리도 제공한다.

[그림 Ⅳ-1-1] Physical View 머하웃 소프트웨어 스택

[그림 Ⅳ-1-1] Physical View 머하웃 소프트웨어 스택

머하웃은 아래와 같이 다양한 기계학습 알고리즘 구현을 지원한다.


  • Collaborative Filtering
  • User and Item based recommenders
  • K-Means, Fuzzy K-Means clustering
  • Mean Shift clustering
  • Dirichlet process clustering
  • Latent Dirichlet Allocation
  • Singular value decomposition
  • Parallel Frequent Pattern mining
  • Complementary Naive Bayes classifier
  • Random forest decision tree based classifier
  • High performance java collections (previously colt collections)
머하웃의 주요 알고리즘

군집화(Clustering)는 문서 또는 점(point) 같은 많은 수의 객체를 유사성ㆍ연관성이 높은 객체들로 구성된 몇 개의 군집으로 그룹화한다. 이 과정에서 대용량 데이터로부터 흥미로운 정보를 가진 그룹을 발견할 수 있고, 데이터에 대한 직관을 얻을 수 있다. 군집화 알고리즘은 실제로 서비스에서 숨겨진 사용자 그룹을 발견하거나 사이트 로그를 분석해 공통적인 사용 패턴을 발견하는 데 활용할 수 있고, 많은 문서를 이해하기 쉽도록 구조화하는 데 사용하기도 한다. 머하웃에서는 군집화를 위해 K-Means, fuzzy K-Means, Dirichlet Process, Canopy, Meanshift, Hierarchical Clustering 등의 다양한 알고리즘을 제공하고 있다. 토픽 모델링을 통해 주제별로 관련성이 높은 단어를 그룹화하기 위한 잠재디리클레 할당(Latent Dirichlet Allocation)도 지원한다.
분류(Classification)는 이미 특정 카테고리로 분류된 아이템들의 정보로부터 학습해 새로운 아이템을 정확한 카테고리로 분류하는 기법을 지원한다. 이를 통해 어떤 오브젝트가 특정 카테고리에 종속되는지 또는 특정 속성을 포함하는지 결정할 수 있다. 분류 알고리즘은 메일 서비스의 스팸 필터링기법 또는 사진에서 사람의 얼굴을 구분하거나 이미지에서 문자를 구분하는 데 사용되고 있다. 또한 부정행위 적발(fraud detection), 평판 분석, 이탈 고객 방지(churn analysis) 등의 목적으로 활용할 수 있다. 이를 위해 머하웃에서는 (Complementary) Naive Bayes 분류기, Random Forests, Logistic Regression(Stocastic Gradient Descent) 등의 분류 알고리즘을 지원하고 있다.
협업 필터링 추천시스템(Recommender Systems)은 사용자가 표현한 아이템들에 대한 선호도를 바탕으로 사용자가 좋아할 것으로 예상되는 새로운 아이템을 발견하는 방법을 지원한다. 추천시스템은 아마존, 넷플릭스, 페이스북, Last.fm 등 사용자와 사용자가 소비하는 아이템의 관계가 존재하는 많은 서비스에서 이미 적극 활용되고 있다. 이와 같은 여러 적용 사례를 통해 상업적인 가치가 있는 것으로 보고되고 있으며 실제로 넷플릭스에서 대여되는 영화의 2/3가 추천으로부터 발생하며, 아마존 판매수익의 35%가 추천으로부터 발생한다고 한다.
앞에서 살펴본 3개의 주요 알고리즘들 외에도, 머하웃은 장바구니 분석 등에 쓰이는 빈발 항목 집합 알고리즘(Mining Frequent Itemset), 행렬 분해를 통해 차원 축소를 수행하는 SVD(Singular Value Decomposition) 등의 여러 가지 다양한 알고리즘도 제공한다.


머하웃 설치

머하웃 설치는 지금까지 살펴 보았던 하둡 에코시스템 플랫폼 기술들과는 달리 간단히 수행할 수 있다. 최신 버전의 머하웃을 다운로드 받아 압축을 해제한 후에 몇 가지 설정만 해주면 바로 사용할 수 있기 때문이다. 단, 머하웃은 하둡 기반에서 동작하므로 이를 설치ㆍ사용하기 위해서는 자바와 하둡이 제대로 설치돼 있어야 한다. 만약 아직 하둡이 제대로 동작하고 있지 않다면, 하둡 관련 장을 참고해 환경을 구성한 후에 머하웃 설치를 진행하자.


머하웃 다운로드 및 압축 해제

머하웃 다운로드 및 압축 해제


환경변수 설정

환경변수 설정

관련 소스를 모두 hadoop 사용자 계정에 설치한다고 가정했다. 만약 설치 위치가 다르다면 각자 환경에 맞게 경로를 수정하도록 한다.


머하웃 테스트

아래와 같이 머하웃 명령을 실행했을 때, “Valid program names are:”라는 메시지와 함께 머하웃에서 사용 가능한 프로그램 목록이 출력되면 제대로 설치된 것이다.

머하웃 테스트


도구

벡터와 매트릭스

대부분의 기계학습 알고리즘들은 다차원(multidimensional) 데이터를 간결하게 표현하고 기본 선형대수 연산을 쉽게 수행할 수 있는 기능을 필요로 한다. 머하웃은 이 차원에서 벡터와 행렬(Matrix) 데이터 타입을 지원한다. 머하웃 벡터와 행렬은 희소(sparse)와 밀집(dense) 구현을 모두 제공하며, 매퍼와 리듀서 내부에서 중간 결과를 다루는데 적당한 메모리에 올려두고 사용할 만한 용도 정도의 크기로써 사용된다.
머하웃이 제대로 동작하기 위해서는 텍스트 데이터나 숫자형 데이터 같은 원시 입력 데이터를 머하웃이 이해할 수 있는 형태로 변환해 줘야 한다. 이때 사용하는 데이터 포맷 역시 벡터와 행렬 구현(implementation)이다. 즉 우리가 갖고 있는 데이터의 객체를 잘 표현하는 특성들을 선택하고, 객체의 특성을 컴퓨터가 이해할 수 있는 숫자형 또는 범주형 타입의 수학적 표현으로 바꿔 준다. 이런 특성들을 각 차원에 할당해 순서가 있는 숫자들의 리스트(tuple)로 표현하면, 이것이 곧 객체에 대한 벡터 표현이라고 할 수 있다.

[그림 Ⅳ-1-2] 사원 데이터 세트

[그림 Ⅳ-1-2] 사원 데이터 세트

데이터를 머하웃이 이해하기 위해서는 마지막 한 단계가 더 남아 있다. 머하웃은 입력 및 중간데이터로 시퀀스파일(SequenceFile) 형식을 사용하므로 입력 데이터의 벡터 표현을 시퀀스 파일 형태로 변환해야만 머하웃 알고리즘을 수행할 수 있다.



벡터

벡터(Vector)는 크기에 비해 상대적으로 적은 0값을 갖는지에 따라 밀집벡터(Dense Vector)와 희소벡터(Sparse Vector)로 나뉜다. 머하웃에서 제공하는 벡터 구현 클래스도 아래와 같이 세 종류가 있으며, 각각 다른 용도로 사용하기 위해 최적화 돼 있다.
  • 밀집벡터(DenseVector) dense vector를 위한 클래스. 내부적으로 배열 자료구조를 사용하며 인덱스에 직접 접근이 가능하므로 속도가 빠르지만 많은 메모리를 사용한다.
  • 임의접근 희소벡터(RandomAccess SparseVector) sparse vector를 표현하기 위해 값이 0이 아닌 경우에만 특성값을 할당한다. 해시맵 기반의 index-to-value mapping을 사용해 무작위 접근의 경우 배열보다는 느리지만 메모리 사용량을 줄일 수 있다.
  • 순차접근 희소벡터(SequentialAccess SparseVector) 트리 유사 구조 기반의 ordered mapping을 통해 특성값에 접근하므로 모든 값에 대한 순차적인 접근에 최적화돼 있다.

매트릭스

앞에서 살펴본 사원 데이터 세트 포맷 같이 머하웃에서는 다양한 형태의 매트릭스(Matrix) 데이터를 사용하고 있다. 예를 들어 추천 시스템에서 사용하는 user-item 선호도 matrix나 similarity matrix, 분류 알고리즘에서 내부적으로 사용하는 행렬이나 검증을 위해 사용하는 confusion matrix 등은 모두 머하웃의 행렬 구현에 사용한다. 벡터와 마찬가지로 DenseMatrix, SparseMatrix, SparseRowMatrix, SparseColumnMatrix 등의 구현물이 있다.

[그림 Ⅳ-1-2] 사원 데이터 세트

[그림 Ⅳ-1-2] 사원 데이터 세트



유사도 및 거리 개념

위에서 예로 든 영화에 대한 선호도 행렬을 기반으로 사용자 A와 C가 얼마나 유사한 특성을 갖는지 판단하려면 어떻게 해야 할까? 또는 사원 데이터에서 유사한 속성을 갖는 사원의 그룹을 묶으려고 한다면 어떻게 해야 할까? 객체 간의 비교 연산을 위해 아래와 같이 다양한 유사도ㆍ거리 측정법이 개발돼 있다. 이러한 각종 측정법은 군집화 알고리즘에서 유사한 객체끼리 같은 클러스터에 묶어주거나, 추천 시스템에서 비슷한 속성을 가진 사용자나 아이템을 발견하는 데 사용된다.



Minkowski Distance

우리가 흔히 생각하는 개념으로서의 기하학적 거리라고 볼 수 있다. r=1인 경우를 맨하탄 거리(Manhattan Distance), r=2인 경우를 유클리드 거리(Euclidean distance)라고도 한다.

Minkowski Distance


Cosine Similarity

n-차원 공간에서 두 벡터의 각도(에 대한 cosine) 값을 유사도로 생각할 수 있다.

Cosine Similarity


Pearson Correlation Similarity

두 변수의 관련성(유사성)을 나타내주는 correlation 개념 중 가장 흔히 사용되는 것으로 각 분산의 곱에 대한 공분산의 비율로 나타낸다. x와 y가 함께 변하는 정도와 x와 y가 따로 변하는 정도의 비율의 개념으로 생각할 수 있다.

Pearson Correlation Similarity


Jaccard Coefficient Similarity

타니모토 계수 유사도라고도 한다. 불리언(boolean) 데이터에 대해 사용하며, 두 특성벡터의 특성값의 합집합과 교집합의 비율로서 유사도를 계산한다. Μ1110?,Μ01을 각각 두 특성값이 모두 1인 속성의 개수, 둘 중 하나의 특성값이 1인 속성의 개수라고 한다면, 아래와 같이 계산할 수 있다.

Jaccard Coefficient Similarity

이외에도 머하웃에서는 아래와 같이 유사도 측정을 위한 다양한 클래스를 제공한다.


유사도
  • Pearson correlation-based similarity
  • Similarity by Euclidean distance
  • Cosine measure similarity
  • Similarity with the Tanimoto coefficient
  • Similarity with a log-likelihood test 등
거리
  • Euclidean distance measure
  • Squared Euclidean distance measure
  • Manhattan distance measure
  • Cosine distance measure
  • Tanimoto distance measure
  • Weighted distance measure 등

DistanceMeasure 클래스는 거리 측정법을 위한 구현으로 두 벡터 사이의 거리를 계산한다. 벡터 사이의 거리가 짧으면 유사성이 높음을 의미하므로 유사성과 거리는 역수의 개념으로 생각하면 된다.


머하웃 알고리즘

여기서는 머하웃에서 제공하는 대표적인 알고리즘 몇 가지를 소개하고, 실제 사용 방법을 소개한다.


군집화

군집화는 객체(object)들의 집합을 여러 그룹(또는 군집, cluster)으로 묶어주는 것을 말한다. 이때 같은 그룹에 있는 객체들은 다른 그룹에 있는 객체들에 비해 더 유사한 특성을 가진다. 군집화가 유용하게 쓰이는 한 가지 예를 들어보자. 만약 S라는 통신회사가 자사의 고객에 대해 개인화 홍보전략의 일환으로 몇 가지의 요금제를 개발해 마케팅을 수행할 계획이라고 해보자. 고객에 대한 정보는 기본적인 인적 정보(성별, 나이, 지역 등) 외에도 사용 요금제, 결재방법, 가입연수, 통화량, ARPU(Average Revenue per User) 같은 이동통신 서비스에 특화한 다양한 정보로 표현된다. 이렇게 모두 다른 특성으로 표현되는 수천만 명이나 되는 고객들을 단 몇 개의 그룹으로 분류할 수 있다면, 해당 그룹에 속한 고객들에게 그룹에 맞는 적당한 요금제를 맞춤형으로 홍보할 수 있을 것이다.

이러한 군집화 작업을 위해서는 미리 아래의 세 가지를 정의해야 한다.


객체를 벡터로 표현한 feature 정의

고객을 잘 표현할 수 있는 특성들을 선택하고 쓸모 없는 정보는 걸러내야 한다. 예를 들어, 통신사에서 고객 데이터를 표현할 때 직업이나 나이, 통화량은 고객을 설명하는 중요한 정보이지만 키나 몸무게는 요금제를 선택하는 데 있어 중요한 정보는 아니라고 볼 수 있다.


두 객체의 가까운 정도를 표현할 measure 정의

두 고객이 얼마나 유사한지 측정할 수 있어야 같은 그룹에 묶을 것인지 아니면 다른 그룹으로 분류할 것인지를 판단할 수 있다. 좋은 거리 측정법을 선택해야 군집화 품질이 좋아진다.


사용할 군집화 알고리즘 정의

여러 종류의 군집화 알고리즘 중에 고객 데이터 그룹화에 가장 적합한 알고리즘은 무엇인지를 정의해야 한다.

좋은 군집화 품질은 아래 그림과 같이 벡터 거리는 가깝고 군집 거리는 먼 경우로 볼 수 있다. 즉 같은 군집으로 묶인 객체들 간에는 최대한 유사한 특성을 갖고, 다른 그룹으로 분류된 군집 간에는 최대한 다른 특성을 가질 때를 말한다. 이것은 처음에 보았던 군집의 정의에 부합하는 평가 방식이라고 할 수 있다.

[그림 Ⅳ-1-4] 군집 평가를 위한 거리 개념

[그림 Ⅳ-1-4] 군집 평가를 위한 거리 개념



K-Means Clustering 알고리즘

K-Means Clustering은 주어진 데이터를 ?개의 클러스터로 묶는 알고리즘으로, 각 클러스터 중심(centroid)과 클러스터 구성 객체 간의 거리 차이의 분산을 최소화하는 방식으로 동작한다. 즉 아래 식의 값을 최소화하는 S를 찾는 것이 알고리즘의 목표가 된다.

K-Means Clustering 알고리즘

알고리즘의 주요 흐름은 다음과 같다.
  • Initial Centroid 입력 데이터에 대해 ?개의 랜덤 seed centroid를 가지고 알고리즘을 시작한다.
  • Clustering 모든 point를 순회하며 각 point와 거리가 가장 가까운 centroid를 구해 해당군집에 포함시킨다.
  • Recalculate Centroid 각 군집에 포함된 point들의 평균(mean)을 구해 새로운 centroid로 갱신한다.
  • 이전 centroid와 갱신된 centroid의 차이가 거의 없어져 수렴할 때까지 Clustering과 Recalculate Centroid의 과정을 반복한다.
알고리즘의 전체적인 흐름은 아래 그림을 참조한다.

[그림 Ⅳ-1-5] K-Means Clustering 알고리즘 흐름

[그림 Ⅳ-1-5] K-Means Clustering 알고리즘 흐름


Mahout K-Means Clustering 실습

우리가 직관적으로 쉽게 이해할 수 있는 2차원상의 point를 이용해 군집화를 수행해 보면 K-Means Clustering 알고리즘 이해에 도움이 될 것이다. 실습을 위해 아래와 같이 간단한 샘플 데이터를 만들어 보자.

Mahout K-Means Clustering 실습

이 데이터를 하둡 파일 시스템에 복사한 후 org.apache.mahout.clustering.syntheticcontrol.kmeans.Job6)을 이용해 mahout kmeans를 수행한다.

Mahout K-Means Clustering 실습

알고리즘 수행 결과 아래와 같이 2개의 군집으로 잘 나뉜 것을 확인할 수 있다. 각 군집의 centroid 좌표는 (8.5, 8.5), (1.8, 1.8)이며 각각 4개ㆍ5개의 point를 군집 내에 포함하고 있다.

Mahout K-Means Clustering 실습

Mahout K-Means Clustering 실습

K-Means Clustering 알고리즘에 사용되는 각 파라미터에 대한 설명은 아래와 같다.

[표 Ⅳ-1-1] K-Means Clustering 알고리즘에 사용되는 파라미터들


옵션 설명
input/output (-i/-o)
Overwrite (-ow) output 덮어쓰기 여부
Distance Measure (-dm) Euclidian, Cosine, manhattan, Tanimoto 등. centroid와 각 point 사이의 거리를 측정하는데 사용되는 측도
numClusters (-k) 원하는 cluster의 수 (integer)
Convergence Delta (-cd) 수렴 임계값. (double)
Max Iteration (-x) 최대 반복 처리 횟수 (integer) 수렴하지 않을 경우 무한 loop에 빠지는 것을 방지한다.
t1, t2 초기 seed를 대략적으로 정하기 위해 사용되는 파라미터. 내부적으로 수행하는 canopy clustering을 위해 필요한 값이다.


분류

분류(Classification)란 새로운 입력 데이터가 주어졌을 때 True/False 또는 A/B/C/D 같은 범주형 속성 중 어디에 속하는지 확인하는 기계학습 방법론이다. 이를 위해 어느 카테고리에 속하는지 알고 있는 데이터로 구성된 트레이닝 데이터 세트에 기반해 모델을 생성하고 그 모델을 기반으로 카테고리를 알 수 없는 새로운 데이터의 범주를 예측한다. 예를 들어, 이커머스 서비스 사업자는 이탈 고객들의성별, 나이, 평균 구매 금액, 구매ㆍ방문 패턴 같은 다양한 속성 정보를 분석해 아직 이탈하지 않은 어떤 고객의 속성 정보가 주어졌을 때 해당 고객의 이탈을 예측할 수 있다. 고객의 이탈 여부를 예/아니오로 예측하는 것은 이탈 또는 잔류 두 카테고리 중 하나를 선택하는 것이다. 예측은 결과 범주 속성을 직접적으로 검사하기 어려울 때, 확보 가능한 데이터를 기반으로 간접적으로 범주를 알 수 있는 방법을 제공해주는 장점이 있다. 이런 예제는 의료 분야나 제조 분야에서 쉽게 찾아볼 수 있다. 간경화 발병 여부를 검사하기 위해 매번 수술을 통해 환자의 간 조직 일부를 채취한다면, 비용뿐 아니라 신체적 위험 부담도 높을 것이다. 만약 간경화 초기 지표를 활용해 환자들의 발병 여부를 파악하는 분류 시스템이 있다면, 의사가 예방법이나 조기 치료 처방을 내리는 데 도움이 될 것이다. 또한 공정마다 엄청난 비용이 투입되는 반도체 공정에서 각 설비에서 발생하는 데이터를 바탕으로 미리 불량을 예측할 수 있다면 수율(yield)을 높일 수 있고, 공정이 끝난 차후에 테스트를 통해 불량을 검출했을 때의 엄청난 비용 손실도 막을 수 있다.



분류 시스템의 구축

실제로 동작하는 분류 시스템을 구축하기 위해서는 주어진 데이터를 이용해 모델을 생성하는 단계와 이 모델을 사용해 새로운 데이터에 카테고리를 부여하는 단계를 거쳐야 한다. 예를 들어 지난 6개월 간 남녀 고객의 구매 데이터를 분석해 남녀 분류기 모델(classifier model)을 생성하면, 신규 고객이 명시적으로 성별을 입력하지 않더라도 해당 고객의 구매 정보를 분류기 모델에 입력해 성별을 예측할 수 있다.
이처럼 분류 모델은 입력 데이터를 특정 카테고리로 매핑하는 함수라고 생각할 수 있다. 이러한 분류 모델을 생성하는 다양한 훈련 알고리즘이 있다. 보유한 데이터의 특성이나 크기, 모델 생성 비용등을 종합적으로 고려해 어떤 분류기 알고리즘을 선택할 것인지를 결정해야 한다. 분류 모델을 생성할때는 보통 가용 데이터(이미 카테고리를 알고 있는 데이터)의 80~90%를 트레이닝 데이터로 구성해 모델을 생성하는 훈련에 사용한다. 데이터의 나머지 부분을 테스트 데이터로 사용한다. 테스트 데이터에는 이미 올바른 카테고리 정보가 포함돼 있지만, 테스트를 위해 카테고리 정보를 삭제하고 앞에서 생성한 모델에 입력해 결과를 얻는다. 여기서 나온 카테고리 결과와 원래 알고 있는 올바른 카테고리 정보가 얼마나 일치하는지를 비교해 모델의 성능을 평가한다.
앞에서 생성한 모델이 테스트 데이터를 이용했을 때, 어느 정도 신뢰할 수 있다고 판단되면 실전 배치를 한다. 우리의 분류 시스템에 카테고리를 알 수 없는 새로운 데이터가 들어오게 되면 이 데이터를 모델에 적용하고, 모델은 해당 데이터에 대한 카테고리 결과를 예측하게 된다. 예를 들어, 지난 6개월간의 남녀 고객의 구매 패턴 데이터로 분류기 모델을 생성하고 나면 성별을 알 수 없는 신규 유입 고객에 대해서도 성별을 예측할 수 있게 되는 것이다. 한번 생성한 모델은 시간이 지나면 최신 데이터를 반영하지 못해 정확도가 떨어질 수 있으므로 주기적으로 갱신할 필요가 있다. 다음 그림은 앞에서 설명한 모델을 생성하는 단계와 새로운 데이터에 카테고리를 부여하는 단계를 설명하고 있다.

[그림 Ⅳ-1-6] 분류 시스템의 동작 과정

[그림 Ⅳ-1-6] 분류 시스템의 동작 과정

그렇다면 다른 분류 소프트웨어 대신에 머하웃을 사용해야 하는 특별한 이유는 무엇일까? 이미 예상하고 있겠지만, 머하웃은 다른 솔루션에서는 처리가 어려울 정도로 엄청나게 데이터가 크거나 빠르게 증가하는 데이터 세트를 처리할 때 유용하다. 대용량 데이터 세트에서 머하웃이 유리한 이유는 규모 확장이 안되는 시스템에서처럼 입력 데이터가 증가함에 따라 훈련에 필요한 시간과 메모리가 선형적으로 증가하지 않기 때문이다.

머하웃 나이브베이즈 분류기

20NewsGroup 데이터 세트8)를 나이브베이즈 분류기9)를 통해 분류해 본다. 여기서 사용하는 분류기는 문서의 내용을 입력 데이터로 받고, 해당 문서가 속한 뉴스그룹 이름을 목표 변수 카테고리로 출력한다. 즉 문서가 어느 뉴스그룹에서 나왔는지에 대한 사전 정보 없이 문서의 내용만으로 어느 뉴스 그룹의 글인지를 예측하는 것이다. 참고로 이 실습 내용은 머하웃 디렉터리의 example/bin/classify-20newsgroups.sh에서 발췌한 내용이다. 따라서 나이브베이즈 분류기 외에 다른 분류 기법을 테스트해 보려면 해당 스크립트를 참조하기 바란다.
먼저 작업 디렉터리를 생성하고 데이터를 내려 받아 압축을 해제한다.

머하웃 나이브베이즈 분류기

데이터를 머하웃에 입력하기 위해 적당히 가공해 하둡 파일 시스템에 복사한다.

머하웃 나이브베이즈 분류기

머하웃이 이해할 수 있는 형태의 <Text, Text> 시퀀스파일 포맷으로 변환한다.

머하웃 나이브베이즈 분류기

이 상태의 데이터는 단순히 텍스트 파일을 시퀀스 파일 형태로만 변환한 것이므로 학습 알고리즘이 제대로 동작하려면 모든 문서가 동일한 특징 세트를 갖는 벡터 형태로 변환해야 한다. 아래의 벡터화 과정을 거쳐서 각 문서에 대한 단어 빈도를 담고 있는 <Text, VectorWritable> 형태의 시퀀스 파일로 변환한다.

머하웃 나이브베이즈 분류기

가용한 데이터를 80:20 비율로 트레이닝 데이터와 테스트 데이터로 랜덤하게 분할한다.

머하웃 나이브베이즈 분류기

트레이닝 데이터를 이용해 모델을 생성한다.

머하웃 나이브베이즈 분류기

최종적으로, 테스트 데이터 세트를 이용해 앞서 생성한 모델을 검증하고 결과를 확인해 본다. testnb의 출력 디렉터리인 20news-testing에는 테스트 데이터에 대해 모델이 출력한 각 분류 카테고리 결과가 들어 있다.

머하웃 나이브베이즈 분류기

머하웃 testnb를 수행하면, 결과 화면으로 아래와 같은 Confusion Matrix를 얻을 수 있다. 각 행에 해당하는 정답 카테고리에 대해 머하웃 나이브베이즈 분류기가 어떻게 예측했는지가 각 열에 나타나 있다. 대각행렬 부분의 값이 두드러지는 것으로 보아 대략 좋은 결과를 내고 있는 것을 알 수 있다. 출력 결과를 확인해 보면, 실제로도 약 90% 이상의 정확도를 보여주고 있다.

[그림 Ⅳ-1-7] 분류 결과 confusion matrix

[그림 Ⅳ-1-7] 분류 결과 confusion matrix



추천 시스템

추천 시스템(Recommend System)이라는 용어가 친숙하게 다가오는 사람은 그리 많지 않을 것이다. 하지만 우리는 생활 속의 많은 부분에서 이미 추천 시스템의 도움을 받고 있다. 예를 들어 온라인 쇼핑몰에서 어떤 제품을 사려고 할 때나 영화 사이트에서 좋아하는 영화를 고를 때, 유튜브에서 동영상을 감상할 때, 온라인 뉴스 사이트를 살펴볼 때, 음악 스트리밍 서비스를 이용할 때 등 우리가 알지 못하는 사이에 추천 시스템은 우리를 위해 열심히 일하고 있다. 이번 절에서는 추천 시스템에 대한 소개와 함께 간단한 실습도 직접 해보겠다.



등장 배경

오프라인 매장에서는 물건을 팔기 위한 리소스 제약이 심하다. 즉 물건을 전시할 공간과 판매할 수 있는 시간의 제한이 있다. 오프라인 서점에서는 책 진열장에 그들이 가진 책의 일부만 진열할 수 있으며, 종이 신문은 지면이 허락하는 수의 기사만 실을 수 있다. 오프라인 매장의 또 다른 중요한 특성 중 하나는 수익ㆍ매출 구조가 전통적인 파레토 법칙을 따른다는 점이다. 많은 사람이 80:20 법칙으로 알고 있는 이 법칙은 전체 결과의 80%가 전체 원인의 20%에서 일어나는 현상을 가리킨다. 예를 들면, 음반 중 20%에 해당하는 아이템이 전체 구매의 80%를 유발한다고 볼 수 있다.
이런 환경에서의 추천 시스템은 비교적 간단하게 구현할 수 있다. 우선 개별적인 고객에 대한 맞춤형 추천은 불가능하며, 추천할 항목을 결정하는 것은 단순히 구매 횟수를 합산하는 것으로 추천 항목이 결정된다. 서점에서는 베스트 셀러 순으로 진열장에 진열할 것이며, 종이 신문의 제한된 지면은 사람들이 가장 관심을 가질 만한 기사들로 채워지게 될 것이다.
반면 온라인 매장은 오프라인 환경과 상당히 다른 특성을 가진다. 온라인 상점에서는 물리적인 공간 제약이 없으므로 여러 상품을 제약 없이 등록할 수 있다. 이와 비슷하게 온라인 서점은 고객에게 수백만권의 책을 보여줄 수 있으며, 온라인 뉴스 사이트는 엄청나게 많은 뉴스 기사를 자신의 사이트에 지면 제한 없이 올릴 수 있다. 게다가 온라인 매장의 독특한 특징 중 하나는 수익 구조가 기존의 팔레토법칙이 아니라 롱테일법칙(long tail) 법칙을 따른다는 점이다. 롱테일 법칙의 시장에서는 기존 팔레토법칙의 시장에서 중요하지 않았던 나머지 80%에 해당하는 물건들이 상당히 높은 비중의 매출을 차지한다. 따라서 이 부분을 포기할 수 없게 된다.
위와 같은 특성을 갖는 온라인 상점에서는 꼬리에 속하는 고객을 위해 아주 다양한 아이템을 구비해야 한다. 오프라인 상점이 했던 것처럼 자신의 모든 상품을 고객에게 전시할 수 없으므로 자연히 다양한 취향을 갖는 각각의 고객에게 맞춰 상품을 판매할 수 있는 개인화한 홍보 수단이 필요하다. 이 경우 매출 증대를 꾀할 수 있는 방법으로는, 수많은 상품 중에서 고객이 원하는 상품을 빠르게 찾을 수 있는 '검색' 기능이 있다. 더 나아가 다양한 취향을 가진 사용자들에 대해 개별 고객이 알지 못하는 상품 중 구매 확률이 높은 상품을 제안하는 '추천' 기능이 있다.

개념

추천 시스템에는 users와 items이라는 두 종류의 엔터티가 있다. 이 아이템에 대한 유저의 선호도를 매트릭스로 나타낸 것이 바로 user-item 선호도 매트릭스다. 대부분의 경우 이 행렬은 희소행렬이며 추천 시스템의 본질적인 목표는 이 행렬의 빈칸의 선호도를 예측하는 것이라 볼 수 있다.

[그림 Ⅳ-1-8] 4명의 사용자와 7개의 아이템으로 구성된 선호도 매트릭스

[그림 Ⅳ-1-8] 4명의 사용자와 7개의 아이템으로 구성된 선호도 매트릭스


추천 방식에 따른 분류

응용 분야와 도메인 데이터의 특성에 따라 추천 방식이 달라질 수는 있으나 크게 분류하면 아래와 같이 구분할 수 있다.
  • 콘텐츠 기반 추천(Content-based Recommendation)
  • 협업 필터링 추천(Collaborative Filtering Recommendation)
    1. - Memory-based Collaborative Filtering
    2. - user-based Collaborative Filtering
    3. - item-based Collaborative Filtering
    4. - Model-based Collaborative Filtering
콘텐츠 기반 추천(Content-based Recommendation)은 특정 속성을 선호하는 사람에게 비슷한 속성을 가진 아이템을 추천하는 방법으로, 가장 직관적인 추천 방식이라 할 수 있다. 아이템 자체의 콘텐츠(프로퍼티)를 직접 분석해(영화로 치면 장르, 감독, 제작연도, 참여한 배우 등) 유사도에 따라 새로운 아이템을 추천한다. 예를 들어 어떤 사용자가 '13일의 금요일', '주온', '나이트메어' 등의 영화를 보았다면 그 사용자의 프로파일은 공포영화의 메타 데이터로 형성될 것이다. 이 사용자 프로파일과 유사도가 높은 메타 데이터를 갖는 '여고괴담' 같은 영화를 추천해 해당 사용자의 아이템 구매 확률을 높일 수 있다. 하지만 자동으로 콘텐츠의 특성을 수치화하기 어려운 경우에는 사용하기 어렵고, 콘텐츠 특성에만 관심을 두기 때문에 얼마나 인기 있는 아이템인지 같은 아이템 자체의 가치를 측정하지는 못한다는 단점이 있다.
협업 필터링 추천(Collaborative Filtering Recommendation)은 사용자들의 의도하지 않은 상호교류를 기반으로 한 정보를 기반으로 추천하는 방식이다(알고리즘의 이름이 '협업 필터링'인 이유이기도하다). 협업 필터링 추천은 사람들의 취향 사이에는 공통적인 트렌드와 패턴이 있다는 가정에서 출발한다. 유저-유저(유저 기반 협업 필터링 방식) 또는 아이템-아이템(아이템 기반 협업 필터링 방식)간의 유사도를 측정한 후에 이 유사도와 해당 사용자 선호도를 표현한 아이템과의 가중 평균 계산을 통해 새로운 아이템에 대한 선호도를 예측한다. 쉽게 말해 사용자의 취향과 비슷한 다른 사용자의 취향을 취합해 새로운 아이템에 대한 선호도를 예측하는 시스템이라고 할 수 있다. 아이템에 대한 사용자들의 선호 패턴에만 관심을 두기 때문에 자동화하기 쉽고 해당 분야의 도메인 지식이 필요 없다. 따라서 음악, 도서, 뉴스 등 많은 응용에 활용할 수 있는 장점이 있다. 하지만 새로운 사용자나 아이템이 추가됐을 때나 독특한 취향을 가진 사용자의 경우, 사용자나 아이템이 엄청나게 매우 많으면 추천이 어렵다는 단점이 있다.
모델 기반 협업 필터링(Model-based Collaborative Filtering) 방식은 선형대수학, 클러스터링 등 다양한 방법을 이용해 유저와 아이템에 대한 예측 모델을 만들고 이를 통해 추천한다. 대표적으로는SVD 같은 행렬 분해(matrix factorization)를 이용한 추천이 있다.

머하웃 유저 기반 협업 필터링 실습

유저 기반 협업 필터링 방식의 추천은 다음과 같은 과정으로 수행된다.
  • 사용자 평점 수집
  • 사용자 간 유사도 계산
  • Nearest-Neighborhood 형성
  • 선호도 예측
  • 아이템 추천
머하웃에서 각 과정은 아래와 같다.
  • DataModel 생성: 유저와 아이템 간 선호도를 매트릭스로 표현하는 데이터 모델을 생성(아래[그림 Ⅳ-1-9] 참조)
  • 사용 간 유사도 계산
    1. - 사용자가 평가한 공통 아이템을 기반으로 사용자 간 유사도 매트릭스를 계산한다.
    2. - 앞에서 살펴본 유사도 측정방식을 사용해 계산할 수 있다.
  • 최근접 이웃 선택: 앞에서 생성한 유사도 매트릭스를 기반으로 해당 유저와 가장 유사한 N명의 사용자를 선택한다.
  • 선호도 예측
    1. - 해당 유저가 선호도를 표현하지 않은 아이템들에 대해 선호도를 계산한다.
    2. - N명의 이웃이 해당 아이템에 대해 표현한 선호도를 이웃에 대한 유사도를 가중치로 해 가중 평균을 구한다.
  • 추천: 위에서 구한 선호도를 정렬해 큰 순서대로 추천한다.

[그림 Ⅳ-1-9] 머하웃 DataModel을 이용해 입력 텍스트 파일 데이터10)를 선호도 매트릭스로 변환

[그림 Ⅳ-1-9] 머하웃 DataModel을 이용해 입력 텍스트 파일 데이터10)를 선호도 매트릭스로 변환

아래 소스코드는 위 과정에 대한 간단한 샘플 코드로, 피어슨 상관계수 유사도를 이용해 유사 이웃을 2명씩 선택한 후 3번 유저에 대해 한 개의 아이템을 추천하기 위해 유저 기반 협업 필터링 알고리즘을 사용하는 방법을 보여준다.

[그림 Ⅳ-1-9] 머하웃 DataModel을 이용해 입력 텍스트 파일 데이터10)를 선호도 매트릭스로 변환

위 소스코드를 실행하면 다음과 같은 결과를 얻을 수 있다.

[그림 Ⅳ-1-9] 머하웃 DataModel을 이용해 입력 텍스트 파일 데이터10)를 선호도 매트릭스로 변환

3번 사용자는 106번 아이템을 가장 선호할 것으로 예측했으며, 그 선호도 예측값은 4.0으로 계산했다.
생각보다 간단한 과정을 거쳐 추천 시스템을 구현해 보았다. 하지만 앞서 소개한 소스코드는 하둡 분산 시스템에서 동작하는 알고리즘이 아니라, 단일 장비의 메모리에 모든 데이터를 올려두고 수행되는 알고리즘 구현체다. 머하웃은 하둡의 분산 모드에서 동작하도록 맵리듀스를 이용해 구현된 항목기반(item-based) 협업 필터링 방식의 추천 시스템을 지원한다. 만약 대용량 데이터를 이용해 추천을 수행해야 한다면 이 항목기반의 협업 필터링 구현물을 이용하거나 분산 모드에서 동작하는 또 다른 추천 시스템인 matrix factorization을 이용한 모델 기반 추천 시스템을 활용해야 한다.


실전 응용

분산환경에서 동작하는 항목기반 추천 시스템 예제를 이용해 머하웃을 실제로 사용하거나 수정하기 위해 개발환경을 구축하는 방법을 알아 보자. 이는 머하웃을 애플리케이션에 통합ㆍ활용하기 위한시작점을 만드는 좋은 예제가 될 것이다.


이클립스 환경에서 머하웃 빌드
  1. ① mahout repository에서 소스코드 체크아웃

    [그림 Ⅳ-1-10] 소스코드 체크아웃

    [그림 Ⅳ-1-10] 소스코드 체크아웃

  2. ② 원하는 프로젝트 이름을 지정하고 적어주고 아래와 같이 체크아웃 한다.

    [그림 Ⅳ-1-11] 이름 지정 후 체크아웃

    [그림 Ⅳ-1-11] 이름 지정 후 체크아웃

  3. ③ checkout 받은 소스에서 core 프로젝트 import

    [그림 Ⅳ-1-12] core 프로젝트 import

    [그림 Ⅳ-1-12] core 프로젝트 import

  4. ④ maven 활성화

    [그림 Ⅳ-1-13] maven 활성화

    [그림 Ⅳ-1-13] maven 활성화

  5. ⑤ src/main/resources에 haoop/conf 를 추가

    [그림 Ⅳ-1-14] haoop/conf 추가

    [그림 Ⅳ-1-14] haoop/conf 추가

  6. ⑥ mvn package -DskipTests 옵션으로 maven을 빌드

    [그림 Ⅳ-1-15] maven 빌드

    [그림 Ⅳ-1-15] maven 빌드

  7. ⑥ mvn package -DskipTests 옵션으로 maven을 빌드

    [그림 Ⅳ-1-15] maven 빌드

    [그림 Ⅳ-1-15] maven 빌드

    [그림 Ⅳ-1-16] maven 빌드

    [그림 Ⅳ-1-16] maven 빌드

  8. ⑦ 약 30초 이내로 빌드 완료

    [그림 Ⅳ-1-17] 빌드 완료

    [그림 Ⅳ-1-17] 빌드 완료

  9. ⑧ jar 파일 생성

    [그림 Ⅳ-1-18] jar 파일 생성

    [그림 Ⅳ-1-18] jar 파일 생성

머하웃의 아이템 기반 추천 시스템 수행
  1. ①[그림 Ⅳ-1-19] jar 파일을 빌드 패스로 추가

    [그림 Ⅳ-1-19] jar 파일을 빌드 패스로 추가

    [그림 Ⅳ-1-19] jar 파일을 빌드 패스로 추가

  2. ② org.apache.mahout.cf.taste.hadoop.item 패키지의 RecommenderJob 드라이버에 아래와 같이 argument를 설정하고 적용 (--similarity Classname SIMILARITY_EUCLIDEAN_DISTANCE-input/user/bt22dr/mahout/recommend/input-output /user/bt22dr/mahout/recommend/output)

    [그림 Ⅳ-1-20] argument를 설정ㆍ적용

    [그림 Ⅳ-1-20] argument를 설정ㆍ적용

  3. ③ 위에서 argument로 준 input 경로에는 아래와 같은 입력 파일(intro.csv)을 넣어준다.

    [그림 Ⅳ-1-21] 입력 파일(intro.csv) 넣기

    [그림 Ⅳ-1-21] 입력 파일(intro.csv) 넣기

  4. ④ 실행

    [그림 Ⅳ-1-22] 실행

    [그림 Ⅳ-1-22] 실행

  5. ⑤ 아래와 같이 중간 결과물들이 생성되면서 MR 작업이 수행되고

    [그림 Ⅳ-1-23] 중간 결과물 생성과 MR 작업 수행

    [그림 Ⅳ-1-23] 중간 결과물 생성과 MR 작업 수행

  6. ⑥ 실행이 끝나면 아래와 같이 최종 결과물을 확인할 수 있다.

    [그림 Ⅳ-1-24] 결과물 확인

    [그림 Ⅳ-1-24] 결과물 확인