-
혼공머신 CH 06 비지도 학습Study/머신러닝 딥러닝 2025. 9. 26. 16:18

목차
- 들어가며: 고차원 데이터 분석의 필수 도구, K-평균과 PCA
- 과일 이미지 데이터 준비 및 전처리 과정
2-1. 데이터 로드 및 2차원 배열로 변환 - 군집화의 기본: K-평균(K-Means) 알고리즘 적용
3-1. K-평균 모델 학습 및 결과 확인
3-2. 최적의 K 찾기: 엘보 메서드(Elbow Method) - 고차원 데이터의 해결사: 주성분 분석(PCA)
4-1. PCA 모델 적용 및 차원 축소
4-2. 차원 축소된 데이터에 K-평균 재적용 - 마치며: K-평균과 PCA를 활용한 효율적인 비지도 학습
1. 들어가며: 고차원 데이터 분석의 필수 도구, K-평균과 PCA
안녕하세요!
이번 시간에는 비지도 학습의핵심 기술, K-평균(K-Means) 군집화와 주성분 분석(PCA, Principal Component Analysis) 차원 축소를 결합하여 고차원 데이터를 효과적으로 분석하는 방법을 다룹니다.
우리가 다룰 데이터는 100x100 픽셀의 과일 이미지 300개입니다.
단순한 흑백 이미지이지만, 각 이미지는 개의 특성(픽셀 값)을 갖는 고차원 데이터입니다.
이렇게 많은 특성을 가진 데이터에 K-평균을 바로 적용하면 시간이 오래 걸리거나 성능이 저하될 수 있습니다.
본 포스팅에서는 PCA를 이용해 데이터의 본질적인 특성을 유지하면서 차원(특성 개수)을 크게 줄인 후, K-평균을 적용하여 이미지들을 효과적으로 군집화하는 실습 과정을 상세히 보여드리겠습니다.
2. 과일 이미지 데이터 준비 및 전처리 과정
먼저 300개의 과일 이미지(사과, 바나나, 파인애플 각 100개) 데이터를 로드하고 머신러닝 모델에 적합한 형태로 전처리합니다.
2-1. 데이터 로드 및 2차원 배열로 변환
KMeans나 PCA와 같은 scikit-learn 모델은 샘플(행)과 특성(열)으로 구성된 2차원 배열을 입력으로 받습니다. 따라서 100x100 크기의 3차원 이미지 데이터를 1x10000 크기의 2차원 데이터로 변환해야 합니다.
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA # 데이터 다운로드 및 로드 !wget https://bit.ly/fruits_300_data -O fruits_300.npy fruits = np.load('fruits_300.npy') # 데이터 형태 확인: (샘플 개수, 높이, 너비) print(fruits.shape) # (300, 100, 100) # K-평균 및 PCA 적용을 위해 2차원 배열로 변환 # (300, 10000) 형태로 변환됩니다. fruits_2d = fruits.reshape(-1, 100*100)
3. 군집화의 기본: K-평균(K-Means) 알고리즘 적용


K-평균은 데이터를 K개의 클러스터로 나누는 비지도 학습 알고리즘입니다.
과일 종류가 3개이므로 n_clusters=3으로 설정하여 학습을 진행합니다.
3-1. K-평균 모델 학습 및 결과 확인
데이터를 3개의 클러스터로 나눈 후, 각 클러스터에 할당된 샘플의 개수를 확인합니다.
# K-평균 모델 생성 및 학습 (클러스터 3개 설정) km = KMeans(n_clusters=3, random_state=42, n_init='auto') km.fit(fruits_2d) # 각 샘플이 할당된 클러스터 레이블 print(km.labels_) # [2 2 2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 0 2 ... 1 1 1 1 1 1 1 1 1 1] (출력의 일부) # 클러스터별 샘플 개수 확인 unique_labels, counts = np.unique(km.labels_, return_counts=True) print((unique_labels, counts)) # (array([0, 1, 2], dtype=int32), array([112, 98, 90]))300개의 데이터가 100개씩 균등하게 분포되어 있지만,
K-평균은 112개, 98개, 90개로 나누어 완벽하게 분류하지 못했음을 알 수 있습니다.
이는 이미지의 픽셀 값이라는 너무 많은(10,000개) 특성들이 군집화에 영향을 미쳤기 때문입니다.
클러스터의 중심(대표 이미지)을 시각화하여 어떤 기준으로 분류되었는지 확인해 봅니다.
# 클러스터 중심을 이미지 형태로 변환 및 시각화 # 중심은 10000개의 특성을 가짐 (3, 10000) km_centers = km.cluster_centers_.reshape(-1, 100, 100) # 시각화 함수 (draw_fruits 함수는 노트북 내부에 정의된 함수를 사용) # draw_fruits(km_centers, ratio=3)(실제 시각화 결과는 3개의 뚜렷한 대표 이미지를 보여주며, K-평균이 나름대로 군집을 시도했음을 알 수 있습니다.)
3-2. 최적의 K 찾기: 엘보 메서드(Elbow Method)

