월간 데이콘 신용카드 사용자 연체 예측 AI 경진대회

알고리즘 | 정형 | 분류 | 금융 | LogLoss

  • moneyIcon Prize : 100만원
  • 3,612명 마감

 

[Private 1위 0.6581] | 소회의실 | Catboost

2021.05.25 23:20 18,543 Views language

안녕하세요. 팀 소회의실 입니다.
아직 데이터분석을 배우고 있는 학생들이고 첫 데이콘 참여였는데 좋은 성적을 얻어서 정말 기분 좋네요 :)
저희가 logloss를 가장 크게 낮출 수 있었던 요소는 ID 변수를 만든 것과 catboost 모델을 이용한 것이었습니다. 랜덤포레스트, LGBM, XGB 모두 사용해봤고 Voting, Stacking 등 여러가지 기법을 시도했습니다만 파라미터 적용하지 않은 catboost에 모두 미치지 못했네요...
열심히도 했지만 운이 좋았던 것 같습니다.
무엇보다 코드공유, 토론 게시판에 글 올려주신 많은 분들 감사드립니다. 고민의 연속에서 많은 힌트를 얻을 수 있었습니다. 다음부터는 저도 적극적으로 참여하도록 하겠습니다.
모두 고생 많으셨습니다!

수정) 데이터 전처리 2. 이상치 제거 부분 설명에서 
train['family_size'] > 8 인 데이터 제거 -> train['family_size'] > 7 인 데이터 제거 오타 수정했습니다.

Code
로그인이 필요합니다
0 / 1000
당쇠
2021.05.25 23:27

축하합니다.

Vale
2021.05.25 23:33

좋은 대회 열어주셔서 감사합니다!

jerrykim91
2021.05.25 23:39

family_size: 7 인 이상치 제거를 한 이유가 있나요? 

Vale
2021.05.26 10:49

family_size=7인 데이터는 제거하지 않았고요, 9 15 20 인 데이터가 각각 한명인 동일인물 데이터라 이상치로 판단하고 제거했습니다. 중간 코드 설명엔 family_size > 8 이라고 써뒀었네요.. 수정하겠습니다. 감사합니다!

jee_p0
2021.05.26 11:14

이번 대회 키포인트는 카테고리 변수의 조합을 통해 ID를 만드는 것 같네요. 1등 축하드리고 코드 공유 감사합니다:)

Vale
2021.05.26 12:30

네 저도 그렇게 생각합니다. 읽어주셔서 감사합니다 :)

최정명
2021.05.26 21:12

코드 공유 감사합니다. 많은 도움이 되었습니다.
1등 축하드립니다 !!!

Vale
2021.05.26 23:35

베이스라인 코드 올려주신 점 저도 감사드립니다!

블메소리
2021.06.03 19:46

잘 읽었습니다. 훌륭하신 코드 잘 보고 갑니다 ㅎㅎ

Vale
2021.06.03 22:52

도움이 되셨으면 좋겠네요. 감사합니다. 

Zedi
2021.06.04 19:10

안녕하세요 코드 공유 잘 봤습니다.

한가지 의문이 드는데, ID 변수가 가장 성능에 도움이 되었다는 건
1. 중복된 같은 사람의 신용도는 거의 변하지 않고 비슷하다.
2. 학습 데이터와 테스트 데이터에 같은 사람이 많다.
이런 식으로 생각할 수도 있을까요?

결과가 잘 나온 건 잘 나온 거고,
데이터의 특성이나 의미를 생각해봤을 때 ID 변수가 좋았다는 것의 의미가 뭘까 한 번 생각해봤습니다.

christine
2021.06.07 10:05

안녕하세요, 소회의실 팀의 팀원입니다. 
먼저 코드를 읽고 질문 달아주셔서 감사합니다. 
질문을 읽고 나서 코드를 재검토해보고 다음과 같이 답변합니다. 

1번. train data에서 가지고 체크했을 때 ID당 나오는 신용도의 종류수는 다음과 같습니다. 
편의상, 중복되지 않은 ID도 포함하여 수치를 계산했습니다. 
ID 개수의 총합: 8756 개
신용도가 1종류 : 5918
신용도가 2종류:  2336
신용도가 3종류:  502

ID당 신용도가 2종류 이상인 경우가 2800명 정도 된다는 것을 보았을 때, 중복된 사람의 신용도가 거의 변하지 않고 비슷하다고 말하기는 어려울 것 같습니다. 

2번.  testID(총 5585개) 중
train과 중복된 ID 개수: 4616개 
중복되지 않은 ID 개수 : 969개 
train과 중복되지 않은 test ID 969개의 경우 모두 -1로 배정되었기 때문에 이 경우에는 학습데이터와 테스트 데이터에 같은 사람이 많았으므로 test 학습에 유리하게 작용했을 것이라고 판단합니다. 

Zedi
2021.06.18 10:44

안녕하세요
늦었지만 답변 감사드립니다!

christine
2021.06.07 10:05

삭제된 댓글입니다

지금이닛
2021.06.13 21:01

ID 파생변수가 어떤 과정에서 만들어졌는지 질문해도 될까요?

기존에 머신러닝 feature engineering 기법에서 쓰였던 것인지 혹은 참고한 논문이나 문서가 있는지.. 궁금합니다!!

Vale
2021.06.14 12:59

처음에는 토론게시판에서 중복된 사용자가 있다는 소스를 보고 그 사용자들을 걸러내기 위해 중복 사용자를 특정할 수 있는 피쳐가 있어야겠다는 생각에서 시작했습니다. 
사용자를 조금 더 개인화(세분화)하여 특정하기 위해서는 저희가 아는 정보를 모두 동원해야 할 필요성을 느꼈고, 코드를 보시다시피 쉽게 생각해서 begin_month를 제외한 모든 피쳐를 문자열로 다 합친 후 인코딩했습니다. 
논문에 있는지는 확인을 못해봤지만 사실 그 정도로 엄청 특이한 방법을 쓴 것은 아닙니다...

지금이닛
2021.06.15 11:16

아하! 제가 초보라 생소하고 신기해서 질문드렸는데, 답변 감사드립니다!  ㅎㅎ

zz0622python
2021.06.14 06:43

삭제된 댓글입니다

뚜콩이
2022.07.21 23:17

잘 읽었습니다

Cardy
2022.10.25 13:35

안녕하세요, 공유 감사합니다. 궁금한 것이 음수 변수들을 절댓값 처리하신 이유가 있나요? 음수 변수 그대로 사용하시지 않은 이유가 궁금합니다. 성능에도 차이가 있으셨나요?

Vale
2022.10.25 14:58

안녕하세요! 시간이 좀 지나서 기억이 가물가물한데요, begin_month 와 같은 컬럼의 경우 절대적인 근무기간= '정도'의 의미를 담기 위해서 절대값처리를 했습니다.
처리 유무에 따른 성능을 평가해보진 않았는데 크게 상관은 없을 것이라고 생각합니다. 
1년반이 지났는데도 보시고 댓글 달아주셔서 감사드려요 :)

Cardy
2022.10.27 23:50

@Vale 님, 수상 축하드리고 (오래전이지만) 답변주셔서 감사합니다! 
하나 더 여쭈면, 클러스터링 과정에서 k-means 하셨는데, kmeans.predict(kmeans_train) 여기서 predict가 가지는 의미가 뭔가요? 양의 정수로 나오던데 어떤 의미로 표현된건지 궁금합니다!