매번 헷갈리는 건데 이제는 좀 외우자
Sensitivity: 실제 (+) 중 (+)로 예측한 비율
Specificity: 실제 (-) 중 (-)로 예측한 비율
TPR (True Positive Rate): Sensitivity (실제 + 중에서 +로 예측된 것의 비율)
FPR (False Positive Rate): 1 - Specificity (실제 - 중에서 +로 예측된 것의 비율)
Precision: (+)로 예측한 것 중 실제 (+)인 비율 = PPV (Positively Predicted Value)
Recall : 실제 (+) 중 (+)로 예측한 비율 = Sensitivity
Balanced Accuracy = (Sensitivity + Specificity) / 2
F-beta score: 가중치를 0.5 0.5가 아닌 w로 주었을 때의 조화평균. 여기서 w/(1-w) = \beta^2
배운점
1. 보통 분류기는 posterior probability estimate를 구하고, 이진분류에서는 해당 post. prob. est.가 0.5를 넘으면 Class 1, 0.5보다 작으면 Class 2로 분류를 함. 그런데 여기서 0.5라는 값은 절대적인 값이 아니다. 저 수치가 바로 우리가 설정한 threshold라고 하는데, confusion matrix나 accuracy를 계산할 때 이 threshold에 의존하게(depndent) 된다.
불균형 데이터로 분류를 진행할 경우, Threshold에 의존하지 않는, 즉 threshold와 독립적인 measure를 필요로 하는데 그 중 대표적인 measure가 ROC, AUC이다.
2. 이전 과제에서 변수선택을 하고 10-fold CV를 진행한 사람들이 많은데 10-fold CV를 진행하면서 각 CV내에서 변수선택을 해야 맞다.
그렇게 하려면 train함수의 인자 중에서 preProcess = 'nzv'를 집어 넣으면 됨.. (즉, LASSO로 분류기의 변수선택을 하는 것이 아니라 non-zero varaince만 변수로 선택했어야 함.)
3. ROC-AUC 곡선을 그려서 접선을 그렸을 때 가장 y절편이 큰 접점에서의 post. prob. est. 값이 threshold가 된다.
optimal threshold는 y = -x + 1과 접선의 교점이라고 함.
4. ROC를 metric으로 10-fold CV를 진행하고자 한다면 trainControl을 사전에 설정할 때, summaryFunction = twoClassSummary라는 인자를 옵션으로 추가해주어야 함.
threshold와 독립적인 measure에 대해서는 이 옵션을 꼭 설정해주어야 오류가 발생하지 않으므로 기억하자.
5. 10-fold CV를 돌렸을 때 최적의 threshold를 찾기 위해서는 thresholder라는 함수로 계산해야하며, 이 때 인자로 threshold = 으로 그 범위를 지정해주어야 한다. 이 때 threshold의 범위는 데이터 사이즈가 크면 빽빽하게, 데이터 사이즈가 작으면 널널하게 설정하는 것이 적절하다.
6. 위에서 thresholder 함수로 확인한 최적의 thershold를 사용하여 예측을 하고자 한다면, R에서는 ifelse문으로 해당 threshold보다 크면 'yes', 작으면 'no'로 설정하여 predict해준다.
7. thresholder 함수에서 final이라는 인자를 FALSE로 설정할 경우 -> 최종 모형만 보는 것이 아니라 설정해준 모든 하이퍼파라미터 조합의 threshold를 다 확인해준다. 시간이 오래 걸리게 된다.
8. 이렇게 thresholder(,..., final = F)로 설정하여 결과를 확인하면 다양한 measure가 다 계산되는데, 이 중에서 원하는 measure를 최대화(혹은 최소화)하는 threshold를 쓰고싶다면, 그 threshold를 사용했을 때 최적의 hyperparameter 결과를 사용해서 CV없이 (trainControl(method = 'None', classProbs = T, summaryFunction = twoClassSummary)) + tuneGrid에 해당 하이퍼파라미터만 사용한 새로운 모델로 적합시켜야 한다.
9. 불균형 데이터를 다루는 기법은 3가지에 추가적인 두가지 방법이 있다. 1) 언더샘플링 2) 오버샘플링 3) SMOTE이 대표적이고, 추가적인 방법은 1) 다른 measure로 평가하기 2) Cost-sensitive learning이다.
10. undersampling은 minor한 클래스만큼 major 클래스 표본을 random sampling해서 그 데이터만 쓰는 것
oversampling은 minor클래스를 major한 클래스 표본수만큼 bootstrapping을 써서 늘려서 사용하는것
SMOTE는 minor한 클래스끼리 직선을 긋고 그 중간점에 있는 데이터를 새롭게 생성하여 (synthetic) 사용하는 것이다.
11. SMOTE를 쓸 것이라면 training에만 써야하고, test에는 절대로 쓰면 안된다.
12. SMOTE에 10-fold CV까지 쓰고싶다면 -> trainControl의 옵션 인자로 sampling = 'smote'를 사용한다.
언더샘플링+10foldCV라면, sampling = 'down', 오버샘플링이면 sampling = 'up'임.
의문점
SMOTE + 10-fold CV 진행하는 것은 그러니까 각각의 fold 내 trainset으로 SMOTE를 진행하고, validation set으로 평가하는 것이니까 각각의 fold에서 SMOTE를 진행하는 것 맞나?
'언어 > 참고' 카테고리의 다른 글
11/17 데이터마이닝 (부스팅, 스태킹) (0) | 2022.11.17 |
---|---|
11/11 데이터마이닝 간단 정리(앙상블 중 배깅과 랜덤포레스트의 특징, 기억하면 좋을 것들) (0) | 2022.11.11 |
[참고] 사용자 계정 컨트롤 창 끄기 (0) | 2020.08.22 |
[참고] '관리자 권한으로 실행' 자동 실행 (0) | 2020.08.22 |
[참고] 컴퓨터 운영체제 32비트인지 64비트인지 간단히 확인하는 법 (0) | 2020.08.22 |