06-2 k-평균
클러스터 중심
KMeans 클래스가 최종적으로 찾은 클러스터 중심은 cluster_centers_ 속성에 저장되어 있습니다.
이 배열은 fruits_2d 샘플의 클러스터 중심이기 때문에 각 중심을 이미지로 출력하려면 100×100 크기의 2차원 배열로 바꿔야 합니다.
KMeans 클래스는 훈련 데이터 샘플에서 클러스터 중심까지 거리로 변환해 주는 transform() 메서드를 가지고 있습니다.
transform() 메서드가 있다는 것은 마치 StandardScaler클래스처럼 특성값을 변환하는 도구로 사용할 수 있다는 의미입니다.
KMeans의 transform()
이 하는 일
- KMeans 모델을 학습하면 클러스터 중심(centroid) 위치가 정해집니다.
transform()
메서드를 쓰면 각 데이터 포인트 → 각 클러스터 중심까지의 거리를 계산해 줍니다.
예를 들어, 클러스터가 3개면 데이터 하나는 거리 3개(각 중심까지의 거리)가 나옵니다.
왜 StandardScaler 얘기가 나왔나?
StandardScaler
는 데이터를 “평균 0, 표준편차 1″로 변환하는 도구죠.KMeans
도transform()
이 있으니까, 데이터를 “새로운 특성 공간”으로 변환하는 도구처럼 쓸 수 있다는 뜻입니다.- 예: 원래 특성이 2개였어도, KMeans로 변환하면 “각 중심까지의 거리”라는 새로운 특성들이 만들어짐.
fruits
의 원래 형태
fruits
는(샘플 수, 100, 100)
형태- 샘플 수: 예를 들어 300개 이미지
- 100 × 100: 각 이미지의 흑백 픽셀 값
fruits.reshape(-1, 100*100)
의 의미
1
은 “샘플 수를 자동으로 계산”하라는 뜻100*100 = 10000
→ 각 이미지 픽셀을 한 줄로 펼친 길이- 결과 모양:
(샘플 수, 10000)
→ 예:(300, 10000)
인덱싱 문제
fruits_2d[100]
→(10000,)
(1차원, 한 줄짜리 배열)fruits_2d[100:101]
→(1, 10000)
(2차원, 샘플 하나짜리 행렬)
왜 transform()
은 (1, 10000)
을 원할까?
transform()
메서드는 항상 샘플 여러 개를 처리하는 구조로 설계돼 있어서, 샘플이 1개여도 행렬 형태를 유지해야 합니다.(10000,)
→ ❌ “특성이 10000개인 단일 벡터”라 인식 (샘플 차원 없음)(1, 10000)
→ ✅ “샘플 1개, 특성 10000개”라 인식
반환 결과 모양: (1, n_clusters)
1
→ 입력 샘플 개수 (여기선 1개)n_clusters
→ KMeans가 찾은 클러스터 개수- 예를 들어
n_clusters=3
이면 출력은(1, 3)
배열 - 출력의 각 값은 유클리드 거리(Euclidean distance)
- 첫 번째 클러스터(레이블 0), 두 번째 클러스터(레이블 1)가 각각 첫 번째 원소, 두 번째 원소의 값입니다.
KMeans 클래스는 가장 가까운 클러스터 중심을 예측 클래스로 출력하는 predict() 메서드도 제공합니다.
k-평균 알고리즘은 앞에서 설명했듯이 반복적으로 클러스터 중심을 옮기면서 최적의 클러스터를 찾습니다.
알고리즘이 반복한 횟수는 KMeans 클래스의 n_iter_ 속성에 저장됩니다.
최적의 k 찾기
k-평균 알고리즘의 단점 중 하나는 클러스터 개수를 사전에 지정해야 한다는 것입니다.
적절한 클러스터 개수를 찾기 위한 대표적인 방법인 엘보우(elbow) 방법에 대해 알아보겠습니다.
이너셔는 클러스터 중심과 클러스터에 속한 샘플 사이의 거리의 제곱합입니다.
이는 클러스터의 샘플이 얼마나 가깝게 모여 있는지를 나타내는 값으로 생각할 수 있습니다.
엘보우 방법은 클러스터 개수를 늘려가면서 이너셔의 변화를 관찰하여 최적의 클러스터 개수를 찾는 방법입니다.
클러스터 개수를 증가시키면서 이너셔를 그래프로 그래면 감소하는 속도가 꺾이는 지점이 있습니다.
이 지점부터는 클러스터의 개수를 늘려도 이너셔가 크게 개선되지 않습니다.
이 지점이 마치 팔꿈치 모양이어서 엘보우 방법이라 부릅니다.
06-3 주성분 분석
차원과 차원 축소
특성 (Feature)
- 데이터의 한 가지 속성을 의미합니다.
- 예 : 키, 몸무게, 나이 이 세 가지가 각각 특성입니다.
- 하나의 특성은 하나의 열(column)에 해당합니다.
차원 (Dimension)
- 데이터에서 특성의 개수를 말합니다.
- 즉, 차원 수 = 특성 수.
- 키 하나만 있으면 → 1차원
- 키와 몸무게가 있으면 → 2차원
- 키, 몸무게, 나이가 있으면 → 3차원
차원 축소 (Dimensionality Reduction)
- 차원축소는 데이터를 가장 잘 나타내는 일부 특성을 선택하여 데이터 크기를 줄이고 지도학습 모델의 성능을 향상시킬 수 있는 방법입니다.
주성분 분석 (PCA: Principal Component Analysis)
- 차원 축소 방법 중 가장 널리 쓰이는 기법.
주성분 분석 소개
- 데이터에서 분산이 가장 큰 방향(축)을 찾음.
- 그 방향을 첫 번째 주성분(PC1)이라고 함.
- 그 다음에는 첫 번째 축과 직각이면서, 남은 분산을 최대화하는 방향을 두 번째 주성분(PC2)로 잡음.
- 이런 식으로 계속 축을 찾아감.
주성분은 원본 차원과 같고 주성분으로 바꾼 데이터는 차원이 줄어든다는 점을 꼭 기억하세요.
예를 들면 샘플 데이터 s(2,4)를 주성분에 직각으로 투영하면 1차원 데이터를 만들 수 있습니다.
주성분이 가장 분산이 큰 방향이기 때문에 주성분에 투영하여 바꾼 데이터는 원본이 가지고 있는 특성을 가장 잘 나타내고 있을 것입니다.
PCA 클래스
사이킷런은 sklearn.decomposition 모듈 아래 PCA 클래스로 주성분 분석 알고리즘을 제공합니다.
PCA 클래스의 객체를 만들 때 n_components 매개변수에 주성분 개수를 지정해야 합니다.
k-평균과 마찬가지로 비지도 학습이기 때문에 fit() 메서드에 타깃값을 제공하지 않습니다.
원본 데이터 재구성
앞에서 10,000개의 특성을 50개로 줄였습니다.
이로 인해 어느 정도 손실이 발생할 수 밖에 없습니다.
하지만 최대한 분산이 큰 방향으로 데이터를 투영했기 때문에 원본 데이터를 상당 부분 재구성할 수 있습니다.
설명된 분산
주성분 원본 데이터 분산을 얼마나 잘 나타내는지 기록한 값을 설명된 분산(explained variance)이라고 합니다.
PCA 클래스의 explained_variance_ratio_에 각 주성분의 설명된 분산 비율이 기록되어 있습니다.
이 분산 비율을 모두 더하면 50개의 주성분으로 표현하고 있는 총 분산 비율을 얻을 수 있습니다.
다른 알고리즘과 함께 사용하기
50개의 특성만 사용했는데도 정확도가 99.7%로 동일하고 훈련 시간은 0.02초로 30배 이상 감소했습니다.
PCA로 훈련 데이터의 차원을 축소하면 저장 공간뿐만 아니라 머신러닝 모델의 훈련 속도도 높일 수 있습니다.
앞서 PCA 클래스를 사용할 때 n_components 매개변수에 주성분의 개수를 지정했습니다.
이 대신 원하는 설명된 분산의 비율을 입력할 수도 있습니다.
PCA 클래스는 지정된 비율에 도달할 때까지 자동으로 주성분을 찾습니다.
로지스틱 회귀 모델이 완전히 수렴하지 못했으니 반복 회수를 증가하라는 경고가 출력됩니다.
하지만 교차 검증의 결과가 충분히 좋기 때문에 무시해도 좋습니다.
이번에는 차원 축소된 데이터를 사용해 k-평균 알고리즘으로 클러스터를 찾아보겠습니다.
기본 숙제
k-평균 알고리즘 작동 방식 설명하기
k-평균(k-means) 알고리즘은 데이터를 k개의 클러스터(그룹)로 묶는 비지도 학습 방법입니다.
이 알고리즘은 비슷한 특징을 가진 데이터들을 자동으로 분류하는 데 사용됩니다.
작동 방식
k-평균 알고리즘은 다음과 같은 4단계로 작동합니다.
1. 클러스터 중심 초기화
사용자가 지정한 k 값에 따라, 데이터셋에서 k개의 클러스터 중심을 무작위로 선택합니다. 이 중심들은 각 클러스터의 초기 대표점 역할을 합니다.
2. 클러스터 할당
모든 데이터 샘플에 대해 가장 가까운 클러스터 중심을 찾습니다. 각 샘플은 가장 가까운 중심이 속한 클러스터에 할당됩니다. 이때, 샘플과 중심 사이의 거리는 일반적으로 유클리드 거리를 사용하여 계산합니다.
3. 클러스터 중심 갱신
각 클러스터에 할당된 모든 샘플들의 평균을 계산하여 새로운 클러스터 중심으로 설정합니다. 이 과정을 통해 클러스터 중심이 데이터의 실제 분포에 맞게 이동합니다.
4. 반복
새로운 클러스터 중심이 더 이상 변하지 않거나, 변화량이 매우 작아질 때까지 2단계와 3단계를 반복합니다. 이 반복 과정을 통해 클러스터들이 안정된 상태에 도달하면 알고리즘이 멈추고 최종 클러스터링 결과가 생성됩니다.
특징 및 활용
k-평균 알고리즘은 계산이 간단하고 속도가 빨라 대용량 데이터셋에 효과적으로 적용할 수 있습니다. 주로 고객 세분화, 이미지 분할, 문서 분류 등 다양한 분야에서 활용됩니다. 하지만 초기 클러스터 중심의 위치에 따라 최종 결과가 달라질 수 있다는 단점이 있습니다.
추가 숙제
Ch.06(06-3) 확인 문제(p.354) 풀고, 설명하기
1번 문제
특성이 20개인 대량의 데이터셋이 있습니다. 이 데이터셋에서 찾을 수 있는 주성분 개수는 몇 개일까요?
① 10개
② 20개
③ 50개
④ 100개
풀이
주성분 개수는 원본 데이터의 특성 개수보다 많을 수 없습니다. 따라서 주성분 개수는 최대 20개입니다.
정답
② 20개
2번 문제
샘플 개수가 1,000개이고 특성 개수는 100개인 데이터셋이 있습니다. 즉 이 데이터셋의 크기는 (1000, 100)입니다. 이 데이터를 사이킷런의 PCA 클래스를 사용해 10개의 주성분을 찾아 변환했습니다. 변환된 데이터셋의 크기는 얼마일까요?
① (1000, 10)
② (10, 1000)
③ (10, 10)
④ (1000, 1000)
풀이
PCA 변환 후 데이터는 샘플 개수는 유지되고, 특성 개수가 선택한 주성분 개수로 축소됩니다. 따라서 (1000, 10)이 됩니다.
정답
① (1000, 10)
3번 문제
2번 문제에서 설명된 분산이 가장 큰 주성분은 몇 번째인가요?
① 첫 번째 주성분
② 다섯 번째 주성분
③ 열 번째 주성분
④ 알 수 없음
풀이
PCA는 분산이 가장 큰 방향부터 주성분을 찾습니다. 따라서 첫 번째 주성분이 가장 큰 분산을 설명합니다.
정답
① 첫 번째 주성분
4번 문제
사이킷런의 PCA 클래스에 대해 올바르게 설명한 것은 무엇인가요?
① 모델을 훈련한 후 새로운 샘플을 변환할 수 없습니다.
② 모델을 훈련한 후 새로운 샘플의 레이블을 예측할 수 있습니다.
③ PCA로 변환된 데이터를 사용해 원본 데이터를 복원할 수 없습니다.
④ 설명된 분산의 비율은 explained_variance_ratio_ 속성에 저장되어 있습니다.
풀이
PCA 클래스는 모델 학습 후 새로운 데이터를 변환할 수 있고, explained_variance_ratio_ 속성에 각 주성분이 설명하는 분산 비율이 저장되어 있습니다.
정답
④ 설명된 분산의 비율은 explained_variance_ratio_ 속성에 저장되어 있습니다.