Created
August 3, 2018 19:34
-
-
Save alancpazetto/7bff0cb662d33a06f78ac87788eff40c to your computer and use it in GitHub Desktop.
Machine Learning JS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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