oneR: fixed using wrong method of calculating lowest error rate

This commit is contained in:
Trianta 2024-04-17 21:25:11 -05:00
parent 182eed641b
commit 9a164e9370

View File

@ -220,21 +220,24 @@ namespace ARFF {
results.emplace(value, 0);
}
for (int i = 0; i < attribute->values.size(); ++i) {
int resultsTotal = 0;
if (attribute->values[i] == "?") { continue; }
for (auto instance = database.begin(); instance != database.end(); ++instance) {
if (instance->values[attributePos] != attribute->values[i]) { continue; }
++results[instance->values.back()];
resultsTotal++;
}
debug::Log(kTrace, "Results:");
for (auto it : results) { debug::Log(kTrace, "\t" + it.first + ": " + std::to_string(it.second)); }
int lowest = 9999;
float lowest;
float lowestRate = 1.0f;
std::string bestResult = results.begin()->first;
for (auto it = results.begin(); it != results.end(); ++it) {
if (it->second < lowest) {
lowest = it->second;
} else {
if (((resultsTotal - it->second) / float(resultsTotal)) < lowestRate) {
lowestRate = ((resultsTotal - it->second) / float(resultsTotal));
lowest = resultsTotal - it->second;
bestResult = it->first;
}
}
}
evaluation.rules.emplace(attribute->values[i], bestResult);
evaluation.totalError += lowest;