{"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":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install optuna-integration[lightgbm]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split, KFold, cross_val_score\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import mean_squared_log_error\n\nimport lightgbm as lgb\nimport optuna\nfrom optuna.integration import LightGBMTunerCV\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Load datasets\ndf_train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ndf_test = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\nsample_sub = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\n\n# Inspect datasets\nprint(\"Train Data Shape:\", df_train.shape)\nprint(\"Test Data Shape:\", df_test.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T22:06:28.880201Z","iopub.execute_input":"2024-12-16T22:06:28.881402Z","iopub.status.idle":"2024-12-16T22:06:36.846513Z","shell.execute_reply.started":"2024-12-16T22:06:28.881332Z","shell.execute_reply":"2024-12-16T22:06:36.845653Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save test IDs for submission\ntest_ids = df_test['id']\n\n# Drop 'id' columns from train and test datasets\ndf_train.drop(columns=['id'], inplace=True)\ndf_test.drop(columns=['id'], inplace=True)\n\n# Extract date features\ndef create_date_features(df):\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n    df['Year'] = df['Policy Start Date'].dt.year\n    df['Month'] = df['Policy Start Date'].dt.month\n    df['Day'] = df['Policy Start Date'].dt.day\n    df['Day_of_Week'] = df['Policy Start Date'].dt.dayofweek\n\n    # Cyclical features\n    df['Month_sin'] = np.sin(2 * np.pi * df['Month'] / 12)\n    df['Month_cos'] = np.cos(2 * np.pi * df['Month'] / 12)\n    df['Day_sin'] = np.sin(2 * np.pi * df['Day'] / 31)\n    df['Day_cos'] = np.cos(2 * np.pi * df['Day'] / 31)\n\n    df.drop(columns=['Policy Start Date'], inplace=True)\n    return df\n\ndf_train = create_date_features(df_train)\ndf_test = create_date_features(df_test)\n\n# Add custom features\ndef add_custom_features(df):\n    df['contract_length'] = pd.cut(\n        df['Insurance Duration'].fillna(99),\n        bins=[-float('inf'), 1, 3, float('inf')],\n        labels=[0, 1, 2]\n    ).astype(int)\n    return df\n\ndf_train = add_custom_features(df_train)\ndf_test = add_custom_features(df_test)\n\n# Separate numerical and categorical columns\nnumerical_cols = df_train.select_dtypes(include=['float64', 'int64']).columns.drop('Premium Amount')\ncategorical_cols = df_train.select_dtypes(include=['object']).columns\n\n# Impute missing values\nimputer_num = SimpleImputer(strategy='median')\nimputer_cat = SimpleImputer(strategy='most_frequent')\n\ndf_train[numerical_cols] = imputer_num.fit_transform(df_train[numerical_cols])\ndf_test[numerical_cols] = imputer_num.transform(df_test[numerical_cols])\n\ndf_train[categorical_cols] = imputer_cat.fit_transform(df_train[categorical_cols])\ndf_test[categorical_cols] = imputer_cat.transform(df_test[categorical_cols])\n\n# Frequency encode categorical features\ndef frequency_encoding(train, test, columns):\n    for col in columns:\n        freq_map = train[col].value_counts().to_dict()\n        train[col] = train[col].map(freq_map)\n        test[col] = test[col].map(freq_map)\n    return train, test\n\ndf_train, df_test = frequency_encoding(df_train, df_test, categorical_cols)\n\n# Log-transform features\ndf_train['Annual Income'] = np.log1p(df_train['Annual Income'])\ndf_test['Annual Income'] = np.log1p(df_test['Annual Income'])\n\n# Log-transform the target variable\ny = np.log1p(df_train['Premium Amount'])\nX = df_train.drop(columns=['Premium Amount'])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T22:07:11.474177Z","iopub.execute_input":"2024-12-16T22:07:11.475069Z","iopub.status.idle":"2024-12-16T22:07:20.972316Z","shell.execute_reply.started":"2024-12-16T22:07:11.475033Z","shell.execute_reply":"2024-12-16T22:07:20.971518Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define Optuna objective function\ndef objective(trial):\n    params = {\n        'boosting_type': 'gbdt',\n        'n_estimators': trial.suggest_int('n_estimators', 500, 2000),\n        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.2),\n        'max_depth': trial.suggest_int('max_depth', -1, 15),\n        'num_leaves': trial.suggest_int('num_leaves', 31, 300),\n        'min_child_samples': trial.suggest_int('min_child_samples', 5, 50),\n        'subsample': trial.suggest_uniform('subsample', 0.6, 1.0),\n        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.6, 1.0),\n        'reg_alpha': trial.suggest_loguniform('reg_alpha', 1e-3, 10),\n        'reg_lambda': trial.suggest_loguniform('reg_lambda', 1e-3, 10),\n        'device': 'gpu'  # Change to 'cpu' if GPU causes issues\n    }\n\n    model = lgb.LGBMRegressor(**params)\n    kf = KFold(n_splits=5, shuffle=True, random_state=42)\n    cv_scores = cross_val_score(model, X, y, cv=kf, scoring='neg_mean_squared_log_error')\n    rmsle = np.mean(np.sqrt(-cv_scores))\n    return rmsle\n\n# Run Optuna study\nstudy = optuna.create_study(direction='minimize')\nstudy.optimize(objective, n_trials=3)\n\n# Best parameters\nbest_params = study.best_params\nprint(\"Best Parameters:\", best_params)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T22:26:00.832256Z","iopub.execute_input":"2024-12-16T22:26:00.833164Z","iopub.status.idle":"2024-12-16T22:35:30.496809Z","shell.execute_reply.started":"2024-12-16T22:26:00.833124Z","shell.execute_reply":"2024-12-16T22:35:30.495665Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train final LightGBM model with best parameters\nfinal_model = lgb.LGBMRegressor(**best_params)\nfinal_model.fit(X, y)\n\n# Predict on test data\ntest_preds = np.expm1(final_model.predict(df_test))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T22:35:40.416251Z","iopub.execute_input":"2024-12-16T22:35:40.416628Z","iopub.status.idle":"2024-12-16T22:37:59.261754Z","shell.execute_reply.started":"2024-12-16T22:35:40.416595Z","shell.execute_reply":"2024-12-16T22:37:59.260894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare submission file\nsubmission = pd.DataFrame({'id': test_ids, 'Premium Amount': test_preds})\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"Submission file created successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T22:38:20.357816Z","iopub.execute_input":"2024-12-16T22:38:20.358162Z","iopub.status.idle":"2024-12-16T22:38:21.731062Z","shell.execute_reply.started":"2024-12-16T22:38:20.358129Z","shell.execute_reply":"2024-12-16T22:38:21.730176Z"}},"outputs":[],"execution_count":null}]}