scikit-learn を使用した Python での PCA の実装
<h2>はじめに <p>高次元データセットからの有用な情報の抽出は、一般的な次元削減手法である主成分分析 (PCA) によって簡単に行えます。これは、最大の分散を取得できる別の軸にデータを再投影することによって行われます。データセットの基本構造は PCA によって維持されながら、データセットの複雑さが軽減されます。データ分析における特徴選択、データ圧縮、ノイズ低減などに役立ち、分析対象のデータの次元を削減することもできます。画像処理、生物情報学、経済学、社会科学は、PCA が使用されている場所のほんの一部です。
画像認識 (人間と非人間の両方)、遺伝学、金融、消費者のセグメンテーション、レコメンダー システム、センチメント分析など、いくつかのアプリケーションがあります。要するに、主成分分析はさまざまな設定で使用できる柔軟な方法です。
PCA の背後にある理論を理解する
主成分分析 (PCA) とは何ですか?
主成分分析 (PCA) は、最も重要な情報を保持しながら、高次元データを低次元表現に変換するために使用される次元削減手法です。データが最も大きく変化する方向 (主成分) を特定します。
PCA の数学的概念
PCA には線形代数と行列演算が含まれます。固有ベクトルや固有値などの概念を使用して主成分を計算します。固有ベクトルは最大分散の方向を表し、固有値は各固有ベクトルによって説明される分散の量を表します。
説明された分散比
説明分散比は、各主成分によって説明されるデータの合計分散の割合を表します。これは、次元削減と情報保持の間の最適なトレードオフを実現するために保持する主成分の数を決定するのに役立ちます。
scikit-learn を使用した PCA の実装
scikit-learn のインストール
scikit-learnをインストールするには、次のコマンドを使用できます-
Pythonコード
pip install scikit-learn
必要なライブラリをロードする
Pythonでは、PCA実装に必要なライブラリをインポートする必要があります-
Pythonコード
from sklearn.decomposition import PCA
import numpy as np
データの前処理
機能のスケーリング
PCA を適用する前に、平均と単位分散がゼロになるように特徴をスケーリングすることをお勧めします。これは、scikit-learnのStandardScalerを使用して実現できます-
Pythonコード
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
欠損値の処理 (該当する場合)
データに欠損値が含まれている場合は、PCA を実行する前に欠損値を処理する必要がある場合があります。欠損データの性質に応じて、補完や削除などの手法が使用される場合があります。
PCA の実行
スケーリングされたデータに対してPCAを実行するには、PCAクラスのインスタンスを作成し、それをデータに適合させます-
Pythonコード
pca = PCA()
pca.fit(scaled_data)
コンポーネントの数の選択
説明された分散比に基づいて成分の数を選択できます。たとえば、分散の 95% を保持するには、次を使用できます-
Pythonコード
n_components = np.argmax(np.cumsum(pca.explained_variance_ratio_) >= 0.95) + 1
主成分の解釈
主要コンポーネントには、pca.components を使用してアクセスできます。主成分は、それぞれがデータ変動の一意の軸を表す元の特徴の線形結合です。主成分の係数を分析すると、全体の分散を説明する際の相対的な重要性が明らかになります。
PCA 結果の視覚化
バイプロット
バイプロットは、点と PC の両方を同時に表示する散布図の一種です。したがって、データと主要コンポーネントとの間の関係がわかる可能性があります。 Matplotlib と scikit-learn は、バイプロットを生成するために使用できるライブラリの 2 つの例です-
Pythonコード
import matplotlib.pyplot as plt
# Assuming X is the original data matrix
X_pca = pca.transform(scaled_data)
plt.scatter(X_pca[:, 0], X_pca[:, 1]) # Replace 0 and 1 with the desired principal components
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
ガレプロット
主成分の固有値 (または説明された分散) が、最高から最低までスクリー プロットにプロットされます。どれだけの個数を保持するかを把握するのに役立ちます。 Matplotlibはスクリーンプロットを作成するために使用できます-
Pythonコード
plt.plot(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, marker='o')
plt.xlabel('Principal Components')
plt.ylabel('Explained Variance Ratio')
plt.show()
これらの視覚化により、データ構造と、元のデータの変動性を捉える際の各主成分の重要性についての洞察が得られます。
PCA のパフォーマンスの評価
説明された分散比の評価
PCA を適用した後、各主成分によって説明されるデータの変動量を評価することが重要です。このデータは、保持するパーツの数を決定するのに役立ちます。説明された分散比には、scikit-learn の PCA オブジェクトの「explained_variance_ratio_」フィールドを使用して Python でアクセスできます。これはコードのサンプルです-
Pythonコード
from sklearn.decomposition import PCA
# Assume 'X' is your preprocessed data
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# Accessing the explained variance ratio
explained_variance_ratio = pca.explained_variance_ratio_
print("Explained Variance Ratio:", explained_variance_ratio)
元のデータの再構築
データを低次元空間にマッピングすることにより、PCA はデータの次元を削減できます。 「inverse_transform()」関数を使用すると、圧縮表現から元のデータに戻すことができます。これはコードのサンプルです-
Pythonコード
# Reconstructing the original data
X_reconstructed = pca.inverse_transform(X_pca)
モデルのパフォーマンスに対する次元削減の影響の評価
PCA を使用した後は、次元の削減が機械学習モデルの成功にどのような影響を与えるかを理解する必要があります。 PCA を適用する前後で、精度や平均二乗誤差などのパフォーマンス測定値を比較できます。コードスニペットの例は次のとおりです-
Pythonコード
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Assume 'y' is your target variable
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)
# Train and evaluate a logistic regression model on the reduced data
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy_pca = model.score(X_test, y_test)
# Train and evaluate a logistic regression model on the original data
model_original = LogisticRegression()
model_original.fit(X_train_original, y_train)
accuracy_original = model_original.score(X_test_original, y_test)
print("Accuracy with PCA:", accuracy_pca)
print("Accuracy without PCA:", accuracy_original)
PCA を使用した場合と使用しない場合でモデルがどのように機能するかを比較することで、次元削減が特定のジョブにどのような影響を与えるかを把握できます。
結論
結論として、Python で実装された PCA と scikit-learn を使用することにより、次元削減と特徴抽出を非常に効率よく行うことができます。 PCA を適切に理解、実装、評価すると、幅広いアプリケーション領域にわたって、より効果的なデータ分析、視覚化、モデリングへの道が開かれます。