{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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":"nvidiaTeslaT4","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":"ON_KAGGLE = True\nTUNING = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T06:58:24.390837Z","iopub.execute_input":"2024-12-13T06:58:24.391186Z","iopub.status.idle":"2024-12-13T06:58:24.395187Z","shell.execute_reply.started":"2024-12-13T06:58:24.391137Z","shell.execute_reply":"2024-12-13T06:58:24.394287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import lightgbm as lgb\nimport numpy as np\nimport pandas as pd\nfrom IPython.display import clear_output\n\n# scikit-learn\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_log_error #, mean_squared_error\n\n#  warnings\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T06:58:31.525186Z","iopub.execute_input":"2024-12-13T06:58:31.525562Z","iopub.status.idle":"2024-12-13T06:58:35.047085Z","shell.execute_reply.started":"2024-12-13T06:58:31.525531Z","shell.execute_reply":"2024-12-13T06:58:35.046384Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Constant","metadata":{}},{"cell_type":"code","source":"KNUM = 'k0.2'\nif ON_KAGGLE:\n    PATH_INPUT = '/kaggle/input/playground-series-s4e12/'\n    PATH_OUTPUT = ''\nelse:\n    PATH_INPUT = '../ignore_dir/input/' # local\n    PATH_OUTPUT = f'../ignore_dir/output/{KNUM}/'\n# Cross validation\nN_SPLITS = 5\nN_REPEATS = 1\n# random seed\nSEED = 42\ndef seed_everything(seed=42):\n    #random.seed(seed)\n    np.random.seed(seed)\n    #os.environ['PYTHONHASHSEED'] = str(seed)\n    # torch.manual_seed(seed)\n    # torch.cuda.manual_seed(seed)\n    # torch.backends.cudnn.daterministic = True\nseed_everything(SEED)\n# Abount columns\nCOL_FEATURES = [\n    'Age',\n    'Gender',\n    'Annual Income',\n    'Marital Status',\n    'Number of Dependents',\n    'Education Level',\n    'Occupation',\n    'Health Score',\n    'Location',\n    'Policy Type',\n    'Previous Claims',\n    'Vehicle Age',\n    'Credit Score',\n    'Insurance Duration',\n    #'Policy Start Date',\n    'Customer Feedback',\n    'Smoking Status',\n    'Exercise Frequency',\n    'Property Type',\n ]\n\n\nCOL_CATEGORY = [\n    'Gender',\n    'Marital Status',\n    'Education Level',\n    'Occupation',\n    'Location',\n    'Policy Type',\n    'Customer Feedback',\n    'Smoking Status',\n    'Exercise Frequency',\n    'Property Type',\n ]\n\nCOL_TARGET = ['Premium Amount']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T06:58:38.147906Z","iopub.execute_input":"2024-12-13T06:58:38.148807Z","iopub.status.idle":"2024-12-13T06:58:38.154969Z","shell.execute_reply.started":"2024-12-13T06:58:38.148769Z","shell.execute_reply":"2024-12-13T06:58:38.154047Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Load Data","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(f'{PATH_INPUT}train.csv')\ntest  = pd.read_csv(f'{PATH_INPUT}test.csv')\nsample = pd.read_csv(f'{PATH_INPUT}sample_submission.csv')\nprint(train.shape)\ndisplay(train.head())\nprint(test.shape)\ndisplay(test.head())\nprint(sample.shape)\ndisplay(sample.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T06:58:43.397732Z","iopub.execute_input":"2024-12-13T06:58:43.398582Z","iopub.status.idle":"2024-12-13T06:58:51.879828Z","shell.execute_reply.started":"2024-12-13T06:58:43.398544Z","shell.execute_reply":"2024-12-13T06:58:51.878942Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Preprocess","metadata":{}},{"cell_type":"code","source":"# 結合\ndata = pd.concat([train, test], axis=0)\n\n# 抽出\ndata = data[COL_FEATURES + COL_TARGET]\nprint(data.shape)\n#display(data.head())\n\n# OHE\ndata = pd.get_dummies(data, columns=COL_CATEGORY, drop_first=True, dummy_na=True)\nprint(data.shape)\n#display(data.head())\n\n# 分割\ntrain = data[:len(train)]\ntest  = data[len(train):]\nX_train = train.drop(COL_TARGET, axis=1)\ny_train = train[COL_TARGET]\nX_test = test.drop(COL_TARGET, axis=1)\nprint(X_train.shape)\ndisplay(X_train.head(3))\nprint(y_train.shape)\ndisplay(y_train.head(3))\nprint(X_test.shape)\ndisplay(X_test.head(3))\n\n# 学習データの準備\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T06:58:54.673265Z","iopub.execute_input":"2024-12-13T06:58:54.673576Z","iopub.status.idle":"2024-12-13T06:58:57.512778Z","shell.execute_reply.started":"2024-12-13T06:58:54.673551Z","shell.execute_reply":"2024-12-13T06:58:57.512014Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Main","metadata":{}},{"cell_type":"code","source":"params = {\n    'objective': 'regression',\n    'metric': 'rmse',\n    'boosting_type': 'gbdt',\n    'verbosity': 0,\n    'seed': SEED,\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:01.199312Z","iopub.execute_input":"2024-12-13T07:00:01.200075Z","iopub.status.idle":"2024-12-13T07:00:01.203739Z","shell.execute_reply.started":"2024-12-13T07:00:01.200043Z","shell.execute_reply":"2024-12-13T07:00:01.202906Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Store result\ny_pred_oof = np.zeros(X_train.shape[0])\ny_preds_test = []\nscores = []\nmodels = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:08.201575Z","iopub.execute_input":"2024-12-13T07:00:08.201882Z","iopub.status.idle":"2024-12-13T07:00:08.207228Z","shell.execute_reply.started":"2024-12-13T07:00:08.201856Z","shell.execute_reply":"2024-12-13T07:00:08.206217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"kf = KFold(n_splits=N_SPLITS, shuffle=True, random_state=SEED)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:08.73942Z","iopub.execute_input":"2024-12-13T07:00:08.73976Z","iopub.status.idle":"2024-12-13T07:00:08.744091Z","shell.execute_reply.started":"2024-12-13T07:00:08.73973Z","shell.execute_reply":"2024-12-13T07:00:08.743221Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### 変更点k0.2\n- 目的変数の対数を取る\n- パラメータを変更。\n    - num_boost_round: 10000 -> 200\n    - early_stopping: 100 -> 50\n- 予測値（対数）の指数を取って、元に戻す\n- 計算エラー防止","metadata":{}},{"cell_type":"code","source":"for fold_id, (tr_idx, val_idx) in enumerate(kf.split(X_train, y_train)):\n    # train data\n    X_tr = X_train.iloc[tr_idx]\n    y_tr = y_train.iloc[tr_idx]\n    # validation data\n    X_val = X_train.iloc[val_idx]\n    y_val = y_train.iloc[val_idx]\n    # log\n    ylog_tr = np.log1p(y_tr)\n    ylog_val = np.log1p(y_val)\n    # Dataset\n    lgb_tr = lgb.Dataset(X_tr, ylog_tr)\n    lgb_val = lgb.Dataset(X_val, ylog_val, reference=lgb_tr)\n    # Fit\n    model = lgb.train(\n        params,\n        lgb_tr,\n        valid_sets=[lgb_tr, lgb_val],\n        num_boost_round=200,\n        callbacks=[\n            lgb.early_stopping(50, first_metric_only=True),\n            lgb.log_evaluation(period=50),\n        ],\n    )\n    # predict\n    ylog_pred_val = model.predict(X_val, num_iteration=model.best_iteration)\n    ylog_pred_test = model.predict(X_test, num_iteration=model.best_iteration)\n    # Exp\n    y_pred_val = np.expm1(ylog_pred_val)\n    y_pred_test = np.expm1(ylog_pred_test)\n    # 0.000001(マイナスやゼロによる計算エラー防止)\n    y_pred_val = np.maximum(y_pred_val, 1e-6)\n    y_pred_test = np.maximum(y_pred_test, 1e-6)\n    # Scoring\n    rmsle_val = np.sqrt(mean_squared_log_error(y_val, y_pred_val))\n    # Store result\n    y_pred_oof[val_idx] = y_pred_val\n    y_preds_test.append(y_pred_test)\n    scores.append(rmsle_val)\n    #models.append(model)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:10.59504Z","iopub.execute_input":"2024-12-13T07:00:10.595854Z","iopub.status.idle":"2024-12-13T07:00:59.360036Z","shell.execute_reply.started":"2024-12-13T07:00:10.59582Z","shell.execute_reply":"2024-12-13T07:00:59.359139Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Evaluation","metadata":{}},{"cell_type":"code","source":"for i in range(len(scores)):\n    print(f'Fold_{i}\\'s score: {scores[i]:.5f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:59.361518Z","iopub.execute_input":"2024-12-13T07:00:59.362204Z","iopub.status.idle":"2024-12-13T07:00:59.367728Z","shell.execute_reply.started":"2024-12-13T07:00:59.362164Z","shell.execute_reply":"2024-12-13T07:00:59.366475Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cv_score = np.mean(scores)\nprint('==== CV score ====')\nprint(f'{cv_score:.5f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:59.369116Z","iopub.execute_input":"2024-12-13T07:00:59.369536Z","iopub.status.idle":"2024-12-13T07:00:59.382001Z","shell.execute_reply.started":"2024-12-13T07:00:59.369394Z","shell.execute_reply":"2024-12-13T07:00:59.381133Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submit","metadata":{}},{"cell_type":"code","source":"y_pred_sub = np.sum(y_preds_test, axis=0) / N_SPLITS\n\n# Check\nfor i in range(N_SPLITS):\n    print(y_preds_test[i][:4])\nprint(y_pred_sub[:4])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:59.38323Z","iopub.execute_input":"2024-12-13T07:00:59.384459Z","iopub.status.idle":"2024-12-13T07:00:59.413126Z","shell.execute_reply.started":"2024-12-13T07:00:59.384426Z","shell.execute_reply":"2024-12-13T07:00:59.412509Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = sample.copy()\nsub['Premium Amount'] = y_pred_sub\ndisplay(sub.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:00:59.415498Z","iopub.execute_input":"2024-12-13T07:00:59.415772Z","iopub.status.idle":"2024-12-13T07:00:59.434105Z","shell.execute_reply.started":"2024-12-13T07:00:59.415742Z","shell.execute_reply":"2024-12-13T07:00:59.43347Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub.to_csv(f'{PATH_OUTPUT}submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T07:01:12.23869Z","iopub.execute_input":"2024-12-13T07:01:12.239373Z","iopub.status.idle":"2024-12-13T07:01:13.616593Z","shell.execute_reply.started":"2024-12-13T07:01:12.239337Z","shell.execute_reply":"2024-12-13T07:01:13.615637Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}