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