{"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":"gpu","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from IPython.display import HTML\n\nimport numpy as np\nimport pandas as pd \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport warnings\nfrom IPython.display import clear_output\n\npd.set_option('display.max_columns', None)\nwarnings.filterwarnings('ignore')\n\nimport lightgbm as lgb\nfrom sklearn.model_selection import KFold, RandomizedSearchCV, train_test_split, cross_val_score, cross_validate\nfrom random import random, randint, randrange, uniform\nfrom lightgbm import LGBMRegressor\nfrom lightgbm import log_evaluation, early_stopping\n\nfrom xgboost import XGBRegressor\nfrom sklearn.ensemble import StackingRegressor\n\nfrom sklearn.metrics import *\n\nrs = 9","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T15:09:41.667001Z","iopub.execute_input":"2024-12-30T15:09:41.667373Z","iopub.status.idle":"2024-12-30T15:09:41.673579Z","shell.execute_reply.started":"2024-12-30T15:09:41.667344Z","shell.execute_reply":"2024-12-30T15:09:41.672586Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dfTrain = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv', index_col = 'id')\ndfTest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv', index_col = 'id')\ndfSubmission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')","metadata":{"trusted":true,"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-12-30T15:09:41.67511Z","iopub.execute_input":"2024-12-30T15:09:41.675364Z","execution_failed":"2024-12-30T15:09:44.506Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 style=\"background-color: aliceblue; color:black; font-size: 30px; border-radius: 15px; padding: 16px; text-align: center;\"><b> 🪶 Finding insurance premiums using \bLGBM</b></h1>\n\n<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Hello,  \nThis notebook is designed to help understand PS4E12, from EDA to submission. I hope it serves as a useful resource for gaining insights into this competition's dataset and modeling.</h1>","metadata":{}},{"cell_type":"markdown","source":"## ","metadata":{}},{"cell_type":"markdown","source":"# 1.  Table of Contents\n\n    I. Overview of PS4E12\n        i. Goal & Columns\n        ii. Evaluation method \n    II. EDA\n        i. Bagic Data Exploration\n        ii. Visualizing\n    III. Preprocessing\n    IV. Modeling\n    V. Prediction & Submission","metadata":{}},{"cell_type":"markdown","source":"## ","metadata":{}},{"cell_type":"markdown","source":"# I. Overview of PS4E12","metadata":{}},{"cell_type":"markdown","source":"## i. Goal & Columns\n\n    The goal of PS4E12 is to predict insurance premiums based on various factors.\n\n    There're 19 factors for predicting Premium Amount.\n\n    The following presents the classification of the given variables into numerical and categorical variables, along with the unique names of the categorical variables.\n    \n    >> Numerical Variables \n    \n        'Age'\n        'Annual Income'\n        'Number of Dependents'\n        'Health Score' \n        'Previous Claims' \n        'Insurance Duration' \n        'Vehicle Age' \n        'Credit Score' \n\n\n    >> Categorical Variables \n    \n        'Gender' : Male, Female\n        'Marital Status' : Single, Married, Divorced\n        'Education Level' : Master's, PhD, Bachelor's, High School\n        'Occupation' : Employed, Self-Employed, Unemployed\n        'Location' : Suburban, Rural, Urban\n        'Policy Type' : Premium, Comprehensive, Basic\n        'Customer Feedback' : Average, Poor, Good\n        'Smoking Status' : Yes, No\n        'Exercise Frequency' : Weekly, Monthly, Rarely, Daily\n        'Property Type' : House, Apartment, Condo\n\n\n    >> feature extraction target\n        'Policy Start Date' ","metadata":{}},{"cell_type":"markdown","source":"### ","metadata":{}},{"cell_type":"markdown","source":"## ii. Evaluation method\n\n    Submissions are evaluated using the RMSLE(Root Mean Squared Logarithmic Error)\n\n    RMSLE is a metric used to measure the prediction error of regression models. \n    \n![rmsle.png](attachment:fc71e4ac-bbea-4139-b3dd-607a6d93dc46.png)\n    \n    This approach mitigates differences in data scale, allowing for a balanced evaluation of relative errors across both large and small values. \n    \n    It is especially useful for data with a wide range of values or outliers. By using RMSLE, you can understand how closely the model's predictions change in proportion to the actual values.","metadata":{},"attachments":{"fc71e4ac-bbea-4139-b3dd-607a6d93dc46.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"# II. EDA","metadata":{"execution":{"iopub.status.busy":"2024-12-01T08:03:49.398337Z","iopub.execute_input":"2024-12-01T08:03:49.398758Z","iopub.status.idle":"2024-12-01T08:03:49.404118Z","shell.execute_reply.started":"2024-12-01T08:03:49.398722Z","shell.execute_reply":"2024-12-01T08:03:49.402671Z"}}},{"cell_type":"markdown","source":"## i. Bagic Data Exploration","metadata":{}},{"cell_type":"code","source":"print('The shape of train set :', dfTrain.shape)\nprint('The shape of test set :', dfTest.shape)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('The duplicated rows in train set :', dfTrain.duplicated().sum())\nprint('The duplicated rows in test set :', dfTest.duplicated().sum())","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('The 10 first rows in train set : \\n\\n')\ndfTrain.head(10)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('The discriptive statistics of Train Set : \\n\\n')\ndfTrain.describe()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('The data types of columns in Train Set : \\n\\n')\n\ndfTrain.info()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> I will store the numerical and categorical variables in the `numCols` and `catCols` variable names, respectively. </h1>","metadata":{}},{"cell_type":"code","source":"columns = list(dfTrain.columns)\n\nnumCols = ['Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Previous Claims', 'Insurance Duration', 'Vehicle Age', 'Credit Score']\ncatCols = ['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location', 'Policy Type', 'Customer Feedback', 'Smoking Status', 'Exercise Frequency', 'Property Type']\ntarget = 'Premium Amount'","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('I will check the number of unique values for each column. \\n\\ncolumn name : the number of unique \\n\\n')\n\nfor col in columns:\n    print(col, ':', dfTrain[col].nunique())","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"I will check the frequency of each unique value in the categorical variables. \\n\\ncategorical column's unique name : the value counts of each unique \\n\\n\")\n\nfor col in catCols:\n    print(col, ':', dfTrain[col].value_counts(), '\\n')","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Let's check for missing values. </h1>","metadata":{}},{"cell_type":"code","source":"def plotMissingValues(df, title, color):\n    missingRatio = df.isnull().sum() / len(df) * 100\n    missingDf = pd.DataFrame({'column': missingRatio.index, 'missingRatio': missingRatio.values})\n    \n    plt.figure(figsize=(15, 6))\n    plt.grid(True)\n    ax = sns.barplot(x='column', y='missingRatio', data=missingDf, color=color)\n    \n    plt.xticks(rotation=45, ha='right', fontsize = 14)\n    plt.xlabel('')\n    \n    plt.title(title, fontsize = 20)\n    \n    plt.yticks(range(0, 41, 10), fontsize = 14)\n    plt.ylabel('Missing Values ratio(%)', fontsize = 12)\n    \n    for p in ax.patches:\n        height = p.get_height()\n        ax.text(p.get_x() + p.get_width() / 2.,\n                height + 0.8,\n                '{:.1f}%'.format(height),\n                ha=\"center\")\n    \n    plt.tight_layout()\n    plt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.506Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plotMissingValues(dfTrain, 'Missing Values Ratio of Train Set', 'cornflowerblue')\nplotMissingValues(dfTest, 'Missing Values Ratio of Test Set', 'cornflowerblue')","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> There are a significant number of missing values. <br> The distribution of missing values is similar between the training set and the test set. </h1>\n<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> It seems that effectively handling missing data will be key to improving model performance in this month's competition.</h1>","metadata":{}},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"## ii. Visualizing","metadata":{}},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Target Distribution</h1>","metadata":{}},{"cell_type":"code","source":"def numDist(df, column, label):\n    plt.figure(figsize=(15, 6))  \n\n    sns.set_style('whitegrid') \n\n    plt.subplot(1, 2, 1)\n    sns.histplot(df[column], color='steelblue', kde=True, bins=100, linewidth=3)\n    plt.title(f'Histogram of {label}')\n    plt.xlabel(f'{label}')\n    plt.ylabel('Frequency')\n\n    plt.subplot(1, 2, 2)\n    sns.violinplot(y=df[column], color='lightsteelblue')\n    plt.title(f'Violin Plot of {label}')\n    plt.ylabel(label)\n\n    plt.tight_layout() \n    plt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numDist(dfTrain, column='Premium Amount', label='Premium Amount')","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### ","metadata":{}},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Numerical Features Distribution</h1>","metadata":{}},{"cell_type":"code","source":"for col in numCols :\n    numDist(dfTrain, column=col, label=col)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### ","metadata":{}},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Categorical Features Distribution</h1>","metadata":{}},{"cell_type":"code","source":"import squarify  ","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def catDist(df, column, label):\n    plt.figure(figsize=(15, 6))  \n    \n    sns.set_style('whitegrid') \n    \n    plt.subplot(1, 2, 1)\n    data = df[column].value_counts()\n    sizes = data.values\n    total = sizes.sum()\n    percents = [(size / total) * 100 for size in sizes]\n    labels = [f'{label}\\n{size} ({percent:.1f}%)' for label, size, percent in zip(data.index, sizes, percents)]\n\n    colors = sns.color_palette('pastel')[0:len(data)]\n\n    squarify.plot(sizes=sizes, label=labels, color=colors, alpha=.8, text_kwargs={'fontsize':12})\n    plt.title(f'Treemap of {label}')\n    plt.axis('off') \n\n    plt.subplot(1, 2, 2)\n    data = df[column].value_counts()\n    colors = sns.color_palette('pastel')[0:len(data)]\n    plt.pie(data, labels=data.index, colors=colors, autopct='%1.1f%%', startangle=140)\n    plt.title(f'Pie Chart of {label}')\n    plt.axis('equal')  \n    \n    plt.tight_layout() \n    plt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in catCols :\n    catDist(df=dfTrain, column=col, label=col)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### ","metadata":{}},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Correlationship | Numerical Features-Target</h1>","metadata":{}},{"cell_type":"code","source":"dfNum = dfTrain[numCols]\ndfTarget = pd.DataFrame(dfTrain[target])\ndfCorr = pd.concat([dfNum, dfTarget], axis=1)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"corr = dfCorr.corr()\n\nplt.figure(figsize=(10, 8))\nsns.heatmap(corr, annot=True, cmap='coolwarm', linewidths=0.5)\nplt.title('Correlation Heatmap')\nplt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in numCols :\n    plt.figure(figsize=(10, 7))\n    plt.hexbin(dfTrain[col], dfTrain[target], gridsize=10, cmap='Blues', mincnt=1)\n    plt.colorbar(label='Count')\n    plt.xlabel(f'{col}')\n    plt.ylabel('Premium Amount')\n    plt.title(f'Hexbin Plot of {col}')\n    plt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> Correlationship | Categorical Features-Target</h1>","metadata":{}},{"cell_type":"code","source":"dfCat = dfTrain[catCols]\ndfBar = pd.concat([dfCat, dfTarget], axis=1)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in catCols :\n    plt.figure(figsize=(10, 7))\n    sns.set(style=\"whitegrid\")\n    sns.set_palette(\"Pastel1\")\n    ax = sns.barplot(data=dfBar, x=col, y='Premium Amount', estimator='mean')\n    plt.title(f'Barchart of target by {col}')\n\n\n    for p in ax.patches: \n        value = p.get_height()\n        ax.text(\n            x=p.get_x() + p.get_width() / 2,  \n            y=value,                         \n            s=f'mean : {value:.2f}',         \n            ha='center',                   \n            va='bottom',                   \n            fontsize=10,                     \n            color='black'                   \n        )\n    \n    plt.show()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"},"_kg_hide-input":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 style=\"font-size: 14px; border-radius: 20px; padding: 15px; border: 6px solid aliceblue; line-height: 1.6;\"> We could not identify any variable, whether numerical or categorical, that shows a particularly notable correlation with the target. </h1>","metadata":{}},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"# III. Preprocessing","metadata":{}},{"cell_type":"code","source":"def preprocessDataFrame(df):\n    for column in numCols:\n        if column in df.columns:\n            df[column + '_was_missing'] = df[column].isnull().astype(int)\n            \n            skewness = df[column].skew()\n            if skewness > 0.5 or skewness < -0.5:\n                modeValue = df[column].mode()[0]\n                df[column].fillna(modeValue, inplace=True)\n            else:\n                meanValue = df[column].mean()\n                df[column].fillna(meanValue, inplace=True)\n\n    for column in catCols:\n        if column in df.columns:\n            df[column + '_was_missing'] = df[column].isnull().astype(int)\n            \n            if column == 'Customer Feedback':\n                df[column].fillna(df[column].mode()[0], inplace=True)\n            else:\n                df[column].fillna('missing', inplace=True)\n\n    if 'Policy Start Date' in df.columns:\n        df['Policy Start Year'] = pd.to_datetime(df['Policy Start Date']).dt.year\n        df['Policy Start Month'] = pd.to_datetime(df['Policy Start Date']).dt.month\n        catCols.append('Policy Start Year') \n        catCols.append('Policy Start Month') \n        df.drop(columns=['Policy Start Date'], inplace=True)\n        # catCols.append('Policy Start Date') \n\n\n\n    for col in catCols:\n        if col in df.columns:\n            df[col] = df[col].astype('category')\n\n    return df","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dfTrain = preprocessDataFrame(dfTrain)\ndfTest = preprocessDataFrame(dfTest)","metadata":{"trusted":true,"_kg_hide-input":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dfTrain.head()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"# IV. Modeling","metadata":{}},{"cell_type":"code","source":"X = dfTrain.drop(columns=['Premium Amount'])\ny = dfTrain['Premium Amount']","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=rs)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def rmsle_metric(y_true, y_pred):\n    return np.sqrt(mean_squared_error(np.log1p(y_true), np.log1p(y_pred)))","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgb_model = lgb.LGBMRegressor(\n    n_estimators=1000,\n    learning_rate=0.05,\n    random_state=rs,\n    boosting_type='gbdt',        \n    num_leaves=31,               \n    max_depth=-1,                \n    subsample=0.8,               \n    colsample_bytree=0.8,       \n    reg_alpha=0.01,              \n    reg_lambda=0.01,             \n    min_child_samples=20,        \n    bagging_freq=1,\n    device='gpu' \n)\n\nxgb_model = XGBRegressor(\n    n_estimators=1000,\n    learning_rate=0.05,\n    random_state=rs,\n    enable_categorical=True,  \n    booster='gbtree',         \n    max_depth=6,              \n    min_child_weight=1,       \n    subsample=0.8,           \n    colsample_bytree=0.8,     \n    gamma=0.0,                \n    reg_alpha=0.01,          \n    reg_lambda=0.01,\n    tree_method='gpu_hist' \n)\n\nmeta_model = lgb.LGBMRegressor(\n    n_estimators=500,\n    learning_rate=0.03,\n    random_state=rs,\n    boosting_type='gbdt',\n    num_leaves=31,\n    max_depth=-1,\n    subsample=0.8,\n    colsample_bytree=0.8,\n    reg_alpha=0.1,\n    reg_lambda=0.1,\n    min_child_samples=20,\n    device='gpu'\n)\n\nstack_model = StackingRegressor(\n    estimators=[\n        ('lgb', lgb_model),\n        ('xgb', xgb_model)\n    ],\n    final_estimator=meta_model\n)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stack_model.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_hat = stack_model.predict(X_val)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rmsle = rmsle_metric(y_val, y_hat)\nprint(f\"Validation RMSLE: {rmsle:.5f}\")","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# V. Prediction & Submission","metadata":{}},{"cell_type":"code","source":"X, dfTest = X.align(dfTest, join='left', axis=1, fill_value=0)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"yPred = stack_model.predict(dfTest)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'id': dfSubmission['id'], \n    'Premium Amount': yPred  \n})\nsubmission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"confirm = pd.read_csv('submission.csv')\nconfirm.head()","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:09:44.507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}