Preelaborazione dei dati per il machine learning: opzioni e raccomandazioni

Questo documento è il primo di una serie in due parti che esplora il tema dell'ingegneria dei dati e dell'ingegneria delle funzionalità per l'apprendimento automatico (ML), con particolare attenzione alle attività di apprendimento supervisionato. Questa prima parte illustra le best practice per la preelaborazione dei dati in una pipeline di ML su Google Cloud. Il documento si concentra sull'utilizzo di TensorFlow e della libreria open source TensorFlow Transform ( tf.Transform ) per preparare i dati, addestrare il modello e servire il modello per la previsione. Questo documento evidenzia le sfide della preelaborazione dei dati per il machine learning e descrive le opzioni e gli scenari per eseguire in modo efficace la trasformazione dei dati su Google Cloud.

Questo documento presuppone che tu abbia familiarità con BigQuery , Dataflow , Vertex AI e l'API TensorFlow Keras .

Il secondo documento, Preelaborazione dei dati per ML con Google Cloud , fornisce un tutorial passo passo su come implementare una pipeline tf.Transform .

introduzione

Il machine learning ti aiuta a trovare automaticamente modelli complessi e potenzialmente utili nei dati. Questi modelli vengono condensati in un modello ML che può quindi essere utilizzato su nuovi punti dati, un processo chiamato fare previsioni o eseguire inferenze .

La creazione di un modello ML è un processo in più fasi. Ogni passaggio presenta le proprie sfide tecniche e concettuali. Questa serie in due parti si concentra sulle attività di apprendimento supervisionato e sul processo di selezione, trasformazione e aumento dei dati di origine per creare potenti segnali predittivi per la variabile target. Queste operazioni combinano la conoscenza del dominio con le tecniche di data science. Le operazioni sono l'essenza dell'ingegneria delle funzionalità .

La dimensione dei set di dati di addestramento per i modelli ML del mondo reale può essere facilmente uguale o superiore a un terabyte (TB). Pertanto, sono necessari framework di elaborazione dati su larga scala per elaborare questi set di dati in modo efficiente e distribuito. Quando utilizzi un modello ML per effettuare previsioni, devi applicare le stesse trasformazioni utilizzate per i dati di training sui nuovi punti dati. Applicando le stesse trasformazioni, presenti il ​​set di dati in tempo reale al modello ML nel modo previsto dal modello.

Questo documento discute queste sfide per diversi livelli di granularità delle operazioni di ingegneria delle funzionalità: aggregazioni a livello di istanza, passaggio completo e finestra temporale. Questo documento descrive inoltre le opzioni e gli scenari per eseguire la trasformazione dei dati per il machine learning su Google Cloud.

Questo documento fornisce anche una panoramica di TensorFlow Transform ( tf.Transform ), una libreria per TensorFlow che consente di definire la trasformazione dei dati sia a livello di istanza che a passaggio completo attraverso pipeline di preelaborazione dei dati. Queste pipeline vengono eseguite con Apache Beam e creano artefatti che consentono di applicare le stesse trasformazioni durante la previsione di quando viene servito il modello.

Preelaborazione dei dati per ML

Questa sezione introduce le operazioni di preelaborazione dei dati e le fasi di preparazione dei dati. Vengono inoltre discussi i tipi di operazioni di preelaborazione e la loro granularità.

Ingegneria dei dati rispetto all'ingegneria delle funzionalità

La preelaborazione dei dati per il machine learning coinvolge sia l'ingegneria dei dati che l'ingegneria delle funzionalità. L'ingegneria dei dati è il processo di conversione dei dati grezzi in dati preparati . L'ingegneria delle funzionalità ottimizza quindi i dati preparati per creare le funzionalità previste dal modello ML. Questi termini hanno i seguenti significati:

Dati grezzi (o semplicemente dati )
I dati nel loro formato originale, senza alcuna preparazione preliminare per il ML. In questo contesto, i dati potrebbero essere nella loro forma grezza (in un data Lake) o in forma trasformata (in un data warehouse). I dati trasformati presenti in un data warehouse potrebbero essere stati convertiti dalla forma grezza originale per essere utilizzati per l'analisi. Tuttavia, in questo contesto, dati grezzi significa che i dati non sono stati preparati appositamente per la tua attività di ML. I dati sono considerati dati grezzi anche se vengono inviati da sistemi di streaming che eventualmente chiamano modelli ML per le previsioni.
Dati preparati
Il set di dati nel modulo è pronto per la tua attività di ML: le origini dati sono state analizzate, unite e inserite in un formato tabellare. I dati preparati vengono aggregati e riepilogati con la giusta granularità: ad esempio, ogni riga nel set di dati rappresenta un cliente univoco e ogni colonna rappresenta informazioni di riepilogo per il cliente, come il totale speso nelle ultime sei settimane. In una tabella dati preparata, le colonne non pertinenti sono state eliminate e i record non validi sono stati filtrati. Per le attività di apprendimento supervisionato, è presente la funzionalità target.
Funzionalità ingegnerizzate
Il set di dati con le funzionalità ottimizzate previste dal modello, ovvero le funzionalità create eseguendo determinate operazioni specifiche di ML sulle colonne nel set di dati preparato e creando nuove funzionalità per il modello durante l'addestramento e la previsione, come descritto più avanti in Operazioni di preelaborazione . Esempi di queste operazioni includono il ridimensionamento delle colonne numeriche su un valore compreso tra 0 e 1, il ritaglio di valori e le funzionalità categoriche di codifica a caldo .

