{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"markdown","source":"## Imports","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as ticker\nimport seaborn as sns\nfrom sklearn.metrics import mean_squared_log_error\nimport pickle\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import StratifiedKFold\nimport xgboost as xgb\nfrom xgboost import plot_importance\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\npd.options.display.max_rows=200\npd.options.display.max_columns=200\npd.options.display.max_seq_items=200\npd.options.display.float_format = '{:.6f}'.format\n\ntrain = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\nsample_sub = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## EDA","metadata":{}},{"cell_type":"code","source":"train.shape, test.shape","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info(), test.info()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Preprocessing","metadata":{}},{"cell_type":"code","source":"def preprocessing(df):\n    df['Gender'] = df['Gender'].map({'Female': 0, 'Male': 1})\n    df['Marital Status'] = df['Marital Status'].map({'Married': 0, 'Divorced': 1, 'Single': 2})\n    df['Education Level'] = df['Education Level'].map({'PhD': 0, \"Master's\": 1, \"Bachelor's\": 2, 'High School': 3})\n    df['Occupation'] = df['Occupation'].map({'Self-Employed': 0, 'Employed': 1, 'Unemployed': 2})\n    df['Policy Type'] = df['Policy Type'].map({'Premium': 0, 'Comprehensive': 1, 'Basic': 2})\n    df['Customer Feedback'] = df['Customer Feedback'].map({'Good': 0, 'Average': 1, 'Poor': 2})\n    df['Smoking Status'] = df['Smoking Status'].map({'No': 0, 'Yes': 1})\n    df['Exercise Frequency'] = df['Exercise Frequency'].map({'Daily': 0, 'Weekly': 1, 'Monthly': 2, 'Rarely': 3})\n    df['Property Type'] = df['Property Type'].map({'House': 0, 'Condo': 1, 'Apartment': 2})\n    df['Policy Start Date'] = (pd.to_datetime(df['Policy Start Date']).dt.year *100 + pd.to_datetime(df['Policy Start Date']).dt.month).astype(str)\n    df['Policy Start Year'] = df['Policy Start Date'].apply(lambda x: x[:4])\n    df['Policy Start Month'] = df['Policy Start Date'].apply(lambda x: x[-2:])\n    df = df.drop(columns=['Policy Start Date'])\n\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = preprocessing(train)\ntest = preprocessing(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# カラムを区分\nnum_cols = test.select_dtypes('number').columns.to_list()\ncat_cols = test.select_dtypes('O').columns.to_list()\nfeatures = num_cols + cat_cols\ntarget = 'Premium Amount'","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def convert2cat(df):\n    for col in cat_cols:\n        df[col] = df[col].astype('category')\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = convert2cat(train)\ntest = convert2cat(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calculate RMSLE\ndef rmsle(y_true,y_pred):\n    return np.sqrt(mean_squared_log_error(y_true,y_pred))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## XGB","metadata":{}},{"cell_type":"code","source":"selected_cols = test.columns.drop(['id']).to_list() # idを外す\ntrain_X = train[selected_cols]\ntrain_y = train_y = np.log(train[target])\ntest_X =test[selected_cols]\n\nscores = []\nxgb_train_preds = []\nxgb_preds = []\nva_ys = []\nvalid_preds = []\nva_X_df = pd.DataFrame()\n\nkf = KFold(n_splits=10, shuffle=True, random_state=42)\n\nfor tr_idx, va_idx in kf.split(train_X, train_y):\n    tr_X, va_X = train_X.iloc[tr_idx], train_X.iloc[va_idx]\n    tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]\n\n    model = xgb.XGBRegressor(enable_categorical=True,\n                              n_estimators=1000, \n                              eta=0.05, \n                              max_depth=8, \n                              colsample_bytree=0.8, \n                              eval_metric='rmse', \n                              early_stopping_rounds=50,\n                              random_state=42)\n    model.fit(tr_X, tr_y, \n          eval_set=[(va_X, va_y)], \n          verbose=True)\n    \n    valid_pred = model.predict(va_X)\n    valid_pred = np.exp(valid_pred)\n    score = rmsle(np.exp(va_y), valid_pred)\n    print(score)\n\n    xgb_train_pred = model.predict(train_X)\n    xgb_train_pred = np.exp(xgb_train_pred)\n\n    xgb_pred = model.predict(test_X)\n    xgb_pred = np.exp(xgb_pred)\n\n    scores.append(score)\n    xgb_train_preds.append(xgb_train_pred)\n    xgb_preds.append(xgb_pred)\n    va_ys.extend(np.exp(va_y))\n    valid_preds.extend(valid_pred)\n    va_X_df = pd.concat((va_X_df, va_X), axis=0)\n\nprint('-------')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(scores)\nprint(np.mean(scores))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\nplt.scatter(train[target], xgb_train_pred, alpha=0.5)\nplt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\nplt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, p: format(int(x), ',')))\nplt.plot([np.array(va_ys).min(), np.array(va_ys).max()], [np.array(va_ys).min(), np.array(va_ys).max()], 'r--', lw=2)  # 45-degree line\nplt.title('Actual vs Predicted Values')\nplt.xlabel('Actual Values')\nplt.ylabel('Predicted Values')\nplt.grid()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Gain-based feature importance\nfig, ax = plt.subplots(figsize=(8, 8))\nplot_importance(model, importance_type='gain', ax=ax)\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"xgb_pred = np.mean(xgb_preds, axis=0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"xgb_pred.mean(), xgb_pred.min(), xgb_pred.max(), xgb_pred.std()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[target].describe()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub['Premium Amount'] = xgb_pred\nsample_sub.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}