{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Naive Bayes on MNIST dataset\n", "The first step is to download the handwritten image dataset. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "# Fetch the MNIST handwritten digit dataset\n", "from sklearn.datasets import fetch_mldata\n", "mnist = fetch_mldata('MNIST original', data_home=\"../data\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Let's display some data :)\n", "\n", "Now let's explore the data." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(Number of samples, No. of pixels) = (70000, 784)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUwAAAEKCAYAAAB5b2wuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWlsY+ma3/fjvlNcRYmkJGrfSlWlWrrudfdd2nfGYwMO\nAhgZIF7hJTCCIDDg2ImB+IONAWzHdgAjjr8YsGOM7UzgeL9jTGbGvnPv3K2Xqi5JVdolaqNEUlzF\nVVxEMh9Y79tUlapvVXdp7fMDDmrhIXXIR/yf931WUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ\nUFBQUFBQUFBQOIXmsi/gDH5E+7rmLvi5CufLj1DsehP5EV8ju6rP8bV3gO99iee1Xhxfhq/y3Nfx\nl4EwkAcOgX8G2L7g/O8Bq0AJ+D2g/x1fz2Wzw82wqwP4ddo2PQT+xi84X7Hr2Vw1u/5NoA4UXhx5\nIPQF57+VXc9TMM/jw7gM/iPwALADE7Q/0L/+mnM9wL998bgTeAL8qwu4xovkptj1HwBGYAB4D/jT\nwJ99zbmKXa8PLeD/ob2osdH+3u685ty3tut5CubrcAD/CUgAGeA3gcBL54wAnwA54D/QfjOCbwA/\nB7LAPPCdc77erRc/C9qfVxOIvebcPwYs0jZCjfbd7g4wdr6XeCW4bnb9o8DfByrALvBPgT//mnMV\nu14fu6peHG/CW9v1MgRTTfuXs//FcQz8o47HVcCfAf4c0AucAP/wxWMB2sb7NdpG+au036z7DX7u\nn6BttLOODBD8Bc/NAckXx//xmvOmgYWOf5eBTeDWG1zfdec62rXzi6Xm9XZS7Hp97NoC/isgTVsM\n//sv+BlXyq7bwB98g/Pu0v4ABD8E/nbHvyeBKm3D/TXgn7/0/N+mbTDx3NetEt4FI7Qd1H/5NY//\nE+DvvPR/P+Xz67sJ3BS7/gvg3wBW2nYN0xaDs1Ds+jlX3a6TQA9tIf8mEAX+29ec+9Z2vYwVphn4\nx7T9Cjng94EuTt/tIx1/3wN0tP0NA8Cvcvpu8z7tD+gi2AT+N17/gRZp+0w66aLtfL7pXDe7/iXa\n2/EN4N8DvwEcvOZcxa7Xx64rQJz2SvMj2rvB/+Y15761XS9DMP8KbR/Be7Qv7ju86nfof+nvddpb\n4T3aKwNnx2ED/t4b/Nw/yeeRs5ePPF+8detER3vpfhZLtH0gAgsw/OL/bzrXza5Z4E/R3kbO0E5v\n+eQ15yp2vT52fRuulF23gT9MOxIpDi3wd4HfAgyAi/bdvcnn4v0j2nesSdp3t38N/MsXjwVpB1z+\nEO1fcCPwXT53Qv8Q+Avv+H38d4D3xd+naPtF/qfXnOsBjmg7k420fzF+/o6v57K5KXYdou1L0wB/\nhPYXfPI15yp2vT52/a9pC7OKtsgf0M6AOIsrZddt2h9s5/FrtO/oP6R9p1gF/iLQ4HMD/BD4W3we\ndfuPtA0leI+2kdK0I3e/yed3m/PwifxftJf4BWAN+F84fXddBP54x7+/R3tbUOZm5uvdFLv+Ku0v\nUwl4CvzyS48rdr2edv0NIPXieleA//Glx79udlVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB4mTet\nufwy3IRC/nfFeX7Ol4Fi2zaKXW8mr7XrZSSuKygoKFxLFMFUUFBQeEMUwVRQUFB4QxTBVFBQUHhD\nFMFUUFBQeEMUwVRQUFB4QxTBVFBQUHhDFMFUUFBQeEMUwVRQUFB4Q7SXfQGvw2w2n3mYTCb5d4PB\n8FavWa/XKZfLlMtl9vb22Nvbo1QqndM7UFBQOE+MRuMpTTCZTBgMBgwGA61Wi0ajwcnJCZVKhePj\nY3K5HEdHR5ycnHzpn3mlBbO7uxuv1yv/FIf4t81me6vXPD4+JplMcnh4yI9+9CMymYwimAoK1xSz\n2Yzb7cbr9eLxeHC73TgcDrq6umg2m9TrdUqlEkdHR2QyGba2tigWizdHMLVaLVarFavVSigUIhQK\n4ff7pVB6PJ5Tf35ZwUwmk5TLZSqVChsbG8TjcTKZzC9+AQUFhS+FSqVCrVaj1+sxGo3odLq3fg21\nWi01wmKx4Ha7T2mCx+Ohq6vrtYLpcrlwOBwkk0my2awUz7cR0CvVfMNqtTI8PMzQ0BC3bt3i1q1b\n9PT0yOW2OMS/9Xr9W73+yckJx8fHlMtl9vf32d/f55NPPuE//+f/zJMnT972ct8GpUnDzUSx6xui\n1WrRarW4XC58Ph92+8vDGr8YtVqNTqfDYrEwNDTE0NAQNpsNi8WCxWKRItq5JReiWalUKJfLJBIJ\nEokES0tLPH36VK44i8Xiyz/utXa9UitMg8FAb28vMzMzPHz4kIcPH+Lz+d7ouScnJzQaDZrNJtC+\no2m1WjQaDSpV+/1rtVpsNhs2mw2fz8f9+/exWq1sbGwwPz9Ps9mUz1e4mqhUqlOHRqORh1qtRq1W\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Display the number of samples \n", "print \"(Number of samples, No. of pixels) = \", mnist.data.shape\n", "\n", "# Display 9 number randomly selectly\n", "for c in range(1, 10):\n", " subplot(3, 3,c)\n", " i = randint(mnist.data.shape[0])\n", " im = mnist.data[i].reshape((28,28))\n", " axis(\"off\")\n", " title(\"Label = {}\".format(mnist.target[i]))\n", " imshow(im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Split the data into training and testing data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Split the data into training and test data\n", "from sklearn.cross_validation import train_test_split\n", "x_train, x_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.05, random_state=42)\n", "\n", "# Which is same as \n", "# x_train = mnist.data[:split]\n", "# y_train = mnist.target[:split]\n", "# x_test = mnist.data[split:]\n", "# y_test = mnist.target[split:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Prepare the classifier" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Create the Multinomial Naive Bayes Classifier\n", "from sklearn.naive_bayes import MultinomialNB\n", "clf = MultinomialNB()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Perform the predictions and display the results" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy = 81.7142857143 %\n", "Classification Report \n", " precision recall f1-score support\n", "\n", " 0 0.91 0.89 0.90 320\n", " 1 0.85 0.95 0.90 387\n", " 2 0.89 0.84 0.87 352\n", " 3 0.78 0.81 0.80 356\n", " 4 0.83 0.73 0.78 329\n", " 5 0.85 0.67 0.75 342\n", " 6 0.90 0.91 0.91 377\n", " 7 0.94 0.82 0.87 360\n", " 8 0.63 0.72 0.67 337\n", " 9 0.66 0.80 0.72 340\n", "\n", "avg / total 0.83 0.82 0.82 3500\n", "\n" ] } ], "source": [ "# Perform the predictions\n", "clf.fit(x_train,y_train)\n", "# Perform the predictions\n", "y_predicted = clf.predict(x_test)\n", "# Calculate the accuracy of the prediction\n", "from sklearn.metrics import accuracy_score\n", "print \"Accuracy = {} %\".format(accuracy_score(y_test, y_predicted)*100)\n", "# Cross validate the scores\n", "from sklearn.metrics import classification_report\n", "print \"Classification Report \\n {}\".format(classification_report(y_test, y_predicted, labels=range(0,10)))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }