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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
admitgregparank
003803.613
116603.673
218004.001
316403.194
405202.934
517603.002
615602.981
704003.082
815403.393
907003.922
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
admitgregparank_1rank_2rank_3rank_4
003803.610010
116603.670010
218004.001000
316403.190001
405202.930001
517603.000100
615602.981000
704003.080100
815403.390010
907003.920100
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
admitgregparank_1rank_2rank_3rank_4
000.4750.90250010
110.8250.91750010
211.0001.00001000
310.8000.79750001
400.6500.73250001
510.9500.75000100
610.7000.74501000
700.5000.77000100
810.6750.84750010
900.8750.98000100
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ageeducation-numcapital-gaincapital-losshours-per-weekworkclass_ Federal-govworkclass_ Local-govworkclass_ Privateworkclass_ Self-emp-incworkclass_ Self-emp-not-inc...native-country_ Portugalnative-country_ Puerto-Riconative-country_ Scotlandnative-country_ Southnative-country_ Taiwannative-country_ Thailandnative-country_ Trinadad&Tobagonative-country_ United-Statesnative-country_ Vietnamnative-country_ Yugoslavia
132490.1095890.8666670.0000000.00.39795900100...0000000100
225420.4109590.5333330.7870510.00.43877600100...0000000100
12360.2465750.8000000.0000000.00.39795900100...0000000100
237020.3698630.8000000.0000000.00.50000000100...0000000100
83390.3561640.5333330.0000000.00.39795900100...0000000100
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ageeducation-numcapital-gaincapital-losshours-per-weekworkclass_ Federal-govworkclass_ Local-govworkclass_ Privateworkclass_ Self-emp-incworkclass_ Self-emp-not-inc...native-country_ Portugalnative-country_ Puerto-Riconative-country_ Scotlandnative-country_ Southnative-country_ Taiwannative-country_ Thailandnative-country_ Trinadad&Tobagonative-country_ United-Statesnative-country_ Vietnamnative-country_ Yugoslavia
167020.3835620.8666670.00.00.34693901000...0000000100
88790.5205480.3333330.00.00.28571400100...0000000100
149280.1506850.6000000.00.00.39795900100...0000000100
280870.2739730.5333330.00.00.39795900100...0000000100
339700.2328770.5333330.00.00.39795900100...0000000100
\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",