はじめに #
Pythonの機械学習ライブラリScikit-learnに実装されている主成分分析のクラスを調べた。 本記事では、PCAクラスのパラメータ、属性とメソッドについて解説する。
主成分分析 (PCA, Principal Component Analysis)とは、データの分散をなるべく維持しつつ、データの次元を減らす手法である。 主成分分析について解説しているサイトは多数あるため、ここでは説明を省略する。
環境 #
Scikit-learn 0.20.3
主成分分析のクラス #
Scikit-learnには、主成分分析はPCAというクラスで実装されている。
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ならば、fitやfit_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)
fitやfit_transformで定義したPCAの変換を行う。
戻り値はサンプル数×n_componentsの2次元配列。
inverse_transform(X)
PCAの逆変換を行う。
Xはサンプル数×n_componentsの2次元配列。
戻り値はサンプル数×特徴量数の2次元配列。
属性 #
PCAクラスの主な属性は以下の通り。
components_:
(n_components)×(元の特徴量数)の2次元配列。
元の行列をXとすると、transformメソッドは以下の変換に等しい。
np.dot(X-X.mean(axis=0), PCA.components_)
すなわち、Xの平均を0として、n_componentsとの内積をとる。
explained_variance_ratio_:
個々の主成分の因子寄与率を表す、長さn_componentsの1次元配列。
因子寄与率とは、データ全体の分散に対する個々の主成分の分散の割合である。
n_componentsをNoneとして全ての主成分を保存している場合、explained_variance_ratio_の合計は1になる。
参考 #
sklearn.decomposition.PCA — scikit-learn 0.24.0 documentation