1. 데이터 준비
클래스 불균형 (class imbalance)
클래스가 불균형하게 분포되어 있는 것을 의미한다. 주로 특이한 경우(은행 거래 사기, 희귀 질병, 기계 불량음 등)가 포함된 데이터에서 볼 수 있으며, 이러한 문제들을 이상 탐지(anomaly detection)라고 부른다. 불균형 문제는 모델 학습에 매우 부정적인 영향을 기친다.
과소표집/과대표집 (Under/Over sampling)
과소표집은 다른 클래스에 비해 상대적으로 많이 나타나 있는 클래스의 개수를 줄이는 것. 이를 통해 균형은 유지할 수 있지만, 유용한 정보가 제거될 수 있다.
과대표집은 데이터를 복제하는 것. 무작위로 하거나, 기준을 정해서 복제한다. 정보를 잃지 않기 때문에 학습용 데이터에서 높은 성능을 보이지만 실험용 데이터에서의 성능이 낮아질 수 있다. 이를 피하기 위한 대표적인 방법으로 SMOTE 방법을 사용할 수 있다. 간단히 설명하자면, 데이터의 개수가 적은 클래스의 표본을 가져온 뒤 임의의 값을 추가하여 새로운 표본을 만들고 이를 데이터에 추가하는 것이다. 이 과정에서 각 표본은 주변 데이터를 고려하기 때문에 과대적합의 가능성이 작아지게 만든다.
회귀/분류 (regression/classification)
회귀는 하나 또는 여러 개의 특징(독립변수)을 통해 연속적인 숫자로 이루어진 정답(종속변수)을 예측하는 것. 주식 가격, 예상 판매량 등을 예측하는 것이 이에 해당한다.
분류는 데이터셋에서 미리 정의된 여러 클래스 중 하나를 예측하는 것. 정답은 연속적인 정답이 아닌 하나의 클래스에 속하는 것이어야 한다. 물품 종류, 숫자 판별, 얼굴인식 등을 구분하는 것이 이에 해당한다.
원핫 인코딩 (one-hot encoding)
원핫 인코딩은 하나의 클래스만 1이고 나머지 클래스는 전부 0인 인코딩을 의미한다. 범주형 데이터로 되어 있는 경우에 주로 사용한다. 자연어 처리(nlp) 분야에서 많이 언급되는 용어지만, 그 외에도 자주 사용된다.
교차 검증
교차검증은 모델의 타당성을 검증하는 방법이다. 데이터를 모두 사용하여 모델을 학습시킬 경우 해당 데이터에 대해서는 매우 좋은 성능을 보여주지만, 새로운 데이터에 대해서는 좋은 성능을 보이지 못한다. 대부분의 경우에서 모델이 과대적합되었기 때문이다. 교차검증은 이를 미리 방지하고자 하는 것이다. 데이터를 크게 세 가지로 나누어서 사용한다.
- 학습 데이터(train data) : 모델 학습에 사용
- 검증 데이터(validation data): 모델의 검증을 위해 사용. 주로 학습 도중 새로운 데이터에 대한 모델의 성능을 평가하기 위해 사용. 새로운 데이터에 대한 성능을 보고, 이를 통해 데이터와 모델을 어떻게 재구성할지 판단하게 된다.
- 테스트 데이터(test data): 모델의 최종 성능을 평가하는 데 사용. 최종 평가 이전에는 절대로 사용하면 안된다. 그렇기 때문에 검증 데이터를 통해 테스트 데이터에서의 결과를 가늠해보아야 한다.
교차검증은 대표적으로 홀드아웃 검증 기법과 k-폴드 교차검증 기법이 있다.
ㆍ홀드아웃 검증
학습 및 검증 데이터를 사용하여 모델을 학습하고 검증하고, 다시 반복한다. 그리고 최종적으로 테스트 데이터를 통해 결과를 도출해낸다.
이 기법은 데이터를 분리하는 과정에서 최종 선능에 많은 영향을 끼칠 수 있다. 운좋게도 데이터가 매우 잘 나누어져서 성능이 좋을 수 있지만, 그렇지 않을 수도 있기 때문이다. 또한, 데이터가 매우 적은 경우에는 2등분 하기 때문에 학습 데이터의 개수가 줄어들게 되면서 모델이 과소적합되는 경우가 있다. k-폴드 교차검증은 이러한 문제점들을 해결할 수 있다.
ㆍk-폴드 교차검증
데이터셋을 K개의 그룹으로 나눈 후에, 하나의 그룹은 검증 데이터로 사용하고 나머지 모든 그룹을 학습 데이터로 사용한다. 여기서 K는 주로 [3~10]의 범위값을 사용한다.
먼저 데이터를 학습 데이터셋과 테스트 데이터셋으로 나눈다. 테스트 데이터는 최종 성능 평가 전에는 절대 사용하지 않는다. 다시 학습 데이터를 각 폴드마다 학습 데이터와 검증 데이터로 나누고, 모델을 학습시킨 뒤 저장한다. 마지막으로 전에 나누어 두었던 테스트 데이터를 가져와서 폴드마다 저장된 모델을 통해 결과를 도출하고, 해당 결과를 평균 내어 최종 성능을 평가한다.
2. 학습하기
하이퍼파라미터(hyperparameter)
학습률, 배치 크기, 에폭, 드롭아웃률 등을 포함하는 개념이다. 모델과 데이터에 어떠한 값이 적절한지 모르기 때문에, 주로 경험에 의해 결정되는 요소를 의미한다. 최적의 값을 찾기 위해 반복적인 노력이 필요한데, 이를 하이퍼파라미터 튜닝이라고도 한다. 대표적인 방법으로는 그리드 서치, 랜덤 서치 등이 있다.
배치와 배치 크기
모델을 학습시킬 떄는 주로 데이터 한 개만 사용하거나, 전체 데이터를 사용한다. 하지만 데이터 한 개만을 사용할 때는 정답을 찾기까지 너무 헤맬 수 있고, 데이터 전체를 사용하면 속도가 매우 느리다는 단점이 있다. 이를 해결하기 위해 배치 학습을 사용한다.
예를 들어, 1000개의 데이터가 있을 때 배치를 10으로 한다는 것은 배치 당 데이터를 100개를 의미한다. 이때 배치 크기는 100이다.
배치 크기는 주로 2의 제곱수를 사용한다. 다양한 배치 크기를 사용하여 실험을 진행하고, 제일 성능이 좋은 배치 크기를 사용하도록 한다.
에폭과 스텝(Epochs/steps)
에폭은 전체 데이터를 사용하여 학습하는 횟수를 의미.
스텝은 모델이 가진 파라미터(또는 가중치)를 1회 업데이트하는 것을 의미.
예를 들러, 전체 데이터가 1,000개이고 배치 크기가 10이라고 가정해보자. 이때, 10 epochs은 데이터를 1,000 * 10번 사용하게 되는 것이다. 이를 스텝으로 변환하면 1000스텝(전체 데이터 사용 수/배치 크기)이 된다.
과대적합과 과소적합(overfitting/underfitting)
과대적합은 모델이 학습 데이터에서는 좋은 성능을 보이지만 새로운 데이터에 대해서는 좋은 성능을 보이지 못하는 결과를 의미한다. 이때 모델은 학습 데이터를 단순히 외웠다고 표현할 수 있으며, 모델이 문제를 일반화하지 못한 상태이다. 이러한 문제가 일어나는 이유는 모델이 너무 복잡하기 때문이다. 해결 방법은 다음과 같다.
ㆍ학습 데이터를 다양하게, 많이 수집한다.
ㆍ정규화를 사용한다. → 위와 같이 규칙을 단순화시켜 준다.
ㆍ이상치를 제거한다.
과소적합은 모델이 학습 데이터를 충분히 학습하지 않아 모든 측면에서 성능이 나쁘다는 것을 의미한다. 모델이 너무 단순한 경우에 발생한다. 단순하다는 것은 많은 데이터를 보지 못했기 때문에 새로운 데이터를 구분할 적절한 규칙을 찾지 못했다는 의미이다. 해결 방법은 다음과 같다.
ㆍ학습 데이터를 다양하게, 많이 수집한다.
ㆍ더 복잡한 모델을 사용한다.
ㆍ모델을 충분히 학습시킨다.
모델을 학습시키는 도중에 모델의 성능이 좋지 않은 문제는 어쩌면 데이터의 문제일지도 모른다.
3. 평가하기
혼동행렬(confusion matrix)
성능 평가에 사용되는 지표로, 주로 알고리즘이나 모델의 성능을 평가할 때 많이 사용한다.
ㆍAccuracy: 정확도
ㆍPrecision: 정밀도
ㆍRecall: 재현율(=민감도)
ㆍF1-score: 정밀도와 재현율의 임계치를 잘못 설정하면 극단적인 경우로 향할 수도 있다. 이를 방지하기 위해 사용한다.
재현율과 정밀도의 중요성이 같다고 가정하고, 두 지표의 조화평균으로 만든 지표이다. 다만, 이 수치가 높다고 해서 꼭 올바른 것만은 아니다.
ㆍ특이도: False라고 예측한 정답 중에서 실제로 False인 비율. TN / FP+TN
ROC 곡선(roc curve)
trade-off 관계에 있는 재현율(민감도)(=TPR)와 특이도(FPR) 지표의 변화를 보기 위해서 그래프로 나타낸 것이다.
곡선에서는 곡선이 왼쪽 위에 가까울수록 좋다. 수치적으로는 TPR=1, FPR=0이다.
성능 비교를 위해 AUC(area under the curve)를 사용하는데, 이는 곡선 아래 면적을 의미한다. AUC가 클수록 좋다. 빨간 점선 모델은 AUC가 0.5임을 의미하고, 최악인 '찍는 모델'이라고 표현할 수 있다.
ROC 곡선 구현: https://github.com/yeonjaee/TIL/blob/master/%EB%94%A5%EB%9F%AC%EB%8B%9D/ROC%20curve.md