당신이 만든 머신러닝 모델 괜찮은지 성능을 알고 싶나? 1편

2019. 9. 4. 16:10Data Science

Regression vs Classification에 대해서 잠깐 언급하고 가겠습니다.

Regression은 예상 수치값을 알려주고 실제값과 얼마나 차이가 나느냐로 이야기 될수 있겠네요.

Classification은 예상 상태를 알려주고 실제상태와 같냐 다르냐로 이야기 할수 있겠구요.

 

네. 한문장으로 보면 이러한 차이가 있습니다.

 

이제 우리가 Model을 만들었다고 했을때 Model이 좋다고 어떻게 표현 할수 있을까요?

이건 중요한 부분이 되겠네요.

 

아마도 의미있게 Model을 돌려보고 그 결과값을 평가할 겁니다.

 

하지만 학습시킨 Data만을 가지고 볼수는 없을겁니다. 

 

예를 들면 아래와 같이

 

 

Data를 Regression한 2개의 예시입니다.

첫번째 그림과 두번째 그림.. 어떤 쪽이 더 값을 정확하게 예측할수 있을까요?

언듯 보기에는 2번째 그림이 모든 Data를 오차 없이 정확하게 나타내고 있는 것으로 보이나,  사실은 그렇지 않습니다.

 

아래와 같이 새로운 Data에 대해서 Regression 결과를 다시 평가해봅시다.

 

 

빨간색의 새로운 Data에 대해선 어떤가요? 오히려 왼쪽의 Regression 결과가 오차가 더 적은 것을 볼수있습니다.

 

오른쪽 모델이 모든 Data를 완전히 맞추었지만 왼쪽 결과에 비해 Generalize한 모델을 만들어내지 못했기 때문에 이러한 결과가 나오게 된 것이지요. 

결국 그냥 학습에 사용된 Data를 기억한 것이지 일반화해서 다른데 써먹을수있는 모델을 만들어내진 못한 것입니다.

이런 현상을 over fitting 이라고 합니다.

 

그렇다면 화제를 바꿔서 어떻게 하면 Generalize를 잘할수 있을까요

 

위와 같이 Data를 Training set가 Test set으로 나누고, Training set으로는 모델 생성을 위한 학습에 사용.

Test Set으로만 Error를 평가하는 거죠.

그럼 Test Set으로 Error를 확인해보고 작을수록 Generalize가 잘된 것이겠지요.

 

Regression으로만 예를 들었는데 Classification도 마찬가지입니다.

 

위와 같이 나눠진 Test Set으로 봤을때 왼쪽 그래프는 상단쪽에 1개의 오분류가 있는 반면

오른쪽 그래프는 상단에 1개 하단에 1개 총 2개의 오분류가 있네요.

 

그 결과 왼쪽 모델이 실수가 적었으니 더 좋다라고 결론 지을수 있겠습니다.

 

자. 그럼 이제 sklearn을 이용해서 실제로 어떻게 할수 있을까요?

 

일단은 계속 언급했다시피 Train과 Test Data를 Split 즉 나눠줘야 합니다.

 

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25)

위에 그 예시를 적어봤습니다.

train_test_split 함수를 사용한건데요. test_size 인수는 얼마만큼 퍼센트의 test set을 추출할거냐? 이겁니다.

0.25 즉 25퍼센트만큼 따로 꿍쳐뒀다가 평가에 쓰는거죠.

 

16개의 Data가 있다고 가정하면 4개의 test data를 따로 빼놓고 8개만 Training에 쓰겠다는 이야기입니다.

 

 

 

 

 

여기서 많은 분들이 헛갈리실 하지만 조심해야될 부분중 하나는..

 

절대절대 절대 절대절대로.!!!1

 

Test data는 Training에 사용하지 말아야 한다는 것입니다.

 

Training 된 Data로 Test하면 결과가 어떻게 나올까요?..

 

공부한 문제가 그대로 나왔다고 생각해봅시다.. 당연히 시험점수 뻥튀기 되겠죠?..

 

잘못된 평가결과는 업무간 잘못된 기대와 오해를 낳게되니.. 주의 하시기 바랍니다.