{"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":"# 9.3 향후 판매량 예측 경진대회 베이스라인 모델","metadata":{"papermill":{"duration":0.019669,"end_time":"2021-09-11T07:45:02.082651","exception":false,"start_time":"2021-09-11T07:45:02.062982","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport warnings\n\nwarnings.filterwarnings(action='ignore') # 경고 문구 생략\n\n# 데이터 경로\ndata_path = '/kaggle/input/competitive-data-science-predict-future-sales/'\n\nsales_train = pd.read_csv(data_path + 'sales_train.csv')\nshops = pd.read_csv(data_path + 'shops.csv')\nitems = pd.read_csv(data_path + 'items.csv')\nitem_categories = pd.read_csv(data_path + 'item_categories.csv')\ntest = pd.read_csv(data_path + 'test.csv')\nsubmission = pd.read_csv(data_path + 'sample_submission.csv')","metadata":{"papermill":{"duration":2.466543,"end_time":"2021-09-11T07:45:04.611911","exception":false,"start_time":"2021-09-11T07:45:02.145368","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.1 피처 엔지니어링 I : 피처명 한글화","metadata":{"papermill":{"duration":0.022721,"end_time":"2021-09-11T07:45:04.663102","exception":false,"start_time":"2021-09-11T07:45:04.640381","status":"completed"},"tags":[]}},{"cell_type":"code","source":"sales_train = sales_train.rename(columns={'date': '날짜', \n                                          'date_block_num': '월ID',\n                                          'shop_id': '상점ID',\n                                          'item_id': '상품ID',\n                                          'item_price': '판매가',\n                                          'item_cnt_day': '판매량'})\n\nsales_train.head()","metadata":{"papermill":{"duration":0.124405,"end_time":"2021-09-11T07:45:04.813704","exception":false,"start_time":"2021-09-11T07:45:04.689299","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shops = shops.rename(columns={'shop_name': '상점명',\n                              'shop_id': '상점ID'})\n\nshops.head()","metadata":{"papermill":{"duration":0.032433,"end_time":"2021-09-11T07:45:04.865662","exception":false,"start_time":"2021-09-11T07:45:04.833229","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"items = items.rename(columns={'item_name': '상품명',\n                              'item_id': '상품ID',\n                              'item_category_id': '상품분류ID'})\n\nitems.head()","metadata":{"papermill":{"duration":0.034424,"end_time":"2021-09-11T07:45:04.918954","exception":false,"start_time":"2021-09-11T07:45:04.88453","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_categories = item_categories.rename(columns=\n                                         {'item_category_name': '상품분류명',\n                                          'item_category_id': '상품분류ID'})\n\nitem_categories.head()","metadata":{"papermill":{"duration":0.033177,"end_time":"2021-09-11T07:45:04.971497","exception":false,"start_time":"2021-09-11T07:45:04.93832","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = test.rename(columns={'shop_id': '상점ID',\n                            'item_id': '상품ID'})\n\ntest.head()","metadata":{"papermill":{"duration":0.032637,"end_time":"2021-09-11T07:45:05.023988","exception":false,"start_time":"2021-09-11T07:45:04.991351","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.2 피처 엔지니어링 II : 데이터 다운캐스팅","metadata":{"papermill":{"duration":0.02003,"end_time":"2021-09-11T07:45:05.065086","exception":false,"start_time":"2021-09-11T07:45:05.045056","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def downcast(df, verbose=True):\n    start_mem = df.memory_usage().sum() / 1024**2\n    for col in df.columns:\n        dtype_name = df[col].dtype.name\n        if dtype_name == 'object':\n            pass\n        elif dtype_name == 'bool':\n            df[col] = df[col].astype('int8')\n        elif dtype_name.startswith('int') or (df[col].round() == df[col]).all():\n            df[col] = pd.to_numeric(df[col], downcast='integer')\n        else:\n            df[col] = pd.to_numeric(df[col], downcast='float')\n    end_mem = df.memory_usage().sum() / 1024**2\n    if verbose:\n        print('{:.1f}% 압축됨'.format(100 * (start_mem - end_mem) / start_mem))\n    \n    return df","metadata":{"papermill":{"duration":0.031377,"end_time":"2021-09-11T07:45:05.116721","exception":false,"start_time":"2021-09-11T07:45:05.085344","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_df = [sales_train, shops, items, item_categories, test]\nfor df in all_df:\n    df = downcast(df)","metadata":{"papermill":{"duration":0.383259,"end_time":"2021-09-11T07:45:05.520116","exception":false,"start_time":"2021-09-11T07:45:05.136857","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.3 피처 엔지니어링 III : 데이터 조합 생성","metadata":{"papermill":{"duration":0.020192,"end_time":"2021-09-11T07:45:05.561575","exception":false,"start_time":"2021-09-11T07:45:05.541383","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from itertools import product\n\ntrain = []\n# 월ID, 상점ID, 상품ID 조합 생성 \nfor i in sales_train['월ID'].unique():\n    all_shop = sales_train.loc[sales_train['월ID']==i, '상점ID'].unique()\n    all_item = sales_train.loc[sales_train['월ID']==i, '상품ID'].unique()\n    train.append(np.array(list(product([i], all_shop, all_item))))\n\nidx_features = ['월ID', '상점ID', '상품ID'] # 기준 피처\n# 리스트 타입인 train을 DataFrame 타입으로 변환 \ntrain = pd.DataFrame(np.vstack(train), columns=idx_features)\n\ntrain","metadata":{"papermill":{"duration":12.436747,"end_time":"2021-09-11T07:45:18.059107","exception":false,"start_time":"2021-09-11T07:45:05.62236","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.4 피처 엔지니어링 IV : 타깃값(월간 판매량) 추가","metadata":{"papermill":{"duration":0.020973,"end_time":"2021-09-11T07:45:18.100787","exception":false,"start_time":"2021-09-11T07:45:18.079814","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# idx_features를 기준으로 그룹화해 판매량 합 구하기 \ngroup = sales_train.groupby(idx_features).agg({'판매량': 'sum'})\n# 인덱스 재설정\ngroup = group.reset_index()\n# 피처명을 '판매량'에서 '월간 판매량'으로 변경\ngroup = group.rename(columns={'판매량': '월간 판매량'})\n\ngroup","metadata":{"papermill":{"duration":0.858293,"end_time":"2021-09-11T07:45:18.98004","exception":false,"start_time":"2021-09-11T07:45:18.121747","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train과 group 병합하기\ntrain = train.merge(group, on=idx_features, how='left')\n\ntrain","metadata":{"papermill":{"duration":4.239447,"end_time":"2021-09-11T07:45:23.240476","exception":false,"start_time":"2021-09-11T07:45:19.001029","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc # 가비지 컬렉터 불러오기\n\ndel group # 더는 사용하지 않는 변수 지정\ngc.collect(); # 가비지 컬렉션 수행","metadata":{"papermill":{"duration":0.1129,"end_time":"2021-09-11T07:45:23.374993","exception":false,"start_time":"2021-09-11T07:45:23.262093","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.5 피처 엔지니어링 V : 테스트 데이터 이어붙이기","metadata":{"papermill":{"duration":0.02121,"end_time":"2021-09-11T07:45:23.417467","exception":false,"start_time":"2021-09-11T07:45:23.396257","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test['월ID'] = 34","metadata":{"papermill":{"duration":0.029334,"end_time":"2021-09-11T07:45:23.467816","exception":false,"start_time":"2021-09-11T07:45:23.438482","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train과 test 이어붙이기\nall_data = pd.concat([train, test.drop('ID', axis=1)],\n                     ignore_index=True, # 기존 인덱스 무시(0부터 새로 시작)\n                     keys=idx_features) # 이어붙이는 기준이 되는 피처","metadata":{"papermill":{"duration":0.260787,"end_time":"2021-09-11T07:45:23.750182","exception":false,"start_time":"2021-09-11T07:45:23.489395","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 결측값을 0으로 대체\nall_data = all_data.fillna(0)\n\nall_data","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.6 피처 엔지니어링 VI : 나머지 데이터 병합(최종 데이터 생성)","metadata":{"papermill":{"duration":0.021152,"end_time":"2021-09-11T07:45:23.793117","exception":false,"start_time":"2021-09-11T07:45:23.771965","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 나머지 데이터 병합\nall_data = all_data.merge(shops, on='상점ID', how='left')\nall_data = all_data.merge(items, on='상품ID', how='left')\nall_data = all_data.merge(item_categories, on='상품분류ID', how='left')\n\n# 데이터 다운캐스팅\nall_data = downcast(all_data)\n\n# 가비지 컬렉션\ndel shops, items, item_categories\ngc.collect();","metadata":{"papermill":{"duration":6.566492,"end_time":"2021-09-11T07:45:30.381207","exception":false,"start_time":"2021-09-11T07:45:23.814715","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_data.head()","metadata":{"papermill":{"duration":0.035033,"end_time":"2021-09-11T07:45:30.439048","exception":false,"start_time":"2021-09-11T07:45:30.404015","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_data = all_data.drop(['상점명', '상품명', '상품분류명'], axis=1)","metadata":{"papermill":{"duration":1.068509,"end_time":"2021-09-11T07:45:31.530678","exception":false,"start_time":"2021-09-11T07:45:30.462169","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.7 피처 엔지니어링 VII : 마무리","metadata":{"papermill":{"duration":0.022889,"end_time":"2021-09-11T07:45:31.577119","exception":false,"start_time":"2021-09-11T07:45:31.55423","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 훈련 데이터 (피처)\nX_train = all_data[all_data['월ID'] < 33]\nX_train = X_train.drop(['월간 판매량'], axis=1)\n# 검증 데이터 (피처)\nX_valid = all_data[all_data['월ID'] == 33]\nX_valid = X_valid.drop(['월간 판매량'], axis=1)\n# 테스트 데이터 (피처)\nX_test = all_data[all_data['월ID'] == 34]\nX_test = X_test.drop(['월간 판매량'], axis=1)\n\n# 훈련 데이터 (타깃값)\ny_train = all_data[all_data['월ID'] < 33]['월간 판매량']\ny_train = y_train.clip(0, 20) # 타깃값을 0 ~ 20로 제한\n# 검증 데이터 (타깃값)\ny_valid = all_data[all_data['월ID'] == 33]['월간 판매량']\ny_valid = y_valid.clip(0, 20)","metadata":{"papermill":{"duration":0.603301,"end_time":"2021-09-11T07:45:32.203696","exception":false,"start_time":"2021-09-11T07:45:31.600395","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del all_data\ngc.collect();","metadata":{"papermill":{"duration":0.116244,"end_time":"2021-09-11T07:45:32.342704","exception":false,"start_time":"2021-09-11T07:45:32.22646","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.8 모델 훈련 및 성능 검증","metadata":{"papermill":{"duration":0.022481,"end_time":"2021-09-11T07:45:32.387932","exception":false,"start_time":"2021-09-11T07:45:32.365451","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import lightgbm as lgb\n\n# LightGBM 하이퍼파라미터\nparams = {'metric': 'rmse', # 평가지표 = rmse\n          'num_leaves': 255,\n          'learning_rate': 0.01,\n          'force_col_wise': True,\n          'random_state': 10}\n\n# 범주형 피처 설정\ncat_features = ['상점ID', '상품분류ID']\n\n# LightGBM 훈련 및 검증 데이터셋\ndtrain = lgb.Dataset(X_train, y_train)\ndvalid = lgb.Dataset(X_valid, y_valid)\n\n# LightGBM 모델 훈련\nlgb_model = lgb.train(params=params,\n                      train_set=dtrain,\n                      num_boost_round=500,\n                      valid_sets=(dtrain, dvalid),\n                      categorical_feature=cat_features,\n                      verbose_eval=50)  ","metadata":{"papermill":{"duration":158.849863,"end_time":"2021-09-11T07:48:11.260548","exception":false,"start_time":"2021-09-11T07:45:32.410685","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9.3.9 예측 및 결과 제출","metadata":{"papermill":{"duration":0.025412,"end_time":"2021-09-11T07:48:11.311738","exception":false,"start_time":"2021-09-11T07:48:11.286326","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 예측\npreds = lgb_model.predict(X_test).clip(0, 20)\n# 제출 파일 생성\nsubmission['item_cnt_month'] = preds\nsubmission.to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":6.646588,"end_time":"2021-09-11T07:48:17.98359","exception":false,"start_time":"2021-09-11T07:48:11.337002","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del X_train, y_train, X_valid, y_valid, X_test, lgb_model, dtrain, dvalid\ngc.collect();","metadata":{"papermill":{"duration":0.147714,"end_time":"2021-09-11T07:48:18.157904","exception":false,"start_time":"2021-09-11T07:48:18.01019","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]}]}