반응형

Logistic Regression

Linear Regression을 통해서, 연속적 값에 대한 출력 변수를 모델링을 할 수 있다. 하지만, 연속 데이터의 예측 문제에서 Linear Regression은 효과적이지만, 연속적인 값을 추측하기 때문에 분류 모델에서는 적합하지 않다. 분류 문제를 푸는 방법에는 여러가지가 있지만, 오늘 알아볼 Logistic Regression에 대한 이해가 필수적이다. 


Logistic Regression 이란?

  • 이진 분류 문제(입력 값을 2가지 유형으로 나누는 문제)에서 사용하는 분류 모델이다. 
  • Linear Regression과 비슷하게, 입력변수와 출력변수 간의 관계를 모델링하는데, Linear Regression과 달리 값의 범위를 제한하기 위해 일반적으로 Sigmoid 함수를 사용한다. (다른 함수를 사용할 수 있지만, 일반적으로 Sigmoid를 사용한다.)
  • Linear Regression은 입력변수와 출력변수의 선형적 관계에 초점을 맞췄다면, Logistic Regression은 Sigmoid 함수를 통해, 0에 가까운지 1에 가까운지를 모델링하는데에 초점을 맞췄다.
  • Sigmoid 함수

-   Sigmoid 함수는 이진 분류를 위해 사용하는 함수로 출력값을 0에서 1 값으로 제한하는데 사용된다.
-   Sigmoid 함수는 입력변수로 구해진 모델링 값을, 중간의 일부 구간을 제외하고, 0이나 1에 매우 가까운 근접 값으로 출력해준다. (아래 그래프를 보면 이해가 쉽다.)
-   Sigmoid 함수는 무엇보다, 모든점에서 미분이 가능하기 때문에, Back Propagation을 통한, Weight와 Bias 업데이트가 가능하다. 즉, 머신러닝 문제에서 활용 가능하다.
-   Sigmoid 함수는 아래 그래프에서 확인 할 수 있듯이, Z 값이 너무 크거나, 작을 때는 Gradient가 0에 가까워 지는 Gradient Vanishing 문제가 있다.  

 

 

  • Logistic Regression에서의 예측 출력값은 다음과 같이 나타난다. 

 

 

[Logistic Regression 식 유도] 

Logistic Regression의 식은 Odds를 Logistic 변환하여 유도된다. 


odds 식 :성공 확률 (y=1)이 실패 확률(y=0)의 몇 배인지 나타내는 식 


odds 식의 logit 변환 수행 (편의상, 성공확률을 p로 표기)

 logit 변환된 odds를 입력변수의 선형 변환 예측하면,


성공확률 p는 다음과 같다.

라하면, 


Logistic 식이 만들어진다.

 

Logistic Regression의 학습 방법

  • 일반적으로 Logistic Regression의 학습을 위해서는 최대우도방법(MLE, Maximum Likelihood Estimation)을 사용한다. (물론, Linear Regression과 같이, 최소제곱법을 사용 가능하지만, 효과적이지 않다.)
  • 최대우도방법은 주어진 파라미터를 통해, 실제 값이 나올 확률을 최대화하는 방향을 따라 학습하도록 하는 알고리즘이다.
  • 보통 학습은 경사하강법을 사용하여 학습된다.

 

[최대우도방법]

  • 최대 우도 방법은 입력변수(x)와 모델 파라미터(θ)가 있을 때, 실제 결과 값(y)가 나오는 Likelihood를 최대화하는 방법이다.   Likelihood 함수는 최대화하는 값을 구하는 것이, 입력 변수에 대한 실제 결과 값을 가장 잘 추론할 수 있는 파라미터를 찾는 것이다. (yi:i번째 Label - 0 or 1, pi: i번째 성공 확률)

  • Likelihood 함수의 최댓값을 그대로 구해도 되지만, 양변에 Log함수를 취하면, (x값에 따라 y값이 증가하므로, log를 취한 최댓값을 찾는 것은, log 취하기 전 값의 최댓값을 찾는 것과 같다. 보통은 학습의 안정성 때문에 활용한다.)

  • 결국, 최대우도방법은 가장 Log Likelihood가 가장 큰 값이 될 수 있는 모델의 파라미터(θ)를 추정하도록 학습하는 방법이다.

[경사하강법]

  • 경사하강법은 함수의 기울기를 이용하여, 함수의 최적값을 찾는 최적화 알고리즘이다. 
  • Logistic Regression에서 경사하강법은 다음과 같이 실행된다.

1. Logistic Regression에서 모델의 파라미터 θ를 학습하는 것은 아래 식을 최대화하는 θ를 찾는 과정이다.

2. 이것은 logistic likelihood에 음수값을 취한 값을 최소화하는  θ를 찾는 것과 같다. 따라서, 목적함수는 다음과 같다.

3. 모델 파라미터  θ를 무작위로 초기화한다.(후에 초기화를 위한 여러 방법도 있지만, 기본적으로 무작위이다.)

4. 목적함수를 최소화하는 방향으로  θ를 업데이트한다. 

5. 특정 Epoch이나, 조건이 될때까지, 4번을 반복한다. 

 

Logistic Regression의 Python 구현

  • Logistic Regression은 Python의 Sklearn을 이용하여 쉽게 구현 가능하다.
  • 특히, classification 문제는 패키지로 쉽게 load 가능한 데이터들이 많다. (구현에서는 iris 사용)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


if __name__ == "__main__":
    # 데이터 Load (iris 데이터 사용, X :꽃의 길이와 너비, y: 꽃의 종류, 3개의 class)
    iris = load_iris()
    temp_X = iris.data[:, :2]
    temp_y = iris.target
    
    # 이진분류를 위해, class=0인 데이터들은 제외함
    indices = np.where(temp_y != 0)[0]
    
    X = temp_X[indices]
    y = temp_y[indices]
        
    
    # 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)

    # 모델 학습
    clf = LogisticRegression(random_state=1)
    clf.fit(X_train, y_train)

    # 모델 예측
    y_pred = clf.predict(X_test)

    # 정확도 계산
    acc = accuracy_score(y_test, y_pred)
    print("Accuracy:", acc)

반응형

지난 장에서 Kubeflow를 겨우 설치하는 데 성공하였다. 아무래도 로컬 환경에서 자원을 쪼개서, Kubeflow를 돌리다 보니 조금 버벅거리는 감이 있지만, Kubeflow의 각 기능을 조금 더 자세히 알아보자. 가장 먼저 알아볼 기능은 Katlib이다. 사실, 클라우드 환경이 아니라 로컬에서 Kubeflow를 실행하다보니, Kubeflow UI에서 지원해 주는 Notebooks나 Tensorboard 기능은 사실 잘 와닿지 않았다. (로컬에서 실행하면 되기 때문에) 하지만, Katlib은 평소 네트워크 학습 과정에서 걸리던 하이퍼파리미터 튜닝등의 문제에 유용하게 사용할 수 있을 것 같아, Katlib부터 소개하기로 한다.  
 


Katlib

  • Katlib은 앞선 장에서  설명했듯, 하이퍼파라미터 최적화 & 뉴럴 아키텍쳐 탐색을 지원해 주는 프레임워크이다. (개인적으로 Katlib은 머신러닝 워크플로우를 쿠버네티스 환경에서 실행하는 가장 큰 강점을 보여주는 프레임워크라고 생각한다.)
  • Katlib는 각기  다른 하이퍼파라미터 설정이나, 아키텍쳐 탐색을 분산된 머신에서 동시에 실행하여, 최적의 값을 탐색한다. 
  • 쉽게 말하면, Katlib은 한번에 여러 머신에서 실험 가능하고, 사용하기 쉬운 머신러닝 모델 탐색용 Cron Job이라고 생각한다.   
  • Katlib은 아래와 같은 장점을 갖는다.
    • 자동화된 하이퍼 파라미터 튜닝 : 하이퍼 파라미터를 튜닝하는 일은 모델 개발자들에게는 번거로운 일이고, 서비스 제공자에게는 어느 정도 난이도가 필요한 일이다. Katlib에서 제공하는 자동화된 하이퍼 파라미터 튜닝은 머신러닝이나 Batch 프로그램에 대한 전문 지식이 없더라도 쉽게 사용 가능하다.
    • 분산 머신러닝 지원 : 머신러닝 연구자라면 가장 스트레스 받는 일 중 하나가 환경을 세팅하는 일이다. 머신 여러 개로 하이퍼파라미터를 각기 달리 실험할 때, 여러 개에 동일한 개발 환경을 세팅하는 것은 굉장히 번거롭고, 어려운 일이다. 특히, 소스 상에서 변경점이 생길 때마다, 모든 머신에서 반영이 필요하다. Katlib은 쿠버네티스를 이용하여, 클러스터 내의 여러 머신에서 모델 훈련이 실행되므로, 효율성을 높일 수 있다.  

 

Katlib 사용법

  • Katlib을 실행하기 위해서는 "Experiment" CRD(Custom Resource Definition)을 사용하여, 작업을 정의하고, 실행해야한다. 
  • 앞서 말한대로, Katlib은 Kubeflow 환경 하에서 뿐만 아니라, 그 자체로 독립적으로 실행할 수 있다. 하지만, Kubeflow하에서 사용하면 더욱 쉽게 사용할 수 있다.
  • Kubeflow 환경 하에서 Katlib은 Experiments(AutoML) 메뉴에서 사용 가능하다. 
  • "Experiment" CRD를 직접 작성하여 작업을 정의할 수도 있고, UI를 이용하여 쉽게 CRD를 작성 가능하다. 
Kubeflow UI 내, Katlib
  • Kubeflow UI에서 Experiments(AutoML)를 실행했을때, 총 8개의 설정이 필요하다. 
  • 첫 번째는, Metadata이다. 현재 수행에 대한 Job 명을 정할 수 있다.
  • 두 번째는, Trial Thresholds이다. 실험에 대한 분산처리를 지정해 줄 수 있다. 각 Parameter는 다음의 의미를 갖는다.
    • Parallel Trials : 동시에 몇개의 실험을 진행할 것인지를 정해줌(H/W의 리소스를 효율적으로 사용하기 위해 정해줌, 분산처리)
    • Max Trials : 최대 몇번의 학습을 진행할지를 정해줌(과도한 H/W 리소스 사용을 방지)
    • Max failed Trials : 최대 몇 번까지 실패한 학습을 용인할지를 결정해 줌. Katlib의 수행 자동화 기능을 지원하기 위해 들어간 파라미터로, 실험 세팅의 실수 등의 이유로 정상적인 실험이 진행되지 않았지만, 인간이 바로 인지하지 못하는 경우 무의미한 실험들이 H/W를 점유하고 있을 수 있어서, 이러한 무의미한 실험등을 방지하기 위해, 최대 실패 횟수를 정해서, 이를 초과한 실험 실패가 발생했을 시, 실험을 중단함.
    • Resume Policy : 실험이 중단되었을때, 다시 시장하는 방법을 지정해 줌. ('Never' : 실험이 중단되었을 때, 재개하지 않음. 'Long Running': 실험이 종료된 뒤에서 Pod 및 리소스를 유지하여, 데이터를 유지하고 실험 결과를 확인 가능함. 'From Volume' : 실험이 종료된 후, 해당 실험에 필요한 볼륨이 자동으로 마운트 되어, 실험에서 생성된 데이터나 파일을 계속 사용하여 실험을 재개함.)
  • 세 번째는, Objective이다. 모델 학습을 최적화하기 위한 최종목표를 정의 가능하다. Metric을 통해서, 여러개 Objective를 설정할 수 있고, 각 Metics에 대해, "Maximaze"와 "Minimize"를 정해, 탐색 목표를 정할 수 있다. 
  • 네 번째는, Search Algorithm이다. 모델 탐색 과정의 알고리즘을 선택할 수 있다. 크게 Hyper Parameter tuning과 neural Architecture Search에 대한 알고리즘을 제공한다.
  • Hyper Parameter tuning은 총 9개의 알고리즘을 제공한다. 그중 많이 사용하는 알고리즘은 아래와 같다.  
    • Grid : Grid Search(가능한 모든 조합 시도)
    • Random : Random Search(임의로 Hyper parameter 선택)
    • Bayesian Optimization : 후보 모델을 사용하여, Hyper parameter 조합을 평가하고, 그 Hyper parameter로 후보 모델을 업데이트하는 과정을 반복. 
  • Neural Artchitecture Search는 크게 2가지의 알고리즘을 제공한다.
    • Efficient Neural Architecture Search(ENAS) : 하나의 모델을 학습시켜, 새로운 모델을 생성하는 방식을 사용함. 파라미터 공유 및 Weight Sharing 기술을 사용해서, 여러 작업을 수행하고 구성요소를 동시에 학습 및 업데이트함.
    • Differentiable Architecture Search(DARTS) : 아키텍쳐 검색과 학습을 동시에 수행하는 end-to-end 학습 방법. 알고리즘이 다양한 아키텍처를 조합하는 데 사용되는 가중치를 학습함. 
  • 다섯 번째는, Neural Architecture Graph는 네트워크의 구성을 정의하기 위한, Input, Output 사이즈 및 Layer 갯수등을 지정한다. 
  • 여섯 번째는, Neural Architecture Operations이다. NAS에서 사용되는 기본 연산을 위한, 네트워크 구조 생성 및 변경에 사용된다. 모델의 구조를 생성하기 위한 파라미터등의 가능한 후보를 정의해서, NAS에서 모델을 찾는데 활용할 수 있다.  
  • 일곱 번째는, Metrics Collector이다. Metrics Collector는 각 실험들의 결과를 어떻게 수집하고, 측정할 것인지를 정의한다. Stdout처럼 단순 출력으로 받을 수도 있고, File이나, Prometheus 등을 통해서 수집 가능하다. 
  • 마지막으로, trial의 환경을 정해줄 수 있는 Trial Template이다. 이 메뉴를 활용하여, Trial에서 사용할 수 있는 도커 이미지나 하이퍼파라미터 설정, 리소스 제한 등을 정의할 수 있다. Template를 제공하기 때문에 해당 Template을 수정하는 구조로 실험을 진행할 수도 있다. 

 

  • 마지막 옵션까지 모두 설정하고, 아래 Edit 버튼을 누르면, 1~8까지 설정한 내용을 기반으로 "Experiment" CRD가 작성되어 있는 것을 확인할 수 있다. 
  • 설정이 제대로 들어가있는지 확인하고, 변경도 가능하다. 설정이 제대로 진행되었으면, CREATE를 통해 실험을 실행한다. 
 
  • 실험 결과는 아래와 같이 보인다. (로컬에서는 H/W 리소스 문제로 실행이 정상적으로 되지 않아서, Kubeflow 홈페이지의 이미지 활용)
  • Experiments에서 생성한 실험들에 대한 성공 횟수와 진행 중인 횟수, 실패한 횟수를 확인할 수 있다. 
Experiments 결과 (출처 : https://www.kubeflow.org/docs/components/katib/hyperparameter/)
  • 각 실험을 클릭해보면, Hyper Paramter 조합과 가장 최적의 Hyper Parameter 조합에 대한 정보를 얻을 수 있다. 
실험 세부 결과 (출처 : https://www.kubeflow.org/docs/components/katib/hyperparameter/)

사실, Katlib은 매우 유용한 툴이지만, H/W 리소스가 분산 처리를 할 수 있을 정도로 많은 양이 필요하기 때문에, 사용이 제한적이다. 아무래도 개인의 경우에는 많은 자원을 동시에 활용하는 일이 적기 때문에, Katlib보다는 Bash를 이용한 Batch Job 등을 이용하는 게 좋을 것 같다. 하지만, 사내등의 하드웨어 환경이 풍부한 상황에서는 요긴하게 활용할 수 있을 것 같다. 

반응형

이상치 제거에서 통계적인 방법은 유용하게 사용되지만, 다루는 데이터가 복잡하고, 차원이 커질수록, 단순 분포의 개념을 활용하기는 어렵다. 이를 해결하기 위한, 이상치 제거 방법 중, 머신 러닝 기반 방법들을 몇가지 알아보기로한다. 


머신러닝을 이용한 이상치(Outlier) 제거 방법

1. Cook Distance를 이용한 방법

  • Cook Distance는 회귀분석 문제에서 이상치를 찾기 위해 많이 사용되는 방법이다.
  • 각 데이터포인트가 회귀분석 모델의 예측력에 어느 정도 영향을 미치는지를 확인하여, 이상치 제거에 활용할 수 있다. (해당 데이터 포인트를 제거한 모델이 오히려 더 좋은 예측력을 가질 때, 해당 데이터 포인트를 이상치로 간주할 수 있다. )
  • Cook Distance를 이용한 이상치 제거의 단계는 다음과 같다.
    1. 데이터 전체를 이용해서, 회귀 모델을 예측한다.
    2. 각 데이터 포인트를 제외한 데이터들로 회귀 모델을 예측한다.
    3. Cook Distance를 구한다.
    4. Cook Distance가 일정 값 (일반 적으로 1) 이상인 값들은 이상치로 취급한다.  
  • Cook Distance의 수식은 다음과 같다. 

Cook Distance

 

  • 파이썬 코드 구현
    • 파이썬의 statsmodels 패키지를 사용하면, 쉽게 Cook Distance를 구할 수 있다.
import numpy as np
import statsmodels.api as sm



if __name__ == '__main__':
    
    x = np.random.rand(10)*100
    y = 0.8*x+np.random.randn(10)*5

    alpha = 70
    beta = 10

    X = np.append(x,alpha)
    Y = np.append(y,beta)
    
    model = sm.OLS(Y, X).fit()

    influence = model.get_influence()
    cd, _ = influence.cooks_distance

    outliers = np.where(cd > 1)[0]

 

2. DBSCAN을 이용한 방법

  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)은 머신 러닝에 주로 사용되는 클러스터링 알고리즘으로 Multi Dimension의 데이터를 밀도 기반으로 서로 가까운 데이터 포인트를 함께 그룹화하는 알고리즘이다.
  • DBSCAN에 대한 자세한 내용은 https://devhwi.tistory.com/7을 참고하면 된다. 
  • DBSCAN에서 어느 Cluster에도 속하지 못한 데이터들을 Outlier로 판단한다. 

 

  • 파이썬 코드 구현
    • 파이썬의 statsmodels 패키지를 사용하면, 쉽게 Cook Distance를 구할 수 있다.
from sklearn.cluster import DBSCAN
import numpy as np
from sklearn.datasets import make_blobs


if __name__ == '__main__':
    X, y = make_blobs(n_samples=1000, centers=5, random_state=10, cluster_std=1) # 데이터 생성
    x = np.array([[-7.5,-3]]) # 이상치 데이터
    X = np.concatenate((X,x), axis=0)
    
    # DBSCAN 알고리즘 적용
    dbscan = DBSCAN(eps=1.5, min_samples=2)
    dbscan.fit(X)

    # 이상치 제거
    mask = np.zeros(len(X), dtype=bool)
    mask[dbscan.labels_ == -1] = True
    X_cleaned = X[~mask]

 

 

Cook Distance나 DBSCAN 말고도, 의사결정트리를 이용한 방법이나, LOF를 이용한 방법 등이 있다. 다시 한번 명심할 것은 이상치로 구해진 값들이, 실제 모델링에서 제거해도 되는 값들인지 꼭 확인해보아야한다. 

'Data Science' 카테고리의 다른 글

DTW(Dynamic Time Warping)  (1) 2023.06.02
PCA(Principal Component Analysis)  (1) 2023.05.04
이상치(Outlier) 제거 방법(1) - 통계적 방법  (5) 2023.03.19
반응형

회사에서는 ML Ops 환경이 어느 정도 갖춰져 있어서, Kubeflow를 직접 설치하지 않았다. Local에서 Kubeflow를 설치하려고 하니, 생각보다 쉽지 않았다.  시간은 조금 걸렸지만, 설치하는 과정을 적어보고자 한다.


WSL 설치

  • Window에서 Kubernetes를 설치하기 위해서는, WSL(Windows Subsystem for Linux) 환경을 구성해야한다.
  • 먼저, Windows 검색 창에 Windows 기능 켜기/끄기를 검색하여 실행한다.
  • Windows 기능 켜기/끄기 List들에서 Linux용 Windows 하위 시스템을 체크해 준다. Windows Powershell을 관리자 권한으로 실행한 뒤,  wsl이 설치되어 있는지 확인한다. (보통 설치되어 있을 가능성이 높아서 확인)

wsl -l -v
  • 아래와 같이, list에 WSL 항목이 뜨고, VERSION이 '2' 이면, Docker Desktop 설치로 넘어간다. 

 

  • 만약 버전이 '1'일시에는, 아래 명령어로 버전을 바꿔준다.  Powershell에서 아래 명령어를 입력해 준다.
wsl --set-version {Name} 2  # Name에 현재 사용중인, wsl 버전 입력
wsl -l -v  # 적용 확인
wsl # wsl 환경으로 진입
  • 만약 wsl 목록에 존재하지 않는다면, Microsoft Store에서 "Ubuntu" 검색 후, 원하는 버전을 설치해 준다.

 

Docker Desktop 설치

  • Kubeflow는 Kubernetes 환경 하에서 돌아간다. 따라서, Kubeflow 설치 전에 Kubernetes 환경을 먼저 구성해야 한다.
  • Window에서 가장 쉽게 Kubernetes를 설치하는 방법은 Docker Desktop을 통해, 설치하는 것이다. 
  • 우선, 아래 Link에서 Docker Desktop을 설치한다.
Docker Desktop 설치
https://www.docker.com/products/docker-desktop/

Docker Desktop 설치 화면 (출처: https://www.docker.com/products/docker-desktop/)

  • 설치 후, Docker Desktop을 켜고, Setting > Kubernetes > Enable Kubernetes > Apply & restart를 눌러준다.

 

Kubectl 설치

  • Kubectl은 Kubernetes 클러스터를 관리하기 위한 CLI 도구로, 아래의 명령어를 통해 설치한다. 
sudo apt-get update && sudo apt-get install -y kubectl
kubectl version

 

Minikube 설치 & 실행

  • H/W 자원이 만약 풍부하다면, 일반의 Kubernetes Cluster 구성(마스터와 노드를 포함)이 가능하겠지만, 로컬 환경에서는 대체로 H/W 자원이 그리 풍부하지 않다.
  • Minikube는 로컬에서도 개발 & 테스트를 용이하게 하기 위해, 단일 노드로 구성된 Kubernetes Cluster를 생성할 수 있도록 하는 도구이다. 
  • 아래 명령어로, minikube를 설치한다.
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb && sudo dpkg -i minikube_latest_amd64.deb
  • minikube를 설치했으면, 아래 명령어를 통해, Kubernetes Cluster를 실행해 준다. (memory와 cpu, disk 등은 현재 사용 가능한 리소스 내에서 적당히 설정해 준다. 너무 많이 설정하면, Local 환경이 제대로 동작하지 않는다.)
  • 현재(23/03) 기준으로 Kubeflow가 지원하는 가장 높은 수준의 Kubernetes 버전은 1.25.0이다. 
minikube start --driver=docker --memory=4g --cpus=2 --disk-size 20GB --kubernetes-version=1.25.0

※ 주의 : kubernetes 버전에 따라, 사용 가능한, kubeflow 버전이 달라진다. 

 

Kustomize 설치 (Optional)

  • Kustomize는 원본 yaml 파일의 변경 없이, yaml 파일을 변경할 수 있도록 하여, 환경에 맞는 설치를 가능하도록 도와주는 도구이다.
  • 사실, Kubectl 설치 시, Kustomize는 자동으로 설치된다. (Kustomize 버전을 업그레이드하기 위해서는, Kubectl 버전을 업그레이드해야 한다.) 
  • 다만, Kustomize와 minikube의 Kubernetes 버전이 호환이 안 되는 경우, Kustomize만 따로, 설치하여, 적용 가능하다. 
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo cp kustomize /usr/local/bin/
kustomize version

 

Kubeflow 설치

  • 드디어, 대망의 Kubeflow를 설치한다.
  • Kubeflow 설치는 Kustomize를 이용하여, Kubernetes 버전에 존재하는 각 Component 들의 yaml 파일을 변경하여, 설치하는 구조이기 때문에, 1) Kubernetes 버전 2) Kustomize 버전과 호환성을 맞춰줘야 한다. 
  • 계속, Kubeflow 버전이 나오고 있기 때문에, 명령어 입력 전, https://github.com/kubeflow/manifests#installation 에 접속하여, 버전을 확인해 보기 바란다.

23/03/27 기준 prerequisites

  • 내가 설정한 버전은 다음과 같다.
kubernetes = 1.25
kustomize = 5.0.0
kubeflow = v1.7

 

git clone --branch v1.7-branch https://github.com/kubeflow/manifests.git
cd manifests
# 버전 변경이 필요 시 : git checkout (branch 명)
while ! kustomize build example | awk '!/well-defined/' | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

※ 설정한 H/W 리소스에 따라 다르겠지만, 설치까지 정말 오래 걸린다. 터미널 문구에 Warning이 뜨는 것은 상관없는데, Error가 뜬다면, Kubernetes 버전이나, Kustomize 버전과 호환이 안되었을 확률이 높다. 그런 경우 Kubernetes 버전과 Kustomize 버전을 바꿔주던, Kubeflow 버전을 바꿔주던 해야 한다.

 

  • 아무래도, Kubeflow가 특정 Kubernetes 버전에 맞춰서 개발되었을 것이므로, Kubernetes 버전을 바꿔주는 것이 좋다고 느껴진다. 
  • Kubernetes 버전은 아래 명령어로 다시 설정해 준다.
minikube delete
minikube start --driver=docker --memory=4g --cpus=2 --disk-size 20GB --kubernetes-version={새로운 버전}

 

Kubeflow 접속

  • 로컬 컴퓨터의 8080 포트와 쿠버네티스 내부의 80 포트를 연결해 줘서, UI에 접근할 수 있도록 해준다. 
  • 이 명령어를 실행하면 로컬 컴퓨터의 8080 포트를 통해 쿠버네티스 내부의 istio-ingressgateway 서비스에 접근할 수 있다.  
kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
  • 명령어 실행 후, 브라우저에서 http://127.0.0.1:8080에 접근하면 Kubeflow UI에 접근 가능하다. 

 


Kubeflow 설치는 시간도 오래 걸리고, 각 도구들의 버전 호환성 때문에, 설치가 어려웠다. 하지만, 천천히 하나하나 진행하다 보면, 대략적으로 Kubeflow가 어떻게 구성되는지 보이는 것 같다. 다음 장부터 Kubeflow 각 component를 파봐야겠다.  

'MLops' 카테고리의 다른 글

MLops 등장: Hidden Technical Debt in Machine Learning Systems 논문 리뷰  (17) 2024.02.18
Kubeflow (2) - Katlib  (1) 2023.04.11
Kubeflow (0) - 소개  (1) 2023.03.26
반응형

AI가 연구의 영역에서 실용 영역으로 침투하기 시작하면서, AI로 구성된 서비스를 어떻게 잘 제공할 것인지에 대한 수요가 높아지고 있다. 특히, chat-gpt로 AI 영역에서 엔지니어링의 중요성이 대두된 만큼, AI 서비스의 수집부터, 제공까지의 워크플로우를 어떻게 관리할 것인지에 대한 관심이 높아졌다. Kubeflow는 이런 상황 속에서 등장하고 발전했다. (처음 등장한 지는 조금 오래됐다 - 2018년)


ML workflow 란?

  • Kubeflow를 알기 위해서는 ML workflow를 이해할 필요가 있다. ML workflow는 머신러닝 알고리즘을 개발하고, 이를 통해 만든 서비스를 배포하기까지의 일련의 과정들을 모두 포함한다. (사실, 머신러닝 & 딥러닝을 구분해야하지만, 해당 글에서는 머신러닝으로 줄여서 이야기한다.)
  •  일반적으로 ML workflow는 다음과 같은 단계로 나뉜다. 
    1. 데이터 수집 : DB or Online 등에서 데이터를 수집한다.
    2. 데이터 검증 : 수집한 데이터를 검증한다.
    3. 데이터 전처리 : 수집한 데이터에서 노이즈 제거 & 결측치 대체 & 스케일링, Normalization & Augmentation 등을 수행한다.
    4. 모델 학습 : 머신러닝 알고리즘을 선택하고, 전처리된 데이터를 사용하여 모델을 학습한다. 
    5. 배포 : 모델을 실제 운영 환경에 배포하고 사용한다.

 

Kubeflow 란?

  • Kubeflow의 시작은 구글에서 머신러닝에 사용되는 리소스를 효율적으로 관리하기 위해, Tensorflow Extended(TFX)을 사용하면서 처음으로 시작되었다. 후에 여러 개발자들이 모여서, 오픈소스 프로젝트로 공개되었다. 
  • Kubeflow는 이름에서 알 수 있듯, Kubernetes에서 동작하는 ML 워크플로우 툴이다. Kubernetes는 머신러닝 Job에 굉장히 적합한 플랫폼인데, 이유는 다음과 같다.  
    • 머신러닝의 학습 및 배포에는 다른 서비스에 비해, 리소스 자원의 활용이 크다. 따라서, 리소스를 어떻게 잘 컨트롤하여, 학습하고 배포할 것인지가 중요하다. → Kubernetes의 유연성 컨트롤
    • 머신러닝 & 딥러닝은 환경 구축이 H/W나 OS, 라이브러리 버전 등에 따라 다 다르다. (머신러닝, 딥러닝 학습을 해본 사람들이면, 환경 구축에 정말 많은 시간이 소요된다는 것을 알 수 있을 것이다.) Kubernetes의 장점인 확장성 & 유연성
  • Kubeflow는 그 자체가 새로운 서비스라기보다는, Kubernetes 플랫폼 위에서 동작하기 위한, ML workflow에 필요한 여러 오픈소스 툴들을 모아놓은 것이다.
  • 내가 생각하는 Kubeflow의 가장 큰 장점은, 서비스 구성 및 엔지니어링등에 상대적으로 약한 AI researcher들의 부담을 줄여주는 것이라고 생각한다. (운영단에 제공하는 서비스가 아니라면, Kubeflow의 필요성은 조금 약하다고 생각한다. 다만, Kubernetes 환경에서 모델을 학습하는 경우에는 쓰지 않을 이유가 없다.)

 

Kubeflow의 구조

  • 아래 그림은 Kuberflow 홈페이지에 있는 Kuberflow 아키텍처에 대한 Conceptual Overview이다. 
  • 맨 아래, 어떤 플랫폼에서든 Kubernetes를 활용할 수 있다는 것을 강조하고, 그 위에 Kubeflow가 올라가 있다는 것을 보여준다.
  • 즉, Kubernetes 환경 위에서 여러 ML workflow component 들을 묶어서, Kubeflow로 제공해 주고, 그 위에 Pytorch나 Tensorflow등 다양한 언어를 활용해서 Kubeflow를 운영할 수 있다는 것을 강조하고 있다.
  • 그림의 우측에 Istio(트래픽 관리, 보안 등), Argo(워크플로우 관리), Prometheus(모니터링), Spartakus(사용자 데이터 수집) 등을 함께 활용하여, 운영 환경의 안정성을 높일 수 있다는 것을 보여준다.

