[TIL] 22.11.24

문종현·2022년 11월 24일
0

TIL

목록 보기
45/119
post-custom-banner

🦁🦁

👉 오늘 한 일

  • 위클리 키워드 정리
  • 10주차 과제
  • 생활코딩

키워드 : 분류성능평가지표

0. Confusion matrix

밑에서 소개할 지표들은 Confusion matrix를 먼저 이해한 후에 봐야 한다.

어느 모델이든 간에 발전을 위한 feedback은 현재 모델의 performance를 올바르게 평가하는 것에서부터 시작한다. 모델을 평가하는 요소는 결국, 모델이 내놓은 답과 실제 정답의 관계로써 정의를 내릴 수 있다.

💡 오차행렬(confusion matrix)
실제로 참(True)인지 거짓(False)인지, 예측을 긍정(Positive)으로  했는지, 부정(Negative)으로 했는지에 따라 네 개의 경우의 수로 구분한 표

머신러닝을 크게 input, 기계학습, output의 과정으로 나눠보자면 오차행렬은 output에 관한 것이라 볼 수 있다. 오차행렬이 중요한 이유는 머신러닝 모델의 예측이 얼마나 잘한 예측인지를 판단하는 데 중요한 기준을 제공하기 때문이다.

  • T(True): 예측한 것이 정답

  • F(False): 예측한 것이 오답

  • P(Positive): 모델이 positive라고 예측

  • N(Negative): 모델이 negative라고 예측

위를 기반으로 아래와 같이 설명할 수 있다.

  • TN(True Negative): 모델이 negative라고 예측했는데 실제로 정답이 negative (정답)

  • FP(False Positive): 모델이 positive라고 예측했는데 실제로 정답이 negative (오답) → 1종오류

  • FN(False Negative): 모델이 negative라고 예측했는데 실제로 정답이 positive (오답) → 2종오류

  • TP(True Positive): 모델이 positive라고 예측했는데 실제로 정답이 positive (정답)

  • 1종오류, 2종오류에 대한 추가설명

    • 1종 오류
      • 실제로는 아무 일도 일어나지 않았지만, 어떤일이 발생했을 것이라고 예측하는 오류
      • 귀무가설이 실제로 참이지만, 이에 불구하고 귀무가설을 기각하는 오류
    • 2종 오류
      • 실제로는 어떤 일이 발생했지만, 아무 일도 일어나지 않았을 것이라고 예측하는 오류
      • 귀무가설이 실제로 거짓이지만, 이에 불구하고 귀무가설을 기각하지 못하는 오류

예시 👇

화재 경보

- 1종 오류: 실제로는 아파트에 불이 나지 않았지만, 화재 경보가 울린 경우
- 2종 오류: 실제로는 아파트에 불이 났지만, 화재 경보가 울리지 않은 경우

신용카드 사기 탐지

- 1종 오류: 실제로는 사기가 아니지만, 사기라고 예측한 경우
- 2종 오류: 실제로는 사기지만, 사기가 아니라고 예측한 경우

이런 오차행렬로부터 우리는 머신러닝 모델의 우수성을 평가하는 여러 지표를 도출할 수 있다.

1. Accuracy

💡정의

  • Acuuracy는 간단히 말하면 전체 문제 중에서 정답을 맞춘 비율이다. 즉 예측을 긍정으로 했든 부정으로 했든 실제로 참이었는지에 포커싱을 둔 지표로, 가장 직관적이고 상식적인 지표라고 볼 수 있다.
  • 0~1 사이의 값을 가지며 1에 가까울 수록 좋다.
  • 일반적으로 학습에서 최적화 목적함수로 사용된다.

한계 ⁉️

Accuracy는 결과만 맞는다면 과정에 큰 관심을 갖지 않는 지표이나 이러한 부분 때문에 데이터가 불균형 할 경우 accuracy만으로 제대로 분류했는지 알기가 어려운 약점을 갖는다.

