데이콘 전력사용량 예측 AI 경진대회 리뷰
📌 코드 공유
https://github.com/lim-hyo-jeong/DACON-Predict-Power-Consumption
📌 대회 설명
1. 개요 : 건물 정보와 기상 정보를 활용한 전력사용량 예측
2. 평가 기준 : SMAPE
3. 대회 기간 : 2021.05.10 ~ 2021.06.25
4. 대회 링크 : https://dacon.io/competitions/official/235736/overview/description
📌 데이터 설명
✔ train.csv
1. num : 건물 번호 (1~60)
2. date_time : 2020년 6월 1일 부터 2020년 8월 24일까지의 데이터 1시간 단위
3. 전력사용량(kWh) : y값 (타겟컬럼)
4. 기온(°C) : 기온 (1시간 단위 관측 데이터)
5. 풍속(m/s) : 풍속 (1시간 단위 관측 데이터)
6. 습도(%) : 습도 (1시간 단위 관측 데이터)
7. 강수량(mm) : 강수량 (1시간 단위 관측 데이터)
8. 일조(hr) : 일조 (1시간 단위 관측 데이터)
9. 비전기냉방설비운영 : 비전기 냉방 설비 운영 여부 (0 또는 1)
10. 태양광보유 : 태양광 보유 여부 (0 또는 1)
11. train.shape: (122400, 10)
✔ test.csv
1. num : 건물 번호 (1~60)
2. date_time : 2020년 8월 25일 부터 2020년 8월 31일까지의 데이터 1시간 단위
3. 기온(°C) : 기온 (3시간 단위 예측 데이터) → train은 1시간 단위로 채워져 있으나 test는 3시간 단위 예측 데이터이므로 6720개 결측치 처리 필요
4. 풍속(m/s) : 풍속 (3시간 단위 예측 데이터) → train은 1시간 단위로 채워져 있으나 test는 3시간 단위 예측 데이터이므로 6720개 결측치 처리 필요
5. 습도(%) : 습도 (3시간 단위 예측 데이터) → train은 1시간 단위로 채워져 있으나 test는 3시간 단위 예측 데이터이므로 6720개 결측치 처리 필요
6. 강수량(mm) : 강수량 (6시간 단위 예측 데이터) → train은 1시간 단위로 채워져 있으나 test는 6시간 단위 예측 데이터이므로 8400개 결측치 처리 필요
7. 일조(hr) : 일조 (3시간 단위 예측 데이터) → train은 1시간 단위로 채워져 있으나 test는 3시간 단위 예측 데이터이므로 6720개 결측치 처리 필요
8. 비전기냉방설비운영 : 비전기 냉방 설비 운영 여부 → 7784개 결측치 처리 필요 (현재는 1로만 구성)
9. 태양광보유 : 태양광 보유 여부 (1만 있음. 결측치 처리 필요) → 8456개 결측치 처리 필요 (현재는 1로만 구성)
10. test.shape: (10080, 9)
📌 점수 기록
1. 레포에 올려놓은 lightgbm model : Leaderboard Public 6.5895863083 | Private 6.291087383
2. 레포에 올려놓은 lightgbm model(건물별로 다르게 모델링/교차검증 시 validation set을 월말 날짜로 설정하여 교차검증) + 해당 모델에서 건물별로 구분하지 않고 한꺼번에 모델링/교차검증 시 KFold 방식(n_splits = 5) 사용한 모델 블렌딩 : Leaderboard Public 6.3685056753 | Private 5.6376671404
→ 최종적으로 Leaderboard Public 6.3685056753 | Private 5.6376671404 으로 16등 / 336 (Top 5%)
📌 문제 접근
✔ 결측치 처리
1. test 데이터셋의 비전기냉방설비운영, 태양광보유 결측치 처리 : 건물별 비전기냉방설비운영, 태양광보유 여부를 통해 test 데이터셋의 비전기냉방설비운영, 태양광보유 결측치를 처리한다.
2. test 데이터셋의 기상정보 결측치 처리 : 기상정보에 결측치가 있는 이유는 train 데이터셋은 1시간 단위로 기상정보가 채워져 있으나 test는 3시간/6시간 단위 예측 데이터이므로 중간중간 결측치가 생기게 된다. 따라서 기상정보의 결측치에 대해서는 보간법을 사용한다.
✔ datetime 데이터 처리
1. 날짜, 월, 주, 일, 시각, 요일, 주말, 월별주수 등으로 새롭게 추가해준다.
2. 시간을 활동 시간대, 아침 시간대, 저녁 시간대, 취침 시간대 4개 시간대로 재구간화한다.
✔ 기상 데이터 처리
1. 6~8월 데이터이기 때문에 계절적으로 여름의 전력 사용량에 영향을 많이 주는 불쾌지수와 체감온도를 계산한다.
2. 불쾌지수 산식 : df['불쾌지수'] = 9/5 * df['기온'] - 0.55 * (1-df['습도']/100) * (9/5 * df['기온'] - 26) + 32
3. 체감온도 산식 : df['체감온도'] = 13.12 + 0.6215 * df['기온'] - 11.37 * (df['풍속'] ** 0.16) + 0.3965 * (df['풍속'] ** 0.16) * df['기온']
4. 불쾌지수, 체감온도를 구간화하였다. 구간화시 기상청의 불쾌지수 및 체감온도 단계별 설명 및 주의사항을 참고하여 비닝하였다.
✔ datetime 데이터와 기상 데이터의 교호작용 고려
시간대와 요일, 시간대와 주말, 시간대와 불쾌지수, 시간대와 체감온도, 시간대와 불쾌지수 및 체감온도, 시간대와 요일과 불쾌지수, 시간대와 요일과 체감온도 등을 다양하게 결합해주었다.
✔ 비슷한 전력사용량 패턴을 가진 건물끼리 군집화
1. 전력 사용량에 대한 다양한 통계량을 추가하여 별도의 데이터프레임을 만들어준다.
2. 각 건물별 기준 컬럼에 따른 전력 사용량 통계량을 Standard Scaling한다.
3. 건물들에 대한 계층적 군집화를 진행하고 덴드로그램을 시각화한다.
4. 군집화한 결과를 기존 데이터프레임에 컬럼으로 추가한다.
✔ 비슷한 전력사용량 패턴을 가진 건물끼리 군집화한 cluster 별 특징 요약
1. cluster 1 시간적으로는 저녁 시간대 사용량이 많고 요일은 평일과 주말 모두 일정한 편이지만 주말에 더 많은 편이다. 또한 기상요소에 영향을 받기도 하므로 사람이 생활하는 공간 중 주거지 등으로 추정된다.
2. cluster 2 공장과 같이 계속 일정하게 전력을 사용하는 건물일 확률이 높다.
3. cluster 3 오전 9시부터 저녁 9시까지의 사용량이 많고 요일에 따른 변동폭이 크지 않으며 기상요소에 영향을 받기도 하므로 사람이 생활하는 공간 중 상업시설 등으로 추정된다.
4. cluster 4 오전 6-8시부터 저녁 5-7시까지 사용량이 많고 평일에 사용량이 많다가 주말에 사용량이 급격히 감소하며 기상요소에도 영향을 받으므로 사람이 생활하는 공간 중 공관서나 회사 등의 근무지일 확률이 높다.
✔ 건물별 이상치 탐지
1. 잔차 분포, 이동평균, K Means Clustering 등을 사용하여 이상치를 탐지한다.
2. 건물별 이상치를 플롯으로 시각화한다.
✔ 건물별 이상치 탐지 결과 해석
1. cluster 1 시간적으로는 저녁 시간대 사용량이 많고 요일은 평일과 주말 모두 일정한 편이지만 주말에 더 많은 편이다. 또한 기상요소에 영향을 받기도 하므로 사람이 생활하는 공간 중 주거지 등으로 추정된다. 따라서 이 cluster 1에 속한 건물들은 주거지 특성상 평소에도 여러가지 요소 인해 전력 사용량 변동이 많기 때문에 잔차 분포 뿐만 아니라 이동평균, K Means Clustering 등으로 걸러냈을 때 이상치 후보가 없었다.
2. cluster 2 분류된 건물 1, 9, 31, 33, 60는 평소 전력 사용량이 시간, 요일, 기상 요소등과 관계없이 일정한 편이므로 사람이 생활하는 공간이라기보다는 공장과 같이 계속 전력을 사용하는 건물일 확률이 높다. 따라서 이상치가 발생한 부분은 대체해주는 것이 성능향상에 도움될 것으로 판단된다.
3. cluster 3 건물 10, 36, 40, 42는 오전 9시부터 저녁 9시까지의 사용량이 많고 요일에 따른 변동폭이 크지 않으며 기상요소에 영향을 받기도 하므로 사람이 생활하는 공간 중 상업시설 등으로 추정된다. 이 cluster3 건물들은 이상치가 하나의 시간으로 나타난다기보다는 거의 하루 정도로 크게 나타나고 있는데 상업시설 내의 휴무일이거나 공휴일, 기념일, 재택근무 등으로 인한 특이치일 수 있으므로 신중히 대체하도록 한다.
4. cluster 4 건물 25, 45, 52, 55은 오전 6-8시부터 저녁 5-7시까지 사용량이 많고 평일에 사용량이 많다가 주말에 사용량이 급격히 감소하며 기상요소에도 영향을 받으므로 사람이 생활하는 공간 중 공관서 나 회사 등의 근무지일 확률이 높다. 이 때 건물 25, 45, 52, 55의 이상치는 한시간 내의 이상치이기 때문에 정전 등으로 인한 극단치일 확률이 높아 대체해주는 것이 성능향상에 도움될 것으로 판단된다.
✔ 건물별 이상치 대체
이상치를 동일 범주의 시각 및 요일의 중앙값으로 대체하였다. 시계열 데이터에서 만약 같은 시각과 요일에 주기적으로 전력 사용을 하지 않는 등의 사건이 있다면 그건 이상치라기보다는 특이치므로 test 데이터셋에서도 학습할 수 있도록 내버려두어야 하기 때문에 이런 방식으로 이상치를 대체하였다.
✔ 시계열 데이터의 정상성 (Stationary) 테스트
1. 건물별로 Augmented Dickey-Fuller Test를 진행한다.
2. 건물별 Augmented Dickey-Fuller Test 진행하여 p-value가 0.05 이상인 경우(non-stationary)를 탐지한다.
✔ 모델링
1. cluster별 전력사용량과 다른 피쳐들간의 상관계수를 파악하여 각 건물이 속한 cluster별로 다르게 피쳐 선택을 한다.
2. test 데이터가 2020년 8월 25일부터 8월 31일까지이기 때문에 교차검증을 위한 validation set은 근처 데이터인 8월 18일부터 8월 24일, 그리고 같은 일자에 해당되는 6월 25일부터 6월 30일, 7월 25일부터 7월 31일로 설정하였다.
3. 건물별로 모델링을 다르게 한다.
4. right-skewed 또는 non-stationary data인 경우 전력사용량을 로그 변환한 상태로 모델링한다.
📌 앞으로 보완할 점 및 느낀 점
✔ 이상치 처리
이상치 탐지는 잔차 분포, 이동평균, K Means Clustering 등으로 여러가지 방법을 사용했는데 이상치를 다른 값으로 대체할 때 시계열 데이터인지라 보편적인 방법으로 대체하기가 까다로웠다. 특히 시계열 데이터 특성상 만약 같은 시각과 요일에 주기적으로 전력 사용을 하지 않는 등의 사건이 있다면 그건 이상치라기보다는 특이치므로 test 데이터셋에서도 학습할 수 있도록 내버려두어야 하기 때문에 동일 범주의 시각 및 요일의 중앙값으로 대체하였는데 더 나은 방법이 있을지 앞으로 더 고민해봐야 겠다.
✔ 시계열 데이터 처리
솔직히 시계열 대회가 처음이기도 하고 아직 공부를 많이 하지 않은 상태인지라 부족함을 느꼈다. 그래도 이번 대회를 준비하면서 시계열 분석에 대해 스스로 논문이나 외국 사이트들을 찾아보면서 공부를 하고 새롭게 알게된 것들이 많아 기쁘다. 그리고 요즘 수리 통계학 강의를 듣고 있는데 전통적인 시계열 분석법부터 차근차근 공부하면서 기초를 잘 쌓아야 겠다.
✔ 모델링
다양한 모델을 사용했으면 좋았을텐데 lightgbm만 사용하였기 때문에 아쉬운 점이 있다. 전처리에 주력한 나머지 모델링에 소홀했는데 앞으로는 다양한 모델을 사용해보고자 한다.
'공부 > AI' 카테고리의 다른 글
[자격증] 빅데이터분석기사 실기 합격 후기 (비전공자 문과) (8) | 2021.07.16 |
---|---|
[자격증] 빅데이터분석기사 필기 합격 후기 (비전공자 문과) (0) | 2021.07.15 |
[DACON] 신용카드 사용자 연체 예측 AI 경진대회 후기 (Top 8%) (0) | 2021.07.07 |
[자격증] ADsP (데이터 분석 준전문가) 자격시험 합격 후기 (비전공자 문과) (0) | 2021.07.05 |
[회고] 2020 인프런 리프 1기 : 파이썬 입문 강의를 듣다 (0) | 2020.12.21 |