void RfExtractorClassifier::import(istream& is) { _getExtractors(); _rf.reset(new RandomForest()); _rf->import(is); vector<string> factorLabels = _rf->getFactorLabels(); QStringList extractorNames; for (size_t i = 0; i < _extractors.size(); i++) { extractorNames.append(QString::fromUtf8(_extractors[i]->getName().data()). replace(QRegExp("[^\\w]"), "_")); } QStringList missingExtractors; for (size_t i = 0; i < factorLabels.size(); i++) { QString fn = QString::fromUtf8(factorLabels[i].data()); if (extractorNames.contains(fn) == false) { missingExtractors.append(fn); } _rfFactorLabels.append(fn); } if (missingExtractors.size() > 0) { LOG_WARN("An extractor used by the model is not being calculated. We will still try, but"); LOG_WARN("this will undoubtably result in poor quality matches. Missing extractors:"); LOG_WARN(missingExtractors); LOG_WARN("Available extractors: " << extractorNames); } }
void RfExtractorClassifier::import(QDomElement& docRoot) { _getExtractors(); _rf.reset(new RandomForest()); _rf->importModel(docRoot); vector<string> factorLabels = _rf->getFactorLabels(); QStringList extractorNames; for (size_t i = 0; i < _extractors.size(); i++) { extractorNames.append(QString::fromUtf8(_extractors[i]->getName().data()). replace(QRegExp("[^\\w]"), "_")); } QStringList missingExtractors; for (size_t i = 0; i < factorLabels.size(); i++) { QString fn = QString::fromUtf8(factorLabels[i].data()); if (extractorNames.contains(fn) == false) { missingExtractors.append(fn); } _rfFactorLabels.append(fn); } if (missingExtractors.size() > 0) { if (logWarnCount < Log::getWarnMessageLimit()) { LOG_WARN( "An extractor used by the model is not being calculated. We will still try, but this will " "undoubtably result in poor quality matches. Missing extractors:"); } else if (logWarnCount == Log::getWarnMessageLimit()) { LOG_WARN(className() << ": " << Log::LOG_WARN_LIMIT_REACHED_MESSAGE); } logWarnCount++; LOG_TRACE("Missing extractors: " << missingExtractors); LOG_TRACE("Available extractors: " << extractorNames); } }
map<QString, double> RfExtractorClassifier::getFeatures(const shared_ptr<const OsmMap>& m, ElementId eid1, ElementId eid2) const { map<QString, double> result; const shared_ptr<const Element>& e1 = m->getElement(eid1); const shared_ptr<const Element> e2 = m->getElement(eid2); _getExtractors(); for (size_t i = 0; i < _extractors.size(); i++) { double v = _extractors[i]->extract(*m, e1, e2); // if it isn't null then include it. if (!FeatureExtractor::isNull(v)) { QString factorName = QString::fromStdString(_extractors[i]->getName()). replace(QRegExp("[^\\w]"), "_"); result[factorName] = v; } } return result; }