2024年10月13日Pythonの機械学習ライブラリであるscikit-learnのPCAを使って主成分分析をする方法について解説します。主成分分析での次元削減に関しても説明します。PCA)は、元のデータの特徴を最もよく表すことができる主成分と呼ばれるベクトルを計算するための解析手法の一種です。高次元の元データを寄与率が高いいくつかの主成分へ射影することで次元削減ができるため、次元削減手法としてもよく使用されます。主成分分析(PCA)は、Pythonの機械学習ライブラリであるscikit-learnに実装がされています。本記事では、scikit-learnのPCAを使って主成分分析をする方法について紹介します。主成分分析による次元削減のイメージについても説明します。本記事では細かな数学的な説明はしません。数学的な意味合いなどを知りたい場合は、以下のこちらの章で参考書籍を示しますので参考にしてください。以降では、scikit-learnを使用します。インストールがされていない場合はpipでインストールをしておいてください。scikit-learn主成分分析の使い方(sklearn.decomposition.PCA)簡単な例として2次元のデータに対して主成分分析をする例を使って方法を説明します。データが3次元以上になったとしても考え方は同じです。scikit-learnで主成分分析を実行するには以下のようにします。詳細については後述していきます。上記のように2次元の正規分布をランダムで作成した共分散行列を使って変換したような入力データを使用しています。実行結果の見方としては以下のような感じになります。寄与率はその主成分がどれだけデータを表現しているかを意味するので、約87%は第1主成分でデータの特徴を表現できているということを意味しています。0.12567022では、以降でプログラムの細部について部分ごとに説明をしていきます。主成分分析で使用するPCAについては、sklearn.decompositionからimportしています。numpyやmatplotlibは分析に使うデータ操作や可視化のためのライブラリとしてimportします。PCA以下の部分はPCAの対象となるデータを用意している部分です。今回は200点データを用意しています。randnで標準正規分布に従う2次元のデータを用意し、randで生成した$2\times2$行列で変換をかけているような形です。matplotlibのscatterでデータの散布図を表示しています。plt.show()さて、本題の主成分分析(PCA)を実行している部分は以下の部分です。\n{pca.explained_variance_ratio_}")PCAの引数としては、n_componentsで主成分分析の次元を指定しています。主成分分析を実行しているのはfitメソッドです。実行した後には各計算結果は以下の変数に格納されて確認することができるようになります。以上が、PCAの使い方の基本になります。Notesckit-learnは共通的なインタフェースでAPIが作成されているため、メソッド名が分かりやすくなっています。今回のPCAに関わらず、以下のような考え方で実装がされています。predict():データの変換や予測の際に使用する主成分ベクトルを表示してみる上記では、主成分分析の実行方法について紹介してみましたが、もう少し図的な意味合いを考えてみましょう。分析した主成分ベクトルを図上に表示してみます。transformを使って各主成分軸に元のデータを射影した値をグラフ化してみます。実行は以下のプログラムを使用します。PCAの実行部分は同じですが、主成分ベクトルを表示するためのdrow_vector関数を作って矢印を描画しています。【主成分ベクトル軸へ変換した後のプロット】transform後まず、主成分ベクトルの表示について見ていきましょう。この結果を見ると各主成分の矢印がデータの広がり方向を表したベクトルになっていることがよくわかるかと思います。このように主成分分析はデータの特徴を表す方向を計算していると思ってもらえるといいと思います。次に、各軸への変換した結果を見てみます。pca.transform(data)transformメソッドでは、各主成分軸へ元のデータを直角に射影した時の各軸での値を計算しています。このように元データを主成分軸へ変換してグラフ化することもできるわけです。主な使用方法の一つに次元削減があります。多くの場合、高次元のデータは寄与率の高い主成分だけで十分に説明できることが多いです。寄与率が低い主成分はただの雑音であることも多いため、適切な次元に落とすことでノイズ除去が行える場合もあります。どの程度の次元に落とすかの基準としては、例えば寄与率を大きい方から足していった累積寄与率がXX%以上になるまでの軸を採用するなどの方法がとられたりします。高次元だと分かりにくいので、今回は2次元を1次元に次元削減する場合で見てみますが、n>mとしたときに、n次元からm次元に次元削減するような場合も考え方は同じです。[0.87432978]【表示結果】PCAの実行部分は、ほとんど同じですが、n_components=1で1次元に変換するようにしています。1])上記の部分で1次元データへ変換(主成分ベクトルへの射影)を行っています。この時点でのdata_pcaは、主成分方向のベクトルの値に変換されているのですが、PCAには、inverse_transformメソッドがあり元の軸での値に戻すことができます。元の軸に戻した値が、data_newでそれをプロットしたものが図でいうところのオレンジの点です。この結果を見て分かると思いますが、主成分方向の軸にデータが落とされていることがよくわかるかと思います。このように、主成分分析での次元削減とは、主成分の軸に射影をして次元を落としていることを意味しています。3次元のデータを2次元にという場合は、元の3次元データは主成分で表される2次元の平面へ直角に射影されるということになります。本記事では主成分分析(PCA)をPythonで使用する方法を中心の説明のため、細かな数学な説明はしません。数学の意味合いや図形的な解釈などをしっかり理解したい場合に参考になる書籍を紹介します。最小二乗法からウェーブレットまで」です。研究室内でも著者の方の名前から「金谷本」みたいな呼び方をして皆読んでいました。主成分分析の基本となるのは共分散行列の主軸変換というものがあるのですが、そういった概念をしっかりと基礎から学ぶことができておすすめです。ウェーブレット変換など分析分野で非常に役立つ数学をしっかりと理解できるようになっています。主成分分析に限らず一度目を通してみて欲しい書籍です。関する理解のためには線形代数についてしっかりと理解しておく必要があります。線形代数に関して私が分かりやすかったのは「プログラミングのための線形代数」です。ベクトルや行列、行列式等の意味合いについて図形的にも理解したい人にはおすすめできます。「行列は写像だ」と言われて「?」という感じでしたら本書は良いイメージを与えてくれるかと思います。楽天ブックスAmazonまとめPythonの機械学習ライブラリであるscikit-learnのPCAを使って主成分分析をする方法について紹介しました。主成分分析による次元削減についても説明をしています。主成分分析は、教師なし学習の内容としてよく出てくる分析手法で、次元削減をしてデータの分析や可視化をする際にもよく使用されます。使い方を覚えてもらえればと思います。Notesklearn.decomposition.PCAの公式ドキュメントの説明はこちらを参考にしてください。ソースコード上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。Tech】Pythonプログラミングガイド本サイトで紹介しているPython入門、応用に関する記事のまとめページです。Python文法の入門から高度な内容、おすすめの書籍についても紹介しています。機械学習等のデータ分析やGUI開発、近年話題の生成AI等のトピックスについても含んでいます。某製造メーカーにてDX推進やシステムの設計・開発・導入をしているシステムエンジニアです。これまでの経験をもとにPythonプログラミング、機械学習などに関する技術情報について発信していきます。