{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**CSC 466: Knowledge Discovery in Data **\n", "\n", "** Individual Test**\n", "\n", "**Task 2 **" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Your Name :**\n", "\n", "**Cal Poly Email:**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Your Assignment**:\n", "\n", "1. Run 10-fold cross-validation on top of the trainMagicClassifier() classification method\n", "2. For each fold, report prediction accuracy\n", "3. Report overall prediction accuracy\n", "4. Report the overall confusion matrix" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Imports\n", "\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import seaborn\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Classifier**\n", "\n", "trainMagicClassifier() is a simple implementation of Support Vector Machine, with some hardcoded parameters.\n", "It takes as input a dataset \"data\", the array of labels \"labels\" (data point data[i] has class label label[i]), and two hyperparameters: Rate (this parameter in the context of SVMs is called the learing rate) and the number of iterations to complete (SVMs are typically trained using an iterative approach until convergence, this classifier replaces convergence with simply a number of iterations).\n", "\n", "You do not need to understand the code in trainMagicClassifier(), nor do you need to make any changes in this part of the notebook. The trained model is three coefficients model[0], model[1], model[2], which combine to form an equation of a line in 2D that separates the two classes:\n", "\n", "$$model[0]\\cdot x + model[1]\\cdot y + model[2] = 0$$\n", "\n", "where $x$ and $y$ are the coordinates of the 2D data point.\n", "\n", "**Note:** like all SVM classifiers, ours works only on binary classes, with class labels +1 and -1.\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def trainMagicClassifier(data, labels, Rate, iterations):\n", "\n", " C = 2 ## error significance\n", " thetas = np.ones(len(data))*-1\n", " w = np.array([-1,0,0]) # starting approximation \n", " \n", " # svmData = np.array([data[0],data[1], thetas])\n", " for j in range(iterations):\n", " HingeLoss = np.array([0,0,0])\n", " for i in range(len(data)):\n", " datum = data[i]\n", " \n", " ## compute the hinge loss\n", " y = labels[i]\n", " uVector = np.array([datum[0], datum[1], thetas[i]])\n", " if (w[0]*datum[0]+ w[1]*datum[1]+ w[2]*thetas[i])*y <= 1:\n", " HingeLoss = HingeLoss - y*uVector\n", " \n", " \n", " w = w - Rate *(w + C * HingeLoss)\n", " ##print(\"W:\", w)\n", " ## print(\"Loss:\", HingeLoss)\n", " ## plotW(slo,paso,w)\n", " return(w)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Predictor**:\n", "\n", "Using the model trained in trainMagicClassifier(), the predictor computes on which side of the line separating the classes a data point is, and returns the side (above = +1, below = -1) as the class predictor.\n", "\n", "You do not need to modify this code." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def predict(model, point):\n", " value = np.sign(model[0]*point[0]+model[1]*point[1]+model[2])\n", " ## print(value)\n", " return value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The generatePredictions(function) simply generates the list of predictions given a collection of the data points" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def generatePredictions(model, data):\n", " predictions = [predict(model, point) for point in data]\n", " return predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Execution Starts Here**\n", "\n", "First, we read the data, and split the input into the data table, and the class labels table." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "filename=\"/share/466-test/data5.csv\"\n", "\n", "rawData = np.loadtxt(filename, delimiter = \",\")\n", "\n", "## let's keep only the two columns with the data attributes\n", "\n", "data = rawData[:,0:2]\n", "labels = rawData[:,2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Training the Classifier**\n", "\n", "We set the learning rate to 0.01 (established empirically, don't worry about it).\n", "Then we train the classifier on the entire data set." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [], "source": [ "rate = 0.01\n", "model = trainMagicClassifier(data, labels, rate, 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below,we display the learned model parameters" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-7.35152749, 5.94812682, 1.17282658])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... and generate the predictions" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "predictions =generatePredictions(model,data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Plotting**\n", "To illustrate the accuracy of the predictor we plot the model (blue line) against the scatter plot of the dataset colored according to the ground truth labels.\n", "\n", "As seen, our predictor does really well, misclassifying only two red points at the left edge of the scatter plot.\n", "\n", "**However**, we trained and tested on the same data." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "colors = ['red','red', 'green']\n", "prColors = [colors[int(i+1)] for i in labels ]\n", "\n", "plt.scatter(data[:,0], data[:,1], c=prColors)\n", "plt.plot(data[:,0], -(model[0]/model[1])*data[:,0] - model[2]/model[1])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Your Task**\n", "In the cells below build the functionality for conducting the 10-fold cross-validation of the trainMagicClassifier() classifier.\n", "\n", "Each fold shall contain 10% of randomly selected points from the input dataset.\n", "\n", "For each fold, train on all other folds, then test on it and compute the accuracy.\n", "\n", "Report the accuracy of each fold, overall accuracy, and print out the confusion matrix\n", "\n", "**Notes**: you may want to create a function that splits the dataset into folds. For this task, it is ok to create 10 copies of the data (our dataset is small enough), if this makes your life easier, but you can also construct each training and testing set separately.\n", "\n", "There is no need to visualize any steps using graphs, but you can use the plotting structure above to make things look better for\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Congratulations!** You are done.\n", "\n", "Download the notebook and submit it using the\n", "\n", " handin dekhtyar 466-test \n", " \n", " command." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }