{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Structuring Machine Learning Projects\n", "\n", "[deeplearning.ai](https://www.coursera.org/learn/machine-learning-projects/home/week/1)\n", "\n", "## Learning Objectives\n", " - Understand why `Machine Learning strategy` is important\n", " - Apply `satisficing` and `optimizing` metrics to set up your goal for ML projects\n", " - Choose a correct train/dev/test `split` of your dataset\n", " - Understand how to define `human-level` performance\n", " - Use human-level perform to define your key priorities in ML projects\n", " - Take the correct `ML Strategic` decision based on observations of performances and dataset\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Introduction to ML Strategy\n", "\n", "### 1.1 Why ML Strategy\n", "\n", "\n", "### 1.2 LectureOrthogonalization\n", "\n", "> Independence\n", "\n", "__Accuracy Problem__\n", " - In training set >> bigger network or better optimisation\n", " - In development set >> regularizagion or bigger training set\n", " - In test set >> bigger development set\n", " - In real-world >> train/dev/test re-split or change cost function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Setting up your goal\n", "\n", "### 2.1 Single number evaluation metric\n", "\n", "\n", "### 2.2 Satisficing and Optimizing metric\n", "\n", "### 2.3 Train/dev/test distributions\n", "\n", "### 2.4 Size of the dev and test sets\n", "\n", "\n", "### 2.5 When to change dev/test sets and metrics\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. Comparing to human-level performance\n", "\n", "### 3.1 Why human-level performance?\n", "\n", "### 3.2 Avoidable bias\n", "\n", "### 3.3 Understanding human-level performance\n", "\n", "### 3.4 Surpassing human-level performance\n", "\n", "### 3.4 Improving your model performance\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Summary\n", "\n", "![summary.png](summary.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Example\n", "\n", "### Code: \n", " - [Deep Learning Tutorial for Beginners, Datai](https://www.kaggle.com/kanncaa1/deep-learning-tutorial-for-beginners/)\n", "\n", "### Data :\n", " - [Sign Language Digits Dataset, Arda Mavi](https://www.kaggle.com/ardamavi/sign-language-digits-dataset/kernels)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "import numpy as np # linear algebra\n", "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", "import matplotlib.pyplot as plt\n", "# import warnings\n", "import warnings\n", "# filter warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Load data set" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "X = np.load('data/X.npy')\n", "y = np.load('data/Y.npy')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Select only ones and zeros" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "X_zero, y_zero, X_one, y_one = X[204:409], np.zeros(205), X[822:1027], np.ones(205)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Draw first and last pictures for ones and zeros" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 63.5, 63.5, -0.5)" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "img_size = 64\n", "plt.subplot(1, 2, 1)\n", "plt.imshow(X_zero[0].reshape(img_size, img_size))\n", "plt.axis('off')\n", "plt.subplot(1, 2, 2)\n", "plt.imshow(X_one[0].reshape(img_size, img_size))\n", "plt.axis('off')" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 63.5, 63.5, -0.5)" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "img_size = 64\n", "plt.subplot(1, 2, 1)\n", "plt.imshow(X_zero[-1].reshape(img_size, img_size))\n", "plt.axis('off')\n", "plt.subplot(1, 2, 2)\n", "plt.imshow(X_one[-1].reshape(img_size, img_size))\n", "plt.axis('off')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reduce and construct dataset" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "r =50\n", "X01 = np.concatenate((X_zero[:r], X_one[:r]))\n", "y01 = np.concatenate((y_zero[:r], y_one[:r])).reshape(-1,1)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(100, 64, 64)" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X01.shape" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(100, 1)" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y01.shape" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "# Then lets create x_train, y_train, x_test, y_test arrays\n", "from sklearn.model_selection import train_test_split\n", "X_train, X_test, Y_train, Y_test = train_test_split(X01, y01, test_size=0.15, random_state=1)\n", "\n", "number_of_train = X_train.shape[0]\n", "number_of_test = X_test.shape[0]" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X train flatten (85, 4096)\n", "X test flatten (15, 4096)\n" ] } ], "source": [ "X_train_flatten = X_train.reshape(number_of_train,X_train.shape[1]*X_train.shape[2])\n", "X_test_flatten = X_test .reshape(number_of_test,X_test.shape[1]*X_test.shape[2])\n", "\n", "print(\"X train flatten\",X_train_flatten.shape)\n", "print(\"X test flatten\",X_test_flatten.shape)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "\n", "X_train_flatten = sc.fit_transform(X_train_flatten)\n", "X_test_flatten = sc.transform(X_test_flatten)" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense\n", "from keras.layers import Dropout" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "clf = Sequential([\n", " Dense(units=2, kernel_initializer='uniform', input_dim=4096, activation='relu'),\n", " Dense(1, kernel_initializer='uniform', activation='sigmoid')\n", "])" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_298 (Dense) (None, 2) 8194 \n", "_________________________________________________________________\n", "dense_299 (Dense) (None, 1) 3 \n", "=================================================================\n", "Total params: 8,197\n", "Trainable params: 8,197\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "clf.summary()" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(16388, 5)" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "4096 * 4 + 4, 4 * 1 + 1" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "clf.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/2\n", "85/85 [==============================] - 3s 33ms/step - loss: 0.6856 - acc: 0.5412\n", "Epoch 2/2\n", "85/85 [==============================] - 0s 474us/step - loss: 0.6668 - acc: 0.5412\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.fit(X_train_flatten, Y_train, batch_size=5, epochs=2)" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15/15 [==============================] - 1s 76ms/step\n", "\n", "And the Score is 26.666667064030964 %\n" ] } ], "source": [ "score = clf.evaluate(X_test_flatten, Y_test, batch_size=5)\n", "print('\\nAnd the Score is ', score[1] * 100, '%')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Try a bigger network" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/2\n", "85/85 [==============================] - 3s 34ms/step - loss: 0.6926 - acc: 0.5294\n", "Epoch 2/2\n", "85/85 [==============================] - 0s 641us/step - loss: 0.6894 - acc: 0.6235\n", "15/15 [==============================] - 1s 81ms/step\n", "\n", "And the Score is 46.66666785875957 %\n" ] } ], "source": [ "clf = Sequential([\n", " Dense(units=40, kernel_initializer='uniform', input_dim=4096, activation='relu'),\n", " Dense(units=40, kernel_initializer='uniform', input_dim=4096, activation='relu'),\n", " Dense(1, kernel_initializer='uniform', activation='sigmoid')\n", "])\n", "\n", "clf.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])\n", "\n", "clf.fit(X_train_flatten, Y_train, batch_size=5, epochs=2)\n", "\n", "score = clf.evaluate(X_test_flatten, Y_test, batch_size=5)\n", "print('\\nAnd the Score is ', score[1] * 100, '%')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Add Regularization" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/2\n", "85/85 [==============================] - 3s 36ms/step - loss: 0.6798 - acc: 0.6588\n", "Epoch 2/2\n", "85/85 [==============================] - 0s 973us/step - loss: 0.5812 - acc: 0.9176\n", "15/15 [==============================] - 1s 84ms/step\n", "\n", "And the Score is 86.66666746139526 %\n" ] } ], "source": [ "clf = Sequential([\n", " Dense(units=40, kernel_initializer='uniform', input_dim=4096, activation='relu'),\n", " Dropout(0.25),\n", " Dense(units=10, kernel_initializer='uniform', input_dim=4096, activation='relu'),\n", " Dense(1, kernel_initializer='uniform', activation='sigmoid')\n", "])\n", "\n", "clf.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "\n", "clf.fit(X_train_flatten, Y_train, batch_size=5, epochs=2)\n", "\n", "score = clf.evaluate(X_test_flatten, Y_test, batch_size=5)\n", "print('\\nAnd the Score is ', score[1] * 100, '%')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create Function That Constructs A Neural Network" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "42/42 [==============================] - 4s 84ms/step - loss: 0.6932 - acc: 0.5238\n", "Epoch 2/3\n", "42/42 [==============================] - 0s 176us/step - loss: 0.6905 - acc: 0.8810\n", "Epoch 3/3\n", "42/42 [==============================] - 0s 240us/step - loss: 0.6871 - acc: 0.9286\n", "43/43 [==============================] - 2s 36ms/step\n", "Epoch 1/3\n", "43/43 [==============================] - 3s 79ms/step - loss: 0.6931 - acc: 0.5349\n", "Epoch 2/3\n", "43/43 [==============================] - 0s 171us/step - loss: 0.6925 - acc: 0.9070\n", "Epoch 3/3\n", "43/43 [==============================] - 0s 200us/step - loss: 0.6917 - acc: 0.9767\n", "42/42 [==============================] - 1s 35ms/step\n", "Accuracy mean: 0.7643964569830023\n", "Accuracy variance: 0.026301216049447795\n" ] } ], "source": [ "def build_classifier():\n", " classifier = Sequential() # initialize neural network\n", " classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu', input_dim = 4096))\n", " classifier.add(Dense(units = 4, kernel_initializer = 'uniform', activation = 'relu'))\n", " classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))\n", " classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])\n", " return classifier\n", "\n", "classifier = KerasClassifier(build_fn = build_classifier, epochs = 3)\n", "accuracies = cross_val_score(estimator = classifier, X = X_train_flatten, y = Y_train, cv = 2)\n", "mean = accuracies.mean()\n", "variance = accuracies.std()\n", "print(\"Accuracy mean: \"+ str(mean))\n", "print(\"Accuracy variance: \"+ str(variance))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create Function That Constructs A Neural Network" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "def build_model(optimizer, learning_rate, activation, dropout_rate, initilizer,num_unit):\n", " #keras.backend.clear_session()\n", " model = Sequential()\n", " model.add(Dense(num_unit, kernel_initializer=initilizer, activation=activation, input_shape=(4096,)))\n", " model.add(Dropout(dropout_rate))\n", " model.add(Dense(num_unit, kernel_initializer=initilizer, activation=activation))\n", " model.add(Dropout(dropout_rate)) \n", " model.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))\n", " \n", " model.compile(optimizer = optimizer(lr=learning_rate), loss = 'binary_crossentropy', metrics = ['accuracy'])\n", " \n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create Hyperparameter Search Space" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "# [:1] is for testing\n", "batch_size = [20, 50, 100][:1]\n", "epochs = [1, 20, 50][:1]\n", "initilizer = ['lecun_uniform', 'normal', 'he_normal', 'he_uniform'][:1]\n", "learning_rate = [0.1, 0.01, 0.001]\n", "dropout_rate = [0.1, 0.2, 0.3, 0.4]\n", "num_unit = [4, 8, 16]\n", "\n", "activation = ['relu', 'tanh', 'sigmoid', 'linear'][:1]\n", "optimizer = ['sgd','rmsprop', 'adam']" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "# parameters is a dict with all values\n", "parameters = dict(batch_size = batch_size,\n", " epochs = epochs,\n", " dropout_rate = dropout_rate,\n", " num_unit = num_unit,\n", " initilizer = initilizer,\n", " learning_rate = learning_rate,\n", " activation = activation,\n", " optimizer = optimizer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conduct Grid Search" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV\n", "model = KerasClassifier(build_fn=build_model, verbose=0)\n", "models = GridSearchCV(estimator = model, param_grid=parameters, n_jobs=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find Best Model’s Hyperparameters" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best model :\n", "{'activation': 'relu', 'batch_size': 20, 'dropout_rate': 0.1, 'epochs': 1, 'initilizer': 'lecun_uniform', 'learning_rate': 0.001, 'num_unit': 16, 'optimizer': 'rmsprop'}\n" ] } ], "source": [ "best_model = models.fit(X_train_flatten, Y_train)\n", "print('Best model :')\n", "print(best_model.best_params_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }