Menu
CoddyTech

PCA prima di un modello

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 32 di 51.

Meno caratteristiche rendono un modello più veloce e gli danno meno rumore da inseguire. PCA può essere inserita in una pipeline, subito prima del modello:

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

Sulle cifre:

Una linea dell'accuratezza di k-NN sulle cifre in base alle componenti mantenute: 0.595 con 2, 0.884 con 5, 0.940 con 10, poi quasi piatta, 0.958 con 20 fino a 0.963 con tutte e 64

La precisione si stabilizza intorno a 20: le altre 44 direzioni non aggiungono quasi nulla. Ogni fold adatta PCA alle proprie righe di addestramento, quindi non ci sono perdite di dati.

Unità miste? Metti StandardScaler() per primo, come sempre.

challenge icon

Sfida

Medio

Un laboratorio di olio d'oliva classifica gli oli in base alla luce che assorbono a 36 lunghezze d'onda, oltre a 4 test di laboratorio. Quante poche caratteristiche basterebbero? Il programma legge un margine.

  1. Per ogni n in sizes, esegui la convalida incrociata (5 fold) di una pipeline: scaler, PCA con n componenti, LogisticRegression(max_iter=1000). Stampa ogni punteggio.
  2. Stampa il minor numero di componenti con un punteggio entro il margine dal migliore.

Per un altro laboratorio e 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

Provalo tu

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 oli d'oliva: luce assorbita a 36 lunghezze d'onda, 4 test di laboratorio e il grado di qualità
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())

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online