Kubeflow 아키텍쳐 (출처 : https://www.kubeflow.org/docs/started/architecture/)

 
 

Kubeflow의 Component

  • Kubeflow는 여러 ML workflow 툴들의 집합이라고 위에서 소개했다. 어떤 것이 있는지 알아보자.
  • 우선, ML workflow를 크게 2개로 분류할 수 있다. 알맞는 모델을 찾기 위한 실험 단계와, 선택된 모델을 가지고 서비스를 운영하는 단계이다.
  • 실험 단계에서는 다음과 같은 Component 들을 제공한다.
    • Jupyter Notebook : Kubernetes 위에서 Jupyter Notebook을 사용해서, 모델을 개발 & 실험해볼 수 있게 해준다. 
    • Fairing : 모델의 생성 & 학습 & 배포등을 Kubernetes Cluster로 쉽게 요청할 수 있게 해준다. (즉, 모델을 Docker Image 형태로 Kubernetes에 뿌려준다.)
    • Katlib : 하이퍼파라미터 최적화 & 뉴럴 아키텍쳐 탐색을 지원함. (각기 다른, 하이퍼파라미터와 아키텍쳐를 설정해서, 원하는 결과가 나올때까지 실험해 볼 수 있음)
  • 운영 단계에서는 다음과 같은 Component들을 제한다.
    • Pipelines : ML workflow(수집 & 검증 & 전처리 & 학습 & 배포)를 end-to-end로 만들어 주는 툴 (Argo를 사용한다.)
    • Metadata : Kubeflow Pipelines에서 실행되는 ML workflow에 대한 metadata를 관리하는 서비스
    • KFServing : Kubernetes 위에서 머신러닝 서빙(Serving)을 위해 사용하는 툴
    • TensorRT : 미리 학습된 모델의 정확도를 유지하면서, Inference 속도를 최적화해주는 툴
    • Pytorch : 파이토치
    • TFServing : Tensorflow 모델의 서빙(Serving)을 위해 사용하는 툴
    • Seldon : 머신러닝 모델의 배포 및 관리를 위한 툴
    • Tensorboard : 머신러닝 모델 디버깅 & 시각화 툴

Kubeflow의 Component들 (출처: https://www.kubeflow.org/docs/started/architecture/)

 

Kubeflow의 UI

  • Kubeflow는 Command 명령어로 구동 가능하다. 하지만, Command 명령어로 Kubeflow 내에 있는 기능을 각각 사용할 것이라면, Kubeflow를 사용하는 의미(통합성 & 편의성 등...)가 덜하다고 생각한다.
  • Kubeflow의 UI는 편하면서, 불편하다. 메뉴에 있는 각 Component들을 각각 사용하기에는 편한데, 그 사이에 어떠한 연관성이 있는지 등등은 드러나지 않는다. (어느 메뉴들은 같이 사용해야하고, 어느 메뉴는 독립적이고...)
  • Kuberflow는 "Central Dashboard"라는 UI를 통해, 각 component를 쉽게 접근 할 수 있도록 해준다.  
    • Home: Home이다. 
    • Notebook Servers: Jupyter Notebook 서버를 사용할 수 있게 해준다. 
    • TensorBoards: Tensorboard를 쉽게 사용 할 수 있게해준다.
    • Models: 배포된 KFServing 모델들을 관리한다.
    • Volumes: Cluster의 저장소를 관리한다.
    • Experiments (AutoML): Katlib(하이퍼파라미터 튜닝 등)을 사용할 수 있게 해준다. 
    • Experiments (KFP): 실험용 Kuberflow Pipeline(KFP)을 사용할 수 있게 해준다. 
    • Pipelines: end-to-end Kuberflow Pipeline(KFP)을 사용할 수 있게 해준다. 
    • Runs: Kuberflow Pipeline(KFP)의 실행을 관리한다.
    • Recurring Runs: Kuberflow Pipeline(KFP)의 반복적 실행을 관리한다. 
    • Artifacts: Metadata를 확인 할 수 있게 해준다. 

Kubeflow Central Dashboard (출처 : https://www.kubeflow.org/docs/components/central-dash/overview/)

 


Kubeflow를 보면서, 느낀 것은 아직은 ML workflow의 end-to-end를 책임지기에는 역부족이지만, 앞으로 발전해 간다면 정말 유용하게 사용될 것 같다. 아무래도, 각 Component가 독립적으로 개발되어서, Component 간에 연결이 완벽하지 않다는 느낌을 자주 받았다. Component 간의 연결성이나, kubeflow 자체의 서비스 등을 제공한다면 더 좋을 것 같다. 우선, 다음 장부터 Kubeflow를 설치해 보기로 한다.  

반응형

Linear Regression

Linear Regression 모델은 매우 간단하고, 직관적이여서, 머신러닝하면 가장 대표적으로 생각나는 모델이다. 딥러닝 관련 책들에 항상 1장으로 등장했을만큼, 기초적이고 매우 중요하다.


Linear Regression 이란?

  • Linear Regression은 어떠한 독립 변수들과 종속 변수 간의 관계를 예측할때, 그 사이 관계를 선형 관계(1차 함수)로 가정하고, 모델링하는 지도 학습 알고리즘이다.
  • Linear Regression은 보통, 인자와 결과 간의 대략적인 관계 해석이나, 예측에 활용된다.
  • Linear Regression은 확률 변수를 수학적 함수의 결과인 변수(모델링 결과값)으로 연결해준다는데, 그 의미가 크다.
  • Linear Regression은 변수의 수에 따라, 다음과 같이 구분된다.
    • 변수 1개와 종속 변수 간의 선형 관계 모델링은 단순 선형 회귀 분석이라고 한다.
    • 독립 변수 여러 개와 종속 변수 간의 선형 관계 모델링은 다중 선형 회귀 분석이라고 한다.

→ 단순 선형 회귀 분석은 Visualization이 쉽고(2차원 공간에서 선형 함수로 표현 가능), 변수가 하나여서 이해가 쉽지만, 실생활에서의 문제들은 보통 다중 선형 회귀 문제인 경우가 많다.

Linear Regression 선형 관계식

y: 종속 변수, βk :회귀 계수, Xk:독립 변수, ε: 오차항(모델으로 설명할 수 없는 부분), X1까지만 존재하면, 단순 선형 회귀 분석

Linear Regression의 Residual(잔차)

  • 앞서 말한대로, Linear Regression에서 종속 변수는 관찰의 결과인 확률변수이기 때문에, 오차(error)를 포함한다.
  • 오차를 알기 위해서는, 모델링을 위한 인자와 종속 변수 간의 모든 경우의 수를 학습해야하지만, 현실적으로 불가능하다.
  • 따라서, Linear Regression에서는 오차를 사용하지 않고, 표본집단(학습데이터)으로 학습된 모델의 예측값과 실제 관측값 사이의 차이인 잔차(residual) 개념을 사용한다

  • .Linear Regression은 i.i.d 라는 가정을 따른다.
    • 정규성 가정 : 잔차는 정규 분포를 따른다고 가정한다. 잔차가 정규 분포를 따르지 않고, 특정한 분포를 따른다면, 회귀 모델의 예측값을 신뢰하기 어렵다.
      • 확인 방법 : 잔차 분포도 Visualization 확인, 잔차 정규성 검정
    • 등분산성 가정 : 잔차의 분산은 일정하다.
      • 확인 방법 : 잔차-예측값 산포도 확인,
    • 독립성 가정 : 모든 잔차들은 서로 독립적이다. 만약, 잔차 간의 상관 관계가 있다면, 추정된 회귀식에서 설명하지 못하는 다른 어떠한 관계가 존재할 수 있다.
      • 확인 방법 : 잔차의 자기상관 함수 확인

Linear Regression의 학습

  • Linear Regression의 학습 목적은 종속 변수와 설명 변수 간의 관계를 가장 잘 나타낼 수 있는 선형식을 모델링하는 것이다.
  • Linear Regression의 모델 추정을 위해서, 보통 예측값과 실제관측값인 잔차의 제곱을 최소화하는 최소제곱법(OLS)을 사용한다.

최소 제곱법 식

y_i : i번째 데이터의 실제 종속 변수 값, ŷ_i 데이터의 예측값

 

  • 최소제곱법을 활용하는 이유는 다음과 같다.
    • 잔차의 제곱은 항상 양수이기 때문에
    • 잔차의 제곱은  큰 오차를 더욱 강조가 가능하기 때문에
    • 잔차의 제곱은 미분이 가능하기 때문
  • 단순 선형 회귀 분석에서는 최소제곱법을 이용하여, 회귀계수를 다음과 같이 추정할 수 있다. 

  • 다중 선형 회귀 분석에서는 최소제곱법을 이용하여, 회귀 계수 행렬을 다음과 같이 추정할 수 있다.

다중 선형 회귀 분석

 

Linear Regression의 평가

 

  • Linear Regression을 평가하기 위해서, 결정 계수(coefficient of determination) 개념을 활용한다. 
  • 결정 계수는 회귀 분석에서 모델이 얼마나, 실제 데이터를 잘 예측하는지를 나타내는 지표이다. 
  • 결정 계수를 구하기 위해서, 세가지 값의 의미 알아야한다.
    • SST (Total Sum of Squares): 종속 변수 y와 그 평균값 ȳ 간의 차이를 제곱하여 모두 더한 값
    • SSR (Residual Sum of Squares) : 종속변수 y에서 모델 추정값 간 차이를 제곱하여 모두 더한 . (잔차의 총합)

  • 결정 계수는 SST와 SSR을 통해 아래와 같은 식으로 구한다.

  • 결정 계수는 전체 오류(분산 개념) 중, 모델로 설명 가능한 오류의 범위의 비중을 뺀 비중으로, 1에 가까울수룩 일반적으로 예측력이 좋다고 해석한다. 
  • 결정 계수가 대략적인 모델의 적합성을 파악할 수 있지만, 절대적인 지표는 아니다. 

Linear Regression의 Python 구현

  • Linear Regression은 scikit-learn의 linear_model의 LinearRegression을 통해 쉽게 사용 가능하다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression


if __name__ == '__main__':
    
    # 테스트용 데이터 생성
    x = np.random.rand(1000)*100
    y = 0.8*x+np.random.randn(1000)*30

    # Linear Regrssion model 생성
    model = LinearRegression() 
    
    # Linear Regression model 학습
    model.fit(x.reshape(-1,1), y) 
    
    # Prediction
    y_new = model.predict(np.array([6]).reshape((-1, 1))) 
    print("Data Prediction: ", y_new)
    
    # Linear Regression model 평가
    r_sq = model.score(x.reshape(-1,1), y)  
    print("결정 계수: ", r_sq)
    
    # Linear Model 식 
    b0,b1 = model.intercept_, model.coef_[0]   
    print("b0",b0)
    print("b1",b1)

    # 시각화
    plt.scatter(x, y, s=5)
    plt.plot(x, model.predict(x.reshape(-1,1)), color='red', linewidth=2)
    plt.annotate('y = '+str(round(b1,2))+'x '+str(round(b0,2)), xy=(100, 100), xytext=(80, 80))
    plt.show()
반응형

이상치 제거는 데이터 분석에서 매우 중요하다. 특히, 요즘에는 어떤 모델을 사용하나 보다, 어떤 데이터로 학습할지가 모델 성능에 더 중요한 요소가 된 만큼, 이상치 제거는 그 중요성이 더욱 커졌다. 이상치 제거 방법은 정말 많지만, 자주 사용하는 몇 가지 방법을 알아보기로 한다.


이상치(Outlier) 란?

  • 이상치란 일반적인 데이터 분포를 따르지 않는 값으로, 다른 데이터와 차이가 매우 큰 값을 가진 데이터 포인트를 의미한다. 
  • 이상치가 생기는 요인은 데이터 수집 과정에서 오류가 발생하거나, 데이터 자체가 이상치를 포함하고 있는 경우, 변경점 발생으로 인한 데이터 분포 변화 등이 존재한다.
  • 이상치는 상대적인 개념이다. 즉, 어떤 데이터를 어떻게 분석하고, 어느 기준으로 이상치를 판별할 것이냐에 따라, 이상치 데이터들이 달라진다.

이상치(Outlier) 제거 방법

1. 사분위수(Quartiles) 방법

  • 사분위수 방법은 데이터분포와 값의 크기를 이용하여, 대략적인 이상치 구간을 설정해주는 방법이다.
  • 간단하고, 직관적이여서, 이상치 제거에서 많이 활용된다.
  • 통계적인 값을 기반으로 해서, 1D 데이터에서도 쉽게 활용 가능하다. 
  • 방법은 다음과 같다. 
    • 데이터를 값 기준으로 정렬한 후, 데이터의 분포에 따라 4등분하여, 각 부분의 값을 각각 1사분위, 2사분위, 3사분위, 4사분위로 나타낸다. (하위 0~25%, 25~50%, 50~75%, 75~100%)
    • 1사분위 수(값 기준 하위 25%되는 값)와 3사분위 수(값 기준 상위 25%되는 값)을 찾는다.
    • 3사분위 수와 1사분위 수의 차로 IQR(Interquartile Range)을 구한다. 
    • 일반적으로 1사분위 수와 3사분위 수에서 IQR의 특정 배수(일반적으로 1.5) 이상 벗어난 값들을 이상치로 판정하고 제거해준다.

  • 파이썬 코드 구현
import numpy as np

def outlier_remove(data, threshold=1.5):
	q1, q3 = np.percentile(data, [25, 75]) # 1사분위수, 3사분위수 계산
	IQR = q3 - q1 # IQR 계산

	lower_bound = q1 - (threshold * IQR) # Outlier 판단 Lower Bound 계산
	upper_bound = q3 + (threshold * IQR)  #Outlier 판단 Upper Bound 계산
    
	filtered_data = [x for x in data if x >= lower_bound and x <= upper_bound]
	outlier = [x for x in data if x not in filtered_data]
    
	return filtered_data, outlier, q1, q3, iqr, lower_bound, upper_bound

if __name__ =='__main__':
	X = np.random.normal(0, 1000, 1000)
	filtered_data, outlier, q1, q3, IQR, lower_bound, upper_bound = outlier_remove(X)

 
2. Z-score 방법

  • Z-score 방법은 데이터의 평균과 표준편차를 이용해, 이상치를 제거하는 방법이다. 
  • Z-score 방법은 데이터의 분포가 정규분포를 따른다는 가정이 필요하다. 
  • 통계적인 값을 기반으로 해서, 1D 데이터에서도 쉽게 활용 가능하다.
  • 방법은 다음과 같다.
    • 데이터 포인트들의 평균과 표준편차를 구한다.
    • 각 데이터 포인트의 Z-score (Z = |x - μ|/ σ)를 구한다. Z-score는 데이터 포인트가 평균과의 거리가 몇 sigma 범위에 있는지를 의미한다.
    • Z-score가 특정 threshold(일반적으로 3) 이상인 값들은 이상치로 판정하고, 제거해준다.

  • 파이썬 코드 구현
import numpy as np

def outlier_remove(data, threshold=3):
    z_scores = np.abs(data - np.mean(data)) / np.std(data) # Z-score 계산
    
    filtered_data = data[z_scores < threshold]
    outlier = data[z_scores>threshold]
    
    return filtered_data, outlier

if __name__ == '__main__':
    X = np.random.normal(0, 1000, 1000)
    filtered_data, outlier = outlier_remove(X)

 

반응형

Hierarchical Clustering

Hierarchical Clustering은 사실, 데이터 분석 및 알고리즘에서 많이 사용해보지 않은 알고리즘이다. Hierarchical Clustering의 원리와 특징등을 조금 더 공부해보고 싶었다.


Hierarchical Clustering 이란?

  • Hierarchical Clustering (계층적 군집화)는 데이터 포인트들을 거리나 유사도 기반으로 계층적으로 묶어나가는 군집화의 방법이다. 
  • Hierarchical Clustering의 결과는 보통 Dendrogram 형태로 표현하여 쉽게 확인 가능하다.
  • Hierarchical Clustering은 계층의 구조를 시각적으로 파악 가능하여, 크지 않은 데이터셋들의 구조 분석이나 증빙, 이상치를 정의하는 일등에 활용된다.  

Hierarchical Clustering

Hierarchical Clustering의 특징

장점

  1. Hierarchical Clustering에서의 Cluster의 개수는 계층 구조를 보고, 조정 가능하기 때문에, 유연성이 높다. (미리 Cluster 개수를 정해놓을 필요가 없음)
  2. Hierarchical Clustering은 Clustering된 과정과 결과를 한눈에 확인 가능하기 때문에, 각 Cluster의 크기와 Cluster 간의 관계를 파악 가능하다. (Cluster 간 비교 분석에 용이)
  3. Hierarchical Clustering 수행 시, 이상치는 다른 Cluster와 계층적으로 별도 분리되어 있을 가능성이 크기 때문에, 이상치 제거에 활용 가능하다.

단점

  1. Hierarchical Clustering의 계산 복잡도가 큰 편이다. 특히, 모든 데이터셋 간의 거리를 비교해야하기 때문에, 데이터셋의 크기가 클수록 계산복잡도가 늘어난다. (일반적으로 O(N³))
  2. Hierarchical Clustering은 데이터 포인트 전체를 고려하기 때문에, 데이터의 삭제나 추가, 변경에 대해 민감하다.
일반적으로, Hierarchical Clustering은 연산 시간이 크다는 단점을 가지고 있어서, 대용량 데이터의 분석에 그대로 적용하는데는 한계가 있다. 하지만, 계층 시각화 및 군집 간 관계 파악등이 가능하기 때문에, 초기 데이터 분석 시, 적은 양의 데이터로 사용하기 좋은 기법이다. 

 

Hierarchical Clustering 알고리즘

Hierarchical Clustering은 각 데이터 포인트 간의 거리나 유사도를 계산하여, 작은 단위부터의 Clustering을 진행하면서, 전체 데이터 포인트가 하나의 Cluster를 구성할 때까지 Clustering을 반복적으로 진행하는 방식을 사용한다.

 

1. 각 데이터 포인트를 개별 Cluster로 고려

  • 총 데이터가 N개 존재한다고 할 때, 각 포인트 1개씩을 가지고 있는 N개 Cluster를 형성한다.

2. Cluster 간 Distance Matrix를 계산

  • 각 Cluster 간 거리 or 유사도를 계산한다. Cluster 간의 거리나 유사도를 계산하는 방법은 많지만, 보통 Euclidean Distance를 사용한다.
  • N개 Cluster가 서로 간의 Distaince를 계산하기 때문에, distance matrix를 구하기 위해 N(N-1)/2번 최소 연산이 필요하다.

3. 가장 비슷한 2개의 Cluster를 하나의 Cluster로 Merge

  • 앞서 구한, Distance Matrix를 기반으로 가장 유사한 or 거리가 가까운 Cluster들을 하나의 Cluster로 연결한다. 즉, 가장 가까운 거리에 있는 두 데이터 포인트를 묶어서 Cluster를 형성한다.
  • N개 Cluster에서 N-1개 Cluster가 된다. 

4. 변경된 Cluster를 고려한 Distance Matrix 재계산 

  • 새로운 Cluster가 생성되었기 때문에, Distance Matrix의 업데이트가 필요하다.
  • 새로 구성된 Cluster는 2개의 데이터 포인트를 가지고 있기 때문에,  Distance Matrix를 어떻게 구할 것인지 정의가 필요하다.
  • Distance Matrix를 구하는 방법은 아래와 같다.
    •  Single Linkage : 새로운 Cluster와 나머지 Cluster 간 거리는 한 Cluster 내의 데이터 포인트 들과 다른 Cluster 내의 데이터 포인트 들 사이 거리 중 가장 가까운 거리로 정의
    • Complete Linkage : 새로운 Cluster와 나머지 Cluster 간 거리는 한 Cluster 내의 데이터 포인트 들과 다른 Cluster 내의 데이터 포인트 들 사이 거리 중 가장 먼 거리로 정의
    • Average Linkage : 새로운 Cluster와 나머지 Cluster 간 거리는 한 Cluster 내의 데이터 포인트 들과 다른 Cluster 내의 데이터 포인트 들 사이 거리들의 평균으로 정의
    • Ward's Method : Cluster 내 데이터 포인트의 평균으로 중심점을 구하고, 각 Cluster의 중심점 기준으로 distance를 구함. 두 Cluster를 합친 후, 새로운 Cluster 내의 SSW(Sum of Squares Within)가 최소화되도록, 거리를 계산함. (d_i, d_j : Cluster 중심 점과 각 데이터 포인트 간 거리의 합, n_i, n_j : Cluster 데이터 포인트 갯수, p: 전체 데이터 갯수, d_ij: Cluster i와 j 사이 거리)

Ward's Method 거리 계산 식

5. 3~4 단계를 Cluster가 1개로 합쳐질 때까지 반복

  • Cluster Merge와 distance matrix 계산을 N-1번 반복하면, Cluster는 1개만 남는다.

6. Dendrogram 시각화

  •  각 Cluster Merge 단계들을 Dendrogram으로 나타내서, 계층 구조를 확인한다.

Hierarchical Clustering Python 구현

 

  • 단순 Clustering 결과를 보기 위해서는 scikit-learn의 "AgglomerativeClustering"를 사용하면 쉽게 사용 가능하다.
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs

if __name__ == '__main__':
    X, y = make_blobs(n_samples=20, centers=2, random_state=10, cluster_std=2)

    model = AgglomerativeClustering(linkage='average')
    model.fit(X) # 데이터 Training
    model.fit_predict(X) # 데이터 Predict

    model.labels_ # Training sample 할당된 Cluster Label 표시
    model.n_leaves_ # 계층 Cluster leaf node 수
  • AgglomerativeClustering의 매개변수는 다음과 같다.
    • n_clusters : cluster 갯수 지정, (미지정 시, 적당한 Cluster 개수로 나눠줌)
    • linkage : cluster 간 distance 연산에 사용하는 방법 ('ward', 'single', 'complete', 'average' 선택 가능, default는 'ward')
    • affinity :  cluster 간 distance 연산에 사용하는 식 ('euclidean','manhattan', 'cosine', 'precomputed' 선택 가능, default는 'euclidean')
  • Dendrogram을 보기 위해서는 scikit-learn의 pdist와 linkage, dendrogram을 사용해야 한다.
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, dendrogram

if __name__ == '__main__':
    X, y = make_blobs(n_samples=20, centers=2, random_state=10, cluster_std=2)
    distance_matrix = pdist(X) # distance matrix 계산
    linkage_matrix = linkage(distance_matrix, method='single') # linkage 단계를 matrix화 함

    dendrogram(linkage_matrix)
  • pdist는 distance matrix를 1D 형식으로 구하는 함수로 자기 자신과 중복을 제거한 N(N-1)/2 개의 값이 나온다. (만약 matrix의 각 데이터 포인트 값을 알고 싶다면, cdist를 사용하면 된다. 다만, linkage 인자는 cdist를 넣어줘야 한다.)
  • pidst 함수에서 'metric' 매개변수로 distance 계산 방식을 바꿔줄 수 있다.
  • linkage 함수에서 'method' 매개변수로 cluster 간 거리 측정 방식을 바꿔줄 수 있다. ('single', 'complete', 'average', 'ward')
  • likage matrix는 N X 4의 matrix로 표시되고, 각 칼럼은 다음과 같은 의미를 가지고 있다.
    • 1 열: 첫 번째 Cluster 번호 
    • 2 열: 두 번째 Cluster 번호 
    • 3 열: 두 Cluster 합쳤을 때의 거리 or 유사도
    • 4 열: 새로운 Cluster 구성하는 데이터 포인트의 개수

+ Recent posts