집값 예측 AI해커톤

정형 | NMAE

  • moneyIcon Prize : 참가시 최소 50 XP, 특별상 데이콘 후드
  • 686명 마감

 

GBR + RF + RG + NGB + 파생변수 (public : 0.09509)

2022.01.27 03:19 2,254 Views language

안녕하세요 🙂

기존에 올려주신 코드에서 파생변수 및 선형 모델 추가하여 수행해보았습니다. public score : 0.09509 달성했네요!
이 후에 파생변수를 만드시는데 도움이 되었으면 좋겠습니다. 
좋은 모델과  코드 공유해주신 모든 분들께 깊은 감사 인사를 드립니다. 🙇‍♀️정말 많이 배웠습니다.
궁금한 사항이나 피드백 있으시다면 언제든 편하게 댓글 달아주세요~

* 본 포스팅은 데이콘 서포터즈 “데이크루" 1기 활동의 일환입니다.

============= 2022.02.07 업데이트 =============
(최종 57위, private 0.1024 달성했습니다. 약간의 과적합이 있었나보네요...)
많은 분들이 코드 참고해주셨네요. 정말 감사드립니다.
상위 랭크하신 분들 진심으로 축하드리고 코드 공유해주신 덕분에 저도 많이 배웠습니다. 
파생 변수 관련해서 부족한 부분이 있어서 추가적인 설명을 달아놓았습니다. 
- 차고 밖/안  (Garage IN/OUT) 변수 제거 
향후에 공부하시는 분들께 도움이 되었으면 좋겠네요. 
대회에 참여하신 분들 모두 고생 많으셨습니다. 🙇‍♀️

Code
로그인이 필요합니다
0 / 1000
백남진
2022.01.27 08:22

코드정리 엄청 잘 해놓으셨네요..! 주석으로 무엇을 말하는지도 적어놓으셔서 교과서 같은 느낌! 감사합니다 :)

동화책
2022.01.27 10:46

칭찬 감사합니다 🤗 도움이 되면 좋겠네요!

이세모
2022.01.27 17:39

파생변수를 만드는걸 생각하신게 대단하시네요!! 보고 많이 배웠습니다! 공유 감사합니다!!

동화책
2022.01.27 18:42

감사합니다! 대회 참여하시는데 도움이 되었으면 좋겠네요 ☺️

SuperGrover
2022.01.27 18:53

X = train.drop(['target'], axis = 1)
y = np.log1p(train.target)
target = test[X.columns]

혹시 해당 단계에서 마지막 코드가 무슨 역할을 하는지 알 수 있을까요??

동화책
2022.01.28 05:06

아 변수명 때문에 훈련데이터에 있는 집값(target)과 헷갈릴 수 있겠네요. 
마지막 코드에서 target은 학습할 모델에 입력할 테스트 데이터를 의미합니다.
모델을 학습시키는 데이터인 X와 동일한 컬럼만 테스트 데이터셋에서 가져오도록 하기 위해서 X.columns라는 컬럼 범위를 지정한 것구요!

여러 모델 학습 및 예측하는 코드를 보시면 (아래의 예시는 catboost 모델)

    target_data = Pool(data = target, label = None)
    fold_pred = cb.predict(target) / 10
    cb_pred += fold_pred

학습된 모델 object(변수 'cb')을 가지고 예측할 때 target이라는 변수를 입력합니다. 테스트 데이터셋을 의미하죠.
더 궁금한 사항있으시면 댓글로 남겨주세요! 감사합니다~ 🙂

SuperGrover
2022.01.28 15:38

완벽히 이해하였습니다. 제가 변수명에 헷갈렸네요. 친절한 답변 감사합니다^^~

삼성의미래
2022.01.27 23:16

안녕하세요 잘 정렬된 코드 덕분에 공부하는데 많은 도움이 되었습니다 !
혹시, sub['target'] = np.expm1((ngb_pred + rf_pred + rg_pred + gbr_pred) / 4) 에서 lr_pred , ls_pred, cb_pred 변수는 추가 하지 않으셨는데
그 이유가 있을까요 ??

