Skip to content

Instantly share code, notes, and snippets.

@Z30G0D
Created February 17, 2018 13:15
Show Gist options
  • Save Z30G0D/735843c2db8c34f363cfeae4bf9b6ef9 to your computer and use it in GitHub Desktop.
Save Z30G0D/735843c2db8c34f363cfeae4bf9b6ef9 to your computer and use it in GitHub Desktop.
This is the second exercise from Andrew NG course in Machine learning
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exercise 2- Andrew NG Machine Learning Course\n",
"## Hey all!\n",
"This is the second task from Andrew NG course of machine learning concerning simple **logistic** regression.\n",
"I implemented the exercise in python but the original implementation is in MATLAB.\n",
"feel free to review my work through tomer@nahshoh.net.\n",
"The task is locate <a href=\"https://github.com/jdwittenauer/ipython-notebooks/blob/master/exercises/ML/ex1.pdf\">here</a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import os\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"path = os.getcwd() + '/\\Exercise2\\ex2\\ex2data1.txt'\n",
"data = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<bound method NDFrame.head of Exam 1 Exam 2 Admitted\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\n",
"5 45.083277 56.316372 0\n",
"6 61.106665 96.511426 1\n",
"7 75.024746 46.554014 1\n",
"8 76.098787 87.420570 1\n",
"9 84.432820 43.533393 1\n",
"10 95.861555 38.225278 0\n",
"11 75.013658 30.603263 0\n",
"12 82.307053 76.481963 1\n",
"13 69.364589 97.718692 1\n",
"14 39.538339 76.036811 0\n",
"15 53.971052 89.207350 1\n",
"16 69.070144 52.740470 1\n",
"17 67.946855 46.678574 0\n",
"18 70.661510 92.927138 1\n",
"19 76.978784 47.575964 1\n",
"20 67.372028 42.838438 0\n",
"21 89.676776 65.799366 1\n",
"22 50.534788 48.855812 0\n",
"23 34.212061 44.209529 0\n",
"24 77.924091 68.972360 1\n",
"25 62.271014 69.954458 1\n",
"26 80.190181 44.821629 1\n",
"27 93.114389 38.800670 0\n",
"28 61.830206 50.256108 0\n",
"29 38.785804 64.995681 0\n",
".. ... ... ...\n",
"70 32.722833 43.307173 0\n",
"71 64.039320 78.031688 1\n",
"72 72.346494 96.227593 1\n",
"73 60.457886 73.094998 1\n",
"74 58.840956 75.858448 1\n",
"75 99.827858 72.369252 1\n",
"76 47.264269 88.475865 1\n",
"77 50.458160 75.809860 1\n",
"78 60.455556 42.508409 0\n",
"79 82.226662 42.719879 0\n",
"80 88.913896 69.803789 1\n",
"81 94.834507 45.694307 1\n",
"82 67.319257 66.589353 1\n",
"83 57.238706 59.514282 1\n",
"84 80.366756 90.960148 1\n",
"85 68.468522 85.594307 1\n",
"86 42.075455 78.844786 0\n",
"87 75.477702 90.424539 1\n",
"88 78.635424 96.647427 1\n",
"89 52.348004 60.769505 0\n",
"90 94.094331 77.159105 1\n",
"91 90.448551 87.508792 1\n",
"92 55.482161 35.570703 0\n",
"93 74.492692 84.845137 1\n",
"94 89.845807 45.358284 1\n",
"95 83.489163 48.380286 1\n",
"96 42.261701 87.103851 1\n",
"97 99.315009 68.775409 1\n",
"98 55.340018 64.931938 1\n",
"99 74.775893 89.529813 1\n",
"\n",
"[100 rows x 3 columns]>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's visualize the data."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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w10zHjKY2UxgJsCwYcP2+v2OHTtoaWlh27ZtuYYoBdavXz+qqqrYd999C/7cSevb1QK7venLL77yadGfCtSb2XlAP+Agghb+IWa2T9iqrwLWZ3qwu88B5kDQddP19y0tLfTv35/q6mrMMn1/SCm5O5s2baKlpYXhw4cX/PnjNLApuUnyl1/SGhp9lfNgrLt/392r3L0amAL8zt0vBV4AvhrebTqwKJfn37ZtGwMHDlSSjwkzY+DAgUU5worbwKaUn7QPIhejqNnNwPVm9jZBn/3cXJ9IST5eivX3yLYonUgx5NLQSFoBu4Ikend/0d3PD39+x91Pcvd/d/eL3X17IV4jKk8++SRmxptvvpnx95dddhkLFy7M+vnWr1/PV78aHPAsX76c3/zmN7t/9+KLL/LKK6/0Ocbq6mref//9Pj8uLuIyNVDKUy4NjaQdAagEQi8aGxuZMGECCxYs4NZbb837+YYOHbr7i2H58uU0NTVx3nnnAUGiP/DAAznllFPyfp0kSXLfriRfXweRux4BTJ6cgH79bIrWF/uS6cQjq1at6kv9/aL46KOPfOjQob5mzRofOXKku7vv2rXLGxoa/Nhjj/XzzjvPzz33XH/88cfd3f2oo47y73//+37yySf7uHHjfNmyZV5XV+dHH32033///e7u/u677/qoUaN8+/btfuSRR/qgQYN8zJgxfvvtt/vgwYN96NChPmbMGH/ppZd848aN/uUvf9lra2u9trbWX375ZXd3f//99/2ss87ympoanzlzpg8bNszb2tpKsk/i8HcRiVKcTlJEliceSVeLvsBlSZ966inOOeccPve5zzFgwABee+01mpubWbNmDStWrGDDhg0cd9xxfPOb39z9mCOPPJKlS5dy3XXXcdlll/GHP/yBbdu2MWrUKK688srd99tvv/344Q9/SFNTE/feey8AH3/8MQceeCA33ngjAF//+te57rrrmDBhAuvWrePss89m9erV3HbbbUyYMIEf/OAH/PrXv2bOnDl5v1cRyU4Sp5GmJ9EvXhzMy9u6NTjhQAHObdnY2Mi1114LwJQpU2hsbGTHjh1ccsklVFRUMHToUM4444w9HlMfvubo0aP55z//Sf/+/enfvz/9+vVj8+bNfXr95557jlWrVu2+/Y9//IOPPvqIl156iSeeeAKAL37xixx66KH5vE0R6YMkdjWmJ9FnOnVYHol+06ZN/O53v2PlypWYGe3t7ZgZF110UY+zT/bff38APvOZz+z+ueP2zp07u3tYRrt27WLp0qV89rOf3et3mpEkItlKxTljgaC7prIy+LkApw5buHAh06ZNY+3atTQ3N/Pee+8xfPhwBgwYwIIFC2hvb6e1tZUXXngh59fo378/H330Ube36+rqdnfrQDB4C3Daaafx8MMPA/DMM8/w4Ycf5hxDlJI2RU0kqdKT6Ovrg+6ahoaCddtcdNFFe2z7yle+wt///ndGjBjB6NGj+fa3v83pp5+e82tMnDiRVatWUVNTw6OPPsqXvvQlnnzySWpqavj973/P7NmzaWpq4oQTTuC4447jZz/7GQC33HILL730EmPHjmXJkiUZS0gkQdKmqIkkVWxPPLJ69WqOPfbYiCKS7hTq76JKhyL5y7Z6ZXpa9JIoWg0rUjrpGYyVREniFDWRpFKil0gkcYqaSFKp60ZEJOWU6EVEUk6JXkQk5ZToe2Bm3HDDDbtv//jHP+61guVTTz21R9mCXPS17PDixYu5/fbbM77+gw8+yPr1GU/y1a3m5maOP/74Pj1GROJLib4H+++/P0888USfkm4hEn1f1dfXM2vWrIyvn0uiF5F0UaLvwT777MPMmTO566679vrd2rVrmTRpEieccAKTJk1i3bp1vPLKKyxevJjvfe971NTU8Ne//nWPx/zqV7/i85//PCeeeCJnnnkmGzZsAIK6OnV1dZx44olcccUVdCxia25u5phjjuFb3/oWxx9/PJdeeinPPfccp556KiNGjOBPf/oTECTzq666aq/Xv+OOO2hqauLSSy+lpqaGjz/+mGXLlnH66aczbtw4zj77bFrDyezLli1jzJgxjB8/nvvuu6+Yu1VESi2bWsbFvhSqHv3One6zZwfXhXDAAQf4li1b/KijjvLNmzf7nXfe6bfccou7u59//vn+4IMPurv73Llz/YILLnB39+nTp++uT9/VBx984Lt27XJ395///Od+/fXXu7v71Vdf7bfddpu7uz/99NMOeFtbm7/77rteUVHhr7/+ure3t/vYsWN9xowZvmvXLn/qqad2v+a8efO8oaEh4+uffvrp/uc//9nd3T/55BMfP368b9y40d3dFyxY4DNmzHB399GjR/uLL77o7u433nijjxo1KuN7UD16kfigHOvRd9ROGTQo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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x27c61c01cf8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"admitted = pd.DataFrame(data.loc[data['Admitted'].isin([1])])\n",
"not_admitted = pd.DataFrame(data.loc[data['Admitted'].isin([0])])\n",
"\n",
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(111)\n",
"ax1.scatter(admitted['Exam 1'],admitted['Exam 2'], s=10, c='r', label='Admitted', marker='o')\n",
"ax1.scatter(not_admitted['Exam 1'],not_admitted['Exam 2'], s=10, c='b', label = 'Not admitted', marker='^')\n",
"plt.legend(loc='lower left');\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice, Ok now we can see our data more clearly. It is possible to have a decision boundary between the two different classes we got.Next we are asked to implement the sigmoid function (activation). Let's implement it)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def sigmoid(z):\n",
" \"\"\"sigmoid function\"\"\"\n",
" return 1/(1+np.exp(-z))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's a nice warmup exercise, let's continue with the cost function and gradients."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def costfunction(theta, X, y):\n",
" hypo = sigmoid(theta * X)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def costfunction1(theta, X, y):\n",
" theta = np.matrix(theta)\n",
" X = np.matrix(X)\n",
" y = np.matrix(y)\n",
" hypo = X * theta.T# Hypothesis of the linear regression-> inserting to a sigmoid turns it to logistic regression\n",
" first = np.multiply(-y, np.log(sigmoid(hypo)))\n",
" second = np.multiply((1 - y), np.log(1 - sigmoid(hypo)))\n",
" cost = np.sum(first - second) / X.shape[0]\n",
" return cost"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's edit the data, seperating between target variable and our features"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"data.insert(0, 'Bias', 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"X = data.drop(['Admitted'], axis=1)\n",
"y =data.drop(['Bias', 'Exam 1', 'Exam 2'], axis=1) \n",
"theta = np.zeros(X.shape[1])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6931471805599453"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"costfunction1(theta, X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice, let's edit this and get the gradients."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def gradient(theta, X, y):\n",
" theta = np.matrix(theta)\n",
" X = np.matrix(X)\n",
" y = np.matrix(y)\n",
" #let's calculate gradients\n",
" hypo = X * theta.T\n",
" e = sigmoid(hypo) - y # calculating just one -avoiding redundancy\n",
" parameters = int(theta.ravel().shape[1])# looping through all theta\n",
" grads = np.zeros(theta.shape)\n",
" for j in range(parameters):\n",
" grads[0,j] = (np.sum(np.multiply(e, X[:,j]))) / X.shape[0]\n",
" \n",
" return grads"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ -0.1 , -12.00921659, -11.26284221]])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grads = gradient(theta, X, y)\n",
"grads"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, now we are going to use the optimization function from the scikit-learn module to minimize the cost function"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([-25.16131872, 0.20623159, 0.20147149]), 36, 0)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from scipy.optimize import minimize\n",
"import scipy.optimize as opt\n",
"#result =minimize(costfunction1, theta, args=(X, y), jac=gradient(theta, X, y))\n",
"result = opt.fmin_tnc(func=costfunction1, x0=theta, fprime=gradient, args=(X, y))\n",
"result\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.20349770158947425"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"costfunction1(result[0], X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our lowest cost (this is problem with a convex cost function so it has to be the lowest cost). Let's write the function predict."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def predict(theta, X):\n",
" predict = np.sum(sigmoid(X * theta.T))\n",
" return predict"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"prediction is: 0.776290625526598\n"
]
}
],
"source": [
"testing = np.matrix(np.array([1, 45, 85]))\n",
"prediction = predict(np.matrix(result[0]), testing)\n",
"print('prediction is:',(prediction))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, so according to the text instructions in 1.2.4 we got the right answer. Let's write the predict function with a threshold of 0.5>=."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"def predict1(theta, X):\n",
" X = np.matrix(X)\n",
" theta = np.matrix(theta)\n",
" predict = sigmoid(X * theta.T)\n",
" predict = predict >= 0.5\n",
" predict = predict.astype(int)\n",
" return predict"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"prediction = predict1(result[0], X)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, now we have our predictions, now let's compare them to the actual results we already have in the \"attended\" column in the original data."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"accuracy is: 89.0%\n"
]
}
],
"source": [
"accuracy = (np.sum(prediction == np.matrix(data['Admitted']).T)) / prediction.shape[0]\n",
"#np.matrix(data['Admitted']).T.shape, prediction.shape\n",
"print('accuracy is: ','{:.1%}'.format(accuracy))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, we got 89 percent, nice. Let's plot the decision bounday."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"final =result[0]\n",
"\n",
"plot_X = np.array([min(X.values[:, 2]-2), max(X.values[:, 2])+2])\n",
"plot_y = (-1/final[2]) * (final[1] * plot_X + final[0])"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x27c63358e80>]"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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3//+91et69OnD7/88gsNGzakadOm/OUvf6Fdu3bFPkaHDh1ITU0lMjKSpUuXcv/997Ny5crsi7GxsbEkJCQQERFBWFhY9gXdSZMmsWnTJlq0aMGaNWuoX7++S69VqZIsMDCQ0aNHs3v3bh544AHOnDnDmDFjaNWqFV999ZXV4bmFbbtA2L17N40bN7YoIpUX/VyUv1u9ejUjRoxg//79GGMYOnQof//736latarVoV3H57tAUEopK/To0YNdu3bx9NNPExAQwOzZswkNDSUuLs5nmzJroldKqWtUqFCBV155hcTERNq0acPhw4fp168fXbt25bvvvrM6vCLTRK+UUnlo2rQpmzZt4u2336Z69eqsXbuW8PBwJk+e7FMdpWmiV0qpfJQqVYpHH32UtLQ0Bg4cyIULF5g0aRIRERGsX7/e6vAKRRO9UkoVQq1atVi4cCEbNmwgNDSU//3vf3Tq1In+/ftf1RWKHWmiV0qpImjfvj3ffPMNL730EuXKlWPx4sU0atSIefPm2bajNE30+TDGMHbs2OzladOm8cILL+T7nI8++uiqbguKo6jdDq9atYpXXnkl1+MvXLiQgwdz7YUiT1kdrymlclemTBmeffZZUlJS6Nq1KydPnmTIkCHcddddJCcnWx3edTTR56Ns2bKsWLGiSEnXHYm+qHr27MmECRNyPX5xEr1SqnBuueUW/vOf/7B06VJuuOEGtm3bRosWLRg3bhxnzpwpeAdeook+H4GBgTz++ONMnz79ur/t37+fTp06ERERQadOnfjxxx/ZunUrq1atYty4cURGRvL9999f9Zz/+7//4/bbb6d58+Z07tyZw4cPA3l3O7xv3z5CQ0P585//THh4OA8//DCfffYZbdq0oWHDhtl37S1cuJARI0Zcd/xXX32VhIQEHn74YSIjIzl37hw7duygXbt2tGzZkq5du3LI2bftjh07aNasGdHR0cyaNcuTb6tSfsUYw4MPPkhaWhojRowgMzOTadOmERYWxqpVq6wOz6EwXVx6emrZsuV13W8Wpzvcy5dFYmMdc3eoUKGCnDp1Sm6++WY5efKkvPbaazJp0iQREenRo4csXLhQRETmz58vvXr1EhGRgQMHZndbfK1ff/1VMjMzRUTkrbfekjFjxohI3t0O7927VwICAiQ5OVkyMjKkRYsWMmjQIMnMzJSPPvoo+5g5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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x27c632c8550>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(111)\n",
"ax1.scatter(admitted['Exam 1'],admitted['Exam 2'], s=10, c='r', label='Admitted', marker='o')\n",
"ax1.scatter(not_admitted['Exam 1'],not_admitted['Exam 2'], s=10, c='b', label = 'Not admitted', marker='^')\n",
"plt.legend(loc='lower left');\n",
"\n",
"plt.plot(plot_X, plot_y, 'k-', lw=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that some of the samples are behind the black boundary line, that's why we have 0.89 accuracy, Perhaps a different classifier would be better for this task (SVM with flexible boundaries etc...)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Test 1</th>\n",
" <th>Test 2</th>\n",
" <th>Accepted</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.051267</td>\n",
" <td>0.699560</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-0.092742</td>\n",
" <td>0.684940</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.213710</td>\n",
" <td>0.692250</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-0.375000</td>\n",
" <td>0.502190</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.513250</td>\n",
" <td>0.465640</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-0.524770</td>\n",
" <td>0.209800</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-0.398040</td>\n",
" <td>0.034357</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>-0.305880</td>\n",
" <td>-0.192250</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.016705</td>\n",
" <td>-0.404240</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.131910</td>\n",
" <td>-0.513890</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.385370</td>\n",
" <td>-0.565060</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0.529380</td>\n",
" <td>-0.521200</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0.638820</td>\n",
" <td>-0.243420</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.736750</td>\n",
" <td>-0.184940</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>0.546660</td>\n",
" <td>0.487570</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>0.322000</td>\n",
" <td>0.582600</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0.166470</td>\n",
" <td>0.538740</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>-0.046659</td>\n",
" <td>0.816520</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>-0.173390</td>\n",
" <td>0.699560</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>-0.478690</td>\n",
" <td>0.633770</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>-0.605410</td>\n",
" <td>0.597220</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>-0.628460</td>\n",
" <td>0.334060</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>-0.593890</td>\n",
" <td>0.005117</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>-0.421080</td>\n",
" <td>-0.272660</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>-0.115780</td>\n",
" <td>-0.396930</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0.201040</td>\n",
" <td>-0.601610</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0.466010</td>\n",
" <td>-0.535820</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0.673390</td>\n",
" <td>-0.535820</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>-0.138820</td>\n",
" <td>0.546050</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>-0.294350</td>\n",
" <td>0.779970</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88</th>\n",
" <td>-0.403800</td>\n",
" <td>0.706870</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>89</th>\n",
" <td>-0.380760</td>\n",
" <td>0.918860</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>90</th>\n",
" <td>-0.507490</td>\n",
" <td>0.904240</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>91</th>\n",
" <td>-0.547810</td>\n",
" <td>0.706870</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>0.103110</td>\n",
" <td>0.779970</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>0.057028</td>\n",
" <td>0.918860</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>-0.104260</td>\n",
" <td>0.991960</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>-0.081221</td>\n",
" <td>1.108900</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>0.287440</td>\n",
" <td>1.087000</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>0.396890</td>\n",
" <td>0.823830</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>0.638820</td>\n",
" <td>0.889620</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>0.823160</td>\n",
" <td>0.663010</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>0.673390</td>\n",
" <td>0.641080</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>101</th>\n",
" <td>1.070900</td>\n",
" <td>0.100150</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td>-0.046659</td>\n",
" <td>-0.579680</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>-0.236750</td>\n",
" <td>-0.638160</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>104</th>\n",
" <td>-0.150350</td>\n",
" <td>-0.367690</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>105</th>\n",
" <td>-0.490210</td>\n",
" <td>-0.301900</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>106</th>\n",
" <td>-0.467170</td>\n",
" <td>-0.133770</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>107</th>\n",
" <td>-0.288590</td>\n",
" <td>-0.060673</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>108</th>\n",
" <td>-0.611180</td>\n",
" <td>-0.067982</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>109</th>\n",
" <td>-0.663020</td>\n",
" <td>-0.214180</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>110</th>\n",
" <td>-0.599650</td>\n",
" <td>-0.418860</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>111</th>\n",
" <td>-0.726380</td>\n",
" <td>-0.082602</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>112</th>\n",
" <td>-0.830070</td>\n",
" <td>0.312130</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>113</th>\n",
" <td>-0.720620</td>\n",
" <td>0.538740</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>114</th>\n",
" <td>-0.593890</td>\n",
" <td>0.494880</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>115</th>\n",
" <td>-0.484450</td>\n",
" <td>0.999270</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>116</th>\n",
" <td>-0.006336</td>\n",
" <td>0.999270</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>117</th>\n",
" <td>0.632650</td>\n",
" <td>-0.030612</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>118 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" Test 1 Test 2 Accepted\n",
"0 0.051267 0.699560 1\n",
"1 -0.092742 0.684940 1\n",
"2 -0.213710 0.692250 1\n",
"3 -0.375000 0.502190 1\n",
"4 -0.513250 0.465640 1\n",
"5 -0.524770 0.209800 1\n",
"6 -0.398040 0.034357 1\n",
"7 -0.305880 -0.192250 1\n",
"8 0.016705 -0.404240 1\n",
"9 0.131910 -0.513890 1\n",
"10 0.385370 -0.565060 1\n",
"11 0.529380 -0.521200 1\n",
"12 0.638820 -0.243420 1\n",
"13 0.736750 -0.184940 1\n",
"14 0.546660 0.487570 1\n",
"15 0.322000 0.582600 1\n",
"16 0.166470 0.538740 1\n",
"17 -0.046659 0.816520 1\n",
"18 -0.173390 0.699560 1\n",
"19 -0.478690 0.633770 1\n",
"20 -0.605410 0.597220 1\n",
"21 -0.628460 0.334060 1\n",
"22 -0.593890 0.005117 1\n",
"23 -0.421080 -0.272660 1\n",
"24 -0.115780 -0.396930 1\n",
"25 0.201040 -0.601610 1\n",
"26 0.466010 -0.535820 1\n",
"27 0.673390 -0.535820 1\n",
"28 -0.138820 0.546050 1\n",
"29 -0.294350 0.779970 1\n",
".. ... ... ...\n",
"88 -0.403800 0.706870 0\n",
"89 -0.380760 0.918860 0\n",
"90 -0.507490 0.904240 0\n",
"91 -0.547810 0.706870 0\n",
"92 0.103110 0.779970 0\n",
"93 0.057028 0.918860 0\n",
"94 -0.104260 0.991960 0\n",
"95 -0.081221 1.108900 0\n",
"96 0.287440 1.087000 0\n",
"97 0.396890 0.823830 0\n",
"98 0.638820 0.889620 0\n",
"99 0.823160 0.663010 0\n",
"100 0.673390 0.641080 0\n",
"101 1.070900 0.100150 0\n",
"102 -0.046659 -0.579680 0\n",
"103 -0.236750 -0.638160 0\n",
"104 -0.150350 -0.367690 0\n",
"105 -0.490210 -0.301900 0\n",
"106 -0.467170 -0.133770 0\n",
"107 -0.288590 -0.060673 0\n",
"108 -0.611180 -0.067982 0\n",
"109 -0.663020 -0.214180 0\n",
"110 -0.599650 -0.418860 0\n",
"111 -0.726380 -0.082602 0\n",
"112 -0.830070 0.312130 0\n",
"113 -0.720620 0.538740 0\n",
"114 -0.593890 0.494880 0\n",
"115 -0.484450 0.999270 0\n",
"116 -0.006336 0.999270 0\n",
"117 0.632650 -0.030612 0\n",
"\n",
"[118 rows x 3 columns]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = os.getcwd() + '/\\Exercise2\\ex2\\ex2data2.txt'\n",
"data2 = pd.read_csv(path, header=None, names=['Test 1', 'Test 2', 'Accepted'])\n",
"data2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's visualize the data like figure 3 in the pdf file."
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"passed = pd.DataFrame(data2.loc[data2['Accepted'].isin([1])])\n",
"failed = pd.DataFrame(data2.loc[data2['Accepted'].isin([0])])"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5,1,'Microchips accptence and failure dataset')"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x27c65076860>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(111)\n",
"ax1.scatter(passed['Test 1'],passed['Test 2'], s=10, c='r', label='Passed', marker='o')\n",
"ax1.scatter(failed['Test 1'],failed['Test 2'], s=10, c='b', label = 'Failed', marker='^')\n",
"plt.legend(loc='upper right');\n",
"plt.title('Microchips accptence and failure dataset')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, no linear boundary is possible in this case. Let's create polynomial features in order to fit the boundary better then the simple logistic regression which is basically a straight line."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (myenv)",
"language": "python",
"name": "myenv"
},
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment