はじめに
この実験では、scikit-learn ライブラリを使って、近傍成分分析(Neighborhood Components Analysis:NCA)を次元削減に適用する方法を示します。この実験では、Digits データセットに適用される他の(線形)次元削減手法と NCA を比較します。Digits データセットには、0 から 9 までの数字の画像が含まれており、各クラスに約 180 サンプルがあります。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。
ライブラリのインポート
必要なライブラリをインポートします。
- numpy
- matplotlib.pyplot
- datasets
- train_test_split
- PCA
- LinearDiscriminantAnalysis
- KNeighborsClassifier
- NeighborhoodComponentsAnalysis
- make_pipeline
- StandardScaler
Digits データセットの読み込み
scikit-learn のload_digits()関数を使って Digits データセットを読み込みます。
データセットの分割
scikit-learn のtrain_test_split()関数を使って、データセットを学習用とテスト用のデータセットに分割します。
変数の定義
分析に必要な変数を定義します。
dim= データセットの特徴量の数n_classes= データセットのクラスの数n_neighbors= KNN 分類器の近傍点の数random_state= 再現性のための乱数シード
PCA による次元削減
StandardScaler() と PCA(n_components=2, random_state=random_state) を使ったパイプラインを作成することで、主成分分析 (PCA) を用いてデータセットの次元を 2 に削減します。
線形判別分析による次元削減
StandardScaler() と LinearDiscriminantAnalysis(n_components=2) を使ったパイプラインを作成することで、線形判別分析 (LDA) を用いてデータセットの次元を 2 に削減します。
近傍成分分析による次元削減
StandardScaler() と NeighborhoodComponentsAnalysis(n_components=2, random_state=random_state) を使ったパイプラインを作成することで、近傍成分分析 (NCA) を用いてデータセットの次元を 2 に削減します。
手法を評価するために KNN 分類器を使用する
パラメータとして n_neighbors を持つ KNeighborsClassifier を作成します。
比較対象の手法のリストを作成する
ステップ 5 - 7 で定義された手法を使用して、KNN 分類器と比較する手法のリストを作成します。
モデルをフィットさせてテスト精度を評価する
各モデルをフィットさせ、model.transform() を使って訓練データセットとテストデータセットを変換し、変換された訓練データセットに KNN 分類器をフィットさせることでテスト精度を評価します。knn.score() を使って、変換されたテストデータセットにおける最近傍点の精度を計算します。
射影された点をプロットして評価スコアを表示する
plt.scatter() と plt.title() を使って、射影された点をプロットし、各手法の評価スコアを表示します。
グラフを表示する
plt.show() を使ってグラフを表示します。
まとめ
この実験では、近傍成分分析 (NCA) による次元削減を行い、Digits データセットに適用される他の(線形)次元削減手法と比較しました。結果は、NCA が次元を大幅に削減しても視覚的に意味のあるデータのクラスタリングを強制することを示しています。