Condividi tramite


Analizzare il sentiment usando l'interfaccia della riga di comando di ML.NET

Di seguito sono riportate informazioni su come usare l'interfaccia della riga di comando ML.NET per generare automaticamente un modello ML.NET e il codice C# sottostante. Specificare il set di dati e l'attività di Machine Learning da implementare e l'interfaccia della riga di comando usa il motore AutoML per creare la generazione di modelli e il codice sorgente della distribuzione, nonché il modello di classificazione.

In questa esercitazione verranno eseguite le operazioni seguenti:

  • Preparare i dati per l'attività di Machine Learning selezionata
  • Eseguire il comando 'mlnet classification' dall'interfaccia della riga di comando
  • Rivedere i risultati delle metriche di qualità
  • Comprendere il codice C# generato per usare il modello nell'applicazione
  • Esplorare il codice C# generato usato per il training del modello

Nota

Questo argomento si riferisce all'interfaccia della riga di comando ML.NET, attualmente in anteprima, e il materiale può essere soggetto a modifiche. Per altre informazioni, visitare la pagina ML.NET .

L'interfaccia della riga di comando ML.NET fa parte di ML.NET e l'obiettivo principale è "democratizzare" ML.NET per gli sviluppatori di .NET in modo che non sia necessario scrivere codice da zero quando iniziano a usarlo.

È possibile eseguire l'interfaccia della riga di comando ML.NET in qualsiasi prompt dei comandi (Windows, Mac o Linux) per generare modelli e codice sorgente ML.NET di buona qualità in base ai set di dati di training specificati.

Prerequisiti

È possibile eseguire i progetti di codice C# generati da Visual Studio o con dotnet run l'interfaccia della riga di comando (.NET).

Preparare i dati

Verrà usato un set di dati esistente per uno scenario di 'analisi del sentiment', che è un'attività di Machine Learning con classificazione binaria. È possibile usare in modo simile un set di dati personalizzato, con il modello e il codice che verranno generati automaticamente.

  1. Scaricare il file ZIP del set di dati Sentiment Labeled Sentences UCI (vedere le citazioni nella nota seguente) e decomprimerlo in una cartella a scelta.

    Nota

    I set di dati usati in questa esercitazione provengono da 'From Group to Individual Labels using Deep Features', Kotzias et al, KDD 2015 e ospitata nel repository UCI Machine Learning - Dua, D. e Karra Taniskidou, E. (2017). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.

  2. Copiare il file yelp_labelled.txt in qualsiasi cartella creata in precedenza, ad esempio /cli-test.

  3. Aprire un prompt dei comandi e passare alla cartella in cui è stato copiato il file del set di dati. Ad esempio:

    cd /cli-test
    

    Usando qualsiasi editor di testo, ad esempio Visual Studio Code, è possibile aprire ed esplorare il file del set di dati yelp_labelled.txt. La struttura è la seguente:

    • Il file non ha intestazione. Verrà usato l'indice della colonna.

    • Sono presenti solo due colonne:

      Testo (indice di colonna 0) Etichetta (indice di colonna 1)
      Wow... Amato questo posto. 1
      Crust is not good. 0
      Not tasty and the texture was just nasty. 0
      ...MOLTE ALTRE RIGHE DI TESTO... ...(1 o 0)...

    Assicurarsi di chiudere il file del set di dati nell'editor.

    Ora è possibile iniziare a usare l'interfaccia della riga di comando per questo scenario di 'analisi del sentiment'.

    Nota

    Dopo aver completato questa esercitazione, è anche possibile provare con i propri set di dati, purché siano pronti per essere usati per una delle attività di Machine Learning attualmente supportate dall'anteprima dell'interfaccia della riga di comando di ML.NET che sono "Classificazione binaria", "Classificazione", "Regressione" e "Raccomandazione".

Eseguire il comando 'mlnet classification'

  1. Eseguire il comando seguente dell'interfaccia della riga di comando ML.NET:

    mlnet classification --dataset "yelp_labelled.txt" --label-col 1 --has-header false --train-time 10
    

    Questo comando esegue il mlnet classification comando:

    • per l'attività ml di classificazione
    • Usa il file del set di dati yelp_labelled.txt come set di dati di training e di test (internamente l'interfaccia della riga di comando usa la convalida incrociata oppure lo divide in due set di dati, uno per il training e l'altro per il test)
    • Dove la colonna obiettivo/destinazione da stimare (solitamente definita 'etichetta') è la colonna con indice 1, ossia la seconda colonna, perché l'indice è a base zero
    • Non usa un'intestazione di file con i nomi di colonna perché questo specifico set di dati non ha un'intestazione
    • il tempo di esplorazione/training di destinazione per l'esperimento è di 10 secondi

    L'output dell'interfaccia della riga di comando sarà simile a:

    classificazione dell'interfaccia della riga di comando ML.NET in PowerShell

    In questo caso specifico, in appena 10 secondi e con il piccolo set di dati fornito, l'interfaccia della riga di comando è in grado di eseguire poche iterazioni, il che significa che il training viene ripetuto più volte in base a diverse combinazioni di algoritmi/configurazione con trasformazioni interne dei dati e iperparametri dell'algoritmo differenti.

    Infine, il modello di "qualità migliore" trovato in 10 secondi usa uno specifico trainer/algoritmo con qualsiasi specifica configurazione. A seconda del tempo di esplorazione, il comando può produrre un risultato diverso. La selezione si basa sulle diverse metriche illustrate, ad esempio Accuracy.

    Informazioni sulle metriche di qualità del modello

    La prima metrica, e anche la più facile, per valutare un modello di classificazione binaria è l'accuratezza, semplice da comprendere. L'accuratezza corrisponde alla percentuale di stime corrette con un set di dati di test, che dovrebbe essere quanto più vicino possibile al 100% (1,00).

    Tuttavia, in alcuni casi la misurazione con la semplice metrica dell'accuratezza non è sufficiente, in particolare quando l'etichetta (0 e 1 in questo esempio) non è bilanciata nel set di dati di test.

    Per altre metriche e informazioni più dettagliate sulle metriche , ad esempio Accuratezza, AUC, AUCPR e punteggio F1 usati per valutare i diversi modelli, vedere Informazioni sulle metriche ML.NET.

    Nota

    È possibile provare questo stesso set di dati e specificare alcuni minuti per --max-exploration-time (ad esempio, tre minuti in modo da specificare 180 secondi) in modo da trovare un "modello ottimale" migliore con una configurazione della pipeline di training diversa per questo set di dati, che con 1000 righe è piuttosto piccolo.

    Per trovare un modello di "qualità migliore/buona" pronto per la produzione e destinato a set di dati più grandi, è consigliabile sperimentare con l'interfaccia della riga di comando specificando in genere una quantità molto maggiore di tempo di esplorazione a seconda delle dimensioni del set di dati. Infatti, in molti casi potrebbero essere necessarie diverse ore di tempo di esplorazione, soprattutto se il set di dati contiene molte righe e colonne.

  2. L'esecuzione del comando precedente ha generato gli asset seguenti:

    • Un file ZIP di modello serializzato ("modello ottimale") pronto per l'uso.
    • Il codice C# per eseguire e assegnare punteggi al modello generato (per eseguire stime nelle app per utenti finali con il modello).
    • Il codice di training C# usato per generare il modello (a scopo di apprendimento).
    • Un file di log con tutte le iterazioni esplorate che include specifiche informazioni dettagliate su ogni algoritmo provato con la relativa combinazione di iperparametri e trasformazioni di dati.

    I primi due asset (il modello del file ZIP e il codice C# per eseguirlo) possono essere usati direttamente nelle app per utenti finali (app Web ASP.NET Core, servizi, app desktop e così via) per eseguire stime con il modello di ML generato.

    Il terzo asset, ossia il codice di training, mostra quale codice API ML.NET è stato usato dall'interfaccia della riga di comando per eseguire il training del modello generato, in modo che sia possibile esaminare il trainer/algoritmo e gli iperparametri specifici selezionati dall'interfaccia della riga di comando.

Questi asset enumerati vengono descritti nei passaggi successivi dell'esercitazione.

Esplorare il codice C# generato da usare per eseguire le stime con il modello

  1. In Visual Studio aprire la soluzione generata nella cartella denominata all'interno della cartella di destinazione originale ,denominata SampleClassification/cli-test nell'esercitazione. Dovrebbe essere visualizzata una soluzione simile a:

    Soluzione VS generata dall'interfaccia della riga di comando

    Nota

    Nell'esercitazione è consigliabile usare Visual Studio, ma è anche possibile esplorare il codice C# generato (due progetti) con qualsiasi editor di testo ed eseguire l'app console generata con l'oggetto dotnet CLI in un computer macOS, Linux o Windows.

    • L'app console generata contiene codice di esecuzione che è necessario rivedere. Quindi in genere si riutilizza il 'codice di assegnazione punteggi' (che esegue il modello di ML per le stime), spostando questo semplice codice, composto da poche righe, nell'applicazione per utenti finali in cui si vogliono eseguire le stime.
    • Il file mbconfig generato è un file di configurazione che può essere usato per ripetere il training del modello, tramite l'interfaccia della riga di comando o tramite Model Builder. Questo avrà anche due file di codice associati a esso e un file zip.
      • Il file di training contiene il codice per compilare la pipeline del modello usando l'API ML.NET.
      • Il file di consumo contiene il codice da utilizzare nel modello.
      • File zip che è il modello generato dall'interfaccia della riga di comando.
  2. Aprire il file SampleClassification.consumption.cs all'interno del file mbconfig . Si noterà che sono presenti classi di input e output. Queste sono classi di dati o classi POCO, usate per contenere i dati. Le classi contengono codice boilerplate utile se il set di dati ha decine o anche centinaia di colonne.

    • La classe ModelInput viene usata durante la lettura di dati dal set di dati.
    • La classe ModelOutput viene usata per ottenere il risultato di stima (dati di stima).
  3. Aprire il file Program.cs ed esplorare il codice. Con poche righe è possibile eseguire il modello ed eseguire una stima del campione.

    static void Main(string[] args)
    {
        // Create single instance of sample data from first line of dataset for model input
        ModelInput sampleData = new ModelInput()
        {
            Col0 = @"Wow... Loved this place.",
        };
    
        // Make a single prediction on the sample data and print results
        var predictionResult = SampleClassification.Predict(sampleData);
    
        Console.WriteLine("Using model to make single prediction -- Comparing actual Col1 with predicted Col1 from sample data...\n\n");
        Console.WriteLine($"Col0: {sampleData.Col0}");
        Console.WriteLine($"\n\nPredicted Col1 value {predictionResult.PredictedLabel} \nPredicted Col1 scores: [{String.Join(",", predictionResult.Score)}]\n\n");
        Console.WriteLine("=============== End of process, hit any key to finish ===============");
        Console.ReadKey();
    }
    
    • Le prime righe di codice creano un singolo dati di esempio, in questo caso in base alla prima riga del set di dati da usare per la stima. È anche possibile creare dati "hardcoded" personalizzati aggiornando il codice:

      ModelInput sampleData = new ModelInput()
      {
          Col0 = "The ML.NET CLI is great for getting started. Very cool!"
      };
      
    • La riga di codice successiva usa il SampleClassification.Predict() metodo sui dati di input specificati per eseguire una stima e restituire i risultati (in base allo schema ModelOutput.cs).

    • Le ultime righe di codice stampano le proprietà dei dati di esempio (in questo caso il commento), nonché la stima del sentiment e i punteggi corrispondenti per il sentiment positivo (1) e il sentiment negativo (2).

  4. Eseguire il progetto, usando i dati di esempio originali caricati dalla prima riga del set di dati oppure i dati hardcoded personalizzati. Si dovrebbe ottenere una stima simile a:

ML.NET'interfaccia della riga di comando di eseguire l'app da Visual Studio)

  1. Provare a sostituire i dati di esempio hardcoded con altre frasi con sentiment diverso e vedere come viene stimato un sentiment positivo o negativo dal modello.

Inserire le stime del modello di ML nelle applicazioni per utenti finali

È possibile usare un codice di assegnazione punteggi simile a quello del modello di ML per eseguirlo nell'applicazione per utenti finali ed eseguire stime.

È ad esempio possibile spostare direttamente il codice in qualsiasi applicazione desktop Windows, come WPF e WinForms, ed eseguire il modello come è stato fatto nell'app console.

È tuttavia necessario ottimizzare il modo in cui vengono implementate queste righe di codice per eseguire un modello di ML, ossia memorizzare nella cache il file ZIP e caricarlo una sola volta, e avere oggetti singleton invece di crearli per ogni richiesta, soprattutto se l'applicazione deve essere scalabile, ad esempio un'applicazione Web o un servizio distribuito, come descritto nella sezione seguente.

Esecuzione di modelli ML.NET in app Web e servizi ASP.NET Core scalabili (app multithread)

La creazione dell'oggetto del modello (ITransformer caricato da un file ZIP del modello) e dell'oggetto PredictionEngine deve essere ottimizzata in particolare per l'esecuzione in app Web scalabili e servizi distribuiti. Per il primo caso, l'oggetto del modello ITransformer, l'ottimizzazione è semplice e diretta. Poiché l'oggetto ITransformer è thread-safe, è possibile memorizzarlo nella cache come oggetto singleton o statico in modo da caricare il modello una sola volta.

