태양광 발전량 예측 AI 경진대회

알고리즘 | 정형 | 회귀 | 에너지ㅣPinball Loss

  • moneyIcon Prize : 600만원
  • 2,319명 마감

 

몇가지 시도 내용 공유

2021.01.04 17:26 5,546 Views

안녕하세요, 한계에 다다른 세아아부지입니다.



lightgbm으로 열심히 해보는데 스코어 내리는게 쉽지 않네요.

다른 분들은 어떤 모형을 쓰시는 지 궁금하네요.


deep learning으로 가야하는 걸까요??



오늘도 몇가지 내용과 시도를 공유합니다.



1. "TARGET"


태양광 발전량 예측이 주제니까 당연히 TARGET은 발전량일텐데요,

최댓값이 거의 100인 것을 보면 설비의 스펙과 지역의 특성상 최대 발전량 100 대비 상대적인 발전량으로 보입니다.





2. 이론적인 최대 발전량의 추측


Test 데이터의 마지막 81번째 7개 날짜의 발전량을 회색으로 그렸습니다.

그리고 빨간색은 optimazation을 활용해서 이 시기의 각 시간별 최대가능 발전량을 계산한 것 입니다.





실제 train 데이터에의 일별 그래프를 살펴보면, 아주 햇살이 좋고 조건이 좋아서 위의 빨간색 곡선과 같은 패턴을 보이는 날들이 있습니다.


아래의 그래프에 그런 날들을 빨간점으로 표시했습니다.







3. 느낌적이고 당연한 주기


train 데이터에서 각 날짜의 최대 발전량(보통 12시 전후)을 계산해서 그렸고, 그 중에서 위에서 말한 아주 발전이 잘 된 날은 빨간색으로 표시했습니다.




당연히 1년 365일의 주기가 나오고, 계절도 보입니다.

여름은 여름 같아보이고, 겨울은 겨울 같이 보입니다.

그런데 봄과 가을은 최대 발전량으로만 보기에는 애매합니다.





4. 다시 최적화


빨간 점들은 이미 이쁜 곡선을 보이지만 이차 함수 곡선에 optimization을 해봤습니다.

그리고 언제 최댓값을 가지는지를 확인해서 아래처럼 그림을 그렸습니다.



느낌이 옵니다. 하루마다 30분 단위로 48개 시점이 있는데요, 1~48로 번호를 썼고 25가 12:00 정오입니다.

같은 최댓값이라도 곡선으로 살펴보면 정오 이전에 이론적인 발전량이 최대가 되는 날이 있고, 반대로 정오 이후에 최대가 되는 날이 있는 것이 보입니다. 봄과 가을이겠죠?


앞선 글에서 댓글에서도 누군가가 언급했지만, 실제로 "해가 중천"인 시각은 계절에 따라 조금씩 달라진다고 합니다.






5. Test 데이터도 함께


같은 방법으로 Test 데이터 81개 각각에 대해서도 계절을 유추할 수 있습니다.


이렇게 유추한 계절을 활용해서 비슷한 계절의 시점들만 활용해서 모형 적합을 했는데요,

전체 데이터를 활용한 모형보다 점수가 안좋습니다.....



전체 고객이 아니라 '30대 남성'만으로 모형을 만들면 당연히 그들 안에서 특성이 잘 반영되겠죠?

비슷한 시기의 관측치만으로 모형을 만들었다면 당연히 그들안에서의 quantile이 더 잘 예측될 거라 생각했는데요.

아니네요.






정답 Quantile을 어떻게 정했을지 너무 궁금합니다.


앞선 글에서 "Quantile은 9개지만 정답은 하나일 가능성도 있다"는 의견도 있었는데요,

저는 아닐거라고 생각합니다.

-> 드디어 pinball loss의 개념을 이해했습니다;;; 각 시점별로 정답은 하나가 맞네요!



정답이 하나인 상황에서 under/over-estimated의 확률을 5:5로 본다면 결국 pinball loss는 MAE와 거의 동일한 지표가 됩니다.

실제값과 예측값 차이에 대해서 50% 확률로 0.9, 0.8, 0.7, 0.6 배의 loss를 얻고, 역시 50% 확률로 0.1, 0.2, 0.3, 0.4 배의 loss를 얻을거니까요.


실제 MAE를 평가지표로 두고 모형을 0.1 ~0.9 모든 예측값을 동일하게 적어 제출해봤는데요, baseline보다 안 좋게 나옵니다.

물론 제가 만든 모형 탓일 수도 있지만요ㅎㅎ




여러분은 어떻게 접근하고 계신지 궁금합니다.



로그인이 필요합니다
0 / 1000
우왕여긴어디일까요
2021.01.05 21:29

딥러닝으로 접근하고 있는데 baseline보다 약간(0.1 ...차이) 좋긴 합니다만,
시간이 꽤 오래걸리는 단점이 있어요;;

Statistics
2021.01.05 00:12

튜닝이 중요한데 더더욱 쉽지 않으시겠네요. 

수리과학부
2021.01.04 23:43

계절성을 확인한 그래프에서 mu를 어떻게 구하셨는지 알 수 있을까요?

lightgbm은 생각보다 더 오버피팅에 취약한 것 같습니다

Statistics
2021.01.05 00:10

신기하게도 이차함수가 딱 들어맞습니다. 
아주 깔끔한 발전량을 가진 날의 데이터에 적절한 이차함수를 fit하면 되는데요, 저는 R에서 optim( ) 함수를 썼습니다. 
fit된 2차함수의 2차항, 1차항 계수를 활용하면 간단히 mu를 구할 수 있구요.

딥러닝으로 가신건가요? 오버피팅 피하려고 bagging과 random feature를 시도하는데도 lightgbm으로는 한계가 있어보이네요.

수리과학부
2021.01.05 13:57

답변 감사합니다. 새벽이나 밤처럼 발전량이 0인 구간이 있는데 이를 포함해서 2차함수로 피팅하셨는지 궁금합니다. 본문의 첫번째 사진을 보면 붉은 곡선이 global하게 2차함수는 아닌것같아서요. R의 optim 함수가 알아서 처리해주나요?

지금 딥러닝으로 시도해보고는 있는데 역시 한계가 있어 보입니다. 더 높은 점수를 얻기 위해서는 여러 모델을 앙상블해야하지 않나 싶습니다.

Statistics
2021.01.05 20:26

발전량이 0인 구간은 과감하게 버렸습니다. 
Test 데이터 6일치 기준 적어도 하루라도 발전량이 0 초과인 구간만 활용했습니다.
1000일이 넘는 train 날짜 들 중에서 (제 나름의 표현으로) stationary한 안정적인 날들을 추리는 과정에 고민을 많이 했는데요,
전체 0초과 구간이 모두 안정적이지 않더라도 일부 안정적인 구간만으로도 2차 함수로 적합할 수 있도록 했습니다. 

저는 R을 쓰는데,  custom_metric 을 쓰는데 제약이 많아서 앙상블도 쉽지 않네요ㅎㅎ

동준이
2021.01.05 08:07

pinball loss 라는 평가 지표 특성상 ground truth target value는 하나입니다. 각 quantile 에 대한 예측 모델 별로 손실 함수가 달라지기 때문에 여러 손실 값이 산출되는 거라고 이해하시면 됩니다.

Statistics
2021.01.05 08:43

오호, 같은 이야기를 여러번 들으니 이제서야 갑자기! 어느정도 이해가 되네요.
이해한거에 맞게 새롭게 시도를 해봐야겠네요. 
감사합니다:)