057 PyCaret 클러스터링 모듈 시작하기
키워드: 클러스터링, 시작
개요
PyCaret의 클러스터링 모듈은 비지도 학습을 위한 강력한 도구입니다. 이 글에서는 PyCaret으로 클러스터링을 시작하는 방법을 알아봅니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
클러스터링 모듈 임포트
from pycaret.clustering import *
내장 데이터세트
from pycaret.datasets import get_data
# 057 사용 가능한 클러스터링 데이터세트
print("클러스터링용 데이터세트:")
print("- jewellery: 보석 고객 데이터")
print("- mouse: 마우스 단백질 데이터")
print("- wholesale: 도매 고객 데이터")
# 057 데이터 로드
data = get_data('jewellery')
print(f"\n데이터 크기: {data.shape}")
print(data.head())
setup() 함수
클러스터링 환경을 설정합니다:
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
# 057 기본 설정
clust = setup(data, session_id=42)
# 057 주요 파라미터
clust = setup(
data=data,
normalize=True, # 정규화 (클러스터링에 필수)
transformation=False, # 변환 (로그, 제곱근 등)
ignore_features=None, # 제외할 특성
pca=False, # PCA 적용
pca_components=None, # PCA 차원
session_id=42, # 재현성
verbose=False
)
지원 알고리즘
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 057 지원 알고리즘 확인
models()
| 모델 ID | 알고리즘 | 설명 |
|---|---|---|
| kmeans | K-Means | 중심 기반 |
| ap | Affinity Propagation | 메시지 패싱 |
| meanshift | Mean Shift | 밀도 기반 |
| sc | Spectral Clustering | 그래프 기반 |
| hclust | Agglomerative | 계층적 병합 |
| dbscan | DBSCAN | 밀도 기반 |
| optics | OPTICS | 밀도 기반 개선 |
| birch | BIRCH | 대용량 데이터 |
| kmodes | K-Modes | 범주형 데이터 |
create_model() 함수
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 057 K-Means 모델 (기본 4 클러스터)
kmeans = create_model('kmeans')
# 057 클러스터 수 지정
kmeans_5 = create_model('kmeans', num_clusters=5)
# 057 다른 알고리즘
hclust = create_model('hclust', num_clusters=4)
dbscan = create_model('dbscan')
클러스터 레이블 확인
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
kmeans = create_model('kmeans', num_clusters=4)
# 057 클러스터 레이블이 추가된 데이터
clustered_data = assign_model(kmeans)
print(clustered_data.head())
# 057 클러스터별 통계
print("\n클러스터별 샘플 수:")
print(clustered_data['Cluster'].value_counts().sort_index())
클러스터 프로파일링
from pycaret.clustering import *
from pycaret.datasets import get_data
import pandas as pd
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
kmeans = create_model('kmeans', num_clusters=4)
clustered_data = assign_model(kmeans)
# 057 클러스터별 평균
cluster_profile = clustered_data.groupby('Cluster').mean()
print("클러스터 프로파일:")
print(cluster_profile)
# 057 클러스터별 표준편차
cluster_std = clustered_data.groupby('Cluster').std()
print("\n클러스터별 표준편차:")
print(cluster_std)
plot_model() 시각화
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
kmeans = create_model('kmeans', num_clusters=4)
# 057 클러스터 시각화 (PCA 기반 2D)
plot_model(kmeans, plot='cluster')
# 057 엘보우 플롯
plot_model(kmeans, plot='elbow')
# 057 실루엣 플롯
plot_model(kmeans, plot='silhouette')
# 057 분포 플롯
plot_model(kmeans, plot='distribution')
# 057 거리 플롯
plot_model(kmeans, plot='distance')
여러 모델 비교
from pycaret.clustering import *
from pycaret.datasets import get_data
import pandas as pd
from sklearn.metrics import silhouette_score
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 057 여러 모델 비교
models_to_compare = ['kmeans', 'hclust', 'birch', 'meanshift']
results = []
for model_name in models_to_compare:
try:
if model_name in ['dbscan', 'meanshift']:
model = create_model(model_name)
else:
model = create_model(model_name, num_clusters=4)
clustered = assign_model(model)
# 클러스터 수
n_clusters = clustered['Cluster'].nunique()
if n_clusters > 1:
# 실루엣 점수
X = get_config('X')
labels = clustered['Cluster'].values
score = silhouette_score(X, labels)
else:
score = -1
results.append({
'Model': model_name,
'Clusters': n_clusters,
'Silhouette': score
})
except Exception as e:
print(f"{model_name} 오류: {e}")
df = pd.DataFrame(results).sort_values('Silhouette', ascending=False)
print("\n모델 비교:")
print(df)
최적 클러스터 수 찾기
from pycaret.clustering import *
from pycaret.datasets import get_data
from sklearn.metrics import silhouette_score
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 057 실루엣 점수로 최적 K 찾기
X = get_config('X')
scores = []
for k in range(2, 11):
kmeans = create_model('kmeans', num_clusters=k)
clustered = assign_model(kmeans)
labels = clustered['Cluster'].values
score = silhouette_score(X, labels)
scores.append({'k': k, 'silhouette': score})
import pandas as pd
df = pd.DataFrame(scores)
print(df)
optimal_k = df.loc[df['silhouette'].idxmax(), 'k']
print(f"\n최적 클러스터 수: {optimal_k}")
새로운 데이터 예측
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
kmeans = create_model('kmeans', num_clusters=4)
# 057 새로운 데이터
import pandas as pd
new_data = pd.DataFrame({
'Age': [35, 55],
'Income': [50000, 120000],
'SpendingScore': [60, 90],
'Savings': [15000, 80000]
})
# 057 클러스터 예측
predictions = predict_model(kmeans, data=new_data)
print("새 데이터의 클러스터:")
print(predictions)
모델 저장 및 로드
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
clust = setup(data, normalize=True, session_id=42, verbose=False)
kmeans = create_model('kmeans', num_clusters=4)
# 057 저장
save_model(kmeans, 'clustering_model')
# 057 로드
loaded_model = load_model('clustering_model')
# 057 예측 테스트
new_data = data.head(5)
predictions = predict_model(loaded_model, data=new_data)
print(predictions)
전처리 옵션
from pycaret.clustering import *
from pycaret.datasets import get_data
data = get_data('jewellery')
# 057 다양한 전처리 옵션
clust = setup(
data=data,
normalize=True, # 정규화 (Z-score)
normalize_method='zscore', # 'zscore', 'minmax', 'maxabs', 'robust'
transformation=True, # 분포 변환
transformation_method='yeo-johnson', # 'yeo-johnson', 'quantile'
pca=True, # PCA 적용
pca_components=3, # 3차원으로 축소
session_id=42,
verbose=False
)
print("전처리 후 데이터 차원:", get_config('X').shape)
클러스터링 워크플로우
from pycaret.clustering import *
from pycaret.datasets import get_data
# 1. 데이터 로드
data = get_data('jewellery')
# 2. 환경 설정
clust = setup(data, normalize=True, session_id=42, verbose=False)
# 3. 최적 K 탐색 (엘보우)
# 057 plot_model() 사용 또는 수동 반복
# 4. 모델 생성
kmeans = create_model('kmeans', num_clusters=4)
# 5. 평가
plot_model(kmeans, plot='silhouette')
# 6. 레이블 할당
result = assign_model(kmeans)
# 7. 프로파일링
profile = result.groupby('Cluster').mean()
print(profile)
# 8. 저장
save_model(kmeans, 'final_clustering_model')
정리
setup()으로 클러스터링 환경 설정normalize=True가 클러스터링에서 매우 중요create_model()로 다양한 알고리즘 적용assign_model()로 클러스터 레이블 확인plot_model()로 결과 시각화predict_model()로 새 데이터 예측
다음 글 예고
다음 글에서는 K-Means 클러스터링 상세를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #057