{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:49.567471Z","iopub.execute_input":"2024-12-26T17:42:49.567844Z","iopub.status.idle":"2024-12-26T17:42:49.574585Z","shell.execute_reply.started":"2024-12-26T17:42:49.567815Z","shell.execute_reply":"2024-12-26T17:42:49.57375Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"code","source":"df_train= pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ndf_train.sample(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:49.612809Z","iopub.execute_input":"2024-12-26T17:42:49.613025Z","iopub.status.idle":"2024-12-26T17:42:53.276375Z","shell.execute_reply.started":"2024-12-26T17:42:49.613006Z","shell.execute_reply":"2024-12-26T17:42:53.275677Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:53.277452Z","iopub.execute_input":"2024-12-26T17:42:53.27776Z","iopub.status.idle":"2024-12-26T17:42:53.835956Z","shell.execute_reply.started":"2024-12-26T17:42:53.277737Z","shell.execute_reply":"2024-12-26T17:42:53.83522Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.compose import ColumnTransformer","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:53.837331Z","iopub.execute_input":"2024-12-26T17:42:53.837555Z","iopub.status.idle":"2024-12-26T17:42:53.841516Z","shell.execute_reply.started":"2024-12-26T17:42:53.837536Z","shell.execute_reply":"2024-12-26T17:42:53.840703Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numeric_cols = ['Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Previous Claims', 'Credit Score','Vehicle Age','Insurance Duration']\ncategorical_cols = ['Marital Status', 'Occupation','Customer Feedback']\n\nnumeric_imputer = SimpleImputer(strategy='mean')\ncategorical_imputer = SimpleImputer(strategy='most_frequent')\n\ndf_train[numeric_cols] = numeric_imputer.fit_transform(df_train[numeric_cols])\ndf_train[categorical_cols] = categorical_imputer.fit_transform(df_train[categorical_cols])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:53.842746Z","iopub.execute_input":"2024-12-26T17:42:53.842954Z","iopub.status.idle":"2024-12-26T17:42:54.516681Z","shell.execute_reply.started":"2024-12-26T17:42:53.842935Z","shell.execute_reply":"2024-12-26T17:42:54.515952Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded= pd.get_dummies(df_train, columns=['Marital Status', 'Occupation','Customer Feedback', 'Gender','Location', 'Policy Type','Smoking Status', 'Exercise Frequency', 'Property Type','Education Level' ], drop_first= True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:54.517493Z","iopub.execute_input":"2024-12-26T17:42:54.517812Z","iopub.status.idle":"2024-12-26T17:42:55.447576Z","shell.execute_reply.started":"2024-12-26T17:42:54.517781Z","shell.execute_reply":"2024-12-26T17:42:55.446894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded['Policy Start Date']= pd.to_datetime(df_train_encoded['Policy Start Date'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:55.44837Z","iopub.execute_input":"2024-12-26T17:42:55.448683Z","iopub.status.idle":"2024-12-26T17:42:55.822737Z","shell.execute_reply.started":"2024-12-26T17:42:55.448651Z","shell.execute_reply":"2024-12-26T17:42:55.822044Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:55.823448Z","iopub.execute_input":"2024-12-26T17:42:55.823706Z","iopub.status.idle":"2024-12-26T17:42:55.872422Z","shell.execute_reply.started":"2024-12-26T17:42:55.823686Z","shell.execute_reply":"2024-12-26T17:42:55.871556Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded['Policy Start Date'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:55.874966Z","iopub.execute_input":"2024-12-26T17:42:55.875183Z","iopub.status.idle":"2024-12-26T17:42:55.881491Z","shell.execute_reply.started":"2024-12-26T17:42:55.875165Z","shell.execute_reply":"2024-12-26T17:42:55.88059Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded['Policy Start Year']= df_train_encoded['Policy Start Date'].dt.year\ndf_train_encoded['Policy Start Month']= df_train_encoded['Policy Start Date'].dt.month\ndf_train_encoded['Policy Start Weekday']= df_train_encoded['Policy Start Date'].dt.weekday\ndf_train_encoded['Policy Age']= (pd.to_datetime('today') - df_train_encoded['Policy Start Date']).dt.days","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:55.882686Z","iopub.execute_input":"2024-12-26T17:42:55.882953Z","iopub.status.idle":"2024-12-26T17:42:56.071434Z","shell.execute_reply.started":"2024-12-26T17:42:55.882932Z","shell.execute_reply":"2024-12-26T17:42:56.070558Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.072312Z","iopub.execute_input":"2024-12-26T17:42:56.072595Z","iopub.status.idle":"2024-12-26T17:42:56.091775Z","shell.execute_reply.started":"2024-12-26T17:42:56.072562Z","shell.execute_reply":"2024-12-26T17:42:56.091142Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded['month_sin'] = np.sin(2 * np.pi * df_train_encoded['Policy Start Month'] / 12)\ndf_train_encoded['month_cos'] = np.cos(2 * np.pi * df_train_encoded['Policy Start Month'] / 12)\n\ndf_train_encoded['weekday_sin'] = np.sin(2 * np.pi * df_train_encoded['Policy Start Weekday'] / 7)\ndf_train_encoded['weekday_cos'] = np.cos(2 * np.pi * df_train_encoded['Policy Start Weekday'] / 7)\n\nnumerical_features = ['Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Previous Claims', 'Credit Score','Vehicle Age','Insurance Duration', 'Policy Age']\nscaler = StandardScaler()\ndf_train_encoded[numerical_features] = scaler.fit_transform(df_train_encoded[numerical_features])\n\ndf_train_encoded.drop(['Policy Start Month' , 'Policy Start Weekday',  'Policy Start Date',  'Policy Start Year', 'id'], axis= 1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.092503Z","iopub.execute_input":"2024-12-26T17:42:56.092776Z","iopub.status.idle":"2024-12-26T17:42:56.503522Z","shell.execute_reply.started":"2024-12-26T17:42:56.092757Z","shell.execute_reply":"2024-12-26T17:42:56.502826Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded.sample(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.504372Z","iopub.execute_input":"2024-12-26T17:42:56.504683Z","iopub.status.idle":"2024-12-26T17:42:56.551562Z","shell.execute_reply.started":"2024-12-26T17:42:56.504653Z","shell.execute_reply":"2024-12-26T17:42:56.550909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_encoded.drop(['month_sin', 'month_cos', 'weekday_sin', 'weekday_cos'], axis = 1, inplace= True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.552265Z","iopub.execute_input":"2024-12-26T17:42:56.55246Z","iopub.status.idle":"2024-12-26T17:42:56.604245Z","shell.execute_reply.started":"2024-12-26T17:42:56.552443Z","shell.execute_reply":"2024-12-26T17:42:56.60345Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X=df_train_encoded.drop('Premium Amount', axis=1)\ny=df_train_encoded['Premium Amount']\n\nX_train, X_test, y_train, y_test= train_test_split(X,y,test_size=0.2,random_state= 2)\n\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.605075Z","iopub.execute_input":"2024-12-26T17:42:56.60531Z","iopub.status.idle":"2024-12-26T17:42:56.907535Z","shell.execute_reply.started":"2024-12-26T17:42:56.60528Z","shell.execute_reply":"2024-12-26T17:42:56.906425Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow\nfrom tensorflow import keras\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Dense , Dropout, BatchNormalization\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.optimizers import Adam\n\ny_train = np.log1p(y_train)\ny_test = np.log1p(y_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.908499Z","iopub.execute_input":"2024-12-26T17:42:56.90882Z","iopub.status.idle":"2024-12-26T17:42:56.91632Z","shell.execute_reply.started":"2024-12-26T17:42:56.908786Z","shell.execute_reply":"2024-12-26T17:42:56.915572Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Sequential([\n    Dense(512, activation='relu', input_dim=X_train.shape[1]),\n    BatchNormalization(),\n    Dropout(0.4),\n    Dense(256, activation='relu'),\n    BatchNormalization(),\n    Dropout(0.3),\n    Dense(128, activation='relu'),\n    BatchNormalization(),\n    Dropout(0.3),\n    Dense(64, activation='relu'),\n    BatchNormalization(),\n    Dense(1, activation='linear')  # Linear for regression\n])\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\n# Optimizer with a smaller initial learning rate\noptimizer = Adam(learning_rate=5e-5)\n\n# Callbacks\nlr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-7, verbose=1)\nearly_stopping = EarlyStopping(monitor='val_loss', patience=15, restore_best_weights=True, verbose=1)\n\n# Compile model\nmodel.compile(optimizer=optimizer, loss='mean_squared_logarithmic_error', metrics=['mean_squared_logarithmic_error'])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:56.917096Z","iopub.execute_input":"2024-12-26T17:42:56.917386Z","iopub.status.idle":"2024-12-26T17:42:57.004967Z","shell.execute_reply.started":"2024-12-26T17:42:56.917358Z","shell.execute_reply":"2024-12-26T17:42:57.004195Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    X_train, y_train,\n    validation_data=(X_test, y_test),\n    epochs=200,  # More epochs for better convergence\n    batch_size=4096,  # Larger batch size for smoother gradients\n    verbose=1,\n    callbacks=[early_stopping, lr_scheduler]\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:42:57.005653Z","iopub.execute_input":"2024-12-26T17:42:57.005848Z","iopub.status.idle":"2024-12-26T17:45:25.35344Z","shell.execute_reply.started":"2024-12-26T17:42:57.00583Z","shell.execute_reply":"2024-12-26T17:45:25.352559Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_loss = model.evaluate(X_test, y_test, verbose=0)\nrmsle = np.sqrt(test_loss[0])\nprint(f\"Test RMSLE: {rmsle}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:45:25.35454Z","iopub.execute_input":"2024-12-26T17:45:25.3548Z","iopub.status.idle":"2024-12-26T17:45:34.47649Z","shell.execute_reply.started":"2024-12-26T17:45:25.354778Z","shell.execute_reply":"2024-12-26T17:45:34.475739Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.plot(history.history['loss'], label='Training Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Model Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:45:34.477331Z","iopub.execute_input":"2024-12-26T17:45:34.477676Z","iopub.status.idle":"2024-12-26T17:45:34.719892Z","shell.execute_reply.started":"2024-12-26T17:45:34.477609Z","shell.execute_reply":"2024-12-26T17:45:34.719023Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Load the test dataset\ndf_test = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\n\n# Handle missing values\ndf_test[numeric_cols] = numeric_imputer.transform(df_test[numeric_cols])\ndf_test[categorical_cols] = categorical_imputer.transform(df_test[categorical_cols])\n\n# Encode categorical columns\ndf_test_encoded = pd.get_dummies(\n    df_test, \n    columns=['Marital Status', 'Occupation', 'Customer Feedback', 'Gender', 'Location', 'Policy Type', 'Smoking Status', 'Exercise Frequency', 'Property Type', 'Education Level'], \n    drop_first=True\n)\n\n# Convert 'Policy Start Date' to datetime\ndf_test_encoded['Policy Start Date'] = pd.to_datetime(df_test_encoded['Policy Start Date'])\n\n# Create new features from 'Policy Start Date'\ndf_test_encoded['Policy Start Year'] = df_test_encoded['Policy Start Date'].dt.year\ndf_test_encoded['Policy Start Month'] = df_test_encoded['Policy Start Date'].dt.month\ndf_test_encoded['Policy Start Weekday'] = df_test_encoded['Policy Start Date'].dt.weekday\ndf_test_encoded['Policy Age'] = (pd.to_datetime('today') - df_test_encoded['Policy Start Date']).dt.days\n\n# Add cyclic features\ndf_test_encoded['month_sin'] = np.sin(2 * np.pi * df_test_encoded['Policy Start Month'] / 12)\ndf_test_encoded['month_cos'] = np.cos(2 * np.pi * df_test_encoded['Policy Start Month'] / 12)\ndf_test_encoded['weekday_sin'] = np.sin(2 * np.pi * df_test_encoded['Policy Start Weekday'] / 7)\ndf_test_encoded['weekday_cos'] = np.cos(2 * np.pi * df_test_encoded['Policy Start Weekday'] / 7)\n\n# Scale numerical features\ndf_test_encoded[numerical_features] = scaler.transform(df_test_encoded[numerical_features])\n\n# Drop unnecessary columns\ndf_test_encoded.drop(['month_sin','month_cos','weekday_sin','weekday_cos', 'Policy Start Month', 'Policy Start Weekday', 'Policy Start Date', 'Policy Start Year'], axis=1, inplace=True)\n\n# Align test dataset with training dataset columns\nmissing_cols = set(X_train.columns) - set(df_test_encoded.columns)\nfor col in missing_cols:\n    df_test_encoded[col] = 0  # Add missing columns with 0 values\n\ndf_test_encoded = df_test_encoded[X_train.columns]  # Ensure the same column order\n\n# Predict and prepare submission\nlog_predictions = model.predict(df_test_encoded)\npredictions = np.expm1(log_predictions)  # Apply inverse transformation\n\n# Prepare submission file\nsubmission = pd.DataFrame({\n    'id': df_test['id'],\n    'Premium Amount': predictions.flatten()  # Flatten predictions to a 1D array\n})\n\n# Save to CSV\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Submission file created: submission.csv\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-26T17:46:35.790813Z","iopub.execute_input":"2024-12-26T17:46:35.791145Z","iopub.status.idle":"2024-12-26T17:47:18.801347Z","shell.execute_reply.started":"2024-12-26T17:46:35.791115Z","shell.execute_reply":"2024-12-26T17:47:18.800405Z"}},"outputs":[],"execution_count":null}]}