logo

[머신러닝] 군집화

 

비지도 학습

비지도 학습(Unsupervised Learning)은 기계학습의 주요한 범주 중 하나로, 데이터의 숨겨진 패턴이나 구조를 찾는데 중점을 둡니다. 이러한 학습 방법에서는, 데이터 샘플에 대한 명시적인 정답(레이블)이 없습니다. 대신, 모델은 데이터 내의 관계를 스스로 탐색하고 이를 통해 유용한 정보를 추출하게 됩니다. 비지도 학습의 목적은 데이터를 분류, 요약, 감소 등 다양한 방법으로 해석하여 유의미한 인사이트를 제공하는 것입니다.

 

핵심 개념

데이터 구조 파악

비지도 학습의 핵심 목적 중 하나는 데이터가 가진 내재적 구조나 패턴을 발견하는 것입니다. 이는 데이터 내 변수들 간의 관계를 이해하거나, 유사한 데이터 포인트를 그룹화하여 데이터의 구조를 파악하는 과정을 포함합니다.

자동 분류

레이블이나 지도가 없는 상태에서 데이터 샘플들을 자동으로 분류하는 것입니다. 이 과정에서 데이터 샘플들이 하나 이상의 그룹(클러스터)으로 나뉘게 되며, 이는 군집화(Clustering) 알고리즘으로 수행됩니다.

 

주요 알고리즘

  • 군집화(Clustering): 데이터 포인트를 비슷한 특성을 가진 여러 그룹으로 나누는 기술입니다. 예를 들어, K-평균(K-Means) 알고리즘은 데이터 포인트들을 K개의 클러스터로 나누며, 각 클러스터의 중심을 찾아나갑니다.

  • 차원 축소(Dimensionality Reduction): 고차원의 데이터를 저차원의 데이터로 변환하여 시각화 하거나 계산 복잡성을 감소시키는 기법입니다. PCA(Principal Component Analysis)와 같은 기법이 이에 해당됩니다.

  • 연관 규칙 학습(Association Rule Learning): 대규모 데이터베이스 내에서 항목 간의 흥미로운 연관성이나 빈번하게 등장하는 패턴을 찾는 방법입니다. 이는 마케팅, 상품 배치 등 다양한 분야에 활용됩니다.

 

예시: K-평균 군집화를 사용한 데이터 분류

K-평균(K-means) 군집화는 비지도 학습에서 가장 널리 사용되는 알고리즘 중 하나입니다. 이 알고리즘은 데이터 포인트들을 K개의 클러스터로 나누는 것을 목표로 합니다. 여기서, K는 사용자가 지정하는 클러스터의 수입니다.

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

# 임의의 데이터 생성
X = np.array([[1, 2], [1.5, 1.8], [5, 8],
             [8, 8], [1, 0.6], [9, 11]])

# KMeans 모델 생성 및 훈련
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

# 클러스터 중심과 레이블 가져오기
centroids = kmeans.cluster_centers_
labels = kmeans.labels_

# 결과 시각화
colors = ["g.", "r."]

for i in range(len(X)):
    plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)

plt.scatter(centroids[:, 0], centroids[:, 1], marker = "x", s=150)
plt.show()

위 코드는 임의의 데이터 포인트에 대하여 K-평균 알고리즘을 적용하여 데이터를 두 클러스터로 구분하고, 이를 시각화하는 예시입니다. 결과적으로, 각 데이터 포인트는 가장 가까운 클러스터의 중심에 할당됩니다.

비지도 학습은 방대하고 복잡한 데이터 세트로부터 의미있는 정보를 추출할 수 있는 강력한 도구입니다. 데이터의 숨겨진 구조를 파악하거나, 새로운 패턴을 발견하는 데 있어 그 가치가 매우 높습니다.


군집화(Clustering)는 데이터 분석과 머신러닝의 핵심적인 방법 중 하나입니다. 그 이유는 레이블이 지정되지 않은 데이터에서 유용한 패턴이나 구조를 찾는데 있어 매우 유용하기 때문입니다. 군집화를 통해 우리는 데이터를 자연스럽게 구분되는 그룹으로 나눌 수 있으며, 각 그룹은 공통된 특성을 공유합니다. 이 과정을 통해 우리는 복잡한 데이터 세트의 구조를 이해하고, 유사한 데이터 항목을 식별할 수 있습니다.

 

군집화의 목적

군집화는 여러 목적을 가집니다. 첫 번째로, 간단한 시각화나 데이터의 구조 파악을 통해 데이터를 보다 쉽게 이해할 수 있도록 합니다. 예를 들어 고객 데이터에 군집화를 적용하면 유사한 소비 성향이나 선호도를 가진 고객 그룹을 식별할 수 있습니다.

두 번째 목적은 유사한 데이터 항목을 그룹화하는 것입니다. 이는 이후의 분석 단계에서 특정 그룹에 대한 분석을 진행하거나, 그룹별 특성을 바탕으로 사용자 맞춤형 서비스를 제공하는 등의 응용에 활용될 수 있습니다.

 

군집화의 종류

군집화 알고리즘은 크게 세 가지 주요 방식으로 분류할 수 있습니다.

  1. 분할 방식: 가장 대표적인 예시는 K-평균(K-means) 알고리즘이 있습니다. 이 방법은 데이터 포인트들을 K개의 클러스터로 나누며, 각 클러스터 내의 데이터 포인트들은 클러스터 중심으로부터 가능한 가까이 위치하도록 합니다. K값(클러스터의 수)는 사용자가 사전에 정해주어야 합니다.

  2. 계층 방식: 계층적 군집화(Hierarchical clustering)는 각 데이터 포인트를 개별 클러스터로 간주하고 시작하여, 가장 가까운 클러스터 또는 가장 멀리 떨어진 클러스터를 합치는 방식으로 계속해서 클러스터를 합쳐나가는 방법입니다. 이 방식은 '덴드로그램'이라고 불리는 트리 모양의 구조로 결과를 나타낼 수 있으며, 이를 통해 클러스터 간의 관계를 명확하게 이해할 수 있습니다.

  3. 밀도 기반: DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 알고리즘은 밀도 기반으로 클러스터를 형성하는 대표적인 방법입니다. 이 방법은 데이터 포인트가 밀집되어 있는 '밀집 지역'을 클러스터로 간주하며, 밀집 지역의 경계에 위치한 데이터 포인트들은 클러스터에 포함시키지 않아 '잡음'으로 간주합니다. DBSCAN은 불규칙한 형태의 데이터와 잡음이 섞인 데이터에 대해 효과적으로 클러스터링할 수 있는 장점이 있습니다.

이와 같이 군집화 작업은 다양한 방법으로 수행될 수 있으며, 각 방법은 데이터의 유형, 분석의 목적, 그리고 사용자의 요구에 따라 적합한 방법이 선택됩니다. 이를 통해 군집화는 머신러닝과 데이터 분석의 중요한 도구로서 다양한 적용 분야에서 활용됩니다.


 

K-평균 군집화

K-평균 군집화는 가장 기본적이면서도 널리 사용되는 군집화 기법 중 하나입니다. 데이터 포인트들을 미리 정의된 군집의 수(K)만큼 그룹화하는 방식으로 작동합니다. 이는 비지도 학습의 한 형태로, 레이블이 지정되지 않은 데이터에 적용할 수 있습니다.

 

K-평균의 작동 방식

K-평균 군집화의 작업 과정은 다음과 같습니다:

  1. 초기 중심(centroid) 설정: 처음에는 K개의 중심이 임의로 또는 특정 규칙에 따라 데이터 공간 내에 배치됩니다.
  2. 각 데이터 포인트를 가장 가까운 중심에 할당: 모든 데이터 포인트에 대해, 각 포인트와 K개의 중심 간의 거리를 계산하고, 각 데이터 포인트를 가장 가까운 중심에 할당합니다.
  3. 할당된 포인트들의 평균을 계산하여 새로운 중심으로 설정: 각 군집 내에 포함된 포인트들의 평균 위치를 찾아서 새로운 군집의 중심으로 합니다.
  4. 중심에 변화가 없을 때까지 반복: 군집의 중심이 더 이상 변하지 않을 때까지 2단계와 3단계를 반복합니다.

이 과정을 수학적으로 표현하면, k-평균 군집화는 군집 내 분산을 최소화하는 문제로 정의됩니다. 즉, 각 군집의 중심과 군집 내 데이터 포인트 간 거리의 제곱합을 최소화하는 것입니다.

 

Python 코드 예시

Python에서 K-평균 군집화를 구현하는 간단한 예시는 다음과 같습니다:

from sklearn.cluster import KMeans
import numpy as np

# 샘플 데이터 생성
X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

# KMeans 인스턴스 생성 및 fitting
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

# 군집 중심의 좌표
print(kmeans.cluster_centers_)

# 각 데이터 포인트의 군집 인덱스
print(kmeans.labels_)
 

K-평균의 장단점

K-평균 군집화는 그 구현의 단순함으로 인해 매우 인기가 있지만, 몇 가지 한계 또한 지니고 있습니다:

  • 장점:

    • 알고리즘이 이해하기 쉬우며 구현하기 간단합니다.
    • 큰 데이터 세트에 효율적으로 적용할 수 있습니다.
  • 단점:

    • 군집의 수(K)를 사전에 결정해야 합니다. 이는 문제에 따라 최적의 K값을 찾기 위한 추가 실험이 필요할 수 있습니다.
    • 군집의 모양이 원형이 아닐 경우, 즉 군집이 선형으로 구분되지 않는 경우 성능이 좋지 않을 수 있습니다.
    • 이상치에 매우 민감할 수 있습니다.

K-평균 군집화는 다양한 분야에서 폭넓게 활용되고 있으며, 이를 통해 유용한 인사이트를 도출할 수 있습니다. 그러나 군집화 작업을 진행하기 전에 데이터의 특성과 요구사항을 고려하여 올바른 파라미터 설정과 사전 처리를 수행하는 것이 중요합니다.


계층적 군집화는 데이터의 유사성에 기반하여 만들어내는 군집의 나무 구조 또는 계층 구조를 말합니다. 이 방법은 데이터 간의 유사성만을 바탕으로 군집을 형성하므로, 머신러닝의 비지도 학습 방법론에 속합니다.

 

계층적 군집화의 종류

계층적 군집화에는 대표적으로 두 가지 접근 방식이 있습니다.

 

병합 방식(Agglomerative Approach)

병합 방식의 계층적 군집화는 '바닥-위로(bottom-up)' 접근 방식을 사용합니다. 이 방식은 처음에 각 데이터 포인트를 하나의 클러스터로 간주하고 시작합니다. 그 다음, 가장 가까운 두 클러스터를 하나로 합치는 과정을 반복하여 최종적으로 단 하나의 클러스터가 남을 때까지 진행합니다. 이러한 방식으로 데이터 사이의 유사성을 기반으로 점차적으로 큰 클러스터를 형성해 갑니다.

 

분할 방식(Divisive Approach)

분할 방식은 '위-아래(top-down)' 접근 방식을 취합니다. 전체 데이터 집합을 시작 포인트로 삼고, 이를 점차적으로 작은 클러스터로 분리해 나갑니다. 가장 큰 차이점은 분할 방식이 초기에 전체 데이터 집합을 하나의 클러스터로 간주한다는 점입니다. 이 클러스터를 더 작은 클러스터로 분리하는 기준으로는 클러스터 내 데이터 포인트들의 불일치 또는 거리가 멀어지는 지점을 사용합니다.

 

계층적 군집화의 특징

계층적 군집화는 몇 가지 뚜렷한 특성을 지닙니다.

  • 군집 수의 결정이 필요 없음: 다른 군집화 방법론과 달리 계층적 군집화는 미리 군집 수를 정할 필요가 없습니다. 덴드로그램을 분석하여 적절한 군집 수를 결정할 수 있습니다.
  • 덴드로그램 시각화: 덴드로그램은 계층적 군집화 과정을 나무 모양의 다이어그램으로 시각화하여 제공합니다. 이는 각 단계에서의 클러스터 합쳐짐의 연결성을 보여주며, 데이터 간의 관계와 구조를 이해하는 데 매우 유용합니다.
  • 유연성: 계층적 군집화는 다양한 유형의 데이터와 유사성(거리) 측정 방법에 적용할 수 있어 유연합니다.
 

