Menu
CoddyTech

PCA

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 26/51。

PCAは、最も広がりの大きい方向を見つけ、次にそれと直角をなす最適な方向を見つけます。このようにして見つかるのが主成分です。ワインの双子では、次のようになります。

右上がりに広がる雲状の、スケーリングされたワインの双子。中心から伸びる赤い矢印が2本あり、長い方の第1主成分は雲に沿い、短い方の第2主成分は雲を横切っている

各行を最初のいくつかの主成分に投影した影が、新しい特徴量になります。

from sklearn.decomposition import PCA
scaled = StandardScaler().fit_transform(X)
points = PCA(n_components=2).fit_transform(scaled)
print(X.shape, points.shape)

13個すべてのワインの測定値について、これは (178, 13) (178, 2) と出力します。

まずスケーリングします。PCAはばらつきを追うため、数百単位のプロリンのように単位の大きな特徴量は、それだけで優位になります。

178種類のワインの2つのPCAマップ。左はスケーリングなしで、3つの栽培品種がひとまとまりに重なっている。右は先にスケーリングしたもので、3つのグループがはっきり見える

challenge icon

チャレンジ

中級

水質検査所では、3つの泉から採取したボトルを検査し、それぞれ8項目を測定します。2Dマップで泉を見分けられるでしょうか? draw_springs(ax, points)は、任意の2D点を泉ごとに色分けします。

  1. Xをスケーリングしてから、PCAで2つの成分に削減し、pointsに格納します。
  2. 削減前後の特徴量の数を出力します。
  3. draw_springsで点を描画し、表示します。

測定項目が6つの別の検査所の場合:

From 6 features to 2

Spring Waters in 2Dというタイトルのグラフ。横軸が第1成分、縦軸が第2成分。alpineのボトルは左下、volcanicは右下、coastalは上部にあり、凡例が付いている

Coddyがあなたのマップを説明します。

自分で試してみよう

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 水の分析室:3つの水源から採取した120本のボトルそれぞれについて、8項目を測定
waters = pd.read_csv("waters.csv")
X = waters.drop(columns="spring")


# 水源ごとにグループ分けして2Dの点を散布図に描き、凡例を付ける
def draw_springs(ax, points):
    for spring in ["alpine", "volcanic", "coastal"]:
        rows = (waters["spring"] == spring).to_numpy()
        ax.scatter(points[rows, 0], points[rows, 1], s=16, label=spring)
    ax.legend()


fig, ax = plt.subplots()
ax.set_title("Spring Waters in 2D")
ax.set_xlabel("First component")
ax.set_ylabel("Second component")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