こちらの記事では、カーネル主成分分析の手順についてまとめています。
Contents
カーネル主成分分析とは
回帰分析等、機械学習の多くのアルゴリズムは線形分離できるデータが与えられることを前提としていますが、現実的には線形分離できないデータ、つまり非線形分離する必要があるデータがほとんどです。非線形分離する必要があるデータに対処できるのが、カーネル主成分分析(kernel PCA)です。
カーネル主成分分析ではN×M(データの数×特徴の種類)のデータXを、全く新しいN×M'(データの数×特徴の種類)のデータKに作り変えます。
これをカーネルトリックと言います。カーネルトリックを用いると、特徴量が多くなりなり、線形分離させやすくなります。
カーネル主成分分析の実装
カーネル主成分分析は、sklearn.decompositionを使用して実装することができます。
#必要なライブラリをインポートする
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.decomposition import KernelPCA
# 月形データを取得
X, y = make_moons(n_samples=100, random_state=123)
# KernelPCAクラスをインスタンス化
kpca = KernelPCA(n_components=2, kernel="rbf", gamma=15)
# データXをKernelPCAを用いて変換
X_kpca = kpca.fit_transform(X)
# 可視化
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 3))
ax1.scatter(X[y == 0, 0], X[y == 0, 1], c="r")
ax1.scatter(X[y == 1, 0], X[y == 1, 1], c="b")
ax1.set_title("moon_data")
ax2.scatter(X_kpca[y == 0, 0], X_kpca[y == 0, 1], c="r")
ax2.scatter(X_kpca[y == 1, 0], X_kpca[y == 1, 1], c="b")
ax2.set_title("kernel_PCA")
plt.show()
以下、解説です。
#必要なライブラリをインポートする
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.decomposition import KernelPCA
# 月形データを取得
X, y = make_moons(n_samples=100, random_state=123)
必要なライブラリをインポートし、ワインのデータセットを読み込みます。
make_moonsで月型の非線形のデータを読み込みます。
# KernelPCAクラスをインスタンス化
kpca = KernelPCA(n_components=2, kernel="rbf", gamma=15)
# データXをKernelPCAを用いて変換
X_kpca = kpca.fit_transform(X)
KernelPCAクラスを使用してカーネル主成分分析(KernelPCA)を実行しています。これにより、データを高次元空間に写像し、その空間での主成分分析を実行することにより、非線形な構造を持つデータの次元削減を行います。
n_compoments は主成分の数を指定します。ここでは、2つの主成分を抽出するよう設定されています。
kernelでは、使用するカーネル関数を指定しています。ここではRBFカーネルを指定しています。他にも、linear(線形カーネル)やpoly(多項式回帰)等があります。
gammaはRBFカーネルのカーネル係数です。
kpca.fitで元のデータXをカーネルPCAで変換し、2つの主成分に射影されたX_kpcaとして返します。
# 可視化
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 3))
ax1.scatter(X[y == 0, 0], X[y == 0, 1], c="r")
ax1.scatter(X[y == 1, 0], X[y == 1, 1], c="b")
ax1.set_title("moon_data")
ax2.scatter(X_kpca[y == 0, 0], X_kpca[y == 0, 1], c="r")
ax2.scatter(X_kpca[y == 1, 0], X_kpca[y == 1, 1], c="b")
ax2.set_title("kernel_PCA")
plt.show()
元のデータを左に、線形分離後のデータを右に描画していきます。
ax1.scatter(X[y == 0, 0], X[y == 0, 1], c="r")は、クラスラベルが0のデータポイントの1つ目、クラスラベルが0のデータポイントの2つ目の特徴量を抽出し、X軸、Y軸に赤でプロットしています。
ax1.scatter(X[y == 1, 0], X[y == 1, 1], c="b")は、クラスラベルが1のデータポイントの1つ目、クラスラベルが1のデータポイントの2つ目の特徴量を抽出し、X軸、Y軸に青でプロットしています。
同様にカーネル主成分分析を行って変換したデータもプロットしていきます。
これにより、元のデータとカーネルPCAによって変換されたデータの比較が行われ、非線形なデータの構造がどのように変換されたかが可視化されます。