double CAdaBoost::Deviance(const CDataset& kData, const Bag& kBag, const double* kFuncEstimate) { double loss = 0.0; double weight = 0.0; // Switch to validation set if necessary unsigned long num_of_rows_in_set = kData.get_size_of_set(); #pragma omp parallel for schedule(static, get_array_chunk_size()) \ reduction(+ : loss, weight) num_threads(get_num_threads()) for (unsigned long i = 0; i < num_of_rows_in_set; i++) { loss += kData.weight_ptr()[i] * std::exp(-(2 * kData.y_ptr()[i] - 1) * (kData.offset_ptr()[i] + kFuncEstimate[i])); weight += kData.weight_ptr()[i]; } // TODO: Check if weights are all zero for validation set if ((weight == 0.0) && (loss == 0.0)) { return nan(""); } else if (weight == 0.0) { return HUGE_VAL; } return loss / weight; }
double CGaussian::Deviance(const CDataset& kData, const Bag& kBag, const double* kFuncEstimate) { double loss = 0.0; double weight = 0.0; unsigned long num_rows_in_set = kData.get_size_of_set(); #pragma omp parallel for schedule(static, get_array_chunk_size()) \ reduction(+ : loss, weight) num_threads(get_num_threads()) for (unsigned long i = 0; i < num_rows_in_set; i++) { const double tmp = (kData.y_ptr()[i] - kData.offset_ptr()[i] - kFuncEstimate[i]); loss += kData.weight_ptr()[i] * tmp * tmp; weight += kData.weight_ptr()[i]; } // TODO: Check if weights are all zero for validation set if ((weight == 0.0) && (loss == 0.0)) { return nan(""); } else if (weight == 0.0) { return copysign(HUGE_VAL, loss); } return loss / weight; }