Gráfico de Seleção de Modelo PCA vs. FA

Beginner

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

Introdução

Neste laboratório, exploraremos dois modelos probabilísticos - PCA Probabilístico e Análise Fatorial - e compararemos sua eficácia na seleção de modelos e na estimativa de covariância. Realizaremos validação cruzada em dados de baixa ordem corrompidos com ruído homocedástico ou heterocedástico. Além disso, compararemos a verossimilhança do modelo com as verossimilhanças obtidas a partir de estimadores de covariância de encolhimento.

Dicas da Máquina Virtual

Após o início da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar 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 você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos o problema para você prontamente.

Criar os Dados

Criaremos um conjunto de dados simulado que consiste em 500 amostras, 25 recursos e uma classificação de 5. Também adicionaremos ruído homocedástico e heterocedástico ao conjunto de dados.

import numpy as np
from scipy import linalg

n_samples, n_features, rank = 500, 25, 5
sigma = 1.0
rng = np.random.RandomState(42)
U, _, _ = linalg.svd(rng.randn(n_features, n_features))
X = np.dot(rng.randn(n_samples, rank), U[:, :rank].T)

## Adicionando ruído homocedástico
X_homo = X + sigma * rng.randn(n_samples, n_features)

## Adicionando ruído heterocedástico
sigmas = sigma * rng.rand(n_features) + sigma / 2.0
X_hetero = X + rng.randn(n_samples, n_features) * sigmas

Ajustar os Modelos

Ajustaremos os modelos PCA Probabilístico e Análise Fatorial ao conjunto de dados e usaremos validação cruzada para avaliar seu desempenho. Também calcularemos as pontuações para estimadores de covariância de encolhimento e compararemos os resultados.

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA, FactorAnalysis
from sklearn.covariance import ShrunkCovariance, LedoitWolf
from sklearn.model_selection import cross_val_score, GridSearchCV

n_components = np.arange(0, n_features, 5)  ## opções para n_components

def compute_scores(X):
    pca = PCA(svd_solver="full")
    fa = FactorAnalysis()

    pca_scores, fa_scores = [], []
    for n in n_components:
        pca.n_components = n
        fa.n_components = n
        pca_scores.append(np.mean(cross_val_score(pca, X)))
        fa_scores.append(np.mean(cross_val_score(fa, X)))

    return pca_scores, fa_scores

def shrunk_cov_score(X):
    shrinkages = np.logspace(-2, 0, 30)
    cv = GridSearchCV(ShrunkCovariance(), {"shrinkage": shrinkages})
    return np.mean(cross_val_score(cv.fit(X).best_estimator_, X))

def lw_score(X):
    return np.mean(cross_val_score(LedoitWolf(), X))

for X, title in [(X_homo, "Ruído Homocedástico"), (X_hetero, "Ruído Heterocedástico")]:
    pca_scores, fa_scores = compute_scores(X)
    n_components_pca = n_components[np.argmax(pca_scores)]
    n_components_fa = n_components[np.argmax(fa_scores)]

    pca = PCA(svd_solver="full", n_components="mle")
    pca.fit(X)
    n_components_pca_mle = pca.n_components_

    print("melhor n_components por PCA CV = %d" % n_components_pca)
    print("melhor n_components por AnáliseFatorial CV = %d" % n_components_fa)
    print("melhor n_components por PCA MLE = %d" % n_components_pca_mle)

    plt.figure()
    plt.plot(n_components, pca_scores, "b", label="Pontuações PCA")
    plt.plot(n_components, fa_scores, "r", label="Pontuações AF")
    plt.axvline(rank, color="g", label="VERDADE: %d" % rank, linestyle="-")
    plt.axvline(
        n_components_pca,
        color="b",
        label="PCA CV: %d" % n_components_pca,
        linestyle="--",
    )
    plt.axvline(
        n_components_fa,
        color="r",
        label="AnáliseFatorial CV: %d" % n_components_fa,
        linestyle="--",
    )
    plt.axvline(
        n_components_pca_mle,
        color="k",
        label="PCA MLE: %d" % n_components_pca_mle,
        linestyle="--",
    )

    ## comparar com outros estimadores de covariância
    plt.axhline(
        shrunk_cov_score(X),
        color="violet",
        label="Covariância Encolhida MLE",
        linestyle="-.",
    )
    plt.axhline(
        lw_score(X),
        color="orange",
        label="LedoitWolf MLE",
        linestyle="-.",
    )

    plt.xlabel("número de componentes")
    plt.ylabel("Pontuações CV")
    plt.legend(loc="inferior direita")
    plt.title(title)

plt.show()

Summary

In this lab, we explored the effectiveness of Probabilistic PCA and Factor Analysis models in model selection and covariance estimation. We created a simulated dataset with homoscedastic and heteroscedastic noise, and compared the performance of the models using cross-validation. We also compared the model likelihood to the likelihoods obtained from shrinkage covariance estimators. The results showed that both PCA and FA were effective in recovering the size of the low rank subspace in the presence of homoscedastic noise. However, PCA failed and overestimated the rank when heteroscedastic noise was present. Under appropriate circumstances, the held-out data was more likely for low rank models than for shrinkage models.