3장은 시스템 관점에서 데이터를 처리하는 방법다뤘다면 이번 챕터는 Data science 관점에서 데이터를 처리하는 방법을 다룸
ML 모델을 개발하는데 훈련 데이터는 매우 중요
하지만 대부분의 커리큘럼은 전체 업무 프로세스에서 일부분일 뿐인 ‘모델링’에 치중됨 (물론 나도 그렇게 배웠다)
ML 모델을 시스템으로 만들고 프로덕션에 배포하기 위해서는 데이터를 올바르게 처리하는 일도 매우 중요
이 책에서는 ‘훈련 데이터셋’이 아닌 ‘훈련 데이터’라는 용어를 사용
‘데이터셋’은 유한하고 고정적인 집합을 의미하지만 프로덕션 환경에서 데이터는 유한하지도 고정적이지도 않음
ML 시스템 개발 과정에서 훈련 데이터 생성 역시 반복 프로세스
모델이 수명 주기를 한 사이클 돌고 나면 훈련 데이터 역시 개선될 가능성이 높음 (높은 확률로 새롭게 처리하는데 골치아픔)
현실에서 발생하는 데이터는 잠재적인 편향(bias)이 가득
편향이 발생하는 원인은 다양하며 수집, 샘플링, 레이블링 과정에서 발생하기도 함
과거 데이터는 사람의 편향을 내포할 수 있고 해당 데이터로 훈련한 모델은 편향이 더욱 심해지도록 할 수 있음
데이터를 사용하되 너무 신뢰하지는 말자!
4.1 샘플링
샘플링은 ML 워크플로우에서 핵심적이지만 일반적인 ML 프로세스에서 중요성을 간과하곤 함
샘플링은 ML 프로젝트 수명 주기 내 여러 단계에서 이루어짐
가용한 전체 데이터에서 훈련 데이터를 생성하기 위한 샘플링, 훈련, 검증, 테스트 목적으로 분할하기 위한 샘플링 (train_test_split), 모니터링 목적의 샘플링 등
여기서는 훈련 데이터를 생성하기 위한 샘플링 방법에 초점
샘플링은 매우 다양하게 사용
예를 들어 전체 데이터에 접근하기 어려운 경우에 모델 훈련 목적으로 샘플링으로 훈련 데이터 생성
혹은 전체 데이터를 다루기엔 시간과 자원이 너무 많이 들어 샘플링으로 분할 후 처리 (scratch 모델 생성 등)
아래의 이유로 다양한 샘플링 방법을 이해하고 워크플로우 내에서 사용되는 방식을 이해할 필요가 있음
- 잠재적인 샘플링 편향을 피할 수 있음
- 데이터의 효율성을 향상하는 샘플링 방법을 선택할 수 있음
샘플링은 크게 비확률 샘플링과 무작위 샘플링으로 나뉨
4.1.1 비확률 샘플링
비확률 샘플링은 데이터를 확률이 아니라 특정 기준에 의거해 선택하는 방식
비확률 샘플링에서 사용하는 기준들
- 편의 샘플링 (Convenience sampling)
데이터를 가용성에 의거해 선택
사용하기 편해 인기가 많은 방식
예를 들어 정보 제공 동의를 한 고객 데이터만 사용하거나 크롤링이 가능한 텍스트만 이용 등
- 눈덩이 샘플링 (Snowball sampling)
기존 샘플을 기반으로 미래의 샘플을 선택하는 방식
- 판단 샘플링 (Judgement sampling)
전문가가 어떤 샘플링을 포함할지 결정
- 할당 샘플링 (Quota sampling)
특정 데이터 그룹별 할당량을 정한 뒤 샘플링하는 방식
예를 들어 실제 연령 분포와 상관없이 연령대별 샘플 100개 등
비확률 샘플링은 실제 데이터를 잘 대표하지 못하고 선택 편향이 발생
ML 모델 훈련에 이런 데이터를 사용하면 결과가 좋지 못하고 통계에서 가장 기본적으로 배우는 내용이지만 사용하기 편리하고 현실적인 이유로 많이 사용됨
언어 모델링은 수집하기 쉬운 위키백과, 크롤링, 레딧 등을 주로 활용
감성분석 역시 레이블이 있는 데이터를 구하기 힘들어 이미 편향이 있는 데이터를 사용하는 경우가 많음 (리뷰를 남긴 사용자가 이미 편향)
4.1.2 단순 무작위 샘플링
가장 단순한 형태의 무작위 샘플링은 데이터의 각 샘플이 선택될 확률이 모두 동일
모집단의 10%를 선택한다면 해당 모집단의 모든 구성 요소가 10%의 확률로 선택될 수 있음
단순 무작위 샘플링은 구현이 쉽지만 드물게 발생하는 클래스가 포함되지 않을 수 있음
특정 클래스가 모집단의 0.01%에서만 발생하는데 전체 데이터의 1%를 샘플링한다면 이 클래스는 포함되지 않을 가능성이 높음
이런 데이터로 학습을 한 모델은 해당 클래스가 아예 존재하지 않는다고 간주
4.1.3 계층적 샘플링 (stratified sampling)
모집단을 상이한 성질의 그룹으로 나눈 뒤 개별 그룹에서 샘플링을 수행하는 방법
이렇게 하면 단순 무작위 샘플링의 단점을 극복할 수 있음
예를 들어 클래스 A, B 가 있는 데이터에서 1% 샘플링을 한다면 A 클래스에서 1%, B 클래스에서 1%를 샘플링
해당 클래스가 드물게 발생해도 샘플이 포함됨
모든 샘플을 원하는 그룹으로 나누는 일이 불가능할 때도 있으므로 계층적 샘플링 역시 항상 가능하진 않음
다중 레이블처럼 한 샘플이 여러 계층에 포함된다면 더욱 까다로움
4.1.4 가중 샘플링 (weighted sampling)
각 샘플에 가중치를 부여하고 이를 기반으로 샘플링을 하는 방식
가중 샘플링을 활용해 도메인 지식을 활용하거나 최신 데이터의 반영 비율을 늘릴 수 있음
보유하고 있는 데이터의 분포와 실제 분포가 다른 경우에도 활용 가능
실제 분포가 A:75%, B:25%의 비율인데 보유하고 있는 데이터는 A와 B가 동일한 개수라면 A에 3배 높은 가중치 부여
4.1.5 저수지 샘플링 (reservoir sampling)
저수지 샘플링은 프로덕션 환경에서 스트리밍 데이터를 처리할 때 유용한 샘플링 방법
예를 들어 지속적으로 수집되는 데이터를 개 샘플링하여 모델 학습을 한다고 가정
전체 데이터 개수는 알 수 없지만 (계속 수집되므로) 한번에 메모리에 올릴 수는 없음
즉, 특정 데이터 샘플이 선택될 확률을 알 수 없음
이 때 샘플링 요구사항은 다음과 같음
- 각 샘플이 선택될 확률은 동일해야 함
- 알고리즘 가동을 언제든지 엄출 수 있으며 이 때 각 샘플이 올바른 확률로 샘플링됐음을 보장해야 함
저수지 샘플링 알고리즘은 배열 형태로 구현 가능한 저장소(reservoir)를 포함하여 3단계로 구성
- 첫 번째 개의 요소를 저장소에 넣음
- 수집되는 각 번째 요소마다 을 만족하는 난수 생성
- 이면 저장소의 번째 요소를 번째 요소로 교체. 아니면 다음 요소로 넘어감
각 번째 요소가 저장소에 포함될 확률이 으로 동일함이 증명 가능하고 알고리즘 가동이 멈추어도 저장소 내 모든 샘플이 올바른 확률로 샘플링되었음을 보장

4.1.6 중요도 샘플링 (Importance sampling)
중요도 샘플링은 ML뿐만 아니라 다양한 분야에서 두루 사용되는 방법
원하는 분포가 아닌 다른 확률 분포만 활용 가능한 상황에서도 원하는 확률 분포에서 샘플링이 가능
확률 분포 에서 를 샘플링해야 하지만 는 샘플링 비용이 크고 시간이 오래 걸리며 활용이 어렵다고 가정
반면 분포 는 샘플링하기가 쉽다면 를 에서 대신 샘플링하고 해당 샘플의 가중치를 로 부여
이 때 를 제안 분포(proposal distribution) 혹은 중요도 분포(importance distribution) 라고 함
는 인 경우 을 만족하는 임의의 분포로 설정
아래 식을 통해 를 통해 샘플링한 의 기댓값이 가중치를 로 부여해서 에서 샘플링한 기댓값과 동일함을 알 수 있음
ML에서 중요도 샘플링을 사용하는 예시는 정책 기반 강화학습
새로운 정책의 가치 함수를 추정해야 하지만 행동에 따르는 총 보상을 계산하는 일은 비용이 큼
이 경우 새로운 정책이 이전 정책과 유사하다면 이전 정책을 기반으로 총 보상을 계산하고 새로운 정책에 따른 가중치로 재조정 가능 (이전 정책의 보상으로 제안 분포를 구성)
4.2 레이블링
여러 비지도 ML 기법들이 있지만 여전히 지도 학습 기반 모델들이 많이 쓰이고 있음 (특히 프로덕션 환경에서)
지도 학습 기법들은 레이블이 있는 데이터의 양과 질에 크게 의존함
초기에는 데이터 레이블링을 전담으로 하는 조직은 한시적인 조직으로 여겨졌지만 배포 후에도 레이블링 작업은 꾸준히 필요
데이터 레이블링은 보조 업무가 아니라 핵심 업무!
4.2.1 수작업 레이블
데이터의 레이블을 수작업으로 직접 하는 것
하지만 여러 가지 이유로 매우 어려움
- 데이터를 수작업으로 레이블링하는 비용이 매우 큼
특히 도메인 전문가가 필요한 경우에 더욱 큼 (의료사진 판독을 위한 전문의 고용 등)
- 데이터의 개인 정보 보호 문제
수작업 레이블링을 하기 위해선 누군가는 데이터를 봐야함
민감 정보가 포함되어 있는 데이터라면 자체 레이블링 팀이 필요
- 레이블링 자체에 시간이 오래 걸림
말을 글로 변환하는 것만큼이나 레이블링을 하는 것도 오래 걸리는 작업
레이블링이 오래 걸리면 모델 구축에도 시간이 오래 걸리지만 배포 후 변화하는환경과 요구사항에 대응하기 어려워짐
주변 환경의 변화로 레이블링 규칙이 바뀌거나 레이블이 추가되는 경우도 빈번
레이블 다중성
레이블이 지정된 데이터를 얻기 위해 종종 여러 소스에서 데이터를 사용
레이블링을 위한 어노테이터의 전문 지식 수준도 매우 상이
이 때문에 레이블의 모호성 또는 한 데이터에 여러 레이블이 있는 레이블 다중성 문제가 발생
어노테이터의 경향이나 지식 수준에 따른 불일치를 최소화 하기 위해선 먼저 문제를 명확히 정의해야 함
‘어떤’ 작업을 위해 ‘무슨’ 기준으로 레이블링을 할 것인지 확실하게 정의하고 이를 모든 어노테이터에게 주지할 필요가 있음
데이터 계보
데이터의 양에만 집중하고 데이터의 품질에 신경쓰지 않으면 데이터를 추가해도 모델 성능이 감소하는 일이 발생하기도 함
여러 소스에서 온 데이터들의 레이블링 기준이 다를 수 있기 때문
특히 원본과 새로운 데이터를 이미 결합해 버렸다면 되돌리기는 매우 어려운 일
이를 방지하기 위해 각 데이터 샘플과 레이블의 출처를 추적 가능하게 설정하는 것이 필요
이를 데이터 계보(data lineage)기법이라고 함
데이터 계보는 데이터 내 잠재 편향에 를 할당하고 모델을 디버깅하는데 큰 도움이 됨
(데이터 버전 관리는 매우 중요하다는 것을 뼈저리게 느꼈다)
4.2.2 자연 레이블
자연적인 레이블이 있는 데이터도 매우 많음
지도 어플의 도착 시간 예측은 (gps가 부정확하긴 해도) 출발 위치에서 목표 위치에 도달한 시간을 계산하면 그 자체로 레이블이 됨
가장 대표적인 자연 레이블은 추천 시스템
추천한 목록에서 사용자가 선택하면 이 자체가 레이블이 됨 (행동 레이블 behavioral label)
일정 시간이 지나도 선택되지 않은 항목은 음성(negative)으로 간주
사용자의 피드백을 통해 레이블을 수집할 수도 있음
페이스북이나 유튜브, 넷플릭스와 같이 추천 후에 사용자 설문을 통해 알고리즘에 대한 피드백 수집 가능
사용자가 직접 평점이나 반응을 통해 명시적인 피드백을 주는 것을 명시적 레이블(explicit label)
음성 혹은 양성 레이블의 부재를 통해 추정하는 것을 암시적 레이블(implicit label) 이라고 함
피드백 루프 길이
예측을 수행한 시점부터 사용자로부터 피드백을 얻는 시점까지 걸리는 시간을 피드백 루프 길이(feedback loop length)라고 함
피드백 루프 길이는 모델이 사용된 어플리케이션이나 비즈니스에 따라 매우 다양
피드백 루프 길이 설정에는 속도와 정확도 사이의 트레이드 오프 존재
루프 길이가 짧으면 많은 데이터를 얻을 수 있고 모델의 문제를 조기에 발견하고 해결 가능
반대로 사용자가 피드백을 하기 이전에 레이블을 잘못 지정할 수 있음
이상 거래 탐지나 배송이 오래 걸리는 상품의 경우 피드백을 수집하는데 오랜 시간이 걸릴 수 있음
피드백 수집이 오래 걸리는 경우 모델의 문제를 파악하는데 걸리는 시간 역시 오래 걸린다는 문제가 함께 발생함
4.2.3 레이블 부족 문제 해결하기
고품질 레이블을 충분히 얻기란 매우 어려운 일이므로 이를 해결하기 위한 많은 기술이 개발됨
약한 지도 학습 (weak supervision)
약한 지도 학습은 데이터를 레이블링할 때 도메인 전문 지식을 통해 개발된 휴리스틱을 활용
약한 지도 학습에는 스탠퍼드 AI 연구소에서 개발한 오픈 소스 도구 스노클 (Snorkel)을 널리 활용
스노클과 같은 라이브러리는 레이블링 함수(labeling function; LF)개념을 기반으로 개발
LF란 휴리스틱을 인코딩한 함수로써 LF를 작성한 후에 레이블링하려는 샘플에 적용
휴리스틱 자체에 잡음이 존재하므로 LF가 생성한 레이블에는 잡음이 수반됨
다수의 LF가 동일한 샘플에 적용되어 상충된 레이블을 지정하기도 함
레이블이 올바를 가능성이 가장 높은 집합을 얻으려면 모든 LF를 결합하고 잡음을 제거한 뒤 가중치 조정이 필요
이론 상으로 약한 지도 학습에는 수작업 레이블 (=ground truth) 이 필요 없음
하지만 LF의 정확성 파악을 위해선 약간의 수작업 레이블이 있는 편이 좋음
수작업 레이블을 통해 데이터에서 패턴을 발견해 LF 개선에 도움을 줄 수 있음
약한 지도 학습은 민감 정보가 있는 데이터에 특히 유용
일부 데이터만 확인한 후 나머지는 비공개로 LF 적용이 가능
또한 LF를 활용해 도메인 전문 지식의 버전을 관리하고 재사용 혹은 공유가 가능
데이터나 요구사항이 변경되면 LF 수정 후에 재적용만 하면 됨
LF를 활용해 레이블을 생성하는 방법을 프로그래밍 방식 레이블링 이라고 함
LF는 좋은 방법이지만 완벽한 방법은 아님
LF가 전체 데이터를 커버하지는 못할수도 있으므로 LF 방식으로 레이블을 생성한 후 ML 모델 학습
또한 LF 자체에 많은 노이즈가 포함되어 있으므로 주의해서 사용할 필요가 있음
준지도 학습 (semi-supervision)
준지도 학습은 구조적인 가정을 활용해 초기에 수집한 소수의 레이블을 기반으로 새로운 레이블 생성
이론 상 초기 레이블이 아예 필요없는 약한 지도 학습과 달리 초기 레이블 필요
대표적인 준지도 학습으로는 self-training이 있음
레이블이 지정된 기존 데이터로 모델을 학습한 후 레이블이 없는 데이터를 예측
예측된 데이터를 훈련 데이터에 포함하고 다시 학습 진행
위 과정을 만족스러운 성능이 될 때까지 반복함
또 다른 방법으로는 유사한 특성이 있는 데이터끼리 동일한 레이블을 가진다고 가정
유사성을 찾기 위해 클러스터링이나 KNN과 같은 알고리즘이 추가로 필요
최근에는 교란(pertubation)기반 방법이 주로 사용됨
데이터에 작은 교란 신호(=노이즈)를 추가해도 레이블이 변하면 안된다는 가정에 근거
기존 데이터에 교란 신호를 추가해 새로운 데이터를 생성하고 모델 학습 진행
준지도 학습은 학습할 레이블 개수가 제한적일 때 가장 유용
데이터가 제한적일 때는 검증 데이터와 평가 데이터로 얼마만큼을 사용할 지 고려해야 함
적은 양을 사용하면 성능이 좋은 모델이 사실 평가 데이터에 과적합된 모델일 수 있음
너무 많은 양을 사용하면 전체 데이터를 가지고 학습한 모델보다 성능이 낮을 수 있음
적당한 크기의 평가셋으로 최적 모델을 선택한 후 평가 세트까지 합친 전체 데이터로 챔피언 모델을 다시 학습하는 방법을 널리 사용
전이 학습 (transfer learning)
특정 학습을 위해 개발된 모델을 후속 작업에 재사용하는 방법
미리 생성된 모델을 현재 작업에 맞게 수정하는 fine-tuning 과정이 필요함
전이학습은 레이블링된 데이터가 많지 않은 작업에 특히 적합
사전 모델이 클수록 다운스트림 작업(원하는 작업에 맞게 수정) 성능이 좋아짐
능동적 학습 (active learning)
능동적 학습은 데이터 레이블링 작업의 효율성 향상
ML 모델이 학습할 데이터 샘플을 선택할 수 있으면 더 적은 레이블로 더 높은 정확도 달성 가능
능동적 학습 모델이 레이블링되지 않은 샘플에 대해 질의하면 사람이 거기에 대한 레이블을 지정
능동적 학습을 질의 학습 이라고 부르기도 함
이 때 데이터 샘플을 무작위로 샘플링하는 것이 아니라 특정 지표나 휴리스틱에 근거해 선택
가장 간단한 지표는 불확실성
모델의 불확실성이 가장 높은 데이터 샘플들을 선택하고 레이블링을 통해 모델의 결정 경계(=hyperplane)를 더 잘 학습하도록 도움
예를 들어 예측한 클래스에 대해 가장 낮은 확률을 가지는 데이터 샘플을 선택하고 그 실제 값을 학습
다양한 후보 모델 간의 불일치를 기반으로 하는 휴리스틱도 일반적으로 사용
이 방법을 위원회에 의한 질의 (query-by-committee)라고 하며 앙상블 방법의 일종
먼저 다양한 후보 모델로 구성된 위원회가 필요
위원회의 모델들은 서로 다른 하이퍼파라미터를 동일한 모델이거나같은 모델을 데이터의 서로 다른 부분으로 학습한 것
각 모델들은 다음으로 어떤 샘플을 레이블링할지 투표 (각 모델의 예측 불확실성에 근거)
위원회의 불일치 정도가 가장 큰 샘플을 선택해 레이블링
이외에도 다양한 휴리스틱 기법을 통해 선택 가능
예를 들어 경사 하강법의 경사가 가장 크거나 손실을 가장 줄이는 샘플을 선택하는 방법이 가능

4.3 클래스 불균형 문제
클래스 불균형이란 훈련 데이터 내 클래스 당 샘플 개수가 크게 차이나는 문제를 말함
클래스 불균형은 주로 분류 문제에서 많이 발생하지만 회귀 문제에서도 발생
예를 들어, 의료비 청구금액의 경우 중앙값은 낮지만 95번째 백분위수는 매우 높은 금액일 수 있으므로 의료비 예측에는 중앙값보다 95번째 백분위수를 정확하게 예측하는 것이 더 중요할 수도 있음
4.3.1 클래스 불균형 문제의 어려움
다수의 ML모델(특히, 딥러닝 모델)은 데이터 분포가 균형을 이룰 때 잘 작동하고 불균형일 때는 제대로 동작하지 않음
클래스 분포가 불균형일 때 학습이 어려운 이유는 3가지가 있음
- 모델이 소수 클래스를 알아내는 법을 학습하기 어려움
소수 클래스의 데이터 개수가 적다면 모델이 해당 클래스를 몇 번 학습하지도 못하고 판단을 내려야 함(few-shot learning 문제)
또 샘플링 시점에서 훈련 데이터에 아예 포함되지 않을 수도 있음
- 모델이 내재된 패턴보다는 단순 휴리스틱을 활용하려는 경향이 강해지고 최적이 아닌 해를 고집하게 됨
0.1% 데이터만 폐암 데이터라면 모델은 모든 데이터를 폐암이 아닌 것으로 판정해도 정확도가 99.9%
이런 휴리스틱에 무작위성을 조금만 더해도 정확도가 낮아지므로 경사 하강법 알고리즘이 휴리스틱을 능가하기 어려움
- 클래스 불균형은 주로 비대칭적인 오차 비용 문제와 연결됨
드물게 발생하는 클래스를 잘못 예측하는 일은 반대의 경우보다 비용이 훨씬 큰 경우가 많음
모델은 보통 불균형과 상관없이 모든 데이터 인스턴스를 동일하게 취급
손실함수로 이런 비대칭을 처리하도록 하지않으면 다수 클래스와 소수 클래스에 똑같은 성능을 발휘함
일반적으로는 다수 클래스에서 성능이 떨어지더라도 소수 클래스에서 성능이 좋은 모델이 선호됨
일반적으로 연구에 사용하거나 학교에서 접하는 데이터는 균형잡힌 경우가 많지만 실무에서는 불균형인 경우가 훨씬 많음
현실에서는 드물게 발생하는 사건이 일반적으로 발생하는 사건보다 훨씬 흥미롭고 결과 또한 더 중요
대표적인 불균형 문제로 이상 거래 탐지(FDS), 고객 이탈 예측, 질병 혹은 이력서 스크리닝 등이 있음
잘 알려지지 않았지만 객체 탐지(object detection)도 클래스 불균형 문제
대부분의 사각형(경계 상자; bounding box)은 원하는 객체를 포함하고 있지 않음
클래스 불균형이 데이터의 분포와 상관없이 발생하는 경우도 있음
스팸 메일의 경우 대부분의 이메일은 스팸이지만 이미 필터링되어 있는 경우가 많아 실제 데이터 상에서 스팸 메일은 매우 작음
또한 레이블링 과정에서 어노테이터의 실수 등으로 클래스 불균형이 야기될 수 있음
클래스 불균형이 발생했을 경우 데이터를 조사해가면서 원인을 파악해가는 과정이 중요 (조사가 힘든 경우가 매우 많음..)
4.3.2 클래스 불균형 처리하기
클래스 불균형은 불균형 정도에 따라 작업에 주는 영향이 다르며 어떤 작업은 다른 작업보다 불균형에 더 민감
Japkowicz에 의해 불균형에 대한 민감도는 문제의 복잡도에 따라 증가하며, 복잡도가 낮고 선형으로 분리 가능한 문제는 클래스 불균형 정도에 상관없이 영향을 받지 않는 다는 사실이 증명됨
이진 분류 문제의 클래스 불균형은 다중 클래스 분류 문제보다 훨씬 쉬운 문제
마찬가지로 깊은 신경망은 얕은 신경망보다 불균형 데이터에서 성능이 더 좋음
딥러닝 기술이 발전하면서 데이터를 ‘조작’해 불균형을 해결해서는 안된다는 의견도 존재
불균형 그 자체가 데이터의 실제 형태이므로 좋은 모델이라면 불균형을 모델링하는 법을 학습해야 한다는 것
하지만 그런 모델을 개발하는 일이 어려우므로 여전히 불균형을 처리하는 방법이 필요함
클래스 불균형을 처리하는 3가지 접근법으로
- 문제에 적절한 지표 선택
- 데이터 분포를 변경해 불균형 정도를 낮추는 방법
- 클래스 불균형에 더 강건해지도록 학습 방법을 변경하는 알고리즘 수준의 방법
등이 존재
하지만 이런 기법들은 필요조건일 뿐 충분조건은 아님 (Survey on deep learning with class imbalance 참조)
올바른 평가 지표 사용하기
클래스 불균형 문제를 처리할 때는 적절한 평가 지표를 선택하는 일이 매우 중요
정확도(accuracy)나 오차비율(MAE, RMSE 등)은 가장 많이 사용하는 지표지만 해당 지표들은 모든 클래스를 동일하게 취급하므로 클래스 불균형이 있는 작업에는 적합하지 않음
기본 지표들은 다수 클래스에 대한 모델 성능에 좌우되는데 다수 클래스가 주 관심대상이 아닐 경우 문제가 더 큼


