From 42bb9355de615449af2871099a51aa228687eedf Mon Sep 17 00:00:00 2001 From: Valerio Maggio Date: Tue, 11 Apr 2017 19:59:02 +0200 Subject: [PATCH] Intro to tf and keras aligned w/ same examples Added `kaggle_data.py` module containing all the code for the kaggle Otto Group challenge --- 1.2 Introduction - Tensorflow.ipynb | 266 +++++---------- 1.3 Introduction - Keras.ipynb | 493 +++++++++++++--------------- kaggle_data.py | 64 ++++ 3 files changed, 381 insertions(+), 442 deletions(-) create mode 100644 kaggle_data.py diff --git a/1.2 Introduction - Tensorflow.ipynb b/1.2 Introduction - Tensorflow.ipynb index f2d774c..1085d24 100644 --- a/1.2 Introduction - Tensorflow.ipynb +++ b/1.2 Introduction - Tensorflow.ipynb @@ -811,7 +811,7 @@ "data": { "image/png": "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\nuqg9fwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -893,7 +893,7 @@ "data": { "image/png": "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\ngg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -953,7 +953,7 @@ "data": { "image/png": "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\nfy8nLy7LAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1039,40 +1039,29 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true, - "slideshow": { - "slide_type": "subslide" - } - }, + "metadata": {}, "source": [ - "## MNIST Dataset" + "\n", + "### Kaggle Challenge Data" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ - "The MNIST dataset (available at http://yann.lecun.com/exdb/mnist/), is widely used for training and testing in the field of machine learning, and we will use it in the examples of this book. It contains black and white images of handwritten digits from 0 to 9.\n", + "The Otto Group is one of the world’s biggest e-commerce companies, A consistent analysis of the performance of products is crucial. However, due to diverse global infrastructure, many identical products get classified differently.\n", + "For this competition, we have provided a dataset with 93 features for more than 200,000 products. The objective is to build a predictive model which is able to distinguish between our main product categories. \n", + "Each row corresponds to a single product. There are a total of 93 numerical features, which represent counts of different events. All features have been obfuscated and will not be defined any further.\n", "\n", - "The data set is divided into two groups: 60,000 to train the model and an additional 10,000 to test it. The original images, in black and white, were normalized to fit into a box of size 28×28 pixels and centered by calculating the center of mass of the pixels." + "https://www.kaggle.com/c/otto-group-product-classification-challenge/data" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true, - "slideshow": { - "slide_type": "subslide" - } - }, + "metadata": {}, "source": [ - "![](imgs/mnist.png)" + "##### For this section we will use the Kaggle Otto Group Challenge Data. You will find these data in \n", + "`data/kaggle_ottogroup/` folder." ] }, { @@ -1081,86 +1070,58 @@ "deletable": true, "editable": true, "slideshow": { - "slide_type": "fragment" + "slide_type": "subslide" } }, "source": [ - "```\n", - "%load mnist_data.py\n", - "```\n", - "\n", - "(Adapted from [input_data.py](https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/tutorials/mnist/input_data.py))" + "## Logistic Regression" ] }, { - "cell_type": "code", - "execution_count": 27, + "cell_type": "markdown", "metadata": { - "collapsed": false, "deletable": true, - "editable": true, - "slideshow": { - "slide_type": "skip" - } + "editable": true }, - "outputs": [], "source": [ - "# %load mnist_data.py" + "This algorithm has nothing to do with the canonical linear regression, but it is an algorithm that allows us to solve problems of classification(supervised learning). \n", + "\n", + "In fact, to estimate the dependent variable, now we make use of the so-called **logistic function** or **sigmoid**. \n", + "\n", + "It is precisely because of this feature we call this algorithm logistic regression.\n", + "\n", + "![](imgs/sigmoid.png)" ] }, { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true, - "deletable": true, - "editable": true - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "import mnist_data" + "### Data Preparation" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 27, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true + "collapsed": false }, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "Extracting ./data/mnist/train-images-idx3-ubyte.gz\n", - "Extracting ./data/mnist/train-labels-idx1-ubyte.gz\n", - "Extracting ./data/mnist/t10k-images-idx3-ubyte.gz\n", - "Extracting ./data/mnist/t10k-labels-idx1-ubyte.gz\n" + "Using TensorFlow backend.\n" ] } ], "source": [ - "mnist = mnist_data.read_data_sets(\"./data/mnist/\", one_hot=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true, - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Dataset Statistics" + "from kaggle_data import load_data, preprocess_data, preprocess_labels" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -1169,70 +1130,48 @@ "name": "stdout", "output_type": "stream", "text": [ - "55000\n", - "5000\n", - "10000\n" + "9 classes\n", + "93 dims\n" ] } ], "source": [ - "print(len(mnist.train.images))\n", - "print(len(mnist.validation.images))\n", - "print(len(mnist.test.images))" + "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n", + "X_train, scaler = preprocess_data(X_train)\n", + "Y_train, encoder = preprocess_labels(labels)\n", + "\n", + "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n", + "\n", + "X_test, _ = preprocess_data(X_test, scaler)\n", + "\n", + "nb_classes = Y_train.shape[1]\n", + "print(nb_classes, 'classes')\n", + "\n", + "dims = X_train.shape[1]\n", + "print(dims, 'dims')" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n4ScSW8j/AfkWSZR2cVBlAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "array(['Class_1', 'Class_2', 'Class_3', 'Class_4', 'Class_5', 'Class_6',\n", + " 'Class_7', 'Class_8', 'Class_9'], dtype=object)" ] }, + "execution_count": 30, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "image = mnist.train.images[5, :]\n", - "image = np.reshape(image,[28,28])\n", - "plt.imshow(image)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true, - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Logistic Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, - "source": [ - "This algorithm has nothing to do with the canonical linear regression, but it is an algorithm that allows us to solve problems of classification(supervised learning). \n", - "\n", - "In fact, to estimate the dependent variable, now we make use of the so-called **logistic function** or **sigmoid**. \n", - "\n", - "It is precisely because of this feature we call this algorithm logistic regression.\n", - "\n", - "![](imgs/sigmoid.png)" + "np.unique(labels)" ] }, { @@ -1250,7 +1189,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "metadata": { "collapsed": true, "deletable": true, @@ -1270,7 +1209,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": { "collapsed": true, "deletable": true, @@ -1282,8 +1221,8 @@ "outputs": [], "source": [ "# tf Graph Input\n", - "x = tf.placeholder(\"float\", [None, 784]) # mnist data image of shape 28*28=784\n", - "y = tf.placeholder(\"float\", [None, 10]) # 0-9 digits recognition => 10 classes" + "x = tf.placeholder(\"float\", [None, dims]) \n", + "y = tf.placeholder(\"float\", [None, nb_classes])" ] }, { @@ -1298,7 +1237,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": { "collapsed": true, "deletable": true, @@ -1307,13 +1246,13 @@ "outputs": [], "source": [ "# Set model weights\n", - "W = tf.Variable(tf.zeros([784, 10]))\n", - "b = tf.Variable(tf.zeros([10]))" + "W = tf.Variable(tf.zeros([dims, nb_classes]))\n", + "b = tf.Variable(tf.zeros([nb_classes]))" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": { "collapsed": true, "deletable": true, @@ -1330,7 +1269,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": { "collapsed": true, "deletable": true, @@ -1348,7 +1287,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": { "collapsed": true, "deletable": true, @@ -1365,7 +1304,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "collapsed": false, "deletable": true, @@ -1395,7 +1334,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "metadata": { "collapsed": true, "deletable": true, @@ -1403,27 +1342,13 @@ }, "outputs": [], "source": [ - "def training_phase():\n", - " avg_set, epoch_set = [], []\n", + "def training_phase(X, Y):\n", + " cost_epochs = []\n", " # Training cycle\n", " for epoch in range(training_epochs):\n", - " avg_cost = 0.\n", - " total_batch = int(mnist.train.num_examples/batch_size)\n", - " # Loop over all batches\n", - " for i in range(total_batch):\n", - " batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n", - " # Fit training using batch data\n", - " sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys})\n", - " # Compute average loss\n", - " avg_cost += sess.run(cost, feed_dict={x: batch_xs, y: batch_ys}) / total_batch\n", - " \n", - " # Display logs per epoch step\n", - " if epoch % display_step == 0:\n", - " print(\"Epoch:\", '%04d' % (epoch+1), \"cost=\", \"{:.9f}\".format(avg_cost))\n", - " \n", - " avg_set.append(avg_cost)\n", - " epoch_set.append(epoch+1)\n", - " return avg_set, epoch_set" + " _, c = sess.run([optimizer, cost], feed_dict={x: X, y: Y})\n", + " cost_epochs.append(c)\n", + " return cost_epochs" ] }, { @@ -1441,7 +1366,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": { "collapsed": true, "deletable": true, @@ -1449,12 +1374,12 @@ }, "outputs": [], "source": [ - "def testing_phase():\n", + "def testing_phase(X, Y):\n", " # Test model\n", " correct_prediction = tf.equal(tf.argmax(activation, 1), tf.argmax(y, 1))\n", " # Calculate accuracy\n", " accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))\n", - " print(\"Model accuracy:\", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))" + " print(\"Model accuracy:\", accuracy.eval({x: X, y: Y}))" ] }, { @@ -1472,7 +1397,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "metadata": { "collapsed": false, "deletable": true, @@ -1483,39 +1408,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch: 0001 cost= 1.174406662\n", - "Epoch: 0002 cost= 0.662001156\n", - "Epoch: 0003 cost= 0.550464896\n", - "Epoch: 0004 cost= 0.496610615\n", - "Epoch: 0005 cost= 0.463699823\n", - "Epoch: 0006 cost= 0.440842383\n", - "Epoch: 0007 cost= 0.423908034\n", - "Epoch: 0008 cost= 0.410584232\n", - "Epoch: 0009 cost= 0.399826936\n", - "Epoch: 0010 cost= 0.390904010\n", - "Epoch: 0011 cost= 0.383289029\n", - "Epoch: 0012 cost= 0.376714404\n", - "Epoch: 0013 cost= 0.370987393\n", - "Epoch: 0014 cost= 0.365903865\n", - "Epoch: 0015 cost= 0.361352632\n", - "Epoch: 0016 cost= 0.357227456\n", - "Epoch: 0017 cost= 0.353577220\n", - "Epoch: 0018 cost= 0.350052592\n", - "Epoch: 0019 cost= 0.347016569\n", - "Epoch: 0020 cost= 0.344181476\n", - "Epoch: 0021 cost= 0.341469029\n", - "Epoch: 0022 cost= 0.338967005\n", - "Epoch: 0023 cost= 0.336669330\n", - "Epoch: 0024 cost= 0.334486312\n", - "Epoch: 0025 cost= 0.332483579\n", "Training phase finished\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEPCAYAAABGP2P1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt0VPXZ9vHvHU4aaAIhghBiCIFXLYpH0FbRIFV5oEu6\nFFo08AIKta1il9QWWxoTGpVXautqbfu0VRQpINanS6vVKojGQxWF+iAVxQOHCAlYDCAHC4Hkfv/I\nZMgOOU4yMzlcn7WyVmZmz557diZzze+0x9wdERGRKgnxLkBERFoXBYOIiAQoGEREJEDBICIiAQoG\nEREJUDCIiEhAVIPBzBaa2admtr6O268zs3fMbJ2ZvWZmZ0azHhERaVi0WwwPA1fWc/tm4BJ3Pxu4\nE3ggyvWIiEgDOkdz5+7+mpll1HP76moXVwNp0axHREQa1prGGGYAf493ESIiHV1UWwyNZWajgOnA\nxfGuRUSko4t7MJjZMOCPwBh331PPdjqpk4hIBNzdmrJ9LLqSLPRz/A1mpwB/Aaa4+6aGduTu+nEn\nLy8v7jW0lh8dCx0LHYv6fyIR1RaDmS0DsoHeZvYJkAd0Bdzd/wjkAinA78zMgCPuPiKaNYmISP2i\nPSvpugZunwnMjMZjb9lSRG7uIoqLK0hLS6CgYBqZmXVOkBIRkZC4jzFEw5YtRVx++f1s2jQP6A4c\nZPXqPFaunNUuwiE7OzveJbQaOhbH6Fgco2PRPBZpH1SsmZk3ttbJk+exdOltVIZClYPk5NzLkiV5\nUalPRKQ1MjO8iYPP7bLFUFxcQTAUALpTUlIRj3LiYuDAgRQVFcW7DBGJkYyMDLZu3doi+2qXwZCW\nlgAcpGaLoX//1rSeL7qKiooinpEgIm1P5fydltEu3ykLCqaRlZVHZTgAHCQrK4+Cgmlxq0lEpK1o\nl2MMcGxWUklJBf37d7xZSaF+xXiXISIxUtf/fCRjDO02GDo6BYNIx9KSwdAuu5Kk41m2bBljxoyJ\n6L5nnHEGr7zySgtX1PqNHTuWP/3pT/Euo0FXXnkljz76aItv25KmTJnCz372s5g/brSoxdBOteYW\nQ2ZmJgsXLuSyyy6L+WNPnz6d9PT0Zv8TFxUVkZmZSY8ePQBITU3lxhtvZM6cOS1RZps1duxYXn31\nVcyMQ4cOYWZ069YNgMmTJ/O73/0uzhVGx5QpUxgyZAh33HFH3GpoyRZDu5yVJHVriRXhWlVeycz4\n/PPPMTP++c9/cumll3L++eczevToFn2c8vJyOnXq1KL7jJZnn302/HtjQrgtPbeORF1JHUjVivCl\nS2+jsLByEeDll9/Pli2NX+/QEvuozwMPPMCQIUNITU3lG9/4Bjt27AjftmLFCk477TR69erFTTfd\nRHZ2Ng899BAAjzzyCCNHjgxve+utt9K3b1969uzJ2WefzXvvvccDDzzA0qVLWbBgAUlJSYwfPx6o\nbMG8+OKLAFRUVHD33XczePBgkpOTGT58OMXFxXXWW/UJ7bzzzmPo0KGsW7cufNuOHTuYMGECffr0\nISsri/vvvz9826FDh5g6dSopKSkMHTqUn//856Snp4dvz8zMZMGCBZx11ln06NGDioqKeve3Zs0a\nhg8fTnJyMv369eO2224D4PDhw0yZMoXU1FR69erFBRdcwK5duwAYNWpU+Pi5O3feeScDBw7k5JNP\nZtq0aezbtw+obB0lJCSwePFiMjIy6NOnD3fffXej/6bVrVq1iszMTObPn0+/fv349re/ze7duxk3\nbhx9+vShd+/eXHXVVZSUlITvM3LkSBYvXgzAwoULyc7OZvbs2fTq1YvBgwezcuXKiLbdvHkzI0eO\nJDk5mTFjxvC9732P6dOn11t3QUEBqampZGVl8dhjjwW2KS0tZezYsSQlJXHRRRcF1hHNmjWL9PR0\nevbsyQUXXMAbb7wRvu3NN9/kvPPOC//tqrc6//GPf/CVr3yFXr16ce655/Lqq69GctibLt5n/mvC\nGQJdGq+245WTk+9wwMGr/RzwnJz8Ru+3JfYxcOBAX7Vq1XHXr1q1ylNTU33dunVeVlbms2bN8ksu\nucTd3Xft2uVJSUn+5JNPenl5uf/qV7/yrl27+sKFC93dfdGiRT5y5Eh3d3/++ef9/PPP93379rm7\n+8aNG33nzp3u7j5t2jTPzc2ts54FCxb4sGHD/KOPPnJ39/Xr1/vu3buPq3Xr1q2ekJDgR48edXf3\nN954w7t37+5PPvmku7tXVFT4eeed53feeacfPXrUt2zZ4llZWb5ixQp3d58zZ45nZ2f7559/7sXF\nxT5s2DBPT08P1HTOOed4cXGxHzp0qMH9feUrX/ElS5a4u/vBgwf9zTffdHf3P/zhD37VVVeF9/H2\n22/7/v373d09Ozs7fPwWLlzoQ4YM8a1bt/rBgwf96quv9ilTpoSfq5n5t7/9bT98+LC/88473q1b\n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\nbhyJiYmceOKJJCYmMm/ePC677DIKCgq4+uqrSUtLY8uWLeE+9N69e/P444/zwx/+kNTUVDZu3Mj5\n558f6Aqosm/fPmbOnElKSgqZmZmkpqaGZ+nccMMNbNiwgZSUFK6++mog+Al29uzZfPOb3+SKK64g\nOTmZGTNm8J///KfW51Dzk++4ceNISUnhgQceICEhgaeffpp169aRmZlJnz59mDlzZnimzx133EFa\nWhqZmZlcccUVTJw4MfBcau67of0999xzDB06lKSkJG699VYee+wxunbtys6dO5kwYQLJyckMHTqU\nUaNGkZOTc9xjXH/99UyZMoVLLrmErKwsEhMT+fWvf11nPY05YVtjT+o2e/Zs9u7dS+/evbn44ouP\n6+tvaD/Vb2/Kto8++igvv/wyqampFBQUMGnSpFpfT1XS09Pp3r07/fr1Y/r06SxcuDDc7Vjf444d\nO5bRo0czZMgQBg0aRM+ePenXr1/49meffZbTTz+d5ORkfvSjH/HnP/+Zzp07k5GRwRNPPEFBQQEn\nnXQSAwcO5Je//GV43CeatMCtnWrNC9xagrszYMAAli1bxqWXXhrvcprt97//PY899hgvvfRSvEvp\nsKoGj+fOnXvcbatWrWLmzJn1tjbjTafEkA5pxYoVfP755xw+fJi77roLgAsvvDDOVUVm586dvP76\n67g7H3zwAb/4xS/CLRiJjTVr1rB161bcnWeffZZnnnkmPKuso9PKZ2kz3njjDa677jqOHDnCl7/8\nZf7617/W2/RvzcrKyrjxxhvZunUrPXv25Nprr+W73/1uvMvqUEpKSrjmmmvYs2cPAwYM4MEHH+SM\nM86Id1mtgrqS2qn23pUkIkHqShIRkahRMIiISICCQUREAjT43E5lZGS06JeDi0jrVv2UJs2lwWcR\nkXZMg88iItJsCgYREQlQMIiISICCQUREAhQMIiISoGAQEZEABYOIiAQoGEREJEDBICIiAQoGEREJ\nUDCIiEiAgkFERAIUDCIiEqBgEBGRAAWDiIgERDUYzGyhmX1qZuvr2ebXZvaRma0zs7OjWY+IiDQs\n2i2Gh4Er67rRzP4LyHL3IcCNwO+jXI+IiDQgqsHg7q8Be+rZZDywOLTtm0CymfWNZk0iIlK/eI8x\npAHbql0uDl0nIiJx0jnOj1/b95DW+cXO+fn54d+zs7PJzs5u+YpERNqwwsJCCgsLm7UPc6/zfbhF\nmFkG8LS7D6vltt8DL7n7Y6HLG4FL3f3TWrb1aNcqItLemBnuXtuH8DrFoivJqL1lAPAU8H8BzOxC\nYG9toSAiIrET1a4kM1sGZAO9zewTIA/oCri7/9HdnzWzsWb2MXAQmB7NekREpGFR70pqKepKEhFp\nutbalSQiIm2IgkFERAIUDCIiEqBgEBGRAAWDiIgEKBhERCRAwSAiIgEKBhERCVAwiIhIgIJBREQC\nFAwiIhKgYBARkQAFg4iIBCgYREQkQMEgIiIBCgYREQlQMIiISICCQUREAhQMIiISoGAQEZEABYOI\niAQoGEREJEDBICIiAQoGEREJUDCIiEiAgkFERAIUDCIiEqBgEBGRAAWDiIgEKBhERCRAwSAiIgEK\nBhERCVAwiIhIgIJBREQCFAwiIhKgYBARkQAFg4iIBCgYREQkQMEgIiIBCgYREQmIejCY2Rgz22hm\nH5rZnFpuTzezF83sbTNbZ2b/Fe2aRESkbubu0du5WQLwITAaKAHWAJPcfWO1bf4AvO3ufzCz04Fn\n3T2zln15NGsVEWmPzAx3t6bcJ9othhHAR+5e5O5HgOXA+BrbVABJod97AsVRrklEROrROcr7TwO2\nVbu8ncqwqG4esMLMbgESga9FuSYREalHtFsMtTVfavYHXQs87O7pwDhgSZRrEhGRekS7xbAdOKXa\n5QFUjjVUdwNwJYC7rzazE8ws1d0/q7mz/Pz88O/Z2dlkZ2e3dL0iIm1aYWEhhYWFzdpHtAefOwEf\nUDn4vAN4C7jW3d+vts0zwJ/d/ZHQ4PNKdx9Qy740+Cwi0kStbvDZ3cuBm4EVwAZgubu/b2bzzOzr\noc1uA2aa2TpgKTA1mjWJiEj9otpiaElqMYiINF3UWgxmNrEx14mISNvXqBaDmb3t7uc2dF00qcUg\nItJ0kbQY6p2VFDo9xVggzcx+Xe2mJOBo00sUEZHWrqHpqiXAWuAq4J/Vrt8P3BqtokREJH4a25XU\nJXRKC8ysF5Du7uujXVyNGtSVJCLSRNGcrrrSzJLMLAV4G3jAzO5rcoUiItLqNTYYkt19H3A1sNjd\nL6By0ZqIiLQzjQ2GzmbWD/gm8Lco1iMiInHW2GD4GfA8sMnd15jZIOCj6JUlIiLxopXPIiLtWDRX\nPg8wsyfM7N9m9qmZ/cXMjjvRnYiItH2N7Up6GHgK6E/ll+88HbpORETamcauY1jn7mc3dF00qStJ\nRKTpormO4TMzm2xmnUI/k4HSppcoIiKtXWOD4Xoqp6rupPILdyYA06NVlIiIxE9jv9qzAJjq7nsA\nQiug76UyMEREpB1pbIthWFUoALj7buCc6JQkIiLx1NhgSAidPA8Itxga29oQEZE2pLFv7r8AXjez\n/wGcyvGGu6JWlYiIxE2jVz6b2ZeBywADVrn7e9EsrJbH13RVEZEmimS6qk6JISLSjkVzHYOIiHQQ\nCgYREQlQMIiISICCQUREAhQMIiISoGAQEZEArV6uZsuWInJzF1FcXEFaWgIFBdPIzMyId1kiIjGl\ndQwhW7YUcfnl97Np0zygO3CQrKw8Vq6cpXAQkTZL6xiaITd3UbVQAOjOpk3zyM1dFMeqRERiT8EQ\nUlxcwbFQqNKdkpKKeJQjIhI3CoaQtLQE4GCNaw/Sv78OkYh0LHrXCykomEZWVh7HwqFyjKGgYFrc\nahIRiQcNPldTNSuppKSC/v01K0lE2j6dXVVERAI0K0lERJpNwSAiIgEKBhERCVAwiIhIgIJBREQC\nFAwiIhIQ9WAwszFmttHMPjSzOXVs800z22Bm/zKzJdGuSURE6hbVdQxmlgB8CIwGSoA1wCR331ht\nm8HAY8Aod99nZqnu/lkt+9I6BhGRJmqN6xhGAB+5e5G7HwGWA+NrbDMT+K277wOoLRRERCR2oh0M\nacC2ape3h66r7v8Ap5rZa2b2upldGeWaRESkHtH+Brfami81+4M6A4OBS4BTgFfNbGhVC6K6/Pz8\n8O/Z2dlkZ2e3WKEiIu1BYWEhhYWFzdpHtMcYLgTy3X1M6PLtgLv7PdW2+W/gDXdfHLr8AjDH3f9Z\nY18aYxARaaLWOMawBhhsZhlm1hWYBDxVY5sngcsAzCwVGAJsjnJdIiJSh6gGg7uXAzcDK4ANwHJ3\nf9/M5pnZ10PbPA+UmtkGYBVwm7vviWZdIiJSN512W0SkHWuNXUkiItLGKBhERCRAwSAiIgEKBhER\nCVAwiIhIQLRXPrd7W7YUkZu7iOLiCtLSEigomEZmZka8yxIRiZimqzbDli1FXH75/WzaNA/oDhwk\nKyuPlStnKRxEpFXQdNUYy81dVC0UALqzadM8cnMXxbEqEZHmUTA0Q3FxBcdCoUp3Skoq4lGOiEiL\nUDA0Q1paAnCwxrUH6d9fh1VE2i69gzVDQcE0srLyOBYOlWMMBQXT4laTiEhzafC5mapmJZWUVNC/\nv2YliUjrEsngs4JBRKQd06wkERFpNgWDiIgEKBhERCRAwSAiIgEKBhERCdBJ9OJEJ98TkdZK01Xj\nQCffE5FY0XTVNkIn3xOR1kzBEAc6+Z6ItGYKhjjQyfdEpDXTO1Ec6OR7ItKaafA5TnTyPRGJBZ1E\nT0REAiIJBq1jaEO09kFEYkEthjZCax9EJBJax9COae2DiMSKgqGN0NoHEYkVBUMbobUPIhIreldp\nI7T2QURiRYPPbUikax80m0mk49I6BjmOZjOJdGyalSTH0WwmEWkqBUM7p9lMItJUWvnczh2bzVQ9\nHBqezaRxCZGOS2MM7VwkYwwalxBpPzT4LLVq6mymyZPnsXTpbdRsZeTk3MuSJXnRLldEWpBOoie1\nyszMaNIbeqTjEup+EmkfFAxynEjGJWrrflq9Wt1PIm1R1GclmdkYM9toZh+a2Zx6tptgZhVmdm60\na5L6RbLKWtNiRdqPqLYYzCwB+A0wGigB1pjZX919Y43tegCzgNXRrEcaJzMzg5UrZ5Gbe2+1cYn6\nP/k3Z1qsuqBEWpdodyWNAD5y9yIAM1sOjAc21tiuALgH+GGU65FGauq4RHOmxaoLSqR1iXZXUhqw\nrdrl7aHrwszsbGCAuz8b5VokiiI9yV+kXVBbthQxefI8Ro3KY/LkeWzZUtSc8kWkmmi3GGqbIhWe\nc2pmBtwHTG3gPgDk5+eHf8/OziY7O7vZBUrLiKT7CSLrglIrQ6RuhYWFFBYWNmsfUV3HYGYXAvnu\nPiZ0+XbA3f2e0OUk4GPgAJWBcDJQClzl7m/X2JfWMbRDkayZaM46C41nSEfTGtcxrAEGm1kGsAOY\nBFxbdaO77wP6VF02s5eA2e7+v1GuS1qJgoJprF6dd9wq64KCWXXepznrLNTSEGlYVMcY3L0cuBlY\nAWwAlrv7+2Y2z8y+XttdqKcrSdqfqi6onJx7GTUqj5ycext8o4702+w0niHSSO7eJn4qSxVx37x5\nq2dl/cDhgIM7HPCsrB/45s1b671fdvYdoe2DP6NG3dHij7V581bPycn37Ow7PCcnv8HtRaIl9N7Z\npPdbrXyWNifSge5IptTW3cqoezyjOV1WGgORVqGpSRKvH9RikGaK5NN/JK2MnJz8ao/h4cfKyclv\n8fpEGkIELQZ9UY90GLEaz4h0cFxjINJaqCtJOpSmruiOZNZUpKvAY7mmQ11WUq+mNjHi9YO6kiRO\nqgaSR41q3EBypF1CkXRBRXKf5nRZRTKoroH4+CKCrqS4v+E3ulAFg7QhTQ2Tqvu0tzGQWIeQHE/B\nINLGNTVQInmTjyRMIn2sWA/EK0yOF0kwaIxBpBVpb2MgLT8Q3/LThCMdb2nX4zRNTZJ4/aAWg0it\n2tsYiHvsusia0zKJZYumOS0h1JUkIo0RqzGQWIZQLMdb2lIIKRhEJKoiDZRYhFAsx1vaVgg1PRg0\nxiAijdbUMZDm3Keppz2J5XhLJPeLdLwlkvsdP0bTNAoGEWmVmhoosQqTSO8X/xBqvKh+UU9L0hf1\niEg0VM0uOhYmTZuV1Nj71TZrKiurcbOmmnq/4JdZNf2LehQMIiIxEp8Q6qFgEBGRY2GydGl+k4NB\nZ1dtg5r7Rd/tiY7FMToWx+hYRDboX0XB0AbpRX+MjsUxOhbH6Fg0j4JBREQCFAwiIhLQpgaf412D\niEhb1G5nJYmISGyoK0lERAIUDCIiEtAmgsHMxpjZRjP70MzmxLueeDKzrWb2jpn9r5m9Fe96YsnM\nFprZp2a2vtp1vcxshZl9YGbPm1lyPGuMlTqORZ6ZbTezt0M/Y+JZYyyY2QAze9HM3jOzf5nZLaHr\nO9zropZjMSt0fZNfF61+jMHMEoAPgdFACbAGmOTuG+NaWJyY2WbgPHffE+9aYs3MLgYOAIvdfVjo\nunuAUndfEPrQ0Mvdb49nnbFQx7HIA/a7+y/jWlwMmdnJwMnuvs7MegD/BMYD0+lgr4t6jsW3aOLr\noi20GEYAH7l7kbsfAZZT+WQ7KqNt/N1anLu/BtQMxPHAI6HfHwG+EdOi4qSOYwGVr48Ow913uvu6\n0O8HgPeBAXTA10UdxyItdHO7OyVGGrCt2uXtHHuyHZEDz5vZGjObGe9iWoE+7v4pVP5jACfFuZ54\nu8nM1pnZgx2h+6Q6MxsInA2sBvp25NdFtWPxZuiqJr0u2kIw1JZ0rbv/K7q+6u7nA2Op/GNfHO+C\npNX4HZDl7mcDO4GO1KXUA/gf4PuhT8sd9j2ilmPR5NdFWwiG7cAp1S4PoHKsoUMKffrB3XcBT1DZ\n1daRfWpmfSHcx/rvONcTN+6+q9opiB8Ahseznlgxs85UvhH+yd3/Grq6Q74uajsWkbwu2kIwrAEG\nm1mGmXUFJgFPxbmmuDCzxNCnAcysO3AF8G58q4o5I9iKfAqYFvp9KvDXmndoxwLHIvQGWOVqOs5r\n4yHgPXf/VbXrOurr4rhjEcnrotXPSoLK6arAr6gMsoXu/v/iXFJcmFkmla0Ep/JrWZd2pGNhZsuA\nbKA38CkiyQUkAAACLklEQVSQBzwJPA6kA58AE919b7xqjJU6jsUoKvuVK4CtwI1V/eztlZldBLwC\n/IvK/wsHfgK8BfyZDvS6qOdYXEcTXxdtIhhERCR22kJXkoiIxJCCQUREAhQMIiISoGAQEZEABYOI\niAQoGEREJEDBIBIDZnapmT0d7zpEGkPBIBI7WjQkbYKCQaQaM8sxszdDX2jy32aWYGb7zeyXZvau\nma00s96hbc82szdCZ638S9VZK80sK7TdOjNbG1qxDvAlM3vczN43sz/F7UmKNEDBIBJiZqdR+aUm\nX3X3c6k8hUAOkAi85e5nUHnKgbzQXR4Bfhg6a+W71a5fCtwfuv6rwI7Q9WcDtwBfBrLM7KvRf1Yi\nTdc53gWItCKjgXOBNWZmwAlUnoeogsrz7gAsAf5iZklAcugLc6AyJP4cOslhmrs/BeDuZQCVu+Mt\nd98RurwOGAi8HoPnJdIkCgaRYwx4xN3nBq40y62xnVfbvrZ91OVwtd/L0f+ftFLqShI5ZhUwwcxO\ngvAXyp8CdAImhLbJAV5z933A7tAZLQGmAC+7+35gm5mND+2jq5mdGNNnIdJM+sQiEuLu75vZT4EV\nZpYAlAE3AweBEaGWw6dUjkNA5Xn+/xB6499M5RfQQ2VI/NHMfhbax8TaHi56z0SkeXTabZEGmNl+\nd/9SvOsQiRV1JYk0TJ+epENRi0FERALUYhARkQAFg4iIBCgYREQkQMEgIiIBCgYREQlQMIiISMD/\nB7TXZhORdklGAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEPCAYAAABRHfM8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNW9//H3N3JRkAQCCBowQOpDvVGtNKXKwVBaL3Aq\nLUqLBiqgntZ66fFKa4sJphyVQ+1Pe/EUxQsCamsPXipVVJr6eJCbiiIItQgRQRAjt6AQSL6/P2Yy\nTMIkmUDm/nk9Dw8ze6+999o7M/s7e6313dvcHRERkeZkJboCIiKSGhQwREQkKgoYIiISFQUMERGJ\nigKGiIhERQFDRESiEtOAYWa9zGyhma02s5Vmdn2EMpeZ2dtmtsLMXjOzAWHzLjCzNWb2TzObFMu6\niohI0yyWeRhm1hPo6e4rzOxY4A1gpLuvCSszCHjP3Xea2QVAqbsPMrMs4J/AMGAzsAwYE76siIjE\nT0yvMNx9i7uvCL6uAt4D8hqUWezuO4NvF4fNLwTed/cKd98PPAGMjGV9RUSkcXHrwzCzPsAZwJIm\nil0J/C34Og/YGDbvIxoEGxERiZ828dhIsDnqKeCnwSuNSGWGAhOAwXWTIhTTfUxERBIk5gHDzNoQ\nCBaPufszjZQZAMwALnD37cHJHwEnhhXrRaAvI9LyCiQiIi3k7pF+mDcqHk1SDwGr3f3eSDPN7ETg\nL8A4d18XNmsZ8CUzyzezdsAY4NnGN+NAFcXFpbh7xv4rKSlJeB2S4Z+Og46FjkXT/w5HTK8wzOwc\noBhYaWZvETir3wbkA+7uM4DJQC7wBzMzYL+7F7p7jZldCywgENhmuvt7TW+xI5s318Zsf0REMllM\nA4a7/x9wVDNlrgKuamTeC0D/6Le4hxNOUC6iiEgspNHZdQ8FBSWUlY1PdEUSqqioKNFVSAo6Dgfp\nWBykY3FkYpq4Fy9m5sXFpZSVjadv3/xEV0dEJOmZGd7CTu+0CRjpsB/x0KdPHyoqKhJdDRGJk/z8\nfDZs2HDIdAUMaVbwQ5LoaohInDT2nT+cgJFGfRgiIhJLccn0Tibr11cwefIjbNpUS15elvo9RESi\nlFFNUuvXV/Dtb/+WdeumAB2pG1n10kvXZUzQUJOUSGZRk9Rhmjz5kbBgAdCRdeumMHnyIwmslcTS\n3LlzueCCCw5r2dNOO41XX321lWuU/IYPH85jjz2W6Go06/zzz+fxxx9v9bKtady4cdxxxx1x326s\nZFTA2LSploPBoo6yw5NF3759WbhwYauu87LLLuOFF15ottyECRO4/fbb60179913GTJkSIu2V1FR\nQVZWFtnZ2WRnZ9OvXz/uvvvuFq0j0ebPn8+4ceNadZ3Dhw+nU6dOZGdn065dO9q3bx86Rj/5yU8O\na50vvvgil156aauXlcZlVB9GXl4WsIf6QUPZ4dA6fTvqHwowM3bu3ImZ8cYbb3DuuecycOBAhg0b\n1qrbqamp4aijmryRQtKYP39+6PWECRPo3bt3k7+8U2nfMkqib4DVSjfR8mh88MEGLyi4yaHKwR2q\nvKDgJv/ggw1RLZ8OIh2r1jgurbGOPn36+CuvvBJx3owZM/xLX/qSd+3a1UeOHOmbN28OzXvxxRe9\nf//+3rlzZ//JT37i5557rs+cOdPd3R955BEfPHhwqOx//ud/+nHHHec5OTn+la98xVetWuUzZszw\ntm3bevv27b1Tp05+0UUXHVKfmpoanzp1qhcUFHh2drYPHDjQP/roo0PquWHDBs/KyvKamprQtMLC\nQp8+fXro/ebNm/3iiy/27t27e79+/fy+++4Lzfviiy/8hz/8oXfp0sVPOeUUnzZtmvfq1aveMbr7\n7rt9wIABfvTRR3tNTU2T61u6dKkPHDjQs7OzvWfPnn7TTTe5u/vevXt97Nix3rVrV+/cubMXFhb6\nJ5984u7uRUVFoeNXW1vrZWVlnp+f7z169PDLL7/cd+7cGdpXM/NHH33UTzzxRO/evbtPnTq18T9w\n0Pjx433y5Mn1pr388svep08f/6//+i/v2bOnT5w40SsrK3348OHevXt3z83N9e985zu+adOm0DKD\nBw/2Rx991N3dH3zwQT/33HP9hhtu8M6dO3tBQYEvWLDgsMquW7fOBw8e7NnZ2X7++ef71Vdf7ePH\nj4+4L3X1vuOOO7xr167er18/f+KJJ0Lzx44d69dff71feOGF3qlTJz/77LN9w4aD34lrr73We/Xq\n5Tk5OV5YWOiLFi0KzVu8eLF/9atfDf3tbr311tC81157zQcNGuSdO3f2M88801999dVGj3dj58fg\n9Jada1u6QDL+izZguAdObMXFpT506O1eXFyaUcHCPfKHp7i4NOxE76ETfnFxadTrbY11NBYwXnnl\nFe/WrZuvWLHCq6ur/brrrvMhQ4a4u/u2bds8Ozvbn376aa+pqfF7773X27VrVy9g/Nu//Zu7BwLL\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1525,7 +1425,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model accuracy: 0.9137\n" + "[1 5 5 ..., 2 1 1]\n" ] } ], @@ -1537,18 +1437,18 @@ " writer = tf.summary.FileWriter(\"/tmp/logistic_logs\", session.graph)\n", " \n", " sess.run(init)\n", - " avg_set, epoch_set = training_phase()\n", + " cost_epochs = training_phase(X_train, Y_train)\n", " print(\"Training phase finished\")\n", " \n", " #plotting\n", - " plt.plot(epoch_set,avg_set, 'o', label='Logistic Regression Training phase')\n", + " plt.plot(range(len(cost_epochs)), cost_epochs, 'o', label='Logistic Regression Training phase')\n", " plt.ylabel('cost')\n", " plt.xlabel('epoch')\n", " plt.legend()\n", " plt.show()\n", " \n", - " #Testing\n", - " testing_phase()" + " prediction = tf.argmax(activation, 1)\n", + " print(prediction.eval({x: X_test}))" ] }, { diff --git a/1.3 Introduction - Keras.ipynb b/1.3 Introduction - Keras.ipynb index 2431089..670d401 100644 --- a/1.3 Introduction - Keras.ipynb +++ b/1.3 Introduction - Keras.ipynb @@ -1,68 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true, - "deletable": true, - "editable": true - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.preprocessing import LabelEncoder\n", - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], - "source": [ - "from keras.utils import np_utils\n", - "from keras.callbacks import EarlyStopping, ModelCheckpoint\n", - "from keras.models import Sequential\n", - "from keras.layers import Dense, Activation" - ] - }, { "cell_type": "markdown", "metadata": { @@ -70,8 +7,9 @@ "editable": true }, "source": [ - "For this section we will use the Kaggle otto challenge.\n", - "If you want to follow, Get the data from Kaggle: https://www.kaggle.com/c/otto-group-product-classification-challenge/data" + "\n", + "\n", + "## Keras: Deep Learning library for Theano and TensorFlow" ] }, { @@ -81,7 +19,8 @@ "editable": true }, "source": [ - "#### About the data" + "Keras is a minimalist, highly modular neural networks library, written in Python and capable of running on top of either TensorFlow or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research.\n", + "ref: https://keras.io/" ] }, { @@ -91,142 +30,70 @@ "editable": true }, "source": [ - "The Otto Group is one of the world’s biggest e-commerce companies, A consistent analysis of the performance of products is crucial. However, due to diverse global infrastructure, many identical products get classified differently.\n", - "For this competition, we have provided a dataset with 93 features for more than 200,000 products. The objective is to build a predictive model which is able to distinguish between our main product categories. \n", - "Each row corresponds to a single product. There are a total of 93 numerical features, which represent counts of different events. All features have been obfuscated and will not be defined any further.\n", + "## Why this name, Keras?\n", "\n", - "https://www.kaggle.com/c/otto-group-product-classification-challenge/data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true, - "deletable": true, - "editable": true - }, - "outputs": [], - "source": [ - "def load_data(path, train=True):\n", - " \"\"\"Load data from a CSV File\n", - " \n", - " Parameters\n", - " ----------\n", - " path: str\n", - " The path to the CSV file\n", - " \n", - " train: bool (default True)\n", - " Decide whether or not data are *training data*.\n", - " If True, some random shuffling is applied.\n", - " \n", - " Return\n", - " ------\n", - " X: numpy.ndarray \n", - " The data as a multi dimensional array of floats\n", - " ids: numpy.ndarray\n", - " A vector of ids for each sample\n", - " \"\"\"\n", - " df = pd.read_csv(path)\n", - " X = df.values.copy()\n", - " if train:\n", - " np.random.shuffle(X) # https://youtu.be/uyUXoap67N8\n", - " X, labels = X[:, 1:-1].astype(np.float32), X[:, -1]\n", - " return X, labels\n", - " else:\n", - " X, ids = X[:, 1:].astype(np.float32), X[:, 0].astype(str)\n", - " return X, ids" + "Keras (κέρας) means _horn_ in Greek. It is a reference to a literary image from ancient Greek and Latin literature, first found in the _Odyssey_, where dream spirits (_Oneiroi_, singular _Oneiros_) are divided between those who deceive men with false visions, who arrive to Earth through a gate of ivory, and those who announce a future that will come to pass, who arrive through a gate of horn. It's a play on the words κέρας (horn) / κραίνω (fulfill), and ἐλέφας (ivory) / ἐλεφαίρομαι (deceive).\n", + "\n", + "Keras was initially developed as part of the research effort of project ONEIROS (Open-ended Neuro-Electronic Intelligent Robot Operating System).\n", + "\n", + ">_\"Oneiroi are beyond our unravelling --who can be sure what tale they tell? Not all that men look for comes to pass. Two gates there are that give passage to fleeting Oneiroi; one is made of horn, one of ivory. The Oneiroi that pass through sawn ivory are deceitful, bearing a message that will not be fulfilled; those that come out through polished horn have truth behind them, to be accomplished for men who see them.\"_ Homer, Odyssey 19. 562 ff (Shewring translation)." ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": { - "collapsed": false, "deletable": true, "editable": true }, - "outputs": [], "source": [ - "def preprocess_data(X, scaler=None):\n", - " \"\"\"Preprocess input data by standardise features \n", - " by removing the mean and scaling to unit variance\"\"\"\n", - " if not scaler:\n", - " scaler = StandardScaler()\n", - " scaler.fit(X)\n", - " X = scaler.transform(X)\n", - " return X, scaler\n", + "### Kaggle Challenge Data (again)\n", "\n", - "\n", - "def preprocess_labels(labels, encoder=None, categorical=True):\n", - " \"\"\"Encode labels with values among 0 and `n-classes-1`\"\"\"\n", - " if not encoder:\n", - " encoder = LabelEncoder()\n", - " encoder.fit(labels)\n", - " y = encoder.transform(labels).astype(np.int32)\n", - " if categorical:\n", - " y = np_utils.to_categorical(y)\n", - " return y, encoder" + "See: [Data Description](1.2 Introduction - Tensorflow.ipynb#kaggle)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Loading data...\n", - "[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 3. 0. 0. 0. 3.\n", - " 2. 1. 0. 0. 0. 0. 0. 0. 0. 5. 3. 1. 1. 0.\n", - " 0. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0.\n", - " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0. 0. 0. 0. 0. 0. 0. 3. 0. 0. 0. 0. 1. 1.\n", - " 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0. 11. 1. 20. 0. 0. 0. 0. 0.]]\n", "9 classes\n", "93 dims\n" ] } ], "source": [ - "print(\"Loading data...\")\n", - "X, labels = load_data('data/train.csv', train=True)\n", - "X, scaler = preprocess_data(X)\n", - "Y, encoder = preprocess_labels(labels)\n", - "\n", + "from kaggle_data import load_data, preprocess_data, preprocess_labels\n", "\n", - "X_test, ids = load_data('data/test.csv', train=False)\n", - "X_test, ids = X_test[:1000], ids[:1000]\n", + "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n", + "X_train, scaler = preprocess_data(X_train)\n", + "Y_train, encoder = preprocess_labels(labels)\n", "\n", - "#Plotting the data\n", - "print(X_test[:1])\n", + "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n", "\n", "X_test, _ = preprocess_data(X_test, scaler)\n", "\n", - "nb_classes = Y.shape[1]\n", + "nb_classes = Y_train.shape[1]\n", "print(nb_classes, 'classes')\n", "\n", - "dims = X.shape[1]\n", + "dims = X_train.shape[1]\n", "print(dims, 'dims')" ] }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, - "source": [ - "Now lets create and train a logistic regression model." - ] - }, { "cell_type": "markdown", "metadata": { @@ -244,51 +111,24 @@ "editable": true }, "source": [ - "# Keras\n", - "\n", - "## Deep Learning library for Theano and TensorFlow" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, - "source": [ - "Keras is a minimalist, highly modular neural networks library, written in Python and capable of running on top of either TensorFlow or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research.\n", - "ref: https://keras.io/" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, - "source": [ - "## Why this name, Keras?\n", - "\n", - "Keras (κέρας) means _horn_ in Greek. It is a reference to a literary image from ancient Greek and Latin literature, first found in the _Odyssey_, where dream spirits (_Oneiroi_, singular _Oneiros_) are divided between those who deceive men with false visions, who arrive to Earth through a gate of ivory, and those who announce a future that will come to pass, who arrive through a gate of horn. It's a play on the words κέρας (horn) / κραίνω (fulfill), and ἐλέφας (ivory) / ἐλεφαίρομαι (deceive).\n", - "\n", - "Keras was initially developed as part of the research effort of project ONEIROS (Open-ended Neuro-Electronic Intelligent Robot Operating System).\n", - "\n", - ">_\"Oneiroi are beyond our unravelling --who can be sure what tale they tell? Not all that men look for comes to pass. Two gates there are that give passage to fleeting Oneiroi; one is made of horn, one of ivory. The Oneiroi that pass through sawn ivory are deceitful, bearing a message that will not be fulfilled; those that come out through polished horn have truth behind them, to be accomplished for men who see them.\"_ Homer, Odyssey 19. 562 ff (Shewring translation)." + "## Hands On - Keras Logistic Regression\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 2, "metadata": { - "deletable": true, - "editable": true + "collapsed": false }, + "outputs": [], "source": [ - "## Hands On - Keras Logistic Regression\n" + "from keras.models import Sequential\n", + "from keras.layers import Dense, Activation" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, @@ -303,51 +143,51 @@ "Building model...\n", "9 classes\n", "Epoch 1/10\n", - "61878/61878 [==============================] - 2s - loss: 1.0935 \n", + "61878/61878 [==============================] - 2s - loss: 1.0577 \n", "Epoch 2/10\n", - "61878/61878 [==============================] - 2s - loss: 0.7749 \n", + "61878/61878 [==============================] - 3s - loss: 0.7702 \n", "Epoch 3/10\n", - "61878/61878 [==============================] - 3s - loss: 0.7303 \n", + "61878/61878 [==============================] - 2s - loss: 0.7283 \n", "Epoch 4/10\n", - "61878/61878 [==============================] - 2s - loss: 0.7084 \n", + "61878/61878 [==============================] - 2s - loss: 0.7075 \n", "Epoch 5/10\n", - "61878/61878 [==============================] - 3s - loss: 0.6949 \n", + "61878/61878 [==============================] - 2s - loss: 0.6945 \n", "Epoch 6/10\n", - "61878/61878 [==============================] - 3s - loss: 0.6856 \n", + "61878/61878 [==============================] - 2s - loss: 0.6854 \n", "Epoch 7/10\n", - "61878/61878 [==============================] - 3s - loss: 0.6788 \n", + "61878/61878 [==============================] - 2s - loss: 0.6787 \n", "Epoch 8/10\n", - "61878/61878 [==============================] - 2s - loss: 0.6737 \n", + "61878/61878 [==============================] - 2s - loss: 0.6735 \n", "Epoch 9/10\n", - "61878/61878 [==============================] - 3s - loss: 0.6693 \n", + "61878/61878 [==============================] - 2s - loss: 0.6694 \n", "Epoch 10/10\n", - "61878/61878 [==============================] - 2s - loss: 0.6660 \n" + "61878/61878 [==============================] - 2s - loss: 0.6659 \n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 8, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dims = X.shape[1]\n", + "dims = X_train.shape[1]\n", "print(dims, 'dims')\n", "print(\"Building model...\")\n", "\n", - "nb_classes = Y.shape[1]\n", + "nb_classes = Y_train.shape[1]\n", "print(nb_classes, 'classes')\n", "\n", "model = Sequential()\n", "model.add(Dense(nb_classes, input_shape=(dims,)))\n", "model.add(Activation('softmax'))\n", "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n", - "model.fit(X, Y)" + "model.fit(X_train, Y_train)" ] }, { @@ -546,9 +386,9 @@ "editable": true }, "source": [ - "\n", + "\n", "\n", - "Credits: Yam Peleg ([@Yampeleg](https://twitter.com/yampeleg))" + "Source & Reference: http://sebastianruder.com/content/images/2016/09/saddle_point_evaluation_optimizers.gif" ] }, { @@ -618,9 +458,64 @@ "Next: we will use two of keras's callbacks EarlyStopping and ModelCheckpoint" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see first the model we implemented" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_2 (Dense) (None, 9) 846 \n", + "_________________________________________________________________\n", + "activation_2 (Activation) (None, 9) 0 \n", + "=================================================================\n", + "Total params: 846.0\n", + "Trainable params: 846.0\n", + "Non-trainable params: 0.0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from keras.callbacks import EarlyStopping, ModelCheckpoint" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, @@ -631,42 +526,68 @@ "name": "stdout", "output_type": "stream", "text": [ - "Train on 44706 samples, validate on 7890 samples\n", + "Train on 52596 samples, validate on 9282 samples\n", "Epoch 1/20\n", - "44706/44706 [==============================] - 0s - loss: 0.6569 - val_loss: 0.6697\n", + "52596/52596 [==============================] - 0s - loss: 0.6634 - val_loss: 0.6561\n", "Epoch 2/20\n", - "44706/44706 [==============================] - 0s - loss: 0.6563 - val_loss: 0.6702\n", + "52596/52596 [==============================] - 0s - loss: 0.6626 - val_loss: 0.6562\n", "Epoch 3/20\n", - "44706/44706 [==============================] - 0s - loss: 0.6558 - val_loss: 0.6706\n", + "52596/52596 [==============================] - 0s - loss: 0.6619 - val_loss: 0.6562\n", "Epoch 4/20\n", - "44706/44706 [==============================] - 0s - loss: 0.6552 - val_loss: 0.6708\n", + "52596/52596 [==============================] - 0s - loss: 0.6613 - val_loss: 0.6562\n", "Epoch 5/20\n", - "44706/44706 [==============================] - 0s - loss: 0.6548 - val_loss: 0.6709\n", + "52596/52596 [==============================] - 0s - loss: 0.6607 - val_loss: 0.6561\n", "Epoch 6/20\n", - "44706/44706 [==============================] - 1s - loss: 0.6543 - val_loss: 0.6710\n", - "Epoch 00005: early stopping\n" + "52596/52596 [==============================] - 0s - loss: 0.6601 - val_loss: 0.6557\n", + "Epoch 7/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6596 - val_loss: 0.6554\n", + "Epoch 8/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6591 - val_loss: 0.6551\n", + "Epoch 9/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6586 - val_loss: 0.6550\n", + "Epoch 10/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6582 - val_loss: 0.6548\n", + "Epoch 11/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6577 - val_loss: 0.6545\n", + "Epoch 12/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6572 - val_loss: 0.6544\n", + "Epoch 13/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6568 - val_loss: 0.6541\n", + "Epoch 14/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6563 - val_loss: 0.6538\n", + "Epoch 15/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6559 - val_loss: 0.6534\n", + "Epoch 16/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6555 - val_loss: 0.6533\n", + "Epoch 17/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6551 - val_loss: 0.6534\n", + "Epoch 18/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6548 - val_loss: 0.6529\n", + "Epoch 19/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6544 - val_loss: 0.6525\n", + "Epoch 20/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6540 - val_loss: 0.6523\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "X, X_test, Y, Y_test = train_test_split(X, Y, test_size=0.15, random_state=42)\n", + "X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size=0.15, random_state=42)\n", "\n", "fBestModel = 'best_model.h5' \n", "early_stop = EarlyStopping(monitor='val_loss', patience=4, verbose=1) \n", "best_model = ModelCheckpoint(fBestModel, verbose=0, save_best_only=True)\n", - "model.fit(X, Y, validation_data = (X_test, Y_test), epochs=20, \n", - " batch_size=128, verbose=True, validation_split=0.15, \n", - " callbacks=[best_model, early_stop]) " + "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n", + " batch_size=128, verbose=True, callbacks=[best_model, early_stop]) " ] }, { @@ -692,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, @@ -703,46 +624,99 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/10\n", - "44706/44706 [==============================] - 2s - loss: 0.8963 \n", - "Epoch 2/10\n", - "44706/44706 [==============================] - 2s - loss: 0.7089 \n", - "Epoch 3/10\n", - "44706/44706 [==============================] - 3s - loss: 0.6809 \n", - "Epoch 4/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6678 \n", - "Epoch 5/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6596 \n", - "Epoch 6/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6542 \n", - "Epoch 7/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6505 \n", - "Epoch 8/10\n", - "44706/44706 [==============================] - 3s - loss: 0.6472 \n", - "Epoch 9/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6451 \n", - "Epoch 10/10\n", - "44706/44706 [==============================] - 2s - loss: 0.6434 \n" + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_3 (Dense) (None, 100) 9400 \n", + "_________________________________________________________________\n", + "dense_4 (Dense) (None, 9) 909 \n", + "_________________________________________________________________\n", + "activation_3 (Activation) (None, 9) 0 \n", + "=================================================================\n", + "Total params: 10,309.0\n", + "Trainable params: 10,309.0\n", + "Non-trainable params: 0.0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = Sequential()\n", + "model.add(Dense(100, input_shape=(dims,)))\n", + "model.add(Dense(nb_classes))\n", + "model.add(Activation('softmax'))\n", + "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 52596 samples, validate on 9282 samples\n", + "Epoch 1/20\n", + "52596/52596 [==============================] - 1s - loss: 1.2076 - val_loss: 0.8897\n", + "Epoch 2/20\n", + "52596/52596 [==============================] - 1s - loss: 0.8247 - val_loss: 0.7779\n", + "Epoch 3/20\n", + "52596/52596 [==============================] - 0s - loss: 0.7595 - val_loss: 0.7378\n", + "Epoch 4/20\n", + "52596/52596 [==============================] - 1s - loss: 0.7289 - val_loss: 0.7153\n", + "Epoch 5/20\n", + "52596/52596 [==============================] - 1s - loss: 0.7101 - val_loss: 0.7008\n", + "Epoch 6/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6973 - val_loss: 0.6903\n", + "Epoch 7/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6880 - val_loss: 0.6814\n", + "Epoch 8/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6809 - val_loss: 0.6760\n", + "Epoch 9/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6753 - val_loss: 0.6711\n", + "Epoch 10/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6705 - val_loss: 0.6678\n", + "Epoch 11/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6669 - val_loss: 0.6642\n", + "Epoch 12/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6636 - val_loss: 0.6607\n", + "Epoch 13/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6608 - val_loss: 0.6588\n", + "Epoch 14/20\n", + "52596/52596 [==============================] - 1s - loss: 0.6584 - val_loss: 0.6565\n", + "Epoch 15/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6563 - val_loss: 0.6559\n", + "Epoch 16/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6545 - val_loss: 0.6547\n", + "Epoch 17/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6529 - val_loss: 0.6524\n", + "Epoch 18/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6513 - val_loss: 0.6503\n", + "Epoch 19/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6500 - val_loss: 0.6489\n", + "Epoch 20/20\n", + "52596/52596 [==============================] - 0s - loss: 0.6487 - val_loss: 0.6481\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "model = Sequential()\n", - "model.add(Dense(100, input_shape=(dims,)))\n", - "model.add(Dense(nb_classes))\n", - "model.add(Activation('softmax'))\n", - "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n", - "model.fit(X, Y)" + "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n", + " batch_size=128, verbose=True)" ] }, { @@ -795,7 +769,8 @@ "model.add(Dense(nb_classes))\n", "model.add(Activation('softmax'))\n", "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n", - "model.fit(X, Y)" + "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n", + " batch_size=128, verbose=True)" ] }, { diff --git a/kaggle_data.py b/kaggle_data.py new file mode 100644 index 0000000..20a8629 --- /dev/null +++ b/kaggle_data.py @@ -0,0 +1,64 @@ +""" +Utility functions to load Kaggle Otto Group Challenge Data. + +Since these data/functions are used in many notebooks, it is better +to centralise functions to load and manipulate data so +to not replicate code. +""" + +import pandas as pd +import numpy as np +from sklearn.preprocessing import StandardScaler +from sklearn.preprocessing import LabelEncoder +from keras.utils import np_utils + + +def load_data(path, train=True): + """Load data from a CSV File + + Parameters + ---------- + path: str + The path to the CSV file + + train: bool (default True) + Decide whether or not data are *training data*. + If True, some random shuffling is applied. + + Return + ------ + X: numpy.ndarray + The data as a multi dimensional array of floats + ids: numpy.ndarray + A vector of ids for each sample + """ + df = pd.read_csv(path) + X = df.values.copy() + if train: + np.random.shuffle(X) # https://youtu.be/uyUXoap67N8 + X, labels = X[:, 1:-1].astype(np.float32), X[:, -1] + return X, labels + else: + X, ids = X[:, 1:].astype(np.float32), X[:, 0].astype(str) + return X, ids + + +def preprocess_data(X, scaler=None): + """Preprocess input data by standardise features + by removing the mean and scaling to unit variance""" + if not scaler: + scaler = StandardScaler() + scaler.fit(X) + X = scaler.transform(X) + return X, scaler + + +def preprocess_labels(labels, encoder=None, categorical=True): + """Encode labels with values among 0 and `n-classes-1`""" + if not encoder: + encoder = LabelEncoder() + encoder.fit(labels) + y = encoder.transform(labels).astype(np.int32) + if categorical: + y = np_utils.to_categorical(y) + return y, encoder \ No newline at end of file