칼로리 소모량 예측 AI 해커톤

야, 너두 1등 할 수 있어 [ Private 1st Tip ]

2023.04.24 11:55 2,295 Views

안녕하세요 설빙더아이스 입니다. 이번에는 RMSE를 줄이는 세 가지 Trick을 가져왔습니다.

리더보드에 0.27~ 점수가 많은데 사실 여러분들도 이 트릭을 사용했다면 아주 손쉽게 0.1대로 내려올 수 있습니다. 😆

우선 저는 주요 전 처리로 몇몇 변수를 drop하고, PolynomialFeatures를 사용한 후 LinearRegression, Ridge 모델을 사용했습니다.


첫 번째 Trick: Ensemble (Voting)

쉽게 말해 두 모델의 결과 값을 평균 냈습니다  -> RMSE 변화 거의 x

(분류의 경우 voting이라고 하는데 회귀에서는 뭐라고 부르는지 잘 모르겠습니다.😅)


두 번째 Trick: Stacking

두 모델의 결과를 axis=1로 concat한 것을 input data로 삼아 새로운 모델을 학습 시키는 것입니다.

저는 autogluon을 이용해 stacking을 진행하였는데 이 경우 RMSE가 크게 감소하였습니다.


LinearRegression: 0.29..

->           Stacking: 0.15~0.16 (Public RMSE)







세 번째 Trick: Round

이 방법은 떠올리고 나서 깜짝 놀랐습니다. 우리의 예측 값은 대부분 실수로 이루어져 있습니다. 하지만 목표 값은 정수이죠.

RMSE가 0.3 정도라면 예측을 매우 잘하기 때문에 실제 예측 값과 목표 값은 다음과 같이 이루어져 있습니다.

예측: 57.825.., 26.145..., 31.322...   목표: 58.0,   26.0,   31.0...

저는 이 예측 값에 np.round() 함수를 적용 시켜 반올림해 보았습니다.


그 결과 RMSE는 0.289 -> 0.115으로 크게 감소한 것을 볼 수 있었습니다!

Public RMSE: 0.12649 !! 😝


이후 반올림해준 예측 값으로 Ensemble, Stacking 해주었습니다!

Ensemble (0.6*LR+0.4*Ridge) -> Public RMSE: 0.11865


Stacking ( presets=['best_quality'], num_stack_levels = 0 )-> Public RMSE: 0.12082




이렇게 RMSE를 극적으로 줄일 수 있는 세 가지 Trick에 대해 알아봤는데요, 막상 알고 나면 별거 아닌 것처럼 느껴지지 않나요?

여러분들도 자신만의 전처리나 Trick이 있다면 토크로 공유해주세요!


(Private 점수는 내일이 되어야 확인할 수 있어서 가장 낮은 private점수를 기록한 방법으로 코드공유 작성하도록 하겠습니다.)

로그인이 필요합니다
0 / 1000
정새
2023.04.24 12:18

이럴수가

정새
2023.04.24 12:20

랭킹 차트 2번째 탭에 PRIVATE score를 확인할 수 있는데, 이 차트는 실제 private와는 별개인가요??

설빙더아이스
2023.04.24 12:23

실제 PRIVATE score 맞습니다! 다만 제가 선택한 두 파일인 stacking과 voting? 중 어떤 방법이 가장 좋은 성능을 냈는지는 내일 파일을 다시 제출하여 확인하여야 알 수 있습니다!

정새
2023.04.24 12:24

아 그런 의미로 말씀하신거군요. 코드 공유 올라오면 경건한 마음으로 잘 배워보겠습니다!

마느아
2023.04.24 12:27

딱 Ensemble까지는 시도해봤는데.... stacking까지만 해볼걸 그랬네요. 잠깐 떠올렸다가 접었는데...
반올림은 정말 어떻게 떠올리신건지.. 대단하십니다.

설빙더아이스
2023.04.24 12:32

아이고,, 아쉽네요..😩 저는 여러 ensemble 기법들과 stacking은 거의 항상 해보는 것 같습니다!
반올림은 저도 떠올리고 깜짝 놀랐습니다...  감사합니다!

tonylee_
2023.04.24 12:31

안녕하세요, Stacking 은 생각을 못했고, 마지막 트릭은 고려를 했는데 애초에 반올림 상에서 정확하지 못해서 (마지막 제출 전까지) 사용을 못했는데 이걸 너무 잘 사용하셨었네요 ㅎㅎ 1등 축하드립니다! 그리고 하필 1등 하신 대회에서 안 좋은 일이 발생을 했는데, 그래도 주최 측에서 잘 판단해주셔서 정리가 잘 된 것 같습니다. 다행입니다 :)

설빙더아이스
2023.04.24 12:36

반올림 트릭을 생각하셨다니! 대단하십니다...! 저도 Stacking하고 난 후 예측 값에 반올림할 땐 RMSE가 오히려 오르더라구요..
LR과 Ridge 예측 값에서 RMSE가 감소해서 다행인 것 같습니다. 감사합니다!
(+ 부정 제출 건은 DACON측이 잘 정리해주셔서 감사할 따름입니다.)

국밥장인김국밥
2023.04.24 12:48

세 번째 Trick에서 감탄을 금치 못하고 있습니다... 데이터를 좀 더 자세히 관찰할 필요가 있음을 배워갑니다!

설빙더아이스
2023.04.24 20:21

감사합니다. 정형 데이터는 항상 알 수 없는 곳에서 해결책을 찾곤 하네요 😂

구름저편
2023.04.24 13:14

반올림 ...뜨아...

신도림조기축구회_김덕배
2023.04.24 13:15

감사합니다 많이배우네요
정형데이터쪽은 설빙님 진짜 항상 상위권이신거같아요.
좋은솔루션 보고갑니닷!

설빙더아이스
2023.04.24 20:22

아직 많이 부족하지만 그만큼 더 공부하고, 노력하는 중입니다.
미남홀란드님도 파이팅입니다! 감사합니다!!!😄

ㅁㅍ
2023.04.24 13:58

1등 정말 축하드립니다! 이번 대회에서 100등 안에 들어보는 것이 목표였는데 설빙님과 KBSU님 덕분에 0.5 아래로 100등 안에 드는 데 성공했어요 정말 감사합니다 ㅎㅎ
제대로 참여해본 대회가 처음이라 너무 막막했는데 완주하고 이렇게 비법 공유도 받아보니 정말 공부가 잘 되는 것 같아요 다시 한번 축하드립니다 행복한 하루 되세요! ^__^

설빙더아이스
2023.04.24 20:29

감사합니다! 첫 대회 목표 달성하는 것 쉽지 않으셨을텐데 고생 많으셨고 또 축하드립니다!
ㅁㅍ님도 좋은 하루 되세요!!

비스퀘어
2023.04.24 14:10

1등 축하드립니다! 앙상블 기법에 있어서 Voting 을 제외하고 Stacking이 있다는 건 알고 있었지만 실제 파급력이 어마어마하네요;;
역시 시도는 다양하게 해야 상위권에 올라가는 듯 합니다.

설빙더아이스
2023.04.24 20:25

감사합니다! 그리고 3등 축하드립니다ㅎㅎ, "부정 제출자가 없으면 비스퀘어님이 3등이 되시지 않을까?" 라고 생각했었는데 역시나네요.

맞습니다. 상위권의 코드 공유 글을 보면 그 방법이 간단해 보이지만 실제로는 많은 시도들을 하셨더라구요.. 

기열찐빠아쎄이라도리
2023.04.24 15:15

첫번째는 배깅이고 두번째는 부스팅 아닌가요

설빙더아이스
2023.04.24 20:16

bagging과 비슷하지만 voting과는 조금 다른 것 같습니다.
마찬가지로 Boosting과 Stacking도 다릅니다!

통닭먹으러
2023.04.24 15:18

안녕하세요. 코드 공유해주셔서 많은 공부하고 갑니다.
주신 세 가지 방법 전부 처음에 시도해봤었는데 왜 저는 결과가 안좋았을까요? ㅜ.ㅜ

데이터분석에 처음 입문하다보니 궁금한 점이 있어서 질문 드리고 싶습니다.
저도 스태킹 방법을 처음에 적용하였을 때 성능이 소폭 상승하는 것을 느꼈는데, 이때 테스트 데이터셋으로 나온 결과를 다시 모델에 넣어서 학습하는 과정이 data leakage인지 아닌지 확신이 들지 않아서 결국 해당 방법을 포기하였습니다.

제가 이해하기로는 data leakage 에 걸리지 않으려면 모든 테스트 데이터셋이 주어진 상황(또는 모든 테스트 데이터셋을 학습해서 결과를 내놓은 상황)을 가정하면 안되고 테스트 데이터 하나가 들어왔을 때 최종 결과물에 해당하는 값을 낼 수 있느냐 라는 기준으로 판단하였는데 이러면 스태킹은 data leakage에서 문제가 생길 수도 있다고 생각했습니다.

혹시 해당 부분에 대해서 알려주실 수 있으실까요??

설빙더아이스
2023.04.24 20:20

test dataset은 학습에 일절 사용되지 않습니다!
train dataset을 train과 validation으로 나누어 예측 값을 각각 만든 후, train 예측으로 학습하고, validation 예측으로 평가하는 방식입니다!
test는 오로지 예측에만 사용됩니다. 내일 코드 공유 글 올리도록 하겠습니다!

bullbear
2023.04.24 16:49

오우 round는 생각도 못했네요 : O

설빙더아이스
2023.04.24 20:32

RMSE낮아지는 거 보고 저도 깜짝 놀랐답니다.. : O

kseob758
2023.04.24 22:31

좋은 글 감사합니다 코드 공유도 기대됩니다!

설빙더아이스
2023.04.25 12:07

감사합니다! 별거 아니지만 코드 공유도 올렸습니다.

A_Biased_Coin
2023.04.25 11:29

6:4로 가중치를 준 특별한 이유가 있을까요?

설빙더아이스
2023.04.25 12:12

1:9 부터 9:1까지 비율을 각 비율당 random_state만 바꿔서 1000번씩 학습한 결과 가장 좋은 것은 0.604 : 0.396 이었습니다! 
제 대답은 "성능이 좋았기 때문에" 입니다!

A_Biased_Coin
2023.04.30 22:15

감사함둥~

DM_MSI
2023.04.25 12:14

많은 것을 배웠습니다. 특히 세 번째 Trick 같은 경우 정말 감탄했습니다 ㅎㅎ
좋은 Tip 알려주셔서 감사합니다~!

설빙더아이스
2023.05.02 17:54

영광입니다! 앞으로도 DataMining님처럼 열심히 공부하도록 하겠습니다
좋은 댓글 감사합니다!!

짜록
2023.05.03 10:03

삭제된 댓글입니다