PCA 와 FA 모델 선택 비교 시각화

Beginner

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

소개

이 실습에서는 확률적 PCA(Probabilistic PCA) 와 요인 분석 (Factor Analysis) 이라는 두 가지 확률 모델을 탐색하고, 모델 선택 및 공분산 추정에서의 효과를 비교할 것입니다. 동종 또는 이종의 노이즈가 섞인 저차원 데이터에 대한 교차 검증을 수행할 것입니다. 또한, 축소 공분산 추정량에서 얻은 가능도와 모델 가능도를 비교할 것입니다.

VM 팁

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

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

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

데이터 생성

500 개의 샘플, 25 개의 특징, 랭크 5 를 갖는 가상 데이터셋을 생성할 것입니다. 또한, 동종 및 이종 노이즈를 데이터셋에 추가할 것입니다.

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)

## 동종 노이즈 추가
X_homo = X + sigma * rng.randn(n_samples, n_features)

## 이종 노이즈 추가
sigmas = sigma * rng.rand(n_features) + sigma / 2.0
X_hetero = X + rng.randn(n_samples, n_features) * sigmas

모델 적합

확률적 PCA 및 요인 분석 모델을 데이터셋에 적합하고, 교차 검증을 사용하여 성능을 평가할 것입니다. 또한 축소 공분산 추정량의 점수를 계산하고 결과를 비교할 것입니다.

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)  ## options for 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, "동종 노이즈"), (X_hetero, "이종 노이즈")]:
    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("PCA CV에 의한 최적 n_components = %d" % n_components_pca)
    print("FactorAnalysis CV에 의한 최적 n_components = %d" % n_components_fa)
    print("PCA MLE에 의한 최적 n_components = %d" % n_components_pca_mle)

    plt.figure()
    plt.plot(n_components, pca_scores, "b", label="PCA 점수")
    plt.plot(n_components, fa_scores, "r", label="FA 점수")
    plt.axvline(rank, color="g", label="진실값: %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="FactorAnalysis CV: %d" % n_components_fa,
        linestyle="--",
    )
    plt.axvline(
        n_components_pca_mle,
        color="k",
        label="PCA MLE: %d" % n_components_pca_mle,
        linestyle="--",
    )

    ## 다른 공분산 추정량과 비교
    plt.axhline(
        shrunk_cov_score(X),
        color="violet",
        label="축소 공분산 MLE",
        linestyle="-.",
    )
    plt.axhline(
        lw_score(X),
        color="orange",
        label="LedoitWolf MLE",
        linestyle="-.",
    )

    plt.xlabel("컴포넌트 수")
    plt.ylabel("교차 검증 점수")
    plt.legend(loc="lower right")
    plt.title(title)

plt.show()

요약

이 실험에서는 모델 선택 및 공분산 추정에서 확률적 PCA 및 요인 분석 모델의 효과를 탐구했습니다. 동종 및 이종 노이즈가 있는 가상 데이터셋을 생성하고 교차 검증을 사용하여 모델의 성능을 비교했습니다. 또한 축소 공분산 추정량으로부터 얻은 가능도와 모델 가능도를 비교했습니다. 결과는 동종 노이즈가 있는 경우 PCA 와 FA 모두 저랭크 부분 공간의 크기를 효과적으로 복구하는 데 효과적임을 보여주었습니다. 그러나 이종 노이즈가 있는 경우 PCA 는 실패했고 랭크를 과대 추정했습니다. 적절한 상황에서 홀드아웃 데이터는 축소 모델보다 저랭크 모델에 대해 더 높은 가능도를 보였습니다.