항공사 고객 만족도 예측 AI 해커톤

정형 | Accuracy

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

 

마의 벽 9.4를 넘은 데이터 접근법 / XGB, LGBM, CAT, ET (0.942)

2022.02.09 11:36 6,381 Views language

안녕하세요 lastdefiance20입니다.

주로 kaggle에서 연습을 하고 활동을 했는데, 이번에 dacon에서는 처음으로 코드 공유를 해보게 되었습니다.
저는 항상 대회를 진행하면서 코드공유에서 영감을 얻고, 점수가 성장하는 재미를 느꼈습니다.

비록 부족한 실력이지만 점수가 잠시 정체되어 있는 분들이 성장의 재미를 느끼시면 좋을 것 같아서 새로운 insight를 제공하고자 코드를 올립니다.

public 점수는 하이퍼파라미터 튜닝된 XGB, LGBM, CATBOOST를 soft-voting하여 0.941이라는 점수가 나오게 되었습니다.
* public 0.942 달성, XGB, LGBM, CATBOOST모델에 ExtraTreesClassifier를 추가하였더니 점수가 살짝 올라갔습니다

->최종 순위인 private가 public에 비해 많이 하강함. 이부분은 제가 학습을 진행할때 하이퍼파라미터 튜닝을 너무 세밀하게 하고, learning rate 조정을 임의로 하는 바람에 overfitting이 발생해서 최종적으로 좋은 성적을 거두지 못한것 같습니다. 저와 동일한 모델 4가지를 voting하여 private 2위를 차지하신 성지코딩님의 코드를 보셔도 도움이 될 것 같습니다.

현재 이 코드는 튜닝되지 않은 XGB, LGBM, CATBOOST를 사용하여 제출한 코드입니다. 
데이터를 처리한 부분은 같고, 이 코드에서 정제한 데이터를 바탕으로 하이퍼파라미터만 튜닝한 모델을 사용하여 성능을 더욱 향상시켰습니다.
순서는 데이터 훑어보기(분류하기) -> 데이터 정제하기 -> 데이터 제거하기 -> 모델 학습하기 순으로 이루어져있습니다.

Dacon이 제공한 기본 EDA와, 성지코딩님의 다중공선성 부분을 참고하였습니다.
ssu통계학과님의 코드에도 0의 활용에 대해 고민하면서 빈도 대체를 취하는 부분이 있습니다. 이코드도 참고하시면 0이 결측치라는 확신이 들게됩니다.

피드백, 궁금증은 댓글로 남겨주시면 감사하겠습니다.

Code
로그인이 필요합니다
0 / 1000
성지코딩
2022.02.09 13:23

ordinal feature 에서의 0의 의미는 생각해보지 못했네요, 좋은 코드 정말 감사드립니다!

lastdefiance20
2022.02.09 15:15

성지코딩님의 코드도 잘 읽어보고 있습니다! 여담으로 ordinal feature에 0값들을 np.nan을 통해 null값으로 설정한 후 corr함수를 통해 target과의 상관계수를 출력했을때 상관계수가 크게 상승하여 0의 의미를 결측치라고 확정짓게 되었습니다.

mean_R
2022.02.09 21:37

6점 척도라 이상하게만 생각했는데 좋은 인사이트 감사합니다.

lastdefiance20
2022.02.10 13:48

mean_R님이 제 글에서 인사이트를 얻으셨다고 하니 코드를 공유한 보람이 나는것 같습니다! 읽어주셔서 감사합니다

백남진
2022.02.10 09:17

저 또한 0을 매우 나쁨으로 생각했는데 조금 더 깊게 보지못했네요.! 감사합니다 :)

lastdefiance20
2022.02.10 14:01

분데데분님 제 코드를 읽어주셔서 감사합니다! 추후에 0쪽 설명을 좀더 풀어보겠습니다.

Data is money
2022.02.10 16:30

좋은 코드 공유 감사합니다. 

lastdefiance20
2022.02.10 22:47

Data is money님 부족한 코드 읽어주셔서 감사합니다

성지코딩
2022.02.13 00:04

 안녕하세요! 글 중 'label encoding보다는 one-hot encoding을 이용하여 0에 의미를 부여하지 않는 것이 중요해 보입니다.' 라는 부분이 있는데,
라벨 인코딩을 원 핫 인코딩으로 바꿈으로써,  0에 의미가 줄어드는 이유를 알 수 있을까요?

lastdefiance20
2022.02.14 03:03

늦은 답변 죄송합니다... 요새 바빠서 댓글이 달린줄도 몰랐네요.

 우선 label encoding은 n개의 범주형 데이터를 0부터 n-1까지 연속적 수치 데이터로 표현하는것을 의미합니다. 따라서 0이라는 수는 2보다는 1과의 상관관계가 높아집니다. (0 = 소 / 1 = 중 / 2 = 대)같은 데이터로 표현하면 대와 중 둘중에서 소와 가장 가까운 것을 고르라고 하면 중이 소와 가깝다는 답변이 나오는것처럼 0, 1, 2는 서로 종속적인 관계를 유지하고 있습니다. 따라서 Label encoding된 데이터 숫자값의 크고작음을 우열로 나누고 가중치로 적용하여 학습하기도 합니다.

이와는 다르게 one-hot encoding은 서로 다른 범주 데이터는 독립적인 관계로 여겨지기 때문에 소, 중, 대를 one-hot encoding으로 표현하면 독립적인 관계로 표현됩니다. 따라서 one-hot encoding을 사용하면 0의 의미가 줄어든다는 뜻은 다음과 같습니다. 0이 결측치여서 만족도와의 순서적인 관계가 전혀 없기 때문에 0, 1, 2, 3으로 순서를 주어 종속적이게 묶어서 학습하는것보다는(잘못된 순서의 의미를 부여해서 알고리즘에게 제공), one-hot encoding을 이용해 독립적인 관계로 나타내고 알고리즘이 학습하도록 하는것이 바람직하다는 것입니다.(순서의 의미를 부여하지 않고 알고리즘에게 제공)

성지코딩
2022.02.14 09:48

아하 라벨인코딩에서의 숫자들은 결국엔 수치이므로 모델입장에서는 그렇게 해석될 수 있겠군요.. 이해했습니다!! 바쁘신데 명쾌한 답변 정말 감사드립니다 :)

체력이
2022.02.16 20:42

와 좋은 질문과 좋은 답변인거 같습니다. 저도 궁금했는데 글을 읽자마자 바로 해결됬네요!

세아
2022.02.15 17:39

 코드 공유해주셔서 감사합니다^^!!!!

lastdefiance20
2022.02.17 00:06

세아님 코드를 읽어주셔서 감사합니다!

어우두야
2022.02.16 21:40

compare_models를 사용했을 때 저는 catboost하고 xgboost는 안뜨는데 왜 그럴까요...ㅠㅠ? pycaret버젼은 2.3.6을 쓰고 있습니다

lastdefiance20
2022.02.17 00:05

혹시 따로 catboost 모듈과 xgboost 모듈을 설치하셨나요? 아마 설치가 되지 않아서 안뜨는것으로 보이네요. pycaret를 설치하더라도 이 두가지 모델은 따로 설치해야 되는것으로 알고있습니다.

영주야
2022.02.20 10:11

안녕하세요, 코드 공유해주셔서 감사합니다. 작성자님 코드 덕분에 많은 것을 공부하고 있습니다:) 혹시 ease of online booking과 online boarding의 0을 특별히 3이라는 값으로 대치한 이유를 알 수 있을까요? 

lastdefiance20
2022.02.22 10:34

그부분은 본문에 나와있는것처럼 ease of online booking과 online boarding의 값이 0인 행이 하나이고, 이 행의 online support값이 3이기 때문에 3으로 대치해 주었습니다.