# 와인 데이터를 가지고 실습해 보자.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
import warnings
warnings.filterwarnings('ignore')
# 와인 데이터 가져오기
from sklearn.datasets import load_wine
wine = load_wine()
print(wine.DESCR)
>>
.
.
.
# 변수에 저장하기
data = wine.data
label = wine.target
columns = wine.feature_names
# Dataframe 객체로 만들기
data = pd.DataFrame(data, columns=columns)
# 헤드 정보를 확인해 보면,
data.head()
>>
※ Scikit-Learn의 K-Means 클래스는 기본적으로 유클리디안 거리를 사용하여 군집화를 수행한다.
# 데이터 전처리. K-Means를 사용하여 데이터 평준화 시키기
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data = scaler.fit_transform(data)
# 데이터 크기 확인하기
print(data)
>> (178, 13)
# 13개 columns가 있는 데이터(13차원)가 178개 있다는 것. 데이터를 학습시킬 때 패턴 찾기가 잘 안 될 수 있다.
따라서 차원의 축소가 필요.
# PCA(차원의 축소) 몇 차원으로 줄일 것인지? n_components값을 준다. (2차원)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
data = pca.fit_transform(data)
print(data)
데이터를 확인해 보면,
>>
.
.
.
# 준비된 데이터를 가지고 K-Means를 사용하여 학습시킨다.
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3) # --> low, middle, high로 3개로 분류
#학습하기. (data)를 준다.
kmeans.fit(data)
# 분류 작업하기 전 예측하기
cluster = kmeans.predict(data)
# cluster값 확인해 보기. Numpy배열
print(cluster)
>>
분류가 되었다.
# 데이터 시각화하기
plt.scatter(data[:,0],data[:,1], c=cluster,
edgecolor='black',linewidth=1)
*x값은 데이터에서 0번 항목, y값은 1번 항목
*color값을 cluster로 주면, cluster에 따라 색이 분류된다.
>>
Hierrarchical Clustering
거리나 유사도를 기반으로 클러스터를 형성하는 알고리즘
Step1. 각 데이터 포인트를 클러스터로 할당한다. n개의 클러스터
Step2. 가까운 클러스터끼리 병합한다.
Step3. 1개의 클러스터가 될 때까지 반복한다.
■ 가장 가까운 클러스터를 어떻게 찾을 수 있을까?
Single Linkage: 두 클러스터 내의 가장 가까운 점 사이의 거리
Complete Linkage: 두 클러스터 내의 가장 먼 점 사이의 거리
Average Linkage: 두 클러스터 내의 모든 점 사이의 평균 거리
■ 준비된 데이터를 가지고 Hierarchical Clustering을 사용하여 학습시킨다.
from sklearn.cluster import AgglomerativeClustering
single_clustering = AgglomerativeClustering(n_clusters=3,linkage='single')
complete_clustering = AgglomerativeClustering(n_clusters=3,linkage='complete')
average_clustering = AgglomerativeClustering(n_clusters=3,linkage='average')
# single, complete, average 세 가지 속성을 만든다.
# 학습하기
single_clustering.fit(data)
complete_clustering.fit(data)
average_clustering.fit(data)
# 변수에 저장하기
single_cluster = single_clustering.labels_
complete_cluster = complete_clustering.labels_
average_cluster = average_clustering.labels_
*출력해 보면,
--> 결과를 보니, single은 제대로 분류X, complete로 된 것은 웬만큼 분류O, average는 잘 된 듯하다. 즉 complete나 average로 보는 것이 좋겠다는 결론을 내릴 수 있다.
# 시각화하기. x, y 좌표 주기
plt.scatter(data[:,0],data[:,1],c=single_cluster)