use of structures._Query in project IR_Base by Linda-sunshine.
the class LambdaRank method evaluate.
protected double evaluate() {
double obj = 0, perf = 0, total = 0, r;
int misorder = 0;
for (_Query query : m_queries) {
if ((r = m_eval.eval(query)) >= 0) {
// ranking score should already be calculated
perf += r;
total++;
}
for (_QUPair pair : query.m_docList) {
if (pair.m_worseURLs != null) {
for (_QUPair worseURL : pair.m_worseURLs) {
if ((r = Utils.logistic(pair.m_score - worseURL.m_score)) > 0)
obj += Math.log(r);
if (pair.m_score <= worseURL.m_score)
misorder++;
}
}
if (pair.m_betterURLs != null) {
for (_QUPair betterURL : pair.m_betterURLs) {
if ((r = Utils.logistic(betterURL.m_score - pair.m_score)) > 0)
obj += Math.log(r);
if (pair.m_score >= betterURL.m_score)
misorder++;
}
}
}
}
perf /= total;
// to be maximized
obj -= 0.5 * m_lambda * Utils.L2Norm(m_weight);
System.out.format("%d\t%.2f\t%.4f\n", misorder / 2, obj, perf);
return perf;
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class LambdaRankParallel method allocateQueries.
void allocateQueries() {
for (LambdaRankWorker worker : m_workers) worker.clearQueries();
int workerSize = m_workers.length, workerId;
Random rand = new Random();
for (_Query q : m_queries) {
workerId = rand.nextInt(workerSize);
m_workers[workerId].addQuery(q);
}
for (LambdaRankWorker worker : m_workers) worker.init();
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class LambdaRankWorker method evaluate.
protected void evaluate() {
double r;
m_obj = 0;
m_perf = 0;
m_misorder = 0;
for (_Query query : m_queries) {
// calculate ranking score with latest weight
for (_QUPair pair : query.m_docList) pair.score(m_weight);
if (// ranking score should already be calculated
(r = m_eval.eval(query)) >= 0)
m_perf += r;
for (_QUPair pair : query.m_docList) {
if (pair.m_worseURLs != null) {
for (_QUPair worseURL : pair.m_worseURLs) {
if ((r = Utils.logistic(pair.m_score - worseURL.m_score)) > 0)
m_obj += Math.log(r);
if (pair.m_score <= worseURL.m_score)
m_misorder++;
}
}
if (pair.m_betterURLs != null) {
for (_QUPair betterURL : pair.m_betterURLs) {
if ((r = Utils.logistic(betterURL.m_score - pair.m_score)) > 0)
m_obj += Math.log(r);
if (pair.m_score >= betterURL.m_score)
m_misorder++;
}
}
}
}
m_misorder /= 2;
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class L2RMetricLearning method L2RModelTraining.
protected void L2RModelTraining() {
// select the training pairs
createTrainingCorpus();
if (m_ranker == 0) {
ArrayList<Feature[]> fvs = new ArrayList<Feature[]>();
ArrayList<Integer> labels = new ArrayList<Integer>();
for (_Query q : m_queries) q.extractPairs4RankSVM(fvs, labels);
Model rankSVM = SVM.libSVMTrain(fvs, labels, RankFVSize, SolverType.L2R_L1LOSS_SVC_DUAL, m_tradeoff, -1);
m_weights = rankSVM.getFeatureWeights();
System.out.format("RankSVM training performance:\nMAP: %.4f\n", evaluate(OptimizationType.OT_MAP));
} else if (m_ranker == 1) {
// all the rest use LambdaRank with different evaluator
LambdaRank lambdaRank;
if (m_multithread) {
/**
** multi-thread version ***
*/
lambdaRank = new LambdaRankParallel(RankFVSize, m_tradeoff, m_queries, OptimizationType.OT_MAP, 10);
lambdaRank.setSigns(getRankingFVSigns());
// lambdaRank specific parameters
lambdaRank.train(100, 100, 1.0, 0.95);
} else {
/**
** single-thread version ***
*/
lambdaRank = new LambdaRank(RankFVSize, m_tradeoff, m_queries, OptimizationType.OT_MAP);
lambdaRank.setSigns(getRankingFVSigns());
// lambdaRank specific parameters
lambdaRank.train(300, 20, 1.0, 0.98);
}
m_weights = lambdaRank.getWeights();
} else if (m_ranker == 2) {
RankNet ranknet = new RankNet(RankFVSize, 5.0);
ArrayList<double[]> rfvs = new ArrayList<double[]>();
for (_Query q : m_queries) q.extractPairs4RankNet(rfvs);
ranknet.setSigns(getRankingFVSigns());
double likelihood = ranknet.train(rfvs);
m_weights = ranknet.getWeights();
System.out.format("RankNet training performance:\nlog-likelihood: %.4f\t MAP: %.4f\n", likelihood, evaluate(OptimizationType.OT_MAP));
}
for (int i = 0; i < RankFVSize; i++) System.out.format("%.5f ", m_weights[i]);
System.out.println();
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class L2RMetricLearning method evaluate.
double evaluate(OptimizationType otype) {
Evaluator eval;
if (otype.equals(OptimizationType.OT_MAP))
eval = new MAP_Evaluator();
else if (otype.equals(OptimizationType.OT_NDCG))
eval = new NDCG_Evaluator(LambdaRank.NDCG_K);
else
eval = new Evaluator();
double perf = 0;
for (_Query q : m_queries) {
for (_QUPair qu : q.m_docList) qu.score(m_weights);
perf += eval.eval(q);
}
return perf / m_queries.size();
}
Aggregations