{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"machine_shape":"hm","provenance":[]},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\ndef one_hot_encode_columns(df, columns, encoders=None):\n    output_df = pd.DataFrame(index=df.index)  # Initialize output_df with original index\n    if encoders is None:\n        encoders = {}\n\n    for col in columns:\n        if col not in encoders:\n            # Ensure all values are strings before fitting to prevent potential _nan\n            df[col] = df[col].astype(str)\n\n            encoders[col] = OneHotEncoder(sparse_output=False, handle_unknown='ignore')\n            encoders[col].fit(df[[col]])\n\n        # Get feature names, handling potential 'nan' issue\n        feature_names = encoders[col].get_feature_names_out([col])\n        feature_names = [name.replace('nan', 'missing') for name in feature_names]\n\n        # Transform data and create DataFrame with adjusted feature names\n        encoded_data = encoders[col].transform(df[[col]])\n        encoded_df = pd.DataFrame(encoded_data, columns=feature_names, index=df.index)\n        output_df = pd.concat([output_df, encoded_df], axis=1)\n\n    return output_df, encoders\n\n\nfrom sklearn.preprocessing import MinMaxScaler\n\n","metadata":{"id":"6JJI5AXlElcx","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:42:10.596481Z","iopub.execute_input":"2024-12-26T21:42:10.596966Z","iopub.status.idle":"2024-12-26T21:42:10.60545Z","shell.execute_reply.started":"2024-12-26T21:42:10.596929Z","shell.execute_reply":"2024-12-26T21:42:10.603757Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\ntrain_df=pd.read_csv(\"/kaggle/input/playground-series-s4e12/train.csv\")\ntrain_df=train_df.sample(frac=1, random_state=42)\ntrain_df.reset_index(drop=True, inplace=True)\nprint(train_df.info())\nprint(train_df.head())\nprint(train_df.describe())\nfor column in train_df.columns:\n  unique_values = train_df[column].value_counts()\n  print(unique_values)\n  print(\"-\" * 20)\n\nimport pandas as pd\ntest_df=pd.read_csv(\"/kaggle/input/playground-series-s4e12/test.csv\")\n\nprint(test_df.info())\nprint(test_df.head())\nprint(test_df.describe())\nfor column in test_df.columns:\n  unique_values = test_df[column].value_counts()\n  print(unique_values)\n  print(\"-\" * 20)","metadata":{"id":"gAAAo7CbpmGJ","outputId":"6b815be4-c772-46af-cd89-bf2ff2b11479","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:43:10.20636Z","iopub.status.idle":"2024-12-26T21:43:26.431933Z","shell.execute_reply.started":"2024-12-26T21:43:10.206776Z","shell.execute_reply":"2024-12-26T21:43:26.430844Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nset(train_df.columns) - set(test_df.columns)","metadata":{"id":"t2kFg8prKyF7","outputId":"581e652e-f044-40cd-bcc6-9bc8384f748e","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:15.692887Z","iopub.execute_input":"2024-12-26T21:45:15.693296Z","iopub.status.idle":"2024-12-26T21:45:15.699637Z","shell.execute_reply.started":"2024-12-26T21:45:15.693265Z","shell.execute_reply":"2024-12-26T21:45:15.698416Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport pandas as pd\n\nnumeric_cols = train_df.select_dtypes(include=['number']).columns.tolist()\nobject_cols = train_df.select_dtypes(include=['object']).columns.tolist()\n\nprint(\"Numeric columns:\")\nprint(numeric_cols)\nprint(\"\\nObject columns:\")\nobject_cols","metadata":{"id":"80Jx8V71tZ30","outputId":"f6e92e8d-762f-4e7e-9490-bd248ff31371","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:15.701383Z","iopub.execute_input":"2024-12-26T21:45:15.701787Z","iopub.status.idle":"2024-12-26T21:45:15.970953Z","shell.execute_reply.started":"2024-12-26T21:45:15.701745Z","shell.execute_reply":"2024-12-26T21:45:15.970104Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntarget_columns=['Premium Amount']\nonehot_columns=['Gender',\n 'Marital Status',\n\n 'Smoking Status',\n\n 'Property Type']\n\n\n\ncaterogical_to_numeric_columns=[ 'Education Level',\n 'Location',\n 'Policy Type',\n 'Customer Feedback',\n  'Exercise Frequency']\nnumeric_columns=[ 'Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Previous Claims', 'Vehicle Age', 'Credit Score', 'Insurance Duration']\n\ndate_columns=['Policy Start Date']\n\ndrop_columns=[]\n\nscore_maps = {\n    'Education Level': {'High School': 0, 'Bachelor': 1, 'Master': 2, 'PhD': 3},\n\n    'Location': {'Urban': 0, 'Suburban': 1, 'Rural': 2},\n    'Policy Type': {'Basic': 0, 'Comprehensive': 1, 'Premium': 2},\n    'Customer Feedback': {'Negative': 0, 'Neutral': 1, 'Positive': 2},\n\n    'Exercise Frequency': {'Never': 0, 'Occasionally': 1, 'Regularly': 2},\n\n}","metadata":{"id":"KX-UJiEkb98-","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:15.973177Z","iopub.execute_input":"2024-12-26T21:45:15.973683Z","iopub.status.idle":"2024-12-26T21:45:15.980021Z","shell.execute_reply.started":"2024-12-26T21:45:15.973653Z","shell.execute_reply":"2024-12-26T21:45:15.978845Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"analisys_df=train_df.copy()[:5000]\nonehot_df, encoders_map = one_hot_encode_columns(analisys_df, onehot_columns)\nanalisys_df=pd.concat([analisys_df.drop(onehot_columns, axis=1),onehot_df],axis=1)","metadata":{"id":"3rQ0x1BOwhv-","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:15.981805Z","iopub.execute_input":"2024-12-26T21:45:15.982192Z","iopub.status.idle":"2024-12-26T21:45:16.250283Z","shell.execute_reply.started":"2024-12-26T21:45:15.982156Z","shell.execute_reply":"2024-12-26T21:45:16.249371Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport matplotlib.pyplot as plt\n\n\n'''\nfor col in analisys_df.columns:\n    if pd.api.types.is_numeric_dtype(analisys_df[col]) and col not in target_columns:\n        plt.figure(figsize=(10, 6))  # Adjust figure size as needed\n        plt.scatter(analisys_df[col], analisys_df[target_columns[0]], alpha=0.5) # alpha for transparency to show overlapping\n        plt.xlabel(col)\n        plt.ylabel(target_columns[0])\n        plt.title(f'{col} vs. {target_columns[0]}')\n        plt.grid(True)\n        plt.show()\n'''","metadata":{"id":"qVEC-o-Cslgc","outputId":"ec90be66-4f3e-475e-b377-e34e1f77499b","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:16.251291Z","iopub.execute_input":"2024-12-26T21:45:16.251563Z","iopub.status.idle":"2024-12-26T21:45:16.258054Z","shell.execute_reply.started":"2024-12-26T21:45:16.251541Z","shell.execute_reply":"2024-12-26T21:45:16.257029Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from datetime import date\n\nimport pandas as pd\n\ndef days_since_2018(df):\n    # Convert 'Policy Start Date' to datetime objects\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n\n    # Calculate the difference in days from 2018-01-01\n    reference_date = pd.to_datetime('2018-01-01')\n    output_df=pd.DataFrame()\n    output_df['Days Since 2018'] = (df['Policy Start Date'] - reference_date).dt.days\n\n    return output_df\n\nimport pandas as pd\nfrom sklearn.base import BaseEstimator, TransformerMixin\n\nclass DaysSinceCalculator(BaseEstimator, TransformerMixin):\n  def __init__(self, reference_date='2018-01-01'):\n      self.reference_date = pd.to_datetime(reference_date)\n      self.date_columns = None  # Initialize date_columns to None\n\n  def fit(self, X, y=None):\n      # Get the column names from the input DataFrame during fit\n      self.date_columns = X.columns.tolist()\n\n      return self\n\n  def transform(self, X):\n      # Convert date columns to datetime objects\n      X_temp = X.copy()\n      for col in self.date_columns:\n          X_temp[col] = pd.to_datetime(X_temp[col])  # Handle non-date columns\n\n      # Calculate the difference in days from the reference date\n      output_df = pd.DataFrame(index=X.index) # Use original index\n      for col in self.date_columns:\n          try:  # Handle potential errors during date calculation\n              output_df[f'Days Since Reference ({col})'] = (X_temp[col] - self.reference_date).dt.days\n          except AttributeError:  # If column is not a datetime\n              output_df[f'Days Since Reference ({col})'] = pd.NaT # Assign NaT for non-date columns\n\n      return output_df\n","metadata":{"id":"5HIj9ICz7ciy","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:16.259377Z","iopub.execute_input":"2024-12-26T21:45:16.259729Z","iopub.status.idle":"2024-12-26T21:45:16.276286Z","shell.execute_reply.started":"2024-12-26T21:45:16.259702Z","shell.execute_reply":"2024-12-26T21:45:16.275308Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef assign_scores(df, score_maps):\n    \"\"\"Assigns numerical scores to categorical features based on score_maps.\"\"\"\n    new_df = df.copy()  # Create a copy to avoid modifying the original DataFrame\n\n    for column, score_map in score_maps.items():\n        if column in new_df.columns: # Check if column exists in DataFrame\n            new_df[column] = new_df[column].map(score_map).fillna(0) # Map and handle missing values\n\n    return new_df\n\n","metadata":{"id":"W1sLyFreJGE9","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:16.277391Z","iopub.execute_input":"2024-12-26T21:45:16.277736Z","iopub.status.idle":"2024-12-26T21:45:16.295614Z","shell.execute_reply.started":"2024-12-26T21:45:16.2777Z","shell.execute_reply":"2024-12-26T21:45:16.294495Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.preprocessing import StandardScaler, FunctionTransformer, MinMaxScaler\nfrom sklearn.impute import SimpleImputer\nimport numpy as np\ndef add_is_not_null_column(X):\n    \"\"\"Adds a boolean column 'is_not_null_<column_name>' for each numeric column.\"\"\"\n    output_df = X.copy()\n    for col in X.columns:\n        output_df[f'is_not_null_{col}'] = X[col].notna().astype(int)\n    return output_df\n\ndate_pipeline = Pipeline([\n    ('add_is_not_null', FunctionTransformer(add_is_not_null_column)),\n(\"date to int\", DaysSinceCalculator( reference_date='2018-01-01')),\n('imputer', SimpleImputer(strategy='median')),\n('scaler', MinMaxScaler() )\n])\nnumeric_pipeline = Pipeline([\n    ('add_is_not_null', FunctionTransformer(add_is_not_null_column)),\n    ('imputer', SimpleImputer(strategy='median')),  # Add imputation step\n    ('scaler', MinMaxScaler())\n])\n\nonehot_pipeline=Pipeline([\n    ('onehot', OneHotEncoder(handle_unknown='ignore'))\n])\ncaterogical_to_numeric_pipeline=Pipeline([\n    ('add_is_not_null', FunctionTransformer(add_is_not_null_column)),\n    ('map', FunctionTransformer(assign_scores, kw_args={'score_maps': score_maps})),\n     ('imputer', SimpleImputer(strategy='median')),\n('scaler', MinMaxScaler())\n])\n\n\nfull_pipeline = ColumnTransformer([\n(\"date\", date_pipeline, date_columns),\n('numeric', numeric_pipeline,numeric_columns),\n('onehot', onehot_pipeline, onehot_columns),\n('caterogical_to_numeric', caterogical_to_numeric_pipeline, caterogical_to_numeric_columns)\n])\ntransformed_array= full_pipeline.fit_transform(train_df)\n","metadata":{"id":"Z0jTGb4F3i0A","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:16.298817Z","iopub.execute_input":"2024-12-26T21:45:16.299156Z","iopub.status.idle":"2024-12-26T21:45:25.375947Z","shell.execute_reply.started":"2024-12-26T21:45:16.2991Z","shell.execute_reply":"2024-12-26T21:45:25.374782Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport matplotlib.pyplot as plt\nplt.figure(figsize=(10, 6))\nplt.hist(train_df['Premium Amount'], bins=100, edgecolor='black')  # Adjust 'bins' as needed\nplt.xlabel('Premium Amount')\nplt.ylabel('Frequency')\nplt.title('Distribution of Premium Amount')\nplt.grid(True)\nplt.show()","metadata":{"id":"IQyTA4_ImRIA","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:25.37742Z","iopub.execute_input":"2024-12-26T21:45:25.377778Z","iopub.status.idle":"2024-12-26T21:45:25.848332Z","shell.execute_reply.started":"2024-12-26T21:45:25.377749Z","shell.execute_reply":"2024-12-26T21:45:25.846969Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n!pip install -q -U keras-tuner\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow import keras\nfrom tensorflow.keras.layers import Dense, BatchNormalization\nfrom tensorflow.keras.initializers import he_normal\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport keras_tuner as kt\n\n\nX_tuner= transformed_array[:2000]\ny_tuner = train_df[target_columns][:2000]\nX_train, X_val, y_train, y_val = train_test_split(transformed_array,train_df[target_columns], test_size=0.2, random_state=42)\nX_tuner_train, X_tuner_val, y_tuner_train, y_tuner_val = train_test_split(X_tuner,y_tuner, test_size=0.2, random_state=42)\n\n","metadata":{"id":"KoWMoKKZPK-d","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:25.849514Z","iopub.execute_input":"2024-12-26T21:45:25.849952Z","iopub.status.idle":"2024-12-26T21:45:42.389697Z","shell.execute_reply.started":"2024-12-26T21:45:25.849921Z","shell.execute_reply":"2024-12-26T21:45:42.388501Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\nimport lightgbm as lgb\n\n# Create LightGBM datasets\ntrain_data = lgb.Dataset(X_train, label=y_train)\nval_data = lgb.Dataset(X_val, label=y_val, reference=train_data)\n\n# Define LightGBM parameters\nparams = {\n    'objective': 'regression',  # Use regression for predicting 'Premium Amount'\n    'metric': 'rmse',  # Use RMSE as the evaluation metric\n    'boosting_type': 'gbdt',\n    'num_leaves': 31,\n    'learning_rate': 0.05,\n    'feature_fraction': 0.9,\n}\n\n# Train the LightGBM model\nnum_round = 200  # Adjust the number of boosting rounds\n# Pass early_stopping_rounds as a callback function\nmodel = lgb.train(\n    params,\n    train_data,\n    num_boost_round=num_round,  # Use num_boost_round instead of num_round\n    valid_sets=[val_data],\n    callbacks=[lgb.early_stopping(stopping_rounds=10)]  # Add early stopping callback\n)\n\n# Make predictions on the validation set\ny_pred = model.predict(X_val)\n\n# Evaluate the model\nfrom sklearn.metrics import mean_squared_error\nmse = mean_squared_error(y_val, y_pred)\nprint(f\"MSE on validation set: {mse}\")","metadata":{"id":"4FhWpdL87IGq","outputId":"06892cfc-3225-4ee1-9968-57d33976c442","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:45:42.390704Z","iopub.execute_input":"2024-12-26T21:45:42.391369Z","iopub.status.idle":"2024-12-26T21:45:54.939642Z","shell.execute_reply.started":"2024-12-26T21:45:42.391338Z","shell.execute_reply":"2024-12-26T21:45:54.938523Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Assuming 'loaded_model', 'train_df', and 'full_pipeline' are defined as in your previous code\n# and 'transformed_array' is the transformed training data\n\n# Select the first 2000 records for prediction\nX_predict = transformed_array[:2000]\ny_true = train_df['Premium Amount'][:2000]\n\n# Make predictions using the lgb model\npredictions = model.predict(X_predict)\n\n# Calculate the difference in percentage\ndifferences = ((predictions - y_true) / y_true) * 100\n\n# Calculate the median of the percentage differences\nmedian_diff = np.median(differences)\n\nprint(f\"Median of the percentage difference between actual and predicted values: {median_diff:.2f}%\")","metadata":{"id":"_RKEQ4u-8bDr","outputId":"3019100b-0738-4bb6-9bc9-dca11f8977ee","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:49:19.070086Z","iopub.execute_input":"2024-12-26T21:49:19.070635Z","iopub.status.idle":"2024-12-26T21:49:19.09173Z","shell.execute_reply.started":"2024-12-26T21:49:19.07059Z","shell.execute_reply":"2024-12-26T21:49:19.090455Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Assuming 'test_df' and 'full_pipeline' are defined as in your previous code.\ntransformed_test_data = full_pipeline.transform(test_df)\n\n# Make predictions using the lgb model\npredictions = model.predict(transformed_test_data)\n\n# Create a DataFrame for predictions\npredictions_df = pd.DataFrame({'id': test_df['id'], 'Premium Amount': predictions})\n\n# Save the DataFrame to a CSV file\npredictions_df.to_csv('lgb_predictions.csv', index=False)","metadata":{"id":"xPUFd4mp9IOL","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T21:49:27.695627Z","iopub.execute_input":"2024-12-26T21:49:27.696171Z","iopub.status.idle":"2024-12-26T21:49:34.853058Z","shell.execute_reply.started":"2024-12-26T21:49:27.696103Z","shell.execute_reply":"2024-12-26T21:49:34.851961Z"}},"outputs":[],"execution_count":null}]}