✳️ 비지도 학습
- 답을 알려주지 않고 데이터 간 유사성을 이용해서 답을 지정하는 방법
- 데이터를 기반으로 레이블링하는 작업
- 정답이 없는 문제이기 때문에 지도 학습보다 조금 어렵고 주관적인 판단이 개입
- 대표적인 비지도 학습으로는 K-평균 군집화(K-means clustering)
✳️ K - Means Clustering
💟 수행 순서
- K개 군집 수 설정
- 임의의 중심을 선정
- 해당 중심점과 거리가 가까운 데이터를 그룹화
- 데이터의 그룹의 무게 중심으로 중심점 이동
- 중심점을 이동했기 때문에 다시 거리가 가까운 데이터를 그룹화
(* 3 ~ 5번 반복)
😇 장점
- 일반적이고 적용하기 쉬움
👿 단점
- 거리 기반으로 가까움을 측정하기 때문에 차원이 많을 수록 정확도가 떨어짐
- 반복 횟수가 많을 수록 시간이 느려짐
- 몇 개의 군집(K)을 선정할지 주관적임
- 평균을 이용하기 때문에(중심점) 이상치에 취약함
🐍 Python 라이브러리
- sklearn.cluster.KMeans
- 함수 입력 값
- n_cluster : 군집화 갯수
- max_iter : 최대 반복 횟수
- 메소드
- labels_ : 각 데이터 포인트가 속한 군집 중심점 레이블
- cluster_centers : 각 군집 중심점의 좌표
- 함수 입력 값
✳️ 군집평가 지표
💟 실루엣 계수
: 각 군집 간의 거리가 얼마나 효율적으로 분리되어 있는지 측정
- 정답이 없기 때문에 평가를 하기 쉽지 않다.
- 하지만 군집화가 잘 되어 있다 = 다른 군집간의 거리를 떨어져 있고 동일한 군집끼리는 가까이 있음을 의미
- 이것을 정량화 하기 위해 실루엣 분석을 이용
- 수식
- 해석
→ 1로 갈수록 근처의 군집과 더 멀리 떨어짐.
→ 0에 가까울 수록 근처 군집과 가까워짐
🥸 수식 직독직해
자면 특정한 데이터 i의 실루엣 계수는 얼마나 떨어져있는가 (b(i) - a(i)) 가 클 수록 크며,
이를 단위 정규화를 위해 a(i), b(i) 값 중에 큰 값으로 나눈다.
👍🏻 좋은 군집화의 조건
- 실루엣 값이 높을수록(1에 가까움)
- 개별 군집의 평균 값의 편차가 크지 않아야 함
🐍 Python 라이브러리
- sklearn.metrics.sihouette_score : 전제 데이터의 실루엣 계수 평균 값 반환
- 함수 입력 값
- X : 데이터 세트
- labels : 레이블
- metrics : 측정 기준 기본은 euclidean
- 함수 입력 값
✏️ 간단한 실습으로 알아보는 K-means clustering
- 붓꽃 데이터를 이용
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris_df = sns.load_dataset('iris')
iris_df.head(3)
- sepal_length : 꽃 받침의 길이
- sepal_width : 꽃 받침의 너비
- petal_length : 꽃 잎의 길이
- petal_width : 꽃 잎의 너비
- species(Y, 레이블) : 붓꽃 종(setosa, virginica, versicolor)
- 데이터 탐색 및 시각
iris_df.info()
sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width', hue = 'species')
- 비지도학습을 위한 species 컬럼 제외하여 새로운 데이터프레임 형성
iris_df2 = iris_df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
iris_df2.head()
- KMeans 모델을 이용한 비지도학습 진행
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, random_state=42)
kmeans.fit(iris_df2)
- init은 시작하는 방법을 정할 수 있다. 기본으로는 k-means++이고 random도 있다.
▼ KMeans에 대한 공식 사이트
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
- 군집을 잠깐 확인 해보자
# 군집이 0, 1, 2가 존재하고 1번 데이터는 1번 그룹, 2번도 1번 ... 이런 식으로 군집화가 이루어진 것을 볼 수 있다.
kmeans.labels_
- 군집화된 데이터를 데이터프레임에 저장
iris_df2['target'] = iris_df['species']
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()
- 나름 분류가 잘 되어진 것 같다. 3-4개 차이 정도..?
- 해당 데이터는 이미 정답을 알고 있기 때문에 비교해서 정답과 유사하다고 결론을 내릴 수 있었다.
- 하지만 실제로 정답을 가지고 있지 않는 데이터의 경우에는 군집화된 데이터를 보고 각각의 군집을 정하고 신뢰계수(지표를 이용)를 계산하여 어떤 것이 제일 적절한지 판단해 한다는 이슈가 있다.
'📒 Today I Learn > 🤖 Machine Learning' 카테고리의 다른 글
[딥러닝] 딥러닝 이론 (0) | 2024.08.15 |
---|---|
[머신러닝 심화] 비지도 학습 실습 (0) | 2024.08.14 |
[머신러닝 심화] 분류와 회귀 모델링 심화 실습 (0) | 2024.08.13 |
[머신러닝 심화] 분류와 회귀 모델링 심화 이론 (0) | 2024.08.13 |
[머신러닝 심화] 프로세스 적용 실습 (0) | 2024.08.13 |