From d13081765abde4e7ff624af6944789492bb5a854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Montan=CC=83ana?= Date: Sun, 24 May 2020 18:47:27 +0200 Subject: [PATCH] First commit --- README.md | 37 ++- main.py | 54 ++++ n_network/Metrics.py | 220 +++++++++++++++ n_network/Neural_Network.py | 540 ++++++++++++++++++++++++++++++++++++ n_network/Utils.py | 44 +++ n_network/__init__.py | 3 + requirements.txt | 5 + setup.py | 38 +++ test.ipynb | 245 ++++++++++++++++ 9 files changed, 1184 insertions(+), 2 deletions(-) create mode 100644 main.py create mode 100644 n_network/Metrics.py create mode 100644 n_network/Neural_Network.py create mode 100644 n_network/Utils.py create mode 100644 n_network/__init__.py create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 test.ipynb diff --git a/README.md b/README.md index f3e45f3..fb657ff 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,35 @@ -# NeuralNetwork -Neural Network implementation based on the DeepLearning courses in Coursera +# N_Network + +Neural Network implementation based on the Andrew Ng courses + +Implements Batch GD, Stochastic GD (minibatch_size=1) & Stochastic minibatch GD: + +- Cost function: Cross Entropy Loss +- Activation functions: relu, sigmoid, tanh +- Regularization: l2 (lambd), Momentum (beta), Dropout (keep_prob) +- Optimization: Minibatch Gradient Descent, RMS Prop, Adam +- Learning rate decay, computes a factor of the learning rate at each # of epochs +- Fair minibatches: Can create batches with the same proportion of labels 1/0 as in train data + +Restriction: + +- Multiclass only with onehot label + +## Install + +```bash +pip install git+https://github.com/doctorado-ml/NeuralNetwork +``` + +## Example + +#### Console + +```bash +python main.py +``` + +#### Jupyter Notebook + +[![Test](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Doctorado-ML/NeuralNetwork/blob/master/test.ipynb) Test notebook + diff --git a/main.py b/main.py new file mode 100644 index 0000000..6dbc7a4 --- /dev/null +++ b/main.py @@ -0,0 +1,54 @@ +import numpy as np +import matplotlib.pyplot as plt +import time +from n_network import N_Network, plot_decision_boundary + + +def load_planar_dataset(random_seed): + np.random.seed(random_seed) + m = 400 # number of examples + N = int(m / 2) # number of points per class + D = 2 # dimensionality + X = np.zeros((m,D)) # data matrix where each row is a single example + Y = np.zeros((m, 1), dtype='uint8') # labels vector (0 for red, 1 for blue) + a = 4 # maximum ray of the flower + + for j in range(2): + ix = range(N * j, N * (j + 1)) + t = np.linspace(j * 3.12, (j + 1) * 3.12, N) + np.random.randn(N) * 0.2 # theta + r = a * np.sin(4 * t) + np.random.randn(N) * 0.2 # radius + X[ix] = np.c_[r * np.sin(t), r * np.cos(t)] + Y[ix] = j + + X = X.T + Y = Y.T + return X, Y + +random_seed = 1 +Xtrain, ytrain = load_planar_dataset(random_seed) +X = Xtrain.T +y = ytrain.T +print('X', X.shape, 'y', y.shape) + +# Visualize the data: +plt.scatter(X[:, 0], X[:, 1], c=y.T[0], s=40, cmap=plt.cm.Spectral); +plt.title('Dataset') +plt.show(); + +#Define a four layer network +nu = [X.shape[1], 10, 7, 5, 1] +xg = [0, N_Network.relu, N_Network.relu, N_Network.relu, N_Network.sigmoid] +xgprime = [0, N_Network.relu_prime, N_Network.relu_prime, N_Network.relu_prime, N_Network.sigmoid_prime] +init_params = dict(m=X.shape[0], n=X.shape[1], n_units=nu, g=xg, optim='sgd', + gprime=xgprime, epochs=10000, alpha=0.075) +nd = N_Network(init_params) +nd.set_seed(random_seed) +costs = nd.train(X, y) +print("First cost: {0:.6f} final cost: {1:.6f}".format(costs[0], costs[-1])) +print("Number of units in each layer: ", nu) +nd.print_time() +nd.plot_costs() +pred = nd.valid(X, y) +indices = nd.mislabeled(y, pred) +# Plot decission boundary +plot_decision_boundary(nd, X, y, True, '4 Layers N_Network') \ No newline at end of file diff --git a/n_network/Metrics.py b/n_network/Metrics.py new file mode 100644 index 0000000..65934ba --- /dev/null +++ b/n_network/Metrics.py @@ -0,0 +1,220 @@ +''' +__author__ = "Ricardo Montañana Gómez" +__copyright__ = "Copyright 2020, Ricardo Montañana Gómez" +__license__ = "MIT" +Compute metrics for predicted data +''' + +import numpy as np +from .Utils import one_hot + + +class Metrics: + """ + True Positives (tp), These are the correctly predicted positive values + True Negatives (tn), These are the correctly predicted negative values + False Positives (fp), When actual class is target and predicted class is the other + False Negatives (fn), When actual class is reverse of target but predicted class is target + """ + _truth = None + _predicted = None + _tp = None + _fp = None + _fn = None + _num_classes = 0 + + def __init__(self, y=None, yhat=None): + self._truth = self._adapt(y, update_num=True) + self._predicted = self._adapt(yhat) + self._compute_parameters() + + def _adapt(self, data, update_num=False): + if data.max() > 1 or data.ndim == 1 or (data.ndim == 2 and data.shape[1] == 1): + if update_num: + self._num_classes = data.max() + 1 + return data + else: + if update_num: + res = np.argmax(data, axis=1) + self._num_classes = res.max() + 1 + return res + + def _compute_param(self, set_a, set_b): + return np.sum(np.logical_and(set_a, set_b)) + + def _compute_parameters(self): + + self._tp = np.zeros((self._num_classes), dtype=int) + self._fp = np.zeros((self._num_classes), dtype=int) + self._fn = np.zeros((self._num_classes), dtype=int) + for target in range(self._num_classes): + self._tp[target] = self._compute_param( + self._truth == target, self._predicted == target) + self._fp[target] = self._compute_param( + self._truth != target, self._predicted == target) + self._fn[target] = self._compute_param( + self._truth == target, self._predicted != target) + + def parameters(self): + vmacro, vweigh, _, vmicro = self._compute_metrics() + return dict(tp=self._tp, fp=self._fp, fn=self._fn, macro=vmacro, weigh=vweigh, micro=vmicro) + + def sets(self): + return self._truth, self._predicted + + def fp_indices(self, target): + return np.where(np.logical_and(self._truth != target, self._predicted == target))[0] + + def fn_indices(self, target): + return np.where(np.logical_and(self._truth == target, self._predicted != target))[0] + + def correct(self): + """ + Return the number of correct predictions + """ + return np.sum(self._tp) + + def _get_dict(self, vmacro, vweigh, vmicro): + return dict(macro=vmacro, weigh=vweigh, micro=vmicro) + + def recall(self, target): + """ + recall, Recall is the ratio of correctly predicted positive observations to the all observations in positive class + """ + if target == 'all': + macro, weigh, _, micro = self._compute_metrics() + return self._get_dict(macro['rec'], weigh['rec'], micro['rec']) + else: + tp = self._tp[target] + fn = self._fn[target] + if (tp + fn) > 0: + return tp / (tp + fn) + return 0 + + def precision(self, target): + """ + precision, Precision is the ratio of correctly predicted positive observations to the total predicted positive observations + """ + if target == 'all': + macro, weigh, _, micro = self._compute_metrics() + return self._get_dict(macro['prec'], weigh['prec'], micro['prec']) + else: + tp = self._tp[target] + fp = self._fp[target] + if (tp + fp) > 0: + return tp / (tp + fp) + return 0 + + def accuracy(self): + """ + accuracy, Accuracy is a ratio of correctly predicted observations to the total observations + """ + tp = np.sum(self._tp) + elements = self._truth.size + if (elements) > 0: + return tp / elements + return 0 + + def f1(self, target): + """ + f1 score, is the weighted average of Precision and Recall + """ + if target == 'all': + macro, weigh, _, micro = self._compute_metrics() + return self._get_dict(macro['f1'], weigh['f1'], micro['f1']) + else: + divider = self.recall(target) + self.precision(target) + if divider != 0: + return 2 * (self.recall(target) * self.precision(target)) / divider + return 0 + + def confusion_matrix(self): + """ + Return the confusion matrix associated to the data provided + """ + result = np.zeros((self._num_classes, self._num_classes), dtype=int) + for target in reversed(range(self._num_classes)): + for j in range(self._num_classes): + result[target][j] = self._compute_param( + self._truth == target, self._predicted == j) + return result + + def debug(self): + for target in range(self._num_classes): + tp = self._tp[target] + fp = self._fp[target] + fn = self._fn[target] + print("target=[{0}], tp=[{1}], fp=[{2}], fn=[{3}]".format( + target, tp, fp, fn)) + print("Truth shape=", self._truth.shape, + " Prediction shape=", self._predicted.shape) + print("Number of classes:", self._num_classes) + + def _compute_micro_metrics(self): + ttp = np.sum(self._tp) + tfp = np.sum(self._fp) + pr = re = ttp / (ttp + tfp) + if ttp + tfp == 0: + return 0 + return 2 * (pr * re) / (pr + re), pr, re + + def _compute_metrics(self): + tf1 = tpr = tre = 0.0 + twf1 = twpr = twre = 0.0 + total_samples = 0 + for target in range(self._num_classes): + f1 = self.f1(target) + pr = self.precision(target) + re = self.recall(target) + num_samples = len(np.where(self._truth == target)[0]) + tf1 += f1 + tpr += pr + tre += re + twf1 += f1 * num_samples + twpr += pr * num_samples + twre += re * num_samples + total_samples += num_samples + tf1 /= self._num_classes + tpr /= self._num_classes + tre /= self._num_classes + twf1 /= total_samples + twpr /= total_samples + twre /= total_samples + mf1, mpr, mre = self._compute_micro_metrics() + macro = {} + weigh = {} + micro = {} + macro['f1'] = tf1 + macro['prec'] = tpr + macro['rec'] = tre + weigh['f1'] = twf1 + weigh['prec'] = twpr + weigh['rec'] = twre + micro['f1'] = mf1 + micro['prec'] = mpr + micro['rec'] = mre + return macro, weigh, total_samples, micro + + def classification_report(self, title='', digits=6): + def format_line(a, b, c, d, e): + return "[{0:^5}]\t[{1:.{digits}f}]\t[{2:.{digits}f}]\t[{3:.{digits}f}]\t[{4:5d}]".format(a, b, c, d, e, digits=digits) + print( + "======================== {0} ========================".format(title)) + + header = ['target', 'f1-score', 'precision', 'recall', 'support'] + print("{d[0]:^7}\t{d[1]:^{length}.{length}}\t{d[2]:^{length}.{length}}\t{d[3]:^{length}.{length}}\t{d[4]:^7}".format( + d=header, length=digits + 4)) + for target in range(self._num_classes): + f1 = self.f1(target) + pr = self.precision(target) + re = self.recall(target) + num_samples = len(np.where(self._truth == target)[0]) + print(format_line(target, f1, pr, re, num_samples)) + print("") + macro, weigh, total_samples, micro = self._compute_metrics() + print(format_line( + 'macro', macro['f1'], macro['prec'], macro['rec'], total_samples)) + print(format_line( + 'weig.', weigh['f1'], weigh['prec'], weigh['rec'], total_samples)) + print("accuracy=[{0:.{digits}f}]".format( + self.accuracy(), digits=digits)) diff --git a/n_network/Neural_Network.py b/n_network/Neural_Network.py new file mode 100644 index 0000000..7c319c3 --- /dev/null +++ b/n_network/Neural_Network.py @@ -0,0 +1,540 @@ +''' +__author__ = "Ricardo Montañana Gómez" +__copyright__ = "Copyright 2020, Ricardo Montañana Gómez" +__license__ = "MIT" +Neural Network implementation based on the Andrew Ng courses +Implements Batch GD, Stochastic GD (minibatch_size=1) & Stochastic minibatch GD: + -Cost function: Cross Entropy Loss + -Activation functions: relu, sigmoid, tanh + -Regularization: l2 (lambd), Momentum (beta), Dropout (keep_prob) + -Optimization: Minibatch Gradient Descent, RMS Prop, Adam + -Learning rate decay, computes a factor of the learning rate at each # of epochs + -Fair minibatches: Can create batches with the same proportion of labels 1/0 as in train data +Restriction: + -Multiclass only with onehot label +''' + +import time +import math +import pickle +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +from .Metrics import Metrics + + +# Cost function (Cross-entropy): +# Compute the cross-entropy cost $J$ +# $$ J = -\frac{1}{m} \sum\limits_{i = 1}^{m} (y^{(i)}\log\left(a^{[L] (i)}\right) + (1 - y^{(i)})\log\left(1 - a^{[L](i)}\right)) \tag{7}$$ + + +class N_Network: + + def __init__(self, hyperparam): + # NN State + self._ct = 0 # Time inverted in computation + self._optim = {} # Update parameters functions depending on the optimization algorithm + self._optim_update = None # update function selected + self._optim_selected = '' + self._multiclass = False # Is it a multiclass classification problem? + self._epochs_decay = () # (decay rate, applied each # epochs) + self._verbose = False + # Hyperparams + self._L = 0 # Number of layers including the input layer + self._n_units = [] # Number of units in each layer + self._g = [] # Activation functions of each layer + self._gprime = [] # Derivative of the activation functions needed in backpropagation + self._alpha = 0 # Learning rate in gradient descent + self._beta = 0 # Momentum coefficient / acts as beta1 in adam + self._beta2 = 0.999 # RMS Prop coefficient + self._epsilon = 1e-8 # RMS Prop value to prevent division by zero + self._params = {} # dict of parameters + self._epochs = 0 # Number of iterations to train + self._seed = 2020 # Random seed + self._lambd = 0 # Regularization coefficient + self._keep_prob = 1 # dropout regularization + self._minibatch_size = 0 # Number of samples to take into account to upgrade parameters + self._fair_minibatches = False # Wether or not create fair minibatches + if 'filename' in hyperparam: + self.load(hyperparam['filename']) + return + self._m = hyperparam['m'] + self._n = hyperparam['n'] + self._n_units = hyperparam['n_units'] + self._g = hyperparam['g'] + self._gprime = hyperparam['gprime'] + self._alpha = hyperparam['alpha'] + self._learning_rate = self._alpha + self._epochs = hyperparam['epochs'] + self._L = len(self._n_units) + # ensures that at most, only one regularization method is chosen + if 'lambd' in hyperparam: + self._lambd = hyperparam['lambd'] + else: + if 'keep_prob' in hyperparam: + self._keep_prob = hyperparam['keep_prob'] + if 'minibatch_size' in hyperparam: + self._minibatch_size = hyperparam['minibatch_size'] + else: + self._minibatch_size = self._m + if 'fair_minibatches' in hyperparam: + self._fair_minibatches = hyperparam['fair_minibatches'] + optim = { + 'adam': self._update_parameters_adam, + 'sgd': self._update_parameters_sgd, + 'rms': self._update_parameters_rms + } + self._optim_selected = hyperparam['optim'] + self._optim_update = optim[self._optim_selected] + if hyperparam['optim'] != 'sgd': + self._beta = 0.9 # if opt. algorithm is rms or adam set default beta/beta1 + if 'beta' in hyperparam: + self._beta = hyperparam['beta'] + np.random.seed(self._seed) + if 'multiclass' in hyperparam: + self._multiclass = hyperparam['multiclass'] + if 'epochs_decay' in hyperparam: + self._epochs_decay = hyperparam['epochs_decay'] + self.initialize() + + # Activation functions + @staticmethod + def softmax(x): # stable softmax + exps = np.exp(x - np.max(x)) + return exps / exps.sum(axis=0, keepdims=True) + + @staticmethod + def softmax_prime(x): + return 1 + + @staticmethod + def relu(x): + return np.maximum(0, x) + + @staticmethod + def sigmoid(x): + return 1 / (1 + np.exp(-x)) + + @staticmethod + def tanh(x): + return np.tanh(x) + + @staticmethod + def sigmoid_prime(x): + s = N_Network.sigmoid(x) + return s * (1 - s) + + @staticmethod + def relu_prime(x): + return np.greater(x, 0).astype(int) + + @staticmethod + def tanh_prime(x): + z = N_Network.tanh(x) + return 1 - z * z + + def initialize(self): + # Initialize dictionaries of Parameters + b = {} + W = {} + Z = {} + A = {} + dZ = {} + dW = {} + db = {} + vdW = {} + vdb = {} + SdW = {} + Sdb = {} + for i in range(self._L): + if self._verbose: + print("Initializing %d layer..." % i) + # Help ease the vanishing / Exploding gradient problem + cte = 0.01 + if self._g[i] == self.relu: + # Make Var(W) = 2 / n + cte = np.sqrt(2 / self._n_units[i - 1]) + else: + # based on Xavier initialization makes var(W) = 1 / n + if self._g[i] == self.tanh: + cte = 1 / np.sqrt(self._n_units[i - 1]) + else: + # makes var(W) = 2 / n + if self._g[i] == self.sigmoid: + prev_layer = (i - 1) if i > 0 else 0 + cte = np.sqrt( + 2 / (self._n_units[prev_layer] + self._n_units[i])) + # Don't need W and b and its optimizers for the input layer + if i > 0: + W[i] = np.random.randn( + self._n_units[i], self._n_units[i - 1]) * cte + b[i] = np.zeros((self._n_units[i], 1)) + dW[i] = np.zeros( + (self._n_units[i], self._n_units[i - 1] if i > 0 else self._minibatch_size)) + db[i] = np.zeros((self._n_units[i], 1)) + vdW[i] = np.zeros( + (self._n_units[i], self._n_units[i - 1] if i > 0 else self._minibatch_size)) + vdb[i] = np.zeros((self._n_units[i], 1)) + SdW[i] = np.zeros( + (self._n_units[i], self._n_units[i - 1] if i > 0 else self._minibatch_size)) + Sdb[i] = np.zeros((self._n_units[i], 1)) + A[i] = np.zeros( + (self._n_units[i], self._minibatch_size if i < self._L else 1)) + Z[i] = np.zeros( + (self._n_units[i], self._minibatch_size if i < self._L else 1)) + dZ[i] = np.zeros((self._n_units[i], self._minibatch_size)) + + self._params = dict(b=b, W=W, Z=Z, A=A, dZ=dZ, dW=dW, + db=db, vdW=vdW, vdb=vdb, SdW=SdW, Sdb=Sdb) + + def get_accuracy(self, y, ypred, direct_result=False): + m = y.shape[0] + met = Metrics(y, ypred) + ac = met.accuracy() + right = met.correct() + if direct_result: + return ac + return "Accuracy: {0:.3f}% ({1} of {2})".format(100 * ac, right, m) + + def get_metrics(self, y, ypred): + return Metrics(y, ypred) + + def plot_costs(self): + plt.plot(self._costs) + plt.ylabel('Cost (cross-entropy)') + plt.xlabel('Epochs') + plt.title("Epochs: {0} Learning rate: {1}".format( + self._epochs, self._learning_rate)) + plt.show() + + def plot_confusion_matrix(self, y, yhat, title='', figsize=(10, 7), scale=1.4): + cm = Metrics(y, yhat).confusion_matrix() + plt.figure(figsize=figsize) + sns.set(font_scale=scale) + fig = sns.heatmap(cm, annot=True, fmt='d', cmap="Blues", cbar=False) + x = fig.set_title("{0} ({1}) / {2}". format(title, + self._optim_selected, self.get_accuracy(y, yhat))) + x = fig.set_xlabel('Predicted') + x = fig.set_ylabel('Truth') + # fig.invert_yaxis() + + def check_dimensions(self): + for i in range(self._L): + print("i={0}, b({1}, W{2}, A{3}, Z{4}, vdW{5}, vdb{6}, SdW{7}, Sdb{8}, dW{9}, db{10}\n".format( + i, self._params['b'][i].shape if i > 0 else ' XXX', + self._params['W'][i].shape if i > 0 else ' XXX', + self._params['A'][i].shape, + self._params['Z'][i].shape, + self._params['vdW'][i].shape if i > 0 else ' XXX', + self._params['vdb'][i].shape if i > 0 else ' XXX', + self._params['SdW'][i].shape if i > 0 else ' XXX', + self._params['Sdb'][i].shape if i > 0 else ' XXX', + self._params['dW'][i].shape if i > 0 else ' XXX', + self._params['db'][i].shape if i > 0 else ' XXX' + )) + + def get_params(self): + return self._params + + def num_minibatches(self): + return math.floor(self._m / self._minibatch_size) + (0 if self._m % self._minibatch_size == 0 else 1) + + def create_minibatches(self, X, y): + return self.create_fair_minibatches(X, y) if self._fair_minibatches else self.create_random_minibatches(X, y) + + def _balance_sets(self, y): + """ + Returns: + class0: category 0 indexes + class1: category 1 indexes + num0: number of samples of 0 category to include in the minibatch + num1: number of samples of 1 category to include in the minibatch + """ + class_one = np.array(np.where(y == 1))[0] + class_zero = np.array(np.where(y == 0))[0] + percent = len(class_one) / len(y) + num_class0 = math.floor((1 - percent) * self._minibatch_size) + num_class1 = self._minibatch_size - num_class0 + return num_class0, num_class1, class_zero, class_one + + def create_fair_minibatches(self, X, y): + """ + Creates a list of random minibatches from (X, y) + + """ + mini_batches = [] + num_zero, num_one, class_zero, class_one = self._balance_sets(y) + # Compute categorized shuffled sets + X0 = X[class_zero] + X1 = X[class_one] + y0 = y[class_zero] + y1 = y[class_one] + permutation0 = list(np.random.permutation(len(class_zero))) + permutation1 = list(np.random.permutation(len(class_one))) + shuffledX0 = X0[permutation0, :] + shuffledX1 = X1[permutation1, :] + shuffledY0 = y0[permutation0, :] + shuffledY1 = y1[permutation1, :] + size = self._minibatch_size + + num = math.floor(self._m / size) + for k in range(num): + # Inserts the category 0 elements to mini batch + miniX = shuffledX0[k * num_zero:(k + 1) * num_zero, :] + miniY = shuffledY0[k * num_zero:(k + 1) * num_zero, :] + # Appends the cateogory 1 elements to mini batch + miniX = np.vstack((miniX, X1[k * num_one:(k + 1) * num_one, :])) + miniY = np.vstack((miniY, y1[k * num_one:(k + 1) * num_one, :])) + mini_batch = (miniX, miniY) + mini_batches.append(mini_batch) + if self._m % num != 0: + miniX = shuffledX0[num * num_zero:y0.shape[0], :] + miniY = shuffledY0[num * num_zero:y0.shape[0], :] + miniX = np.vstack((miniX, X1[num * num_one:y1.shape[0], :])) + miniY = np.vstack((miniY, y1[num * num_one:y1.shape[0], :])) + mini_batch = (miniX, miniY) + mini_batches.append(mini_batch) + return mini_batches + + def create_random_minibatches(self, X, y): + """ + Creates a list of random minibatches from (X, y) + + """ + mini_batches = [] + permutation = list(np.random.permutation(self._m)) + shuffledX = X[permutation, :] + shuffledY = y[permutation, :] + size = self._minibatch_size + num = math.floor(self._m / size) + for k in range(num): + miniX = shuffledX[k * size:(k + 1) * size, :] + miniY = shuffledY[k * size:(k + 1) * size, :] + mini_batch = (miniX, miniY) + mini_batches.append(mini_batch) + if self._m % size != 0: + miniX = shuffledX[num * size:self._m, :] + miniY = shuffledY[num * size:self._m, :] + mini_batch = (miniX, miniY) + mini_batches.append(mini_batch) + return mini_batches + + def _compute_Sd(self, i): + self._params['SdW'][i] = self._beta2 * self._params['SdW'][i] + \ + (1 - self._beta2) * np.square(self._params['dW'][i]) + self._params['Sdb'][i] = self._beta2 * self._params['Sdb'][i] + \ + (1 - self._beta2) * np.square(self._params['db'][i]) + return self._params['SdW'][i], self._params['Sdb'][i] + + def _compute_vd(self, i): + self._params['vdW'][i] = self._beta * self._params['vdW'][i] + \ + (1 - self._beta) * self._params['dW'][i] + self._params['vdb'][i] = self._beta * self._params['vdb'][i] + \ + (1 - self._beta) * self._params['db'][i] + return self._params['vdW'][i], self._params['vdb'][i] + + def _update_parameters_rms(self, t): + for i in range(1, self._L): + SdW, Sdb = self._compute_Sd(i) + dW = self._params['dW'][i] + db = self._params['db'][i] + self._params['W'][i] -= self._alpha * \ + dW / (np.sqrt(SdW) + self._epsilon) + self._params['b'][i] -= self._alpha * \ + db / (np.sqrt(Sdb) + self._epsilon) + + def _update_parameters_adam(self, t): + for i in range(1, self._L): + vdW, vdb = self._compute_vd(i) + SdW, Sdb = self._compute_Sd(i) + vdW_corr = vdW / (1 - math.pow(self._beta, 2)) + vdb_corr = vdb / (1 - math.pow(self._beta, 2)) + SdW_corr = SdW / (1 - math.pow(self._beta2, t)) + Sdb_corr = Sdb / (1 - math.pow(self._beta2, t)) + self._params['W'][i] -= self._alpha * \ + vdW_corr / (np.sqrt(SdW_corr) + self._epsilon) + self._params['b'][i] -= self._alpha * \ + vdb_corr / (np.sqrt(Sdb_corr) + self._epsilon) + + def _update_parameters_sgd(self, t): + for i in range(1, self._L): + vdW, vdb = self._compute_vd(i) + self._params['W'][i] -= self._alpha * vdW + self._params['b'][i] -= self._alpha * vdb + + def set_verbose(self, verbose): + self._verbose = verbose + + def set_seed(self, seed): + self._seed = seed + np.random.seed(self._seed) + + def _cost_function(self, yhat, y): + """ + Compute cost (cross-entropy) of prediction + + yhat: vector of predictions, shape (number of examples, 1) + Y: vector of labels, shape (number of examples, 1) + + Returns: cost + """ + if self._multiclass: + cost = -np.mean(y * np.log(yhat + self._epsilon)) + else: + cost = -np.sum(np.nansum(y * np.log(yhat) + (1 - y) + * np.log(1 - yhat))) / self._minibatch_size + # Add regularization term + cost += self._lambd / (2 * self._minibatch_size) * \ + np.sum([np.sum(np.square(x)) for x in self._params['W']]) + assert(cost.shape == ()) + return cost + + def _get_prediction(self, transform=False): + res = self._get_AL().T + if transform: + if self._multiclass: + return np.argmax(res, axis=1) + else: + return np.round(res).astype(int) + return res + + def _get_AL(self): + return self._params['A'][self._L - 1] + + def _backward_propagation(self, y): + AL = self._get_AL() + Y = y.T + assert(Y.shape == AL.shape) + if self._multiclass: + dA = AL - Y + else: + # derivative of cost with respect to A[L] + dA = np.nan_to_num(-(np.divide(Y, AL) - np.divide(1 - Y, 1 - AL))) + for i in reversed(range(1, self._L)): + dZ = dA * self._gprime[i](self._params['Z'][i]) + dW = dZ.dot(self._params['A'][i - 1].T) / self._minibatch_size + \ + (self._lambd / self._minibatch_size) * self._params['W'][i] + db = np.sum(dZ, axis=1, keepdims=True) / self._minibatch_size + dA = self._params['W'][i].T.dot(dZ) + self._params['dW'][i] = dW + self._params['db'][i] = db + + def train(self, X, y): + return self.fit(X, y) + + def fit(self, X, y): + self._costs = [] + tic = time.time() + if self._verbose: + print('Training neural net...{0} epochs with {1} minibatches'.format( + self._epochs, self.num_minibatches())) + divider = 1 if self._epochs < 100 else 100 + t = 0 + for e in range(self._epochs): + minibatches = self.create_minibatches(X, y) + cost_total = 0 + for minibatch in minibatches: + Xt, yt = minibatch + self._forward_propagation(Xt, train=True) + # Compute gradient descent + self._backward_propagation(yt) + t += 1 # Only used in adam + self._optim_update(t) + cost_total += self._cost_function(self._get_prediction(), yt) + cost_avg = cost_total / self.num_minibatches() + self._costs.append(cost_avg) + if e % divider == 0 and self._verbose: + print("Epoch: {0} Cost {1:.8f}".format(e, cost_avg)) + if self._epochs_decay != (): + (rate, number) = self._epochs_decay + if e > 0 and e % number == 0: + self._alpha *= rate + if self._verbose: + print( + "*Setting learning rate (alpha) to: {0}".format(self._alpha)) + self._ct = time.time() - tic + self._alpha = self._learning_rate + if self._verbose: + self.print_time() + return self._costs + + def print_time(self): + print("Elapsed time: {0:.2f} s".format(self._ct)) + + def _forward_propagation(self, X, train=False): + self._params['A'][0] = X.T + for i in range(1, self._L): + if train and self._keep_prob != 1: + d = np.random.rand(*self._params['A'][i].shape) + d = (d < self._keep_prob).astype(int) + ''' + divide by self._keep_prob is done to keep the same behavior of the neuron in training with dropout and in + testing without dropout. "This is important because at test time all neurons see all their inputs, + so we want the outputs of neurons at test time to be identical to their expected outputs at training time" + (Stanford CS231n Convolutional Neural Networks for Visual Recognition) + ''' + self._params['A'][i] = ( + self._params['A'][i] * d) / self._keep_prob # inverted dropout + self._params['Z'][i] = self._params['W'][i].dot( + self._params['A'][i - 1]) + self._params['b'][i] + self._params['A'][i] = self._g[i](self._params['Z'][i]) + prediction = self._get_AL() + + def predict(self, X): + self._forward_propagation(X, train=False) + if self._multiclass: + yhat = np.argmax(self._get_prediction(False), axis=1) + else: + yhat = self._get_prediction(transform=True) + return yhat + + def predict_proba(self, X): + self._forward_propagation(X, train=False) + return self._get_prediction(transform=False) + + def evaluate(self, X, y, transform=True): + return self.valid(X, y, transform) + + def valid(self, X, y, transform=True, score=False): + if X.shape[0] != y.shape[0]: + print('Dimension error X, y', X.shape, y.shape) + yhat = self.predict(X) + ypred = self._get_prediction(transform=True) + if score: + return self.get_accuracy(y, ypred, direct_result=True) + print(self.get_accuracy(y, ypred)) + return yhat + + def score(self, X, y): + return self.valid(X, y, score=True) + + def mislabeled(self, y, ypred, target=1): + return Metrics(y, ypred).fn_indices(target) + + def save(self, name=''): + try: + filename = "{0}.nn".format(name) + f = open(filename, 'wb') + pickle.dump(self.__dict__, f, 2) + f.close() + except: + print("I couldn't write the file ", filename) + return False + return True + + def load(self, filename): + try: + f = open(filename, 'rb') + tmp_dict = pickle.load(f) + f.close() + except: + print(filename, " doesn't exists or I couldn't open it.") + return False + self.__dict__.update(tmp_dict) + return True + + def compact_state(self): + return { + "_m": self._m, + "_n": self._n + } diff --git a/n_network/Utils.py b/n_network/Utils.py new file mode 100644 index 0000000..7bae35b --- /dev/null +++ b/n_network/Utils.py @@ -0,0 +1,44 @@ +''' +__author__ = "Ricardo Montañana Gómez" +__copyright__ = "Copyright 2020, Ricardo Montañana Gómez" +__license__ = "MIT" +Util functions to use with the classifier +''' + +import numpy as np +import matplotlib.pyplot as plt + + +def one_hot(label, num): + yht = np.zeros((label.size, num)) + yht[np.arange(label.size), label.T] = 1 + return yht + + +def plot_decision_boundary(model, X, y, binary, title): + y = y.T[0] + # Set min and max values and give it some padding + x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 + y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 + h = 0.01 + # Generate a grid of points with distance h between them + xx, yy = np.meshgrid(np.arange(x_min, x_max, h), + np.arange(y_min, y_max, h)) + # Predict the function value for the whole grid + case = np.array(np.c_[xx.ravel(), yy.ravel()]) + if type(model).__name__ == 'N_Network': + if binary: + Z = model.predict(case) + else: + Z = model.predict_proba(case) + else: + Z = model.predict(case) + Z = np.round(Z) if binary else Z + Z = Z.reshape(xx.shape) + # Plot the contour and training examples + plt.title(title + ' Decision boundary') + plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral) + plt.ylabel('x2') + plt.xlabel('x1') + plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral) + plt.show() diff --git a/n_network/__init__.py b/n_network/__init__.py new file mode 100644 index 0000000..df003d7 --- /dev/null +++ b/n_network/__init__.py @@ -0,0 +1,3 @@ +from .Neural_Network import N_Network +from .Metrics import Metrics +from .Utils import plot_decision_boundary, one_hot \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f149fbb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy +scikit-learn +matplotlib +seaborn +git+https://github.com/doctorado-ml/stree \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..858fa4f --- /dev/null +++ b/setup.py @@ -0,0 +1,38 @@ +import setuptools + +__version__ = "1.0rc1" +__author__ = "Ricardo Montañana Gómez" + +def readme(): + with open('README.md') as f: + return f.read() + + +setuptools.setup( + name='N_Network', + version=__version__, + license='MIT License', + description='A personal implementation of a Neural Network', + long_description=readme(), + long_description_content_type='text/markdown', + packages=setuptools.find_packages(), + url='https://github.com/doctorado-ml/neuralnetwork', + author=__author__, + author_email='ricardo.montanana@alu.uclm.es', + keywords='neural_network', + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python :: 3.7', + 'Natural Language :: English', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Intended Audience :: Science/Research' + ], + install_requires=[ + 'scikit-learn>=0.23.0', + 'numpy', + 'matplotlib', + 'seaborn' + ], + zip_safe=False +) diff --git a/test.ipynb b/test.ipynb new file mode 100644 index 0000000..ded6b1e --- /dev/null +++ b/test.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from stree import Stree\n", + "from n_network import N_Network, plot_decision_boundary" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def load_planar_dataset(random_seed):\n", + " np.random.seed(random_seed)\n", + " m = 400 # number of examples\n", + " N = int(m / 2) # number of points per class\n", + " D = 2 # dimensionality\n", + " X = np.zeros((m,D)) # data matrix where each row is a single example\n", + " Y = np.zeros((m, 1), dtype='uint8') # labels vector (0 for red, 1 for blue)\n", + " a = 4 # maximum ray of the flower\n", + "\n", + " for j in range(2):\n", + " ix = range(N * j, N * (j + 1))\n", + " t = np.linspace(j * 3.12, (j + 1) * 3.12, N) + np.random.randn(N) * 0.2 # theta\n", + " r = a * np.sin(4 * t) + np.random.randn(N) * 0.2 # radius\n", + " X[ix] = np.c_[r * np.sin(t), r * np.cos(t)]\n", + " Y[ix] = j\n", + " \n", + " X = X.T\n", + " Y = Y.T\n", + " return X, Y" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "X (400, 2) y (400, 1)\n" + } + ], + "source": [ + "random_seed = 1\n", + "Xtrain, ytrain = load_planar_dataset(random_seed)\n", + "X = Xtrain.T\n", + "y = ytrain.T\n", + "print('X', X.shape, 'y', y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "# Visualize the data:\n", + "plt.scatter(X[:, 0], X[:, 1], c=y.T[0], s=40, cmap=plt.cm.Spectral);\n", + "plt.title('Dataset')\n", + "plt.show();" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#Define a four layer network\n", + "nu = [X.shape[1], 10, 7, 5, 1]\n", + "xg = [0, N_Network.relu, N_Network.relu, N_Network.relu, N_Network.sigmoid]\n", + "xgprime = [0, N_Network.relu_prime, N_Network.relu_prime, N_Network.relu_prime, N_Network.sigmoid_prime]\n", + "init_params = dict(m=X.shape[0], n=X.shape[1], n_units=nu, g=xg, optim='sgd',\n", + " gprime=xgprime, epochs=10000, alpha=0.075)\n", + "nd = N_Network(init_params)\n", + "nd.set_seed(random_seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "First cost: 0.803754 final cost: 0.185819\nNumber of units in each layer: [2, 10, 7, 5, 1]\nElapsed time: 10.19 s\n" + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "costs = nd.train(X, y)\n", + "print(\"First cost: {0:.6f} final cost: {1:.6f}\".format(costs[0], costs[-1]))\n", + "print(\"Number of units in each layer: \", nu)\n", + "nd.print_time()\n", + "nd.plot_costs()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "Accuracy: 89.750% (359 of 400)\n" + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "pred = nd.valid(X, y)\n", + "indices = nd.mislabeled(y, pred)\n", + "# Plot decission boundary\n", + "plot_decision_boundary(nd, X, y, True, '4 Layers N_Network')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "0.83" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "st = Stree(C=25, max_iter=10000)\n", + "st.fit(X, y)\n", + "st.score(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "plot_decision_boundary(st, X, y, True, title='STree')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "root\nroot - Down\nroot - Down - Down\nroot - Down - Down - Down, - Leaf class=1 belief=0.883333 counts=(array([0, 1], dtype=uint8), array([ 7, 53]))\nroot - Down - Down - Up\nroot - Down - Down - Up - Down, - Leaf class=1 belief=1.000000 counts=(array([1], dtype=uint8), array([2]))\nroot - Down - Down - Up - Up, - Leaf class=0 belief=1.000000 counts=(array([0], dtype=uint8), array([16]))\nroot - Down - Up\nroot - Down - Up - Down\nroot - Down - Up - Down - Down, - Leaf class=1 belief=1.000000 counts=(array([1], dtype=uint8), array([2]))\nroot - Down - Up - Down - Up, - Leaf class=0 belief=1.000000 counts=(array([0], dtype=uint8), array([7]))\nroot - Down - Up - Up\nroot - Down - Up - Up - Down, - Leaf class=0 belief=0.789474 counts=(array([0, 1], dtype=uint8), array([15, 4]))\nroot - Down - Up - Up - Up\nroot - Down - Up - Up - Up - Down\nroot - Down - Up - Up - Up - Down - Down, - Leaf class=1 belief=0.735294 counts=(array([0, 1], dtype=uint8), array([ 9, 25]))\nroot - Down - Up - Up - Up - Down - Up\nroot - Down - Up - Up - Up - Down - Up - Down, - Leaf class=1 belief=1.000000 counts=(array([1], dtype=uint8), array([1]))\nroot - Down - Up - Up - Up - Down - Up - Up, - Leaf class=0 belief=0.714286 counts=(array([0, 1], dtype=uint8), array([5, 2]))\nroot - Down - Up - Up - Up - Up\nroot - Down - Up - Up - Up - Up - Down\nroot - Down - Up - Up - Up - Up - Down - Down\nroot - Down - Up - Up - Up - Up - Down - Down - Down\nroot - Down - Up - Up - Up - Up - Down - Down - Down - Down, - Leaf class=1 belief=0.857143 counts=(array([0, 1], dtype=uint8), array([1, 6]))\nroot - Down - Up - Up - Up - Up - Down - Down - Down - Up, - Leaf class=0 belief=0.666667 counts=(array([0, 1], dtype=uint8), array([2, 1]))\nroot - Down - Up - Up - Up - Up - Down - Down - Up, - Leaf class=1 belief=1.000000 counts=(array([1], dtype=uint8), array([1]))\nroot - Down - Up - Up - Up - Up - Down - Up\nroot - Down - Up - Up - Up - Up - Down - Up - Down, - Leaf class=0 belief=1.000000 counts=(array([0], dtype=uint8), array([1]))\nroot - Down - Up - Up - Up - Up - Down - Up - Up\nroot - Down - Up - Up - Up - Up - Down - Up - Up - Down, - Leaf class=1 belief=0.750000 counts=(array([0, 1], dtype=uint8), array([1, 3]))\nroot - Down - Up - Up - Up - Up - Down - Up - Up - Up, - Leaf class=0 belief=1.000000 counts=(array([0], dtype=uint8), array([2]))\nroot - Down - Up - Up - Up - Up - Up, - Leaf class=0 belief=0.960000 counts=(array([0, 1], dtype=uint8), array([48, 2]))\nroot - Up\nroot - Up - Down, - Leaf class=1 belief=0.735537 counts=(array([0, 1], dtype=uint8), array([32, 89]))\nroot - Up - Up, - Leaf class=0 belief=0.857143 counts=(array([0, 1], dtype=uint8), array([54, 9]))\n\n" + } + ], + "source": [ + "print(st)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.7.6-final" + }, + "orig_nbformat": 2, + "kernelspec": { + "name": "python37664bitgeneralvenvfbd0a23e74cf4e778460f5ffc6761f39", + "display_name": "Python 3.7.6 64-bit ('general': venv)" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file