안녕하세요 배도리입니다. 사실 부끄럽지만 마음이 급하네요. "매일 매일 하는 공부가 제가 원하고자하는 바에 도달 할 수 있을까?", "나의 공부 방향이 맞는걸까?", "난 취업할 수 있을까?" 이런 저런 불확실한 미래에 의문이 듭니다. 그럴때마다 취미지만 12년동안 쇠질했던적을 회상합니다. "난 언제 몸이 멋있어질까?, 언제 삼대 500을 들수 있을까?" 이런 잡생각(누가 그런 생각하겠냐마는 ㅎㅎ)하지 않고 꾸준히 했던것 같습니다. 그렇게 포기하지않고 하다보니 현재 저는 헬스를 하는 사람들 중에서 적어도 5%안에 들 수 있다 생각합니다. 그런 저의 모습을 생각하면서 감정이 급하든 불안하든 행동은 그저 단련할 뿐입니다. 오늘은 저번 게시글에 이어서 실습자료를 표준화를 진행하고 결과를 분석해보겠습니다.
기계학습 분류문제 해결의 일반적 실습순서
① 데이터셋 불러오기
② 데이터셋 카테고리 실수화
③ 데이터 분할 학습데이터와 테스트 데이터로 나누기
--------------------------------- 여기까지 설명드렸습니다!
④ 입력데이터의 표준화(필요할 경우 수행)
⑤ 결과 분석(테스트데이터 이용)
④ 입력데이터의 표준화(필요할 경우 수행)
표준화란 데이터의 scale(측정 단위)에 의해 영향을 받지 않도록 하는 과정입니다. 각 변수(특징)의 평균을 0, 표준편차를 1로 변환하여 데이터의 스케일을 조정하는 전처리 과정입니다. 보통 다양한 단위의 특성을 가진 데이터 즉 각 특성이 서로 다른 단위(예: 길이, 시간, 온도)를 가지는 경우와 이상치(outlier)가 있는 경우, 해당 이상치가 다른 데이터에 비해 큰 스케일을 가지는 경우가 많기때문에 이를 조정하기 위해 표준화를 수행할 수 있습니다.
Scikit_Learn의 StandardScaler 클래스를 호출하여 사용하고 시험데이터의 표준화는 학습데이터에서 구한 입력변수의 평균과 표준편차를 이용합니다. 하지만, 표준화로 인해 데이터의 분포인 통계적 특성이 깨지면 머신러닝의 학습 저하를 가져옵니다.
이전 실습 자료를 바탕으로 코드를 진행하겠습니다. 이 코드는 입력 변수(X)의 표준화(Standardization)를 수행합니다.

표준화를 수행 했으니 kNN을 진행하겠습니다. 이 코드는 표준화된 학습 데이터(X_train_std)와 종속 변수(y_train)를 사용하여 kNN을 학습하는 과정입니다.
됐습니당ㅎㅎ
이제 훈련 데이터(X_train_std, y_train)와 테스트 데이터(X_test_std, y_test)에 대한 예측을 수행해볼까요!? 예측 수행 후에는 예측 결과(y_train_pred, y_test_pred)와 실제 레이블(y_train, y_test)를 비교하여 잘못 분류된 샘플의 개수를 출력하고 정확도 또한 계산 하겠습니다.
⑤ 결과 분석(성능평가)
성능평가(Performance evaluation)는 머신러닝 모델의 예측 성능을 측정하고 평가하는 과정을 말합니다. 모델의 성능을 정량화하여 비교하고, 모델 개선을 위한 방향을 찾기 위해 중요한 단계입니다. 성능평가는 모델이 얼마나 정확하고 일반화할 수 있는지를 평가하는 데 사용됩니다. 일반적으로 분류(Classification)와 회귀(Regression) 문제에서 다른 성능평가 지표들이 사용됩니다. 오늘은 분류 성능평에 대해서 살펴볼게요!
분류 성능평가:
혼합행렬(Confusion Matrix):실제 클래스와 모델이 예측한 클래스가 일치하는 빈도를 행렬로 나타냅니다.
정확도(Accuracy): 전체 예측 중 정확하게 예측한 비율입니다.
정밀도(Precision): 양성으로 예측한 샘플 중 실제 양성인 비율입니다.
재현율(Recall): 실제 양성인 샘플 중 양성으로 정확하게 예측한 비율입니다.
F1 스코어(F1 Score): 정밀도와 재현율의 조화 평균으로, 정밀도와 재현율의 균형을 나타냅니다.
ROC 곡선(AUC): 분류 모델의 성능을 나타내는 곡선으로, 면적이 클수록 성능이 좋습니다.
일단 하나씩 보겠습니다.
혼합행렬(Confusion Matrix)
실제 클래스와 예측된 클래스간의 관계를 나타내는 행렬로, 모델이 얼마나 정확하게 예측했는지와 어떤 클래스를 잘못 분류했는지 확인할 수 있습니다. 이는 클래스 범주형변수안에서 구분되는 기준이 됩니다. 표로 한번 보겠습니다.

실습자료를 바탕으로 코드로 살펴보겠습니다. 먼저 표준화 적용 전입니다.
표준화 적용 이후도 확인하겠습니다.
정확도(Accuracy)
전체 샘플 중 맞게 예측한 샘플 수의 비율입니다. 수식으로 보겠습니다.

흠 TP, TN 이런 용어들 낯섭니다. 용어들 한번 예시로 정리하겠습니다. 전 잘안외워져서 억지좀 부리겠겠습니다.
예시 - 암진단
암에 걸린 것을 양성(positive), 암에 걸리지 않은 것을 음성(negative)이라 표현
[True Positive]: 암을 암이라고 정확하게 예측 → TP, 사실 맞는데. 똑똑하게(smarT) 진짜 맞다고(P) 하네요
[True Negative]: 암이 아닌 것을 암이 아니라고 정확하게 예측 → TN, 사실 아닌데 똑똑하게(T) 아Nㅣ라고 하네요
[False Positive]: 암이 아닌 것을 암이라고 잘못 예측 → FP, 사실 아닌데 멍청하게(Foolish...) 맞다고(P) 하네요ㅠ
[False Negative]: 암을 암이 아니라고 잘못 예측→ FN, 사실 맞는데 멍청하게(F) 아Nㅣ하네요ㅠ
(P,양성은 따로 생각하지못했습니다ㅎ)
그렇다면 정확도는 모든 판단들중에서 똑똑하게 말한 친구들이네요 ㅎㅎ

이걸 통해서 다른 지표들도 계산할수 있습니다!
정밀도(Precision): 양성 클래스에 속한다고 예측한 표본 중에서 실제로 양성 클래스에 속하는 표본 수의 비율
맞다고 말한 것들중(모든P) 중에 똑똑하게(T) 맞다고(P) 한겁니다.

재현율(Recall): 실제 양성 클래스에 속한 표본 중에 양성 클래스에 속한다고 예측한 표본의 수의 비율, 민감도라고도 칭함
사실 맞는것 중에서(TP사실인데똑똑하게맞다고함, FN사실인데멍청하게아니라함) 똑똑하게 맞다고한겁니다(TP)

F1-Score: 정밀도와 재현율의 조화평균(harmonic mean)입니다. 정밀도와 재현율의 균형을 나타냅니다.

ROC curve (Receiver Operating Characteristic curve): 이진 분류기의 성능을 threshold(임계값)에 따라 FPR(x축)과 TPR(y축)의 변화를 표현합니다. TPR은 실제 양성 중 양성으로 정확하게 분류된 샘플의 비율(재현율,민감도)이고, FPR은 실제 음성 중 양성으로 잘못 분류된 샘플의 비율입니다. (1-특이도)

특이도(Specificity): 실제 음성 클래스에 속한 표본중에 음성 클래스에 속한다고 예측한 표본의 수의 비율입니다.
TN / (TN + FP) 즉 사실 아닌것들 중에 (TN 똑똑하게 아Nㅣ라함,FP 멍청하게 맞다함P) 똑똑하게 아니라고 한것(TN)
결국 FPR은 1 - 특이도니까 사실 아닌것들 중에 멍청하게 맞다고 한 FP/FP+TN 이 됩니다.
그림으로 나타내면 다음과 같습니다.

이진 분류기의 성능을 threshold(임계값)에 따라 FPR(x축)과 TPR(y축)의 변화를 표현이라....처음에 듣고 뭔소리지 했습니다. 이걸 왜하는 걸까요?
우선 임계값이란
임계값은 분류 모델에서 양성(Positive) 또는 음성(Negative)으로 분류하는 결정 임계값을 말합니다. 이는 모델의 출력(확률 값 또는 점수)과 비교하여 해당 예측 결과를 결정하는 기준입니다. 일반적으로, 임계값은 0과 1 사이의 값으로 설정됩니다.(보통 0.5) 이진 분류 모델에서는 모델의 출력이 임계값보다 크면 양성으로 분류되고, 작으면 음성으로 분류됩니다. 임계값은 모델의 예측 결과를 조정하고, 원하는 분류 결과를 얻기 위해 사용자가 선택하게 됩니다. 임계값 조정을 통해 모델의 성능을 개선하거나 원하는 분류 성능을 얻을 수 있습니다. 그러나 임계값 조정은 양성과 음성 중 어느 쪽을 더 중요하게 고려해야 하는지에 따라서도 달라질 수 있습니다. 상황에 따라 임계값을 조정하여 모델의 예측 결과를 조절할 수 있습니다.
결국 임계값은 사용자가 조정할 수 있는 매개변수입니다. 임계값을 낮출수록 양성으로 분류되는 샘플의 수가 증가하고, 재현율(사실 맞는것 중에서 똑똑하게 맞다고)이 증가합니다. 예를 들어 0.5였던 임계값을 0.1로 낮췄다면 모델 출력이 임계값0.1보다 큰 애들이 많아져서 양성으로 분류 되겠죠? ㅎㅎ
반면에 임계값을 높일수록 양성으로 분류되는 샘플의 수가 감소하고, 특이도(사실 아닌것들 중에 똑똑하게 아니라고 한것)가 증가합니다. 마찬가지로 0.5였던 임계값을 0.9로 올린다면 똑똑하게 아니라고(TP)가 더 잘 분류됩니다. 양성으로 분류되는 샘플수가 작아지니까 분모가 작아지기 때문에 특이도 올라가는거죠.
오 둘은 마치 트레이드오프 관계네요ㅎㅎ
아 ㅎㅎ 트레이드오프 네 알겠습니다만 근데 어쩌라는거죠? 결국 최적의 임계값을 설정하기 위함입니다. 분류 모델의 예측 결과를 원하는 대상에 맞게 조정을 통해 다음과 같은 이점을 얻을 수 있습니다.
1. 임계값 조정은 모델의 분류 성능을 최적화하는 데 도움을 줍니다. 임계값을 조정하여 원하는 성능 지표, 예를 들어 재현율(Recall) 또는 정밀도(Precision)를 최대화하거나 최소화할 수 있습니다. 이는 모델이 특정 클래스나 예측 결과에 대해 더 강조하거나 민감하게 반응하도록 할 수 있습니다.
예를 들어, 암 진단 모델에서 양성으로 분류되는 환자를 실제로 양성인 환자를 더 정확하게 찾고자 한다면 임계값을 조정하여 재현율(Recall)을 높일 수 있습니다. 반대로, 특이도(Specificity)를 높이고자 한다면 임계값을 높여 거짓 양성(FP) 비율을 줄일 수 있습니다.
2. 비즈니스 요구사항 충족하는데 적용됩니다. 비즈니스나 문제 상황에 따라 분류 모델의 예측 결과를 조정해야 할 수 있습니다. 예를 들어, 신용 카드 사기 탐지 시스템에서 거짓 양성(FP)이 실제 사기(Fraud)보다 더 큰 비용을 초래하는 경우, 임계값을 높여 거짓 양성을 줄일 수 있습니다. 또 다른 예로 스팸 메일 필터링에서는 스팸 메일을 놓치는 것(False Negative)보다 정상 메일을 스팸으로 분류하는 것(False Positive)을 최소화하는 것이 더 중요할 수 있습니다.
3. 임계값 조정을 통해 원하는 분류 결과를 조정할 수 있습니다. 예를 들어, 양성으로 분류되는 비율이 매우 낮은 클래스의 경우, 임계값을 낮춰 양성으로 분류되는 샘플의 수를 늘릴 수 있습니다. 그 예로 암 진단 같은 경우는 암 환자를 놓치는 것(False Negative)을 최소화하는 것이 더 중요합니다. 그게 지금 바로 아래 그림입니다.
보라색 선이 임계값을 조정하는겁니다.

다음으로 이제 ROC 커브에 면적에 대한 이야기를 하겠습니다.
AUC (Area Under the Curve)는 ROC곡선 아래의 면적을 의미하며, 분류 모델의 성능을 간단하게 요약하여 비교할 수 있는 지표로 사용됩니다. 또한, 클래스 불균형 문제가 있는 데이터셋에서도 AUC는 민감하게 반응하므로, 모델의 성능을 신뢰할 수 있는 대안적인 평가 지표로 활용됩니다. AUC 값은 0과 1 사이의 값을 가지며, 일반적으로 1에 가까울수록 좋은 성능을 나타냅니다. AUC 값이 0.5에 가까울 경우 모델의 성능이 무작위 예측 수준에 가깝다고 할 수 있으며, 0.5보다 작은 값은 반대 방향으로 예측하는 것보다 나쁜 성능을 나타냅니다.

AUC와 임계값 설정은 연관이 있습니다. 임계값을 설정함으로써 모델의 양성과 음성 분류 결정을 조정할 수 있습니다. 이는 모델의 분류 성능에 영향을 미치며, 이에 따라 AUC 값도 변화할 수 있습니다. 임계값과 AUC는 모델의 예측 결과와 분류 성능을 조정하고 평가하는 데에 함께 사용됩니다.결론적으로, AUC 값의 최대화를 위해서는 재현율과 특이도를 적절하게 조정해야 합니다. 최고의 AUC 값을 얻기 위해서는 모델의 성능을 종합적으로 평가하고, 재현율과 특이도 사이의 트레이드오프 관계를 고려하여 최적의 임계값과 분류 성능을 선택해야 합니다.
'Machine Learning_모델설계_Python' 카테고리의 다른 글
| 선형회귀_1 단순선형회귀 (5) | 2023.05.16 |
|---|---|
| kNN_4 회귀 (0) | 2023.05.14 |
| kNN_2 분류 실습 (3) | 2023.05.10 |
| kNN_1 분류 (2) | 2023.05.09 |
| 기계학습(Machine Learning) 방법론 (2) | 2023.05.08 |