Preprocessing in Data Science (Parte 1): centratura, scaling e KNN
Questo articolo spiega l'importanza del preprocessing nella pipeline di machine learning esaminando come centratura e scaling possano migliorare le prestazioni del modello.
· 11 min leggi
Scopri con l'IA
Correlato

blog
Tokenizzazione nel NLP: come funziona, sfide e casi d'uso
Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
blog
Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud
Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.

blog
I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
In questo articolo userò l'esempio dello scaling dei dati numerici (dati numerici: dati costituiti da numeri, in contrapposizione a categorie/stringhe; scaling: uso di aritmetica di base per cambiare l'intervallo dei dati; maggiori dettagli a seguire) per dimostrare l'importanza di considerare il preprocessing come parte di una struttura più ampia, la pipeline di machine learning (ML). A tal fine, vedremo un esempio reale in cui lo scaling può migliorare le prestazioni del modello.
Presenterò prima i problemi di classificazione in ML e k-Nearest Neighbors, uno degli algoritmi più semplici usati in questi contesti. Per apprezzare l'importanza dello scaling dei dati numerici in un contesto del genere, dovrò introdurre le misure di performance del modello e i concetti di training set e test set. Vedrai tutti questi concetti e pratiche all'opera con un dataset in cui tento di classificare la qualità del vino rosso. Mi assicurerò anche di collocare il preprocessing nel posto più utile, vicino all'inizio di una pipeline di data science iterativa. Tutti gli esempi qui saranno in Python. Se non conosci Python, puoi dare un'occhiata ai nostri corsi DataCamp qui. Userò le librerie pandas per le esigenze sui dataframe e scikit-learn per quelle di machine learning.
Questa è la prima parte di un tutorial in tre parti:
Parte 2: Centratura, scaling e regressione logistica
Parte 3: Scaling di dati sintetizzati
Una breve introduzione ai problemi di classificazione nel Machine Learning
Classificare ed etichettare le cose nel mondo fenomenico è un'arte antica. Nel IV secolo a.C., Aristotele costruì un sistema di classificazione degli esseri viventi usato per 2.000 anni. Nel mondo moderno, la classificazione è comunemente inquadrata come un compito di machine learning, in particolare un compito di apprendimento supervisionato. Il principio di base dell'apprendimento supervisionato è semplice: abbiamo un mucchio di dati costituiti da variabili predittive e da una variabile target. L'obiettivo del learning supervisionato è costruire un modello che sia "bravo" a prevedere la variabile target, date le variabili predittive. Se la variabile target è costituita da categorie (ad es. "click" o "no", tumore "maligno" o "benigno"), chiamiamo il compito di apprendimento classificazione. In alternativa, se il target è una variabile che varia in continuo (ad es. il prezzo di una casa), si tratta di un compito di regressione.
Un esempio illustrativo aiuterà molto: considera il dataset sulle malattie cardiache, in cui ci sono 75 variabili predittive, come "età", "sesso" e "fumatore o no" e la variabile target si riferisce alla presenza di malattia cardiaca e varia da 0 (nessuna malattia cardiaca) a 4. Gran parte del lavoro su questo dataset si è concentrato sui tentativi di distinguere la presenza della malattia dalla sua assenza. Questa è una task di classificazione. Se cercassi di prevedere il valore effettivo (da 0 a 4) della variabile target, sarebbe un problema di regressione (perché la variabile target è ordinata). Parlerò di regressione nel prossimo post. Qui esaminerò uno degli algoritmi più semplici per i compiti di classificazione, l'algoritmo k-Nearest Neighbors.
k-Nearest Neighbors per la classificazione nel machine learning
Supponiamo di avere dei dati etichettati, per esempio dati che consistono nelle caratteristiche di vini rossi (ad es. contenuto alcolico, densità, quantità di acido citrico, pH, ecc.; queste sono le variabili predittive) con variabile target "Quality" e etichette "good" e "bad". Quindi, date le caratteristiche di un nuovo vino non etichettato, il compito di classificazione è prevederne la "Quality". Quando tutte le variabili predittive sono numeriche (esistono anche modi per gestire il caso categoriale), possiamo considerare ogni riga/vino come un punto in uno spazio n-dimensionale e, in questo caso, k-Nearest Neighbors (k-NN) è un metodo di classificazione concettualmente e computazionalmente semplice: per ciascun nuovo vino non etichettato, calcoliamo, per un certo intero k, i suoi k vicini più prossimi nello spazio n-dimensionale delle variabili predittive. Poi guardiamo le etichette di questi k vicini (cioè "good" o "bad") e assegniamo al nuovo vino l'etichetta con più voti (ad es. se k = 5, 3 vicini votano "good" e 2 votano "bad", allora il nostro modello etichetta il nuovo vino come "good"). Nota che, qui, l'addestramento del modello consiste interamente nel memorizzare i punti dati: non ci sono parametri da adattare!
Una descrizione visiva di k-Nearest Neighbors
Nell'immagine qui sotto c'è un esempio di k-NN in 2D: come classifichi il punto dati al centro? Be', se k=3, lo classificheresti come rosso e, se k=5, come verde.
Implementazione di k-NN in Python (scikit-learn)
Notiamo innanzitutto l'intervallo delle variabili predittive: "free sulfur dioxide" varia da 0 a ~70 e "volatile acidity" da ~0 a ~1,2. Più nello specifico, la prima ha un intervallo di 2 ordini di grandezza più ampio rispetto alla seconda. Qualsiasi algoritmo, come k-NN, che tenga conto della distanza tra i punti dati, potrebbe quindi concentrarsi in modo eccessivo e ingiusto su variabili con un intervallo più ampio, come "free sulfur dioxide", una variabile che, per quanto ne sappiamo, potrebbe contenere solo rumore. Questo motiva lo scaling dei nostri dati, a cui arriveremo tra poco.
Ora la variabile target è una valutazione di "Quality" del vino e varia da 3 a 8. Per semplicità espositiva, trasformiamola in una variabile a due categorie composta da "good" (rating > 5) e "bad" (rating <= 5). Tracceremo anche gli istogrammi di entrambe le formulazioni della variabile target per farci un'idea di cosa stia succedendo.
k-Nearest Neighbors: quanto bene funziona?
Nota: l'accuratezza può anche essere definita in termini di matrice di confusione ed è comunemente definita per problemi di classificazione binaria in termini di veri positivi e falsi negativi; altre misure comuni delle prestazioni di un modello derivabili dalla matrice di confusione sono la precision, il numero di veri positivi diviso per il numero di veri e falsi positivi, e il recall, il numero di veri positivi diviso per il numero di veri positivi più il numero di falsi negativi; un'altra misura, la F1-score, è la media armonica di precision e recall. Vedi machine learning mastery per una buona esposizione di queste misure; consulta anche le voci di Wikipedia sulla confusion matrix e sull'F1 score.
k-Nearest Neighbors: performance in pratica e train test split
Ora introdurremo lo scaling e la centratura, i metodi più basilari di preprocessing dei dati numerici, e vedremo se e come influenzano le prestazioni del nostro modello.
La meccanica del preprocessing: scaling e centratura
Prima di eseguire un modello, come una regressione (prevedere una variabile continua) o una classificazione (prevedere una variabile discreta), sui dati, quasi sempre conviene fare un po' di preprocessing. Per le variabili numeriche, è comune normalizzare o standardizzare i dati. Cosa significano questi termini?
La normalizzazione significa semplicemente scalare un dataset in modo che il suo minimo sia 0 e il massimo 1. Per ottenere questo trasformiamo ogni punto dato x in
$$x_{normalized} = \frac{x-x_{min}}{x_{max}-x_{min}}.$$La standardizzazione è leggermente diversa; il suo scopo è centrare i dati attorno a 0 e scalarli rispetto alla deviazione standard:
$$x_{standardized} = \frac{x-\mu}{\sigma},$$dove $\mu$ e $\sigma$ sono rispettivamente la media e la deviazione standard del dataset. Nota innanzitutto che queste trasformazioni cambiano semplicemente l'intervallo dei dati e non la distribuzione. Potresti successivamente voler usare altre trasformazioni, come una trasformazione logaritmica o una trasformazione di Box-Cox, per rendere i tuoi dati più gaussiani (a campana). Ma prima di proseguire, è importante porsi le seguenti domande: perché scaliamo i dati? Ci sono momenti in cui è più opportuno farlo rispetto ad altri? Per esempio, è più importante nei problemi di classificazione che in quelli di regressione?
Approfondiamo prima le sfide di classificazione e vediamo come lo scaling influisce sulle prestazioni di k-Nearest Neighbors:
Preprocessing: scaling in pratica
Qui sotto (i) scalo i dati, (ii) uso k-Nearest Neighbors e (iii) verifico le prestazioni del modello. Userò la funzione scale di scikit-learn, che standardizza tutte le feature (colonne) nell'array che le viene passato.
Tutte queste misure sono migliorate di 0,1, cioè un miglioramento del 16% e significativo! Come accennato sopra, prima dello scaling c'erano diverse variabili predittive con intervalli di ordini di grandezza diversi, il che significa che una o due avrebbero potuto dominare nel contesto di un algoritmo come k-NN. I due motivi principali per eseguire lo scaling dei dati sono
Abbiamo visto il ruolo essenziale occupato dal preprocessing, nelle sue forme di scaling e centratura, all'interno della pipeline di data science, e lo abbiamo fatto per promuovere un approccio olistico alle sfide del machine learning. In futuri articoli, spero di estendere questa discussione ad altri tipi di preprocessing, come le trasformazioni dei dati numerici e il preprocessing dei dati categoriali, entrambi aspetti essenziali del toolkit di qualsiasi data scientist. Prima di passare oltre, nel prossimo articolo esplorerò il ruolo dello scaling nei metodi di regressione applicati alla classificazione. In particolare, esaminerò la regressione logistica e vedrai che il risultato è molto diverso da quello che hai appena visto nel contesto di k-Nearest Neighbors.
Nella finestra interattiva qui sotto puoi sperimentare direttamente con i dati. Inizia modificando la variabile n_neig, che è il numero di vicini da usare nell'algoritmo k-NN. Puoi anche scalare i dati impostando sc = True, se lo desideri. Quindi esegui l'intero script per riportare l'accuratezza del modello, insieme a un classification report.
Dizionario
Supervised learning: Il compito di inferire una variabile target a partire da variabili predittive. Per esempio, inferire la variabile target "presenza di malattia cardiaca" da variabili predittive come "età", "sesso" e "stato di fumatore".
Classification task: Un compito di apprendimento supervisionato è una classification task se la variabile target è costituita da categorie (ad es. "click" o "no", tumore "maligno" o "benigno").
Regression task: Un compito di apprendimento supervisionato è una regression task se la variabile target è una variabile che varia in continuo (ad es. prezzo di una casa) o una variabile categoriale ordinata come "valutazione della qualità del vino".
k-Nearest Neighbors: Un algoritmo per classification task, in cui a un punto dato viene assegnata l'etichetta decisa dalla maggioranza dei suoi k vicini più prossimi.
Preprocessing: Qualsiasi numero di operazioni che i data scientist usano per portare i dati in una forma più adatta a ciò che intendono farne. Per esempio, prima di eseguire un'analisi del sentiment su dati di Twitter, potresti voler rimuovere eventuali tag html, spazi bianchi, espandere le abbreviazioni e dividere i tweet in elenchi delle parole che contengono.
Centratura e scaling: Entrambi sono forme di preprocessing dei dati numerici, cioè dati costituiti da numeri, in contrapposizione a categorie o stringhe, per esempio; centrare una variabile significa sottrarre la media della variabile da ogni punto dato in modo che la media della nuova variabile sia 0; scalare una variabile significa moltiplicare ogni punto dato per una costante al fine di modificare l'intervallo dei dati. Vedi il corpo dell'articolo per l'importanza di questi passaggi, con esempi.
Questo articolo è stato generato da un Jupyter notebook. Puoi scaricare il notebook qui.