{"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":30786,"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-03T16:54:58.622584Z","iopub.execute_input":"2024-12-03T16:54:58.623012Z","iopub.status.idle":"2024-12-03T16:54:59.108679Z","shell.execute_reply.started":"2024-12-03T16:54:58.622964Z","shell.execute_reply":"2024-12-03T16:54:59.107383Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Import Libraries ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nimport warnings\n\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:54:59.110166Z","iopub.execute_input":"2024-12-03T16:54:59.110755Z","iopub.status.idle":"2024-12-03T16:54:59.116894Z","shell.execute_reply.started":"2024-12-03T16:54:59.110702Z","shell.execute_reply":"2024-12-03T16:54:59.115539Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest_data  = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:54:59.118972Z","iopub.execute_input":"2024-12-03T16:54:59.11976Z","iopub.status.idle":"2024-12-03T16:55:07.129345Z","shell.execute_reply.started":"2024-12-03T16:54:59.119664Z","shell.execute_reply":"2024-12-03T16:55:07.128244Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Add an indicator column\ntrain_data['Dataset'] = 'train'\ntest_data['Dataset'] = 'test'\n\n# Concatenate train and test\ndf = pd.concat([train_data, test_data], axis=0).reset_index(drop=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:07.132105Z","iopub.execute_input":"2024-12-03T16:55:07.132472Z","iopub.status.idle":"2024-12-03T16:55:08.866861Z","shell.execute_reply.started":"2024-12-03T16:55:07.132437Z","shell.execute_reply":"2024-12-03T16:55:08.865848Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 1. Exploratory Data Analysis (EDA)","metadata":{}},{"cell_type":"markdown","source":"## 1.1: Load and Understand the Dataset","metadata":{}},{"cell_type":"code","source":"train_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:08.867949Z","iopub.execute_input":"2024-12-03T16:55:08.868275Z","iopub.status.idle":"2024-12-03T16:55:10.093366Z","shell.execute_reply.started":"2024-12-03T16:55:08.868243Z","shell.execute_reply":"2024-12-03T16:55:10.092242Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:10.094985Z","iopub.execute_input":"2024-12-03T16:55:10.095426Z","iopub.status.idle":"2024-12-03T16:55:10.103233Z","shell.execute_reply.started":"2024-12-03T16:55:10.095379Z","shell.execute_reply":"2024-12-03T16:55:10.102192Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:10.104748Z","iopub.execute_input":"2024-12-03T16:55:10.105074Z","iopub.status.idle":"2024-12-03T16:55:10.86625Z","shell.execute_reply.started":"2024-12-03T16:55:10.105044Z","shell.execute_reply":"2024-12-03T16:55:10.865164Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2: Data Preprocessing","metadata":{}},{"cell_type":"markdown","source":"## 2.1: Explore Missing Values","metadata":{}},{"cell_type":"code","source":"pd.set_option('display.max_columns', None)\ndf.head()  # Display the first few rows with all columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:10.867722Z","iopub.execute_input":"2024-12-03T16:55:10.868136Z","iopub.status.idle":"2024-12-03T16:55:10.891292Z","shell.execute_reply.started":"2024-12-03T16:55:10.868101Z","shell.execute_reply":"2024-12-03T16:55:10.89016Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:10.893053Z","iopub.execute_input":"2024-12-03T16:55:10.893435Z","iopub.status.idle":"2024-12-03T16:55:11.366695Z","shell.execute_reply.started":"2024-12-03T16:55:10.893387Z","shell.execute_reply":"2024-12-03T16:55:11.36537Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_percentage = (df.isnull().sum() / len(df)) * 100\nprint(missing_percentage.sort_values(ascending=False))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:11.368263Z","iopub.execute_input":"2024-12-03T16:55:11.368604Z","iopub.status.idle":"2024-12-03T16:55:12.510908Z","shell.execute_reply.started":"2024-12-03T16:55:11.368572Z","shell.execute_reply":"2024-12-03T16:55:12.509787Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:12.512413Z","iopub.execute_input":"2024-12-03T16:55:12.512728Z","iopub.status.idle":"2024-12-03T16:55:12.525112Z","shell.execute_reply.started":"2024-12-03T16:55:12.512697Z","shell.execute_reply":"2024-12-03T16:55:12.523874Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Separate numerical and categorical columns\nnumerical_columns = df.select_dtypes(include=['float64', 'int64']).columns\ncategorical_columns = df.select_dtypes(include=['object']).columns\n\n# Display results\nprint(\"Numerical Columns:\")\nprint(numerical_columns)\n\nprint(\"\\nCategorical Columns:\")\nprint(categorical_columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:12.526793Z","iopub.execute_input":"2024-12-03T16:55:12.527255Z","iopub.status.idle":"2024-12-03T16:55:12.879182Z","shell.execute_reply.started":"2024-12-03T16:55:12.527208Z","shell.execute_reply":"2024-12-03T16:55:12.877733Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Handling missing values for numerical columns\nfor column in numerical_columns:\n    # Replace missing values in numerical columns with the mean\n    df[column].fillna(df[column].mean(), inplace=True)\n\n# Handling missing values for categorical columns\nfor column in categorical_columns:\n    # Replace missing values in categorical columns with 'no activity'\n    df[column].fillna('unknown', inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:12.880829Z","iopub.execute_input":"2024-12-03T16:55:12.881309Z","iopub.status.idle":"2024-12-03T16:55:14.232879Z","shell.execute_reply.started":"2024-12-03T16:55:12.881262Z","shell.execute_reply":"2024-12-03T16:55:14.231773Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:14.23426Z","iopub.execute_input":"2024-12-03T16:55:14.234598Z","iopub.status.idle":"2024-12-03T16:55:15.380241Z","shell.execute_reply.started":"2024-12-03T16:55:14.234566Z","shell.execute_reply":"2024-12-03T16:55:15.378967Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2.2: Encoding","metadata":{}},{"cell_type":"code","source":"categorical_columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:15.382228Z","iopub.execute_input":"2024-12-03T16:55:15.38268Z","iopub.status.idle":"2024-12-03T16:55:15.390126Z","shell.execute_reply.started":"2024-12-03T16:55:15.382629Z","shell.execute_reply":"2024-12-03T16:55:15.388463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert 'Policy Start Date' to datetime format\ndf['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'], errors='coerce')\n\n# # Extract meaningful features\n# df['Policy Start Year'] = df['Policy Start Date'].dt.year\n# df['Policy Start Month'] = df['Policy Start Date'].dt.month\n# df['Policy Start Day'] = df['Policy Start Date'].dt.day\n# df['Policy Start DayOfWeek'] = df['Policy Start Date'].dt.dayofweek\n# df['Policy Start IsWeekend'] = df['Policy Start Date'].dt.dayofweek >= 5\n\n# Extract features\ndf['year'] = df['Policy Start Date'].dt.year\ndf['month'] = df['Policy Start Date'].dt.month\ndf['day'] = df['Policy Start Date'].dt.day\n# df['hour'] = df['Policy Start Date'].dt.hour\ndf['dayofweek'] = df['Policy Start Date'].dt.dayofweek\n\n\n# # Create cyclical features for hour\n# df['hour_sin'] = np.sin(df['hour'] * (2 * np.pi / 24))\n# df['hour_cos'] = np.cos(df['hour'] * (2 * np.pi / 24))\n\n# Drop the original datetime column\ndf.drop('Policy Start Date', axis=1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:15.393685Z","iopub.execute_input":"2024-12-03T16:55:15.394113Z","iopub.status.idle":"2024-12-03T16:55:16.754166Z","shell.execute_reply.started":"2024-12-03T16:55:15.394079Z","shell.execute_reply":"2024-12-03T16:55:16.753014Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# cat = ['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location',\n#        'Policy Type', 'Policy Start Date', 'Customer Feedback',\n#        'Smoking Status', 'Exercise Frequency', 'Property Type']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:16.755243Z","iopub.execute_input":"2024-12-03T16:55:16.755565Z","iopub.status.idle":"2024-12-03T16:55:16.760265Z","shell.execute_reply.started":"2024-12-03T16:55:16.755534Z","shell.execute_reply":"2024-12-03T16:55:16.75904Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat = ['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location',\n       'Policy Type','Customer Feedback',\n       'Smoking Status', 'Exercise Frequency', 'Property Type']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:16.761651Z","iopub.execute_input":"2024-12-03T16:55:16.762007Z","iopub.status.idle":"2024-12-03T16:55:16.778498Z","shell.execute_reply.started":"2024-12-03T16:55:16.761965Z","shell.execute_reply":"2024-12-03T16:55:16.777492Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert categorical columns to integers (Label Encoding)\nfrom sklearn.preprocessing import LabelEncoder\n\nlabel_encoder = LabelEncoder()\nfor col in cat:\n    df[col] = label_encoder.fit_transform(df[col])  # Apply LabelEncoder to each column","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:16.780153Z","iopub.execute_input":"2024-12-03T16:55:16.780466Z","iopub.status.idle":"2024-12-03T16:55:21.013205Z","shell.execute_reply.started":"2024-12-03T16:55:16.780422Z","shell.execute_reply":"2024-12-03T16:55:21.01216Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2.3: Train-Test Split for Model Development","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# Split concatenated data back into train and test\ntrain_data = df[df['Dataset'] == 'train'].drop(columns=['Dataset', 'id'])\ntest_data = df[df['Dataset'] == 'test'].drop(columns=['Dataset', 'Premium Amount'])\n\n\n# categorical_columns = train_data.select_dtypes(include=['object']).columns\n\n# Example: Assume 'target_column' is your target variable\ntarget_column = 'Premium Amount'  # Replace with the actual target column name\nX = train_data.drop(columns=[target_column])  # Features\ny = train_data[target_column]  # Target\n\n# # Reshape y to be 2D (required by TabNet)\n# y = y.values.reshape(-1, 1)\n\n\n# Split the data: 80% train, 20% test\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n\n# Log transform the target variables to stabilize variance\ny_train = np.log1p(y_train)  # Log transform training target\ny_test = np.log1p(y_test)      # Log transform validation target\n\n\n# Display the shapes of the resulting splits\nprint(\"X_train shape:\", X_train.shape)\nprint(\"X_test shape:\", X_test.shape)\nprint(\"y_train shape:\", y_train.shape)\nprint(\"y_test shape:\", y_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T16:55:31.944359Z","iopub.execute_input":"2024-12-03T16:55:31.944926Z","iopub.status.idle":"2024-12-03T16:55:33.457125Z","shell.execute_reply.started":"2024-12-03T16:55:31.944889Z","shell.execute_reply":"2024-12-03T16:55:33.455864Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Model Selection and Implementation","metadata":{}},{"cell_type":"markdown","source":"## CatBoost","metadata":{"execution":{"iopub.status.busy":"2024-12-02T14:38:31.316126Z","iopub.execute_input":"2024-12-02T14:38:31.316691Z","iopub.status.idle":"2024-12-02T15:34:53.704643Z","shell.execute_reply.started":"2024-12-02T14:38:31.316647Z","shell.execute_reply":"2024-12-02T15:34:53.702672Z"}}},{"cell_type":"code","source":"# import pandas as pd\n# from catboost import CatBoostRegressor, Pool\n# from sklearn.model_selection import train_test_split\n# from sklearn.metrics import mean_squared_error\n\n\n\n# # Initialize the CatBoost model\n# model = CatBoostRegressor(iterations=1000, depth=6, learning_rate=0.1, loss_function='RMSE', \n#         cat_features=['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location',\n#        'Policy Type', 'Policy Start Date', 'Customer Feedback',\n#        'Smoking Status', 'Exercise Frequency', 'Property Type'])\n\n# # Train the model\n# model.fit(X_train, y_train, eval_set=(X_test, y_test), verbose=100)\n\n\n# # Make predictions\n# y_pred = model.predict(X_test)\n\n# # Evaluate the model\n# rmse = mean_squared_error(y_test, y_pred, squared=False)\n# print(f\"RMSE: {rmse}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom catboost import CatBoostRegressor, Pool\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\n\n\n\n# Initialize the CatBoost model\nmodel = CatBoostRegressor(iterations=1000, depth=8, learning_rate=0.1, loss_function='RMSE', \n        cat_features=['Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location',\n       'Policy Type', 'Customer Feedback', 'year', 'month', 'day', 'dayofweek',\n       'Smoking Status', 'Exercise Frequency', 'Property Type'])\n\n# Train the model\nmodel.fit(X_train, y_train, eval_set=(X_test, y_test), verbose=100)\n\n\n# Make predictions\ny_pred = model.predict(X_test)\n\n# Evaluate the model\nrmse = mean_squared_error(y_test, y_pred, squared=False)\nprint(f\"RMSE: {rmse}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submition ","metadata":{}},{"cell_type":"code","source":"# Preprocess test data\ntest_features = test_data.drop(columns=['id'], errors='ignore')  # Drop unnecessary columns","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict using the trained CatBoost model\ntest_data['Premium Amount'] = model.predict(test_features)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Reverse log transformation if applied during training\ntest_data['Premium Amount'] = np.expm1(test_data['Premium Amount'])  # Use np.expm1 if np.log1p was used during training\n\n# Clip predictions to avoid negative values (optional)\ntest_data['Premium Amount'] = test_data['Premium Amount'].clip(lower=0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create submission file\nsubmission = test_data[['id', 'Premium Amount']]  # Include 'id' and the predicted target column\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"Submission file created: submission.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}