{"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":30805,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Please give me some comment to improve","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import StratifiedKFold, train_test_split\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import StandardScaler, OneHotEncoder\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.metrics import mean_squared_error\n\nfrom xgboost import XGBClassifier\nfrom catboost import CatBoostClassifier\nimport lightgbm as lgb\nimport optuna\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:48:48.54486Z","iopub.execute_input":"2024-12-10T05:48:48.545195Z","iopub.status.idle":"2024-12-10T05:48:54.333983Z","shell.execute_reply.started":"2024-12-10T05:48:48.545163Z","shell.execute_reply":"2024-12-10T05:48:54.333251Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/playground-series-s4e12/train.csv\")\ntest_df = pd.read_csv(\"/kaggle/input/playground-series-s4e12/test.csv\")\n\n# train_df.head()\ntest_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:48:54.335268Z","iopub.execute_input":"2024-12-10T05:48:54.335817Z","iopub.status.idle":"2024-12-10T05:49:03.018707Z","shell.execute_reply.started":"2024-12-10T05:48:54.335788Z","shell.execute_reply":"2024-12-10T05:49:03.017791Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"code","source":"def preprocess(df, df_type = \"train\"):\n    df = df.drop([\"id\"], axis=1)\n    numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns.to_list()\n    categorical_cols = df.select_dtypes(include=['object', 'category']).columns.to_list()\n    \n    target_df = 0\n    if df_type == \"train\":\n        target_df = df[\"Premium Amount\"]\n        df = df.drop([\"Premium Amount\"], axis=1)\n        \n    # Fill with Median\n    for col in [\"Age\", \"Annual Income\", \"Health Score\", \"Credit Score\", \"Vehicle Age\"]:\n        df[col] = df[col].fillna(df[col].median())\n    \n    # Fill with zero\n    for col in [\"Number of Dependents\", \"Previous Claims\", \"Insurance Duration\"]:\n        df[col] = df[col].fillna(0)\n    \n    df[\"Marital Status\"] = df[\"Marital Status\"].fillna(\"Unknown\")\n    df[\"Occupation\"] = df[\"Occupation\"].fillna(\"Unknown\")\n    df[\"Customer Feedback\"] = df[\"Customer Feedback\"].fillna(\"Average\")\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n\n    # Extract month and year into separate columns\n    df['start_month'] = df['Policy Start Date'].dt.month\n    df['start_year'] = df['Policy Start Date'].dt.year\n    \n    del df['Policy Start Date']\n    categorical_cols.remove('Policy Start Date')\n    df = pd.get_dummies(df, columns=categorical_cols, dtype='int', drop_first=True)\n\n    return df, target_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:49:03.019572Z","iopub.execute_input":"2024-12-10T05:49:03.019817Z","iopub.status.idle":"2024-12-10T05:49:03.027282Z","shell.execute_reply.started":"2024-12-10T05:49:03.019794Z","shell.execute_reply":"2024-12-10T05:49:03.026385Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data prepare","metadata":{}},{"cell_type":"code","source":"train_data, target = preprocess(train_df, df_type = \"train\")\ntest_data, _ = preprocess(test_df, df_type = \"test\")\nX_train, X_val, y_train, y_val = train_test_split(train_data, target, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:49:03.029173Z","iopub.execute_input":"2024-12-10T05:49:03.029456Z","iopub.status.idle":"2024-12-10T05:49:07.298751Z","shell.execute_reply.started":"2024-12-10T05:49:03.029429Z","shell.execute_reply":"2024-12-10T05:49:07.297779Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom torch.utils.data import DataLoader, Dataset\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\n\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train)\nX_val = scaler.transform(X_val)\n\nclass InsuranceDataset(Dataset):\n    def __init__(self, features, targets=None):\n        self.features = torch.tensor(np.array(features), dtype=torch.float32)\n        if isinstance(targets, pd.Series):\n            self.targets = torch.log1p(torch.tensor(np.array(targets), dtype=torch.float32))\n        else:\n            self.targets = None\n\n    def __len__(self):\n        return len(self.features)\n\n    def __getitem__(self, idx):\n        if self.targets != None:\n            return self.features[idx], self.targets[idx]\n        return self.features[idx]\n\ntrain_dataset = InsuranceDataset(X_train, y_train)\nval_dataset = InsuranceDataset(X_val, y_val)\n\ntrain_loader = DataLoader(train_dataset, batch_size=1024, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=4096, shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:49:07.299775Z","iopub.execute_input":"2024-12-10T05:49:07.300042Z","iopub.status.idle":"2024-12-10T05:49:11.077637Z","shell.execute_reply.started":"2024-12-10T05:49:07.300015Z","shell.execute_reply":"2024-12-10T05:49:11.076645Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"class Model(nn.Module):\n    def __init__(self, input_size):\n        super(Model, self).__init__()\n        self.fc = nn.Sequential(\n            nn.Linear(input_size, 128),\n            nn.ReLU(),\n            nn.Linear(128, 64),\n            nn.ReLU(),\n            nn.BatchNorm1d(64),\n            nn.Linear(64, 32),\n            nn.ReLU(),\n            nn.Linear(32, 1)  # Output layer\n        )\n\n    def forward(self, x):\n        return self.fc(x)\n\nclass RMSLE(nn.Module):\n    def __init__(self):\n        super(RMSLE, self).__init__()\n        self.mse = nn.MSELoss()\n\n    def forward(self, y_pred, y_true):\n        log_pred = torch.log1p(y_pred)\n        log_true = torch.log1p(y_true)\n        return torch.sqrt(self.mse(log_pred, log_true))\n\ndef train_and_validate(model, train_loader, val_loader, epochs):\n    best_val_loss = float('inf')\n    best_model_path = \"best_model.pth\"\n    for epoch in range(epochs):\n        model.train()\n        train_loss = 0.0\n        for features, targets in tqdm(train_loader):\n            optimizer.zero_grad()\n            outputs = model(features).squeeze()\n            loss = criterion(outputs, targets)\n            loss.backward()\n            optimizer.step()\n            train_loss += loss.item() * features.size(0)\n\n        train_loss /= len(train_loader.dataset)\n\n        # Validation\n        model.eval()\n        val_loss = 0.0\n        with torch.no_grad():\n            for features, targets in tqdm(val_loader):\n                outputs = model(features).squeeze()\n                loss = criterion(outputs, targets)\n                val_loss += loss.item() * features.size(0)\n\n        val_loss /= len(val_loader.dataset)\n        print(f\"Epoch {epoch+1}/{epochs}, Train RMSLE: {train_loss ** 0.5:.5f}, Val RMSLE: {val_loss ** 0.5:.5f}\")\n        # Check if this is the best model\n        if val_loss < best_val_loss:\n            best_val_loss = val_loss\n            torch.save(model.state_dict(), best_model_path)  # Save the model\n            print(f\"New best model saved with validation loss: {best_val_loss ** 0.5:.5f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:49:11.078844Z","iopub.execute_input":"2024-12-10T05:49:11.079424Z","iopub.status.idle":"2024-12-10T05:49:11.090434Z","shell.execute_reply.started":"2024-12-10T05:49:11.079395Z","shell.execute_reply":"2024-12-10T05:49:11.089286Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = InsuranceDataset(X_train, y_train)\nval_dataset = InsuranceDataset(X_val, y_val)\n\ntrain_loader = DataLoader(train_dataset, batch_size=1024, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=4096, shuffle=False)\nmodel = Model(input_size=X_train.shape[1])\ncriterion = RMSLE()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n# Train the model\ntrain_and_validate(model, train_loader, val_loader, epochs=100)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T05:49:11.091455Z","iopub.execute_input":"2024-12-10T05:49:11.091725Z","iopub.status.idle":"2024-12-10T06:52:18.375958Z","shell.execute_reply.started":"2024-12-10T05:49:11.091697Z","shell.execute_reply":"2024-12-10T06:52:18.375055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test = scaler.transform(test_data)\ntest_dataset = InsuranceDataset(X_test, None)\ntest_loader = DataLoader(test_dataset, batch_size=4096, shuffle=False)\n\nmodel.load_state_dict(torch.load(\"best_model.pth\"))\nmodel.eval()\n\noutputs = []\nwith torch.no_grad():\n    for features in tqdm(test_loader):\n        outputs.append(model(features).squeeze().cpu().numpy())\n\noutputs = np.concatenate(outputs)\noutputs = np.exp(outputs) - 1\nprint(outputs)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T08:37:47.040989Z","iopub.execute_input":"2024-12-10T08:37:47.041249Z","iopub.status.idle":"2024-12-10T08:37:47.383068Z","shell.execute_reply.started":"2024-12-10T08:37:47.041224Z","shell.execute_reply":"2024-12-10T08:37:47.381577Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submisson","metadata":{}},{"cell_type":"code","source":"sub = pd.read_csv(\"/kaggle/input/playground-series-s4e12/sample_submission.csv\")\nsub[\"Premium Amount\"] = outputs\nsub.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T06:52:21.482727Z","iopub.execute_input":"2024-12-10T06:52:21.483008Z","iopub.status.idle":"2024-12-10T06:52:22.778243Z","shell.execute_reply.started":"2024-12-10T06:52:21.482977Z","shell.execute_reply":"2024-12-10T06:52:22.777479Z"}},"outputs":[],"execution_count":null}]}