2016-12-09 16 views
1
print "Running trec_eval script..." 
N = len(y_pred_test) 
df_submission = pd.DataFrame(index=numpy.arange(N), columns=['qid', 'iter', 'docno', 'rank', 'sim', 'run_id']) 
df_submission['qid'] = qids_test 
df_submission['iter'] = 0 
df_submission['docno'] = numpy.arange(N) 
df_submission['rank'] = 0 
df_submission['sim'] = y_pred_test 
df_submission['run_id'] = 'nnet' 
df_submission.to_csv(os.path.join(output_dir, 'submission.txt'), header=False, index=False, sep=' ') 
df_gold = pd.DataFrame(index=numpy.arange(N), columns=['qid', 'iter', 'docno', 'rel']) 
df_gold['qid'] = qids_test 
df_gold['iter'] = 0 
df_gold['docno'] = numpy.arange(N) 
df_gold['rel'] = y_test 
df_gold.to_csv(os.path.join(output_dir, 'gold.txt'), header=False, index=False, sep=' ') 
subprocess.call("/bin/sh run_eval.sh '{}'".format(output_dir), shell=True) 

このコードはテンソルフローであり、正常にコンパイルされました。 そしてsubmission.txtのデータは以下の通りである:(例えば33.1としてQID取る)trec evalはどのようにMAPを計算しますか?

33.1 0 12 0 0.27250546217 nnet 
33.1 0 13 0 0.262122750282 nnet 
33.1 0 14 0 0.292897969484 nnet 
33.1 0 15 0 0.244421452284 nnet 
33.1 0 16 0 0.00145227077883 nnet 
33.1 0 17 0 0.264055848122 nnet 
33.1 0 18 0 0.235591337085 nnet 

gold.txtのデータを以下に示す:(たとえば33.1としてQID取る)

33.1 0 12 1 33.1 0 13 1 33.1 0 14 1 33.1 0 15 1 33.1 0 16 0 33.1 0 17 0 33.1 0 18 0

MAPの結果は、次のように計算する必要があります: まず、スコア(「sim」)とそのラベルを並べ替えます。 そこでソート出力は次のようになります(のみクリアするための小数点以下の桁2-3を維持、パターン{スコア、ラベル}スタイルで配られる)

0.29 1

0.27 1

0.264 0

0.262 1

0.24 1

0.23 0

0.00 0

は、だから私は、MAPがあるべきだと思う:(1/1 + 2/2 + 3/4 + 4/5)/ 5 =

が、submission.txt.trecevalで0.71、それ0.8875と言っていますが、それはどのようになっているのか分かりません。

答えて

0

この場合、MAPは(1/1 + 2/2 + 3/4 + 4/5)/ 4として計算されます。 これは、一般にp @(i)の合計を、最大iの値ではなく関連する文書の総数で除算する必要があるからです。 enter image description here

関連する問題