JavaScriptを有効にしてください

Scikit-learnの主成分分析 (PCA)

 ·   3 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

Pythonの機械学習ライブラリScikit-learnに実装されている主成分分析のクラスを調べた。
本記事では、PCAクラスのパラメータ、属性とメソッドについて解説する。

主成分分析 (PCA, Principal Component Analysis)とは、データの分散をなるべく維持しつつ、データの次元を減らす手法である。
主成分分析について解説しているサイトは多数あるため、ここでは説明を省略する。

環境

Scikit-learn 0.20.3

主成分分析のクラス

Scikit-learnには、主成分分析はPCAというクラスで実装されている。

1
2
3
sklearn.decomposition.PCA(n_components=None, copy=True, 
                          whiten=False, svd_solver='auto', tol=0.0, 
                          iterated_power='auto', random_state=None)

以下、パラメータ、メソッド、属性を解説する。

パラメータ

パラメータの説明は以下の通り。

n_components: int, float, None or string
整数を指定すると、圧縮後の次元数になる。
ソルバがfullのとき、0~1の小数の指定が可能であり、n_componentsの割合で分散を維持できるだけの最小の次元数が自動で選ばれる。
また、デフォルトのNoneでは、fitメソッドに与えるデータの、サンプル数と次元数の小さい値が選ばれる。

copy: bool
Falseならば、fitfit_transformで変換するデータを上書きする(デフォルト値はTrue)。

whiten: bool
Trueならば、白色化とよばれる、変数間の相関をなくす処理を行う(デフォルト値はFalse)。詳細は以下のページを参照。
無相関化と白色化の意味と式 - 具体例で学ぶ数学

svd_solver : string
特異値分解のソルバを選ぶ。
‘auto’, ‘full’, ‘arpack’, ‘randomized’の4つから選択できる。‘full’と’arpack’は厳密解である。‘randomized’は近似解であるが、データ数や入力次元が非常に多い場合は非常に高速である。
各ソルバの計算速度等は、以下のページが詳しい。
【python】sklearnのPCAでsvd_solverによる速度差を比較 - 静かなる名辞

tol: float>= 0
svd_solver'arpack'のとき、固有値の許容精度を指定する。

iterated_power: int>=0
svd_solver'randomized'のときの計算反復回数を指定する。

random_state: int, RandomState instance or None
乱数シード。
svd_solver'arpack'または'randomized'のときに使われる。

メソッド

主なメソッドの説明は以下の通り。

fit(X)
PCAをあてはめる。
Xはサンプル数×特徴量数の2次元配列。

fit_transform(X)
PCAをあてはめて変換する。
戻り値はサンプル数×n_componentsの2次元配列。

transform(X)
fitfit_transformで定義したPCAの変換を行う。
戻り値はサンプル数×n_componentsの2次元配列。

inverse_transform(X)
PCAの逆変換を行う。
Xはサンプル数×n_componentsの2次元配列。
戻り値はサンプル数×特徴量数の2次元配列。

属性

PCAクラスの主な属性は以下の通り。

components_:
(n_components)×(元の特徴量数)の2次元配列。
元の行列をXとすると、transformメソッドは以下の変換に等しい。

1
np.dot(X-X.mean(axis=0), PCA.components_)

すなわち、Xの平均を0として、n_componentsとの内積をとる。

explained_variance_ratio_:
個々の主成分の因子寄与率を表す、長さn_componentsの1次元配列。
因子寄与率とは、データ全体の分散に対する個々の主成分の分散の割合である。
n_componentsNoneとして全ての主成分を保存している場合、explained_variance_ratio_の合計は1になる。

参考

sklearn.decomposition.PCA — scikit-learn 0.24.0 documentation

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索