void onHit(ObjectID id) { FeatureIndex* index = Registry::objectIndex()->get<FeatureIndex>( id ); Feature* feature = index ? index->getFeature( id ) : 0L; if ( feature && feature->getFID() != _lastFID ) { _grid->clearControls(); unsigned r=0; _grid->setControl( 0, r, new LabelControl("FID", Color::Red) ); _grid->setControl( 1, r, new LabelControl(Stringify()<<feature->getFID(), Color::White) ); ++r; const AttributeTable& attrs = feature->getAttrs(); for( AttributeTable::const_iterator i = attrs.begin(); i != attrs.end(); ++i, ++r ) { _grid->setControl( 0, r, new LabelControl(i->first, 14.0f, Color::Yellow) ); _grid->setControl( 1, r, new LabelControl(i->second.getString(), 14.0f, Color::White) ); } if ( !_grid->visible() ) _grid->setVisible( true ); _lastFID = feature->getFID(); } }
void onHit(ObjectID id) { // First see whether it's a feature: FeatureIndex* index = Registry::objectIndex()->get<FeatureIndex>( id ); Feature* feature = index ? index->getFeature( id ) : 0L; if ( feature ) { s_fidLabel->setText( Stringify() << "Feature ID = " << feature->getFID() << " (oid = " << id << ")" ); s_nameLabel->setText( Stringify() << "Name = " << feature->getString("name") ); } else { // Check whether it's an annotation: AnnotationNode* anno = Registry::objectIndex()->get<AnnotationNode>( id ); if ( anno ) { s_fidLabel->setText( Stringify() << "ObjectID = " << id ); s_nameLabel->setName( Stringify() << "Name = " << anno->getName() ); } // None of the above.. clear. else { s_fidLabel->setText( Stringify() << "oid = " << id ); s_nameLabel->setText( "Name = " ); } } s_highlightUniform->set( id ); }
void GBTree::train(const Dataset& trainset, int nDims, const Dataset& testset, const Dataset& valset, const MartParam& martParam, const Metric* m) { this->nDims = nDims; this->learningRate = martParam.learningRate; doubles_t residues(trainset.size()); ints_t ind(trainset.size()); size_t nSamples = static_cast<size_t>(floor(trainset.size()*martParam.samplePrec+eps)); if(nSamples>trainset.size()) nSamples = trainset.size(); FVectors x(nSamples), tx(trainset.size()); for(size_t i=0;i<trainset.size();i++) tx[i] = trainset[i].x; doubles_t weight(nSamples), y(nSamples), yhat(trainset.size()), ty(testset.size()), vy(valset.size()), fity(nSamples); b = 0.0; for(size_t i=0;i<trainset.size();i++) b+= trainset[i].y; b/= trainset.size(); for(size_t i=0;i<trainset.size();i++) residues[i] = trainset[i].y-b; for(size_t i=0;i<ind.size();i++) ind[i] = i; double bestT = -numeric_limits<double>::max(); double bestV = -numeric_limits<double>::max(); double bestTV = -numeric_limits<double>::max(); Cart<FVector, doubles_t, doubles_t, doubles_t> cart(martParam.cartParam); FeatureIndex *find = buildFeatureIndex(tx, nDims); for(int iter=0;iter<martParam.nIters;iter++) { random_shuffle(ind.begin(), ind.end()); for(size_t i=0;i<nSamples;i++) { x[i] = trainset[ind[i]].x; y[i] = residues[ind[i]]; weight[i] = 1.0; // if(dcmp(y[i]-1)==0) weight[i] = 1.0; else weight[i] = 1e-2; } FeatureIndex *sampleInd = find->getSample(ints_t(ind.begin(), ind.begin()+nSamples)); #if 0 for(int p=0;p<nDims;p++) { FeatureComp<FVector> fc(p, x), fc2(p, tx); const int* pindAll = find->getDim(p); assert(__gnu_cxx::is_sorted(pindAll, pindAll+tx.size(), fc2)); cout << "p = " << p << endl; const int* pind = sampleInd->getDim(p); cout << endl; for(size_t i=1;i<nSamples;i++) { if(fc(pind[i], pind[i-1])) { for(size_t j=0;j<tx.size();j++) { if(pindAll[j]==ind[pind[i-1]]) { cout << " " << pindAll[j] << " " << pind[i-1] << " " << tx[pindAll[j]][p] << endl; } if(pindAll[j]==ind[pind[i]]) { cout << " " << pindAll[j] << " " << pind[i] << " " << tx[pindAll[j]][p] << endl; } } cout << "i = " << i << " " << pind[i-1] << " " << pind[i] << " " << x[pind[i-1]][p] << " " << x[pind[i]][p] << endl; } } assert(__gnu_cxx::is_sorted(pind, pind+nSamples, fc)); } #endif treeVec.push_back(cart.fit(x, nDims, weight, y, fity, *sampleInd)); delete sampleInd; double w1 = 0.0, w2 = 0.0; for(size_t i=0;i<trainset.size();i++) { yhat[i] = apply_cart(trainset[i].x, treeVec[iter]); w1 += yhat[i]*residues[i]; w2 += yhat[i]*yhat[i]; } assert(dcmp(w2)>0); w.push_back(w1/w2); // w.push_back(1.0); // cout << w1/w2 << endl; for(size_t i=0;i<trainset.size();i++) { residues[i]-=yhat[i]*learningRate*w[iter]; yhat[i] = trainset[i].y-residues[i]; } if(iter%10==0) { test(trainset, yhat); // doubles_t ndcg, ndcgT, ndcgV; // cal_ndcg(trainset, yhat, ndcg); double mtrain = m->evaluate(trainset, yhat); cout << "Iter = " << iter << " Loss = " << getLoss(trainset, yhat) << " NDCG5 = " << mtrain; if(!testset.empty()) { test(testset, ty); // cal_ndcg(testset, ty, ndcgT); double mtest = m->evaluate(testset, ty); cout << " TLoss = " << getLoss(testset, ty) << " TNDCG5 = " << mtest; if(iter>100 && dcmp(bestT-mtest)<0) bestT = mtest; if(!valset.empty()) { test(valset, vy); // cal_ndcg(valset, vy, ndcgV); double mval = m->evaluate(valset, vy); cout << " VLoss = " << getLoss(valset, vy) << " VNDCG5 = " << mval; if(iter>100 && dcmp(bestV-mval)<0) { bestV = mval; bestTV = mtest; } } } cout << endl; } } delete find; cout << "BestTest = " << bestT << endl; cout << "BestVal = " << bestV << endl; cout << "BestTestonVal = " << bestTV << endl; }