{"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)\nimport seaborn as sns\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-13T15:15:30.245729Z","iopub.execute_input":"2024-12-13T15:15:30.246429Z","iopub.status.idle":"2024-12-13T15:15:30.255329Z","shell.execute_reply.started":"2024-12-13T15:15:30.246385Z","shell.execute_reply":"2024-12-13T15:15:30.253899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ndf_test = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\ndf_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:30.25778Z","iopub.execute_input":"2024-12-13T15:15:30.258276Z","iopub.status.idle":"2024-12-13T15:15:38.957654Z","shell.execute_reply.started":"2024-12-13T15:15:30.258225Z","shell.execute_reply":"2024-12-13T15:15:38.956431Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in df_train.columns:\n    print(i, 'has', df_train[i].nunique(), df_train[i].dtypes)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:38.9591Z","iopub.execute_input":"2024-12-13T15:15:38.959575Z","iopub.status.idle":"2024-12-13T15:15:40.107295Z","shell.execute_reply.started":"2024-12-13T15:15:38.959466Z","shell.execute_reply":"2024-12-13T15:15:40.106007Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"##### Preprocess cols needed: Policy Start Date, Bool\n\n## Drop ID\ndf_train = df_train.drop(columns='id')\ndf_test = df_test.drop(columns='id')\n\n## Change Policy Start date to an integer of number of days (based on max date)\nfrom datetime import datetime\nlast_time = pd.Timestamp('2024-08-15 15:21:39.287115')\n\ndf_train['Policy Start Date'] = pd.to_datetime(df_train['Policy Start Date'])\ndf_train['Policy Start Date'] = (last_time - df_train['Policy Start Date']).dt.days.abs()\n\ndf_test['Policy Start Date'] = pd.to_datetime(df_test['Policy Start Date'])\ndf_test['Policy Start Date'] = (last_time - df_test['Policy Start Date']).dt.days.abs()\n\n## Object to Bool\ndf_train.loc[df_train['Smoking Status']=='Yes', 'Smoking Status'] = 1\ndf_train.loc[df_train['Smoking Status']=='No', 'Smoking Status'] = 0\ndf_train['Smoking Status'] = df_train['Smoking Status'].astype('bool')\n\ndf_test.loc[df_test['Smoking Status']=='Yes', 'Smoking Status'] = 1\ndf_test.loc[df_test['Smoking Status']=='No', 'Smoking Status'] = 0\ndf_test['Smoking Status'] = df_test['Smoking Status'].astype('bool')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:40.1086Z","iopub.execute_input":"2024-12-13T15:15:40.108997Z","iopub.status.idle":"2024-12-13T15:15:41.610457Z","shell.execute_reply.started":"2024-12-13T15:15:40.108906Z","shell.execute_reply":"2024-12-13T15:15:41.609368Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import lightgbm as lgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OneHotEncoder, OrdinalEncoder\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nimport math\n\n## Train and test data\n\nX = df_train\nX = X.drop(columns='Premium Amount')\ny = df_train['Premium Amount']\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n\n\n\n\n# Create an OrdinalEncoder with the specific orders\n## Define order for Ordinal encoding\n#cols = ['Education Level', 'Customer Feedback', 'Exercise Frequency']\n#for i in cols:\n#    print(df_train[i].unique())\n    \ncolumn_orders = {\n    'Education Level': ['High School',\"Bachelor's\", \"Master's\",  'PhD'],      \n    'Customer Feedback': ['Poor', 'NULL', 'Average', 'Good'],  \n    'Exercise Frequency': ['Rarely', 'Monthly', 'Weekly', 'Daily']     \n}\n\n\nordinal_encoder = Pipeline([\n    ('impute', SimpleImputer(strategy='constant', fill_value='NULL')),  # Impute missing values with 'NULL'\n    ('encode', OrdinalEncoder(categories=[column_orders[col] for col in column_orders]))  # Apply Ordinal Encoding\n])\n\none_hot_encoder = Pipeline([\n    ('impute', SimpleImputer(strategy='constant', fill_value='NULL')),  # Replace NaNs with 'NULL'\n    ('encode', OneHotEncoder(handle_unknown='ignore'))  # OHE including 'NULL'\n])\n\n\nnumeric_preprocessor = SimpleImputer(strategy='mean')\n\n\n\n## Define columns:\n\nnumeric_cols = ['Age', 'Annual Income', 'Number of Dependents','Health Score','Previous Claims',\n                'Vehicle Age', 'Credit Score', 'Insurance Duration', 'Policy Start Date']\none_hot_cols=['Occupation', 'Gender', 'Marital Status', 'Location', 'Policy Type', 'Property Type']\n\n\n# Define the ColumnTransformer\npreprocessor = ColumnTransformer(\n    transformers=[\n        ('numeric', numeric_preprocessor, numeric_cols),\n        ('ordinal', ordinal_encoder, list(column_orders.keys())),\n        ('onehot', one_hot_encoder, one_hot_cols) \n    ],\n    remainder='passthrough'\n)\n\n# Create the pipeline\npipeline = Pipeline([\n    ('preprocessing', preprocessor),\n    ('model', lgb.LGBMRegressor())  # Replace with your desired model\n])\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:41.612735Z","iopub.execute_input":"2024-12-13T15:15:41.61309Z","iopub.status.idle":"2024-12-13T15:15:44.014064Z","shell.execute_reply.started":"2024-12-13T15:15:41.613056Z","shell.execute_reply":"2024-12-13T15:15:44.01288Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\npipeline.fit(X_train, y_train)\ny_pred = pipeline.predict(X_test)\nprint(math.sqrt(mean_squared_log_error(y_pred, y_test)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:44.015601Z","iopub.execute_input":"2024-12-13T15:15:44.016443Z","iopub.status.idle":"2024-12-13T15:15:55.426863Z","shell.execute_reply.started":"2024-12-13T15:15:44.016389Z","shell.execute_reply":"2024-12-13T15:15:55.425676Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fres = pipeline.predict(df_test)\nsubmission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\nsubmission['Premium Amount'] = fres\nsubmission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:15:55.429203Z","iopub.execute_input":"2024-12-13T15:15:55.429521Z","iopub.status.idle":"2024-12-13T15:16:04.107565Z","shell.execute_reply.started":"2024-12-13T15:15:55.429491Z","shell.execute_reply":"2024-12-13T15:16:04.106134Z"}},"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},{"cell_type":"code","source":"df_tra","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:16:04.109083Z","iopub.execute_input":"2024-12-13T15:16:04.109438Z","iopub.status.idle":"2024-12-13T15:16:04.168599Z","shell.execute_reply.started":"2024-12-13T15:16:04.109404Z","shell.execute_reply":"2024-12-13T15:16:04.167377Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T15:16:04.169563Z","iopub.status.idle":"2024-12-13T15:16:04.170021Z","shell.execute_reply.started":"2024-12-13T15:16:04.169795Z","shell.execute_reply":"2024-12-13T15:16:04.169817Z"}},"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},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}