가우시안 혼합 모델 선택

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 정보 이론 기준을 사용하여 가우시안 혼합 모델 (GMM) 을 이용한 모델 선택 방법을 배웁니다. 모델 선택은 모델의 공분산 유형과 구성 요소 수 모두를 고려합니다. 적절한 모델을 선택하기 위해 아카이케 정보 기준 (AIC) 과 베이즈 정보 기준 (BIC) 을 사용합니다. 표준 정규 분포에서 무작위로 샘플링하여 두 개의 구성 요소를 생성합니다. 한 구성 요소는 구형이지만 이동 및 재조정됩니다. 다른 구성 요소는 더 일반적인 공분산 행렬을 갖도록 변형됩니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업 검증은 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

데이터 생성

numpy.random.randn으로 반환되는 표준 정규 분포에서 무작위로 샘플링하여 두 개의 구성 요소 (각각 n_samples 개 포함) 를 생성합니다. 한 구성 요소는 구형이지만 이동 및 재조정됩니다. 다른 구성 요소는 더 일반적인 공분산 행렬을 갖도록 변형됩니다.

import numpy as np

n_samples = 500
np.random.seed(0)
C = np.array([[0.0, -0.1], [1.7, 0.4]])
component_1 = np.dot(np.random.randn(n_samples, 2), C)  ## 일반적인 공분산 행렬
component_2 = 0.7 * np.random.randn(n_samples, 2) + np.array([-4, 1])  ## 구형

X = np.concatenate([component_1, component_2])

시각화

Matplotlib 를 사용하여 서로 다른 구성 요소를 시각화할 수 있습니다.

import matplotlib.pyplot as plt

plt.scatter(component_1[:, 0], component_1[:, 1], s=0.8)
plt.scatter(component_2[:, 0], component_2[:, 1], s=0.8)
plt.title("가우시안 혼합 구성 요소")
plt.axis("equal")
plt.show()

모델 학습 및 선택

1 에서 6 까지의 구성 요소 수와 사용할 공분산 매개변수 유형을 변경합니다.

  • "full": 각 구성 요소는 고유한 일반 공분산 행렬을 가집니다.
  • "tied": 모든 구성 요소는 동일한 일반 공분산 행렬을 공유합니다.
  • "diag": 각 구성 요소는 고유한 대각 공분산 행렬을 가집니다.
  • "spherical": 각 구성 요소는 고유한 단일 분산을 가집니다.

다양한 모델을 평가하고 가장 좋은 모델 (가장 낮은 BIC) 을 유지합니다. 이는 GridSearchCV와 사용자 정의 점수 함수를 사용하여 수행됩니다. 이 함수는 음수 BIC 점수를 반환합니다. 최적의 매개변수 집합과 추정기는 각각 best_parameters_best_estimator_에 저장됩니다.

from sklearn.mixture import GaussianMixture
from sklearn.model_selection import GridSearchCV

def gmm_bic_score(estimator, X):
    """BIC 점수를 사용할 GridSearchCV 에 전달할 호출 가능 함수입니다."""
    ## GridSearchCV 는 최대화할 점수를 예상하므로 음수로 만듭니다.
    return -estimator.bic(X)

param_grid = {
    "n_components": range(1, 7),
    "covariance_type": ["spherical", "tied", "diag", "full"],
}
grid_search = GridSearchCV(
    GaussianMixture(), param_grid=param_grid, scoring=gmm_bic_score
)
grid_search.fit(X)

BIC 점수 플롯

그리드 검색으로 수행된 교차 검증 결과에서 pandas.DataFrame을 생성합니다. BIC 점수의 부호를 다시 반전하여 최소화 효과를 보여줍니다. seaborn을 사용하여 BIC 점수를 플롯합니다.

import pandas as pd
import seaborn as sns

df = pd.DataFrame(grid_search.cv_results_)[
    ["param_n_components", "param_covariance_type", "mean_test_score"]
]
df["mean_test_score"] = -df["mean_test_score"]
df = df.rename(
    columns={
        "param_n_components": "구성 요소 수",
        "param_covariance_type": "공분산 유형",
        "mean_test_score": "BIC 점수",
    }
)
df.sort_values(by="BIC 점수").head()

sns.catplot(
    data=df,
    kind="bar",
    x="구성 요소 수",
    y="BIC 점수",
    hue="공분산 유형",
)
plt.show()

최적 모델 플롯

선택된 모델의 각 가우시안 구성 요소를 보여주는 타원을 플롯합니다. 이를 위해 covariances_ 속성으로 반환된 공분산 행렬의 고유값을 찾아야 합니다. 이러한 행렬의 모양은 covariance_type에 따라 달라집니다.

  • "full": (n_components, n_features, n_features)
  • "tied": (n_features, n_features)
  • "diag": (n_components, n_features)
  • "spherical": (n_components,)
from matplotlib.patches import Ellipse
from scipy import linalg

color_iter = sns.color_palette("tab10", 2)[::-1]
Y_ = grid_search.predict(X)

fig, ax = plt.subplots()

for i, (mean, cov, color) in enumerate(
    zip(
        grid_search.best_estimator_.means_,
        grid_search.best_estimator_.covariances_,
        color_iter,
    )
):
    v, w = linalg.eigh(cov)
    if not np.any(Y_ == i):
        continue
    plt.scatter(X[Y_ == i, 0], X[Y_ == i, 1], 0.8, color=color)

    angle = np.arctan2(w[0][1], w[0][0])
    angle = 180.0 * angle / np.pi  ## convert to degrees
    v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
    ellipse = Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
    ellipse.set_clip_box(fig.bbox)
    ellipse.set_alpha(0.5)
    ax.add_artist(ellipse)

plt.title(
    f"선택된 GMM: {grid_search.best_params_['covariance_type']} 모델, "
    f"{grid_search.best_params_['n_components']} 구성 요소"
)
plt.axis("equal")
plt.show()

요약

이 실험에서는 정보 이론 기준을 사용하여 가우시안 혼합 모델 (GMM) 로 모델 선택을 수행하는 방법을 배웠습니다. 최적의 모델을 선택하기 위해 아카이케 정보 기준 (AIC) 과 베이즈 정보 기준 (BIC) 을 사용했습니다. 표준 정규 분포에서 무작위로 샘플링하여 두 개의 구성 요소를 생성했습니다. 한 구성 요소는 구형이었지만 이동 및 재조정되었습니다. 다른 구성 요소는 더 일반적인 공분산 행렬을 갖도록 변형되었습니다. 서로 다른 구성 요소를 시각화하고, 학습된 모델을 선택하고, BIC 점수를 플롯하고, 최적의 모델을 플롯했습니다.