brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Jul 17. 2017

내가 만든 모델이 잘 작동하는건가?

Bias(편향)와 Variance(분산) - 피해갈 수 없는 기본기

머신러닝으로 모델을 만드는 일은 이제 쉬워졌습니다. 예제도 많고 강의도 많습니다.


머신러닝에 대해서 많이 모르시는 분들도, 많이들 알고 계시는 개념은 바로 오버피팅(Overfitting)이 아닐까 생각합니다. 그리고, 언더피팅(Underfitting)도 많이 들어보셨을거에요. 오늘은 바로 모델의 에러에 대해서 말해보고자 합니다.


그래서 원하는 모델을 만들어냈다고 해봅시다. 그럼 이제 우리가 당면하는 문제가 있습니다. 내가 모델을 잘 만든게 맞나? 그래서 내가 만든게 무엇인거지? 잘 동작하고 있는건가? 이런 생각이 드는게 자연스럽죠. 


내가 모델을 잘 만들어낸 것인가? 이를 알기 위해서는 모델 성능 측정의 기준이 필요합니다. 피터 드러커가 항상 주창했던 것 처럼 측정할 수 없으면 더 이상의 발전은 가능하지 않습니다. 내가 만든 모델이 얼마나 잘 동작하는지 이해하기 위해서 알아야 할 에러에 대한 이야기를 해보고자 합니다.


머신러닝 모델의 에러는 두가지로 분류할 수 있습니다. 바로 편향(Bias)과 분산(Variance) 입니다. 그리고 이 두가지 개념은 서로 다르게 움직입니다. 종종 Bias를 해결하면 Variance가 올라가고, Variance를 해결하면 Bias가 올라갑니다. 이 현상을 바로 "Bias - Variance Tradeoff"(편향-분산 트레이드오프)라고 합니다. 


Bias

Bias란 학습데이터를 충분히 표현할 수 없기 때문에 발생합니다. 

높은 Bias를 보이는 모델은 underfitting이 된 상태입니다.


Variance

Variance란 트레이닝 데이터에 너무 민감하게 반응하여 발생합니다. 

높은 Variance를 띄는 모델은 overfitting이 된 상태를 말합니다.


Bias는 충분한 데이터가 있지만, 데이터 안에 있는 데이터 간의 상관관계를 충분히 풀어내지 못할 때 발생합니다. 결과적으로 모델은 지속적으로 데이터를 잘못 표현하게 됩니다. 그리고 예측값의 낮은 정답률로 이어집니다. 이를 우리는 underfitting 이라고 부릅니다.


Bias 예시

색상과 모양으로 사물을 구분하는 모델이 있다고 합시다. 

만약에 색상 만으로 물체를 구분하는 머신러닝 모델을 만들어야 한다고 칩시다. 우리가 만약 색상만을 Feature로 모델을 만들었다면, 모델은 오렌지와 레몬을 구분하기 힘들 것입니다.




Variance  인한 에러


우리가 모델을 학습시킬 때, 우리는 일반적으로 전체 데이터의 일부를 가지고 트레이닝을 시키게 됩니다. 우리가 만약 데이터셋에서 랜덤으로 일부 데이터를 추출하여 모델을 트레이닝 시켰다고 합시다. 당연히 이 모델에 새로운 테스트 데이터를 입력한다면 실제 결과값과는 차이가 생길 수 있다는 것을 알수 있습니다.


Variance를 낮추기 위해 우리는 더 많은 학습 데이터를 입력시킬 수 있고, 혹은 모델의 복잡도를 낮추어 Variance를 제한할 수 있습니다. 


그럼 어떻게 해야 적합한 모델을 찾을수 있을까?


Sklearn 사이트의 튜토리얼 중에서 Overfitting vs Underfitting 이라는 주제로 만들어진 예시가 있습니다.

제가 Notebook 에 옮겨적어보았습니다.

https://notebooks.azure.com/hoyean-song/libraries/sklearn

Overfitting vs Underfitting 이라는 이름의 노트북입니다. 프로젝트를 돌려보면 아래와 같은 plot 이 그려집니다.


Underfitting과 Overfitting을 한번에 보여주는 예시



위 그림에서 볼 수 있듯이, 왼쪽은 bias가 높은 Underfitting 현상을 보여주는 예시입니다. 그리고 오른쪽은 트레이닝 데이터를 잘 맞추가는 하지만, 학습 데이터에 너무 예민하게 최적화하여 Overfitting이 발생한 예시입니다.


첫번째 모델은 높은 bias를 가진 모델입니다. 이러한 모델은 학습 데이터를 아무리 많이 넣어도 에러가 크게 줄어들지 않습니다. 그리고, 우측의 모델은 높은 variance를 가진 모델입니다. 


Andrew Ng 교수님이 Coursera에서 bias와 variance를 설명하시면서 그리셨던 그림을 이해를 돕기 위해 보여드리겠습니다.


Andrew Ng 교수님의 강의 중 일부


모델이 복잡해질 수록, training error는 계속 감소하지만, cross validation error는 급격하게 상승합니다. 이렇게 cross validation이 training error 보다 너무 높아지는 경우를 variance가 높다고 합니다. 그렇다면, 우리가 구해야 할 모델은 저 그림에서 cross validation error 가 가장 낮아지는 구간이라고 할 수 있습니다.


또 하나의 예시를 드리겠습니다. 같은 문제라도 푸는 모델에 따라 성능이 달라지게 됩니다. 이 역시 sklearn의 예제 코드로 설명을 드리겠습니다.


http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html

이 예제는 GaussianNB와 SVM라는 두가지 모델로 학습을 돌려보는 코드입니다. 

Gaussian Naive Bayes로 학습시킨 모델의 Learning Curve



그리고 또 하나의 모델 SVM로 학습을 돌려보았을 때는 아래와 같이 Learning Curve가 나타납니다.


SVM으로 학습시킨 모델의 Learning Curve

위 두가지 예제에서, SVM이 훨씬 좋은 성능을 보이고 있습니다. 


잠시 위 그래프를 설명 드리자면, 

Training Score: 트레이닝 스코어는 학습데이터로 모델을 테스트했을때의 점수입니다. 당연히 Training Score는 트레이닝을 여러번 시킬수록 좋아집니다. 


Cross Validation Score: 이 Cross Validation Score는 바로 학습시킨 모델에 아예 새로운 테스트 데이터를 넣어 성능을 측정하여 매긴 점수입니다. 우리가 머신러닝 예제를 열어보면 항상 trainX, testX, trainY, testY가 나뉘어있는 것을 볼 수 있는데, 바로 이 cross validation score를 측정하기 위해서 데이터셋을 나누는 것입니다.


자 위 두가지 그림을 보시면, Gaussian Naive Bayes로 만든 모델은 높은 bias 문제를 겪고 있다고 볼 수 있습니다. 모델이 이 문제를 해결하기에 적합하지 않다는 거죠. 반면, SVM(서포트 벡터 머신)은 이 문제를 훌륭하게 풀어냅니다. 


Bias와 Variance에 대한 내용을 다루어보았습니다. 


저는 머리보다 손이 먼저 움직이는 성격이라, 뭔가를 빨리 만들어내는 걸 좋아합니다. 이론보다는 실전을 좋아하지만.. Bias(편향)와 Variance(분산)는 무시할 수 없는 기본기입니다. 여러분도 꼭 익히셔서 본인이 만들어내신 모델을 더 좋게 만드시도록 도움이 되었으면 좋겠습니다 :)


아참, 이 글은 제가 요즘 참여하고 있는 스터디그룹에서 숙제로 모델을 만드신 분들이, 앞으로 모델을 발전시키는데 도움을 드리고자 작성하기 시작했습니다. 판교에서 화요일 저녁 7:30에 스터디를 하고 있어요- 매주 숙제를 제출하신 분들만 참여가 가능하니, 공부하시고자 하시는 분들은 관심 부탁드려요 ㅎㅎ


[3주차 숙제 공지 링크]

[상급] LSTM 혹은 어느 알고리즘이든 비트코인 시계열 예측 구현하기

[중급] Tensorflow 유닛테스트 하나 작성해보기

[초급] Tensorflow Linear Regression 튜토리얼 따라하기

[숙제 제출] - 월요일 자정까지


[스터디 그룹 페이스북 그룹 링크]


References

1. Andrew Ng 교수님의 Machine Learning Coursera 강의

https://www.youtube.com/watch?v=fDQkUN9yw44

2. scikit-learn : Plotting Learning Curves

http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html

3. scikit-learn : Underfitting vs Overfitting

http://scikit-learn.org/stable/auto_examples/model_selection/plot_underfitting_overfitting.html

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari