Machine Learning con Javascript

29 maggio 2018

Negli ultimi tempi abbiamo assistito ad un crescente interesse verso tecnologie che, fino a pochi anni fa, sembravano di stretta competenza di centri di ricerca e università, ma che stanno trovando applicazioni pratiche sempre più frequenti. Tra queste, di particolare rilievo è il machine learning (spesso abbreviato in ML), che raggruppa tutta una serie di algoritmi di statistica ed intelligenza artificiale mirati all’analisi dei dati ed al loro uso per “apprenderne” l’andamento o alcune caratteristiche da essi derivanti. La fase di apprendimento (training) può essere finalizzata ad effettuare previsioni piuttosto attendibili, o a classificare e raggruppare i dati in maniera automatica e il più possibile efficiente (clustering).

Su HTML.it abbiamo già visto come implementare alcuni algoritmi di machine learning (ad esempio nella guida al linguaggio R, parlando espressamente del supporto al machine learning). In questa lezione, forniremo una panoramica di come e perché utilizzare il machine learning su Javascript, ad oggi uno dei linguaggi di programmazione più diffusi, e spesso utilizzato per il web.

Perché Javascript?

Accostare machine learning e Javascript non è cosa comune. Spesso, anzi, il machine learning viene più facilmente implementato con altri linguaggi, quali Python o il già citato R. Eppure, esiste un vasto numero di librerie già pronte all’uso, che permettono di implementare tutti i principali algoritmi di machine learning su Javascript. Tra queste, alcune permettono di implementare le reti neurali (brain.js, Synaptic, Neataptic), altre forniscono strumenti per l’NLP (Natural), altre ancora forniscono strumenti per il deep learning (Webdnn) e molte altre funzionalità (mljs). Unendo a questa grande disponibilità di librerie la possibilità di utilizzare framework come Node.js (e quindi sfruttare Javascript anche lato server), è evidente come Javascript diventi un’opzione concreta anche in applicazioni potenzialmente complete e pronte per le fasi di produzione.

Altre critiche comunemente rivolte a Javascript sono relative all’efficienza e alla difficoltà di manipolare le matrici. Tuttavia, va rilevato il crescente supporto a questo linguaggio di programmazione (grazie anche alla diffusione delle app mobile web-based), che ha assottigliato le differenze tra l’uso di Javascript ed altri linguaggi interpretati (Python, R), soprattutto in termini di tempi di esecuzione. Inoltre, esistono molte librerie che permettono di manipolare in modo agevole matrici ed altre strutture dati su Javascript: si pensi ad esempio a math.js, che rappresenta un fondamentale aiuto in questo senso.

Un esempio pratico

Chiarito perché può avere senso realizzare applicazioni di machine learning su Javascript, vediamo ora un esempio pratico sfruttando la già citata libreria mljs. In questo esempio pratico, vedremo come realizzare una regressione lineare: si tratta di un processo che permette di approssimare l’andamento di una funzione, “apprendendolo” a partire da un set di dati cosiddetti di “addestramento” (training set).

Figura 1. Esempio di regressione lineare (linea rossa) applicata a dati piuttosto rumorosi (punti blu)

Esempio di regressione lineare (linea rossa) applicata a dati piuttosto rumorosi (punti blu)

Installazione delle librerie

Iniziamo innanzitutto con l’installazione delle librerie necessarie, che potremo effettuare tramite il package manager yarn:

$ yarn add ml-regression csvtojson

In alternativa, possiamo sfruttare npm:

$ npm install ml-regression csvtojson

Installando ml-regression otterremo tutte le funzionalità richieste per implementare la regressione lineare, mentre csvtojson è una libreria che useremo per importare i dati di training (disponibili a questo link e, come accade in genere, formattati in CSV).

Inizializzazione delle librerie e caricamento dei dati

A questo punto, creiamo un nuovo progetto su Node.js (facendo riferimento alla nostra guida a Node.js nel caso non fossimo in grado), e inseriamo il codice seguente all’interno del file index.js:

const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // Simple Linear Regression

const csvFilePath = "advertising.csv"; // path al file .csv
let csvData = [],
    x = [],
    y = [];

let regressionModel;

Sfruttiamo ora il metodo fromFile della libreria csvtojson per caricare il contenuto del file .csv all’interno della variabile csvData:

csv()
    .fromFile(csvFilePath)
    .on("json", (jsonObj) => {
        csvData.push(jsonObj);
    })
    .on("done", () => {
        prepareData();
        performRegression(); 
});

Preparare i dati per la regressione

A questo punto, dobbiamo convertire i dati salvati all’interno della variabile csvData (in formato JSON) in un formato tale da permetterci di effettuare la nostra regressione. Per farlo, dovremo popolare i due array x e y, rappresentanti rispettivamente gli input e gli output del nostro training set. A tal proposito, useremo la funzione prepareData(), così definita:

function prepareData() {
    /**
     * Ogni riga dell'oggetto csvData sarà così formattata:
     * {
     *   TV: "10",
     *   Radio: "100",
     *   Newspaper: "20",
     *   Sales: "1000"
     * }
     */
    csvData.forEach((row) => {
        X.push(parseFloat(row.Radio));
        y.push(parseFloat(row.Sales));
    });
}

Addestramento e predizione

Non resta quindi che capire come eseguire la regressione vera e propria, implementata con la seguente funzione:

function performRegression() {
    regressionModel = new SLR(x, y);
    console.log(regressionModel.toString(3));
}

La prima istruzione della funzione performRegression() effettua l’addestramento, e quindi la regressione vera e propria. Tramite il metodo toString() (il cui parametro rappresenta il numero di decimali da utilizzare per la visualizzazione dei numeri decimali), possiamo inoltre convertire il modello in una forma facilmente leggibile (del tipo f(x) = a * x + b, dove a e b sono i parametri ottenuti per mezzo della regressione).

A questo punto, non resta che usare il modello appena addestrato per effettuare qualsiasi tipo di predizione. Per farlo, possiamo utilizzare il metodo predict(), a cui passeremo il nostro input:

regressionModel.predict(my_input)

Conclusioni

Quello appena visto è ovviamente solo un semplice esempio di applicazione del machine learning su Javascript. Molte altre informazioni sull’uso della libreria mljs possono essere reperite facendo riferimento agli esempi già pronti disponibili sul repository GitHub ufficiale.

Se vuoi aggiornamenti su Machine Learning con Javascript inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Machine Learning con Javascript

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy