Skip to content

Instantly share code, notes, and snippets.

@innat
Created September 29, 2021 07:10
Show Gist options
  • Select an option

  • Save innat/440afe94b432bc325174c6c1c0cb975e to your computer and use it in GitHub Desktop.

Select an option

Save innat/440afe94b432bc325174c6c1c0cb975e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "5268115c",
"metadata": {
"papermill": {
"duration": 0.013471,
"end_time": "2021-09-29T07:04:49.610889",
"exception": false,
"start_time": "2021-09-29T07:04:49.597418",
"status": "completed"
},
"tags": []
},
"source": [
"## PetFinder\n",
"Kaggle: https://www.kaggle.com/c/petfinder-pawpularity-score\n",
"Packages: [TensorFlow Decision Forests](https://www.tensorflow.org/decision_forests) \n",
"\n",
"Very basic setup. The package is at its early development stages. Be aware the [known issues](https://www.tensorflow.org/decision_forests/known_issues). "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "c1f59f32",
"metadata": {
"_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
"_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5",
"execution": {
"iopub.execute_input": "2021-09-29T07:04:49.639847Z",
"iopub.status.busy": "2021-09-29T07:04:49.638635Z",
"iopub.status.idle": "2021-09-29T07:06:07.627292Z",
"shell.execute_reply": "2021-09-29T07:06:07.628262Z",
"shell.execute_reply.started": "2021-09-29T06:53:48.861092Z"
},
"papermill": {
"duration": 78.004844,
"end_time": "2021-09-29T07:06:07.628814",
"exception": false,
"start_time": "2021-09-29T07:04:49.623970",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\r\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2021-09-29 07:06:05.303312: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/conda/lib\n",
"2021-09-29 07:06:05.303437: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.1.9\n",
"2.6.0\n"
]
}
],
"source": [
"!pip install -q tensorflow_decision_forests\n",
"import tensorflow_decision_forests as tfdf; print(tfdf.__version__)\n",
"import tensorflow as tf; print(tf.__version__)\n",
"from tensorflow.keras import backend as K"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f4fc351a",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:07.658567Z",
"iopub.status.busy": "2021-09-29T07:06:07.657895Z",
"iopub.status.idle": "2021-09-29T07:06:07.718028Z",
"shell.execute_reply": "2021-09-29T07:06:07.716836Z",
"shell.execute_reply.started": "2021-09-29T06:55:26.641826Z"
},
"papermill": {
"duration": 0.07745,
"end_time": "2021-09-29T07:06:07.718202",
"exception": false,
"start_time": "2021-09-29T07:06:07.640752",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Id</th>\n",
" <th>Subject Focus</th>\n",
" <th>Eyes</th>\n",
" <th>Face</th>\n",
" <th>Near</th>\n",
" <th>Action</th>\n",
" <th>Accessory</th>\n",
" <th>Group</th>\n",
" <th>Collage</th>\n",
" <th>Human</th>\n",
" <th>Occlusion</th>\n",
" <th>Info</th>\n",
" <th>Blur</th>\n",
" <th>Pawpularity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0007de18844b0dbbb5e1f607da0606e0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0009c66b9439883ba2750fb825e1d7db</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0013fd999caf9a3efe1352ca1b0d937e</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Id Subject Focus Eyes Face Near Action \\\n",
"0 0007de18844b0dbbb5e1f607da0606e0 0 1 1 1 0 \n",
"1 0009c66b9439883ba2750fb825e1d7db 0 1 1 0 0 \n",
"2 0013fd999caf9a3efe1352ca1b0d937e 0 1 1 1 0 \n",
"\n",
" Accessory Group Collage Human Occlusion Info Blur Pawpularity \n",
"0 0 1 0 0 0 0 0 63 \n",
"1 0 0 0 0 0 0 0 42 \n",
"2 0 0 0 1 1 0 0 28 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd \n",
"\n",
"# Load a dataset into a Pandas Dataframe.\n",
"dataset_df = pd.read_csv(\"../input/petfinder-pawpularity-score/train.csv\")\n",
"\n",
"# Display the first 3 examples.\n",
"dataset_df.head(3)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7d33f691",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:07.757478Z",
"iopub.status.busy": "2021-09-29T07:06:07.756815Z",
"iopub.status.idle": "2021-09-29T07:06:07.759982Z",
"shell.execute_reply": "2021-09-29T07:06:07.759460Z",
"shell.execute_reply.started": "2021-09-29T06:55:26.716163Z"
},
"papermill": {
"duration": 0.029111,
"end_time": "2021-09-29T07:06:07.760129",
"exception": false,
"start_time": "2021-09-29T07:06:07.731018",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(9912, 13)\n"
]
}
],
"source": [
"dataset_df.drop(labels = [\"Id\"], axis = 1, inplace = True)\n",
"dataset_df.head(3); print(dataset_df.shape)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "28ee006a",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:07.793155Z",
"iopub.status.busy": "2021-09-29T07:06:07.792394Z",
"iopub.status.idle": "2021-09-29T07:06:08.591256Z",
"shell.execute_reply": "2021-09-29T07:06:08.590720Z",
"shell.execute_reply.started": "2021-09-29T06:55:26.736041Z"
},
"papermill": {
"duration": 0.818711,
"end_time": "2021-09-29T07:06:08.591405",
"exception": false,
"start_time": "2021-09-29T07:06:07.772694",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"fold bins\n",
"0 0 66\n",
" 1 84\n",
" 2 221\n",
" 3 406\n",
" 4 376\n",
" ... \n",
"4 9 55\n",
" 10 40\n",
" 11 28\n",
" 12 21\n",
" 13 72\n",
"Length: 70, dtype: int64"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.model_selection import StratifiedKFold, GroupKFold, KFold\n",
"import numpy as np \n",
"\n",
"num_bins = int(np.floor(1 + np.log2(len(dataset_df))))\n",
"dataset_df[\"bins\"] = pd.cut(dataset_df['Pawpularity'], bins=num_bins, labels=False)\n",
"\n",
"Fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=101)\n",
"for n, (train_index, val_index) in enumerate(Fold.split(dataset_df, dataset_df[\"bins\"])):\n",
" dataset_df.loc[val_index, 'fold'] = int(n)\n",
" \n",
"dataset_df['fold'] = dataset_df['fold'].astype(int)\n",
"display(dataset_df.groupby(['fold', \"bins\"]).size())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9fc41e9c",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:08.625226Z",
"iopub.status.busy": "2021-09-29T07:06:08.624542Z",
"iopub.status.idle": "2021-09-29T07:06:08.636082Z",
"shell.execute_reply": "2021-09-29T07:06:08.636765Z",
"shell.execute_reply.started": "2021-09-29T06:56:32.945064Z"
},
"papermill": {
"duration": 0.032569,
"end_time": "2021-09-29T07:06:08.637000",
"exception": false,
"start_time": "2021-09-29T07:06:08.604431",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(7929, 13) (1983, 13)\n"
]
}
],
"source": [
"fold = 0\n",
"\n",
"# get fold index \n",
"trn_idx = dataset_df[dataset_df['fold'] != fold].index\n",
"val_idx = dataset_df[dataset_df['fold'] == fold].index\n",
"\n",
"# get data wrt fold index \n",
"train_folds = dataset_df.loc[trn_idx].reset_index(drop=True)\n",
"valid_folds = dataset_df.loc[val_idx].reset_index(drop=True)\n",
"\n",
"# remvoe redundant column\n",
"train_folds = train_folds[train_folds.columns.drop(['fold', 'bins'])] \n",
"valid_folds = valid_folds[valid_folds.columns.drop(['fold', 'bins'])] \n",
"\n",
"print(train_folds.shape, valid_folds.shape)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "828f25bd",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:08.671163Z",
"iopub.status.busy": "2021-09-29T07:06:08.670420Z",
"iopub.status.idle": "2021-09-29T07:06:08.730666Z",
"shell.execute_reply": "2021-09-29T07:06:08.729990Z",
"shell.execute_reply.started": "2021-09-29T07:03:12.716495Z"
},
"papermill": {
"duration": 0.079809,
"end_time": "2021-09-29T07:06:08.730812",
"exception": false,
"start_time": "2021-09-29T07:06:08.651003",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.7/site-packages/tensorflow_decision_forests/keras/core.py:1224: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only\n",
" (dict(dataframe.drop(label, 1)), dataframe[label].values))\n",
"2021-09-29 07:06:08.677444: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/conda/lib\n",
"2021-09-29 07:06:08.677503: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n",
"2021-09-29 07:06:08.677529: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (1cf22fc52030): /proc/driver/nvidia/version does not exist\n",
"2021-09-29 07:06:08.678939: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n",
"To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
]
}
],
"source": [
"# Convert the dataset into a TensorFlow dataset.\n",
"train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(\n",
" train_folds, \n",
" label=\"Pawpularity\", \n",
" task=tfdf.keras.Task.REGRESSION\n",
")\n",
"\n",
"test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(\n",
" valid_folds, \n",
" label=\"Pawpularity\", \n",
" task=tfdf.keras.Task.REGRESSION\n",
")\n",
"\n",
"\n",
"'''\n",
"tfdf.keras.get_all_models()\n",
"tfdf.keras.GradientBoostedTreesModel?\n",
"'''\n",
"model = tfdf.keras.RandomForestModel(\n",
" max_depth = 200,\n",
" compute_oob_variable_importances=True, \n",
" task = tfdf.keras.Task.REGRESSION\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "65fb898c",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:08.768892Z",
"iopub.status.busy": "2021-09-29T07:06:08.766358Z",
"iopub.status.idle": "2021-09-29T07:06:21.531250Z",
"shell.execute_reply": "2021-09-29T07:06:21.530140Z",
"shell.execute_reply.started": "2021-09-29T07:03:14.698558Z"
},
"papermill": {
"duration": 12.786993,
"end_time": "2021-09-29T07:06:21.531403",
"exception": false,
"start_time": "2021-09-29T07:06:08.744410",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 81/124 [==================>...........] - ETA: 0s"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2021-09-29 07:06:15.639291: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"108/124 [=========================>....] - ETA: 0s"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[INFO kernel.cc:746] Start Yggdrasil model training\n",
"[INFO kernel.cc:747] Collect training examples\n",
"[INFO kernel.cc:392] Number of batches: 124\n",
"[INFO kernel.cc:393] Number of examples: 7929\n",
"[INFO kernel.cc:769] Dataset:\n",
"Number of records: 7929\n",
"Number of columns: 13\n",
"\n",
"Number of columns by type:\n",
"\tNUMERICAL: 13 (100%)\n",
"\n",
"Columns:\n",
"\n",
"NUMERICAL: 13 (100%)\n",
"\t0: \"Accessory\" NUMERICAL mean:0.0684828 min:0 max:1 sd:0.252573\n",
"\t1: \"Action\" NUMERICAL mean:0.0100895 min:0 max:1 sd:0.0999387\n",
"\t2: \"Blur\" NUMERICAL mean:0.0693656 min:0 max:1 sd:0.254075\n",
"\t3: \"Collage\" NUMERICAL mean:0.0504477 min:0 max:1 sd:0.218867\n",
"\t4: \"Eyes\" NUMERICAL mean:0.773868 min:0 max:1 sd:0.418326\n",
"\t5: \"Face\" NUMERICAL mean:0.905284 min:0 max:1 sd:0.292822\n",
"\t6: \"Group\" NUMERICAL mean:0.130155 min:0 max:1 sd:0.336474\n",
"\t7: \"Human\" NUMERICAL mean:0.163955 min:0 max:1 sd:0.370235\n",
"\t8: \"Info\" NUMERICAL mean:0.0629335 min:0 max:1 sd:0.242843\n",
"\t9: \"Near\" NUMERICAL mean:0.863161 min:0 max:1 sd:0.343678\n",
"\t10: \"Occlusion\" NUMERICAL mean:0.171522 min:0 max:1 sd:0.376965\n",
"\t11: \"Subject_Focus\" NUMERICAL mean:0.0281246 min:0 max:1 sd:0.165329\n",
"\t12: \"__LABEL\" NUMERICAL mean:38.0475 min:1 max:100 sd:20.5905\n",
"\n",
"Terminology:\n",
"\tnas: Number of non-available (i.e. missing) values.\n",
"\tood: Out of dictionary.\n",
"\tmanually-defined: Attribute which type is manually defined by the user i.e. the type was not automatically inferred.\n",
"\ttokenized: The attribute value is obtained through tokenization.\n",
"\thas-dict: The attribute is attached to a string dictionary e.g. a categorical attribute stored as a string.\n",
"\tvocab-size: Number of unique values.\n",
"\n",
"[INFO kernel.cc:772] Configure learner\n",
"[INFO kernel.cc:797] Training config:\n",
"learner: \"RANDOM_FOREST\"\n",
"features: \"Accessory\"\n",
"features: \"Action\"\n",
"features: \"Blur\"\n",
"features: \"Collage\"\n",
"features: \"Eyes\"\n",
"features: \"Face\"\n",
"features: \"Group\"\n",
"features: \"Human\"\n",
"features: \"Info\"\n",
"features: \"Near\"\n",
"features: \"Occlusion\"\n",
"features: \"Subject_Focus\"\n",
"label: \"__LABEL\"\n",
"task: REGRESSION\n",
"[yggdrasil_decision_forests.model.random_forest.proto.random_forest_config] {\n",
" num_trees: 300\n",
" decision_tree {\n",
" max_depth: 200\n",
" min_examples: 5\n",
" in_split_min_examples_check: true\n",
" missing_value_policy: GLOBAL_IMPUTATION\n",
" allow_na_conditions: false\n",
" categorical_set_greedy_forward {\n",
" sampling: 0.1\n",
" max_num_items: -1\n",
" min_item_frequency: 1\n",
" }\n",
" growing_strategy_local {\n",
" }\n",
" categorical {\n",
" cart {\n",
" }\n",
" }\n",
" num_candidate_attributes_ratio: -1\n",
" axis_aligned_split {\n",
" }\n",
" internal {\n",
" sorting_strategy: PRESORTED\n",
" }\n",
" }\n",
" winner_take_all_inference: true\n",
" compute_oob_performances: true\n",
" compute_oob_variable_importances: true\n",
" adapt_bootstrap_size_ratio_for_maximum_training_duration: false\n",
"}\n",
"\n",
"[INFO kernel.cc:800] Deployment config:\n",
"num_threads: 6\n",
"\n",
"[INFO kernel.cc:837] Train model\n",
"[INFO random_forest.cc:303] Training random forest on 7929 example(s) and 12 feature(s).\n",
"[INFO random_forest.cc:578] Training of tree 1/300 (tree index:3) done rmse:20.5916\n",
"[INFO random_forest.cc:578] Training of tree 11/300 (tree index:10) done rmse:20.652\n",
"[INFO random_forest.cc:578] Training of tree 21/300 (tree index:20) done rmse:20.6467\n",
"[INFO random_forest.cc:578] Training of tree 31/300 (tree index:30) done rmse:20.6221\n",
"[INFO random_forest.cc:578] Training of tree 45/300 (tree index:44) done rmse:20.6203\n",
"[INFO random_forest.cc:578] Training of tree 55/300 (tree index:54) done rmse:20.6165\n",
"[INFO random_forest.cc:578] Training of tree 65/300 (tree index:65) done rmse:20.6139\n",
"[INFO random_forest.cc:578] Training of tree 75/300 (tree index:74) done rmse:20.6168\n",
"[INFO random_forest.cc:578] Training of tree 85/300 (tree index:84) done rmse:20.6166\n",
"[INFO random_forest.cc:578] Training of tree 95/300 (tree index:94) done rmse:20.6157\n",
"[INFO random_forest.cc:578] Training of tree 108/300 (tree index:108) done rmse:20.6149\n",
"[INFO random_forest.cc:578] Training of tree 118/300 (tree index:117) done rmse:20.6148\n",
"[INFO random_forest.cc:578] Training of tree 128/300 (tree index:127) done rmse:20.6143\n",
"[INFO random_forest.cc:578] Training of tree 138/300 (tree index:137) done rmse:20.6141\n",
"[INFO random_forest.cc:578] Training of tree 148/300 (tree index:147) done rmse:20.6129\n",
"[INFO random_forest.cc:578] Training of tree 162/300 (tree index:161) done rmse:20.6127\n",
"[INFO random_forest.cc:578] Training of tree 172/300 (tree index:171) done rmse:20.6126\n",
"[INFO random_forest.cc:578] Training of tree 182/300 (tree index:181) done rmse:20.6115\n",
"[INFO random_forest.cc:578] Training of tree 192/300 (tree index:191) done rmse:20.6109\n",
"[INFO random_forest.cc:578] Training of tree 203/300 (tree index:202) done rmse:20.6103\n",
"[INFO random_forest.cc:578] Training of tree 215/300 (tree index:214) done rmse:20.6099\n",
"[INFO random_forest.cc:578] Training of tree 225/300 (tree index:224) done rmse:20.6104\n",
"[INFO random_forest.cc:578] Training of tree 235/300 (tree index:234) done rmse:20.6101\n",
"[INFO random_forest.cc:578] Training of tree 245/300 (tree index:244) done rmse:20.6101\n",
"[INFO random_forest.cc:578] Training of tree 255/300 (tree index:254) done rmse:20.6092\n",
"[INFO random_forest.cc:578] Training of tree 265/300 (tree index:264) done rmse:20.6093\n",
"[INFO random_forest.cc:578] Training of tree 276/300 (tree index:274) done rmse:20.6088\n",
"[INFO random_forest.cc:578] Training of tree 286/300 (tree index:285) done rmse:20.6082\n",
"[INFO random_forest.cc:578] Training of tree 296/300 (tree index:294) done rmse:20.6077\n",
"[INFO random_forest.cc:578] Training of tree 300/300 (tree index:299) done rmse:20.6075\n",
"[INFO random_forest.cc:645] Final OOB metrics: rmse:20.6075\n",
"[INFO kernel.cc:856] Export model in log directory: /tmp/tmp7qjz5uwa\n",
"[INFO kernel.cc:864] Save model in resources\n",
"[INFO kernel.cc:988] Loading model from path\n",
"[INFO decision_forest.cc:590] Model loaded with 300 root(s), 39852 node(s), and 12 input feature(s).\n",
"[INFO abstract_model.cc:993] Engine \"RandomForestOptPred\" built\n",
"[INFO kernel.cc:848] Use fast generic engine\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"124/124 [==============================] - 12s 46ms/step - val_loss: 0.0000e+00 - val_rmse: 20.4184\n"
]
},
{
"data": {
"text/plain": [
"<keras.callbacks.History at 0x7f4424e58290>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def rmse(y_true, y_pred): \n",
" return K.sqrt(K.mean(K.square(y_pred - y_true))) \n",
"\n",
"model.compile(metrics=rmse)\n",
"model.fit(train_ds, validation_data=test_ds)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "8e496f2d",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:21.578620Z",
"iopub.status.busy": "2021-09-29T07:06:21.577655Z",
"iopub.status.idle": "2021-09-29T07:06:21.583973Z",
"shell.execute_reply": "2021-09-29T07:06:21.582258Z",
"shell.execute_reply.started": "2021-09-29T07:03:27.198892Z"
},
"papermill": {
"duration": 0.031616,
"end_time": "2021-09-29T07:06:21.584194",
"exception": false,
"start_time": "2021-09-29T07:06:21.552578",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"random_forest_model\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"Total params: 1\n",
"Trainable params: 0\n",
"Non-trainable params: 1\n",
"_________________________________________________________________\n",
"Type: \"RANDOM_FOREST\"\n",
"Task: REGRESSION\n",
"Label: \"__LABEL\"\n",
"\n",
"Input Features (12):\n",
"\tAccessory\n",
"\tAction\n",
"\tBlur\n",
"\tCollage\n",
"\tEyes\n",
"\tFace\n",
"\tGroup\n",
"\tHuman\n",
"\tInfo\n",
"\tNear\n",
"\tOcclusion\n",
"\tSubject_Focus\n",
"\n",
"No weights\n",
"\n",
"Variable Importance: MEAN_INCREASE_IN_RMSE:\n",
" 1. \"Occlusion\" 0.010841 ################\n",
" 2. \"Face\" 0.009247 ###############\n",
" 3. \"Eyes\" 0.007553 ##############\n",
" 4. \"Info\" 0.007460 ##############\n",
" 5. \"Blur\" 0.002058 ###########\n",
" 6. \"Action\" 0.001034 ##########\n",
" 7. \"Subject_Focus\" 0.000494 ##########\n",
" 8. \"Group\" -0.000114 #########\n",
" 9. \"Near\" -0.005960 ######\n",
" 10. \"Accessory\" -0.006538 ######\n",
" 11. \"Collage\" -0.016006 #\n",
" 12. \"Human\" -0.018372 \n",
"\n",
"Variable Importance: MEAN_MIN_DEPTH:\n",
" 1. \"__LABEL\" 7.402487 ################\n",
" 2. \"Action\" 5.776650 #########\n",
" 3. \"Subject_Focus\" 5.375509 #######\n",
" 4. \"Collage\" 5.263289 #######\n",
" 5. \"Human\" 4.868440 #####\n",
" 6. \"Info\" 4.771326 #####\n",
" 7. \"Accessory\" 4.620260 ####\n",
" 8. \"Near\" 4.519373 ####\n",
" 9. \"Face\" 4.404629 ###\n",
" 10. \"Eyes\" 4.376736 ###\n",
" 11. \"Occlusion\" 4.247125 ###\n",
" 12. \"Group\" 3.993867 ##\n",
" 13. \"Blur\" 3.458228 \n",
"\n",
"Variable Importance: NUM_AS_ROOT:\n",
" 1. \"Blur\" 85.000000 ################\n",
" 2. \"Group\" 38.000000 ######\n",
" 3. \"Face\" 29.000000 ####\n",
" 4. \"Eyes\" 28.000000 ####\n",
" 5. \"Accessory\" 25.000000 ###\n",
" 6. \"Subject_Focus\" 25.000000 ###\n",
" 7. \"Collage\" 17.000000 #\n",
" 8. \"Human\" 14.000000 #\n",
" 9. \"Info\" 12.000000 \n",
" 10. \"Occlusion\" 11.000000 \n",
" 11. \"Action\" 8.000000 \n",
" 12. \"Near\" 8.000000 \n",
"\n",
"Variable Importance: NUM_NODES:\n",
" 1. \"Near\" 2779.000000 ################\n",
" 2. \"Occlusion\" 2287.000000 ############\n",
" 3. \"Group\" 2158.000000 ###########\n",
" 4. \"Info\" 2054.000000 ###########\n",
" 5. \"Collage\" 2027.000000 ##########\n",
" 6. \"Human\" 2008.000000 ##########\n",
" 7. \"Accessory\" 1678.000000 ########\n",
" 8. \"Eyes\" 1455.000000 ######\n",
" 9. \"Face\" 1342.000000 ######\n",
" 10. \"Blur\" 956.000000 ###\n",
" 11. \"Action\" 604.000000 #\n",
" 12. \"Subject_Focus\" 428.000000 \n",
"\n",
"Variable Importance: SUM_SCORE:\n",
" 1. \"Near\" 2772440.244450 ################\n",
" 2. \"Group\" 2467519.369818 #############\n",
" 3. \"Occlusion\" 2416896.952248 #############\n",
" 4. \"Info\" 2287387.316809 ############\n",
" 5. \"Face\" 1819010.984814 #########\n",
" 6. \"Eyes\" 1779577.595493 #########\n",
" 7. \"Accessory\" 1735123.380457 ########\n",
" 8. \"Collage\" 1542921.780047 #######\n",
" 9. \"Blur\" 1456361.019829 #######\n",
" 10. \"Human\" 1300599.339613 #####\n",
" 11. \"Action\" 781935.673550 ##\n",
" 12. \"Subject_Focus\" 424675.275213 \n",
"\n",
"\n",
"\n",
"Out-of-bag evaluation: rmse:20.6075\n",
"Number of trees: 300\n",
"Total number of nodes: 39852\n",
"\n",
"Number of nodes by tree:\n",
"Count: 300 Average: 132.84 StdDev: 37.1114\n",
"Min: 27 Max: 213 Ignored: 0\n",
"----------------------------------------------\n",
"[ 27, 36) 1 0.33% 0.33%\n",
"[ 36, 45) 1 0.33% 0.67%\n",
"[ 45, 55) 5 1.67% 2.33% #\n",
"[ 55, 64) 7 2.33% 4.67% ##\n",
"[ 64, 73) 3 1.00% 5.67% #\n",
"[ 73, 83) 10 3.33% 9.00% ###\n",
"[ 83, 92) 15 5.00% 14.00% ####\n",
"[ 92, 101) 12 4.00% 18.00% ####\n",
"[ 101, 111) 22 7.33% 25.33% ######\n",
"[ 111, 120) 28 9.33% 34.67% ########\n",
"[ 120, 129) 29 9.67% 44.33% #########\n",
"[ 129, 139) 34 11.33% 55.67% ##########\n",
"[ 139, 148) 34 11.33% 67.00% ##########\n",
"[ 148, 157) 19 6.33% 73.33% ######\n",
"[ 157, 167) 22 7.33% 80.67% ######\n",
"[ 167, 176) 21 7.00% 87.67% ######\n",
"[ 176, 185) 11 3.67% 91.33% ###\n",
"[ 185, 195) 9 3.00% 94.33% ###\n",
"[ 195, 204) 7 2.33% 96.67% ##\n",
"[ 204, 213] 10 3.33% 100.00% ###\n",
"\n",
"Depth by leafs:\n",
"Count: 20076 Average: 7.50349 StdDev: 1.99737\n",
"Min: 1 Max: 12 Ignored: 0\n",
"----------------------------------------------\n",
"[ 1, 2) 11 0.05% 0.05%\n",
"[ 2, 3) 141 0.70% 0.76%\n",
"[ 3, 4) 392 1.95% 2.71% #\n",
"[ 4, 5) 926 4.61% 7.32% ##\n",
"[ 5, 6) 1821 9.07% 16.39% #####\n",
"[ 6, 7) 2774 13.82% 30.21% #######\n",
"[ 7, 8) 3601 17.94% 48.15% #########\n",
"[ 8, 9) 3828 19.07% 67.21% ##########\n",
"[ 9, 10) 3299 16.43% 83.65% #########\n",
"[ 10, 11) 2149 10.70% 94.35% ######\n",
"[ 11, 12) 902 4.49% 98.84% ##\n",
"[ 12, 12] 232 1.16% 100.00% #\n",
"\n",
"Number of training obs by leaf:\n",
"Count: 20076 Average: 118.485 StdDev: 658\n",
"Min: 5 Max: 7623 Ignored: 0\n",
"----------------------------------------------\n",
"[ 5, 385) 19511 97.19% 97.19% ##########\n",
"[ 385, 766) 187 0.93% 98.12%\n",
"[ 766, 1147) 15 0.07% 98.19%\n",
"[ 1147, 1528) 47 0.23% 98.43%\n",
"[ 1528, 1909) 16 0.08% 98.51%\n",
"[ 1909, 2290) 0 0.00% 98.51%\n",
"[ 2290, 2671) 0 0.00% 98.51%\n",
"[ 2671, 3052) 0 0.00% 98.51%\n",
"[ 3052, 3433) 0 0.00% 98.51%\n",
"[ 3433, 3814) 15 0.07% 98.58%\n",
"[ 3814, 4195) 38 0.19% 98.77%\n",
"[ 4195, 4576) 27 0.13% 98.90%\n",
"[ 4576, 4957) 35 0.17% 99.08%\n",
"[ 4957, 5338) 39 0.19% 99.27%\n",
"[ 5338, 5719) 44 0.22% 99.49%\n",
"[ 5719, 6100) 30 0.15% 99.64%\n",
"[ 6100, 6481) 31 0.15% 99.80%\n",
"[ 6481, 6862) 21 0.10% 99.90%\n",
"[ 6862, 7243) 14 0.07% 99.97%\n",
"[ 7243, 7623] 6 0.03% 100.00%\n",
"\n",
"Attribute in nodes:\n",
"\t2779 : Near [NUMERICAL]\n",
"\t2287 : Occlusion [NUMERICAL]\n",
"\t2158 : Group [NUMERICAL]\n",
"\t2054 : Info [NUMERICAL]\n",
"\t2027 : Collage [NUMERICAL]\n",
"\t2008 : Human [NUMERICAL]\n",
"\t1678 : Accessory [NUMERICAL]\n",
"\t1455 : Eyes [NUMERICAL]\n",
"\t1342 : Face [NUMERICAL]\n",
"\t956 : Blur [NUMERICAL]\n",
"\t604 : Action [NUMERICAL]\n",
"\t428 : Subject_Focus [NUMERICAL]\n",
"\n",
"Attribute in nodes with depth <= 0:\n",
"\t85 : Blur [NUMERICAL]\n",
"\t38 : Group [NUMERICAL]\n",
"\t29 : Face [NUMERICAL]\n",
"\t28 : Eyes [NUMERICAL]\n",
"\t25 : Subject_Focus [NUMERICAL]\n",
"\t25 : Accessory [NUMERICAL]\n",
"\t17 : Collage [NUMERICAL]\n",
"\t14 : Human [NUMERICAL]\n",
"\t12 : Info [NUMERICAL]\n",
"\t11 : Occlusion [NUMERICAL]\n",
"\t8 : Near [NUMERICAL]\n",
"\t8 : Action [NUMERICAL]\n",
"\n",
"Attribute in nodes with depth <= 1:\n",
"\t158 : Blur [NUMERICAL]\n",
"\t87 : Accessory [NUMERICAL]\n",
"\t86 : Face [NUMERICAL]\n",
"\t85 : Group [NUMERICAL]\n",
"\t82 : Eyes [NUMERICAL]\n",
"\t76 : Subject_Focus [NUMERICAL]\n",
"\t63 : Action [NUMERICAL]\n",
"\t58 : Occlusion [NUMERICAL]\n",
"\t57 : Collage [NUMERICAL]\n",
"\t49 : Near [NUMERICAL]\n",
"\t48 : Human [NUMERICAL]\n",
"\t40 : Info [NUMERICAL]\n",
"\n",
"Attribute in nodes with depth <= 2:\n",
"\t241 : Blur [NUMERICAL]\n",
"\t201 : Accessory [NUMERICAL]\n",
"\t188 : Occlusion [NUMERICAL]\n",
"\t184 : Group [NUMERICAL]\n",
"\t178 : Eyes [NUMERICAL]\n",
"\t172 : Face [NUMERICAL]\n",
"\t166 : Near [NUMERICAL]\n",
"\t141 : Action [NUMERICAL]\n",
"\t128 : Subject_Focus [NUMERICAL]\n",
"\t119 : Info [NUMERICAL]\n",
"\t106 : Collage [NUMERICAL]\n",
"\t102 : Human [NUMERICAL]\n",
"\n",
"Attribute in nodes with depth <= 3:\n",
"\t405 : Occlusion [NUMERICAL]\n",
"\t405 : Group [NUMERICAL]\n",
"\t399 : Near [NUMERICAL]\n",
"\t345 : Accessory [NUMERICAL]\n",
"\t342 : Blur [NUMERICAL]\n",
"\t315 : Face [NUMERICAL]\n",
"\t292 : Eyes [NUMERICAL]\n",
"\t275 : Info [NUMERICAL]\n",
"\t243 : Human [NUMERICAL]\n",
"\t211 : Action [NUMERICAL]\n",
"\t198 : Subject_Focus [NUMERICAL]\n",
"\t178 : Collage [NUMERICAL]\n",
"\n",
"Attribute in nodes with depth <= 5:\n",
"\t1325 : Near [NUMERICAL]\n",
"\t1096 : Group [NUMERICAL]\n",
"\t1091 : Occlusion [NUMERICAL]\n",
"\t873 : Info [NUMERICAL]\n",
"\t776 : Accessory [NUMERICAL]\n",
"\t728 : Face [NUMERICAL]\n",
"\t725 : Human [NUMERICAL]\n",
"\t698 : Eyes [NUMERICAL]\n",
"\t596 : Blur [NUMERICAL]\n",
"\t576 : Collage [NUMERICAL]\n",
"\t338 : Action [NUMERICAL]\n",
"\t279 : Subject_Focus [NUMERICAL]\n",
"\n",
"Condition type in nodes:\n",
"\t19776 : HigherCondition\n",
"Condition type in nodes with depth <= 0:\n",
"\t300 : HigherCondition\n",
"Condition type in nodes with depth <= 1:\n",
"\t889 : HigherCondition\n",
"Condition type in nodes with depth <= 2:\n",
"\t1926 : HigherCondition\n",
"Condition type in nodes with depth <= 3:\n",
"\t3608 : HigherCondition\n",
"Condition type in nodes with depth <= 5:\n",
"\t9101 : HigherCondition\n",
"Node format: NOT_SET\n",
"\n",
"Training OOB:\n",
"\ttrees: 1, Out-of-bag evaluation: rmse:20.5916\n",
"\ttrees: 11, Out-of-bag evaluation: rmse:20.652\n",
"\ttrees: 21, Out-of-bag evaluation: rmse:20.6467\n",
"\ttrees: 31, Out-of-bag evaluation: rmse:20.6221\n",
"\ttrees: 45, Out-of-bag evaluation: rmse:20.6203\n",
"\ttrees: 55, Out-of-bag evaluation: rmse:20.6165\n",
"\ttrees: 65, Out-of-bag evaluation: rmse:20.6139\n",
"\ttrees: 75, Out-of-bag evaluation: rmse:20.6168\n",
"\ttrees: 85, Out-of-bag evaluation: rmse:20.6166\n",
"\ttrees: 95, Out-of-bag evaluation: rmse:20.6157\n",
"\ttrees: 108, Out-of-bag evaluation: rmse:20.6149\n",
"\ttrees: 118, Out-of-bag evaluation: rmse:20.6148\n",
"\ttrees: 128, Out-of-bag evaluation: rmse:20.6143\n",
"\ttrees: 138, Out-of-bag evaluation: rmse:20.6141\n",
"\ttrees: 148, Out-of-bag evaluation: rmse:20.6129\n",
"\ttrees: 162, Out-of-bag evaluation: rmse:20.6127\n",
"\ttrees: 172, Out-of-bag evaluation: rmse:20.6126\n",
"\ttrees: 182, Out-of-bag evaluation: rmse:20.6115\n",
"\ttrees: 192, Out-of-bag evaluation: rmse:20.6109\n",
"\ttrees: 203, Out-of-bag evaluation: rmse:20.6103\n",
"\ttrees: 215, Out-of-bag evaluation: rmse:20.6099\n",
"\ttrees: 225, Out-of-bag evaluation: rmse:20.6104\n",
"\ttrees: 235, Out-of-bag evaluation: rmse:20.6101\n",
"\ttrees: 245, Out-of-bag evaluation: rmse:20.6101\n",
"\ttrees: 255, Out-of-bag evaluation: rmse:20.6092\n",
"\ttrees: 265, Out-of-bag evaluation: rmse:20.6093\n",
"\ttrees: 276, Out-of-bag evaluation: rmse:20.6088\n",
"\ttrees: 286, Out-of-bag evaluation: rmse:20.6082\n",
"\ttrees: 296, Out-of-bag evaluation: rmse:20.6077\n",
"\ttrees: 300, Out-of-bag evaluation: rmse:20.6075\n",
"\n",
"None\n"
]
}
],
"source": [
"print(model.summary())"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "07c6f8c6",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:21.638104Z",
"iopub.status.busy": "2021-09-29T07:06:21.637377Z",
"iopub.status.idle": "2021-09-29T07:06:21.966473Z",
"shell.execute_reply": "2021-09-29T07:06:21.965621Z",
"shell.execute_reply.started": "2021-09-29T07:00:37.427251Z"
},
"papermill": {
"duration": 0.360365,
"end_time": "2021-09-29T07:06:21.966638",
"exception": false,
"start_time": "2021-09-29T07:06:21.606273",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"logs = model.make_inspector().training_logs()\n",
"plt.figure(figsize=(12, 7))\n",
"plt.subplot(1, 1, 1)\n",
"plt.plot([log.num_trees for log in logs], [log.evaluation.rmse for log in logs])\n",
"plt.xlabel(\"Number of trees\")\n",
"plt.ylabel(\"RMSE (out-of-bag)\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "c25e0a76",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:22.016615Z",
"iopub.status.busy": "2021-09-29T07:06:22.015908Z",
"iopub.status.idle": "2021-09-29T07:06:22.044512Z",
"shell.execute_reply": "2021-09-29T07:06:22.043859Z",
"shell.execute_reply.started": "2021-09-29T07:04:12.354773Z"
},
"papermill": {
"duration": 0.056126,
"end_time": "2021-09-29T07:06:22.044668",
"exception": false,
"start_time": "2021-09-29T07:06:21.988542",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Subject Focus</th>\n",
" <th>Eyes</th>\n",
" <th>Face</th>\n",
" <th>Near</th>\n",
" <th>Action</th>\n",
" <th>Accessory</th>\n",
" <th>Group</th>\n",
" <th>Collage</th>\n",
" <th>Human</th>\n",
" <th>Occlusion</th>\n",
" <th>Info</th>\n",
" <th>Blur</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Subject Focus Eyes Face Near Action Accessory Group Collage Human \\\n",
"0 1 0 1 0 0 1 1 0 0 \n",
"1 0 1 0 0 0 0 1 1 0 \n",
"2 0 0 0 1 0 1 1 1 0 \n",
"\n",
" Occlusion Info Blur \n",
"0 1 0 1 \n",
"1 0 0 0 \n",
"2 1 1 1 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Evaluate the model.\n",
"test = pd.read_csv('../input/petfinder-pawpularity-score/test.csv')\n",
"test.drop(labels = [\"Id\"], axis = 1, inplace = True)\n",
"\n",
"display(test.head(3))\n",
"tfdf_test = tfdf.keras.pd_dataframe_to_tf_dataset(test, task=tfdf.keras.Task.REGRESSION)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "10c642e3",
"metadata": {
"execution": {
"iopub.execute_input": "2021-09-29T07:06:22.094942Z",
"iopub.status.busy": "2021-09-29T07:06:22.094129Z",
"iopub.status.idle": "2021-09-29T07:06:22.182085Z",
"shell.execute_reply": "2021-09-29T07:06:22.181120Z",
"shell.execute_reply.started": "2021-09-29T07:04:17.183234Z"
},
"papermill": {
"duration": 0.115358,
"end_time": "2021-09-29T07:06:22.182240",
"exception": false,
"start_time": "2021-09-29T07:06:22.066882",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Id</th>\n",
" <th>Pawpularity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>4128bae22183829d2b5fea10effdb0c3</td>\n",
" <td>38.455105</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>43a2262d7738e3d420d453815151079e</td>\n",
" <td>38.444229</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4e429cead1848a298432a0acad014c9d</td>\n",
" <td>37.936497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>80bc3ccafcc51b66303c2c263aa38486</td>\n",
" <td>35.233543</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8f49844c382931444e68dffbe20228f4</td>\n",
" <td>28.431673</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Id Pawpularity\n",
"0 4128bae22183829d2b5fea10effdb0c3 38.455105\n",
"1 43a2262d7738e3d420d453815151079e 38.444229\n",
"2 4e429cead1848a298432a0acad014c9d 37.936497\n",
"3 80bc3ccafcc51b66303c2c263aa38486 35.233543\n",
"4 8f49844c382931444e68dffbe20228f4 28.431673"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample_sub_df = pd.read_csv('../input/petfinder-pawpularity-score/sample_submission.csv')\n",
"sample_sub_df[\"Pawpularity\"] = model.predict(tfdf_test)\n",
"sample_sub_df.to_csv('submission.csv', index=False)\n",
"sample_sub_df.head()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
},
"papermill": {
"default_parameters": {},
"duration": 103.828435,
"end_time": "2021-09-29T07:06:25.223513",
"environment_variables": {},
"exception": null,
"input_path": "__notebook__.ipynb",
"output_path": "__notebook__.ipynb",
"parameters": {},
"start_time": "2021-09-29T07:04:41.395078",
"version": "2.3.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment