본문 바로가기
파이썬/머신러닝-비지도학습

파이썬 머신러닝 비지도학습 - 클러스터링 (K-means

by 큰고양2 2023. 9. 25.

K-means

 

k-meas는 데이터를 k개의 클러스터(군집)으로 묶는 비지도 학습 방법으로

k 개의 중심을 임의로 배치하고 거리를 기준으로 클러스터를 생성 후

완성된 클러스터에 대해 새로운 중심을 계산하여

최종적으로 각 클러스터의 평균에 중심이 위치하게 된다

간단히 설명하면 전체 데이터를 데이터의 거리의 평균 기준으로 k개로 나눈다고 생각하면 된다

 

값의 차이를 기준으로 거리를 정하기 때문에

값들이 정규화가 되어 있지 않다면 거리 계산이 정상적으로 되지 않는다

또 중심점을 기준으로 거리를 기반으로 클러스터를 구분하기 때문에 데이터의 분포가

원형이 아니라 복잡한 형태로 분포하는 경우에 분류가 명확하지 않다는 단점이 있다

 

 

 

사용하기

 

정규화

https://bigcat5312.tistory.com/94

 

파이썬 머신러닝 데이터 정규화

https://bigcat5312.tistory.com/80 파이썬 머신러닝 지도학습 - 데이터 분리 (sklearn - train_test_split import from sklearn.model_selection import train_test_split train_test_split 데이터를 머신러닝에 사용하기 위해서 학습 데

bigcat5312.tistory.com

를 참고해서

데이터 x를 정규화 해주자

 

import 및 선언
#임포트
from sklearn.cluster import KMeans

#선언
model = KMeans(n_clusters= , init = , n_init = , max_iter =  , tol = ,randomstate=)

모델의 파라미터를 설명하자면

  1. n_clusters (기본값: 8):
    • 클러스터의 개수를 지정하는 파라미터
  2. init (기본값: 'k-means++'):
    • 초기 클러스터 중심점을 설정하는 방법을 지정하는 파라미터
    • 'k-means++' = 초기 클러스터 중심을 잘 분산된 위치에 배치하려고 시도
    • 'random'= 무작위로 초기 중심을 배치
  3. n_init (기본값: 10):
    • K-Means 알고리즘을 다른 초기화 값으로 여러 번 실행하여 최적의 결과를 찾는 횟수를 지정하는 파라미터
  4. max_iter (기본값: 300):
    • 알고리즘의 최대 반복 횟수를 지정하는 파라미터
  5. tol (기본값: 1e-4):
    • 클러스터 중심의 변화가 이 값보다 작아지면 알고리즘이 수렴했다고 판단하는 파라미터
    • 클러스터의 중심의 변화가 tol보다 작아지면 종료
  6. random_state (기본값: None):
    • 알고리즘 내에서 사용되는 무작위 초기화와 관련된 시드 값을 지정하는 파라미터
학습 및 분류
#학습
model.fit(x)

#분류
pred = model.predict(x)

학습과 분류는 다른 모델과 동일한 방법으로 진행하면 된다

 

 

시각화
  pred = pd.DataFrame(pred, columns = ['predicted']) #결과를 저장하는 데이터 프레임
  result = pd.concat([x, pred], axis = 1) #원본 데이터 프레임과 결과를 합침
  
  
  plt.scatter(result['x1'],result['x2'],c=result['predicted'],alpha=0.5)
  plt.grid()
  plt.show()

위 코드로 2차원 구조인 데이터를 시각화 해서 볼 수있다

다만  차원이 2개 이상인 경우 클러스터를 시각화 해서 보는 것이 어렵다는 점을 유의하자

 

 

최적 클러스터 수 찾기

 

 

inertia 이용

 

1,2차원 클러스터가 아닌 이상 시각화 해서 적절한 클러스터를 찾는 것은 어렵다

이 경우 2가지 지표를 통해 최적의 클러스터를 찾아 볼 수 있다 먼저 inertia 를 이용하는 방법이다

inertia는 군집화 이후 각 중심점에서 군집의 데이터간 거리를 합산한 것으로

inertia가 낮을 수록 적절하게 분류가 된 군집이라고 판단 할 수 있다

 

ex)

k_value = range(1,21)
als = []
for k in k_value :
    model = KMeans(n_clusters=k , n_init= 'auto')
    model.fit(x)
    als.append(model.inertia_)
plt.plot(k_value , als)

클러스터 모델을 학습 시킨 이후 .inertia_   매소드로 inertia를 확인 할 수 있다

위 코드는

클러스터 수를 1에서 21 까지 반복하여 해당 클러스터 수로 학습한 데이터의 inertia를 als변수에 저장하고

클러스터 수와 해당 inertia를 plot 으로 시각화 하는 코드다

이 그래프를 보고 elbow method를 사용해서  적절한 클러스터 값을 정해주면 된다

 

 

 

yellowbrick

 

#설치
!pip install yellowbrick
#import
from yellowbrick.cluster import KElbowVisualizer

 

위 코드로 yellow brick의 KEIbowVisualizer를 임포트 한다

yellow brick 역시 엘보우 메서드를 사용하는 방법으로

적절한 k개를 시각화 해서 보여준다

 

사용 방법은

 

#kmeans 모델 선언
model = KMeans()

#선언
Elbow = KElbowVisualizer(model , k=(3,11))

#학습
Elbow.fit(data)
#시각화
Elbow.show()

다음과 같다 여기서 k는 원하는 k의 범위를 적어주면 된다

코드를 실행하면

다음과 같이 적절한 값이 점선으로 표시 된다

 

 

원본 데이터에 클러스터 정리
# 예측
pred = model.predict(x)

# 결과를 데이터 프레임으로 선언
pred = pd.DataFrame(pred, columns = ['pred'])

# 원본과 합치기

result = pd.concat([data, pred], axis = 1)

다음과 같은 코드로 원본 데이터에 pred열을 추가해서 결과를 정리 할 수 있다