{"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":"# 1. 자전거 대여 수요 예측 경진대회 탐색적 데이터 분석\n\n오늘도 즐거운 캐글 시간입니다. 그렇죠? 뭐.. 아님말고","metadata":{"papermill":{"duration":0.027285,"end_time":"2021-09-01T15:20:11.391138","exception":false,"start_time":"2021-09-01T15:20:11.363853","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"- [자전거 대여 수요 예측 경진대회 링크](https://www.kaggle.com/c/bike-sharing-demand)\n\n- [탐색적 데이터 분석 코드 참고 링크](https://www.kaggle.com/viveksrinivasan/eda-ensemble-model-top-10-percentile)","metadata":{"papermill":{"duration":0.029144,"end_time":"2021-09-01T15:20:11.447375","exception":false,"start_time":"2021-09-01T15:20:11.418231","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## 1.1 데이터 둘러보기","metadata":{"papermill":{"duration":0.02567,"end_time":"2021-09-01T15:20:11.571783","exception":false,"start_time":"2021-09-01T15:20:11.546113","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd # 판다스 임포트\n\n# 데이터 경로\ndata_path = '/kaggle/input/bike-sharing-demand/'\n\ntrain = pd.read_csv(data_path + 'train.csv') # 훈련 데이터\ntest = pd.read_csv(data_path + 'test.csv')   # 테스트 데이터\nsubmission = pd.read_csv(data_path + 'sampleSubmission.csv') # 제출 샘플 데이터","metadata":{"_cell_guid":"057b1690-5b93-9f14-eafe-fad12c00da69","papermill":{"duration":0.202376,"end_time":"2021-09-01T15:20:11.800197","exception":false,"start_time":"2021-09-01T15:20:11.597821","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:24.847865Z","iopub.execute_input":"2022-07-14T04:57:24.848879Z","iopub.status.idle":"2022-07-14T04:57:24.955220Z","shell.execute_reply.started":"2022-07-14T04:57:24.848739Z","shell.execute_reply":"2022-07-14T04:57:24.953975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape, test.shape","metadata":{"_cell_guid":"4b5eee60-635b-e053-97cd-62f3e9e8acac","papermill":{"duration":0.039018,"end_time":"2021-09-01T15:20:11.866423","exception":false,"start_time":"2021-09-01T15:20:11.827405","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:24.958385Z","iopub.execute_input":"2022-07-14T04:57:24.958822Z","iopub.status.idle":"2022-07-14T04:57:24.967836Z","shell.execute_reply.started":"2022-07-14T04:57:24.958791Z","shell.execute_reply":"2022-07-14T04:57:24.966527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"_cell_guid":"664d34ff-4580-aeb1-18ea-6dca2b5ae078","papermill":{"duration":0.05687,"end_time":"2021-09-01T15:20:11.950157","exception":false,"start_time":"2021-09-01T15:20:11.893287","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:24.969352Z","iopub.execute_input":"2022-07-14T04:57:24.970094Z","iopub.status.idle":"2022-07-14T04:57:24.997210Z","shell.execute_reply.started":"2022-07-14T04:57:24.970065Z","shell.execute_reply":"2022-07-14T04:57:24.996397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.head()","metadata":{"papermill":{"duration":0.045392,"end_time":"2021-09-01T15:20:12.02443","exception":false,"start_time":"2021-09-01T15:20:11.979038","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.000022Z","iopub.execute_input":"2022-07-14T04:57:25.000442Z","iopub.status.idle":"2022-07-14T04:57:25.014551Z","shell.execute_reply.started":"2022-07-14T04:57:25.000414Z","shell.execute_reply":"2022-07-14T04:57:25.013068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"papermill":{"duration":0.041105,"end_time":"2021-09-01T15:20:12.092925","exception":false,"start_time":"2021-09-01T15:20:12.05182","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.016384Z","iopub.execute_input":"2022-07-14T04:57:25.016958Z","iopub.status.idle":"2022-07-14T04:57:25.031959Z","shell.execute_reply.started":"2022-07-14T04:57:25.016928Z","shell.execute_reply":"2022-07-14T04:57:25.030687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"papermill":{"duration":0.055312,"end_time":"2021-09-01T15:20:12.177068","exception":false,"start_time":"2021-09-01T15:20:12.121756","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.033484Z","iopub.execute_input":"2022-07-14T04:57:25.034454Z","iopub.status.idle":"2022-07-14T04:57:25.065708Z","shell.execute_reply.started":"2022-07-14T04:57:25.034400Z","shell.execute_reply":"2022-07-14T04:57:25.064985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.info()","metadata":{"papermill":{"duration":0.047382,"end_time":"2021-09-01T15:20:12.252438","exception":false,"start_time":"2021-09-01T15:20:12.205056","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.066879Z","iopub.execute_input":"2022-07-14T04:57:25.067311Z","iopub.status.idle":"2022-07-14T04:57:25.079398Z","shell.execute_reply.started":"2022-07-14T04:57:25.067283Z","shell.execute_reply":"2022-07-14T04:57:25.078464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1.2 더 효과적인 분석을 위한 피처 엔지니어링","metadata":{"_cell_guid":"25e226ba-1c12-3fd3-08d8-fe69f9748b73","papermill":{"duration":0.028318,"end_time":"2021-09-01T15:20:12.309194","exception":false,"start_time":"2021-09-01T15:20:12.280876","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print(train['datetime'][100]) # datetime 100번째 요소\nprint(train['datetime'][100].split()) # 공백 기준으로 문자열 나누기\nprint(train['datetime'][100].split()[0]) # 날짜\nprint(train['datetime'][100].split()[1]) # 시간","metadata":{"papermill":{"duration":0.039471,"end_time":"2021-09-01T15:20:12.377498","exception":false,"start_time":"2021-09-01T15:20:12.338027","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.080725Z","iopub.execute_input":"2022-07-14T04:57:25.081575Z","iopub.status.idle":"2022-07-14T04:57:25.088221Z","shell.execute_reply.started":"2022-07-14T04:57:25.081535Z","shell.execute_reply":"2022-07-14T04:57:25.087513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train['datetime'][100].split()[0]) # 날짜\nprint(train['datetime'][100].split()[0].split('-')) # \"_\" 기준으로 문자열 나누기\nprint(train['datetime'][100].split()[0].split('-')[0]) # 연도\nprint(train['datetime'][100].split()[0].split('-')[1]) # 월\nprint(train['datetime'][100].split()[0].split('-')[2]) # 일","metadata":{"papermill":{"duration":0.039819,"end_time":"2021-09-01T15:20:12.44678","exception":false,"start_time":"2021-09-01T15:20:12.406961","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.089175Z","iopub.execute_input":"2022-07-14T04:57:25.089833Z","iopub.status.idle":"2022-07-14T04:57:25.103610Z","shell.execute_reply.started":"2022-07-14T04:57:25.089766Z","shell.execute_reply":"2022-07-14T04:57:25.102562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train['datetime'][100].split()[1]) # 시간\nprint(train['datetime'][100].split()[1].split(':')) # \":\" 기준으로 문자열 나누기\nprint(train['datetime'][100].split()[1].split(':')[0]) # 시간\nprint(train['datetime'][100].split()[1].split(':')[1]) # 분\nprint(train['datetime'][100].split()[1].split(':')[2]) # 초","metadata":{"papermill":{"duration":0.0505,"end_time":"2021-09-01T15:20:12.52892","exception":false,"start_time":"2021-09-01T15:20:12.47842","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.107913Z","iopub.execute_input":"2022-07-14T04:57:25.108438Z","iopub.status.idle":"2022-07-14T04:57:25.117360Z","shell.execute_reply.started":"2022-07-14T04:57:25.108399Z","shell.execute_reply":"2022-07-14T04:57:25.116571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['date'] = train['datetime'].apply(lambda x: x.split()[0]) # 날짜 피처 생성\n\n# 연도, 월, 일, 시, 분, 초 피처를 차례로 생성\ntrain['year'] = train['datetime'].apply(lambda x: x.split()[0].split('-')[0]) \ntrain['month'] = train['datetime'].apply(lambda x: x.split()[0].split('-')[1])\ntrain['day'] = train['datetime'].apply(lambda x: x.split()[0].split('-')[2]) \ntrain['hour'] = train['datetime'].apply(lambda x: x.split()[1].split(':')[0])\ntrain['minute'] = train['datetime'].apply(lambda x: x.split()[1].split(':')[1])\ntrain['second'] = train['datetime'].apply(lambda x: x.split()[1].split(':')[2])","metadata":{"_cell_guid":"18f7c3fc-ffdf-4bc6-1d4c-c455fb4e0141","papermill":{"duration":0.114489,"end_time":"2021-09-01T15:20:12.681748","exception":false,"start_time":"2021-09-01T15:20:12.567259","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.118486Z","iopub.execute_input":"2022-07-14T04:57:25.119491Z","iopub.status.idle":"2022-07-14T04:57:25.203657Z","shell.execute_reply.started":"2022-07-14T04:57:25.119455Z","shell.execute_reply":"2022-07-14T04:57:25.202701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from datetime import datetime # datatime 라이브러리 임포트\nimport calendar\n\nprint(train['date'][100]) # 날짜\nprint(datetime.strptime(train['date'][100], '%Y-%m-%d')) # datetime 타입으로 변경\nprint(datetime.strptime(train['date'][100], '%Y-%m-%d').weekday()) # 정수로 요일 반환\nprint(calendar.day_name[datetime.strptime(train['date'][100], '%Y-%m-%d').weekday()]) # 문자열로 요일 반환","metadata":{"papermill":{"duration":0.042242,"end_time":"2021-09-01T15:20:12.753699","exception":false,"start_time":"2021-09-01T15:20:12.711457","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.204850Z","iopub.execute_input":"2022-07-14T04:57:25.205135Z","iopub.status.idle":"2022-07-14T04:57:25.216105Z","shell.execute_reply.started":"2022-07-14T04:57:25.205107Z","shell.execute_reply":"2022-07-14T04:57:25.214617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['weekday'] = train['date'].apply(\n    lambda dateString: \n    calendar.day_name[datetime.strptime(dateString,\"%Y-%m-%d\").weekday()])","metadata":{"papermill":{"duration":0.220254,"end_time":"2021-09-01T15:20:13.004206","exception":false,"start_time":"2021-09-01T15:20:12.783952","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.217611Z","iopub.execute_input":"2022-07-14T04:57:25.218181Z","iopub.status.idle":"2022-07-14T04:57:25.454460Z","shell.execute_reply.started":"2022-07-14T04:57:25.218151Z","shell.execute_reply":"2022-07-14T04:57:25.453111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['season'] = train['season'].map({1: 'Spring', \n                                       2: 'Summer', \n                                       3: 'Fall', \n                                       4: 'Winter' })\ntrain['weather'] = train['weather'].map({1: 'Clear', \n                                         2: 'Mist, Few clouds', \n                                         3: 'Light Snow, Rain, Thunder', \n                                         4: 'Heavy Snow, Rain, Thunder'})","metadata":{"papermill":{"duration":0.044251,"end_time":"2021-09-01T15:20:13.078499","exception":false,"start_time":"2021-09-01T15:20:13.034248","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.455798Z","iopub.execute_input":"2022-07-14T04:57:25.456150Z","iopub.status.idle":"2022-07-14T04:57:25.467205Z","shell.execute_reply.started":"2022-07-14T04:57:25.456120Z","shell.execute_reply":"2022-07-14T04:57:25.466409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"papermill":{"duration":0.057887,"end_time":"2021-09-01T15:20:13.166613","exception":false,"start_time":"2021-09-01T15:20:13.108726","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.468401Z","iopub.execute_input":"2022-07-14T04:57:25.469515Z","iopub.status.idle":"2022-07-14T04:57:25.493217Z","shell.execute_reply.started":"2022-07-14T04:57:25.469475Z","shell.execute_reply":"2022-07-14T04:57:25.492403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1.3 데이터 시각화","metadata":{"papermill":{"duration":0.02997,"end_time":"2021-09-01T15:20:13.227506","exception":false,"start_time":"2021-09-01T15:20:13.197536","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\n%matplotlib inline","metadata":{"papermill":{"duration":0.914174,"end_time":"2021-09-01T15:20:14.171954","exception":false,"start_time":"2021-09-01T15:20:13.25778","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:25.494396Z","iopub.execute_input":"2022-07-14T04:57:25.495397Z","iopub.status.idle":"2022-07-14T04:57:26.739251Z","shell.execute_reply.started":"2022-07-14T04:57:25.495364Z","shell.execute_reply":"2022-07-14T04:57:26.737870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 분포도","metadata":{"papermill":{"duration":0.030405,"end_time":"2021-09-01T15:20:14.233234","exception":false,"start_time":"2021-09-01T15:20:14.202829","status":"completed"},"tags":[]}},{"cell_type":"code","source":"mpl.rc('font', size=15)      # 폰트 크기를 15로 설정 \nsns.displot(train['count']); # 분포도 출력","metadata":{"papermill":{"duration":0.432078,"end_time":"2021-09-01T15:20:14.69585","exception":false,"start_time":"2021-09-01T15:20:14.263772","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:26.740780Z","iopub.execute_input":"2022-07-14T04:57:26.741111Z","iopub.status.idle":"2022-07-14T04:57:27.149946Z","shell.execute_reply.started":"2022-07-14T04:57:26.741069Z","shell.execute_reply":"2022-07-14T04:57:27.148994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(np.log(train['count']));","metadata":{"papermill":{"duration":0.35686,"end_time":"2021-09-01T15:20:15.084463","exception":false,"start_time":"2021-09-01T15:20:14.727603","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:27.151311Z","iopub.execute_input":"2022-07-14T04:57:27.151560Z","iopub.status.idle":"2022-07-14T04:57:27.493221Z","shell.execute_reply.started":"2022-07-14T04:57:27.151536Z","shell.execute_reply":"2022-07-14T04:57:27.491939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 막대 그래프","metadata":{"papermill":{"duration":0.032107,"end_time":"2021-09-01T15:20:15.149183","exception":false,"start_time":"2021-09-01T15:20:15.117076","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 스텝 1 : m행 n열 Figure 준비\nmpl.rc('font', size=14)       # 폰트 크기 설정\nmpl.rc('axes', titlesize=15)  # 각 축의 제목 크기 설정\nfigure, axes = plt.subplots(nrows=3, ncols=2) # 3행 2열 Figure 생성 \nplt.tight_layout()            # 그래프 사이에 여백 확보 \nfigure.set_size_inches(10, 9) # 전체 Figure 크기를 10x9인치로 설정 \n\n# 스텝 2 : 각 축에 서브플롯 할당\n# 각 축에 연도, 월, 일, 시간, 분, 초별 평균 대여 수량 막대 그래프 할당\nsns.barplot(x='year', y='count', data=train, ax=axes[0, 0])\nsns.barplot(x='month', y='count', data=train, ax=axes[0, 1])\nsns.barplot(x='day', y='count', data=train, ax=axes[1, 0])\nsns.barplot(x='hour', y='count', data=train, ax=axes[1, 1])\nsns.barplot(x='minute', y='count', data=train, ax=axes[2, 0])\nsns.barplot(x='second', y='count', data=train, ax=axes[2, 1])\n\n# 스텝 3 : 세부 설정\n# 3-1 : 서브플롯에 제목 달기\naxes[0, 0].set(title='Rental amounts by year')\naxes[0, 1].set(title='Rental amounts by month')\naxes[1, 0].set(title='Rental amounts by day')\naxes[1, 1].set(title='Rental amounts by hour')\naxes[2, 0].set(title='Rental amounts by minute')\naxes[2, 1].set(title='Rental amounts by second')\n\n# 3-2 : 1행에 위치한 서브플롯들의 x축 라벨 90도 회전\naxes[1, 0].tick_params(axis='x', labelrotation=90)\naxes[1, 1].tick_params(axis='x', labelrotation=90)","metadata":{"papermill":{"duration":4.120295,"end_time":"2021-09-01T15:20:19.302167","exception":false,"start_time":"2021-09-01T15:20:15.181872","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:27.498720Z","iopub.execute_input":"2022-07-14T04:57:27.499032Z","iopub.status.idle":"2022-07-14T04:57:31.797431Z","shell.execute_reply.started":"2022-07-14T04:57:27.499006Z","shell.execute_reply":"2022-07-14T04:57:31.796594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 박스플롯","metadata":{"papermill":{"duration":0.033072,"end_time":"2021-09-01T15:20:19.369304","exception":false,"start_time":"2021-09-01T15:20:19.336232","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 스텝 1 : m행 n열 Figure 준비\nfigure, axes = plt.subplots(nrows=2, ncols=2) # 2행 2열\nplt.tight_layout()\nfigure.set_size_inches(10, 10)\n\n# 스텝 2 : 서브플롯 할당\n# 계절, 날씨, 공휴일, 근무일별 대여 수량 박스플롯\nsns.boxplot(x='season', y='count', data=train, ax=axes[0, 0])\nsns.boxplot(x='weather', y='count', data=train, ax=axes[0, 1])\nsns.boxplot(x='holiday', y='count', data=train, ax=axes[1, 0])\nsns.boxplot(x='workingday', y='count', data=train, ax=axes[1, 1])\n\n# 스텝 3 : 세부 설정\n# 3-1 : 서브플롯에 제목 달기\naxes[0, 0].set(title='Box Plot On Count Across Season')\naxes[0, 1].set(title='Box Plot On Count Across Weather')\naxes[1, 0].set(title='Box Plot On Count Across Holiday')\naxes[1, 1].set(title='Box Plot On Count Across Working Day')\n\n# 3-2 : x축 라벨 겹침 해결\naxes[0, 1].tick_params('x', labelrotation=10) # 10도 회전","metadata":{"_cell_guid":"e17e9a96-2d8f-5ba7-19b8-9f1f35709bb9","papermill":{"duration":0.825902,"end_time":"2021-09-01T15:20:20.228627","exception":false,"start_time":"2021-09-01T15:20:19.402725","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:31.798648Z","iopub.execute_input":"2022-07-14T04:57:31.799660Z","iopub.status.idle":"2022-07-14T04:57:32.436399Z","shell.execute_reply.started":"2022-07-14T04:57:31.799575Z","shell.execute_reply":"2022-07-14T04:57:32.435203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 포인트플롯","metadata":{"papermill":{"duration":0.035955,"end_time":"2021-09-01T15:20:20.300416","exception":false,"start_time":"2021-09-01T15:20:20.264461","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 스텝 1 : m행 n열 Figure 준비\nmpl.rc('font', size=11)\nfigure, axes = plt.subplots(nrows=5) # 5행 1열\nfigure.set_size_inches(12, 18)\n\n# 스텝 2 : 서브플롯 할당\n# 근무일, 공휴일, 요일, 계절, 날씨에 따른 시간대별 평균 대여 수량 포인트플롯\nsns.pointplot(x='hour', y='count', data=train, hue='workingday', ax=axes[0])\nsns.pointplot(x='hour', y='count', data=train, hue='holiday', ax=axes[1])\nsns.pointplot(x='hour', y='count', data=train, hue='weekday', ax=axes[2])\nsns.pointplot(x='hour', y='count', data=train, hue='season', ax=axes[3])\nsns.pointplot(x='hour', y='count', data=train, hue='weather', ax=axes[4]);","metadata":{"papermill":{"duration":18.5255,"end_time":"2021-09-01T15:20:38.861756","exception":false,"start_time":"2021-09-01T15:20:20.336256","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:32.437994Z","iopub.execute_input":"2022-07-14T04:57:32.438364Z","iopub.status.idle":"2022-07-14T04:57:45.468724Z","shell.execute_reply.started":"2022-07-14T04:57:32.438325Z","shell.execute_reply":"2022-07-14T04:57:45.467752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 회귀선을 포함한 산점도 그래프","metadata":{"papermill":{"duration":0.042257,"end_time":"2021-09-01T15:20:38.946635","exception":false,"start_time":"2021-09-01T15:20:38.904378","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# 스텝 1 : m행 n열 Figure 준비\nmpl.rc('font', size=15)\nfigure, axes = plt.subplots(nrows=2, ncols=2) # 2행 2열\nplt.tight_layout()\nfigure.set_size_inches(7, 6)\n\n# 스텝 2 : 서브플롯 할당\n# 온도, 체감 온도, 풍속, 습도 별 대여 수량 산점도 그래프\nsns.regplot(x='temp', y='count', data=train, ax=axes[0, 0], \n            scatter_kws={'alpha': 0.2}, line_kws={'color': 'blue'})\nsns.regplot(x='atemp', y='count', data=train, ax=axes[0, 1], \n            scatter_kws={'alpha': 0.2}, line_kws={'color': 'blue'})\nsns.regplot(x='windspeed', y='count', data=train, ax=axes[1, 0], \n            scatter_kws={'alpha': 0.2}, line_kws={'color': 'blue'})\nsns.regplot(x='humidity', y='count', data=train, ax=axes[1, 1], \n            scatter_kws={'alpha': 0.2}, line_kws={'color': 'blue'});","metadata":{"papermill":{"duration":3.467997,"end_time":"2021-09-01T15:20:42.457258","exception":false,"start_time":"2021-09-01T15:20:38.989261","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:45.470249Z","iopub.execute_input":"2022-07-14T04:57:45.470810Z","iopub.status.idle":"2022-07-14T04:57:51.562050Z","shell.execute_reply.started":"2022-07-14T04:57:45.470774Z","shell.execute_reply":"2022-07-14T04:57:51.560535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 히트맵","metadata":{"papermill":{"duration":0.045675,"end_time":"2021-09-01T15:20:42.548858","exception":false,"start_time":"2021-09-01T15:20:42.503183","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train[['temp', 'atemp', 'humidity', 'windspeed', 'count']].corr()","metadata":{"papermill":{"duration":0.068902,"end_time":"2021-09-01T15:20:42.664051","exception":false,"start_time":"2021-09-01T15:20:42.595149","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:51.563402Z","iopub.execute_input":"2022-07-14T04:57:51.563761Z","iopub.status.idle":"2022-07-14T04:57:51.583488Z","shell.execute_reply.started":"2022-07-14T04:57:51.563729Z","shell.execute_reply":"2022-07-14T04:57:51.582143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 피처 간 상관관계 매트릭스\ncorrMat = train[['temp', 'atemp', 'humidity', 'windspeed', 'count']].corr() \nfig, ax= plt.subplots() \nfig.set_size_inches(10, 10)\nsns.heatmap(corrMat, annot=True) # 상관관계 히트맵 그리기\nax.set(title='Heatmap of Numerical Data');","metadata":{"papermill":{"duration":0.392404,"end_time":"2021-09-01T15:20:43.102786","exception":false,"start_time":"2021-09-01T15:20:42.710382","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-07-14T04:57:51.585017Z","iopub.execute_input":"2022-07-14T04:57:51.585438Z","iopub.status.idle":"2022-07-14T04:57:51.887144Z","shell.execute_reply.started":"2022-07-14T04:57:51.585409Z","shell.execute_reply":"2022-07-14T04:57:51.885598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. 자전거 대여 수요 예측 경진대회 베이스라인 모델\n\n* **메뉴: [Run] -> [Stop Session] 후 여기서부터 실행 권장.(필수아님)**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n# 데이터 경로\ndata_path = '/kaggle/input/bike-sharing-demand/'\n\ntrain = pd.read_csv(data_path + 'train.csv')\ntest = pd.read_csv(data_path + 'test.csv')\nsubmission = pd.read_csv(data_path + 'sampleSubmission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:51.888886Z","iopub.execute_input":"2022-07-14T04:57:51.889275Z","iopub.status.idle":"2022-07-14T04:57:51.948242Z","shell.execute_reply.started":"2022-07-14T04:57:51.889235Z","shell.execute_reply":"2022-07-14T04:57:51.947084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.1 피처 엔지니어링","metadata":{}},{"cell_type":"markdown","source":"### 이상치 제거","metadata":{}},{"cell_type":"code","source":"# 훈련 데이터에서 weather가 4가 아닌 데이터만 추출\ntrain = train[train['weather'] != 4]","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:51.949474Z","iopub.execute_input":"2022-07-14T04:57:51.950525Z","iopub.status.idle":"2022-07-14T04:57:51.957495Z","shell.execute_reply.started":"2022-07-14T04:57:51.950491Z","shell.execute_reply":"2022-07-14T04:57:51.956567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 데이터 합치기","metadata":{}},{"cell_type":"code","source":"all_data_temp = pd.concat([train, test])\nall_data_temp","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:51.959502Z","iopub.execute_input":"2022-07-14T04:57:51.960149Z","iopub.status.idle":"2022-07-14T04:57:51.997922Z","shell.execute_reply.started":"2022-07-14T04:57:51.960112Z","shell.execute_reply":"2022-07-14T04:57:51.996658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_data = pd.concat([train, test], ignore_index=True)\nall_data","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:51.999602Z","iopub.execute_input":"2022-07-14T04:57:52.000351Z","iopub.status.idle":"2022-07-14T04:57:52.030770Z","shell.execute_reply.started":"2022-07-14T04:57:52.000317Z","shell.execute_reply":"2022-07-14T04:57:52.029842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 파생 변수(피처) 추가","metadata":{}},{"cell_type":"code","source":"from datetime import datetime\n\n# 날짜 피처 생성\nall_data['date'] = all_data['datetime'].apply(lambda x: x.split()[0])\n# 연도 피처 생성\nall_data['year'] = all_data['datetime'].apply(lambda x: x.split()[0].split('-')[0])\n# 월 피처 생성\nall_data['month'] = all_data['datetime'].apply(lambda x: x.split()[0].split('-')[1])\n# 시 피처 생성\nall_data['hour'] = all_data['datetime'].apply(lambda x: x.split()[1].split(':')[0])\n# 요일 피처 생성\nall_data[\"weekday\"] = all_data['date'].apply(lambda dateString : datetime.strptime(dateString,\"%Y-%m-%d\").weekday())","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.031889Z","iopub.execute_input":"2022-07-14T04:57:52.032570Z","iopub.status.idle":"2022-07-14T04:57:52.363645Z","shell.execute_reply.started":"2022-07-14T04:57:52.032530Z","shell.execute_reply":"2022-07-14T04:57:52.362890Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 필요 없는 피처 제거","metadata":{}},{"cell_type":"code","source":"drop_features = ['casual', 'registered', 'datetime', 'date', 'windspeed', 'month']\n\nall_data = all_data.drop(drop_features, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.364671Z","iopub.execute_input":"2022-07-14T04:57:52.365145Z","iopub.status.idle":"2022-07-14T04:57:52.374548Z","shell.execute_reply.started":"2022-07-14T04:57:52.365117Z","shell.execute_reply":"2022-07-14T04:57:52.373364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 데이터 나누기","metadata":{}},{"cell_type":"code","source":"# 훈련 데이터와 테스트 데이터 나누기\nX_train = all_data[~pd.isnull(all_data['count'])]\nX_test = all_data[pd.isnull(all_data['count'])]\n\n# 타깃값 count 제거\nX_train = X_train.drop(['count'], axis=1)\nX_test = X_test.drop(['count'], axis=1)\n\ny = train['count'] # 타깃값","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.375780Z","iopub.execute_input":"2022-07-14T04:57:52.376052Z","iopub.status.idle":"2022-07-14T04:57:52.388011Z","shell.execute_reply.started":"2022-07-14T04:57:52.376023Z","shell.execute_reply":"2022-07-14T04:57:52.387016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.389454Z","iopub.execute_input":"2022-07-14T04:57:52.389762Z","iopub.status.idle":"2022-07-14T04:57:52.406240Z","shell.execute_reply.started":"2022-07-14T04:57:52.389737Z","shell.execute_reply":"2022-07-14T04:57:52.404111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.2 평가지표 계산 함수 작성","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef rmsle(y_true, y_pred, convertExp=True):\n    # 지수변환\n    if convertExp:\n        y_true = np.exp(y_true)\n        y_pred = np.exp(y_pred)\n        \n    # 로그변환 후 결측값을 0으로 변환\n    log_true = np.nan_to_num(np.log(y_true+1))\n    log_pred = np.nan_to_num(np.log(y_pred+1))\n    \n    # RMSLE 계산\n    output = np.sqrt(np.mean((log_true - log_pred)**2))\n    return output","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.408139Z","iopub.execute_input":"2022-07-14T04:57:52.408527Z","iopub.status.idle":"2022-07-14T04:57:52.415548Z","shell.execute_reply.started":"2022-07-14T04:57:52.408499Z","shell.execute_reply":"2022-07-14T04:57:52.414139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.3 모델 훈련","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import LinearRegression\n\nlinear_reg_model = LinearRegression()","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.417350Z","iopub.execute_input":"2022-07-14T04:57:52.417754Z","iopub.status.idle":"2022-07-14T04:57:52.894976Z","shell.execute_reply.started":"2022-07-14T04:57:52.417721Z","shell.execute_reply":"2022-07-14T04:57:52.894090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"log_y = np.log(y)  # 타깃값 로그변환\nlinear_reg_model.fit(X_train, log_y) # 모델 훈련","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.896298Z","iopub.execute_input":"2022-07-14T04:57:52.896772Z","iopub.status.idle":"2022-07-14T04:57:52.945844Z","shell.execute_reply.started":"2022-07-14T04:57:52.896742Z","shell.execute_reply":"2022-07-14T04:57:52.944586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.4 모델 성능 검증","metadata":{}},{"cell_type":"code","source":"preds = linear_reg_model.predict(X_train)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.947535Z","iopub.execute_input":"2022-07-14T04:57:52.947886Z","iopub.status.idle":"2022-07-14T04:57:52.975464Z","shell.execute_reply.started":"2022-07-14T04:57:52.947851Z","shell.execute_reply":"2022-07-14T04:57:52.974545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print (f'선형회귀의 RMSLE 값 : {rmsle(log_y, preds, True):.4f}')","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.980090Z","iopub.execute_input":"2022-07-14T04:57:52.980748Z","iopub.status.idle":"2022-07-14T04:57:52.992784Z","shell.execute_reply.started":"2022-07-14T04:57:52.980710Z","shell.execute_reply":"2022-07-14T04:57:52.991777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.5 예측 및 결과 제출","metadata":{}},{"cell_type":"code","source":"linearreg_preds = linear_reg_model.predict(X_test) # 테스트 데이터로 예측\n\nsubmission['count'] = np.exp(linearreg_preds)    # 지수변환\nsubmission.to_csv('first_submission.csv', index=False) # 파일로 저장","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:52.995725Z","iopub.execute_input":"2022-07-14T04:57:52.999729Z","iopub.status.idle":"2022-07-14T04:57:53.055145Z","shell.execute_reply.started":"2022-07-14T04:57:52.999681Z","shell.execute_reply":"2022-07-14T04:57:53.054138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"자, 여러분들이 여기까지 정상적으로 하셨다면 'Output/kaggle/working에 first_submission.csv이 생성되었을 겁니다.\n\n저 파일을 다운로드해서 직접 대회에 제출하고 평가 점수를 살펴보세요.","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. 자전거 대여 수요 예측 경진대회 모델 성능 개선\n\n* **메뉴: [Run] -> [Stop Session] 후 여기서부터 실행 권장.(필수아님)**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n# 데이터 경로\ndata_path = '/kaggle/input/bike-sharing-demand/'\n\ntrain = pd.read_csv(data_path + 'train.csv')\ntest = pd.read_csv(data_path + 'test.csv')\nsubmission = pd.read_csv(data_path + 'sampleSubmission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.059713Z","iopub.execute_input":"2022-07-14T04:57:53.061939Z","iopub.status.idle":"2022-07-14T04:57:53.102308Z","shell.execute_reply.started":"2022-07-14T04:57:53.061900Z","shell.execute_reply":"2022-07-14T04:57:53.101504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 피처 엔지니어링","metadata":{}},{"cell_type":"markdown","source":"### 이상치 제거","metadata":{}},{"cell_type":"code","source":"# 훈련 데이터에서 weather가 4가 아닌 데이터만 추출\ntrain = train[train['weather'] != 4]","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.105996Z","iopub.execute_input":"2022-07-14T04:57:53.106463Z","iopub.status.idle":"2022-07-14T04:57:53.115170Z","shell.execute_reply.started":"2022-07-14T04:57:53.106437Z","shell.execute_reply":"2022-07-14T04:57:53.113746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 데이터 합치기","metadata":{}},{"cell_type":"code","source":"all_data = pd.concat([train, test], ignore_index=True)\nall_data","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.117065Z","iopub.execute_input":"2022-07-14T04:57:53.117782Z","iopub.status.idle":"2022-07-14T04:57:53.153802Z","shell.execute_reply.started":"2022-07-14T04:57:53.117743Z","shell.execute_reply":"2022-07-14T04:57:53.152692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 파생 변수(피처) 추가","metadata":{}},{"cell_type":"code","source":"from datetime import datetime\n\n# 날짜 피처 생성\nall_data['date'] = all_data['datetime'].apply(lambda x: x.split()[0])\n# 연도 피처 생성\nall_data['year'] = all_data['datetime'].apply(lambda x: x.split()[0].split('-')[0])\n# 월 피처 생성\nall_data['month'] = all_data['datetime'].apply(lambda x: x.split()[0].split('-')[1])\n# 시 피처 생성\nall_data['hour'] = all_data['datetime'].apply(lambda x: x.split()[1].split(':')[0])\n# 요일 피처 생성\nall_data[\"weekday\"] = all_data['date'].apply(lambda dateString : datetime.strptime(dateString,\"%Y-%m-%d\").weekday())","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.155173Z","iopub.execute_input":"2022-07-14T04:57:53.155785Z","iopub.status.idle":"2022-07-14T04:57:53.484895Z","shell.execute_reply.started":"2022-07-14T04:57:53.155753Z","shell.execute_reply":"2022-07-14T04:57:53.484074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 필요 없는 피처 제거","metadata":{}},{"cell_type":"code","source":"drop_features = ['casual', 'registered', 'datetime', 'date', 'windspeed', 'month']\n\nall_data = all_data.drop(drop_features, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.486165Z","iopub.execute_input":"2022-07-14T04:57:53.487000Z","iopub.status.idle":"2022-07-14T04:57:53.497660Z","shell.execute_reply.started":"2022-07-14T04:57:53.486940Z","shell.execute_reply":"2022-07-14T04:57:53.496777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 데이터 나누기","metadata":{}},{"cell_type":"code","source":"# 훈련 데이터와 테스트 데이터 나누기\nX_train = all_data[~pd.isnull(all_data['count'])]\nX_test = all_data[pd.isnull(all_data['count'])]\n\n# 타깃값 count 제거\nX_train = X_train.drop(['count'], axis=1)\nX_test = X_test.drop(['count'], axis=1)\n\ny = train['count'] # 타깃값","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.504615Z","iopub.execute_input":"2022-07-14T04:57:53.505709Z","iopub.status.idle":"2022-07-14T04:57:53.519262Z","shell.execute_reply.started":"2022-07-14T04:57:53.505672Z","shell.execute_reply":"2022-07-14T04:57:53.518153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 평가지표 계산 함수 작성","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef rmsle(y_true, y_pred, convertExp=True):\n    # 지수변환\n    if convertExp:\n        y_true = np.exp(y_true)\n        y_pred = np.exp(y_pred)\n        \n    # 로그변환 후 결측값을 0으로 변환\n    log_true = np.nan_to_num(np.log(y_true+1))\n    log_pred = np.nan_to_num(np.log(y_pred+1))\n    \n    # RMSLE 계산\n    output = np.sqrt(np.mean((log_true - log_pred)**2))\n    return output","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.520601Z","iopub.execute_input":"2022-07-14T04:57:53.521424Z","iopub.status.idle":"2022-07-14T04:57:53.530368Z","shell.execute_reply.started":"2022-07-14T04:57:53.521392Z","shell.execute_reply":"2022-07-14T04:57:53.528919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3.1 성능 개선 I : 릿지 회귀 모델","metadata":{}},{"cell_type":"markdown","source":"## 3.1.1 하이퍼 파라미터 최적화(모델 훈련)","metadata":{}},{"cell_type":"markdown","source":"### 모델 생성","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import Ridge\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn import metrics\n\nridge_model = Ridge()","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.531551Z","iopub.execute_input":"2022-07-14T04:57:53.531931Z","iopub.status.idle":"2022-07-14T04:57:53.544156Z","shell.execute_reply.started":"2022-07-14T04:57:53.531894Z","shell.execute_reply":"2022-07-14T04:57:53.542570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 그리드서치 객체 생성","metadata":{}},{"cell_type":"code","source":"# 하이퍼 파라미터 값 목록\nridge_params = {'max_iter':[3000], 'alpha':[0.1, 1, 2, 3, 4, 10, 30, 100, 200, 300, 400, 800, 900, 1000]}\n\n# 교차 검증용 평가 함수(RMSLE 점수 계산)\nrmsle_scorer = metrics.make_scorer(rmsle, greater_is_better=False)\n# 그리드서치(with 릿지) 객체 생성\ngridsearch_ridge_model = GridSearchCV(estimator=ridge_model,   # 릿지 모델\n                                      param_grid=ridge_params, # 값 목록\n                                      scoring=rmsle_scorer,    # 평가지표\n                                      cv=5)                    # 교차검증 분할 수","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.545904Z","iopub.execute_input":"2022-07-14T04:57:53.546845Z","iopub.status.idle":"2022-07-14T04:57:53.555799Z","shell.execute_reply.started":"2022-07-14T04:57:53.546811Z","shell.execute_reply":"2022-07-14T04:57:53.554972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 그리드서치 수행","metadata":{}},{"cell_type":"code","source":"log_y = np.log(y) # 타깃값 로그변환\ngridsearch_ridge_model.fit(X_train, log_y) # 훈련(그리드서치)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:53.557744Z","iopub.execute_input":"2022-07-14T04:57:53.558075Z","iopub.status.idle":"2022-07-14T04:57:55.541237Z","shell.execute_reply.started":"2022-07-14T04:57:53.558038Z","shell.execute_reply":"2022-07-14T04:57:55.540122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('최적 하이퍼파라미터 :', gridsearch_ridge_model.best_params_)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:55.544618Z","iopub.execute_input":"2022-07-14T04:57:55.547058Z","iopub.status.idle":"2022-07-14T04:57:55.555499Z","shell.execute_reply.started":"2022-07-14T04:57:55.547019Z","shell.execute_reply":"2022-07-14T04:57:55.554741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.1.2 성능 검증","metadata":{}},{"cell_type":"code","source":"# 예측\npreds = gridsearch_ridge_model.best_estimator_.predict(X_train) \n\n# 평가\nprint(f'릿지 회귀 RMSLE 값 : {rmsle(log_y, preds, True):.4f}') ","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:55.559558Z","iopub.execute_input":"2022-07-14T04:57:55.560193Z","iopub.status.idle":"2022-07-14T04:57:55.595464Z","shell.execute_reply.started":"2022-07-14T04:57:55.560158Z","shell.execute_reply":"2022-07-14T04:57:55.594552Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3.2 성능 개선 II : 라쏘 회귀 모델","metadata":{}},{"cell_type":"markdown","source":"## 3.2.1 하이퍼 파라미터 최적화(모델 훈련)","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import Lasso\n\n# 모델 생성\nlasso_model = Lasso()\n# 하이퍼파라미터 값 목록\nlasso_alpha = 1/np.array([0.1, 1, 2, 3, 4, 10, 30, 100, 200, 300, 400, 800, 900, 1000])\nlasso_params = {'max_iter':[3000], 'alpha':lasso_alpha}\n# 그리드서치(with 라쏘) 객체 생성\ngridsearch_lasso_model = GridSearchCV(estimator=lasso_model,\n                                      param_grid=lasso_params,\n                                      scoring=rmsle_scorer,\n                                      cv=5)\n# 그리드서치 수행\nlog_y = np.log(y)\ngridsearch_lasso_model.fit(X_train, log_y)\n\nprint('최적 하이퍼파라미터 :', gridsearch_lasso_model.best_params_)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:55.599781Z","iopub.execute_input":"2022-07-14T04:57:55.602049Z","iopub.status.idle":"2022-07-14T04:57:59.696070Z","shell.execute_reply.started":"2022-07-14T04:57:55.602010Z","shell.execute_reply":"2022-07-14T04:57:59.695282Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.2.2 성능 검증","metadata":{}},{"cell_type":"code","source":"# 예측\npreds = gridsearch_lasso_model.best_estimator_.predict(X_train)\n\n# 평가\nprint(f'라쏘 회귀 RMSLE 값 : {rmsle(log_y, preds, True):.4f}')","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:59.697976Z","iopub.execute_input":"2022-07-14T04:57:59.699183Z","iopub.status.idle":"2022-07-14T04:57:59.735159Z","shell.execute_reply.started":"2022-07-14T04:57:59.699149Z","shell.execute_reply":"2022-07-14T04:57:59.734209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3.3 성능 개선 III : 랜덤 포레스트 회귀 모델","metadata":{}},{"cell_type":"markdown","source":"## 3.3.1 하이퍼 파라미터 최적화(모델 훈련)","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestRegressor\n\n# 모델 생성\nrandomforest_model = RandomForestRegressor()\n# 그리드서치 객체 생성\nrf_params = {'random_state':[42], 'n_estimators':[100, 120, 140]}\ngridsearch_random_forest_model = GridSearchCV(estimator=randomforest_model,\n                                              param_grid=rf_params,\n                                              scoring=rmsle_scorer,\n                                              cv=5)\n# 그리드서치 수행\nlog_y = np.log(y)\ngridsearch_random_forest_model.fit(X_train, log_y)\n\nprint('최적 하이퍼파라미터 :', gridsearch_random_forest_model.best_params_)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:57:59.737060Z","iopub.execute_input":"2022-07-14T04:57:59.738415Z","iopub.status.idle":"2022-07-14T04:58:58.138204Z","shell.execute_reply.started":"2022-07-14T04:57:59.738371Z","shell.execute_reply":"2022-07-14T04:58:58.137003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.3.2 모델 성능 검증","metadata":{}},{"cell_type":"code","source":"# 예측\npreds = gridsearch_random_forest_model.best_estimator_.predict(X_train)\n\n# 평가\nprint(f'랜덤 포레스트 회귀 RMSLE 값 : {rmsle(log_y, preds, True):.4f}')","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:58:58.140231Z","iopub.execute_input":"2022-07-14T04:58:58.140596Z","iopub.status.idle":"2022-07-14T04:58:58.428149Z","shell.execute_reply.started":"2022-07-14T04:58:58.140551Z","shell.execute_reply":"2022-07-14T04:58:58.427156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.3.3 예측 및 결과 제출","metadata":{}},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\nrandomforest_preds = gridsearch_random_forest_model.best_estimator_.predict(X_test)\n\nfigure, axes = plt.subplots(ncols=2)\nfigure.set_size_inches(10, 4)\n\nsns.histplot(y, bins=50, ax=axes[0])\naxes[0].set_title('Train Data Distribution')\nsns.histplot(np.exp(randomforest_preds), bins=50, ax=axes[1])\naxes[1].set_title('Predicted Test Data Distribution');","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:58:58.429202Z","iopub.execute_input":"2022-07-14T04:58:58.430255Z","iopub.status.idle":"2022-07-14T04:58:59.057403Z","shell.execute_reply.started":"2022-07-14T04:58:58.430221Z","shell.execute_reply":"2022-07-14T04:58:59.056349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['count'] = np.exp(randomforest_preds) # 지수변환\nsubmission.to_csv('second_submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-14T04:58:59.058744Z","iopub.execute_input":"2022-07-14T04:58:59.059020Z","iopub.status.idle":"2022-07-14T04:58:59.091175Z","shell.execute_reply.started":"2022-07-14T04:58:59.058991Z","shell.execute_reply":"2022-07-14T04:58:59.089570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"자, 여러분들이 여기까지 정상적으로 하셨다면 'Output/kaggle/working에 second_submission.csv이 생성되었을 겁니다.\n\n저 파일을 다운로드해서 직접 대회에 제출하고 평가 점수를 살펴보세요.","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. Challenge","metadata":{}},{"cell_type":"markdown","source":"점수를 확인하셨나요?\n\n아마 점수가 높을겁니다. 하지만 높다고해서 순위권에 가깝다고 할 수 없습니다.\n\n자, 이번주는 필사 후 여러분들이 스스로 Challenge를 하는것 입니다. 왜냐하면 다다음주에 1차 해커톤을 위함입니다.\n\n다음은 당연한 Tip을 열거했습니다.\n1. 성능향상을 위한 추가적인 EDA 고민\n2. feature에 대한 분석, 생성, 제거작업 추가진행\n3. 모델 종류에 대한 고민\n4. 모델 최적화에 대한 고민\n\n---\n\n<추가사항>\n\n**추가적으로 Challenge를 하여서 부산 2기 내에서 점수 순위를 산정해보려고 합니다.**\n\n**전체인원을 집계할 생각은 전혀 없으며, 스스로 성능향상을 해보신 분에 한정해서 순위산정을 해보려고 합니다.**\n\n**목요일 캐글 필사시간 전까지 집계를 해보겠습니다.**\n\n**1등하신분께는 금요일에 ㄹㅇ 바로 팔선생 데려갑니다.(간짜장)**","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}