Python 코드 예시

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs

# 임의의 데이터 생성
X, y = make_blobs(n_samples=50, centers=3, cluster_std=0.60, random_state=0)

# 병합 방식 계층적 군집화 수행
linked = linkage(X, 'single')

# 덴드로그램 그리기
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.show()

이 코드는 임의로 생성한 데이터에 대해 병합 방식의 계층적 군집화를 수행하고, 그 결과를 덴드로그램으로 시각화한 예제입니다. 여기서 linkage 함수의 'single' 매개변수는 가장 가까운 데이터 포인트 사이의 거리를 기준으로 클러스터를 합치는 방식을 의미합니다.


 

DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)은 밀도에 기반하여 공간 상의 샘플을 군집화하는 알고리즘입니다. 이 알고리즘은 밀도가 높은 영역을 군집으로 식별하고, 밀도가 낮은 영역을 이상치로 분류합니다.

 

DBSCAN의 작동 원리

DBSCAN 알고리즘의 작동 방식은 매우 직관적입니다. 알고리즘은 두 개의 매개변수, 즉 eps (ε)와 minPts를 사용합니다. 여기에서 eps는 한 포인트에서 다른 포인트까지의 최대 거리를 의미하고, minPts는 핵심 포인트가 되기 위해 필요한 최소 이웃 포인트의 수를 의미합니다.

  • 핵심 포인트(Core Point): 주어진 포인트에서 eps 거리 내에 최소 minPts 수의 포인트가 존재하면 해당 포인트를 핵심 포인트로 간주합니다.
  • 경계 포인트(Border Point): 핵심 포인트에서 eps 거리 내에 있지만, 스스로는 핵심 포인트가 아닌 포인트입니다.
  • 잡음 포인트(Noise Point): 핵심 포인트도, 경계 포인트도 아닌 모든 포인트입니다. 이들은 어떤 군집에도 속하지 않으며 이상치로 간주됩니다.

밀도 가능 영역(Density-Reachable Area)

한 포인트가 다른 포인트에서 eps 거리 안에 있으면, 이 두 포인트는 서로 '밀도 가능'하다고 합니다.

밀도 접근 가능 영역(Density-Accessible Area)

하나의 포인트에서 시작하여 연쇄적으로 '밀도 가능'한 포인트들을 통해 도달할 수 있는 영역입니다.

 

DBSCAN의 장점

  • 임의의 모양의 군집에 효과적: 밀도에 기반한 접근 방식은 선형, 원형, 복잡한 형태 등 어떠한 형태의 군집도 잘 식별할 수 있습니다.
  • 이상치에 강함: 주변 포인트의 밀도를 기반으로 군집을 형성하기 때문에, 소수 포인트나 잡음 포인트의 영향을 덜 받습니다.
  • 군집의 수를 미리 지정할 필요 없음: DBSCAN은 데이터로부터 직접 군집의 개수를 결정합니다. 이는 다른 군집화 알고리즘, 예를 들어 K-평균에서 요구하는 군집의 수를 사전에 지정해야 하는 필요성과 대비됩니다.
 

Python 코드 예시

DBSCAN 알고리즘을 사용한 간단한 예시는 다음과 같습니다. 이 예제는 scikit-learn 라이브러리를 사용합니다.

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

# 임의의 데이터 생성
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)

# DBSCAN 모델 생성 및 학습
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(X)

# 군집 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_, cmap='viridis')
plt.title("DBSCAN Clustering")
plt.show()

이 코드는 월 모양의 데이터 세트를 생성하고 DBSCAN 알고리즘을 활용하여 군집화한 다음, 결과를 시각화합니다. 이 예시에서 볼 수 있듯이, DBSCAN은 복잡한 형태의 데이터에서도 효과적으로 군집을 형성할 수 있습니다.

Previous
하이퍼파라미터 튜닝