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と言っていますが、それはどのようになっているのか分かりません。