Skip to content

Latest commit

 

History

History

week8

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Week 8

Neural Networks Classification

In deze oefening kijken we naar classification met een ML5 Neural Network. Dat betekent dat we een categorie gaan voorspellen.

  1. Test de voorbeeldcode met de weather.csv data om te voorspellen of het morgen gaat regenen (Ja/Nee). Voeg kolommen toe om de nauwkeurigheid te verbeteren.
  2. Gebruik traindata en testdata om de nauwkeurigheid te berekenen, zie hiervoor ook week 6.
  3. Voeg twee hidden layers toe om te zien of de nauwkeurigheid toeneemt. Het kan zijn dat dit niet zo is!
  4. Kies vervolgens zelf een ander CSV bestand om een classification mee te doen:
    • Gaat deze HR student de studie afronden? (Ja/Nee)
    • Krijgt deze persoon in de komende 10 jaar hartproblemen? (Ja/Nee)
    • Gaat deze klant binnen de komende maand hun abonnement opzeggen? (Ja/Nee)
    • Of kies een andere dataset die geschikt is voor classification.



Data bekijken

Laad een classification CSV file op dezelfde manier als in week 7. Toon de data via console.table(data).

In dit voorbeeld trainen we op MinTemp en MaxTemp en voorspellen we RainTomorrow. ⚠️ De voorspelling moet altijd een string zijn ("Yes" of "No").

Voeg meer kolommen uit de CSV toe om je model beter te maken!

We gebruiken hier filter() om zeker te weten dat MinTemp en MaxTemp een getal zijn. De kans dat een CSV file een foutje bevat is helaas best groot!

const cleanData = data
    .map(day => ({
        MinTemp: day.MinTemp,
        MaxTemp: day.MaxTemp,
        RainTomorrow: day.RainTomorrow
    }))
    .filter(day => 
        typeof day.MinTemp === "number" &&
        typeof day.MaxTemp === "number"
    )

Als je data goed is shufflen we de data en splitsen we de data in train- en testdata, net zoals in de oefening over regression.

cleanData.sort(() => (Math.random() - 0.5))
let trainData = cleanData.slice(0, Math.floor(data.length * 0.8))
let testData = cleanData.slice(Math.floor(data.length * 0.8) + 1)



Neural Network

De trainData splitsen we hier op in de inputs (de data die herkend moet gaan worden) en output (het resultaat dat we terug verwachten). Je kan experimenteren of meer epochs resulteren in een beter model.

function trainNeuralNetwork(trainData) {
    const nn = ml5.neuralNetwork({ task: 'classification', debug: true })

    for (let day of trainData) {
        const inputs = {
            MinTemp: day.MinTemp,
            MaxTemp: day.MaxTemp
        }
        const output = { RainTomorrow: day.RainTomorrow } 
        nn.addData(inputs, output)
    }

    nn.normalizeData()
    nn.train({ epochs: 32 }, () => finishedTraining())
}

Als het trainen niet lijkt te werken, of je voorspelling is altijd hetzelfde, dan is er waarschijnlijk iets mis met je data.




Classification

Als het trainen klaar is kan je een voorspelling doen voor het weer van morgen. Je kan dit doen met zelf ingevoerde data of met de testData.

async function finishedTraining() {
    const fakeDay = { MinTemp: -3, MaxTemp: 4 }
    const testDay = { MinTemp: testData[0].MinTemp, MaxTemp: testData[0].MaxTemp }
    
    const result = await nn.classify(fakeDay)
    console.log(`Rain Tomorrow: ${result[0].label} - Confidence ${(result[0].confidence * 100).toFixed(2)}%`)
}



Accuracy berekenen met testdata

Als je een voorspelling doet met de testData kan je de voorspelling vergelijken met de daadwerkelijke RainTomorrow waarde. Op die manier weten we of de voorspelling klopt! Als we dit in een for loop doen kunnen we bijhouden hoeveel van de gemaakte voorspellingen overeen komen met de werkelijke waarde. Zie ook de lesstof van week 6.

async function getAccuracy() {
    let correctPredictions = 0

    for (let day of testData) {
        const inputs = { MinTemp: day.MinTemp, MaxTemp: day.MaxTemp }
        const result = await nn.classify(inputs)
        console.log(`Predicted: ${result[0].label}, Actual data: ${day.RainTomorrow}`)
        if (result[0].label === day.RainTomorrow) correctPredictions++
    }

    console.log(`Correcte voorspellingen ${correctPredictions} van de ${testData.length}, dit is ${((correctPredictions / testData.length) * 100).toFixed(2)} %`)
}



Hidden layers toevoegen

In de Neural Network Playground hebben we gezien dat je zelf een neural network kan opbouwen uit layers en neurons.

In ML5 kan je dit doen via het options object. In dit voorbeeld voegen we twee hidden layers met 32 neurons toe. Experimenteer hier zelf mee. Check of de accuracy beter wordt. Het kan goed zijn dat dit niet het geval is! Ook kan het zijn dat je meer epochs nodig hebt.

Het aantal benodigde layers hangt samen met de complexiteit van je data. Voor simpele data heb je geen extra layers nodig.

const options = { 
    task: 'classification', 
    debug: true,
    layers: [
        {
            type: 'dense',
            units: 32,
            activation: 'relu',
        }, {
            type: 'dense',
            units: 32,
            activation: 'relu',
        }, 
        {
            type: 'dense',
            activation: 'softmax',
        },
    ]
}
nn = ml5.neuralNetwork(options)

⚠️ De laatste layer (de softmax layer) moet je niet aanpassen. Deze layer bepaalt of we een classification of regression doen.

Zie ook de code snippet voor hidden layers




Model opslaan

Als je tevreden bent met de accuracy, dan kan je model opslaan met nn.save(). Je kan ook een aantal keer trainen en alleen de beste accuracy opslaan. Zie hiervoor ook week 7




Datasets voor classification

Documentatie