본문 바로가기

Study/class note

머신러닝 / 모델 성능 평가(카파통계량)

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
반응형