{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"},{"sourceId":9178166,"sourceType":"datasetVersion","datasetId":5547076}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-21T01:15:32.543113Z","iopub.execute_input":"2025-11-21T01:15:32.543903Z","iopub.status.idle":"2025-11-21T01:15:32.925694Z","shell.execute_reply.started":"2025-11-21T01:15:32.543864Z","shell.execute_reply":"2025-11-21T01:15:32.924649Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\n\n#original_dataset_insurance = pd.read_csv('Insurance Premium Prediction Dataset.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-21T01:15:35.803325Z","iopub.execute_input":"2025-11-21T01:15:35.804311Z","iopub.status.idle":"2025-11-21T01:15:47.968951Z","shell.execute_reply.started":"2025-11-21T01:15:35.804265Z","shell.execute_reply":"2025-11-21T01:15:47.967865Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.decomposition import PCA\nfrom scipy import stats as st","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-21T01:15:47.970684Z","iopub.execute_input":"2025-11-21T01:15:47.971015Z","iopub.status.idle":"2025-11-21T01:15:49.147733Z","shell.execute_reply.started":"2025-11-21T01:15:47.970983Z","shell.execute_reply":"2025-11-21T01:15:49.146403Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import KFold\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.model_selection import train_test_split","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-21T01:15:49.249059Z","iopub.execute_input":"2025-11-21T01:15:49.249677Z","iopub.status.idle":"2025-11-21T01:15:49.25533Z","shell.execute_reply.started":"2025-11-21T01:15:49.249638Z","shell.execute_reply":"2025-11-21T01:15:49.254201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_error","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.impute import SimpleImputer","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.linear_model import SGDRegressor","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from catboost import CatBoostRegressor\nfrom sklearn.model_selection import KFold","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train.isnull().sum()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Basic correlogram\n\"\"\"\nsns.pairplot(train)\nplt.show()\n\"\"\"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#imp_mean = SimpleImputer(missing_values=-1)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Substituir valores nulos e vazios por 0\ntrain = train.replace(r'^\\s*$', np.nan, regex=True)  # Substituir strings vazias por NaN\ntrain.fillna(0, inplace=True)  # Preencher NaN com -999","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Substituir valores nulos e vazios por 0\ntest = test.replace(r'^\\s*$', np.nan, regex=True)  # Substituir strings vazias por NaN\ntest.fillna(0, inplace=True)  # Preencher NaN com -999","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train.isnull().sum()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef RMSLE(true,pred):\n    true_log = np.log1p(true)\n    pred_log = np.log1p(pred)\n    m = np.sqrt(np.mean( (true_log-pred_log)**2.0 ))\n    return m\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\npred = np.exp( np.mean( np.log1p(train[\"Premium Amount\"]) ) )-1\nm = RMSLE(train[\"Premium Amount\"].values, pred)\nprint(f\"Exponented Mean Log 1p produces CV RMSLE = {m}\")\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[\"Premium Amount\"][~train[\"Premium Amount\"].isna()].max()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[\"Premium Amount\"][~train[\"Premium Amount\"].isna()].min()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[:100000]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\"\"\"\ntrain1 = train\ntrain = pd.concat([train,test])\n\"\"\"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train.drop(['Policy Start Date'], axis=1)\n#test.drop(['Policy Start Date'], axis=1)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Import date\nfrom datetime import date\n\ndef extract_day_month_year(dataframe, column):\n    dataframe[column] = pd.to_datetime(dataframe[column])\n    dataframe[column+'_day'] = dataframe[column].dt.day\n    dataframe[column+'_month'] = dataframe[column].dt.month\n    dataframe[column+'_year'] = dataframe[column].dt.year\n    dataframe = dataframe.drop(columns=[column])\n    ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"extract_day_month_year(train, 'Policy Start Date')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"extract_day_month_year(test, 'Policy Start Date')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.dtypes","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train.drop(columns=['Policy Start Date'])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Identificar colunas categóricas automaticamente (opcional)\ncategorical_columns = train.select_dtypes(include=['object', 'category']).columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\ntrain_encoded = pd.get_dummies(train, columns=categorical_columns, drop_first=False)  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\ntest_encoded = pd.get_dummies(test, columns=categorical_columns, drop_first=False)  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Identificar colunas categóricas automaticamente (opcional)\ncategorical_columns = test.select_dtypes(include=['object', 'category']).columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"categorical_columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded = pd.DataFrame()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\n#test_encoded = pd.concat([test_encoded, pd.get_dummies(test, columns=['Gender', 'Marital Status', 'Education Level'], drop_first=False) ])  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\n#test_encoded = pd.concat([test_encoded, pd.get_dummies(test, columns=['Occupation', 'Location','Policy Type'], drop_first=False)])  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\n#test_encoded = pd.get_dummies(test, columns=['Policy Start Date'], drop_first=False)  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\n#test_encoded = pd.concat([test_encoded, pd.get_dummies(test, columns=['Customer Feedback','Smoking Status'], drop_first=False)]) # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar get_dummies nas colunas categóricas\n#test_encoded = pd.concat([test_encoded, pd.get_dummies(test, columns=['Exercise Frequency', 'Property Type'], drop_first=False) ])  # drop_first=True para evitar colinearidade","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Verificar e adicionar colunas ausentes\nfor col in train_encoded.columns:\n    if col not in test_encoded.columns:\n        test_encoded[col] = 0  # Adicionar coluna ausente preenchida com 0\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#separando dados do alvo\nX = train_encoded.drop('Premium Amount', axis=1)\ny = train_encoded['Premium Amount']\n\ny_log = np.log1p(y)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def rmsle1(y_true, y_pred):\n    return np.sqrt(mean_squared_log_error(y_true, y_pred))","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_model():\n    kf = KFold(n_splits=5, shuffle=True, random_state=42)\n    oof = np.zeros(len(X))\n    models = []\n\n    for fold, (train_idx, valid_idx) in enumerate(kf.split(X)):\n        print(f\"Fold {fold + 1}\")\n        X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]\n        y_train, y_valid = y_log.iloc[train_idx], y_log.iloc[valid_idx]\n\n        model = CatBoostRegressor(\n            iterations=3000,\n            learning_rate=0.05,\n            depth=6,\n            eval_metric=\"RMSE\",\n            random_seed=42,\n            verbose=200,\n            #task_type='GPU',\n            l2_leaf_reg =  0.7,\n        )\n        \n        model.fit(X_train,\n                  y_train,\n                  eval_set=(X_valid, y_valid), \n                  early_stopping_rounds=300,\n                  # cat_features=cat_cols,\n                 )\n        models.append(model)\n        oof[valid_idx] = np.maximum(0, model.predict(X_valid))\n        fold_rmsle = rmsle1(np.expm1(y_valid), np.expm1(oof[valid_idx]))\n        print(f\"Fold {fold + 1} RMSLE: {fold_rmsle}\")\n        \n    return models, oof","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models,oof = train_model()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(rmsle1(y, np.expm1(oof)))","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mean_squared_log_error(y, oof)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions = np.zeros(len(test_encoded))","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded['id']","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded.columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded.dtypes","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded['Gender_Female']\n\n# Selecionando colunas de tipos específicos\n#selected_columns = train_encoded.select_dtypes(include=['int16', 'float64', 'int64', 'int32']).columns.tolist()\nselected_columns = train_encoded.columns.tolist()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selected_columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selected_columns.remove('Premium Amount')\nselected_columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_encoded[selected_columns]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(oof)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded[selected_columns]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#selected_columns.append('Gender_Female')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selected_columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded['Gender_Female'] = 0","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_encoded['Gender_Female']","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded[selected_columns]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selected_columns","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions_final = ''\ntest_predictions_final","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_encoded.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions_final = np.zeros(len(test_encoded))","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(test_predictions_final)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions_final","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfor model in models:\n    test_predictions_final += np.maximum(0, np.expm1(model.predict(test_encoded[selected_columns]))) / len(models)\n    ","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds = model.predict(test_encoded[selected_columns])","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions_final","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#sample = pd.DataFrame()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\"\"\"\nsample['id'] = test_encoded['id']\nsample['Premium Amount'] = test_predictions_final\nsample.to_csv('6_submission_CatBoostRegressor.csv', index = False)\nsample.head()\n\"\"\"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_predictions_final[test_predictions_final['id'] == 1200000]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Submit notebooks to the challenge. Final\n\n\nsubmission_final = pd.DataFrame({\n\n        \"id\":test_encoded['id'],\n\n        \"Premium Amount\":test_predictions_final\n\n    })\n\nsubmission_final.to_csv('novo_arquivo_submission.csv', index=False)\n\n\nprint(\" Arquivo submission v2.csv pronto \")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#submission_final[submission_final['id'] == 1200000]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(test_predictions_final)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('end...')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}