logo

主成分分析(PCA)

データセット内のフィーチャまたはディメンションの数が増加すると、統計的に有意な結果を得るために必要なデータの量が指数関数的に増加します。これは、過剰適合、計算時間の増加、機械学習モデルの精度の低下などの問題を引き起こす可能性があり、これは高次元データを扱うときに発生する次元問題の呪いとして知られています。

次元の数が増加すると、可能な特徴の組み合わせの数が指数関数的に増加するため、データの代表的なサンプルを取得することが計算上困難になり、クラスタリングや分類などのタスクの実行コストが高くなるためです。さらに、いくつかの 機械学習 アルゴリズムは次元数に敏感な場合があり、低次元データと同じレベルの精度を達成するにはより多くのデータが必要になります。

に対処するには、 次元の呪い 特徴量エンジニアリング 特徴選択と特徴抽出を含む技術が使用されます。 次元削減 は、元の情報をできるだけ保持しながら、入力特徴の数を減らすことを目的とした特徴抽出手法の一種です。



この記事では、最も一般的な次元削減手法の 1 つである主成分分析 (PCA) について説明します。

主成分分析(PCA)とは何ですか?

主成分分析 (PCA) テクニックは数学者によって導入されました カール・ピアソン 1901年に これは、高次元空間のデータが低次元空間のデータにマッピングされる一方で、低次元空間のデータの分散が最大である必要があるという条件で機能します。

  • 主成分分析 (PCA) は、相関のある変数のセットを相関のない変数のセットに変換する直交変換を使用する統計手順です。PCA は、探索的データ分析および予測モデルの機械学習で最も広く使用されているツールです。さらに、
  • 主成分分析 (PCA) は、 教師なし学習 一連の変数間の相互関係を調べるために使用されるアルゴリズム手法。これは、回帰によって最適な直線を決定する一般因子分析としても知られています。
  • 主成分分析 (PCA) の主な目的は、ターゲット変数に関する事前知識がなくても、変数間の最も重要なパターンや関係を維持しながら、データセットの次元を削減することです。

主成分分析 (PCA) は、元の変数セットよりも小さい新しい変数セットを見つけて、サンプルの情報の大部分を保持し、データセットの次元を削減するために使用されます。 回帰と分類 データの。

主成分分析

  1. 主成分分析 (PCA) は、データの最大分散を捉える、主成分と呼ばれる一連の直交軸を特定する次元削減の手法です。主成分はデータセット内の元の変数の線形結合であり、重要度の降順に並べられています。すべての主成分によって取得された合計分散は、元のデータセットの合計分散と等しくなります。
  2. 最初の主成分はデータの最大の変動を捉えますが、2 番目の主成分は最大の変動を捉えます。 分散 あれは 直交 最初の主成分などに。
  3. 主成分分析は、データの視覚化、特徴の選択、データ圧縮などのさまざまな目的に使用できます。データ視覚化では、PCA を使用して高次元データを 2 次元または 3 次元でプロットできるため、解釈が容易になります。特徴の選択では、PCA を使用してデータセット内の最も重要な変数を特定できます。データ圧縮では、PCA を使用すると、重要な情報を失うことなくデータセットのサイズを削減できます。
  4. 主成分分析では、情報は特徴の分散に含まれると想定されます。つまり、特徴の分散が大きいほど、特徴が持つ情報は多くなります。

全体として、PCA はデータ分析のための強力なツールであり、複雑なデータセットを単純化し、理解しやすく、操作しやすくします。

完全な形式

PCA(主成分分析)をステップバイステップで解説

ステップ 1: 標準化

まず、次のことを行う必要があります。 標準化する データセットを使用して、各変数の平均が 0、標準偏差が 1 であることを確認します。

Z = frac{X-mu}{sigma}

ここ、

  • muは独立した特徴量の平均です mu = left { mu_1, mu_2, cdots, mu_m 
ight }
  • シグマそれは 標準偏差 独立した機能の sigma = left { sigma_1, sigma_2, cdots, sigma_m 
ight }

ステップ 2: 共分散行列の計算

共分散 2 つ以上の変数間の結合変動の強さを測定し、それらが相互にどの程度変化するかを示します。共分散を見つけるには、次の式を使用できます。

cov(x1,x2) = frac{sum_{i=1}^{n}(x1_i-ar{x1})(x2_i-ar{x2})}{n-1}

共分散の値は、正、負、またはゼロのいずれかになります。

ベルフォードアルゴリズム
  • 正: x1 が増加すると、x2 も増加します。
  • 負: x1 が増加すると、x2 も減少します。
  • ゼロ: 直接の関係なし

ステップ 3: 共分散行列の固有値と固有ベクトルを計算して主成分を特定する

A を正方 nXn 行列、X を非ゼロベクトルとします。

