비지도 학습으로 데이터 구조를 찾는 군집화와 차원 축소

K-평균·DBSCAN 군집화, PCA·t-SNE 차원 축소, 오토인코더 표현 학습의 선택 기준과 운영 방법을 정리합니다.

2026-08-14 · 최초 발행 2025-10-14

레이블 없는 데이터에서 구조를 드러내는 방법

비지도 학습은 정답 레이블 없이 데이터의 잠재 구조, 분포, 유사도를 파악한다. 군집화와 차원 축소, 밀도 추정, 표현 학습을 통해 이후 태스크의 성능을 높이는 데 목적이 있다.

군집화에서는 K-평균과 DBSCAN이 자주 쓰인다. K-평균은 유클리드 거리 기반으로 중심점(centroid)을 최적화하며, 볼록하고 구형인 클러스터를 가정한다. DBSCAN은 밀도를 기준으로 군집을 나누므로 노이즈와 이상치에 강인하고, 클러스터 개수를 자동으로 결정한다.

차원 축소에서는 PCA와 t-SNE의 역할이 다르다. PCA는 공분산 분해에 기반한 선형 변환으로 분산을 최대한 보존하면서 해석하기 쉽다. t-SNE는 확률적 이웃 보존을 활용하는 비선형 매니폴드 학습 방식이며, 국소 구조를 시각화하는 데 적합하다.

오토인코더는 인코더-디코더 신경망으로 입력을 잠재 공간에 압축한 뒤 복원한다. 비선형 표현 학습뿐 아니라 이상치 탐지, 노이즈 제거, 사전학습(Pretraining)에 활용할 수 있다.

전처리와 모델 선택이 결과를 좌우한다

K-평균과 PCA는 스케일에 민감하므로 StandardScaler 또는 MinMaxScaler 적용을 고려한다. 범주형 데이터를 다룰 때는 원-핫 인코딩을 도입할 수 있지만, 고차원 희소 행렬의 처리 비용도 함께 봐야 한다.

이상치와 노이즈는 DBSCAN의 노이즈 라벨을 이용해 제거하거나 가중치를 부여하는 방식으로 다룰 수 있다. 오토인코더에서는 재구성 오차가 큰 샘플을 이상치 후보로 선별한다.

데이터 구조도 알고리즘 선택의 기준이다. 구형이고 균질한 분포에는 K-평균이 맞고, 복잡한 형상이나 밀도 차이가 있으면 DBSCAN, t-SNE, 오토인코더를 검토할 수 있다. 선형성을 전제한다면 PCA, 비선형 매니폴드를 다룬다면 t-SNE나 오토인코더가 후보가 된다.

튜닝 대상도 모델마다 다르다.

  • K-평균: k, 초기화(k-means++), 반복 수, 시드
  • DBSCAN: eps, min_samples, 거리 척도
  • t-SNE: perplexity, learning_rate, early_exaggeration
  • 오토인코더: 잠재 차원, 활성함수, 정규화(L1/L2/Dropout), 최적화기

거리 척도는 유클리드, 코사인, 맨해튼 중에서 데이터 특성과 정규화 전략에 맞춰 선택한다. K-평균은 SSE를 최소화하지만 지역해에 수렴할 수 있으므로 여러 초기화 결과를 평균화한다. 오토인코더는 재구성 손실(MSE/BCE)을 최소화하며, 조기 종료와 스케줄러로 과적합을 제어한다.

탐색부터 운영까지 이어지는 활용

고객 세분화에서는 군집 기반 페르소나를 만들고 캠페인 타깃팅을 최적화할 수 있다. 고차원 행동 피처는 차원 축소로 압축한 뒤 최근접 이웃 기반 추천을 가속하는 데 쓴다.

이상치 탐지와 품질 관리에서는 DBSCAN의 노이즈 라벨로 고장 전조 신호를 찾고, 오토인코더의 재구성 오차 임계값으로 결함 샘플을 선별한다.

탐색적 데이터 분석에서는 t-SNE/UMAP으로 고차원 임베딩을 2D에 매핑해 군집 경향과 클래스 혼합도를 확인한다. PCA의 로딩(loading)은 변수 기여도 해석에 쓸 수 있다.

PCA와 오토인코더는 차원을 줄여 학습·추론 지연을 낮추고, 소형 잠재표현을 공유해 멀티태스크 입력을 표준화하는 데도 활용된다. 오토인코더 사전학습 뒤 소량의 레이블로 파인튜닝하거나, 군집 의사라벨로 분류기를 초기화해 준지도 학습 파이프라인을 구성할 수도 있다.

알고리즘별 운영 특성

알고리즘 성능(정확/표현력) 확장성(샘플/특징) 일관성(재현성) 안정성(노이즈/이상치) 운영 편의(튜닝/해석)
K-평균 구형 클러스터에 우수 대규모 N, 중간 D 시드 민감, 다중 초기화로 개선 이상치 취약 k 선택 필요, 해석 용이
DBSCAN 비정형 형상에 우수 고차원에서 성능 저하 파라미터 민감 노이즈 강인 eps/min_samples 선택 난이도
PCA 선형 구조 보존 우수 대규모 D에 효율 결정적 결과 이상치 영향 큼 해석 용이(로딩)
t-SNE 지역 구조 표현 우수 대규모 N 느림 무작위성 높음 노이즈에 민감 시각화 특화, 파라미터 민감
오토인코더 비선형 표현 강력 배치·분산 학습 가능 초기값·학습률 민감 정규화 시 견고 설계 자유도 높아 튜닝 비용

데이터 수집부터 재튜닝까지의 흐름

필요불필요아니오특이치 과다perplexity 범위 오류학습 발산입력 데이터 수집전처리: 결측/이상치 처리스케일링 적용 여부StandardScaler/MinMaxScaler 적용모델 선택K-평균DBSCANPCAt-SNE오토인코더평가: 실루엣/CH 지표평가: 노이즈 비율/군집재구성 분산 비율시각적 분리도/클래스 혼합도재구성 오차/ROC(이상치)결과 산출:클러스터/임베딩/오류품질 기준 충족배포/리포팅/다운스트림 학습재튜닝:k/eps/perplexity/잠재차원DBSCAN/강건 스케일러 재시도학습률 감소/정규화/조기 종료

군집 일관성은 실루엣 점수, Davies–Bouldin, Calinski–Harabasz 같은 내부 지표로 평가한다. 차원 축소에서는 PCA와 오토인코더의 재구성 오차를 확인하고, 신뢰도는 다운스트림 성능으로 간접 검증한다.

운영 단계에서는 데이터 드리프트(분포 시프트)를 감지하고 주기적 재학습 트리거를 설계한다. 시드를 고정하고, 전처리와 모델을 결합한 아티팩트를 버전관리해 재현성을 확보한다.

최소 실행 예시 코드

전제조건: Python 3.10+, scikit-learn>=1.3, numpy, matplotlib, tensorflow>=2.12 또는 pytorch>=2.0

scikit-learn으로 군집화와 차원 축소 실행

import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
rng = np.random.RandomState(42)

# 1) 샘플 데이터 생성
X, _ = make_blobs(n_samples=2000, centers=4, cluster_std=1.2, random_state=42)

# 2) 스케일링
Xz = StandardScaler().fit_transform(X)

# 3) K-평균
kmeans = KMeans(n_clusters=4, n_init='auto', random_state=42)
y_km = kmeans.fit_predict(Xz)
print("Silhouette(KMeans):", silhouette_score(Xz, y_km))

# 4) DBSCAN
db = DBSCAN(eps=0.5, min_samples=10)
y_db = db.fit_predict(Xz)
mask = y_db != -1
print("DBSCAN clusters:", len(set(y_db)) - (1 if -1 in y_db else 0))

# 5) PCA 2D
pca = PCA(n_components=2, random_state=42)
X_pca = pca.fit_transform(Xz)
print("Explained variance ratio:", pca.explained_variance_ratio_.sum())

# 6) t-SNE 2D (소규모 샘플로 시연)
idx = rng.choice(len(Xz), size=1000, replace=False)
X_tsne = TSNE(n_components=2, perplexity=30, learning_rate='auto', init='pca', random_state=42).fit_transform(Xz[idx])

# 7) 시각화
fig, ax = plt.subplots(1, 2, figsize=(10,4))
ax[0].scatter(X_pca[:,0], X_pca[:,1], c=y_km, s=5, cmap='tab10')
ax[0].set_title("PCA + KMeans")
ax[1].scatter(X_tsne[:,0], X_tsne[:,1], c=y_db[idx], s=5, cmap='tab10')
ax[1].set_title("t-SNE + DBSCAN")
plt.tight_layout(); plt.show()

Keras 오토인코더로 재구성 오차 계산

import numpy as np, tensorflow as tf
from tensorflow import keras
from sklearn.preprocessing import StandardScaler

# 데이터 준비
X = np.loadtxt("data.csv", delimiter=",")  # 연속형 피처 가정
Xz = StandardScaler().fit_transform(X)

input_dim = Xz.shape[1]
latent_dim = max(2, input_dim // 4)

# 모델 정의
inputs = keras.Input(shape=(input_dim,))
x = keras.layers.Dense(64, activation="relu")(inputs)
x = keras.layers.Dense(32, activation="relu")(x)
z = keras.layers.Dense(latent_dim, activation="linear", name="latent")(x)
x = keras.layers.Dense(32, activation="relu")(z)
x = keras.layers.Dense(64, activation="relu")(x)
outputs = keras.layers.Dense(input_dim, activation="linear")(x)

ae = keras.Model(inputs, outputs)
ae.compile(optimizer=keras.optimizers.Adam(1e-3), loss="mse")

# 학습
cb = [keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)]
ae.fit(Xz, Xz, epochs=200, batch_size=256, validation_split=0.1, callbacks=cb, verbose=0)

# 재구성 오차 계산 및 임계값 산출(상위 5% 이상치)
recon = ae.predict(Xz, verbose=0)
err = np.mean((Xz - recon)**2, axis=1)
threshold = np.quantile(err, 0.95)
anomaly = err > threshold
print("Anomaly ratio:", anomaly.mean())

기대할 수 있는 변화와 적용 순서

PCA 또는 오토인코더로 차원을 50% 이상 줄이면 선형·트리 기반 모델의 학습 시간을 30~70% 단축할 수 있다(데이터·모델 의존). t-SNE는 탐색적 시각화 시간을 줄이고 피처 엔지니어링 의사결정을 가속한다.

군집 기반 세그먼트 타깃팅은 전환율을 5~20%p 개선할 가능성이 있다. 반지도 파이프라인에서는 오토인코더 사전학습이 소량 레이블 환경의 정확도 향상에 연결될 수 있다.

DBSCAN은 노이즈 내성을 확보해 이상치로 인한 모델 왜곡을 완화한다. 파이프라인 버전관리와 재현성을 갖추면 배포 리스크도 줄일 수 있다.

초기에는 스케일링과 PCA/K-평균 조합으로 시작하고, 데이터의 형상과 운영 요구에 따라 DBSCAN, t-SNE, 오토인코더로 확장한다. 구형·균질 분포에는 K-평균, 복잡한 형상과 노이즈에는 DBSCAN, 선형 요약에는 PCA, 시각화에는 t-SNE, 비선형 표현과 이상치 탐지에는 오토인코더를 우선 검토한다.

비지도 학습군집화차원 축소오토인코더이상치 탐지