{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install pytorch-tabnet","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:45:30.624033Z","iopub.execute_input":"2024-12-25T18:45:30.624322Z","iopub.status.idle":"2024-12-25T18:45:35.244908Z","shell.execute_reply.started":"2024-12-25T18:45:30.6243Z","shell.execute_reply":"2024-12-25T18:45:35.244027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.preprocessing import LabelEncoder, StandardScaler\nfrom pytorch_tabnet.tab_model import TabNetRegressor\nimport torch\nfrom sklearn.model_selection import train_test_split","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:45:35.246125Z","iopub.execute_input":"2024-12-25T18:45:35.24645Z","iopub.status.idle":"2024-12-25T18:45:39.010298Z","shell.execute_reply.started":"2024-12-25T18:45:35.24642Z","shell.execute_reply":"2024-12-25T18:45:39.009637Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def preprocess_data(df):\n    df = df.copy()\n    \n    # Handle missing values\n    numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n    for col in numeric_columns:\n        df[col] = df[col].fillna(df[col].median())\n    \n    categorical_columns = ['Gender', 'Marital Status', 'Education Level', 'Occupation', \n                         'Location', 'Policy Type', 'Property Type', 'Customer Feedback',\n                         'Exercise Frequency']\n    \n    for col in categorical_columns:\n        df[col] = df[col].fillna(df[col].mode()[0])\n    \n    # Convert boolean to numeric\n    df['Smoking Status'] = df['Smoking Status'].map({'true': 1, 'false': 0, True: 1, False: 0}).fillna(0)\n    \n    # Handle dates\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n    df['Policy_Year'] = df['Policy Start Date'].dt.year\n    df['Policy_Month'] = df['Policy Start Date'].dt.month\n    df = df.drop('Policy Start Date', axis=1)\n    \n    # Encode categorical variables\n    le = LabelEncoder()\n    for col in categorical_columns:\n        if col in df.columns:\n            df[col] = le.fit_transform(df[col].astype(str))\n    \n    return df.astype(float)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:45:39.011718Z","iopub.execute_input":"2024-12-25T18:45:39.012114Z","iopub.status.idle":"2024-12-25T18:45:39.01803Z","shell.execute_reply.started":"2024-12-25T18:45:39.012089Z","shell.execute_reply":"2024-12-25T18:45:39.01726Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_tabnet(X_train, y_train, X_valid, y_valid):\n    model = TabNetRegressor(\n        n_d=64,\n        n_a=64,\n        n_steps=5,\n        gamma=1.5,\n        n_independent=2,\n        n_shared=2,\n        lambda_sparse=1e-3,\n        optimizer_fn=torch.optim.Adam,\n        optimizer_params=dict(lr=2e-2),\n        mask_type='entmax',\n        scheduler_params=dict(\n            mode=\"min\",\n            patience=5,\n            min_lr=1e-5,\n            factor=0.5,\n        ),\n        scheduler_fn=torch.optim.lr_scheduler.ReduceLROnPlateau,\n        verbose=10\n    )\n    \n    model.fit(\n        X_train=X_train, y_train=y_train,\n        eval_set=[(X_valid, y_valid)],\n        max_epochs=100,\n        patience=10,\n        batch_size=1024,\n        virtual_batch_size=128\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:52:00.13533Z","iopub.execute_input":"2024-12-25T18:52:00.135759Z","iopub.status.idle":"2024-12-25T18:52:00.143286Z","shell.execute_reply.started":"2024-12-25T18:52:00.135725Z","shell.execute_reply":"2024-12-25T18:52:00.142177Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load data\ntrain_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-25T18:52:02.016772Z","iopub.execute_input":"2024-12-25T18:52:02.017059Z","iopub.status.idle":"2024-12-25T18:52:07.506234Z","shell.execute_reply.started":"2024-12-25T18:52:02.017036Z","shell.execute_reply":"2024-12-25T18:52:07.50553Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocess\ntrain_data = preprocess_data(train_data)\ntest_data = preprocess_data(test_data)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:52:07.507341Z","iopub.execute_input":"2024-12-25T18:52:07.507579Z","iopub.status.idle":"2024-12-25T18:52:14.402916Z","shell.execute_reply.started":"2024-12-25T18:52:07.507559Z","shell.execute_reply":"2024-12-25T18:52:14.402028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare features\ny = train_data['Premium Amount']\nX = train_data.drop(['Premium Amount', 'id'], axis=1)\ntest_features = test_data.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:52:14.404625Z","iopub.execute_input":"2024-12-25T18:52:14.404887Z","iopub.status.idle":"2024-12-25T18:52:14.520363Z","shell.execute_reply.started":"2024-12-25T18:52:14.404865Z","shell.execute_reply":"2024-12-25T18:52:14.519428Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Split data and reshape targets\nX_train, X_valid, y_train, y_valid = train_test_split(\n    X, y, test_size=0.2, random_state=42\n)\ny_train = y_train.values.reshape(-1, 1)\ny_valid = y_valid.values.reshape(-1, 1)\n\n# Scale features\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train)\nX_valid = scaler.transform(X_valid)\ntest_features = scaler.transform(test_features)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:52:14.521678Z","iopub.execute_input":"2024-12-25T18:52:14.521912Z","iopub.status.idle":"2024-12-25T18:52:15.281404Z","shell.execute_reply.started":"2024-12-25T18:52:14.521892Z","shell.execute_reply":"2024-12-25T18:52:15.280485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train\nmodel = train_tabnet(X_train, y_train, X_valid, y_valid)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T18:52:15.282384Z","iopub.execute_input":"2024-12-25T18:52:15.282652Z","iopub.status.idle":"2024-12-25T19:33:23.357769Z","shell.execute_reply.started":"2024-12-25T18:52:15.282631Z","shell.execute_reply":"2024-12-25T19:33:23.356828Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = model.predict(test_features).flatten()  # Flatten predictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T19:33:23.358777Z","iopub.execute_input":"2024-12-25T19:33:23.359014Z","iopub.status.idle":"2024-12-25T19:33:44.055974Z","shell.execute_reply.started":"2024-12-25T19:33:23.358995Z","shell.execute_reply":"2024-12-25T19:33:44.055024Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'id': test_data['id'],\n    'Premium Amount': predictions\n})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T19:33:44.056911Z","iopub.execute_input":"2024-12-25T19:33:44.057153Z","iopub.status.idle":"2024-12-25T19:33:44.062916Z","shell.execute_reply.started":"2024-12-25T19:33:44.057132Z","shell.execute_reply":"2024-12-25T19:33:44.062077Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'id': test_data['id'].astype('Int32'),\n    'Premium Amount': predictions\n})\nsubmission.to_csv('submission_gg.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T19:42:23.220325Z","iopub.execute_input":"2024-12-25T19:42:23.220642Z","iopub.status.idle":"2024-12-25T19:42:24.215108Z","shell.execute_reply.started":"2024-12-25T19:42:23.220616Z","shell.execute_reply":"2024-12-25T19:42:24.214441Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T19:41:51.980701Z","iopub.execute_input":"2024-12-25T19:41:51.980993Z","iopub.status.idle":"2024-12-25T19:41:52.960567Z","shell.execute_reply.started":"2024-12-25T19:41:51.980968Z","shell.execute_reply":"2024-12-25T19:41:52.959615Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}