{"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)\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-24T19:33:36.129287Z","iopub.execute_input":"2024-12-24T19:33:36.129934Z","iopub.status.idle":"2024-12-24T19:33:36.146655Z","shell.execute_reply.started":"2024-12-24T19:33:36.129882Z","shell.execute_reply":"2024-12-24T19:33:36.145167Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install psynlig\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:36.148951Z","iopub.execute_input":"2024-12-24T19:33:36.149444Z","iopub.status.idle":"2024-12-24T19:33:41.277503Z","shell.execute_reply.started":"2024-12-24T19:33:36.149396Z","shell.execute_reply":"2024-12-24T19:33:41.27537Z"}},"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\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\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":"2024-12-24T19:33:41.280522Z","iopub.execute_input":"2024-12-24T19:33:41.280977Z","iopub.status.idle":"2024-12-24T19:33:41.321677Z","shell.execute_reply.started":"2024-12-24T19:33:41.280932Z","shell.execute_reply":"2024-12-24T19:33:41.319755Z"}},"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":"2024-12-24T19:33:41.324314Z","iopub.execute_input":"2024-12-24T19:33:41.324824Z","iopub.status.idle":"2024-12-24T19:33:49.857041Z","shell.execute_reply.started":"2024-12-24T19:33:41.324777Z","shell.execute_reply":"2024-12-24T19:33:49.855776Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:49.858303Z","iopub.execute_input":"2024-12-24T19:33:49.858667Z","iopub.status.idle":"2024-12-24T19:33:50.509353Z","shell.execute_reply.started":"2024-12-24T19:33:49.858635Z","shell.execute_reply":"2024-12-24T19:33:50.507901Z"}},"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":"2024-12-24T19:33:50.511135Z","iopub.execute_input":"2024-12-24T19:33:50.511464Z","iopub.status.idle":"2024-12-24T19:33:50.523597Z","shell.execute_reply.started":"2024-12-24T19:33:50.511435Z","shell.execute_reply":"2024-12-24T19:33:50.521882Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:50.525518Z","iopub.execute_input":"2024-12-24T19:33:50.526129Z","iopub.status.idle":"2024-12-24T19:33:51.093381Z","shell.execute_reply.started":"2024-12-24T19:33:50.526078Z","shell.execute_reply":"2024-12-24T19:33:51.091887Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:51.095044Z","iopub.execute_input":"2024-12-24T19:33:51.09537Z","iopub.status.idle":"2024-12-24T19:33:51.126327Z","shell.execute_reply.started":"2024-12-24T19:33:51.095341Z","shell.execute_reply":"2024-12-24T19:33:51.124731Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:51.131104Z","iopub.execute_input":"2024-12-24T19:33:51.131527Z","iopub.status.idle":"2024-12-24T19:33:51.776471Z","shell.execute_reply.started":"2024-12-24T19:33:51.131493Z","shell.execute_reply":"2024-12-24T19:33:51.775081Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.dropna(inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:51.779344Z","iopub.execute_input":"2024-12-24T19:33:51.77967Z","iopub.status.idle":"2024-12-24T19:33:52.509776Z","shell.execute_reply.started":"2024-12-24T19:33:51.779641Z","shell.execute_reply":"2024-12-24T19:33:52.508429Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:33:52.511167Z","iopub.execute_input":"2024-12-24T19:33:52.511559Z","iopub.status.idle":"2024-12-24T19:33:52.754647Z","shell.execute_reply.started":"2024-12-24T19:33:52.511523Z","shell.execute_reply":"2024-12-24T19:33:52.753217Z"}},"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":"2024-12-24T19:33:52.755925Z","iopub.execute_input":"2024-12-24T19:33:52.756272Z","iopub.status.idle":"2024-12-24T19:33:53.079899Z","shell.execute_reply.started":"2024-12-24T19:33:52.756236Z","shell.execute_reply":"2024-12-24T19:33:53.078304Z"}},"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":"2024-12-24T19:33:53.081661Z","iopub.execute_input":"2024-12-24T19:33:53.082219Z","iopub.status.idle":"2024-12-24T19:35:30.802016Z","shell.execute_reply.started":"2024-12-24T19:33:53.082174Z","shell.execute_reply":"2024-12-24T19:35:30.799938Z"}},"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":"2024-12-24T19:35:30.804199Z","iopub.execute_input":"2024-12-24T19:35:30.80474Z","iopub.status.idle":"2024-12-24T19:35:31.582576Z","shell.execute_reply.started":"2024-12-24T19:35:30.804666Z","shell.execute_reply":"2024-12-24T19:35:31.579648Z"}},"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":"2024-12-24T19:35:31.585119Z","iopub.execute_input":"2024-12-24T19:35:31.58623Z","iopub.status.idle":"2024-12-24T19:37:33.579216Z","shell.execute_reply.started":"2024-12-24T19:35:31.586096Z","shell.execute_reply":"2024-12-24T19:37:33.57745Z"}},"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":"2024-12-24T19:37:33.581198Z","iopub.execute_input":"2024-12-24T19:37:33.581676Z","iopub.status.idle":"2024-12-24T19:37:53.889818Z","shell.execute_reply.started":"2024-12-24T19:37:33.581629Z","shell.execute_reply":"2024-12-24T19:37:53.888122Z"}},"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":"2024-12-24T19:37:53.891474Z","iopub.execute_input":"2024-12-24T19:37:53.892028Z","iopub.status.idle":"2024-12-24T19:37:53.955216Z","shell.execute_reply.started":"2024-12-24T19:37:53.891989Z","shell.execute_reply":"2024-12-24T19:37:53.95386Z"}},"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":"2024-12-24T19:37:53.956499Z","iopub.execute_input":"2024-12-24T19:37:53.956971Z","iopub.status.idle":"2024-12-24T19:37:54.055036Z","shell.execute_reply.started":"2024-12-24T19:37:53.956922Z","shell.execute_reply":"2024-12-24T19:37:54.053516Z"}},"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":"2024-12-24T19:37:54.056551Z","iopub.execute_input":"2024-12-24T19:37:54.057043Z","iopub.status.idle":"2024-12-24T19:37:55.557473Z","shell.execute_reply.started":"2024-12-24T19:37:54.056994Z","shell.execute_reply":"2024-12-24T19:37:55.556055Z"}},"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":"2024-12-24T19:37:55.558995Z","iopub.execute_input":"2024-12-24T19:37:55.559333Z","iopub.status.idle":"2024-12-24T19:37:58.251301Z","shell.execute_reply.started":"2024-12-24T19:37:55.559302Z","shell.execute_reply":"2024-12-24T19:37:58.249784Z"}},"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":"2024-12-24T19:37:58.25268Z","iopub.execute_input":"2024-12-24T19:37:58.253082Z","iopub.status.idle":"2024-12-24T19:38:00.670971Z","shell.execute_reply.started":"2024-12-24T19:37:58.25305Z","shell.execute_reply":"2024-12-24T19:38:00.669523Z"}},"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":"2024-12-24T19:38:00.672243Z","iopub.execute_input":"2024-12-24T19:38:00.67261Z","iopub.status.idle":"2024-12-24T19:38:00.710009Z","shell.execute_reply.started":"2024-12-24T19:38:00.672577Z","shell.execute_reply":"2024-12-24T19:38:00.708661Z"}},"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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:38:00.711557Z","iopub.execute_input":"2024-12-24T19:38:00.712075Z","iopub.status.idle":"2024-12-24T19:38:02.111584Z","shell.execute_reply.started":"2024-12-24T19:38:00.712025Z","shell.execute_reply":"2024-12-24T19:38:02.110092Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scaler = 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":"2024-12-24T19:38:02.11301Z","iopub.execute_input":"2024-12-24T19:38:02.113363Z","iopub.status.idle":"2024-12-24T19:38:02.280786Z","shell.execute_reply.started":"2024-12-24T19:38:02.11333Z","shell.execute_reply":"2024-12-24T19:38:02.279326Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = LinearRegression()\nmodel.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:38:02.282233Z","iopub.execute_input":"2024-12-24T19:38:02.282714Z","iopub.status.idle":"2024-12-24T19:38:02.646785Z","shell.execute_reply.started":"2024-12-24T19:38:02.282638Z","shell.execute_reply":"2024-12-24T19:38:02.64561Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions = model.predict(test)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:38:02.647559Z","iopub.execute_input":"2024-12-24T19:38:02.647934Z","iopub.status.idle":"2024-12-24T19:38:02.687833Z","shell.execute_reply.started":"2024-12-24T19:38:02.647898Z","shell.execute_reply":"2024-12-24T19:38:02.68552Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# SUBMISSION","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'id': test_data['id'],  # Use the correct ID column from your test data\n    'Premium Amount': test_predictions\n})\n\n# Save to CSV\nsubmission.to_csv('submission_final.csv', index=False)\n\nprint(\"Submission file 'submission_final.csv' created successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:38:02.697976Z","iopub.execute_input":"2024-12-24T19:38:02.698392Z","iopub.status.idle":"2024-12-24T19:38:04.55213Z","shell.execute_reply.started":"2024-12-24T19:38:02.698359Z","shell.execute_reply":"2024-12-24T19:38:04.550643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T19:53:03.099616Z","iopub.execute_input":"2024-12-24T19:53:03.100096Z","iopub.status.idle":"2024-12-24T19:53:03.114651Z","shell.execute_reply.started":"2024-12-24T19:53:03.100061Z","shell.execute_reply":"2024-12-24T19:53:03.113188Z"}},"outputs":[],"execution_count":null}]}