[혼공머신] 5주차-2_비지도학습

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″로 변환하는 도구죠.
  • KMeanstransform()이 있으니까, 데이터를 “새로운 특성 공간”으로 변환하는 도구처럼 쓸 수 있다는 뜻입니다.
  • 예: 원래 특성이 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)

  • 차원 축소 방법 중 가장 널리 쓰이는 기법.

 

주성분 분석 소개

  1. 데이터에서 분산이 가장 큰 방향(축)을 찾음.
  2. 그 방향을 첫 번째 주성분(PC1)이라고 함.
  3. 그 다음에는 첫 번째 축과 직각이면서, 남은 분산을 최대화하는 방향을 두 번째 주성분(PC2)로 잡음.
  4. 이런 식으로 계속 축을 찾아감.

주성분은 원본 차원과 같고 주성분으로 바꾼 데이터는 차원이 줄어든다는 점을 꼭 기억하세요.

예를 들면 샘플 데이터 s(2,4)를 주성분에 직각으로 투영하면 1차원 데이터를 만들 수 있습니다.

주성분이 가장 분산이 큰 방향이기 때문에 주성분에 투영하여 바꾼 데이터는 원본이 가지고 있는 특성을 가장 잘 나타내고 있을 것입니다.

 

PCA 클래스

사이킷런은 sklearn.decomposition 모듈 아래 PCA 클래스로 주성분 분석 알고리즘을 제공합니다.

PCA 클래스의 객체를 만들 때 n_components 매개변수에 주성분 개수를 지정해야 합니다.

k-평균과 마찬가지로 비지도 학습이기 때문에 fit() 메서드에 타깃값을 제공하지 않습니다.

 

 

원본 데이터 재구성

앞에서 10,000개의 특성을 50개로 줄였습니다.

이로 인해 어느 정도 손실이 발생할 수 밖에 없습니다.

하지만 최대한 분산이 큰 방향으로 데이터를 투영했기 때문에 원본 데이터를 상당 부분 재구성할 수 있습니다.