IT/AI\ML

머신러닝 정밀도의 향상을 위해 해야할 것

개발자 두더지 2020. 5. 24. 21:14
728x90

 어떤 예측모델에서 큰 오차가 발생한 우 다음에 무엇을하면 좋을까?

 자주하는 방법이 '정밀도가 나오지 않는 것은 트레이닝 데이터 부족하기 때문이다!'라고 생각하고 갑자기 데이터를 모으는 것이다. 이 방법은 쓸데 없는 노력으로 끝나는 경우가 많으므로 반드시 좋은 방법이라고 할 수 없다. 그래도 '해 볼 수 밖에 없다'라고 생각할지도 모르겠지만, 그 방법을 하기 전에 아래의 항목을 통해 다른 방법을 꾀할 수도 있다.

[정밀도 향상 대책 후보]

1. 훈련 데이터를 더욱 수집한다.
2. 특징량(Feature) n을 감소시킨다.
3. 특징량(Feature) n을 증가시킨다.
4. 고차원의 특징을 추가한다. (x21,x22,x1x2,)
5. 정규화 계수 λ를 작게한다.
6. 정규화 계수 λ를 크게한다.

※ 학습률 α에 문제가 있는 경우도 있지만, 그것은 모델의 문제가 아닌 수렴 속도의 문제로, 어느 쪽인가하면 분석적인 문제이며, 대부분의 경우 최소화 라이브러리가 해결해주는 문제이므로 여기서는 생략한다.

 이것들은 대책으로써 모두 올바르지만, 어떤 것이 현재 문제에 적합한 대책인지 바로 알기는 어렵다. 여기서 직감으로 'xx를 해보자'라고 하면 절대 안된다고 Ng교수는 말했다. 그러면 시강 낭비가 될 수 있다.

 그러므로 판단해야한다. 판단도 물론 시간이 걸리는 일이지만, 이것은 시간 낭비가 아니다.


1. 판단 - 테스트

 판단하기 전에, 먼저 그 모델이 바르게 예측을 하고 있는지 판단하기 위한 테스트 방법이 필요하다.

 테스트란 미지의 값을 예측하는 것이 아닌, 이미 결과를 알고 있는 데이터를 모델에 적용해보아 그 예측값과 실제의 값의 오차의 비율을 통해, 그 모델의 우수성, 정밀도 등을 평가하는 것을 말한다.

 이미 결과를 알고 있는 데이터란 다른 것이 아닌, 학습 데이터 세트이다. 지금까지는 훈련 데이터를 모두 사용하여 모델을 구축해보았지만, 먼저 그 훈련 데이터의 30%정보를 테스트 데이터로써 빼둔다.

 그러나, 랜덤으로 나눌 필요가 있다. 이미 랜덤인 데이터세트가 있다면 위에서부터 70%를 훈련데이터로 사용하고, 남은 30%를 테스트 데이터로 사용하는 것도 좋지만, 어떠한 조건으로 정렬된 데이터의 경우는 셔플 후 7:3으로 나눈 것이 좋다.

 그리고 70%의 훈련 데이터 세트(이하, 이것을 훈련 데이터라고 부른다.)로 비용함수를 만든다.

1) 선형회귀의 경우

① 훈련 데이터로 비용함수를 만든다.

② 그 비용을 최소하 하기 위한 θ를 구한다.

③ 그 θ를 테스트 데이터에 적용하여 비용 함수에 대입하여 오차를 구한다.

이 값이 작으면 예측 정밀도가 우수하고, 이것이 큰 경우 그렇지 않다는 의미이다.

2) 로지스틱 회귀의 경우

 로지스틱회귀의 경우도 순서와 거의 같으나, 미리 오차 함수를 정의해두고 그것을 평가한다.

오차함수

 식을 보았을 때 어려워 보일 수 있으나 자세히 보면 간단하다. 요점은 가설함수가 0.5이상인 y=1을 예측하지만, 실제로는 y=0인 경우에 에러 (=1)로써, 동일하게 가설함수가 0.5미만인 경우 y = 0을 예측해야 하는데 실제로 y =1이 된 경우에도 에러 (=1)로써 처리하고 그 외에는 비(非)에러(=0)으로 표기할 뿐이다.

