자료를 공개한 저자 오렐리앙 제롱과 강의자료를 지원한 한빛아카데미에게 진심어린 감사를 전합니다.
n_clusters
) 지정해야 함.from sklearn.cluster import KMeans
k = 5
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)
KMeans
모델의 score()
메서드가 관성의 음숫값을 계산함. n_init = 10
이 기본값으로 사용됨. 즉, 10번 학습 후 가장 낮은 관성을 갖는 모델 선택.k-평균++ 초기화 알고리즘
센트로이드를 무작위로 초기화하는 대신 특정 확률분포를 이용하여 선택하여 센트로이드들 사이의 거리를 크게할 가능성이 높아짐.
기본 아이디어: 주피터 노트북 참조
Elkan 알고리즘
MiniBatchMeans
모델이 지원.from sklearn.cluster import MiniBatchKMeans
minibatch_kmeans = MiniBatchKMeans(n_clusters=5, random_state=42)
minibatch_kmeans.fit(X)
memmap
활용memmap
활용이 불가능할 정도로 큰 데이터셋인 경우MiniBatchKMeans
의 partial_fit()
메서드 활용군집수가 커질 수록 k-평균보다 훨씬 빠르게 훈련됨. 하지만 성능 차이는 상대적으로 커짐.
아래 왼편 그림에서 보면 군집수 $k$가 커져도 성능 차이가 유지됨. 하지만 성능 자체가 좋아지므로 두 모델의 상대적 성능 차이는 점점 벌어짐을 의미함.
샘플별 실루엣 계수
$$\frac{b - a}{\max(a, b)}$$
k=5
도 좋은 선택이 될 수 있지만 확실하지는 않음.실루엣 다이어그램: 군집별 실루엣 계수들의 모음. 군집별로 칼날 모양 형성.
빨간 파선: 군집별 실루엣 점수. 대부분의 칼날이 빨간 파선보다 길어야 함.
칼날의 두께가 서로 비슷해야, 즉, 군집별 크기가 비슷해야 좋은 모델임.
따라서 k=5
가 보다 좋은 모델임.
transform()
메서드n
차원의 데이터셋을 k
차원의 데이터셋으로 변환함. pipeline = Pipeline([
("kmeans", KMeans(n_clusters=50, random_state=42)),
("log_reg", LogisticRegression(multi_class="ovr", solver="lbfgs", max_iter=5000)),
])
pipeline.fit(X_train, y_train)
eps
: $\varepsilon$-이웃 범위min_samples
: $\varepsilon$ 반경 내에 위치하는 이웃의 수min-samples
개의 이웃을 갖는 샘플from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.05, min_samples=5)
dbscan.fit(X)
predict()
메서드 지원하지 않음.KNeighborsClassifier
등 보다 좋은 성능의 분류 알고리즘 활용 가능.from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=50)
knn.fit(dbscan.components_, dbscan.labels_[dbscan.core_sample_indices_])
eps
가 커질 경우.GaussianMixture
모델 적용n_components
: 군집수 지정n_init
: 모델 학습 반복 횟수. from sklearn.mixture import GaussianMixture
gm = GaussianMixture(n_components=3, n_init=10, random_state=42)
gm.fit(X)
covariance_type
설정.BIC: Bayesian information criterion
$$ \log(m)\, p - 2 \log (\hat L)$$
AIC: Akaike information criterion
$$ 2\, p - 2 \log (\hat L)$$
n_components
에 전달해야 함.from sklearn.mixture import BayesianGaussianMixture
bgm = BayesianGaussianMixture(n_components=10, n_init=10, random_state=42)
bgm.fit(X)
>>> np.round(bgm.weights_, 2)
array([0.4 , 0.21, 0.4 , 0. , 0. , 0. , 0. , 0. , 0. , 0. ])
weight_concentration_prior
하이퍼파라미터n_components
에 설정된 군집수에 대한 규제로 사용됨.n_components
에 설정된 군집수가 유지되도록 함.