PCA(主成分分析)によるデータの次元圧縮を実装します。
昨今のビッグデータ化や、とりあえずデータを用意してみるという風潮から、データの「次元圧縮」の重要性はますます高まっています。
「次元圧縮は」多次元のデータから「意味のある特徴量」を特定したり、新たな軸を作る(基底を変換する)ことで、少ない変数でデータを再現します。
本記事ではデータの次元圧縮で第一に用いられるPCA(Princial Component Analysis)、日本語で主成分分析と呼ばれる手法を実装します。
主成分分析は、scikit-learnのアルゴリズムチートマップの以下の黒矢印に対応します。
次元圧縮→[Randomized PCA]
です。
PCA
本記事ではワインのサンプルデータを使用して、次元圧縮を行います。
実装コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import cross_validation, preprocessing, decomposition #機械学習用のライブラリを利用 # 2:Wineのデータセットを読み込む-------------------------------- df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) #品種(0列、1~3)と色(10列)とプロリンの量(13列)を使用する X=df_wine_all.iloc[:,1:].values Y=df_wine_all.iloc[:,0].values # 3:データの整形------------------------------------------------------- sc=preprocessing.StandardScaler() sc.fit(X) X=sc.transform(X) # 解説4:主成分分析を実施------------------------------- pca = decomposition.PCA(n_components=2) X_transformed = pca.fit_transform(X) # 解説5: 主成分分析の結果----------------------------- print("主成分の分散説明率") print(pca.explained_variance_ratio_) print("固有ベクトル") print(pca.components_) # 6: 結果をプロットする----------------------------- %matplotlib inline plt.figure(figsize=(10,10)) plt.subplot(2, 1, 1) plt.scatter(X_transformed[:,0],X_transformed[:,1], c=Y) plt.xlabel('PC1') plt.ylabel('PC2') plt.subplot(2, 1, 2) plt.scatter(X[:,9],X[:,12], c=Y) plt.xlabel('color') plt.ylabel('proline') plt.show |
結果は次の通りになります。
結果のグラフ(上)は、PCAにより2次元に圧縮した結果です。
下のグラフは色(10列)とプロリンの量(13列)でプロットした結果です。
なんとなくPCAにより、より分けやすいプロットに変化している気がします。
コードを解説します。
# 解説4:主成分分析を実施——————————-
pca = decomposition.PCA(n_components=2)
X_transformed = pca.fit_transform(X)
ここでPCAを実施したときに軸の数を2本に設定し、データに実行しています。
# 解説5: 主成分分析の結果—————————–
print(“主成分の分散説明率”)
print(pca.explained_variance_ratio_)
print(“固有ベクトル”)
print(pca.components_)
explained_variance_ratio_ によって、PCAの結果が元のデータのどれくらいを説明しているかを計算しています。
2つ足し合わせると約0.56となり、元の12次元のデータの約56%の情報を2次元で保持していることがわかります。
また、components_により、主成分1, 2の軸方向のベクトル(固有ベクトル)を表示しています。
それでは「結局、PCAって何をやっていたの?」を説明します。
PCAの心
正確な情報は以下をご覧ください。
●scikit-learnのdecompositonの解説ページ
PCAはデータを固有値展開し、固有値が大きいものから固有ベクトルを基底として、データを基底に投影する手法です。
何やら難しい説明ですが、固有値展開を使って、分散が大きな方向の軸を求めていることになります。
軸同士は直交し、相関0となります。
PCAで検索すれば、いろいろな説明サイトがあるので、適宜ごらんください。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第21回:PCAでの次元圧縮でした。
次回はKernel-PCAによる次元圧縮について説明します。