주성분 분석 (PCA) 와 커널 PCA

Beginner

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

소개

주성분 분석 (PCA) 은 데이터 세트의 차원을 줄이면서 원래 변동의 대부분을 유지하는 기술입니다. 그러나 PCA 는 선형 방법이며 데이터에 비선형 구조가 있는 경우 잘 작동하지 않을 수 있습니다. 이러한 경우 PCA 대신 커널 PCA 를 사용할 수 있습니다. 이 실습에서는 PCA 와 커널 PCA 의 차이점과 이들을 사용하는 방법을 보여줍니다.

VM 팁

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

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

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

데이터셋 로드

sklearn.datasetsmake_circles 함수를 사용하여 두 개의 중첩된 원으로 구성된 데이터셋을 생성합니다.

from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split

X, y = make_circles(n_samples=1_000, factor=0.3, noise=0.05, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

데이터셋 시각화

matplotlib 를 사용하여 생성된 데이터셋을 시각화합니다.

import matplotlib.pyplot as plt

_, (train_ax, test_ax) = plt.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4))

train_ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
train_ax.set_ylabel("Feature #1")
train_ax.set_xlabel("Feature #0")
train_ax.set_title("Training data")

test_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
test_ax.set_xlabel("Feature #0")
_ = test_ax.set_title("Testing data")

PCA 를 이용한 데이터셋 투영

PCA 를 사용하여 데이터셋을 원래의 변동성을 대부분 유지하는 새로운 공간으로 투영합니다.

from sklearn.decomposition import PCA

pca = PCA(n_components=2)

X_test_pca = pca.fit(X_train).transform(X_test)

커널 PCA 를 이용한 데이터셋 투영

커널 PCA 는 데이터셋을 원래의 변동성을 대부분 유지하면서도 비선형 구조를 반영할 수 있는 새로운 공간으로 투영하는 데 사용됩니다.

from sklearn.decomposition import KernelPCA

kernel_pca = KernelPCA(
    n_components=None, kernel="rbf", gamma=10, fit_inverse_transform=True, alpha=0.1
)

X_test_kernel_pca = kernel_pca.fit(X_train).transform(X_test)

PCA 및 커널 PCA 투영 시각화

PCA 와 커널 PCA 투영 결과를 비교하여 차이점을 시각적으로 보여줍니다.

fig, (orig_data_ax, pca_proj_ax, kernel_pca_proj_ax) = plt.subplots(
    ncols=3, figsize=(14, 4)
)

orig_data_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
orig_data_ax.set_ylabel("Feature #1")
orig_data_ax.set_xlabel("Feature #0")
orig_data_ax.set_title("테스트 데이터")

pca_proj_ax.scatter(X_test_pca[:, 0], X_test_pca[:, 1], c=y_test)
pca_proj_ax.set_ylabel("주성분 #1")
pca_proj_ax.set_xlabel("주성분 #0")
pca_proj_ax.set_title("PCA 를 이용한\n테스트 데이터 투영")

kernel_pca_proj_ax.scatter(X_test_kernel_pca[:, 0], X_test_kernel_pca[:, 1], c=y_test)
kernel_pca_proj_ax.set_ylabel("주성분 #1")
kernel_pca_proj_ax.set_xlabel("주성분 #0")
_ = kernel_pca_proj_ax.set_title("커널 PCA 를 이용한\n테스트 데이터 투영")

커널 PCA 투영을 원래 공간으로 되돌리기

커널 PCA 투영을 원래 공간으로 되돌리기 위해 커널 PCA 의 inverse_transform 메서드를 사용합니다.

X_reconstructed_kernel_pca = kernel_pca.inverse_transform(kernel_pca.transform(X_test))

재구성된 데이터셋 시각화

원본 데이터셋과 재구성된 데이터셋을 비교하여 시각적으로 나타냅니다.

fig, (orig_data_ax, pca_back_proj_ax, kernel_pca_back_proj_ax) = plt.subplots(
    ncols=3, sharex=True, sharey=True, figsize=(13, 4)
)

orig_data_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
orig_data_ax.set_ylabel("Feature #1")
orig_data_ax.set_xlabel("Feature #0")
orig_data_ax.set_title("원본 테스트 데이터")

pca_back_proj_ax.scatter(X_reconstructed_pca[:, 0], X_reconstructed_pca[:, 1], c=y_test)
pca_back_proj_ax.set_xlabel("Feature #0")
pca_back_proj_ax.set_title("PCA 를 통한 재구성")

kernel_pca_back_proj_ax.scatter(
    X_reconstructed_kernel_pca[:, 0], X_reconstructed_kernel_pca[:, 1], c=y_test
)
kernel_pca_back_proj_ax.set_xlabel("Feature #0")
_ = kernel_pca_back_proj_ax.set_title("커널 PCA 를 통한 재구성")

요약

이 실습에서는 PCA 와 커널 PCA 의 차이점을 학습했습니다. PCA 와 커널 PCA 를 사용하여 데이터셋을 새로운 공간으로 투영하고, 투영 결과를 시각화했습니다. 또한, 커널 PCA 를 사용하여 투영된 데이터를 원래 공간으로 되돌려 원본 데이터셋과 비교했습니다.