{ "cells": [ { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "# MOA Notebook Example\n", "\n", "This is an example of a MOA Notebook in Java.\n", "\n", "\n", "## Prequential Evaluation Example\n", "Let’s run a very simple experiment: using a decision tree (Hoeffding Tree) with data generated from an artificial stream generator (RandomRBFGenerator).\n", "\n", "We should start importing the classes that we need, and defining the stream and the learner." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "%maven nz.ac.waikato.cms.moa:moa:2018.6.0\n", "\n", "import moa.classifiers.trees.HoeffdingTree;\n", "import moa.streams.generators.RandomRBFGenerator;\n", "\n", "HoeffdingTree learner = new HoeffdingTree();\n", "RandomRBFGenerator stream = new RandomRBFGenerator();" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "Now, we need to initialize the stream and the classifier:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "stream.prepareForUse();\n", "learner.setModelContext(stream.getHeader());\n", "learner.prepareForUse();" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "And finally, let’s run a prequential evaluation, as in Tutorial 2 (Introduction to the API of MOA)." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000000 instances processed with 91.0458% accuracy in -2.857338446 seconds.\n" ] }, { "data": { "image/png": "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", "text/plain": [ "BufferedImage@5720626f: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 600 height = 400 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%maven org.knowm.xchart:xchart:3.5.2\n", "import org.knowm.xchart.*;\n", "import moa.core.TimingUtils;\n", "import com.yahoo.labs.samoa.instances.Instance;\n", "\n", "int numInstances = 1000000;\n", "int sampleSize = 1000;\n", "boolean isTesting = true;\n", "double[] xData = new double[numInstances/sampleSize];\n", "double[] yData = new double[numInstances/sampleSize];\n", "\n", "int numberSamplesCorrect = 0;\n", "int numberSamples = 0;\n", "boolean preciseCPUTiming = TimingUtils.enablePreciseTiming();\n", "long evaluateStartTime = TimingUtils.getNanoCPUTimeOfCurrentThread();\n", "while (stream.hasMoreInstances() && numberSamples < numInstances) {\n", " Instance trainInst = stream.nextInstance().getData();\n", " if (isTesting) {\n", " if (learner.correctlyClassifies(trainInst)){\n", " numberSamplesCorrect++;\n", " }\n", " }\n", " if (numberSamples % sampleSize == 0){\n", " xData[numberSamples / sampleSize] = numberSamples / sampleSize;\n", " yData[numberSamples / sampleSize] = 100.0 * (double) numberSamplesCorrect/ (double) numberSamples;\n", " }\n", " numberSamples++;\n", " learner.trainOnInstance(trainInst);\n", "}\n", "double accuracy = 100.0 * (double) numberSamplesCorrect/ (double) numberSamples;\n", "double time = TimingUtils.nanoTimeToSeconds(TimingUtils.getNanoCPUTimeOfCurrentThread()- evaluateStartTime);\n", "System.out.println(numberSamples + \" instances processed with \" + accuracy + \"% accuracy in \"+time+\" seconds.\");\n", "\n", "XYChart chart = QuickChart.getChart(\"Prequential Evaluation\", \"#Instances\", \"Accuracy\", \"y(x)\", xData, yData);\n", "BitmapEncoder.getBufferedImage(chart);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And, we can also run a prequential Evaluation task directly." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "{M}assive {O}nline {A}nalysis\n", "Version: 18.06 June 2018\n", "Copyright: (C) 2007-2018 University of Waikato, Hamilton, New Zealand\n", "Web: http://moa.cms.waikato.ac.nz/\n", "\n", " \n", "Task completed in 4.50s (CPU time)\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "learning evaluation instances,evaluation time (cpu seconds),model cost (RAM-Hours),classified instances,classifications correct (percent),Kappa Statistic (percent),Kappa Temporal Statistic (percent),Kappa M Statistic (percent),model training instances,model serialized size (bytes),tree size (nodes),tree size (leaves),active learning leaves,tree depth,active leaf byte size estimate,inactive leaf byte size estimate,byte size estimate overhead\n", "100000.0,0.514551649,0.0,100000.0,92.10000000000001,84.09118369648397,82.93736501079914,82.63736263736264,100000.0,0.0,187.0,118.0,118.0,5.0,0.0,0.0,1.0\n", "200000.0,0.898160024,0.0,200000.0,93.2,86.13619960610498,85.15283842794761,84.29561200923789,200000.0,0.0,290.0,180.0,180.0,6.0,0.0,0.0,1.0\n", "300000.0,1.260566831,0.0,300000.0,93.7,87.0415165128104,86.76470588235296,85.14150943396228,300000.0,0.0,368.0,228.0,228.0,6.0,0.0,0.0,1.0\n", "400000.0,1.676657529,0.0,400000.0,95.1,90.00701548300785,90.18036072144288,88.57808857808857,400000.0,0.0,489.0,311.0,311.0,7.0,0.0,0.0,1.0\n", "500000.0,2.12164797,0.0,500000.0,94.8,89.19332313626387,88.9596602972399,87.12871287128712,500000.0,0.0,598.0,370.0,370.0,7.0,0.0,0.0,1.0\n", "600000.0,2.569584639,0.0,600000.0,95.6,91.0510537384223,91.6030534351145,89.69555035128805,600000.0,0.0,687.0,428.0,428.0,7.0,0.0,0.0,1.0\n", "700000.0,2.984601928,0.0,700000.0,96.1,91.99382498090834,91.82389937106917,90.8450704225352,700000.0,0.0,792.0,497.0,497.0,8.0,0.0,0.0,1.0\n", "800000.0,3.430721144,0.0,800000.0,95.39999999999999,90.62666835114945,90.49586776859503,89.37644341801385,800000.0,0.0,924.0,584.0,584.0,8.0,0.0,0.0,1.0\n", "900000.0,3.861493675,0.0,900000.0,96.8,93.50965438909621,93.73776908023483,92.72727272727272,900000.0,0.0,1020.0,647.0,647.0,8.0,0.0,0.0,1.0\n", "1000000.0,4.413296784,0.0,1000000.0,96.7,93.26222599719055,93.25153374233128,92.28971962616822,1000000.0,0.0,1124.0,720.0,720.0,9.0,0.0,0.0,?\n" ] } ], "source": [ "import moa.DoTask;\n", "DoTask.main(\"EvaluatePrequential -l trees.HoeffdingTree -i 1000000\".split(\" \"));" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Java", "language": "java", "name": "java" }, "language_info": { "codemirror_mode": "java", "file_extension": ".java", "mimetype": "text/x-java-source", "name": "Java", "pygments_lexer": "java", "version": "10.0.1+10-Debian-4" } }, "nbformat": 4, "nbformat_minor": 2 }