축소 공분산 추정

Beginner

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

소개

이 실험실에서는 수축 방법과 같은 정규화 기법을 사용하여 추정량의 분산을 줄이는 방법과 편향 - 분산 트레이드오프를 선택하는 방법을 보여줍니다. 정규화 매개변수를 설정하는 세 가지 방법을 비교해 볼 것입니다.

VM 팁

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

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

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

샘플 데이터 생성

40 개의 특징과 20 개의 샘플을 가진 샘플 데이터를 생성합니다. np.random.normal() 함수를 사용하여 정규 분포를 생성합니다.

import numpy as np

n_features, n_samples = 40, 20
np.random.seed(42)
base_X_train = np.random.normal(size=(n_samples, n_features))
base_X_test = np.random.normal(size=(n_samples, n_features))

coloring_matrix = np.random.normal(size=(n_features, n_features))
X_train = np.dot(base_X_train, coloring_matrix)
X_test = np.dot(base_X_test, coloring_matrix)

테스트 데이터에서 가능도 계산

sklearn.covariance 모듈의 ShrunkCovariance 클래스와 scipy.linalg 모듈의 log_likelihood 함수를 사용하여 테스트 데이터에서 음의 로그 가능도를 계산합니다. 가능한 축소 계수 값의 범위를 설정하고 각 값에 대한 가능도를 계산합니다.

from sklearn.covariance import ShrunkCovariance, empirical_covariance, log_likelihood
from scipy import linalg

shrinkages = np.logspace(-2, 0, 30)
negative_logliks = [
    -ShrunkCovariance(shrinkage=s).fit(X_train).score(X_test) for s in shrinkages
]

real_cov = np.dot(coloring_matrix.T, coloring_matrix)
emp_cov = empirical_covariance(X_train)
loglik_real = -log_likelihood(emp_cov, linalg.inv(real_cov))

정규화 매개변수 설정을 위한 다양한 접근 방식 비교

교차 검증, Ledoit-Wolf, 및 OAS 세 가지 접근 방식을 사용하여 정규화 매개변수를 설정하는 방법을 비교합니다.

from sklearn.model_selection import GridSearchCV
from sklearn.covariance import LedoitWolf, OAS

tuned_parameters = [{"shrinkage": shrinkages}]
cv = GridSearchCV(ShrunkCovariance(), tuned_parameters)
cv.fit(X_train)

lw = LedoitWolf()
loglik_lw = lw.fit(X_train).score(X_test)

oa = OAS()
loglik_oa = oa.fit(X_train).score(X_test)

결과 플롯

축소 매개변수의 값이 다른 경우 미확인 데이터의 가능도를 플롯하고, 교차 검증, LedoitWolf, 및 OAS 추정값에 의한 선택 사항을 표시합니다.

import matplotlib.pyplot as plt

fig = plt.figure()
plt.title("정규화된 공분산: 가능도 및 축소 계수")
plt.xlabel("정규화 매개변수: 축소 계수")
plt.ylabel("오류: 테스트 데이터에서 음의 로그 가능도")

plt.loglog(shrinkages, negative_logliks, label="음의 로그 가능도")

plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="실제 공분산 가능도")

lik_max = np.amax(negative_logliks)
lik_min = np.amin(negative_logliks)
ymin = lik_min - 6.0 * np.log((plt.ylim()[1] - plt.ylim()[0]))
ymax = lik_max + 10.0 * np.log(lik_max - lik_min)
xmin = shrinkages[0]
xmax = shrinkages[-1]

plt.vlines(
    lw.shrinkage_,
    ymin,
    -loglik_lw,
    color="magenta",
    linewidth=3,
    label="Ledoit-Wolf 추정값",
)

plt.vlines(
    oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="OAS 추정값"
)

plt.vlines(
    cv.best_estimator_.shrinkage,
    ymin,
    -cv.best_estimator_.score(X_test),
    color="cyan",
    linewidth=3,
    label="교차 검증 최적 추정값",
)

plt.ylim(ymin, ymax)
plt.xlim(xmin, xmax)
plt.legend()

plt.show()

요약

이 실험에서 우리는 축소 방법과 같은 정규화 기법을 사용하여 공분산 추정을 수행하는 방법을 배웠습니다. 정규화 매개변수를 설정하는 세 가지 접근 방식 (교차 검증, Ledoit-Wolf, OAS) 을 비교했습니다. 축소 매개변수의 값이 다른 경우 미확인 데이터의 가능도를 플롯하고, 교차 검증, LedoitWolf, 및 OAS 추정값에 의한 선택 사항을 보여주었습니다.