【5分で解説】sklearnで主成分分析(PCA)して次元削除!これでKaggleで100カラム以上あるデータも対処できる

読者対象

・主成分分析について知りたい

・機械学習ライブラリーsklearn(Python)の主成分分析(PCA)の使い方を知りたい

・主成分分析を使って次元削除したい

AIに興味持った
メイド

Pythonで欠損値の補完をしていたら、CSVファイルの列の数が300個になってしまってデータの傾向がわからなくなったよ。

男勝りな
AIメイド長

データ分析の「あるある」だね。

最近Kaggleでも300列以上もあるデータがあって、どこから分析してよいかわからなくなったよ。こんなときに何か効率良い分析方法ないかな?

主成分分析( PCA =principal component analysisの略)を使ってみたらどうかな?

主成分分析?

簡単にいうと、複数の列を一つにまとめることができる技術だよ。データの要約ともいうね。例えば、学校の教科を文系、理系に分けるイメージだね。
文系が国語、英語、古典、社会。理系が数学、化学、統計学、物理みたいな感じだね。

へーー。

主成分分析を使えば、複数のデータをまとめてみたり、機械学習ならば次元(変数)の削除ができるんだ。

というわけで、今回は「主成分分析の理論」、「PCAを使った次元削除のPythonプログラム」を解説するよ。

ポイント:

次元削除方法には、RFEというアルゴリズムもありますが、RFEは、特徴が少ない列を物理的に削除するものです。

https://programming-info.dream-target.jp/python-rfe/

主成分分析とは何なの?

主成分分析について、wikiにはこのようなことが書いてあるけど、意味わかるかな?

主成分分析(しゅせいぶんぶんせき、英: principal component analysis; PCA)は、相関のある多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法[1]。データの次元を削減するために用いられる。

主成分を与える変換は、第一主成分の分散を最大化し、続く主成分はそれまでに決定した主成分と直交するという拘束条件の下で分散を最大化するようにして選ばれる。主成分の分散を最大化することは、観測値の変化に対する説明能力を可能な限り主成分に持たせる目的で行われる。選ばれた主成分は互いに直交し、与えられた観測値のセットを線型結合として表すことができる。言い換えると、主成分は観測値のセットの直交基底となっている。主成分ベクトルの直交性は、主成分ベクトルが共分散行列(あるいは相関行列)の固有ベクトルになっており、共分散行列が実対称行列であることから導かれる。

出典:Wiki

うーん、なにを言っているのかよくわからん

主成分分析とは冒頭でも話したけど、複数の列を主成分に着目して、列を減らすことだよ。さっき話したとおり、文系と理系に分けると考えるとイメージしやすいと思うよ。

2次元の図にしてみるとこんなイメージ何だ。

図のように、主成分の分散(データの散らばりの程度)が最大になるように軸を取ります。分散値が高いほど重要なデータ(列)と言えます。この図では、①が分散が最大になるようになっています。

図の①が主成分(PC1)の軸、②が①に直交する軸(PC2)になります。

まるで十字架のようだな〜。

①は、データを最も要約している部分と言えます。

どのくらいのデータを要約しているか示す値が「寄与率」というものです。

寄与率が1に近いほど、データを要約できていると言えます。

次の章では、Pythonコードを使って主成分分析をして次元を減らしてみるよ。

Pythonで主成分分析をしてみよう

それではPythonでPCAを実装してみよう。今回は、データー分析の世界では同じみの、irisのデータを使って、4次元から2次元に圧縮してみるよ。
以下のようなプログラムを書いて実行してみます。

#scikit-learn、PCA(主成分分析)による次元削除の例

import numpy as np  # 科学技術計算ライブラリー
from sklearn.decomposition import PCA # scikit-learnのPCAクラス(主成分分析)
from sklearn.datasets import load_iris #irisのデータセット
import pandas as pd                          # DataFrameを使うためのライブラリ
import seaborn as sns                        # 可視化用のライブラリ
from matplotlib import pyplot as plt#グラフ描画につかう


#主成分分析による次元削除とは、教科を一つにまとめるイメージ。
#国語、英語、古文ならば文系
#化学、数学、統計学ならば理系という感じ。


#irisのデータ読み込み
dataset = load_iris()
X = pd.DataFrame(dataset.data,
                 columns=dataset.feature_names)
y = pd.Series(dataset.target, name='y')

#カラムを表示
print(dataset.feature_names)

#可視化
#sns.pairplot(X)


#PCAによる主成分分析を行ってirisの4次元から2次元に圧縮する
pca = PCA(n_components=2)
pca.fit(X)
X_p = pca.fit_transform(X.iloc[:,0:].values)  # PCAで次元圧縮
X_p = pd.DataFrame(X_p)                      # 可視化のためにデータフレームに変換


# In[2]:


#圧縮後の主成分をプロットする
plt.scatter(X_p.iloc[:, 0], X_p.iloc[:, 1],c=y)
plt.title('PCA Result')
plt.xlabel('pc1')
plt.ylabel('pc2')
plt.show()

print('各次元の寄与率: {0}'.format(pca.explained_variance_ratio_))
print('累積寄与率: {0}'.format(sum(pca.explained_variance_ratio_)))

その結果、4次元の以下の図から、2次元に要約されます。

以下の図は、4次元の状態のirisのデータです。

2次元に要約したグラフは以下の通り。

4次元から2次元にしたらなんとなく、要約されているように見えるでしょう。irisは4次元だけど、世の中には100次元を超えるデータなんてたくさんあるんだ。たくさん次元が増えたときに役立つよ。

横軸、縦軸は、4つの変数をまとめている(要約している)からPC1,PC2にしているよ。

Pythonの全体コードは、GitHubに公開済み!

https://github.com/jshirius/python_tools/blob/master/sample/iris_PCA.ipynb

まとめ

Kaggleのように列のデータが多すぎて困った。

そんなときは、主成分分析を使ってみてはいかがだろうか?

評判も見えるPGスクール検索・比較表

どのプログラミングスクールがいいんだろう?
そんな疑問をお持ちの方に、評判も見えるプログラミングスクール検索・一括比較サービスをリリースしました。

条件を指定することにより、気になるプログラミングスクールを一発で比較できます。
きっと、条件にあったスクールが見つかるかと思います!
詳細は、以下の画像をクリック!

プログラミングスクール検索・比較のペン太ブル
スポンサーリンク
PR




PR




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
PR