diff --git a/regrank/xgboost_regrank.h b/regrank/xgboost_regrank.h index b06280b2c..7163f2ed9 100644 --- a/regrank/xgboost_regrank.h +++ b/regrank/xgboost_regrank.h @@ -200,6 +200,11 @@ namespace xgboost{ fprintf(fo, "[%d]", iter); for (size_t i = 0; i < evals.size(); ++i){ this->PredictRaw(preds_, *evals[i]); + for( size_t j = 0 ; j < preds_.size(); ++ j){ + if( fabsf(preds_[j]- 0.5f)>1e-6f){ + printf("p[%lu]=%f\n", j,preds_[j]); + } + } obj_->PredTransform(preds_); evaluator_.Eval(fo, evname[i].c_str(), preds_, evals[i]->info); } @@ -283,6 +288,10 @@ namespace xgboost{ #pragma omp parallel for schedule( static ) for (unsigned j = 0; j < ndata; ++j){ preds[j] = mparam.base_score + base_gbm.Predict(data.data, j, buffer_offset + j, data.info.GetRoot(j), bst_group ); + if( preds[j] != 0.5f ){ + printf("pred[%d:%u]=%f\n", bst_group, j, preds[j]); + } + utils::Assert( preds[j] == 0.5f, "BUG"); } }else #pragma omp parallel for schedule( static ) diff --git a/regrank/xgboost_regrank_eval.h b/regrank/xgboost_regrank_eval.h index 0d67f2a58..41544b55b 100644 --- a/regrank/xgboost_regrank_eval.h +++ b/regrank/xgboost_regrank_eval.h @@ -83,7 +83,7 @@ namespace xgboost{ float sum = 0.0f, wsum = 0.0f; #pragma omp parallel for reduction(+:sum,wsum) schedule( static ) for (unsigned i = 0; i < ndata; ++i){ - const float wt = info.GetWeight(i); + const float wt = info.GetWeight(i); if (preds[i] > 0.5f){ if (info.labels[i] < 0.5f) sum += wt; } @@ -99,6 +99,28 @@ namespace xgboost{ } }; + + /*! \brief Error */ + struct EvalMatchError : public IEvaluator{ + virtual float Eval(const std::vector &preds, + const DMatrix::Info &info) const { + const unsigned ndata = static_cast(preds.size()); + float sum = 0.0f, wsum = 0.0f; + #pragma omp parallel for reduction(+:sum,wsum) schedule( static ) + for (unsigned i = 0; i < ndata; ++i){ + const float wt = info.GetWeight(i); + if (static_cast(preds[i]) != static_cast(info.labels[i]) ){ + sum += wt; + } + wsum += wt; + } + return sum / wsum; + } + virtual const char *Name(void) const{ + return "merror"; + } + }; + /*! \brief Area under curve, for both classification and rank */ struct EvalAuc : public IEvaluator{ virtual float Eval(const std::vector &preds, @@ -270,6 +292,7 @@ namespace xgboost{ } if (!strcmp(name, "rmse")) evals_.push_back(new EvalRMSE()); if (!strcmp(name, "error")) evals_.push_back(new EvalError()); + if (!strcmp(name, "merror")) evals_.push_back(new EvalMatchError()); if (!strcmp(name, "logloss")) evals_.push_back(new EvalLogLoss()); if (!strcmp(name, "auc")) evals_.push_back(new EvalAuc()); if (!strncmp(name, "pre@", 4)) evals_.push_back(new EvalPrecision(name)); diff --git a/regrank/xgboost_regrank_obj.hpp b/regrank/xgboost_regrank_obj.hpp index 6a1ed7741..f36cee4ad 100644 --- a/regrank/xgboost_regrank_obj.hpp +++ b/regrank/xgboost_regrank_obj.hpp @@ -75,7 +75,7 @@ namespace xgboost{ #pragma omp parallel { std::vector< float > rec; - #pragma for schedule(static) + #pragma omp for schedule(static) for (unsigned k = 0; k < ngroup; ++k){ rec.clear(); int nhit = 0; @@ -125,7 +125,7 @@ namespace xgboost{ #pragma omp parallel { std::vector rec(nclass); - #pragma for schedule(static) + #pragma omp for schedule(static) for (unsigned j = 0; j < ndata; ++j){ for( int k = 0; k < nclass; ++ k ){ rec[k] = preds[j + k * ndata]; @@ -149,22 +149,22 @@ namespace xgboost{ utils::Assert( nclass != 0, "must set num_class to use softmax" ); utils::Assert( preds.size() % nclass == 0, "SoftmaxMultiClassObj: label size and pred size does not match" ); const unsigned ndata = static_cast(preds.size()/nclass); + #pragma omp parallel { std::vector rec(nclass); - #pragma for schedule(static) + #pragma omp for schedule(static) for (unsigned j = 0; j < ndata; ++j){ for( int k = 0; k < nclass; ++ k ){ rec[k] = preds[j + k * ndata]; } - Softmax( rec ); preds[j] = FindMaxIndex( rec ); } } preds.resize( ndata ); } virtual const char* DefaultEvalMetric(void) { - return "error"; + return "merror"; } private: int nclass; @@ -201,7 +201,7 @@ namespace xgboost{ // thread use its own random number generator, seed by thread id and current iteration random::Random rnd; rnd.Seed( iter * 1111 + omp_get_thread_num() ); std::vector< std::pair > rec; - #pragma for schedule(static) + #pragma omp for schedule(static) for (unsigned k = 0; k < ngroup; ++k){ rec.clear(); for(unsigned j = gptr[k]; j < gptr[k+1]; ++j ){ diff --git a/regrank/xgboost_regrank_utils.h b/regrank/xgboost_regrank_utils.h index 580cedb81..c040b40d8 100644 --- a/regrank/xgboost_regrank_utils.h +++ b/regrank/xgboost_regrank_utils.h @@ -26,7 +26,9 @@ namespace xgboost{ inline static int FindMaxIndex( std::vector& rec ){ size_t mxid = 0; for( size_t i = 1; i < rec.size(); ++ i ){ - if( rec[i] > rec[mxid] ) mxid = i; + if( rec[i] > rec[mxid]+1e-6f ){ + mxid = i; + } } return (int)mxid; }