{ "metadata": { "name": "", "signature": "sha256:84213b66dc238f70d6ee451ea986e0e6f1b761b35f059af8bb7d29774323efba" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to data analysis using machine learning #\n", "\n", "## 06. Classification with Decision Trees ##\n", "\n", "by David Taylor, [www.prooffreader.com](http://www.prooffreader.com) (blog) [www.dtdata.io](http://dtdata.io) (hire me!)\n", "\n", "For links to more material including a slideshow explaining all this stuff in further detail, please see the front page of [this GitHub repo.](https://github.com/Prooffreader/intro_machine_learning)\n", "\n", "This is notebook 6 of 8. The next notebook is: [[07. Classification with Random Forest]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/07_Classification_Random_Forest.ipynb)\n", "\n", "[[01]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/01_The_Dataset.ipynb) [[02]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/02_Clustering_KMeans.ipynb) [[03]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/03_Clustering_OtherAlgos.ipynb) [[04]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/04_Classification_kNN.ipynb) [[05]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/05_Classification_OtherAlgos.ipynb) **[06]** [[07]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/07_Classification_Random_Forest.ipynb) [[08]](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/08_Dimensionality_Reduction.ipynb)\n", "\n", "***\n", "\n", "We look further at one of the classification algorithms we saw in the [previous notebook](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/05_Classification_OtherAlgos.ipynb). Again, this is an algorithm that is not used a lot in practice, but is very intuitively useful for beginners. Don't worry, the [next algorithm](http://nbviewer.ipython.org/github/Prooffreader/intro_machine_learning/blob/master/07_Classification_Random_Forest.ipynb) is one that's used a lot!\n", "\n", "For the first time, we encounter an algorithm that is convenient to visualize with all five of our features, not just two that we can see in a scatter plot." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Import libraries and load data #" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "from sklearn import tree\n", "from sklearn.externals.six import StringIO\n", "import re\n", "\n", "df = pd.read_csv('fruit.csv')\n", "fruitnames = {1: 'Orange', 2: 'Pear', 3: 'Apple'}\n", "colors = {1: '#e09028', 2: '#55aa33', 3: '#cc3333'}\n", "fruitlist = ['Orange', 'Pear', 'Apple']\n", "\n", "df.sort('fruit_id', inplace=True) # This is important because the factorizer assigns numbers\n", " # based on the order the first label is encountered, e.g. if the first instance had\n", " # fruit = 3, the y value would be 0.\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Classify with a Decision Tree and view Confusion Matrix #\n", "\n", "With all five features used, the confusion matrix should be a perfect or near-perfect classifier on the testing set." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 # randomly assign training and testing set\n", "train, test = df[df['is_train']==True], df[df['is_train']==False]\n", "features = ['color_id', 'elongatedness', 'weight', 'sweetness', 'acidity']\n", "y, _ = pd.factorize(train['fruit_id'])\n", "clf = tree.DecisionTreeClassifier()\n", "clf = clf.fit(train[features], y)\n", "preds = clf.predict(test[features])\n", "test_result = pd.crosstab(np.array([fruitnames[x] for x in test['fruit_id']]), \n", " np.array([fruitnames[x+1] for x in preds]), rownames=['actual'], colnames=['predicted'])\n", "test_result" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
predictedAppleOrangePear
actual
Apple 11 0 0
Orange 1 13 0
Pear 0 0 15
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "predicted Apple Orange Pear\n", "actual \n", "Apple 11 0 0\n", "Orange 1 13 0\n", "Pear 0 0 15" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. View several different trees, each produced on a different randomly selected 70% training set. #\n", "\n", "Observe the differences between each.\n", "\n", "Note:\n", "\n", "1. You will need [Graphviz](http://www.graphviz.org/Download..php) installed and in the PATH environmental variable to visualize the graphs.\n", "\n", "2. I did not make this code block a function because of the IPython magic shell call and call to Image.\n", "\n", "3. I had some issues getting Pydot to work in Python 3, which is why I ran Graphviz in the shell and did a somewhat clunky regex sub to adjust the trees." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Repetition 1\n", "\n", "df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 # randomly assign training and testing set\n", "train, test = df[df['is_train']==True], df[df['is_train']==False]\n", "features = ['color_id', 'elongatedness', 'weight', 'sweetness', 'acidity']\n", "y, _ = pd.factorize(train['fruit_id'])\n", "clf = tree.DecisionTreeClassifier()\n", "clf = clf.fit(train[features], y)\n", "dot_data = StringIO() \n", "tree.export_graphviz(clf, out_file=dot_data) \n", "tree_string = dot_data.getvalue()\n", "# replace feature numbers with feature names\n", "tree_string = re.sub('gini = 0\\.[0-9]+\\\\\\\\n', '', tree_string)\n", "for i, feature in enumerate(features):\n", " tree_string = re.sub('X\\[{}\\]'.format(i), feature, tree_string)\n", "# repace lists of numeric label assignments with label name\n", "for result in re.finditer('\\[[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.\\]', tree_string):\n", " nums = []\n", " for i in range(0,3):\n", " nums.append(int(result.group(i+1)))\n", " if nums[0] > nums[1]:\n", " if nums[0] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[0], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", " elif nums[1] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[1], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", "with open('simple.dotfile', 'w+') as f:\n", " f.write(tree_string)\n", "# normally this would be done with libraries like pydot or networkx, but\n", "# I'm having trouble getting them to work in Python 3.4.2 under Windows,\n", "# so I'll just call the shell executable directly\n", "!dot.exe -Tpng simple.dotfile > simpletree.png\n", "from IPython.core.display import Image\n", "Image( filename ='simpletree.png')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "png": "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\nd955B5WVlZg0aRK2bNmC8vJys0MyxeWXXw63243nnnsOtbW1GBoaMjskIsoDTMqIKC3efvttVFZW\nory8HB6PB8cee6zZIZmquroamzdvxksvvYSamhomZkSUEJMyIhq1P/zhD5g3bx5OPfVUvPzyy5g8\nebLZIeWESy+9FC+99BK2bduGRYsW4YsvvjA7JCLKYUzKiGhUvF4v5s6di7/7u7/D5s2bMXHiRLND\nyikXXnghPB4Pdu7cCavViv3795sdEhHlKCZlRJSyXbt2obq6GmeffTY2b96Mo48+2uyQctKsWbPg\n8Xjw5ptvYuHChfjrX/9qdkhElIOYlBFRSnp6elBdXY0LLrgAbrcbRx55pNkh5bRzzjkHW7Zswdtv\nv43LL78coVDI7JCIKMcwKSOipP3P//wPFixYgMrKSjz//PM44ogjzA4pL5x55pnYunUr3n33Xcyf\nPx+ffvqp2SERUQ5hUkZESfF4PLj88suxYMECbNy4EWVlZWaHlFfOOOMMbNu2DX6/H9XV1fjzn/9s\ndkhElCOYlBGRYS+99BIsFguuuuoquFwuJmQpmj59OrZt24ZgMIh58+bB7/ebHRIR5QAmZURkyAsv\nvIBFixbhmmuuwfr16/n4oFE65ZRTsG3bNgwNDWHu3Ln48MMPzQ6JiEzGpIyIEvrlL3+Jb3/727ju\nuuuwdu1aJmRpctJJJ2Hr1q1QFAVz587F+++/b3ZIRGQiJmVEFJfL5cI111yDpUuX4sknn4SiKGaH\nVFCOP/54bNmyBWVlZaisrMR7771ndkhEZBImZUQU0/r163HttdfiBz/4AR555BEmZBlSXl6OLVu2\nYNKkSaisrMQ777xjdkhEZAImZUSkq729HTfccAPuvPNOOBwOJmQZduyxx8Lj8aC8vByVlZV4++23\nzQ6JiLKMSRkRRXnsscfwve99D6tXr8Z9991ndjhFY/LkyXj55Zdx6qmnYu7cufjd735ndkhElEVM\nyogozEMPPYTly5fjxz/+Me655x6zwyk6EydOxObNm3HGGWdg3rx5ePPNN80OiYiyhEkZEanuv/9+\n3HHHHWhpacFdd91ldjhF6+ijj8aLL76Ic889F5dddhl27dpldkhElAVMyogIAPCjH/0Id999Nx55\n5BHcdtttZodT9I488kh0dXXhm9/8Jqqrq9HT02N2SESUYYoQQpgdBBGZa+XKlbj//vvxxBNPYOnS\n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\n", "prompt_number": 3, "text": [ "" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# Repetition 2\n", "\n", "df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 # randomly assign training and testing set\n", "train, test = df[df['is_train']==True], df[df['is_train']==False]\n", "features = ['color_id', 'elongatedness', 'weight', 'sweetness', 'acidity']\n", "y, _ = pd.factorize(train['fruit_id'])\n", "clf = tree.DecisionTreeClassifier()\n", "clf = clf.fit(train[features], y)\n", "dot_data = StringIO() \n", "tree.export_graphviz(clf, out_file=dot_data) \n", "tree_string = dot_data.getvalue()\n", "# replace feature numbers with feature names\n", "tree_string = re.sub('gini = 0\\.[0-9]+\\\\\\\\n', '', tree_string)\n", "for i, feature in enumerate(features):\n", " tree_string = re.sub('X\\[{}\\]'.format(i), feature, tree_string)\n", "# repace lists of numeric label assignments with label name\n", "for result in re.finditer('\\[[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.\\]', tree_string):\n", " nums = []\n", " for i in range(0,3):\n", " nums.append(int(result.group(i+1)))\n", " if nums[0] > nums[1]:\n", " if nums[0] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[0], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", " elif nums[1] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[1], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", "with open('simple.dotfile', 'w+') as f:\n", " f.write(tree_string)\n", "# normally this would be done with libraries like pydot or networkx, but\n", "# I'm having trouble getting them to work in Python 3.4.2 under Windows,\n", "# so I'll just call the shell executable directly\n", "!dot.exe -Tpng simple.dotfile > simpletree.png\n", "from IPython.core.display import Image\n", "Image( filename ='simpletree.png')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "png": "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\n", "prompt_number": 4, "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Repetition 3\n", "\n", "df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 # randomly assign training and testing set\n", "train, test = df[df['is_train']==True], df[df['is_train']==False]\n", "features = ['color_id', 'elongatedness', 'weight', 'sweetness', 'acidity']\n", "y, _ = pd.factorize(train['fruit_id'])\n", "clf = tree.DecisionTreeClassifier()\n", "clf = clf.fit(train[features], y)\n", "dot_data = StringIO() \n", "tree.export_graphviz(clf, out_file=dot_data) \n", "tree_string = dot_data.getvalue()\n", "# replace feature numbers with feature names\n", "tree_string = re.sub('gini = 0\\.[0-9]+\\\\\\\\n', '', tree_string)\n", "for i, feature in enumerate(features):\n", " tree_string = re.sub('X\\[{}\\]'.format(i), feature, tree_string)\n", "# repace lists of numeric label assignments with label name\n", "for result in re.finditer('\\[[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.[ ]+([\\d]+)\\.\\]', tree_string):\n", " nums = []\n", " for i in range(0,3):\n", " nums.append(int(result.group(i+1)))\n", " if nums[0] > nums[1]:\n", " if nums[0] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[0], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", " elif nums[1] > nums[2]:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[1], tree_string)\n", " else:\n", " tree_string = re.sub('\\[[ ]+{}\\.[ ]+{}\\.[ ]+{}\\.\\]'.format(nums[0], nums[1], nums[2]), fruitlist[2], tree_string)\n", "with open('simple.dotfile', 'w+') as f:\n", " f.write(tree_string)\n", "# normally this would be done with libraries like pydot or networkx, but\n", "# I'm having trouble getting them to work in Python 3.4.2 under Windows,\n", "# so I'll just call the shell executable directly\n", "!dot.exe -Tpng simple.dotfile > simpletree.png\n", "from IPython.core.display import Image\n", "Image( filename ='simpletree.png')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "png": "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\nEREREWn/AwYTxXz+KUnfAAAAAElFTkSuQmCC\n", "prompt_number": 5, "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }