【HuggingFace Evaluate】機械学習に役立つ48の評価指標を数行で簡単に利用できるライブラリを解説!
HuggingFace社が新しいライブラリであるEvaluateを発表していたので、利用できる評価指標を利用例とともにまとめてみました。
Evaluateとは、モデルの評価や比較・性能の報告をより単純に、より標準的に行うためのライブラリです。
また、Hugging face Hubにアップロードし、共有する機能もあります。
もしかしたら、評価指標を使うとなったらEvaluateライブラリがスタンダードになるかもしれませんね。
~どのような評価指標が使えるかについて~
分類問題、多クラス分類、自然言語処理などで役に立つ、精度(accuracy)・適合率(precision)・再現率(recall)・F値・BLEUなど代表的なものからPerplexity・RL Reliability・ROUGEなど詳しくないとなかなか聞かないものまで揃っています。
目次を開くと評価指標が出てくるので、そこから目的の指標を探してください。
アルファベット順に並べています。
インストール・インポート方法
このライブラリはインストールが必要です。
以下のコードで簡単にインストールすることができます。
# evaluateをインストール
pip install evaluate==0.1.0
ついでにインポートもしておきましょう。
# evaluateをインポート
import evaluate
モジュールのタイプ分類
Evaluateは、様々な評価モジュールへアクセスできます。
モデルやデータセットを評価するツールだけでなく、テキスト、コンピュータビジョン、オーディオなど、様々な形式に対応しています。
これらのモジュールは「Metric」「Comparison」「Measurement」の3つのカテゴリに分類されます。(異なるカテゴリに同じ評価指標が含まれる場合もあります。)
それぞれのモジュールにおけるoutputsについては、意味が明らかでない場合のみ説明しています。
基本的には、「モジュールの説明」「inputsの説明」「注意点」で構成されています。
Metric一覧
metricは、モデルの性能を評価するために使われ、通常、モデルの予測値と正解ラベルが含まれます。すべてのMetricはevaluate-metricで見ることができます。
また、metric一覧は次のコードでも見ることができます。
evaluate.list_evaluation_modules(
# モジュールのタイプをmetricに指定
module_type="metric",
# コミュニティモジュールを除く
include_community=False,
# 詳細を表示
with_details=True)
では、それぞれのmetricの説明と使い方を見ていきます。
Accuracy
accuracyは、処理されたケースの中で正しく予測された割合です。
inputs
- references
-
正解ラベルが入ったリスト
- predictions
-
予測ラベルが入ったリスト
- normalize
-
Falseに設定された場合、正しく分類されたサンプルの数を返す
Trueの場合は、正しく分類されたサンプルの割合を返す
デフォルトはTrue - sample_weight
-
サンプルの重み付けをリストで与える
デフォルトはNone
利用例
"""case1 シンプルな例"""
# accuracyモジュールの読み込み
accuracy_metric = evaluate.load("accuracy")
# referencesに正解、predictionsに予測を入れてaccuracyを求める
results = accuracy_metric.compute(references=[0, 1], predictions=[0, 1])
print(results)
# {'accuracy': 1.0}
"""case2 normalinzeをFalseにセット"""
accuracy_metric = evaluate.load("accuracy")
# 正しく分類されたサンプルの数を返す
results = accuracy_metric.compute(references=[0, 1, 2, 0, 1, 2], predictions=[0, 1, 1, 2, 1, 0], normalize=False)
print(results)
{'accuracy': 3.0}
"""case3 sample_weightをセット"""
accuracy_metric = evaluate.load("accuracy")
# 分類が間違った時のペナルティの度合いが調整されたaccuracyを返す
results = accuracy_metric.compute(references=[0, 1, 2, 0, 1, 2], predictions=[0, 1, 1, 2, 1, 0], sample_weight=[0.5, 2, 0.7, 0.5, 9, 0.4])
print(results)
{'accuracy': 0.8778625954198473}
Accuracyは、クラスごとのデータ数が偏っている場合、モデルが高頻度のクラスだけを正解だと予測していると高い性能があるように誤解を与える可能性があります。なので、他の指標と組み合わせて実際にモデルがどの程度うまく機能しているかを判断する必要があります。
BERT Score
BERT Scoreは、BERTから事前に学習された文脈埋め込みを活用し、コサイン類似度によって候補文と参照文の単語を照合します。文レベル、システムレベルの評価において、人間の判断と相関があることが示されており、さらに、BERTScoreは、precision、recall、F1を計算し、異なる言語生成タスクの評価に有用です。
# bertscoreモジュールの読み込み
bertscore = evaluate.load("bertscore")
とここで、次のようなエラーが出ました。
ImportError: To be able to use bertscore, you need to install the following dependencies['bert_score'] using 'pip install bert_score' for instance'
bert_scoreをインストールしておく必要があるみたいです。
プロンプトを開いて次のコードを実行しておきましょう。
# bert_scoreをインストール
pip install bert_score
inputs
- predictions
-
候補文の文字列のリスト
- references
-
文字列のリスト、または参照文の文字列のリストのリスト
- model_type or lang
-
model_type:BERT仕様に従って、使用するモデルを指定する文字列
どんなmodel_typeを選択できるかはこちらを参照してください。rinna/japanese-roberta-baseでできないかなと思ったけどそのままでは無理です。改変すればいけそうなので、ローカルでやってみようかな。
lang:文の言語を示す2文字の文字列(日本ならja)
どちらかを設定すればいいです。
デフォルトの設定では、ターゲットの言語の推奨モデルが指定されている場合はそれを使用し、そうでない場合は示されたmodel_typeを使用します。
日本語の場合は、multilingual bertがデフォルトっぽいです。その関係でトークン化があまり丁寧な方法では行っていなさそうです。詳しくはこちらをご覧ください。
以下の引数は設定しなくてもいいです。
- num_layers
-
使用する層の数
model_typeに依存する
- verbose
-
:中間状態の更新をオンにする
デフォルトはFalse - idf
-
idfの重み付けを使用する
事前に計算されたidf_dictを使用することもできる - device
-
cudaが利用できるなら設定します。
- nthreads
-
計算に使用するスレッドの数
- rescale_with_baseline
-
BERTScoreを事前に計算されたベースラインで再スケールする
デフォルトはFalse - batch_size
-
BERTScoreの処理バッチサイズ
- baseline_path
-
カスタマイズされたベースライン・ファイルへのパス
- use_fast_tokenizer
-
hugging faceのトークナイザーに渡されるuse_fastパラメータ。デフォルトはFalse。
利用例
"""case1 シンプルな例"""
# bertscoreモジュールの読み込み
bertscore = evaluate.load("bertscore")
predictions = ["I have an apple"]
references = ["I have a pen"]
# model_typeにdistilbert-base-uncasedを設定
results = bertscore.compute(predictions=predictions, references=references, model_type="distilbert-base-uncased")
# 結果を表示
print(results)
# {'precision': [0.8849452137947083], 'recall': [0.8849452137947083],
# 'f1': [0.8849452137947083], 'hashcode': 'distilbert-base-uncased_L5_no-idf_version=0.3.11(hug_trans=4.11.0.dev0)'}
"""case2 日本語の例"""
bertscore = evaluate.load("bertscore")
predictions = ["私は猫が好きである"]
references = ["よろしくお願いいたします。"]
# langにjaを設定
results = bertscore.compute(predictions=predictions, references=references, lang="ja")
# 結果を表示
print(results)
# {'precision': [0.6896750926971436], 'recall': [0.68590247631073], 'f1': [0.6877835988998413],
# 'hashcode': 'bert-base-multilingual-cased_L9_no-idf_version=0.3.11(hug_trans=4.11.0.dev0)'}
モデルを評価するための完璧な評価基準というのは存在しないと思います。だからこそ、いろいろと試行錯誤がなされているので、その試行錯誤を追うのも悪くないと思います。bert scoreについて詳しく知りたい方は、こちらのオリジナルの論文を読んでみてください。
オリジナルの論文では、BERTScoreは、文レベルおよびシステムレベルの評価において人間の判断と良い相関があることを示しましたが、これは選択したモデルおよび言語ペアに依存します。
BLEU
BLEU(Bilingual Evaluation Understudy)とは、ある自然言語から別の自然言語に機械翻訳されたテキストの品質を評価するためのアルゴリズムです。機械翻訳がプロの人間の翻訳に近ければ近いほど優れていることがBLEUの中心的な考え方です。BLEUは、人間が判断する品質と高い相関性を持つことを主張した最初の測定基準の1つであり、現在でも最も人気のある自動化された安価な測定基準の1つです。
inputs
- predictions
-
翻訳された文章を入れたリスト
- references
-
翻訳の正解が入ったリスト
- tokenizer
-
どのように文章を分けるかを決めた関数を渡す感じ
- max_order
-
計算する際に使用するn-gramの最大次数。デフォルトは4
- smooth
-
スムージングを適用するかどうか。デフォルトはFalse
outputs
- bleu
-
bleuのスコア
- precisions
-
n-gram precisions の幾何平均
- brevity_penalty
-
簡易化のペナルティ
- length_ratio
-
長さの比率
- translation_length
-
翻訳文の長さ
- reference_length
-
正解文の長さ
利用例
"""日本語に翻訳した時の例"""
# bleuモジュールの読み込み
bleu = evaluate.load("bleu")
predictions = ["私はこれまでのコメントを削除しました。"]
references = ["私はこれまでのコメントを削除しました。"]
# 適当にtokenizerを探したらこれが見つかったので使ってみる
# transformersはインストールが必要
from transformers import T5Tokenizer
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base")
tokenizer.do_lower_case = True
results = bleu.compute(predictions=predictions, references=references, tokenizer=tokenizer.tokenize)
# 結果を出力
print(results)
# {'bleu': 1.0, 'precisions': [1.0, 1.0, 1.0, 1.0], 'brevity_penalty': 1.0,
# 'length_ratio': 1.0, 'translation_length': 9, 'reference_length': 9}
BLEUは、異なるデータセット間や、異なる言語間で比較できるものではありません。
また、BLEUは意味を比較するのではなく、予測値と参照値のトークンの重なりを比較しています。このため、BLEUのスコアと人間の評価との間に不一致が生じることがあるので注意しましょう。
BLEURT
BLEURTとは、自然言語生成のための学習された評価指標のことです。詳しくはこちらをご覧ください。
inputs
- predictions
-
生成された文章のリスト
- references
-
比較対象となる文章
- checkpoint
-
BLEURT のチェックポイント
指定しない場合、デフォルトはBLEURT-tiny
他に選択可能なモデルは bleurt-tiny-128、bleurt-tiny-512、bleurt-base-128、bleurt-base-512、bleurt-large-128、bleurt-large-512、BLEURT-20-D3、BLEURT-20-D6、BLEURT-20-D12、BLEURT-20
利用例
"""case1 デフォルトの場合"""
predictions = ["hello there", "general kenobi"]
references = ["hello there", "general kenobi"]
# bleurtモジュールの読み込み
bleurt = evaluate.load("bleurt", module_type="metric")
results = bleurt.compute(predictions=predictions, references=references)
print(results)
# {'scores': [1.0295498371124268, 1.0445425510406494]}
"""case2 model checkpointを指定した場合"""
predictions = ["hello there", "general kenobi"]
references = ["hello there", "general kenobi"]
bleurt = load("bleurt", module_type="metric", checkpoint="bleurt-base-128")
results = bleurt.compute(predictions=predictions, references=references)
print(results)
# {'scores': [1.0295498371124268, 1.0445425510406494]}
オリジナルのBLEURTの論文は、BLEURTが人間の判断とよく相関することを示しましたが、これは選択されたモデルと言語ペアに依存する点に注意が必要です。
さらに、現在のところ、BLEURTは英語のコーパスで学習したモデルを利用しているため、英語でのスコアリングしかサポートされていません。また、モデルの学習データに存在する偏りや相関をある程度反映している可能性があります。
BLEURT指標を計算するには、スコアを計算するために使用されるBLEURTモデルをダウンロードする必要があり、選択されたモデルによってはかなりの時間がかかる可能性があります。
CER
CER(Character error rat)とは、自動音声認識(ASR)システムの性能の一般的な指標です。
CER = (S + D + I) / Nで表されます。
Nは正解文の文字数、Dは削除誤り、Sは置換誤り・Iは挿入誤りの文字数になります。
エラー率のことなので低い方が良いです。
inputs
- predictions
-
認識した文のリスト
- references
-
正解文のリスト
利用例
"""エラー率0"""
# cerモジュール読み込み
cer = evaluate.load("cer")
predictions = ["hello world", "good night moon"]
references = ["hello world", "good night moon"]
cer_score = cer.compute(predictions=predictions, references=references)
print(cer_score)
0.0
CERは、自動音声認識(ASR)や光学式文字認識(OCR)などのタスクで異なるモデルを比較する際に有用であり、特に、言語の多様性を考えるとWERが適さない多言語データセットに適しています。しかし、CERは翻訳エラーの性質に関する詳細を教えてくれるものではないので注意が必要です。
chrF
ChrFとは、文字n-gramのマッチングにFスコア統計量を使用する機械翻訳の評価指標です。
inputs
- predictions
-
予測されたテキスト
- references
-
参照元のテキスト
- char_order
-
文字のn-gramの順番
デフォルトは6 - word_order
-
単語の n-gram オーダー
2 の場合、chrF++ と呼ばれる
デフォルトは 0 - beta
-
精度に対する想起の重要度を決定する
デフォルトは2 - lowercase
-
True の場合、大文字小文字を区別しない
デフォルトはFalse - whitespace
-
True の場合、文字 N-gram を抽出する際に空白を含める
デフォルトはFalse - eps_smoothing
-
Trueの場合、参考のchrF++.py、NLTK、Mosesの実装と同様に、イプシロンスムージングを適用するFalseの場合、sacreBLEU < 2.0.0と同様に、有効なマッチング順序を考慮する
デフォルトはFalse
利用例
"""シンプルな例"""
prediction = ["私のコメントは見えていません。よろしくお願いします。"]
reference = ["私のコメントは見えていません。よろしくお願いいたします。"]
# chrfモジュールを読み込み
chrf = evaluate.load("chrf")
results = chrf.compute(predictions=prediction,
references=reference,
word_order=2,
lowercase=True)
print(results)
# {'score': 71.88024536070621, 'char_order': 6, 'word_order': 2, 'beta': 2}
Code Eval
Code Evalとは、論文 Evaluating Large Language Models Trained on Codeで紹介された HumanEval 問題解決データセットの評価ハーネスを実装したものです。
inputs
- predictions
-
評価する候補のリスト
各候補は、問題を解決するためのいくつかのコード候補を持つ文字列のリストであるべきである - references
-
各予測に対するテストを含むリスト
各テストは、コード候補の正しさを評価する必要がある - k
-
評価で考慮するコード候補の数
デフォルト値は [1, 10, 100] - num_workers
-
候補プログラムの評価に使用するワーカーの数 (デフォルト値は 4)
- timeout
-
予測が「タイムアウト」とみなされるまでにかかる最大時間
デフォルト値は3.0(3秒)
利用例
"""シンプルな例"""
import os
# 信頼されていないモデル生成コードを実行する可能性があるので、以下の設定には自己責任で十分注意してください
os.environ["HF_ALLOW_CODE_EVAL"] = "1"
code_eval = load("code_eval")
test_cases = ["assert add(2,3)==5"]
candidates = [["def add(a, b): return a+b"]]
pass_at_k, results = code_eval.compute(references=test_cases, predictions=candidates, k=[1])
print(pass_at_k)
# {'pass@1': 1.0}
上記のコードを実行するとエラーが出ました。
# NotImplementedError: This metric is currently not supported on Windows.
Windowsには対応していないみたいです。
このプログラムは、信頼されていないモデル生成コードを実行するので、破壊的な動作をする可能性があります。コードの制限に関する詳細は、Human Eval Githubリポジトリに掲載されています。
COMET
COMET(Crosslingual Optimized Metric for Evaluation of Translation)は、様々なタイプの人間の判断と高い相関を持つ機械翻訳メトリクスを学習するためのオープンソースのフレームワークです。
詳しく知りたい方はCOMET WEBSITEをご覧ください。
inputs
- sources
-
原文のリスト
- predictions
-
訳語候補のリスト
- references
-
参照訳のリスト
- gpus
-
学習に使うGPUの数、または整数のリスト(どのGPUを使用するか)
デフォルトはNone - progress_bar
-
Trueに設定すると、進捗状況の更新がプリントアウトされる
デフォルト値はFalse
使用例
unbabel-cometをインストールしろと出るので、先にインストールしておきます。
# terminalなどで実行
pip install unbabel-comet
また、私だけかもしれませんが、次のようなエラーが出ました。
# Exception: HOME environment variable is not defined.
探っていくと、以下のところでエラーが発生していました。
if "HOME" in os.environ:
saving_directory = os.environ["HOME"] + "/.cache/torch/unbabel_comet/"
else:
raise Exception("HOME environment variable is not defined.")
なので、次のようにos.environ[“HOME”]を設定して解決しています。
もともと設定されていたら大丈夫だと思います。
import os
os.environ["HOME"]="絶対パスを指定する"
では、準備したところで使用例を見ていきます。
"""シンプルな例"""
# cometモジュールを読み込み
comet_metric = evaluate.load('comet')
source = ["Dem Feuer konnte Einhalt geboten werden", "Schulen und Kindergärten wurden eröffnet."]
predictions = ["They were able to control the fire.", "Schools and kindergartens opened"]
reference = ["They were able to control the fire.", "Schools and kindergartens opened"]
results = comet_metric.compute(predictions=predictions, references=reference, sources=source)
print([round(v, 1) for v in results["scores"]])
[1.0, 1.0]
COMETの指標を計算するには、特徴を得るためのモデルをダウンロードする必要があります。デフォルトのモデルであるwmt20-comet-daは1.79GB以上の記憶容量を必要とし、ダウンロードにはインターネット接続速度によってかなりの時間がかかることが予想されます。この問題がある場合は、より小さいモデルを選択してください。例えば、wmt21-cometinho-daは344MBです。
Competition MATH
Competition MATHは、Mathematics Aptitude Test of Heuristics (MATH)データセットにおける性能を評価するための評価指標です。
inputs
使用例
"""シンプルな例"""
# competition_mathモジュールの読み込み
math = evaluate.load("competition_math")
references = ["\\frac{1}{2}"]
predictions = ["1/2"]
results = math.compute(references=references, predictions=predictions)
print(results)
# {'accuracy': 1.0}
この指標はMathematics Aptitude Test of Heuristics (MATH) データセットと同じ形式のデータセットに限定されています。
Coval
CoValはCoNLLとARRAUデータセットのための共通の評価指標ツールです。
inputs
- keep_singletons
-
キーやシステムファイルの記述をすべて抽出した後、対応する相互参照列のサイズが1であるものを要素が一つだけのものとして考慮する。デフォルトの評価モードでは、要素が一つのものがキーやシステムファイルに含まれている場合、評価に含まれる。keep_singletons=False に設定すると、キーやシステムファイルに含まれるすべての要素が一つのものが評価から除外される。
- NP_only
-
NP_only オプションを設定することで、スコアラーはNPの解決のみを評価するようになる。
- min_span
-
min_spanを設定することにより、スコアラーは自動的に検出された最小スパンに基づいて結果を報告する。最小スパンはMINAアルゴリズムを用いて決定される。
outputs
- muc
-
0-1 の範囲で、回収率と精度で性能を表す
- bcub
-
0-1の範囲で、分布内の全アイテムの精度を平均したもの
- ceafe
-
参照エンティティとシステムエンティティを、参照エンティティが最大1つの参照エンティティと整列するという制約のもとで整列させて計算される指標である
範囲は0-1 - lea
-
リンクベースのエンティティ考慮指標であり、各エンティティについて、そのエンティティがどれだけ重要で、どれだけ解決されたかを考慮する
範囲は0〜1 - conll_score
-
平均化されたCoNLLスコア(muc、bcub、ceafeのF1値の平均)
0〜100の範囲
利用例
"""例"""
# covalモジュールの読み込み
coval = evaluate.load('coval')
words = ['bc/cctv/00/cctv_0005 0 0 Thank VBP (TOP(S(VP* thank 01 1 Xu_li * (V*) * -',
... 'bc/cctv/00/cctv_0005 0 1 you PRP (NP*) - - - Xu_li * (ARG1*) (ARG0*) (116)',
... 'bc/cctv/00/cctv_0005 0 2 everyone NN (NP*) - - - Xu_li * (ARGM-DIS*) * (116)',
... 'bc/cctv/00/cctv_0005 0 3 for IN (PP* - - - Xu_li * (ARG2* * -',
... 'bc/cctv/00/cctv_0005 0 4 watching VBG (S(VP*)))) watch 01 1 Xu_li * *) (V*) -',
... 'bc/cctv/00/cctv_0005 0 5 . . *)) - - - Xu_li * * * -']
references = [words]
predictions = [words]
results = coval.compute(predictions=predictions, references=references)
print(results)
# {'mentions/recall': 1.0, 'mentions/precision': 1.0, 'mentions/f1': 1.0,
# 'muc/recall': 1.0, 'muc/precision': 1.0, 'muc/f1': 1.0, 'bcub/recall': 1.0,
# 'bcub/precision': 1.0, 'bcub/f1': 1.0, 'ceafe/recall': 1.0, 'ceafe/precision': 1.0,
# 'ceafe/f1': 1.0, 'lea/recall': 1.0, 'lea/precision': 1.0, 'lea/f1': 1.0, 'conll_score': 100.0}
CoValのこのラッパーは、CoNLL行形式でのみ動作します。これは、1行に1つの単語があり、その単語のすべての注釈がスペースで区切られて列になっている形式です。
CUAD
CUADは、Contract Understanding Atticus Dataset (CUAD)のバージョン1用の公式スコアリングスクリプトを包含しています。Contract Understanding Atticus Dataset (CUAD) v1は、510の商業的な法的契約における13,000以上のラベルのコーパスで、弁護士が企業取引に関連して契約をレビューする際に見る重要な条項の41カテゴリーを識別するために手動でラベル付けされたものです。
inputs
- predictions
-
question-answerの対応を辞書にしたリスト
- – id
-
リファレンスで与えられた質問と答えのペアのID
- – prediction_text
-
答えの候補のリスト
各予測の信頼度に関する閾値に依存した文字列のリストとして使用される
- references
-
question-answerの対応を辞書にしたリスト
- – id
-
質問と回答のペアのID
- – answers
-
CUADデータセット形式の辞書で、以下のkeyを持つ
- ・text
-
回答として考えられるテキストのリスト
- ・answer_start
-
答えの開始位置のリスト
outputs
- exact_match
-
0.0 から 1.0 の範囲で、参照解答と完全に一致する正規化された解答(詳細)
- f1
-
precisionとrecallの調和平均
範囲は0.0から1.0 - aupr
-
適合率−再現率 曲線の下面積
0.0から1.0までの範囲 - prec_at_80_recall
-
再現率80%で予測された例のうち、真の例の割合
範囲は0.0から1.0 - prec_at_90_recall
-
再現率90%で予測された例のうち、真の例の割合
範囲は0.0から1.0
利用例
"""exact_matchがマックスな例"""
# cuadモジュールの読み込み
cuad_metric = evaluate.load("cuad")
predictions = [{'prediction_text': ['The seller:', 'The buyer/End-User: Shenzhen LOHAS Supply Chain Management Co., Ltd.'], 'id': 'LohaCompanyltd_20191209_F-1_EX-10.16_11917878_EX-10.16_Supply Agreement__Parties'}]
references = [{'answers': {'answer_start': [143, 49], 'text': ['The seller:', 'The buyer/End-User: Shenzhen LOHAS Supply Chain Management Co., Ltd.']}, 'id': 'LohaCompanyltd_20191209_F-1_EX-10.16_11917878_EX-10.16_Supply Agreement__Parties'}]
results = cuad_metric.compute(predictions=predictions, references=references)
print(results)
# {'exact_match': 100.0, 'f1': 100.0, 'aupr': 0.0, 'prec_at_80_recall': 1.0, 'prec_at_90_recall': 1.0}
この指標はCUADデータセットと同じフォーマットを持つデータセットでのみ機能します。
また、このデータセットのバイアスの限界は議論されていませんが、このデータセットに対するアノテーターの均質性を考えると、アノテーションバイアスを示す可能性があります。
Exact Match
Exact Matchは、regexes_to_ignoreリストの一部として入力された文字列を無視して、入力された予測文字列がその参照に完全に一致する割合を返します。
inputs
- predictions
-
予測されたテキストのリスト
- references
-
参考テキストのリスト
- regexes_to_ignore
-
完全一致を計算する際に無視する文字列を表す正規表現
デフォルトはNone - ignore_case
-
True の場合、すべてを小文字に変換し、大文字小文字の違いを無視する
デフォルトは False - ignore_punctuation
-
True の場合、文字列を比較する前に句読点を除去する
デフォルトは False - ignore_numbers
-
True の場合、文字列を比較する前にすべての数字を削除する
デフォルトはFalse。
利用例
"""case1 無視する正規表現を含めない"""
# exact_matchモジュールの読み込み
exact_match = evaluate.load("exact_match")
refs = ["the cat", "theater", "YELLING", "agent007"]
preds = ["cat?", "theater", "yelling", "agent"]
results = exact_match.compute(references=refs, predictions=preds)
print(round(results["exact_match"], 2))
# 0.25
"""case2 theとyellを無視し、大文字と小文字、句読点も無視する"""
exact_match = evaluate.load("exact_match")
refs = ["the cat", "theater", "YELLING", "agent007"]
preds = ["cat?", "theater", "yelling", "agent"]
results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=["the ", "yell"], ignore_case=True, ignore_punctuation=True)
print(round(results["exact_match"], 2))
0.5
この指標は、完全に間違っているものと、一文字だけ正しいものとが同じ点数で出力されるという欠点があります。
F1
F1は、適合率と再現率の調和平均です。
F1 = 2 * (precision * recall) / (precision + recall)で求められます。
inputs
- predictions
-
予測ラベルのリスト
- references
-
正解ラベルのリスト
- labels
-
averageがbinaryでない場合に含めるべきラベルのセット
average が None の場合のラベルの順序.データ中に存在するラベルを除外することができる
デフォルトはNone - pos_label
-
averageがbinaryに設定されている場合に、正のクラスとみなされるクラス
デフォルトは1 - average
-
Noneに設定された場合、各クラスのスコアを返す
そうでない場合、データに対して実行される平均化のタイプを決定する
デフォルトはbinary- – binary
-
pos_labelで指定されたクラスについてのみ結果を出力する
これは、予測や参照で見つかったクラスがバイナリである場合にのみ適用される - – micro
-
真陽性、偽陰性、偽陽性の合計をカウントして、大まかにメトリクスを計算する
- – macro
-
各ラベルについてメトリクスを計算し、それらの非加重平均を求める
- – weighted
-
各ラベルのメトリクスを計算し、各ラベルの真の数で重み付けした平均を求める
- – samples
-
各インスタンスに対してメトリクスを計算し、その平均を求める
マルチラベル分類にのみ意味がある
- sample_weight
-
サンプルの重み付け
デフォルトはNone
利用例
"""case1 シンプルな例"""
# f1モジュールの読み込み
f1_metric = evaluate.load("f1")
results = f1_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0])
print(results)
# {'f1': 0.5}
"""case2 pos_labelを0にセットした例"""
f1_metric = evaluate.load("f1")
results = f1_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0], pos_label=0)
print(round(results['f1'], 2))
# 0.67
Frugalscore
FrugalScoreは、自然言語生成(NLG)モデル評価のための参照ベースのメトリックです。FrugalScoreは蒸留法に基づいており、高価なNLGメトリックの固定された低コストバージョンを、その本来の性能の大部分を保持しながら学習することができたモデルを用いて評価します。
inputs
- predictions
-
予測をスコアリングするための文字列のリスト
- references
-
各予測の正解を表す文字列のリスト
- batch_size
-
予測のバッチサイズ
- max_length
-
最大配列長
- device
-
gpu or cpuを設定
デフォルトはNone
使用例
"""referencesとpredictionsが一致する場合"""
# frugalscoreモジュールの読み込み
frugalscore = evaluate.load("frugalscore")
results = frugalscore.compute(predictions=['hello world'], references=['hello world'])
print(results)
{'scores': [0.9891097]}
FrugalScoreはBertScoreとMoverScoreをベースにしており、使用されているモデルはこれらのスコアに使用されているオリジナルのモデルをベースにしている点に注意が必要です。
GLUE
GLUE(General Language Understanding Evaluation benchmark)は、自然言語理解システムの学習・評価・解析のためのリソースの集まりです。この指標は、各GLUEデータセットに関連付けられたGLUE評価指標を計算するために使用されます。
モジュールの読み込み時の引数
GLUEはモジュールの読み込み時の引数を設定する必要があります。
もし、設定しないと以下のエラーが出ます。
glue_metric = evaluate.load('glue') # 第二引数を設定していない
# KeyError: 'You should supply a configuration name selected in
# ["sst2", "mnli", "mnli_mismatched", "mnli_matched",
# "cola", "stsb", "mrpc", "qqp", "qnli", "rte", "wnli", "hans"]'
ここから選べと言っているので、この中から選んで設定する必要があります。
それぞれの説明はこちらをご覧ください。
inputs
- references
-
各翻訳の参考テキストのリスト
- predictions
-
モデルの予測値のリスト
outputs
- f1
-
適合率と再現率の調和平均
- pearson
-
2つのデータセット間の線形関係を表す尺度
範囲は-1から+1までで、0は相関がないことを意味し、-1/+1は正確な線形関係を意味する - spearmanr
-
2つのデータセット間の関係の単調性のノンパラメトリック尺度
範囲は-1から+1 - matthews_correlation
-
バイナリおよびマルチクラス分類の品質を評価する尺度
利用例
"""MRPCを選んだ場合"""
# glueモジュールの読み込み
glue_metric = evaluate.load('glue', 'mrpc')
references = [0, 1]
predictions = [0, 1]
results = glue_metric.compute(predictions=predictions, references=references)
print(results)
# {'accuracy': 1.0, 'f1': 1.0}
"""STSBを選んだ場合"""
glue_metric = evaluate.load('glue', 'stsb')
references = [0., 1., 2., 3., 4., 5.]
predictions = [-10., -11., -12., -13., -14., -15.]
results = glue_metric.compute(predictions=predictions, references=references)
print(results)
# {'pearson': -1.0, 'spearmanr': -1.0}
この指標はGLUEデータセットと同じ形式のデータセットでのみ動作します。
GLUEデータセットは「一般的な言語理解」を表すものですが、表現されているタスクは必ずしも言語理解を代表するものではない点に注意が必要です。
Google BLEU
BLEUはコーパスの尺度として設計されているため、単文に用いると好ましくない性質があります。Google BLEUは、このような望ましくない性質を抑制するように設計されています。
inputs
- predictions
-
翻訳された文のリスト
- references
-
各翻訳の正解文のリスト
- tokenizer
-
predictionsとreferencesのトークン化に使用される手法
デフォルトはtokenizer_13a - min_len
-
n-gramの最小次数
デフォルトは1 - max_len
-
n-gram の最大次数
デフォルトは4
利用例
""" シンプルな例 """
predictions = ['It is a guide to action which ensures that the rubber duck always disobeys the commands of the cat', 'he read the book because he was interested in world history']
references = [['It is the guiding principle which guarantees the rubber duck forces never being under the command of the cat'], ['he was interested in world history because he read the book']]
# google bleuモジュールの読み込み
google_bleu = evaluate.load("google_bleu")
results = google_bleu.compute(predictions=predictions, references=references)
print(results)
# {'google_bleu': 0.4351851851851852}
""" 日本語を突っ込んだ例 (デフォルトのままなので、tokenizer的におかしいかも)"""
predictions = ['コメントありがとうございます。']
references = ["コメントありがとうございます。"]
google_bleu = evaluate.load("google_bleu")
results = google_bleu.compute(predictions=predictions, references=references)
print(results)
# {'google_bleu': 1.0}
GoogleBLEUにはあらかじめ定義されたトークン化関数がありません。以前のバージョンでは、単に split() を使って入力文字列をトークンに分割していました。デフォルトのtokenizer_13aのようなtokenizerを使用することで、結果の標準化と再現性が高まります。
IndicGLUE
IndicGLUEはインド言語の自然言語理解ベンチマークです。アッサム語 (as), ベンガル語 (bn), グジャラート語 (gu), ヒンディー語 (hi), カンナダ語 (kn), マラヤーラム語 (ml), マラーティー語 (mr), オリヤー (or), パンジャービー語 (pa), タミル (ta) およびテルグ語 (te) というインドの主要11言語について様々なタスクが含まれています。この評価指標はIndicGLUEデータセットの評価指標を計算するために使用されます。
日本語でこの指標について調べる人はいないと思うので、利用例だけ載せておきます。
利用例
""" case1 """
indic_glue_metric = evaluate.load('indic_glue', 'wnli')
references = [0, 1]
predictions = [0, 1]
results = indic_glue_metric.compute(predictions=predictions, references=references)
print(results)
{'accuracy': 1.0}
MAE
平均絶対誤差(MAE)は、予測された数値と実際の数値の差の絶対値の平均値です。
inputs
- predictions
-
(n_samples,) または (n_samples, n_outputs) 形式の数値配列で、推定された目標値
- references
-
(n_samples,) または (n_samples, n_outputs) 形式の数値配列の正しい値
- sample_weight
-
サンプルの重み
(n_samples, )形状の数値配列
デフォルトはNone - multioutput
-
raw_values、uniform_average、または(n_outputs, )形状の数値配列で、複数の出力値の集計方法を定義する
デフォルトはuniform_average- – raw_values
-
複数出力の入力の場合,誤差の完全なセットを返す
- – uniform_average
-
すべての出力の誤差を一様な重みで平均化する
利用例
""" シンプルな例 """
# MAEモジュールの読み込み
mae_metric = evaluate.load("mae")
predictions = [2.5, 0.0, 2, 8]
references = [3, -0.5, 2, 7]
results = mae_metric.compute(predictions=predictions, references=references)
print(results)
# {'mae': 0.5}
MAEの限界の1つとして、誤差の相対的な大きさが必ずしも明らかではないことが挙げられます。つまり、大きな誤差と小さな誤差を見分けるのが難しい場合があります。そのため、MAEをパーセントで計算するMean Absolute Percentage Error(MAPE)などが提案されています。
また、MAEは平均値を計算するため、頻度は高くありませんが、大きな誤差の影響を過小評価する可能性があります。RMSE(Root Mean Square Error)などのメトリクスは、誤差の値の根を取ることでこれを補正しています。
Mahalanobis Distance
マハロノビス距離(Mahalanobis Distance)とは、ある点とある分布との距離(2点間の距離とは異なる)であり、ユークリッド距離の多変量版に相当するものです。多変量異常検出、高度にアンバランスなデータセットでの分類、1クラス分類によく用いられます。
inputs
- X
-
reference_distributionと比較したい対象のデータの地点
- reference distribution
-
比較したいreference distributionのデータの地点
利用例
""" シンプルな例 """
# mahalanobisモジュールの読み込み
mahalanobis_metric = evaluate.load("mahalanobis")
results = mahalanobis_metric.compute(reference_distribution=[[0, 1], [1, 0]], X=[[0, 1]])
print(results)
# {'mahalanobis': array([0.5])}
マハラノビス距離は、変数間の線形関係しか捉えることができないため、あらゆる種類の外れ値を捉えることができません。また、マハラノビス距離は、大きく歪んだデータやマルチモーダルなデータを忠実に表現することもできません。
Matthews Correlation Coefficient
マシューズ相関係数(Matthews Correlation Coefficient)は、機械学習において、2クラスおよび多クラス分類の品質を測る尺度として用いられます。これは真陽性と偽陽性を考慮し、クラスが非常に異なるサイズであっても使用できるバランスの取れた指標と一般にみなされています。
inputs
- predictions
-
予測されたクラスラベル
- references
-
正解ラベル
- sample_weight
-
サンプルの重み
デフォルトはNone
利用例
""" シンプルな例 """
# matthews_correlationモジュールの読み込み
matthews_metric = evaluate.load("matthews_correlation")
results = matthews_metric.compute(references=[1, 3, 2, 0, 3, 2], predictions=[1, 2, 2, 0, 3, 3])
print(results)
# {'matthews_correlation': 0.5384615384615384}
MAUVE
MAUVEはPyTorchとHuggingFace Transformersをベースに作られたライブラリで、ニューラルネットワークのテキストと人間のテキストの間のギャップを測定します。詳細は、MAUVE論文をご覧ください。
inputs
- predictions
-
モデルによって生成されたテキスト
- references
-
各予測の参照テキスト
- num_buckets
-
PとQを量子化するヒストグラムのサイズ
デフォルトはauto - pca_max_data
-
クラスタリングに先立ってPCA次元削減に使用するデータ数
1の場合、すべてのデータを使用する
デフォルトは-1 - kmeans_explained_var
-
PCAによる次元削減のために保持するデータの分散量
デフォルトは0.9 - kmeans_num_redo
-
k-meansクラスタリングをやり直す回数(最適な目的値を保持する)
デフォルトは5 - kmeans_max_iter
-
k-meansの最大イテレーション数
デフォルトは500 - featurize_model_name
-
特徴を取得するモデルの名前
gpt2, gpt2-medium, gpt2-large, gpt2-xl のいずれかから選ぶ
デフォルトは gpt2-large - device_id
-
GPU を使用する場合は GPU id (例: 0 または 3) を指定する
このIDを持つGPUが見つからない場合、メトリックはCPUを使用する - max_text_length
-
考慮するトークンの最大数
デフォルトは1024 - divergence_curve_discretization_size
-
発散曲線上で考慮する点の数
デフォルトは25 - mauve_scaling_factor
-
スケーリングのためのハイパーパラメータ
デフォルトは5 - verbose
-
Trueの場合、メトリックを実行すると、実行時間の更新が表示される
デフォルトはTrue - seed
-
クラスタ割り当てを初期化するためのランダムな値
デフォルトではランダムに割り当てられる
outputs
- mauve
-
0 から 1 の間で、値が大きいほどPとQが近いことを示す
- fromtier_integral
-
0 から 1 の間の値。値が小さいほど、P と Q は近いことを示す
- divergence_curve
-
(m, 2)のnumpy.ndarray; matplotlib でプロットするとダイバージェンスカーブが表示される
- p_hist
-
離散分布で、テキスト分布 p_text を量子化したもの
- q_hist
-
離散分布で、テキスト分布 q_text を量子化したもの
利用例
""" シンプルな例 """
# mauveモジュールの読み込み
mauve = evaluate.load('mauve')
predictions = ["hello world", "goodnight moon"]
references = ["hello world", "goodnight moon"]
mauve_results = mauve.compute(predictions=predictions, references=references)
print(mauve_results.mauve)
# 1.0
「To be able to use mauve, you need to install the following dependencies[‘faiss’, ‘mauve’] using ‘pip install # Here to have a nice missing dependency error message early on mauve-text’ for instance’」
上記のエラーが出てpip install mauve-textとしましたが、エラーは解決しませんでした。(私の環境が悪いのかも)そこまで詳しく調べてないので、分かった方はコメントまでお願いします。
Mean IoU
IoU (Intersection over Union) は、予測されたセグメンテーションと正解データの間の重複面積を、予測されたセグメンテーションと正解データの間の結合面積で割ったものです。物体検出で利用されます。バイナリ(2クラス)またはマルチクラスセグメンテーションの場合、各クラスのIoUを取り、それらを平均化することによって計算されます。
inputs
- predictions
-
予測されたセグメンテーションマップのリスト
各マップは (height, width) の形状を持つ - references
-
正解データのセグメンテーションマップのリスト
- num_labels
-
クラス (カテゴリ) の数
- ignore_index
-
評価時に無視されるインデックス
- nan_to_num
-
指定された場合、NaN 値はユーザが定義した数値に置き換えられる
- label_map
-
指定された場合,古いラベルのインデックスを新しいラベルのインデックスにマッピングする辞書
- reduce_labels
-
通常、背景に0が使われ、背景そのものがデータセットの全クラスに含まれないデータセットに使用される
背景のラベルは255で置き換えられる
デフォルトはFalse
outputs
- mean_iou
-
全カテゴリーで平均化されたIoU
- mean_accuracy
-
平均精度
- overall_accuracy
-
全画像の総合精度
- per_category_accuracy
-
カテゴリごとの精度
- per_category_iou
-
カテゴリごとのIoU
利用例
""" シンプルな例 """
# numpyをインポート
import numpy as np
# mean_iouモジュールの読み込み
mean_iou = evaluate.load("mean_iou")
# suppose one has 3 different segmentation maps predicted
predicted_1 = np.array([[1, 2], [3, 4], [5, 255]])
actual_1 = np.array([[0, 3], [5, 4], [6, 255]])
predicted_2 = np.array([[2, 7], [9, 2], [3, 6]])
actual_2 = np.array([[1, 7], [9, 2], [3, 6]])
predicted_3 = np.array([[2, 2, 3], [8, 2, 4], [3, 255, 2]])
actual_3 = np.array([[1, 2, 2], [8, 2, 1], [3, 255, 1]])
predictions = [predicted_1, predicted_2, predicted_3]
references = [actual_1, actual_2, actual_3]
results = mean_iou.compute(predictions=predictions, references=references, num_labels=10, ignore_index=255, reduce_labels=False)
print(results)
# {'mean_iou': 0.47750000000000004, 'mean_accuracy': 0.5916666666666666,
# 'overall_accuracy': 0.5263157894736842,
# 'per_category_iou': array([0. , 0. , 0.375, 0.4 , 0.5 , 0. , 0.5 , 1. , 1. , 1. ]),
# 'per_category_accuracy': array([0. , 0. , 0.75 , 0.66666667, 1. ,
# 0. , 0.5 , 1. , 1. , 1. ])}
Mean IoUは平均的な指標であるため、モデルの予測が正解データと異なる部分(すなわち、モデルが苦手とする特定の地域やクラスがある場合)を示すことはできません。
METEOR
METEOR(Metric for Evaluation of Translation with Explicit ORdering)は、機械翻訳の評価指標で、適合率と再現率の調和平均に基づいて計算され、再現率は適合率よりも重視されます。詳しくは、METEOR paperをご覧ください。
inputs
- predictions
-
モデルに翻訳されたテキスト
- references
-
各predictionsの参考文のリスト
- alpha
-
適合率と再現率の相対的な重みを制御するためのパラメータ
デフォルトは0.9 - beta
-
フラグメントの関数としてのペナルティの形状を制御するためのパラメータ
デフォルト値は3 - gamma
-
フラグメントペナルティに割り当てる相対的な重みを指定
デフォルトは 0.5
利用例
""" シンプルな例 """
# meteorモジュールの読み込み
meteor = evaluate.load('meteor')
predictions = ["It is a guide to action which ensures that the military always obeys the commands of the party"]
references = ["It is a guide to action which ensures that the military always obeys the commands of the party"]
results = meteor.compute(predictions=predictions, references=references)
print(round(results['meteor'], 2))
1.0
METEORと人間の判断の相関は中国語とアラビア語で測定され、有意であることがわかったが、他の言語での相関を確認するためにはさらなる実験が必要です。(最新の情報を確認してください)
MSE
平均二乗誤差(MSE)は、誤差の二乗の平均、つまり推定値と実測値の差の平均二乗を表します。
inputs
- predictions
-
(n_samples, ) または (n_samples, n_outputs) 形式の数値配列の推定値
- references
-
(n_samples, )または(n_samples, n_outputs) 形式の数値配列の真の値
- sample_weight
-
サンプルの重みを表す
(n_samples, )形状の数値配列
デフォルトはNone - multioutput
-
raw_values、uniform_average、または(n_outputs, ) の数値配列
複数の出力値の集計を定義するものである
デフォルトは uniform_average- – raw_values
-
複数出力の入力の場合,誤差の完全な集合を返す
- – uniform_average
-
すべての出力の誤差が均一な重みで平均化される
- squared
-
True の場合 MSE 値を、False の場合 RMSE (Root Mean Squared Error) を返す
デフォルトはTrue
利用例
""" シンプルな例 """
# mseモジュールの読み込み
mse_metric = evaluate.load("mse")
predictions = [2.5, 0.0, 2, 8]
references = [3, -0.5, 2, 7]
results = mse_metric.compute(predictions=predictions, references=references)
print(results)
# {'mse': 0.375}
MSEは外れ値に大きな重み付けをする欠点があります。二乗するので、大きな誤差は小さな誤差よりも大きな重み付けをすることになります。
Pearson Correlation Coefficient
ピアソン相関係数(Pearson Correlation Coefficient)は、2つのデータセット間の線形関係を測定します。他の相関係数と同様、この係数は-1から+1の間で変化し、0は相関がないことを意味します。また、相関が-1または+1であれば、正確な線形関係を意味します。
inputs
- predictions
-
モデルによって返される予測されたクラスラベル
- references
-
正解ラベル
- return_pvalue
-
True の場合、相関係数とともに p-Value を返す
False の場合、相関係数のみを返す
デフォルトは False
outputs
- pearsonr
-
ピアソンの相関係数
- p-value
-
p-valueは、相関のない系統のデータセットが、これらのデータセットから計算されたピアソン相関と少なくとも同じ極端な相関を持つデータセットを生成する確率をおおまかに示すもの
最小値は0、最大値は1で、値が大きいほど確率が高いことを示す
利用例
""" シンプルな例 """
# pearsonrモジュールの読み込み
pearsonr_metric = evaluate.load("pearsonr")
results = pearsonr_metric.compute(predictions=[10, 9, 2.5, 6, 4], references=[1, 2, 3, 4, 5], return_pvalue=True)
print(sorted(list(results.keys())))
['p-value', 'pearsonr']
print(round(results['pearsonr'], 2))
-0.74
print(round(results['p-value'], 2))
0.15
p値の計算は、各データセットが正規分布しているという仮定に依存しています。これは常にそうであるとは限らないので、データセットの真の分布を検証することが推奨されます。
Perplexity
Perplexityは、モデルが与えられた入力テキスト列を生成する可能性がどの程度あるかを測定します。指標としては、モデルが学習したテキストの分布をどの程度学習したかを評価するために用いることができます。この場合、モデルの入力は評価対象の学習済みモデルであり、入力テキストはモデルが学習したテキストであるべきです。
inputs
- model_id
-
Perplexityを計算するために使用するモデル
Perplexityは因果関係のある言語モデルに対してのみ計算できる
計算できるモデルのリストはこちらのドキュメントを参照 - input_texts
-
入力テキスト
- batch_size
-
モデルを通してテキストを実行するバッチサイズ
デフォルトは16 - add_start_token
-
テキストに開始トークンを追加し、最初の単語の確率を含む複雑さを計算するかどうか
デフォルトはTrue - device
-
実行するデバイス
デフォルトはcuda
利用例
""" シンプルな例 """
# perplexityモジュールの読み込み
perplexity = evaluate.load("perplexity", module_type="metric")
input_texts = ["lorem ipsum", "Happy Birthday!", "Bienvenue"]
results = perplexity.compute(model_id='gpt2',
add_start_token=False,
input_texts=input_texts)
print(list(results.keys()))
['perplexities', 'mean_perplexity']
print(round(results["mean_perplexity"], 2))
78.22
print(round(results["perplexities"][0], 2))
11.11
出力値はモデルがどのようなテキストで学習したかに大きく依存することに注意してください。つまり、モデルやデータセット間でperplexityスコアは比較できません。
Precision
適合率(Precision)とは、正とラベル付けされたすべての例のうち、正しく正とラベル付けされた例の割合です。
inputs
- predictions
-
予測されたクラスラベル
- references
-
実際のクラスラベル
- labels
-
averageがbinaryに設定されていない場合に含めるべきラベルセット
average:Noneの場合、ラベルの順番となる
データ中に存在するラベルを除外することができる
例えば、多数派のネガティブクラスを無視してマルチクラス平均を計算することができる
データ中に存在しないラベルは、マクロ平均では0成分になる
マルチラベル・ターゲットでは、ラベルは列インデックスである
デフォルトでは、予測および参照におけるすべてのラベルは、ソートされた順序で使用される
デフォルトはNone - pos_label
-
averageがbinary に設定されている場合に、正のクラスとみなされるクラス
デフォルトは1 - average
-
このパラメータは、マルチクラス/マルチラベルのターゲットに必要である
Noneに設定された場合、各クラスのスコアが返される
そうでない場合、データに対して実行される平均化のタイプを決定する
デフォルトはbinary- – binary
-
pos_labelで指定されたクラスの結果のみを返す
- – micro
-
真陽性、偽陰性、偽陽性の合計をカウントして、全体的にメトリクスを計算する
- – macro
-
各ラベルのメトリクスを計算し、それらの非加重平均を求める
これは、ラベルの不均衡を考慮に入れていない - – weighted
-
各ラベルのメトリクスを計算し、各ラベルの真のインスタンスの数で重み付けした平均値を求める
- – samples
-
各インスタンスのメトリクスを計算し、その平均を求める
マルチラベル分類にのみ意味がある
- sample_weight
-
サンプルの重み付け
デフォルトはNone - zero_division()
-
ゼロ除算があったときに返す値を設定する
デフォルトは
0: ゼロ除算があった場合、0を返す
1: ゼロ除算があった場合、1を返す
warn: 警告を発生させ、ゼロ除算の場合は0を返す
利用例
""" シンプルな例 """
# precisionモジュールの読み込み
precision_metric = evaluate.load("precision")
results = precision_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0], pos_label=0)
print(round(results['precision'], 2))
# 0.67
Recall
再現率(Recall)は、モデルによって正とラベル付けされた中の正例の割合です。
inputs
- predictions
-
予測されたクラスラベル
- references
-
実際のクラスラベル
- labels
-
averageがbinaryに設定されていない場合に含めるべきラベルセット
average:Noneの場合、ラベルの順番となる
データ中に存在するラベルを除外することができる
例えば、多数派のネガティブクラスを無視してマルチクラス平均を計算することができる
データ中に存在しないラベルは、マクロ平均では0成分になる
マルチラベル・ターゲットでは、ラベルは列インデックスである
デフォルトでは、予測および参照におけるすべてのラベルは、ソートされた順序で使用される
デフォルトはNone - pos_label
-
再現率を計算する際に「正のクラス」として使用するクラスラベル
デフォルトは1 - average
-
このパラメータは、マルチクラス/マルチラベルのターゲットに必要である
Noneに設定された場合、各クラスのスコアが返される
そうでない場合、データに対して実行される平均化のタイプを決定する
デフォルトはbinary- – binary
-
pos_labelで指定されたクラスの結果のみを返す
- – micro
-
真陽性、偽陰性、偽陽性の合計をカウントして、全体的にメトリクスを計算する
- – macro
-
各ラベルのメトリクスを計算し、それらの非加重平均を求める
これは、ラベルの不均衡を考慮に入れていない - – weighted
-
各ラベルのメトリクスを計算し、各ラベルの真のインスタンスの数で重み付けした平均値を求める
- – samples
-
各インスタンスのメトリクスを計算し、その平均を求める
マルチラベル分類にのみ意味がある
- sample_weight
-
サンプルの重み付け
デフォルトはNone - zero_division()
-
ゼロ除算があったときに返す値を設定する
デフォルトは
warn:ゼロ除算があった場合、返り値は0であるが、警告も発生する
0: ゼロ除算があった場合、0を返す
1: ゼロ除算があった場合、1を返す
利用例
""" シンプルな例 """
# recallモジュールの読み込み
recall_metric = evaluate.load('recall')
results = recall_metric.compute(references=[0, 0, 1, 1, 1], predictions=[0, 1, 0, 1, 1])
print(results)
{'recall': 0.6666666666666666}
RL Reliability
RL Reliability Metricsは、強化学習(RL)アルゴリズムの信頼性を測定するためのメトリクスを提供するライブラリです。評価には「オンライン」と「オフライン」の構成があります。
inputs
- timesteps
-
実行ごとのタイムステップのリスト/配列
- rewards
-
実行ごとの報酬のリスト/配列
- baseline
-
default “が渡された場合、曲線は、オンライン設定ではその範囲によって、オフラインでは実行全体の性能の中央値によって正規化される
浮動小数点が渡された場合、曲線はその値で割られる - eval_points
-
[50000, 150000, …, 2000000]のポイントで統計が計算される
- freq_tresh
-
ローパスフィルタリングのための周波数閾値
デフォルトは0.01 - window_size
-
各評価点を中心としたウィンドウを定義する
デフォルトは100000 - window_size_trimmed
-
差分処理により短くなったカーブを処理する
デフォルトは99000 - alpha
-
“value at risk” (VaR)のカットオフポイント
デフォルトは0.05
利用例
あまり容量を圧迫したくないので、ダウンロードして試していません。
# ファイルをダウンロード
wget https://storage.googleapis.com/rl-reliability-metrics/data/tf_agents_example_csv_dataset.tgz
tar -xvzf tf_agents_example_csv_dataset.tgz
# サンプルデータをロード
dfs = [pd.read_csv(f"./csv_data/sac_humanoid_{i}_train.csv") for i in range(1, 4)]
# rl_reliabilityモジュールの読み込み
rl_reliability = evaluate.load("rl_reliability", "online")
rl_reliability.compute(timesteps=[df["Metrics/EnvironmentSteps"] for df in dfs],
rewards=[df["Metrics/AverageReturn"] for df in dfs])
このRL reliabilityの実装では、アルゴリズムがメトリクスの値で統計的に異なるかどうかを判断するため検定を計算せず、またアルゴリズムの順位に関するブートストラップ信頼区間も計算していません。
また、出力の概要については、こちらのOutput Valuesをご覧ください。
ROC AUC
roc aucは、ROC(Receiver Operating Characteristic Curve)の曲線下面積(AUC)を計算します。戻り値は、使用したモデルが入力データに基づいて、正しいクラスをどれだけ良く予測しているかを表しています。
inputs
- references
-
(n_samples, ) または (n_samples, n_classes) の配列で正解のラベル
ユースケースに応じて異なる入力が期待される- – binary
-
(n_samples,) の配列の場合に設定することが望ましい
- – multiclass
-
(n_samples,) の配列の場合に設定することが望ましい
- – multilabel
-
(n_samples, n_classes) の配列の場合に設定することが望ましい
- prediction_scores
-
(n_samples, ) または (n_samples, n_classes)の配列でモデルの予測値
ユースケースに応じて異なる入力が期待される- – binary
-
(n_samples, ) の配列の場合に設定することが望ましい
- – multiclass
-
(n_samples, n_classes)の配列の場合に設定することが望ましい
確率の推定値は、クラス全体で合計が1でなければならない - – multilabel
-
(n_samples, n_classes) の配列の場合に設定することが望ましい
- average
-
ユースケースでbinaryが選択されている場合は無視される
デフォルトはmacro- – micro
-
ラベル指標行列の各要素をラベルとして考慮し、全体的にメトリクスを計算する
multilabelのユースケースでのみ機能する - – macro
-
各ラベルのメトリクスを計算し、それらの非加重平均を求める
これはラベルのアンバランスを考慮しない - – weighted
-
各ラベルのメトリクスを計算し、各ラベルの真のインスタンスの数で重み付けした平均を求める
- – samples
-
各インスタンスのメトリクスを計算し、その平均を求める
multilabelのユースケースでのみ機能する - – None
-
平均は計算されず、各クラスのスコアが返される
マmultilabelのユースケースでのみ機能する
- sample_weight
-
サンプルの重み付け
デフォルトはNone - max_fpr
-
None でない場合、範囲 [0, max_fpr] にわたって標準化された部分 AUC が返される
デフォルトは None - multi_class
-
multiclassのtargetsにのみ使用され、その場合は必須である
使用する構成の種類を決定する- – ovr
-
One-vs-restの略
各クラスの残りのクラスに対するAUCを計算する - – ovo
-
One-vs-oneの略
クラスのすべての可能な組み合わせの平均AUCを計算する
- labels
-
multiclassのtargetsにのみ使用される
predict_scoresのクラスをインデックスするラベルのリスト
Noneの場合、prediction_scoreのラベルの数値順または辞書順が使用される
デフォルトはNone
利用例
""" シンプルな例 """
# roc_aucモジュールの読み込み
roc_auc_score = evaluate.load("roc_auc")
refs = [1, 0, 1, 1, 0, 0]
pred_scores = [0.5, 0.2, 0.99, 0.3, 0.1, 0.7]
results = roc_auc_score.compute(references=refs, prediction_scores=pred_scores)
print(round(results['roc_auc'], 2))
# 0.78
multi_classにovrを設定してAUCを計算する場合、ユースケースがmulticlassの時もmultilabelの時と同じように扱います。これは、averageがmacroの場合でもクラスの不均衡に敏感で、restグループの構成に影響を与えるからです。
ROUGE
ROUGE(Recall-Oriented Understudy for Gisting Evaluation)は、自然言語処理における自動要約や機械翻訳ソフトの評価に用いられる評価指標とソフトウェアパッケージのセットです。この評価基準は、機械的に作成された要約や翻訳を人間が作成した要約や翻訳と比較するものです。
inputs
- predictions
-
機械的に作成された要約や翻訳文
トークンをスペースで区切った文字列でなければならない - references
-
人間が作成した要約や翻訳
スペースで区切られたトークンの文字列でなければならない - rouge_types
-
詳しくはこちらを見るか、「rouge_typeとは」と調べて見てください
デフォルトはすべて計算する -
- – rouge1
-
1-gramベースのスコアリング
- – rouge2
-
bigram (2-gram)に基づくスコアリング
- – rougeL
-
Longest common subsequenceに基づくスコアリング
- – rougeLSum
-
“\n” を使ってテキストを分割する
- use_aggregator
-
Trueの場合、集計値を返す
デフォルトはTrue - use_stemmer
-
True の場合、Porter Stemmer を使って単語の接尾辞を除去する
デフォルトは False
利用例
rouge_scoreをインストールする必要があります。
# rouge_scoreをインストール
pip install rouge_score
""" シンプルな例 """
# rougeモジュールの読み込み
rouge = evaluate.load('rouge')
predictions = ["hello goodbye", "ankh morpork"]
references = ["goodbye", "general kenobi"]
results = rouge.compute(predictions=predictions,references=references,use_aggregator=False)
print(list(results.keys()))
# ['rouge1', 'rouge2', 'rougeL', 'rougeLsum']
print(results["rouge1"])
# [0.6666666666666666, 0.0]
SacreBLEU
SacreBLEUは、オリジナルの実装(Papineni et al., 2002)を他の有用な機能とともにラッピングすることで、これらの問題を解決することを目指しています。
詳しくはGithubをご覧ください。
inputs
- predictions
-
翻訳文のリスト
- references
-
参考文のリスト
- smooth_method
-
使用する平滑化方法
デフォルトはexp
使用可能な値は以下の通り- – none
-
平滑化しない
- – floor
-
ゼロカウントを増加させる
- – add_k
-
num/denom を k ずつ増加させる
- – exp
-
指数的減衰を行う
- smooth_value
-
平滑化の値
smooth_methodがfloorの場合 smooth_value のデフォルトは 0.1
smooth_methodがadd-kの場合 smooth_value のデフォルトは 1 - tokenize
-
BLEUに使用するトークン化手法
- – none
-
トークン化なし
- – zh
-
中国語のトークン化
- – 13a
-
Mosesのmteval-v13a
- – intl
-
Mosesのmteval-v14
- – char
-
言語にとらわれない文字レベルのトークン化
- – ja-mecab
-
日本語のトークン化
- lowercase
-
True の場合、入力を小文字にし、大文字小文字を区別しないようにする
デフォルトはFalse - force
-
True の場合、トークン化された入力が実際にトークン化解除されるかどうかを保証する
デフォルトはFalse - use_effective_order
-
文レベルのBLEUを計算する場合は、Trueにする必要がある
デフォルトはFalse
outputs
- score
-
BLEUスコア
- counts
-
カウント数
- totals
-
合計
- precisions
-
適合率
- bp
-
簡略化ペナルティ
- sys_len
-
予測文の長さ
- ref_len
-
参照文の長さ
利用例
""" 日本語での例 """
predictions = ["今日は、仕事をしてそのまま寝ました。"]
references = ["今日は、タスクをしてそのまま寝ました。"]
# sacrebleuモジュールの読み込み
sacrebleu = evaluate.load("sacrebleu")
results = sacrebleu.compute(predictions=predictions,
references=references, tokenize="ja-mecab")
print(list(results.keys()))
# ['score', 'counts', 'totals', 'precisions', 'bp', 'sys_len', 'ref_len']
print(results)
# {'score': 73.48889200874659, 'counts': [11, 9, 7, 5],
# 'totals': [12, 11, 10, 9], 'precisions': [91.66666666666667, 81.81818181818181, 70.0, 55.55555555555556],
# 'bp': 1.0, 'sys_len': 12, 'ref_len': 12}
この指標で計算されるのはBLEUスコアなので、sacreBLEUの方が再現性が高いことを除けば、BLUE指標と同じ制約がある点には注意が必要です。
SARI
SARI (system output against references and against the input sentence) は、自動テキスト簡略化システムを評価するために用いられる指標です。この指標は、予測し簡略化された文章を参照文と原文で比較します。また、システムによって追加、削除、保持された単語の良し悪しを明示的に測定します。
inputs
- souces
-
ソース文の文字列のリスト
- predictions
-
予測文の文字列のリスト
- references
-
参照文の文字列のリスト
利用例
""" シンプルな例 """
# sariモジュールの読み込み
sari = evaluate.load("sari")
sources=["About 95 species are currently accepted."]
predictions=["About 95 you now get in."]
references=[["About 95 species are currently known.","About 95 species are now accepted.","95 species are now accepted."]]
sari_score = sari.compute(sources=sources, predictions=predictions, references=references)
print(sari_score)
# {'sari': 26.953601953601954}
SARIは、異なるテキスト簡略化システムを比較するための貴重な尺度であると同時に、システムの反復的な開発を支援するものでもある。しかし、SARIを発表した元の論文では、「文法性と意味の保存の概念」を捉えているとされていますが、これは実証的に検証することが難しい主張です。
seqeval
seqevalは、系列ラベリング(固有表現抽出)の評価用Pythonフレームワークです。名前付き実体の認識、品詞タグ付け、意味役割ラベル付けなどのチャンキングタスクの性能を評価することができます。
inputs
- predictions
-
予測されたラベルのリスト
- references
-
参照ラベルのリスト
- suffix
-
IOBタグを後につける場合であればTrue、前につける場合はFalse
デフォルトはFalse - scheme
-
対象のタグ付けスキーム
[IOB1, IOB2, IOE1, IOE2, IOBES, BILOU] のいずれかを指定する
デフォルトはNone - mode
-
間違ったI/Bタグを持つ正しい実体ラベルを真陽性としてカウントするかどうかを指定する
完全一致のみをカウントしたい場合は、mode=”strict “と特定のscheme値を渡す
デフォルトはNone - sample_weight
-
各サンプルの重み
デフォルトはNone - zero_division
-
ゼロ除算の場合に、どの値をメトリック値として代用するか
[ 0, 1, “warn”]のいずれかでなければならない
warnは0として動作するが、警告を出す
outputs
- overall_accuracy
-
0.0から1.0の間のスケールの平均精度
- overall_precision
-
0.0から1.0の間のスケールの平均適合率
- overall_recall
-
0.0から1.0の間のスケールの平均再現性
- overall_f1
-
0.0から1.0の間のスケールのF1スコアの平均値
- precision
-
タグごとの0.0から1.0の間のスケールの平均適合率
- recall
-
タグごとの0.0から1.0の間のスケールの平均再現性
- f1
-
タグごとの0.0から1.0の間のスケールのF1スコアの平均値
利用例
""" シンプルな例 """
# seqevalモジュールの読み込み
seqeval = evaluate.load('seqeval')
predictions = [['O', 'O', 'B-MISC', 'I-MISC', 'I-MISC', 'I-MISC', 'O'], ['B-PER', 'I-PER', 'O']]
references = [['O', 'O', 'B-MISC', 'I-MISC', 'I-MISC', 'I-MISC', 'O'], ['B-PER', 'I-PER', 'O']]
results = seqeval.compute(predictions=predictions, references=references)
print(results)
# {'MISC': {'precision': 1.0, 'recall': 1.0, 'f1': 1.0, 'number': 1},
# 'PER': {'precision': 1.0, 'recall': 1.0, 'f1': 1.0, 'number': 1},
# 'overall_precision': 1.0, 'overall_recall': 1.0, 'overall_f1': 1.0, 'overall_accuracy': 1.0}
Spearman Correlation Coefficient Metric
スピアマンの順位相関係数(Spearman Correlation Coefficient Metric)は、2つのデータセット間の関係を表す尺度です。他の相関係数と同様、-1 から +1 の間で変化し、0 は相関がないことを意味します。正の相関は、データセットxのデータが増加すると、データセットyのデータも増加することを意味し、負の相関は、xが増加するとyが減少することを意味します。相関が-1または+1であれば、厳密な単調関係を意味します。
inputs
- predictions
-
モデルによって返されるラベルの予測値
- references
-
真のラベル
- return_pvalue
-
True の場合、p-value を返す
False の場合、spearmanr スコアのみが返される
デフォルトはFalse
利用例
""" シンプルな例 """
# spearmanrモジュールの読み込み
spearmanr_metric = evaluate.load("spearmanr")
results = spearmanr_metric.compute(references=[1, 2, 3, 4, 5], predictions=[10, 9, 2.5, 6, 4], return_pvalue=True)
print(results)
# {'spearmanr': -0.7, 'spearmanr_pvalue': 0.1881204043741873}
SQuAD
SQuADは読解問題のデータセットで、Wikipediaの記事に対してクラウドワーカーが出した質問から構成されています。すべての質問に対する答えは、対応する読解箇所のテキストのセグメント、またはスパンであり、質問は答えられない場合があります。このメトリクスは、そのStanford Question Answering Dataset (SQuAD) のバージョン1用の公式採点スクリプトを内包しています。
inputs
- predictions
-
モデルの予測文
- references
-
比較する文
outputs
- extra_match
-
範囲は0-100
0.0は答えが一致しなかったことを意味し、100.0はすべての答えが一致したことを意味する - f1
-
範囲は0-1
最小値は0、つまり適合率と再現率のどちらかが0であることを意味する
最大値は1.0、つまり適合率と再現率が完璧であることを意味する
利用例
""" シンプルな例 """
# squadモジュールの読み込み
squad_metric = evaluate.load("squad")
predictions = [{'prediction_text': '1976', 'id': '56e10a3be3433e1400422b22'}]
references = [{'answers': {'answer_start': [97], 'text': ['1976']}, 'id': '56e10a3be3433e1400422b22'}]
results = squad_metric.compute(predictions=predictions, references=references)
print(results)
# {'exact_match': 100.0, 'f1': 100.0}
この指標は、SQuAD v.1データセットと同じ形式のデータセットでのみ機能します。
SQuAD v2
このメトリクス(SQuAD v2)は、Stanford Question Answering Dataset (SQuAD) のバージョン2の公式採点スクリプトをラップしています。
inputs
- predictions
-
以下のKey-Valueペアでスコア付けするquestion-answerの三項リスト
- – id
-
question-answerのペアを識別するid
- – prediction_text
-
予測されたテキスト
- – no_answer_probability
-
質問に対して答えがない確率
- references
-
以下のKey-Valueペアを持つquestion-answers辞書のリスト
- – id
-
question-answerのペアのID
- – answers
-
文字列としての答えのテキスト
- no_amswer_threshold
-
質問に対して答えがないと判断するための確率の閾値
outputs
- exact
-
正規化された回答が完全に一致する
- f1
-
予測されたトークンと正解の平均 F1 スコア
- total
-
考慮したスコアの数
- HasAns_exact
-
正規化された回答が完全に一致する
- HasAns_f1
-
予測されたトークンと正解の平均 F1 スコア
- HasAns_total
-
質問のうちいくつの答えがあるのか
- NoAns_exact
-
正規化された回答が完全に一致する
- NoAns_f1
-
予測されたトークンと正解の平均 F1 スコア
- NoAns_total
-
質問のうち答えがないものの数
- best_exact
-
閾値を変化させた完全一致のベストスコア
- best_exact_thresh
-
完全一致に伴う無回答の確率の閾値
- best_f1
-
閾値を変化させた場合の最適なF1スコア
- best_f1_thresh
-
最適なF1スコアに関係する無回答確率の閾値
利用例
""" シンプルな例 """
# squad_v2モジュールの読み込み
squad_v2_metric = evaluate.load("squad_v2")
predictions = [{'prediction_text': '1976', 'id': '56e10a3be3433e1400422b22', 'no_answer_probability': 0.}]
references = [{'answers': {'answer_start': [97], 'text': ['1976']}, 'id': '56e10a3be3433e1400422b22'}]
results = squad_v2_metric.compute(predictions=predictions, references=references)
print(results)
# {'exact': 100.0, 'f1': 100.0, 'total': 1, 'HasAns_exact': 100.0,
# 'HasAns_f1': 100.0, 'HasAns_total': 1, 'best_exact': 100.0, 'best_exact_thresh': 0.0,
'best_f1': 100.0, 'best_f1_thresh': 0.0}
このメトリックは、SQuAD v.2データセットと同じ形式のデータセットでのみ機能します。
SuperGLUE
SuperGLUEは、GLUEの後継として、より難しい言語理解タスクのセットを追加・リソースを改善し、新しいパブリックリーダーボードを備えた新しいベンチマークです。
モジュールの読み込み時の引数
super_glue_metric = evaluate.load('super_glue')
# KeyError: 'You should supply a configuration name selected in
# ["boolq", "cb", "copa", "multirc", "record", "rte", "wic", "wsc", "wsc.fixed", "axb", "axg",]'
第二引数を設定しないとエラーが出ます。
[“boolq”, “cb”, “copa”, “multirc”, “record”, “rte”, “wic”, “wsc”, “wsc.fixed”, “axb”, “axg”,]←ここから選ぶ必要があります。
詳しくは、SuperGLUE dataset pageまたはofficial dataset websiteを参照して下さい。
inputs
- predictions
-
予測
- モジュールの読み込み時の第二引数がrecodeの場合
-
以下のキーを持つQuestion-Answerの辞書のリスト
-
- – idx
-
データセットで指定された質問のインデックス
- – prediction_text
-
答えの予測文
- モジュールの読み込み時の第二引数がmultircの場合
-
question-answerの辞書のリストで、キーは以下の通り
-
- – idx
-
データセットで指定されたquestion-answerのペアのインデックス
- – prediction
-
予測された答えのラベル
- モジュールの読み込み時の第二引数が上記以外の場合
-
予測されたラベルのリスト
- references
-
質問-回答辞書のリストで、キーは以下の通り
-
- モジュールの読み込み時の第二引数がrecodeの場合
-
- – idx
-
データセットで指定された質問のインデックス
- – answers
-
可能性のある答えのリスト
- モジュールの読み込み時の第二引数がrecode以外の場合
-
参照ラベルのリスト
outputs
利用例
""" ["copa", "rte", "wic", "wsc", "wsc.fixed", "boolq", "axg"]から選んだ場合 """
# super_glueモジュールの読み込み
super_glue_metric = evaluate.load('super_glue', 'copa')
predictions = [0, 1]
references = [0, 1]
results = super_glue_metric.compute(predictions=predictions, references=references)
print(results)
# {'accuracy': 1.0}
""" 'multirc'の場合 """
super_glue_metric = evaluate.load('super_glue', 'multirc')
predictions = [{'idx': {'answer': 0, 'paragraph': 0, 'question': 0}, 'prediction': 0},
{'idx': {'answer': 1, 'paragraph': 2, 'question': 3}, 'prediction': 1}]
references = [1,0]
results = super_glue_metric.compute(predictions=predictions, references=references)
print(results)
# {'exact_match': 0.0, 'f1_m': 0.0, 'f1_a': 0.0}
""" 'axb'の場合 """
super_glue_metric = evaluate.load('super_glue', 'axb')
references = [0, 1]
predictions = [1, 1]
results = super_glue_metric.compute(predictions=predictions, references=references)
print(results)
# {'matthews_correlation': 0.0}
この指標は、SuperGLUEデータセットと同じフォーマットのデータセットでのみ機能します。
TER
Translation Error Rateは、機械翻訳のエラー指標であり、システムの出力を基準に変更するために必要な編集回数を測定します。
inputs
- predictions
-
予測された訳語
- references
-
一つ以上の基準語訳
- normalized
-
True の場合、基本的なトークン化および正規化を文に適用する
デフォルトは False - ignore_punct
-
True の場合、句読点を無視する
デフォルトは False - support_zh_ja_chars
-
True の場合、トークン化/正規化は、漢字、ひらがな、カタカナ、およびカタカナの音韻拡張と同様に、中国語の文字の処理をサポートする
normalized = True の場合のみ適用される
デフォルトはFalse - case_sensitive
-
Falseの場合、大文字と小文字の違いを無視するために、すべての予測および参照を小文字にする
デフォルトはFalse
outputs
- score
-
TER スコア (num_edits / sum_ref_lengths * 100)
- num_edits
-
編集回数の累計
- ref_length
-
累積平均基準語訳の長
利用例
""" シンプルな例 """
# terモジュールの読み込み
ter = evaluate.load("ter")
predictions = ["does this sentence match??","what about this sentence?"]
references = [["does this sentence match", "does this sentence match!?!"],["wHaT aBoUt ThIs SeNtEnCe?", "wHaT aBoUt ThIs SeNtEnCe?"]]
results = ter.compute(predictions=predictions, references=references,case_sensitive=True)
print(results)
# {'score': 62.5, 'num_edits': 5, 'ref_length': 8.0}
TREC Eval
TREC Evalは、情報検索の指標である適合率やnormalized Discounted Cumulative Gain(nDCG)などを組み合わせた指標です。これは、検索された文書のランキングを基準値でスコアリングするために使用されます。
pip install trectools
inputs
- predictions
-
一回の検索run
- – query
-
クエリ ID
- – q0
-
リテラル”q0″
- – docid
-
ドキュメント ID
- – rank
-
ドキュメント rank
- – score
-
ドキュメント score
- – system
-
現在のrunのタグ
- references
-
一回のqrel
- query
-
クエリ ID
- q0
-
リテラル “q0”
- docid
-
ドキュメント ID
- rel
-
文書の関連性
outputs
- runid
-
run ID
- num_ret
-
検索された文書数
- num_rel
-
該当文書の数
- num_rel_ret
-
検索された該当文書の数
- num_q
-
クエリの数
- map
-
平均適合率の平均値
- gm_map
-
平均適合率の幾何学的平均
- bpref
-
バイナリ優先度スコア
- Rprec
-
適合率@R
Rは該当文書数 - recip_rank
-
相互ランク
- P@k
-
precision@k (k in [5, 10, 15, 20, 30, 100, 200, 500, 1000]
- NDCG@k
-
nDCG@k (k in [5, 10, 15, 20, 30, 100, 200, 500, 1000]
利用例
""" シンプルな例 """
qrel = {
"query": [0],
"q0": ["q0"],
"docid": ["doc_1"],
"rel": [2]
}
run = {
"query": [0, 0],
"q0": ["q0", "q0"],
"docid": ["doc_2", "doc_1"],
"rank": [0, 1],
"score": [1.5, 1.2],
"system": ["test", "test"]
}
# trec_evalモジュールの読み込み
trec_eval = evaluate.load("trec_eval")
results = trec_eval.compute(references=[qrel], predictions=[run])
print(results)
# {'runid': 'test', 'num_ret': 2, 'num_rel': 1, 'num_rel_ret': 1,
# 'num_q': 1, 'map': 0.5, 'gm_map': 0.5, 'bpref': 0.0, 'Rprec': 0.0,
# 'recip_rank': 0.5, 'P@5': 0.2, 'P@10': 0.1, 'P@15': 0.06666666666666667,
# 'P@20': 0.05, 'P@30': 0.03333333333333333, 'P@100': 0.01, 'P@200': 0.005,
# 'P@500': 0.002, 'P@1000': 0.001, 'NDCG@5': 0.6309297535714575,
# 'NDCG@10': 0.6309297535714575, 'NDCG@15': 0.6309297535714575,
# 'NDCG@20': 0.6309297535714575, 'NDCG@30': 0.6309297535714575, 'NDCG@100': 0.6309297535714575,
# 'NDCG@200': 0.6309297535714575, 'NDCG@500': 0.6309297535714575, 'NDCG@1000': 0.6309297535714575}
WER
Word error rate(WER)は、自動音声認識(ASR)システムの性能の一般的な指標です。
pip install jiwer
inputs
- predictions
-
認識音声の文字列のリスト
- references
-
各音声入力の基準のリスト
利用例
""" シンプルな例 """
# werモジュールの読み込み
wer = evaluate.load("wer")
predictions = ["hello world", "good night moon"]
references = ["hello world", "good night moon"]
wer_score = wer.compute(predictions=predictions, references=references)
print(wer_score)
WERは、異なるシステムの比較や、システム内の改善点を評価するための貴重なツールです。しかし、この種の測定では、翻訳エラーの性質に関する詳細な情報は得られない点については注意が必要です。
Wikisplit
WIKI_SPLITは、SARI、EXACT、SACREBLEUの3つの指標を組み合わせたもので、機械で生成されたテキストの品質を評価するために用いることができます。
inputs
- sources
-
原文のリスト
- predictions
-
予測された文のリスト
- references
-
参照文のリスト
outputs
- sari
-
SARIスコア
0.0から100.0までの値をとり、値が高いほど評価対象モデルの性能が高いことを示す - sacrebleu
-
SacreBLEUスコア
0.0から100.0の間の任意の値を取りうる - exact
-
exact match スコア
範囲は0.0から100
利用例
""" シンプルな例 """
# wiki_splitモジュールの読み込み
wiki_split = evaluate.load("wiki_split")
sources = ["About 95 species are currently accepted ."]
predictions = ["About 95 species are currently accepted ."]
references= [["About 95 species are currently accepted ."]]
results = wiki_split.compute(sources=sources, predictions=predictions, references=references)
print(results)
# {'sari': 100.0, 'sacrebleu': 100.00000000000004, 'exact': 100.0}
この指標はWikiSplitデータセットでモデルを評価するための公式な指標ではありません。当初はRotheら(2020)が提案したものですが、WikiSplitデータセットを紹介したオリジナルの論文(2018)では、コーパスレベルのBLEUや文レベルのBLEUなど、異なる指標で性能評価をしています。
XNLI
XNLIはMNLIデータセットの数千例のサブセットで、スワヒリ語やウルドゥー語など比較的リソースの少ない14言語に翻訳されたデータセットで、モデルのスコアを評価することができます。
inputs
- predictions
-
予測ラベルのリスト
- references
-
真のラベルのリスト
利用例
""" シンプルな例 """
# xnliモジュールの読み込み
xnli_metric = evaluate.load("xnli")
predictions = [0, 1]
references = [0, 1]
results = xnli_metric.compute(predictions=predictions, references=references)
print(results)
# {'accuracy': 1.0}
XTREME-S
XTREME-Sは、Cross-lingual TRansfer Evaluation of Multilingual Encoders for Speech (XTREME-S) ベンチマークでのモデル性能を評価することを目的として作られたものです。このベンチマークは、言語、タスク、ドメイン、データ領域を横断して音声表現を評価するために設計されています。10以上の言語族からなる102の言語、3つの異なるドメイン、音声認識、翻訳、分類、検索の4つのタスク群を対象にしています。
モジュールの読み込み時の引数
xtreme_s_metric = evaluate.load('xtreme_s', 'この部分に入れる')
mls
voxpopuli
covost2
fleurs-asr
fleurs-lang_id
minds14
babel
上記の中から選ぶことができます。(詳細)
inputs
- predictions
-
予測のリスト
- references
-
基準のリスト
- bleu_kwargs
-
covost2サブセットのbleuメトリックを計算する際に渡されるキーワードのディクショナリ
キーワードは、smooth_method, smooth_value, force, lowercase, tokenize, use_effective_orderのうちの1つ - wer_kwargs
-
mls, fleurs-asr, voxpopuli, babel サブセットで計算される wer と cer の計算時に渡されるキーワードのオプションディクショナリ
キーワードは concatenate_texts
outputs
- accuracy
-
処理された総ケース数に対する正しい予測の割合
fleurs-lang_idとminds14のサブセットに対して返される - f1
-
適合率と再現率の調和平均
minds14 サブセットに対して返される - wer
-
単語誤り率
mls、fleurs-asr、voxpopuliおよびbabelサブセットに対して返される - cer
-
文字誤り率
mls、fleurs-asr、voxpopuli、babelサブセットで返される - bleu
-
BLEUスコア
covost2 サブセットに対して返される
利用例
""" シンプルな例 """
# xtreme_sモジュールの読み込み
xtreme_s_metric = evaluate.load('xtreme_s', 'mls')
references = ["it is sunny here", "paper and pen are essentials"]
predictions = ["it's sunny", "paper pen are essential"]
results = xtreme_s_metric.compute(predictions=predictions, references=references)
print({k: round(v, 2) for k, v in results.items()})
# {'wer': 0.56, 'cer': 0.27}
このメトリクスはXTREME-Sデータセットと同じフォーマットのデータセットでのみ機能します。
Comparison一覧
Comparisonは、2つのモデルを比較するために使われます。例えば、予測値と正解ラベルを比較し、その一致度を計算します。すべてのComparisonはevaluate-comparisonで見ることができます。
また、comparison一覧は次のコードでも見ることができます。
evaluate.list_evaluation_modules(
# モジュールのタイプをcomparisonに指定
module_type="comparison",
# コミュニティモジュールを除く
include_community=False,
# 詳細を表示
with_details=True)
では、それぞれのcomparisonの説明と使い方を見ていきます。
Exact Match
Exact Matchは、あるモデルの予測値が、別のモデルの予測値と正確に一致する割合を返します。
inputs
- predictions1
-
モデル1の予測値
- predictions2
-
モデル2の予測値
利用例
""" シンプルな例 """
# exact_matchモジュールの読み込み
exact_match = evaluate.load("exact_match", module_type="comparison")
results = exact_match.compute(predictions1=[0, 1, 1], predictions2=[1, 1, 1])
print(results)
# {'exact_match': 0.6666666666666666}
McNemar
McNemarの検定は,2つの分類器の予測から得られる分割表に対するノンパラメトリックな検定です。この検定は,同じグループの参照ラベルでの検出テストの感度と特異度を比較します。
inputs
- predictions1
-
1番目のモデルからの予測値のリスト
- predcitions2
-
2番目のモデルからの予測値のリスト
- references
-
基準のラベルのリスト
outputs
- stat
-
McNemar統計量
- p
-
p 値
利用例
""" シンプルな例 """
# mcnemarモジュールの読み込み
mcnemar = evaluate.load("mcnemar")
results = mcnemar.compute(references=[1, 0, 1], predictions1=[1, 1, 1], predictions2=[1, 0, 1])
print(results)
# {'stat': 1.0, 'p': 0.31731050786291115}
McNemar 検定はノンパラメトリック検定なので、そのことによる制限には注意が必要です。
Measurement一覧
Measurementは、データセットをより深く理解し、その特性や特徴に基づいたモデル予測を行うための評価指標です。Measurementはevaluate-measurementで見ることができます。
また、comparison一覧は次のコードでも見ることができます。
evaluate.list_evaluation_modules(
# モジュールのタイプをmeasurementに指定
module_type="measurement",
# コミュニティモジュールを除く
include_community=False,
# 詳細を表示
with_details=True)
では、それぞれのmeasurementの説明と使い方を見ていきます。
Perplexity
Perplexityは、モデルと入力テキスト列が与えられたとき、モデルが入力テキスト列を生成する可能性がどの程度あるかを測定します。指標としては、モデルが学習したテキストの分布をどの程度学習したかを評価するために用いることができます。
inputs
- model_id
-
Perplexityを計算するために使用するモデル
- predictions
-
入力テキスト、各スニペットが1つのリストエントリになる
- batch_size
-
モデルを通してテキストを実行するバッチサイズ
デフォルトは16 - add_start_token
-
テキストに開始トークンを追加し、最初の単語の確率を含む複雑さを計算するかどうか
デフォルトはTrue - device
-
実行するデバイス
デフォルトは ‘cuda’
利用例
""" シンプルな例 """
# perplexityモジュールの読み込み
perplexity = evaluate.load("perplexity", module_type="measurement")
input_texts = ["lorem ipsum", "Happy Birthday!", "Bienvenue"]
results = perplexity.compute(model_id='gpt2',
add_start_token=False,
predictions=input_texts)
print(results)
# {'perplexities': [11.108955383300781, 159.01539611816406, 64.5319595336914],
# 'mean_perplexity': 78.21877034505208}
出力値はモデルがどのようなテキストで学習したかに大きく依存することに注意してください。つまり、モデルやデータセット間でperplexityスコアは比較できません。
Text Duplicates
text_duplicatesは、入力データの中で重複している文字列の割合を返します。
inputs
- data
-
重複を計算する対象となる文字列
- list_duplicates
-
duplicates_listを出力するか
デフォルトはFalse
outputs
- duplicate_fraction
-
入力文字列中の重複する文字列の割合
- duplicates_list
-
重複している文字列とその回数を示すタプルのリスト
利用例
""" シンプルな例 """
# text_duplicatesモジュールの読み込み
duplicates = evaluate.load("text_duplicates")
data = ["hello sun", "goodbye moon", "hello sun", "foo bar", "foo bar"]
results = duplicates.compute(data=data, list_duplicates=True)
print(results)
# {'duplicate_fraction': 0.4, 'duplicates_list': {'hello sun': 2, 'foo bar': 2}}
list_duplicates=Trueにすると、大きなデータセットではメモリを大量に消費する可能性があります。
Word Count
Word Countは、sklearnのCountVectorizerを使って、入力文字列の単語数の合計を返します。
inputs
- data
-
単語長を計算するための文字列の入力リスト
- max_vocab
-
考慮すべき単語の最大数
outputs
- total_word_count
-
入力文字列中の総単語数
- unique_words
-
入力文字列に含まれるユニークワードの数
利用例
""" シンプルな例 """
# word_countモジュールの読み込み
wordcount= evaluate.load("word_count")
data = ["hello world and hello moon"]
results = wordcount.compute(data=data)
print(results)
# {'total_word_count': 5, 'unique_words': 4}
Word Length
Word Lengthは、入力文字列の単語数を返します。
inputs
- data
-
単語長を計算するための文字列の入力リスト
- tokenizer
-
dataをトークン化するための手法
デフォルトはNLTK’s `word_tokenize`
利用例
""" シンプルな例 """
# word_lengthモジュールの読み込み
wordcount= evaluate.load("word_length", module_type="measurement")
data = ["hello world and hello moon"]
results = wordcount.compute(data=data)
print(results)
# {'average_word_length': 5}
最後に
今回は、機械学習で使える評価指標の利用方法を紹介してきました。
モジュールの読み込み時などでエラーが出た場合の対処方法も載せましたが、すべてを検証出来ているわけではないので、エラーが出る可能性もまだまだあります。
もし、エラーが出た場合はコメントなどで教えてください。
コメント