위 두 모델의 confusion matrix를 보면 실제 암을 더 잘 예측하는 모델 B를 선호하지만 두 모델의 정확도는 0.9로 동일
관심 대상 클래스와 관련해 모델 성능을 이해하는 데 도움이 되는 지표를 선택하는 것이 중요
이 경우 정확도는 각각의 클래스에 개별적으로 사용하면 여전히 좋은 지표임 (모델 A: 10%, 모델 B: 90%)

Precision(정밀도), recall(재현율), F1-score 등은 TP를 기준으로 삼기 때문에 이진 분류 문제에서 유용
- Precision - TP/(TP+FP)
- recall - TP/(TP+FN)
- F1-score - 2 X Precision X recall / (Precision + recall)
정밀도, 재현율, F1-score는 비대칭 지표
즉, 어떤 클래스를 양성으로 간주하느냐에 따라 값이 바뀜
분류 문제는 대부분 회귀 문제로 모델링 가능
각 클래스의 확률을 출력해 임계값(threshold)을 조정해 precision과 recall을 조정 가능
ROC-AUC 등을 활용해 적절한 임계값을 고를 수 있음 (ROC에 대한 자세한 설명은 여기 참조)
데이터 수준의 방법: 리샘플링
리샘플링은 훈련 데이터의 분포를 수정해 데이터 불균형 정도를 줄이는 방법
리샘플링에는 다수 클래스에서 데이터 포인트를 제거하는 언더샘플링과 소수 클래스에서 데이터 포인트를 추가하는 오버샘플링이 있음
가장 간단한 언더샘플링 방법은 다수 클래스에서 데이터 포인트를 무작위로 제거하는 것이며, 가장 간단한 오버샘플링 방법은 원하는 비율이 될 때까지 소스 클래스 복사본을 무작위로 생성하는 방법

저차원 데이터를 언더샘플링하는 토멕-링크나 오버샘플링하는 SMOTE 같은 방법은 저차원 데이터에만 효과적
리샘플링을 위한 계산부담때문에 고차원 데이터 또는 고차원 피처공간에는 적용이 힘듦
훈련 데이터를 리샘플링하게 된다면 리샘플링된 데이터에서는 모델을 평가하지 말아야 함
모델이 리샘플링한 분포에 과적합될 위험이 존재
언더샘플링은 데이터 제거 과정에서 중요한 데이터가 손실된 위험이 있고 오버샘플링에는 훈련 데이터에 과적합될 위험이 있음
특히 소수 클래스의 복사본이 계속 추가되는 경우에 이런 문제가 발생하기 쉬우므로 정교한 샘플링 기법 계속 발전
2단계 학습은 이런 과적합을 해결하기 위한 방법
먼저 리샘플링한 데이터로 모델을 학습한 후 원래 데이터로 모델을 미세 조정
리샘플링은 각 클래스에 데이터가 N개만 남을 때까지 다수 클래스를 무작위로 언더샘플링함
또 다른 기법으로는 동적 샘플링이 있음
학습 과정에서 성능이 낮은 클래스를 오버샘플링하고 성능이 높은 클래스를 언더샘플링
모델에 이미 학습한 것보다 학습하지 않은 것을 더 많이 보여주는 것을 목표로 함
알고리즘 수준의 방법
데이터 수준의 방법은 학습 데이터 분포를 변경해 클래스 불균형 문제를 해결
알고리즘 수준의 방법은 학습 데이터 분포는 그대로 유지하면서 클래스 불균형에 더 강건한 알고리즘으로 변경하는 것
알고리즘 수준의 방법은 대부분 손실함수를 조정
두 데이터 중에서 을 잘못 예측해서 발생하는 손실이 더 크다면 모델은 을 올바르게 예측하는 일을 우선시 해야함
이를 위해 에 더 큰 가중치를 부여하면 모델은 해당 데이터 포인트를 학습하는데 더 초점을 둠
일반적인 손실함수는
이 손실함수는 모든 데이터 포인트를 동일하게 취급함
손실함수를 수정하는 방법은 비용 민감 학습, 클래스 균형 손실, 초점 손실 등이 존재
비용 민감 학습
클래스 별로 오분류 비용이 다르다는 점을 바탕으로 서로 다른 비용을 고려해 각 손실 값을 수정하는 방법
비용 행렬 는 클래스 를 클래스 로 분류할 때 비용을 의미

