Введение
В этом лабе мы исследуем две вероятностные модели - Probabilistic PCA и Factor Analysis - и сравниваем их эффективность в выборе модели и оценке ковариации. Мы проведем кросс-валидацию на низкоранговых данных, искаженных гомоскедастической или гетероскедастической шумом. Кроме того, мы сравним модельную правдоподобие с правдоподобиями, полученными из сжатие ковариационных оценщиков.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку 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)
## Adding homoscedastic noise
X_homo = X + sigma * rng.randn(n_samples, n_features)
## Adding heteroscedastic noise
sigmas = sigma * rng.rand(n_features) + sigma / 2.0
X_hetero = X + rng.randn(n_samples, n_features) * sigmas
Настройка моделей
Мы настроим модели Probabilistic PCA и Factor Analysis на датасет и используем кросс-валидацию для оценки их производительности. Также вычислим оценки для сжатия ковариационных оценщиков и сравним результаты.
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) ## варианты для 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("лучшее n_components по кросс-валидации PCA = %d" % n_components_pca)
print("лучшее n_components по кросс-валидации FactorAnalysis = %d" % n_components_fa)
print("лучшее n_components по PCA MLE = %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 кросс-валидация: %d" % n_components_pca,
linestyle="--",
)
plt.axvline(
n_components_fa,
color="r",
label="FactorAnalysis кросс-валидация: %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="фиолетовый",
label="Сжатое ковариационное MLE",
linestyle="-.",
)
plt.axhline(
lw_score(X),
color="оранжевый",
label="LedoitWolf MLE" % n_components_pca_mle,
linestyle="-.",
)
plt.xlabel("количество компонентов")
plt.ylabel("Оценки кросс-валидации")
plt.legend(loc="нижний правый")
plt.title(title)
plt.show()
Резюме
В этом лабе мы исследовали эффективность моделей Probabilistic PCA и Factor Analysis в выборе модели и оценке ковариации. Мы создали имитационный датасет с гомоскедастическим и гетероскедастическим шумом и сравнили производительность моделей с использованием кросс-валидации. Также сравнили модельную правдоподобие с правдоподобиями, полученными из сжатия ковариационных оценщиков. Результаты показали, что и PCA, и FA были эффективны при восстановлении размера низкорангового подпространства при наличии гомоскедастического шума. Однако, PCA не справлялась и переоценивала ранг при наличии гетероскедастического шума. В соответствующих обстоятельствах, данные, зарезервированные для проверки, были более вероятными для низкоранговых моделей, чем для моделей сжатия.