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

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

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

 

pinball loss 이해

2020.12.28 19:31 7,011 Views

개인적으로 평가지표를 공부하면서 나름대로 이해한 내용을 정리해 봤습니다.



1. 평가 지표


평가지표는 아래와 같습니다.


τ: 퀀타일 값 (0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)

y: 실제 값

z: 퀀타일 예측값

Lτ: pinball loss 함수

(출처: https://dacon.io/competitions/official/235680/talkboard/401990)



y는 데이콘이 가지고 있는 실제 정답값입니다.

z는 우리가 예측해야 하는 값 입니다.

z는 총 9 종류로 각 퀀타일 값 τ (이하 tau, 0.1 ~ 0.9) 에 각각 대응하는 z를 제출해야 합니다.


pinball loss 함수인 Lτ (이하 L) 는 정답값과 예측값의 차이로 MAE와 비슷해 보이지만

tau 라는 상수가 곱해지는 점에서 차이가 있습니다.


참고로 아래와 같이 구현 가능합니다.

L = maximum( (y - z) * tau, (z - y) * (1 - tau) )

(출처: https://www.tensorflow.org/addons/api_docs/python/tfa/losses/pinball_loss)



2. Loss가 0이 되려면?


수식에 따르면 y = z일 때 L = 0 입니다. tau 에 상관없이 z와 y가 같으면 Loss는 0 입니다.


예를 들어 y가 1 이라고 가정해 보겠습니다.

퀀타일 값 0.1 ~ 0.9 에 대응하는 z가 z_1 ~ z_9 라고 하면 전체 Loss는 아래와 같이 쓸 수 있습니다.

L = [ L(1, z_1) + L(1, z_2) + L(1, z_3) + L(1, z_4) + L(1, z_5) + L(1, z_6) + L(1, z_7)  + L(1, z_8) + L(1, z_9) ] / 9

(위는 평가지표 설명에서 명확하지 않지만, 각 퀀타일 값에 해당하는 L의 평균으로 전체 Loss 가 계산되는 것 같습니다.)


z_1 ~ z_9 가 모두 1이면 L = 0 이 되어 가장 좋은 결과를 얻을 수 있습니다.

따라서 예측값을 확신하는 경우 퀀타일 값에 상관없이 같은 z를 넣어야 합니다.



3. 예측이 틀린 경우?


현실적으로 정답값을 맞추기는 어려우니 예측이 틀린 경우를 생각해보죠.

마찬가지로 y = 1 인데 z_1 ~ z_9 를 모두 0.9로 예측했다고 가정해보겠습니다.

y가 z보다 크므로 L = (y - z) * tau 가 됩니다.

tau = 0.1 일 때, L = (1 - 0.9) * 0.1 = 0.01 이 됩니다. 마찬가지로 계산하면 아래와 같은 결과를 얻습니다.


tau = 0.1 | L = (1 - 0.9) * 0.1 = 0.01

tau = 0.2 | L = (1 - 0.9) * 0.2 = 0.02

tau = 0.3 | L = (1 - 0.9) * 0.3 = 0.03

tau = 0.4 | L = (1 - 0.9) * 0.4 = 0.04

tau = 0.5 | L = (1 - 0.9) * 0.5 = 0.05

tau = 0.6 | L = (1 - 0.9) * 0.6 = 0.06

tau = 0.7 | L = (1 - 0.9) * 0.7 = 0.07

tau = 0.8 | L = (1 - 0.9) * 0.8 = 0.08

tau = 0.9 | L = (1 - 0.9) * 0.9 = 0.09


따라서 Loss는 (0.01 + 0.02 + 0.03 + 0.04 + 0.05 + 0.06 + 0.07 + 0.08 + 0.09) / 9 = 0.05 입니다.



4. Loss를 줄이는 방법?


Loss를 줄일 수 있는 방법을 생각해 봅시다.

tau = 0.9 일 때, z를 0.9 대신 1.1로 예측했다고 가정해보겠습니다.

앞의 경우와 같이 z가 y에서 0.1 만큼 차이나지만 y보다는 값이 큰 경우 입니다.


이때는 z > y 이므로 L = (z - y) * (1 - tau) 이며, L = (1.1 - 1) * (1 - 0.9) = 0.01 가 됩니다.

z가 0.9에서 1.1로 바뀌면서 L은 0.09 에서 0.01로 작아졌습니다.

똑같이 오차는 0.1 이지만 정답보다 크게 예측함으로써 Loss를 줄일 수 있습니다.


정리하면 높은 퀀타일 값에서는 z > y 일 때 (overforecast) 유리,

낮은 퀀타일 값에서는 z < y 일 때 (underforecast) 유리합니다.



5. 9개 예측값을 만드는 방법?


이번 대회에서는 각 시간별로 z_1 ~ z_9에 해당하는 9개의 예측값을 만들어야 합니다.

예측값을 만드는 방법으로 두 가지를 생각할 수 있습니다.


1) 9개 모델을 만들어 예측

각 퀀타일 값에 해당하는 모델을 각각 만드는 방법입니다.

데이콘 베이스라인이 이에 해당합니다.

(출처: https://dacon.io/competitions/official/235680/codeshare/2033)


2) 하나의 모델에서 9개 값 예측

반면 모델을 하나만 만들고 9개 값을 예측해 볼 수 있겠습니다.


뭐가 좋을지는 아직 모르겠네요 :)



틀린부분은 댓글로 남겨주시면 수정하겠습니다.

로그인이 필요합니다
0 / 1000
당쇠
2020.12.28 23:37

안녕하세요 kn님

좋은 공부 나눔 

감사합니다.

Statistics
2021.01.05 08:48

제가 아래 글의 댓글에도 남겼지만 실제 각 Quantile에 해당하는 정답이 따로 있는 것으로 보입니다.
Quantile을 일종의 신뢰구간의 개념으로 접근하면 좋은 모형일 수록 예측값에 대한 분산이 적어 신뢰구간이 좁아지고 quantile 기준으로 모일 수 있습니다. 

그런데  모형의 quantile alpha값을 0.1, 0.2, ..., 0.9가 아니라 0.06, 0.17, ..., 0.94로 지정해서 좀 더 넒게 벌려줬더니 스코어가 1.98에서 1.965로 더 좋아졌습니다. quantile별로 별개의 정답이 있는 것이 맞는 것 같습니다. 

파라미터 튜닝도 중요하지만, 어떻게 Quantile 정답을 만들었을 지를 고민해봐야 할 것 같네요. 
  -> 어그로였네요. 죄송합니다. y값은 quantile별로 다르지 않고 하나가 맞습니다. 

pica4500
2020.12.29 15:30

제 생각엔 퀀타일별로 답이 전부 다른것이 아니라, q_0.5(MAE)로 예측한 값이 정확하지 않아서 다른 alpha로 학습한 점수가 잘 나온것같습니다.
로스 함수를 보시면 퀀타일값이 어떤값이든 간에 예측값이 실제값과 같다면 0이 나옵니다. 하지만 quantile별로 Loss의 비율을 다르게 주는것이 핵심인데, 분위수가 낮으면 어느정도 낮게 예측해도 적은 로스를 주겠다는것이고 높으면 실제 값보다 높게 예측해도 적은 로스를 주겠다는 의미입니다. 이 로스의 요지는 정답을 맞추는것 뿐만이 아니라, 실제 예측하는 정답의 분포까지 어느정도 정확히 예측했냐를 다루는거라고 볼 수 있을것 같습니다.