Seleção de Modelo de Mistura Gaussiana

Beginner

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

Introdução

Neste laboratório, aprenderemos a realizar a seleção de modelos com Modelos de Mistura Gaussiana (GMM) utilizando critérios de teoria da informação. A seleção de modelos diz respeito tanto ao tipo de covariância quanto ao número de componentes no modelo. Usaremos o Critério de Informação de Akaike (AIC) e o Critério de Informação Bayesiano (BIC) para selecionar o melhor modelo. Geraremos dois componentes amostrando aleatoriamente a distribuição normal padrão. Um componente é mantido esférico, mas deslocado e redimensionado. O outro é deformado para ter uma matriz de covariância mais geral.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Às vezes, pode ser necessário esperar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Geração de Dados

Geramos dois componentes (cada um contendo n_samples) amostrando aleatoriamente a distribuição normal padrão, como retornado por numpy.random.randn. Um componente é mantido esférico, mas deslocado e redimensionado. O outro é deformado para ter uma matriz de covariância mais geral.

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)  ## general
component_2 = 0.7 * np.random.randn(n_samples, 2) + np.array([-4, 1])  ## spherical

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

Visualização

Podemos visualizar os diferentes componentes usando 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("Componentes da Mistura Gaussiana")
plt.axis("equal")
plt.show()

Treinamento e Seleção do Modelo

Variamos o número de componentes de 1 a 6 e o tipo de parâmetros de covariância a usar:

  • "full": cada componente tem sua própria matriz de covariância geral.
  • "tied": todos os componentes compartilham a mesma matriz de covariância geral.
  • "diag": cada componente tem sua própria matriz de covariância diagonal.
  • "spherical": cada componente tem sua própria variância única.

Avalia-se os diferentes modelos e mantém-se o melhor modelo (o menor BIC). Isto é feito usando GridSearchCV e uma função de pontuação definida pelo utilizador que retorna a pontuação BIC negativa. O melhor conjunto de parâmetros e o estimador são armazenados em best_parameters_ e best_estimator_, respetivamente.

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

def gmm_bic_score(estimator, X):
    """Callable to pass to GridSearchCV that will use the BIC score."""
    ## Make it negative since GridSearchCV expects a score to maximize
    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)

Plotar as Pontuações BIC

Criamos um pandas.DataFrame a partir dos resultados da validação cruzada realizada pela pesquisa em grade. Inverte-se o sinal da pontuação BIC para mostrar o efeito da sua minimização. Usamos seaborn para plotar as pontuações 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": "Número de componentes",
        "param_covariance_type": "Tipo de covariância",
        "mean_test_score": "Pontuação BIC",
    }
)
df.sort_values(by="Pontuação BIC").head()

sns.catplot(
    data=df,
    kind="bar",
    x="Número de componentes",
    y="Pontuação BIC",
    hue="Tipo de covariância",
)
plt.show()

Plotar o Melhor Modelo

Plotamos uma elipse para mostrar cada componente gaussiano do modelo selecionado. Para tal, é necessário encontrar os valores próprios das matrizes de covariância, como retornado pelo atributo covariances_. A forma dessas matrizes depende do 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 Selecionado: {grid_search.best_params_['covariance_type']} modelo, "
    f"{grid_search.best_params_['n_components']} componentes"
)
plt.axis("equal")
plt.show()

Resumo

Neste laboratório, aprendemos como realizar a seleção de modelos com Modelos de Mistura Gaussiana (GMM) usando critérios de teoria da informação. Usamos o Critério de Informação de Akaike (AIC) e o Critério de Informação de Bayes (BIC) para selecionar o melhor modelo. Geramos dois componentes amostrando aleatoriamente a distribuição normal padrão. Um componente foi mantido esférico, mas deslocado e redimensionado. O outro foi deformado para ter uma matriz de covariância mais geral. Visualizamos os diferentes componentes, treinamos e selecionamos o melhor modelo, plotamos as pontuações BIC e plotamos o melhor modelo.