Python을 이용한 실전 머신러닝 (2)
In [2]:
1. Data Description
출처: Dacon 13회 제주 퇴근시간 버스승차인원 예측
평가지표: RMSE
In [3]:
1. train.csv / test.csv
train: 2019-09-01 ~ 2019-09-30 / test: 2019-10-01 ~ 2019-10-16
id : id 해당 데이터에서의 고유한 ID(train, test와의 중복은 없음)
data : 날짜
bus_route_id : 노선 ID
in_out : 시내버스, 시외버스 구분
station_code : 승하차 정류소 ID
station_name : 승하차 정류소 이름
lattitude : 위도 (같은 정류장 이름이어도 버스의 진행 방향에 따라 다를 수 있음)
logitude : 경도 (같은 정류장 이름이어도 버스의 진행 방향에 따라 다를 수 있음)
h~h+1_ride : 해당 시간 사이 승차한 인원수
h~h+1_takeoff : 해당 시간 사이 하차한 인원수
18~20_ride : 해당시간 사이 승차한 인원수 (target variable)
In [4]:
In [5]:
id | date | bus_route_id | in_out | station_code | station_name | latitude | longitude | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | 18~20_ride | |
0 | 0 | 2019-09-01 | 4270000 | 시외 | 344 | 제주썬호텔 | 33.48990 | 126.49373 | 0.0 | 1.0 | 2.0 | 5.0 | 2.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1 | 2019-09-01 | 4270000 | 시외 | 357 | 한라병원 | 33.48944 | 126.48508 | 1.0 | 4.0 | 4.0 | 2.0 | 5.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.0 |
2 | 2 | 2019-09-01 | 4270000 | 시외 | 432 | 정존마을 | 33.48181 | 126.47352 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 |
3 | 3 | 2019-09-01 | 4270000 | 시내 | 1579 | 제주국제공항(600번) | 33.50577 | 126.49252 | 0.0 | 17.0 | 6.0 | 26.0 | 14.0 | 16.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 53.0 |
4 | 4 | 2019-09-01 | 4270000 | 시내 | 1646 | 중문관광단지입구 | 33.25579 | 126.41260 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 |
415418 | 415418 | 2019-09-30 | 32820000 | 시내 | 1129 | 한림환승정류장(한림리) | 33.41437 | 126.26336 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415419 | 415419 | 2019-09-30 | 32820000 | 시내 | 1564 | 제주시외버스터미널 | 33.49946 | 126.51479 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415420 | 415420 | 2019-09-30 | 32820000 | 시내 | 2322 | 해병부대 | 33.23100 | 126.26273 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415421 | 415421 | 2019-09-30 | 32820000 | 시내 | 3291 | 애월환승정류장(애월리) | 33.46483 | 126.31870 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415422 | 415422 | 2019-09-30 | 32820000 | 시내 | 6115100 | 서귀포시외버스터미널 | 33.24873 | 126.50799 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [6]:
id | date | bus_route_id | in_out | station_code | station_name | latitude | longitude | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | |
0 | 415423 | 2019-10-01 | 4270000 | 시외 | 344 | 제주썬호텔 | 33.48990 | 126.49373 | 4.0 | 4.0 | 7.0 | 2.0 | 9.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 |
1 | 415424 | 2019-10-01 | 4270000 | 시외 | 357 | 한라병원 | 33.48944 | 126.48508 | 1.0 | 6.0 | 6.0 | 1.0 | 8.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 415425 | 2019-10-01 | 4270000 | 시외 | 432 | 정존마을 | 33.48181 | 126.47352 | 2.0 | 4.0 | 2.0 | 2.0 | 2.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 415426 | 2019-10-01 | 4270000 | 시내 | 1579 | 제주국제공항(600번) | 33.50577 | 126.49252 | 1.0 | 11.0 | 18.0 | 8.0 | 26.0 | 20.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 415427 | 2019-10-01 | 4270000 | 시내 | 1636 | 롯데호텔 | 33.24872 | 126.41032 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 |
228165 | 643588 | 2019-10-16 | 32820000 | 시내 | 786 | 고산환승정류장(고산1리) | 33.30073 | 126.18044 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.0 | 0.0 | 0.0 | 0.0 | 0.0 |
228166 | 643589 | 2019-10-16 | 32820000 | 시내 | 1080 | 애월고등학교 | 33.46262 | 126.33447 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
228167 | 643590 | 2019-10-16 | 32820000 | 시내 | 1129 | 한림환승정류장(한림리) | 33.41437 | 126.26336 | 3.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
228168 | 643591 | 2019-10-16 | 32820000 | 시내 | 1564 | 제주시외버스터미널 | 33.49946 | 126.51479 | 3.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
228169 | 643592 | 2019-10-16 | 32820000 | 시내 | 6115100 | 서귀포시외버스터미널 | 33.24873 | 126.50799 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.0 | 0.0 | 0.0 | 0.0 |
In [8]:
Out[8]:
왼쪽 위의 값이 이상치처럼 보이지만, test data에도 이러한 값이 존재하므로 제거하지 않기로 한다
2. bus_bts.csv
2019-09-01 ~ 2019-10-16
user_card_id: 승객의 버스카드ID
bus_route_id: 노선ID
vhc_id: 차량ID
geton_date: 승객이 탑승한 날짜
geton_time: 승객이 탑승한 시간
geton_station_code: 승차정류소의 ID
geton_station_name: 승차정류소의 이름
getoff_date: 해당 승객이 하차한 날짜 (하차태그 없는 경우, NaN)
getoff_time: 해당 승객이 하차한 시간 (하차태그 없는 경우, NaN)
getoff_station_code: 하차정류소의 ID (하차태그 없는 경우, NaN)
getoff_station_name: 하차정류소의 이름 (하차태그 없는 경우, NaN)
user_category: 승객 구분 (01-일반, 02-어린이, 04-청소년, 06-경로, 27-장애 일반, 28-장애 동반, 29-유공 일반, 30-유공 동반)
user_count: 해당 버스카드로 계산한 인원수 ( ex- 3은 3명 분의 버스비를 해당 카드 하나로 계산한 것)
In [9]:
user_card_id | bus_route_id | vhc_id | geton_date | geton_time | geton_station_code | geton_station_name | getoff_date | getoff_time | getoff_station_code | getoff_station_name | user_category | user_count | |
0 | 1.010010e+15 | 23000000 | 149793674 | 2019-09-10 | 06:34:45 | 360 | 노형오거리 | 2019-09-10 | 07:10:31 | 592.0 | 화북초등학교 | 1 | 1 |
1 | 1.010010e+15 | 23000000 | 149793674 | 2019-09-10 | 06:34:58 | 360 | 노형오거리 | 2019-09-10 | 06:56:27 | 3273.0 | 고산동산(광양방면) | 1 | 1 |
2 | 1.019160e+15 | 21420000 | 149793535 | 2019-09-10 | 07:19:07 | 2495 | 동광환승정류장4(제주방면) | 2019-09-10 | 07:40:29 | 431.0 | 정존마을 | 4 | 1 |
3 | 1.019150e+15 | 21420000 | 149793512 | 2019-09-09 | 09:14:47 | 3282 | 대정환승정류장(대정읍사무소) | 2019-09-09 | 10:02:46 | 431.0 | 정존마을 | 1 | 1 |
4 | 1.010010e+15 | 21420000 | 149793512 | 2019-09-09 | 09:28:53 | 2820 | 삼정지에듀 | 2019-09-09 | 10:21:37 | 2972.0 | 제주국제공항(종점) | 4 | 1 |
2409409 | 6.573162e+15 | 30420000 | 149797565 | 2019-10-16 | 07:08:31 | 1937 | L마트 | NaN | NaN | NaN | NaN | 1 | 1 |
2409410 | 9.441160e+15 | 30420000 | 149797565 | 2019-10-16 | 07:16:31 | 1908 | 한라산교회 | NaN | NaN | NaN | NaN | 1 | 1 |
2409411 | 9.446038e+15 | 25070000 | 149797565 | 2019-10-16 | 08:29:05 | 1882 | 고도농원 | NaN | NaN | NaN | NaN | 1 | 1 |
2409412 | 4.309690e+15 | 25070000 | 149797565 | 2019-10-16 | 08:40:32 | 1938 | 주공아파트5단지 | NaN | NaN | NaN | NaN | 1 | 1 |
2409413 | 5.272898e+15 | 25070000 | 149797565 | 2019-10-16 | 08:40:35 | 1938 | 주공아파트5단지 | NaN | NaN | NaN | NaN | 1 | 1 |
bus 데이터는 train, test 날짜의 데이터를 모두 가지고 있으므로, 날짜에 맞춰서 split 해 주어야 한다In [10]:
In [11]:
user_card_id | bus_route_id | vhc_id | geton_date | geton_time | geton_station_code | geton_station_name | getoff_date | getoff_time | getoff_station_code | getoff_station_name | user_category | user_count | |
1548759 | 4.020178e+15 | 28510000 | 149793051 | 2019-10-01 | 10:11:16 | 2597 | 온평초등학교 | 2019-10-01 | 10:50:28 | 1013.0 | 세화환승정류장(세화리) | 1 | 1 |
1611440 | 1.019150e+15 | 23250000 | 149797049 | 2019-10-01 | 10:05:46 | 187 | 은남동 | NaN | NaN | NaN | NaN | 1 | 1 |
In [12]:
In [13]:
Out[13]:
3. target distribution
In [14]:
Out[14]:
In [15]:
Out[15]:
예측해야 할 target 변수의 값이 0에 몰려있음을 알 수 있다
승차인원 예측 데이터의 경우 선형회귀를 진행하기보다는 부스팅 모델을 사용하는 것이 더 나아 보이므로, 로그변환은 하지 않기로 결정한다
2. Data Preprocessing
1. 날짜
1) datetime 형태로 바꿔주기
In [16]:
In [17]:
2) 날짜 변수 생성: day
In [18]:
3) 주말 변수 생성: 월~금 1, 토~일 0
In [19]:
In [20]:
In [25]:
Out[25]:
4) 공휴일 변수 생성 (적용되지 않음 ㅠㅠ)
In [21]:
In [22]:
In [24]:
Out[24]:
In [ ]:
In [ ]:
In [ ]:
2. 버스 타입
시내 / 시외버스: dummy 변수화
In [26]:
In [27]:
Out[27]:
3. bus_route_id
train/test data와 bus_bts data에서 겹치는 feature는 bus_route_id (노선ID) 이다. 이를 기준으로 새로운 변수를 생성하고, train/test data와 bus data를 합친다.
1) train/test 데이터와 bus_bts 데이터의 노선아이디의 unique 갯수가 같은 지 확인한다
In [28]:
Out[28]:
In [29]:
Out[29]:
1개가 다른걸 알 수 있으며, bus_bts가 가지고 있지 않은 노선번호를 확인한다In [30]:
In [31]:
In [33]:
Out[33]:
id | date | bus_route_id | in_out | station_code | station_name | latitude | longitude | 6~7_ride | 7~8_ride | ... | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | day | weekday | weekend | holiday | |
93685 | 509108 | 2019-10-07 | 31120000 | 0 | 1464 | 연동365의원 | 33.48196 | 126.49231 | 0.0 | 0.0 | ... | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 7 | 0 | 1 | 0 |
1 rows × 24 columns
2) user_category 기준으로 새로운 feature 생성하기
각각 bus_route_id 에서, 어떤 타입의 탑승객이 몇 명씩 버스를 타고 내렸는지에 대한 변수를 생성한다
In [34]:
Out[34]:
bus_route_id | geton_date | geton_station_code | user_category | |
0 | 22530000 | 2019-09-01 | 136 | 1 |
1 | 24200000 | 2019-09-01 | 2980 | 1 |
2 | 22520000 | 2019-09-01 | 148 | 1 |
3 | 22520000 | 2019-09-01 | 3270 | 6 |
4 | 22520000 | 2019-09-01 | 3274 | 27 |
In [35]:
In [36]:
In [37]:
Out[37]:
bus_route_id | user_card_id | vhc_id | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | |
0 | 4270000 | 1.809033e+19 | 760652461263 | 7343771 | 5.385456e+06 | 5078 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 4280000 | 2.983553e+19 | 1061288442301 | 15868409 | 9.714054e+06 | 7085 | 6971.0 | 75.0 | 39.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 7990000 | 8.855462e+17 | 70554576342 | 465697 | 1.154510e+05 | 471 | 131.0 | 1.0 | 26.0 | 300.0 | 4.0 | 8.0 | 1.0 | 0.0 |
3 | 8170000 | 1.957436e+19 | 296591453123 | 1580961754 | 1.456873e+09 | 1980 | 1961.0 | 6.0 | 13.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 8180000 | 1.664479e+19 | 515739581911 | 8856629 | 4.631296e+06 | 3443 | 3410.0 | 18.0 | 15.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [38]:
In [39]:
In [40]:
In [41]:
Out[41]:
bus_route_id | user_card_id | vhc_id | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | |
0 | 4270000 | 1.086216e+19 | 477841937994 | 4663582 | 3165244.0 | 3190 | 3144.0 | 35.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 4280000 | 1.602486e+19 | 584345264605 | 8704206 | 5496853.0 | 3901 | 3842.0 | 47.0 | 12.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 7990000 | 4.082501e+17 | 30259075204 | 199414 | 44652.0 | 202 | 58.0 | 5.0 | 13.0 | 122.0 | 0.0 | 3.0 | 0.0 | 1.0 |
3 | 8170000 | 4.943026e+18 | 154587059949 | 1059411962 | 887482331.0 | 1032 | 1025.0 | 1.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 8180000 | 8.856845e+18 | 270377561587 | 4611637 | 2504363.0 | 1805 | 1791.0 | 4.0 | 10.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [42]:
Out[42]:
In [43]:
In [44]:
Out[44]:
In [45]:
id | date | bus_route_id | in_out | station_code | station_name | latitude | longitude | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | 18~20_ride | day | weekday | weekend | holiday | user_card_id | vhc_id | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | |
0 | 0 | 2019-09-01 | 4270000 | 1 | 344 | 제주썬호텔 | 33.48990 | 126.49373 | 0.0 | 1.0 | 2.0 | 5.0 | 2.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1 | 2019-09-01 | 4270000 | 1 | 357 | 한라병원 | 33.48944 | 126.48508 | 1.0 | 4.0 | 4.0 | 2.0 | 5.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 2 | 2019-09-01 | 4270000 | 1 | 432 | 정존마을 | 33.48181 | 126.47352 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 3 | 2019-09-01 | 4270000 | 0 | 1579 | 제주국제공항(600번) | 33.50577 | 126.49252 | 0.0 | 17.0 | 6.0 | 26.0 | 14.0 | 16.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 53.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 4 | 2019-09-01 | 4270000 | 0 | 1646 | 중문관광단지입구 | 33.25579 | 126.41260 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415418 | 415418 | 2019-09-30 | 32820000 | 0 | 1129 | 한림환승정류장(한림리) | 33.41437 | 126.26336 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415419 | 415419 | 2019-09-30 | 32820000 | 0 | 1564 | 제주시외버스터미널 | 33.49946 | 126.51479 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415420 | 415420 | 2019-09-30 | 32820000 | 0 | 2322 | 해병부대 | 33.23100 | 126.26273 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415421 | 415421 | 2019-09-30 | 32820000 | 0 | 3291 | 애월환승정류장(애월리) | 33.46483 | 126.31870 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
415422 | 415422 | 2019-09-30 | 32820000 | 0 | 6115100 | 서귀포시외버스터미널 | 33.24873 | 126.50799 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [74]:
4. bus_route_id / station_code / station_name
새로운 feature 생성
In [47]:
1) bus_route_id
bus_route_id(노선ID)를 그룹화하여, 18~20_ride 값의 평균을 구해 새로운 변수로 생성한다In [48]:
In [49]:
In [50]:
In [51]:
2) station_code
station_code(승하차정류소 ID)를 그룹화하여, 18~20_ride 값의 평균을 구해 새로운 변수로 생성한다In [52]:
In [53]:
In [54]:
In [55]:
3) station_name
station_name(승하차정류소 이름)을 그룹화하여, 18~20_ride 값의 평균을 구해 새로운 변수로 생성한다 station_code의 경우와 비슷한 값을 가지는 변수가 생성될 것이다In [56]:
In [57]:
In [58]:
In [59]:
5. station_name
수요가 많을 것으로 예상되는 정류장
1) 학교
In [62]:
In [63]:
In [64]:
2) 공항, 환승, 터미널
In [65]:
In [66]:
In [67]:
In [75]:
id | date | bus_route_id | in_out | station_code | station_name | latitude | longitude | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | 18~20_ride | day | weekday | weekend | holiday | user_card_id | vhc_id | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | bus_route_mean | station_code_mean | station_name_mean | school | station | |
0 | 0 | 2019-09-01 | 0 | 1 | 344 | 제주썬호텔 | 33.48990 | 126.49373 | 0.0 | 1.0 | 2.0 | 5.0 | 2.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 1.466667 | 0.964286 | 0 | 0 |
1 | 1 | 2019-09-01 | 0 | 1 | 357 | 한라병원 | 33.48944 | 126.48508 | 1.0 | 4.0 | 4.0 | 2.0 | 5.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 4.178218 | 4.462080 | 0 | 0 |
2 | 2 | 2019-09-01 | 0 | 1 | 432 | 정존마을 | 33.48181 | 126.47352 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 | 1 | 6 | 0 | 0 | 1.809033e+19 | 7.606525e+11 | 7343771.0 | 5385456.0 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 2.169559 | 1.843810 | 0 | 0 |
415420 | 415420 | 2019-09-30 | 612 | 0 | 2322 | 해병부대 | 33.23100 | 126.26273 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.320652 | 0.320652 | 0 | 0 |
415421 | 415421 | 2019-09-30 | 612 | 0 | 3291 | 애월환승정류장(애월리) | 33.46483 | 126.31870 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 1.333333 | 1.111399 | 0 | 1 |
415422 | 415422 | 2019-09-30 | 612 | 0 | 6115100 | 서귀포시외버스터미널 | 33.24873 | 126.50799 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 5.773668e+17 | 2.426649e+10 | 172167.0 | 263075189.0 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.188636 | 0.188636 | 0 | 1 |
6. 최종 전처리
1) 범주형 변수: LabelEncoding
In [76]:
2) id 변수: drop features
In [80]:
In [81]:
In [82]:
bus_route_id | in_out | station_code | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | 18~20_ride | day | weekday | weekend | holiday | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | bus_route_mean | station_code_mean | station_name_mean | school | station | |
0 | 0 | 1 | 321 | 0.0 | 1.0 | 2.0 | 5.0 | 2.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 6 | 0 | 0 | 510 | 499 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 1.466667 | 0.964286 | 0 | 0 |
1 | 0 | 1 | 334 | 1.0 | 4.0 | 4.0 | 2.0 | 5.0 | 6.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.0 | 1 | 6 | 0 | 0 | 510 | 499 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 4.178218 | 4.462080 | 0 | 0 |
2 | 0 | 1 | 407 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 | 1 | 6 | 0 | 0 | 510 | 499 | 5078.0 | 5014.0 | 37.0 | 27.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 2.169559 | 1.843810 | 0 | 0 |
415420 | 612 | 0 | 2133 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 99 | 571 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.320652 | 0.320652 | 0 | 0 |
415421 | 612 | 0 | 3021 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 99 | 571 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 1.333333 | 1.111399 | 0 | 1 |
415422 | 612 | 0 | 3561 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 30 | 0 | 1 | 0 | 99 | 571 | 162.0 | 139.0 | 0.0 | 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.188636 | 0.188636 | 0 | 1 |
In [83]:
bus_route_id | in_out | station_code | 6~7_ride | 7~8_ride | 8~9_ride | 9~10_ride | 10~11_ride | 11~12_ride | 6~7_takeoff | 7~8_takeoff | 8~9_takeoff | 9~10_takeoff | 10~11_takeoff | 11~12_takeoff | day | weekday | weekend | holiday | geton_station_code | getoff_station_code | user_count | user_category_1 | user_category_2 | user_category_4 | user_category_6 | user_category_27 | user_category_28 | user_category_29 | user_category_30 | bus_route_mean | station_code_mean | station_name_mean | school | station | |
0 | 0 | 1 | 322 | 4.0 | 4.0 | 7.0 | 2.0 | 9.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 1 | 1 | 1 | 0 | 502 | 489 | 3190.0 | 3144.0 | 35.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 1.466667 | 0.964286 | 0 | 0 |
1 | 0 | 1 | 335 | 1.0 | 6.0 | 6.0 | 1.0 | 8.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 1 | 1 | 0 | 502 | 489 | 3190.0 | 3144.0 | 35.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 4.178218 | 4.462080 | 0 | 0 |
2 | 0 | 1 | 408 | 2.0 | 4.0 | 2.0 | 2.0 | 2.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 1 | 1 | 0 | 502 | 489 | 3190.0 | 3144.0 | 35.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.104381 | 2.169559 | 1.843810 | 0 | 0 |
228167 | 600 | 0 | 1035 | 3.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 16 | 2 | 1 | 0 | 106 | 562 | 110.0 | 96.0 | 0.0 | 14.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 2.393089 | 2.307617 | 0 | 1 |
228168 | 600 | 0 | 1418 | 3.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 16 | 2 | 1 | 0 | 106 | 562 | 110.0 | 96.0 | 0.0 | 14.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 7.726008 | 7.485333 | 0 | 1 |
228169 | 600 | 0 | 3503 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.0 | 0.0 | 0.0 | 0.0 | 16 | 2 | 1 | 0 | 106 | 562 | 110.0 | 96.0 | 0.0 | 14.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.188636 | 0.188636 | 0 | 1 |
3. Modeling
0. LGBM (Dacon SCORE: 2.58261)
일단 부스팅 모델에 적합해보기
In [84]:
In [85]:
Out[85]:
In [140]:
In [92]:
In [93]:
In [94]:
In [95]:
In [97]:
In [98]:
In [100]:
In [102]:
1. Grid Search
데이터가 너무 많아서 grid search하는 데에 오래 걸리므로, 랜덤으로 20%만 뽑아서 최적의 hyperparameter를 찾아보기로 한다
LGBM 외에도 다른 괜찮은 모델이 있는지 찾아보기로 한다
In [104]:
Out[104]:
In [105]:
In [106]:
Out[106]:
1) Gradient Boosting Regression
In [111]:
In [112]:
In [113]:
In [114]:
2) XGBoost
In [115]:
In [116]:
In [117]:
In [118]:
3) Ridge
In [119]:
In [120]:
4) LASSO Regression
In [121]:
5) Elastic Net Regression
In [122]:
2. Model Score
In [123]:
lightGBM
In [124]:
XGBoost
In [126]:
Random Forest (Dacon Score: 2.55016)
시간이 너무 오래 걸려서 K-Fold Cross Validation은 진행하지 않기로 함
In [134]:
In [142]:
Out[142]:
In [145]:
In [146]:
Ridge
In [127]:
Lasso
In [128]:
Elastic Net
In [129]:
3. Stacking models
1) Average Base Models: LGBM + XGBoost (Dacon Score: 2.5897)
In [130]:
In [132]:
In [135]:
In [136]:
2. Average Models: Random Forest + (lightGBM + XGBoost)
In [148]:
In [149]:
1) RF 0.34, LGBM 0.33, XGB 0.33 (Dacon Score: 2.54172)
In [150]:
In [151]:
In [153]:
2) RF 0.5, LGBM 0.25, XGB 0.25 (Dacon Score: 2.53132)
In [154]:
In [155]:
In [156]:
3) RF 0.7, LGBM 0.15, XGB 0.15 (Dacon Score: 2.52953)
In [157]:
In [158]:
In [159]:
한계점...
데이터를 조금 더 이해하고, 적절한 피쳐를 더 많이 만들어 봤으면 더 좋았을 것 같다 ex) 정류장 사이의 거리, 거리에 따른 이동 시간 등
공휴일을 고려해 보지 못했다 (holiday 함수를 만들었는데 적용이 되지 않아 지쳐서 패스했는데, 다르게 적용해 볼 수 있는 방법을 나중에 깨달았다...)
모델링 하고 적합 하는데에 시간이 너무 너무 너무 오래걸려서 다양한 시도를 진행해 보지 못했다 (Random Forest의 경우에도 CV 없이 1시간은 걸렸던 것 같고, XGBoost의 경우에는 colab에서도 20시간이 떴다...ㅎㅎㅎ) 나의 능력의 문제인지, 노트북 성능의 문제인지, 데이터의 크기가 커서 그런것인지 (41만개 * 36개) 아직 이유를 모르겠다
Random Forest의 경우 CV 진행하지 않았는데, 그 데이터로 스태킹 함수에 적용하는 방법을 알 수 없었다 (유나님이 앙상블 수업 때 올려주신 스태킹 코드로 시도해 봤는데, 오류나서 진행하지 않았다)
Last updated