상세 컨텐츠

본문 제목

[캐글 필사] Enefit - Predict Energy Behavior of Prosumers

캐글 필사

by pjhhs-data 2025. 9. 7. 20:26

본문

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_i: 실제값
  • y^i\hat{y}_i: 예측값
  • nn: 데이터 개수

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 분리가 시계열 데이터에 적합하다는 점 확인

관련글 더보기