wine_data.csv
0.00MB

Applied unsupervised learning with python 책을 기반으로 작성된 글입니다.

 

1. 클러스터링

1.1)클러스터링이란?

하나의 데이터를 여러개의 부분집합 (clusters) 으로 분할하는 것을 의미한다.

1.2) 클러스터링을 하는 이유?

데이터 셋에 존재하는 데이터의 유사성을 찾을 수 있다는 것은 근복적인 의미를 찾을려고 할때 상당히 유용해서

 

2. 계층적 클러스터링

-트리 기반의 데이터 구조이다.

 

 

2.1) 계층적 클러스터링의 접근 방식

a. 응집 계층적 클러스터링 방식(Agglomerative)

- 위에서 아래로 접근하는 방식

- 응집은 탐욕적인 특성 때문에 가끔은 잘못된 이웃을 선택해 잘못된 클러스터를 구성한다.

- 각 데이터 지점에서 시작해 유사한 지점들을 함께 결합해 클러스터를 형성한다.

 

b. 분산 계층적 클러스터링 방식(Divisive)

- 아래에서 위로 접근하는 방식

- 전체 데이터를 하나로 보고 출발하면서 최선의 방식을 찾아 클러스터를 나눈다는 장접을 가진다.

- 시간 복잡도가 높아서 응집에 비해 시간 소요가 크다. 그렇지만 정확도를 높일 수 있다.

 

// 두 방식의 성능은 서로 달라서, 전체 데이터셋이 무엇인지 아는 것은 좀더 정확하게 클러스터를 구분해내는 능력으로 이어진다. 그리고 일반적인 경우 응집 방식을 오히려 선호하는게 일반적이고 결과가 마음에 들지 않으면 분산 방식을 시도하는게 합리적인 선택이 된다.

 

2.2) 연결 기준

-연결은 클러스터 간의 거리를 계산할 수 있는 방법을 결정하는 개념이다.

a. 중심 연결

- K평균에서 사용햇던 중심점 탐색 방식과 같다.

- 데이터에 노이즈가 많고 중심점이 명확하지 않으면 잘 동작하지 않는다는 단점이 있다.

 

b. 단일 연결

- 연결기준으로 두 클러스터 사이의 점 쌍 사이의 최소 거리를 찾아낸다.

- 즉, 두 클러스터 사이의 가장 가까운 점에 기반해 클러스터를 결합한다

 

b.1) 단일 연결을 선택하는 이유?

- 기본적으로 데이터 간의 유사성이 높기 때문이며, 만일 이때 차이점이 존재한다면 데이터가 극도로 달라지기 때문에 가장 가까운 지점을 찾아 동작하기 때문에 먼 거리에 있는 이상한 데이터에 영향을 받지 않아서.

 

c. 완전 연결

- 연결 기준으로 두 클러스터 사이의 점 쌍 사이의 최대 거리를 찾아낸다.

- 즉, 두 클러스터 사이의 가장 먼 점을 기준으로 클러스터를 결합한다

 

c.1) 완전 연결을 선택하는 이유?

- 데이터가 클러스터 간에 멀리 떨어져 있고 클러스터 내부의 밀집도는 매우 높을때 좋은 결과를 보여줘서.

 

// 그래서  일반적으로 가장 좋은 접근법은 몇가지 연결 옵션을 시도해보고 목적에 가장 맞는 방법을 선택하는 것이다.

 

<예제 하기전 알아야 할것은 >

AgglomerativeClustering 함수의  파라미터(매개변수)

* n_clusters : 클러스터의 개수

* affinity : 거리 함수의 정의

* linkage : 연결기준 옵션

 

< 연습문제 >

만약 당신은 상점 재고를 관리하며 많은 양의 와인을 받고 있다. 하지만 운송 중 브랜드 라벨이 병에서 떨어졌다. 다행히 공급업체가 각각의 일련 번호와 함께 각 병에 관한 화학적인 수치를 제공했다. 하지만 와인 병을 일일이 열고 그 차이를 시험할 수가 없다. 라벨이 부착되지 않은 병을 화학 물질 측정치에 따라 다시 묶을 수 있는 방법을 찾아야 한다. 주문 목록에서 3가지 유형의 와인을 주문했고, 와인 유형을 다시 그룹화하기 위해 2가지 와인 속성만(X_feature) 제공 받았다고 하자

 

//필요한 모듈 임포트

from sklearn.cluster import KMeans
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score
import pandas as pd
import matplotlib.pyplot as plt

// 와인 데이타 pandas로 로드

wine_df = pd.read_csv("wine_data.csv")

// 와인데이타 시각화

plt.scatter(wine_df.values[:,0], wine_df.values[:,1])
plt.title("Wine Dataset")
plt.xlabel("OD Reading")
plt.ylabel("Proline")
plt.show()

 

//K평균으로 클러스터링

km = KMeans(3)     // 클러스터링 할 갯수 3개 설정
km_clusters = km.fit_predict(wine_df)  // K평균으로 클러스터링 예측

 

//응집 계층적 클러스터링으로 클러스터링

ac = AgglomerativeClustering(3, linkage='average')   //클러스터링 할 갯수 3개 설정및 연결지점 중심연결로 설정
ac_clusters = ac.fit_predict(wine_df)      //응집 클러스터링으로 예측

 

//  k평균 클러스터링 그림 산포도로 시각화

plt.scatter(wine_df.values[:,0], wine_df.values[:,1], c=km_clusters)
plt.title("Wine Clusters from Agglomerative Clustering")
plt.xlabel("OD Reading")
plt.ylabel("Proline")
plt.show()

// 응집 계층적 클러스터링 그림으로 시각화

plt.scatter(wine_df.values[:,0], wine_df.values[:,1], c=ac_clusters)
plt.title("Wine Clusters from Agglomerative Clustering")
plt.xlabel("OD Reading")
plt.ylabel("Proline")
plt.show()

// 위에 예측된 클러스터링에 대한 평가를 실루엣 점수로

print("Silhouette Scores for Wine Dataset:\n")
print("K-Means Clustering: ", silhouette_score(wine_df, km_clusters))
print("Agg Clustering: ", silhouette_score(wine_df, ac_clusters))

 

3. 실루엣 점수

- 얼마나 클러스터에 잘 맞는지를 분석해주는 지표

- 1에서 -1까지 숫자로 나타낸다.

- 만약 1이면 완벽하게 클러스터가 구분돼 전혀 혼란이 없는 상태를 의미한다.

+ Recent posts