DAY 7 : Class Imbalance | Stratification
210829
Last updated
Was this helpful?
210829
Last updated
Was this helpful?
하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하
0.726 -> 0.747
데이터는 그 분류를 인종, 성별, 나이로 나눌 수 있다. 근데, 여기서 인종은 아시아인이라는 한가지 분류로 되어있기 때문에 제외하면 성별과 나이에 대해 볼 수 있다. 초반 EDA에서 언급했듯이 데이터들의 분포가 불균형하다.
20대와 60대쪽으로 나이가 몰려있는 모습
또한 전체적으로 여성의 비율이 많아보인다.
일단 먼저 말하자면, 성별은 이를 어찌할 수가 없다. 당장에 데이터 전처리로는 해결할 수 없는 문제라고 판단했다.
다만, 나이같은 경우는 라벨링을 조금 다르게 했다. 이전의 분류는 30대미만, 30대이상 60대 미만, 60대 이상으로 라벨링을 했는데, 이 중 58세와 59세를 마지막 클래스에 넣었다. 그렇게되면 20대쪽의 분포를 줄이지는 못하지만 60대쪽의 분포를 채울 수는 있었다.
이게 가능한걸까?
일단, 58~59세의 특징은 30대 이상 60대 미만의 이미지 들이 가지고 있는 특징보다는, 60대 이상의 이미지들이 가지고 있는 특징에 더 가까울 것이다. 그래서 자연스럽게 흡수될 수 있다는 것이 첫번째이다.
그렇다면, 비록 원래 라벨은 두번째 클래스일지 몰라도, 60대의 학습을 위해 쓰여질 수 있지 않을까? 그래서 이러한 테크닉을 적용한다.
여기서, 이러한 의문이 생긴다.
그러면 실제 테스트 데이터에 대해서도 58~59세를 60대 이상이라고 판단하는거 아니야? 학습은 그렇게 할지라도 실제 테스트에서는 30대 이상 60대 미만 클래스에 넣어야 하잖아.
맞는말이다. 그러한 단점도 존재할 수 있다. 다만, 그러한 오차를 좀 발생시키더라도 60대 이상의 데이터를 증가시켜서 세번째 클래스에 대한 성능을 높이고자 하는 것이 테크닉이다. 실제로 테스트 데이터의 분포는 아무도 모르고, 만약 테스트 데이터가 58~59세 비중이 압도적으로 많다면 이 단점이 두드러질지 모른다.
반대로 60대 이상의 데이터가 압도적으로 많다면, 이 테크닉을 적용한것이 성능이 더 높을 것이다. 데이터가 고르게 나오더라도 그럴것이다. 따라서 일반적으로 성능 향상에 큰 도움이 될 수 있는 가능성이 높은쪽을 선택했다.
테스트 데이터셋에 따라 사실, 큰 성능 차이가 없을 수도 있는 부분이다.
올바른 성능을 보기 위해서 Data를 Stratified하게 나눠주려고 했다. 이에 대해서도 많은 토론이 있었는데 내가 설명할 수 있는 부분은 Train data와 동일한 분포를 설정해야 우리의 모델에 대해 객관적인 성능을 측정할 수 있다는 것이다. 분포가 다른 Valid data에 대한 성능이 0.90이 나오더라도 이를 신뢰할 수 있을까? 없다는 결론.
또, Valid Dataset의 평가지표에 대한 문제가 있었다. Test와 Valid 모두 f1 점수가 0.99까지 나왔는데, 보통 에포크가 커지면서 과적합이되면 Test와 Valid 차이가 생긴다는 사전지식과 상충되는 일이 발생했다. 학습할수록 Valid F1이 증가했다. 초반부터 느꼈던 이상한 점이었는데 그 이유를 이 날이 되서야 알았다. Test와 Valid 양쪽에 동일 인물이 반영된 것. Stratification의 기준이 class가 아닌 인물로 설정해서 해결했다.