{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:15:01.930396Z","iopub.execute_input":"2024-12-14T05:15:01.931034Z","iopub.status.idle":"2024-12-14T05:15:01.94319Z","shell.execute_reply.started":"2024-12-14T05:15:01.93097Z","shell.execute_reply":"2024-12-14T05:15:01.941479Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Auto-gluon modelling.","metadata":{}},{"cell_type":"code","source":"!pip uninstall -y botocore google-cloud-bigquery google-cloud-storage pandas numpy pydantic\n!pip install --upgrade --force-reinstall botocore==1.35.36 google-cloud-bigquery==3.10.0 \\ google-cloud-storage==2.0.0 pandas==1.5.3 numpy<2.0 pydantic==1.10.0\n!pip install -q autogluon.tabular ray==2.10.0 scikit-learn==1.5.2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:15:01.947029Z","iopub.execute_input":"2024-12-14T05:15:01.94758Z","iopub.status.idle":"2024-12-14T05:15:59.915285Z","shell.execute_reply.started":"2024-12-14T05:15:01.947529Z","shell.execute_reply":"2024-12-14T05:15:59.91372Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import KFold\nfrom autogluon.tabular import TabularPredictor\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport pandas as pd\nimport numpy as np\nimport warnings\nimport pickle\nimport shutil\nimport os\nfrom sklearn.metrics import root_mean_squared_error\n\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:16:25.295096Z","iopub.execute_input":"2024-12-14T05:16:25.295885Z","iopub.status.idle":"2024-12-14T05:16:25.316841Z","shell.execute_reply.started":"2024-12-14T05:16:25.295823Z","shell.execute_reply":"2024-12-14T05:16:25.313733Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CFG:\n    train_path = '/kaggle/input/playground-series-s4e12/train.csv'\n    test_path = '/kaggle/input/playground-series-s4e12/test.csv'\n    sample_sub_path = '/kaggle/input/playground-series-s4e12/sample_submission.csv'\n    \n    target = 'Premium Amount'\n    n_folds = 5\n    seed = 42\n    time_limit = 60*150 ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:16:29.899924Z","iopub.execute_input":"2024-12-14T05:16:29.900898Z","iopub.status.idle":"2024-12-14T05:16:29.908791Z","shell.execute_reply.started":"2024-12-14T05:16:29.900839Z","shell.execute_reply":"2024-12-14T05:16:29.907564Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Loading data and predefining folds","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(CFG.train_path, index_col='id')\ntest = pd.read_csv(CFG.test_path, index_col='id')\n\ntrain[CFG.target] = np.log1p(train[CFG.target])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:16:46.578274Z","iopub.execute_input":"2024-12-14T05:16:46.579675Z","iopub.status.idle":"2024-12-14T05:16:59.90202Z","shell.execute_reply.started":"2024-12-14T05:16:46.579585Z","shell.execute_reply":"2024-12-14T05:16:59.900528Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"kf = KFold(n_splits=CFG.n_folds, random_state=CFG.seed, shuffle=True)\nsplit = kf.split(train, train[CFG.target])\nfor i, (_, val_index) in enumerate(split):\n    train.loc[val_index, 'fold'] = i","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:17:07.767454Z","iopub.execute_input":"2024-12-14T05:17:07.768081Z","iopub.status.idle":"2024-12-14T05:17:08.259973Z","shell.execute_reply.started":"2024-12-14T05:17:07.768024Z","shell.execute_reply":"2024-12-14T05:17:08.258541Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Fitting the predictor","metadata":{}},{"cell_type":"code","source":"predictor = TabularPredictor(\n    problem_type='regression',\n    eval_metric='rmse',\n    label=CFG.target,\n    groups='fold',\n    verbosity=2,\n    path='/kaggle/working/my_models'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:17:10.820323Z","iopub.execute_input":"2024-12-14T05:17:10.821698Z","iopub.status.idle":"2024-12-14T05:17:10.831899Z","shell.execute_reply.started":"2024-12-14T05:17:10.821622Z","shell.execute_reply":"2024-12-14T05:17:10.830156Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictor.fit(\n    train_data=train,\n    time_limit=CFG.time_limit,\n    presets='best_quality',\n    excluded_model_types=['KNN', 'NN_TORCH', 'FASTAI', 'RF']\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T05:17:18.669254Z","iopub.execute_input":"2024-12-14T05:17:18.67005Z","iopub.status.idle":"2024-12-14T07:47:47.510693Z","shell.execute_reply.started":"2024-12-14T05:17:18.66999Z","shell.execute_reply":"2024-12-14T07:47:47.508973Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictor.leaderboard(silent=True).style.background_gradient(subset=['score_val'], cmap='RdYlGn')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T07:50:14.757653Z","iopub.execute_input":"2024-12-14T07:50:14.75814Z","iopub.status.idle":"2024-12-14T07:50:14.878063Z","shell.execute_reply.started":"2024-12-14T07:50:14.758102Z","shell.execute_reply":"2024-12-14T07:50:14.876538Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Visualizing the ensemble weights","metadata":{}},{"cell_type":"code","source":"def get_ensemble_weights(predictor):\n    info = predictor.info()\n    ensemble_weights = {}\n    for model_name, values in info[\"model_info\"].items():\n        if \"Ensemble\" in model_name:\n            children_info = values[\"children_info\"]\n            ensemble_weights[model_name] = values[\"children_info\"][list(children_info.keys())[0]][\"model_weights\"]\n    return ensemble_weights","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T07:50:30.056465Z","iopub.execute_input":"2024-12-14T07:50:30.057383Z","iopub.status.idle":"2024-12-14T07:50:30.064145Z","shell.execute_reply.started":"2024-12-14T07:50:30.057342Z","shell.execute_reply":"2024-12-14T07:50:30.06289Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ensemble_weights = get_ensemble_weights(predictor)\n\nfor key, value in ensemble_weights.items():\n    plt.figure(figsize=(6, 6))\n    plt.pie(value.values(), labels=value.keys(), autopct='%1.1f%%', colors=sns.color_palette('Set2', len(value)))\n    plt.title(key)\n    plt.tight_layout()\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T07:50:34.661342Z","iopub.execute_input":"2024-12-14T07:50:34.661763Z","iopub.status.idle":"2024-12-14T07:51:01.867924Z","shell.execute_reply.started":"2024-12-14T07:50:34.661717Z","shell.execute_reply":"2024-12-14T07:51:01.866631Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ndef save_preds(preds, cv_score, name, type, is_ensemble):\n    base_path = 'oof_preds' if type == 'oof' else 'test_preds'\n    base_path = '.' if is_ensemble else base_path\n    with open(f'sub_autogluon_version2_score_{score:.6f}.pkl', 'wb') as f:\n        pickle.dump(np.expm1(preds), f)\n\ndef save_submission(test_preds, score):\n    sub = pd.read_csv(CFG.sample_sub_path)\n    sub[CFG.target] = np.expm1(test_preds)\n    sub.to_csv(f'sub_autogluon_version2_score_{score:.6f}.csv', index=False)\n    \nos.makedirs('oof_preds', exist_ok=True)\nos.makedirs('test_preds', exist_ok=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T08:01:25.341262Z","iopub.execute_input":"2024-12-14T08:01:25.341748Z","iopub.status.idle":"2024-12-14T08:01:25.35028Z","shell.execute_reply.started":"2024-12-14T08:01:25.341708Z","shell.execute_reply":"2024-12-14T08:01:25.348854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_preds = {}\ntest_preds = {}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T08:01:15.501696Z","iopub.execute_input":"2024-12-14T08:01:15.50258Z","iopub.status.idle":"2024-12-14T08:01:15.507891Z","shell.execute_reply.started":"2024-12-14T08:01:15.502536Z","shell.execute_reply":"2024-12-14T08:01:15.506494Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_model = predictor.model_best\n_test_preds = predictor.predict_multi(test)\nfor model in predictor.model_names():\n    model_oof_preds = predictor.predict_oof(model).values\n    model_test_preds = _test_preds[model].values\n    \n    cv_score = root_mean_squared_error(train[CFG.target], np.maximum(model_oof_preds, 0))\n    if model != best_model:\n        save_preds(model_oof_preds, cv_score, model, 'oof', False)\n        save_preds(model_test_preds, cv_score, model, 'test', False)\n    else:\n        save_preds(model_oof_preds, cv_score, model, 'oof', True)\n        save_preds(model_test_preds, cv_score, model, 'test', True)\n        save_submission(model_test_preds, cv_score)\n        \n    oof_preds[model] = model_oof_preds\n    test_preds[model] = model_test_preds","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T07:52:02.032268Z","iopub.execute_input":"2024-12-14T07:52:02.033658Z","iopub.status.idle":"2024-12-14T08:00:29.466513Z","shell.execute_reply.started":"2024-12-14T07:52:02.033599Z","shell.execute_reply":"2024-12-14T08:00:29.465107Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Visualizing the results","metadata":{}},{"cell_type":"code","source":"scores = {}\nsplit = KFold(n_splits=CFG.n_folds, shuffle=False).split(train, train[CFG.target])\nfor fold_idx, (train_index, val_index) in enumerate(split):\n    for model in predictor.model_names():\n        fold_score = root_mean_squared_error(train.loc[val_index, CFG.target], np.maximum(oof_preds[model][val_index], 0))\n        if model not in scores:\n            scores[model] = []\n        scores[model].append(fold_score)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T08:00:29.46872Z","iopub.execute_input":"2024-12-14T08:00:29.469165Z","iopub.status.idle":"2024-12-14T08:00:30.371961Z","shell.execute_reply.started":"2024-12-14T08:00:29.469111Z","shell.execute_reply":"2024-12-14T08:00:30.370858Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scores = pd.DataFrame(scores)\nmean_scores = scores.mean().sort_values(ascending=True)\norder = scores.mean().sort_values(ascending=True).index.tolist()\n\nmin_score = mean_scores.min()\nmax_score = mean_scores.max()\npadding = (max_score - min_score) * 0.5\nlower_limit = min_score - padding\nupper_limit = max_score + padding\n\nfig, axs = plt.subplots(1, 2, figsize=(15, scores.shape[1] * 0.4))\n\nsns.boxplot(data=scores, order=order, ax=axs[0], orient='h', palette='RdYlGn_r')\naxs[0].set_title('Fold RMSLE')\naxs[0].set_xlabel('')\naxs[0].set_ylabel('')\n\nbarplot = sns.barplot(x=mean_scores.values, y=mean_scores.index, ax=axs[1], palette='RdYlGn_r')\naxs[1].set_title('Average RMSLE')\naxs[1].set_xlabel('')\naxs[1].set_xlim(left=lower_limit, right=upper_limit)\naxs[1].set_ylabel('')\n\nfor i, score in enumerate(mean_scores.values):\n    barplot.text(score, i, round(score, 6), va='center')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T08:00:30.373354Z","iopub.execute_input":"2024-12-14T08:00:30.373736Z","iopub.status.idle":"2024-12-14T08:00:31.251661Z","shell.execute_reply.started":"2024-12-14T08:00:30.3737Z","shell.execute_reply":"2024-12-14T08:00:31.25049Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"shutil.rmtree(\"AutogluonModels\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-14T08:00:31.253977Z","iopub.execute_input":"2024-12-14T08:00:31.254357Z","iopub.status.idle":"2024-12-14T08:00:31.48909Z","shell.execute_reply.started":"2024-12-14T08:00:31.254319Z","shell.execute_reply":"2024-12-14T08:00:31.486968Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}