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

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

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

 

tensorflow pinball loss

2020.12.29 17:24 5,295 Views

tensorflow에서 pinball loss로 모델링 하고싶으신 분들을 위한 글입니다



from tensorflow.keras.backend import mean, maximum

def quantile_loss(q, y, pred):
  err = (y-pred)
  return mean(maximum(q*err, (q-1)*err), axis=-1)

....

model.compile(loss=lambda y,pred: quantile_loss(0.5,y,pred), **param)


위와같이 loss에 람다함수로 전달하면 됩니다.


maximum을 쓴 이유는 위와 같이 예측값(z)과 실제값(y)에 따라

계산 식이 달라지는데 maximum을 사용하면 자연스럽게 구현됩니다.



9개 quantile에 대해서 예측을 해야하는 만큼 9개를 for loop으로 학습 시키려면


q_lst = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

for q in q_lst:
  model = sequantial()
  model.add(Dense(10))
  model.add(Dense(1))   
  model.compile(loss=lambda y,pred: quantile_loss(q,y,pred), optimizer='adam')
  model.fit(x,y, epoch=300)



이런식으로 주시면 for loop으로 학습시킬 수 있습니다.


물론 multi sequence output으로 단일모델을 만들어서 loss를 리스트로 전달 하는 방법도 있습니다

로그인이 필요합니다
0 / 1000
Mather
2020.12.29 22:36

감사합니다.

민민
2021.01.05 18:00

감사합니다

orangeblue
2021.01.13 23:00

좋은 정보 감사드립니다. 
혹시 predict하실 땐 어떻게 하시나요 

고라파덕
2021.01.14 10:14

alpha를 특정한 모델이라면 똑같이 model.predict(data) 결과가 해당 alpha에 대한 결과입니다.
예를들어
quantile_loss(0.5,y,pred) 이런식으로 loss함수를 준 모델을 model.predict(data) 사용시 0.5 퀀타일 결과값이 나옵니다.
학습할때 넣은 값으로 결과가 나와요

orangeblue
2021.01.14 12:44

답글 감사드립니다. 제가 for 문을 이용하여 alpha를 하나씩 넣고 train한 뒤에 그 model을 가지고 predict(X_test)를 하는데 결과값이 다 소수점으로 나와서 input data가 잘못된 것인지 아니면 제가 모델을 잘못 만든 것인지 계속 찾아보고 있습니다. 다시 한 번 좋은 정보 공유해주셔서 감사드립니다.

고라파덕
2021.01.14 14:06

제 경험상 그런경우에는 모델 형성이 잘못되었거나
X_test와 X_train의 데이터 전처리 과정이 일치 하지 않아서 일때가 많아요
validation 데이터도 있으시다면 predict(X_train), predict(X_validation)도 해서 결과 한번 보세요

orangeblue
2021.01.20 11:31

삭제된 댓글입니다

orangeblue
2021.01.14 12:12

삭제된 댓글입니다

고라파덕
2021.01.20 11:39

nn이랑 lgbm 전처리에 대해서 말씀해 주셧는데 제가 늦게봤네요.

lgbm에 들어가는 데이터에도 nn처럼 minmax scaler같은 스케일링을 적용해도 되는지 물으시는거라면 해도 되지만 큰 차이는 없을겁니다

수염
2021.01.20 11:21

여기 lambda 뒤에 y랑 pred가있는데 각각 뭔가요...!

고라파덕
2021.01.20 11:29

y값이 목표값 pred가 프리딕션, 즉 예측값입니다

성은황
2021.01.20 11:24

안녕하세요 이제 막 텐서플로우를 배운지 1달이 되가는 새내기인데 ... 제 얕은지식으로는 알고리즘을 이해하지를 못해서 여쭤봅니다 ㅠㅠ
1. pred는 위에서 train data에 대한 데이터를 학습시킨다음에 테스트파일을 프레딕트해서 나온 값인가요?
2. 위에서 서술하신 model.fit(x,y...)부분에서 x와 y는 train 데이터가 아닌 train데이터에서 추출한 y와 test파일을 예측한 pred에 대한 데이터인가요? 아니면 train에서 추출한 x,y데이터인가요 ㅠㅠ

고라파덕
2021.01.20 11:31

1. 로스함수를 fit 메서드에 전달을 하면 학습과정에서 알아서 계산이 됩니다.

2.학습 데이터에 입력값과 예측 목표값이 잇으실겁니다. 각각 x 와 y입니다.

성은황
2021.01.20 15:15

재차 질문드려 죄송합니다.  x,y에 대해 정의해주셨는데 x라는게 train데이터에서 사용하는 입력값인지, train데이터에서 추출한 목표값인 Target 값인지 헷갈리네요 ㅠㅠ  그리고 저렇게 할거면 평소 회귀모델에서 사용하는 모델링 다음 훈련은 안해도 되는건가요?(저 방법으로 훈련하는것까지 합쳐서 2번이 아닌건가요?)

고라파덕
2021.01.20 17:25

x_train y_train의 x y입니다. 두개 합쳐서 학습데이터구요