Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 팔방이익구조
- allra
- 선정산서비스
- 데이터분석
- 전환율
- model_selection
- aarrr
- 올라
- 퍼널분석
- 리텐션
- pmf
- 핀테크
- 서말리포켓
- 머신러닝
- BM분석
- 코호트
- mysql설치 #mysql #mysqluser #mysqlworkbench
- retention
- 인게이지먼트
- fundbox
- CAC
- sklearn
- 바로팜
- activation
- 한장으로끝내는비즈니스모델100
- 역설구조
- 활성화
- 셀프스토리지
- 비즈니스모델
- 그로스해킹
Archives
- Today
- Total
데이터로그😎
[비지도 학습] 군집: KMeans, GMM 본문
KMeans vs GMM
k-means | GMM(Gaussian Mixture Model) | |
군집 개수 | 군집 개수 parameter 사전 설정 | |
군집 방식 | 거리 기반 | 확률 기반 |
언제 사용? | 클러스터 개수를 미리 알고 있을 때 | |
진행 과정 |
|
|
파라미터 |
|
|
메소드 |
|
|
속성 |
|
|
|
|
KMeans
데이터 준비
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
%matplotlib inline
iris = load_iris()
irisDF = pd.DataFrame(data =iris.data, columns = iris.feature_names)
irisDF
KMeans
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter = 300,
random_state=0)
kmeans.fit(irisDF)
irisDF['target'] = iris.target
irisDF['cluster'] = kmeans.labels_
target 별 군집 수 확인
irisDF.groupby(['target','cluster'])['sepal length (cm)'].count()
>>>
target cluster
0 1 50
1 0 48
2 2
2 0 14
2 36
Name: sepal length (cm), dtype: int64
target0, 1까지는 대략 잘 나눠져 있는데, target2는..애매하다?
PCA(4->2차원) & 시각화
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca_transformed = pca.fit_transform(iris.data)
irisDF['pca_x'] = pca_transformed[:,0]
irisDF['pca_y'] = pca_transformed[:,1]
cluster0=irisDF[irisDF['cluster']==0]
cluster1=irisDF[irisDF['cluster']==1]
cluster2=irisDF[irisDF['cluster']==2]
# cluster 0 = 파랑
# cluster 1 = 빨강
# cluster 2 = 초록
plt.scatter(x=cluster0['pca_x'],y=cluster0['pca_y'],color='blue')
plt.scatter(x=cluster1['pca_x'],y=cluster1['pca_y'],color='red')
plt.scatter(x=cluster2['pca_x'],y=cluster2['pca_y'],color='green')
cluster1(red)는 명확하게 다른 군집들과 잘 분리되어 있음.
cluster0(blue), cluster2(green)도 상당 수준 잘 분리되어 있지만, cluster1만큼 명확하게 분리되어 있지는 않음.
GMM
- 가정:
- 데이터가 여러개의 가우시안 분포를 가진 데이터 집합들이 섞여서 생성되었다.
- 데이터는 여러개의 가우시안 분포가 섞여있는 것
- 가우시안 분포 = 정규분포 = 평균 0, 표준편차 1
- 먼저 정규분포 형태 몇가지를 추출해놓고 각 데이터가 이 중 어디에 속할 것인지를 판별하는 것.
- 모수 추정을 위해 EM(expectation, maximization) 사용:
- Expectation: 개별 데이터들이 특정 정규분포에 소속될 확률을 구하고, 가장 높은 확률을 가진 정규분포에 소속(최초시에는 임의로 특정 정규 분포에 소속)
- Maximization: 데이터들이 특정 정규분포로 소속되면, 다시 해당 정규분포의 평균과 분산 구함. 해당 데이터가 발견될 수 있는 가능도를 최대화할 수 있도록 평균과 분산(모수)를 구함
데이터 준비
import warnings
warnings.filterwarnings('ignore')
from sklearn.datasets import load_iris
from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
iris = load_iris()
# iris 데이터프레임 만들
irisDF = pd.DataFrame(data = iris.data, columns = iris.feature_names)
irisDF['target'] = iris.target
GMM
gmm = GaussianMixture(n_components=3, random_state = 0)
gmm_cluster_labels = gmm.fit_predict(iris.data)
irisDF['gmm_cluster'] = gmm_cluster_labels
군집 결과
iris_result = irisDF.groupby(['target'])['gmm_cluster'].value_counts()
iris_result
>>>>
target gmm_cluster
0 0 50
1 2 45
1 5
2 1 50
Name: gmm_cluster, dtype: int64
확인결과 대체로 잘 맵핑. 이제 KMeans와 비교할 것
KMeans vs GMM
KMeans | GMM | |
군집 결과 | target kmeans_cluster 0 1 50 --------------------- 1 0 48 2 2 ---------------------- 2 0 14 2 36 |
target gmm_cluster 0 0 50 ------------------------- 1 2 45 1 5 -------------------------- 2 1 50 |
- Kmeans보다 GMM이 군집화 더 잘됨.
- GMM을 보면 target이 1일 때 cluster가 1로 5개 분리된 것 빼고는 거의 잘 나뉨.
- 이는 GMM이 더 뛰어난 알고리즘이라는 소리가 아니고, 이 iris 데이터에 GMM이 더 잘맞고 효과적이라는 뜻임.
'#4. 기타 공부 > #4.2. 머신러닝' 카테고리의 다른 글
[비지도 학습] 군집 평가 (0) | 2023.09.05 |
---|---|
[비지도 학습] 군집: Meanshift vs DBSCAN (0) | 2023.09.05 |
[비지도 학습] 군집 (clustering) (0) | 2023.09.05 |
[차원축소] SVD (Singular Value Decomposition) (0) | 2023.09.05 |
[차원축소] LDA (Linear Descriminant Analysis) (0) | 2023.09.05 |