Location : Home > Languages > Perl > Package Title : Statistics::Contingency |
![]() |
Statistics::Contingency - 分割表による分析
use Statistics::Contingency; my $s = new Statistics::Contingency(categories => \@all_categories); while (...something...) { ... $s->add_result($assigned_categories, $correct_categories); } print "Micro F1: ", $s->micro_F1, "\n"; # 個々の統計量にアクセス print $s->stats_table; # 統計量を表に出力
Statistics::Contingency クラスは2×2分割表(2x2 contingency tables)に基づく統計量の計算に有効である。筆者はこれらの方法を自動テキスト分類試験の結果を判定するのに用いているが、他の局面でも利用で着るであろう。
オブジェクトにおける全ての結果の束を考え、そのうち興味のあるものだけを探索するというのが一般的な用法である。全ての結果が集められれば、その正確度(accuracy)・精度(precision)・再現率(recall)・F1値などについてレポートを取得でき、カテゴリ全体にわたるマクロ平均・ミクロ平均を求めることができる。
マクロ統計 vs. ミクロ統計
本モジュールにおける全ての統計量はまず各カテゴリにおいて計算されその後に平均をとるか、全カテゴリにわたって計算してから平均するかのどちらかである。前者はマクロ平均(特にカテゴリごとのマクロ平均)と呼ばれ、後者はミクロ平均(micro-averaging)と呼ばれる。2つの方法は結果に影響を与える。マクロ平均は大きなカテゴリの振る舞いを過大評価する傾向があり、ミクロ平均は小さなカテゴリの振る舞いを過大評価する傾向がある。双方を見てデータがカテゴリにわたってどのように分布しているかを判断するのが最良の方法である。
利用可能な統計量
全ての統計量は以下に示す、いわゆる分割表に基づいて計算される。
Correct=Y Correct=N +-----------+-----------+ Assigned=Y | a | b | +-----------+-----------+ Assigned=N | c | d | +-----------+-----------+
a, b, c, d は割り当てられたカテゴリに正しくまたは間違って割り振られた要素数を示す。マクロ統計かミクロ統計かによってこれらの数値はカテゴリ別か全結果集合かで計算される。
以下の統計量が利用可能である。
accuracy
全決定に対し正しい決定であった要素の比率で、(a + d) / (a + b + c + d) で計算される。値は 0 から1 の間であり、最良の値は 1 である。
マクロ正確度(macro-accuracy)もミクロ正確度(micro-accuracy)も常に同じ値を示す。
error
全決定に対し誤った決定であった要素の比率で、(b + c) / (a + b + c + d) で計算される。値は 0 から1 の間であり、最良の値は 0 である。
マクロ誤差(macro-error)もミクロ誤差(micro-error)も常に同じ値を示す。
precision
正しかった決定が正しいカテゴリに含まれる要素の比率で、a / (a + b) で計算される。値は 0 から1 の間であり、最良の値は 1 である。
recall
割り当てられたカテゴリに対し正しいカテゴリに含まれる要素の比率で、a / (a + c) で計算される。値は 0 から1 の間であり、最良の値は 1 である。
F1
この値は精度と再現率の組み合わせであり、2 * p * r / (p + r) で計算される。 In terms of a, b, c を用いれば 2*a / (2*a + b + c) と書ける。値は 0 から1 の間であり、最良の値は 1 である。
ゼロカテゴリに割り当てることにより完全な精度を得るか常にあらゆるカテゴリによる完全な再現率を得ることを考えれば、F1 値は最大化するに足る唯一の指標である。真に優秀なシステムであれば正しいカテゴリにのみ割り当て、精度と再現率を同時に最大化するのでF1 値を最大化する。
正確度を最大化すべきときもあるが、正確度は(反対は誤差であるが)カテゴリ化の振る舞いに関してあまり多くの情報を得られないという意味では不十分な指標である。
Statistics::Contingency オブジェクトを生成するためにこのクラスを用い、結果の束を追加し、結果をレポートするというのが一般的な実行の流れである。
$e = Statistics::Contingency->new()
新しい Statistics::Contingency オブジェクトを返す。試行中に割り当てるべき全カテゴリを指定するために categories パラメータを指定することができる。また verbose パラメータを指定することができる。もし true であれば途中経過を出力する。
$e->add_result($assigned_categories, $correct_categories, $name)
新しい結果を追加する。割り当てられたカテゴリ及び正しいカテゴリはカテゴリ名称(文字列)の配列として、またはキーがカテゴリ名で値が論理的に真であるハッシュとして、またはカテゴリが1つしかなければ1つの文字列として与えられる。
既にハッシュでリストを取得している場合は、最も速く処理することができる。そうでなければ効果的に処理するために内部的にハッシュに変換するよう実装されている。
$name パラメータはこの結果に対するオプションの名称である。エラーメッセージやデバッグ/進捗状況の出力のときにのみ利用される。
現在の実装では、カテゴリーごとに分割表を保持しており、結果全体を保持している。このため Statistics::Contingency オブジェクトから指定した部分の結果情報のみを取得することはできない。
$e->micro_accuracy
データセットのミクロ平均正確度を返す。
$e->micro_error
データセットのミクロ平均誤差を返す。
$e->micro_precision
データセットのミクロ平均精度を返す。
$e->micro_recall
データセットのミクロ平均再現率を返す。
$e->micro_F1
データセットのミクロ平均 F1 値を返す。
$e->macro_accuracy
データセットのマクロ平均正確度を返す。
$e->macro_error
データセットのマクロ平均誤差を返す。
$e->macro_precision
データセットのマクロ平均精度を返す。
$e->macro_recall
データセットのマクロ平均再現率を返す。
$e->macro_F1
データセットのマクロ平均 F1 値を返す。
$e->stats_table
いくつかの統計量を1つの表で返す。
正確度は 1 - 誤差 であるのでスペースの削減のために誤差のみを出力する。引数としてオプションで有効桁数を指定できる。デフォルトは 3 桁である。
$e->category_stats
キーが各カテゴリ名で値が統計値(正確度・誤差・精度・再現率・F1 値)であるようなハッシュ参照を返す。例えば1統計量を出力するには以下のように記述する。
print $e->category_stats->{sports}{recall}, "\n";
または全てのカテゴリについてある統計量を出力するには以下のように記述する。
my $stats = $e->category_stats; while (my ($cat, $value) = each %$stats) { print "Category '$cat': \n"; print " Accuracy: $value->{accuracy}\n"; print " Precision: $value->{precision}\n"; print " F1: $value->{F1}\n"; }
Ken Williams, <kenw@ee.usyd.edu.au>
Copyright 2002 Ken Williams. All rights reserved.
本ディストリビューションはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。
![]() |
Updated : 2007/04/26 |