Il diagramma seguente, Figura 1, mostra i passaggi coinvolti nella preparazione dei dati preelaborati:

Diagramma di flusso che mostra lo spostamento dei dati grezzi verso i dati preparati verso le funzionalità ingegnerizzate.
Figura 1. Il flusso di dati, dai dati grezzi ai dati preparati, alle funzionalità ingegnerizzate fino all'apprendimento automatico.

In pratica, i dati provenienti dalla stessa fonte si trovano spesso a stadi di preparazione diversi. Ad esempio, un campo di una tabella nel data warehouse potrebbe essere utilizzato direttamente come funzionalità progettata. Allo stesso tempo, un altro campo nella stessa tabella potrebbe dover subire delle trasformazioni prima di diventare una funzionalità progettata. Allo stesso modo, le operazioni di ingegneria dei dati e di ingegneria delle funzionalità potrebbero essere combinate nella stessa fase di preelaborazione dei dati.

Operazioni di preelaborazione

La preelaborazione dei dati comprende diverse operazioni. Ogni operazione è progettata per aiutare il machine learning a creare modelli predittivi migliori. I dettagli di queste operazioni di preelaborazione non rientrano nell'ambito di questo documento, ma alcune operazioni vengono brevemente descritte in questa sezione.

Per i dati strutturati, le operazioni di preelaborazione dei dati includono quanto segue:

  • Pulizia dei dati: rimozione o correzione di record che presentano valori danneggiati o non validi dai dati grezzi e rimozione di record a cui manca un gran numero di colonne.
  • Selezione e partizionamento delle istanze: selezione di punti dati dal set di dati di input per creare set di training, valutazione (convalida) e test . Questo processo include tecniche per il campionamento casuale ripetibile, il sovracampionamento delle classi minoritarie e il partizionamento stratificato.
  • Ottimizzazione delle funzionalità: miglioramento della qualità di una funzionalità per ML, che include il ridimensionamento e la normalizzazione dei valori numerici, l'attribuzione di valori mancanti, il ritaglio di valori anomali e la regolazione di valori con distribuzioni distorte.
  • Trasformazione delle funzionalità: conversione di una funzionalità numerica in una funzionalità categoriale (tramite bucketization ) e conversione di funzionalità categoriali in una rappresentazione numerica (tramite codifica one-hot, apprendimento con conteggi , incorporamenti di funzionalità sparse, ecc.). Alcuni modelli funzionano solo con funzionalità numeriche o categoriali, mentre altri possono gestire funzionalità di tipo misto. Anche quando i modelli gestiscono entrambi i tipi, possono trarre vantaggio da rappresentazioni diverse (numeriche e categoriali) della stessa caratteristica.
  • Estrazione di funzionalità: ridurre il numero di funzionalità creando rappresentazioni di dati di dimensioni inferiori e più potenti utilizzando tecniche come PCA , incorporamento dell'estrazione e hashing .
  • Selezione delle funzionalità: selezionare un sottoinsieme delle funzionalità di input per l'addestramento del modello e ignorare quelle irrilevanti o ridondanti, utilizzando metodi di filtro o wrapper . La selezione delle funzionalità può anche implicare semplicemente l'eliminazione delle funzionalità se alle funzionalità manca un gran numero di valori.
  • Costruzione di caratteristiche: creazione di nuove caratteristiche utilizzando tecniche tipiche, come l'espansione polinomiale (utilizzando funzioni matematiche univariate) o l'incrocio di caratteristiche (per catturare le interazioni delle caratteristiche). Le funzionalità possono anche essere costruite utilizzando la logica aziendale dal dominio del caso d'uso ML.

Quando lavori con dati non strutturati (ad esempio immagini, audio o documenti di testo), il deep learning sostituisce l'ingegneria delle funzionalità basata sulla conoscenza del dominio inserendola nell'architettura del modello. Uno strato convoluzionale è un preprocessore automatico di funzionalità. Costruire la giusta architettura del modello richiede una certa conoscenza empirica dei dati. Inoltre, è necessaria una certa quantità di preelaborazione, come la seguente:

  • Per documenti di testo: derivazione e lemmatizzazione , calcolo TF-IDF ed estrazione di n-grammi , ricerca per incorporamento.
  • Per le immagini: ritaglio, ridimensionamento, ritaglio, sfocatura gaussiana e filtri canary.
  • Per tutti i tipi di dati (inclusi testo e immagini): trasferimento dell'apprendimento , che tratta tutti gli strati tranne gli ultimi del modello completamente addestrato come un passaggio di progettazione delle funzionalità.

Granularità della preelaborazione

In questa sezione viene illustrata la granularità dei tipi di trasformazioni dei dati. Mostra perché questa prospettiva è fondamentale quando si preparano nuovi punti dati per le previsioni utilizzando trasformazioni applicate ai dati di training.

Le operazioni di preelaborazione e trasformazione possono essere classificate come segue, in base alla granularità dell'operazione:

  • Trasformazioni a livello di istanza durante l'addestramento e la previsione . Si tratta di trasformazioni semplici, in cui per la trasformazione sono necessari solo i valori della stessa istanza. Ad esempio, le trasformazioni a livello di istanza potrebbero includere il ritaglio del valore di una funzionalità fino a una soglia, l'espansione polinomiale di un'altra funzionalità, la moltiplicazione di due funzionalità o il confronto di due funzionalità per creare un flag booleano.

    Queste trasformazioni devono essere applicate in modo identico durante l'addestramento e la previsione, poiché il modello verrà addestrato sulle caratteristiche trasformate, non sui valori di input grezzi. Se i dati non vengono trasformati in modo identico, il modello si comporta in modo inadeguato perché vengono presentati dati con una distribuzione di valori con cui non è stato addestrato. Per ulteriori informazioni, vedere la discussione sull'inclinazione del servizio di formazione nella sezione Sfide di preelaborazione .

  • Trasformazioni a passaggio completo durante l'addestramento, ma trasformazioni a livello di istanza durante la previsione . In questo scenario, le trasformazioni sono stateful perché utilizzano alcune statistiche precalcolate per eseguire la trasformazione. Durante l'addestramento, si analizza l'intero corpo dei dati di addestramento per calcolare quantità quali minimo, massimo, media e varianza per trasformare i dati di addestramento, i dati di valutazione e i nuovi dati al momento della previsione.

    Ad esempio, per normalizzare una caratteristica numerica per l'addestramento, calcolarne la media (μ) e la deviazione standard (σ) sull'insieme dei dati di addestramento. Questo calcolo è chiamato operazione di passaggio completo (o analisi ). Quando servi il modello per la previsione, il valore di un nuovo punto dati viene normalizzato per evitare distorsioni nel servizio di training. Pertanto, i valori μ e σ calcolati durante l'addestramento vengono utilizzati per regolare il valore della funzionalità, ovvero la seguente semplice operazione a livello di istanza :

    $$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$

    Le trasformazioni a passaggio completo includono quanto segue:

    • MinMax ridimensiona le caratteristiche numeriche utilizzando il minimo e il massimo calcolati dal set di dati di addestramento.
    • Caratteristiche numeriche di ridimensionamento standard (normalizzazione del punteggio z) utilizzando μ e σ calcolati sul set di dati di addestramento.
    • Separazione di caratteristiche numeriche mediante l'uso dei quantili.
    • Assegnazione dei valori mancanti utilizzando la mediana (caratteristiche numeriche) o la moda (caratteristiche categoriali).
    • Conversione di stringhe (valori nominali) in numeri interi (indici) estraendo tutti i valori distinti (vocabolario) di una caratteristica categoriale di input.
    • Conteggio dell'occorrenza di un termine (valore della caratteristica) in tutti i documenti (istanze) per calcolare TF-IDF.
    • Calcolo della PCA delle caratteristiche di input per proiettare i dati in uno spazio dimensionale inferiore (con caratteristiche linearmente dipendenti).

    Dovresti utilizzare solo i dati di training per calcolare statistiche come μ, σ, min e max . Se aggiungi i dati di test e valutazione per queste operazioni, stai perdendo informazioni dai dati di valutazione e test per addestrare il modello. Ciò influisce sull'affidabilità del test e sui risultati della valutazione. Per garantire l'applicazione di una trasformazione coerente a tutti i set di dati, utilizzare le stesse statistiche calcolate dai dati di training per trasformare i dati di test e valutazione.

  • Aggregazioni storiche durante l'allenamento e la previsione . Ciò comporta la creazione di aggregazioni, derivazioni e flag aziendali come segnali di input per l'attività di previsione, ad esempio la creazione di metriche di recency, frequenza e monetarie (RFM) per consentire ai clienti di creare modelli di propensione. Questi tipi di funzionalità possono essere precalcolati e archiviati in un archivio di funzionalità per essere utilizzati durante l'addestramento del modello, il punteggio batch e la pubblicazione delle previsioni online. È inoltre possibile eseguire ulteriore progettazione di funzionalità (ad esempio, trasformazione e ottimizzazione) su queste aggregazioni prima dell'addestramento e della previsione.

  • Aggregazioni storiche durante l'addestramento, ma aggregazioni in tempo reale durante la previsione . Questo approccio prevede la creazione di una funzionalità riepilogando i valori in tempo reale nel tempo. In questo approccio, le istanze da aggregare sono definite tramite clausole di finestra temporale. Ad esempio, puoi utilizzare questo approccio se desideri addestrare un modello che stima il tempo di viaggio del taxi in base ai parametri di traffico per il percorso negli ultimi 5 minuti, negli ultimi 10 minuti, negli ultimi 30 minuti e in altri casi. intervalli. È inoltre possibile utilizzare questo approccio per prevedere il guasto di una parte del motore in base alla media mobile dei valori di temperatura e vibrazione calcolati negli ultimi 3 minuti. Sebbene queste aggregazioni possano essere preparate offline per l'addestramento, vengono calcolate in tempo reale da un flusso di dati durante l'elaborazione.

    Più precisamente, quando si preparano i dati di training, se il valore aggregato non è presente nei dati grezzi, il valore viene creato durante la fase di ingegneria dei dati. I dati grezzi vengono solitamente archiviati in un database con un formato (entity, timestamp, value) . Negli esempi precedenti, entity è l'identificatore del segmento di percorso per le tratte in taxi e l'identificatore della parte del motore per il guasto del motore. Puoi utilizzare le operazioni di finestra per calcolare (entity, time_index, aggregated_value_over_time_window) e utilizzare le funzionalità di aggregazione come input per l'addestramento del modello.

    Quando viene fornito il modello per la previsione in tempo reale (online), il modello prevede funzionalità derivate dai valori aggregati come input. Pertanto, puoi utilizzare una tecnologia di elaborazione del flusso come Apache Beam per calcolare le aggregazioni dai punti dati in tempo reale trasmessi in streaming nel tuo sistema. La tecnologia di elaborazione del flusso aggrega i dati in tempo reale in base a finestre temporali man mano che arrivano nuovi punti dati. È inoltre possibile eseguire ulteriore progettazione di funzionalità (ad esempio, trasformazione e ottimizzazione) su queste aggregazioni prima dell'addestramento e della previsione.

