79 모델의 성능평가가 중요한 이유
머신러닝이 수행한 결과(분류, 수치예측)에 대한 공정한 평가를 통해 머신러닝이 앞으로도 미래의 데이터에 대해서 잘 분류하고 예측을 잘 할 수 있도록 해주고 분류결과가 요행수로 맞힌게 아니다라는 것을 확인하게 해주며 분류결과를 좀 더 일반화할 수 있기 때문에 중요.
머신러닝 포트폴리오를 보고 기업체에서 면접 때 가장 많이 하는 질문?
Q : 제출한 데이터 분석 포트폴리오에서 모델을 이 머신러닝 모델로 선택한 이유가 무엇입니까?
A : 모델 성능 평가를 통해 확인한 결과 이 모델이 가장 우수했습니다.
Q : 모델의 성능을 평가할 때 사용한 척도가 무엇입니까?
A : 정확도와 함께 다른 성능척도들을 같이 비교해 보앗는데 다른 성능 척도는 다음과 같습니다.
"정확도 + 다른 성능 척도"
ㅇ모델 성능 평가를 위해 정확도만으로는 충분하지 않은 이유?
암판정을 하는 분류기가 99%의 정확도를 갖고 있다고 하면 1%의 오류율이 있기 때문에 어떤 데이터에 대해서는 오류를 범할 수도 있게 됨. 그래서 정확도만으로는 성능을 측정하는데 충분하지가 않음. 정확도와 더불어 분류기의 유용성에 대한 다른 성능 척도를 정의하는게 중요
> 그렇다면 다른 성능 척도는 무엇인가?
1. 카파통계량
2. 민감도와 특이도
3. 정밀도와 재현율
4. Roc 곡선
5. F1 score
ㅇ카파통계량
두 관찰자간의 측정 범주값에 대한 일치도를 측정하는 방법
kappa = (Pr(a) - Pr(e)) / (1-Pr(e))
Pr(a) : 데이터에서 관찰된 2명의 평가자들의 일치확률
Pr(e) : 2명의 평가자들이 데이터로부터 계산된 확률적 일치확률(우연히 일치할 확률)
카파 통계량이 0이면 완전 불일치하고 1이면 완전 일치함.
kappa | 일치정도 |
0.8 ~ 1.0 | 매우 좋은 일치 |
0.6 ~ 0.8 | 좋은 일치 |
0.4 ~ 0.6 | 보통 일치 |
0.2 ~ 0.4 | 어느정도 일치 |
0.0 ~ 0.2 | 거의 일치하지 않음 |
예제. 시험을 응시한 학생이 100명이라 할 때, 2명의 평가자가 합격, 불합격을 각각 판정하고 두 평가자의 일치도를 아래와 같이 보여주고 있음.
평가자 A | ||||
평가자B | 합격 | 불합격 | ||
합격 | 40 | 10 | 50 | |
불합격 | 20 | 30 | 50 | |
60 | 40 | 100 |
Pr(a) : 데이터에서 관찰된 2명의 평가자들의 일치확률 = 40+30 / 100 = 0.7
평가자 A : 합격을 60번, 불합격을 40번 주었음. 즉 평가자A는 합격을 60/100 = 0.6의 확률로 주었고, 불합격을 40/100 = 0.4의 확률로 주었음
평가자 B : 합격을 50번, 불합격을 50번 주었음. 즉 평가자A는 합격을 50/100 = 0.5의 확률로 주었고, 불합격을 50/100 = 0.5의 확률로 주었음
평가자A와 평가자 B모두 확률적으로 "합격"을 줄 확률 = 0.6 x 0.5 = 0.3
평가자A와 평가자 B모두 확률적으로 "불합격"을 줄 확률 = 0.4 x 0.5 = 0.2
Pr(e)는 데이터로부터 계산된 확률적으로 일치할 확률이므로 이 둘을 더해 0.3 + 0.2 = 0.5 이다.
kappa = (Pr(a) - Pr(e)) / (1-Pr(e)) = (0.7 - 0.5) / (1-.0.5) = 0.4
카파통계량을 보아 보통 일치한다고 볼 수 있음.
예제1. 스펨메일 분류 모델의 카파 통계량을 구하시오.
# R
sms_result <- read.csv("c:\\data\\sms_results.csv")
head(sms_result)
install.packages("vcd")
library(vcd)
table(sms_result$actual_type, sms_result$predict_type)
Kappa(table(sms_result$actual_type, sms_result$predict_type))
카파통계량 = 0.8825로 매우 좋은 일치를 보이고 있음
예제2. 아래의 혼동행렬에서 카파통계량은 얼마인가?
예측 | ||||
실 제 |
False | True | ||
False | 70 | 30 | 100 | |
True | 40 | 60 | 100 | |
110 | 90 | 200 |
a <- as.table(matrix(c(70,30,40,60), byrow = T, nrow = 2, ncol = 2))
a
Kappa(a)
> 카파통계량이 0.3으로 어느정도 일치함
예제3. sms_results.csv의 actual_type과 predict_type간의 카파통계량을 파이썬으로 구하시오.
# python
import pandas as pd
sms_result = pd.read_csv("c:\\data\\sms_results.csv")
sms_result.head()
from sklearn.metrics import cohen_kappa_score
cohen_kappa_score(sms_result.actual_type, sms_result.predict_type) #0.8825202721955789
문제418. iris2.csv의 데이터를 파이썬으로 불러와서 iris 품종을 분류하는 knn 모델을 만들고 정확도를 확인하시오.
#1. 데이터 로드
import pandas as pd
iris = pd.read_csv("c:\\data\\iris2.csv")
iris.head()
#2. 결측치 확인
iris.isnull().sum()
#3. 데이터 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x = iris.iloc[:,:-1]
y = iris.iloc[:,-1]
x_scaled = scaler.fit_transform(x)
#4. 훈련데이터, 테스트 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.3, random_state = 1)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape ) #(135, 4) (15, 4) (135,) (15,)
#5. 모델생성 및 훈련
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors = 5)
model.fit(x_train, y_train)
#6. 모델 예측
result = model.predict(x_test)
result
#7. 정확도 확인
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, result)
accuracy #0.9555555555555556
문제419. 위의 결과의 카파통계량을 구하시오.
from sklearn.metrics import cohen_kappa_score
cohen_kappa_score(y_test, result) #0.9326347305389222
정확도 외에 다른 성능척도도 같이 확인해야함. 그 중 첫번째가 kappa 통계량이었음 = 두 평가자의 일치도
TP + TN
정확도 = ------------------------------
TP + TN + FP + FN
(porsitive = 관심범주)
예측이 정확한 경우 : TP(True Positive) > 실제값 positive, 예측값 positive
TN(True Negative) > 실제값 negative, 예측값 negative
예측이 틀린 경우 : FP(False Positive) > 실제값 negative, 예측값 positive
FN(False Negative) > 실제값 positive, 예측값 negetive
TP > (관심범주를) 관심범주(positive)로 잘(True) 예측했다.
TN > (관심범주가 아닌 것을) 관심범주가 아닌 것(negative)로 잘(True) 예측했다.
FP > (관심범주가 아닌 것을) 관심범주(positive)로 잘못(False) 예측했다.
FN > (관심범주를) 관심범주가 아닌 것(negative)로 잘못(False) 예측했다.
문제420. 아래의 예측값과 실제값과의 카파 통계량을 파이썬으로 구하시오.
y_true = [2,0,2,2,0,2]
y_pred = [0,0,2,2,0,2]
from sklearn.metrics import cohen_kappa_score
cohen_kappa_score(y_true, y_pred) #0.6666666666666667
'Study > class note' 카테고리의 다른 글
머신러닝 / 홀드아웃, k-fold, caret 자동튜닝 (0) | 2022.03.04 |
---|---|
머신러닝 / 민감도와 특이도, 정밀도와 재현율, F-1 score, ROC곡선 (0) | 2022.03.03 |
머신러닝 / k-means 함수를 파이썬으로 직접 만들기 (0) | 2022.03.02 |
머신러닝 / 파이썬으로 k-means 모델 만들기2 (0) | 2022.03.02 |
머신러닝 / k-means 이론, R 로 k-means 모델 만들기, 파이썬으로 k-means 모델 만들기 (0) | 2022.02.28 |