{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":3004,"databundleVersionId":861823}],"dockerImageVersionId":31286,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%matplotlib inline\nimport cv2\nimport numpy as np\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:21:22.607735Z","iopub.execute_input":"2026-03-14T08:21:22.608106Z","iopub.status.idle":"2026-03-14T08:21:22.941133Z","shell.execute_reply.started":"2026-03-14T08:21:22.608071Z","shell.execute_reply":"2026-03-14T08:21:22.940134Z"}},"outputs":[],"execution_count":1},{"cell_type":"code","source":"train = np.loadtxt('/kaggle/input/competitions/digit-recognizer/train.csv', delimiter=',', skiprows=1)\ntest = np.loadtxt('/kaggle/input/competitions/digit-recognizer/test.csv', delimiter=',', skiprows=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:25:48.91808Z","iopub.execute_input":"2026-03-14T08:25:48.919097Z","iopub.status.idle":"2026-03-14T08:25:53.447063Z","shell.execute_reply.started":"2026-03-14T08:25:48.919054Z","shell.execute_reply":"2026-03-14T08:25:53.446176Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"# сохраняем разметку в отдельную переменную\ntrain_label = train[:, 0]\n# приводим размерность к удобному для обаботки виду\ntrain_img = np.resize(train[:, 1:], (train.shape[0], 28, 28))\ntest_img = np.resize(test, (test.shape[0], 28, 28))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:26:01.79512Z","iopub.execute_input":"2026-03-14T08:26:01.795463Z","iopub.status.idle":"2026-03-14T08:26:02.048934Z","shell.execute_reply.started":"2026-03-14T08:26:01.795434Z","shell.execute_reply":"2026-03-14T08:26:02.048035Z"}},"outputs":[],"execution_count":7},{"cell_type":"code","source":"train_img.shape, test_img.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:26:09.22425Z","iopub.execute_input":"2026-03-14T08:26:09.225115Z","iopub.status.idle":"2026-03-14T08:26:09.233972Z","shell.execute_reply.started":"2026-03-14T08:26:09.225063Z","shell.execute_reply":"2026-03-14T08:26:09.232975Z"}},"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"((42000, 28, 28), (28000, 28, 28))"},"metadata":{}}],"execution_count":8},{"cell_type":"code","source":"fig = plt.figure(figsize=(20, 10))\nfor i, img in enumerate(train_img[0:5], 1):\n    subplot = fig.add_subplot(1, 7, i)\n    plt.imshow(img, cmap='gray');\n    subplot.set_title('%s' % train_label[i - 1]);","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:26:14.53831Z","iopub.execute_input":"2026-03-14T08:26:14.538628Z","iopub.status.idle":"2026-03-14T08:26:15.191638Z","shell.execute_reply.started":"2026-03-14T08:26:14.538601Z","shell.execute_reply":"2026-03-14T08:26:15.190766Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 2000x1000 with 5 Axes>","image/png":"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\n"},"metadata":{}}],"execution_count":9},{"cell_type":"code","source":"winSize = (28,28)\nblockSize = (8,8)\nblockStride = (4,4)\ncellSize = (4,4)\nnbins = 9\nderivAperture = 1\nwinSigma = 4.\nhistogramNormType = 0\nL2HysThreshold = 2.0000000000000001e-01\ngammaCorrection = 0\nnlevels = 64\n\nhog = cv2.HOGDescriptor(winSize,\n                        blockSize,\n                        blockStride,\n                        cellSize,\n                        nbins,\n                        derivAperture,\n                        winSigma,\n                        histogramNormType,\n                        L2HysThreshold,\n                        gammaCorrection,\n                        nlevels)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:26:50.94703Z","iopub.execute_input":"2026-03-14T08:26:50.947785Z","iopub.status.idle":"2026-03-14T08:26:50.954824Z","shell.execute_reply.started":"2026-03-14T08:26:50.947755Z","shell.execute_reply":"2026-03-14T08:26:50.953895Z"}},"outputs":[],"execution_count":10},{"cell_type":"code","source":"descriptor = hog.compute(np.uint8(train_img[0]))\nprint('Descriptor size: %d' % len(descriptor))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:26:59.477793Z","iopub.execute_input":"2026-03-14T08:26:59.478247Z","iopub.status.idle":"2026-03-14T08:26:59.495479Z","shell.execute_reply.started":"2026-03-14T08:26:59.478217Z","shell.execute_reply":"2026-03-14T08:26:59.494553Z"}},"outputs":[{"name":"stdout","text":"Descriptor size: 1296\n","output_type":"stream"}],"execution_count":11},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfig = plt.figure()\nax = fig.add_axes([0,0,1,1])\nax.bar(range(len(descriptor)), descriptor.reshape(-1))\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:27:04.215008Z","iopub.execute_input":"2026-03-14T08:27:04.215344Z","iopub.status.idle":"2026-03-14T08:27:05.681292Z","shell.execute_reply.started":"2026-03-14T08:27:04.215315Z","shell.execute_reply":"2026-03-14T08:27:05.680399Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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pk2bFqeffnqcfPLJ8Xu/93uH/KW4jRs3xhVXXBH9+vWLQYMGxU033RQff/xxRz6VZMybNy969eoVN9xwQ26dOW4bmzdvjj/+4z+O008/Pfr27RvDhw+P559/Pnd7lmUxZ86cOOOMM6Jv375RVVUVr732Wov72LZtW0ycODFKSkpiwIABce2118b777/f0U+ly9q3b1/cdtttMXTo0Ojbt2989rOfjdtvvz0OvNiOec7fk08+GePHj4/BgwdHr1694tFHH21xe1vN6c9+9rO49NJLo7i4OMrLy+Nb3/pWez+1LuVI87x3796YOXNmDB8+PH7lV34lBg8eHJMmTYp33nmnxX2Y5xOU0cKSJUuywsLCbPHixdnPf/7zbOrUqdmAAQOyxsbGzh5aMqqrq7Pvf//72fr167N169ZlX/7yl7Ozzjore//993PbXHfddVl5eXlWV1eXPf/889lv/MZvZBdddFHu9o8//jg7//zzs6qqquyFF17Ili9fng0cODCbPXt2ZzylLm316tVZRUVFdsEFF2QzZszIrTfHJ27btm3Zpz/96exP/uRPsmeffTZ74403ssceeyx7/fXXc9vMmzcv69+/f/boo49mL774YnbllVdmQ4cOzT788MPcNl/60peyESNGZM8880z2X//1X9nnPve5bMKECZ3xlLqkO+64Izv99NOzn/zkJ9mbb76ZPfTQQ9nJJ5+cfec738ltY57zt3z58uyWW27JHn744SwiskceeaTF7W0xpzt27MhKS0uziRMnZuvXr89+8IMfZH379s3+6Z/+qaOeZqc70jxv3749q6qqypYuXZq98sorWX19fTZ27Nhs9OjRLe7DPJ8YMXuQsWPHZtOmTct9vG/fvmzw4MFZbW1tJ44qbVu2bMkiIvvpT3+aZdkv/3GfdNJJ2UMPPZTb5uWXX84iIquvr8+y7JdfHAoKCrKGhobcNvfcc09WUlKS7d69u2OfQBe2c+fO7Oyzz85WrlyZff7zn8/FrDluGzNnzswuueSSw97e3NyclZWVZd/+9rdz67Zv354VFRVlP/jBD7Isy7Jf/OIXWURkzz33XG6bf//3f8969eqVbd68uf0Gn5Arrrgi+9M//dMW6373d383mzhxYpZl5rktHBxZbTWnd999d3bqqae2+Joxc+bM7JxzzmnnZ9Q1tfZDw8FWr16dRUT29ttvZ1lmntuC0wwOsGfPnlizZk1UVVXl1hUUFERVVVXU19d34sjStmPHjoiIOO200yIiYs2aNbF3794W8zxs2LA466yzcvNcX18fw4cPz/1luYiI6urqaGpqip///OcdOPqubdq0aXHFFVe0mMsIc9xWfvzjH8eYMWPiD/7gD2LQoEExatSouO+++3K3v/nmm9HQ0NBinvv37x/jxo1rMc8DBgyIMWPG5LapqqqKgoKCePbZZzvuyXRhF110UdTV1cWrr74aEREvvvhiPPXUU3H55ZdHhHluD201p/X19fGbv/mbUVhYmNumuro6NmzYEP/7v//bQc8mLTt27IhevXrFgAEDIsI8t4W8/5xtd7Z169bYt29fi2/uERGlpaXxyiuvdNKo0tbc3Bw33HBDXHzxxbk/YdzQ0BCFhYW5f8j7lZaWRkNDQ26b1j4P+28jYsmSJbF27dp47rnnDrnNHLeNN954I+65556oqamJm2++OZ577rn4sz/7sygsLIzJkyfn5qm1eTxwngcNGtTi9j59+sRpp51mnv/frFmzoqmpKYYNGxa9e/eOffv2xR133BETJ06MiDDP7aCt5rShoSGGDh16yH3sv+3UU09tl/Gn6qOPPoqZM2fGhAkToqSkJCLMc1sQs7SradOmxfr16+Opp57q7KF0K5s2bYoZM2bEypUro7i4uLOH0201NzfHmDFj4s4774yIiFGjRsX69etj0aJFMXny5E4eXffxwx/+MB544IF48MEH49d+7ddi3bp1ccMNN8TgwYPNM93G3r174w//8A8jy7K45557Ons43YrTDA4wcODA6N279yHv+G5sbIyysrJOGlW6pk+fHj/5yU/iiSeeiDPPPDO3vqysLPbs2RPbt29vsf2B81xWVtbq52H/bT3dmjVrYsuWLXHhhRdGnz59ok+fPvHTn/40/v7v/z769OkTpaWl5rgNnHHGGXHeeee1WHfuuefGxo0bI+KTeTrS14yysrLYsmVLi9s//vjj2LZtm3n+fzfddFPMmjUr/uiP/iiGDx8e11xzTdx4441RW1sbEea5PbTVnPo6cmz2h+zbb78dK1euzB2VjTDPbUHMHqCwsDBGjx4ddXV1uXXNzc1RV1cXlZWVnTiytGRZFtOnT49HHnkkHn/88UN+NTJ69Og46aSTWszzhg0bYuPGjbl5rqysjJdeeqnFP/D9XwAOjoue6Itf/GK89NJLsW7dutwyZsyYmDhxYu7/zfGJu/jiiw+5rNyrr74an/70pyMiYujQoVFWVtZinpuamuLZZ59tMc/bt2+PNWvW5LZ5/PHHo7m5OcaNG9cBz6Lr++CDD6KgoOW3o969e0dzc3NEmOf20FZzWllZGU8++WTs3bs3t83KlSvjnHPO6fG/+t5vf8i+9tpr8Z//+Z9x+umnt7jdPLeBzn4HWlezZMmSrKioKLv//vuzX/ziF9nXvva1bMCAAS3e8c2RXX/99Vn//v2zVatWZe+++25u+eCDD3LbXHfdddlZZ52VPf7449nzzz+fVVZWZpWVlbnb91826rLLLsvWrVuXrVixIvvUpz7lslFHcODVDLLMHLeF1atXZ3369MnuuOOO7LXXXsseeOCBrF+/ftm//Mu/5LaZN29eNmDAgOxf//Vfs5/97GfZb//2b7d6eaNRo0Zlzz77bPbUU09lZ599do++ZNTBJk+enA0ZMiR3aa6HH344GzhwYPaNb3wjt415zt/OnTuzF154IXvhhReyiMjmz5+fvfDCC7l30bfFnG7fvj0rLS3Nrrnmmmz9+vXZkiVLsn79+vWoS0YdaZ737NmTXXnlldmZZ56ZrVu3rsX3xAOvTGCeT4yYbcU//MM/ZGeddVZWWFiYjR07NnvmmWc6e0hJiYhWl+9///u5bT788MPs61//enbqqadm/fr1y37nd34ne/fdd1vcz1tvvZVdfvnlWd++fbOBAwdmf/7nf57t3bu3g59NOg6OWXPcNv7t3/4tO//887OioqJs2LBh2b333tvi9ubm5uy2227LSktLs6KiouyLX/xitmHDhhbb/M///E82YcKE7OSTT85KSkqyKVOmZDt37uzIp9GlNTU1ZTNmzMjOOuusrLi4OPvMZz6T3XLLLS2+2Zvn/D3xxBOtfi2ePHlylmVtN6cvvvhidskll2RFRUXZkCFDsnnz5nXUU+wSjjTPb7755mG/Jz7xxBO5+zDPJ6ZXlh3wJ1YAACAhzpkFACBZYhYAgGSJWQAAkiVmAQBIlpgFACBZYhYAgGSJWQAAkiVmAQBIlpgFACBZYhYAgGSJWQAAkvV/0363CWmcS8gAAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":12},{"cell_type":"code","source":"train_hog = np.array([hog.compute(np.uint8(img)).flatten() for img in train_img])\ntest_hog = np.array([hog.compute(np.uint8(img)).flatten() for img in test_img])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:27:11.399197Z","iopub.execute_input":"2026-03-14T08:27:11.399525Z","iopub.status.idle":"2026-03-14T08:27:14.252225Z","shell.execute_reply.started":"2026-03-14T08:27:11.399497Z","shell.execute_reply":"2026-03-14T08:27:14.25122Z"}},"outputs":[],"execution_count":13},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\n\nX_train, X_val, y_train, y_val = train_test_split(train_hog, train_label, test_size=0.2, random_state=42, stratify=train_label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:27:17.26402Z","iopub.execute_input":"2026-03-14T08:27:17.264825Z","iopub.status.idle":"2026-03-14T08:27:19.280054Z","shell.execute_reply.started":"2026-03-14T08:27:17.264793Z","shell.execute_reply":"2026-03-14T08:27:19.279171Z"}},"outputs":[],"execution_count":14},{"cell_type":"code","source":"import optuna\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.metrics import accuracy_score\n\nall_matched = {}\nseed = 98\n\ndef objective(trial):\n    model_params = {\n    'n_estimators': trial.suggest_int('n_estimators', 50, 300),\n    'max_depth': trial.suggest_int('max_depth', 5, 50),\n    'min_samples_split': trial.suggest_int('min_samples_split', 2, 20),\n    'random_state': seed,\n    'n_jobs': -1\n    }\n\n#модель\n    model = RandomForestClassifier(**model_params)\n    score = cross_val_score(model, train_hog, train_label, cv=3, scoring='accuracy', n_jobs=-1).mean()\n\n    all_matched.update(\n        {\n            score: {\n                'data': None,\n                'model': model,\n                'params': model_params\n            }\n        }\n    )\n\n    return score","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:27:25.625939Z","iopub.execute_input":"2026-03-14T08:27:25.626469Z","iopub.status.idle":"2026-03-14T08:27:26.259162Z","shell.execute_reply.started":"2026-03-14T08:27:25.626435Z","shell.execute_reply":"2026-03-14T08:27:26.258157Z"}},"outputs":[],"execution_count":15},{"cell_type":"code","source":"TRIALS = 3\nstudy = optuna.create_study(direction='maximize')\nstudy.optimize(objective, n_trials=TRIALS, show_progress_bar=True)\n\nbest_score = study.best_trial.value\nbest_model = all_matched[best_score]['model']\nbest_params = all_matched[best_score]['params']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:27:32.416178Z","iopub.execute_input":"2026-03-14T08:27:32.416505Z","iopub.status.idle":"2026-03-14T08:34:28.405398Z","shell.execute_reply.started":"2026-03-14T08:27:32.416479Z","shell.execute_reply":"2026-03-14T08:34:28.404374Z"}},"outputs":[{"name":"stderr","text":"[I 2026-03-14 08:27:32,418] A new study created in memory with name: no-name-55305880-9710-407d-bacb-0ea8744558fb\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/3 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e549595e30cf4ca69b1b2713e4801449"}},"metadata":{}},{"name":"stdout","text":"[I 2026-03-14 08:31:11,682] Trial 0 finished with value: 0.9784047619047619 and parameters: {'n_estimators': 159, 'max_depth': 29, 'min_samples_split': 15}. Best is trial 0 with value: 0.9784047619047619.\n[I 2026-03-14 08:32:53,358] Trial 1 finished with value: 0.9774761904761905 and parameters: {'n_estimators': 73, 'max_depth': 41, 'min_samples_split': 13}. Best is trial 0 with value: 0.9784047619047619.\n[I 2026-03-14 08:34:28,398] Trial 2 finished with value: 0.9783809523809524 and parameters: {'n_estimators': 77, 'max_depth': 16, 'min_samples_split': 2}. Best is trial 0 with value: 0.9784047619047619.\n","output_type":"stream"}],"execution_count":16},{"cell_type":"code","source":"model = RandomForestClassifier(**best_params)\nmodel.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:42:42.411849Z","iopub.execute_input":"2026-03-14T08:42:42.412194Z","iopub.status.idle":"2026-03-14T08:44:09.339353Z","shell.execute_reply.started":"2026-03-14T08:42:42.412165Z","shell.execute_reply":"2026-03-14T08:44:09.337999Z"}},"outputs":[{"execution_count":17,"output_type":"execute_result","data":{"text/plain":"RandomForestClassifier(max_depth=29, min_samples_split=15, n_estimators=159,\n                       n_jobs=-1, random_state=98)","text/html":"<style>#sk-container-id-1 {\n  /* Definition of color scheme common for light and dark mode */\n  --sklearn-color-text: #000;\n  --sklearn-color-text-muted: #666;\n  --sklearn-color-line: gray;\n  /* Definition of color scheme for unfitted estimators */\n  --sklearn-color-unfitted-level-0: #fff5e6;\n  --sklearn-color-unfitted-level-1: #f6e4d2;\n  --sklearn-color-unfitted-level-2: #ffe0b3;\n  --sklearn-color-unfitted-level-3: chocolate;\n  /* Definition of color scheme for fitted estimators */\n  --sklearn-color-fitted-level-0: #f0f8ff;\n  --sklearn-color-fitted-level-1: #d4ebff;\n  --sklearn-color-fitted-level-2: #b3dbfd;\n  --sklearn-color-fitted-level-3: cornflowerblue;\n\n  /* Specific color for light theme */\n  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-icon: #696969;\n\n  @media (prefers-color-scheme: dark) {\n    /* Redefinition of color scheme for dark theme */\n    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-icon: #878787;\n  }\n}\n\n#sk-container-id-1 {\n  color: var(--sklearn-color-text);\n}\n\n#sk-container-id-1 pre {\n  padding: 0;\n}\n\n#sk-container-id-1 input.sk-hidden--visually {\n  border: 0;\n  clip: rect(1px 1px 1px 1px);\n  clip: rect(1px, 1px, 1px, 1px);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n#sk-container-id-1 div.sk-dashed-wrapped {\n  border: 1px dashed var(--sklearn-color-line);\n  margin: 0 0.4em 0.5em 0.4em;\n  box-sizing: border-box;\n  padding-bottom: 0.4em;\n  background-color: var(--sklearn-color-background);\n}\n\n#sk-container-id-1 div.sk-container {\n  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n     but bootstrap.min.css set `[hidden] { display: none !important; }`\n     so we also need the `!important` here to be able to override the\n     default hidden behavior on the sphinx rendered scikit-learn.org.\n     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n  display: inline-block !important;\n  position: relative;\n}\n\n#sk-container-id-1 div.sk-text-repr-fallback {\n  display: none;\n}\n\ndiv.sk-parallel-item,\ndiv.sk-serial,\ndiv.sk-item {\n  /* draw centered vertical line to link estimators */\n  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n  background-size: 2px 100%;\n  background-repeat: no-repeat;\n  background-position: center center;\n}\n\n/* Parallel-specific style estimator block */\n\n#sk-container-id-1 div.sk-parallel-item::after {\n  content: \"\";\n  width: 100%;\n  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n  flex-grow: 1;\n}\n\n#sk-container-id-1 div.sk-parallel {\n  display: flex;\n  align-items: stretch;\n  justify-content: center;\n  background-color: var(--sklearn-color-background);\n  position: relative;\n}\n\n#sk-container-id-1 div.sk-parallel-item {\n  display: flex;\n  flex-direction: column;\n}\n\n#sk-container-id-1 div.sk-parallel-item:first-child::after {\n  align-self: flex-end;\n  width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:last-child::after {\n  align-self: flex-start;\n  width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:only-child::after {\n  width: 0;\n}\n\n/* Serial-specific style estimator block */\n\n#sk-container-id-1 div.sk-serial {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: var(--sklearn-color-background);\n  padding-right: 1em;\n  padding-left: 1em;\n}\n\n\n/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\nclickable and can be expanded/collapsed.\n- Pipeline and ColumnTransformer use this feature and define the default style\n- Estimators will overwrite some part of the style using the `sk-estimator` class\n*/\n\n/* Pipeline and ColumnTransformer style (default) */\n\n#sk-container-id-1 div.sk-toggleable {\n  /* Default theme specific background. It is overwritten whether we have a\n  specific estimator or a Pipeline/ColumnTransformer */\n  background-color: var(--sklearn-color-background);\n}\n\n/* Toggleable label */\n#sk-container-id-1 label.sk-toggleable__label {\n  cursor: pointer;\n  display: flex;\n  width: 100%;\n  margin-bottom: 0;\n  padding: 0.5em;\n  box-sizing: border-box;\n  text-align: center;\n  align-items: start;\n  justify-content: space-between;\n  gap: 0.5em;\n}\n\n#sk-container-id-1 label.sk-toggleable__label .caption {\n  font-size: 0.6rem;\n  font-weight: lighter;\n  color: var(--sklearn-color-text-muted);\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n  /* Arrow on the left of the label */\n  content: \"▸\";\n  float: left;\n  margin-right: 0.25em;\n  color: var(--sklearn-color-icon);\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n  color: var(--sklearn-color-text);\n}\n\n/* Toggleable content - dropdown */\n\n#sk-container-id-1 div.sk-toggleable__content {\n  max-height: 0;\n  max-width: 0;\n  overflow: hidden;\n  text-align: left;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content pre {\n  margin: 0.2em;\n  border-radius: 0.25em;\n  color: var(--sklearn-color-text);\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n  /* unfitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n  /* Expand drop-down */\n  max-height: 200px;\n  max-width: 100%;\n  overflow: auto;\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n  content: \"▾\";\n}\n\n/* Pipeline/ColumnTransformer-specific style */\n\n#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator-specific style */\n\n/* Colorize estimator box */\n#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n#sk-container-id-1 div.sk-label label {\n  /* The background is the default theme color */\n  color: var(--sklearn-color-text-on-default-background);\n}\n\n/* On hover, darken the color of the background */\n#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n/* Label box, darken color on hover, fitted */\n#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator label */\n\n#sk-container-id-1 div.sk-label label {\n  font-family: monospace;\n  font-weight: bold;\n  display: inline-block;\n  line-height: 1.2em;\n}\n\n#sk-container-id-1 div.sk-label-container {\n  text-align: center;\n}\n\n/* Estimator-specific */\n#sk-container-id-1 div.sk-estimator {\n  font-family: monospace;\n  border: 1px dotted var(--sklearn-color-border-box);\n  border-radius: 0.25em;\n  box-sizing: border-box;\n  margin-bottom: 0.5em;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n/* on hover */\n#sk-container-id-1 div.sk-estimator:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Specification for estimator info (e.g. \"i\" and \"?\") */\n\n/* Common style for \"i\" and \"?\" */\n\n.sk-estimator-doc-link,\na:link.sk-estimator-doc-link,\na:visited.sk-estimator-doc-link {\n  float: right;\n  font-size: smaller;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1em;\n  height: 1em;\n  width: 1em;\n  text-decoration: none !important;\n  margin-left: 0.5em;\n  text-align: center;\n  /* unfitted */\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n  color: var(--sklearn-color-unfitted-level-1);\n}\n\n.sk-estimator-doc-link.fitted,\na:link.sk-estimator-doc-link.fitted,\na:visited.sk-estimator-doc-link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\ndiv.sk-estimator:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\ndiv.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n/* Span, style for the box shown on hovering the info icon */\n.sk-estimator-doc-link span {\n  display: none;\n  z-index: 9999;\n  position: relative;\n  font-weight: normal;\n  right: .2ex;\n  padding: .5ex;\n  margin: .5ex;\n  width: min-content;\n  min-width: 20ex;\n  max-width: 50ex;\n  color: var(--sklearn-color-text);\n  box-shadow: 2pt 2pt 4pt #999;\n  /* unfitted */\n  background: var(--sklearn-color-unfitted-level-0);\n  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n}\n\n.sk-estimator-doc-link.fitted span {\n  /* fitted */\n  background: var(--sklearn-color-fitted-level-0);\n  border: var(--sklearn-color-fitted-level-3);\n}\n\n.sk-estimator-doc-link:hover span {\n  display: block;\n}\n\n/* \"?\"-specific style due to the `<a>` HTML tag */\n\n#sk-container-id-1 a.estimator_doc_link {\n  float: right;\n  font-size: 1rem;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1rem;\n  height: 1rem;\n  width: 1rem;\n  text-decoration: none;\n  /* unfitted */\n  color: var(--sklearn-color-unfitted-level-1);\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\n#sk-container-id-1 a.estimator_doc_link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n}\n</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_depth=29, min_samples_split=15, n_estimators=159,\n                       n_jobs=-1, random_state=98)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>RandomForestClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=29, min_samples_split=15, n_estimators=159,\n                       n_jobs=-1, random_state=98)</pre></div> </div></div></div></div>"},"metadata":{}}],"execution_count":17},{"cell_type":"code","source":"print('Accuracy: %s' % accuracy_score(y_val, model.predict(X_val)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:44:09.340989Z","iopub.execute_input":"2026-03-14T08:44:09.341363Z","iopub.status.idle":"2026-03-14T08:44:09.559232Z","shell.execute_reply.started":"2026-03-14T08:44:09.341335Z","shell.execute_reply":"2026-03-14T08:44:09.558086Z"}},"outputs":[{"name":"stdout","text":"Accuracy: 0.9797619047619047\n","output_type":"stream"}],"execution_count":18},{"cell_type":"code","source":"from sklearn.metrics import classification_report\nprint(classification_report(y_val, model.predict(X_val)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:44:18.269519Z","iopub.execute_input":"2026-03-14T08:44:18.269853Z","iopub.status.idle":"2026-03-14T08:44:18.473317Z","shell.execute_reply.started":"2026-03-14T08:44:18.269828Z","shell.execute_reply":"2026-03-14T08:44:18.472503Z"}},"outputs":[{"name":"stdout","text":"              precision    recall  f1-score   support\n\n         0.0       0.98      0.99      0.99       827\n         1.0       0.99      0.99      0.99       937\n         2.0       0.97      0.98      0.98       835\n         3.0       0.98      0.97      0.98       870\n         4.0       0.98      0.99      0.98       814\n         5.0       0.98      0.97      0.98       759\n         6.0       0.99      0.99      0.99       827\n         7.0       0.97      0.98      0.98       880\n         8.0       0.98      0.97      0.98       813\n         9.0       0.97      0.97      0.97       838\n\n    accuracy                           0.98      8400\n   macro avg       0.98      0.98      0.98      8400\nweighted avg       0.98      0.98      0.98      8400\n\n","output_type":"stream"}],"execution_count":19},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nprint(confusion_matrix(y_val, model.predict(X_val)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:44:22.054558Z","iopub.execute_input":"2026-03-14T08:44:22.054903Z","iopub.status.idle":"2026-03-14T08:44:22.273119Z","shell.execute_reply.started":"2026-03-14T08:44:22.054877Z","shell.execute_reply":"2026-03-14T08:44:22.272104Z"}},"outputs":[{"name":"stdout","text":"[[822   3   0   0   0   0   2   0   0   0]\n [  0 923  10   1   0   0   0   2   1   0]\n [  2   2 821   2   2   0   0   4   1   1]\n [  1   0   6 846   0   7   0   6   1   3]\n [  0   1   2   0 805   0   1   1   0   4]\n [  1   1   1   5   0 736   5   2   2   6]\n [  2   0   0   0   0   4 817   0   4   0]\n [  0   2   5   1   4   1   0 862   1   4]\n [  7   0   2   3   3   0   2   0 788   8]\n [  4   0   1   3   7   1   0  10   2 810]]\n","output_type":"stream"}],"execution_count":20},{"cell_type":"code","source":"pred_test=model.predict(test_hog)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:44:24.168109Z","iopub.execute_input":"2026-03-14T08:44:24.168447Z","iopub.status.idle":"2026-03-14T08:44:24.812324Z","shell.execute_reply.started":"2026-03-14T08:44:24.168419Z","shell.execute_reply":"2026-03-14T08:44:24.811234Z"}},"outputs":[],"execution_count":21},{"cell_type":"code","source":"fig = plt.figure(figsize=(20, 10))\nfor i, img in enumerate(test_img[0:5], 1):\n    subplot = fig.add_subplot(1, 7, i)\n    plt.imshow(img, cmap='gray');\n    subplot.set_title('%s' % pred_test[i - 1]);","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-14T08:44:25.57429Z","iopub.execute_input":"2026-03-14T08:44:25.574826Z","iopub.status.idle":"2026-03-14T08:44:26.16185Z","shell.execute_reply.started":"2026-03-14T08:44:25.574789Z","shell.execute_reply":"2026-03-14T08:44:26.160667Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 2000x1000 with 5 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAABHcAAAD/CAYAAAB7Azq9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAM29JREFUeJzt3X14zGe+x/FvggwhmTQJiRStotRDKeshK1VWKO061FPpnpbWUhpalKpurdZur2zrtHa1VB+26LmKVlt1sVt7Sj21FUWpCw1l0yZK4sLJJJ6C5D5/9Bgd5v4lM5mZ3+83835d1/1H7u/cM9/85JNJbpO5o5RSSgAAAAAAAGBL0WY3AAAAAAAAAP+xuQMAAAAAAGBjbO4AAAAAAADYGJs7AAAAAAAANsbmDgAAAAAAgI2xuQMAAAAAAGBjbO4AAAAAAADYGJs7AAAAAAAANsbmDgAAAAAAgI2xuQMAAAAAAGBjbO6EuR07dsjEiROlTZs2UrduXWnSpIkMHz5cDh06VKX1xcXFMm7cOKlfv77UrVtXevXqJd98802QuwbCU1lZmcyYMUPS0tKkTp060rVrV/nss8+qtPann36S4cOHS0JCgsTHx8vAgQPl3//+d5A7BsLPrl27pF+/fhIfHy9xcXHSt29f2bNnT5XXk0UgMHhOBMy3f/9+GTZsmNxyyy0SGxsrycnJ0qNHD1mzZk2V1vO7orVEKaWU2U0geIYOHSpffvmlDBs2TG6//XYpLCyU1157Tc6cOSM5OTnStm1b7dqKigq588475dtvv5Xp06dLcnKyLFy4UAoKCmTXrl3SokWLEH4mgP2NHDlSPvzwQ5k8ebK0aNFClixZIjt27JCNGzdKRkaGdt2ZM2ekY8eO4nK55Mknn5RatWrJvHnzRCkle/bskaSkpBB+FoB9ffPNN9K9e3dp3LixPProo1JRUSELFy6U06dPy9dffy0tW7Y0XE8WgcDhOREw3z//+U+ZP3++pKenS1pampw7d04++ugj2bp1q7zxxhsybtw47Vp+V7QghbD25ZdfqrKyMo+5Q4cOKYfDoX73u98Zrn3//feViKiVK1e6506cOKESEhLUyJEjg9IvEK62b9+uRETNnTvXPXf+/HnVrFkzlZ6ebrj2xRdfVCKivv76a/fcd999p2rUqKFmzpwZtJ6BcHPPPfeoG264QZ08edI9d+zYMVWvXj01ePDgSteTRSAweE4ErOvy5cuqffv2qmXLloa343dF6+HPssLcr3/9a4mJifGYa9GihbRp00a+++47w7UffvihpKSkyODBg91z9evXl+HDh8vq1aulrKwsKD0D4ejDDz+UGjVqePwPSO3atWXMmDGybds2KSgoMFzbuXNn6dy5s3uuVatW0rt3b/nggw+C2jcQTrZu3SqZmZke/7PfsGFDueuuu2Tt2rVy5swZw/VkEQgMnhMB66pRo4Y0btxYiouLDW/H74rWw+ZOBFJKSVFRkSQnJxvebvfu3dKxY0eJjvb8MunSpYucO3euyu/bA+DnPN16660SHx/vMd+lSxcREe17flRUVMjevXvlV7/61XW1Ll26yJEjR6S0tDTg/QLhqKysTOrUqXPdfGxsrFy8eFH27dunXUsWgcDhORGwlrNnz8rJkyflyJEjMm/ePPn000+ld+/ehmv4XdF62NyJQO+995789NNPcv/99xve7vjx49KwYcPr5q/MHTt2LCj9AeHI3zydPn1aysrKyCIQAC1btpScnBwpLy93z128eFG2b98uIj+/SasOWQQCh+dEwFqefPJJqV+/vjRv3lymTZsm9913n7z22muGa/hd0XrY3Ikwubm5kpWVJenp6TJq1CjD254/f14cDsd187Vr13bXAVSNv3m6Mk8Wgep77LHH5NChQzJmzBg5cOCA7Nu3Tx566CE5fvy4iBhniSwCgcNzImAtkydPls8++0yWLl0q/fv3l/Lycrl48aLhGn5XtB42dyJIYWGh3HvvveJ0Ot1/62ykTp06Xv9W8sKFC+46gKrxN09X5skiUH3jx4+XZ555RpYtWyZt2rSRdu3ayZEjR+Spp54SEZF69epp15JFIHB4TgSspVWrVpKZmSkPPfSQ+z3oBgwYIMrgYG1+V7QeNncihMvlkv79+0txcbGsW7dO0tLSKl3TsGFD9/9m/tKVuarcB4Cf+ZunxMREcTgcZBEIkBdeeEGKiopk69atsnfvXtmxY4dUVFSIiMitt96qXUcWgcDhORGwtqFDh8qOHTsM3zeH3xWth82dCHDhwgUZMGCAHDp0SNauXSutW7eu0roOHTrIN9984/6h94rt27dLbGys4Q/BADx16NBBDh06JCUlJR7zV97ro0OHDl7XRUdHS7t27WTnzp3X1bZv3y633HKLxMXFBbxfIJzdcMMNkpGRIe3atRMRkfXr10ujRo2kVatW2jVkEQgcnhMBa7vyJ1Uul0t7G35XtB42d8JceXm53H///bJt2zZZuXKlpKene73d8ePHJTc3Vy5duuSeGzp0qBQVFcnHH3/snjt58qSsXLlSBgwY4PVvLAF4N3ToUCkvL5c333zTPVdWViaLFy+Wrl27SuPGjUVEJD8/X3Jzc69bu2PHDo8fZg8ePCiff/65DBs2LDSfABCm3n//fdmxY4dMnjzZ48QPsggED8+JgDWcOHHiurlLly7Ju+++K3Xq1HG/KIDfFe0hShn9IR1sb/LkyfK3v/1NBgwYIMOHD7+u/p//+Z8iIjJ69GhZunSp5OXlyc033ywiP28MZWRkyL59+2T69OmSnJwsCxculPz8fNmxY4e0bNkylJ8KYHvDhw+XVatWyZQpU6R58+aydOlS+frrr2XDhg3So0cPERHp2bOnbN682eNvnEtLS+WOO+6Q0tJSmTZtmtSqVUteeeUVKS8vlz179kj9+vXN+pQAW9myZYvMmTNH+vbtK0lJSZKTkyOLFy+WPn36yJo1a6RmzZru25JFILh4TgTMd99990lJSYn06NFDbrzxRiksLJT33ntPcnNz5eWXX5apU6eKCL8r2oZCWLvrrruUiGjHFaNGjVIiovLy8jzWnz59Wo0ZM0YlJSWp2NhYddddd6kdO3aE+LMAwsP58+fVtGnTVGpqqnI4HKpz585q3bp1Hre5ktlrFRQUqKFDh6r4+HhVr1499dvf/lZ9//33oWodCAuHDx9Wffv2VcnJycrhcKhWrVqp7OxsVVZWdt1tySIQXDwnAuZbvny5yszMVCkpKapmzZrqhhtuUJmZmWr16tUet+N3RXvglTsAAAAAAAA2xnvuAAAAAAAA2BibOwAAAAAAADbG5g4AAAAAAICNsbkDAAAAAABgY2zuAAAAAAAA2BibOwAAAAAAADZWM1h3vGDBApk7d64UFhZK+/bt5dVXX5UuXbpUuq6iokKOHTsmcXFxEhUVFaz2AMtQSklpaamkpaVJdHTg91vJIlA1wcyivzkUIYuIPGQRsAayCFhDlbOogmDFihUqJiZGvfPOO2r//v1q7NixKiEhQRUVFVW6tqCgQIkIgxFxo6CggCwyGBYYgc5idXJIFhmRPMgig2GNQRYZDGuMyrIYlM2dLl26qKysLPfH5eXlKi0tTWVnZ1e6tri42PSLxmCYMYqLi8kig2GBEegsVieHZJERyYMsMhjWGGSRwbDGqCyLAf8bkIsXL8quXbskMzPTPRcdHS2ZmZmybdu2Stfz0jpEqkB/7ZNFwD+B/Nqvbg4D3Q9gJ2QRsAayCFhDZV/7AX/PnZMnT0p5ebmkpKR4zKekpEhubu51ty8rK5OysjL3xyUlJYFuCYhIZBEwn685FCGLQDCQRcAayCIQPKaflpWdnS1Op9M9GjdubHZLQEQii4A1kEXAGsgiYA1kEaiagG/uJCcnS40aNaSoqMhjvqioSFJTU6+7/cyZM8XlcrlHQUFBoFsCIhJZBMznaw5FyCIQDGQRsAayCARPwDd3YmJipFOnTrJhwwb3XEVFhWzYsEHS09Ovu73D4ZD4+HiPAaD6yCJgPl9zKEIWgWAgi4A1kEUgiKr1VucaK1asUA6HQy1ZskQdOHBAjRs3TiUkJKjCwsJK17pcLtPfhZrBMGO4XC6yyGBYYAQ6i9XJIVlkRPIgiwyGNQZZZDCsMSrLYlA2d5RS6tVXX1VNmjRRMTExqkuXLionJ6dK6wgrI1JHMDZ3yCKD4fsIRhb9zSFZZETyIIsMhjUGWWQwrDEqy2KUUkqJhZSUlIjT6TS7DSDkXC6XpV5mShYRqcgiYA1kEbAGsghYQ2VZNP20LAAAAAAAAPiPzR0AAAAAAAAbY3MHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGyMzR0AAAAAAAAbY3MHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGysptkNAAAAAACAwIuLi/M637t3b+2aUaNGaWtG677//ntt7a9//avX+Y8//li75uzZs9oarscrdwAAAAAAAGyMzR0AAAAAAAAbY3MHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGyMzR0AAAAAAAAb4yh0G4iNjdXWHA5HyPro2bOntvbII4/4fH+TJ0/W1o4cOeLz/QEAAABApDH6ffGdd97xOj9kyBDtGqWUX3106NBBW1u6dKnX+ZkzZ2rX9OvXT1vLz8+vcl+RglfuAAAAAAAA2BibOwAAAAAAADbG5g4AAAAAAICNsbkDAAAAAABgY2zuAAAAAAAA2BibOwAAAAAAADYW8KPQn3vuOXn++ec95lq2bCm5ubmBfqiIce31/KWpU6eGsJPAmjVrltkthDWyCFgDWQTMRw4BayCLwTFt2jRtbfDgwV7nL126pF3z8ssv+9XHgAEDtLU2bdp4nW/ZsqV2zaJFi7S1e+65p+qNRYiAb+6I/PwPt379+qsPUjMoDwOgEmQRsAayCJiPHALWQBaB4AhKkmrWrCmpqanBuGsAPiCLgDWQRcB85BCwBrIIBEdQ3nPn+++/l7S0NLnlllvkd7/7neTn52tvW1ZWJiUlJR4DQGCQRcAayCJgPl9yKEIWgWAhi0BwBHxzp2vXrrJkyRJZt26dvP7665KXlyd33nmnlJaWer19dna2OJ1O92jcuHGgWwIiElkErIEsAubzNYciZBEIBrIIBE+UUkoF8wGKi4vlpptukldeeUXGjBlzXb2srEzKysrcH5eUlBDYa8ydO1dbs/MbKnfq1Elb27NnT+gasQiXyyXx8fFBu3+yCFQNWQSsIZhZrCyHImQRuIIsWt8f//hHbW327Nle5y9fvqxdE8o3VDbajvjXv/6lrUXiGypXlsWgv3tVQkKC3HrrrXL48GGvdYfDIQ6HI9htABGPLALWQBYB81WWQxGyCIQCWQQCJ+ibO2fOnJEjR47Igw8+GOyHsrWMjAxtbcSIESHsJHQWL16srZ07d05bmzBhgtf5vXv3VruncEYWg0v3P0jdunULcSeho/ubd6P/ZQFZtKKYmBht7aGHHtLWpkyZoq3ddtttXufPnz+vXRMbG6utLVy4UFt79tlnvc7/7//+r3ZNpCOHgDWQxcAwev7QGT16tLa2fPlyv/p47rnntDXdK4iefvpp7ZrevXtra4mJidra6dOntbVwFvD33Jk2bZps3rxZfvjhB/nqq6/kvvvukxo1asjIkSMD/VAADJBFwBrIImA+cghYA1kEgifgr9w5evSojBw5Uk6dOiX169eXjIwMycnJkfr16wf6oQAYIIuANZBFwHzkELAGsggET8A3d1asWBHouwTgB7IIWANZBMxHDgFrIItA8AT8z7IAAAAAAAAQOmzuAAAAAAAA2FiUMjpY3gQlJSXidDrNbiPk9u/fr621atUqhJ1YX35+vtf5YcOGadfs3LkzWO0EjMvlkvj4eLPbcIvULGZlZWlrRn8Prsvp4MGDq93TtaKj9fvyFRUVAX88nVOnTnmdX7RokXbNpk2btLXNmzdXt6WAIIvhKS0tTVt76623tLVf/epX2tqsWbO0tS1btnidP3v2rHZN//79tbWePXtqa7rvTX369NGusQOyGJ6Mfq7Nzc3V1oye+4xOCrr55pu9zvfq1Uu7xsjq1au1Nd3PqHZHFu2tYcOGXuePHz8e0j6Sk5O9zn/11VfaNc2bN9fWsrOztbU//OEPVW/MRirLIq/cAQAAAAAAsDE2dwAAAAAAAGyMzR0AAAAAAAAbY3MHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGysptkN4GcTJ07U1pYtW6atNWjQIKB9PPHEE9ra+vXrfb6/e++9V1t77rnntDWjIy2bNGnidd7oyOndu3dra+Xl5doa7GvYsGHa2pAhQ7Q1o6ODjY7dDOUR5FahO37Z6PhJo5w++uij2lpOTk7VG0NE69atm9f5tWvXatds375dW/v1r3+trR05cqTqjVXBm2++qa0Z/SywdetWr/NxcXHaNaWlpVVvDPDDggULvM4bZSorK0tbM1pn9PPrjTfe6HVeKaVdY+T3v/+9tta+fXu/7hMIplAfea6jy2Lt2rW1a4xympGRUe2ewg2v3AEAAAAAALAxNncAAAAAAABsjM0dAAAAAAAAG2NzBwAAAAAAwMbY3AEAAAAAALAxNncAAAAAAABsjKPQLWLjxo3a2ogRI7S1jh07BrSPdevWaWuHDx/2+f5yc3O1tQceeEBb69Chg8+PNWPGDG3txRdf1NZcLpfPjwXra926tbZmdBw3guu2227T1nRHZALXMvpaWblypdf53bt3a9fce++91e4p2IYOHaqtJSYmep2/fPlysNoBRETk4Ycf1tb+4z/+w+u8UX5nz56trZ09e1Zbe/rpp7W1qKgor/NJSUnaNY899pi21q5dO23t7bff9jpvdHw6UFVxcXHamtGR4WfOnAlGOz47cOCA1/nTp09r1xh9v/jwww+r3VO44ZU7AAAAAAAANsbmDgAAAAAAgI2xuQMAAAAAAGBjbO4AAAAAAADYGJs7AAAAAAAANsbmDgAAAAAAgI35fBT6li1bZO7cubJr1y45fvy4rFq1SgYNGuSuK6Vk9uzZ8tZbb0lxcbF0795dXn/9dWnRokUg+44omzdv9qtmdVlZWdral19+GcJO7CfScli7dm1tbcKECV7nZ82aFfA+Ll26pK19//33AX88nby8PG1t4MCBIeujTZs2Xue//fbbkPVgtkjLolX813/9l7ZWo0YNr/P3339/sNoJmP79+2tr8+fP19ZmzJjhdf78+fPV7skuyKI51qxZo621bdvW6/zcuXO1a1wul7YWyq/n9evXa2t79+7V1nRHw0fSUehkMXhKS0u1taSkJG0tMTHR63x+fn61e/KF0+n0Ot+uXTvtGqNj0j///PNq9xRufH7lztmzZ6V9+/ayYMECr/WXXnpJ5s+fL4sWLZLt27dL3bp15e6775YLFy5Uu1kAPyOHgDWQRcAayCJgDWQRMI/Pr9zp37+/9n+WlFLy17/+VZ599ln3/x6/++67kpKSIp988omMGDGiet0CEBFyCFgFWQSsgSwC1kAWAfME9D138vLypLCwUDIzM91zTqdTunbtKtu2bfO6pqysTEpKSjwGAP/5k0MRsggEGlkErIEsAtZAFoHgCujmTmFhoYiIpKSkeMynpKS4a9fKzs4Wp9PpHo0bNw5kS0DE8SeHImQRCDSyCFgDWQSsgSwCwWX6aVkzZ84Ul8vlHgUFBWa3BEQksghYA1kErIEsAtZAFoGqCejmTmpqqoiIFBUVecwXFRW5a9dyOBwSHx/vMQD4z58cipBFINDIImANZBGwBrIIBJfPb6hspGnTppKamiobNmyQDh06iIhISUmJbN++XXtcMSIXfy8bHOGYw2bNmmlrL774otf5ioqKgPdhdNz57bffHvDHszrdkbVfffWVdk23bt20ta5du2prn332mbZm1e8l4ZjFUBoyZIi29stjda/Vp08fr/NGx6mGUu/evbW1xYsXa2vTpk3T1t58881q9RTuQpXFm2++WVv74YcfAvY4oXbtn9D8ktHXpe450+jPb6zC4XCY3UJY4nkxeE6dOuVzzWiTbMaMGdqa0Ubc4cOHtbVJkyZ5nY+KitKuWbt2rba2f/9+bS1S+by5c+bMGY9/tLy8PNmzZ48kJiZKkyZNZPLkyfLnP/9ZWrRoIU2bNpVZs2ZJWlqa4Q9iAHxDDgFrIIuANZBFwBrIImAenzd3du7cKb169XJ/PHXqVBERGTVqlCxZskSeeuopOXv2rIwbN06Ki4slIyND1q1bJ7Vr1w5c10CEI4eANZBFwBrIImANZBEwj8+bOz179hSllLYeFRUlc+bMkTlz5lSrMQB65BCwBrIIWANZBKyBLALmMf20LAAAAAAAAPiPzR0AAAAAAAAbC+hpWYAvOnfubHYLAKrh6NGjXudfffVV7Rqj07ImT56srb3zzjvamlVPy0L1dOzYUVszOo3jiy++CEY7XiUkJGhrTzzxhNf5Rx55RLtmw4YN2ppRBmANdj4Ry8jbb7+trRmd/takSZNgtBMSRqeAGcnLywtwJ0DwZGVlaWtPP/10wB9PdyqW0XPfY489FvA+whmv3AEAAAAAALAxNncAAAAAAABsjM0dAAAAAAAAG2NzBwAAAAAAwMbY3AEAAAAAALAxNncAAAAAAABsjKPQYZrHH3/c7BYQoebNm6etff3119paaWlpMNoJO9u2bdPWPvroI21tyJAhwWgHYSgmJsbnNU6nU1tr06aNtjZ48GBt7Y477tDWLly44HU+Olr//2pPPvmktnb58mVtDaiu+Ph4bc3oiHejfJw8ebI6LQVdq1attLUBAwb4dZ9Nmzb1tx0g5NasWaOtGf1MZvTc54/z58/7VcP1eOUOAAAAAACAjbG5AwAAAAAAYGNs7gAAAAAAANgYmzsAAAAAAAA2xuYOAAAAAACAjbG5AwAAAAAAYGMchR6mMjIytLWWLVtqa+Xl5drakiVLfO6jbdu22lpSUpLP92fkq6++0tYuXboU0MdCaH3yySc+r1m4cKG29sILL2hrJSUlPj8WPB09elRby83N9es+V69era0ZfU+DfW3ZskVbmzJlirb2448/ep2PjY3VrklMTNTW/vWvf2lrs2fP1tZWrlzpdf7xxx/XriksLNTWgGDKysrS1saOHautLV26NBjtBFT79u29zq9YsUK7pm7dutraoUOHtLXf/OY3VW8MMNm+ffu0tTvvvFNbGzVqlLY2b948bc3hcHid79evn3bNxIkTtbXXXntNW4tUvHIHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGyMzR0AAAAAAAAbY3MHAAAAAADAxnze3NmyZYsMGDBA0tLSJCoq6rpTbEaPHi1RUVEew+gdsAH4jhwC1kAWAWsgi4A1kEXAPD4fhX727Flp3769PPLIIzJ48GCvt+nXr58sXrzY/bHu2DM70x2RGB8fr10zaNAgbe3EiRPa2mOPPVblvq649dZbtbW0tDRtraKiQlt78MEHfe6jcePGftWM7N+/3+v8iBEjtGvOnTvn12NZVaTlsFmzZtpacXGx1/mDBw9q13DceXA5nU5tLTk5WVuLjtb/f4PR14CZIi2LoWR0BPmQIUO0tb59+3qdNzpmfOvWrdratm3btLVFixZpaydPnvQ6/9FHH2nXwH9ksXpGjx6treXl5WlrO3fuDEI3vmvVqpW29u6773qdN/pZ+fz589qa0c+bx44d09YiBVkMD0YZMHru+/HHH7W1f/7zn17na9bUb0k8/vjj2pou2yKR+7O+z5s7/fv3l/79+xvexuFwSGpqqt9NATBGDgFrIIuANZBFwBrIImCeoLznzqZNm6RBgwbSsmVLmTBhgpw6dSoYDwPAADkErIEsAtZAFgFrIItAcPj8yp3K9OvXTwYPHixNmzaVI0eOyDPPPCP9+/eXbdu2SY0aNa67fVlZmZSVlbk/jtSXUAGB5GsORcgiEAxkEbAGsghYA1kEgifgmzu//DvUdu3aye233y7NmjWTTZs2Se/eva+7fXZ2tjz//POBbgOIaL7mUIQsAsFAFgFrIIuANZBFIHiCfhT6LbfcIsnJyXL48GGv9ZkzZ4rL5XKPgoKCYLcERJzKcihCFoFQIIuANZBFwBrIIhA4AX/lzrWOHj0qp06dkoYNG3qtOxwO3iEdCLLKcihCFoFQIIuANZBFwBrIIhA4Pm/unDlzxmNnNS8vT/bs2SOJiYmSmJgozz//vAwZMkRSU1PlyJEj8tRTT0nz5s3l7rvvDmjjgdK6dWtt7Z577tHW0tPTvc4bHXduB0ZHEffs2TN0jRjQHUM/cuRI7ZpXX31VW/vl3/DaRbjlsDIVFRXa2rp167zOv/7668FqB/9v2LBhXue7du2qXfPoo49qa0b/zkbHYpsp0rJoFZ9++qlfNX8YHXs8duxYbU33b2z0dQ7/kcXKGR0XnpaWpq2F8mfbpKQkbW327Nna2sMPP6yt6X5uNHr1x7333qut7du3T1sDWYx0Rs/B8+fP9zo/ceJE7ZpmzZppa6NHj/b5scKdz5s7O3fulF69erk/njp1qoiIjBo1Sl5//XXZu3evLF26VIqLiyUtLU369u0rf/rTn9htBQKIHALWQBYBayCLgDWQRcA8Pm/u9OzZU5RS2rpV/3cVCCfkELAGsghYA1kErIEsAuYJ+hsqAwAAAAAAIHjY3AEAAAAAALAxNncAAAAAAABsLOhHoVvdb3/7W20tOzs7ZH1cuHBBW/v3v/+trelOALjpppuq3ZNV3XzzzV7nX3zxRe2atm3bamtPPPGEtuZyuarcF8yhO/Hurrvu0q7ZvHlzsNqxJd2pVyLGJwrOmjXL63wwTgOaPn16wO8TuMLoFKG33npLW1u8eLG2tn79+mr1BFiF0WmpGzZs0Nbq1avndf6VV17RrunXr5+2duONN2prRiefvvHGG17nX3vtNe2a/fv3a2uA3ehOoXvooYe0a9q1a6etPf7449ramTNntLU//elPXueNTssyYvTeTpGKV+4AAAAAAADYGJs7AAAAAAAANsbmDgAAAAAAgI2xuQMAAAAAAGBjbO4AAAAAAADYGJs7AAAAAAAANhbxR6H/5S9/0dYCfbzapk2btLVly5Zpa3//+9+1Nd2x4B988IF2TadOnbQ1f5WWlnqdNzqe3EifPn20NaMjrnUefPBBbS0+Pl5bGzx4sM+PhdDSHdU9f/587ZpHH31UW8vJyal2T4Hw8ssva2uNGzfW1vw5hrxr167amtHRs4E2b948be3YsWMh6wPhKSYmRltbuXKltvbDDz9oa0888YS2xhGtsJrc3Fxtzeh77PTp07W1jh07amu333671/m0tDTtGiMHDx7U1qZOnaqtrVu3zq/HA6wmLi5OWzM6TnzKlCle52vXrq1do/v5WsT4uPNQskofVsIrdwAAAAAAAGyMzR0AAAAAAAAbY3MHAAAAAADAxtjcAQAAAAAAsDE2dwAAAAAAAGyMzR0AAAAAAAAbi/ij0KOiorS1QB9jescdd2hrTZs21db+8Ic/+PxYSUlJPq+pTFFRkbY2evRor/P/8z//49djLVq0SFt75513vM536dJFuyY1NVVbGzhwYNUbg23cdttt2try5cu1tdLSUm0tlN8vjL4n1KlTR1vz5yj0UFq4cKG29sILL2hrJSUlwWgHEWTkyJHamtHRzL169dLWOIYV4WLXrl3aWosWLbS1/v37a2u650yj58uPP/5YWxs/fry2dvLkSW0NsJNbb71VW3v77be1tYyMDG3t4sWLXue7deumXXP06FFt7YYbbtDWOnXqpK299NJLXueNfr42+v1z69at2lqk4pU7AAAAAAAANsbmDgAAAAAAgI2xuQMAAAAAAGBjbO4AAAAAAADYGJs7AAAAAAAANubT5k52drZ07txZ4uLipEGDBjJo0CA5ePCgx20uXLggWVlZkpSUJPXq1ZMhQ4YYvss1AN+RRcAayCJgDWQRMB85BMwVpXw4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\n"},"metadata":{}}],"execution_count":22},{"cell_type":"code","source":"pred_test","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}