동화책
2022.01.28 05:29

안녕하세요. 긴 코드 꼼꼼하게 읽어주셔서 감사합니다 ☺️
말씀하신 네 가지 모델을 사용한 이유는 검증 성능이 좋았기 때문입니다. 

"# 검증 성능 확인하기" 
코드 실행 결과 (제가 출력에 모델명을 적어놓지 않았네요 😅)를 보시면

lr : 0.09767766
rg : 0.09765726
ls : 0.12055385
el : 0.11609286
gbr : 0.10000015
rf : 0.09682164
ngb : 0.09615054
cb : 0.10626885

가장 성능이 잘 나온 순서대로 모델만 쓰고 싶었는데,  lr와 rg 모두 선형 모델이고 이왕이면 규제가 적용된 ridge가 낫지 않을까 싶어서 rg만 선택하였습니다.
기존에 올려주신 코드(기세현님의 코드)에서는 tree 계열 모델을 주로 사용하셨었는데, 
정규 분포에 가까운 변수들(면적 관련 변수들)도 있고 예측값과의 상관관계도 생각보다는 강하지 않은 것 같아서 선형 모델을 넣으면 좋을 것 같았습니다... 
파생 변수 때문인지 모델 구성 변화 때문인지는 모르겠으나 성능이 조금 올랐네요!
더 궁금하신 사항있으시면 댓글로 남겨주세요! 감사합니다~ 🙂

삼성의미래
2022.01.28 22:44

실제로 지표로 적용해봤더니, 말씀과 같이 검증 성능이 낮아지네요 ! 되게 재밌네요. 답변 감사합니다.

서연_
2022.02.07 15:22

삭제된 댓글입니다

서연_
2022.02.07 15:42

안녕하세요! 코드 덕분에 도움이 많이 되었습니다. 
다름이 아니라
이 데이터로 차고가 밖인지 안인지 모르지 않을까요??

def feature_eng에서
data['Garage InOut'] = data.apply(lambda x : 1 if x['Gr Liv Area'] != x['1st Flr SF'] else 0, axis=1)
1(지상층 생활 면적 != 1층 면적) 일때
1(지상층 생활 면적 = 1층 면적 + 2층 면적) 이면 성립하는 부분이 있어서요!
집 전체면적이 아니라 생활면적을 주어준거라 차고가 안인지 밖인지 판단하기 어렵지 않나요??

차고를 포함한 것이 생활면적이라면
차고가 IN일시
Garage Area + 1st Flr SF + 2nd Flr SF = Gr Liv Area가 성립되어야 하는데 데이터를 보면 그런 것도 아니여서

비판하는 것이 아닌 진짜 모르겠어서 여쭤봅니다!!

동화책
2022.02.07 16:15

안녕하세요 🙂
코드 꼼꼼하게 읽어주셔서 감사합니다.
말씀하신 것처럼 차고의 IN/OUT 유무를 면적 피처로 확인할 수는 없겠네요... 
코드 상으로 2층 면적이 있는 경우에 차고가 내부에 있다고 라벨링이 될 텐데 논리적으로 맞는 것 같진 않습니다.
수정해서 올려놓았습니다. 피드백 정말 감사합니다! 🙇‍♀️

윰윰찌
2022.02.08 12:24

동화책님 감사합니다. 덕분에 변수에 어떤 아이디어로 접근하고 파생 변수를 어떻게 생성하는지에서 많이 배우고 갑니다. 감사합니다!!

동화책
2022.02.08 18:07

도움이 되었다니 기쁘네요. 감사합니다 😊

jujukwakwkak
2022.02.08 16:24

코드 따라치면서 공부합니다.
도움 많이 됩니다.
감사합니다.

동화책
2022.02.08 18:08

감사합니다. 응원하겠습니다! 😀👍