만일 10명의 환자 중 9명이 특정질병에 걸렸다면, 모델이 환자들이 병에 걸렸으리라고 긍정예측을 하면 무려 90%의 정확도를 갖게 된다. 이 자체로는 문제인지 알 수 없지만, 문제는 뛰어난 예측력을 지닌 모델이든 형편없는 예측력을 갖는 모델이든, 이 둘을 가려낼 방법이 없다는 점이다. 표본의 타깃값이 한쪽으로 편향되어 있기 때문에, 모델이 우수하지 않더라도 찍어서 높은 정확도를 가질 수 있게 된다.

학업성취도가 높은 학생과 낮은 학생들이 시험을 보았는데, 문제가 너무 쉽다면 누가 우수한 학생인지 가려내기 어렵듯이, 정확도(Accuracy)라는 지표 역시 변별력이 없는 시험처럼, 우수한 모델과 그렇지 못한 모델을 구별하기 어려운 지표이며, 따라서 이를 보완할 지표로 Precision과 Recall을 사용한다.

2. Precision(정밀도) / Recall(재현율)

  • Precision(정밀도)

  • Precision = TP(True Positive) / (TP(True Positive) + FP(False positive))

  • 정밀도는 True라고 분류한 것들 중에서 실제로 True인 것의 비율이다.

  • PPV(Positive Predictive Value) 즉 Positive 정답률이라고도 불린다.

  • 현실 사례

    • 스팸 메일을 검출할 때
      스팸 메일이 아닌데 스팸 메일로 판단해 차단하면 중요한 메일을 못 받을 수 있다.
  • Precision이 낮다 : True가 아닌데 True라고 한 것이 많다

  • Precision이 (과도하게) 높다 : 아주 확실한 경우에만 참으로 예측했다

  • scikit-learn에서 확인하는 방법

from sklearn.metrics import precision_score
    
x_true = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
x_guesses = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]
    
precision_score(x_true, x_guesses)
  • Recall(재현율)

  • Recall = TP(True Positive) / (TP(True Positive) + FN(False Negative))

    • 재현율은 실제 True인 것 중에서 True라고 예측한 것의 비율이다.
  • Sensitivity 혹은 Hit rate라고도 불린다

  • 현실 사례

    • 지진
      • 지진이 나지 않았지만 지진이라고 예측해 대피명령을 한 것은 생명에 지장이 없지만
      • 지진이 났는데 지진이 나지 않을 것이라고 예측해 대피명령이 없다면 생명이 위험하다
    • 암 검출 시
      • 실제로 암에 걸렸는데, 걸리지 않는다고 판단하는 것이 가장 위험하다
  • Recall이 낮다 : True인데 못 찾은 것이 많다

  • Recall이 (과도하게) 높다 : True로 예측한 것이 필요 이상으로 많다

    ※ 모든 예측을 True로 하면 예측 성능과 상관 없이 Recall이 높게 나올 수 있다

  • scikit-learn에서 확인하는 방법

from sklearn.metrics import recall_score
    
x_true = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
x_guesses = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]
    
recall_score(x_true, x_guesses)

Presicion이나 Recall은 모두 True라고 예측한 것과 관련이 있으나, 관점이 다르다고 볼 수 있다.

Precision과 Recall은 상호보완적이기 때문에, Recall을 올리면 Precision이 내려가고, Precision을 올리면 Recall이 내려갈 수 밖에 없다.

이를 보완하기 위해 생겨난 것이 Recall과 Precision의 조화평균인 F1 score이다.

3. F1-score

F1-Score

  • Precision과 Recall의 조화평균으로 0.0~ 1.0 사이의 값을 가진다.

  • 값이 1에 가까울수록 좋은 모델이다.

  • 정밀도와 재현율을 균형 있게 반영하기 위해 산술평균이 아닌 조화평균을 사용한다.

  • 데이터 분류 클래스가 불균형할 때 모델의 성능을 정확하게 평가할 수 있다.

  • F-Beta Score 관점에서 보면 Beta가 1인 경우에 해당한다.

F-Beta Score

  • F1 기반 평가산식 중 하나로 Beta를 매개변수로 사용해 Precision과 Recall 사이의 균형에 가중치를 부여하는 방법이다.

  • Recall에 더 비중을 두려는 경우 F-Beta Score의 Beta 값을 1보다 큰 값으로 지정하면 된다.

  • Beta 값이 1.0보다 크면 Recall에 비중을 두고 계산하고

  • Beta 값이 1.0보다 작으면 Precision에 비중을 두고 계산하게 된다.

  • 만약 Recall 값과 Precision 값이 정확이 같다면 Beta에 관계없이 같은 결과가 나온다.

Macro-F1 Score

  • sum(F1 Scores) / number of classes

  • 둘 이상의 클래스가 있는 데이터 세트의 전체 F1 점수를 계산하기 위한 집계 방식 중 하나이다.

  • 클래스 별로 계산된 F1 점수의 비가중 평균으로, F1 점수에 대한 가장 간단한 집계이다.

  • 0.0과 1.0 사이의 값을 가지며 1에 가까울수록 좋다.

  • Macro-F1은 모든 클래스의 값에 동등한 중요성을 부여한다.

  • 클래스의 빈도에 관계없이 모든 클래스가 동등하게 기여하므로 불균형 데이터 세트에 대한 객관적인 결과를 반환할 수 있다.

  • 반대로 클래스 빈도에 따라 가중치를 부여하는 Micro-F1 Score 방식이 있는데, 이 방식은 데이터의 불균형을 더욱 증폭 시킨다는 단점이 있다.

4. AUC(Area under the ROC Curve), AUROC

정의

ROC 곡선(커브) 아래 부분의 넓이. 넓이값으로 분류 모델의 성능을 평가함

  • 보통 이진 분류 모델에 많이 사용함
  • 값이 클수록 좋은 성능을 가진 모델

ROC(receiver operating characteristic) curve

FPR (False positive rate)과 TPR (True Positive Rate)을 각각 x, y축으로 놓은 그래프

  • TPR (True Positive Rate): 1인 케이스에 대해 1로 바르게 예측하는 비율 (Sensitivity), 암 환자에 대해 암이라고 진단하는 경우
    • TP가 많고 FN이 적을수록 TPR은 1에 가까워짐

  • FPR (False positive rate): 0인 케이스에 대해 1로 틀리게 예측하는 비율 (1-Specificity), 정상에 대해 암이라고 진단하는 경우
    • FP가 적고 TN이 많을수록 FPR은 0에 가까워짐

  • 어떤 분류 모델이 가장 좋은 성능을 보이는지 판단할 때 사용
    • 높은 sensitivity와 높은 specificity를 보이는 모델을 고르기 위해 다양한 모델에 대해 ROC curve를 그리고, 좌상단으로 가장 많이 치우친 그래프를 갖는 모델이 가장 높은 성능을 가짐

💡ROC curve는 확률 분포 곡선임

  • 판단선, 임계값(threshold, cut off, decision boundary)를 움직였을 때, 얼마나 성능이 민감한지 확인
    • 판단선, 임계값 : 분류의 기준이 되는 확률 값. 여기서는 0.5인데, 확률이 0.5보다 낮으면 0으로, 높으면 1로 분류
    • 임계값은 항상 0.5여야 한다고 생각하기 쉽지만 임계값은 문제에 따라 달라지므로 필요에 따라 값을 조정해야함


=> 모델이 클래스 분류를 완벽하게 함


=> 이 경우 ROC curve는 (0,1)을 지남

  • 두 분포가 겹치면 1종 오류(type 1 error)와 2종 오류(type 2 error)가 발생함
    • 임계값(threshold)에 따라 1종 오류와 2종 오류를 최소화하거나 최대화할 수 있음


