co-code 님의 블로그
군집 분석 본문
- K - Means ( 평균을 이용한 군집화 )
- k개의 자동 분류하는 비지도 학습 알고리즘
- 종속 변수가 존재하지 않는 데이터에서 유사한 데이터끼리 모음
- 서로 가까운 데이터는 같은 그룹으로 묶어서 그룹화
- 그룹의 중심점을 반복적으로 계산(중심점의 이동)하여 군집을 형성
- 작업 순서
- 초기의 중심점(k개)을 선택
- 각각의 데이터들을 중심점과의 거리를 확인
- 가까운 거리를 중심점으로 할당
- 각 군집의 평균을 구해서 새로운 중심점을 설정
- 중심점의 변화가 거의 없을 때까지 반복 실행
- 장점 : 빠르고 단순하여 대용량의 데이터에서 적합
- 단점
- 군집의 수를 미리 알고 작성해야 함
- 이상치에 굉장히 민감함
- parameter
- n_clusters
- 기본값 : 0
- 군집의 개수를 지정
- 너무 작거나 큰 경우에는 성능 저하
- init
- 기본값 : 'K-Means++'
- 초기의 중심점을 설정하는 방법
- 기본값을 사용하면 빠르고 안정적
- 'random' : 무작위하게 중심점을 생성
- n_init
- 기본값 : 'auto' (구버전은 10)
- 초기화 횟수
- 초기화하여 여러번의 시도들 중에 최적의 결과를 만드는 방법
- max_iter
- 기본값 :300
- 한번의 실행에서 최대의 반복 횟수
- tol
- 기본값 : 1e-4
- 중심점의 이동의 변화량이 기본값보다 작은 경우에는 수렴
- algorithm
- 기본값 : 'lloyd'
- 'elkan' : 속도 향상 (밀집 데이터에서 유리)
- n_clusters
- 속성
- 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 알고리즘을 사용하는 경우 리프의 크기를 지정 (미세한 성능을 조절할 때 사용)
- eps
- 속성
- core_sample_indices_ : 핵심점의 인덱스 목록
- components_ : 핵심점 좌표 배열
- labels_ : 각 데이터의 군집의 라벨 (노이즈는 -1로 표시)
- 메서드
- fit()
- predict()
- 동작의 원리
- 핵심점의 생성 (각 점에 대해서 이웃점의 개수를 계산)
- 경계점을 생성 (핵심점 근처에 데이터가 존재하지만 자신이 핵심이 아닌 경우)
- 노이즈점을 생성 (어떠한 군짐에도 속하지 않는 데이터)
- 핵심점에서 시작해서 이웃을 계속 측정하여 확장하면서 군집을 생성
- 파라미터 튜닝 팁
- 너무 많은 노이즈가 생성이 되는 경우 : eps를 증가시키거나 min_samples 감소시키기
- 군집이 너무 뭉치는 경우 : eps 감소시키기
- 너무 고차원인 경우 : 차원 축소를 통해서 고차원 데이터를 저차원 데이터로 변경한 후 사용
- 속도가 너무 느린 경우 : algorithm을 kd_tree로 변경하거나 n_jobs를 -1로 변환
'python' 카테고리의 다른 글
| TF-IDF(Term Frequency-Inverse Document Frequency) (0) | 2026.06.02 |
|---|---|
| RNN(순환 신경망 : Recurrent Neural Network), LSTM (0) | 2026.05.27 |
| 차원 축소 (0) | 2026.05.19 |
| 랜덤 포레스트(Random Forest) (0) | 2026.05.15 |
| 앙상블(ensemble) 中 배깅(Bagging) (0) | 2026.05.15 |
