전복 나이 예측 AI 해커톤

정형 | NMAE

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

 

MLP + NGB + XGB + CAT with Data Over Sampling (0.144)

2022.03.26 16:36 2,707 조회 language

안녕하세요 lastdefiance20입니다.

모델이 High Target을 잘 예측하지 못하는것 같아 Data Oversampling을 진행해보았는데 성능이 꽤 잘나와 공유드립니다.

현재는 간단하게 복제하여 가중치를 늘려보았으나, 추후에는 Smote 등의 오버샘플링 기법도 사용해볼 생각입니다.

순서는 데이터 불러오기 -> 데이터 전처리 -> 모델 생성 및 학습하기 -> 제출하기 순으로 이루어져있습니다.

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

코드
로그인이 필요합니다
0 / 1000
동마스
2022.03.26 21:50

진짜 많이 배워 갑니다

lastdefiance20
2022.03.26 23:38

동마스님 코드 읽어주셔서 감사합니다. 제 부족한 코드에서 좋은점만 배워가시기 바랍니다!

Pobredward
2022.03.26 22:14

올려주신 코드 공유마다 생각하는건데 데이터 분석에 관한 깊이가 남다르신 것 같아요,,, 정말 많이 배웁니다 매번 감사합니다 :)

lastdefiance20
2022.03.26 23:44

Pobredward님 과찬이십니다! 저도 저번 손동작 분류 경진대회에서 게시물 흥미롭게 읽고 많이 배웠습니다. 항상 데이터를 받고서 머릿속에 한번씩 떠오르는 아이디어가 있으면 바로바로 적용해보는 편이라 새로운 관점들이 나오는것 같습니다.

MAD김민섭
2022.03.26 23:08

감사합니다

lastdefiance20
2022.03.26 23:44

MAD김민섭님 저야말로 코드 읽어주셔서 감사합니다.

YIEBIG
2022.03.27 01:39

분류문제에서 타겟값이 Imbalance 할때만 샘플링 기법을 적용했었는데,
데이터 분포를 보고 이렇게도 생각 할 수 있군요..! 좋은 인사이트 감사합니다 ㅎㅎ 오버샘플링 시도해봐야겠네요 저도!
항상 코드 잘 보고있습니다. 감사합니다.

lastdefiance20
2022.03.27 13:37

YIEBIG님 저도 분류 문제가 아닌 회귀 문제에서 사용해본건 처음인데 오버샘플링이 먹힌 이유는 결과값의 범주가 작기도 하고, 워낙 15살 이상의 샘플 수가 적어서 그런것 같기도 합니다.

물린다
2022.03.27 12:36

저도 21살 이상을 제거했었는데 오히려 성능이 떨어지더라구요. 물론 그 때는 반복해서 돌려볼 생각을 안했던 시기라...
29살만 제거해 봐야겠습니다. 무게와 관련된 이상치도 제거하고... ^^  -> 일단 테스트 해봤는데 현재 제 모델에서는 이상치 제거하니 성능이 떨어지네요. ㅠㅠ
오버샘플링해서 효과를 본적이 거의 없어서 시도 안 해봤는데 이것도 테스트 해봐야겠군요. => 음... R에서는 themis 패키지에서 SMOTE를 지원해줘서 적용해 봤는데요, 일단 데이터 수가 작은 3살, 21살 이상의 데이터는 SMOTE가 안되더라구요. 해당 데이터를 지우고 SMOTE로 데이터 늘렸는데 성능이 많이 안 좋아집니다. 해당 데이터를 지워서 그런 것 같기도 하고... 제가 만든 피처와 궁합이 안 맞는지, 아니면 다른 패키지를 찾아봐야 하는지... 고민이네요. ^^;
암튼 좋은 인싸이트 감사합니다. ^^

lastdefiance20
2022.03.27 13:56

물린다님 정성스러운 댓글 감사합니다! 이상치를 제거했을때 간혹 public score 성능이 떨어지는 경우가 발생할 수 있지만, public score이 그대로 최종 순위에 이어지는 것은 아니기 때문에 기준에 맞춰 제거해나가고 있습니다. 실제로 public score에 치중한 나머지 overfitting이 일어나 최종 순위와 많이 달라진 경우도 생겨봤기 때문입니다. 

SMOTE의 경우에 생성하려면 데이터 개수가 적어도 X개 이상이(X는 feature로 설정할 수 있습니다) 있어야 된다고 하네요. 또한 저는 SMOTE를 그냥 적용해 버리지 않고, 생성된 데이터중 어느 정도의 비율만 가져오는게 좋을것 같다고 생각하고 접근하고 있습니다. 
예를들어 Target 0의 데이터가 10개, Target 1의 데이터가 2개 있을때 패키지를 그대로 적용하면 알아서 Target 1의 데이터를 9개 추가로 생성해서 1:1의 비율을 맞춰주게 되기 때문에 물린다 님이 어떻게 적용하셨는지는 모르겠지만 그냥 적용하셨다면 20살 등 수가 적은 데이터가 5개에서 200개? 정도로 소수의 데이터에 대한 과대적합이 일어나지 않았나 생각하네요. 

이처럼 그냥 적용했을때는 Target 1에 원래 존재하던 2개, 즉 소수의 데이터에 너무 과대적합 될 수 있다고 생각해서 예시에서 추가로 생성한 8개중 두개만 가져오는 등 원래 있던 소수의 데이터를 SMOTE 기법 등을 사용해서 두배만 늘려줄까 생각하고 있습니다. 이렇게 하면 Target 0의 데이터가 10개, Target 1의 데이터가 4개로 조금만 늘어나서 수가 많은 Target에 편향되는 학습을 막고, 소수의 데이터를 너무 복제했을때 일어나는 과대적합을 방지할 수 있지 않을까 생각합니다. 이 부분은 추후에 한번 부분적으로 적용한 후 글을 업데이트 해보도록 하겠습니다.

물린다
2022.03.27 14:02

overfitting이 일어날 수 있으므로 public score에 집착하지 않는다. 오.. 이런 측면을 생각 못했네요. 앞으로 명심하겠습니다. ^^
SMOTE 할 때 비율을 정하지 않았었네요. 디폴트로 1로 해서 가장 많은 것과 개수를 맞추었군요. 그래서 수가 적은 데이터에 overfitting 되면서 성능이 안 좋아졌겠네요. 말씀하신대로 비율을 조금 줄여서도 비교해봐야겠네요. R에도 over_ratio라는 파라미터를 이용해서 비율을 조정할 수 있네요.
많이 배웁니다. ^^

lastdefiance20
2022.03.27 14:26

예전에 너무 극한으로 세팅을 한 나머지 public보다 최종 순위가 엄청 낮아진 경험 이후로는 어느정도 원칙을 세워서 하고 있습니다. 이후로는 어느정도 public과 최종 순위가 유사하거나, 오히려 올라가더라고요. 저야말로 물린다님이 토크에 써주신 글들 읽고 배운점이 많습니다! 새로운 feature를 조합해보고 있는데 그닥 안오르네요... 이부분은 좀더 고민해봐야할것 같습니다. ^^

Junghoon
2022.03.28 06:36

좋은 코드 공유 정말 감사합니다. 정말 많이 배워갑니다 ^^
한 가지 궁금한 점이, oversampling을 적용하게 될때 overfitting 가능성은 없나요?

lastdefiance20
2022.03.28 22:00

안녕하세요 Junghoon님, 기본적으로 oversampling은 항상 overfitting의 위험이 같이 존재하고 있다고 알고있습니다. 같은 데이터를 random over sampling하거나, SMOTE등 기법을 사용한다고 해도 oversampling의 근간은 train set에 존재하는 소수 클래스를 기반으로 뻗어나오는 것이기 때문입니다. 하지만 적당한 양의 oversampling을 적용한다면 다수 클래스에 overfitting하는 문제를 해결할 수 있기 때문에 사용합니다. 조금 더 세부적인 내용 및 overfitting을 막기 위해 발전되는 oversampling 기법들은 아래 링크를 참고하셔도 좋을 것 같습니다. https://wyatt37.tistory.com/10

coding2b
2022.03.28 09:58

많이 배워갑니다!!

lastdefiance20
2022.03.28 22:02

coding2b님 읽어주셔서 감사합니다!

khdb
2022.03.28 20:49

덕분에 많이 배워갑니다. 특히 soft 앙상블 방법도 볼 수 있어서 좋았네요.
코드 공유 감사합니다.

lastdefiance20
2022.03.28 22:15

khdb님 앙상블을 사용하면 대체적으로 성능이 향상되는 경우가 많으니 꼭 한번 구현해서 사용해보시기 바랍니다!