[Machine Learning] 오차행렬 - 모델 평가&분류 확인
* 모델 성능 평가 - 실제값과 모델에 의해 예측된 값을 비교하여 두 값의 오차를 구하는 것
* 모델 평가 목적
- 과적합을 방지하고 최적의 모델을 찾기 위해
- 오차가 작을수록 좋은 모형
* 모델 성능 평가는 지도학습에서만 사용되며, 분석 방법에 따른 성능 평가 지표는 다르게 사용됨
분류 분석 평가 지표 confusion matrix
- 이진 분류
- confusion matrix (오차 행렬)
예측
True(P) False(N)
정 True TP FN
답 False FP TN
- 정확률 accuracy : (TP+TN) / (TP+FN+FP+TN)
> 올바르게 예측한 데이터 수 / 전체 데이터수
> from sklearn.metrics import accuracy_score (labels, pred)
> 불균형한 레이블 값이 분포된 데이터에서 모델의 성능이 좋지 못하더라도 정확도가 높을 수 있다
> 정확률은 종속변수의 비율에 영향을 받아서 9:1 비율의 데이터에서 정확률 90%가 넘는 함정이 있음
> 불균형한 데이터를 다룰 때 모델의 신뢰도가 낮다
예) 99개의 데이터 라벨이 0, 1개의 데이터 라벨이 1인 경우 0만 예측하는 모델의 정확도는 99%가 되므로...
- 정밀도 precision : TP / (TP+FP)
> from sklearn.metrics import precision_score
> 모델이 Positive로 예측한 것들 중에 실제 Positive이 데이터 비율
> 양성 예측도
> 음성 데이터를 양성으로 잘못 판단하면 업무상 영향이 큰 경우 ex) 스팸
- 재현율 recall, 민감도 sentitivity : TP / TP+FN
> from sklearn.metrics import recall_score
> 실제 Positive 데이터 중에서 Positive로 예측한 비율
> 양성 데이터를 음성 데이터로 잘못 판단하면 업무상 영향이 큰 경우 ex)암진단
- 특이도 specificity : TN / FP+TN
> 실제 Negative데이터 중에서 Negative로 예측한 비율
>> 정밀도와 재현률은 반비례관계
정밀도와 재현율의 성능 지표를 모두 올리는 것은 한계가 있음(trade off관계)
- predict_proba() : 개별 데이터별로 예측 확률을 반환
- precision_recall_curve() : 정밀도와 재현율의 임계값의 변화에 따라 평가 지표 변화를 곡선 형태의 그래프로 시각화하는데 이용
- 저편향/저분산(Low Bias/Low Vaiance)
: 예측 결과가 실제 결과에 매우 잘 근접, 예측 변동 큼x, 특정 부분에 집중 => 아주 뛰어난 성능
- 저편향/고분산(Low Bias/High Vaiance)
: 예측 결과가 실제 결과에 비교적 근접, 예측 결과가 실제 결과를 중심으로 꽤 넓은 부분에 분포
- 고편향/저분산(High Bias/Low Vaiance)
: 정확한 결과에서 벗어남, 예측이 특정 부분에 집중
- 고편향/고분산(High Bias/High Vaiance)
: 정확한 결과에서 벗어남, 예측이 넓은 부분에 집중
>> 편향과 분산은 트레이드오프(trade-off, tradeoff) 관계
- f1-score : ((정밀도 * 재현률) / (정밀도 + 재현률)) * 2
> from sklearn.metrics import f1_score
> 정밀도와 재현률의 수치를 적절하게 조합하여 사용되는 성능 지표
> 정밀도와 재현율의 조화 평균
- ROC curve
: FPR (False Positive Rate)이 변할 때 TPR (True Positive Rate) 이 어떻게 변하는지를 나타내는 곡선
: TPR 민감도 = TP / (TP + FN) 재현율과 동일
: FPR = FP / (FP + TN) = 1 - TPR
: from sklearn.metrics import roc_curve, roc_auc_score
: 임계값 (Threshold) 1 - 확률이 1일때만 True 라고 예측하기 때문에 FP (실제 False인데 True라고 예측하는 경우) = 0
: 임계값 (Threshold) 0 - 확률이 모두 True 라고 예측하기 때문에 TN (실제 False인데 False 라고 예측하는 경우) = 0
: roc_curve () - ROC 곡선으로 모델의 성능을 확인 .
- AUC score
: ROC 커브의 아래 면적
: 0.5미만은 의미 없는 모형
: 1에 가까울수록 좋은 모형
>> y의 1에 가까울수록 더 좋은 성능
> 분포가 겹칠수록 직선에 가까워짐
분류가 제대로 되었는지 알 수 있는 가장 간단한 지표?
sklearn.metrics.confusion_matrix(y_origin, y_predict)
=> 히트맵으로 표현 가능
- 전체 합 = 샘플 수
- 각 행의 합 = 원본 분류 샘플 수
- 각 열의 합 = 예측한 분류 샘플 수
- 주대각선 합 = 참 분류된 샘플 수
- 주대각선 제외 합 = 오분류된 샘플 수
sklearn.metrics.classification_report()
* 내용참고&출처 : 태그에서 수강한 수업을 복습 목적으로 정리한 내용입니다.