클래스 의 데이터 포인트 로 인한 손실은 데이터 포인트 의 모든 가능한 분류의 가중 평균
비용 민감 학습은 비용행렬을 수작업으로 지정해줘야 한다는 단점이 존재
클래스 균형 손실
클래스 균형 손실은 소수 클래스를 잘못 예측한 모델에 불이익을 준다는 아이디어
가장 기본적인 형태는 각 클래스의 가중치를 해당 클래스 샘플 수에 반비례하게 만드는 것
이렇게 하면 더 적은 수의 클래스가 더 큰 가중치를 갖게 됨
클래스 의 데이터 포인트 로 인한 손실은 아래와 같음
는 를 클래스 로 분류할 때의 손실 (손실 함수는 cross-entropy 등)
초점 손실(Focal loss)
데이터에서 특정 데이터 포인트는 다른 것들보다 분류하기 쉽고 모델은 이런 데이터는 분류하는 방법은 빠르게 습득함
초점 손실은 모델이 분류하기 어려운 샘플을 집중적으로 학습하도록 인센티브를 주는 아이디어에서 시작
예측이 맞을 확률이 낮을수록 샘풀 가중치가 커지도록 손실을 조정하는 방법

실무적으로는 앙상블이 클래스 불균형 문제에 가장 큰 효과를 보임
다만 앙상블은 클래스 불균형을 처리하기 위해 사용하는 것이 아니고 실무에 적용하기도 어려운 문제도 존재
4.4 데이터 증강
데이터 증강은 훈련 데이터 양을 늘리기 위해 사용하는 기법
원래 의료 데이터와 같이 필요한 데이터 양이 부족한 도메인에서 주로 사용되었지만 모델이 잡음(noise)와 적대적 공격(adversarial attack)에 강건해지도록 하는 이점이 있어 널리 사용됨
4.4.1 단순 레이블 보존 변환
단순 레이블 보존 변환은 레이블은 유지한 채로 데이터(특히 이미지)를 무작위로 수정하는 방법
‘개’라는 레이블은 유지한 채로 이미지에 자르기, 뒤집기, 회전, 반전, 마스킹 등의 변환을 거침
자연어 처리에서는 일부 단어를 유사한 단어로 무작위로 대체
대체 시 문장의 의미나 감정에는 변화가 없다고 가정하고 동의어 사전을 활용하거나 임베딩이 유사한 단어로 대체
이런 데이터 변환은 단순하게 훈련 데이터 양을 증가시킬 수 있는 손쉬운 방법
4.4.2 교란
교란은 데이터에 잡음을 추가하는 방식
교란 역시 레이블을 보존하지만 잡음 추가로 인해 모델을 속일 수 있음
일반적으로 신경망 모델은 noise에 민감
이미지에 잡음을 소량만 추가해도 신경망이 이미지를 잘못 분류할 수 있음
속임수가 있는 이미지를 사용해 모델이 잘못된 예측을 하도록 속이는 것을 적대적 공격(adversarial attack)이라고 함
훈련 데이터에 잡음을 추가하면 모델이 학습한 결정 경계에서 약점을 인식하고 성능 개선에 도움이 됨
잡음 샘플은 무작위로 추가하거나 탐색 전략을 통해 생성 가능
DeepFool과 같은 알고리즘은 높은 신뢰도로 오분류를 야기하는 최소 잡음 주입 정도를 찾아냄
이러한 증강을 적대적 증강이라고 함
적대적 증강은 NLP에서는 잘 사용되지 않는데 자연어 특성 상 임의의 단어가 들어오면 전혀 다른 의미가 되어버릴 수 있기 때문
4.4.3 데이터 합성
전통적인 데이터 수집은 느리고 비용이 크며 개인 정보 보호 문제가 있을 수 있으므로 데이터를 합성해서 사용할 수 있으면 이런 문제를 고민하지 않아도 됨
NLP 등에서는 탬플릿을 활용해 낮은 비용으로 모델을 bootstrap 가능
탬플릿은 ‘[위치]에서 [숫자]안에 있는 [종류] 음식점을 찾아줘’ 와 같은 형식으로 각 탬플릿에 합리적인 선택지만 배치한다면 단숨에 많은 양의 데이터 합성 가능
이미지에서도 믹스업과 같은 기법을 활용해 이미지를 합성하는 연구가 활발히 이루어지고 있음
믹스업은 모델의 일반화 성능을 개선하고 손상된 레이블에 대한 기억을 줄이며 적대적 샘플에 대한 강건함을 높임과 동시에 생성적 적대 신경망(GAN)의 학습을 안정화함
4.5 정리

Uploaded by N2T
'MLOps' 카테고리의 다른 글
머신러닝 시스템 설계 - Chapter 6. 모델 개발과 오프라인 평가 (0) | 2023.10.12 |
---|---|
머신러닝 시스템 설계 - Chapter 5. 피처 엔지니어링 (2) | 2023.10.10 |
머신러닝 시스템 설계 - Chapter 3. 데이터 엔지니어링 기초 (3) | 2023.08.15 |
머신러닝 시스템 설계 - Chapter 2. 머신러닝 시스템 설계 소개 (0) | 2023.08.06 |
머신러닝 시스템 설계 - Chapter 1. 머신러닝 시스템 개요 (3) | 2023.07.30 |