El dia d’avui aprendrem sobre l’Aprenentatge automàtic a JS, i si, si aquestes llegint bé.
Aprenentatge automàtic en JS
¿JAVASCRIPT ?! No hauria d’estar utilitzant Python? Estic boja per provar aquests càlculs en JavaScript? Estic tractant d’actuar amb calma usant un llenguatge que no és Python o R? scikit-learn ni tan sols funciona en JavaScript?
Resposta curta: No. No estic boja.
Resposta llarga: És possible i em sorprèn que els desenvolupadors no li hagin prestat l’atenció que es mereix. Pel que fa a scikit-learn, la gent de JS ha creat el seu propi conjunt de biblioteques per contrarestar-la, i jo també vaig a utilitzar un. Però primer, una mica sobre l’aprenentatge automàtic.
Segons Arthur Samuel, l’aprenentatge automàtic proporciona als ordinadors la capacitat d’aprendre sense estar programats explícitament. En altres paraules, li dóna a l’ordinador l’habilitat d’aprendre per si mateixa i executar les instruccions correctes, sense que tu li doni instruccions.
Ha existit des de fa força temps, amb Google passant de l’estratègia de mòbil primer a la d’IA primer.
Per què no s’esmenta JavaScript amb ML?
- És molt lent. (Això és un mite)
- La manipulació de matrius és difícil (hi ha biblioteques, per exemple math.js).
- Només preocupat pel Desenvolupament web (En algun lloc, Node. js s’està rient d’això.)
- Les biblioteques solen estar fetes per Python. (La gent de JS no està darrere)
Hi ha un grapat de llibreries en JavaScript amb algoritmes de Machine Learning pre-dissenyats, com ara Regressió Lineal, SVMs, Naive-Bayes, etcètera. Aquests són alguns d’ells,
- brain.js (Xarxes neuronals)
- sinàptic (Xarxes neuronals)
- Natural (Processament de el llenguatge natural)
- ConvNetJS (xarxes neuronals convolucionals)
- mljs (Un conjunt de subbibliotecas amb una varietat de funcions)
- Neatáptico (xarxes neuronals)
- Webdnn (Deep Learning)
Anem a fer servir la biblioteca de regressió de mljs per a realitzar alguna bruixeria de regressió lineal jajaja.
Pas 1. Instal·lar les biblioteques
$ yarn add ml-regression csvtojson
O si t’agraden les NPM
$ npm install ml-regression csvtojson
ml-regression fa el que el nom implica .
csvtojson és un ràpid analitzador de csv per NODE.JS que permet carregar fitxers de dades csv i convertir-los a JSON.
Descarrega l’arxiu de dades (.csv) des d’aquí i posa-ho dins del teu projecte.
Assumint que ja has inicialitzat un projecte NPM buit, obre l’arxiu index.js i introduzce el següent. (Pots copiar / enganxar si ho desitja, però jo prefereixo que ho escriguis tu mateix per a una millor comprensió.)
const ml = require('ml-regression');const csv = require('csvtojson');const SLR = ml.SLR; // Regresión lineal simpleconst csvFilePath = 'advertising.csv'; // Datoslet csvData = , // Datos analizadosX = , // entraday = ; // salidalet regressionModel;
Ara farem servir el mètode fromFile de csvtojson per carregar el nostre arxiu de dades.
csv().fromFile(csvFilePath).on('json', (jsonObj) => {csvData.push(jsonObj);}).on('done', () => {dressData(); // Para obtener puntos de datos de objetos JSONperformRegression();});
dades de l’apòsit per preparar-lo per a la seva execució
Els objectes JSON que guardem en csvData són bé, objectes, i necessitem una sèrie de punts de dades d’entrada així com punts de dades de sortida. Anem a executar les nostres dades a través d’una funció dressData que omplirà les nostres variables X i y.
function dressData() {/*** Una línea del objeto de datos tiene el aspecto siguiente:* {* TV: "10",* Radio: "100",* Newspaper: "20",* "Sales": "1000"* }** Por lo tanto, al agregar los puntos de datos, necesitamos analizar el valor* de la cadena como un flotador.*/csvData.forEach((row) => {X.push(f(row.Radio));y.push(f(row.Sales));});}function f(s) {return parseFloat(s);}
Entrena al teu model i comença a predir
Ara que les nostres dades han estat vestits amb èxit, és hora d’entrenar al nostre model.
Per a això, anem a escriure una funció performRegression:
función performRegression() {regressionModel = nuevo SLR(X, y); // Capacitar al modelo en datos de formaciónconsole.log(regressionModel.toString(3));predictOutput();}
El model de regressió té un mètode per String que pren un paràmetre anomenat precisió per a les sortides en coma flotant.
la funció predictOutput et permet introduir valors d’entrada i envia la sortida prevista a la seva consola.
Això és el que sembla: (Tingues en compte que estic fent servir la utilitat de línia de lectura de NODE.JS)
function predictOutput() {rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {console.log(`At X = ${answer}, y = ${regressionModel.predict(parseFloat(answer))}`);predictOutput();});}
I aquí hi ha el codi per afegir l’entrada de lectura de l’usuari:
const readline = require('readline'); // Para que el usuario pida que se permitan las prediccionesconst rl = readline.createInterface({input: process.stdin,output: process.stdout});
Ja vam finalitzar!
Si vas seguir els passos, així és com s’hauria de veure el teu index.js:
const ml = require('regresión ml-');const csv = require('csvtojson');const SLR = ml.SLR; // Regresión lineal simpleconst csvFilePath = 'advertising.csv'; // Datoslet csvData = , // Datos analizadosX = , // Entraday = ; // Salidadejemos que regressionModel;const readline = require('readline'); // Para que el usuario pida que se permitan las prediccionesconst rl = readline.createInterface({ {)entrada: process.stdin,salida: process.stdout});csv().desdeFile(csvFilePath).on('json', (jsonObj) => {csvData.push(jsonObj);}).on('done', () => {dressData(); // Para obtener puntos de datos de JSON ObjectsperformRegression();});función performRegression() {regressionModel = nuevo SLR(X, y); // Capacitar al modelo en datos de formaciónconsole.log(regressionModel.toString(3));predictOutput();}función dressData() {/**Una fila del objeto de datos tiene el mismo aspecto:* {* TV: "10",* Radio: "100",Periódico: "20","Ventas": "1000"* }*Por lo tanto, al añadir los puntos de datos,necesitamos analizar el valor de la cadena como un flotador.*/csvData.forEach((row) => { {svData.forEachX.push(f(row.Radio));y.push(f(fila.Ventas));});}función f(s)devuelve parseFloat(s);}función predictOutput() {rl.question('Enter input X for prediction (Presione CTRL+C para salir) : ', (respuesta) => {console.log(`At X = ${respuesta}, y = ${regressionModel.predict(parseFloat(respuesta))}`);predictOutput();});}
Ves a el teu Terminal i executi el node index.js i es generarà una cosa com això:
nodo index.jsIntroduce la entrada X para la predicción (Presione CTRL+C para salir) : 151.5f(x) = 0.202 * x + 9.31Introduzca la entrada X para la predicción (Presione CTRL+C para salir):En X = 151,5, y = 39,989749279911285