Tecniche pratiche di campionamento e confronto, in Python |  di Piero Paialunga |  Dicembre 2023

 | Intelligenza-Artificiale

Ecco un tutorial passo passo su come campionare il tuo set di dati in modo efficiente utilizzando Python

Immagine dell’autore

IO stavo montando l’albero di Natale con mia moglie. Siamo andati nel seminterrato, abbiamo preso l’albero, lo abbiamo portato di sopra e abbiamo iniziato a costruirlo dal basso verso l’alto. È sempre un momento magico🎄

Poi è arrivato il momento di mettere le palline sull’albero. E subito ho pensato: ci sono almeno tre modi per mettere le palline sull’albero.

  • Uniformemente: metti le palline in modo uniforme sull’albero, più o meno così
Immagine dell’autore, realizzata utilizzando Freepik
  • A caso: metti le palline a caso sull’albero, chiudendo gli occhi e mettendo la pallina dove preferisci (ho iniziato a fare così e mia moglie è impazzita)
Immagine dell’autore, realizzata utilizzando Freepik
  • Ipercubo latino: divide l’albero in N sezioni ed estrae in modo casuale in ciascuna di queste sezioni. È molto difficile disegnarlo senza eseguire alcun codice, ma un possibile ipercubo latino assomiglia a questo:
Immagine dell’autore, realizzata utilizzando Freepik

Ho provato a mostrarlo a mia moglie. Lei ha sorriso e ha detto “Non importa”, quindi sono andata al computer nella speranza che la tua reazione fosse qualcosa di più soddisfacente 😤

Scherzi a parte, quando si affrontano problemi di Machine Learning ci sono due diversi scenari:

  1. Non hai alcun controllo sul set di dati. Hai un cliente, o un’azienda, che ti consegna un set di dati. Di questo dovrai occuparti finché non verrà programmata una necessaria (eventuale) riqualificazione.

Ad esempio, nella città di New York, vuoi prevedere il prezzo di una casa in base ad alcune caratteristiche specifiche. Ti danno semplicemente il set di dati e vogliono che tu costruisca il tuo modello in modo che quando arriva un nuovo cliente tu abbia un software AI in grado di prevedere il prezzo in base alle caratteristiche della casa di interesse.

2. Puoi costruire il tuo progetto di esperimento. Questo è quando hai un modello avanzato o un esperimento nel mondo reale che puoi sempre impostare per l’esecuzione.

Ad esempio, in un laboratorio, vuoi prevedere un segnale fisico data una configurazione sperimentale. Puoi sempre andare al laboratorio e generare nuovi dati.

Le considerazioni che si fanno nei due casi sono completamente diverse.

Nel primo caso ci si può aspettare un dataset sbilanciato nelle sue caratteristiche, magari con valori di input mancanti e una distribuzione distorta dei valori target. Tuttavia, affrontare queste cose è la gioia e la dannazione del lavoro di un data scientist. Esegui l’aumento dei dati, il filtraggio dei dati, inserisci i valori mancanti, esegui alcuni test ANOVA se puoi e così via. Nel secondo caso, hai il controllo completo su ciò che accade nel tuo set di dati, soprattutto dal punto di vista dell’input. Ciò significa che se hai un valore NaN puoi ripetere l’esperimento, se hai diversi valori NaN puoi indagare su quella strana area del tuo set di dati, se hai un valore sospetto elevato per alcune determinate funzionalità puoi semplicemente ripetere l’esperimento per fare certo non è un’allucinazione del tuo setup.

Poiché abbiamo questa quantità di controllo, vogliamo assicurarci di coprire in modo efficiente lo spazio dei parametri di input. Ad esempio, se hai 3 parametri e conosci i limiti

Immagine dell’autore

dove i va da 1 a 3 (o da 0 a 2 se ti piace così tanto Python 😁). In questo caso, x_i è la i-esima variabile e sarà sempre maggiore di x_i^L(limite inferiore), ma sarà sempre minore di x_i^U(limite superiore).

Abbiamo il nostro cubo tridimensionale.

Immagine dell’autore

Ora, ricorda che abbiamo il controllo completo del nostro set di dati. Come campioniamo? In altre parole, come determiniamo il XS ? Quali sono i punti che vogliamo selezionare in modo da eseguire il modello futuro (esperimento o simulazione) e ottenere i valori target?

Come puoi aspettarti, ci sono diversi metodi per farlo. Ogni metodo ha i suoi vantaggi e svantaggi. In questo studio ne discuteremo, mostreremo la teoria alla base e mostreremo il codice affinché tutti possano utilizzarlo e comprendere meglio il meraviglioso mondo del campionamento. 🙂

Cominciamo con il campionamento uniforme:

Il metodo di campionamento uniforme è probabilmente il più semplice e famoso.

Si tratta semplicemente di suddividere ciascun parametro (o dimensione) in passaggi. Supponiamo di avere 3 passaggi per dimensione, per 2 dimensioni. Ogni dimensione va da 0 a 1 (lo estenderemo tra un minuto). Questo sarebbe il campionamento:

  • (0,0)
  • (0,0,5)
  • (0,1)
  • (0,5,0)
  • (0,5,0,5)
  • (0,5,1)
  • (1,0)
  • (1,0,5)
  • (1,1)

Ciò significa che fissiamo una variabile alla volta e aumentiamo gradualmente. Abbastanza semplice. Codifichiamolo:

1.1 Codice di campionamento uniforme

Come facciamo questo? Evitiamo questo tipo di struttura:

  • per a nelle dimensioni 1
  • per b in dimensione 2
  • ….
  • per l’ultima lettera dell’alfabeto nella dimensione numero di lettere dell’alfabeto: X.append((a,b,…,ultima lettera dell’alfabeto))

Non lo vogliamo perché non è molto efficiente ed è necessario definire una variabile per dimensione ed è fastidioso. Usiamo la magia insensato Invece.

la domanda np.meshgrid(*punti) fa quello che faresti usando il ciclo for ma in modo ottimizzato. Il tuo parametro dict è pensato per essere il dizionario che ti dice qual è il minimo e il massimo per ciascun parametro.

Usando questo pezzo di codice genererai un cubo 0/1 e un cubo con tre dimensioni diverse (ad esempio -5 a 1 nella prima dimensione, 0 a 10 nella seconda dimensione e -1 a 1 nella terza dimensione):

Abbiamo tre dimensioni, tracciamo le prime 2:

1.2 Pro e contro

Professionisti: Questo metodo è molto conosciuto per due motivi. Il primo motivo è che è semplicissimo da implementare. È davvero un ciclo for tra variabili. Il secondo motivo è che ovviamente stai coprendo lo spazio dei parametri in modo uniforme, il che è l’ideale se vuoi essere sicuro di non perdere parti importanti dello spazio dei parametri

Contro: L’enorme problema con questo metodo è ovviamente la dipendenza esponenziale. Se assumiamo che il numero di dimensioni sia fisso (diciamo 6) per un progetto di passi = 10, stai già osservando una realizzazione in un milione di punti. E il problema, ancora una volta, è l’esponenziale della cosa. Quindi se vuoi aumentare il numero di passi raddoppiandolo (20 passi invece di 10) ora stai parlando di un problema di punti da 64M.

Un’alternativa al campionamento uniforme è il campionamento casuale. Come funziona? È molto semplice: nel cubo di interesse, basta selezionare casualmente i punti nei confini.

2.1 Codice di campionamento casuale

Il metodo di campionamento casuale è estremamente semplice da codificare, sia per i cubi 0–1 che per i cubi con confini personalizzati. Questo è come:

Tracciamo questo:

2.2 Pro e contro

Professionisti: Anche in questo caso il campionamento casuale è estremamente semplice da capire e da codificare (come avete visto). Un altro vantaggio è che questo metodo riesce a catturare la complessità dello spazio di output meglio del campionamento uniforme, soprattutto per grandi dimensioni.

Contro: Il problema è la casualità intrinseca del campionamento. Ciò può potenzialmente creare cluster e aree di scarsa esplorazione.

Giusto per essere un po’ più approfonditi, il documento prodotto da Pedergnana et al (estremamente buono) confronta la differenza tra questi due metodi e altri, soprattutto per l’alta dimensionalità.

Il campionamento dell’ipercubo latino è solitamente definito come “campionamento uniformemente randomizzato”. Penso che questa sia una definizione molto bella. Lasciami spiegare l’idea.

L’idea chiave alla base di LHS è quella di dividere lo spazio dei parametri in intervalli ugualmente probabili lungo ciascuna dimensione e garantire che, all’interno di ciascun intervallo, venga prelevato un solo campione. Ciò si traduce in un campione stratificato e ben distribuito che copre l’intero spazio dei parametri.

La cosa bella dell’Ipercubo latino è che puoi usarlo metodi di ottimizzazionead esempio, per massimizzare la distanza minima tra i punti e posizionare il punto in una posizione casuale all’interno del suo intervallo.

3.1 Codice latino dell’ipercubo

Questo metodo merita un’installazione personalizzata, ovvero Surrogate Modeling Toolbox (smt)

pip install smt

Facilissimo farlo:

3.2 Pro e contro

L’ipercubo latino è visivamente simile al campionamento casuale, ma in più dimensioni aiuta a preservarne una forma regolarità nel campionamento casuale senza i limiti del campionamento uniforme. Questo metodo è, nella sua variante, quello preferito per grandi dimensioni con pochi campioni (che è il caso più complicato da considerare). Lo svantaggio di questo metodo è il fatto che è molto più complesso sia da implementare che da descrivere, quindi richiede conoscenza del dominio e un po’ di pratica pratica.

In questo post del blog, abbiamo visto tre progetti di tecniche sperimentali, o di campionamento, per casi di machine learning in cui è possibile un controllo dei parametri di input. In particolare abbiamo visto:

  • Campionamento uniforme (griglia).: questo è un metodo per costruire una griglia N-esima dimensione, dove N è il numero di dimensioni. Di semplice utilizzo, ma non sufficientemente dettagliato soprattutto per le grandi dimensioni.
  • Il campionamento casuale è il metodo per definire ed estrarre il cubo di N-esima dimensione valori casuali nel cubo. Di semplice utilizzo e migliore funzionamento rispetto al campionamento uniforme in caso di grandi dimensioni, ma comunque non ottimale in quanto può creare cluster e zone troppo dense
  • Campionamento dell’ipercubo latino è un metodo che regolarizza il campionamento casuale imponendo che almeno un punto venga campionato per diverse sezioni dell’ipercubo N-esimo dimensionale. Ottimale per grandi dimensionalità e pochi campioni ma richiede la conoscenza del dominio e una procedura di ottimizzazione

Abbiamo visto i tre casi con esempi di codifica per entrambi i cubi unitari (da 0 a 1 per ciascuna variabile) e limiti personalizzati per ciascuna variabile.

Nessun metodo è perfetto e l’adozione dell’uno o dell’altro dipende dal tuo obiettivo finale. Spero che questo articolo ti offra un quadro di riferimento su cui lavorare al momento di decidere quale progettazione dell’esperimento è meglio adottare 🙂

Se ti è piaciuto l’articolo e vuoi saperne di più sul machine learning, o semplicemente vuoi chiedermi qualcosa, puoi:

R. Seguimi Linkedindove pubblico tutte le mie storie
B. Iscriviti al mio notiziario. Ti terrà aggiornato sulle nuove storie e ti darà la possibilità di scrivermi per ricevere tutte le correzioni o i dubbi che potresti avere.
C. Diventa a membro segnalatoquindi non avrai alcun “numero massimo di storie per il mese” e potrai leggere tutto ciò che io (e migliaia di altri scrittori di punta di Machine Learning e Data Science) scrivo sulla più recente tecnologia disponibile.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *