{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Pandas : librairie de manipulation de données\n# NumPy : librairie de calcul scientifique\n# MatPlotLib : librairie de visualisation et graphiques\nimport pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\n\nfrom sklearn import metrics\nfrom sklearn import preprocessing\nfrom sklearn import model_selection\nfrom sklearn.metrics import classification_report, confusion_matrix, roc_curve, roc_auc_score,auc, accuracy_score\n\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\n\nfrom sklearn.model_selection import train_test_split\n\nfrom IPython.core.display import HTML # permet d'afficher du code html dans jupyter","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-06-07T08:17:38.757878Z","iopub.execute_input":"2021-06-07T08:17:38.758405Z","iopub.status.idle":"2021-06-07T08:17:38.764653Z","shell.execute_reply.started":"2021-06-07T08:17:38.758373Z","shell.execute_reply":"2021-06-07T08:17:38.763740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Fonction pour tracer les courbes d'apprentissage","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import learning_curve\ndef plot_learning_curve(est, X_train, y_train) :\n    train_sizes, train_scores, test_scores = learning_curve(estimator=est, X=X_train, y=y_train, train_sizes=np.linspace(0.1, 1.0, 10),\n                                                        cv=5,\n                                                        n_jobs=-1)\n    train_mean = np.mean(train_scores, axis=1)\n    train_std = np.std(train_scores, axis=1)\n    test_mean = np.mean(test_scores, axis=1)\n    test_std = np.std(test_scores, axis=1)\n    plt.figure(figsize=(8,10))\n    plt.plot(train_sizes, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')\n    plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')\n    plt.plot(train_sizes, test_mean,color='green', linestyle='--',marker='s', markersize=5,label='validation accuracy')\n    plt.fill_between(train_sizes,test_mean + test_std,test_mean - test_std,alpha=0.15, color='green')\n    plt.grid(b='on')\n    plt.xlabel('Number of training samples')\n    plt.ylabel('Accuracy')\n    plt.legend(loc='lower right')\n    plt.ylim([0.6, 1.0])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:38.766199Z","iopub.execute_input":"2021-06-07T08:17:38.766754Z","iopub.status.idle":"2021-06-07T08:17:38.780161Z","shell.execute_reply.started":"2021-06-07T08:17:38.766721Z","shell.execute_reply":"2021-06-07T08:17:38.779307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Fonction pour tracer la courbe ROC","metadata":{}},{"cell_type":"code","source":"def plot_roc_curve(est,X_test,y_test) :\n    probas = est.predict_proba(X_test)\n    false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test,probas[:, 1])\n    roc_auc = auc(false_positive_rate, true_positive_rate)\n    plt.figure(figsize=(8,8))\n    plt.title('Receiver Operating Characteristic')\n    plt.plot(false_positive_rate, true_positive_rate, 'b', label='AUC = %0.2f'% roc_auc)\n    plt.legend(loc='lower right')\n    plt.plot([0,1],[0,1],'r--')        # plus mauvaise courbe\n    plt.plot([0,0,1],[0,1,1],'g:')     # meilleure courbe\n    plt.xlim([-0.05,1.2])\n    plt.ylim([-0.05,1.2])\n    plt.ylabel('Taux de vrais positifs')\n    plt.xlabel('Taux de faux positifs')\n    plt.show","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:38.781722Z","iopub.execute_input":"2021-06-07T08:17:38.782154Z","iopub.status.idle":"2021-06-07T08:17:38.800020Z","shell.execute_reply.started":"2021-06-07T08:17:38.782124Z","shell.execute_reply":"2021-06-07T08:17:38.798971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset de l'écriture Kannada MNIST","metadata":{}},{"cell_type":"markdown","source":"Tout d'abord, afin de réaliser ce notebook je me suis inspiré de celui sur les chiffres manuscrits réalisés en cours, de celui sur zalando ainsi que du notebook suivant: https://www.kaggle.com/marcovasquez/basic-ml-logistic-dt-pca-xgboost#7--Machine-Learning-Algorithm","metadata":{}},{"cell_type":"markdown","source":"L’écriture kannada, ou l’écriture kannara, est un alphasyllabaire de la famille de la brahmi principalement utilisé pour écrire le kannada, l’une des langues dravidiennes du sud de l’Inde parlée notamment dans l'état du Karnataka","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(\"../input/Kannada-MNIST/Dig-MNIST.csv\")","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:38.801446Z","iopub.execute_input":"2021-06-07T08:17:38.802017Z","iopub.status.idle":"2021-06-07T08:17:39.477824Z","shell.execute_reply.started":"2021-06-07T08:17:38.801981Z","shell.execute_reply":"2021-06-07T08:17:39.476842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.479085Z","iopub.execute_input":"2021-06-07T08:17:39.479557Z","iopub.status.idle":"2021-06-07T08:17:39.485824Z","shell.execute_reply.started":"2021-06-07T08:17:39.479524Z","shell.execute_reply":"2021-06-07T08:17:39.484542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On a 785 colonnes :\n\nune colonne 'label' identifiant la \"lettre\"\net 784 colonnes de pixels ","metadata":{}},{"cell_type":"code","source":"df.head(10)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.490059Z","iopub.execute_input":"2021-06-07T08:17:39.490586Z","iopub.status.idle":"2021-06-07T08:17:39.522300Z","shell.execute_reply.started":"2021-06-07T08:17:39.490504Z","shell.execute_reply":"2021-06-07T08:17:39.521381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On crée la cible y (colonne 'label') :","metadata":{}},{"cell_type":"code","source":"y = df['label']","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.524733Z","iopub.execute_input":"2021-06-07T08:17:39.525071Z","iopub.status.idle":"2021-06-07T08:17:39.529626Z","shell.execute_reply.started":"2021-06-07T08:17:39.525040Z","shell.execute_reply":"2021-06-07T08:17:39.528716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"et les caractéristiques X","metadata":{}},{"cell_type":"code","source":"X = df.drop(['label'], axis=1)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.531009Z","iopub.execute_input":"2021-06-07T08:17:39.531311Z","iopub.status.idle":"2021-06-07T08:17:39.570905Z","shell.execute_reply.started":"2021-06-07T08:17:39.531281Z","shell.execute_reply":"2021-06-07T08:17:39.569709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On sépare les ensembles d'apprentissage et de test:","metadata":{}},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.572262Z","iopub.execute_input":"2021-06-07T08:17:39.572650Z","iopub.status.idle":"2021-06-07T08:17:39.631580Z","shell.execute_reply.started":"2021-06-07T08:17:39.572607Z","shell.execute_reply":"2021-06-07T08:17:39.630566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Nos ensembles sont prêts pour les différentes méthodes de machine learning, nous allons cependant visualiser les images dans un premier temps.","metadata":{}},{"cell_type":"markdown","source":"# Visualisation des images MNIST","metadata":{}},{"cell_type":"markdown","source":"Pour visualiser les images, on va convertir une ligne de 784 pixels en une matrice 28x28\nIl faut en premier transformer le dataframe X en un tableau :","metadata":{}},{"cell_type":"code","source":"X1 = np.array(X)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.633073Z","iopub.execute_input":"2021-06-07T08:17:39.633391Z","iopub.status.idle":"2021-06-07T08:17:39.665502Z","shell.execute_reply.started":"2021-06-07T08:17:39.633360Z","shell.execute_reply":"2021-06-07T08:17:39.664239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X1[0])","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.666865Z","iopub.execute_input":"2021-06-07T08:17:39.667168Z","iopub.status.idle":"2021-06-07T08:17:39.674998Z","shell.execute_reply.started":"2021-06-07T08:17:39.667138Z","shell.execute_reply":"2021-06-07T08:17:39.673816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On applique ensuite la méthode reshape pour convertir cette ligne en une matrice 28x28","metadata":{}},{"cell_type":"code","source":"image = X1[0].reshape(28,28)\nprint(image)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.676920Z","iopub.execute_input":"2021-06-07T08:17:39.677371Z","iopub.status.idle":"2021-06-07T08:17:39.691219Z","shell.execute_reply.started":"2021-06-07T08:17:39.677313Z","shell.execute_reply":"2021-06-07T08:17:39.689931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On peut désormais afficher cette matrice sous forme d'image","metadata":{}},{"cell_type":"code","source":"plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.694980Z","iopub.execute_input":"2021-06-07T08:17:39.695394Z","iopub.status.idle":"2021-06-07T08:17:39.843301Z","shell.execute_reply.started":"2021-06-07T08:17:39.695360Z","shell.execute_reply":"2021-06-07T08:17:39.842151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On peut l'afficher en niveaux de gris avec la colonne label comme titre","metadata":{}},{"cell_type":"code","source":"plt.imshow(image, cmap=\"gray_r\")\nplt.axis('off')\nplt.title(y[0])","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.844722Z","iopub.execute_input":"2021-06-07T08:17:39.845019Z","iopub.status.idle":"2021-06-07T08:17:39.932711Z","shell.execute_reply.started":"2021-06-07T08:17:39.844991Z","shell.execute_reply":"2021-06-07T08:17:39.931568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_samples = len(df.index)\nimages = X1.reshape(n_samples,28,28)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.935633Z","iopub.execute_input":"2021-06-07T08:17:39.936085Z","iopub.status.idle":"2021-06-07T08:17:39.942213Z","shell.execute_reply.started":"2021-06-07T08:17:39.936051Z","shell.execute_reply":"2021-06-07T08:17:39.940569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On affiche les 50 premières lignes","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(10,20))\nfor i in range(0,49) :\n    plt.subplot(10,5,i+1)\n    plt.axis('off')\n    plt.imshow(images[i], cmap=\"gray_r\")\n    plt.title(y[i])","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:39.944024Z","iopub.execute_input":"2021-06-07T08:17:39.944522Z","iopub.status.idle":"2021-06-07T08:17:42.539294Z","shell.execute_reply.started":"2021-06-07T08:17:39.944476Z","shell.execute_reply":"2021-06-07T08:17:42.536506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Appliquons désormais les différentes méthodes de machine learning à la reconnaissance d'objets**","metadata":{}},{"cell_type":"markdown","source":"## Machine Learning : Random Forest","metadata":{}},{"cell_type":"code","source":"from sklearn import ensemble\nrf = ensemble.RandomForestClassifier()\nrf.fit(X_train, y_train)\ny_rf = rf.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:42.541046Z","iopub.execute_input":"2021-06-07T08:17:42.541521Z","iopub.status.idle":"2021-06-07T08:17:47.357558Z","shell.execute_reply.started":"2021-06-07T08:17:42.541475Z","shell.execute_reply":"2021-06-07T08:17:47.356294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_learning_curve(rf, X, y)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:17:47.361298Z","iopub.execute_input":"2021-06-07T08:17:47.361677Z","iopub.status.idle":"2021-06-07T08:18:42.777277Z","shell.execute_reply.started":"2021-06-07T08:17:47.361646Z","shell.execute_reply":"2021-06-07T08:18:42.775636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(classification_report(y_test, y_rf))","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:18:42.779056Z","iopub.execute_input":"2021-06-07T08:18:42.779396Z","iopub.status.idle":"2021-06-07T08:18:42.796976Z","shell.execute_reply.started":"2021-06-07T08:18:42.779366Z","shell.execute_reply":"2021-06-07T08:18:42.795365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cm = confusion_matrix(y_test, y_rf)\nprint(cm)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:18:42.798774Z","iopub.execute_input":"2021-06-07T08:18:42.799212Z","iopub.status.idle":"2021-06-07T08:18:42.812269Z","shell.execute_reply.started":"2021-06-07T08:18:42.799167Z","shell.execute_reply":"2021-06-07T08:18:42.810743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Machine Learning : Logistic Regression","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nlr = LogisticRegression()\nlr.fit(X_train, y_train)\ny_lr = lr.predict(X_test)\ncm = confusion_matrix(y_test, y_lr)\nprint(cm)\nprint(classification_report(y_test, y_lr))\nscore_lr = accuracy_score(y_lr, y_test)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:18:42.818075Z","iopub.execute_input":"2021-06-07T08:18:42.818652Z","iopub.status.idle":"2021-06-07T08:18:47.384074Z","shell.execute_reply.started":"2021-06-07T08:18:42.818603Z","shell.execute_reply":"2021-06-07T08:18:47.382705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_learning_curve(lr, X, y)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:18:47.386102Z","iopub.execute_input":"2021-06-07T08:18:47.386896Z","iopub.status.idle":"2021-06-07T08:19:41.422565Z","shell.execute_reply.started":"2021-06-07T08:18:47.386842Z","shell.execute_reply":"2021-06-07T08:19:41.421723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Machine Learning: XGBoost","metadata":{}},{"cell_type":"code","source":"import xgboost as XGB\nxgb  = XGB.XGBClassifier()\nxgb.fit(X_train, y_train)\ny_xgb = xgb.predict(X_test)\ncm = confusion_matrix(y_test, y_xgb)\nprint(cm)\nprint(classification_report(y_test, y_xgb))\nscore_xgb = accuracy_score(y_xgb, y_test)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:19:41.423824Z","iopub.execute_input":"2021-06-07T08:19:41.424301Z","iopub.status.idle":"2021-06-07T08:21:33.835201Z","shell.execute_reply.started":"2021-06-07T08:19:41.424255Z","shell.execute_reply":"2021-06-07T08:21:33.834308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Machine Learning: PCA svm","metadata":{}},{"cell_type":"markdown","source":"La méthode PCA consiste à transformer des variables liées entre elles (dites « corrélées » en statistique) en nouvelles variables décorrélées les unes des autres. Ces nouvelles variables sont nommées « composantes principales », ou axes principaux. Il s'agit d'une approche à la fois géométrique et statistique. Principalement utilisé comme outil de compresion linéaire, d'analyse de séries dynamiques d'images ou d'images multi spectrales.\n\nhttps://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html\n\nhttps://medium.com/apprentice-journal/pca-application-in-machine-learning-4827c07a61db\n\nhttps://en.wikipedia.org/wiki/Principal_component_analysis\n\n\nLes machines à vecteurs de support ou séparateurs à vaste marge sont un ensemble de techniques d'apprentissage supervisé destinées à résoudre des problèmes de discrimination et de régression.","metadata":{}},{"cell_type":"code","source":"from sklearn import svm\nfrom sklearn.decomposition import PCA\npca = PCA(n_components=0.7,whiten=True)\nX_train_PCA = pca.fit_transform(X_train)\nX_test_PCA = pca.transform(X_test)\nsv = svm.SVC(kernel='rbf',C=9)\nsv.fit(X_train_PCA , y_train)\ny_pca = sv.predict(X_test_PCA)\ncm = confusion_matrix(y_test, y_pca)\nprint(cm)\nprint(classification_report(y_test, y_pca))\nscore_pca = accuracy_score(y_pca, y_test)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:21:33.836264Z","iopub.execute_input":"2021-06-07T08:21:33.836684Z","iopub.status.idle":"2021-06-07T08:21:40.492176Z","shell.execute_reply.started":"2021-06-07T08:21:33.836654Z","shell.execute_reply":"2021-06-07T08:21:40.490953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Machine Learning: Decision Tree","metadata":{}},{"cell_type":"markdown","source":"C'est une technique d'apprentissage supervisé : on utilise un ensemble de données pour lesquelles on connaît la valeur de la variable-cible afin de construire l'arbre (données dites étiquetées), puis on extrapole les résultats à l'ensemble des données de test. ","metadata":{}},{"cell_type":"code","source":"from sklearn import tree\ndt = DecisionTreeClassifier()\ndt.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:21:40.493883Z","iopub.execute_input":"2021-06-07T08:21:40.494280Z","iopub.status.idle":"2021-06-07T08:21:42.098639Z","shell.execute_reply.started":"2021-06-07T08:21:40.494247Z","shell.execute_reply":"2021-06-07T08:21:42.097536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_dt = dt.predict(X_test)\n\ncm = confusion_matrix(y_test, y_dt)\nprint(cm)\nprint(classification_report(y_test, y_dt))\nscore_dt = accuracy_score(y_dt, y_test)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:21:42.100489Z","iopub.execute_input":"2021-06-07T08:21:42.100969Z","iopub.status.idle":"2021-06-07T08:21:42.137838Z","shell.execute_reply.started":"2021-06-07T08:21:42.100922Z","shell.execute_reply":"2021-06-07T08:21:42.136517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualisation des scores des différents algorithmes","metadata":{}},{"cell_type":"code","source":"models = pd.DataFrame({\n    'Model': ['LogisticRegression','XGBOOST', 'PCA', 'Decision Tree',\n              ],\n    'Score': [score_lr,score_xgb,score_pca,score_dt]})\nmodels.sort_values(by='Score', ascending=False)","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:21:42.139455Z","iopub.execute_input":"2021-06-07T08:21:42.139917Z","iopub.status.idle":"2021-06-07T08:21:42.155573Z","shell.execute_reply.started":"2021-06-07T08:21:42.139872Z","shell.execute_reply":"2021-06-07T08:21:42.154517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.subplots(figsize =(10, 5))\n\nsns.barplot(x='Score', y = 'Model', data = models, palette=\"Set3\")\n\nplt.title('Machine Learning Algorithm Accuracy Score \\n')\nplt.xlabel('Accuracy Score (%)')\nplt.ylabel('Algorithm')","metadata":{"execution":{"iopub.status.busy":"2021-06-07T08:21:42.157063Z","iopub.execute_input":"2021-06-07T08:21:42.157465Z","iopub.status.idle":"2021-06-07T08:21:42.331751Z","shell.execute_reply.started":"2021-06-07T08:21:42.157419Z","shell.execute_reply":"2021-06-07T08:21:42.330563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"On remarque que la méthode PCA est la plus précise avec 0.93 de précision. ","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}