{"cells":[{"metadata":{"_uuid":"ebb70d7332fcafed13c1c963652c48285b531b76","_cell_guid":"504c1194-6980-45aa-92f1-caf55b44dbb0"},"cell_type":"markdown","source":"# Digit Recognizer\n\nhttps://www.kaggle.com/c/digit-recognizer"},{"metadata":{},"cell_type":"markdown","source":"# KNN Manual Implementation"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Manual Implementation"},{"metadata":{"trusted":true},"cell_type":"code","source":"class KNN():\n    def fit(self, X, y):\n        self.dataset = X\n        self.labels = y\n\n\n    ########core-start###########   \n    def predict(self, X, k=3):\n        dists = np.sqrt(np.square(self.dataset-X).sum(axis=1))\n        dist_idxes = dists.argsort()\n        \n        label_cnt = {}\n        for i in range(k):\n            label = self.labels[dist_idxes[i]]\n            label_cnt[label] = label_cnt.get(label,0) + 1\n        \n        ans = max(label_cnt, key=label_cnt.get)\n        return(ans)\n     ########core-end###########  ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Test"},{"metadata":{"trusted":true},"cell_type":"code","source":"def test():\n    knn = KNN()\n    X = np.array(range(12)).reshape(3,4)\n    y = np.array(range(4))\n    knn.fit(X,y)\n    _X = np.array(range(4))\n    _y = knn.predict(_X)\n    print(_y == 0)\n    \n    _X = np.array(range(4,8))\n    _y = knn.predict(_X)\n    print(_y == 1)\n\ntest()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load Data"},{"metadata":{"_uuid":"8541a8ca7e77c1b6885d56f8b7b932b13f5f67c8","_cell_guid":"cc5d4fe8-a0a6-4640-973c-94bfe7639635","trusted":true},"cell_type":"code","source":"load_data_rows = 300\ndef load_data(train_row):\n    data_dir = '../input/'\n    train = pd.read_csv(data_dir + 'train.csv')\n    print(train.shape)\n    X_train = train.values[0:train_row,1:] \n    y_train = train.values[0:train_row,0] \n    \n    \n    Pred_test = pd.read_csv(data_dir + 'test.csv').values  \n    print(Pred_test.shape)\n    return X_train, y_train, Pred_test\n\nOrigin_X_train, Origin_y_train, Origin_X_test = load_data(load_data_rows)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4eb06a693881cc878ccd9fc9647af48b2743b0ce","_cell_guid":"5c654f1a-4c8c-4b7d-b1e8-5fae2ff048c5"},"cell_type":"markdown","source":"\n# Plot Data"},{"metadata":{"_uuid":"761de08af4ee6c975fe406ed66f90f0bc88fe8ff","_cell_guid":"c2c6ec59-ebc1-4d4e-ae89-d5a9ef240835","trusted":true},"cell_type":"code","source":"import matplotlib\nimport matplotlib.pyplot as plt\n\ndef plot_digit(X,y,row):\n    print (y[row])\n    plt.imshow(X[row].reshape((28, 28)))\n    plt.show()\n\nplot_digit(Origin_X_train,Origin_y_train, 205)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"31a53b52bea59d427d33194aafd6103ad46cf601","_cell_guid":"16e64324-48af-492d-8f42-c6ac6e7a35c0"},"cell_type":"markdown","source":"# train_test_split 80%"},{"metadata":{"_uuid":"9f3273d2f90dc599f82c63f3bc829b779e282eb5","_cell_guid":"ff788363-fa17-4748-bba8-6a4ae2487181","trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train,X_vali, y_train, y_vali = train_test_split(Origin_X_train,\n                                                   Origin_y_train,\n                                                   test_size = 0.2,\n                                                   random_state = 0)\n\nprint(X_train.shape, X_vali.shape, y_train.shape, y_vali.shape)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d1d5b8c1013bbb069b93fc79791ddaa2d1607277","_cell_guid":"68bc3069-1241-4dc1-a28c-46ca0d22da5d"},"cell_type":"markdown","source":"\n# KNN training"},{"metadata":{"_uuid":"2d8a667aa10291fe03b528c4ab5f55eb7dcf9dd0","_cell_guid":"93aec800-e499-4de7-a218-9d3231043b32","trusted":true},"cell_type":"code","source":"import time\nfrom sklearn.metrics import accuracy_score,classification_report,confusion_matrix\n\nans_k = 0\nans_accuracy = 0\nk_range = range(1, 8)\n\n\nknn = KNN()\nknn.fit(X_train,y_train)\n\n        \nfor k in k_range:\n    print(\"k = \" + str(k) + \" begin \")\n    \n    start = time.time()\n    y_pred = []\n    for i in range(X_vali.shape[0]):\n        pred = knn.predict(X_vali[i], k)\n        y_pred.append(pred)\n        \n    accuracy = accuracy_score(y_vali,y_pred)\n    print ('k = '+ str(k) , ' accuracy =' + str(accuracy))        \n    if accuracy > ans_accuracy:\n        ans_accuracy = accuracy\n        ans_k = k\n    end = time.time()\n    print(classification_report(y_vali, y_pred))  \n    print(confusion_matrix(y_vali, y_pred))  \n\n    print(\"Complete time: \" + str(end-start) + \" Secs.\")\n    \nprint('Finisged KNN training and the best k is ' + str(ans_k))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e11013543394219528ba34e266c9134e9b340ebf","_cell_guid":"85741aa6-14e1-43e3-b12c-f00180ea9db8"},"cell_type":"markdown","source":"# Plot Accuracy from the training"},{"metadata":{"_uuid":"fdbf617c65d78718fe7793e7fc2e55ecadaaa04e","_cell_guid":"0fc75b9d-87e5-4147-b74f-724d7bc93fcd"},"cell_type":"markdown","source":"# Predict\n"},{"metadata":{"_uuid":"1d791d62060f3b6deb5215c89eb6e813b95bd536","_cell_guid":"87c41cfe-4863-4e7f-a38b-dabdf14b24a0","trusted":true},"cell_type":"code","source":"k = ans_k\n\nknn = KNN()\nknn.fit(Origin_X_train,Origin_y_train)\ny_pred = knn.predict(Origin_X_test,k)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6890a00551cdf3ec76ee99a60965a670ed20c239","_cell_guid":"02616849-0f6c-422f-82b1-f1b7a31c87c5"},"cell_type":"markdown","source":"# plot prediction to verify"},{"metadata":{"_uuid":"f5456e57ecb856612c2be0e7b3089a5e4a34dd5a","_cell_guid":"6d774516-3d31-417a-b1eb-d7a8ffa6242e","trusted":true},"cell_type":"code","source":"row = 1050\nplot_digit(Origin_X_test, y_pred, row)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"401c578da3e3c6ea4180242bc5843d7a8cb00b65","_cell_guid":"eadc71f0-386e-4318-8261-d3a0da05c0bd"},"cell_type":"markdown","source":"# Save submission to Digit_Recognizer_Result.csv\n# as in this format:\n\n* ImageId\tLabel\n* 1\t2\n* 2\t0\n* 3\t9\n* 4\t9"},{"metadata":{"_uuid":"6b467e130ce5d8f5656062c7eadf63621d171671","_cell_guid":"a7c7dd6d-6d89-4ea9-9d37-41a6d3ecf048","trusted":true},"cell_type":"code","source":"print(len(y_pred))\n\n# save submission to csv\npd.DataFrame({\"ImageId\": list(range(1,len(y_pred)+1)),\"Label\": y_pred}).to_csv('Digit_Recognizer_Result.csv', index=False,header=True)\n      \nresult = pd.read_csv('Digit_Recognizer_Result.csv')\n    \nresult","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result.head(20)","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}