{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 2. Baseline Model","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\ntrain = pd.read_csv('../input/porto-seguro-safe-driver-prediction/train.csv')\ntest = pd.read_csv('../input/porto-seguro-safe-driver-prediction/test.csv')\nsubmission = pd.read_csv('../input/porto-seguro-safe-driver-prediction/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:47:47.255107Z","iopub.execute_input":"2022-08-08T12:47:47.255457Z","iopub.status.idle":"2022-08-08T12:48:22.253228Z","shell.execute_reply.started":"2022-08-08T12:47:47.255429Z","shell.execute_reply":"2022-08-08T12:48:22.250305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_data = pd.concat([train, test], ignore_index = True)\nall_data = all_data.drop('target', axis = 1)","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:22.261388Z","iopub.execute_input":"2022-08-08T12:48:22.262754Z","iopub.status.idle":"2022-08-08T12:48:24.641703Z","shell.execute_reply.started":"2022-08-08T12:48:22.262658Z","shell.execute_reply":"2022-08-08T12:48:24.628621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_features = all_data.columns\nall_features","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:24.643401Z","iopub.execute_input":"2022-08-08T12:48:24.643694Z","iopub.status.idle":"2022-08-08T12:48:24.689365Z","shell.execute_reply.started":"2022-08-08T12:48:24.643668Z","shell.execute_reply":"2022-08-08T12:48:24.684500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\ncat_features = [feature for feature in all_features if 'cat' in feature]\nonehot_encoder = OneHotEncoder()\nencoded_cat_matrix = onehot_encoder.fit_transform(all_data[cat_features])\nencoded_cat_matrix","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:24.698441Z","iopub.execute_input":"2022-08-08T12:48:24.700904Z","iopub.status.idle":"2022-08-08T12:48:32.183641Z","shell.execute_reply.started":"2022-08-08T12:48:24.699519Z","shell.execute_reply":"2022-08-08T12:48:32.182394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"drop_features = ['ps_ind_14', 'ps_ind_10_bin', 'ps_ind_11_bin','ps_ind_12_bin','ps_ind_13_bin','ps_car_14']\nremaining_features = [feature for feature in all_features\n                      if ('cat' not in feature and\n                          'calc' not in feature and\n                          feature not in drop_features)]","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:32.184535Z","iopub.execute_input":"2022-08-08T12:48:32.184865Z","iopub.status.idle":"2022-08-08T12:48:32.207692Z","shell.execute_reply.started":"2022-08-08T12:48:32.184841Z","shell.execute_reply":"2022-08-08T12:48:32.195856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy import sparse\nall_data_sprs = sparse.hstack([sparse.csr_matrix(all_data[remaining_features]),\n                               encoded_cat_matrix],\n                             format = 'csr')","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:32.212374Z","iopub.execute_input":"2022-08-08T12:48:32.213092Z","iopub.status.idle":"2022-08-08T12:48:48.471235Z","shell.execute_reply.started":"2022-08-08T12:48:32.212994Z","shell.execute_reply":"2022-08-08T12:48:48.458592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_train = len(train)\nX = all_data_sprs[:num_train]\nX_test = all_data_sprs[num_train:]\ny = train['target'].values","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:48.487545Z","iopub.execute_input":"2022-08-08T12:48:48.493175Z","iopub.status.idle":"2022-08-08T12:48:52.314511Z","shell.execute_reply.started":"2022-08-08T12:48:48.493107Z","shell.execute_reply":"2022-08-08T12:48:52.303723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def eval_gini(y_true, y_pred):\n    assert y_true.shape == y_pred.shape\n\n    n_samples = y_true.shape[0]\n    L_mid = np.linspace(1 / n_samples, 1, n_samples)\n    \n    pred_order = y_true[y_pred.argsort()]\n    L_pred = np.cumsum(pred_order) / np.sum(pred_order)\n    G_pred = np.sum(L_mid - L_pred)\n    \n    true_order = y_true[y_true.argsort()]\n    L_true = np.cumsum(true_order) / np.sum(true_order)\n    G_true = np.sum(L_mid - L_true)\n    \n    return G_pred / G_true","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:52.317497Z","iopub.execute_input":"2022-08-08T12:48:52.317762Z","iopub.status.idle":"2022-08-08T12:48:52.359826Z","shell.execute_reply.started":"2022-08-08T12:48:52.317739Z","shell.execute_reply":"2022-08-08T12:48:52.357719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gini(preds, dtrain):\n    labels = dtrain.get_label()\n    return 'gini', eval_gini(labels, preds), True","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:52.367551Z","iopub.execute_input":"2022-08-08T12:48:52.380221Z","iopub.status.idle":"2022-08-08T12:48:52.473055Z","shell.execute_reply.started":"2022-08-08T12:48:52.380171Z","shell.execute_reply":"2022-08-08T12:48:52.458084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfolds = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 1991)","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:52.520375Z","iopub.execute_input":"2022-08-08T12:48:52.531396Z","iopub.status.idle":"2022-08-08T12:48:52.953500Z","shell.execute_reply.started":"2022-08-08T12:48:52.531053Z","shell.execute_reply":"2022-08-08T12:48:52.950919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"params =  {'objective' : 'binary', 'learning_rate' : 0.01, 'force_row_wise' : True, 'random_state' : 0}","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:52.963358Z","iopub.execute_input":"2022-08-08T12:48:52.965736Z","iopub.status.idle":"2022-08-08T12:48:52.983635Z","shell.execute_reply.started":"2022-08-08T12:48:52.965673Z","shell.execute_reply":"2022-08-08T12:48:52.979911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"oof_val_preds = np.zeros(X.shape[0])\noof_test_preds = np.zeros(X_test.shape[0])","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:52.985951Z","iopub.execute_input":"2022-08-08T12:48:52.994232Z","iopub.status.idle":"2022-08-08T12:48:53.096992Z","shell.execute_reply.started":"2022-08-08T12:48:52.994166Z","shell.execute_reply":"2022-08-08T12:48:53.080969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import lightgbm as lgb\n\nfor idx, (train_idx, valid_idx) in enumerate(folds.split(X, y)) :\n    print('#'*40, f'폴드 {idx+1} / 폴드 {folds.n_splits}', '#'*40)\n    \n    X_train, y_train = X[train_idx], y[train_idx]\n    X_valid, y_valid = X[valid_idx], y[valid_idx]\n    \n    dtrain = lgb.Dataset(X_train, y_train)\n    dvalid = lgb.Dataset(X_valid, y_valid)\n    \n    lgb_model = lgb.train(params = params,\n                          train_set = dtrain,\n                          num_boost_round = 1000,\n                          valid_sets = dvalid,\n                          feval = gini,\n                          early_stopping_rounds = 100,\n                          verbose_eval = 100)\n    oof_test_preds += lgb_model.predict(X_test) / folds.n_splits\n    oof_val_preds[valid_idx] += lgb_model.predict(X_valid)\n    \n    gini_score = eval_gini(y_valid, oof_val_preds[valid_idx])\n    print(f'폴드 {idx+1} 지니계수: {gini_score}\\n')","metadata":{"execution":{"iopub.status.busy":"2022-08-08T12:48:53.098905Z","iopub.execute_input":"2022-08-08T12:48:53.099195Z","iopub.status.idle":"2022-08-08T13:02:47.596030Z","shell.execute_reply.started":"2022-08-08T12:48:53.099171Z","shell.execute_reply":"2022-08-08T13:02:47.594770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('OOF 검증 데이터 지니계수:', eval_gini(y, oof_val_preds))","metadata":{"execution":{"iopub.status.busy":"2022-08-08T13:02:47.597235Z","iopub.execute_input":"2022-08-08T13:02:47.597485Z","iopub.status.idle":"2022-08-08T13:02:47.703863Z","shell.execute_reply.started":"2022-08-08T13:02:47.597460Z","shell.execute_reply":"2022-08-08T13:02:47.702699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['target'] = oof_test_preds\nsubmission.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2022-08-08T13:39:22.909444Z","iopub.execute_input":"2022-08-08T13:39:22.909814Z","iopub.status.idle":"2022-08-08T13:39:27.228731Z","shell.execute_reply.started":"2022-08-08T13:39:22.909788Z","shell.execute_reply":"2022-08-08T13:39:27.215563Z"},"trusted":true},"execution_count":null,"outputs":[]}]}