{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"colab":{"provenance":[],"gpuType":"T4"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline\nimport warnings\nwarnings.filterwarnings('ignore')\n","metadata":{"id":"k6dCrzaVUX7H"},"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')\nsample_submission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')","metadata":{"id":"YgvTl2dLVsog"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.info()","metadata":{"id":"yyoyEGK1WAib","outputId":"23e473cc-d283-4eee-b053-c875ebc2bc08"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.info()","metadata":{"id":"JLDnxbwdWQ2Q","outputId":"c727f904-b542-44ed-9256-a1c7f8123734"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.columns","metadata":{"id":"trEZ70V3YGqP","outputId":"7d616aa0-f764-4b96-d5fc-b79b0c949df1"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.drop('id',axis=1,inplace=True)","metadata":{"id":"saBxryTsYVhf"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import skew\nimport numpy as np\nimport pandas as pd\n\n# Select only numeric columns before calculating skewness\nnumeric_df = train_df.select_dtypes(include=np.number)\n\n# Calculate skewness for numeric columns only\ndata_skewness = skew(numeric_df, nan_policy='omit', axis=0) # Apply skew along each column (axis=0)\n\n# Print results for each column\nfor column, skewness in zip(numeric_df.columns, data_skewness):\n    print(f\"Skewness of {column}: {skewness}\")\n    if abs(skewness) < 0.5:\n        print(f\"{column}: The data is approximately normal.\")\n    elif skewness > 0:\n        print(f\"{column}: The data is positively skewed.\")\n    else:\n        print(f\"{column}: The data is negatively skewed.\")","metadata":{"id":"gWrPB1xycgsG","outputId":"4af4271a-6b7d-4b9a-83d2-8f9125e2348c"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Age'].fillna(train_df['Age'].mean(), inplace=True)\ntrain_df['Annual Income'].fillna(train_df['Annual Income'].median(), inplace=True)\ntrain_df['Number of Dependents'].fillna(train_df['Number of Dependents'].mean(), inplace=True)\ntrain_df['Credit Score'].fillna(train_df['Credit Score'].mean(), inplace=True)\ntrain_df['Health Score'].fillna(train_df['Health Score'].mean(), inplace=True)\ntrain_df['Previous Claims'].fillna(train_df['Previous Claims'].median(), inplace=True)\ntrain_df['Vehicle Age'].fillna(train_df['Vehicle Age'].mean(), inplace=True)\ntrain_df['Insurance Duration'].fillna(train_df['Insurance Duration'].mean(), inplace=True)\n","metadata":{"id":"wS1TBCiecPNz"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Marital Status'].fillna(train_df['Marital Status'].mode()[0], inplace=True)\ntrain_df['Occupation'].fillna(train_df['Occupation'].mode()[0], inplace=True)\ntrain_df['Customer Feedback'].fillna(train_df['Customer Feedback'].mode()[0], inplace=True)\n","metadata":{"id":"wOb-6Elgexh7"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Policy Start Date'] = pd.to_datetime(train_df['Policy Start Date']).dt.date","metadata":{"id":"Vgwym3a5h8aJ"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\ntrain_df['Gender'] = le.fit_transform(train_df['Gender'])\ntrain_df['Marital Status'] = le.fit_transform(train_df['Marital Status'])\ntrain_df['Occupation'] = le.fit_transform(train_df['Occupation'])\ntrain_df['Customer Feedback'] = le.fit_transform(train_df['Customer Feedback'])\ntrain_df['Education Level'] = le.fit_transform(train_df['Education Level'])\ntrain_df['Location'] = le.fit_transform(train_df['Location'])\ntrain_df['Policy Type'] = le.fit_transform(train_df['Policy Type'])\ntrain_df['Smoking Status'] = le.fit_transform(train_df['Smoking Status'])\ntrain_df['Property Type'] = le.fit_transform(train_df['Property Type'])\ntrain_df['Exercise Frequency'] = le.fit_transform(train_df['Exercise Frequency'])\n","metadata":{"id":"G7MbiA-8fyb8"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.drop('Policy Start Date',axis=1,inplace=True)","metadata":{"id":"9iCbZA2cgBqy"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df","metadata":{"id":"2-fQCJ3Xgyge","outputId":"3c43e6cd-41f0-4c37-f39d-184e62b7b499"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.options.display.float_format = '{:,.2f}'.format","metadata":{"id":"JXYlkDInJrE3"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.describe()","metadata":{"id":"YnKExsSDJN8B","outputId":"1634f58d-393a-4b3b-da93-1ef31f20af56"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df\n","metadata":{"id":"aTWPxdYSi-fy","outputId":"e39d507e-32a0-479d-8bb9-e7fdcbc15a5b"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.isnull().sum()","metadata":{"id":"ka0arJEg6xwg","outputId":"66e8946e-0c8a-4ed4-ad18-e12f3c160a71"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import skew\nimport numpy as np\nimport pandas as pd\n\n# Select only numeric columns before calculating skewness\nnumeric_df = test_df.select_dtypes(include=np.number)\n\n# Calculate skewness for numeric columns only\ndata_skewness = skew(numeric_df, nan_policy='omit', axis=0) # Apply skew along each column (axis=0)\n\n# Print results for each column\nfor column, skewness in zip(numeric_df.columns, data_skewness):\n    print(f\"Skewness of {column}: {skewness}\")\n    if abs(skewness) < 0.5:\n        print(f\"{column}: The data is approximately normal.\")\n    elif skewness > 0:\n        print(f\"{column}: The data is positively skewed.\")\n    else:\n        print(f\"{column}: The data is negatively skewed.\")","metadata":{"id":"0IVlDOMN62cg","outputId":"d5f22dc8-cdee-48cf-b678-1d2acc9d4ec9"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Age'].fillna(test_df['Age'].mean(), inplace=True)\ntest_df['Annual Income'].fillna(test_df['Annual Income'].median(), inplace=True)\ntest_df['Number of Dependents'].fillna(test_df['Number of Dependents'].mean(), inplace=True)\ntest_df['Credit Score'].fillna(test_df['Credit Score'].mean(), inplace=True)\ntest_df['Health Score'].fillna(test_df['Health Score'].mean(), inplace=True)\ntest_df['Previous Claims'].fillna(test_df['Previous Claims'].median(), inplace=True)\ntest_df['Vehicle Age'].fillna(test_df['Vehicle Age'].mean(), inplace=True)\ntest_df['Insurance Duration'].fillna(test_df['Insurance Duration'].mean(), inplace=True)\n","metadata":{"id":"qyZczcv77iL5"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Marital Status'].fillna(test_df['Marital Status'].mode()[0], inplace=True)\ntest_df['Occupation'].fillna(test_df['Occupation'].mode()[0], inplace=True)\ntest_df['Customer Feedback'].fillna(test_df['Customer Feedback'].mode()[0], inplace=True)\n","metadata":{"id":"Bcg-g10Z9BsE"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Policy Start Date'] = pd.to_datetime(test_df['Policy Start Date']).dt.date","metadata":{"id":"a6cKW0Mg9NDv"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\ntest_df['Gender'] = le.fit_transform(test_df['Gender'])\ntest_df['Marital Status'] = le.fit_transform(test_df['Marital Status'])\ntest_df['Occupation'] = le.fit_transform(test_df['Occupation'])\ntest_df['Customer Feedback'] = le.fit_transform(test_df['Customer Feedback'])\ntest_df['Education Level'] = le.fit_transform(test_df['Education Level'])\ntest_df['Location'] = le.fit_transform(test_df['Location'])\ntest_df['Policy Type'] = le.fit_transform(test_df['Policy Type'])\ntest_df['Smoking Status'] = le.fit_transform(test_df['Smoking Status'])\ntest_df['Property Type'] = le.fit_transform(test_df['Property Type'])\ntest_df['Exercise Frequency'] = le.fit_transform(test_df['Exercise Frequency'])\n","metadata":{"id":"IVUQnRo6BjJC"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.drop('Policy Start Date',axis=1,inplace=True)","metadata":{"id":"6SNEPyPBB5Fz"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df","metadata":{"id":"gtv3sf7HCFtg","outputId":"aedab00c-ba81-4c21-8170-8a75a3daac93"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom lightgbm import LGBMRegressor\nfrom sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\nimport lightgbm as lgb\nfrom sklearn.model_selection import GridSearchCV","metadata":{"id":"jtOsY5MOIMuU"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train_df.drop(columns=['Premium Amount'])\ny = train_df['Premium Amount']\n\ntest_X = test_df.drop(columns=['id'])\ntest_ids = test_df['id']","metadata":{"id":"rNciKU6DCILe"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_log = np.log1p(y)","metadata":{"id":"pyzDGGWDXin-"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install optuna","metadata":{"id":"_J04lUw723nX","outputId":"5884e50f-a30e-46aa-f21e-55d357161ed5"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import optuna\nfrom lightgbm import early_stopping\ndef objective(trial):\n    # Step 1: Hyperparameter search space for LightGBM\n    param = {\n        'objective': 'regression',\n        'metric': 'rmse',\n        'n_estimators': trial.suggest_int('n_estimators', 100, 1000, step=100),\n        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.2),\n        'max_depth': trial.suggest_int('max_depth', 3, 10),\n        'num_leaves': trial.suggest_int('num_leaves', 20, 100),\n        'subsample': trial.suggest_uniform('subsample', 0.7, 1.0),\n        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.7, 1.0),\n        'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 10, 100),\n        'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-5, 1.0),\n        'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-5, 1.0),\n    }\n\n    # Step 2: Create train/test split\n    X_train, X_val, y_train, y_val = train_test_split(X, y_log, test_size=0.2, random_state=42) # Use y_log here\n\n    # Step 3: Train the model\n    model = lgb.LGBMRegressor(**param)\n    model.fit(X_train, y_train, eval_set=[(X_val, y_val)], callbacks=[early_stopping(stopping_rounds=100)])\n\n    # Step 4: Predictions and RMSLE calculation\n    y_pred = model.predict(X_val)\n\n    # Transform predictions and actuals back to original scale before calculating RMSE\n    rmsle = np.sqrt(mean_squared_error(np.expm1(y_val), np.expm1(y_pred)))\n\n    return rmsle","metadata":{"id":"5pgQonmF4WBX"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# prompt: what next step after this\n\nstudy = optuna.create_study(direction='minimize')\nstudy.optimize(objective, n_trials=25) # You can adjust the number of trials\n\nprint('Number of finished trials:', len(study.trials))\nprint('Best trial:', study.best_trial.params)\nprint('Best value:', study.best_value)\n\nbest_params = study.best_trial.params\nbest_model = lgb.LGBMRegressor(**best_params)\nbest_model.fit(X, y_log) # Train on the entire dataset with best hyperparameters\n\ny_pred_test = best_model.predict(test_X)\n\nsubmission = pd.DataFrame({'id':test_ids, 'Premium Amount':np.expm1(y_pred_test)})\nsubmission.to_csv('submission.csv', index = False)","metadata":{"id":"4aXO7N_i2_zs","outputId":"19ce8d5c-6765-47e1-aa7a-198e0da03a29"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"id":"rZYo04Wd4dv6"},"outputs":[],"execution_count":null}]}