2023 전력사용량 예측 AI 경진대회

알고리즘 | 정형 | 시계열 | 에너지 | SMAPE

  • moneyIcon 상금 : 2,000만원
  • 2,717명 마감

 

[Private 2nd, Public 18th] 건물별 XGBoost

2023.08.31 18:21 1,866 조회 language

.

PDF
코드
로그인이 필요합니다
0 / 1000
Statistics
2023.08.31 18:50

코드 잘 살펴봤습니다:)
데이터 처리과정에서 power_log1p_stdd_mean부터 시작되는 부분의 leakage 가능성이 관건이겠네요.

킹강인
2023.08.31 21:30

어떤 부분때문에 leakage가능성이 있는지 궁금합니다!

Statistics
2023.09.01 14:57

질문이 올라오기도 했지만(답변은 없었지만) 이 대회 데이터에서 시점이 애매합니다.
예를 들어 14:00의 날씨 예보는 사실상 13:30~ 14:30에 걸쳐 있다고 볼 수 있고, 
같은 시점 14:00의 전력 사용량은 13:00~14:00의 전력 사용량일 수도 있고 14:00~15:00의 전력 사용량일 수도 있습니다.

공지된 링크 등을 보면 "8월 31일 23시 시점의 데이터를 활용해서 모형적합(예측X)에서 미래 시점의 정보를 활용하는 것은 Leakage에 해당"한다는 비슷한 예시가 있습니다.

위의 공유된 스크립트 "EE_DATASET"에서 아래와 같은 명령어가 등장합니다.
power_log1p_stdd_mean = train.groupby(['building', 'dhc', 'hour']).agg(pl.col('power_log1p_stdd').mean().alias('power_log1p_stdd_mean'))

여기서 변환 대상 변수인 'power_log1p_stdd' 대신 아래처럼 6월 1일 기준 누적 일수 변수 temp를 만들고, 동일한 명령어를 실행할 수 있습니다.
(polar가 익숙하지 않아서 예제 만들기도 쉽지 않네요.)

train = train.with_columns(pl.Series(name='temp', values=list(pd.Series(train['date']).dt.day_of_year - 151)))
df_check = train.groupby(['building', 'dhc', 'hour']).agg(pl.col('temp').mean().alias('temp_check'))
train = train.join(df_check, on=['building', 'dhc', 'hour'], how='left')
train[['temp', 'temp_check']]



킹강인
2023.08.31 23:12

그렇군요. 이 대회 공지를 보면 8월 24일 23:59분까지 알 수 있는 정보는 예측에 활용가능하다고 하는데, 이는 test.csv를 포함한다고 공지를 올려주셨습니다. 이는 test.csv에 있는 정보 전체는 예측시점인 25일 전에 알 수 있는 정보이기 때문에 데이터 자체가 전체 활용가능하다고 이해했는데 문제 없지 않을까요?

Statistics
2023.08.31 23:13

6월 1일 시점에는 6월 1일 정보만 활용할 수 있고, 이 때 temp의 값은 모두 1이라서 평균, 최댓값,  최솟값 무엇을 구하든 1이어야 하는데, 
'building', 'dhc', 'hour'별 'temp'의 전체 기간 평균이 들어오면서 27.67의 값을 가진 파생변수가 생성됩니다. 
leakage의 가능성이 높은 것이죠. (제 코드의 오류일 수도 있기 때문에 검증이 필요합니다.)

사실 공지에서 "2022.8.24 23:59:59 까지의 정보만 활용"이라는 문구가 있고, 예보의 경우 해당 시점에서 이미 향후 일주일간 예보값이 모두 나와있기 때문에 어떤 시점에서든 모든 정보를 활용해도 되는 것으로 이해할 수도 있고, 공지된 data leakage 방침에 따라 "Train 데이터의 예시 시점 2022년 7월 1일 시점에서는 7월 1일까지의 정보만 활용할 수 있다"고 이해할 수도 있습니다. 

결국 주최측의 해석과 판단에 따라 판단이 갈릴 것으로 보이고, 어느쪽이건 억울한 사람들이 생길 수 밖에 없겠네요.
어느쪽이건 27등인 저는 수상과는 거리가 멀어보여서 일단 관망하고, 다양한 코드를 탐색하는 것으로 만족하려고 합니다.

킹강인
2023.08.31 23:21

음... train셋의 경우 이미 예측시점이 8월 24일 23:59인 부분에서 과거 데이터(8/24 23:59 전에 수집된 데이터)는 어떻게 통계량이 사용되어도 전혀 문제될것이 없다고 생각합니다. 애초에 data leakage의 경우 예측시점에서 알 수 없는 정보의 활용여부에 대해 따지는 것이라고 이해하고 있습니다. 2021년에 열린 동일 대회에서도 1등하신분이 요일별/시간별 통계량을 사용하신 것을 보면 문제될것이 없다고 생각합니다.

