Creare un modello di machine learning basato sullo spam dei commenti

1. Prima di iniziare

In questo codelab, esaminerai il codice creato con TensorFlow e TensorFlow Lite Model Maker per creare un modello utilizzando un set di dati basato sullo spam nei commenti. I dati originali sono disponibili su Kaggle. È stato raccolto in un unico CSV e ripulito rimuovendo testi non funzionanti, markup, parole ripetute e altro ancora. In questo modo sarà più facile concentrarsi sul modello anziché sul testo.

Il codice da esaminare è stato fornito qui, ma ti consigliamo vivamente di seguirlo in Google Colab.

Prerequisiti

  • Questo codelab è stato scritto per sviluppatori esperti che non hanno mai utilizzato il machine learning.
  • Questo codelab fa parte del percorso Inizia a utilizzare la classificazione del testo per i dispositivi mobili. Se non hai ancora completato le attività precedenti, interrompilo e fallo ora.

Obiettivi didattici

  • Come installare TensorFlow Lite Model Maker utilizzando Google Colab
  • Come scaricare i dati dal server Cloud sul dispositivo
  • Come utilizzare un caricatore dati
  • Come creare il modello

Che cosa ti serve

2. Installazione di TensorFlow Lite Model Maker

Apri Colab. Nella prima cella del blocco note viene installato automaticamente Model Maker TensorFLow Lite:

!pip install -q tflite-model-maker

Una volta completata l'operazione, passa alla cella successiva.

3. Importa il codice

La cella successiva contiene una serie di importazioni che il codice nel blocco note dovrà utilizzare:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Questa operazione verificherà anche se è in esecuzione TensorFlow 2.x, obbligatorio per l'utilizzo di Model Maker.

4. Scarica i dati

Successivamente, scaricherai i dati dal server Cloud sul dispositivo e imposterai data_file in modo che puntino al file locale:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

Model Maker può addestrare modelli partendo da file CSV semplici come questo. Devi solo specificare quali colonne contengono il testo e quali contengono le etichette. Vedrai come farlo più avanti nel codelab.

5. Incorporamenti preaddestrati

In genere, quando utilizzi Model Maker, i modelli non vengono creati da zero. Utilizzi modelli esistenti che puoi personalizzare in base alle tue esigenze.

Per i modelli linguistici, come questo, ciò prevede l'utilizzo di incorporamenti preaddestrati. L'idea alla base di un incorporamento è che le parole vengono convertite in numeri e a ogni parola del corpus complessivo viene assegnato un numero. Un incorporamento è un vettore utilizzato per determinare il sentiment della parola stabilendo una "direzione" per la parola. Ad esempio, le parole che vengono utilizzate spesso nei messaggi spam finiranno per avere i loro vettori che puntano in una direzione simile, mentre le parole che non puntano nella direzione opposta.

Utilizzando gli incorporamenti pre-appresi, puoi iniziare con un corpus, o raccolta, di parole che hanno già appreso da un grande corpo di testo un sentiment. In questo modo accederai a una soluzione molto più velocemente che partire da zero.

Model Maker offre diversi incorporamenti preaddestrati che puoi utilizzare, ma il modo più semplice e rapido per iniziare è average_word_vec.

Ecco il codice:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

Il parametro num_words

Occorre specificare anche il numero di parole che deve essere utilizzato dal modello.

Potresti pensare che "più è, meglio è", ma in genere esiste un numero giusto in base alla frequenza di utilizzo di ciascuna parola. Usando ogni parola dell'intero corpus, il modello potrebbe cercare di imparare e stabilire la direzione di parole usate una sola volta. In ogni corpus di testo scoprirai che molte parole vengono utilizzate solo una o due volte e in genere non vale la pena utilizzarle nel modello, poiché hanno un impatto trascurabile sul sentiment complessivo. Puoi ottimizzare il modello in base al numero di parole che vuoi utilizzando il parametro num_words.

Un numero più piccolo qui potrebbe dare un modello più piccolo e più veloce, ma potrebbe essere meno preciso, in quanto riconosce meno parole. Un numero più grande qui avrà un modello più grande e più lento. Trovare il punto giusto è fondamentale!

Il parametro wordvec_dim

Il parametro wordved_dim è il numero di dimensioni che vuoi utilizzare per il vettore per ogni parola. La regola empirica determinata dalla ricerca è che è la quarta radice del numero di parole. Ad esempio, se stai usando 2000 parole, un buon punto di partenza è 7. Modificando il numero di parole, puoi modificare anche questo valore.

Il parametro seq_len

I modelli sono generalmente molto rigidi per quanto riguarda i valori di input. Per un modello linguistico, ciò significa che può classificare frasi di una lunghezza particolare statica. Ciò è determinato dal parametro seq_len o dalla lunghezza della sequenza.

Quando converti le parole in numeri (o token), una frase diventa una sequenza di questi token. Di conseguenza, il tuo modello verrà addestrato (in questo caso) a classificare e riconoscere frasi con 20 token. Se la frase è più lunga di questa lunghezza, verrà troncata. Se è più corto, sarà imbottito. Nel corpus verrà visualizzato un token <PAD> dedicato che verrà utilizzato per questa operazione.

6. Utilizzare un caricatore dati

In precedenza hai scaricato il file CSV. Ora è il momento di utilizzare un caricatore di dati per trasformarli in dati di addestramento che il modello può riconoscere:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

Se apri il file CSV in un editor, noterai che ogni riga contiene solo due valori, descritti con testo nella prima riga del file. Generalmente, ogni voce viene considerata come una colonna.

Vedrai che il descrittore per la prima colonna è commenttext e che la prima voce su ogni riga è il testo del commento. Allo stesso modo, il descrittore della seconda colonna è spam e vedrai che la seconda voce in ogni riga è True o False, per indicare se quel testo è considerato spam nei commenti o meno. Le altre proprietà impostano il model_spec che hai creato in precedenza, insieme a un carattere di delimitatore, che in questo caso è una virgola, in quanto il file è separato da virgole. Userai questi dati per addestrare il modello, quindi is_Training è impostato su True.

Ti consigliamo di conservare una parte dei dati per testare il modello. Suddividi i dati, partendo per il 90% per l'addestramento e per il restante 10% per il test e la valutazione. Poiché lo scopo è quello di fare in modo che i dati di test siano scelti in modo casuale e non siano "in basso" del 10% del set di dati, quindi utilizzi shuffle=True quando carichi i dati per randomizzarli.

7. Crea il modello

La cella successiva serve semplicemente a creare il modello ed è composta da una singola riga di codice:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

In questo modo viene creato un modello di classificazione del testo con Model Maker. Vengono specificati i dati di addestramento da utilizzare (come configurato nel passaggio 4), la specifica del modello (configurata nel passaggio 4) e un numero di epoche, in questo caso 50.

Il principio di base del machine learning è che si tratta di una forma di corrispondenza di pattern. Inizialmente, carica i pesi preaddestrati per le parole e tenta di raggrupparli con una previsione di quali, una volta raggruppati, indicano spam e quali no. La prima volta, è probabile che si avvicini alle 50:50, poiché il modello è solo all'inizio.

b94b00f0b155db3d.png

Misurerà quindi i risultati ed eseguirà il codice di ottimizzazione per modificare la previsione, poi riprova. Questa è un'epoca. Quindi, specificando epochs=50, seguirà quel "loop" 50 volte.

85f1d21c0b64d654.png

Quando raggiungi la 50a epoca, il modello registrerà un livello di accuratezza molto più elevato. In questo caso, la percentuale è del 99%.

Sul lato destro, vedrai i valori relativi all'accuratezza della convalida. Questi valori sono in genere leggermente inferiori rispetto all'accuratezza dell'addestramento, in quanto indicano il modo in cui il modello classifica i dati che non ha "visto" in precedenza. Utilizza i dati di test del 10% che abbiamo accantonato in precedenza.

5be7967ec70e4302.png

8. Esporta il modello

Al termine dell'addestramento, puoi esportare il modello.

TensorFlow addestra un modello nel suo formato, che deve essere convertito nel formato TFLITE per essere utilizzato all'interno di un'app mobile. Model Maker gestisce questa complessità per te.

Esporta semplicemente il modello, specificando una directory:

model.export(export_dir='/mm_spam')

All'interno della directory vedrai un file model.tflite. Scaricala. Ti servirà nel prossimo codelab, dove lo aggiungerai alla tua app per Android.

Considerazioni relative a iOS

Il modello .tflite che hai appena esportato funziona bene per Android, perché i metadati relativi al modello sono incorporati al suo interno e Android Studio può leggerli.

Questi metadati sono molto importanti in quanto includono un dizionario di token che rappresentano le parole così come le riconosce dal modello. Ricordi ancora, quando hai imparato che le parole diventano token e che questi token ricevono vettori per il loro sentiment? La tua app mobile dovrà conoscere questi token. Ad esempio, se "cane" è stato tokenizzato su 42 e gli utenti digitano "cane" in una frase, l'app dovrà poi convertire "cane" a 42 in modo che il modello lo capisca. In qualità di sviluppatore Android, avrai a disposizione una "libreria di attività TensorFlow" che semplifica l'utilizzo, ma su iOS dovrai elaborare il vocabolario, quindi devi averlo a disposizione. Model Maker può esportarli specificando il parametro export_format. Quindi, per ottenere le etichette e il vocabolario per il modello, puoi utilizzare questo:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. Complimenti

Questo codelab ti ha illustrato il codice Python per la creazione e l'esportazione del tuo modello. alla fine c'è un file .tflite.

Nel prossimo codelab scoprirai come modificare la tua app per Android per utilizzare questo modello e iniziare a classificare i commenti spam.