1. 문제 & Metric 파악
1) 대회 배경, 설명에 대한 이해
프로슈머(prosumer)의 수가 빠르게 증가하면서 에너지 불균형이 커지고 있다
이는 운영 비용 상승, 전력망 불안정성, 에너지 자원의 비효율적 사용과 같은 문제로 이어질 수 있다
이 대회의 목표는 프로슈머의 에너지 예측 모델을 구축하여 에너지 불균형 비용을 줄이는 것
2) 데이터에 대한 기본적인 이해
- train.csv: 지역·계약·사업자 여부별 시간 단위 전력 소비/생산량 (타깃 포함)
- gas_prices.csv / electricity_prices.csv: 하루 전 시장의 가스·전력 가격
- client.csv: 지역별 태양광 설치 용량, 소비 지점 수 등
- forecast_weather.csv / historical_weather.csv: 예측용 날씨 vs 실제 날씨 데이터
- example_test_files/: 제출 형식 예시와 실제 타깃값 예시 제공
3) 평가 Metric에 대한 이해
📌 MAE (Mean Absolute Error)
1. 정의
- 예측값과 실제값의 차이를 절댓값으로 계산한 뒤, 그 평균을 낸 값
- 회귀(regression) 모델 성능을 평가하는 대표적인 지표 중 하나
2. 공식
- yiy_iyi: 실제값
- y^i\hat{y}_iy^i: 예측값
- nnn: 데이터 개수
3. 특징
- 값이 0에 가까울수록 예측이 정확함
- 오차의 크기를 “그대로” 반영하므로 해석이 직관적임 (단위가 실제값과 동일)
- 이상치(outlier)에 덜 민감함 → RMSE보다 극단값의 영향을 적게 받음
- 대신, 큰 오차를 특별히 더 크게 벌하지 않으므로 RMSE보다 보수적인 평가 지표
4. 비교 (RMSE vs MAE)
- MAE: 모든 오차를 동일하게 반영 → 평균적인 오차 크기를 직관적으로 보여줌
- RMSE: 큰 오차를 제곱하여 더 크게 반영 → 이상치에 민감, 모델 안정성보다 큰 에러 감지에 유리
👉 요약하면, MAE는 "예측이 평균적으로 얼마나 틀렸는지"를 실제 단위로 보여주는 지표
2. EDA
- 시간(datetime) 패턴
- 계절별·시간대별 소비/생산량 차이가 뚜렷함
- 특히 낮 시간대에는 태양광 발전량 증가 패턴 확인 가능
- 소비 vs 생산 (is_consumption)
- 소비 데이터가 전체의 다수를 차지
- 생산량은 특정 시간대와 날씨(일사량, 구름량)에 크게 의존
- 사업자 여부(is_business)
- 사업자(prosumer)는 소비량이 크고, 일부는 생산량도 크게 기여
- 일반 소비자와는 다른 에너지 패턴 확인
- 계약 유형(product_type)
- Fixed/Spot 등 요금제별로 소비 패턴 차이가 있음
- Spot 계약군에서 가격 변동에 민감하게 반응하는 모습이 보임
- 날씨 변수 연관성
- 일사량(solar radiation), 구름량(cloudcover) → 생산량과 강한 상관관계
- 기온, 강수량 → 소비량과 관련성 존재
3. Notebook 필사
가장 많은 수의 vote를 받은 Notebook을 선정했다
선정한 Notebook의 링크
https://www.kaggle.com/code/rafiko1/enefit-xgboost-starter
⚡Enefit│XGBoost│starter⚡
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
www.kaggle.com
원작자 해석 예측
- 시간 변수 생성
- datetime으로부터 year, quarter, month, week, hour, day_of_week 등 다양한 파생 변수 생성
- 클라이언트 데이터 가공
- client.csv에서 지역, 계약 유형, 설치용량 등 정보를 붙이고 suffix(_client)를 붙여 관리
- 날씨 데이터 처리
- historical_weather.csv
- 위도/경도 → county로 매핑
- 평균(mean) 등 통계치로 집계
- 학습/테스트셋의 시차(1일~2일 offset)까지 반영
- forecast_weather.csv
- 에너지 가격 데이터 처리
- electricity_prices.csv: 예측일자 기준 하루 offset 적용, suffix(_electricity) 부여
- gas_prices.csv: 최고/최저 가격의 평균을 계산한 새로운 변수 mean_price_per_mwh 추가
- 데이터 병합
- 각각의 전처리된 데이터셋을 공통 키(county, data_block_id, datetime 등)를 기준으로 왼쪽 조인(merge)
- 최종적으로 하나의 큰 특징(feature) 데이터셋 생성
- 카테고리형 변수 지정
- county, is_business, product_type, is_consumption, data_block_id를 범주형(categorical)으로 변환 (특히 XGBoost에 유리)
- XGBRegressor 사용
- objective='reg:absoluteerror' → MAE(Mean Absolute Error) 최소화하는 회귀 문제로 설정
4. Lesson Learned
데이터 전처리 & EDA
- 시간 변수(년/월/주/일/시간) 파생을 통해 소비·생산 패턴을 확인
- 불필요한 열(row_id, latitude, longitude 등) 제거 후 의미 있는 feature만 활용
- 날씨, 가스·전기 가격, client 데이터를 병합해 학습용 feature set 구성
Feature Engineering & 모델링
- forecast/historical 날씨 데이터를 시차(offset) 고려해 처리
- categorical 변수 변환, high cardinality 변수 정리의 중요성 체감
- LGBM, XGBoost 기반으로 교차검증 수행, RMSE/MAE로 성능 평가
- block_id 기준 train/validation 분리가 시계열 데이터에 적합하다는 점 확인