{ "metadata": { "name": "04B_supervised_regression" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Supervised Learning: Regression of Housing Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By the end of this section you will\n", "\n", "- Know how to instantiate a scikit-learn regression model\n", "- Know how to train a regressor by calling the `fit(...)` method\n", "- Know how to predict new labels by calling the `predict(...)` method\n", "\n", "Here we'll do a short example of a regression problem: learning a continuous value\n", "from a set of features.\n", "\n", "We'll use the simple Boston house prices set, available in scikit-learn. This\n", "records measurements of 13 attributes of housing markets around Boston, as well\n", "as the median price. The question is: can you predict the price of a new\n", "market given its attributes?\n", "\n", "First we'll load the dataset:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.datasets import load_boston\n", "data = load_boston()\n", "print data.keys()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['data', 'feature_names', 'DESCR', 'target']\n" ] } ], "prompt_number": 0 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that there are just over 500 data points:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.data.shape\n", "print data.target.shape" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(506, 13)\n", "(506,)\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``DESCR`` variable has a long description of the dataset:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.DESCR" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "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" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "It often helps to quickly visualize pieces of the data using histograms, scatter plots,\n", "or other plot types. Here we'll load pylab and show a histogram of the target values:\n", "the median price in each neighborhood." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.hist(data.target)\n", "plt.xlabel('price ($1000s)')\n", "plt.ylabel('count')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 6, "text": [ "" ] }, { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Quick Exercise:** Try some scatter plots of the features versus the target.\n", "\n", "Are there any features that seem to have a strong correlation with the\n", "target value? Any that don't?\n", "\n", "Remember, you can get at the data columns using:\n", "\n", " column_i = data.data[:, i]" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a manual version of a technique called **feature selection**.\n", "\n", "Sometimes, in Machine Learning it is useful to use \n", "feature selection to decide which features are most useful for a\n", "particular problem. Automated methods exist which quantify this sort\n", "of exercise of choosing the most informative features. We won't cover\n", "feature selection in this tutorial, but you can read about it elsewhere." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Predicting Home Prices: a Simple Linear Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we'll use ``scikit-learn`` to perform a simple linear regression\n", "on the housing data. There are many possibilities of regressors to\n", "use. A particularly simple one is ``LinearRegression``: this is\n", "basically a wrapper around an ordinary least squares calculation.\n", "\n", "We'll set it up like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.cross_validation import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(data.data, data.target)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.linear_model import LinearRegression\n", "\n", "clf = LinearRegression()\n", "\n", "clf.fit(X_train, y_train)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "/usr/local/lib/python2.7/site-packages/scikits/__init__.py:1: UserWarning: Module argparse was already imported from /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.pyc, but /usr/local/lib/python2.7/site-packages is being added to sys.path\n", " __import__('pkg_resources').declare_namespace(__name__)\n" ] }, { "output_type": "pyout", "prompt_number": 8, "text": [ "LinearRegression(copy_X=True, fit_intercept=True, normalize=False)" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "predicted = clf.predict(X_test)\n", "expected = y_test" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.scatter(expected, predicted)\n", "plt.plot([0, 50], [0, 50], '--k')\n", "plt.axis('tight')\n", "plt.xlabel('True price ($1000s)')\n", "plt.ylabel('Predicted price ($1000s)')\n", "print \"RMS:\", np.sqrt(np.mean((predicted - expected) ** 2))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "RMS: 4.72076172435\n" ] }, { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The prediction at least correlates with the true price, though there\n", "are clearly some biases. We could imagine evaluating the performance\n", "of the regressor by, say, computing the RMS residuals between the\n", "true and predicted price. There are some subtleties in this, however,\n", "which we'll cover in a later section." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many examples of regression-type problems in machine learning\n", "\n", "- **Sales:** given consumer data, predict how much they will spend\n", "- **Advertising:** given information about a user, predict the click-through rate for a web ad.\n", "- **Collaborative Filtering:** given a collection of user-ratings for movies, predict preferences for other movies & users\n", "- **Astronomy:** given observations of galaxies, predict their mass or redshift\n", "\n", "And much, much more." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Exercise: Gradient Boosting Tree Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many other types of regressors available in scikit-learn:\n", "we'll try a more powerful one here.\n", "\n", "**Use the GradientBoostingRegressor class to fit the housing data**.\n", "\n", "You can copy and paste some of the above code, replacing `LinearRegression`\n", "with `GradientBoostingRegressor`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn.ensemble import GradientBoostingRegressor\n", "# Instantiate the model, fit the results, and scatter in vs. out\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Solution:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load solutions/04B_houses_regression.py" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 } ], "metadata": {} } ] }