Menu
CoddyTech

モデル適用前のPCA

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

特徴量を減らすとモデルが高速になり、追いかけるノイズも少なくなります。PCAはモデルの直前にパイプライン内で使えます。

for n in [2, 5, 10, 20, 40, 64]:
    model = make_pipeline(PCA(n_components=n), KNeighborsClassifier())
    print(n, f"{cross_val_score(model, X, y, cv=5).mean():.3f}")

digits では:

digits における、保持する成分数ごとの k-NN の精度: 2 個で 0.595、5 個で 0.884、10 個で 0.940、その後はほぼ横ばいとなり、20 個で 0.958、64 個すべてで 0.963

精度は20付近で頭打ちになります。他の44方向を追加しても、ほとんど効果はありません。各分割では、それぞれの訓練行に対してPCAを適合させるため、情報漏洩は起こりません。

単位が混在している?いつもどおり、最初にStandardScaler()を置きましょう。

challenge icon

チャレンジ

中級

オリーブオイルの検査機関では、36の波長で吸収される光と、4つの検査項目に基づいてオイルを等級付けします。必要な特徴量を最小限にするにはどうすればよいでしょうか?プログラムは許容幅を読み込みます。

  1. sizes 内の各 n について、スケーラー、n 個の成分を持つPCA、LogisticRegression(max_iter=1000) を組み合わせたパイプラインを、5分割交差検証します。各スコアを出力します。
  2. 最高スコアから許容幅以内のスコアを得られる、最小の成分数を出力します。

別の検査機関の場合、0.05 を入力すると、次のようになります。

2 components: 0.817
3 components: 0.833
4 components: 0.889
5 components: 0.928
10 components: 0.928
20 components: 0.917
40 components: 0.922
Fewest within 0.05 of the best: 4 components

自分で試してみよう

import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 180種類のオリーブオイル:36の波長での光の吸収量、4つの検査室試験の結果、および等級
oils = pd.read_csv("oils.csv")
X = oils.drop(columns=["oil", "grade"])
y = oils["grade"]
sizes = [2, 3, 4, 5, 10, 20, 40]
slack = float(input())

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

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

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

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