{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Learning Scikit-learn: Machine Learning in Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IPython Notebook for Chapter 2: Supervised Learning - Estimating Boston house pricing using Linear Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_In every example we have seen so far, we have faced what in Chapter 1, Machine Learning – A Gentle Introduction, we called classification problems: the output we aimed at predicting belonged to a discrete set. But often, we would want to predict\n", "a value extracted from the real line. In this notebook, we want to approximate a real function (i.e. solve a _regression problem_), using Linear Regression, a very simple regression model, from Scikit-learn._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Start by importing numpy, scikit-learn, and pyplot, the Python libraries we will be using in this chapter. Show the versions we will be using (in case you have problems running the notebooks)." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n", "IPython version: 3.2.1\n", "numpy version: 1.9.2\n", "scikit-learn version: 0.16.1\n", "matplotlib version: 1.4.3\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: pylab import has clobbered these variables: ['axes']\n", "`%matplotlib` prevents importing * from pylab and numpy\n" ] } ], "source": [ "%pylab inline\n", "import IPython\n", "import sklearn as sk\n", "import numpy as np\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", "print ('IPython version:', IPython.__version__)\n", "print ('numpy version:', np.__version__)\n", "print ('scikit-learn version:', sk.__version__)\n", "print ('matplotlib version:', matplotlib.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the Boston House Pricing Dataset (http://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html), and show their features." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(506, 13)\n", "['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'\n", " 'B' 'LSTAT']\n", "50.0 5.0 22.5328063241\n", "Boston House Prices dataset\n", "\n", "Notes\n", "------\n", "Data Set Characteristics: \n", "\n", " :Number of Instances: 506 \n", "\n", " :Number of Attributes: 13 numeric/categorical predictive\n", " \n", " :Median Value (attribute 14) is usually the target\n", "\n", " :Attribute Information (in order):\n", " - CRIM per capita crime rate by town\n", " - ZN proportion of residential land zoned for lots over 25,000 sq.ft.\n", " - INDUS proportion of non-retail business acres per town\n", " - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n", " - NOX nitric oxides concentration (parts per 10 million)\n", " - RM average number of rooms per dwelling\n", " - AGE proportion of owner-occupied units built prior to 1940\n", " - DIS weighted distances to five Boston employment centres\n", " - RAD index of accessibility to radial highways\n", " - TAX full-value property-tax rate per $10,000\n", " - PTRATIO pupil-teacher ratio by town\n", " - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n", " - LSTAT % lower status of the population\n", " - MEDV Median value of owner-occupied homes in $1000's\n", "\n", " :Missing Attribute Values: None\n", "\n", " :Creator: Harrison, D. and Rubinfeld, D.L.\n", "\n", "This is a copy of UCI ML housing dataset.\n", "http://archive.ics.uci.edu/ml/datasets/Housing\n", "\n", "\n", "This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.\n", "\n", "The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic\n", "prices and the demand for clean air', J. Environ. Economics & Management,\n", "vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics\n", "...', Wiley, 1980. N.B. Various transformations are used in the table on\n", "pages 244-261 of the latter.\n", "\n", "The Boston house-price data has been used in many machine learning papers that address regression\n", "problems. \n", " \n", "**References**\n", "\n", " - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.\n", " - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.\n", " - many more! (see http://archive.ics.uci.edu/ml/datasets/Housing)\n", "\n" ] } ], "source": [ "from sklearn.datasets import load_boston\n", "boston = load_boston()\n", "print (boston.data.shape)\n", "print (boston.feature_names)\n", "print (np.max(boston.target), np.min(boston.target), np.mean(boston.target))\n", "print (boston.DESCR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Show an example instance, and some common statistics:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6.32000000e-03 1.80000000e+01 2.31000000e+00 0.00000000e+00\n", " 5.38000000e-01 6.57500000e+00 6.52000000e+01 4.09000000e+00\n", " 1.00000000e+00 2.96000000e+02 1.53000000e+01 3.96900000e+02\n", " 4.98000000e+00]\n", "711.0 0.0 70.0724468258\n" ] } ], "source": [ "print (boston.data[0])\n", "print (np.max(boston.data), np.min(boston.data), np.mean(boston.data))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Build, as usual, training and testing sets:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.cross_validation import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.25, random_state=33)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before learning, let's try to see which features are more relevant for our learning task, i.e. which of them are better prize predictors. We will use the SelectKBest method from the feature_selection package, and plot the results." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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\n4wAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.feature_selection import *\n", "fs=SelectKBest(score_func=f_regression,k=5)\n", "X_new=fs.fit_transform(X_train,y_train)\n", "print (zip(fs.get_support(),boston.feature_names))\n", "\n", "x_min, x_max = X_new[:,0].min() - .5, X_new[:, 0].max() + .5\n", "y_min, y_max = y_train.min() - .5, y_train.max() + .5\n", "#fig=plt.figure()\n", "#fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)\n", "\n", "# Two subplots, unpack the axes array immediately\n", "fig, axes = plt.subplots(1,5)\n", "fig.set_size_inches(12,12)\n", "\n", "for i in range(5):\n", " axes[i].set_aspect('equal')\n", " axes[i].set_title('Feature ' + str(i))\n", " axes[i].set_xlabel('Feature')\n", " axes[i].set_ylabel('Median house value')\n", " axes[i].set_xlim(x_min, x_max)\n", " axes[i].set_ylim(y_min, y_max)\n", " sca(axes[i])\n", " plt.scatter(X_new[:,i],y_train)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In regression tasks, is very important to normalize data (to avoid that large-valued features weight too much in the final result)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10.2028980046 -4.66702040845 2.47038706385e-15 2.91774920367 -1.93147098641 3.58552238032e-16\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "scalerX = StandardScaler().fit(X_train)\n", "scalery = StandardScaler().fit(y_train)\n", "\n", "X_train = scalerX.transform(X_train)\n", "y_train = scalery.transform(y_train)\n", "X_test = scalerX.transform(X_test)\n", "y_test = scalery.transform(y_test)\n", "\n", "print (np.max(X_train), np.min(X_train), np.mean(X_train), np.max(y_train), np.min(y_train), np.mean(y_train))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A Linear Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with a lineal model, SGDRegressor, that tries to find the hyperplane that minimizes a certain loss function (typically, the sum of squared distances from each instance to the hyperplane). It uses Stochastic Gradient Descent to find the minimum. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regression poses an additional problem: how should we evaluate our results? Accuracy is not a good idea, since\n", "we are predicting real values, it is almost impossible for us to predict exactly the final value. There are several measures that can be used (you can look at the list of functions under sklearn.metrics module). The most common is the R2 score, or coefficient of determination that measures the proportion of the outcomes variation explained by the model, and is the default score function for regression methods in scikit-learn. This score reaches its maximum value of 1 when the model perfectly predicts all the test target values. " ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.cross_validation import *\n", "def train_and_evaluate(clf, X_train, y_train):\n", " \n", " clf.fit(X_train, y_train)\n", " \n", " print (\"Coefficient of determination on training set:\",clf.score(X_train, y_train))\n", " \n", " # create a k-fold croos validation iterator of k=5 folds\n", " cv = KFold(X_train.shape[0], 5, shuffle=True, random_state=33)\n", " scores = cross_val_score(clf, X_train, y_train, cv=cv)\n", " print (\"Average coefficient of determination using 5-fold crossvalidation:\",np.mean(scores))" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.743617732983\n", "Average coefficient of determination using 5-fold crossvalidation: 0.710809853468\n", "[-0.08527595 0.06706144 -0.05032898 0.10874804 -0.07755151 0.38961893\n", " -0.02485839 -0.20990016 0.08491659 -0.05495108 -0.19854006 0.06126093\n", " -0.37817963]\n" ] } ], "source": [ "from sklearn import linear_model\n", "clf_sgd = linear_model.SGDRegressor(loss='squared_loss', penalty=None, random_state=42)\n", "train_and_evaluate(clf_sgd,X_train,y_train)\n", "print (clf_sgd.coef_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You probably noted the $penalty=None$ parameter when we called the method. The penalization parameter for linear regression methods is introduced to avoid overfitting. It does this by penalizing those hyperplanes having some of their coefficients too large, seeking hyperplanes where each feature contributes more or less the same to the predicted value. This parameter is generally the L2 norm (the squared sums of the coefficients) or the L1 norm (that is the sum of the absolute value of the coefficients). Let's see how our model works if we introduce an L2 or L1 penalty." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.743616743208\n", "Average coefficient of determination using 5-fold crossvalidation: 0.71081206667\n" ] } ], "source": [ "clf_sgd1 = linear_model.SGDRegressor(loss='squared_loss', penalty='l2', random_state=42)\n", "train_and_evaluate(clf_sgd1,X_train,y_train)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.74358692291\n", "Average coefficient of determination using 5-fold crossvalidation: 0.710763609874\n" ] } ], "source": [ "clf_sgd2 = linear_model.SGDRegressor(loss='squared_loss', penalty='l1', random_state=42)\n", "train_and_evaluate(clf_sgd2,X_train,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Support Vector Machines for regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The regression version of SVM can be used instead to find the hyperplane (note how easy is to change the classification method in scikit-learn!). We will try a linear kernel, a polynomial kernel, and finally, a rbf kernel. For more information on kernels, see http://scikit-learn.org/stable/modules/svm.html#svm-kernels" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.71886923342\n", "Average coefficient of determination using 5-fold crossvalidation: 0.707838419194\n" ] } ], "source": [ "from sklearn import svm\n", "clf_svr= svm.SVR(kernel='linear')\n", "train_and_evaluate(clf_svr,X_train,y_train)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.904109273301\n", "Average coefficient of determination using 5-fold crossvalidation: 0.779288545488\n" ] } ], "source": [ "clf_svr_poly= svm.SVR(kernel='poly')\n", "train_and_evaluate(clf_svr_poly,X_train,y_train)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.900132065979\n", "Average coefficient of determination using 5-fold crossvalidation: 0.833662221567\n" ] } ], "source": [ "clf_svr_rbf= svm.SVR(kernel='rbf')\n", "train_and_evaluate(clf_svr_rbf,X_train,y_train)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 0.715338649791\n", "Average coefficient of determination using 5-fold crossvalidation: 0.609837490871\n" ] } ], "source": [ "clf_svr_poly2= svm.SVR(kernel='poly',degree=2)\n", "train_and_evaluate(clf_svr_poly2,X_train,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random Forests for Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, let's try again Random Forests, in their Extra Trees, and Regression version" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination on training set: 1.0\n", "Average coefficient of determination using 5-fold crossvalidation: 0.828644680783\n" ] } ], "source": [ "from sklearn import ensemble\n", "clf_et=ensemble.ExtraTreesRegressor(n_estimators=10,random_state=42)\n", "train_and_evaluate(clf_et,X_train,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An interesting side effect of random forest classification, is that you can measure how 'important' each feature is when predicting the final result (note the number of rooms is the most important). (Thanks to Gareth Williams)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(0.34331421222970898, 'RM'), (0.31954983828996342, 'LSTAT'), (0.092736945019823588, 'PTRATIO'), (0.044472308491812683, 'TAX'), (0.034373941865562779, 'DIS'), (0.029049805972639613, 'INDUS'), (0.027707107411758886, 'CRIM'), (0.027504620381606271, 'NOX'), (0.025553479738716051, 'CHAS'), (0.020080334176502228, 'RAD'), (0.017817804117756745, 'B'), (0.01415525490319532, 'AGE'), (0.0036843474009534251, 'ZN')]\n" ] } ], "source": [ "important=zip(clf_et.feature_importances_,boston.feature_names)\n", "print (sorted(important, key=lambda x: x[0], reverse=True))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, evaluate our classifiers on the testing set" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficient of determination:0.834 \n", "\n" ] } ], "source": [ "from sklearn import metrics\n", "def measure_performance(X,y,clf, show_accuracy=True, show_classification_report=True, show_confusion_matrix=True, show_r2_score=False):\n", " y_pred=clf.predict(X) \n", " if show_accuracy:\n", " print (\"Accuracy:{0:.3f}\".format(metrics.accuracy_score(y,y_pred)),\"\\n\")\n", "\n", " if show_classification_report:\n", " print (\"Classification report\")\n", " print (metrics.classification_report(y,y_pred),\"\\n\")\n", " \n", " if show_confusion_matrix:\n", " print (\"Confusion matrix\")\n", " print (metrics.confusion_matrix(y,y_pred),\"\\n\")\n", " \n", " if show_r2_score:\n", " print (\"Coefficient of determination:{0:.3f}\".format(metrics.r2_score(y,y_pred)),\"\\n\")\n", "\n", " \n", "measure_performance(X_test,y_test,clf_et, show_accuracy=False, show_classification_report=False,show_confusion_matrix=False, show_r2_score=True)\n", "\n" ] } ], "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.3.5" } }, "nbformat": 4, "nbformat_minor": 0 }