co-code 님의 블로그

군집 분석 본문

python

군집 분석

co-code 2026. 5. 19. 20:00
  • K - Means ( 평균을 이용한 군집화 )
    • k개의 자동 분류하는 비지도 학습 알고리즘
    • 종속 변수가 존재하지 않는 데이터에서 유사한 데이터끼리 모음
    • 서로 가까운 데이터는 같은 그룹으로 묶어서 그룹화
    • 그룹의 중심점을 반복적으로 계산(중심점의 이동)하여 군집을 형성
    • 작업 순서
      1. 초기의 중심점(k개)을 선택
      2. 각각의 데이터들을 중심점과의 거리를 확인
      3. 가까운 거리를 중심점으로 할당
      4. 각 군집의 평균을 구해서 새로운 중심점을 설정
      5. 중심점의 변화가 거의 없을 때까지 반복 실행
    • 장점 : 빠르고 단순하여 대용량의 데이터에서 적합
    • 단점
      • 군집의 수를 미리 알고 작성해야 함
      • 이상치에 굉장히 민감함
    • parameter
      • n_clusters
        • 기본값 : 0
        • 군집의 개수를 지정
        • 너무 작거나 큰 경우에는 성능 저하
      • init
        • 기본값 : 'K-Means++'
        • 초기의 중심점을 설정하는 방법
        • 기본값을 사용하면 빠르고 안정적
        • 'random' : 무작위하게 중심점을 생성
      • n_init
        • 기본값 : 'auto' (구버전은 10)
        • 초기화 횟수
        • 초기화하여 여러번의 시도들 중에 최적의 결과를 만드는 방법
      • max_iter
        • 기본값 :300
        • 한번의 실행에서 최대의 반복 횟수
      • tol
        • 기본값 : 1e-4
        • 중심점의 이동의 변화량이 기본값보다 작은 경우에는 수렴
      • algorithm
        • 기본값 : 'lloyd'
        • 'elkan' : 속도 향상 (밀집 데이터에서 유리)
    • 속성
      • cluster_center_ : 각 군집의 중심점 좌표
      • labels_ : 각 데이터의 군집의 번호
      • inertia_
        • 군집 내의 거리 제곱합
        • 작을수록 군집이 응집되어 있음
      • n_iter_ : 마지막 반복에서의 수행 횟수 (중심점 이동 횟수)
    • 메서드
      • fitX) : 모델의 학습
      • predict() : 새로은 데이터를 이용하여 군집화 예측
      • fit_predict()
      • transform() : 각 데이터와 각 중심점 간의 거리를 행렬로 변환하여 출력
      • fit_transform() 
      • score() : inertia의 값을 반환
      • get_params()  vs  set_params()
    • 검증 방법
      • inertia_ : 군집 내의 거리 제곱합 (작을수록 응집되어 있음)
      • silhouette_ : 응집도 + 분리도 종합 점수 (1에 가까울수록 좋음)
      • calinski_Harabasz_score : '군집 간의 분산 / 군집 내의 분산' 의 비율 (높을수록 좋음)
      • davies_Bouldin_score : 군집 간의 유사도 평균 (낮을수록 좋음)
      • adjusted_rand_score : 실제의 라벨과 군집과의 일치도 ( 1 = 일치, 0 = 불일치)
  • DBSCAN(밀도 기반 군집 분석)
    • 밀도 기반의 클러스터링 알고리즘으로 데이터의 밀도를 이용하여 군집을 생성
    • 데이터가 빽빽한(고밀도) 지역은 하나의 군집으로 생성을 하고 데이터가 드문(저밀도) 지역은 노이즈(이상치)로 판단
    • KMeans와는 다르게 군집의 개수를 지정할 필요가 없다.
    • 비선형 구조의 데이터에서도 군집 형성이 가능 (원형, 나선형의 구조 데이터에서 패턴 분석이 가능)
    • 노이즈를 판단함으로써 이상치에 대한 자동 감지
    • 스케일링은 일반적으로 사용 (Standard, Min-Max)
    • parameter
      • eps
        • 기본값 : 0.5
        • 두 개의 샘플이 같은 군집으로 간주되기 위한 최대의 거리 (반경)
        • 스케일링이 된 데이터를 기준으로 한다면 eps는 최대 2 정도로 설정
        • 스케일링이 되지 않은 데이터를 기준으로 한다면 eps는 feature안의 데이터의 범위에 따라 값이 변한다.
      • min_samples
        • 기본값 : 5
        • 핵심점(core point)으로 판단하기 위한 샘플의 개수
      • metric
        • 기본값 : 'euclidean'
        • 거리 계산 방식
      • algorithm
        • 기본값 : 'auto'
        • 이웃 탐색 알고리즘
        • 'auto' : 자동 선택, 데이터 특성에 따라 알고리즘을 자동 선택
        • 'bruto' : 모든 점 간의 거리를 계산, 데이터의 개수가 작은 경우 사용
        • 'kd_tree' : 저차원 데이터(20차원 이하)에서 매우 빠른 생성 가능
        • 'ball_tree' : 고차원 데이터에서 효율적인 거리 탐색 (공간 분할 기반)
      • leaf_size
        • 기본값 : 30
        • Tree 알고리즘을 사용하는 경우 리프의 크기를 지정 (미세한 성능을 조절할 때 사용)
    • 속성
      • core_sample_indices_ : 핵심점의 인덱스 목록
      • components_ : 핵심점 좌표 배열
      • labels_ : 각 데이터의 군집의 라벨 (노이즈는 -1로 표시)
    • 메서드
      • fit()
      • predict()
    • 동작의 원리
      1. 핵심점의 생성 (각 점에 대해서 이웃점의 개수를 계산)
      2. 경계점을 생성 (핵심점 근처에 데이터가 존재하지만 자신이 핵심이 아닌 경우)
      3. 노이즈점을 생성 (어떠한 군짐에도 속하지 않는 데이터)
      4. 핵심점에서 시작해서 이웃을 계속 측정하여 확장하면서 군집을 생성
    • 파라미터 튜닝 팁
      • 너무 많은 노이즈가 생성이 되는 경우 : eps를 증가시키거나 min_samples 감소시키기
      • 군집이 너무 뭉치는 경우 : eps 감소시키기
      • 너무 고차원인 경우 : 차원 축소를 통해서 고차원 데이터를 저차원 데이터로 변경한 후 사용
      • 속도가 너무 느린 경우 : algorithm을 kd_tree로 변경하거나 n_jobs를 -1로 변환