{"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":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\nfile_path = '/kaggle/input/playground-series-s4e12/train.csv'\ndf = pd.read_csv(file_path)\n\n# 1. Number of rows and columns\nprint(f\"Number of rows: {df.shape[0]}\")\nprint(f\"Number of columns: {df.shape[1]}\")\n\n# 2. Data types of each column\nprint(\"\\nData types of each column:\")\nprint(df.dtypes)\n\n# 3. Missing values\nprint(\"\\nMissing values in each column:\")\nprint(df.isnull().sum())\n\n# 4. Unique values in categorical columns\ncategorical_columns = df.select_dtypes(include=['object']).columns\nprint(\"\\nUnique values in categorical columns:\")\nfor col in categorical_columns:\n    print(f\"{col}: {df[col].nunique()} unique values\")\n    print(df[col].value_counts(), \"\\n\")\n\n# 5. Summary statistics for numerical columns\nnumerical_columns = df.select_dtypes(include=['float64', 'int64']).columns\nprint(\"\\nSummary statistics for numerical columns:\")\nprint(df[numerical_columns].describe())\n\n# 6. Class imbalance in categorical target \nif 'Premium Amount' in df.columns:\n    print(\"\\nClass imbalance for Premium Amount (target variable):\")\n    print(df['Premium Amount'].value_counts())\n\n# 7. Any date columns and extract relevant date info?\ndate_columns = df.select_dtypes(include=['datetime']).columns\nif len(date_columns) > 0:\n    print(\"\\nDate Columns Information:\")\n    for col in date_columns:\n        print(f\"Date column: {col}\")\n        df[col] = pd.to_datetime(df[col])  # Ensure it's in datetime format\n        print(f\"Year extracted from {col}: {df[col].dt.year.unique()}\")\n        print(f\"Month extracted from {col}: {df[col].dt.month.unique()}\")\nelse:\n    print(\"\\nNo date columns found.\")","metadata":{"_uuid":"d585ecd6-b43c-4aa5-84ac-607a8b0aaa84","_cell_guid":"157aa89e-0481-462b-924f-f934f5eaaf96","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2024-12-19T08:30:11.178866Z","iopub.execute_input":"2024-12-19T08:30:11.179154Z","iopub.status.idle":"2024-12-19T08:30:20.69068Z","shell.execute_reply.started":"2024-12-19T08:30:11.179111Z","shell.execute_reply":"2024-12-19T08:30:20.68994Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"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')  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-19T08:30:20.692717Z","iopub.execute_input":"2024-12-19T08:30:20.693369Z","iopub.status.idle":"2024-12-19T08:30:27.196041Z","shell.execute_reply.started":"2024-12-19T08:30:20.693323Z","shell.execute_reply":"2024-12-19T08:30:27.195334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install lightgbm --quiet\n\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OneHotEncoder, StandardScaler\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom lightgbm import LGBMRegressor\nfrom sklearn.metrics import mean_squared_error\nfrom math import sqrt\nimport joblib\n\n# If you haven't loaded your data yet, uncomment these lines:\n# train_df = pd.read_csv('train.csv')\n# test_df = pd.read_csv('test.csv')\n\ntarget_col = 'Premium Amount'\ny = train_df[target_col]\nX = train_df.drop(columns=[target_col])\n\n# Check if 'id' column exists in test_df\nif 'id' in test_df.columns:\n    test_ids = test_df['id'].copy()\nelse:\n    # If no 'id' column, create a numeric sequence\n    test_ids = pd.Series(range(len(test_df)))\n\n# -------------------------\n# Step 2: Handle Dates with Additional Features\n# -------------------------\ndef extract_date_features(df):\n    if 'Policy Start Date' in df.columns:\n        df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'], errors='coerce')\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\n        # Additional time-based features\n        df['Policy_Start_Weekday'] = df['Policy Start Date'].dt.dayofweek\n        df['Policy_Start_Quarter'] = df['Policy Start Date'].dt.quarter\n\n        df.drop(columns=['Policy Start Date'], inplace=True)\n    else:\n        # If 'Policy Start Date' not found, fill defaults (or handle as needed)\n        df['Policy_Start_Year'] = 2020\n        df['Policy_Start_Month'] = 1\n        df['Policy_Start_Day'] = 1\n        df['Policy_Start_Weekday'] = 0\n        df['Policy_Start_Quarter'] = 1\n    return df\n\nX = extract_date_features(X)\nX_test = extract_date_features(test_df)\n\n# Drop 'id' from features since not needed for modeling\nif 'id' in X.columns:\n    X.drop(columns=['id'], inplace=True)\nif 'id' in X_test.columns:\n    X_test.drop(columns=['id'], inplace=True)\n\n# -------------------------\n# Step 3: Feature Lists\n# -------------------------\nnumeric_features = [\n    'Age', 'Annual Income', 'Number of Dependents', 'Health Score',\n    'Previous Claims', 'Vehicle Age', 'Credit Score', 'Insurance Duration',\n    'Policy_Start_Year', 'Policy_Start_Month', 'Policy_Start_Day',\n    'Policy_Start_Weekday', 'Policy_Start_Quarter'\n]\n\ncategorical_features = [\n    'Gender', 'Marital Status', 'Education Level', 'Occupation',\n    'Location', 'Policy Type', 'Customer Feedback', 'Smoking Status',\n    'Exercise Frequency', 'Property Type'\n]\n\n# -------------------------\n# Step 4: Log Transform Target\n# -------------------------\ny_log = np.log1p(y)\n\n# -------------------------\n# Step 5: Preprocessing\n# -------------------------\nnumeric_transformer = Pipeline(steps=[\n    ('imputer', SimpleImputer(strategy='mean')),\n    ('scaler', StandardScaler())\n])\n\ncategorical_transformer = Pipeline(steps=[\n    ('imputer', SimpleImputer(strategy='most_frequent')),\n    ('onehot', OneHotEncoder(handle_unknown='ignore'))\n])\n\npreprocessor = ColumnTransformer(\n    transformers=[\n        ('num', numeric_transformer, numeric_features),\n        ('cat', categorical_transformer, categorical_features)\n    ],\n    remainder='drop'\n)\n\n# -------------------------\n# Step 6: Use LightGBM\n# -------------------------\nmodel = LGBMRegressor(\n    random_state=42,\n    n_estimators=200,\n    learning_rate=0.05,\n    n_jobs=-1\n)\n\npipeline = Pipeline(steps=[('preprocessor', preprocessor),\n                           ('regressor', model)])\n\n# -------------------------\n# Step 7: Train/Validation Split\n# -------------------------\nX_train, X_val, y_train_log, y_val_log = train_test_split(\n    X, y_log, test_size=0.2, random_state=42\n)\n\n# Train the model\npipeline.fit(X_train, y_train_log)\n\n# -------------------------\n# Step 8: Validation\n# -------------------------\ny_val_pred_log = pipeline.predict(X_val)\ny_val_pred = np.expm1(y_val_pred_log)\ny_val_true = np.expm1(y_val_log)\n\nrmsle = sqrt(mean_squared_error(y_val_log, y_val_pred_log))\nprint(f\"Validation RMSLE: {rmsle:.4f}\")\n\n# -------------------------\n# Step 9: Retrain on Full Data\n# -------------------------\npipeline.fit(X, y_log)\n\n# -------------------------\n# Step 10: Predict on Test\n# -------------------------\ny_test_pred_log = pipeline.predict(X_test)\ny_test_pred = np.expm1(y_test_pred_log)\n\nsubmission = pd.DataFrame({\n    'id': test_ids,               # Ensure this matches the ID column in test data\n    'Premium Amount': y_test_pred # Make sure the column name is exactly \"Premium Amount\"\n})\n\n# Preview the first few rows to confirm format\nprint(submission.head())\n\n# Save without index, ensuring the file has only two columns: 'id' and 'Premium Amount'\nsubmission.to_csv('submission.csv', index=False)\n\n# -------------------------\n# Step 11: Save Model (Optional)\n# -------------------------\njoblib.dump(pipeline, 'trained_model_lgbm_time_features.joblib')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-19T09:50:17.408508Z","iopub.execute_input":"2024-12-19T09:50:17.4089Z","iopub.status.idle":"2024-12-19T09:51:03.73505Z","shell.execute_reply.started":"2024-12-19T09:50:17.408845Z","shell.execute_reply":"2024-12-19T09:51:03.734122Z"}},"outputs":[],"execution_count":null}]}