🦁🦁
밑에서 소개할 지표들은 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종 오류: 실제로는 사기지만, 사기가 아니라고 예측한 경우
이런 오차행렬로부터 우리는 머신러닝 모델의 우수성을 평가하는 여러 지표를 도출할 수 있다.
💡정의
한계 ⁉️
Accuracy는 결과만 맞는다면 과정에 큰 관심을 갖지 않는 지표이나 이러한 부분 때문에 데이터가 불균형 할 경우 accuracy만으로 제대로 분류했는지 알기가 어려운 약점을 갖는다.
만일 10명의 환자 중 9명이 특정질병에 걸렸다면, 모델이 환자들이 병에 걸렸으리라고 긍정예측을 하면 무려 90%의 정확도를 갖게 된다. 이 자체로는 문제인지 알 수 없지만, 문제는 뛰어난 예측력을 지닌 모델이든 형편없는 예측력을 갖는 모델이든, 이 둘을 가려낼 방법이 없다는 점이다. 표본의 타깃값이 한쪽으로 편향되어 있기 때문에, 모델이 우수하지 않더라도 찍어서 높은 정확도를 가질 수 있게 된다.
학업성취도가 높은 학생과 낮은 학생들이 시험을 보았는데, 문제가 너무 쉽다면 누가 우수한 학생인지 가려내기 어렵듯이, 정확도(Accuracy)라는 지표 역시 변별력이 없는 시험처럼, 우수한 모델과 그렇지 못한 모델을 구별하기 어려운 지표이며, 따라서 이를 보완할 지표로 Precision과 Recall을 사용한다.
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 = TP(True Positive) / (TP(True Positive) + FN(False Negative))
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이다.
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 방식이 있는데, 이 방식은 데이터의 불균형을 더욱 증폭 시킨다는 단점이 있다.
정의
ROC 곡선(커브) 아래 부분의 넓이. 넓이값으로 분류 모델의 성능을 평가함
FPR (False positive rate)과 TPR (True Positive Rate)을 각각 x, y축으로 놓은 그래프
💡ROC curve는 확률 분포 곡선임
=> 모델이 클래스 분류를 완벽하게 함
=> 이 경우 ROC curve는 (0,1)을 지남
=> 가장 일반적인 ROC curve의 형태
=> 곡선 형태가 아닌 선형 그래프가 그려짐
💡임계값과 ROC curve와의 관계
민감도(Sensitivity)와 특이도(Specificity)는 서로 반비례
1 - specificity
이기 때문에 임계값을 높이면 TPR은 낮아지고 특이도가 증가하며 FPR은 낮아지고 그 반대의 경우도 마찬가지# 전체 결측치 시각화
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, Pytorch, Caffe2, theano
지도학습 과정
💡퍼셉트론
퍼셉트론(Perceptron)은 인공 신경망(Aritificial Neural Network, ANN)의 구성 요소(unit)로서 다수의 값을 입력받아 하나의 값으로 출력하는 알고리즘
perception과 neuron의 합성어. 인공 뉴런이라고도 부름
💡퍼셉트론의 동작 과정
퍼셉트론은 뉴런이 다른 뉴런으로부터 신호를 입력받듯 다수의 값 를 입력받고, 입력된 값마다 가중치(weight)를 곱함.
여기서 가중치는 생물학 뉴런에서 뉴런 간 시냅스를 통한 결합의 세기와 같은 역할이며 가중치가 클수록 입력값이 중요하다는 것을 의미.
입력값으로써 외에도 편향(bias, )은 딥러닝 모델 최적화의 중요 변수 중 하나임.
일반적으로 입력값을 1로 고정하고 편향 를 곱한 변수로 표현함.
입력값과 가중치의 곱, 편향은 퍼셉트론으로 전달됨. 퍼셉트론은 입력받은 값을 모두 합산하는데, 합산된 결과값을 가중합이라 부름.
퍼셉트론에서 가중합의 크기를 임계값(θ)과 비교하는 활성화 함수(Activation Function)를 거쳐 최종 출력값을 결정함.
여기서 편향이 딥러닝 모델 최적화의 중요 변수 중 하나인 이유를 알 수 있음.
가중합의 크기는 편향의 크기로 조절할 수 있기 때문에, 편향이 퍼셉트론의 출력값 y를 결정짓는 중요 변수인 셈임.
인공신경망과 다르게, 퍼셉트론은 활성화 함수로 계단 함수(Step Function)를 사용함