{"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"},{"sourceId":10177955,"sourceType":"datasetVersion","datasetId":6286612},{"sourceId":10178097,"sourceType":"datasetVersion","datasetId":6286735}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from collections import Counter\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport optuna\nimport pandas as pd\nimport numpy as np\nimport pandas as pd\nimport numpy as np\nfrom time import time\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.metrics import log_loss\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.preprocessing import StandardScaler\nscaler = StandardScaler()\nfrom sklearn.model_selection import train_test_split,GridSearchCV,StratifiedKFold,RandomizedSearchCV,RepeatedStratifiedKFold\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import cross_val_score\nfrom xgboost import XGBClassifier,XGBRegressor\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn import preprocessing\n\nfrom statistics import mean\nfrom sklearn.svm import SVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import classification_report, confusion_matrix, roc_auc_score\nfrom sklearn.model_selection import GridSearchCV, KFold\nfrom sklearn.ensemble import ExtraTreesClassifier\nfrom sklearn.preprocessing import LabelEncoder\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom sklearn.metrics import cohen_kappa_score,make_scorer\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom sklearn.ensemble import StackingClassifier\nfrom lightgbm import LGBMClassifier\nfrom catboost import CatBoostClassifier\nfrom pandas.api.types import is_numeric_dtype\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:21.748117Z","iopub.execute_input":"2024-12-12T07:50:21.748528Z","iopub.status.idle":"2024-12-12T07:50:24.603841Z","shell.execute_reply.started":"2024-12-12T07:50:21.748496Z","shell.execute_reply":"2024-12-12T07:50:24.603089Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntrain = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\n\ntrain.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:24.60593Z","iopub.execute_input":"2024-12-12T07:50:24.60664Z","iopub.status.idle":"2024-12-12T07:50:33.668119Z","shell.execute_reply.started":"2024-12-12T07:50:24.606594Z","shell.execute_reply":"2024-12-12T07:50:33.666979Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:33.66932Z","iopub.execute_input":"2024-12-12T07:50:33.669619Z","iopub.status.idle":"2024-12-12T07:50:34.277505Z","shell.execute_reply.started":"2024-12-12T07:50:33.66959Z","shell.execute_reply":"2024-12-12T07:50:34.276569Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:34.279451Z","iopub.execute_input":"2024-12-12T07:50:34.279757Z","iopub.status.idle":"2024-12-12T07:50:34.673086Z","shell.execute_reply.started":"2024-12-12T07:50:34.279726Z","shell.execute_reply":"2024-12-12T07:50:34.671948Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:34.674409Z","iopub.execute_input":"2024-12-12T07:50:34.674786Z","iopub.status.idle":"2024-12-12T07:50:35.26064Z","shell.execute_reply.started":"2024-12-12T07:50:34.674739Z","shell.execute_reply":"2024-12-12T07:50:35.259589Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:35.261751Z","iopub.execute_input":"2024-12-12T07:50:35.262045Z","iopub.status.idle":"2024-12-12T07:50:35.652855Z","shell.execute_reply.started":"2024-12-12T07:50:35.262016Z","shell.execute_reply":"2024-12-12T07:50:35.651955Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train.Age.value_counts()\n# train.Gender.value_counts()\ntrain['Annual Income'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:35.653858Z","iopub.execute_input":"2024-12-12T07:50:35.654145Z","iopub.status.idle":"2024-12-12T07:50:35.703581Z","shell.execute_reply.started":"2024-12-12T07:50:35.654106Z","shell.execute_reply":"2024-12-12T07:50:35.702554Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Annual Income'].hist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:35.704751Z","iopub.execute_input":"2024-12-12T07:50:35.705039Z","iopub.status.idle":"2024-12-12T07:50:36.027225Z","shell.execute_reply.started":"2024-12-12T07:50:35.705012Z","shell.execute_reply":"2024-12-12T07:50:36.025746Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Marital Status'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.028745Z","iopub.execute_input":"2024-12-12T07:50:36.029448Z","iopub.status.idle":"2024-12-12T07:50:36.1226Z","shell.execute_reply.started":"2024-12-12T07:50:36.029403Z","shell.execute_reply":"2024-12-12T07:50:36.121512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Number of Dependents'].value_counts(dropna=False)\n# train['Number of Dependents'].isnull().sum()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.126019Z","iopub.execute_input":"2024-12-12T07:50:36.126427Z","iopub.status.idle":"2024-12-12T07:50:36.150883Z","shell.execute_reply.started":"2024-12-12T07:50:36.126395Z","shell.execute_reply":"2024-12-12T07:50:36.149721Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Education Level'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.152194Z","iopub.execute_input":"2024-12-12T07:50:36.152574Z","iopub.status.idle":"2024-12-12T07:50:36.209726Z","shell.execute_reply.started":"2024-12-12T07:50:36.152534Z","shell.execute_reply":"2024-12-12T07:50:36.208746Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Occupation'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.210767Z","iopub.execute_input":"2024-12-12T07:50:36.211Z","iopub.status.idle":"2024-12-12T07:50:36.260821Z","shell.execute_reply.started":"2024-12-12T07:50:36.210977Z","shell.execute_reply":"2024-12-12T07:50:36.259878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Health Score'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.261929Z","iopub.execute_input":"2024-12-12T07:50:36.262249Z","iopub.status.idle":"2024-12-12T07:50:36.395998Z","shell.execute_reply.started":"2024-12-12T07:50:36.26222Z","shell.execute_reply":"2024-12-12T07:50:36.394698Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Health Score'].hist(bins = 30)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.397622Z","iopub.execute_input":"2024-12-12T07:50:36.397906Z","iopub.status.idle":"2024-12-12T07:50:36.68482Z","shell.execute_reply.started":"2024-12-12T07:50:36.397877Z","shell.execute_reply":"2024-12-12T07:50:36.683795Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Location'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.686208Z","iopub.execute_input":"2024-12-12T07:50:36.686493Z","iopub.status.idle":"2024-12-12T07:50:36.742514Z","shell.execute_reply.started":"2024-12-12T07:50:36.686465Z","shell.execute_reply":"2024-12-12T07:50:36.741539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Policy Type'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.743829Z","iopub.execute_input":"2024-12-12T07:50:36.744543Z","iopub.status.idle":"2024-12-12T07:50:36.803943Z","shell.execute_reply.started":"2024-12-12T07:50:36.744496Z","shell.execute_reply":"2024-12-12T07:50:36.803106Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Previous Claims'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.805204Z","iopub.execute_input":"2024-12-12T07:50:36.80555Z","iopub.status.idle":"2024-12-12T07:50:36.831737Z","shell.execute_reply.started":"2024-12-12T07:50:36.805519Z","shell.execute_reply":"2024-12-12T07:50:36.830868Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Vehicle Age'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.832793Z","iopub.execute_input":"2024-12-12T07:50:36.833062Z","iopub.status.idle":"2024-12-12T07:50:36.857028Z","shell.execute_reply.started":"2024-12-12T07:50:36.833036Z","shell.execute_reply":"2024-12-12T07:50:36.856214Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Credit Score'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.858006Z","iopub.execute_input":"2024-12-12T07:50:36.858276Z","iopub.status.idle":"2024-12-12T07:50:36.885516Z","shell.execute_reply.started":"2024-12-12T07:50:36.85825Z","shell.execute_reply":"2024-12-12T07:50:36.884629Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Insurance Duration'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.886695Z","iopub.execute_input":"2024-12-12T07:50:36.887039Z","iopub.status.idle":"2024-12-12T07:50:36.907645Z","shell.execute_reply.started":"2024-12-12T07:50:36.886997Z","shell.execute_reply":"2024-12-12T07:50:36.906719Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Policy Start Date'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:36.90882Z","iopub.execute_input":"2024-12-12T07:50:36.909757Z","iopub.status.idle":"2024-12-12T07:50:37.266103Z","shell.execute_reply.started":"2024-12-12T07:50:36.90973Z","shell.execute_reply":"2024-12-12T07:50:37.265107Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Customer Feedback'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.267369Z","iopub.execute_input":"2024-12-12T07:50:37.267734Z","iopub.status.idle":"2024-12-12T07:50:37.318131Z","shell.execute_reply.started":"2024-12-12T07:50:37.267703Z","shell.execute_reply":"2024-12-12T07:50:37.317196Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.31926Z","iopub.execute_input":"2024-12-12T07:50:37.319541Z","iopub.status.idle":"2024-12-12T07:50:37.329113Z","shell.execute_reply.started":"2024-12-12T07:50:37.319515Z","shell.execute_reply":"2024-12-12T07:50:37.328113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Smoking Status'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.330365Z","iopub.execute_input":"2024-12-12T07:50:37.330668Z","iopub.status.idle":"2024-12-12T07:50:37.382431Z","shell.execute_reply.started":"2024-12-12T07:50:37.33064Z","shell.execute_reply":"2024-12-12T07:50:37.381566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Exercise Frequency'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.383623Z","iopub.execute_input":"2024-12-12T07:50:37.383995Z","iopub.status.idle":"2024-12-12T07:50:37.443076Z","shell.execute_reply.started":"2024-12-12T07:50:37.383956Z","shell.execute_reply":"2024-12-12T07:50:37.442216Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Property Type'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.444128Z","iopub.execute_input":"2024-12-12T07:50:37.444482Z","iopub.status.idle":"2024-12-12T07:50:37.501991Z","shell.execute_reply.started":"2024-12-12T07:50:37.444452Z","shell.execute_reply":"2024-12-12T07:50:37.501199Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Premium Amount'].value_counts(dropna=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.503105Z","iopub.execute_input":"2024-12-12T07:50:37.50343Z","iopub.status.idle":"2024-12-12T07:50:37.534199Z","shell.execute_reply.started":"2024-12-12T07:50:37.503403Z","shell.execute_reply":"2024-12-12T07:50:37.5332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Premium Amount'].hist(bins = 10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.538681Z","iopub.execute_input":"2024-12-12T07:50:37.538977Z","iopub.status.idle":"2024-12-12T07:50:37.743457Z","shell.execute_reply.started":"2024-12-12T07:50:37.538949Z","shell.execute_reply":"2024-12-12T07:50:37.742633Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:37.744763Z","iopub.execute_input":"2024-12-12T07:50:37.745237Z","iopub.status.idle":"2024-12-12T07:50:38.326624Z","shell.execute_reply.started":"2024-12-12T07:50:37.74519Z","shell.execute_reply":"2024-12-12T07:50:38.32564Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def impute_categorical_columns(df, columns=None, impute_value='Unknown', print_missing=True):\n    # Create a copy of the dataframe to avoid modifying the original\n    df_imputed = df.copy()\n    \n    # If no columns specified, detect categorical columns\n    if columns is None:\n        columns = df_imputed.select_dtypes(include=['object', 'category']).columns\n    \n    # Print missing values before imputation\n    if print_missing:\n        print(\"Missing Values BEFORE Imputation:\")\n        for col in columns:\n            missing_count = df_imputed[col].isna().sum()\n            missing_percent = (missing_count / len(df_imputed)) * 100\n            print(f\"{col}: {missing_count} ({missing_percent:.2f}%)\")\n    \n    # Impute missing values\n    for column in columns:\n        df_imputed[column].fillna(impute_value, inplace=True)\n    \n    # Print missing values after imputation\n    if print_missing:\n        print(\"\\nMissing Values AFTER Imputation:\")\n        for col in columns:\n            missing_count = df_imputed[col].isna().sum()\n            print(f\"{col}: {missing_count}\")\n    \n    return df_imputed","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:38.327722Z","iopub.execute_input":"2024-12-12T07:50:38.327997Z","iopub.status.idle":"2024-12-12T07:50:38.334414Z","shell.execute_reply.started":"2024-12-12T07:50:38.32797Z","shell.execute_reply":"2024-12-12T07:50:38.333467Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputed_df = impute_categorical_columns(\n    train, \n    columns=['Marital Status','Number of Dependents','Occupation','Previous Claims','Insurance Duration','Customer Feedback'], \n    impute_value='unknown'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:38.335535Z","iopub.execute_input":"2024-12-12T07:50:38.335838Z","iopub.status.idle":"2024-12-12T07:50:39.319038Z","shell.execute_reply.started":"2024-12-12T07:50:38.335809Z","shell.execute_reply":"2024-12-12T07:50:39.318056Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputed_testdf = impute_categorical_columns(\n    test, \n    columns=['Marital Status','Number of Dependents','Occupation','Previous Claims','Insurance Duration','Customer Feedback'], \n    impute_value='unknown'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:39.320002Z","iopub.execute_input":"2024-12-12T07:50:39.320326Z","iopub.status.idle":"2024-12-12T07:50:39.987578Z","shell.execute_reply.started":"2024-12-12T07:50:39.320274Z","shell.execute_reply":"2024-12-12T07:50:39.986578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputed_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:39.98881Z","iopub.execute_input":"2024-12-12T07:50:39.989925Z","iopub.status.idle":"2024-12-12T07:50:40.766101Z","shell.execute_reply.started":"2024-12-12T07:50:39.989893Z","shell.execute_reply":"2024-12-12T07:50:40.765016Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import pandas as pd\n# import numpy as np\n# from sklearn.impute import KNNImputer\n# from sklearn.preprocessing import StandardScaler\n\n# def knn_imputer(df, columns=None, n_neighbors=5, weights='uniform'):\n#     # Create a copy of the dataframe\n#     df_imputed = df.copy()\n    \n#     # Select columns if not specified\n#     if columns is None:\n#         columns = df_imputed.select_dtypes(include=['int64', 'float64']).columns\n    \n#     # Print missing values before imputation\n#     print(\"Missing Values BEFORE Imputation:\")\n#     for col in columns:\n#         missing_count = df_imputed[col].isna().sum()\n#         missing_percent = (missing_count / len(df_imputed)) * 100\n#         print(f\"{col}: {missing_count} ({missing_percent:.2f}%)\")\n    \n#     # Prepare the data for imputation\n#     # Select only the columns to be imputed\n#     data_to_impute = df_imputed[columns].copy()\n    \n#     # Scale the data\n#     scaler = StandardScaler()\n#     scaled_data = scaler.fit_transform(data_to_impute)\n    \n#     # Perform KNN imputation\n#     imputer = KNNImputer(n_neighbors=n_neighbors, weights=weights)\n#     imputed_scaled_data = imputer.fit_transform(scaled_data)\n    \n#     # Inverse transform to get back to original scale\n#     imputed_data = scaler.inverse_transform(imputed_scaled_data)\n    \n#     # Replace imputed values in the dataframe\n#     df_imputed[columns] = imputed_data\n    \n#     # Print missing values after imputation\n#     print(\"\\nMissing Values AFTER Imputation:\")\n#     for col in columns:\n#         missing_count = df_imputed[col].isna().sum()\n#         print(f\"{col}: {missing_count}\")\n    \n#     return df_imputed\n\nimport pandas as pd\nimport numpy as np\nfrom sklearn.impute import SimpleImputer\n\ndef median_imputer(df, columns=None):\n    # Create a copy of the dataframe\n    df_imputed = df.copy()\n    \n    # Select columns if not specified\n    if columns is None:\n        columns = df_imputed.select_dtypes(include=['int64', 'float64']).columns\n    \n    # Print missing values before imputation\n    print(\"Missing Values BEFORE Imputation:\")\n    for col in columns:\n        missing_count = df_imputed[col].isna().sum()\n        missing_percent = (missing_count / len(df_imputed)) * 100\n        print(f\"{col}: {missing_count} ({missing_percent:.2f}%)\")\n    \n    # Perform median imputation\n    imputer = SimpleImputer(strategy='median')\n    \n    # Impute the selected columns\n    df_imputed[columns] = imputer.fit_transform(df_imputed[columns])\n    \n    # Print missing values after imputation\n    print(\"\\nMissing Values AFTER Imputation:\")\n    for col in columns:\n        missing_count = df_imputed[col].isna().sum()\n        print(f\"{col}: {missing_count}\")\n    \n    return df_imputed\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:40.767683Z","iopub.execute_input":"2024-12-12T07:50:40.767991Z","iopub.status.idle":"2024-12-12T07:50:40.781245Z","shell.execute_reply.started":"2024-12-12T07:50:40.767959Z","shell.execute_reply":"2024-12-12T07:50:40.780308Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# final_df = median_imputer(\n#     train, \n#     columns=['Age', 'Annual Income','Health Score','Vehicle Age','Credit Score'],\n#     n_neighbors=5,\n#     weights='distance'\n# )\n\nfinal_df = median_imputer(imputed_df, columns=['Age', 'Annual Income','Health Score','Vehicle Age','Credit Score'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:40.782302Z","iopub.execute_input":"2024-12-12T07:50:40.782596Z","iopub.status.idle":"2024-12-12T07:50:42.707813Z","shell.execute_reply.started":"2024-12-12T07:50:40.782562Z","shell.execute_reply":"2024-12-12T07:50:42.70693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_testdf = median_imputer(imputed_testdf, columns=['Age', 'Annual Income','Health Score','Vehicle Age','Credit Score'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:42.70935Z","iopub.execute_input":"2024-12-12T07:50:42.709713Z","iopub.status.idle":"2024-12-12T07:50:43.927607Z","shell.execute_reply.started":"2024-12-12T07:50:42.709671Z","shell.execute_reply":"2024-12-12T07:50:43.926578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:43.928528Z","iopub.execute_input":"2024-12-12T07:50:43.928807Z","iopub.status.idle":"2024-12-12T07:50:43.95093Z","shell.execute_reply.started":"2024-12-12T07:50:43.928783Z","shell.execute_reply":"2024-12-12T07:50:43.949915Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:43.952188Z","iopub.execute_input":"2024-12-12T07:50:43.95251Z","iopub.status.idle":"2024-12-12T07:50:44.67457Z","shell.execute_reply.started":"2024-12-12T07:50:43.952482Z","shell.execute_reply":"2024-12-12T07:50:44.67359Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_testdf.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:50:44.675683Z","iopub.execute_input":"2024-12-12T07:50:44.67601Z","iopub.status.idle":"2024-12-12T07:50:45.156698Z","shell.execute_reply.started":"2024-12-12T07:50:44.675979Z","shell.execute_reply":"2024-12-12T07:50:45.155663Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_df['Policy Start Date'] = pd.to_datetime(final_df['Policy Start Date'])\nfinal_testdf['Policy Start Date'] = pd.to_datetime(final_testdf['Policy Start Date'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:53:22.648415Z","iopub.execute_input":"2024-12-12T07:53:22.648805Z","iopub.status.idle":"2024-12-12T07:53:22.919645Z","shell.execute_reply.started":"2024-12-12T07:53:22.648771Z","shell.execute_reply":"2024-12-12T07:53:22.91866Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# final_df.to_csv(\"train_df.csv\", index = False)\n# final_testdf.to_csv('test_df.csv', index = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T07:54:34.214193Z","iopub.execute_input":"2024-12-12T07:54:34.214571Z","iopub.status.idle":"2024-12-12T07:54:57.332714Z","shell.execute_reply.started":"2024-12-12T07:54:34.21454Z","shell.execute_reply":"2024-12-12T07:54:57.331967Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"traindf = pd.read_csv('/kaggle/input/cleaned-data/train_df.csv')\ntestdf = pd.read_csv('/kaggle/input/cleaned-data/test_df.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T08:02:57.694488Z","iopub.execute_input":"2024-12-12T08:02:57.694965Z","iopub.status.idle":"2024-12-12T08:03:06.833796Z","shell.execute_reply.started":"2024-12-12T08:02:57.694928Z","shell.execute_reply":"2024-12-12T08:03:06.832732Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"traindf.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T08:03:20.761171Z","iopub.execute_input":"2024-12-12T08:03:20.76219Z","iopub.status.idle":"2024-12-12T08:03:21.539882Z","shell.execute_reply.started":"2024-12-12T08:03:20.762117Z","shell.execute_reply":"2024-12-12T08:03:21.538981Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn import model_selection\ndef create_folds(data):\n    # we create a new column called kfold and fill it with -1 \n    data[\"kfold\"] = -1\n    \n    # calculate the number of bins by Sturge's rule \n    num_bins = int(np.floor(1 + np.log2(len(data))))\n    \n    # bin targets\n    data.loc[:, \"bins\"] = pd.cut(data[\"Premium Amount\"], bins=num_bins, labels=False)\n    \n    # initiate the kfold class from model_selection module\n    kf = model_selection.StratifiedKFold(n_splits=folds, shuffle=True, random_state=42)\n    \n    # fill the new kfold column\n    # note that, instead of targets, we use bins!\n    \n    for f, (t_, v_) in enumerate(kf.split(X=data, y=data.bins.values)):\n        data.loc[v_, 'kfold'] = f\n\n    # drop the bins column\n    data = data.drop(\"bins\", axis=1) \n    # return dataframe with folds \n    data.to_csv(\"train_folds.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T08:10:41.886576Z","iopub.execute_input":"2024-12-12T08:10:41.887011Z","iopub.status.idle":"2024-12-12T08:10:41.894286Z","shell.execute_reply.started":"2024-12-12T08:10:41.886972Z","shell.execute_reply":"2024-12-12T08:10:41.893215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# folds = 5\n# create_folds(traindf)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T08:11:37.5049Z","iopub.execute_input":"2024-12-12T08:11:37.505963Z","iopub.status.idle":"2024-12-12T08:11:51.441778Z","shell.execute_reply.started":"2024-12-12T08:11:37.505918Z","shell.execute_reply":"2024-12-12T08:11:51.440897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\ndef rmsle(predicted, actual):\n    \"\"\"\n    Compute Root Mean Squared Logarithmic Error between predicted and actual values.\n    \n    Args:\n    predicted: numpy array of predicted values\n    actual: numpy array of actual values\n    \n    Returns:\n    rmsle: float value of RMSLE between predicted and actual values\n    \"\"\"\n    # Ensure inputs are numpy arrays\n    predicted = np.array(predicted)\n    actual = np.array(actual)\n    \n    # Check for non-negative values\n    if np.any(predicted < 0) or np.any(actual < 0):\n        # Clip negative values to 0\n        predicted = np.maximum(predicted, 0)\n        actual = np.maximum(actual, 0)\n    \n    # Compute log-transformed values\n    log_predicted = np.log(predicted + 1)\n    log_actual = np.log(actual + 1)\n    \n    # Calculate the squared differences\n    log_diff = log_predicted - log_actual\n    rmsle = np.sqrt(np.mean(np.square(log_diff)))\n    return rmsle\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:18:03.312337Z","iopub.execute_input":"2024-12-12T09:18:03.312696Z","iopub.status.idle":"2024-12-12T09:18:03.318573Z","shell.execute_reply.started":"2024-12-12T09:18:03.312664Z","shell.execute_reply":"2024-12-12T09:18:03.317664Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"![image.png](attachment:97b81a8f-3f2d-4b51-9a03-506497aa6b8f.png)","metadata":{},"attachments":{"97b81a8f-3f2d-4b51-9a03-506497aa6b8f.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAh8AAADnCAYAAAC+AzSMAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAvdEVYdENyZWF0aW9uIFRpbWUAVGh1IDEyIERlYyAyMDI0IDAyOjE0OjM5IFBNICswNTQ1QuJtpwAAIABJREFUeJzs3XdYFNcaBvB3lqIoSwcRQQWxYRcb2LChYm9orLFEjVFj1MTEaNRo7ObGGDUmscXee8XeO2KlilKlCghL253v/gFKcRcWhAXM93uevUV2Z8/snJl558yZcwQiIjDGGGOMaYikpAvAGGOMsf8WDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH4wxxhjTKA4fjDHGGNMoDh+MMcYY0ygOH6yQUvF845fo38UJzmN3wjfoHFZOHYsxI3uhdat+WHo9DlTSRWSMMVYqCUTE5whWYBS9D1N/1sKcsd7o22kd3rb7Cn/+PQttTNNw9su6GBG1EM/2DYepUNIlZYwxVtpwywcrlBSvp5C6doJegA+CJLUxbum3aGMqASDH28QUQEsLWiVdSMYYY6UShw9WKHqd5mNxTz143biLtDrd0K2GdsYfUu/jxj05ajdrAim3ejDGGFOCwwcrPIU/bt6OgnmLVrDLbOZI8zwNj+ia6N7Nnls+GGOMKcXh41MiD8WlbYfxLFkzX0fRd3DDVxfNnRtDFwCQhvtHTiC8Th/0qROHQ7MW4KKGysIYY6zs4PBR1lE6El/74Nq+FfiiQ2v0m74VdxM104c45cFNPKQmaN2yYsY/KEJw985rWLVzgc2zTThIbdFcTyNFYYwxVoZol3QBWOGl3/geTXuuR5BgAFsHSyQ8joVCR1PfLiImLAoVW/dBZ8vMDKtlA9ehXbBr0zyMjuyGmSs7QF9TxWGMMVZm8KO2ZVlyBALD0yG1tIRJ7Cb0ajwTV4VOWPPsIEaZc29PxhhjpRO3fJRlepVga5fxP8XYki0KY4wxpi7u88EYY4wxjeLwwRhjjDGN4vDBGGOMMY3i8MEYY4wxjeLw8ckh8PNLjDHG8iXG4OYfE9CrfSs0qGGH+p3H4bfLr6HQwFfz0y4sUyrOTmmAkXvjIYoiRBIhioR3T2ITEUAEKuJwo20/FadvLkKLckW3TMYYY/lRwO+vqVgj/xY7LzWGNMUP28b3wlT3gXh73ANzi3mESA4fnxxC4bKBLhx7dYPFjq14Kc9cgsQQbWdvw/KeFlA+akhGOHn/EglEIhQKBeTydKQlJyE+Ngqvw17hpb8vnjy8h/uPXyEuPauE8he78c+579Cih0GhSs0YY6wQFN44sO00zqdWxYMvGqN9xZoYtmAStp6ci7/WnMSUrQNgVIzDRXH4+BQVKn0IMO3yC/6cdAd91jxDKgEQ43F9wwY8/Gw7htkUzTRx8vgA3DyxF1v/2ohDnpFIF6Nw7J8DCO0+GlX4JiBjjGmIHgwNdZDmE4n4dAIgQGJdGzX1gQd+3ghSAEbFmBD4cP8JKvRdEUEK5x83YKZjhfctHWLUKXz/5Qb4pBdN2bQNa6Dt0B/wz8WHuPb3BDQ3lUB2dRN2+GjiLiNjjDEAgJYdvjzkDb+Hf6J3ZhMHxYUjXAboVLKCRTFPS87h4xP0UX0y9Bph+p8L0N7oXdUQEX/1Z0xY6YkinaBW0Edd9xU4cXYt+lf2xrZNNwq+/GQfHPv7OPyKKBgVPQUib2zD9psxhQ+ErMhQ/D3s2nQRofKSLknZkBZ8Hhv3e0FW0gVhOahXjxUIPP0X9j96m/exp5wRzKTvJgQTEXzkIG7JLdF7bG9UKuYZOjh8lGWUjmRZEhITYhD83B/RIgAxCv7PghD7NglJshQU5jirU2sc1i51g8W72kEyeP46AT9fTSjyk2j5mkOxbvtMWJzYiFOxBVi6zAu/DxmCv1Kqw0Zjk+kVhAJhx6ehz/Q7MK1hoqLPDNMkwcAOlZ7PQd+J+/Gq1AbW0iHNfxvG9l2I4Cq24ImpSxf16rEWqtgJ2DVqIJbeVu+4TZFHseDX+6g5+W8s72la/McsUiHl1HiyMZCSVJr1MjBxosVe6ao+8p4YvZ9GVTfM8Vmp1IRcfvUlebb3yQJO0LIvulET20pkalaZajTuRMPn/Ev3Y+SUcHU2dZx4lJIzSkMnxlmRgVSaa5mql51tTfL5rIqXUV2acSUt33UtSfKA1dTRJI91MOtF/4SJhVu4GEHHxjuQ0fs6YEDG9SfRyahCLi9PMrq7chjNOBpFai1dEUaHxtajWsP3UKgis7hRHrRk7DAa1MeNOrdtSS3H76Po4iiqmmSey6hj9db08z1ZyRXiP0gRfZt27blLb1Rt+9QntKpTNXL68RrFl2D9yEHxkg78OJo+G9CbunVsQy2dv6NzqSVXHDHuIn3Xwpbc1vpQ6T4CfqpEevvoIG2/HE4KVW9Rqx6LFHVsPDnYD6KtgcrPjlnL86YN/RqQy+zzFKHyS4uWyvAhJoWTv483Pbu7lcY4WJBVZTMykBpR4x9vU977hYJCN/WnJvXqkJFUSlITF5p/4TF5+/hSUGzWJ2UPf6Me1cyo7qDldOJxGMXHR9NLz5O0bnJ7qtmoG7nWNyHzEQco49AtUmK4P/l4P6M7mz+nukZSkkqNqdW3J8jL24d8ci0715pQUkQgBfj70N1NI6m2UWZY+fkSPfP1I3//AAoICKCAAH/yeXybPHYspmGOlcjAwIKG7ntb8F/0EyLGXaSZjqbZgpsh1Ry+h4I1VDmVU1DYnuFUo0of+icoqyBi7C3asng2jW1fnQylUjLrs4kiSurkIrtPPztbUKNvr1JSCRXhv0RMl1GU/206/PtU6lLTlEzariDvPI61KZ4LydmiAU07H69e2C1uihC6sH4hzRrWkiobSMnAcjQdTSmhsohxdO7r+mTRbhk95uShUYrkWHr14BT9NasP1bcwpnqzbuQZ/tSqx2IE7RtuS1Xc1pOfqn1CjKbzMztTj0XXKVYkIjGK7p1/QDHFvHOoDB/vyb1phYsDjZ48iKwNpGRU9xu6mNfFnOIlre3RnubMH0LmUilJzUfSodw7UqonLXQyJePmc+nOB8tKIs9lncjSQJotfGQrztNl1MZESlKpGfX/N7pAB4+sz5rT4F3xqlchdBd9Vt2MOq0OUJ08/yOS7i6kNhYGWa0phlWp9wY/yr/9q7gKdIlm1DelBt9e/aBuEBGlXvia7A1LMnwo6OWGnlS5cm/6p2RTWimXRI+PHiavxI9Zhpyer2hHpgYGZFTZgdq1qkVGUmm+4YPEKNo3ohqZO/9CD0vTCVa2j4aZl2z4SPNaTK3N7Wj0odjSEcxKvSKox2IEbelrTgYGhmRR04mcHSzIQGqUb/hQtx6nPVxETqa2NHJfpJJtmkLPN4ykQYuuZ7UWJh2jL0dtLvbjp5p9PrRh6jYYriYSKMKOYs/lJJXvVPjtx6HU3hjooPoZnbTb27HzuQJVOnZH4w9uKFZA46mLMNou/662gqTwXVby+qzEqi/G97NAZKhmRnorzSo0+xYbfnSG9P3jL29wad5ErH6UUgKlIbw+8Ad2hdXEkOGtlN6LFrS1oV2SHSzS7uHv9Teg3WUk+vOzw6opwuDx+284/epj9jAt2I7+F7ef+CH41ROcntkCanX/EczgNrIXjJ9vxjqPhI/4/iIm0Ya2UJKV9y3OrduEZ2Z9MLKrMfdTUkdR1GPBFH3W3MAjn1cI8rmERa6G6v32atZjnQZDMcwxESfXboNfjmISYs7NxsjlARCC/sX3X07ExPHjMHroQtw1rV6sY3wABehwKhh0wpAeFpCI0Ti5+wzilPZgkePpgaMo138AaqhcMiEuwB9RCkJ6WpryjjDlHdGvR7V8CycU245aHo6tmyIpLBxpxfQNZUc5OExah0VdTN9vD0q6i2VfLsGtRA0XRQzBkV2XkWzfAz1UhVtBKNGDZsr1Xdj/shza9exU7Dtv2VbYwfByKmdaDTVsLKCvU7Afu0LrXuhkHI0Tu86qOJaVBAkkJVhn6M0Z7DweDTPXXnDiXqZqKop6rAUja3tUszREuQJuf7XqsaQauvdoCPLai31Psj2CIH+A32dthnfkI5zatRM7d+7Ezt17ceBCAIztqhf7IGAFuDSriLbuvVFFS0Tc2d04EaVkTdMeYO8JU/TvYwPV7RYC9PT1IRFEvD6xGUfDRCXv0UGdJg1RIc8TiQChCE808gfz4dT9D7zMLI6efW1UjgxFhLLi/ddo22LUmpXoZ/VuqxJSnvyBL+eexxsNHrgp6hxO3UuHRes2qKtqzyjR8JGOB6c9EKHVBO2cDfjKMU8lPAdR+RZo30IXiVdO41qpeZZUQElWGtm1U7icqIdWbZuBZztQV1moxxJUbdMG1eGHMx4BWa352o5YcD8WCQkJuV7ROPtV9WJ/FLZAyy/fyh39qmuBki5jz5FQ5D4vp9zcC4+qA9Grct6LrdiyHZqXFyCGH8JXPYZj8a6LePI6OUeClPbdgEd/9kL5PJZTlC0faWEhiMy2Qto1B2PhdBe+es0kqdwfq34fgerv7mlQOgK2TMaMw68/qAfFJeX+TXimaaNOQwf1mtc/kIrgi2vxzYC2aFCzBuzt68Cx6xj8cuAZ3io7gKS8xJlfJ6FXi1qoZm0Du/rtMPTHjTi48xeM/8wdnetXQ/PJRxD+7gdQvMTtO+GAZX3Ut1CxD4gRuLJiGJxqWcO6TidM2x+IHE/LicHYOdIB1s1+wu1P+nFQ+ojR8IqAoA+HBnaQvPXEXe+yMfCHzO84VnzZG04O9qhhXxMOLXtj0v/OIFDZADkFrbtIx5Obd/FWyx4N61VQUYI0BJ34Cf0c7WBlUx89fzqL1zl2fjmere0J+2qu+N37v3LDumzUY+1aDeFQTg6fuw+QUEpa+goWbnSbYtCA2tCmFNzccxCBOepXEi7vvYy6A7vDLJ8TtsRmGH6c4IDyAiE54DiWTuiD1rWrws6xG0bOXI4dN0KQoqUHfb28G36KJnzIIQu5jrUbPHJulAo10aFrQ5hw+MgkwKTLL1j/Zd2spkFFKA7OmIrtH3XfXl0KBD3zRqJgBvsahbgfTbG4urAn2gzdAYX7Olx5HgB/33vY+3VVXJnRGV2+PoKQ7PuuPABbRnTGkKVeqD3/HLyDg/DkyBToH5uJ0TPuoMXS1RhRKwV+Zy7g/T6f5oOnfnJo29WErdKqm4KHK0bgB99e2Hr3OCYaemLLrJW4lK37jBhyHP+eDIVMooPyn3jdK9ljoDZsa9pCRxGMZ975DMRU4hQIPTEdndt/hbNmE7D9ji8C/J/j+sbh0D0wGi495uFidLY1KEzdpTg8fxYOUccO9tWUtVsTEi7NxbCVyfjisBd2DEjFtT9+wPqH2Zvxn+LA1huITJJAp+InXnmzKRP1uLwd7G20kObzFP6lJGsXsGVFG/UHDkB9HSDVcy/2ZUu3FO+BPbebYpCrOieGinD6aR+2fNUCZplX0kSpiPG7gcN/LcKXbi3Q8etDCMrnRyp8+EjFyQk2MDY2hrGhKSwdumPh5TeFrERyeC50gqWFOczNC/GyqIHP98eW8oNfJkGK1nNyDb8efRazJ/0J72LvHKNAWHAYFBILVFbVqqCSiFdbx2PEKk9U++ZvrBrcAMbaACT6qOH2EzbOa4FX/07EqNWP3/fxkZ1fhUUekdBqMQrfdKsKPUFAhRr98NXg2tBKuooNW17Dff0FnDu5AO11M78lOgShKYCuRWUYK6maYugeLNpfC/NWDUYt4QX8QhWglGQkv9/4hPibV+CVLsCgSTPU4pmXipWuhSWMBQXCQ8I11npXGGmP/4eR4zYhsPlP2LygB2roSwBow7i+O1b+/Q2qPVqN0RO24t01QGHqLhRhCA5TQGJuiUrK6p3CB38vvI6OKxbCrUoC/P3jQJQMmSzryCWGXsPVF3JoVXGEo6VmO1sn+1/E3n//xtr//QmPoNK8NYueWvVYYg5LCwnEiFCEla3wkXVfS6vWQLg76kJIf4Z9ex9mNhkTok/uwaPW7ugoVfObta3htvgsvO4ewV+/TMPwbs1Q3VAn46QmJuLJlokYsdILqQVdI7Xoot1PHrh+/TquXbuEM/v+h1GNKhbydqs2msy9ideRUYiKKsQrMgBbBpahETD1GmH6hgVwyTb8esK1hZi46mHRDr/+ATliYhJAghQG0gL+WslXsHr5ecRq1YFbjzq5btlIYNW5GxprJ+H+7ytxLJYAKBDu7YM3IiCRGsJAkvVeIyNDSCDHyyfPkGJRD81qGr3ficTYaLwRBUgN9ZXsWITYi6cQ1nUEOhgAceeP4lIiYNjRDW3e31tMxYNrd5EMXTRq1STPW44lRnYTC9vVQKsFd1Ga7wqpE+YlUgPoS0TEvYkvveGDYnF0xRrcT9JB815uH0y+qF3TFV3sJIi9sByrryajsHUXYixi3ogQpIbQV7J7KV6chofOQAxvUh5i2EkcvZsGiaUr3Bzf7U2E+FvX8DhdgL5jS9TT6KjDhNTYIDz1+Ac/L1wDj2A1WmLLQj1WszOJWvVYYgBDfQlIHoe4xNJxqavmtVW2TjWSaujr7oSFty/hxYHduP2DI9rohuHoHn90nNmmgEPxSiCt4YIhU1wwZAoAMQkht/di8YzZ2PEkCV7rfsXxCVswQNllZD4U/psw8Tc9zPv9M1h/cCYQoF+lDhwc9DP+b4MmaJByHSfW5Vzn6GubcVjsiTHtLHgc+mx0an6BtSuuosOEoxkdckkGz1+/xBKXc/jZqWLxfCmlIS2VQIIuyhWwS3j6Yw+cD1cA2uaoXOnDLSkxMYWxBBDjL8PjTioGdCsPq3oOMJPcRUxUJKJFQCoBABHx8QkQoQ1bh7rInYEoLRWpJEBXt5ySMCnAbPhu3AAAisbpvR6IgwkGuXfNurUnf45rt2IhatVBq+ZmmctIwYlJExC9YAtGmZd8RKXUN4jTske75nl1Ks+Qcn4qGrlvy9GXKseyRBFobYYlSv8qgeWofXjwW8dCDO+t5sFVtxzKgRCfkqLGJ1Jwa+UoLLxQ8Fs0gkFnzNs6HS0K04sz9TY8LsdBFPRhUVnJRYrEGGYmEkARjgvnniDdpXmh6i4oDSmpBEG3nNInLrRqTsPp0xnLCTy8D7dSJLDp4w7n9xsnFQ+u3UMydNHGyVHDQ7ILMGoxCj/NjcHl0xvV+kRZqMdq1zO16rEOypUTIFAqUlIzZrAtaeqFD8reqUaCKr3d0W7uZZwJOYLdVxfAqcZB7IvojkUt1du7UrxP4lh8CwxsaZbzJ5BUhLXTaKzZA7x2/gbnEm7imlc6BrjoqlqUSvKAu7gS2wGGaqaG8nYN0LCyNNsPkgbPXStw1rkfxhb424uPgYFBoT+bkFBUYxpIYO3+G9ZcfYSh215CToBQ3gAGesVYoQVtaGsLABRQFLDZUIx8jSgRUPkoo5Z2RmuImITIyEQQykOv43f4qftJfOWxA2vP9sPCrpZIfboLv+30gaTGcCya3OSDnefdGCOpiryvvCjGA4cuJUIwGoS+HbKaCsWwW7gZKIfErDla1cxcetoT3HmYBLuCrXKxEYzdsOqim1rvLd/pd/jE/K78jwofrHSdCHHNOXznUMTTZ6rbB1ChgByAlpY6B4lyaDhkDha0Vyeo5CRUsEK9Qj4+Qm8jECHLnO5c6e6lDe2Myouo15EQgULVXQja0NERAIU877GNxJc4fuQB0iTWcOuT7akYuTeu346BqFUTrVpUKpmLNS0taKl5CCob9VjNmqZWPSbIFQSCFj5ieKwipXbLh5jthxDM3TC4swHOHonEid2nMazmfiT1+gON1WpqI7y5tgELnlZAn5YuUBYrtGwGYnjHH3H+cALiEvJoEFW5cRR44fUUWpUGq/3ImHaDb3B4S/ZFvMDDp+VRY7h+KciIWYouQHwkwQxdF/8PIy4OxJZIO4z6extmNFbVS74o6KBCBW0IlIrkAiZ3iZEJjCRAIqUgOVnJZzN3XgjlYWKaefuN0vAm3gr9p7VFxMreaDIxBmkVrNHI9Rcc+v4LtFXSCiFUqAg9gRCbnPcJSnbDAzdkQMXO3dBWP+vf3965jkfpAso7OqOxLkDJIbi4YjY2+lfEL2qvrSoEeXIqoFe+2J/fL3nqHbQpNRkpJEFFfWW3yXITUMG6AZpZf2zZCkbQN4GJrgCkpSMlRdmxUAF5OgBIYGJmkrEehai7EPRQQU8ApaQgNY+fjyIv4ZxXOgSLTujaNOvoLYbfws0XckhMmqNV7RKqYSU6QFvRUzfkqlWPKRkpKQRIKkC/YulIHwXu8wEAEEzQdXBXmEpExJ5YiMk7tdFvoIO6zSgQRQWi79/L9bRMduVgaKAHQWKOSuaq06TK4V3kvjh+3AfGFmb5NqmpIgZfgIdvVdgrf2wh+5fhwYIWMDcxzujAWtCXSTUM31sWp1yXI/j0NnhEmMJ12W6s6GZRzCFNgkqVMwa5i4zOO5ASkOPqV6dRe7Q2lgCKUASFfVjpFK9DEa4AhIqt4NIso6cFxV7F+ee1MeDbxdh27gG8X77Ci2fXcei3L9HWUnmdkFhURiUJ4W1UNFSP/6pAqP8LyEgbdZs3RVa7Rxoe3rgHGemgvnMLGArJOPfzcPy45xkS025jWc82aN3aBd+flUF8uRWfOzVEHdtq6Prdr/jh825oUsMJkw+9xM15zVHJ2BAGJk5Y/FgOyO9jUZsqMDU0hEW7ZXj8vtVIjtALKzCmZ1f0GdQXXbqMwPJLEarvGaf6Ydf0IejT0Qmucy+gIBMQlwR1iifGRCFWlMDcsrTcVs2stNkLX6452rWsAIHkCAkK/bBVQvEaoa8VgMQUrV0aQgeFq7uQVIKVhQRiTMatGlXkL/3wIp2g06gFmmS7cky6cwOP0gWUa+qMpuXScHluWzSqa4cqVt3xw/qf8OWYMRjauTHqu4zD2lsZxzvV9TgEIgBKfIztMweia/f+GNCjE/pM34ln78eyIMTd+wuTurdFhwFjMGXqN/hlvzeS8tvwZakeq9nyoVY9FmMQFSNCYlAJlUrJAHJq7HMEEEHM9TtIOw5Bj0oSkOwFgq0GYIB9wU7z8sf/YNkRFb1z5f649zAOsHBBp4aqm1Mod6EAAMnw3jgb6x6JMKtkrnIFifLYw8RInFyyDvf17WCX77O22mg67w6iYt/gzZtCvGJfYbu7BqYvLlKEuGsLMOzrszCfug0bR9dU2oJVtLRhY1sN2orXCAnLo4uY+C6SZqsbUld8PakpKohBOHf6Sa5OzAq8OnUCT+S6qPn5NPSrlPn0VVoa0mSPcMtL/W60gn41VDOXQBEWjPA82q5JFAEI0NbJqtsUdxWHzkdA1LJGq5bWkEAPXZZcgse8ttDVaYlZx6/h+vVLWOpaAZLqI/H3iaXoWC4B9456o9Wi6XAWfHDhejCaLbgL3797Z93T13bEnGt+2DHUPFsdIyRcnoN+I47Bdv4BHN53CHu+qYgtn0/CthDlV9f+GxfjVoffsfmLqvDafgD3S20vPah50BYRExKGZEGKGvalJXyI74+zWXe5K2PQjM9RU0eOp6fPIihXvUp9fBIeQSIqNP0Skztm9LcqTN2FVmVUr1Ye9DYUofF5NX0QCAIEbZ2saQzEcJw6fB1JpI16zi1gKOii3fyzODCpFlJlvvChAVi+cRN2elzEmmYPMX/QSKz3kedRjwOhULzA5lF9sTBiEDYeP4gDh9fB5dEMDF90E8kA0p7+jiH9VyN17C6cPbAJa35fjP7lgxCS5z2jslaP1XmTmvVYEYaQcAW0bWupGAZA81Tvc8kxCPLzwoWNq7D72WucWbcGJx/44lVkUkZgqNAG7r2qQEvQg/PgvrCRAEAa4sODEfTKF3ceB2WkdDEET+/541VQMF6/zXazXhGGA1/2wrg/byA8+9mA4nH3fzOx9okUHWdNR8b+REh6HQA/X2943nmOGBEAFIjwuY/H3r7w9fWF91Mv3D63C0vHdIbrrAuIIV2YWWSMkZ+W9AaxMVF45fsKcSIAiHgTGojXMTGIyfaKCvXH/TObMW9IF4zdHQzBtibsSsmGKk1Sff7B2FF/Iq7XOuz80QkGGklOAswaNYKNVjJ8nr388AqQ0pGc+AYhQRFIJkCMDUZg5FvIUhUAdFF/2hasHWqLwLXjMOmvGwhKlEOREgmv/T9gzNIHMOu+FP/ObY133WUllVrC2S4Aa/o6wqldO7Rv3x4uHTrB1a0PPhs/C6v23kNE7gOXdj041teFPOAZfFQ+pqUFu86uqKUrx9PzHghOI8hensEvw8djS6ACEsMWcG6Q3/1LAToG1qhiJIGec090sXbFr/d8cHNJW+gA0DM1RYUc20QHhoZ6WeFDDMKOpZvwosEQjGqqDwECTDoNREetqzhwOuLDY54YjCuBDTGmmy4unb4JSZMWyLeImiJPgSwpCW9jQ/HUL2PAOzEuEM9eRCEhKQmy5HQVx3A5fJ/5Qq7TEE3rF390zpuItORExAQGI1pBgCIKQYExSExOgwigYuuf8O9yN5je/wUjv90Fz/BkKBQyhN7ZjKkT1+Gl7RD8sflrvFuNQtVdlEfDpnWhI/fBEx/Vnap0GnRFFysJ0j09cD5CDkX8c+z/bgimH4uCqFUFrZyqQQuAoKWHypYmkOjUQ49+DTOr2l8XAAAgAElEQVTCsGAMl+++Rvv0G1i97gpS8qjH8surseyiANfP+8JaC4BOTfTv1xAhhw7gXnoCTq36H+5auGNyX+vMp9f0UKddC1jllSJLcT1WpMqQlPQWca994RucDIAgC3kOn9fxSEySITlN1cWyevVYjPSBd7QAi8aNP3hiqsSomnEu5dR4sjGQZs1mmvnKPlto2r351MJ+OO2NyvyHdC9a1NL4g89kvEzI5VdfkpOCQjb0IOt2v9CF63/ThDbVyaJ6U+oyYCSN+2I0DWhjT2YW9Wnw6ttZs+xRCp0YZ5Vtanc1XkaNac7d9MJ9NnP6eNuvPKikZrYurRSvT9DkJuZUrdcf9Div2Y2Lg+wcTalpRBYDtlFkrhkX5QGrqaOJkm04+RylvnuTGE9PDyymcd0dyc7ChEwsqlHDTiNo7rb7FJ17FlR5JJ2f0ZxMlOwDUqmUpAZGZNtrDXnl+A0U9HKtK5kaNaLZt/OajzKZ/PZ/T30cbcnS0oZqtxpA34xpTxYGBmTRb2uOdXu7ZwiZm/WlLblXON2LFrU0o4azb30w82XqpelU27QV/fLo3dzDaXRjVj0ybTafHqQTkewIjbY0IOM6LuQ+ZAgNGTKEhgzpS52dWtDgDb6kcubtqF00pIoVue9QNjtmAcm9aUVHF1r2NK/pZ/Mj0psdg8gsj/3YpPUSeqLsK+TPaFkbEzJpv4p8P6YIRSHtDs1pbPRB2Y3fbS8iIpJT1P1t9NPITtSwmgWZmFQiO8fuNG7xAXqakHtnKEzdJUr3XEDNjE3I5X9+KusAkUhvH26mKd0akE0lS6pWty0Nnz6cmhtLybDaF3QiKeudsv3DydysF/0Tlq186Q9pUUtjMmm/inzkpKIey+npsjZkYmhNzXoOzqyfQ8i9Rztq1vo78ki4Qz82MiKz3hspPPuiPRdQc1MH+vZa3lMVl756nEKnJ1bN4xxlRHVnXFE+w62a9fjtkTFkY1Sdvjj+UdNIFymV4aM4JT48Qid9M08JYhIF3z9Nuzb8TiuXLqX//XOE7oUml0SxWH4S79GSTlXIotUsuhBTEhNuy8hjci0ysh5FB+Jyfb8ihWSyVEpXKEgkIlFUkDwtmZJkhZgzXXxDHt80JvOq3Wnx5WB6myrPOEiJCkpNiqaX9w7TkoF1ydjAkvptDiNF9mK8+INczU3IafFjSle6cAUlJyRmBaLM9To3uSYZGphR13UvcywvI3z0pk0RIlHKMzp1NiDjxJB50G4y9+4H35N2ZQbVNW1Jix5mhY/r3zlkhY/kYzTGyoAsRhwk9fOjSOFb+pGl9TDaWxTbvkgO2oWneLWOupqZUoc8T7Sakk7JsmRKkytIzKi8pJCnkSwpueBl+4i6S+kPaH4zYzLvsYGCFcoXL5clUFKOCidS9O7PyMrAgKoM3UvZq4by8OFJC5obk4nLrxknS6X1WE7eK9qSibETLX6kZC9Ku07f1TMis96bckz7rl74+C/WYxmdn1qLjGtMpFNvNVi4fJRIA0zFRr3RvWZmE5FQAdZNu2LI+CmYMWsWpo3tDUerUjm80n9beiB2TBiGlaEd8dvuRehQIuPO66H92OGoJfPA3pPROZvTJeWgp6cLbYkEAgBBkEBLpzwq6BWiXTX5IrbtCoRh7xn4pp019HW1Mm5ZCBLoVjBFNcc+mLVuFtrrJuPh/WfI3kgtqe6OsV0qwufAfjz6oGn7La7/7AJ7G1t0Wv7k/eco4gg2HokETN0wbmDVHPdCBYkEGZ20AaQ+wsFjvjm+T1D23JxEAgFitv5UCryNTwK964yr64i2LStAHuiPl9nuX9GbB7h4P3O0XUUSoiITs25viaE4uu86ynUZBFf9+1g+ayeUzgmpLi0bdJ/xLXpUL+LHE9WiQMCBfbhfriPGDqlR6E7pRUcb5fXKQ0dLkvHAhiBAoqUDvQrlC162j6i70G6EkaNbQLi9D4de5t64hMgTX6NFdRvUHLgJ77sGKV5g96bzSJTYwH2cW77TUVDUA9x/RbBq0RJVs61cznqsBdvWrVEFofAPzN51Ox0vLl7CC9RF86b6ECPClPStyvVwBNdjIPES9p6Ihu1nY9BBX9WbNK+03P1hpRnF4MLszzD9clXM2rEen1UruY4wOo0mYlbvCri4fgueF9cwwdrmsDARkPDCD+EqviPl1QuEK7RRpapVzp1eMEffWV/CIXgH1p3KNWR/2gMc2PEICaSAQpF5xBMjcPynhTj11gI9f1mEfrkeg9S1soY5hSMkTA75y5dAVZvMp8oUkCsAhVz+QZ8GiZkFTCWpSE7J7Hob44GDV95CTIpHfDoASWUMnjMVDQM3Y8XBoIwh5ekNrqz6DdcUFSAgHfd+boe6dVriu4uZjxeke+GOp4A2bi5IObEL4Y4d8HEjaFdAPTc3qJzDrDjJrmHD5ieo8cV3GGBZtrp65+tj6i4ksB35A0ZYPcTGDTdzjVicjGt7dsM/mSB/X+fSEbjtB6y6rYDtiJWY7aJkgMH0xzh53D+jk7ciHCcWrsYNo56YO6VV5jAIyuuxbsspmNe3Is6sXo07mR1gU/3/xZK9YSinZYwe0yahXvBR7LuXlPEBSoTXyYsIkicjLv5dhyuux4CIVzvX4aiiK76d5Fi6Zisu6aYXVtrJyGt1D6pq3pSmnor4+HukSiXSxe/a0tB/czUDq6AI3klDa9rR4O3Bar2/4ESKujCHXGwsqF6/BbT75kuKT8/499Robzr/93TqbGdKdm4r6M5bZb9IIt2a35qqtPqJbme/ryH3oV9dzMm66zK6lyCSIu4J7Z7qTJbmDvTZhkfKb4HIg+nw9A5Uv7kbfTZuMZ2PEkkesJGGO9qThaEBGVSypyZOQ2lD9hu+YhRdWNSfOvYcTdO/n0Nzft5AG2Y0J2MDAzKp3J6WeqUTkUhxD7fQjL5tycmlJ/UfPJrm7PejjBuecvJe35vsrazIecGDjOZwMYrOfOdCrVzdafS8kxRaPD+8BqTSk1WdyLrZLLqcu6/EJ+Fj665I0aenUENrV1r9PPvtizS6NbshmdgPon+8k4nSI+nuhs+pkbklNZuwl16kfrgk2f7hZG7Snqb9+hNNmTiWhri2oXbuP9Fh/4yanm89Tg2iM0s/p85Orcm1zyAa+tXvdD36XZnl9PrqbzSudz8aPf1HmjdnLi3/5XNqYCQlA+NK1GLebUrjekxi1DEaX9eW+m18UQpuL+bE4YPlQU7B+0aTg2kNGrjRl5QcX4pE8sOl5GI3iLZFqHsyECn6wnfkXM+dtrxQ3rOiKKS9vks7F02gPm3qk62VBVlYVKIqNRpR+wGTacmeBxSV11enetM/Ax3IefZVyt49RfZ0G01xrU/VrKtRTYcW5DZ+Me17FFdMoS5LerKMUgt4oJX7raGpK5+UuoPWx0i6v5g61u1Bv+XubfmJ+ai6S4l0b5kr1e26KkenVPHNHVo7uh3VtbEm21r1ybnvVPr1hB8lqViKbN+wD/t8FKf0ZJKlfVjJ/7P1WBFCB0Y3pKZfHafwUhiyOHwwFUR6c2UOtalUmdotuEHxxXT8SPbZRqPqm5LNiH0UW6DvkFPoqZnU2W0pPSyuVPSxkrzoz8EuNP5QcbUYFScFBW+cSD9e/nQ6f4txZ2maS29afutNGdweGibG0rXFPanTd5eosH0U3+79jMzNetHfmgofSv1X67GcvNf2IZcv91FgIfrcawKHjzIpibz+Gk3O9lXIpl53+v5YMMnFJPI9/At93tmR6tpVocq2zajP9wfIv5DPCic/+5P62JpR/XEHKaQ4LhkUcfRo53RyqWpIBoa2NO5YQjF8CSssRdhhmjp6LfkUX8MS+2Sl0bXFPciptgUZGJhRjeauNOt4bIkEPq7HpZdApO7sNay0SLk3H67faWHl/u446eqK36LaY9ygVNyLcsO8hWPgUlXA4yXd0HHpczRZdAOnp9gXqNe8GH4MX3Ubg1PV5uP4nq9QvwiH402Nfo7rJ/bh37834+jjGMgJkFT+HAce/o5OpWTYXwbIg+/CU2iC5tY8yh4rOHlaKgQdXWgJAkiRhnTSga625jv3cj0uvXiLlDkyXN50BLaTLqK5wUuclgDim0s4EfM3PDYNzBgNEEAdx3rQFx7iyUNvyFGA8JF0D8uGT8SuqHoYP7M6gi+fRog6nyMCgTIe5xRFKOTpSJUl4M2bWMREhCEk+CX8nj3CI98IyBTZ864WbPoMRhsOHqWKtk1zNC/pQrAyS1s367kKQUtXA9MvqCgH1+NSi8NHWZP+EBc966H7z4ZA1H3cD1RAYtEfv6wY8D54AISEiAjISAIzYyP1n6eWv8LuL0dg+b23EOkB/vzqM/xZPGuRRbsGBgxpUboeAWOMMVasOHyUNTrOWHrTGQCQdPQ6HqQBFVv3Qhez7E2aMty5+gBp0EOTlvXV3MgKeG+YggWXk6AvNcgckCpjwJ73d+ZI5TzCAAAhc0rrjP8WMme4Ft4PnJTxf4XMQcAy3qtdZyjcG5WSCRYYY4xpBIePMisdnldvIRG6cG7dAjmG90m+iZOX3oD0OqFbO0M1Z8zVQp2vjuL5V8VSWMYYY+w9HuG0rFL44catCCi0asC5lWWODSm7dhhnIgkV2vZDV4tPbARHxhhjZR6HjzKKom7juo8cEnMnONfO3oD1Fhf3nkQUGaDzYDeYC+m4v6At+v4Vgo+ZwoAxxhgrKhw+yqjku9fgmQpUbNkGjtl7a6bewsnzsSD9DujTxQSIP49NR4zh1s2KNzZjjLFSgc9HZVI6nt6+j7coh2btnSHN8Tdt6GgDWpa2qC55gQOzFuBJnx8xvCpvasYYY6UDn5HKJBFJ6QRp1d4Y0b1Szg6l5dph+srxaJW6FX0a9MU2y/nY8WNLlMSki6qQyOPaMcbYfxmPcMryJruJhd2G40Sn3bg6rzk+5qFYURaCOwd+w7wdRlh2fA4a87NWjDH2n8SHf5YnSn2DOC17tGtuU6Ah2nNQ+GDD8NH4N9oKBtGXcFd7Sp7jhTDGGPu0ccsH06BUnPzCDsMfjsf5m/PQhKMvY4z9J3GfD8YYY4xpFIcPplyqH3ZNH4I+HZ3gOvcCYrl9jDHGWBHh8MGUUMB/42Lc6vA7Nn9RFV7bD+B+ekmXiTHG2KeC77qzD4nBuBLYEGO+0MWlcTchabIQDXQAQETYoR/w9TZfyPNtCREgbf89/prWAuVz/ymfCeoYY4x92jh8sA9JqmPMim9A0bux9LwC7Za7oZIAABJY9VuGff0+cvmcPBhj7D+Nb7swFQgRJ/biktABA7uZqTkzrvrL5vzBGGP/XdzywZQTQ3F033WU6/IXXPXvY/ksXwxfMgQ4UjS3XRhjjP13cfhgyqV74Y6ngDarXZBy4meEO86EpUQCyUfediHK+A8eYZ0xxv67eJAxphxF4+z3gzDvoQXqOn2ORT91h1Vhb9JRJA5OH4E/7kfj1XN/RKWVh2XtOrC2cMXPh35Em48Zs50xxliZw+GDMcYYYxrFHU4ZY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplEcPhhjjDGmURw+GGOMMaZRHD4YY4wxplHaJV0AxhjLy/bt2zFp0qSSLkapkpCQUNJFYOyjCEREJV0IxhhTpUmTJvjnn3/g6OhY0kVhjBURvu3CGCu1tm7diho1anDwYOwTwy0fjLFSq27duti5cyeaNGlS0kVhjBUhbvlgjJVKhw8fRp06dTh4MPYJ4vDBGCuV1q9fj2nTppV0MRhjxYDDBytxyQdGwMLAAAbZXoaGhjA0MoKRsQlMzSxgaVMbLXqMwdyNVxCcrHw5qacnoKphruWYOmPJI3m+ZaCYA/jc1ijHZw0MTNHhf35QvH9XOsIur8XXfVqilpU5zCxtUb+dO2b+dQ3h6Sl4/GtvDN/yGgQA6bfwQwPjXMvL9jJuhNm301WUJhUnv6gCQ1WfVblMB8y8qmqZZcvt27eRlJSE9u3bZ/5LOu7MaQzjXOts7DADl1TUh+ySL89APeN8toEYg3ubZ2FwWwdYW5ihUlUHOPeZjP+dCUSy/CW2Du2HVc8zaoPC91e4mKreFobW43EqVUVh8qsbqpZZ+XMcVmNdGSsTiLESJia+psAAf/K5+zcNszckqdSALAf8SY8CAijA34eeed2hi0c305IJLmRrZEAWDYfS2ntxJOZeTlI4+ft407O7W2mMgwVZVTYjA6kRNf7xNqXmWQIFhW7qT03q1SEjqZSkJi40/8Jj8vbxpaDYd59MI/9/h1IdMzvqPncf3Q9+QwmxwfT4/Caa5VaX6nbuRs0szKjHhhBSEBGRjCIDfcnnuScdnNaMjKVSkhrVoy923KfnPj7k4xtIkTKVvwglRQRSgL8P3d00kmobSUkqNSGXny/RM18/8vcPoICAAAoI8Cefx7fJY8diGuZYiQwMLGjovrcfsylKjQEDBtDRo0dz/FtyVCD5+jynh0emUwvTylSlsiFJDe1owsn81jmejoxrQg51LclQKiVjx2l08OHznNtAEUbHvmpCFtZt6eutNygwJp7ehHnT1V0LaVDDmtTerQ1VMWlFvzxKz3h/aiwF+frQ80fnaX4HMzKQSsmw+iBad+sZ+fj4kK9/OCXmrqBZa0LRQS/I3/chHZzqmFE3jJvSN0eekK+fP/kHvNu+vvT03gXa9+sEamNtSFLTbrQ+SPERvypjpQeHD1Z6pD+g+c2MSSo1JLsp55UEBhndndeKTAykZFitH218IVe+HLk3rXBxoNGTB5G1gZSM6n5DF1We6IlI8ZLW9mhPc+YPIXOplKTmI+lQSq5FBqyn7pZGVHfSaYrLfVJJ9aN/+lcnQ6lptvDxjkivN/Yms8xQ86uvijKrIH+6jNqYSEkqNafBu+JVr0LoLvqsuhl1Wh1AZf305OXlRa1bt1b5dzFyC/W1HkRTJ9QhI6kh2YzcT7EqT/REYvQeGt5qCs2fUJMMpVIy7fkXheb4kUSK2DuCbI1syH172Ae/nzz0II2ta0QGxtnCx3spdGR0JTKQSsmo4Q90K60ga5qtbph2pjWBqracSG/OTqZ6po1pzt3c389Y2cS3XVipJJEISv5VD43790QtLUCMvYhf199CmsolaMPUbTBcTSRQhB3FnstJKt+p8NuPQ6m9MdBB1Zh7Cnjv3YbbsopwdmsHw9xF07XH54unoLFufmslQFC2WmoSJKp3V4lVX4zvZ4HI0NfZbhOVTStWrMDs2bPzfpNEH20H94aNloh4j904EaXqoT1CxPF9eNFxEJz0VLxFDMORf08jRtsRbl0tP7gXrWXVBz/P6oCK+W07QYLCb14JlFb5jAXDqMMXGFozFmGv87+FyFhZwOGDlUqqTtISA0NIJQCgQISPN2LzeFBcMOiEIT0sIBGjcXL3GcQpfa8cTw8cRbn+A1BD5d4gxwvfF5BDRHqq8lO7ln1v9G2Y34DBHxc+8lYejq2bIiksPI9AVvr5+fnh5cuXcHNzy/e95VoMRv8a2qCkK9hzOBSisjeJwThy4DW6DWoGHVULUryC/4t0EKUjNVVZJZGgco/+aF0+n40nCB8RPvKhXQfOraSICItWvp6MlTEcPliZQkmJkBEASGBiawejPI/2FdHWvTeqaImIO6vi6jjtAfaeMEX/PjbQUrkcAfpSfQgkw/ktO+CvrE+nVlU0bmwGSV7pQhBUtOgUjvzBfDh1/wMvM89Geva1UTkyFBGl8OwUFxeHqKiofN+3cuVK/PDDD+otVLsRBg6oC21Kwc09BxCoJBcqAg7gwNteGNBA9daFUBH6+gKQfgfbt3pBWZ9OwagRmthp5RkuBKEow6WIl390h9P8B8ho69CGfe3qiAp5zeGDfRI4fLAyRI5Xly/DTw5IjNrim0ltUT6fT5Rv5Y5+1bVASZex58iHV8cpN/fCo+pA9Kqc166gg8btnGEoEZFw+Uf0GvgjNp/xREhi9rOdLtovuYXdo6zy2KmK9so4LSwEkdlWSLvmYCyc7pJPINO8V69ewdXVFXPnzs3zfQEBAbh165ZarR4ZtFB30CA01gXSPPdi7/Pc6UOO5/sPQ9JvAGrnkT2gXQttW1tCi1LgtWIAen3zJ47dCURc9pCp3QAzT5/C9Pp5tG4VacuHAuEh4dluoUlg6fYD5vSqwgdt9kngesxKPzEVCSFeOLnqc/SbfxNk0x0/79+GCbXUmBdRtykGDaideXV8MNfVcRIu772MugO7wyzPs4YA417fYXpLKQRKQ+jFNfh6UHvUq1YdDTsNwdRFm3DhhQwop48Kefb7KKorYzlkIdexdoMHErI35lSoiQ5dG8KkFIWPkydPokOHDvD29sbOnTsREhKi8r3Lly9Xv9Ujk5Zdf7i3KAdB/hz79z1Ejkap9IfYe9wI/fvb5tGqBQB6aDdtNlzNJSBFNO5s/A7DOjeGbdW6aNt/In5afwLP4kToVtRHubybPoomfIjJiHy4FWuPhOTov6NdtTV6Na/MB232SeB6zEohQuS2z2BnbQ1raytYWlqhar22GLLwEky+2IE7d/dgagsjNQ/02qg/cADq6wCpnnuxzzvrcE7xHthzuykGuRrnvyzdepiyYzd+6FgFuplvpvR4vLx7EluWT0M/JyeM3vJcaZN9lo8JH6k4OcEGxsbGMDY0haVDdyy8/AaFmxtBDs+FTrC0MIe5eSFeFjXw+f7YfL87KCgIf/75J27fvo3GjRsDANatW6f0vQEBAbh79y6GDBlSsFWRWKOPe2voCXK82L8Lt1Ky/pRyaw/OWPVH7yr5H+YkVYfhn/3L0LeGXmZdICiSQuF1bid+mzUUbVsOwG/3EvJe548JH+m3MLuxKYyNjWFkbAn7dtNxNJRvsLBPF4cPVgoJsBixCy9CQhASEobXkWF4emQuOpon4cHGBVh1JgRqDBuGd7MWadUaCHdHXQjpz7Bv77urY0L0yT141NodHaXqlUpi1hbfH3oAzzObsfzb0ejlVBOm5TJOOJQciEMzhuKnS28LGQjyo4t2P3ng+vXruHbtEs7s+x9GNapYyJOdNprMvYnXkVGIiirEKzIAWwaa5PvdVatWxdGjR2Fubo5vv/0WQMZEcTKZ7IP3Ll++HJMnT1Z/FQiZv7MElj0Ho4O+AEXoUey+8m7ZSbiy5wJqDuqJSmr9SAKkTSbg31teuLTzV8we3x/t6llCTyIAIKSHn8f8YdNwOKKYpsLSboip+6/i+vVruHrFA4f/nAyn0tSExVgR4/DByoByqOIyE5tX9od5ijf+nfwVtrzK76owK3xAUg193Z1QXpDjxYHduJ0CQAzD0T3+6DioDVQ9gamUoAebVgMwce5q7DhzHy+CfHBp4yS0NJaA0l/g35W7EFKoC1ZC5MHpGLX+qYpgJUC/Sh04ODigXoMmcOo6FktmdodUyLmM6Gub8M+VyFLXKbFXr16wtLTE27dvsX379hx/Cw4OxoULFzB06FD1F0ji+5AnmHaDu6sRJGIkTuz2QDxltGrtvt4Ig7rmH5JyKGeJJj3H4fuVW3D8pi+CA25i5w8dUVlLgBh+GMs3PlYj+CqTjIvzBmLJDRUj0AoVYGnvAAeHemjQqAU6Dp2PuYOq5LpdJIPnrj9w+lVZf5iaMQ4frMwQYNSuI5roAJRwDbsOB+Y9ngW9vzQGIEGV3u5oV0GAIuQIdl+VQfHyIPZFdId7y3JqfLcCry7sxCUlqULQs0STQUuw649BsNIipNy7ijsfXtirQY5XntcQRVK1d8rydg3QsLIUWT1f0uC5awXOBusU3yOfH2HKlCkAgN9++w1yedYpfMWKFRg/fjzKl8+v+3A2RFmbVzBCF/fuMJOIeHNmN07FKBB9cg88nQej8weDsighRuDGnjPwU5ILdE0d0POH7dg0oSa0IYff9Vt4XZhkpwjDo5thSNNTd8too3r9prAyzPaAsPw5Dv92FD481Af7BHD4YGWGUEEKqZYAQA7fJz7IexYTgkhZTeSCuRsGdzaAIEbixO7TuLN3P5J6DUJjlYM/ZCeH57+zselOioq/CzDrOhxulSQgRQLiE1UPeKWy0Z5i8OTRa5hWMlN7p9Ru8A0ObxkF63cfULzAw6flUcNOv1SGj7Fjx8LIyAghISHYtWsXgIxWj+PHj2P8+PEFXFq2li0A+i6D0auyFijxAnYdfoBDe3zRcVA7VFRnUQofHPzlD1xU+YyyPloOG4A62gAlvMnZyTdHkfLYvslP4fXCBJXN1d26EliP2oLD3zR4Hy4p5hG8YqrBvkre3WcZKws4fLBSiZSeB7ShpQUABNkLP4Tm3fSR4+QEwQRdB3eFqURE7EG6jXgAAAZVSURBVImFmLxTG/0GOkCN52UyliWm4OGdh1A1VxgkhjCSSiCUN0elPK62ScXZSQw7hSP3KqKSuVppSPkygi/Aw7cq7G3zWys5HixoAXMT44wOrAV9mVTD8L0xBe7bUqFCBYwdOxYAsHbtWgDA4sWLMWnSJBgaGhZwabm2r54z3PvYQItScH3NRKwP6YpBzmreUCOCmP4MdzxVj4IrMTSEgUSAlpklzFQdNVUnS8RfPIrLSWawMC3sIZcQe+ksPCvbw7bwVYSxUoPDByuVSNlZWiiH8pmjTCoCvN8P9iUGHcOKzQ+Q1S5BGSeUXIuQdhyCHpUkINkLBFsNwAB7da8gCQQRQTuX498A5e0tYsR93A8SIW3TGS1U3j0QlYeP9GAcnLsCl1PMYKHyzAaQ8kSWuehInFyyDvf17WCXb0dFbTSddwdRsW/w5k0hXrGvsN3dtFCtK+/Cx7Nnz7Bp0yacPHkSkyZNKthCMuakyrV9y6HZ4AGw1yakBQZCp7c7muU73H02YiyO/boWD5U+rkRIeHAP3vJyaNyprerHsrP1Q8mx6OgLWPjzYcQam8NMZS78sL7m+GvCDaz6nwdSq9dAVW74YJ8A9S78GCtGlByNkCgZ5LGe8IsTARBkLx/B64U9KumUh6mVBSpqAdBpiLatDLDtWBzEhNu49jgNXZvrIPbqNmy59wWmDIlBUEgI/C/+gd3PXiNx3RqcNOyFetZVYGNREZIKbeDeqwq2/x0D58F9YSMBgDTEh0cgPi0ZgY+DMvqRiCF4es8fTWzKoZxxZVhmPg0jxl3ED72HIm71SkzuVA3vb9/LnmPzzOW4ImmK2d/3hbkAAMmIehmCN6kyPHsclrncNwjwfIznaXrQEgjy5IT/t3e3IXWWcRzHf8KM0J2jzqXTOcOVzWxoMdhayLYCWQlbWzlXZg+rLaJ6YRi4qBcOolhPrBm0YMkIJmNsGbaQEYtkNF1bjazpdOLT0U1Tpzg9eo7H8++Fh+xBaYt1a/D9wPXmhus6h/M/B37nvm6uv3ountLn+0p18MyvmrhpmeJDt+X9IwMaHgtosKldg0FJCmqgq1Xd/Ul/OiY8ODagjl9OqvLTPdp33KOwe1O1dA7/qpOSkpSfn6/y8nIVFhaquLhYERER1zTXN9ipTk+rTh8o0/feDvl2H9WSx1YoefFiJbjDFZ6Rq0fT9+rthnTlbgltV0wMq+fSFfn83apr8cokBbsbda6pXYHIcLnjEkOHsplGf9yt3Ee8em/Pq9q4zP37PzNfR4V2llRqJHW73ng6ZfK6f0Ce9l55fV061zZ5Cy54tUN1dfWaP3+ewiygseF+tZ39Uvs/PKDqTr/m3R2vyfIG5B0c0mjAqwstoePSg0O63HZZfa6b/xDqTP6rXbpQU6XP9n6kivqgUh+67R8P1gP+F2a7sx3gPVIw2U12urFwg+2/NNWydLztiL24cpG5XVGWmPWylZa9a0+tfsDe+mHUxqqetyXuv6+x8OEy6wkt4T9bYitvL7DDvaEL4z/Zm6tipn9t1wJb90GTBcxrR59MsHuKjlntoSLLTo23pOXrbFPBs7Zj21a7/844i03NsV0nuqc6ovprbOfy6BnWnX5EJb9gx31mZmP21fZEc1/H3MkRZSkvfW1/acg75zQ3N5vL5bK4uDjr6+u7xll+O/16pkVPU6OsdxpssldwwJpL11tKzsfWEirEhOcTy4md4fOKzrDXav1mvm/tlbQ0e6a81o7t2mR3LUqwtKwN9vi2HfbcEw9aZmKMJa8psorWqZa1gcb3be2C66mN227ZctAGgvavvhsul8tc7jjbemjgxhYDmCVhZjPtQgNz1Hifzlef0Hf1Hg2Ou3RHdp42ZsT8h3uIE7pYVSnvms3KjJQ01qOfT53UmQaP+kdMUUtXaX3Ofbo1Yi4+5jk35eXlKT09XSUlJbP9VqRgp775wqPMzasVGyaNX2lUTXWNzrf3aigQqeQV2cpZm6ooNqmBG4bwAQAAHEWWBwAAjiJ8AAAARxE+AACAowgfAADAUYQPAADgKMIHAABwFOEDAAA4ivABAAAcRfgAAACOInwAAABHET4AAICjCB8AAMBRhA8AAOAowgcAAHAU4QMAADiK8AEAABxF+AAAAI4ifAAAAEcRPgAAgKMIHwAAwFG/AbgPjUrBNgqpAAAAAElFTkSuQmCC"}}},{"cell_type":"code","source":"# Example data\npredicted = np.array([2.5, 0.0, 2.0, 8.0])\nactual = np.array([3.0, 0.0, 2.0, 7.5])\n\n# Compute RMSLE\nresult = rmsle(predicted, actual)\nprint(f\"RMSLE: {result}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:18:19.262293Z","iopub.execute_input":"2024-12-12T09:18:19.262951Z","iopub.status.idle":"2024-12-12T09:18:19.267904Z","shell.execute_reply.started":"2024-12-12T09:18:19.262917Z","shell.execute_reply":"2024-12-12T09:18:19.267073Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_log_error\npredicted = np.array([2.5, 0.0, 2.0, 8.0])\nactual = np.array([3.0, 0.0, 2.0, 7.5])\nmsle = mean_squared_log_error(actual, predicted)\n\n# Compute RMSLE\nrmsle = np.sqrt(msle)\n\nprint(f\"Root Mean Squared Log Error (RMSLE): {rmsle}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T08:58:25.930753Z","iopub.execute_input":"2024-12-12T08:58:25.931106Z","iopub.status.idle":"2024-12-12T08:58:25.938485Z","shell.execute_reply.started":"2024-12-12T08:58:25.931075Z","shell.execute_reply":"2024-12-12T08:58:25.937631Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# from sklearn.metrics import root_mean_squared_log_error\n\n# y_true = [3, 5, 2.5, 7]\n\n# y_pred = [2.5, 5, 4, 8]\n\n# root_mean_squared_log_error(y_true, y_pred)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:00:20.350293Z","iopub.execute_input":"2024-12-12T09:00:20.350624Z","iopub.status.idle":"2024-12-12T09:00:20.354409Z","shell.execute_reply.started":"2024-12-12T09:00:20.350592Z","shell.execute_reply":"2024-12-12T09:00:20.353603Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import xgboost as xgb\nimport numpy as np\nimport pandas as pd\nfrom statistics import mean\n\ntrain = pd.read_csv('/kaggle/input/train-fold/train_folds.csv',low_memory=False)\ntest = pd.read_csv('/kaggle/input/cleaned-data/test_df.csv', low_memory=False).drop(columns='id')\n\nfor col in train.select_dtypes(include='object').columns:\n    train[col] = train[col].astype('category')\n\nfor col in test.select_dtypes(include='object').columns:\n    test[col] = test[col].astype('category')\n\nfolds = 5\nxgb_models = []\nxgb_oof = []\nval_ll = []\nval_index = []\nval_predictions_1 = {}\nval_actual_targets = {} \ntest_predictions_xgb_1 = np.zeros(len(test))\nFOLDS = folds\ncounter = 1\n\nX = train.drop(columns=[\"Premium Amount\"])\ny = train['Premium Amount']\n\nfor fold in range(folds):\n    print(f\"Training fold {fold + 1}\")\n\n    # Split data into training and validation sets\n    xtrain = train[train.kfold != fold].reset_index(drop=True)\n    xvalid = train[train.kfold == fold].reset_index(drop=True)\n    xtest = test.copy()\n\n    valid_ids = xvalid.id.values.tolist()\n\n    ytrain = xtrain['Premium Amount']\n    yvalid = xvalid['Premium Amount']\n\n    val_actual_targets.update(zip(valid_ids, yvalid.values))\n    \n    # Drop unnecessary columns\n    xtrain = xtrain.drop(['Premium Amount', 'kfold', 'id'], axis=1)\n    xvalid = xvalid.drop(['Premium Amount', 'kfold', 'id'], axis=1)\n\n    # Create DMatrix for train, validation, and test\n    dtrain = xgb.DMatrix(data=xtrain, label=ytrain, enable_categorical = True)\n    dvalid = xgb.DMatrix(data=xvalid, label=yvalid, enable_categorical = True)\n    dtest = xgb.DMatrix(data=xtest, enable_categorical = True)\n\n    # Watchlist for evaluation\n    watchlist = [(dtrain, 'train'), (dvalid, 'valid')]\n\n    # Parameters for XGBoost\n    params = {\n        'objective': 'reg:squarederror',\n        'tree_method': 'hist',  # Use GPU for faster training\n        'device' : 'cuda',\n        'eval_metric': 'rmsle',     # Metric to evaluate\n        'seed': 42\n    }\n\n    # Train the model\n    model = xgb.train(\n        params=params,\n        dtrain=dtrain,\n        num_boost_round=400,\n        evals=watchlist,\n        early_stopping_rounds=300,\n        verbose_eval=0\n    )\n\n    # Predictions for validation set\n    val_preds = model.predict(dvalid)\n    val_predictions_1.update(zip(valid_ids, val_preds))\n\n    # Calculate RMSLE\n    val_score = rmsle(yvalid.values, val_preds)\n    best_iter = model.best_iteration\n\n    print(f\"RMSLE: {val_score:.5f} and the best iteration is: {best_iter}\")\n    print(\"*\" * 50)\n\n    # Store validation score and model\n    val_ll.append(val_score)\n    xgb_models.append(model)\n\n    # Predictions for the test set (average over folds)\n    test_preds = model.predict(dtest) / folds\n    test_predictions_xgb_1 += test_preds\n    \nfinal_valid_predictions = pd.DataFrame.from_dict(val_predictions_1, orient=\"index\").reset_index()\nfinal_valid_predictions.columns = [\"id\", \"xgb_prediction\"]\nfinal_valid_predictions['actual_target'] = final_valid_predictions['id'].map(val_actual_targets)\nfinal_valid_predictions.to_csv(\"train_pred_xgb.csv\", index=False)\nprint(f\"Mean Log Loss : {mean(val_ll)}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\nsub['Premium Amount'] = test_predictions_xgb_1\nsub.to_csv('submission.csv', index=False)\nsub.head()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:37:01.043727Z","iopub.execute_input":"2024-12-12T09:37:01.044084Z","iopub.status.idle":"2024-12-12T09:37:02.670775Z","shell.execute_reply.started":"2024-12-12T09:37:01.044047Z","shell.execute_reply":"2024-12-12T09:37:02.670072Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub['Premium Amount'].hist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T10:07:04.059494Z","iopub.execute_input":"2024-12-12T10:07:04.059827Z","iopub.status.idle":"2024-12-12T10:07:04.31578Z","shell.execute_reply.started":"2024-12-12T10:07:04.059798Z","shell.execute_reply":"2024-12-12T10:07:04.315078Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Premium Amount'].hist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T10:07:42.161766Z","iopub.execute_input":"2024-12-12T10:07:42.162124Z","iopub.status.idle":"2024-12-12T10:07:42.437065Z","shell.execute_reply.started":"2024-12-12T10:07:42.162093Z","shell.execute_reply":"2024-12-12T10:07:42.436203Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:41:42.286096Z","iopub.execute_input":"2024-12-12T09:41:42.287053Z","iopub.status.idle":"2024-12-12T09:41:42.312372Z","shell.execute_reply.started":"2024-12-12T09:41:42.286982Z","shell.execute_reply":"2024-12-12T09:41:42.311275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.query('kfold == 0')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:45:51.841743Z","iopub.execute_input":"2024-12-12T09:45:51.842106Z","iopub.status.idle":"2024-12-12T09:45:51.909548Z","shell.execute_reply.started":"2024-12-12T09:45:51.842074Z","shell.execute_reply":"2024-12-12T09:45:51.908725Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_valid_predictions.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:55:38.028756Z","iopub.execute_input":"2024-12-12T09:55:38.029464Z","iopub.status.idle":"2024-12-12T09:55:38.038067Z","shell.execute_reply.started":"2024-12-12T09:55:38.029422Z","shell.execute_reply":"2024-12-12T09:55:38.037217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fold0 = train.query('kfold == 0')\nfold0['Premium Amount'].hist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T09:58:59.541883Z","iopub.execute_input":"2024-12-12T09:58:59.542242Z","iopub.status.idle":"2024-12-12T09:58:59.779569Z","shell.execute_reply.started":"2024-12-12T09:58:59.542211Z","shell.execute_reply":"2024-12-12T09:58:59.778663Z"}},"outputs":[],"execution_count":null}]}