Pipeline di machine learning su Google Cloud

Questa sezione illustra i componenti principali di una tipica pipeline end-to-end per addestrare e servire modelli TensorFlow ML su Google Cloud utilizzando servizi gestiti. Viene inoltre illustrato dove è possibile implementare diverse categorie di operazioni di pre-elaborazione dei dati e le sfide comuni che potresti incontrare quando implementi tali trasformazioni. La sezione Come funziona tf.Transform mostra come la libreria TensorFlow Transform aiuta ad affrontare queste sfide.

Architettura di alto livello

Il diagramma seguente, figura 2, mostra un'architettura di alto livello di una tipica pipeline ML per l'addestramento e la gestione dei modelli TensorFlow. Le etichette A, B e C nel diagramma si riferiscono ai diversi punti della pipeline in cui può avvenire la preelaborazione dei dati. I dettagli su questi passaggi sono forniti nella sezione seguente.

Diagramma dell'architettura che mostra le fasi per l'elaborazione dei dati.
Figura 2. Architettura di alto livello per la formazione e la fornitura di ML su Google Cloud.

La pipeline è composta dai seguenti passaggi:

  1. Dopo aver importato i dati non elaborati, i dati tabulari vengono archiviati in BigQuery e altri dati come immagini, audio e video vengono archiviati in Cloud Storage. La seconda parte di questa serie utilizza come esempio i dati tabulari archiviati in BigQuery.
  2. L'ingegneria dei dati (preparazione) e l'ingegneria delle funzionalità vengono eseguite su larga scala utilizzando Dataflow. Questa esecuzione produce set di test, valutazione e formazione pronti per il machine learning archiviati in Cloud Storage. Idealmente, questi set di dati vengono archiviati come file TFRecord , che è il formato ottimizzato per i calcoli TensorFlow.
  3. Un pacchetto di addestramento del modello TensorFlow viene inviato a Vertex AI Training, che utilizza i dati preelaborati dei passaggi precedenti per addestrare il modello. L'output di questo passaggio è un TensorFlow SavedModel addestrato che viene esportato in Cloud Storage.
  4. Il modello TensorFlow addestrato viene distribuito a Vertex AI Prediction come servizio dotato di un'API REST in modo che possa essere utilizzato per le previsioni online. Lo stesso modello può essere utilizzato anche per lavori di previsione batch.
  5. Dopo che il modello è stato distribuito come API REST, le app client e i sistemi interni possono richiamare l'API inviando richieste con alcuni punti dati e ricevendo risposte dal modello con previsioni.
  6. Per orchestrare e automatizzare questa pipeline, puoi utilizzare Vertex AI Pipelines come pianificatore per richiamare i passaggi di preparazione dei dati, training del modello e distribuzione del modello.

Puoi anche utilizzare Vertex AI Feature Store per archiviare funzionalità di input per fare previsioni. Ad esempio, puoi creare periodicamente funzionalità ingegnerizzate dai dati grezzi più recenti e archiviarli nel Vertex AI Feature Store. Le app client recuperano le funzionalità di input richieste da Vertex AI Feature Store e le inviano al modello per ricevere previsioni.

Dove eseguire la preelaborazione

Nella figura 2, le etichette A, B e C mostrano che le operazioni di preelaborazione dei dati possono avvenire in BigQuery, Dataflow o TensorFlow. Le sezioni seguenti descrivono il funzionamento di ciascuna di queste opzioni.

Opzione A: BigQuery

In genere, la logica viene implementata in BigQuery per le seguenti operazioni:

  • Campionamento: selezione casuale di un sottoinsieme di dati.
  • Filtraggio: rimozione di istanze irrilevanti o non valide.
  • Partizionamento: suddivisione dei dati per produrre set di training, valutazione e test.

Gli script SQL BigQuery possono essere utilizzati come query di origine per la pipeline di preelaborazione di Dataflow, che è la fase di elaborazione dei dati nella figura 2. Ad esempio, se un sistema viene utilizzato in Canada e il data warehouse include transazioni da tutto il mondo, filtrando ottenere dati di addestramento solo per il Canada è meglio farlo in BigQuery. La progettazione delle funzionalità in BigQuery è semplice e scalabile e supporta l'implementazione di trasformazioni di funzionalità di aggregazioni cronologiche e a livello di istanza.

Tuttavia, ti consigliamo di utilizzare BigQuery per l'ingegneria delle funzionalità solo se utilizzi il modello per la previsione batch (punteggio) o se le funzionalità sono precalcolate in BigQuery, ma archiviate in Vertex AI Feature Store per essere utilizzate durante la previsione online. Se prevedi di distribuire il modello per le previsioni online e non disponi della funzionalità progettata in un archivio di funzionalità online, devi replicare le operazioni di preelaborazione SQL per trasformare i punti dati non elaborati generati da altri sistemi. In altre parole, devi implementare la logica due volte: una volta in SQL per preelaborare i dati di addestramento in BigQuery e una seconda volta nella logica dell'app che utilizza il modello per preelaborare i punti dati online per la previsione.

Ad esempio, se l'app client è scritta in Java, è necessario reimplementare la logica in Java. Ciò può introdurre errori dovuti a discrepanze di implementazione, come descritto nella sezione disallineamento del servizio di formazione delle sfide di preelaborazione più avanti in questo documento. È anche un sovraccarico aggiuntivo mantenere due diverse implementazioni. Ogni volta che si modifica la logica in SQL per preelaborare i dati di training, è necessario modificare di conseguenza l'implementazione Java per preelaborare i dati al momento dell'elaborazione.

Se utilizzi il modello solo per la previsione batch (ad esempio, utilizzando la previsione batch Vertex AI) e se i dati per il punteggio provengono da BigQuery, puoi implementare queste operazioni di preelaborazione come parte dello script SQL BigQuery. In tal caso, è possibile utilizzare lo stesso script SQL di preelaborazione per preparare sia i dati di training che quelli di punteggio.

Le trasformazioni con stato full-pass non sono adatte per l'implementazione in BigQuery. Se utilizzi BigQuery per trasformazioni a passaggio completo, hai bisogno di tabelle ausiliarie per archiviare le quantità necessarie per le trasformazioni con stato, come medie e varianze per ridimensionare le caratteristiche numeriche. Inoltre, l'implementazione di trasformazioni full-pass utilizzando SQL su BigQuery crea una maggiore complessità negli script SQL e crea una dipendenza complessa tra l'addestramento e gli script SQL di punteggio.

Opzione B: flusso di dati

Come mostrato nella figura 2, è possibile implementare operazioni di preelaborazione computazionalmente costose in Apache Beam ed eseguirle su larga scala utilizzando Dataflow. Dataflow è un servizio di scalabilità automatica completamente gestito per l'elaborazione di dati in batch e in flusso. Quando utilizzi Dataflow, puoi anche utilizzare librerie specializzate esterne per l'elaborazione dei dati, a differenza di BigQuery.

Dataflow può eseguire trasformazioni a livello di istanza e trasformazioni di funzionalità di aggregazione cronologica e in tempo reale. In particolare, se i modelli ML prevedono una funzionalità di input come total_number_of_clicks_last_90sec , le funzioni di finestra di Apache Beam possono calcolare queste funzionalità in base all'aggregazione dei valori delle finestre temporali dei dati degli eventi (streaming) in tempo reale (ad esempio, eventi di clic). Nella discussione precedente sulla granularità delle trasformazioni , si parlava di "aggregazioni storiche durante l'addestramento, ma aggregazioni in tempo reale durante la previsione".

Il diagramma seguente, figura 3, mostra il ruolo di Dataflow nell'elaborazione dei dati del flusso per previsioni quasi in tempo reale.

Architettura per l'utilizzo dei dati del flusso per la previsione.
Figura 3. Architettura di alto livello che utilizza i dati del flusso per la previsione in Dataflow.

Come illustrato nella figura 3, durante l'elaborazione, gli eventi chiamati punti dati vengono inseriti in Pub/Sub . Dataflow utilizza questi punti dati, calcola le funzionalità in base agli aggregati nel tempo e quindi chiama l'API del modello ML distribuito per le previsioni. Le previsioni vengono quindi inviate a una coda Pub/Sub in uscita. Da Pub/Sub, le previsioni possono essere utilizzate dai sistemi downstream come il monitoraggio o il controllo oppure possono essere inviate (ad esempio, come notifiche) al client richiedente originale. Le previsioni possono anche essere archiviate in un archivio dati a bassa latenza come Cloud Bigtable per il recupero in tempo reale. Cloud Bigtable può essere utilizzato anche per accumulare e archiviare queste aggregazioni in tempo reale in modo che possano essere consultate quando necessario per la previsione.

La stessa implementazione di Apache Beam può essere utilizzata per elaborare in batch i dati di addestramento provenienti da un datastore offline come BigQuery ed elaborare in streaming dati in tempo reale per fornire previsioni online.

In altre architetture tipiche, come quella illustrata nella figura 2, l'app client chiama direttamente l'API del modello distribuito per le previsioni online. In tal caso, se in Dataflow vengono implementate operazioni di preelaborazione per preparare i dati di addestramento, le operazioni non vengono applicate ai dati di previsione che vanno direttamente al modello. Pertanto, trasformazioni come queste dovrebbero essere integrate nel modello durante la pubblicazione delle previsioni online.

Il flusso di dati può essere utilizzato per eseguire trasformazioni full-pass, calcolando le statistiche richieste su larga scala. Tuttavia, queste statistiche devono essere archiviate da qualche parte per essere utilizzate durante la previsione per trasformare i punti dati della previsione. Utilizzando la libreria TensorFlow Transform ( tf.Transform ), puoi incorporare direttamente queste statistiche nel modello invece di memorizzarle altrove. Questo approccio viene spiegato più avanti in Come funziona tf.Transform .

Opzione C: TensorFlow

Come mostrato nella figura 2, è possibile implementare operazioni di preelaborazione e trasformazione dei dati nel modello TensorFlow stesso. Come mostrato nella figura, la preelaborazione implementata per l'addestramento del modello TensorFlow diventa parte integrante del modello quando il modello viene esportato e distribuito per le previsioni. Le trasformazioni nel modello TensorFlow possono essere realizzate in uno dei seguenti modi:

  • Implementazione di tutta la logica di trasformazione a livello di istanza nella funzione input_fn e nella serving_fn . La funzione input_fn prepara un set di dati utilizzando l' API tf.data.Dataset per addestrare un modello. La serving_fn riceve e prepara i dati per le previsioni.
  • Inserendo il codice di trasformazione direttamente nel tuo modello TensorFlow utilizzando i livelli di preelaborazione Keras o creando livelli personalizzati .

Il codice logico di trasformazione nella funzione serving_fn definisce l'interfaccia di servizio del tuo SavedModel per la previsione online. Se implementi le stesse trasformazioni utilizzate per preparare i dati di training nel codice della logica di trasformazione della serving_fn , garantisci che le stesse trasformazioni vengano applicate ai nuovi punti dati di previsione quando vengono serviti.

Tuttavia, poiché il modello TensorFlow elabora ogni punto dati in modo indipendente o in un piccolo batch, non puoi calcolare le aggregazioni da tutti i punti dati. Di conseguenza, le trasformazioni a passaggio completo non possono essere implementate nel modello TensorFlow.

Sfide di preelaborazione

Di seguito sono riportate le principali sfide legate all'implementazione della preelaborazione dei dati:

  • Distorsione del servizio di formazione . Lo squilibrio tra servizio e allenamento si riferisce alla differenza tra l'efficacia (prestazione predittiva) durante l'allenamento e durante il servizio. Questa distorsione può essere causata da una discrepanza tra il modo in cui gestisci i dati nelle pipeline di addestramento e di servizio. Ad esempio, se il tuo modello viene addestrato su una funzionalità trasformata logaritmicamente, ma viene presentata con la funzionalità grezza durante l'elaborazione, l'output della previsione potrebbe non essere accurato.

    Se le trasformazioni diventano parte del modello stesso, può essere semplice gestire le trasformazioni a livello di istanza, come descritto in precedenza in Opzione C: TensorFlow . In tal caso, l'interfaccia di servizio del modello (la serving_fn ) prevede dati grezzi, mentre il modello trasforma internamente questi dati prima di calcolare l'output. Le trasformazioni sono le stesse applicate ai punti dati grezzi di addestramento e previsione.

  • Trasformazioni a passaggio completo . Non è possibile implementare trasformazioni a passaggio completo come trasformazioni di ridimensionamento e normalizzazione nel modello TensorFlow. Nelle trasformazioni a passaggio completo, alcune statistiche (ad esempio, i valori max e min per ridimensionare le caratteristiche numeriche) devono essere calcolate in anticipo sui dati di training, come descritto in Opzione B: Flusso di dati . I valori devono quindi essere archiviati da qualche parte per essere utilizzati durante la fornitura del modello per la previsione per trasformare i nuovi punti dati grezzi come trasformazioni a livello di istanza, evitando così distorsioni nel servizio di training. Puoi utilizzare la libreria TensorFlow Transform ( tf.Transform ) per incorporare direttamente le statistiche nel tuo modello TensorFlow. Questo approccio viene spiegato più avanti in Come funziona tf.Transform .

  • Preparare i dati in anticipo per una migliore efficienza della formazione . L'implementazione di trasformazioni a livello di istanza come parte del modello può ridurre l'efficienza del processo di formazione. Questo peggioramento si verifica perché le stesse trasformazioni vengono applicate ripetutamente agli stessi dati di training in ogni epoca. Immagina di avere dati di addestramento non elaborati con 1.000 funzionalità e di applicare un mix di trasformazioni a livello di istanza per generare 10.000 funzionalità. Se implementi queste trasformazioni come parte del tuo modello e poi fornisci al modello i dati di training grezzi, queste 10.000 operazioni vengono applicate N volte su ciascuna istanza, dove N è il numero di epoche. Inoltre, se utilizzi acceleratori (GPU o TPU), rimangono inattivi mentre la CPU esegue tali trasformazioni, il che non costituisce un uso efficiente dei tuoi costosi acceleratori.

    Idealmente, i dati di addestramento vengono trasformati prima dell'addestramento, utilizzando la tecnica descritta in Opzione B: Flusso di dati , in cui le 10.000 operazioni di trasformazione vengono applicate solo una volta su ciascuna istanza di addestramento. I dati di training trasformati vengono quindi presentati al modello. Non vengono applicate ulteriori trasformazioni e gli acceleratori sono sempre occupati. Inoltre, l'utilizzo di Dataflow ti aiuta a preelaborare grandi quantità di dati su larga scala, utilizzando un servizio completamente gestito.

    La preparazione anticipata dei dati di addestramento può migliorare l'efficienza dell'addestramento. Tuttavia, l'implementazione della logica di trasformazione al di fuori del modello (gli approcci descritti in Opzione A: BigQuery o Opzione B: Dataflow ) non risolve il problema dell'asimmetria del servizio di formazione. A meno che non si memorizzi la funzionalità progettata nell'archivio funzionalità da utilizzare sia per il training che per la previsione, la logica di trasformazione deve essere implementata da qualche parte per essere applicata ai nuovi punti dati in arrivo per la previsione, poiché l'interfaccia del modello prevede dati trasformati. La libreria TensorFlow Transform ( tf.Transform ) può aiutarti a risolvere questo problema, come descritto nella sezione seguente.

Come funziona tf.Transform

La libreria tf.Transform è utile per le trasformazioni che richiedono un passaggio completo. L'output della libreria tf.Transform viene esportato come grafico TensorFlow che rappresenta la logica di trasformazione a livello di istanza e le statistiche calcolate dalle trasformazioni a passaggio completo, da utilizzare per l'addestramento e la gestione. L'utilizzo dello stesso grafico sia per l'addestramento che per il servizio può evitare distorsioni, poiché in entrambe le fasi vengono applicate le stesse trasformazioni. Inoltre, la libreria tf.Transform può essere eseguita su larga scala in una pipeline di elaborazione batch su Dataflow per preparare i dati di training in anticipo e migliorare l'efficienza della formazione.

Il diagramma seguente, figura 4, mostra come la libreria tf.Transform preelabora e trasforma i dati per il training e la previsione. Il processo è descritto nelle sezioni seguenti.

Diagramma che mostra il flusso dai dati grezzi attraverso tf.Transform alle previsioni.
Figura 4. Comportamento di tf.Transform per la preelaborazione e la trasformazione dei dati.

Trasforma i dati di formazione e valutazione

Preelabori i dati di training non elaborati utilizzando la trasformazione implementata nelle API tf.Transform Apache Beam e la esegui su larga scala su Dataflow. La preelaborazione avviene nelle seguenti fasi:

  • Fase di analisi: durante la fase di analisi, le statistiche richieste (come medie, varianze e quantili) per le trasformazioni con stato vengono calcolate sui dati di training con operazioni di passaggio completo. Questa fase produce una serie di artefatti di trasformazione, incluso il grafico transform_fn . Il grafico transform_fn è un grafico TensorFlow che ha la logica di trasformazione come operazioni a livello di istanza. Include le statistiche calcolate nella fase di analisi come costanti.
  • Fase di trasformazione: durante la fase di trasformazione, il grafico transform_fn viene applicato ai dati di training grezzi, in cui le statistiche calcolate vengono utilizzate per elaborare i record di dati (ad esempio, per ridimensionare le colonne numeriche) a livello di istanza.

Un approccio in due fasi come questo affronta la sfida della preelaborazione rappresentata dall'esecuzione di trasformazioni full-pass.

Quando i dati di valutazione vengono preelaborati, vengono applicate solo le operazioni a livello di istanza, utilizzando la logica nel grafico transform_fn e le statistiche calcolate dalla fase di analisi nei dati di training. In altre parole, non si analizzano i dati di valutazione in modo completo per calcolare nuove statistiche, come μ e σ, per normalizzare le caratteristiche numeriche nei dati di valutazione. Utilizza invece le statistiche calcolate dai dati di training per trasformare i dati di valutazione a livello di istanza.

I dati di addestramento e valutazione trasformati vengono preparati su larga scala utilizzando Dataflow, prima di essere utilizzati per addestrare il modello. Questo processo di preparazione dei dati batch affronta la sfida della preelaborazione di preparare i dati in anticipo per migliorare l'efficienza della formazione. Come mostrato nella Figura 4, l'interfaccia interna del modello prevede funzionalità trasformate.

Attacca le trasformazioni al modello esportato

Come notato, il grafico transform_fn prodotto dalla pipeline tf.Transform viene memorizzato come grafico Tensorflow esportato. Il grafico esportato è costituito dalla logica di trasformazione come operazioni a livello di istanza e tutte le statistiche calcolate nelle trasformazioni passa-pass come costanti del grafico. Quando il modello addestrato viene esportato per servire, il grafico transform_fn viene allegato al SAVEDMODEL come parte della sua funzione serving_fn .

Mentre sta servendo il modello per la previsione, l'interfaccia che serve il modello prevede punti dati nel formato grezzo (ovvero prima di qualsiasi trasformazione). Tuttavia, l'interfaccia interna del modello prevede i dati nel formato trasformato.

Il grafico transform_fn , che ora fa parte del modello, applica tutta la logica di preelaborazione sul punto dati in arrivo. Utilizza le costanti memorizzate (come μ e σ per normalizzare le caratteristiche numeriche) nell'operazione a livello di istanza durante la previsione. Pertanto, il grafico transform_fn converte il punto dati grezzo nel formato trasformato. Il formato trasformato è ciò che è previsto dall'interfaccia interna del modello per produrre la previsione, come mostrato nella Figura 4.

Questo meccanismo risolve la sfida di preelaborazione dell'inclinazione che serve da allenamento, poiché la stessa logica (implementazione) che viene utilizzata per trasformare i dati di formazione e valutazione viene applicata per trasformare i nuovi punti dati durante il servizio di previsione.

Riepilogo delle opzioni di preelaborazione

La tabella seguente riassume le opzioni di preelaborazione dei dati discusse questo documento. Nella tabella, "N/A" sta per "non applicabile".

Opzione di preelaborazione dei dati A livello di istanza
(trasformazioni apolide)

Passa intero durante la formazione e il livello di istanza durante il servizio (trasformazioni statali)

Aggregazioni in tempo reale (finestra) durante la formazione e il servizio (trasformazioni in streaming)

BigQuery (SQL)

Punteggio batch: OK : la stessa implementazione di trasformazione viene applicata sui dati durante la formazione e il punteggio batch.

Previsione online: non consigliato : è possibile elaborare i dati di formazione, ma si traduce in inclinazione di allenamento perché si elaborano i dati di servizio utilizzando strumenti diversi.

Punteggio batch: non consigliato .

Previsione online: non consigliata .

Sebbene sia possibile utilizzare le statistiche calcolate utilizzando BigQuery, ad esempio trasformazioni batch a livello di livello/online, non è facile perché è necessario mantenere un negozio di statistiche da popolare durante la formazione e utilizzato durante la previsione.

Punteggio batch: N/A —Aggregati come questi vengono calcolati in base a eventi in tempo reale.

Previsione online: non consigliato : è possibile elaborare i dati di formazione, ma si traduce in inclinazione di allenamento perché si elaborano i dati di servizio utilizzando strumenti diversi.

DataFlow (Apache Beam)

Punteggio batch: OK : la stessa implementazione di trasformazione viene applicata sui dati durante la formazione e il punteggio batch.

Previsione online: OK : se i dati al momento del servizio provengono da pub/sub per essere consumati dal flusso di dati. Altrimenti, si traduce in inclinazione di allenamento.

Punteggio batch: non consigliato .

Previsioni online: non consigliate .

Sebbene sia possibile utilizzare le statistiche calcolate utilizzando il flusso di dati per le trasformazioni batch/online a livello di livello, non è facile perché è necessario mantenere un negozio di statistiche da popolare durante la formazione e utilizzato durante la previsione.

Punteggio batch: N/A —Aggregati come questi vengono calcolati in base a eventi in tempo reale.

Previsione online: OK : la stessa trasformazione del raggio di Apache viene applicata sui dati durante la formazione (batch) e il servizio (flusso).

DataFlow (Apache Beam + TFT)

Punteggio batch: OK : la stessa implementazione di trasformazione viene applicata ai dati durante la formazione e il punteggio batch.

Previsione online: consigliato : evita di inclinarsi e prepara i dati di formazione in anticipo.

Punteggio batch: consigliato .

Previsione online: consigliata .

Entrambi gli usi sono consigliati perché la logica di trasformazione e le statistiche calcolate durante l'allenamento sono memorizzate come un grafico Tensorflow collegato al modello esportato per la servire.

Punteggio batch: N/A —Aggregati come questi vengono calcolati in base a eventi in tempo reale.

Previsione online: OK : la stessa trasformazione del raggio di Apache viene applicata sui dati durante la formazione (batch) e il servizio (flusso).

Tensorflow *
( input_fn & serving_fn )

Punteggio batch: non consigliato .

Previsione online: non consigliata .

Per l'efficienza di allenamento in entrambi i casi, è meglio preparare i dati di allenamento in anticipo.

Punteggio batch: non possibile .

Previsione online: non possibile .

Punteggio batch: N/A —Aggregati come questi vengono calcolati in base a eventi in tempo reale.

Previsione online: non possibile .

* Con Tensorflow, trasformazioni come l'incrocio, l'incorporamento e la codifica a un colpo devono essere eseguite dichiaratamente come colonne feature_columns .

Qual è il prossimo