[데이터 제작] 데이터 품질 평가 방법 - IAA 평가

임수정·2022년 4월 19일
1

데이터제작

목록 보기
1/1

작업자간 일치도(IAA, Inter-Annotator Agreement)

모델이 학습할 수 있을만큼 충분한 양의 데이터를 제작하기 위해서는 혼자가 아닌 여럿이서 함께 데이터를 제작해야만 할 것이다.
하지만 데이터 제작 및 레이블링 과정에서는 사람의 주관이 들어가는 경우가 많고,
모호한 레이블링 기준으로 인해 사람마다 약간씩 다른 기준으로 레이블링을 진행했을 수 있다.

이러한 실수 또는 데이터 레이블링 방식의 차이를 확인하고,
레이블링 후 데이터의 품질을 확인하기 위해 작업자간에 레이블링을 얼마나 비슷한 기준으로 했는지를 평가하는 방법이 바로 작업자간 일치도(IAA)평가이다.

IAA는 여러가지 방법으로 평가될 수 있겠지만 대표적인 방법으로는 크게 두 가지가 존재한다.

1. Kappa 계수

1) Cohen's Kappa

  • Cohen이 1968년에 제안한 계수

  • 두 관찰자 간의 측정 범주 값에 대한 일치도(agreement)를 측정하는 방법

  • 두 관찰자 사이의 일치도 : Cohen's Kappa / 세 관찰자 이상 일치도 : Fleiss Kappa

  • Cohen's Kappa계수를 사용할 경우 자료의 조건

    • 명목 척도 또는 서열 척도로 측정된 범주형 데이터이어야 함
    • 검사자(혹은 검사 방법) 내의 범주는 반드시 동일해야 함
    • 두 평가자에게 모두 관측된 데이터이어햐 함
    • 두 평가자는 서로 독립
  • Cohen's Kappa 계수 공식 :
    PoP_o가 '2명의 평가자 간 일치 확률'이고,
    PeP_e가 ' 우연히 두 평가자에 의하여 일치된 평가를 받을 비율'이라고 하면, κκ값은 다음과 같이 구해진다.

    κ=PoPe1Peκ = \frac{P_o - P_e}{1-P_e}

  • 예시)

    • 아래와 같이 긍정/부정 데이터를 평가자 A와 B가 레이블링을 진행했다고 하자.

    • '2명의 평가자 간 일치 확률'='둘 다 같은 레이블을 고른 경우의 비율'은 다음과 같다.

      Po=20+1520+5+10+15=0.7P_o = \frac{20+15}{20+5+10+15} = 0.7

    • '우연히 두 평가자에 의하여 일치된 평가를 받을 비율'(PeP_e)를 구하기 위해서는 각 평가자의 긍정 확률값과 부정 확률값을 구해야 한다.

      • 평가자 A의 긍정 확률값

        PA,Yes=A가긍정이라고한개수전체개수=20+520+5+10+15=0.5P_{A,Yes} = \frac{A가 긍정이라고 한 개수}{전체 개수} = \frac{20+5}{20+5+10+15}=0.5

      • 평가자 A의 부정 확률값
        PA,No=A가부정이라고한개수전체개수=10+1520+5+10+15=0.5P_{A,No} = \frac{A가 부정이라고 한 개수}{전체 개수} = \frac{10+15}{20+5+10+15} = 0.5

      • 평가자 B의 긍정 확률값
        PB,Yes=B가긍정이라고한개수전체개수=20+1020+5+10+15=0.6P_{B,Yes} = \frac{B가 긍정이라고 한 개수}{전체 개수} = \frac{20+10}{20+5+10+15} = 0.6

      • 평가자 B의 부정 확률값
        PB,No=B가부정이라고한개수전체개수=5+1520+5+10+15=0.4P_{B,No} = \frac{B가 부정이라고 한 개수}{전체 개수} = \frac{5+15}{20+5+10+15} = 0.4

      • 따라서 평가자 A와 B가 동시에 긍정으로 레이블링할 확률(PYesP_{Yes})은 다음과 같다.
        PYes=PA,YesPB,Yes=0.50.6=0.3P_{Yes} = P_{A,Yes} * P_{B,Yes} = 0.5 * 0.6 = 0.3

      • 또한 평가자 A와 B가 동시에 부정으로 레이블링할 확률(PNoP_{No})은 다음과 같다.
        PNo=PA,NoPB,No=0.50.4=0.2P_{No} = P_{A,No} * P_{B,No} = 0.5 * 0.4 = 0.2

      • '우연히 두 평가자에 의하여 일치된 평가를 받을 비율'(PeP_e)은 '우연히 두 평가자 모두 긍정을 줄 확률'과 '우연히 두 평가자 모두 부정을 줄 확률'을 더한 것이므로
        Pe=PYes+PNo=0.3+0.2=0.5P_e = P_{Yes} + P_{No} = 0.3 + 0.2 = 0.5이다.

    • 따라서 Cohen's Kappa 계수는

      κ=PoPe1Pe=0.70.510.5=0.4κ = \frac{P_o - P_e}{1-P_e} = \frac{0.7-0.5}{1-0.5} = 0.4이다.

  • Cohen's Kappa 계수 등급

2) Fleiss Kappa(TACRED)

  • Cohen's Kappa 계수가 '두 관찰자 사이의 일치도'를 평가하는 척도인 반면, Fleiss Kappa는 세 관찰자 이상 존재할 때에도 일치도를 평가할 수 있는 척도이다.

  • Kappa 계수를 구하는 식은 Cohen's Kappa와 동일하지만, 평가자가 늘어나면서 Pˉ\bar{P}Peˉ\bar{P_{e}}를 구하는 식이 달라진다.
    κ=PˉPeˉ1Peˉ\kappa ={\frac {{\bar {P}}-{\bar {P_{e}}}}{1-{\bar {P_{e}}}}}

  • 여기에서 Pˉ\bar{P}는 '데이터에 대해 평가자들이 일치하는 정도'의 평균을 의미하고, Peˉ\bar {P_{e}}는 '우연히 작업자 간 동일한 범주로 평가할 확률'을 의미한다. 각각에 대해 필요한 식을 하나씩 정리해보자.

  • NN이 'total number of subjects(평가해야 할 대상, 데이터 개수)'이고, nn이 '평가자 인원수(각 데이터 별 평가 개수)', 그리고 kk가 'labeling 범주의 개수(category 종류의 개수)'라고 하자.

  • 또한 i=1,...,Ni=1, ..., Nii번째 데이터를 의미하고, j=1,...,kj=1,...,kjj번째 category를 의미하며,
    nijn_{ij}ii번째 데이터를 jj번째 범주로 분류한 평가자의 수를 의미한다.

  • 먼저, Peˉ\bar {P_{e}}('우연히 작업자 간 동일한 범주로 평가할 확률')을 구해보자.

    • 우선 jj 번째 범주로 분류된 데이터의 비율을 구한다면 식은 아래와 같다.

      pj=범주가 j인 셀의 값의 합표의 각 셀 값의 총합=1Nni=1Nnij,1=j=1kpj{\displaystyle p_{j}=\frac{범주가\ j인 \ 셀의\ 값의\ 합}{표의 \ 각 \ 셀\ 값의\ 총합}= {\frac {1}{Nn}}\sum _{i=1}^{N}n_{ij},\quad \quad 1=\sum _{j=1}^{k}p_{j}}

    • 이러한 범주는 총 kk개 존재하므로 우리는 Peˉ\bar {P_{e}}를 다음과 같이 구할 수 있을 것이다.

      Peˉ=j=1kpj2{\displaystyle {\bar {P_{e}}}=\sum _{j=1}^{k}p_{j}^{2}}

  • 다음으로, Pˉ\bar{P}('데이터에 대해 평가자들이 일치하는 정도'의 평균)을 구해보자.

    • ii번째 데이터에 대해 평가자들이 일치하는 정도를 구하는 식은 다음과 같다.

      Pi=범주가일치하는평가자쌍의경우의수가능한모든평가자쌍의경우의수{\displaystyle P_{i} = \frac{범주가 일치하는 평가자 쌍의 경우의 수}{가능한 모든 평가자 쌍의 경우의 수}}

      =1nP2j=1knijP2{\displaystyle = {\frac {1}{_{n}\mathrm{P}_{2}}}\sum _{j=1}^{k}{_{n_{ij}}\mathrm{P}_{2}}}

      =1n(n1)j=1knij(nij1){\displaystyle = {\frac {1}{n(n-1)}}\sum _{j=1}^{k}n_{ij}(n_{ij}-1)}

      =1n(n1)j=1k(nij2nij){\displaystyle={\frac {1}{n(n-1)}}\sum _{j=1}^{k}(n_{ij}^{2}-n_{ij})}

      =1n(n1)[(j=1knij2)(n)]{\displaystyle ={\frac {1}{n(n-1)}}\left[\left(\sum _{j=1}^{k}n_{ij}^{2}\right)-(n)\right]}

    • Pˉ\bar{P}는 각 데이터에 대한 평가자의 일치도인 PiP_{i}의 평균에 해당되므로 아래와 같이 표현된다.

      Pˉ=1Ni=1NPi{\bar {P}}={\frac {1}{N}}\sum _{{i=1}}^{N}P_{{i}}

      =1Nn(n1)(i=1Nj=1knij2Nn)=1Nn(n1)(i=1Nj=1knij2Nn){\displaystyle ={\frac {1}{Nn(n-1)}}\left(\sum _{i=1}^{N}\sum _{j=1}^{k}n_{ij}^{2}-Nn\right)}{\displaystyle ={\frac {1}{Nn(n-1)}}\left(\sum _{i=1}^{N}\sum _{j=1}^{k}n_{ij}^{2}-Nn\right)}

  • 예시) 14명(nn)의 평가자(데이터 제작자)가 있고, 총 10개(NN)의 데이터를 레이블링한다고 하자. 구분할 범주의 개수는 5개(kk)이다.

    • N=10,n=14,k=5N = 10, n=14, k=5

    • (표의 각 셀 값의 총합) = 14 * 10 = 140

    • 첫번째 카테고리로 분류된 경우의 비율
      p1=0+0+0+0+2+7+3+2+6+0140=0.143p_{1}=\frac{0+0+0+0+2+7+3+2+6+0}{140}=0.143

    • 2번째 데이터에서 평가자(데이터 제작자)가 일치하는 정도

      P2=114(141)(02+22+62+42+2214)=0.253P_{2}=\frac{1}{14(14-1)}\left(0^{2}+2^{2}+6^{2}+4^{2}+2^{2}-14\right)=0.253

    • Pˉ{\bar{P}}을 구하기 위해 PiP_{i}의 합을 구한다.

      i=1NPi=1.000+0.253++0.286+0.286=3.780\sum _{{i=1}}^{N}P_{{i}}=1.000+0.253+\cdots +0.286+0.286=3.780

    • 최종적으로 Kappa 계수를 구하면 다음과 같다.

      Pˉ=1(10)(3.780)=0.378{\bar {P}}={\frac {1}{(10)}}(3.780)=0.378

      Pˉe=0.1432+0.2002+0.2792+0.1502+0.2292=0.213{\displaystyle {\bar {P}}_{e}}{\displaystyle =0.143^{2}+0.200^{2}+0.279^{2}+0.150^{2}+0.229^{2}=0.213}

      κ=0.3780.21310.213=0.210κ=0.3780.21310.213=0.210{\displaystyle \kappa ={\frac {0.378-0.213}{1-0.213}}=0.210}\kappa ={\frac {0.378-0.213}{1-0.213}}=0.210

  • Fleiss' Kappa 계수 등급은 다음과 같이 표현된다. (Cohen's Kappa 계수 등급과 동일하다.)

  • 코드(https://github.com/Shamya/FleissKappa/blob/master/fleiss.py)

    def fleissKappa(rate,n):
      """ 
      Computes the Kappa value
      @param rate - ratings matrix containing number of ratings for each subject per category 
      [size - N X k where N = #subjects and k = #categories]
      @param n - number of raters   
      @return fleiss' kappa
      """
    
      N = len(rate)
      k = len(rate[0])
      print("#raters = ", n, ", #subjects = ", N, ", #categories = ", k)
      checkInput(rate, n)
    
      #mean of the extent to which raters agree for the ith subject 
      PA = sum([(sum([i**2 for i in row])- n) / (n * (n - 1)) for row in rate])/N
      print("PA = ", PA)
      
      # mean of squares of proportion of all assignments which were to jth category
      PE = sum([j**2 for j in [sum([rows[i] for rows in rate])/(N*n) for i in range(k)]])
      print("PE =", PE)
      
      kappa = -float("inf")
      try:
          kappa = (PA - PE) / (1 - PE)
          kappa = float("{:.3f}".format(kappa))
      except ZeroDivisionError:
          print("Expected agreement = 1")
    
      print("Fleiss' Kappa =", kappa)
      
      return kappa

2. Krippendorff's α\alpha(KLUE)

  • Krippendorff에 의해 제안된 평가자 간 신뢰도를 측정하는 통계적 측정값이다.
  • 코더 간 일치 측정, 평가자 간 신뢰도, 주어진 단위 세트에 대한 코딩(레이블링) 신뢰도 등에 사용
profile
유쾌하게, 열정적으로, 진심을 다해

1개의 댓글

comment-user-thumbnail
2022년 4월 22일

이거 설명을 들엉하는데요 수정님!?!?!?!?!?ㅎ_ㅎ

답글 달기