PCA(主成分分析)
from 次元削減
PCA(主成分分析)
主成分分析(Principal Component Analysis: PCA)
教師なし線形変換
機械学習以前にもすでに統計学の手法として確立
特徴量(説明変数)同士の相関関係にもとづいてデータからパターンを抽出する
多次元空間において、分散が最大となる方向を見つけ出して、元と同次元あるいは低次元の新しい部分空間へ射影する
https://gyazo.com/64f905627a88a0e02a4f0de16941c7cd
図はテキスト『第3版 Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)』より引用
分散(ばらつき)が大きいほど、データの差が表れやすい=情報を多く含んでいる、と考える
低次元の空間に射影するときできるだけ情報の損失が起こらないような軸=分散が大きな方向
https://gyazo.com/e735069215b037d0dd1bae1d5c4bf3e2
図は『Python 実践AIモデル構築 100本ノック』より引用
参考記事:
固有値・固有ベクトルの使いみち(1.主成分分析) - Qiita
主成分分析PCAを用いて手書き数字を分析する。その1 - Qiita
PCAの手順
$ d次元のデータを標準化(平均0、分散1に変換)する
データの分散共分散行列を作成する
分散共分散行列の固有値と固有ベクトルを取得する
固有値を降順でソートすることで、固有ベクトルをランク付けする
上位$ k個の固有ベクトルを選択する(この$ kが新しい特徴量部分空間の次元となる($ k \le d))
上位$ k個の固有ベクトルから射影行列$ Wを作成する
$ Wを使って$ d次元のデータ$ Xを変換して$ k次元のデータを得る
scikit-learnでPCA
sklearn.decomposition.PCAで実行可能
sklearn.decomposition.PCA — scikit-learn 1.2.0 documentation
例:irisデータのPCA
4つの特徴量、3クラスのデータ
散布図行列
https://gyazo.com/71023195d44f26fc97712f2a25983b53
これをPCAにかけると
https://gyazo.com/41f604dd9908a9c068e33b8b5252c1b1
第1主成分・第2主成分だけでプロットすると
https://gyazo.com/1d6a7f656f6c5c251503bf2c443bf9ad
この変換は教師なしなので、あくまでクラスラベルは全く用いていないことに注意
もとの次元$ dより小さな$ k個の主成分だけ取り出すことで、$ d次元特徴量を$ k次元に削減することもできる
ただし、あくまで変数間の相関をもとに「主成分」を取り出しているだけであり、軸の意味を解釈するのは難しい
PCAの実行結果は以下の変数に格納される
components_:固有ベクトル
PCAによる変換後のベクトル
元データと主成分の影響度合いを示す(元データと各主成分の相関を意味する(-1~1))
https://gyazo.com/6ae01d73dfbe97834939f458edd89822
主成分がどのような内容の軸であるかの解釈のもとになる
explained_variance:主成分得点
固有ベクトルと元データを掛け合わせた値
主成分得点=元データ×固有ベクトル
explained_variance_:固有値
各固有ベクトルの方向に沿ったデータの分散の大きさ
固有値が大きい固有ベクトルほどデータの分散をよく説明している=データの重要な特徴を捉えている
データを標準化していれば、固有値が1以上あれば元データより情報を持っていることになる
explained_variance_ratio_:寄与率(分散説明率)
各主成分がデータの特徴を捉えた度合い
寄与率=固有値/固有値の合計
どの次元まで削減するか
スクリープロット
https://gyazo.com/37b607f770d7f332870b9c541b9705f1
主成分ごとに固有値をプロットしていく図
崖(scree)のような形になる
固有値が減少していき、減少率が安定したあたりまでを使うことが多い
上図の例だと8±2くらい?
固有値が1以上の場合は使用する、とすることもある
上図の場合だと第3主成分まで
寄与率による判断
https://gyazo.com/1967134a9bf308f4e283b1cf3763670d
寄与率の累積をプロットしていく
90%以上になるものまで使う、など(上の例だと第8主成分まで)
PCAをかける際に、n_componentsに0~1の小数を指定すると、累積寄与率がこれを超過する主成分までを結果として返すこともできる