{"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":"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":"# 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)\nfrom xgboost import XGBRegressor\nfrom sklearn.tree import DecisionTreeRegressor\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":"2025-01-03T12:32:15.775345Z","iopub.execute_input":"2025-01-03T12:32:15.775739Z","iopub.status.idle":"2025-01-03T12:32:17.306072Z","shell.execute_reply.started":"2025-01-03T12:32:15.775686Z","shell.execute_reply":"2025-01-03T12:32:17.305108Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install psynlig","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:17.306995Z","iopub.execute_input":"2025-01-03T12:32:17.307509Z","iopub.status.idle":"2025-01-03T12:32:24.473761Z","shell.execute_reply.started":"2025-01-03T12:32:17.307472Z","shell.execute_reply":"2025-01-03T12:32:24.47252Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n# Scikit-learn modules\nfrom sklearn.preprocessing import LabelEncoder, StandardScaler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import (\n    accuracy_score, confusion_matrix, classification_report, \n    roc_auc_score, roc_curve, mean_squared_error, \n    r2_score, precision_score, recall_score, f1_score\n)\n\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.preprocessing import PolynomialFeatures\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.model_selection import GridSearchCV\n\n# Visualization libraries\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tensorflow.keras.utils import plot_model\nimport plotly.express as px\nfrom psynlig import plot_correlation_heatmap\n# Bokeh for interactive plots\nfrom bokeh.plotting import figure, show, output_notebook\nfrom bokeh.transform import linear_cmap, factor_cmap\nfrom bokeh.palettes import Spectral6, Viridis256\nfrom bokeh.models import ColumnDataSource\nfrom sklearn.model_selection import cross_val_score\n\n# Suppress future warnings\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\n# Enable Bokeh plots in notebooks\noutput_notebook()\n\n# Print confirmation\nprint(\"Libraries successfully imported and updated!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:24.474904Z","iopub.execute_input":"2025-01-03T12:32:24.47521Z","iopub.status.idle":"2025-01-03T12:32:35.161558Z","shell.execute_reply.started":"2025-01-03T12:32:24.475183Z","shell.execute_reply":"2025-01-03T12:32:35.160487Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data=pd.read_csv(\"/kaggle/input/playground-series-s4e12/train.csv\")\ntest_data=pd.read_csv(\"/kaggle/input/playground-series-s4e12/test.csv\")\nsubmission=pd.read_csv(\"/kaggle/input/playground-series-s4e12/sample_submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:35.163798Z","iopub.execute_input":"2025-01-03T12:32:35.16436Z","iopub.status.idle":"2025-01-03T12:32:45.688784Z","shell.execute_reply.started":"2025-01-03T12:32:35.164333Z","shell.execute_reply":"2025-01-03T12:32:45.687984Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:45.69032Z","iopub.execute_input":"2025-01-03T12:32:45.690721Z","iopub.status.idle":"2025-01-03T12:32:46.335814Z","shell.execute_reply.started":"2025-01-03T12:32:45.690659Z","shell.execute_reply":"2025-01-03T12:32:46.334798Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.impute import SimpleImputer\n\ndef impute_by_categories(train_data,test_data, category_columns=['gender', 'education_level', 'exercise_frequency']):\n    \"\"\"\n    Impute missing values for numeric columns based on the median value within each\n    combination of specified categorical variables.\n    \n    Parameters:\n    -----------\n    df_train : pandas.DataFrame\n        Training dataset\n    df_test : pandas.DataFrame\n        Test dataset\n    category_columns : list\n        List of categorical columns to group by for imputation\n    \n    Returns:\n    --------\n    df_train, df_test : tuple of pandas.DataFrame\n        Processed datasets with imputed values\n    \"\"\"\n    # Ensure numeric columns are selected, excluding 'premium_amount'\n    numeric_columns = df_train.select_dtypes(include=[np.number]).columns.drop('premium_amount')\n\n    # Combine train and test for consistent category handling\n    df_train['is_train'] = True\n    df_test['is_train'] = False\n    combined = pd.concat([df_train, df_test], ignore_index=True)\n\n    # Impute missing values group by group\n    imputer = SimpleImputer(strategy='median')\n    for group_values, group_df in combined.groupby(category_columns):\n        mask = (combined[category_columns] == pd.Series(group_values, index=category_columns)).all(axis=1)\n        if mask.sum() > 0:\n            combined.loc[mask, numeric_columns] = imputer.fit_transform(group_df[numeric_columns])\n\n    # Split the combined dataset back into train and test\n    df_train = combined[combined['is_train']].drop(columns='is_train')\n    df_test = combined[~combined['is_train']].drop(columns='is_train')\n\n    return train_data,test_data\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:46.337049Z","iopub.execute_input":"2025-01-03T12:32:46.337396Z","iopub.status.idle":"2025-01-03T12:32:46.357162Z","shell.execute_reply.started":"2025-01-03T12:32:46.337368Z","shell.execute_reply":"2025-01-03T12:32:46.356208Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:46.358Z","iopub.execute_input":"2025-01-03T12:32:46.358271Z","iopub.status.idle":"2025-01-03T12:32:47.113769Z","shell.execute_reply.started":"2025-01-03T12:32:46.358248Z","shell.execute_reply":"2025-01-03T12:32:47.112792Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:47.114754Z","iopub.execute_input":"2025-01-03T12:32:47.115119Z","iopub.status.idle":"2025-01-03T12:32:47.14067Z","shell.execute_reply.started":"2025-01-03T12:32:47.115086Z","shell.execute_reply":"2025-01-03T12:32:47.139747Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:47.141926Z","iopub.execute_input":"2025-01-03T12:32:47.142303Z","iopub.status.idle":"2025-01-03T12:32:47.764896Z","shell.execute_reply.started":"2025-01-03T12:32:47.142267Z","shell.execute_reply":"2025-01-03T12:32:47.764044Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.dropna(inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:47.76579Z","iopub.execute_input":"2025-01-03T12:32:47.766053Z","iopub.status.idle":"2025-01-03T12:32:48.488048Z","shell.execute_reply.started":"2025-01-03T12:32:47.76603Z","shell.execute_reply":"2025-01-03T12:32:48.487141Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:48.488969Z","iopub.execute_input":"2025-01-03T12:32:48.489223Z","iopub.status.idle":"2025-01-03T12:32:48.707093Z","shell.execute_reply.started":"2025-01-03T12:32:48.489202Z","shell.execute_reply":"2025-01-03T12:32:48.706044Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Summary statistics\nsummary = train_data.describe()\n\n# Create the heatmap\nfig = px.imshow(\n    summary,\n    color_continuous_scale=\"RdYlGn\",\n    title=\"Heatmap for Summary Statistics\",\n    labels={\"x\": \"Columns\", \"y\": \"Statistics\"}  # Axis labels\n)\n\nfig.update_layout(\n    title_font_size=20,\n    xaxis_title=\"Data Columns\",\n    yaxis_title=\"Summary Metrics\",\n    xaxis_tickangle=45\n)\n\n# Show the plot\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:48.70799Z","iopub.execute_input":"2025-01-03T12:32:48.708241Z","iopub.status.idle":"2025-01-03T12:32:49.847732Z","shell.execute_reply.started":"2025-01-03T12:32:48.708219Z","shell.execute_reply":"2025-01-03T12:32:49.846816Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# EDA","metadata":{}},{"cell_type":"code","source":"neumirical_data = train_data.select_dtypes(include=[\"float64\", \"int64\"])\nsns.pairplot(data=neumirical_data, diag_kind='kde', markers='+')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:32:49.850615Z","iopub.execute_input":"2025-01-03T12:32:49.850898Z","iopub.status.idle":"2025-01-03T12:33:59.655616Z","shell.execute_reply.started":"2025-01-03T12:32:49.850874Z","shell.execute_reply":"2025-01-03T12:33:59.654534Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"p = figure(\n    title=\"Annual Income  and Premium Amount\",\n    x_axis_label=\"Annual Income\",\n    y_axis_label=\"Premium Amount\",\n    width=800, height=600\n)\np.scatter(train_data[\"Annual Income\"], train_data[\"Premium Amount\"], size=8, color=\"navy\", alpha=0.6)\noutput_notebook()\nshow(p)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:33:59.657155Z","iopub.execute_input":"2025-01-03T12:33:59.657424Z","iopub.status.idle":"2025-01-03T12:34:00.35003Z","shell.execute_reply.started":"2025-01-03T12:33:59.657402Z","shell.execute_reply":"2025-01-03T12:34:00.348456Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.pairplot(\n    train_data[[\"Annual Income\", \"Credit Score\", \"Premium Amount\"]],\n    hue=\"Premium Amount\",\n    palette=\"viridis\"\n)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:34:00.351266Z","iopub.execute_input":"2025-01-03T12:34:00.351676Z","iopub.status.idle":"2025-01-03T12:35:48.086176Z","shell.execute_reply.started":"2025-01-03T12:34:00.351638Z","shell.execute_reply":"2025-01-03T12:35:48.084985Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numerical_columns = train_data.select_dtypes(include=['int', 'float']).columns\n\nfor col in numerical_columns:\n    plt.figure(figsize=(8, 6))\n    sns.histplot(train_data[col], kde=True, color='skyblue')\n    plt.title(f'Distribution of {col}', fontsize=15)\n    plt.xlabel(col, fontsize=12)\n    plt.ylabel('Frequency', fontsize=12)\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:35:48.087176Z","iopub.execute_input":"2025-01-03T12:35:48.087453Z","iopub.status.idle":"2025-01-03T12:36:07.127375Z","shell.execute_reply.started":"2025-01-03T12:35:48.08743Z","shell.execute_reply":"2025-01-03T12:36:07.126362Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"datetime_columns = train_data.select_dtypes(include=['object']).columns\n\nfor col in datetime_columns:\n    try:\n        # Convert the column to datetime format\n        train[col] = pd.to_datetime(train[col], errors='raise')\n        test[col] = pd.to_datetime(test[col], errors='raise')\n        \n        # Convert datetime to epoch time\n        train[col] = train[col].astype(np.int64) / 10**9\n        test[col] = test[col].astype(np.int64) / 10**9\n\n        print(f\"Converted '{col}' to epoch time.\")\n    except Exception:\n        continue","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:07.128514Z","iopub.execute_input":"2025-01-03T12:36:07.1289Z","iopub.status.idle":"2025-01-03T12:36:07.169901Z","shell.execute_reply.started":"2025-01-03T12:36:07.128864Z","shell.execute_reply":"2025-01-03T12:36:07.168882Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"datetime_columns = test_data.select_dtypes(include=['object']).columns\n\nfor col in datetime_columns:\n    try:\n        # Convert the column to datetime format\n        train[col] = pd.to_datetime(train[col], errors='raise')\n        test[col] = pd.to_datetime(test[col], errors='raise')\n        \n        # Convert datetime to epoch time\n        train[col] = train[col].astype(np.int64) / 10**9\n        test[col] = test[col].astype(np.int64) / 10**9\n\n        print(f\"Converted '{col}' to epoch time.\")\n    except Exception:\n        continue","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:07.170832Z","iopub.execute_input":"2025-01-03T12:36:07.171091Z","iopub.status.idle":"2025-01-03T12:36:07.28069Z","shell.execute_reply.started":"2025-01-03T12:36:07.171067Z","shell.execute_reply":"2025-01-03T12:36:07.279605Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"le = LabelEncoder()\n\nfor col in train_data.columns:\n    if train_data[col].dtype == 'object':  \n        train_data[col] = le.fit_transform(train_data[col])  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:07.28181Z","iopub.execute_input":"2025-01-03T12:36:07.282192Z","iopub.status.idle":"2025-01-03T12:36:08.575724Z","shell.execute_reply.started":"2025-01-03T12:36:07.282157Z","shell.execute_reply":"2025-01-03T12:36:08.574833Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"le = LabelEncoder()\n\nfor col in test_data.columns:\n    if test_data[col].dtype == 'object':  \n        test_data[col] = le.fit_transform(test_data[col])  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:08.576776Z","iopub.execute_input":"2025-01-03T12:36:08.577131Z","iopub.status.idle":"2025-01-03T12:36:10.924196Z","shell.execute_reply.started":"2025-01-03T12:36:08.577096Z","shell.execute_reply":"2025-01-03T12:36:10.923186Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from psynlig import plot_correlation_heatmap\nplt.style.use('seaborn-talk')\nkwargs = {\n    'heatmap': {\n        'vmin': -1,\n        'vmax': 1,\n        'cmap': 'viridis',\n    },\n    'figure': {\n        'figsize': (10, 8),\n    },\n}\n\nplot_correlation_heatmap(train_data, bubble=True, annotate=False, **kwargs)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:10.925265Z","iopub.execute_input":"2025-01-03T12:36:10.925622Z","iopub.status.idle":"2025-01-03T12:36:12.802083Z","shell.execute_reply.started":"2025-01-03T12:36:10.925587Z","shell.execute_reply":"2025-01-03T12:36:12.801024Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# MODEL","metadata":{}},{"cell_type":"code","source":" \nX_train = train_data.drop(columns=[\"Premium Amount\"])\ny_train = train_data[\"Premium Amount\"]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:12.803064Z","iopub.execute_input":"2025-01-03T12:36:12.803321Z","iopub.status.idle":"2025-01-03T12:36:12.828802Z","shell.execute_reply.started":"2025-01-03T12:36:12.803299Z","shell.execute_reply":"2025-01-03T12:36:12.827993Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputer = SimpleImputer(strategy='median')\nX_train = pd.DataFrame(imputer.fit_transform(X_train), columns=X_train.columns)\ntest_data = pd.DataFrame(imputer.transform(test_data), columns=test_data.columns)\n\nif test_data.isna().sum().sum() > 0:\n    print(\"Test data still contains NaNs after imputation.\")\nelse:\n    print(\"Imputation completed successfully. No NaNs in test data.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:12.82967Z","iopub.execute_input":"2025-01-03T12:36:12.830047Z","iopub.status.idle":"2025-01-03T12:36:14.103297Z","shell.execute_reply.started":"2025-01-03T12:36:12.830013Z","shell.execute_reply":"2025-01-03T12:36:14.10222Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputer = SimpleImputer(strategy='median')\nX_train = pd.DataFrame(imputer.fit_transform(X_train), columns=X_train.columns)\ntest = pd.DataFrame(imputer.transform(test_data), columns=test_data.columns)\n\nscaler = StandardScaler()\nX_train = pd.DataFrame(scaler.fit_transform(X_train), columns=X_train.columns)\ntest = pd.DataFrame(scaler.transform(test), columns=test_data.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:14.104258Z","iopub.execute_input":"2025-01-03T12:36:14.10453Z","iopub.status.idle":"2025-01-03T12:36:15.469785Z","shell.execute_reply.started":"2025-01-03T12:36:14.104505Z","shell.execute_reply":"2025-01-03T12:36:15.468652Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Instantiate the model\nfrom sklearn.ensemble import GradientBoostingRegressor\nmodel = GradientBoostingRegressor(random_state=42)\n# model.fit(X_train, y_train)\n\n# Fit the model\nmodel.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:36:15.471621Z","iopub.execute_input":"2025-01-03T12:36:15.471931Z","iopub.status.idle":"2025-01-03T12:38:29.557302Z","shell.execute_reply.started":"2025-01-03T12:36:15.471905Z","shell.execute_reply":"2025-01-03T12:38:29.556257Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Predictions\ntest_predictions = model.predict(test)\n\n# Model evaluation\ny_train_pred = model.predict(X_train)\nmse = mean_squared_error(y_train, y_train_pred)\nr2 = r2_score(y_train, y_train_pred)\n\nprint(f\"Mean Squared Error (MSE): {mse}\")\nprint(f\"R-squared (R2): {r2}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:38:29.55827Z","iopub.execute_input":"2025-01-03T12:38:29.558604Z","iopub.status.idle":"2025-01-03T12:38:31.718275Z","shell.execute_reply.started":"2025-01-03T12:38:29.558577Z","shell.execute_reply":"2025-01-03T12:38:31.71725Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# SUBMISSION","metadata":{}},{"cell_type":"code","source":"# Create submission\nsubmission = pd.DataFrame({\n    'id': test_data['id'],  # Ensure this is the correct ID column\n    'Premium Amount': test_predictions\n})\n\n# Save to CSV\nsubmission.to_csv('submission_final.csv', index=False)\nprint(\"Submission file 'submission_final.csv' created successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:38:31.719173Z","iopub.execute_input":"2025-01-03T12:38:31.719441Z","iopub.status.idle":"2025-01-03T12:38:33.789629Z","shell.execute_reply.started":"2025-01-03T12:38:31.719417Z","shell.execute_reply":"2025-01-03T12:38:33.788365Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-03T12:38:33.790683Z","iopub.execute_input":"2025-01-03T12:38:33.791083Z","iopub.status.idle":"2025-01-03T12:38:33.802771Z","shell.execute_reply.started":"2025-01-03T12:38:33.791038Z","shell.execute_reply":"2025-01-03T12:38:33.801764Z"}},"outputs":[],"execution_count":null}]}