{"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":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q scikit-learn==1.5.2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T14:47:56.507085Z","iopub.execute_input":"2024-12-27T14:47:56.507428Z","iopub.status.idle":"2024-12-27T14:48:09.555231Z","shell.execute_reply.started":"2024-12-27T14:47:56.507389Z","shell.execute_reply":"2024-12-27T14:48:09.554115Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sklearn\nsklearn.__version__","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T14:48:09.556487Z","iopub.execute_input":"2024-12-27T14:48:09.556819Z","iopub.status.idle":"2024-12-27T14:48:10.247248Z","shell.execute_reply.started":"2024-12-27T14:48:09.556789Z","shell.execute_reply":"2024-12-27T14:48:10.246437Z"}},"outputs":[],"execution_count":null},{"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\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns \nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.model_selection import train_test_split\nimport optuna\nfrom sklearn.metrics import root_mean_squared_log_error\nimport lightgbm as lgb","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-12-27T14:48:10.249222Z","iopub.execute_input":"2024-12-27T14:48:10.249617Z","iopub.status.idle":"2024-12-27T14:48:12.956334Z","shell.execute_reply.started":"2024-12-27T14:48:10.24959Z","shell.execute_reply":"2024-12-27T14:48:12.955474Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" **Dataset Overview**","metadata":{}},{"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\")\ntrain.head()","metadata":{"trusted":true,"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-12-27T14:48:12.960201Z","iopub.execute_input":"2024-12-27T14:48:12.960535Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Select id column for submission \nid_column=test['id']\n\n#Define target column\ntarget_column='Premium Amount'\n\n#Select categorical columns and numerical columns\ncat_columns=train.select_dtypes(include='object').columns\nnum_columns=train.select_dtypes(include='float64').columns\n\n#Print out column information \nprint('target column:',target_column)\nprint(\"\\ncategorical columns:\",cat_columns)\nprint(\"\\nnumerical columns\",num_columns)","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.describe().round(2)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[cat_columns].describe()#.round(2)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for column in cat_columns:\n    num_unique=train[column].nunique()\n    print(f\"'{column}'has {num_unique}unique categorical values\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for column in cat_columns:\n    print(f\"\\n Top value counts in '{column}':\\n {train[column].value_counts().head()}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Heatmap of nan values\nplt.figure(figsize=(15,9))\nplt.title(\"Visualizing missing values\")\nsns.heatmap(train.isnull(),cbar=False,cmap=sns.color_palette('magma'),yticklabels=False)\nplt.show()","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Correlation Matrix\ncorr_matrix=train[num_columns].corr()\nplt.figure(figsize=(12,8))\nplt.title('Correlation Matrix',fontsize=16)\nsns.heatmap(corr_matrix,annot=True,fmt=\".2f\",cmap=\"coolwarm\",cbar=True,linewidths=0.5)\nplt.show()","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Data Preprocessing**","metadata":{}},{"cell_type":"code","source":"def date(df):\n    df['Policy Start Date']=pd.to_datetime(df['Policy Start Date'])\n    df['Year']=df['Policy Start Date'].dt.year\n    df['Day']=df['Policy Start Date'].dt.day\n    df['Month']=df['Policy Start Date'].dt.month\n    df['Month_name']=df['Policy Start Date'].dt.month_name()\n    df[\"Day_of_week\"]=df['Policy Start Date'].dt.day_name()\n    df[\"Week\"]=df['Policy Start Date'].dt.isocalendar().week\n    \n    min_year=df[\"Year\"].min()\n    max_year=df[\"Year\"].max()\n    df['Year_sin']=np.sin(2*np.pi*(df['Year']-min_year)/(max_year-min_year))\n    df[\"Year_cos\"]=np.cos(2*np.pi*(df['Year']-min_year)/(max_year-min_year))\n    df['Month_sin']=np.sin(2*np.pi*df['Month']/12)\n    df['Month_cos']=np.cos(2*np.pi*df[\"Month\"]/12)\n    df['Day_sin']=np.sin(2*np.pi*df['Day']/31)\n    df[\"Day_cos\"]=np.cos(2*np.pi*df[\"Day\"]/31)\n    \n    df.drop(columns='Policy Start Date',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.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Splitting Data: Features and Target","metadata":{}},{"cell_type":"code","source":"#Split data into features and target\nx=train.drop(columns=[target_column,\"id\",\"Year\",\"Month\",\"Day\",\"Week\"])\ny=train[target_column]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define features and target\nnum_features = [\n    'Age', 'Annual Income', 'Number of Dependents', 'Health Score', \n    'Previous Claims', 'Vehicle Age', 'Credit Score', 'Insurance Duration', \n    'Year_sin', 'Year_cos', 'Month_sin', 'Month_cos', 'Day_sin', 'Day_cos'\n]\ncat_features = [\n    'Gender', 'Marital Status', 'Education Level', 'Occupation', 'Location',\n    'Policy Type', 'Customer Feedback', 'Smoking Status', 'Exercise Frequency', \n    'Property Type', 'Month_name', 'Day_of_week'\n]\ntarget_column = 'Premium Amount'\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Handling missing values and Preprocessing Pipeline","metadata":{}},{"cell_type":"code","source":"num_pipeline=Pipeline(steps=[\n    ('imputer',SimpleImputer(strategy='median'))\n])\n\ncat_pipeline=Pipeline(steps=[\n    ('imputer',SimpleImputer(strategy='constant',fill_value=\"unknown\")),\n    (\"encode\",OneHotEncoder(handle_unknown=\"ignore\"))\n    \n])\n\n#combine pipeline into a colimn transformer\ntransformer=ColumnTransformer(transformers=[\n    (\"num\",num_pipeline,num_features),\n    (\"cat\",cat_pipeline,cat_features)\n])\n\n#preprocess train and test data\nx_process=transformer.fit_transform(x)\ntest_process=transformer.fit_transform(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Splitting Data : Training and Testing**","metadata":{}},{"cell_type":"code","source":"xtrain,xtest,ytrain,ytest=train_test_split(x_process,y,test_size=0.2,random_state=42)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Hyper parameter tuning with optuna","metadata":{}},{"cell_type":"code","source":"#Define optuna\ndef objective(trial):    \n    param={\n        'objective':'regression',\n        'metric':'rmse',\n        'boosting_type':trial.suggest_categorical('boost_type',['gbdt',\"dart\"]),\n        \"num_leaves\":trial.suggest_int(\" num_leaves\",200,512),\n        \"learning_rate\":trial.suggest_loguniform(\" learning_rate\",1e-4,1e-1),\n        \"feature_fraction\":trial.suggest_uniform(\" feature_fraction\",0.6,1.0),\n        \n        'bagging_fraction':trial.suggest_uniform('bagging_fraction',0.6,1.0),\n        'bagging_freq':trial.suggest_int(\"bagging_freq\",5,12),\n        'min_data_in_leaf':trial.suggest_int(\"min_data_in_leaf\",20,100),\n        'max_depth':trial.suggest_int(\"max_depth\",-1,16),\n        \" lambda_l1\":trial.suggest_loguniform(\"lambda_l1\", 1e-4,10.0),\n        'lambda_l2':trial.suggest_loguniform(\"lambda_l2\",1e-4,10.0),\n        'device_type':'gpu',\n        'seed':42\n        \n        \n    }\n    #create a LightGBM dataset\n    \n    dtrain=lgb.Dataset(xtrain,label=ytrain)\n    dtest=lgb.Dataset(xtest,label=ytest,reference=dtrain)\n    #train LightGBM model\n    model=lgb.train(param,dtrain,valid_sets=[dtest])\n    #predict on test sets\n    y_test_pred=model.predict(xtest)\n    \n    #Compute RMSLE\n    rmsle=root_mean_squared_log_error(ytest,np.maximum(y_test_pred,0))\n    \n    \n    return rmsle\n\n\n#Run optuna Study\nstudy=optuna.create_study(direction=\"minimize\")\nstudy.optimize(objective,n_trials=1)#use 100 trial to find best parameters  ","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Create model","metadata":{}},{"cell_type":"code","source":"#study.best_params","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#study.best_params\nbest_params = {\n    'boosting_type': 'dart',\n    'num_leaves': 384,\n    'learning_rate': 0.024680120465142227,\n    'feature_fraction': 0.9883068358315126,\n    'bagging_fraction': 0.7201712704805496,\n    'bagging_freq': 7,\n    'min_data_in_leaf': 50,\n    'max_depth': 15,\n    'lambda_l1': 0.0011290211269753322,\n    'lambda_l2': 3.056310541294088,\n    'seed': 42\n}","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train final model with best parameters\n\nfinal_model = lgb.train(\n    best_params,\n    lgb.Dataset(x_process, label=y),\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# evaluate model","metadata":{}},{"cell_type":"code","source":"y_pred = final_model.predict(xtest)\n\n# Calcul des métriques\nrmsle = root_mean_squared_log_error(y, y_pred)\nrmsle","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Create CSV file for submission ","metadata":{}},{"cell_type":"code","source":"# Make predictions on the test set\ntest_predictions = final_model.predict(test_process, num_iteration=final_model.best_iteration)\n\n# Prepare submission file\nsubmission = pd.DataFrame({'id': id_column, 'Premium Amount': test_predictions})\nsubmission.to_csv(\"or_submission.csv\", index=False)","metadata":{"trusted":true,"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Thanks","metadata":{}}]}