{"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":"# Testing Different Models on the MNIST Dataset","metadata":{}},{"cell_type":"markdown","source":"This notebook tests several models including various sklearn models and XGBoost.\nIt also includes several preprocessing steps to increase the accuracy of the models including centering the data and adding random rotations.\nFeel free to experiment and add your own models.","metadata":{}},{"cell_type":"markdown","source":"### Basic Setup","metadata":{}},{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-31T23:36:54.576011Z","iopub.execute_input":"2022-07-31T23:36:54.576850Z","iopub.status.idle":"2022-07-31T23:36:54.611407Z","shell.execute_reply.started":"2022-07-31T23:36:54.576720Z","shell.execute_reply":"2022-07-31T23:36:54.610161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd # Data Processing\n\nimport numpy as np # Vector/Matrix Operations\n\nimport matplotlib.pyplot as plt # Visualization\n\nfrom time import time # Timing training/running\n\nfrom scipy import ndimage # Image operations\n\nfrom tqdm import tqdm # Progress bar\n\nnp.random.seed(9)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:36:54.613626Z","iopub.execute_input":"2022-07-31T23:36:54.614331Z","iopub.status.idle":"2022-07-31T23:36:54.878355Z","shell.execute_reply.started":"2022-07-31T23:36:54.614284Z","shell.execute_reply":"2022-07-31T23:36:54.877055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def visualize_row(row, y=None, display_raw=False, img_shape=(28,28)):\n    \"\"\" Used to visualize images from the datasets. \"\"\"\n    if y is not None:\n        print(f\"True label: {y}\")\n    im = np.array(row).reshape(img_shape[0], img_shape[1])\n    if display_raw:\n        print(im)\n    plt.imshow(im)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:36:54.879902Z","iopub.execute_input":"2022-07-31T23:36:54.880887Z","iopub.status.idle":"2022-07-31T23:36:54.889156Z","shell.execute_reply.started":"2022-07-31T23:36:54.880848Z","shell.execute_reply":"2022-07-31T23:36:54.888085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load Data","metadata":{}},{"cell_type":"code","source":"# Load data\ntrain_data = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\ntest_data = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:36:54.891887Z","iopub.execute_input":"2022-07-31T23:36:54.892532Z","iopub.status.idle":"2022-07-31T23:37:01.718044Z","shell.execute_reply.started":"2022-07-31T23:36:54.892495Z","shell.execute_reply":"2022-07-31T23:37:01.716636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Training data shape: \", train_data.shape)\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:01.719677Z","iopub.execute_input":"2022-07-31T23:37:01.720137Z","iopub.status.idle":"2022-07-31T23:37:01.752357Z","shell.execute_reply.started":"2022-07-31T23:37:01.720100Z","shell.execute_reply":"2022-07-31T23:37:01.751198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Testing data shape: \", test_data.shape)\ntest_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:01.754311Z","iopub.execute_input":"2022-07-31T23:37:01.755149Z","iopub.status.idle":"2022-07-31T23:37:01.776122Z","shell.execute_reply.started":"2022-07-31T23:37:01.755102Z","shell.execute_reply":"2022-07-31T23:37:01.775013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = train_data\ny = train_data.pop(\"label\")\n\nX_submit = test_data","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:01.777563Z","iopub.execute_input":"2022-07-31T23:37:01.778350Z","iopub.status.idle":"2022-07-31T23:37:01.792900Z","shell.execute_reply.started":"2022-07-31T23:37:01.778303Z","shell.execute_reply":"2022-07-31T23:37:01.791796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_num = 40\nvisualize_row(X.iloc[img_num], y.iloc[img_num])","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:01.794101Z","iopub.execute_input":"2022-07-31T23:37:01.794887Z","iopub.status.idle":"2022-07-31T23:37:02.008003Z","shell.execute_reply.started":"2022-07-31T23:37:01.794852Z","shell.execute_reply":"2022-07-31T23:37:02.006867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Normalize pixel values","metadata":{}},{"cell_type":"code","source":"def normalize(X_data, mag=16):\n    \"\"\" Reduce color space signficantly. \"\"\"\n    X_out = X_data / mag\n    X_out = X_out.round(0)\n    return X_out","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:02.010557Z","iopub.execute_input":"2022-07-31T23:37:02.011275Z","iopub.status.idle":"2022-07-31T23:37:02.016642Z","shell.execute_reply.started":"2022-07-31T23:37:02.011236Z","shell.execute_reply":"2022-07-31T23:37:02.015609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Normalize data\nX = normalize(X)\nX_submit = normalize(X_submit)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:02.020690Z","iopub.execute_input":"2022-07-31T23:37:02.021278Z","iopub.status.idle":"2022-07-31T23:37:03.052395Z","shell.execute_reply.started":"2022-07-31T23:37:02.021224Z","shell.execute_reply":"2022-07-31T23:37:03.051199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Center images\ndef center(X_data, display_count=False, img_size=(28,28)):\n    \"\"\" Move center of mass to img_size/2 \"\"\"\n    X_centered = []\n    shift_count = 0\n    for i, row in tqdm(X_data.iterrows(), total=X_data.shape[0]):\n        tmp_im = np.array(row).reshape(img_size[0], img_size[1])\n        # Calculate current center of mass\n        com = ndimage.center_of_mass(tmp_im)\n        # Shift\n        shift_amount = np.array([round(com[0]-img_size[0]/2.0, 0),\n                                 round(com[1]-img_size[1]/2.0, 0)])\n        if np.sqrt(shift_amount.dot(shift_amount)) > 0.0:\n            shift_count += 1\n            shifted_im = ndimage.shift(tmp_im, shift_amount).round(0)\n        else:\n            shifted_im = tmp_im\n        X_centered.append(shifted_im.reshape(img_size[0]*img_size[1]).astype(\"uint8\"))\n    if display_count:\n        print(f\"Shifted {shift_count} images\")\n    # Note that data frame conversion takes a long time\n    X_centered = pd.DataFrame(X_centered, columns=X_data.columns)\n    return X_centered","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:03.053711Z","iopub.execute_input":"2022-07-31T23:37:03.054070Z","iopub.status.idle":"2022-07-31T23:37:03.066151Z","shell.execute_reply.started":"2022-07-31T23:37:03.054037Z","shell.execute_reply":"2022-07-31T23:37:03.064910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Uncomment to see how many images need to be centered\n#center(X, display_count=True)\n\n# Uncomment to add centering to data\n#X = center(X)\n#X_submit = center(X_submit)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:03.067535Z","iopub.execute_input":"2022-07-31T23:37:03.067935Z","iopub.status.idle":"2022-07-31T23:37:03.081777Z","shell.execute_reply.started":"2022-07-31T23:37:03.067900Z","shell.execute_reply":"2022-07-31T23:37:03.080866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"It seems that most images are fairly well centered. So what if we uncenter the images? See after rotations","metadata":{}},{"cell_type":"markdown","source":"## Use Image Rotations","metadata":{}},{"cell_type":"code","source":"def rotate(X_data, y_data, random=True, num_rots=10, rot_angle=45.0, img_size=(28,28)):\n    \"\"\" Return randomly rotated images from X_data. \"\"\"\n    X_angles = []\n    y_angles = []\n    for i, row in tqdm(X_data.iterrows(), total=X_data.shape[0]):\n        num_rotations = num_rots if not random else np.random.randint(num_rots)\n        tmp_im = np.array(row).reshape(img_size[0], img_size[1])\n        for _ in range(num_rotations):\n            angle = (np.random.random() * (2.0 * rot_angle)) - rot_angle\n            rot_im = ndimage.rotate(tmp_im, angle, reshape=False)\n            X_angles.append(tmp_im.reshape(img_size[0]*img_size[1]).astype(\"uint8\"))\n            y_angles.append(y_data.iloc[i])\n    # Note that data frame conversion takes a long time\n    X_angles = pd.DataFrame(X_angles, columns=X_data.columns)\n    y_angles = pd.Series(y_angles, name=y_data.name, dtype=y_data.dtype)\n    return X_angles, y_angles","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:03.082949Z","iopub.execute_input":"2022-07-31T23:37:03.083766Z","iopub.status.idle":"2022-07-31T23:37:03.094695Z","shell.execute_reply.started":"2022-07-31T23:37:03.083728Z","shell.execute_reply":"2022-07-31T23:37:03.093833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_angles, y_angles = rotate(X, y, random=False, num_rots=6, rot_angle=45.0)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:37:03.096026Z","iopub.execute_input":"2022-07-31T23:37:03.096576Z","iopub.status.idle":"2022-07-31T23:41:30.879613Z","shell.execute_reply.started":"2022-07-31T23:37:03.096541Z","shell.execute_reply":"2022-07-31T23:41:30.878367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Add rotated training data to dataset\nX = X.append(X_angles, ignore_index=True)\ny = y.append(y_angles, ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:30.881293Z","iopub.execute_input":"2022-07-31T23:41:30.881799Z","iopub.status.idle":"2022-07-31T23:41:31.435597Z","shell.execute_reply.started":"2022-07-31T23:41:30.881749Z","shell.execute_reply":"2022-07-31T23:41:31.434349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Use random shifting of images","metadata":{}},{"cell_type":"code","source":"def bounce(X_data, y_data, num=5, bounce_amnt=0.18, img_size=(28,28)):\n    \"\"\" Bounce (translate) image by random amount (Given in percent of img_size). \"\"\"\n    X_bounced = []\n    y_bounced = []\n    shift_count = 0\n    for i, row in tqdm(X_data.iterrows(), total=X_data.shape[0]):\n        tmp_im = np.array(row).reshape(img_size[0], img_size[1])\n        for _ in range(num):\n            # Shift\n            bnc = (img_size[0] * bounce_amnt, img_size[1] * bounce_amnt)\n            shift_amount = np.array([(np.random.random() * (2 * bnc[0])) - bnc[0],\n                                     (np.random.random() * (2 * bnc[1])) - bnc[1]])\n            shift_amount = shift_amount.round(0)\n            shifted_im = ndimage.shift(tmp_im, shift_amount).round(0)\n            X_bounced.append(shifted_im.reshape(img_size[0]*img_size[1]).astype(\"uint8\"))\n            y_bounced.append(y_data.iloc[i])\n    # Note that data frame conversion takes a long time\n    X_bounced = pd.DataFrame(X_bounced, columns=X_data.columns)\n    y_bounced = pd.Series(y_bounced, name=y_data.name, dtype=y_data.dtype)\n    return X_bounced, y_bounced","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:31.437260Z","iopub.execute_input":"2022-07-31T23:41:31.437627Z","iopub.status.idle":"2022-07-31T23:41:31.451206Z","shell.execute_reply.started":"2022-07-31T23:41:31.437570Z","shell.execute_reply":"2022-07-31T23:41:31.449782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bounce_dist = 5 / 28.0  # Bounce in 5 pixels in both directions\nX_bounce, y_bounce = bounce(X[:100], y[:100], num=2, bounce_amnt=bounce_dist) # Run for demonstration purposes","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:31.452962Z","iopub.execute_input":"2022-07-31T23:41:31.453317Z","iopub.status.idle":"2022-07-31T23:41:31.682259Z","shell.execute_reply.started":"2022-07-31T23:41:31.453284Z","shell.execute_reply":"2022-07-31T23:41:31.681111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for img_num in range(65, 75):\n    visualize_row(X_bounce.iloc[img_num], y_bounce.iloc[img_num], display_raw=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:31.683817Z","iopub.execute_input":"2022-07-31T23:41:31.684190Z","iopub.status.idle":"2022-07-31T23:41:33.197298Z","shell.execute_reply.started":"2022-07-31T23:41:31.684155Z","shell.execute_reply":"2022-07-31T23:41:33.196111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Add bounced training data to dataset\n# X = X.append(X_bounce, ignore_index=True)\n# y = y.append(y_bounce, ignore_index=True)\n# Disabled. May be useful for CNN models","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:33.199272Z","iopub.execute_input":"2022-07-31T23:41:33.199775Z","iopub.status.idle":"2022-07-31T23:41:33.205835Z","shell.execute_reply.started":"2022-07-31T23:41:33.199725Z","shell.execute_reply":"2022-07-31T23:41:33.204652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Note that using large values for bounce and rotations may cause the notebook to run out of RAM","metadata":{}},{"cell_type":"markdown","source":"# Display Image from Dataset","metadata":{}},{"cell_type":"code","source":"print(\"Final Dataset Shape: \", X.shape)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:33.207538Z","iopub.execute_input":"2022-07-31T23:41:33.208319Z","iopub.status.idle":"2022-07-31T23:41:33.217911Z","shell.execute_reply.started":"2022-07-31T23:41:33.208277Z","shell.execute_reply":"2022-07-31T23:41:33.216829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_num = 70\nvisualize_row(X.iloc[img_num], y.iloc[img_num], display_raw=True)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:33.219890Z","iopub.execute_input":"2022-07-31T23:41:33.220354Z","iopub.status.idle":"2022-07-31T23:41:33.515427Z","shell.execute_reply.started":"2022-07-31T23:41:33.220308Z","shell.execute_reply":"2022-07-31T23:41:33.514104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train Test Split","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, shuffle=True, random_state=9)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:33.517202Z","iopub.execute_input":"2022-07-31T23:41:33.518514Z","iopub.status.idle":"2022-07-31T23:41:35.821855Z","shell.execute_reply.started":"2022-07-31T23:41:33.518449Z","shell.execute_reply":"2022-07-31T23:41:35.820504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save results","metadata":{}},{"cell_type":"code","source":"def save_results(model, data, postfix=None):\n    prediction = model.predict(data)\n    prediction = pd.DataFrame({\"ImageId\": np.arange(1, len(prediction)+1), \"Label\": prediction})\n    if postfix is not None:\n        prediction.to_csv(f\"submission_{postfix}.csv\", index=False)\n    else:\n        prediction.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:35.822982Z","iopub.execute_input":"2022-07-31T23:41:35.823325Z","iopub.status.idle":"2022-07-31T23:41:35.830916Z","shell.execute_reply.started":"2022-07-31T23:41:35.823293Z","shell.execute_reply":"2022-07-31T23:41:35.829847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sklearn","metadata":{}},{"cell_type":"code","source":"print(\"Testing different models\")\nfinal_results = {}","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:35.832081Z","iopub.execute_input":"2022-07-31T23:41:35.832451Z","iopub.status.idle":"2022-07-31T23:41:35.847277Z","shell.execute_reply.started":"2022-07-31T23:41:35.832410Z","shell.execute_reply":"2022-07-31T23:41:35.845981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Random Forest","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\n# Create model\nrfc = RandomForestClassifier(random_state=9)\n# Train\nprint(\"Training Random Forest Classifier\")\nt = time()\nrfc.fit(X_train, y_train)\nprint(f\"Finished training after {time()-t}s\")\n# Validation\nt = time()\nscore = rfc.score(X_test, y_test)\nprint(f\"Testing score: {score} in {time()-t}s\")\n# Save results\nsave_results(rfc, X_submit, \"RandomForest\")\nfinal_results[\"RFC\"] = (score, rfc)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:41:35.849224Z","iopub.execute_input":"2022-07-31T23:41:35.850108Z","iopub.status.idle":"2022-07-31T23:43:51.330706Z","shell.execute_reply.started":"2022-07-31T23:41:35.850057Z","shell.execute_reply":"2022-07-31T23:43:51.329360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Multi-layer Perceptron","metadata":{}},{"cell_type":"code","source":"from sklearn.neural_network import MLPClassifier\n# Create model\nmlpc = MLPClassifier(random_state=9, max_iter=200,\n                     learning_rate=\"adaptive\")\n# Train\nprint(\"Training Multi-layer Perceptron\")\nt = time()\nmlpc.fit(X_train, y_train)\nprint(f\"Finished training after {time()-t}s\")\n# Validation\nt = time()\nscore = mlpc.score(X_test, y_test)\nprint(f\"Testing score: {score} in {time()-t}s\")\n# Save results\nsave_results(mlpc, X_submit, \"MultiLayerPerceptron\")\nfinal_results[\"MLP\"] = (score, mlpc)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:43:51.332429Z","iopub.execute_input":"2022-07-31T23:43:51.333285Z","iopub.status.idle":"2022-07-31T23:43:56.984678Z","shell.execute_reply.started":"2022-07-31T23:43:51.333236Z","shell.execute_reply":"2022-07-31T23:43:56.983191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### KNN","metadata":{}},{"cell_type":"code","source":"from sklearn.neighbors import KNeighborsClassifier\n# Create model\nknc = KNeighborsClassifier(n_neighbors=10, weights=\"distance\")\n# Train\nprint(\"Training K Nearest Neighbors\")\nt = time()\nknc.fit(X_train, y_train)\nprint(f\"Finished training after {time()-t}s\")\n# Validation\nt = time()\nscore = knc.score(X_test, y_test)\nprint(f\"Testing score: {score} in {time()-t}s\")\n# Save results\nsave_results(knc, X_submit, \"KNN\")\nfinal_results[\"KNN\"] = (score, knc)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:43:56.986258Z","iopub.execute_input":"2022-07-31T23:43:56.986886Z","iopub.status.idle":"2022-07-31T23:44:01.910796Z","shell.execute_reply.started":"2022-07-31T23:43:56.986830Z","shell.execute_reply":"2022-07-31T23:44:01.908924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### XGBoost","metadata":{}},{"cell_type":"code","source":"import xgboost as xgb\n# Create model\nxgbc = xgb.XGBClassifier(tree_method='hist', n_estimators=300)\n# Train\nprint(\"Training XGBoost Classifier\")\nt = time()\nxgbc.fit(X_train, y_train)\nprint(f\"Finished training after {time()-t}\")\n# Validation\nt = time()\nscore = xgbc.score(X_test, y_test)\nprint(f\"Testing score: {score} in {time()-t}s\")\n# Save results\nsave_results(xgbc, X_submit, \"XGB\")\nfinal_results[\"XGB\"] = (score, xgbc)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:48:40.929358Z","iopub.execute_input":"2022-07-31T23:48:40.929862Z","iopub.status.idle":"2022-08-01T00:14:24.588595Z","shell.execute_reply.started":"2022-07-31T23:48:40.929824Z","shell.execute_reply":"2022-08-01T00:14:24.587303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## LightGBM","metadata":{}},{"cell_type":"code","source":"import lightgbm as lgb\n# Create model\nlgbmc = lgb.LGBMClassifier(n_estimators=300)\n# Train\nprint(\"Training LightGBM Classifier\")\nt = time()\nlgbmc.fit(X_train, y_train)\nprint(f\"Finished training after {time()-t}\")\n# Validation\nt = time()\nscore = lgbmc.score(X_test, y_test)\nprint(f\"Testing score: {score} in {time()-t}s\")\n# Save results\nsave_results(lgbmc, X_submit, \"LGB\")\nfinal_results[\"LGB\"] = (score, lgbmc)","metadata":{"execution":{"iopub.status.busy":"2022-08-01T00:14:24.591080Z","iopub.execute_input":"2022-08-01T00:14:24.591450Z","iopub.status.idle":"2022-08-01T00:20:01.339335Z","shell.execute_reply.started":"2022-08-01T00:14:24.591415Z","shell.execute_reply":"2022-08-01T00:20:01.338065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Output result","metadata":{}},{"cell_type":"markdown","source":"### Find best model","metadata":{}},{"cell_type":"code","source":"final_model_name = None\nmax_score = 0\nfor model_name, (score, model) in final_results.items():\n    if score > max_score:\n        max_score = score\n        final_model_name = model_name\n\nprint(f\"Best preforming model: {final_model_name} with {round(score, 4)*100} Accuracy\")","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:44:01.916938Z","iopub.status.idle":"2022-07-31T23:44:01.917522Z","shell.execute_reply.started":"2022-07-31T23:44:01.917226Z","shell.execute_reply":"2022-07-31T23:44:01.917255Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Make final submission","metadata":{}},{"cell_type":"code","source":"final_model = final_results[final_model_name][1]\nsave_results(final_model, X_submit)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T23:44:01.919426Z","iopub.status.idle":"2022-07-31T23:44:01.920105Z","shell.execute_reply.started":"2022-07-31T23:44:01.919778Z","shell.execute_reply":"2022-07-31T23:44:01.919807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}