In deze oefening kijken we naar classification
met een ML5 Neural Network. Dat betekent dat we een categorie gaan voorspellen.
- 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. - Gebruik
traindata
entestdata
om de nauwkeurigheid te berekenen, zie hiervoor ook week 6. - Voeg twee hidden layers toe om te zien of de nauwkeurigheid toeneemt. Het kan zijn dat dit niet zo is!
- 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.
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
.
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)
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.
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)}%`)
}
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 (desoftmax
layer) moet je niet aanpassen. Deze layer bepaalt of we een classification of regression doen.
Zie ook de code snippet voor hidden layers
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