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

정형 | Accuracy

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

 

첫 EDA / XGB+LGBM+CAT+ET softVoting / Private 2위 :)

2022.02.08 00:58 4,157 조회 language

베이스라인의 EDA를 저만의 방식으로 설명해보았고
스케일링, hard voting 앙상블, soft voting 등의 다양한 시도를 해보았습니다.

첫 EDA를 진행해보았고 아직은 참고해서 하는 수준이네요.
또 하이퍼파라메터 튜닝에  GridSearchCV가 주로 쓰이는걸 알고 한 번 적용해보았습니다.
GridSearchCV는 간단히 말해 사용자가 하이퍼 파라메터들의 경우의 수를 지정하여 최적의 하이퍼 파라메터를 찾아주는 모델입니다.
즉, 모델 튜닝 시에 사용되는 기능입니다. 이를 공부하고 처음으로 적용 시켜 보았습니다.

데이터 처리를 어떻게 해야할지 감이 아직 안와서 이 점은 차근차근 해쳐나가겠습니다.
가장 기본적인 범주형 데이터 처리와 다중공선성 컬럼을 제거하였습니다.

감사합니다! 좋게 봐주세요 :) 도움되었다면 좋아요도 눌러주세요 ;)

+) 추가, 0.939가 나왔습니다. 뭔가 기분 좋다기 보다는 더욱 황당했습니다. 각종 튜닝 및 전처리를 1차원적으로 해야만 고득점이 나왔습니다.
무슨말이냐 하면, 다중공산성 특징을 새로 조합하여 새로운 컬럼을 삭제하고 기존 특징을 제거 + 이상치 SimpleImputer로 mean변환 + 이산형 데이터에서 0에대한 값 처리 + 왜곡이 큰 데이터 log처리 등등을 처리한 것 보다.

다중 공산성 특징 단순 삭제 + 이상치 평균값 대체 (모듈없이 그냥 mean()함수 사용) 이 훨씬 높게 나왔다는 이야기입니다.

+) public 18위, Private 2위 스코어를 기록했습니다. 아무래도 운이 정말 좋았던 것 같습니다. 그래도 순위권이라니 기분이 좋네요 :)

코드
로그인이 필요합니다
0 / 1000
코딩하는미토
2022.02.08 09:20

깔끔한 정리 감사합니다 도움이 되었습니다

성지코딩
2022.02.08 09:55

부족한 글 좋게 봐주셔서 감사합니다!!

dong_ho
2022.02.08 11:00

Departure Delay in Minutes, Arrival Delay in Minutes 두 변수는 서로 상관관계가 높아 다중공선성 문제가 발생할 것 같습니다. 두 변수를 제외하고 분석을 하는 것은 어떨까요?

성지코딩
2022.02.08 11:08

타겟이 아닌 다른 특징들간의 상관관계가 지나치게 높을 경우 성능에 지장이 있다고 알고는 있었는데 막상 생각이 안나 처리를 못했습니다ㅠ 다중 공선성이란 단어도 기억이 잘 안났네여 . 좋은 피드백 정말 감사합니다! 다중 공선성에 대해 공부하고 반영해보겠습니다! 감사합니다 :)

하짱02
2022.02.08 20:38

다중공선성 확인해서 컬럼 제거해보고 모델링 하면 어떻게 나올지 궁금하네요, 좋은 노트북 감사합니다

성지코딩
2022.02.08 20:57

12시만을 기다리고 있습니다. ㅎㅎ 노트북 최신화 하였으니 참고해주세요! 다중공선성, 이상치 처리가 추가되었습니다. 좋게 봐주셔서 감사합니다 :)

유재성 KADE
2022.02.08 21:39

좋은 포스팅 감사합니다. 도움이 됐습니다.
데이터가 작아 빠르게 되지만 이상치를 평균값으로 대체할 때 반복문을 쓰는 것 보다 data.loc[outlier_index, 'column'] = mean()과 같은 형식으로 대치하는 것이 컴퓨팅 속도에서 이득을 볼 수 있습니다.
파이썬에서 반복문을 최대한 지양하는 쪽으로 데이터 전처리를 하시는 방법을 항상 생각해보시면 도움이 정말 많이 될 것 같습니다. :)

성지코딩
2022.02.08 21:59

DataFrame의 브로드캐스트 연산을 저도 애용하는 편인데요, 제가 놓친것 일 수도 있지만 아웃라이어 검출 함수에서 이상치들의 인덱스들을 반환합니다. 하지만 df.loc은 인덱스를 넣게되면 Key  Error가 발생하고 그렇다고 iloc을 사용하자니 컬럼명을 넣을 수가 없어서 해매고있다 결국 반복문을 사용했습니다 ㅜㅜ  좋은 피드백 감사드립니다!
df.iloc[index][feature]은 오류가 안나길래 
df.iloc[index][feature] = 0
형태를 시도해봤는데 값 반영이 안되었습니다. 위에 대한 내용(인덱스와 특징명 혼합(?))에 대해 혹시 해결책이 있을까요??

코드 좋게 봐주셔서 감사합니다 :)

유재성 KADE
2022.02.08 23:11

윗 댓글에 언급한 방식으로 하면 되는데, 부연 설명을 하자면
data.loc[ArrivalDelay_index_data, 'Arrival Delay In Minutes'] = data['Arrival Delay In Minutes'].mean() 과 같은 방식으로 컬럼 바꿔서 총 3번 진행했습니다.

성지코딩
2022.02.09 00:31

아 제가 무언가 실수를 했나봅니다. 말씀하신대로 실행해보니 잘 되네요!! 정말 감사드립니다 :) 반영 완료 했습니다!

초밥좋아
2022.02.09 00:56

좋은 글 이네요.! 많은 앙상블 방법 중 하드보팅 방법을 사용하시는 이유가 있다면 여쭤보고 싶습니다!!

성지코딩
2022.02.09 10:51

하드보팅은 이진분류에서 신뢰도를 얻기에 가장 쉬운 방법입니다. 예측값의 평균을 구하고 0.5를 기준으로 양성, 음성을 나누면 되기 때문이죠, 그런데 구글링 해보니 소프트보팅이 평균적으로 하드보팅보다 성능이 좋다고 나와있네요 한 번 소프트보팅도 반영해보겠습니다!  감사합니다)

초밥좋아
2022.02.10 00:18

그렇군요. 소프트 보팅이 좋은 점은 처음 알았네요..! 다른 코드 결과도 기대하겠습니다..!!

Data is money
2022.02.10 16:26

EDA 코드 잘 보고 갑니다. 많이 활용해보겠습니다. 감사합니다! 

성지코딩
2022.02.10 23:34

좋게 봐주셔서 감사합니다! :)

천뿌니
2022.02.11 02:47

안녕하세요 선생님
코드 잘 보고 가겠습니다. 그런데 질문 하나만 해도될까요??
데이터 전처리하기에서 낮은 상관계수 특징 제거하기에 상관계수가 가장 낮은 3개의 특징을 제거한다라고 했는데
Inflight entertainment
Online support
Ease of Online booking
위 3가지는 상관계수가 높은 특징들이지 않나요 ?!?
아직 엄청난 초보라 따라하면서 하고있는데 질문드립니다

성지코딩
2022.02.11 03:39

아이코, 엄청난 실수를 발견했네요. 상관계수가 낮은 3개를 지운게아니라 가장 높은 3개를 지워버렸었어서 성능이갑자기 9.35에서 9.21로 나왔었습니다.
해당 파일은 9.35 이후 여러가지 전처리를 추가하고 제출횟수 때문에 제출하지 않은 상태로 업데이트한 파일입니다.

명백한 저의 실수입니다. 지금은 저 특징들을 잠시 주석처리했는데 원인을 알았네요. 단지, 특징을 막 제거하면 안되겠구나 라고 착각을 했었습니다.

감사합니다. 천뿌니님 말씀대로 상관계수가 높은 특징이 맞습니다. 

제가 생각한대로 한 번 제거 해보고 성능을 테스트해보겠습니다! 좋은 지적 감사합니다.

천뿌니
2022.02.11 15:09

아닙니다! 성지코딩님 덕분에 저도 많은 것을 배웁니다
앞으로도 좋은 코드 감사합니다! 

SOEUNJEON
2022.02.12 16:34

안녕하세요! 코드 보고 많은 도움이 됐습니다! 
다중공선성이 발생하는 변수를 모두 넣고 돌린 예측 결과가 삭제한 결과보다 더 높을 때에도 꼭 삭제해야할까요? 
회귀 모형도 아니고 분류 모형을 사용하는 데 굳이 삭제해야 할까요?!  

성지코딩
2022.02.12 23:59

댓글을 보고 다중공선성이 머신러닝에 어떠한 영향을 주는지 알아보았습니다.

다중공선성은 결과에 대한 추론에는 큰 영향을 미치지만(신뢰성 문제) 오로지 예측만 진행하는 머신러닝에서는 성능에 영향을 주지 않는다.. 라고 여러 차례 본 것 같네요. 저도 아직 초보자라 다중공선성에 대한 내용은 더욱 깊숙히 다뤄보아야할 것 같습니다.

아니면 두 딜레이 시간의 평균치를 갖는 딜레이 특징을 새로 만들고 기존 2개의 컬럼을 제거하는 것도 좋을 것 같습니다!

좋은 질문 감사드리고! 명쾌하지 않은 답변을 드린점 죄송합니다!

문어구이
2022.02.12 22:02

안녕하세요.! 좋은 코드인 것 같습니다.  한 수 배우고 갑니다.
저도 다중공산성에 대해서 궁금증이 있는데 변수들간의 상관성이 높은 경우에는 무조건,,?!? 제거 하는 것이 좋을까요..? 

성지코딩
2022.02.13 00:00

안녕하세요! 다중공선성 관련 내용은 윗 댓글을 참고해주세요.

대부분 다중공선성을 가지는 특징들은 서로에게 큰 영향을 주는 컬럼이므로, 두 컬럼의 관계를 찾아서 새로운 특징을 만들어내고 성능을 비교해보는 것도 좋은 방법일 것 같습니다!

동화책
2022.02.12 23:25

코드 공유 감사합니다! 🙂

성지코딩
2022.02.13 00:01

코드를 자세히 읽어보면 빈틈이 많습니다 ㅠㅠ 그래도 좋게 봐주셔서 감사합니다!

jyeon94
2022.02.13 23:52

코드 공유 감사합니다!
찬찬히 따라해보면서 공부하고 있습니다.

성지코딩
2022.02.14 09:48

더욱 완벽한 코드를 제공했어야하는데 아쉽네요 ㅠㅠ 다음부터는 더욱 완성도 있는 코드를 공유해드리겠습니다.

감사합니다 :)

hyoring
2022.02.14 17:18

코드 공유 감사합니다 ! 질문이 하나있습니다! 수치형 데이터 박스플롯 그릴때
for ax, col in zip(axes.flat, num_data.columns[:-1]): 이 코드 사용하셨는데 axes.flat이 무엇을 의미하는지 여쭈어 봐도 될까요 ㅠㅠ 

성지코딩
2022.02.14 17:34

음.. 시각화 EDA는 본 대회 Baseline코드를 참고하여 작성하였고 시각화 해석에 대해서만 적어드렸습니다.
저도 궁금해서 검색해보았고 확실하지는 않지만 적어보겠습니다.

axis와 axes의 차이는 axis는 x축 y축과 같이 축을 의미하고 axes는 축으로 이루어진 좌표평면을 의미하는 것 같습니다.
subplot()함수에서 가로, 세로의 칸을 나누고 그 칸의 하나하나를 axes가 순서대로 2차원으로 가집니다. 예를들어 3, 4 로 지정했으면 3 by 4의 칸이 생성됩니다. 여기서 axes의 shape 는 (3, 4)인것이죠.
flat함수는 그 2차원을 1차원으로 펴주는 역할을 하는데요. 반복문으로 axes순서대로 시각화를 하려고 flat을 진행한 것 같습니다.
안그러면 2차원 접근법으로 꽤 피곤해지거든요! 

hyoring
2022.02.14 18:16

와우! 무슨말인지 어렴풋이 이해 되는거 같아요! 감사합니다 저도 검색했는데 도통 모르겠어서 ㅠ

hyoring
2022.02.14 18:21

아 질문 하나만 더드려도 될까요?! 

상관관계 분석전에 범주형데이터 인코딩 이렇게 하셨는데 
corr_df = data.copy()
corr_df[corr_df.columns[corr_df.dtypes=='O']] = corr_df[corr_df.columns[corr_df.dtypes=='O']].astype(str).apply(LabelEncoder().fit_transform)


이렇게 하면 자동적으로 인코딩 된 데이터들이 data 값에 저장이 되나요??

성지코딩
2022.02.14 20:02

판다스에서
'b'       boolean
'i'       (signed) integer
'u'       unsigned integer
'f'       floating-point
'c'       complex-floating point
'O'       (Python) objects
'S', 'a'  (byte-)string
'U'       Unicode
'V'       raw data (void)
의 표기를 지원합니다. 범주형데이터는 주로 
'O'       (Python) objects 로 존재합니다.
 dtype은 데이터 타입을 확인하는 것이고, astype은 데이터 타입을 변경합니다.
코드를 해석해보면, 오브젝트인 컬럼들을 가져와 str형으로 바꾸고 LabelEncoder()이라는 모델로 자동 라벨인코딩을 진행합니다.

만약, 라벨 인코딩이 아닌,  원 핫 인코딩을 사용하려면 pd.get_dummies()를 검색해보시길 바랍니다!
(매우 빈약하지만, 제 블로그에도 있습니다. https://sjkoding.tistory.com/8)

성지코딩
2022.02.14 18:52

삭제된 댓글입니다

어우두야
2022.02.16 21:05

코딩님 코드보며 잘배우고 갑니다!! 감사합니다!
맨위에 
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
이게 뭔지 알 수 있을까요...? 

성지코딩
2022.02.17 10:43

좋게 봐주셔서 감사합니다!

제가 블로그에 올리기위해서 추가한 코드인데 
HTML을 이용해서 ipynb파일을 올리기 위해서 크기를 일정하게 맞춰주는 코드입니다!

3Vdata
2022.02.16 22:49

이상치에 대해 의견을 나누어보자면...
어디선가 주워듣기로는 '이상치를 처리할 때는 통계적으로 분명한 이유가 있어야 합니다'라고 하던데,
사실 통계적으로 뭔가 뚜렷한 이유를 발견하기도 어렵기 때문에 '아무렇게나 처리하면 안된다'정도가 적당한 해석으로 보입니다.
이 경우에는 이상치를 단순히 우연에 의한 값/이상한 값으로 간주하기에는 무리가 있어 보입니다.
그래서 제 개인적인 의견으로는, 평균으로 대치하는 방법보단 특정값보다 클 경우 0으로 작을 경우 1로 하는 등의 방법이 좋아보입니다. 둘러보니까 저 말고도 이렇게 하신 분도 있으시더라고요. 사실 어떤 통계적인 이유가 있어서 보다는... 그냥 직관적으로 '평균 대치'는 이상치를 잘못된 데이터로 취급하는 것 같이 느껴져서 글 남깁니다(분명한 건, 이상치는 분명히 의미있는 수치입니다).
(+ 근데 단순히 모델 효율로만 보면 별 생각없이 이상치 없애는 것이 이상치를 남겨두는 것보다 훨씬 좋은 경우가 많더라고요. )

성지코딩
2022.02.17 10:57

좋은 지적 감사합니다. 사실 이상치에 대해서 처음에 처리하지 않았던 이유는, 예를 들어 지연시간의 이상치를 생각해볼때, 지연시간이 클수록 만족도는 떨어지는게 당연하고 이상치 이더라도 충분히 의미있는 데이터라고 판단했기 때문에 이상치를 처리하지 않았었습니다. 그런데 모델입장에서 생각해봤을 때는 이상치가 당연히 일반화측면에서 지장을 주는게 맞기도 한데.. 아직 명확한 이유는 아직 잘 모르겠습니다. 이상치 처리를 해주었더니 성능이 올라갔기 때문에 쓰게 되었습니다.

mean사용에 있어서는 원래 기존 mice나 SimpleImputer을 이용하여 대체를 했었는데 성능이 많이 떨어졌었습니다. 위 시작글에서도 언급했듯이 단순하게 mean처리를 하는게 가장 점수가 잘 나오더군요.. 

공부해야할 내용들이 아직 너무 많네요.. 감사합니다.

lastdefiance20
2022.02.19 18:11

성지코딩님 Private 2위 축하드립니다! 저랑 똑같은 4개 모델 구조를 사용하셨는데 제 모델은 마지막에 voting대신 stacking방식을 사용하도록 변경하고, 하이퍼 파라미터를 극한으로 세팅한 모델을 제출한 결과, 모델이 오버피팅이 나버려서 순위권 밖으로 밀려나버렸네요 ㅠㅠ... 다음에도 좋은 포스팅 기대하겠습니다!

성지코딩
2022.02.19 22:45

안녕하세요!! 진짜 운이 좋아서 2위가 된 것 같습니다 ㅜㅜ 실력이 아직 부족해서 데이터 전처리를 할때마다 성능이 감소해서 결국 위의 간단한 처리만 해주었는데 이렇게 됐네요. lastdefiance20님의 EDA와 0 수치에 대한 판단 등을 보고 많이 배우게 되었습니다. datawig라는 것도 알게 되었습니다 :) 감사합니다!!

lastdefiance20님도 고생 많으셨습니다!!

yoonj
2022.02.20 23:44

EDA부터 모델링까지 깔끔하게 정리되어 있어 많이 배울 수 있었습니다. private 2위 축하드립니다!

성지코딩
2022.02.21 10:50

yoonj님 안녕하세요!! 영광입니다 ㅎㅎ 부족한 코드이지만 좋게 봐주셔서 감사합니다!!

ppangppang
2022.02.21 12:20

무지성하게 EDA해보고 모델링해서 어떤식으로 더 손을 봐야할지 막막했는데, 차근차근 디테일하게 설명해주셔서 많은 도움이 되었습니다. 감사합니다!

성지코딩
2022.02.22 14:20

다음엔 더욱 완성도를 높여 공유해드리겠습니다! 좋게 봐주셔서 갑사합니다:)

최정명
2022.02.21 14:21

축하합니다. 👍

성지코딩
2022.02.22 14:21

헉, 영광입니다 ❗❗ 감사합니다. 더 열심히 하겠습니다 😊

백남진
2022.02.27 13:13

장난아니네요,, 깔끔하게 정리해줘서 잘 읽을 수 있었네요 :D