AX = ラムダ X

一部のスカラー値の場合 ラムダ。それから ラムダとして知られています 固有値 行列 A と X の関係は、 固有ベクトル 対応する固有値の行列 A の。

次のように書くこともできます。

egin{aligned} AX-lambda X &= 0  (A-lambda I)X &= 0 end{aligned}

ここで、I は行列 A と同じ形状の単位行列です。そして、上記の条件は次の場合にのみ真になります。 (A - lambda I)可逆行列 (つまり、特異行列) になります。つまり、

|A - lambda I| = 0

上の方程式から固有値 lambda を見つけることができるため、対応する固有ベクトルは次の方程式を使用して見つけることができます。 AX = ラムダ X

主成分分析(PCA)はどのように機能しますか?

したがって、PCA では、最小の次元数を使用してデータの最大の分散を維持することに基づいた線形変換が使用されます。これには次の手順が含まれます。

Python3

import> pandas as pd> import> numpy as np> # Here we are using inbuilt dataset of scikit learn> from> sklearn.datasets>import> load_breast_cancer> # instantiating> cancer>=> load_breast_cancer(as_frame>=>True>)> # creating dataframe> df>=> cancer.frame> # checking shape> print>(>'Original Dataframe shape :'>,df.shape)> # Input features> X>=> df[cancer[>'feature_names'>]]> print>(>'Inputs Dataframe shape :'>, X.shape)>
>
>

出力 :

Original Dataframe shape : (569, 31) Inputs Dataframe shape : (569, 30)>

次に、データを標準化する最初のステップを適用します。そのためには、まず特徴空間内の各特徴の平均と標準偏差を計算する必要があります。

Python3

# Mean> X_mean>=> X.mean()> # Standard deviation> X_std>=> X.std()> # Standardization> Z>=> (X>-> X_mean)>/> X_std>
>
>

共分散 マトリックスは、特徴空間内で 2 つの特徴の相互依存関係がどの程度強いかを視覚化するのに役立ちます。

Python3

# covariance> c>=> Z.cov()> # Plot the covariance matrix> import> matplotlib.pyplot as plt> import> seaborn as sns> sns.heatmap(c)> plt.show()>
>
>

出力 :

次に、 固有ベクトル そして 固有値 これは、特徴空間の主成分を特定する上で大きな目的を果たします。

Java文字列置換

Python3

eigenvalues, eigenvectors>=> np.linalg.eig(c)> print>(>'Eigen values: '>, eigenvalues)> print>(>'Eigen values Shape:'>, eigenvalues.shape)> print>(>'Eigen Vector Shape:'>, eigenvectors.shape)>
>
>

出力 :

Eigen values:  [1.32816077e+01 5.69135461e+00 2.81794898e+00 1.98064047e+00  1.64873055e+00 1.20735661e+00 6.75220114e-01 4.76617140e-01  4.16894812e-01 3.50693457e-01 2.93915696e-01 2.61161370e-01  2.41357496e-01 1.57009724e-01 9.41349650e-02 7.98628010e-02  5.93990378e-02 5.26187835e-02 4.94775918e-02 1.33044823e-04  7.48803097e-04 1.58933787e-03 6.90046388e-03 8.17763986e-03  1.54812714e-02 1.80550070e-02 2.43408378e-02 2.74394025e-02  3.11594025e-02 2.99728939e-02] Eigen values Shape: (30,) Eigen Vector Shape: (30, 30)>

固有値を降順に並べ替え、それに応じて対応する固有ベクトルを並べ替えます。

Python3

# Index the eigenvalues in descending order> idx>=> eigenvalues.argsort()[::>->1>]> # Sort the eigenvalues in descending order> eigenvalues>=> eigenvalues[idx]> # sort the corresponding eigenvectors accordingly> eigenvectors>=> eigenvectors[:,idx]>
>
>

説明された分散は、元の特徴空間の代わりに主成分を選択することによって保持された合計分散の量のアイデアを与える用語です。

Python3

explained_var>=> np.cumsum(eigenvalues)>/> np.>sum>(eigenvalues)> explained_var>
>
>

出力 :

array([0.44272026, 0.63243208, 0.72636371, 0.79238506, 0.84734274,  0.88758796, 0.9100953 , 0.92598254, 0.93987903, 0.95156881,  0.961366 , 0.97007138, 0.97811663, 0.98335029, 0.98648812,  0.98915022, 0.99113018, 0.99288414, 0.9945334 , 0.99557204,  0.99657114, 0.99748579, 0.99829715, 0.99889898, 0.99941502,  0.99968761, 0.99991763, 0.99997061, 0.99999557, 1. ])>

主成分の数を決定する

ここでは、選択した任意の値の主成分の数を考慮するか、説明された分散を制限することによって検討できます。ここでは、説明された分散が 50% 以上であると考えています。この中に主成分がいくつ含まれるかを確認してみましょう。

Python3

n_components>=> np.argmax(explained_var>>>=> 0.50>)>+> 1> n_components>
>
>

出力 :

2>

選択した主成分にデータを投影する

  • 射影行列を見つけます。これは、データの共分散行列の最大固有値に対応する固有ベクトルの行列です。高次元のデータセットを低次元の部分空間に投影します。
  • データの共分散行列の固有ベクトルはデータの主軸と呼ばれ、これらの主軸へのデータ インスタンスの射影は主成分と呼ばれます。

Python3

# PCA component or unit matrix> u>=> eigenvectors[:,:n_components]> pca_component>=> pd.DataFrame(u,> >index>=> cancer[>'feature_names'>],> >columns>=> [>'PC1'>,>'PC2'>]> >)> # plotting heatmap> plt.figure(figsize>=>(>5>,>7>))> sns.heatmap(pca_component)> plt.title(>'PCA Component'>)> plt.show()>
>
>

出力 :

  • 次に、次の式を使用してデータセットを投影します。

egin{aligned} Proj_{P_i}(u) &= frac{P_icdot u}u  &=P_icdot u end{aligned}

  • 次元削減は、分散の大部分を占める軸 (次元) のみを保持し、その他の軸 (次元) をすべて破棄することによって得られます。

PCA で投影を見つける

Python3

# Matrix multiplication or dot Product> Z_pca>=> Z @ pca_component> # Rename the columns name> Z_pca.rename({>'PC1'>:>'PCA1'>,>'PC2'>:>'PCA2'>}, axis>=>1>, inplace>=>True>)> # Print the Pricipal Component values> print>(Z_pca)>
>
>

出力 :

 PCA1 PCA2 0 9.184755 1.946870 1 2.385703 -3.764859 2 5.728855 -1.074229 3 7.116691 10.266556 4 3.931842 -1.946359 .. ... ... 564 6.433655 -3.573673 565 3.790048 -3.580897 566 1.255075 -1.900624 567 10.365673 1.670540 568 -5.470430 -0.670047 [569 rows x 2 columns]>

データの共分散行列の固有ベクトルはデータの主軸と呼ばれ、これらの主軸へのデータ インスタンスの射影は主成分と呼ばれます。次元削減は、分散の大部分を占める軸 (次元) のみを保持し、その他の軸 (次元) をすべて破棄することによって得られます。

Sklearn を使用した PCA

主成分分析のプロセス全体が関数としてパッケージに実装されることで自動化されているさまざまなライブラリがあり、必要な主成分の数を渡すだけで済みます。 Sklearn は、以下に示す PCA に使用できるライブラリの 1 つです。

Python3

# Importing PCA> from> sklearn.decomposition>import> PCA> # Let's say, components = 2> pca>=> PCA(n_components>=>2>)> pca.fit(Z)> x_pca>=> pca.transform(Z)> # Create the dataframe> df_pca1>=> pd.DataFrame(x_pca,> >columns>=>[>'PC{}'>.> >format>(i>+>1>)> >for> i>in> range>(n_components)])> print>(df_pca1)>
>
>

出力:

 PC1 PC2 0 9.184755 1.946870 1 2.385703 -3.764859 2 5.728855 -1.074229 3 7.116691 10.266556 4 3.931842 -1.946359 .. ... ... 564 6.433655 -3.573673 565 3.790048 -3.580897 566 1.255075 -1.900624 567 10.365673 1.670540 568 -5.470430 -0.670047 [569 rows x 2 columns]>

上記の Z_pca の結果から、まったく同じ値であることがわかります。

Python3

# giving a larger plot> plt.figure(figsize>=>(>8>,>6>))> plt.scatter(x_pca[:,>0>], x_pca[:,>1>],> >c>=>cancer[>'target'>],> >cmap>=>'plasma'>)> # labeling x and y axes> plt.xlabel(>'First Principal Component'>)> plt.ylabel(>'Second Principal Component'>)> plt.show()>
>
>

出力:

int parseint

Python3

# components> pca.components_>
>
>

出力 :

array([[ 0.21890244, 0.10372458, 0.22753729, 0.22099499, 0.14258969,  0.23928535, 0.25840048, 0.26085376, 0.13816696, 0.06436335,  0.20597878, 0.01742803, 0.21132592, 0.20286964, 0.01453145,  0.17039345, 0.15358979, 0.1834174 , 0.04249842, 0.10256832,  0.22799663, 0.10446933, 0.23663968, 0.22487053, 0.12795256,  0.21009588, 0.22876753, 0.25088597, 0.12290456, 0.13178394],  [-0.23385713, -0.05970609, -0.21518136, -0.23107671, 0.18611302,  0.15189161, 0.06016536, -0.0347675 , 0.19034877, 0.36657547,  -0.10555215, 0.08997968, -0.08945723, -0.15229263, 0.20443045,  0.2327159 , 0.19720728, 0.13032156, 0.183848 , 0.28009203,  -0.21986638, -0.0454673 , -0.19987843, -0.21935186, 0.17230435,  0.14359317, 0.09796411, -0.00825724, 0.14188335, 0.27533947]])>

主成分分析の利点

  1. 次元削減 : 主成分分析は、次の目的で使用される一般的な手法です。 次元削減 、これはデータセット内の変数の数を減らすプロセスです。変数の数を減らすことで、PCA はデータ分析を簡素化し、パフォーマンスを向上させ、データの視覚化を容易にします。
  2. 機能の選択 : 主成分分析は次のような用途に使用できます。 機能の選択 、これはデータセット内で最も重要な変数を選択するプロセスです。これは、変数の数が非常に多くなり、最も重要な変数を特定することが難しい機械学習で役立ちます。
  3. データの視覚化 : 主成分分析は次のような用途に使用できます。 多重共線性 : 主成分分析を使用して対処できます。 多重共線性 これは、2 つ以上の独立変数が高度に相関している回帰分析でよくある問題です。 PCA は、データ内の基礎となる構造を特定し、回帰モデルで使用できる相関のない新しい変数を作成するのに役立ちます。
  4. ノイズ減少 : 主成分分析を使用して、データのノイズを低減できます。主成分分析では、ノイズを表すと考えられる分散の低い主成分を除去することで、信号対雑音比を改善し、データ内の基礎となる構造を特定しやすくします。
  5. データ圧縮 : データ圧縮には主成分分析を使用できます。 PCA は、データの変動の大部分を捕捉する少数の主成分を使用してデータを表すことにより、ストレージ要件を削減し、処理を高速化できます。
  6. 外れ値の検出 : 主成分分析は外れ値の検出に使用できます。 外れ値 データセット内の他のデータ ポイントと大きく異なるデータ ポイントです。主成分分析では、主成分空間内の他の点から遠く離れたデータ ポイントを探すことで、これらの外れ値を特定できます。

主成分分析の欠点

  1. 主成分の解釈 : 主成分分析によって作成された主成分は、元の変数の線形結合であるため、元の変数の観点から解釈することが困難なことがよくあります。このため、PCA の結果を他の人に説明することが難しくなる場合があります。
  2. データのスケーリング : 主成分分析はデータのスケールに影響されます。データが適切にスケーリングされていない場合、PCA が適切に機能しない可能性があります。したがって、主成分分析を適用する前にデータをスケールすることが重要です。
  3. 情報損失 : 主成分分析により情報が失われる可能性があります。主成分分析は変数の数を減らしますが、情報の損失につながる可能性もあります。情報損失の程度は、選択された主成分の数によって異なります。したがって、保持する主成分の数を慎重に選択することが重要です。
  4. 非線形関係 : 主成分分析では、変数間の関係が線形であると仮定します。ただし、変数間に非線形の関係がある場合、主成分分析がうまく機能しない可能性があります。
  5. 計算の複雑さ : 主成分分析の計算は、大規模なデータセットの場合、計算コストが高くなる可能性があります。これは、データセット内の変数の数が多い場合に特に当てはまります。
  6. 過学習 : 主成分分析では、次のような結果が得られる場合があります。 過学習 これは、モデルがトレーニング データに適合しすぎて、新しいデータのパフォーマンスが低下する場合です。これは、使用される主成分が多すぎる場合、またはモデルが小さなデータセットでトレーニングされた場合に発生する可能性があります。

よくある質問 (FAQ)

1. 主成分分析 (PCA) とは何ですか?

PCA は、最も重要な情報を保持しながら、高次元のデータを低次元の表現に変換するために統計および機械学習で使用される次元削減手法です。

2. PCA はどのように機能しますか?

主成分は、PCA がデータ内の最大の分散を捕捉するために検出および使用する元の特徴の線形結合です。これらの直交成分は説明される分散量の順に並べられています。

3. PCA をいつ適用する必要がありますか?

PCA の使用は、マルチ共線性データセットまたは高次元データセットを操作する場合に有利です。特徴抽出、ノイズ低減、データ前処理が主な用途です。

4. 主成分はどのように解釈されますか?

新しい軸は、特徴空間内で各主成分によって表されます。データの変動を捉えるコンポーネントの重要性を示す指標は、より大きな変動を説明できるコンポーネントの能力です。

5. 主成分の重要性は何ですか?

主成分は、データが最も大きく変化する方向を表します。通常、最初のいくつかのコンポーネントはデータの分散の大部分を捕捉し、より簡潔な表現を可能にします。