{"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":"##########################################################\n# 1. Import All Packages\n##########################################################\nimport pandas as pd\nimport numpy as np\nfrom sklearn.linear_model import Perceptron\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nimport math\nfrom collections import Counter\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import multilabel_confusion_matrix\nfrom sklearn.svm import SVC\nimport csv\nfrom math import sqrt\nfrom statistics import mean\nimport seaborn as sns\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.datasets import make_classification\nfrom sklearn.pipeline import Pipeline","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:30:58.223024Z","iopub.execute_input":"2021-11-21T16:30:58.22327Z","iopub.status.idle":"2021-11-21T16:30:58.229625Z","shell.execute_reply.started":"2021-11-21T16:30:58.223243Z","shell.execute_reply":"2021-11-21T16:30:58.228817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 2. Load Testing and Training Dataset\n##########################################################\ndf_train = pd.read_csv(\"../input/digit-recognizer/train.csv\",header=0)\ndf_test = pd.read_csv(\"../input/digit-recognizer/test.csv\",header=0)\ndf_sample_submission = pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\",header=0)#\n\n# View sample data\ndf_train.head(10) ","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:30:58.231083Z","iopub.execute_input":"2021-11-21T16:30:58.231457Z","iopub.status.idle":"2021-11-21T16:31:03.293185Z","shell.execute_reply.started":"2021-11-21T16:30:58.231431Z","shell.execute_reply":"2021-11-21T16:31:03.292121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_label = set(df_train['label'].tolist())\nprint(\"All labels: {0}\".format(all_label))\n\nall_label_sub = set(df_sample_submission['Label'].tolist())\nprint(\"'sample_submission.csv' only has one class: {0}\".format(all_label_sub))\n\ndst_train = Counter(df_train['label'])\nprint(dst_train)\n\nsns.countplot(df_train['label'])","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:03.294622Z","iopub.execute_input":"2021-11-21T16:31:03.294907Z","iopub.status.idle":"2021-11-21T16:31:03.51519Z","shell.execute_reply.started":"2021-11-21T16:31:03.294869Z","shell.execute_reply":"2021-11-21T16:31:03.51466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 3. Share to Test and Train Data\n##########################################################\nx = df_train.iloc[:, 1:]\ny = df_train['label'].tolist()\n\nx_test = x.iloc[0:10000, :].values.astype('float32')\ny_test = y[0:10000]\nx_train = x.iloc[10000:, :].values.astype('float32')\ny_train = y[10000:]","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:03.516903Z","iopub.execute_input":"2021-11-21T16:31:03.517262Z","iopub.status.idle":"2021-11-21T16:31:03.56003Z","shell.execute_reply.started":"2021-11-21T16:31:03.517234Z","shell.execute_reply":"2021-11-21T16:31:03.559518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 4. Preview 10 Image Data\n##########################################################\n%matplotlib inline\n\nplt.figure(figsize=(12,10))\nx_cor, y_cor = 4, 4\nfor i in range(10):  \n    arr_img = np.asarray(x_train[i].reshape((28,28)));\n    plt.subplot(y_cor, x_cor, i+1)\n    \n    plt.imshow(arr_img, cmap='gray')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:03.561036Z","iopub.execute_input":"2021-11-21T16:31:03.561302Z","iopub.status.idle":"2021-11-21T16:31:04.401761Z","shell.execute_reply.started":"2021-11-21T16:31:03.56128Z","shell.execute_reply":"2021-11-21T16:31:04.400954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 5. Feature Normalization For Both (Test & Both)\n##########################################################\nprint((min(x_train[2]), max(x_train[2])))\n\nx_train = x_train/255.0\nx_test = x_test/255.0\n\nprint('x_train shape:', x_train.shape)\nprint(x_train.shape[0], 'train samples')\nprint(x_test.shape[0], 'test samples')","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:04.403056Z","iopub.execute_input":"2021-11-21T16:31:04.403232Z","iopub.status.idle":"2021-11-21T16:31:04.434637Z","shell.execute_reply.started":"2021-11-21T16:31:04.403211Z","shell.execute_reply":"2021-11-21T16:31:04.433629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 6. Train Perceptron Learning Algorithm\n##########################################################\n# Create a perceptron object with the parameters over the data\nmodel_clf = Perceptron(max_iter=6000, eta0=100, random_state=0)\n\n# Train the perceptron\nmodel_clf.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:04.435739Z","iopub.execute_input":"2021-11-21T16:31:04.435968Z","iopub.status.idle":"2021-11-21T16:31:11.349819Z","shell.execute_reply.started":"2021-11-21T16:31:04.435937Z","shell.execute_reply":"2021-11-21T16:31:11.348986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 7. Apply the Trained Learner to Test New Data\n##########################################################\n# Apply the trained perceptron to make prediction of test data\ny_pred = model_clf.predict(x_test)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:11.350852Z","iopub.execute_input":"2021-11-21T16:31:11.351061Z","iopub.status.idle":"2021-11-21T16:31:11.400094Z","shell.execute_reply.started":"2021-11-21T16:31:11.351033Z","shell.execute_reply":"2021-11-21T16:31:11.39945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Actual and predicted classes\nlst_actual_class = y_test\nlst_predicted_class = y_pred\n\n# label M(ganas = malignant) = 1 dan B(jinak = benign) = 0\nlst_classes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Compute binary-class confusion matrix \narr_out_matrix = multilabel_confusion_matrix(lst_actual_class, lst_predicted_class, labels=lst_classes)\n\n# Loop for each taget label\nfor no_class in range(len(lst_classes)):\n    arr_data = arr_out_matrix[no_class];\n\ntp = arr_data[1][1]\nfp = arr_data[0][1]\ntn = arr_data[0][0]\nfn = arr_data[1][0]\n\nsensitivity = round(tp/(tp+fn), 3);\nspecificity = round(tn/(tn+fp), 3);\naccuracy = round((tp+tn)/(tp+fp+tn+fn), 3);\nbalanced_accuracy = round((sensitivity+specificity)/2, 3);\nprecision = round(tp/(tp + fp), 3)\nf1Score = round((2 * ((precision * sensitivity) / (precision + sensitivity))), 3)\nmcc = round((((tp * tn)-(fp * fn))/ math.sqrt((tp + fp)*(tp + fn)*(tn + fp)*(tn + fn))),3)\n\nprint(\"TP={0}, FP={1}, TN={2}, FN={3}\".format(tp, fp, tn, fn));\nprint(\"Sensitivity: {0}\".format(sensitivity));\nprint(\"Specificity: {0}\".format(specificity));\nprint(\"Accuracy: {0}\".format(accuracy));\nprint(\"Balanced Accuracy: {0}\".format(balanced_accuracy));\nprint(\"Precision: {0}\".format(precision));\nprint(\"F1-Score: {0}\".format(f1Score));\nprint(\"MCC: {0}\\n\".format(mcc));","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:11.404376Z","iopub.execute_input":"2021-11-21T16:31:11.406399Z","iopub.status.idle":"2021-11-21T16:31:11.438456Z","shell.execute_reply.started":"2021-11-21T16:31:11.406339Z","shell.execute_reply":"2021-11-21T16:31:11.437778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Temp store results\nstore_sens = [0.735];\nstore_spec = [0.991];\nstore_acc = [0.965];\nstore_bal_acc = [0.863];\nstore_prec = [0.897];\nstore_fscore = [0.808];\nstore_mcc = [0.794];\n\nprint(\"Overall Preceptron Prediction:\");\nprint(\"Sensitivity: {0}%\".format(round(mean(store_sens)*100, 4)));\nprint(\"Specificity: {0}%\".format(round(mean(store_spec)*100, 4)));\nprint(\"Accuracy: {0}%\".format(round(mean(store_acc)*100, 4)));\nprint(\"Balanced Accuracy: {0}%\".format(round(mean(store_bal_acc)*100, 4)));\nprint(\"Precision: {0}%\".format(round(mean(store_prec)*100, 4)));\nprint(\"F1-Score: {0}%\".format(round(mean(store_fscore)*100, 4)))\nprint(\"MCC: {0}\\n\".format(round(mean(store_mcc), 4)))","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:11.444011Z","iopub.execute_input":"2021-11-21T16:31:11.446182Z","iopub.status.idle":"2021-11-21T16:31:11.462572Z","shell.execute_reply.started":"2021-11-21T16:31:11.446139Z","shell.execute_reply":"2021-11-21T16:31:11.461899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##########################################################\n# 8. Train Reandom Forest\n##########################################################\nmodel_clf = RandomForestClassifier(n_estimators=500, max_depth=2, random_state=0)\n\n# Train the Random Forest algorithm\nmodel_clf.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:11.466722Z","iopub.execute_input":"2021-11-21T16:31:11.46887Z","iopub.status.idle":"2021-11-21T16:31:27.585399Z","shell.execute_reply.started":"2021-11-21T16:31:11.468827Z","shell.execute_reply":"2021-11-21T16:31:27.584683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Apply the trained perceptron to make prediction of test data\ny_pred = model_clf.predict(x_test)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:27.586362Z","iopub.execute_input":"2021-11-21T16:31:27.586563Z","iopub.status.idle":"2021-11-21T16:31:27.966244Z","shell.execute_reply.started":"2021-11-21T16:31:27.586537Z","shell.execute_reply":"2021-11-21T16:31:27.964481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Actual and predicted classes\nlst_actual_class = y_test\nlst_predicted_class = y_pred\n\n# label M(ganas = malignant) = 1 dan B(jinak = benign) = 0\nlst_classes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Compute binary-class confusion matrix \narr_out_matrix = multilabel_confusion_matrix(lst_actual_class, lst_predicted_class, labels=lst_classes)\n\n# Loop for each taget label\nfor no_class in range(len(lst_classes)):\n    arr_data = arr_out_matrix[no_class];\n\ntp = arr_data[1][1]\nfp = arr_data[0][1]\ntn = arr_data[0][0]\nfn = arr_data[1][0]\n\nsensitivity = round(tp/(tp+fn), 3);\nspecificity = round(tn/(tn+fp), 3);\naccuracy = round((tp+tn)/(tp+fp+tn+fn), 3);\nbalanced_accuracy = round((sensitivity+specificity)/2, 3);\nprecision = round(tp/(tp + fp), 3)\nf1Score = round((2 * ((precision * sensitivity) / (precision + sensitivity))), 3)\nmcc = round((((tp * tn)-(fp * fn))/ math.sqrt((tp + fp)*(tp + fn)*(tn + fp)*(tn + fn))),3)\n\nprint(\"TP={0}, FP={1}, TN={2}, FN={3}\".format(tp, fp, tn, fn));\nprint(\"Sensitivity: {0}\".format(sensitivity));\nprint(\"Specificity: {0}\".format(specificity));\nprint(\"Accuracy: {0}\".format(accuracy));\nprint(\"Balanced Accuracy: {0}\".format(balanced_accuracy));\nprint(\"Precision: {0}\".format(precision));\nprint(\"F1-Score: {0}\".format(f1Score));\nprint(\"MCC: {0}\\n\".format(mcc));","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:27.967774Z","iopub.execute_input":"2021-11-21T16:31:27.968773Z","iopub.status.idle":"2021-11-21T16:31:27.993184Z","shell.execute_reply.started":"2021-11-21T16:31:27.96873Z","shell.execute_reply":"2021-11-21T16:31:27.991592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Temp store results\nstore_sens = [0.481];\nstore_spec = [0.966];\nstore_acc = [0.918];\nstore_bal_acc = [0.724];\nstore_prec = [0.609];\nstore_f1score = [0.537];\nstore_mcc = [0.497];\n\nprint(\"Overall Reandom Prediction:\");\nprint(\"Sensitivity: {0}%\".format(round(mean(store_sens)*100, 4)));\nprint(\"Specificity: {0}%\".format(round(mean(store_spec)*100, 4)));\nprint(\"Accuracy: {0}%\".format(round(mean(store_acc)*100, 4)));\nprint(\"Balanced Accuracy: {0}%\".format(round(mean(store_bal_acc)*100, 4)));\nprint(\"Precision: {0}%\".format(round(mean(store_prec)*100, 4)));\nprint(\"F1-Score: {0}%\".format(round(mean(store_fscore)*100, 4)))\nprint(\"MCC: {0}\\n\".format(round(mean(store_mcc), 4)))","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:27.995092Z","iopub.execute_input":"2021-11-21T16:31:27.995327Z","iopub.status.idle":"2021-11-21T16:31:28.008316Z","shell.execute_reply.started":"2021-11-21T16:31:27.995298Z","shell.execute_reply":"2021-11-21T16:31:28.007343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ##########################################################\n# 9. Train SVM \n# ##########################################################\nmodel_clf = make_pipeline(StandardScaler(), SVC(gamma='auto'))\nPipeline(steps=[('standardscaler', StandardScaler()), ('svc', SVC(gamma='auto'))])\n\n# # Train the Random Forest algorithm\nmodel_clf.fit(x_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:31:28.00945Z","iopub.execute_input":"2021-11-21T16:31:28.009773Z","iopub.status.idle":"2021-11-21T16:35:25.356989Z","shell.execute_reply.started":"2021-11-21T16:31:28.009746Z","shell.execute_reply":"2021-11-21T16:35:25.355997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Apply the trained random forest to make prediction of test data\ny_pred = model_clf.predict(x_test)","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:35:25.358092Z","iopub.execute_input":"2021-11-21T16:35:25.358276Z","iopub.status.idle":"2021-11-21T16:36:51.570291Z","shell.execute_reply.started":"2021-11-21T16:35:25.358253Z","shell.execute_reply":"2021-11-21T16:36:51.569396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Actual and predicted classes\nlst_actual_class = y_test\nlst_predicted_class = y_pred\n\n# label M(ganas = malignant) = 1 dan B(jinak = benign) = 0\nlst_classes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Compute binary-class confusion matrix \narr_out_matrix = multilabel_confusion_matrix(lst_actual_class, lst_predicted_class, labels=lst_classes)\n\n# Loop for each taget label\nfor no_class in range(len(lst_classes)):\n    arr_data = arr_out_matrix[no_class];\n\ntp = arr_data[1][1]\nfp = arr_data[0][1]\ntn = arr_data[0][0]\nfn = arr_data[1][0]\n\nsensitivity = round(tp/(tp+fn), 3);\nspecificity = round(tn/(tn+fp), 3);\naccuracy = round((tp+tn)/(tp+fp+tn+fn), 3);\nbalanced_accuracy = round((sensitivity+specificity)/2, 3);\nprecision = round(tp/(tp + fp), 3)\nf1Score = round((2 * ((precision * sensitivity) / (precision + sensitivity))), 3)\nmcc = round((((tp * tn)-(fp * fn))/ math.sqrt((tp + fp)*(tp + fn)*(tn + fp)*(tn + fn))),3)\n\nprint(\"TP={0}, FP={1}, TN={2}, FN={3}\".format(tp, fp, tn, fn));\nprint(\"Sensitivity: {0}\".format(sensitivity));\nprint(\"Specificity: {0}\".format(specificity));\nprint(\"Accuracy: {0}\".format(accuracy));\nprint(\"Balanced Accuracy: {0}\".format(balanced_accuracy));\nprint(\"Precision: {0}\".format(precision));\nprint(\"F1-Score: {0}\".format(f1Score));\nprint(\"MCC: {0}\\n\".format(mcc));","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:36:51.571431Z","iopub.execute_input":"2021-11-21T16:36:51.57167Z","iopub.status.idle":"2021-11-21T16:36:51.592006Z","shell.execute_reply.started":"2021-11-21T16:36:51.571629Z","shell.execute_reply":"2021-11-21T16:36:51.591104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Temp store results\nstore_sens = [0.941];\nstore_spec = [0.995];\nstore_acc = [0.989];\nstore_bal_acc = [0.968];\nstore_prec = [0.951];\nstore_f1score = [0.946];\nstore_mcc = [0.94];\n\nprint(\"Overall SVM Prediction:\");\nprint(\"Sensitivity: {0}%\".format(round(mean(store_sens)*100, 4)));\nprint(\"Specificity: {0}%\".format(round(mean(store_spec)*100, 4)));\nprint(\"Accuracy: {0}%\".format(round(mean(store_acc)*100, 4)));\nprint(\"Balanced Accuracy: {0}%\".format(round(mean(store_bal_acc)*100, 4)));\nprint(\"Precision: {0}%\".format(round(mean(store_prec)*100, 4)));\nprint(\"F1-Score: {0}%\".format(round(mean(store_fscore)*100, 4)))\nprint(\"MCC: {0}\\n\".format(round(mean(store_mcc), 4)))","metadata":{"execution":{"iopub.status.busy":"2021-11-21T16:39:14.919448Z","iopub.execute_input":"2021-11-21T16:39:14.919687Z","iopub.status.idle":"2021-11-21T16:39:14.92957Z","shell.execute_reply.started":"2021-11-21T16:39:14.919664Z","shell.execute_reply":"2021-11-21T16:39:14.928699Z"},"trusted":true},"execution_count":null,"outputs":[]}]}