Menu
CoddyTech

PCA przed modelem

Część sekcji Uczenie nienadzorowane ścieżki Machine Learning w Coddy. Lekcja 32 z 51.

Mniejsza liczba cech sprawia, że model działa szybciej i ma mniej szumu do wychwycenia. PCA może znaleźć się w potoku, tuż przed modelem:

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}")

Dla cyfr:

Wykres dokładności k-NN dla cyfr w zależności od liczby zachowanych składowych: 0.595 przy 2, 0.884 przy 5, 0.940 przy 10, następnie niemal płasko, 0.958 przy 20 do 0.963 przy wszystkich 64

Dokładność stabilizuje się w okolicach 20: pozostałe 44 kierunki prawie nic nie wnoszą. Każdy fold dopasowuje PCA do własnych wierszy treningowych, więc nic nie wycieka.

Mieszane jednostki? Najpierw umieść StandardScaler(), jak zawsze.

challenge icon

Wyzwanie

Średni

Laboratorium oliwy z oliwek ocenia oliwy na podstawie światła pochłanianego przy 36 długościach fali oraz 4 testów laboratoryjnych. Ile cech wystarczy? Program odczytuje wartość slack.

  1. Dla każdego n w sizes przeprowadź walidację krzyżową (5 części) potoku: skalowanie, PCA z n składowymi, LogisticRegression(max_iter=1000). Wypisz każdy wynik.
  2. Wypisz najmniejszą liczbę składowych, dla której wynik mieści się w granicach slack od najlepszego wyniku.

Dla innego laboratorium i wartości 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

Spróbuj swoich sił

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 próbek oliwy z oliwek: światło pochłonięte przy 36 długościach fali, 4 badania laboratoryjne i klasa jakości
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())

# Wpisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nienadzorowane

Poćwicz samodzielnie: Kompilator Python online