はじめに
この実験では、Python の scikit-learn を使って Iris データセットに対して主成分分析(Principal Component Analysis:PCA)を行います。PCA は、データセットの次元数を削減しながら、できる限り多くの分散を保持するために使われる手法です。簡単に言えば、データセットの中で最も重要な特徴を特定し、それ以外の重要度の低い特徴を捨てるのに役立ちます。Iris データセットは機械学習の分野で有名なデータセットであり、3 種類の異なる Iris の花の物理的属性に関する情報を含んでいます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
必要なライブラリ - numpy、matplotlib.pyplot、scikit-learn の decomposition と datasets モジュールをインポートして始めましょう。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import decomposition
from sklearn import datasets
データセットを読み込む
次に、scikit-learn のload_iris()関数を使って Iris データセットを読み込みます。その後、特徴量(X)とターゲット(y)の変数を分離します。
iris = datasets.load_iris()
X = iris.data
y = iris.target
データセットを可視化する
PCA を行う前に、まず matplotlib を使ってデータセットを 3 次元で可視化しましょう。これにより、データセット内の異なる種類の Iris の花がどのように分布しているかを把握することができます。
fig = plt.figure(1, figsize=(4, 3))
plt.clf()
ax = fig.add_subplot(111, projection="3d", elev=48, azim=134)
ax.set_position([0, 0, 0.95, 1])
plt.cla()
for name, label in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:
ax.text3D(
X[y == label, 0].mean(),
X[y == label, 1].mean() + 1.5,
X[y == label, 2].mean(),
name,
horizontalalignment="center",
bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),
)
y = np.choose(y, [1, 2, 0]).astype(float)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.nipy_spectral, edgecolor="k")
ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])
ax.zaxis.set_ticklabels([])
plt.show()
PCA を実行する
これでデータセットを可視化したので、それに対して PCA を実行しましょう。このために scikit-learn のPCA()関数を使います。データセットを 4 次元(4 つの特徴量)から 3 次元に削減したいので、成分数を 3 に設定します。
pca = decomposition.PCA(n_components=3)
pca.fit(X)
X = pca.transform(X)
次元削減後のデータセットを可視化する
最後に、matplotlib を使って次元削減後のデータセットを 3 次元で可視化しましょう。ステップ 3 と同じコードを使用しますが、今回は元のデータセットの代わりに次元削減後のデータセット(X)をプロットします。
fig = plt.figure(1, figsize=(4, 3))
plt.clf()
ax = fig.add_subplot(111, projection="3d", elev=48, azim=134)
ax.set_position([0, 0, 0.95, 1])
plt.cla()
for name, label in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:
ax.text3D(
X[y == label, 0].mean(),
X[y == label, 1].mean() + 1.5,
X[y == label, 2].mean(),
name,
horizontalalignment="center",
bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),
)
y = np.choose(y, [1, 2, 0]).astype(float)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.nipy_spectral, edgecolor="k")
ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])
ax.zaxis.set_ticklabels([])
plt.show()
まとめ
この実験では、Python の scikit-learn を使って Iris データセットに対して主成分分析(PCA:Principal Component Analysis)を行う方法を学びました。データセットを読み込み、3 次元で可視化し、次元削減のために PCA を実行し、最後に再度次元削減後のデータセットを 3 次元で可視化しました。PCA は、データセットの次元削減と最も重要な特徴の特定を行うために多くのアプリケーションで使用できる強力な手法です。