블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 

'Unsupervised learning'에 해당되는 글 2

  1. 2017.10.11 클러스터링 #2 - Hierarchical clustering (계층 분석)
  2. 2014.10.30 맨땅에 해딩 머신러닝 #1-기본 개념 잡기 (1)
 

Hierarchical clustering을 이용한 데이타 군집화


조대협 (http://bcho.tistory.com)


Hierarchical clustering (한글 : 계층적 군집 분석) 은 비슷한 군집끼리 묶어 가면서 최종 적으로는 하나의 케이스가 될때까지 군집을 묶는 클러스터링 알고리즘이다.

군집간의 거리를 기반으로 클러스터링을 하는 알고리즘이며, K Means와는 다르게 군집의 수를 미리 정해주지 않아도 된다. 참고로 이 글에서 사용된 예제 코드는 https://github.com/bwcho75/dataanalyticsandML/blob/master/Clustering/3.%20Hierarchical%20clustering-IRIS%204%20feature.ipynb 에 저장되어 있다.


예를 들어서 설명해보자

“진돗개,세퍼드,요크셔테리어,푸들, 물소, 젖소" 를 계층적 군집 분석을 하게 되면

첫번째는 중형견, 소형견, 소와 같은 군집으로 3개의 군집으로 묶일 수 있다.


이를 한번 더 군집화 하게 되면 [진돗개,셰퍼드] 와 [요크셔테리어,푸들] 군집은 하나의 군집(개)로 묶일 수 있다.


마지막으로 한번 더 군집화를 하게 되면 전체가 한군집(동물)으로 묶이게 된다.


이렇게 단계별로 계층을 따라가면서 군집을 하는 것을 계층적 군집 분석이라고 한다.

계층적 군집 분석은 Dendrogram이라는 그래프를 이용하면 손쉽게 시각화 할 수 있다.





계층형 군집화에 대한 좀 더 상세한 개념은 https://www.slideshare.net/pierluca.lanzi/dmtm-lecture-12-hierarchical-clustering?qid=94d8b25a-8cfa-421c-9ed5-03c0b33c29fb&v=&b=&from_search=1 를 보면 잘 나와 있다.


skLearn을 이용한 계층 분석 모델 구현

개념을 잡았으면 실제로 계층 분석 모델을 구현해보자.

데이타는 K Means에서 사용했던 IRIS 데이타를 똑같이 사용한다.

이번에는 4개의 피쳐를 이용해서 사용한다.


from sklearn import datasets
import pandas as pd
iris = datasets.load_iris()

labels = pd.DataFrame(iris.target)
labels.columns=['labels']
data = pd.DataFrame(iris.data)
data.columns=['Sepal length','Sepal width','Petal length','Petal width']
data = pd.concat([data,labels],axis=1)


다음은 IRIS 데이타를 이용하여 dendrogram을 그려보자

# Perform the necessary imports
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt

# Calculate the linkage: mergings
mergings = linkage(data,method='complete')

# Plot the dendrogram, using varieties as labels
plt.figure(figsize=(40,20))
dendrogram(mergings,
          labels = labels.as_matrix(columns=['labels']),
          leaf_rotation=90,
          leaf_font_size=20,
)
plt.show()


먼저 linkage 함수를 import 한 다음 linkage 함수에 data를 넘겨주면 Hierarchical clustering을 수행한다. 이때 method=’complete’로 정했는데, 이 부분은 뒤에서 설명한다.

Hierarchical clustering 한 결과를 dendrogram 함수를 이용하여 dendrogram 그래프를 표현해 보면 다음과 같이 출력된다.




계층 분석 방식

앞의 코드에서, linkage 함수에서 method 를 사용했다. 이에 대해서 알아보자.

Hierachical clustering의 기본 원리는 두 클러스터 사이의 거리를 측정해서 거리가 가까운 클러스터끼리 묶는 방식이다.  그러면 두 클러스터의 거리를 측정할때 어디를 기준점으로 할것인가를 결정해야 하는데 다음 그림을 보자.



출처 : https://www.multid.se/genex/onlinehelp/hs515.htm


앞의 코드에서 사용한 complete linkage 방식은 두 클러스터상에서 가장 먼 거리를 이용해서 측정하는 방식이고 반대로  single linkage 방식은 두 클러스터에서 가장 가까운 거리를 사용하는 방식이다.

average linkage 방식은 각 클러스터내의 각 점에서 다른 클러스터내의 모든 점사이의 거리에 대한 평균을 사용하는 방식이다.


이 linkage 방식에 따라서 군집이 되는 모양이 다르기 때문에, 데이타의 분포에 따라서 적절한 linkage  방식을 변화 시켜가면서 적용해가는 것이 좋다.


계층 분석을 통한 군집의 결정

계층 분석은 최종적으로 1개의 군집으로 모든 데이타를 클러스터링 하는데, 그렇다면 n개의 군집으로 나누려면 어떻게 해야 하는가?

아래 dendrogram을 보자 y축이 각 클러스터간의 거리를 나타내는데, 위로 올라갈 수 록 클러스터가 병합되는 것을 볼 수 있다.




즉 적정 y 값에서 클러스터링을 멈추면 n개의 군집 까지만 클러스터링이 되는데, 위의 그림은 y 값을 3에서 클러스터링을 멈춰서 총 3개의 클러스터로 구분을 한 결과이다.


이렇게 계층형 분석에서 sklearn을 사용할 경우 fcluster 함수를 이용하면, 특정 y값에서 클러스터링을 멈출 수 있다. 다음 코드를 보자.


from scipy.cluster.hierarchy import fcluster

predict = pd.DataFrame(fcluster(mergings,3,criterion='distance'))
predict.columns=['predict']
ct = pd.crosstab(predict['predict'],labels['labels'])
print(ct)


앞의 코드에서 계층형 클러스터링을 한 mergings 변수를 fcluster 함수에 전달하고 두번째 인자에 y의 임계값을 3으로 지정하였다. Predict 컬럼에는 원본 입력데이타에 대한 예측 결과 (어느 클러스터에 속해있는지를 0,1,2로 입력 데이타의 수만큼 리턴한다.)를 리턴한다.


이를 원본 데이타의 라벨인 labels[‘label’]값과 Cross tabulation 분석을 해보았다.




세로축이 예측 결과, 가로측이 원래 값이다.

원래 label이 0인 데이타와 1인 데이타는 각각 잘 분류가 되었고, 2인 데이타는 34개만 정확하게 분류가 되었고 16개는 원본 레이블이 1인 데이타로 분류가 되었다.


지금까지 Hierachical clustering model에 대해서 알아보았다. K Means와 같은 군집화 모델이라도 내부 알고리즘에 따라서 군집화 결과가 다르기 때문에, 샘플 데이타의 분포를 보고 적절한 클러스터링 모델을 고르는 것이 필요하다. 다행이 sklearn의 경우 복잡한 수식 이해 없이도 간단한 라이브러리 형태로 다양한 클러스터링 모델 사용할 수 있도록 해놨기 때문에, 여러 모델을 적용해가면서 적정한 데이타 분류 방식을 찾아보는 것이 어떨까 한다.




맨땅에 해딩 머신러닝 #1


어떻게 강의도 보고 이야기를 듣다 보니, 빅데이타 분석등에서 중요한 것은 데이타 저장/통계뿐만 아니라 데이타 분석을 기반으로 예측등과 같은 의미를 찾아내는 것이 중요하다는 것을 알게 되었는데, 후배가 DEVIEW 컨퍼런스에서 딥러닝 강의등을 듣고 대략적인 원리를 듣고 감명 받은 소감을 이야기 해줘서 관심을 가지고 있던 중, 아프리카 TV의 추천 시스템 등의 강의를 접하게 되었습니다.

모든게 기본적으로 머신러닝이라는 것을 기본으로하고 있었는데, 이 분야를 공부하려고 봤더니, 수학(선형대수), 통계학 그리고 빅데이타 분석 시스템, 대용량 분산 처리 시스템등 여러가지 학문이 엮어 있더군요.

지금까지 기술 흐름을 봤을때, 이 부분이 중요한 부분이 될것 같기도 해서 막상 공부를 시작하려고 하니, 막상 수학에 대한 두려움 부터 오더군요. 어떤 것부터 해야 할지...

그래서 정석 수학을 사서 고등학교 수학을 공부해볼까도 생각해봤지만, 주변에 조언이 그러면 시작하기도 전에 지친다고 해서 Machine Learning in action 책도 구입하고 조언대로 Cousera의 스탠포드 Andrew ng 교수님의 강의를 듣기 시작했습니다. 영어라서 진도는 느리기는 하지만, 머신 러닝의 기본적인 컨셉을 잘 설명해주시고, 수학적인 지식이 많이 없더라도 그걸 다 감안해서 설명해주기 때문에 초보자에게 많이 유용한 것 같습니다.


머신 러닝은 이미 대학/대학원에서도 많이 가르키고 있는 학문으로 인터넷에 관련 컨텐츠들이 많고 수준이 높은 내용도 많지만, 저 같은 엔지니어는 머신러닝의 알고리즘을 스스로 만들기 보다는 머신러닝을 잘 이해하고 이를 맞는 시나리오에 잘 가져다가 인프라와 시스템들과 같이 잘 녹여 내는게 중요하다고 생각해서 수학 초보자 엔지니어의 머리로 공부한 머신러닝에 대해서 정리해보고자 합니다. (사실 Hash 알고리즘. MD5,SHA1-256 등도 다 이해하고 쓰시는 분들보다 라이브러리를 가져다 쓰시잖아요. 그렇지만 최소한 해쉬의 원리에 대해서는 이해하고 있어야져)


NoSQL과 클라우드 컴퓨팅도 공부를 시작하고 개념을 잡아서 스스로 정립 시키기 까지 대략 2년 정도가 걸렸던것 같은데.. 이렇게라도 시작을 안하면 시작을 못할까봐, 자기제약의 형태로 코세라 andrew 교수님의 강의나 다른 책들을 통해서 공부한 내용을 정리해보고자 합니다.


머신 러닝 이란?


컴퓨터에 샘플 데이터를 통한 지속적인 학습을 통해서, 문제에 대한 답을 얻어내는 방법

컴퓨터 공학, 수학, 통계학의 교집합에 속함. 쉽게 접할 수 있는 머신러닝의 사례로는 

  • 이메일 스팸 필터링 시스템
  • 쇼핑몰이나 영화 연관 추천 시스템
  • 문자 인식
  • 자연어 처리
  • 연관 검색어 처리

이러한 시나리오는 지속적인 샘플 데이터를 통해서 알고리즘을 학습해나감으로써, 최적의 알고리즘을 찾아서, 적절한 담을 찾아내도록 할 수 있다.

쇼핑몰 추천 시스템의 경우 사용자의 구매 패턴을 군집화 하여, 유사한 패턴을 찾아 냄으로써 적절한 상품을 추천하게 하는데, 40대 미혼/남자/연수입 5000만원/차량 보유 한 사용자가 카메라,배낭등을 구매했을 경우 여행 상품을 구매할 확률이 높다는 것을 학습했을 때, 이러한 사용자에게 여행 상품을 추천해주는 것들과 같은 답을 제공할 수 있다.


Supervised learning (지도 학습)
학습에 사용되는 데이터에 결과가 정해졌 있는 경우를 Supervised Learning이라고 한다.
예를 들어, “아파트 평수가 22평일 때, 구매 가격이 1억이다”와 같은 경우인데, “구매가격이 1억이다”라는 결과 값이 정해져있는 경우이다.
반대로, 영화관 관람객 데이터가 있을 때, “20대x30 명, 30대x10명,40대x10명”과 같이 어떤 데이터데 대해서 그 결과값이 없을 경우에는 비지도 학습(Un-supervised learning이라고 한다)
여기서 용어를 한번 소개하고 넘어가자. 아래와 같이 지역,평수,층수에 따른 가격 데이터가 있다고 하자


가격은 앞의 3개 조건에 따라 변화하는 결과인데, 이 지역,평수,층수와 같은 조건을 Feature 또는 Attribute 라고 하며, 이 Feature에 따라 결정되는 값을 Targeted value(목적값)이라고 한다.


Regression problem vs Classification problem


이 Supervised learning은 문제의 타입 (problem type)에 따라 크게 두가지로 분류될 수 있다.

먼저 Regression problem이란 기대되는 목적값이 continuous 한 연속성을 가지고 있을 때, Regression problem 이라고 한다. 즉 평수에 의한 아파트 값은 Regression problem이다, 22평일 때 가격이 1억, 23평일 때 1.2억,24평일 때 1.4억과 같이 Feature x_i에 대해서 Targeted value y_i가 기대 되는 경우 Regression problem이라고 한다.

아래는 Regression problem에 대한 예로, 집 평수에 따른 가격에 대한 문제를 표현한 것이다. ( X는 실측 데이터)





 

반대로 Classification problem은 목적값이 continuous한 연속성이 없이 몇가지 값으로 끊어지는 경우이다. 예를 들어 “나이가 20대이고, 종양의 크기가 2cm이면 음성암”,”나이가 50대이고 종양의 크기가 3cm 이면 양성암” 과 같이 나이,종양과 같은 Feature에 대해서 기대되는 target value가 양성/음성과 같이 연속성이 없이 몇 개의 분류로 딱 떨어지는 경우를 Classification problem이라고 한다. 

아래는 “종양 크기에 따른 유방암 여부”에 대한 문제를 그래프로 표현한 것인데, Target value (Y축)의 값이 Yes/No로 딱 구분되는 것을 볼 수 있다.

 


Unsupervised learning (비지도 학습)

비지도 학습(Unsupervised learning)이란, Training data에 target value가 없는 경우를 말한다. 흔히 라벨링 (Labeling)이 안되어 있다고도하는데, 지도 학습(Supervised learning)과 비교를 해보면 개념을 잡기가 좋다.


  

왼쪽의 그래프를 Supervised learning이라고 하면, x1은 나이, x2는 종양의 크기라고 할 때 그래프에서 동그라미는 음성암, X는 양성암이다. x1,x2는 feature이고, O/X는 target value로 x1,x2에 대한 결과를 기대할 수 있는 문제 형태이지만

오른쪽 그래프는 unsupervised learning으로 x1,x2가 각각 나이,종양이라고 했을 때, 그래프 O는 같은 의미를 갖는 뿐 양성/음성으로 표시(labeled) 되지 않았다. 대신 이런 경우는 x1,x2와 같은 feature에 대해서 몇 개의 군집(Cluster)로 나눌 수 가 있는데, 그림의 붉은 동그라미 그룹이 군집 그룹에 속한다.

SNS에서 사용자들을 가까운 사람들 끼리 군집화 하거나, 시장에서 사용자들을 특정군으로 나누는 등에 사용될 수 있다.