군집 알고리즘에서 K(클러스터 개수)를 선택하는 보편적인 방법 중 하나는 엘보 메서드(Elbow Method)를 사용하는 것입니다. 각 클러스터 중심과 샘플 간 거리의 제곱 합을 관성(Inertia)이라고 하며, K를 늘릴수록 관성은 감소합니다. 그리고 감소 폭이 급격히 줄어드는 지점(엘보, 팔꿈치)을 최적의 K로 간주합니다.
# k=2부터 k=6까지 관성(Inertia)을 계산하고 리스트에 저장 inertia = [] for k in range(2, 7): km = KMeans(n_clusters=k, random_state=42, n_init='auto') km.fit(fruits_2d) inertia.append(km.inertia_) # 관성 값 확인 (K=3일 때 약 8421838.03) print(inertia) # [10874597.550000003, 8421838.030000001, 6962386.53, 6463991.68, 5635396.95](참고: 실제 그래프에서는 K=3일 때부터 관성 감소 폭이 줄어들어 K=3이 적절한 선택임을 시사합니다.)
4. 고차원 데이터의 해결사: 주성분 분석(PCA)



K-평균 결과에서 볼 수 있듯이, 10,000개에 달하는 픽셀 특성을 모두 사용하는 것은 비효율적입니다.
PCA는 데이터의 분산을 가장 잘 설명하는 주성분(Principal Components)을 찾아 고차원 데이터를 저차원으로 축소합니다.
4-1. PCA 모델 적용 및 차원 축소
원본 10,000개의 특성을 50개의 주성분으로 압축해 보겠습니다. 데이터의 분산(정보량)이 얼마나 유지되는지 확인하는 것이 중요합니다.
# PCA 모델 생성 및 학습 (주성분 50개로 축소) pca = PCA(n_components=50) pca.fit(fruits_2d) # 주성분(Principal Components)의 형태 확인 print(pca.components_.shape) # (50, 10000) # 원본 데이터(300, 10000)를 50개 특성으로 축소 변환 fruits_pca = pca.transform(fruits_2d) print(fruits_pca.shape) # (300, 50)이 50개의 주성분이 원본 데이터의 분산을 얼마나 설명하는지(explained_variance_ratio_의 합) 확인해 봅니다.
# 설명된 분산 비율 합계 확인 print(np.sum(pca.explained_variance_ratio_)) # 약 0.9204...결과적으로, 단 50개의 특성만으로도 원본 데이터가 가진 정보의 약 92%를 설명할 수 있게 되었습니다.
이는 이미지의 종류를 구분하는 데 핵심적인 정보만 남기고 불필요한 노이즈는 제거되었음을 의미합니다.
4-2. 차원 축소된 데이터에 K-평균 재적용
이제 차원 축소된 데이터(fruits_pca, (300, 50))에 다시 K-평균을 적용하고 결과를 확인합니다.
# PCA 변환된 데이터에 K-평균 재적용 (K=3) km = KMeans(n_clusters=3, random_state=42, n_init='auto') km.fit(fruits_pca) # 클러스터별 샘플 개수 확인 unique_labels, counts = np.unique(km.labels_, return_counts=True) print((unique_labels, counts)) # (array([0, 1, 2], dtype=int32), array([100, 100, 100]))PCA를 통해 데이터의 잡음을 제거하고 핵심 특성만 남긴 결과,
K-평균이 세 종류의 과일 이미지를 각각 100개씩 정확하게 분류하는 데 성공했습니다.
이는 차원 축소가 군집 분석의 성능을 얼마나 효과적으로 개선할 수 있는지 보여주는 중요한 결과입니다.
5. 마치며: K-평균과 PCA를 활용한 효율적인 비지도 학습
이번 실습을 통해 K-평균과 PCA가 비지도 학습에서 얼마나 강력한 조합을 형성하는지 확인했습니다.
- K-평균: 데이터를 유사성에 따라 그룹화하여 숨겨진 패턴을 찾아냅니다.
- PCA: 고차원 데이터의 복잡성을 줄이고, 계산 효율성을 높이며, 노이즈를 제거하여 모델 성능을 향상시킵니다.
특히 이미지 분석과 같이 특성(Feature)이 방대한 영역에서 PCA를 활용한 차원 축소는 필수적인 전처리 단계입니다.
복잡한 문제를 단순화하고 모델의 정확도를 높이는 이 두 가지 기법을 숙달하는 것은 머신러닝 엔지니어에게 큰 자산이 될 것입니다!
'Study > 머신러닝 딥러닝' 카테고리의 다른 글
혼공머신 CH 08 합성곱 신경망 (CNN) (0) 2025.09.28 혼공머신 CH 07 딥러닝의 시작: 인공신경망 (0) 2025.09.27 혼공머신 CH 05 트리 알고리즘 (0) 2025.09.25 혼공머신 Ch 04 다양한 분류 알고리즘 (0) 2025.09.24 혼공머신 Ch 03 회귀 알고리즘과 모델 규제 (0) 2025.09.23