{"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":"markdown","source":"![](https://aigeekprogrammer.com/wp-content/uploads/2019/08/Handwriting-digit-recognition-Keras-MNIST.jpg)","metadata":{}},{"cell_type":"markdown","source":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nplt.figure(figsize=(15,15))\nsns.set_style('darkgrid')\npd.set_option('display.max_rows',100)\npd.set_option('display.max_columns',50)\nwarnings.filterwarnings('ignore')","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2022-11-23T10:06:32.153935Z","iopub.execute_input":"2022-11-23T10:06:32.155421Z","iopub.status.idle":"2022-11-23T10:06:33.400394Z","shell.execute_reply.started":"2022-11-23T10:06:32.155303Z","shell.execute_reply":"2022-11-23T10:06:33.399086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.tree import DecisionTreeClassifier\n\nfrom sklearn.metrics import confusion_matrix, accuracy_score, classification_report\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import binarize, Binarizer\nfrom sklearn.feature_selection import SelectKBest, chi2\nfrom sklearn.decomposition import PCA","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:33.402643Z","iopub.execute_input":"2022-11-23T10:06:33.403242Z","iopub.status.idle":"2022-11-23T10:06:33.894814Z","shell.execute_reply.started":"2022-11-23T10:06:33.403202Z","shell.execute_reply":"2022-11-23T10:06:33.893403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loadnig Data","metadata":{}},{"cell_type":"code","source":"digits_data = pd.read_csv('../input/digit-recognizer/train.csv')\ndigits_test = pd.read_csv('../input/digit-recognizer/test.csv')\ndigits_submit = pd.read_csv('../input/digit-recognizer/sample_submission.csv')\ndigits_data","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:33.899947Z","iopub.execute_input":"2022-11-23T10:06:33.901042Z","iopub.status.idle":"2022-11-23T10:06:40.343290Z","shell.execute_reply.started":"2022-11-23T10:06:33.900999Z","shell.execute_reply":"2022-11-23T10:06:40.341950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **It is difficult to see the description of all columns, but at least let's check is there is any null values**","metadata":{}},{"cell_type":"code","source":"digits_data.columns[digits_data.isna().sum()>0]","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:40.345905Z","iopub.execute_input":"2022-11-23T10:06:40.346317Z","iopub.status.idle":"2022-11-23T10:06:40.399367Z","shell.execute_reply.started":"2022-11-23T10:06:40.346279Z","shell.execute_reply":"2022-11-23T10:06:40.398179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***Good, there is no missing values (as expected)***","metadata":{}},{"cell_type":"markdown","source":"> **Let's check for distribution of labels data**","metadata":{}},{"cell_type":"code","source":"print(digits_data['label'].value_counts().sort_index())","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:40.400771Z","iopub.execute_input":"2022-11-23T10:06:40.401168Z","iopub.status.idle":"2022-11-23T10:06:40.421846Z","shell.execute_reply.started":"2022-11-23T10:06:40.401134Z","shell.execute_reply":"2022-11-23T10:06:40.420431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***It looks normal, almost balanced, and each label have enough data***","metadata":{}},{"cell_type":"markdown","source":"# Visualize some random digits","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=10,ncols=6, figsize=(20,40),sharey=True, sharex=True)\nidx = 0\nfor i in range(10):\n    for j in (digits_data[digits_data.label==i].sample(n=6).index):\n        digit = digits_data['label'].loc[j]\n        idx += 1\n        plt.subplot(10,6,idx)\n        plt.imshow(np.array(digits_data.iloc[j,1:]).reshape(28,28), cmap='cividis')\n        plt.title(f'Digit is {digit}',fontsize=14)\n        plt.grid(None)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:40.424536Z","iopub.execute_input":"2022-11-23T10:06:40.424953Z","iopub.status.idle":"2022-11-23T10:06:48.444702Z","shell.execute_reply.started":"2022-11-23T10:06:40.424916Z","shell.execute_reply":"2022-11-23T10:06:48.443397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **There does seem to be some noise around the numbers. Let's check the values of which component the hand drawing**","metadata":{"execution":{"iopub.execute_input":"2022-11-20T08:37:56.258255Z","iopub.status.busy":"2022-11-20T08:37:56.257811Z","iopub.status.idle":"2022-11-20T08:37:56.266883Z","shell.execute_reply":"2022-11-20T08:37:56.265433Z","shell.execute_reply.started":"2022-11-20T08:37:56.258221Z"}}},{"cell_type":"code","source":"for k in range(10):\n    temp_freq = pd.Series(digits_data.iloc[:,1:].sample(1).T.value_counts(), name='freq')\n    print(temp_freq[temp_freq>3])\n    print('='*30)","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:48.446892Z","iopub.execute_input":"2022-11-23T10:06:48.447311Z","iopub.status.idle":"2022-11-23T10:06:48.502210Z","shell.execute_reply.started":"2022-11-23T10:06:48.447272Z","shell.execute_reply":"2022-11-23T10:06:48.500762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(data=digits_data.iloc[:,1:].sample(100).T,kind='kde', legend=False)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:48.503888Z","iopub.execute_input":"2022-11-23T10:06:48.504264Z","iopub.status.idle":"2022-11-23T10:06:49.676490Z","shell.execute_reply.started":"2022-11-23T10:06:48.504231Z","shell.execute_reply":"2022-11-23T10:06:49.675546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Ok, it looks like any digit consists of numbers greater than 200 and a very little small numbers**\n>\n> **Let's binarize all numbers by trying some different thresholds and seeing their efficiency.**","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=10,ncols=6, figsize=(20,40),sharey=True, sharex=True)\nidx = 0\nfor k in np.random.choice(range(42000), 10):\n    img = np.array(digits_data.iloc[k,1:]).reshape(28,28)\n    idx += 1\n    plt.grid(None)        \n    plt.subplot(10,6,idx)\n    plt.imshow(img, cmap='Accent')\n    plt.title(f'Original Image\\n Digit={digits_data.iloc[k,0]}',fontsize=14)\n    for i in range(1,6):\n        idx += 1\n        plt.grid(None)    \n        plt.subplot(10,6,idx)\n        plt.imshow(binarize(img,threshold=i*50), cmap='Accent')\n        plt.title(f'Binarize at\\n threshold={i*50}',fontsize=14)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:49.677903Z","iopub.execute_input":"2022-11-23T10:06:49.678884Z","iopub.status.idle":"2022-11-23T10:06:57.591163Z","shell.execute_reply.started":"2022-11-23T10:06:49.678846Z","shell.execute_reply":"2022-11-23T10:06:57.589873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Good, each threshold has its effect on images. Let's see it in the model.**\n>\n> **Let's work with the original Data**","metadata":{}},{"cell_type":"markdown","source":"# Preprocessing & Modeling","metadata":{}},{"cell_type":"code","source":"digitsX = digits_data.iloc[:,1:]\ndigitsY = digits_data.label","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:57.595020Z","iopub.execute_input":"2022-11-23T10:06:57.595428Z","iopub.status.idle":"2022-11-23T10:06:57.602422Z","shell.execute_reply.started":"2022-11-23T10:06:57.595390Z","shell.execute_reply":"2022-11-23T10:06:57.600930Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Most of data are zeros, for better speed and performance let's reduce then 784 feature to only 100 feature by using PCA**","metadata":{}},{"cell_type":"code","source":"pca = PCA(n_components=100).fit(digitsX)\ndigits_X_best = pca.transform(digitsX)\ndigits_test_best = pca.transform(digits_test)","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:06:57.604095Z","iopub.execute_input":"2022-11-23T10:06:57.604674Z","iopub.status.idle":"2022-11-23T10:07:02.279344Z","shell.execute_reply.started":"2022-11-23T10:06:57.604622Z","shell.execute_reply":"2022-11-23T10:07:02.277933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train, x_valid, y_train, y_valid = train_test_split(digits_X_best, digitsY, test_size = .25, shuffle=True)\nx_train.shape, x_valid.shape","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:07:02.282034Z","iopub.execute_input":"2022-11-23T10:07:02.283197Z","iopub.status.idle":"2022-11-23T10:07:02.318887Z","shell.execute_reply.started":"2022-11-23T10:07:02.283129Z","shell.execute_reply":"2022-11-23T10:07:02.317144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **After triyng alot of algorithms, i found the SVC is the best result**","metadata":{}},{"cell_type":"code","source":"print('\\n',f' using a 2nd degree polynomial SVC '.center(100,'='),'\\n')\nsvc_model = SVC(kernel='poly', degree=2)\nsvc_model.fit(x_train, y_train)\nypred = svc_model.predict(x_valid)\nprint('\\n',' confusion_matrix '.center(100,'-'),'\\n')\nprint(confusion_matrix(y_valid, ypred))\nprint('\\n',' classification_report '.center(100,'-'),'\\n')\nprint(print(classification_report(y_valid,ypred)))\nprint('\\n',' accuracy_score '.center(100,'-'),'\\n')\nprint('Accuracy score = ', round(accuracy_score(y_valid,ypred)*100,1),'%')\nprint('-'*100)","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:07:02.321321Z","iopub.execute_input":"2022-11-23T10:07:02.322369Z","iopub.status.idle":"2022-11-23T10:07:26.709635Z","shell.execute_reply.started":"2022-11-23T10:07:02.322310Z","shell.execute_reply":"2022-11-23T10:07:26.708222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Predicting test data**","metadata":{}},{"cell_type":"code","source":"ytpred = svc_model.predict(digits_test_best)","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:07:26.711214Z","iopub.execute_input":"2022-11-23T10:07:26.711641Z","iopub.status.idle":"2022-11-23T10:07:41.029895Z","shell.execute_reply.started":"2022-11-23T10:07:26.711607Z","shell.execute_reply":"2022-11-23T10:07:41.028945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Check some random test Images","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=10,ncols=6, figsize=(20,40),sharey=True, sharex=True)\nidx = 0\nfor k in np.random.choice(range(28000), 60):\n    img = np.array(digits_test.iloc[k,:]).reshape(28,28)\n    idx += 1\n    plt.grid(None)        \n    plt.subplot(10,6,idx)\n    plt.imshow(img, cmap='coolwarm')\n    plt.title(f'Predicted Digit={ytpred[k]}',fontsize=14)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:07:41.031840Z","iopub.execute_input":"2022-11-23T10:07:41.032647Z","iopub.status.idle":"2022-11-23T10:07:49.069110Z","shell.execute_reply.started":"2022-11-23T10:07:41.032602Z","shell.execute_reply":"2022-11-23T10:07:49.068187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit_dict = {'ImageId': range(1,28001), 'label' : pd.Series(ytpred)}\nmy_submission = pd.DataFrame(submit_dict)\nmy_submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-11-23T10:07:49.070397Z","iopub.execute_input":"2022-11-23T10:07:49.071270Z","iopub.status.idle":"2022-11-23T10:07:49.109640Z","shell.execute_reply.started":"2022-11-23T10:07:49.071233Z","shell.execute_reply":"2022-11-23T10:07:49.108208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> ***If you like it, please upvote, and feel free to discuss this notebook.***","metadata":{}}]}