Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save cristianexer/f5f64d113f24457dae84becbabe87f85 to your computer and use it in GitHub Desktop.
Save cristianexer/f5f64d113f24457dae84becbabe87f85 to your computer and use it in GitHub Desktop.
Titanic: Machine Learning from Disaster with brain.js
const brain = require('brain.js');
var ezcsv = require('ezcsv');
const trainPath = './train.csv';
const testPath = './test.csv';
const gp = './gpinr.csv';
var train = ezcsv.csv.read(trainPath);
var test = ezcsv.csv.read(testPath);
var gpinr = ezcsv.csv.read(gp);
var headerTrain = ['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'];
var headerTest = ['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'];
function encode(arg) {
if (typeof arg == "number")
return arg;
else
return arg.split('').map(x => (x.charCodeAt(0) / 255));
}
function normalization(val) {
var lres;
if (val > 1 && val < 9) {
lres = (val / 10);
}
if (val > 9 && val < 99) {
lres = (val / 100);
}
if (val > 99 && val < 999) {
lres = (val / 1000);
}
if (val > 999 && val < 9999) {
lres = (val / 10000);
}
if (val > 9999 && val < 99999) {
lres = (val / 100000);
}
if (val > 99999 && val < 999999) {
lres = (val / 1000000);
}
if (val > 999999 && val < 9999999) {
lres = (val / 10000000);
}
if (lres == null || lres === undefined) {
return 0;
}
return lres;
}
function checkNan(val) {
return isNaN(val) ? 0 : normalization(val);
}
function strEmpty(val) {
return (val == '') ? 0 : encode(val)[0];
}
const brainForm = (input) => {
let temp = {
input: {},
output: {}
};
//console.log(input);
// temp.input[headerTrain[0]] = parseInt(input.PassengerId);
temp.input[headerTrain[2]] = checkNan(parseInt(input.Pclass));
//temp.input[headerTrain[3]] = encode(input.Name);
//temp.input[headerTrain[4]] = encode(input.Sex);
// temp.input[headerTrain[5]] = parseInt(input.Age);
temp.input[headerTrain[6]] = checkNan(parseInt(input.SibSp));
temp.input[headerTrain[7]] = checkNan(parseInt(input.Parch));
temp.input[headerTrain[8]] = checkNan(parseInt(input.Ticket));
temp.input[headerTrain[9]] = checkNan(parseFloat(input.Fare));
temp.input[headerTrain[10]] = normalization(parseFloat(input.Cabin));
temp.input[headerTrain[11]] = strEmpty(input.Embarked);
temp.output['Survived'] = parseInt(input.Survived);
return temp;
}
const testForm = input => {
let temp = {
};
//temp[headerTrain[0]] = parseInt(input.PassengerId);
temp[headerTest[1]] = checkNan(parseInt(input.Pclass));
//temp[headerTest[2]] = encode(input.Name);
//temp[headerTest[3]] = encode(input.Sex);
//temp[headerTest[4]] = parseInt(input.Age);
temp[headerTest[5]] = checkNan(parseInt(input.SibSp));
temp[headerTest[6]] = checkNan(parseInt(input.Parch));
temp[headerTest[7]] = checkNan(parseInt(input.Ticket));
temp[headerTest[8]] = checkNan(parseFloat(input.Fare));
temp[headerTest[9]] = normalization(parseFloat(input.Cabin));
temp[headerTest[10]] = strEmpty(input.Embarked);
return temp;
}
let brainData = [];
train.items.map((res, key) => {
brainData.push(brainForm(res));
});
var config = {
iterations: 5000,
log: true,
logPeriod: 500,
errorThresh: 0.003,
hiddenLayers: [3, 3],
learningRate: 0.3,
activation: 'sigmoid'
}
var net = new brain.NeuralNetwork(config);
net.train(brainData);
let lastPassengerId = parseInt(train.items[train.items.length - 1].PassengerId) + 1;
let results = [];
test.items.map((res, key) => {
let temp = {
PassengerId: lastPassengerId + key,
Survived: Math.round(net.run(testForm(res)).Survived)
};
results.push(temp);
});
var matches = 0;
for (let i = 0; i < results.length; i++) {
if (results[i].PassengerId == parseInt(gpinr.items[i].PassengerId) && results[i].Survived == parseInt(gpinr.items[i].Survived))
matches++;
}
console.log(`Score: ${matches}/${results.length}`);
var submission = ezcsv.csv.write(
'titanicSubmission.csv', {
header: ['PassengerId', 'Survived'],
items: results
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment