モデル適用前の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 では:
精度は20付近で頭打ちになります。他の44方向を追加しても、ほとんど効果はありません。各分割では、それぞれの訓練行に対してPCAを適合させるため、情報漏洩は起こりません。
単位が混在している?いつもどおり、最初にStandardScaler()を置きましょう。
チャレンジ
中級オリーブオイルの検査機関では、36の波長で吸収される光と、4つの検査項目に基づいてオイルを等級付けします。必要な特徴量を最小限にするにはどうすればよいでしょうか?プログラムは許容幅を読み込みます。
sizes内の各nについて、スケーラー、n個の成分を持つPCA、LogisticRegression(max_iter=1000)を組み合わせたパイプラインを、5分割交差検証します。各スコアを出力します。- 最高スコアから許容幅以内のスコアを得られる、最小の成分数を出力します。
別の検査機関の場合、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())
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