인공지능 머신러닝 - K-Means 모델

반응형

# K-Means

  • Unsupervised Learning
  • K개의 그룹 데이터들의 평균을 구하고 특정 그룹으로 분류 하는 것 (= Clustering)

 

  • 클러스터링 된 데이터들의 각 중심의 데이터를 구하고 최적의 K값(클러스터)을 탐색하는 것이 목표
    (= Elbow Method)
    • 그래프가 특정 지점에서 급격히 변하여 팔꿈치 모양이 되는 곳
    • X축과 거의 평행하기 시작하는 지점에 해당하는 K값을 최적 K값 혹은 최적 클러스터 값이라 함

 

# K-Means 라이브러리 호출

import matplotlib.pyplot as plt
# 표 작성을 위한 라이브러리

import pandas
# 데이터프레임 사용을 위한 라이브러리

from sklearn.preprocessing import StandardScaler
# 피처 스케일링 표준화 사용을 위한 라이브러리

from sklearn.model_selection import train_test_split
# 인공지능 학습을 위한 라이브러리

from sklearn.cluster import KMeans
# KMeans 인공지능 모델링을 위한 라이브러리

from sklearn.metrics import confusion_matrix, accuracy_score
# 인공지능 성능을 확인하기 위한 라이브러리

 

# KMeans 모델로 인공지능 학습하기

  • 소득과 소비점수를 분석해서 고객별 그룹 분류
  • 예시에 쓰일 데이터프레임

 

 

 

 

1. 데이터 준비

  • 우선 NaN값이 존재하는지 확인, 존재하면 NaN처리

 

  • 변수 지정, 데이터(X) 분리
    • X : 수입(Annual Income (k$)) / 소비점수(Spending Score (1-100))

 

2. 최적의 클러스터 값 확인 및 KMeans 모델링

  • from sklearn.cluster import KMeans 호출
  • KMeans(n_clusters= n1 , random_state= n2 )
    • n_clusters : n1의 갯수만큼 그룹을 K개로 분류
    • random_state : n2의 숫자의 시드 값 사용

 

  • 최적의 클러스터 값 확인하기
    • 2개부터 10개까지의 클러스터를 학습시켜 클러스터별 데이터를 저장
    • wcss : K개의 그룹 중심 데이터
    • wcss의 값을 엘보우 메소드를 활용하여 최적의 클러스터 값 확인
      • 최적의 클러스터 값에 정답은 없으니 개인 선택에 맞게 선택, 본인은 5로 선택

 

 

  • 찾은 클러스터의 값을 이용하여 KMeans 모델링
    • 엘보우 메소드를 보고 5가 적합하다고 생각하여 5로 설정

 

3. 인공지능 성능 테스트

 

4. 인공지능 학습 결과 시각화

plt.figure(figsize=[12,8])
plt.scatter(X.values[y_pred == 0, 0], X.values[y_pred == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X.values[y_pred == 1, 0], X.values[y_pred == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X.values[y_pred == 2, 0], X.values[y_pred == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X.values[y_pred == 3, 0], X.values[y_pred == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X.values[y_pred == 4, 0], X.values[y_pred == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()

반응형