2020년 11월 30일 월요일

ML memo - 성능평가 등

Sampling


Train/Test split 

랜덤으로 몇퍼센트를 따로 test 로 뺌.

Test data 가 좋도록 여러번 시도하면 Test data에 과적합될 수 있음

그러므로 test data 는 마지막에 최종적으로 평가하는 용도로만 사용해야함.

보통 train/test = 6/4 로 잡음.

바로 아래의 validation set 도 고려할만큼 데이터가 많으면, train/val/test = 6/2/2 로 잡음.


Hold Out

train data set 을 train / validation 으로 또 나눔. 

train 으로 학습을 하고 validation 으로 임시로 평가함.

test set 이 따로 존재하므로 validation 을 보고 모델을 수정해도 과적합 우려가 적음.


K-Fold Cross-Validation

Hold Out 으로는 validation 이 랜덤으로 추출되어서 실제 사용될 때와 정확도의 분산이 큼.

이를 해결하기위해서 Monte Carlo Cross Validation 이라 불리는 이 샘플링이 생김.

이는 다음과 같음.

전체 데이터를 k 개로 나눔. ( K - fold. 보통 k = 10 )

나뉜 데이터 블럭 하나를 validation 로 나머진 train 으로 모델을 총 k 개를 만듬

총 k 개의 성능을 합쳐서 모델의 종합성적을 냄. 

최종적으론 전체 train data 를 사용해서 test data 에 대한 성능을 확인.


Leave one out Cross Validation (LOOCV)

오직 하나의 instance 만 빼서 test 를 진행하는 방식이라 최대한의 데이터를 사용하게됨.

Cross Validation 이므로 instance 의 갯수만큼 모델을 만들고 평가해야함.

아래에서 설명할 stratified 가 불가능함.

특징으로 Zero-R 에서 Label 의 비율이 1:1 의 경우 validation test 의 정확도가 0이 됨.


Stratified

train/test/validation 에서 label 의 비율은 랜덤으로 구성된 결과 train-set 과 다름.

data set 을 나눌 때 그래서 label 의 비율을 맞추는 것.

그러면 Cross-Val 등의 평가의 분산이 작아지는 효과를 얻음 = 신뢰도 상승


Bootstrap

통계에서 가진 데이터로부터 모집단의 분포를 알기위해 쓰인 기법. 

가진 데이터의 중복을 포함해 원래의 데이터의 크기만큼 뽑아 샘플을 만듬.

샘플을 n개를 만들어 그것의 성능과 성능의 분산을 구함.

그러면 현재 가진 데이터가 모집단과 같을 확률을 구할 수 있게 된다는게 아이디어.


샘플을 구성할 때 하나의 데이터가 안뽑힐 확률이 (1-1/n)^n 임.

n 이 무한대가 되면 이는 1/e 의 값과 같아지고 그 비중은 1-0.632 와 같음.

각 샘플당 test set 은 안뽑힌 0.368 로 하게 하는 것이 .632 bootstrap


Cross Validation 과 달리 중복을 허용한 샘플링인 것이 큰 특징.

그래서 Bootstrap 을 하면 n 개의 samples 가 원래 데이터보다 커지는 효과도 얻음.



Overfitting/Underfitting

모델 자체가 overfitting 에 연약할 가능성이 있음. - ex) MLP

혹은 training data 가 너무 작아서 noise 의 영향이 클 수도 있음


Overfitting

training data 가 많이 있고,

적절한 noise 를 넣고,

Feature Space 를 좀 줄이고,

Regularization - Model 의 weight 비중을 loss 함수에 추가,

Drop Out - 훈련 중에 중간의 node 를 랜덤으로 없앰



Performance Measure

Confusion Matrix

Accuracy = (TP + TN) / (TP + TN + FP + FN)

Precision = TP / (TP + FP)      => 맞다고 한거중에 진짜 맞는 비율

Sensitivity = TP / (TP + FN)    => 진짜 맞는 거중에 맞다고 한 비율, Recall 이라고도 함

Specificity = TN / (TN + FP)   => 진짜 아닌거 중에 아니다고 한 비율

Fall out = FP / (TN + FP) = 1 - Specificity   => 진짜 아닌걸 맞다고 한 비율


한쪽에 치중이 큰 경우 - ex) 99퍼가 F 의 경우 - Zero R 도 99퍼의 Accuracy 가 나옴.

이런 데이터에선 Precision 이나 Sensitivity 가 더욱 중요한 지표가 됨.


F1 Score = 2 * Precision*Sensitivity / (Precision + Sensitivity) ,  0<= F1 <= 1

F-Beta Score = b * Precision, (1-b) * Sensitivity 의 조화평균, b = 0.5 일 때 F1과 같음.

b 가 클수록 Precision 에 가중치가 커짐.


multi class = n 의 경우 confusion matrix 는 n x n 크기인데 이때 쓰이는 지표가 있다.

Kappa Statistic = (Diagon_real - Diagon_random) / ( 1 - Diagon_random )

위 지표는 우연히 맞은 것을 제외하고 측정을 하려는 시도이다.


multi class 에서 진짜 맞는 것에 대한 지표인 Sensitivity(Recall), Specificity 는 각 class 마다 재서 평균을 내고, model 이 참으로 판단한 것에 대한 지표는 그냥 쓴다.



Sensitivity-Precision 의 관계

Binary 에서 특히, 서로 상충되는 중요한 지표는 Precision/Sensitivity. 

F 가 FP 에 몰린건지 FN 에 몰린건지 파악가능하기 때문. 

Sensitivity 대신 Fall out = 1 - Sensitivity 를 사용하기도 함.



precision recall curve 는 오른쪽 위 점과 가까운 모델일수록 좋음


ROC Curve - x 축은 Fall out, y 축은 sensitivity 인데 왼쪽 위와 모델이 가까울수록 좋음.

AUC(Area under the Curve) - ROC Curve 의 면적으로 1일 때 제일 좋음. 

이는 Perceptron, MPL 등에서 Output function 의 threshold 를 변경하면서 조정이 가능함.

위의 cut off 가 threshold 를 말하는 것으로 이를 조정해서 우리가 원하는 모델을 만듬. 



Feature Space 평가

classifier 의 경우 model 별로 decision boundary 의 특징이 다름.

이를 고려하면서 여러 모델의 만들어진 decision boundary 을 평가함. 




List