ML (MachineLearning)

K-Means 알고리즘

567Rabbit 2024. 4. 16. 11:06

머신러닝의 비지도(unsupervised)학습

1. 평할/분할 기반의 군집 (Partition-based Clustering)

- 비슷한 특징을 갖는 데이터끼리 묶는것이다

- 주어진 데이터에 대해 미리 정의된 수의 군집을 형성하며, 데이터를 해당 군집에 할당하는 방식으로 동작한다

ex ) K-Means Clusterin

 

2. 계층적 군집 (Hierarchical Clustering)

- 데이터를 순차적 또는 계층적으로 그룹화하는 알고리즘

- 데이터 포인트 간의 거리 또는 유사도를 기반으로 계층 구조를 형성하여 군집을 형성

- 계층적인 구조를 가지고 있어 군집화 결과를 다양한 수준에서 살펴볼 수 있으며, 시각적으로 표현하기 쉽다

- 사전에 군집의 개수를 지정할 필요가 없어 편리

- 큰 데이터셋에 대해서는 계산 비용이 증가할 수 있고, 특정 수준에서의 군집화 결과를 해석하는 것이 어려울 수 있다

ex ) 병합 군집화 (Agglomerative Clustering) , 분할 군집화 (Divisive Clustering)

 

 

 

 

K-Means

- AI(인공지능)이 입력세트에서 패턴과 상관관계를 찾아내는 머신러닝 알고리즘이다.

- 비지도학습 중 가장 많이 쓰이는 방식이다.

- 평균을 찾아가며 y를 스스로 찾는 방식이다.

- 군집은 사람이 할당해야 한다.

 

 

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

 

 

 

# Annual Income (k$) 에 비해서 Spending Score (1-100) 이 높은 그룹으로 묶기

 

df

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100)
0 1 Male 19 15 39
1 2 Male 21 15 81
2 3 Female 20 16 6
3 4 Female 23 16 77
4 5 Female 31 17 40
... ... ... ... ... ...
195 196 Female 35 120 79
196 197 Female 45 126 28
197 198 Male 32 126 74
198 199 Male 32 137 18
199 200 Male 30 137 83

 

 

 

 

nan값 정리하기

 

df.isna().sum()

CustomerID                0
Genre                     0
Age                       0
Annual Income (k$)        0
Spending Score (1-100)    0
dtype: int64
 
 
 

 

 

X값 정하기

 

 
- 비지도학습은 y값을 머신러닝에 학습시키지 않는다
 
 
 
X = df.iloc[ : , 1 : ]
 
 
 
X
  Genre Age Annual Income (k$) Spending Score (1-100)
0 Male 19 15 39
1 Male 21 15 81
2 Female 20 16 6
3 Female 23 16 77
4 Female 31 17 40
... ... ... ... ...
195 Female 35 120 79
196 Female 45 126 28
197 Male 32 126 74
198 Male 32 137 18
199 Male 30 137 83

 

 

 

 

 

문자열 숫자로 바꾸기

 

X['Genre'].unique()

array(['Male', 'Female'], dtype=object)

 

'Male'과 'Female' 2개이므로 0과 1로만 바꾸면 되기때문에, 원핫인코딩(3개 이상)이 아닌 라벨 인코딩으로 하면 된다 

 

 

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()

X['Genre'] = encoder.fit_transform(X['Genre'])

 

 

X

  Genre Age Annual Income (k$) Spending Score (1-100)
0 1 19 15 39
1 1 21 15 81
2 0 20 16 6
3 0 23 16 77
4 0 31 17 40
... ... ... ... ...
195 0 35 120 79
196 0 45 126 28
197 1 32 126 74
198 1 32 137 18
199 1 30 137 83

 

 

 

sorted(X['Genre'].unique())

['Female', 'Male']

 

'Female'이 0, 'Male'이 1이라는 것을 알 수 있다.

 

 

 

K-means는 피쳐스케일링 단계를 거치지 않는다

 

 

 

 

WCSS

from sklearn.cluster import KMeans

 

KMeans(n_clusters = ???, random_state=10)  

 

n_clusters = ?  몇개 그룹으로 할건지 모르기 때문에 ??? 부분을 찾아야 한다 이 ???를 WCSS라고 한다

 

 

wcss를 구하는 방법은 다음과 같다

wcss = []
for i in range (1, 10+1) :
    kmeans = KMeans(n_clusters = i,random_state=10)
    kmeans.fit(X)
    wcss.append( kmeans.inertia_ )

 

i를 1부터 10까지 반복하여 넣어보면서, 어떤 군집갯수가 좋은지 그래프로 보려고 한다.

random_state는 random의 seed와 같은 개념으로 본인이 원하는 숫자 또는 회사에서 정한 숫자를 넣어주면 된다.

(이것이 드러나면 해킹 보안에 취약해진다)

 

 

inertia ?
# 여러 개의 순회 가능한(iterable) 객체를 인자로 받고 각 객체가 담고 있는 원소를 차례로 접근할 수 있다
# 마치 옷의 지퍼를 올리는 것처럼 양측에 있는 데이터를 하나씩 차례로 짝을 지어준다

 

 

plt.plot(wcss)
plt.show()

 

 

# 밑의 그래프처럼 k값에 대한 관성을 시각화한 것을 elbow method(팔꿈치) 방식이라고 한다.

 

 

여기서 군집이 적게 있을수록 오차가 크고,  군집이 여러개 있을수록 오차가 적다는 것을 알 수 있다.

그러므로 사람이 보기에 오차가 적으면서, 군집이 너무 크지 않은 효율적인 군집 갯수를 정해야 한다

 

그래프로 보았을 때, 5개의 군집이 적당한 것 같다고 생각하였다.

 

 

 

 

예측하기

 

KMeans(n_clusters = 5, random_state=10)

y_pred = kmeans.fit_predict(X)

y_pred

 

 

df['Group'] = y_pred

 

df

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100) Group
0 1 Male 19 15 39 3
1 2 Male 21 15 81 1
2 3 Female 20 16 6 3
3 4 Female 23 16 77 1
4 5 Female 31 17 40 3
... ... ... ... ... ...  
195 196 Female 35 120 79 2
196 197 Female 45 126 28 0
197 198 Male 32 126 74 2
198 199 Male 32 137 18 0
199 200 Male 30 137 83 2

 

 

 

# 연간 income(수입)에 비해 소비 점수가 높은 그룹 4를 가져와봤다

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100) Group
46 47 Female 50 40 55 4
47 48 Female 27 40 47 4
48 49 Female 29 40 42 4
49 50 Female 31 40 42 4
50 51 Female 49 42 52 4
... ... ... ... ... ... ...
120 121 Male 27 67 56 4
121 122 Female 38 67 40 4
122 123 Female 40 69 58 4
126 127 Male 43 71 35 4
142 143 Female 28 76 40 4