군집
2022. 11. 28. 11:11ㆍAI/기계학습
군집은 각 데이터의 유사성(거리)을 측정한 후 유사성이 높은 데이터끼리 집단으로 분류
데이터 간 유사도 측정 방법 - 유클리드 거리, 맨해튼 거리, 민코프스키 거리, 코사인 유사도
군집의 알고리즘 1. K-평균 군집화(K-Means)
알고리즘이 간단하고 큰 데이터에도 쉽게 가능하다.
- 학습 과정
- 중심점 선택 : 랜덤하게 초기 중심점을 선택 (k 크기 미리 정하기)
- K개의 중심점과 각각의 개별 데이터 간의 거리를 측정한 후 가장 가까운 중심점을 기준으로 데이터를 할당하여 클러스터 구성
- 클러스터마다 새로운 중심점 계산. 1~3 과정을 반복.
- 중심점에 변화가 없으면 멈춤
- 단점
1. 연속형 변수에 가장 최적
2. 결과가 초기에 지정한 클러스터 중심의 위치에 따라 달라질 수 있어 반복 필요
3. 클러스터의 개수를 지정해야 함
4. 클러스터의 모양을 가정하기 때문에(원) 다양한 분포를 가지는 데이터에 적용 한계
- 사용하면 안되는 경우
- 데이터가 비선형 2. 군집 크기가 다를 때 3. 군집마다 밀집도와 거리가 다를 때
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_moons
from sklearn.cluster import KMeans
# 데이터 생성
# 시나리오 1: 잘 분리된 동일 밀도 클러스터
X0, y0 = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)
# 시나리오 2: 다른 밀도의 클러스터
X1, y1 = make_blobs(n_samples=[100, 800], centers=[(-1, 0), (1, 2)], cluster_std=[0.5, 2.5], random_state=42)
# 시나리오 3: 비선형 클러스터 (반달 모양)
X2, y2 = make_moons(n_samples=200, noise=0.05, random_state=42)
# K-means 알고리즘 적용
kmeans0 = KMeans(n_clusters=3, random_state=42).fit(X0)
kmeans1 = KMeans(n_clusters=2, random_state=42).fit(X1)
kmeans2 = KMeans(n_clusters=2, random_state=42).fit(X2)
# 시각화 함수
def plot_clusters(X, y, centroids, title):
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis', marker='o', edgecolors='k', alpha=0.5)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, marker='x')
plt.title(title)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
# 그래프 그리기
plt.figure(figsize=(18, 6))
plt.subplot(1, 3, 1)
plot_clusters(X0, kmeans0.labels_, kmeans0.cluster_centers_, "Scenario 1: Well-separated Clusters")
plt.subplot(1, 3, 2)
plot_clusters(X1, kmeans1.labels_, kmeans1.cluster_centers_, "Scenario 2: Clusters with Different Densities")
plt.subplot(1, 3, 3)
plot_clusters(X2, kmeans2.labels_, kmeans2.cluster_centers_, "Scenario 3: Non-linear Clusters (Moon-shaped)")
plt.show()
- KMeans 기반으로 피처를 만들기
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
df=pd.read_csv('Sleep_Efficiency.csv')
df_sp = df[['Sleep_duration','Sleep_efficiency','REM_sleep_percentage','Deep_sleep_percentage','Light_sleep_percentage','Awakenings']]
X2 = df_sp.drop(['Sleep_efficiency','REM_sleep_percentage','Sleep_duration','Awakenings'], axis=1)
#kmeans 클러스터 실행
kmeans = KMeans(n_clusters=5)
X_clustered = kmeans.fit_predict(X2)
X_new_featured=np.hstack((X2, X_clustered.reshape(-1,1))) # hstack 가로로 행렬 결합
X_new_featured
'''
array([[70., 12., 0., 0.],
[28., 53., 3., 1.],
[70., 10., 1., 0.],
...,
[32., 48., 1., 3.],
[72., 10., 3., 0.],
[23., 55., 1., 1.]])
'''
y = df_sp['Sleep_efficiency']
X_train, X_test, y_train, y_test = train_test_split(X4, y, test_size=0.3, random_state=111)
# 간단한 회귀모델 진행
model = LinearRegression()
model.fit(X_train,y_train)
#예측값
y_pred = model.predict(X_test)
#Mse
mse = mean_squared_error(y_test, y_pred)
print('mse:',mse)
#REM_sleep_percentage,Sleep_duration,Awakenings 피처를 제외했을 때 mse: 0.006732725105270995
# 위에에 피쳐 추가 mse: 0.00683820727411644
- k-means++
K-Means 알고리즘의 가장 큰 단점은 처음에 지정하는 중심점(centroid)의 위치를 무작위로 결정하기 때문에 최적의 클러스터로 묶어주는 데에는 한계가 있다는 점이다.
이 한계를 보완한 것이 K-Means++ 알고리즘이다.
K-Means++ 알고리즘은 한 번에 k개의 센트로이드를 생성하는 것이 아니라, 센트로이드 사이의 거리를 최대한 멀리 위치시키는 방향으로 1개씩 총 k번 반복하여 k개의 클러스터를 만들어낸다.
kmeans_model1 =KMeans(
init = 'k-means++',
n_clusters = 3,
n_init = 10,
max_iter= 200,
random_state=111)
신경망에서 군집 알고리즘 사용
머신 러닝에서 군집화를 처리할 때 딥러닝과 함께 사용하면 모델의 성능을 높일 수 있다.
딥러닝과 함께 머신 러닝 군집 알고리즘을 적용하면 좋다.
군집 평가
elbow method - 각 객체마다 인접한 군집과의 거리를 최소화하는 값, 클러스터링의 응집도
실루엣 계수 - 군집 간에 군집 형성이 잘 됐는지, 클러스터 간 거리가 먼지
from yellowbrick.cluster import KElbowVisualizer
from sklearn.metrics import silhouette_score
from yellowbrick.cluster import SilhouetteVisualizer
elbow_ch =KElbowVisualizer(kmeans_model1)
elbow_ch.fit(X2)
#elbow_ch.draw()
fig, ax = plt.subplots(3,2, figsize=(15,10))
for i in [3,4,5,6,7,9]:
kmeans_model2 =KMeans(
init = 'k-means++',
n_clusters = i,
n_init = 10,
max_iter= 200,
random_state=111)
q, mod = divmod(i,2)
#실루엣계수 시각화
visual = SilhouetteVisualizer(kmeans_model2, color =' yellowbricks',ax= ax[q-1][mod])
visual.fit(X2)
'AI > 기계학습' 카테고리의 다른 글
교차검증(Cross-Validation) (0) | 2024.03.21 |
---|---|
K-최근접 이웃, K-Nearest Neighbors (K-NN) (0) | 2023.01.05 |
차원축소(PCA) (0) | 2022.11.24 |
회귀분석(Regression Analysis) (0) | 2022.11.15 |
Machine Learning1 - 정의와 종류 (0) | 2022.11.10 |