Einführung
In diesem Lab werden wir zwei probabilistische Modelle untersuchen - Probabilistic PCA und Factor Analysis - und deren Effizienz bei der Modellauswahl und Kovarianzschätzung vergleichen. Wir werden Kreuzvalidierung auf Low-Rank-Daten durchführen, die mit homoskedastischer oder heteroskedastischer Störung verseucht sind. Darüber hinaus werden wir die Modellwahrscheinlichkeit mit den Wahrscheinlichkeiten vergleichen, die aus Shrinkage-Kovarianzschätzern erhalten werden.
VM-Tipps
Nachdem die VM gestartet ist, klicken Sie in der linken oberen Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Daten erstellen
Wir werden einen simulierten Datensatz erstellen, der aus 500 Proben, 25 Merkmalen und einem Rang von 5 besteht. Wir werden auch homoskedastische und heteroskedastische Störungen zum Datensatz hinzufügen.
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)
## Homoskedastische Störung hinzufügen
X_homo = X + sigma * rng.randn(n_samples, n_features)
## Heteroskedastische Störung hinzufügen
sigmas = sigma * rng.rand(n_features) + sigma / 2.0
X_hetero = X + rng.randn(n_samples, n_features) * sigmas
Modelle anpassen
Wir werden die Probabilistic PCA- und Factor-Analyse-Modelle an den Datensatz anpassen und Kreuzvalidierung verwenden, um ihre Leistung zu bewerten. Wir werden auch die Scores für Shrinkage-Kovarianzschätzer berechnen und die Ergebnisse vergleichen.
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) ## Optionen für 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, "Homoskedastische Störung"), (X_hetero, "Heteroskedastische Störung")]:
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("best n_components by PCA CV = %d" % n_components_pca)
print("best n_components by FactorAnalysis CV = %d" % n_components_fa)
print("best n_components by PCA MLE = %d" % n_components_pca_mle)
plt.figure()
plt.plot(n_components, pca_scores, "b", label="PCA scores")
plt.plot(n_components, fa_scores, "r", label="FA scores")
plt.axvline(rank, color="g", label="Wahrheit: %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="--",
)
## vergleichen mit anderen Kovarianzschätzern
plt.axhline(
shrunk_cov_score(X),
color="violett",
label="Shrunk Covariance MLE",
linestyle="-.",
)
plt.axhline(
lw_score(X),
color="orange",
label="LedoitWolf MLE" % n_components_pca_mle,
linestyle="-.",
)
plt.xlabel("Anzahl der Komponenten")
plt.ylabel("CV-Scores")
plt.legend(loc="untere rechte Ecke")
plt.title(title)
plt.show()
Zusammenfassung
In diesem Lab haben wir die Effizienz von Probabilistic PCA- und Factor-Analyse-Modellen bei der Modellauswahl und Kovarianzschätzung untersucht. Wir haben einen simulierten Datensatz mit homoskedastischer und heteroskedastischer Störung erstellt und die Leistung der Modelle mit Hilfe von Kreuzvalidierung verglichen. Wir haben auch die Modellwahrscheinlichkeit mit den Wahrscheinlichkeiten verglichen, die aus Shrinkage-Kovarianzschätzern erhalten wurden. Die Ergebnisse zeigten, dass sowohl PCA als auch FA effektiv waren, um die Größe des Low-Rank-Unterraums bei Vorliegen von homoskedastischer Störung wiederzugewinnen. PCA scheiterte jedoch und überschätzte den Rang, wenn heteroskedastische Störungen vorhanden waren. Unter geeigneten Umständen war die zurückgehaltene Datenmenge für Low-Rank-Modelle wahrscheinlicher als für Shrinkage-Modelle.