{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/Users/Lin/Dropbox/Data science/Coursera machine learning/machine-learning-ex2/ex2\n" ] } ], "source": [ "cd /Users/Lin/Dropbox/Data\\ science/Coursera\\ machine\\ learning/machine-learning-ex2/ex2 " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "import pandas as pd\n", "import scipy as sp\n", "import seaborn as sns\n", "import sklearn as sk\n", "\n", "%pylab inline\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn import preprocessing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Part 1: exam scores" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = pd.read_csv(\"ex2data1.txt\", header = None)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data.columns = [\"exam1\",\"exam2\",\"label\"]\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", "
exam1exam2label
034.62366078.0246930
130.28671143.8949980
235.84740972.9021980
360.18259986.3085521
479.03273675.3443761
\n", "
" ], "text/plain": [ " exam1 exam2 label\n", "0 34.623660 78.024693 0\n", "1 30.286711 43.894998 0\n", "2 35.847409 72.902198 0\n", "3 60.182599 86.308552 1\n", "4 79.032736 75.344376 1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X = data.iloc[:,:2]\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
exam1exam2
034.62366078.024693
130.28671143.894998
235.84740972.902198
360.18259986.308552
479.03273675.344376
\n", "
" ], "text/plain": [ " exam1 exam2\n", "0 34.623660 78.024693\n", "1 30.286711 43.894998\n", "2 35.847409 72.902198\n", "3 60.182599 86.308552\n", "4 79.032736 75.344376" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.head()\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 0\n", "2 0\n", "3 1\n", "4 1\n", "Name: label, dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = data[\"label\"]\n", "y.head()\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(X.iloc[:,0], X.iloc[:,1], c=y, cmap=plt.cm.coolwarm)\n", "legend(list(y))\n", "# This is a scatterplot made using matplotlib. I can't work out how to put a legend on this " ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g = sns.lmplot(\"exam1\", \"exam2\", hue=\"label\", data=data, fit_reg=False, palette = \"dark\", markers = [\"o\",\"x\"], legend = True)\n", "plt.xlabel(\"exam 1 marks\")\n", "plt.ylabel(\"exam 2 marks\")\n", "savefig(\"scatter1.png\",dpi=1200)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# make a sigmoid (hypothesis) function that will generate logistic regression hypotheses when passed values of 'z'\n", "#he hypothesis value is the probability that y=1 on input x.\n", "# the function also needs to work for matrices\n", "def sigmoid(z):\n", " g = np.array([z]).flatten()\n", " g = 1/(1+(np.e**-g)) # use vectorisation rather than a for loop to make this calculation more efficient\n", " return g" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.5])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#check that sigmoid function is working - if it's working correctly sigmoid(0) = 0.5\n", "sigmoid(0)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.5 , 0.73105858, 0.88079708, 1. ])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#check that vectors can be passed to sigmoid\n", "sigmoid(np.array([0,1,2,3000]))\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sigmoid" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", "
theta zeroexam1exam2
0134.62366078.024693
1130.28671143.894998
2135.84740972.902198
3160.18259986.308552
4179.03273675.344376
\n", "
" ], "text/plain": [ " theta zero exam1 exam2\n", "0 1 34.623660 78.024693\n", "1 1 30.286711 43.894998\n", "2 1 35.847409 72.902198\n", "3 1 60.182599 86.308552\n", "4 1 79.032736 75.344376" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#add a column of ones to the feature matrix X to account for theta 0\n", "m = len(y)\n", "X.insert(0, \"theta zero\",value =pd.Series(np.ones([m])))\n", "X.head()\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n", " 0.5])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#initiate values for the vector theta \n", "initial_theta = np.zeros([3, 1])\n", "hypothesis = sigmoid(X.dot(initial_theta).T)\n", "hypothesis\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.],\n", " [ 0.],\n", " [ 0.]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "initial_theta" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#define a function that computes the cost function for logistic regression\n", "# so here we interpret the cost as 'how expensive was our mistake?'. \n", "# e.g. If our hypothesis predicts with certainty that y=1\n", "# but y actually turns out to be 0, this is a very costly mistake. \n", "\n", "def costJ(theta, X, y):\n", " m = len(y)\n", " hypothesis = sigmoid(X.dot(theta).T)\n", " \n", " #this is the cost function for linear regression\n", " J = -np.sum(y*np.log(hypothesis)+(1-y)*log(1-hypothesis))/m\n", " \n", " return J\n", "\n", "def gradient(theta,X,y):\n", " #this returns a vector, which is the gradient of the cost function (partial derivatives of the cost function)\n", " m = len(y)\n", " hypothesis = sigmoid(X.dot(theta).T)\n", " error = hypothesis-y\n", " \n", " gradient = []\n", " for i in range(len(X.columns)):\n", " gradient.append(np.sum(error*(X.iloc[:,i]))/m)\n", " return gradient\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.6931471805599458" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "costJ(initial_theta,X,y)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[-0.1, -12.009216589291148, -11.262842205513591]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gradient(initial_theta,X,y)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-25.87336646, 0.21193525, 0.20722437])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#optimise values of theta using scipy's minimize function\n", "Result = sp.optimize.minimize(fun = costJ, x0 = initial_theta, args = (X,y), method = 'TNC', jac=gradient)\n", "Result.x\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.20357130532247558" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Test cost function using minimum values of theta\n", "costJ(Result.x,X,y)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(30, 100)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g = sns.lmplot(\"exam1\", \"exam2\", hue=\"label\", data=data, fit_reg=False, palette = \"dark\", markers = [\"o\",\"x\"], legend = True)\n", "plt.xlabel(\"exam 1 marks\")\n", "plt.ylabel(\"exam 2 marks\")\n", "plot_x = np.array([min(X.iloc[:,2])-2, max(X.iloc[:,2])+2])\n", "plot_y = (-1./Result.x[2])*(Result.x[1]*plot_x + Result.x[0])\n", "plt.plot(plot_x,plot_y)\n", "plt.ylim(30,100)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.78207366])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([1,45,85])\n", "hypothesis = sigmoid(a.dot(Result.x))\n", "hypothesis\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def predict(theta, X):\n", " p_1 = sigmoid(X.dot(theta))\n", " return (p_1 >= 0.5).astype(int)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [], "source": [ "Lin=np.array([[1,80,0],[1,67,89]])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 1])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predict(Result.x,Lin)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "89.0" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Predict the percentage accuracy of our predictor by feeding it the original dataset\n", "g = predict(Result.x,X)\n", "float(y[y==g].size)/float(len(y))*100 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Part 2: Regularised logistic regression" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data2 = pd.read_csv(\"ex2data2.txt\", header = None)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", "
microchip test 1microchip test 2Pass or fail
00.0512670.699561
1-0.0927420.684941
2-0.2137100.692251
3-0.3750000.502191
4-0.5132500.465641
\n", "
" ], "text/plain": [ " microchip test 1 microchip test 2 Pass or fail\n", "0 0.051267 0.69956 1\n", "1 -0.092742 0.68494 1\n", "2 -0.213710 0.69225 1\n", "3 -0.375000 0.50219 1\n", "4 -0.513250 0.46564 1" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2.columns=[\"microchip test 1\", \"microchip test 2\", \"Pass or fail\"]\n", "data2.head()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X= data2.iloc[:,:2]\n", "y = data2.iloc[:,2]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
microchip test 1microchip test 2
00.0512670.69956
1-0.0927420.68494
2-0.2137100.69225
3-0.3750000.50219
4-0.5132500.46564
\n", "
" ], "text/plain": [ " microchip test 1 microchip test 2\n", "0 0.051267 0.69956\n", "1 -0.092742 0.68494\n", "2 -0.213710 0.69225\n", "3 -0.375000 0.50219\n", "4 -0.513250 0.46564" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.head()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y.head()\n", "m = float(len(y))" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nqRuMdAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g = sns.lmplot(\"microchip test 1\", \"microchip test 2\", hue=\"Pass or fail\", data=data2, fit_reg=False, palette = \"colorblind\", markers = [\"o\",\"x\"], legend = True)\n", "plt.xlabel(\"microchip test 1\")\n", "plt.ylabel(\"microchip test 2\")" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...18192021222324252627
010.0512670.699560.0026280.0358640.4893840.0001350.0018390.0250890.342354...0.0009000.0122780.1675421.815630e-082.477505e-070.0000030.0000460.0006290.0085890.117206
11-0.0927420.684940.008601-0.0635230.469143-0.0007980.005891-0.0435090.321335...0.002764-0.0204120.1507526.362953e-07-4.699318e-060.000035-0.0002560.001893-0.0139810.103256
21-0.2137100.692250.045672-0.1479410.479210-0.0097610.031616-0.1024120.331733...0.015151-0.0490770.1589709.526844e-05-3.085938e-040.001000-0.0032380.010488-0.0339730.110047
31-0.3750000.502190.140625-0.1883210.252195-0.0527340.070620-0.0945730.126650...0.017810-0.0238510.0319402.780914e-03-3.724126e-030.004987-0.0066790.008944-0.0119780.016040
41-0.5132500.465640.263426-0.2389900.216821-0.1352030.122661-0.1112830.100960...0.026596-0.0241280.0218901.827990e-02-1.658422e-020.015046-0.0136500.012384-0.0112350.010193
\n", "

5 rows × 28 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 \\\n", "0 1 0.051267 0.69956 0.002628 0.035864 0.489384 0.000135 0.001839 \n", "1 1 -0.092742 0.68494 0.008601 -0.063523 0.469143 -0.000798 0.005891 \n", "2 1 -0.213710 0.69225 0.045672 -0.147941 0.479210 -0.009761 0.031616 \n", "3 1 -0.375000 0.50219 0.140625 -0.188321 0.252195 -0.052734 0.070620 \n", "4 1 -0.513250 0.46564 0.263426 -0.238990 0.216821 -0.135203 0.122661 \n", "\n", " 8 9 ... 18 19 20 21 \\\n", "0 0.025089 0.342354 ... 0.000900 0.012278 0.167542 1.815630e-08 \n", "1 -0.043509 0.321335 ... 0.002764 -0.020412 0.150752 6.362953e-07 \n", "2 -0.102412 0.331733 ... 0.015151 -0.049077 0.158970 9.526844e-05 \n", "3 -0.094573 0.126650 ... 0.017810 -0.023851 0.031940 2.780914e-03 \n", "4 -0.111283 0.100960 ... 0.026596 -0.024128 0.021890 1.827990e-02 \n", "\n", " 22 23 24 25 26 27 \n", "0 2.477505e-07 0.000003 0.000046 0.000629 0.008589 0.117206 \n", "1 -4.699318e-06 0.000035 -0.000256 0.001893 -0.013981 0.103256 \n", "2 -3.085938e-04 0.001000 -0.003238 0.010488 -0.033973 0.110047 \n", "3 -3.724126e-03 0.004987 -0.006679 0.008944 -0.011978 0.016040 \n", "4 -1.658422e-02 0.015046 -0.013650 0.012384 -0.011235 0.010193 \n", "\n", "[5 rows x 28 columns]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poly = sk.preprocessing.PolynomialFeatures(6)\n", "poly = poly.fit_transform(X)\n", "poly = pd.DataFrame(poly)\n", "poly.head()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "initial_theta = np.zeros([len(poly.columns), 1])\n", "lamb = 1.0" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def costreg(theta, X, y , lamb):\n", " m = float(len(y))\n", " hypothesis = sigmoid(X.dot(theta).T)\n", " #this is the regularisation term for logistic regression\n", " regterm = (lamb/(2*m))*sum(initial_theta[1:]**2)\n", " \n", " #this is the cost function for linear regression\n", " J = -np.sum(y*np.log(hypothesis)+(1-y)*log(1-hypothesis))/m + regterm\n", " return J\n", "\n", "def gradient(theta,X,y, lamb):\n", " #this returns a vector, which is the gradient of the cost function (partial derivatives of the cost function)\n", " m = len(y)\n", " hypothesis = sigmoid(X.dot(theta).T)\n", " error = hypothesis-y\n", " \n", " gradient = []\n", " for i in range(len(X.columns)):\n", " if i==0:\n", " gradient.append(np.sum(error*(X.iloc[:,i]))/m)\n", " else:\n", " gradient.append(((np.sum(error*(X.iloc[:,i]))/m)) + (lamb/m)*theta[i])\n", " return gradient" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.69314718055994606" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "costreg(initial_theta,poly,y,lamb)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "ename": "AttributeError", "evalue": "'list' object has no attribute 'flatten'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mgradient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial_theta\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpoly\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlamb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mgradient\u001b[0;34m(theta, X, y, lamb)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlamb\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mtheta\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'flatten'" ] } ], "source": [ "gradient(initial_theta,poly,y,lamb)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.27422044, 0.6247865 , 1.18590383, -2.02173846, -0.9170823 ,\n", " -1.41319206, 0.12444385, -0.36770505, -0.36458176, -0.18067781,\n", " -1.46506516, -0.06288689, -0.61999793, -0.27174419, -1.20129297,\n", " -0.23663774, -0.2090143 , -0.05490406, -0.27804402, -0.29276904,\n", " -0.46790736, -1.04396483, 0.02082849, -0.29638538, 0.00961561,\n", " -0.32917181, -0.138042 , -0.93550791])" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#optimise values of theta using scipy's minimize function\n", "Result = sp.optimize.minimize(fun = costreg, x0 = initial_theta, args = (poly,y, lamb), method = 'TNC', jac=gradient)\n", "Result.x\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "costreg(Result.x,poly,y,lamb)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "g = sns.lmplot(\"microchip test 1\", \"microchip test 2\", hue=\"Pass or fail\", data=data2, fit_reg=False, palette = \"colorblind\", markers = [\"o\",\"x\"], legend = True)\n", "plt.xlabel(\"microchip test 1\")\n", "plt.ylabel(\"microchip test 2\")\n", "plot_x = np.array([min(X.iloc[:,2])-2, max(X.iloc[:,2])+2])\n", "plot_y = (-1./Result.x[2])*(Result.x[1]*plot_x + Result.x[0])\n", "plt.plot(plot_x,plot_y)\n", "plt.ylim(30,100)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", " \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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
0-1.000000-1.000000
1-0.948980-0.948980
2-0.897959-0.897959
3-0.846939-0.846939
4-0.795918-0.795918
5-0.744898-0.744898
6-0.693878-0.693878
7-0.642857-0.642857
8-0.591837-0.591837
9-0.540816-0.540816
10-0.489796-0.489796
11-0.438776-0.438776
12-0.387755-0.387755
13-0.336735-0.336735
14-0.285714-0.285714
15-0.234694-0.234694
16-0.183673-0.183673
17-0.132653-0.132653
18-0.081633-0.081633
19-0.030612-0.030612
200.0204080.020408
210.0714290.071429
220.1224490.122449
230.1734690.173469
240.2244900.224490
250.2755100.275510
260.3265310.326531
270.3775510.377551
280.4285710.428571
290.4795920.479592
300.5306120.530612
310.5816330.581633
320.6326530.632653
330.6836730.683673
340.7346940.734694
350.7857140.785714
360.8367350.836735
370.8877550.887755
380.9387760.938776
390.9897960.989796
401.0408161.040816
411.0918371.091837
421.1428571.142857
431.1938781.193878
441.2448981.244898
451.2959181.295918
461.3469391.346939
471.3979591.397959
481.4489801.448980
491.5000001.500000
\n", "
" ], "text/plain": [ " 0 1\n", "0 -1.000000 -1.000000\n", "1 -0.948980 -0.948980\n", "2 -0.897959 -0.897959\n", "3 -0.846939 -0.846939\n", "4 -0.795918 -0.795918\n", "5 -0.744898 -0.744898\n", "6 -0.693878 -0.693878\n", "7 -0.642857 -0.642857\n", "8 -0.591837 -0.591837\n", "9 -0.540816 -0.540816\n", "10 -0.489796 -0.489796\n", "11 -0.438776 -0.438776\n", "12 -0.387755 -0.387755\n", "13 -0.336735 -0.336735\n", "14 -0.285714 -0.285714\n", "15 -0.234694 -0.234694\n", "16 -0.183673 -0.183673\n", "17 -0.132653 -0.132653\n", "18 -0.081633 -0.081633\n", "19 -0.030612 -0.030612\n", "20 0.020408 0.020408\n", "21 0.071429 0.071429\n", "22 0.122449 0.122449\n", "23 0.173469 0.173469\n", "24 0.224490 0.224490\n", "25 0.275510 0.275510\n", "26 0.326531 0.326531\n", "27 0.377551 0.377551\n", "28 0.428571 0.428571\n", "29 0.479592 0.479592\n", "30 0.530612 0.530612\n", "31 0.581633 0.581633\n", "32 0.632653 0.632653\n", "33 0.683673 0.683673\n", "34 0.734694 0.734694\n", "35 0.785714 0.785714\n", "36 0.836735 0.836735\n", "37 0.887755 0.887755\n", "38 0.938776 0.938776\n", "39 0.989796 0.989796\n", "40 1.040816 1.040816\n", "41 1.091837 1.091837\n", "42 1.142857 1.142857\n", "43 1.193878 1.193878\n", "44 1.244898 1.244898\n", "45 1.295918 1.295918\n", "46 1.346939 1.346939\n", "47 1.397959 1.397959\n", "48 1.448980 1.448980\n", "49 1.500000 1.500000" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w.T" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1.27422044, -0.6247865 , -1.18590383, ..., -0.32917181,\n", " -0.138042 , -0.93550791],\n", " [ 1.27422044, -0.59290964, -1.12539853, ..., -0.24041628,\n", " -0.10082134, -0.68326426],\n", " [ 1.27422044, -0.56103278, -1.06489323, ..., -0.17256877,\n", " -0.07236871, -0.49044131],\n", " ..., \n", " [ 1.27422044, 0.87342603, 1.65784514, ..., -2.45691191,\n", " -1.03033438, -6.9825558 ],\n", " [ 1.27422044, 0.90530289, 1.71835044, ..., -3.04646539,\n", " -1.27757044, -8.65806971],\n", " [ 1.27422044, 0.93717975, 1.77885574, ..., -3.74947266,\n", " -1.57238466, -10.65601984]])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = w.T\n", "poly = sk.preprocessing.PolynomialFeatures(6)\n", "poly.fit_transform(w)*Result.x" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\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 7\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mz\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpoly\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mResult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/Applications/anaconda/lib/python2.7/site-packages/sklearn/base.pyc\u001b[0m in \u001b[0;36mfit_transform\u001b[0;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[1;32m 431\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 432\u001b[0m \u001b[0;31m# fit method of arity 1 (unsupervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 433\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 434\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 435\u001b[0m \u001b[0;31m# fit method of arity 2 (supervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Applications/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc\u001b[0m in \u001b[0;36mtransform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 556\u001b[0m self.include_bias)\n\u001b[1;32m 557\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombinations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 558\u001b[0;31m \u001b[0mXP\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 559\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mXP\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "poly = sk.preprocessing.PolynomialFeatures(6)\n", "\n", "u = np.linspace(-1, 1.5, 50)\n", "v = np.linspace(-1, 1.5, 50)\n", "w = np.vstack([u,v])\n", "z = np.zeros([len(u), len(v)])\n", "for i in range(len(u)):\n", " for j in range(len(v)):\n", " z[i,j] = poly.fit_transform(w.T)*Result.x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "u = linspace(-1, 1.5, 50);\n", " v = linspace(-1, 1.5, 50);\n", "\n", " z = zeros(length(u), length(v));\n", " % Evaluate z = theta*x over the grid\n", " for i = 1:length(u)\n", " for j = 1:length(v)\n", " z(i,j) = mapFeature(u(i), v(j))*theta;\n", " end\n", " end\n", " z = z'; % important to transpose z before calling contour\n", "\n", " % Plot z = 0\n", " % Notice you need to specify the range [0, 0" ] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 0 }