Menu
CoddyTech

Ottimizza il migliore

Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 53 di 58.

k-NN ha vinto con il valore predefinito di 5 vicini. Un altro valore di k classificherebbe meglio i pinguini? Una ricerca a griglia valuta ogni valore di k che elenchi con la convalida incrociata, come in questo esempio per le scansioni tumorali:

Accuratezza media della convalida incrociata di k-NN sulle scansioni tumorali per k da 1 a 29: raggiunge il picco con k = 3 a 0.974, indicato da una stella, poi scende gradualmente a 0.946 con k = 29

Come nella regolazione di una pipeline, k è denominato in base al suo passaggio:

{"kneighborsclassifier__n_neighbors": [3, 5, 7]}

Un miglioramento inferiore alla deviazione standard dei fold potrebbe essere dovuto alla fortuna. Anche l'ottimizzazione usa solo le righe di training.

challenge icon

Sfida

Medio

La tua pipeline k-NN è pipe e default contiene la sua accuratezza CV con k = 5. Il programma legge i valori di k da provare in ks.

  1. Esegui una ricerca a griglia con quei valori e 5 fold sulle righe di addestramento.
  2. Stampa il valore migliore di k e la relativa accuratezza CV, con 3 cifre decimali.
  3. Stampa il miglioramento rispetto a k = 5, con 3 cifre decimali.

Per un'altra colonia e la griglia 3, 5, 9:

Best k: 3
CV accuracy: 0.969
Gain over k = 5: 0.009

Poi prova solo valori grandi, come 21 e 27. La regolazione migliora sempre i risultati?

Provalo tu

import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.neighbors import KNeighborsClassifier

# La colonia di Incontra i pinguini, le sue caratteristiche e la sua etichetta
penguins = pd.read_csv("penguins.csv")
numbers = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
text = ["island", "sex"]
X = penguins[numbers + text]
y = penguins["species"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=0)

# Da Prepara i dati: i due percorsi
number_steps = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
text_steps = make_pipeline(SimpleImputer(strategy="constant", fill_value="unknown"), OneHotEncoder())
prep = ColumnTransformer([("numbers", number_steps, numbers), ("words", text_steps, text)])

# Da Scegli un modello: il vincitore, k-NN con il valore predefinito k = 5
pipe = make_pipeline(prep, KNeighborsClassifier())
default = cross_val_score(pipe, X_train, y_train, cv=5).mean()

# I valori di k da provare
n = int(input())
ks = []
for i in range(n):
    ks.append(int(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 supervisionato

Esercitati da solo: Compilatore Python online