머신러닝 | 군집화 알고리즘 | K-평균 군집화 알고리즘 (K-Means Clustering) 이론 | 군집 평가 지표 (실루엣 계수) | 비지도 학습

    728x90

     

    1. 비지도 학습

     

    ▶ 지도학습 vs. 비지도학습

    • 회귀와 분류는 대표적인 지도학습
      • 지도학습은 문제(X)와 정답(y)이 주어진 상태에서 모델이 학습하고,
        이후 문제(X)가 주어였을 때 정답(y)을 맞추는 학습 
    • 비지도 학습이란,
      • 답(y)를 알려주지 않고 데이터 간 유사성을 이용해서 답(y)을 찾는 방법
      • 데이터를 기반으로 레이블링 하는 작업
      • 정답이 없는 문제라 지도학습보다 어렵고, 주관적인 판단이 개입하게 됨
    • 비지도 학습 예시
      • 고객 특성에 따른 그룹화
        • ex. 헤비유저, 일반유저
      • 구매 내역 별로 데이터 그룹화
        • ex. 생필품 구매

    2. K-평균 군집화 알고리즘 (K-Means Clusturing)

     

    ▶ K-Means Clustering

    : 분석가가 선정한 K개의 군집 수를 기준으로 데이터들을 군집화함

     

    ▶ K-Means Clustering 수행 순서

     

    1.  몇 개의 군집으로 나눌 건지 K 지정해주기 (K개 군집 수 결정)
    2. 나눈 군집 내에서 임의의 중심점 정해주기
    3. 해당 중심점과 거리가 가까운 데이터를 그룹화해주기
    4. 군집 안에서 새로운 무게중심으로 중심점 이동시키기
    5. 이동한 중심점을 기준으로 다시 거리가 가까운 데이터를 그룹화해주기
    6. 3~5번 반복

     

    ▶ K-Means Clustering 특징

    • 장점
      • 일반적이고 적용하기 쉬움
    • 단점
      • 군집(K) 선정이 주관적임 
      • 평균을 이용하기 때문에 중심점이 이상치에 취약함
      • 거리 기반으로 가까움을 측정하기 때문에 차원이 많을수록 정확도가 떨어짐
      • 반복을 많이 할수록 시간이 느려짐
    • Python 라이브러리
      • sklearn.cluster.KMeans
        • 함수 입력 값
          • n_cluster : 군집화 개수
          • max_iter : 최대 반복 횟수
      • 메소드
        • labels_ : 각 데이터가 속한 군집 중심점 레이블
        • cluster_centers : 각 군집 중심점의 좌표

    3. 군집 평가지표

     

    ▶ 실루엣 분석 (silhouette analysis)

    : 군집화가 잘 되어 있다는 것은 동일한 군집 내의 데이터끼리는 가까이 있고, 다른 군집과의 거리는 떨어져 있다는 것

    : 실루엣 분석이란, 각 군집 간의 거리가 얼마나 효율적으로 분리되어 있는지 정량적으로 측정하는 방법

     

    ▶ 실루엣 계수

    • 수식
      • S(i) : 데이터 i에 대한 실루엣 계수
      • b(i) - a(i) : 두 데이터 사이의 떨어진 거리
      • max(a(i), b(i)) : a(i)와 b(i) 값 중에 큰 값

    • 해석
      • 특정한 데이터 i의 실루엣 계수는 데이터 사이의 거리가 얼마나 떨어져 있는가(b(i) - a(i))가 클수록 큼
      • 이를 단위 정규화 해주기 위해 a(i)와 b(i) 값 중에 큰 값으로 나누는 것
      • S(i)가 1에 가까울수록 근처의 군집과 멀리 떨어져 있다는 의미이고,
        0에 가까울수록 근처의 군접과 가까이 있다는 것을 의미함 
    • Python 라이브러리
      • sklearn.metrics.sihouette_score :전체 데이터의 실루엣 계수 평균 값 반환
        • 함수 입력 값
          • X : 데이터 세트
          • labels : 레이블
          • metrics : 측정 기준 (기본값은 euclidean)

     

    ▶ 좋은 군집화의 조건

    • 실루엣 값이 높을 수록 (1에 가까울 수록) 좋은 군집화임
    • 개별 군집의 평균 값의 편차가 크지 않아야 함

    4. K-평균 군집화 알고리즘 실습

     

    ▶ 붓꽃 데이터를 이용한 군집화 실습

    iris_df = sns.load_dataset('iris')
    iris_df.head(3)

    • sepal_length : 꽃받침 길이
    • sepal_width : 꽃받침 넓이
    • petal_length : 꽃잎 길이
    • petal_width : 꽃잎 넓이
    • species : 붓꽃 종(setosa, virginica, versicolor)  → y, 레이블
      • 만약에 꽃에 대한 정보(X)를 가지고 species(y)를 맞추는 문제였다면 이건 지도학습임
      • species가 없다고 생각하고, 데이터 분류해보기

     


    ▶ 붓꽃 종(species) 분류하기

    # 라이브러리 가져오기
    import pandas as pd
    import matplotlib.pyplot as plt 
    import seaborn as sns
    
    # 붓꽃 데이터 읽어오기
    iris_df = sns.load_dataset('iris')
    
    # 붓꽃 데이터 정보 살펴보기
    iris_df.info()
    
    # 비지도학습 실습이기 때문에 정답 데이터인 species를 제외한 붓꽃 데이터프레임 만들기
    iris_df2 = iris_df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
    
    
    
    # KMeans 모델링
    from sklearn.cluster import KMeans
    
    kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, random_state=42)
    kmeans.fit(iris_df2)
    
    # 학습 완료 후 어떤 군집으로 분류했는지 확인
    kmeans.labels_
    
    
    # 우리가 맞추고 싶은 species 데이터는 target 컬럼에 넣고,
    iris_df2['target'] = iris_df['species']
    
    # KMeans 모델링으로 학습해서 나온 군집화 결과는 cluster 컬럼에 넣기
    iris_df2['cluster'] = kmeans.labels_
    
    # 정답, 학습결과 데이터 비교해보기
    iris_df2
    
    
    
    # 정답, 학습결과 데이터 시각화
    plt.figure(figsize=(12,6))
    plt.subplot(1,2,1)
    sns.scatterplot(data=iris_df2, x='sepal_length', y='sepal_width', hue='target')
    plt.title('Original')
    
    plt.subplot(1,2,2)
    sns.scatterplot(data=iris_df2, x='sepal_length', y='sepal_width', hue='cluster', palette='viridis')
    plt.title('Clustering')
    plt.show()

    • speciessetosa인 경우에는 다른 데이터들과 조금 떨어져 있어서 K-평균 군집화 알고리즘 학습 결과 데이터도 잘 분류된 것을 볼 수 있음
    • 그러나 그 외 나머지 두 종에 대한 학습 결과는 정답 데이터와 다르게 분류 된 것을 볼 수 있음
    728x90

    댓글