Per il secondo oggetto, PredictionEngine, non è così facile perché l'oggetto PredictionEngine non è thread-safe, quindi non è possibile crearne un'istanza come oggetto singleton o statico in un'app ASP.NET Core. Questo problema relativo a scalabilità e thread-safe viene descritto in dettaglio in questo post di blog.

Tuttavia, la situazione è più semplice rispetto a quanto spiegato in questo post. Abbiamo lavorato su un approccio più semplice per l'utente e abbiamo creato un bel pacchetto di integrazione .NET Core che è possibile usare facilmente nelle app e nei servizi di ASP.NET Core registrandolo nei servizi di inserimento delle dipendenze (servizi di inserimento delle dipendenze) e quindi usarlo direttamente dal codice. Per informazioni, vedere l'esercitazione e l'esempio seguenti:

Esplorare il codice C# generato usato per il training del modello di "qualità ottimale"

Per un livello di formazione più avanzato, è anche possibile esplorare il codice C# generato usato dall'interfaccia della riga di comando per il training del modello generato.

Il codice del modello di training viene generato nel file denominato SampleClassification.training.cs, in modo da poter analizzare il codice di training.

Soprattutto, per questo specifico scenario (modello di analisi del sentiment) è anche possibile confrontare il codice di training generato con il codice descritto nell'esercitazione seguente:

È interessante confrontare l'algoritmo scelto e la configurazione della pipeline dell'esercitazione con il codice generato dall'interfaccia della riga di comando. A seconda del tempo dedicato all'iterazione e alla ricerca di modelli migliori, l'algoritmo scelto può essere diverso, così come gli specifici iperparametri e la configurazione della pipeline.

In questa esercitazione sono state illustrate le procedure per:

  • Preparare i dati per l'attività di ML selezionata (problema da risolvere)
  • Eseguire il comando "classificazione mlnet" nello strumento dell'interfaccia della riga di comando
  • Rivedere i risultati delle metriche di qualità
  • Comprendere il codice C# generato per l'esecuzione del modello (codice da usare nell'app per utenti finali)
  • Esplorare il codice C# generato usato per eseguire il training del modello di "migliore qualità" (scopo degli utili)

Vedi anche