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.