Kappa係数のメモ
Kappa係数
Kaggle Courseraの評価指標のセクションでKappa係数が出てきました。
検索しても中々情報が出てきませんが、最近だとQuadratic Weighted KappaがPetFinder.my Adoption Prediction | Kaggle で評価指標になっています。
一見すると統計検定2級くらいの知識っぽいですが、勉強した記憶がなかったのでメモ的にまとめてみました
*あくまでもメモです
定義
- :一致率
- :偶然の一致率
カッパ係数 kappa coefficient ある現象を2人の観察者が観察した場合の結果がどの程度一致しているかを表す統計量。カッパ統計量や一致率とも言う。0から1までの値をとり、値が大きいほど一致度が高いといえる。カッパ係数 | 統計用語集 | 統計WEB
計算手順
ある二人の医師(A, B)が患者の病気の診断を行うとする。患者40人をそれぞれが診断した結果は以下になった
A\B | NO | YES | |
NO | 20 | 4 | 24 |
YES | 4 | 12 | 16 |
24 | 16 |
医師Aと医師BのNOでの一致患者が20人でYESでの一致患者が12人という想定です
単純な一致率はYESとNOが一致した割合で対角成分から以下のように求めることができます
次にAとBの診断がたまたま一致するような期待度を求める。
例えばYESで考えるとAは16/40でYESと診断し、Bも16/40でYESと診断するので
くらいの人数が一致するであろうと考えられる。同様にして他も計算すると
A\B | NO | YES | |
NO | 14.4 | 9.6 | 24 |
YES | 9.6 | 6.4 | 16 |
24 | 16 |
よって偶然の一致率は
Kappa係数の定義より
となる。
つまりKappa係数とは偶然一致することが期待される分を除いた残りがどれくらいの割合で一致したかを計算した値であるといえそうです
Pythonで計算
cohen_kappa_score
メソッドを使えば計算できます。
confusion_matrix
で集計表と同じ結果がでることも確認しておきます。
import numpy as np from sklearn.metrics import confusion_matrix, cohen_kappa_score A = np.array([0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]) B = np.array([0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1]) confusion_matrix(A, B) '''output array([[20, 4], [ 4, 12]]) ''' cohen_kappa_score(A, B) '''output 0.5833333333333333 '''
重み付きkappa係数
例として患者の状態を良いを0として0(良),1(普通),2(悪)のように多段階評価している場合を考えます
- Aが患者に0(良)の評価を与えて、Bが患者に1(普通)の評価を与えたとき
- Aが患者に0(良)の評価を与えて、Bが患者に2(悪)の評価を与えたとき
を全く同じ一致として考えることは正しいと思えません。
つまり遠い一致になったときはペナルティーを与えて調整する必要があります。
例として以下の集計表を考えます
A\B | 0 | 1 | 3 | |
0 | 5 | 5 | 1 | 11 |
1 | 4 | 10 | 3 | 17 |
3 | 5 | 1 | 6 | 12 |
14 | 16 | 10 | 40 |
偶然の一致も2x2と同様に計算します
A\B | 0 | 1 | 3 | |
0 | 3.85 | 4.4 | 2.75 | 11 |
1 | 5.95 | 6.8 | 4.25 | 17 |
3 | 4.2 | 4.8 | 3 | 12 |
14 | 16 | 10 | 40 |
重みの考慮はいろいろあるようですが、scikit-learnの実装では以下のように計算されています。
i, jはセルの位置
2乗で重みをとったのでQuadratic Weighted Kappaと呼ばれるそうです。そして一般的に重み付きといったらQuadratic Weighted Kappaを指すようです。
A\B | 0 | 1 | 3 |
0 | 0 | 1 | 4 |
1 | 1 | 0 | 1 |
3 | 4 | 1 | 0 |
この重みとそれぞれのマトリックスの要素の積をとり、以下のように計算します
xは実際の一致で、mが偶然の一致
Pythonでの計算
cohen_kappa_score
でweights='quadratic'
と指定すれば簡単に計算できます。
A = array([1, 1, 1, 1, 0, 0, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 1, 0, 2, 0, 1, 2, 1, 0, 1, 2, 2, 1, 0, 1, 0]) B = array([1, 1, 1, 1, 0, 0, 2, 0, 1, 2, 0, 1, 1, 2, 2, 2, 2, 1, 1, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 0, 2, 1, 2, 1, 1]) confusion_matrix(A, B) '''output array([[ 5, 5, 1], [ 4, 10, 3], [ 5, 1, 6]]) ''' cohen_kappa_score(A, B, weights='quadratic') '''output 0.21610169491525433 '''
2x2の場合は対角線上の要素でKappa係数を計算しているので直感的で分かりやすいです。
重み付きKappa係数の場合は対角成分を0にして一致していない要素で不一致率を出して、1から引くことで一致率としているイメージでしょうか?
いろいろ調べましたが、よく分かりませんでした。 詳しい方がいたらコメント等で指摘いただけると勉強になります。おわり。