① 훈련 데이터로 비용함수를 만든다.

② 그 비용을 최소하 하기 위한 θ를 구한다.

③ 그 θ를 테스트 데이터에 적용하여 비용 함수에 대입하여 오차를 구한다.

 우선 여기까지, 만든 모델의 정밀도를 평가하는 방법을 배웠다. 


2. 모델 선택의 문제

 다음은, 특징률가 어느정도 있다면 최적인지 아닌지 판단하는 것부터, 판단의 순서를 살펴보자. 예를 들어 아래와 같이 1차부터 10차까지의 다항식으로 모델을 검토했다고 하자.

 이 경우, 각 식에서 그 비용을 최소로 하는 θ를 계산한다. 지금, 다음 차수에 대응하는 θ에 위에 첨자를 붙여 아래와 같이 표현하고 있다. 이것은d=2일경우의예이다.

 그러다 어느 θ가 비용을 최소로하는지를 테스트 데이터를 사용하여 조사해 본 결과, d=4인 경우, 즉 아래와 같이 표시와 같이 표현할 수 있다.

 이것으로 차수는 4를 하는 것이 좋다고 결론을 낼 수 있지만, 이것은 조금 문제가 있다.

 최후의 차수를 최적화하는 것으로 테스트 데이터에 대해서 최적의 차수를 결정하고 있으므로, 이것을 미지의 데이터(;학습에 사용되지 않는 새로운 데이터)에 대해서 잘 핏(fit)이 될지는 의문이다. 이미 테스트 데이터에 핏(fit)된 것을 선택해버리고 말았기 때문이다.

 

1) 교차 검증

 여기서 교차검증이라는 것을 실시한다. 아까는 최기에 전달된 데이터 세트 중에 70%를 훈련데이터, 30%를 테스트 데이터로 하였지만, 이번에는 60%를 훈련 데이터, 20%를 교차검증(이하, cv)용의 데이터, 20%테스트 데이터로 한다.

 위와 같이 나눈 뒤에, 앞서 말한 것과 같은 모델 선택의 문제에 있어서

① 훈련 데이터로 θ를 결정

② cv데이터로 그 θ를 이용하여, 비용 (또는 오차)가 최소가 되는 모델을 선택

③ 테스트 데이터로, 선택한 모델 및 θ를 이용해 정밀도를 확인

이러한 흐름으로 실시된다. 이것으로 페어인 테스트 및 진단이 가능하다.

 

2) High bias / High variance 진단

 최후에 그 오차가 어디에서 유래되었는가를 생각해보자. 아까전에 봤던 다항식의 차수를 이용해보자 다항식의 차수라는 것은 특징량(feature) n의 많음이라고 말할 수 있다. 이전에 봤듯이, 차수가 낮으면 언더 핏되어버리고, 차수가 높으면 오버 핏되어버린다.

 왼쪽과 같이 차수가 낮으면 언더 핏된다. 이것을 High bias의 상황이라고 말한다. 또한 오른쪽과 같이 차수가 너무 높으면 오버 핏된다. 이것을 High variance의 상황이라고 말한다.

 그럼 여기서, 학습 데이터의 비용함수와 교차검증(혹은 테스트)데이터의 비용 함수의 차수를 변화시켜보자. 

 결로부터 말하면 위와 같은 형태가 된다. 왜 이러한 형태가 될까?

 차수가 낮은 경우, 이 그래프의 좌측을 가르키는데, 이 경우는 조각나지 않은 데이터에 있어서 제대로 핏되지 않고, 학습 데이터에 있어서도 높은 오차가 있어, 당연히 cv데이터에 있어서도 높은 오차가 발생되는 언더 핏의 상황이 된다.

 그리고 차수가 높아질수록 학습데이터와 cv 데이터는 함께 오차가 낮아지고, 보다 좋은 모델에 근접해가는 것처럼 볼 수 있다.

 그러나 더욱 높은 차원일수록, 학습 데이터에는 점차 핏되어가지만, 역으로 트레이닝 데이터만 과도하게 핏되어버리는 상황이 되어, cv 데이터의 쪽은 점점 오차가 커져간다. 이것이 오버핏 학습이다.

 이러한 것을 봤을 때, 언더 피팅되고 있을 때는 특징량 n을 증가시키는 방향을 검토하는 것이 좋고, 또한 오버 피팅되고 있을 때는 특징량 n을 감소시키는 방향을 검토하는 것이 좋다는 것을 알 수 있다.

(사실은 특징량을 감소하는 것보다, 후에 설명할 정규화를 크게 하는 것이 경험상 좋았다고 Ng교수가 말했다.)

 지금까지 차원에 대해 어떻게 생각하고 어떻게 결정해야할지를 보았지만, 다른 파라미터에 있어서도 마찬가지이다. 예를 들어 정규화 계수인  λ에 있어서도 그래프를 그려보면 아래와 같이 된다.

 λ는 오버피팅을 조정하기 위한 계수였다. λ가 0이 되는 것은 정규화를 전혀 하지 않은 것과 같과 같기 때문에, 오버피팅에 대해 조정을 하지 않는 것과 동일하므로, 학습 데이터에 너무 핏되어 있어, cv 데이터에는 오차가 크다고 할 수 있는 위 그래프의 왼쪽의 상황이 된다.

 또한, λ를 과도하게 크게 하면, 높은 차원의 항에 큰 패널티를 부과하는 것이므로, 결과적으로 고차원의 항목에 대해서는 무시하는 것과 동일하게 되어, 저차원의 함수로 모델을 만드는 것과 동일하므로 언더 피팅의 상황처럼 되어 위 그래프의 오른쪽과 같은 상황이 된다.

 

 3) 훈련 데이터의 수에 대해서

 이와 같이 조정가능한 파라미터에 대해서의 비용 함수의 변화를 그래프로 작성한 것을 '학습 곡선'이라고 말한다. 이것을 보는 것으로, 이후의 방침을 세우는 것이 가능한다. 최후에는 학습 데이터 수를 가로축으로 한 학습 곡선을 살펴보자.

high bias의 경우 학습 곡선

 이것은 High bias 때의 전형적인 학습곡선이다. 언디 피팅의 경우는 데이터수가 증가해도 그래프가 그렇게 변화하는 자유도는 없지만, 오차가 잘 좁혀지지 않는다. 이때 결과적으로 데이터 수를 증가시켜도 일정 이상은 학습 데이터, cv 데이터 모두 개선방안이 보이지 않는다. 이런 상황에서 오차가 있을 때는, 데이터를 조금 더 모아도 헛수고로 끝나는 경우이다.

 반복하는 것이 돼버렸지만, 학습 데이터의 오차와, cv 데이터의 오차의 차이가 작아지는 한편, 오차 자체는 크게 되는 상황에서는 언더 피팅된 경우이므로 주의하라.

high variance의 경우 학습 곡선

 위 그래프는 High varicance의 경우의 학습 곡선이다. 이 경우, 트레이닝 데이터의 오차와 cv의 오차의 차이가 큰 것이 특징이다. 이 상황에서는 학습 데이터를 증가시키는 대책도 일정한 효과를 준다. 


3. 정리

 먼저 그 오차가 어디서부터 기인된 것인지 판단한다. 여러 파라미터로 학습 곡선을 그리는 것은, 손이 가는 작업이지만, 헛수고로 끝나지 않는다. 반드시 무언가를 얻을 수 있으므로 Ng교수도 강력하게 추천하는 방법이다. 그리고 High variance인가, High Bias인가를 보았다. 이에 내용은, 다음의 표로 정리할 수 있다.

  High Variance High bias
학습 데이터를 더욱 모은다. o x
특징량(Feature) n을 감소시킨다. o x
특징량(Feature) n을 증가시킨다. x o
고차원의 특징을 추가한다. (x21,x22,x1x2,) x o
정규화 계수 λ를 작게한다. x o
정규화 계수 λ를 크게한다. o x

참고자료

https://qiita.com/junichiro/items/7e2842c7afba2407c49b

 

 

 
728x90