diff --git a/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescent.ipynb b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescent.ipynb
new file mode 100644
index 0000000..080cd7a
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescent.ipynb
@@ -0,0 +1,244 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Implementing the Gradient Descent Algorithm\n",
+ "\n",
+ "In this lab, we'll implement the basic functions of the Gradient Descent algorithm to find the boundary in a small dataset. First, we'll start with some functions that will help us plot and visualize the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "#Some helper functions for plotting and drawing lines\n",
+ "\n",
+ "def plot_points(X, y):\n",
+ " admitted = X[np.argwhere(y==1)]\n",
+ " rejected = X[np.argwhere(y==0)]\n",
+ " plt.scatter([s[0][0] for s in rejected], [s[0][1] for s in rejected], s = 25, color = 'blue', edgecolor = 'k')\n",
+ " plt.scatter([s[0][0] for s in admitted], [s[0][1] for s in admitted], s = 25, color = 'red', edgecolor = 'k')\n",
+ "\n",
+ "def display(m, b, color='g--'):\n",
+ " plt.xlim(-0.05,1.05)\n",
+ " plt.ylim(-0.05,1.05)\n",
+ " x = np.arange(-10, 10, 0.1)\n",
+ " plt.plot(x, m*x+b, color)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Reading and plotting the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "data = pd.read_csv('data.csv', header=None)\n",
+ "X = np.array(data[[0,1]])\n",
+ "y = np.array(data[2])\n",
+ "plot_points(X,y)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## TODO: Implementing the basic functions\n",
+ "Here is your turn to shine. Implement the following formulas, as explained in the text.\n",
+ "- Sigmoid activation function\n",
+ "\n",
+ "$$\\sigma(x) = \\frac{1}{1+e^{-x}}$$\n",
+ "\n",
+ "- Output (prediction) formula\n",
+ "\n",
+ "$$\\hat{y} = \\sigma(w_1 x_1 + w_2 x_2 + b)$$\n",
+ "\n",
+ "- Error function\n",
+ "\n",
+ "$$Error(y, \\hat{y}) = - y \\log(\\hat{y}) - (1-y) \\log(1-\\hat{y})$$\n",
+ "\n",
+ "- The function that updates the weights\n",
+ "\n",
+ "$$ w_i \\longrightarrow w_i + \\alpha (y - \\hat{y}) x_i$$\n",
+ "\n",
+ "$$ b \\longrightarrow b + \\alpha (y - \\hat{y})$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Implement the following functions\n",
+ "\n",
+ "# Activation (sigmoid) function\n",
+ "def sigmoid(x):\n",
+ " pass\n",
+ "\n",
+ "# Output (prediction) formula\n",
+ "def output_formula(features, weights, bias):\n",
+ " pass\n",
+ "\n",
+ "# Error (log-loss) formula\n",
+ "def error_formula(y, output):\n",
+ " pass\n",
+ "\n",
+ "# Gradient descent step\n",
+ "def update_weights(x, y, weights, bias, learnrate):\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Training function\n",
+ "This function will help us iterate the gradient descent algorithm through all the data, for a number of epochs. It will also plot the data, and some of the boundary lines obtained as we run the algorithm."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "np.random.seed(44)\n",
+ "\n",
+ "epochs = 100\n",
+ "learnrate = 0.01\n",
+ "\n",
+ "def train(features, targets, epochs, learnrate, graph_lines=False):\n",
+ " \n",
+ " errors = []\n",
+ " n_records, n_features = features.shape\n",
+ " last_loss = None\n",
+ " weights = np.random.normal(scale=1 / n_features**.5, size=n_features)\n",
+ " bias = 0\n",
+ " for e in range(epochs):\n",
+ " del_w = np.zeros(weights.shape)\n",
+ " for x, y in zip(features, targets):\n",
+ " output = output_formula(x, weights, bias)\n",
+ " error = error_formula(y, output)\n",
+ " weights, bias = update_weights(x, y, weights, bias, learnrate)\n",
+ " \n",
+ " # Printing out the log-loss error on the training set\n",
+ " out = output_formula(features, weights, bias)\n",
+ " loss = np.mean(error_formula(targets, out))\n",
+ " errors.append(loss)\n",
+ " if e % (epochs / 10) == 0:\n",
+ " print(\"\\n========== Epoch\", e,\"==========\")\n",
+ " if last_loss and last_loss < loss:\n",
+ " print(\"Train loss: \", loss, \" WARNING - Loss Increasing\")\n",
+ " else:\n",
+ " print(\"Train loss: \", loss)\n",
+ " last_loss = loss\n",
+ " predictions = out > 0.5\n",
+ " accuracy = np.mean(predictions == targets)\n",
+ " print(\"Accuracy: \", accuracy)\n",
+ " if graph_lines and e % (epochs / 100) == 0:\n",
+ " display(-weights[0]/weights[1], -bias/weights[1])\n",
+ " \n",
+ "\n",
+ " # Plotting the solution boundary\n",
+ " plt.title(\"Solution boundary\")\n",
+ " display(-weights[0]/weights[1], -bias/weights[1], 'black')\n",
+ "\n",
+ " # Plotting the data\n",
+ " plot_points(features, targets)\n",
+ " plt.show()\n",
+ "\n",
+ " # Plotting the error\n",
+ " plt.title(\"Error Plot\")\n",
+ " plt.xlabel('Number of epochs')\n",
+ " plt.ylabel('Error')\n",
+ " plt.plot(errors)\n",
+ " plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Time to train the algorithm!\n",
+ "When we run the function, we'll obtain the following:\n",
+ "- 10 updates with the current training loss and accuracy\n",
+ "- A plot of the data and some of the boundary lines obtained. The final one is in black. Notice how the lines get closer and closer to the best fit, as we go through more epochs.\n",
+ "- A plot of the error function. Notice how it decreases as we go through more epochs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "train(X, y, epochs, learnrate, True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "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.6.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescentSolutions.ipynb b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescentSolutions.ipynb
new file mode 100644
index 0000000..ca2b2be
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/GradientDescentSolutions.ipynb
@@ -0,0 +1,59 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Solutions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ ":\n",
+ "# Activation (sigmoid) function\n",
+ "def sigmoid(x):\n",
+ " return 1 / (1 + np.exp(-x))\n",
+ "\n",
+ "def output_formula(features, weights, bias):\n",
+ " return sigmoid(np.dot(features, weights) + bias)\n",
+ "\n",
+ "def error_formula(y, output):\n",
+ " return - y*np.log(output) - (1 - y) * np.log(1-output)\n",
+ "\n",
+ "def update_weights(x, y, weights, bias, learnrate):\n",
+ " output = output_formula(x, weights, bias)\n",
+ " d_error = y - output\n",
+ " weights += learnrate * d_error * x\n",
+ " bias += learnrate * d_error\n",
+ " return weights, bias"
+ ]
+ }
+ ],
+ "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.6.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/data.csv b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/data.csv
new file mode 100644
index 0000000..c4324e9
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/data.csv
@@ -0,0 +1,100 @@
+0.78051,-0.063669,1
+0.28774,0.29139,1
+0.40714,0.17878,1
+0.2923,0.4217,1
+0.50922,0.35256,1
+0.27785,0.10802,1
+0.27527,0.33223,1
+0.43999,0.31245,1
+0.33557,0.42984,1
+0.23448,0.24986,1
+0.0084492,0.13658,1
+0.12419,0.33595,1
+0.25644,0.42624,1
+0.4591,0.40426,1
+0.44547,0.45117,1
+0.42218,0.20118,1
+0.49563,0.21445,1
+0.30848,0.24306,1
+0.39707,0.44438,1
+0.32945,0.39217,1
+0.40739,0.40271,1
+0.3106,0.50702,1
+0.49638,0.45384,1
+0.10073,0.32053,1
+0.69907,0.37307,1
+0.29767,0.69648,1
+0.15099,0.57341,1
+0.16427,0.27759,1
+0.33259,0.055964,1
+0.53741,0.28637,1
+0.19503,0.36879,1
+0.40278,0.035148,1
+0.21296,0.55169,1
+0.48447,0.56991,1
+0.25476,0.34596,1
+0.21726,0.28641,1
+0.67078,0.46538,1
+0.3815,0.4622,1
+0.53838,0.32774,1
+0.4849,0.26071,1
+0.37095,0.38809,1
+0.54527,0.63911,1
+0.32149,0.12007,1
+0.42216,0.61666,1
+0.10194,0.060408,1
+0.15254,0.2168,1
+0.45558,0.43769,1
+0.28488,0.52142,1
+0.27633,0.21264,1
+0.39748,0.31902,1
+0.5533,1,0
+0.44274,0.59205,0
+0.85176,0.6612,0
+0.60436,0.86605,0
+0.68243,0.48301,0
+1,0.76815,0
+0.72989,0.8107,0
+0.67377,0.77975,0
+0.78761,0.58177,0
+0.71442,0.7668,0
+0.49379,0.54226,0
+0.78974,0.74233,0
+0.67905,0.60921,0
+0.6642,0.72519,0
+0.79396,0.56789,0
+0.70758,0.76022,0
+0.59421,0.61857,0
+0.49364,0.56224,0
+0.77707,0.35025,0
+0.79785,0.76921,0
+0.70876,0.96764,0
+0.69176,0.60865,0
+0.66408,0.92075,0
+0.65973,0.66666,0
+0.64574,0.56845,0
+0.89639,0.7085,0
+0.85476,0.63167,0
+0.62091,0.80424,0
+0.79057,0.56108,0
+0.58935,0.71582,0
+0.56846,0.7406,0
+0.65912,0.71548,0
+0.70938,0.74041,0
+0.59154,0.62927,0
+0.45829,0.4641,0
+0.79982,0.74847,0
+0.60974,0.54757,0
+0.68127,0.86985,0
+0.76694,0.64736,0
+0.69048,0.83058,0
+0.68122,0.96541,0
+0.73229,0.64245,0
+0.76145,0.60138,0
+0.58985,0.86955,0
+0.73145,0.74516,0
+0.77029,0.7014,0
+0.73156,0.71782,0
+0.44556,0.57991,0
+0.85275,0.85987,0
+0.51912,0.62359,0
diff --git a/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/gradient_descent.py b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/gradient_descent.py
new file mode 100644
index 0000000..882ba3e
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Gradient Descent/gradient_descent.py
@@ -0,0 +1,122 @@
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+
+
+# Some helper functions for plotting and drawing lines
+
+def plot_points(X, y):
+ admitted = X[np.argwhere(y == 1)]
+ rejected = X[np.argwhere(y == 0)]
+ plt.scatter([s[0][0] for s in rejected],
+ [s[0][1] for s in rejected], s=25,
+ color='blue', edgecolor='k')
+ plt.scatter([s[0][0] for s in admitted],
+ [s[0][1] for s in admitted],
+ s=25, color='red', edgecolor='k')
+
+
+def display(m, b, color='g--'):
+ plt.xlim(-0.05, 1.05)
+ plt.ylim(-0.05, 1.05)
+ x = np.arange(-10, 10, 0.1)
+ plt.plot(x, m * x + b, color)
+
+
+data = pd.read_csv('data.csv', header=None)
+X = np.array(data[[0, 1]])
+y = np.array(data[2])
+plot_points(X, y)
+plt.show()
+
+
+# Implement the following functions
+
+# Activation (sigmoid) function
+def sigmoid(x):
+ return 1 / (1 + np.exp(-x))
+
+# Output (prediction) formula
+
+
+def output_formula(features, weights, bias):
+ return sigmoid(np.dot(features, weights) + bias)
+
+# Error (log-loss) formula
+
+
+def error_formula(y, output):
+ return -y * np.log(output) - (1 - y) * np.log(1 - output)
+
+# Gradient descent step
+
+
+def update_weights(x, y, weights, bias, learnrate):
+ output = output_formula(x, weights, bias)
+ d_error = y - output
+ weights += learnrate * d_error * x
+ bias += learnrate * d_error
+ return weights, bias
+
+
+"""
+Training function
+This function will help us iterate the gradient descent algorithm through all
+the data, for a number of epochs. It will also plot the data, and some of the
+boundary lines obtained as we run the algorithm.
+"""
+
+np.random.seed(44)
+
+epochs = 100
+learnrate = 0.01
+
+
+def train(features, targets, epochs, learnrate, graph_lines=False):
+
+ errors = []
+ n_records, n_features = features.shape
+ last_loss = None
+ weights = np.random.normal(scale=1 / n_features**.5, size=n_features)
+ bias = 0
+ for e in range(epochs):
+ del_w = np.zeros(weights.shape)
+ for x, y in zip(features, targets):
+ output = output_formula(x, weights, bias)
+ error = error_formula(y, output)
+ weights, bias = update_weights(x, y, weights, bias, learnrate)
+
+ # Printing out the log-loss error on the training set
+ out = output_formula(features, weights, bias)
+ loss = np.mean(error_formula(targets, out))
+ errors.append(loss)
+ if e % (epochs / 10) == 0:
+ print("\n========== Epoch", e, "==========")
+ if last_loss and last_loss < loss:
+ print("Train loss: ", loss, " WARNING - Loss Increasing")
+ else:
+ print("Train loss: ", loss)
+ last_loss = loss
+ predictions = out > 0.5
+ accuracy = np.mean(predictions == targets)
+ print("Accuracy: ", accuracy)
+ if graph_lines and e % (epochs / 100) == 0:
+ display(-weights[0] / weights[1], -bias / weights[1])
+
+ # Plotting the solution boundary
+ plt.title("Solution boundary")
+ display(-weights[0] / weights[1], -bias / weights[1], 'black')
+
+ # Plotting the data
+ plot_points(features, targets)
+ plt.show()
+
+ # Plotting the error
+ plt.title("Error Plot")
+ plt.xlabel('Number of epochs')
+ plt.ylabel('Error')
+ plt.plot(errors)
+ plt.show()
+
+
+train(X, y, epochs, learnrate, True)
diff --git a/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/data.csv b/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/data.csv
new file mode 100644
index 0000000..c4324e9
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/data.csv
@@ -0,0 +1,100 @@
+0.78051,-0.063669,1
+0.28774,0.29139,1
+0.40714,0.17878,1
+0.2923,0.4217,1
+0.50922,0.35256,1
+0.27785,0.10802,1
+0.27527,0.33223,1
+0.43999,0.31245,1
+0.33557,0.42984,1
+0.23448,0.24986,1
+0.0084492,0.13658,1
+0.12419,0.33595,1
+0.25644,0.42624,1
+0.4591,0.40426,1
+0.44547,0.45117,1
+0.42218,0.20118,1
+0.49563,0.21445,1
+0.30848,0.24306,1
+0.39707,0.44438,1
+0.32945,0.39217,1
+0.40739,0.40271,1
+0.3106,0.50702,1
+0.49638,0.45384,1
+0.10073,0.32053,1
+0.69907,0.37307,1
+0.29767,0.69648,1
+0.15099,0.57341,1
+0.16427,0.27759,1
+0.33259,0.055964,1
+0.53741,0.28637,1
+0.19503,0.36879,1
+0.40278,0.035148,1
+0.21296,0.55169,1
+0.48447,0.56991,1
+0.25476,0.34596,1
+0.21726,0.28641,1
+0.67078,0.46538,1
+0.3815,0.4622,1
+0.53838,0.32774,1
+0.4849,0.26071,1
+0.37095,0.38809,1
+0.54527,0.63911,1
+0.32149,0.12007,1
+0.42216,0.61666,1
+0.10194,0.060408,1
+0.15254,0.2168,1
+0.45558,0.43769,1
+0.28488,0.52142,1
+0.27633,0.21264,1
+0.39748,0.31902,1
+0.5533,1,0
+0.44274,0.59205,0
+0.85176,0.6612,0
+0.60436,0.86605,0
+0.68243,0.48301,0
+1,0.76815,0
+0.72989,0.8107,0
+0.67377,0.77975,0
+0.78761,0.58177,0
+0.71442,0.7668,0
+0.49379,0.54226,0
+0.78974,0.74233,0
+0.67905,0.60921,0
+0.6642,0.72519,0
+0.79396,0.56789,0
+0.70758,0.76022,0
+0.59421,0.61857,0
+0.49364,0.56224,0
+0.77707,0.35025,0
+0.79785,0.76921,0
+0.70876,0.96764,0
+0.69176,0.60865,0
+0.66408,0.92075,0
+0.65973,0.66666,0
+0.64574,0.56845,0
+0.89639,0.7085,0
+0.85476,0.63167,0
+0.62091,0.80424,0
+0.79057,0.56108,0
+0.58935,0.71582,0
+0.56846,0.7406,0
+0.65912,0.71548,0
+0.70938,0.74041,0
+0.59154,0.62927,0
+0.45829,0.4641,0
+0.79982,0.74847,0
+0.60974,0.54757,0
+0.68127,0.86985,0
+0.76694,0.64736,0
+0.69048,0.83058,0
+0.68122,0.96541,0
+0.73229,0.64245,0
+0.76145,0.60138,0
+0.58985,0.86955,0
+0.73145,0.74516,0
+0.77029,0.7014,0
+0.73156,0.71782,0
+0.44556,0.57991,0
+0.85275,0.85987,0
+0.51912,0.62359,0
diff --git a/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/perceptron.py b/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/perceptron.py
new file mode 100644
index 0000000..b5c50f2
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Perceptron Algorithm/perceptron.py
@@ -0,0 +1,54 @@
+import numpy as np
+# Setting the random seed, feel free to change it and see different solutions.
+np.random.seed(42)
+
+
+def stepFunction(t):
+ if t >= 0:
+ return 1
+ return 0
+
+
+def prediction(X, W, b):
+ return stepFunction((np.matmul(X, W) + b)[0])
+
+# TODO: Fill in the code below to implement the perceptron trick.
+# The function should receive as inputs the data X, the labels y,
+# the weights W (as an array), and the bias b,
+# update the weights and bias W, b, according to the perceptron algorithm,
+# and return W and b.
+
+
+def perceptronStep(X, y, W, b, learn_rate=0.01):
+ for i in range(len(X)):
+ y_hat = prediction(X[i], W, b)
+ if y[i] - y_hat == 1:
+ W[0] += X[i][0] * learn_rate
+ W[1] += X[i][1] * learn_rate
+ b += learn_rate
+ elif y[i] - y_hat == -1:
+ W[0] -= X[i][0] * learn_rate
+ W[1] -= X[i][1] * learn_rate
+ b -= learn_rate
+ return W, b
+
+
+# This function runs the perceptron algorithm repeatedly on the dataset,
+# and returns a few of the boundary lines obtained in the iterations,
+# for plotting purposes.
+# Feel free to play with the learning rate and the num_epochs,
+# and see your results plotted below.
+
+
+def trainPerceptronAlgorithm(X, y, learn_rate=0.01, num_epochs=25):
+ x_min, x_max = min(X.T[0]), max(X.T[0])
+ y_min, y_max = min(X.T[1]), max(X.T[1])
+ W = np.array(np.random.rand(2, 1))
+ b = np.random.rand(1)[0] + x_max
+ # These are the solution lines that get plotted below.
+ boundary_lines = []
+ for i in range(num_epochs):
+ # In each epoch, we apply the perceptron step.
+ W, b = perceptronStep(X, y, W, b, learn_rate)
+ boundary_lines.append((-W[0] / W[1], -b / W[1]))
+ return boundary_lines
diff --git a/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_and.py b/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_and.py
new file mode 100644
index 0000000..e76247f
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_and.py
@@ -0,0 +1,32 @@
+import pandas as pd
+
+# TODO: Set weight1, weight2, and bias
+weight1 = 1.0
+weight2 = 1.0
+bias = -1.25
+
+
+# DON'T CHANGE ANYTHING BELOW
+# Inputs and outputs
+test_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
+correct_outputs = [False, False, False, True]
+outputs = []
+
+# Generate and check output
+for test_input, correct_output in zip(test_inputs, correct_outputs):
+ linear_combination = weight1 * \
+ test_input[0] + weight2 * test_input[1] + bias
+ output = int(linear_combination >= 0)
+ is_correct_string = 'Yes' if output == correct_output else 'No'
+ outputs.append([test_input[0], test_input[1],
+ linear_combination, output, is_correct_string])
+
+# Print output
+num_wrong = len([output[4] for output in outputs if output[4] == 'No'])
+output_frame = pd.DataFrame(outputs, columns=[
+ 'Input 1', ' Input 2', ' Linear Combination', ' Activation Output', ' Is Correct'])
+if not num_wrong:
+ print('Nice! You got it all correct.\n')
+else:
+ print('You got {} wrong. Keep trying!\n'.format(num_wrong))
+print(output_frame.to_string(index=False))
diff --git a/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_not.py b/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_not.py
new file mode 100644
index 0000000..4f4ea6e
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Perceptrons as Logical Operators/perceptron_not.py
@@ -0,0 +1,29 @@
+import pandas as pd
+
+# TODO: Set weight1, weight2, and bias
+weight1 = 0
+weight2 = -1
+bias = 0.5
+
+
+# DON'T CHANGE ANYTHING BELOW
+# Inputs and outputs
+test_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
+correct_outputs = [True, False, True, False]
+outputs = []
+
+# Generate and check output
+for test_input, correct_output in zip(test_inputs, correct_outputs):
+ linear_combination = weight1 * test_input[0] + weight2 * test_input[1] + bias
+ output = int(linear_combination >= 0)
+ is_correct_string = 'Yes' if output == correct_output else 'No'
+ outputs.append([test_input[0], test_input[1], linear_combination, output, is_correct_string])
+
+# Print output
+num_wrong = len([output[4] for output in outputs if output[4] == 'No'])
+output_frame = pd.DataFrame(outputs, columns=['Input 1', ' Input 2', ' Linear Combination', ' Activation Output', ' Is Correct'])
+if not num_wrong:
+ print('Nice! You got it all correct.\n')
+else:
+ print('You got {} wrong. Keep trying!\n'.format(num_wrong))
+print(output_frame.to_string(index=False))
diff --git a/python/Deep Learning/Introduction to Neural Networks/Softmax/cross_entropy.py b/python/Deep Learning/Introduction to Neural Networks/Softmax/cross_entropy.py
new file mode 100644
index 0000000..916f517
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Softmax/cross_entropy.py
@@ -0,0 +1,10 @@
+import numpy as np
+
+# Write a function that takes as input two lists Y, P,
+# and returns the float corresponding to their cross-entropy.
+
+
+def cross_entropy(Y, P):
+ Y = np.float_(Y)
+ P = np.float_(P)
+ return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P))
diff --git a/python/Deep Learning/Introduction to Neural Networks/Softmax/softmax.py b/python/Deep Learning/Introduction to Neural Networks/Softmax/softmax.py
new file mode 100644
index 0000000..979abf7
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Softmax/softmax.py
@@ -0,0 +1,18 @@
+import numpy as np
+
+# Write a function that takes as input a list of numbers, and returns
+# the list of values given by the softmax function.
+
+
+def softmax(L):
+ expL = np.exp(L)
+ sumExpL = sum(expL)
+ result = []
+ for i in expL:
+ result.append(i * 1.0 / sumExpL)
+ return result
+
+ # Note: The function np.divide can also be used here, as follows:
+ # def softmax(L):
+ # expL = np.exp(L)
+ # return np.divide (expL, expL.sum())
diff --git a/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissions.ipynb b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissions.ipynb
new file mode 100644
index 0000000..bbb7fb3
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissions.ipynb
@@ -0,0 +1,947 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Predicting Student Admissions with Neural Networks\n",
+ "In this notebook, we predict student admissions to graduate school at UCLA based on three pieces of data:\n",
+ "- GRE Scores (Test)\n",
+ "- GPA Scores (Grades)\n",
+ "- Class rank (1-4)\n",
+ "\n",
+ "The dataset originally came from here: http://www.ats.ucla.edu/\n",
+ "\n",
+ "## Loading the data\n",
+ "To load the data and format it nicely, we will use two very useful packages called Pandas and Numpy. You can read on the documentation here:\n",
+ "- https://pandas.pydata.org/pandas-docs/stable/\n",
+ "- https://docs.scipy.org/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " admit | \n",
+ " gre | \n",
+ " gpa | \n",
+ " rank | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 380 | \n",
+ " 3.61 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 660 | \n",
+ " 3.67 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " 800 | \n",
+ " 4.00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1 | \n",
+ " 640 | \n",
+ " 3.19 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 520 | \n",
+ " 2.93 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1 | \n",
+ " 760 | \n",
+ " 3.00 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1 | \n",
+ " 560 | \n",
+ " 2.98 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 0 | \n",
+ " 400 | \n",
+ " 3.08 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1 | \n",
+ " 540 | \n",
+ " 3.39 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 0 | \n",
+ " 700 | \n",
+ " 3.92 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " admit gre gpa rank\n",
+ "0 0 380 3.61 3\n",
+ "1 1 660 3.67 3\n",
+ "2 1 800 4.00 1\n",
+ "3 1 640 3.19 4\n",
+ "4 0 520 2.93 4\n",
+ "5 1 760 3.00 2\n",
+ "6 1 560 2.98 1\n",
+ "7 0 400 3.08 2\n",
+ "8 1 540 3.39 3\n",
+ "9 0 700 3.92 2"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Importing pandas and numpy\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "# Reading the csv file into a pandas DataFrame\n",
+ "data = pd.read_csv('student_data.csv')\n",
+ "\n",
+ "# Printing out the first 10 rows of our data\n",
+ "data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Plotting the data\n",
+ "\n",
+ "First let's make a plot of our data to see how it looks. In order to have a 2D plot, let's ingore the rank."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Importing matplotlib\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "# Function to help us plot\n",
+ "def plot_points(data):\n",
+ " X = np.array(data[[\"gre\",\"gpa\"]])\n",
+ " y = np.array(data[\"admit\"])\n",
+ " admitted = X[np.argwhere(y==1)]\n",
+ " rejected = X[np.argwhere(y==0)]\n",
+ " plt.scatter([s[0][0] for s in rejected], [s[0][1] for s in rejected], s = 25, color = 'red', edgecolor = 'k')\n",
+ " plt.scatter([s[0][0] for s in admitted], [s[0][1] for s in admitted], s = 25, color = 'cyan', edgecolor = 'k')\n",
+ " plt.xlabel('Test (GRE)')\n",
+ " plt.ylabel('Grades (GPA)')\n",
+ " \n",
+ "# Plotting the points\n",
+ "plot_points(data)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Roughly, it looks like the students with high scores in the grades and test passed, while the ones with low scores didn't, but the data is not as nicely separable as we hoped it would. Maybe it would help to take the rank into account? Let's make 4 plots, each one for each rank."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Separating the ranks\n",
+ "data_rank1 = data[data[\"rank\"]==1]\n",
+ "data_rank2 = data[data[\"rank\"]==2]\n",
+ "data_rank3 = data[data[\"rank\"]==3]\n",
+ "data_rank4 = data[data[\"rank\"]==4]\n",
+ "\n",
+ "# Plotting the graphs\n",
+ "plot_points(data_rank1)\n",
+ "plt.title(\"Rank 1\")\n",
+ "plt.show()\n",
+ "plot_points(data_rank2)\n",
+ "plt.title(\"Rank 2\")\n",
+ "plt.show()\n",
+ "plot_points(data_rank3)\n",
+ "plt.title(\"Rank 3\")\n",
+ "plt.show()\n",
+ "plot_points(data_rank4)\n",
+ "plt.title(\"Rank 4\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This looks more promising, as it seems that the lower the rank, the higher the acceptance rate. Let's use the rank as one of our inputs. In order to do this, we should one-hot encode it.\n",
+ "\n",
+ "## TODO: One-hot encoding the rank\n",
+ "Use the `get_dummies` function in Pandas in order to one-hot encode the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " admit | \n",
+ " gre | \n",
+ " gpa | \n",
+ " rank_1 | \n",
+ " rank_2 | \n",
+ " rank_3 | \n",
+ " rank_4 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 380 | \n",
+ " 3.61 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 660 | \n",
+ " 3.67 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " 800 | \n",
+ " 4.00 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1 | \n",
+ " 640 | \n",
+ " 3.19 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 520 | \n",
+ " 2.93 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1 | \n",
+ " 760 | \n",
+ " 3.00 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1 | \n",
+ " 560 | \n",
+ " 2.98 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 0 | \n",
+ " 400 | \n",
+ " 3.08 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1 | \n",
+ " 540 | \n",
+ " 3.39 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 0 | \n",
+ " 700 | \n",
+ " 3.92 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " admit gre gpa rank_1 rank_2 rank_3 rank_4\n",
+ "0 0 380 3.61 0 0 1 0\n",
+ "1 1 660 3.67 0 0 1 0\n",
+ "2 1 800 4.00 1 0 0 0\n",
+ "3 1 640 3.19 0 0 0 1\n",
+ "4 0 520 2.93 0 0 0 1\n",
+ "5 1 760 3.00 0 1 0 0\n",
+ "6 1 560 2.98 1 0 0 0\n",
+ "7 0 400 3.08 0 1 0 0\n",
+ "8 1 540 3.39 0 0 1 0\n",
+ "9 0 700 3.92 0 1 0 0"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# TODO: Make dummy variables for rank\n",
+ "one_hot_data = pd.concat([data, pd.get_dummies(data['rank'], prefix='rank')], axis=1)\n",
+ "\n",
+ "# TODO: Drop the previous rank column\n",
+ "one_hot_data = one_hot_data.drop('rank', axis=1)\n",
+ "\n",
+ "# Print the first 10 rows of our data\n",
+ "one_hot_data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## TODO: Scaling the data\n",
+ "The next step is to scale the data. We notice that the range for grades is 1.0-4.0, whereas the range for test scores is roughly 200-800, which is much larger. This means our data is skewed, and that makes it hard for a neural network to handle. Let's fit our two features into a range of 0-1, by dividing the grades by 4.0, and the test score by 800."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " admit | \n",
+ " gre | \n",
+ " gpa | \n",
+ " rank_1 | \n",
+ " rank_2 | \n",
+ " rank_3 | \n",
+ " rank_4 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 0.475 | \n",
+ " 0.9025 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 0.825 | \n",
+ " 0.9175 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " 1.000 | \n",
+ " 1.0000 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1 | \n",
+ " 0.800 | \n",
+ " 0.7975 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 0.650 | \n",
+ " 0.7325 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1 | \n",
+ " 0.950 | \n",
+ " 0.7500 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1 | \n",
+ " 0.700 | \n",
+ " 0.7450 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 0 | \n",
+ " 0.500 | \n",
+ " 0.7700 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1 | \n",
+ " 0.675 | \n",
+ " 0.8475 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 0 | \n",
+ " 0.875 | \n",
+ " 0.9800 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " admit gre gpa rank_1 rank_2 rank_3 rank_4\n",
+ "0 0 0.475 0.9025 0 0 1 0\n",
+ "1 1 0.825 0.9175 0 0 1 0\n",
+ "2 1 1.000 1.0000 1 0 0 0\n",
+ "3 1 0.800 0.7975 0 0 0 1\n",
+ "4 0 0.650 0.7325 0 0 0 1\n",
+ "5 1 0.950 0.7500 0 1 0 0\n",
+ "6 1 0.700 0.7450 1 0 0 0\n",
+ "7 0 0.500 0.7700 0 1 0 0\n",
+ "8 1 0.675 0.8475 0 0 1 0\n",
+ "9 0 0.875 0.9800 0 1 0 0"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Making a copy of our data\n",
+ "processed_data = one_hot_data[:]\n",
+ "\n",
+ "# TODO: Scale the columns\n",
+ "processed_data['gre'] = processed_data['gre']/800\n",
+ "processed_data['gpa'] = processed_data['gpa']/4.0\n",
+ "processed_data[:10]\n",
+ "\n",
+ "# Printing the first 10 rows of our procesed data\n",
+ "processed_data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Splitting the data into Training and Testing"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In order to test our algorithm, we'll split the data into a Training and a Testing set. The size of the testing set will be 10% of the total data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of training samples is 360\n",
+ "Number of testing samples is 40\n",
+ " admit gre gpa rank_1 rank_2 rank_3 rank_4\n",
+ "16 0 0.975 0.9675 0 0 0 1\n",
+ "97 0 0.600 0.8925 0 1 0 0\n",
+ "361 1 0.675 0.8725 1 0 0 0\n",
+ "315 1 0.375 0.7100 0 1 0 0\n",
+ "215 1 0.825 0.7275 0 0 1 0\n",
+ "109 0 0.600 0.8625 0 1 0 0\n",
+ "199 0 0.725 0.9425 0 0 0 1\n",
+ "197 1 0.500 0.8075 0 0 0 1\n",
+ "354 1 0.675 0.9450 0 1 0 0\n",
+ "84 1 0.625 0.9000 0 0 1 0\n",
+ " admit gre gpa rank_1 rank_2 rank_3 rank_4\n",
+ "10 0 1.000 1.0000 0 0 0 1\n",
+ "11 0 0.550 0.8050 1 0 0 0\n",
+ "13 0 0.875 0.7700 0 1 0 0\n",
+ "28 1 0.975 0.8050 0 1 0 0\n",
+ "34 0 0.450 0.7850 1 0 0 0\n",
+ "50 0 0.800 0.9650 0 0 1 0\n",
+ "54 0 0.825 0.8350 0 0 1 0\n",
+ "63 1 0.850 0.9625 0 0 1 0\n",
+ "65 0 0.750 0.8975 0 1 0 0\n",
+ "66 0 0.925 0.9050 0 0 0 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "sample = np.random.choice(processed_data.index, size=int(len(processed_data)*0.9), replace=False)\n",
+ "train_data, test_data = processed_data.iloc[sample], processed_data.drop(sample)\n",
+ "\n",
+ "print(\"Number of training samples is\", len(train_data))\n",
+ "print(\"Number of testing samples is\", len(test_data))\n",
+ "print(train_data[:10])\n",
+ "print(test_data[:10])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Splitting the data into features and targets (labels)\n",
+ "Now, as a final step before the training, we'll split the data into features (X) and targets (y)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " gre gpa rank_1 rank_2 rank_3 rank_4\n",
+ "16 0.975 0.9675 0 0 0 1\n",
+ "97 0.600 0.8925 0 1 0 0\n",
+ "361 0.675 0.8725 1 0 0 0\n",
+ "315 0.375 0.7100 0 1 0 0\n",
+ "215 0.825 0.7275 0 0 1 0\n",
+ "109 0.600 0.8625 0 1 0 0\n",
+ "199 0.725 0.9425 0 0 0 1\n",
+ "197 0.500 0.8075 0 0 0 1\n",
+ "354 0.675 0.9450 0 1 0 0\n",
+ "84 0.625 0.9000 0 0 1 0\n",
+ "16 0\n",
+ "97 0\n",
+ "361 1\n",
+ "315 1\n",
+ "215 1\n",
+ "109 0\n",
+ "199 0\n",
+ "197 1\n",
+ "354 1\n",
+ "84 1\n",
+ "Name: admit, dtype: int64\n"
+ ]
+ }
+ ],
+ "source": [
+ "features = train_data.drop('admit', axis=1)\n",
+ "targets = train_data['admit']\n",
+ "features_test = test_data.drop('admit', axis=1)\n",
+ "targets_test = test_data['admit']\n",
+ "\n",
+ "print(features[:10])\n",
+ "print(targets[:10])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Training the 2-layer Neural Network\n",
+ "The following function trains the 2-layer neural network. First, we'll write some helper functions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Activation (sigmoid) function\n",
+ "def sigmoid(x):\n",
+ " return 1 / (1 + np.exp(-x))\n",
+ "def sigmoid_prime(x):\n",
+ " return sigmoid(x) * (1-sigmoid(x))\n",
+ "def error_formula(y, output):\n",
+ " return - y*np.log(output) - (1 - y) * np.log(1-output)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# TODO: Backpropagate the error\n",
+ "Now it's your turn to shine. Write the error term. Remember that this is given by the equation $$ (y-\\hat{y}) \\sigma'(x) $$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# TODO: Write the error term formula\n",
+ "def error_term_formula(x, y, output):\n",
+ " return (y - output) * sigmoid_prime(x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch: 0\n",
+ "Train loss: 0.274675763534\n",
+ "=========\n",
+ "Epoch: 100\n",
+ "Train loss: 0.211541227151\n",
+ "=========\n",
+ "Epoch: 200\n",
+ "Train loss: 0.209108941338\n",
+ "=========\n",
+ "Epoch: 300\n",
+ "Train loss: 0.207892062032\n",
+ "=========\n",
+ "Epoch: 400\n",
+ "Train loss: 0.207253836282\n",
+ "=========\n",
+ "Epoch: 500\n",
+ "Train loss: 0.206889105737\n",
+ "=========\n",
+ "Epoch: 600\n",
+ "Train loss: 0.206656034976\n",
+ "=========\n",
+ "Epoch: 700\n",
+ "Train loss: 0.206488123278\n",
+ "=========\n",
+ "Epoch: 800\n",
+ "Train loss: 0.206353568323\n",
+ "=========\n",
+ "Epoch: 900\n",
+ "Train loss: 0.206236831468\n",
+ "=========\n",
+ "Finished training!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Neural Network hyperparameters\n",
+ "epochs = 1000\n",
+ "learnrate = 0.5\n",
+ "\n",
+ "# Training function\n",
+ "def train_nn(features, targets, epochs, learnrate):\n",
+ " \n",
+ " # Use to same seed to make debugging easier\n",
+ " np.random.seed(42)\n",
+ "\n",
+ " n_records, n_features = features.shape\n",
+ " last_loss = None\n",
+ "\n",
+ " # Initialize weights\n",
+ " weights = np.random.normal(scale=1 / n_features**.5, size=n_features)\n",
+ "\n",
+ " for e in range(epochs):\n",
+ " del_w = np.zeros(weights.shape)\n",
+ " for x, y in zip(features.values, targets):\n",
+ " # Loop through all records, x is the input, y is the target\n",
+ "\n",
+ " # Activation of the output unit\n",
+ " # Notice we multiply the inputs and the weights here \n",
+ " # rather than storing h as a separate variable \n",
+ " output = sigmoid(np.dot(x, weights))\n",
+ "\n",
+ " # The error, the target minus the network output\n",
+ " error = error_formula(y, output)\n",
+ "\n",
+ " # The error term\n",
+ " error_term = error_term_formula(x, y, output)\n",
+ "\n",
+ " # The gradient descent step, the error times the gradient times the inputs\n",
+ " del_w += error_term * x\n",
+ "\n",
+ " # Update the weights here. The learning rate times the \n",
+ " # change in weights, divided by the number of records to average\n",
+ " weights += learnrate * del_w / n_records\n",
+ "\n",
+ " # Printing out the mean square error on the training set\n",
+ " if e % (epochs / 10) == 0:\n",
+ " out = sigmoid(np.dot(features, weights))\n",
+ " loss = np.mean((out - targets) ** 2)\n",
+ " print(\"Epoch:\", e)\n",
+ " if last_loss and last_loss < loss:\n",
+ " print(\"Train loss: \", loss, \" WARNING - Loss Increasing\")\n",
+ " else:\n",
+ " print(\"Train loss: \", loss)\n",
+ " last_loss = loss\n",
+ " print(\"=========\")\n",
+ " print(\"Finished training!\")\n",
+ " return weights\n",
+ " \n",
+ "weights = train_nn(features, targets, epochs, learnrate)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Calculating the Accuracy on the Test Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Prediction accuracy: 0.700\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Calculate accuracy on test data\n",
+ "test_out = sigmoid(np.dot(features_test, weights))\n",
+ "predictions = test_out > 0.5\n",
+ "accuracy = np.mean(predictions == targets_test)\n",
+ "print(\"Prediction accuracy: {:.3f}\".format(accuracy))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissionsSolutions.ipynb b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissionsSolutions.ipynb
new file mode 100644
index 0000000..3cfbfbf
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/StudentAdmissionsSolutions.ipynb
@@ -0,0 +1,115 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### One-hot encoding the rank"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Make dummy variables for rank\n",
+ "one_hot_data = pd.concat([data, pd.get_dummies(data['rank'], prefix='rank')], axis=1)\n",
+ "\n",
+ "# Drop the previous rank column\n",
+ "one_hot_data = one_hot_data.drop('rank', axis=1)\n",
+ "\n",
+ "# Print the first 10 rows of our data\n",
+ "one_hot_data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Scaling the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Copying our data\n",
+ "processed_data = one_hot_data[:]\n",
+ "\n",
+ "# Scaling the columns\n",
+ "processed_data['gre'] = processed_data['gre']/800\n",
+ "processed_data['gpa'] = processed_data['gpa']/4.0\n",
+ "processed_data[:10]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Backpropagating the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def error_term_formula(x, y, output):\n",
+ " return (y - output)*sigmoid_prime(x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## alternative solution ##\n",
+ "# you could also *only* use y and the output \n",
+ "# and calculate sigmoid_prime directly from the activated output!\n",
+ "\n",
+ "# below is an equally valid solution (it doesn't utilize x)\n",
+ "def error_term_formula(x, y, output):\n",
+ " return (y-output) * output * (1 - output)"
+ ]
+ }
+ ],
+ "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.6.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_admissions.py b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_admissions.py
new file mode 100644
index 0000000..dd50305
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_admissions.py
@@ -0,0 +1,181 @@
+# Importing pandas and numpy
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+# Reading the csv file into a pandas DataFrame
+data = pd.read_csv('student_data.csv')
+
+# Printing out the first 10 rows of our data
+print(data[:10])
+
+
+# Importing matplotlib
+
+# Function to help us plot
+def plot_points(data):
+ X = np.array(data[["gre", "gpa"]])
+ y = np.array(data["admit"])
+ admitted = X[np.argwhere(y == 1)]
+ rejected = X[np.argwhere(y == 0)]
+ plt.scatter([s[0][0] for s in rejected], [s[0][1]
+ for s in rejected],
+ s=25, color='red', edgecolor='k')
+ plt.scatter([s[0][0] for s in admitted], [s[0][1]
+ for s in admitted],
+ s=25, color='cyan', edgecolor='k')
+ plt.xlabel('Test (GRE)')
+ plt.ylabel('Grades (GPA)')
+
+
+# Plotting the points
+plot_points(data)
+plt.show()
+
+
+# Separating the ranks
+data_rank1 = data[data["rank"] == 1]
+data_rank2 = data[data["rank"] == 2]
+data_rank3 = data[data["rank"] == 3]
+data_rank4 = data[data["rank"] == 4]
+
+# Plotting the graphs
+plot_points(data_rank1)
+plt.title("Rank 1")
+plt.show()
+plot_points(data_rank2)
+plt.title("Rank 2")
+plt.show()
+plot_points(data_rank3)
+plt.title("Rank 3")
+plt.show()
+plot_points(data_rank4)
+plt.title("Rank 4")
+plt.show()
+
+
+# TODO: Make dummy variables for rank
+one_hot_data = pd.concat([data, pd.get_dummies(data['rank'], prefix='rank')],
+ axis=1)
+
+# TODO: Drop the previous rank column
+one_hot_data = one_hot_data.drop('rank', axis=1)
+
+# Print the first 10 rows of our data
+one_hot_data[:10]
+
+
+# Making a copy of our data
+processed_data = one_hot_data[:]
+
+# TODO: Scale the columns
+processed_data['gre'] = processed_data['gre'] / 800
+processed_data['gpa'] = processed_data['gpa'] / 4.0
+processed_data[:10]
+
+# Printing the first 10 rows of our procesed data
+processed_data[:10]
+
+
+sample = np.random.choice(processed_data.index, size=int(
+ len(processed_data) * 0.9), replace=False)
+train_data, test_data = processed_data.iloc[sample], processed_data.drop(
+ sample)
+
+print("Number of training samples is", len(train_data))
+print("Number of testing samples is", len(test_data))
+print(train_data[:10])
+print(test_data[:10])
+
+
+features = train_data.drop('admit', axis=1)
+targets = train_data['admit']
+features_test = test_data.drop('admit', axis=1)
+targets_test = test_data['admit']
+
+print(features[:10])
+print(targets[:10])
+
+
+# Activation (sigmoid) function
+def sigmoid(x):
+ return 1 / (1 + np.exp(-x))
+
+
+def sigmoid_prime(x):
+ return sigmoid(x) * (1 - sigmoid(x))
+
+
+def error_formula(y, output):
+ return - y * np.log(output) - (1 - y) * np.log(1 - output)
+
+
+# TODO: Write the error term formula
+def error_term_formula(x, y, output):
+ return (y - output) * sigmoid_prime(x)
+
+
+# Neural Network hyperparameters
+epochs = 1000
+learnrate = 0.5
+
+# Training function
+
+
+def train_nn(features, targets, epochs, learnrate):
+
+ # Use to same seed to make debugging easier
+ np.random.seed(42)
+
+ n_records, n_features = features.shape
+ last_loss = None
+
+ # Initialize weights
+ weights = np.random.normal(scale=1 / n_features**.5, size=n_features)
+
+ for e in range(epochs):
+ del_w = np.zeros(weights.shape)
+ for x, y in zip(features.values, targets):
+ # Loop through all records, x is the input, y is the target
+
+ # Activation of the output unit
+ # Notice we multiply the inputs and the weights here
+ # rather than storing h as a separate variable
+ output = sigmoid(np.dot(x, weights))
+
+ # The error, the target minus the network output
+ error = error_formula(y, output)
+
+ # The error term
+ error_term = error_term_formula(x, y, output)
+
+ # The gradient descent step, the error times the gradient times the inputs
+ del_w += error_term * x
+
+ # Update the weights here. The learning rate times the
+ # change in weights, divided by the number of records to average
+ weights += learnrate * del_w / n_records
+
+ # Printing out the mean square error on the training set
+ if e % (epochs / 10) == 0:
+ out = sigmoid(np.dot(features, weights))
+ loss = np.mean((out - targets) ** 2)
+ print("Epoch:", e)
+ if last_loss and last_loss < loss:
+ print("Train loss: ", loss, " WARNING - Loss Increasing")
+ else:
+ print("Train loss: ", loss)
+ last_loss = loss
+ print("=========")
+ print("Finished training!")
+ return weights
+
+
+weights = train_nn(features, targets, epochs, learnrate)
+
+
+# Calculate accuracy on test data
+test_out = sigmoid(np.dot(features_test, weights))
+predictions = test_out > 0.5
+accuracy = np.mean(predictions == targets_test)
+print("Prediction accuracy: {:.3f}".format(accuracy))
diff --git a/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_data.csv b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_data.csv
new file mode 100644
index 0000000..5f2cf4e
--- /dev/null
+++ b/python/Deep Learning/Introduction to Neural Networks/Student Admissions(Neural Network)/student_data.csv
@@ -0,0 +1,401 @@
+admit,gre,gpa,rank
+0,380,3.61,3
+1,660,3.67,3
+1,800,4,1
+1,640,3.19,4
+0,520,2.93,4
+1,760,3,2
+1,560,2.98,1
+0,400,3.08,2
+1,540,3.39,3
+0,700,3.92,2
+0,800,4,4
+0,440,3.22,1
+1,760,4,1
+0,700,3.08,2
+1,700,4,1
+0,480,3.44,3
+0,780,3.87,4
+0,360,2.56,3
+0,800,3.75,2
+1,540,3.81,1
+0,500,3.17,3
+1,660,3.63,2
+0,600,2.82,4
+0,680,3.19,4
+1,760,3.35,2
+1,800,3.66,1
+1,620,3.61,1
+1,520,3.74,4
+1,780,3.22,2
+0,520,3.29,1
+0,540,3.78,4
+0,760,3.35,3
+0,600,3.4,3
+1,800,4,3
+0,360,3.14,1
+0,400,3.05,2
+0,580,3.25,1
+0,520,2.9,3
+1,500,3.13,2
+1,520,2.68,3
+0,560,2.42,2
+1,580,3.32,2
+1,600,3.15,2
+0,500,3.31,3
+0,700,2.94,2
+1,460,3.45,3
+1,580,3.46,2
+0,500,2.97,4
+0,440,2.48,4
+0,400,3.35,3
+0,640,3.86,3
+0,440,3.13,4
+0,740,3.37,4
+1,680,3.27,2
+0,660,3.34,3
+1,740,4,3
+0,560,3.19,3
+0,380,2.94,3
+0,400,3.65,2
+0,600,2.82,4
+1,620,3.18,2
+0,560,3.32,4
+0,640,3.67,3
+1,680,3.85,3
+0,580,4,3
+0,600,3.59,2
+0,740,3.62,4
+0,620,3.3,1
+0,580,3.69,1
+0,800,3.73,1
+0,640,4,3
+0,300,2.92,4
+0,480,3.39,4
+0,580,4,2
+0,720,3.45,4
+0,720,4,3
+0,560,3.36,3
+1,800,4,3
+0,540,3.12,1
+1,620,4,1
+0,700,2.9,4
+0,620,3.07,2
+0,500,2.71,2
+0,380,2.91,4
+1,500,3.6,3
+0,520,2.98,2
+0,600,3.32,2
+0,600,3.48,2
+0,700,3.28,1
+1,660,4,2
+0,700,3.83,2
+1,720,3.64,1
+0,800,3.9,2
+0,580,2.93,2
+1,660,3.44,2
+0,660,3.33,2
+0,640,3.52,4
+0,480,3.57,2
+0,700,2.88,2
+0,400,3.31,3
+0,340,3.15,3
+0,580,3.57,3
+0,380,3.33,4
+0,540,3.94,3
+1,660,3.95,2
+1,740,2.97,2
+1,700,3.56,1
+0,480,3.13,2
+0,400,2.93,3
+0,480,3.45,2
+0,680,3.08,4
+0,420,3.41,4
+0,360,3,3
+0,600,3.22,1
+0,720,3.84,3
+0,620,3.99,3
+1,440,3.45,2
+0,700,3.72,2
+1,800,3.7,1
+0,340,2.92,3
+1,520,3.74,2
+1,480,2.67,2
+0,520,2.85,3
+0,500,2.98,3
+0,720,3.88,3
+0,540,3.38,4
+1,600,3.54,1
+0,740,3.74,4
+0,540,3.19,2
+0,460,3.15,4
+1,620,3.17,2
+0,640,2.79,2
+0,580,3.4,2
+0,500,3.08,3
+0,560,2.95,2
+0,500,3.57,3
+0,560,3.33,4
+0,700,4,3
+0,620,3.4,2
+1,600,3.58,1
+0,640,3.93,2
+1,700,3.52,4
+0,620,3.94,4
+0,580,3.4,3
+0,580,3.4,4
+0,380,3.43,3
+0,480,3.4,2
+0,560,2.71,3
+1,480,2.91,1
+0,740,3.31,1
+1,800,3.74,1
+0,400,3.38,2
+1,640,3.94,2
+0,580,3.46,3
+0,620,3.69,3
+1,580,2.86,4
+0,560,2.52,2
+1,480,3.58,1
+0,660,3.49,2
+0,700,3.82,3
+0,600,3.13,2
+0,640,3.5,2
+1,700,3.56,2
+0,520,2.73,2
+0,580,3.3,2
+0,700,4,1
+0,440,3.24,4
+0,720,3.77,3
+0,500,4,3
+0,600,3.62,3
+0,400,3.51,3
+0,540,2.81,3
+0,680,3.48,3
+1,800,3.43,2
+0,500,3.53,4
+1,620,3.37,2
+0,520,2.62,2
+1,620,3.23,3
+0,620,3.33,3
+0,300,3.01,3
+0,620,3.78,3
+0,500,3.88,4
+0,700,4,2
+1,540,3.84,2
+0,500,2.79,4
+0,800,3.6,2
+0,560,3.61,3
+0,580,2.88,2
+0,560,3.07,2
+0,500,3.35,2
+1,640,2.94,2
+0,800,3.54,3
+0,640,3.76,3
+0,380,3.59,4
+1,600,3.47,2
+0,560,3.59,2
+0,660,3.07,3
+1,400,3.23,4
+0,600,3.63,3
+0,580,3.77,4
+0,800,3.31,3
+1,580,3.2,2
+1,700,4,1
+0,420,3.92,4
+1,600,3.89,1
+1,780,3.8,3
+0,740,3.54,1
+1,640,3.63,1
+0,540,3.16,3
+0,580,3.5,2
+0,740,3.34,4
+0,580,3.02,2
+0,460,2.87,2
+0,640,3.38,3
+1,600,3.56,2
+1,660,2.91,3
+0,340,2.9,1
+1,460,3.64,1
+0,460,2.98,1
+1,560,3.59,2
+0,540,3.28,3
+0,680,3.99,3
+1,480,3.02,1
+0,800,3.47,3
+0,800,2.9,2
+1,720,3.5,3
+0,620,3.58,2
+0,540,3.02,4
+0,480,3.43,2
+1,720,3.42,2
+0,580,3.29,4
+0,600,3.28,3
+0,380,3.38,2
+0,420,2.67,3
+1,800,3.53,1
+0,620,3.05,2
+1,660,3.49,2
+0,480,4,2
+0,500,2.86,4
+0,700,3.45,3
+0,440,2.76,2
+1,520,3.81,1
+1,680,2.96,3
+0,620,3.22,2
+0,540,3.04,1
+0,800,3.91,3
+0,680,3.34,2
+0,440,3.17,2
+0,680,3.64,3
+0,640,3.73,3
+0,660,3.31,4
+0,620,3.21,4
+1,520,4,2
+1,540,3.55,4
+1,740,3.52,4
+0,640,3.35,3
+1,520,3.3,2
+1,620,3.95,3
+0,520,3.51,2
+0,640,3.81,2
+0,680,3.11,2
+0,440,3.15,2
+1,520,3.19,3
+1,620,3.95,3
+1,520,3.9,3
+0,380,3.34,3
+0,560,3.24,4
+1,600,3.64,3
+1,680,3.46,2
+0,500,2.81,3
+1,640,3.95,2
+0,540,3.33,3
+1,680,3.67,2
+0,660,3.32,1
+0,520,3.12,2
+1,600,2.98,2
+0,460,3.77,3
+1,580,3.58,1
+1,680,3,4
+1,660,3.14,2
+0,660,3.94,2
+0,360,3.27,3
+0,660,3.45,4
+0,520,3.1,4
+1,440,3.39,2
+0,600,3.31,4
+1,800,3.22,1
+1,660,3.7,4
+0,800,3.15,4
+0,420,2.26,4
+1,620,3.45,2
+0,800,2.78,2
+0,680,3.7,2
+0,800,3.97,1
+0,480,2.55,1
+0,520,3.25,3
+0,560,3.16,1
+0,460,3.07,2
+0,540,3.5,2
+0,720,3.4,3
+0,640,3.3,2
+1,660,3.6,3
+1,400,3.15,2
+1,680,3.98,2
+0,220,2.83,3
+0,580,3.46,4
+1,540,3.17,1
+0,580,3.51,2
+0,540,3.13,2
+0,440,2.98,3
+0,560,4,3
+0,660,3.67,2
+0,660,3.77,3
+1,520,3.65,4
+0,540,3.46,4
+1,300,2.84,2
+1,340,3,2
+1,780,3.63,4
+1,480,3.71,4
+0,540,3.28,1
+0,460,3.14,3
+0,460,3.58,2
+0,500,3.01,4
+0,420,2.69,2
+0,520,2.7,3
+0,680,3.9,1
+0,680,3.31,2
+1,560,3.48,2
+0,580,3.34,2
+0,500,2.93,4
+0,740,4,3
+0,660,3.59,3
+0,420,2.96,1
+0,560,3.43,3
+1,460,3.64,3
+1,620,3.71,1
+0,520,3.15,3
+0,620,3.09,4
+0,540,3.2,1
+1,660,3.47,3
+0,500,3.23,4
+1,560,2.65,3
+0,500,3.95,4
+0,580,3.06,2
+0,520,3.35,3
+0,500,3.03,3
+0,600,3.35,2
+0,580,3.8,2
+0,400,3.36,2
+0,620,2.85,2
+1,780,4,2
+0,620,3.43,3
+1,580,3.12,3
+0,700,3.52,2
+1,540,3.78,2
+1,760,2.81,1
+0,700,3.27,2
+0,720,3.31,1
+1,560,3.69,3
+0,720,3.94,3
+1,520,4,1
+1,540,3.49,1
+0,680,3.14,2
+0,460,3.44,2
+1,560,3.36,1
+0,480,2.78,3
+0,460,2.93,3
+0,620,3.63,3
+0,580,4,1
+0,800,3.89,2
+1,540,3.77,2
+1,680,3.76,3
+1,680,2.42,1
+1,620,3.37,1
+0,560,3.78,2
+0,560,3.49,4
+0,620,3.63,2
+1,800,4,2
+0,640,3.12,3
+0,540,2.7,2
+0,700,3.65,2
+1,540,3.49,2
+0,540,3.51,2
+0,660,4,1
+1,480,2.62,2
+0,420,3.02,1
+1,740,3.86,2
+0,580,3.36,2
+0,640,3.17,2
+0,640,3.51,2
+1,800,3.05,2
+1,660,3.88,2
+1,600,3.38,3
+1,620,3.75,2
+1,460,3.99,3
+0,620,4,2
+0,560,3.04,3
+0,460,2.63,2
+0,700,3.65,2
+0,600,3.89,3
diff --git a/python/Supervised Learning/Project/.ipynb_checkpoints/finding_donors-checkpoint.ipynb b/python/Supervised Learning/Project/.ipynb_checkpoints/finding_donors-checkpoint.ipynb
index 4909e69..3c24309 100644
--- a/python/Supervised Learning/Project/.ipynb_checkpoints/finding_donors-checkpoint.ipynb
+++ b/python/Supervised Learning/Project/.ipynb_checkpoints/finding_donors-checkpoint.ipynb
@@ -42,7 +42,7 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
@@ -165,7 +165,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -196,7 +196,7 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -217,7 +217,7 @@
},
{
"cell_type": "code",
- "execution_count": 42,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -293,7 +293,7 @@
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -303,16 +303,16 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 44,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
@@ -342,7 +342,7 @@
},
{
"cell_type": "code",
- "execution_count": 45,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -351,7 +351,7 @@
"(0, 1500)"
]
},
- "execution_count": 45,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
@@ -376,7 +376,7 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
@@ -385,7 +385,7 @@
"(0, 1000)"
]
},
- "execution_count": 46,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
@@ -410,7 +410,7 @@
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -446,7 +446,7 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -474,7 +474,7 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
@@ -483,7 +483,7 @@
"(0, 1500)"
]
},
- "execution_count": 49,
+ "execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
@@ -508,7 +508,7 @@
},
{
"cell_type": "code",
- "execution_count": 50,
+ "execution_count": 13,
"metadata": {},
"outputs": [
{
@@ -517,7 +517,7 @@
"(0, 1500)"
]
},
- "execution_count": 50,
+ "execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
@@ -552,7 +552,7 @@
},
{
"cell_type": "code",
- "execution_count": 59,
+ "execution_count": 14,
"metadata": {},
"outputs": [
{
@@ -740,14 +740,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 60,
+ "execution_count": 15,
"metadata": {},
"outputs": [
{
@@ -771,70 +764,100 @@
" \n",
" \n",
" | \n",
+ " age | \n",
" workclass | \n",
" education_level | \n",
+ " education-num | \n",
" marital-status | \n",
" occupation | \n",
" relationship | \n",
" race | \n",
" sex | \n",
+ " capital-gain | \n",
+ " capital-loss | \n",
+ " hours-per-week | \n",
" native-country | \n",
"
\n",
" \n",
" \n",
" \n",
- " | 14475 | \n",
+ " 38017 | \n",
+ " 0.260274 | \n",
" Private | \n",
- " Bachelors | \n",
- " Married-civ-spouse | \n",
- " Sales | \n",
- " Husband | \n",
- " White | \n",
- " Male | \n",
- " United-States | \n",
- "
\n",
- " \n",
- " | 14051 | \n",
- " State-gov | \n",
- " Bachelors | \n",
- " Never-married | \n",
- " Prof-specialty | \n",
- " Not-in-family | \n",
- " White | \n",
- " Male | \n",
- " United-States | \n",
- "
\n",
- " \n",
- " | 40954 | \n",
- " Private | \n",
- " Some-college | \n",
+ " HS-grad | \n",
+ " 0.533333 | \n",
" Never-married | \n",
" Adm-clerical | \n",
- " Own-child | \n",
- " Black | \n",
- " Male | \n",
- " United-States | \n",
- "
\n",
- " \n",
- " | 29769 | \n",
- " State-gov | \n",
- " Masters | \n",
- " Never-married | \n",
- " Exec-managerial | \n",
- " Not-in-family | \n",
+ " Unmarried | \n",
" White | \n",
" Female | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
" United-States | \n",
"
\n",
" \n",
- " | 22474 | \n",
+ " 13752 | \n",
+ " 0.219178 | \n",
" Private | \n",
- " Bachelors | \n",
+ " HS-grad | \n",
+ " 0.533333 | \n",
" Married-civ-spouse | \n",
- " Exec-managerial | \n",
+ " Transport-moving | \n",
" Husband | \n",
" White | \n",
" Male | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " United-States | \n",
+ "
\n",
+ " \n",
+ " | 31365 | \n",
+ " 0.054795 | \n",
+ " Private | \n",
+ " HS-grad | \n",
+ " 0.533333 | \n",
+ " Never-married | \n",
+ " Handlers-cleaners | \n",
+ " Not-in-family | \n",
+ " Asian-Pac-Islander | \n",
+ " Female | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.336735 | \n",
+ " South | \n",
+ "
\n",
+ " \n",
+ " | 8526 | \n",
+ " 0.219178 | \n",
+ " Private | \n",
+ " 7th-8th | \n",
+ " 0.200000 | \n",
+ " Married-civ-spouse | \n",
+ " Craft-repair | \n",
+ " Husband | \n",
+ " White | \n",
+ " Male | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " United-States | \n",
+ "
\n",
+ " \n",
+ " | 32263 | \n",
+ " 0.534247 | \n",
+ " Private | \n",
+ " Doctorate | \n",
+ " 1.000000 | \n",
+ " Married-civ-spouse | \n",
+ " Prof-specialty | \n",
+ " Husband | \n",
+ " White | \n",
+ " Male | \n",
+ " 0.777174 | \n",
+ " 0.0 | \n",
+ " 0.653061 | \n",
" United-States | \n",
"
\n",
" \n",
@@ -842,34 +865,41 @@
""
],
"text/plain": [
- " workclass education_level marital-status occupation \\\n",
- "14475 Private Bachelors Married-civ-spouse Sales \n",
- "14051 State-gov Bachelors Never-married Prof-specialty \n",
- "40954 Private Some-college Never-married Adm-clerical \n",
- "29769 State-gov Masters Never-married Exec-managerial \n",
- "22474 Private Bachelors Married-civ-spouse Exec-managerial \n",
+ " age workclass education_level education-num marital-status \\\n",
+ "38017 0.260274 Private HS-grad 0.533333 Never-married \n",
+ "13752 0.219178 Private HS-grad 0.533333 Married-civ-spouse \n",
+ "31365 0.054795 Private HS-grad 0.533333 Never-married \n",
+ "8526 0.219178 Private 7th-8th 0.200000 Married-civ-spouse \n",
+ "32263 0.534247 Private Doctorate 1.000000 Married-civ-spouse \n",
"\n",
- " relationship race sex native-country \n",
- "14475 Husband White Male United-States \n",
- "14051 Not-in-family White Male United-States \n",
- "40954 Own-child Black Male United-States \n",
- "29769 Not-in-family White Female United-States \n",
- "22474 Husband White Male United-States "
+ " occupation relationship race sex \\\n",
+ "38017 Adm-clerical Unmarried White Female \n",
+ "13752 Transport-moving Husband White Male \n",
+ "31365 Handlers-cleaners Not-in-family Asian-Pac-Islander Female \n",
+ "8526 Craft-repair Husband White Male \n",
+ "32263 Prof-specialty Husband White Male \n",
+ "\n",
+ " capital-gain capital-loss hours-per-week native-country \n",
+ "38017 0.000000 0.0 0.397959 United-States \n",
+ "13752 0.000000 0.0 0.397959 United-States \n",
+ "31365 0.000000 0.0 0.336735 South \n",
+ "8526 0.000000 0.0 0.397959 United-States \n",
+ "32263 0.777174 0.0 0.653061 United-States "
]
},
- "execution_count": 60,
+ "execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "non_numeric_features = features_log_minmax_transform.drop(numerical, axis=1)\n",
- "non_numeric_features.sample(frac=1).head(5)"
+ "# non_numeric_features = features_log_minmax_transform.drop(numerical, axis=1)\n",
+ "features_log_minmax_transform.sample(frac=1).head(5)"
]
},
{
"cell_type": "code",
- "execution_count": 65,
+ "execution_count": 16,
"metadata": {
"scrolled": true
},
@@ -878,24 +908,24 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "98 total features after one-hot encoding.\n",
+ "103 total features after one-hot encoding.\n",
"\n",
"Encoded feature names are:\n",
- "['workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_level_ 10th', 'education_level_ 11th', 'education_level_ 12th', 'education_level_ 1st-4th', 'education_level_ 5th-6th', 'education_level_ 7th-8th', 'education_level_ 9th', 'education_level_ Assoc-acdm', 'education_level_ Assoc-voc', 'education_level_ Bachelors', 'education_level_ Doctorate', 'education_level_ HS-grad', 'education_level_ Masters', 'education_level_ Preschool', 'education_level_ Prof-school', 'education_level_ Some-college', 'marital-status_ Divorced', 'marital-status_ Married-AF-spouse', 'marital-status_ Married-civ-spouse', 'marital-status_ Married-spouse-absent', 'marital-status_ Never-married', 'marital-status_ Separated', 'marital-status_ Widowed', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'relationship_ Husband', 'relationship_ Not-in-family', 'relationship_ Other-relative', 'relationship_ Own-child', 'relationship_ Unmarried', 'relationship_ Wife', 'race_ Amer-Indian-Eskimo', 'race_ Asian-Pac-Islander', 'race_ Black', 'race_ Other', 'race_ White', 'sex_ Female', 'sex_ Male', 'native-country_ Cambodia', 'native-country_ Canada', 'native-country_ China', 'native-country_ Columbia', 'native-country_ Cuba', 'native-country_ Dominican-Republic', 'native-country_ Ecuador', 'native-country_ El-Salvador', 'native-country_ England', 'native-country_ France', 'native-country_ Germany', 'native-country_ Greece', 'native-country_ Guatemala', 'native-country_ Haiti', 'native-country_ Holand-Netherlands', 'native-country_ Honduras', 'native-country_ Hong', 'native-country_ Hungary', 'native-country_ India', 'native-country_ Iran', 'native-country_ Ireland', 'native-country_ Italy', 'native-country_ Jamaica', 'native-country_ Japan', 'native-country_ Laos', 'native-country_ Mexico', 'native-country_ Nicaragua', 'native-country_ Outlying-US(Guam-USVI-etc)', 'native-country_ Peru', 'native-country_ Philippines', 'native-country_ Poland', 'native-country_ Portugal', 'native-country_ Puerto-Rico', 'native-country_ Scotland', 'native-country_ South', 'native-country_ Taiwan', 'native-country_ Thailand', 'native-country_ Trinadad&Tobago', 'native-country_ United-States', 'native-country_ Vietnam', 'native-country_ Yugoslavia']\n",
+ "['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_level_ 10th', 'education_level_ 11th', 'education_level_ 12th', 'education_level_ 1st-4th', 'education_level_ 5th-6th', 'education_level_ 7th-8th', 'education_level_ 9th', 'education_level_ Assoc-acdm', 'education_level_ Assoc-voc', 'education_level_ Bachelors', 'education_level_ Doctorate', 'education_level_ HS-grad', 'education_level_ Masters', 'education_level_ Preschool', 'education_level_ Prof-school', 'education_level_ Some-college', 'marital-status_ Divorced', 'marital-status_ Married-AF-spouse', 'marital-status_ Married-civ-spouse', 'marital-status_ Married-spouse-absent', 'marital-status_ Never-married', 'marital-status_ Separated', 'marital-status_ Widowed', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'relationship_ Husband', 'relationship_ Not-in-family', 'relationship_ Other-relative', 'relationship_ Own-child', 'relationship_ Unmarried', 'relationship_ Wife', 'race_ Amer-Indian-Eskimo', 'race_ Asian-Pac-Islander', 'race_ Black', 'race_ Other', 'race_ White', 'sex_ Female', 'sex_ Male', 'native-country_ Cambodia', 'native-country_ Canada', 'native-country_ China', 'native-country_ Columbia', 'native-country_ Cuba', 'native-country_ Dominican-Republic', 'native-country_ Ecuador', 'native-country_ El-Salvador', 'native-country_ England', 'native-country_ France', 'native-country_ Germany', 'native-country_ Greece', 'native-country_ Guatemala', 'native-country_ Haiti', 'native-country_ Holand-Netherlands', 'native-country_ Honduras', 'native-country_ Hong', 'native-country_ Hungary', 'native-country_ India', 'native-country_ Iran', 'native-country_ Ireland', 'native-country_ Italy', 'native-country_ Jamaica', 'native-country_ Japan', 'native-country_ Laos', 'native-country_ Mexico', 'native-country_ Nicaragua', 'native-country_ Outlying-US(Guam-USVI-etc)', 'native-country_ Peru', 'native-country_ Philippines', 'native-country_ Poland', 'native-country_ Portugal', 'native-country_ Puerto-Rico', 'native-country_ Scotland', 'native-country_ South', 'native-country_ Taiwan', 'native-country_ Thailand', 'native-country_ Trinadad&Tobago', 'native-country_ United-States', 'native-country_ Vietnam', 'native-country_ Yugoslavia']\n",
"\n",
"The income col now looks like:\n",
- "40240 1\n",
- "19808 1\n",
- "26118 0\n",
- "590 0\n",
- "42229 1\n",
+ "19232 0\n",
+ "45209 0\n",
+ "26283 1\n",
+ "41688 0\n",
+ "9039 0\n",
"Name: income, dtype: object\n"
]
}
],
"source": [
"# TODO: One-hot encode the 'features_log_minmax_transform' data using pandas.get_dummies()\n",
- "features_final = pd.get_dummies(non_numeric_features)\n",
+ "features_final = pd.get_dummies(features_log_minmax_transform)\n",
"\n",
"# TODO: Encode the 'income_raw' data to numerical values\n",
"income_raw.iloc[::-1][income_raw.iloc[::-1] == '<=50K'] = 0\n",
@@ -910,6 +940,37 @@
"print(f'The income col now looks like:\\n{income_raw.sample(frac=1).head(5)}')"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Convert income raw to dtype of int32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 0\n",
+ "1 0\n",
+ "2 0\n",
+ "Name: income, dtype: int32"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "income_raw = pd.Series(income_raw, dtype='int32')\n",
+ "income_raw.head(3)"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -932,7 +993,251 @@
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " age | \n",
+ " education-num | \n",
+ " capital-gain | \n",
+ " capital-loss | \n",
+ " hours-per-week | \n",
+ " workclass_ Federal-gov | \n",
+ " workclass_ Local-gov | \n",
+ " workclass_ Private | \n",
+ " workclass_ Self-emp-inc | \n",
+ " workclass_ Self-emp-not-inc | \n",
+ " ... | \n",
+ " native-country_ Portugal | \n",
+ " native-country_ Puerto-Rico | \n",
+ " native-country_ Scotland | \n",
+ " native-country_ South | \n",
+ " native-country_ Taiwan | \n",
+ " native-country_ Thailand | \n",
+ " native-country_ Trinadad&Tobago | \n",
+ " native-country_ United-States | \n",
+ " native-country_ Vietnam | \n",
+ " native-country_ Yugoslavia | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 13249 | \n",
+ " 0.109589 | \n",
+ " 0.866667 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 22542 | \n",
+ " 0.410959 | \n",
+ " 0.533333 | \n",
+ " 0.787051 | \n",
+ " 0.0 | \n",
+ " 0.438776 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1236 | \n",
+ " 0.246575 | \n",
+ " 0.800000 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 23702 | \n",
+ " 0.369863 | \n",
+ " 0.800000 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.500000 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 8339 | \n",
+ " 0.356164 | \n",
+ " 0.533333 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 103 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " age education-num capital-gain capital-loss hours-per-week \\\n",
+ "13249 0.109589 0.866667 0.000000 0.0 0.397959 \n",
+ "22542 0.410959 0.533333 0.787051 0.0 0.438776 \n",
+ "1236 0.246575 0.800000 0.000000 0.0 0.397959 \n",
+ "23702 0.369863 0.800000 0.000000 0.0 0.500000 \n",
+ "8339 0.356164 0.533333 0.000000 0.0 0.397959 \n",
+ "\n",
+ " workclass_ Federal-gov workclass_ Local-gov workclass_ Private \\\n",
+ "13249 0 0 1 \n",
+ "22542 0 0 1 \n",
+ "1236 0 0 1 \n",
+ "23702 0 0 1 \n",
+ "8339 0 0 1 \n",
+ "\n",
+ " workclass_ Self-emp-inc workclass_ Self-emp-not-inc ... \\\n",
+ "13249 0 0 ... \n",
+ "22542 0 0 ... \n",
+ "1236 0 0 ... \n",
+ "23702 0 0 ... \n",
+ "8339 0 0 ... \n",
+ "\n",
+ " native-country_ Portugal native-country_ Puerto-Rico \\\n",
+ "13249 0 0 \n",
+ "22542 0 0 \n",
+ "1236 0 0 \n",
+ "23702 0 0 \n",
+ "8339 0 0 \n",
+ "\n",
+ " native-country_ Scotland native-country_ South \\\n",
+ "13249 0 0 \n",
+ "22542 0 0 \n",
+ "1236 0 0 \n",
+ "23702 0 0 \n",
+ "8339 0 0 \n",
+ "\n",
+ " native-country_ Taiwan native-country_ Thailand \\\n",
+ "13249 0 0 \n",
+ "22542 0 0 \n",
+ "1236 0 0 \n",
+ "23702 0 0 \n",
+ "8339 0 0 \n",
+ "\n",
+ " native-country_ Trinadad&Tobago native-country_ United-States \\\n",
+ "13249 0 1 \n",
+ "22542 0 1 \n",
+ "1236 0 1 \n",
+ "23702 0 1 \n",
+ "8339 0 1 \n",
+ "\n",
+ " native-country_ Vietnam native-country_ Yugoslavia \n",
+ "13249 0 0 \n",
+ "22542 0 0 \n",
+ "1236 0 0 \n",
+ "23702 0 0 \n",
+ "8339 0 0 \n",
+ "\n",
+ "[5 rows x 103 columns]"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "features_final.sample(frac=1).head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
"metadata": {},
"outputs": [
{
@@ -1016,7 +1321,7 @@
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
@@ -1028,7 +1333,7 @@
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 21,
"metadata": {},
"outputs": [
{
@@ -1163,7 +1468,7 @@
},
{
"cell_type": "code",
- "execution_count": 106,
+ "execution_count": 22,
"metadata": {},
"outputs": [
{
@@ -1273,11 +1578,11 @@
},
{
"cell_type": "code",
- "execution_count": 57,
+ "execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
- "# TODO: Import two metrics from sklearn - fbeta_score and accuracy_score\n",
+ "from sklearn.metrics import fbeta_score, accuracy_score\n",
"\n",
"def train_predict(learner, sample_size, X_train, y_train, X_test, y_test): \n",
" '''\n",
@@ -1289,12 +1594,12 @@
" - X_test: features testing set\n",
" - y_test: income testing set\n",
" '''\n",
- " \n",
+ " beta = 0.5\n",
" results = {}\n",
" \n",
" # TODO: Fit the learner to the training data using slicing with 'sample_size' using .fit(training_features[:], training_labels[:])\n",
" start = time() # Get start time\n",
- " learner = learner.fit(X_train, y_train)\n",
+ " learner = learner.fit(X_train[:sample_size], y_train[:sample_size])\n",
" end = time() # Get end time\n",
" \n",
" # TODO: Calculate the training time\n",
@@ -1303,24 +1608,24 @@
" # TODO: Get the predictions on the test set(X_test),\n",
" # then get predictions on the first 300 training samples(X_train) using .predict()\n",
" start = time() # Get start time\n",
- " predictions_test = None\n",
- " predictions_train = None\n",
+ " predictions_test = learner.predict(X_test)\n",
+ " predictions_train = learner.predict(X_train[:300])\n",
" end = time() # Get end time\n",
" \n",
" # TODO: Calculate the total prediction time\n",
- " results['pred_time'] = None\n",
+ " results['pred_time'] = end - start\n",
" \n",
" # TODO: Compute accuracy on the first 300 training samples which is y_train[:300]\n",
- " results['acc_train'] = None\n",
+ " results['acc_train'] = accuracy_score(y_train[:300], predictions_train)\n",
" \n",
" # TODO: Compute accuracy on test set using accuracy_score()\n",
- " results['acc_test'] = None\n",
+ " results['acc_test'] = accuracy_score(y_test, predictions_test)\n",
" \n",
" # TODO: Compute F-score on the the first 300 training samples using fbeta_score()\n",
- " results['f_train'] = None\n",
+ " results['f_train'] = fbeta_score(y_train[:300], predictions_train, beta)\n",
" \n",
" # TODO: Compute F-score on the test set which is y_test\n",
- " results['f_test'] = None\n",
+ " results['f_test'] = fbeta_score(y_test, predictions_test, beta)\n",
" \n",
" # Success\n",
" print(\"{} trained on {} samples.\".format(learner.__class__.__name__, sample_size))\n",
@@ -1347,42 +1652,63 @@
},
{
"cell_type": "code",
- "execution_count": 58,
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "13181 0\n",
+ "10342 0\n",
+ "20881 0\n",
+ "24972 1\n",
+ "43867 0\n",
+ "Name: income, dtype: int32"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train.head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n"
- ]
- },
- {
- "ename": "TypeError",
- "evalue": "unsupported operand type(s) for +: 'int' and 'NoneType'",
- "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 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;31m# Run metrics visualization for the three supervised learning models chosen\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mvs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccuracy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfscore\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;32m~/courses/Udacity Machine Learning - Introduction Nanodegree Program/python/Supervised Learning/Project/visuals.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(results, accuracy, f1)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 74\u001b[0m \u001b[0;31m# Creative plot code\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mbar_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlearner\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[0mmetric\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbar_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mk\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[0m\u001b[1;32m 76\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_xticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.45\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.45\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2.45\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 77\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_xticklabels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"1%\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"10%\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"100%\"\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~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1599\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\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 1600\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1601\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msanitize_sequence\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1602\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1603\u001b[0m \u001b[0mbound\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_sig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(self, x, height, width, bottom, align, **kwargs)\u001b[0m\n\u001b[1;32m 2428\u001b[0m \u001b[0medgecolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2429\u001b[0m \u001b[0mlinewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlw\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2430\u001b[0;31m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'_nolegend_'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2431\u001b[0m )\n\u001b[1;32m 2432\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/patches.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, xy, width, height, angle, **kwargs)\u001b[0m\n\u001b[1;32m 714\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 715\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_x1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_x0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_width\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 716\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_y1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_y0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_height\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 717\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mangle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mangle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'NoneType'"
+ "36177 3617 361\n",
+ "\n",
+ "0 361\n",
+ "GaussianNB trained on 361 samples.\n",
+ "1 3617\n",
+ "GaussianNB trained on 3617 samples.\n",
+ "2 36177\n",
+ "GaussianNB trained on 36177 samples.\n",
+ "0 361\n",
+ "DecisionTreeClassifier trained on 361 samples.\n",
+ "1 3617\n",
+ "DecisionTreeClassifier trained on 3617 samples.\n",
+ "2 36177\n",
+ "DecisionTreeClassifier trained on 36177 samples.\n",
+ "0 361\n",
+ "SVC trained on 361 samples.\n",
+ "1 3617\n",
+ "SVC trained on 3617 samples.\n",
+ "2 36177\n",
+ "SVC trained on 36177 samples.\n"
]
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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97p167YSkfa2v6CgoJhu3bpFb9mypVppp8tZ5R1QlnSdAwcOjLLtNw8Pj3aBgYEx7du3b/Lss8+GnTt3rlTPZ5s2bdr17LPPHndm2ujo6MyEhIStXbp0SS2t9dvyVGF/1nxVlo4cOeIxatSoelFRUS29vb3bBQcHx8TGxjaZPXt2UHZ2xcRqr7766rHvv/8+ryxfvHhRnnjiiahBgwal7N+//89Zs2Yd7tOnz/mEhIStYWFhVS6gBIDyDChLur4LFy7IY489Fh4ZGdmyWrVq7QICAtq0bNmy2csvvxwKACNHjqwfGhraOisry+H8jRo1atG3b98Gtu9JSUnuDz74YF5eCwoKiunQoUOTWbNmBRe0DKo8WFNJLtu3b5/nzTff3NTd3V1NmjTpaIcOHdICAwNz/vrrL+/FixcHTps2rfa8efMOVXQ6ASAgICA3ICAgtyyW7e3trVatWhX47bff+nbr1q3Q4GLs2LFJkyZNOq6UkgMHDnhOnDix/p133tno0KFDrEEtQvv27S988cUX+3Nzc+XEiRMe69ev95s5c2btRYsWhXz//fe769evXyoBRHh4uNPL8fDwQERERKkGLi+88ELS448/fsL2vW/fvo3q16+fMWvWrLyyFBQUlGM/X25uLnJycuDpWTr3crt37/bq3LlzUx8fn9zJkycf6dChQ5qHh4dat26d34wZM+p06tTpYtu2bcv97RWmLOd9P3DggFdGRob07dv3TFRUVF704epxKe39eaUZPnx45E8//eT/+uuvH+rYsePF06dPu2/atKl6YmKiFwCMGzfuZFxcXOjSpUtrDh069Ix13jVr1vju37+/2nvvvZcA5L+WTJ48+WhsbOxFLy8vtWHDBr933303rF27dhevv/76tIrYTnIOayrJZWPGjInMysqSrVu37hw3btypa6+9Nu2aa67J7NOnz/nFixcnfvLJJ4cA4Msvv6wRGxvbJCAgoI2/v3+bjh07Nlm/fn1167JEpP0HH3wQZB12/fXXXzNw4MAo2/dFixbVbNasWXMfH5+2/v7+bVq1atXsf//7nw8AZGRkyKhRo+qFhYW19vLyahcSEtK6T58+ebWH48ePD4+IiGhp+757926vHj16RIeGhrb28fFpe8011zR///33860/Nja2yaBBgyL/8Y9/1KlVq1ZMQEBAm/79+0edPXs2X/kJDQ3N7Nmz5+kJEybUK2qf+fn55UZERGRHRkZmde3a9eLjjz+edPjwYe+TJ0+6O7XTr2JeXl4qIiIiOyoqKis2NjZt4sSJJ3/88cfdp0+f9njiiSfy9v20adNCGzRo0MLb27tdZGRky4kTJ9a21nRkZWXhySefrFO/fv2WXl5e7UJDQ1sPHz68vm183bp1W02YMKGO7Xth+W7Pnj1eItJ+9erVfrbpt27d6t2lS5dG1atXb1u9evW2t9xyS6Pt27d728a/++67wR4eHu3XrFnj27x582Y+Pj5tW7Ro0Wzjxo3VAR00RUREZNv+PD09lY+PT75hfn5+6o033gipXr16288//7xGkyZNmnt5ebVbtWqVPwAsXbo0ICYmpmm1atXahYWFtb7nnnsi7fPY+++/H3TNNdc09/b2ble3bt1WDz74YL0LFy6Ibfz9998fKSLYunXrzjFjxpxu165deuvWrTMef/zxlG3btu1s1KhRpqPjtG7dOt8bbrihcWBgYIyvr2/b1q1bN12xYoW/dZp58+YFNmnSpLmtdaNNmzZNN23aVA0A0tLSZMSIEfVDQ0Nb247PgAEDomzzPvTQQ3UbN27cAgDeeOONkFatWrUEgC5dujQTkfbffvut7/Lly2uISPtjx47lVaBs2bKlWrdu3aL9/f3bBAQEtLnpppsa//7773mtBIXtT7rcmjVraj788MNJ991335mmTZtmXnfddWmPPvpoyptvvnkMADp06JDerl27C5988kkt+3k/+uijkAYNGqT36tXrAqCvJZmZmW5//PHHrrFjx55q3759eqtWrTIeeeSRlG3btu1q2bJlRnlvHxUPg0pyyfHjx903btwY8MADD5wICgpyWAPo5qaz2fnz593GjBlz4rvvvtu1fv363Q0bNkzv16/fNUlJSU4HUomJiR4jR45sOHDgwJQtW7bs2Lhx4+5x48Ydt9UivPrqq6Fff/110CeffHJwx44d25cvX74vNja2wD5u586dc+/Spcu5FStW7P3tt992Dh8+PPmxxx5r8PXXX+e7iKxcuTLw1KlTHmvXrt0zb968A+vWrav5/PPPX/ZetDfffPPItm3bfOPi4mo6u03JycnuS5YsCWrYsGF6SEjIZTVPVLQGDRpk9evXL2X16tU1c3JyMH78+PD3338/bOrUqUe2bt26/Y033ji0YMGCkKeeeircNs+gQYOi5s2bFzpp0qSjW7Zs2bFkyZL9DRs2dHjRKirf2btw4YL06tXrmoyMDLfVq1fvWb169Z7U1FS33r17N05PT88L2HJzczF58uR6b7311qEff/xxV3BwcPaQIUOii9vMl5mZ6TZ16tTwmTNnJm7dunVHx44dLy5btqzGiBEjGg4ZMiTlt99+27FkyZL9e/furdavX7+8m6w33ngj5Nlnn60/fvz4pC1btmz/8MMP49euXRswatSoCNt2//TTTzXGjBlz3FENv4+Pj/L393dY7s+dO+c2ZMiQlP/+9797fvzxx53XX3/9hbvvvrvx7t27vQBg7969XqNHj244dOjQ5C1btuxYv3797tGjR59wd9eng6lTp4atXbu25vz58w/s2LFj+9KlS/e1b9/+oqN1PfTQQ8mrVq3aAwDLly/fm5CQsPXGG2+8bNqDBw963nLLLU0iIiIy161bt3vDhg2769evn9mjR48m1mDb0f4s1gG5ioSEhGStXbs24Pjx4wWex0eOHJn8/fffB+zfvz+vwKSkpLivXLkycPjw4SeBS9eS+++//0RwcPBl50Fvb29Vo0aNMmllotLD5m9yyc6dO71zc3PRvHnzfM1fbdu2bbpnzx4fAAgPD8/ct2/fjmHDhuVr+li8eHFCYGBg4JdffhkwduzYU86s79ChQ57Z2dly3333nW7SpEkmALRr1y5v3QkJCV4NGjRI792793k3Nzc0btw4s3PnzgVeEGJjY9NiY2PzmlNatGhxYt26df6fffZZ0B133HHeNjw8PDzTVuPatm3b9M8///zUxo0bawA4al1eixYtMu67776TL7zwQr3Bgwef9fb2dvj+0ZkzZ9aZNWtWbaUU0tPT3erWrZv5n//85y9n9gE51qJFi/QFCxa4HzhwwGv27NlhCxcu3P+3v/3tHAA0bdo08+TJk0effvrp+u+8887R7du3e3/55ZfBn3766YGRI0eeNvNnFNRtoah8Z2/OnDnBp0+f9vj999932R4QWb58+YHGjRu3njt3btDDDz+cAgBKKcycOfOQLQCaMmXK0W7dujXduXOnd0xMjNO1Mjk5OXjvvfcSrXl92rRp4WPHjj0+ceLEk2ZQxrx58+JjYmJabtmypVpMTEz69OnT60ydOvXwgw8+eAoAmjdvnpmVlXXob3/7W+M5c+Yc2rFjRzXbvnU2LTb9+vU7b/3+4YcfHl61alXNJUuWBE6dOvV4QkKCZ25uLoYNG3Y6MjIyCwDat2+ft57ExETv6Ojo9J49e16wleWuXbs6LMt+fn4qNDQ0GwBCQkKyC2rynj59emjjxo3Trd1xFi5cmBAeHh4wb968oAkTJpwsaH+SYx9++GH8iBEjGoaHh7eJjo5Oa9++fWrv3r3P3nvvvWdsFQr333//qWeeeab+7Nmza9lqMOfOnRuUm5srDz74YApw6VrSokULNm9XYayppFJh/xvy//rXv/b/+uuvO4cMGXIyLS3NDdBNzf369WsQERHR0s/Pr62/v3/bC+sMmqMAACAASURBVBcuuCckJHg5u55rr7027cYbbzzXtm3bFt27d49+6aWXQq0PAo0ePTp5z549PpGRkS2HDBkSERcXV9NaM2Tv/Pnzbg899FDdRo0atQgICGhTvXr1ths3bgw4dOhQvjQ1b94838UlPDw8Kzk52WE11SuvvHL09OnTHtOnTw8paL3Dhg078euvv+7ctGnTzlWrVu1p1KhR2p133tn49OnTLJMlZMuDR48e9UhPT3e77777om1Nz9WrV2/71FNPRV64cMH96NGjHj///HN1AOjbt+9ZZ5ZdVL6zt2PHjmrR0dHp1ieO69evnx0VFZVuC9QAQETQqVOnvLwVERGRabahWB343N3dccMNN+QtJzc3Fzt27Kj+/vvv17bug06dOjUHgF27dnkfOHDAMzk52XPixIkR1mnuvffeaKUUdu3a5Z2bW/KKocTERI8hQ4ZERkVFtfT3929TvXr1tocOHfK2lffOnTunduzY8XyLFi1a9uzZM3ratGmhBw8ezNvuv//97yf//PNP3wYNGrQcOnRoxIIFC2pmZGQUWJadsWXLFt/Nmzf7WrfX39+/bXJysufevXvzuibY708qWI8ePVITEhK2rVq1avfgwYNTTpw44TFy5MjoW2+9tZEt/1SvXl0NGDAgZcmSJbVycnQl5Pz582vddtttp8PCwnIAQCnl0rGlyoE1leSS5s2bZ7i5uWHnzp35nlxu1KhRFpD/QYI+ffo0DgwMzH777bcTo6KiMr29vVWXLl2aZmZm5gVSInJZgJqVlZV3svHw8MDGjRv3bty4sfrq1atrrFixInDatGn15s2bt3/w4MFnr7/++rT4+PhtK1asqLFu3Tr/iRMnRrz00ks5mzZt2uWoef6hhx6qt2bNmprTpk071KJFi3R/f//cxx57rN758+fzlQ0vL698iXKUTpuwsLCcxx9//NiMGTPqjB07NsXRNEFBQTm2/kEtW7bMaNasWXxkZGTMvHnzgsaPH5/scMFUqB07dvj4+fnl5OTkCADExcUdcFTDZqvRKo6i8l1J0+zm5gYPj0tZTURndds2OMvLyyvXuhylFJRS8sQTTxwZOnToafvpIyIispKSkjwAYPr06YldunS5rItIdHR0pq1J2ATCxdrOQYMGNTxz5ozHq6++eqhRo0YZPj4+asCAAdGZmZkCAJ6envjpp5/+Wr9+ve/q1atrfP7550Evv/xy3cWLF+/v37//uc6dO188ePDgn6Ys13jqqacipk2blr1p06bdJW0Gzc3NRefOnc++8847h+3HWZtc7fcnFc7T0xPdu3dP7d69eyqA4x988EHQuHHjGnzzzTd+t99++wXg0gM7n3/+eY06depk79q1q/qMGTPyaoxbtGiR7ubmhh07dvgAOFPQuqhyY6khl4SFheXcfPPNZz/55JOwCRMmnHTUFwbQr4nYv39/taVLl+4dOHDgOQDYv3+/56lTp/LlwaCgoOyjR4/m1RKmpaXJvn37qkVEROQ1Bbq5uaFr164XTVNY0k033dQ4Li6ulu3iHhAQkDts2LAzw4YNO5OYmHgsMjIyZtWqVf5Dhgy57KL4yy+/+A0YMCBl1KhRpwHd7HXw4MFqtWrVcumJ0aeffvrEJ598EvrMM8/UKXpq5AUWtlpdKp6DBw96/t///V/QbbfddqZ9+/Zp3t7eav/+/V6DBg1yGAjZagdXrFgRYGv+LkpR+c6qRYsW6Z999lnIsWPHPGy1lYcOHfKIj4+v1rJlyyQXNtUp7u7uaNas2cVdu3b5FLQ+X1/fzKCgoOy//vrL29Ycby8iIiL7uuuuO//RRx+FPfnkkyft+1WmpaVJdna22PerzM3NxW+//eb35ptvJtj2T0pKivvRo0e9AeQFsG5ubujWrVuq6XZwLDY2tsm8efOC+/fvfw4AAgMDc0eMGHFmxIgRZ/bs2ZPUtGnTVt9++62fbXxxtWnT5uLKlStrNmrUKLNatWr8adwy0qpVq3QAOH78eF7Ns+2Bnblz54aEhIRkWR/QAS5dSz799NPQiRMnXtavMiMjQzIyMoT9Kis3BpXkso8//jjxpptuahoTE9N80qRJRzt27HjR398/Z/v27dVWr14d4ObmpkJCQnICAwOz586dG9K0adOMEydOeEycOLGet7d3vhPEDTfccC4uLi6ka9eu5wMCAnJefPHFOtnZ2Xm1NmvXrvVds2ZNjV69ep2rX79+1s6dO7337NnjM3jw4GQAeO6558LCw8OzOnbseNHPzy83Li4uyN3dvcA+YQ0bNkxftWpVzfXr15+uUaNG7htvvBF28uRJT1eDSh8fH/X8888fefTRR6McNSFeuHDBLTEx0QMAjhw54jl16tQ61apVy73jjjtKXOt1tcjMzJTExEQP+1cKBQUFZb/11luHAwICch955JFjr7zySj0RQe/evc9lZWXJ5s2bfbZs2VJ99uzZR1q2bJlx5513nnryyScj0tLSpHPnzqnJycnu3333nd9zzz13wn6dReU7e6NHj06ZPn16nQEDBjScPn36YaUUnnrqqXqhoaGZDzzwgFNBrKumTp16ZNCgQY3Hjh2bOWzYsFP+/v65O3bsqLZ06dLAZcuWxXt4eGDy5MlHJk+eHOHv75/bv3//M+7u7vjzzz+r/fe//62xcOHCRACYO3dufJcuXZrGxMQ0t71SyNPT0/aal9rLli3bb/9KITc3N0RFRWUsWbIk+IYbbkhNT093mzx5cl3rNP/+97/9f/jhB9+ePXueq1evXva2bduq7du3r1rXrl3PAsDTTz9dOyoqKrNDhw4XfXx8cufMmVPLw8NDNWvWrMSvL5o0adLx5cuXB/fq1Sv66aefPhYZGZl18OBBr6+++irgnnvuOX3zzTezybuYOnbs2OSuu+461alTp9TatWtn79q1y/u5556r6+/vn9OrV698/WpHjhyZ/Pjjj0dWq1ZN/eMf/zhivyzbtaRt27bNJk+efLRjx44Xvb291Xfffef7zjvv1J43b95BvlKocmNQWYl5Bwdnl/cv6pRkvsaNG2du2bJl54svvhj21ltv1Ta1Eahbt25Gly5dzk2YMOG4u7s7Fi5cuH/8+PERHTt2bFGnTp3MKVOmHH7++efzvX7nvffeOzRixIiofv36XePn55fzxBNPHEtJScm72w0MDMz59ddffefNmxd67tw591q1amX179//1Ouvv34MAGrUqJEza9assISEhGq5ublo2LBhelxc3P6CHnqYNWvWoREjRkT17t27iZ+fX87QoUOTe/Xq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\n",
"text/plain": [
""
]
@@ -1395,29 +1721,33 @@
],
"source": [
"# TODO: Import the three supervised learning models from sklearn\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "from sklearn.svm import SVC\n",
"\n",
"# TODO: Initialize the three models\n",
- "clf_A = None\n",
- "clf_B = None\n",
- "clf_C = None\n",
+ "clf_A = GaussianNB()\n",
+ "clf_B = DecisionTreeClassifier()\n",
+ "clf_C = SVC()\n",
"\n",
"# TODO: Calculate the number of samples for 1%, 10%, and 100% of the training data\n",
"# HINT: samples_100 is the entire training set i.e. len(y_train)\n",
"# HINT: samples_10 is 10% of samples_100 (ensure to set the count of the values to be `int` and not `float`)\n",
"# HINT: samples_1 is 1% of samples_100 (ensure to set the count of the values to be `int` and not `float`)\n",
- "samples_100 = None\n",
- "samples_10 = None\n",
- "samples_1 = None\n",
- "\n",
+ "samples_100 = int(X_train.shape[0])\n",
+ "samples_10 = int(samples_100 * 0.1)\n",
+ "samples_1 = int(samples_100 * 0.01)\n",
+ "print(samples_100, samples_10, samples_1)\n",
+ "print()\n",
"# Collect results on the learners\n",
"results = {}\n",
"for clf in [clf_A, clf_B, clf_C]:\n",
" clf_name = clf.__class__.__name__\n",
" results[clf_name] = {}\n",
" for i, samples in enumerate([samples_1, samples_10, samples_100]):\n",
+ " print(i, samples)\n",
" results[clf_name][i] = \\\n",
" train_predict(clf, samples, X_train, y_train, X_test, y_test)\n",
- "\n",
"# Run metrics visualization for the three supervised learning models chosen\n",
"vs.evaluate(results, accuracy, fscore)"
]
@@ -1494,27 +1824,51 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 29,
"metadata": {},
- "outputs": [],
+ "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 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m# TODO: Fit the grid search object to the training data and find the optimal parameters using fit()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mgrid_fit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrid_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;31m# Get the estimator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, groups, **fit_params)\u001b[0m\n\u001b[1;32m 685\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 687\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluate_candidates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 688\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[0;31m# For multi-metric evaluation, store the best_index_, best_params_ and\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36m_run_search\u001b[0;34m(self, evaluate_candidates)\u001b[0m\n\u001b[1;32m 1146\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_run_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevaluate_candidates\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 1147\u001b[0m \u001b[0;34m\"\"\"Search all candidates in param_grid\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1148\u001b[0;31m \u001b[0mevaluate_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mParameterGrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparam_grid\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[0m\u001b[1;32m 1149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36mevaluate_candidates\u001b[0;34m(candidate_params)\u001b[0m\n\u001b[1;32m 664\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 665\u001b[0m in product(candidate_params,\n\u001b[0;32m--> 666\u001b[0;31m cv.split(X, y, groups)))\n\u001b[0m\u001b[1;32m 667\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 668\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m)\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[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 932\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 933\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\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--> 934\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\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[0m\u001b[1;32m 935\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 936\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\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--> 833\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\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[0m\u001b[1;32m 834\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\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~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 519\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 520\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 521\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 522\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mLokyTimeoutError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 523\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\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/usr/lib64/python3.7/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 425\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\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 426\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 427\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mCANCELLED\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCANCELLED_AND_NOTIFIED\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/usr/lib64/python3.7/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\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[0m\u001b[1;32m 297\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
"source": [
"# TODO: Import 'GridSearchCV', 'make_scorer', and any other necessary libraries\n",
+ "from sklearn.model_selection import GridSearchCV\n",
+ "from sklearn.metrics import make_scorer\n",
"\n",
"# TODO: Initialize the classifier\n",
- "clf = None\n",
+ "clf = SVC()\n",
"\n",
"# TODO: Create the parameters list you wish to tune, using a dictionary if needed.\n",
"# HINT: parameters = {'parameter_1': [value1, value2], 'parameter_2': [value1, value2]}\n",
- "parameters = None\n",
+ "parameters = {'C': np.logspace(-4, 10, 12, base=10),\n",
+ " 'gamma': np.logspace(-11, 3, 12, base=10),\n",
+ " 'kernel': ['linear', 'rbf']}\n",
"\n",
"# TODO: Make an fbeta_score scoring object using make_scorer()\n",
- "scorer = None\n",
+ "scorer = make_scorer(fbeta_score, beta=0.5)\n",
"\n",
"# TODO: Perform grid search on the classifier using 'scorer' as the scoring method using GridSearchCV()\n",
- "grid_obj = None\n",
+ "grid_obj = GridSearchCV(clf, param_grid=parameters, scoring=scorer, n_jobs=-1)\n",
"\n",
"# TODO: Fit the grid search object to the training data and find the optimal parameters using fit()\n",
- "grid_fit = None\n",
+ "grid_fit = grid_obj.fit(X_train, y_train)\n",
"\n",
"# Get the estimator\n",
"best_clf = grid_fit.best_estimator_\n",
diff --git a/python/Supervised Learning/Project/finding_donors.ipynb b/python/Supervised Learning/Project/finding_donors.ipynb
index 4909e69..8b4944e 100644
--- a/python/Supervised Learning/Project/finding_donors.ipynb
+++ b/python/Supervised Learning/Project/finding_donors.ipynb
@@ -42,7 +42,7 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": 25,
"metadata": {},
"outputs": [
{
@@ -165,7 +165,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": 26,
"metadata": {},
"outputs": [
{
@@ -196,7 +196,7 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": 27,
"metadata": {},
"outputs": [
{
@@ -217,7 +217,7 @@
},
{
"cell_type": "code",
- "execution_count": 42,
+ "execution_count": 28,
"metadata": {},
"outputs": [
{
@@ -293,7 +293,7 @@
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
@@ -303,16 +303,16 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 44,
+ "execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
@@ -342,7 +342,7 @@
},
{
"cell_type": "code",
- "execution_count": 45,
+ "execution_count": 31,
"metadata": {},
"outputs": [
{
@@ -351,7 +351,7 @@
"(0, 1500)"
]
},
- "execution_count": 45,
+ "execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
@@ -376,7 +376,7 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": 32,
"metadata": {},
"outputs": [
{
@@ -385,7 +385,7 @@
"(0, 1000)"
]
},
- "execution_count": 46,
+ "execution_count": 32,
"metadata": {},
"output_type": "execute_result"
},
@@ -410,7 +410,7 @@
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": 33,
"metadata": {},
"outputs": [
{
@@ -446,7 +446,7 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": 34,
"metadata": {},
"outputs": [
{
@@ -474,7 +474,7 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 35,
"metadata": {},
"outputs": [
{
@@ -483,7 +483,7 @@
"(0, 1500)"
]
},
- "execution_count": 49,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
@@ -508,7 +508,7 @@
},
{
"cell_type": "code",
- "execution_count": 50,
+ "execution_count": 36,
"metadata": {},
"outputs": [
{
@@ -517,7 +517,7 @@
"(0, 1500)"
]
},
- "execution_count": 50,
+ "execution_count": 36,
"metadata": {},
"output_type": "execute_result"
},
@@ -552,7 +552,7 @@
},
{
"cell_type": "code",
- "execution_count": 59,
+ "execution_count": 37,
"metadata": {},
"outputs": [
{
@@ -740,14 +740,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 60,
+ "execution_count": 38,
"metadata": {},
"outputs": [
{
@@ -771,70 +764,100 @@
" \n",
" \n",
" | \n",
+ " age | \n",
" workclass | \n",
" education_level | \n",
+ " education-num | \n",
" marital-status | \n",
" occupation | \n",
" relationship | \n",
" race | \n",
" sex | \n",
+ " capital-gain | \n",
+ " capital-loss | \n",
+ " hours-per-week | \n",
" native-country | \n",
"
\n",
" \n",
" \n",
" \n",
- " | 14475 | \n",
+ " 14204 | \n",
+ " 0.027397 | \n",
" Private | \n",
- " Bachelors | \n",
- " Married-civ-spouse | \n",
- " Sales | \n",
- " Husband | \n",
- " White | \n",
- " Male | \n",
+ " HS-grad | \n",
+ " 0.533333 | \n",
+ " Never-married | \n",
+ " Other-service | \n",
+ " Own-child | \n",
+ " Black | \n",
+ " Female | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
" United-States | \n",
"
\n",
" \n",
- " | 14051 | \n",
- " State-gov | \n",
- " Bachelors | \n",
+ " 4740 | \n",
+ " 0.068493 | \n",
+ " Private | \n",
+ " Assoc-voc | \n",
+ " 0.666667 | \n",
" Never-married | \n",
" Prof-specialty | \n",
" Not-in-family | \n",
" White | \n",
" Male | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.295918 | \n",
" United-States | \n",
"
\n",
" \n",
- " | 40954 | \n",
+ " 19821 | \n",
+ " 0.027397 | \n",
" Private | \n",
" Some-college | \n",
+ " 0.600000 | \n",
" Never-married | \n",
- " Adm-clerical | \n",
+ " Other-service | \n",
" Own-child | \n",
- " Black | \n",
- " Male | \n",
- " United-States | \n",
- "
\n",
- " \n",
- " | 29769 | \n",
- " State-gov | \n",
- " Masters | \n",
- " Never-married | \n",
- " Exec-managerial | \n",
- " Not-in-family | \n",
" White | \n",
- " Female | \n",
+ " Male | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.244898 | \n",
" United-States | \n",
"
\n",
" \n",
- " | 22474 | \n",
- " Private | \n",
- " Bachelors | \n",
+ " 15539 | \n",
+ " 0.219178 | \n",
+ " Self-emp-not-inc | \n",
+ " 11th | \n",
+ " 0.400000 | \n",
" Married-civ-spouse | \n",
- " Exec-managerial | \n",
+ " Craft-repair | \n",
" Husband | \n",
" White | \n",
" Male | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.500000 | \n",
+ " United-States | \n",
+ "
\n",
+ " \n",
+ " | 416 | \n",
+ " 0.041096 | \n",
+ " Private | \n",
+ " HS-grad | \n",
+ " 0.533333 | \n",
+ " Married-civ-spouse | \n",
+ " Machine-op-inspct | \n",
+ " Husband | \n",
+ " White | \n",
+ " Male | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
" United-States | \n",
"
\n",
" \n",
@@ -842,34 +865,41 @@
""
],
"text/plain": [
- " workclass education_level marital-status occupation \\\n",
- "14475 Private Bachelors Married-civ-spouse Sales \n",
- "14051 State-gov Bachelors Never-married Prof-specialty \n",
- "40954 Private Some-college Never-married Adm-clerical \n",
- "29769 State-gov Masters Never-married Exec-managerial \n",
- "22474 Private Bachelors Married-civ-spouse Exec-managerial \n",
+ " age workclass education_level education-num \\\n",
+ "14204 0.027397 Private HS-grad 0.533333 \n",
+ "4740 0.068493 Private Assoc-voc 0.666667 \n",
+ "19821 0.027397 Private Some-college 0.600000 \n",
+ "15539 0.219178 Self-emp-not-inc 11th 0.400000 \n",
+ "416 0.041096 Private HS-grad 0.533333 \n",
"\n",
- " relationship race sex native-country \n",
- "14475 Husband White Male United-States \n",
- "14051 Not-in-family White Male United-States \n",
- "40954 Own-child Black Male United-States \n",
- "29769 Not-in-family White Female United-States \n",
- "22474 Husband White Male United-States "
+ " marital-status occupation relationship race \\\n",
+ "14204 Never-married Other-service Own-child Black \n",
+ "4740 Never-married Prof-specialty Not-in-family White \n",
+ "19821 Never-married Other-service Own-child White \n",
+ "15539 Married-civ-spouse Craft-repair Husband White \n",
+ "416 Married-civ-spouse Machine-op-inspct Husband White \n",
+ "\n",
+ " sex capital-gain capital-loss hours-per-week native-country \n",
+ "14204 Female 0.0 0.0 0.397959 United-States \n",
+ "4740 Male 0.0 0.0 0.295918 United-States \n",
+ "19821 Male 0.0 0.0 0.244898 United-States \n",
+ "15539 Male 0.0 0.0 0.500000 United-States \n",
+ "416 Male 0.0 0.0 0.397959 United-States "
]
},
- "execution_count": 60,
+ "execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "non_numeric_features = features_log_minmax_transform.drop(numerical, axis=1)\n",
- "non_numeric_features.sample(frac=1).head(5)"
+ "# non_numeric_features = features_log_minmax_transform.drop(numerical, axis=1)\n",
+ "features_log_minmax_transform.sample(frac=1).head(5)"
]
},
{
"cell_type": "code",
- "execution_count": 65,
+ "execution_count": 39,
"metadata": {
"scrolled": true
},
@@ -878,24 +908,24 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "98 total features after one-hot encoding.\n",
+ "103 total features after one-hot encoding.\n",
"\n",
"Encoded feature names are:\n",
- "['workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_level_ 10th', 'education_level_ 11th', 'education_level_ 12th', 'education_level_ 1st-4th', 'education_level_ 5th-6th', 'education_level_ 7th-8th', 'education_level_ 9th', 'education_level_ Assoc-acdm', 'education_level_ Assoc-voc', 'education_level_ Bachelors', 'education_level_ Doctorate', 'education_level_ HS-grad', 'education_level_ Masters', 'education_level_ Preschool', 'education_level_ Prof-school', 'education_level_ Some-college', 'marital-status_ Divorced', 'marital-status_ Married-AF-spouse', 'marital-status_ Married-civ-spouse', 'marital-status_ Married-spouse-absent', 'marital-status_ Never-married', 'marital-status_ Separated', 'marital-status_ Widowed', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'relationship_ Husband', 'relationship_ Not-in-family', 'relationship_ Other-relative', 'relationship_ Own-child', 'relationship_ Unmarried', 'relationship_ Wife', 'race_ Amer-Indian-Eskimo', 'race_ Asian-Pac-Islander', 'race_ Black', 'race_ Other', 'race_ White', 'sex_ Female', 'sex_ Male', 'native-country_ Cambodia', 'native-country_ Canada', 'native-country_ China', 'native-country_ Columbia', 'native-country_ Cuba', 'native-country_ Dominican-Republic', 'native-country_ Ecuador', 'native-country_ El-Salvador', 'native-country_ England', 'native-country_ France', 'native-country_ Germany', 'native-country_ Greece', 'native-country_ Guatemala', 'native-country_ Haiti', 'native-country_ Holand-Netherlands', 'native-country_ Honduras', 'native-country_ Hong', 'native-country_ Hungary', 'native-country_ India', 'native-country_ Iran', 'native-country_ Ireland', 'native-country_ Italy', 'native-country_ Jamaica', 'native-country_ Japan', 'native-country_ Laos', 'native-country_ Mexico', 'native-country_ Nicaragua', 'native-country_ Outlying-US(Guam-USVI-etc)', 'native-country_ Peru', 'native-country_ Philippines', 'native-country_ Poland', 'native-country_ Portugal', 'native-country_ Puerto-Rico', 'native-country_ Scotland', 'native-country_ South', 'native-country_ Taiwan', 'native-country_ Thailand', 'native-country_ Trinadad&Tobago', 'native-country_ United-States', 'native-country_ Vietnam', 'native-country_ Yugoslavia']\n",
+ "['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_level_ 10th', 'education_level_ 11th', 'education_level_ 12th', 'education_level_ 1st-4th', 'education_level_ 5th-6th', 'education_level_ 7th-8th', 'education_level_ 9th', 'education_level_ Assoc-acdm', 'education_level_ Assoc-voc', 'education_level_ Bachelors', 'education_level_ Doctorate', 'education_level_ HS-grad', 'education_level_ Masters', 'education_level_ Preschool', 'education_level_ Prof-school', 'education_level_ Some-college', 'marital-status_ Divorced', 'marital-status_ Married-AF-spouse', 'marital-status_ Married-civ-spouse', 'marital-status_ Married-spouse-absent', 'marital-status_ Never-married', 'marital-status_ Separated', 'marital-status_ Widowed', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'relationship_ Husband', 'relationship_ Not-in-family', 'relationship_ Other-relative', 'relationship_ Own-child', 'relationship_ Unmarried', 'relationship_ Wife', 'race_ Amer-Indian-Eskimo', 'race_ Asian-Pac-Islander', 'race_ Black', 'race_ Other', 'race_ White', 'sex_ Female', 'sex_ Male', 'native-country_ Cambodia', 'native-country_ Canada', 'native-country_ China', 'native-country_ Columbia', 'native-country_ Cuba', 'native-country_ Dominican-Republic', 'native-country_ Ecuador', 'native-country_ El-Salvador', 'native-country_ England', 'native-country_ France', 'native-country_ Germany', 'native-country_ Greece', 'native-country_ Guatemala', 'native-country_ Haiti', 'native-country_ Holand-Netherlands', 'native-country_ Honduras', 'native-country_ Hong', 'native-country_ Hungary', 'native-country_ India', 'native-country_ Iran', 'native-country_ Ireland', 'native-country_ Italy', 'native-country_ Jamaica', 'native-country_ Japan', 'native-country_ Laos', 'native-country_ Mexico', 'native-country_ Nicaragua', 'native-country_ Outlying-US(Guam-USVI-etc)', 'native-country_ Peru', 'native-country_ Philippines', 'native-country_ Poland', 'native-country_ Portugal', 'native-country_ Puerto-Rico', 'native-country_ Scotland', 'native-country_ South', 'native-country_ Taiwan', 'native-country_ Thailand', 'native-country_ Trinadad&Tobago', 'native-country_ United-States', 'native-country_ Vietnam', 'native-country_ Yugoslavia']\n",
"\n",
"The income col now looks like:\n",
- "40240 1\n",
- "19808 1\n",
- "26118 0\n",
- "590 0\n",
- "42229 1\n",
+ "16481 0\n",
+ "37818 0\n",
+ "20804 0\n",
+ "3242 1\n",
+ "23475 0\n",
"Name: income, dtype: object\n"
]
}
],
"source": [
"# TODO: One-hot encode the 'features_log_minmax_transform' data using pandas.get_dummies()\n",
- "features_final = pd.get_dummies(non_numeric_features)\n",
+ "features_final = pd.get_dummies(features_log_minmax_transform)\n",
"\n",
"# TODO: Encode the 'income_raw' data to numerical values\n",
"income_raw.iloc[::-1][income_raw.iloc[::-1] == '<=50K'] = 0\n",
@@ -910,6 +940,37 @@
"print(f'The income col now looks like:\\n{income_raw.sample(frac=1).head(5)}')"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Convert income raw to dtype of int32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 0\n",
+ "1 0\n",
+ "2 0\n",
+ "Name: income, dtype: int32"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "income_raw = pd.Series(income_raw, dtype='int32')\n",
+ "income_raw.head(3)"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -932,7 +993,251 @@
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " age | \n",
+ " education-num | \n",
+ " capital-gain | \n",
+ " capital-loss | \n",
+ " hours-per-week | \n",
+ " workclass_ Federal-gov | \n",
+ " workclass_ Local-gov | \n",
+ " workclass_ Private | \n",
+ " workclass_ Self-emp-inc | \n",
+ " workclass_ Self-emp-not-inc | \n",
+ " ... | \n",
+ " native-country_ Portugal | \n",
+ " native-country_ Puerto-Rico | \n",
+ " native-country_ Scotland | \n",
+ " native-country_ South | \n",
+ " native-country_ Taiwan | \n",
+ " native-country_ Thailand | \n",
+ " native-country_ Trinadad&Tobago | \n",
+ " native-country_ United-States | \n",
+ " native-country_ Vietnam | \n",
+ " native-country_ Yugoslavia | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 16702 | \n",
+ " 0.383562 | \n",
+ " 0.866667 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.346939 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 8879 | \n",
+ " 0.520548 | \n",
+ " 0.333333 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.285714 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 14928 | \n",
+ " 0.150685 | \n",
+ " 0.600000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 28087 | \n",
+ " 0.273973 | \n",
+ " 0.533333 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 33970 | \n",
+ " 0.232877 | \n",
+ " 0.533333 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.397959 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 103 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " age education-num capital-gain capital-loss hours-per-week \\\n",
+ "16702 0.383562 0.866667 0.0 0.0 0.346939 \n",
+ "8879 0.520548 0.333333 0.0 0.0 0.285714 \n",
+ "14928 0.150685 0.600000 0.0 0.0 0.397959 \n",
+ "28087 0.273973 0.533333 0.0 0.0 0.397959 \n",
+ "33970 0.232877 0.533333 0.0 0.0 0.397959 \n",
+ "\n",
+ " workclass_ Federal-gov workclass_ Local-gov workclass_ Private \\\n",
+ "16702 0 1 0 \n",
+ "8879 0 0 1 \n",
+ "14928 0 0 1 \n",
+ "28087 0 0 1 \n",
+ "33970 0 0 1 \n",
+ "\n",
+ " workclass_ Self-emp-inc workclass_ Self-emp-not-inc ... \\\n",
+ "16702 0 0 ... \n",
+ "8879 0 0 ... \n",
+ "14928 0 0 ... \n",
+ "28087 0 0 ... \n",
+ "33970 0 0 ... \n",
+ "\n",
+ " native-country_ Portugal native-country_ Puerto-Rico \\\n",
+ "16702 0 0 \n",
+ "8879 0 0 \n",
+ "14928 0 0 \n",
+ "28087 0 0 \n",
+ "33970 0 0 \n",
+ "\n",
+ " native-country_ Scotland native-country_ South \\\n",
+ "16702 0 0 \n",
+ "8879 0 0 \n",
+ "14928 0 0 \n",
+ "28087 0 0 \n",
+ "33970 0 0 \n",
+ "\n",
+ " native-country_ Taiwan native-country_ Thailand \\\n",
+ "16702 0 0 \n",
+ "8879 0 0 \n",
+ "14928 0 0 \n",
+ "28087 0 0 \n",
+ "33970 0 0 \n",
+ "\n",
+ " native-country_ Trinadad&Tobago native-country_ United-States \\\n",
+ "16702 0 1 \n",
+ "8879 0 1 \n",
+ "14928 0 1 \n",
+ "28087 0 1 \n",
+ "33970 0 1 \n",
+ "\n",
+ " native-country_ Vietnam native-country_ Yugoslavia \n",
+ "16702 0 0 \n",
+ "8879 0 0 \n",
+ "14928 0 0 \n",
+ "28087 0 0 \n",
+ "33970 0 0 \n",
+ "\n",
+ "[5 rows x 103 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "features_final.sample(frac=1).head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
"metadata": {},
"outputs": [
{
@@ -1016,7 +1321,7 @@
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
@@ -1028,7 +1333,7 @@
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 44,
"metadata": {},
"outputs": [
{
@@ -1163,7 +1468,7 @@
},
{
"cell_type": "code",
- "execution_count": 106,
+ "execution_count": 45,
"metadata": {},
"outputs": [
{
@@ -1273,11 +1578,11 @@
},
{
"cell_type": "code",
- "execution_count": 57,
+ "execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
- "# TODO: Import two metrics from sklearn - fbeta_score and accuracy_score\n",
+ "from sklearn.metrics import fbeta_score, accuracy_score\n",
"\n",
"def train_predict(learner, sample_size, X_train, y_train, X_test, y_test): \n",
" '''\n",
@@ -1289,12 +1594,12 @@
" - X_test: features testing set\n",
" - y_test: income testing set\n",
" '''\n",
- " \n",
+ " beta = 0.5\n",
" results = {}\n",
" \n",
" # TODO: Fit the learner to the training data using slicing with 'sample_size' using .fit(training_features[:], training_labels[:])\n",
" start = time() # Get start time\n",
- " learner = learner.fit(X_train, y_train)\n",
+ " learner = learner.fit(X_train[:sample_size], y_train[:sample_size])\n",
" end = time() # Get end time\n",
" \n",
" # TODO: Calculate the training time\n",
@@ -1303,24 +1608,24 @@
" # TODO: Get the predictions on the test set(X_test),\n",
" # then get predictions on the first 300 training samples(X_train) using .predict()\n",
" start = time() # Get start time\n",
- " predictions_test = None\n",
- " predictions_train = None\n",
+ " predictions_test = learner.predict(X_test)\n",
+ " predictions_train = learner.predict(X_train[:300])\n",
" end = time() # Get end time\n",
" \n",
" # TODO: Calculate the total prediction time\n",
- " results['pred_time'] = None\n",
+ " results['pred_time'] = end - start\n",
" \n",
" # TODO: Compute accuracy on the first 300 training samples which is y_train[:300]\n",
- " results['acc_train'] = None\n",
+ " results['acc_train'] = accuracy_score(y_train[:300], predictions_train)\n",
" \n",
" # TODO: Compute accuracy on test set using accuracy_score()\n",
- " results['acc_test'] = None\n",
+ " results['acc_test'] = accuracy_score(y_test, predictions_test)\n",
" \n",
" # TODO: Compute F-score on the the first 300 training samples using fbeta_score()\n",
- " results['f_train'] = None\n",
+ " results['f_train'] = fbeta_score(y_train[:300], predictions_train, beta)\n",
" \n",
" # TODO: Compute F-score on the test set which is y_test\n",
- " results['f_test'] = None\n",
+ " results['f_test'] = fbeta_score(y_test, predictions_test, beta)\n",
" \n",
" # Success\n",
" print(\"{} trained on {} samples.\".format(learner.__class__.__name__, sample_size))\n",
@@ -1347,42 +1652,63 @@
},
{
"cell_type": "code",
- "execution_count": 58,
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "13181 0\n",
+ "10342 0\n",
+ "20881 0\n",
+ "24972 1\n",
+ "43867 0\n",
+ "Name: income, dtype: int32"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_train.head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n",
- "NoneType trained on None samples.\n"
- ]
- },
- {
- "ename": "TypeError",
- "evalue": "unsupported operand type(s) for +: 'int' and 'NoneType'",
- "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 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;31m# Run metrics visualization for the three supervised learning models chosen\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mvs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccuracy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfscore\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;32m~/courses/Udacity Machine Learning - Introduction Nanodegree Program/python/Supervised Learning/Project/visuals.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(results, accuracy, f1)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 74\u001b[0m \u001b[0;31m# Creative plot code\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mbar_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlearner\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[0mmetric\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbar_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mk\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[0m\u001b[1;32m 76\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_xticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.45\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.45\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2.45\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 77\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m\u001b[0;34m%\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_xticklabels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"1%\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"10%\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"100%\"\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~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1599\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\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 1600\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1601\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msanitize_sequence\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1602\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1603\u001b[0m \u001b[0mbound\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_sig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(self, x, height, width, bottom, align, **kwargs)\u001b[0m\n\u001b[1;32m 2428\u001b[0m \u001b[0medgecolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2429\u001b[0m \u001b[0mlinewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlw\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2430\u001b[0;31m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'_nolegend_'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2431\u001b[0m )\n\u001b[1;32m 2432\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/matplotlib/patches.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, xy, width, height, angle, **kwargs)\u001b[0m\n\u001b[1;32m 714\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 715\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_x1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_x0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_width\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 716\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_y1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_y0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_height\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 717\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mangle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mangle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'NoneType'"
+ "36177 3617 361\n",
+ "\n",
+ "0 361\n",
+ "GaussianNB trained on 361 samples.\n",
+ "1 3617\n",
+ "GaussianNB trained on 3617 samples.\n",
+ "2 36177\n",
+ "GaussianNB trained on 36177 samples.\n",
+ "0 361\n",
+ "DecisionTreeClassifier trained on 361 samples.\n",
+ "1 3617\n",
+ "DecisionTreeClassifier trained on 3617 samples.\n",
+ "2 36177\n",
+ "DecisionTreeClassifier trained on 36177 samples.\n",
+ "0 361\n",
+ "SVC trained on 361 samples.\n",
+ "1 3617\n",
+ "SVC trained on 3617 samples.\n",
+ "2 36177\n",
+ "SVC trained on 36177 samples.\n"
]
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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devWbSUi7W2foKCgmG7dukVv2bKlWlmny1kVHVCWdp0DBw6Msu03Dw+PdoGBgTHt27dv8uyzz4adO3euTM9nmzZt2vXss88ed2ba6OjorISEhK1dunRJK6v12/JUUR9rvipPR44c8Rg1alS9qKiolt7e3u2Cg4NjYmNjm8yePTsoJ6dyYrVXX3312Pfff59fli9cuCBPPPFE1KBBg1L279//56xZsw736dMnNSEhYWtYWNhlF1ACQEUGlKVd3/nz5+Wxxx4Lj4yMbFmtWrV2AQEBbVq2bNns5ZdfDgWAkSNH1g8NDW2dnZ3tcP5GjRq16Nu3bwPb76SkJPcHH3wwP68FBQXFdOjQocmsWbOCC1sGVR2sqSSX7du3z/Pmm29u6u7uriZNmnS0Q4cO6YGBgbl//fWX9+LFiwOnTZtWe968eYcqO50AEBAQkBcQEJBXHsv29vZWq1atCvz22299u3XrVmRwMXbs2KRJkyYdV0rJgQMHPCdOnFj/zjvvbHTo0CHWoBajffv257/44ov9eXl5cuLECY/169f7zZw5s/aiRYtCvv/++93169cvkwAiPDzc6eV4eHggIiKiTAOXF154Ienxxx8/Yfvdt2/fRvXr18+cNWtWflkKCgrKtZ8vLy8Pubm58PQsm3u53bt3e3Xu3Lmpj49P3uTJk4906NAh3cPDQ61bt85vxowZdTp16nShbdu2Ff72ClOW838fOHDAKzMzU/r27XsmKioqP/pw9biU9f680gwfPjzyp59+8n/99dcPdezY8cLp06fdN23aVD0xMdELAMaNG3cyLi4udOnSpTWHDh16xjrvmjVrfPfv31/tvffeSwAKXksmT558NDY29oKXl5fasGGD37vvvhvWrl27C9dff316ZWwnOYc1leSyMWPGRGZnZ8vWrVt3jhs37tS1116bfs0112T16dMndfHixYmffPLJIQD48ssva8TGxjYJCAho4+/v36Zjx45N1q9fX926LBFp/8EHHwRZh11//fXXDBw4MMr2e9GiRTWbNWvW3MfHp62/v3+bVq1aNfvf//7nAwCZmZkyatSoemFhYa29vLzahYSEtO7Tp09+7eH48ePDIyIiWtp+796926tHjx7RoaGhrX18fNpec801zd9///0C64+NjW0yaNCgyH/84x91atWqFRMQENCmf//+UWfPni1QfkJDQ7N69ux5esKECfWK22d+fn55EREROZGRkdldu3a98PjjjycdPnzY++TJk+5O7fSrmJeXl4qIiMiJiorKjo2NTZ84ceLJH3/8cffp06c9nnjiifx9P23atNAGDRq08Pb2bhcZGdly4sSJta01HdnZ2XjyySfr1K9fv6WXl1e70NDQ1sOHD69vG1+3bt1WEyZMqGP7XVS+27Nnj5eItF+9erWfbfqtW7d6d+nSpVH16tXbVq9eve0tt9zSaPv27d628e+++26wh4dH+zVr1vg2b968mY+PT9sWLVo027hxY3VAB00RERE5to+np6fy8fEpMMzPz0+98cYbIdWrV2/7+eef12jSpElzLy+vdqtWrfIHgKVLlwbExMQ0rVatWruwsLDW99xzT6R9Hnv//feDrrnmmube3t7t6tat2+rBBx+sd/78ebGNv//++yNFBFu3bt05ZsyY0+3atcto3bp15uOPP56ybdu2nY0aNcpydJzWrVvne8MNNzQODAyM8fX1bdu6deumK1as8LdOM2/evMAmTZo0t7VutGnTpummTZuqAUB6erqMGDGifmhoaGvb8RkwYECUbd6HHnqobuPGjVsAwBtvvBHSqlWrlgDQpUuXZiLS/ttvv/Vdvnx5DRFpf+zYsfwKlC1btlTr1q1btL+/f5uAgIA2N910U+Pff/89v5WgqP1Jl1qzZk3Nhx9+OOm+++4707Rp06zrrrsu/dFHH0158803jwFAhw4dMtq1a3f+k08+qWU/70cffRTSoEGDjF69ep0H9LUkKyvL7Y8//tg1duzYU+3bt89o1apV5iOPPJKybdu2XS1btsys6O2jkmFQSS45fvy4+8aNGwMeeOCBE0FBQQ5rAN3cdDZLTU11GzNmzInvvvtu1/r163c3bNgwo1+/ftckJSU5HUglJiZ6jBw5suHAgQNTtmzZsmPjxo27x40bd9xWi/Dqq6+Gfv3110GffPLJwR07dmxfvnz5vtjY2EL7uJ07d869S5cu51asWLH3t99+2zl8+PDkxx57rMHXX39d4CKycuXKwFOnTnmsXbt2z7x58w6sW7eu5vPPP3/Je9HefPPNI9u2bfONi4ur6ew2JScnuy9ZsiSoYcOGGSEhIZfUPFHxGjRokN2vX7+U1atX18zNzcX48ePD33///bCpU6ce2bp16/Y33njj0IIFC0KeeuqpcNs8gwYNipo3b17opEmTjm7ZsmXHkiVL9jds2NDhRau4fGfv/Pnz0qtXr2syMzPdVq9evWf16tV70tLS3Hr37t04IyMjP2DLy8vD5MmT67311luHfvzxx13BwcE5Q4YMiS5pM19WVpbb1KlTw2fOnJm4devWHR07drywbNmyGiNGjGg4ZMiQlN9++23HkiVL9u/du7dav3798m+y3njjjZBnn322/vjx45O2bNmy/cMPP4xfu3ZtwKhRoyJs2/3TTz/VGDNmzHFHNfw+Pj7K39/fYbk/d+6c25AhQ1L++9//7vnxxx93Xn/99efvvvvuxrt37/YCgL1793qNHj264dChQ5O3bNmyY/369btHjx59wt1dnw6mTp0atnbt2prz588/sGPHju1Lly7d1759+wuO1vXQQw8lr1q1ag8ALF++fG9CQsLWG2+88ZJpDx486HnLLbc0iYiIyFq3bt3uDRs27K5fv35Wjx49mliDbUf7s0QH5CoSEhKSvXbt2oDjx48Xeh4fOXJk8vfffx+wf//+/AKTkpLivnLlysDhw4efBC5eS+6///4TwcHBl5wHvb29VY0aNcqllYnKDpu/ySU7d+70zsvLQ/PmzQs0f7Vt27bpnj17fAAgPDw8a9++fTuGDRtWoOlj8eLFCYGBgYFffvllwNixY085s75Dhw555uTkyH333Xe6SZMmWQDQrl27/HUnJCR4NWjQIKN3796pbm5uaNy4cVbnzp0LvSDExsamx8bG5jentGjR4sS6dev8P/vss6A77rgj1TY8PDw8y1bj2rZt24zPP//81MaNG2sAOGpdXosWLTLvu+++ky+88EK9wYMHn/X29nb4/tGZM2fWmTVrVm2lFDIyMtzq1q2b9Z///OcvZ/YBOdaiRYuMBQsWuB84cMBr9uzZYQsXLtz/t7/97RwANG3aNOvkyZNHn3766frvvPPO0e3bt3t/+eWXwZ9++umBkSNHnjbzZxbWbaG4fGdvzpw5wadPn/b4/fffd9keEFm+fPmBxo0bt547d27Qww8/nAIASinMnDnzkC0AmjJlytFu3bo13blzp3dMTIzTtTK5ubl47733Eq15fdq0aeFjx449PnHixJNmUOa8efPiY2JiWm7ZsqVaTExMxvTp0+tMnTr18IMPPngKAJo3b56VnZ196G9/+1vjOXPmHNqxY0c12751Ni02/fr1S7X+/vDDDw+vWrWq5pIlSwKnTp16PCEhwTMvLw/Dhg07HRkZmQ0A7du3z19PYmKid3R0dEbPnj3P28py165dHZZlPz8/FRoamgMAISEhOYU1eU+fPj20cePGGdbuOAsXLkwIDw8PmDdvXtCECRNOFrY/ybEPP/wwfsSIEQ3Dw8PbREdHp7dv3z6td+/eZ++9994ztgqF+++//9QzzzxTf/bs2bVsNZhz584NysvLkwcffDAFuHgtadGiBZu3L2OsqaQyYf8/5P/1r3/t//XXX3cOGTLkZHp6uhugm5r79evXICIioqWfn19bf3//tufPn/0AkpAAACAASURBVHdPSEjwcnY91157bfqNN954rm3bti26d+8e/dJLL4VaHwQaPXp08p49e3wiIyNbDhkyJCIuLq6mtWbIXmpqqttDDz1Ut1GjRi0CAgLaVK9eve3GjRsDDh06VCBNzZs3L3BxCQ8Pz05OTnZYTfXKK68cPX36tMf06dNDClvvsGHDTvz66687N23atHPVqlV7GjVqlH7nnXc2Pn36NMtkKdny4NGjRz0yMjLc7rvvvmhb03P16tXbPvXUU5Hnz593P3r0qMfPP/9cHQD69u171pllF5fv7O3YsaNadHR0hvWJ4/r16+dERUVl2AI1ABARdOrUKT9vRUREZJltKFEHPnd3d9xwww35y8nLy8OOHTuqv//++7Wt+6BTp07NAWDXrl3eBw4c8ExOTvacOHFihHWae++9N1ophV27dnnn5ZW+YigxMdFjyJAhkVFRUS39/f3bVK9eve2hQ4e8beW9c+fOaR07dkxt0aJFy549e0ZPmzYt9ODBg/nb/fe///3kn3/+6dugQYOWQ4cOjViwYEHNzMzMQsuyM7Zs2eK7efNmX+v2+vv7t01OTvbcu3dvftcE+/1JhevRo0daQkLCtlWrVu0ePHhwyokTJzxGjhwZfeuttzay5Z/q1aurAQMGpCxZsqRWbq6uhJw/f36t22677XRYWFguACilXDq2VDWwppJc0rx580w3Nzfs3LmzwJPLjRo1ygYKPkjQp0+fxoGBgTlvv/12YlRUVJa3t7fq0qVL06ysrPxASkQuCVCzs7PzTzYeHh7YuHHj3o0bN1ZfvXp1jRUrVgROmzat3rx58/YPHjz47PXXX58eHx+/bcWKFTXWrVvnP3HixIiXXnopd9OmTbscNc8/9NBD9dasWVNz2rRph1q0aJHh7++f99hjj9VLTU0tUDa8vLwKJMpROm3CwsJyH3/88WMzZsyoM3bs2BRH0wQFBeXa+ge1bNkys1mzZvGRkZEx8+bNCxo/fnyywwVTkXbs2OHj5+eXm5ubKwAQFxd3wFENm61GqySKy3elTbObmxs8PC5mNRGd1W3b4CwvL68863KUUlBKyRNPPHFk6NChp+2nj4iIyE5KSvIAgOnTpyd26dLlki4i0dHRWbYmYRMIl2g7Bw0a1PDMmTMer7766qFGjRpl+vj4qAEDBkRnZWUJAHh6euKnn376a/369b6rV6+u8fnnnwe9/PLLdRcvXry/f//+5zp37nzh4MGDf5qyXOOpp56KmDZtWs6mTZt2l7YZNC8vD507dz77zjvvHLYfZ21ytd+fVDRPT0907949rXv37mkAjn/wwQdB48aNa/DNN9/43X777eeBiw/sfP755zXq1KmTs2vXruozZszIrzFu0aJFhpubG3bs2OED4Exh66KqjaWGXBIWFpZ78803n/3kk0/CJkyYcNJRXxhAvyZi//791ZYuXbp34MCB5wBg//79nqdOnSqQB4OCgnKOHj2aX0uYnp4u+/btqxYREZHfFOjm5oauXbteME1hSTfddFPjuLi4WraLe0BAQN6wYcPODBs27ExiYuKxyMjImFWrVvkPGTLkkoviL7/84jdgwICUUaNGnQZ0s9fBgwer1apVy6UnRp9++ukTn3zySegzzzxTp/ipkR9Y2Gp1qWQOHjzo+X//939Bt91225n27dune3t7q/3793sNGjTIYSBkqx1csWJFgK35uzjF5TurFi1aZHz22Wchx44d87DVVh46dMgjPj6+WsuWLZNc2FSnuLu7o1mzZhd27drlU9j6fH19s4KCgnL++usvb1tzvL2IiIic6667LvWjjz4Ke/LJJ0/a96tMT0+XnJwcse9XmZeXh99++83vzTffTLDtn5SUFPejR496A8gPYN3c3NCtW7c00+3gWGxsbJN58+YF9+/f/xwABAYG5o0YMeLMiBEjzuzZsyepadOmrb799ls/2/iSatOmzYWVK1fWbNSoUVa1atX4r3HLSatWrTIA4Pjx4/k1z7YHdubOnRsSEhKSbX1AB7h4Lfn0009DJ06ceEm/yszMTMnMzBT2q6zaGFSSyz7++OPEm266qWlMTEzzSZMmHe3YseMFf3//3O3bt1dbvXp1gJubmwoJCckNDAzMmTt3bkjTpk0zT5w44TFx4sR63t7eBU4QN9xww7m4uLiQrl27pgYEBOS++OKLdXJycvJrbdauXeu7Zs2aGr169TpXv3797J07d3rv2bPHZ/DgwckA8Nxzz4WFh4dnd+zY8YKfn19eXFxckLu7e6F9who2bJixatWqmuvXrz9do0aNvDfeeCPs5MmTnq4GlT4+Pur5558/8uijj0Y5akI8f/68W2JiogcAHDlyxHPq1Kl1qlWrlnfHHXeUutbrapGVlSWJiYke9q8UCgoKynnrrbcOBwQE5D3yyCPHXnnllXoigt69e5/Lzs6WzZs3+2zZsqX67Nmzj7Rs2TLzzjvvPPXkk09GpKenS+fOndOSk5Pdv/vuO7/nnnvuhP06i8t39kaPHp0yffr0OgMGDGg4ffr0w0opPPXUU/VCQ0OzHnjgAaeCWFdNnTr1yKBBgxqPHTs2a9iwYaf8/f3zduzYUW3p0qWBy5Yti/fw8MDkyZOPTJ48OcLf3z+vf//+Z9zd3fHnn39W++9//1tj4cKFiQAwd+7c+C5dujSNiYlpbnulkKenp+01L7WXLVu23/6VQm5uboiKispcsmRJ8A033JCWkZHhNnny5LrWaf7973/7//DDD749e/Y8V69evZxt27ZV27dvX7WuXbueBYCnn366dlRUVFaHDh0u+Pj45M2ZM6eWh4eHatasWalfXzRp0qTjy5cvD+7Vq1f0008/fSwyMjL74MGDXl999VXAPffcc/rmm29mk3cJdezYscldd911qlOnTmm1a9fO2bVrl/dzzz1X19/fP7dXr14F+tWOHDky+fHHH4+sVq2a+sc//nHEflm2a0nbtm2bTZ48+WjHjh0veHt7q++++873nXfeqT1v3ryDfKVQ1cagsgrzDg7Oqej/qFOa+Ro3bpy1ZcuWnS+++GLYW2+9VdvURqBu3bqZXbp0OTdhwoTj7u7uWLhw4f7x48dHdOzYsUWdOnWypkyZcvj5558v8Pqd995779CIESOi+vXrd42fn1/uE088cSwlJSX/bjcwMDD3119/9Z03b17ouXPn3GvVqpXdv3//U6+//voxAKhRo0burFmzwhISEqrl5eWhYcOGGXFxcfsLe+hh1qxZh0aMGBHVu3fvJn5+frlDhw5N7tWr1+n4+HiXX0Q+evToU++//37otm3bfO3HzZ49u/bs2bNrA0BAQEBus2bNLnzxxRd7W7duXSmvzAj29s6pjP+oU5r5fv/9d7/IyMgYd3d3+Pn55UZHR6c/8MADJyZMmHDSVosxffr0Y3Xq1Mn++OOPQ6dMmVLf29s7LyoqKuPee+/Nr5FbtmxZ/IQJE+pMmzat7mOPPeYZFBSUc/vttzsM+IrLd/b8/PzUN99889ejjz5av0ePHk0A4Nprr01duXLl3oqqIRs4cOC5L7744q9p06bVmT9/fiigHzjr0qXLWdsDFE8++WRyUFBQ7ttvvx02Y8aMcA8PDxUREZHRt2/f/P3QvHnzrN9//33nlClT6tj+W42/v39uo0aN0p966qljtlope3FxcQfGjh0beeONNzavVatW9vjx44+lpaXl18QHBwfn/O9///OfM2dOWGpqqntISEj24MGDk19++eUkQL92a+bMmbUTExO9ASA6Ojp90aJF+5s2berwFUbOaNCgQfb333+/a8KECfUGDRrUKC0tzT0kJCQ7NjY2NTw8vMq9WTvYOzinov+jTknn6d69+9mlS5cGvfbaa+FpaWnuQUFB2bGxsefnzZsXb/9fjGwP7GRkZLjZHtCxaty4cdbmzZt3TpkypfZrr70WfuzYMS9fX9/c6OjojMceeyypY8eODCirOCmsXxhVnK1bt8bHxMSwHx0REVEpbN26tVZMTExUZafjasf+W0RERETkMgaVREREROQyBpVERERE5DIGlURERETkMgaVVUNeXl4e/5sAERFRCZnrJ99fWQUwqKwCRCQpPT3d5VfYEBERXW3S09OriUi5/1MBKh6DyiogJydnanx8vFdaWpoPayyJiIiKl5eXJ2lpaT7x8fFeOTk5Uys7PcT3VFYZmzdv7unh4fGCUqo2GOwTEREVJ09EknJycqa2a9dudWUnhhhUEhEREVEZYI0YEREREbmMQSURERERuYxBJRERERG5jEElEREREbmMQSURERERuYxBJRERERG5jEElEREREbmMQSURERERuYxBJRERERG5jEElEREREbmMQSURERERuYxBJRERERG5jEElEREREbmMQSURERERuYxB5WVIRKJERImIhxPTjhCRHyooXV1EZEdZT0tErhORPSJyU1lPW1FE5FYRia/sdNDlSUTWiMi9ZT1tRRGRRiKiKjsd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\n",
"text/plain": [
""
]
@@ -1395,29 +1721,33 @@
],
"source": [
"# TODO: Import the three supervised learning models from sklearn\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "from sklearn.svm import SVC\n",
"\n",
"# TODO: Initialize the three models\n",
- "clf_A = None\n",
- "clf_B = None\n",
- "clf_C = None\n",
+ "clf_A = GaussianNB()\n",
+ "clf_B = DecisionTreeClassifier()\n",
+ "clf_C = SVC()\n",
"\n",
"# TODO: Calculate the number of samples for 1%, 10%, and 100% of the training data\n",
"# HINT: samples_100 is the entire training set i.e. len(y_train)\n",
"# HINT: samples_10 is 10% of samples_100 (ensure to set the count of the values to be `int` and not `float`)\n",
"# HINT: samples_1 is 1% of samples_100 (ensure to set the count of the values to be `int` and not `float`)\n",
- "samples_100 = None\n",
- "samples_10 = None\n",
- "samples_1 = None\n",
- "\n",
+ "samples_100 = int(X_train.shape[0])\n",
+ "samples_10 = int(samples_100 * 0.1)\n",
+ "samples_1 = int(samples_100 * 0.01)\n",
+ "print(samples_100, samples_10, samples_1)\n",
+ "print()\n",
"# Collect results on the learners\n",
"results = {}\n",
"for clf in [clf_A, clf_B, clf_C]:\n",
" clf_name = clf.__class__.__name__\n",
" results[clf_name] = {}\n",
" for i, samples in enumerate([samples_1, samples_10, samples_100]):\n",
+ " print(i, samples)\n",
" results[clf_name][i] = \\\n",
" train_predict(clf, samples, X_train, y_train, X_test, y_test)\n",
- "\n",
"# Run metrics visualization for the three supervised learning models chosen\n",
"vs.evaluate(results, accuracy, fscore)"
]
@@ -1494,27 +1824,109 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "SVC(C=0.01, cache_size=200, class_weight=None, coef0=0.0,\n",
+ " decision_function_shape='ovr', degree=3, gamma=0.1, kernel='rbf',\n",
+ " max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
+ " tol=0.001, verbose=False)"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import GridSearchCV\n",
+ "from sklearn.metrics import make_scorer\n",
+ "\n",
+ "clf = SVC(C=0.01, gamma=0.1, kernel='rbf')\n",
+ "\n",
+ "clf.fit(X_train, y_train)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
"metadata": {},
"outputs": [],
+ "source": [
+ "predictions_test = clf.predict(X_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.8245439469320066"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "accuracy_score(y_test, predictions_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "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 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m# TODO: Fit the grid search object to the training data and find the optimal parameters using fit()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mgrid_fit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrid_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;31m# Get the estimator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, groups, **fit_params)\u001b[0m\n\u001b[1;32m 685\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 687\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluate_candidates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 688\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[0;31m# For multi-metric evaluation, store the best_index_, best_params_ and\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36m_run_search\u001b[0;34m(self, evaluate_candidates)\u001b[0m\n\u001b[1;32m 1146\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_run_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevaluate_candidates\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 1147\u001b[0m \u001b[0;34m\"\"\"Search all candidates in param_grid\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1148\u001b[0;31m \u001b[0mevaluate_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mParameterGrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparam_grid\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[0m\u001b[1;32m 1149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/sklearn/model_selection/_search.py\u001b[0m in \u001b[0;36mevaluate_candidates\u001b[0;34m(candidate_params)\u001b[0m\n\u001b[1;32m 664\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 665\u001b[0m in product(candidate_params,\n\u001b[0;32m--> 666\u001b[0;31m cv.split(X, y, groups)))\n\u001b[0m\u001b[1;32m 667\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 668\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m)\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[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 932\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 933\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\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--> 934\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\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[0m\u001b[1;32m 935\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 936\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\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--> 833\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\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[0m\u001b[1;32m 834\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\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~/.virtualenvs/udacity-ML-3.7.3/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 519\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 520\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 521\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 522\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mLokyTimeoutError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 523\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\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/usr/lib64/python3.7/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 425\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\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 426\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 427\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mCANCELLED\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCANCELLED_AND_NOTIFIED\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/usr/lib64/python3.7/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\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[0m\u001b[1;32m 297\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
"source": [
"# TODO: Import 'GridSearchCV', 'make_scorer', and any other necessary libraries\n",
+ "from sklearn.model_selection import GridSearchCV\n",
+ "from sklearn.metrics import make_scorer\n",
"\n",
"# TODO: Initialize the classifier\n",
- "clf = None\n",
+ "clf = SVC()\n",
"\n",
"# TODO: Create the parameters list you wish to tune, using a dictionary if needed.\n",
"# HINT: parameters = {'parameter_1': [value1, value2], 'parameter_2': [value1, value2]}\n",
- "parameters = None\n",
+ "parameters = {'C': np.logspace(-4, 10, 12, base=10),\n",
+ " 'gamma': np.logspace(-11, 3, 12, base=10),\n",
+ " 'kernel': ['linear', 'rbf']}\n",
"\n",
"# TODO: Make an fbeta_score scoring object using make_scorer()\n",
- "scorer = None\n",
+ "scorer = make_scorer(fbeta_score, beta=0.5)\n",
"\n",
"# TODO: Perform grid search on the classifier using 'scorer' as the scoring method using GridSearchCV()\n",
- "grid_obj = None\n",
+ "grid_obj = GridSearchCV(clf, param_grid=parameters, scoring=scorer, n_jobs=-1)\n",
"\n",
"# TODO: Fit the grid search object to the training data and find the optimal parameters using fit()\n",
- "grid_fit = None\n",
+ "grid_fit = grid_obj.fit(X_train, y_train)\n",
"\n",
"# Get the estimator\n",
"best_clf = grid_fit.best_estimator_\n",