Julie의 Tech 블로그

머신러닝 기초 - 분류, 모델 평가, 과적합에 대해 본문

Tech/ML, DL

머신러닝 기초 - 분류, 모델 평가, 과적합에 대해

Julie's tech 2021. 5. 13. 11:23
728x90

분류

머신러닝은 학습 타입에 따라 아래와 같이 구분해볼 수 있다.

- 지도학습 : 정답 데이터(target)가 있는 것. 대부분 분류와 회귀

추가로 시퀀스 생성, 구문 트리 예측, 물체 감지, 이미지 분할 등이 있음

- 비지도 학습 : input 데이터에 대한 변환을 찾아내는 것. 차원축소, 군집 등이 해당

- 자기 지도 학습 : label이 필요하지만, input 데이터로부터 생성. 사람이 개입되지 않는 지도 학습

- 강화 학습 : 보상을 최대화하는 행동을 선택하도록 학습하는 것. 대부분 게임에 집중되어있음


모델 평가

우리가 어느 도메인에서 머신러닝을 돌리더라도, 항상 '일반적인' 모델을 세우고자 노력한다.

'일반적'이라는 것은 어느 특정한 데이터 셋에 한정된 모델이 아니라는 것인데,

이를 위해 과적합 문제가 가장 해결해야할 1순위이다.

학습 데이터에 대해 과대/과소 적합이 발생할 수 있지만,

검증 데이터에 대해서도 학습하면서 하이퍼파라미터를 수정하는 과정에 '정보 누설'이 발생할 수 있다.

검증 데이터에 대해서도 과대적합될 수 있으니 유의해야한다.

hold-out validation 방법을 통해 그를 막을 수 있다.

데이터가 풍부할 경우 훈련 데이터 중 셔플링을 통해 일부를 홀드아웃 검증 셋으로 분리해두는 것이다.

테스트 데이터 셋도 따로 분리해둬 모델의 정확도를 확인해볼 수 있다.

하지만 데이터가 적을 때는 훈련/검증/테스트로 나누어 확인하기 어려우니,

몇 가지 기술들을 이용하여 보충해볼 수 있다.

일례로 앞서 살펴본 K-fold cross validation이 있다.

k-fold cross validation 방법은 데이터가 분할에 따라 편차가 클 때 사용하면 유리하다.

k-fold cross validation에도 셔플링을 사용하여 반복 교차검증을 진행하면, 더욱 정확하게 모델을 평가할 수 있다.


FE (Feature Engineering)

모든 input, label 데이터는 float형 텐서 타입이어야 한다.

따라서 '데이터 벡터화' 단계를 거쳐 텐서로 변환되어야만 한다.

예를 들어 시퀀스 데이터나 카테고리형 변수는 one-hot encoding 또는 정수 텐서로 바꿀 수 있다.

숫자형 데이터일 경우 정규화가 필요하다. 특히 이미지의 경우에도 0~255 사이의 정수를 0~1로 rescale해준다.

또한 지나친 outlier의 경우 제거하는 것이 좋다. 상위 0.1%에 해당하는 양끝단 데이터는 삭제하여도 좋다.

그리고 서로 상관관계가 높은 변수에 대해서는 제거하거나, 주성분 분석을 통해 feature수를 줄여줘도 좋다.


모델 학습과 과적합

최적화와 일반화는 굉장히 다른 용어이다.

우리는 학습할 때 훈련 데이터 내에서 최고의 성능을 발휘하기 위해 최적화 과정을 거치나,

어떠한 외부 input 데이터에 대해서도 일관적인 성능을 내기 위해 일반화된 모델일 수록 좋다.

우리는 일반화에 대해서 control할 수 없지만, 최적화와 관련하여 이야기를 좀 더 해볼 수 있다.

훈련 데이터의 손실이 낮아질수록 테스트 데이터의 손실이 낮아지는 상태를 '과소적합'이라고 한다.

모델이 더 발전할 여지가 있으며, 반복된 학습을 거친 후 성능이 최고점을 찍다,

검증셋에서 다시 성능이 하락할 때, 우리는 '과대적합'이라고 부른다.

과대적합 때 우리가 취할 수 있는 방법들을 살펴보자.

우선 가장 단순하게 네트워크의 복잡도를 낮추는 방향이 있다.

하이퍼파라미터 수와 모델의 depth를 줄이는 것이다.

적합한 크기를 맞추는 것은 validation set에서 여러 번 테스트해보는 수 밖에 없다.

다음으로 가중치 Regulation을 할 수 있다.

- L1 규제 : 가중치의 절대값에 비례하는 비용이 든다

- L2 규제 : 가중치의 제곱에 비례하는 비용이 든다

위와 같은 페널티를 두어 훈련 시에 과적합 문제를 피하는 것이다.

model.add(layers.Dense(16, kernel_regularizer = regularizers.l2(0.001))

마지막으로 가장 잘 알려진 drop out 방법이 있다.

랜덤하게 일부 output을 제외하여 다음 input으로 넘기는 것이다.

이 때 일반적으로 테스트 시에는 drop out 비율에 맞추어 output을 줄여주게 된다.

model.add(layers.Dropout(0.5) // 일반적으로 0.2 ~ 0.5


참고자료

https://book.naver.com/bookdb/book_detail.nhn?bid=14069088

 

반응형