Python의 k-평균 클러스터링: 단계별 예


기계 학습 에서 가장 일반적인 클러스터링 알고리즘 중 하나는 k-평균 클러스터링 으로 알려져 있습니다.

K-평균 클러스터링은 데이터 세트의 각 관측치를 K 클러스터 중 하나에 배치하는 기술입니다.

최종 목표는 각 클러스터 내의 관측치가 서로 매우 유사한 반면 다른 클러스터의 관측치는 서로 상당히 다른 K 개의 클러스터를 갖는 것입니다.

실제로 K-평균 클러스터링을 수행하기 위해 다음 단계를 사용합니다.

1. K 값을 선택합니다.

  • 먼저, 데이터에서 식별하려는 클러스터 수를 결정해야 합니다. 종종 우리는 K 에 대해 여러 가지 다른 값을 테스트하고 결과를 분석하여 주어진 문제에 가장 적합한 클러스터 수를 확인해야 합니다.

2. 각 관측치를 1부터 K 까지 초기 클러스터에 무작위로 할당합니다.

3. 클러스터 할당 변경이 중지될 때까지 다음 절차를 수행합니다.

  • K 개의 클러스터 각각에 대해 클러스터의 무게 중심을 계산합니다. 이것은 단순히 k번째 클러스터의 관측값에 대한 p- 평균 특징의 벡터입니다.
  • 중심이 가장 가까운 클러스터에 각 관측치를 할당합니다. 여기서 가장 가까운 것은 유클리드 거리를 사용하여 정의됩니다.

다음 단계별 예제에서는 sklearn 모듈의 KMeans 함수를 사용하여 Python에서 k-평균 클러스터링을 수행하는 방법을 보여줍니다.

1단계: 필요한 모듈 가져오기

먼저 k-평균 클러스터링을 수행하는 데 필요한 모든 모듈을 가져옵니다.

 import pandas as pd
import numpy as np
import matplotlib. pyplot as plt
from sklearn. cluster import KMeans
from sklearn. preprocessing import StandardScaler

2단계: DataFrame 생성

다음으로, 20명의 농구 선수에 대해 다음 세 가지 변수를 포함하는 DataFrame을 만듭니다.

  • 포인트들
  • 돕다
  • 바운스

다음 코드는 이 Pandas DataFrame을 만드는 방법을 보여줍니다.

 #createDataFrame
df = pd. DataFrame ({' points ': [18, np.nan, 19, 14, 14, 11, 20, 28, 30, 31,
                              35, 33, 29, 25, 25, 27, 29, 30, 19, 23],
                   ' assists ': [3, 3, 4, 5, 4, 7, 8, 7, 6, 9, 12, 14,
                               np.nan, 9, 4, 3, 4, 12, 15, 11],
                   ' rebounds ': [15, 14, 14, 10, 8, 14, 13, 9, 5, 4,
                                11, 6, 5, 5, 3, 8, 12, 7, 6, 5]})

#view first five rows of DataFrame
print ( df.head ())

   points assists rebounds
0 18.0 3.0 15
1 NaN 3.0 14
2 19.0 4.0 14
3 14.0 5.0 10
4 14.0 4.0 8

우리는 k-평균 클러스터링을 사용하여 이 세 가지 지표를 기반으로 유사한 행위자를 그룹화할 것입니다.

3단계: DataFrame 정리 및 준비

그런 다음 다음 단계를 수행합니다.

  • dropna()를 사용하여 모든 열에 NaN 값이 있는 행을 삭제합니다.
  • StandardScaler()를 사용하여 평균이 0이고 표준편차가 1이 되도록 각 변수의 크기를 조정합니다.

다음 코드는 이를 수행하는 방법을 보여줍니다.

 #drop rows with NA values in any columns
df = df. dropna ()

#create scaled DataFrame where each variable has mean of 0 and standard dev of 1
scaled_df = StandardScaler(). fit_transform (df)

#view first five rows of scaled DataFrame
print (scaled_df[:5])

[[-0.86660275 -1.22683918 1.72722524]
 [-0.72081911 -0.96077767 1.45687694]
 [-1.44973731 -0.69471616 0.37548375]
 [-1.44973731 -0.96077767 -0.16521285]
 [-1.88708823 -0.16259314 1.45687694]]

참고 : k-평균 알고리즘을 적용할 때 각 변수가 동일한 중요성을 갖도록 스케일링을 사용합니다. 그렇지 않으면 범위가 가장 넓은 변수가 너무 많은 영향을 미치게 됩니다.

4단계: 최적의 클러스터 수 찾기

Python에서 k-평균 클러스터링을 수행하려면 sklearn 모듈의 KMeans 함수를 사용할 수 있습니다.

이 함수는 다음 기본 구문을 사용합니다.

KMeans(init=’random’, n_clusters=8, n_init=10, random_state=None)

금:

  • init : 초기화 기술을 제어합니다.
  • n_clusters : 관측치를 배치할 클러스터 수입니다.
  • n_init : 수행할 초기화 횟수입니다. 기본값은 k-평균 알고리즘을 10회 실행하고 SSE가 가장 낮은 알고리즘을 반환하는 것입니다.
  • random_state : 알고리즘 결과를 재현 가능하게 만들기 위해 선택할 수 있는 정수 값입니다.

이 함수의 가장 중요한 인수는 관찰을 배치할 클러스터 수를 지정하는 n_clusters입니다.

하지만 몇 개의 클러스터가 최적인지 미리 알 수 없으므로 모델의 SSE(합계 오차 제곱합)와 함께 클러스터 수를 표시하는 그래프를 만들어야 합니다.

일반적으로 이러한 유형의 플롯을 생성할 때 제곱합이 “구부러지거나” 수평을 이루기 시작하는 “무릎”을 찾습니다. 이는 일반적으로 최적의 클러스터 수입니다.

다음 코드는 x축에 클러스터 수를 표시하고 y축에 SSE를 표시하는 이러한 유형의 플롯을 생성하는 방법을 보여줍니다.

 #initialize kmeans parameters
kmeans_kwargs = {
" init ": " random ",
" n_init ": 10,
" random_state ": 1,
}

#create list to hold SSE values for each k
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, ** kmeans_kwargs)
    kmeans. fit (scaled_df)
    sse. append (kmeans.inertia_)

#visualize results
plt. plot (range(1, 11), sse)
plt. xticks (range(1, 11))
plt. xlabel (" Number of Clusters ")
plt. ylabel (“ SSE ”)
plt. show () 

이 그래프에서는 k = 3개 클러스터 에 꼬임 또는 “무릎”이 있는 것으로 나타납니다.

따라서 다음 단계에서 k-평균 클러스터링 모델을 피팅할 때 3개의 클러스터를 사용하겠습니다.

참고 : 실제 세계에서는 사용할 클러스터 수를 선택하기 위해 이 플롯과 도메인 전문 지식을 조합하여 사용하는 것이 좋습니다.

5단계: 최적 K를 사용하여 K-평균 군집화 수행

다음 코드는 3의 k 에 대한 최적 값을 사용하여 데이터 세트에서 k-평균 클러스터링을 수행하는 방법을 보여줍니다.

 #instantiate the k-means class, using optimal number of clusters
kmeans = KMeans(init=" random ", n_clusters= 3 , n_init= 10 , random_state= 1 )

#fit k-means algorithm to data
kmeans. fit (scaled_df)

#view cluster assignments for each observation
kmeans. labels_

array([1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0]) 

결과 테이블에는 DataFrame의 각 관찰에 대한 클러스터 할당이 표시됩니다.

이러한 결과를 더 쉽게 해석할 수 있도록 각 플레이어의 클러스터 할당을 표시하는 열을 DataFrame에 추가할 수 있습니다.

 #append cluster assingments to original DataFrame
df[' cluster '] = kmeans. labels_

#view updated DataFrame
print (df)

points assists rebounds cluster
0 18.0 3.0 15 1
2 19.0 4.0 14 1
3 14.0 5.0 10 1
4 14.0 4.0 8 1
5 11.0 7.0 14 1
6 20.0 8.0 13 1
7 28.0 7.0 9 2
8 30.0 6.0 5 2
9 31.0 9.0 4 0
10 35.0 12.0 11 0
11 33.0 14.0 6 0
13 25.0 9.0 5 0
14 25.0 4.0 3 2
15 27.0 3.0 8 2
16 29.0 4.0 12 2
17 30.0 12.0 7 0
18 19.0 15.0 6 0
19 23.0 11.0 5 0

클러스터 열에는 각 플레이어가 할당된 클러스터 번호(0, 1 또는 2)가 포함됩니다.

동일한 클러스터에 속한 플레이어는 포인트 , 어시스트리바운드 열에 대해 대략 유사한 값을 갖습니다.

참고 : 여기에서 sklearnKMeans 기능에 대한 전체 문서를 찾을 수 있습니다.

추가 리소스

다음 튜토리얼에서는 Python에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

Python에서 선형 회귀를 수행하는 방법
Python에서 로지스틱 회귀를 수행하는 방법
Python에서 K-Fold 교차 검증을 수행하는 방법

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다