Python(Colab) KMeans / 클러스터링

2023. 6. 17. 15:52파이썬/머신러닝 및 딥러닝

✔️ KMeans

- 클러스터링 알고리즘

- 특징
단점)

- 사람이 클러스터 수를 정해줘야한다 ( 몇개로 나눌것인지 )
- 중심점이 랜덤하게 설정되기 때문에 값이 매번 다름 

cf) 중심점의 점간의 거리(Global Optimum)이 최소 값을 찾는게 아니라, 중심점이 Local Optimum에 수렴하여 잘못된 분류를 할 수 있다.

https://velog.io/@jhlee508/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-K-%ED%8F%89%EA%B7%A0K-Means-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

[머신러닝] K-평균(K-Means) 알고리즘

머신러닝 비지도학습에 속하는 K-means 알고리즘은 K개의 군집(Cluster)로 묶는(Clusting) 알고리즘이다.

velog.io

 

상당히 잘 설명해주신 블로그 추천

 

 

 

데이터에 kmeans 적용하기

n_clusters = 2~10  / 분류를 2부터 10까지 나눠라

inertia_list = []

for i in range(2,11):
    km = KMeans(n_clusters=i,random_state=12345)
    km.fit(mm_df)
    inertia_list.append(km.inertia_)

inertia_list
 
 
# 그래프로 봤을 때 드라마틱하게 알 수 없음
sns.lineplot(x=range(2,11),y=inertia_list)
 
 
정확하게 elbow를 알수 없음

elbow기법: centroid 간의 평균 거리가 더 이상 많이 감소하지 않는 경우의 K를 선택하는 방법

 

✔️elbow기법 

- centroid 간의 평균 거리가 더 이상 많이 감소하지 않는 경우의 K를 선택하는 방법

특징

클러스터 개수를 늘렸을 때 centroid 간의 평균 거리가 더 이상 많이 감소하지 않는 경우의 K를 선택하는 방법.
개수가 늘 때마다 평균값이 급격히 감소하는데 적절한 K가 발견되면 매우 천천히 감소한다.
참고로, 클러스터 개수가 적으면 centroid 간의 거리가 매우 커지며, 적절한 개수이면 거리가 점점 짧아진다.
개수가 많으면 평균 거리가 매우 조금씩 줄어든다.


✔️실루엣스코어 기법

- 각 군집 간의 거리가 얼마나 효율적으로 분리되어있는지 나타낸다.
- 다른 군집과의 거리는 떨어져있고, 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있다는 의미
- 실루엣 스코어 기법은 실루엣 계수를 기반
- 실루엣 계수는 개별 데이터가 가지는 군집화 지표


특징)
각 데이터의 실루엣 계수를 계산한다.
클러스터의 개수가 최적화되어 있으면 실루엣 계수는 1에 가까운 값이 된다.
실루엣 계수의 평균이 0.7보다 크면 잘 분류되었다고 본다.
엘보우 기법에 비해 계산하는데 시간이 굉장히 오래걸린다.

 

엘보우 기법을 사용하기

 

1. 기초 설정

make_blobs:  모든 방향으로 같은 성질을 가지는 정규분포를 이용해 가상 데이터 생성

클러스트링 가상 데이터를 생성하는데 주로 사용한다.

n_samle: 표본 데이터 

centers: 클러스터 수

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
from sklearn.datasets import make_blobs
 
X,y = make_blobs(n_samples=100, centers=3, random_state=10)
 
X=pd.DataFrame(X)
X
 
#독립변수로 사용될 데이터

 

#종속변수로 사용될 데이터

y  

 

 

# 3개의 클러스터를 가진 가상 데이터 확인
sns.scatterplot(x=X[0],y=X[1],hue=y)
 

 

학습시키기

from sklearn.cluster import KMeans
 
km = KMeans(n_clusters=3)
 
km.fit(X)
#비지도 학습이기때문에 y는 필요없음
 
pred = km.predict(X)
 
sns.scatterplot(x=X[0],y=X[1],hue=pred)
 

 

최적의 클러스터링 파악하기 : 엘보우 기법 !

inertia_list = []

for i in range(2,11):
    km = KMeans(n_clusters=i)
    km.fit(X)
    inertia_list.append(km.inertia_)

inertia_list

 

sns.lineplot(x=range(2,11),y=inertia_list)
 
3이 엘보우 기법으로 확인했을 때 최적의 값이다.

 

728x90