Statistics
2023.08.31 23:27

그것이 참 애매한 문제입니다. 
시간별 주가 데이터와 마찬가지로 이 대회의 시간별 전력사용량 역시 시계열 데이터라고 생각할 수 있고,
시계열 데이터의 모형 적합/알고리즘 개발의 경우 모형 적합 과정에서의 미래 데이터 활용도 확실히 데이터 leakage에 해당합니다. 
코드 공유로 올라온 예시 모형에 "LSTM" 있는 것만으로도 DACON에서도 이 문제를 시계열 문제로 인식했다고 볼 수 있구요.

그런데 한편으로는 말씀하신 것처럼 과거의 사례도 있고, 각 시점을 별개의 포인트로 두고 해석할 수도 있기 때문에 시계열이 아니다라고 할 수도 있는 것이구요.
코드 검증 기간이 이런 것을 다루는 기간이니, 이 부분에 대해서는 데이콘에서 곧 답을 주지 않을까 싶네요:)

똥안
2023.09.01 10:23

안녕하세요, Statistics님.
날카로운 지적에 대해 감사드립니다.
다음은 제 설명인데, 혹시 부족한 점이나 납득되지 않는 점이 있으시다면
다시 알려주시기 바랍니다.
감사합니다.
https://dacon.io/competitions/official/236125/codeshare/8770?page=1&dtype=recent
물론 저의 방법은 Statistics님께서 언급하신 문제를 완화하고자 하는 방법을 사용하였고,
결코 해결한 것은 아닙니다.
하지만 Private Score를 최종목표로 도구로서 사용했음을 감안한다면 충분히 납득하시리라 생각합니다.

Statistics
2023.09.01 11:27

잘 살펴봤습니다. 
그런데 중요한 것은 전략이 아니라 대회 규칙입니다.
이미 대회의 주최측이나 데이콘에서는 Leakage에 대한 규칙을 설정해 뒀을 것이고, 이 상황이 leakage에 해당하는지 아닌지에 대해서 공지만 하면 모든 것은 끝납니다.

특정 시점의 전력사용량을 예측하면서 그 당일과 미래의 평균값을 활용하는 것은 leakage로 보이지만, 
또 test 데이터에 대한 예측의 관점에서  "2022.8.24 23:59:59 까지의 정보만 활용"을 벗어난 것은 아니라 leakage가 아닌 것 같기도 하죠.
그래서 많은 참가자들이 전체 기간의 요일별 평균 값을 썼을 것이고, 또 많은 참가자들은 leakage의 문제를 피하기 위해서 "직전 00주 평균"과 같은 대체 변수를 썼을 것이구요.

어차피 정해져 있는 규칙을 두고 너무 힘을 빼실 필요는 없습니다. 
데이콘에서 leakage가 아니라면 그대로 가면 되고, leakage라고 하면 변수를 수정해서 코드를 다시 제출하면 되는 것이니까요.
경험상 코드 검증은 스코어의 정확한 재현을 요구하지 않기 때문에 크지 않은 스코어 차이라면 등수에는 영향을 미치지 않는 것으로 알고 있습니다.

무엇보다 데이콘의 빠른 규칙 공지가 필요한 시점이네요!

cgahn0323
2023.09.01 13:22

Data leakage로 해석될 여지는 없어보입니다.

Modeling 과정에서 특정 시점의 전력사용량을 예측하는데 그 당일과 미래의 평균값을 활용하는 것은 일반적으로 지양되지만 그것은 Data leakage를 방지하기 위함이 아니라 Validation data를 training 과정에서 간접 사용하여 model의 over fitting을 유도하기 때문입니다.

하지만 이런 over fitting 우려가 없다거나 혹은 그 이상의 이득이 있는 도메인이라고 판단되면 사용해도 무방하고 이는 전적으로 엔지니어의 판단에 따라 결정되는 부분입니다.

저 또한 처음에는 Statistics님 말씀대로 해당일 이전의 data를 대상으로한 통계값을 feature로 사용하여 학습 하였으나 금번 대회에서는 전체 data에 대한 통계값을 사용하는 것이 CV, public score 모두에서 우수하다는 것을 확인 후 후자로 갈아타게 되었습니다.

개인적으로 데이콘 측에서 이 문제에 대해 또 공식 답변을 할 것 같지는 않습니다. 이미 "2022.8.24 23:59:59 까지의 정보만 활용,  '2022.8.24 23:59:59 까지의 정보' 에는 test.csv도 포함됨." 이라는 Data leakage에 대한 공지를 한 상태이고 추가 공지는 이에 대한 중복 답변이 될 것이기 때문입니다.