=> 가장 일반적인 ROC curve의 형태

  • AUC가 약 0.5일 때 모델은 클래스를 구별하는 판별 능력이 없음(0, 1중에 random 선택)


=> 곡선 형태가 아닌 선형 그래프가 그려짐

  • AUC가 0에 가까우면 모델은 클래스를 반대로 예측함. 이는 모델이 음성 클래스(0)를 양성 클래스(1)로 예측하고 그 반대의 경우도 마찬가지로 예측함

💡임계값과 ROC curve와의 관계

민감도(Sensitivity)와 특이도(Specificity)는 서로 반비례

  • 임계값을 낮추면 더 많은 양성(1, TP) 값을 얻게 되므로 민감도(Sensitivity)는 증가하고 특이도(Specificity)는 감소
  • 임계값을 높이면 더 많은 음성(0, TN) 값을 얻게 되므로 특이도(Specificity)는 높아지고 민감도(Sensitivity)는 낮아짐
  • TPR = 민감도(Sensitivity)
  • FPR은 1 - specificity 이기 때문에 임계값을 높이면 TPR은 낮아지고 특이도가 증가하며 FPR은 낮아지고 그 반대의 경우도 마찬가지
  • 임계값이 커지면 TPR이든 FPR이든 작아질 수 밖에 없음. 따라서 FPR의 값이 작아질 때 TPR이 천천히 작아진다면, 좋은 성능을 가진 모델이라고 할 수 있음

과제_penguins EDA

# 전체 결측치 시각화
sns.heatmap(df.isnull())

# 결측치 행 제거
# warning 메세지 나오는 것을 방지하기 위하여 깊은 복사(copy)를 해줌
df_nona = df.dropna().copy()

# 그룹별 상관관계
df_nona.groupby("species")[["bill_length", "bill_depth", "flipper_length", "body_mass"]].corr()

생활코딩 tensorflow

딥러닝 라이브러리 : Tensorflow, Pytorch, Caffe2, theano

지도학습 과정

  1. 과거 데이터 준비
  2. 모델 구조 구축
  3. 데이터로 모델 학습(fit)
  4. 모델 이용

💡퍼셉트론

  • 퍼셉트론(Perceptron)은 인공 신경망(Aritificial Neural Network, ANN)의 구성 요소(unit)로서 다수의 값을 입력받아 하나의 값으로 출력하는 알고리즘

  • perception과 neuron의 합성어. 인공 뉴런이라고도 부름

💡퍼셉트론의 동작 과정

  • 퍼셉트론은 뉴런이 다른 뉴런으로부터 신호를 입력받듯 다수의 값 xx를 입력받고, 입력된 값마다 가중치(weight)를 곱함.

  • 여기서 가중치는 생물학 뉴런에서 뉴런 간 시냅스를 통한 결합의 세기와 같은 역할이며 가중치가 클수록 입력값이 중요하다는 것을 의미.

  • 입력값으로써 xx 외에도 편향(bias, bb)은 딥러닝 모델 최적화의 중요 변수 중 하나임.

  • 일반적으로 입력값을 1로 고정하고 편향 bb를 곱한 변수로 표현함.

  • 입력값과 가중치의 곱, 편향은 퍼셉트론으로 전달됨. 퍼셉트론은 입력받은 값을 모두 합산하는데, 합산된 결과값을 가중합이라 부름.

  • 퍼셉트론에서 가중합의 크기를 임계값(θ)과 비교하는 활성화 함수(Activation Function)를 거쳐 최종 출력값을 결정함.

  • 여기서 편향이 딥러닝 모델 최적화의 중요 변수 중 하나인 이유를 알 수 있음.

  • 가중합의 크기는 편향의 크기로 조절할 수 있기 때문에, 편향이 퍼셉트론의 출력값 y를 결정짓는 중요 변수인 셈임.

  • 인공신경망과 다르게, 퍼셉트론은 활성화 함수로 계단 함수(Step Function)를 사용함

profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글