가볍게 읽어보는 머신러닝 개념 및 원리 - (4) 비지도학습 알고리즘(군집분석, 주성분분석)

2018. 7. 28. 20:28IT, 데이터/Data Science(데이터 분석)

728x90



지금까지 지도학습에 해당하는 회귀분석, 의사결정나무, 서포트 벡터 머신과 신경망에 대해서 알아보았습니다.


이번 글에서는 비지도학습 기법인 군집분석과 주성분분석을 소개하도록 하겠습니다.



1. 군집분석(Clustering Analysis)




군집분석은 입력된 데이터들의 값에 따라 어떤 데이터들이 좀 더 비슷한 성질을 가지고 있는지 파악하여 비슷한 것들끼리 군집으로 묶어주는 분석방법입니다. 


사람은 어떤 대상이든 일정한 특성에 따라 구분하는 것을 즐겨합니다. 음악같은 경우 곡의 특성에 따라 댄스, 발라드, 힙합, 락 이런 식으로 장르를 구분해서 이름을 붙이기도 하고, 학교에서는 어떤 애들은 모범생 그룹, 어떤 애들은 날라리 그룹, 어떤 애들은 아싸 그룹 이런 식으로 그룹짓기도 하고요.


이렇게 대상을 몇 가지 그룹으로 묶어서 일반화시키는 것은 복잡하고 다양하게 나타나는 대상들을 쉽게 이해하는 데 도움이 됩니다. 이렇게 군집분석은 대상을 좀 더 이해하기 쉽게 특징짓는 데 효과적인 방법입니다.



군집분석 알고리즘은 비교적 우리의 직관을 충실히 따라가는 편입니다. 우리가 흩어진 데이터들을 묶을 때 어떤 기준으로 묶을까요? 가장 먼저 서로 가깝게 다닥다닥 붙어있는 것을 하나의 그룹으로 취급할 것입니다. 그리고 서로 멀리 떨어져 있는 것은 서로 다른 그룹으로 취급할 것입니다. 군집분석 알고리즘도 우리가 머릿속으로 생각하는 사고과정과 유사하게 데이터들을 군집화합니다.


군집분석 알고리즘에는 계층적 군집분석비계층적 군집분석이 있는데 용도에 따라 다르게 활용됩니다.




먼저 계층적 군집분석은 한 군집이 다른 군집을 포함할 수 있는 구조로 군집을 만드는 기법입니다. 이것은 음악 장르를 구분하는 것과 비슷하게 음악이라는 것을 댄스, 발라드, 힙합, 락으로 구분하고 락에는 펑크락과 하드락이 있고 그 아래에 또 세분화되고 이런 식으로 계층화되는 형태로 데이터를 군집화합니다.


그래서 계층적 군집분석은 오른쪽 위의 그림과 같이 가지형태로 파생되는 형태로 결과가 얻어지는 데 이것을 덴드로그램(Dendrogram)이라고 합니다.


 

반면 비계층적 군집분석은 군집끼리 포함관계를 이루지 않고 서로 독립적인 한 군집으로 만드는 기법입니다. 위와 같이 분포한 데이터를 빨강그룹, 파랑그룹, 초록그룹으로 구분하여 그룹짓는 것이 바로 비계층적 군집분석이라고 할 수 있습니다.


비계층적 군집분석은  거리를 기반으로 군집화하는 방법(K-means)(왼쪽 위 그림)과 밀도를 기반으로 군집화 하는 방법(DB-SCAN)(오른쪽 위 그림)이 있는데 데이터가 분포한 특성에 따라 좀 더 말을 잘 듣는 방법을 선택해서 사용할 수 있습니다. 또 하나 차이점은 거리기반 군집분석기법은 미리 몇 개의 군집을 만들 것인지 정의해야합니다. 군집을 3개로 만들겠다고 설정하면 컴퓨터는 3개에 맞도록 구분해 줄 것이고, 5개로 만들겠다고 하면 5개에 맞도록 적절히 구분해줍니다.





[그림출처 : 신한카드 블로그]



군집분석은 연구나 기획 등 의사결정이 필요한 다양한 업무에서 활용됩니다. 그 중 잘 알려진 사례로 신한카드의 사례가 있습니다.


신한카드는 2014년부터 빅데이터를 적극적으로 활용하기 시작했는데, 그 결과가 바로 Code 9(코드나인)이라고 하는 것입니다. 신한카드는 고객정보와 카드 결제내역을 군집분석하여 남녀 고객을 위와 같이 총 18가지로 분류하고 각 분류별로 Rookie, It-Girl 같은 명칭을 지었습니다. (이런 명칭을 짓는 건 각 고객군집의 특성을 사람이 직접 확인해서 판단하는 거겠죠?)


이렇게 고객들을 군집화한 것은 고객마다 원하는 카드혜택이 다르기 때문에, 고객 특성을 몇 가지로 축약하여 정의함으로써 고객 특성별로 특화된 카드 상품을 만드는 데 유용하게 활용될 수 있습니다.

그 결과 특정 고객유형에게 효과적인 혜택을 제공하는 23.5º 카드와 S-Line 카드상품을 출시했다고 하네요.


(그런데 맞춤형 혜택을 제공하면 사람들이 많이 써야할 것 같은데 딱히 좋은 평을 듣지 못한 걸 보면 고객 분류가 적절치 않았거나 지나치게 특정타겟에 혜택을 맞추다보니 범용성이 떨어지거나 했던 것 같네요.) 












2. 주성분 분석(Principle Component Analysis, PCA)


주성분 분석은 데이터 입력값의 특성을 분석해서 출력값을 더 잘 설명해줄 수 있는 새로운 독립적인 입력 특성을 추출하는 방법을 말합니다. 말로만 설명을 들으면 잘 와닿지는 않을테니 아래의 예시로 다시 설명드리겠습니다.






[그림출처 : https://en.wikipedia.org/wiki/Principal_component_analysis]

[그림출처 : http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/119-pca-in-r-using-ade4-quick-scripts/]



왼쪽 위의 그림을 살펴보면 x,y 평면에 데이터가 넓게 분포해 있습니다. 그런데 잘 보면 데이터가 약간 비스듬한 모양으로 분포해 있는 것을 알 수 있습니다. 그렇다면 이 데이터는 x축, y축으로 설명하는 것보다는 서로 수직한 w축과 z축을 새로 그어서 데이터의 특성을 표현하는 것이 좀 더 자연스럽다고 볼 수 있습니다.



    

극좌표일 경우


r=kθr=kθ



직교좌표일 경우

x2+y2=k2(arctan(yx)θo)2



  


















수학에서도 원이나 나선 같은 어떤 형태는 직교좌표보다 극좌표를 사용하는 것이 훨씬 더 특성을 효과적으로 설명합니다. 위와 같이 나선형태의 곡선은 극좌표로 표시하면 중심으로부터의 거리(r)와 각도(θ)로 간결하게 표현되는 반면, 직교좌표의 경우 훨씬 복잡함을 알 수 있습니다. 


이렇게 주성분분석은 데이터를 더 잘 설명하는 특성을 찾는데 도움을 주기도 하지만, 좀 더 비중있는 특성과 비중이 낮은 특성을 찾아서 입력 특성의 개수를 적절하게 줄이는 효과도 있는데 이것을 통해 데이터의 크기를 축소하여 향후 지도학습을 시킬 때 성능을 개선하는 데 활용되기도 합니다.


어느정도 규모가 되는 데이터의 경우 하나의 출력값을 결정하는데 수십개에서 백 개 이상의 입력값이 동원되기도 합니다. 예를 들어서 신용카드 사에서는 고객에 대한 신상정보 뿐만 아니라 그 동안의 결제내역을 통해 어떤 종류의 상품을 선호하는지, 얼마나 소비하는 지에 대한 아주 상세한 데이터를 갖고 있습니다. 이러한 데이터는 우리가 생각하는 것보다 훨씬 더 세분화되어 관리되고 있기 때문에 고객마다 수십개의 속성정보를 갖게 됩니다.


따라서 고객별 속성정보를 활용하여 맞춤형 서비스를 제공하기 위해 머신러닝을 활용하고자 할 때 수십개에 달하는 엄청난 규모의 데이터를 알고리즘에 쏟아넣을 수 있는데,


사실 이 중에는 별 의미없는 속성도 있고, 서로 비슷한 성격의 속성도 있을 것입니다. 따라서 모든 속성을 다 쏟아넣기 전에, 주성분분석으로 한번 걸러서 50-60개의 속성을 20개 정도의 의미있는 속성으로 축소시켜 알고리즘에 넣어 학습시키면 데이터의 정확성이 약간 떨어지지만 모델의 속도를 훨씬 상승시킬 수 있게 되는 것입니다. 





[그림출처 : 파이썬 라이브러리를 활용한 머신러닝(한빛출판사)]


주성분분석은 얼굴인식 인공지능을 만들때도 활용될 수 있습니다.


우리가 사람얼굴을 구별하기 위해서 어떠한 요소를 고려할까요? 그리고 최대한 적은 요소로도 잘 구별하려면 얼굴 특성을 어떻게 만들어야 할까요? 


얼굴 윤곽, 피부밝기, 주름의 정도, 수염의 유무 등등... 여러가지가 있지만 이 정도 정보만으로는 사람얼굴을 다시 재현하기 어렵겠네요. 그만큼 직관적으로 답을 떠올리기가 어려운 일이기도 합니다.


그래서 사람얼굴 수백, 수천장을 주성분분석하면 얼굴을 구별하는 데 가장 중요한 특성순서로 성분을 만들어줍니다.

위 그림의 왼쪽 15개의 이미지가 바로 그것입니다. 이 주성분들을 일정한 가중치로 섞으면 각 개인의 얼굴이 재현되는 것이죠. 어떤 성분은 턱수염이나 콧수염이 부각된 이미지가 있고, 또 다른 성분은 눈두덩이나 얼굴형이 강조된 것도 있네요. 


이렇게 추출된 주성분을 잘 섞어서 오른쪽 위 그림 중 가장 왼편에 있는 원본 이미지를 재현해봅니다. 주성분을 10개만 활용한 경우 원본사진과 다소 차이가 많이나서 본인임을 확인하기에는 좀 역부족인 것 같습니다. 하지만 주성분을 50개, 100개를 섞으면 원본사진과 똑같지는 않지만 원래 사진을 약간 흐릿하게 한 정도로 유사하게 재현되었습니다. 그리고 주성분 500개를 활용해 섞은 결과 원본과 거의 똑같이 재현되었음을 알 수 있습니다.


따라서 주성분분석을 활용하면 얼굴을 잘 구분할 수 있는 요소들을 파악하는 데 도움을 주고, 그 중 비중이 높은 상위 몇 개의 주성분만으로도 원래의 데이터를 재현하게 하여 데이터의 크기를 줄이는 데 효과가 있다고 할 수 있습니다.






[제목 그림출처 : https://www.ie.edu/exponential-learning/blog/bootcamps/machine-learning-marketing/]