{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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":"gpu","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30805,"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},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install xgbtune","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import StandardScaler, FunctionTransformer,OneHotEncoder\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OrdinalEncoder\nfrom sklearn.utils.validation import check_array\nimport xgboost as xgb\nfrom xgbtune import tune_xgb_model\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true},"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\ntrain.drop('id', axis=1, inplace=True)\ntest.drop('id', axis=1, inplace=True) ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def date(df):\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n    \n    df['Year'] = df['Policy Start Date'].dt.year\n    df['Month'] = df['Policy Start Date'].dt.month\n    df['Day'] = df['Policy Start Date'].dt.day\n    df['Quarter'] = df['Policy Start Date'].dt.quarter\n    df['Day of Week'] = df['Policy Start Date'].dt.dayofweek\n    \n    df.drop('Policy Start Date', axis=1, inplace=True)\n    \n    return df\n\ntrain = date(train)\ntest = date(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[\"Annual_Income_Health_Score_Ratio\"] = train[\"Health Score\"] / train[\"Annual Income\"]\ntest[\"Annual_Income_Health_Score_Ratio\"] = test[\"Health Score\"] / test[\"Annual Income\"]\n\ntrain[\"Annual_Income_Age_Ratio\"] = train[\"Annual Income\"] / train[\"Age\"]\ntest[\"Annual_Income_Age_Ratio\"] = test[\"Annual Income\"] / test[\"Age\"]\n\ntrain[\"Credit_Age\"] = train[\"Credit Score\"] / train[\"Age\"]\ntest[\"Credit_Age\"] = test[\"Credit Score\"] / test[\"Age\"]\n\ntrain[\"Vehicle_Age_Insurance_Duration\"] = train[\"Vehicle Age\"] / train[\"Insurance Duration\"]\ntest[\"Vehicle_Age_Insurance_Duration\"] = test[\"Vehicle Age\"] / test[\"Insurance Duration\"]\n\naverage_income = train['Annual Income'].mean()\ntrain['Is High Income'] = (train['Annual Income'] > average_income).astype(int)\ntest['Is High Income'] = (test['Annual Income'] > average_income).astype(int)\n\ntrain['Property Location Type'] = train['Location'] + '_' + train['Property Type']\ntest['Property Location Type'] = test['Location'] + '_' + test['Property Type']\n\n\ntrain.drop('Property Type', axis=1, inplace=True)\ntest.drop('Property Type', axis=1, inplace=True) ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def column_summary(df):\n    summary_data = []\n    \n    for col_name in df.columns:\n        col_dtype = df[col_name].dtype\n        num_of_nulls = df[col_name].isnull().sum()\n        num_of_non_nulls = df[col_name].notnull().sum()\n        num_of_distinct_values = df[col_name].nunique()\n        \n        if num_of_distinct_values <= 10:\n            distinct_values_counts = df[col_name].value_counts().to_dict()\n        else:\n            top_10_values_counts = df[col_name].value_counts().head(10).to_dict()\n            distinct_values_counts = {k: v for k, v in sorted(top_10_values_counts.items(), key=lambda item: item[1], reverse=True)}\n\n        summary_data.append({\n            'col_name': col_name,\n            'col_dtype': col_dtype,\n            'num_of_nulls': num_of_nulls,\n            'num_of_non_nulls': num_of_non_nulls,\n            'num_of_distinct_values': num_of_distinct_values,\n        })\n    \n    summary_df = pd.DataFrame(summary_data)\n    return summary_df\n\nsummary_df = column_summary(train)\n\ndisplay(summary_df)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def reduce_memory_usage(df):\n    for col in df.columns:\n        col_type = df[col].dtypes\n        if col_type == 'float64':\n            df[col] = df[col].astype('float32')\n        elif col_type == 'int64':\n            df[col] = df[col].astype('int32')\n    return df\n\ntrain = reduce_memory_usage(train)\ntest = reduce_memory_usage(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target = 'Premium Amount'\n\nnumerical_cols = train.select_dtypes(include=['float32', 'int32']).columns.tolist()\nif target in numerical_cols:\n    numerical_cols.remove(target)\n\ncategorical_cols = train.select_dtypes(include=['object']).columns.tolist()\n\n\npreprocessing = ColumnTransformer([\n    ('num', make_pipeline(SimpleImputer(strategy='mean'), StandardScaler()), numerical_cols),\n    ('cat', make_pipeline(SimpleImputer(strategy='constant', fill_value='unknown'),\n                          OneHotEncoder(handle_unknown='ignore')), categorical_cols)\n], remainder='drop')\n\nX_train = train.drop(columns=[target]).copy()\ny_train = np.log1p(train[target])  \n\nX_train_preprocessed = preprocessing.fit_transform(X_train)\n\nX_test_preprocessed = preprocessing.transform(test)\n\n\nparams = {'eval_metric': 'rmsle', 'tree_method': 'hist', 'device': 'cuda'}\n\nparams, round_count = tune_xgb_model(params, X_train_preprocessed, y_train)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dtrain = xgb.DMatrix(X_train_preprocessed, label=y_train)\nfinal_model = xgb.train(params, dtrain, num_boost_round=round_count)\n\ndtest = xgb.DMatrix(X_test_preprocessed)\ny_pred = final_model.predict(dtest)\ny_pred_final = np.expm1(y_pred)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.read_csv(\"/kaggle/input/playground-series-s4e12/sample_submission.csv\")\noutput = pd.DataFrame({\"id\":sub.id, \"Premium Amount\":y_pred_final})\noutput.to_csv('submission.csv', index=False)\n\n\noutput.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}