728x90
1. 비지도 학습
▶ 지도학습 vs. 비지도학습
- 회귀와 분류는 대표적인 지도학습
- 지도학습은 문제(X)와 정답(y)이 주어진 상태에서 모델이 학습하고,
이후 문제(X)가 주어였을 때 정답(y)을 맞추는 학습
- 지도학습은 문제(X)와 정답(y)이 주어진 상태에서 모델이 학습하고,
- 비지도 학습이란,
- 답(y)를 알려주지 않고 데이터 간 유사성을 이용해서 답(y)을 찾는 방법
- 데이터를 기반으로 레이블링 하는 작업
- 정답이 없는 문제라 지도학습보다 어렵고, 주관적인 판단이 개입하게 됨
- 비지도 학습 예시
- 고객 특성에 따른 그룹화
- ex. 헤비유저, 일반유저
- 구매 내역 별로 데이터 그룹화
- ex. 생필품 구매
- 고객 특성에 따른 그룹화
2. K-평균 군집화 알고리즘 (K-Means Clusturing)
▶ K-Means Clustering
: 분석가가 선정한 K개의 군집 수를 기준으로 데이터들을 군집화함
▶ K-Means Clustering 수행 순서
- 몇 개의 군집으로 나눌 건지 K 지정해주기 (K개 군집 수 결정)
- 나눈 군집 내에서 임의의 중심점 정해주기
- 해당 중심점과 거리가 가까운 데이터를 그룹화해주기
- 군집 안에서 새로운 무게중심으로 중심점 이동시키기
- 이동한 중심점을 기준으로 다시 거리가 가까운 데이터를 그룹화해주기
- 3~5번 반복
▶ K-Means Clustering 특징
- 장점
- 일반적이고 적용하기 쉬움
- 단점
- 군집(K) 선정이 주관적임
- 평균을 이용하기 때문에 중심점이 이상치에 취약함
- 거리 기반으로 가까움을 측정하기 때문에 차원이 많을수록 정확도가 떨어짐
- 반복을 많이 할수록 시간이 느려짐
- Python 라이브러리
- sklearn.cluster.KMeans
- 함수 입력 값
- n_cluster : 군집화 개수
- max_iter : 최대 반복 횟수
- 함수 입력 값
- 메소드
- labels_ : 각 데이터가 속한 군집 중심점 레이블
- cluster_centers : 각 군집 중심점의 좌표
- sklearn.cluster.KMeans
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)
- 함수 입력 값
- sklearn.metrics.sihouette_score :전체 데이터의 실루엣 계수 평균 값 반환
▶ 좋은 군집화의 조건
- 실루엣 값이 높을 수록 (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()
- species가 setosa인 경우에는 다른 데이터들과 조금 떨어져 있어서 K-평균 군집화 알고리즘 학습 결과 데이터도 잘 분류된 것을 볼 수 있음
- 그러나 그 외 나머지 두 종에 대한 학습 결과는 정답 데이터와 다르게 분류 된 것을 볼 수 있음
728x90
댓글