Statistics
2023.09.01 14:47

미래 시점의 평균값을 활용하는 것이 단순히 over fitting 가능성 만을 높이지는 않습니다.
위에서도 말했듯이 제공된 기상 관측정보는 정시 기준, 전력 사용량은 1시간 누적 값입니다.
특히 대회 제공 데이터의 시간이 00부터 시작하는 것을 보면, 00시점의 전력사용량 값은 00~01시 사이의 전력 사용량 값일 가능성이 있습니다. 

이 경우, 예를 들어 14:00의 기온이 26도, 전력 사용량이 100이라고 했을 때 기온의 측정 값은 14:00이고 30분의 범위를 잡으면 13:30~14:30에 걸쳐있다고 볼 수 있고 전력 사용량은 14:00~15:00 동안의 누적 사용량이라고 볼 수 있습니다. 
이 때 14:30~15:30에 걸친 정보를 가진 한 시간 뒤 15:00 시점의 기온 값을 값을 가져오면, 당연히 14:00 시점의 전력사용량을 더 잘 설명할 수 있습니다.

이 대회에서 기온 등의 기상정보가 train에는 관측 정보, test에는 예측 정보를 담고있어서 특수성이 있긴 하지만
일반적인 경우를 가정하면 train 데이터의 특정 시점에서 한시간 뒤의 기상 정보를 활용하게 되면 data leakage에 해당할 수 밖에 없습니다.
예보 데이터가 없다고 가정하면 마지막 train 데이터의 시점에서 바로 한시간 뒤도 예측할 수 없게 되는 것이죠.

제가 개인적으로 생각하기에는 데이콘에서 공지한  "2022.8.24 23:59:59 까지의 정보만 활용"이라는 표현은 test 기간의 실제 기상값, 외부사이트에서 해당 기간의 전체 전력 사용량 추이 등 외부 정보를 활용하지 말하는 의미가 강하고, train 기간에서의 leakage 가능성 등은 데이콘에서도 놓쳤을 가능성이 있습니다. 
시계열 데이터가 여러번 진행됐고, 커뮤니티에서도 결측치의 내삽(interpolation) 과정에서 미래 시점의 정보를 활용하는 것은 leakage에 해당할 수 있다는 글이 여러번 공유가 되기도 했으니까요. 결국 문제의 평균은 미래 시점을 활용한 interpolation과 동일하구요.

Topdown
2023.09.01 15:55

개인적인 생각으로는 대회측에서 "2022.8.24 23:59:59" 이후의 실제 정보를 활용하는 경우에 대해 data leakage로 정의하였기 때문에, 그 정의를 위반하지 않는 한 leakage로 보이진 않네요. 그리고 토크에서 "2022.8.25 00:00:00부터 발생한 모든 사건을 알 수 없다고 가정하여 예측을 진행해주시길 바랍니다."라고 공지한 것을 보면, 그 이전의 데이터들은 외부 데이터가 아닌 이상 어떤 형태로든 사용할 수 있다는 의미로 해석되는것 같네요.

DACON.GM
2023.09.01 16:41

안녕하세요 데이콘입니다.
1. 
대회에 규정된 현재 시점(2022.08.24 23:59:59) 이후에 대한 Data Leakage만을 감지 및 판단합니다.
2. 
제공된 Train Dataset은 대회에서 규정한 현재 시점보다 과거의 데이터입니다. 학습 과정에서 재부여되는 현재와 미래 시점 데이터는 Data Leakage 검증 과정에서는 고려하지 않습니다. 이는 학습 과정에서 재부여되는 미래 데이터를 활용하여 과거를 예측하는 것이 대회 규정에서 판단하는 Data Leakage에 해당하지 않기 때문입니다. 본 대회에서 꼭 시계열 방식을 사용할 필요는 없습니다. 베이스라인으로 제공된 코드는 시계열 접근(LSTM)과 단순 정형 데이터 접근 방식(RandomForest) 두 가지를 포함하고 있습니다.
3.
Test Dataset의 Input Feature들은 예보 데이터로, 대회에서 부여한 현재 시점 이전의 데이터로 구성되어 있습니다. Test Dataset의 예측 기간도 이미 공개된 정보이므로, 이 예보 데이터를 활용하는 것에 제한은 없습니다. 단, 2022년 8월 25일 00:00:00 이후에 알 수 있는 Domain Knowledge를 사용하는 경우, 그것은 Data Leakage로 간주됩니다.

위의 내용은 이미 대회 규칙 -> 유의 사항과 공지사항에 모두 상세히 기재된 내용입니다.
감사합니다.