Skip to content

Instantly share code, notes, and snippets.

@alancpazetto
Created August 3, 2018 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alancpazetto/7bff0cb662d33a06f78ac87788eff40c to your computer and use it in GitHub Desktop.
Save alancpazetto/7bff0cb662d33a06f78ac87788eff40c to your computer and use it in GitHub Desktop.
Machine Learning JS
const fs = require('fs-extra');
const KNN = require('ml-knn');
const moment = require('moment');
const { GaussianNB, MultinomialNB } = require('ml-naivebayes');
const { Matrix } = require('ml-matrix');
const { DecisionTreeClassifier } = require('ml-cart');
const irisDataset = require('ml-dataset-iris');
// const { DecisionTreeClassifier } = require('ml-cart');
var trainingSet = irisDataset.getNumbers();
var predictions = irisDataset
.getClasses()
.map((elem) => irisDataset.getDistinctClasses().indexOf(elem));
var options = {
gainFunction: 'gini',
maxDepth: 10,
minNumSamples: 3
};
var classifier = new DecisionTreeClassifier(options);
classifier.train(trainingSet, predictions);
var result = classifier.predict(trainingSet);
process.exit(0);
const PERCENTAGE_TEST = 0.2;
const loadDataset = (callback) => {
const filePath = './training-data/poker-hand-training-true.data';
let dataset = [];
let labels = [];
let data = '';
const lineReader = require('readline').createInterface({
input: fs.createReadStream(filePath, 'utf8')
});
// const readStream = fs.createReadStream(filePath, 'utf8');
lineReader.on('line', (line) => {
// let arrLines = data.split('\n\r');
// arrLines.forEach( (val) => {
let auxData = line.split(',');
const len = auxData.length;
if( len < 11 ){
console.log(auxData);
process.exit(0);
}
for (let i = 0; i < len; i++) {
auxData[i] = parseInt( auxData[i] );
}
if ( isNaN(auxData[0]) ) return;
labels.push(auxData.pop());
dataset.push(auxData);
// });
}).on('close', () => {
let datasetTest = [];
let labelsTest = [];
console.log('[TOTAL ELEMENTS]', dataset.length );
const len = dataset.length;
for(let i = 0; i < (len*PERCENTAGE_TEST); i++ ){
datasetTest.push( dataset.pop() );
labelsTest.push( labels.pop() );
}
callback(
dataset,
labels,
datasetTest,
labelsTest
);
});
};
const testResults = (labelsTest, resultTest) => {
let accurancyCount = 0;
resultTest.forEach((val, i) => {
// console.log( labelsTest[i], '===>', val );
if (labelsTest[i] === val) {
accurancyCount++;
}
});
const lenTest = labelsTest.length;
console.log( resultTest.length, labelsTest.length );
return accurancyCount / lenTest;
};
const doKnn = (dataset, labels, datasetTest, labelsTest) => {
const knn = new KNN(dataset, labels);
const start = moment();
console.log(start);
const resultTest = knn.predict(datasetTest);
console.log(resultTest);
console.log(labelsTest);
console.log( 'ACCURANCY', testResults(labelsTest, resultTest) );
const end = moment();
console.log( end.diff(start, 'seconds'), 'seconds' );
};
const doDecisionTree = (dataset, labels, datasetTest, labelsTest) => {
var options = {
gainFunction: 'gini',
maxDepth: 10,
minNumSamples: 3
};
const model = new DecisionTreeClassifier(options);
const start = moment();
console.log(start);
console.log('TRAINING...');
model.train(dataset, labels);
console.log('TRAINED!');
const resultTest = model.predict(datasetTest);
console.log( 'ACCURANCY', testResults(labelsTest, resultTest) );
const end = moment();
console.log( end.diff(start, 'seconds'), 'seconds' );
};
const doNaiveBayes_GaussianNB = (dataset, labels, datasetTest, labelsTest) => {
const model = new GaussianNB();
let aux = [];
let auxLabels = [];
for (let i = 0; i < 5; i++) {
aux.push( dataset[i] );
auxLabels.push( Math.random() > .5 ? 1 : 0 );
}
const d = new Matrix( aux );
const l = new Matrix( [auxLabels] );
model.train(d, auxLabels);
console.log( model );
return ;
model.train( aux, auxLabels );
const resultTest = model.predict([
[ 1, 2, 1, 4, 1, 5, 1, 3, 1, 6 ]
]);
console.log(resultTest);
// console.log( 'ACCURANCY', testResults(labelsTest, resultTest) );
};
const doNaiveBayes_MultinomialNB = (dataset, labels, datasetTest, labelsTest) => {
const model = new MultinomialNB();
const start = moment();
console.log(start);
const datasetMatrix = new Matrix(dataset);
model.train(datasetMatrix, labels);
const resultTest = model.predict(datasetTest);
console.log( 'ACCURANCY', testResults(labelsTest, resultTest) );
const end = moment();
console.log( end.diff(start, 'seconds'), 'seconds' );
};
loadDataset( (dataset, labels, datasetTest, labelsTest) => {
// dataset = [
// [1, 1, 0],
// [1, 0, 0],
// [0, 0, 1],
// [0, 1, 1]
// ];
// labels = [1, 1, 0, 0];
// datasetTest = [
// [1, 1, 0],
// [0, 1, 1],
// [1, 0, 1],
// ];
// labelsTest = [1,0,0];
console.log( 'DATASET LENGTH =>', dataset.length);
console.log( 'LABELS LENGTH =>', labels.length);
console.log( 'DATASET TEST LENGTH =>', datasetTest.length);
console.log( 'LABELS TEST LENGTH =>', labelsTest.length);
doKnn(dataset, labels, datasetTest, labelsTest);
// doDecisionTree(dataset, labels, datasetTest, labelsTest);
// doNaiveBayes_MultinomialNB(dataset, labels, datasetTest, labelsTest);
});
// let readStream = fs.createReadStream(filePath, 'utf8');
// readStream.on('data', (chunk) => {
// data += chunk;
// console.log(chunk);
// }).on('end', () => {
// console.log('end', data);
// });
if (false) {
const dataset = [
[0,0,1],
[0,1,1],
[0,1,1],
[1,1,1],
[1,0,1],
[0,0,1],
];
const labels = [1,1,0,1,0,0];
const knn = new KNN(dataset, labels);
const newDataset = [
[0,0,0],
[0,1,0],
];
var ans = knn.predict(newDataset);
console.log(ans);
}
{
"name": "machine-learning-js",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"ml-cart": "^1.0.8",
"ml-knn": "^2.1.3"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment