현실 데이터에는 클래스 불균형 문제가 자주 발생한다. 나의 경우에는 사거리 통행 차량 촬영 영상에서 승용차의 개수가 트럭과 버스에 비해 압도적으로 많아서 큰 불균형이 생겼다.
왜 데이터가 클래스 균형을 이루어야할까? 데이터의 클래스 균형의 핵심은 소수의 클래스에 특별히 더 큰 관심이 있는 경우에 필요하다.
현재 나의 재정 상황을 고려해서 물건을 살지 말지 예측하는 모델을 만든다고 할 때 사라고 에측하는 것과 사지 말라고 예측하는 것은 그 무게가 다르다. 물건을 사라고 예측하는 것은 훨씬 더 큰 리스크를 수반한다. 잘못된 투자는 큰 손실로 이어질 수 있기 때문이다. 따라서 물건을 사라는 예측에 대해서는 더 큰 정확도를 가져야 한다. 하지만 데이터가 물건을 사지 마라는 클래스에 몰려있는 경우 물건을 사지 말라는 예측에 있어서는 높은 정확도를 가질지 몰라도 물건을 사라고 예측하는 것에 관해서는 예측 성능이 좋지 않게 된다.
따라서 클래스 불균형이 있는 경우 클래스에 따라 정확도가 달라지게 된다. 이를 해결하기 위해서는 물건을 사라는 클래스에 더욱 큰 비중(weight)를 두고 정확한 예측을 할 수 있도록 만들어야 한다.
만약 소수 클래스에 관심이 없고 오직 전체 예측의 정확도(accuracy)에만 관심이 있다면 굳이 클래스 균형을 맞출 필요가 없다. 이런 경우에는 소수 클래스를 무시하더라도 전체 성능에 큰 영향을 주지 않기 때문에 클래스 균형을 맞추는 것이 굳이 필요하지 않다고 할 수 있다.
내가 참고한 블로그에는 클래스 불균형을 해소하기 위한 테크닉으로 weight balancing과 over and under sampling을 소개한다.
나는 그보단 YOLOv8에서 클래스 불균형을 해소할 수 있는 기능이 존재하는지 찾아보았다.
https://github.com/ultralytics/ultralytics/issues/2703
해당 깃허브 이슈의 답변을 보면 현재 YOLOv8에서 클래스에 가중치를 명시하는 매개변수가 존재하지 않고 훈련 중에 모든 클래스가 동일하게 처리된다고 한다.
YOLOv8의 훈련 과정에서 가중치를 조절할 수는 없고 그보단 데이터를 샘플링하여 조절하는 것을 권장하고 있다.
현재 진행중인 프로젝트에서 일정 이상의 정확도를 챙기고 이후 클래스 별 정확도를 챙기고 싶을 때 샘플링이나 소수 클래스에 한정한 데이터 어노테이션 등을 알아보아야겠다.
참고
https://3months.tistory.com/414
'프로그래밍 > 데이터 사이언스 공부' 카테고리의 다른 글
YOLO 등 모델 훈련 시 최적의 에폭수는 없다 (2) | 2023.12.06 |
---|---|
데이터셋 구축 시 특정 클래스 개체를 일부러 어노테이션 하지 않을 때 생기는 문제점 (2) | 2023.11.23 |
NotImplementedError: A UTF-8 locale is required. Got ANSI_X3.4-1968 (0) | 2023.11.01 |
클래스 명은 같고 클래스 개수는 다른 두 데이터셋으로 모델 훈련 시 성능 저하 해결 과정 (0) | 2023.10.30 |
Training yolo model with multiple datasets (0) | 2023.10.29 |