{"cells":[{"metadata":{},"cell_type":"markdown","source":"# 1- Importation des packages"},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\n\nfrom tensorflow import keras\n\nfrom keras.utils.np_utils import to_categorical\nfrom keras.models import Sequential, load_model\nfrom keras.layers import Dense, Dropout, Lambda, Flatten, Conv2D, MaxPooling2D, Activation, MaxPool2D\nfrom keras.optimizers import SGD,RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix\nimport itertools\nfrom sklearn import neighbors\nfrom math import sqrt\nfrom sklearn.metrics import mean_squared_error ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2- Chargement des données"},{"metadata":{"trusted":true},"cell_type":"code","source":"data_train = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ndata_test = pd.read_csv(\"../input/digit-recognizer/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 3- Méthode KNN"},{"metadata":{"trusted":true},"cell_type":"code","source":"data_Target= data_train[\"label\"]\ndata_Features = data_train.drop(\"label\", axis = 1)\nX_train, X_test, Y_train, Y_test = train_test_split(data_Features, data_Target, test_size = 0.2, random_state = 0)\n\n#Calcul des k possibles pour optimiser le modèle\n\nrmse_val = [] \nfor K in range(10):\n    K = K+1\n    model = neighbors.KNeighborsRegressor(n_neighbors = K)\n\n    model.fit(X_train, Y_train)  #entrainement du modèle\n    pred=model.predict(X_test) #prédiction pour le jeu de test\n    error = sqrt(mean_squared_error(Y_test,pred)) #calcule du rmse\n    rmse_val.append(error) \n    print('RMSE value for k= ' , K , 'is:', error)\n\n\ncurve = pd.DataFrame(rmse_val) #elbow curve \ncurve.plot()\n\n#Evaluation du modèle\nmodel.score(X_test,Y_test)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4- Méthode CNN\n\n## 4.1- CNN methode simple"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Conservation de la colonne label \nY_train = data_train['label']\n\n#Supression de la colonne label\nX_train = data_train.drop(labels=['label'],axis=1)\n\n#Normalisation des données \nX_train = X_train/255\ndata_test = data_test/255\n\n#remodelage des données pour créér une matrice \nX_train = X_train.values.reshape(-1,28,28,1)\ndata_test = data_test.values.reshape(-1,28,28,1)\n\n#encodage du label\nY_train = to_categorical(Y_train, num_classes=10)\n\n#Division des données en echantillon de test et d'entrainement\nX_train,X_test,Y_train,Y_test = train_test_split(X_train,Y_train,test_size=0.1, random_state = 2)\n\n#Construction du model CNN\nmodel = Sequential()\nmodel.add(layers.Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation=tf.nn.relu, input_shape = (28,28,1)))\nmodel.add(layers.Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation=tf.nn.relu))\nmodel.add(layers.MaxPool2D(pool_size=(2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation=tf.nn.relu, input_shape = (28,28,1)))\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation=tf.nn.relu))\nmodel.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(256,activation=tf.nn.relu))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Dense(10,activation=tf.nn.softmax))\n\n#definition de l'optimiseur \noptimizer = tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)\nmodel.compile(optimizer = optimizer, loss='categorical_crossentropy', metrics=[\"accuracy\"])\n\n#reglage des hyperparametres\nlearning_rate_reduction = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_acc',\n                                           patience=3,\n                                           verbose=1,\n                                           factor=0.5,\n                                           min_lr=0.00001)\n\n\n#entrainement du modèle\nepochs=10\nbatch_size = 112\n\nmodelfit = model.fit(X_train,Y_train, batch_size=batch_size,\n                              epochs = epochs, validation_data = (X_test,Y_test),\n                              steps_per_epoch=X_train.shape[0] // batch_size\n                              , callbacks=[learning_rate_reduction])\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 4.2- CNN modèle avec augmentation des données"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#Conservation de la colonne label \nY_train = data_train['label']\n\n#Supression de la colonne label\nX_train = data_train.drop(labels=['label'],axis=1)\n\n#Normalisation des données \nX_train = X_train/255\ndata_test = data_test/255\n\n#remodelage des données pour créér une matrice \nX_train = X_train.values.reshape(-1,28,28,1)\ndata_test = data_test.reshape(-1,28,28,1)\n\n#encodage du label\nY_train = to_categorical(Y_train, num_classes=10)\n\n#Division des données en echantillon de test et d'entrainement\nX_train,X_test,Y_train,Y_test = train_test_split(X_train,Y_train,test_size=0.1, random_state = 2)\n\n#Construction du model CNN\nmodel = Sequential()\nmodel.add(layers.Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation=tf.nn.relu, input_shape = (28,28,1)))\nmodel.add(layers.Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation=tf.nn.relu))\nmodel.add(layers.MaxPool2D(pool_size=(2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation=tf.nn.relu, input_shape = (28,28,1)))\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation=tf.nn.relu))\nmodel.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(256,activation=tf.nn.relu))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Dense(10,activation=tf.nn.softmax))\n\n#definition de l'optimiseur \noptimizer = tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)\nmodel.compile(optimizer = optimizer, loss='categorical_crossentropy', metrics=[\"accuracy\"])\n\n#reglage des hyperparametres\nlearning_rate_reduction = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_acc',\n                                           patience=3,\n                                           verbose=1,\n                                           factor=0.5,\n                                           min_lr=0.00001)\n\n\n\n# programme d'augmentation des données\nimagegenerator = ImageDataGenerator(\n        rotation_range=10,  # rotation de l'image en degrés\n        zoom_range = 0.1, # Randomly zoom image \n        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)\n        height_shift_range=0.1)  # randomly shift images vertically (fraction of total height)\n\n\nimagegenerator.fit(X_train)\n\n#entrainement du modèle\nepochs=1\nbatch_size = 112\n\nmodelfit = model.fit(imagegenerator.flow(X_train,Y_train, batch_size=batch_size),\n                              epochs = epochs, validation_data = (X_test,Y_test),\n                              steps_per_epoch=X_train.shape[0] // batch_size\n                              , callbacks=[learning_rate_reduction])\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Evaluation du modèle"},{"metadata":{"trusted":true},"cell_type":"code","source":"#evaluation du modèle sur les données d'entrainement \nmodel.evaluate(X_train, Y_train)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Matrice de confusion"},{"metadata":{"trusted":false},"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Matrice de confusion',\n                          cmap=plt.cm.Blues):\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    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\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, cm[i, j],\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n        plt.tight_layout()\n    plt.ylabel('Valeurs réelles')\n    plt.xlabel('Valeurs prédites')\n    \n#prediction des valeurs de jeu de validation\nY_pred = model.predict(X_test)\nY_pred_classes = np.argmax(Y_pred,axis = 1) \nY_true = np.argmax(Y_test,axis = 1) \n# Calcule de la matrice de confusion\nconfusion_mtx = confusion_matrix(Y_true, Y_pred_classes) \n# affichage\nplot_confusion_matrix(confusion_mtx, classes = range(10)) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Mise en image des erreurs trouvées\nerrors = (Y_pred_classes - Y_true != 0)\n\nY_pred_classes_errors = Y_pred_classes[errors]\nY_pred_errors = Y_pred[errors]\nY_true_errors = Y_true[errors]\nX_test_errors = X_test[errors]\n\ndef display_errors(errors_index,img_errors,pred_errors, obs_errors):\n    n = 0\n    nrows = 3\n    ncols = 2\n    fig, ax = plt.subplots(nrows,ncols,sharex=True,sharey=True)\n    for row in range(nrows):\n        for col in range(ncols):\n            error = errors_index[n]\n            ax[row,col].imshow((img_errors[error]).reshape((28,28)))\n            ax[row,col].set_title(\"  Prédite:{}  Réelle:{}    \".format(pred_errors[error],obs_errors[error]))\n            n += 1\n\n#Probabilité des mauvaises prédictions\nprob_YpredErrors = np.max(Y_pred_errors,axis = 1)\n\n#Probabilité des faux poitifs\nprob_trueErrors = np.diagonal(np.take(Y_pred_errors, Y_true_errors, axis=1))\n\n#Difference entre les proba des valeurs prédites et des vraies valeurs\ndiff_predTrueErrors = prob_YpredErrors - prob_trueErrors\n\n# Tri des valeurs\nsorted_diff_predTrueErrors = np.argsort(diff_predTrueErrors)\n\n# Affichage des erreurs\ndisplay_errors(sorted_diff_predTrueErrors,X_test_errors, Y_pred_classes_errors, Y_true_errors)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exportation des résultats"},{"metadata":{"trusted":true},"cell_type":"code","source":"# predict results\nresults = model.predict(data_test)\nresults = np.argmax(results,axis = 1)\nresults = pd.DataFrame(results, columns=['label'])\nresults.to_csv(r'./prediction.csv', index = False)\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}