{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Selecting the best model in scikit-learn using cross-validation" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# import\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.datasets import load_iris\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.cross_validation import train_test_split" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "iris = load_iris()\n", "\n", "X = iris.data\n", "y = iris.target" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.97368421052631582" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# splitting the data into train/test\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)\n", "\n", "# using classifier\n", "scl = KNeighborsClassifier(n_neighbors=6)\n", "scl.fit(X_train, y_train)\n", "y_pred = scl.predict(X_test)\n", "\n", "# checking accuracy\n", "accuracy_score(y_test, y_pred)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration Training set observations Testing set observations\n" ] }, { "ename": "TypeError", "evalue": "non-empty format string passed to object.__format__", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'{} {:^61} {}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Iteration'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Training set observations'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Testing set observations'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0miteration\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstart\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'{:^9} {} {:^25}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miteration\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: non-empty format string passed to object.__format__" ] } ], "source": [ "# simulate splitting a dataset of 25 observations into 5 folds\n", "from sklearn.cross_validation import KFold\n", "kf = KFold(25, n_folds=5, shuffle=False)\n", "\n", "# print the contents of each training and testing set\n", "print('{} {:^61} {}'.format('Iteration', 'Training set observations', 'Testing set observations'))\n", "for iteration, data in enumerate(kf, start=1):\n", " print('{:^9} {} {:^25}'.format(iteration, data[0], data[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Cross-validation example: parameter tuning" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.cross_validation import cross_val_score" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 0.93333333 1. 1. 0.86666667 0.93333333\n", " 0.93333333 1. 1. 1. ]\n" ] } ], "source": [ "# 10-fold cross-validation with K=5 for KNN (the n_neighbors parameter)\n", "knn = KNeighborsClassifier(n_neighbors=5)\n", "scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')\n", "print(scores)\n", "# scores are accuracy" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.96666666666666679" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# mean\n", "scores.mean()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.95999999999999996, 0.95333333333333337, 0.96666666666666656, 0.96666666666666656, 0.96666666666666679, 0.96666666666666679, 0.96666666666666679, 0.96666666666666679, 0.97333333333333338, 0.96666666666666679, 0.96666666666666679, 0.97333333333333338, 0.98000000000000009, 0.97333333333333338, 0.97333333333333338, 0.97333333333333338, 0.97333333333333338, 0.98000000000000009, 0.97333333333333338, 0.98000000000000009, 0.96666666666666656, 0.96666666666666656, 0.97333333333333338, 0.95999999999999996, 0.96666666666666656, 0.95999999999999996, 0.96666666666666656, 0.95333333333333337, 0.95333333333333337, 0.95333333333333337]\n" ] } ], "source": [ "# finding out the best value of k and their accuracy\n", "\n", "K = range(1,31)\n", "accuracy = []\n", "\n", "for i in K:\n", " knn = KNeighborsClassifier(n_neighbors=i)\n", " acc = cross_val_score(knn, X, y, cv=10, scoring=\"accuracy\")\n", " accuracy.append(acc.mean())\n", " \n", "print(accuracy)\n", "#print(list(zip(K,accuracy))) " ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(K, accuracy)\n", "plt.xlabel('Value of K for KNN')\n", "plt.ylabel('Cross-Validated Accuracy')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.98000000000000009" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# K = 20, as higher \n", "\n", "knn = KNeighborsClassifier(n_neighbors=20)\n", "acc = cross_val_score(knn, X, y, cv=10, scoring=\"accuracy\")\n", "acc.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Comparing it with Logistic model" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.953333333333\n" ] } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "lr = LogisticRegression()\n", "print(cross_val_score(lr, X, y, cv=10, scoring=\"accuracy\").mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's pick the Advertisement data and find out the best model" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.linear_model import LinearRegression" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " TV Radio Newspaper Sales\n", "1 230.1 37.8 69.2 22.1\n", "2 44.5 39.3 45.1 10.4\n", "3 17.2 45.9 69.3 9.3\n", "4 151.5 41.3 58.5 18.5\n", "5 180.8 10.8 58.4 12.9\n" ] } ], "source": [ "data = pd.read_csv(\"data/Advertising.csv\", index_col=0)\n", "print(data.head())" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "features = ['TV', 'Radio', 'Newspaper']\n", "response = ['Sales']\n", "\n", "X = data[features]\n", "y = data.Sales" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-3.56038438 -3.29767522 -2.08943356 -2.82474283 -1.3027754 -1.74163618\n", " -8.17338214 -2.11409746 -3.04273109 -2.45281793]\n" ] } ], "source": [ "lreg = LinearRegression()\n", "acc = cross_val_score(lreg, X, y, cv=10, scoring=\"mean_squared_error\")\n", "print(acc)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.69135317081\n" ] } ], "source": [ "print(np.sqrt((-acc)).mean())" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.67967484191\n" ] } ], "source": [ "# Testing the same when Newspaper is not included in model\n", "X = data[['TV', 'Radio']]\n", "\n", "lreg = LinearRegression()\n", "print((np.sqrt(-cross_val_score(lreg, X, y, cv=10, scoring=\"mean_squared_error\"))).mean())\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# model performs better when Newspaper is not included" ] }, { "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": 1 }