PCA による次元削減

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

次元削減

  • 同じデータを、より少ない特徴量で表現
  • 機械学習パイプラインの重要工程
  • PCA で実行可能
Pythonで学ぶ教師なし学習

PCA による次元削減

  • PCA 特徴量は分散の大きい順
  • 分散の小さい特徴量は「ノイズ」と仮定
  • …分散の大きい特徴量は有益と仮定

PCA 特徴番号と分散の棒グラフ。1 と 2 の間に縦線。左に informative、右に noisy とラベルの矢印

Pythonで学ぶ教師なし学習

PCA による次元削減

  • 残す特徴量数を指定
  • 例:PCA(n_components=2)
  • 先頭 2 つの PCA 特徴量を保持
  • 内在次元が良い目安
Pythonで学ぶ教師なし学習

Iris データセットの次元削減

  • samples = Iris の測定配列(4 特徴量)
  • species = 種を表す番号のリスト
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca.fit(samples)
PCA(n_components=2)
transformed = pca.transform(samples)
print(transformed.shape)
(150, 2)
Pythonで学ぶ教師なし学習

2 次元の Iris データセット

  • PCA で次元を 2 に削減
  • 分散が最大の PCA 特徴量 2 つを保持
  • 重要情報を保持:種は区別可能
import matplotlib.pyplot as plt
xs = transformed[:,0]
ys = transformed[:,1]
plt.scatter(xs, ys, c=species)
plt.show()

Iris データセットに対する PCA の散布図

Pythonで学ぶ教師なし学習

PCA による次元削減

  • 分散の小さい PCA 特徴量は破棄
  • 分散の大きい特徴量が有益と仮定
  • この仮定は実務で概ね有効(例:iris)
Pythonで学ぶ教師なし学習

単語頻度配列

  • 行は文書、列は単語
  • 各セルは各文書での単語の出現を測定
  • …測定は「tf-idf」を使用(後述)

単語頻度配列

Pythonで学ぶ教師なし学習

スパース配列と csr_matrix

  • 「スパース」:多くの要素が 0
  • NumPy 配列の代わりに scipy.sparse.csr_matrix を使用可
  • csr_matrix は非ゼロ要素のみ保持(省メモリ)

単語頻度配列

Pythonで学ぶ教師なし学習

TruncatedSVD と csr_matrix

  • scikit-learn の PCAcsr_matrix 非対応
  • 代わりに scikit-learn の TruncatedSVD を使用
  • 同等の変換を実施
from sklearn.decomposition import TruncatedSVD
model = TruncatedSVD(n_components=3)
model.fit(documents)  # documents is csr_matrix
transformed = model.transform(documents)
Pythonで学ぶ教師なし学習

Passons à la pratique !

Pythonで学ぶ教師なし学習

Preparing Video For Download...