PCA と LDA の比較プロット

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Iris データセットに対して、2 つの一般的な次元削減アルゴリズムである主成分分析 (Principal Component Analysis: PCA) と線形判別分析 (Linear Discriminant Analysis: LDA) の性能を比較します。Iris データセットには、4 つの属性(花弁の長さ、花弁の幅、がく片の長さ、がく片の幅)を持つ 3 種類の Iris の花が含まれています。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/discriminant_analysis("Discriminant Analysis") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/discriminant_analysis -.-> lab-49242{{"PCA と LDA の比較プロット"}} sklearn/decomposition -.-> lab-49242{{"PCA と LDA の比較プロット"}} ml/sklearn -.-> lab-49242{{"PCA と LDA の比較プロット"}} end

データセットの読み込み

まず、scikit-learn の組み込み関数 load_iris() を使って Iris データセットを読み込む必要があります。

import matplotlib.pyplot as plt
from sklearn import datasets

iris = datasets.load_iris()

X = iris.data
y = iris.target
target_names = iris.target_names

PCA を実行する

次に、データセットに対して主成分分析 (Principal Component Analysis: PCA) を実行し、データ内の最も分散をもたらす属性の組み合わせを特定します。最初の 2 つの主成分上に異なるサンプルをプロットします。

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

## 各成分によって説明される分散の割合
print("Explained variance ratio (first two components): %s" % str(pca.explained_variance_ratio_))

plt.figure()
colors = ["navy", "turquoise", "darkorange"]
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=0.8, lw=lw, label=target_name)

plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("PCA of Iris Dataset")
plt.show()

LDA を実行する

次に、クラス間で最も分散をもたらす属性を特定するために、データセットに対して線形判別分析 (Linear Discriminant Analysis: LDA) を実行します。PCA とは異なり、LDA は既知のクラスラベルを使用する教師付き手法です。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)

plt.figure()
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=0.8, color=color, label=target_name)

plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("LDA of Iris Dataset")
plt.show()

結果を比較する

最後に、PCA と LDA の結果を比較します。Iris データセットの 3 つのクラスを分離する際に、LDA の方が PCA よりも良好な性能を発揮することがわかります。

まとめ

この実験では、scikit-learn を使って Iris データセットに対して主成分分析 (Principal Component Analysis: PCA) と線形判別分析 (Linear Discriminant Analysis: LDA) を行う方法を学びました。また、これら 2 つの次元削減アルゴリズムの性能を比較し、データセット内の異なるクラスを分離する際には LDA の方が PCA よりも良好な性能を発揮することがわかりました。