主成分分析を用いた特徴量の圧縮 | 特徴量エンジニアリング | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

主成分分析(PCA)を用いた特徴量の圧縮

主成分分析(PCA)は、多くの特徴量を持つデータを、できるだけ情報を保ったまま少ない特徴量に圧縮するための次元削減手法です。

PCAを使うと、データのばらつきが大きい方向を新しい軸として取り出し、元の特徴量を主成分という新しい特徴量に変換できます。これにより、計算コストの削減や可視化、ノイズの低減に役立ちます。

PCAによる特徴量圧縮を図で理解する

PCAによる特徴量圧縮を図で理解する

PCAとは

PCAは、データの分散が最も大きくなる方向を見つけ、その方向を第1主成分として定義します。次に、第1主成分と直交し、次に分散が大きい方向を第2主成分として定義します。

このようにして、元の特徴量を新しい軸に変換し、必要な主成分だけを残すことで次元を削減します。

PCAの基本的な流れ

  1. データを標準化する
  2. データのばらつきが大きい方向を見つける
  3. 主成分という新しい軸を作る
  4. データを主成分の軸に投影する
  5. 重要な主成分だけを残して次元を削減する

PCAのメリット

  • 特徴量の数を減らせる
  • 計算コストを削減できる
  • データを可視化しやすくなる
  • 特徴量同士の冗長性を減らせる
  • ノイズを減らせる場合がある

PythonでのPCAの実装例

ここでは、scikit-learnを使って、4次元の特徴量を2次元に圧縮する例を示します。

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# サンプルデータの作成
data = {
    'Feature1': [2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1],
    'Feature2': [2.4, 0.7, 2.9, 2.2, 3, 2.7, 1.6, 1.1, 1.6, 0.9],
    'Feature3': [1.5, 1.7, 1.1, 1.3, 1.5, 1.4, 1.1, 1.5, 1.2, 1.3],
    'Feature4': [2.3, 2.9, 2.5, 2.6, 2.7, 2.5, 2.6, 2.9, 2.1, 2.4]
}

df = pd.DataFrame(data)

# データの標準化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)

# PCAの適用
pca = PCA(n_components=2)
pca_data = pca.fit_transform(scaled_data)

# 結果をデータフレームに変換
pca_df = pd.DataFrame(
    pca_data,
    columns=['Principal Component 1', 'Principal Component 2']
)

print(pca_df)

このコードでは、まずStandardScalerでデータを標準化し、その後PCAを使って4次元のデータを2次元に圧縮しています。

PCAの結果の可視化

PCAで2次元に圧縮したデータは、散布図として可視化できます。

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))
plt.scatter(
    pca_df['Principal Component 1'],
    pca_df['Principal Component 2']
)

plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA Result')
plt.show()

この散布図を見ることで、元の高次元データの構造を2次元で確認できます。

寄与率とは

寄与率は、各主成分が元のデータの情報をどの程度説明しているかを表す指標です。

第1主成分の寄与率が高ければ、その主成分だけで多くの情報を表現できていることになります。

寄与率と累積寄与率の計算

# 各主成分の寄与率
explained_variance_ratio = pca.explained_variance_ratio_

# 累積寄与率
cumulative_variance = np.cumsum(explained_variance_ratio)

print("各主成分の寄与率:", explained_variance_ratio)
print("累積寄与率:", cumulative_variance)

累積寄与率を確認することで、どの程度の情報を保持したまま次元削減できているかを判断できます。

主成分数の選び方

PCAでは、何個の主成分を残すかが重要です。主成分を少なくしすぎると情報が失われ、多すぎると次元削減の効果が小さくなります。

基準 考え方
累積寄与率 80%〜95%程度を目安に主成分数を選ぶことが多い
可視化目的 2次元または3次元に削減する
計算効率 モデル性能を保てる範囲で特徴量を減らす

PCAを使う場面

  • 特徴量が多すぎる場合
  • 特徴量同士に強い相関がある場合
  • 高次元データを2次元や3次元で可視化したい場合
  • 計算コストを下げたい場合
  • ノイズを減らしたい場合

PCAを使う際の注意点

  • 標準化が重要: 特徴量のスケールが異なると、値の大きい特徴量が結果に強く影響してしまいます。
  • 解釈性が下がる: 主成分は元の特徴量の組み合わせであるため、意味を直接解釈しにくくなります。
  • 情報が失われる可能性がある: 次元を削減しすぎると、重要な情報まで失われることがあります。
  • 線形変換である: PCAは線形な関係をもとに変換するため、非線形な構造には向かない場合があります。

PCAと特徴選択の違い

項目 PCA 特徴選択
考え方 元の特徴量を変換して新しい特徴量を作る 元の特徴量から重要なものを選ぶ
出力 主成分 元の特徴量
解釈性 やや低い 高い
目的 情報を保ちながら圧縮する 不要な特徴量を除外する