{"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"papermill":{"default_parameters":{},"duration":5232.034539,"end_time":"2022-11-10T16:10:38.379903","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2022-11-10T14:43:26.345364","version":"2.3.4"},"widgets":{"application/vnd.jupyter.widget-state+json":{"05ae7bf407154f57a559cb742051838e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2c473fb4b99b4a038b4fa43681dd6fe3":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3b93aa736cd244d7abe0dcbfb4b453c2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"41830c83d00e43c89db181abbad7375a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"496637228495431bac702e29cfe1bb21":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_05ae7bf407154f57a559cb742051838e","placeholder":"​","style":"IPY_MODEL_c19c7f6ed53a4b45bfdac6946c88df7b","value":" 4/4 [00:43&lt;00:00, 11.03s/it]"}},"4d2116cd29de48a194bf02d2e2277591":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a0be631f1db442b9b18e80088a01be8d","max":4,"min":0,"orientation":"horizontal","style":"IPY_MODEL_d14fffd4e10d40c7b2d5e4aab58176c6","value":4}},"4d60974761654f5c916d5e8ba04f2f22":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2c473fb4b99b4a038b4fa43681dd6fe3","placeholder":"​","style":"IPY_MODEL_3b93aa736cd244d7abe0dcbfb4b453c2","value":"loading train_date: 100%"}},"a0be631f1db442b9b18e80088a01be8d":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a823bdec8ff84cd7b0ba0ed650db6fe1":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_4d60974761654f5c916d5e8ba04f2f22","IPY_MODEL_4d2116cd29de48a194bf02d2e2277591","IPY_MODEL_496637228495431bac702e29cfe1bb21"],"layout":"IPY_MODEL_41830c83d00e43c89db181abbad7375a"}},"c19c7f6ed53a4b45bfdac6946c88df7b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"d14fffd4e10d40c7b2d5e4aab58176c6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}}}},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":5357,"databundleVersionId":38056,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Bosch Production Line Performance\n\n\n- 대용량 데이터인 공정 데이터를 활용하여, product의 불량 여부를 판단하는 문제입니다.\n\n\n- 불량 검출은 대표적인 class imbalance가 심한 문제입니다. class imbalance를 해결하는 sampling 방법을 사용해봅니다.\n\n\n- 공정 데이터는 대표적인 고차원 데이터입니다. 고차원 데이터를 해결하는 방법을 배워봅니다.\n\n\n- metric은 F1 score를 사용합니다.\n\n\n[Source] https://www.kaggle.com/competitions/bosch-production-line-performance","metadata":{"id":"zMRuDuqx26Rf"}},{"cell_type":"markdown","source":"## 1. 라이브러리, 데이터 불러오기","metadata":{"id":"222f8ad3","papermill":{"duration":0.014616,"end_time":"2022-11-10T14:43:35.660710","exception":false,"start_time":"2022-11-10T14:43:35.646094","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install optuna","metadata":{"id":"srSiW1GUjrxY","outputId":"7cee0598-c659-470b-b9ac-545d46f0bd0d","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 데이터분석 4종 세트\nimport numpy as np\nimport pandas as pd\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tqdm.auto import tqdm\n\nimport os\nimport random\n\n# 모델들, 성능 평가\n# (저는 일반적으로 정형데이터로 머신러닝 분석할 때는 이 2개 모델은 그냥 돌려봅니다. 특히 RF가 테스트하기 좋습니다.)\nfrom xgboost.sklearn import XGBClassifier\nfrom xgboost import XGBClassifier  ## default가 sklearn API\nfrom sklearn.metrics import f1_score\n\n# KFold(CV), partial : optuna를 사용하기 위함\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import StratifiedKFold\nfrom functools import partial\n\n# hyper-parameter tuning을 위한 라이브러리, optuna\nimport optuna","metadata":{"id":"5ba77e23","papermill":{"duration":3.342311,"end_time":"2022-11-10T14:43:39.017482","exception":false,"start_time":"2022-11-10T14:43:35.675171","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed: int = 42):\n    random.seed(seed)\n    np.random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n\nseed_everything(42)","metadata":{"id":"EGp2E_oXNOfp","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 데이터를 불러옵니다.\nbase_path = '/kaggle/input/bosch-production-line-performance/'\ntrain_cat_part = pd.read_csv(base_path + 'train_categorical.csv.zip', nrows=1000)\ntrain_num_part = pd.read_csv(base_path + 'train_numeric.csv.zip',\n                            nrows=1000)\ntrain_date_part = pd.read_csv(base_path + 'train_date.csv.zip',\n                             nrows=1000)\n\nprint(train_cat_part.shape, train_num_part.shape, train_date_part.shape)","metadata":{"id":"ff89465f","outputId":"07332a16-25a2-4f7d-f1fa-81fae5379059","papermill":{"duration":0.427331,"end_time":"2022-11-10T14:43:39.497080","exception":false,"start_time":"2022-11-10T14:43:39.069749","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 2개의 지정된 column만 불러옴.\ntrain_num_part = pd.read_csv(base_path + 'train_numeric.csv.zip',\n                            usecols=['Id', 'Response'])\ntrain_num_part","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_num_part.Response.value_counts(normalize=True)\n# 1176868 : 6879 ~ 0.995 : 0.005 ~ 171 : 1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"categorical data는 EDA 결과 분석에 큰 도움이 없어, 사용하지 않겠지만 데이터는 확인해봅시다.","metadata":{"id":"6183159f","papermill":{"duration":0.013428,"end_time":"2022-11-10T14:43:39.525135","exception":false,"start_time":"2022-11-10T14:43:39.511707","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# # categorical data를 단위별로 나눠서 데이터를 불러와서 결측치를 확인해봅니다. --> 대부분 결측치.\n# temp = None\n# for chunk in pd.read_csv('train_categorical.csv', chunksize=50000):\n#     display(chunk.isnull().sum()) # col별 결측치 수\n#     temp += chunk.isnull().sum()","metadata":{"id":"14b8b9ed","outputId":"f80017fe-5426-449c-ed28-2e7457bdd082","papermill":{"duration":0.023711,"end_time":"2022-11-10T14:43:39.562587","exception":false,"start_time":"2022-11-10T14:43:39.538876","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"train_date.csv에서는 파생 변수를 만들어서 사용합니다.\n\n> 1. 각 station별로 측정 시간이 모두 있거나, 없거나의 케이스만 존재한다.\n>> 데이터 중에서 station별로 하나의 column만 뽑아서 체크해도 괜찮다.\n\n> 2. 각 station별로 시간이 모두 같지는 않다. 중간에 측정시간이 바뀌는 케이스도 있다.\n>> 데이터 별로 min, max값을 계산하면 된다.\n\n- start_station : 해당 product가 처음으로 공정을 거친 station_name\n\n- end_station : 해당 product가 마지막으로 공정을 거친 station_name\n\n- time_diff : 해당 product가 처음 시작한 timestamp와 마지막으로 끝낸 timestamp의 차이 (공정에 걸린 시간)","metadata":{"id":"54c2d857","papermill":{"duration":0.013331,"end_time":"2022-11-10T14:43:39.626384","exception":false,"start_time":"2022-11-10T14:43:39.613053","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train_date_part","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 1157 cols -> station 개수(S0 ~ S51), 52 cols (각 station별 첫번째 column들)\n## 같은 station에서 측정한 시간이 모두 동일함을 찾음.\nstations = train_date_part.count()\nindices = stations.reset_index()['index'].str.split('_', expand=True)[1].drop_duplicates().index\ntrain_date_part = train_date_part.iloc[:, indices]\ntrain_date_part","metadata":{"id":"3b22278f","outputId":"561c295c-0d90-43f8-a8a5-51b450af8c06","papermill":{"duration":0.08353,"end_time":"2022-11-10T14:43:39.723476","exception":false,"start_time":"2022-11-10T14:43:39.639946","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"train_date_part 데이터를 가지고, 원하는 3개의 파생변수가 잘 생성되는지 확인합니다.","metadata":{"id":"5dc911cf","papermill":{"duration":0.013971,"end_time":"2022-11-10T14:43:39.752553","exception":false,"start_time":"2022-11-10T14:43:39.738582","status":"completed"},"tags":[]}},{"cell_type":"code","source":"## TO-DO: train_date.csv를 불러와서, start_station, end_station, time_diff 파생 변수를 생성한 뒤에,\n##        1183747 x 4 에 해당하는 train_date DataFrame을 만들어주세요.\n\n## [HINT]\n# 1. chunk (datecols)\n# 2. start, end station 만들었던거 그대로 사용\n## end_station은 col을 보면서,\n## 현재 값이 존재한다면 그 product는 해당 station을 거친것이기 때문에,\n## 해당 station_number를 업데이트 함. (항상 최근에 본 station number)\n\n## start_station은 col을 보면서,\n## 최초의 nan이 아닌 값이 나왔을 때, 해당 station_number를 업데이트 함.\n\n# 3. min, max 계산해서 time_diff 구하기\ncol_num = 0\nfor col in train_date_part.columns[1:]:\n    print(col)\n    station_numbers = [col_num for x in range(len(train_date_part))]\n    # 있을 때 1, 없을 때 0\n    mask = train_date_part[col].notnull()\n    train_date_part['start_station'] = \n    train_date_part['end_station'] = mask * station_numbers\n    break","metadata":{"id":"1a94d7b1","outputId":"816af35d-6d75-44b3-b2d1-37e4e58c34bd","papermill":{"duration":45.638743,"end_time":"2022-11-10T14:44:25.580077","exception":false,"start_time":"2022-11-10T14:43:39.941334","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. EDA","metadata":{"id":"e41fbe06","papermill":{"duration":0.015321,"end_time":"2022-11-10T14:45:07.174045","exception":false,"start_time":"2022-11-10T14:45:07.158724","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"- 데이터에서 찾아야 하는 기초적인 내용들을 확인합니다.\n\n\n- class imbalance, target distribution, outlier, correlation을 확인합니다.","metadata":{"id":"0ce7894b","papermill":{"duration":0.015944,"end_time":"2022-11-10T14:45:07.205424","exception":false,"start_time":"2022-11-10T14:45:07.189480","status":"completed"},"tags":[]}},{"cell_type":"code","source":"## 결측치 체크\n\n## categorical feature 찾기\n\n## target value 분포 확인\n","metadata":{"id":"347eed9a","outputId":"16abc326-ced7-406c-e46a-e88e4ae87b47","papermill":{"duration":0.337856,"end_time":"2022-11-10T14:45:07.559729","exception":false,"start_time":"2022-11-10T14:45:07.221873","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"이런 식으로 여러가지 그래프를 그려가며, 데이터에 대한 인사이트를 얻습니다!","metadata":{"id":"d2e6e245","papermill":{"duration":0.015784,"end_time":"2022-11-10T14:45:07.592025","exception":false,"start_time":"2022-11-10T14:45:07.576241","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### 3. 전처리\n\nClass Imbalance가 존재하는 경우에는 data sampling 기법을 이용하여 문제를 해결합니다.\n- majority class : 다수가 속해있는 class\n\n- minority class : 소수가 속해있는 class\n\n\n\n**1) Under sampling : majority class의 수를 minority class로 맞춰주기 위해서 random sampling을 수행하는 방법.**\n\ne.g. 1176868 : 6879 -> 6879 : 6879\n\n\n**2) Over sampling : minority class에서 데이터를 생성하여 majority class의 수를 맞춰주는 방법.**\n\ne.g. 1176868 : 6879 -> 1176868 : 1176868\n\n\n**3) Hybrid approach : under sampling & over sampling을 써서 적당한 수로 맞춰주는 방법.**\n\ne.g. 1176868 : 6879 -> 20000 : 20000","metadata":{"id":"b90cb94b","papermill":{"duration":0.015639,"end_time":"2022-11-10T14:45:07.623707","exception":false,"start_time":"2022-11-10T14:45:07.608068","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 모든 데이터가 NaN이라서, time_diff가 NaN이고 train_date에 아무 정보가 없는 데이터들을 제거합니다.\nX_train","metadata":{"id":"431e73bf","outputId":"4d022652-2c36-482f-c24b-1786a85016d3","papermill":{"duration":0.578611,"end_time":"2022-11-10T14:45:08.218374","exception":false,"start_time":"2022-11-10T14:45:07.639763","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 1) Undersampling\nif sampling == 'under':\n    ","metadata":{"id":"ad8c39b0","papermill":{"duration":0.027254,"end_time":"2022-11-10T14:45:08.263068","exception":false,"start_time":"2022-11-10T14:45:08.235814","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if sampling == 'over':\n    # 2) Oversampling - SMOTE (only numeric features)\n    ","metadata":{"id":"811225e4","papermill":{"duration":0.026627,"end_time":"2022-11-10T14:45:08.306271","exception":false,"start_time":"2022-11-10T14:45:08.279644","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if sampling == 'hybrid':\n    # 3) Hybrid approach\n    N = 20000\n    # TODO : under sampling을 먼저 수행해서 majority class를 20000개 줄이고,\n    #        over sampling(SMOTE)을 수행해서 minority class를 20000개 늘려서주세요.\n","metadata":{"id":"03c4af34","papermill":{"duration":1.661906,"end_time":"2022-11-10T14:45:09.984509","exception":false,"start_time":"2022-11-10T14:45:08.322603","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# after sampling, convert float to int.\n","metadata":{"id":"842001d8","papermill":{"duration":0.03406,"end_time":"2022-11-10T14:45:10.035213","exception":false,"start_time":"2022-11-10T14:45:10.001153","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 4. 학습 데이터 분할","metadata":{"id":"3f502828","papermill":{"duration":0.0169,"end_time":"2022-11-10T14:45:10.069019","exception":false,"start_time":"2022-11-10T14:45:10.052119","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 첫번째 테스트용으로 사용하고, 실제 학습시에는 K-Fold CV를 사용합니다.\n# train : test = 8 : 2\nX = X_s\ny = y_s\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\nprint(X_train.shape, X_val.shape, y_train.shape, y_val.shape)","metadata":{"id":"a2ebefbd","papermill":{"duration":0.051073,"end_time":"2022-11-10T14:45:10.137727","exception":false,"start_time":"2022-11-10T14:45:10.086654","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 5. 학습 및 평가","metadata":{"id":"eb8950a4","papermill":{"duration":0.015979,"end_time":"2022-11-10T14:45:10.170437","exception":false,"start_time":"2022-11-10T14:45:10.154458","status":"completed"},"tags":[]}},{"cell_type":"code","source":"model = XGBClassifier()\nmodel.fit(X_train, y_train)","metadata":{"id":"cf13dd39","papermill":{"duration":0.73832,"end_time":"2022-11-10T14:45:10.925461","exception":false,"start_time":"2022-11-10T14:45:10.187141","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metric은 그때마다 맞게 바꿔줘야 합니다.\nevaluation_metric = f1_score","metadata":{"id":"cea77398","papermill":{"duration":0.028118,"end_time":"2022-11-10T14:45:10.971091","exception":false,"start_time":"2022-11-10T14:45:10.942973","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Prediction\")\npred_train = model.predict(X_train)\npred_test = model.predict(X_val)\n\ntrain_score = evaluation_metric(y_train, pred_train)\ntest_score = evaluation_metric(y_val, pred_test)\n\nprint(\"Train Score : %.4f\" % train_score)\nprint(\"Test Score : %.4f\" % test_score)","metadata":{"id":"73f1621a","papermill":{"duration":0.134631,"end_time":"2022-11-10T14:45:11.122432","exception":false,"start_time":"2022-11-10T14:45:10.987801","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 6. Hyper-parameter Tuning","metadata":{"id":"b2516a24","papermill":{"duration":0.01725,"end_time":"2022-11-10T14:45:11.157167","exception":false,"start_time":"2022-11-10T14:45:11.139917","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"> optuna를 사용해봅시다 !","metadata":{"id":"a686b256","papermill":{"duration":0.016296,"end_time":"2022-11-10T14:45:11.258821","exception":false,"start_time":"2022-11-10T14:45:11.242525","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def optimizer(trial, X, y, K):\n    # 조절할 hyper-parameter 조합을 적어줍니다.\n    n_estimators = \n    max_depth = \n    colsample_bynode = \n    learning_rate = \n\n\n    model = XGBClassifier(n_estimators=,\n                          max_depth=,\n                          colsample_bynode=,\n                          learning_rate=)\n\n    # K-Fold Cross validation을 구현합니다.\n    folds =\n    scores = []\n\n    for train_idx, val_idx in folds.split(X, y):\n        X_train = X.iloc[train_idx, :]\n        y_train = y.iloc[train_idx]\n\n        X_val = X.iloc[val_idx, :]\n        y_val = y.iloc[val_idx]\n\n        model.fit(X_train, y_train)\n        preds = model.predict(X_val)\n        score = evaluation_metric(y_val, preds)\n        scores.append(score)\n\n    gc.collect()\n    # K-Fold의 평균 loss값을 돌려줍니다.\n    return np.mean(scores)","metadata":{"id":"0f43a91f","papermill":{"duration":0.03121,"end_time":"2022-11-10T14:45:11.306788","exception":false,"start_time":"2022-11-10T14:45:11.275578","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"K = 5 # Kfold 수\nopt_func = partial(optimizer, X=X_train, y=y_train, K=K)\n\nstudy = optuna.create_study(direction=\"maximize\") # 최소/최대 어느 방향의 최적값을 구할 건지.\nstudy.optimize(opt_func, n_trials=30)","metadata":{"id":"d703d6b2","papermill":{"duration":4952.833381,"end_time":"2022-11-10T16:07:44.156957","exception":false,"start_time":"2022-11-10T14:45:11.323576","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# optuna가 시도했던 모든 실험 관련 데이터\nstudy.trials_dataframe()","metadata":{"id":"b97fd789","papermill":{"duration":0.055264,"end_time":"2022-11-10T16:07:44.230991","exception":false,"start_time":"2022-11-10T16:07:44.175727","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Best Score: %.4f\" % study.best_value) # best score 출력\nprint(\"Best params: \", study.best_trial.params) # best score일 때의 하이퍼파라미터들","metadata":{"id":"f6638aeb","papermill":{"duration":0.031289,"end_time":"2022-11-10T16:07:44.282096","exception":false,"start_time":"2022-11-10T16:07:44.250807","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 실험 기록 시각화\noptuna.visualization.plot_optimization_history(study)","metadata":{"id":"8881cf43","papermill":{"duration":0.189182,"end_time":"2022-11-10T16:07:44.491507","exception":false,"start_time":"2022-11-10T16:07:44.302325","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# hyper-parameter들의 중요도\noptuna.visualization.plot_param_importances(study)","metadata":{"id":"ae9b4be9","papermill":{"duration":0.595498,"end_time":"2022-11-10T16:07:45.107921","exception":false,"start_time":"2022-11-10T16:07:44.512423","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 7. 테스트 및 제출 파일 생성","metadata":{"id":"70b1e9a7","papermill":{"duration":0.020451,"end_time":"2022-11-10T16:07:45.148892","exception":false,"start_time":"2022-11-10T16:07:45.128441","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"#### 전처리 과정은 train data와 동일하게 진행합니다.\n\n1. test_numeric : 위에서 사용한 usecols에 해당하는 column만 read_csv를 통해서 가져옵니다.\n\n2. test_date : start_station, end_station, time_diff의 파생변수를 생성한 방법과 동일한 처리를 해줍니다.\n\n3. X_test : 위의 2개의 DataFrame을 합칩니다.","metadata":{"id":"4cfab71a","papermill":{"duration":0.020362,"end_time":"2022-11-10T16:07:45.890342","exception":false,"start_time":"2022-11-10T16:07:45.869980","status":"completed"},"tags":[]}},{"cell_type":"code","source":"## TO-DO : train data 만들었던 방식을 그대로 사용하여, test data를 best model로 inference하세요.\n","metadata":{"id":"1T3NC_aiIcEK"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"l-x1lO-dIqKV"},"execution_count":null,"outputs":[]}]}