{"cells":[{"metadata":{"_uuid":"4c92969521cdd3c711fefc517d31db0b0087c89b"},"cell_type":"markdown","source":"# MNIST data"},{"metadata":{"trusted":false,"_uuid":"12c33e4f6abaed88097083f93227e85b66a6d3ec"},"cell_type":"code","source":"import os, sys\nimport itertools, time\nimport numpy as np \nimport pandas as pd\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\n\n# preprocessing\nfrom sklearn.model_selection import train_test_split\n\n# postprocessing\nfrom sklearn.metrics import accuracy_score, confusion_matrix","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ae83d83bf81beb92ce6416e4d7f604d1a95374d7"},"cell_type":"markdown","source":"# Workflow\n\n* [Analyse data](#data)\n* [Feature engineering](#feature)\n* [Train - CV - test split](#split)\n* [Trial models](#models)"},{"metadata":{"_uuid":"f7597199c104909c03750accdcd9ecc2232a3677"},"cell_type":"markdown","source":"---\n<a name=\"data\"></a>\n# 1) Analyse data"},{"metadata":{"trusted":false,"_uuid":"9ea960782209b63d09b740abe5f863bcda8ef2ef"},"cell_type":"code","source":"# Test set\ntest = pd.read_csv('../input/test.csv')\n# Training set\ndata = pd.read_csv('../input/train.csv')\n# Target features\ny = data[['label']]\nX = data.drop('label', axis=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e3fb12c718a8010540ac7c2f8403fc4c5c6f952b"},"cell_type":"markdown","source":"---\n<a name=\"feature\"></a>\n# 2) Feature engineering\n* No feature engineering performed here\n* Could be used to reduce dimensionality of data (lower resolution)"},{"metadata":{"_uuid":"f4a62987968629464d9c709fd8b6fbd94f2f629c"},"cell_type":"markdown","source":"---\n<a name='split'></a>\n# 3) Train - CV - Test split"},{"metadata":{"trusted":false,"_uuid":"b44e7f137ca73168acd5631552068e2d77b424f3"},"cell_type":"code","source":"# Train test split - 20% testing\nXtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.2, random_state=15)\n\n# Train cross-validation split - overall 20% cross-validation\nXtrain, Xcv, ytrain, ycv = train_test_split(Xtrain, ytrain, test_size=(0.2/0.8), random_state=15)\n\n# So we have a 60-20-20 train-cv-test split\nlen(Xtrain), len(Xcv), len(Xtest), len(test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d0b2434f286207cbd3c729c606906ce19eec7488"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5c1f715ea5a244af868c668f3deed8e226251e43"},"cell_type":"markdown","source":"------\n------\n<a name='models'></a>\n# 4) Run models"},{"metadata":{"_uuid":"7c4392d2a1fdf771c96154bfaf32d907802a88f0"},"cell_type":"markdown","source":"--------------------\n# Convolutional Neural Network"},{"metadata":{"trusted":false,"_uuid":"de2470e2f4cc6d86c349493d65ef70bf5f20bbee"},"cell_type":"code","source":"from sklearn.neural_network import MLPClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"5a2ba193cec95c0a2ed5b98df80097c3cb34fad4"},"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Blues):\n    \"\"\"\n    This function prints and plots the confusion matrix.\n    Normalization can be applied by setting `normalize=True`.\n    \"\"\"\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n        print(\"Normalized confusion matrix\")\n    else:\n        print('Confusion matrix, without normalization')\n\n    #print(cm)\n\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n\n    fmt = '.2f' if normalize else 'd'\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, format(cm[i, j], fmt),\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"541926b045fbe1beefab7f0af736610905904d3c"},"cell_type":"markdown","source":"### MPLClassifier\n- Multi-Layer perception\n- Uses back-propagation\n- Cross-entropy loss funciton\n- Multi-class using a Softmax output"},{"metadata":{"trusted":false,"_uuid":"02c08561f702e93054ee3e87e797cc879c58bb56"},"cell_type":"code","source":"cnn = MLPClassifier(solver='lbfgs', hidden_layer_sizes=(200), random_state=0, max_iter=500)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"ee4eb2bd285d93dd53a943d787feb28d8d6e5203"},"cell_type":"code","source":"start = time.time()\n\ncnn.fit(Xtrain, np.array(ytrain)[:,0])\n\nend = time.time()\nprint(\"Time taken: %f\" % (end-start))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"7e3bf21d106e0fa9d31832ae235794f1d4779196"},"cell_type":"code","source":"predict = cnn.predict(Xcv)\nacc = accuracy_score(ycv, predict)\nprint(\"Accuracy: %f\" % acc)\n\nconfusion = confusion_matrix(np.array(ycv)[:,0], predict)\n\nplt.figure(figsize=(10,10))\nplot_confusion_matrix(confusion, classes=np.arange(10), normalize=True)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"trusted":false,"_uuid":"bb13b5054af11973b0a60452e2523153e7bc1dc6"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9ae93842041ed56285bd9df4b9966c0cc2bff45f"},"cell_type":"markdown","source":"## Expected accuracy of submission"},{"metadata":{"trusted":false,"_uuid":"debd7dff90c128bc01aa78de170c67c827c5b37d"},"cell_type":"code","source":"predict = cnn.predict(Xtest)\nacc = accuracy_score(ytest, predict)\nprint(\"Accuracy: %f\" % acc)\n\nconfusion = confusion_matrix(np.array(ytest)[:,0], predict)\n\nplt.figure(figsize=(10,10))\nplot_confusion_matrix(confusion, classes=np.arange(10), normalize=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"699ae260f6c361c82028c395d761068482639e51"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"04f931000ce47076033c60ee295ee7fed1d97301"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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.5.4"}},"nbformat":4,"nbformat_minor":1}